Codebase list openssl / 2eb2b4f
Key zeroization fix for EVP_SealInit + added simple test Reviewed-by: Nicola Tuveri <nic.tuv@gmail.com> Reviewed-by: Paul Dale <paul.dale@oracle.com> (Merged from https://github.com/openssl/openssl/pull/7105) Shane Lontis authored 5 years ago Pauli committed 5 years ago
2 changed file(s) with 58 addition(s) and 6 deletion(s). Raw diff Collapse all Expand all
2020 {
2121 unsigned char key[EVP_MAX_KEY_LENGTH];
2222 int i;
23 int rv = 0;
2324
2425 if (type) {
2526 EVP_CIPHER_CTX_reset(ctx);
3031 return 1;
3132 if (EVP_CIPHER_CTX_rand_key(ctx, key) <= 0)
3233 return 0;
34
3335 if (EVP_CIPHER_CTX_iv_length(ctx)
34 && RAND_bytes(iv, EVP_CIPHER_CTX_iv_length(ctx)) <= 0)
35 return 0;
36 && RAND_bytes(iv, EVP_CIPHER_CTX_iv_length(ctx)) <= 0)
37 goto err;
3638
3739 if (!EVP_EncryptInit_ex(ctx, NULL, NULL, key, iv))
38 return 0;
40 goto err;
3941
4042 for (i = 0; i < npubk; i++) {
4143 ekl[i] =
4244 EVP_PKEY_encrypt_old(ek[i], key, EVP_CIPHER_CTX_key_length(ctx),
4345 pubk[i]);
44 if (ekl[i] <= 0)
45 return -1;
46 if (ekl[i] <= 0) {
47 rv = -1;
48 goto err;
49 }
4650 }
47 return npubk;
51 rv = npubk;
52 err:
53 OPENSSL_cleanse(key, sizeof(key));
54 return rv;
4855 }
4956
5057 int EVP_SealFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl)
355355 return ret;
356356 }
357357
358 static int test_EVP_Enveloped(void)
359 {
360 int ret = 0;
361 EVP_CIPHER_CTX *ctx = NULL;
362 EVP_PKEY *keypair = NULL;
363 unsigned char *kek = NULL;
364 unsigned char iv[EVP_MAX_IV_LENGTH];
365 static const unsigned char msg[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
366 int len, kek_len, ciphertext_len, plaintext_len;
367 unsigned char ciphertext[32], plaintext[16];
368 const EVP_CIPHER *type = EVP_aes_256_cbc();
369
370 if (!TEST_ptr(keypair = load_example_rsa_key())
371 || !TEST_ptr(kek = OPENSSL_zalloc(EVP_PKEY_size(keypair)))
372 || !TEST_ptr(ctx = EVP_CIPHER_CTX_new())
373 || !TEST_true(EVP_SealInit(ctx, type, &kek, &kek_len, iv,
374 &keypair, 1))
375 || !TEST_true(EVP_SealUpdate(ctx, ciphertext, &ciphertext_len,
376 msg, sizeof(msg)))
377 || !TEST_true(EVP_SealFinal(ctx, ciphertext + ciphertext_len,
378 &len)))
379 goto err;
380
381 ciphertext_len += len;
382
383 if (!TEST_true(EVP_OpenInit(ctx, type, kek, kek_len, iv, keypair))
384 || !TEST_true(EVP_OpenUpdate(ctx, plaintext, &plaintext_len,
385 ciphertext, ciphertext_len))
386 || !TEST_true(EVP_OpenFinal(ctx, plaintext + plaintext_len, &len)))
387 goto err;
388
389 plaintext_len += len;
390 if (!TEST_mem_eq(msg, sizeof(msg), plaintext, plaintext_len))
391 goto err;
392
393 ret = 1;
394 err:
395 OPENSSL_free(kek);
396 EVP_PKEY_free(keypair);
397 EVP_CIPHER_CTX_free(ctx);
398 return ret;
399 }
400
401
358402 static int test_EVP_DigestSignInit(void)
359403 {
360404 int ret = 0;
780824 {
781825 ADD_TEST(test_EVP_DigestSignInit);
782826 ADD_TEST(test_EVP_DigestVerifyInit);
827 ADD_TEST(test_EVP_Enveloped);
783828 ADD_ALL_TESTS(test_d2i_AutoPrivateKey, OSSL_NELEM(keydata));
784829 #ifndef OPENSSL_NO_EC
785830 ADD_TEST(test_EVP_PKCS82PKEY);