diff --git a/crypto/rsa/rsa_oaep_test.c b/crypto/rsa/rsa_oaep_test.c index 57e10e9a08..c18fd98b3a 100644 --- a/crypto/rsa/rsa_oaep_test.c +++ b/crypto/rsa/rsa_oaep_test.c @@ -1,8 +1,10 @@ /* test vectors from p1ovect1.txt */ #include +#include #include "e_os.h" #include "rsa.h" +#include "err.h" #define SetKey \ key->n = BN_bin2bn(n, sizeof(n)-1, key->n); \ @@ -182,6 +184,15 @@ int key3(RSA *key, unsigned char *c) SetKey; } +int pad_unknown() +{ + unsigned long l; + while ((l = ERR_get_error()) != 0) + if (ERR_GET_REASON(l) == RSA_R_UNKNOWN_PADDING_TYPE) + return(1); + return(0); +} + int main() { int err=0; @@ -195,11 +206,6 @@ int main() int clen = 0; int num; -#ifdef RSAref - printf("No OAEP support with RSAref - skipping test\n"); - return 0; -#endif - plen = sizeof(ptext_ex) - 1; for (v = 0; v < 3; v++) @@ -218,10 +224,36 @@ int main() } num = RSA_public_encrypt(plen, ptext_ex, ctext, key, - RSA_PKCS1_OAEP_PADDING); + RSA_PKCS1_PADDING); if (num != clen) { - printf("Encryption failed!\n"); + printf("PKCS#1 v1.5 encryption failed!\n"); + err=1; + goto oaep; + } + + num = RSA_private_decrypt(num, ctext, ptext, key, + RSA_PKCS1_PADDING); + if (num != plen || memcmp(ptext, ptext_ex, num) != 0) + { + printf("PKCS#1 v1.5 decryption failed!\n"); + err=1; + } + else + printf("PKCS #1 v1.5 encryption/decryption ok\n"); + + oaep: + ERR_clear_error(); + num = RSA_public_encrypt(plen, ptext_ex, ctext, key, + RSA_PKCS1_OAEP_PADDING); + if (num == -1 && pad_unknown()) + { + printf("No OAEP support\n"); + goto next; + } + if (num != clen) + { + printf("OAEP encryption failed!\n"); err=1; goto next; } @@ -230,14 +262,14 @@ int main() RSA_PKCS1_OAEP_PADDING); if (num != plen || memcmp(ptext, ptext_ex, num) != 0) { - printf("Decryption failed!\n"); + printf("OAEP decryption failed!\n"); err=1; goto next; } if (memcmp(ctext, ctext_ex, num) == 0) { - printf("Vector %d passed!\n", v); + printf("OAEP test vector %d passed!\n", v); goto next; } @@ -249,12 +281,11 @@ int main() if (num != plen || memcmp(ptext, ptext_ex, num) != 0) { - printf("Decryption failed!\n"); + printf("OAEP decryption (test vector data) failed!\n"); err=1; } else - printf("Encryption/decryption successful!\n"); - + printf("OAEP encryption/decryption ok\n"); next: RSA_free(key); } diff --git a/rsaref/rsaref.c b/rsaref/rsaref.c index 90cda4687b..84486dd1b5 100644 --- a/rsaref/rsaref.c +++ b/rsaref/rsaref.c @@ -283,6 +283,11 @@ int padding; int i,outlen= -1; RSArefPrivateKey RSAkey; + if (padding != RSA_PKCS1_PADDING) + { + RSAREFerr(RSAREF_F_RSA_REF_PRIVATE_ENCRYPT, RSA_R_UNKNOWN_PADDING_TYPE); + goto err; + } if (!RSAref_Private_eay2ref(rsa,&RSAkey)) goto err; if ((i=RSAPrivateEncrypt(to,&outlen,from,len,&RSAkey)) != 0) @@ -328,9 +333,12 @@ int padding; RSARandomState rnd; unsigned char buf[16]; - if (padding == RSA_PKCS1_OAEP_PADDING) + if (padding != RSA_PKCS1_PADDING && padding != RSA_SSLV23_PADDING) + { + RSAREFerr(RSAREF_F_RSA_REF_PUBLIC_ENCRYPT, RSA_R_UNKNOWN_PADDING_TYPE); goto err; - + } + R_RandomInit(&rnd); R_GetRandomBytesNeeded((unsigned int *)&i,&rnd); while (i > 0)