diff options
author | Rich Salz <rsalz@openssl.org> | 2017-04-25 20:50:59 -0400 |
---|---|---|
committer | Rich Salz <rsalz@openssl.org> | 2017-04-25 21:00:48 -0400 |
commit | d91b7423af79447df90cc0245b6944fce93302d1 (patch) | |
tree | 8cbf0ffcf75b5fa3dc38acdc2488e5ddcfb0440c /test/evp_test.c | |
parent | dd05be5d7809cb831718820eedd86269b2504180 (diff) |
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)
Diffstat (limited to 'test/evp_test.c')
-rw-r--r-- | test/evp_test.c | 130 |
1 files changed, 130 insertions, 0 deletions
diff --git a/test/evp_test.c b/test/evp_test.c index f99269d33d..e7396f7b2a 100644 --- a/test/evp_test.c +++ b/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 +}; + |