0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f
};
- pkey = EVP_PKEY_new_raw_private_key(EVP_PKEY_HMAC, NULL, key, sizeof(key));
+ pkey = EVP_PKEY_new_raw_private_key_ex(testctx, "HMAC",
+ NULL, key, sizeof(key));
if (!TEST_ptr(pkey))
return NULL;
if (!test_fromdata(keytype, params))
goto err;
OSSL_PARAM_free(params);
+ params = NULL;
OSSL_PARAM_BLD_free(bld);
/* Test priv and !pub */
if (!test_fromdata(keytype, params))
goto err;
OSSL_PARAM_free(params);
+ params = NULL;
OSSL_PARAM_BLD_free(bld);
/* Test !priv and pub */
if (!test_fromdata(keytype, params))
goto err;
OSSL_PARAM_free(params);
+ params = NULL;
OSSL_PARAM_BLD_free(bld);
/* Test priv and pub */
if (!test_fromdata("EC", params))
goto err;
OSSL_PARAM_free(params);
+ params = NULL;
OSSL_PARAM_BLD_free(bld);
/* Test priv and !pub */
if (!test_fromdata("EC", params))
goto err;
OSSL_PARAM_free(params);
+ params = NULL;
OSSL_PARAM_BLD_free(bld);
/* Test !priv and pub */
if (!test_fromdata("EC", params))
goto err;
OSSL_PARAM_free(params);
+ params = NULL;
OSSL_PARAM_BLD_free(bld);
/* Test priv and pub */
|| !TEST_true(EVP_DigestUpdate(md_ctx, kMsg, sizeof(kMsg)))
|| !TEST_true(EVP_DigestFinal(md_ctx, md, NULL))
/* EVP_DigestFinal resets the EVP_MD_CTX. */
- || !TEST_ptr_eq(EVP_MD_CTX_md(md_ctx), NULL))
+ || !TEST_ptr_eq(EVP_MD_CTX_get0_md(md_ctx), NULL))
goto out;
if (!TEST_true(EVP_DigestInit_ex(md_ctx, sha256, NULL))
|| !TEST_true(EVP_DigestUpdate(md_ctx, kMsg, sizeof(kMsg)))
|| !TEST_true(EVP_DigestFinal_ex(md_ctx, md, NULL))
/* EVP_DigestFinal_ex does not reset the EVP_MD_CTX. */
- || !TEST_ptr(EVP_MD_CTX_md(md_ctx))
+ || !TEST_ptr(EVP_MD_CTX_get0_md(md_ctx))
/*
* EVP_DigestInit_ex with NULL type should work on
* pre-initialized context.
|| !TEST_true(EVP_DigestUpdate(md_ctx, kMsg, sizeof(kMsg)))
|| !TEST_true(EVP_DigestFinalXOF(md_ctx, md, sizeof(md)))
/* EVP_DigestFinalXOF does not reset the EVP_MD_CTX. */
- || !TEST_ptr(EVP_MD_CTX_md(md_ctx))
+ || !TEST_ptr(EVP_MD_CTX_get0_md(md_ctx))
|| !TEST_true(EVP_DigestInit_ex(md_ctx, NULL, NULL)))
goto out;
ret = 1;
return ret;
}
+
#endif
+static int test_EVP_PKCS82PKEY_wrong_tag(void)
+{
+ EVP_PKEY *pkey = NULL;
+ EVP_PKEY *pkey2 = NULL;
+ BIO *membio = NULL;
+ char *membuf = NULL;
+ PKCS8_PRIV_KEY_INFO *p8inf = NULL;
+ int ok = 0;
+
+ if (testctx != NULL)
+ /* test not supported with non-default context */
+ return 1;
+
+ if (!TEST_ptr(membio = BIO_new(BIO_s_mem()))
+ || !TEST_ptr(pkey = load_example_rsa_key())
+ || !TEST_int_gt(i2d_PKCS8PrivateKey_bio(membio, pkey, NULL,
+ NULL, 0, NULL, NULL),
+ 0)
+ || !TEST_int_gt(BIO_get_mem_data(membio, &membuf), 0)
+ || !TEST_ptr(p8inf = d2i_PKCS8_PRIV_KEY_INFO_bio(membio, NULL))
+ || !TEST_ptr(pkey2 = EVP_PKCS82PKEY(p8inf))
+ || !TEST_int_eq(ERR_get_error(), 0)) {
+ goto done;
+ }
+
+ ok = 1;
+ done:
+ EVP_PKEY_free(pkey);
+ EVP_PKEY_free(pkey2);
+ PKCS8_PRIV_KEY_INFO_free(p8inf);
+ BIO_free_all(membio);
+ return ok;
+}
/* This uses kExampleRSAKeyDER and kExampleRSAKeyPKCS8 to verify encoding */
static int test_privatekey_to_pkcs8(void)
EVP_MD_CTX *md_ctx = NULL;
EVP_MD_CTX *md_ctx_verify = NULL;
EVP_PKEY_CTX *cctx = NULL;
- EVP_MD *sm3 = NULL;
+ EVP_MD *check_md = NULL;
uint8_t ciphertext[128];
size_t ctext_len = sizeof(ciphertext);
OSSL_PARAM sparams[2] = {OSSL_PARAM_END, OSSL_PARAM_END};
OSSL_PARAM gparams[2] = {OSSL_PARAM_END, OSSL_PARAM_END};
int i;
- char mdname[20];
+ char mdname[OSSL_MAX_NAME_SIZE];
- pctx = EVP_PKEY_CTX_new_from_name(testctx, "SM2", testpropq);
- if (!TEST_ptr(pctx))
+ if (!TEST_ptr(pctx = EVP_PKEY_CTX_new_from_name(testctx,
+ "SM2", testpropq)))
goto done;
if (!TEST_true(EVP_PKEY_paramgen_init(pctx) == 1))
if (!TEST_true(EVP_PKEY_paramgen(pctx, &pkeyparams)))
goto done;
- kctx = EVP_PKEY_CTX_new_from_pkey(testctx, pkeyparams, testpropq);
- if (!TEST_ptr(kctx))
+ if (!TEST_ptr(kctx = EVP_PKEY_CTX_new_from_pkey(testctx,
+ pkeyparams, testpropq)))
goto done;
if (!TEST_true(EVP_PKEY_keygen_init(kctx)))
EVP_MD_CTX_set_pkey_ctx(md_ctx, sctx);
EVP_MD_CTX_set_pkey_ctx(md_ctx_verify, sctx);
- if (!TEST_ptr(sm3 = EVP_MD_fetch(testctx, "sm3", testpropq)))
+ if (!TEST_ptr(check_md = EVP_MD_fetch(testctx, "sm3", testpropq)))
goto done;
- if (!TEST_true(EVP_DigestSignInit(md_ctx, NULL, sm3, NULL, pkey)))
+ if (!TEST_true(EVP_DigestSignInit(md_ctx, NULL, check_md, NULL, pkey)))
goto done;
if (!TEST_int_gt(EVP_PKEY_CTX_set1_id(sctx, sm2_id, sizeof(sm2_id)), 0))
goto done;
- if(!TEST_true(EVP_DigestSignUpdate(md_ctx, kMsg, sizeof(kMsg))))
+ if (!TEST_true(EVP_DigestSignUpdate(md_ctx, kMsg, sizeof(kMsg))))
goto done;
/* Determine the size of the signature. */
/* Ensure that the signature round-trips. */
- if (!TEST_true(EVP_DigestVerifyInit(md_ctx_verify, NULL, sm3, NULL, pkey)))
+ if (!TEST_true(EVP_DigestVerifyInit(md_ctx_verify, NULL, check_md, NULL,
+ pkey)))
goto done;
if (!TEST_int_gt(EVP_PKEY_CTX_set1_id(sctx, sm2_id, sizeof(sm2_id)), 0))
gparams[0] = OSSL_PARAM_construct_utf8_string(OSSL_ASYM_CIPHER_PARAM_DIGEST,
mdname, sizeof(mdname));
for (i = 0; i < 2; i++) {
+ const char *mdnames[] = {
+#ifndef OPENSSL_NO_SM3
+ "SM3",
+#else
+ NULL,
+#endif
+ "SHA2-256" };
EVP_PKEY_CTX_free(cctx);
- sparams[0] = OSSL_PARAM_construct_utf8_string(OSSL_ASYM_CIPHER_PARAM_DIGEST,
- i == 0 ? "SM3" : "SHA2-256",
- 0);
+ if (mdnames[i] == NULL)
+ continue;
- if (!TEST_ptr(cctx = EVP_PKEY_CTX_new_from_pkey(testctx, pkey, testpropq)))
+ sparams[0] =
+ OSSL_PARAM_construct_utf8_string(OSSL_ASYM_CIPHER_PARAM_DIGEST,
+ (char *)mdnames[i], 0);
+
+ if (!TEST_ptr(cctx = EVP_PKEY_CTX_new_from_pkey(testctx,
+ pkey, testpropq)))
goto done;
if (!TEST_true(EVP_PKEY_encrypt_init(cctx)))
if (!TEST_true(EVP_PKEY_CTX_get_params(cctx, gparams)))
goto done;
- /* Test we're still using the digest we think we are */
- if (i == 0 && !TEST_int_eq(strcmp(mdname, "SM3"), 0))
+ /*
+ * Test we're still using the digest we think we are.
+ * Because of aliases, the easiest is to fetch the digest and
+ * check the name with EVP_MD_is_a().
+ */
+ EVP_MD_free(check_md);
+ if (!TEST_ptr(check_md = EVP_MD_fetch(testctx, mdname, testpropq)))
goto done;
- if (i == 1 && !TEST_int_eq(strcmp(mdname, "SHA2-256"), 0))
+ if (!TEST_true(EVP_MD_is_a(check_md, mdnames[i]))) {
+ TEST_info("Fetched md %s isn't %s", mdname, mdnames[i]);
goto done;
+ }
if (!TEST_true(ptext_len == sizeof(kMsg)))
goto done;
EVP_PKEY_free(pkeyparams);
EVP_MD_CTX_free(md_ctx);
EVP_MD_CTX_free(md_ctx_verify);
- EVP_MD_free(sm3);
+ EVP_MD_free(check_md);
OPENSSL_free(sig);
return ret;
}
} keys[] = {
{
EVP_PKEY_HMAC, "0123456789", NULL
+#ifndef OPENSSL_NO_POLY1305
}, {
EVP_PKEY_POLY1305, "01234567890123456789012345678901", NULL
+#endif
+#ifndef OPENSSL_NO_SIPHASH
}, {
EVP_PKEY_SIPHASH, "0123456789012345", NULL
+#endif
},
#ifndef OPENSSL_NO_EC
{
size_t inlen, len = 0;
EVP_PKEY *pkey;
- if (nullprov != NULL)
- return TEST_skip("Test does not support a non-default library context");
-
/* Check if this algorithm supports public keys */
- if (keys[tst].pub == NULL)
+ if (pub && keys[tst].pub == NULL)
return 1;
memset(buf, 0, sizeof(buf));
if (pub) {
+#ifndef OPENSSL_NO_EC
inlen = strlen(keys[tst].pub);
in = (unsigned char *)keys[tst].pub;
if (uselibctx) {
in,
inlen);
}
+#else
+ return 1;
+#endif
} else {
inlen = strlen(keys[tst].priv);
in = (unsigned char *)keys[tst].priv;
}
if (!TEST_ptr(pkey)
+ || !TEST_int_eq(EVP_PKEY_eq(pkey, pkey), 1)
|| (!pub && !TEST_true(EVP_PKEY_get_raw_private_key(pkey, NULL, &len)))
|| (pub && !TEST_true(EVP_PKEY_get_raw_public_key(pkey, NULL, &len)))
|| !TEST_true(len == inlen)
static int test_set_get_raw_keys(int tst)
{
- return test_set_get_raw_keys_int(tst, 0, 0)
+ return (nullprov != NULL || test_set_get_raw_keys_int(tst, 0, 0))
&& test_set_get_raw_keys_int(tst, 0, 1)
- && test_set_get_raw_keys_int(tst, 1, 0)
+ && (nullprov != NULL || test_set_get_raw_keys_int(tst, 1, 0))
&& test_set_get_raw_keys_int(tst, 1, 1);
}
seed, sizeof(seed));
*p++ = OSSL_PARAM_construct_uint(OSSL_RAND_PARAM_MAX_REQUEST, &step);
*p = OSSL_PARAM_construct_end();
- res = TEST_true(EVP_RAND_set_ctx_params(ctx, params))
+ res = TEST_true(EVP_RAND_CTX_set_params(ctx, params))
&& TEST_true(EVP_RAND_generate(ctx, out, sizeof(out), 0, 1, NULL, 0))
&& TEST_mem_eq(seed, sizeof(seed), out, sizeof(out));
EVP_RAND_CTX_free(ctx);
* an encryption operation.
* Run multiple times for some different relevant algorithms/modes.
*/
-static int test_evp_iv(int idx)
+static int test_evp_iv_aes(int idx)
{
int ret = 0;
EVP_CIPHER_CTX *ctx = NULL;
unsigned char ofb_state[16] = {0x76, 0xe6, 0x66, 0x61, 0xd0, 0x8a, 0xe4, 0x64,
0xdd, 0x66, 0xbf, 0x00, 0xf0, 0xe3, 0x6f, 0xfd};
+ unsigned char cfb_state[16] = {0x77, 0xe4, 0x65, 0x65, 0xd5, 0x8c, 0xe3, 0x6c,
+ 0xd4, 0x6c, 0xb4, 0x0c, 0xfd, 0xed, 0x60, 0xed};
unsigned char gcm_state[12] = {0x57, 0x71, 0x7d, 0xad, 0xdb, 0x9b,
0x98, 0x82, 0x5a, 0x55, 0x91, 0x81};
unsigned char ccm_state[7] = {0x57, 0x71, 0x7d, 0xad, 0xdb, 0x9b, 0x98};
int len = sizeof(ciphertext);
size_t ivlen, ref_len;
const EVP_CIPHER *type = NULL;
+ int iv_reset = 0;
- if (nullprov != NULL && idx < 5)
+ if (nullprov != NULL && idx < 6)
return TEST_skip("Test does not support a non-default library context");
switch(idx) {
case 0:
type = EVP_aes_128_cbc();
/* FALLTHROUGH */
- case 5:
+ case 6:
type = (type != NULL) ? type :
EVP_CIPHER_fetch(testctx, "aes-128-cbc", testpropq);
ref_iv = cbc_state;
ref_len = sizeof(cbc_state);
+ iv_reset = 1;
break;
case 1:
type = EVP_aes_128_ofb();
/* FALLTHROUGH */
- case 6:
+ case 7:
type = (type != NULL) ? type :
EVP_CIPHER_fetch(testctx, "aes-128-ofb", testpropq);
ref_iv = ofb_state;
ref_len = sizeof(ofb_state);
+ iv_reset = 1;
break;
case 2:
+ type = EVP_aes_128_cfb();
+ /* FALLTHROUGH */
+ case 8:
+ type = (type != NULL) ? type :
+ EVP_CIPHER_fetch(testctx, "aes-128-cfb", testpropq);
+ ref_iv = cfb_state;
+ ref_len = sizeof(cfb_state);
+ iv_reset = 1;
+ break;
+ case 3:
type = EVP_aes_128_gcm();
/* FALLTHROUGH */
- case 7:
+ case 9:
type = (type != NULL) ? type :
EVP_CIPHER_fetch(testctx, "aes-128-gcm", testpropq);
ref_iv = gcm_state;
ref_len = sizeof(gcm_state);
break;
- case 3:
+ case 4:
type = EVP_aes_128_ccm();
/* FALLTHROUGH */
- case 8:
+ case 10:
type = (type != NULL) ? type :
EVP_CIPHER_fetch(testctx, "aes-128-ccm", testpropq);
ref_iv = ccm_state;
ref_len = sizeof(ccm_state);
break;
#ifdef OPENSSL_NO_OCB
- case 4:
- case 9:
+ case 5:
+ case 11:
return 1;
#else
- case 4:
+ case 5:
type = EVP_aes_128_ocb();
/* FALLTHROUGH */
- case 9:
+ case 11:
type = (type != NULL) ? type :
EVP_CIPHER_fetch(testctx, "aes-128-ocb", testpropq);
ref_iv = ocb_state;
|| !TEST_mem_eq(ref_iv, ref_len, iv, ivlen))
goto err;
+ /* CBC, OFB, and CFB modes: the updated iv must be reset after reinit */
+ if (!TEST_true(EVP_EncryptInit_ex(ctx, NULL, NULL, NULL, NULL))
+ || !TEST_true(EVP_CIPHER_CTX_get_updated_iv(ctx, iv, sizeof(iv))))
+ goto err;
+ if (iv_reset) {
+ if (!TEST_mem_eq(init_iv, ivlen, iv, ivlen))
+ goto err;
+ } else {
+ if (!TEST_mem_eq(ref_iv, ivlen, iv, ivlen))
+ goto err;
+ }
+
ret = 1;
err:
EVP_CIPHER_CTX_free(ctx);
- if (idx >= 5)
+ if (idx >= 6)
EVP_CIPHER_free((EVP_CIPHER *)type);
return ret;
}
+#ifndef OPENSSL_NO_DES
+static int test_evp_iv_des(int idx)
+{
+ int ret = 0;
+ EVP_CIPHER_CTX *ctx = NULL;
+ static const unsigned char key[24] = {
+ 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
+ 0xf1, 0xe0, 0xd3, 0xc2, 0xb5, 0xa4, 0x97, 0x86,
+ 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10
+ };
+ static const unsigned char init_iv[8] = {
+ 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10
+ };
+ static const unsigned char msg[] = { 1, 2, 3, 4, 5, 6, 7, 8,
+ 9, 10, 11, 12, 13, 14, 15, 16 };
+ unsigned char ciphertext[32], oiv[8], iv[8];
+ unsigned const char *ref_iv;
+ static const unsigned char cbc_state_des[8] = {
+ 0x4f, 0xa3, 0x85, 0xcd, 0x8b, 0xf3, 0x06, 0x2a
+ };
+ static const unsigned char cbc_state_3des[8] = {
+ 0x35, 0x27, 0x7d, 0x65, 0x6c, 0xfb, 0x50, 0xd9
+ };
+ static const unsigned char ofb_state_des[8] = {
+ 0xa7, 0x0d, 0x1d, 0x45, 0xf9, 0x96, 0x3f, 0x2c
+ };
+ static const unsigned char ofb_state_3des[8] = {
+ 0xab, 0x16, 0x24, 0xbb, 0x5b, 0xac, 0xed, 0x5e
+ };
+ static const unsigned char cfb_state_des[8] = {
+ 0x91, 0xeb, 0x6d, 0x29, 0x4b, 0x08, 0xbd, 0x73
+ };
+ static const unsigned char cfb_state_3des[8] = {
+ 0x34, 0xdd, 0xfb, 0x47, 0x33, 0x1c, 0x61, 0xf7
+ };
+ int len = sizeof(ciphertext);
+ size_t ivlen, ref_len;
+ EVP_CIPHER *type = NULL;
+
+ if (lgcyprov == NULL && idx < 3)
+ return TEST_skip("Test requires legacy provider to be loaded");
+
+ switch(idx) {
+ case 0:
+ type = EVP_CIPHER_fetch(testctx, "des-cbc", testpropq);
+ ref_iv = cbc_state_des;
+ ref_len = sizeof(cbc_state_des);
+ break;
+ case 1:
+ type = EVP_CIPHER_fetch(testctx, "des-ofb", testpropq);
+ ref_iv = ofb_state_des;
+ ref_len = sizeof(ofb_state_des);
+ break;
+ case 2:
+ type = EVP_CIPHER_fetch(testctx, "des-cfb", testpropq);
+ ref_iv = cfb_state_des;
+ ref_len = sizeof(cfb_state_des);
+ break;
+ case 3:
+ type = EVP_CIPHER_fetch(testctx, "des-ede3-cbc", testpropq);
+ ref_iv = cbc_state_3des;
+ ref_len = sizeof(cbc_state_3des);
+ break;
+ case 4:
+ type = EVP_CIPHER_fetch(testctx, "des-ede3-ofb", testpropq);
+ ref_iv = ofb_state_3des;
+ ref_len = sizeof(ofb_state_3des);
+ break;
+ case 5:
+ type = EVP_CIPHER_fetch(testctx, "des-ede3-cfb", testpropq);
+ ref_iv = cfb_state_3des;
+ ref_len = sizeof(cfb_state_3des);
+ break;
+ default:
+ return 0;
+ }
+
+ if (!TEST_ptr(type)
+ || !TEST_ptr((ctx = EVP_CIPHER_CTX_new()))
+ || !TEST_true(EVP_EncryptInit_ex(ctx, type, NULL, key, init_iv))
+ || !TEST_true(EVP_EncryptUpdate(ctx, ciphertext, &len, msg,
+ (int)sizeof(msg)))
+ || !TEST_true(EVP_CIPHER_CTX_get_original_iv(ctx, oiv, sizeof(oiv)))
+ || !TEST_true(EVP_CIPHER_CTX_get_updated_iv(ctx, iv, sizeof(iv)))
+ || !TEST_true(EVP_EncryptFinal_ex(ctx, ciphertext, &len)))
+ goto err;
+ ivlen = EVP_CIPHER_CTX_iv_length(ctx);
+ if (!TEST_mem_eq(init_iv, ivlen, oiv, ivlen)
+ || !TEST_mem_eq(ref_iv, ref_len, iv, ivlen))
+ goto err;
+
+ if (!TEST_true(EVP_EncryptInit_ex(ctx, NULL, NULL, NULL, NULL))
+ || !TEST_true(EVP_CIPHER_CTX_get_updated_iv(ctx, iv, sizeof(iv))))
+ goto err;
+ if (!TEST_mem_eq(init_iv, ivlen, iv, ivlen))
+ goto err;
+
+ ret = 1;
+err:
+ EVP_CIPHER_CTX_free(ctx);
+ EVP_CIPHER_free(type);
+ return ret;
+}
+#endif
+
#ifndef OPENSSL_NO_EC
-static int ecpub_nids[] = { NID_brainpoolP256r1, NID_X9_62_prime256v1,
- NID_secp384r1, NID_secp521r1, NID_sect233k1, NID_sect233r1, NID_sect283r1,
+static int ecpub_nids[] = {
+ NID_brainpoolP256r1, NID_X9_62_prime256v1,
+ NID_secp384r1, NID_secp521r1,
+# ifndef OPENSSL_NO_EC2M
+ NID_sect233k1, NID_sect233r1, NID_sect283r1,
NID_sect409k1, NID_sect409r1, NID_sect571k1, NID_sect571r1,
- NID_brainpoolP384r1, NID_brainpoolP512r1};
+# endif
+ NID_brainpoolP384r1, NID_brainpoolP512r1
+};
static int test_ecpub(int idx)
{
if (!TEST_ptr(d2i_PublicKey(EVP_PKEY_EC, &pkey2, &q, savelen)))
goto done;
/* The keys should match. */
- if (!TEST_int_eq(EVP_PKEY_cmp(pkey, pkey2), 1))
+ if (!TEST_int_eq(EVP_PKEY_eq(pkey, pkey2), 1))
goto done;
# endif
ADD_TEST(test_EVP_Enveloped);
ADD_ALL_TESTS(test_d2i_AutoPrivateKey, OSSL_NELEM(keydata));
ADD_TEST(test_privatekey_to_pkcs8);
+ ADD_TEST(test_EVP_PKCS82PKEY_wrong_tag);
#ifndef OPENSSL_NO_EC
ADD_TEST(test_EVP_PKCS82PKEY);
#endif
ADD_ALL_TESTS(test_pkey_ctx_fail_without_provider, 2);
ADD_TEST(test_rand_agglomeration);
- ADD_ALL_TESTS(test_evp_iv, 10);
+ ADD_ALL_TESTS(test_evp_iv_aes, 12);
+#ifndef OPENSSL_NO_DES
+ ADD_ALL_TESTS(test_evp_iv_des, 6);
+#endif
ADD_TEST(test_EVP_rsa_pss_with_keygen_bits);
#ifndef OPENSSL_NO_EC
ADD_ALL_TESTS(test_ecpub, OSSL_NELEM(ecpub_nids));