diff options
Diffstat (limited to 'src/crypto/rsa/rsa_test.cc')
-rw-r--r-- | src/crypto/rsa/rsa_test.cc | 73 |
1 files changed, 33 insertions, 40 deletions
diff --git a/src/crypto/rsa/rsa_test.cc b/src/crypto/rsa/rsa_test.cc index 57b360c..d52b78b 100644 --- a/src/crypto/rsa/rsa_test.cc +++ b/src/crypto/rsa/rsa_test.cc @@ -498,7 +498,7 @@ static const uint8_t kEstonianRSAKey[] = { static bool TestRSA(const uint8_t *der, size_t der_len, const uint8_t *oaep_ciphertext, size_t oaep_ciphertext_len) { - ScopedRSA key(RSA_private_key_from_bytes(der, der_len)); + ScopedRSA key(d2i_RSAPrivateKey(nullptr, &der, der_len)); if (!key) { return false; } @@ -510,48 +510,43 @@ static bool TestRSA(const uint8_t *der, size_t der_len, uint8_t ciphertext[256]; - size_t ciphertext_len = 0; - if (!RSA_encrypt(key.get(), &ciphertext_len, ciphertext, sizeof(ciphertext), - kPlaintext, kPlaintextLen, RSA_PKCS1_PADDING) || - ciphertext_len != RSA_size(key.get())) { + int num = RSA_public_encrypt(kPlaintextLen, kPlaintext, ciphertext, key.get(), + RSA_PKCS1_PADDING); + if (num < 0 || (size_t)num != RSA_size(key.get())) { fprintf(stderr, "PKCS#1 v1.5 encryption failed!\n"); return false; } uint8_t plaintext[256]; - size_t plaintext_len = 0; - if (!RSA_decrypt(key.get(), &plaintext_len, plaintext, sizeof(plaintext), - ciphertext, ciphertext_len, RSA_PKCS1_PADDING) || - plaintext_len != kPlaintextLen || - memcmp(plaintext, kPlaintext, plaintext_len) != 0) { + num = RSA_private_decrypt(num, ciphertext, plaintext, key.get(), + RSA_PKCS1_PADDING); + if (num < 0 || + (size_t)num != kPlaintextLen || memcmp(plaintext, kPlaintext, num) != 0) { fprintf(stderr, "PKCS#1 v1.5 decryption failed!\n"); return false; } - ciphertext_len = 0; - if (!RSA_encrypt(key.get(), &ciphertext_len, ciphertext, sizeof(ciphertext), - kPlaintext, kPlaintextLen, RSA_PKCS1_OAEP_PADDING) || - ciphertext_len != RSA_size(key.get())) { + num = RSA_public_encrypt(kPlaintextLen, kPlaintext, ciphertext, key.get(), + RSA_PKCS1_OAEP_PADDING); + if (num < 0 || (size_t)num != RSA_size(key.get())) { fprintf(stderr, "OAEP encryption failed!\n"); return false; } - plaintext_len = 0; - if (!RSA_decrypt(key.get(), &plaintext_len, plaintext, sizeof(plaintext), - ciphertext, ciphertext_len, RSA_PKCS1_OAEP_PADDING) || - plaintext_len != kPlaintextLen || - memcmp(plaintext, kPlaintext, plaintext_len) != 0) { + num = RSA_private_decrypt(num, ciphertext, plaintext, key.get(), + RSA_PKCS1_OAEP_PADDING); + if (num < 0 || + (size_t)num != kPlaintextLen || memcmp(plaintext, kPlaintext, num) != 0) { fprintf(stderr, "OAEP decryption (encrypted data) failed!\n"); return false; } // |oaep_ciphertext| should decrypt to |kPlaintext|. - plaintext_len = 0; - if (!RSA_decrypt(key.get(), &plaintext_len, plaintext, sizeof(plaintext), - oaep_ciphertext, oaep_ciphertext_len, - RSA_PKCS1_OAEP_PADDING) || - plaintext_len != kPlaintextLen || - memcmp(plaintext, kPlaintext, plaintext_len) != 0) { + num = RSA_private_decrypt(oaep_ciphertext_len, oaep_ciphertext, plaintext, + key.get(), RSA_PKCS1_OAEP_PADDING); + + if (num < 0 || + (size_t)num != kPlaintextLen || memcmp(plaintext, kPlaintext, num) != 0) { fprintf(stderr, "OAEP decryption (test vector data) failed!\n"); return false; } @@ -559,22 +554,20 @@ static bool TestRSA(const uint8_t *der, size_t der_len, // Try decrypting corrupted ciphertexts. memcpy(ciphertext, oaep_ciphertext, oaep_ciphertext_len); for (size_t i = 0; i < oaep_ciphertext_len; i++) { - ciphertext[i] ^= 1; - if (RSA_decrypt(key.get(), &plaintext_len, plaintext, sizeof(plaintext), - ciphertext, oaep_ciphertext_len, RSA_PKCS1_OAEP_PADDING)) { - fprintf(stderr, "Corrupt data decrypted!\n"); - return false; - } - ciphertext[i] ^= 1; - } - - // Test truncated ciphertexts. - for (size_t len = 0; len < oaep_ciphertext_len; len++) { - if (RSA_decrypt(key.get(), &plaintext_len, plaintext, sizeof(plaintext), - ciphertext, len, RSA_PKCS1_OAEP_PADDING)) { - fprintf(stderr, "Corrupt data decrypted!\n"); - return false; + uint8_t saved = ciphertext[i]; + for (unsigned b = 0; b < 256; b++) { + if (b == saved) { + continue; + } + ciphertext[i] = b; + num = RSA_private_decrypt(num, ciphertext, plaintext, key.get(), + RSA_PKCS1_OAEP_PADDING); + if (num > 0) { + fprintf(stderr, "Corrupt data decrypted!\n"); + return false; + } } + ciphertext[i] = saved; } return true; |