Remove the dual-callback scheme for numeric and pointer thread IDs,
[openssl.git] / crypto / rsa / rsa_test.c
index 2c0a1d5c4a6dcd315702dedb36f5dade86bbc519..c8705a0f6e59939ad51415face76c0f49f5ea33a 100644 (file)
@@ -8,6 +8,7 @@
 #include <openssl/crypto.h>
 #include <openssl/err.h>
 #include <openssl/rand.h>
+#include <openssl/bn.h>
 #ifdef OPENSSL_NO_RSA
 int main(int argc, char *argv[])
 {
@@ -218,19 +219,20 @@ int main(int argc, char *argv[])
     int plen;
     int clen = 0;
     int num;
-
-    RAND_seed(rnd_seed, sizeof rnd_seed); /* or OAEP may fail */
+    int n;
 
     CRYPTO_malloc_debug_init();
     CRYPTO_dbg_set_options(V_CRYPTO_MDEBUG_ALL);
     CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON);
-       
+
+    RAND_seed(rnd_seed, sizeof rnd_seed); /* or OAEP may fail */
+
     plen = sizeof(ptext_ex) - 1;
 
-    for (v = 0; v < 3; v++)
+    for (v = 0; v < 6; v++)
        {
        key = RSA_new();
-       switch (v) {
+       switch (v%3) {
     case 0:
        clen = key1(key, ctext_ex);
        break;
@@ -241,6 +243,7 @@ int main(int argc, char *argv[])
        clen = key3(key, ctext_ex);
        break;
        }
+       if (v/3 >= 1) key->flags |= RSA_FLAG_NO_CONSTTIME;
 
        num = RSA_public_encrypt(plen, ptext_ex, ctext, key,
                                 RSA_PKCS1_PADDING);
@@ -276,7 +279,7 @@ int main(int argc, char *argv[])
            err=1;
            goto next;
            }
-  
+
        num = RSA_private_decrypt(num, ctext, ptext, key,
                                  RSA_PKCS1_OAEP_PADDING);
        if (num != plen || memcmp(ptext, ptext_ex, num) != 0)
@@ -285,10 +288,7 @@ int main(int argc, char *argv[])
            err=1;
            }
        else if (memcmp(ctext, ctext_ex, num) == 0)
-           {
            printf("OAEP test vector %d passed!\n", v);
-           goto next;
-           }
     
        /* Different ciphertexts (rsa_oaep.c without -DPKCS_TESTVECT).
           Try decrypting ctext_ex */
@@ -303,14 +303,38 @@ int main(int argc, char *argv[])
            }
        else
            printf("OAEP encryption/decryption ok\n");
+
+       /* Try decrypting corrupted ciphertexts */
+       for(n = 0 ; n < clen ; ++n)
+           {
+           int b;
+           unsigned char saved = ctext[n];
+           for(b = 0 ; b < 256 ; ++b)
+               {
+               if(b == saved)
+                   continue;
+               ctext[n] = b;
+               num = RSA_private_decrypt(num, ctext, ptext, key,
+                                         RSA_PKCS1_OAEP_PADDING);
+               if(num > 0)
+                   {
+                   printf("Corrupt data decrypted!\n");
+                   err = 1;
+                   }
+               }
+           }
     next:
        RSA_free(key);
        }
 
-    ERR_remove_state(0);
+    CRYPTO_cleanup_all_ex_data();
+    ERR_remove_thread_state(NULL);
 
-    CRYPTO_mem_leaks_fp(stdout);
+    CRYPTO_mem_leaks_fp(stderr);
 
+#ifdef OPENSSL_SYS_NETWARE
+    if (err) printf("ERROR: %d\n", err);
+#endif
     return err;
     }
 #endif