Home | History | Annotate | Line # | Download | only in test
rsa_test.c revision 1.1
      1 /*
      2  * Copyright 1999-2023 The OpenSSL Project Authors. All Rights Reserved.
      3  *
      4  * Licensed under the Apache License 2.0 (the "License").  You may not use
      5  * this file except in compliance with the License.  You can obtain a copy
      6  * in the file LICENSE in the source distribution or at
      7  * https://www.openssl.org/source/license.html
      8  */
      9 
     10 /* test vectors from p1ovect1.txt */
     11 
     12 /*
     13  * RSA low level APIs are deprecated for public use, but still ok for
     14  * internal use.
     15  */
     16 #include "internal/deprecated.h"
     17 
     18 #include <stdio.h>
     19 #include <string.h>
     20 
     21 #include "internal/nelem.h"
     22 
     23 #include <openssl/crypto.h>
     24 #include <openssl/err.h>
     25 #include <openssl/rand.h>
     26 #include <openssl/bn.h>
     27 
     28 #include "testutil.h"
     29 
     30 #include <openssl/rsa.h>
     31 
     32 #define SetKey \
     33     RSA_set0_key(key,                                           \
     34                  BN_bin2bn(n, sizeof(n)-1, NULL),               \
     35                  BN_bin2bn(e, sizeof(e)-1, NULL),               \
     36                  BN_bin2bn(d, sizeof(d)-1, NULL));              \
     37     RSA_set0_factors(key,                                       \
     38                      BN_bin2bn(p, sizeof(p)-1, NULL),           \
     39                      BN_bin2bn(q, sizeof(q)-1, NULL));          \
     40     RSA_set0_crt_params(key,                                    \
     41                         BN_bin2bn(dmp1, sizeof(dmp1)-1, NULL),  \
     42                         BN_bin2bn(dmq1, sizeof(dmq1)-1, NULL),  \
     43                         BN_bin2bn(iqmp, sizeof(iqmp)-1, NULL)); \
     44     if (c != NULL)                                              \
     45         memcpy(c, ctext_ex, sizeof(ctext_ex) - 1);              \
     46     return sizeof(ctext_ex) - 1;
     47 
     48 static int key1(RSA *key, unsigned char *c)
     49 {
     50     static unsigned char n[] =
     51         "\x00\xAA\x36\xAB\xCE\x88\xAC\xFD\xFF\x55\x52\x3C\x7F\xC4\x52\x3F"
     52         "\x90\xEF\xA0\x0D\xF3\x77\x4A\x25\x9F\x2E\x62\xB4\xC5\xD9\x9C\xB5"
     53         "\xAD\xB3\x00\xA0\x28\x5E\x53\x01\x93\x0E\x0C\x70\xFB\x68\x76\x93"
     54         "\x9C\xE6\x16\xCE\x62\x4A\x11\xE0\x08\x6D\x34\x1E\xBC\xAC\xA0\xA1"
     55         "\xF5";
     56 
     57     static unsigned char e[] = "\x11";
     58 
     59     static unsigned char d[] =
     60         "\x0A\x03\x37\x48\x62\x64\x87\x69\x5F\x5F\x30\xBC\x38\xB9\x8B\x44"
     61         "\xC2\xCD\x2D\xFF\x43\x40\x98\xCD\x20\xD8\xA1\x38\xD0\x90\xBF\x64"
     62         "\x79\x7C\x3F\xA7\xA2\xCD\xCB\x3C\xD1\xE0\xBD\xBA\x26\x54\xB4\xF9"
     63         "\xDF\x8E\x8A\xE5\x9D\x73\x3D\x9F\x33\xB3\x01\x62\x4A\xFD\x1D\x51";
     64 
     65     static unsigned char p[] =
     66         "\x00\xD8\x40\xB4\x16\x66\xB4\x2E\x92\xEA\x0D\xA3\xB4\x32\x04\xB5"
     67         "\xCF\xCE\x33\x52\x52\x4D\x04\x16\xA5\xA4\x41\xE7\x00\xAF\x46\x12"
     68         "\x0D";
     69 
     70     static unsigned char q[] =
     71         "\x00\xC9\x7F\xB1\xF0\x27\xF4\x53\xF6\x34\x12\x33\xEA\xAA\xD1\xD9"
     72         "\x35\x3F\x6C\x42\xD0\x88\x66\xB1\xD0\x5A\x0F\x20\x35\x02\x8B\x9D"
     73         "\x89";
     74 
     75     static unsigned char dmp1[] =
     76         "\x59\x0B\x95\x72\xA2\xC2\xA9\xC4\x06\x05\x9D\xC2\xAB\x2F\x1D\xAF"
     77         "\xEB\x7E\x8B\x4F\x10\xA7\x54\x9E\x8E\xED\xF5\xB4\xFC\xE0\x9E\x05";
     78 
     79     static unsigned char dmq1[] =
     80         "\x00\x8E\x3C\x05\x21\xFE\x15\xE0\xEA\x06\xA3\x6F\xF0\xF1\x0C\x99"
     81         "\x52\xC3\x5B\x7A\x75\x14\xFD\x32\x38\xB8\x0A\xAD\x52\x98\x62\x8D"
     82         "\x51";
     83 
     84     static unsigned char iqmp[] =
     85         "\x36\x3F\xF7\x18\x9D\xA8\xE9\x0B\x1D\x34\x1F\x71\xD0\x9B\x76\xA8"
     86         "\xA9\x43\xE1\x1D\x10\xB2\x4D\x24\x9F\x2D\xEA\xFE\xF8\x0C\x18\x26";
     87 
     88     static unsigned char ctext_ex[] =
     89         "\x1b\x8f\x05\xf9\xca\x1a\x79\x52\x6e\x53\xf3\xcc\x51\x4f\xdb\x89"
     90         "\x2b\xfb\x91\x93\x23\x1e\x78\xb9\x92\xe6\x8d\x50\xa4\x80\xcb\x52"
     91         "\x33\x89\x5c\x74\x95\x8d\x5d\x02\xab\x8c\x0f\xd0\x40\xeb\x58\x44"
     92         "\xb0\x05\xc3\x9e\xd8\x27\x4a\x9d\xbf\xa8\x06\x71\x40\x94\x39\xd2";
     93 
     94     SetKey;
     95 }
     96 
     97 static int key2(RSA *key, unsigned char *c)
     98 {
     99     static unsigned char n[] =
    100         "\x00\xA3\x07\x9A\x90\xDF\x0D\xFD\x72\xAC\x09\x0C\xCC\x2A\x78\xB8"
    101         "\x74\x13\x13\x3E\x40\x75\x9C\x98\xFA\xF8\x20\x4F\x35\x8A\x0B\x26"
    102         "\x3C\x67\x70\xE7\x83\xA9\x3B\x69\x71\xB7\x37\x79\xD2\x71\x7B\xE8"
    103         "\x34\x77\xCF";
    104 
    105     static unsigned char e[] = "\x3";
    106 
    107     static unsigned char d[] =
    108         "\x6C\xAF\xBC\x60\x94\xB3\xFE\x4C\x72\xB0\xB3\x32\xC6\xFB\x25\xA2"
    109         "\xB7\x62\x29\x80\x4E\x68\x65\xFC\xA4\x5A\x74\xDF\x0F\x8F\xB8\x41"
    110         "\x3B\x52\xC0\xD0\xE5\x3D\x9B\x59\x0F\xF1\x9B\xE7\x9F\x49\xDD\x21"
    111         "\xE5\xEB";
    112 
    113     static unsigned char p[] =
    114         "\x00\xCF\x20\x35\x02\x8B\x9D\x86\x98\x40\xB4\x16\x66\xB4\x2E\x92"
    115         "\xEA\x0D\xA3\xB4\x32\x04\xB5\xCF\xCE\x91";
    116 
    117     static unsigned char q[] =
    118         "\x00\xC9\x7F\xB1\xF0\x27\xF4\x53\xF6\x34\x12\x33\xEA\xAA\xD1\xD9"
    119         "\x35\x3F\x6C\x42\xD0\x88\x66\xB1\xD0\x5F";
    120 
    121     static unsigned char dmp1[] =
    122         "\x00\x8A\x15\x78\xAC\x5D\x13\xAF\x10\x2B\x22\xB9\x99\xCD\x74\x61"
    123         "\xF1\x5E\x6D\x22\xCC\x03\x23\xDF\xDF\x0B";
    124 
    125     static unsigned char dmq1[] =
    126         "\x00\x86\x55\x21\x4A\xC5\x4D\x8D\x4E\xCD\x61\x77\xF1\xC7\x36\x90"
    127         "\xCE\x2A\x48\x2C\x8B\x05\x99\xCB\xE0\x3F";
    128 
    129     static unsigned char iqmp[] =
    130         "\x00\x83\xEF\xEF\xB8\xA9\xA4\x0D\x1D\xB6\xED\x98\xAD\x84\xED\x13"
    131         "\x35\xDC\xC1\x08\xF3\x22\xD0\x57\xCF\x8D";
    132 
    133     static unsigned char ctext_ex[] =
    134         "\x14\xbd\xdd\x28\xc9\x83\x35\x19\x23\x80\xe8\xe5\x49\xb1\x58\x2a"
    135         "\x8b\x40\xb4\x48\x6d\x03\xa6\xa5\x31\x1f\x1f\xd5\xf0\xa1\x80\xe4"
    136         "\x17\x53\x03\x29\xa9\x34\x90\x74\xb1\x52\x13\x54\x29\x08\x24\x52"
    137         "\x62\x51";
    138 
    139     SetKey;
    140 }
    141 
    142 static int key3(RSA *key, unsigned char *c)
    143 {
    144     static unsigned char n[] =
    145         "\x00\xBB\xF8\x2F\x09\x06\x82\xCE\x9C\x23\x38\xAC\x2B\x9D\xA8\x71"
    146         "\xF7\x36\x8D\x07\xEE\xD4\x10\x43\xA4\x40\xD6\xB6\xF0\x74\x54\xF5"
    147         "\x1F\xB8\xDF\xBA\xAF\x03\x5C\x02\xAB\x61\xEA\x48\xCE\xEB\x6F\xCD"
    148         "\x48\x76\xED\x52\x0D\x60\xE1\xEC\x46\x19\x71\x9D\x8A\x5B\x8B\x80"
    149         "\x7F\xAF\xB8\xE0\xA3\xDF\xC7\x37\x72\x3E\xE6\xB4\xB7\xD9\x3A\x25"
    150         "\x84\xEE\x6A\x64\x9D\x06\x09\x53\x74\x88\x34\xB2\x45\x45\x98\x39"
    151         "\x4E\xE0\xAA\xB1\x2D\x7B\x61\xA5\x1F\x52\x7A\x9A\x41\xF6\xC1\x68"
    152         "\x7F\xE2\x53\x72\x98\xCA\x2A\x8F\x59\x46\xF8\xE5\xFD\x09\x1D\xBD"
    153         "\xCB";
    154 
    155     static unsigned char e[] = "\x11";
    156 
    157     static unsigned char d[] =
    158         "\x00\xA5\xDA\xFC\x53\x41\xFA\xF2\x89\xC4\xB9\x88\xDB\x30\xC1\xCD"
    159         "\xF8\x3F\x31\x25\x1E\x06\x68\xB4\x27\x84\x81\x38\x01\x57\x96\x41"
    160         "\xB2\x94\x10\xB3\xC7\x99\x8D\x6B\xC4\x65\x74\x5E\x5C\x39\x26\x69"
    161         "\xD6\x87\x0D\xA2\xC0\x82\xA9\x39\xE3\x7F\xDC\xB8\x2E\xC9\x3E\xDA"
    162         "\xC9\x7F\xF3\xAD\x59\x50\xAC\xCF\xBC\x11\x1C\x76\xF1\xA9\x52\x94"
    163         "\x44\xE5\x6A\xAF\x68\xC5\x6C\x09\x2C\xD3\x8D\xC3\xBE\xF5\xD2\x0A"
    164         "\x93\x99\x26\xED\x4F\x74\xA1\x3E\xDD\xFB\xE1\xA1\xCE\xCC\x48\x94"
    165         "\xAF\x94\x28\xC2\xB7\xB8\x88\x3F\xE4\x46\x3A\x4B\xC8\x5B\x1C\xB3"
    166         "\xC1";
    167 
    168     static unsigned char p[] =
    169         "\x00\xEE\xCF\xAE\x81\xB1\xB9\xB3\xC9\x08\x81\x0B\x10\xA1\xB5\x60"
    170         "\x01\x99\xEB\x9F\x44\xAE\xF4\xFD\xA4\x93\xB8\x1A\x9E\x3D\x84\xF6"
    171         "\x32\x12\x4E\xF0\x23\x6E\x5D\x1E\x3B\x7E\x28\xFA\xE7\xAA\x04\x0A"
    172         "\x2D\x5B\x25\x21\x76\x45\x9D\x1F\x39\x75\x41\xBA\x2A\x58\xFB\x65"
    173         "\x99";
    174 
    175     static unsigned char q[] =
    176         "\x00\xC9\x7F\xB1\xF0\x27\xF4\x53\xF6\x34\x12\x33\xEA\xAA\xD1\xD9"
    177         "\x35\x3F\x6C\x42\xD0\x88\x66\xB1\xD0\x5A\x0F\x20\x35\x02\x8B\x9D"
    178         "\x86\x98\x40\xB4\x16\x66\xB4\x2E\x92\xEA\x0D\xA3\xB4\x32\x04\xB5"
    179         "\xCF\xCE\x33\x52\x52\x4D\x04\x16\xA5\xA4\x41\xE7\x00\xAF\x46\x15"
    180         "\x03";
    181 
    182     static unsigned char dmp1[] =
    183         "\x54\x49\x4C\xA6\x3E\xBA\x03\x37\xE4\xE2\x40\x23\xFC\xD6\x9A\x5A"
    184         "\xEB\x07\xDD\xDC\x01\x83\xA4\xD0\xAC\x9B\x54\xB0\x51\xF2\xB1\x3E"
    185         "\xD9\x49\x09\x75\xEA\xB7\x74\x14\xFF\x59\xC1\xF7\x69\x2E\x9A\x2E"
    186         "\x20\x2B\x38\xFC\x91\x0A\x47\x41\x74\xAD\xC9\x3C\x1F\x67\xC9\x81";
    187 
    188     static unsigned char dmq1[] =
    189         "\x47\x1E\x02\x90\xFF\x0A\xF0\x75\x03\x51\xB7\xF8\x78\x86\x4C\xA9"
    190         "\x61\xAD\xBD\x3A\x8A\x7E\x99\x1C\x5C\x05\x56\xA9\x4C\x31\x46\xA7"
    191         "\xF9\x80\x3F\x8F\x6F\x8A\xE3\x42\xE9\x31\xFD\x8A\xE4\x7A\x22\x0D"
    192         "\x1B\x99\xA4\x95\x84\x98\x07\xFE\x39\xF9\x24\x5A\x98\x36\xDA\x3D";
    193 
    194     static unsigned char iqmp[] =
    195         "\x00\xB0\x6C\x4F\xDA\xBB\x63\x01\x19\x8D\x26\x5B\xDB\xAE\x94\x23"
    196         "\xB3\x80\xF2\x71\xF7\x34\x53\x88\x50\x93\x07\x7F\xCD\x39\xE2\x11"
    197         "\x9F\xC9\x86\x32\x15\x4F\x58\x83\xB1\x67\xA9\x67\xBF\x40\x2B\x4E"
    198         "\x9E\x2E\x0F\x96\x56\xE6\x98\xEA\x36\x66\xED\xFB\x25\x79\x80\x39"
    199         "\xF7";
    200 
    201     static unsigned char ctext_ex[] =
    202         "\xb8\x24\x6b\x56\xa6\xed\x58\x81\xae\xb5\x85\xd9\xa2\x5b\x2a\xd7"
    203         "\x90\xc4\x17\xe0\x80\x68\x1b\xf1\xac\x2b\xc3\xde\xb6\x9d\x8b\xce"
    204         "\xf0\xc4\x36\x6f\xec\x40\x0a\xf0\x52\xa7\x2e\x9b\x0e\xff\xb5\xb3"
    205         "\xf2\xf1\x92\xdb\xea\xca\x03\xc1\x27\x40\x05\x71\x13\xbf\x1f\x06"
    206         "\x69\xac\x22\xe9\xf3\xa7\x85\x2e\x3c\x15\xd9\x13\xca\xb0\xb8\x86"
    207         "\x3a\x95\xc9\x92\x94\xce\x86\x74\x21\x49\x54\x61\x03\x46\xf4\xd4"
    208         "\x74\xb2\x6f\x7c\x48\xb4\x2e\xe6\x8e\x1f\x57\x2a\x1f\xc4\x02\x6a"
    209         "\xc4\x56\xb4\xf5\x9f\x7b\x62\x1e\xa1\xb9\xd8\x8f\x64\x20\x2f\xb1";
    210 
    211     SetKey;
    212 }
    213 
    214 static int rsa_setkey(RSA** key, unsigned char *ctext, int idx)
    215 {
    216     int clen = 0;
    217 
    218     *key = RSA_new();
    219     if (*key != NULL)
    220         switch (idx) {
    221         case 0:
    222             clen = key1(*key, ctext);
    223             break;
    224         case 1:
    225             clen = key2(*key, ctext);
    226             break;
    227         case 2:
    228             clen = key3(*key, ctext);
    229             break;
    230         }
    231     return clen;
    232 }
    233 
    234 static int test_rsa_simple(int idx, int en_pad_type, int de_pad_type,
    235                            int success, unsigned char *ctext_ex, int *clen,
    236                            RSA **retkey)
    237 {
    238     int ret = 0;
    239     RSA *key;
    240     unsigned char ptext[256];
    241     unsigned char ctext[256];
    242     static unsigned char ptext_ex[] = "\x54\x85\x9b\x34\x2c\x49\xea\x2a";
    243     int plen;
    244     int clentmp = 0;
    245     int num;
    246 
    247     plen = sizeof(ptext_ex) - 1;
    248     clentmp = rsa_setkey(&key, ctext_ex, idx);
    249     if (clen != NULL)
    250         *clen = clentmp;
    251 
    252     num = RSA_public_encrypt(plen, ptext_ex, ctext, key, en_pad_type);
    253     if (!TEST_int_eq(num, clentmp))
    254         goto err;
    255 
    256     num = RSA_private_decrypt(num, ctext, ptext, key, de_pad_type);
    257     if (success) {
    258         if (!TEST_int_gt(num, 0) || !TEST_mem_eq(ptext, num, ptext_ex, plen))
    259             goto err;
    260     } else {
    261         if (!TEST_int_lt(num, 0))
    262             goto err;
    263     }
    264 
    265     ret = 1;
    266     if (retkey != NULL) {
    267         *retkey = key;
    268         key = NULL;
    269     }
    270 err:
    271     RSA_free(key);
    272     return ret;
    273 }
    274 
    275 static int test_rsa_pkcs1(int idx)
    276 {
    277     return test_rsa_simple(idx, RSA_PKCS1_PADDING, RSA_PKCS1_PADDING, 1, NULL,
    278                            NULL, NULL);
    279 }
    280 
    281 static int test_rsa_oaep(int idx)
    282 {
    283     int ret = 0;
    284     RSA *key = NULL;
    285     unsigned char ptext[256];
    286     static unsigned char ptext_ex[] = "\x54\x85\x9b\x34\x2c\x49\xea\x2a";
    287     unsigned char ctext_ex[256];
    288     int plen;
    289     int clen = 0;
    290     int num;
    291     int n;
    292 
    293     if (!test_rsa_simple(idx, RSA_PKCS1_OAEP_PADDING, RSA_PKCS1_OAEP_PADDING, 1,
    294                          ctext_ex, &clen, &key))
    295         goto err;
    296 
    297     plen = sizeof(ptext_ex) - 1;
    298 
    299     /* Different ciphertexts. Try decrypting ctext_ex */
    300     num = RSA_private_decrypt(clen, ctext_ex, ptext, key,
    301                               RSA_PKCS1_OAEP_PADDING);
    302     if (num <= 0 || !TEST_mem_eq(ptext, num, ptext_ex, plen))
    303         goto err;
    304 
    305     /* Try decrypting corrupted ciphertexts. */
    306     for (n = 0; n < clen; ++n) {
    307         ctext_ex[n] ^= 1;
    308         num = RSA_private_decrypt(clen, ctext_ex, ptext, key,
    309                                       RSA_PKCS1_OAEP_PADDING);
    310         if (!TEST_int_le(num, 0))
    311             goto err;
    312         ctext_ex[n] ^= 1;
    313     }
    314 
    315     /* Test truncated ciphertexts, as well as negative length. */
    316     for (n = -1; n < clen; ++n) {
    317         num = RSA_private_decrypt(n, ctext_ex, ptext, key,
    318                                   RSA_PKCS1_OAEP_PADDING);
    319         if (!TEST_int_le(num, 0))
    320             goto err;
    321     }
    322 
    323     ret = 1;
    324 err:
    325     RSA_free(key);
    326     return ret;
    327 }
    328 
    329 static const struct {
    330     int bits;
    331     unsigned int r;
    332 } rsa_security_bits_cases[] = {
    333     /* NIST SP 800-56B rev 2 (draft) Appendix D Table 5 */
    334     { 2048,     112 },
    335     { 3072,     128 },
    336     { 4096,     152 },
    337     { 6144,     176 },
    338     { 8192,     200 },
    339     /* NIST FIPS 140-2 IG 7.5 */
    340     { 7680,     192 },
    341     { 15360,    256 },
    342     /* Older values */
    343     { 256,      40  },
    344     { 512,      56  },
    345     { 1024,     80  },
    346     /* Some other values */
    347     { 8888,     208 },
    348     { 2468,     120 },
    349     { 13456,    248 },
    350     /* Edge points */
    351     { 15359,    256 },
    352     { 15361,    264 },
    353     { 7679,     192 },
    354     { 7681,     200 },
    355 };
    356 
    357 static int test_rsa_security_bit(int n)
    358 {
    359     static const unsigned char vals[8] = {
    360         0x80, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40
    361     };
    362     RSA *key = RSA_new();
    363     const int bits = rsa_security_bits_cases[n].bits;
    364     const int result = rsa_security_bits_cases[n].r;
    365     const int bytes = (bits + 7) / 8;
    366     int r = 0;
    367     unsigned char num[2000];
    368 
    369     if (!TEST_ptr(key) || !TEST_int_le(bytes, (int)sizeof(num)))
    370         goto err;
    371 
    372     /*
    373      * It is necessary to set the RSA key in order to ask for the strength.
    374      * A BN of an appropriate size is created, in general it won't have the
    375      * properties necessary for RSA to function.  This is okay here since
    376      * the RSA key is never used.
    377      */
    378     memset(num, vals[bits % 8], bytes);
    379 
    380     /*
    381      * The 'e' parameter is set to the same value as 'n'.  This saves having
    382      * an extra BN to hold a sensible value for 'e'.  This is safe since the
    383      * RSA key is not used.  The 'd' parameter can be NULL safely.
    384      */
    385     if (TEST_true(RSA_set0_key(key, BN_bin2bn(num, bytes, NULL),
    386                                BN_bin2bn(num, bytes, NULL), NULL))
    387             && TEST_uint_eq(RSA_security_bits(key), result))
    388         r = 1;
    389 err:
    390     RSA_free(key);
    391     return r;
    392 }
    393 
    394 static int test_EVP_rsa_legacy_key(void)
    395 {
    396     int ret;
    397     size_t buflen = 384;
    398     size_t msglen = 64;
    399     unsigned char sigbuf[384];
    400     unsigned char msgbuf[64];
    401     BIGNUM *p;
    402     BIGNUM *q;
    403     BIGNUM *n;
    404     BIGNUM *d;
    405     BIGNUM *e;
    406     RSA *rsa;
    407     const EVP_MD *md;
    408     EVP_MD_CTX *ctx = NULL;
    409     EVP_PKEY *pkey = NULL;
    410 
    411     unsigned char n_data[] = {
    412     0x00, 0xc7, 0x28, 0x7a, 0x28, 0x91, 0x51, 0xa5, 0xe8, 0x3c, 0x45, 0xcf,
    413     0x1d, 0xa9, 0x69, 0x7a, 0x0d, 0xdb, 0xdd, 0x8f, 0xe2, 0xde, 0x85, 0xdd,
    414     0x85, 0x6d, 0x8f, 0x78, 0x20, 0xd6, 0xe, 0xe5, 0x06, 0xcb, 0x9c, 0xd6,
    415     0xd3, 0xca, 0xef, 0x1d, 0x80, 0xd3, 0x18, 0x23, 0x91, 0x5c, 0xe5, 0xc8,
    416     0x44, 0x37, 0x56, 0x1b, 0x68, 0x7f, 0x08, 0xa3, 0x1c, 0xf6, 0xe8, 0x11,
    417     0x38, 0x0f, 0x2e, 0xad, 0xb1, 0x89, 0x8b, 0x08, 0xe8, 0x35, 0xaf, 0x3b,
    418     0xfe, 0x37, 0x8d, 0x21, 0xd5, 0x3f, 0x1f, 0x4b, 0x01, 0x30, 0xd8, 0xd0,
    419     0x24, 0xf7, 0xab, 0x57, 0xad, 0xac, 0xbc, 0x53, 0x6d, 0x84, 0x8e, 0xa1,
    420     0xb2, 0x5b, 0x8e, 0xe7, 0xb3, 0xac, 0xfc, 0x60, 0x22, 0x10, 0x1e, 0x99,
    421     0xfa, 0xa0, 0x60, 0x00, 0x69, 0x5f, 0x8e, 0xca, 0x6d, 0x9c, 0xee, 0x5e,
    422     0x84, 0x4e, 0x53, 0x83, 0x42, 0x76, 0x4d, 0xb8, 0xc1, 0xeb, 0x4e, 0x3d,
    423     0xc3, 0xce, 0xac, 0x79, 0xbb, 0x29, 0x5d, 0x92, 0x33, 0x6e, 0xcf, 0x8f,
    424     0x5a, 0xf0, 0xb3, 0xb5, 0xdc, 0xd5, 0xa3, 0xaf, 0x40, 0x4b, 0x0f, 0x05,
    425     0xac, 0x46, 0x53, 0x2d, 0x5f, 0x20, 0x96, 0x42, 0xa8, 0x47, 0x61, 0x54,
    426     0x05, 0x2c, 0x8a, 0x26, 0x5d, 0x92, 0x1d, 0x01, 0x2a, 0x27, 0x8a, 0xfc,
    427     0x64, 0x24, 0x5c, 0x34, 0xde, 0x92, 0xc6, 0x82, 0xea, 0x4d, 0xe2, 0x52,
    428     0xe5, 0xad, 0x62, 0x00, 0xc6, 0xc8, 0xe9, 0x0c, 0x22, 0xf0, 0x9e, 0xbe,
    429     0xdc, 0x51, 0x58, 0xad, 0x3b, 0xba, 0x2e, 0x45, 0x65, 0xcc, 0x5b, 0x55,
    430     0x46, 0x67, 0x18, 0x4a, 0x80, 0x67, 0x5b, 0x84, 0x7f, 0x13, 0x37, 0x45,
    431     0xd8, 0x03, 0xc6, 0x22, 0xc3, 0x4a, 0x46, 0x6b, 0xde, 0x50, 0xbf, 0x16,
    432     0x0a, 0x23, 0x0b, 0xaa, 0x50, 0x54, 0xf6, 0x20, 0x83, 0x74, 0x33, 0x97,
    433     0x2e, 0xf2, 0x8e, 0x7e, 0x13 };
    434 
    435     unsigned char e_data[]  = { 0x01, 0x00, 0x01 };
    436 
    437     unsigned char d_data[] = {
    438     0x09, 0x2d, 0xcb, 0xe7, 0x87, 0xbf, 0x10, 0x1a, 0xf2, 0x80, 0x33, 0x2a,
    439     0x06, 0x4f, 0x56, 0xb1, 0x41, 0xd3, 0x65, 0xd8, 0xca, 0x71, 0xb8, 0x02,
    440     0x78, 0xc8, 0xb6, 0x7c, 0x28, 0xf4, 0x6c, 0xe8, 0xd1, 0xc4, 0x92, 0x40,
    441     0x23, 0xa7, 0xbe, 0x9f, 0xdb, 0xda, 0xce, 0x74, 0xda, 0x27, 0xbb, 0x01,
    442     0xad, 0xdd, 0x39, 0x99, 0x28, 0xd5, 0xb0, 0x92, 0xda, 0xac, 0x5a, 0x72,
    443     0xcf, 0x7c, 0x52, 0xc4, 0x0e, 0x77, 0x4a, 0x7b, 0x4d, 0x52, 0x1c, 0xbd,
    444     0x3c, 0x39, 0x34, 0x78, 0x7c, 0x16, 0xc8, 0xa1, 0xae, 0xeb, 0x27, 0x38,
    445     0xb4, 0xf3, 0x80, 0x30, 0x80, 0x78, 0x13, 0x8e, 0x46, 0x20, 0x3e, 0xc2,
    446     0x96, 0x26, 0xb1, 0x76, 0x1e, 0x00, 0x69, 0xbb, 0xd8, 0x2b, 0x58, 0xe4,
    447     0x6c, 0xb4, 0xd0, 0x00, 0x0b, 0x47, 0xec, 0xfb, 0x7d, 0x52, 0x9d, 0x27,
    448     0x92, 0xe6, 0x95, 0x73, 0xa0, 0x39, 0x37, 0xcd, 0x1f, 0x60, 0x13, 0x1c,
    449     0x87, 0x9d, 0xa7, 0x91, 0x90, 0xf9, 0x36, 0xc5, 0xfa, 0x3f, 0xf9, 0x7f,
    450     0x50, 0xf8, 0xb3, 0x54, 0x65, 0xff, 0x6f, 0xa6, 0x22, 0xcc, 0x4a, 0x1e,
    451     0x49, 0x3f, 0x07, 0xc6, 0xf2, 0x65, 0x73, 0x13, 0x1b, 0x2d, 0xb6, 0x15,
    452     0xff, 0xcd, 0x9a, 0x1c, 0xea, 0xef, 0x58, 0x56, 0x91, 0x2d, 0x47, 0x81,
    453     0x56, 0x0d, 0xc3, 0xb0, 0x47, 0x58, 0x8d, 0x05, 0x7d, 0x5b, 0xc0, 0x22,
    454     0xa4, 0xf0, 0x2e, 0x70, 0x36, 0x01, 0x89, 0xa1, 0x71, 0xed, 0x76, 0xe9,
    455     0x8d, 0xf5, 0x49, 0xaf, 0x11, 0xbe, 0xe4, 0xd4, 0x48, 0x92, 0xb6, 0x5b,
    456     0xc2, 0x04, 0xd4, 0x0c, 0x5c, 0x8b, 0xe3, 0xfa, 0x29, 0x63, 0x86, 0xb4,
    457     0x10, 0xad, 0x32, 0x07, 0x85, 0xe2, 0x43, 0x76, 0x16, 0x90, 0xab, 0xdf,
    458     0xb3, 0x36, 0x0a, 0xc4, 0x49, 0x7b, 0x95, 0x48, 0x50, 0x72, 0x8f, 0x7d,
    459     0xf4, 0xfa, 0x60, 0xc1 };
    460 
    461     unsigned char p_data[] = {
    462     0x00, 0xed, 0xf7, 0xa7, 0x00, 0x5a, 0xbb, 0xd1, 0x52, 0x65, 0x9b, 0xec,
    463     0xfe, 0x27, 0x8b, 0xe2, 0xbe, 0x40, 0x8c, 0x2f, 0x6f, 0xb4, 0x26, 0xb2,
    464     0xbe, 0x45, 0x4b, 0x3b, 0x5a, 0xaa, 0xc6, 0xaa, 0xfa, 0xc1, 0x3a, 0xa9,
    465     0xa1, 0xba, 0xb7, 0x86, 0x1a, 0x98, 0x15, 0x5f, 0x5c, 0x1c, 0x57, 0x78,
    466     0x78, 0x6a, 0x13, 0xc2, 0x40, 0x7d, 0x07, 0x87, 0x47, 0xc6, 0x96, 0xd5,
    467     0x92, 0xc9, 0x65, 0x2c, 0xfe, 0xbb, 0xe0, 0xd6, 0x76, 0x25, 0x5a, 0xa3,
    468     0xdf, 0x97, 0x4b, 0x64, 0xfd, 0x3b, 0x2b, 0xbc, 0xfb, 0x80, 0xad, 0x3b,
    469     0x7d, 0x1f, 0x48, 0x56, 0x27, 0xf7, 0x2f, 0x8e, 0x92, 0x07, 0xa8, 0x9f,
    470     0xbc, 0x5a, 0xce, 0xfa, 0xd5, 0x67, 0xad, 0xf4, 0xbf, 0xe0, 0xc9, 0x3e,
    471     0x8e, 0xb5, 0x90, 0x58, 0x54, 0x92, 0x9f, 0xda, 0x36, 0xc0, 0x0d, 0x57,
    472     0xfe, 0x6c, 0x23, 0x63, 0x8b, 0xd1, 0x1e, 0x4f, 0xd3 };
    473 
    474     unsigned char q_data[] = {
    475     0x00, 0xd6, 0x3f, 0xf5, 0xee, 0xff, 0x4d, 0x7d, 0x8c, 0x1a, 0x85, 0x5d,
    476     0x3c, 0x4f, 0x9d, 0xdf, 0xc7, 0x68, 0x27, 0x7f, 0xe4, 0x4f, 0x4f, 0xd7,
    477     0xa2, 0x3b, 0xcd, 0x4a, 0x34, 0xd8, 0x55, 0x4a, 0x3e, 0x8e, 0xb3, 0xa8,
    478     0xe9, 0x8a, 0xc5, 0x94, 0xd1, 0x09, 0x32, 0x4b, 0x79, 0x8d, 0x7b, 0x03,
    479     0x0b, 0x5d, 0xca, 0x91, 0x41, 0xbc, 0x82, 0xc3, 0x89, 0x67, 0x4d, 0x03,
    480     0x68, 0x03, 0x2d, 0x0e, 0x4e, 0x97, 0x6c, 0xf6, 0x3e, 0x1f, 0xf4, 0x50,
    481     0x06, 0x5d, 0x05, 0x22, 0xf2, 0xf8, 0xf2, 0xde, 0xad, 0x2e, 0x9d, 0xc3,
    482     0x97, 0x1b, 0xc3, 0x75, 0xe7, 0x86, 0xde, 0xc5, 0x11, 0x89, 0xed, 0x6a,
    483     0x13, 0x14, 0x23, 0x4b, 0x98, 0x81, 0xf7, 0xd4, 0x1c, 0xee, 0x30, 0x92,
    484     0x85, 0x20, 0x4f, 0x35, 0x02, 0xfa, 0xda, 0x14, 0x77, 0xfa, 0x08, 0x34,
    485     0x60, 0xc7, 0x93, 0x72, 0xdc, 0xc4, 0x18, 0x70, 0xc1 };
    486 
    487     memset(msgbuf, 0xef, 64);
    488 
    489     ret = (TEST_ptr((p = BN_bin2bn(p_data, sizeof(p_data), NULL)))
    490            && TEST_ptr((q = BN_bin2bn(q_data, sizeof(q_data), NULL)))
    491            && TEST_ptr((n = BN_bin2bn(n_data, sizeof(n_data), NULL)))
    492            && TEST_ptr((d = BN_bin2bn(d_data, sizeof(d_data), NULL)))
    493            && TEST_ptr((e = BN_bin2bn(e_data, sizeof(e_data), NULL)))
    494            && TEST_ptr((rsa = RSA_new()))
    495            && TEST_ptr((md = EVP_sha256()))
    496            && TEST_ptr((ctx = EVP_MD_CTX_new()))
    497            && TEST_ptr((pkey = EVP_PKEY_new()))
    498            && TEST_true(RSA_set0_factors(rsa, p, q))
    499            && TEST_true(RSA_set0_key(rsa, n, e, d))
    500            && TEST_true(EVP_PKEY_assign_RSA(pkey, rsa))
    501            && TEST_true(EVP_DigestSignInit(ctx, NULL, md, NULL, pkey))
    502            && TEST_true(EVP_DigestSign(ctx, sigbuf, &buflen, msgbuf, msglen)));
    503 
    504     EVP_MD_CTX_free(ctx);
    505     EVP_PKEY_free(pkey);
    506     return ret;
    507 }
    508 
    509 static RSA *load_key(int priv)
    510 {
    511     RSA *rsa = NULL;
    512     BIGNUM *pn = NULL, *pe = NULL, *pd= NULL;
    513 
    514     /* RSA key extracted using > openssl genpkey -algorithm RSA -text */
    515     static const unsigned char n[] = {
    516         0x00, 0xbe, 0x24, 0x14, 0xf2, 0x39, 0xde, 0x19, 0xb3, 0xd7, 0x86, 0x1e, 0xf8, 0xd3, 0x97,
    517         0x9f, 0x78, 0x28, 0x4c, 0xbf, 0xef, 0x03, 0x29, 0xc5, 0xeb, 0x97, 0x18, 0xdb, 0xa5, 0x17,
    518         0x07, 0x57, 0x96, 0xe2, 0x45, 0x91, 0x2b, 0xd2, 0x9e, 0x28, 0x61, 0xa7, 0x8f, 0x39, 0xaa,
    519         0xde, 0x94, 0x6d, 0x2b, 0x39, 0xde, 0xbe, 0xcf, 0xd7, 0x29, 0x16, 0x3a, 0x1a, 0x86, 0x2f,
    520         0xff, 0x7a, 0x2f, 0x12, 0xc4, 0x8a, 0x32, 0x06, 0x6f, 0x40, 0x42, 0x37, 0xaa, 0x5f, 0xaf,
    521         0x40, 0x77, 0xa5, 0x73, 0x09, 0xbf, 0xc5, 0x85, 0x79, 0xc0, 0x38, 0xd6, 0xb7, 0x2f, 0x77,
    522         0xf0, 0x5a, 0xaf, 0xaf, 0xc3, 0x63, 0x4b, 0xea, 0xa2, 0x0c, 0x27, 0xcd, 0x7c, 0x77, 0xf4,
    523         0x29, 0x5a, 0x69, 0xbd, 0xfe, 0x17, 0xb6, 0xc5, 0xd7, 0xc0, 0x40, 0xf9, 0x29, 0x46, 0x1f,
    524         0xc0, 0x4b, 0xcf, 0x4e, 0x8f, 0x74, 0xd9, 0xc8, 0xd0, 0xde, 0x9c, 0x48, 0x57, 0xcc, 0x30,
    525         0xbc, 0x06, 0x47, 0x4a, 0x8e, 0x40, 0x8a, 0xa1, 0x2a, 0x09, 0x8d, 0xe8, 0x41, 0x3d, 0x21,
    526         0x52, 0xdc, 0x9c, 0xa9, 0x43, 0x63, 0x01, 0x44, 0xb3, 0xec, 0x22, 0x06, 0x29, 0xf6, 0xd8,
    527         0xf6, 0x6b, 0xc3, 0x36, 0x25, 0xb0, 0x9b, 0xdb, 0x9a, 0x22, 0x51, 0x13, 0x42, 0xbd, 0x28,
    528         0x0b, 0xd8, 0x5e, 0xac, 0xc7, 0x71, 0x6e, 0x78, 0xfc, 0xf4, 0x1d, 0x74, 0x9b, 0x1a, 0x19,
    529         0x13, 0x56, 0x04, 0xb4, 0x33, 0x4e, 0xed, 0x54, 0x59, 0x7f, 0x71, 0x5d, 0x24, 0x18, 0x91,
    530         0x51, 0x20, 0x39, 0x78, 0x4e, 0x33, 0x73, 0x96, 0xa8, 0x12, 0x2f, 0xff, 0x48, 0xc2, 0x11,
    531         0x33, 0x95, 0xe5, 0xcc, 0x1a, 0xe2, 0x39, 0xd5, 0x57, 0x44, 0x51, 0x59, 0xd1, 0x35, 0x62,
    532         0x16, 0x22, 0xf5, 0x52, 0x3d, 0xe0, 0x9b, 0x2d, 0x33, 0x34, 0x75, 0x13, 0x7d, 0x62, 0x70,
    533         0x53, 0x31
    534     };
    535     static const unsigned char e[] = {
    536         0x01, 0x00, 0x01
    537     };
    538     static const unsigned char d[] = {
    539         0x0b, 0xd3, 0x07, 0x7a, 0xb0, 0x0c, 0xb2, 0xe3, 0x5d, 0x49, 0x7f, 0xe0, 0xf4, 0x5b, 0x21,
    540         0x31, 0x96, 0x2b, 0x7e, 0x32, 0xdf, 0x5a, 0xec, 0x5e, 0x10, 0x14, 0x9d, 0x99, 0xaa, 0xd8,
    541         0xc3, 0xfa, 0x9c, 0x0e, 0x0c, 0x96, 0xe9, 0xa3, 0x58, 0x62, 0x68, 0xca, 0xba, 0x50, 0xc9,
    542         0x04, 0x58, 0xd4, 0xe3, 0xa5, 0x99, 0x8f, 0x08, 0x2b, 0xcb, 0xe0, 0x1f, 0x84, 0xc5, 0x64,
    543         0xbd, 0x48, 0xe2, 0xc1, 0x56, 0x51, 0x01, 0xb7, 0x8e, 0xca, 0xe3, 0x66, 0x70, 0xea, 0x7f,
    544         0x8f, 0x45, 0x3a, 0xa6, 0x02, 0x3f, 0x16, 0xc3, 0xad, 0x57, 0x97, 0x8a, 0x37, 0x2d, 0x6d,
    545         0xb4, 0xfd, 0x08, 0x98, 0x95, 0x72, 0xeb, 0xd7, 0xa9, 0x9a, 0xfa, 0xcf, 0x55, 0x10, 0x19,
    546         0xf7, 0x7f, 0x7c, 0x8f, 0x49, 0xf3, 0x1d, 0xc2, 0xf2, 0xd7, 0xb3, 0x8a, 0xfc, 0x9b, 0x76,
    547         0x40, 0x5c, 0xa7, 0x2f, 0x7a, 0x8a, 0x3d, 0xdf, 0xbc, 0x52, 0x69, 0x99, 0xf8, 0x4b, 0x7a,
    548         0xbf, 0x11, 0x5d, 0x31, 0x41, 0x5f, 0xa3, 0xb9, 0x74, 0xaf, 0xe4, 0x08, 0x19, 0x9f, 0x88,
    549         0xca, 0xfb, 0x8e, 0xab, 0xa4, 0x00, 0x31, 0xc9, 0xf1, 0x77, 0xe9, 0xe3, 0xf1, 0x98, 0xd9,
    550         0x04, 0x08, 0x0c, 0x38, 0x35, 0x4b, 0xcc, 0xab, 0x22, 0xdf, 0x84, 0xea, 0xe4, 0x2e, 0x57,
    551         0xa5, 0xc1, 0x91, 0x0c, 0x34, 0x3b, 0x88, 0xbc, 0x14, 0xee, 0x6e, 0xe3, 0xf0, 0xe0, 0xdc,
    552         0xae, 0xd6, 0x0c, 0x9b, 0xa0, 0x6d, 0xb6, 0x92, 0x6c, 0x7e, 0x05, 0x46, 0x02, 0xbc, 0x23,
    553         0xbc, 0x65, 0xe6, 0x62, 0x04, 0x19, 0xe6, 0x98, 0x67, 0x2d, 0x15, 0x0a, 0xc4, 0xea, 0xb5,
    554         0x62, 0xa0, 0x54, 0xed, 0x07, 0x45, 0x3e, 0x21, 0x93, 0x3e, 0x22, 0xd0, 0xc3, 0xca, 0x37,
    555         0x3c, 0xea, 0x90, 0xdd, 0xa6, 0xb1, 0x6c, 0x76, 0xce, 0x5a, 0xe1, 0xc2, 0x80, 0x1f, 0x32,
    556         0x21
    557     };
    558 
    559     if (!TEST_ptr(rsa = RSA_new()))
    560         return NULL;
    561     pn = BN_bin2bn(n, sizeof(n), NULL);
    562     pe = BN_bin2bn(e, sizeof(e), NULL);
    563     if (priv)
    564         pd = BN_bin2bn(d, sizeof(d), NULL);
    565     if (!TEST_false(pn == NULL
    566                     || pe == NULL
    567                     || (priv && pd == NULL)
    568                     || !RSA_set0_key(rsa, pn, pe, pd))) {
    569         BN_free(pn);
    570         BN_free(pe);
    571         BN_free(pd);
    572         RSA_free(rsa);
    573         rsa = NULL;
    574     }
    575     return rsa;
    576 }
    577 
    578 static int test_rsa_saos(void)
    579 {
    580     int ret = 0;
    581     unsigned int siglen = 0;
    582     RSA *rsa_priv = NULL, *rsa_pub = NULL;
    583     static const unsigned char in[256] = { 0 };
    584     unsigned char sig[256];
    585     /* Maximum length allowed: The 3 relates to the octet byte 0x04 followed by a 2 byte length */
    586     unsigned int inlen = sizeof(in) - RSA_PKCS1_PADDING_SIZE - 3;
    587 
    588     /* A generated signature when in[inlen]= { 1 }. */
    589     static const unsigned char sig_mismatch[256] = {
    590         0x5f, 0x64, 0xab, 0xd3, 0x86, 0xdf, 0x6e, 0x91,
    591         0xa8, 0xdb, 0x9d, 0x36, 0x7a, 0x15, 0xe5, 0x75,
    592         0xe4, 0x27, 0xdf, 0xeb, 0x8d, 0xaf, 0xb0, 0x60,
    593         0xec, 0x36, 0x8b, 0x00, 0x36, 0xb4, 0x61, 0x38,
    594         0xfe, 0xfa, 0x49, 0x55, 0xcf, 0xb7, 0xff, 0xeb,
    595         0x25, 0xa5, 0x41, 0x1e, 0xaa, 0x74, 0x3d, 0x57,
    596         0xed, 0x5c, 0x4a, 0x01, 0x9e, 0xb2, 0x50, 0xbc,
    597         0x50, 0x15, 0xd5, 0x97, 0x93, 0x91, 0x97, 0xa3,
    598         0xff, 0x67, 0x2a, 0xe9, 0x04, 0xdd, 0x31, 0x6f,
    599         0x4b, 0x44, 0x4f, 0x04, 0xa0, 0x48, 0x6a, 0xc1,
    600         0x8d, 0xc2, 0xf3, 0xf7, 0xc4, 0x8c, 0x29, 0xcb,
    601         0x2c, 0x04, 0x8f, 0x30, 0x71, 0xbb, 0x5b, 0xf9,
    602         0xf9, 0x1b, 0xe8, 0xf0, 0xe8, 0xd1, 0xcf, 0x73,
    603         0xf6, 0x02, 0x45, 0x6f, 0x53, 0x25, 0x1e, 0x74,
    604         0x94, 0x6e, 0xf4, 0x0d, 0x36, 0x6c, 0xa3, 0xae,
    605         0x8f, 0x94, 0x05, 0xa9, 0xe9, 0x65, 0x26, 0x7f,
    606         0x07, 0xc5, 0x7e, 0xab, 0xd9, 0xe9, 0x09, 0x2d,
    607         0x19, 0x8c, 0x6a, 0xcc, 0xd5, 0x62, 0x04, 0xb4,
    608         0x9b, 0xaf, 0x99, 0x6a, 0x7a, 0x7b, 0xef, 0x01,
    609         0x9b, 0xc1, 0x46, 0x59, 0x88, 0xee, 0x8b, 0xd7,
    610         0xe5, 0x35, 0xad, 0x4c, 0xb2, 0x0d, 0x93, 0xdd,
    611         0x0e, 0x50, 0x36, 0x2b, 0x7b, 0x42, 0x9b, 0x59,
    612         0x95, 0xe7, 0xe1, 0x36, 0x50, 0x87, 0x7c, 0xac,
    613         0x47, 0x13, 0x9b, 0xa7, 0x36, 0xdf, 0x8a, 0xd7,
    614         0xee, 0x7d, 0x2e, 0xa6, 0xbb, 0x31, 0x32, 0xed,
    615         0x39, 0x77, 0xf2, 0x41, 0xf9, 0x2d, 0x29, 0xfc,
    616         0x6d, 0x32, 0x8e, 0x35, 0x99, 0x38, 0x8b, 0xd9,
    617         0xc6, 0x77, 0x09, 0xe3, 0xe3, 0x06, 0x98, 0xe1,
    618         0x96, 0xe9, 0x23, 0x11, 0xeb, 0x09, 0xa2, 0x6b,
    619         0x21, 0x52, 0x67, 0x94, 0x15, 0x72, 0x7e, 0xdd,
    620         0x66, 0x1c, 0xe7, 0xdb, 0x0e, 0x71, 0x5d, 0x95,
    621         0x9d, 0xf8, 0x8e, 0x65, 0x97, 0x2f, 0x1a, 0x86
    622     };
    623     /* The signature generated by RSA_private_encrypt of in[inlen] */
    624     static const unsigned char no_octet_sig[256] = {
    625         0x78, 0xaf, 0x3e, 0xd1, 0xbc, 0x99, 0xb3, 0x19,
    626         0xa8, 0xaa, 0x64, 0x56, 0x60, 0x95, 0xa0, 0x81,
    627         0xd8, 0xb4, 0xe1, 0x9c, 0xf8, 0x94, 0xfa, 0x31,
    628         0xb5, 0xde, 0x90, 0x75, 0xa7, 0xdb, 0xd4, 0x7e,
    629         0xda, 0x62, 0xde, 0x16, 0x78, 0x4f, 0x9b, 0xc2,
    630         0xa4, 0xd4, 0x5c, 0x17, 0x4f, 0x2d, 0xf2, 0x84,
    631         0x5b, 0x5d, 0x00, 0xa0, 0xcf, 0xda, 0x3f, 0xbc,
    632         0x40, 0xb4, 0x4e, 0xcb, 0x18, 0xeb, 0x4b, 0x0f,
    633         0xce, 0x95, 0x3a, 0x5a, 0x9c, 0x49, 0xb4, 0x63,
    634         0xd4, 0xde, 0xfb, 0xe2, 0xa8, 0xf3, 0x97, 0x52,
    635         0x36, 0x3e, 0xc0, 0xab, 0xc8, 0x1c, 0xef, 0xdd,
    636         0xf4, 0x37, 0xbc, 0xf3, 0xc3, 0x67, 0xf6, 0xc0,
    637         0x6e, 0x75, 0xa6, 0xf3, 0x7e, 0x37, 0x96, 0xf2,
    638         0xbb, 0x25, 0x3a, 0xa0, 0xa8, 0x8e, 0xce, 0xa0,
    639         0xce, 0x0f, 0x22, 0x2d, 0x9c, 0x30, 0x0d, 0x20,
    640         0x36, 0xc6, 0x9d, 0x36, 0x5d, 0x5b, 0x3e, 0xbc,
    641         0x7c, 0x55, 0x95, 0xb4, 0x69, 0x19, 0x27, 0xf6,
    642         0x63, 0x78, 0x21, 0x2d, 0xcf, 0x51, 0xb0, 0x46,
    643         0x44, 0x02, 0x29, 0x93, 0xa5, 0x1b, 0xda, 0x21,
    644         0xb3, 0x74, 0xf6, 0x4e, 0xd0, 0xdb, 0x3d, 0x59,
    645         0xfd, 0xd7, 0x88, 0xd0, 0x2f, 0x84, 0xf6, 0xb1,
    646         0xaa, 0xce, 0x3e, 0xa0, 0xdc, 0x1a, 0xd0, 0xe3,
    647         0x5f, 0x3c, 0xda, 0x96, 0xee, 0xce, 0xf9, 0x75,
    648         0xcf, 0x8d, 0xf3, 0x03, 0x28, 0xa7, 0x39, 0xbd,
    649         0x95, 0xaa, 0x73, 0xbe, 0xa5, 0x5f, 0x84, 0x33,
    650         0x07, 0x49, 0xbf, 0x03, 0xf8, 0x4b, 0x46, 0xbf,
    651         0x38, 0xd4, 0x9b, 0x14, 0xa7, 0x01, 0xb7, 0x1f,
    652         0x12, 0x08, 0x01, 0xed, 0xcd, 0x34, 0xf5, 0xb4,
    653         0x06, 0x47, 0xe0, 0x53, 0x1c, 0x7c, 0x3f, 0xb5,
    654         0x30, 0x59, 0xbb, 0xe3, 0xd6, 0x7c, 0x41, 0xcc,
    655         0xd2, 0x11, 0x73, 0x03, 0x77, 0x7f, 0x5f, 0xad,
    656         0x4a, 0x54, 0xdf, 0x17, 0x94, 0x97, 0x5c, 0x16
    657     };
    658 
    659     if (!TEST_ptr(rsa_priv = load_key(1)))
    660         goto err;
    661     if (!TEST_ptr(rsa_pub = load_key(0)))
    662         goto err;
    663     if (!TEST_int_ge((int)sizeof(sig), RSA_size(rsa_priv)))
    664         goto err;
    665 
    666     /* Test that a generated signature can be verified */
    667     if (!TEST_true(RSA_sign_ASN1_OCTET_STRING(0, in, inlen, sig, &siglen,
    668                                               rsa_priv)))
    669         goto err;
    670     if (!TEST_true(RSA_verify_ASN1_OCTET_STRING(0, in, inlen, sig, siglen, rsa_pub)))
    671         goto err;
    672 
    673     /* Test sign fails if the input is too large */
    674     if (!TEST_false(RSA_sign_ASN1_OCTET_STRING(0, in, inlen + 1, sig, &siglen,
    675                                                rsa_priv)))
    676         goto err;
    677 
    678     /* Fail if there is no private signing key */
    679     if (!TEST_false(RSA_sign_ASN1_OCTET_STRING(0, in, inlen, sig, &siglen,
    680                                                rsa_pub)))
    681         goto err;
    682 
    683     /* Fail if the signature is the wrong size */
    684     if (!TEST_false(RSA_verify_ASN1_OCTET_STRING(0, in, inlen, sig, siglen - 1, rsa_pub)))
    685         goto err;
    686 
    687     /* Fail if the encrypted input is not octet encoded */
    688     if (!TEST_false(RSA_verify_ASN1_OCTET_STRING(0, in, inlen, (unsigned char *)no_octet_sig,
    689                                                  (unsigned int)sizeof(no_octet_sig),
    690                                                  rsa_pub)))
    691         goto err;
    692 
    693     /* Fail if the signature does not match the input */
    694     if (!TEST_false(RSA_verify_ASN1_OCTET_STRING(0, in, inlen, (unsigned char *)sig_mismatch,
    695                                                  (unsigned int)sizeof(sig_mismatch),
    696                                                  rsa_pub)))
    697         goto err;
    698 
    699     /* Fail if the signature is corrupt */
    700     sig[0]++;
    701     if (!TEST_false(RSA_verify_ASN1_OCTET_STRING(0, in, inlen, sig, siglen, rsa_pub)))
    702         goto err;
    703     sig[0]--;
    704 
    705     ret = 1;
    706 err:
    707     RSA_free(rsa_priv);
    708     RSA_free(rsa_pub);
    709     return ret;
    710 }
    711 
    712 int setup_tests(void)
    713 {
    714     ADD_ALL_TESTS(test_rsa_pkcs1, 3);
    715     ADD_ALL_TESTS(test_rsa_oaep, 3);
    716     ADD_ALL_TESTS(test_rsa_security_bit, OSSL_NELEM(rsa_security_bits_cases));
    717     ADD_TEST(test_rsa_saos);
    718     ADD_TEST(test_EVP_rsa_legacy_key);
    719     return 1;
    720 }
    721