Test PKCS#1 v1.5 padding as well.
authorUlf Möller <ulf@openssl.org>
Fri, 9 Apr 1999 16:26:37 +0000 (16:26 +0000)
committerUlf Möller <ulf@openssl.org>
Fri, 9 Apr 1999 16:26:37 +0000 (16:26 +0000)
crypto/rsa/rsa_oaep_test.c
rsaref/rsaref.c

index 57e10e9a08be590adf6e1c6f282e53d85d69c826..c18fd98b3a91442b31ff038a7a2ccdefad99856f 100644 (file)
@@ -1,8 +1,10 @@
 /* test vectors from p1ovect1.txt */
 
 #include <stdio.h>
+#include <string.h>
 #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++)
@@ -217,11 +223,37 @@ int main()
        break;
        }
 
+       num = RSA_public_encrypt(plen, ptext_ex, ctext, key,
+                                RSA_PKCS1_PADDING);
+       if (num != clen)
+           {
+           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("Encryption failed!\n");
+           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);
        }
index 90cda4687b47a654e490aa5676780cedb7e2a3ef..84486dd1b5f6c224c95329019e3668c4e3694b79 100644 (file)
@@ -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)