Ignore:
Timestamp:
Jun 22, 2021, 9:00:19 PM (3 years ago)
Author:
coas-nagasima
Message:

WolfSSLとAzure IoT SDKを更新

Location:
azure_iot_hub_f767zi/trunk/wolfssl-4.7.0
Files:
1 edited
1 moved

Legend:

Unmodified
Added
Removed
  • azure_iot_hub_f767zi/trunk/wolfssl-4.7.0/wolfcrypt/src/rsa.c

    r457 r464  
    2020 */
    2121
    22 
     22/*
     23
     24DESCRIPTION
     25This library provides the interface to the RSA.
     26RSA keys can be used to encrypt, decrypt, sign and verify data.
     27
     28*/
    2329#ifdef HAVE_CONFIG_H
    2430    #include <config.h>
     
    336342}
    337343
    338 #ifdef HAVE_PKCS11
     344#ifdef WOLF_CRYPTO_CB
    339345int wc_InitRsaKey_Id(RsaKey* key, unsigned char* id, int len, void* heap,
    340346                     int devId)
     
    349355    if (ret == 0)
    350356        ret = wc_InitRsaKey_ex(key, heap, devId);
    351 
    352357    if (ret == 0 && id != NULL && len != 0) {
    353358        XMEMCPY(key->id, id, len);
    354359        key->idLen = len;
     360    }
     361
     362    return ret;
     363}
     364
     365int wc_InitRsaKey_Label(RsaKey* key, const char* label, void* heap, int devId)
     366{
     367    int ret = 0;
     368    int labelLen = 0;
     369
     370    if (key == NULL || label == NULL)
     371        ret = BAD_FUNC_ARG;
     372    if (ret == 0) {
     373        labelLen = (int)XSTRLEN(label);
     374        if (labelLen == 0 || labelLen > RSA_MAX_LABEL_LEN)
     375            ret = BUFFER_E;
     376    }
     377
     378    if (ret == 0)
     379        ret = wc_InitRsaKey_ex(key, heap, devId);
     380    if (ret == 0) {
     381        XMEMCPY(key->label, label, labelLen);
     382        key->labelLen = labelLen;
    355383    }
    356384
     
    381409    mSz = mp_unsigned_bin_size(&(key->n));
    382410    m = (unsigned char*)XMALLOC(mSz, key->heap, DYNAMIC_TYPE_KEY);
    383     if (m == 0) {
     411    if (m == NULL) {
    384412        return MEMORY_E;
    385413    }
     
    478506    CRYS_RSAKGFipsContext_t FipsCtx;
    479507    byte ex[3];
    480     uint16_t eSz = sizeof(ex);
     508    word16 eSz = sizeof(ex);
    481509    byte n[256];
    482     uint16_t nSz = sizeof(n);
     510    word16 nSz = sizeof(n);
    483511
    484512    ret = CRYS_RSA_KG_GenerateKeyPair(&wc_rndState,
    485513                        wc_rndGenVectFunc,
    486514                        (byte*)&e,
    487                         3*sizeof(uint8_t),
     515                        3*sizeof(byte),
    488516                        size,
    489517                        &key->ctx.privKey,
     
    606634            ret = MP_READ_E;
    607635    }
    608 
    609636#ifdef WOLFSSL_HAVE_SP_RSA
    610 #ifndef WOLFSSL_SP_NO_2048
    611     if (mp_count_bits(&key->n) == 2048) {
    612         ret = sp_ModExp_2048(k, &key->e, &key->n, tmp);
    613         if (ret != 0)
     637    if (ret == 0) {
     638        switch (mp_count_bits(&key->n)) {
     639    #ifndef WOLFSSL_SP_NO_2048
     640            case 2048:
     641                ret = sp_ModExp_2048(k, &key->e, &key->n, tmp);
     642                if (ret != 0)
     643                    ret = MP_EXPTMOD_E;
     644                if (ret == 0) {
     645                    ret = sp_ModExp_2048(tmp, &key->d, &key->n, tmp);
     646                    if (ret != 0)
     647                        ret = MP_EXPTMOD_E;
     648                }
     649                break;
     650    #endif /* WOLFSSL_SP_NO_2048 */
     651    #ifndef WOLFSSL_SP_NO_3072
     652            case 3072:
     653                ret = sp_ModExp_3072(k, &key->e, &key->n, tmp);
     654                if (ret != 0)
     655                    ret = MP_EXPTMOD_E;
     656                if (ret == 0) {
     657                  ret = sp_ModExp_3072(tmp, &key->d, &key->n, tmp);
     658                  if (ret != 0)
     659                      ret = MP_EXPTMOD_E;
     660                }
     661                break;
     662    #endif /* WOLFSSL_SP_NO_3072 */
     663    #ifdef WOLFSSL_SP_4096
     664            case 4096:
     665                ret = sp_ModExp_4096(k, &key->e, &key->n, tmp);
     666                if (ret != 0)
     667                    ret = MP_EXPTMOD_E;
     668                if (ret == 0) {
     669                  ret = sp_ModExp_4096(tmp, &key->d, &key->n, tmp);
     670                  if (ret != 0)
     671                      ret = MP_EXPTMOD_E;
     672                }
     673                break;
     674    #endif /* WOLFSSL_SP_4096 */
     675                default:
     676                /* If using only single precsision math then issue key size
     677                 * error, otherwise fall-back to multi-precision math
     678                 * calculation */
     679                #if defined(WOLFSSL_SP_MATH)
     680                    ret = WC_KEY_SIZE_E;
     681                #else
     682                    if (mp_exptmod_nct(k, &key->e, &key->n, tmp) != MP_OKAY)
     683                        ret = MP_EXPTMOD_E;
     684                    if (ret == 0) {
     685                        if (mp_exptmod(tmp, &key->d, &key->n, tmp) != MP_OKAY)
     686                            ret = MP_EXPTMOD_E;
     687                    }
     688                #endif
     689                    break;
     690        }
     691    }
     692#else
     693    if (ret == 0) {
     694        if (mp_exptmod_nct(k, &key->e, &key->n, tmp) != MP_OKAY)
    614695            ret = MP_EXPTMOD_E;
    615         ret = sp_ModExp_2048(tmp, &key->d, &key->n, tmp);
    616         if (ret != 0)
     696    }
     697
     698    if (ret == 0) {
     699        if (mp_exptmod(tmp, &key->d, &key->n, tmp) != MP_OKAY)
    617700            ret = MP_EXPTMOD_E;
    618701    }
    619     else
    620 #endif
    621 #ifndef WOLFSSL_SP_NO_3072
    622     if (mp_count_bits(&key->n) == 3072) {
    623         ret = sp_ModExp_3072(k, &key->e, &key->n, tmp);
    624         if (ret != 0)
    625             ret = MP_EXPTMOD_E;
    626         ret = sp_ModExp_3072(tmp, &key->d, &key->n, tmp);
    627         if (ret != 0)
    628             ret = MP_EXPTMOD_E;
    629     }
    630     else
    631 #endif
    632 #ifdef WOLFSSL_SP_4096
    633     if (mp_count_bits(&key->n) == 4096) {
    634         ret = sp_ModExp_4096(k, &key->e, &key->n, tmp);
    635         if (ret != 0)
    636             ret = MP_EXPTMOD_E;
    637         ret = sp_ModExp_4096(tmp, &key->d, &key->n, tmp);
    638         if (ret != 0)
    639             ret = MP_EXPTMOD_E;
    640     }
    641     else
    642 #endif
    643 #endif
    644 #ifdef WOLFSSL_SP_MATH
    645     {
    646         ret = WC_KEY_SIZE_E;
    647     }
    648 #else
    649     {
    650         if (ret == 0) {
    651             if (mp_exptmod(k, &key->e, &key->n, tmp) != MP_OKAY)
    652                 ret = MP_EXPTMOD_E;
    653         }
    654 
    655         if (ret == 0) {
    656             if (mp_exptmod(tmp, &key->d, &key->n, tmp) != MP_OKAY)
    657                 ret = MP_EXPTMOD_E;
    658         }
    659     }
    660 #endif
     702#endif /* WOLFSSL_HAVE_SP_RSA */
    661703
    662704    if (ret == 0) {
     
    757799    return ret;
    758800}
    759 #endif
    760 #endif
     801#endif /* WOLFSSL_KEY_GEN && !WOLFSSL_NO_RSA_KEY_CHECK */
     802#endif /* WOLFSSL_RSA_PUBLIC_ONLY */
    761803
    762804
     
    816858
    817859        /* counter to byte array appended to tmp */
    818         tmp[seedSz]     = (counter >> 24) & 0xFF;
    819         tmp[seedSz + 1] = (counter >> 16) & 0xFF;
    820         tmp[seedSz + 2] = (counter >>  8) & 0xFF;
    821         tmp[seedSz + 3] = (counter)       & 0xFF;
     860        tmp[seedSz]     = (byte)((counter >> 24) & 0xFF);
     861        tmp[seedSz + 1] = (byte)((counter >> 16) & 0xFF);
     862        tmp[seedSz + 2] = (byte)((counter >>  8) & 0xFF);
     863        tmp[seedSz + 3] = (byte)((counter)       & 0xFF);
    822864
    823865        /* hash and append to existing output */
     
    11031145    byte* m;
    11041146    byte* s;
     1147#if defined(WOLFSSL_NO_MALLOC) && !defined(WOLFSSL_STATIC_MEMORY)
     1148    byte msg[RSA_MAX_SIZE/8 + RSA_PSS_PAD_SZ];
     1149#else
     1150    byte* msg = NULL;
     1151#endif
    11051152#if defined(WOLFSSL_PSS_LONG_SALT) || defined(WOLFSSL_PSS_SALT_LEN_DISCOVER)
    1106     #if defined(WOLFSSL_NO_MALLOC) && !defined(WOLFSSL_STATIC_MEMORY)
    1107         byte salt[RSA_MAX_SIZE/8 + RSA_PSS_PAD_SZ];
    1108     #else
    1109         byte* salt = NULL;
    1110     #endif
     1153    byte* salt;
    11111154#else
    11121155    byte salt[WC_MAX_DIGEST_SIZE];
     
    11221165    if (hLen < 0)
    11231166        return hLen;
     1167    if ((int)inputLen != hLen) {
     1168        return BAD_FUNC_ARG;
     1169    }
    11241170
    11251171    hiBits = (bits - 1) & 0x7;
    11261172    if (hiBits == 0) {
     1173        /* Per RFC8017, set the leftmost 8emLen - emBits bits of the
     1174           leftmost octet in DB to zero.
     1175        */
    11271176        *(pkcsBlock++) = 0;
    11281177        pkcsBlockLen--;
     
    11611210        return PSS_SALTLEN_E;
    11621211    }
    1163 
    11641212    maskLen = pkcsBlockLen - 1 - hLen;
    11651213
    11661214#if defined(WOLFSSL_PSS_LONG_SALT) || defined(WOLFSSL_PSS_SALT_LEN_DISCOVER)
    11671215    #if !defined(WOLFSSL_NO_MALLOC) || defined(WOLFSSL_STATIC_MEMORY)
    1168         salt = (byte*)XMALLOC(RSA_PSS_PAD_SZ + inputLen + saltLen, heap,
     1216        msg = (byte*)XMALLOC(RSA_PSS_PAD_SZ + inputLen + saltLen, heap,
    11691217                                                       DYNAMIC_TYPE_RSA_BUFFER);
    1170         if (salt == NULL) {
     1218        if (msg == NULL) {
    11711219            return MEMORY_E;
    11721220        }
    11731221    #endif
    1174     s = m = salt;
     1222    salt = s = m = msg;
    11751223    XMEMSET(m, 0, RSA_PSS_PAD_SZ);
    11761224    m += RSA_PSS_PAD_SZ;
     
    11851233    }
    11861234#else
    1187     s = m = pkcsBlock;
     1235    if (pkcsBlockLen < RSA_PSS_PAD_SZ + inputLen + saltLen) {
     1236    #if !defined(WOLFSSL_NO_MALLOC) || defined(WOLFSSL_STATIC_MEMORY)
     1237        msg = (byte*)XMALLOC(RSA_PSS_PAD_SZ + inputLen + saltLen, heap,
     1238                                                       DYNAMIC_TYPE_RSA_BUFFER);
     1239        if (msg == NULL) {
     1240            return MEMORY_E;
     1241        }
     1242    #endif
     1243        m = msg;
     1244    }
     1245    else {
     1246        m = pkcsBlock;
     1247    }
     1248    s = m;
    11881249    XMEMSET(m, 0, RSA_PSS_PAD_SZ);
    11891250    m += RSA_PSS_PAD_SZ;
     
    12041265    }
    12051266    if (ret == 0) {
     1267       /* Set the last eight bits or trailer field to the octet 0xbc */
    12061268        pkcsBlock[pkcsBlockLen - 1] = RSA_PSS_PAD_TERM;
    12071269
     
    12091271    }
    12101272    if (ret == 0) {
    1211         pkcsBlock[0] &= (1 << hiBits) - 1;
     1273        /* Clear the first high bit when "8emLen - emBits" is non-zero.
     1274           where emBits = n modBits - 1 */
     1275        if (hiBits)
     1276            pkcsBlock[0] &= (1 << hiBits) - 1;
    12121277
    12131278        m = pkcsBlock + maskLen - saltLen - 1;
     
    12181283    }
    12191284
    1220 #if defined(WOLFSSL_PSS_LONG_SALT) || defined(WOLFSSL_PSS_SALT_LEN_DISCOVER)
    12211285    #if !defined(WOLFSSL_NO_MALLOC) || defined(WOLFSSL_STATIC_MEMORY)
    1222         if (salt != NULL) {
    1223             XFREE(salt, heap, DYNAMIC_TYPE_RSA_BUFFER);
     1286        if (msg != NULL) {
     1287            XFREE(msg, heap, DYNAMIC_TYPE_RSA_BUFFER);
    12241288        }
    12251289    #endif
    1226 #endif
    12271290    return ret;
    12281291}
     
    12381301    }
    12391302
     1303    if (pkcsBlockLen - RSA_MIN_PAD_SZ < inputLen) {
     1304        WOLFSSL_MSG("RsaPad error, invalid length");
     1305        return RSA_PAD_E;
     1306    }
    12401307    pkcsBlock[0] = 0x0;       /* set first byte to zero and advance */
    12411308    pkcsBlock++; pkcsBlockLen--;
     
    12431310
    12441311    if (padValue == RSA_BLOCK_TYPE_1) {
    1245         if (pkcsBlockLen < inputLen + 2) {
    1246             WOLFSSL_MSG("RsaPad error, invalid length");
    1247             return RSA_PAD_E;
    1248         }
    12491312
    12501313        /* pad with 0xff bytes */
     
    12561319        word32 padLen, i;
    12571320        int    ret;
    1258 
    1259         if (pkcsBlockLen < inputLen + 1) {
    1260             WOLFSSL_MSG("RsaPad error, invalid length");
    1261             return RSA_PAD_E;
    1262         }
    1263 
    12641321        padLen = pkcsBlockLen - inputLen - 1;
    12651322        ret    = wc_RNG_GenerateBlock(rng, &pkcsBlock[1], padLen);
     
    14581515 * bits          Length of key in bits.
    14591516 * heap          Used for dynamic memory allocation.
    1460  * returns 0 on success, PSS_SALTLEN_E when the salt length is invalid,
    1461  * BAD_PADDING_E when the padding is not valid, MEMORY_E when allocation fails
    1462  * and other negative values on error.
     1517 * returns       the sum of salt length and SHA-256 digest size on success.
     1518 *               Otherwise, PSS_SALTLEN_E for an incorrect salt length,
     1519 *               WC_KEY_SIZE_E for an incorrect encoded message (EM) size
     1520                 and other negative values on error.
    14631521 */
    14641522static int RsaUnPad_PSS(byte *pkcsBlock, unsigned int pkcsBlockLen,
     
    15971655#endif
    15981656
    1599     if (output == NULL || pkcsBlockLen == 0 || pkcsBlockLen > 0xFFFF) {
     1657    if (output == NULL || pkcsBlockLen < 2 || pkcsBlockLen > 0xFFFF) {
    16001658        return BAD_FUNC_ARG;
    16011659    }
     
    17191777}
    17201778
    1721 #if defined(WOLFSSL_XILINX_CRYPT)
    1722 /*
    1723  * Xilinx hardened crypto acceleration.
    1724  *
    1725  * Returns 0 on success and negative values on error.
    1726  */
    1727 static int wc_RsaFunctionXil(const byte* in, word32 inLen, byte* out,
    1728                           word32* outLen, int type, RsaKey* key, WC_RNG* rng)
    1729 {
    1730     int    ret = 0;
    1731     word32 keyLen;
    1732     (void)rng;
    1733 
    1734     keyLen = wc_RsaEncryptSize(key);
    1735     if (keyLen > *outLen) {
    1736         WOLFSSL_MSG("Output buffer is not big enough");
    1737         return BAD_FUNC_ARG;
    1738     }
    1739 
    1740     if (inLen != keyLen) {
    1741         WOLFSSL_MSG("Expected that inLen equals RSA key length");
    1742         return BAD_FUNC_ARG;
    1743     }
    1744 
    1745     switch(type) {
    1746     case RSA_PRIVATE_DECRYPT:
    1747     case RSA_PRIVATE_ENCRYPT:
    1748         /* Currently public exponent is loaded by default.
    1749          * In SDK 2017.1 RSA exponent values are expected to be of 4 bytes
    1750          * leading to private key operations with Xsecure_RsaDecrypt not being
    1751          * supported */
    1752         ret = RSA_WRONG_TYPE_E;
     1779int wc_hash2mgf(enum wc_HashType hType)
     1780{
     1781    switch (hType) {
     1782    case WC_HASH_TYPE_NONE:
     1783        return WC_MGF1NONE;
     1784    case WC_HASH_TYPE_SHA:
     1785#ifndef NO_SHA
     1786        return WC_MGF1SHA1;
     1787#else
    17531788        break;
    1754     case RSA_PUBLIC_ENCRYPT:
    1755     case RSA_PUBLIC_DECRYPT:
    1756         if (XSecure_RsaDecrypt(&(key->xRsa), in, out) != XST_SUCCESS) {
    1757             ret = BAD_STATE_E;
    1758         }
     1789#endif
     1790    case WC_HASH_TYPE_SHA224:
     1791#ifdef WOLFSSL_SHA224
     1792        return WC_MGF1SHA224;
     1793#else
    17591794        break;
     1795#endif
     1796    case WC_HASH_TYPE_SHA256:
     1797#ifndef NO_SHA256
     1798        return WC_MGF1SHA256;
     1799#else
     1800        break;
     1801#endif
     1802    case WC_HASH_TYPE_SHA384:
     1803#ifdef WOLFSSL_SHA384
     1804        return WC_MGF1SHA384;
     1805#else
     1806        break;
     1807#endif
     1808    case WC_HASH_TYPE_SHA512:
     1809#ifdef WOLFSSL_SHA512
     1810        return WC_MGF1SHA512;
     1811#else
     1812        break;
     1813#endif
     1814    case WC_HASH_TYPE_MD2:
     1815    case WC_HASH_TYPE_MD4:
     1816    case WC_HASH_TYPE_MD5:
     1817    case WC_HASH_TYPE_MD5_SHA:
     1818    case WC_HASH_TYPE_SHA3_224:
     1819    case WC_HASH_TYPE_SHA3_256:
     1820    case WC_HASH_TYPE_SHA3_384:
     1821    case WC_HASH_TYPE_SHA3_512:
     1822    case WC_HASH_TYPE_BLAKE2B:
     1823    case WC_HASH_TYPE_BLAKE2S:
    17601824    default:
    1761         ret = RSA_WRONG_TYPE_E;
    1762     }
    1763 
    1764     *outLen = keyLen;
    1765 
    1766     return ret;
    1767 }
    1768 #endif /* WOLFSSL_XILINX_CRYPT */
     1825        break;
     1826    }
     1827    WOLFSSL_MSG("Unrecognized or unsupported hash function");
     1828    return WC_MGF1NONE;
     1829}
    17691830
    17701831#ifdef WC_RSA_NONBLOCK
     
    18461907#endif /* WC_RSA_NONBLOCK */
    18471908
    1848 #ifdef WOLFSSL_AFALG_XILINX_RSA
     1909#ifdef WOLFSSL_XILINX_CRYPT
     1910/*
     1911 * Xilinx hardened crypto acceleration.
     1912 *
     1913 * Returns 0 on success and negative values on error.
     1914 */
     1915static int wc_RsaFunctionSync(const byte* in, word32 inLen, byte* out,
     1916                          word32* outLen, int type, RsaKey* key, WC_RNG* rng)
     1917{
     1918    int    ret = 0;
     1919    word32 keyLen;
     1920    (void)rng;
     1921
     1922    keyLen = wc_RsaEncryptSize(key);
     1923    if (keyLen > *outLen) {
     1924        WOLFSSL_MSG("Output buffer is not big enough");
     1925        return BAD_FUNC_ARG;
     1926    }
     1927
     1928    if (inLen != keyLen) {
     1929        WOLFSSL_MSG("Expected that inLen equals RSA key length");
     1930        return BAD_FUNC_ARG;
     1931    }
     1932
     1933    switch(type) {
     1934    case RSA_PRIVATE_DECRYPT:
     1935    case RSA_PRIVATE_ENCRYPT:
     1936    #ifdef WOLFSSL_XILINX_CRYPTO_OLD
     1937        /* Currently public exponent is loaded by default.
     1938         * In SDK 2017.1 RSA exponent values are expected to be of 4 bytes
     1939         * leading to private key operations with Xsecure_RsaDecrypt not being
     1940         * supported */
     1941        ret = RSA_WRONG_TYPE_E;
     1942    #else
     1943        {
     1944            byte *d;
     1945            int dSz;
     1946            XSecure_Rsa rsa;
     1947
     1948            dSz = mp_unsigned_bin_size(&key->d);
     1949            d = (byte*)XMALLOC(dSz, key->heap, DYNAMIC_TYPE_PRIVATE_KEY);
     1950            if (d == NULL) {
     1951                ret = MEMORY_E;
     1952            }
     1953            else {
     1954                ret = mp_to_unsigned_bin(&key->d, d);
     1955                XSecure_RsaInitialize(&rsa, key->mod, NULL, d);
     1956            }
     1957
     1958            if (ret == 0) {
     1959                if (XSecure_RsaPrivateDecrypt(&rsa, (u8*)in, inLen, out) !=
     1960                        XST_SUCCESS) {
     1961                    ret = BAD_STATE_E;
     1962                }
     1963            }
     1964
     1965            if (d != NULL) {
     1966                XFREE(d, key->heap, DYNAMIC_TYPE_PRIVATE_KEY);
     1967            }
     1968        }
     1969    #endif
     1970        break;
     1971    case RSA_PUBLIC_ENCRYPT:
     1972    case RSA_PUBLIC_DECRYPT:
     1973#ifdef WOLFSSL_XILINX_CRYPTO_OLD
     1974        if (XSecure_RsaDecrypt(&(key->xRsa), in, out) != XST_SUCCESS) {
     1975            ret = BAD_STATE_E;
     1976        }
     1977#else
     1978        /* starting at Xilinx release 2019 the function XSecure_RsaDecrypt was removed */
     1979        if (XSecure_RsaPublicEncrypt(&(key->xRsa), (u8*)in, inLen, out) != XST_SUCCESS) {
     1980            WOLFSSL_MSG("Error happened when calling hardware RSA public operation");
     1981            ret = BAD_STATE_E;
     1982        }
     1983#endif
     1984        break;
     1985    default:
     1986        ret = RSA_WRONG_TYPE_E;
     1987    }
     1988
     1989    *outLen = keyLen;
     1990
     1991    return ret;
     1992}
     1993
     1994#elif defined(WOLFSSL_AFALG_XILINX_RSA)
    18491995#ifndef ERROR_OUT
    18501996#define ERROR_OUT(x) ret = (x); goto done
     
    20102156                          word32* outLen, int type, RsaKey* key, WC_RNG* rng)
    20112157{
    2012 #ifndef WOLFSSL_SP_MATH
     2158#if !defined(WOLFSSL_SP_MATH)
    20132159#ifdef WOLFSSL_SMALL_STACK
    20142160    mp_int* tmp;
     
    20392185    #endif
    20402186    #ifndef RSA_LOW_MEM
    2041             return sp_RsaPrivate_2048(in, inLen, &key->d, &key->p, &key->q,
    2042                                       &key->dP, &key->dQ, &key->u, &key->n,
    2043                                       out, outLen);
     2187            if ((mp_count_bits(&key->p) == 1024) &&
     2188                                             (mp_count_bits(&key->q) == 1024)) {
     2189                return sp_RsaPrivate_2048(in, inLen, &key->d, &key->p, &key->q,
     2190                                          &key->dP, &key->dQ, &key->u, &key->n,
     2191                                          out, outLen);
     2192            }
     2193            break;
    20442194    #else
    2045             return sp_RsaPrivate_2048(in, inLen, &key->d, &key->p, &key->q,
    2046                                       NULL, NULL, NULL, &key->n, out, outLen);
     2195            return sp_RsaPrivate_2048(in, inLen, &key->d, NULL, NULL, NULL,
     2196                                      NULL, NULL, &key->n, out, outLen);
    20472197    #endif
    20482198#endif
     
    20642214    #endif
    20652215    #ifndef RSA_LOW_MEM
    2066             return sp_RsaPrivate_3072(in, inLen, &key->d, &key->p, &key->q,
    2067                                       &key->dP, &key->dQ, &key->u, &key->n,
    2068                                       out, outLen);
     2216            if ((mp_count_bits(&key->p) == 1536) &&
     2217                                             (mp_count_bits(&key->q) == 1536)) {
     2218                return sp_RsaPrivate_3072(in, inLen, &key->d, &key->p, &key->q,
     2219                                          &key->dP, &key->dQ, &key->u, &key->n,
     2220                                          out, outLen);
     2221            }
     2222            break;
    20692223    #else
    2070             return sp_RsaPrivate_3072(in, inLen, &key->d, &key->p, &key->q,
    2071                                       NULL, NULL, NULL, &key->n, out, outLen);
     2224            return sp_RsaPrivate_3072(in, inLen, &key->d, NULL, NULL, NULL,
     2225                                      NULL, NULL, &key->n, out, outLen);
    20722226    #endif
    20732227#endif
     
    20892243    #endif
    20902244    #ifndef RSA_LOW_MEM
    2091             return sp_RsaPrivate_4096(in, inLen, &key->d, &key->p, &key->q,
    2092                                       &key->dP, &key->dQ, &key->u, &key->n,
    2093                                       out, outLen);
     2245            if ((mp_count_bits(&key->p) == 2048) &&
     2246                                             (mp_count_bits(&key->q) == 2048)) {
     2247                return sp_RsaPrivate_4096(in, inLen, &key->d, &key->p, &key->q,
     2248                                          &key->dP, &key->dQ, &key->u, &key->n,
     2249                                          out, outLen);
     2250            }
     2251            break;
    20942252    #else
    2095             return sp_RsaPrivate_4096(in, inLen, &key->d, &key->p, &key->q,
    2096                                       NULL, NULL, NULL, &key->n, out, outLen);
     2253            return sp_RsaPrivate_4096(in, inLen, &key->d, NULL, NULL, NULL,
     2254                                      NULL, NULL, &key->n, out, outLen);
    20972255    #endif
    20982256#endif
     
    21052263#endif /* WOLFSSL_HAVE_SP_RSA */
    21062264
    2107 #ifdef WOLFSSL_SP_MATH
     2265#if defined(WOLFSSL_SP_MATH)
    21082266    (void)rng;
    21092267    WOLFSSL_MSG("SP Key Size Error");
     
    21162274    if (tmp == NULL)
    21172275        return MEMORY_E;
     2276#if !defined(WOLFSSL_RSA_PUBLIC_ONLY) && !defined(WOLFSSL_RSA_VERIFY_ONLY)
    21182277#ifdef WC_RSA_BLINDING
    21192278    rnd = (mp_int*)XMALLOC(sizeof(mp_int) * 2, key->heap, DYNAMIC_TYPE_RSA);
     
    21242283    rndi = rnd + 1;
    21252284#endif /* WC_RSA_BLINDING */
     2285#endif
    21262286#endif /* WOLFSSL_SMALL_STACK */
    21272287
     
    21292289        ret = MP_INIT_E;
    21302290
     2291#if !defined(WOLFSSL_RSA_PUBLIC_ONLY) && !defined(WOLFSSL_RSA_VERIFY_ONLY)
    21312292#ifdef WC_RSA_BLINDING
    21322293    if (ret == 0) {
     
    21392300    }
    21402301#endif
     2302#endif
    21412303
    21422304#ifndef TEST_UNPAD_CONSTANT_TIME
     
    21462308    if (ret == 0) {
    21472309        switch(type) {
    2148     #ifndef WOLFSSL_RSA_PUBLIC_ONLY
     2310    #if !defined(WOLFSSL_RSA_PUBLIC_ONLY) && !defined(WOLFSSL_RSA_VERIFY_ONLY)
    21492311        case RSA_PRIVATE_DECRYPT:
    21502312        case RSA_PRIVATE_ENCRYPT:
     
    21592321
    21602322            /* rnd = rnd^e */
     2323        #ifndef WOLFSSL_SP_MATH_ALL
    21612324            if (ret == 0 && mp_exptmod(rnd, &key->e, &key->n, rnd) != MP_OKAY)
    21622325                ret = MP_EXPTMOD_E;
     2326        #else
     2327            if (ret == 0 && mp_exptmod_nct(rnd, &key->e, &key->n,
     2328                                                              rnd) != MP_OKAY) {
     2329                ret = MP_EXPTMOD_E;
     2330            }
     2331        #endif
    21632332
    21642333            /* tmp = tmp*rnd mod n */
     
    22142383
    22152384                /* tmp = (tmpa - tmpb) * qInv (mod p) */
     2385#if defined(WOLFSSL_SP_MATH) || (defined(WOLFSSL_SP_MATH_ALL) && \
     2386                                              !defined(WOLFSSL_SP_INT_NEGATIVE))
     2387                if (ret == 0 && mp_submod(tmpa, tmpb, &key->p, tmp) != MP_OKAY)
     2388                    ret = MP_SUB_E;
     2389#else
    22162390                if (ret == 0 && mp_sub(tmpa, tmpb, tmp) != MP_OKAY)
    22172391                    ret = MP_SUB_E;
     2392#endif
    22182393
    22192394                if (ret == 0 && mp_mulmod(tmp, &key->u, &key->p,
     
    22542429        case RSA_PUBLIC_ENCRYPT:
    22552430        case RSA_PUBLIC_DECRYPT:
    2256         #ifdef WOLFSSL_XILINX_CRYPT
    2257             ret = wc_RsaFunctionXil(in, inLen, out, outLen, type, key, rng);
    2258         #else
    22592431            if (mp_exptmod_nct(tmp, &key->e, &key->n, tmp) != MP_OKAY)
    22602432                ret = MP_EXPTMOD_E;
    2261         #endif
    22622433            break;
    22632434        default:
     
    22722443            ret = RSA_BUFFER_E;
    22732444    }
     2445
     2446#ifndef WOLFSSL_XILINX_CRYPT
    22742447    if (ret == 0) {
    22752448        *outLen = keyLen;
     
    22772450             ret = MP_TO_E;
    22782451    }
     2452#endif
    22792453#else
    22802454    (void)type;
     
    25102684    CRYSError_t ret = 0;
    25112685    CRYS_RSAPrimeData_t primeData;
    2512     uint16_t actualOutLen = outLen;
     2686    word16 actualOutLen = outLen;
    25132687
    25142688    ret = CRYS_RSA_PKCS1v15_Decrypt(&key->ctx.privKey,
     
    25302704{
    25312705    CRYSError_t ret = 0;
    2532     uint16_t actualOutLen = outLen*sizeof(byte);
     2706    word16 actualOutLen = outLen*sizeof(byte);
    25332707    CRYS_RSAPrivUserContext_t  contextPrivate;
    25342708
     
    25932767#endif
    25942768
     2769#ifndef WOLFSSL_RSA_VERIFY_ONLY
    25952770#ifndef TEST_UNPAD_CONSTANT_TIME
    25962771#ifndef NO_RSA_BOUNDS_CHECK
     
    26122787
    26132788        if (mp_init(c) != MP_OKAY)
    2614             ret = MEMORY_E;
     2789            ret = MP_INIT_E;
    26152790        if (ret == 0) {
    26162791            if (mp_read_unsigned_bin(c, in, inLen) != 0)
     
    26422817    }
    26432818#endif /* NO_RSA_BOUNDS_CHECK */
     2819#endif
    26442820#endif
    26452821
     
    29903166        if (key->asyncDev.marker == WOLFSSL_ASYNC_MARKER_RSA &&
    29913167                                                   pad_type != WC_RSA_PSS_PAD) {
    2992             if (ret > 0) {
     3168            ret = key->asyncDev.event.ret;
     3169            if (ret >= 0) {
    29933170                /* convert result */
    29943171                byte* dataLen = (byte*)&key->dataLen;
     
    31323309                                                                 RsaKey* key)
    31333310{
    3134     return wc_RsaSSL_Verify_ex(in, inLen, out, outLen, key , WC_RSA_PKCSV15_PAD);
     3311    return wc_RsaSSL_Verify_ex(in, inLen, out, outLen, key, WC_RSA_PKCSV15_PAD);
    31353312}
    31363313
     
    31383315                         RsaKey* key, int pad_type)
    31393316{
     3317    return wc_RsaSSL_Verify_ex2(in, inLen, out, outLen, key, pad_type,
     3318            WC_HASH_TYPE_NONE);
     3319}
     3320
     3321int  wc_RsaSSL_Verify_ex2(const byte* in, word32 inLen, byte* out, word32 outLen,
     3322                         RsaKey* key, int pad_type, enum wc_HashType hash)
     3323{
    31403324    WC_RNG* rng;
    31413325
     
    31503334#endif
    31513335
     3336#ifndef WOLFSSL_PSS_SALT_LEN_DISCOVER
    31523337    return RsaPrivateDecryptEx((byte*)in, inLen, out, outLen, NULL, key,
    31533338        RSA_PUBLIC_DECRYPT, RSA_BLOCK_TYPE_1, pad_type,
    3154         WC_HASH_TYPE_NONE, WC_MGF1NONE, NULL, 0, 0, rng);
     3339        hash, wc_hash2mgf(hash), NULL, 0, RSA_PSS_SALT_LEN_DEFAULT, rng);
     3340#else
     3341    return RsaPrivateDecryptEx((byte*)in, inLen, out, outLen, NULL, key,
     3342        RSA_PUBLIC_DECRYPT, RSA_BLOCK_TYPE_1, pad_type,
     3343        hash, wc_hash2mgf(hash), NULL, 0, RSA_PSS_SALT_LEN_DISCOVER, rng);
     3344#endif
    31553345}
    31563346#endif
     
    34073597    hLen = wc_HashGetDigestSize(hash);
    34083598    if (hLen < 0)
    3409         return hLen;
     3599        return BAD_FUNC_ARG;
    34103600    if ((word32)hLen != digestLen)
    34113601        return BAD_FUNC_ARG;
     
    36743864        ret = mp_sub(p, q, &d);
    36753865
     3866#if !defined(WOLFSSL_SP_MATH) && (!defined(WOLFSSL_SP_MATH_ALL) || \
     3867                                               defined(WOLFSSL_SP_INT_NEGATIVE))
    36763868    if (ret == 0)
    36773869        ret = mp_abs(&d, &d);
     3870#endif
    36783871
    36793872    /* compare */
     
    38874080{
    38884081#ifndef WC_NO_RNG
    3889     mp_int p, q, tmp1, tmp2, tmp3;
     4082#ifdef WOLFSSL_SMALL_STACK
     4083    mp_int *p = (mp_int *)XMALLOC(sizeof *p, key->heap, DYNAMIC_TYPE_RSA);
     4084    mp_int *q = (mp_int *)XMALLOC(sizeof *q, key->heap, DYNAMIC_TYPE_RSA);
     4085    mp_int *tmp1 = (mp_int *)XMALLOC(sizeof *tmp1, key->heap, DYNAMIC_TYPE_RSA);
     4086    mp_int *tmp2 = (mp_int *)XMALLOC(sizeof *tmp2, key->heap, DYNAMIC_TYPE_RSA);
     4087    mp_int *tmp3 = (mp_int *)XMALLOC(sizeof *tmp3, key->heap, DYNAMIC_TYPE_RSA);
     4088#else
     4089    mp_int p_buf, *p = &p_buf;
     4090    mp_int q_buf, *q = &q_buf;
     4091    mp_int tmp1_buf, *tmp1 = &tmp1_buf;
     4092    mp_int tmp2_buf, *tmp2 = &tmp2_buf;
     4093    mp_int tmp3_buf, *tmp3 = &tmp3_buf;
     4094#endif
    38904095    int err, i, failCount, primeSz, isPrime = 0;
    38914096    byte* buf = NULL;
    38924097
    3893     if (key == NULL || rng == NULL)
    3894         return BAD_FUNC_ARG;
    3895 
    3896     if (!RsaSizeCheck(size))
    3897         return BAD_FUNC_ARG;
    3898 
    3899     if (e < 3 || (e & 1) == 0)
    3900         return BAD_FUNC_ARG;
     4098#ifdef WOLFSSL_SMALL_STACK
     4099    if ((p == NULL) ||
     4100        (q == NULL) ||
     4101        (tmp1 == NULL) ||
     4102        (tmp2 == NULL) ||
     4103        (tmp3 == NULL)) {
     4104      err = MEMORY_E;
     4105      goto out;
     4106    }
     4107#endif
     4108
     4109    if (key == NULL || rng == NULL) {
     4110        err = BAD_FUNC_ARG;
     4111        goto out;
     4112    }
     4113
     4114    if (!RsaSizeCheck(size)) {
     4115        err = BAD_FUNC_ARG;
     4116        goto out;
     4117    }
     4118
     4119    if (e < 3 || (e & 1) == 0) {
     4120        err = BAD_FUNC_ARG;
     4121        goto out;
     4122    }
    39014123
    39024124#if defined(WOLFSSL_CRYPTOCELL)
    39034125
    3904     return cc310_RSA_GenerateKeyPair(key, size, e);
     4126    err = cc310_RSA_GenerateKeyPair(key, size, e);
     4127    goto out;
    39054128
    39064129#endif /*WOLFSSL_CRYPTOCELL*/
     
    39084131#ifdef WOLF_CRYPTO_CB
    39094132    if (key->devId != INVALID_DEVID) {
    3910         int ret = wc_CryptoCb_MakeRsaKey(key, size, e, rng);
    3911         if (ret != CRYPTOCB_UNAVAILABLE)
    3912             return ret;
     4133        err = wc_CryptoCb_MakeRsaKey(key, size, e, rng);
     4134        if (err != CRYPTOCB_UNAVAILABLE)
     4135            goto out;
    39134136        /* fall-through when unavailable */
    39144137    }
     
    39214144        /* TODO: Not implemented */
    39224145    #elif defined(HAVE_INTEL_QA)
    3923         return IntelQaRsaKeyGen(&key->asyncDev, key, size, e, rng);
     4146        err = IntelQaRsaKeyGen(&key->asyncDev, key, size, e, rng);
     4147        goto out;
    39244148    #else
    39254149        if (wc_AsyncTestInit(&key->asyncDev, ASYNC_TEST_RSA_MAKE)) {
     
    39294153            testDev->rsaMake.size = size;
    39304154            testDev->rsaMake.e = e;
    3931             return WC_PENDING_E;
     4155            err = WC_PENDING_E;
     4156            goto out;
    39324157        }
    39334158    #endif
     
    39354160#endif
    39364161
    3937     err = mp_init_multi(&p, &q, &tmp1, &tmp2, &tmp3, NULL);
     4162    err = mp_init_multi(p, q, tmp1, tmp2, tmp3, NULL);
    39384163
    39394164    if (err == MP_OKAY)
    3940         err = mp_set_int(&tmp3, e);
     4165        err = mp_set_int(tmp3, e);
    39414166
    39424167    /* The failCount value comes from NIST FIPS 186-4, section B.3.3,
     
    39704195                buf[primeSz-1] |= 0x01;
    39714196                /* load value */
    3972                 err = mp_read_unsigned_bin(&p, buf, primeSz);
     4197                err = mp_read_unsigned_bin(p, buf, primeSz);
    39734198            }
    39744199
    39754200            if (err == MP_OKAY)
    3976                 err = _CheckProbablePrime(&p, NULL, &tmp3, size, &isPrime, rng);
     4201                err = _CheckProbablePrime(p, NULL, tmp3, size, &isPrime, rng);
    39774202
    39784203#ifdef HAVE_FIPS
     
    40054230                buf[primeSz-1] |= 0x01;
    40064231                /* load value */
    4007                 err = mp_read_unsigned_bin(&q, buf, primeSz);
     4232                err = mp_read_unsigned_bin(q, buf, primeSz);
    40084233            }
    40094234
    40104235            if (err == MP_OKAY)
    4011                 err = _CheckProbablePrime(&p, &q, &tmp3, size, &isPrime, rng);
     4236                err = _CheckProbablePrime(p, q, tmp3, size, &isPrime, rng);
    40124237
    40134238#ifdef HAVE_FIPS
     
    40284253    }
    40294254
    4030     if (err == MP_OKAY && mp_cmp(&p, &q) < 0) {
    4031         err = mp_copy(&p, &tmp1);
     4255    if (err == MP_OKAY && mp_cmp(p, q) < 0) {
     4256        err = mp_copy(p, tmp1);
    40324257        if (err == MP_OKAY)
    4033             err = mp_copy(&q, &p);
     4258            err = mp_copy(q, p);
    40344259        if (err == MP_OKAY)
    4035             mp_copy(&tmp1, &q);
     4260            mp_copy(tmp1, q);
    40364261    }
    40374262
     
    40444269    /* Software Key Calculation */
    40454270    if (err == MP_OKAY)                /* tmp1 = p-1 */
    4046         err = mp_sub_d(&p, 1, &tmp1);
     4271        err = mp_sub_d(p, 1, tmp1);
    40474272    if (err == MP_OKAY)                /* tmp2 = q-1 */
    4048         err = mp_sub_d(&q, 1, &tmp2);
     4273        err = mp_sub_d(q, 1, tmp2);
    40494274#ifdef WC_RSA_BLINDING
    40504275    if (err == MP_OKAY)                /* tmp3 = order of n */
    4051         err = mp_mul(&tmp1, &tmp2, &tmp3);
     4276        err = mp_mul(tmp1, tmp2, tmp3);
    40524277#else
    40534278    if (err == MP_OKAY)                /* tmp3 = lcm(p-1, q-1), last loop */
    4054         err = mp_lcm(&tmp1, &tmp2, &tmp3);
     4279        err = mp_lcm(tmp1, tmp2, tmp3);
    40554280#endif
    40564281    /* make key */
     
    40614286    if (err == MP_OKAY) {
    40624287        do {
    4063             err = mp_rand(&key->p, get_digit_count(&tmp3), rng);
     4288            err = mp_rand(&key->p, get_digit_count(tmp3), rng);
    40644289            if (err == MP_OKAY)
    40654290                err = mp_set_bit(&key->p, 0);
     
    40674292                err = mp_set_bit(&key->p, size - 1);
    40684293            if (err == MP_OKAY)
    4069                 err = mp_gcd(&key->p, &tmp3, &key->q);
     4294                err = mp_gcd(&key->p, tmp3, &key->q);
    40704295        }
    40714296        while ((err == MP_OKAY) && !mp_isone(&key->q));
     
    40754300#endif
    40764301    if (err == MP_OKAY)                /* key->d = 1/e mod lcm(p-1, q-1) */
    4077         err = mp_invmod(&key->e, &tmp3, &key->d);
     4302        err = mp_invmod(&key->e, tmp3, &key->d);
    40784303#ifdef WC_RSA_BLINDING
    40794304    /* Take off blinding from d and reset e */
    40804305    if (err == MP_OKAY)
    4081         err = mp_mulmod(&key->d, &key->p, &tmp3, &key->d);
     4306        err = mp_mulmod(&key->d, &key->p, tmp3, &key->d);
    40824307    if (err == MP_OKAY)
    40834308        err = mp_set_int(&key->e, (mp_digit)e);
    40844309#endif
    40854310    if (err == MP_OKAY)                /* key->n = pq */
    4086         err = mp_mul(&p, &q, &key->n);
     4311        err = mp_mul(p, q, &key->n);
    40874312    if (err == MP_OKAY)                /* key->dP = d mod(p-1) */
    4088         err = mp_mod(&key->d, &tmp1, &key->dP);
     4313        err = mp_mod(&key->d, tmp1, &key->dP);
    40894314    if (err == MP_OKAY)                /* key->dQ = d mod(q-1) */
    4090         err = mp_mod(&key->d, &tmp2, &key->dQ);
     4315        err = mp_mod(&key->d, tmp2, &key->dQ);
    40914316#ifdef WOLFSSL_MP_INVMOD_CONSTANT_TIME
    40924317    if (err == MP_OKAY)                /* key->u = 1/q mod p */
    4093         err = mp_invmod(&q, &p, &key->u);
     4318        err = mp_invmod(q, p, &key->u);
    40944319#else
    40954320    if (err == MP_OKAY)
    4096         err = mp_sub_d(&p, 2, &tmp3);
     4321        err = mp_sub_d(p, 2, tmp3);
    40974322    if (err == MP_OKAY)                /* key->u = 1/q mod p = q^p-2 mod p */
    4098         err = mp_exptmod(&q, &tmp3 , &p, &key->u);
     4323        err = mp_exptmod(q, tmp3 , p, &key->u);
    40994324#endif
    41004325    if (err == MP_OKAY)
    4101         err = mp_copy(&p, &key->p);
     4326        err = mp_copy(p, &key->p);
    41024327    if (err == MP_OKAY)
    4103         err = mp_copy(&q, &key->q);
     4328        err = mp_copy(q, &key->q);
    41044329
    41054330#ifdef HAVE_WOLF_BIGINT
     
    41264351        key->type = RSA_PRIVATE;
    41274352
    4128     mp_clear(&tmp1);
    4129     mp_clear(&tmp2);
    4130     mp_clear(&tmp3);
    4131     mp_clear(&p);
    4132     mp_clear(&q);
     4353    mp_clear(tmp1);
     4354    mp_clear(tmp2);
     4355    mp_clear(tmp3);
     4356    mp_clear(p);
     4357    mp_clear(q);
    41334358
    41344359#if defined(WOLFSSL_KEY_GEN) && !defined(WOLFSSL_NO_RSA_KEY_CHECK)
     
    41404365    if (err != 0) {
    41414366        wc_FreeRsaKey(key);
    4142         return err;
     4367        goto out;
    41434368    }
    41444369
     
    41484373    }
    41494374#endif
    4150     return 0;
     4375
     4376    err = 0;
     4377
     4378  out:
     4379
     4380#ifdef WOLFSSL_SMALL_STACK
     4381    if (p)
     4382        XFREE(p, key->heap, DYNAMIC_TYPE_RSA);
     4383    if (q)
     4384        XFREE(q, key->heap, DYNAMIC_TYPE_RSA);
     4385    if (tmp1)
     4386        XFREE(tmp1, key->heap, DYNAMIC_TYPE_RSA);
     4387    if (tmp2)
     4388        XFREE(tmp2, key->heap, DYNAMIC_TYPE_RSA);
     4389    if (tmp3)
     4390        XFREE(tmp3, key->heap, DYNAMIC_TYPE_RSA);
     4391#endif
     4392
     4393    return err;
    41514394#else
    41524395    return NOT_COMPILED_IN;
     
    41604403int wc_RsaSetRNG(RsaKey* key, WC_RNG* rng)
    41614404{
     4405    if (key == NULL || rng == NULL)
     4406        return BAD_FUNC_ARG;
     4407
     4408    key->rng = rng;
     4409
     4410    return 0;
     4411}
     4412#endif /* WC_RSA_BLINDING */
     4413
     4414#ifdef WC_RSA_NONBLOCK
     4415int wc_RsaSetNonBlock(RsaKey* key, RsaNb* nb)
     4416{
    41624417    if (key == NULL)
    41634418        return BAD_FUNC_ARG;
    41644419
    4165     key->rng = rng;
    4166 
    4167     return 0;
    4168 }
    4169 #endif /* WC_RSA_BLINDING */
    4170 
    4171 #ifdef WC_RSA_NONBLOCK
    4172 int wc_RsaSetNonBlock(RsaKey* key, RsaNb* nb)
    4173 {
    4174     if (key == NULL)
    4175         return BAD_FUNC_ARG;
    4176 
    41774420    if (nb) {
    41784421        XMEMSET(nb, 0, sizeof(RsaNb));
Note: See TracChangeset for help on using the changeset viewer.