Adapt apps/mac.c to use provider based MACs
Reviewed-by: Matt Caswell <matt@openssl.org> Reviewed-by: Shane Lontis <shane.lontis@oracle.com> (Merged from https://github.com/openssl/openssl/pull/8877)
This commit is contained in:
parent
6a4f9cd113
commit
d747fb2ec5
1 changed files with 40 additions and 25 deletions
65
apps/mac.c
65
apps/mac.c
|
@ -14,6 +14,7 @@
|
||||||
#include <openssl/bio.h>
|
#include <openssl/bio.h>
|
||||||
#include <openssl/err.h>
|
#include <openssl/err.h>
|
||||||
#include <openssl/evp.h>
|
#include <openssl/evp.h>
|
||||||
|
#include <openssl/params.h>
|
||||||
|
|
||||||
#undef BUFSIZE
|
#undef BUFSIZE
|
||||||
#define BUFSIZE 1024*8
|
#define BUFSIZE 1024*8
|
||||||
|
@ -37,29 +38,11 @@ const OPTIONS mac_options[] = {
|
||||||
{NULL}
|
{NULL}
|
||||||
};
|
};
|
||||||
|
|
||||||
static int mac_ctrl_string(EVP_MAC_CTX *ctx, const char *value)
|
|
||||||
{
|
|
||||||
int rv;
|
|
||||||
char *stmp, *vtmp = NULL;
|
|
||||||
|
|
||||||
stmp = OPENSSL_strdup(value);
|
|
||||||
if (stmp == NULL)
|
|
||||||
return -1;
|
|
||||||
vtmp = strchr(stmp, ':');
|
|
||||||
if (vtmp != NULL) {
|
|
||||||
*vtmp = 0;
|
|
||||||
vtmp++;
|
|
||||||
}
|
|
||||||
rv = EVP_MAC_ctrl_str(ctx, stmp, vtmp);
|
|
||||||
OPENSSL_free(stmp);
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
int mac_main(int argc, char **argv)
|
int mac_main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
int ret = 1;
|
int ret = 1;
|
||||||
char *prog;
|
char *prog;
|
||||||
const EVP_MAC *mac = NULL;
|
EVP_MAC *mac = NULL;
|
||||||
OPTION_CHOICE o;
|
OPTION_CHOICE o;
|
||||||
EVP_MAC_CTX *ctx = NULL;
|
EVP_MAC_CTX *ctx = NULL;
|
||||||
STACK_OF(OPENSSL_STRING) *opts = NULL;
|
STACK_OF(OPENSSL_STRING) *opts = NULL;
|
||||||
|
@ -109,7 +92,7 @@ opthelp:
|
||||||
goto opthelp;
|
goto opthelp;
|
||||||
}
|
}
|
||||||
|
|
||||||
mac = EVP_get_macbyname(argv[0]);
|
mac = EVP_MAC_fetch(NULL, argv[0], NULL);
|
||||||
if (mac == NULL) {
|
if (mac == NULL) {
|
||||||
BIO_printf(bio_err, "Invalid MAC name %s\n", argv[0]);
|
BIO_printf(bio_err, "Invalid MAC name %s\n", argv[0]);
|
||||||
goto opthelp;
|
goto opthelp;
|
||||||
|
@ -120,14 +103,45 @@ opthelp:
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
if (opts != NULL) {
|
if (opts != NULL) {
|
||||||
for (i = 0; i < sk_OPENSSL_STRING_num(opts); i++) {
|
OSSL_PARAM *params =
|
||||||
char *opt = sk_OPENSSL_STRING_value(opts, i);
|
OPENSSL_zalloc(sizeof(OSSL_PARAM)
|
||||||
if (mac_ctrl_string(ctx, opt) <= 0) {
|
* (sk_OPENSSL_STRING_num(opts) + 1));
|
||||||
|
const OSSL_PARAM *paramdefs = EVP_MAC_CTX_settable_params(mac);
|
||||||
|
size_t params_n;
|
||||||
|
int ok = 1;
|
||||||
|
|
||||||
|
for (params_n = 0; params_n < (size_t)sk_OPENSSL_STRING_num(opts);
|
||||||
|
params_n++) {
|
||||||
|
char *opt = sk_OPENSSL_STRING_value(opts, (int)params_n);
|
||||||
|
char *stmp, *vtmp = NULL;
|
||||||
|
|
||||||
|
if ((stmp = OPENSSL_strdup(opt)) == NULL
|
||||||
|
|| (vtmp = strchr(stmp, ':')) == NULL
|
||||||
|
|| (*vtmp++ = 0) /* Always zero */
|
||||||
|
|| !OSSL_PARAM_allocate_from_text(¶ms[params_n], paramdefs,
|
||||||
|
stmp, vtmp, strlen(vtmp))) {
|
||||||
BIO_printf(bio_err, "MAC parameter error '%s'\n", opt);
|
BIO_printf(bio_err, "MAC parameter error '%s'\n", opt);
|
||||||
ERR_print_errors(bio_err);
|
ERR_print_errors(bio_err);
|
||||||
|
ok = 0;
|
||||||
|
}
|
||||||
|
OPENSSL_free(stmp);
|
||||||
|
if (!ok)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (ok) {
|
||||||
|
params[params_n] = OSSL_PARAM_construct_end();
|
||||||
|
if (!EVP_MAC_CTX_set_params(ctx, params)) {
|
||||||
|
BIO_printf(bio_err, "MAC parameter error\n");
|
||||||
|
ERR_print_errors(bio_err);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
for (; params_n-- > 0;) {
|
||||||
|
OPENSSL_free(params[params_n].data);
|
||||||
|
}
|
||||||
|
OPENSSL_free(params);
|
||||||
|
if (!ok)
|
||||||
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Use text mode for stdin */
|
/* Use text mode for stdin */
|
||||||
|
@ -161,7 +175,7 @@ opthelp:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!EVP_MAC_final(ctx, NULL, &len)) {
|
if (!EVP_MAC_final(ctx, NULL, &len, 0)) {
|
||||||
BIO_printf(bio_err, "EVP_MAC_final failed\n");
|
BIO_printf(bio_err, "EVP_MAC_final failed\n");
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
@ -170,7 +184,7 @@ opthelp:
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!EVP_MAC_final(ctx, buf, &len)) {
|
if (!EVP_MAC_final(ctx, buf, &len, BUFSIZE)) {
|
||||||
BIO_printf(bio_err, "EVP_MAC_final failed\n");
|
BIO_printf(bio_err, "EVP_MAC_final failed\n");
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
@ -195,5 +209,6 @@ err:
|
||||||
BIO_free(in);
|
BIO_free(in);
|
||||||
BIO_free(out);
|
BIO_free(out);
|
||||||
EVP_MAC_CTX_free(ctx);
|
EVP_MAC_CTX_free(ctx);
|
||||||
|
EVP_MAC_free(mac);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue