- Timestamp:
- Jun 22, 2021, 9:00:19 PM (3 years ago)
- 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/dh.c
r457 r464 931 931 key->heap = heap; /* for XMALLOC/XFREE in future */ 932 932 933 #if !defined(WOLFSSL_QT) && !defined(OPENSSL_ALL) 933 #ifdef WOLFSSL_DH_EXTRA 934 if (mp_init_multi(&key->p, &key->g, &key->q, &key->pub, &key->priv, NULL) != MP_OKAY) 935 #else 934 936 if (mp_init_multi(&key->p, &key->g, &key->q, NULL, NULL, NULL) != MP_OKAY) 935 #else936 if (mp_init_multi(&key->p,&key->g,&key->q,&key->pub,&key->priv,NULL) != MP_OKAY)937 937 #endif 938 938 return MEMORY_E; … … 961 961 mp_clear(&key->g); 962 962 mp_clear(&key->q); 963 #ifdef WOLFSSL_DH_EXTRA 964 mp_clear(&key->pub); 965 mp_forcezero(&key->priv); 966 #endif 963 967 964 968 #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_DH) … … 1149 1153 1150 1154 mp_forcezero(tmpX); 1151 mp_clear(tmpX);1152 1155 mp_clear(tmpQ); 1153 1156 #ifdef WOLFSSL_SMALL_STACK … … 1207 1210 } 1208 1211 1209 ret = wc_RNG_GenerateBlock(rng, priv, sz); 1212 if (sz > *privSz) 1213 ret = WC_KEY_SIZE_E; 1214 1215 if (ret == 0) 1216 ret = wc_RNG_GenerateBlock(rng, priv, sz); 1210 1217 1211 1218 if (ret == 0) { … … 1231 1238 int ret = 0; 1232 1239 #ifndef WOLFSSL_SP_MATH 1240 word32 binSz = 0; 1233 1241 #ifdef WOLFSSL_SMALL_STACK 1234 1242 mp_int* x; … … 1255 1263 #endif 1256 1264 1257 #if ndef WOLFSSL_SP_MATH1265 #if !defined(WOLFSSL_SP_MATH) 1258 1266 #ifdef WOLFSSL_SMALL_STACK 1259 1267 x = (mp_int*)XMALLOC(sizeof(mp_int), key->heap, DYNAMIC_TYPE_DH); … … 1280 1288 ret = MP_EXPTMOD_E; 1281 1289 1290 if (ret == 0) { 1291 binSz = mp_unsigned_bin_size(y); 1292 if (binSz > *pubSz) { 1293 ret = WC_KEY_SIZE_E; 1294 } 1295 } 1296 1282 1297 if (ret == 0 && mp_to_unsigned_bin(y, pub) != MP_OKAY) 1283 1298 ret = MP_TO_E; 1284 1299 1285 1300 if (ret == 0) 1286 *pubSz = mp_unsigned_bin_size(y);1301 *pubSz = binSz; 1287 1302 1288 1303 mp_clear(y); … … 1468 1483 } 1469 1484 1485 /* SP 800-56Ar3, section 5.6.2.3.1, process step 2 */ 1470 1486 if (ret == 0 && prime != NULL) { 1471 1487 #ifdef WOLFSSL_HAVE_SP_DH … … 1486 1502 else 1487 1503 #endif 1488 #ifdef WOLFSSL_SP_ NO_40961504 #ifdef WOLFSSL_SP_4096 1489 1505 if (mp_count_bits(&key->p) == 4096) { 1490 1506 ret = sp_ModExp_4096(y, q, p, y); … … 1497 1513 1498 1514 { 1499 /* SP 800-56Ar3, section 5.6.2.3.1, process step 2 */ 1500 #ifndef WOLFSSL_SP_MATH 1515 #if !defined(WOLFSSL_SP_MATH) 1501 1516 /* calculate (y^q) mod(p), store back into y */ 1502 1517 if (mp_exptmod(y, q, p, y) != MP_OKAY) … … 1783 1798 #endif 1784 1799 { 1785 #if ndef WOLFSSL_SP_MATH1800 #if !defined(WOLFSSL_SP_MATH) 1786 1801 if (mp_exptmod(&key->g, privateKey, &key->p, checkKey) != MP_OKAY) 1787 1802 ret = MP_EXPTMOD_E; … … 1799 1814 1800 1815 mp_forcezero(privateKey); 1801 mp_clear(privateKey);1802 1816 mp_clear(publicKey); 1803 1817 mp_clear(checkKey); … … 1835 1849 } 1836 1850 1837 1838 1851 static int wc_DhAgree_Sync(DhKey* key, byte* agree, word32* agreeSz, 1839 1852 const byte* priv, word32 privSz, const byte* otherPub, word32 pubSz) … … 1841 1854 int ret = 0; 1842 1855 #ifdef WOLFSSL_SMALL_STACK 1843 mp_int* y ;1844 #if ndef WOLFSSL_SP_MATH1845 mp_int* x ;1846 mp_int* z ;1856 mp_int* y = NULL; 1857 #if !defined(WOLFSSL_SP_MATH) 1858 mp_int* x = NULL; 1859 mp_int* z = NULL; 1847 1860 #endif 1848 1861 #else 1849 1862 mp_int y[1]; 1850 #if ndef WOLFSSL_SP_MATH1863 #if !defined(WOLFSSL_SP_MATH) 1851 1864 mp_int x[1]; 1852 1865 mp_int z[1]; … … 1870 1883 if (y == NULL) 1871 1884 return MEMORY_E; 1872 #if ndef WOLFSSL_SP_MATH1885 #if !defined(WOLFSSL_SP_MATH) 1873 1886 x = (mp_int*)XMALLOC(sizeof(mp_int), key->heap, DYNAMIC_TYPE_DH); 1874 1887 if (x == NULL) { … … 1899 1912 mp_clear(y); 1900 1913 #ifdef WOLFSSL_SMALL_STACK 1901 #if ndef WOLFSSL_SP_MATH1914 #if !defined(WOLFSSL_SP_MATH) 1902 1915 XFREE(z, key->heap, DYNAMIC_TYPE_DH); 1903 1916 XFREE(x, key->heap, DYNAMIC_TYPE_DH); … … 1921 1934 mp_clear(y); 1922 1935 #ifdef WOLFSSL_SMALL_STACK 1923 #if ndef WOLFSSL_SP_MATH1936 #if !defined(WOLFSSL_SP_MATH) 1924 1937 XFREE(z, key->heap, DYNAMIC_TYPE_DH); 1925 1938 XFREE(x, key->heap, DYNAMIC_TYPE_DH); … … 1943 1956 mp_clear(y); 1944 1957 #ifdef WOLFSSL_SMALL_STACK 1945 #if ndef WOLFSSL_SP_MATH1958 #if !defined(WOLFSSL_SP_MATH) 1946 1959 XFREE(z, key->heap, DYNAMIC_TYPE_DH); 1947 1960 XFREE(x, key->heap, DYNAMIC_TYPE_DH); … … 1954 1967 #endif 1955 1968 1956 #if ndef WOLFSSL_SP_MATH1969 #if !defined(WOLFSSL_SP_MATH) 1957 1970 if (mp_init_multi(x, y, z, 0, 0, 0) != MP_OKAY) { 1958 1971 #ifdef WOLFSSL_SMALL_STACK … … 1986 1999 mp_clear(y); 1987 2000 mp_forcezero(x); 2001 #else 2002 ret = WC_KEY_SIZE_E; 1988 2003 #endif 1989 2004 1990 2005 #ifdef WOLFSSL_SMALL_STACK 1991 #if ndef WOLFSSL_SP_MATH2006 #if !defined(WOLFSSL_SP_MATH) 1992 2007 XFREE(z, key->heap, DYNAMIC_TYPE_DH); 1993 2008 XFREE(x, key->heap, DYNAMIC_TYPE_DH); … … 2066 2081 } 2067 2082 2068 #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL) 2083 #ifdef WOLFSSL_DH_EXTRA 2084 WOLFSSL_LOCAL int wc_DhKeyCopy(DhKey* src, DhKey* dst) 2085 { 2086 int ret; 2087 2088 if (!src || !dst || src == dst) { 2089 WOLFSSL_MSG("Parameters not provided or are the same"); 2090 return BAD_FUNC_ARG; 2091 } 2092 2093 if ((ret = mp_copy(&src->p, &dst->p)) != MP_OKAY) { 2094 WOLFSSL_MSG("mp_copy error"); 2095 return ret; 2096 } 2097 2098 if ((ret = mp_copy(&src->g, &dst->g)) != MP_OKAY) { 2099 WOLFSSL_MSG("mp_copy error"); 2100 return ret; 2101 } 2102 2103 if ((ret = mp_copy(&src->q, &dst->q)) != MP_OKAY) { 2104 WOLFSSL_MSG("mp_copy error"); 2105 return ret; 2106 } 2107 2108 if ((ret = mp_copy(&src->pub, &dst->pub)) != MP_OKAY) { 2109 WOLFSSL_MSG("mp_copy error"); 2110 return ret; 2111 } 2112 2113 if ((ret = mp_copy(&src->priv, &dst->priv)) != MP_OKAY) { 2114 WOLFSSL_MSG("mp_copy error"); 2115 return ret; 2116 } 2117 2118 dst->heap = src->heap; 2119 2120 return MP_OKAY; 2121 } 2122 2069 2123 /* Sets private and public key in DhKey if both are available, otherwise sets 2070 either private or public key, depending on which is available. 2071 Returns WOLFSSL_SUCCESS if at least one of the keys was set. */ 2072 WOLFSSL_LOCAL int wc_DhSetFullKeys(DhKey* key,const byte* priv_key,word32 privSz, 2073 const byte* pub_key, word32 pubSz) 2074 { 2075 byte havePriv = 0; 2076 byte havePub = 0; 2077 mp_int* keyPriv = NULL; 2078 mp_int* keyPub = NULL; 2124 either private or public key, depending on which is available. */ 2125 int wc_DhImportKeyPair(DhKey* key, const byte* priv, word32 privSz, 2126 const byte* pub, word32 pubSz) 2127 { 2128 byte havePriv, havePub; 2129 mp_int *keyPriv = NULL, *keyPub = NULL; 2079 2130 2080 2131 if (key == NULL) { … … 2082 2133 } 2083 2134 2084 havePriv = ( (priv _key!= NULL) && (privSz > 0) );2085 havePub = ( (pub _key!= NULL) && (pubSz > 0) );2135 havePriv = ( (priv != NULL) && (privSz > 0) ); 2136 havePub = ( (pub != NULL) && (pubSz > 0) ); 2086 2137 2087 2138 if (!havePub && !havePriv) { … … 2089 2140 return BAD_FUNC_ARG; 2090 2141 } 2142 2091 2143 /* Set Private Key */ 2092 if (havePriv == TRUE) {2144 if (havePriv) { 2093 2145 /* may have leading 0 */ 2094 if (priv _key[0] == 0) {2095 privSz--; priv _key++;2146 if (priv[0] == 0) { 2147 privSz--; priv++; 2096 2148 } 2097 2149 if (mp_init(&key->priv) != MP_OKAY) 2098 havePriv = FALSE;2099 } 2100 2101 if (havePriv == TRUE) {2102 if (mp_read_unsigned_bin(&key->priv, priv_key, privSz) != MP_OKAY) {2103 havePriv = FALSE;2150 havePriv = 0; 2151 } 2152 if (havePriv) { 2153 if (mp_read_unsigned_bin(&key->priv, priv, privSz) != MP_OKAY) { 2154 mp_clear(&key->priv); 2155 havePriv = 0; 2104 2156 } else { 2105 2157 keyPriv = &key->priv; 2106 WOLFSSL_MSG("DH Private Key Set .");2158 WOLFSSL_MSG("DH Private Key Set"); 2107 2159 } 2108 2160 } 2109 2161 2110 2162 /* Set Public Key */ 2111 if (havePub == TRUE) {2163 if (havePub) { 2112 2164 /* may have leading 0 */ 2113 if (pub _key[0] == 0) {2114 pubSz--; pub _key++;2165 if (pub[0] == 0) { 2166 pubSz--; pub++; 2115 2167 } 2116 2168 if (mp_init(&key->pub) != MP_OKAY) 2117 havePub = FALSE;2118 } 2119 2120 if (havePub == TRUE) {2121 if (mp_read_unsigned_bin(&key->pub, pub_key, pubSz) != MP_OKAY) {2122 havePub = FALSE;2169 havePub = 0; 2170 } 2171 if (havePub) { 2172 if (mp_read_unsigned_bin(&key->pub, pub, pubSz) != MP_OKAY) { 2173 mp_clear(&key->pub); 2174 havePub = 0; 2123 2175 } else { 2124 2176 keyPub = &key->pub; 2125 WOLFSSL_MSG("DH Public Key Set .");2126 } 2127 } 2128 /* Free Memory if error occur ed */2129 if (havePriv == FALSE&& keyPriv != NULL)2177 WOLFSSL_MSG("DH Public Key Set"); 2178 } 2179 } 2180 /* Free Memory if error occurred */ 2181 if (havePriv == 0 && keyPriv != NULL) 2130 2182 mp_clear(keyPriv); 2131 if (havePub == FALSE&& keyPub != NULL)2183 if (havePub == 0 && keyPub != NULL) 2132 2184 mp_clear(keyPub); 2133 2185 2134 /* WOLFSSL_SUCCESS if private or public was set else WOLFSSL_FAILURE */ 2135 return havePriv || havePub; 2136 } 2137 #endif 2186 if (havePriv == 0 && havePub == 0) { 2187 return MEMORY_E; 2188 } 2189 2190 return 0; 2191 } 2192 2193 /* Can be used with WOLFSSL_DH_EXTRA when key is loaded with 2194 wc_DhKeyDecode or wc_DhImportKeyPair */ 2195 int wc_DhExportKeyPair(DhKey* key, byte* priv, word32* pPrivSz, 2196 byte* pub, word32* pPubSz) 2197 { 2198 int ret = 0; 2199 word32 pubSz, privSz; 2200 2201 if (key == NULL || (priv && pPrivSz == NULL) || (pub && pPubSz == NULL)) { 2202 return BAD_FUNC_ARG; 2203 } 2204 2205 if (priv) { 2206 privSz = mp_unsigned_bin_size(&key->priv); 2207 if (privSz > *pPrivSz) { 2208 return BUFFER_E; 2209 } 2210 *pPrivSz = privSz; 2211 ret |= mp_to_unsigned_bin(&key->priv, priv); 2212 } 2213 2214 if (pub) { 2215 pubSz = mp_unsigned_bin_size(&key->pub); 2216 if (pubSz > *pPubSz) { 2217 return BUFFER_E; 2218 } 2219 *pPubSz = pubSz; 2220 ret |= mp_to_unsigned_bin(&key->pub, pub); 2221 } 2222 2223 if (ret != 0) 2224 ret = ASN_DH_KEY_E; 2225 return ret; 2226 } 2227 2228 #endif /* WOLFSSL_DH_EXTRA */ 2138 2229 2139 2230 static int _DhSetKey(DhKey* key, const byte* p, word32 pSz, const byte* g, … … 2368 2459 if (ret == 0) { 2369 2460 /* at this point tmp generates a group of order q mod p */ 2461 #ifndef USE_FAST_MATH 2462 /* Exchanging is quick when the data pointer can be copied. */ 2370 2463 mp_exch(&tmp, &dh->g); 2464 #else 2465 mp_copy(&tmp, &dh->g); 2466 #endif 2371 2467 } 2372 2468
Note:
See TracChangeset
for help on using the changeset viewer.