evp_test.c: Add PrivPubKeyPair tests
Reviewed-by: Stephen Henson <steve@openssl.org> Reviewed-by: Rich Salz <rsalz@openssl.org> (Merged from https://github.com/openssl/openssl/pull/3245)
This commit is contained in:
parent
dd05be5d78
commit
d91b7423af
2 changed files with 1919 additions and 0 deletions
130
test/evp_test.c
130
test/evp_test.c
|
@ -273,6 +273,7 @@ static const struct evp_test_method pderive_test_method;
|
|||
static const struct evp_test_method pbe_test_method;
|
||||
static const struct evp_test_method encode_test_method;
|
||||
static const struct evp_test_method kdf_test_method;
|
||||
static const struct evp_test_method keypair_test_method;
|
||||
|
||||
static const struct evp_test_method *evp_test_list[] = {
|
||||
&digest_test_method,
|
||||
|
@ -286,6 +287,7 @@ static const struct evp_test_method *evp_test_list[] = {
|
|||
&pbe_test_method,
|
||||
&encode_test_method,
|
||||
&kdf_test_method,
|
||||
&keypair_test_method,
|
||||
NULL
|
||||
};
|
||||
|
||||
|
@ -2050,3 +2052,131 @@ static const struct evp_test_method kdf_test_method = {
|
|||
kdf_test_parse,
|
||||
kdf_test_run
|
||||
};
|
||||
|
||||
struct keypair_test_data {
|
||||
EVP_PKEY *privk;
|
||||
EVP_PKEY *pubk;
|
||||
};
|
||||
|
||||
static int keypair_test_init(struct evp_test *t, const char *pair)
|
||||
{
|
||||
int rv = 0;
|
||||
EVP_PKEY *pk = NULL, *pubk = NULL;
|
||||
char *pub, *priv = NULL;
|
||||
const char *err = "INTERNAL_ERROR";
|
||||
struct keypair_test_data *data;
|
||||
|
||||
priv = OPENSSL_strdup(pair);
|
||||
if (priv == NULL)
|
||||
return 0;
|
||||
pub = strchr(priv, ':');
|
||||
if ( pub == NULL ) {
|
||||
fprintf(stderr, "Wrong syntax \"%s\"\n", pair);
|
||||
goto end;
|
||||
}
|
||||
*pub++ = 0; /* split priv and pub strings */
|
||||
|
||||
if (find_key(&pk, priv, t->private) == 0) {
|
||||
fprintf(stderr, "Cannot find private key: %s\n", priv);
|
||||
err = "MISSING_PRIVATE_KEY";
|
||||
goto end;
|
||||
}
|
||||
if (find_key(&pubk, pub, t->public) == 0) {
|
||||
fprintf(stderr, "Cannot find public key: %s\n", pub);
|
||||
err = "MISSING_PUBLIC_KEY";
|
||||
goto end;
|
||||
}
|
||||
|
||||
if (pk == NULL && pubk == NULL) {
|
||||
/* Both keys are listed but unsupported: skip this test */
|
||||
t->skip = 1;
|
||||
rv = 1;
|
||||
goto end;
|
||||
}
|
||||
|
||||
data = OPENSSL_malloc(sizeof(*data));
|
||||
if (data == NULL )
|
||||
goto end;
|
||||
|
||||
data->privk = pk;
|
||||
data->pubk = pubk;
|
||||
t->data = data;
|
||||
|
||||
rv = 1;
|
||||
err = NULL;
|
||||
|
||||
end:
|
||||
if (priv)
|
||||
OPENSSL_free(priv);
|
||||
t->err = err;
|
||||
return rv;
|
||||
}
|
||||
|
||||
static void keypair_test_cleanup(struct evp_test *t)
|
||||
{
|
||||
struct keypair_test_data *data = t->data;
|
||||
t->data = NULL;
|
||||
if (data)
|
||||
test_free(data);
|
||||
return;
|
||||
}
|
||||
|
||||
/* For test that do not accept any custom keyword:
|
||||
* return 0 if called
|
||||
*/
|
||||
static int void_test_parse(struct evp_test *t, const char *keyword, const char *value)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int keypair_test_run(struct evp_test *t)
|
||||
{
|
||||
int rv = 0;
|
||||
const struct keypair_test_data *pair = t->data;
|
||||
const char *err = "INTERNAL_ERROR";
|
||||
|
||||
if (pair == NULL)
|
||||
goto end;
|
||||
|
||||
if (pair->privk == NULL || pair->pubk == NULL) {
|
||||
/* this can only happen if only one of the keys is not set
|
||||
* which means that one of them was unsupported while the
|
||||
* other isn't: hence a key type mismatch.
|
||||
*/
|
||||
err = "KEYPAIR_TYPE_MISMATCH";
|
||||
rv = 1;
|
||||
goto end;
|
||||
}
|
||||
|
||||
if ((rv = EVP_PKEY_cmp(pair->privk, pair->pubk)) != 1 ) {
|
||||
if ( 0 == rv ) {
|
||||
err = "KEYPAIR_MISMATCH";
|
||||
} else if ( -1 == rv ) {
|
||||
err = "KEYPAIR_TYPE_MISMATCH";
|
||||
} else if ( -2 == rv ) {
|
||||
err = "UNSUPPORTED_KEY_COMPARISON";
|
||||
} else {
|
||||
fprintf(stderr, "Unexpected error in key comparison\n");
|
||||
rv = 0;
|
||||
goto end;
|
||||
}
|
||||
rv = 1;
|
||||
goto end;
|
||||
}
|
||||
|
||||
rv = 1;
|
||||
err = NULL;
|
||||
|
||||
end:
|
||||
t->err = err;
|
||||
return rv;
|
||||
}
|
||||
|
||||
static const struct evp_test_method keypair_test_method = {
|
||||
"PrivPubKeyPair",
|
||||
keypair_test_init,
|
||||
keypair_test_cleanup,
|
||||
void_test_parse,
|
||||
keypair_test_run
|
||||
};
|
||||
|
||||
|
|
1789
test/evptests.txt
1789
test/evptests.txt
File diff suppressed because it is too large
Load diff
Loading…
Reference in a new issue