From 73b4d78d5ba95f756cddf8aca7dc2b74524ba593 Mon Sep 17 00:00:00 2001 From: Juliusz Sosinowicz Date: Thu, 5 Mar 2020 14:33:58 +0100 Subject: [PATCH 001/298] Added partial support for wpa_supplicant, hostapd, and cjose: - Moved `SetECKeyInternal` and `SetECKeyExternal` to `internal.h` to allow usage outside of `ssl.c` - Added `asn1t.h` - Implemented the `IMPLEMENT_ASN1_FUNCTIONS` macro for a small subset of ASN1 tags -- So far only `X509_ALGOR` and `ASN1_BIT_STRING` are supported - Implemented `BN_mod_add` function - Allow for setting of `EC_KEY` export form through EC_KEY_set_conv_form - Implemented `i2o_ECPublicKey` - Implemented `EC_POINT_copy` - Implemented deriving DH and ECDH keys in `EVP_PKEY_CTX`. Functions added: -- `EVP_PKEY_derive_init` -- `EVP_PKEY_derive_set_peer` -- `EVP_PKEY_derive` - Implemented `EVP_PKEY_get0_DH` - Implemented `X509_ALGOR_new` - Implemented `X509_ALGOR_free` - Implemented `X509_ALGOR_set0` - Implemented `X509_PUBKEY_new` - Implemented `X509_PUBKEY_free` - Implemented `X509_PUBKEY_set` - Implemented `RSA_padding_add_PKCS1_PSS` - Implemented `RSA_verify_PKCS1_PSS` - Changed second parameter of `wolfSSL_d2i_PUBKEY` to be constant - Corrected long names in `asn.h` - Added `wc_ecc_get_generator` as a way to get the generator point of a curve - Added `wc_ecc_export_point_der_ex` to export an ECC point in compressed or uncompressed format with one API - Added `wc_ecc_export_point_der_compressed` to export a point in an `ecc_point` structure in compressed DER format - Added 'wc_RsaSSL_Verify_ex` which adds the option to choose a padding type - Added `wc_RsaPad_ex` and `wc_RsaUnPad_ex` to `rsa.h` as `WOLFSSL_LOCAL` functions - `CopyDecodedToX509` now fills `x509->key` and `x509->algor` when populating x509 - `wolfSSL_EVP_CipherInit` now uses `wc_AesGcmSetExtIV` to set the IV so that it is copied to `ctx->iv` by `wolfSSL_StoreExternalIV` - Added error checking to `wolfSSL_EVP_PKEY_get_der` - `wolfSSL_X509_ALGOR_get0` now attempts to return something in all parameters - Refactored `wolfSSL_EC_KEY_new` to use `*_new` functions when available - Added `setupPoint` to set the internal point if not yet set - Always set external point in `wolfSSL_ECPoint_d2i` - Added compressed point support to `wolfSSL_EC_POINT_point2oct` - Fix `wolfSSL_EC_POINT_mul` so that it will calculate the full `generator * n + q * m` then OpenSSL does - Added `WOLFSSL_RSA_GetRNG` helper function to get a `WC_RNG` from `WOLFSSL_RSA` - Correct short names in `wolfssl_object_info` - Added all currently supported curves to `wolfssl_object_info` - Added `oidCurveType` to `oid2nid` - Add more padding types to `wolfSSL_RSA_public_decrypt` - Fix `keysize` in `wc_ecc_import_point_der` - Added tests for new additions --- configure.ac | 4 +- src/internal.c | 21 +- src/ssl.c | 1485 ++++++++++++++++++++++++++++-------- tests/api.c | 316 +++++++- wolfcrypt/src/ecc.c | 111 ++- wolfcrypt/src/evp.c | 112 ++- wolfcrypt/src/rsa.c | 18 +- wolfssl/internal.h | 7 +- wolfssl/openssl/asn1.h | 65 ++ wolfssl/openssl/asn1t.h | 30 + wolfssl/openssl/bn.h | 4 + wolfssl/openssl/dh.h | 2 +- wolfssl/openssl/ec.h | 11 + wolfssl/openssl/evp.h | 15 +- wolfssl/openssl/include.am | 1 + wolfssl/openssl/rsa.h | 9 + wolfssl/openssl/ssl.h | 9 + wolfssl/openssl/x509.h | 3 + wolfssl/ssl.h | 19 +- wolfssl/wolfcrypt/asn.h | 4 +- wolfssl/wolfcrypt/ecc.h | 9 +- wolfssl/wolfcrypt/rsa.h | 11 + 22 files changed, 1885 insertions(+), 381 deletions(-) create mode 100644 wolfssl/openssl/asn1t.h diff --git a/configure.ac b/configure.ac index d6307c369..54e17e850 100644 --- a/configure.ac +++ b/configure.ac @@ -565,14 +565,14 @@ AC_ARG_ENABLE([opensslall], [ ENABLED_OPENSSLALL=$enableval ], [ ENABLED_OPENSSLALL=no ] ) -if test "$ENABLED_LIBWEBSOCKETS" = "yes" || test "$ENABLED_OPENVPN" = "yes" +if test "$ENABLED_LIBWEBSOCKETS" = "yes" || test "$ENABLED_OPENVPN" = "yes" || test "$ENABLED_WPAS" = "yes" then ENABLED_OPENSSLALL="yes" fi if test "$ENABLED_OPENSSLALL" = "yes" then -AM_CFLAGS="-DOPENSSL_ALL -DWOLFSSL_EITHER_SIDE $AM_CFLAGS" +AM_CFLAGS="-DOPENSSL_ALL -DWOLFSSL_EITHER_SIDE -DWC_RSA_NO_PADDING -DWC_RSA_PSS $AM_CFLAGS" fi # OPENSSL Extra Compatibility diff --git a/src/internal.c b/src/internal.c index 0fb9a36e7..4730ef042 100644 --- a/src/internal.c +++ b/src/internal.c @@ -9528,7 +9528,21 @@ int CopyDecodedToX509(WOLFSSL_X509* x509, DecodedCert* dCert) else ret = MEMORY_E; #if defined(OPENSSL_ALL) - x509->key.pubKeyOID = dCert->keyOID; + if (!ret) { + x509->key.pubKeyOID = dCert->keyOID; + + if (!x509->key.algor) { + x509->key.algor = wolfSSL_X509_ALGOR_new(); + } else { + wolfSSL_ASN1_OBJECT_free(x509->key.algor->algorithm); + } + x509->key.algor->algorithm = wolfSSL_OBJ_nid2obj(dCert->keyOID); + + wolfSSL_EVP_PKEY_free(x509->key.pkey); + x509->key.pkey = wolfSSL_d2i_PUBKEY(NULL, + &dCert->publicKey, + dCert->pubKeySize); + } #endif } @@ -9545,9 +9559,8 @@ int CopyDecodedToX509(WOLFSSL_X509* x509, DecodedCert* dCert) x509->sigOID = dCert->signatureOID; } #if defined(OPENSSL_ALL) - if (x509->algor.algorithm == NULL) { - x509->algor.algorithm = wolfSSL_OBJ_nid2obj(dCert->signatureOID); - } + wolfSSL_ASN1_OBJECT_free(x509->algor.algorithm); + x509->algor.algorithm = wolfSSL_OBJ_nid2obj(dCert->signatureOID); #endif } diff --git a/src/ssl.c b/src/ssl.c index 1a5b0086c..8d6973fde 100755 --- a/src/ssl.c +++ b/src/ssl.c @@ -8015,7 +8015,7 @@ WOLFSSL_EVP_PKEY* wolfSSL_d2i_PUBKEY_bio(WOLFSSL_BIO* bio, } if (wolfSSL_BIO_read(bio, mem, (int)memSz) == memSz) { - pkey = wolfSSL_d2i_PUBKEY(NULL, &mem, memSz); + pkey = wolfSSL_d2i_PUBKEY(NULL, (const unsigned char**)&mem, memSz); if (out != NULL && pkey != NULL) { *out = pkey; } @@ -8036,8 +8036,8 @@ WOLFSSL_EVP_PKEY* wolfSSL_d2i_PUBKEY_bio(WOLFSSL_BIO* bio, * returns a pointer to a new WOLFSSL_EVP_PKEY structure on success and NULL * on fail */ -WOLFSSL_EVP_PKEY* wolfSSL_d2i_PUBKEY(WOLFSSL_EVP_PKEY** out, unsigned char** in, - long inSz) +WOLFSSL_EVP_PKEY* wolfSSL_d2i_PUBKEY(WOLFSSL_EVP_PKEY** out, + const unsigned char** in, long inSz) { WOLFSSL_EVP_PKEY* pkey = NULL; const unsigned char* mem; @@ -8619,7 +8619,7 @@ int wolfSSL_ASN1_BIT_STRING_set_bit(WOLFSSL_ASN1_BIT_STRING* str, int pos, int val) { int bytes_cnt, bit; - char* temp; + byte* temp; if (!str || (val != 0 && val != 1) || pos < 0) { return WOLFSSL_FAILURE; @@ -8629,7 +8629,7 @@ int wolfSSL_ASN1_BIT_STRING_set_bit(WOLFSSL_ASN1_BIT_STRING* str, int pos, bit = 1<<(7-(pos%8)); if (bytes_cnt+1 > str->length) { - if (!(temp = (char*)XREALLOC(str->data, bytes_cnt+1, NULL, + if (!(temp = (byte*)XREALLOC(str->data, bytes_cnt+1, NULL, DYNAMIC_TYPE_OPENSSL))) { return WOLFSSL_FAILURE; } @@ -10020,7 +10020,7 @@ void* wolfSSL_X509_get_ext_d2i(const WOLFSSL_X509* x509, int nid, int* c, bit_str->type = KEY_USAGE_OID; bit_str->flags = 0; bit_str->length = sizeof(word16); - bit_str->data = (char*)XMALLOC(bit_str->length, NULL, DYNAMIC_TYPE_OPENSSL); + bit_str->data = (byte*)XMALLOC(bit_str->length, NULL, DYNAMIC_TYPE_OPENSSL); if (bit_str->data == NULL) { wolfSSL_ASN1_BIT_STRING_free(bit_str); return NULL; @@ -15986,7 +15986,7 @@ int wolfSSL_get_server_tmp_key(const WOLFSSL* ssl, WOLFSSL_EVP_PKEY** pkey) #ifdef HAVE_ECC if (ssl->peerEccKey != NULL) { unsigned char* der; - unsigned char* pt; + const unsigned char* pt; unsigned int derSz = 0; int sz; @@ -17658,12 +17658,12 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) WOLFSSL_ENTER("wolfSSL_EVP_CipherInit"); if (ctx == NULL) { WOLFSSL_MSG("no ctx"); - return 0; /* failure */ + return WOLFSSL_FAILURE; } if (type == NULL && ctx->cipherType == WOLFSSL_EVP_CIPH_TYPE_INIT) { WOLFSSL_MSG("no type set"); - return 0; /* failure */ + return WOLFSSL_FAILURE; } if (ctx->cipherType == WOLFSSL_EVP_CIPH_TYPE_INIT){ /* only first EVP_CipherInit invoke. ctx->cipherType is set below */ @@ -17698,12 +17698,12 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) ret = AesSetKey_ex(&ctx->cipher.aes, key, ctx->keyLen, iv, ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION, 0); if (ret != 0) - return ret; + return WOLFSSL_FAILURE; } if (iv && key == NULL) { ret = wc_AesSetIV(&ctx->cipher.aes, iv); if (ret != 0) - return ret; + return WOLFSSL_FAILURE; } } #endif /* WOLFSSL_AES_128 */ @@ -17723,12 +17723,12 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) ret = AesSetKey_ex(&ctx->cipher.aes, key, ctx->keyLen, iv, ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION, 0); if (ret != 0) - return ret; + return WOLFSSL_FAILURE; } if (iv && key == NULL) { ret = wc_AesSetIV(&ctx->cipher.aes, iv); if (ret != 0) - return ret; + return WOLFSSL_FAILURE; } } #endif /* WOLFSSL_AES_192 */ @@ -17749,14 +17749,14 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION, 0); if (ret != 0){ WOLFSSL_MSG("AesSetKey() failed"); - return ret; + return WOLFSSL_FAILURE; } } if (iv && key == NULL) { ret = wc_AesSetIV(&ctx->cipher.aes, iv); if (ret != 0){ WOLFSSL_MSG("wc_AesSetIV() failed"); - return ret; + return WOLFSSL_FAILURE; } } } @@ -17776,17 +17776,16 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) ctx->ivSz = GCM_NONCE_MID_SZ; XMEMSET(ctx->authTag, 0, ctx->authTagSz); - if (iv) - XMEMCPY(ctx->iv, iv, ctx->ivSz); - else - XMEMSET(ctx->iv, 0, AES_BLOCK_SIZE); + if (key && wc_AesGcmSetKey(&ctx->cipher.aes, key, ctx->keyLen)) { + WOLFSSL_MSG("wc_AesGcmSetKey() failed"); + return WOLFSSL_FAILURE; + } + if (iv && wc_AesGcmSetExtIV(&ctx->cipher.aes, iv, GCM_NONCE_MID_SZ)) { + WOLFSSL_MSG("wc_AesGcmSetExtIV() failed"); + return WOLFSSL_FAILURE; + } if (enc == 0 || enc == 1) ctx->enc = enc ? 1 : 0; - if (key) { - ret = wc_AesGcmSetKey(&ctx->cipher.aes, key, ctx->keyLen); - if (ret != 0) - return ret; - } } #endif /* WOLFSSL_AES_128 */ #ifdef WOLFSSL_AES_192 @@ -17802,17 +17801,16 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) ctx->ivSz = GCM_NONCE_MID_SZ; XMEMSET(ctx->authTag, 0, ctx->authTagSz); - if (iv) - XMEMCPY(ctx->iv, iv, ctx->ivSz); - else - XMEMSET(ctx->iv, 0, AES_BLOCK_SIZE); + if (key && wc_AesGcmSetKey(&ctx->cipher.aes, key, ctx->keyLen)) { + WOLFSSL_MSG("wc_AesGcmSetKey() failed"); + return WOLFSSL_FAILURE; + } + if (iv && wc_AesGcmSetExtIV(&ctx->cipher.aes, iv, GCM_NONCE_MID_SZ)) { + WOLFSSL_MSG("wc_AesGcmSetExtIV() failed"); + return WOLFSSL_FAILURE; + } if (enc == 0 || enc == 1) ctx->enc = enc ? 1 : 0; - if (key) { - ret = wc_AesGcmSetKey(&ctx->cipher.aes, key, ctx->keyLen); - if (ret != 0) - return ret; - } } #endif /* WOLFSSL_AES_192 */ #ifdef WOLFSSL_AES_256 @@ -17828,19 +17826,16 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) ctx->ivSz = GCM_NONCE_MID_SZ; XMEMSET(ctx->authTag, 0, ctx->authTagSz); - if (iv) - XMEMCPY(ctx->iv, iv, ctx->ivSz); - else - XMEMSET(ctx->iv, 0, AES_BLOCK_SIZE); + if (key && wc_AesGcmSetKey(&ctx->cipher.aes, key, ctx->keyLen)) { + WOLFSSL_MSG("wc_AesGcmSetKey() failed"); + return WOLFSSL_FAILURE; + } + if (iv && wc_AesGcmSetExtIV(&ctx->cipher.aes, iv, GCM_NONCE_MID_SZ)) { + WOLFSSL_MSG("wc_AesGcmSetExtIV() failed"); + return WOLFSSL_FAILURE; + } if (enc == 0 || enc == 1) ctx->enc = enc ? 1 : 0; - if (key) { - ret = wc_AesGcmSetKey(&ctx->cipher.aes, key, ctx->keyLen); - if (ret != 0){ - WOLFSSL_MSG("AesSetKey() failed"); - return ret; - } - } } #endif /* WOLFSSL_AES_256 */ #endif /* HAVE_AESGCM */ @@ -17864,12 +17859,12 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) ret = AesSetKey_ex(&ctx->cipher.aes, key, ctx->keyLen, iv, AES_ENCRYPTION, 1); if (ret != 0) - return ret; + return WOLFSSL_FAILURE; } if (iv && key == NULL) { ret = wc_AesSetIV(&ctx->cipher.aes, iv); if (ret != 0) - return ret; + return WOLFSSL_FAILURE; } } #endif /* WOLFSSL_AES_128 */ @@ -17892,12 +17887,12 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) ret = AesSetKey_ex(&ctx->cipher.aes, key, ctx->keyLen, iv, AES_ENCRYPTION, 1); if (ret != 0) - return ret; + return WOLFSSL_FAILURE; } if (iv && key == NULL) { ret = wc_AesSetIV(&ctx->cipher.aes, iv); if (ret != 0) - return ret; + return WOLFSSL_FAILURE; } } #endif /* WOLFSSL_AES_192 */ @@ -17920,12 +17915,12 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) ret = AesSetKey_ex(&ctx->cipher.aes, key, ctx->keyLen, iv, AES_ENCRYPTION, 1); if (ret != 0) - return ret; + return WOLFSSL_FAILURE; } if (iv && key == NULL) { ret = wc_AesSetIV(&ctx->cipher.aes, iv); if (ret != 0) - return ret; + return WOLFSSL_FAILURE; } } #endif /* WOLFSSL_AES_256 */ @@ -17946,7 +17941,7 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION, 1); } if (ret != 0) - return ret; + return WOLFSSL_FAILURE; } #endif /* WOLFSSL_AES_128 */ #ifdef WOLFSSL_AES_192 @@ -17965,7 +17960,7 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION, 1); } if (ret != 0) - return ret; + return WOLFSSL_FAILURE; } #endif /* WOLFSSL_AES_192 */ #ifdef WOLFSSL_AES_256 @@ -17984,7 +17979,7 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION, 1); } if (ret != 0) - return ret; + return WOLFSSL_FAILURE; } #endif /* WOLFSSL_AES_256 */ #ifdef WOLFSSL_AES_CFB @@ -18003,12 +17998,12 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) ret = AesSetKey_ex(&ctx->cipher.aes, key, ctx->keyLen, iv, AES_ENCRYPTION, 0); if (ret != 0) - return ret; + return WOLFSSL_FAILURE; } if (iv && key == NULL) { ret = wc_AesSetIV(&ctx->cipher.aes, iv); if (ret != 0) - return ret; + return WOLFSSL_FAILURE; } } #endif /* WOLFSSL_AES_128 */ @@ -18027,12 +18022,12 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) ret = AesSetKey_ex(&ctx->cipher.aes, key, ctx->keyLen, iv, AES_ENCRYPTION, 0); if (ret != 0) - return ret; + return WOLFSSL_FAILURE; } if (iv && key == NULL) { ret = wc_AesSetIV(&ctx->cipher.aes, iv); if (ret != 0) - return ret; + return WOLFSSL_FAILURE; } } #endif /* WOLFSSL_AES_192 */ @@ -18052,14 +18047,14 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) AES_ENCRYPTION, 0); if (ret != 0){ WOLFSSL_MSG("AesSetKey() failed"); - return ret; + return WOLFSSL_FAILURE; } } if (iv && key == NULL) { ret = wc_AesSetIV(&ctx->cipher.aes, iv); if (ret != 0){ WOLFSSL_MSG("wc_AesSetIV() failed"); - return ret; + return WOLFSSL_FAILURE; } } } @@ -18079,12 +18074,12 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) ret = AesSetKey_ex(&ctx->cipher.aes, key, ctx->keyLen, iv, AES_ENCRYPTION, 0); if (ret != 0) - return ret; + return WOLFSSL_FAILURE; } if (iv && key == NULL) { ret = wc_AesSetIV(&ctx->cipher.aes, iv); if (ret != 0) - return ret; + return WOLFSSL_FAILURE; } } #endif /* WOLFSSL_AES_128 */ @@ -18103,12 +18098,12 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) ret = AesSetKey_ex(&ctx->cipher.aes, key, ctx->keyLen, iv, AES_ENCRYPTION, 0); if (ret != 0) - return ret; + return WOLFSSL_FAILURE; } if (iv && key == NULL) { ret = wc_AesSetIV(&ctx->cipher.aes, iv); if (ret != 0) - return ret; + return WOLFSSL_FAILURE; } } #endif /* WOLFSSL_AES_192 */ @@ -18128,14 +18123,14 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) AES_ENCRYPTION, 0); if (ret != 0){ WOLFSSL_MSG("AesSetKey() failed"); - return ret; + return WOLFSSL_FAILURE; } } if (iv && key == NULL) { ret = wc_AesSetIV(&ctx->cipher.aes, iv); if (ret != 0){ WOLFSSL_MSG("wc_AesSetIV() failed"); - return ret; + return WOLFSSL_FAILURE; } } } @@ -18155,12 +18150,12 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) ret = AesSetKey_ex(&ctx->cipher.aes, key, ctx->keyLen, iv, AES_ENCRYPTION, 0); if (ret != 0) - return ret; + return WOLFSSL_FAILURE; } if (iv && key == NULL) { ret = wc_AesSetIV(&ctx->cipher.aes, iv); if (ret != 0) - return ret; + return WOLFSSL_FAILURE; } } #endif /* WOLFSSL_AES_128 */ @@ -18179,12 +18174,12 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) ret = AesSetKey_ex(&ctx->cipher.aes, key, ctx->keyLen, iv, AES_ENCRYPTION, 0); if (ret != 0) - return ret; + return WOLFSSL_FAILURE; } if (iv && key == NULL) { ret = wc_AesSetIV(&ctx->cipher.aes, iv); if (ret != 0) - return ret; + return WOLFSSL_FAILURE; } } #endif /* WOLFSSL_AES_192 */ @@ -18204,14 +18199,14 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) AES_ENCRYPTION, 0); if (ret != 0){ WOLFSSL_MSG("AesSetKey() failed"); - return ret; + return WOLFSSL_FAILURE; } } if (iv && key == NULL) { ret = wc_AesSetIV(&ctx->cipher.aes, iv); if (ret != 0){ WOLFSSL_MSG("wc_AesSetIV() failed"); - return ret; + return WOLFSSL_FAILURE; } } } @@ -18233,12 +18228,12 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) ret = AesSetKey_ex(&ctx->cipher.aes, key, ctx->keyLen, iv, AES_ENCRYPTION, 0); if (ret != 0) - return ret; + return WOLFSSL_FAILURE; } if (iv && key == NULL) { ret = wc_AesSetIV(&ctx->cipher.aes, iv); if (ret != 0) - return ret; + return WOLFSSL_FAILURE; } } #endif /* WOLFSSL_AES_128 */ @@ -18257,12 +18252,12 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) ret = AesSetKey_ex(&ctx->cipher.aes, key, ctx->keyLen, iv, AES_ENCRYPTION, 0); if (ret != 0) - return ret; + return WOLFSSL_FAILURE; } if (iv && key == NULL) { ret = wc_AesSetIV(&ctx->cipher.aes, iv); if (ret != 0) - return ret; + return WOLFSSL_FAILURE; } } #endif /* WOLFSSL_AES_192 */ @@ -18282,14 +18277,14 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) AES_ENCRYPTION, 0); if (ret != 0){ WOLFSSL_MSG("AesSetKey() failed"); - return ret; + return WOLFSSL_FAILURE; } } if (iv && key == NULL) { ret = wc_AesSetIV(&ctx->cipher.aes, iv); if (ret != 0){ WOLFSSL_MSG("wc_AesSetIV() failed"); - return ret; + return WOLFSSL_FAILURE; } } } @@ -18321,7 +18316,7 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION, NULL, 0); if (ret != 0) { WOLFSSL_MSG("wc_AesXtsSetKey() failed"); - return ret; + return WOLFSSL_FAILURE; } } } @@ -18351,7 +18346,7 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION, NULL, 0); if (ret != 0) { WOLFSSL_MSG("wc_AesXtsSetKey() failed"); - return ret; + return WOLFSSL_FAILURE; } } } @@ -18375,7 +18370,7 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) ret = wc_Des_SetKey(&ctx->cipher.des, key, iv, ctx->enc ? DES_ENCRYPTION : DES_DECRYPTION); if (ret != 0) - return ret; + return WOLFSSL_FAILURE; } if (iv && key == NULL) @@ -18397,7 +18392,7 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) ret = wc_Des_SetKey(&ctx->cipher.des, key, NULL, ctx->enc ? DES_ENCRYPTION : DES_DECRYPTION); if (ret != 0) - return ret; + return WOLFSSL_FAILURE; } } #endif @@ -18417,13 +18412,13 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) ret = wc_Des3_SetKey(&ctx->cipher.des3, key, iv, ctx->enc ? DES_ENCRYPTION : DES_DECRYPTION); if (ret != 0) - return ret; + return WOLFSSL_FAILURE; } if (iv && key == NULL) { ret = wc_Des3_SetIV(&ctx->cipher.des3, iv); if (ret != 0) - return ret; + return WOLFSSL_FAILURE; } } else if (ctx->cipherType == DES_EDE3_ECB_TYPE || @@ -18441,7 +18436,7 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) ret = wc_Des3_SetKey(&ctx->cipher.des3, key, NULL, ctx->enc ? DES_ENCRYPTION : DES_DECRYPTION); if (ret != 0) - return ret; + return WOLFSSL_FAILURE; } } #endif /* NO_DES3 */ @@ -18476,7 +18471,7 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) iv, ctx->enc ? IDEA_ENCRYPTION : IDEA_DECRYPTION); if (ret != 0) - return ret; + return WOLFSSL_FAILURE; } if (iv && key == NULL) @@ -21731,7 +21726,7 @@ int wolfSSL_i2d_DHparams(const WOLFSSL_DH *dh, unsigned char **out) (mp_int*)dh->g->internal); if (ret != MP_OKAY) { WOLFSSL_MSG("StoreDHparams error"); - len = 0; + len = WOLFSSL_FAILURE; } else{ *out += len; @@ -22796,9 +22791,6 @@ int wolfSSL_X509_get_signature_type(WOLFSSL_X509* x509) } #if defined(OPENSSL_EXTRA_X509_SMALL) -#ifdef HAVE_ECC - static int SetECKeyExternal(WOLFSSL_EC_KEY* eckey); -#endif /* Used to get a string from the WOLFSSL_X509_NAME structure that * corresponds with the NID value passed in. @@ -25124,8 +25116,10 @@ int wolfSSL_i2d_PKCS12_bio(WOLFSSL_BIO *bio, WC_PKCS12 *pkcs12) /* helper function to get raw pointer to DER buffer from WOLFSSL_EVP_PKEY */ static int wolfSSL_EVP_PKEY_get_der(WOLFSSL_EVP_PKEY* key, unsigned char** der) { - *der = (unsigned char*)key->pkey.ptr; - + if (!key) + return WOLFSSL_FAILURE; + if (der) + *der = (unsigned char*)key->pkey.ptr; return key->pkey_sz; } @@ -28219,7 +28213,27 @@ WOLFSSL_API int SSL_SESSION_set1_id_context(WOLFSSL_SESSION *s, const unsigned c #endif #if defined(OPENSSL_ALL) || defined(WOLFSSL_APACHE_HTTPD) \ - || defined(WOLFSSL_HAPROXY) + || defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_WPAS) +WOLFSSL_X509_ALGOR* wolfSSL_X509_ALGOR_new(void) +{ + WOLFSSL_X509_ALGOR* ret; + ret = (WOLFSSL_X509_ALGOR*)XMALLOC(sizeof(WOLFSSL_X509_ALGOR), NULL, + DYNAMIC_TYPE_OPENSSL); + if (ret) { + XMEMSET(ret, 0, sizeof(WOLFSSL_X509_ALGOR)); + } + return ret; +} + +void wolfSSL_X509_ALGOR_free(WOLFSSL_X509_ALGOR *alg) +{ + if (alg) { + if (alg->algorithm) { + wolfSSL_ASN1_OBJECT_free(alg->algorithm); + } + } +} + /* Returns X509_ALGOR struct with signature algorithm */ const WOLFSSL_X509_ALGOR* wolfSSL_X509_get0_tbs_sigalg(const WOLFSSL_X509 *x509) { @@ -28237,15 +28251,67 @@ const WOLFSSL_X509_ALGOR* wolfSSL_X509_get0_tbs_sigalg(const WOLFSSL_X509 *x509) void wolfSSL_X509_ALGOR_get0(const WOLFSSL_ASN1_OBJECT **paobj, int *pptype, const void **ppval, const WOLFSSL_X509_ALGOR *algor) { - (void)pptype; - (void)ppval; WOLFSSL_ENTER("X509_ALGOR_get0"); - if (paobj && algor) { - *paobj = algor->algorithm; + if (!algor) { + WOLFSSL_MSG("algor object is NULL"); + return; } - else { - WOLFSSL_MSG("ASN1_OBJECT NULL error"); + + if (paobj) + *paobj = algor->algorithm; + if (ppval) + *ppval = algor->algorithm; + if (pptype) + *pptype = V_ASN1_OBJECT; +} + +int wolfSSL_X509_ALGOR_set0(WOLFSSL_X509_ALGOR *algor, WOLFSSL_ASN1_OBJECT *aobj, + int ptype, void *pval) +{ + if (!algor) { + return WOLFSSL_FAILURE; + } + if (ptype != V_ASN1_OBJECT) { + WOLFSSL_MSG("Only V_ASN1_OBJECT ptype is supported"); + return WOLFSSL_FAILURE; + } + if (aobj) { + algor->algorithm = aobj; + } + else if (pval) { + algor->algorithm = pval; + } + return WOLFSSL_SUCCESS; +} + +WOLFSSL_X509_PUBKEY *wolfSSL_X509_PUBKEY_new(void) +{ + WOLFSSL_X509_PUBKEY *ret; + ret = (WOLFSSL_X509_PUBKEY*)XMALLOC(sizeof(WOLFSSL_X509_PUBKEY), NULL, + DYNAMIC_TYPE_OPENSSL); + if (!ret) { + return NULL; + } + XMEMSET(ret, 0, sizeof(WOLFSSL_X509_PUBKEY)); + ret->algor = wolfSSL_X509_ALGOR_new(); + if (!ret->algor) { + wolfSSL_X509_PUBKEY_free(ret); + return NULL; + } + return ret; +} + +void wolfSSL_X509_PUBKEY_free(WOLFSSL_X509_PUBKEY *x) +{ + if (x) { + if (x->algor) { + wolfSSL_X509_ALGOR_free(x->algor); + } + if (x->pkey) { + wolfSSL_EVP_PKEY_free(x->pkey); + } + XFREE(x, NULL, DYNAMIC_TYPE_OPENSSL); } } @@ -28265,36 +28331,37 @@ WOLFSSL_X509_PUBKEY* wolfSSL_X509_get_X509_PUBKEY(const WOLFSSL_X509* x509) /* Sets ppkalg pointer to X509_PUBKEY algorithm. Returns WOLFSSL_SUCCESS on success or WOLFSSL_FAILURE on error. */ int wolfSSL_X509_PUBKEY_get0_param(WOLFSSL_ASN1_OBJECT **ppkalg, - const unsigned char **pk, int *ppklen, void **pa, WOLFSSL_X509_PUBKEY *pub) + const unsigned char **pk, int *ppklen, WOLFSSL_X509_ALGOR **pa, + WOLFSSL_X509_PUBKEY *pub) { - (void)pk; - (void)ppklen; - (void)pa; - WOLFSSL_ASN1_OBJECT* obj; WOLFSSL_ENTER("X509_PUBKEY_get0_param"); - if (ppkalg == NULL || pub == NULL) { + if (!pub || !pub->pubKeyOID) { + WOLFSSL_MSG("X509_PUBKEY struct not populated"); return WOLFSSL_FAILURE; } - if (pub->algor == NULL) { - pub->algor = (WOLFSSL_X509_ALGOR*)XMALLOC(sizeof(WOLFSSL_X509_ALGOR), - NULL, DYNAMIC_TYPE_OPENSSL); - if (pub->algor == NULL) { + if (!pub->algor) { + if (!(pub->algor = wolfSSL_X509_ALGOR_new())) { + return WOLFSSL_FAILURE; + } + pub->algor->algorithm = wolfSSL_OBJ_nid2obj(pub->pubKeyOID); + if (pub->algor->algorithm == NULL) { + WOLFSSL_MSG("Failed to create object from NID"); return WOLFSSL_FAILURE; } } - obj = wolfSSL_OBJ_nid2obj(pub->pubKeyOID); - if (obj == NULL) { - WOLFSSL_MSG("Failed to create object from NID"); - return WOLFSSL_FAILURE; - } - pub->algor->algorithm = obj; - *ppkalg = pub->algor->algorithm; + if (pa) + *pa = pub->algor; + if (ppkalg) + *ppkalg = pub->algor->algorithm; + if (pk) + wolfSSL_EVP_PKEY_get_der(pub->pkey, (unsigned char **)pk); + if (ppklen) + *ppklen = wolfSSL_EVP_PKEY_get_der(pub->pkey, NULL); return WOLFSSL_SUCCESS; - } /* Returns a pointer to the pkey when passed a key */ @@ -28309,6 +28376,62 @@ WOLFSSL_EVP_PKEY* wolfSSL_X509_PUBKEY_get(WOLFSSL_X509_PUBKEY* key) return key->pkey; } +int wolfSSL_X509_PUBKEY_set(WOLFSSL_X509_PUBKEY **x, WOLFSSL_EVP_PKEY *key) +{ + WOLFSSL_X509_PUBKEY *pk = NULL; + + WOLFSSL_ENTER("wolfSSL_X509_PUBKEY_set"); + + if (!x || !key) { + return WOLFSSL_FAILURE; + } + + if (!(pk = wolfSSL_X509_PUBKEY_new())) { + return WOLFSSL_FAILURE; + } + + switch (key->type) { +#ifndef NO_RSA + case EVP_PKEY_RSA: + pk->algor->algorithm= wolfSSL_OBJ_nid2obj(RSAk); + break; +#endif +#ifndef NO_DSA + case EVP_PKEY_DSA: + pk->algor->algorithm = wolfSSL_OBJ_nid2obj(DSAk); + break; +#endif +#ifdef HAVE_ECC + case EVP_PKEY_EC: + pk->algor->algorithm = wolfSSL_OBJ_nid2obj(ECDSAk); + break; +#endif + default: + WOLFSSL_MSG("Unknown key type"); + goto error; + } + + if (!pk->algor->algorithm) { + WOLFSSL_MSG("Failed to create algorithm object"); + goto error; + } + + if (!wolfSSL_EVP_PKEY_up_ref(key)) { + WOLFSSL_MSG("Failed to up key reference"); + goto error; + } + pk->pkey = key; + + wolfSSL_X509_PUBKEY_free(*x); + *x = pk; + return WOLFSSL_SUCCESS; +error: + if (pk) { + wolfSSL_X509_PUBKEY_free(pk); + } + return WOLFSSL_FAILURE; +} + #endif /* OPENSSL_ALL || WOLFSSL_APACHE_HTTPD || WOLFSSL_HAPROXY*/ #ifndef NO_WOLFSSL_STUB @@ -30924,6 +31047,7 @@ WOLFSSL_ASN1_INTEGER* wolfSSL_BN_to_ASN1_INTEGER(const WOLFSSL_BIGNUM *bn, WOLFS { WOLFSSL_ASN1_INTEGER* a; int len; + WOLFSSL_ENTER("wolfSSL_BN_to_ASN1_INTEGER"); if (ai == NULL) { a = wolfSSL_ASN1_INTEGER_new(); @@ -30976,6 +31100,212 @@ WOLFSSL_ASN1_INTEGER* wolfSSL_BN_to_ASN1_INTEGER(const WOLFSSL_BIGNUM *bn, WOLFS return a; } +#ifdef OPENSSL_ALL +void *wolfSSL_ASN1_item_new(const WOLFSSL_ASN1_ITEM *template) +{ + void *ret = NULL; + const WOLFSSL_ASN1_TEMPLATE *member = NULL; + size_t i; + WOLFSSL_ENTER("wolfSSL_ASN1_item_new"); + if (!template) { + WOLFSSL_LEAVE("wolfSSL_ASN1_item_new", NULL); + return NULL; + } + if ((ret = XMALLOC(template->size, NULL, DYNAMIC_TYPE_OPENSSL))) { + XMEMSET(ret, 0, template->size); + } + for (member = template->members, i = 0; i < template->mcount; + member++, i++) { + switch(member->type) { + case WOLFSSL_X509_ALGOR_ASN1: + { + WOLFSSL_X509_ALGOR* algor = wolfSSL_X509_ALGOR_new(); + if (!algor) { + goto error; + } + *(WOLFSSL_X509_ALGOR**)(((byte*)ret) + member->offset) = algor; + break; + } + case WOLFSSL_ASN1_BIT_STRING_ASN1: + { + WOLFSSL_ASN1_BIT_STRING* bit_str = wolfSSL_ASN1_BIT_STRING_new(); + if (!bit_str) { + goto error; + } + *(WOLFSSL_ASN1_BIT_STRING**)(((byte*)ret) + member->offset) = bit_str; + break; + } + default: + WOLFSSL_MSG("Type not supported in wolfSSL_ASN1_item_new"); + goto error; + } + } + WOLFSSL_LEAVE("wolfSSL_ASN1_item_new", ret); + return ret; +error: + wolfSSL_ASN1_item_free(ret, template); + WOLFSSL_LEAVE("wolfSSL_ASN1_item_new", NULL); + return NULL; +} + +void wolfSSL_ASN1_item_free(void *val, const WOLFSSL_ASN1_ITEM *template) +{ + const WOLFSSL_ASN1_TEMPLATE *member = NULL; + size_t i; + WOLFSSL_ENTER("wolfSSL_ASN1_item_free"); + if (val) { + for (member = template->members, i = 0; i < template->mcount; + member++, i++) { + switch(member->type) { + case WOLFSSL_X509_ALGOR_ASN1: + { + WOLFSSL_X509_ALGOR* algor = *(WOLFSSL_X509_ALGOR**) + (((byte*)val) + member->offset); + if (algor) { + wolfSSL_X509_ALGOR_free(algor); + } + break; + } + case WOLFSSL_ASN1_BIT_STRING_ASN1: + { + WOLFSSL_ASN1_BIT_STRING* bit_str = *(WOLFSSL_ASN1_BIT_STRING**) + (((byte*)val) + member->offset); + if (bit_str) { + wolfSSL_ASN1_BIT_STRING_free(bit_str); + } + break; + } + default: + WOLFSSL_MSG("Type not supported in wolfSSL_ASN1_item_free"); + } + } + XFREE(val, NULL, DYNAMIC_TYPE_OPENSSL); + } +} + +#define bufLenOrNull(buf, len) (buf ? buf + len : NULL) + +static int i2dProcessMembers(const void *src, byte *buf, + const WOLFSSL_ASN1_TEMPLATE *members, size_t mcount) +{ + const WOLFSSL_ASN1_TEMPLATE *member = NULL; + int len = 0, ret; + size_t i; + WOLFSSL_ENTER("processMembers"); + for (member = members, i = 0; i < mcount; member++, i++) { + switch(member->type) { + case WOLFSSL_X509_ALGOR_ASN1: + { + word32 oid = 0; + word32 idx = 0; + const WOLFSSL_X509_ALGOR* algor = *(const WOLFSSL_X509_ALGOR**) + (((byte*)src) + member->offset); + if (!algor->algorithm) { + WOLFSSL_LEAVE("processMembers", WOLFSSL_FAILURE); + return WOLFSSL_FAILURE; + } + + if (GetObjectId(algor->algorithm->obj, &idx, &oid, + algor->algorithm->grp, algor->algorithm->objSz) < 0) { + WOLFSSL_MSG("Issue getting OID of object"); + return -1; + } + + ret = SetAlgoID(oid, bufLenOrNull(buf, len), + algor->algorithm->grp, 0); + if (!ret) { + return WOLFSSL_FAILURE; + } + len += ret; + break; + } + case WOLFSSL_ASN1_BIT_STRING_ASN1: + { + const WOLFSSL_ASN1_BIT_STRING* bit_str; + bit_str = *(const WOLFSSL_ASN1_BIT_STRING**) + (((byte*)src) + member->offset); + len += SetBitString(bit_str->length, 0, bufLenOrNull(buf, len)); + if (buf && bit_str->data) { + XMEMCPY(buf + len, bit_str->data, bit_str->length); + } + len += bit_str->length; + break; + } + default: + WOLFSSL_MSG("Type not support in processMembers"); + WOLFSSL_LEAVE("processMembers", WOLFSSL_FAILURE); + return WOLFSSL_FAILURE; + } + } + WOLFSSL_LEAVE("processMembers", len); + return len; +} + +int wolfSSL_ASN1_item_i2d(const void *src, byte **dest, + const WOLFSSL_ASN1_ITEM *template) +{ + int len = 0; + byte *buf = NULL; + + WOLFSSL_ENTER("wolfSSL_ASN1_item_i2d"); + + if (!src || !template) { + WOLFSSL_LEAVE("wolfSSL_ASN1_item_i2d", WOLFSSL_FAILURE); + return WOLFSSL_FAILURE; + } + + if (dest && !*dest) { + len = wolfSSL_ASN1_item_i2d(src, NULL, template); + if (!len) { + goto error; + } + buf = (byte*)XMALLOC(len, NULL, DYNAMIC_TYPE_ASN1); + if (!buf) { + goto error; + } + len = 0; + } + + switch (template->type) { + case ASN_SEQUENCE: + { + int seq_len = i2dProcessMembers(src, NULL, template->members, + template->mcount); + if (!seq_len) { + goto error; + } + len += SetSequence(seq_len, bufLenOrNull(buf, len)); + if (buf && + i2dProcessMembers(src, bufLenOrNull(buf, len), template->members, + template->mcount) != seq_len) { + WOLFSSL_MSG("Inconsistent sequence length"); + goto error; + } + len += seq_len; + break; + } + default: + WOLFSSL_MSG("Type not supported in wolfSSL_ASN1_item_i2d"); + goto error; + } + + if (dest && !*dest) { + *dest = buf; + } + else if (dest && *dest) { + XMEMCPY(*dest, buf, len); + } + + WOLFSSL_LEAVE("wolfSSL_ASN1_item_i2d", len); + return len; +error: + if (buf) { + XFREE(buf, NULL, DYNAMIC_TYPE_ASN1); + } + WOLFSSL_LEAVE("wolfSSL_ASN1_item_i2d", WOLFSSL_FAILURE); + return WOLFSSL_FAILURE; +} +#endif /* OPENSSL_ALL */ #ifndef NO_DH @@ -31042,7 +31372,6 @@ void wolfSSL_DH_free(WOLFSSL_DH* dh) } } - static int SetDhInternal(WOLFSSL_DH* dh) { int ret = WOLFSSL_FATAL_ERROR; @@ -33631,6 +33960,14 @@ int wolfSSL_EVP_PKEY_set1_DH(WOLFSSL_EVP_PKEY *pkey, WOLFSSL_DH *key) return WOLFSSL_SUCCESS; } +WOLFSSL_DH* wolfSSL_EVP_PKEY_get0_DH(WOLFSSL_EVP_PKEY* key) +{ + if (!key) { + return NULL; + } + return key->dh; +} + WOLFSSL_DH* wolfSSL_EVP_PKEY_get1_DH(WOLFSSL_EVP_PKEY* key) { WOLFSSL_DH* local = NULL; @@ -33643,7 +33980,6 @@ WOLFSSL_DH* wolfSSL_EVP_PKEY_get1_DH(WOLFSSL_EVP_PKEY* key) } if (key->type == EVP_PKEY_DH) { - local = wolfSSL_DH_new(); if (local == NULL) { WOLFSSL_MSG("Error creating a new WOLFSSL_DH structure"); @@ -34869,7 +35205,7 @@ static int SetECPointExternal(WOLFSSL_EC_POINT *p) /* EC_KEY wolfSSL -> OpenSSL */ -static int SetECKeyExternal(WOLFSSL_EC_KEY* eckey) +int SetECKeyExternal(WOLFSSL_EC_KEY* eckey) { ecc_key* key; @@ -34919,7 +35255,7 @@ static int SetECKeyExternal(WOLFSSL_EC_KEY* eckey) #ifdef OPENSSL_EXTRA #ifdef HAVE_ECC /* EC_KEY Openssl -> WolfSSL */ -static int SetECKeyInternal(WOLFSSL_EC_KEY* eckey) +int SetECKeyInternal(WOLFSSL_EC_KEY* eckey) { ecc_key* key; @@ -34981,7 +35317,7 @@ WOLFSSL_EC_POINT *wolfSSL_EC_KEY_get0_public_key(const WOLFSSL_EC_KEY *key) WOLFSSL_ENTER("wolfSSL_EC_KEY_get0_public_key"); if (key == NULL) { - WOLFSSL_MSG("wolfSSL_EC_KEY_get0_group Bad arguments"); + WOLFSSL_MSG("wolfSSL_EC_KEY_get0_public_key Bad arguments"); return NULL; } @@ -35193,8 +35529,6 @@ static void InitwolfSSL_ECKey(WOLFSSL_EC_KEY* key) WOLFSSL_EC_KEY *wolfSSL_EC_KEY_new(void) { WOLFSSL_EC_KEY *external; - ecc_key* key; - WOLFSSL_ENTER("wolfSSL_EC_KEY_new"); external = (WOLFSSL_EC_KEY*)XMALLOC(sizeof(WOLFSSL_EC_KEY), NULL, @@ -35211,55 +35545,40 @@ WOLFSSL_EC_KEY *wolfSSL_EC_KEY_new(void) DYNAMIC_TYPE_ECC); if (external->internal == NULL) { WOLFSSL_MSG("wolfSSL_EC_KEY_new malloc ecc key failure"); - wolfSSL_EC_KEY_free(external); - return NULL; + goto error; } XMEMSET(external->internal, 0, sizeof(ecc_key)); if (wc_ecc_init((ecc_key*)external->internal) != 0) { WOLFSSL_MSG("wolfSSL_EC_KEY_new init ecc key failure"); - wolfSSL_EC_KEY_free(external); - return NULL; - } - - /* public key */ - external->pub_key = (WOLFSSL_EC_POINT*)XMALLOC(sizeof(WOLFSSL_EC_POINT), - NULL, DYNAMIC_TYPE_ECC); - if (external->pub_key == NULL) { - WOLFSSL_MSG("wolfSSL_EC_KEY_new malloc WOLFSSL_EC_POINT failure"); - wolfSSL_EC_KEY_free(external); - return NULL; - } - XMEMSET(external->pub_key, 0, sizeof(WOLFSSL_EC_POINT)); - - key = (ecc_key*)external->internal; - external->pub_key->internal = wc_ecc_new_point(); - if (wc_ecc_copy_point((ecc_point*)&key->pubkey, - (ecc_point*)external->pub_key->internal) != MP_OKAY) { - WOLFSSL_MSG("wc_ecc_copy_point failure"); - wolfSSL_EC_KEY_free(external); - return NULL; + goto error; } /* curve group */ - external->group = (WOLFSSL_EC_GROUP*)XMALLOC(sizeof(WOLFSSL_EC_GROUP), NULL, - DYNAMIC_TYPE_ECC); + external->group = wolfSSL_EC_GROUP_new_by_curve_name(ECC_CURVE_DEF); if (external->group == NULL) { WOLFSSL_MSG("wolfSSL_EC_KEY_new malloc WOLFSSL_EC_GROUP failure"); - wolfSSL_EC_KEY_free(external); - return NULL; + goto error; + } + + /* public key */ + external->pub_key = wolfSSL_EC_POINT_new(external->group); + if (external->pub_key == NULL) { + WOLFSSL_MSG("wolfSSL_EC_POINT_new failure"); + goto error; } - XMEMSET(external->group, 0, sizeof(WOLFSSL_EC_GROUP)); /* private key */ external->priv_key = wolfSSL_BN_new(); if (external->priv_key == NULL) { WOLFSSL_MSG("wolfSSL_BN_new failure"); - wolfSSL_EC_KEY_free(external); - return NULL; + goto error; } return external; +error: + wolfSSL_EC_KEY_free(external); + return NULL; } void wolfSSL_EC_KEY_free(WOLFSSL_EC_KEY *key) @@ -35376,6 +35695,21 @@ void wolfSSL_EC_KEY_set_asn1_flag(WOLFSSL_EC_KEY *key, int asn1_flag) } #endif +static int setupPoint(const WOLFSSL_EC_POINT *p) { + if (!p) { + return WOLFSSL_FAILURE; + } + if (p->inSet == 0) { + WOLFSSL_MSG("No ECPoint internal set, do it"); + + if (SetECPointInternal((WOLFSSL_EC_POINT *)p) != WOLFSSL_SUCCESS) { + WOLFSSL_MSG("SetECPointInternal SetECPointInternal failed"); + return WOLFSSL_FAILURE; + } + } + return WOLFSSL_SUCCESS; +} + /* return code compliant with OpenSSL : * 1 if success, 0 if error */ @@ -35399,11 +35733,8 @@ int wolfSSL_EC_KEY_set_public_key(WOLFSSL_EC_KEY *key, } } - if (pub->inSet == 0) { - if (SetECPointInternal((WOLFSSL_EC_POINT *)pub) != WOLFSSL_SUCCESS) { - WOLFSSL_MSG("SetECPointInternal failed"); - return WOLFSSL_FAILURE; - } + if (setupPoint(pub) != WOLFSSL_SUCCESS) { + return WOLFSSL_FAILURE; } pub_p = (ecc_point*)pub->internal; @@ -35708,13 +36039,15 @@ WOLFSSL_EC_GROUP *wolfSSL_EC_GROUP_new_by_curve_name(int nid) /* set the nid of the curve */ g->curve_nid = eccEnum; - /* search and set the corresponding internal curve idx */ - for (x = 0; ecc_sets[x].size != 0; x++) - if (ecc_sets[x].id == g->curve_nid) { - g->curve_idx = x; - g->curve_oid = ecc_sets[x].oidSum; - break; - } + if (eccEnum > ECC_CURVE_DEF) { + /* search and set the corresponding internal curve idx */ + for (x = 0; ecc_sets[x].size != 0; x++) + if (ecc_sets[x].id == g->curve_nid) { + g->curve_idx = x; + g->curve_oid = ecc_sets[x].oidSum; + break; + } + } return g; } @@ -35939,13 +36272,8 @@ int wolfSSL_ECPoint_i2d(const WOLFSSL_EC_GROUP *group, return WOLFSSL_FAILURE; } - if (p->inSet == 0) { - WOLFSSL_MSG("No ECPoint internal set, do it"); - - if (SetECPointInternal((WOLFSSL_EC_POINT *)p) != WOLFSSL_SUCCESS) { - WOLFSSL_MSG("SetECPointInternal SetECPointInternal failed"); - return WOLFSSL_FAILURE; - } + if (setupPoint(p) != WOLFSSL_SUCCESS) { + return WOLFSSL_FAILURE; } if (out != NULL) { @@ -35981,13 +36309,10 @@ int wolfSSL_ECPoint_d2i(unsigned char *in, unsigned int len, return WOLFSSL_FAILURE; } - if (p->exSet == 0) { - WOLFSSL_MSG("No ECPoint external set, do it"); - - if (SetECPointExternal(p) != WOLFSSL_SUCCESS) { - WOLFSSL_MSG("SetECPointExternal failed"); - return WOLFSSL_FAILURE; - } + /* Set new external point */ + if (SetECPointExternal(p) != WOLFSSL_SUCCESS) { + WOLFSSL_MSG("SetECPointExternal failed"); + return WOLFSSL_FAILURE; } wolfSSL_EC_POINT_dump("d2i p", p); @@ -36000,7 +36325,8 @@ size_t wolfSSL_EC_POINT_point2oct(const WOLFSSL_EC_GROUP *group, char form, byte *buf, size_t len, WOLFSSL_BN_CTX *ctx) { - unsigned int min_len = 0; + word32 min_len = len; + int compressed = form == POINT_CONVERSION_COMPRESSED ? 1 : 0; WOLFSSL_ENTER("EC_POINT_point2oct"); @@ -36008,6 +36334,10 @@ size_t wolfSSL_EC_POINT_point2oct(const WOLFSSL_EC_GROUP *group, return WOLFSSL_FAILURE; } + if (setupPoint(p) != WOLFSSL_SUCCESS) { + return WOLFSSL_FAILURE; + } + if (wolfSSL_EC_POINT_is_at_infinity(group, p)) { /* encodes to a single 0 octet */ if (buf != NULL) { @@ -36020,18 +36350,13 @@ size_t wolfSSL_EC_POINT_point2oct(const WOLFSSL_EC_GROUP *group, return 1; } - if (form != POINT_CONVERSION_UNCOMPRESSED) { - WOLFSSL_MSG("Only POINT_CONVERSION_UNCOMPRESSED is supported"); + if (form != POINT_CONVERSION_UNCOMPRESSED && form != POINT_CONVERSION_COMPRESSED) { + WOLFSSL_MSG("Only POINT_CONVERSION_UNCOMPRESSED or POINT_CONVERSION_COMPRESSED are supported"); return WOLFSSL_FAILURE; } - if (wolfSSL_ECPoint_i2d(group, p, NULL, &min_len) != WOLFSSL_SUCCESS) { - return WOLFSSL_FAILURE; - } - - if (buf && - ((min_len > len) || - wolfSSL_ECPoint_i2d(group, p, buf, &min_len) != WOLFSSL_SUCCESS)) { + if (wc_ecc_export_point_der_ex(group->curve_idx, (ecc_point*)p->internal, + buf, &min_len, compressed) != (buf ? MP_OKAY : LENGTH_ONLY_E)) { return WOLFSSL_FAILURE; } @@ -36055,6 +36380,63 @@ int wolfSSL_EC_POINT_oct2point(const WOLFSSL_EC_GROUP *group, return wolfSSL_ECPoint_d2i((unsigned char*)buf, (unsigned int)len, group, p); } +int wolfSSL_i2o_ECPublicKey(const WOLFSSL_EC_KEY *in, unsigned char **out) +{ + size_t len; + unsigned char *tmp = NULL; + char form; + WOLFSSL_ENTER("wolfSSL_i2o_ECPublicKey"); + + if (!in) { + WOLFSSL_MSG("wolfSSL_i2o_ECPublicKey Bad arguments"); + return WOLFSSL_FAILURE; + } + + /* Default to compressed form if not set */ + form = in->form == POINT_CONVERSION_UNCOMPRESSED ? + POINT_CONVERSION_UNCOMPRESSED: + POINT_CONVERSION_COMPRESSED; + + len = wolfSSL_EC_POINT_point2oct(in->group, in->pub_key, form, + NULL, 0, NULL); + + if (len != WOLFSSL_FAILURE && out) { + if (!*out) { + if (!(tmp = (unsigned char*)XMALLOC(len, NULL, + DYNAMIC_TYPE_OPENSSL))) { + WOLFSSL_MSG("malloc failed"); + return WOLFSSL_FAILURE; + } + *out = tmp; + } + + if (wolfSSL_EC_POINT_point2oct(in->group, in->pub_key, form, *out, + len, NULL) == WOLFSSL_FAILURE) { + if (tmp) { + XFREE(tmp, NULL, DYNAMIC_TYPE_OPENSSL); + *out = NULL; + } + return WOLFSSL_FAILURE; + } + + if (!tmp) { + /* Move buffer forward if it was not alloced in this function */ + *out += len; + } + } + + return len; +} + +void wolfSSL_EC_KEY_set_conv_form(WOLFSSL_EC_KEY *eckey, char form) +{ + if (eckey && (form == POINT_CONVERSION_COMPRESSED || + form == POINT_CONVERSION_UNCOMPRESSED)) { + eckey->form = form; + } +} + + /* wolfSSL_EC_POINT_point2bn should return "in" if not null */ WOLFSSL_BIGNUM *wolfSSL_EC_POINT_point2bn(const WOLFSSL_EC_GROUP *group, const WOLFSSL_EC_POINT *p, @@ -36141,13 +36523,8 @@ int wolfSSL_EC_POINT_get_affine_coordinates_GFp(const WOLFSSL_EC_GROUP *group, return WOLFSSL_FAILURE; } - if (point->inSet == 0) { - WOLFSSL_MSG("No ECPoint internal set, do it"); - - if (SetECPointInternal((WOLFSSL_EC_POINT *)point) != WOLFSSL_SUCCESS) { - WOLFSSL_MSG("SetECPointInternal failed"); - return WOLFSSL_FAILURE; - } + if (setupPoint(point) != WOLFSSL_SUCCESS) { + return WOLFSSL_FAILURE; } if (!wolfSSL_BN_is_one(point->Z)) { @@ -36227,68 +36604,109 @@ int wolfSSL_EC_POINT_set_affine_coordinates_GFp(const WOLFSSL_EC_GROUP *group, } #ifndef WOLFSSL_ATECC508A -/* return code compliant with OpenSSL : +/* Calculate the value: generator * n + q * m + * return code compliant with OpenSSL : * 1 if success, 0 if error */ int wolfSSL_EC_POINT_mul(const WOLFSSL_EC_GROUP *group, WOLFSSL_EC_POINT *r, const WOLFSSL_BIGNUM *n, const WOLFSSL_EC_POINT *q, const WOLFSSL_BIGNUM *m, WOLFSSL_BN_CTX *ctx) { - mp_int a, prime; - int ret; + mp_int a, prime, Gx, Gy; + int ret = WOLFSSL_FAILURE; + ecc_point* result = NULL; (void)ctx; - (void)n; WOLFSSL_ENTER("wolfSSL_EC_POINT_mul"); - if (group == NULL || r == NULL || r->internal == NULL || - q == NULL || q->internal == NULL || m == NULL) { + if (!group || !r) { WOLFSSL_MSG("wolfSSL_EC_POINT_mul NULL error"); return WOLFSSL_FAILURE; } - if (q->inSet == 0) { - WOLFSSL_MSG("No ECPoint internal set, do it"); - - if (SetECPointInternal((WOLFSSL_EC_POINT *)q) != WOLFSSL_SUCCESS) { - WOLFSSL_MSG("SetECPointInternal q failed"); - return WOLFSSL_FAILURE; - } + if (!(result = wc_ecc_new_point())) { + WOLFSSL_MSG("wolfSSL_EC_POINT_new error"); + return WOLFSSL_FAILURE; } /* read the curve prime and a */ if (mp_init_multi(&prime, &a, NULL, NULL, NULL, NULL) != MP_OKAY) { - return WOLFSSL_FAILURE; + WOLFSSL_MSG("mp_init_multi error"); + goto cleanup; } - ret = mp_read_radix(&prime, ecc_sets[group->curve_idx].prime, MP_RADIX_HEX); - if (ret == MP_OKAY) { - ret = mp_read_radix(&a, ecc_sets[group->curve_idx].Af, MP_RADIX_HEX); + if (q && setupPoint(q) != WOLFSSL_SUCCESS) { + WOLFSSL_MSG("setupPoint error"); + goto cleanup; } - /* r = q * m % prime */ - if (ret == MP_OKAY) { - ret = wc_ecc_mulmod((mp_int*)m->internal, (ecc_point*)q->internal, - (ecc_point*)r->internal, &a, &prime, 1); + if (mp_read_radix(&prime, ecc_sets[group->curve_idx].prime, MP_RADIX_HEX) + != MP_OKAY) { + WOLFSSL_MSG("mp_read_radix prime error"); + goto cleanup; } - mp_clear(&a); - mp_clear(&prime); + if (mp_read_radix(&a, ecc_sets[group->curve_idx].Af, MP_RADIX_HEX) + != MP_OKAY) { + WOLFSSL_MSG("mp_read_radix a error"); + goto cleanup; + } - if (ret == MP_OKAY) { - r->inSet = 1; /* mark internal set */ - - /* set the external value for the computed point */ - ret = SetECPointExternal(r); - if (ret != WOLFSSL_SUCCESS) { - WOLFSSL_MSG("SetECPointInternal r failed"); + if (n) { + /* load generator */ + if (wc_ecc_get_generator(result, group->curve_idx) + != MP_OKAY) { + WOLFSSL_MSG("wc_ecc_get_generator error"); + goto cleanup; } } - else { - ret = WOLFSSL_FAILURE; + + if (n && q && m) { + /* r = generator * n + q * m */ + if (ecc_mul2add(result, (mp_int*)n->internal, + (ecc_point*)q->internal, (mp_int*)m->internal, + result, &a, &prime, NULL) + != MP_OKAY) { + WOLFSSL_MSG("ecc_mul2add error"); + goto cleanup; + } + } + else if (n) { + /* r = generator * n */ + if (wc_ecc_mulmod((mp_int*)n->internal, result, result, &a, &prime, 1) + != MP_OKAY) { + WOLFSSL_MSG("wc_ecc_mulmod gn error"); + goto cleanup; + } + } + else if (q && m) { + /* r = q * m */ + if (wc_ecc_mulmod((mp_int*)m->internal, (ecc_point*)q->internal, + result, &a, &prime, 1) != MP_OKAY) { + WOLFSSL_MSG("wc_ecc_mulmod qm error"); + goto cleanup; + } } + /* copy to destination */ + if (wc_ecc_copy_point(result, (ecc_point*)r->internal)) { + WOLFSSL_MSG("wc_ecc_copy_point error"); + goto cleanup; + } + r->inSet = 1; + if (SetECPointExternal(r) != WOLFSSL_SUCCESS) { + WOLFSSL_MSG("SetECPointExternal error"); + goto cleanup; + } + + ret = WOLFSSL_SUCCESS; +cleanup: + mp_clear(&Gx); + mp_clear(&Gy); + mp_clear(&a); + mp_clear(&prime); + wc_ecc_del_point(result); return ret; } #endif @@ -36327,6 +36745,32 @@ int wolfSSL_EC_POINT_cmp(const WOLFSSL_EC_GROUP *group, return WOLFSSL_FATAL_ERROR; } + +int wolfSSL_EC_POINT_copy(WOLFSSL_EC_POINT *dest, const WOLFSSL_EC_POINT *src) +{ + WOLFSSL_ENTER("wolfSSL_EC_POINT_copy"); + + if (!dest || !src) { + return WOLFSSL_FAILURE; + } + + if (setupPoint(src) != WOLFSSL_SUCCESS) { + return WOLFSSL_FAILURE; + } + + if (wc_ecc_copy_point((ecc_point*) dest->internal, + (ecc_point*) src->internal) != MP_OKAY) { + return WOLFSSL_FAILURE; + } + + dest->inSet = 1; + + if (SetECPointExternal(dest) != WOLFSSL_SUCCESS) { + return WOLFSSL_FAILURE; + } + + return WOLFSSL_SUCCESS; +} #endif /* HAVE_ECC */ #endif /* OPENSSL_EXTRA */ @@ -36371,13 +36815,9 @@ int wolfSSL_EC_POINT_is_at_infinity(const WOLFSSL_EC_GROUP *group, WOLFSSL_MSG("wolfSSL_EC_POINT_is_at_infinity NULL error"); return WOLFSSL_FAILURE; } - if (point->inSet == 0) { - WOLFSSL_MSG("No ECPoint internal set, do it"); - if (SetECPointInternal((WOLFSSL_EC_POINT *)point) != WOLFSSL_SUCCESS) { - WOLFSSL_MSG("SetECPointInternal failed"); - return WOLFSSL_FAILURE; - } + if (setupPoint(point) != WOLFSSL_SUCCESS) { + return WOLFSSL_FAILURE; } ret = wc_ecc_point_is_at_infinity((ecc_point*)point->internal); @@ -37611,7 +38051,7 @@ WOLFSSL_EVP_PKEY *wolfSSL_PEM_read_bio_PUBKEY(WOLFSSL_BIO* bio, return pkey; if (pem_read_bio_key(bio, cb, pass, PUBLICKEY_TYPE, &keyFormat, &der) >= 0) { - unsigned char* ptr = der->buffer; + const unsigned char* ptr = der->buffer; /* handle case where reuse is attempted */ if (key != NULL && *key != NULL) @@ -38205,6 +38645,287 @@ int wolfSSL_RSA_LoadDer_ex(WOLFSSL_RSA* rsa, const unsigned char* derBuf, return WOLFSSL_SUCCESS; } +static WC_RNG* WOLFSSL_RSA_GetRNG(WOLFSSL_RSA *rsa, WC_RNG **tmpRNG, int *initTmpRng) +{ + WC_RNG* rng; + + if (!rsa || !initTmpRng) { + return NULL; + } + *initTmpRng = 0; + +#if !defined(HAVE_FIPS) && !defined(HAVE_USER_RSA) && \ + !defined(HAVE_FAST_RSA) && defined(WC_RSA_BLINDING) + rng = ((RsaKey*)rsa->internal)->rng; +#endif + if (rng == NULL && tmpRNG) { +#ifdef WOLFSSL_SMALL_STACK + if (!*tmpRNG) { + *tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_TMP_BUFFER); + if (*tmpRNG == NULL) + return NULL; + } +#endif + + if (wc_InitRng(*tmpRNG) == 0) { + rng = *tmpRNG; + *initTmpRng = 1; + } + else { + WOLFSSL_MSG("Bad RNG Init, trying global"); + if (initGlobalRNG == 0) + WOLFSSL_MSG("Global RNG no Init"); + else + rng = &globalRNG; +#ifdef WOLFSSL_SMALL_STACK + if (*tmpRNG) + XFREE(*tmpRNG, NULL, DYNAMIC_TYPE_TMP_BUFFER); + *tmpRNG = NULL; +#endif + } + } + return rng; +} + +#if defined(OPENSSL_ALL) || defined(WOLFSSL_ASIO) || defined(WOLFSSL_HAPROXY) \ + || defined(WOLFSSL_NGINX) +static int hash2mgf(enum wc_HashType hType) +{ + switch (hType) { +#ifndef NO_SHA + case WC_HASH_TYPE_SHA: + return WC_MGF1SHA1; +#endif +#ifndef NO_SHA256 +#ifdef WOLFSSL_SHA224 + case WC_HASH_TYPE_SHA224: + return WC_MGF1SHA224; +#endif + case WC_HASH_TYPE_SHA256: + return WC_MGF1SHA256; +#endif +#ifdef WOLFSSL_SHA384 + case WC_HASH_TYPE_SHA384: + return WC_MGF1SHA384; +#endif +#ifdef WOLFSSL_SHA512 + case WC_HASH_TYPE_SHA512: + return WC_MGF1SHA512; +#endif + case WC_HASH_TYPE_NONE: + case WC_HASH_TYPE_MD2: + case WC_HASH_TYPE_MD4: + case WC_HASH_TYPE_MD5: + case WC_HASH_TYPE_MD5_SHA: + case WC_HASH_TYPE_SHA3_224: + case WC_HASH_TYPE_SHA3_256: + case WC_HASH_TYPE_SHA3_384: + case WC_HASH_TYPE_SHA3_512: + case WC_HASH_TYPE_BLAKE2B: + case WC_HASH_TYPE_BLAKE2S: + default: + WOLFSSL_MSG("Unrecognized hash function"); + return WC_MGF1NONE; + } +} + +/* + * +-----------+ + * | M | + * +-----------+ + * | + * V + * Hash + * | + * V + * +--------+----------+----------+ + * M' = |Padding1| mHash | salt | + * +--------+----------+----------+ + * | + * +--------+----------+ V + * DB = |Padding2|maskedseed| Hash + * +--------+----------+ | + * | | + * V | +--+ + * xor <--- MGF <---| |bc| + * | | +--+ + * | | | + * V V V + * +-------------------+----------+--+ + * EM = | maskedDB |maskedseed|bc| + * +-------------------+----------+--+ + * Diagram taken from https://tools.ietf.org/html/rfc3447#section-9.1 + */ +int wolfSSL_RSA_padding_add_PKCS1_PSS(WOLFSSL_RSA *rsa, unsigned char *EM, + const unsigned char *mHash, + const WOLFSSL_EVP_MD *hashAlg, int saltLen) +{ + int hLen, emLen, mgf; + int ret = WOLFSSL_FAILURE; + int initTmpRng = 0; + WC_RNG *rng = NULL; +#ifdef WOLFSSL_SMALL_STACK + WC_RNG* tmpRNG = NULL; +#else + WC_RNG tmpRNG[1]; +#endif + enum wc_HashType hType; + + WOLFSSL_ENTER("wolfSSL_RSA_padding_add_PKCS1_PSS"); + + if (!rsa || !EM || !mHash || !hashAlg) { + return WOLFSSL_FAILURE; + } + + rng = WOLFSSL_RSA_GetRNG(rsa, (WC_RNG**)&tmpRNG, &initTmpRng); + + if (!rsa->exSet && SetRsaExternal(rsa) != WOLFSSL_SUCCESS) { + goto cleanup; + } + + hType = wolfSSL_EVP_MD_type(hashAlg); + if (hType < WC_HASH_TYPE_NONE || hType > WC_HASH_TYPE_MAX) { + goto cleanup; + } + + mgf = hash2mgf(hType); + + hLen = wolfSSL_EVP_MD_size(hashAlg); + if (hLen < 0) { + goto cleanup; + } + /* + * Negative sLen has special meanings: + * -1 sLen == hLen + * -2 salt length is maximized + * -3 same as above (on signing) + * -N reserved + */ + if (saltLen == RSA_PSS_SALTLEN_DIGEST) { + saltLen = hLen; + } else if (saltLen == RSA_PSS_SALTLEN_MAX_SIGN) { + saltLen = RSA_PSS_SALTLEN_MAX; + } else if (saltLen < RSA_PSS_SALTLEN_MAX) { + WOLFSSL_MSG("invalid saltLen"); + goto cleanup; + } + emLen = wolfSSL_RSA_size(rsa); + if (emLen <= 0) { + WOLFSSL_MSG("wolfSSL_RSA_size error"); + goto cleanup; + } + if (saltLen == RSA_PSS_SALTLEN_MAX) { + saltLen = emLen - hLen - 2; + } + if (wc_RsaPad_ex(mHash, wolfSSL_EVP_MD_size(hashAlg), EM, emLen, + RSA_BLOCK_TYPE_1, rng, WC_RSA_PSS_PAD, + wolfSSL_EVP_MD_type(hashAlg), mgf, NULL, 0, saltLen, + wolfSSL_BN_num_bits(rsa->n), NULL) != MP_OKAY) { + WOLFSSL_MSG("wc_RsaPad_ex error"); + goto cleanup; + } + + ret = WOLFSSL_SUCCESS; +cleanup: + if (initTmpRng) + wc_FreeRng(tmpRNG); +#ifdef WOLFSSL_SMALL_STACK + if (tmpRNG) + XFREE(tmpRNG, NULL, DYNAMIC_TYPE_TMP_BUFFER); +#endif + + return ret; +} + +/* + * Refer to wolfSSL_RSA_padding_add_PKCS1_PSS + * for an explanation of the parameters. + */ +int wolfSSL_RSA_verify_PKCS1_PSS(WOLFSSL_RSA *rsa, const unsigned char *mHash, + const WOLFSSL_EVP_MD *hashAlg, + const unsigned char *EM, int saltLen) +{ + int hLen, mgf, nLen, mPrimeLen; + enum wc_HashType hType; + byte *mPrime = NULL; + byte *buf = NULL; + + WOLFSSL_ENTER("wolfSSL_RSA_verify_PKCS1_PSS"); + + if (!rsa || !mHash || !hashAlg || !EM) { + return WOLFSSL_FAILURE; + } + + hLen = wolfSSL_EVP_MD_size(hashAlg); + if (hLen < 0) { + return WOLFSSL_FAILURE; + } + /* + * Negative sLen has special meanings: + * -1 sLen == hLen + * -2 salt length is maximized + * -3 same as above (on signing) + * -N reserved + */ + if (saltLen == RSA_PSS_SALTLEN_DIGEST) { + saltLen = hLen; + } else if (saltLen == RSA_PSS_SALTLEN_MAX_SIGN) { + saltLen = RSA_PSS_SALTLEN_MAX; + } else if (saltLen < RSA_PSS_SALTLEN_MAX) { + WOLFSSL_MSG("invalid saltLen"); + return WOLFSSL_FAILURE; + } + + if (!rsa->exSet && SetRsaExternal(rsa) != WOLFSSL_SUCCESS) { + return WOLFSSL_FAILURE; + } + + hType = wolfSSL_EVP_MD_type(hashAlg); + if (hType < WC_HASH_TYPE_NONE || hType > WC_HASH_TYPE_MAX) { + return WOLFSSL_FAILURE; + } + + mgf = hash2mgf(hType); + + hLen = wolfSSL_EVP_MD_size(hashAlg); + if (hLen < 0) { + return WOLFSSL_FAILURE; + } + + nLen = wolfSSL_BN_num_bytes(rsa->n); + if (nLen <= 0) { + return WOLFSSL_FAILURE; + } + + buf = (byte*)XMALLOC(nLen, NULL, DYNAMIC_TYPE_TMP_BUFFER); + if (!buf) { + return WOLFSSL_FAILURE; + } + XMEMCPY(buf, EM, nLen); + + /* Remove and verify the PSS padding */ + if ((mPrimeLen = wc_RsaUnPad_ex(buf, nLen, &mPrime, + RSA_BLOCK_TYPE_1, WC_RSA_PSS_PAD, hType, + mgf, NULL, 0, saltLen, + wolfSSL_BN_num_bits(rsa->n), NULL)) < 0) { + WOLFSSL_MSG("wc_RsaPad_ex error"); + XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER); + return WOLFSSL_FAILURE; + } + + /* Verify the hash is correct */ + if (wc_RsaPSS_CheckPadding_ex(mHash, hLen, mPrime, mPrimeLen, hType, + saltLen, wolfSSL_BN_num_bits(rsa->n)) + != MP_OKAY) { + WOLFSSL_MSG("wc_RsaPSS_CheckPadding_ex error"); + XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER); + return WOLFSSL_FAILURE; + } + XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER); + return WOLFSSL_SUCCESS; +} +#endif + #if defined(OPENSSL_EXTRA) WOLFSSL_RSA_METHOD *wolfSSL_RSA_meth_new(const char *name, int flags) { @@ -41141,93 +41862,132 @@ err: static WOLFSSL_ObjectInfo wolfssl_object_info[] = { /* oidHashType */ #ifdef WOLFSSL_MD2 - { NID_md2, MD2h, oidHashType, "md2", "md2"}, + { NID_md2, MD2h, oidHashType, "MD2", "md2"}, #endif #ifdef WOLFSSL_MD5 - { NID_md5, MD5h, oidHashType, "md5", "md5"}, + { NID_md5, MD5h, oidHashType, "MD5", "md5"}, #endif #ifndef NO_SHA - { NID_sha1, SHAh, oidHashType, "sha", "sha1"}, + { NID_sha1, SHAh, oidHashType, "SHA1", "sha1"}, #endif #ifdef WOLFSSL_SHA224 - { NID_sha224, SHA224h, oidHashType, "sha224", "sha224"}, + { NID_sha224, SHA224h, oidHashType, "SHA224", "sha224"}, #endif #ifndef NO_SHA256 - { NID_sha256, SHA256h, oidHashType, "sha256", "sha256"}, + { NID_sha256, SHA256h, oidHashType, "SHA256", "sha256"}, #endif #ifdef WOLFSSL_SHA384 - { NID_sha384, SHA384h, oidHashType, "sha384", "sha384"}, + { NID_sha384, SHA384h, oidHashType, "SHA384", "sha384"}, #endif #ifdef WOLFSSL_SHA512 - { NID_sha512, SHA512h, oidHashType, "sha512", "sha512"}, + { NID_sha512, SHA512h, oidHashType, "SHA512", "sha512"}, #endif /* oidSigType */ #ifndef NO_DSA #ifndef NO_SHA - { CTC_SHAwDSA, CTC_SHAwDSA, oidSigType, "shaWithDSA", "dsaWithSHA1"}, + { CTC_SHAwDSA, CTC_SHAwDSA, oidSigType, "DSA-SHA1", "dsaWithSHA1"}, #endif #endif /* NO_DSA */ #ifndef NO_RSA #ifdef WOLFSSL_MD2 - { CTC_MD2wRSA, CTC_MD2wRSA, oidSigType, "md2WithRSA", + { CTC_MD2wRSA, CTC_MD2wRSA, oidSigType, "RSA-MD2", "md2WithRSAEncryption"}, #endif #ifndef NO_MD5 - { CTC_MD5wRSA, CTC_MD5wRSA, oidSigType, "md5WithRSA", + { CTC_MD5wRSA, CTC_MD5wRSA, oidSigType, "RSA-MD5", "md5WithRSAEncryption"}, #endif #ifndef NO_SHA - { CTC_SHAwRSA, CTC_SHAwRSA, oidSigType, "shaWithRSA", + { CTC_SHAwRSA, CTC_SHAwRSA, oidSigType, "RSA-SHA1", "sha1WithRSAEncryption"}, #endif #ifdef WOLFSSL_SHA224 - { CTC_SHA224wRSA, CTC_SHA224wRSA, oidSigType, "sha224WithRSA", + { CTC_SHA224wRSA, CTC_SHA224wRSA, oidSigType, "RSA-SHA224", "sha224WithRSAEncryption"}, #endif #ifndef NO_SHA256 - { CTC_SHA256wRSA, CTC_SHA256wRSA, oidSigType, "sha256WithRSA", + { CTC_SHA256wRSA, CTC_SHA256wRSA, oidSigType, "RSA-SHA256", "sha256WithRSAEncryption"}, #endif #ifdef WOLFSSL_SHA384 - { CTC_SHA384wRSA, CTC_SHA384wRSA, oidSigType, "sha384WithRSA", + { CTC_SHA384wRSA, CTC_SHA384wRSA, oidSigType, "RSA-SHA384", "sha384WithRSAEncryption"}, #endif #ifdef WOLFSSL_SHA512 - { CTC_SHA512wRSA, CTC_SHA512wRSA, oidSigType, "sha512WithRSA", + { CTC_SHA512wRSA, CTC_SHA512wRSA, oidSigType, "RSA-SHA512", "sha512WithRSAEncryption"}, #endif #endif /* NO_RSA */ #ifdef HAVE_ECC #ifndef NO_SHA - { CTC_SHAwECDSA, CTC_SHAwECDSA, oidSigType, "shaWithECDSA", ""}, + { CTC_SHAwECDSA, CTC_SHAwECDSA, oidSigType, "ecdsa-with-SHA1", "shaWithECDSA"}, #endif #ifdef WOLFSSL_SHA224 - { CTC_SHA224wECDSA, CTC_SHA224wECDSA, oidSigType, "sha224WithECDSA",""}, + { CTC_SHA224wECDSA, CTC_SHA224wECDSA, oidSigType, "ecdsa-with-SHA224","sha224WithECDSA"}, #endif #ifndef NO_SHA256 - { CTC_SHA256wECDSA, CTC_SHA256wECDSA, oidSigType, "sha256WithECDSA",""}, + { CTC_SHA256wECDSA, CTC_SHA256wECDSA, oidSigType, "ecdsa-with-SHA256","sha256WithECDSA"}, #endif #ifdef WOLFSSL_SHA384 - { CTC_SHA384wECDSA, CTC_SHA384wECDSA, oidSigType, "sha384WithECDSA",""}, + { CTC_SHA384wECDSA, CTC_SHA384wECDSA, oidSigType, "ecdsa-with-SHA384","sha384WithECDSA"}, #endif #ifdef WOLFSSL_SHA512 - { CTC_SHA512wECDSA, CTC_SHA512wECDSA, oidSigType, "sha512WithECDSA",""}, + { CTC_SHA512wECDSA, CTC_SHA512wECDSA, oidSigType, "ecdsa-with-SHA512","sha512WithECDSA"}, #endif #endif /* HAVE_ECC */ /* oidKeyType */ #ifndef NO_DSA - { DSAk, DSAk, oidKeyType, "DSA key", "dsaEncryption"}, + { DSAk, DSAk, oidKeyType, "DSA", "dsaEncryption"}, #endif /* NO_DSA */ #ifndef NO_RSA - { RSAk, RSAk, oidKeyType, "RSA key", "rsaEncryption"}, + { RSAk, RSAk, oidKeyType, "RSA", "rsaEncryption"}, #endif /* NO_RSA */ #ifdef HAVE_NTRU - { NTRUk, NTRUk, oidKeyType, "NTRU key", "ntruEncryption"}, + { NTRUk, NTRUk, oidKeyType, "NTRU", "ntruEncryption"}, #endif /* HAVE_NTRU */ #ifdef HAVE_ECC - { ECDSAk, ECDSAk, oidKeyType, "ECDSA key", "ecdsaEncryption"}, + { ECDSAk, ECDSAk, oidKeyType, "ECDSA", "ecdsaEncryption"}, + #endif /* HAVE_ECC */ + + /* oidCurveType */ + #ifdef HAVE_ECC + { NID_X9_62_prime192v1, ECC_SECP192R1_OID, oidCurveType, "prime192v1", ""}, + { NID_X9_62_prime192v2, ECC_PRIME192V2_OID, oidCurveType, "prime192v2", ""}, + { NID_X9_62_prime192v3, ECC_PRIME192V3_OID, oidCurveType, "prime192v3", ""}, + + { NID_X9_62_prime239v1, ECC_PRIME239V1_OID, oidCurveType, "prime239v1", ""}, + { NID_X9_62_prime239v2, ECC_PRIME239V2_OID, oidCurveType, "prime239v2", ""}, + { NID_X9_62_prime239v3, ECC_PRIME239V3_OID, oidCurveType, "prime239v3", ""}, + + { NID_X9_62_prime256v1, ECC_SECP256R1_OID, oidCurveType, "prime256v1", ""}, + + { NID_secp112r1, ECC_SECP112R1_OID, oidCurveType, "secp112r1", ""}, + { NID_secp112r2, ECC_SECP112R2_OID, oidCurveType, "secp112r2", ""}, + + { NID_secp128r1, ECC_SECP128R1_OID, oidCurveType, "secp128r1", ""}, + { NID_secp128r2, ECC_SECP128R2_OID, oidCurveType, "secp128r2", ""}, + + { NID_secp160r1, ECC_SECP160R1_OID, oidCurveType, "secp160r1", ""}, + { NID_secp160r2, ECC_SECP160R2_OID, oidCurveType, "secp160r2", ""}, + + { NID_secp224r1, ECC_SECP224R1_OID, oidCurveType, "secp224r1", ""}, + { NID_secp384r1, ECC_SECP384R1_OID, oidCurveType, "secp384r1", ""}, + { NID_secp521r1, ECC_SECP521R1_OID, oidCurveType, "secp521r1", ""}, + + { NID_secp160k1, ECC_SECP160K1_OID, oidCurveType, "secp160k1", ""}, + { NID_secp192k1, ECC_SECP192K1_OID, oidCurveType, "secp192k1", ""}, + { NID_secp224k1, ECC_SECP224K1_OID, oidCurveType, "secp224k1", ""}, + { NID_secp256k1, ECC_SECP256K1_OID, oidCurveType, "secp256k1", ""}, + + { NID_brainpoolP160r1, ECC_BRAINPOOLP160R1_OID, oidCurveType, "brainpoolP160r1", ""}, + { NID_brainpoolP192r1, ECC_BRAINPOOLP192R1_OID, oidCurveType, "brainpoolP192r1", ""}, + { NID_brainpoolP224r1, ECC_BRAINPOOLP224R1_OID, oidCurveType, "brainpoolP224r1", ""}, + { NID_brainpoolP256r1, ECC_BRAINPOOLP256R1_OID, oidCurveType, "brainpoolP256r1", ""}, + { NID_brainpoolP320r1, ECC_BRAINPOOLP320R1_OID, oidCurveType, "brainpoolP320r1", ""}, + { NID_brainpoolP384r1, ECC_BRAINPOOLP384R1_OID, oidCurveType, "brainpoolP384r1", ""}, + { NID_brainpoolP512r1, ECC_BRAINPOOLP512R1_OID, oidCurveType, "brainpoolP512r1", ""}, #endif /* HAVE_ECC */ /* oidBlkType */ @@ -41242,50 +42002,50 @@ err: #endif #ifndef NO_DES3 { NID_des, DESb, oidBlkType, "DES-CBC", "des-cbc"}, - { NID_des3, DES3b, oidBlkType, "DES3-CBC", "des3-cbc"}, + { NID_des3, DES3b, oidBlkType, "DES-EDE3-CBC", "des-ede3-cbc"}, #endif /* !NO_DES3 */ /* oidOcspType */ #ifdef HAVE_OCSP - { NID_id_pkix_OCSP_basic, OCSP_BASIC_OID, oidOcspType, "OCSP_basic", + { NID_id_pkix_OCSP_basic, OCSP_BASIC_OID, oidOcspType, "basicOCSPResponse", "Basic OCSP Response"}, - { OCSP_NONCE_OID, OCSP_NONCE_OID, oidOcspType, "OCSP_nonce", + { OCSP_NONCE_OID, OCSP_NONCE_OID, oidOcspType, "Nonce", "OCSP Nonce"}, #endif /* HAVE_OCSP */ #ifndef NO_CERTS /* oidCertExtType */ - { NID_basic_constraints, BASIC_CA_OID, oidCertExtType, "X509 basic ca", + { NID_basic_constraints, BASIC_CA_OID, oidCertExtType, "basicConstraints", "X509v3 Basic Constraints"}, - { NID_subject_alt_name, ALT_NAMES_OID, oidCertExtType, "X509 alt names", + { NID_subject_alt_name, ALT_NAMES_OID, oidCertExtType, "subjectAltName", "X509v3 Subject Alternative Name"}, - { CRL_DIST_OID, CRL_DIST_OID, oidCertExtType, "X509 crl", + { CRL_DIST_OID, CRL_DIST_OID, oidCertExtType, "crlDistributionPoints", "X509v3 CRL Distribution Points"}, - { NID_info_access, AUTH_INFO_OID, oidCertExtType, "X509 auth info", + { NID_info_access, AUTH_INFO_OID, oidCertExtType, "authorityInfoAccess", "Authority Information Access"}, { NID_authority_key_identifier, AUTH_KEY_OID, oidCertExtType, - "X509 auth key", "X509v3 Authority Key Identifier"}, + "authorityKeyIdentifier", "X509v3 Authority Key Identifier"}, { NID_subject_key_identifier, SUBJ_KEY_OID, oidCertExtType, - "X509 subject key", "X509v3 Subject Key Identifier"}, - { NID_key_usage, KEY_USAGE_OID, oidCertExtType, "X509 key usage", + "subjectKeyIdentifier", "X509v3 Subject Key Identifier"}, + { NID_key_usage, KEY_USAGE_OID, oidCertExtType, "keyUsage", "X509v3 Key Usage"}, { NID_inhibit_any_policy, INHIBIT_ANY_OID, oidCertExtType, - "X509 inhibit any", "X509v3 Inhibit Any Policy"}, + "inhibitAnyPolicy", "X509v3 Inhibit Any Policy"}, { NID_ext_key_usage, KEY_USAGE_OID, oidCertExtType, - "X509 ext key usage", "X509v3 Extended Key Usage"}, + "extendedKeyUsage", "X509v3 Extended Key Usage"}, { NID_name_constraints, NAME_CONS_OID, oidCertExtType, - "X509 name constraints", "X509v3 Name Constraints"}, + "nameConstraints", "X509v3 Name Constraints"}, { NID_certificate_policies, CERT_POLICY_OID, oidCertExtType, - "X509 certificate policies", "X509v3 Certificate Policies"}, + "certificatePolicies", "X509v3 Certificate Policies"}, /* oidCertAuthInfoType */ - { AIA_OCSP_OID, AIA_OCSP_OID, oidCertAuthInfoType, "Cert Auth OCSP", + { AIA_OCSP_OID, AIA_OCSP_OID, oidCertAuthInfoType, "authorityInfoAccess", "Authority Information Access"}, { AIA_CA_ISSUER_OID, AIA_CA_ISSUER_OID, oidCertAuthInfoType, - "Cert Auth CA Issuer", "CA Issuers"}, + "caIssuers", "CA Issuers"}, /* oidCertPolicyType */ - { NID_any_policy, CP_ANY_OID, oidCertPolicyType, "Cert any policy", + { NID_any_policy, CP_ANY_OID, oidCertPolicyType, "anyPolicy", "X509v3 Any Policy"}, /* oidCertAltNameType */ @@ -41293,13 +42053,13 @@ err: /* oidCertKeyUseType */ { NID_anyExtendedKeyUsage, EKU_ANY_OID, oidCertKeyUseType, - "Cert any extended key", "Any Extended Key Usage"}, + "anyExtendedKeyUsage", "Any Extended Key Usage"}, { EKU_SERVER_AUTH_OID, EKU_SERVER_AUTH_OID, oidCertKeyUseType, - "Cert server auth key", "TLS Web Server Authentication"}, + "serverAuth", "TLS Web Server Authentication"}, { EKU_CLIENT_AUTH_OID, EKU_CLIENT_AUTH_OID, oidCertKeyUseType, - "Cert client auth key", "TLS Web Client Authentication"}, + "clientAuth", "TLS Web Client Authentication"}, { EKU_OCSP_SIGN_OID, EKU_OCSP_SIGN_OID, oidCertKeyUseType, - "Cert OCSP sign key", "OCSP Signing"}, + "OCSPSigning", "OCSP Signing"}, /* oidCertNameType */ { NID_commonName, NID_commonName, oidCertNameType, "CN", "commonName"}, @@ -41323,22 +42083,22 @@ err: /* oidPBEType */ { PBE_SHA1_RC4_128, PBE_SHA1_RC4_128, oidPBEType, - "PBE shaWithRC4-128", "pbeWithSHA1And128BitRC4"}, - { PBE_SHA1_DES, PBE_SHA1_DES, oidPBEType, "PBE shaWithDES", + "PBE-SHA1-RC4-128", "pbeWithSHA1And128BitRC4"}, + { PBE_SHA1_DES, PBE_SHA1_DES, oidPBEType, "PBE-SHA1-DES", "pbeWithSHA1AndDES-CBC"}, - { PBE_SHA1_DES3, PBE_SHA1_DES3, oidPBEType, "PBE shaWithDES3", + { PBE_SHA1_DES3, PBE_SHA1_DES3, oidPBEType, "PBE-SHA1-3DES", "pbeWithSHA1And3-KeyTripleDES-CBC"}, #endif /* oidKeyWrapType */ #ifdef WOLFSSL_AES_128 - { AES128_WRAP, AES128_WRAP, oidKeyWrapType, "AES-128 wrap", ""}, + { AES128_WRAP, AES128_WRAP, oidKeyWrapType, "AES-128 wrap", "aes128-wrap"}, #endif #ifdef WOLFSSL_AES_192 - { AES192_WRAP, AES192_WRAP, oidKeyWrapType, "AES-192 wrap", ""}, + { AES192_WRAP, AES192_WRAP, oidKeyWrapType, "AES-192 wrap", "aes192-wrap"}, #endif #ifdef WOLFSSL_AES_256 - { AES256_WRAP, AES256_WRAP, oidKeyWrapType, "AES-256 wrap", ""}, + { AES256_WRAP, AES256_WRAP, oidKeyWrapType, "AES-256 wrap", "aes256-wrap"}, #endif #ifndef NO_PKCS7 @@ -41346,27 +42106,27 @@ err: /* oidCmsKeyAgreeType */ #ifndef NO_SHA { dhSinglePass_stdDH_sha1kdf_scheme, dhSinglePass_stdDH_sha1kdf_scheme, - oidCmsKeyAgreeType, "DH-SHA kdf", ""}, + oidCmsKeyAgreeType, "dhSinglePass-stdDH-sha1kdf-scheme", "dhSinglePass-stdDH-sha1kdf-scheme"}, #endif #ifdef WOLFSSL_SHA224 { dhSinglePass_stdDH_sha224kdf_scheme, - dhSinglePass_stdDH_sha224kdf_scheme, oidCmsKeyAgreeType, - "DH-SHA224 kdf", ""}, + dhSinglePass_stdDH_sha224kdf_scheme, oidCmsKeyAgreeType, + "dhSinglePass-stdDH-sha224kdf-scheme", "dhSinglePass-stdDH-sha224kdf-scheme"}, #endif #ifndef NO_SHA256 { dhSinglePass_stdDH_sha256kdf_scheme, dhSinglePass_stdDH_sha256kdf_scheme, oidCmsKeyAgreeType, - "DH-SHA256 kdf", ""}, + "dhSinglePass-stdDH-sha256kdf-scheme", "dhSinglePass-stdDH-sha256kdf-scheme"}, #endif #ifdef WOLFSSL_SHA384 { dhSinglePass_stdDH_sha384kdf_scheme, dhSinglePass_stdDH_sha384kdf_scheme, oidCmsKeyAgreeType, - "DH-SHA384 kdf", ""}, + "dhSinglePass-stdDH-sha384kdf-scheme", "dhSinglePass-stdDH-sha384kdf-scheme"}, #endif #ifdef WOLFSSL_SHA512 { dhSinglePass_stdDH_sha512kdf_scheme, dhSinglePass_stdDH_sha512kdf_scheme, oidCmsKeyAgreeType, - "DH-SHA512 kdf", ""}, + "dhSinglePass-stdDH-sha512kdf-scheme", "dhSinglePass-stdDH-sha512kdf-scheme"}, #endif #endif #endif @@ -47498,6 +48258,68 @@ int oid2nid(word32 oid, int grp) } break; + + #ifdef HAVE_ECC + case oidCurveType: + switch (oid) { + case ECC_SECP192R1_OID: + return NID_X9_62_prime192v1; + case ECC_PRIME192V2_OID: + return NID_X9_62_prime192v2; + case ECC_PRIME192V3_OID: + return NID_X9_62_prime192v3; + case ECC_PRIME239V1_OID: + return NID_X9_62_prime239v1; + case ECC_PRIME239V2_OID: + return NID_X9_62_prime239v2; + case ECC_PRIME239V3_OID: + return NID_X9_62_prime239v3; + case ECC_SECP256R1_OID: + return NID_X9_62_prime256v1; + case ECC_SECP112R1_OID: + return NID_secp112r1; + case ECC_SECP112R2_OID: + return NID_secp112r2; + case ECC_SECP128R1_OID: + return NID_secp128r1; + case ECC_SECP128R2_OID: + return NID_secp128r2; + case ECC_SECP160R1_OID: + return NID_secp160r1; + case ECC_SECP160R2_OID: + return NID_secp160r2; + case ECC_SECP224R1_OID: + return NID_secp224r1; + case ECC_SECP384R1_OID: + return NID_secp384r1; + case ECC_SECP521R1_OID: + return NID_secp521r1; + case ECC_SECP160K1_OID: + return NID_secp160k1; + case ECC_SECP192K1_OID: + return NID_secp192k1; + case ECC_SECP224K1_OID: + return NID_secp224k1; + case ECC_SECP256K1_OID: + return NID_secp256k1; + case ECC_BRAINPOOLP160R1_OID: + return NID_brainpoolP160r1; + case ECC_BRAINPOOLP192R1_OID: + return NID_brainpoolP192r1; + case ECC_BRAINPOOLP224R1_OID: + return NID_brainpoolP224r1; + case ECC_BRAINPOOLP256R1_OID: + return NID_brainpoolP256r1; + case ECC_BRAINPOOLP320R1_OID: + return NID_brainpoolP320r1; + case ECC_BRAINPOOLP384R1_OID: + return NID_brainpoolP384r1; + case ECC_BRAINPOOLP512R1_OID: + return NID_brainpoolP512r1; + } + break; + #endif /* HAVE_ECC */ + /* oidBlkType */ case oidBlkType: switch (oid) { @@ -47935,29 +48757,7 @@ int wolfSSL_RSA_public_encrypt(int len, const unsigned char* fr, outLen = wolfSSL_RSA_size(rsa); -#if !defined(HAVE_FIPS) && !defined(HAVE_USER_RSA) && \ - !defined(HAVE_FAST_RSA) && defined(WC_RSA_BLINDING) - rng = ((RsaKey*)rsa->internal)->rng; -#endif - if (rng == NULL) { -#ifdef WOLFSSL_SMALL_STACK - tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_TMP_BUFFER); - if (tmpRNG == NULL) - return 0; -#endif - - if (wc_InitRng(tmpRNG) == 0) { - rng = tmpRNG; - initTmpRng = 1; - } - else { - WOLFSSL_MSG("Bad RNG Init, trying global"); - if (initGlobalRNG == 0) - WOLFSSL_MSG("Global RNG no Init"); - else - rng = &globalRNG; - } - } + rng = WOLFSSL_RSA_GetRNG(rsa, (WC_RNG**)&tmpRNG, &initTmpRng); if (outLen == 0) { WOLFSSL_MSG("Bad RSA size"); @@ -47982,9 +48782,9 @@ int wolfSSL_RSA_public_encrypt(int len, const unsigned char* fr, if (initTmpRng) wc_FreeRng(tmpRNG); - #ifdef WOLFSSL_SMALL_STACK - XFREE(tmpRNG, NULL, DYNAMIC_TYPE_TMP_BUFFER); + if (tmpRNG) + XFREE(tmpRNG, NULL, DYNAMIC_TYPE_TMP_BUFFER); #endif if (ret >= 0) @@ -48081,17 +48881,31 @@ int wolfSSL_RSA_public_decrypt(int flen, const unsigned char* from, unsigned char* to, WOLFSSL_RSA* rsa, int padding) { int tlen = 0; + int pad_type; WOLFSSL_ENTER("wolfSSL_RSA_public_decrypt"); if (rsa == NULL || rsa->internal == NULL || from == NULL) { WOLFSSL_MSG("Bad function arguments"); - return 0; + return WOLFSSL_FAILURE; } - if (padding != RSA_PKCS1_PADDING && padding != RSA_PKCS1_PSS_PADDING) { + switch (padding) { + case RSA_PKCS1_PADDING: + pad_type = WC_RSA_PKCSV15_PAD; + break; + case RSA_PKCS1_OAEP_PADDING: + pad_type = WC_RSA_OAEP_PAD; + break; + case RSA_PKCS1_PSS_PADDING: + pad_type = WC_RSA_PSS_PAD; + break; + case RSA_NO_PADDING: + pad_type = WC_RSA_NO_PAD; + break; + default: WOLFSSL_MSG("wolfSSL_RSA_public_decrypt unsupported padding"); - return 0; + return WOLFSSL_FAILURE; } if (rsa->inSet == 0) @@ -48100,13 +48914,13 @@ int wolfSSL_RSA_public_decrypt(int flen, const unsigned char* from, if (SetRsaInternal(rsa) != WOLFSSL_SUCCESS) { WOLFSSL_MSG("SetRsaInternal failed"); - return 0; + return WOLFSSL_FAILURE; } } /* size of 'to' buffer must be size of RSA key */ - tlen = wc_RsaSSL_Verify(from, flen, to, wolfSSL_RSA_size(rsa), - (RsaKey*)rsa->internal); + tlen = wc_RsaSSL_Verify_ex(from, flen, to, wolfSSL_RSA_size(rsa), + (RsaKey*)rsa->internal, pad_type); if (tlen <= 0) WOLFSSL_MSG("wolfSSL_RSA_public_decrypt failed"); else { @@ -49044,6 +49858,31 @@ int wolfSSL_BN_add(WOLFSSL_BIGNUM *r, WOLFSSL_BIGNUM *a, WOLFSSL_BIGNUM *b) return WOLFSSL_SUCCESS; } +/* r = a + b (mod m) */ +int wolfSSL_BN_mod_add(WOLFSSL_BIGNUM *r, const WOLFSSL_BIGNUM *a, + const WOLFSSL_BIGNUM *b, const WOLFSSL_BIGNUM *m, + WOLFSSL_BN_CTX *ctx) +{ + (void)ctx; + WOLFSSL_MSG("wolfSSL_BN_add"); + + if (r == NULL || r->internal == NULL || + a == NULL || a->internal == NULL || + b == NULL || b->internal == NULL || + m == NULL || m->internal == NULL) { + WOLFSSL_MSG("bn NULL error"); + return WOLFSSL_FAILURE; + } + + if (mp_addmod((mp_int*)a->internal, (mp_int*)b->internal, + (mp_int*)m->internal, (mp_int*)r->internal) != MP_OKAY) { + WOLFSSL_MSG("mp_add_d error"); + return WOLFSSL_FAILURE; + } + + return WOLFSSL_SUCCESS; +} + #ifdef WOLFSSL_KEY_GEN /* return code compliant with OpenSSL : diff --git a/tests/api.c b/tests/api.c index 544e269ad..909624a7a 100644 --- a/tests/api.c +++ b/tests/api.c @@ -1798,6 +1798,8 @@ static void test_wolfSSL_EC(void) BIGNUM *set_point_bn; char* hexStr; int group_bits; + int bin_len; + unsigned char* buf = NULL; const char* kTest = "F4F8338AFCC562C5C3F3E1E46A7EFECD17AF381913FF7A96314EA47055EA0FD0"; /* NISTP256R1 Gx/Gy */ @@ -1805,8 +1807,26 @@ static void test_wolfSSL_EC(void) const char* kGy = "4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5"; #ifndef HAVE_SELFTEST + EC_POINT *tmp; + const char* uncompG = "046B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C2964FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5"; + const unsigned char binUncompG[] = { + 0x04, 0x6b, 0x17, 0xd1, 0xf2, 0xe1, 0x2c, 0x42, 0x47, 0xf8, 0xbc, + 0xe6, 0xe5, 0x63, 0xa4, 0x40, 0xf2, 0x77, 0x03, 0x7d, 0x81, 0x2d, + 0xeb, 0x33, 0xa0, 0xf4, 0xa1, 0x39, 0x45, 0xd8, 0x98, 0xc2, 0x96, + 0x4f, 0xe3, 0x42, 0xe2, 0xfe, 0x1a, 0x7f, 0x9b, 0x8e, 0xe7, 0xeb, + 0x4a, 0x7c, 0x0f, 0x9e, 0x16, 0x2b, 0xce, 0x33, 0x57, 0x6b, 0x31, + 0x5e, 0xce, 0xcb, 0xb6, 0x40, 0x68, 0x37, 0xbf, 0x51, 0xf5, + }; + +#ifdef HAVE_COMP_KEY const char* compG = "036B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296"; + const unsigned char binCompG[] = { + 0x03, 0x6b, 0x17, 0xd1, 0xf2, 0xe1, 0x2c, 0x42, 0x47, 0xf8, 0xbc, + 0xe6, 0xe5, 0x63, 0xa4, 0x40, 0xf2, 0x77, 0x03, 0x7d, 0x81, 0x2d, + 0xeb, 0x33, 0xa0, 0xf4, 0xa1, 0x39, 0x45, 0xd8, 0x98, 0xc2, 0x96, + }; +#endif #endif AssertNotNull(ctx = BN_CTX_new()); @@ -1837,8 +1857,9 @@ static void test_wolfSSL_EC(void) AssertIntEQ(BN_is_zero(new_point->X), WOLFSSL_FAILURE); /* Force non-affine coordinates */ - AssertIntEQ(wolfSSL_BN_add(new_point->Z, (WOLFSSL_BIGNUM*)BN_value_one(), - (WOLFSSL_BIGNUM*)BN_value_one()), 1); + AssertIntEQ(BN_add(new_point->Z, (WOLFSSL_BIGNUM*)BN_value_one(), + (WOLFSSL_BIGNUM*)BN_value_one()), 1); + new_point->inSet = 0; /* extract the coordinates from point */ AssertIntEQ(EC_POINT_get_affine_coordinates_GFp(group, new_point, X, Y, ctx), WOLFSSL_SUCCESS); @@ -1852,6 +1873,9 @@ static void test_wolfSSL_EC(void) /* compare points as they should be the same */ AssertIntEQ(EC_POINT_cmp(group, new_point, set_point, ctx), 0); + /* Test copying */ + AssertIntEQ(EC_POINT_copy(new_point, set_point), 1); + AssertPtrEq(EC_POINT_point2bn(group, set_point, POINT_CONVERSION_UNCOMPRESSED, set_point_bn, ctx), set_point_bn); @@ -1885,11 +1909,48 @@ static void test_wolfSSL_EC(void) AssertStrEQ(hexStr, uncompG); XFREE(hexStr, NULL, DYNAMIC_TYPE_ECC); +#ifdef HAVE_COMP_KEY hexStr = EC_POINT_point2hex(group, Gxy, POINT_CONVERSION_COMPRESSED, ctx); AssertStrEQ(hexStr, compG); XFREE(hexStr, NULL, DYNAMIC_TYPE_ECC); #endif + bin_len = EC_POINT_point2oct(group, Gxy, POINT_CONVERSION_UNCOMPRESSED, NULL, 0, ctx); + AssertIntEQ(bin_len, sizeof(binUncompG)); + AssertNotNull(buf = (unsigned char*)XMALLOC(bin_len, NULL, DYNAMIC_TYPE_ECC)); + AssertIntEQ(EC_POINT_point2oct(group, Gxy, POINT_CONVERSION_UNCOMPRESSED, buf, + bin_len, ctx), bin_len); + AssertIntEQ(XMEMCMP(buf, binUncompG, sizeof(binUncompG)), 0); + XFREE(buf, NULL, DYNAMIC_TYPE_ECC); + +#ifdef HAVE_COMP_KEY + bin_len = EC_POINT_point2oct(group, Gxy, POINT_CONVERSION_COMPRESSED, NULL, 0, ctx); + AssertIntEQ(bin_len, sizeof(binCompG)); + AssertNotNull(buf = (unsigned char*)XMALLOC(bin_len, NULL, DYNAMIC_TYPE_ECC)); + AssertIntEQ(EC_POINT_point2oct(group, Gxy, POINT_CONVERSION_COMPRESSED, buf, + bin_len, ctx), bin_len); + AssertIntEQ(XMEMCMP(buf, binCompG, sizeof(binCompG)), 0); + XFREE(buf, NULL, DYNAMIC_TYPE_ECC); +#endif + + AssertNotNull(tmp = EC_POINT_new(group)); + AssertIntEQ(EC_POINT_oct2point(group, tmp, binUncompG, sizeof(binUncompG), ctx), 1); + AssertIntEQ(EC_POINT_cmp(group, tmp, Gxy, ctx), 0); + EC_POINT_free(tmp); + +#ifdef HAVE_COMP_KEY + AssertNotNull(tmp = EC_POINT_new(group)); + AssertIntEQ(EC_POINT_oct2point(group, tmp, binCompG, sizeof(binCompG), ctx), 1); + AssertIntEQ(EC_POINT_cmp(group, tmp, Gxy, ctx), 0); + EC_POINT_free(tmp); +#endif +#endif + + /* test BN_mod_add */ + AssertIntEQ(BN_mod_add(new_point->Z, (WOLFSSL_BIGNUM*)BN_value_one(), + (WOLFSSL_BIGNUM*)BN_value_one(), + (WOLFSSL_BIGNUM*)BN_value_one(), NULL), 1); + AssertIntEQ(BN_is_zero(new_point->Z), 1); /* cleanup */ BN_free(X); BN_free(Y); @@ -5218,7 +5279,7 @@ static void test_wolfSSL_X509_verify(void) WOLFSSL_X509* server; WOLFSSL_EVP_PKEY* pkey; unsigned char buf[2048]; - unsigned char* pt; + const unsigned char* pt; int bufSz; printf(testingFmt, "wolfSSL X509 verify"); @@ -15984,6 +16045,50 @@ static int test_wc_ecc_check_key (void) } /* END test_wc_ecc_check_key */ +/* + * Testing wc_ecc_get_generator() + */ +static int test_wc_ecc_get_generator(void) +{ + int ret = 0; +#if defined(HAVE_ECC) && !defined(WC_NO_RNG) + ecc_point* pt; + + + printf(testingFmt, "wc_ecc_new_point()"); + + pt = wc_ecc_new_point(); + if (!pt) { + ret = WOLFSSL_FATAL_ERROR; + } + + printf(testingFmt, "wc_ecc_get_generator()"); + + if (ret == 0) { + ret = wc_ecc_get_generator(pt, wc_ecc_get_curve_idx(ECC_SECP256R1)); + } + + /* Test bad args. */ + if (ret == MP_OKAY) { + /* Returns Zero for bad arg. */ + ret = wc_ecc_get_generator(pt, -1); + if (ret != MP_OKAY) + wc_ecc_get_generator(NULL, wc_ecc_get_curve_idx(ECC_SECP256R1)); + if (ret != MP_OKAY) + wc_ecc_get_generator(pt, 1000); /* If we ever get to 1000 curves + * increase this number */ + if (ret != MP_OKAY) + wc_ecc_get_generator(NULL, -1); + ret = ret == MP_OKAY ? WOLFSSL_FATAL_ERROR : 0; + } + + printf(resultFmt, ret == 0 ? passed : failed); + + wc_ecc_del_point(pt); +#endif + return ret; +} /* END test_wc_ecc_get_generator */ + /* * Testing wc_ecc_size() */ @@ -21480,7 +21585,7 @@ static void test_wolfSSL_EVP_MD_rsa_signing(void) size_t checkSz = -1; int sz = 2048 / 8; const unsigned char* cp; - unsigned char* p; + const unsigned char* p; unsigned char check[2048/8]; printf(testingFmt, "wolfSSL_EVP_MD_rsa_signing()"); @@ -21488,7 +21593,7 @@ static void test_wolfSSL_EVP_MD_rsa_signing(void) cp = client_key_der_2048; AssertNotNull((privKey = wolfSSL_d2i_PrivateKey(EVP_PKEY_RSA, NULL, &cp, sizeof_client_key_der_2048))); - p = (unsigned char *)client_keypub_der_2048; + p = client_keypub_der_2048; AssertNotNull((pubKey = wolfSSL_d2i_PUBKEY(NULL, &p, sizeof_client_keypub_der_2048))); @@ -21553,7 +21658,7 @@ static void test_wolfSSL_EVP_MD_ecc_signing(void) WOLFSSL_EVP_MD_CTX mdCtx; size_t checkSz = -1; const unsigned char* cp; - unsigned char* p; + const unsigned char* p; unsigned char check[2048/8]; printf(testingFmt, "wolfSSL_EVP_MD_ecc_signing()"); @@ -21561,7 +21666,7 @@ static void test_wolfSSL_EVP_MD_ecc_signing(void) cp = ecc_clikey_der_256; AssertNotNull((privKey = wolfSSL_d2i_PrivateKey(EVP_PKEY_EC, NULL, &cp, sizeof_ecc_clikey_der_256))); - p = (unsigned char *)ecc_clikeypub_der_256; + p = ecc_clikeypub_der_256; AssertNotNull((pubKey = wolfSSL_d2i_PUBKEY(NULL, &p, sizeof_ecc_clikeypub_der_256))); @@ -23622,13 +23727,13 @@ static void test_wolfSSL_X509_sign(void) EVP_PKEY *pub; EVP_PKEY *priv; #if defined(USE_CERT_BUFFERS_1024) - const unsigned char* rsaPriv = (const unsigned char*)client_key_der_1024; - unsigned char* rsaPub = (unsigned char*)client_keypub_der_1024; + const unsigned char* rsaPriv = client_key_der_1024; + const unsigned char* rsaPub = client_keypub_der_1024; long clientKeySz = (long)sizeof_client_key_der_1024; long clientPubKeySz = (long)sizeof_client_keypub_der_1024; #elif defined(USE_CERT_BUFFERS_2048) - const unsigned char* rsaPriv = (const unsigned char*)client_key_der_2048; - unsigned char* rsaPub = (unsigned char*)client_keypub_der_2048; + const unsigned char* rsaPriv = client_key_der_2048; + const unsigned char* rsaPub = client_keypub_der_2048; long clientKeySz = (long)sizeof_client_key_der_2048; long clientPubKeySz = (long)sizeof_client_keypub_der_2048; #endif @@ -23729,6 +23834,8 @@ static void test_wolfSSL_X509_ALGOR_get0(void) X509* x509 = NULL; const ASN1_OBJECT* obj = NULL; const X509_ALGOR* alg; + int pptype = 0; + const void *ppval = NULL; printf(testingFmt, "wolfSSL_X509_ALGOR_get0"); AssertNotNull(x509 = wolfSSL_X509_load_certificate_file(cliCertFile, @@ -23740,8 +23847,10 @@ static void test_wolfSSL_X509_ALGOR_get0(void) AssertNull(obj); /* Valid case */ - X509_ALGOR_get0(&obj, NULL, NULL, alg); + X509_ALGOR_get0(&obj, &pptype, &ppval, alg); AssertNotNull(obj); + AssertNotNull(ppval); + AssertIntNE(pptype, 0); /* Make sure NID of X509_ALGOR is Sha256 with RSA */ AssertIntEQ(OBJ_obj2nid(obj), CTC_SHA256wRSA); @@ -23815,23 +23924,38 @@ static void test_wolfSSL_X509_get_X509_PUBKEY(void) #endif } -static void test_wolfSSL_X509_PUBKEY_get0_param(void) +static void test_wolfSSL_X509_PUBKEY(void) { #if (defined(OPENSSL_ALL) || defined(WOLFSSL_APACHE_HTTPD)) && !defined(NO_SHA256) X509* x509 = NULL; ASN1_OBJECT* obj = NULL; X509_PUBKEY* pubKey; + X509_PUBKEY* pubKey2; + EVP_PKEY* evpKey; + + const unsigned char *pk; + int ppklen; + WOLFSSL_X509_ALGOR *pa; + printf(testingFmt, "wolfSSL_X509_get_X509_PUBKEY"); - AssertNotNull(x509 = wolfSSL_X509_load_certificate_file(cliCertFile, - SSL_FILETYPE_PEM)); + AssertNotNull(x509 = X509_load_certificate_file(cliCertFile, + SSL_FILETYPE_PEM)); - AssertNotNull(pubKey = wolfSSL_X509_get_X509_PUBKEY(x509)); - X509_PUBKEY_get0_param(&obj, NULL, 0, NULL, pubKey); + AssertNotNull(pubKey = X509_get_X509_PUBKEY(x509)); + AssertIntEQ(X509_PUBKEY_get0_param(&obj, &pk, &ppklen, &pa, pubKey), 1); + AssertNotNull(pk); + AssertNotNull(pa); AssertNotNull(pubKey); + AssertIntGT(ppklen, 0); AssertIntEQ(OBJ_obj2nid(obj), RSAk); + AssertNotNull(evpKey = X509_PUBKEY_get(pubKey)); + AssertNotNull(pubKey2 = X509_PUBKEY_new()); + AssertIntEQ(X509_PUBKEY_set(&pubKey2, evpKey), 1); + + X509_PUBKEY_free(pubKey2); X509_free(x509); printf(resultFmt, passed); @@ -24508,9 +24632,9 @@ static void test_wolfSSL_OBJ_txt2obj(void) } objs_list[] = { #if defined(WOLFSSL_APACHE_HTTPD) { "1.3.6.1.5.5.7.1.24", "tlsfeature", "TLS Feature" }, - { "1.3.6.1.5.5.7.8.7", "id-on-dnsSRV", "SRVName otherName form" }, + { "1.3.6.1.5.5.7.8.7", "id-on-dnsSRV", "SRVName" }, #endif - { "2.5.29.19", "X509 basic ca", "X509v3 Basic Constraints"}, + { "2.5.29.19", "basicConstraints", "X509v3 Basic Constraints"}, { NULL, NULL, NULL } }; @@ -28442,6 +28566,78 @@ static void test_wolfSSL_OCSP_get0_info() #endif /* OPENSSL_EXTRA & HAVE_OCSP */ } +static void test_wolfSSL_EVP_PKEY_derive(void) +{ +#ifdef OPENSSL_ALL + EVP_PKEY_CTX *ctx; + unsigned char *skey; + size_t skeylen; + EVP_PKEY *pkey, *peerkey; + const unsigned char* key; + + /* DH */ + key = dh_key_der_2048; + AssertNotNull((pkey = d2i_PrivateKey(EVP_PKEY_DH, NULL, &key, + sizeof_dh_key_der_2048))); + AssertIntEQ(DH_generate_key(EVP_PKEY_get0_DH(pkey)), 1); + key = dh_key_der_2048; + AssertNotNull((peerkey = d2i_PrivateKey(EVP_PKEY_DH, NULL, &key, + sizeof_dh_key_der_2048))); + AssertIntEQ(DH_generate_key(EVP_PKEY_get0_DH(peerkey)), 1); + AssertNotNull(ctx = EVP_PKEY_CTX_new(pkey, NULL)); + AssertIntEQ(EVP_PKEY_derive_init(ctx), 1); + AssertIntEQ(EVP_PKEY_derive_set_peer(ctx, peerkey), 1); + AssertIntEQ(EVP_PKEY_derive(ctx, NULL, &skeylen), 1); + AssertNotNull(skey = XMALLOC(skeylen, NULL, DYNAMIC_TYPE_OPENSSL)); + AssertIntEQ(EVP_PKEY_derive(ctx, skey, &skeylen), 1); + + EVP_PKEY_CTX_free(ctx); + EVP_PKEY_free(pkey); + XFREE(skey, NULL, DYNAMIC_TYPE_OPENSSL); + +#ifdef HAVE_ECC + /* ECDH */ + key = ecc_clikey_der_256; + AssertNotNull((pkey = d2i_PrivateKey(EVP_PKEY_EC, NULL, &key, + sizeof_ecc_clikey_der_256))); + key = ecc_clikeypub_der_256; + AssertNotNull((peerkey = d2i_PUBKEY(NULL, &key, + sizeof_ecc_clikeypub_der_256))); + AssertNotNull(ctx = EVP_PKEY_CTX_new(pkey, NULL)); + AssertIntEQ(EVP_PKEY_derive_init(ctx), 1); + AssertIntEQ(EVP_PKEY_derive_set_peer(ctx, peerkey), 1); + AssertIntEQ(EVP_PKEY_derive(ctx, NULL, &skeylen), 1); + AssertNotNull(skey = XMALLOC(skeylen, NULL, DYNAMIC_TYPE_OPENSSL)); + AssertIntEQ(EVP_PKEY_derive(ctx, skey, &skeylen), 1); + + EVP_PKEY_CTX_free(ctx); + EVP_PKEY_free(pkey); + XFREE(skey, NULL, DYNAMIC_TYPE_OPENSSL); +#endif +#endif +} + +static void test_wolfSSL_RSA_padding_add_PKCS1_PSS(void) +{ +#if defined(OPENSSL_ALL) && defined(WC_RSA_PSS) && !defined(WC_NO_RNG) + RSA *rsa; + const unsigned char *derBuf = client_key_der_2048; + unsigned char em[256] = {0}; /* len = 2048/8 */ + /* Random data simulating a hash */ + const unsigned char mHash[WC_SHA256_DIGEST_SIZE] = { + 0x28, 0x6e, 0xfd, 0xf8, 0x76, 0xc7, 0x00, 0x3d, 0x91, 0x4e, 0x59, 0xe4, + 0x8e, 0xb7, 0x40, 0x7b, 0xd1, 0x0c, 0x98, 0x4b, 0xe3, 0x3d, 0xb3, 0xeb, + 0x6f, 0x8a, 0x3c, 0x42, 0xab, 0x21, 0xad, 0x28 + }; + + AssertNotNull(d2i_RSAPrivateKey(&rsa, &derBuf, sizeof_client_key_der_2048)); + AssertIntEQ(RSA_padding_add_PKCS1_PSS(rsa, em, mHash, EVP_sha256(), -1), 1); + AssertIntEQ(RSA_verify_PKCS1_PSS(rsa, mHash, EVP_sha256(), em, -1), 1); + + RSA_free(rsa); +#endif +} + static void test_wolfSSL_EC_get_builtin_curves(void) { #if defined(HAVE_ECC) && (defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)) @@ -29050,26 +29246,16 @@ static void test_wolfSSL_EVP_PKEY_sign(void) AssertIntEQ(EVP_PKEY_assign_RSA(pkey, rsa), WOLFSSL_SUCCESS); AssertNotNull(ctx = EVP_PKEY_CTX_new(pkey, NULL)); AssertIntEQ(EVP_PKEY_sign_init(ctx), WOLFSSL_SUCCESS); -#ifdef WC_RSA_PSS - AssertIntEQ(EVP_PKEY_CTX_set_rsa_padding(ctx, RSA_PKCS1_PSS_PADDING), - WOLFSSL_SUCCESS); -#else AssertIntEQ(EVP_PKEY_CTX_set_rsa_padding(ctx, RSA_PKCS1_PADDING), WOLFSSL_SUCCESS); -#endif /* Sign data */ AssertIntEQ(EVP_PKEY_sign(ctx, sig, &siglen, hash, SHA256_DIGEST_LENGTH), WOLFSSL_SUCCESS); /* Verify signature. EVP_PKEY_verify() doesn't exist yet, so use RSA_public_decrypt(). */ -#ifdef WC_RSA_PSS - AssertIntEQ(RSA_public_decrypt((int)siglen, sig, sigVerify, - rsa, RSA_PKCS1_PSS_PADDING), SHA256_DIGEST_LENGTH); -#else AssertIntEQ(RSA_public_decrypt((int)siglen, sig, sigVerify, rsa, RSA_PKCS1_PADDING), SHA256_DIGEST_LENGTH); -#endif AssertIntEQ(XMEMCMP(hash, sigVerify, SHA256_DIGEST_LENGTH), 0); /* error cases */ @@ -30794,6 +30980,72 @@ static void test_wolfSSL_ASN1_INTEGER_set() #endif } +/* Testing code used in dpp.c in hostap */ +#ifdef WOLFSSL_WPAS +typedef struct { + /* AlgorithmIdentifier ecPublicKey with optional parameters present + * as an OID identifying the curve */ + X509_ALGOR *alg; + /* Compressed format public key per ANSI X9.63 */ + ASN1_BIT_STRING *pub_key; +} DPP_BOOTSTRAPPING_KEY; + +ASN1_SEQUENCE(DPP_BOOTSTRAPPING_KEY) = { + ASN1_SIMPLE(DPP_BOOTSTRAPPING_KEY, alg, X509_ALGOR), + ASN1_SIMPLE(DPP_BOOTSTRAPPING_KEY, pub_key, ASN1_BIT_STRING) +} ASN1_SEQUENCE_END(DPP_BOOTSTRAPPING_KEY); + +IMPLEMENT_ASN1_FUNCTIONS(DPP_BOOTSTRAPPING_KEY); +#endif /* WOLFSSL_WPAS */ + +static void test_wolfSSL_IMPLEMENT_ASN1_FUNCTIONS() +{ + /* Testing code used in dpp.c in hostap */ +#if defined(WOLFSSL_WPAS) && defined(HAVE_ECC) && defined(USE_CERT_BUFFERS_256) + EC_KEY *eckey; + EVP_PKEY *key; + size_t len; + unsigned char *der = NULL; + DPP_BOOTSTRAPPING_KEY *bootstrap = NULL; + const unsigned char *in = ecc_clikey_der_256; + const EC_GROUP *group; + const EC_POINT *point; + int nid; + + AssertNotNull(bootstrap = DPP_BOOTSTRAPPING_KEY_new()); + + AssertNotNull(key = d2i_PrivateKey(EVP_PKEY_EC, NULL, &in, + (long)sizeof_ecc_clikey_der_256)); + AssertNotNull(eckey = EVP_PKEY_get1_EC_KEY(key)); + AssertNotNull(group = EC_KEY_get0_group(eckey)); + AssertNotNull(point = EC_KEY_get0_public_key(eckey)); + nid = EC_GROUP_get_curve_name(group); + + AssertIntEQ(X509_ALGOR_set0(bootstrap->alg, OBJ_nid2obj(EVP_PKEY_EC), + V_ASN1_OBJECT, OBJ_nid2obj(nid)), 1); + + AssertIntGT((len = EC_POINT_point2oct(group, point, POINT_CONVERSION_COMPRESSED, + NULL, 0, NULL)), 0); + + AssertNotNull(der = XMALLOC(len, NULL, DYNAMIC_TYPE_ASN1)); + AssertIntEQ(EC_POINT_point2oct(group, point, POINT_CONVERSION_COMPRESSED, + der, len, NULL), len); + bootstrap->pub_key->data = der; + bootstrap->pub_key->length = len; + /* Not actually used */ + bootstrap->pub_key->flags &= ~(ASN1_STRING_FLAG_BITS_LEFT | 0x07); + bootstrap->pub_key->flags |= ASN1_STRING_FLAG_BITS_LEFT; + + der = NULL; + AssertIntGT(i2d_DPP_BOOTSTRAPPING_KEY(bootstrap, &der), 0); + + XFREE(der, NULL, DYNAMIC_TYPE_ASN1) + EVP_PKEY_free(key); + EC_KEY_free(eckey); + DPP_BOOTSTRAPPING_KEY_free(bootstrap); +#endif /* WOLFSSL_WPAS && HAVE_ECC && USE_CERT_BUFFERS_256 */ +} + static void test_wolfSSL_i2c_ASN1_INTEGER() { #if defined(OPENSSL_EXTRA) && !defined(NO_ASN) @@ -31772,7 +32024,7 @@ void ApiTest(void) test_wolfSSL_X509_get0_tbs_sigalg(); test_wolfSSL_X509_ALGOR_get0(); test_wolfSSL_X509_get_X509_PUBKEY(); - test_wolfSSL_X509_PUBKEY_get0_param(); + test_wolfSSL_X509_PUBKEY(); test_wolfSSL_RAND(); test_wolfSSL_BUF(); test_wolfSSL_set_tlsext_status_type(); @@ -31833,6 +32085,7 @@ void ApiTest(void) test_wolfSSL_ASN1_STRING_print_ex(); test_wolfSSL_ASN1_TIME_to_generalizedtime(); test_wolfSSL_ASN1_INTEGER_set(); + test_wolfSSL_IMPLEMENT_ASN1_FUNCTIONS(); test_wolfSSL_i2c_ASN1_INTEGER(); test_wolfSSL_X509_check_ca(); test_wolfSSL_DC_cert(); @@ -31842,6 +32095,8 @@ void ApiTest(void) test_wolfSSL_PKEY_up_ref(); test_wolfSSL_i2d_PrivateKey(); test_wolfSSL_OCSP_get0_info(); + test_wolfSSL_EVP_PKEY_derive(); + test_wolfSSL_RSA_padding_add_PKCS1_PSS(); #if defined(WOLFSSL_QT) printf("\n----------------Qt Unit Tests-------------------\n"); @@ -32120,6 +32375,7 @@ void ApiTest(void) AssertIntEQ(test_wc_ecc_make_key(), 0); AssertIntEQ(test_wc_ecc_init(), 0); AssertIntEQ(test_wc_ecc_check_key(), 0); + AssertIntEQ(test_wc_ecc_get_generator(), 0); AssertIntEQ(test_wc_ecc_size(), 0); test_wc_ecc_params(); AssertIntEQ(test_wc_ecc_signVerify_hash(), 0); diff --git a/wolfcrypt/src/ecc.c b/wolfcrypt/src/ecc.c index a3701db88..afc2a04cb 100644 --- a/wolfcrypt/src/ecc.c +++ b/wolfcrypt/src/ecc.c @@ -6336,8 +6336,8 @@ int wc_ecc_import_point_der(byte* in, word32 inLen, const int curve_idx, inLen -= 1; in += 1; - /* calculate key size based on inLen / 2 */ - keysize = inLen>>1; + /* calculate key size based on inLen / 2 if uncompressed */ + keysize = compressed ? inLen : inLen>>1; /* read data */ if (err == MP_OKAY) @@ -6444,6 +6444,20 @@ int wc_ecc_import_point_der(byte* in, word32 inLen, const int curve_idx, #ifdef HAVE_ECC_KEY_EXPORT /* export point to der */ + +int wc_ecc_export_point_der_ex(const int curve_idx, ecc_point* point, byte* out, + word32* outLen, int compressed) +{ + if (compressed == 0) + return wc_ecc_export_point_der(curve_idx, point, out, outLen); +#ifdef HAVE_COMP_KEY + else + return wc_ecc_export_point_der_compressed(curve_idx, point, out, outLen); +#else + return NOT_COMPILED_IN; +#endif +} + int wc_ecc_export_point_der(const int curve_idx, ecc_point* point, byte* out, word32* outLen) { @@ -6458,9 +6472,10 @@ int wc_ecc_export_point_der(const int curve_idx, ecc_point* point, byte* out, if ((curve_idx < 0) || (wc_ecc_is_valid_idx(curve_idx) == 0)) return ECC_BAD_ARG_E; + numlen = ecc_sets[curve_idx].size; + /* return length needed only */ if (point != NULL && out == NULL && outLen != NULL) { - numlen = ecc_sets[curve_idx].size; *outLen = 1 + 2*numlen; return LENGTH_ONLY_E; } @@ -6468,8 +6483,6 @@ int wc_ecc_export_point_der(const int curve_idx, ecc_point* point, byte* out, if (point == NULL || out == NULL || outLen == NULL) return ECC_BAD_ARG_E; - numlen = ecc_sets[curve_idx].size; - if (*outLen < (1 + 2*numlen)) { *outLen = 1 + 2*numlen; return BUFFER_E; @@ -6511,6 +6524,69 @@ done: } +/* export point to der */ +int wc_ecc_export_point_der_compressed(const int curve_idx, ecc_point* point, + byte* out, word32* outLen) +{ + int ret = MP_OKAY; + word32 numlen; + word32 output_len; +#ifdef WOLFSSL_SMALL_STACK + byte* buf; +#else + byte buf[ECC_BUFSIZE]; +#endif + + if ((curve_idx < 0) || (wc_ecc_is_valid_idx(curve_idx) == 0)) + return ECC_BAD_ARG_E; + + numlen = ecc_sets[curve_idx].size; + output_len = 1 + numlen; /* y point type + x */ + + /* return length needed only */ + if (point != NULL && out == NULL && outLen != NULL) { + *outLen = output_len; + return LENGTH_ONLY_E; + } + + if (point == NULL || out == NULL || outLen == NULL) + return ECC_BAD_ARG_E; + + + if (*outLen < output_len) { + *outLen = output_len; + return BUFFER_E; + } + + /* store byte point type */ + out[0] = mp_isodd(point->y) == MP_YES ? ECC_POINT_COMP_ODD : + ECC_POINT_COMP_EVEN; + +#ifdef WOLFSSL_SMALL_STACK + buf = (byte*)XMALLOC(ECC_BUFSIZE, NULL, DYNAMIC_TYPE_ECC_BUFFER); + if (buf == NULL) + return MEMORY_E; +#endif + + /* pad and store x */ + XMEMSET(buf, 0, ECC_BUFSIZE); + ret = mp_to_unsigned_bin(point->x, buf + + (numlen - mp_unsigned_bin_size(point->x))); + if (ret != MP_OKAY) + goto done; + XMEMCPY(out+1, buf, numlen); + + *outLen = output_len; + +done: +#ifdef WOLFSSL_SMALL_STACK + XFREE(buf, NULL, DYNAMIC_TYPE_ECC_BUFFER); +#endif + + return ret; +} + + /* export public ECC key in ANSI X9.63 format */ int wc_ecc_export_x963(ecc_key* key, byte* out, word32* outLen) { @@ -6847,6 +6923,31 @@ static int ecc_check_privkey_gen_helper(ecc_key* key) #endif /* WOLFSSL_VALIDATE_ECC_IMPORT */ +int wc_ecc_get_generator(ecc_point* ecp, int curve_idx) +{ + int err = MP_OKAY; + DECLARE_CURVE_SPECS(curve, 2); + + if (!ecp || curve_idx < 0 || curve_idx > (int)(ECC_SET_COUNT-1)) + return BAD_FUNC_ARG; + + ALLOC_CURVE_SPECS(2); + + err = wc_ecc_curve_load(&ecc_sets[curve_idx], &curve, + (ECC_CURVE_FIELD_GX | ECC_CURVE_FIELD_GY)); + if (err == MP_OKAY) + err = mp_copy(curve->Gx, ecp->x); + if (err == MP_OKAY) + err = mp_copy(curve->Gy, ecp->y); + if (err == MP_OKAY) + err = mp_set(ecp->z, 1); + + wc_ecc_curve_free(curve); + FREE_CURVE_SPECS(); + + return MP_OKAY; +} + #if defined(WOLFSSL_VALIDATE_ECC_KEYGEN) || !defined(WOLFSSL_SP_MATH) /* validate order * pubkey = point at infinity, 0 on success */ static int ecc_check_pubkey_order(ecc_key* key, ecc_point* pubkey, mp_int* a, diff --git a/wolfcrypt/src/evp.c b/wolfcrypt/src/evp.c index ef5de299e..b8bf51706 100644 --- a/wolfcrypt/src/evp.c +++ b/wolfcrypt/src/evp.c @@ -607,8 +607,8 @@ int wolfSSL_EVP_CipherFinal(WOLFSSL_EVP_CIPHER_CTX *ctx, { int fl; int ret = WOLFSSL_SUCCESS; - if (ctx == NULL || out == NULL || outl == NULL) - return BAD_FUNC_ARG; + if (!ctx || !outl) + return WOLFSSL_FAILURE; WOLFSSL_ENTER("wolfSSL_EVP_CipherFinal"); @@ -627,6 +627,9 @@ int wolfSSL_EVP_CipherFinal(WOLFSSL_EVP_CIPHER_CTX *ctx, } #endif /* !NO_AES && HAVE_AESGCM */ + if (!out) + return WOLFSSL_FAILURE; + if (ctx->flags & WOLFSSL_EVP_CIPH_NO_PADDING) { if (ctx->bufUsed != 0) return WOLFSSL_FAILURE; *outl = 0; @@ -1148,6 +1151,111 @@ int wolfSSL_EVP_PKEY_CTX_set_rsa_keygen_bits(WOLFSSL_EVP_PKEY_CTX *ctx, int bits return WOLFSSL_SUCCESS; } + +int wolfSSL_EVP_PKEY_derive_init(WOLFSSL_EVP_PKEY_CTX *ctx) +{ + WOLFSSL_ENTER("wolfSSL_EVP_PKEY_derive_init"); + + if (!ctx) { + return WOLFSSL_FAILURE; + } + wolfSSL_EVP_PKEY_free(ctx->peerKey); + ctx->op = EVP_PKEY_OP_DERIVE; + ctx->padding = 0; + ctx->nbits = 0; + return WOLFSSL_SUCCESS; +} + +int wolfSSL_EVP_PKEY_derive_set_peer(WOLFSSL_EVP_PKEY_CTX *ctx, WOLFSSL_EVP_PKEY *peer) +{ + WOLFSSL_ENTER("wolfSSL_EVP_PKEY_derive_set_peer"); + + if (!ctx || ctx->op != EVP_PKEY_OP_DERIVE) { + return WOLFSSL_FAILURE; + } + wolfSSL_EVP_PKEY_free(ctx->peerKey); + ctx->peerKey = peer; + return WOLFSSL_SUCCESS; +} + +int wolfSSL_EVP_PKEY_derive(WOLFSSL_EVP_PKEY_CTX *ctx, unsigned char *key, size_t *keylen) +{ + int len; + + WOLFSSL_ENTER("wolfSSL_EVP_PKEY_derive"); + + if (!ctx || ctx->op != EVP_PKEY_OP_DERIVE || !ctx->pkey || !ctx->peerKey || !keylen + || ctx->pkey->type != ctx->peerKey->type) { + return WOLFSSL_FAILURE; + } + switch (ctx->pkey->type) { +#ifndef NO_DH + case EVP_PKEY_DH: + /* Use DH */ + if (!ctx->pkey->dh || !ctx->peerKey->dh || !ctx->peerKey->dh->pub_key) { + return WOLFSSL_FAILURE; + } + if ((len = wolfSSL_DH_size(ctx->pkey->dh)) <= 0) { + return WOLFSSL_FAILURE; + } + if (key) { + if (*keylen < (size_t)len) { + return WOLFSSL_FAILURE; + } + if (wolfSSL_DH_compute_key(key, ctx->peerKey->dh->pub_key, + ctx->pkey->dh) != len) { + return WOLFSSL_FAILURE; + } + } + *keylen = (size_t)len; + break; +#endif +#ifdef HAVE_ECC + case EVP_PKEY_EC: + /* Use ECDH */ + if (!ctx->pkey->ecc || !ctx->peerKey->ecc) { + return WOLFSSL_FAILURE; + } + /* set internal key if not done */ + if (!ctx->pkey->ecc->inSet) { + if (SetECKeyInternal(ctx->pkey->ecc) != WOLFSSL_SUCCESS) { + WOLFSSL_MSG("SetECKeyInternal failed"); + return WOLFSSL_FAILURE; + } + } + if (!ctx->peerKey->ecc->exSet || !ctx->peerKey->ecc->pub_key->internal) { + if (SetECKeyExternal(ctx->peerKey->ecc) != WOLFSSL_SUCCESS) { + WOLFSSL_MSG("SetECKeyExternal failed"); + return WOLFSSL_FAILURE; + } + } + if (!(len = wc_ecc_size((ecc_key*)ctx->pkey->ecc->internal))) { + return WOLFSSL_FAILURE; + } + if (key) { + word32 len32 = (word32)len; + if (*keylen < len32) { + WOLFSSL_MSG("buffer too short"); + return WOLFSSL_FAILURE; + } + if (wc_ecc_shared_secret_ssh((ecc_key*)ctx->pkey->ecc->internal, + (ecc_point*)ctx->peerKey->ecc->pub_key->internal, + key, &len32) != MP_OKAY) { + WOLFSSL_MSG("wc_ecc_shared_secret failed"); + return WOLFSSL_FAILURE; + } + len = (int)len32; + } + *keylen = (size_t)len; + break; +#endif + default: + WOLFSSL_MSG("Unknown key type"); + return WOLFSSL_FAILURE; + } + return WOLFSSL_SUCCESS; +} + /* Uses the WOLFSSL_EVP_PKEY_CTX to decrypt a buffer. * * ctx structure to decrypt with diff --git a/wolfcrypt/src/rsa.c b/wolfcrypt/src/rsa.c index 78dfd3978..19c212a91 100644 --- a/wolfcrypt/src/rsa.c +++ b/wolfcrypt/src/rsa.c @@ -1284,7 +1284,7 @@ static int RsaPad(const byte* input, word32 inputLen, byte* pkcsBlock, #endif /* !WC_NO_RNG */ /* helper function to direct which padding is used */ -static int wc_RsaPad_ex(const byte* input, word32 inputLen, byte* pkcsBlock, +int wc_RsaPad_ex(const byte* input, word32 inputLen, byte* pkcsBlock, word32 pkcsBlockLen, byte padValue, WC_RNG* rng, int padType, enum wc_HashType hType, int mgf, byte* optLabel, word32 labelLen, int saltLen, int bits, void* heap) @@ -1652,10 +1652,10 @@ static int RsaUnPad(const byte *pkcsBlock, unsigned int pkcsBlockLen, * * bits is the key modulus size in bits */ -static int wc_RsaUnPad_ex(byte* pkcsBlock, word32 pkcsBlockLen, byte** out, - byte padValue, int padType, enum wc_HashType hType, - int mgf, byte* optLabel, word32 labelLen, int saltLen, - int bits, void* heap) +int wc_RsaUnPad_ex(byte* pkcsBlock, word32 pkcsBlockLen, byte** out, + byte padValue, int padType, enum wc_HashType hType, + int mgf, byte* optLabel, word32 labelLen, int saltLen, + int bits, void* heap) { int ret; @@ -3130,6 +3130,12 @@ int wc_RsaSSL_VerifyInline(byte* in, word32 inLen, byte** out, RsaKey* key) #ifndef WOLFSSL_RSA_VERIFY_ONLY int wc_RsaSSL_Verify(const byte* in, word32 inLen, byte* out, word32 outLen, RsaKey* key) +{ + return wc_RsaSSL_Verify_ex(in, inLen, out, outLen, key , WC_RSA_PKCSV15_PAD); +} + +int wc_RsaSSL_Verify_ex(const byte* in, word32 inLen, byte* out, word32 outLen, + RsaKey* key, int pad_type) { WC_RNG* rng; @@ -3144,7 +3150,7 @@ int wc_RsaSSL_Verify(const byte* in, word32 inLen, byte* out, word32 outLen, #endif return RsaPrivateDecryptEx((byte*)in, inLen, out, outLen, NULL, key, - RSA_PUBLIC_DECRYPT, RSA_BLOCK_TYPE_1, WC_RSA_PKCSV15_PAD, + RSA_PUBLIC_DECRYPT, RSA_BLOCK_TYPE_1, pad_type, WC_HASH_TYPE_NONE, WC_MGF1NONE, NULL, 0, 0, rng); } #endif diff --git a/wolfssl/internal.h b/wolfssl/internal.h index 7c2c6571f..778999c08 100644 --- a/wolfssl/internal.h +++ b/wolfssl/internal.h @@ -3690,7 +3690,7 @@ struct WOLFSSL_X509 { #endif WOLFSSL_X509_NAME issuer; WOLFSSL_X509_NAME subject; -#if defined(OPENSSL_ALL) || defined(WOLFSSL_HAPROXY) +#if defined(OPENSSL_ALL) || defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_WPAS) WOLFSSL_X509_ALGOR algor; WOLFSSL_X509_PUBKEY key; #endif @@ -4368,6 +4368,11 @@ WOLFSSL_LOCAL int VerifyClientSuite(WOLFSSL* ssl); WOLFSSL_LOCAL int SetTicket(WOLFSSL*, const byte*, word32); WOLFSSL_LOCAL int wolfSSL_GetMaxRecordSize(WOLFSSL* ssl, int maxFragment); +#if defined(OPENSSL_EXTRA) && defined(HAVE_ECC) +WOLFSSL_LOCAL int SetECKeyInternal(WOLFSSL_EC_KEY* eckey); +WOLFSSL_LOCAL int SetECKeyExternal(WOLFSSL_EC_KEY* eckey); +#endif + #ifndef NO_CERTS #ifndef NO_RSA #ifdef WC_RSA_PSS diff --git a/wolfssl/openssl/asn1.h b/wolfssl/openssl/asn1.h index 841860121..d09aa2070 100644 --- a/wolfssl/openssl/asn1.h +++ b/wolfssl/openssl/asn1.h @@ -24,6 +24,9 @@ #ifndef WOLFSSL_ASN1_H_ #define WOLFSSL_ASN1_H_ +#ifdef WOLFSSL_WPAS +#include /* for offsetof */ +#endif /* WOLFSSL_WPAS */ #include #define ASN1_STRING_new wolfSSL_ASN1_STRING_new @@ -66,6 +69,7 @@ #define ASN1_TIME_diff wolfSSL_ASN1_TIME_diff #define ASN1_TIME_set wolfSSL_ASN1_TIME_set +#define V_ASN1_OBJECT 6 #define V_ASN1_UTCTIME 23 #define V_ASN1_GENERALIZEDTIME 24 @@ -80,5 +84,66 @@ WOLFSSL_API WOLFSSL_ASN1_INTEGER *wolfSSL_BN_to_ASN1_INTEGER( const WOLFSSL_BIGNUM*, WOLFSSL_ASN1_INTEGER*); #define BN_to_ASN1_INTEGER wolfSSL_BN_to_ASN1_INTEGER +#ifdef OPENSSL_ALL +/* IMPLEMENT_ASN1_FUNCTIONS stuff */ +typedef struct { + size_t offset; /* Offset of this field in structure */ + byte type; /* The type of the member as defined in + * WOLFSSL_ASN1_TYPES */ +} WOLFSSL_ASN1_TEMPLATE; + +typedef struct { + byte type; /* One of the ASN_Tags types */ + const WOLFSSL_ASN1_TEMPLATE *members; /* If SEQUENCE or CHOICE this + * contains the contents */ + size_t mcount; /* Number of members if SEQUENCE + * or CHOICE */ + size_t size; /* Structure size */ +} WOLFSSL_ASN1_ITEM; + +typedef enum { + WOLFSSL_X509_ALGOR_ASN1 = 0, + WOLFSSL_ASN1_BIT_STRING_ASN1, +} WOLFSSL_ASN1_TYPES; + +#define ASN1_SEQUENCE(type) \ + static const WOLFSSL_ASN1_TEMPLATE type##_member_data[] + +#define ASN1_SIMPLE(type, member, member_type) \ + { offsetof(type, member), WOLFSSL_##member_type##_ASN1 } + +#define ASN1_SEQUENCE_END(type) \ + ; \ + const WOLFSSL_ASN1_ITEM type##_template_data = { \ + ASN_SEQUENCE, \ + type##_member_data, \ + sizeof(type##_member_data) / sizeof(WOLFSSL_ASN1_TEMPLATE), \ + sizeof(type) \ + }; + +WOLFSSL_API void *wolfSSL_ASN1_item_new(const WOLFSSL_ASN1_ITEM *template); +WOLFSSL_API void wolfSSL_ASN1_item_free(void *val, const WOLFSSL_ASN1_ITEM *template); +WOLFSSL_API int wolfSSL_ASN1_item_i2d(const void *src, byte **dest, + const WOLFSSL_ASN1_ITEM *template); + +/* Need function declaration otherwise compiler complains */ +#define IMPLEMENT_ASN1_FUNCTIONS(type) \ + type *type##_new(void); \ + type *type##_new(void){ \ + return (type*)wolfSSL_ASN1_item_new(&type##_template_data); \ + } \ + void type##_free(type *t); \ + void type##_free(type *t){ \ + wolfSSL_ASN1_item_free(t, &type##_template_data); \ + } \ + int i2d_##type(type *src, byte **dest); \ + int i2d_##type(type *src, byte **dest) \ + { \ + return wolfSSL_ASN1_item_i2d(src, dest, &type##_template_data);\ + } + +WOLFSSL_API void *ASN1_item_new(const WOLFSSL_ASN1_ITEM *it); + +#endif /* WOLFSSL_WPAS */ #endif /* WOLFSSL_ASN1_H_ */ diff --git a/wolfssl/openssl/asn1t.h b/wolfssl/openssl/asn1t.h new file mode 100644 index 000000000..0ee58a2d5 --- /dev/null +++ b/wolfssl/openssl/asn1t.h @@ -0,0 +1,30 @@ +/* asn1t.h + * + * Copyright (C) 2006-2020 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * wolfSSL is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +/* asn1t.h for openssl */ + +#ifndef WOLFSSL_ASN1T_H_ +#define WOLFSSL_ASN1T_H_ + +#include +#include + +#endif /* WOLFSSL_ASN1T_H_ */ diff --git a/wolfssl/openssl/bn.h b/wolfssl/openssl/bn.h index 40f2ebe8b..312954d7c 100644 --- a/wolfssl/openssl/bn.h +++ b/wolfssl/openssl/bn.h @@ -117,6 +117,9 @@ WOLFSSL_API unsigned long wolfSSL_BN_get_word(const WOLFSSL_BIGNUM*); WOLFSSL_API int wolfSSL_BN_add(WOLFSSL_BIGNUM*, WOLFSSL_BIGNUM*, WOLFSSL_BIGNUM*); +WOLFSSL_API int wolfSSL_BN_mod_add(WOLFSSL_BIGNUM *r, const WOLFSSL_BIGNUM *a, + const WOLFSSL_BIGNUM *b, const WOLFSSL_BIGNUM *m, + WOLFSSL_BN_CTX *ctx); WOLFSSL_API char *wolfSSL_BN_bn2hex(const WOLFSSL_BIGNUM*); WOLFSSL_API int wolfSSL_BN_is_prime_ex(const WOLFSSL_BIGNUM*, int, WOLFSSL_BN_CTX*, WOLFSSL_BN_GENCB*); @@ -185,6 +188,7 @@ typedef WOLFSSL_BN_GENCB BN_GENCB; #define BN_lshift wolfSSL_BN_lshift #define BN_add_word wolfSSL_BN_add_word #define BN_add wolfSSL_BN_add +#define BN_mod_add wolfSSL_BN_mod_add #define BN_set_word wolfSSL_BN_set_word #define BN_set_bit wolfSSL_BN_set_bit #define BN_clear_bit wolfSSL_BN_clear_bit diff --git a/wolfssl/openssl/dh.h b/wolfssl/openssl/dh.h index d206d6cc0..6375a758b 100644 --- a/wolfssl/openssl/dh.h +++ b/wolfssl/openssl/dh.h @@ -57,7 +57,7 @@ WOLFSSL_API WOLFSSL_DH *wolfSSL_d2i_DHparams(WOLFSSL_DH **dh, const unsigned char **pp, long length); WOLFSSL_API int wolfSSL_i2d_DHparams(const WOLFSSL_DH *dh, unsigned char **out); WOLFSSL_API WOLFSSL_DH* wolfSSL_DH_new(void); -WOLFSSL_API void wolfSSL_DH_free(WOLFSSL_DH*); +WOLFSSL_API void wolfSSL_DH_free(WOLFSSL_DH*); WOLFSSL_API int wolfSSL_DH_check(const WOLFSSL_DH *dh, int *codes); WOLFSSL_API int wolfSSL_DH_size(WOLFSSL_DH*); diff --git a/wolfssl/openssl/ec.h b/wolfssl/openssl/ec.h index 25640af2b..1f11593fe 100644 --- a/wolfssl/openssl/ec.h +++ b/wolfssl/openssl/ec.h @@ -111,6 +111,8 @@ struct WOLFSSL_EC_KEY { void* internal; /* our ECC Key */ char inSet; /* internal set from external ? */ char exSet; /* external set from internal ? */ + char form; /* Either POINT_CONVERSION_UNCOMPRESSED or + * POINT_CONVERSION_COMPRESSED */ }; struct WOLFSSL_EC_BUILTIN_CURVE { @@ -144,6 +146,10 @@ int wolfSSL_EC_POINT_oct2point(const WOLFSSL_EC_GROUP *group, WOLFSSL_EC_POINT *p, const unsigned char *buf, size_t len, WOLFSSL_BN_CTX *ctx); WOLFSSL_API +int wolfSSL_i2o_ECPublicKey(const WOLFSSL_EC_KEY *in, unsigned char **out); +WOLFSSL_API +void wolfSSL_EC_KEY_set_conv_form(WOLFSSL_EC_KEY *eckey, char form); +WOLFSSL_API WOLFSSL_BIGNUM *wolfSSL_EC_POINT_point2bn(const WOLFSSL_EC_GROUP *group, const WOLFSSL_EC_POINT *p, char form, @@ -232,6 +238,8 @@ WOLFSSL_API int wolfSSL_EC_POINT_cmp(const WOLFSSL_EC_GROUP *group, const WOLFSSL_EC_POINT *a, const WOLFSSL_EC_POINT *b, WOLFSSL_BN_CTX *ctx); +WOLFSSL_API int wolfSSL_EC_POINT_copy(WOLFSSL_EC_POINT *dest, + const WOLFSSL_EC_POINT *src); WOLFSSL_API void wolfSSL_EC_POINT_free(WOLFSSL_EC_POINT *point); WOLFSSL_API @@ -286,6 +294,7 @@ char* wolfSSL_EC_POINT_point2hex(const WOLFSSL_EC_GROUP* group, #define EC_POINT_mul wolfSSL_EC_POINT_mul #define EC_POINT_clear_free wolfSSL_EC_POINT_clear_free #define EC_POINT_cmp wolfSSL_EC_POINT_cmp +#define EC_POINT_copy wolfSSL_EC_POINT_copy #define EC_POINT_is_at_infinity wolfSSL_EC_POINT_is_at_infinity #define EC_get_builtin_curves wolfSSL_EC_get_builtin_curves @@ -295,6 +304,8 @@ char* wolfSSL_EC_POINT_point2hex(const WOLFSSL_EC_GROUP* group, #define EC_POINT_point2oct wolfSSL_EC_POINT_point2oct #define EC_POINT_oct2point wolfSSL_EC_POINT_oct2point #define EC_POINT_point2bn wolfSSL_EC_POINT_point2bn +#define i2o_ECPublicKey wolfSSL_i2o_ECPublicKey +#define EC_KEY_set_conv_form wolfSSL_EC_KEY_set_conv_form #ifndef HAVE_SELFTEST #define EC_POINT_point2hex wolfSSL_EC_POINT_point2hex diff --git a/wolfssl/openssl/evp.h b/wolfssl/openssl/evp.h index 1a3da097f..941b0639e 100644 --- a/wolfssl/openssl/evp.h +++ b/wolfssl/openssl/evp.h @@ -349,8 +349,9 @@ struct WOLFSSL_EVP_CIPHER_CTX { #endif }; -struct WOLFSSL_EVP_PKEY_CTX { +struct WOLFSSL_EVP_PKEY_CTX { WOLFSSL_EVP_PKEY *pkey; + WOLFSSL_EVP_PKEY *peerKey; int op; /* operation */ int padding; int nbits; @@ -363,6 +364,7 @@ typedef WOLFSSL_EVP_PKEY_CTX EVP_PKEY_CTX; #define EVP_PKEY_OP_SIGN (1 << 3) #define EVP_PKEY_OP_ENCRYPT (1 << 6) #define EVP_PKEY_OP_DECRYPT (1 << 7) +#define EVP_PKEY_OP_DERIVE (1 << 8) WOLFSSL_API void wolfSSL_EVP_init(void); WOLFSSL_API int wolfSSL_EVP_MD_size(const WOLFSSL_EVP_MD* md); @@ -510,6 +512,7 @@ WOLFSSL_API WOLFSSL_RSA* wolfSSL_EVP_PKEY_get1_RSA(WOLFSSL_EVP_PKEY*); WOLFSSL_API WOLFSSL_DSA* wolfSSL_EVP_PKEY_get1_DSA(WOLFSSL_EVP_PKEY*); WOLFSSL_API WOLFSSL_EC_KEY *wolfSSL_EVP_PKEY_get0_EC_KEY(WOLFSSL_EVP_PKEY *pkey); WOLFSSL_API WOLFSSL_EC_KEY *wolfSSL_EVP_PKEY_get1_EC_KEY(WOLFSSL_EVP_PKEY *key); +WOLFSSL_API WOLFSSL_DH* wolfSSL_EVP_PKEY_get0_DH(WOLFSSL_EVP_PKEY* key); WOLFSSL_API WOLFSSL_DH* wolfSSL_EVP_PKEY_get1_DH(WOLFSSL_EVP_PKEY* key); WOLFSSL_API int wolfSSL_EVP_PKEY_set1_RSA(WOLFSSL_EVP_PKEY *pkey, WOLFSSL_RSA *key); WOLFSSL_API int wolfSSL_EVP_PKEY_set1_DSA(WOLFSSL_EVP_PKEY *pkey, WOLFSSL_DSA *key); @@ -534,6 +537,10 @@ WOLFSSL_API int wolfSSL_EVP_PKEY_CTX_set_rsa_padding(WOLFSSL_EVP_PKEY_CTX *ctx, WOLFSSL_API WOLFSSL_EVP_PKEY_CTX *wolfSSL_EVP_PKEY_CTX_new_id(int id, WOLFSSL_ENGINE *e); WOLFSSL_API int wolfSSL_EVP_PKEY_CTX_set_rsa_keygen_bits(WOLFSSL_EVP_PKEY_CTX *ctx, int bits); +WOLFSSL_API int wolfSSL_EVP_PKEY_derive_init(WOLFSSL_EVP_PKEY_CTX *ctx); +WOLFSSL_API int wolfSSL_EVP_PKEY_derive_set_peer(WOLFSSL_EVP_PKEY_CTX *ctx, WOLFSSL_EVP_PKEY *peer); +WOLFSSL_API int wolfSSL_EVP_PKEY_derive(WOLFSSL_EVP_PKEY_CTX *ctx, unsigned char *key, size_t *keylen); + WOLFSSL_API int wolfSSL_EVP_PKEY_decrypt(WOLFSSL_EVP_PKEY_CTX *ctx, unsigned char *out, size_t *outlen, const unsigned char *in, size_t inlen); @@ -768,6 +775,7 @@ typedef WOLFSSL_EVP_CIPHER_CTX EVP_CIPHER_CTX; #define EVP_PKEY_set1_EC_KEY wolfSSL_EVP_PKEY_set1_EC_KEY #define EVP_PKEY_get1_EC_KEY wolfSSL_EVP_PKEY_get1_EC_KEY #define EVP_PKEY_set1_DH wolfSSL_EVP_PKEY_set1_DH +#define EVP_PKEY_get0_DH wolfSSL_EVP_PKEY_get0_DH #define EVP_PKEY_get1_DH wolfSSL_EVP_PKEY_get1_DH #define EVP_PKEY_get0_EC_KEY wolfSSL_EVP_PKEY_get0_EC_KEY #define EVP_PKEY_get0_hmac wolfSSL_EVP_PKEY_get0_hmac @@ -784,6 +792,9 @@ typedef WOLFSSL_EVP_CIPHER_CTX EVP_CIPHER_CTX; #define EVP_PKEY_CTX_set_rsa_padding wolfSSL_EVP_PKEY_CTX_set_rsa_padding #define EVP_PKEY_CTX_new_id wolfSSL_EVP_PKEY_CTX_new_id #define EVP_PKEY_CTX_set_rsa_keygen_bits wolfSSL_EVP_PKEY_CTX_set_rsa_keygen_bits +#define EVP_PKEY_derive_init wolfSSL_EVP_PKEY_derive_init +#define EVP_PKEY_derive_set_peer wolfSSL_EVP_PKEY_derive_set_peer +#define EVP_PKEY_derive wolfSSL_EVP_PKEY_derive #define EVP_PKEY_decrypt wolfSSL_EVP_PKEY_decrypt #define EVP_PKEY_decrypt_init wolfSSL_EVP_PKEY_decrypt_init #define EVP_PKEY_encrypt wolfSSL_EVP_PKEY_encrypt @@ -854,6 +865,8 @@ typedef WOLFSSL_EVP_CIPHER_CTX EVP_CIPHER_CTX; #define EVP_CTRL_GCM_SET_TAG EVP_CTRL_AEAD_SET_TAG #define EVP_CTRL_GCM_SET_IV_FIXED EVP_CTRL_AEAD_SET_IV_FIXED +#define EVP_PKEY_print_private(arg1, arg2, arg3, arg4) + #ifndef EVP_MAX_MD_SIZE #define EVP_MAX_MD_SIZE 64 /* sha512 */ #endif diff --git a/wolfssl/openssl/include.am b/wolfssl/openssl/include.am index 2444a6865..c4ab3948f 100644 --- a/wolfssl/openssl/include.am +++ b/wolfssl/openssl/include.am @@ -3,6 +3,7 @@ nobase_include_HEADERS+= \ wolfssl/openssl/asn1.h \ + wolfssl/openssl/asn1t.h \ wolfssl/openssl/aes.h\ wolfssl/openssl/bio.h \ wolfssl/openssl/bn.h \ diff --git a/wolfssl/openssl/rsa.h b/wolfssl/openssl/rsa.h index 6db3173b2..cab048879 100644 --- a/wolfssl/openssl/rsa.h +++ b/wolfssl/openssl/rsa.h @@ -49,6 +49,15 @@ #define RSA_FLAG_NO_BLINDING (1 << 7) #define RSA_FLAG_NO_CONSTTIME (1 << 8) +/* Salt length matches digest */ +#define RSA_PSS_SALTLEN_DIGEST -1 +/* Verify only: auto detect salt length */ +#define RSA_PSS_SALTLEN_AUTO -2 +/* Set salt length to maximum possible */ +#define RSA_PSS_SALTLEN_MAX -3 +/* Old compatible max salt length for sign only */ +#define RSA_PSS_SALTLEN_MAX_SIGN -2 + typedef struct WOLFSSL_RSA_METHOD { int flags; char *name; diff --git a/wolfssl/openssl/ssl.h b/wolfssl/openssl/ssl.h index 25181c6cb..e4777d151 100644 --- a/wolfssl/openssl/ssl.h +++ b/wolfssl/openssl/ssl.h @@ -564,7 +564,14 @@ wolfSSL_X509_STORE_set_verify_cb((WOLFSSL_X509_STORE *)(s), (WOLFSSL_X509_STORE_ #define X509_get0_tbs_sigalg wolfSSL_X509_get0_tbs_sigalg #define X509_PUBKEY_get0_param wolfSSL_X509_PUBKEY_get0_param #define X509_PUBKEY_get wolfSSL_X509_PUBKEY_get +#define X509_PUBKEY_set wolfSSL_X509_PUBKEY_set #define X509_ALGOR_get0 wolfSSL_X509_ALGOR_get0 +#define X509_ALGOR_set0 wolfSSL_X509_ALGOR_set0 + +#define X509_ALGOR_new wolfSSL_X509_ALGOR_new +#define X509_ALGOR_free wolfSSL_X509_ALGOR_free +#define X509_PUBKEY_new wolfSSL_X509_PUBKEY_new +#define X509_PUBKEY_free wolfSSL_X509_PUBKEY_free #define sk_X509_REVOKED_num wolfSSL_sk_X509_REVOKED_num #define sk_X509_REVOKED_value wolfSSL_sk_X509_REVOKED_value @@ -708,6 +715,8 @@ wolfSSL_X509_STORE_set_verify_cb((WOLFSSL_X509_STORE *)(s), (WOLFSSL_X509_STORE_ #define RSA_print wolfSSL_RSA_print #define RSA_bits wolfSSL_RSA_size #define RSA_up_ref wolfSSL_RSA_up_ref +#define RSA_padding_add_PKCS1_PSS wolfSSL_RSA_padding_add_PKCS1_PSS +#define RSA_verify_PKCS1_PSS wolfSSL_RSA_verify_PKCS1_PSS #define PEM_def_callback wolfSSL_PEM_def_callback diff --git a/wolfssl/openssl/x509.h b/wolfssl/openssl/x509.h index 55fe71be5..77a8bca54 100644 --- a/wolfssl/openssl/x509.h +++ b/wolfssl/openssl/x509.h @@ -1,7 +1,10 @@ /* x509.h for openssl */ #include +#include #include +#include +#include /* wolfSSL_X509_print_ex flags */ #define X509_FLAG_COMPAT (0UL) diff --git a/wolfssl/ssl.h b/wolfssl/ssl.h index bd97ac23e..54d9def31 100644 --- a/wolfssl/ssl.h +++ b/wolfssl/ssl.h @@ -917,6 +917,12 @@ WOLFSSL_API int wolfSSL_SetServerID(WOLFSSL*, const unsigned char*, int, int); WOLFSSL_API int wolfSSL_BIO_new_bio_pair(WOLFSSL_BIO**, size_t, WOLFSSL_BIO**, size_t); +WOLFSSL_API int wolfSSL_RSA_padding_add_PKCS1_PSS(WOLFSSL_RSA *rsa, unsigned char *EM, + const unsigned char *mHash, + const WOLFSSL_EVP_MD *Hash, int saltLen); +WOLFSSL_API int wolfSSL_RSA_verify_PKCS1_PSS(WOLFSSL_RSA *rsa, const unsigned char *mHash, + const WOLFSSL_EVP_MD *hashAlg, + const unsigned char *EM, int saltLen); WOLFSSL_API WOLFSSL_RSA* wolfSSL_d2i_RSAPrivateKey_bio(WOLFSSL_BIO*, WOLFSSL_RSA**); WOLFSSL_API int wolfSSL_CTX_use_certificate_ASN1(WOLFSSL_CTX*, int, const unsigned char*); @@ -1413,7 +1419,7 @@ WOLFSSL_API WOLFSSL_PKCS8_PRIV_KEY_INFO* wolfSSL_d2i_PKCS8_PKEY_bio( WOLFSSL_API WOLFSSL_EVP_PKEY* wolfSSL_d2i_PUBKEY_bio(WOLFSSL_BIO* bio, WOLFSSL_EVP_PKEY** out); WOLFSSL_API WOLFSSL_EVP_PKEY* wolfSSL_d2i_PUBKEY(WOLFSSL_EVP_PKEY** key, - unsigned char** in, long inSz); + const unsigned char** in, long inSz); WOLFSSL_API WOLFSSL_EVP_PKEY* wolfSSL_d2i_PrivateKey(int type, WOLFSSL_EVP_PKEY** out, const unsigned char **in, long inSz); WOLFSSL_API WOLFSSL_EVP_PKEY* wolfSSL_d2i_PrivateKey_EVP(WOLFSSL_EVP_PKEY** key, @@ -3240,6 +3246,7 @@ enum { /* Object functions */ WOLFSSL_API const char* wolfSSL_OBJ_nid2sn(int n); WOLFSSL_API int wolfSSL_OBJ_obj2nid(const WOLFSSL_ASN1_OBJECT *o); +WOLFSSL_API int wolfSSL_OBJ_get_type(const WOLFSSL_ASN1_OBJECT *o); WOLFSSL_API int wolfSSL_OBJ_sn2nid(const char *sn); WOLFSSL_API const char* wolfSSL_OBJ_nid2ln(int n); @@ -3384,7 +3391,7 @@ WOLFSSL_API int wolfSSL_PEM_do_header(EncryptedInfo* cipher, struct WOLFSSL_ASN1_BIT_STRING { int length; int type; - char* data; + byte* data; long flags; }; @@ -3786,11 +3793,17 @@ WOLFSSL_API size_t SSL_get_peer_finished(const WOLFSSL *s, void *buf, size_t cou WOLFSSL_API int SSL_SESSION_set1_id(WOLFSSL_SESSION *s, const unsigned char *sid, unsigned int sid_len); WOLFSSL_API int SSL_SESSION_set1_id_context(WOLFSSL_SESSION *s, const unsigned char *sid_ctx, unsigned int sid_ctx_len); +WOLFSSL_API WOLFSSL_X509_ALGOR* wolfSSL_X509_ALGOR_new(void); +WOLFSSL_API void wolfSSL_X509_ALGOR_free(WOLFSSL_X509_ALGOR *alg); WOLFSSL_API const WOLFSSL_X509_ALGOR* wolfSSL_X509_get0_tbs_sigalg(const WOLFSSL_X509 *x); WOLFSSL_API void wolfSSL_X509_ALGOR_get0(const WOLFSSL_ASN1_OBJECT **paobj, int *pptype, const void **ppval, const WOLFSSL_X509_ALGOR *algor); +WOLFSSL_API int wolfSSL_X509_ALGOR_set0(WOLFSSL_X509_ALGOR *algor, WOLFSSL_ASN1_OBJECT *aobj, int ptype, void *pval); +WOLFSSL_API WOLFSSL_X509_PUBKEY *wolfSSL_X509_PUBKEY_new(void); +WOLFSSL_API void wolfSSL_X509_PUBKEY_free(WOLFSSL_X509_PUBKEY *x); WOLFSSL_API WOLFSSL_X509_PUBKEY *wolfSSL_X509_get_X509_PUBKEY(const WOLFSSL_X509* x509); -WOLFSSL_API int wolfSSL_X509_PUBKEY_get0_param(WOLFSSL_ASN1_OBJECT **ppkalg, const unsigned char **pk, int *ppklen, void **pa, WOLFSSL_X509_PUBKEY *pub); +WOLFSSL_API int wolfSSL_X509_PUBKEY_get0_param(WOLFSSL_ASN1_OBJECT **ppkalg, const unsigned char **pk, int *ppklen, WOLFSSL_X509_ALGOR **pa, WOLFSSL_X509_PUBKEY *pub); WOLFSSL_API WOLFSSL_EVP_PKEY* wolfSSL_X509_PUBKEY_get(WOLFSSL_X509_PUBKEY* key); +WOLFSSL_API int wolfSSL_X509_PUBKEY_set(WOLFSSL_X509_PUBKEY **x, WOLFSSL_EVP_PKEY *key); WOLFSSL_API int i2t_ASN1_OBJECT(char *buf, int buf_len, WOLFSSL_ASN1_OBJECT *a); WOLFSSL_API int wolfSSL_i2a_ASN1_OBJECT(WOLFSSL_BIO *bp, WOLFSSL_ASN1_OBJECT *a); WOLFSSL_API void SSL_CTX_set_tmp_dh_callback(WOLFSSL_CTX *ctx, WOLFSSL_DH *(*dh) (WOLFSSL *ssl, int is_export, int keylength)); diff --git a/wolfssl/wolfcrypt/asn.h b/wolfssl/wolfcrypt/asn.h index 393da3cdb..d4722efbe 100644 --- a/wolfssl/wolfcrypt/asn.h +++ b/wolfssl/wolfcrypt/asn.h @@ -162,10 +162,10 @@ enum DN_Tags { #if defined(WOLFSSL_APACHE_HTTPD) /* otherName strings */ #define WOLFSSL_SN_MS_UPN "msUPN" - #define WOLFSSL_LN_MS_UPN "Microsoft Universal Principal Name" + #define WOLFSSL_LN_MS_UPN "Microsoft User Principal Name" #define WOLFSSL_MS_UPN_SUM 265 #define WOLFSSL_SN_DNS_SRV "id-on-dnsSRV" - #define WOLFSSL_LN_DNS_SRV "SRVName otherName form" + #define WOLFSSL_LN_DNS_SRV "SRVName" /* TLS features extension strings */ #define WOLFSSL_SN_TLS_FEATURE "tlsfeature" #define WOLFSSL_LN_TLS_FEATURE "TLS Feature" diff --git a/wolfssl/wolfcrypt/ecc.h b/wolfssl/wolfcrypt/ecc.h index cebba65c6..2fe32c26e 100644 --- a/wolfssl/wolfcrypt/ecc.h +++ b/wolfssl/wolfcrypt/ecc.h @@ -457,6 +457,8 @@ WOLFSSL_API int wc_ecc_check_key(ecc_key* key); WOLFSSL_API int wc_ecc_is_point(ecc_point* ecp, mp_int* a, mp_int* b, mp_int* prime); +WOLFSSL_API +int wc_ecc_get_generator(ecc_point* ecp, int curve_idx); #ifdef HAVE_ECC_DHE WOLFSSL_API @@ -632,10 +634,15 @@ int wc_ecc_export_private_raw(ecc_key* key, byte* qx, word32* qxLen, #endif /* HAVE_ECC_KEY_EXPORT */ #ifdef HAVE_ECC_KEY_EXPORT - +WOLFSSL_API +int wc_ecc_export_point_der_ex(const int curve_idx, ecc_point* point, byte* out, + word32* outLen, int compressed); WOLFSSL_API int wc_ecc_export_point_der(const int curve_idx, ecc_point* point, byte* out, word32* outLen); +WOLFSSL_API +int wc_ecc_export_point_der_compressed(const int curve_idx, ecc_point* point, + byte* out, word32* outLen); #endif /* HAVE_ECC_KEY_EXPORT */ diff --git a/wolfssl/wolfcrypt/rsa.h b/wolfssl/wolfcrypt/rsa.h index b8e41608a..3965dc450 100644 --- a/wolfssl/wolfcrypt/rsa.h +++ b/wolfssl/wolfcrypt/rsa.h @@ -238,6 +238,8 @@ WOLFSSL_API int wc_RsaSSL_VerifyInline(byte* in, word32 inLen, byte** out, RsaKey* key); WOLFSSL_API int wc_RsaSSL_Verify(const byte* in, word32 inLen, byte* out, word32 outLen, RsaKey* key); +WOLFSSL_API int wc_RsaSSL_Verify_ex(const byte* in, word32 inLen, byte* out, + word32 outLen, RsaKey* key, int pad_type); WOLFSSL_API int wc_RsaPSS_VerifyInline(byte* in, word32 inLen, byte** out, enum wc_HashType hash, int mgf, RsaKey* key); @@ -349,6 +351,15 @@ WOLFSSL_API int wc_RsaKeyToPublicDer(RsaKey*, byte* output, word32 inLen); int nlen, int* isPrime); #endif +WOLFSSL_LOCAL int wc_RsaPad_ex(const byte* input, word32 inputLen, byte* pkcsBlock, + word32 pkcsBlockLen, byte padValue, WC_RNG* rng, int padType, + enum wc_HashType hType, int mgf, byte* optLabel, word32 labelLen, + int saltLen, int bits, void* heap); +WOLFSSL_LOCAL int wc_RsaUnPad_ex(byte* pkcsBlock, word32 pkcsBlockLen, byte** out, + byte padValue, int padType, enum wc_HashType hType, + int mgf, byte* optLabel, word32 labelLen, int saltLen, + int bits, void* heap); + #endif /* HAVE_USER_RSA */ #ifdef __cplusplus From 9ced70edc1e56637bd90310b046044b7dade66e6 Mon Sep 17 00:00:00 2001 From: Juliusz Sosinowicz Date: Mon, 16 Mar 2020 19:44:31 +0100 Subject: [PATCH 002/298] Test fixes Free `x509->key.pkey` in `FreeX509 Fix type conversions Fix memory leaks and use of uninitialized memory --- src/internal.c | 10 ++++++---- src/ssl.c | 39 +++++++++++++++++++++++---------------- tests/api.c | 20 +++++++++++--------- wolfcrypt/src/ecc.c | 2 +- wolfcrypt/src/evp.c | 12 +++++++++--- wolfcrypt/test/test.c | 4 ++-- 6 files changed, 52 insertions(+), 35 deletions(-) diff --git a/src/internal.c b/src/internal.c index 4730ef042..fe37c5e72 100644 --- a/src/internal.c +++ b/src/internal.c @@ -3451,11 +3451,13 @@ void FreeX509(WOLFSSL_X509* x509) x509->algor.algorithm = NULL; } if (x509->key.algor) { - wolfSSL_ASN1_OBJECT_free(x509->key.algor->algorithm); - x509->key.algor->algorithm = NULL; + wolfSSL_X509_ALGOR_free(x509->key.algor); + x509->key.algor = NULL; + } + if (x509->key.pkey) { + wolfSSL_EVP_PKEY_free(x509->key.pkey); + x509->key.pkey = NULL; } - XFREE(x509->key.algor, NULL, DYNAMIC_TYPE_OPENSSL); - x509->key.algor = NULL; #endif /* OPENSSL_ALL */ if (x509->altNames) { FreeAltNames(x509->altNames, x509->heap); diff --git a/src/ssl.c b/src/ssl.c index 8d6973fde..21099e7a5 100755 --- a/src/ssl.c +++ b/src/ssl.c @@ -28231,6 +28231,7 @@ void wolfSSL_X509_ALGOR_free(WOLFSSL_X509_ALGOR *alg) if (alg->algorithm) { wolfSSL_ASN1_OBJECT_free(alg->algorithm); } + XFREE(alg, NULL, DYNAMIC_TYPE_OPENSSL); } } @@ -31108,12 +31109,12 @@ void *wolfSSL_ASN1_item_new(const WOLFSSL_ASN1_ITEM *template) size_t i; WOLFSSL_ENTER("wolfSSL_ASN1_item_new"); if (!template) { - WOLFSSL_LEAVE("wolfSSL_ASN1_item_new", NULL); return NULL; } - if ((ret = XMALLOC(template->size, NULL, DYNAMIC_TYPE_OPENSSL))) { - XMEMSET(ret, 0, template->size); + if (!(ret = XMALLOC(template->size, NULL, DYNAMIC_TYPE_OPENSSL))) { + return NULL; } + XMEMSET(ret, 0, template->size); for (member = template->members, i = 0; i < template->mcount; member++, i++) { switch(member->type) { @@ -31140,11 +31141,9 @@ void *wolfSSL_ASN1_item_new(const WOLFSSL_ASN1_ITEM *template) goto error; } } - WOLFSSL_LEAVE("wolfSSL_ASN1_item_new", ret); return ret; error: wolfSSL_ASN1_item_free(ret, template); - WOLFSSL_LEAVE("wolfSSL_ASN1_item_new", NULL); return NULL; } @@ -31292,7 +31291,7 @@ int wolfSSL_ASN1_item_i2d(const void *src, byte **dest, if (dest && !*dest) { *dest = buf; } - else if (dest && *dest) { + else if (dest && *dest && buf) { XMEMCPY(*dest, buf, len); } @@ -36325,7 +36324,7 @@ size_t wolfSSL_EC_POINT_point2oct(const WOLFSSL_EC_GROUP *group, char form, byte *buf, size_t len, WOLFSSL_BN_CTX *ctx) { - word32 min_len = len; + word32 min_len = (word32)len; int compressed = form == POINT_CONVERSION_COMPRESSED ? 1 : 0; WOLFSSL_ENTER("EC_POINT_point2oct"); @@ -36362,7 +36361,7 @@ size_t wolfSSL_EC_POINT_point2oct(const WOLFSSL_EC_GROUP *group, (void)ctx; - return min_len; + return (size_t)min_len; } int wolfSSL_EC_POINT_oct2point(const WOLFSSL_EC_GROUP *group, @@ -36425,7 +36424,7 @@ int wolfSSL_i2o_ECPublicKey(const WOLFSSL_EC_KEY *in, unsigned char **out) } } - return len; + return (int)len; } void wolfSSL_EC_KEY_set_conv_form(WOLFSSL_EC_KEY *eckey, char form) @@ -36603,7 +36602,7 @@ int wolfSSL_EC_POINT_set_affine_coordinates_GFp(const WOLFSSL_EC_GROUP *group, return WOLFSSL_SUCCESS; } -#ifndef WOLFSSL_ATECC508A +#if !defined(WOLFSSL_ATECC508A) && defined(ECC_SHAMIR) /* Calculate the value: generator * n + q * m * return code compliant with OpenSSL : * 1 if success, 0 if error @@ -36612,7 +36611,7 @@ int wolfSSL_EC_POINT_mul(const WOLFSSL_EC_GROUP *group, WOLFSSL_EC_POINT *r, const WOLFSSL_BIGNUM *n, const WOLFSSL_EC_POINT *q, const WOLFSSL_BIGNUM *m, WOLFSSL_BN_CTX *ctx) { - mp_int a, prime, Gx, Gy; + mp_int a, prime; int ret = WOLFSSL_FAILURE; ecc_point* result = NULL; @@ -36702,8 +36701,6 @@ int wolfSSL_EC_POINT_mul(const WOLFSSL_EC_GROUP *group, WOLFSSL_EC_POINT *r, ret = WOLFSSL_SUCCESS; cleanup: - mp_clear(&Gx); - mp_clear(&Gy); mp_clear(&a); mp_clear(&prime); wc_ecc_del_point(result); @@ -38226,6 +38223,8 @@ int wolfSSL_EVP_PKEY_type(int type) return EVP_PKEY_DSA; case EVP_PKEY_EC: return EVP_PKEY_EC; + case EVP_PKEY_DH: + return EVP_PKEY_DH; #endif default: return NID_undef; @@ -38645,9 +38644,13 @@ int wolfSSL_RSA_LoadDer_ex(WOLFSSL_RSA* rsa, const unsigned char* derBuf, return WOLFSSL_SUCCESS; } + +#if ( defined(OPENSSL_ALL) || defined(WOLFSSL_ASIO) || \ + defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_NGINX) ) || \ + ( !defined(NO_RSA) && !defined(HAVE_USER_RSA) && !defined(HAVE_FAST_RSA) ) static WC_RNG* WOLFSSL_RSA_GetRNG(WOLFSSL_RSA *rsa, WC_RNG **tmpRNG, int *initTmpRng) { - WC_RNG* rng; + WC_RNG* rng = NULL; if (!rsa || !initTmpRng) { return NULL; @@ -38659,13 +38662,16 @@ static WC_RNG* WOLFSSL_RSA_GetRNG(WOLFSSL_RSA *rsa, WC_RNG **tmpRNG, int *initTm rng = ((RsaKey*)rsa->internal)->rng; #endif if (rng == NULL && tmpRNG) { -#ifdef WOLFSSL_SMALL_STACK if (!*tmpRNG) { +#ifdef WOLFSSL_SMALL_STACK *tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_TMP_BUFFER); if (*tmpRNG == NULL) return NULL; - } +#else + WOLFSSL_MSG("*tmpRNG is null"); + return NULL; #endif + } if (wc_InitRng(*tmpRNG) == 0) { rng = *tmpRNG; @@ -38686,6 +38692,7 @@ static WC_RNG* WOLFSSL_RSA_GetRNG(WOLFSSL_RSA *rsa, WC_RNG **tmpRNG, int *initTm } return rng; } +#endif #if defined(OPENSSL_ALL) || defined(WOLFSSL_ASIO) || defined(WOLFSSL_HAPROXY) \ || defined(WOLFSSL_NGINX) diff --git a/tests/api.c b/tests/api.c index 909624a7a..760bb12fc 100644 --- a/tests/api.c +++ b/tests/api.c @@ -1789,7 +1789,7 @@ static int test_wolfSSL_SetMinVersion(void) # if defined(OPENSSL_EXTRA) static void test_wolfSSL_EC(void) { -#ifdef HAVE_ECC +#if defined(HAVE_ECC) && defined(ECC_SHAMIR) BN_CTX *ctx; EC_GROUP *group; EC_POINT *Gxy, *new_point, *set_point; @@ -1798,7 +1798,7 @@ static void test_wolfSSL_EC(void) BIGNUM *set_point_bn; char* hexStr; int group_bits; - int bin_len; + size_t bin_len; unsigned char* buf = NULL; const char* kTest = "F4F8338AFCC562C5C3F3E1E46A7EFECD17AF381913FF7A96314EA47055EA0FD0"; @@ -28592,6 +28592,7 @@ static void test_wolfSSL_EVP_PKEY_derive(void) AssertIntEQ(EVP_PKEY_derive(ctx, skey, &skeylen), 1); EVP_PKEY_CTX_free(ctx); + EVP_PKEY_free(peerkey); EVP_PKEY_free(pkey); XFREE(skey, NULL, DYNAMIC_TYPE_OPENSSL); @@ -28611,6 +28612,7 @@ static void test_wolfSSL_EVP_PKEY_derive(void) AssertIntEQ(EVP_PKEY_derive(ctx, skey, &skeylen), 1); EVP_PKEY_CTX_free(ctx); + EVP_PKEY_free(peerkey); EVP_PKEY_free(pkey); XFREE(skey, NULL, DYNAMIC_TYPE_OPENSSL); #endif @@ -29455,15 +29457,15 @@ static void test_X509_REQ(void) #ifndef NO_RSA #ifdef USE_CERT_BUFFERS_1024 const unsigned char* rsaPriv = (const unsigned char*)client_key_der_1024; - unsigned char* rsaPub = (unsigned char*)client_keypub_der_1024; + const unsigned char* rsaPub = (unsigned char*)client_keypub_der_1024; #elif defined(USE_CERT_BUFFERS_2048) const unsigned char* rsaPriv = (const unsigned char*)client_key_der_2048; - unsigned char* rsaPub = (unsigned char*)client_keypub_der_2048; + const unsigned char* rsaPub = (unsigned char*)client_keypub_der_2048; #endif #endif #ifdef HAVE_ECC const unsigned char* ecPriv = (const unsigned char*)ecc_clikey_der_256; - unsigned char* ecPub = (unsigned char*)ecc_clikeypub_der_256; + const unsigned char* ecPub = (unsigned char*)ecc_clikeypub_der_256; int len; #endif @@ -29476,10 +29478,10 @@ static void test_X509_REQ(void) 1), WOLFSSL_SUCCESS); #ifndef NO_RSA - AssertNotNull(priv = wolfSSL_d2i_PrivateKey(EVP_PKEY_RSA, NULL, &rsaPriv, - (long)sizeof_client_key_der_2048)); - AssertNotNull(pub = wolfSSL_d2i_PUBKEY(NULL, &rsaPub, - (long)sizeof_client_keypub_der_2048)); + AssertNotNull(priv = d2i_PrivateKey(EVP_PKEY_RSA, NULL, &rsaPriv, + (long)sizeof_client_key_der_2048)); + AssertNotNull(pub = d2i_PUBKEY(NULL, &rsaPub, + (long)sizeof_client_keypub_der_2048)); AssertNotNull(req = X509_REQ_new()); AssertIntEQ(X509_REQ_set_subject_name(NULL, name), WOLFSSL_FAILURE); AssertIntEQ(X509_REQ_set_subject_name(req, NULL), WOLFSSL_FAILURE); diff --git a/wolfcrypt/src/ecc.c b/wolfcrypt/src/ecc.c index afc2a04cb..2cf70f00f 100644 --- a/wolfcrypt/src/ecc.c +++ b/wolfcrypt/src/ecc.c @@ -6945,7 +6945,7 @@ int wc_ecc_get_generator(ecc_point* ecp, int curve_idx) wc_ecc_curve_free(curve); FREE_CURVE_SPECS(); - return MP_OKAY; + return err; } #if defined(WOLFSSL_VALIDATE_ECC_KEYGEN) || !defined(WOLFSSL_SP_MATH) diff --git a/wolfcrypt/src/evp.c b/wolfcrypt/src/evp.c index b8bf51706..14cec09f9 100644 --- a/wolfcrypt/src/evp.c +++ b/wolfcrypt/src/evp.c @@ -1063,6 +1063,8 @@ int wolfSSL_EVP_PKEY_CTX_free(WOLFSSL_EVP_PKEY_CTX *ctx) WOLFSSL_ENTER("EVP_PKEY_CTX_free"); if (ctx->pkey != NULL) wolfSSL_EVP_PKEY_free(ctx->pkey); + if (ctx->peerKey != NULL) + wolfSSL_EVP_PKEY_free(ctx->peerKey); XFREE(ctx, NULL, DYNAMIC_TYPE_PUBLIC_KEY); return WOLFSSL_SUCCESS; } @@ -1094,9 +1096,7 @@ WOLFSSL_EVP_PKEY_CTX *wolfSSL_EVP_PKEY_CTX_new(WOLFSSL_EVP_PKEY *pkey, WOLFSSL_E #endif type = wolfSSL_EVP_PKEY_type(pkey->type); - if ((type == EVP_PKEY_RSA) || - (type == EVP_PKEY_DSA) || - (type == EVP_PKEY_EC)) { + if (type != NID_undef) { if (wc_LockMutex(&pkey->refMutex) != 0) { WOLFSSL_MSG("Couldn't lock pkey mutex"); } @@ -1175,9 +1175,14 @@ int wolfSSL_EVP_PKEY_derive_set_peer(WOLFSSL_EVP_PKEY_CTX *ctx, WOLFSSL_EVP_PKEY } wolfSSL_EVP_PKEY_free(ctx->peerKey); ctx->peerKey = peer; + if (!wolfSSL_EVP_PKEY_up_ref(peer)) { + ctx->peerKey = NULL; + return WOLFSSL_FAILURE; + } return WOLFSSL_SUCCESS; } +#if !defined(NO_DH) && defined(HAVE_ECC) int wolfSSL_EVP_PKEY_derive(WOLFSSL_EVP_PKEY_CTX *ctx, unsigned char *key, size_t *keylen) { int len; @@ -1255,6 +1260,7 @@ int wolfSSL_EVP_PKEY_derive(WOLFSSL_EVP_PKEY_CTX *ctx, unsigned char *key, size_ } return WOLFSSL_SUCCESS; } +#endif /* Uses the WOLFSSL_EVP_PKEY_CTX to decrypt a buffer. * diff --git a/wolfcrypt/test/test.c b/wolfcrypt/test/test.c index fa80b1bff..a09206356 100644 --- a/wolfcrypt/test/test.c +++ b/wolfcrypt/test/test.c @@ -19106,13 +19106,13 @@ static int ecc_point_test(void) } #ifdef HAVE_COMP_KEY - ret = wc_ecc_import_point_der(derComp0, sizeof(der), curve_idx, point3); + ret = wc_ecc_import_point_der(derComp0, sizeof(derComp0), curve_idx, point3); if (ret != 0) { ret = -9726; goto done; } - ret = wc_ecc_import_point_der(derComp1, sizeof(der), curve_idx, point4); + ret = wc_ecc_import_point_der(derComp1, sizeof(derComp1), curve_idx, point4); if (ret != 0) { ret = -9727; goto done; From 680a481e615ae09e32faa2209c00b39645195d45 Mon Sep 17 00:00:00 2001 From: Juliusz Sosinowicz Date: Tue, 17 Mar 2020 13:21:27 +0100 Subject: [PATCH 003/298] Test fixes Remove redundant macros --- src/ssl.c | 122 +++++++++++++++++++------------------------- wolfcrypt/src/ecc.c | 50 +++++++++--------- wolfssl/internal.h | 3 ++ 3 files changed, 80 insertions(+), 95 deletions(-) diff --git a/src/ssl.c b/src/ssl.c index 21099e7a5..d1dffac99 100755 --- a/src/ssl.c +++ b/src/ssl.c @@ -22939,7 +22939,7 @@ WOLFSSL_EVP_PKEY* wolfSSL_X509_get_pubkey(WOLFSSL_X509* x509) #endif /* NO_RSA */ /* decode ECC key */ - #ifdef HAVE_ECC + #if defined(HAVE_ECC) && defined(OPENSSL_EXTRA) if (key->type == EVP_PKEY_EC) { word32 idx = 0; @@ -26334,7 +26334,7 @@ void wolfSSL_EVP_PKEY_free(WOLFSSL_EVP_PKEY* key) break; #endif /* NO_RSA */ - #ifdef HAVE_ECC + #if defined(HAVE_ECC) && defined(OPENSSL_EXTRA) case EVP_PKEY_EC: if (key->ecc != NULL && key->ownEcc == 1) { wolfSSL_EC_KEY_free(key->ecc); @@ -30627,6 +30627,53 @@ int wolfSSL_cmp_peer_cert_to_file(WOLFSSL* ssl, const char *fname) static WC_RNG globalRNG; static int initGlobalRNG = 0; #endif +#if defined(OPENSSL_EXTRA) && \ + !defined(NO_RSA) && !defined(HAVE_USER_RSA) && !defined(HAVE_FAST_RSA) +WC_RNG* WOLFSSL_RSA_GetRNG(WOLFSSL_RSA *rsa, WC_RNG **tmpRNG, int *initTmpRng) +{ + WC_RNG* rng = NULL; + + if (!rsa || !initTmpRng) { + return NULL; + } + *initTmpRng = 0; + +#if !defined(HAVE_FIPS) && !defined(HAVE_USER_RSA) && \ + !defined(HAVE_FAST_RSA) && defined(WC_RSA_BLINDING) + rng = ((RsaKey*)rsa->internal)->rng; +#endif + if (rng == NULL && tmpRNG) { + if (!*tmpRNG) { +#ifdef WOLFSSL_SMALL_STACK + *tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_TMP_BUFFER); + if (*tmpRNG == NULL) + return NULL; +#else + WOLFSSL_MSG("*tmpRNG is null"); + return NULL; +#endif + } + + if (wc_InitRng(*tmpRNG) == 0) { + rng = *tmpRNG; + *initTmpRng = 1; + } + else { + WOLFSSL_MSG("Bad RNG Init, trying global"); + if (initGlobalRNG == 0) + WOLFSSL_MSG("Global RNG no Init"); + else + rng = &globalRNG; +#ifdef WOLFSSL_SMALL_STACK + if (*tmpRNG) + XFREE(*tmpRNG, NULL, DYNAMIC_TYPE_TMP_BUFFER); + *tmpRNG = NULL; +#endif + } + } + return rng; +} +#endif #ifndef WOLFCRYPT_ONLY #ifdef OPENSSL_EXTRA @@ -35163,10 +35210,6 @@ static int SetECPointInternal(WOLFSSL_EC_POINT *p) return WOLFSSL_SUCCESS; } -#endif /* HAVE_ECC */ -#endif /* OPENSSL_EXTRA */ - -#if defined(HAVE_ECC) && defined(OPENSSL_EXTRA_X509_SMALL) /* EC_POINT WolfSSL -> OpenSSL */ static int SetECPointExternal(WOLFSSL_EC_POINT *p) @@ -35249,10 +35292,7 @@ int SetECKeyExternal(WOLFSSL_EC_KEY* eckey) return WOLFSSL_SUCCESS; } -#endif /* HAVE_ECC && OPENSSL_EXTRA_X509_SMALL */ -#ifdef OPENSSL_EXTRA -#ifdef HAVE_ECC /* EC_KEY Openssl -> WolfSSL */ int SetECKeyInternal(WOLFSSL_EC_KEY* eckey) { @@ -35509,10 +35549,6 @@ int wolfSSL_set1_groups_list(WOLFSSL *ssl, char *list) } #endif /* WOLFSSL_TLS13 */ -#endif /* HAVE_ECC */ -#endif /* OPENSSL_EXTRA */ - -#if defined(HAVE_ECC) && (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) static void InitwolfSSL_ECKey(WOLFSSL_EC_KEY* key) { if (key) { @@ -35598,10 +35634,6 @@ void wolfSSL_EC_KEY_free(WOLFSSL_EC_KEY *key) /* key = NULL, don't try to access or double free it */ } } -#endif /* HAVE_ECC && (OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL) */ - -#ifdef OPENSSL_EXTRA -#ifdef HAVE_ECC #ifndef NO_WOLFSSL_STUB int wolfSSL_EC_KEY_set_group(WOLFSSL_EC_KEY *key, WOLFSSL_EC_GROUP *group) @@ -38644,56 +38676,6 @@ int wolfSSL_RSA_LoadDer_ex(WOLFSSL_RSA* rsa, const unsigned char* derBuf, return WOLFSSL_SUCCESS; } - -#if ( defined(OPENSSL_ALL) || defined(WOLFSSL_ASIO) || \ - defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_NGINX) ) || \ - ( !defined(NO_RSA) && !defined(HAVE_USER_RSA) && !defined(HAVE_FAST_RSA) ) -static WC_RNG* WOLFSSL_RSA_GetRNG(WOLFSSL_RSA *rsa, WC_RNG **tmpRNG, int *initTmpRng) -{ - WC_RNG* rng = NULL; - - if (!rsa || !initTmpRng) { - return NULL; - } - *initTmpRng = 0; - -#if !defined(HAVE_FIPS) && !defined(HAVE_USER_RSA) && \ - !defined(HAVE_FAST_RSA) && defined(WC_RSA_BLINDING) - rng = ((RsaKey*)rsa->internal)->rng; -#endif - if (rng == NULL && tmpRNG) { - if (!*tmpRNG) { -#ifdef WOLFSSL_SMALL_STACK - *tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_TMP_BUFFER); - if (*tmpRNG == NULL) - return NULL; -#else - WOLFSSL_MSG("*tmpRNG is null"); - return NULL; -#endif - } - - if (wc_InitRng(*tmpRNG) == 0) { - rng = *tmpRNG; - *initTmpRng = 1; - } - else { - WOLFSSL_MSG("Bad RNG Init, trying global"); - if (initGlobalRNG == 0) - WOLFSSL_MSG("Global RNG no Init"); - else - rng = &globalRNG; -#ifdef WOLFSSL_SMALL_STACK - if (*tmpRNG) - XFREE(*tmpRNG, NULL, DYNAMIC_TYPE_TMP_BUFFER); - *tmpRNG = NULL; -#endif - } - } - return rng; -} -#endif - #if defined(OPENSSL_ALL) || defined(WOLFSSL_ASIO) || defined(WOLFSSL_HAPROXY) \ || defined(WOLFSSL_NGINX) static int hash2mgf(enum wc_HashType hType) @@ -38774,7 +38756,8 @@ int wolfSSL_RSA_padding_add_PKCS1_PSS(WOLFSSL_RSA *rsa, unsigned char *EM, #ifdef WOLFSSL_SMALL_STACK WC_RNG* tmpRNG = NULL; #else - WC_RNG tmpRNG[1]; + WC_RNG _tmpRNG[1]; + WC_RNG* tmpRNG = _tmpRNG; #endif enum wc_HashType hType; @@ -48719,7 +48702,8 @@ int wolfSSL_RSA_public_encrypt(int len, const unsigned char* fr, #ifdef WOLFSSL_SMALL_STACK WC_RNG* tmpRNG = NULL; #else - WC_RNG tmpRNG[1]; + WC_RNG _tmpRNG[1]; + WC_RNG* tmpRNG = _tmpRNG; #endif #if !defined(HAVE_FIPS) && !defined(HAVE_USER_RSA) && !defined(HAVE_FAST_RSA) int mgf = WC_MGF1NONE; diff --git a/wolfcrypt/src/ecc.c b/wolfcrypt/src/ecc.c index 2cf70f00f..95d5953b1 100644 --- a/wolfcrypt/src/ecc.c +++ b/wolfcrypt/src/ecc.c @@ -6922,32 +6922,6 @@ static int ecc_check_privkey_gen_helper(ecc_key* key) #endif /* WOLFSSL_VALIDATE_ECC_IMPORT */ - -int wc_ecc_get_generator(ecc_point* ecp, int curve_idx) -{ - int err = MP_OKAY; - DECLARE_CURVE_SPECS(curve, 2); - - if (!ecp || curve_idx < 0 || curve_idx > (int)(ECC_SET_COUNT-1)) - return BAD_FUNC_ARG; - - ALLOC_CURVE_SPECS(2); - - err = wc_ecc_curve_load(&ecc_sets[curve_idx], &curve, - (ECC_CURVE_FIELD_GX | ECC_CURVE_FIELD_GY)); - if (err == MP_OKAY) - err = mp_copy(curve->Gx, ecp->x); - if (err == MP_OKAY) - err = mp_copy(curve->Gy, ecp->y); - if (err == MP_OKAY) - err = mp_set(ecp->z, 1); - - wc_ecc_curve_free(curve); - FREE_CURVE_SPECS(); - - return err; -} - #if defined(WOLFSSL_VALIDATE_ECC_KEYGEN) || !defined(WOLFSSL_SP_MATH) /* validate order * pubkey = point at infinity, 0 on success */ static int ecc_check_pubkey_order(ecc_key* key, ecc_point* pubkey, mp_int* a, @@ -6998,6 +6972,30 @@ static int ecc_check_pubkey_order(ecc_key* key, ecc_point* pubkey, mp_int* a, #endif #endif /* !WOLFSSL_ATECC508A && !WOLFSSL_CRYPTOCELL*/ +int wc_ecc_get_generator(ecc_point* ecp, int curve_idx) +{ + int err = MP_OKAY; + DECLARE_CURVE_SPECS(curve, 2); + + if (!ecp || curve_idx < 0 || curve_idx > (int)(ECC_SET_COUNT-1)) + return BAD_FUNC_ARG; + + ALLOC_CURVE_SPECS(2); + + err = wc_ecc_curve_load(&ecc_sets[curve_idx], &curve, + (ECC_CURVE_FIELD_GX | ECC_CURVE_FIELD_GY)); + if (err == MP_OKAY) + err = mp_copy(curve->Gx, ecp->x); + if (err == MP_OKAY) + err = mp_copy(curve->Gy, ecp->y); + if (err == MP_OKAY) + err = mp_set(ecp->z, 1); + + wc_ecc_curve_free(curve); + FREE_CURVE_SPECS(); + + return err; +} /* perform sanity checks on ecc key validity, 0 on success */ int wc_ecc_check_key(ecc_key* key) diff --git a/wolfssl/internal.h b/wolfssl/internal.h index 778999c08..36021eaab 100644 --- a/wolfssl/internal.h +++ b/wolfssl/internal.h @@ -4373,6 +4373,9 @@ WOLFSSL_LOCAL int SetECKeyInternal(WOLFSSL_EC_KEY* eckey); WOLFSSL_LOCAL int SetECKeyExternal(WOLFSSL_EC_KEY* eckey); #endif +WOLFSSL_LOCAL WC_RNG* WOLFSSL_RSA_GetRNG(WOLFSSL_RSA *rsa, WC_RNG **tmpRNG, + int *initTmpRng); + #ifndef NO_CERTS #ifndef NO_RSA #ifdef WC_RSA_PSS From b4d9007a487ef7a3b4b4a7c41837a95fe122cea1 Mon Sep 17 00:00:00 2001 From: Juliusz Sosinowicz Date: Tue, 17 Mar 2020 17:46:10 +0100 Subject: [PATCH 004/298] Test fixes Config fixes Fix windows FIPS --- src/ssl.c | 12 ++++++------ tests/api.c | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/ssl.c b/src/ssl.c index d1dffac99..e305cbbdd 100755 --- a/src/ssl.c +++ b/src/ssl.c @@ -17762,6 +17762,7 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) } #endif /* WOLFSSL_AES_256 */ #endif /* HAVE_AES_CBC */ +#if !defined(_WIN32) && !defined(HAVE_FIPS) #ifdef HAVE_AESGCM #ifdef WOLFSSL_AES_128 if (ctx->cipherType == AES_128_GCM_TYPE || @@ -17839,6 +17840,7 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) } #endif /* WOLFSSL_AES_256 */ #endif /* HAVE_AESGCM */ +#endif /* !defined(_WIN32) && !defined(HAVE_FIPS) */ #ifdef WOLFSSL_AES_COUNTER #ifdef WOLFSSL_AES_128 if (ctx->cipherType == AES_128_CTR_TYPE || @@ -38676,8 +38678,8 @@ int wolfSSL_RSA_LoadDer_ex(WOLFSSL_RSA* rsa, const unsigned char* derBuf, return WOLFSSL_SUCCESS; } -#if defined(OPENSSL_ALL) || defined(WOLFSSL_ASIO) || defined(WOLFSSL_HAPROXY) \ - || defined(WOLFSSL_NGINX) +#if defined(WC_RSA_PSS) && (defined(OPENSSL_ALL) || defined(WOLFSSL_ASIO) || \ + defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_NGINX)) static int hash2mgf(enum wc_HashType hType) { switch (hType) { @@ -48866,8 +48868,7 @@ int wolfSSL_RSA_private_decrypt(int len, const unsigned char* fr, return ret; } - - +#if !defined(_WIN32) && !defined(HAVE_FIPS) int wolfSSL_RSA_public_decrypt(int flen, const unsigned char* from, unsigned char* to, WOLFSSL_RSA* rsa, int padding) { @@ -48919,8 +48920,7 @@ int wolfSSL_RSA_public_decrypt(int flen, const unsigned char* from, } return tlen; } - - +#endif /* !defined(_WIN32) && !defined(HAVE_FIPS) */ /* RSA private encrypt calls wc_RsaSSL_Sign. Similar function set up as RSA * public decrypt. diff --git a/tests/api.c b/tests/api.c index 760bb12fc..29909afa7 100644 --- a/tests/api.c +++ b/tests/api.c @@ -16051,10 +16051,10 @@ static int test_wc_ecc_check_key (void) static int test_wc_ecc_get_generator(void) { int ret = 0; -#if defined(HAVE_ECC) && !defined(WC_NO_RNG) +#if defined(HAVE_ECC) && !defined(WC_NO_RNG) && !defined(HAVE_SELFTEST) && \ + !defined(HAVE_FIPS) ecc_point* pt; - printf(testingFmt, "wc_ecc_new_point()"); pt = wc_ecc_new_point(); From ef5eefac91b867c20d577d6a9f0fd366fb1d13d8 Mon Sep 17 00:00:00 2001 From: Juliusz Sosinowicz Date: Wed, 18 Mar 2020 10:01:42 +0100 Subject: [PATCH 005/298] Test fixes --- src/ssl.c | 4 ++-- tests/api.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/ssl.c b/src/ssl.c index e305cbbdd..f228fa917 100755 --- a/src/ssl.c +++ b/src/ssl.c @@ -17762,7 +17762,7 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) } #endif /* WOLFSSL_AES_256 */ #endif /* HAVE_AES_CBC */ -#if !defined(_WIN32) && !defined(HAVE_FIPS) +#if !defined(_WIN32) && !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) #ifdef HAVE_AESGCM #ifdef WOLFSSL_AES_128 if (ctx->cipherType == AES_128_GCM_TYPE || @@ -17840,7 +17840,7 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) } #endif /* WOLFSSL_AES_256 */ #endif /* HAVE_AESGCM */ -#endif /* !defined(_WIN32) && !defined(HAVE_FIPS) */ +#endif /* !defined(_WIN32) && !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) */ #ifdef WOLFSSL_AES_COUNTER #ifdef WOLFSSL_AES_128 if (ctx->cipherType == AES_128_CTR_TYPE || diff --git a/tests/api.c b/tests/api.c index 29909afa7..7c7b9bbb0 100644 --- a/tests/api.c +++ b/tests/api.c @@ -24594,9 +24594,9 @@ static void test_wolfSSL_OBJ_txt2nid(void) int nid; } testVals[] = { { "tlsfeature", "TLS Feature", "1.3.6.1.5.5.7.1.24", NID_tlsfeature }, - { "id-on-dnsSRV", "SRVName otherName form", "1.3.6.1.5.5.7.8.7", + { "id-on-dnsSRV", "SRVName", "1.3.6.1.5.5.7.8.7", NID_id_on_dnsSRV }, - { "msUPN", "Microsoft Universal Principal Name", + { "msUPN", "Microsoft User Principal Name", "1.3.6.1.4.1.311.20.2.3", NID_ms_upn }, { NULL, NULL, NULL, NID_undef } }; From eb549f709568e66156c10f8d8b5defc14b5ddf19 Mon Sep 17 00:00:00 2001 From: Juliusz Sosinowicz Date: Wed, 18 Mar 2020 10:42:14 +0100 Subject: [PATCH 006/298] Test fixes --- src/ssl.c | 26 ++++++++++++++++++++------ tests/api.c | 12 ++++++++---- 2 files changed, 28 insertions(+), 10 deletions(-) diff --git a/src/ssl.c b/src/ssl.c index f228fa917..a2cac292c 100755 --- a/src/ssl.c +++ b/src/ssl.c @@ -36359,7 +36359,9 @@ size_t wolfSSL_EC_POINT_point2oct(const WOLFSSL_EC_GROUP *group, byte *buf, size_t len, WOLFSSL_BN_CTX *ctx) { word32 min_len = (word32)len; +#ifndef HAVE_SELFTEST int compressed = form == POINT_CONVERSION_COMPRESSED ? 1 : 0; +#endif /* !HAVE_SELFTEST */ WOLFSSL_ENTER("EC_POINT_point2oct"); @@ -36383,15 +36385,26 @@ size_t wolfSSL_EC_POINT_point2oct(const WOLFSSL_EC_GROUP *group, return 1; } - if (form != POINT_CONVERSION_UNCOMPRESSED && form != POINT_CONVERSION_COMPRESSED) { - WOLFSSL_MSG("Only POINT_CONVERSION_UNCOMPRESSED or POINT_CONVERSION_COMPRESSED are supported"); + if (form != POINT_CONVERSION_UNCOMPRESSED +#ifndef HAVE_SELFTEST + && form != POINT_CONVERSION_COMPRESSED +#endif /* !HAVE_SELFTEST */ + ) { + WOLFSSL_MSG("Unsupported curve form"); return WOLFSSL_FAILURE; } +#ifndef HAVE_SELFTEST if (wc_ecc_export_point_der_ex(group->curve_idx, (ecc_point*)p->internal, buf, &min_len, compressed) != (buf ? MP_OKAY : LENGTH_ONLY_E)) { return WOLFSSL_FAILURE; } +#else + if (wc_ecc_export_point_der(group->curve_idx, (ecc_point*)p->internal, + buf, &min_len) != (buf ? MP_OKAY : LENGTH_ONLY_E)) { + return WOLFSSL_FAILURE; + } +#endif /* !HAVE_SELFTEST */ (void)ctx; @@ -36636,7 +36649,7 @@ int wolfSSL_EC_POINT_set_affine_coordinates_GFp(const WOLFSSL_EC_GROUP *group, return WOLFSSL_SUCCESS; } -#if !defined(WOLFSSL_ATECC508A) && defined(ECC_SHAMIR) +#if !defined(WOLFSSL_ATECC508A) && defined(ECC_SHAMIR) && !defined(HAVE_SELFTEST) /* Calculate the value: generator * n + q * m * return code compliant with OpenSSL : * 1 if success, 0 if error @@ -36740,7 +36753,8 @@ cleanup: wc_ecc_del_point(result); return ret; } -#endif +#endif /* !defined(WOLFSSL_ATECC508A) && defined(ECC_SHAMIR) && + * !defined(HAVE_SELFTEST) */ void wolfSSL_EC_POINT_clear_free(WOLFSSL_EC_POINT *p) { @@ -48868,7 +48882,7 @@ int wolfSSL_RSA_private_decrypt(int len, const unsigned char* fr, return ret; } -#if !defined(_WIN32) && !defined(HAVE_FIPS) +#if !defined(_WIN32) && !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) int wolfSSL_RSA_public_decrypt(int flen, const unsigned char* from, unsigned char* to, WOLFSSL_RSA* rsa, int padding) { @@ -48920,7 +48934,7 @@ int wolfSSL_RSA_public_decrypt(int flen, const unsigned char* from, } return tlen; } -#endif /* !defined(_WIN32) && !defined(HAVE_FIPS) */ +#endif /* !defined(_WIN32) && !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) */ /* RSA private encrypt calls wc_RsaSSL_Sign. Similar function set up as RSA * public decrypt. diff --git a/tests/api.c b/tests/api.c index 7c7b9bbb0..1b1234b81 100644 --- a/tests/api.c +++ b/tests/api.c @@ -1798,8 +1798,6 @@ static void test_wolfSSL_EC(void) BIGNUM *set_point_bn; char* hexStr; int group_bits; - size_t bin_len; - unsigned char* buf = NULL; const char* kTest = "F4F8338AFCC562C5C3F3E1E46A7EFECD17AF381913FF7A96314EA47055EA0FD0"; /* NISTP256R1 Gx/Gy */ @@ -1808,6 +1806,8 @@ static void test_wolfSSL_EC(void) #ifndef HAVE_SELFTEST EC_POINT *tmp; + size_t bin_len; + unsigned char* buf = NULL; const char* uncompG = "046B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C2964FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5"; const unsigned char binUncompG[] = { @@ -1850,11 +1850,15 @@ static void test_wolfSSL_EC(void) Gxy->Y = Gy; Gxy->Z = Gz; +#ifndef HAVE_SELFTEST /* perform point multiplication */ AssertIntEQ(EC_POINT_mul(group, new_point, NULL, Gxy, k, ctx), WOLFSSL_SUCCESS); +#else + AssertIntEQ(EC_POINT_set_affine_coordinates_GFp(group, new_point, Gx, Gy, ctx), WOLFSSL_SUCCESS); +#endif /* check if point X coordinate is zero */ - AssertIntEQ(BN_is_zero(new_point->X), WOLFSSL_FAILURE); + AssertIntEQ(BN_is_zero(new_point->X), 0); /* Force non-affine coordinates */ AssertIntEQ(BN_add(new_point->Z, (WOLFSSL_BIGNUM*)BN_value_one(), @@ -29218,7 +29222,7 @@ static void test_wolfSSL_EVP_PKEY_encrypt(void) static void test_wolfSSL_EVP_PKEY_sign(void) { #if defined(OPENSSL_EXTRA) && !defined(NO_RSA) && defined(WOLFSSL_KEY_GEN) && \ - !defined(HAVE_FAST_RSA) + !defined(HAVE_FAST_RSA) && !defined(HAVE_SELFTEST) WOLFSSL_RSA* rsa = NULL; WOLFSSL_EVP_PKEY* pkey = NULL; WOLFSSL_EVP_PKEY_CTX* ctx = NULL; From 972208237233ecf85c11c760f8f38b8ab53593e4 Mon Sep 17 00:00:00 2001 From: Juliusz Sosinowicz Date: Thu, 19 Mar 2020 16:05:59 +0100 Subject: [PATCH 007/298] Fix `nid2*` and `*2nid` functions --- src/ssl.c | 768 +++++++++++++++++----------------------- tests/api.c | 39 +- wolfcrypt/src/asn.c | 61 ++-- wolfcrypt/src/ecc.c | 1 + wolfssl/wolfcrypt/asn.h | 17 +- wolfssl/wolfcrypt/ecc.h | 1 + 6 files changed, 399 insertions(+), 488 deletions(-) diff --git a/src/ssl.c b/src/ssl.c index a2cac292c..a31c24568 100755 --- a/src/ssl.c +++ b/src/ssl.c @@ -30629,6 +30629,307 @@ int wolfSSL_cmp_peer_cert_to_file(WOLFSSL* ssl, const char *fname) static WC_RNG globalRNG; static int initGlobalRNG = 0; #endif +#if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) + const WOLFSSL_ObjectInfo wolfssl_object_info[] = { +#ifndef NO_CERTS + /* oidCertExtType */ + { NID_basic_constraints, BASIC_CA_OID, oidCertExtType, "basicConstraints", + "X509v3 Basic Constraints"}, + { NID_subject_alt_name, ALT_NAMES_OID, oidCertExtType, "subjectAltName", + "X509v3 Subject Alternative Name"}, + { CRL_DIST_OID, CRL_DIST_OID, oidCertExtType, "crlDistributionPoints", + "X509v3 CRL Distribution Points"}, + { NID_info_access, AUTH_INFO_OID, oidCertExtType, "authorityInfoAccess", + "Authority Information Access"}, + { NID_authority_key_identifier, AUTH_KEY_OID, oidCertExtType, + "authorityKeyIdentifier", "X509v3 Authority Key Identifier"}, + { NID_subject_key_identifier, SUBJ_KEY_OID, oidCertExtType, + "subjectKeyIdentifier", "X509v3 Subject Key Identifier"}, + { NID_key_usage, KEY_USAGE_OID, oidCertExtType, "keyUsage", + "X509v3 Key Usage"}, + { NID_inhibit_any_policy, INHIBIT_ANY_OID, oidCertExtType, + "inhibitAnyPolicy", "X509v3 Inhibit Any Policy"}, + { NID_ext_key_usage, KEY_USAGE_OID, oidCertExtType, + "extendedKeyUsage", "X509v3 Extended Key Usage"}, + { NID_name_constraints, NAME_CONS_OID, oidCertExtType, + "nameConstraints", "X509v3 Name Constraints"}, + { NID_certificate_policies, CERT_POLICY_OID, oidCertExtType, + "certificatePolicies", "X509v3 Certificate Policies"}, + + /* oidCertAuthInfoType */ + { AIA_OCSP_OID, AIA_OCSP_OID, oidCertAuthInfoType, "authorityInfoAccess", + "Authority Information Access"}, + { AIA_CA_ISSUER_OID, AIA_CA_ISSUER_OID, oidCertAuthInfoType, + "caIssuers", "CA Issuers"}, + + /* oidCertPolicyType */ + { NID_any_policy, CP_ANY_OID, oidCertPolicyType, "anyPolicy", + "X509v3 Any Policy"}, + + /* oidCertAltNameType */ + { NID_hw_name_oid, HW_NAME_OID, oidCertAltNameType, "Hardware name",""}, + + /* oidCertKeyUseType */ + { NID_anyExtendedKeyUsage, EKU_ANY_OID, oidCertKeyUseType, + "anyExtendedKeyUsage", "Any Extended Key Usage"}, + { EKU_SERVER_AUTH_OID, EKU_SERVER_AUTH_OID, oidCertKeyUseType, + "serverAuth", "TLS Web Server Authentication"}, + { EKU_CLIENT_AUTH_OID, EKU_CLIENT_AUTH_OID, oidCertKeyUseType, + "clientAuth", "TLS Web Client Authentication"}, + { EKU_OCSP_SIGN_OID, EKU_OCSP_SIGN_OID, oidCertKeyUseType, + "OCSPSigning", "OCSP Signing"}, + + /* oidCertNameType */ + { NID_commonName, NID_commonName, oidCertNameType, "CN", "commonName"}, + { NID_surname, NID_surname, oidCertNameType, "SN", "surname"}, + { NID_serialNumber, NID_serialNumber, oidCertNameType, "serialNumber", + "serialNumber"}, + { NID_countryName, NID_countryName, oidCertNameType, "C", "countryName"}, + { NID_localityName, NID_localityName, oidCertNameType, "L", "localityName"}, + { NID_stateOrProvinceName, NID_stateOrProvinceName, oidCertNameType, "ST", + "stateOrProvinceName"}, + { NID_organizationName, NID_organizationName, oidCertNameType, "O", + "organizationName"}, + { NID_organizationalUnitName, NID_organizationalUnitName, oidCertNameType, + "OU", "organizationalUnitName"}, + { NID_emailAddress, NID_emailAddress, oidCertNameType, "emailAddress", + "emailAddress"}, + { NID_domainComponent, NID_domainComponent, oidCertNameType, "DC", + "domainComponent"}, + { NID_businessCategory, NID_businessCategory, oidCertNameType, "businessCategory", + "businessCategory"}, + { NID_jurisdictionCountryName, NID_jurisdictionCountryName, oidCertNameType, "jurisdictionC", + "jurisdictionCountryName"}, + { NID_jurisdictionStateOrProvinceName, NID_jurisdictionStateOrProvinceName, + oidCertNameType, "jurisdictionST", "jurisdictionStateOrProvinceName"}, +#endif +#ifdef OPENSSL_EXTRA /* OPENSSL_EXTRA_X509_SMALL only needs the above */ + /* oidHashType */ + #ifdef WOLFSSL_MD2 + { NID_md2, MD2h, oidHashType, "MD2", "md2"}, + #endif + #ifdef WOLFSSL_MD5 + { NID_md5, MD5h, oidHashType, "MD5", "md5"}, + #endif + #ifndef NO_SHA + { NID_sha1, SHAh, oidHashType, "SHA1", "sha1"}, + #endif + #ifdef WOLFSSL_SHA224 + { NID_sha224, SHA224h, oidHashType, "SHA224", "sha224"}, + #endif + #ifndef NO_SHA256 + { NID_sha256, SHA256h, oidHashType, "SHA256", "sha256"}, + #endif + #ifdef WOLFSSL_SHA384 + { NID_sha384, SHA384h, oidHashType, "SHA384", "sha384"}, + #endif + #ifdef WOLFSSL_SHA512 + { NID_sha512, SHA512h, oidHashType, "SHA512", "sha512"}, + #endif + + /* oidSigType */ + #ifndef NO_DSA + #ifndef NO_SHA + { CTC_SHAwDSA, CTC_SHAwDSA, oidSigType, "DSA-SHA1", "dsaWithSHA1"}, + #endif + #endif /* NO_DSA */ + #ifndef NO_RSA + #ifdef WOLFSSL_MD2 + { CTC_MD2wRSA, CTC_MD2wRSA, oidSigType, "RSA-MD2", + "md2WithRSAEncryption"}, + #endif + #ifndef NO_MD5 + { CTC_MD5wRSA, CTC_MD5wRSA, oidSigType, "RSA-MD5", + "md5WithRSAEncryption"}, + #endif + #ifndef NO_SHA + { CTC_SHAwRSA, CTC_SHAwRSA, oidSigType, "RSA-SHA1", + "sha1WithRSAEncryption"}, + #endif + #ifdef WOLFSSL_SHA224 + { CTC_SHA224wRSA, CTC_SHA224wRSA, oidSigType, "RSA-SHA224", + "sha224WithRSAEncryption"}, + #endif + #ifndef NO_SHA256 + { CTC_SHA256wRSA, CTC_SHA256wRSA, oidSigType, "RSA-SHA256", + "sha256WithRSAEncryption"}, + #endif + #ifdef WOLFSSL_SHA384 + { CTC_SHA384wRSA, CTC_SHA384wRSA, oidSigType, "RSA-SHA384", + "sha384WithRSAEncryption"}, + #endif + #ifdef WOLFSSL_SHA512 + { CTC_SHA512wRSA, CTC_SHA512wRSA, oidSigType, "RSA-SHA512", + "sha512WithRSAEncryption"}, + #endif + #endif /* NO_RSA */ + #ifdef HAVE_ECC + #ifndef NO_SHA + { CTC_SHAwECDSA, CTC_SHAwECDSA, oidSigType, "ecdsa-with-SHA1", "shaWithECDSA"}, + #endif + #ifdef WOLFSSL_SHA224 + { CTC_SHA224wECDSA, CTC_SHA224wECDSA, oidSigType, "ecdsa-with-SHA224","sha224WithECDSA"}, + #endif + #ifndef NO_SHA256 + { CTC_SHA256wECDSA, CTC_SHA256wECDSA, oidSigType, "ecdsa-with-SHA256","sha256WithECDSA"}, + #endif + #ifdef WOLFSSL_SHA384 + { CTC_SHA384wECDSA, CTC_SHA384wECDSA, oidSigType, "ecdsa-with-SHA384","sha384WithECDSA"}, + #endif + #ifdef WOLFSSL_SHA512 + { CTC_SHA512wECDSA, CTC_SHA512wECDSA, oidSigType, "ecdsa-with-SHA512","sha512WithECDSA"}, + #endif + #endif /* HAVE_ECC */ + + /* oidKeyType */ + #ifndef NO_DSA + { DSAk, DSAk, oidKeyType, "DSA", "dsaEncryption"}, + #endif /* NO_DSA */ + #ifndef NO_RSA + { RSAk, RSAk, oidKeyType, "RSA", "rsaEncryption"}, + #endif /* NO_RSA */ + #ifdef HAVE_NTRU + { NTRUk, NTRUk, oidKeyType, "NTRU", "ntruEncryption"}, + #endif /* HAVE_NTRU */ + #ifdef HAVE_ECC + { ECDSAk, ECDSAk, oidKeyType, "ECDSA", "ecdsaEncryption"}, + #endif /* HAVE_ECC */ + + /* oidCurveType */ + #ifdef HAVE_ECC + { NID_X9_62_prime192v1, ECC_SECP192R1_OID, oidCurveType, "prime192v1", "prime192v1"}, + { NID_X9_62_prime192v2, ECC_PRIME192V2_OID, oidCurveType, "prime192v2", "prime192v2"}, + { NID_X9_62_prime192v3, ECC_PRIME192V3_OID, oidCurveType, "prime192v3", "prime192v3"}, + + { NID_X9_62_prime239v1, ECC_PRIME239V1_OID, oidCurveType, "prime239v1", "prime239v1"}, + { NID_X9_62_prime239v2, ECC_PRIME239V2_OID, oidCurveType, "prime239v2", "prime239v2"}, + { NID_X9_62_prime239v3, ECC_PRIME239V3_OID, oidCurveType, "prime239v3", "prime239v3"}, + + { NID_X9_62_prime256v1, ECC_SECP256R1_OID, oidCurveType, "prime256v1", "prime256v1"}, + + { NID_secp112r1, ECC_SECP112R1_OID, oidCurveType, "secp112r1", "secp112r1"}, + { NID_secp112r2, ECC_SECP112R2_OID, oidCurveType, "secp112r2", "secp112r2"}, + + { NID_secp128r1, ECC_SECP128R1_OID, oidCurveType, "secp128r1", "secp128r1"}, + { NID_secp128r2, ECC_SECP128R2_OID, oidCurveType, "secp128r2", "secp128r2"}, + + { NID_secp160r1, ECC_SECP160R1_OID, oidCurveType, "secp160r1", "secp160r1"}, + { NID_secp160r2, ECC_SECP160R2_OID, oidCurveType, "secp160r2", "secp160r2"}, + + { NID_secp224r1, ECC_SECP224R1_OID, oidCurveType, "secp224r1", "secp224r1"}, + { NID_secp384r1, ECC_SECP384R1_OID, oidCurveType, "secp384r1", "secp384r1"}, + { NID_secp521r1, ECC_SECP521R1_OID, oidCurveType, "secp521r1", "secp521r1"}, + + { NID_secp160k1, ECC_SECP160K1_OID, oidCurveType, "secp160k1", "secp160k1"}, + { NID_secp192k1, ECC_SECP192K1_OID, oidCurveType, "secp192k1", "secp192k1"}, + { NID_secp224k1, ECC_SECP224K1_OID, oidCurveType, "secp224k1", "secp224k1"}, + { NID_secp256k1, ECC_SECP256K1_OID, oidCurveType, "secp256k1", "secp256k1"}, + + { NID_brainpoolP160r1, ECC_BRAINPOOLP160R1_OID, oidCurveType, "brainpoolP160r1", "brainpoolP160r1"}, + { NID_brainpoolP192r1, ECC_BRAINPOOLP192R1_OID, oidCurveType, "brainpoolP192r1", "brainpoolP192r1"}, + { NID_brainpoolP224r1, ECC_BRAINPOOLP224R1_OID, oidCurveType, "brainpoolP224r1", "brainpoolP224r1"}, + { NID_brainpoolP256r1, ECC_BRAINPOOLP256R1_OID, oidCurveType, "brainpoolP256r1", "brainpoolP256r1"}, + { NID_brainpoolP320r1, ECC_BRAINPOOLP320R1_OID, oidCurveType, "brainpoolP320r1", "brainpoolP320r1"}, + { NID_brainpoolP384r1, ECC_BRAINPOOLP384R1_OID, oidCurveType, "brainpoolP384r1", "brainpoolP384r1"}, + { NID_brainpoolP512r1, ECC_BRAINPOOLP512R1_OID, oidCurveType, "brainpoolP512r1", "brainpoolP512r1"}, + #endif /* HAVE_ECC */ + + /* oidBlkType */ + #ifdef WOLFSSL_AES_128 + { AES128CBCb, AES128CBCb, oidBlkType, "AES-128-CBC", "aes-128-cbc"}, + #endif + #ifdef WOLFSSL_AES_192 + { AES192CBCb, AES192CBCb, oidBlkType, "AES-192-CBC", "aes-192-cbc"}, + #endif + #ifdef WOLFSSL_AES_256 + { AES256CBCb, AES256CBCb, oidBlkType, "AES-256-CBC", "aes-256-cbc"}, + #endif + #ifndef NO_DES3 + { NID_des, DESb, oidBlkType, "DES-CBC", "des-cbc"}, + { NID_des3, DES3b, oidBlkType, "DES-EDE3-CBC", "des-ede3-cbc"}, + #endif /* !NO_DES3 */ + + /* oidOcspType */ + #ifdef HAVE_OCSP + { NID_id_pkix_OCSP_basic, OCSP_BASIC_OID, oidOcspType, "basicOCSPResponse", + "Basic OCSP Response"}, + { OCSP_NONCE_OID, OCSP_NONCE_OID, oidOcspType, "Nonce", + "OCSP Nonce"}, + #endif /* HAVE_OCSP */ + + #ifndef NO_PWDBASED + /* oidKdfType */ + { PBKDF2_OID, PBKDF2_OID, oidKdfType, "PBKDFv2", "PBKDF2"}, + + /* oidPBEType */ + { PBE_SHA1_RC4_128, PBE_SHA1_RC4_128, oidPBEType, + "PBE-SHA1-RC4-128", "pbeWithSHA1And128BitRC4"}, + { PBE_SHA1_DES, PBE_SHA1_DES, oidPBEType, "PBE-SHA1-DES", + "pbeWithSHA1AndDES-CBC"}, + { PBE_SHA1_DES3, PBE_SHA1_DES3, oidPBEType, "PBE-SHA1-3DES", + "pbeWithSHA1And3-KeyTripleDES-CBC"}, + #endif + + /* oidKeyWrapType */ + #ifdef WOLFSSL_AES_128 + { AES128_WRAP, AES128_WRAP, oidKeyWrapType, "AES-128 wrap", "aes128-wrap"}, + #endif + #ifdef WOLFSSL_AES_192 + { AES192_WRAP, AES192_WRAP, oidKeyWrapType, "AES-192 wrap", "aes192-wrap"}, + #endif + #ifdef WOLFSSL_AES_256 + { AES256_WRAP, AES256_WRAP, oidKeyWrapType, "AES-256 wrap", "aes256-wrap"}, + #endif + + #ifndef NO_PKCS7 + #ifndef NO_DH + /* oidCmsKeyAgreeType */ + #ifndef NO_SHA + { dhSinglePass_stdDH_sha1kdf_scheme, dhSinglePass_stdDH_sha1kdf_scheme, + oidCmsKeyAgreeType, "dhSinglePass-stdDH-sha1kdf-scheme", "dhSinglePass-stdDH-sha1kdf-scheme"}, + #endif + #ifdef WOLFSSL_SHA224 + { dhSinglePass_stdDH_sha224kdf_scheme, + dhSinglePass_stdDH_sha224kdf_scheme, oidCmsKeyAgreeType, + "dhSinglePass-stdDH-sha224kdf-scheme", "dhSinglePass-stdDH-sha224kdf-scheme"}, + #endif + #ifndef NO_SHA256 + { dhSinglePass_stdDH_sha256kdf_scheme, + dhSinglePass_stdDH_sha256kdf_scheme, oidCmsKeyAgreeType, + "dhSinglePass-stdDH-sha256kdf-scheme", "dhSinglePass-stdDH-sha256kdf-scheme"}, + #endif + #ifdef WOLFSSL_SHA384 + { dhSinglePass_stdDH_sha384kdf_scheme, + dhSinglePass_stdDH_sha384kdf_scheme, oidCmsKeyAgreeType, + "dhSinglePass-stdDH-sha384kdf-scheme", "dhSinglePass-stdDH-sha384kdf-scheme"}, + #endif + #ifdef WOLFSSL_SHA512 + { dhSinglePass_stdDH_sha512kdf_scheme, + dhSinglePass_stdDH_sha512kdf_scheme, oidCmsKeyAgreeType, + "dhSinglePass-stdDH-sha512kdf-scheme", "dhSinglePass-stdDH-sha512kdf-scheme"}, + #endif + #endif + #endif + #if defined(WOLFSSL_APACHE_HTTPD) + /* "1.3.6.1.5.5.7.8.7" */ + { NID_id_on_dnsSRV, NID_id_on_dnsSRV, oidCertNameType, + WOLFSSL_SN_DNS_SRV, WOLFSSL_LN_DNS_SRV }, + + /* "1.3.6.1.4.1.311.20.2.3" */ + { NID_ms_upn, WOLFSSL_MS_UPN_SUM, oidCertExtType, WOLFSSL_SN_MS_UPN, + WOLFSSL_LN_MS_UPN }, + + /* "1.3.6.1.5.5.7.1.24" */ + { NID_tlsfeature, WOLFSSL_TLS_FEATURE_SUM, oidTlsExtType, + WOLFSSL_SN_TLS_FEATURE, WOLFSSL_LN_TLS_FEATURE }, + #endif +#endif /* OPENSSL_EXTRA */ + }; + + #define WOLFSSL_OBJECT_INFO_SZ \ + (sizeof(wolfssl_object_info) / sizeof(*wolfssl_object_info)) + const size_t wolfssl_object_info_sz = WOLFSSL_OBJECT_INFO_SZ; +#endif #if defined(OPENSSL_EXTRA) && \ !defined(NO_RSA) && !defined(HAVE_USER_RSA) && !defined(HAVE_FAST_RSA) WC_RNG* WOLFSSL_RSA_GetRNG(WOLFSSL_RSA *rsa, WC_RNG **tmpRNG, int *initTmpRng) @@ -36878,11 +37179,12 @@ int wolfSSL_EC_POINT_is_at_infinity(const WOLFSSL_EC_GROUP *group, size_t wolfSSL_EC_get_builtin_curves(WOLFSSL_EC_BUILTIN_CURVE *r, size_t nitems) { - size_t ecc_sets_count; size_t i, min_nitems; - - for (i = 0; ecc_sets[i].size != 0; i++); +#ifdef HAVE_SELFTEST + size_t ecc_sets_count; + for (i = 0; ecc_sets[i].size != 0 && ecc_sets[i].name != NULL; i++); ecc_sets_count = i; +#endif if (r == NULL || nitems == 0) return ecc_sets_count; @@ -36891,7 +37193,7 @@ size_t wolfSSL_EC_get_builtin_curves(WOLFSSL_EC_BUILTIN_CURVE *r, size_t nitems) for (i = 0; i < min_nitems; i++) { r[i].nid = EccEnumToNID(ecc_sets[i].id); - r[i].comment = ecc_sets[i].name; + r[i].comment = wolfSSL_OBJ_nid2sn(r[i].nid); } return ecc_sets_count; @@ -39922,7 +40224,6 @@ void* wolfSSL_GetDhAgreeCtx(WOLFSSL* ssl) void wolfSSL_cert_service(void) {} #endif - #ifdef OPENSSL_EXTRA #ifndef NO_CERTS void wolfSSL_X509_NAME_free(WOLFSSL_X509_NAME *name) @@ -41857,303 +42158,6 @@ err: return SSL_SUCCESS; } - typedef struct WOLFSSL_ObjectInfo { - int nid; - int id; - word32 type; - const char* sName; - const char* lName; - } WOLFSSL_ObjectInfo; - - static WOLFSSL_ObjectInfo wolfssl_object_info[] = { - /* oidHashType */ - #ifdef WOLFSSL_MD2 - { NID_md2, MD2h, oidHashType, "MD2", "md2"}, - #endif - #ifdef WOLFSSL_MD5 - { NID_md5, MD5h, oidHashType, "MD5", "md5"}, - #endif - #ifndef NO_SHA - { NID_sha1, SHAh, oidHashType, "SHA1", "sha1"}, - #endif - #ifdef WOLFSSL_SHA224 - { NID_sha224, SHA224h, oidHashType, "SHA224", "sha224"}, - #endif - #ifndef NO_SHA256 - { NID_sha256, SHA256h, oidHashType, "SHA256", "sha256"}, - #endif - #ifdef WOLFSSL_SHA384 - { NID_sha384, SHA384h, oidHashType, "SHA384", "sha384"}, - #endif - #ifdef WOLFSSL_SHA512 - { NID_sha512, SHA512h, oidHashType, "SHA512", "sha512"}, - #endif - - /* oidSigType */ - #ifndef NO_DSA - #ifndef NO_SHA - { CTC_SHAwDSA, CTC_SHAwDSA, oidSigType, "DSA-SHA1", "dsaWithSHA1"}, - #endif - #endif /* NO_DSA */ - #ifndef NO_RSA - #ifdef WOLFSSL_MD2 - { CTC_MD2wRSA, CTC_MD2wRSA, oidSigType, "RSA-MD2", - "md2WithRSAEncryption"}, - #endif - #ifndef NO_MD5 - { CTC_MD5wRSA, CTC_MD5wRSA, oidSigType, "RSA-MD5", - "md5WithRSAEncryption"}, - #endif - #ifndef NO_SHA - { CTC_SHAwRSA, CTC_SHAwRSA, oidSigType, "RSA-SHA1", - "sha1WithRSAEncryption"}, - #endif - #ifdef WOLFSSL_SHA224 - { CTC_SHA224wRSA, CTC_SHA224wRSA, oidSigType, "RSA-SHA224", - "sha224WithRSAEncryption"}, - #endif - #ifndef NO_SHA256 - { CTC_SHA256wRSA, CTC_SHA256wRSA, oidSigType, "RSA-SHA256", - "sha256WithRSAEncryption"}, - #endif - #ifdef WOLFSSL_SHA384 - { CTC_SHA384wRSA, CTC_SHA384wRSA, oidSigType, "RSA-SHA384", - "sha384WithRSAEncryption"}, - #endif - #ifdef WOLFSSL_SHA512 - { CTC_SHA512wRSA, CTC_SHA512wRSA, oidSigType, "RSA-SHA512", - "sha512WithRSAEncryption"}, - #endif - #endif /* NO_RSA */ - #ifdef HAVE_ECC - #ifndef NO_SHA - { CTC_SHAwECDSA, CTC_SHAwECDSA, oidSigType, "ecdsa-with-SHA1", "shaWithECDSA"}, - #endif - #ifdef WOLFSSL_SHA224 - { CTC_SHA224wECDSA, CTC_SHA224wECDSA, oidSigType, "ecdsa-with-SHA224","sha224WithECDSA"}, - #endif - #ifndef NO_SHA256 - { CTC_SHA256wECDSA, CTC_SHA256wECDSA, oidSigType, "ecdsa-with-SHA256","sha256WithECDSA"}, - #endif - #ifdef WOLFSSL_SHA384 - { CTC_SHA384wECDSA, CTC_SHA384wECDSA, oidSigType, "ecdsa-with-SHA384","sha384WithECDSA"}, - #endif - #ifdef WOLFSSL_SHA512 - { CTC_SHA512wECDSA, CTC_SHA512wECDSA, oidSigType, "ecdsa-with-SHA512","sha512WithECDSA"}, - #endif - #endif /* HAVE_ECC */ - - /* oidKeyType */ - #ifndef NO_DSA - { DSAk, DSAk, oidKeyType, "DSA", "dsaEncryption"}, - #endif /* NO_DSA */ - #ifndef NO_RSA - { RSAk, RSAk, oidKeyType, "RSA", "rsaEncryption"}, - #endif /* NO_RSA */ - #ifdef HAVE_NTRU - { NTRUk, NTRUk, oidKeyType, "NTRU", "ntruEncryption"}, - #endif /* HAVE_NTRU */ - #ifdef HAVE_ECC - { ECDSAk, ECDSAk, oidKeyType, "ECDSA", "ecdsaEncryption"}, - #endif /* HAVE_ECC */ - - /* oidCurveType */ - #ifdef HAVE_ECC - { NID_X9_62_prime192v1, ECC_SECP192R1_OID, oidCurveType, "prime192v1", ""}, - { NID_X9_62_prime192v2, ECC_PRIME192V2_OID, oidCurveType, "prime192v2", ""}, - { NID_X9_62_prime192v3, ECC_PRIME192V3_OID, oidCurveType, "prime192v3", ""}, - - { NID_X9_62_prime239v1, ECC_PRIME239V1_OID, oidCurveType, "prime239v1", ""}, - { NID_X9_62_prime239v2, ECC_PRIME239V2_OID, oidCurveType, "prime239v2", ""}, - { NID_X9_62_prime239v3, ECC_PRIME239V3_OID, oidCurveType, "prime239v3", ""}, - - { NID_X9_62_prime256v1, ECC_SECP256R1_OID, oidCurveType, "prime256v1", ""}, - - { NID_secp112r1, ECC_SECP112R1_OID, oidCurveType, "secp112r1", ""}, - { NID_secp112r2, ECC_SECP112R2_OID, oidCurveType, "secp112r2", ""}, - - { NID_secp128r1, ECC_SECP128R1_OID, oidCurveType, "secp128r1", ""}, - { NID_secp128r2, ECC_SECP128R2_OID, oidCurveType, "secp128r2", ""}, - - { NID_secp160r1, ECC_SECP160R1_OID, oidCurveType, "secp160r1", ""}, - { NID_secp160r2, ECC_SECP160R2_OID, oidCurveType, "secp160r2", ""}, - - { NID_secp224r1, ECC_SECP224R1_OID, oidCurveType, "secp224r1", ""}, - { NID_secp384r1, ECC_SECP384R1_OID, oidCurveType, "secp384r1", ""}, - { NID_secp521r1, ECC_SECP521R1_OID, oidCurveType, "secp521r1", ""}, - - { NID_secp160k1, ECC_SECP160K1_OID, oidCurveType, "secp160k1", ""}, - { NID_secp192k1, ECC_SECP192K1_OID, oidCurveType, "secp192k1", ""}, - { NID_secp224k1, ECC_SECP224K1_OID, oidCurveType, "secp224k1", ""}, - { NID_secp256k1, ECC_SECP256K1_OID, oidCurveType, "secp256k1", ""}, - - { NID_brainpoolP160r1, ECC_BRAINPOOLP160R1_OID, oidCurveType, "brainpoolP160r1", ""}, - { NID_brainpoolP192r1, ECC_BRAINPOOLP192R1_OID, oidCurveType, "brainpoolP192r1", ""}, - { NID_brainpoolP224r1, ECC_BRAINPOOLP224R1_OID, oidCurveType, "brainpoolP224r1", ""}, - { NID_brainpoolP256r1, ECC_BRAINPOOLP256R1_OID, oidCurveType, "brainpoolP256r1", ""}, - { NID_brainpoolP320r1, ECC_BRAINPOOLP320R1_OID, oidCurveType, "brainpoolP320r1", ""}, - { NID_brainpoolP384r1, ECC_BRAINPOOLP384R1_OID, oidCurveType, "brainpoolP384r1", ""}, - { NID_brainpoolP512r1, ECC_BRAINPOOLP512R1_OID, oidCurveType, "brainpoolP512r1", ""}, - #endif /* HAVE_ECC */ - - /* oidBlkType */ - #ifdef WOLFSSL_AES_128 - { AES128CBCb, AES128CBCb, oidBlkType, "AES-128-CBC", "aes-128-cbc"}, - #endif - #ifdef WOLFSSL_AES_192 - { AES192CBCb, AES192CBCb, oidBlkType, "AES-192-CBC", "aes-192-cbc"}, - #endif - #ifdef WOLFSSL_AES_256 - { AES256CBCb, AES256CBCb, oidBlkType, "AES-256-CBC", "aes-256-cbc"}, - #endif - #ifndef NO_DES3 - { NID_des, DESb, oidBlkType, "DES-CBC", "des-cbc"}, - { NID_des3, DES3b, oidBlkType, "DES-EDE3-CBC", "des-ede3-cbc"}, - #endif /* !NO_DES3 */ - - /* oidOcspType */ - #ifdef HAVE_OCSP - { NID_id_pkix_OCSP_basic, OCSP_BASIC_OID, oidOcspType, "basicOCSPResponse", - "Basic OCSP Response"}, - { OCSP_NONCE_OID, OCSP_NONCE_OID, oidOcspType, "Nonce", - "OCSP Nonce"}, - #endif /* HAVE_OCSP */ - - #ifndef NO_CERTS - /* oidCertExtType */ - { NID_basic_constraints, BASIC_CA_OID, oidCertExtType, "basicConstraints", - "X509v3 Basic Constraints"}, - { NID_subject_alt_name, ALT_NAMES_OID, oidCertExtType, "subjectAltName", - "X509v3 Subject Alternative Name"}, - { CRL_DIST_OID, CRL_DIST_OID, oidCertExtType, "crlDistributionPoints", - "X509v3 CRL Distribution Points"}, - { NID_info_access, AUTH_INFO_OID, oidCertExtType, "authorityInfoAccess", - "Authority Information Access"}, - { NID_authority_key_identifier, AUTH_KEY_OID, oidCertExtType, - "authorityKeyIdentifier", "X509v3 Authority Key Identifier"}, - { NID_subject_key_identifier, SUBJ_KEY_OID, oidCertExtType, - "subjectKeyIdentifier", "X509v3 Subject Key Identifier"}, - { NID_key_usage, KEY_USAGE_OID, oidCertExtType, "keyUsage", - "X509v3 Key Usage"}, - { NID_inhibit_any_policy, INHIBIT_ANY_OID, oidCertExtType, - "inhibitAnyPolicy", "X509v3 Inhibit Any Policy"}, - { NID_ext_key_usage, KEY_USAGE_OID, oidCertExtType, - "extendedKeyUsage", "X509v3 Extended Key Usage"}, - { NID_name_constraints, NAME_CONS_OID, oidCertExtType, - "nameConstraints", "X509v3 Name Constraints"}, - { NID_certificate_policies, CERT_POLICY_OID, oidCertExtType, - "certificatePolicies", "X509v3 Certificate Policies"}, - - /* oidCertAuthInfoType */ - { AIA_OCSP_OID, AIA_OCSP_OID, oidCertAuthInfoType, "authorityInfoAccess", - "Authority Information Access"}, - { AIA_CA_ISSUER_OID, AIA_CA_ISSUER_OID, oidCertAuthInfoType, - "caIssuers", "CA Issuers"}, - - /* oidCertPolicyType */ - { NID_any_policy, CP_ANY_OID, oidCertPolicyType, "anyPolicy", - "X509v3 Any Policy"}, - - /* oidCertAltNameType */ - { NID_hw_name_oid, HW_NAME_OID, oidCertAltNameType, "Hardware name",""}, - - /* oidCertKeyUseType */ - { NID_anyExtendedKeyUsage, EKU_ANY_OID, oidCertKeyUseType, - "anyExtendedKeyUsage", "Any Extended Key Usage"}, - { EKU_SERVER_AUTH_OID, EKU_SERVER_AUTH_OID, oidCertKeyUseType, - "serverAuth", "TLS Web Server Authentication"}, - { EKU_CLIENT_AUTH_OID, EKU_CLIENT_AUTH_OID, oidCertKeyUseType, - "clientAuth", "TLS Web Client Authentication"}, - { EKU_OCSP_SIGN_OID, EKU_OCSP_SIGN_OID, oidCertKeyUseType, - "OCSPSigning", "OCSP Signing"}, - - /* oidCertNameType */ - { NID_commonName, NID_commonName, oidCertNameType, "CN", "commonName"}, - { NID_surname, NID_surname, oidCertNameType, "SN", "surname"}, - { NID_serialNumber, NID_serialNumber, oidCertNameType, "serialNumber", - "serialNumber"}, - { NID_countryName, NID_countryName, oidCertNameType, "C", "countryName"}, - { NID_localityName, NID_localityName, oidCertNameType, "L", "localityName"}, - { NID_stateOrProvinceName, NID_stateOrProvinceName, oidCertNameType, "ST", - "stateOrProvinceName"}, - { NID_organizationName, NID_organizationName, oidCertNameType, "O", - "organizationName"}, - { NID_organizationalUnitName, NID_organizationalUnitName, oidCertNameType, - "OU", "organizationUnitName"}, - { NID_emailAddress, NID_emailAddress, oidCertNameType, "emailAddress", - "emailAddress"}, - #endif - #ifndef NO_PWDBASED - /* oidKdfType */ - { PBKDF2_OID, PBKDF2_OID, oidKdfType, "PBKDFv2", "PBKDF2"}, - - /* oidPBEType */ - { PBE_SHA1_RC4_128, PBE_SHA1_RC4_128, oidPBEType, - "PBE-SHA1-RC4-128", "pbeWithSHA1And128BitRC4"}, - { PBE_SHA1_DES, PBE_SHA1_DES, oidPBEType, "PBE-SHA1-DES", - "pbeWithSHA1AndDES-CBC"}, - { PBE_SHA1_DES3, PBE_SHA1_DES3, oidPBEType, "PBE-SHA1-3DES", - "pbeWithSHA1And3-KeyTripleDES-CBC"}, - #endif - - /* oidKeyWrapType */ - #ifdef WOLFSSL_AES_128 - { AES128_WRAP, AES128_WRAP, oidKeyWrapType, "AES-128 wrap", "aes128-wrap"}, - #endif - #ifdef WOLFSSL_AES_192 - { AES192_WRAP, AES192_WRAP, oidKeyWrapType, "AES-192 wrap", "aes192-wrap"}, - #endif - #ifdef WOLFSSL_AES_256 - { AES256_WRAP, AES256_WRAP, oidKeyWrapType, "AES-256 wrap", "aes256-wrap"}, - #endif - - #ifndef NO_PKCS7 - #ifndef NO_DH - /* oidCmsKeyAgreeType */ - #ifndef NO_SHA - { dhSinglePass_stdDH_sha1kdf_scheme, dhSinglePass_stdDH_sha1kdf_scheme, - oidCmsKeyAgreeType, "dhSinglePass-stdDH-sha1kdf-scheme", "dhSinglePass-stdDH-sha1kdf-scheme"}, - #endif - #ifdef WOLFSSL_SHA224 - { dhSinglePass_stdDH_sha224kdf_scheme, - dhSinglePass_stdDH_sha224kdf_scheme, oidCmsKeyAgreeType, - "dhSinglePass-stdDH-sha224kdf-scheme", "dhSinglePass-stdDH-sha224kdf-scheme"}, - #endif - #ifndef NO_SHA256 - { dhSinglePass_stdDH_sha256kdf_scheme, - dhSinglePass_stdDH_sha256kdf_scheme, oidCmsKeyAgreeType, - "dhSinglePass-stdDH-sha256kdf-scheme", "dhSinglePass-stdDH-sha256kdf-scheme"}, - #endif - #ifdef WOLFSSL_SHA384 - { dhSinglePass_stdDH_sha384kdf_scheme, - dhSinglePass_stdDH_sha384kdf_scheme, oidCmsKeyAgreeType, - "dhSinglePass-stdDH-sha384kdf-scheme", "dhSinglePass-stdDH-sha384kdf-scheme"}, - #endif - #ifdef WOLFSSL_SHA512 - { dhSinglePass_stdDH_sha512kdf_scheme, - dhSinglePass_stdDH_sha512kdf_scheme, oidCmsKeyAgreeType, - "dhSinglePass-stdDH-sha512kdf-scheme", "dhSinglePass-stdDH-sha512kdf-scheme"}, - #endif - #endif - #endif - #if defined(WOLFSSL_APACHE_HTTPD) - /* "1.3.6.1.5.5.7.8.7" */ - { NID_id_on_dnsSRV, NID_id_on_dnsSRV, oidCertNameType, - WOLFSSL_SN_DNS_SRV, WOLFSSL_LN_DNS_SRV }, - - /* "1.3.6.1.4.1.311.20.2.3" */ - { NID_ms_upn, WOLFSSL_MS_UPN_SUM, oidCertExtType, WOLFSSL_SN_MS_UPN, - WOLFSSL_LN_MS_UPN }, - - /* "1.3.6.1.5.5.7.1.24" */ - { NID_tlsfeature, WOLFSSL_TLS_FEATURE_SUM, oidTlsExtType, - WOLFSSL_SN_TLS_FEATURE, WOLFSSL_LN_TLS_FEATURE }, - #endif - }; - - #define WOLFSSL_OBJECT_INFO_SZ \ - (sizeof(wolfssl_object_info) / sizeof(*wolfssl_object_info)) - int wolfSSL_X509_NAME_add_entry_by_txt(WOLFSSL_X509_NAME *name, const char *field, int type, const unsigned char *bytes, int len, @@ -42765,71 +42769,20 @@ err: * or NULL if short name can't be found. */ const char * wolfSSL_OBJ_nid2sn(int n) { - + const WOLFSSL_ObjectInfo *obj_info = wolfssl_object_info; + size_t i; WOLFSSL_ENTER("wolfSSL_OBJ_nid2sn"); - - switch(n) - { - case NID_commonName : - return "CN"; - case NID_countryName : - return "C"; - case NID_localityName : - return "L"; - case NID_stateOrProvinceName : - return "ST"; - case NID_organizationName : - return "O"; - case NID_organizationalUnitName : - return "OU"; - case NID_emailAddress : - return "emailAddress"; - case NID_basic_constraints : - return "basicConstraints"; - case NID_subject_key_identifier : - return "subjectKeyIdentifier"; - case NID_authority_key_identifier : - return "authorityKeyIdentifier"; - case NID_certificate_policies: - return "certificatePolicies"; - case NID_key_usage : - return "keyUsage"; - case NID_info_access : - return "authorityInfoAccess"; - case NID_crl_distribution_points : - return "cRLDistributionPoints"; - case EXT_KEY_USAGE_OID : - return "extKeyUsage"; - case AIA_OCSP_OID: - return "OCSP"; - case AIA_CA_ISSUER_OID: - return "caIssuers"; - default : - break; - } - - #ifdef HAVE_ECC - { - int eccEnum; - int i; - /* Convert OpenSSL NID to enum value in ecc_curve_id */ - if ((eccEnum = NIDToEccEnum(n)) != -1) { - /* find sn based on NID and return name */ - for (i = 0; ecc_sets[i].size != 0; i++) { - if (eccEnum == ecc_sets[i].id) { - return ecc_sets[i].name; - } - } + for (i = 0; i < WOLFSSL_OBJECT_INFO_SZ; i++, obj_info++) { + if (obj_info->nid == n) { + return obj_info->sName; } } - #endif /* HAVE_ECC */ WOLFSSL_MSG("SN not found"); return NULL; } #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) int wolfSSL_OBJ_sn2nid(const char *sn) { - WOLFSSL_ENTER("wolfSSL_OBJ_sn2nid"); if (sn == NULL) return NID_undef; @@ -42877,49 +42830,14 @@ err: * n : NID value of ASN1_OBJECT to search */ const char* wolfSSL_OBJ_nid2ln(int n) { - int i; + const WOLFSSL_ObjectInfo *obj_info = wolfssl_object_info; + size_t i; WOLFSSL_ENTER("wolfSSL_OBJ_nid2ln"); - - switch(n) - { - case NID_commonName : - return WOLFSSL_LN_COMMON_NAME; - case NID_countryName : - return WOLFSSL_LN_COUNTRY_NAME; - case NID_localityName : - return WOLFSSL_LN_LOCALITY_NAME; - case NID_stateOrProvinceName : - return WOLFSSL_LN_STATE_NAME; - case NID_organizationName : - return WOLFSSL_LN_ORG_NAME; - case NID_organizationalUnitName : - return WOLFSSL_LN_ORGUNIT_NAME; - case NID_emailAddress : - return WOLFSSL_EMAIL_ADDR; - default: - break; - } - - #ifdef HAVE_ECC - { - int eccEnum; - /* Convert OpenSSL NID to enum value in ecc_curve_id */ - if ((eccEnum = NIDToEccEnum(n)) != -1) { - /* find sn based on NID and return name */ - for (i = 0; i < ecc_sets[i].size; i++) { - if (eccEnum == ecc_sets[i].id) { - return ecc_sets[i].name; - } - } + for (i = 0; i < WOLFSSL_OBJECT_INFO_SZ; i++, obj_info++) { + if (obj_info->nid == n) { + return obj_info->lName; } } - #endif /* HAVE_ECC */ - - for (i = 0; i < (int)WOLFSSL_OBJECT_INFO_SZ; i++) { - if (wolfssl_object_info[i].nid == n) - return wolfssl_object_info[i].lName; - } - WOLFSSL_MSG("NID not found in table"); return NULL; } @@ -42929,51 +42847,25 @@ err: */ int wolfSSL_OBJ_ln2nid(const char *ln) { - static const struct { - const char *ln; - int nid; - } ln2nid[] = { - {WOLFSSL_LN_COMMON_NAME, NID_commonName}, - {WOLFSSL_LN_COUNTRY_NAME, NID_countryName}, - {WOLFSSL_LN_LOCALITY_NAME, NID_localityName}, - {WOLFSSL_LN_STATE_NAME, NID_stateOrProvinceName}, - {WOLFSSL_LN_ORG_NAME, NID_organizationName}, - {WOLFSSL_LN_ORGUNIT_NAME, NID_organizationalUnitName}, - {WOLFSSL_EMAIL_ADDR, NID_emailAddress}, - {NULL, -1}}; - - int i; + const WOLFSSL_ObjectInfo *obj_info = wolfssl_object_info; + size_t i, lnlen; WOLFSSL_ENTER("wolfSSL_OBJ_ln2nid"); - - if (ln == NULL) return BAD_FUNC_ARG; - - /* Return certificate info ln */ - for(i=0; ln2nid[i].ln != NULL; i++) { - if(XSTRNCMP(ln, ln2nid[i].ln, XSTRLEN(ln2nid[i].ln)) == 0) { - return ln2nid[i].nid; + if (ln && (lnlen = XSTRLEN(ln)) > 0) { + /* Accept input like "/commonName=" */ + if (ln[0] == '/') { + ln++; + lnlen--; } - } - - /* Return ECC ln */ - #ifdef HAVE_ECC - { - int eccEnum; - /* Nginx uses this OpenSSL string. */ - #ifdef WOLFSSL_NGINX - if (XSTRNCMP(ln, "prime256v1", 10) == 0) ln = "SECP256R1"; - if (XSTRNCMP(ln, "secp384r1", 10) == 0) ln = "SECP384R1"; - #endif - /* find based on name and return NID */ - for (i = 0; i < ecc_sets[i].size; i++) { - if (XSTRNCMP(ln, ecc_sets[i].name, ECC_MAXNAME) == 0) { - eccEnum = ecc_sets[i].id; - /* Convert enum value in ecc_curve_id to OpenSSL NID */ - return EccEnumToNID(eccEnum); + if (ln[lnlen-1] == '=') { + lnlen--; + } + for (i = 0; i < WOLFSSL_OBJECT_INFO_SZ; i++, obj_info++) { + if (lnlen == XSTRLEN(obj_info->lName) && + XSTRNCMP(ln, obj_info->lName, lnlen) == 0) { + return obj_info->nid; } } } - #endif /* HAVE_ECC */ - return NID_undef; } diff --git a/tests/api.c b/tests/api.c index 1b1234b81..32b023b70 100644 --- a/tests/api.c +++ b/tests/api.c @@ -27953,18 +27953,39 @@ static void test_wolfSSL_EVP_PKEY_assign(void) static void test_wolfSSL_OBJ_ln(void) { - int i = 0, maxIdx = 7; - const int nid_set[] = {NID_commonName,NID_countryName,NID_localityName, - NID_stateOrProvinceName,NID_organizationName, - NID_organizationalUnitName,NID_emailAddress}; - const char* ln_set[] = {WOLFSSL_LN_COMMON_NAME,WOLFSSL_LN_COUNTRY_NAME, - WOLFSSL_LN_LOCALITY_NAME,WOLFSSL_LN_STATE_NAME, - WOLFSSL_LN_ORG_NAME,WOLFSSL_LN_ORGUNIT_NAME, - WOLFSSL_EMAIL_ADDR}; + const int nid_set[] = { + NID_commonName, + NID_serialNumber, + NID_countryName, + NID_localityName, + NID_stateOrProvinceName, + NID_organizationName, + NID_organizationalUnitName, + NID_domainComponent, + NID_businessCategory, + NID_jurisdictionCountryName, + NID_jurisdictionStateOrProvinceName, + NID_emailAddress + }; + const char* ln_set[] = { + "commonName", + "serialNumber", + "countryName", + "localityName", + "stateOrProvinceName", + "organizationName", + "organizationalUnitName", + "domainComponent", + "businessCategory", + "jurisdictionCountryName", + "jurisdictionStateOrProvinceName", + "emailAddress", + }; + int i = 0, maxIdx = sizeof(ln_set)/sizeof(char*); printf(testingFmt, "wolfSSL_OBJ_ln"); - AssertIntEQ(OBJ_ln2nid(NULL), BAD_FUNC_ARG); + AssertIntEQ(OBJ_ln2nid(NULL), NID_undef); #ifdef HAVE_ECC { diff --git a/wolfcrypt/src/asn.c b/wolfcrypt/src/asn.c index a224f2ce6..ca0791096 100644 --- a/wolfcrypt/src/asn.c +++ b/wolfcrypt/src/asn.c @@ -5436,45 +5436,25 @@ WOLFSSL_API int EccEnumToNID(int n) #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) int wc_OBJ_sn2nid(const char *sn) { - const struct { - const char *sn; - int nid; - } sn2nid[] = { - {WOLFSSL_COMMON_NAME, NID_commonName}, - {WOLFSSL_COUNTRY_NAME, NID_countryName}, - {WOLFSSL_LOCALITY_NAME, NID_localityName}, - {WOLFSSL_STATE_NAME, NID_stateOrProvinceName}, - {WOLFSSL_ORG_NAME, NID_organizationName}, - {WOLFSSL_ORGUNIT_NAME, NID_organizationalUnitName}, - {WOLFSSL_EMAIL_ADDR, NID_emailAddress}, - {NULL, -1}}; - - int i; - #ifdef HAVE_ECC - int eccEnum; - #endif - WOLFSSL_ENTER("OBJ_sn2nid"); - for(i=0; sn2nid[i].sn != NULL; i++) { - if(XSTRNCMP(sn, sn2nid[i].sn, XSTRLEN(sn2nid[i].sn)) == 0) { - return sn2nid[i].nid; + const WOLFSSL_ObjectInfo *obj_info = wolfssl_object_info; + size_t i, snlen; + WOLFSSL_ENTER("wolfSSL_OBJ_ln2nid"); + if (sn && (snlen = XSTRLEN(sn)) > 0) { + /* Accept input like "/CN=" */ + if (sn[0] == '/') { + sn++; + snlen--; + } + if (sn[snlen-1] == '=') { + snlen--; + } + for (i = 0; i < wolfssl_object_info_sz; i++, obj_info++) { + if (snlen == XSTRLEN(obj_info->sName) && + XSTRNCMP(sn, obj_info->sName, snlen) == 0) { + return obj_info->nid; + } } } - #ifdef HAVE_ECC - /* Nginx uses this OpenSSL string. */ - if (XSTRNCMP(sn, "prime256v1", 10) == 0) - sn = "SECP256R1"; - if (XSTRNCMP(sn, "secp384r1", 10) == 0) - sn = "SECP384R1"; - /* find based on name and return NID */ - for (i = 0; ecc_sets[i].size != 0; i++) { - if (XSTRNCMP(sn, ecc_sets[i].name, ECC_MAXNAME) == 0) { - eccEnum = ecc_sets[i].id; - /* Convert enum value in ecc_curve_id to OpenSSL NID */ - return EccEnumToNID(eccEnum); - } - } - #endif - return NID_undef; } #endif @@ -10109,10 +10089,11 @@ int wc_EncryptedInfoParse(EncryptedInfo* info, char** pBuffer, size_t bufSz) PEM_LINE_LEN)); } if ((newline != NULL) && (newline > finish)) { - info->ivSz = (word32)(newline - (finish + 1)); - if (info->ivSz >= IV_SZ) + finish++; + info->ivSz = (word32)(newline - finish); + if (info->ivSz > IV_SZ) return BUFFER_E; - if (XMEMCPY(info->iv, finish + 1, info->ivSz) == NULL) + if (XMEMCPY(info->iv, finish, info->ivSz) == NULL) return BUFFER_E; info->set = 1; } diff --git a/wolfcrypt/src/ecc.c b/wolfcrypt/src/ecc.c index 95d5953b1..68f077389 100644 --- a/wolfcrypt/src/ecc.c +++ b/wolfcrypt/src/ecc.c @@ -1141,6 +1141,7 @@ const ecc_set_type ecc_sets[] = { } }; #define ECC_SET_COUNT (sizeof(ecc_sets)/sizeof(ecc_set_type)) +const size_t ecc_sets_count = ECC_SET_COUNT - 1; #ifdef HAVE_OID_ENCODING diff --git a/wolfssl/wolfcrypt/asn.h b/wolfssl/wolfcrypt/asn.h index d4722efbe..6bdda029b 100644 --- a/wolfssl/wolfcrypt/asn.h +++ b/wolfssl/wolfcrypt/asn.h @@ -134,6 +134,18 @@ enum DN_Tags { ASN_DOMAIN_COMPONENT = 0x19 /* DC */ }; +#if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) +typedef struct WOLFSSL_ObjectInfo { + int nid; + int id; + word32 type; + const char* sName; + const char* lName; +} WOLFSSL_ObjectInfo; +extern const size_t wolfssl_object_info_sz; +extern const WOLFSSL_ObjectInfo wolfssl_object_info[]; +#endif /* defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) */ + /* DN Tag Strings */ #define WOLFSSL_COMMON_NAME "/CN=" #define WOLFSSL_LN_COMMON_NAME "/commonName=" @@ -217,7 +229,10 @@ enum NID_stateOrProvinceName = 0x08, /* ST */ NID_organizationName = 0x0a, /* O */ NID_organizationalUnitName = 0x0b, /* OU */ - NID_domainComponent = 0x19, /* matches ASN_DOMAIN_COMPONENT in asn.h */ + NID_jurisdictionCountryName = 0xc, + NID_jurisdictionStateOrProvinceName = 0xd, + NID_businessCategory = ASN_BUS_CAT, + NID_domainComponent = ASN_DOMAIN_COMPONENT, NID_emailAddress = 0x30, /* emailAddress */ NID_id_on_dnsSRV = 82, /* 1.3.6.1.5.5.7.8.7 */ NID_ms_upn = 265, /* 1.3.6.1.4.1.311.20.2.3 */ diff --git a/wolfssl/wolfcrypt/ecc.h b/wolfssl/wolfcrypt/ecc.h index 2fe32c26e..b606f577a 100644 --- a/wolfssl/wolfcrypt/ecc.h +++ b/wolfssl/wolfcrypt/ecc.h @@ -422,6 +422,7 @@ WOLFSSL_ABI WOLFSSL_API void wc_ecc_key_free(ecc_key*); /* ECC predefined curve sets */ extern const ecc_set_type ecc_sets[]; +extern const size_t ecc_sets_count; WOLFSSL_API const char* wc_ecc_get_name(int curve_id); From 18093a6b0b607388f095401c4121070b6692a471 Mon Sep 17 00:00:00 2001 From: Juliusz Sosinowicz Date: Thu, 26 Mar 2020 16:57:57 +0100 Subject: [PATCH 008/298] Code review changes - Don't include `ENABLED_OPENSSLALL` with `ENABLED_WPAS` - Return length in `wolfSSL_i2d_DHparams` - Implement `wolfSSL_EC_POINT_mul` with independent multiplication and addition if `ECC_SHAMIR` not defined - Implment `ASN1_SIMPLE` without `offsetof` by using a dummy struct - Style fixes --- configure.ac | 2 +- src/internal.c | 2 +- src/ssl.c | 261 ++++++++++++++++++++++++----------------- tests/api.c | 10 +- wolfcrypt/src/ecc.c | 5 +- wolfssl/openssl/asn1.h | 7 +- wolfssl/openssl/evp.h | 5 + 7 files changed, 172 insertions(+), 120 deletions(-) diff --git a/configure.ac b/configure.ac index 54e17e850..1b6601063 100644 --- a/configure.ac +++ b/configure.ac @@ -565,7 +565,7 @@ AC_ARG_ENABLE([opensslall], [ ENABLED_OPENSSLALL=$enableval ], [ ENABLED_OPENSSLALL=no ] ) -if test "$ENABLED_LIBWEBSOCKETS" = "yes" || test "$ENABLED_OPENVPN" = "yes" || test "$ENABLED_WPAS" = "yes" +if test "$ENABLED_LIBWEBSOCKETS" = "yes" || test "$ENABLED_OPENVPN" = "yes" then ENABLED_OPENSSLALL="yes" fi diff --git a/src/internal.c b/src/internal.c index fe37c5e72..74c8f2bdf 100644 --- a/src/internal.c +++ b/src/internal.c @@ -9530,7 +9530,7 @@ int CopyDecodedToX509(WOLFSSL_X509* x509, DecodedCert* dCert) else ret = MEMORY_E; #if defined(OPENSSL_ALL) - if (!ret) { + if (ret == 0) { x509->key.pubKeyOID = dCert->keyOID; if (!x509->key.algor) { diff --git a/src/ssl.c b/src/ssl.c index a31c24568..bdf40a404 100755 --- a/src/ssl.c +++ b/src/ssl.c @@ -21728,7 +21728,7 @@ int wolfSSL_i2d_DHparams(const WOLFSSL_DH *dh, unsigned char **out) (mp_int*)dh->g->internal); if (ret != MP_OKAY) { WOLFSSL_MSG("StoreDHparams error"); - len = WOLFSSL_FAILURE; + len = 0; } else{ *out += len; @@ -30624,13 +30624,8 @@ int wolfSSL_cmp_peer_cert_to_file(WOLFSSL* ssl, const char *fname) #endif #endif /* OPENSSL_EXTRA */ #endif /* !WOLFCRYPT_ONLY */ -#if defined(OPENSSL_EXTRA) || \ - (defined(OPENSSL_EXTRA_X509_SMALL) && !defined(NO_RSA)) -static WC_RNG globalRNG; -static int initGlobalRNG = 0; -#endif #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) - const WOLFSSL_ObjectInfo wolfssl_object_info[] = { +const WOLFSSL_ObjectInfo wolfssl_object_info[] = { #ifndef NO_CERTS /* oidCertExtType */ { NID_basic_constraints, BASIC_CA_OID, oidCertExtType, "basicConstraints", @@ -30784,16 +30779,23 @@ static int initGlobalRNG = 0; /* oidKeyType */ #ifndef NO_DSA { DSAk, DSAk, oidKeyType, "DSA", "dsaEncryption"}, + { NID_dsa, DSAk, oidKeyType, "DSA", "dsaEncryption"}, #endif /* NO_DSA */ #ifndef NO_RSA { RSAk, RSAk, oidKeyType, "RSA", "rsaEncryption"}, + { NID_rsaEncryption, RSAk, oidKeyType, "RSA", "rsaEncryption"}, #endif /* NO_RSA */ #ifdef HAVE_NTRU { NTRUk, NTRUk, oidKeyType, "NTRU", "ntruEncryption"}, #endif /* HAVE_NTRU */ #ifdef HAVE_ECC { ECDSAk, ECDSAk, oidKeyType, "ECDSA", "ecdsaEncryption"}, + { NID_X9_62_id_ecPublicKey, ECDSAk, oidKeyType, "id-ecPublicKey", + "id-ecPublicKey"}, #endif /* HAVE_ECC */ + #ifndef NO_DH + { NID_dhKeyAgreement, DHk, oidKeyType, "dhKeyAgreement", "dhKeyAgreement"}, + #endif /* oidCurveType */ #ifdef HAVE_ECC @@ -30924,11 +30926,16 @@ static int initGlobalRNG = 0; WOLFSSL_SN_TLS_FEATURE, WOLFSSL_LN_TLS_FEATURE }, #endif #endif /* OPENSSL_EXTRA */ - }; +}; - #define WOLFSSL_OBJECT_INFO_SZ \ - (sizeof(wolfssl_object_info) / sizeof(*wolfssl_object_info)) - const size_t wolfssl_object_info_sz = WOLFSSL_OBJECT_INFO_SZ; +#define WOLFSSL_OBJECT_INFO_SZ \ + (sizeof(wolfssl_object_info) / sizeof(*wolfssl_object_info)) +const size_t wolfssl_object_info_sz = WOLFSSL_OBJECT_INFO_SZ; +#endif +#if defined(OPENSSL_EXTRA) || \ + (defined(OPENSSL_EXTRA_X509_SMALL) && !defined(NO_RSA)) +static WC_RNG globalRNG; +static int initGlobalRNG = 0; #endif #if defined(OPENSSL_EXTRA) && \ !defined(NO_RSA) && !defined(HAVE_USER_RSA) && !defined(HAVE_FAST_RSA) @@ -31467,28 +31474,28 @@ void *wolfSSL_ASN1_item_new(const WOLFSSL_ASN1_ITEM *template) XMEMSET(ret, 0, template->size); for (member = template->members, i = 0; i < template->mcount; member++, i++) { - switch(member->type) { - case WOLFSSL_X509_ALGOR_ASN1: - { - WOLFSSL_X509_ALGOR* algor = wolfSSL_X509_ALGOR_new(); - if (!algor) { - goto error; + switch (member->type) { + case WOLFSSL_X509_ALGOR_ASN1: + { + WOLFSSL_X509_ALGOR* algor = wolfSSL_X509_ALGOR_new(); + if (!algor) { + goto error; + } + *(WOLFSSL_X509_ALGOR**)(((byte*)ret) + member->offset) = algor; + break; } - *(WOLFSSL_X509_ALGOR**)(((byte*)ret) + member->offset) = algor; - break; - } - case WOLFSSL_ASN1_BIT_STRING_ASN1: - { - WOLFSSL_ASN1_BIT_STRING* bit_str = wolfSSL_ASN1_BIT_STRING_new(); - if (!bit_str) { - goto error; + case WOLFSSL_ASN1_BIT_STRING_ASN1: + { + WOLFSSL_ASN1_BIT_STRING* bit_str = wolfSSL_ASN1_BIT_STRING_new(); + if (!bit_str) { + goto error; + } + *(WOLFSSL_ASN1_BIT_STRING**)(((byte*)ret) + member->offset) = bit_str; + break; } - *(WOLFSSL_ASN1_BIT_STRING**)(((byte*)ret) + member->offset) = bit_str; - break; - } - default: - WOLFSSL_MSG("Type not supported in wolfSSL_ASN1_item_new"); - goto error; + default: + WOLFSSL_MSG("Type not supported in wolfSSL_ASN1_item_new"); + goto error; } } return ret; @@ -31505,27 +31512,27 @@ void wolfSSL_ASN1_item_free(void *val, const WOLFSSL_ASN1_ITEM *template) if (val) { for (member = template->members, i = 0; i < template->mcount; member++, i++) { - switch(member->type) { - case WOLFSSL_X509_ALGOR_ASN1: - { - WOLFSSL_X509_ALGOR* algor = *(WOLFSSL_X509_ALGOR**) - (((byte*)val) + member->offset); - if (algor) { - wolfSSL_X509_ALGOR_free(algor); + switch (member->type) { + case WOLFSSL_X509_ALGOR_ASN1: + { + WOLFSSL_X509_ALGOR* algor = *(WOLFSSL_X509_ALGOR**) + (((byte*)val) + member->offset); + if (algor) { + wolfSSL_X509_ALGOR_free(algor); + } + break; } - break; - } - case WOLFSSL_ASN1_BIT_STRING_ASN1: - { - WOLFSSL_ASN1_BIT_STRING* bit_str = *(WOLFSSL_ASN1_BIT_STRING**) - (((byte*)val) + member->offset); - if (bit_str) { - wolfSSL_ASN1_BIT_STRING_free(bit_str); + case WOLFSSL_ASN1_BIT_STRING_ASN1: + { + WOLFSSL_ASN1_BIT_STRING* bit_str = *(WOLFSSL_ASN1_BIT_STRING**) + (((byte*)val) + member->offset); + if (bit_str) { + wolfSSL_ASN1_BIT_STRING_free(bit_str); + } + break; } - break; - } - default: - WOLFSSL_MSG("Type not supported in wolfSSL_ASN1_item_free"); + default: + WOLFSSL_MSG("Type not supported in wolfSSL_ASN1_item_free"); } } XFREE(val, NULL, DYNAMIC_TYPE_OPENSSL); @@ -31542,48 +31549,48 @@ static int i2dProcessMembers(const void *src, byte *buf, size_t i; WOLFSSL_ENTER("processMembers"); for (member = members, i = 0; i < mcount; member++, i++) { - switch(member->type) { - case WOLFSSL_X509_ALGOR_ASN1: - { - word32 oid = 0; - word32 idx = 0; - const WOLFSSL_X509_ALGOR* algor = *(const WOLFSSL_X509_ALGOR**) - (((byte*)src) + member->offset); - if (!algor->algorithm) { + switch (member->type) { + case WOLFSSL_X509_ALGOR_ASN1: + { + word32 oid = 0; + word32 idx = 0; + const WOLFSSL_X509_ALGOR* algor = *(const WOLFSSL_X509_ALGOR**) + (((byte*)src) + member->offset); + if (!algor->algorithm) { + WOLFSSL_LEAVE("processMembers", WOLFSSL_FAILURE); + return WOLFSSL_FAILURE; + } + + if (GetObjectId(algor->algorithm->obj, &idx, &oid, + algor->algorithm->grp, algor->algorithm->objSz) < 0) { + WOLFSSL_MSG("Issue getting OID of object"); + return -1; + } + + ret = SetAlgoID(oid, bufLenOrNull(buf, len), + algor->algorithm->grp, 0); + if (!ret) { + return WOLFSSL_FAILURE; + } + len += ret; + break; + } + case WOLFSSL_ASN1_BIT_STRING_ASN1: + { + const WOLFSSL_ASN1_BIT_STRING* bit_str; + bit_str = *(const WOLFSSL_ASN1_BIT_STRING**) + (((byte*)src) + member->offset); + len += SetBitString(bit_str->length, 0, bufLenOrNull(buf, len)); + if (buf && bit_str->data) { + XMEMCPY(buf + len, bit_str->data, bit_str->length); + } + len += bit_str->length; + break; + } + default: + WOLFSSL_MSG("Type not support in processMembers"); WOLFSSL_LEAVE("processMembers", WOLFSSL_FAILURE); return WOLFSSL_FAILURE; - } - - if (GetObjectId(algor->algorithm->obj, &idx, &oid, - algor->algorithm->grp, algor->algorithm->objSz) < 0) { - WOLFSSL_MSG("Issue getting OID of object"); - return -1; - } - - ret = SetAlgoID(oid, bufLenOrNull(buf, len), - algor->algorithm->grp, 0); - if (!ret) { - return WOLFSSL_FAILURE; - } - len += ret; - break; - } - case WOLFSSL_ASN1_BIT_STRING_ASN1: - { - const WOLFSSL_ASN1_BIT_STRING* bit_str; - bit_str = *(const WOLFSSL_ASN1_BIT_STRING**) - (((byte*)src) + member->offset); - len += SetBitString(bit_str->length, 0, bufLenOrNull(buf, len)); - if (buf && bit_str->data) { - XMEMCPY(buf + len, bit_str->data, bit_str->length); - } - len += bit_str->length; - break; - } - default: - WOLFSSL_MSG("Type not support in processMembers"); - WOLFSSL_LEAVE("processMembers", WOLFSSL_FAILURE); - return WOLFSSL_FAILURE; } } WOLFSSL_LEAVE("processMembers", len); @@ -31616,26 +31623,26 @@ int wolfSSL_ASN1_item_i2d(const void *src, byte **dest, } switch (template->type) { - case ASN_SEQUENCE: - { - int seq_len = i2dProcessMembers(src, NULL, template->members, - template->mcount); - if (!seq_len) { - goto error; + case ASN_SEQUENCE: + { + int seq_len = i2dProcessMembers(src, NULL, template->members, + template->mcount); + if (!seq_len) { + goto error; + } + len += SetSequence(seq_len, bufLenOrNull(buf, len)); + if (buf && + i2dProcessMembers(src, bufLenOrNull(buf, len), template->members, + template->mcount) != seq_len) { + WOLFSSL_MSG("Inconsistent sequence length"); + goto error; + } + len += seq_len; + break; } - len += SetSequence(seq_len, bufLenOrNull(buf, len)); - if (buf && - i2dProcessMembers(src, bufLenOrNull(buf, len), template->members, - template->mcount) != seq_len) { - WOLFSSL_MSG("Inconsistent sequence length"); + default: + WOLFSSL_MSG("Type not supported in wolfSSL_ASN1_item_i2d"); goto error; - } - len += seq_len; - break; - } - default: - WOLFSSL_MSG("Type not supported in wolfSSL_ASN1_item_i2d"); - goto error; } if (dest && !*dest) { @@ -36950,7 +36957,7 @@ int wolfSSL_EC_POINT_set_affine_coordinates_GFp(const WOLFSSL_EC_GROUP *group, return WOLFSSL_SUCCESS; } -#if !defined(WOLFSSL_ATECC508A) && defined(ECC_SHAMIR) && !defined(HAVE_SELFTEST) +#if !defined(WOLFSSL_ATECC508A) && !defined(HAVE_SELFTEST) /* Calculate the value: generator * n + q * m * return code compliant with OpenSSL : * 1 if success, 0 if error @@ -36962,6 +36969,7 @@ int wolfSSL_EC_POINT_mul(const WOLFSSL_EC_GROUP *group, WOLFSSL_EC_POINT *r, mp_int a, prime; int ret = WOLFSSL_FAILURE; ecc_point* result = NULL; + ecc_point* tmp = NULL; (void)ctx; @@ -37011,6 +37019,7 @@ int wolfSSL_EC_POINT_mul(const WOLFSSL_EC_GROUP *group, WOLFSSL_EC_POINT *r, if (n && q && m) { /* r = generator * n + q * m */ +#ifdef ECC_SHAMIR if (ecc_mul2add(result, (mp_int*)n->internal, (ecc_point*)q->internal, (mp_int*)m->internal, result, &a, &prime, NULL) @@ -37018,6 +37027,39 @@ int wolfSSL_EC_POINT_mul(const WOLFSSL_EC_GROUP *group, WOLFSSL_EC_POINT *r, WOLFSSL_MSG("ecc_mul2add error"); goto cleanup; } +#else + mp_digit mp = 0; + if (mp_montgomery_setup(&prime, &mp) != MP_OKAY) { + WOLFSSL_MSG("mp_montgomery_setup nqm error"); + goto cleanup; + } + if (!(tmp = wc_ecc_new_point())) { + WOLFSSL_MSG("wolfSSL_EC_POINT_new nqm error"); + goto cleanup; + } + /* r = generator * n */ + if (wc_ecc_mulmod((mp_int*)n->internal, result, result, &a, &prime, 1) + != MP_OKAY) { + WOLFSSL_MSG("wc_ecc_mulmod nqm error"); + goto cleanup; + } + /* tmp = q * m */ + if (wc_ecc_mulmod((mp_int*)m->internal, (ecc_point*)q->internal, + tmp, &a, &prime, 1) != MP_OKAY) { + WOLFSSL_MSG("wc_ecc_mulmod nqm error"); + goto cleanup; + } + /* result = result + tmp */ + if (ecc_projective_add_point(tmp, result, result, &a, &prime, mp) + != MP_OKAY) { + WOLFSSL_MSG("wc_ecc_mulmod nqm error"); + goto cleanup; + } + if (ecc_map(result, &prime, mp) != MP_OKAY) { + WOLFSSL_MSG("ecc_map nqm error"); + goto cleanup; + } +#endif } else if (n) { /* r = generator * n */ @@ -37052,6 +37094,7 @@ cleanup: mp_clear(&a); mp_clear(&prime); wc_ecc_del_point(result); + wc_ecc_del_point(tmp); return ret; } #endif /* !defined(WOLFSSL_ATECC508A) && defined(ECC_SHAMIR) && diff --git a/tests/api.c b/tests/api.c index 32b023b70..3931965ce 100644 --- a/tests/api.c +++ b/tests/api.c @@ -1852,7 +1852,9 @@ static void test_wolfSSL_EC(void) #ifndef HAVE_SELFTEST /* perform point multiplication */ + AssertIntEQ(EC_POINT_mul(group, new_point, Gx, Gxy, k, ctx), WOLFSSL_SUCCESS); AssertIntEQ(EC_POINT_mul(group, new_point, NULL, Gxy, k, ctx), WOLFSSL_SUCCESS); + AssertIntEQ(EC_POINT_mul(group, new_point, Gx, NULL, NULL, ctx), WOLFSSL_SUCCESS); #else AssertIntEQ(EC_POINT_set_affine_coordinates_GFp(group, new_point, Gx, Gy, ctx), WOLFSSL_SUCCESS); #endif @@ -16056,7 +16058,7 @@ static int test_wc_ecc_get_generator(void) { int ret = 0; #if defined(HAVE_ECC) && !defined(WC_NO_RNG) && !defined(HAVE_SELFTEST) && \ - !defined(HAVE_FIPS) + !defined(HAVE_FIPS) && defined(OPENSSL_EXTRA) ecc_point* pt; printf(testingFmt, "wc_ecc_new_point()"); @@ -31008,7 +31010,7 @@ static void test_wolfSSL_ASN1_INTEGER_set() } /* Testing code used in dpp.c in hostap */ -#ifdef WOLFSSL_WPAS +#ifdef OPENSSL_ALL typedef struct { /* AlgorithmIdentifier ecPublicKey with optional parameters present * as an OID identifying the curve */ @@ -31028,7 +31030,7 @@ IMPLEMENT_ASN1_FUNCTIONS(DPP_BOOTSTRAPPING_KEY); static void test_wolfSSL_IMPLEMENT_ASN1_FUNCTIONS() { /* Testing code used in dpp.c in hostap */ -#if defined(WOLFSSL_WPAS) && defined(HAVE_ECC) && defined(USE_CERT_BUFFERS_256) +#if defined(OPENSSL_ALL) && defined(HAVE_ECC) && defined(USE_CERT_BUFFERS_256) EC_KEY *eckey; EVP_PKEY *key; size_t len; @@ -31058,7 +31060,7 @@ static void test_wolfSSL_IMPLEMENT_ASN1_FUNCTIONS() AssertIntEQ(EC_POINT_point2oct(group, point, POINT_CONVERSION_COMPRESSED, der, len, NULL), len); bootstrap->pub_key->data = der; - bootstrap->pub_key->length = len; + bootstrap->pub_key->length = (int)len; /* Not actually used */ bootstrap->pub_key->flags &= ~(ASN1_STRING_FLAG_BITS_LEFT | 0x07); bootstrap->pub_key->flags |= ASN1_STRING_FLAG_BITS_LEFT; diff --git a/wolfcrypt/src/ecc.c b/wolfcrypt/src/ecc.c index 68f077389..92578c316 100644 --- a/wolfcrypt/src/ecc.c +++ b/wolfcrypt/src/ecc.c @@ -6526,6 +6526,7 @@ done: /* export point to der */ +#ifdef HAVE_COMP_KEY int wc_ecc_export_point_der_compressed(const int curve_idx, ecc_point* point, byte* out, word32* outLen) { @@ -6586,7 +6587,7 @@ done: return ret; } - +#endif /* HAVE_COMP_KEY */ /* export public ECC key in ANSI X9.63 format */ int wc_ecc_export_x963(ecc_key* key, byte* out, word32* outLen) @@ -6973,6 +6974,7 @@ static int ecc_check_pubkey_order(ecc_key* key, ecc_point* pubkey, mp_int* a, #endif #endif /* !WOLFSSL_ATECC508A && !WOLFSSL_CRYPTOCELL*/ +#ifdef OPENSSL_EXTRA int wc_ecc_get_generator(ecc_point* ecp, int curve_idx) { int err = MP_OKAY; @@ -6997,6 +6999,7 @@ int wc_ecc_get_generator(ecc_point* ecp, int curve_idx) return err; } +#endif /* OPENSSLALL */ /* perform sanity checks on ecc key validity, 0 on success */ int wc_ecc_check_key(ecc_key* key) diff --git a/wolfssl/openssl/asn1.h b/wolfssl/openssl/asn1.h index d09aa2070..883340674 100644 --- a/wolfssl/openssl/asn1.h +++ b/wolfssl/openssl/asn1.h @@ -24,9 +24,6 @@ #ifndef WOLFSSL_ASN1_H_ #define WOLFSSL_ASN1_H_ -#ifdef WOLFSSL_WPAS -#include /* for offsetof */ -#endif /* WOLFSSL_WPAS */ #include #define ASN1_STRING_new wolfSSL_ASN1_STRING_new @@ -107,10 +104,12 @@ typedef enum { } WOLFSSL_ASN1_TYPES; #define ASN1_SEQUENCE(type) \ + static const type __##type##_dummy_struct;\ static const WOLFSSL_ASN1_TEMPLATE type##_member_data[] #define ASN1_SIMPLE(type, member, member_type) \ - { offsetof(type, member), WOLFSSL_##member_type##_ASN1 } + { (char*)&__##type##_dummy_struct.member - (char*)&__##type##_dummy_struct, \ + WOLFSSL_##member_type##_ASN1 } #define ASN1_SEQUENCE_END(type) \ ; \ diff --git a/wolfssl/openssl/evp.h b/wolfssl/openssl/evp.h index 941b0639e..ee4f81a4f 100644 --- a/wolfssl/openssl/evp.h +++ b/wolfssl/openssl/evp.h @@ -318,6 +318,11 @@ enum { NID_aes_256_xts = 914 }; +#define NID_X9_62_id_ecPublicKey EVP_PKEY_EC +#define NID_dhKeyAgreement EVP_PKEY_DH +#define NID_rsaEncryption EVP_PKEY_RSA +#define NID_dsa EVP_PKEY_DSA + #define WOLFSSL_EVP_BUF_SIZE 16 struct WOLFSSL_EVP_CIPHER_CTX { int keyLen; /* user may set for variable */ From dbe4e778d3f28df40057071906dbecf4c427904a Mon Sep 17 00:00:00 2001 From: Juliusz Sosinowicz Date: Fri, 27 Mar 2020 12:52:10 +0100 Subject: [PATCH 009/298] Test fixes - Add `parameter` to `WOLFSSL_X509_ALGOR` - Implement `wolfSSL_ASN1_TYPE_new`, `wolfSSL_ASN1_TYPE_free`, and `wolfSSL_ASN1_TYPE_set` - Fix leak where `pval` in `wolfSSL_X509_ALGOR_set0` was lost if `aobj` was provided --- src/ssl.c | 284 +++++++++++++++++++++++++---------------- tests/api.c | 21 +-- wolfssl/openssl/asn1.h | 8 +- wolfssl/ssl.h | 4 + 4 files changed, 194 insertions(+), 123 deletions(-) diff --git a/src/ssl.c b/src/ssl.c index bdf40a404..98db464a4 100755 --- a/src/ssl.c +++ b/src/ssl.c @@ -26906,102 +26906,6 @@ char* wolfSSL_ASN1_TIME_to_string(WOLFSSL_ASN1_TIME* t, char* buf, int len) #ifdef OPENSSL_EXTRA -#if !defined(NO_ASN_TIME) && !defined(USER_TIME) && !defined(TIME_OVERRIDES) - -#if defined(WOLFSSL_QT) || defined(OPENSSL_ALL) && !defined(NO_WOLFSSL_STUB) -void wolfSSL_ASN1_TIME_free(WOLFSSL_ASN1_TIME* t) -{ - (void) t; - WOLFSSL_STUB("wolfSSL_ASN1_TIME_free"); - return; -} -#endif /* NO_WOLFSSL_STUB && WOLFSSL_QT || OPENSSL_ALL */ - -WOLFSSL_ASN1_TIME* wolfSSL_ASN1_TIME_adj(WOLFSSL_ASN1_TIME *s, time_t t, - int offset_day, long offset_sec) -{ - const time_t sec_per_day = 24*60*60; - struct tm* ts = NULL; - struct tm* tmpTime; - time_t t_adj = 0; - time_t offset_day_sec = 0; -#if defined(NEED_TMP_TIME) - struct tm tmpTimeStorage; - - tmpTime = &tmpTimeStorage; -#else - tmpTime = NULL; -#endif - (void)tmpTime; - - WOLFSSL_ENTER("wolfSSL_ASN1_TIME_adj"); - - if (s == NULL){ - s = (WOLFSSL_ASN1_TIME*)XMALLOC(sizeof(WOLFSSL_ASN1_TIME), NULL, - DYNAMIC_TYPE_OPENSSL); - if (s == NULL){ - return NULL; - } - XMEMSET(s, 0, sizeof(WOLFSSL_ASN1_TIME)); - } - - /* compute GMT time with offset */ - offset_day_sec = offset_day * sec_per_day; - t_adj = t + offset_day_sec + offset_sec; - ts = (struct tm *)XGMTIME(&t_adj, tmpTime); - if (ts == NULL){ - WOLFSSL_MSG("failed to get time data."); - XFREE(s, NULL, DYNAMIC_TYPE_OPENSSL); - return NULL; - } - - /* create ASN1 time notation */ - /* UTC Time */ - if (ts->tm_year >= 50 && ts->tm_year < 150){ - char utc_str[ASN_UTC_TIME_SIZE]; - int utc_year = 0,utc_mon,utc_day,utc_hour,utc_min,utc_sec; - - s->type = V_ASN1_UTCTIME; - s->length = ASN_UTC_TIME_SIZE; - - if (ts->tm_year >= 50 && ts->tm_year < 100){ - utc_year = ts->tm_year; - } else if (ts->tm_year >= 100 && ts->tm_year < 150){ - utc_year = ts->tm_year - 100; - } - utc_mon = ts->tm_mon + 1; - utc_day = ts->tm_mday; - utc_hour = ts->tm_hour; - utc_min = ts->tm_min; - utc_sec = ts->tm_sec; - XSNPRINTF((char *)utc_str, sizeof(utc_str), - "%02d%02d%02d%02d%02d%02dZ", - utc_year, utc_mon, utc_day, utc_hour, utc_min, utc_sec); - XMEMCPY(s->data, (byte *)utc_str, s->length); - /* GeneralizedTime */ - } else { - char gt_str[ASN_GENERALIZED_TIME_MAX]; - int gt_year,gt_mon,gt_day,gt_hour,gt_min,gt_sec; - - s->type = V_ASN1_GENERALIZEDTIME; - s->length = ASN_GENERALIZED_TIME_SIZE; - - gt_year = ts->tm_year + 1900; - gt_mon = ts->tm_mon + 1; - gt_day = ts->tm_mday; - gt_hour = ts->tm_hour; - gt_min = ts->tm_min; - gt_sec = ts->tm_sec; - XSNPRINTF((char *)gt_str, sizeof(gt_str), - "%4d%02d%02d%02d%02d%02dZ", - gt_year, gt_mon, gt_day, gt_hour, gt_min,gt_sec); - XMEMCPY(s->data, (byte *)gt_str, s->length); - } - - return s; -} -#endif /* !NO_ASN_TIME && !USER_TIME && !TIME_OVERRIDES */ - #ifndef NO_WOLFSSL_STUB int wolfSSL_ASN1_INTEGER_cmp(const WOLFSSL_ASN1_INTEGER* a, const WOLFSSL_ASN1_INTEGER* b) @@ -28230,9 +28134,8 @@ WOLFSSL_X509_ALGOR* wolfSSL_X509_ALGOR_new(void) void wolfSSL_X509_ALGOR_free(WOLFSSL_X509_ALGOR *alg) { if (alg) { - if (alg->algorithm) { - wolfSSL_ASN1_OBJECT_free(alg->algorithm); - } + wolfSSL_ASN1_OBJECT_free(alg->algorithm); + wolfSSL_ASN1_TYPE_free(alg->parameter); XFREE(alg, NULL, DYNAMIC_TYPE_OPENSSL); } } @@ -28265,8 +28168,15 @@ void wolfSSL_X509_ALGOR_get0(const WOLFSSL_ASN1_OBJECT **paobj, int *pptype, *paobj = algor->algorithm; if (ppval) *ppval = algor->algorithm; - if (pptype) - *pptype = V_ASN1_OBJECT; + if (pptype) { + if (algor->parameter) { + *pptype = algor->parameter->type; + } + else { + /* Default to V_ASN1_OBJECT */ + *pptype = V_ASN1_OBJECT; + } + } } int wolfSSL_X509_ALGOR_set0(WOLFSSL_X509_ALGOR *algor, WOLFSSL_ASN1_OBJECT *aobj, @@ -28275,19 +28185,74 @@ int wolfSSL_X509_ALGOR_set0(WOLFSSL_X509_ALGOR *algor, WOLFSSL_ASN1_OBJECT *aobj if (!algor) { return WOLFSSL_FAILURE; } - if (ptype != V_ASN1_OBJECT) { - WOLFSSL_MSG("Only V_ASN1_OBJECT ptype is supported"); - return WOLFSSL_FAILURE; - } if (aobj) { algor->algorithm = aobj; } - else if (pval) { - algor->algorithm = pval; + if (pval) { + if (!algor->parameter) { + algor->parameter = wolfSSL_ASN1_TYPE_new(); + if (!algor->parameter) { + return WOLFSSL_FAILURE; + } + } + wolfSSL_ASN1_TYPE_set(algor->parameter, ptype, pval); } return WOLFSSL_SUCCESS; } +void wolfSSL_ASN1_TYPE_set(WOLFSSL_ASN1_TYPE *a, int type, void *value) +{ + if (!a || !value) { + return; + } + switch (type) { + case V_ASN1_OBJECT: + a->value.object = value; + break; + case V_ASN1_UTCTIME: + a->value.utctime = value; + break; + case V_ASN1_GENERALIZEDTIME: + a->value.generalizedtime = value; + break; + default: + WOLFSSL_MSG("Unknown or unsupported ASN1_TYPE"); + return; + } + a->type = type; +} + +WOLFSSL_ASN1_TYPE* wolfSSL_ASN1_TYPE_new(void) +{ + WOLFSSL_ASN1_TYPE* ret = (WOLFSSL_ASN1_TYPE*)XMALLOC(sizeof(WOLFSSL_ASN1_TYPE), + NULL, DYNAMIC_TYPE_OPENSSL); + if (!ret) + return NULL; + XMEMSET(ret, 0, sizeof(WOLFSSL_ASN1_TYPE)); + return ret; +} + +void wolfSSL_ASN1_TYPE_free(WOLFSSL_ASN1_TYPE* at) +{ + if (at) { + switch (at->type) { + case V_ASN1_OBJECT: + wolfSSL_ASN1_OBJECT_free(at->value.object); + break; + case V_ASN1_UTCTIME: + wolfSSL_ASN1_TIME_free(at->value.utctime); + break; + case V_ASN1_GENERALIZEDTIME: + wolfSSL_ASN1_TIME_free(at->value.generalizedtime); + break; + default: + WOLFSSL_MSG("Unknown or unsupported ASN1_TYPE"); + break; + } + XFREE(at, NULL, DYNAMIC_TYPE_OPENSSL); + } +} + WOLFSSL_X509_PUBKEY *wolfSSL_X509_PUBKEY_new(void) { WOLFSSL_X509_PUBKEY *ret; @@ -50249,7 +50214,106 @@ err_exit: return WOLFSSL_FAILURE; } +#if !defined(NO_ASN_TIME) && !defined(USER_TIME) && !defined(TIME_OVERRIDES) +WOLFSSL_ASN1_TIME* wolfSSL_ASN1_TIME_new(void) +{ + WOLFSSL_ASN1_TIME* ret = (WOLFSSL_ASN1_TIME*) + XMALLOC(sizeof(WOLFSSL_ASN1_TIME), NULL, DYNAMIC_TYPE_OPENSSL); + if (!ret) + return NULL; + XMEMSET(ret, 0, sizeof(WOLFSSL_ASN1_TIME)); + return ret; +} +void wolfSSL_ASN1_TIME_free(WOLFSSL_ASN1_TIME* t) +{ + if (t) { + XFREE(t, NULL, DYNAMIC_TYPE_OPENSSL); + } +} + +WOLFSSL_ASN1_TIME* wolfSSL_ASN1_TIME_adj(WOLFSSL_ASN1_TIME *s, time_t t, + int offset_day, long offset_sec) +{ + const time_t sec_per_day = 24*60*60; + struct tm* ts = NULL; + struct tm* tmpTime; + time_t t_adj = 0; + time_t offset_day_sec = 0; +#if defined(NEED_TMP_TIME) + struct tm tmpTimeStorage; + + tmpTime = &tmpTimeStorage; +#else + tmpTime = NULL; +#endif + (void)tmpTime; + + WOLFSSL_ENTER("wolfSSL_ASN1_TIME_adj"); + + if (s == NULL){ + s = wolfSSL_ASN1_TIME_new(); + if (s == NULL){ + return NULL; + } + } + + /* compute GMT time with offset */ + offset_day_sec = offset_day * sec_per_day; + t_adj = t + offset_day_sec + offset_sec; + ts = (struct tm *)XGMTIME(&t_adj, tmpTime); + if (ts == NULL){ + WOLFSSL_MSG("failed to get time data."); + XFREE(s, NULL, DYNAMIC_TYPE_OPENSSL); + return NULL; + } + + /* create ASN1 time notation */ + /* UTC Time */ + if (ts->tm_year >= 50 && ts->tm_year < 150){ + char utc_str[ASN_UTC_TIME_SIZE]; + int utc_year = 0,utc_mon,utc_day,utc_hour,utc_min,utc_sec; + + s->type = V_ASN1_UTCTIME; + s->length = ASN_UTC_TIME_SIZE; + + if (ts->tm_year >= 50 && ts->tm_year < 100){ + utc_year = ts->tm_year; + } else if (ts->tm_year >= 100 && ts->tm_year < 150){ + utc_year = ts->tm_year - 100; + } + utc_mon = ts->tm_mon + 1; + utc_day = ts->tm_mday; + utc_hour = ts->tm_hour; + utc_min = ts->tm_min; + utc_sec = ts->tm_sec; + XSNPRINTF((char *)utc_str, sizeof(utc_str), + "%02d%02d%02d%02d%02d%02dZ", + utc_year, utc_mon, utc_day, utc_hour, utc_min, utc_sec); + XMEMCPY(s->data, (byte *)utc_str, s->length); + /* GeneralizedTime */ + } else { + char gt_str[ASN_GENERALIZED_TIME_MAX]; + int gt_year,gt_mon,gt_day,gt_hour,gt_min,gt_sec; + + s->type = V_ASN1_GENERALIZEDTIME; + s->length = ASN_GENERALIZED_TIME_SIZE; + + gt_year = ts->tm_year + 1900; + gt_mon = ts->tm_mon + 1; + gt_day = ts->tm_mday; + gt_hour = ts->tm_hour; + gt_min = ts->tm_min; + gt_sec = ts->tm_sec; + XSNPRINTF((char *)gt_str, sizeof(gt_str), + "%4d%02d%02d%02d%02d%02dZ", + gt_year, gt_mon, gt_day, gt_hour, gt_min,gt_sec); + XMEMCPY(s->data, (byte *)gt_str, s->length); + } + + return s; +} +#endif /* !NO_ASN_TIME && !USER_TIME && !TIME_OVERRIDES */ #ifndef NO_ASN_TIME /* not a compatibility function - length getter for opaque type */ @@ -50284,14 +50348,10 @@ WOLFSSL_ASN1_TIME* wolfSSL_ASN1_TIME_to_generalizedtime(WOLFSSL_ASN1_TIME *t, WOLFSSL_MSG("Invalid ASN_TIME type."); } else { if (out == NULL || *out == NULL) { - ret = (WOLFSSL_ASN1_TIME*)XMALLOC(sizeof(WOLFSSL_ASN1_TIME), - NULL, DYNAMIC_TYPE_TMP_BUFFER); + ret = wolfSSL_ASN1_TIME_new(); if (ret == NULL){ WOLFSSL_MSG("memory alloc failed."); } - else { - XMEMSET(ret, 0, sizeof(WOLFSSL_ASN1_TIME)); - } } else { ret = *out; } diff --git a/tests/api.c b/tests/api.c index 3931965ce..b01debd2c 100644 --- a/tests/api.c +++ b/tests/api.c @@ -23496,8 +23496,7 @@ static void test_wolfSSL_ASN1_TIME_adj(void) printf(testingFmt, "wolfSSL_ASN1_TIME_adj()"); - s = (WOLFSSL_ASN1_TIME*)XMALLOC(sizeof(WOLFSSL_ASN1_TIME), NULL, - DYNAMIC_TYPE_OPENSSL); + s = wolfSSL_ASN1_TIME_new(); /* UTC notation test */ /* 2000/2/15 20:30:00 */ t = (time_t)30 * year + 45 * day + 20 * hour + 30 * mini + 7 * day; @@ -26638,11 +26637,9 @@ static void test_wolfSSL_ASN1_TIME_to_generalizedtime(void){ printf(testingFmt, "wolfSSL_ASN1_TIME_to_generalizedtime()"); /* UTC Time test */ - AssertNotNull(t = (WOLFSSL_ASN1_TIME*)XMALLOC(sizeof(WOLFSSL_ASN1_TIME), - NULL, DYNAMIC_TYPE_TMP_BUFFER)); + AssertNotNull(t = wolfSSL_ASN1_TIME_new()); XMEMSET(t->data, 0, ASN_GENERALIZED_TIME_SIZE); - AssertNotNull(out = (WOLFSSL_ASN1_TIME*)XMALLOC(sizeof(WOLFSSL_ASN1_TIME), - NULL, DYNAMIC_TYPE_TMP_BUFFER)); + AssertNotNull(out = wolfSSL_ASN1_TIME_new()); t->type = ASN_UTC_TIME; t->length = ASN_UTC_TIME_SIZE; XMEMCPY(t->data, "050727123456Z", ASN_UTC_TIME_SIZE); @@ -31052,13 +31049,21 @@ static void test_wolfSSL_IMPLEMENT_ASN1_FUNCTIONS() AssertIntEQ(X509_ALGOR_set0(bootstrap->alg, OBJ_nid2obj(EVP_PKEY_EC), V_ASN1_OBJECT, OBJ_nid2obj(nid)), 1); - +#ifdef HAVE_COMP_KEY AssertIntGT((len = EC_POINT_point2oct(group, point, POINT_CONVERSION_COMPRESSED, NULL, 0, NULL)), 0); - +#else + AssertIntGT((len = EC_POINT_point2oct(group, point, POINT_CONVERSION_UNCOMPRESSED, + NULL, 0, NULL)), 0); +#endif AssertNotNull(der = XMALLOC(len, NULL, DYNAMIC_TYPE_ASN1)); +#ifdef HAVE_COMP_KEY AssertIntEQ(EC_POINT_point2oct(group, point, POINT_CONVERSION_COMPRESSED, der, len, NULL), len); +#else + AssertIntEQ(EC_POINT_point2oct(group, point, POINT_CONVERSION_UNCOMPRESSED, + der, len, NULL), len); +#endif bootstrap->pub_key->data = der; bootstrap->pub_key->length = (int)len; /* Not actually used */ diff --git a/wolfssl/openssl/asn1.h b/wolfssl/openssl/asn1.h index 883340674..ba786ac8a 100644 --- a/wolfssl/openssl/asn1.h +++ b/wolfssl/openssl/asn1.h @@ -79,7 +79,8 @@ WOLFSSL_API WOLFSSL_ASN1_INTEGER *wolfSSL_BN_to_ASN1_INTEGER( const WOLFSSL_BIGNUM*, WOLFSSL_ASN1_INTEGER*); -#define BN_to_ASN1_INTEGER wolfSSL_BN_to_ASN1_INTEGER + +WOLFSSL_API void wolfSSL_ASN1_TYPE_set(WOLFSSL_ASN1_TYPE *a, int type, void *value); #ifdef OPENSSL_ALL /* IMPLEMENT_ASN1_FUNCTIONS stuff */ @@ -141,8 +142,9 @@ WOLFSSL_API int wolfSSL_ASN1_item_i2d(const void *src, byte **dest, return wolfSSL_ASN1_item_i2d(src, dest, &type##_template_data);\ } -WOLFSSL_API void *ASN1_item_new(const WOLFSSL_ASN1_ITEM *it); +#endif /* OPENSSL_ALL */ -#endif /* WOLFSSL_WPAS */ +#define BN_to_ASN1_INTEGER wolfSSL_BN_to_ASN1_INTEGER +#define ASN1_TYPE_set wolfSSL_ASN1_TYPE_set #endif /* WOLFSSL_ASN1_H_ */ diff --git a/wolfssl/ssl.h b/wolfssl/ssl.h index 54d9def31..3d5cc97fa 100644 --- a/wolfssl/ssl.h +++ b/wolfssl/ssl.h @@ -380,6 +380,7 @@ struct WOLFSSL_X509_INFO { struct WOLFSSL_X509_ALGOR { WOLFSSL_ASN1_OBJECT* algorithm; + WOLFSSL_ASN1_TYPE* parameter; }; struct WOLFSSL_X509_PUBKEY { @@ -1471,6 +1472,7 @@ WOLFSSL_API WOLFSSL_BIGNUM *wolfSSL_ASN1_INTEGER_to_BN(const WOLFSSL_ASN1_INTEGE WOLFSSL_BIGNUM *bn); WOLFSSL_API WOLFSSL_ASN1_TIME* wolfSSL_ASN1_TIME_adj(WOLFSSL_ASN1_TIME*, time_t, int, long); +WOLFSSL_API WOLFSSL_ASN1_TIME* wolfSSL_ASN1_TIME_new(void); WOLFSSL_API void wolfSSL_ASN1_TIME_free(WOLFSSL_ASN1_TIME* t); #endif @@ -3798,6 +3800,8 @@ WOLFSSL_API void wolfSSL_X509_ALGOR_free(WOLFSSL_X509_ALGOR *alg); WOLFSSL_API const WOLFSSL_X509_ALGOR* wolfSSL_X509_get0_tbs_sigalg(const WOLFSSL_X509 *x); WOLFSSL_API void wolfSSL_X509_ALGOR_get0(const WOLFSSL_ASN1_OBJECT **paobj, int *pptype, const void **ppval, const WOLFSSL_X509_ALGOR *algor); WOLFSSL_API int wolfSSL_X509_ALGOR_set0(WOLFSSL_X509_ALGOR *algor, WOLFSSL_ASN1_OBJECT *aobj, int ptype, void *pval); +WOLFSSL_API WOLFSSL_ASN1_TYPE* wolfSSL_ASN1_TYPE_new(void); +WOLFSSL_API void wolfSSL_ASN1_TYPE_free(WOLFSSL_ASN1_TYPE* at); WOLFSSL_API WOLFSSL_X509_PUBKEY *wolfSSL_X509_PUBKEY_new(void); WOLFSSL_API void wolfSSL_X509_PUBKEY_free(WOLFSSL_X509_PUBKEY *x); WOLFSSL_API WOLFSSL_X509_PUBKEY *wolfSSL_X509_get_X509_PUBKEY(const WOLFSSL_X509* x509); From 20e669a65a86d397c82556deb87e7296261d384b Mon Sep 17 00:00:00 2001 From: Juliusz Sosinowicz Date: Wed, 1 Apr 2020 18:16:24 +0200 Subject: [PATCH 010/298] New API Add `wc_ecc_import_point_der_ex` for correct importing DER ECC point and keep `wc_ecc_import_point_der` old functionality --- src/ssl.c | 21 ++++++++++++++++++--- wolfcrypt/src/ecc.c | 19 ++++++++++++++----- wolfcrypt/test/test.c | 28 ++++++++++++++++++++++++++-- wolfssl/wolfcrypt/ecc.h | 3 +++ 4 files changed, 61 insertions(+), 10 deletions(-) diff --git a/src/ssl.c b/src/ssl.c index 98db464a4..d05e6b6a8 100755 --- a/src/ssl.c +++ b/src/ssl.c @@ -36609,11 +36609,26 @@ int wolfSSL_ECPoint_d2i(unsigned char *in, unsigned int len, return WOLFSSL_FAILURE; } - if (wc_ecc_import_point_der(in, len, group->curve_idx, - (ecc_point*)p->internal) != MP_OKAY) { - WOLFSSL_MSG("wc_ecc_import_point_der failed"); +#ifndef HAVE_SELFTEST + if (wc_ecc_import_point_der_ex(in, len, group->curve_idx, + (ecc_point*)p->internal, 0) != MP_OKAY) { + WOLFSSL_MSG("wc_ecc_import_point_der_ex failed"); return WOLFSSL_FAILURE; } +#else + /* ECC_POINT_UNCOMP is not defined CAVP self test so use magic number */ + if (in[0] == 0x04) { + if (wc_ecc_import_point_der(in, len, group->curve_idx, + (ecc_point*)p->internal) != MP_OKAY) { + WOLFSSL_MSG("wc_ecc_import_point_der failed"); + return WOLFSSL_FAILURE; + } + } + else { + WOLFSSL_MSG("Only uncompressed points supported with HAVE_SELFTEST"); + return WOLFSSL_FAILURE; + } +#endif /* Set new external point */ if (SetECPointExternal(p) != WOLFSSL_SUCCESS) { diff --git a/wolfcrypt/src/ecc.c b/wolfcrypt/src/ecc.c index 92578c316..6b9957dc7 100644 --- a/wolfcrypt/src/ecc.c +++ b/wolfcrypt/src/ecc.c @@ -6284,9 +6284,10 @@ int wc_ecc_verify_hash_ex(mp_int *r, mp_int *s, const byte* hash, #endif /* HAVE_ECC_VERIFY */ #ifdef HAVE_ECC_KEY_IMPORT -/* import point from der */ -int wc_ecc_import_point_der(byte* in, word32 inLen, const int curve_idx, - ecc_point* point) +/* import point from der + * if shortKeySize != 0 then keysize is always (inLen-1)>>1 */ +int wc_ecc_import_point_der_ex(byte* in, word32 inLen, const int curve_idx, + ecc_point* point, char shortKeySize) { int err = 0; #ifdef HAVE_COMP_KEY @@ -6337,8 +6338,9 @@ int wc_ecc_import_point_der(byte* in, word32 inLen, const int curve_idx, inLen -= 1; in += 1; - /* calculate key size based on inLen / 2 if uncompressed */ - keysize = compressed ? inLen : inLen>>1; + /* calculate key size based on inLen / 2 if uncompressed or shortKeySize + * is true */ + keysize = compressed && !shortKeySize ? inLen : inLen>>1; /* read data */ if (err == MP_OKAY) @@ -6441,6 +6443,13 @@ int wc_ecc_import_point_der(byte* in, word32 inLen, const int curve_idx, return err; } + +/* function for backwards compatiblity with previous implementations */ +int wc_ecc_import_point_der(byte* in, word32 inLen, const int curve_idx, + ecc_point* point) +{ + return wc_ecc_import_point_der_ex(in, inLen, curve_idx, point, 1); +} #endif /* HAVE_ECC_KEY_IMPORT */ #ifdef HAVE_ECC_KEY_EXPORT diff --git a/wolfcrypt/test/test.c b/wolfcrypt/test/test.c index a09206356..da5e8a5f8 100644 --- a/wolfcrypt/test/test.c +++ b/wolfcrypt/test/test.c @@ -19106,17 +19106,41 @@ static int ecc_point_test(void) } #ifdef HAVE_COMP_KEY - ret = wc_ecc_import_point_der(derComp0, sizeof(derComp0), curve_idx, point3); + ret = wc_ecc_import_point_der(derComp0, sizeof(derComp0)*2-1, curve_idx, point3); if (ret != 0) { ret = -9726; goto done; } - ret = wc_ecc_import_point_der(derComp1, sizeof(derComp1), curve_idx, point4); + ret = wc_ecc_import_point_der_ex(derComp0, sizeof(derComp0), curve_idx, point4, 0); if (ret != 0) { ret = -9727; goto done; } + + ret = wc_ecc_cmp_point(point3, point4); + if (ret != MP_EQ) { + ret = -9728; + goto done; + } + + ret = wc_ecc_import_point_der(derComp1, sizeof(derComp1)*2-1, curve_idx, point3); + if (ret != 0) { + ret = -9729; + goto done; + } + + ret = wc_ecc_import_point_der_ex(derComp1, sizeof(derComp1), curve_idx, point4, 0); + if (ret != 0) { + ret = -9730; + goto done; + } + + ret = wc_ecc_cmp_point(point3, point4); + if (ret != MP_EQ) { + ret = -9731; + goto done; + } #endif done: diff --git a/wolfssl/wolfcrypt/ecc.h b/wolfssl/wolfcrypt/ecc.h index b606f577a..88e4460dc 100644 --- a/wolfssl/wolfcrypt/ecc.h +++ b/wolfssl/wolfcrypt/ecc.h @@ -649,6 +649,9 @@ int wc_ecc_export_point_der_compressed(const int curve_idx, ecc_point* point, #ifdef HAVE_ECC_KEY_IMPORT WOLFSSL_API +int wc_ecc_import_point_der_ex(byte* in, word32 inLen, const int curve_idx, + ecc_point* point, char shortKeySize); +WOLFSSL_API int wc_ecc_import_point_der(byte* in, word32 inLen, const int curve_idx, ecc_point* point); #endif /* HAVE_ECC_KEY_IMPORT */ From 89f7a51838b2898d41e49be2859d1c5d1538ec7a Mon Sep 17 00:00:00 2001 From: Juliusz Sosinowicz Date: Fri, 3 Apr 2020 13:32:49 +0200 Subject: [PATCH 011/298] Add option to enable DPP support in wpa_supplicant (note DPP not yet supported as of this commit) --- configure.ac | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 1b6601063..457601ae7 100644 --- a/configure.ac +++ b/configure.ac @@ -491,6 +491,18 @@ AC_ARG_ENABLE([wpas], [ ENABLED_WPAS=no ] ) +# wpa_supplicant support +AC_ARG_ENABLE([wpas-dpp], + [AS_HELP_STRING([--enable-wpas-dpp],[Enable wpa_supplicant support with dpp (default: disabled)])], + [ ENABLED_WPAS_DPP=$enableval ], + [ ENABLED_WPAS_DPP=no ] + ) + +if test "$ENABLED_WPAS_DPP" = "yes" +then + ENABLED_WPAS="yes" +fi + # Fortress build AC_ARG_ENABLE([fortress], [AS_HELP_STRING([--enable-fortress],[Enable SSL fortress build (default: disabled)])], @@ -565,7 +577,7 @@ AC_ARG_ENABLE([opensslall], [ ENABLED_OPENSSLALL=$enableval ], [ ENABLED_OPENSSLALL=no ] ) -if test "$ENABLED_LIBWEBSOCKETS" = "yes" || test "$ENABLED_OPENVPN" = "yes" +if test "$ENABLED_LIBWEBSOCKETS" = "yes" || test "$ENABLED_OPENVPN" = "yes" || test "$ENABLED_WPAS_DPP" = "yes" then ENABLED_OPENSSLALL="yes" fi From 0ded4d4ccbfd1fb005bbb3c969983af33569d800 Mon Sep 17 00:00:00 2001 From: Juliusz Sosinowicz Date: Mon, 6 Apr 2020 14:51:58 +0200 Subject: [PATCH 012/298] wolfSSL_RSA_*_PKCS1_PSS rewrite --- src/ssl.c | 131 +++++++++++++++++++++++------------------- wolfssl/openssl/rsa.h | 14 ++--- 2 files changed, 78 insertions(+), 67 deletions(-) diff --git a/src/ssl.c b/src/ssl.c index d05e6b6a8..7228d25b7 100755 --- a/src/ssl.c +++ b/src/ssl.c @@ -39054,7 +39054,7 @@ static int hash2mgf(enum wc_HashType hType) case WC_HASH_TYPE_BLAKE2B: case WC_HASH_TYPE_BLAKE2S: default: - WOLFSSL_MSG("Unrecognized hash function"); + WOLFSSL_MSG("Unrecognized or unsupported hash function"); return WC_MGF1NONE; } } @@ -39090,7 +39090,7 @@ int wolfSSL_RSA_padding_add_PKCS1_PSS(WOLFSSL_RSA *rsa, unsigned char *EM, const unsigned char *mHash, const WOLFSSL_EVP_MD *hashAlg, int saltLen) { - int hLen, emLen, mgf; + int hashLen, emLen, mgf; int ret = WOLFSSL_FAILURE; int initTmpRng = 0; WC_RNG *rng = NULL; @@ -39100,7 +39100,7 @@ int wolfSSL_RSA_padding_add_PKCS1_PSS(WOLFSSL_RSA *rsa, unsigned char *EM, WC_RNG _tmpRNG[1]; WC_RNG* tmpRNG = _tmpRNG; #endif - enum wc_HashType hType; + enum wc_HashType hashType; WOLFSSL_ENTER("wolfSSL_RSA_padding_add_PKCS1_PSS"); @@ -39108,46 +39108,54 @@ int wolfSSL_RSA_padding_add_PKCS1_PSS(WOLFSSL_RSA *rsa, unsigned char *EM, return WOLFSSL_FAILURE; } - rng = WOLFSSL_RSA_GetRNG(rsa, (WC_RNG**)&tmpRNG, &initTmpRng); + if (!(rng = WOLFSSL_RSA_GetRNG(rsa, (WC_RNG**)&tmpRNG, &initTmpRng))) { + WOLFSSL_MSG("WOLFSSL_RSA_GetRNG error"); + goto cleanup; + } if (!rsa->exSet && SetRsaExternal(rsa) != WOLFSSL_SUCCESS) { + WOLFSSL_MSG("SetRsaExternal error"); goto cleanup; } - hType = wolfSSL_EVP_MD_type(hashAlg); - if (hType < WC_HASH_TYPE_NONE || hType > WC_HASH_TYPE_MAX) { + hashType = wolfSSL_EVP_MD_type(hashAlg); + if (hashType < WC_HASH_TYPE_NONE || hashType > WC_HASH_TYPE_MAX) { + WOLFSSL_MSG("wolfSSL_EVP_MD_type error"); goto cleanup; } - mgf = hash2mgf(hType); + if ((mgf = hash2mgf(hashType)) == WC_MGF1NONE) { + WOLFSSL_MSG("hash2mgf error"); + goto cleanup; + } - hLen = wolfSSL_EVP_MD_size(hashAlg); - if (hLen < 0) { + if ((hashLen = wolfSSL_EVP_MD_size(hashAlg)) < 0) { + WOLFSSL_MSG("wolfSSL_EVP_MD_size error"); goto cleanup; } - /* - * Negative sLen has special meanings: - * -1 sLen == hLen - * -2 salt length is maximized - * -3 same as above (on signing) - * -N reserved - */ - if (saltLen == RSA_PSS_SALTLEN_DIGEST) { - saltLen = hLen; - } else if (saltLen == RSA_PSS_SALTLEN_MAX_SIGN) { - saltLen = RSA_PSS_SALTLEN_MAX; - } else if (saltLen < RSA_PSS_SALTLEN_MAX) { - WOLFSSL_MSG("invalid saltLen"); - goto cleanup; - } - emLen = wolfSSL_RSA_size(rsa); - if (emLen <= 0) { + + if ((emLen = wolfSSL_RSA_size(rsa)) <= 0) { WOLFSSL_MSG("wolfSSL_RSA_size error"); goto cleanup; } - if (saltLen == RSA_PSS_SALTLEN_MAX) { - saltLen = emLen - hLen - 2; + + switch (saltLen) { + /* Negative saltLen values are treated differently */ + case RSA_PSS_SALTLEN_DIGEST: + saltLen = hashLen; + break; + case RSA_PSS_SALTLEN_MAX_SIGN: + case RSA_PSS_SALTLEN_MAX: + saltLen = emLen - hashLen - 2; + break; + default: + if (saltLen < 0) { + /* Not any currently implemented negative value */ + WOLFSSL_MSG("invalid saltLen"); + goto cleanup; + } } + if (wc_RsaPad_ex(mHash, wolfSSL_EVP_MD_size(hashAlg), EM, emLen, RSA_BLOCK_TYPE_1, rng, WC_RSA_PSS_PAD, wolfSSL_EVP_MD_type(hashAlg), mgf, NULL, 0, saltLen, @@ -39176,8 +39184,8 @@ int wolfSSL_RSA_verify_PKCS1_PSS(WOLFSSL_RSA *rsa, const unsigned char *mHash, const WOLFSSL_EVP_MD *hashAlg, const unsigned char *EM, int saltLen) { - int hLen, mgf, nLen, mPrimeLen; - enum wc_HashType hType; + int hashLen, mgf, emLen, mPrimeLen; + enum wc_HashType hashType; byte *mPrime = NULL; byte *buf = NULL; @@ -39187,56 +39195,61 @@ int wolfSSL_RSA_verify_PKCS1_PSS(WOLFSSL_RSA *rsa, const unsigned char *mHash, return WOLFSSL_FAILURE; } - hLen = wolfSSL_EVP_MD_size(hashAlg); - if (hLen < 0) { + if ((hashLen = wolfSSL_EVP_MD_size(hashAlg)) < 0) { return WOLFSSL_FAILURE; } - /* - * Negative sLen has special meanings: - * -1 sLen == hLen - * -2 salt length is maximized - * -3 same as above (on signing) - * -N reserved - */ - if (saltLen == RSA_PSS_SALTLEN_DIGEST) { - saltLen = hLen; - } else if (saltLen == RSA_PSS_SALTLEN_MAX_SIGN) { - saltLen = RSA_PSS_SALTLEN_MAX; - } else if (saltLen < RSA_PSS_SALTLEN_MAX) { - WOLFSSL_MSG("invalid saltLen"); + + if ((emLen = wolfSSL_RSA_size(rsa)) <= 0) { + WOLFSSL_MSG("wolfSSL_RSA_size error"); return WOLFSSL_FAILURE; } + switch (saltLen) { + /* Negative saltLen values are treated differently */ + case RSA_PSS_SALTLEN_DIGEST: + saltLen = hashLen; + break; + case RSA_PSS_SALTLEN_MAX_SIGN: + case RSA_PSS_SALTLEN_MAX: + saltLen = emLen - hashLen - 2; + break; + default: + if (saltLen < 0) { + /* Not any currently implemented negative value */ + WOLFSSL_MSG("invalid saltLen"); + return WOLFSSL_FAILURE; + } + } + if (!rsa->exSet && SetRsaExternal(rsa) != WOLFSSL_SUCCESS) { return WOLFSSL_FAILURE; } - hType = wolfSSL_EVP_MD_type(hashAlg); - if (hType < WC_HASH_TYPE_NONE || hType > WC_HASH_TYPE_MAX) { + hashType = wolfSSL_EVP_MD_type(hashAlg); + if (hashType < WC_HASH_TYPE_NONE || hashType > WC_HASH_TYPE_MAX) { + WOLFSSL_MSG("wolfSSL_EVP_MD_type error"); return WOLFSSL_FAILURE; } - mgf = hash2mgf(hType); - - hLen = wolfSSL_EVP_MD_size(hashAlg); - if (hLen < 0) { + if ((mgf = hash2mgf(hashType)) == WC_MGF1NONE) { + WOLFSSL_MSG("hash2mgf error"); return WOLFSSL_FAILURE; } - nLen = wolfSSL_BN_num_bytes(rsa->n); - if (nLen <= 0) { + if ((hashLen = wolfSSL_EVP_MD_size(hashAlg)) < 0) { + WOLFSSL_MSG("wolfSSL_EVP_MD_size error"); return WOLFSSL_FAILURE; } - buf = (byte*)XMALLOC(nLen, NULL, DYNAMIC_TYPE_TMP_BUFFER); - if (!buf) { + if (!(buf = (byte*)XMALLOC(emLen, NULL, DYNAMIC_TYPE_TMP_BUFFER))) { + WOLFSSL_MSG("malloc error"); return WOLFSSL_FAILURE; } - XMEMCPY(buf, EM, nLen); + XMEMCPY(buf, EM, emLen); /* Remove and verify the PSS padding */ - if ((mPrimeLen = wc_RsaUnPad_ex(buf, nLen, &mPrime, - RSA_BLOCK_TYPE_1, WC_RSA_PSS_PAD, hType, + if ((mPrimeLen = wc_RsaUnPad_ex(buf, emLen, &mPrime, + RSA_BLOCK_TYPE_1, WC_RSA_PSS_PAD, hashType, mgf, NULL, 0, saltLen, wolfSSL_BN_num_bits(rsa->n), NULL)) < 0) { WOLFSSL_MSG("wc_RsaPad_ex error"); @@ -39245,7 +39258,7 @@ int wolfSSL_RSA_verify_PKCS1_PSS(WOLFSSL_RSA *rsa, const unsigned char *mHash, } /* Verify the hash is correct */ - if (wc_RsaPSS_CheckPadding_ex(mHash, hLen, mPrime, mPrimeLen, hType, + if (wc_RsaPSS_CheckPadding_ex(mHash, hashLen, mPrime, mPrimeLen, hashType, saltLen, wolfSSL_BN_num_bits(rsa->n)) != MP_OKAY) { WOLFSSL_MSG("wc_RsaPSS_CheckPadding_ex error"); diff --git a/wolfssl/openssl/rsa.h b/wolfssl/openssl/rsa.h index cab048879..4ff4bc8cf 100644 --- a/wolfssl/openssl/rsa.h +++ b/wolfssl/openssl/rsa.h @@ -49,14 +49,12 @@ #define RSA_FLAG_NO_BLINDING (1 << 7) #define RSA_FLAG_NO_CONSTTIME (1 << 8) -/* Salt length matches digest */ -#define RSA_PSS_SALTLEN_DIGEST -1 -/* Verify only: auto detect salt length */ -#define RSA_PSS_SALTLEN_AUTO -2 -/* Set salt length to maximum possible */ -#define RSA_PSS_SALTLEN_MAX -3 -/* Old compatible max salt length for sign only */ -#define RSA_PSS_SALTLEN_MAX_SIGN -2 +/* Salt length same as digest length */ +#define RSA_PSS_SALTLEN_DIGEST -1 +/* Old max salt length */ +#define RSA_PSS_SALTLEN_MAX_SIGN -2 +/* Max salt length */ +#define RSA_PSS_SALTLEN_MAX -3 typedef struct WOLFSSL_RSA_METHOD { int flags; From 0b3a331265070ddef99ea020d97ffe1bfddc9243 Mon Sep 17 00:00:00 2001 From: Juliusz Sosinowicz Date: Thu, 9 Apr 2020 19:10:55 +0200 Subject: [PATCH 013/298] Revert wc_OBJ_sn2nid --- tests/api.c | 13 ----------- wolfcrypt/src/asn.c | 54 +++++++++++++++++++++++++++++++-------------- wolfcrypt/src/ecc.c | 8 +++++++ 3 files changed, 45 insertions(+), 30 deletions(-) diff --git a/tests/api.c b/tests/api.c index b01debd2c..d6db7045e 100644 --- a/tests/api.c +++ b/tests/api.c @@ -28022,19 +28022,6 @@ static void test_wolfSSL_OBJ_sn(void) printf(testingFmt, "wolfSSL_OBJ_sn"); AssertIntEQ(wolfSSL_OBJ_sn2nid(NULL), NID_undef); - - #ifdef HAVE_ECC - { - int nCurves = 27; - EC_builtin_curve r[nCurves]; - EC_get_builtin_curves(r,nCurves); - - for (i = 0; i < nCurves; i++) { - AssertIntEQ(wolfSSL_OBJ_sn2nid(r[i].comment), r[i].nid); - AssertStrEQ(wolfSSL_OBJ_nid2sn(r[i].nid), r[i].comment); - } - } - #endif for (i = 0; i < maxIdx; i++) { AssertIntEQ(wolfSSL_OBJ_sn2nid(sn_wolf_set[i]), nid_set[i]); AssertStrEQ(wolfSSL_OBJ_nid2sn(nid_set[i]), sn_open_set[i]); diff --git a/wolfcrypt/src/asn.c b/wolfcrypt/src/asn.c index ca0791096..c4e60043f 100644 --- a/wolfcrypt/src/asn.c +++ b/wolfcrypt/src/asn.c @@ -5436,25 +5436,45 @@ WOLFSSL_API int EccEnumToNID(int n) #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) int wc_OBJ_sn2nid(const char *sn) { - const WOLFSSL_ObjectInfo *obj_info = wolfssl_object_info; - size_t i, snlen; - WOLFSSL_ENTER("wolfSSL_OBJ_ln2nid"); - if (sn && (snlen = XSTRLEN(sn)) > 0) { - /* Accept input like "/CN=" */ - if (sn[0] == '/') { - sn++; - snlen--; - } - if (sn[snlen-1] == '=') { - snlen--; - } - for (i = 0; i < wolfssl_object_info_sz; i++, obj_info++) { - if (snlen == XSTRLEN(obj_info->sName) && - XSTRNCMP(sn, obj_info->sName, snlen) == 0) { - return obj_info->nid; - } + const struct { + const char *sn; + int nid; + } sn2nid[] = { + {WOLFSSL_COMMON_NAME, NID_commonName}, + {WOLFSSL_COUNTRY_NAME, NID_countryName}, + {WOLFSSL_LOCALITY_NAME, NID_localityName}, + {WOLFSSL_STATE_NAME, NID_stateOrProvinceName}, + {WOLFSSL_ORG_NAME, NID_organizationName}, + {WOLFSSL_ORGUNIT_NAME, NID_organizationalUnitName}, + {WOLFSSL_EMAIL_ADDR, NID_emailAddress}, + {NULL, -1}}; + + int i; + #ifdef HAVE_ECC + int eccEnum; + #endif + WOLFSSL_ENTER("OBJ_sn2nid"); + for(i=0; sn2nid[i].sn != NULL; i++) { + if(XSTRNCMP(sn, sn2nid[i].sn, XSTRLEN(sn2nid[i].sn)) == 0) { + return sn2nid[i].nid; } } + #ifdef HAVE_ECC + /* Nginx uses this OpenSSL string. */ + if (XSTRNCMP(sn, "prime256v1", 10) == 0) + sn = "SECP256R1"; + if (XSTRNCMP(sn, "secp384r1", 10) == 0) + sn = "SECP384R1"; + /* find based on name and return NID */ + for (i = 0; ecc_sets[i].size != 0 && ecc_sets[i].name != NULL; i++) { + if (XSTRNCMP(sn, ecc_sets[i].name, ECC_MAXNAME) == 0) { + eccEnum = ecc_sets[i].id; + /* Convert enum value in ecc_curve_id to OpenSSL NID */ + return EccEnumToNID(eccEnum); + } + } + #endif + return NID_undef; } #endif diff --git a/wolfcrypt/src/ecc.c b/wolfcrypt/src/ecc.c index 6b9957dc7..80e428dad 100644 --- a/wolfcrypt/src/ecc.c +++ b/wolfcrypt/src/ecc.c @@ -6296,6 +6296,10 @@ int wc_ecc_import_point_der_ex(byte* in, word32 inLen, const int curve_idx, int keysize; byte pointType; +#ifndef HAVE_COMP_KEY + (void)shortKeySize; +#endif + if (in == NULL || point == NULL || (curve_idx < 0) || (wc_ecc_is_valid_idx(curve_idx) == 0)) return ECC_BAD_ARG_E; @@ -6340,7 +6344,11 @@ int wc_ecc_import_point_der_ex(byte* in, word32 inLen, const int curve_idx, /* calculate key size based on inLen / 2 if uncompressed or shortKeySize * is true */ +#ifdef HAVE_COMP_KEY keysize = compressed && !shortKeySize ? inLen : inLen>>1; +#else + keysize = inLen>>1; +#endif /* read data */ if (err == MP_OKAY) From 1d3fd5cd07d69baf2a3e61eda77cdf74f76b1e72 Mon Sep 17 00:00:00 2001 From: Juliusz Sosinowicz Date: Wed, 15 Apr 2020 12:53:38 +0200 Subject: [PATCH 014/298] Code review - make `wc_ecc_export_point_der_compressed` a local function - use `int` for `shortKeySize` in `wc_ecc_import_point_der_ex` - check for null return value from `wolfSSL_OBJ_nid2obj` and `wolfSSL_d2i_PUBKEY` - add comments to `ssl.c` - check `lnlen` in `wolfSSL_OBJ_ln2nid` --- src/internal.c | 18 ++++++++++---- src/ssl.c | 55 +++++++++++++++++++++++++++++++++++------ wolfcrypt/src/ecc.c | 2 +- wolfssl/openssl/asn1.h | 4 ++- wolfssl/wolfcrypt/ecc.h | 4 +-- 5 files changed, 67 insertions(+), 16 deletions(-) diff --git a/src/internal.c b/src/internal.c index 74c8f2bdf..bde8c32a8 100644 --- a/src/internal.c +++ b/src/internal.c @@ -9538,12 +9538,17 @@ int CopyDecodedToX509(WOLFSSL_X509* x509, DecodedCert* dCert) } else { wolfSSL_ASN1_OBJECT_free(x509->key.algor->algorithm); } - x509->key.algor->algorithm = wolfSSL_OBJ_nid2obj(dCert->keyOID); + if (!(x509->key.algor->algorithm = + wolfSSL_OBJ_nid2obj(dCert->keyOID))) { + ret = PUBLIC_KEY_E; + } wolfSSL_EVP_PKEY_free(x509->key.pkey); - x509->key.pkey = wolfSSL_d2i_PUBKEY(NULL, - &dCert->publicKey, - dCert->pubKeySize); + if (!(x509->key.pkey = wolfSSL_d2i_PUBKEY(NULL, + &dCert->publicKey, + dCert->pubKeySize))) { + ret = PUBLIC_KEY_E; + } } #endif } @@ -9562,7 +9567,10 @@ int CopyDecodedToX509(WOLFSSL_X509* x509, DecodedCert* dCert) } #if defined(OPENSSL_ALL) wolfSSL_ASN1_OBJECT_free(x509->algor.algorithm); - x509->algor.algorithm = wolfSSL_OBJ_nid2obj(dCert->signatureOID); + if (!(x509->algor.algorithm = + wolfSSL_OBJ_nid2obj(dCert->signatureOID))) { + ret = PUBLIC_KEY_E; + } #endif } diff --git a/src/ssl.c b/src/ssl.c index 7228d25b7..6213bd38f 100755 --- a/src/ssl.c +++ b/src/ssl.c @@ -28179,6 +28179,16 @@ void wolfSSL_X509_ALGOR_get0(const WOLFSSL_ASN1_OBJECT **paobj, int *pptype, } } +/** + * Populate algor members. + * + * @param algor The object to be set + * @param aobj The value to be set in algor->algorithm + * @param ptype The type of algor->parameter + * @param pval The value of algor->parameter + * @return WOLFSSL_SUCCESS on success + * WOLFSSL_FAILURE on missing parameters or bad malloc + */ int wolfSSL_X509_ALGOR_set0(WOLFSSL_X509_ALGOR *algor, WOLFSSL_ASN1_OBJECT *aobj, int ptype, void *pval) { @@ -28200,6 +28210,13 @@ int wolfSSL_X509_ALGOR_set0(WOLFSSL_X509_ALGOR *algor, WOLFSSL_ASN1_OBJECT *aobj return WOLFSSL_SUCCESS; } +/** + * Set `a` in a smart way. + * + * @param a Object to set + * @param type The type of object in value + * @param value Object to set + */ void wolfSSL_ASN1_TYPE_set(WOLFSSL_ASN1_TYPE *a, int type, void *value) { if (!a || !value) { @@ -28222,6 +28239,11 @@ void wolfSSL_ASN1_TYPE_set(WOLFSSL_ASN1_TYPE *a, int type, void *value) a->type = type; } +/** + * Allocate a new WOLFSSL_ASN1_TYPE object. + * + * @return New zero'ed WOLFSSL_ASN1_TYPE object + */ WOLFSSL_ASN1_TYPE* wolfSSL_ASN1_TYPE_new(void) { WOLFSSL_ASN1_TYPE* ret = (WOLFSSL_ASN1_TYPE*)XMALLOC(sizeof(WOLFSSL_ASN1_TYPE), @@ -28232,6 +28254,11 @@ WOLFSSL_ASN1_TYPE* wolfSSL_ASN1_TYPE_new(void) return ret; } +/** + * Free WOLFSSL_ASN1_TYPE and all its members. + * + * @param at Object to free + */ void wolfSSL_ASN1_TYPE_free(WOLFSSL_ASN1_TYPE* at) { if (at) { @@ -28253,6 +28280,11 @@ void wolfSSL_ASN1_TYPE_free(WOLFSSL_ASN1_TYPE* at) } } +/** + * Allocate a new WOLFSSL_X509_PUBKEY object. + * + * @return New zero'ed WOLFSSL_X509_PUBKEY object + */ WOLFSSL_X509_PUBKEY *wolfSSL_X509_PUBKEY_new(void) { WOLFSSL_X509_PUBKEY *ret; @@ -28270,6 +28302,11 @@ WOLFSSL_X509_PUBKEY *wolfSSL_X509_PUBKEY_new(void) return ret; } +/** + * Free WOLFSSL_X509_PUBKEY and all its members. + * + * @param at Object to free + */ void wolfSSL_X509_PUBKEY_free(WOLFSSL_X509_PUBKEY *x) { if (x) { @@ -31614,6 +31651,8 @@ int wolfSSL_ASN1_item_i2d(const void *src, byte **dest, *dest = buf; } else if (dest && *dest && buf) { + /* *dest length is not checked because the user is responsible + * for providing a long enough buffer */ XMEMCPY(*dest, buf, len); } @@ -42892,13 +42931,15 @@ err: ln++; lnlen--; } - if (ln[lnlen-1] == '=') { - lnlen--; - } - for (i = 0; i < WOLFSSL_OBJECT_INFO_SZ; i++, obj_info++) { - if (lnlen == XSTRLEN(obj_info->lName) && - XSTRNCMP(ln, obj_info->lName, lnlen) == 0) { - return obj_info->nid; + if (lnlen) { + if (ln[lnlen-1] == '=') { + lnlen--; + } + for (i = 0; i < WOLFSSL_OBJECT_INFO_SZ; i++, obj_info++) { + if (lnlen == XSTRLEN(obj_info->lName) && + XSTRNCMP(ln, obj_info->lName, lnlen) == 0) { + return obj_info->nid; + } } } } diff --git a/wolfcrypt/src/ecc.c b/wolfcrypt/src/ecc.c index 80e428dad..22db7f167 100644 --- a/wolfcrypt/src/ecc.c +++ b/wolfcrypt/src/ecc.c @@ -6287,7 +6287,7 @@ int wc_ecc_verify_hash_ex(mp_int *r, mp_int *s, const byte* hash, /* import point from der * if shortKeySize != 0 then keysize is always (inLen-1)>>1 */ int wc_ecc_import_point_der_ex(byte* in, word32 inLen, const int curve_idx, - ecc_point* point, char shortKeySize) + ecc_point* point, int shortKeySize) { int err = 0; #ifdef HAVE_COMP_KEY diff --git a/wolfssl/openssl/asn1.h b/wolfssl/openssl/asn1.h index ba786ac8a..0566ceb2b 100644 --- a/wolfssl/openssl/asn1.h +++ b/wolfssl/openssl/asn1.h @@ -83,7 +83,9 @@ WOLFSSL_API WOLFSSL_ASN1_INTEGER *wolfSSL_BN_to_ASN1_INTEGER( WOLFSSL_API void wolfSSL_ASN1_TYPE_set(WOLFSSL_ASN1_TYPE *a, int type, void *value); #ifdef OPENSSL_ALL -/* IMPLEMENT_ASN1_FUNCTIONS stuff */ +/* IMPLEMENT_ASN1_FUNCTIONS is strictly for external use only. Internally + * we don't use this. Some projects use OpenSSL to implement ASN1 types and + * this section is only to provide those projects with ASN1 functionality. */ typedef struct { size_t offset; /* Offset of this field in structure */ byte type; /* The type of the member as defined in diff --git a/wolfssl/wolfcrypt/ecc.h b/wolfssl/wolfcrypt/ecc.h index 88e4460dc..27f42067f 100644 --- a/wolfssl/wolfcrypt/ecc.h +++ b/wolfssl/wolfcrypt/ecc.h @@ -641,7 +641,7 @@ int wc_ecc_export_point_der_ex(const int curve_idx, ecc_point* point, byte* out, WOLFSSL_API int wc_ecc_export_point_der(const int curve_idx, ecc_point* point, byte* out, word32* outLen); -WOLFSSL_API +WOLFSSL_LOCAL int wc_ecc_export_point_der_compressed(const int curve_idx, ecc_point* point, byte* out, word32* outLen); #endif /* HAVE_ECC_KEY_EXPORT */ @@ -650,7 +650,7 @@ int wc_ecc_export_point_der_compressed(const int curve_idx, ecc_point* point, #ifdef HAVE_ECC_KEY_IMPORT WOLFSSL_API int wc_ecc_import_point_der_ex(byte* in, word32 inLen, const int curve_idx, - ecc_point* point, char shortKeySize); + ecc_point* point, int shortKeySize); WOLFSSL_API int wc_ecc_import_point_der(byte* in, word32 inLen, const int curve_idx, ecc_point* point); From 74893edaf0313b64abed3d1e53060251809780e3 Mon Sep 17 00:00:00 2001 From: Stanislav Klima Date: Wed, 15 Apr 2020 14:36:36 +0200 Subject: [PATCH 015/298] Fix of size constraint for parsing. --- wolfcrypt/src/asn.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wolfcrypt/src/asn.c b/wolfcrypt/src/asn.c index a224f2ce6..708e61122 100644 --- a/wolfcrypt/src/asn.c +++ b/wolfcrypt/src/asn.c @@ -17378,10 +17378,10 @@ int ParseCRL(DecodedCRL* dcrl, const byte* buff, word32 sz, void* cm) return ASN_PARSE_E; dcrl->sigIndex = len + idx; - if (ParseCRL_CertList(dcrl, buff, &idx, idx + len) < 0) + if (ParseCRL_CertList(dcrl, buff, &idx, dcrl->sigIndex) < 0) return ASN_PARSE_E; - if (ParseCRL_Extensions(dcrl, buff, &idx, idx + len) < 0) + if (ParseCRL_Extensions(dcrl, buff, &idx, dcrl->sigIndex) < 0) return ASN_PARSE_E; idx = dcrl->sigIndex; From e19334266ee921a65b0ae56ec87309924f0a282b Mon Sep 17 00:00:00 2001 From: Stanislav Klima Date: Wed, 15 Apr 2020 14:43:12 +0200 Subject: [PATCH 016/298] This function is required by HAVE_PK_CALLBACKS option and it's used by server as well. --- src/internal.c | 86 +++++++++++++++++++++++++------------------------- 1 file changed, 43 insertions(+), 43 deletions(-) diff --git a/src/internal.c b/src/internal.c index 77de65e7f..ae1f71603 100644 --- a/src/internal.c +++ b/src/internal.c @@ -23437,49 +23437,6 @@ exit_scke: #ifndef NO_CERTS -#ifdef HAVE_PK_CALLBACKS - int GetPrivateKeySigSize(WOLFSSL* ssl) - { - int sigSz = 0; - - if (ssl == NULL) - return 0; - - switch (ssl->buffers.keyType) { - #ifndef NO_RSA - #ifdef WC_RSA_PSS - case rsa_pss_sa_algo: - #endif - case rsa_sa_algo: - sigSz = ssl->buffers.keySz; - ssl->hsType = DYNAMIC_TYPE_RSA; - break; - #endif - #ifdef HAVE_ECC - case ecc_dsa_sa_algo: - sigSz = wc_ecc_sig_size_calc(ssl->buffers.keySz); - ssl->hsType = DYNAMIC_TYPE_ECC; - break; - #endif - #ifdef HAVE_ED25519 - case ed25519_sa_algo: - sigSz = ED25519_SIG_SIZE; /* fixed known value */ - ssl->hsType = DYNAMIC_TYPE_ED25519; - break; - #endif - #ifdef HAVE_ED448 - case ed448_sa_algo: - sigSz = ED448_SIG_SIZE; /* fixed known value */ - ssl->hsType = DYNAMIC_TYPE_ED448; - break; - #endif - default: - break; - } - return sigSz; - } -#endif /* HAVE_PK_CALLBACKS */ - #ifndef WOLFSSL_NO_TLS12 #ifndef WOLFSSL_NO_CLIENT_AUTH @@ -24079,6 +24036,49 @@ static int DoSessionTicket(WOLFSSL* ssl, const byte* input, word32* inOutIdx, #endif /* NO_WOLFSSL_CLIENT */ +#ifdef HAVE_PK_CALLBACKS + int GetPrivateKeySigSize(WOLFSSL* ssl) + { + int sigSz = 0; + + if (ssl == NULL) + return 0; + + switch (ssl->buffers.keyType) { + #ifndef NO_RSA + #ifdef WC_RSA_PSS + case rsa_pss_sa_algo: + #endif + case rsa_sa_algo: + sigSz = ssl->buffers.keySz; + ssl->hsType = DYNAMIC_TYPE_RSA; + break; + #endif + #ifdef HAVE_ECC + case ecc_dsa_sa_algo: + sigSz = wc_ecc_sig_size_calc(ssl->buffers.keySz); + ssl->hsType = DYNAMIC_TYPE_ECC; + break; + #endif + #ifdef HAVE_ED25519 + case ed25519_sa_algo: + sigSz = ED25519_SIG_SIZE; /* fixed known value */ + ssl->hsType = DYNAMIC_TYPE_ED25519; + break; + #endif + #ifdef HAVE_ED448 + case ed448_sa_algo: + sigSz = ED448_SIG_SIZE; /* fixed known value */ + ssl->hsType = DYNAMIC_TYPE_ED448; + break; + #endif + default: + break; + } + return sigSz; + } +#endif /* HAVE_PK_CALLBACKS */ + #ifdef HAVE_ECC /* returns the WOLFSSL_* version of the curve from the OID sum */ word16 GetCurveByOID(int oidSum) { From 1a80975d9e0b38e4c5ef5caa90228a580d136ca7 Mon Sep 17 00:00:00 2001 From: Stanislav Klima Date: Wed, 15 Apr 2020 15:47:32 +0200 Subject: [PATCH 017/298] Fixed resource leaks. --- wolfcrypt/src/asn.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/wolfcrypt/src/asn.c b/wolfcrypt/src/asn.c index 708e61122..f4a1bd28b 100644 --- a/wolfcrypt/src/asn.c +++ b/wolfcrypt/src/asn.c @@ -3404,6 +3404,10 @@ int UnTraditionalEnc(byte* key, word32 keySz, byte* out, word32* outSz, /* place iteration count in buffer */ ret = SetShortInt(out, &inOutIdx, itt, *outSz); if (ret < 0) { + #ifdef WOLFSSL_SMALL_STACK + if (saltTmp != NULL) + XFREE(saltTmp, heap, DYNAMIC_TYPE_TMP_BUFFER); + #endif return ret; } sz += (word32)ret; @@ -3427,6 +3431,10 @@ int UnTraditionalEnc(byte* key, word32 keySz, byte* out, word32* outSz, /* check key type and get OID if ECC */ if ((ret = wc_GetKeyOID(key, keySz, &curveOID, &oidSz, &algoID, heap))< 0) { WOLFSSL_MSG("Error getting key OID"); + #ifdef WOLFSSL_SMALL_STACK + if (saltTmp != NULL) + XFREE(saltTmp, heap, DYNAMIC_TYPE_TMP_BUFFER); + #endif return ret; } @@ -3453,6 +3461,10 @@ int UnTraditionalEnc(byte* key, word32 keySz, byte* out, word32* outSz, /* plus 3 for tags */ *outSz = tmpSz + MAX_ALGO_SZ + MAX_LENGTH_SZ +MAX_LENGTH_SZ + MAX_SEQ_SZ + MAX_LENGTH_SZ + MAX_SEQ_SZ + 3; + #ifdef WOLFSSL_SMALL_STACK + if (saltTmp != NULL) + XFREE(saltTmp, heap, DYNAMIC_TYPE_TMP_BUFFER); + #endif return LENGTH_ONLY_E; } @@ -3486,7 +3498,7 @@ int UnTraditionalEnc(byte* key, word32 keySz, byte* out, word32* outSz, if (cbcIv == NULL) { if (saltTmp != NULL) XFREE(saltTmp, heap, DYNAMIC_TYPE_TMP_BUFFER); - XFREE(salt, heap, DYNAMIC_TYPE_TMP_BUFFER); + XFREE(tmp, heap, DYNAMIC_TYPE_TMP_BUFFER); return MEMORY_E; } #endif From 68a2e03bd43fdbf4f234938f578202453f84a660 Mon Sep 17 00:00:00 2001 From: Stanislav Klima Date: Wed, 15 Apr 2020 16:27:34 +0200 Subject: [PATCH 018/298] Fixed resource leak. --- wolfcrypt/src/asn.c | 1 + 1 file changed, 1 insertion(+) diff --git a/wolfcrypt/src/asn.c b/wolfcrypt/src/asn.c index f4a1bd28b..a2eeaf039 100644 --- a/wolfcrypt/src/asn.c +++ b/wolfcrypt/src/asn.c @@ -15167,6 +15167,7 @@ int DecodeECC_DSA_Sig(const byte* sig, word32 sigLen, mp_int* r, mp_int* s) } if (GetInt(s, sig, &idx, sigLen) < 0) { + mp_clear(r); return ASN_ECC_KEY_E; } From 314ff1137b0f16ad7dba50bc71febf20beb96892 Mon Sep 17 00:00:00 2001 From: Stanislav Klima Date: Wed, 15 Apr 2020 16:29:11 +0200 Subject: [PATCH 019/298] Fixed resource leak. --- src/ssl.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ssl.c b/src/ssl.c index e7d6efdb1..ba9f32512 100755 --- a/src/ssl.c +++ b/src/ssl.c @@ -25243,6 +25243,7 @@ WOLFSSL_API int wolfSSL_X509_STORE_load_locations(WOLFSSL_X509_STORE *str, DYNAMIC_TYPE_TMP_BUFFER); if (readCtx == NULL) { WOLFSSL_MSG("Memory error"); + wolfSSL_CTX_free(ctx); return WOLFSSL_FAILURE; } #endif From 83044d7560f8ff3f883dca2e5e2b7fd533836e29 Mon Sep 17 00:00:00 2001 From: Stanislav Klima Date: Thu, 16 Apr 2020 09:46:15 +0200 Subject: [PATCH 020/298] Fixed dereference after null check. --- src/internal.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/internal.c b/src/internal.c index ae1f71603..a13e566be 100644 --- a/src/internal.c +++ b/src/internal.c @@ -11557,7 +11557,15 @@ exit_ppc: } #endif /* WOLFSSL_ASYNC_CRYPT || WOLFSSL_NONBLOCK_OCSP */ +#if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP) || \ + defined(WOLFSSL_SMALL_STACK) + if (args) + { + FreeProcPeerCertArgs(ssl, args); + } +#else FreeProcPeerCertArgs(ssl, args); +#endif /* WOLFSSL_ASYNC_CRYPT || WOLFSSL_NONBLOCK_OCSP || WOLFSSL_SMALL_STACK */ #if defined(WOLFSSL_ASYNC_CRYPT) #elif defined(WOLFSSL_NONBLOCK_OCSP) From eab451339cc764e58002161860ec88c41ee5401a Mon Sep 17 00:00:00 2001 From: Stanislav Klima Date: Thu, 16 Apr 2020 09:52:02 +0200 Subject: [PATCH 021/298] Fixed dereference after null check. --- wolfcrypt/src/asn.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/wolfcrypt/src/asn.c b/wolfcrypt/src/asn.c index a2eeaf039..1bce4026d 100644 --- a/wolfcrypt/src/asn.c +++ b/wolfcrypt/src/asn.c @@ -13575,6 +13575,8 @@ static int EncodeCertReq(Cert* cert, DerCert* der, RsaKey* rsaKey, #ifdef HAVE_ECC if (cert->keyType == ECC_KEY) { + if (eccKey == NULL) + return PUBLIC_KEY_E; der->publicKeySz = SetEccPublicKey(der->publicKey, eccKey, 1); } #endif From dd68074104a6b219a28f1f5e68480adf569f6283 Mon Sep 17 00:00:00 2001 From: Juliusz Sosinowicz Date: Wed, 15 Apr 2020 21:42:54 +0200 Subject: [PATCH 022/298] Fix merge issues --- src/ssl.c | 2884 +------------------------------------------ wolfcrypt/src/evp.c | 215 ++-- 2 files changed, 123 insertions(+), 2976 deletions(-) diff --git a/src/ssl.c b/src/ssl.c index 5568112ff..f2451329c 100755 --- a/src/ssl.c +++ b/src/ssl.c @@ -15919,2107 +15919,6 @@ size_t wolfSSL_get_client_random(const WOLFSSL* ssl, unsigned char* out, #endif /* WOLFSSL_NOSHA3_512 */ #endif /* WOLFSSL_SHA3 */ - static const struct s_ent { - const unsigned char macType; - const char *name; - } md_tbl[] = { - #ifndef NO_MD4 - {WC_HASH_TYPE_MD4, "MD4"}, - #endif /* NO_MD4 */ - - #ifndef NO_MD5 - {WC_HASH_TYPE_MD5, "MD5"}, - #endif /* NO_MD5 */ - - #ifndef NO_SHA - {WC_HASH_TYPE_SHA, "SHA"}, - #endif /* NO_SHA */ - - #ifdef WOLFSSL_SHA224 - {WC_HASH_TYPE_SHA224, "SHA224"}, - #endif /* WOLFSSL_SHA224 */ - #ifndef NO_SHA256 - {WC_HASH_TYPE_SHA256, "SHA256"}, - #endif - - #ifdef WOLFSSL_SHA384 - {WC_HASH_TYPE_SHA384, "SHA384"}, - #endif /* WOLFSSL_SHA384 */ - #ifdef WOLFSSL_SHA512 - {WC_HASH_TYPE_SHA512, "SHA512"}, - #endif /* WOLFSSL_SHA512 */ -#ifndef WOLFSSL_NOSHA3_224 - {WC_HASH_TYPE_SHA3_224, "SHA3_224"}, -#endif -#ifndef WOLFSSL_NOSHA3_256 - {WC_HASH_TYPE_SHA3_256, "SHA3_256"}, -#endif - {WC_HASH_TYPE_SHA3_384, "SHA3_384"}, -#ifndef WOLFSSL_NOSHA3_512 - {WC_HASH_TYPE_SHA3_512, "SHA3_512"}, -#endif - {0, NULL} - }; - -const WOLFSSL_EVP_MD *wolfSSL_EVP_get_digestbyname(const char *name) -{ - static const struct alias { - const char *name; - const char *alias; - } alias_tbl[] = - { - {"MD4", "ssl3-md4"}, - {"MD5", "ssl3-md5"}, - {"SHA", "ssl3-sha1"}, - {"SHA", "SHA1"}, - { NULL, NULL} - }; - - const struct alias *al; - const struct s_ent *ent; - - - for (al = alias_tbl; al->name != NULL; al++) - if(XSTRNCMP(name, al->alias, XSTRLEN(al->alias)+1) == 0) { - name = al->name; - break; - } - - for (ent = md_tbl; ent->name != NULL; ent++) - if(XSTRNCMP(name, ent->name, XSTRLEN(ent->name)+1) == 0) { - return (EVP_MD *)ent->name; - } - return NULL; -} - -static WOLFSSL_EVP_MD *wolfSSL_EVP_get_md(const unsigned char type) -{ - const struct s_ent *ent ; - WOLFSSL_ENTER("EVP_get_md"); - for( ent = md_tbl; ent->name != NULL; ent++){ - if(type == ent->macType) { - return (WOLFSSL_EVP_MD *)ent->name; - } - } - return (WOLFSSL_EVP_MD *)""; -} - -int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) -{ - const struct s_ent *ent ; - WOLFSSL_ENTER("EVP_MD_type"); - for( ent = md_tbl; ent->name != NULL; ent++){ - if(XSTRNCMP((const char *)md, ent->name, XSTRLEN(ent->name)+1) == 0) { - return ent->macType; - } - } - return 0; -} - - -#ifndef NO_MD4 - - /* return a pointer to MD4 EVP type */ - const WOLFSSL_EVP_MD* wolfSSL_EVP_md4(void) - { - WOLFSSL_ENTER("wolfSSL_EVP_md4"); - return EVP_get_digestbyname("MD4"); - } - -#endif /* !NO_MD4 */ - - -#ifndef NO_MD5 - - const WOLFSSL_EVP_MD* wolfSSL_EVP_md5(void) - { - WOLFSSL_ENTER("EVP_md5"); - return EVP_get_digestbyname("MD5"); - } - -#endif /* !NO_MD5 */ - - -#ifndef NO_WOLFSSL_STUB - const WOLFSSL_EVP_MD* wolfSSL_EVP_mdc2(void) - { - WOLFSSL_STUB("EVP_mdc2"); - return NULL; - } -#endif - -#ifndef NO_SHA - const WOLFSSL_EVP_MD* wolfSSL_EVP_sha1(void) - { - WOLFSSL_ENTER("EVP_sha1"); - return EVP_get_digestbyname("SHA"); - } -#endif /* NO_SHA */ - -#ifdef WOLFSSL_SHA224 - - const WOLFSSL_EVP_MD* wolfSSL_EVP_sha224(void) - { - WOLFSSL_ENTER("EVP_sha224"); - return EVP_get_digestbyname("SHA224"); - } - -#endif /* WOLFSSL_SHA224 */ - - - const WOLFSSL_EVP_MD* wolfSSL_EVP_sha256(void) - { - WOLFSSL_ENTER("EVP_sha256"); - return EVP_get_digestbyname("SHA256"); - } - -#ifdef WOLFSSL_SHA384 - - const WOLFSSL_EVP_MD* wolfSSL_EVP_sha384(void) - { - WOLFSSL_ENTER("EVP_sha384"); - return EVP_get_digestbyname("SHA384"); - } - -#endif /* WOLFSSL_SHA384 */ - -#ifdef WOLFSSL_SHA512 - - const WOLFSSL_EVP_MD* wolfSSL_EVP_sha512(void) - { - WOLFSSL_ENTER("EVP_sha512"); - return EVP_get_digestbyname("SHA512"); - } - -#endif /* WOLFSSL_SHA512 */ - -#ifdef WOLFSSL_SHA3 -#ifndef WOLFSSL_NOSHA3_224 - const WOLFSSL_EVP_MD* wolfSSL_EVP_sha3_224(void) - { - WOLFSSL_ENTER("EVP_sha3_224"); - return EVP_get_digestbyname("SHA3_224"); - } -#endif /* WOLFSSL_NOSHA3_224 */ - - -#ifndef WOLFSSL_NOSHA3_256 - const WOLFSSL_EVP_MD* wolfSSL_EVP_sha3_256(void) - { - WOLFSSL_ENTER("EVP_sha3_256"); - return EVP_get_digestbyname("SHA3_256"); - } -#endif /* WOLFSSL_NOSHA3_256 */ - - const WOLFSSL_EVP_MD* wolfSSL_EVP_sha3_384(void) - { - WOLFSSL_ENTER("EVP_sha3_384"); - return EVP_get_digestbyname("SHA3_384"); - } - -#ifndef WOLFSSL_NOSHA3_512 - const WOLFSSL_EVP_MD* wolfSSL_EVP_sha3_512(void) - { - WOLFSSL_ENTER("EVP_sha3_512"); - return EVP_get_digestbyname("SHA3_512"); - } -#endif /* WOLFSSL_NOSHA3_512 */ -#endif /* WOLFSSL_SHA3 */ - - WOLFSSL_EVP_MD_CTX *wolfSSL_EVP_MD_CTX_new(void) - { - WOLFSSL_EVP_MD_CTX* ctx; - WOLFSSL_ENTER("EVP_MD_CTX_new"); - ctx = (WOLFSSL_EVP_MD_CTX*)XMALLOC(sizeof *ctx, NULL, - DYNAMIC_TYPE_OPENSSL); - if (ctx){ - wolfSSL_EVP_MD_CTX_init(ctx); - } - return ctx; - } - - WOLFSSL_API void wolfSSL_EVP_MD_CTX_free(WOLFSSL_EVP_MD_CTX *ctx) - { - if (ctx) { - WOLFSSL_ENTER("EVP_MD_CTX_free"); - wolfSSL_EVP_MD_CTX_cleanup(ctx); - XFREE(ctx, NULL, DYNAMIC_TYPE_OPENSSL); - } - } - - - /* returns the type of message digest used by the ctx */ - int wolfSSL_EVP_MD_CTX_type(const WOLFSSL_EVP_MD_CTX *ctx) { - WOLFSSL_ENTER("EVP_MD_CTX_type"); - return ctx->macType; - } - - - /* returns WOLFSSL_SUCCESS on success */ - int wolfSSL_EVP_MD_CTX_copy(WOLFSSL_EVP_MD_CTX *out, const WOLFSSL_EVP_MD_CTX *in) - { - return wolfSSL_EVP_MD_CTX_copy_ex(out, in); - } - - /* returns digest size */ - int wolfSSL_EVP_MD_CTX_size(const WOLFSSL_EVP_MD_CTX *ctx) { - return(wolfSSL_EVP_MD_size(wolfSSL_EVP_MD_CTX_md(ctx))); - } - /* returns block size */ - int wolfSSL_EVP_MD_CTX_block_size(const WOLFSSL_EVP_MD_CTX *ctx) { - return(wolfSSL_EVP_MD_block_size(wolfSSL_EVP_MD_CTX_md(ctx))); - } - - /* Deep copy of EVP_MD hasher - * return WOLFSSL_SUCCESS on success */ - static int wolfSSL_EVP_MD_Copy_Hasher(WOLFSSL_EVP_MD_CTX* des, - const WOLFSSL_EVP_MD_CTX* src) - { - if (src->macType == (NID_hmac & 0xFF)) { - wolfSSL_HmacCopy(&des->hash.hmac, (Hmac*)&src->hash.hmac); - } - else { - switch (src->macType) { - #ifndef NO_MD5 - case WC_HASH_TYPE_MD5: - wc_Md5Copy((wc_Md5*)&src->hash.digest, - (wc_Md5*)&des->hash.digest); - break; - #endif /* !NO_MD5 */ - - #ifndef NO_SHA - case WC_HASH_TYPE_SHA: - wc_ShaCopy((wc_Sha*)&src->hash.digest, - (wc_Sha*)&des->hash.digest); - break; - #endif /* !NO_SHA */ - - #ifdef WOLFSSL_SHA224 - case WC_HASH_TYPE_SHA224: - wc_Sha224Copy((wc_Sha224*)&src->hash.digest, - (wc_Sha224*)&des->hash.digest); - break; - #endif /* WOLFSSL_SHA224 */ - - #ifndef NO_SHA256 - case WC_HASH_TYPE_SHA256: - wc_Sha256Copy((wc_Sha256*)&src->hash.digest, - (wc_Sha256*)&des->hash.digest); - break; - #endif /* !NO_SHA256 */ - - #ifdef WOLFSSL_SHA384 - case WC_HASH_TYPE_SHA384: - wc_Sha384Copy((wc_Sha384*)&src->hash.digest, - (wc_Sha384*)&des->hash.digest); - break; - #endif /* WOLFSSL_SHA384 */ - #ifdef WOLFSSL_SHA512 - case WC_HASH_TYPE_SHA512: - wc_Sha512Copy((wc_Sha512*)&src->hash.digest, - (wc_Sha512*)&des->hash.digest); - break; - #endif /* WOLFSSL_SHA512 */ - #ifdef WOLFSSL_SHA3 - #ifndef WOLFSSL_NOSHA3_224 - case WC_HASH_TYPE_SHA3_224: - wc_Sha3_224_Copy((wc_Sha3*)&src->hash.digest, - (wc_Sha3*)&des->hash.digest); - break; - #endif - - #ifndef WOLFSSL_NOSHA3_256 - case WC_HASH_TYPE_SHA3_256: - wc_Sha3_256_Copy((wc_Sha3*)&src->hash.digest, - (wc_Sha3*)&des->hash.digest); - break; - #endif - - case WC_HASH_TYPE_SHA3_384: - wc_Sha3_384_Copy((wc_Sha3*)&src->hash.digest, - (wc_Sha3*)&des->hash.digest); - break; - - #ifndef WOLFSSL_NOSHA3_512 - case WC_HASH_TYPE_SHA3_512: - wc_Sha3_512_Copy((wc_Sha3*)&src->hash.digest, - (wc_Sha3*)&des->hash.digest); - break; - #endif - #endif - default: - return WOLFSSL_FAILURE; - } - } - return WOLFSSL_SUCCESS; - } - - - /* copies structure in to the structure out - * - * returns WOLFSSL_SUCCESS on success */ - int wolfSSL_EVP_MD_CTX_copy_ex(WOLFSSL_EVP_MD_CTX *out, const WOLFSSL_EVP_MD_CTX *in) - { - if ((out == NULL) || (in == NULL)) return WOLFSSL_FAILURE; - WOLFSSL_ENTER("EVP_CIPHER_MD_CTX_copy_ex"); - XMEMCPY(out, in, sizeof(WOLFSSL_EVP_MD_CTX)); - if (in->pctx != NULL) { - out->pctx = wolfSSL_EVP_PKEY_CTX_new(in->pctx->pkey, NULL); - if (out->pctx == NULL) - return WOLFSSL_FAILURE; - } - return wolfSSL_EVP_MD_Copy_Hasher(out, (WOLFSSL_EVP_MD_CTX*)in); - } - - void wolfSSL_EVP_MD_CTX_init(WOLFSSL_EVP_MD_CTX* ctx) - { - WOLFSSL_ENTER("EVP_CIPHER_MD_CTX_init"); - XMEMSET(ctx, 0, sizeof(WOLFSSL_EVP_MD_CTX)); - } - - const WOLFSSL_EVP_MD *wolfSSL_EVP_MD_CTX_md(const WOLFSSL_EVP_MD_CTX *ctx) - { - if (ctx == NULL) - return NULL; - WOLFSSL_ENTER("EVP_MD_CTX_md"); - return (const WOLFSSL_EVP_MD *)wolfSSL_EVP_get_md(ctx->macType); - } - - #ifndef NO_AES - - #ifdef HAVE_AES_CBC - #ifdef WOLFSSL_AES_128 - const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_128_cbc(void) - { - WOLFSSL_ENTER("wolfSSL_EVP_aes_128_cbc"); - if (EVP_AES_128_CBC == NULL) - wolfSSL_EVP_init(); - return EVP_AES_128_CBC; - } - #endif /* WOLFSSL_AES_128 */ - - - #ifdef WOLFSSL_AES_192 - const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_192_cbc(void) - { - WOLFSSL_ENTER("wolfSSL_EVP_aes_192_cbc"); - if (EVP_AES_192_CBC == NULL) - wolfSSL_EVP_init(); - return EVP_AES_192_CBC; - } - #endif /* WOLFSSL_AES_192 */ - - - #ifdef WOLFSSL_AES_256 - const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_256_cbc(void) - { - WOLFSSL_ENTER("wolfSSL_EVP_aes_256_cbc"); - if (EVP_AES_256_CBC == NULL) - wolfSSL_EVP_init(); - return EVP_AES_256_CBC; - } - #endif /* WOLFSSL_AES_256 */ - #endif /* HAVE_AES_CBC */ - - #ifdef WOLFSSL_AES_CFB -#if !defined(HAVE_SELFTEST) && !defined(HAVE_FIPS) - #ifdef WOLFSSL_AES_128 - const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_128_cfb1(void) - { - WOLFSSL_ENTER("wolfSSL_EVP_aes_128_cfb1"); - if (EVP_AES_128_CFB1 == NULL) - wolfSSL_EVP_init(); - return EVP_AES_128_CFB1; - } - #endif /* WOLFSSL_AES_128 */ - - #ifdef WOLFSSL_AES_192 - const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_192_cfb1(void) - { - WOLFSSL_ENTER("wolfSSL_EVP_aes_192_cfb1"); - if (EVP_AES_192_CFB1 == NULL) - wolfSSL_EVP_init(); - return EVP_AES_192_CFB1; - } - #endif /* WOLFSSL_AES_192 */ - - #ifdef WOLFSSL_AES_256 - const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_256_cfb1(void) - { - WOLFSSL_ENTER("wolfSSL_EVP_aes_256_cfb1"); - if (EVP_AES_256_CFB1 == NULL) - wolfSSL_EVP_init(); - return EVP_AES_256_CFB1; - } - #endif /* WOLFSSL_AES_256 */ - - #ifdef WOLFSSL_AES_128 - const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_128_cfb8(void) - { - WOLFSSL_ENTER("wolfSSL_EVP_aes_128_cfb8"); - if (EVP_AES_128_CFB8 == NULL) - wolfSSL_EVP_init(); - return EVP_AES_128_CFB8; - } - #endif /* WOLFSSL_AES_128 */ - - #ifdef WOLFSSL_AES_192 - const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_192_cfb8(void) - { - WOLFSSL_ENTER("wolfSSL_EVP_aes_192_cfb8"); - if (EVP_AES_192_CFB8 == NULL) - wolfSSL_EVP_init(); - return EVP_AES_192_CFB8; - } - #endif /* WOLFSSL_AES_192 */ - - #ifdef WOLFSSL_AES_256 - const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_256_cfb8(void) - { - WOLFSSL_ENTER("wolfSSL_EVP_aes_256_cfb8"); - if (EVP_AES_256_CFB8 == NULL) - wolfSSL_EVP_init(); - return EVP_AES_256_CFB8; - } - #endif /* WOLFSSL_AES_256 */ -#endif /* !HAVE_SELFTEST && !HAVE_FIPS */ - - #ifdef WOLFSSL_AES_128 - const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_128_cfb128(void) - { - WOLFSSL_ENTER("wolfSSL_EVP_aes_128_cfb128"); - if (EVP_AES_128_CFB128 == NULL) - wolfSSL_EVP_init(); - return EVP_AES_128_CFB128; - } - #endif /* WOLFSSL_AES_128 */ - - #ifdef WOLFSSL_AES_192 - const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_192_cfb128(void) - { - WOLFSSL_ENTER("wolfSSL_EVP_aes_192_cfb128"); - if (EVP_AES_192_CFB128 == NULL) - wolfSSL_EVP_init(); - return EVP_AES_192_CFB128; - } - #endif /* WOLFSSL_AES_192 */ - - #ifdef WOLFSSL_AES_256 - const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_256_cfb128(void) - { - WOLFSSL_ENTER("wolfSSL_EVP_aes_256_cfb128"); - if (EVP_AES_256_CFB128 == NULL) - wolfSSL_EVP_init(); - return EVP_AES_256_CFB128; - } - #endif /* WOLFSSL_AES_256 */ - #endif /* WOLFSSL_AES_CFB */ - - #ifdef WOLFSSL_AES_OFB - #ifdef WOLFSSL_AES_128 - const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_128_ofb(void) - { - WOLFSSL_ENTER("wolfSSL_EVP_aes_128_ofb"); - if (EVP_AES_128_OFB == NULL) - wolfSSL_EVP_init(); - return EVP_AES_128_OFB; - } - #endif /* WOLFSSL_AES_128 */ - - #ifdef WOLFSSL_AES_192 - const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_192_ofb(void) - { - WOLFSSL_ENTER("wolfSSL_EVP_aes_192_ofb"); - if (EVP_AES_192_OFB == NULL) - wolfSSL_EVP_init(); - return EVP_AES_192_OFB; - } - #endif /* WOLFSSL_AES_192 */ - - #ifdef WOLFSSL_AES_256 - const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_256_ofb(void) - { - WOLFSSL_ENTER("wolfSSL_EVP_aes_256_ofb"); - if (EVP_AES_256_OFB == NULL) - wolfSSL_EVP_init(); - return EVP_AES_256_OFB; - } - #endif /* WOLFSSL_AES_256 */ - #endif /* WOLFSSL_AES_OFB */ - - #ifdef WOLFSSL_AES_XTS - #ifdef WOLFSSL_AES_128 - const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_128_xts(void) - { - WOLFSSL_ENTER("wolfSSL_EVP_aes_128_xts"); - if (EVP_AES_128_XTS == NULL) - wolfSSL_EVP_init(); - return EVP_AES_128_XTS; - } - #endif /* WOLFSSL_AES_128 */ - - #ifdef WOLFSSL_AES_256 - const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_256_xts(void) - { - WOLFSSL_ENTER("wolfSSL_EVP_aes_256_xts"); - if (EVP_AES_256_XTS == NULL) - wolfSSL_EVP_init(); - return EVP_AES_256_XTS; - } - #endif /* WOLFSSL_AES_256 */ - #endif /* WOLFSSL_AES_XTS */ - - #ifdef HAVE_AESGCM - #ifdef WOLFSSL_AES_128 - const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_128_gcm(void) - { - WOLFSSL_ENTER("wolfSSL_EVP_aes_128_gcm"); - if (EVP_AES_128_GCM == NULL) - wolfSSL_EVP_init(); - return EVP_AES_128_GCM; - } - #endif /* WOLFSSL_GCM_128 */ - - #ifdef WOLFSSL_AES_192 - const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_192_gcm(void) - { - WOLFSSL_ENTER("wolfSSL_EVP_aes_192_gcm"); - if (EVP_AES_192_GCM == NULL) - wolfSSL_EVP_init(); - return EVP_AES_192_GCM; - } - #endif /* WOLFSSL_AES_192 */ - - #ifdef WOLFSSL_AES_256 - const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_256_gcm(void) - { - WOLFSSL_ENTER("wolfSSL_EVP_aes_256_gcm"); - if (EVP_AES_256_GCM == NULL) - wolfSSL_EVP_init(); - return EVP_AES_256_GCM; - } - #endif /* WOLFSSL_AES_256 */ - #endif /* HAVE_AESGCM */ - - #ifdef WOLFSSL_AES_128 - const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_128_ctr(void) - { - WOLFSSL_ENTER("wolfSSL_EVP_aes_128_ctr"); - if (EVP_AES_128_CTR == NULL) - wolfSSL_EVP_init(); - return EVP_AES_128_CTR; - } - #endif /* WOLFSSL_AES_2128 */ - - - #ifdef WOLFSSL_AES_192 - const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_192_ctr(void) - { - WOLFSSL_ENTER("wolfSSL_EVP_aes_192_ctr"); - if (EVP_AES_192_CTR == NULL) - wolfSSL_EVP_init(); - return EVP_AES_192_CTR; - } - #endif /* WOLFSSL_AES_192 */ - - - #ifdef WOLFSSL_AES_256 - const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_256_ctr(void) - { - WOLFSSL_ENTER("wolfSSL_EVP_aes_256_ctr"); - if (EVP_AES_256_CTR == NULL) - wolfSSL_EVP_init(); - return EVP_AES_256_CTR; - } - #endif /* WOLFSSL_AES_256 */ - - #ifdef WOLFSSL_AES_128 - const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_128_ecb(void) - { - WOLFSSL_ENTER("wolfSSL_EVP_aes_128_ecb"); - if (EVP_AES_128_ECB == NULL) - wolfSSL_EVP_init(); - return EVP_AES_128_ECB; - } - #endif /* WOLFSSL_AES_128 */ - - - #ifdef WOLFSSL_AES_192 - const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_192_ecb(void) - { - WOLFSSL_ENTER("wolfSSL_EVP_aes_192_ecb"); - if (EVP_AES_192_ECB == NULL) - wolfSSL_EVP_init(); - return EVP_AES_192_ECB; - } - #endif /* WOLFSSL_AES_192*/ - - - #ifdef WOLFSSL_AES_256 - const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_256_ecb(void) - { - WOLFSSL_ENTER("wolfSSL_EVP_aes_256_ecb"); - if (EVP_AES_256_ECB == NULL) - wolfSSL_EVP_init(); - return EVP_AES_256_ECB; - } - #endif /* WOLFSSL_AES_256 */ - #endif /* NO_AES */ - -#ifndef NO_DES3 - const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_des_cbc(void) - { - WOLFSSL_ENTER("wolfSSL_EVP_des_cbc"); - if (EVP_DES_CBC == NULL) - wolfSSL_EVP_init(); - return EVP_DES_CBC; - } -#ifdef WOLFSSL_DES_ECB - const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_des_ecb(void) - { - WOLFSSL_ENTER("wolfSSL_EVP_des_ecb"); - if (EVP_DES_ECB == NULL) - wolfSSL_EVP_init(); - return EVP_DES_ECB; - } -#endif - const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_des_ede3_cbc(void) - { - WOLFSSL_ENTER("wolfSSL_EVP_des_ede3_cbc"); - if (EVP_DES_EDE3_CBC == NULL) - wolfSSL_EVP_init(); - return EVP_DES_EDE3_CBC; - } -#ifdef WOLFSSL_DES_ECB - const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_des_ede3_ecb(void) - { - WOLFSSL_ENTER("wolfSSL_EVP_des_ede3_ecb"); - if (EVP_DES_EDE3_ECB == NULL) - wolfSSL_EVP_init(); - return EVP_DES_EDE3_ECB; - } -#endif -#endif /* NO_DES3 */ - -#ifndef NO_RC4 - const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_rc4(void) - { - static const char* type = "ARC4"; - WOLFSSL_ENTER("wolfSSL_EVP_rc4"); - return type; - } -#endif - -#ifdef HAVE_IDEA - const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_idea_cbc(void) - { - WOLFSSL_ENTER("wolfSSL_EVP_idea_cbc"); - if (EVP_IDEA_CBC == NULL) - wolfSSL_EVP_init(); - return EVP_IDEA_CBC; - } -#endif - const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_enc_null(void) - { - static const char* type = "NULL"; - WOLFSSL_ENTER("wolfSSL_EVP_enc_null"); - return type; - } - - int wolfSSL_EVP_MD_CTX_cleanup(WOLFSSL_EVP_MD_CTX* ctx) - { - WOLFSSL_ENTER("EVP_MD_CTX_cleanup"); - if (ctx->pctx != NULL) - wolfSSL_EVP_PKEY_CTX_free(ctx->pctx); - - if (ctx->macType == (NID_hmac & 0xFF)) { - wc_HmacFree(&ctx->hash.hmac); - } - else { - switch (ctx->macType) { - #ifndef NO_MD5 - case WC_HASH_TYPE_MD5: - wc_Md5Free((wc_Md5*)&ctx->hash.digest); - break; - #endif /* !NO_MD5 */ - - #ifndef NO_SHA - case WC_HASH_TYPE_SHA: - wc_ShaFree((wc_Sha*)&ctx->hash.digest); - break; - #endif /* !NO_SHA */ - - #ifdef WOLFSSL_SHA224 - case WC_HASH_TYPE_SHA224: - wc_Sha224Free((wc_Sha224*)&ctx->hash.digest); - break; - #endif /* WOLFSSL_SHA224 */ - - #ifndef NO_SHA256 - case WC_HASH_TYPE_SHA256: - wc_Sha256Free((wc_Sha256*)&ctx->hash.digest); - break; - #endif /* !NO_SHA256 */ - - #ifdef WOLFSSL_SHA384 - case WC_HASH_TYPE_SHA384: - wc_Sha384Free((wc_Sha384*)&ctx->hash.digest); - break; - #endif /* WOLFSSL_SHA384 */ - #ifdef WOLFSSL_SHA512 - case WC_HASH_TYPE_SHA512: - wc_Sha512Free((wc_Sha512*)&ctx->hash.digest); - break; - #endif /* WOLFSSL_SHA512 */ - #ifdef WOLFSSL_SHA3 - #ifndef WOLFSSL_NOSHA3_224 - case WC_HASH_TYPE_SHA3_224: - wc_Sha3_224_Free((wc_Sha3*)&ctx->hash.digest); - break; - #endif - - #ifndef WOLFSSL_NOSHA3_256 - case WC_HASH_TYPE_SHA3_256: - wc_Sha3_256_Free((wc_Sha3*)&ctx->hash.digest); - break; - #endif - - case WC_HASH_TYPE_SHA3_384: - wc_Sha3_384_Free((wc_Sha3*)&ctx->hash.digest); - break; - - #ifndef WOLFSSL_NOSHA3_512 - case WC_HASH_TYPE_SHA3_512: - wc_Sha3_512_Free((wc_Sha3*)&ctx->hash.digest); - break; - #endif - #endif - default: - return WOLFSSL_FAILURE; - } - } - ForceZero(ctx, sizeof(*ctx)); - ctx->macType = 0xFF; - return 1; - } - - void wolfSSL_EVP_CIPHER_CTX_init(WOLFSSL_EVP_CIPHER_CTX* ctx) - { - WOLFSSL_ENTER("EVP_CIPHER_CTX_init"); - if (ctx) { - XMEMSET(ctx, 0, sizeof(WOLFSSL_EVP_CIPHER_CTX)); - ctx->cipherType = WOLFSSL_EVP_CIPH_TYPE_INIT; /* not yet initialized */ - ctx->keyLen = 0; - ctx->enc = 1; /* start in encrypt mode */ - } - } - -#if defined(HAVE_AESGCM) && !defined(HAVE_SELFTEST) - static WC_INLINE void IncCtr(byte* ctr, word32 ctrSz) - { - int i; - for (i = ctrSz-1; i >= 0; i--) { - if (++ctr[i]) - break; - } - } -#endif - - /* This function allows cipher specific parameters to be - determined and set. */ - int wolfSSL_EVP_CIPHER_CTX_ctrl(WOLFSSL_EVP_CIPHER_CTX *ctx, int type, \ - int arg, void *ptr) - { - int ret = WOLFSSL_FAILURE; -#if defined(HAVE_AESGCM) && !defined(HAVE_SELFTEST) - WC_RNG rng; -#endif - if (ctx == NULL) - return WOLFSSL_FAILURE; - - (void)arg; - (void)ptr; - - WOLFSSL_ENTER("EVP_CIPHER_CTX_ctrl"); - - switch(type) { - case EVP_CTRL_INIT: - wolfSSL_EVP_CIPHER_CTX_init(ctx); - if(ctx) - ret = WOLFSSL_SUCCESS; - break; - case EVP_CTRL_SET_KEY_LENGTH: - ret = wolfSSL_EVP_CIPHER_CTX_set_key_length(ctx, arg); - break; -#if defined(HAVE_AESGCM) && !defined(HAVE_SELFTEST) - case EVP_CTRL_GCM_SET_IVLEN: - if(arg <= 0 || arg > 16) - return WOLFSSL_FAILURE; - ret = wolfSSL_EVP_CIPHER_CTX_set_iv_length(ctx, arg); - break; - case EVP_CTRL_AEAD_SET_IV_FIXED: - if (arg == -1) { - /* arg == -1 copies ctx->ivSz from ptr */ - ret = wolfSSL_EVP_CIPHER_CTX_set_iv(ctx, (byte*)ptr, ctx->ivSz); - } - else { - /* - * Fixed field must be at least 4 bytes and invocation - * field at least 8. - */ - if ((arg < 4) || (ctx->ivSz - arg) < 8) { - WOLFSSL_MSG("Fixed field or invocation field too short"); - ret = WOLFSSL_FAILURE; - break; - } - if (wc_InitRng(&rng) != 0) { - WOLFSSL_MSG("wc_InitRng failed"); - ret = WOLFSSL_FAILURE; - break; - } - if (arg) { - XMEMCPY(ctx->iv, ptr, arg); - } - if (wc_RNG_GenerateBlock(&rng, ctx->iv + arg, - ctx->ivSz - arg) != 0) { - /* rng is freed immediately after if block so no need - * to do it here - */ - WOLFSSL_MSG("wc_RNG_GenerateBlock failed"); - ret = WOLFSSL_FAILURE; - } - - if (wc_FreeRng(&rng) != 0) { - WOLFSSL_MSG("wc_FreeRng failed"); - ret = WOLFSSL_FAILURE; - break; - } - } - break; -#if !defined(_WIN32) && !defined(HAVE_FIPS) - case EVP_CTRL_GCM_IV_GEN: - if (ctx->cipher.aes.keylen == 0 || ctx->ivSz == 0) { - ret = WOLFSSL_FAILURE; - WOLFSSL_MSG("Key or IV not set"); - break; - } - if ((ret = wc_AesGcmSetExtIV(&ctx->cipher.aes, ctx->iv, ctx->ivSz)) != 0) { - WOLFSSL_MSG("wc_AesGcmSetIV failed"); - ret = WOLFSSL_FAILURE; - } - /* OpenSSL increments the IV. Not sure why */ - IncCtr(ctx->iv, ctx->ivSz); - break; -#endif - case EVP_CTRL_AEAD_SET_TAG: - if(arg <= 0 || arg > 16 || (ptr == NULL)) - return WOLFSSL_FAILURE; - - XMEMCPY(ctx->authTag, ptr, arg); - ctx->authTagSz = arg; - ret = WOLFSSL_SUCCESS; - - break; - case EVP_CTRL_AEAD_GET_TAG: - if(arg <= 0 || arg > 16) - return WOLFSSL_FAILURE; - - XMEMCPY(ptr, ctx->authTag, arg); - ret = WOLFSSL_SUCCESS; - break; -#endif /* HAVE_AESGCM && !HAVE_SELFTEST */ - default: - WOLFSSL_MSG("EVP_CIPHER_CTX_ctrl operation not yet handled"); - ret = WOLFSSL_FAILURE; - } - return ret; - } - - /* WOLFSSL_SUCCESS on ok */ - int wolfSSL_EVP_CIPHER_CTX_cleanup(WOLFSSL_EVP_CIPHER_CTX* ctx) - { - WOLFSSL_ENTER("EVP_CIPHER_CTX_cleanup"); - if (ctx) { - ctx->cipherType = WOLFSSL_EVP_CIPH_TYPE_INIT; /* not yet initialized */ - ctx->keyLen = 0; - } - - return WOLFSSL_SUCCESS; - } - - /* Permanent stub for Qt compilation. */ - #if defined(WOLFSSL_QT) && !defined(NO_WOLFSSL_STUB) - const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_rc2_cbc(void) - { - WOLFSSL_ENTER("wolfSSL_EVP_rc2_cbc"); - WOLFSSL_STUB("EVP_rc2_cbc"); - return NULL; - } - #endif - -#ifndef NO_AES - static int AesSetKey_ex(Aes* aes, const byte* key, word32 len, - const byte* iv, int dir, int direct) - { - int ret; - /* wc_AesSetKey clear aes.reg if iv == NULL. - Keep IV for openSSL compatibility */ - if (iv == NULL) - XMEMCPY((byte *)aes->tmp, (byte *)aes->reg, AES_BLOCK_SIZE); - if (direct) { - #if defined(WOLFSSL_AES_DIRECT) - ret = wc_AesSetKeyDirect(aes, key, len, iv, dir); - #else - ret = NOT_COMPILED_IN; - #endif - } - else { - ret = wc_AesSetKey(aes, key, len, iv, dir); - } - if (iv == NULL) - XMEMCPY((byte *)aes->reg, (byte *)aes->tmp, AES_BLOCK_SIZE); - return ret; - } -#endif - - /* return WOLFSSL_SUCCESS on ok, 0 on failure to match API compatibility */ - int wolfSSL_EVP_CipherInit(WOLFSSL_EVP_CIPHER_CTX* ctx, - const WOLFSSL_EVP_CIPHER* type, const byte* key, - const byte* iv, int enc) - { - int ret = 0; - (void)key; - (void)iv; - (void)enc; - - WOLFSSL_ENTER("wolfSSL_EVP_CipherInit"); - if (ctx == NULL) { - WOLFSSL_MSG("no ctx"); - return WOLFSSL_FAILURE; - } - - if (type == NULL && ctx->cipherType == WOLFSSL_EVP_CIPH_TYPE_INIT) { - WOLFSSL_MSG("no type set"); - return WOLFSSL_FAILURE; - } - if (ctx->cipherType == WOLFSSL_EVP_CIPH_TYPE_INIT){ - /* only first EVP_CipherInit invoke. ctx->cipherType is set below */ - XMEMSET(&ctx->cipher, 0, sizeof(ctx->cipher)); - ctx->flags = 0; - } - /* always clear buffer state */ - ctx->bufUsed = 0; - ctx->lastUsed = 0; - -#ifdef HAVE_WOLFSSL_EVP_CIPHER_CTX_IV - if (!iv && ctx->ivSz) { - iv = ctx->iv; - } -#endif - -#ifndef NO_AES - #ifdef HAVE_AES_CBC - #ifdef WOLFSSL_AES_128 - if (ctx->cipherType == AES_128_CBC_TYPE || - (type && XSTRNCMP(type, EVP_AES_128_CBC, EVP_AES_SIZE) == 0)) { - WOLFSSL_MSG("EVP_AES_128_CBC"); - ctx->cipherType = AES_128_CBC_TYPE; - ctx->flags &= ~WOLFSSL_EVP_CIPH_MODE; - ctx->flags |= WOLFSSL_EVP_CIPH_CBC_MODE; - ctx->keyLen = 16; - ctx->block_size = AES_BLOCK_SIZE; - ctx->ivSz = AES_BLOCK_SIZE; - if (enc == 0 || enc == 1) - ctx->enc = enc ? 1 : 0; - if (key) { - ret = AesSetKey_ex(&ctx->cipher.aes, key, ctx->keyLen, iv, - ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION, 0); - if (ret != 0) - return WOLFSSL_FAILURE; - } - if (iv && key == NULL) { - ret = wc_AesSetIV(&ctx->cipher.aes, iv); - if (ret != 0) - return WOLFSSL_FAILURE; - } - } - #endif /* WOLFSSL_AES_128 */ - #ifdef WOLFSSL_AES_192 - if (ctx->cipherType == AES_192_CBC_TYPE || - (type && XSTRNCMP(type, EVP_AES_192_CBC, EVP_AES_SIZE) == 0)) { - WOLFSSL_MSG("EVP_AES_192_CBC"); - ctx->cipherType = AES_192_CBC_TYPE; - ctx->flags &= ~WOLFSSL_EVP_CIPH_MODE; - ctx->flags |= WOLFSSL_EVP_CIPH_CBC_MODE; - ctx->keyLen = 24; - ctx->block_size = AES_BLOCK_SIZE; - ctx->ivSz = AES_BLOCK_SIZE; - if (enc == 0 || enc == 1) - ctx->enc = enc ? 1 : 0; - if (key) { - ret = AesSetKey_ex(&ctx->cipher.aes, key, ctx->keyLen, iv, - ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION, 0); - if (ret != 0) - return WOLFSSL_FAILURE; - } - if (iv && key == NULL) { - ret = wc_AesSetIV(&ctx->cipher.aes, iv); - if (ret != 0) - return WOLFSSL_FAILURE; - } - } - #endif /* WOLFSSL_AES_192 */ - #ifdef WOLFSSL_AES_256 - if (ctx->cipherType == AES_256_CBC_TYPE || - (type && XSTRNCMP(type, EVP_AES_256_CBC, EVP_AES_SIZE) == 0)) { - WOLFSSL_MSG("EVP_AES_256_CBC"); - ctx->cipherType = AES_256_CBC_TYPE; - ctx->flags &= ~WOLFSSL_EVP_CIPH_MODE; - ctx->flags |= WOLFSSL_EVP_CIPH_CBC_MODE; - ctx->keyLen = 32; - ctx->block_size = AES_BLOCK_SIZE; - ctx->ivSz = AES_BLOCK_SIZE; - if (enc == 0 || enc == 1) - ctx->enc = enc ? 1 : 0; - if (key) { - ret = AesSetKey_ex(&ctx->cipher.aes, key, ctx->keyLen, iv, - ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION, 0); - if (ret != 0){ - WOLFSSL_MSG("AesSetKey() failed"); - return WOLFSSL_FAILURE; - } - } - if (iv && key == NULL) { - ret = wc_AesSetIV(&ctx->cipher.aes, iv); - if (ret != 0){ - WOLFSSL_MSG("wc_AesSetIV() failed"); - return WOLFSSL_FAILURE; - } - } - } - #endif /* WOLFSSL_AES_256 */ - #endif /* HAVE_AES_CBC */ -#if !defined(_WIN32) && !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) - #ifdef HAVE_AESGCM - #ifdef WOLFSSL_AES_128 - if (ctx->cipherType == AES_128_GCM_TYPE || - (type && XSTRNCMP(type, EVP_AES_128_GCM, EVP_AES_SIZE) == 0)) { - WOLFSSL_MSG("EVP_AES_128_GCM"); - ctx->cipherType = AES_128_GCM_TYPE; - ctx->flags &= ~WOLFSSL_EVP_CIPH_MODE; - ctx->flags |= WOLFSSL_EVP_CIPH_GCM_MODE; - ctx->keyLen = 16; - ctx->block_size = AES_BLOCK_SIZE; - ctx->authTagSz = AES_BLOCK_SIZE; - ctx->ivSz = GCM_NONCE_MID_SZ; - - XMEMSET(ctx->authTag, 0, ctx->authTagSz); - if (key && wc_AesGcmSetKey(&ctx->cipher.aes, key, ctx->keyLen)) { - WOLFSSL_MSG("wc_AesGcmSetKey() failed"); - return WOLFSSL_FAILURE; - } - if (iv && wc_AesGcmSetExtIV(&ctx->cipher.aes, iv, GCM_NONCE_MID_SZ)) { - WOLFSSL_MSG("wc_AesGcmSetExtIV() failed"); - return WOLFSSL_FAILURE; - } - if (enc == 0 || enc == 1) - ctx->enc = enc ? 1 : 0; - } - #endif /* WOLFSSL_AES_128 */ - #ifdef WOLFSSL_AES_192 - if (ctx->cipherType == AES_192_GCM_TYPE || - (type && XSTRNCMP(type, EVP_AES_192_GCM, EVP_AES_SIZE) == 0)) { - WOLFSSL_MSG("EVP_AES_192_GCM"); - ctx->cipherType = AES_192_GCM_TYPE; - ctx->flags &= ~WOLFSSL_EVP_CIPH_MODE; - ctx->flags |= WOLFSSL_EVP_CIPH_GCM_MODE; - ctx->keyLen = 24; - ctx->block_size = AES_BLOCK_SIZE; - ctx->authTagSz = AES_BLOCK_SIZE; - ctx->ivSz = GCM_NONCE_MID_SZ; - - XMEMSET(ctx->authTag, 0, ctx->authTagSz); - if (key && wc_AesGcmSetKey(&ctx->cipher.aes, key, ctx->keyLen)) { - WOLFSSL_MSG("wc_AesGcmSetKey() failed"); - return WOLFSSL_FAILURE; - } - if (iv && wc_AesGcmSetExtIV(&ctx->cipher.aes, iv, GCM_NONCE_MID_SZ)) { - WOLFSSL_MSG("wc_AesGcmSetExtIV() failed"); - return WOLFSSL_FAILURE; - } - if (enc == 0 || enc == 1) - ctx->enc = enc ? 1 : 0; - } - #endif /* WOLFSSL_AES_192 */ - #ifdef WOLFSSL_AES_256 - if (ctx->cipherType == AES_256_GCM_TYPE || - (type && XSTRNCMP(type, EVP_AES_256_GCM, EVP_AES_SIZE) == 0)) { - WOLFSSL_MSG("EVP_AES_256_GCM"); - ctx->cipherType = AES_256_GCM_TYPE; - ctx->flags &= ~WOLFSSL_EVP_CIPH_MODE; - ctx->flags |= WOLFSSL_EVP_CIPH_GCM_MODE; - ctx->keyLen = 32; - ctx->block_size = AES_BLOCK_SIZE; - ctx->authTagSz = AES_BLOCK_SIZE; - ctx->ivSz = GCM_NONCE_MID_SZ; - - XMEMSET(ctx->authTag, 0, ctx->authTagSz); - if (key && wc_AesGcmSetKey(&ctx->cipher.aes, key, ctx->keyLen)) { - WOLFSSL_MSG("wc_AesGcmSetKey() failed"); - return WOLFSSL_FAILURE; - } - if (iv && wc_AesGcmSetExtIV(&ctx->cipher.aes, iv, GCM_NONCE_MID_SZ)) { - WOLFSSL_MSG("wc_AesGcmSetExtIV() failed"); - return WOLFSSL_FAILURE; - } - if (enc == 0 || enc == 1) - ctx->enc = enc ? 1 : 0; - } - #endif /* WOLFSSL_AES_256 */ - #endif /* HAVE_AESGCM */ -#endif /* !defined(_WIN32) && !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) */ -#ifdef WOLFSSL_AES_COUNTER - #ifdef WOLFSSL_AES_128 - if (ctx->cipherType == AES_128_CTR_TYPE || - (type && XSTRNCMP(type, EVP_AES_128_CTR, EVP_AES_SIZE) == 0)) { - WOLFSSL_MSG("EVP_AES_128_CTR"); - ctx->flags &= ~WOLFSSL_EVP_CIPH_MODE; - ctx->cipherType = AES_128_CTR_TYPE; - ctx->flags |= WOLFSSL_EVP_CIPH_CTR_MODE; - ctx->keyLen = 16; - ctx->block_size = NO_PADDING_BLOCK_SIZE; - ctx->ivSz = AES_BLOCK_SIZE; -#if defined(WOLFSSL_AES_COUNTER) || defined(WOLFSSL_AES_CFB) - ctx->cipher.aes.left = 0; -#endif - if (enc == 0 || enc == 1) - ctx->enc = enc ? 1 : 0; - if (key) { - ret = AesSetKey_ex(&ctx->cipher.aes, key, ctx->keyLen, iv, - AES_ENCRYPTION, 1); - if (ret != 0) - return WOLFSSL_FAILURE; - } - if (iv && key == NULL) { - ret = wc_AesSetIV(&ctx->cipher.aes, iv); - if (ret != 0) - return WOLFSSL_FAILURE; - } - } - #endif /* WOLFSSL_AES_128 */ - #ifdef WOLFSSL_AES_192 - if (ctx->cipherType == AES_192_CTR_TYPE || - (type && XSTRNCMP(type, EVP_AES_192_CTR, EVP_AES_SIZE) == 0)) { - WOLFSSL_MSG("EVP_AES_192_CTR"); - ctx->cipherType = AES_192_CTR_TYPE; - ctx->flags &= ~WOLFSSL_EVP_CIPH_MODE; - ctx->flags |= WOLFSSL_EVP_CIPH_CTR_MODE; - ctx->keyLen = 24; - ctx->block_size = NO_PADDING_BLOCK_SIZE; - ctx->ivSz = AES_BLOCK_SIZE; -#if defined(WOLFSSL_AES_COUNTER) || defined(WOLFSSL_AES_CFB) - ctx->cipher.aes.left = 0; -#endif - if (enc == 0 || enc == 1) - ctx->enc = enc ? 1 : 0; - if (key) { - ret = AesSetKey_ex(&ctx->cipher.aes, key, ctx->keyLen, iv, - AES_ENCRYPTION, 1); - if (ret != 0) - return WOLFSSL_FAILURE; - } - if (iv && key == NULL) { - ret = wc_AesSetIV(&ctx->cipher.aes, iv); - if (ret != 0) - return WOLFSSL_FAILURE; - } - } - #endif /* WOLFSSL_AES_192 */ - #ifdef WOLFSSL_AES_256 - if (ctx->cipherType == AES_256_CTR_TYPE || - (type && XSTRNCMP(type, EVP_AES_256_CTR, EVP_AES_SIZE) == 0)) { - WOLFSSL_MSG("EVP_AES_256_CTR"); - ctx->cipherType = AES_256_CTR_TYPE; - ctx->flags &= ~WOLFSSL_EVP_CIPH_MODE; - ctx->flags |= WOLFSSL_EVP_CIPH_CTR_MODE; - ctx->keyLen = 32; - ctx->block_size = NO_PADDING_BLOCK_SIZE; - ctx->ivSz = AES_BLOCK_SIZE; -#if defined(WOLFSSL_AES_COUNTER) || defined(WOLFSSL_AES_CFB) - ctx->cipher.aes.left = 0; -#endif - if (enc == 0 || enc == 1) - ctx->enc = enc ? 1 : 0; - if (key) { - ret = AesSetKey_ex(&ctx->cipher.aes, key, ctx->keyLen, iv, - AES_ENCRYPTION, 1); - if (ret != 0) - return WOLFSSL_FAILURE; - } - if (iv && key == NULL) { - ret = wc_AesSetIV(&ctx->cipher.aes, iv); - if (ret != 0) - return WOLFSSL_FAILURE; - } - } - #endif /* WOLFSSL_AES_256 */ -#endif /* WOLFSSL_AES_COUNTER */ - #ifdef WOLFSSL_AES_128 - if (ctx->cipherType == AES_128_ECB_TYPE || - (type && XSTRNCMP(type, EVP_AES_128_ECB, EVP_AES_SIZE) == 0)) { - WOLFSSL_MSG("EVP_AES_128_ECB"); - ctx->cipherType = AES_128_ECB_TYPE; - ctx->flags &= ~WOLFSSL_EVP_CIPH_MODE; - ctx->flags |= WOLFSSL_EVP_CIPH_ECB_MODE; - ctx->keyLen = 16; - ctx->block_size = AES_BLOCK_SIZE; - if (enc == 0 || enc == 1) - ctx->enc = enc ? 1 : 0; - if (key) { - ret = AesSetKey_ex(&ctx->cipher.aes, key, ctx->keyLen, NULL, - ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION, 1); - } - if (ret != 0) - return WOLFSSL_FAILURE; - } - #endif /* WOLFSSL_AES_128 */ - #ifdef WOLFSSL_AES_192 - if (ctx->cipherType == AES_192_ECB_TYPE || - (type && XSTRNCMP(type, EVP_AES_192_ECB, EVP_AES_SIZE) == 0)) { - WOLFSSL_MSG("EVP_AES_192_ECB"); - ctx->cipherType = AES_192_ECB_TYPE; - ctx->flags &= ~WOLFSSL_EVP_CIPH_MODE; - ctx->flags |= WOLFSSL_EVP_CIPH_ECB_MODE; - ctx->keyLen = 24; - ctx->block_size = AES_BLOCK_SIZE; - if (enc == 0 || enc == 1) - ctx->enc = enc ? 1 : 0; - if (key) { - ret = AesSetKey_ex(&ctx->cipher.aes, key, ctx->keyLen, NULL, - ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION, 1); - } - if (ret != 0) - return WOLFSSL_FAILURE; - } - #endif /* WOLFSSL_AES_192 */ - #ifdef WOLFSSL_AES_256 - if (ctx->cipherType == AES_256_ECB_TYPE || - (type && XSTRNCMP(type, EVP_AES_256_ECB, EVP_AES_SIZE) == 0)) { - WOLFSSL_MSG("EVP_AES_256_ECB"); - ctx->cipherType = AES_256_ECB_TYPE; - ctx->flags &= ~WOLFSSL_EVP_CIPH_MODE; - ctx->flags |= WOLFSSL_EVP_CIPH_ECB_MODE; - ctx->keyLen = 32; - ctx->block_size = AES_BLOCK_SIZE; - if (enc == 0 || enc == 1) - ctx->enc = enc ? 1 : 0; - if (key) { - ret = AesSetKey_ex(&ctx->cipher.aes, key, ctx->keyLen, NULL, - ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION, 1); - } - if (ret != 0) - return WOLFSSL_FAILURE; - } - #endif /* WOLFSSL_AES_256 */ - #ifdef WOLFSSL_AES_CFB - #ifdef WOLFSSL_AES_128 - if (ctx->cipherType == AES_128_CFB1_TYPE || - (type && XSTRNCMP(type, EVP_AES_128_CFB1, EVP_AESCFB_SIZE) == 0)) { - WOLFSSL_MSG("EVP_AES_128_CFB1"); - ctx->cipherType = AES_128_CFB1_TYPE; - ctx->flags &= ~WOLFSSL_EVP_CIPH_MODE; - ctx->flags |= WOLFSSL_EVP_CIPH_CFB_MODE; - ctx->keyLen = 16; - ctx->block_size = 1; - if (enc == 0 || enc == 1) - ctx->enc = enc ? 1 : 0; - if (key) { - ret = AesSetKey_ex(&ctx->cipher.aes, key, ctx->keyLen, iv, - AES_ENCRYPTION, 0); - if (ret != 0) - return WOLFSSL_FAILURE; - } - if (iv && key == NULL) { - ret = wc_AesSetIV(&ctx->cipher.aes, iv); - if (ret != 0) - return WOLFSSL_FAILURE; - } - } - #endif /* WOLFSSL_AES_128 */ - #ifdef WOLFSSL_AES_192 - if (ctx->cipherType == AES_192_CFB1_TYPE || - (type && XSTRNCMP(type, EVP_AES_192_CFB1, EVP_AESCFB_SIZE) == 0)) { - WOLFSSL_MSG("EVP_AES_192_CFB1"); - ctx->cipherType = AES_192_CFB1_TYPE; - ctx->flags &= ~WOLFSSL_EVP_CIPH_MODE; - ctx->flags |= WOLFSSL_EVP_CIPH_CFB_MODE; - ctx->keyLen = 24; - ctx->block_size = 1; - if (enc == 0 || enc == 1) - ctx->enc = enc ? 1 : 0; - if (key) { - ret = AesSetKey_ex(&ctx->cipher.aes, key, ctx->keyLen, iv, - AES_ENCRYPTION, 0); - if (ret != 0) - return WOLFSSL_FAILURE; - } - if (iv && key == NULL) { - ret = wc_AesSetIV(&ctx->cipher.aes, iv); - if (ret != 0) - return WOLFSSL_FAILURE; - } - } - #endif /* WOLFSSL_AES_192 */ - #ifdef WOLFSSL_AES_256 - if (ctx->cipherType == AES_256_CFB1_TYPE || - (type && XSTRNCMP(type, EVP_AES_256_CFB1, EVP_AESCFB_SIZE) == 0)) { - WOLFSSL_MSG("EVP_AES_256_CFB1"); - ctx->cipherType = AES_256_CFB1_TYPE; - ctx->flags &= ~WOLFSSL_EVP_CIPH_MODE; - ctx->flags |= WOLFSSL_EVP_CIPH_CFB_MODE; - ctx->keyLen = 32; - ctx->block_size = 1; - if (enc == 0 || enc == 1) - ctx->enc = enc ? 1 : 0; - if (key) { - ret = AesSetKey_ex(&ctx->cipher.aes, key, ctx->keyLen, iv, - AES_ENCRYPTION, 0); - if (ret != 0){ - WOLFSSL_MSG("AesSetKey() failed"); - return WOLFSSL_FAILURE; - } - } - if (iv && key == NULL) { - ret = wc_AesSetIV(&ctx->cipher.aes, iv); - if (ret != 0){ - WOLFSSL_MSG("wc_AesSetIV() failed"); - return WOLFSSL_FAILURE; - } - } - } - #endif /* WOLFSSL_AES_256 */ - #ifdef WOLFSSL_AES_128 - if (ctx->cipherType == AES_128_CFB8_TYPE || - (type && XSTRNCMP(type, EVP_AES_128_CFB8, EVP_AESCFB_SIZE) == 0)) { - WOLFSSL_MSG("EVP_AES_128_CFB8"); - ctx->cipherType = AES_128_CFB8_TYPE; - ctx->flags &= ~WOLFSSL_EVP_CIPH_MODE; - ctx->flags |= WOLFSSL_EVP_CIPH_CFB_MODE; - ctx->keyLen = 16; - ctx->block_size = 1; - if (enc == 0 || enc == 1) - ctx->enc = enc ? 1 : 0; - if (key) { - ret = AesSetKey_ex(&ctx->cipher.aes, key, ctx->keyLen, iv, - AES_ENCRYPTION, 0); - if (ret != 0) - return WOLFSSL_FAILURE; - } - if (iv && key == NULL) { - ret = wc_AesSetIV(&ctx->cipher.aes, iv); - if (ret != 0) - return WOLFSSL_FAILURE; - } - } - #endif /* WOLFSSL_AES_128 */ - #ifdef WOLFSSL_AES_192 - if (ctx->cipherType == AES_192_CFB8_TYPE || - (type && XSTRNCMP(type, EVP_AES_192_CFB8, EVP_AESCFB_SIZE) == 0)) { - WOLFSSL_MSG("EVP_AES_192_CFB8"); - ctx->cipherType = AES_192_CFB8_TYPE; - ctx->flags &= ~WOLFSSL_EVP_CIPH_MODE; - ctx->flags |= WOLFSSL_EVP_CIPH_CFB_MODE; - ctx->keyLen = 24; - ctx->block_size = 1; - if (enc == 0 || enc == 1) - ctx->enc = enc ? 1 : 0; - if (key) { - ret = AesSetKey_ex(&ctx->cipher.aes, key, ctx->keyLen, iv, - AES_ENCRYPTION, 0); - if (ret != 0) - return WOLFSSL_FAILURE; - } - if (iv && key == NULL) { - ret = wc_AesSetIV(&ctx->cipher.aes, iv); - if (ret != 0) - return WOLFSSL_FAILURE; - } - } - #endif /* WOLFSSL_AES_192 */ - #ifdef WOLFSSL_AES_256 - if (ctx->cipherType == AES_256_CFB8_TYPE || - (type && XSTRNCMP(type, EVP_AES_256_CFB8, EVP_AESCFB_SIZE) == 0)) { - WOLFSSL_MSG("EVP_AES_256_CFB8"); - ctx->cipherType = AES_256_CFB8_TYPE; - ctx->flags &= ~WOLFSSL_EVP_CIPH_MODE; - ctx->flags |= WOLFSSL_EVP_CIPH_CFB_MODE; - ctx->keyLen = 32; - ctx->block_size = 1; - if (enc == 0 || enc == 1) - ctx->enc = enc ? 1 : 0; - if (key) { - ret = AesSetKey_ex(&ctx->cipher.aes, key, ctx->keyLen, iv, - AES_ENCRYPTION, 0); - if (ret != 0){ - WOLFSSL_MSG("AesSetKey() failed"); - return WOLFSSL_FAILURE; - } - } - if (iv && key == NULL) { - ret = wc_AesSetIV(&ctx->cipher.aes, iv); - if (ret != 0){ - WOLFSSL_MSG("wc_AesSetIV() failed"); - return WOLFSSL_FAILURE; - } - } - } - #endif /* WOLFSSL_AES_256 */ - #ifdef WOLFSSL_AES_128 - if (ctx->cipherType == AES_128_CFB128_TYPE || - (type && XSTRNCMP(type, EVP_AES_128_CFB128, EVP_AESCFB_SIZE) == 0)) { - WOLFSSL_MSG("EVP_AES_128_CFB128"); - ctx->cipherType = AES_128_CFB128_TYPE; - ctx->flags &= ~WOLFSSL_EVP_CIPH_MODE; - ctx->flags |= WOLFSSL_EVP_CIPH_CFB_MODE; - ctx->keyLen = 16; - ctx->block_size = 1; - if (enc == 0 || enc == 1) - ctx->enc = enc ? 1 : 0; - if (key) { - ret = AesSetKey_ex(&ctx->cipher.aes, key, ctx->keyLen, iv, - AES_ENCRYPTION, 0); - if (ret != 0) - return WOLFSSL_FAILURE; - } - if (iv && key == NULL) { - ret = wc_AesSetIV(&ctx->cipher.aes, iv); - if (ret != 0) - return WOLFSSL_FAILURE; - } - } - #endif /* WOLFSSL_AES_128 */ - #ifdef WOLFSSL_AES_192 - if (ctx->cipherType == AES_192_CFB128_TYPE || - (type && XSTRNCMP(type, EVP_AES_192_CFB128, EVP_AESCFB_SIZE) == 0)) { - WOLFSSL_MSG("EVP_AES_192_CFB128"); - ctx->cipherType = AES_192_CFB128_TYPE; - ctx->flags &= ~WOLFSSL_EVP_CIPH_MODE; - ctx->flags |= WOLFSSL_EVP_CIPH_CFB_MODE; - ctx->keyLen = 24; - ctx->block_size = 1; - if (enc == 0 || enc == 1) - ctx->enc = enc ? 1 : 0; - if (key) { - ret = AesSetKey_ex(&ctx->cipher.aes, key, ctx->keyLen, iv, - AES_ENCRYPTION, 0); - if (ret != 0) - return WOLFSSL_FAILURE; - } - if (iv && key == NULL) { - ret = wc_AesSetIV(&ctx->cipher.aes, iv); - if (ret != 0) - return WOLFSSL_FAILURE; - } - } - #endif /* WOLFSSL_AES_192 */ - #ifdef WOLFSSL_AES_256 - if (ctx->cipherType == AES_256_CFB128_TYPE || - (type && XSTRNCMP(type, EVP_AES_256_CFB128, EVP_AESCFB_SIZE) == 0)) { - WOLFSSL_MSG("EVP_AES_256_CFB128"); - ctx->cipherType = AES_256_CFB128_TYPE; - ctx->flags &= ~WOLFSSL_EVP_CIPH_MODE; - ctx->flags |= WOLFSSL_EVP_CIPH_CFB_MODE; - ctx->keyLen = 32; - ctx->block_size = 1; - if (enc == 0 || enc == 1) - ctx->enc = enc ? 1 : 0; - if (key) { - ret = AesSetKey_ex(&ctx->cipher.aes, key, ctx->keyLen, iv, - AES_ENCRYPTION, 0); - if (ret != 0){ - WOLFSSL_MSG("AesSetKey() failed"); - return WOLFSSL_FAILURE; - } - } - if (iv && key == NULL) { - ret = wc_AesSetIV(&ctx->cipher.aes, iv); - if (ret != 0){ - WOLFSSL_MSG("wc_AesSetIV() failed"); - return WOLFSSL_FAILURE; - } - } - } - #endif /* WOLFSSL_AES_256 */ - #endif /* HAVE_AES_CFB */ - #ifdef WOLFSSL_AES_OFB - #ifdef WOLFSSL_AES_128 - if (ctx->cipherType == AES_128_OFB_TYPE || - (type && XSTRNCMP(type, EVP_AES_128_OFB, EVP_AES_SIZE) == 0)) { - WOLFSSL_MSG("EVP_AES_128_OFB"); - ctx->cipherType = AES_128_OFB_TYPE; - ctx->flags &= ~WOLFSSL_EVP_CIPH_MODE; - ctx->flags |= WOLFSSL_EVP_CIPH_OFB_MODE; - ctx->keyLen = 16; - ctx->block_size = 1; - if (enc == 0 || enc == 1) - ctx->enc = enc ? 1 : 0; - if (key) { - ret = AesSetKey_ex(&ctx->cipher.aes, key, ctx->keyLen, iv, - AES_ENCRYPTION, 0); - if (ret != 0) - return WOLFSSL_FAILURE; - } - if (iv && key == NULL) { - ret = wc_AesSetIV(&ctx->cipher.aes, iv); - if (ret != 0) - return WOLFSSL_FAILURE; - } - } - #endif /* WOLFSSL_AES_128 */ - #ifdef WOLFSSL_AES_192 - if (ctx->cipherType == AES_192_OFB_TYPE || - (type && XSTRNCMP(type, EVP_AES_192_OFB, EVP_AES_SIZE) == 0)) { - WOLFSSL_MSG("EVP_AES_192_OFB"); - ctx->cipherType = AES_192_OFB_TYPE; - ctx->flags &= ~WOLFSSL_EVP_CIPH_MODE; - ctx->flags |= WOLFSSL_EVP_CIPH_OFB_MODE; - ctx->keyLen = 24; - ctx->block_size = 1; - if (enc == 0 || enc == 1) - ctx->enc = enc ? 1 : 0; - if (key) { - ret = AesSetKey_ex(&ctx->cipher.aes, key, ctx->keyLen, iv, - AES_ENCRYPTION, 0); - if (ret != 0) - return WOLFSSL_FAILURE; - } - if (iv && key == NULL) { - ret = wc_AesSetIV(&ctx->cipher.aes, iv); - if (ret != 0) - return WOLFSSL_FAILURE; - } - } - #endif /* WOLFSSL_AES_192 */ - #ifdef WOLFSSL_AES_256 - if (ctx->cipherType == AES_256_OFB_TYPE || - (type && XSTRNCMP(type, EVP_AES_256_OFB, EVP_AES_SIZE) == 0)) { - WOLFSSL_MSG("EVP_AES_256_OFB"); - ctx->cipherType = AES_256_OFB_TYPE; - ctx->flags &= ~WOLFSSL_EVP_CIPH_MODE; - ctx->flags |= WOLFSSL_EVP_CIPH_OFB_MODE; - ctx->keyLen = 32; - ctx->block_size = 1; - if (enc == 0 || enc == 1) - ctx->enc = enc ? 1 : 0; - if (key) { - ret = AesSetKey_ex(&ctx->cipher.aes, key, ctx->keyLen, iv, - AES_ENCRYPTION, 0); - if (ret != 0){ - WOLFSSL_MSG("AesSetKey() failed"); - return WOLFSSL_FAILURE; - } - } - if (iv && key == NULL) { - ret = wc_AesSetIV(&ctx->cipher.aes, iv); - if (ret != 0){ - WOLFSSL_MSG("wc_AesSetIV() failed"); - return WOLFSSL_FAILURE; - } - } - } - #endif /* WOLFSSL_AES_256 */ - #endif /* HAVE_AES_OFB */ - #ifdef WOLFSSL_AES_XTS - #ifdef WOLFSSL_AES_128 - if (ctx->cipherType == AES_128_XTS_TYPE || - (type && XSTRNCMP(type, EVP_AES_128_XTS, EVP_AES_SIZE) == 0)) { - WOLFSSL_MSG("EVP_AES_128_XTS"); - ctx->cipherType = AES_128_XTS_TYPE; - ctx->flags &= ~WOLFSSL_EVP_CIPH_MODE; - ctx->flags |= WOLFSSL_EVP_CIPH_XTS_MODE; - ctx->keyLen = 32; - ctx->block_size = 1; - ctx->ivSz = AES_BLOCK_SIZE; - - if (iv != NULL) { - if (iv != ctx->iv) /* Valgrind error when src == dst */ - XMEMCPY(ctx->iv, iv, ctx->ivSz); - } - else - XMEMSET(ctx->iv, 0, AES_BLOCK_SIZE); - - if (enc == 0 || enc == 1) - ctx->enc = enc ? 1 : 0; - if (key) { - ret = wc_AesXtsSetKey(&ctx->cipher.xts, key, ctx->keyLen, - ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION, NULL, 0); - if (ret != 0) { - WOLFSSL_MSG("wc_AesXtsSetKey() failed"); - return WOLFSSL_FAILURE; - } - } - } - #endif /* WOLFSSL_AES_128 */ - #ifdef WOLFSSL_AES_256 - if (ctx->cipherType == AES_256_XTS_TYPE || - (type && XSTRNCMP(type, EVP_AES_256_XTS, EVP_AES_SIZE) == 0)) { - WOLFSSL_MSG("EVP_AES_256_XTS"); - ctx->cipherType = AES_256_XTS_TYPE; - ctx->flags &= ~WOLFSSL_EVP_CIPH_MODE; - ctx->flags |= WOLFSSL_EVP_CIPH_XTS_MODE; - ctx->keyLen = 64; - ctx->block_size = 1; - ctx->ivSz = AES_BLOCK_SIZE; - - if (iv != NULL) { - if (iv != ctx->iv) /* Valgrind error when src == dst */ - XMEMCPY(ctx->iv, iv, ctx->ivSz); - } - else - XMEMSET(ctx->iv, 0, AES_BLOCK_SIZE); - - if (enc == 0 || enc == 1) - ctx->enc = enc ? 1 : 0; - if (key) { - ret = wc_AesXtsSetKey(&ctx->cipher.xts, key, ctx->keyLen, - ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION, NULL, 0); - if (ret != 0) { - WOLFSSL_MSG("wc_AesXtsSetKey() failed"); - return WOLFSSL_FAILURE; - } - } - } - #endif /* WOLFSSL_AES_256 */ - #endif /* HAVE_AES_XTS */ -#endif /* NO_AES */ - -#ifndef NO_DES3 - if (ctx->cipherType == DES_CBC_TYPE || - (type && XSTRNCMP(type, EVP_DES_CBC, EVP_DES_SIZE) == 0)) { - WOLFSSL_MSG("EVP_DES_CBC"); - ctx->cipherType = DES_CBC_TYPE; - ctx->flags &= ~WOLFSSL_EVP_CIPH_MODE; - ctx->flags |= WOLFSSL_EVP_CIPH_CBC_MODE; - ctx->keyLen = 8; - ctx->block_size = DES_BLOCK_SIZE; - ctx->ivSz = DES_BLOCK_SIZE; - if (enc == 0 || enc == 1) - ctx->enc = enc ? 1 : 0; - if (key) { - ret = wc_Des_SetKey(&ctx->cipher.des, key, iv, - ctx->enc ? DES_ENCRYPTION : DES_DECRYPTION); - if (ret != 0) - return WOLFSSL_FAILURE; - } - - if (iv && key == NULL) - wc_Des_SetIV(&ctx->cipher.des, iv); - } -#ifdef WOLFSSL_DES_ECB - else if (ctx->cipherType == DES_ECB_TYPE || - (type && XSTRNCMP(type, EVP_DES_ECB, EVP_DES_SIZE) == 0)) { - WOLFSSL_MSG("EVP_DES_ECB"); - ctx->cipherType = DES_ECB_TYPE; - ctx->flags &= ~WOLFSSL_EVP_CIPH_MODE; - ctx->flags |= WOLFSSL_EVP_CIPH_ECB_MODE; - ctx->keyLen = 8; - ctx->block_size = DES_BLOCK_SIZE; - if (enc == 0 || enc == 1) - ctx->enc = enc ? 1 : 0; - if (key) { - WOLFSSL_MSG("Des_SetKey"); - ret = wc_Des_SetKey(&ctx->cipher.des, key, NULL, - ctx->enc ? DES_ENCRYPTION : DES_DECRYPTION); - if (ret != 0) - return WOLFSSL_FAILURE; - } - } -#endif - else if (ctx->cipherType == DES_EDE3_CBC_TYPE || - (type && - XSTRNCMP(type, EVP_DES_EDE3_CBC, EVP_DES_EDE3_SIZE) == 0)) { - WOLFSSL_MSG("EVP_DES_EDE3_CBC"); - ctx->cipherType = DES_EDE3_CBC_TYPE; - ctx->flags &= ~WOLFSSL_EVP_CIPH_MODE; - ctx->flags |= WOLFSSL_EVP_CIPH_CBC_MODE; - ctx->keyLen = 24; - ctx->block_size = DES_BLOCK_SIZE; - ctx->ivSz = DES_BLOCK_SIZE; - if (enc == 0 || enc == 1) - ctx->enc = enc ? 1 : 0; - if (key) { - ret = wc_Des3_SetKey(&ctx->cipher.des3, key, iv, - ctx->enc ? DES_ENCRYPTION : DES_DECRYPTION); - if (ret != 0) - return WOLFSSL_FAILURE; - } - - if (iv && key == NULL) { - ret = wc_Des3_SetIV(&ctx->cipher.des3, iv); - if (ret != 0) - return WOLFSSL_FAILURE; - } - } - else if (ctx->cipherType == DES_EDE3_ECB_TYPE || - (type && - XSTRNCMP(type, EVP_DES_EDE3_ECB, EVP_DES_EDE3_SIZE) == 0)) { - WOLFSSL_MSG("EVP_DES_EDE3_ECB"); - ctx->cipherType = DES_EDE3_ECB_TYPE; - ctx->flags &= ~WOLFSSL_EVP_CIPH_MODE; - ctx->flags |= WOLFSSL_EVP_CIPH_ECB_MODE; - ctx->keyLen = 24; - ctx->block_size = DES_BLOCK_SIZE; - if (enc == 0 || enc == 1) - ctx->enc = enc ? 1 : 0; - if (key) { - ret = wc_Des3_SetKey(&ctx->cipher.des3, key, NULL, - ctx->enc ? DES_ENCRYPTION : DES_DECRYPTION); - if (ret != 0) - return WOLFSSL_FAILURE; - } - } -#endif /* NO_DES3 */ -#ifndef NO_RC4 - if (ctx->cipherType == ARC4_TYPE || (type && - XSTRNCMP(type, "ARC4", 4) == 0)) { - WOLFSSL_MSG("ARC4"); - ctx->cipherType = ARC4_TYPE; - ctx->flags &= ~WOLFSSL_EVP_CIPH_MODE; - ctx->flags |= WOLFSSL_EVP_CIPH_STREAM_CIPHER; - ctx->block_size = 1; - if (ctx->keyLen == 0) /* user may have already set */ - ctx->keyLen = 16; /* default to 128 */ - if (key) - wc_Arc4SetKey(&ctx->cipher.arc4, key, ctx->keyLen); - } -#endif /* NO_RC4 */ -#ifdef HAVE_IDEA - if (ctx->cipherType == IDEA_CBC_TYPE || - (type && XSTRNCMP(type, EVP_IDEA_CBC, EVP_IDEA_SIZE) == 0)) { - WOLFSSL_MSG("EVP_IDEA_CBC"); - ctx->cipherType = IDEA_CBC_TYPE; - ctx->flags &= ~WOLFSSL_EVP_CIPH_MODE; - ctx->flags |= WOLFSSL_EVP_CIPH_CBC_MODE; - ctx->keyLen = IDEA_KEY_SIZE; - ctx->block_size = 8; - ctx->ivSz = IDEA_BLOCK_SIZE; - if (enc == 0 || enc == 1) - ctx->enc = enc ? 1 : 0; - if (key) { - ret = wc_IdeaSetKey(&ctx->cipher.idea, key, (word16)ctx->keyLen, - iv, ctx->enc ? IDEA_ENCRYPTION : - IDEA_DECRYPTION); - if (ret != 0) - return WOLFSSL_FAILURE; - } - - if (iv && key == NULL) - wc_IdeaSetIV(&ctx->cipher.idea, iv); - } -#endif /* HAVE_IDEA */ - if (ctx->cipherType == NULL_CIPHER_TYPE || (type && - XSTRNCMP(type, "NULL", 4) == 0)) { - WOLFSSL_MSG("NULL cipher"); - ctx->cipherType = NULL_CIPHER_TYPE; - ctx->keyLen = 0; - ctx->block_size = 16; - } -#ifdef HAVE_WOLFSSL_EVP_CIPHER_CTX_IV - if (iv && iv != ctx->iv) { - if (wolfSSL_StoreExternalIV(ctx) != WOLFSSL_SUCCESS) { - return WOLFSSL_FAILURE; - } - } -#endif - (void)ret; /* remove warning. If execution reaches this point, ret=0 */ - return WOLFSSL_SUCCESS; - } - - - /* WOLFSSL_SUCCESS on ok */ - int wolfSSL_EVP_CIPHER_CTX_key_length(WOLFSSL_EVP_CIPHER_CTX* ctx) - { - WOLFSSL_ENTER("wolfSSL_EVP_CIPHER_CTX_key_length"); - if (ctx) - return ctx->keyLen; - - return 0; /* failure */ - } - - - /* WOLFSSL_SUCCESS on ok */ - int wolfSSL_EVP_CIPHER_CTX_set_key_length(WOLFSSL_EVP_CIPHER_CTX* ctx, - int keylen) - { - WOLFSSL_ENTER("wolfSSL_EVP_CIPHER_CTX_set_key_length"); - if (ctx) - ctx->keyLen = keylen; - else - return 0; /* failure */ - - return WOLFSSL_SUCCESS; - } -#if defined(HAVE_AESGCM) - /* returns WOLFSSL_SUCCESS on success, otherwise returns WOLFSSL_FAILURE */ - int wolfSSL_EVP_CIPHER_CTX_set_iv_length(WOLFSSL_EVP_CIPHER_CTX* ctx, - int ivLen) - { - WOLFSSL_ENTER("wolfSSL_EVP_CIPHER_CTX_set_iv_length"); - if (ctx) - ctx->ivSz= ivLen; - else - return WOLFSSL_FAILURE; - - return WOLFSSL_SUCCESS; - } - - /* returns WOLFSSL_SUCCESS on success, otherwise returns WOLFSSL_FAILURE */ - int wolfSSL_EVP_CIPHER_CTX_set_iv(WOLFSSL_EVP_CIPHER_CTX* ctx, byte* iv, - int ivLen) - { - int expectedIvLen; - - WOLFSSL_ENTER("wolfSSL_EVP_CIPHER_CTX_set_iv_length"); - if (!ctx || !iv || !ivLen) { - return WOLFSSL_FAILURE; - } - - expectedIvLen = wolfSSL_EVP_CIPHER_CTX_iv_length(ctx); - - if (expectedIvLen == 0 || expectedIvLen != ivLen) { - WOLFSSL_MSG("Wrong ivLen value"); - return WOLFSSL_FAILURE; - } - - return wolfSSL_EVP_CipherInit(ctx, NULL, NULL, iv, -1); - } -#endif - - /* WOLFSSL_SUCCESS on ok */ - int wolfSSL_EVP_Cipher(WOLFSSL_EVP_CIPHER_CTX* ctx, byte* dst, byte* src, - word32 len) - { - int ret = 0; - WOLFSSL_ENTER("wolfSSL_EVP_Cipher"); - - if (ctx == NULL || src == NULL || - (dst == NULL && - ctx->cipherType != AES_128_GCM_TYPE && - ctx->cipherType != AES_192_GCM_TYPE && - ctx->cipherType != AES_256_GCM_TYPE)) { - WOLFSSL_MSG("Bad function argument"); - return 0; /* failure */ - } - - if (ctx->cipherType == 0xff) { - WOLFSSL_MSG("no init"); - return 0; /* failure */ - } - - switch (ctx->cipherType) { - -#ifndef NO_AES -#ifdef HAVE_AES_CBC - case AES_128_CBC_TYPE : - case AES_192_CBC_TYPE : - case AES_256_CBC_TYPE : - WOLFSSL_MSG("AES CBC"); - if (ctx->enc) - ret = wc_AesCbcEncrypt(&ctx->cipher.aes, dst, src, len); - else - ret = wc_AesCbcDecrypt(&ctx->cipher.aes, dst, src, len); - break; -#endif /* HAVE_AES_CBC */ - -#ifdef WOLFSSL_AES_CFB -#if !defined(HAVE_SELFTEST) && !defined(HAVE_FIPS) - case AES_128_CFB1_TYPE: - case AES_192_CFB1_TYPE: - case AES_256_CFB1_TYPE: - WOLFSSL_MSG("AES CFB1"); - if (ctx->enc) - ret = wc_AesCfb1Encrypt(&ctx->cipher.aes, dst, src, len); - else - ret = wc_AesCfb1Decrypt(&ctx->cipher.aes, dst, src, len); - break; - case AES_128_CFB8_TYPE: - case AES_192_CFB8_TYPE: - case AES_256_CFB8_TYPE: - WOLFSSL_MSG("AES CFB8"); - if (ctx->enc) - ret = wc_AesCfb8Encrypt(&ctx->cipher.aes, dst, src, len); - else - ret = wc_AesCfb8Decrypt(&ctx->cipher.aes, dst, src, len); - break; -#endif /* !HAVE_SELFTEST && !HAVE_FIPS */ - case AES_128_CFB128_TYPE: - case AES_192_CFB128_TYPE: - case AES_256_CFB128_TYPE: - WOLFSSL_MSG("AES CFB128"); - if (ctx->enc) - ret = wc_AesCfbEncrypt(&ctx->cipher.aes, dst, src, len); - else - ret = wc_AesCfbDecrypt(&ctx->cipher.aes, dst, src, len); - break; -#endif /* WOLFSSL_AES_CFB */ -#if defined(WOLFSSL_AES_OFB) - case AES_128_OFB_TYPE: - case AES_192_OFB_TYPE: - case AES_256_OFB_TYPE: - WOLFSSL_MSG("AES OFB"); - if (ctx->enc) - ret = wc_AesOfbEncrypt(&ctx->cipher.aes, dst, src, len); - else - ret = wc_AesOfbDecrypt(&ctx->cipher.aes, dst, src, len); - break; -#endif /* WOLFSSL_AES_OFB */ -#if defined(WOLFSSL_AES_XTS) - case AES_128_XTS_TYPE: - case AES_256_XTS_TYPE: - WOLFSSL_MSG("AES XTS"); - if (ctx->enc) - ret = wc_AesXtsEncrypt(&ctx->cipher.xts, dst, src, len, - ctx->iv, ctx->ivSz); - else - ret = wc_AesXtsDecrypt(&ctx->cipher.xts, dst, src, len, - ctx->iv, ctx->ivSz); - break; -#endif /* WOLFSSL_AES_XTS */ - -#ifdef HAVE_AESGCM - case AES_128_GCM_TYPE : - case AES_192_GCM_TYPE : - case AES_256_GCM_TYPE : - WOLFSSL_MSG("AES GCM"); - if (ctx->enc) { - if (dst){ - /* encrypt confidential data*/ - ret = wc_AesGcmEncrypt(&ctx->cipher.aes, dst, src, len, - ctx->iv, ctx->ivSz, ctx->authTag, ctx->authTagSz, - NULL, 0); - } - else { - /* authenticated, non-confidential data */ - ret = wc_AesGcmEncrypt(&ctx->cipher.aes, NULL, NULL, 0, - ctx->iv, ctx->ivSz, ctx->authTag, ctx->authTagSz, - src, len); - /* Reset partial authTag error for AAD*/ - if (ret == AES_GCM_AUTH_E) - ret = 0; - } - } - else { - if (dst){ - /* decrypt confidential data*/ - ret = wc_AesGcmDecrypt(&ctx->cipher.aes, dst, src, len, - ctx->iv, ctx->ivSz, ctx->authTag, ctx->authTagSz, - NULL, 0); - } - else { - /* authenticated, non-confidential data*/ - ret = wc_AesGcmDecrypt(&ctx->cipher.aes, NULL, NULL, 0, - ctx->iv, ctx->ivSz, - ctx->authTag, ctx->authTagSz, - src, len); - /* Reset partial authTag error for AAD*/ - if (ret == AES_GCM_AUTH_E) - ret = 0; - } - } - break; -#endif /* HAVE_AESGCM */ -#ifdef HAVE_AES_ECB - case AES_128_ECB_TYPE : - case AES_192_ECB_TYPE : - case AES_256_ECB_TYPE : - WOLFSSL_MSG("AES ECB"); - if (ctx->enc) - ret = wc_AesEcbEncrypt(&ctx->cipher.aes, dst, src, len); - else - ret = wc_AesEcbDecrypt(&ctx->cipher.aes, dst, src, len); - break; -#endif -#ifdef WOLFSSL_AES_COUNTER - case AES_128_CTR_TYPE : - case AES_192_CTR_TYPE : - case AES_256_CTR_TYPE : - WOLFSSL_MSG("AES CTR"); - ret = wc_AesCtrEncrypt(&ctx->cipher.aes, dst, src, len); - break; -#endif /* WOLFSSL_AES_COUNTER */ -#endif /* NO_AES */ - -#ifndef NO_DES3 - case DES_CBC_TYPE : - WOLFSSL_MSG("DES CBC"); - if (ctx->enc) - wc_Des_CbcEncrypt(&ctx->cipher.des, dst, src, len); - else - wc_Des_CbcDecrypt(&ctx->cipher.des, dst, src, len); - break; - case DES_EDE3_CBC_TYPE : - WOLFSSL_MSG("DES3 CBC"); - if (ctx->enc) - ret = wc_Des3_CbcEncrypt(&ctx->cipher.des3, dst, src, len); - else - ret = wc_Des3_CbcDecrypt(&ctx->cipher.des3, dst, src, len); - break; -#ifdef WOLFSSL_DES_ECB - case DES_ECB_TYPE : - WOLFSSL_MSG("DES ECB"); - ret = wc_Des_EcbEncrypt(&ctx->cipher.des, dst, src, len); - break; - case DES_EDE3_ECB_TYPE : - WOLFSSL_MSG("DES3 ECB"); - ret = wc_Des3_EcbEncrypt(&ctx->cipher.des3, dst, src, len); - break; -#endif -#endif /* !NO_DES3 */ - -#ifndef NO_RC4 - case ARC4_TYPE : - WOLFSSL_MSG("ARC4"); - wc_Arc4Process(&ctx->cipher.arc4, dst, src, len); - break; -#endif - -#ifdef HAVE_IDEA - case IDEA_CBC_TYPE : - WOLFSSL_MSG("IDEA CBC"); - if (ctx->enc) - wc_IdeaCbcEncrypt(&ctx->cipher.idea, dst, src, len); - else - wc_IdeaCbcDecrypt(&ctx->cipher.idea, dst, src, len); - break; -#endif - case NULL_CIPHER_TYPE : - WOLFSSL_MSG("NULL CIPHER"); - XMEMCPY(dst, src, len); - break; - - default: { - WOLFSSL_MSG("bad type"); - return 0; /* failure */ - } - } - - if (ret != 0) { - WOLFSSL_MSG("wolfSSL_EVP_Cipher failure"); - return 0; /* failure */ - } - - if (wolfSSL_StoreExternalIV(ctx) != WOLFSSL_SUCCESS) { - return WOLFSSL_FAILURE; - } - - WOLFSSL_MSG("wolfSSL_EVP_Cipher success"); - return WOLFSSL_SUCCESS; /* success */ - } - -#define WOLFSSL_EVP_INCLUDED -#include "wolfcrypt/src/evp.c" - - /* store for external read of iv, WOLFSSL_SUCCESS on success */ int wolfSSL_StoreExternalIV(WOLFSSL_EVP_CIPHER_CTX* ctx) { @@ -19518,7 +17417,6 @@ WOLFSSL_X509* wolfSSL_X509_d2i(WOLFSSL_X509** x509, const byte* in, int len) return x509->pubKeyOID; } - /* write X509 serial number in unsigned binary to buffer buffer needs to be at least EXTERNAL_SERIAL_SIZE (32) for all cases return WOLFSSL_SUCCESS on success */ @@ -21848,9 +19746,6 @@ int wolfSSL_X509_NAME_get_text_by_NID(WOLFSSL_X509_NAME* name, return (textSz - 1); /* do not include null character in size */ } -#ifdef HAVE_ECC - static int SetECKeyExternal(WOLFSSL_EC_KEY* eckey); -#endif /* Creates a new WOLFSSL_EVP_PKEY structure that has the public key from x509 * * returns a pointer to the created WOLFSSL_EVP_PKEY on success and NULL on fail @@ -25222,122 +23117,6 @@ int wolfSSL_X509_CRL_verify(WOLFSSL_X509_CRL* crl, WOLFSSL_EVP_PKEY* key) #endif #endif /* OPENSSL_EXTRA */ -#if defined(OPENSSL_EXTRA_X509_SMALL) -/* Subset of OPENSSL_EXTRA for PKEY operations PKEY free is needed by the - * subset of X509 API */ - -WOLFSSL_EVP_PKEY* wolfSSL_PKEY_new(void){ - return wolfSSL_PKEY_new_ex(NULL); -} - - -WOLFSSL_EVP_PKEY* wolfSSL_PKEY_new_ex(void* heap) -{ - WOLFSSL_EVP_PKEY* pkey; - int ret; - WOLFSSL_ENTER("wolfSSL_PKEY_new"); - pkey = (WOLFSSL_EVP_PKEY*)XMALLOC(sizeof(WOLFSSL_EVP_PKEY), heap, - DYNAMIC_TYPE_PUBLIC_KEY); - if (pkey != NULL) { - XMEMSET(pkey, 0, sizeof(WOLFSSL_EVP_PKEY)); - pkey->heap = heap; - pkey->type = WOLFSSL_EVP_PKEY_DEFAULT; -#ifndef HAVE_FIPS - ret = wc_InitRng_ex(&pkey->rng, heap, INVALID_DEVID); -#else - ret = wc_InitRng(&pkey->rng); -#endif - if (ret != 0){ - wolfSSL_EVP_PKEY_free(pkey); - WOLFSSL_MSG("memory failure"); - return NULL; - } - pkey->references = 1; - wc_InitMutex(&pkey->refMutex); - } - else { - WOLFSSL_MSG("memory failure"); - } - - return pkey; -} - - -void wolfSSL_EVP_PKEY_free(WOLFSSL_EVP_PKEY* key) -{ - int doFree = 0; - WOLFSSL_ENTER("wolfSSL_EVP_PKEY_free"); - if (key != NULL) { - if (wc_LockMutex(&key->refMutex) != 0) { - WOLFSSL_MSG("Couldn't lock pkey mutex"); - } - - /* only free if all references to it are done */ - key->references--; - if (key->references == 0) { - doFree = 1; - } - wc_UnLockMutex(&key->refMutex); - - if (doFree) { - wc_FreeRng(&key->rng); - - if (key->pkey.ptr != NULL) { - XFREE(key->pkey.ptr, key->heap, DYNAMIC_TYPE_PUBLIC_KEY); - key->pkey.ptr = NULL; - } - switch(key->type) - { - #ifndef NO_RSA - case EVP_PKEY_RSA: - if (key->rsa != NULL && key->ownRsa == 1) { - wolfSSL_RSA_free(key->rsa); - key->rsa = NULL; - } - break; - #endif /* NO_RSA */ - - #if defined(HAVE_ECC) && defined(OPENSSL_EXTRA) - case EVP_PKEY_EC: - if (key->ecc != NULL && key->ownEcc == 1) { - wolfSSL_EC_KEY_free(key->ecc); - key->ecc = NULL; - } - break; - #endif /* HAVE_ECC */ - - #ifndef NO_DSA - case EVP_PKEY_DSA: - if (key->dsa != NULL && key->ownDsa == 1) { - wolfSSL_DSA_free(key->dsa); - key->dsa = NULL; - } - break; - #endif /* NO_DSA */ - - #if !defined(NO_DH) && (defined(WOLFSSL_QT) || defined(OPENSSL_ALL)) - case EVP_PKEY_DH: - if (key->dh != NULL && key->ownDh == 1) { - wolfSSL_DH_free(key->dh); - key->dh = NULL; - } - break; - #endif /* ! NO_DH ... */ - - default: - break; - } - - if (wc_FreeMutex(&key->refMutex) != 0) { - WOLFSSL_MSG("Couldn't free pkey mutex"); - } - XFREE(key, key->heap, DYNAMIC_TYPE_PUBLIC_KEY); - } - } -} -#endif /* OPENSSL_EXTRA_X509_SMALL */ - - #ifdef OPENSSL_EXTRA /* Gets pointer to X509_STORE that was used to create context. @@ -30693,7 +28472,7 @@ void wolfSSL_DH_free(WOLFSSL_DH* dh) } } -static int SetDhInternal(WOLFSSL_DH* dh) +int SetDhInternal(WOLFSSL_DH* dh) { int ret = WOLFSSL_FATAL_ERROR; int pSz = 1024; @@ -32884,614 +30663,6 @@ size_t wolfSSL_HMAC_size(const WOLFSSL_HMAC_CTX *ctx) return (size_t)wc_HashGetDigestSize((enum wc_HashType)ctx->hmac.macType); } -const WOLFSSL_EVP_MD* wolfSSL_EVP_get_digestbynid(int id) -{ - WOLFSSL_MSG("wolfSSL_get_digestbynid"); - - switch(id) { -#ifndef NO_MD5 - case NID_md5: - return wolfSSL_EVP_md5(); -#endif -#ifndef NO_SHA - case NID_sha1: - return wolfSSL_EVP_sha1(); -#endif - default: - WOLFSSL_MSG("Bad digest id value"); - } - - return NULL; -} - - -#ifndef NO_RSA -WOLFSSL_RSA* wolfSSL_EVP_PKEY_get0_RSA(WOLFSSL_EVP_PKEY *pkey) -{ - if (!pkey) { - return NULL; - } - return pkey->rsa; -} - -WOLFSSL_RSA* wolfSSL_EVP_PKEY_get1_RSA(WOLFSSL_EVP_PKEY* key) -{ - WOLFSSL_RSA* local; - - WOLFSSL_MSG("wolfSSL_EVP_PKEY_get1_RSA"); - - if (key == NULL) { - return NULL; - } - - local = wolfSSL_RSA_new(); - if (local == NULL) { - WOLFSSL_MSG("Error creating a new WOLFSSL_RSA structure"); - return NULL; - } - - if (key->type == EVP_PKEY_RSA) { - if (wolfSSL_RSA_LoadDer(local, (const unsigned char*)key->pkey.ptr, - key->pkey_sz) != SSL_SUCCESS) { - /* now try public key */ - if (wolfSSL_RSA_LoadDer_ex(local, - (const unsigned char*)key->pkey.ptr, key->pkey_sz, - WOLFSSL_RSA_LOAD_PUBLIC) != SSL_SUCCESS) { - wolfSSL_RSA_free(local); - local = NULL; - } - } - } - else { - WOLFSSL_MSG("WOLFSSL_EVP_PKEY does not hold an RSA key"); - wolfSSL_RSA_free(local); - local = NULL; - } - return local; -} - - -/* with set1 functions the pkey struct does not own the RSA structure - * - * returns WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure - */ -int wolfSSL_EVP_PKEY_set1_RSA(WOLFSSL_EVP_PKEY *pkey, WOLFSSL_RSA *key) -{ -#if defined(WOLFSSL_KEY_GEN) && !defined(HAVE_USER_RSA) - int derMax = 0; - int derSz = 0; - byte* derBuf = NULL; - RsaKey* rsa = NULL; -#endif - WOLFSSL_ENTER("wolfSSL_EVP_PKEY_set1_RSA"); - if ((pkey == NULL) || (key == NULL)) - return WOLFSSL_FAILURE; - - if (pkey->rsa != NULL && pkey->ownRsa == 1) { - wolfSSL_RSA_free(pkey->rsa); - } - pkey->rsa = key; - pkey->ownRsa = 0; /* pkey does not own RSA */ - pkey->type = EVP_PKEY_RSA; - if (key->inSet == 0) { - if (SetRsaInternal(key) != WOLFSSL_SUCCESS) { - WOLFSSL_MSG("SetRsaInternal failed"); - return WOLFSSL_FAILURE; - } - } - -#if defined(WOLFSSL_KEY_GEN) && !defined(HAVE_USER_RSA) - rsa = (RsaKey*)key->internal; - /* 5 > size of n, d, p, q, d%(p-1), d(q-1), 1/q%p, e + ASN.1 additional - * information */ - derMax = 5 * wolfSSL_RSA_size(key) + (2 * AES_BLOCK_SIZE); - - derBuf = (byte*)XMALLOC(derMax, pkey->heap, DYNAMIC_TYPE_TMP_BUFFER); - if (derBuf == NULL) { - WOLFSSL_MSG("malloc failed"); - return WOLFSSL_FAILURE; - } - - if (rsa->type == RSA_PRIVATE) { - /* Private key to DER */ - derSz = wc_RsaKeyToDer(rsa, derBuf, derMax); - } - else { - /* Public key to DER */ - derSz = wc_RsaKeyToPublicDer(rsa, derBuf, derMax); - } - - if (derSz < 0) { - if (rsa->type == RSA_PRIVATE) { - WOLFSSL_MSG("wc_RsaKeyToDer failed"); - } - else { - WOLFSSL_MSG("wc_RsaKeyToPublicDer failed"); - } - XFREE(derBuf, pkey->heap, DYNAMIC_TYPE_TMP_BUFFER); - return WOLFSSL_FAILURE; - } - - pkey->pkey.ptr = (char*)XMALLOC(derSz, pkey->heap, DYNAMIC_TYPE_DER); - if (pkey->pkey.ptr == NULL) { - WOLFSSL_MSG("key malloc failed"); - XFREE(derBuf, pkey->heap, DYNAMIC_TYPE_TMP_BUFFER); - return WOLFSSL_FAILURE; - } - pkey->pkey_sz = derSz; - XMEMCPY(pkey->pkey.ptr, derBuf, derSz); - XFREE(derBuf, pkey->heap, DYNAMIC_TYPE_TMP_BUFFER); -#endif /* WOLFSSL_KEY_GEN && !HAVE_USER_RSA */ - -#ifdef WC_RSA_BLINDING - if (key->ownRng == 0) { - if (wc_RsaSetRNG((RsaKey*)(pkey->rsa->internal), &(pkey->rng)) != 0) { - WOLFSSL_MSG("Error setting RSA rng"); - return WOLFSSL_FAILURE; - } - } -#endif - return WOLFSSL_SUCCESS; -} -#endif /* !NO_RSA */ - -#if defined(OPENSSL_ALL) || defined(WOLFSSL_QT) || defined(OPENSSL_EXTRA) -#if !defined (NO_DSA) && !defined(HAVE_SELFTEST) && defined(WOLFSSL_KEY_GEN) -/* with set1 functions the pkey struct does not own the DSA structure - * - * returns WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure - */ -int wolfSSL_EVP_PKEY_set1_DSA(WOLFSSL_EVP_PKEY *pkey, WOLFSSL_DSA *key) -{ - int derMax = 0; - int derSz = 0; - DsaKey* dsa = NULL; - byte* derBuf = NULL; - - WOLFSSL_ENTER("wolfSSL_EVP_PKEY_set1_DSA"); - - if((pkey == NULL) || (key == NULL))return WOLFSSL_FAILURE; - if (pkey->dsa != NULL && pkey->ownDsa == 1) { - wolfSSL_DSA_free(pkey->dsa); - } - pkey->dsa = key; - pkey->ownDsa = 0; /* pkey does not own DSA */ - pkey->type = EVP_PKEY_DSA; - if (key->inSet == 0) { - if (SetDsaInternal(key) != WOLFSSL_SUCCESS) { - WOLFSSL_MSG("SetDsaInternal failed"); - return WOLFSSL_FAILURE; - } - } - dsa = (DsaKey*)key->internal; - - /* 4 > size of pub, priv, p, q, g + ASN.1 additional information */ - derMax = 4 * wolfSSL_BN_num_bytes(key->g) + AES_BLOCK_SIZE; - - derBuf = (byte*)XMALLOC(derMax, pkey->heap, DYNAMIC_TYPE_TMP_BUFFER); - if (derBuf == NULL) { - WOLFSSL_MSG("malloc failed"); - return WOLFSSL_FAILURE; - } - - if (dsa->type == DSA_PRIVATE) { - /* Private key to DER */ - derSz = wc_DsaKeyToDer(dsa, derBuf, derMax); - } - else { - /* Public key to DER */ - derSz = wc_DsaKeyToPublicDer(dsa, derBuf, derMax); - } - - if (derSz < 0) { - if (dsa->type == DSA_PRIVATE) { - WOLFSSL_MSG("wc_DsaKeyToDer failed"); - } - else { - WOLFSSL_MSG("wc_DsaKeyToPublicDer failed"); - } - XFREE(derBuf, pkey->heap, DYNAMIC_TYPE_TMP_BUFFER); - return WOLFSSL_FAILURE; - } - - pkey->pkey.ptr = (char*)XMALLOC(derSz, pkey->heap, DYNAMIC_TYPE_DER); - if (pkey->pkey.ptr == NULL) { - WOLFSSL_MSG("key malloc failed"); - XFREE(derBuf, pkey->heap, DYNAMIC_TYPE_TMP_BUFFER); - return WOLFSSL_FAILURE; - } - pkey->pkey_sz = derSz; - XMEMCPY(pkey->pkey.ptr, derBuf, derSz); - XFREE(derBuf, pkey->heap, DYNAMIC_TYPE_TMP_BUFFER); - - return WOLFSSL_SUCCESS; -} - -WOLFSSL_DSA* wolfSSL_EVP_PKEY_get1_DSA(WOLFSSL_EVP_PKEY* key) -{ - WOLFSSL_DSA* local; - - WOLFSSL_ENTER("wolfSSL_EVP_PKEY_get1_DSA"); - - if (key == NULL) { - WOLFSSL_MSG("Bad function argument"); - return NULL; - } - - local = wolfSSL_DSA_new(); - if (local == NULL) { - WOLFSSL_MSG("Error creating a new WOLFSSL_DSA structure"); - return NULL; - } - - if (key->type == EVP_PKEY_DSA) { - if (wolfSSL_DSA_LoadDer(local, (const unsigned char*)key->pkey.ptr, - key->pkey_sz) != SSL_SUCCESS) { - /* now try public key */ - if (wolfSSL_DSA_LoadDer_ex(local, - (const unsigned char*)key->pkey.ptr, key->pkey_sz, - WOLFSSL_DSA_LOAD_PUBLIC) != SSL_SUCCESS) { - wolfSSL_DSA_free(local); - local = NULL; - } - } - } - else { - WOLFSSL_MSG("WOLFSSL_EVP_PKEY does not hold a DSA key"); - wolfSSL_DSA_free(local); - local = NULL; - } - return local; -} -#endif /* !NO_DSA && !HAVE_SELFTEST && WOLFSSL_KEY_GEN */ - -#ifdef HAVE_ECC -WOLFSSL_EC_KEY *wolfSSL_EVP_PKEY_get0_EC_KEY(WOLFSSL_EVP_PKEY *pkey) -{ - WOLFSSL_EC_KEY *eckey = NULL; - if (pkey) { -#ifdef HAVE_ECC - eckey = pkey->ecc; -#endif - } - return eckey; -} - -WOLFSSL_EC_KEY* wolfSSL_EVP_PKEY_get1_EC_KEY(WOLFSSL_EVP_PKEY* key) -{ - WOLFSSL_EC_KEY* local; - WOLFSSL_ENTER("wolfSSL_EVP_PKEY_get1_EC_KEY"); - - if (key == NULL) { - return NULL; - } - - local = wolfSSL_EC_KEY_new(); - if (local == NULL) { - WOLFSSL_MSG("Error creating a new WOLFSSL_EC_KEY structure"); - return NULL; - } - - if (key->type == EVP_PKEY_EC) { - if (wolfSSL_EC_KEY_LoadDer(local, (const unsigned char*)key->pkey.ptr, - key->pkey_sz) != SSL_SUCCESS) { - /* now try public key */ - if (wolfSSL_EC_KEY_LoadDer_ex(local, - (const unsigned char*)key->pkey.ptr, - key->pkey_sz, WOLFSSL_EC_KEY_LOAD_PUBLIC) != SSL_SUCCESS) { - - wolfSSL_EC_KEY_free(local); - local = NULL; - } - } - } - else { - WOLFSSL_MSG("WOLFSSL_EVP_PKEY does not hold an EC key"); - wolfSSL_EC_KEY_free(local); - local = NULL; - } -#ifdef OPENSSL_ALL - if (!local && key->ecc) { - local = wolfSSL_EC_KEY_dup(key->ecc); - } -#endif - return local; -} -#endif /* HAVE_ECC */ -#endif /* OPENSSL_ALL || WOLFSSL_QT || OPENSSL_EXTRA */ - -#if defined(OPENSSL_ALL) || defined(WOLFSSL_QT) -#if !defined(NO_DH) && !defined(NO_FILESYSTEM) -/* with set1 functions the pkey struct does not own the DH structure - * Build the following DH Key format from the passed in WOLFSSL_DH - * then store in WOLFSSL_EVP_PKEY in DER format. - * - * returns WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure - */ -int wolfSSL_EVP_PKEY_set1_DH(WOLFSSL_EVP_PKEY *pkey, WOLFSSL_DH *key) -{ - byte havePublic = 0, havePrivate = 0; - int ret; - word32 derSz = 0; - byte* derBuf = NULL; - DhKey* dhkey = NULL; - mp_int pubKey; - mp_int privKey; - - WOLFSSL_ENTER("wolfSSL_EVP_PKEY_set1_DH"); - - if (pkey == NULL || key == NULL) - return WOLFSSL_FAILURE; - - if (pkey->dh != NULL && pkey->ownDh == 1) - wolfSSL_DH_free(pkey->dh); - - pkey->dh = key; - pkey->ownDh = 0; /* pkey does not own DH */ - pkey->type = EVP_PKEY_DH; - if (key->inSet == 0) { - if (SetDhInternal(key) != WOLFSSL_SUCCESS) { - WOLFSSL_MSG("SetDhInternal failed"); - return WOLFSSL_FAILURE; - } - } - - dhkey = (DhKey*)key->internal; - - pubKey = dhkey->pub; - privKey = dhkey->priv; - - havePublic = mp_unsigned_bin_size(&pubKey) > 0; - havePrivate = mp_unsigned_bin_size(&privKey) > 0; - - /* Get size of DER buffer only */ - if (havePublic && !havePrivate) { - ret = wc_DhPubKeyToDer(dhkey, NULL, &derSz); - } else if (havePrivate && !havePublic) { - ret = wc_DhPrivKeyToDer(dhkey, NULL, &derSz); - } else { - ret = wc_DhParamsToDer(dhkey,NULL,&derSz); - } - - if (derSz <= 0 || ret != LENGTH_ONLY_E) { - WOLFSSL_MSG("Failed to get size of DH Key"); - return WOLFSSL_FAILURE; - } - - derBuf = (byte*)XMALLOC(derSz, pkey->heap, DYNAMIC_TYPE_TMP_BUFFER); - if (derBuf == NULL) { - WOLFSSL_MSG("malloc failed"); - return WOLFSSL_FAILURE; - } - - /* Fill DER buffer */ - if (havePublic && !havePrivate) { - ret = wc_DhPubKeyToDer(dhkey, derBuf, &derSz); - } else if (havePrivate && !havePublic) { - ret = wc_DhPrivKeyToDer(dhkey, derBuf, &derSz); - } else { - ret = wc_DhParamsToDer(dhkey,derBuf,&derSz); - } - - if (ret <= 0) { - WOLFSSL_MSG("Failed to export DH Key"); - XFREE(derBuf, pkey->heap, DYNAMIC_TYPE_TMP_BUFFER); - return WOLFSSL_FAILURE; - } - - /* Store DH key into pkey (DER format) */ - pkey->pkey.ptr = (char*)XMALLOC(derSz, pkey->heap, DYNAMIC_TYPE_DER); - if (pkey->pkey.ptr == NULL) { - WOLFSSL_MSG("key malloc failed"); - XFREE(derBuf, pkey->heap, DYNAMIC_TYPE_TMP_BUFFER); - return WOLFSSL_FAILURE; - } - pkey->pkey_sz = derSz; - XMEMCPY(pkey->pkey.ptr, derBuf, derSz); - XFREE(derBuf, pkey->heap, DYNAMIC_TYPE_TMP_BUFFER); - - return WOLFSSL_SUCCESS; -} - -WOLFSSL_DH* wolfSSL_EVP_PKEY_get0_DH(WOLFSSL_EVP_PKEY* key) -{ - if (!key) { - return NULL; - } - return key->dh; -} - -WOLFSSL_DH* wolfSSL_EVP_PKEY_get1_DH(WOLFSSL_EVP_PKEY* key) -{ - WOLFSSL_DH* local = NULL; - - WOLFSSL_ENTER("wolfSSL_EVP_PKEY_get1_DH"); - - if (key == NULL || key->dh == NULL) { - WOLFSSL_MSG("Bad function argument"); - return NULL; - } - - if (key->type == EVP_PKEY_DH) { - local = wolfSSL_DH_new(); - if (local == NULL) { - WOLFSSL_MSG("Error creating a new WOLFSSL_DH structure"); - return NULL; - } - - if (wolfSSL_DH_LoadDer(local, (const unsigned char*)key->pkey.ptr, - key->pkey_sz) != SSL_SUCCESS) { - wolfSSL_DH_free(local); - WOLFSSL_MSG("Error wolfSSL_DH_LoadDer"); - local = NULL; - } - } - else { - WOLFSSL_MSG("WOLFSSL_EVP_PKEY does not hold a DH key"); - wolfSSL_DH_free(local); - return NULL; - } - - return local; -} -#endif /* NO_DH && NO_FILESYSTEM */ - -int wolfSSL_EVP_PKEY_assign(WOLFSSL_EVP_PKEY *pkey, int type, void *key) -{ - int ret; - - WOLFSSL_ENTER("wolfSSL_EVP_PKEY_assign"); - - /* pkey and key checked if NULL in subsequent assign functions */ - switch(type) { - #ifndef NO_RSA - case EVP_PKEY_RSA: - ret = wolfSSL_EVP_PKEY_assign_RSA(pkey, (WOLFSSL_RSA*)key); - break; - #endif - #ifndef NO_DSA - case EVP_PKEY_DSA: - ret = wolfSSL_EVP_PKEY_assign_DSA(pkey, (WOLFSSL_DSA*)key); - break; - #endif - #ifdef HAVE_ECC - case EVP_PKEY_EC: - ret = wolfSSL_EVP_PKEY_assign_EC_KEY(pkey, (WOLFSSL_EC_KEY*)key); - break; - #endif - #ifdef NO_DH - case EVP_PKEY_DH: - ret = wolfSSL_EVP_PKEY_assign_DH(pkey, (WOLFSSL_DH*)key); - break; - #endif - default: - WOLFSSL_MSG("Unknown EVP_PKEY type in wolfSSL_EVP_PKEY_assign."); - ret = WOLFSSL_FAILURE; - } - - return ret; -} -#endif /* WOLFSSL_QT || OPENSSL_ALL */ - -#if defined(OPENSSL_EXTRA) && defined(HAVE_ECC) -/* try and populate public pkey_sz and pkey.ptr */ -static void ECC_populate_EVP_PKEY(EVP_PKEY* pkey, ecc_key* ecc) -{ - int ret; - if (!pkey || !ecc) - return; - if ((ret = wc_EccPublicKeyDerSize(ecc, 1)) > 0) { - int derSz = ret; - char* derBuf = (char*)XMALLOC(derSz, NULL, DYNAMIC_TYPE_TMP_BUFFER); - if (derBuf) { - ret = wc_EccPublicKeyToDer(ecc, (byte*)derBuf, derSz, 1); - if (ret >= 0) { - if (pkey->pkey.ptr) { - XFREE(pkey->pkey.ptr, NULL, DYNAMIC_TYPE_OPENSSL); - } - pkey->pkey_sz = ret; - pkey->pkey.ptr = derBuf; - } - else { /* failure - okay to ignore */ - XFREE(derBuf, NULL, DYNAMIC_TYPE_TMP_BUFFER); - derBuf = NULL; - } - } - } -} - -WOLFSSL_API int wolfSSL_EVP_PKEY_set1_EC_KEY(WOLFSSL_EVP_PKEY *pkey, WOLFSSL_EC_KEY *key) -{ -#ifdef HAVE_ECC - if((pkey == NULL) || (key ==NULL))return WOLFSSL_FAILURE; - WOLFSSL_ENTER("wolfSSL_EVP_PKEY_set1_EC_KEY"); -#ifndef NO_RSA - if (pkey->rsa != NULL && pkey->ownRsa == 1) { - wolfSSL_RSA_free(pkey->rsa); - } - pkey->ownRsa = 0; -#endif -#ifndef NO_DSA - if (pkey->dsa != NULL && pkey->ownDsa == 1) { - wolfSSL_DSA_free(pkey->dsa); - } - pkey->ownDsa = 0; -#endif -#ifndef NO_DH - if (pkey->dh != NULL && pkey->ownDh == 1) { - wolfSSL_DH_free(pkey->dh); - } - pkey->ownDh = 0; -#endif - if (pkey->ecc != NULL && pkey->ownEcc == 1) { - wolfSSL_EC_KEY_free(pkey->ecc); - } - pkey->ecc = key; - pkey->ownEcc = 0; /* pkey does not own EC key */ - pkey->type = EVP_PKEY_EC; - ECC_populate_EVP_PKEY(pkey, (ecc_key*)key->internal); - return WOLFSSL_SUCCESS; -#else - (void)pkey; - (void)key; - return WOLFSSL_FAILURE; -#endif -} - -void* wolfSSL_EVP_X_STATE(const WOLFSSL_EVP_CIPHER_CTX* ctx) -{ - WOLFSSL_MSG("wolfSSL_EVP_X_STATE"); - - if (ctx) { - switch (ctx->cipherType) { - case ARC4_TYPE: - WOLFSSL_MSG("returning arc4 state"); - return (void*)&ctx->cipher.arc4.x; - - default: - WOLFSSL_MSG("bad x state type"); - return 0; - } - } - - return NULL; -} -int wolfSSL_EVP_PKEY_assign_EC_KEY(EVP_PKEY* pkey, WOLFSSL_EC_KEY* key) -{ - if (pkey == NULL || key == NULL) - return WOLFSSL_FAILURE; - - pkey->type = EVP_PKEY_EC; - pkey->ecc = key; - pkey->ownEcc = 1; - - /* try and populate public pkey_sz and pkey.ptr */ - ECC_populate_EVP_PKEY(pkey, (ecc_key*)key->internal); - - return WOLFSSL_SUCCESS; -} -#endif /* OPENSSL_EXTRA || HAVE_ECC */ - -int wolfSSL_EVP_X_STATE_LEN(const WOLFSSL_EVP_CIPHER_CTX* ctx) -{ - WOLFSSL_MSG("wolfSSL_EVP_X_STATE_LEN"); - - if (ctx) { - switch (ctx->cipherType) { - case ARC4_TYPE: - WOLFSSL_MSG("returning arc4 state size"); - return sizeof(Arc4); - - default: - WOLFSSL_MSG("bad x state type"); - return 0; - } - } - - return 0; -} - - #ifndef NO_DES3 void wolfSSL_3des_iv(WOLFSSL_EVP_CIPHER_CTX* ctx, int doset, @@ -37327,49 +34498,6 @@ WOLFSSL_EC_GROUP* wolfSSL_PEM_read_bio_ECPKParameters(WOLFSSL_BIO* bio, } #endif /* HAVE_ECC */ -/* return of pkey->type which will be EVP_PKEY_RSA for example. - * - * type type of EVP_PKEY - * - * returns type or if type is not found then NID_undef - */ -int wolfSSL_EVP_PKEY_type(int type) -{ - WOLFSSL_MSG("wolfSSL_EVP_PKEY_type"); - - switch (type) { - #ifdef OPENSSL_EXTRA - case EVP_PKEY_RSA: - return EVP_PKEY_RSA; - case EVP_PKEY_DSA: - return EVP_PKEY_DSA; - case EVP_PKEY_EC: - return EVP_PKEY_EC; - case EVP_PKEY_DH: - return EVP_PKEY_DH; - #endif - default: - return NID_undef; - } -} - - -int wolfSSL_EVP_PKEY_id(const EVP_PKEY *pkey) -{ - if (pkey != NULL) - return pkey->type; - return 0; -} - - -int wolfSSL_EVP_PKEY_base_id(const EVP_PKEY *pkey) -{ - if (pkey == NULL) - return NID_undef; - return wolfSSL_EVP_PKEY_type(pkey->type); -} - - #if !defined(NO_FILESYSTEM) WOLFSSL_EVP_PKEY *wolfSSL_PEM_read_PUBKEY(XFILE fp, EVP_PKEY **x, pem_password_cb *cb, void *u) @@ -37867,9 +34995,9 @@ int wolfSSL_RSA_padding_add_PKCS1_PSS(WOLFSSL_RSA *rsa, unsigned char *EM, goto cleanup; } - hashType = wolfSSL_EVP_MD_type(hashAlg); + hashType = wolfSSL_EVP_md2macType(hashAlg); if (hashType < WC_HASH_TYPE_NONE || hashType > WC_HASH_TYPE_MAX) { - WOLFSSL_MSG("wolfSSL_EVP_MD_type error"); + WOLFSSL_MSG("wolfSSL_EVP_md2macType error"); goto cleanup; } @@ -37907,7 +35035,7 @@ int wolfSSL_RSA_padding_add_PKCS1_PSS(WOLFSSL_RSA *rsa, unsigned char *EM, if (wc_RsaPad_ex(mHash, wolfSSL_EVP_MD_size(hashAlg), EM, emLen, RSA_BLOCK_TYPE_1, rng, WC_RSA_PSS_PAD, - wolfSSL_EVP_MD_type(hashAlg), mgf, NULL, 0, saltLen, + wolfSSL_EVP_md2macType(hashAlg), mgf, NULL, 0, saltLen, wolfSSL_BN_num_bits(rsa->n), NULL) != MP_OKAY) { WOLFSSL_MSG("wc_RsaPad_ex error"); goto cleanup; @@ -37974,9 +35102,9 @@ int wolfSSL_RSA_verify_PKCS1_PSS(WOLFSSL_RSA *rsa, const unsigned char *mHash, return WOLFSSL_FAILURE; } - hashType = wolfSSL_EVP_MD_type(hashAlg); + hashType = wolfSSL_EVP_md2macType(hashAlg); if (hashType < WC_HASH_TYPE_NONE || hashType > WC_HASH_TYPE_MAX) { - WOLFSSL_MSG("wolfSSL_EVP_MD_type error"); + WOLFSSL_MSG("wolfSSL_EVP_md2macType error"); return WOLFSSL_FAILURE; } diff --git a/wolfcrypt/src/evp.c b/wolfcrypt/src/evp.c index 1cd30a9e2..af4129fc4 100644 --- a/wolfcrypt/src/evp.c +++ b/wolfcrypt/src/evp.c @@ -26,8 +26,6 @@ #elif defined(WOLFCRYPT_ONLY) #else -#if defined(OPENSSL_EXTRA) - #ifdef HAVE_CONFIG_H #include #endif @@ -37,6 +35,8 @@ #include #include +#if defined(OPENSSL_EXTRA) + #ifndef NO_AES #ifdef HAVE_AES_CBC #ifdef WOLFSSL_AES_128 @@ -3299,11 +3299,22 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) } } - - /* returns the type of message digest used by the ctx */ + /* returns the NID of message digest used by the ctx */ int wolfSSL_EVP_MD_CTX_type(const WOLFSSL_EVP_MD_CTX *ctx) { + const struct s_ent *ent; + WOLFSSL_ENTER("EVP_MD_CTX_type"); - return ctx->macType; + + if (ctx) { + for(ent = md_tbl; ent->name != NULL; ent++) { + if (ctx->macType == ent->macType) { + return ent->nid; + } + } + /* Return whatever we got */ + return ctx->macType; + } + return 0; } @@ -3331,8 +3342,7 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) wolfSSL_HmacCopy(&des->hash.hmac, (Hmac*)&src->hash.hmac); } else { - int macType = wolfSSL_EVP_md2macType(EVP_MD_CTX_md(src)); - switch (macType) { + switch (src->macType) { #ifndef NO_MD5 case WC_HASH_TYPE_MD5: wc_Md5Copy((wc_Md5*)&src->hash.digest, @@ -3436,7 +3446,7 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) return NULL; WOLFSSL_ENTER("EVP_MD_CTX_md"); for(ent = md_tbl; ent->name != NULL; ent++) { - if(ctx->macType == ent->nid) { + if(ctx->macType == ent->macType) { return (const WOLFSSL_EVP_MD *)ent->name; } } @@ -3794,8 +3804,7 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) wc_HmacFree(&ctx->hash.hmac); } else { - int macType = wolfSSL_EVP_md2macType(EVP_MD_CTX_md(ctx)); - switch (macType) { + switch (ctx->macType) { #ifndef NO_MD5 case WC_HASH_TYPE_MD5: wc_Md5Free((wc_Md5*)&ctx->hash.digest); @@ -3947,7 +3956,12 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) WOLFSSL_MSG("wc_RNG_GenerateBlock failed"); ret = WOLFSSL_FAILURE; } - wc_FreeRng(&rng); + + if (wc_FreeRng(&rng) != 0) { + WOLFSSL_MSG("wc_FreeRng failed"); + ret = WOLFSSL_FAILURE; + break; + } } break; #if !defined(_WIN32) && !defined(HAVE_FIPS) @@ -4104,12 +4118,12 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) WOLFSSL_ENTER("wolfSSL_EVP_CipherInit"); if (ctx == NULL) { WOLFSSL_MSG("no ctx"); - return 0; /* failure */ + return WOLFSSL_FAILURE; } if (type == NULL && ctx->cipherType == WOLFSSL_EVP_CIPH_TYPE_INIT) { WOLFSSL_MSG("no type set"); - return 0; /* failure */ + return WOLFSSL_FAILURE; } if (ctx->cipherType == WOLFSSL_EVP_CIPH_TYPE_INIT){ /* only first EVP_CipherInit invoke. ctx->cipherType is set below */ @@ -4144,12 +4158,12 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) ret = AesSetKey_ex(&ctx->cipher.aes, key, ctx->keyLen, iv, ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION, 0); if (ret != 0) - return ret; + return WOLFSSL_FAILURE; } if (iv && key == NULL) { ret = wc_AesSetIV(&ctx->cipher.aes, iv); if (ret != 0) - return ret; + return WOLFSSL_FAILURE; } } #endif /* WOLFSSL_AES_128 */ @@ -4169,12 +4183,12 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) ret = AesSetKey_ex(&ctx->cipher.aes, key, ctx->keyLen, iv, ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION, 0); if (ret != 0) - return ret; + return WOLFSSL_FAILURE; } if (iv && key == NULL) { ret = wc_AesSetIV(&ctx->cipher.aes, iv); if (ret != 0) - return ret; + return WOLFSSL_FAILURE; } } #endif /* WOLFSSL_AES_192 */ @@ -4195,19 +4209,20 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION, 0); if (ret != 0){ WOLFSSL_MSG("AesSetKey() failed"); - return ret; + return WOLFSSL_FAILURE; } } if (iv && key == NULL) { ret = wc_AesSetIV(&ctx->cipher.aes, iv); if (ret != 0){ WOLFSSL_MSG("wc_AesSetIV() failed"); - return ret; + return WOLFSSL_FAILURE; } } } #endif /* WOLFSSL_AES_256 */ #endif /* HAVE_AES_CBC */ +#if !defined(_WIN32) && !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) #ifdef HAVE_AESGCM #ifdef WOLFSSL_AES_128 if (ctx->cipherType == AES_128_GCM_TYPE || @@ -4222,17 +4237,16 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) ctx->ivSz = GCM_NONCE_MID_SZ; XMEMSET(ctx->authTag, 0, ctx->authTagSz); - if (iv) - XMEMCPY(ctx->iv, iv, ctx->ivSz); - else - XMEMSET(ctx->iv, 0, AES_BLOCK_SIZE); + if (key && wc_AesGcmSetKey(&ctx->cipher.aes, key, ctx->keyLen)) { + WOLFSSL_MSG("wc_AesGcmSetKey() failed"); + return WOLFSSL_FAILURE; + } + if (iv && wc_AesGcmSetExtIV(&ctx->cipher.aes, iv, GCM_NONCE_MID_SZ)) { + WOLFSSL_MSG("wc_AesGcmSetExtIV() failed"); + return WOLFSSL_FAILURE; + } if (enc == 0 || enc == 1) ctx->enc = enc ? 1 : 0; - if (key) { - ret = wc_AesGcmSetKey(&ctx->cipher.aes, key, ctx->keyLen); - if (ret != 0) - return ret; - } } #endif /* WOLFSSL_AES_128 */ #ifdef WOLFSSL_AES_192 @@ -4248,17 +4262,16 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) ctx->ivSz = GCM_NONCE_MID_SZ; XMEMSET(ctx->authTag, 0, ctx->authTagSz); - if (iv) - XMEMCPY(ctx->iv, iv, ctx->ivSz); - else - XMEMSET(ctx->iv, 0, AES_BLOCK_SIZE); + if (key && wc_AesGcmSetKey(&ctx->cipher.aes, key, ctx->keyLen)) { + WOLFSSL_MSG("wc_AesGcmSetKey() failed"); + return WOLFSSL_FAILURE; + } + if (iv && wc_AesGcmSetExtIV(&ctx->cipher.aes, iv, GCM_NONCE_MID_SZ)) { + WOLFSSL_MSG("wc_AesGcmSetExtIV() failed"); + return WOLFSSL_FAILURE; + } if (enc == 0 || enc == 1) ctx->enc = enc ? 1 : 0; - if (key) { - ret = wc_AesGcmSetKey(&ctx->cipher.aes, key, ctx->keyLen); - if (ret != 0) - return ret; - } } #endif /* WOLFSSL_AES_192 */ #ifdef WOLFSSL_AES_256 @@ -4274,22 +4287,20 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) ctx->ivSz = GCM_NONCE_MID_SZ; XMEMSET(ctx->authTag, 0, ctx->authTagSz); - if (iv) - XMEMCPY(ctx->iv, iv, ctx->ivSz); - else - XMEMSET(ctx->iv, 0, AES_BLOCK_SIZE); + if (key && wc_AesGcmSetKey(&ctx->cipher.aes, key, ctx->keyLen)) { + WOLFSSL_MSG("wc_AesGcmSetKey() failed"); + return WOLFSSL_FAILURE; + } + if (iv && wc_AesGcmSetExtIV(&ctx->cipher.aes, iv, GCM_NONCE_MID_SZ)) { + WOLFSSL_MSG("wc_AesGcmSetExtIV() failed"); + return WOLFSSL_FAILURE; + } if (enc == 0 || enc == 1) ctx->enc = enc ? 1 : 0; - if (key) { - ret = wc_AesGcmSetKey(&ctx->cipher.aes, key, ctx->keyLen); - if (ret != 0){ - WOLFSSL_MSG("AesSetKey() failed"); - return ret; - } - } } #endif /* WOLFSSL_AES_256 */ #endif /* HAVE_AESGCM */ +#endif /* !defined(_WIN32) && !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) */ #ifdef WOLFSSL_AES_COUNTER #ifdef WOLFSSL_AES_128 if (ctx->cipherType == AES_128_CTR_TYPE || @@ -4310,12 +4321,12 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) ret = AesSetKey_ex(&ctx->cipher.aes, key, ctx->keyLen, iv, AES_ENCRYPTION, 1); if (ret != 0) - return ret; + return WOLFSSL_FAILURE; } if (iv && key == NULL) { ret = wc_AesSetIV(&ctx->cipher.aes, iv); if (ret != 0) - return ret; + return WOLFSSL_FAILURE; } } #endif /* WOLFSSL_AES_128 */ @@ -4338,12 +4349,12 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) ret = AesSetKey_ex(&ctx->cipher.aes, key, ctx->keyLen, iv, AES_ENCRYPTION, 1); if (ret != 0) - return ret; + return WOLFSSL_FAILURE; } if (iv && key == NULL) { ret = wc_AesSetIV(&ctx->cipher.aes, iv); if (ret != 0) - return ret; + return WOLFSSL_FAILURE; } } #endif /* WOLFSSL_AES_192 */ @@ -4366,12 +4377,12 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) ret = AesSetKey_ex(&ctx->cipher.aes, key, ctx->keyLen, iv, AES_ENCRYPTION, 1); if (ret != 0) - return ret; + return WOLFSSL_FAILURE; } if (iv && key == NULL) { ret = wc_AesSetIV(&ctx->cipher.aes, iv); if (ret != 0) - return ret; + return WOLFSSL_FAILURE; } } #endif /* WOLFSSL_AES_256 */ @@ -4392,7 +4403,7 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION, 1); } if (ret != 0) - return ret; + return WOLFSSL_FAILURE; } #endif /* WOLFSSL_AES_128 */ #ifdef WOLFSSL_AES_192 @@ -4411,7 +4422,7 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION, 1); } if (ret != 0) - return ret; + return WOLFSSL_FAILURE; } #endif /* WOLFSSL_AES_192 */ #ifdef WOLFSSL_AES_256 @@ -4430,7 +4441,7 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION, 1); } if (ret != 0) - return ret; + return WOLFSSL_FAILURE; } #endif /* WOLFSSL_AES_256 */ #ifdef WOLFSSL_AES_CFB @@ -4449,12 +4460,12 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) ret = AesSetKey_ex(&ctx->cipher.aes, key, ctx->keyLen, iv, AES_ENCRYPTION, 0); if (ret != 0) - return ret; + return WOLFSSL_FAILURE; } if (iv && key == NULL) { ret = wc_AesSetIV(&ctx->cipher.aes, iv); if (ret != 0) - return ret; + return WOLFSSL_FAILURE; } } #endif /* WOLFSSL_AES_128 */ @@ -4473,12 +4484,12 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) ret = AesSetKey_ex(&ctx->cipher.aes, key, ctx->keyLen, iv, AES_ENCRYPTION, 0); if (ret != 0) - return ret; + return WOLFSSL_FAILURE; } if (iv && key == NULL) { ret = wc_AesSetIV(&ctx->cipher.aes, iv); if (ret != 0) - return ret; + return WOLFSSL_FAILURE; } } #endif /* WOLFSSL_AES_192 */ @@ -4498,14 +4509,14 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) AES_ENCRYPTION, 0); if (ret != 0){ WOLFSSL_MSG("AesSetKey() failed"); - return ret; + return WOLFSSL_FAILURE; } } if (iv && key == NULL) { ret = wc_AesSetIV(&ctx->cipher.aes, iv); if (ret != 0){ WOLFSSL_MSG("wc_AesSetIV() failed"); - return ret; + return WOLFSSL_FAILURE; } } } @@ -4525,12 +4536,12 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) ret = AesSetKey_ex(&ctx->cipher.aes, key, ctx->keyLen, iv, AES_ENCRYPTION, 0); if (ret != 0) - return ret; + return WOLFSSL_FAILURE; } if (iv && key == NULL) { ret = wc_AesSetIV(&ctx->cipher.aes, iv); if (ret != 0) - return ret; + return WOLFSSL_FAILURE; } } #endif /* WOLFSSL_AES_128 */ @@ -4549,12 +4560,12 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) ret = AesSetKey_ex(&ctx->cipher.aes, key, ctx->keyLen, iv, AES_ENCRYPTION, 0); if (ret != 0) - return ret; + return WOLFSSL_FAILURE; } if (iv && key == NULL) { ret = wc_AesSetIV(&ctx->cipher.aes, iv); if (ret != 0) - return ret; + return WOLFSSL_FAILURE; } } #endif /* WOLFSSL_AES_192 */ @@ -4574,14 +4585,14 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) AES_ENCRYPTION, 0); if (ret != 0){ WOLFSSL_MSG("AesSetKey() failed"); - return ret; + return WOLFSSL_FAILURE; } } if (iv && key == NULL) { ret = wc_AesSetIV(&ctx->cipher.aes, iv); if (ret != 0){ WOLFSSL_MSG("wc_AesSetIV() failed"); - return ret; + return WOLFSSL_FAILURE; } } } @@ -4601,12 +4612,12 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) ret = AesSetKey_ex(&ctx->cipher.aes, key, ctx->keyLen, iv, AES_ENCRYPTION, 0); if (ret != 0) - return ret; + return WOLFSSL_FAILURE; } if (iv && key == NULL) { ret = wc_AesSetIV(&ctx->cipher.aes, iv); if (ret != 0) - return ret; + return WOLFSSL_FAILURE; } } #endif /* WOLFSSL_AES_128 */ @@ -4625,12 +4636,12 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) ret = AesSetKey_ex(&ctx->cipher.aes, key, ctx->keyLen, iv, AES_ENCRYPTION, 0); if (ret != 0) - return ret; + return WOLFSSL_FAILURE; } if (iv && key == NULL) { ret = wc_AesSetIV(&ctx->cipher.aes, iv); if (ret != 0) - return ret; + return WOLFSSL_FAILURE; } } #endif /* WOLFSSL_AES_192 */ @@ -4650,14 +4661,14 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) AES_ENCRYPTION, 0); if (ret != 0){ WOLFSSL_MSG("AesSetKey() failed"); - return ret; + return WOLFSSL_FAILURE; } } if (iv && key == NULL) { ret = wc_AesSetIV(&ctx->cipher.aes, iv); if (ret != 0){ WOLFSSL_MSG("wc_AesSetIV() failed"); - return ret; + return WOLFSSL_FAILURE; } } } @@ -4679,12 +4690,12 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) ret = AesSetKey_ex(&ctx->cipher.aes, key, ctx->keyLen, iv, AES_ENCRYPTION, 0); if (ret != 0) - return ret; + return WOLFSSL_FAILURE; } if (iv && key == NULL) { ret = wc_AesSetIV(&ctx->cipher.aes, iv); if (ret != 0) - return ret; + return WOLFSSL_FAILURE; } } #endif /* WOLFSSL_AES_128 */ @@ -4703,12 +4714,12 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) ret = AesSetKey_ex(&ctx->cipher.aes, key, ctx->keyLen, iv, AES_ENCRYPTION, 0); if (ret != 0) - return ret; + return WOLFSSL_FAILURE; } if (iv && key == NULL) { ret = wc_AesSetIV(&ctx->cipher.aes, iv); if (ret != 0) - return ret; + return WOLFSSL_FAILURE; } } #endif /* WOLFSSL_AES_192 */ @@ -4728,14 +4739,14 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) AES_ENCRYPTION, 0); if (ret != 0){ WOLFSSL_MSG("AesSetKey() failed"); - return ret; + return WOLFSSL_FAILURE; } } if (iv && key == NULL) { ret = wc_AesSetIV(&ctx->cipher.aes, iv); if (ret != 0){ WOLFSSL_MSG("wc_AesSetIV() failed"); - return ret; + return WOLFSSL_FAILURE; } } } @@ -4767,7 +4778,7 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION, NULL, 0); if (ret != 0) { WOLFSSL_MSG("wc_AesXtsSetKey() failed"); - return ret; + return WOLFSSL_FAILURE; } } } @@ -4797,7 +4808,7 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION, NULL, 0); if (ret != 0) { WOLFSSL_MSG("wc_AesXtsSetKey() failed"); - return ret; + return WOLFSSL_FAILURE; } } } @@ -4821,7 +4832,7 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) ret = wc_Des_SetKey(&ctx->cipher.des, key, iv, ctx->enc ? DES_ENCRYPTION : DES_DECRYPTION); if (ret != 0) - return ret; + return WOLFSSL_FAILURE; } if (iv && key == NULL) @@ -4843,7 +4854,7 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) ret = wc_Des_SetKey(&ctx->cipher.des, key, NULL, ctx->enc ? DES_ENCRYPTION : DES_DECRYPTION); if (ret != 0) - return ret; + return WOLFSSL_FAILURE; } } #endif @@ -4863,13 +4874,13 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) ret = wc_Des3_SetKey(&ctx->cipher.des3, key, iv, ctx->enc ? DES_ENCRYPTION : DES_DECRYPTION); if (ret != 0) - return ret; + return WOLFSSL_FAILURE; } if (iv && key == NULL) { ret = wc_Des3_SetIV(&ctx->cipher.des3, iv); if (ret != 0) - return ret; + return WOLFSSL_FAILURE; } } else if (ctx->cipherType == DES_EDE3_ECB_TYPE || @@ -4887,7 +4898,7 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) ret = wc_Des3_SetKey(&ctx->cipher.des3, key, NULL, ctx->enc ? DES_ENCRYPTION : DES_DECRYPTION); if (ret != 0) - return ret; + return WOLFSSL_FAILURE; } } #endif /* NO_DES3 */ @@ -4922,7 +4933,7 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) iv, ctx->enc ? IDEA_ENCRYPTION : IDEA_DECRYPTION); if (ret != 0) - return ret; + return WOLFSSL_FAILURE; } if (iv && key == NULL) @@ -4947,7 +4958,6 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) return WOLFSSL_SUCCESS; } - /* WOLFSSL_SUCCESS on ok */ int wolfSSL_EVP_CIPHER_CTX_key_length(WOLFSSL_EVP_CIPHER_CTX* ctx) { @@ -4958,7 +4968,6 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) return 0; /* failure */ } - /* WOLFSSL_SUCCESS on ok */ int wolfSSL_EVP_CIPHER_CTX_set_key_length(WOLFSSL_EVP_CIPHER_CTX* ctx, int keylen) @@ -5249,7 +5258,7 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) #endif /* Set to 0 if no match */ - ctx->macType = wolfSSL_EVP_MD_type(md); + ctx->macType = wolfSSL_EVP_md2macType(md); if (XSTRNCMP(md, "SHA256", 6) == 0) { ret = wolfSSL_SHA256_Init(&(ctx->hash.digest.sha256)); } @@ -5895,6 +5904,14 @@ int wolfSSL_EVP_PKEY_set1_DH(WOLFSSL_EVP_PKEY *pkey, WOLFSSL_DH *key) return WOLFSSL_SUCCESS; } +WOLFSSL_DH* wolfSSL_EVP_PKEY_get0_DH(WOLFSSL_EVP_PKEY* key) +{ + if (!key) { + return NULL; + } + return key->dh; +} + WOLFSSL_DH* wolfSSL_EVP_PKEY_get1_DH(WOLFSSL_EVP_PKEY* key) { WOLFSSL_DH* local = NULL; @@ -5907,7 +5924,6 @@ WOLFSSL_DH* wolfSSL_EVP_PKEY_get1_DH(WOLFSSL_EVP_PKEY* key) } if (key->type == EVP_PKEY_DH) { - local = wolfSSL_DH_new(); if (local == NULL) { WOLFSSL_MSG("Error creating a new WOLFSSL_DH structure"); @@ -6369,6 +6385,8 @@ int wolfSSL_EVP_PKEY_type(int type) return EVP_PKEY_DSA; case EVP_PKEY_EC: return EVP_PKEY_EC; + case EVP_PKEY_DH: + return EVP_PKEY_DH; default: return NID_undef; } @@ -6472,18 +6490,19 @@ int wolfSSL_EVP_PKEY_assign_DH(EVP_PKEY* pkey, WOLFSSL_DH* key) #endif /* OPENSSL_EXTRA */ -#ifdef OPENSSL_EXTRA_X509_SMALL +#if defined(OPENSSL_EXTRA_X509_SMALL) +/* Subset of OPENSSL_EXTRA for PKEY operations PKEY free is needed by the + * subset of X509 API */ WOLFSSL_EVP_PKEY* wolfSSL_EVP_PKEY_new(void){ return wolfSSL_EVP_PKEY_new_ex(NULL); } - WOLFSSL_EVP_PKEY* wolfSSL_EVP_PKEY_new_ex(void* heap) { WOLFSSL_EVP_PKEY* pkey; int ret; - WOLFSSL_ENTER("wolfSSL_EVP_PKEY_new"); + WOLFSSL_ENTER("wolfSSL_EVP_PKEY_new_ex"); pkey = (WOLFSSL_EVP_PKEY*)XMALLOC(sizeof(WOLFSSL_EVP_PKEY), heap, DYNAMIC_TYPE_PUBLIC_KEY); if (pkey != NULL) { @@ -6544,14 +6563,14 @@ void wolfSSL_EVP_PKEY_free(WOLFSSL_EVP_PKEY* key) break; #endif /* NO_RSA */ - #ifdef HAVE_ECC + #if defined(HAVE_ECC) && defined(OPENSSL_EXTRA) case EVP_PKEY_EC: if (key->ecc != NULL && key->ownEcc == 1) { wolfSSL_EC_KEY_free(key->ecc); key->ecc = NULL; } break; - #endif /* HAVE_ECC */ + #endif /* HAVE_ECC && OPENSSL_EXTRA */ #ifndef NO_DSA case EVP_PKEY_DSA: From 8112c81fc563efedc2d02d4b1d863ae29687e772 Mon Sep 17 00:00:00 2001 From: Stanislav Klima Date: Thu, 16 Apr 2020 23:30:11 +0200 Subject: [PATCH 023/298] Added missing NO_CERTS check. --- src/internal.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/internal.c b/src/internal.c index a13e566be..226bf2f27 100644 --- a/src/internal.c +++ b/src/internal.c @@ -24044,6 +24044,8 @@ static int DoSessionTicket(WOLFSSL* ssl, const byte* input, word32* inOutIdx, #endif /* NO_WOLFSSL_CLIENT */ +#ifndef NO_CERTS + #ifdef HAVE_PK_CALLBACKS int GetPrivateKeySigSize(WOLFSSL* ssl) { @@ -24087,6 +24089,8 @@ static int DoSessionTicket(WOLFSSL* ssl, const byte* input, word32* inOutIdx, } #endif /* HAVE_PK_CALLBACKS */ +#endif /* NO_CERTS */ + #ifdef HAVE_ECC /* returns the WOLFSSL_* version of the curve from the OID sum */ word16 GetCurveByOID(int oidSum) { From 75c14e4c8eb6f6d3a2ffdb2bea29968443b872ab Mon Sep 17 00:00:00 2001 From: Sean Parkinson Date: Mon, 20 Apr 2020 09:09:45 +1000 Subject: [PATCH 024/298] Only use Intel instruction movbe when available --- wolfcrypt/src/cpuid.c | 1 + wolfcrypt/src/sp_x86_64.c | 215 +++++- wolfcrypt/src/sp_x86_64_asm.S | 1317 +++++++++++++++++++++++++++++---- wolfssl/wolfcrypt/cpuid.h | 2 + 4 files changed, 1385 insertions(+), 150 deletions(-) diff --git a/wolfcrypt/src/cpuid.c b/wolfcrypt/src/cpuid.c index 85c4bf2d6..cc360a3c1 100644 --- a/wolfcrypt/src/cpuid.c +++ b/wolfcrypt/src/cpuid.c @@ -97,6 +97,7 @@ if (cpuid_flag(7, 0, EBX, 18)) { cpuid_flags |= CPUID_RDSEED; } if (cpuid_flag(1, 0, ECX, 25)) { cpuid_flags |= CPUID_AESNI ; } if (cpuid_flag(7, 0, EBX, 19)) { cpuid_flags |= CPUID_ADX ; } + if (cpuid_flag(1, 0, ECX, 22)) { cpuid_flags |= CPUID_MOVBE ; } cpuid_check = 1; } } diff --git a/wolfcrypt/src/sp_x86_64.c b/wolfcrypt/src/sp_x86_64.c index 3e49d2022..f94612136 100644 --- a/wolfcrypt/src/sp_x86_64.c +++ b/wolfcrypt/src/sp_x86_64.c @@ -49,7 +49,27 @@ #ifdef WOLFSSL_SP_X86_64_ASM #if defined(WOLFSSL_HAVE_SP_RSA) || defined(WOLFSSL_HAVE_SP_DH) #ifndef WOLFSSL_SP_NO_2048 -extern void sp_2048_from_bin(sp_digit* r, int size, const byte* a, int n); +extern void sp_2048_from_bin_bswap(sp_digit* r, int size, const byte* a, int n); +extern void sp_2048_from_bin_movbe(sp_digit* r, int size, const byte* a, int n); +/* Read big endian unsigned byte array into r. + * + * r A single precision integer. + * size Maximum number of bytes to convert + * a Byte array. + * n Number of bytes in array to read. + */ +static void sp_2048_from_bin(sp_digit* r, int size, const byte* a, int n) +{ + word32 cpuid_flags = cpuid_get_flags(); + + if (IS_INTEL_MOVBE(cpuid_flags)) { + sp_2048_from_bin_movbe(r, size, a, n); + } + else { + sp_2048_from_bin_bswap(r, size, a, n); + } +} + /* Convert an mp_int to an array of sp_digit. * * r A single precision integer. @@ -132,7 +152,26 @@ static void sp_2048_from_mp(sp_digit* r, int size, const mp_int* a) #endif } -extern void sp_2048_to_bin(sp_digit* r, byte* a); +extern void sp_2048_to_bin_bswap(sp_digit* r, byte* a); +extern void sp_2048_to_bin_movbe(sp_digit* r, byte* a); +/* Write r as big endian to byte array. + * Fixed length number of bytes written: 256 + * + * r A single precision integer. + * a Byte array. + */ +static void sp_2048_to_bin(sp_digit* r, byte* a) +{ + word32 cpuid_flags = cpuid_get_flags(); + + if (IS_INTEL_MOVBE(cpuid_flags)) { + sp_2048_to_bin_movbe(r, a); + } + else { + sp_2048_to_bin_bswap(r, a); + } +} + extern void sp_2048_mul_16(sp_digit* r, const sp_digit* a, const sp_digit* b); extern void sp_2048_sqr_16(sp_digit* r, const sp_digit* a); extern void sp_2048_mul_avx2_16(sp_digit* r, const sp_digit* a, const sp_digit* b); @@ -2184,7 +2223,27 @@ int sp_ModExp_1024(mp_int* base, mp_int* exp, mp_int* mod, mp_int* res) #endif /* !WOLFSSL_SP_NO_2048 */ #ifndef WOLFSSL_SP_NO_3072 -extern void sp_3072_from_bin(sp_digit* r, int size, const byte* a, int n); +extern void sp_3072_from_bin_bswap(sp_digit* r, int size, const byte* a, int n); +extern void sp_3072_from_bin_movbe(sp_digit* r, int size, const byte* a, int n); +/* Read big endian unsigned byte array into r. + * + * r A single precision integer. + * size Maximum number of bytes to convert + * a Byte array. + * n Number of bytes in array to read. + */ +static void sp_3072_from_bin(sp_digit* r, int size, const byte* a, int n) +{ + word32 cpuid_flags = cpuid_get_flags(); + + if (IS_INTEL_MOVBE(cpuid_flags)) { + sp_3072_from_bin_movbe(r, size, a, n); + } + else { + sp_3072_from_bin_bswap(r, size, a, n); + } +} + /* Convert an mp_int to an array of sp_digit. * * r A single precision integer. @@ -2267,7 +2326,26 @@ static void sp_3072_from_mp(sp_digit* r, int size, const mp_int* a) #endif } -extern void sp_3072_to_bin(sp_digit* r, byte* a); +extern void sp_3072_to_bin_bswap(sp_digit* r, byte* a); +extern void sp_3072_to_bin_movbe(sp_digit* r, byte* a); +/* Write r as big endian to byte array. + * Fixed length number of bytes written: 384 + * + * r A single precision integer. + * a Byte array. + */ +static void sp_3072_to_bin(sp_digit* r, byte* a) +{ + word32 cpuid_flags = cpuid_get_flags(); + + if (IS_INTEL_MOVBE(cpuid_flags)) { + sp_3072_to_bin_movbe(r, a); + } + else { + sp_3072_to_bin_bswap(r, a); + } +} + extern void sp_3072_mul_12(sp_digit* r, const sp_digit* a, const sp_digit* b); extern void sp_3072_sqr_12(sp_digit* r, const sp_digit* a); extern void sp_3072_mul_avx2_12(sp_digit* r, const sp_digit* a, const sp_digit* b); @@ -4333,7 +4411,27 @@ int sp_ModExp_1536(mp_int* base, mp_int* exp, mp_int* mod, mp_int* res) #endif /* !WOLFSSL_SP_NO_3072 */ #ifdef WOLFSSL_SP_4096 -extern void sp_4096_from_bin(sp_digit* r, int size, const byte* a, int n); +extern void sp_4096_from_bin_bswap(sp_digit* r, int size, const byte* a, int n); +extern void sp_4096_from_bin_movbe(sp_digit* r, int size, const byte* a, int n); +/* Read big endian unsigned byte array into r. + * + * r A single precision integer. + * size Maximum number of bytes to convert + * a Byte array. + * n Number of bytes in array to read. + */ +static void sp_4096_from_bin(sp_digit* r, int size, const byte* a, int n) +{ + word32 cpuid_flags = cpuid_get_flags(); + + if (IS_INTEL_MOVBE(cpuid_flags)) { + sp_4096_from_bin_movbe(r, size, a, n); + } + else { + sp_4096_from_bin_bswap(r, size, a, n); + } +} + /* Convert an mp_int to an array of sp_digit. * * r A single precision integer. @@ -4416,7 +4514,26 @@ static void sp_4096_from_mp(sp_digit* r, int size, const mp_int* a) #endif } -extern void sp_4096_to_bin(sp_digit* r, byte* a); +extern void sp_4096_to_bin_bswap(sp_digit* r, byte* a); +extern void sp_4096_to_bin_movbe(sp_digit* r, byte* a); +/* Write r as big endian to byte array. + * Fixed length number of bytes written: 512 + * + * r A single precision integer. + * a Byte array. + */ +static void sp_4096_to_bin(sp_digit* r, byte* a) +{ + word32 cpuid_flags = cpuid_get_flags(); + + if (IS_INTEL_MOVBE(cpuid_flags)) { + sp_4096_to_bin_movbe(r, a); + } + else { + sp_4096_to_bin_bswap(r, a); + } +} + extern sp_digit sp_4096_sub_in_place_64(sp_digit* a, const sp_digit* b); extern sp_digit sp_4096_add_64(sp_digit* r, const sp_digit* a, const sp_digit* b); extern void sp_4096_mul_64(sp_digit* r, const sp_digit* a, const sp_digit* b); @@ -22065,7 +22182,27 @@ static int sp_256_iszero_4(const sp_digit* a) #endif /* WOLFSSL_VALIDATE_ECC_KEYGEN || HAVE_ECC_SIGN || HAVE_ECC_VERIFY */ extern void sp_256_add_one_4(sp_digit* a); -extern void sp_256_from_bin(sp_digit* r, int size, const byte* a, int n); +extern void sp_256_from_bin_bswap(sp_digit* r, int size, const byte* a, int n); +extern void sp_256_from_bin_movbe(sp_digit* r, int size, const byte* a, int n); +/* Read big endian unsigned byte array into r. + * + * r A single precision integer. + * size Maximum number of bytes to convert + * a Byte array. + * n Number of bytes in array to read. + */ +static void sp_256_from_bin(sp_digit* r, int size, const byte* a, int n) +{ + word32 cpuid_flags = cpuid_get_flags(); + + if (IS_INTEL_MOVBE(cpuid_flags)) { + sp_256_from_bin_movbe(r, size, a, n); + } + else { + sp_256_from_bin_bswap(r, size, a, n); + } +} + /* Generates a scalar that is in the range 1..order-1. * * rng Random number generator. @@ -22192,7 +22329,26 @@ int sp_ecc_make_key_256(WC_RNG* rng, mp_int* priv, ecc_point* pub, void* heap) } #ifdef HAVE_ECC_DHE -extern void sp_256_to_bin(sp_digit* r, byte* a); +extern void sp_256_to_bin_bswap(sp_digit* r, byte* a); +extern void sp_256_to_bin_movbe(sp_digit* r, byte* a); +/* Write r as big endian to byte array. + * Fixed length number of bytes written: 32 + * + * r A single precision integer. + * a Byte array. + */ +static void sp_256_to_bin(sp_digit* r, byte* a) +{ + word32 cpuid_flags = cpuid_get_flags(); + + if (IS_INTEL_MOVBE(cpuid_flags)) { + sp_256_to_bin_movbe(r, a); + } + else { + sp_256_to_bin_bswap(r, a); + } +} + /* Multiply the point by the scalar and serialize the X ordinate. * The number is 0 padded to maximum size on output. * @@ -27886,7 +28042,27 @@ static int sp_384_iszero_6(const sp_digit* a) #endif /* WOLFSSL_VALIDATE_ECC_KEYGEN || HAVE_ECC_SIGN || HAVE_ECC_VERIFY */ extern void sp_384_add_one_6(sp_digit* a); -extern void sp_384_from_bin(sp_digit* r, int size, const byte* a, int n); +extern void sp_384_from_bin_bswap(sp_digit* r, int size, const byte* a, int n); +extern void sp_384_from_bin_movbe(sp_digit* r, int size, const byte* a, int n); +/* Read big endian unsigned byte array into r. + * + * r A single precision integer. + * size Maximum number of bytes to convert + * a Byte array. + * n Number of bytes in array to read. + */ +static void sp_384_from_bin(sp_digit* r, int size, const byte* a, int n) +{ + word32 cpuid_flags = cpuid_get_flags(); + + if (IS_INTEL_MOVBE(cpuid_flags)) { + sp_384_from_bin_movbe(r, size, a, n); + } + else { + sp_384_from_bin_bswap(r, size, a, n); + } +} + /* Generates a scalar that is in the range 1..order-1. * * rng Random number generator. @@ -28013,7 +28189,26 @@ int sp_ecc_make_key_384(WC_RNG* rng, mp_int* priv, ecc_point* pub, void* heap) } #ifdef HAVE_ECC_DHE -extern void sp_384_to_bin(sp_digit* r, byte* a); +extern void sp_384_to_bin_bswap(sp_digit* r, byte* a); +extern void sp_384_to_bin_movbe(sp_digit* r, byte* a); +/* Write r as big endian to byte array. + * Fixed length number of bytes written: 48 + * + * r A single precision integer. + * a Byte array. + */ +static void sp_384_to_bin(sp_digit* r, byte* a) +{ + word32 cpuid_flags = cpuid_get_flags(); + + if (IS_INTEL_MOVBE(cpuid_flags)) { + sp_384_to_bin_movbe(r, a); + } + else { + sp_384_to_bin_bswap(r, a); + } +} + /* Multiply the point by the scalar and serialize the X ordinate. * The number is 0 padded to maximum size on output. * diff --git a/wolfcrypt/src/sp_x86_64_asm.S b/wolfcrypt/src/sp_x86_64_asm.S index c6941f1f0..58ae2271a 100644 --- a/wolfcrypt/src/sp_x86_64_asm.S +++ b/wolfcrypt/src/sp_x86_64_asm.S @@ -23,6 +23,7 @@ #ifndef WOLFSSL_SP_NO_2048 #ifndef WOLFSSL_SP_NO_2048 /* Read big endian unsigned byte array into r. + * Uses the bswap instruction. * * r A single precision integer. * size Maximum number of bytes to convert @@ -30,22 +31,114 @@ * n Number of bytes in array to read. */ #ifndef __APPLE__ -.globl sp_2048_from_bin -.type sp_2048_from_bin,@function +.globl sp_2048_from_bin_bswap +.type sp_2048_from_bin_bswap,@function .align 16 -sp_2048_from_bin: +sp_2048_from_bin_bswap: #else -.globl _sp_2048_from_bin +.globl _sp_2048_from_bin_bswap .p2align 4 -_sp_2048_from_bin: +_sp_2048_from_bin_bswap: #endif /* __APPLE__ */ movq %rdx, %r9 movq %rdi, %r10 addq %rcx, %r9 addq $256, %r10 xorq %r11, %r11 - jmp L_2048_from_bin_64_end -L_2048_from_bin_64_start: + jmp L_2048_from_bin_bswap_64_end +L_2048_from_bin_bswap_64_start: + subq $64, %r9 + movq 56(%r9), %rax + movq 48(%r9), %r8 + bswapq %rax + bswapq %r8 + movq %rax, (%rdi) + movq %r8, 8(%rdi) + movq 40(%r9), %rax + movq 32(%r9), %r8 + bswapq %rax + bswapq %r8 + movq %rax, 16(%rdi) + movq %r8, 24(%rdi) + movq 24(%r9), %rax + movq 16(%r9), %r8 + bswapq %rax + bswapq %r8 + movq %rax, 32(%rdi) + movq %r8, 40(%rdi) + movq 8(%r9), %rax + movq (%r9), %r8 + bswapq %rax + bswapq %r8 + movq %rax, 48(%rdi) + movq %r8, 56(%rdi) + addq $64, %rdi + subq $64, %rcx +L_2048_from_bin_bswap_64_end: + cmpq $63, %rcx + jg L_2048_from_bin_bswap_64_start + jmp L_2048_from_bin_bswap_8_end +L_2048_from_bin_bswap_8_start: + subq $8, %r9 + movq (%r9), %rax + bswapq %rax + movq %rax, (%rdi) + addq $8, %rdi + subq $8, %rcx +L_2048_from_bin_bswap_8_end: + cmpq $7, %rcx + jg L_2048_from_bin_bswap_8_start + cmpq %r11, %rcx + je L_2048_from_bin_bswap_hi_end + movq %r11, %r8 + movq %r11, %rax +L_2048_from_bin_bswap_hi_start: + movb (%rdx), %al + shlq $8, %r8 + incq %rdx + addq %rax, %r8 + decq %rcx + jg L_2048_from_bin_bswap_hi_start + movq %r8, (%rdi) + addq $8, %rdi +L_2048_from_bin_bswap_hi_end: + cmpq %r10, %rdi + je L_2048_from_bin_bswap_zero_end +L_2048_from_bin_bswap_zero_start: + movq %r11, (%rdi) + addq $8, %rdi + cmpq %r10, %rdi + jl L_2048_from_bin_bswap_zero_start +L_2048_from_bin_bswap_zero_end: + repz retq +#ifndef __APPLE__ +.size sp_2048_from_bin_bswap,.-sp_2048_from_bin_bswap +#endif /* __APPLE__ */ +/* Read big endian unsigned byte array into r. + * Uses the movbe instruction which is an optional instruction. + * + * r A single precision integer. + * size Maximum number of bytes to convert + * a Byte array. + * n Number of bytes in array to read. + */ +#ifndef __APPLE__ +.globl sp_2048_from_bin_movbe +.type sp_2048_from_bin_movbe,@function +.align 16 +sp_2048_from_bin_movbe: +#else +.globl _sp_2048_from_bin_movbe +.p2align 4 +_sp_2048_from_bin_movbe: +#endif /* __APPLE__ */ + movq %rdx, %r9 + movq %rdi, %r10 + addq %rcx, %r9 + addq $256, %r10 + xorq %r11, %r11 + jmp L_2048_from_bin_movbe_64_end +L_2048_from_bin_movbe_64_start: subq $64, %r9 movbeq 56(%r9), %rax movbeq 48(%r9), %r8 @@ -65,60 +158,178 @@ L_2048_from_bin_64_start: movq %r8, 56(%rdi) addq $64, %rdi subq $64, %rcx -L_2048_from_bin_64_end: +L_2048_from_bin_movbe_64_end: cmpq $63, %rcx - jg L_2048_from_bin_64_start - jmp L_2048_from_bin_8_end -L_2048_from_bin_8_start: + jg L_2048_from_bin_movbe_64_start + jmp L_2048_from_bin_movbe_8_end +L_2048_from_bin_movbe_8_start: subq $8, %r9 movbeq (%r9), %rax movq %rax, (%rdi) addq $8, %rdi subq $8, %rcx -L_2048_from_bin_8_end: +L_2048_from_bin_movbe_8_end: cmpq $7, %rcx - jg L_2048_from_bin_8_start + jg L_2048_from_bin_movbe_8_start cmpq %r11, %rcx - je L_2048_from_bin_hi_end + je L_2048_from_bin_movbe_hi_end movq %r11, %r8 movq %r11, %rax -L_2048_from_bin_hi_start: +L_2048_from_bin_movbe_hi_start: movb (%rdx), %al shlq $8, %r8 incq %rdx addq %rax, %r8 decq %rcx - jg L_2048_from_bin_hi_start + jg L_2048_from_bin_movbe_hi_start movq %r8, (%rdi) addq $8, %rdi -L_2048_from_bin_hi_end: +L_2048_from_bin_movbe_hi_end: cmpq %r10, %rdi - je L_2048_from_bin_zero_end -L_2048_from_bin_zero_start: + je L_2048_from_bin_movbe_zero_end +L_2048_from_bin_movbe_zero_start: movq %r11, (%rdi) addq $8, %rdi cmpq %r10, %rdi - jl L_2048_from_bin_zero_start -L_2048_from_bin_zero_end: + jl L_2048_from_bin_movbe_zero_start +L_2048_from_bin_movbe_zero_end: repz retq #ifndef __APPLE__ -.size sp_2048_from_bin,.-sp_2048_from_bin +.size sp_2048_from_bin_movbe,.-sp_2048_from_bin_movbe #endif /* __APPLE__ */ /* Write r as big endian to byte array. * Fixed length number of bytes written: 256 + * Uses the bswap instruction. * * r A single precision integer. * a Byte array. */ #ifndef __APPLE__ -.globl sp_2048_to_bin -.type sp_2048_to_bin,@function +.globl sp_2048_to_bin_bswap +.type sp_2048_to_bin_bswap,@function .align 16 -sp_2048_to_bin: +sp_2048_to_bin_bswap: #else -.globl _sp_2048_to_bin +.globl _sp_2048_to_bin_bswap .p2align 4 -_sp_2048_to_bin: +_sp_2048_to_bin_bswap: +#endif /* __APPLE__ */ + movq 248(%rdi), %rdx + movq 240(%rdi), %rax + bswapq %rdx + bswapq %rax + movq %rdx, (%rsi) + movq %rax, 8(%rsi) + movq 232(%rdi), %rdx + movq 224(%rdi), %rax + bswapq %rdx + bswapq %rax + movq %rdx, 16(%rsi) + movq %rax, 24(%rsi) + movq 216(%rdi), %rdx + movq 208(%rdi), %rax + bswapq %rdx + bswapq %rax + movq %rdx, 32(%rsi) + movq %rax, 40(%rsi) + movq 200(%rdi), %rdx + movq 192(%rdi), %rax + bswapq %rdx + bswapq %rax + movq %rdx, 48(%rsi) + movq %rax, 56(%rsi) + movq 184(%rdi), %rdx + movq 176(%rdi), %rax + bswapq %rdx + bswapq %rax + movq %rdx, 64(%rsi) + movq %rax, 72(%rsi) + movq 168(%rdi), %rdx + movq 160(%rdi), %rax + bswapq %rdx + bswapq %rax + movq %rdx, 80(%rsi) + movq %rax, 88(%rsi) + movq 152(%rdi), %rdx + movq 144(%rdi), %rax + bswapq %rdx + bswapq %rax + movq %rdx, 96(%rsi) + movq %rax, 104(%rsi) + movq 136(%rdi), %rdx + movq 128(%rdi), %rax + bswapq %rdx + bswapq %rax + movq %rdx, 112(%rsi) + movq %rax, 120(%rsi) + movq 120(%rdi), %rdx + movq 112(%rdi), %rax + bswapq %rdx + bswapq %rax + movq %rdx, 128(%rsi) + movq %rax, 136(%rsi) + movq 104(%rdi), %rdx + movq 96(%rdi), %rax + bswapq %rdx + bswapq %rax + movq %rdx, 144(%rsi) + movq %rax, 152(%rsi) + movq 88(%rdi), %rdx + movq 80(%rdi), %rax + bswapq %rdx + bswapq %rax + movq %rdx, 160(%rsi) + movq %rax, 168(%rsi) + movq 72(%rdi), %rdx + movq 64(%rdi), %rax + bswapq %rdx + bswapq %rax + movq %rdx, 176(%rsi) + movq %rax, 184(%rsi) + movq 56(%rdi), %rdx + movq 48(%rdi), %rax + bswapq %rdx + bswapq %rax + movq %rdx, 192(%rsi) + movq %rax, 200(%rsi) + movq 40(%rdi), %rdx + movq 32(%rdi), %rax + bswapq %rdx + bswapq %rax + movq %rdx, 208(%rsi) + movq %rax, 216(%rsi) + movq 24(%rdi), %rdx + movq 16(%rdi), %rax + bswapq %rdx + bswapq %rax + movq %rdx, 224(%rsi) + movq %rax, 232(%rsi) + movq 8(%rdi), %rdx + movq (%rdi), %rax + bswapq %rdx + bswapq %rax + movq %rdx, 240(%rsi) + movq %rax, 248(%rsi) + repz retq +#ifndef __APPLE__ +.size sp_2048_to_bin_bswap,.-sp_2048_to_bin_bswap +#endif /* __APPLE__ */ +/* Write r as big endian to byte array. + * Fixed length number of bytes written: 256 + * Uses the movbe instruction which is optional. + * + * r A single precision integer. + * a Byte array. + */ +#ifndef __APPLE__ +.globl sp_2048_to_bin_movbe +.type sp_2048_to_bin_movbe,@function +.align 16 +sp_2048_to_bin_movbe: +#else +.globl _sp_2048_to_bin_movbe +.p2align 4 +_sp_2048_to_bin_movbe: #endif /* __APPLE__ */ movbeq 248(%rdi), %rdx movbeq 240(%rdi), %rax @@ -186,7 +397,7 @@ _sp_2048_to_bin: movq %rax, 248(%rsi) repz retq #ifndef __APPLE__ -.size sp_2048_to_bin,.-sp_2048_to_bin +.size sp_2048_to_bin_movbe,.-sp_2048_to_bin_movbe #endif /* __APPLE__ */ /* Multiply a and b into r. (r = a * b) * @@ -12288,6 +12499,7 @@ _sp_2048_lshift_32: #ifndef WOLFSSL_SP_NO_3072 #ifndef WOLFSSL_SP_NO_3072 /* Read big endian unsigned byte array into r. + * Uses the bswap instruction. * * r A single precision integer. * size Maximum number of bytes to convert @@ -12295,22 +12507,114 @@ _sp_2048_lshift_32: * n Number of bytes in array to read. */ #ifndef __APPLE__ -.globl sp_3072_from_bin -.type sp_3072_from_bin,@function +.globl sp_3072_from_bin_bswap +.type sp_3072_from_bin_bswap,@function .align 16 -sp_3072_from_bin: +sp_3072_from_bin_bswap: #else -.globl _sp_3072_from_bin +.globl _sp_3072_from_bin_bswap .p2align 4 -_sp_3072_from_bin: +_sp_3072_from_bin_bswap: #endif /* __APPLE__ */ movq %rdx, %r9 movq %rdi, %r10 addq %rcx, %r9 addq $384, %r10 xorq %r11, %r11 - jmp L_3072_from_bin_64_end -L_3072_from_bin_64_start: + jmp L_3072_from_bin_bswap_64_end +L_3072_from_bin_bswap_64_start: + subq $64, %r9 + movq 56(%r9), %rax + movq 48(%r9), %r8 + bswapq %rax + bswapq %r8 + movq %rax, (%rdi) + movq %r8, 8(%rdi) + movq 40(%r9), %rax + movq 32(%r9), %r8 + bswapq %rax + bswapq %r8 + movq %rax, 16(%rdi) + movq %r8, 24(%rdi) + movq 24(%r9), %rax + movq 16(%r9), %r8 + bswapq %rax + bswapq %r8 + movq %rax, 32(%rdi) + movq %r8, 40(%rdi) + movq 8(%r9), %rax + movq (%r9), %r8 + bswapq %rax + bswapq %r8 + movq %rax, 48(%rdi) + movq %r8, 56(%rdi) + addq $64, %rdi + subq $64, %rcx +L_3072_from_bin_bswap_64_end: + cmpq $63, %rcx + jg L_3072_from_bin_bswap_64_start + jmp L_3072_from_bin_bswap_8_end +L_3072_from_bin_bswap_8_start: + subq $8, %r9 + movq (%r9), %rax + bswapq %rax + movq %rax, (%rdi) + addq $8, %rdi + subq $8, %rcx +L_3072_from_bin_bswap_8_end: + cmpq $7, %rcx + jg L_3072_from_bin_bswap_8_start + cmpq %r11, %rcx + je L_3072_from_bin_bswap_hi_end + movq %r11, %r8 + movq %r11, %rax +L_3072_from_bin_bswap_hi_start: + movb (%rdx), %al + shlq $8, %r8 + incq %rdx + addq %rax, %r8 + decq %rcx + jg L_3072_from_bin_bswap_hi_start + movq %r8, (%rdi) + addq $8, %rdi +L_3072_from_bin_bswap_hi_end: + cmpq %r10, %rdi + je L_3072_from_bin_bswap_zero_end +L_3072_from_bin_bswap_zero_start: + movq %r11, (%rdi) + addq $8, %rdi + cmpq %r10, %rdi + jl L_3072_from_bin_bswap_zero_start +L_3072_from_bin_bswap_zero_end: + repz retq +#ifndef __APPLE__ +.size sp_3072_from_bin_bswap,.-sp_3072_from_bin_bswap +#endif /* __APPLE__ */ +/* Read big endian unsigned byte array into r. + * Uses the movbe instruction which is an optional instruction. + * + * r A single precision integer. + * size Maximum number of bytes to convert + * a Byte array. + * n Number of bytes in array to read. + */ +#ifndef __APPLE__ +.globl sp_3072_from_bin_movbe +.type sp_3072_from_bin_movbe,@function +.align 16 +sp_3072_from_bin_movbe: +#else +.globl _sp_3072_from_bin_movbe +.p2align 4 +_sp_3072_from_bin_movbe: +#endif /* __APPLE__ */ + movq %rdx, %r9 + movq %rdi, %r10 + addq %rcx, %r9 + addq $384, %r10 + xorq %r11, %r11 + jmp L_3072_from_bin_movbe_64_end +L_3072_from_bin_movbe_64_start: subq $64, %r9 movbeq 56(%r9), %rax movbeq 48(%r9), %r8 @@ -12330,60 +12634,226 @@ L_3072_from_bin_64_start: movq %r8, 56(%rdi) addq $64, %rdi subq $64, %rcx -L_3072_from_bin_64_end: +L_3072_from_bin_movbe_64_end: cmpq $63, %rcx - jg L_3072_from_bin_64_start - jmp L_3072_from_bin_8_end -L_3072_from_bin_8_start: + jg L_3072_from_bin_movbe_64_start + jmp L_3072_from_bin_movbe_8_end +L_3072_from_bin_movbe_8_start: subq $8, %r9 movbeq (%r9), %rax movq %rax, (%rdi) addq $8, %rdi subq $8, %rcx -L_3072_from_bin_8_end: +L_3072_from_bin_movbe_8_end: cmpq $7, %rcx - jg L_3072_from_bin_8_start + jg L_3072_from_bin_movbe_8_start cmpq %r11, %rcx - je L_3072_from_bin_hi_end + je L_3072_from_bin_movbe_hi_end movq %r11, %r8 movq %r11, %rax -L_3072_from_bin_hi_start: +L_3072_from_bin_movbe_hi_start: movb (%rdx), %al shlq $8, %r8 incq %rdx addq %rax, %r8 decq %rcx - jg L_3072_from_bin_hi_start + jg L_3072_from_bin_movbe_hi_start movq %r8, (%rdi) addq $8, %rdi -L_3072_from_bin_hi_end: +L_3072_from_bin_movbe_hi_end: cmpq %r10, %rdi - je L_3072_from_bin_zero_end -L_3072_from_bin_zero_start: + je L_3072_from_bin_movbe_zero_end +L_3072_from_bin_movbe_zero_start: movq %r11, (%rdi) addq $8, %rdi cmpq %r10, %rdi - jl L_3072_from_bin_zero_start -L_3072_from_bin_zero_end: + jl L_3072_from_bin_movbe_zero_start +L_3072_from_bin_movbe_zero_end: repz retq #ifndef __APPLE__ -.size sp_3072_from_bin,.-sp_3072_from_bin +.size sp_3072_from_bin_movbe,.-sp_3072_from_bin_movbe #endif /* __APPLE__ */ /* Write r as big endian to byte array. * Fixed length number of bytes written: 384 + * Uses the bswap instruction. * * r A single precision integer. * a Byte array. */ #ifndef __APPLE__ -.globl sp_3072_to_bin -.type sp_3072_to_bin,@function +.globl sp_3072_to_bin_bswap +.type sp_3072_to_bin_bswap,@function .align 16 -sp_3072_to_bin: +sp_3072_to_bin_bswap: #else -.globl _sp_3072_to_bin +.globl _sp_3072_to_bin_bswap .p2align 4 -_sp_3072_to_bin: +_sp_3072_to_bin_bswap: +#endif /* __APPLE__ */ + movq 376(%rdi), %rdx + movq 368(%rdi), %rax + bswapq %rdx + bswapq %rax + movq %rdx, (%rsi) + movq %rax, 8(%rsi) + movq 360(%rdi), %rdx + movq 352(%rdi), %rax + bswapq %rdx + bswapq %rax + movq %rdx, 16(%rsi) + movq %rax, 24(%rsi) + movq 344(%rdi), %rdx + movq 336(%rdi), %rax + bswapq %rdx + bswapq %rax + movq %rdx, 32(%rsi) + movq %rax, 40(%rsi) + movq 328(%rdi), %rdx + movq 320(%rdi), %rax + bswapq %rdx + bswapq %rax + movq %rdx, 48(%rsi) + movq %rax, 56(%rsi) + movq 312(%rdi), %rdx + movq 304(%rdi), %rax + bswapq %rdx + bswapq %rax + movq %rdx, 64(%rsi) + movq %rax, 72(%rsi) + movq 296(%rdi), %rdx + movq 288(%rdi), %rax + bswapq %rdx + bswapq %rax + movq %rdx, 80(%rsi) + movq %rax, 88(%rsi) + movq 280(%rdi), %rdx + movq 272(%rdi), %rax + bswapq %rdx + bswapq %rax + movq %rdx, 96(%rsi) + movq %rax, 104(%rsi) + movq 264(%rdi), %rdx + movq 256(%rdi), %rax + bswapq %rdx + bswapq %rax + movq %rdx, 112(%rsi) + movq %rax, 120(%rsi) + movq 248(%rdi), %rdx + movq 240(%rdi), %rax + bswapq %rdx + bswapq %rax + movq %rdx, 128(%rsi) + movq %rax, 136(%rsi) + movq 232(%rdi), %rdx + movq 224(%rdi), %rax + bswapq %rdx + bswapq %rax + movq %rdx, 144(%rsi) + movq %rax, 152(%rsi) + movq 216(%rdi), %rdx + movq 208(%rdi), %rax + bswapq %rdx + bswapq %rax + movq %rdx, 160(%rsi) + movq %rax, 168(%rsi) + movq 200(%rdi), %rdx + movq 192(%rdi), %rax + bswapq %rdx + bswapq %rax + movq %rdx, 176(%rsi) + movq %rax, 184(%rsi) + movq 184(%rdi), %rdx + movq 176(%rdi), %rax + bswapq %rdx + bswapq %rax + movq %rdx, 192(%rsi) + movq %rax, 200(%rsi) + movq 168(%rdi), %rdx + movq 160(%rdi), %rax + bswapq %rdx + bswapq %rax + movq %rdx, 208(%rsi) + movq %rax, 216(%rsi) + movq 152(%rdi), %rdx + movq 144(%rdi), %rax + bswapq %rdx + bswapq %rax + movq %rdx, 224(%rsi) + movq %rax, 232(%rsi) + movq 136(%rdi), %rdx + movq 128(%rdi), %rax + bswapq %rdx + bswapq %rax + movq %rdx, 240(%rsi) + movq %rax, 248(%rsi) + movq 120(%rdi), %rdx + movq 112(%rdi), %rax + bswapq %rdx + bswapq %rax + movq %rdx, 256(%rsi) + movq %rax, 264(%rsi) + movq 104(%rdi), %rdx + movq 96(%rdi), %rax + bswapq %rdx + bswapq %rax + movq %rdx, 272(%rsi) + movq %rax, 280(%rsi) + movq 88(%rdi), %rdx + movq 80(%rdi), %rax + bswapq %rdx + bswapq %rax + movq %rdx, 288(%rsi) + movq %rax, 296(%rsi) + movq 72(%rdi), %rdx + movq 64(%rdi), %rax + bswapq %rdx + bswapq %rax + movq %rdx, 304(%rsi) + movq %rax, 312(%rsi) + movq 56(%rdi), %rdx + movq 48(%rdi), %rax + bswapq %rdx + bswapq %rax + movq %rdx, 320(%rsi) + movq %rax, 328(%rsi) + movq 40(%rdi), %rdx + movq 32(%rdi), %rax + bswapq %rdx + bswapq %rax + movq %rdx, 336(%rsi) + movq %rax, 344(%rsi) + movq 24(%rdi), %rdx + movq 16(%rdi), %rax + bswapq %rdx + bswapq %rax + movq %rdx, 352(%rsi) + movq %rax, 360(%rsi) + movq 8(%rdi), %rdx + movq (%rdi), %rax + bswapq %rdx + bswapq %rax + movq %rdx, 368(%rsi) + movq %rax, 376(%rsi) + repz retq +#ifndef __APPLE__ +.size sp_3072_to_bin_bswap,.-sp_3072_to_bin_bswap +#endif /* __APPLE__ */ +/* Write r as big endian to byte array. + * Fixed length number of bytes written: 384 + * Uses the movbe instruction which is optional. + * + * r A single precision integer. + * a Byte array. + */ +#ifndef __APPLE__ +.globl sp_3072_to_bin_movbe +.type sp_3072_to_bin_movbe,@function +.align 16 +sp_3072_to_bin_movbe: +#else +.globl _sp_3072_to_bin_movbe +.p2align 4 +_sp_3072_to_bin_movbe: #endif /* __APPLE__ */ movbeq 376(%rdi), %rdx movbeq 368(%rdi), %rax @@ -12483,7 +12953,7 @@ _sp_3072_to_bin: movq %rax, 376(%rsi) repz retq #ifndef __APPLE__ -.size sp_3072_to_bin,.-sp_3072_to_bin +.size sp_3072_to_bin_movbe,.-sp_3072_to_bin_movbe #endif /* __APPLE__ */ /* Multiply a and b into r. (r = a * b) * @@ -27167,6 +27637,7 @@ _sp_3072_lshift_48: #ifdef WOLFSSL_SP_4096 #ifdef WOLFSSL_SP_4096 /* Read big endian unsigned byte array into r. + * Uses the bswap instruction. * * r A single precision integer. * size Maximum number of bytes to convert @@ -27174,22 +27645,114 @@ _sp_3072_lshift_48: * n Number of bytes in array to read. */ #ifndef __APPLE__ -.globl sp_4096_from_bin -.type sp_4096_from_bin,@function +.globl sp_4096_from_bin_bswap +.type sp_4096_from_bin_bswap,@function .align 16 -sp_4096_from_bin: +sp_4096_from_bin_bswap: #else -.globl _sp_4096_from_bin +.globl _sp_4096_from_bin_bswap .p2align 4 -_sp_4096_from_bin: +_sp_4096_from_bin_bswap: #endif /* __APPLE__ */ movq %rdx, %r9 movq %rdi, %r10 addq %rcx, %r9 addq $512, %r10 xorq %r11, %r11 - jmp L_4096_from_bin_64_end -L_4096_from_bin_64_start: + jmp L_4096_from_bin_bswap_64_end +L_4096_from_bin_bswap_64_start: + subq $64, %r9 + movq 56(%r9), %rax + movq 48(%r9), %r8 + bswapq %rax + bswapq %r8 + movq %rax, (%rdi) + movq %r8, 8(%rdi) + movq 40(%r9), %rax + movq 32(%r9), %r8 + bswapq %rax + bswapq %r8 + movq %rax, 16(%rdi) + movq %r8, 24(%rdi) + movq 24(%r9), %rax + movq 16(%r9), %r8 + bswapq %rax + bswapq %r8 + movq %rax, 32(%rdi) + movq %r8, 40(%rdi) + movq 8(%r9), %rax + movq (%r9), %r8 + bswapq %rax + bswapq %r8 + movq %rax, 48(%rdi) + movq %r8, 56(%rdi) + addq $64, %rdi + subq $64, %rcx +L_4096_from_bin_bswap_64_end: + cmpq $63, %rcx + jg L_4096_from_bin_bswap_64_start + jmp L_4096_from_bin_bswap_8_end +L_4096_from_bin_bswap_8_start: + subq $8, %r9 + movq (%r9), %rax + bswapq %rax + movq %rax, (%rdi) + addq $8, %rdi + subq $8, %rcx +L_4096_from_bin_bswap_8_end: + cmpq $7, %rcx + jg L_4096_from_bin_bswap_8_start + cmpq %r11, %rcx + je L_4096_from_bin_bswap_hi_end + movq %r11, %r8 + movq %r11, %rax +L_4096_from_bin_bswap_hi_start: + movb (%rdx), %al + shlq $8, %r8 + incq %rdx + addq %rax, %r8 + decq %rcx + jg L_4096_from_bin_bswap_hi_start + movq %r8, (%rdi) + addq $8, %rdi +L_4096_from_bin_bswap_hi_end: + cmpq %r10, %rdi + je L_4096_from_bin_bswap_zero_end +L_4096_from_bin_bswap_zero_start: + movq %r11, (%rdi) + addq $8, %rdi + cmpq %r10, %rdi + jl L_4096_from_bin_bswap_zero_start +L_4096_from_bin_bswap_zero_end: + repz retq +#ifndef __APPLE__ +.size sp_4096_from_bin_bswap,.-sp_4096_from_bin_bswap +#endif /* __APPLE__ */ +/* Read big endian unsigned byte array into r. + * Uses the movbe instruction which is an optional instruction. + * + * r A single precision integer. + * size Maximum number of bytes to convert + * a Byte array. + * n Number of bytes in array to read. + */ +#ifndef __APPLE__ +.globl sp_4096_from_bin_movbe +.type sp_4096_from_bin_movbe,@function +.align 16 +sp_4096_from_bin_movbe: +#else +.globl _sp_4096_from_bin_movbe +.p2align 4 +_sp_4096_from_bin_movbe: +#endif /* __APPLE__ */ + movq %rdx, %r9 + movq %rdi, %r10 + addq %rcx, %r9 + addq $512, %r10 + xorq %r11, %r11 + jmp L_4096_from_bin_movbe_64_end +L_4096_from_bin_movbe_64_start: subq $64, %r9 movbeq 56(%r9), %rax movbeq 48(%r9), %r8 @@ -27209,60 +27772,274 @@ L_4096_from_bin_64_start: movq %r8, 56(%rdi) addq $64, %rdi subq $64, %rcx -L_4096_from_bin_64_end: +L_4096_from_bin_movbe_64_end: cmpq $63, %rcx - jg L_4096_from_bin_64_start - jmp L_4096_from_bin_8_end -L_4096_from_bin_8_start: + jg L_4096_from_bin_movbe_64_start + jmp L_4096_from_bin_movbe_8_end +L_4096_from_bin_movbe_8_start: subq $8, %r9 movbeq (%r9), %rax movq %rax, (%rdi) addq $8, %rdi subq $8, %rcx -L_4096_from_bin_8_end: +L_4096_from_bin_movbe_8_end: cmpq $7, %rcx - jg L_4096_from_bin_8_start + jg L_4096_from_bin_movbe_8_start cmpq %r11, %rcx - je L_4096_from_bin_hi_end + je L_4096_from_bin_movbe_hi_end movq %r11, %r8 movq %r11, %rax -L_4096_from_bin_hi_start: +L_4096_from_bin_movbe_hi_start: movb (%rdx), %al shlq $8, %r8 incq %rdx addq %rax, %r8 decq %rcx - jg L_4096_from_bin_hi_start + jg L_4096_from_bin_movbe_hi_start movq %r8, (%rdi) addq $8, %rdi -L_4096_from_bin_hi_end: +L_4096_from_bin_movbe_hi_end: cmpq %r10, %rdi - je L_4096_from_bin_zero_end -L_4096_from_bin_zero_start: + je L_4096_from_bin_movbe_zero_end +L_4096_from_bin_movbe_zero_start: movq %r11, (%rdi) addq $8, %rdi cmpq %r10, %rdi - jl L_4096_from_bin_zero_start -L_4096_from_bin_zero_end: + jl L_4096_from_bin_movbe_zero_start +L_4096_from_bin_movbe_zero_end: repz retq #ifndef __APPLE__ -.size sp_4096_from_bin,.-sp_4096_from_bin +.size sp_4096_from_bin_movbe,.-sp_4096_from_bin_movbe #endif /* __APPLE__ */ /* Write r as big endian to byte array. * Fixed length number of bytes written: 512 + * Uses the bswap instruction. * * r A single precision integer. * a Byte array. */ #ifndef __APPLE__ -.globl sp_4096_to_bin -.type sp_4096_to_bin,@function +.globl sp_4096_to_bin_bswap +.type sp_4096_to_bin_bswap,@function .align 16 -sp_4096_to_bin: +sp_4096_to_bin_bswap: #else -.globl _sp_4096_to_bin +.globl _sp_4096_to_bin_bswap .p2align 4 -_sp_4096_to_bin: +_sp_4096_to_bin_bswap: +#endif /* __APPLE__ */ + movq 504(%rdi), %rdx + movq 496(%rdi), %rax + bswapq %rdx + bswapq %rax + movq %rdx, (%rsi) + movq %rax, 8(%rsi) + movq 488(%rdi), %rdx + movq 480(%rdi), %rax + bswapq %rdx + bswapq %rax + movq %rdx, 16(%rsi) + movq %rax, 24(%rsi) + movq 472(%rdi), %rdx + movq 464(%rdi), %rax + bswapq %rdx + bswapq %rax + movq %rdx, 32(%rsi) + movq %rax, 40(%rsi) + movq 456(%rdi), %rdx + movq 448(%rdi), %rax + bswapq %rdx + bswapq %rax + movq %rdx, 48(%rsi) + movq %rax, 56(%rsi) + movq 440(%rdi), %rdx + movq 432(%rdi), %rax + bswapq %rdx + bswapq %rax + movq %rdx, 64(%rsi) + movq %rax, 72(%rsi) + movq 424(%rdi), %rdx + movq 416(%rdi), %rax + bswapq %rdx + bswapq %rax + movq %rdx, 80(%rsi) + movq %rax, 88(%rsi) + movq 408(%rdi), %rdx + movq 400(%rdi), %rax + bswapq %rdx + bswapq %rax + movq %rdx, 96(%rsi) + movq %rax, 104(%rsi) + movq 392(%rdi), %rdx + movq 384(%rdi), %rax + bswapq %rdx + bswapq %rax + movq %rdx, 112(%rsi) + movq %rax, 120(%rsi) + movq 376(%rdi), %rdx + movq 368(%rdi), %rax + bswapq %rdx + bswapq %rax + movq %rdx, 128(%rsi) + movq %rax, 136(%rsi) + movq 360(%rdi), %rdx + movq 352(%rdi), %rax + bswapq %rdx + bswapq %rax + movq %rdx, 144(%rsi) + movq %rax, 152(%rsi) + movq 344(%rdi), %rdx + movq 336(%rdi), %rax + bswapq %rdx + bswapq %rax + movq %rdx, 160(%rsi) + movq %rax, 168(%rsi) + movq 328(%rdi), %rdx + movq 320(%rdi), %rax + bswapq %rdx + bswapq %rax + movq %rdx, 176(%rsi) + movq %rax, 184(%rsi) + movq 312(%rdi), %rdx + movq 304(%rdi), %rax + bswapq %rdx + bswapq %rax + movq %rdx, 192(%rsi) + movq %rax, 200(%rsi) + movq 296(%rdi), %rdx + movq 288(%rdi), %rax + bswapq %rdx + bswapq %rax + movq %rdx, 208(%rsi) + movq %rax, 216(%rsi) + movq 280(%rdi), %rdx + movq 272(%rdi), %rax + bswapq %rdx + bswapq %rax + movq %rdx, 224(%rsi) + movq %rax, 232(%rsi) + movq 264(%rdi), %rdx + movq 256(%rdi), %rax + bswapq %rdx + bswapq %rax + movq %rdx, 240(%rsi) + movq %rax, 248(%rsi) + movq 248(%rdi), %rdx + movq 240(%rdi), %rax + bswapq %rdx + bswapq %rax + movq %rdx, 256(%rsi) + movq %rax, 264(%rsi) + movq 232(%rdi), %rdx + movq 224(%rdi), %rax + bswapq %rdx + bswapq %rax + movq %rdx, 272(%rsi) + movq %rax, 280(%rsi) + movq 216(%rdi), %rdx + movq 208(%rdi), %rax + bswapq %rdx + bswapq %rax + movq %rdx, 288(%rsi) + movq %rax, 296(%rsi) + movq 200(%rdi), %rdx + movq 192(%rdi), %rax + bswapq %rdx + bswapq %rax + movq %rdx, 304(%rsi) + movq %rax, 312(%rsi) + movq 184(%rdi), %rdx + movq 176(%rdi), %rax + bswapq %rdx + bswapq %rax + movq %rdx, 320(%rsi) + movq %rax, 328(%rsi) + movq 168(%rdi), %rdx + movq 160(%rdi), %rax + bswapq %rdx + bswapq %rax + movq %rdx, 336(%rsi) + movq %rax, 344(%rsi) + movq 152(%rdi), %rdx + movq 144(%rdi), %rax + bswapq %rdx + bswapq %rax + movq %rdx, 352(%rsi) + movq %rax, 360(%rsi) + movq 136(%rdi), %rdx + movq 128(%rdi), %rax + bswapq %rdx + bswapq %rax + movq %rdx, 368(%rsi) + movq %rax, 376(%rsi) + movq 120(%rdi), %rdx + movq 112(%rdi), %rax + bswapq %rdx + bswapq %rax + movq %rdx, 384(%rsi) + movq %rax, 392(%rsi) + movq 104(%rdi), %rdx + movq 96(%rdi), %rax + bswapq %rdx + bswapq %rax + movq %rdx, 400(%rsi) + movq %rax, 408(%rsi) + movq 88(%rdi), %rdx + movq 80(%rdi), %rax + bswapq %rdx + bswapq %rax + movq %rdx, 416(%rsi) + movq %rax, 424(%rsi) + movq 72(%rdi), %rdx + movq 64(%rdi), %rax + bswapq %rdx + bswapq %rax + movq %rdx, 432(%rsi) + movq %rax, 440(%rsi) + movq 56(%rdi), %rdx + movq 48(%rdi), %rax + bswapq %rdx + bswapq %rax + movq %rdx, 448(%rsi) + movq %rax, 456(%rsi) + movq 40(%rdi), %rdx + movq 32(%rdi), %rax + bswapq %rdx + bswapq %rax + movq %rdx, 464(%rsi) + movq %rax, 472(%rsi) + movq 24(%rdi), %rdx + movq 16(%rdi), %rax + bswapq %rdx + bswapq %rax + movq %rdx, 480(%rsi) + movq %rax, 488(%rsi) + movq 8(%rdi), %rdx + movq (%rdi), %rax + bswapq %rdx + bswapq %rax + movq %rdx, 496(%rsi) + movq %rax, 504(%rsi) + repz retq +#ifndef __APPLE__ +.size sp_4096_to_bin_bswap,.-sp_4096_to_bin_bswap +#endif /* __APPLE__ */ +/* Write r as big endian to byte array. + * Fixed length number of bytes written: 512 + * Uses the movbe instruction which is optional. + * + * r A single precision integer. + * a Byte array. + */ +#ifndef __APPLE__ +.globl sp_4096_to_bin_movbe +.type sp_4096_to_bin_movbe,@function +.align 16 +sp_4096_to_bin_movbe: +#else +.globl _sp_4096_to_bin_movbe +.p2align 4 +_sp_4096_to_bin_movbe: #endif /* __APPLE__ */ movbeq 504(%rdi), %rdx movbeq 496(%rdi), %rax @@ -27394,7 +28171,7 @@ _sp_4096_to_bin: movq %rax, 504(%rsi) repz retq #ifndef __APPLE__ -.size sp_4096_to_bin,.-sp_4096_to_bin +.size sp_4096_to_bin_movbe,.-sp_4096_to_bin_movbe #endif /* __APPLE__ */ /* Sub b from a into a. (a -= b) * @@ -38579,6 +39356,7 @@ _sp_256_add_one_4: .size sp_256_add_one_4,.-sp_256_add_one_4 #endif /* __APPLE__ */ /* Read big endian unsigned byte array into r. + * Uses the bswap instruction. * * r A single precision integer. * size Maximum number of bytes to convert @@ -38586,22 +39364,114 @@ _sp_256_add_one_4: * n Number of bytes in array to read. */ #ifndef __APPLE__ -.globl sp_256_from_bin -.type sp_256_from_bin,@function +.globl sp_256_from_bin_bswap +.type sp_256_from_bin_bswap,@function .align 16 -sp_256_from_bin: +sp_256_from_bin_bswap: #else -.globl _sp_256_from_bin +.globl _sp_256_from_bin_bswap .p2align 4 -_sp_256_from_bin: +_sp_256_from_bin_bswap: #endif /* __APPLE__ */ movq %rdx, %r9 movq %rdi, %r10 addq %rcx, %r9 addq $32, %r10 xorq %r11, %r11 - jmp L_256_from_bin_64_end -L_256_from_bin_64_start: + jmp L_256_from_bin_bswap_64_end +L_256_from_bin_bswap_64_start: + subq $64, %r9 + movq 56(%r9), %rax + movq 48(%r9), %r8 + bswapq %rax + bswapq %r8 + movq %rax, (%rdi) + movq %r8, 8(%rdi) + movq 40(%r9), %rax + movq 32(%r9), %r8 + bswapq %rax + bswapq %r8 + movq %rax, 16(%rdi) + movq %r8, 24(%rdi) + movq 24(%r9), %rax + movq 16(%r9), %r8 + bswapq %rax + bswapq %r8 + movq %rax, 32(%rdi) + movq %r8, 40(%rdi) + movq 8(%r9), %rax + movq (%r9), %r8 + bswapq %rax + bswapq %r8 + movq %rax, 48(%rdi) + movq %r8, 56(%rdi) + addq $64, %rdi + subq $64, %rcx +L_256_from_bin_bswap_64_end: + cmpq $63, %rcx + jg L_256_from_bin_bswap_64_start + jmp L_256_from_bin_bswap_8_end +L_256_from_bin_bswap_8_start: + subq $8, %r9 + movq (%r9), %rax + bswapq %rax + movq %rax, (%rdi) + addq $8, %rdi + subq $8, %rcx +L_256_from_bin_bswap_8_end: + cmpq $7, %rcx + jg L_256_from_bin_bswap_8_start + cmpq %r11, %rcx + je L_256_from_bin_bswap_hi_end + movq %r11, %r8 + movq %r11, %rax +L_256_from_bin_bswap_hi_start: + movb (%rdx), %al + shlq $8, %r8 + incq %rdx + addq %rax, %r8 + decq %rcx + jg L_256_from_bin_bswap_hi_start + movq %r8, (%rdi) + addq $8, %rdi +L_256_from_bin_bswap_hi_end: + cmpq %r10, %rdi + je L_256_from_bin_bswap_zero_end +L_256_from_bin_bswap_zero_start: + movq %r11, (%rdi) + addq $8, %rdi + cmpq %r10, %rdi + jl L_256_from_bin_bswap_zero_start +L_256_from_bin_bswap_zero_end: + repz retq +#ifndef __APPLE__ +.size sp_256_from_bin_bswap,.-sp_256_from_bin_bswap +#endif /* __APPLE__ */ +/* Read big endian unsigned byte array into r. + * Uses the movbe instruction which is an optional instruction. + * + * r A single precision integer. + * size Maximum number of bytes to convert + * a Byte array. + * n Number of bytes in array to read. + */ +#ifndef __APPLE__ +.globl sp_256_from_bin_movbe +.type sp_256_from_bin_movbe,@function +.align 16 +sp_256_from_bin_movbe: +#else +.globl _sp_256_from_bin_movbe +.p2align 4 +_sp_256_from_bin_movbe: +#endif /* __APPLE__ */ + movq %rdx, %r9 + movq %rdi, %r10 + addq %rcx, %r9 + addq $32, %r10 + xorq %r11, %r11 + jmp L_256_from_bin_movbe_64_end +L_256_from_bin_movbe_64_start: subq $64, %r9 movbeq 56(%r9), %rax movbeq 48(%r9), %r8 @@ -38621,60 +39491,94 @@ L_256_from_bin_64_start: movq %r8, 56(%rdi) addq $64, %rdi subq $64, %rcx -L_256_from_bin_64_end: +L_256_from_bin_movbe_64_end: cmpq $63, %rcx - jg L_256_from_bin_64_start - jmp L_256_from_bin_8_end -L_256_from_bin_8_start: + jg L_256_from_bin_movbe_64_start + jmp L_256_from_bin_movbe_8_end +L_256_from_bin_movbe_8_start: subq $8, %r9 movbeq (%r9), %rax movq %rax, (%rdi) addq $8, %rdi subq $8, %rcx -L_256_from_bin_8_end: +L_256_from_bin_movbe_8_end: cmpq $7, %rcx - jg L_256_from_bin_8_start + jg L_256_from_bin_movbe_8_start cmpq %r11, %rcx - je L_256_from_bin_hi_end + je L_256_from_bin_movbe_hi_end movq %r11, %r8 movq %r11, %rax -L_256_from_bin_hi_start: +L_256_from_bin_movbe_hi_start: movb (%rdx), %al shlq $8, %r8 incq %rdx addq %rax, %r8 decq %rcx - jg L_256_from_bin_hi_start + jg L_256_from_bin_movbe_hi_start movq %r8, (%rdi) addq $8, %rdi -L_256_from_bin_hi_end: +L_256_from_bin_movbe_hi_end: cmpq %r10, %rdi - je L_256_from_bin_zero_end -L_256_from_bin_zero_start: + je L_256_from_bin_movbe_zero_end +L_256_from_bin_movbe_zero_start: movq %r11, (%rdi) addq $8, %rdi cmpq %r10, %rdi - jl L_256_from_bin_zero_start -L_256_from_bin_zero_end: + jl L_256_from_bin_movbe_zero_start +L_256_from_bin_movbe_zero_end: repz retq #ifndef __APPLE__ -.size sp_256_from_bin,.-sp_256_from_bin +.size sp_256_from_bin_movbe,.-sp_256_from_bin_movbe #endif /* __APPLE__ */ /* Write r as big endian to byte array. * Fixed length number of bytes written: 32 + * Uses the bswap instruction. * * r A single precision integer. * a Byte array. */ #ifndef __APPLE__ -.globl sp_256_to_bin -.type sp_256_to_bin,@function +.globl sp_256_to_bin_bswap +.type sp_256_to_bin_bswap,@function .align 16 -sp_256_to_bin: +sp_256_to_bin_bswap: #else -.globl _sp_256_to_bin +.globl _sp_256_to_bin_bswap .p2align 4 -_sp_256_to_bin: +_sp_256_to_bin_bswap: +#endif /* __APPLE__ */ + movq 24(%rdi), %rdx + movq 16(%rdi), %rax + bswapq %rdx + bswapq %rax + movq %rdx, (%rsi) + movq %rax, 8(%rsi) + movq 8(%rdi), %rdx + movq (%rdi), %rax + bswapq %rdx + bswapq %rax + movq %rdx, 16(%rsi) + movq %rax, 24(%rsi) + repz retq +#ifndef __APPLE__ +.size sp_256_to_bin_bswap,.-sp_256_to_bin_bswap +#endif /* __APPLE__ */ +/* Write r as big endian to byte array. + * Fixed length number of bytes written: 32 + * Uses the movbe instruction which is optional. + * + * r A single precision integer. + * a Byte array. + */ +#ifndef __APPLE__ +.globl sp_256_to_bin_movbe +.type sp_256_to_bin_movbe,@function +.align 16 +sp_256_to_bin_movbe: +#else +.globl _sp_256_to_bin_movbe +.p2align 4 +_sp_256_to_bin_movbe: #endif /* __APPLE__ */ movbeq 24(%rdi), %rdx movbeq 16(%rdi), %rax @@ -38686,7 +39590,7 @@ _sp_256_to_bin: movq %rax, 24(%rsi) repz retq #ifndef __APPLE__ -.size sp_256_to_bin,.-sp_256_to_bin +.size sp_256_to_bin_movbe,.-sp_256_to_bin_movbe #endif /* __APPLE__ */ /* Add b to a into r. (r = a + b) * @@ -41500,6 +42404,7 @@ _sp_384_add_one_6: .size sp_384_add_one_6,.-sp_384_add_one_6 #endif /* __APPLE__ */ /* Read big endian unsigned byte array into r. + * Uses the bswap instruction. * * r A single precision integer. * size Maximum number of bytes to convert @@ -41507,22 +42412,114 @@ _sp_384_add_one_6: * n Number of bytes in array to read. */ #ifndef __APPLE__ -.globl sp_384_from_bin -.type sp_384_from_bin,@function +.globl sp_384_from_bin_bswap +.type sp_384_from_bin_bswap,@function .align 16 -sp_384_from_bin: +sp_384_from_bin_bswap: #else -.globl _sp_384_from_bin +.globl _sp_384_from_bin_bswap .p2align 4 -_sp_384_from_bin: +_sp_384_from_bin_bswap: #endif /* __APPLE__ */ movq %rdx, %r9 movq %rdi, %r10 addq %rcx, %r9 addq $48, %r10 xorq %r11, %r11 - jmp L_384_from_bin_64_end -L_384_from_bin_64_start: + jmp L_384_from_bin_bswap_64_end +L_384_from_bin_bswap_64_start: + subq $64, %r9 + movq 56(%r9), %rax + movq 48(%r9), %r8 + bswapq %rax + bswapq %r8 + movq %rax, (%rdi) + movq %r8, 8(%rdi) + movq 40(%r9), %rax + movq 32(%r9), %r8 + bswapq %rax + bswapq %r8 + movq %rax, 16(%rdi) + movq %r8, 24(%rdi) + movq 24(%r9), %rax + movq 16(%r9), %r8 + bswapq %rax + bswapq %r8 + movq %rax, 32(%rdi) + movq %r8, 40(%rdi) + movq 8(%r9), %rax + movq (%r9), %r8 + bswapq %rax + bswapq %r8 + movq %rax, 48(%rdi) + movq %r8, 56(%rdi) + addq $64, %rdi + subq $64, %rcx +L_384_from_bin_bswap_64_end: + cmpq $63, %rcx + jg L_384_from_bin_bswap_64_start + jmp L_384_from_bin_bswap_8_end +L_384_from_bin_bswap_8_start: + subq $8, %r9 + movq (%r9), %rax + bswapq %rax + movq %rax, (%rdi) + addq $8, %rdi + subq $8, %rcx +L_384_from_bin_bswap_8_end: + cmpq $7, %rcx + jg L_384_from_bin_bswap_8_start + cmpq %r11, %rcx + je L_384_from_bin_bswap_hi_end + movq %r11, %r8 + movq %r11, %rax +L_384_from_bin_bswap_hi_start: + movb (%rdx), %al + shlq $8, %r8 + incq %rdx + addq %rax, %r8 + decq %rcx + jg L_384_from_bin_bswap_hi_start + movq %r8, (%rdi) + addq $8, %rdi +L_384_from_bin_bswap_hi_end: + cmpq %r10, %rdi + je L_384_from_bin_bswap_zero_end +L_384_from_bin_bswap_zero_start: + movq %r11, (%rdi) + addq $8, %rdi + cmpq %r10, %rdi + jl L_384_from_bin_bswap_zero_start +L_384_from_bin_bswap_zero_end: + repz retq +#ifndef __APPLE__ +.size sp_384_from_bin_bswap,.-sp_384_from_bin_bswap +#endif /* __APPLE__ */ +/* Read big endian unsigned byte array into r. + * Uses the movbe instruction which is an optional instruction. + * + * r A single precision integer. + * size Maximum number of bytes to convert + * a Byte array. + * n Number of bytes in array to read. + */ +#ifndef __APPLE__ +.globl sp_384_from_bin_movbe +.type sp_384_from_bin_movbe,@function +.align 16 +sp_384_from_bin_movbe: +#else +.globl _sp_384_from_bin_movbe +.p2align 4 +_sp_384_from_bin_movbe: +#endif /* __APPLE__ */ + movq %rdx, %r9 + movq %rdi, %r10 + addq %rcx, %r9 + addq $48, %r10 + xorq %r11, %r11 + jmp L_384_from_bin_movbe_64_end +L_384_from_bin_movbe_64_start: subq $64, %r9 movbeq 56(%r9), %rax movbeq 48(%r9), %r8 @@ -41542,60 +42539,100 @@ L_384_from_bin_64_start: movq %r8, 56(%rdi) addq $64, %rdi subq $64, %rcx -L_384_from_bin_64_end: +L_384_from_bin_movbe_64_end: cmpq $63, %rcx - jg L_384_from_bin_64_start - jmp L_384_from_bin_8_end -L_384_from_bin_8_start: + jg L_384_from_bin_movbe_64_start + jmp L_384_from_bin_movbe_8_end +L_384_from_bin_movbe_8_start: subq $8, %r9 movbeq (%r9), %rax movq %rax, (%rdi) addq $8, %rdi subq $8, %rcx -L_384_from_bin_8_end: +L_384_from_bin_movbe_8_end: cmpq $7, %rcx - jg L_384_from_bin_8_start + jg L_384_from_bin_movbe_8_start cmpq %r11, %rcx - je L_384_from_bin_hi_end + je L_384_from_bin_movbe_hi_end movq %r11, %r8 movq %r11, %rax -L_384_from_bin_hi_start: +L_384_from_bin_movbe_hi_start: movb (%rdx), %al shlq $8, %r8 incq %rdx addq %rax, %r8 decq %rcx - jg L_384_from_bin_hi_start + jg L_384_from_bin_movbe_hi_start movq %r8, (%rdi) addq $8, %rdi -L_384_from_bin_hi_end: +L_384_from_bin_movbe_hi_end: cmpq %r10, %rdi - je L_384_from_bin_zero_end -L_384_from_bin_zero_start: + je L_384_from_bin_movbe_zero_end +L_384_from_bin_movbe_zero_start: movq %r11, (%rdi) addq $8, %rdi cmpq %r10, %rdi - jl L_384_from_bin_zero_start -L_384_from_bin_zero_end: + jl L_384_from_bin_movbe_zero_start +L_384_from_bin_movbe_zero_end: repz retq #ifndef __APPLE__ -.size sp_384_from_bin,.-sp_384_from_bin +.size sp_384_from_bin_movbe,.-sp_384_from_bin_movbe #endif /* __APPLE__ */ /* Write r as big endian to byte array. * Fixed length number of bytes written: 48 + * Uses the bswap instruction. * * r A single precision integer. * a Byte array. */ #ifndef __APPLE__ -.globl sp_384_to_bin -.type sp_384_to_bin,@function +.globl sp_384_to_bin_bswap +.type sp_384_to_bin_bswap,@function .align 16 -sp_384_to_bin: +sp_384_to_bin_bswap: #else -.globl _sp_384_to_bin +.globl _sp_384_to_bin_bswap .p2align 4 -_sp_384_to_bin: +_sp_384_to_bin_bswap: +#endif /* __APPLE__ */ + movq 40(%rdi), %rdx + movq 32(%rdi), %rax + bswapq %rdx + bswapq %rax + movq %rdx, (%rsi) + movq %rax, 8(%rsi) + movq 24(%rdi), %rdx + movq 16(%rdi), %rax + bswapq %rdx + bswapq %rax + movq %rdx, 16(%rsi) + movq %rax, 24(%rsi) + movq 8(%rdi), %rdx + movq (%rdi), %rax + bswapq %rdx + bswapq %rax + movq %rdx, 32(%rsi) + movq %rax, 40(%rsi) + repz retq +#ifndef __APPLE__ +.size sp_384_to_bin_bswap,.-sp_384_to_bin_bswap +#endif /* __APPLE__ */ +/* Write r as big endian to byte array. + * Fixed length number of bytes written: 48 + * Uses the movbe instruction which is optional. + * + * r A single precision integer. + * a Byte array. + */ +#ifndef __APPLE__ +.globl sp_384_to_bin_movbe +.type sp_384_to_bin_movbe,@function +.align 16 +sp_384_to_bin_movbe: +#else +.globl _sp_384_to_bin_movbe +.p2align 4 +_sp_384_to_bin_movbe: #endif /* __APPLE__ */ movbeq 40(%rdi), %rdx movbeq 32(%rdi), %rax @@ -41611,7 +42648,7 @@ _sp_384_to_bin: movq %rax, 40(%rsi) repz retq #ifndef __APPLE__ -.size sp_384_to_bin,.-sp_384_to_bin +.size sp_384_to_bin_movbe,.-sp_384_to_bin_movbe #endif /* __APPLE__ */ /* Sub b from a into a. (a -= b) * diff --git a/wolfssl/wolfcrypt/cpuid.h b/wolfssl/wolfcrypt/cpuid.h index 3c3d1c294..912a01085 100644 --- a/wolfssl/wolfcrypt/cpuid.h +++ b/wolfssl/wolfcrypt/cpuid.h @@ -41,6 +41,7 @@ #define CPUID_BMI2 0x0010 /* MULX, RORX */ #define CPUID_AESNI 0x0020 #define CPUID_ADX 0x0040 /* ADCX, ADOX */ + #define CPUID_MOVBE 0x0080 /* Move and byte swap */ #define IS_INTEL_AVX1(f) ((f) & CPUID_AVX1) #define IS_INTEL_AVX2(f) ((f) & CPUID_AVX2) @@ -49,6 +50,7 @@ #define IS_INTEL_BMI2(f) ((f) & CPUID_BMI2) #define IS_INTEL_AESNI(f) ((f) & CPUID_AESNI) #define IS_INTEL_ADX(f) ((f) & CPUID_ADX) + #define IS_INTEL_MOVBE(f) ((f) & CPUID_MOVBE) void cpuid_set_flags(void); word32 cpuid_get_flags(void); From 231c488ddfc1809b66f8f25d99844029d195fc69 Mon Sep 17 00:00:00 2001 From: Jacob Barthelmeh Date: Mon, 20 Apr 2020 13:44:41 -0600 Subject: [PATCH 025/298] check on tag length for AES-CCM --- wolfcrypt/src/aes.c | 24 ++++++++++++++++++++++++ wolfcrypt/test/test.c | 12 ++++++++++++ 2 files changed, 36 insertions(+) diff --git a/wolfcrypt/src/aes.c b/wolfcrypt/src/aes.c index 4b5b437ca..d1f7dda1c 100644 --- a/wolfcrypt/src/aes.c +++ b/wolfcrypt/src/aes.c @@ -6996,6 +6996,14 @@ int wc_AesCcmEncrypt(Aes* aes, byte* out, const byte* in, word32 inSz, || authTag == NULL || nonceSz < 7 || nonceSz > 13) return BAD_FUNC_ARG; + /* sanity check on tag size */ + if (authTagSz != 4 && authTagSz != 6 && authTagSz != 8 && + authTagSz != 10 && authTagSz != 12 && authTagSz != 14 && + authTagSz != 16) { + WOLFSSL_MSG("Bad auth tag size AES-CCM"); + return BAD_FUNC_ARG; + } + key = (byte*)aes->key; status = wc_AesGetKeySize(aes, &keySize); @@ -7184,6 +7192,14 @@ int wc_AesCcmEncrypt(Aes* aes, byte* out, const byte* in, word32 inSz, authTagSz > AES_BLOCK_SIZE) return BAD_FUNC_ARG; + /* sanity check on tag size */ + if (authTagSz != 4 && authTagSz != 6 && authTagSz != 8 && + authTagSz != 10 && authTagSz != 12 && authTagSz != 14 && + authTagSz != 16) { + WOLFSSL_MSG("Bad auth tag size AES-CCM"); + return BAD_FUNC_ARG; + } + XMEMSET(A, 0, sizeof(A)); XMEMCPY(B+1, nonce, nonceSz); lenSz = AES_BLOCK_SIZE - 1 - (byte)nonceSz; @@ -7280,6 +7296,14 @@ int wc_AesCcmDecrypt(Aes* aes, byte* out, const byte* in, word32 inSz, authTagSz > AES_BLOCK_SIZE) return BAD_FUNC_ARG; + /* sanity check on tag size */ + if (authTagSz != 4 && authTagSz != 6 && authTagSz != 8 && + authTagSz != 10 && authTagSz != 12 && authTagSz != 14 && + authTagSz != 16) { + WOLFSSL_MSG("Bad auth tag size AES-CCM"); + return BAD_FUNC_ARG; + } + o = out; oSz = inSz; XMEMCPY(B+1, nonce, nonceSz); diff --git a/wolfcrypt/test/test.c b/wolfcrypt/test/test.c index b30576db8..b96c245a4 100644 --- a/wolfcrypt/test/test.c +++ b/wolfcrypt/test/test.c @@ -9157,6 +9157,18 @@ int aesccm_test(void) return -6313; #endif + /* test fail on invalid IV sizes */ + result = wc_AesCcmSetKey(&enc, k, sizeof(k)); + if (result != 0) + return -6314; + + /* AES-CCM encrypt and decrypt both use AES encrypt internally */ + result = wc_AesCcmEncrypt(&enc, c2, p, sizeof(c2), iv, sizeof(iv), + t2, 1, a, sizeof(a)); + if (result == 0) { + return -6315; + } + return 0; } #endif /* HAVE_AESCCM WOLFSSL_AES_128 */ From 27011ff7fff17a0dbbd799c4508c1cb3a262b8ca Mon Sep 17 00:00:00 2001 From: John Safranek Date: Wed, 15 Apr 2020 09:58:44 -0700 Subject: [PATCH 026/298] Release Rollup 1. Update configure with the new version. 2. Update the ChangeLog. 3. Update the readme. --- ChangeLog.md | 123 +++++++++++++++++++++++-- README | 228 ++++++++++++++++++++++++---------------------- README.md | 227 +++++++++++++++++++++++---------------------- configure.ac | 4 +- wolfssl/version.h | 4 +- 5 files changed, 354 insertions(+), 232 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 48a5fc079..91bd07892 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -1,15 +1,124 @@ -# wolfSSL Release X.X.X (To Be Determined / Work in Progress) +# wolfSSL Release 4.4.0 (04/17/2020) -If you have questions about this release, then feel free to contact us on our info@ address. +If you have questions about this release, then feel free to contact us on our +info@ address. -Release X.X.X of wolfSSL embedded TLS has bug fixes and new features including: +Release 4.4.0 of wolfSSL embedded TLS has bug fixes and new features including: -##### New Feature Additions +## New Feature Additions -##### Fixes -* Fix for RSA public encrypt / private sign with RSA key sizes over 2048-bit. PR #2755 +* Hexagon support. +* DSP builds. +* Certificate Manager callback support. +* New APIs for running updates to ChaCha20/Poly1305 AEAD. +* Support for use with Apache. +* Add support for IBM s390x. +* PKCS8 support for ED25519. +* OpenVPN support. +* Add P384 curve support to SP. +* Add BIO and EVP API. +* Add AES-OFB mode. +* Add AES-CFB mode. +* Add Curve448, X448, and Ed448. -##### Improvements/Optimizations +## Fixes + +* Fix for RSA public encrypt / private sign with RSA key sizes over 2048-bit. +* Fixes for DTLS handshake issues. +* Correct mispellings. +* Secure renegotiation fix. +* Fix memory leak when using ATECC and non-SECP256R1 curves for sign, verify, + or shared secret. +* Fix for K64 MMCAU with `WOLFSSL_SMALL_STACK_CACHE`. +* Fix the RSA verify only build. +* Fix in SP C implementation for small stack. +* Fix using the auth key id extension is set, hash might not be present. +* Fix when flattening certificate structure to include the subject alt names. +* Fixes for building with ECC sign/verify only. +* Fix for ECC and no cache resistance. +* Fix memory leak in DSA. +* Fix build on minGW. +* Fix `PemToDer()` call in `ProcessBuffer()` to set more than ECC. +* Fix for using RSA without SHA-512. +* Add some close tags to the echoserver HTTP example output. +* Miscellaneous fixes and updates for static analysis reports. +* Fixes for time structure support. +* Fixes for VxWorks support. +* Fixes for Async crypto support. +* Fix cache resist compile to work with SP C code. +* Fixes for Curve25519 x64 asm. +* Fix for SP x64 div. +* Fix for DTLS edge case where CCS and Finished come out of order and the + retransmit pool gets flushed. +* Fix for infinite loop in SHA-1 with small inputs. Thanks to Peter W. +* Fix for FIPS Hmac where `wc_HmacInit()` isn't used. `wc_HmacSetKey()` needs + to initialize the Hmac structure. Type is set to NONE, and checked against + NONE, not 0. +* Fixes for SP RSA private operations. +* Fixes for Xilinx SDK and Zynq UltraScale+ MPSoC +* Fix leak when building with HAVE_AESGCM and NO_AES_DECRYPT. Thanks G.G. +* Fixes for building ECC without ASN. +* Fix for async TLSv1.3 issues. +* Fix `wc_KeyPemToDer()` with PKCS1 and empty key. +* Omit `-fomit-frame-pointer` from CFLAGS in configure.ac. + +## Improvements/Optimizations + +* Qt 5.12 and 5.13 support. +* Added more digest types to Cryptocell RSA sign/verify. +* Some memory usage improvements. +* Speed improvements for mp_rand. +* Improvements to CRL and OCSP support. +* Refactor Poly1305 AEAD/MAC to reduce duplicate code. +* Add blinding to RSA key gen. +* Improvements to blinding. +* Improvement and expansion of OpenSSL Compatibility Layer. +* Improvements to ChaCha20. +* Improvements to X.509 processing. +* Improvements to ECC support. +* Improvements for s7g2 builds. +* Improvement in detecting 64-bit support. +* Refactor to combine duplicate ECC parameter parsing code. +* Improve keyFormat to be set by algId and let later key parsing produce fail. +* Add test cases for 3072-bit and 4096-bit RSA keys. +* Improve signature wrapper and DH test cases. +* Improvements to the configure.ac script. +* Added constant time RSA q modinv p. +* Improve performance of SP Intel 64-bit asm. +* Added a few more functions to the ABI list. +* Improve TLS bidirectional shutdown behavior. +* OpenSSH 8.1 support. +* Improve performance of RSA/DH operations on x64. +* Add support for PKCS7/CMS Enveloped data with fragmented encrypted content. +* Example linker description for FIPS builds to enforce object ordering. +* C# wrapper improvements. ADded TLS client example and TLSv1.3 methods. +* Allow setting MTU in DTLS. +* Improve PKCS12 create for outputting encrypted bundles. +* Constant time EC map to affine for private operations. +* Improve performance of RSA public key ops with TFM. +* Smaller table version fo AES encrypt/decrypt. +* Support IAR with position independent code (ROPI). +* Improve speed of AArch64 assembly. +* Support AES-CTR with AES-NI. +* Support AES-CTR on esp32. +* Add a no malloc option for small SP math. + +## This release of wolfSSL includes a fix for 2 security vulnerabilies. + +* For fast math, use a constant time modular inverse when mapping to affine + when operation involves a private key - key gen, calc shared secret, sign. + Thank you to the Network and Information Security Group (NISEC) at + Tampere University for the report. + +* Change constant time and cache resistant ECC mulmod. Ensure points being + operated on change to make constant time. Thank you to Pietro Borrello at + Sapienza University of Rome. + +For additional vulnerability information visit the vulnerability page at +https://www.wolfssl.com/docs/security-vulnerabilities/ + +See INSTALL file for build instructions. +More info can be found on-line at https://wolfssl.com/wolfSSL/Docs.html diff --git a/README b/README index dcaf84dba..aaab76e48 100644 --- a/README +++ b/README @@ -10,9 +10,9 @@ levels, is up to 20 times smaller than OpenSSL, and offers progressive ciphers such as ChaCha20, Curve25519, NTRU, and Blake2b. User benchmarking and feedback reports dramatically better performance when using wolfSSL over OpenSSL. -wolfSSL is powered by the wolfCrypt library. A version of the wolfCrypt -cryptography library has been FIPS 140-2 validated (Certificate #2425). For -additional information, visit the wolfCrypt FIPS FAQ +wolfSSL is powered by the wolfCrypt library. Two versions of the wolfCrypt +cryptography library have been FIPS 140-2 validated (Certificate #2425 and +certificate #3389). For additional information, visit the wolfCrypt FIPS FAQ (https://www.wolfssl.com/license/fips/) or contact fips@wolfssl.com *** Why choose wolfSSL? *** @@ -73,126 +73,127 @@ should be used for the enum name. *** end Notes *** -********* wolfSSL Release 4.3.0 (12/20/2019) +# wolfSSL Release 4.4.0 (04/17/2020) -If you have questions about this release, then feel free to contact us on our info@ address. +If you have questions about this release, feel free to contact us on our +info@ address. -Release 4.3.0 of wolfSSL embedded TLS has bug fixes and new features including: +Release 4.4.0 of wolfSSL embedded TLS has bug fixes and new features including: -***** New Feature Additions -* Add --enable-libwebsockets option for support of libwebsockets build -* Updated support for NGINX 1.15.0 and added support for 1.16.1 -* Add wc_scrypt_ex API which can take in iterations rather than cost -* Updates to RSA-PSS salt lengths. Macro WOLFSSL_PSS_SALT_LEN_DISCOVER allows for discovering the salt length. Passing RSA_PSS_SALT_LEN_DISCOVER value into wc_RsaPSS_Verify_ex attempts to discover salt length and can use larger salt lengths -* Additional OpenSSL compatibility API wolfSSL_CertManagerGetCerts and wolfSSL_X509_STORE_GetCerts for retrieving certificates -* Add support for 4096-bit RSA/DH operations to SP (single precision) build -* Update support for Google WebRTC to branch m79 -* Adds new FREESCALE_MQX_5_0 macro for MQX 5.0 support -* Adds a CMS/PKCS#7 callback for signing SignedData raw digests enabled with macro HAVE_PKCS7_RSA_RAW_SIGN_CALLBACK and call to function wc_PKCS7_SetRsaSignRawDigestCb -* Add --disable-errorqueue feature to disable adding debug nodes to queue with --enable-opensslextra build -* After defining WOLFSSL_SHUTDOWNONCE macro the function wolfSSL_shutdown will return a specific error code of SSL_SHUTDOWN_ALREADY_DONE_E, to indicate to the application that the shutdown has already occurred -* Add AES-CCM decryption to benchmarking app bundled with wolfSSL +## New Feature Additions +* Hexagon support. +* DSP builds. +* Certificate Manager callback support. +* New APIs for running updates to ChaCha20/Poly1305 AEAD. +* Support for use with Apache. +* Add support for IBM s390x. +* PKCS8 support for ED25519. +* OpenVPN support. +* Add P384 curve support to SP. +* Add BIO and EVP API. +* Add AES-OFB mode. +* Add AES-CFB mode. +* Add Curve448, X448, and Ed448. -***** Fixes -* Fixes IAR warnings with IAR-EWARM 7.50.2 -* Alignment fixes for mmCAU with AES and hashing algorithms -* Fix check for plaintext length when using Encrypt-Then-MAC -* Fix for unit tests with NGINX and debug mode -* Fix for macro names in test cases (WOLFSSL_PUBLIC_MP) and pkcs7.c (HAVE_AESCCM) -* Fix for Apache want read case with BIO retry flag -* Fix for PKCS7 streaming mode that would error rather than verify bundle -* Fix for freeing mutex for X509 and wolfSSL_EVP_PKEY_free, applies to OPENSSL_EXTRA / --enable-opensslextra builds -* Fix for encrypt then MAC when re-handshaking, encrypted handshakes change over to ETM now -* Fix for curve25519 assembly optimizations with GCC + AVX2 -* Fix to hang onto certificate for retrieval if using secure renegotiation and session resumption -* Fixes case where the heap hint is created before WOLFSSL_CTX, when calling wc_LoadStaticMemory instead of wolfSSL_CTX_load_static_memory -* Fix for setting correct return value in PKCS12 parse error case -* Reset certificate extension policy count -* Fix for memcpy with TLS I/O buffers when using staticmemory pools and loading memory as WOLFMEM_IO_POOL_FIXED -* Fixes and updates for STM32 port, including additional mutex protection, AES-GCM decrypt auth tag, AES-CTR mode with CubeMX, update to OpenSTM32 project -* Fix for EVP CipherUpdate decrypt and add a test case -* DTLS fixes including; some DTLS sequence number issues in general where the sequence was incremented twice for each record and some offset values in the DTLS window checking -* Fix sp_add to handle carries properly (--enable-sp-math build) -* Additional sanity check on OCSP response decoder -* Fix for vasprintf with Solaris and AIX builds -* Fix for missing variable declaration with --enable-scep --with-libz build -* Fix for certificate date check with async build -* Sanity check on “out” length with Base64_Decode added -* Decode X.509 name - check input length for jurisdiction -* Additional sanity check on variable out index with DecodePolicyOID -* Fix for PKCS#12 PBKDF buffer size for buffer overflow -* TLS supported curve extension check curve name is in range before checking for disabled -* Sanity check for non TLS 1.3 cipher suite with TLS 1.3 connection -* Poly1305 AVX2 assembly optimization fix for carry with large input values -* Fixes for coverity report including null termination of test case strings and initialization of PKCS7 variables -* Fix for API visibility of wc_ed25519_check_key which resolves a wolfcrypt-py install issue -* Sanity check on max ALPN length accepted -* Additional sanity check when parsing CRL’s for copying the structure, fix for bounds checking -* Additional checks on error string length for debug mode and check for null termination -* ProcessPeerCerts allocating memory for exts with OPENSSL_EXTRA properly -* Clear the top bit when generating a serial number -* Sanity check that ASN date characters are valid ASCII characters -* Fix to add deterministic ECDSA and fix corner cases for add point. -* When getting the DH public key, initialize the P, G, and Pub pointers to NULL, then set that we own the DH parameters flag. This allows FreeSSL to correctly clean up the DH key. +## Fixes -***** Improvements/Optimizations -* Added configure error report with using invalid build of --enable-opensslextra and --enable-opensslcoexist together -* Update PKCS11 for determining key type given the private key type -* Update DoVerifyCallback to check verify param hostName and ipasc (--enable-opensslextra builds) -* additional null sanity checks on input arguments with QSH and Cryptocell builds -* Additional checks on RSA key added to the function wc_CheckRsaKey -* Updates for EBSNET support, including fseek, revised macros in settings.h, and realloc support -* MISRA-C updates for SP math code -* Update to allow compiling for pwdbased/PBKDF2 with having NO_ASN defined -* Modify KeyShare and PreSharedKey TLS 1.3 extension linked list advancement to be easier for compilers to handle -* Optimization to parsing certificate extension name strings -* Adjustment to example server -x runtime behavior when encountering an unrecoverable error case -* Remove Blake2b support from HMAC -* Adds new hash wrapper init wc_HashInit_ex and Adds new PBKDF2 API wc_PBKDF2_ex for using heap hints for custom memory pools -* Adding script to cleanup generated test files, scripts/cleanup_testfiles.sh -* Support 20-byte serial numbers and disallow 0 -* sp_div improved to handle when a has less digits than d (--enable-sp-math build) -* When decoding a policy OID and turning it into a human readable string use snprintf() -* set the IV length of EVP AES GCM to 96-bits by default -* Allow adding CAs for root CA's over the wire that do not have the extended key usage cert_sign set -* Added logging messages for SendAlert call and update to send alert after verify certificate callback -* updates for synchronous OCTEON support in the Sniffer -* Rework BER to DER functions to not be recursive -* Updates to find CRL by AuthKeyId -* Add a check for subject name hash after matching AKID -* Enhancement to mp_invmod/fp_exptmod/sp_exptmod to handle more inputs -* Remove requirement for macro NO_SKID when CRL use is enabled -* Improvements on XFTELL return code and MAX_WOLFSSL_FILE_SIZE checking -* When checking if value is prime return NO in the case of the value 1 -* Improve Cortex-M RSA/DH assembly code performance -* Additional sanity checks on arrays and buffers with OCSP +* Fix for RSA public encrypt / private sign with RSA key sizes over 2048-bit. +* Fixes for DTLS handshake issues. +* Correct mispellings. +* Secure renegotiation fix. +* Fix memory leak when using ATECC and non-SECP256R1 curves for sign, verify, + or shared secret. +* Fix for K64 MMCAU with `WOLFSSL_SMALL_STACK_CACHE`. +* Fix the RSA verify only build. +* Fix in SP C implementation for small stack. +* Fix using the auth key id extension is set, hash might not be present. +* Fix when flattening certificate structure to include the subject alt names. +* Fixes for building with ECC sign/verify only. +* Fix for ECC and no cache resistance. +* Fix memory leak in DSA. +* Fix build on minGW. +* Fix `PemToDer()` call in `ProcessBuffer()` to set more than ECC. +* Fix for using RSA without SHA-512. +* Add some close tags to the echoserver HTTP example output. +* Miscellaneous fixes and updates for static analysis reports. +* Fixes for time structure support. +* Fixes for VxWorks support. +* Fixes for Async crypto support. +* Fix cache resist compile to work with SP C code. +* Fixes for Curve25519 x64 asm. +* Fix for SP x64 div. +* Fix for DTLS edge case where CCS and Finished come out of order and the + retransmit pool gets flushed. +* Fix for infinite loop in SHA-1 with small inputs. Thanks to Peter W. +* Fix for FIPS Hmac where `wc_HmacInit()` isn't used. `wc_HmacSetKey()` needs + to initialize the Hmac structure. Type is set to NONE, and checked against + NONE, not 0. +* Fixes for SP RSA private operations. +* Fixes for Xilinx SDK and Zynq UltraScale+ MPSoC +* Fix leak when building with HAVE_AESGCM and NO_AES_DECRYPT. Thanks G.G. +* Fixes for building ECC without ASN. +* Fix for async TLSv1.3 issues. +* Fix `wc_KeyPemToDer()` with PKCS1 and empty key. +* Omit `-fomit-frame-pointer` from CFLAGS in configure.ac. +## Improvements/Optimizations -***** This release of wolfSSL includes a fix for 6 security vulnerabilities. +* Qt 5.12 and 5.13 support. +* Added more digest types to Cryptocell RSA sign/verify. +* Some memory usage improvements. +* Speed improvements for mp_rand. +* Improvements to CRL and OCSP support. +* Refactor Poly1305 AEAD/MAC to reduce duplicate code. +* Add blinding to RSA key gen. +* Improvements to blinding. +* Improvement and expansion of OpenSSL Compatibility Layer. +* Improvements to ChaCha20. +* Improvements to X.509 processing. +* Improvements to ECC support. +* Improvements for s7g2 builds. +* Improvement in detecting 64-bit support. +* Refactor to combine duplicate ECC parameter parsing code. +* Improve keyFormat to be set by algId and let later key parsing produce fail. +* Add test cases for 3072-bit and 4096-bit RSA keys. +* Improve signature wrapper and DH test cases. +* Improvements to the configure.ac script. +* Added constant time RSA q modinv p. +* Improve performance of SP Intel 64-bit asm. +* Added a few more functions to the ABI list. +* Improve TLS bidirectional shutdown behavior. +* OpenSSH 8.1 support. +* Improve performance of RSA/DH operations on x64. +* Add support for PKCS7/CMS Enveloped data with fragmented encrypted content. +* Example linker description for FIPS builds to enforce object ordering. +* C# wrapper improvements. ADded TLS client example and TLSv1.3 methods. +* Allow setting MTU in DTLS. +* Improve PKCS12 create for outputting encrypted bundles. +* Constant time EC map to affine for private operations. +* Improve performance of RSA public key ops with TFM. +* Smaller table version fo AES encrypt/decrypt. +* Support IAR with position independent code (ROPI). +* Improve speed of AArch64 assembly. +* Support AES-CTR with AES-NI. +* Support AES-CTR on esp32. +* Add a no malloc option for small SP math. +## This release of wolfSSL includes a fix for 2 security vulnerabilies. -A fix for having an additional sanity check when parsing certificate domain names was added. This fix checks that the domain name location index is not past the maximum value before setting it. The reported issue affects users that are parsing certificates and have --enable-opensslextra (macro OPENSSL_EXTRA), or build options that turn this on such as --enable-all, when building wolfSSL. The CVE associated with the fix is CVE-2019-18840. +* For fast math, use a constant time modular inverse when mapping to affine + when operation involves a private key - key gen, calc shared secret, sign. + Thank you to the Network and Information Security Group (NISEC) at + Tampere University for the report. + +* Change constant time and cache resistant ECC mulmod. Ensure points being + operated on change to make constant time. Thank you to Pietro Borrello at + Sapienza University of Rome. -Fix to set a limit on the maximum size of DTLS handshake messages. By default the RFC allows for handshake message sizes of up to 2^24-1 bytes long but in typical field use cases the handshake messages are not this large. Setting a maximum size limit on the handshake message helps avoid a potential DoS attack due to memory being malloc’d. The new default max size is set to handle a certificate chain length of approximately 9, 2048 bit RSA certificates. This only effects builds that have DTLS turned on and have applications that are using DTLS. - -Fix for a potential hang when ECC caching is enabled (off by default) and --enable-fastmath is used. ECC caching is off by default and is turned on in builds that are using --enable-all or --enable-fpecc. This issue does not affect builds that are using the macro WOLFSSL_VALIDATE_ECC_IMPORT which turns on validating all ECC keys that are imported. To fix this potential hang case a sanity check on the input values to the internal invmod function was added. - - -To fix a potential fault injection attack on a wrapper function for wolfCrypt RSA signature generations an additional sanity check verifying the signature after it’s creation was added. This check is already done automatically in current versions of wolfSSL with TLS connections (internal function call of VerifyRsaSign during TLS state machine). The report only affects users making calls to the wolfCrypt function wc_SignatureGenerateHash and does not affect current TLS use cases. Thanks to Daniel Moghimi (@danielmgmi) from Worcester Polytechnic Institute for the report. - - -Blinding was added for DSA signing operations. The DSA signing uses the BEEA algorithm during modular inversion of the nonce which can potentially leak the nonce through side channels such as cache and power fluctuations. The fix of adding in blinding makes the DSA signing operation more resistant to side channel attacks. Users who have turned on DSA (disabled by default) and are performing signing operations should update. Note that DSA is not used in any TLS connections. Thanks to Daniel Moghimi (@danielmgmi) from Worcester Polytechnic Institute for the report. - - -Fix to add additional side channel cache attack resistance to the internal ECC function wc_ecc_mulmod_ex. This function by default is used with ECDSA signing operations. Users should update if performing ECDSA singing operations (server side ECC TLS connections, mutual authentication on client side) or calling wolfCrypt ECC sign functions and have the potential for outside users to perform sophisticated monitoring of the cache.Thanks to Daniel Moghimi (@danielmgmi) from Worcester Polytechnic Institute for the report. - - -For additional vulnerability information visit the vulnerability page at https://www.wolfssl.com/docs/security-vulnerabilities/ +For additional vulnerability information visit the vulnerability page at +https://www.wolfssl.com/docs/security-vulnerabilities/ See INSTALL file for build instructions. -More info can be found on-line at http://wolfssl.com/wolfSSL/Docs.html - +More info can be found on-line at https://wolfssl.com/wolfSSL/Docs.html @@ -203,7 +204,9 @@ More info can be found on-line at http://wolfssl.com/wolfSSL/Docs.html [wolfSSL Wiki](https://github.com/wolfSSL/wolfssl/wiki) -[FIPS FAQ](https://www.wolfssl.com/wolfSSL/fips.html) +[FIPS FAQ](https://wolfssl.com/license/fips) + +[wolfSSL Documents](https://wolfssl.com/wolfSSL/Docs.html) [wolfSSL Manual](https://wolfssl.com/wolfSSL/Docs-wolfssl-manual-toc.html) @@ -214,3 +217,6 @@ More info can be found on-line at http://wolfssl.com/wolfSSL/Docs.html (https://wolfssl.com/wolfSSL/Docs-wolfssl-manual-18-wolfcrypt-api-reference.html) [TLS 1.3](https://www.wolfssl.com/docs/tls13/) + +[wolfSSL Vulnerabilities] +(https://www.wolfssl.com/docs/security-vulnerabilities/) diff --git a/README.md b/README.md index 07ecdd5b0..aaab76e48 100644 --- a/README.md +++ b/README.md @@ -10,9 +10,9 @@ levels, is up to 20 times smaller than OpenSSL, and offers progressive ciphers such as ChaCha20, Curve25519, NTRU, and Blake2b. User benchmarking and feedback reports dramatically better performance when using wolfSSL over OpenSSL. -wolfSSL is powered by the wolfCrypt library. A version of the wolfCrypt -cryptography library has been FIPS 140-2 validated (Certificate #2425). For -additional information, visit the wolfCrypt FIPS FAQ +wolfSSL is powered by the wolfCrypt library. Two versions of the wolfCrypt +cryptography library have been FIPS 140-2 validated (Certificate #2425 and +certificate #3389). For additional information, visit the wolfCrypt FIPS FAQ (https://www.wolfssl.com/license/fips/) or contact fips@wolfssl.com *** Why choose wolfSSL? *** @@ -73,125 +73,127 @@ should be used for the enum name. *** end Notes *** -# wolfSSL Release 4.3.0 (12/20/2019) +# wolfSSL Release 4.4.0 (04/17/2020) -If you have questions about this release, then feel free to contact us on our info@ address. +If you have questions about this release, feel free to contact us on our +info@ address. -Release 4.3.0 of wolfSSL embedded TLS has bug fixes and new features including: +Release 4.4.0 of wolfSSL embedded TLS has bug fixes and new features including: -##### New Feature Additions -* Add --enable-libwebsockets option for support of libwebsockets build -* Updated support for NGINX 1.15.0 and added support for 1.16.1 -* Add wc_scrypt_ex API which can take in iterations rather than cost -* Updates to RSA-PSS salt lengths. Macro WOLFSSL_PSS_SALT_LEN_DISCOVER allows for discovering the salt length. Passing RSA_PSS_SALT_LEN_DISCOVER value into wc_RsaPSS_Verify_ex attempts to discover salt length and can use larger salt lengths -* Additional OpenSSL compatibility API wolfSSL_CertManagerGetCerts and wolfSSL_X509_STORE_GetCerts for retrieving certificates -* Add support for 4096-bit RSA/DH operations to SP (single precision) build -* Update support for Google WebRTC to branch m79 -* Adds new FREESCALE_MQX_5_0 macro for MQX 5.0 support -* Adds a CMS/PKCS#7 callback for signing SignedData raw digests enabled with macro HAVE_PKCS7_RSA_RAW_SIGN_CALLBACK and call to function wc_PKCS7_SetRsaSignRawDigestCb -* Add --disable-errorqueue feature to disable adding debug nodes to queue with --enable-opensslextra build -* After defining WOLFSSL_SHUTDOWNONCE macro the function wolfSSL_shutdown will return a specific error code of SSL_SHUTDOWN_ALREADY_DONE_E, to indicate to the application that the shutdown has already occurred -* Add AES-CCM decryption to benchmarking app bundled with wolfSSL +## New Feature Additions +* Hexagon support. +* DSP builds. +* Certificate Manager callback support. +* New APIs for running updates to ChaCha20/Poly1305 AEAD. +* Support for use with Apache. +* Add support for IBM s390x. +* PKCS8 support for ED25519. +* OpenVPN support. +* Add P384 curve support to SP. +* Add BIO and EVP API. +* Add AES-OFB mode. +* Add AES-CFB mode. +* Add Curve448, X448, and Ed448. -##### Fixes -* Fixes IAR warnings with IAR-EWARM 7.50.2 -* Alignment fixes for mmCAU with AES and hashing algorithms -* Fix check for plaintext length when using Encrypt-Then-MAC -* Fix for unit tests with NGINX and debug mode -* Fix for macro names in test cases (WOLFSSL_PUBLIC_MP) and pkcs7.c (HAVE_AESCCM) -* Fix for Apache want read case with BIO retry flag -* Fix for PKCS7 streaming mode that would error rather than verify bundle -* Fix for freeing mutex for X509 and wolfSSL_EVP_PKEY_free, applies to OPENSSL_EXTRA / --enable-opensslextra builds -* Fix for encrypt then MAC when re-handshaking, encrypted handshakes change over to ETM now -* Fix for curve25519 assembly optimizations with GCC + AVX2 -* Fix to hang onto certificate for retrieval if using secure renegotiation and session resumption -* Fixes case where the heap hint is created before WOLFSSL_CTX, when calling wc_LoadStaticMemory instead of wolfSSL_CTX_load_static_memory -* Fix for setting correct return value in PKCS12 parse error case -* Reset certificate extension policy count -* Fix for memcpy with TLS I/O buffers when using staticmemory pools and loading memory as WOLFMEM_IO_POOL_FIXED -* Fixes and updates for STM32 port, including additional mutex protection, AES-GCM decrypt auth tag, AES-CTR mode with CubeMX, update to OpenSTM32 project -* Fix for EVP CipherUpdate decrypt and add a test case -* DTLS fixes including; some DTLS sequence number issues in general where the sequence was incremented twice for each record and some offset values in the DTLS window checking -* Fix sp_add to handle carries properly (--enable-sp-math build) -* Additional sanity check on OCSP response decoder -* Fix for vasprintf with Solaris and AIX builds -* Fix for missing variable declaration with --enable-scep --with-libz build -* Fix for certificate date check with async build -* Sanity check on “out” length with Base64_Decode added -* Decode X.509 name - check input length for jurisdiction -* Additional sanity check on variable out index with DecodePolicyOID -* Fix for PKCS#12 PBKDF buffer size for buffer overflow -* TLS supported curve extension check curve name is in range before checking for disabled -* Sanity check for non TLS 1.3 cipher suite with TLS 1.3 connection -* Poly1305 AVX2 assembly optimization fix for carry with large input values -* Fixes for coverity report including null termination of test case strings and initialization of PKCS7 variables -* Fix for API visibility of wc_ed25519_check_key which resolves a wolfcrypt-py install issue -* Sanity check on max ALPN length accepted -* Additional sanity check when parsing CRL’s for copying the structure, fix for bounds checking -* Additional checks on error string length for debug mode and check for null termination -* ProcessPeerCerts allocating memory for exts with OPENSSL_EXTRA properly -* Clear the top bit when generating a serial number -* Sanity check that ASN date characters are valid ASCII characters -* Fix to add deterministic ECDSA and fix corner cases for add point. -* When getting the DH public key, initialize the P, G, and Pub pointers to NULL, then set that we own the DH parameters flag. This allows FreeSSL to correctly clean up the DH key. +## Fixes -##### Improvements/Optimizations -* Added configure error report with using invalid build of --enable-opensslextra and --enable-opensslcoexist together -* Update PKCS11 for determining key type given the private key type -* Update DoVerifyCallback to check verify param hostName and ipasc (--enable-opensslextra builds) -* additional null sanity checks on input arguments with QSH and Cryptocell builds -* Additional checks on RSA key added to the function wc_CheckRsaKey -* Updates for EBSNET support, including fseek, revised macros in settings.h, and realloc support -* MISRA-C updates for SP math code -* Update to allow compiling for pwdbased/PBKDF2 with having NO_ASN defined -* Modify KeyShare and PreSharedKey TLS 1.3 extension linked list advancement to be easier for compilers to handle -* Optimization to parsing certificate extension name strings -* Adjustment to example server -x runtime behavior when encountering an unrecoverable error case -* Remove Blake2b support from HMAC -* Adds new hash wrapper init wc_HashInit_ex and Adds new PBKDF2 API wc_PBKDF2_ex for using heap hints for custom memory pools -* Adding script to cleanup generated test files, scripts/cleanup_testfiles.sh -* Support 20-byte serial numbers and disallow 0 -* sp_div improved to handle when a has less digits than d (--enable-sp-math build) -* When decoding a policy OID and turning it into a human readable string use snprintf() -* set the IV length of EVP AES GCM to 96-bits by default -* Allow adding CAs for root CA's over the wire that do not have the extended key usage cert_sign set -* Added logging messages for SendAlert call and update to send alert after verify certificate callback -* updates for synchronous OCTEON support in the Sniffer -* Rework BER to DER functions to not be recursive -* Updates to find CRL by AuthKeyId -* Add a check for subject name hash after matching AKID -* Enhancement to mp_invmod/fp_exptmod/sp_exptmod to handle more inputs -* Remove requirement for macro NO_SKID when CRL use is enabled -* Improvements on XFTELL return code and MAX_WOLFSSL_FILE_SIZE checking -* When checking if value is prime return NO in the case of the value 1 -* Improve Cortex-M RSA/DH assembly code performance -* Additional sanity checks on arrays and buffers with OCSP +* Fix for RSA public encrypt / private sign with RSA key sizes over 2048-bit. +* Fixes for DTLS handshake issues. +* Correct mispellings. +* Secure renegotiation fix. +* Fix memory leak when using ATECC and non-SECP256R1 curves for sign, verify, + or shared secret. +* Fix for K64 MMCAU with `WOLFSSL_SMALL_STACK_CACHE`. +* Fix the RSA verify only build. +* Fix in SP C implementation for small stack. +* Fix using the auth key id extension is set, hash might not be present. +* Fix when flattening certificate structure to include the subject alt names. +* Fixes for building with ECC sign/verify only. +* Fix for ECC and no cache resistance. +* Fix memory leak in DSA. +* Fix build on minGW. +* Fix `PemToDer()` call in `ProcessBuffer()` to set more than ECC. +* Fix for using RSA without SHA-512. +* Add some close tags to the echoserver HTTP example output. +* Miscellaneous fixes and updates for static analysis reports. +* Fixes for time structure support. +* Fixes for VxWorks support. +* Fixes for Async crypto support. +* Fix cache resist compile to work with SP C code. +* Fixes for Curve25519 x64 asm. +* Fix for SP x64 div. +* Fix for DTLS edge case where CCS and Finished come out of order and the + retransmit pool gets flushed. +* Fix for infinite loop in SHA-1 with small inputs. Thanks to Peter W. +* Fix for FIPS Hmac where `wc_HmacInit()` isn't used. `wc_HmacSetKey()` needs + to initialize the Hmac structure. Type is set to NONE, and checked against + NONE, not 0. +* Fixes for SP RSA private operations. +* Fixes for Xilinx SDK and Zynq UltraScale+ MPSoC +* Fix leak when building with HAVE_AESGCM and NO_AES_DECRYPT. Thanks G.G. +* Fixes for building ECC without ASN. +* Fix for async TLSv1.3 issues. +* Fix `wc_KeyPemToDer()` with PKCS1 and empty key. +* Omit `-fomit-frame-pointer` from CFLAGS in configure.ac. +## Improvements/Optimizations -##### This release of wolfSSL includes a fix for 6 security vulnerabilities. +* Qt 5.12 and 5.13 support. +* Added more digest types to Cryptocell RSA sign/verify. +* Some memory usage improvements. +* Speed improvements for mp_rand. +* Improvements to CRL and OCSP support. +* Refactor Poly1305 AEAD/MAC to reduce duplicate code. +* Add blinding to RSA key gen. +* Improvements to blinding. +* Improvement and expansion of OpenSSL Compatibility Layer. +* Improvements to ChaCha20. +* Improvements to X.509 processing. +* Improvements to ECC support. +* Improvements for s7g2 builds. +* Improvement in detecting 64-bit support. +* Refactor to combine duplicate ECC parameter parsing code. +* Improve keyFormat to be set by algId and let later key parsing produce fail. +* Add test cases for 3072-bit and 4096-bit RSA keys. +* Improve signature wrapper and DH test cases. +* Improvements to the configure.ac script. +* Added constant time RSA q modinv p. +* Improve performance of SP Intel 64-bit asm. +* Added a few more functions to the ABI list. +* Improve TLS bidirectional shutdown behavior. +* OpenSSH 8.1 support. +* Improve performance of RSA/DH operations on x64. +* Add support for PKCS7/CMS Enveloped data with fragmented encrypted content. +* Example linker description for FIPS builds to enforce object ordering. +* C# wrapper improvements. ADded TLS client example and TLSv1.3 methods. +* Allow setting MTU in DTLS. +* Improve PKCS12 create for outputting encrypted bundles. +* Constant time EC map to affine for private operations. +* Improve performance of RSA public key ops with TFM. +* Smaller table version fo AES encrypt/decrypt. +* Support IAR with position independent code (ROPI). +* Improve speed of AArch64 assembly. +* Support AES-CTR with AES-NI. +* Support AES-CTR on esp32. +* Add a no malloc option for small SP math. +## This release of wolfSSL includes a fix for 2 security vulnerabilies. -A fix for having an additional sanity check when parsing certificate domain names was added. This fix checks that the domain name location index is not past the maximum value before setting it. The reported issue affects users that are parsing certificates and have --enable-opensslextra (macro OPENSSL_EXTRA), or build options that turn this on such as --enable-all, when building wolfSSL. The CVE associated with the fix is CVE-2019-18840. +* For fast math, use a constant time modular inverse when mapping to affine + when operation involves a private key - key gen, calc shared secret, sign. + Thank you to the Network and Information Security Group (NISEC) at + Tampere University for the report. + +* Change constant time and cache resistant ECC mulmod. Ensure points being + operated on change to make constant time. Thank you to Pietro Borrello at + Sapienza University of Rome. -Fix to set a limit on the maximum size of DTLS handshake messages. By default the RFC allows for handshake message sizes of up to 2^24-1 bytes long but in typical field use cases the handshake messages are not this large. Setting a maximum size limit on the handshake message helps avoid a potential DoS attack due to memory being malloc’d. The new default max size is set to handle a certificate chain length of approximately 9, 2048 bit RSA certificates. This only effects builds that have DTLS turned on and have applications that are using DTLS. - -Fix for a potential hang when ECC caching is enabled (off by default) and --enable-fastmath is used. ECC caching is off by default and is turned on in builds that are using --enable-all or --enable-fpecc. This issue does not affect builds that are using the macro WOLFSSL_VALIDATE_ECC_IMPORT which turns on validating all ECC keys that are imported. To fix this potential hang case a sanity check on the input values to the internal invmod function was added. - - -To fix a potential fault injection attack on a wrapper function for wolfCrypt RSA signature generations an additional sanity check verifying the signature after it’s creation was added. This check is already done automatically in current versions of wolfSSL with TLS connections (internal function call of VerifyRsaSign during TLS state machine). The report only affects users making calls to the wolfCrypt function wc_SignatureGenerateHash and does not affect current TLS use cases. Thanks to Daniel Moghimi (@danielmgmi) from Worcester Polytechnic Institute for the report. - - -Blinding was added for DSA signing operations. The DSA signing uses the BEEA algorithm during modular inversion of the nonce which can potentially leak the nonce through side channels such as cache and power fluctuations. The fix of adding in blinding makes the DSA signing operation more resistant to side channel attacks. Users who have turned on DSA (disabled by default) and are performing signing operations should update. Note that DSA is not used in any TLS connections. Thanks to Daniel Moghimi (@danielmgmi) from Worcester Polytechnic Institute for the report. - - -Fix to add additional side channel cache attack resistance to the internal ECC function wc_ecc_mulmod_ex. This function by default is used with ECDSA signing operations. Users should update if performing ECDSA singing operations (server side ECC TLS connections, mutual authentication on client side) or calling wolfCrypt ECC sign functions and have the potential for outside users to perform sophisticated monitoring of the cache.Thanks to Daniel Moghimi (@danielmgmi) from Worcester Polytechnic Institute for the report. - - -For additional vulnerability information visit the vulnerability page at https://www.wolfssl.com/docs/security-vulnerabilities/ +For additional vulnerability information visit the vulnerability page at +https://www.wolfssl.com/docs/security-vulnerabilities/ See INSTALL file for build instructions. -More info can be found on-line at http://wolfssl.com/wolfSSL/Docs.html +More info can be found on-line at https://wolfssl.com/wolfSSL/Docs.html @@ -202,7 +204,9 @@ More info can be found on-line at http://wolfssl.com/wolfSSL/Docs.html [wolfSSL Wiki](https://github.com/wolfSSL/wolfssl/wiki) -[FIPS FAQ](https://www.wolfssl.com/wolfSSL/fips.html) +[FIPS FAQ](https://wolfssl.com/license/fips) + +[wolfSSL Documents](https://wolfssl.com/wolfSSL/Docs.html) [wolfSSL Manual](https://wolfssl.com/wolfSSL/Docs-wolfssl-manual-toc.html) @@ -213,3 +217,6 @@ More info can be found on-line at http://wolfssl.com/wolfSSL/Docs.html (https://wolfssl.com/wolfSSL/Docs-wolfssl-manual-18-wolfcrypt-api-reference.html) [TLS 1.3](https://www.wolfssl.com/docs/tls13/) + +[wolfSSL Vulnerabilities] +(https://www.wolfssl.com/docs/security-vulnerabilities/) diff --git a/configure.ac b/configure.ac index 457601ae7..ff6b79f86 100644 --- a/configure.ac +++ b/configure.ac @@ -7,7 +7,7 @@ # AC_COPYRIGHT([Copyright (C) 2006-2020 wolfSSL Inc.]) AC_PREREQ([2.63]) -AC_INIT([wolfssl],[4.3.0],[https://github.com/wolfssl/wolfssl/issues],[wolfssl],[https://www.wolfssl.com]) +AC_INIT([wolfssl],[4.4.0],[https://github.com/wolfssl/wolfssl/issues],[wolfssl],[https://www.wolfssl.com]) AC_CONFIG_AUX_DIR([build-aux]) # The following sets CFLAGS to empty if unset on command line. We do not @@ -34,7 +34,7 @@ LT_PREREQ([2.2]) LT_INIT([disable-static win32-dll]) #shared library versioning -WOLFSSL_LIBRARY_VERSION=24:0:0 +WOLFSSL_LIBRARY_VERSION=25:0:1 # | | | # +------+ | +---+ # | | | diff --git a/wolfssl/version.h b/wolfssl/version.h index 4fd4c4f34..332cadfae 100644 --- a/wolfssl/version.h +++ b/wolfssl/version.h @@ -28,8 +28,8 @@ extern "C" { #endif -#define LIBWOLFSSL_VERSION_STRING "4.3.0" -#define LIBWOLFSSL_VERSION_HEX 0x04003000 +#define LIBWOLFSSL_VERSION_STRING "4.4.0" +#define LIBWOLFSSL_VERSION_HEX 0x04004000 #ifdef __cplusplus } From e84cd1a8874ba405e3bd76251ca798b99361cb02 Mon Sep 17 00:00:00 2001 From: John Safranek Date: Wed, 15 Apr 2020 14:02:38 -0700 Subject: [PATCH 027/298] Updated the README file and ChangeLog for some spelling and omissions. --- ChangeLog.md | 14 +++++++------- README | 16 ++++++++-------- README.md | 16 ++++++++-------- 3 files changed, 23 insertions(+), 23 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 91bd07892..56da61d16 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -8,7 +8,7 @@ Release 4.4.0 of wolfSSL embedded TLS has bug fixes and new features including: ## New Feature Additions * Hexagon support. -* DSP builds. +* DSP builds to offload ECC verify operations. * Certificate Manager callback support. * New APIs for running updates to ChaCha20/Poly1305 AEAD. * Support for use with Apache. @@ -20,12 +20,13 @@ Release 4.4.0 of wolfSSL embedded TLS has bug fixes and new features including: * Add AES-OFB mode. * Add AES-CFB mode. * Add Curve448, X448, and Ed448. +* Add Renesas Synergy S7G2 build and hardware acceleration. ## Fixes * Fix for RSA public encrypt / private sign with RSA key sizes over 2048-bit. * Fixes for DTLS handshake issues. -* Correct mispellings. +* Correct misspellings. * Secure renegotiation fix. * Fix memory leak when using ATECC and non-SECP256R1 curves for sign, verify, or shared secret. @@ -76,7 +77,6 @@ Release 4.4.0 of wolfSSL embedded TLS has bug fixes and new features including: * Improvements to ChaCha20. * Improvements to X.509 processing. * Improvements to ECC support. -* Improvements for s7g2 builds. * Improvement in detecting 64-bit support. * Refactor to combine duplicate ECC parameter parsing code. * Improve keyFormat to be set by algId and let later key parsing produce fail. @@ -91,22 +91,22 @@ Release 4.4.0 of wolfSSL embedded TLS has bug fixes and new features including: * Improve performance of RSA/DH operations on x64. * Add support for PKCS7/CMS Enveloped data with fragmented encrypted content. * Example linker description for FIPS builds to enforce object ordering. -* C# wrapper improvements. ADded TLS client example and TLSv1.3 methods. +* C# wrapper improvements. Added TLS client example and TLSv1.3 methods. * Allow setting MTU in DTLS. * Improve PKCS12 create for outputting encrypted bundles. * Constant time EC map to affine for private operations. * Improve performance of RSA public key ops with TFM. -* Smaller table version fo AES encrypt/decrypt. +* Smaller table version of AES encrypt/decrypt. * Support IAR with position independent code (ROPI). * Improve speed of AArch64 assembly. * Support AES-CTR with AES-NI. * Support AES-CTR on esp32. * Add a no malloc option for small SP math. -## This release of wolfSSL includes a fix for 2 security vulnerabilies. +## This release of wolfSSL includes fixes for 2 security vulnerabilities. * For fast math, use a constant time modular inverse when mapping to affine - when operation involves a private key - key gen, calc shared secret, sign. + when operation involves a private key - keygen, calc shared secret, sign. Thank you to the Network and Information Security Group (NISEC) at Tampere University for the report. diff --git a/README b/README index aaab76e48..ec3ba544e 100644 --- a/README +++ b/README @@ -83,7 +83,7 @@ Release 4.4.0 of wolfSSL embedded TLS has bug fixes and new features including: ## New Feature Additions * Hexagon support. -* DSP builds. +* DSP builds to offload ECC verify operations. * Certificate Manager callback support. * New APIs for running updates to ChaCha20/Poly1305 AEAD. * Support for use with Apache. @@ -95,12 +95,13 @@ Release 4.4.0 of wolfSSL embedded TLS has bug fixes and new features including: * Add AES-OFB mode. * Add AES-CFB mode. * Add Curve448, X448, and Ed448. +* Add Renesas Synergy S7G2 build and hardware acceleration. ## Fixes * Fix for RSA public encrypt / private sign with RSA key sizes over 2048-bit. * Fixes for DTLS handshake issues. -* Correct mispellings. +* Correct misspellings. * Secure renegotiation fix. * Fix memory leak when using ATECC and non-SECP256R1 curves for sign, verify, or shared secret. @@ -151,7 +152,6 @@ Release 4.4.0 of wolfSSL embedded TLS has bug fixes and new features including: * Improvements to ChaCha20. * Improvements to X.509 processing. * Improvements to ECC support. -* Improvements for s7g2 builds. * Improvement in detecting 64-bit support. * Refactor to combine duplicate ECC parameter parsing code. * Improve keyFormat to be set by algId and let later key parsing produce fail. @@ -166,25 +166,25 @@ Release 4.4.0 of wolfSSL embedded TLS has bug fixes and new features including: * Improve performance of RSA/DH operations on x64. * Add support for PKCS7/CMS Enveloped data with fragmented encrypted content. * Example linker description for FIPS builds to enforce object ordering. -* C# wrapper improvements. ADded TLS client example and TLSv1.3 methods. +* C# wrapper improvements. Added TLS client example and TLSv1.3 methods. * Allow setting MTU in DTLS. * Improve PKCS12 create for outputting encrypted bundles. * Constant time EC map to affine for private operations. * Improve performance of RSA public key ops with TFM. -* Smaller table version fo AES encrypt/decrypt. +* Smaller table version of AES encrypt/decrypt. * Support IAR with position independent code (ROPI). * Improve speed of AArch64 assembly. * Support AES-CTR with AES-NI. * Support AES-CTR on esp32. * Add a no malloc option for small SP math. -## This release of wolfSSL includes a fix for 2 security vulnerabilies. +## This release of wolfSSL includes fixes for 2 security vulnerabilities. * For fast math, use a constant time modular inverse when mapping to affine - when operation involves a private key - key gen, calc shared secret, sign. + when operation involves a private key - keygen, calc shared secret, sign. Thank you to the Network and Information Security Group (NISEC) at Tampere University for the report. - + * Change constant time and cache resistant ECC mulmod. Ensure points being operated on change to make constant time. Thank you to Pietro Borrello at Sapienza University of Rome. diff --git a/README.md b/README.md index aaab76e48..ec3ba544e 100644 --- a/README.md +++ b/README.md @@ -83,7 +83,7 @@ Release 4.4.0 of wolfSSL embedded TLS has bug fixes and new features including: ## New Feature Additions * Hexagon support. -* DSP builds. +* DSP builds to offload ECC verify operations. * Certificate Manager callback support. * New APIs for running updates to ChaCha20/Poly1305 AEAD. * Support for use with Apache. @@ -95,12 +95,13 @@ Release 4.4.0 of wolfSSL embedded TLS has bug fixes and new features including: * Add AES-OFB mode. * Add AES-CFB mode. * Add Curve448, X448, and Ed448. +* Add Renesas Synergy S7G2 build and hardware acceleration. ## Fixes * Fix for RSA public encrypt / private sign with RSA key sizes over 2048-bit. * Fixes for DTLS handshake issues. -* Correct mispellings. +* Correct misspellings. * Secure renegotiation fix. * Fix memory leak when using ATECC and non-SECP256R1 curves for sign, verify, or shared secret. @@ -151,7 +152,6 @@ Release 4.4.0 of wolfSSL embedded TLS has bug fixes and new features including: * Improvements to ChaCha20. * Improvements to X.509 processing. * Improvements to ECC support. -* Improvements for s7g2 builds. * Improvement in detecting 64-bit support. * Refactor to combine duplicate ECC parameter parsing code. * Improve keyFormat to be set by algId and let later key parsing produce fail. @@ -166,25 +166,25 @@ Release 4.4.0 of wolfSSL embedded TLS has bug fixes and new features including: * Improve performance of RSA/DH operations on x64. * Add support for PKCS7/CMS Enveloped data with fragmented encrypted content. * Example linker description for FIPS builds to enforce object ordering. -* C# wrapper improvements. ADded TLS client example and TLSv1.3 methods. +* C# wrapper improvements. Added TLS client example and TLSv1.3 methods. * Allow setting MTU in DTLS. * Improve PKCS12 create for outputting encrypted bundles. * Constant time EC map to affine for private operations. * Improve performance of RSA public key ops with TFM. -* Smaller table version fo AES encrypt/decrypt. +* Smaller table version of AES encrypt/decrypt. * Support IAR with position independent code (ROPI). * Improve speed of AArch64 assembly. * Support AES-CTR with AES-NI. * Support AES-CTR on esp32. * Add a no malloc option for small SP math. -## This release of wolfSSL includes a fix for 2 security vulnerabilies. +## This release of wolfSSL includes fixes for 2 security vulnerabilities. * For fast math, use a constant time modular inverse when mapping to affine - when operation involves a private key - key gen, calc shared secret, sign. + when operation involves a private key - keygen, calc shared secret, sign. Thank you to the Network and Information Security Group (NISEC) at Tampere University for the report. - + * Change constant time and cache resistant ECC mulmod. Ensure points being operated on change to make constant time. Thank you to Pietro Borrello at Sapienza University of Rome. From 7cbf496329053725b9aa5344a1428db456cde330 Mon Sep 17 00:00:00 2001 From: John Safranek Date: Wed, 15 Apr 2020 12:54:44 -0700 Subject: [PATCH 028/298] Encrypt key requirements check The file wc_encrypt.c offers a function named wc_CryptKey(), which requires PWDBASED and ASN. Added the check for ASN. --- wolfcrypt/src/wc_encrypt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wolfcrypt/src/wc_encrypt.c b/wolfcrypt/src/wc_encrypt.c index 2d8364939..39dbeec5a 100644 --- a/wolfcrypt/src/wc_encrypt.c +++ b/wolfcrypt/src/wc_encrypt.c @@ -363,7 +363,7 @@ int wc_BufferKeyEncrypt(EncryptedInfo* info, byte* der, word32 derSz, #endif /* WOLFSSL_ENCRYPTED_KEYS */ -#ifndef NO_PWDBASED +#if !defined(NO_PWDBASED) && !defined(NO_ASN) #if defined(HAVE_PKCS8) || defined(HAVE_PKCS12) /* Decrypt/Encrypt input in place from parameters based on id From 836e77508db9565edfdf87c2a2ec9eb71c79aa09 Mon Sep 17 00:00:00 2001 From: John Safranek Date: Wed, 15 Apr 2020 22:31:18 -0700 Subject: [PATCH 029/298] Remove notes for reverted DTLS commits. --- ChangeLog.md | 1 - README | 1 - README.md | 1 - 3 files changed, 3 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 56da61d16..6417d0f57 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -25,7 +25,6 @@ Release 4.4.0 of wolfSSL embedded TLS has bug fixes and new features including: ## Fixes * Fix for RSA public encrypt / private sign with RSA key sizes over 2048-bit. -* Fixes for DTLS handshake issues. * Correct misspellings. * Secure renegotiation fix. * Fix memory leak when using ATECC and non-SECP256R1 curves for sign, verify, diff --git a/README b/README index ec3ba544e..98d7ff9a0 100644 --- a/README +++ b/README @@ -100,7 +100,6 @@ Release 4.4.0 of wolfSSL embedded TLS has bug fixes and new features including: ## Fixes * Fix for RSA public encrypt / private sign with RSA key sizes over 2048-bit. -* Fixes for DTLS handshake issues. * Correct misspellings. * Secure renegotiation fix. * Fix memory leak when using ATECC and non-SECP256R1 curves for sign, verify, diff --git a/README.md b/README.md index ec3ba544e..98d7ff9a0 100644 --- a/README.md +++ b/README.md @@ -100,7 +100,6 @@ Release 4.4.0 of wolfSSL embedded TLS has bug fixes and new features including: ## Fixes * Fix for RSA public encrypt / private sign with RSA key sizes over 2048-bit. -* Fixes for DTLS handshake issues. * Correct misspellings. * Secure renegotiation fix. * Fix memory leak when using ATECC and non-SECP256R1 curves for sign, verify, From a29eac035bf956465393f9bd50a7346317fc41b4 Mon Sep 17 00:00:00 2001 From: John Safranek Date: Thu, 16 Apr 2020 09:16:46 -0700 Subject: [PATCH 030/298] Update credit for vulnerability report. --- ChangeLog.md | 4 ++-- README | 4 ++-- README.md | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 6417d0f57..7c60aebea 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -106,8 +106,8 @@ Release 4.4.0 of wolfSSL embedded TLS has bug fixes and new features including: * For fast math, use a constant time modular inverse when mapping to affine when operation involves a private key - keygen, calc shared secret, sign. - Thank you to the Network and Information Security Group (NISEC) at - Tampere University for the report. + Thank you to the Alejandro Cabrera Aldaya, Cesar Pereida García, and + Billy Bob Brumley from Tampere University for the report. * Change constant time and cache resistant ECC mulmod. Ensure points being operated on change to make constant time. Thank you to Pietro Borrello at diff --git a/README b/README index 98d7ff9a0..ef8bb05fe 100644 --- a/README +++ b/README @@ -181,8 +181,8 @@ Release 4.4.0 of wolfSSL embedded TLS has bug fixes and new features including: * For fast math, use a constant time modular inverse when mapping to affine when operation involves a private key - keygen, calc shared secret, sign. - Thank you to the Network and Information Security Group (NISEC) at - Tampere University for the report. + Thank you to the Alejandro Cabrera Aldaya, Cesar Pereida García, and + Billy Bob Brumley from Tampere University for the report. * Change constant time and cache resistant ECC mulmod. Ensure points being operated on change to make constant time. Thank you to Pietro Borrello at diff --git a/README.md b/README.md index 98d7ff9a0..ef8bb05fe 100644 --- a/README.md +++ b/README.md @@ -181,8 +181,8 @@ Release 4.4.0 of wolfSSL embedded TLS has bug fixes and new features including: * For fast math, use a constant time modular inverse when mapping to affine when operation involves a private key - keygen, calc shared secret, sign. - Thank you to the Network and Information Security Group (NISEC) at - Tampere University for the report. + Thank you to the Alejandro Cabrera Aldaya, Cesar Pereida García, and + Billy Bob Brumley from Tampere University for the report. * Change constant time and cache resistant ECC mulmod. Ensure points being operated on change to make constant time. Thank you to Pietro Borrello at From bf4f50ab9356f42f281f9ebea73c39e6c3b75dc2 Mon Sep 17 00:00:00 2001 From: John Safranek Date: Thu, 16 Apr 2020 10:05:02 -0700 Subject: [PATCH 031/298] Add Azure Sphere file missing from release. --- IDE/VS-AZURE-SPHERE/include.am | 1 + 1 file changed, 1 insertion(+) diff --git a/IDE/VS-AZURE-SPHERE/include.am b/IDE/VS-AZURE-SPHERE/include.am index 3a32f1f7c..a7f57d221 100644 --- a/IDE/VS-AZURE-SPHERE/include.am +++ b/IDE/VS-AZURE-SPHERE/include.am @@ -16,3 +16,4 @@ EXTRA_DIST+= IDE/VS-AZURE-SPHERE/server/server.h EXTRA_DIST+= IDE/VS-AZURE-SPHERE/server/server.vcxproj EXTRA_DIST+= IDE/VS-AZURE-SPHERE/wolfcrypt_test/app_manifest.json EXTRA_DIST+= IDE/VS-AZURE-SPHERE/wolfcrypt_test/wolfcrypt_test.vcxproj +EXTRA_DIST+= IDE/VS-AZURE-SPHERE/shared/util.h From 4331b7df1846ea29aa73eaf79df95a08c549722b Mon Sep 17 00:00:00 2001 From: John Safranek Date: Thu, 16 Apr 2020 11:16:52 -0700 Subject: [PATCH 032/298] Update the VS library build resource. --- wolfssl.rc | Bin 4918 -> 4918 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/wolfssl.rc b/wolfssl.rc index f28dab0ce576b8af13825514adfcf911f6c2eca3..1f5bcd15c2791e0768b6dea0f84decb9f93e11cf 100644 GIT binary patch delta 50 zcmdm{woPqA9|xn!09C6;uj7F1XdG#kt@x21`09C6;u%!Uk>ljV7JCrk0Y0*lB`HscpsY{t(5 E0H8AtGXMYp From 087675e31e7e0bae329a6abc98f23f2effa3bd5f Mon Sep 17 00:00:00 2001 From: John Safranek Date: Thu, 16 Apr 2020 13:55:27 -0700 Subject: [PATCH 033/298] Update the RPM build spec. --- rpm/spec.in | 155 ++++++++++++++++++++++++++++------------------------ 1 file changed, 84 insertions(+), 71 deletions(-) diff --git a/rpm/spec.in b/rpm/spec.in index 5af89ccf0..188d91066 100644 --- a/rpm/spec.in +++ b/rpm/spec.in @@ -74,7 +74,7 @@ mkdir -p $RPM_BUILD_ROOT/ %{_libdir}/libwolfssl.la %{_libdir}/libwolfssl.so %{_libdir}/libwolfssl.so.24 -%{_libdir}/libwolfssl.so.24.0.0 +%{_libdir}/libwolfssl.so.24.1.0 %files devel %defattr(-,root,root,-) @@ -113,7 +113,6 @@ mkdir -p $RPM_BUILD_ROOT/ %{_includedir}/cyassl/ctaocrypt/mpi_superclass.h %{_includedir}/cyassl/ctaocrypt/pkcs7.h %{_includedir}/cyassl/ctaocrypt/poly1305.h -%{_includedir}/cyassl/ctaocrypt/wc_port.h %{_includedir}/cyassl/ctaocrypt/pwdbased.h %{_includedir}/cyassl/ctaocrypt/rabbit.h %{_includedir}/cyassl/ctaocrypt/random.h @@ -127,6 +126,7 @@ mkdir -p $RPM_BUILD_ROOT/ %{_includedir}/cyassl/ctaocrypt/tfm.h %{_includedir}/cyassl/ctaocrypt/types.h %{_includedir}/cyassl/ctaocrypt/visibility.h +%{_includedir}/cyassl/ctaocrypt/wc_port.h %{_includedir}/cyassl/error-ssl.h %{_includedir}/cyassl/ocsp.h %{_includedir}/cyassl/openssl/asn1.h @@ -138,10 +138,12 @@ mkdir -p $RPM_BUILD_ROOT/ %{_includedir}/cyassl/openssl/dh.h %{_includedir}/cyassl/openssl/dsa.h %{_includedir}/cyassl/openssl/ec.h -%{_includedir}/cyassl/openssl/ecdsa.h %{_includedir}/cyassl/openssl/ec25519.h -%{_includedir}/cyassl/openssl/ed25519.h +%{_includedir}/cyassl/openssl/ec448.h %{_includedir}/cyassl/openssl/ecdh.h +%{_includedir}/cyassl/openssl/ecdsa.h +%{_includedir}/cyassl/openssl/ed25519.h +%{_includedir}/cyassl/openssl/ed448.h %{_includedir}/cyassl/openssl/engine.h %{_includedir}/cyassl/openssl/err.h %{_includedir}/cyassl/openssl/evp.h @@ -174,68 +176,6 @@ mkdir -p $RPM_BUILD_ROOT/ %{_includedir}/wolfssl/callbacks.h %{_includedir}/wolfssl/certs_test.h %{_includedir}/wolfssl/crl.h -%{_includedir}/wolfssl/wolfio.h -%{_includedir}/wolfssl/wolfcrypt/aes.h -%{_includedir}/wolfssl/wolfcrypt/cmac.h -%{_includedir}/wolfssl/wolfcrypt/arc4.h -%{_includedir}/wolfssl/wolfcrypt/asn.h -%{_includedir}/wolfssl/wolfcrypt/asn_public.h -%{_includedir}/wolfssl/wolfcrypt/blake2-impl.h -%{_includedir}/wolfssl/wolfcrypt/blake2-int.h -%{_includedir}/wolfssl/wolfcrypt/blake2.h -%{_includedir}/wolfssl/wolfcrypt/camellia.h -%{_includedir}/wolfssl/wolfcrypt/chacha.h -%{_includedir}/wolfssl/wolfcrypt/chacha20_poly1305.h -%{_includedir}/wolfssl/wolfcrypt/coding.h -%{_includedir}/wolfssl/wolfcrypt/compress.h -%{_includedir}/wolfssl/wolfcrypt/cpuid.h -%{_includedir}/wolfssl/wolfcrypt/curve25519.h -%{_includedir}/wolfssl/wolfcrypt/cryptocb.h -%{_includedir}/wolfssl/wolfcrypt/des3.h -%{_includedir}/wolfssl/wolfcrypt/dh.h -%{_includedir}/wolfssl/wolfcrypt/dsa.h -%{_includedir}/wolfssl/wolfcrypt/ecc.h -%{_includedir}/wolfssl/wolfcrypt/ed25519.h -%{_includedir}/wolfssl/wolfcrypt/error-crypt.h -%{_includedir}/wolfssl/wolfcrypt/fe_operations.h -%{_includedir}/wolfssl/wolfcrypt/fips_test.h -%{_includedir}/wolfssl/wolfcrypt/ge_operations.h -%{_includedir}/wolfssl/wolfcrypt/hash.h -%{_includedir}/wolfssl/wolfcrypt/hc128.h -%{_includedir}/wolfssl/wolfcrypt/hmac.h -%{_includedir}/wolfssl/wolfcrypt/integer.h -%{_includedir}/wolfssl/wolfcrypt/idea.h -%{_includedir}/wolfssl/wolfcrypt/logging.h -%{_includedir}/wolfssl/wolfcrypt/md2.h -%{_includedir}/wolfssl/wolfcrypt/md4.h -%{_includedir}/wolfssl/wolfcrypt/md5.h -%{_includedir}/wolfssl/wolfcrypt/mem_track.h -%{_includedir}/wolfssl/wolfcrypt/memory.h -%{_includedir}/wolfssl/wolfcrypt/misc.h -%{_includedir}/wolfssl/wolfcrypt/mpi_class.h -%{_includedir}/wolfssl/wolfcrypt/mpi_superclass.h -%{_includedir}/wolfssl/wolfcrypt/pkcs7.h -%{_includedir}/wolfssl/wolfcrypt/pkcs12.h -%{_includedir}/wolfssl/wolfcrypt/wc_port.h -%{_includedir}/wolfssl/wolfcrypt/poly1305.h -%{_includedir}/wolfssl/wolfcrypt/pwdbased.h -%{_includedir}/wolfssl/wolfcrypt/rabbit.h -%{_includedir}/wolfssl/wolfcrypt/random.h -%{_includedir}/wolfssl/wolfcrypt/ripemd.h -%{_includedir}/wolfssl/wolfcrypt/rsa.h -%{_includedir}/wolfssl/wolfcrypt/settings.h -%{_includedir}/wolfssl/wolfcrypt/signature.h -%{_includedir}/wolfssl/wolfcrypt/sha.h -%{_includedir}/wolfssl/wolfcrypt/sha3.h -%{_includedir}/wolfssl/wolfcrypt/sha256.h -%{_includedir}/wolfssl/wolfcrypt/sha512.h -%{_includedir}/wolfssl/wolfcrypt/srp.h -%{_includedir}/wolfssl/wolfcrypt/tfm.h -%{_includedir}/wolfssl/wolfcrypt/types.h -%{_includedir}/wolfssl/wolfcrypt/visibility.h -%{_includedir}/wolfssl/wolfcrypt/wc_encrypt.h -%{_includedir}/wolfssl/wolfcrypt/wolfevent.h -%{_includedir}/wolfssl/wolfcrypt/wolfmath.h %{_includedir}/wolfssl/error-ssl.h %{_includedir}/wolfssl/ocsp.h %{_includedir}/wolfssl/openssl/aes.h @@ -249,10 +189,12 @@ mkdir -p $RPM_BUILD_ROOT/ %{_includedir}/wolfssl/openssl/dh.h %{_includedir}/wolfssl/openssl/dsa.h %{_includedir}/wolfssl/openssl/ec.h -%{_includedir}/wolfssl/openssl/ecdsa.h %{_includedir}/wolfssl/openssl/ec25519.h -%{_includedir}/wolfssl/openssl/ed25519.h +%{_includedir}/wolfssl/openssl/ec448.h %{_includedir}/wolfssl/openssl/ecdh.h +%{_includedir}/wolfssl/openssl/ecdsa.h +%{_includedir}/wolfssl/openssl/ed25519.h +%{_includedir}/wolfssl/openssl/ed448.h %{_includedir}/wolfssl/openssl/engine.h %{_includedir}/wolfssl/openssl/err.h %{_includedir}/wolfssl/openssl/evp.h @@ -260,36 +202,107 @@ mkdir -p $RPM_BUILD_ROOT/ %{_includedir}/wolfssl/openssl/lhash.h %{_includedir}/wolfssl/openssl/md4.h %{_includedir}/wolfssl/openssl/md5.h -%{_includedir}/wolfssl/openssl/ocsp.h +%{_includedir}/wolfssl/openssl/obj_mac.h %{_includedir}/wolfssl/openssl/objects.h +%{_includedir}/wolfssl/openssl/ocsp.h %{_includedir}/wolfssl/openssl/opensslconf.h %{_includedir}/wolfssl/openssl/opensslv.h %{_includedir}/wolfssl/openssl/ossl_typ.h %{_includedir}/wolfssl/openssl/pem.h -%{_includedir}/wolfssl/openssl/pkcs7.h %{_includedir}/wolfssl/openssl/pkcs12.h +%{_includedir}/wolfssl/openssl/pkcs7.h %{_includedir}/wolfssl/openssl/rand.h %{_includedir}/wolfssl/openssl/rc4.h %{_includedir}/wolfssl/openssl/ripemd.h %{_includedir}/wolfssl/openssl/rsa.h %{_includedir}/wolfssl/openssl/sha.h +%{_includedir}/wolfssl/openssl/sha3.h %{_includedir}/wolfssl/openssl/ssl.h %{_includedir}/wolfssl/openssl/ssl23.h %{_includedir}/wolfssl/openssl/stack.h %{_includedir}/wolfssl/openssl/tls1.h %{_includedir}/wolfssl/openssl/ui.h %{_includedir}/wolfssl/openssl/x509.h -%{_includedir}/wolfssl/openssl/x509v3.h %{_includedir}/wolfssl/openssl/x509_vfy.h +%{_includedir}/wolfssl/openssl/x509v3.h %{_includedir}/wolfssl/options.h %{_includedir}/wolfssl/sniffer.h %{_includedir}/wolfssl/sniffer_error.h %{_includedir}/wolfssl/ssl.h %{_includedir}/wolfssl/test.h %{_includedir}/wolfssl/version.h +%{_includedir}/wolfssl/wolfcrypt/aes.h +%{_includedir}/wolfssl/wolfcrypt/arc4.h +%{_includedir}/wolfssl/wolfcrypt/asn.h +%{_includedir}/wolfssl/wolfcrypt/asn_public.h +%{_includedir}/wolfssl/wolfcrypt/blake2-impl.h +%{_includedir}/wolfssl/wolfcrypt/blake2-int.h +%{_includedir}/wolfssl/wolfcrypt/blake2.h +%{_includedir}/wolfssl/wolfcrypt/camellia.h +%{_includedir}/wolfssl/wolfcrypt/chacha.h +%{_includedir}/wolfssl/wolfcrypt/chacha20_poly1305.h +%{_includedir}/wolfssl/wolfcrypt/cmac.h +%{_includedir}/wolfssl/wolfcrypt/coding.h +%{_includedir}/wolfssl/wolfcrypt/compress.h +%{_includedir}/wolfssl/wolfcrypt/cpuid.h +%{_includedir}/wolfssl/wolfcrypt/cryptocb.h +%{_includedir}/wolfssl/wolfcrypt/curve25519.h +%{_includedir}/wolfssl/wolfcrypt/curve448.h +%{_includedir}/wolfssl/wolfcrypt/des3.h +%{_includedir}/wolfssl/wolfcrypt/dh.h +%{_includedir}/wolfssl/wolfcrypt/dsa.h +%{_includedir}/wolfssl/wolfcrypt/ecc.h +%{_includedir}/wolfssl/wolfcrypt/ed25519.h +%{_includedir}/wolfssl/wolfcrypt/ed448.h +%{_includedir}/wolfssl/wolfcrypt/error-crypt.h +%{_includedir}/wolfssl/wolfcrypt/fe_448.h +%{_includedir}/wolfssl/wolfcrypt/fe_operations.h +%{_includedir}/wolfssl/wolfcrypt/fips_test.h +%{_includedir}/wolfssl/wolfcrypt/ge_448.h +%{_includedir}/wolfssl/wolfcrypt/ge_operations.h +%{_includedir}/wolfssl/wolfcrypt/hash.h +%{_includedir}/wolfssl/wolfcrypt/hc128.h +%{_includedir}/wolfssl/wolfcrypt/hmac.h +%{_includedir}/wolfssl/wolfcrypt/idea.h +%{_includedir}/wolfssl/wolfcrypt/integer.h +%{_includedir}/wolfssl/wolfcrypt/logging.h +%{_includedir}/wolfssl/wolfcrypt/md2.h +%{_includedir}/wolfssl/wolfcrypt/md4.h +%{_includedir}/wolfssl/wolfcrypt/md5.h +%{_includedir}/wolfssl/wolfcrypt/mem_track.h +%{_includedir}/wolfssl/wolfcrypt/memory.h +%{_includedir}/wolfssl/wolfcrypt/misc.h +%{_includedir}/wolfssl/wolfcrypt/mpi_class.h +%{_includedir}/wolfssl/wolfcrypt/mpi_superclass.h +%{_includedir}/wolfssl/wolfcrypt/pkcs12.h +%{_includedir}/wolfssl/wolfcrypt/pkcs7.h +%{_includedir}/wolfssl/wolfcrypt/poly1305.h +%{_includedir}/wolfssl/wolfcrypt/pwdbased.h +%{_includedir}/wolfssl/wolfcrypt/rabbit.h +%{_includedir}/wolfssl/wolfcrypt/random.h +%{_includedir}/wolfssl/wolfcrypt/ripemd.h +%{_includedir}/wolfssl/wolfcrypt/rsa.h +%{_includedir}/wolfssl/wolfcrypt/settings.h +%{_includedir}/wolfssl/wolfcrypt/sha.h +%{_includedir}/wolfssl/wolfcrypt/sha256.h +%{_includedir}/wolfssl/wolfcrypt/sha3.h +%{_includedir}/wolfssl/wolfcrypt/sha512.h +%{_includedir}/wolfssl/wolfcrypt/signature.h +%{_includedir}/wolfssl/wolfcrypt/srp.h +%{_includedir}/wolfssl/wolfcrypt/tfm.h +%{_includedir}/wolfssl/wolfcrypt/types.h +%{_includedir}/wolfssl/wolfcrypt/visibility.h +%{_includedir}/wolfssl/wolfcrypt/wc_encrypt.h +%{_includedir}/wolfssl/wolfcrypt/wc_port.h +%{_includedir}/wolfssl/wolfcrypt/wolfevent.h +%{_includedir}/wolfssl/wolfcrypt/wolfmath.h +%{_includedir}/wolfssl/wolfio.h %{_libdir}/pkgconfig/wolfssl.pc %changelog +* Thu Apr 16 2020 John Safranek +- Add some missing headers. +- Sort the file list. * Thu Dec 19 2019 Jacob Barthelmeh - Add wolfssl/openssl/tls1.h, wolfssl/openssl/x509_vfy.h * Fri Mar 15 2019 John Safranek From c1346269461186b68da823f87fb8da3c7a8ff2b8 Mon Sep 17 00:00:00 2001 From: John Safranek Date: Fri, 17 Apr 2020 11:21:33 -0700 Subject: [PATCH 034/298] Update credit names on vuln notice in README. --- ChangeLog.md | 5 +++-- README | 5 +++-- README.md | 5 +++-- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 7c60aebea..fabecd361 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -106,8 +106,9 @@ Release 4.4.0 of wolfSSL embedded TLS has bug fixes and new features including: * For fast math, use a constant time modular inverse when mapping to affine when operation involves a private key - keygen, calc shared secret, sign. - Thank you to the Alejandro Cabrera Aldaya, Cesar Pereida García, and - Billy Bob Brumley from Tampere University for the report. + Thank you to Alejandro Cabrera Aldaya, Cesar Pereida García and + Billy Bob Brumley from the Network and Information Security Group (NISEC) + at Tampere University for the report. * Change constant time and cache resistant ECC mulmod. Ensure points being operated on change to make constant time. Thank you to Pietro Borrello at diff --git a/README b/README index ef8bb05fe..02eba1116 100644 --- a/README +++ b/README @@ -181,8 +181,9 @@ Release 4.4.0 of wolfSSL embedded TLS has bug fixes and new features including: * For fast math, use a constant time modular inverse when mapping to affine when operation involves a private key - keygen, calc shared secret, sign. - Thank you to the Alejandro Cabrera Aldaya, Cesar Pereida García, and - Billy Bob Brumley from Tampere University for the report. + Thank you to Alejandro Cabrera Aldaya, Cesar Pereida García and + Billy Bob Brumley from the Network and Information Security Group (NISEC) + at Tampere University for the report. * Change constant time and cache resistant ECC mulmod. Ensure points being operated on change to make constant time. Thank you to Pietro Borrello at diff --git a/README.md b/README.md index ef8bb05fe..02eba1116 100644 --- a/README.md +++ b/README.md @@ -181,8 +181,9 @@ Release 4.4.0 of wolfSSL embedded TLS has bug fixes and new features including: * For fast math, use a constant time modular inverse when mapping to affine when operation involves a private key - keygen, calc shared secret, sign. - Thank you to the Alejandro Cabrera Aldaya, Cesar Pereida García, and - Billy Bob Brumley from Tampere University for the report. + Thank you to Alejandro Cabrera Aldaya, Cesar Pereida García and + Billy Bob Brumley from the Network and Information Security Group (NISEC) + at Tampere University for the report. * Change constant time and cache resistant ECC mulmod. Ensure points being operated on change to make constant time. Thank you to Pietro Borrello at From 61f37831110cb50ca3dfbdabb217fc30ef6e7e00 Mon Sep 17 00:00:00 2001 From: John Safranek Date: Fri, 17 Apr 2020 11:27:11 -0700 Subject: [PATCH 035/298] Fixes to test.c for the following build configurations: 1. ./configure --disable-rsa --enable-certgen --enable-certreq 2. ./configure --disable-ecc --enable-pkcs7 --- wolfcrypt/test/test.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/wolfcrypt/test/test.c b/wolfcrypt/test/test.c index b30576db8..399a29b75 100644 --- a/wolfcrypt/test/test.c +++ b/wolfcrypt/test/test.c @@ -10311,7 +10311,7 @@ byte GetEntropy(ENTROPY_CMD cmd, byte* out) #endif #endif #if !defined(USE_CERT_BUFFERS_256) && !defined(NO_ASN) - #ifdef WOLFSSL_CERT_GEN + #if defined(HAVE_ECC) && defined(WOLFSSL_CERT_GEN) #ifndef NO_RSA /* eccKeyPubFile is used in a test that requires RSA. */ static const char* eccKeyPubFile = CERT_ROOT "ecc-keyPub.der"; @@ -10395,8 +10395,8 @@ byte GetEntropy(ENTROPY_CMD cmd, byte* out) #endif /* !NO_FILESYSTEM */ -#if defined(WOLFSSL_CERT_GEN) && (!defined(NO_RSA) && defined(HAVE_ECC) || \ - defined(WOLFSSL_TEST_CERT) && (defined(HAVE_ED25519) || defined(HAVE_ED448))) +#if defined(WOLFSSL_CERT_GEN) && (!defined(NO_RSA) || defined(HAVE_ECC)) || \ + (defined(WOLFSSL_TEST_CERT) && (defined(HAVE_ED25519) || defined(HAVE_ED448))) #ifdef WOLFSSL_MULTI_ATTRIB static CertName certDefaultName; static void initDefaultName(void) @@ -24803,17 +24803,19 @@ static int pkcs7authenveloped_run_vectors(byte* rsaCert, word32 rsaCertSz, 0x48,0x65,0x6c,0x6c,0x6f,0x20,0x57,0x6f, 0x72,0x6c,0x64 }; + byte senderNonce[PKCS7_NONCE_SZ + 2]; - static byte senderNonceOid[] = +#ifdef HAVE_ECC + byte senderNonceOid[] = { 0x06, 0x0a, 0x60, 0x86, 0x48, 0x01, 0x86, 0xF8, 0x45, 0x01, 0x09, 0x05 }; - static byte senderNonce[PKCS7_NONCE_SZ + 2]; PKCS7Attrib attribs[] = { { senderNonceOid, sizeof(senderNonceOid), senderNonce, sizeof(senderNonce) } }; +#endif #if !defined(NO_AES) && defined(WOLFSSL_AES_256) && defined(HAVE_ECC) && \ defined(WOLFSSL_SHA512) From ccd096e1bbe9ad967c5e3843ce6a99d70dac1e77 Mon Sep 17 00:00:00 2001 From: John Safranek Date: Fri, 17 Apr 2020 16:31:38 -0700 Subject: [PATCH 036/298] Memory Leak Fix 1. In `wolfSSL_d2i_DHparams()`, when setting the internal key on a WOLFSSL_KEY, set the flag inSet. 2. Not a leak, but in `wolfSSL_EVP_PKEY_set1_DH()`, only allocate one buffer to store the flat key. Saves an alloc, memcpy, and free. --- src/ssl.c | 1 + wolfcrypt/src/evp.c | 18 +++--------------- 2 files changed, 4 insertions(+), 15 deletions(-) diff --git a/src/ssl.c b/src/ssl.c index f2451329c..58569f3e9 100755 --- a/src/ssl.c +++ b/src/ssl.c @@ -18539,6 +18539,7 @@ WOLFSSL_DH *wolfSSL_d2i_DHparams(WOLFSSL_DH **dh, const unsigned char **pp, wolfSSL_DH_free(newDH); return NULL; } + newDH->inSet = 1; if (SetDhExternal(newDH) != WOLFSSL_SUCCESS) { WOLFSSL_MSG("SetDhExternal failed"); diff --git a/wolfcrypt/src/evp.c b/wolfcrypt/src/evp.c index af4129fc4..d9207900c 100644 --- a/wolfcrypt/src/evp.c +++ b/wolfcrypt/src/evp.c @@ -5826,8 +5826,6 @@ int wolfSSL_EVP_PKEY_set1_DH(WOLFSSL_EVP_PKEY *pkey, WOLFSSL_DH *key) word32 derSz = 0; byte* derBuf = NULL; DhKey* dhkey = NULL; - mp_int pubKey; - mp_int privKey; WOLFSSL_ENTER("wolfSSL_EVP_PKEY_set1_DH"); @@ -5849,11 +5847,8 @@ int wolfSSL_EVP_PKEY_set1_DH(WOLFSSL_EVP_PKEY *pkey, WOLFSSL_DH *key) dhkey = (DhKey*)key->internal; - pubKey = dhkey->pub; - privKey = dhkey->priv; - - havePublic = mp_unsigned_bin_size(&pubKey) > 0; - havePrivate = mp_unsigned_bin_size(&privKey) > 0; + havePublic = mp_unsigned_bin_size(&dhkey->pub) > 0; + havePrivate = mp_unsigned_bin_size(&dhkey->priv) > 0; /* Get size of DER buffer only */ if (havePublic && !havePrivate) { @@ -5891,15 +5886,8 @@ int wolfSSL_EVP_PKEY_set1_DH(WOLFSSL_EVP_PKEY *pkey, WOLFSSL_DH *key) } /* Store DH key into pkey (DER format) */ - pkey->pkey.ptr = (char*)XMALLOC(derSz, pkey->heap, DYNAMIC_TYPE_DER); - if (pkey->pkey.ptr == NULL) { - WOLFSSL_MSG("key malloc failed"); - XFREE(derBuf, pkey->heap, DYNAMIC_TYPE_TMP_BUFFER); - return WOLFSSL_FAILURE; - } + pkey->pkey.ptr = (char*)derBuf; pkey->pkey_sz = derSz; - XMEMCPY(pkey->pkey.ptr, derBuf, derSz); - XFREE(derBuf, pkey->heap, DYNAMIC_TYPE_TMP_BUFFER); return WOLFSSL_SUCCESS; } From 7b6cc2056bb3c41aec7322bd1e8cd1c4c8f89199 Mon Sep 17 00:00:00 2001 From: John Safranek Date: Sun, 19 Apr 2020 19:03:23 -0700 Subject: [PATCH 037/298] Update release date in readme and changelog. --- ChangeLog.md | 2 +- README | 2 +- README.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index fabecd361..a22878231 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -1,4 +1,4 @@ -# wolfSSL Release 4.4.0 (04/17/2020) +# wolfSSL Release 4.4.0 (04/20/2020) If you have questions about this release, then feel free to contact us on our info@ address. diff --git a/README b/README index 02eba1116..bbc38ac19 100644 --- a/README +++ b/README @@ -73,7 +73,7 @@ should be used for the enum name. *** end Notes *** -# wolfSSL Release 4.4.0 (04/17/2020) +# wolfSSL Release 4.4.0 (04/20/2020) If you have questions about this release, feel free to contact us on our info@ address. diff --git a/README.md b/README.md index 02eba1116..bbc38ac19 100644 --- a/README.md +++ b/README.md @@ -73,7 +73,7 @@ should be used for the enum name. *** end Notes *** -# wolfSSL Release 4.4.0 (04/17/2020) +# wolfSSL Release 4.4.0 (04/20/2020) If you have questions about this release, feel free to contact us on our info@ address. From bf680b4a9275a394ebabc489ab7fbdbbd6ed61f0 Mon Sep 17 00:00:00 2001 From: John Safranek Date: Tue, 21 Apr 2020 10:38:27 -0700 Subject: [PATCH 038/298] Fix for QAT with Shake256. Fix for XFREE missing semicolon. --- tests/api.c | 2 +- wolfcrypt/src/sha3.c | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/tests/api.c b/tests/api.c index 8b1585478..4975981e6 100644 --- a/tests/api.c +++ b/tests/api.c @@ -31080,7 +31080,7 @@ static void test_wolfSSL_IMPLEMENT_ASN1_FUNCTIONS() der = NULL; AssertIntGT(i2d_DPP_BOOTSTRAPPING_KEY(bootstrap, &der), 0); - XFREE(der, NULL, DYNAMIC_TYPE_ASN1) + XFREE(der, NULL, DYNAMIC_TYPE_ASN1); EVP_PKEY_free(key); EC_KEY_free(eckey); DPP_BOOTSTRAPPING_KEY_free(bootstrap); diff --git a/wolfcrypt/src/sha3.c b/wolfcrypt/src/sha3.c index 66e7c3150..3a0c8ddbb 100644 --- a/wolfcrypt/src/sha3.c +++ b/wolfcrypt/src/sha3.c @@ -1161,7 +1161,11 @@ int wc_InitShake256(wc_Shake* shake, void* heap, int devId) */ int wc_Shake256_Update(wc_Shake* shake, const byte* data, word32 len) { - return wc_Sha3Update(shake, data, len, WC_SHA3_256_COUNT); + if (shake == NULL || (data == NULL && len > 0)) { + return BAD_FUNC_ARG; + } + + return Sha3Update(shake, data, len, WC_SHA3_256_COUNT); } /* Calculate the SHAKE256 hash based on all the message data seen. From 83152c767fb7177ab2645f8f1c5c3bb2ab759772 Mon Sep 17 00:00:00 2001 From: John Safranek Date: Tue, 21 Apr 2020 10:50:59 -0700 Subject: [PATCH 039/298] touch dates --- ChangeLog.md | 2 +- README | 2 +- README.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index a22878231..94de8f63b 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -1,4 +1,4 @@ -# wolfSSL Release 4.4.0 (04/20/2020) +# wolfSSL Release 4.4.0 (04/22/2020) If you have questions about this release, then feel free to contact us on our info@ address. diff --git a/README b/README index bbc38ac19..db1b54488 100644 --- a/README +++ b/README @@ -73,7 +73,7 @@ should be used for the enum name. *** end Notes *** -# wolfSSL Release 4.4.0 (04/20/2020) +# wolfSSL Release 4.4.0 (04/22/2020) If you have questions about this release, feel free to contact us on our info@ address. diff --git a/README.md b/README.md index bbc38ac19..db1b54488 100644 --- a/README.md +++ b/README.md @@ -73,7 +73,7 @@ should be used for the enum name. *** end Notes *** -# wolfSSL Release 4.4.0 (04/20/2020) +# wolfSSL Release 4.4.0 (04/22/2020) If you have questions about this release, feel free to contact us on our info@ address. From 12e4718c67aeff0c84fb160edb20d1b758ded9ec Mon Sep 17 00:00:00 2001 From: kaleb-himes Date: Wed, 22 Apr 2020 11:06:36 -0600 Subject: [PATCH 040/298] Fix for Freescale common examples that predated hardening warning --- wolfssl/wolfcrypt/settings.h | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/wolfssl/wolfcrypt/settings.h b/wolfssl/wolfcrypt/settings.h index e0620a9f9..c439bc33a 100644 --- a/wolfssl/wolfcrypt/settings.h +++ b/wolfssl/wolfcrypt/settings.h @@ -933,6 +933,15 @@ extern void uITRON4_free(void *p) ; #define XFREE(p, h, t) {void* xp = (p); if ((xp)) _mem_free((xp));} /* Note: MQX has no realloc, using fastmath above */ #endif + #ifdef USE_FAST_MATH + /* Undef first to avoid re-definition if user_settings.h defines */ + #undef TFM_TIMING_RESISTANT + #define TFM_TIMING_RESISTANT + #undef ECC_TIMING_RESISTANT + #define ECC_TIMING_RESISTANT + #undef WC_RSA_BLINDING + #define WC_RSA_BLINDING + #endif #endif #ifdef FREESCALE_KSDK_MQX From 36a556f927520b9e285d5bfc92f8680fd1eb7517 Mon Sep 17 00:00:00 2001 From: David Garske Date: Wed, 22 Apr 2020 10:15:16 -0700 Subject: [PATCH 041/298] Resolve issues with the openssl compatibility `CRYPTO_malloc` and `CRYPTO_free`. --- wolfcrypt/test/test.c | 8 ++------ wolfssl/openssl/ssl.h | 13 ++----------- 2 files changed, 4 insertions(+), 17 deletions(-) diff --git a/wolfcrypt/test/test.c b/wolfcrypt/test/test.c index b30576db8..fa7c0f2fd 100644 --- a/wolfcrypt/test/test.c +++ b/wolfcrypt/test/test.c @@ -15614,16 +15614,12 @@ int openssl_test(void) /* test malloc / free , 10 is an arbitrary amount of memory chosen */ { byte* p; - p = (byte*)CRYPTO_malloc(10, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + p = (byte*)CRYPTO_malloc(10); if (p == NULL) { return -8400; } XMEMSET(p, 0, 10); - #ifdef WOLFSSL_QT - CRYPTO_free(p); - #else - CRYPTO_free(p, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); - #endif + CRYPTO_free(p); } #ifndef NO_MD5 diff --git a/wolfssl/openssl/ssl.h b/wolfssl/openssl/ssl.h index e238cfcab..6a435f649 100644 --- a/wolfssl/openssl/ssl.h +++ b/wolfssl/openssl/ssl.h @@ -125,17 +125,8 @@ typedef WOLFSSL_X509_VERIFY_PARAM X509_VERIFY_PARAM; #define CONF_get1_default_config_file wolfSSL_CONF_get1_default_config_file typedef STACK_OF(ACCESS_DESCRIPTION) AUTHORITY_INFO_ACCESS; -#ifdef WOLFSSL_QT - #if defined(NO_WOLFSSL_MEMORY) - #define CRYPTO_free(xp) XFREE(xp, NULL, NULL); - #else - #define CRYPTO_free(xp) { if((xp)) wolfSSL_Free((xp));} - #endif -#else - #define CRYPTO_free XFREE -#endif - -#define CRYPTO_malloc XMALLOC +#define CRYPTO_free(xp) XFREE(xp, NULL, DYNAMIC_TYPE_TMP_BUFFER) +#define CRYPTO_malloc(sz) XMALLOC(sz, NULL, DYNAMIC_TYPE_TMP_BUFFER) #define CRYPTO_EX_new WOLFSSL_CRYPTO_EX_new #define CRYPTO_EX_dup WOLFSSL_CRYPTO_EX_dup #define CRYPTO_EX_free WOLFSSL_CRYPTO_EX_free From 88d04e5eeb595ec88108fd326c4ed1372ae62af5 Mon Sep 17 00:00:00 2001 From: David Garske Date: Wed, 22 Apr 2020 10:15:52 -0700 Subject: [PATCH 042/298] Fix for NULL == NULL test case in `test_wolfSSL_EC_get_builtin_curves`. --- tests/api.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/api.c b/tests/api.c index 8b1585478..dba80ea06 100644 --- a/tests/api.c +++ b/tests/api.c @@ -28688,7 +28688,8 @@ static void test_wolfSSL_EC_get_builtin_curves(void) for (i = 0; i < crv_len; i++) { - AssertStrEQ(OBJ_nid2sn(curves[i].nid), curves[i].comment); + if (curves[i].comment != NULL) + AssertStrEQ(OBJ_nid2sn(curves[i].nid), curves[i].comment); } XFREE(curves, NULL, DYNAMIC_TYPE_TMP_BUFFER); From 4592e0ec95db63bca32655acc52f81f0efcd0520 Mon Sep 17 00:00:00 2001 From: David Garske Date: Wed, 22 Apr 2020 10:16:20 -0700 Subject: [PATCH 043/298] Fix for use of incorrect devId for `wolfSSL_SHA3_256_Init`. --- src/ssl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ssl.c b/src/ssl.c index f2451329c..8a3b5298a 100755 --- a/src/ssl.c +++ b/src/ssl.c @@ -15774,7 +15774,7 @@ size_t wolfSSL_get_client_random(const WOLFSSL* ssl, unsigned char* out, (void)sizeof(sha_test); WOLFSSL_ENTER("SHA3_256_Init"); - ret = wc_InitSha3_256((wc_Sha3*)sha3_256, NULL, 0); + ret = wc_InitSha3_256((wc_Sha3*)sha3_256, NULL, INVALID_DEVID); /* return 1 on success, 0 otherwise */ if (ret == 0) From a064cb3943e305f37b0524cca19a397170d19272 Mon Sep 17 00:00:00 2001 From: John Safranek Date: Tue, 21 Apr 2020 19:20:20 -0700 Subject: [PATCH 044/298] Fix a couple of wolfCrypt test issues found during the long release build test. --- wolfcrypt/test/test.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/wolfcrypt/test/test.c b/wolfcrypt/test/test.c index 399a29b75..d4c8e8fb1 100644 --- a/wolfcrypt/test/test.c +++ b/wolfcrypt/test/test.c @@ -5747,7 +5747,8 @@ int des3_test(void) #ifndef NO_AES -#if defined(WOLFSSL_AES_OFB) || defined(WOLFSSL_AES_CFB) +#if defined(WOLFSSL_AES_OFB) || defined(WOLFSSL_AES_CFB) || \ + defined(WOLFSSL_AES_XTS) #if defined(OPENSSL_EXTRA) && !defined(HAVE_SELFTEST) && !defined(HAVE_FIPS) /* pass in the function, key, iv, plain text and expected and this function * tests that the encryption and decryption is successful */ @@ -22833,6 +22834,7 @@ int ed448_test(void) }; static const byte* sigs[] = {sig1, sig2, sig3, sig4, sig5, sig6}; + #define SIGSZ sizeof(sig1) static const byte msg1[] = { }; static const byte msg2[] = { 0x03 }; @@ -23111,7 +23113,7 @@ int ed448_test(void) NULL, 0) != 0 || verify != 1) return -11401 - i; - if (XMEMCMP(out, sigs[i], sizeof(sigs[i]))) + if (XMEMCMP(out, sigs[i], SIGSZ)) return -11411 - i; #endif /* HAVE_ED448_VERIFY */ } @@ -23143,7 +23145,7 @@ int ed448_test(void) if (wc_ed448_sign_msg(msgs[0], msgSz[0], out, &outlen, &key3, NULL, 0) != 0) return -11451 - i; - if (XMEMCMP(out, sigs[0], sizeof(sigs[0]))) + if (XMEMCMP(out, sigs[0], SIGSZ)) return -11461 - i; #if defined(HAVE_ED448_VERIFY) @@ -23164,7 +23166,7 @@ int ed448_test(void) if (wc_ed448_sign_msg(msgs[0], msgSz[0], out, &outlen, &key3, NULL, 0) != 0) return -11491 - i; - if (XMEMCMP(out, sigs[0], sizeof(sigs[0]))) + if (XMEMCMP(out, sigs[0], SIGSZ)) return -11501 - i; wc_ed448_free(&key3); From 7a0cbe084e334aea8f27628b7e8637f45a6accf8 Mon Sep 17 00:00:00 2001 From: Sean Parkinson Date: Mon, 20 Apr 2020 10:38:31 +1000 Subject: [PATCH 045/298] Improve performance of SP Cortex M asm --- wolfcrypt/src/sp_cortexm.c | 3925 ++++++++++++++++++++++++------------ 1 file changed, 2599 insertions(+), 1326 deletions(-) diff --git a/wolfcrypt/src/sp_cortexm.c b/wolfcrypt/src/sp_cortexm.c index b03de8ab4..e5214c3e3 100644 --- a/wolfcrypt/src/sp_cortexm.c +++ b/wolfcrypt/src/sp_cortexm.c @@ -13803,65 +13803,229 @@ static void sp_256_point_free_8(sp_point_256* p, int clear, void* heap) */ static int sp_256_mod_mul_norm_8(sp_digit* r, const sp_digit* a, const sp_digit* m) { - int64_t t[8]; - int64_t a64[8]; - int64_t o; + (void)m; - (void)m; - - a64[0] = a[0]; - a64[1] = a[1]; - a64[2] = a[2]; - a64[3] = a[3]; - a64[4] = a[4]; - a64[5] = a[5]; - a64[6] = a[6]; - a64[7] = a[7]; - - /* 1 1 0 -1 -1 -1 -1 0 */ - t[0] = 0 + a64[0] + a64[1] - a64[3] - a64[4] - a64[5] - a64[6]; - /* 0 1 1 0 -1 -1 -1 -1 */ - t[1] = 0 + a64[1] + a64[2] - a64[4] - a64[5] - a64[6] - a64[7]; - /* 0 0 1 1 0 -1 -1 -1 */ - t[2] = 0 + a64[2] + a64[3] - a64[5] - a64[6] - a64[7]; - /* -1 -1 0 2 2 1 0 -1 */ - t[3] = 0 - a64[0] - a64[1] + 2 * a64[3] + 2 * a64[4] + a64[5] - a64[7]; - /* 0 -1 -1 0 2 2 1 0 */ - t[4] = 0 - a64[1] - a64[2] + 2 * a64[4] + 2 * a64[5] + a64[6]; - /* 0 0 -1 -1 0 2 2 1 */ - t[5] = 0 - a64[2] - a64[3] + 2 * a64[5] + 2 * a64[6] + a64[7]; - /* -1 -1 0 0 0 1 3 2 */ - t[6] = 0 - a64[0] - a64[1] + a64[5] + 3 * a64[6] + 2 * a64[7]; - /* 1 0 -1 -1 -1 -1 0 3 */ - t[7] = 0 + a64[0] - a64[2] - a64[3] - a64[4] - a64[5] + 3 * a64[7]; - - t[1] += t[0] >> 32; t[0] &= 0xffffffff; - t[2] += t[1] >> 32; t[1] &= 0xffffffff; - t[3] += t[2] >> 32; t[2] &= 0xffffffff; - t[4] += t[3] >> 32; t[3] &= 0xffffffff; - t[5] += t[4] >> 32; t[4] &= 0xffffffff; - t[6] += t[5] >> 32; t[5] &= 0xffffffff; - t[7] += t[6] >> 32; t[6] &= 0xffffffff; - o = t[7] >> 32; t[7] &= 0xffffffff; - t[0] += o; - t[3] -= o; - t[6] -= o; - t[7] += o; - t[1] += t[0] >> 32; t[0] &= 0xffffffff; - t[2] += t[1] >> 32; t[1] &= 0xffffffff; - t[3] += t[2] >> 32; t[2] &= 0xffffffff; - t[4] += t[3] >> 32; t[3] &= 0xffffffff; - t[5] += t[4] >> 32; t[4] &= 0xffffffff; - t[6] += t[5] >> 32; t[5] &= 0xffffffff; - t[7] += t[6] >> 32; t[6] &= 0xffffffff; - r[0] = t[0]; - r[1] = t[1]; - r[2] = t[2]; - r[3] = t[3]; - r[4] = t[4]; - r[5] = t[5]; - r[6] = t[6]; - r[7] = t[7]; + __asm__ __volatile__ ( + "sub sp, sp, #24\n\t" + "ldr r2, [%[a], #0]\n\t" + "ldr r3, [%[a], #4]\n\t" + "ldr r4, [%[a], #8]\n\t" + "ldr r5, [%[a], #12]\n\t" + "ldr r6, [%[a], #16]\n\t" + "ldr r8, [%[a], #20]\n\t" + "ldr r9, [%[a], #24]\n\t" + "ldr r10, [%[a], #28]\n\t" + "# Clear overflow and underflow\n\t" + "mov r14, #0\n\t" + "mov r12, #0\n\t" + "# t[0] = 1 1 0 -1 -1 -1 -1 0\n\t" + "adds r11, r2, r3\n\t" + "adc r14, r14, #0\n\t" + "subs r11, r11, r5\n\t" + "sbc r12, r12, #0\n\t" + "subs r11, r11, r6\n\t" + "sbc r12, r12, #0\n\t" + "subs r11, r11, r8\n\t" + "sbc r12, r12, #0\n\t" + "subs r11, r11, r9\n\t" + "sbc r12, r12, #0\n\t" + "# Store t[0]\n\t" + "str r11, [sp, #0]\n\t" + "neg r12, r12\n\t" + "mov r11, #0\n\t" + "# t[1] = 0 1 1 0 -1 -1 -1 -1\n\t" + "adds r14, r14, r3\n\t" + "adc r11, r11, #0\n\t" + "adds r14, r14, r4\n\t" + "adc r11, r11, #0\n\t" + "subs r14, r14, r12\n\t" + "mov r12, #0\n\t" + "sbc r12, r12, #0\n\t" + "subs r14, r14, r6\n\t" + "sbc r12, r12, #0\n\t" + "subs r14, r14, r8\n\t" + "sbc r12, r12, #0\n\t" + "subs r14, r14, r9\n\t" + "sbc r12, r12, #0\n\t" + "subs r14, r14, r10\n\t" + "sbc r12, r12, #0\n\t" + "# Store t[1]\n\t" + "str r14, [sp, #4]\n\t" + "neg r12, r12\n\t" + "mov r14, #0\n\t" + "# t[2] = 0 0 1 1 0 -1 -1 -1\n\t" + "adds r11, r11, r4\n\t" + "adc r14, r14, #0\n\t" + "adds r11, r11, r5\n\t" + "adc r14, r14, #0\n\t" + "subs r11, r11, r12\n\t" + "mov r12, #0\n\t" + "sbc r12, r12, #0\n\t" + "subs r11, r11, r8\n\t" + "sbc r12, r12, #0\n\t" + "subs r11, r11, r9\n\t" + "sbc r12, r12, #0\n\t" + "subs r11, r11, r10\n\t" + "sbc r12, r12, #0\n\t" + "# Store t[2]\n\t" + "str r11, [sp, #8]\n\t" + "neg r12, r12\n\t" + "mov r11, #0\n\t" + "# t[3] = -1 -1 0 2 2 1 0 -1\n\t" + "adds r14, r14, r5\n\t" + "adc r11, r11, #0\n\t" + "adds r14, r14, r5\n\t" + "adc r11, r11, #0\n\t" + "adds r14, r14, r6\n\t" + "adc r11, r11, #0\n\t" + "adds r14, r14, r6\n\t" + "adc r11, r11, #0\n\t" + "adds r14, r14, r8\n\t" + "adc r11, r11, #0\n\t" + "subs r14, r14, r12\n\t" + "mov r12, #0\n\t" + "sbc r12, r12, #0\n\t" + "subs r14, r14, r2\n\t" + "sbc r12, r12, #0\n\t" + "subs r14, r14, r3\n\t" + "sbc r12, r12, #0\n\t" + "subs r14, r14, r10\n\t" + "sbc r12, r12, #0\n\t" + "# Store t[3]\n\t" + "str r14, [sp, #12]\n\t" + "neg r12, r12\n\t" + "mov r14, #0\n\t" + "# t[4] = 0 -1 -1 0 2 2 1 0\n\t" + "adds r11, r11, r6\n\t" + "adc r14, r14, #0\n\t" + "adds r11, r11, r6\n\t" + "adc r14, r14, #0\n\t" + "adds r11, r11, r8\n\t" + "adc r14, r14, #0\n\t" + "adds r11, r11, r8\n\t" + "adc r14, r14, #0\n\t" + "adds r11, r11, r9\n\t" + "adc r14, r14, #0\n\t" + "subs r11, r11, r12\n\t" + "mov r12, #0\n\t" + "sbc r12, r12, #0\n\t" + "subs r11, r11, r3\n\t" + "sbc r12, r12, #0\n\t" + "subs r11, r11, r4\n\t" + "sbc r12, r12, #0\n\t" + "# Store t[4]\n\t" + "str r11, [sp, #16]\n\t" + "neg r12, r12\n\t" + "mov r11, #0\n\t" + "# t[5] = 0 0 -1 -1 0 2 2 1\n\t" + "adds r14, r14, r8\n\t" + "adc r11, r11, #0\n\t" + "adds r14, r14, r8\n\t" + "adc r11, r11, #0\n\t" + "adds r14, r14, r9\n\t" + "adc r11, r11, #0\n\t" + "adds r14, r14, r9\n\t" + "adc r11, r11, #0\n\t" + "adds r14, r14, r10\n\t" + "adc r11, r11, #0\n\t" + "subs r14, r14, r12\n\t" + "mov r12, #0\n\t" + "sbc r12, r12, #0\n\t" + "subs r14, r14, r4\n\t" + "sbc r12, r12, #0\n\t" + "subs r14, r14, r5\n\t" + "sbc r12, r12, #0\n\t" + "# Store t[5]\n\t" + "str r14, [sp, #20]\n\t" + "neg r12, r12\n\t" + "mov r14, #0\n\t" + "# t[6] = -1 -1 0 0 0 1 3 2\n\t" + "adds r11, r11, r8\n\t" + "adc r14, r14, #0\n\t" + "adds r11, r11, r9\n\t" + "adc r14, r14, #0\n\t" + "adds r11, r11, r9\n\t" + "adc r14, r14, #0\n\t" + "adds r11, r11, r9\n\t" + "adc r14, r14, #0\n\t" + "adds r11, r11, r10\n\t" + "adc r14, r14, #0\n\t" + "adds r11, r11, r10\n\t" + "adc r14, r14, #0\n\t" + "subs r11, r11, r12\n\t" + "mov r12, #0\n\t" + "sbc r12, r12, #0\n\t" + "subs r11, r11, r2\n\t" + "sbc r12, r12, #0\n\t" + "subs r11, r11, r3\n\t" + "sbc r12, r12, #0\n\t" + "# Store t[6]\n\t" + "mov r9, r11\n\t" + "neg r12, r12\n\t" + "mov r11, #0\n\t" + "# t[7] = 1 0 -1 -1 -1 -1 0 3\n\t" + "adds r14, r14, r2\n\t" + "adc r11, r11, #0\n\t" + "adds r14, r14, r10\n\t" + "adc r11, r11, #0\n\t" + "adds r14, r14, r10\n\t" + "adc r11, r11, #0\n\t" + "adds r14, r14, r10\n\t" + "adc r11, r11, #0\n\t" + "subs r14, r14, r12\n\t" + "mov r12, #0\n\t" + "sbc r12, r12, #0\n\t" + "subs r14, r14, r4\n\t" + "sbc r12, r12, #0\n\t" + "subs r14, r14, r5\n\t" + "sbc r12, r12, #0\n\t" + "subs r14, r14, r6\n\t" + "sbc r12, r12, #0\n\t" + "subs r14, r14, r8\n\t" + "sbc r12, r12, #0\n\t" + "# Store t[7]\n\t" + "# Load intermediate\n\t" + "ldr r2, [sp, #0]\n\t" + "ldr r3, [sp, #4]\n\t" + "ldr r4, [sp, #8]\n\t" + "ldr r5, [sp, #12]\n\t" + "ldr r6, [sp, #16]\n\t" + "ldr r8, [sp, #20]\n\t" + "neg r12, r12\n\t" + "# Add overflow\n\t" + "# Subtract underflow - add neg underflow\n\t" + "adds r2, r2, r11\n\t" + "adcs r3, r3, #0\n\t" + "adcs r4, r4, #0\n\t" + "adds r5, r5, r12\n\t" + "adcs r6, r6, #0\n\t" + "adcs r8, r8, #0\n\t" + "adcs r9, r9, r12\n\t" + "adc r14, r14, r11\n\t" + "# Subtract overflow\n\t" + "# Add underflow - subtract neg underflow\n\t" + "subs r2, r2, r12\n\t" + "sbcs r3, r3, #0\n\t" + "sbcs r4, r4, #0\n\t" + "subs r5, r5, r11\n\t" + "sbcs r6, r6, #0\n\t" + "sbcs r8, r8, #0\n\t" + "sbcs r9, r9, r11\n\t" + "sbc r14, r14, r12\n\t" + "# Store result\n\t" + "str r2, [%[r], #0]\n\t" + "str r3, [%[r], #4]\n\t" + "str r4, [%[r], #8]\n\t" + "str r5, [%[r], #12]\n\t" + "str r6, [%[r], #16]\n\t" + "str r8, [%[r], #20]\n\t" + "str r9, [%[r], #24]\n\t" + "str r14, [%[r], #28]\n\t" + "add sp, sp, #24\n\t" + : + : [r] "r" (r), [a] "r" (a) + : "r2", "r3", "r4", "r5", "r6", "r8", "r9", "r10", "r11", "r14", "r12" + ); return MP_OKAY; } @@ -14050,765 +14214,6 @@ static int sp_256_point_to_ecc_point_8(const sp_point_256* p, ecc_point* pm) return err; } -/* Multiply a and b into r. (r = a * b) - * - * r A single precision integer. - * a A single precision integer. - * b A single precision integer. - */ -SP_NOINLINE static void sp_256_mul_8(sp_digit* r, const sp_digit* a, - const sp_digit* b) -{ - sp_digit tmp[8]; - - __asm__ __volatile__ ( - /* A[0] * B[0] */ - "ldr r6, [%[a], #0]\n\t" - "ldr r8, [%[b], #0]\n\t" - "umull r3, r4, r6, r8\n\t" - "mov r5, #0\n\t" - "str r3, [%[tmp], #0]\n\t" - "mov r3, #0\n\t" - /* A[0] * B[1] */ - "ldr r8, [%[b], #4]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r4, r4, r6\n\t" - "adc r5, r5, r8\n\t" - /* A[1] * B[0] */ - "ldr r6, [%[a], #4]\n\t" - "ldr r8, [%[b], #0]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "adc r3, r3, #0\n\t" - "str r4, [%[tmp], #4]\n\t" - "mov r4, #0\n\t" - /* A[0] * B[2] */ - "ldr r6, [%[a], #0]\n\t" - "ldr r8, [%[b], #8]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r8\n\t" - "adc r4, r4, #0\n\t" - /* A[1] * B[1] */ - "ldr r6, [%[a], #4]\n\t" - "ldr r8, [%[b], #4]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r8\n\t" - "adc r4, r4, #0\n\t" - /* A[2] * B[0] */ - "ldr r6, [%[a], #8]\n\t" - "ldr r8, [%[b], #0]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r8\n\t" - "adc r4, r4, #0\n\t" - "str r5, [%[tmp], #8]\n\t" - "mov r5, #0\n\t" - /* A[0] * B[3] */ - "ldr r6, [%[a], #0]\n\t" - "ldr r8, [%[b], #12]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, #0\n\t" - /* A[1] * B[2] */ - "ldr r6, [%[a], #4]\n\t" - "ldr r8, [%[b], #8]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, #0\n\t" - /* A[2] * B[1] */ - "ldr r6, [%[a], #8]\n\t" - "ldr r8, [%[b], #4]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, #0\n\t" - /* A[3] * B[0] */ - "ldr r6, [%[a], #12]\n\t" - "ldr r8, [%[b], #0]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, #0\n\t" - "str r3, [%[tmp], #12]\n\t" - "mov r3, #0\n\t" - /* A[0] * B[4] */ - "ldr r6, [%[a], #0]\n\t" - "ldr r8, [%[b], #16]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "adc r3, r3, #0\n\t" - /* A[1] * B[3] */ - "ldr r6, [%[a], #4]\n\t" - "ldr r8, [%[b], #12]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "adc r3, r3, #0\n\t" - /* A[2] * B[2] */ - "ldr r6, [%[a], #8]\n\t" - "ldr r8, [%[b], #8]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "adc r3, r3, #0\n\t" - /* A[3] * B[1] */ - "ldr r6, [%[a], #12]\n\t" - "ldr r8, [%[b], #4]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "adc r3, r3, #0\n\t" - /* A[4] * B[0] */ - "ldr r6, [%[a], #16]\n\t" - "ldr r8, [%[b], #0]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "adc r3, r3, #0\n\t" - "str r4, [%[tmp], #16]\n\t" - "mov r4, #0\n\t" - /* A[0] * B[5] */ - "ldr r6, [%[a], #0]\n\t" - "ldr r8, [%[b], #20]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r8\n\t" - "adc r4, r4, #0\n\t" - /* A[1] * B[4] */ - "ldr r6, [%[a], #4]\n\t" - "ldr r8, [%[b], #16]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r8\n\t" - "adc r4, r4, #0\n\t" - /* A[2] * B[3] */ - "ldr r6, [%[a], #8]\n\t" - "ldr r8, [%[b], #12]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r8\n\t" - "adc r4, r4, #0\n\t" - /* A[3] * B[2] */ - "ldr r6, [%[a], #12]\n\t" - "ldr r8, [%[b], #8]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r8\n\t" - "adc r4, r4, #0\n\t" - /* A[4] * B[1] */ - "ldr r6, [%[a], #16]\n\t" - "ldr r8, [%[b], #4]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r8\n\t" - "adc r4, r4, #0\n\t" - /* A[5] * B[0] */ - "ldr r6, [%[a], #20]\n\t" - "ldr r8, [%[b], #0]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r8\n\t" - "adc r4, r4, #0\n\t" - "str r5, [%[tmp], #20]\n\t" - "mov r5, #0\n\t" - /* A[0] * B[6] */ - "ldr r6, [%[a], #0]\n\t" - "ldr r8, [%[b], #24]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, #0\n\t" - /* A[1] * B[5] */ - "ldr r6, [%[a], #4]\n\t" - "ldr r8, [%[b], #20]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, #0\n\t" - /* A[2] * B[4] */ - "ldr r6, [%[a], #8]\n\t" - "ldr r8, [%[b], #16]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, #0\n\t" - /* A[3] * B[3] */ - "ldr r6, [%[a], #12]\n\t" - "ldr r8, [%[b], #12]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, #0\n\t" - /* A[4] * B[2] */ - "ldr r6, [%[a], #16]\n\t" - "ldr r8, [%[b], #8]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, #0\n\t" - /* A[5] * B[1] */ - "ldr r6, [%[a], #20]\n\t" - "ldr r8, [%[b], #4]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, #0\n\t" - /* A[6] * B[0] */ - "ldr r6, [%[a], #24]\n\t" - "ldr r8, [%[b], #0]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, #0\n\t" - "str r3, [%[tmp], #24]\n\t" - "mov r3, #0\n\t" - /* A[0] * B[7] */ - "ldr r6, [%[a], #0]\n\t" - "ldr r8, [%[b], #28]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "adc r3, r3, #0\n\t" - /* A[1] * B[6] */ - "ldr r6, [%[a], #4]\n\t" - "ldr r8, [%[b], #24]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "adc r3, r3, #0\n\t" - /* A[2] * B[5] */ - "ldr r6, [%[a], #8]\n\t" - "ldr r8, [%[b], #20]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "adc r3, r3, #0\n\t" - /* A[3] * B[4] */ - "ldr r6, [%[a], #12]\n\t" - "ldr r8, [%[b], #16]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "adc r3, r3, #0\n\t" - /* A[4] * B[3] */ - "ldr r6, [%[a], #16]\n\t" - "ldr r8, [%[b], #12]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "adc r3, r3, #0\n\t" - /* A[5] * B[2] */ - "ldr r6, [%[a], #20]\n\t" - "ldr r8, [%[b], #8]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "adc r3, r3, #0\n\t" - /* A[6] * B[1] */ - "ldr r6, [%[a], #24]\n\t" - "ldr r8, [%[b], #4]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "adc r3, r3, #0\n\t" - /* A[7] * B[0] */ - "ldr r6, [%[a], #28]\n\t" - "ldr r8, [%[b], #0]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "adc r3, r3, #0\n\t" - "str r4, [%[tmp], #28]\n\t" - "mov r4, #0\n\t" - /* A[1] * B[7] */ - "ldr r6, [%[a], #4]\n\t" - "ldr r8, [%[b], #28]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r8\n\t" - "adc r4, r4, #0\n\t" - /* A[2] * B[6] */ - "ldr r6, [%[a], #8]\n\t" - "ldr r8, [%[b], #24]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r8\n\t" - "adc r4, r4, #0\n\t" - /* A[3] * B[5] */ - "ldr r6, [%[a], #12]\n\t" - "ldr r8, [%[b], #20]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r8\n\t" - "adc r4, r4, #0\n\t" - /* A[4] * B[4] */ - "ldr r6, [%[a], #16]\n\t" - "ldr r8, [%[b], #16]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r8\n\t" - "adc r4, r4, #0\n\t" - /* A[5] * B[3] */ - "ldr r6, [%[a], #20]\n\t" - "ldr r8, [%[b], #12]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r8\n\t" - "adc r4, r4, #0\n\t" - /* A[6] * B[2] */ - "ldr r6, [%[a], #24]\n\t" - "ldr r8, [%[b], #8]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r8\n\t" - "adc r4, r4, #0\n\t" - /* A[7] * B[1] */ - "ldr r6, [%[a], #28]\n\t" - "ldr r8, [%[b], #4]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r8\n\t" - "adc r4, r4, #0\n\t" - "str r5, [%[r], #32]\n\t" - "mov r5, #0\n\t" - /* A[2] * B[7] */ - "ldr r6, [%[a], #8]\n\t" - "ldr r8, [%[b], #28]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, #0\n\t" - /* A[3] * B[6] */ - "ldr r6, [%[a], #12]\n\t" - "ldr r8, [%[b], #24]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, #0\n\t" - /* A[4] * B[5] */ - "ldr r6, [%[a], #16]\n\t" - "ldr r8, [%[b], #20]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, #0\n\t" - /* A[5] * B[4] */ - "ldr r6, [%[a], #20]\n\t" - "ldr r8, [%[b], #16]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, #0\n\t" - /* A[6] * B[3] */ - "ldr r6, [%[a], #24]\n\t" - "ldr r8, [%[b], #12]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, #0\n\t" - /* A[7] * B[2] */ - "ldr r6, [%[a], #28]\n\t" - "ldr r8, [%[b], #8]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, #0\n\t" - "str r3, [%[r], #36]\n\t" - "mov r3, #0\n\t" - /* A[3] * B[7] */ - "ldr r6, [%[a], #12]\n\t" - "ldr r8, [%[b], #28]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "adc r3, r3, #0\n\t" - /* A[4] * B[6] */ - "ldr r6, [%[a], #16]\n\t" - "ldr r8, [%[b], #24]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "adc r3, r3, #0\n\t" - /* A[5] * B[5] */ - "ldr r6, [%[a], #20]\n\t" - "ldr r8, [%[b], #20]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "adc r3, r3, #0\n\t" - /* A[6] * B[4] */ - "ldr r6, [%[a], #24]\n\t" - "ldr r8, [%[b], #16]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "adc r3, r3, #0\n\t" - /* A[7] * B[3] */ - "ldr r6, [%[a], #28]\n\t" - "ldr r8, [%[b], #12]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "adc r3, r3, #0\n\t" - "str r4, [%[r], #40]\n\t" - "mov r4, #0\n\t" - /* A[4] * B[7] */ - "ldr r6, [%[a], #16]\n\t" - "ldr r8, [%[b], #28]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r8\n\t" - "adc r4, r4, #0\n\t" - /* A[5] * B[6] */ - "ldr r6, [%[a], #20]\n\t" - "ldr r8, [%[b], #24]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r8\n\t" - "adc r4, r4, #0\n\t" - /* A[6] * B[5] */ - "ldr r6, [%[a], #24]\n\t" - "ldr r8, [%[b], #20]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r8\n\t" - "adc r4, r4, #0\n\t" - /* A[7] * B[4] */ - "ldr r6, [%[a], #28]\n\t" - "ldr r8, [%[b], #16]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r8\n\t" - "adc r4, r4, #0\n\t" - "str r5, [%[r], #44]\n\t" - "mov r5, #0\n\t" - /* A[5] * B[7] */ - "ldr r6, [%[a], #20]\n\t" - "ldr r8, [%[b], #28]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, #0\n\t" - /* A[6] * B[6] */ - "ldr r6, [%[a], #24]\n\t" - "ldr r8, [%[b], #24]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, #0\n\t" - /* A[7] * B[5] */ - "ldr r6, [%[a], #28]\n\t" - "ldr r8, [%[b], #20]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, #0\n\t" - "str r3, [%[r], #48]\n\t" - "mov r3, #0\n\t" - /* A[6] * B[7] */ - "ldr r6, [%[a], #24]\n\t" - "ldr r8, [%[b], #28]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "adc r3, r3, #0\n\t" - /* A[7] * B[6] */ - "ldr r6, [%[a], #28]\n\t" - "ldr r8, [%[b], #24]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "adc r3, r3, #0\n\t" - "str r4, [%[r], #52]\n\t" - "mov r4, #0\n\t" - /* A[7] * B[7] */ - "ldr r6, [%[a], #28]\n\t" - "ldr r8, [%[b], #28]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r5, r5, r6\n\t" - "adc r3, r3, r8\n\t" - "str r5, [%[r], #56]\n\t" - "str r3, [%[r], #60]\n\t" - /* Transfer tmp to r */ - "ldr r3, [%[tmp], #0]\n\t" - "ldr r4, [%[tmp], #4]\n\t" - "ldr r5, [%[tmp], #8]\n\t" - "ldr r6, [%[tmp], #12]\n\t" - "str r3, [%[r], #0]\n\t" - "str r4, [%[r], #4]\n\t" - "str r5, [%[r], #8]\n\t" - "str r6, [%[r], #12]\n\t" - "ldr r3, [%[tmp], #16]\n\t" - "ldr r4, [%[tmp], #20]\n\t" - "ldr r5, [%[tmp], #24]\n\t" - "ldr r6, [%[tmp], #28]\n\t" - "str r3, [%[r], #16]\n\t" - "str r4, [%[r], #20]\n\t" - "str r5, [%[r], #24]\n\t" - "str r6, [%[r], #28]\n\t" - : - : [r] "r" (r), [a] "r" (a), [b] "r" (b), [tmp] "r" (tmp) - : "memory", "r3", "r4", "r5", "r6", "r8" - ); -} - -/* Conditionally subtract b from a using the mask m. - * m is -1 to subtract and 0 when not copying. - * - * r A single precision number representing condition subtract result. - * a A single precision number to subtract from. - * b A single precision number to subtract. - * m Mask value to apply. - */ -SP_NOINLINE static sp_digit sp_256_cond_sub_8(sp_digit* r, const sp_digit* a, - const sp_digit* b, sp_digit m) -{ - sp_digit c = 0; - - __asm__ __volatile__ ( - "mov r5, #32\n\t" - "mov r9, r5\n\t" - "mov r8, #0\n\t" - "\n1:\n\t" - "ldr r6, [%[b], r8]\n\t" - "and r6, r6, %[m]\n\t" - "mov r5, #0\n\t" - "subs r5, r5, %[c]\n\t" - "ldr r5, [%[a], r8]\n\t" - "sbcs r5, r5, r6\n\t" - "sbcs %[c], %[c], %[c]\n\t" - "str r5, [%[r], r8]\n\t" - "add r8, r8, #4\n\t" - "cmp r8, r9\n\t" - "blt 1b\n\t" - : [c] "+r" (c) - : [r] "r" (r), [a] "r" (a), [b] "r" (b), [m] "r" (m) - : "memory", "r5", "r6", "r8", "r9" - ); - - return c; -} - -/* Reduce the number back to 256 bits using Montgomery reduction. - * - * a A single precision number to reduce in place. - * m The single precision number representing the modulus. - * mp The digit representing the negative inverse of m mod 2^n. - */ -SP_NOINLINE static void sp_256_mont_reduce_8(sp_digit* a, const sp_digit* m, - sp_digit mp) -{ - (void)mp; - (void)m; - - __asm__ __volatile__ ( - "mov r2, #0\n\t" - "mov r1, #0\n\t" - /* i = 0 */ - "mov r9, r2\n\t" - "\n1:\n\t" - "mov r4, #0\n\t" - /* mu = a[i] * 1 (mp) = a[i] */ - "ldr r3, [%[a]]\n\t" - /* a[i] += -1 * mu = -1 * a[i] => a[i] = 0 no carry */ - /* a[i+1] += -1 * mu */ - "ldr r6, [%[a], #4]\n\t" - "mov r5, #0\n\t" - "adds r4, r4, r6\n\t" - "adc r5, r5, r2\n\t" - "str r4, [%[a], #4]\n\t" - /* a[i+2] += -1 * mu */ - "ldr r6, [%[a], #8]\n\t" - "mov r4, #0\n\t" - "adds r5, r5, r6\n\t" - "adc r4, r4, r2\n\t" - "str r5, [%[a], #8]\n\t" - /* a[i+3] += 0 * mu */ - "ldr r6, [%[a], #12]\n\t" - "mov r5, #0\n\t" - "adds r4, r4, r3\n\t" - "adc r5, r5, r2\n\t" - "adds r4, r4, r6\n\t" - "adc r5, r5, r2\n\t" - "str r4, [%[a], #12]\n\t" - /* a[i+4] += 0 * mu */ - "ldr r6, [%[a], #16]\n\t" - "mov r4, #0\n\t" - "adds r5, r5, r6\n\t" - "adc r4, r4, r2\n\t" - "str r5, [%[a], #16]\n\t" - /* a[i+5] += 0 * mu */ - "ldr r6, [%[a], #20]\n\t" - "mov r5, #0\n\t" - "adds r4, r4, r6\n\t" - "adc r5, r5, r2\n\t" - "str r4, [%[a], #20]\n\t" - /* a[i+6] += 1 * mu */ - "ldr r6, [%[a], #24]\n\t" - "mov r4, #0\n\t" - "adds r5, r5, r3\n\t" - "adc r4, r4, r2\n\t" - "adds r5, r5, r6\n\t" - "adc r4, r4, r2\n\t" - "str r5, [%[a], #24]\n\t" - /* a[i+7] += -1 * mu */ - "ldr r6, [%[a], #28]\n\t" - "ldr r8, [%[a], #32]\n\t" - "adds r5, r1, r3\n\t" - "mov r1, #0\n\t" - "adc r1, r1, r2\n\t" - "subs r4, r4, r3\n\t" - "sbcs r5, r5, r2\n\t" - "sbc r1, r1, r2\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "adc r1, r1, r2\n\t" - "str r4, [%[a], #28]\n\t" - "str r5, [%[a], #32]\n\t" - /* i += 1 */ - "add r9, r9, #1\n\t" - "add %[a], %[a], #4\n\t" - "mov r6, #8\n\t" - "cmp r9, r6\n\t" - "blt 1b\n\t" - "sub %[a], %[a], #32\n\t" - "mov r3, r1\n\t" - "sub r1, r1, #1\n\t" - "mvn r1, r1\n\t" - "ldr r4, [%[a],#32]\n\t" - "ldr r5, [%[a],#36]\n\t" - "ldr r6, [%[a],#40]\n\t" - "ldr r8, [%[a],#44]\n\t" - "subs r4, r4, r1\n\t" - "sbcs r5, r5, r1\n\t" - "sbcs r6, r6, r1\n\t" - "sbcs r8, r8, r2\n\t" - "str r4, [%[a],#0]\n\t" - "str r5, [%[a],#4]\n\t" - "str r6, [%[a],#8]\n\t" - "str r8, [%[a],#12]\n\t" - "ldr r4, [%[a],#48]\n\t" - "ldr r5, [%[a],#52]\n\t" - "ldr r6, [%[a],#56]\n\t" - "ldr r8, [%[a],#60]\n\t" - "sbcs r4, r4, r2\n\t" - "sbcs r5, r5, r2\n\t" - "sbcs r6, r6, r3\n\t" - "sbc r8, r8, r1\n\t" - "str r4, [%[a],#16]\n\t" - "str r5, [%[a],#20]\n\t" - "str r6, [%[a],#24]\n\t" - "str r8, [%[a],#28]\n\t" - : [a] "+r" (a) - : - : "memory", "r1", "r2", "r3", "r4", "r5", "r6", "r8", "r9" - ); - - - (void)m; - (void)mp; -} - -/* Reduce the number back to 256 bits using Montgomery reduction. - * - * a A single precision number to reduce in place. - * m The single precision number representing the modulus. - * mp The digit representing the negative inverse of m mod 2^n. - */ -SP_NOINLINE static void sp_256_mont_reduce_order_8(sp_digit* a, const sp_digit* m, - sp_digit mp) -{ - sp_digit ca = 0; - - __asm__ __volatile__ ( - "mov r9, %[mp]\n\t" - "mov r12, %[m]\n\t" - "mov r10, %[a]\n\t" - "mov r4, #0\n\t" - "add r11, r10, #32\n\t" - "\n1:\n\t" - /* mu = a[i] * mp */ - "mov %[mp], r9\n\t" - "ldr %[a], [r10]\n\t" - "mul %[mp], %[mp], %[a]\n\t" - "mov %[m], r12\n\t" - "add r14, r10, #24\n\t" - "\n2:\n\t" - /* a[i+j] += m[j] * mu */ - "ldr %[a], [r10]\n\t" - "mov r5, #0\n\t" - /* Multiply m[j] and mu - Start */ - "ldr r8, [%[m]], #4\n\t" - "umull r6, r8, %[mp], r8\n\t" - "adds %[a], %[a], r6\n\t" - "adc r5, r5, r8\n\t" - /* Multiply m[j] and mu - Done */ - "adds r4, r4, %[a]\n\t" - "adc r5, r5, #0\n\t" - "str r4, [r10], #4\n\t" - /* a[i+j+1] += m[j+1] * mu */ - "ldr %[a], [r10]\n\t" - "mov r4, #0\n\t" - /* Multiply m[j] and mu - Start */ - "ldr r8, [%[m]], #4\n\t" - "umull r6, r8, %[mp], r8\n\t" - "adds %[a], %[a], r6\n\t" - "adc r4, r4, r8\n\t" - /* Multiply m[j] and mu - Done */ - "adds r5, r5, %[a]\n\t" - "adc r4, r4, #0\n\t" - "str r5, [r10], #4\n\t" - "cmp r10, r14\n\t" - "blt 2b\n\t" - /* a[i+6] += m[6] * mu */ - "ldr %[a], [r10]\n\t" - "mov r5, #0\n\t" - /* Multiply m[j] and mu - Start */ - "ldr r8, [%[m]], #4\n\t" - "umull r6, r8, %[mp], r8\n\t" - "adds %[a], %[a], r6\n\t" - "adc r5, r5, r8\n\t" - /* Multiply m[j] and mu - Done */ - "adds r4, r4, %[a]\n\t" - "adc r5, r5, #0\n\t" - "str r4, [r10], #4\n\t" - /* a[i+7] += m[7] * mu */ - "mov r4, %[ca]\n\t" - "mov %[ca], #0\n\t" - /* Multiply m[7] and mu - Start */ - "ldr r8, [%[m]]\n\t" - "umull r6, r8, %[mp], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc %[ca], %[ca], #0\n\t" - /* Multiply m[7] and mu - Done */ - "ldr r6, [r10]\n\t" - "ldr r8, [r10, #4]\n\t" - "adds r6, r6, r5\n\t" - "adcs r8, r8, r4\n\t" - "adc %[ca], %[ca], #0\n\t" - "str r6, [r10]\n\t" - "str r8, [r10, #4]\n\t" - /* Next word in a */ - "sub r10, r10, #24\n\t" - "cmp r10, r11\n\t" - "blt 1b\n\t" - "mov %[a], r10\n\t" - "mov %[m], r12\n\t" - : [ca] "+r" (ca), [a] "+r" (a) - : [m] "r" (m), [mp] "r" (mp) - : "memory", "r4", "r5", "r6", "r8", "r9", "r10", "r11", "r12", "r14" - ); - - sp_256_cond_sub_8(a - 8, a, m, (sp_digit)0 - ca); -} - /* Multiply two Montogmery form numbers mod the modulus (prime). * (r = a * b mod m) * @@ -14818,375 +14223,1170 @@ SP_NOINLINE static void sp_256_mont_reduce_order_8(sp_digit* a, const sp_digit* * m Modulus (prime). * mp Montogmery mulitplier. */ -static void sp_256_mont_mul_8(sp_digit* r, const sp_digit* a, const sp_digit* b, +SP_NOINLINE static void sp_256_mont_mul_8(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m, sp_digit mp) { - sp_256_mul_8(r, a, b); - sp_256_mont_reduce_8(r, m, mp); -} + (void)mp; + (void)m; -/* Square a and put result in r. (r = a * a) - * - * r A single precision integer. - * a A single precision integer. - */ -SP_NOINLINE static void sp_256_sqr_8(sp_digit* r, const sp_digit* a) -{ - sp_digit tmp[8]; __asm__ __volatile__ ( - /* A[0] * A[0] */ + "sub sp, sp, #68\n\t" + "mov r5, #0\n\t" + "# A[0] * B[0]\n\t" "ldr r6, [%[a], #0]\n\t" - "umull r3, r4, r6, r6\n\t" - "mov r5, #0\n\t" - "str r3, [%[tmp], #0]\n\t" - "mov r3, #0\n\t" - /* A[0] * A[1] */ - "ldr r8, [%[a], #4]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r4, r4, r6\n\t" - "adc r5, r5, r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "adc r3, r3, #0\n\t" - "str r4, [%[tmp], #4]\n\t" - "mov r4, #0\n\t" - /* A[0] * A[2] */ - "ldr r6, [%[a], #0]\n\t" - "ldr r8, [%[a], #8]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r5, r5, r6\n\t" - "adc r3, r3, r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r8\n\t" - "adc r4, r4, #0\n\t" - /* A[1] * A[1] */ - "ldr r6, [%[a], #4]\n\t" - "umull r6, r8, r6, r6\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r8\n\t" - "adc r4, r4, #0\n\t" - "str r5, [%[tmp], #8]\n\t" - "mov r5, #0\n\t" - /* A[0] * A[3] */ - "ldr r6, [%[a], #0]\n\t" - "ldr r8, [%[a], #12]\n\t" + "ldr r8, [%[b], #0]\n\t" "umull r9, r10, r6, r8\n\t" - "mov r11, #0\n\t" - /* A[1] * A[2] */ - "ldr r6, [%[a], #4]\n\t" - "ldr r8, [%[a], #8]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r9, r9, r6\n\t" - "adcs r10, r10, r8\n\t" - "adc r11, r11, #0\n\t" - "adds r9, r9, r9\n\t" - "adcs r10, r10, r10\n\t" - "adc r11, r11, r11\n\t" - "adds r3, r3, r9\n\t" - "adcs r4, r4, r10\n\t" - "adc r5, r5, r11\n\t" - "str r3, [%[tmp], #12]\n\t" - "mov r3, #0\n\t" - /* A[0] * A[4] */ + "str r9, [sp, #0]\n\t" + "# A[0] * B[1]\n\t" "ldr r6, [%[a], #0]\n\t" - "ldr r8, [%[a], #16]\n\t" - "umull r9, r10, r6, r8\n\t" - "mov r11, #0\n\t" - /* A[1] * A[3] */ + "ldr r8, [%[b], #4]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r10, r3, r10\n\t" + "adc r11, r4, #0\n\t" + "# A[1] * B[0]\n\t" "ldr r6, [%[a], #4]\n\t" - "ldr r8, [%[a], #12]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r9, r9, r6\n\t" - "adcs r10, r10, r8\n\t" - "adc r11, r11, #0\n\t" - /* A[2] * A[2] */ + "ldr r8, [%[b], #0]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r10, r3, r10\n\t" + "adcs r11, r4, r11\n\t" + "adc r14, r5, #0\n\t" + "str r10, [sp, #4]\n\t" + "# A[0] * B[2]\n\t" + "ldr r6, [%[a], #0]\n\t" + "ldr r8, [%[b], #8]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r11, r3, r11\n\t" + "adc r14, r4, r14\n\t" + "# A[1] * B[1]\n\t" + "ldr r6, [%[a], #4]\n\t" + "ldr r8, [%[b], #4]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r11, r3, r11\n\t" + "adcs r14, r4, r14\n\t" + "adc r9, r5, #0\n\t" + "# A[2] * B[0]\n\t" "ldr r6, [%[a], #8]\n\t" - "umull r6, r8, r6, r6\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "adc r3, r3, #0\n\t" - "adds r9, r9, r9\n\t" - "adcs r10, r10, r10\n\t" - "adc r11, r11, r11\n\t" - "adds r4, r4, r9\n\t" - "adcs r5, r5, r10\n\t" - "adc r3, r3, r11\n\t" - "str r4, [%[tmp], #16]\n\t" - "mov r4, #0\n\t" - /* A[0] * A[5] */ + "ldr r8, [%[b], #0]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r11, r3, r11\n\t" + "adcs r14, r4, r14\n\t" + "adc r9, r5, r9\n\t" + "str r11, [sp, #8]\n\t" + "# A[0] * B[3]\n\t" "ldr r6, [%[a], #0]\n\t" - "ldr r8, [%[a], #20]\n\t" - "umull r9, r10, r6, r8\n\t" - "mov r11, #0\n\t" - /* A[1] * A[4] */ + "ldr r8, [%[b], #12]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r14, r3, r14\n\t" + "adcs r9, r4, r9\n\t" + "adc r10, r5, #0\n\t" + "# A[1] * B[2]\n\t" "ldr r6, [%[a], #4]\n\t" - "ldr r8, [%[a], #16]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r9, r9, r6\n\t" - "adcs r10, r10, r8\n\t" - "adc r11, r11, #0\n\t" - /* A[2] * A[3] */ + "ldr r8, [%[b], #8]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r14, r3, r14\n\t" + "adcs r9, r4, r9\n\t" + "adc r10, r5, r10\n\t" + "# A[2] * B[1]\n\t" "ldr r6, [%[a], #8]\n\t" - "ldr r8, [%[a], #12]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r9, r9, r6\n\t" - "adcs r10, r10, r8\n\t" - "adc r11, r11, #0\n\t" - "adds r9, r9, r9\n\t" - "adcs r10, r10, r10\n\t" - "adc r11, r11, r11\n\t" - "adds r5, r5, r9\n\t" - "adcs r3, r3, r10\n\t" - "adc r4, r4, r11\n\t" - "str r5, [%[tmp], #20]\n\t" - "mov r5, #0\n\t" - /* A[0] * A[6] */ - "ldr r6, [%[a], #0]\n\t" - "ldr r8, [%[a], #24]\n\t" - "umull r9, r10, r6, r8\n\t" - "mov r11, #0\n\t" - /* A[1] * A[5] */ - "ldr r6, [%[a], #4]\n\t" - "ldr r8, [%[a], #20]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r9, r9, r6\n\t" - "adcs r10, r10, r8\n\t" - "adc r11, r11, #0\n\t" - /* A[2] * A[4] */ - "ldr r6, [%[a], #8]\n\t" - "ldr r8, [%[a], #16]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r9, r9, r6\n\t" - "adcs r10, r10, r8\n\t" - "adc r11, r11, #0\n\t" - /* A[3] * A[3] */ + "ldr r8, [%[b], #4]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r14, r3, r14\n\t" + "adcs r9, r4, r9\n\t" + "adc r10, r5, r10\n\t" + "# A[3] * B[0]\n\t" "ldr r6, [%[a], #12]\n\t" - "umull r6, r8, r6, r6\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, #0\n\t" - "adds r9, r9, r9\n\t" - "adcs r10, r10, r10\n\t" - "adc r11, r11, r11\n\t" - "adds r3, r3, r9\n\t" - "adcs r4, r4, r10\n\t" - "adc r5, r5, r11\n\t" - "str r3, [%[tmp], #24]\n\t" - "mov r3, #0\n\t" - /* A[0] * A[7] */ + "ldr r8, [%[b], #0]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r14, r3, r14\n\t" + "adcs r9, r4, r9\n\t" + "adc r10, r5, r10\n\t" + "str r14, [sp, #12]\n\t" + "# A[0] * B[4]\n\t" "ldr r6, [%[a], #0]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r9, r10, r6, r8\n\t" - "mov r11, #0\n\t" - /* A[1] * A[6] */ + "ldr r8, [%[b], #16]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r9, r3, r9\n\t" + "adcs r10, r4, r10\n\t" + "adc r11, r5, #0\n\t" + "# A[1] * B[3]\n\t" "ldr r6, [%[a], #4]\n\t" - "ldr r8, [%[a], #24]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r9, r9, r6\n\t" - "adcs r10, r10, r8\n\t" - "adc r11, r11, #0\n\t" - /* A[2] * A[5] */ + "ldr r8, [%[b], #12]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r9, r3, r9\n\t" + "adcs r10, r4, r10\n\t" + "adc r11, r5, r11\n\t" + "# A[2] * B[2]\n\t" "ldr r6, [%[a], #8]\n\t" - "ldr r8, [%[a], #20]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r9, r9, r6\n\t" - "adcs r10, r10, r8\n\t" - "adc r11, r11, #0\n\t" - /* A[3] * A[4] */ + "ldr r8, [%[b], #8]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r9, r3, r9\n\t" + "adcs r10, r4, r10\n\t" + "adc r11, r5, r11\n\t" + "# A[3] * B[1]\n\t" "ldr r6, [%[a], #12]\n\t" - "ldr r8, [%[a], #16]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r9, r9, r6\n\t" - "adcs r10, r10, r8\n\t" - "adc r11, r11, #0\n\t" - "adds r9, r9, r9\n\t" - "adcs r10, r10, r10\n\t" - "adc r11, r11, r11\n\t" - "adds r4, r4, r9\n\t" - "adcs r5, r5, r10\n\t" - "adc r3, r3, r11\n\t" - "str r4, [%[tmp], #28]\n\t" - "mov r4, #0\n\t" - /* A[1] * A[7] */ - "ldr r6, [%[a], #4]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r9, r10, r6, r8\n\t" - "mov r11, #0\n\t" - /* A[2] * A[6] */ - "ldr r6, [%[a], #8]\n\t" - "ldr r8, [%[a], #24]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r9, r9, r6\n\t" - "adcs r10, r10, r8\n\t" - "adc r11, r11, #0\n\t" - /* A[3] * A[5] */ - "ldr r6, [%[a], #12]\n\t" - "ldr r8, [%[a], #20]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r9, r9, r6\n\t" - "adcs r10, r10, r8\n\t" - "adc r11, r11, #0\n\t" - /* A[4] * A[4] */ + "ldr r8, [%[b], #4]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r9, r3, r9\n\t" + "adcs r10, r4, r10\n\t" + "adc r11, r5, r11\n\t" + "# A[4] * B[0]\n\t" "ldr r6, [%[a], #16]\n\t" - "umull r6, r8, r6, r6\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r8\n\t" - "adc r4, r4, #0\n\t" - "adds r9, r9, r9\n\t" - "adcs r10, r10, r10\n\t" - "adc r11, r11, r11\n\t" - "adds r5, r5, r9\n\t" - "adcs r3, r3, r10\n\t" - "adc r4, r4, r11\n\t" - "str r5, [%[r], #32]\n\t" - "mov r5, #0\n\t" - /* A[2] * A[7] */ + "ldr r8, [%[b], #0]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r9, r3, r9\n\t" + "adcs r10, r4, r10\n\t" + "adc r11, r5, r11\n\t" + "str r9, [sp, #16]\n\t" + "# A[0] * B[5]\n\t" + "ldr r6, [%[a], #0]\n\t" + "ldr r8, [%[b], #20]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r10, r3, r10\n\t" + "adcs r11, r4, r11\n\t" + "adc r14, r5, #0\n\t" + "# A[1] * B[4]\n\t" + "ldr r6, [%[a], #4]\n\t" + "ldr r8, [%[b], #16]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r10, r3, r10\n\t" + "adcs r11, r4, r11\n\t" + "adc r14, r5, r14\n\t" + "# A[2] * B[3]\n\t" "ldr r6, [%[a], #8]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r9, r10, r6, r8\n\t" - "mov r11, #0\n\t" - /* A[3] * A[6] */ + "ldr r8, [%[b], #12]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r10, r3, r10\n\t" + "adcs r11, r4, r11\n\t" + "adc r14, r5, r14\n\t" + "# A[3] * B[2]\n\t" "ldr r6, [%[a], #12]\n\t" - "ldr r8, [%[a], #24]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r9, r9, r6\n\t" - "adcs r10, r10, r8\n\t" - "adc r11, r11, #0\n\t" - /* A[4] * A[5] */ + "ldr r8, [%[b], #8]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r10, r3, r10\n\t" + "adcs r11, r4, r11\n\t" + "adc r14, r5, r14\n\t" + "# A[4] * B[1]\n\t" "ldr r6, [%[a], #16]\n\t" - "ldr r8, [%[a], #20]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r9, r9, r6\n\t" - "adcs r10, r10, r8\n\t" - "adc r11, r11, #0\n\t" - "adds r9, r9, r9\n\t" - "adcs r10, r10, r10\n\t" - "adc r11, r11, r11\n\t" - "adds r3, r3, r9\n\t" - "adcs r4, r4, r10\n\t" - "adc r5, r5, r11\n\t" - "str r3, [%[r], #36]\n\t" - "mov r3, #0\n\t" - /* A[3] * A[7] */ - "ldr r6, [%[a], #12]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r9, r10, r6, r8\n\t" - "mov r11, #0\n\t" - /* A[4] * A[6] */ - "ldr r6, [%[a], #16]\n\t" - "ldr r8, [%[a], #24]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r9, r9, r6\n\t" - "adcs r10, r10, r8\n\t" - "adc r11, r11, #0\n\t" - /* A[5] * A[5] */ + "ldr r8, [%[b], #4]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r10, r3, r10\n\t" + "adcs r11, r4, r11\n\t" + "adc r14, r5, r14\n\t" + "# A[5] * B[0]\n\t" "ldr r6, [%[a], #20]\n\t" - "umull r6, r8, r6, r6\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "adc r3, r3, #0\n\t" - "adds r9, r9, r9\n\t" - "adcs r10, r10, r10\n\t" - "adc r11, r11, r11\n\t" - "adds r4, r4, r9\n\t" - "adcs r5, r5, r10\n\t" - "adc r3, r3, r11\n\t" - "str r4, [%[r], #40]\n\t" - "mov r4, #0\n\t" - /* A[4] * A[7] */ + "ldr r8, [%[b], #0]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r10, r3, r10\n\t" + "adcs r11, r4, r11\n\t" + "adc r14, r5, r14\n\t" + "str r10, [sp, #20]\n\t" + "# A[0] * B[6]\n\t" + "ldr r6, [%[a], #0]\n\t" + "ldr r8, [%[b], #24]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r11, r3, r11\n\t" + "adcs r14, r4, r14\n\t" + "adc r9, r5, #0\n\t" + "# A[1] * B[5]\n\t" + "ldr r6, [%[a], #4]\n\t" + "ldr r8, [%[b], #20]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r11, r3, r11\n\t" + "adcs r14, r4, r14\n\t" + "adc r9, r5, r9\n\t" + "# A[2] * B[4]\n\t" + "ldr r6, [%[a], #8]\n\t" + "ldr r8, [%[b], #16]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r11, r3, r11\n\t" + "adcs r14, r4, r14\n\t" + "adc r9, r5, r9\n\t" + "# A[3] * B[3]\n\t" + "ldr r6, [%[a], #12]\n\t" + "ldr r8, [%[b], #12]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r11, r3, r11\n\t" + "adcs r14, r4, r14\n\t" + "adc r9, r5, r9\n\t" + "# A[4] * B[2]\n\t" "ldr r6, [%[a], #16]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r8\n\t" - "adc r4, r4, #0\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r8\n\t" - "adc r4, r4, #0\n\t" - /* A[5] * A[6] */ + "ldr r8, [%[b], #8]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r11, r3, r11\n\t" + "adcs r14, r4, r14\n\t" + "adc r9, r5, r9\n\t" + "# A[5] * B[1]\n\t" "ldr r6, [%[a], #20]\n\t" - "ldr r8, [%[a], #24]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r8\n\t" - "adc r4, r4, #0\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r8\n\t" - "adc r4, r4, #0\n\t" - "str r5, [%[r], #44]\n\t" - "mov r5, #0\n\t" - /* A[5] * A[7] */ - "ldr r6, [%[a], #20]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, #0\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, #0\n\t" - /* A[6] * A[6] */ + "ldr r8, [%[b], #4]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r11, r3, r11\n\t" + "adcs r14, r4, r14\n\t" + "adc r9, r5, r9\n\t" + "# A[6] * B[0]\n\t" "ldr r6, [%[a], #24]\n\t" - "umull r6, r8, r6, r6\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, #0\n\t" - "str r3, [%[r], #48]\n\t" - "mov r3, #0\n\t" - /* A[6] * A[7] */ + "ldr r8, [%[b], #0]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r11, r3, r11\n\t" + "adcs r14, r4, r14\n\t" + "adc r9, r5, r9\n\t" + "str r11, [sp, #24]\n\t" + "# A[0] * B[7]\n\t" + "ldr r6, [%[a], #0]\n\t" + "ldr r8, [%[b], #28]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r14, r3, r14\n\t" + "adcs r9, r4, r9\n\t" + "adc r10, r5, #0\n\t" + "# A[1] * B[6]\n\t" + "ldr r6, [%[a], #4]\n\t" + "ldr r8, [%[b], #24]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r14, r3, r14\n\t" + "adcs r9, r4, r9\n\t" + "adc r10, r5, r10\n\t" + "# A[2] * B[5]\n\t" + "ldr r6, [%[a], #8]\n\t" + "ldr r8, [%[b], #20]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r14, r3, r14\n\t" + "adcs r9, r4, r9\n\t" + "adc r10, r5, r10\n\t" + "# A[3] * B[4]\n\t" + "ldr r6, [%[a], #12]\n\t" + "ldr r8, [%[b], #16]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r14, r3, r14\n\t" + "adcs r9, r4, r9\n\t" + "adc r10, r5, r10\n\t" + "# A[4] * B[3]\n\t" + "ldr r6, [%[a], #16]\n\t" + "ldr r8, [%[b], #12]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r14, r3, r14\n\t" + "adcs r9, r4, r9\n\t" + "adc r10, r5, r10\n\t" + "# A[5] * B[2]\n\t" + "ldr r6, [%[a], #20]\n\t" + "ldr r8, [%[b], #8]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r14, r3, r14\n\t" + "adcs r9, r4, r9\n\t" + "adc r10, r5, r10\n\t" + "# A[6] * B[1]\n\t" "ldr r6, [%[a], #24]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "adc r3, r3, #0\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "adc r3, r3, #0\n\t" - "str r4, [%[r], #52]\n\t" - "mov r4, #0\n\t" - /* A[7] * A[7] */ + "ldr r8, [%[b], #4]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r14, r3, r14\n\t" + "adcs r9, r4, r9\n\t" + "adc r10, r5, r10\n\t" + "# A[7] * B[0]\n\t" "ldr r6, [%[a], #28]\n\t" - "umull r6, r8, r6, r6\n\t" - "adds r5, r5, r6\n\t" - "adc r3, r3, r8\n\t" - "str r5, [%[r], #56]\n\t" - "str r3, [%[r], #60]\n\t" - /* Transfer tmp to r */ - "ldr r3, [%[tmp], #0]\n\t" - "ldr r4, [%[tmp], #4]\n\t" - "ldr r5, [%[tmp], #8]\n\t" - "ldr r6, [%[tmp], #12]\n\t" - "str r3, [%[r], #0]\n\t" - "str r4, [%[r], #4]\n\t" - "str r5, [%[r], #8]\n\t" - "str r6, [%[r], #12]\n\t" - "ldr r3, [%[tmp], #16]\n\t" - "ldr r4, [%[tmp], #20]\n\t" - "ldr r5, [%[tmp], #24]\n\t" - "ldr r6, [%[tmp], #28]\n\t" - "str r3, [%[r], #16]\n\t" - "str r4, [%[r], #20]\n\t" - "str r5, [%[r], #24]\n\t" - "str r6, [%[r], #28]\n\t" - : - : [r] "r" (r), [a] "r" (a), [tmp] "r" (tmp) - : "memory", "r3", "r4", "r5", "r6", "r8", "r9", "r10", "r11" + "ldr r8, [%[b], #0]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r14, r3, r14\n\t" + "adcs r9, r4, r9\n\t" + "adc r10, r5, r10\n\t" + "str r14, [sp, #28]\n\t" + "# A[1] * B[7]\n\t" + "ldr r6, [%[a], #4]\n\t" + "ldr r8, [%[b], #28]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r9, r3, r9\n\t" + "adcs r10, r4, r10\n\t" + "adc r11, r5, #0\n\t" + "# A[2] * B[6]\n\t" + "ldr r6, [%[a], #8]\n\t" + "ldr r8, [%[b], #24]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r9, r3, r9\n\t" + "adcs r10, r4, r10\n\t" + "adc r11, r5, r11\n\t" + "# A[3] * B[5]\n\t" + "ldr r6, [%[a], #12]\n\t" + "ldr r8, [%[b], #20]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r9, r3, r9\n\t" + "adcs r10, r4, r10\n\t" + "adc r11, r5, r11\n\t" + "# A[4] * B[4]\n\t" + "ldr r6, [%[a], #16]\n\t" + "ldr r8, [%[b], #16]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r9, r3, r9\n\t" + "adcs r10, r4, r10\n\t" + "adc r11, r5, r11\n\t" + "# A[5] * B[3]\n\t" + "ldr r6, [%[a], #20]\n\t" + "ldr r8, [%[b], #12]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r9, r3, r9\n\t" + "adcs r10, r4, r10\n\t" + "adc r11, r5, r11\n\t" + "# A[6] * B[2]\n\t" + "ldr r6, [%[a], #24]\n\t" + "ldr r8, [%[b], #8]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r9, r3, r9\n\t" + "adcs r10, r4, r10\n\t" + "adc r11, r5, r11\n\t" + "# A[7] * B[1]\n\t" + "ldr r6, [%[a], #28]\n\t" + "ldr r8, [%[b], #4]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r9, r3, r9\n\t" + "adcs r10, r4, r10\n\t" + "adc r11, r5, r11\n\t" + "str r9, [sp, #32]\n\t" + "# A[2] * B[7]\n\t" + "ldr r6, [%[a], #8]\n\t" + "ldr r8, [%[b], #28]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r10, r3, r10\n\t" + "adcs r11, r4, r11\n\t" + "adc r14, r5, #0\n\t" + "# A[3] * B[6]\n\t" + "ldr r6, [%[a], #12]\n\t" + "ldr r8, [%[b], #24]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r10, r3, r10\n\t" + "adcs r11, r4, r11\n\t" + "adc r14, r5, r14\n\t" + "# A[4] * B[5]\n\t" + "ldr r6, [%[a], #16]\n\t" + "ldr r8, [%[b], #20]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r10, r3, r10\n\t" + "adcs r11, r4, r11\n\t" + "adc r14, r5, r14\n\t" + "# A[5] * B[4]\n\t" + "ldr r6, [%[a], #20]\n\t" + "ldr r8, [%[b], #16]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r10, r3, r10\n\t" + "adcs r11, r4, r11\n\t" + "adc r14, r5, r14\n\t" + "# A[6] * B[3]\n\t" + "ldr r6, [%[a], #24]\n\t" + "ldr r8, [%[b], #12]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r10, r3, r10\n\t" + "adcs r11, r4, r11\n\t" + "adc r14, r5, r14\n\t" + "# A[7] * B[2]\n\t" + "ldr r6, [%[a], #28]\n\t" + "ldr r8, [%[b], #8]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r10, r3, r10\n\t" + "adcs r11, r4, r11\n\t" + "adc r14, r5, r14\n\t" + "str r10, [sp, #36]\n\t" + "# A[3] * B[7]\n\t" + "ldr r6, [%[a], #12]\n\t" + "ldr r8, [%[b], #28]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r11, r3, r11\n\t" + "adcs r14, r4, r14\n\t" + "adc r9, r5, #0\n\t" + "# A[4] * B[6]\n\t" + "ldr r6, [%[a], #16]\n\t" + "ldr r8, [%[b], #24]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r11, r3, r11\n\t" + "adcs r14, r4, r14\n\t" + "adc r9, r5, r9\n\t" + "# A[5] * B[5]\n\t" + "ldr r6, [%[a], #20]\n\t" + "ldr r8, [%[b], #20]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r11, r3, r11\n\t" + "adcs r14, r4, r14\n\t" + "adc r9, r5, r9\n\t" + "# A[6] * B[4]\n\t" + "ldr r6, [%[a], #24]\n\t" + "ldr r8, [%[b], #16]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r11, r3, r11\n\t" + "adcs r14, r4, r14\n\t" + "adc r9, r5, r9\n\t" + "# A[7] * B[3]\n\t" + "ldr r6, [%[a], #28]\n\t" + "ldr r8, [%[b], #12]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r11, r3, r11\n\t" + "adcs r14, r4, r14\n\t" + "adc r9, r5, r9\n\t" + "str r11, [sp, #40]\n\t" + "# A[4] * B[7]\n\t" + "ldr r6, [%[a], #16]\n\t" + "ldr r8, [%[b], #28]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r14, r3, r14\n\t" + "adcs r9, r4, r9\n\t" + "adc r10, r5, #0\n\t" + "# A[5] * B[6]\n\t" + "ldr r6, [%[a], #20]\n\t" + "ldr r8, [%[b], #24]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r14, r3, r14\n\t" + "adcs r9, r4, r9\n\t" + "adc r10, r5, r10\n\t" + "# A[6] * B[5]\n\t" + "ldr r6, [%[a], #24]\n\t" + "ldr r8, [%[b], #20]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r14, r3, r14\n\t" + "adcs r9, r4, r9\n\t" + "adc r10, r5, r10\n\t" + "# A[7] * B[4]\n\t" + "ldr r6, [%[a], #28]\n\t" + "ldr r8, [%[b], #16]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r14, r3, r14\n\t" + "adcs r9, r4, r9\n\t" + "adc r10, r5, r10\n\t" + "str r14, [sp, #44]\n\t" + "# A[5] * B[7]\n\t" + "ldr r6, [%[a], #20]\n\t" + "ldr r8, [%[b], #28]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r9, r3, r9\n\t" + "adcs r10, r4, r10\n\t" + "adc r11, r5, #0\n\t" + "# A[6] * B[6]\n\t" + "ldr r6, [%[a], #24]\n\t" + "ldr r8, [%[b], #24]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r9, r3, r9\n\t" + "adcs r10, r4, r10\n\t" + "adc r11, r5, r11\n\t" + "# A[7] * B[5]\n\t" + "ldr r6, [%[a], #28]\n\t" + "ldr r8, [%[b], #20]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r9, r3, r9\n\t" + "adcs r10, r4, r10\n\t" + "adc r11, r5, r11\n\t" + "# A[6] * B[7]\n\t" + "ldr r6, [%[a], #24]\n\t" + "ldr r8, [%[b], #28]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r10, r3, r10\n\t" + "adcs r11, r4, r11\n\t" + "adc r14, r5, #0\n\t" + "# A[7] * B[6]\n\t" + "ldr r6, [%[a], #28]\n\t" + "ldr r8, [%[b], #24]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r10, r3, r10\n\t" + "adcs r11, r4, r11\n\t" + "adc r14, r5, r14\n\t" + "# A[7] * B[7]\n\t" + "ldr r6, [%[a], #28]\n\t" + "ldr r8, [%[b], #28]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r11, r3, r11\n\t" + "adc r14, r4, r14\n\t" + "str r9, [sp, #48]\n\t" + "str r10, [sp, #52]\n\t" + "str r11, [sp, #56]\n\t" + "str r14, [sp, #60]\n\t" + "# Start Reduction\n\t" + "ldr r4, [sp, #0]\n\t" + "ldr r5, [sp, #4]\n\t" + "ldr r6, [sp, #8]\n\t" + "ldr r8, [sp, #12]\n\t" + "ldr r9, [sp, #16]\n\t" + "ldr r10, [sp, #20]\n\t" + "ldr r11, [sp, #24]\n\t" + "ldr r14, [sp, #28]\n\t" + "# mu = a[0]-a[7] + a[0]-a[4] << 96 + (a[0]-a[1] * 2) << 192\n\t" + "# - a[0] << 224\n\t" + "# + (a[0]-a[1] * 2) << (6 * 32)\n\t" + "adds r11, r11, r4\n\t" + "adc r14, r14, r5\n\t" + "adds r11, r11, r4\n\t" + "adc r14, r14, r5\n\t" + "# - a[0] << (7 * 32)\n\t" + "sub r14, r14, r4\n\t" + "# + a[0]-a[4] << (3 * 32)\n\t" + "mov %[a], r8\n\t" + "mov %[b], r9\n\t" + "adds r8, r8, r4\n\t" + "adcs r9, r9, r5\n\t" + "adcs r10, r10, r6\n\t" + "adcs r11, r11, %[a]\n\t" + "adc r14, r14, %[b]\n\t" + "str r4, [sp, #0]\n\t" + "str r5, [sp, #4]\n\t" + "str r6, [sp, #8]\n\t" + "str r8, [sp, #12]\n\t" + "str r9, [sp, #16]\n\t" + "str r10, [sp, #20]\n\t" + "# a += mu * m\n\t" + "# += mu * ((1 << 256) - (1 << 224) + (1 << 192) + (1 << 96) - 1)\n\t" + "mov %[a], #0\n\t" + "# a[6] += t[0] + t[3]\n\t" + "ldr r3, [sp, #24]\n\t" + "adds r3, r3, r4\n\t" + "adc %[b], %[a], #0\n\t" + "adds r3, r3, r8\n\t" + "adc %[b], %[b], #0\n\t" + "str r11, [sp, #24]\n\t" + "# a[7] += t[1] + t[4]\n\t" + "ldr r3, [sp, #28]\n\t" + "adds r3, r3, %[b]\n\t" + "adc %[b], %[a], #0\n\t" + "adds r3, r3, r5\n\t" + "adc %[b], %[b], #0\n\t" + "adds r3, r3, r9\n\t" + "adc %[b], %[b], #0\n\t" + "str r14, [sp, #28]\n\t" + "str r3, [sp, #64]\n\t" + "# a[8] += t[0] + t[2] + t[5]\n\t" + "ldr r3, [sp, #32]\n\t" + "adds r3, r3, %[b]\n\t" + "adc %[b], %[a], #0\n\t" + "adds r3, r3, r4\n\t" + "adc %[b], %[b], #0\n\t" + "adds r3, r3, r6\n\t" + "adc %[b], %[b], #0\n\t" + "adds r3, r3, r10\n\t" + "adc %[b], %[b], #0\n\t" + "str r3, [sp, #32]\n\t" + "# a[9] += t[1] + t[3] + t[6]\n\t" + "# a[10] += t[2] + t[4] + t[7]\n\t" + "ldr r3, [sp, #36]\n\t" + "ldr r4, [sp, #40]\n\t" + "adds r3, r3, %[b]\n\t" + "adcs r4, r4, #0\n\t" + "adc %[b], %[a], #0\n\t" + "adds r3, r3, r5\n\t" + "adcs r4, r4, r6\n\t" + "adc %[b], %[b], #0\n\t" + "adds r3, r3, r8\n\t" + "adcs r4, r4, r9\n\t" + "adc %[b], %[b], #0\n\t" + "adds r3, r3, r11\n\t" + "adcs r4, r4, r14\n\t" + "adc %[b], %[b], #0\n\t" + "str r3, [sp, #36]\n\t" + "str r4, [sp, #40]\n\t" + "# a[11] += t[3] + t[5]\n\t" + "# a[12] += t[4] + t[6]\n\t" + "# a[13] += t[5] + t[7]\n\t" + "# a[14] += t[6]\n\t" + "ldr r3, [sp, #44]\n\t" + "ldr r4, [sp, #48]\n\t" + "ldr r5, [sp, #52]\n\t" + "ldr r6, [sp, #56]\n\t" + "adds r3, r3, %[b]\n\t" + "adcs r4, r4, #0\n\t" + "adcs r5, r5, #0\n\t" + "adcs r6, r6, #0\n\t" + "adc %[b], %[a], #0\n\t" + "adds r3, r3, r8\n\t" + "adcs r4, r4, r9\n\t" + "adcs r5, r5, r10\n\t" + "adcs r6, r6, r11\n\t" + "adc %[b], %[b], #0\n\t" + "adds r3, r3, r10\n\t" + "adcs r4, r4, r11\n\t" + "adcs r5, r5, r14\n\t" + "adcs r6, r6, #0\n\t" + "adc %[b], %[b], #0\n\t" + "str r3, [sp, #44]\n\t" + "str r4, [sp, #48]\n\t" + "str r5, [sp, #52]\n\t" + "str r6, [sp, #56]\n\t" + "# a[15] += t[7]\n\t" + "ldr r3, [sp, #60]\n\t" + "adds r3, r3, %[b]\n\t" + "adc %[b], %[a], #0\n\t" + "adds r3, r3, r14\n\t" + "adc %[b], %[b], #0\n\t" + "str r3, [sp, #60]\n\t" + "ldr r3, [sp, #64]\n\t" + "ldr r4, [sp, #32]\n\t" + "ldr r5, [sp, #36]\n\t" + "ldr r6, [sp, #40]\n\t" + "ldr r9, [sp, #0]\n\t" + "ldr r10, [sp, #4]\n\t" + "ldr r11, [sp, #8]\n\t" + "ldr r14, [sp, #12]\n\t" + "subs r3, r3, r9\n\t" + "sbcs r4, r4, r10\n\t" + "sbcs r5, r5, r11\n\t" + "sbcs r6, r6, r14\n\t" + "str r4, [sp, #32]\n\t" + "str r5, [sp, #36]\n\t" + "str r6, [sp, #40]\n\t" + "ldr r3, [sp, #44]\n\t" + "ldr r4, [sp, #48]\n\t" + "ldr r5, [sp, #52]\n\t" + "ldr r6, [sp, #56]\n\t" + "ldr r8, [sp, #60]\n\t" + "ldr r9, [sp, #16]\n\t" + "ldr r10, [sp, #20]\n\t" + "ldr r11, [sp, #24]\n\t" + "ldr r14, [sp, #28]\n\t" + "sbcs r3, r3, r9\n\t" + "sbcs r4, r4, r10\n\t" + "sbcs r5, r5, r11\n\t" + "sbcs r6, r6, r14\n\t" + "sbc r8, r8, #0\n\t" + "str r3, [sp, #44]\n\t" + "str r4, [sp, #48]\n\t" + "str r5, [sp, #52]\n\t" + "str r6, [sp, #56]\n\t" + "str r8, [sp, #60]\n\t" + "# mask m and sub from result if overflow\n\t" + "sub %[b], %[a], %[b]\n\t" + "and %[a], %[b], #1\n\t" + "ldr r3, [sp, #32]\n\t" + "ldr r4, [sp, #36]\n\t" + "ldr r5, [sp, #40]\n\t" + "ldr r6, [sp, #44]\n\t" + "ldr r8, [sp, #48]\n\t" + "ldr r9, [sp, #52]\n\t" + "ldr r10, [sp, #56]\n\t" + "ldr r11, [sp, #60]\n\t" + "subs r3, r3, %[b]\n\t" + "sbcs r4, r4, %[b]\n\t" + "sbcs r5, r5, %[b]\n\t" + "sbcs r6, r6, #0\n\t" + "sbcs r8, r8, #0\n\t" + "sbcs r9, r9, #0\n\t" + "sbcs r10, r10, %[a]\n\t" + "sbc r11, r11, %[b]\n\t" + "str r3, [%[r], #0]\n\t" + "str r4, [%[r], #4]\n\t" + "str r5, [%[r], #8]\n\t" + "str r6, [%[r], #12]\n\t" + "str r8, [%[r], #16]\n\t" + "str r9, [%[r], #20]\n\t" + "str r10, [%[r], #24]\n\t" + "str r11, [%[r], #28]\n\t" + "add sp, sp, #68\n\t" + : [a] "+r" (a), [b] "+r" (b) + : [r] "r" (r) + : "memory", "r9", "r10", "r11", "r14", "r3", "r4", "r5", "r6", "r8" ); } -/* Square the Montgomery form number. (r = a * a mod m) +/* Square the Montgomery form number mod the modulus (prime). (r = a * a mod m) * * r Result of squaring. * a Number to square in Montogmery form. * m Modulus (prime). * mp Montogmery mulitplier. */ -static void sp_256_mont_sqr_8(sp_digit* r, const sp_digit* a, const sp_digit* m, +SP_NOINLINE static void sp_256_mont_sqr_8(sp_digit* r, const sp_digit* a, const sp_digit* m, sp_digit mp) { - sp_256_sqr_8(r, a); - sp_256_mont_reduce_8(r, m, mp); + (void)mp; + (void)m; + + __asm__ __volatile__ ( + "sub sp, sp, #68\n\t" + "mov r5, #0\n\t" + "# A[0] * A[1]\n\t" + "ldr r6, [%[a], #0]\n\t" + "ldr r8, [%[a], #4]\n\t" + "umull r10, r11, r6, r8\n\t" + "str r10, [sp, #4]\n\t" + "# A[0] * A[2]\n\t" + "ldr r6, [%[a], #0]\n\t" + "ldr r8, [%[a], #8]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r11, r3, r11\n\t" + "adc r14, r4, #0\n\t" + "str r11, [sp, #8]\n\t" + "# A[0] * A[3]\n\t" + "ldr r6, [%[a], #0]\n\t" + "ldr r8, [%[a], #12]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r14, r3, r14\n\t" + "adc r9, r4, #0\n\t" + "# A[1] * A[2]\n\t" + "ldr r6, [%[a], #4]\n\t" + "ldr r8, [%[a], #8]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r14, r3, r14\n\t" + "adcs r9, r4, r9\n\t" + "adc r10, r5, #0\n\t" + "str r14, [sp, #12]\n\t" + "# A[0] * A[4]\n\t" + "ldr r6, [%[a], #0]\n\t" + "ldr r8, [%[a], #16]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r9, r3, r9\n\t" + "adc r10, r4, r10\n\t" + "# A[1] * A[3]\n\t" + "ldr r6, [%[a], #4]\n\t" + "ldr r8, [%[a], #12]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r9, r3, r9\n\t" + "adcs r10, r4, r10\n\t" + "adc r11, r5, #0\n\t" + "str r9, [sp, #16]\n\t" + "# A[0] * A[5]\n\t" + "ldr r6, [%[a], #0]\n\t" + "ldr r8, [%[a], #20]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r10, r3, r10\n\t" + "adc r11, r4, r11\n\t" + "# A[1] * A[4]\n\t" + "ldr r6, [%[a], #4]\n\t" + "ldr r8, [%[a], #16]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r10, r3, r10\n\t" + "adcs r11, r4, r11\n\t" + "adc r14, r5, #0\n\t" + "# A[2] * A[3]\n\t" + "ldr r6, [%[a], #8]\n\t" + "ldr r8, [%[a], #12]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r10, r3, r10\n\t" + "adcs r11, r4, r11\n\t" + "adc r14, r5, r14\n\t" + "str r10, [sp, #20]\n\t" + "# A[0] * A[6]\n\t" + "ldr r6, [%[a], #0]\n\t" + "ldr r8, [%[a], #24]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r11, r3, r11\n\t" + "adcs r14, r4, r14\n\t" + "adc r9, r5, #0\n\t" + "# A[1] * A[5]\n\t" + "ldr r6, [%[a], #4]\n\t" + "ldr r8, [%[a], #20]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r11, r3, r11\n\t" + "adcs r14, r4, r14\n\t" + "adc r9, r5, r9\n\t" + "# A[2] * A[4]\n\t" + "ldr r6, [%[a], #8]\n\t" + "ldr r8, [%[a], #16]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r11, r3, r11\n\t" + "adcs r14, r4, r14\n\t" + "adc r9, r5, r9\n\t" + "str r11, [sp, #24]\n\t" + "# A[0] * A[7]\n\t" + "ldr r6, [%[a], #0]\n\t" + "ldr r8, [%[a], #28]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r14, r3, r14\n\t" + "adcs r9, r4, r9\n\t" + "adc r10, r5, #0\n\t" + "# A[1] * A[6]\n\t" + "ldr r6, [%[a], #4]\n\t" + "ldr r8, [%[a], #24]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r14, r3, r14\n\t" + "adcs r9, r4, r9\n\t" + "adc r10, r5, r10\n\t" + "# A[2] * A[5]\n\t" + "ldr r6, [%[a], #8]\n\t" + "ldr r8, [%[a], #20]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r14, r3, r14\n\t" + "adcs r9, r4, r9\n\t" + "adc r10, r5, r10\n\t" + "# A[3] * A[4]\n\t" + "ldr r6, [%[a], #12]\n\t" + "ldr r8, [%[a], #16]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r14, r3, r14\n\t" + "adcs r9, r4, r9\n\t" + "adc r10, r5, r10\n\t" + "str r14, [sp, #28]\n\t" + "# A[1] * A[7]\n\t" + "ldr r6, [%[a], #4]\n\t" + "ldr r8, [%[a], #28]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r9, r3, r9\n\t" + "adcs r10, r4, r10\n\t" + "adc r11, r5, #0\n\t" + "# A[2] * A[6]\n\t" + "ldr r6, [%[a], #8]\n\t" + "ldr r8, [%[a], #24]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r9, r3, r9\n\t" + "adcs r10, r4, r10\n\t" + "adc r11, r5, r11\n\t" + "# A[3] * A[5]\n\t" + "ldr r6, [%[a], #12]\n\t" + "ldr r8, [%[a], #20]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r9, r3, r9\n\t" + "adcs r10, r4, r10\n\t" + "adc r11, r5, r11\n\t" + "str r9, [sp, #32]\n\t" + "# A[2] * A[7]\n\t" + "ldr r6, [%[a], #8]\n\t" + "ldr r8, [%[a], #28]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r10, r3, r10\n\t" + "adcs r11, r4, r11\n\t" + "adc r14, r5, #0\n\t" + "# A[3] * A[6]\n\t" + "ldr r6, [%[a], #12]\n\t" + "ldr r8, [%[a], #24]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r10, r3, r10\n\t" + "adcs r11, r4, r11\n\t" + "adc r14, r5, r14\n\t" + "# A[4] * A[5]\n\t" + "ldr r6, [%[a], #16]\n\t" + "ldr r8, [%[a], #20]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r10, r3, r10\n\t" + "adcs r11, r4, r11\n\t" + "adc r14, r5, r14\n\t" + "str r10, [sp, #36]\n\t" + "# A[3] * A[7]\n\t" + "ldr r6, [%[a], #12]\n\t" + "ldr r8, [%[a], #28]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r11, r3, r11\n\t" + "adcs r14, r4, r14\n\t" + "adc r9, r5, #0\n\t" + "# A[4] * A[6]\n\t" + "ldr r6, [%[a], #16]\n\t" + "ldr r8, [%[a], #24]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r11, r3, r11\n\t" + "adcs r14, r4, r14\n\t" + "adc r9, r5, r9\n\t" + "str r11, [sp, #40]\n\t" + "# A[4] * A[7]\n\t" + "ldr r6, [%[a], #16]\n\t" + "ldr r8, [%[a], #28]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r14, r3, r14\n\t" + "adcs r9, r4, r9\n\t" + "adc r10, r5, #0\n\t" + "# A[5] * A[6]\n\t" + "ldr r6, [%[a], #20]\n\t" + "ldr r8, [%[a], #24]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r14, r3, r14\n\t" + "adcs r9, r4, r9\n\t" + "adc r10, r5, r10\n\t" + "str r14, [sp, #44]\n\t" + "# A[5] * A[7]\n\t" + "ldr r6, [%[a], #20]\n\t" + "ldr r8, [%[a], #28]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r9, r3, r9\n\t" + "adcs r10, r4, r10\n\t" + "adc r11, r5, #0\n\t" + "str r9, [sp, #48]\n\t" + "# A[6] * A[7]\n\t" + "ldr r6, [%[a], #24]\n\t" + "ldr r8, [%[a], #28]\n\t" + "umull r3, r4, r6, r8\n\t" + "adds r10, r3, r10\n\t" + "adc r11, r4, r11\n\t" + "str r10, [sp, #52]\n\t" + "str r11, [sp, #56]\n\t" + "# Double\n\t" + "ldr r4, [sp, #4]\n\t" + "ldr r6, [sp, #8]\n\t" + "ldr r8, [sp, #12]\n\t" + "ldr r9, [sp, #16]\n\t" + "ldr r10, [sp, #20]\n\t" + "ldr r11, [sp, #24]\n\t" + "ldr r14, [sp, #28]\n\t" + "ldr r12, [sp, #32]\n\t" + "ldr r3, [sp, #36]\n\t" + "adds r4, r4, r4\n\t" + "adcs r6, r6, r6\n\t" + "adcs r8, r8, r8\n\t" + "adcs r9, r9, r9\n\t" + "adcs r10, r10, r10\n\t" + "adcs r11, r11, r11\n\t" + "adcs r14, r14, r14\n\t" + "adcs r12, r12, r12\n\t" + "adcs r3, r3, r3\n\t" + "str r4, [sp, #4]\n\t" + "str r6, [sp, #8]\n\t" + "str r8, [sp, #12]\n\t" + "str r9, [sp, #16]\n\t" + "str r10, [sp, #20]\n\t" + "str r11, [sp, #24]\n\t" + "str r14, [sp, #28]\n\t" + "str r12, [sp, #32]\n\t" + "str r3, [sp, #36]\n\t" + "ldr r4, [sp, #40]\n\t" + "ldr r6, [sp, #44]\n\t" + "ldr r8, [sp, #48]\n\t" + "ldr r9, [sp, #52]\n\t" + "ldr r10, [sp, #56]\n\t" + "adcs r4, r4, r4\n\t" + "adcs r6, r6, r6\n\t" + "adcs r8, r8, r8\n\t" + "adcs r9, r9, r9\n\t" + "adcs r10, r10, r10\n\t" + "str r4, [sp, #40]\n\t" + "str r6, [sp, #44]\n\t" + "str r8, [sp, #48]\n\t" + "str r9, [sp, #52]\n\t" + "str r10, [sp, #56]\n\t" + "adc r11, r5, #0\n\t" + "str r11, [sp, #60]\n\t" + "ldr r4, [sp, #4]\n\t" + "ldr r5, [sp, #8]\n\t" + "ldr r12, [sp, #12]\n\t" + "# A[0] * A[0]\n\t" + "ldr r6, [%[a], #0]\n\t" + "umull r9, r10, r6, r6\n\t" + "# A[1] * A[1]\n\t" + "ldr r6, [%[a], #4]\n\t" + "umull r11, r14, r6, r6\n\t" + "adds r10, r10, r4\n\t" + "adcs r11, r11, r5\n\t" + "adcs r14, r14, r12\n\t" + "str r9, [sp, #0]\n\t" + "str r10, [sp, #4]\n\t" + "str r11, [sp, #8]\n\t" + "str r14, [sp, #12]\n\t" + "ldr r3, [sp, #16]\n\t" + "ldr r4, [sp, #20]\n\t" + "ldr r5, [sp, #24]\n\t" + "ldr r12, [sp, #28]\n\t" + "# A[2] * A[2]\n\t" + "ldr r6, [%[a], #8]\n\t" + "umull r9, r10, r6, r6\n\t" + "# A[3] * A[3]\n\t" + "ldr r6, [%[a], #12]\n\t" + "umull r11, r14, r6, r6\n\t" + "adcs r9, r9, r3\n\t" + "adcs r10, r10, r4\n\t" + "adcs r11, r11, r5\n\t" + "adcs r14, r14, r12\n\t" + "str r9, [sp, #16]\n\t" + "str r10, [sp, #20]\n\t" + "str r11, [sp, #24]\n\t" + "str r14, [sp, #28]\n\t" + "ldr r3, [sp, #32]\n\t" + "ldr r4, [sp, #36]\n\t" + "ldr r5, [sp, #40]\n\t" + "ldr r12, [sp, #44]\n\t" + "# A[4] * A[4]\n\t" + "ldr r6, [%[a], #16]\n\t" + "umull r9, r10, r6, r6\n\t" + "# A[5] * A[5]\n\t" + "ldr r6, [%[a], #20]\n\t" + "umull r11, r14, r6, r6\n\t" + "adcs r9, r9, r3\n\t" + "adcs r10, r10, r4\n\t" + "adcs r11, r11, r5\n\t" + "adcs r14, r14, r12\n\t" + "str r9, [sp, #32]\n\t" + "str r10, [sp, #36]\n\t" + "str r11, [sp, #40]\n\t" + "str r14, [sp, #44]\n\t" + "ldr r3, [sp, #48]\n\t" + "ldr r4, [sp, #52]\n\t" + "ldr r5, [sp, #56]\n\t" + "ldr r12, [sp, #60]\n\t" + "# A[6] * A[6]\n\t" + "ldr r6, [%[a], #24]\n\t" + "umull r9, r10, r6, r6\n\t" + "# A[7] * A[7]\n\t" + "ldr r6, [%[a], #28]\n\t" + "umull r11, r14, r6, r6\n\t" + "adcs r9, r9, r3\n\t" + "adcs r10, r10, r4\n\t" + "adcs r11, r11, r5\n\t" + "adc r14, r14, r12\n\t" + "str r9, [sp, #48]\n\t" + "str r10, [sp, #52]\n\t" + "str r11, [sp, #56]\n\t" + "str r14, [sp, #60]\n\t" + "# Start Reduction\n\t" + "ldr r4, [sp, #0]\n\t" + "ldr r5, [sp, #4]\n\t" + "ldr r6, [sp, #8]\n\t" + "ldr r8, [sp, #12]\n\t" + "ldr r9, [sp, #16]\n\t" + "ldr r10, [sp, #20]\n\t" + "ldr r11, [sp, #24]\n\t" + "ldr r14, [sp, #28]\n\t" + "# mu = a[0]-a[7] + a[0]-a[4] << 96 + (a[0]-a[1] * 2) << 192\n\t" + "# - a[0] << 224\n\t" + "# + (a[0]-a[1] * 2) << (6 * 32)\n\t" + "adds r11, r11, r4\n\t" + "adc r14, r14, r5\n\t" + "adds r11, r11, r4\n\t" + "adc r14, r14, r5\n\t" + "# - a[0] << (7 * 32)\n\t" + "sub r14, r14, r4\n\t" + "# + a[0]-a[4] << (3 * 32)\n\t" + "mov %[a], r8\n\t" + "mov r12, r9\n\t" + "adds r8, r8, r4\n\t" + "adcs r9, r9, r5\n\t" + "adcs r10, r10, r6\n\t" + "adcs r11, r11, %[a]\n\t" + "adc r14, r14, r12\n\t" + "str r4, [sp, #0]\n\t" + "str r5, [sp, #4]\n\t" + "str r6, [sp, #8]\n\t" + "str r8, [sp, #12]\n\t" + "str r9, [sp, #16]\n\t" + "str r10, [sp, #20]\n\t" + "# a += mu * m\n\t" + "# += mu * ((1 << 256) - (1 << 224) + (1 << 192) + (1 << 96) - 1)\n\t" + "mov %[a], #0\n\t" + "# a[6] += t[0] + t[3]\n\t" + "ldr r3, [sp, #24]\n\t" + "adds r3, r3, r4\n\t" + "adc r12, %[a], #0\n\t" + "adds r3, r3, r8\n\t" + "adc r12, r12, #0\n\t" + "str r11, [sp, #24]\n\t" + "# a[7] += t[1] + t[4]\n\t" + "ldr r3, [sp, #28]\n\t" + "adds r3, r3, r12\n\t" + "adc r12, %[a], #0\n\t" + "adds r3, r3, r5\n\t" + "adc r12, r12, #0\n\t" + "adds r3, r3, r9\n\t" + "adc r12, r12, #0\n\t" + "str r14, [sp, #28]\n\t" + "str r3, [sp, #64]\n\t" + "# a[8] += t[0] + t[2] + t[5]\n\t" + "ldr r3, [sp, #32]\n\t" + "adds r3, r3, r12\n\t" + "adc r12, %[a], #0\n\t" + "adds r3, r3, r4\n\t" + "adc r12, r12, #0\n\t" + "adds r3, r3, r6\n\t" + "adc r12, r12, #0\n\t" + "adds r3, r3, r10\n\t" + "adc r12, r12, #0\n\t" + "str r3, [sp, #32]\n\t" + "# a[9] += t[1] + t[3] + t[6]\n\t" + "# a[10] += t[2] + t[4] + t[7]\n\t" + "ldr r3, [sp, #36]\n\t" + "ldr r4, [sp, #40]\n\t" + "adds r3, r3, r12\n\t" + "adcs r4, r4, #0\n\t" + "adc r12, %[a], #0\n\t" + "adds r3, r3, r5\n\t" + "adcs r4, r4, r6\n\t" + "adc r12, r12, #0\n\t" + "adds r3, r3, r8\n\t" + "adcs r4, r4, r9\n\t" + "adc r12, r12, #0\n\t" + "adds r3, r3, r11\n\t" + "adcs r4, r4, r14\n\t" + "adc r12, r12, #0\n\t" + "str r3, [sp, #36]\n\t" + "str r4, [sp, #40]\n\t" + "# a[11] += t[3] + t[5]\n\t" + "# a[12] += t[4] + t[6]\n\t" + "# a[13] += t[5] + t[7]\n\t" + "# a[14] += t[6]\n\t" + "ldr r3, [sp, #44]\n\t" + "ldr r4, [sp, #48]\n\t" + "ldr r5, [sp, #52]\n\t" + "ldr r6, [sp, #56]\n\t" + "adds r3, r3, r12\n\t" + "adcs r4, r4, #0\n\t" + "adcs r5, r5, #0\n\t" + "adcs r6, r6, #0\n\t" + "adc r12, %[a], #0\n\t" + "adds r3, r3, r8\n\t" + "adcs r4, r4, r9\n\t" + "adcs r5, r5, r10\n\t" + "adcs r6, r6, r11\n\t" + "adc r12, r12, #0\n\t" + "adds r3, r3, r10\n\t" + "adcs r4, r4, r11\n\t" + "adcs r5, r5, r14\n\t" + "adcs r6, r6, #0\n\t" + "adc r12, r12, #0\n\t" + "str r3, [sp, #44]\n\t" + "str r4, [sp, #48]\n\t" + "str r5, [sp, #52]\n\t" + "str r6, [sp, #56]\n\t" + "# a[15] += t[7]\n\t" + "ldr r3, [sp, #60]\n\t" + "adds r3, r3, r12\n\t" + "adc r12, %[a], #0\n\t" + "adds r3, r3, r14\n\t" + "adc r12, r12, #0\n\t" + "str r3, [sp, #60]\n\t" + "ldr r3, [sp, #64]\n\t" + "ldr r4, [sp, #32]\n\t" + "ldr r5, [sp, #36]\n\t" + "ldr r6, [sp, #40]\n\t" + "ldr r9, [sp, #0]\n\t" + "ldr r10, [sp, #4]\n\t" + "ldr r11, [sp, #8]\n\t" + "ldr r14, [sp, #12]\n\t" + "subs r3, r3, r9\n\t" + "sbcs r4, r4, r10\n\t" + "sbcs r5, r5, r11\n\t" + "sbcs r6, r6, r14\n\t" + "str r4, [sp, #32]\n\t" + "str r5, [sp, #36]\n\t" + "str r6, [sp, #40]\n\t" + "ldr r3, [sp, #44]\n\t" + "ldr r4, [sp, #48]\n\t" + "ldr r5, [sp, #52]\n\t" + "ldr r6, [sp, #56]\n\t" + "ldr r8, [sp, #60]\n\t" + "ldr r9, [sp, #16]\n\t" + "ldr r10, [sp, #20]\n\t" + "ldr r11, [sp, #24]\n\t" + "ldr r14, [sp, #28]\n\t" + "sbcs r3, r3, r9\n\t" + "sbcs r4, r4, r10\n\t" + "sbcs r5, r5, r11\n\t" + "sbcs r6, r6, r14\n\t" + "sbc r8, r8, #0\n\t" + "str r3, [sp, #44]\n\t" + "str r4, [sp, #48]\n\t" + "str r5, [sp, #52]\n\t" + "str r6, [sp, #56]\n\t" + "str r8, [sp, #60]\n\t" + "# mask m and sub from result if overflow\n\t" + "sub r12, %[a], r12\n\t" + "and %[a], r12, #1\n\t" + "ldr r3, [sp, #32]\n\t" + "ldr r4, [sp, #36]\n\t" + "ldr r5, [sp, #40]\n\t" + "ldr r6, [sp, #44]\n\t" + "ldr r8, [sp, #48]\n\t" + "ldr r9, [sp, #52]\n\t" + "ldr r10, [sp, #56]\n\t" + "ldr r11, [sp, #60]\n\t" + "subs r3, r3, r12\n\t" + "sbcs r4, r4, r12\n\t" + "sbcs r5, r5, r12\n\t" + "sbcs r6, r6, #0\n\t" + "sbcs r8, r8, #0\n\t" + "sbcs r9, r9, #0\n\t" + "sbcs r10, r10, %[a]\n\t" + "sbc r11, r11, r12\n\t" + "str r3, [%[r], #0]\n\t" + "str r4, [%[r], #4]\n\t" + "str r5, [%[r], #8]\n\t" + "str r6, [%[r], #12]\n\t" + "str r8, [%[r], #16]\n\t" + "str r9, [%[r], #20]\n\t" + "str r10, [%[r], #24]\n\t" + "str r11, [%[r], #28]\n\t" + "add sp, sp, #68\n\t" + : [a] "+r" (a) + : [r] "r" (r) + : "memory", "r9", "r10", "r11", "r14", "r3", "r4", "r5", "r6", "r8", "r12" + ); } #if !defined(WOLFSSL_SP_SMALL) || defined(HAVE_COMP_KEY) @@ -15334,6 +15534,257 @@ SP_NOINLINE static int32_t sp_256_cmp_8(const sp_digit* a, const sp_digit* b) */ #define sp_256_norm_8(a) +/* Conditionally subtract b from a using the mask m. + * m is -1 to subtract and 0 when not copying. + * + * r A single precision number representing condition subtract result. + * a A single precision number to subtract from. + * b A single precision number to subtract. + * m Mask value to apply. + */ +SP_NOINLINE static sp_digit sp_256_cond_sub_8(sp_digit* r, const sp_digit* a, + const sp_digit* b, sp_digit m) +{ + sp_digit c = 0; + + __asm__ __volatile__ ( + "mov r5, #32\n\t" + "mov r9, r5\n\t" + "mov r8, #0\n\t" + "\n1:\n\t" + "ldr r6, [%[b], r8]\n\t" + "and r6, r6, %[m]\n\t" + "mov r5, #0\n\t" + "subs r5, r5, %[c]\n\t" + "ldr r5, [%[a], r8]\n\t" + "sbcs r5, r5, r6\n\t" + "sbcs %[c], %[c], %[c]\n\t" + "str r5, [%[r], r8]\n\t" + "add r8, r8, #4\n\t" + "cmp r8, r9\n\t" + "blt 1b\n\t" + : [c] "+r" (c) + : [r] "r" (r), [a] "r" (a), [b] "r" (b), [m] "r" (m) + : "memory", "r5", "r6", "r8", "r9" + ); + + return c; +} + +/* Reduce the number back to 256 bits using Montgomery reduction. + * + * a A single precision number to reduce in place. + * m The single precision number representing the modulus. + * mp The digit representing the negative inverse of m mod 2^n. + */ +SP_NOINLINE static void sp_256_mont_reduce_8(sp_digit* a, const sp_digit* m, + sp_digit mp) +{ + (void)mp; + (void)m; + + __asm__ __volatile__ ( + "mov r2, #0\n\t" + "mov r1, #0\n\t" + /* i = 0 */ + "mov r9, r2\n\t" + "\n1:\n\t" + "mov r4, #0\n\t" + /* mu = a[i] * 1 (mp) = a[i] */ + "ldr r3, [%[a]]\n\t" + /* a[i] += -1 * mu = -1 * a[i] => a[i] = 0 no carry */ + /* a[i+1] += -1 * mu */ + "ldr r6, [%[a], #4]\n\t" + "mov r5, #0\n\t" + "adds r4, r4, r6\n\t" + "adc r5, r5, r2\n\t" + "str r4, [%[a], #4]\n\t" + /* a[i+2] += -1 * mu */ + "ldr r6, [%[a], #8]\n\t" + "mov r4, #0\n\t" + "adds r5, r5, r6\n\t" + "adc r4, r4, r2\n\t" + "str r5, [%[a], #8]\n\t" + /* a[i+3] += 0 * mu */ + "ldr r6, [%[a], #12]\n\t" + "mov r5, #0\n\t" + "adds r4, r4, r3\n\t" + "adc r5, r5, r2\n\t" + "adds r4, r4, r6\n\t" + "adc r5, r5, r2\n\t" + "str r4, [%[a], #12]\n\t" + /* a[i+4] += 0 * mu */ + "ldr r6, [%[a], #16]\n\t" + "mov r4, #0\n\t" + "adds r5, r5, r6\n\t" + "adc r4, r4, r2\n\t" + "str r5, [%[a], #16]\n\t" + /* a[i+5] += 0 * mu */ + "ldr r6, [%[a], #20]\n\t" + "mov r5, #0\n\t" + "adds r4, r4, r6\n\t" + "adc r5, r5, r2\n\t" + "str r4, [%[a], #20]\n\t" + /* a[i+6] += 1 * mu */ + "ldr r6, [%[a], #24]\n\t" + "mov r4, #0\n\t" + "adds r5, r5, r3\n\t" + "adc r4, r4, r2\n\t" + "adds r5, r5, r6\n\t" + "adc r4, r4, r2\n\t" + "str r5, [%[a], #24]\n\t" + /* a[i+7] += -1 * mu */ + "ldr r6, [%[a], #28]\n\t" + "ldr r8, [%[a], #32]\n\t" + "adds r5, r1, r3\n\t" + "mov r1, #0\n\t" + "adc r1, r1, r2\n\t" + "subs r4, r4, r3\n\t" + "sbcs r5, r5, r2\n\t" + "sbc r1, r1, r2\n\t" + "adds r4, r4, r6\n\t" + "adcs r5, r5, r8\n\t" + "adc r1, r1, r2\n\t" + "str r4, [%[a], #28]\n\t" + "str r5, [%[a], #32]\n\t" + /* i += 1 */ + "add r9, r9, #1\n\t" + "add %[a], %[a], #4\n\t" + "mov r6, #8\n\t" + "cmp r9, r6\n\t" + "blt 1b\n\t" + "sub %[a], %[a], #32\n\t" + "mov r3, r1\n\t" + "sub r1, r1, #1\n\t" + "mvn r1, r1\n\t" + "ldr r4, [%[a],#32]\n\t" + "ldr r5, [%[a],#36]\n\t" + "ldr r6, [%[a],#40]\n\t" + "ldr r8, [%[a],#44]\n\t" + "ldr r9, [%[a],#48]\n\t" + "ldr r10, [%[a],#52]\n\t" + "ldr r11, [%[a],#56]\n\t" + "ldr r14, [%[a],#60]\n\t" + "subs r4, r4, r1\n\t" + "sbcs r5, r5, r1\n\t" + "sbcs r6, r6, r1\n\t" + "sbcs r8, r8, r2\n\t" + "sbcs r9, r9, r2\n\t" + "sbcs r10, r10, r2\n\t" + "sbcs r11, r11, r3\n\t" + "sbc r14, r14, r1\n\t" + "str r4, [%[a],#0]\n\t" + "str r5, [%[a],#4]\n\t" + "str r6, [%[a],#8]\n\t" + "str r8, [%[a],#12]\n\t" + "str r9, [%[a],#16]\n\t" + "str r10, [%[a],#20]\n\t" + "str r11, [%[a],#24]\n\t" + "str r14, [%[a],#28]\n\t" + : [a] "+r" (a) + : + : "memory", "r1", "r2", "r3", "r4", "r5", "r6", "r8", "r9", "r10", "r11", "r14" + ); + + + (void)m; + (void)mp; +} + +/* Reduce the number back to 256 bits using Montgomery reduction. + * + * a A single precision number to reduce in place. + * m The single precision number representing the modulus. + * mp The digit representing the negative inverse of m mod 2^n. + */ +SP_NOINLINE static void sp_256_mont_reduce_order_8(sp_digit* a, const sp_digit* m, + sp_digit mp) +{ + sp_digit ca = 0; + + __asm__ __volatile__ ( + "mov r9, %[mp]\n\t" + "mov r12, %[m]\n\t" + "mov r10, %[a]\n\t" + "mov r4, #0\n\t" + "add r11, r10, #32\n\t" + "\n1:\n\t" + /* mu = a[i] * mp */ + "mov %[mp], r9\n\t" + "ldr %[a], [r10]\n\t" + "mul %[mp], %[mp], %[a]\n\t" + "mov %[m], r12\n\t" + "add r14, r10, #24\n\t" + "\n2:\n\t" + /* a[i+j] += m[j] * mu */ + "ldr %[a], [r10]\n\t" + "mov r5, #0\n\t" + /* Multiply m[j] and mu - Start */ + "ldr r8, [%[m]], #4\n\t" + "umull r6, r8, %[mp], r8\n\t" + "adds %[a], %[a], r6\n\t" + "adc r5, r5, r8\n\t" + /* Multiply m[j] and mu - Done */ + "adds r4, r4, %[a]\n\t" + "adc r5, r5, #0\n\t" + "str r4, [r10], #4\n\t" + /* a[i+j+1] += m[j+1] * mu */ + "ldr %[a], [r10]\n\t" + "mov r4, #0\n\t" + /* Multiply m[j] and mu - Start */ + "ldr r8, [%[m]], #4\n\t" + "umull r6, r8, %[mp], r8\n\t" + "adds %[a], %[a], r6\n\t" + "adc r4, r4, r8\n\t" + /* Multiply m[j] and mu - Done */ + "adds r5, r5, %[a]\n\t" + "adc r4, r4, #0\n\t" + "str r5, [r10], #4\n\t" + "cmp r10, r14\n\t" + "blt 2b\n\t" + /* a[i+6] += m[6] * mu */ + "ldr %[a], [r10]\n\t" + "mov r5, #0\n\t" + /* Multiply m[j] and mu - Start */ + "ldr r8, [%[m]], #4\n\t" + "umull r6, r8, %[mp], r8\n\t" + "adds %[a], %[a], r6\n\t" + "adc r5, r5, r8\n\t" + /* Multiply m[j] and mu - Done */ + "adds r4, r4, %[a]\n\t" + "adc r5, r5, #0\n\t" + "str r4, [r10], #4\n\t" + /* a[i+7] += m[7] * mu */ + "mov r4, %[ca]\n\t" + "mov %[ca], #0\n\t" + /* Multiply m[7] and mu - Start */ + "ldr r8, [%[m]]\n\t" + "umull r6, r8, %[mp], r8\n\t" + "adds r5, r5, r6\n\t" + "adcs r4, r4, r8\n\t" + "adc %[ca], %[ca], #0\n\t" + /* Multiply m[7] and mu - Done */ + "ldr r6, [r10]\n\t" + "ldr r8, [r10, #4]\n\t" + "adds r6, r6, r5\n\t" + "adcs r8, r8, r4\n\t" + "adc %[ca], %[ca], #0\n\t" + "str r6, [r10]\n\t" + "str r8, [r10, #4]\n\t" + /* Next word in a */ + "sub r10, r10, #24\n\t" + "cmp r10, r11\n\t" + "blt 1b\n\t" + "mov %[a], r10\n\t" + "mov %[m], r12\n\t" + : [ca] "+r" (ca), [a] "+r" (a) + : [m] "r" (m), [mp] "r" (mp) + : "memory", "r4", "r5", "r6", "r8", "r9", "r10", "r11", "r12", "r14" + ); + + sp_256_cond_sub_8(a - 8, a, m, (sp_digit)0 - ca); +} + /* Map the Montgomery form projective coordinate point to an affine point. * * r Resulting affine coordinate point. @@ -15471,71 +15922,61 @@ SP_NOINLINE static void sp_256_mont_add_8(sp_digit* r, const sp_digit* a, const (void)m; __asm__ __volatile__ ( - "mov r3, #0\n\t" - "ldr r4, [%[a],#0]\n\t" - "ldr r5, [%[a],#4]\n\t" - "ldr r6, [%[b],#0]\n\t" - "ldr r8, [%[b],#4]\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "str r4, [%[r],#0]\n\t" - "str r5, [%[r],#4]\n\t" - "ldr r4, [%[a],#8]\n\t" - "ldr r5, [%[a],#12]\n\t" - "ldr r6, [%[b],#8]\n\t" - "ldr r8, [%[b],#12]\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "str r4, [%[r],#8]\n\t" - "str r5, [%[r],#12]\n\t" - "ldr r4, [%[a],#16]\n\t" - "ldr r5, [%[a],#20]\n\t" - "ldr r6, [%[b],#16]\n\t" - "ldr r8, [%[b],#20]\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "mov r9, r4\n\t" - "mov r10, r5\n\t" - "ldr r4, [%[a],#24]\n\t" - "ldr r5, [%[a],#28]\n\t" - "ldr r6, [%[b],#24]\n\t" - "ldr r8, [%[b],#28]\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "mov r11, r4\n\t" - "mov r12, r5\n\t" - "adc r3, r3, r3\n\t" - "mov r6, r3\n\t" - "sub r3, r3, #1\n\t" - "mvn r3, r3\n\t" - "mov r8, #0\n\t" - "ldr r4, [%[r],#0]\n\t" - "ldr r5, [%[r],#4]\n\t" - "subs r4, r4, r3\n\t" - "sbcs r5, r5, r3\n\t" - "str r4, [%[r],#0]\n\t" - "str r5, [%[r],#4]\n\t" - "ldr r4, [%[r],#8]\n\t" - "ldr r5, [%[r],#12]\n\t" - "sbcs r4, r4, r3\n\t" - "sbcs r5, r5, r8\n\t" - "str r4, [%[r],#8]\n\t" - "str r5, [%[r],#12]\n\t" - "mov r4, r9\n\t" - "mov r5, r10\n\t" - "sbcs r4, r4, r8\n\t" - "sbcs r5, r5, r8\n\t" - "str r4, [%[r],#16]\n\t" - "str r5, [%[r],#20]\n\t" - "mov r4, r11\n\t" - "mov r5, r12\n\t" - "sbcs r4, r4, r6\n\t" - "sbc r5, r5, r3\n\t" - "str r4, [%[r],#24]\n\t" - "str r5, [%[r],#28]\n\t" + "mov r12, #0\n\t" + "ldr r4, [%[a],#0]\n\t" + "ldr r5, [%[a],#4]\n\t" + "ldr r6, [%[a],#8]\n\t" + "ldr r8, [%[a],#12]\n\t" + "ldr r9, [%[b],#0]\n\t" + "ldr r10, [%[b],#4]\n\t" + "ldr r11, [%[b],#8]\n\t" + "ldr r14, [%[b],#12]\n\t" + "adds r4, r4, r9\n\t" + "adcs r5, r5, r10\n\t" + "adcs r6, r6, r11\n\t" + "adcs r8, r8, r14\n\t" + "str r4, [%[r],#0]\n\t" + "str r5, [%[r],#4]\n\t" + "str r6, [%[r],#8]\n\t" + "str r8, [%[r],#12]\n\t" + "ldr r4, [%[a],#16]\n\t" + "ldr r5, [%[a],#20]\n\t" + "ldr r6, [%[a],#24]\n\t" + "ldr r8, [%[a],#28]\n\t" + "ldr r9, [%[b],#16]\n\t" + "ldr r10, [%[b],#20]\n\t" + "ldr r11, [%[b],#24]\n\t" + "ldr r14, [%[b],#28]\n\t" + "adcs r4, r4, r9\n\t" + "adcs r5, r5, r10\n\t" + "adcs r6, r6, r11\n\t" + "adcs r8, r8, r14\n\t" + "adc r3, r12, #0\n\t" + "sub r3, r12, r3\n\t" + "and r12, r3, #1\n\t" + "ldr r9, [%[r],#0]\n\t" + "ldr r10, [%[r],#4]\n\t" + "ldr r11, [%[r],#8]\n\t" + "ldr r14, [%[r],#12]\n\t" + "subs r9, r9, r3\n\t" + "sbcs r10, r10, r3\n\t" + "sbcs r11, r11, r3\n\t" + "sbcs r14, r14, #0\n\t" + "sbcs r4, r4, #0\n\t" + "sbcs r5, r5, #0\n\t" + "sbcs r6, r6, r12\n\t" + "sbc r8, r8, r3\n\t" + "str r9, [%[r],#0]\n\t" + "str r10, [%[r],#4]\n\t" + "str r11, [%[r],#8]\n\t" + "str r14, [%[r],#12]\n\t" + "str r4, [%[r],#16]\n\t" + "str r5, [%[r],#20]\n\t" + "str r6, [%[r],#24]\n\t" + "str r8, [%[r],#28]\n\t" : : [r] "r" (r), [a] "r" (a), [b] "r" (b) - : "memory", "r3", "r4", "r5", "r6", "r8", "r9", "r10", "r11", "r12" + : "memory", "r4", "r5", "r6", "r8", "r9", "r10", "r11", "r14", "r3", "r12" ); } @@ -15550,63 +15991,45 @@ SP_NOINLINE static void sp_256_mont_dbl_8(sp_digit* r, const sp_digit* a, const (void)m; __asm__ __volatile__ ( - "ldr r4, [%[a],#0]\n\t" - "ldr r5, [%[a],#4]\n\t" - "ldr r6, [%[a],#8]\n\t" - "ldr r8, [%[a],#12]\n\t" - "adds r4, r4, r4\n\t" - "adcs r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adcs r8, r8, r8\n\t" - "str r4, [%[r],#0]\n\t" - "str r5, [%[r],#4]\n\t" - "str r6, [%[r],#8]\n\t" - "str r8, [%[r],#12]\n\t" - "ldr r4, [%[a],#16]\n\t" - "ldr r5, [%[a],#20]\n\t" - "ldr r6, [%[a],#24]\n\t" - "ldr r8, [%[a],#28]\n\t" - "adcs r4, r4, r4\n\t" - "adcs r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adcs r8, r8, r8\n\t" - "mov r9, r4\n\t" - "mov r10, r5\n\t" - "mov r11, r6\n\t" - "mov r12, r8\n\t" - "mov r3, #0\n\t" - "mov r8, #0\n\t" - "adc r3, r3, r3\n\t" - "mov r2, r3\n\t" - "sub r3, r3, #1\n\t" - "mvn r3, r3\n\t" - "ldr r4, [%[r],#0]\n\t" - "ldr r5, [%[r],#4]\n\t" - "ldr r6, [%[r],#8]\n\t" - "subs r4, r4, r3\n\t" - "sbcs r5, r5, r3\n\t" - "sbcs r6, r6, r3\n\t" - "str r4, [%[r],#0]\n\t" - "str r5, [%[r],#4]\n\t" - "str r6, [%[r],#8]\n\t" - "ldr r4, [%[r],#12]\n\t" - "mov r5, r9\n\t" - "mov r6, r10\n\t" - "sbcs r4, r4, r8\n\t" - "sbcs r5, r5, r8\n\t" - "sbcs r6, r6, r8\n\t" - "str r4, [%[r],#12]\n\t" - "str r5, [%[r],#16]\n\t" - "str r6, [%[r],#20]\n\t" - "mov r4, r11\n\t" - "mov r5, r12\n\t" - "sbcs r4, r4, r2\n\t" - "sbc r5, r5, r3\n\t" - "str r4, [%[r],#24]\n\t" - "str r5, [%[r],#28]\n\t" + "mov r12, #0\n\t" + "ldr r4, [%[a],#0]\n\t" + "ldr r5, [%[a],#4]\n\t" + "ldr r6, [%[a],#8]\n\t" + "ldr r8, [%[a],#12]\n\t" + "ldr r9, [%[a],#16]\n\t" + "ldr r10, [%[a],#20]\n\t" + "ldr r11, [%[a],#24]\n\t" + "ldr r14, [%[a],#28]\n\t" + "adds r4, r4, r4\n\t" + "adcs r5, r5, r5\n\t" + "adcs r6, r6, r6\n\t" + "adcs r8, r8, r8\n\t" + "adcs r9, r9, r9\n\t" + "adcs r10, r10, r10\n\t" + "adcs r11, r11, r11\n\t" + "adcs r14, r14, r14\n\t" + "adc r3, r12, #0\n\t" + "sub r3, r12, r3\n\t" + "and r12, r3, #1\n\t" + "subs r4, r4, r3\n\t" + "sbcs r5, r5, r3\n\t" + "sbcs r6, r6, r3\n\t" + "sbcs r8, r8, #0\n\t" + "sbcs r9, r9, #0\n\t" + "sbcs r10, r10, #0\n\t" + "sbcs r11, r11, r12\n\t" + "sbc r14, r14, r3\n\t" + "str r4, [%[r],#0]\n\t" + "str r5, [%[r],#4]\n\t" + "str r6, [%[r],#8]\n\t" + "str r8, [%[r],#12]\n\t" + "str r9, [%[r],#16]\n\t" + "str r10, [%[r],#20]\n\t" + "str r11, [%[r],#24]\n\t" + "str r14, [%[r],#28]\n\t" : : [r] "r" (r), [a] "r" (a) - : "memory", "r3", "r2", "r4", "r5", "r6", "r8", "r9", "r10", "r11", "r12" + : "memory", "r4", "r5", "r6", "r8", "r9", "r10", "r11", "r14", "r3", "r12" ); } @@ -15708,68 +16131,60 @@ SP_NOINLINE static void sp_256_mont_sub_8(sp_digit* r, const sp_digit* a, const (void)m; __asm__ __volatile__ ( - "ldr r4, [%[a],#0]\n\t" - "ldr r5, [%[a],#4]\n\t" - "ldr r6, [%[b],#0]\n\t" - "ldr r8, [%[b],#4]\n\t" - "subs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "str r4, [%[r],#0]\n\t" - "str r5, [%[r],#4]\n\t" - "ldr r4, [%[a],#8]\n\t" - "ldr r5, [%[a],#12]\n\t" - "ldr r6, [%[b],#8]\n\t" - "ldr r8, [%[b],#12]\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "str r4, [%[r],#8]\n\t" - "str r5, [%[r],#12]\n\t" - "ldr r4, [%[a],#16]\n\t" - "ldr r5, [%[a],#20]\n\t" - "ldr r6, [%[b],#16]\n\t" - "ldr r8, [%[b],#20]\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "mov r9, r4\n\t" - "mov r10, r5\n\t" - "ldr r4, [%[a],#24]\n\t" - "ldr r5, [%[a],#28]\n\t" - "ldr r6, [%[b],#24]\n\t" - "ldr r8, [%[b],#28]\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "mov r11, r4\n\t" - "mov r12, r5\n\t" - "sbc r3, r3, r3\n\t" - "lsr r8, r3, #31\n\t" - "mov r6, #0\n\t" - "ldr r4, [%[r],#0]\n\t" - "ldr r5, [%[r],#4]\n\t" - "adds r4, r4, r3\n\t" - "adcs r5, r5, r3\n\t" - "str r4, [%[r],#0]\n\t" - "str r5, [%[r],#4]\n\t" - "ldr r4, [%[r],#8]\n\t" - "ldr r5, [%[r],#12]\n\t" - "adcs r4, r4, r3\n\t" - "adcs r5, r5, r6\n\t" - "str r4, [%[r],#8]\n\t" - "str r5, [%[r],#12]\n\t" - "mov r4, r9\n\t" - "mov r5, r10\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r6\n\t" - "str r4, [%[r],#16]\n\t" - "str r5, [%[r],#20]\n\t" - "mov r4, r11\n\t" - "mov r5, r12\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, r3\n\t" - "str r4, [%[r],#24]\n\t" - "str r5, [%[r],#28]\n\t" + "mov r12, #0\n\t" + "ldr r4, [%[a],#0]\n\t" + "ldr r5, [%[a],#4]\n\t" + "ldr r6, [%[a],#8]\n\t" + "ldr r8, [%[a],#12]\n\t" + "ldr r9, [%[b],#0]\n\t" + "ldr r10, [%[b],#4]\n\t" + "ldr r11, [%[b],#8]\n\t" + "ldr r14, [%[b],#12]\n\t" + "subs r4, r4, r9\n\t" + "sbcs r5, r5, r10\n\t" + "sbcs r6, r6, r11\n\t" + "sbcs r8, r8, r14\n\t" + "str r4, [%[r],#0]\n\t" + "str r5, [%[r],#4]\n\t" + "str r6, [%[r],#8]\n\t" + "str r8, [%[r],#12]\n\t" + "ldr r4, [%[a],#16]\n\t" + "ldr r5, [%[a],#20]\n\t" + "ldr r6, [%[a],#24]\n\t" + "ldr r8, [%[a],#28]\n\t" + "ldr r9, [%[b],#16]\n\t" + "ldr r10, [%[b],#20]\n\t" + "ldr r11, [%[b],#24]\n\t" + "ldr r14, [%[b],#28]\n\t" + "sbcs r4, r4, r9\n\t" + "sbcs r5, r5, r10\n\t" + "sbcs r6, r6, r11\n\t" + "sbcs r8, r8, r14\n\t" + "sbc r3, r12, #0\n\t" + "and r12, r3, #1\n\t" + "ldr r9, [%[r],#0]\n\t" + "ldr r10, [%[r],#4]\n\t" + "ldr r11, [%[r],#8]\n\t" + "ldr r14, [%[r],#12]\n\t" + "adds r9, r9, r3\n\t" + "adcs r10, r10, r3\n\t" + "adcs r11, r11, r3\n\t" + "adcs r14, r14, #0\n\t" + "adcs r4, r4, #0\n\t" + "adcs r5, r5, #0\n\t" + "adcs r6, r6, r12\n\t" + "adc r8, r8, r3\n\t" + "str r9, [%[r],#0]\n\t" + "str r10, [%[r],#4]\n\t" + "str r11, [%[r],#8]\n\t" + "str r14, [%[r],#12]\n\t" + "str r4, [%[r],#16]\n\t" + "str r5, [%[r],#20]\n\t" + "str r6, [%[r],#24]\n\t" + "str r8, [%[r],#28]\n\t" : : [r] "r" (r), [a] "r" (a), [b] "r" (b) - : "memory", "r3", "r4", "r5", "r6", "r8", "r9", "r10", "r11", "r12" + : "memory", "r4", "r5", "r6", "r8", "r9", "r10", "r11", "r14", "r3", "r12" ); } @@ -18842,6 +19257,514 @@ int sp_ecc_secret_gen_256(mp_int* priv, ecc_point* pub, byte* out, #endif /* HAVE_ECC_DHE */ #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY) +/* Multiply a and b into r. (r = a * b) + * + * r A single precision integer. + * a A single precision integer. + * b A single precision integer. + */ +SP_NOINLINE static void sp_256_mul_8(sp_digit* r, const sp_digit* a, + const sp_digit* b) +{ + sp_digit tmp[8]; + + __asm__ __volatile__ ( + /* A[0] * B[0] */ + "ldr r6, [%[a], #0]\n\t" + "ldr r8, [%[b], #0]\n\t" + "umull r3, r4, r6, r8\n\t" + "mov r5, #0\n\t" + "str r3, [%[tmp], #0]\n\t" + "mov r3, #0\n\t" + /* A[0] * B[1] */ + "ldr r8, [%[b], #4]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r4, r4, r6\n\t" + "adc r5, r5, r8\n\t" + /* A[1] * B[0] */ + "ldr r6, [%[a], #4]\n\t" + "ldr r8, [%[b], #0]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r4, r4, r6\n\t" + "adcs r5, r5, r8\n\t" + "adc r3, r3, #0\n\t" + "str r4, [%[tmp], #4]\n\t" + "mov r4, #0\n\t" + /* A[0] * B[2] */ + "ldr r6, [%[a], #0]\n\t" + "ldr r8, [%[b], #8]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r5, r5, r6\n\t" + "adcs r3, r3, r8\n\t" + "adc r4, r4, #0\n\t" + /* A[1] * B[1] */ + "ldr r6, [%[a], #4]\n\t" + "ldr r8, [%[b], #4]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r5, r5, r6\n\t" + "adcs r3, r3, r8\n\t" + "adc r4, r4, #0\n\t" + /* A[2] * B[0] */ + "ldr r6, [%[a], #8]\n\t" + "ldr r8, [%[b], #0]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r5, r5, r6\n\t" + "adcs r3, r3, r8\n\t" + "adc r4, r4, #0\n\t" + "str r5, [%[tmp], #8]\n\t" + "mov r5, #0\n\t" + /* A[0] * B[3] */ + "ldr r6, [%[a], #0]\n\t" + "ldr r8, [%[b], #12]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r3, r3, r6\n\t" + "adcs r4, r4, r8\n\t" + "adc r5, r5, #0\n\t" + /* A[1] * B[2] */ + "ldr r6, [%[a], #4]\n\t" + "ldr r8, [%[b], #8]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r3, r3, r6\n\t" + "adcs r4, r4, r8\n\t" + "adc r5, r5, #0\n\t" + /* A[2] * B[1] */ + "ldr r6, [%[a], #8]\n\t" + "ldr r8, [%[b], #4]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r3, r3, r6\n\t" + "adcs r4, r4, r8\n\t" + "adc r5, r5, #0\n\t" + /* A[3] * B[0] */ + "ldr r6, [%[a], #12]\n\t" + "ldr r8, [%[b], #0]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r3, r3, r6\n\t" + "adcs r4, r4, r8\n\t" + "adc r5, r5, #0\n\t" + "str r3, [%[tmp], #12]\n\t" + "mov r3, #0\n\t" + /* A[0] * B[4] */ + "ldr r6, [%[a], #0]\n\t" + "ldr r8, [%[b], #16]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r4, r4, r6\n\t" + "adcs r5, r5, r8\n\t" + "adc r3, r3, #0\n\t" + /* A[1] * B[3] */ + "ldr r6, [%[a], #4]\n\t" + "ldr r8, [%[b], #12]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r4, r4, r6\n\t" + "adcs r5, r5, r8\n\t" + "adc r3, r3, #0\n\t" + /* A[2] * B[2] */ + "ldr r6, [%[a], #8]\n\t" + "ldr r8, [%[b], #8]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r4, r4, r6\n\t" + "adcs r5, r5, r8\n\t" + "adc r3, r3, #0\n\t" + /* A[3] * B[1] */ + "ldr r6, [%[a], #12]\n\t" + "ldr r8, [%[b], #4]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r4, r4, r6\n\t" + "adcs r5, r5, r8\n\t" + "adc r3, r3, #0\n\t" + /* A[4] * B[0] */ + "ldr r6, [%[a], #16]\n\t" + "ldr r8, [%[b], #0]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r4, r4, r6\n\t" + "adcs r5, r5, r8\n\t" + "adc r3, r3, #0\n\t" + "str r4, [%[tmp], #16]\n\t" + "mov r4, #0\n\t" + /* A[0] * B[5] */ + "ldr r6, [%[a], #0]\n\t" + "ldr r8, [%[b], #20]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r5, r5, r6\n\t" + "adcs r3, r3, r8\n\t" + "adc r4, r4, #0\n\t" + /* A[1] * B[4] */ + "ldr r6, [%[a], #4]\n\t" + "ldr r8, [%[b], #16]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r5, r5, r6\n\t" + "adcs r3, r3, r8\n\t" + "adc r4, r4, #0\n\t" + /* A[2] * B[3] */ + "ldr r6, [%[a], #8]\n\t" + "ldr r8, [%[b], #12]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r5, r5, r6\n\t" + "adcs r3, r3, r8\n\t" + "adc r4, r4, #0\n\t" + /* A[3] * B[2] */ + "ldr r6, [%[a], #12]\n\t" + "ldr r8, [%[b], #8]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r5, r5, r6\n\t" + "adcs r3, r3, r8\n\t" + "adc r4, r4, #0\n\t" + /* A[4] * B[1] */ + "ldr r6, [%[a], #16]\n\t" + "ldr r8, [%[b], #4]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r5, r5, r6\n\t" + "adcs r3, r3, r8\n\t" + "adc r4, r4, #0\n\t" + /* A[5] * B[0] */ + "ldr r6, [%[a], #20]\n\t" + "ldr r8, [%[b], #0]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r5, r5, r6\n\t" + "adcs r3, r3, r8\n\t" + "adc r4, r4, #0\n\t" + "str r5, [%[tmp], #20]\n\t" + "mov r5, #0\n\t" + /* A[0] * B[6] */ + "ldr r6, [%[a], #0]\n\t" + "ldr r8, [%[b], #24]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r3, r3, r6\n\t" + "adcs r4, r4, r8\n\t" + "adc r5, r5, #0\n\t" + /* A[1] * B[5] */ + "ldr r6, [%[a], #4]\n\t" + "ldr r8, [%[b], #20]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r3, r3, r6\n\t" + "adcs r4, r4, r8\n\t" + "adc r5, r5, #0\n\t" + /* A[2] * B[4] */ + "ldr r6, [%[a], #8]\n\t" + "ldr r8, [%[b], #16]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r3, r3, r6\n\t" + "adcs r4, r4, r8\n\t" + "adc r5, r5, #0\n\t" + /* A[3] * B[3] */ + "ldr r6, [%[a], #12]\n\t" + "ldr r8, [%[b], #12]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r3, r3, r6\n\t" + "adcs r4, r4, r8\n\t" + "adc r5, r5, #0\n\t" + /* A[4] * B[2] */ + "ldr r6, [%[a], #16]\n\t" + "ldr r8, [%[b], #8]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r3, r3, r6\n\t" + "adcs r4, r4, r8\n\t" + "adc r5, r5, #0\n\t" + /* A[5] * B[1] */ + "ldr r6, [%[a], #20]\n\t" + "ldr r8, [%[b], #4]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r3, r3, r6\n\t" + "adcs r4, r4, r8\n\t" + "adc r5, r5, #0\n\t" + /* A[6] * B[0] */ + "ldr r6, [%[a], #24]\n\t" + "ldr r8, [%[b], #0]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r3, r3, r6\n\t" + "adcs r4, r4, r8\n\t" + "adc r5, r5, #0\n\t" + "str r3, [%[tmp], #24]\n\t" + "mov r3, #0\n\t" + /* A[0] * B[7] */ + "ldr r6, [%[a], #0]\n\t" + "ldr r8, [%[b], #28]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r4, r4, r6\n\t" + "adcs r5, r5, r8\n\t" + "adc r3, r3, #0\n\t" + /* A[1] * B[6] */ + "ldr r6, [%[a], #4]\n\t" + "ldr r8, [%[b], #24]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r4, r4, r6\n\t" + "adcs r5, r5, r8\n\t" + "adc r3, r3, #0\n\t" + /* A[2] * B[5] */ + "ldr r6, [%[a], #8]\n\t" + "ldr r8, [%[b], #20]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r4, r4, r6\n\t" + "adcs r5, r5, r8\n\t" + "adc r3, r3, #0\n\t" + /* A[3] * B[4] */ + "ldr r6, [%[a], #12]\n\t" + "ldr r8, [%[b], #16]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r4, r4, r6\n\t" + "adcs r5, r5, r8\n\t" + "adc r3, r3, #0\n\t" + /* A[4] * B[3] */ + "ldr r6, [%[a], #16]\n\t" + "ldr r8, [%[b], #12]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r4, r4, r6\n\t" + "adcs r5, r5, r8\n\t" + "adc r3, r3, #0\n\t" + /* A[5] * B[2] */ + "ldr r6, [%[a], #20]\n\t" + "ldr r8, [%[b], #8]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r4, r4, r6\n\t" + "adcs r5, r5, r8\n\t" + "adc r3, r3, #0\n\t" + /* A[6] * B[1] */ + "ldr r6, [%[a], #24]\n\t" + "ldr r8, [%[b], #4]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r4, r4, r6\n\t" + "adcs r5, r5, r8\n\t" + "adc r3, r3, #0\n\t" + /* A[7] * B[0] */ + "ldr r6, [%[a], #28]\n\t" + "ldr r8, [%[b], #0]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r4, r4, r6\n\t" + "adcs r5, r5, r8\n\t" + "adc r3, r3, #0\n\t" + "str r4, [%[tmp], #28]\n\t" + "mov r4, #0\n\t" + /* A[1] * B[7] */ + "ldr r6, [%[a], #4]\n\t" + "ldr r8, [%[b], #28]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r5, r5, r6\n\t" + "adcs r3, r3, r8\n\t" + "adc r4, r4, #0\n\t" + /* A[2] * B[6] */ + "ldr r6, [%[a], #8]\n\t" + "ldr r8, [%[b], #24]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r5, r5, r6\n\t" + "adcs r3, r3, r8\n\t" + "adc r4, r4, #0\n\t" + /* A[3] * B[5] */ + "ldr r6, [%[a], #12]\n\t" + "ldr r8, [%[b], #20]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r5, r5, r6\n\t" + "adcs r3, r3, r8\n\t" + "adc r4, r4, #0\n\t" + /* A[4] * B[4] */ + "ldr r6, [%[a], #16]\n\t" + "ldr r8, [%[b], #16]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r5, r5, r6\n\t" + "adcs r3, r3, r8\n\t" + "adc r4, r4, #0\n\t" + /* A[5] * B[3] */ + "ldr r6, [%[a], #20]\n\t" + "ldr r8, [%[b], #12]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r5, r5, r6\n\t" + "adcs r3, r3, r8\n\t" + "adc r4, r4, #0\n\t" + /* A[6] * B[2] */ + "ldr r6, [%[a], #24]\n\t" + "ldr r8, [%[b], #8]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r5, r5, r6\n\t" + "adcs r3, r3, r8\n\t" + "adc r4, r4, #0\n\t" + /* A[7] * B[1] */ + "ldr r6, [%[a], #28]\n\t" + "ldr r8, [%[b], #4]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r5, r5, r6\n\t" + "adcs r3, r3, r8\n\t" + "adc r4, r4, #0\n\t" + "str r5, [%[r], #32]\n\t" + "mov r5, #0\n\t" + /* A[2] * B[7] */ + "ldr r6, [%[a], #8]\n\t" + "ldr r8, [%[b], #28]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r3, r3, r6\n\t" + "adcs r4, r4, r8\n\t" + "adc r5, r5, #0\n\t" + /* A[3] * B[6] */ + "ldr r6, [%[a], #12]\n\t" + "ldr r8, [%[b], #24]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r3, r3, r6\n\t" + "adcs r4, r4, r8\n\t" + "adc r5, r5, #0\n\t" + /* A[4] * B[5] */ + "ldr r6, [%[a], #16]\n\t" + "ldr r8, [%[b], #20]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r3, r3, r6\n\t" + "adcs r4, r4, r8\n\t" + "adc r5, r5, #0\n\t" + /* A[5] * B[4] */ + "ldr r6, [%[a], #20]\n\t" + "ldr r8, [%[b], #16]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r3, r3, r6\n\t" + "adcs r4, r4, r8\n\t" + "adc r5, r5, #0\n\t" + /* A[6] * B[3] */ + "ldr r6, [%[a], #24]\n\t" + "ldr r8, [%[b], #12]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r3, r3, r6\n\t" + "adcs r4, r4, r8\n\t" + "adc r5, r5, #0\n\t" + /* A[7] * B[2] */ + "ldr r6, [%[a], #28]\n\t" + "ldr r8, [%[b], #8]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r3, r3, r6\n\t" + "adcs r4, r4, r8\n\t" + "adc r5, r5, #0\n\t" + "str r3, [%[r], #36]\n\t" + "mov r3, #0\n\t" + /* A[3] * B[7] */ + "ldr r6, [%[a], #12]\n\t" + "ldr r8, [%[b], #28]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r4, r4, r6\n\t" + "adcs r5, r5, r8\n\t" + "adc r3, r3, #0\n\t" + /* A[4] * B[6] */ + "ldr r6, [%[a], #16]\n\t" + "ldr r8, [%[b], #24]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r4, r4, r6\n\t" + "adcs r5, r5, r8\n\t" + "adc r3, r3, #0\n\t" + /* A[5] * B[5] */ + "ldr r6, [%[a], #20]\n\t" + "ldr r8, [%[b], #20]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r4, r4, r6\n\t" + "adcs r5, r5, r8\n\t" + "adc r3, r3, #0\n\t" + /* A[6] * B[4] */ + "ldr r6, [%[a], #24]\n\t" + "ldr r8, [%[b], #16]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r4, r4, r6\n\t" + "adcs r5, r5, r8\n\t" + "adc r3, r3, #0\n\t" + /* A[7] * B[3] */ + "ldr r6, [%[a], #28]\n\t" + "ldr r8, [%[b], #12]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r4, r4, r6\n\t" + "adcs r5, r5, r8\n\t" + "adc r3, r3, #0\n\t" + "str r4, [%[r], #40]\n\t" + "mov r4, #0\n\t" + /* A[4] * B[7] */ + "ldr r6, [%[a], #16]\n\t" + "ldr r8, [%[b], #28]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r5, r5, r6\n\t" + "adcs r3, r3, r8\n\t" + "adc r4, r4, #0\n\t" + /* A[5] * B[6] */ + "ldr r6, [%[a], #20]\n\t" + "ldr r8, [%[b], #24]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r5, r5, r6\n\t" + "adcs r3, r3, r8\n\t" + "adc r4, r4, #0\n\t" + /* A[6] * B[5] */ + "ldr r6, [%[a], #24]\n\t" + "ldr r8, [%[b], #20]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r5, r5, r6\n\t" + "adcs r3, r3, r8\n\t" + "adc r4, r4, #0\n\t" + /* A[7] * B[4] */ + "ldr r6, [%[a], #28]\n\t" + "ldr r8, [%[b], #16]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r5, r5, r6\n\t" + "adcs r3, r3, r8\n\t" + "adc r4, r4, #0\n\t" + "str r5, [%[r], #44]\n\t" + "mov r5, #0\n\t" + /* A[5] * B[7] */ + "ldr r6, [%[a], #20]\n\t" + "ldr r8, [%[b], #28]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r3, r3, r6\n\t" + "adcs r4, r4, r8\n\t" + "adc r5, r5, #0\n\t" + /* A[6] * B[6] */ + "ldr r6, [%[a], #24]\n\t" + "ldr r8, [%[b], #24]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r3, r3, r6\n\t" + "adcs r4, r4, r8\n\t" + "adc r5, r5, #0\n\t" + /* A[7] * B[5] */ + "ldr r6, [%[a], #28]\n\t" + "ldr r8, [%[b], #20]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r3, r3, r6\n\t" + "adcs r4, r4, r8\n\t" + "adc r5, r5, #0\n\t" + "str r3, [%[r], #48]\n\t" + "mov r3, #0\n\t" + /* A[6] * B[7] */ + "ldr r6, [%[a], #24]\n\t" + "ldr r8, [%[b], #28]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r4, r4, r6\n\t" + "adcs r5, r5, r8\n\t" + "adc r3, r3, #0\n\t" + /* A[7] * B[6] */ + "ldr r6, [%[a], #28]\n\t" + "ldr r8, [%[b], #24]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r4, r4, r6\n\t" + "adcs r5, r5, r8\n\t" + "adc r3, r3, #0\n\t" + "str r4, [%[r], #52]\n\t" + "mov r4, #0\n\t" + /* A[7] * B[7] */ + "ldr r6, [%[a], #28]\n\t" + "ldr r8, [%[b], #28]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r5, r5, r6\n\t" + "adc r3, r3, r8\n\t" + "str r5, [%[r], #56]\n\t" + "str r3, [%[r], #60]\n\t" + /* Transfer tmp to r */ + "ldr r3, [%[tmp], #0]\n\t" + "ldr r4, [%[tmp], #4]\n\t" + "ldr r5, [%[tmp], #8]\n\t" + "ldr r6, [%[tmp], #12]\n\t" + "str r3, [%[r], #0]\n\t" + "str r4, [%[r], #4]\n\t" + "str r5, [%[r], #8]\n\t" + "str r6, [%[r], #12]\n\t" + "ldr r3, [%[tmp], #16]\n\t" + "ldr r4, [%[tmp], #20]\n\t" + "ldr r5, [%[tmp], #24]\n\t" + "ldr r6, [%[tmp], #28]\n\t" + "str r3, [%[r], #16]\n\t" + "str r4, [%[r], #20]\n\t" + "str r5, [%[r], #24]\n\t" + "str r6, [%[r], #28]\n\t" + : + : [r] "r" (r), [a] "r" (a), [b] "r" (b), [tmp] "r" (tmp) + : "memory", "r3", "r4", "r5", "r6", "r8" + ); +} + #endif #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY) #ifdef WOLFSSL_SP_SMALL @@ -19092,6 +20015,356 @@ static WC_INLINE int sp_256_mod_8(sp_digit* r, const sp_digit* a, const sp_digit #endif #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY) +/* Square a and put result in r. (r = a * a) + * + * r A single precision integer. + * a A single precision integer. + */ +SP_NOINLINE static void sp_256_sqr_8(sp_digit* r, const sp_digit* a) +{ + sp_digit tmp[8]; + __asm__ __volatile__ ( + /* A[0] * A[0] */ + "ldr r6, [%[a], #0]\n\t" + "umull r3, r4, r6, r6\n\t" + "mov r5, #0\n\t" + "str r3, [%[tmp], #0]\n\t" + "mov r3, #0\n\t" + /* A[0] * A[1] */ + "ldr r8, [%[a], #4]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r4, r4, r6\n\t" + "adc r5, r5, r8\n\t" + "adds r4, r4, r6\n\t" + "adcs r5, r5, r8\n\t" + "adc r3, r3, #0\n\t" + "str r4, [%[tmp], #4]\n\t" + "mov r4, #0\n\t" + /* A[0] * A[2] */ + "ldr r6, [%[a], #0]\n\t" + "ldr r8, [%[a], #8]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r5, r5, r6\n\t" + "adc r3, r3, r8\n\t" + "adds r5, r5, r6\n\t" + "adcs r3, r3, r8\n\t" + "adc r4, r4, #0\n\t" + /* A[1] * A[1] */ + "ldr r6, [%[a], #4]\n\t" + "umull r6, r8, r6, r6\n\t" + "adds r5, r5, r6\n\t" + "adcs r3, r3, r8\n\t" + "adc r4, r4, #0\n\t" + "str r5, [%[tmp], #8]\n\t" + "mov r5, #0\n\t" + /* A[0] * A[3] */ + "ldr r6, [%[a], #0]\n\t" + "ldr r8, [%[a], #12]\n\t" + "umull r9, r10, r6, r8\n\t" + "mov r11, #0\n\t" + /* A[1] * A[2] */ + "ldr r6, [%[a], #4]\n\t" + "ldr r8, [%[a], #8]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r9, r9, r6\n\t" + "adcs r10, r10, r8\n\t" + "adc r11, r11, #0\n\t" + "adds r9, r9, r9\n\t" + "adcs r10, r10, r10\n\t" + "adc r11, r11, r11\n\t" + "adds r3, r3, r9\n\t" + "adcs r4, r4, r10\n\t" + "adc r5, r5, r11\n\t" + "str r3, [%[tmp], #12]\n\t" + "mov r3, #0\n\t" + /* A[0] * A[4] */ + "ldr r6, [%[a], #0]\n\t" + "ldr r8, [%[a], #16]\n\t" + "umull r9, r10, r6, r8\n\t" + "mov r11, #0\n\t" + /* A[1] * A[3] */ + "ldr r6, [%[a], #4]\n\t" + "ldr r8, [%[a], #12]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r9, r9, r6\n\t" + "adcs r10, r10, r8\n\t" + "adc r11, r11, #0\n\t" + /* A[2] * A[2] */ + "ldr r6, [%[a], #8]\n\t" + "umull r6, r8, r6, r6\n\t" + "adds r4, r4, r6\n\t" + "adcs r5, r5, r8\n\t" + "adc r3, r3, #0\n\t" + "adds r9, r9, r9\n\t" + "adcs r10, r10, r10\n\t" + "adc r11, r11, r11\n\t" + "adds r4, r4, r9\n\t" + "adcs r5, r5, r10\n\t" + "adc r3, r3, r11\n\t" + "str r4, [%[tmp], #16]\n\t" + "mov r4, #0\n\t" + /* A[0] * A[5] */ + "ldr r6, [%[a], #0]\n\t" + "ldr r8, [%[a], #20]\n\t" + "umull r9, r10, r6, r8\n\t" + "mov r11, #0\n\t" + /* A[1] * A[4] */ + "ldr r6, [%[a], #4]\n\t" + "ldr r8, [%[a], #16]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r9, r9, r6\n\t" + "adcs r10, r10, r8\n\t" + "adc r11, r11, #0\n\t" + /* A[2] * A[3] */ + "ldr r6, [%[a], #8]\n\t" + "ldr r8, [%[a], #12]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r9, r9, r6\n\t" + "adcs r10, r10, r8\n\t" + "adc r11, r11, #0\n\t" + "adds r9, r9, r9\n\t" + "adcs r10, r10, r10\n\t" + "adc r11, r11, r11\n\t" + "adds r5, r5, r9\n\t" + "adcs r3, r3, r10\n\t" + "adc r4, r4, r11\n\t" + "str r5, [%[tmp], #20]\n\t" + "mov r5, #0\n\t" + /* A[0] * A[6] */ + "ldr r6, [%[a], #0]\n\t" + "ldr r8, [%[a], #24]\n\t" + "umull r9, r10, r6, r8\n\t" + "mov r11, #0\n\t" + /* A[1] * A[5] */ + "ldr r6, [%[a], #4]\n\t" + "ldr r8, [%[a], #20]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r9, r9, r6\n\t" + "adcs r10, r10, r8\n\t" + "adc r11, r11, #0\n\t" + /* A[2] * A[4] */ + "ldr r6, [%[a], #8]\n\t" + "ldr r8, [%[a], #16]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r9, r9, r6\n\t" + "adcs r10, r10, r8\n\t" + "adc r11, r11, #0\n\t" + /* A[3] * A[3] */ + "ldr r6, [%[a], #12]\n\t" + "umull r6, r8, r6, r6\n\t" + "adds r3, r3, r6\n\t" + "adcs r4, r4, r8\n\t" + "adc r5, r5, #0\n\t" + "adds r9, r9, r9\n\t" + "adcs r10, r10, r10\n\t" + "adc r11, r11, r11\n\t" + "adds r3, r3, r9\n\t" + "adcs r4, r4, r10\n\t" + "adc r5, r5, r11\n\t" + "str r3, [%[tmp], #24]\n\t" + "mov r3, #0\n\t" + /* A[0] * A[7] */ + "ldr r6, [%[a], #0]\n\t" + "ldr r8, [%[a], #28]\n\t" + "umull r9, r10, r6, r8\n\t" + "mov r11, #0\n\t" + /* A[1] * A[6] */ + "ldr r6, [%[a], #4]\n\t" + "ldr r8, [%[a], #24]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r9, r9, r6\n\t" + "adcs r10, r10, r8\n\t" + "adc r11, r11, #0\n\t" + /* A[2] * A[5] */ + "ldr r6, [%[a], #8]\n\t" + "ldr r8, [%[a], #20]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r9, r9, r6\n\t" + "adcs r10, r10, r8\n\t" + "adc r11, r11, #0\n\t" + /* A[3] * A[4] */ + "ldr r6, [%[a], #12]\n\t" + "ldr r8, [%[a], #16]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r9, r9, r6\n\t" + "adcs r10, r10, r8\n\t" + "adc r11, r11, #0\n\t" + "adds r9, r9, r9\n\t" + "adcs r10, r10, r10\n\t" + "adc r11, r11, r11\n\t" + "adds r4, r4, r9\n\t" + "adcs r5, r5, r10\n\t" + "adc r3, r3, r11\n\t" + "str r4, [%[tmp], #28]\n\t" + "mov r4, #0\n\t" + /* A[1] * A[7] */ + "ldr r6, [%[a], #4]\n\t" + "ldr r8, [%[a], #28]\n\t" + "umull r9, r10, r6, r8\n\t" + "mov r11, #0\n\t" + /* A[2] * A[6] */ + "ldr r6, [%[a], #8]\n\t" + "ldr r8, [%[a], #24]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r9, r9, r6\n\t" + "adcs r10, r10, r8\n\t" + "adc r11, r11, #0\n\t" + /* A[3] * A[5] */ + "ldr r6, [%[a], #12]\n\t" + "ldr r8, [%[a], #20]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r9, r9, r6\n\t" + "adcs r10, r10, r8\n\t" + "adc r11, r11, #0\n\t" + /* A[4] * A[4] */ + "ldr r6, [%[a], #16]\n\t" + "umull r6, r8, r6, r6\n\t" + "adds r5, r5, r6\n\t" + "adcs r3, r3, r8\n\t" + "adc r4, r4, #0\n\t" + "adds r9, r9, r9\n\t" + "adcs r10, r10, r10\n\t" + "adc r11, r11, r11\n\t" + "adds r5, r5, r9\n\t" + "adcs r3, r3, r10\n\t" + "adc r4, r4, r11\n\t" + "str r5, [%[r], #32]\n\t" + "mov r5, #0\n\t" + /* A[2] * A[7] */ + "ldr r6, [%[a], #8]\n\t" + "ldr r8, [%[a], #28]\n\t" + "umull r9, r10, r6, r8\n\t" + "mov r11, #0\n\t" + /* A[3] * A[6] */ + "ldr r6, [%[a], #12]\n\t" + "ldr r8, [%[a], #24]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r9, r9, r6\n\t" + "adcs r10, r10, r8\n\t" + "adc r11, r11, #0\n\t" + /* A[4] * A[5] */ + "ldr r6, [%[a], #16]\n\t" + "ldr r8, [%[a], #20]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r9, r9, r6\n\t" + "adcs r10, r10, r8\n\t" + "adc r11, r11, #0\n\t" + "adds r9, r9, r9\n\t" + "adcs r10, r10, r10\n\t" + "adc r11, r11, r11\n\t" + "adds r3, r3, r9\n\t" + "adcs r4, r4, r10\n\t" + "adc r5, r5, r11\n\t" + "str r3, [%[r], #36]\n\t" + "mov r3, #0\n\t" + /* A[3] * A[7] */ + "ldr r6, [%[a], #12]\n\t" + "ldr r8, [%[a], #28]\n\t" + "umull r9, r10, r6, r8\n\t" + "mov r11, #0\n\t" + /* A[4] * A[6] */ + "ldr r6, [%[a], #16]\n\t" + "ldr r8, [%[a], #24]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r9, r9, r6\n\t" + "adcs r10, r10, r8\n\t" + "adc r11, r11, #0\n\t" + /* A[5] * A[5] */ + "ldr r6, [%[a], #20]\n\t" + "umull r6, r8, r6, r6\n\t" + "adds r4, r4, r6\n\t" + "adcs r5, r5, r8\n\t" + "adc r3, r3, #0\n\t" + "adds r9, r9, r9\n\t" + "adcs r10, r10, r10\n\t" + "adc r11, r11, r11\n\t" + "adds r4, r4, r9\n\t" + "adcs r5, r5, r10\n\t" + "adc r3, r3, r11\n\t" + "str r4, [%[r], #40]\n\t" + "mov r4, #0\n\t" + /* A[4] * A[7] */ + "ldr r6, [%[a], #16]\n\t" + "ldr r8, [%[a], #28]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r5, r5, r6\n\t" + "adcs r3, r3, r8\n\t" + "adc r4, r4, #0\n\t" + "adds r5, r5, r6\n\t" + "adcs r3, r3, r8\n\t" + "adc r4, r4, #0\n\t" + /* A[5] * A[6] */ + "ldr r6, [%[a], #20]\n\t" + "ldr r8, [%[a], #24]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r5, r5, r6\n\t" + "adcs r3, r3, r8\n\t" + "adc r4, r4, #0\n\t" + "adds r5, r5, r6\n\t" + "adcs r3, r3, r8\n\t" + "adc r4, r4, #0\n\t" + "str r5, [%[r], #44]\n\t" + "mov r5, #0\n\t" + /* A[5] * A[7] */ + "ldr r6, [%[a], #20]\n\t" + "ldr r8, [%[a], #28]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r3, r3, r6\n\t" + "adcs r4, r4, r8\n\t" + "adc r5, r5, #0\n\t" + "adds r3, r3, r6\n\t" + "adcs r4, r4, r8\n\t" + "adc r5, r5, #0\n\t" + /* A[6] * A[6] */ + "ldr r6, [%[a], #24]\n\t" + "umull r6, r8, r6, r6\n\t" + "adds r3, r3, r6\n\t" + "adcs r4, r4, r8\n\t" + "adc r5, r5, #0\n\t" + "str r3, [%[r], #48]\n\t" + "mov r3, #0\n\t" + /* A[6] * A[7] */ + "ldr r6, [%[a], #24]\n\t" + "ldr r8, [%[a], #28]\n\t" + "umull r6, r8, r6, r8\n\t" + "adds r4, r4, r6\n\t" + "adcs r5, r5, r8\n\t" + "adc r3, r3, #0\n\t" + "adds r4, r4, r6\n\t" + "adcs r5, r5, r8\n\t" + "adc r3, r3, #0\n\t" + "str r4, [%[r], #52]\n\t" + "mov r4, #0\n\t" + /* A[7] * A[7] */ + "ldr r6, [%[a], #28]\n\t" + "umull r6, r8, r6, r6\n\t" + "adds r5, r5, r6\n\t" + "adc r3, r3, r8\n\t" + "str r5, [%[r], #56]\n\t" + "str r3, [%[r], #60]\n\t" + /* Transfer tmp to r */ + "ldr r3, [%[tmp], #0]\n\t" + "ldr r4, [%[tmp], #4]\n\t" + "ldr r5, [%[tmp], #8]\n\t" + "ldr r6, [%[tmp], #12]\n\t" + "str r3, [%[r], #0]\n\t" + "str r4, [%[r], #4]\n\t" + "str r5, [%[r], #8]\n\t" + "str r6, [%[r], #12]\n\t" + "ldr r3, [%[tmp], #16]\n\t" + "ldr r4, [%[tmp], #20]\n\t" + "ldr r5, [%[tmp], #24]\n\t" + "ldr r6, [%[tmp], #28]\n\t" + "str r3, [%[r], #16]\n\t" + "str r4, [%[r], #20]\n\t" + "str r5, [%[r], #24]\n\t" + "str r6, [%[r], #28]\n\t" + : + : [r] "r" (r), [a] "r" (a), [tmp] "r" (tmp) + : "memory", "r3", "r4", "r5", "r6", "r8", "r9", "r10", "r11" + ); +} + #ifdef WOLFSSL_SP_SMALL /* Order-2 for the P256 curve. */ static const uint32_t p256_order_minus_2[8] = { From b07dfa425dc9416c4188830e79fd26703e982f0a Mon Sep 17 00:00:00 2001 From: David Garske Date: Thu, 23 Apr 2020 15:26:04 -0700 Subject: [PATCH 046/298] Fixes for `./configure CC="g++" --enable-all && make`. Resolves issues with implicit casts and use of reserved `template` keyword. --- src/ssl.c | 46 +++++++++++++++++++++--------------------- tests/api.c | 6 +++--- wolfssl/openssl/asn1.h | 6 +++--- 3 files changed, 29 insertions(+), 29 deletions(-) diff --git a/src/ssl.c b/src/ssl.c index 58569f3e9..f5e16ed1a 100755 --- a/src/ssl.c +++ b/src/ssl.c @@ -24965,13 +24965,13 @@ void wolfSSL_ASN1_TYPE_set(WOLFSSL_ASN1_TYPE *a, int type, void *value) } switch (type) { case V_ASN1_OBJECT: - a->value.object = value; + a->value.object = (WOLFSSL_ASN1_OBJECT*)value; break; case V_ASN1_UTCTIME: - a->value.utctime = value; + a->value.utctime = (WOLFSSL_ASN1_TIME*)value; break; case V_ASN1_GENERALIZEDTIME: - a->value.generalizedtime = value; + a->value.generalizedtime = (WOLFSSL_ASN1_TIME*)value; break; default: WOLFSSL_MSG("Unknown or unsupported ASN1_TYPE"); @@ -28202,20 +28202,20 @@ WOLFSSL_ASN1_INTEGER* wolfSSL_BN_to_ASN1_INTEGER(const WOLFSSL_BIGNUM *bn, WOLFS } #ifdef OPENSSL_ALL -void *wolfSSL_ASN1_item_new(const WOLFSSL_ASN1_ITEM *template) +void *wolfSSL_ASN1_item_new(const WOLFSSL_ASN1_ITEM *tpl) { void *ret = NULL; const WOLFSSL_ASN1_TEMPLATE *member = NULL; size_t i; WOLFSSL_ENTER("wolfSSL_ASN1_item_new"); - if (!template) { + if (!tpl) { return NULL; } - if (!(ret = XMALLOC(template->size, NULL, DYNAMIC_TYPE_OPENSSL))) { + if (!(ret = XMALLOC(tpl->size, NULL, DYNAMIC_TYPE_OPENSSL))) { return NULL; } - XMEMSET(ret, 0, template->size); - for (member = template->members, i = 0; i < template->mcount; + XMEMSET(ret, 0, tpl->size); + for (member = tpl->members, i = 0; i < tpl->mcount; member++, i++) { switch (member->type) { case WOLFSSL_X509_ALGOR_ASN1: @@ -28243,17 +28243,17 @@ void *wolfSSL_ASN1_item_new(const WOLFSSL_ASN1_ITEM *template) } return ret; error: - wolfSSL_ASN1_item_free(ret, template); + wolfSSL_ASN1_item_free(ret, tpl); return NULL; } -void wolfSSL_ASN1_item_free(void *val, const WOLFSSL_ASN1_ITEM *template) +void wolfSSL_ASN1_item_free(void *val, const WOLFSSL_ASN1_ITEM *tpl) { const WOLFSSL_ASN1_TEMPLATE *member = NULL; size_t i; WOLFSSL_ENTER("wolfSSL_ASN1_item_free"); if (val) { - for (member = template->members, i = 0; i < template->mcount; + for (member = tpl->members, i = 0; i < tpl->mcount; member++, i++) { switch (member->type) { case WOLFSSL_X509_ALGOR_ASN1: @@ -28341,20 +28341,20 @@ static int i2dProcessMembers(const void *src, byte *buf, } int wolfSSL_ASN1_item_i2d(const void *src, byte **dest, - const WOLFSSL_ASN1_ITEM *template) + const WOLFSSL_ASN1_ITEM *tpl) { int len = 0; byte *buf = NULL; WOLFSSL_ENTER("wolfSSL_ASN1_item_i2d"); - if (!src || !template) { + if (!src || !tpl) { WOLFSSL_LEAVE("wolfSSL_ASN1_item_i2d", WOLFSSL_FAILURE); return WOLFSSL_FAILURE; } if (dest && !*dest) { - len = wolfSSL_ASN1_item_i2d(src, NULL, template); + len = wolfSSL_ASN1_item_i2d(src, NULL, tpl); if (!len) { goto error; } @@ -28365,18 +28365,18 @@ int wolfSSL_ASN1_item_i2d(const void *src, byte **dest, len = 0; } - switch (template->type) { + switch (tpl->type) { case ASN_SEQUENCE: { - int seq_len = i2dProcessMembers(src, NULL, template->members, - template->mcount); + int seq_len = i2dProcessMembers(src, NULL, tpl->members, + tpl->mcount); if (!seq_len) { goto error; } len += SetSequence(seq_len, bufLenOrNull(buf, len)); if (buf && - i2dProcessMembers(src, bufLenOrNull(buf, len), template->members, - template->mcount) != seq_len) { + i2dProcessMembers(src, bufLenOrNull(buf, len), tpl->members, + tpl->mcount) != seq_len) { WOLFSSL_MSG("Inconsistent sequence length"); goto error; } @@ -34996,7 +34996,7 @@ int wolfSSL_RSA_padding_add_PKCS1_PSS(WOLFSSL_RSA *rsa, unsigned char *EM, goto cleanup; } - hashType = wolfSSL_EVP_md2macType(hashAlg); + hashType = (enum wc_HashType)wolfSSL_EVP_md2macType(hashAlg); if (hashType < WC_HASH_TYPE_NONE || hashType > WC_HASH_TYPE_MAX) { WOLFSSL_MSG("wolfSSL_EVP_md2macType error"); goto cleanup; @@ -35034,9 +35034,9 @@ int wolfSSL_RSA_padding_add_PKCS1_PSS(WOLFSSL_RSA *rsa, unsigned char *EM, } } - if (wc_RsaPad_ex(mHash, wolfSSL_EVP_MD_size(hashAlg), EM, emLen, + if (wc_RsaPad_ex(mHash, hashLen, EM, emLen, RSA_BLOCK_TYPE_1, rng, WC_RSA_PSS_PAD, - wolfSSL_EVP_md2macType(hashAlg), mgf, NULL, 0, saltLen, + hashType, mgf, NULL, 0, saltLen, wolfSSL_BN_num_bits(rsa->n), NULL) != MP_OKAY) { WOLFSSL_MSG("wc_RsaPad_ex error"); goto cleanup; @@ -35103,7 +35103,7 @@ int wolfSSL_RSA_verify_PKCS1_PSS(WOLFSSL_RSA *rsa, const unsigned char *mHash, return WOLFSSL_FAILURE; } - hashType = wolfSSL_EVP_md2macType(hashAlg); + hashType = (enum wc_HashType)wolfSSL_EVP_md2macType(hashAlg); if (hashType < WC_HASH_TYPE_NONE || hashType > WC_HASH_TYPE_MAX) { WOLFSSL_MSG("wolfSSL_EVP_md2macType error"); return WOLFSSL_FAILURE; diff --git a/tests/api.c b/tests/api.c index 4975981e6..cc805c3b8 100644 --- a/tests/api.c +++ b/tests/api.c @@ -28619,7 +28619,7 @@ static void test_wolfSSL_EVP_PKEY_derive(void) AssertIntEQ(EVP_PKEY_derive_init(ctx), 1); AssertIntEQ(EVP_PKEY_derive_set_peer(ctx, peerkey), 1); AssertIntEQ(EVP_PKEY_derive(ctx, NULL, &skeylen), 1); - AssertNotNull(skey = XMALLOC(skeylen, NULL, DYNAMIC_TYPE_OPENSSL)); + AssertNotNull(skey = (unsigned char*)XMALLOC(skeylen, NULL, DYNAMIC_TYPE_OPENSSL)); AssertIntEQ(EVP_PKEY_derive(ctx, skey, &skeylen), 1); EVP_PKEY_CTX_free(ctx); @@ -28639,7 +28639,7 @@ static void test_wolfSSL_EVP_PKEY_derive(void) AssertIntEQ(EVP_PKEY_derive_init(ctx), 1); AssertIntEQ(EVP_PKEY_derive_set_peer(ctx, peerkey), 1); AssertIntEQ(EVP_PKEY_derive(ctx, NULL, &skeylen), 1); - AssertNotNull(skey = XMALLOC(skeylen, NULL, DYNAMIC_TYPE_OPENSSL)); + AssertNotNull(skey = (unsigned char*)XMALLOC(skeylen, NULL, DYNAMIC_TYPE_OPENSSL)); AssertIntEQ(EVP_PKEY_derive(ctx, skey, &skeylen), 1); EVP_PKEY_CTX_free(ctx); @@ -31063,7 +31063,7 @@ static void test_wolfSSL_IMPLEMENT_ASN1_FUNCTIONS() AssertIntGT((len = EC_POINT_point2oct(group, point, POINT_CONVERSION_UNCOMPRESSED, NULL, 0, NULL)), 0); #endif - AssertNotNull(der = XMALLOC(len, NULL, DYNAMIC_TYPE_ASN1)); + AssertNotNull(der = (unsigned char*)XMALLOC(len, NULL, DYNAMIC_TYPE_ASN1)); #ifdef HAVE_COMP_KEY AssertIntEQ(EC_POINT_point2oct(group, point, POINT_CONVERSION_COMPRESSED, der, len, NULL), len); diff --git a/wolfssl/openssl/asn1.h b/wolfssl/openssl/asn1.h index 0566ceb2b..993e1daea 100644 --- a/wolfssl/openssl/asn1.h +++ b/wolfssl/openssl/asn1.h @@ -123,10 +123,10 @@ typedef enum { sizeof(type) \ }; -WOLFSSL_API void *wolfSSL_ASN1_item_new(const WOLFSSL_ASN1_ITEM *template); -WOLFSSL_API void wolfSSL_ASN1_item_free(void *val, const WOLFSSL_ASN1_ITEM *template); +WOLFSSL_API void *wolfSSL_ASN1_item_new(const WOLFSSL_ASN1_ITEM *tpl); +WOLFSSL_API void wolfSSL_ASN1_item_free(void *val, const WOLFSSL_ASN1_ITEM *tpl); WOLFSSL_API int wolfSSL_ASN1_item_i2d(const void *src, byte **dest, - const WOLFSSL_ASN1_ITEM *template); + const WOLFSSL_ASN1_ITEM *tpl); /* Need function declaration otherwise compiler complains */ #define IMPLEMENT_ASN1_FUNCTIONS(type) \ From 81f959336b77da235aa478ad152aa841e4175bdb Mon Sep 17 00:00:00 2001 From: David Garske Date: Thu, 23 Apr 2020 16:07:43 -0700 Subject: [PATCH 047/298] Added support for important private key DER using `wc_EccPublicKeyDecode`. Added ECC key generation and decode test case. --- wolfcrypt/src/asn.c | 67 ++++++++++++++++++++++++++++++++++++------- wolfcrypt/test/test.c | 61 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 117 insertions(+), 11 deletions(-) diff --git a/wolfcrypt/src/asn.c b/wolfcrypt/src/asn.c index c4e60043f..066f66c81 100644 --- a/wolfcrypt/src/asn.c +++ b/wolfcrypt/src/asn.c @@ -15369,11 +15369,11 @@ static int EccKeyParamCopy(char** dst, char* src) int wc_EccPublicKeyDecode(const byte* input, word32* inOutIdx, ecc_key* key, word32 inSz) { - int length; int ret; + int version, length; int curve_id = ECC_CURVE_DEF; word32 oidSum, localIdx; - byte tag; + byte tag, isPrivFormat = 0; if (input == NULL || inOutIdx == NULL || key == NULL || inSz == 0) return BAD_FUNC_ARG; @@ -15381,12 +15381,44 @@ int wc_EccPublicKeyDecode(const byte* input, word32* inOutIdx, if (GetSequence(input, inOutIdx, &length, inSz) < 0) return ASN_PARSE_E; - if (GetSequence(input, inOutIdx, &length, inSz) < 0) - return ASN_PARSE_E; + /* Check if ECC private key is being used and skip private portion */ + if (GetMyVersion(input, inOutIdx, &version, inSz) >= 0) { + isPrivFormat = 1; - ret = SkipObjectId(input, inOutIdx, inSz); - if (ret != 0) - return ret; + /* Type private key */ + if (*inOutIdx >= inSz) + return ASN_PARSE_E; + tag = input[*inOutIdx]; + *inOutIdx += 1; + if (tag != 4 && tag != 6 && tag != 7) + return ASN_PARSE_E; + + /* Skip Private Key */ + if (GetLength(input, inOutIdx, &length, inSz) < 0) + return ASN_PARSE_E; + if (length > ECC_MAXSIZE) + return BUFFER_E; + *inOutIdx += length; + + /* Private Curve Header */ + if (*inOutIdx >= inSz) + return ASN_PARSE_E; + tag = input[*inOutIdx]; + *inOutIdx += 1; + if (tag != ECC_PREFIX_0) + return ASN_ECC_KEY_E; + if (GetLength(input, inOutIdx, &length, inSz) <= 0) + return ASN_PARSE_E; + } + /* Standard ECC public key */ + else { + if (GetSequence(input, inOutIdx, &length, inSz) < 0) + return ASN_PARSE_E; + + ret = SkipObjectId(input, inOutIdx, inSz); + if (ret != 0) + return ret; + } if (*inOutIdx >= inSz) { return BUFFER_E; @@ -15541,9 +15573,24 @@ int wc_EccPublicKeyDecode(const byte* input, word32* inOutIdx, return ret; /* get curve id */ - curve_id = wc_ecc_get_oid(oidSum, NULL, 0); - if (curve_id < 0) - return ECC_CURVE_OID_E; + if ((ret = CheckCurve(oidSum)) < 0) + ret = ECC_CURVE_OID_E; + else { + curve_id = ret; + ret = 0; + } + } + + if (isPrivFormat) { + /* Public Curve Header - skip */ + if (*inOutIdx >= inSz) + return ASN_PARSE_E; + tag = input[*inOutIdx]; + *inOutIdx += 1; + if (tag != ECC_PREFIX_1) + return ASN_ECC_KEY_E; + if (GetLength(input, inOutIdx, &length, inSz) <= 0) + return ASN_PARSE_E; } /* key header */ diff --git a/wolfcrypt/test/test.c b/wolfcrypt/test/test.c index 5e29eda3e..dd795a46c 100644 --- a/wolfcrypt/test/test.c +++ b/wolfcrypt/test/test.c @@ -18441,8 +18441,56 @@ done: return ret; } -#endif /* HAVE_ECC_KEY_IMPORT */ +static int ecc_test_key_decode(WC_RNG* rng, int keySize) +{ + int ret; + ecc_key eccKey; + byte tmpBuf[ECC_BUFSIZE]; + word32 tmpSz; + word32 idx; + + ret = wc_ecc_init(&eccKey); + if (ret != 0) { + return ret; + } + ret = wc_ecc_make_key(rng, keySize, &eccKey); + if (ret != 0) { + wc_ecc_free(&eccKey); + return ret; + } + + tmpSz = sizeof(tmpBuf); + ret = wc_EccKeyToDer(&eccKey, tmpBuf, tmpSz); + wc_ecc_free(&eccKey); + if (ret < 0) { + return ret; + } + tmpSz = ret; + + ret = wc_ecc_init(&eccKey); + if (ret != 0) { + return ret; + } + idx = 0; + ret = wc_EccPrivateKeyDecode(tmpBuf, &idx, &eccKey, tmpSz); + wc_ecc_free(&eccKey); + if (ret != 0) { + return ret; + } + + ret = wc_ecc_init(&eccKey); + if (ret != 0) { + return 0; + } + + idx = 0; + ret = wc_EccPublicKeyDecode(tmpBuf, &idx, &eccKey, tmpSz); + wc_ecc_free(&eccKey); + + return ret; +} +#endif /* HAVE_ECC_KEY_IMPORT */ #ifdef WOLFSSL_KEY_GEN static int ecc_test_key_gen(WC_RNG* rng, int keySize) @@ -18912,6 +18960,17 @@ static int ecc_test_curve(WC_RNG* rng, int keySize) #endif #ifdef WOLFSSL_KEY_GEN + ret = ecc_test_key_decode(rng, keySize); + if (ret < 0) { + if (ret == ECC_CURVE_OID_E) { + /* ignore error for curves not found */ + } + else { + printf("ecc_test_key_decode %d failed!: %d\n", keySize, ret); + return ret; + } + } + ret = ecc_test_key_gen(rng, keySize); if (ret < 0) { if (ret == ECC_CURVE_OID_E) { From 28b686a8ca62f1e0b6cdeeaff7eb076dc0392140 Mon Sep 17 00:00:00 2001 From: David Garske Date: Thu, 23 Apr 2020 16:11:54 -0700 Subject: [PATCH 048/298] * Exposed useful sizes `MAX_X509_HEADER_SZ` and `PEM_LINE_SZ` * Refactor the PEM saving code in `test.c`, so its not using large 4K buffer and calculates based on DER. * Enable ECC key generation test even without `WOLFSSL_KEY_GEN`. * Added `ECC_KEYGEN_SIZE` macro for ECC key generation testing. * Refactor ECC DER key generation to use `ECC_BUFSIZE`. --- wolfcrypt/src/asn.c | 5 +- wolfcrypt/src/coding.c | 2 +- wolfcrypt/test/test.c | 236 ++++++++++++++-------------------------- wolfssl/wolfcrypt/asn.h | 5 +- 4 files changed, 89 insertions(+), 159 deletions(-) diff --git a/wolfcrypt/src/asn.c b/wolfcrypt/src/asn.c index 066f66c81..11e58a7cb 100644 --- a/wolfcrypt/src/asn.c +++ b/wolfcrypt/src/asn.c @@ -9798,9 +9798,8 @@ void wc_FreeDer(DerBuffer** pDer) #if defined(WOLFSSL_PEM_TO_DER) || defined(WOLFSSL_DER_TO_PEM) -/* Max X509 header length indicates the max length + 2 ('\n', '\0') */ -#define MAX_X509_HEADER_SZ (37 + 2) - +/* Note: If items added make sure MAX_X509_HEADER_SZ is + updated to reflect maximum length */ wcchar BEGIN_CERT = "-----BEGIN CERTIFICATE-----"; wcchar END_CERT = "-----END CERTIFICATE-----"; #ifdef WOLFSSL_CERT_REQ diff --git a/wolfcrypt/src/coding.c b/wolfcrypt/src/coding.c index f6c814e01..c94efb03e 100644 --- a/wolfcrypt/src/coding.c +++ b/wolfcrypt/src/coding.c @@ -29,6 +29,7 @@ #ifndef NO_CODING #include +#include /* For PEM_LINE_SZ */ #include #include @@ -36,7 +37,6 @@ enum { BAD = 0xFF, /* invalid encoding */ PAD = '=', - PEM_LINE_SZ = 64, BASE64_MIN = 0x2B, BASE16_MIN = 0x30, }; diff --git a/wolfcrypt/test/test.c b/wolfcrypt/test/test.c index dd795a46c..8e405de09 100644 --- a/wolfcrypt/test/test.c +++ b/wolfcrypt/test/test.c @@ -120,11 +120,7 @@ #include #include #include -#if defined(WOLFSSL_TEST_CERT) || defined(ASN_BER_TO_DER) - #include -#else - #include -#endif +#include #include #include #include @@ -1286,18 +1282,17 @@ initDefaultName(); #endif /* NO_MAIN_DRIVER */ /* helper to save DER, convert to PEM and save PEM */ -#if !defined(NO_ASN) && (!defined(NO_RSA) || defined(HAVE_ECC)) && \ - (defined(WOLFSSL_KEY_GEN) || defined(WOLFSSL_CERT_GEN)) +#if !defined(NO_ASN) && \ + ((!defined(NO_RSA) && defined(WOLFSSL_CERT_GEN)) || defined(HAVE_ECC)) #if !defined(NO_FILESYSTEM) && !defined(NO_WRITE_TEMP_FILES) -#define SaveDerAndPem(d, dSz, p, pSz, fD, fP, pT, eB) _SaveDerAndPem(d, dSz, p, pSz, fD, fP, pT, eB) +#define SaveDerAndPem(d, dSz, fD, fP, pT, eB) _SaveDerAndPem(d, dSz, fD, fP, pT, eB) #else -#define SaveDerAndPem(d, dSz, p, pSz, fD, fP, pT, eB) _SaveDerAndPem(d, dSz, p, pSz, NULL, NULL, pT, eB) +#define SaveDerAndPem(d, dSz, fD, fP, pT, eB) _SaveDerAndPem(d, dSz, NULL, NULL, pT, eB) #endif static int _SaveDerAndPem(const byte* der, int derSz, - byte* pem, int pemSz, const char* fileDer, - const char* filePem, int pemType, int errBase) + const char* fileDer, const char* filePem, int pemType, int errBase) { #if !defined(NO_FILESYSTEM) && !defined(NO_WRITE_TEMP_FILES) int ret; @@ -1314,32 +1309,50 @@ static int _SaveDerAndPem(const byte* der, int derSz, } #endif - if (pem && filePem) { +#ifdef WOLFSSL_DER_TO_PEM + if (filePem) { #if !defined(NO_FILESYSTEM) && !defined(NO_WRITE_TEMP_FILES) XFILE pemFile; #endif - #ifdef WOLFSSL_DER_TO_PEM + byte* pem; + int pemSz; + + /* calculate PEM size */ + pemSz = wc_DerToPem(der, derSz, NULL, 0, pemType); + if (pemSz < 0) { + return pemSz; + } + pem = XMALLOC(pemSz, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + if (pem == NULL) { + return MEMORY_E; + } + /* Convert to PEM */ pemSz = wc_DerToPem(der, derSz, pem, pemSz, pemType); if (pemSz < 0) { + XFREE(pem, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); return errBase + 2; } - #endif #if !defined(NO_FILESYSTEM) && !defined(NO_WRITE_TEMP_FILES) pemFile = XFOPEN(filePem, "wb"); if (!pemFile) { + XFREE(pem, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); return errBase + 3; } ret = (int)XFWRITE(pem, 1, pemSz, pemFile); XFCLOSE(pemFile); if (ret != pemSz) { + XFREE(pem, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); return errBase + 4; } #endif + XFREE(pem, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); } +#endif /* WOLFSSL_DER_TO_PEM */ /* suppress unused variable warnings */ (void)filePem; (void)fileDer; + (void)pemType; return 0; } @@ -10357,12 +10370,10 @@ byte GetEntropy(ENTROPY_CMD cmd, byte* out) static const char* certEccRsaPemFile = CERT_PREFIX "certeccrsa.pem"; static const char* certEccRsaDerFile = CERT_PREFIX "certeccrsa.der"; #endif - #ifdef WOLFSSL_KEY_GEN static const char* eccCaKeyPemFile = CERT_PREFIX "ecc-key.pem"; static const char* eccPubKeyDerFile = CERT_PREFIX "ecc-public-key.der"; static const char* eccCaKeyTempFile = CERT_PREFIX "ecc-key.der"; static const char* eccPkcs8KeyDerFile = CERT_PREFIX "ecc-key-pkcs8.der"; - #endif #if defined(WOLFSSL_CERT_GEN) || \ (defined(WOLFSSL_CERT_EXT) && defined(WOLFSSL_TEST_CERT)) static const char* certEccDerFile = CERT_PREFIX "certecc.der"; @@ -12229,7 +12240,6 @@ static int rsa_certgen_test(RsaKey* key, RsaKey* keypub, WC_RNG* rng, byte* tmp) { RsaKey caKey; byte* der; - byte* pem = NULL; int ret; Cert* myCert = NULL; int certSz; @@ -12255,10 +12265,6 @@ static int rsa_certgen_test(RsaKey* key, RsaKey* keypub, WC_RNG* rng, byte* tmp) if (der == NULL) { ERROR_OUT(-7619, exit_rsa); } - pem = (byte*)XMALLOC(FOURK_BUF, HEAP_HINT,DYNAMIC_TYPE_TMP_BUFFER); - if (pem == NULL) { - ERROR_OUT(-7620, exit_rsa); - } myCert = (Cert*)XMALLOC(sizeof(Cert), HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); if (myCert == NULL) { ERROR_OUT(-7621, exit_rsa); @@ -12337,8 +12343,8 @@ static int rsa_certgen_test(RsaKey* key, RsaKey* keypub, WC_RNG* rng, byte* tmp) FreeDecodedCert(&decode); #endif - ret = SaveDerAndPem(der, certSz, pem, FOURK_BUF, certDerFile, - certPemFile, CERT_TYPE, -5578); + ret = SaveDerAndPem(der, certSz, certDerFile, certPemFile, + CERT_TYPE, -5578); if (ret != 0) { goto exit_rsa; } @@ -12500,8 +12506,8 @@ static int rsa_certgen_test(RsaKey* key, RsaKey* keypub, WC_RNG* rng, byte* tmp) FreeDecodedCert(&decode); #endif - ret = SaveDerAndPem(der, certSz, pem, FOURK_BUF, otherCertDerFile, - otherCertPemFile, CERT_TYPE, -5598); + ret = SaveDerAndPem(der, certSz, otherCertDerFile, otherCertPemFile, + CERT_TYPE, -5598); if (ret != 0) { goto exit_rsa; } @@ -12510,7 +12516,6 @@ exit_rsa: wc_FreeRsaKey(&caKey); XFREE(myCert, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); - XFREE(pem, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); XFREE(der, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); return ret; @@ -12525,7 +12530,6 @@ static int rsa_ecc_certgen_test(WC_RNG* rng, byte* tmp) ecc_key caEccKey; ecc_key caEccKeyPub; byte* der; - byte* pem = NULL; Cert* myCert = NULL; int certSz; size_t bytes3; @@ -12547,10 +12551,6 @@ static int rsa_ecc_certgen_test(WC_RNG* rng, byte* tmp) if (der == NULL) { ERROR_OUT(-7645, exit_rsa); } - pem = (byte*)XMALLOC(FOURK_BUF, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); - if (pem == NULL) { - ERROR_OUT(-7646, exit_rsa); - } myCert = (Cert*)XMALLOC(sizeof(Cert), HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); if (myCert == NULL) { ERROR_OUT(-7647, exit_rsa); @@ -12697,8 +12697,8 @@ static int rsa_ecc_certgen_test(WC_RNG* rng, byte* tmp) FreeDecodedCert(&decode); #endif - ret = SaveDerAndPem(der, certSz, pem, FOURK_BUF, certEccRsaDerFile, - certEccRsaPemFile, CERT_TYPE, -5616); + ret = SaveDerAndPem(der, certSz, certEccRsaDerFile, certEccRsaPemFile, + CERT_TYPE, -5616); if (ret != 0) { goto exit_rsa; } @@ -12710,8 +12710,6 @@ exit_rsa: XFREE(myCert, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); myCert = NULL; - XFREE(pem, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); - pem = NULL; XFREE(der, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); der = NULL; @@ -12727,7 +12725,6 @@ static int rsa_keygen_test(WC_RNG* rng) RsaKey genKey; int ret; byte* der = NULL; - byte* pem = NULL; word32 idx = 0; int derSz = 0; #if !defined(WOLFSSL_SP_MATH) && !defined(HAVE_FIPS) @@ -12766,17 +12763,13 @@ static int rsa_keygen_test(WC_RNG* rng) if (der == NULL) { ERROR_OUT(-7665, exit_rsa); } - pem = (byte*)XMALLOC(FOURK_BUF, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); - if (pem == NULL) { - ERROR_OUT(-7666, exit_rsa); - } derSz = wc_RsaKeyToDer(&genKey, der, FOURK_BUF); if (derSz < 0) { ERROR_OUT(-7667, exit_rsa); } - ret = SaveDerAndPem(der, derSz, pem, FOURK_BUF, keyDerFile, keyPemFile, + ret = SaveDerAndPem(der, derSz, keyDerFile, keyPemFile, PRIVATEKEY_TYPE, -5555); if (ret != 0) { goto exit_rsa; @@ -12798,10 +12791,6 @@ static int rsa_keygen_test(WC_RNG* rng) exit_rsa: wc_FreeRsaKey(&genKey); - if (pem != NULL) { - XFREE(pem, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); - pem = NULL; - } if (der != NULL) { XFREE(der, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); der = NULL; @@ -12816,7 +12805,6 @@ int rsa_test(void) int ret; byte* tmp; byte* der = NULL; - byte* pem = NULL; size_t bytes; WC_RNG rng; RsaKey key; @@ -13698,10 +13686,6 @@ int rsa_test(void) if (der == NULL) { ERROR_OUT(-7758, exit_rsa); } - pem = (byte*)XMALLOC(FOURK_BUF, HEAP_HINT,DYNAMIC_TYPE_TMP_BUFFER); - if (pem == NULL) { - ERROR_OUT(-7759, exit_rsa); - } certSz = wc_MakeNtruCert(&myCert, der, FOURK_BUF, public_key, public_key_len, &rng); @@ -13735,8 +13719,8 @@ int rsa_test(void) FreeDecodedCert(&decode); #endif - ret = SaveDerAndPem(der, certSz, pem, FOURK_BUF, "./ntru-cert.der", - "./ntru-cert.pem", CERT_TYPE, -5637); + ret = SaveDerAndPem(der, certSz, "./ntru-cert.der", "./ntru-cert.pem", + CERT_TYPE, -5637); if (ret != 0) { goto exit_rsa; } @@ -13753,8 +13737,6 @@ int rsa_test(void) } #endif - XFREE(pem, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); - pem = NULL; XFREE(der, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); der = NULL; } @@ -13768,10 +13750,6 @@ int rsa_test(void) if (der == NULL) { ERROR_OUT(-7765, exit_rsa); } - pem = (byte*)XMALLOC(FOURK_BUF, HEAP_HINT,DYNAMIC_TYPE_TMP_BUFFER); - if (pem == NULL) { - ERROR_OUT(-7766, exit_rsa); - } if (wc_InitCert(&req)) { ERROR_OUT(-7767, exit_rsa); @@ -13846,8 +13824,8 @@ int rsa_test(void) } derSz = ret; - ret = SaveDerAndPem(der, derSz, pem, FOURK_BUF, certReqDerFile, - certReqPemFile, CERTREQ_TYPE, -5650); + ret = SaveDerAndPem(der, derSz, certReqDerFile, certReqPemFile, + CERTREQ_TYPE, -5650); if (ret != 0) { goto exit_rsa; } @@ -13857,8 +13835,6 @@ int rsa_test(void) ERROR_OUT(-7776, exit_rsa); } - XFREE(pem, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); - pem = NULL; XFREE(der, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); der = NULL; } @@ -13878,7 +13854,6 @@ exit_rsa: wc_FreeRsaKey(&caKey); #endif - XFREE(pem, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); XFREE(der, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); XFREE(tmp, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); wc_FreeRng(&rng); @@ -14606,7 +14581,6 @@ int dsa_test(void) #ifdef WOLFSSL_KEY_GEN { byte* der; - byte* pem; int derSz = 0; DsaKey derIn; DsaKey genKey; @@ -14631,25 +14605,17 @@ int dsa_test(void) wc_FreeDsaKey(&genKey); return -8011; } - pem = (byte*)XMALLOC(FOURK_BUF, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); - if (pem == NULL) { - XFREE(der, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); - wc_FreeDsaKey(&genKey); - return -8012; - } derSz = wc_DsaKeyToDer(&genKey, der, FOURK_BUF); if (derSz < 0) { XFREE(der, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); - XFREE(pem, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); return -8013; } - ret = SaveDerAndPem(der, derSz, pem, FOURK_BUF, keyDerFile, - keyPemFile, DSA_PRIVATEKEY_TYPE, -5814); + ret = SaveDerAndPem(der, derSz, keyDerFile, keyPemFile, + DSA_PRIVATEKEY_TYPE, -5814); if (ret != 0) { XFREE(der, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); - XFREE(pem, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); wc_FreeDsaKey(&genKey); return ret; } @@ -14657,7 +14623,6 @@ int dsa_test(void) ret = wc_InitDsaKey(&derIn); if (ret != 0) { XFREE(der, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); - XFREE(pem, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); wc_FreeDsaKey(&genKey); return -8014; } @@ -14666,7 +14631,6 @@ int dsa_test(void) ret = wc_DsaPrivateKeyDecode(der, &idx, &derIn, derSz); if (ret != 0) { XFREE(der, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); - XFREE(pem, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); wc_FreeDsaKey(&derIn); wc_FreeDsaKey(&genKey); return -8015; @@ -14674,7 +14638,6 @@ int dsa_test(void) wc_FreeDsaKey(&derIn); wc_FreeDsaKey(&genKey); - XFREE(pem, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); XFREE(der, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); } #endif /* WOLFSSL_KEY_GEN */ @@ -17714,6 +17677,10 @@ int x963kdf_test(void) #ifdef HAVE_ECC +#ifndef ECC_KEYGEN_SIZE + /* size to use for ECC key gen tests */ + #define ECC_KEYGEN_SIZE 32 +#endif #ifdef BENCH_EMBEDDED #define ECC_SHARED_SIZE 128 #else @@ -18212,9 +18179,9 @@ done: static int ecc_test_make_pub(WC_RNG* rng) { ecc_key key; - unsigned char* exportBuf; - unsigned char* tmp; - unsigned char msg[] = "test wolfSSL ECC public gen"; + byte exportBuf[ECC_BUFSIZE]; + byte tmp[ECC_BUFSIZE]; + const byte* msg = (const byte*)"test wolfSSL ECC public gen"; word32 x, tmpSz; int ret = 0; ecc_point* pubPoint = NULL; @@ -18231,33 +18198,15 @@ static int ecc_test_make_pub(WC_RNG* rng) wc_ecc_init_ex(&key, HEAP_HINT, devId); #ifdef USE_CERT_BUFFERS_256 - tmp = (byte*)XMALLOC((size_t)sizeof_ecc_key_der_256, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); - if (tmp == NULL) { - return -9613; - } - exportBuf = (byte*)XMALLOC((size_t)sizeof_ecc_key_der_256, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); - if (exportBuf == NULL) { - XFREE(tmp, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); - return -9614; - } XMEMCPY(tmp, ecc_key_der_256, (size_t)sizeof_ecc_key_der_256); tmpSz = (size_t)sizeof_ecc_key_der_256; #else - tmp = (byte*)XMALLOC(FOURK_BUF, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); - if (tmp == NULL) { - return -9615; - } - exportBuf = (byte*)XMALLOC(FOURK_BUF, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); - if (exportBuf == NULL) { - XFREE(tmp, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); - return -9616; - } file = XFOPEN(eccKeyDerFile, "rb"); if (!file) { ERROR_OUT(-9617, done); } - tmpSz = (word32)XFREAD(tmp, 1, FOURK_BUF, file); + tmpSz = (word32)XFREAD(tmp, 1, sizeof(tmp), file); XFCLOSE(file); #endif /* USE_CERT_BUFFERS_256 */ @@ -18279,7 +18228,7 @@ static int ecc_test_make_pub(WC_RNG* rng) } #ifdef HAVE_ECC_KEY_EXPORT - x = FOURK_BUF; + x = sizeof(exportBuf); ret = wc_ecc_export_private_only(&key, exportBuf, &x); if (ret != 0) { ERROR_OUT(-9621, done); @@ -18293,7 +18242,7 @@ static int ecc_test_make_pub(WC_RNG* rng) ERROR_OUT(-9622, done); } - x = FOURK_BUF; + x = sizeof(exportBuf); ret = wc_ecc_export_x963_ex(&key, exportBuf, &x, 0); if (ret == 0) { ERROR_OUT(-9623, done); @@ -18321,7 +18270,7 @@ static int ecc_test_make_pub(WC_RNG* rng) #ifdef HAVE_ECC_KEY_EXPORT /* export should still fail, is private only key */ - x = FOURK_BUF; + x = sizeof(exportBuf); ret = wc_ecc_export_x963_ex(&key, exportBuf, &x, 0); if (ret == 0) { ERROR_OUT(-9627, done); @@ -18329,13 +18278,13 @@ static int ecc_test_make_pub(WC_RNG* rng) #endif /* HAVE_ECC_KEY_EXPORT */ #if defined(WOLFSSL_CRYPTOCELL) /* create a new key since building private key from public key is unsupported */ - ret = wc_ecc_make_key(rng, 32, &key); + ret = wc_ecc_make_key(rng, ECC_KEYGEN_SIZE, &key); if (ret == 0) { ERROR_OUT(-9628, done); } #endif #ifdef HAVE_ECC_SIGN - tmpSz = FOURK_BUF; + tmpSz = sizeof(tmp); ret = 0; do { #if defined(WOLFSSL_ASYNC_CRYPT) @@ -18369,7 +18318,7 @@ static int ecc_test_make_pub(WC_RNG* rng) TEST_SLEEP(); #ifdef HAVE_ECC_KEY_EXPORT /* exporting the public part should now work */ - x = FOURK_BUF; + x = sizeof(exportBuf); ret = wc_ecc_export_x963_ex(&key, exportBuf, &x, 0); if (ret != 0) { ERROR_OUT(-9632, done); @@ -18381,7 +18330,7 @@ static int ecc_test_make_pub(WC_RNG* rng) #if defined(HAVE_ECC_DHE) && defined(HAVE_ECC_KEY_EXPORT) /* now test private only key with creating a shared secret */ - x = FOURK_BUF; + x = sizeof(exportBuf); ret = wc_ecc_export_private_only(&key, exportBuf, &x); if (ret != 0) { ERROR_OUT(-9633, done); @@ -18396,7 +18345,7 @@ static int ecc_test_make_pub(WC_RNG* rng) } /* check that public export fails with private only key */ - x = FOURK_BUF; + x = sizeof(exportBuf); ret = wc_ecc_export_x963_ex(&key, exportBuf, &x, 0); if (ret == 0) { ERROR_OUT(-9635, done); @@ -18404,7 +18353,7 @@ static int ecc_test_make_pub(WC_RNG* rng) /* make public key for shared secret */ wc_ecc_init_ex(&pub, HEAP_HINT, devId); - ret = wc_ecc_make_key(rng, 32, &pub); + ret = wc_ecc_make_key(rng, ECC_KEYGEN_SIZE, &pub); #if defined(WOLFSSL_ASYNC_CRYPT) ret = wc_AsyncWait(ret, &pub.asyncDev, WC_ASYNC_FLAG_NONE); #endif @@ -18413,7 +18362,7 @@ static int ecc_test_make_pub(WC_RNG* rng) } TEST_SLEEP(); - x = FOURK_BUF; + x = sizeof(exportBuf); do { #if defined(WOLFSSL_ASYNC_CRYPT) ret = wc_AsyncWait(ret, &key.asyncDev, WC_ASYNC_FLAG_CALL_AGAIN); @@ -18433,9 +18382,6 @@ static int ecc_test_make_pub(WC_RNG* rng) done: - XFREE(tmp, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); - XFREE(exportBuf, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); - wc_ecc_del_point_h(pubPoint, HEAP_HINT); wc_ecc_free(&key); @@ -18492,7 +18438,6 @@ static int ecc_test_key_decode(WC_RNG* rng, int keySize) } #endif /* HAVE_ECC_KEY_IMPORT */ -#ifdef WOLFSSL_KEY_GEN static int ecc_test_key_gen(WC_RNG* rng, int keySize) { int ret = 0; @@ -18500,20 +18445,9 @@ static int ecc_test_key_gen(WC_RNG* rng, int keySize) #ifdef HAVE_PKCS8 word32 pkcs8Sz; #endif - byte* der; - byte* pem; + byte der[ECC_BUFSIZE]; ecc_key userA; - der = (byte*)XMALLOC(FOURK_BUF, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); - if (der == NULL) { - return -9638; - } - pem = (byte*)XMALLOC(FOURK_BUF, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); - if (pem == NULL) { - XFREE(der, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); - return -9639; - } - ret = wc_ecc_init_ex(&userA, HEAP_HINT, devId); if (ret != 0) goto done; @@ -18531,19 +18465,19 @@ static int ecc_test_key_gen(WC_RNG* rng, int keySize) goto done; TEST_SLEEP(); - derSz = wc_EccKeyToDer(&userA, der, FOURK_BUF); + derSz = wc_EccKeyToDer(&userA, der, sizeof(der)); if (derSz < 0) { ERROR_OUT(derSz, done); } - ret = SaveDerAndPem(der, derSz, pem, FOURK_BUF, eccCaKeyTempFile, - eccCaKeyPemFile, ECC_PRIVATEKEY_TYPE, -8347); + ret = SaveDerAndPem(der, derSz, eccCaKeyTempFile, eccCaKeyPemFile, + ECC_PRIVATEKEY_TYPE, -8347); if (ret != 0) { goto done; } /* test export of public key */ - derSz = wc_EccPublicKeyToDer(&userA, der, FOURK_BUF, 1); + derSz = wc_EccPublicKeyToDer(&userA, der, sizeof(der), 1); if (derSz < 0) { ERROR_OUT(derSz, done); } @@ -18551,8 +18485,7 @@ static int ecc_test_key_gen(WC_RNG* rng, int keySize) ERROR_OUT(-9640, done); } - ret = SaveDerAndPem(der, derSz, NULL, 0, eccPubKeyDerFile, - NULL, 0, -8348); + ret = SaveDerAndPem(der, derSz, eccPubKeyDerFile, NULL, 0, -8348); if (ret != 0) { goto done; } @@ -18569,8 +18502,7 @@ static int ecc_test_key_gen(WC_RNG* rng, int keySize) ERROR_OUT(-9641, done); } - ret = SaveDerAndPem(der, derSz, NULL, 0, eccPkcs8KeyDerFile, - NULL, 0, -8349); + ret = SaveDerAndPem(der, derSz, eccPkcs8KeyDerFile, NULL, 0, -8349); if (ret != 0) { goto done; } @@ -18578,13 +18510,10 @@ static int ecc_test_key_gen(WC_RNG* rng, int keySize) done: - XFREE(der, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); - XFREE(pem, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); wc_ecc_free(&userA); return ret; } -#endif /* WOLFSSL_KEY_GEN */ static int ecc_test_curve_size(WC_RNG* rng, int keySize, int testVerifyCount, int curve_id, const ecc_set_type* dp) @@ -18959,7 +18888,6 @@ static int ecc_test_curve(WC_RNG* rng, int keySize) } #endif -#ifdef WOLFSSL_KEY_GEN ret = ecc_test_key_decode(rng, keySize); if (ret < 0) { if (ret == ECC_CURVE_OID_E) { @@ -18981,7 +18909,6 @@ static int ecc_test_curve(WC_RNG* rng, int keySize) return ret; } } -#endif return 0; } @@ -19491,7 +19418,7 @@ static int ecc_def_curve_test(WC_RNG *rng) goto done; } - ret = wc_ecc_make_key(rng, 32, &key); + ret = wc_ecc_make_key(rng, ECC_KEYGEN_SIZE, &key); #if defined(WOLFSSL_ASYNC_CRYPT) ret = wc_AsyncWait(ret, &key.asyncDev, WC_ASYNC_FLAG_NONE); #endif @@ -19813,22 +19740,23 @@ static int ecc_test_cert_gen(WC_RNG* rng) #ifdef WOLFSSL_TEST_CERT DecodedCert decode; #endif - byte* der; - byte* pem = NULL; +#ifdef WOLFSSL_SMALL_STACK + byte* der = NULL; +#else + byte der[FOURK_BUF]; +#endif ecc_key caEccKey; ecc_key certPubKey; XMEMSET(&caEccKey, 0, sizeof(caEccKey)); XMEMSET(&certPubKey, 0, sizeof(certPubKey)); +#ifdef WOLFSSL_SMALL_STACK der = (byte*)XMALLOC(FOURK_BUF, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); if (der == NULL) { - ERROR_OUT(-9817, exit); - } - pem = (byte*)XMALLOC(FOURK_BUF, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); - if (pem == NULL) { ERROR_OUT(-9818, exit); } +#endif /* Get cert private key */ #ifdef ENABLE_ECC384_CERT_GEN_TEST @@ -19879,7 +19807,7 @@ static int ecc_test_cert_gen(WC_RNG* rng) ERROR_OUT(-9823, exit); } - ret = wc_ecc_make_key(rng, 32, &certPubKey); + ret = wc_ecc_make_key(rng, ECC_KEYGEN_SIZE, &certPubKey); #if defined(WOLFSSL_ASYNC_CRYPT) ret = wc_AsyncWait(ret, &certPubKey.asyncDev, WC_ASYNC_FLAG_NONE); #endif @@ -19979,19 +19907,19 @@ static int ecc_test_cert_gen(WC_RNG* rng) FreeDecodedCert(&decode); #endif - ret = SaveDerAndPem(der, certSz, pem, FOURK_BUF, certEccDerFile, - certEccPemFile, CERT_TYPE, -6735); + ret = SaveDerAndPem(der, certSz, certEccDerFile, certEccPemFile, + CERT_TYPE, -6735); if (ret != 0) { goto exit; } exit: +#ifdef WOLFSSL_SMALL_STACK + XFREE(der, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); +#endif wc_ecc_free(&certPubKey); wc_ecc_free(&caEccKey); - XFREE(pem, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); - XFREE(der, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); - return ret; } #endif /* WOLFSSL_CERT_GEN */ @@ -20008,7 +19936,7 @@ static int ecc_test_allocator(WC_RNG* rng) ERROR_OUT(-9833, exit); } - ret = wc_ecc_make_key(rng, 32, key); + ret = wc_ecc_make_key(rng, ECC_KEYGEN_SIZE, key); if (ret != 0) { ERROR_OUT(-9834, exit); } @@ -20208,7 +20136,7 @@ int ecc_encrypt_test(void) if (ret != 0) goto done; - ret = wc_ecc_make_key(&rng, 32, &userA); + ret = wc_ecc_make_key(&rng, ECC_KEYGEN_SIZE, &userA); #if defined(WOLFSSL_ASYNC_CRYPT) ret = wc_AsyncWait(ret, &userA.asyncDev, WC_ASYNC_FLAG_NONE); #endif @@ -20216,7 +20144,7 @@ int ecc_encrypt_test(void) ret = -10001; goto done; } - ret = wc_ecc_make_key(&rng, 32, &userB); + ret = wc_ecc_make_key(&rng, ECC_KEYGEN_SIZE, &userB); #if defined(WOLFSSL_ASYNC_CRYPT) ret = wc_AsyncWait(ret, &userB.asyncDev, WC_ASYNC_FLAG_NONE); #endif diff --git a/wolfssl/wolfcrypt/asn.h b/wolfssl/wolfcrypt/asn.h index 6bdda029b..686d09c29 100644 --- a/wolfssl/wolfcrypt/asn.h +++ b/wolfssl/wolfcrypt/asn.h @@ -326,6 +326,8 @@ enum Misc_ASN { /* Maximum DER digest size */ MAX_DER_DIGEST_ASN_SZ = MAX_ENCODED_DIG_ASN_SZ + MAX_ALGO_SZ + MAX_SEQ_SZ, /* Maximum DER digest ASN header size */ + /* Max X509 header length indicates the max length + 2 ('\n', '\0') */ + MAX_X509_HEADER_SZ = (37 + 2), /* Maximum PEM Header/Footer Size */ #ifdef WOLFSSL_CERT_GEN #ifdef WOLFSSL_CERT_REQ /* Max encoded cert req attributes length */ @@ -377,7 +379,8 @@ enum Misc_ASN { PKCS5_SALT_SZ = 8, - PEM_LINE_LEN = 80, /* PEM line max + fudge */ + PEM_LINE_SZ = 64, /* Length of Base64 encoded line, not including new line */ + PEM_LINE_LEN = PEM_LINE_SZ + 12, /* PEM line max + fudge */ }; From bcc408442bf1d292e3ba824908426caddf60cab9 Mon Sep 17 00:00:00 2001 From: TakayukiMatsuo Date: Fri, 24 Apr 2020 17:50:17 +0900 Subject: [PATCH 049/298] Added test cases for wc_curve25519_key_export_xx --- tests/api.c | 219 +++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 218 insertions(+), 1 deletion(-) diff --git a/tests/api.c b/tests/api.c index a9f2fdff6..1b21fa4a0 100644 --- a/tests/api.c +++ b/tests/api.c @@ -15117,6 +15117,221 @@ static int test_wc_curve25519_size (void) } /* END test_wc_curve25519_size*/ +/* + * Testing test_wc_curve25519_export_key_raw(). + */ +static int test_wc_curve25519_export_key_raw (void) +{ + int ret = 0; + +#if defined(HAVE_CURVE25519) && defined(HAVE_CURVE25519_KEY_EXPORT) + int rs; + curve25519_key key; + WC_RNG rng; + + int initdone = 0; + int keymade = 0; + int crvinit = 0; + + byte privateKey[32]; + byte publicKey[32]; + word32 prvkSz = sizeof(privateKey); + word32 pubkSz = sizeof(publicKey); + + byte prik[32]; + byte pubk[32]; + word32 prksz; + word32 pbksz; + + printf(testingFmt, "wc_curve25519_export_key_raw()"); + + /* preparation for key export */ + if(0 == wc_InitRng(&rng)){initdone = 1;} + if(0 == wc_curve25519_init(&key)){crvinit = 1;} + if(0 == wc_curve25519_make_key(&rng, CURVE25519_KEYSIZE, &key)){keymade= 1;} + + if( initdone !=1 || crvinit != 1 || keymade != 1 ){ + ret = SSL_FATAL_ERROR; + } + else{ + ret = SSL_FATAL_ERROR; + + /* tests with BAD args */ + rs = wc_curve25519_export_key_raw( NULL , privateKey, &prvkSz, + publicKey, &pubkSz); + if(rs == BAD_FUNC_ARG){ + rs = wc_curve25519_export_key_raw( &key , NULL, &prvkSz, + publicKey, &pubkSz); + } + if(rs == BAD_FUNC_ARG){ + rs = wc_curve25519_export_key_raw( &key , privateKey, NULL, + publicKey, &pubkSz); + } + if(rs == BAD_FUNC_ARG){ + rs = wc_curve25519_export_key_raw( &key , privateKey, &prvkSz, + NULL, &pubkSz); + } + if(rs == BAD_FUNC_ARG){ + rs = wc_curve25519_export_key_raw( &key , privateKey, &prvkSz, + publicKey, NULL); + } + if(rs == BAD_FUNC_ARG){ + ret = SSL_FATAL_ERROR; + + if((0 == wc_curve25519_export_private_raw(&key, prik, &prksz)) && + (0 == wc_curve25519_export_public(&key, pubk, &pbksz)) && + (0 == wc_curve25519_export_key_raw(&key, privateKey, &prvkSz, + publicKey, &pubkSz))){ + + if((prksz == CURVE25519_KEYSIZE) && + (pbksz == CURVE25519_KEYSIZE) && + (prvkSz == CURVE25519_KEYSIZE) && + (pubkSz == CURVE25519_KEYSIZE)){ + if( 0 == XMEMCMP(privateKey, prik, CURVE25519_KEYSIZE) && + 0 == XMEMCMP(publicKey, pubk, CURVE25519_KEYSIZE )){ + ret = WOLFSSL_ERROR_NONE; /* DO not return "SSL_SUCCESS"*/ + } + } + } + } + else{ + ret = SSL_FATAL_ERROR; + } + } + + /*cleanup*/ + if(keymade != 0){wc_curve25519_free(&key);} + if(initdone != 0){wc_FreeRng(&rng);} + + printf(resultFmt, ret == 0 ? passed : failed); + fflush( stdout ); + +#endif + + return ret; +} /* end of test_wc_curve25519_export_key_raw */ +/* + * Testing test_wc_curve25519_export_key_raw_ex(). + */ +static int test_wc_curve25519_export_key_raw_ex (void) +{ + int ret = 0; + +#if defined(HAVE_CURVE25519) && defined(HAVE_CURVE25519_KEY_EXPORT) + int rs; + curve25519_key key; + WC_RNG rng; + + int initdone = 0; + int keymade = 0; + int crvinit = 0; + + + byte privateKey[32]; + byte publicKey[32]; + word32 prvkSz = sizeof(privateKey); + word32 pubkSz = sizeof(publicKey); + + byte prik[32]; + byte pubk[32]; + word32 prksz; + word32 pbksz; + + printf(testingFmt, "wc_curve25519_export_key_raw_ex()"); + + /* preparation for key export */ + if(0 == wc_InitRng(&rng)){initdone = 1;} + if(0 == wc_curve25519_init(&key)){crvinit = 1;} + if(0 == wc_curve25519_make_key(&rng, CURVE25519_KEYSIZE, &key)){keymade= 1;} + + if( initdone !=1 || crvinit != 1 || keymade != 1 ){ + ret = SSL_FATAL_ERROR; + } + else{ + ret = SSL_FATAL_ERROR; + + rs = wc_curve25519_export_key_raw_ex( NULL , privateKey, &prvkSz, + publicKey, &pubkSz, EC25519_LITTLE_ENDIAN); + if( rs == BAD_FUNC_ARG){ + rs = wc_curve25519_export_key_raw_ex( &key , NULL, &prvkSz, + publicKey, &pubkSz, EC25519_LITTLE_ENDIAN); + } + if( rs == BAD_FUNC_ARG){ + rs = wc_curve25519_export_key_raw_ex( &key , privateKey, NULL, + publicKey, &pubkSz, EC25519_LITTLE_ENDIAN); + } + if( rs == BAD_FUNC_ARG){ + rs = wc_curve25519_export_key_raw_ex( &key , privateKey, &prvkSz, + NULL, &pubkSz, EC25519_LITTLE_ENDIAN); + } + if( rs == BAD_FUNC_ARG){ + rs = wc_curve25519_export_key_raw_ex( &key , privateKey, &prvkSz, + publicKey, NULL, EC25519_LITTLE_ENDIAN); + } + if( rs == BAD_FUNC_ARG){ + rs = wc_curve25519_export_key_raw_ex( NULL , privateKey, &prvkSz, + publicKey, &pubkSz, EC25519_BIG_ENDIAN); + } + if( rs == BAD_FUNC_ARG){ + rs = wc_curve25519_export_key_raw_ex( &key , NULL, &prvkSz, + publicKey, &pubkSz, EC25519_BIG_ENDIAN); + } + if( rs == BAD_FUNC_ARG){ + rs = wc_curve25519_export_key_raw_ex( &key , privateKey, NULL, + publicKey, &pubkSz, EC25519_BIG_ENDIAN); + } + if( rs == BAD_FUNC_ARG){ + rs = wc_curve25519_export_key_raw_ex( &key , privateKey, &prvkSz, + NULL, &pubkSz, EC25519_BIG_ENDIAN); + } + if( rs == BAD_FUNC_ARG){ + rs = wc_curve25519_export_key_raw_ex( &key , privateKey, &prvkSz, + publicKey, NULL, EC25519_BIG_ENDIAN); + } + if( rs == BAD_FUNC_ARG){ + rs = wc_curve25519_export_key_raw_ex( &key , privateKey, &prvkSz, + publicKey, NULL, EC25519_BIG_ENDIAN + 10 ); /* illegal value for endien */ + } + if(rs == BAD_FUNC_ARG){ + ret = SSL_FATAL_ERROR; + + if( 0 == wc_curve25519_export_private_raw( &key, prik, &prksz ) && + 0 == wc_curve25519_export_public( &key, pubk, &pbksz ) && + 0 == wc_curve25519_export_key_raw_ex( &key, privateKey, &prvkSz, + publicKey, &pubkSz, EC25519_BIG_ENDIAN)) { + + if( prksz == CURVE25519_KEYSIZE && pbksz == CURVE25519_KEYSIZE && + prvkSz == CURVE25519_KEYSIZE && pubkSz == CURVE25519_KEYSIZE ){ + if( 0 == XMEMCMP( privateKey, prik , CURVE25519_KEYSIZE ) && + 0 == XMEMCMP( publicKey, pubk, CURVE25519_KEYSIZE )){ + + if( 0 == wc_curve25519_export_key_raw_ex( &key, privateKey, + &prvkSz, publicKey, &pubkSz, EC25519_LITTLE_ENDIAN)){ + + if( prvkSz == CURVE25519_KEYSIZE && + pubkSz == CURVE25519_KEYSIZE ){ + ret = 0; + } + } + } + } + } + } + else{ + ret = SSL_FATAL_ERROR; + } + } + + /*cleanup*/ + if(keymade != 0){wc_curve25519_free(&key);} + if(initdone != 0){wc_FreeRng(&rng);} + + printf(resultFmt, ret == 0 ? passed : failed); + fflush( stdout ); + +#endif + return ret; +} /* end of test_wc_curve25519_export_key_raw_ex */ /* * Testing wc_ed448_make_key(). */ @@ -32125,7 +32340,9 @@ void ApiTest(void) AssertIntEQ(test_wc_ed25519_exportKey(), 0); AssertIntEQ(test_wc_Ed25519PublicKeyToDer(), 0); AssertIntEQ(test_wc_curve25519_init(), 0); - AssertIntEQ(test_wc_curve25519_size (), 0); + AssertIntEQ(test_wc_curve25519_size(), 0); + AssertIntEQ(test_wc_curve25519_export_key_raw(), 0); + AssertIntEQ(test_wc_curve25519_export_key_raw_ex(), 0); AssertIntEQ(test_wc_ed448_make_key(), 0); AssertIntEQ(test_wc_ed448_init(), 0); AssertIntEQ(test_wc_ed448_sign_msg(), 0); From 6d025f8c0f5df62b12a5a4025eadabfcb6f2b6fd Mon Sep 17 00:00:00 2001 From: David Garske Date: Fri, 24 Apr 2020 07:43:44 -0700 Subject: [PATCH 050/298] Refactor of the EVP `macType` to use `enum wc_HashType` to resolve issues with invalid casting. --- src/ssl.c | 4 +- tests/api.c | 4 +- wolfcrypt/src/evp.c | 343 +++++++++++++++++++++++------------------- wolfssl/openssl/evp.h | 5 +- 4 files changed, 194 insertions(+), 162 deletions(-) diff --git a/src/ssl.c b/src/ssl.c index f5e16ed1a..7c10b6f72 100755 --- a/src/ssl.c +++ b/src/ssl.c @@ -34996,7 +34996,7 @@ int wolfSSL_RSA_padding_add_PKCS1_PSS(WOLFSSL_RSA *rsa, unsigned char *EM, goto cleanup; } - hashType = (enum wc_HashType)wolfSSL_EVP_md2macType(hashAlg); + hashType = wolfSSL_EVP_md2macType(hashAlg); if (hashType < WC_HASH_TYPE_NONE || hashType > WC_HASH_TYPE_MAX) { WOLFSSL_MSG("wolfSSL_EVP_md2macType error"); goto cleanup; @@ -35103,7 +35103,7 @@ int wolfSSL_RSA_verify_PKCS1_PSS(WOLFSSL_RSA *rsa, const unsigned char *mHash, return WOLFSSL_FAILURE; } - hashType = (enum wc_HashType)wolfSSL_EVP_md2macType(hashAlg); + hashType = wolfSSL_EVP_md2macType(hashAlg); if (hashType < WC_HASH_TYPE_NONE || hashType > WC_HASH_TYPE_MAX) { WOLFSSL_MSG("wolfSSL_EVP_md2macType error"); return WOLFSSL_FAILURE; diff --git a/tests/api.c b/tests/api.c index cc805c3b8..1c4e2cae7 100644 --- a/tests/api.c +++ b/tests/api.c @@ -31014,7 +31014,7 @@ static void test_wolfSSL_ASN1_INTEGER_set() } /* Testing code used in dpp.c in hostap */ -#ifdef OPENSSL_ALL +#if defined(OPENSSL_ALL) && defined(HAVE_ECC) && defined(USE_CERT_BUFFERS_256) typedef struct { /* AlgorithmIdentifier ecPublicKey with optional parameters present * as an OID identifying the curve */ @@ -31029,7 +31029,7 @@ ASN1_SEQUENCE(DPP_BOOTSTRAPPING_KEY) = { } ASN1_SEQUENCE_END(DPP_BOOTSTRAPPING_KEY); IMPLEMENT_ASN1_FUNCTIONS(DPP_BOOTSTRAPPING_KEY); -#endif /* WOLFSSL_WPAS */ +#endif static void test_wolfSSL_IMPLEMENT_ASN1_FUNCTIONS() { diff --git a/wolfcrypt/src/evp.c b/wolfcrypt/src/evp.c index d9207900c..167c0cc74 100644 --- a/wolfcrypt/src/evp.c +++ b/wolfcrypt/src/evp.c @@ -1823,7 +1823,7 @@ int wolfSSL_EVP_SignUpdate(WOLFSSL_EVP_MD_CTX *ctx, const void *data, size_t len } static const struct s_ent { - const int macType; + const enum wc_HashType macType; const int nid; const char *name; } md_tbl[] = { @@ -1862,10 +1862,10 @@ static const struct s_ent { #ifndef WOLFSSL_NOSHA3_512 {WC_HASH_TYPE_SHA3_512, NID_sha3_512, "SHA3_512"}, #endif - {0, 0, NULL} + {WC_HASH_TYPE_NONE, 0, NULL} }; -static int wolfSSL_EVP_md2macType(const WOLFSSL_EVP_MD *md) +static enum wc_HashType wolfSSL_EVP_md2macType(const WOLFSSL_EVP_MD *md) { const struct s_ent *ent ; @@ -2101,7 +2101,7 @@ static int wolfSSL_evp_digest_pk_init(WOLFSSL_EVP_MD_CTX *ctx, if (wc_HmacSetKey(&ctx->hash.hmac, hashType, key, (word32)keySz) != 0) return WOLFSSL_FAILURE; - ctx->macType = NID_hmac; + ctx->isHMAC = 1; } else { int ret; @@ -2128,7 +2128,7 @@ static int wolfssl_evp_digest_pk_update(WOLFSSL_EVP_MD_CTX *ctx, const void *d, unsigned int cnt) { if (ctx->pctx == NULL) { - if (ctx->macType != NID_hmac) + if (!ctx->isHMAC) return WOLFSSL_FAILURE; if (wc_HmacUpdate(&ctx->hash.hmac, (const byte *)d, cnt) != 0) @@ -2152,7 +2152,7 @@ static int wolfssl_evp_digest_pk_final(WOLFSSL_EVP_MD_CTX *ctx, if (ctx->pctx == NULL) { Hmac hmacCopy; - if (ctx->macType != NID_hmac) + if (!ctx->isHMAC) return WOLFSSL_FAILURE; if (wolfSSL_HmacCopy(&hmacCopy, &ctx->hash.hmac) != WOLFSSL_SUCCESS) @@ -2267,7 +2267,7 @@ int wolfSSL_EVP_DigestSignFinal(WOLFSSL_EVP_MD_CTX *ctx, unsigned char *sig, /* Return the maximum size of the signaure when sig is NULL. */ if (ctx->pctx == NULL) { - if (ctx->macType != NID_hmac) + if (!ctx->isHMAC) return WOLFSSL_FAILURE; hashLen = wolfssl_mac_len(ctx->hash.hmac.macType); @@ -2385,7 +2385,7 @@ int wolfSSL_EVP_DigestVerifyFinal(WOLFSSL_EVP_MD_CTX *ctx, return WOLFSSL_FAILURE; if (ctx->pctx == NULL) { - if (ctx->macType != NID_hmac) + if (!ctx->isHMAC) return WOLFSSL_FAILURE; hashLen = wolfssl_mac_len(ctx->hash.hmac.macType); @@ -3338,83 +3338,85 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) static int wolfSSL_EVP_MD_Copy_Hasher(WOLFSSL_EVP_MD_CTX* des, const WOLFSSL_EVP_MD_CTX* src) { - if (src->macType == NID_hmac) { - wolfSSL_HmacCopy(&des->hash.hmac, (Hmac*)&src->hash.hmac); + int ret; + if (src->isHMAC) { + ret = wolfSSL_HmacCopy(&des->hash.hmac, (Hmac*)&src->hash.hmac); } else { + ret = NOT_COMPILED_IN; switch (src->macType) { - #ifndef NO_MD5 case WC_HASH_TYPE_MD5: - wc_Md5Copy((wc_Md5*)&src->hash.digest, + #ifndef NO_MD5 + ret = wc_Md5Copy((wc_Md5*)&src->hash.digest, (wc_Md5*)&des->hash.digest); - break; #endif /* !NO_MD5 */ - - #ifndef NO_SHA + break; case WC_HASH_TYPE_SHA: - wc_ShaCopy((wc_Sha*)&src->hash.digest, + #ifndef NO_SHA + ret = wc_ShaCopy((wc_Sha*)&src->hash.digest, (wc_Sha*)&des->hash.digest); - break; #endif /* !NO_SHA */ - - #ifdef WOLFSSL_SHA224 + break; case WC_HASH_TYPE_SHA224: - wc_Sha224Copy((wc_Sha224*)&src->hash.digest, + #ifdef WOLFSSL_SHA224 + ret = wc_Sha224Copy((wc_Sha224*)&src->hash.digest, (wc_Sha224*)&des->hash.digest); - break; #endif /* WOLFSSL_SHA224 */ - - #ifndef NO_SHA256 + break; case WC_HASH_TYPE_SHA256: - wc_Sha256Copy((wc_Sha256*)&src->hash.digest, + #ifndef NO_SHA256 + ret = wc_Sha256Copy((wc_Sha256*)&src->hash.digest, (wc_Sha256*)&des->hash.digest); - break; #endif /* !NO_SHA256 */ - - #ifdef WOLFSSL_SHA384 + break; case WC_HASH_TYPE_SHA384: - wc_Sha384Copy((wc_Sha384*)&src->hash.digest, + #ifdef WOLFSSL_SHA384 + ret = wc_Sha384Copy((wc_Sha384*)&src->hash.digest, (wc_Sha384*)&des->hash.digest); - break; #endif /* WOLFSSL_SHA384 */ - #ifdef WOLFSSL_SHA512 + break; case WC_HASH_TYPE_SHA512: - wc_Sha512Copy((wc_Sha512*)&src->hash.digest, + #ifdef WOLFSSL_SHA512 + ret = wc_Sha512Copy((wc_Sha512*)&src->hash.digest, (wc_Sha512*)&des->hash.digest); - break; #endif /* WOLFSSL_SHA512 */ - #ifdef WOLFSSL_SHA3 - #ifndef WOLFSSL_NOSHA3_224 + break; case WC_HASH_TYPE_SHA3_224: - wc_Sha3_224_Copy((wc_Sha3*)&src->hash.digest, + #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_224) + ret = wc_Sha3_224_Copy((wc_Sha3*)&src->hash.digest, (wc_Sha3*)&des->hash.digest); - break; #endif - - #ifndef WOLFSSL_NOSHA3_256 + break; case WC_HASH_TYPE_SHA3_256: - wc_Sha3_256_Copy((wc_Sha3*)&src->hash.digest, + #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_256) + ret = wc_Sha3_256_Copy((wc_Sha3*)&src->hash.digest, (wc_Sha3*)&des->hash.digest); - break; #endif - + break; case WC_HASH_TYPE_SHA3_384: - wc_Sha3_384_Copy((wc_Sha3*)&src->hash.digest, + #if defined(WOLFSSL_SHA3) + ret = wc_Sha3_384_Copy((wc_Sha3*)&src->hash.digest, (wc_Sha3*)&des->hash.digest); - break; - - #ifndef WOLFSSL_NOSHA3_512 - case WC_HASH_TYPE_SHA3_512: - wc_Sha3_512_Copy((wc_Sha3*)&src->hash.digest, - (wc_Sha3*)&des->hash.digest); - break; #endif - #endif + break; + case WC_HASH_TYPE_SHA3_512: + #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_512) + ret = wc_Sha3_512_Copy((wc_Sha3*)&src->hash.digest, + (wc_Sha3*)&des->hash.digest); + #endif + break; + case WC_HASH_TYPE_NONE: + case WC_HASH_TYPE_MD2: + case WC_HASH_TYPE_MD4: + case WC_HASH_TYPE_MD5_SHA: + case WC_HASH_TYPE_BLAKE2B: + case WC_HASH_TYPE_BLAKE2S: default: - return WOLFSSL_FAILURE; + ret = BAD_FUNC_ARG; + break; } } - return WOLFSSL_SUCCESS; + return ret == 0 ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE; } /* copies structure in to the structure out @@ -3796,79 +3798,92 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) int wolfSSL_EVP_MD_CTX_cleanup(WOLFSSL_EVP_MD_CTX* ctx) { + int ret; WOLFSSL_ENTER("EVP_MD_CTX_cleanup"); if (ctx->pctx != NULL) wolfSSL_EVP_PKEY_CTX_free(ctx->pctx); - if (ctx->macType == NID_hmac) { + if (ctx->isHMAC == NID_hmac) { wc_HmacFree(&ctx->hash.hmac); + ret = 0; } else { + ret = NOT_COMPILED_IN; switch (ctx->macType) { - #ifndef NO_MD5 case WC_HASH_TYPE_MD5: + #ifndef NO_MD5 wc_Md5Free((wc_Md5*)&ctx->hash.digest); - break; + ret = 0; #endif /* !NO_MD5 */ - - #ifndef NO_SHA + break; case WC_HASH_TYPE_SHA: + #ifndef NO_SHA wc_ShaFree((wc_Sha*)&ctx->hash.digest); - break; + ret = 0; #endif /* !NO_SHA */ - - #ifdef WOLFSSL_SHA224 + break; case WC_HASH_TYPE_SHA224: + #ifdef WOLFSSL_SHA224 wc_Sha224Free((wc_Sha224*)&ctx->hash.digest); - break; + ret = 0; #endif /* WOLFSSL_SHA224 */ - - #ifndef NO_SHA256 + break; case WC_HASH_TYPE_SHA256: + #ifndef NO_SHA256 wc_Sha256Free((wc_Sha256*)&ctx->hash.digest); - break; + ret = 0; #endif /* !NO_SHA256 */ - - #ifdef WOLFSSL_SHA384 + break; case WC_HASH_TYPE_SHA384: + #ifdef WOLFSSL_SHA384 wc_Sha384Free((wc_Sha384*)&ctx->hash.digest); - break; + ret = 0; #endif /* WOLFSSL_SHA384 */ - #ifdef WOLFSSL_SHA512 + break; case WC_HASH_TYPE_SHA512: + #ifdef WOLFSSL_SHA512 wc_Sha512Free((wc_Sha512*)&ctx->hash.digest); - break; + ret = 0; #endif /* WOLFSSL_SHA512 */ - #ifdef WOLFSSL_SHA3 - #ifndef WOLFSSL_NOSHA3_224 + break; case WC_HASH_TYPE_SHA3_224: + #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_224) wc_Sha3_224_Free((wc_Sha3*)&ctx->hash.digest); - break; + ret = 0; #endif - - #ifndef WOLFSSL_NOSHA3_256 + break; case WC_HASH_TYPE_SHA3_256: + #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_256) wc_Sha3_256_Free((wc_Sha3*)&ctx->hash.digest); - break; + ret = 0; #endif - + break; case WC_HASH_TYPE_SHA3_384: + #if defined(WOLFSSL_SHA3) wc_Sha3_384_Free((wc_Sha3*)&ctx->hash.digest); - break; - - #ifndef WOLFSSL_NOSHA3_512 - case WC_HASH_TYPE_SHA3_512: - wc_Sha3_512_Free((wc_Sha3*)&ctx->hash.digest); - break; + ret = 0; #endif - #endif + break; + case WC_HASH_TYPE_SHA3_512: + #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_512) + wc_Sha3_512_Free((wc_Sha3*)&ctx->hash.digest); + ret = 0; + #endif + break; + case WC_HASH_TYPE_NONE: + case WC_HASH_TYPE_MD2: + case WC_HASH_TYPE_MD4: + case WC_HASH_TYPE_MD5_SHA: + case WC_HASH_TYPE_BLAKE2B: + case WC_HASH_TYPE_BLAKE2S: default: - return WOLFSSL_FAILURE; + ret = BAD_FUNC_ARG; + break; } } ForceZero(ctx, sizeof(*ctx)); ctx->macType = WC_HASH_TYPE_NONE; - return 1; + return ret == 0 ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE; } void wolfSSL_EVP_CIPHER_CTX_init(WOLFSSL_EVP_CIPHER_CTX* ctx) @@ -5325,165 +5340,179 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) int wolfSSL_EVP_DigestUpdate(WOLFSSL_EVP_MD_CTX* ctx, const void* data, size_t sz) { - int macType; + int ret = WOLFSSL_FAILURE; + enum wc_HashType macType; WOLFSSL_ENTER("EVP_DigestUpdate"); macType = wolfSSL_EVP_md2macType(EVP_MD_CTX_md(ctx)); switch (macType) { -#ifndef NO_MD4 case WC_HASH_TYPE_MD4: + #ifndef NO_MD4 wolfSSL_MD4_Update((MD4_CTX*)&ctx->hash, data, (unsigned long)sz); + ret = WOLFSSL_SUCCESS; + #endif break; -#endif -#ifndef NO_MD5 case WC_HASH_TYPE_MD5: - wolfSSL_MD5_Update((MD5_CTX*)&ctx->hash, data, + #ifndef NO_MD5 + ret = wolfSSL_MD5_Update((MD5_CTX*)&ctx->hash, data, (unsigned long)sz); + #endif break; -#endif -#ifndef NO_SHA case WC_HASH_TYPE_SHA: - wolfSSL_SHA_Update((SHA_CTX*)&ctx->hash, data, + #ifndef NO_SHA + ret = wolfSSL_SHA_Update((SHA_CTX*)&ctx->hash, data, (unsigned long)sz); + #endif break; -#endif -#ifdef WOLFSSL_SHA224 case WC_HASH_TYPE_SHA224: - wolfSSL_SHA224_Update((SHA224_CTX*)&ctx->hash, data, + #ifdef WOLFSSL_SHA224 + ret = wolfSSL_SHA224_Update((SHA224_CTX*)&ctx->hash, data, (unsigned long)sz); + #endif break; -#endif -#ifndef NO_SHA256 case WC_HASH_TYPE_SHA256: - wolfSSL_SHA256_Update((SHA256_CTX*)&ctx->hash, data, + #ifndef NO_SHA256 + ret = wolfSSL_SHA256_Update((SHA256_CTX*)&ctx->hash, data, (unsigned long)sz); + #endif /* !NO_SHA256 */ break; -#endif /* !NO_SHA256 */ -#ifdef WOLFSSL_SHA384 case WC_HASH_TYPE_SHA384: - wolfSSL_SHA384_Update((SHA384_CTX*)&ctx->hash, data, + #ifdef WOLFSSL_SHA384 + ret = wolfSSL_SHA384_Update((SHA384_CTX*)&ctx->hash, data, (unsigned long)sz); + #endif break; -#endif -#ifdef WOLFSSL_SHA512 case WC_HASH_TYPE_SHA512: - wolfSSL_SHA512_Update((SHA512_CTX*)&ctx->hash, data, + #ifdef WOLFSSL_SHA512 + ret = wolfSSL_SHA512_Update((SHA512_CTX*)&ctx->hash, data, (unsigned long)sz); + #endif /* WOLFSSL_SHA512 */ break; -#endif /* WOLFSSL_SHA512 */ - #ifdef WOLFSSL_SHA3 - #ifndef WOLFSSL_NOSHA3_224 case WC_HASH_TYPE_SHA3_224: - wolfSSL_SHA3_224_Update((SHA3_224_CTX*)&ctx->hash, data, + #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_224) + ret = wolfSSL_SHA3_224_Update((SHA3_224_CTX*)&ctx->hash, data, (unsigned long)sz); - break; #endif - #ifndef WOLFSSL_NOSHA3_256 + break; case WC_HASH_TYPE_SHA3_256: - wolfSSL_SHA3_256_Update((SHA3_256_CTX*)&ctx->hash, data, + #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_256) + ret = wolfSSL_SHA3_256_Update((SHA3_256_CTX*)&ctx->hash, data, + (unsigned long)sz); + #endif + break; + case WC_HASH_TYPE_SHA3_384: + #if defined(WOLFSSL_SHA3) + ret = wolfSSL_SHA3_384_Update((SHA3_384_CTX*)&ctx->hash, data, (unsigned long)sz); - break; #endif - case WC_HASH_TYPE_SHA3_384: - wolfSSL_SHA3_384_Update((SHA3_384_CTX*)&ctx->hash, data, - (unsigned long)sz); break; - #ifndef WOLFSSL_NOSHA3_512 case WC_HASH_TYPE_SHA3_512: + #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_512) wolfSSL_SHA3_512_Update((SHA3_512_CTX*)&ctx->hash, data, (unsigned long)sz); - break; #endif - #endif + break; + case WC_HASH_TYPE_NONE: + case WC_HASH_TYPE_MD2: + case WC_HASH_TYPE_MD5_SHA: + case WC_HASH_TYPE_BLAKE2B: + case WC_HASH_TYPE_BLAKE2S: default: return WOLFSSL_FAILURE; } - return WOLFSSL_SUCCESS; + return ret; } /* WOLFSSL_SUCCESS on ok */ int wolfSSL_EVP_DigestFinal(WOLFSSL_EVP_MD_CTX* ctx, unsigned char* md, unsigned int* s) { - int macType; + int ret = WOLFSSL_FAILURE; + enum wc_HashType macType; WOLFSSL_ENTER("EVP_DigestFinal"); macType = wolfSSL_EVP_md2macType(EVP_MD_CTX_md(ctx)); switch (macType) { -#ifndef NO_MD4 case WC_HASH_TYPE_MD4: + #ifndef NO_MD4 wolfSSL_MD4_Final(md, (MD4_CTX*)&ctx->hash); if (s) *s = MD4_DIGEST_SIZE; + ret = WOLFSSL_SUCCESS; + #endif break; -#endif -#ifndef NO_MD5 case WC_HASH_TYPE_MD5: - wolfSSL_MD5_Final(md, (MD5_CTX*)&ctx->hash); + #ifndef NO_MD5 + ret = wolfSSL_MD5_Final(md, (MD5_CTX*)&ctx->hash); if (s) *s = WC_MD5_DIGEST_SIZE; + #endif break; -#endif -#ifndef NO_SHA case WC_HASH_TYPE_SHA: - wolfSSL_SHA_Final(md, (SHA_CTX*)&ctx->hash); + #ifndef NO_SHA + ret = wolfSSL_SHA_Final(md, (SHA_CTX*)&ctx->hash); if (s) *s = WC_SHA_DIGEST_SIZE; + #endif break; -#endif -#ifdef WOLFSSL_SHA224 case WC_HASH_TYPE_SHA224: - wolfSSL_SHA224_Final(md, (SHA224_CTX*)&ctx->hash); + #ifdef WOLFSSL_SHA224 + ret = wolfSSL_SHA224_Final(md, (SHA224_CTX*)&ctx->hash); if (s) *s = WC_SHA224_DIGEST_SIZE; + #endif break; -#endif -#ifndef NO_SHA256 case WC_HASH_TYPE_SHA256: - wolfSSL_SHA256_Final(md, (SHA256_CTX*)&ctx->hash); + #ifndef NO_SHA256 + ret = wolfSSL_SHA256_Final(md, (SHA256_CTX*)&ctx->hash); if (s) *s = WC_SHA256_DIGEST_SIZE; + #endif /* !NO_SHA256 */ break; -#endif /* !NO_SHA256 */ -#ifdef WOLFSSL_SHA384 case WC_HASH_TYPE_SHA384: - wolfSSL_SHA384_Final(md, (SHA384_CTX*)&ctx->hash); + #ifdef WOLFSSL_SHA384 + ret = wolfSSL_SHA384_Final(md, (SHA384_CTX*)&ctx->hash); if (s) *s = WC_SHA384_DIGEST_SIZE; + #endif break; -#endif -#ifdef WOLFSSL_SHA512 case WC_HASH_TYPE_SHA512: - wolfSSL_SHA512_Final(md, (SHA512_CTX*)&ctx->hash); + #ifdef WOLFSSL_SHA512 + ret = wolfSSL_SHA512_Final(md, (SHA512_CTX*)&ctx->hash); if (s) *s = WC_SHA512_DIGEST_SIZE; + #endif /* WOLFSSL_SHA512 */ break; -#endif /* WOLFSSL_SHA512 */ - #ifdef WOLFSSL_SHA3 - #ifndef WOLFSSL_NOSHA3_224 case WC_HASH_TYPE_SHA3_224: - wolfSSL_SHA3_224_Final(md, (SHA3_224_CTX*)&ctx->hash); + #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_224) + ret = wolfSSL_SHA3_224_Final(md, (SHA3_224_CTX*)&ctx->hash); if (s) *s = WC_SHA3_224_DIGEST_SIZE; - break; #endif - #ifndef WOLFSSL_NOSHA3_256 + break; case WC_HASH_TYPE_SHA3_256: - wolfSSL_SHA3_256_Final(md, (SHA3_256_CTX*)&ctx->hash); + #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_256) + ret = wolfSSL_SHA3_256_Final(md, (SHA3_256_CTX*)&ctx->hash); if (s) *s = WC_SHA3_256_DIGEST_SIZE; - break; #endif + break; case WC_HASH_TYPE_SHA3_384: - wolfSSL_SHA3_384_Final(md, (SHA3_384_CTX*)&ctx->hash); + #if defined(WOLFSSL_SHA3) + ret = wolfSSL_SHA3_384_Final(md, (SHA3_384_CTX*)&ctx->hash); if (s) *s = WC_SHA3_384_DIGEST_SIZE; - break; - #ifndef WOLFSSL_NOSHA3_512 - case WC_HASH_TYPE_SHA3_512: - wolfSSL_SHA3_512_Final(md, (SHA3_512_CTX*)&ctx->hash); - if (s) *s = WC_SHA3_512_DIGEST_SIZE; - break; #endif - #endif + break; + case WC_HASH_TYPE_SHA3_512: + #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_512) + ret = wolfSSL_SHA3_512_Final(md, (SHA3_512_CTX*)&ctx->hash); + if (s) *s = WC_SHA3_512_DIGEST_SIZE; + #endif + break; + case WC_HASH_TYPE_NONE: + case WC_HASH_TYPE_MD2: + case WC_HASH_TYPE_MD5_SHA: + case WC_HASH_TYPE_BLAKE2B: + case WC_HASH_TYPE_BLAKE2S: default: return WOLFSSL_FAILURE; } - return WOLFSSL_SUCCESS; + return ret; } /* WOLFSSL_SUCCESS on ok */ diff --git a/wolfssl/openssl/evp.h b/wolfssl/openssl/evp.h index 3f9026ac3..88e4a0536 100644 --- a/wolfssl/openssl/evp.h +++ b/wolfssl/openssl/evp.h @@ -185,8 +185,11 @@ struct WOLFSSL_EVP_MD_CTX { Hmac hmac; #endif } hash; - int macType; + enum wc_HashType macType; WOLFSSL_EVP_PKEY_CTX *pctx; +#ifndef NO_HMAC + unsigned int isHMAC; +#endif }; From 5fa7bb5b9f20f91750a365bbb8830673331c2804 Mon Sep 17 00:00:00 2001 From: David Garske Date: Fri, 24 Apr 2020 07:48:41 -0700 Subject: [PATCH 051/298] Fix possible unused args. --- wolfcrypt/test/test.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/wolfcrypt/test/test.c b/wolfcrypt/test/test.c index 8e405de09..c8b212d2f 100644 --- a/wolfcrypt/test/test.c +++ b/wolfcrypt/test/test.c @@ -1350,9 +1350,12 @@ static int _SaveDerAndPem(const byte* der, int derSz, #endif /* WOLFSSL_DER_TO_PEM */ /* suppress unused variable warnings */ + (void)der; + (void)derSz; (void)filePem; (void)fileDer; (void)pemType; + (void)errBase; return 0; } From 41fc208195b42f4cdc14a6226bd4fce7e09f6733 Mon Sep 17 00:00:00 2001 From: David Garske Date: Fri, 24 Apr 2020 08:51:56 -0700 Subject: [PATCH 052/298] Fixes for `isHMAC` checks. --- wolfcrypt/src/evp.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/wolfcrypt/src/evp.c b/wolfcrypt/src/evp.c index 167c0cc74..d63e2a62b 100644 --- a/wolfcrypt/src/evp.c +++ b/wolfcrypt/src/evp.c @@ -3300,12 +3300,17 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) } /* returns the NID of message digest used by the ctx */ - int wolfSSL_EVP_MD_CTX_type(const WOLFSSL_EVP_MD_CTX *ctx) { + int wolfSSL_EVP_MD_CTX_type(const WOLFSSL_EVP_MD_CTX *ctx) + { const struct s_ent *ent; WOLFSSL_ENTER("EVP_MD_CTX_type"); if (ctx) { + if (ctx->isHMAC) { + return NID_hmac; + } + for(ent = md_tbl; ent->name != NULL; ent++) { if (ctx->macType == ent->macType) { return ent->nid; @@ -3447,6 +3452,9 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) if (ctx == NULL) return NULL; WOLFSSL_ENTER("EVP_MD_CTX_md"); + if (ctx->isHMAC) { + return "HMAC"; + } for(ent = md_tbl; ent->name != NULL; ent++) { if(ctx->macType == ent->macType) { return (const WOLFSSL_EVP_MD *)ent->name; @@ -3803,7 +3811,7 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) if (ctx->pctx != NULL) wolfSSL_EVP_PKEY_CTX_free(ctx->pctx); - if (ctx->isHMAC == NID_hmac) { + if (ctx->isHMAC) { wc_HmacFree(&ctx->hash.hmac); ret = 0; } From cfc0aeb85757ad3db80d7e2c93abc8a26d2a514f Mon Sep 17 00:00:00 2001 From: David Garske Date: Fri, 24 Apr 2020 08:56:31 -0700 Subject: [PATCH 053/298] Fix for RSA and KeyGen only in test.c. --- wolfcrypt/test/test.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wolfcrypt/test/test.c b/wolfcrypt/test/test.c index c8b212d2f..17020f224 100644 --- a/wolfcrypt/test/test.c +++ b/wolfcrypt/test/test.c @@ -1282,8 +1282,8 @@ initDefaultName(); #endif /* NO_MAIN_DRIVER */ /* helper to save DER, convert to PEM and save PEM */ -#if !defined(NO_ASN) && \ - ((!defined(NO_RSA) && defined(WOLFSSL_CERT_GEN)) || defined(HAVE_ECC)) +#if !defined(NO_ASN) && (defined(HAVE_ECC) || \ + (!defined(NO_RSA) && (defined(WOLFSSL_KEY_GEN) || defined(WOLFSSL_CERT_GEN)))) #if !defined(NO_FILESYSTEM) && !defined(NO_WRITE_TEMP_FILES) #define SaveDerAndPem(d, dSz, fD, fP, pT, eB) _SaveDerAndPem(d, dSz, fD, fP, pT, eB) From 0f11369680acae277bce5c9fed4d5bfe18a58c96 Mon Sep 17 00:00:00 2001 From: David Garske Date: Fri, 24 Apr 2020 09:01:51 -0700 Subject: [PATCH 054/298] PIC32MZ Fix for `WOLFSSL_PIC32MZ_LARGE_HASH`: Only submit to hardware if update data provided matches expected. ZD 10211. --- wolfcrypt/src/port/pic32/pic32mz-crypt.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/wolfcrypt/src/port/pic32/pic32mz-crypt.c b/wolfcrypt/src/port/pic32/pic32mz-crypt.c index 1e618c194..4b6825d11 100644 --- a/wolfcrypt/src/port/pic32/pic32mz-crypt.c +++ b/wolfcrypt/src/port/pic32/pic32mz-crypt.c @@ -560,9 +560,16 @@ static int wc_Pic32HashFinal(hashUpdCache* cache, byte* stdBuf, #ifdef WOLFSSL_PIC32MZ_LARGE_HASH if (cache->finalLen) { - start_engine(&gLHDesc); - wait_engine(&gLHDesc, (char*)digest, digestSz); - XMEMCPY(hash, digest, digestSz); + /* Only submit to hardware if update data provided matches expected */ + if (cache->bufLen == cache->finalLen) { + start_engine(); + wait_engine((char*)digest, digestSz); + XMEMCPY(hash, digest, digestSz); + } + else { + wolfSSL_CryptHwMutexUnLock(); + ret = BUFFER_E; + } cache->finalLen = 0; } else From 589712f8702bc4d92ae27729331a6055cc55b063 Mon Sep 17 00:00:00 2001 From: David Garske Date: Fri, 24 Apr 2020 09:13:28 -0700 Subject: [PATCH 055/298] PIC32MZ Fix for cache coherency to enable write-through (no write allocation) to resolve descriptor corruption. ZD 10212. --- wolfcrypt/src/port/pic32/pic32mz-crypt.c | 120 +++++++++++------------ 1 file changed, 57 insertions(+), 63 deletions(-) diff --git a/wolfcrypt/src/port/pic32/pic32mz-crypt.c b/wolfcrypt/src/port/pic32/pic32mz-crypt.c index 4b6825d11..80920110e 100644 --- a/wolfcrypt/src/port/pic32/pic32mz-crypt.c +++ b/wolfcrypt/src/port/pic32/pic32mz-crypt.c @@ -301,13 +301,12 @@ typedef struct { securityAssociation sa __attribute__((aligned (8))); } pic32mz_desc; -static pic32mz_desc gLHDesc; +static pic32mz_desc gLHDesc __attribute__((coherent)); static uint8_t gLHDataBuf[PIC32MZ_MAX_BD][PIC32_BLOCK_SIZE] __attribute__((aligned (4), coherent)); -static void reset_engine(pic32mz_desc *desc, int algo) +static void reset_engine(int algo) { int i; - pic32mz_desc* uc_desc = KVA0_TO_KVA1(desc); wolfSSL_CryptHwMutexLock(); @@ -319,37 +318,36 @@ static void reset_engine(pic32mz_desc *desc, int algo) CEINTSRC = 0xF; /* Make sure everything is clear first before we setup */ - XMEMSET(desc, 0, sizeof(pic32mz_desc)); - XMEMSET((void *)&uc_desc->sa, 0, sizeof(uc_desc->sa)); + XMEMSET(&gLHDesc, 0, sizeof(pic32mz_desc)); /* Set up the Security Association */ - uc_desc->sa.SA_CTRL.ALGO = algo; - uc_desc->sa.SA_CTRL.LNC = 1; - uc_desc->sa.SA_CTRL.FB = 1; - uc_desc->sa.SA_CTRL.ENCTYPE = 1; - uc_desc->sa.SA_CTRL.LOADIV = 1; + gLHDesc.sa.SA_CTRL.ALGO = algo; + gLHDesc.sa.SA_CTRL.LNC = 1; + gLHDesc.sa.SA_CTRL.FB = 1; + gLHDesc.sa.SA_CTRL.ENCTYPE = 1; + gLHDesc.sa.SA_CTRL.LOADIV = 1; /* Set up the Buffer Descriptor */ - uc_desc->err = 0; + gLHDesc.err = 0; for (i = 0; i < PIC32MZ_MAX_BD; i++) { - XMEMSET((void *)&uc_desc->bd[i], 0, sizeof(uc_desc->bd[i])); - uc_desc->bd[i].BD_CTRL.LAST_BD = 1; - uc_desc->bd[i].BD_CTRL.LIFM = 1; - uc_desc->bd[i].BD_CTRL.PKT_INT_EN = 1; - uc_desc->bd[i].SA_ADDR = KVA_TO_PA(&uc_desc->sa); - uc_desc->bd[i].SRCADDR = KVA_TO_PA(&gLHDataBuf[i]); + XMEMSET((void *)&gLHDesc.bd[i], 0, sizeof(gLHDesc.bd[i])); + gLHDesc.bd[i].BD_CTRL.LAST_BD = 1; + gLHDesc.bd[i].BD_CTRL.LIFM = 1; + gLHDesc.bd[i].BD_CTRL.PKT_INT_EN = 1; + gLHDesc.bd[i].SA_ADDR = KVA_TO_PA(&gLHDesc.sa); + gLHDesc.bd[i].SRCADDR = KVA_TO_PA(&gLHDataBuf[i]); if (PIC32MZ_MAX_BD > i+1) - uc_desc->bd[i].NXTPTR = KVA_TO_PA(&uc_desc->bd[i+1]); + gLHDesc.bd[i].NXTPTR = KVA_TO_PA(&gLHDesc.bd[i+1]); else - uc_desc->bd[i].NXTPTR = KVA_TO_PA(&uc_desc->bd[0]); + gLHDesc.bd[i].NXTPTR = KVA_TO_PA(&gLHDesc.bd[0]); XMEMSET((void *)&gLHDataBuf[i], 0, PIC32_BLOCK_SIZE); } - uc_desc->bd[0].BD_CTRL.SA_FETCH_EN = 1; /* Fetch the security association on the first BD */ - desc->dbPtr = 0; - desc->currBd = 0; - desc->msgSize = 0; - desc->processed = 0; - CEBDPADDR = KVA_TO_PA(&(desc->bd[0])); + gLHDesc.bd[0].BD_CTRL.SA_FETCH_EN = 1; /* Fetch the security association on the first BD */ + gLHDesc.dbPtr = 0; + gLHDesc.currBd = 0; + gLHDesc.msgSize = 0; + gLHDesc.processed = 0; + CEBDPADDR = KVA_TO_PA(&(gLHDesc.bd[0])); CEPOLLCON = 10; @@ -360,13 +358,11 @@ static void reset_engine(pic32mz_desc *desc, int algo) #endif } -static void update_engine(pic32mz_desc *desc, const byte *input, word32 len, - word32 *hash) +static void update_engine(const byte *input, word32 len, word32 *hash) { int total; - pic32mz_desc *uc_desc = KVA0_TO_KVA1(desc); - - uc_desc->bd[desc->currBd].UPDPTR = KVA_TO_PA(hash); + + gLHDesc.bd[gLHDesc.currBd].UPDPTR = KVA_TO_PA(hash); /* Add the data to the current buffer. If the buffer fills, start processing it and fill the next one. */ @@ -374,78 +370,76 @@ static void update_engine(pic32mz_desc *desc, const byte *input, word32 len, /* If we've been given the message size, we can process along the way. Enable the current buffer descriptor if it is full. */ - if (desc->dbPtr >= PIC32_BLOCK_SIZE) { + if (gLHDesc.dbPtr >= PIC32_BLOCK_SIZE) { /* Wrap up the buffer descriptor and enable it so the engine can process */ - uc_desc->bd[desc->currBd].MSGLEN = desc->msgSize; - uc_desc->bd[desc->currBd].BD_CTRL.BUFLEN = desc->dbPtr; - uc_desc->bd[desc->currBd].BD_CTRL.LAST_BD = 0; - uc_desc->bd[desc->currBd].BD_CTRL.LIFM = 0; - uc_desc->bd[desc->currBd].BD_CTRL.DESC_EN = 1; + gLHDesc.bd[gLHDesc.currBd].MSGLEN = gLHDesc.msgSize; + gLHDesc.bd[gLHDesc.currBd].BD_CTRL.BUFLEN = gLHDesc.dbPtr; + gLHDesc.bd[gLHDesc.currBd].BD_CTRL.LAST_BD = 0; + gLHDesc.bd[gLHDesc.currBd].BD_CTRL.LIFM = 0; + gLHDesc.bd[gLHDesc.currBd].BD_CTRL.DESC_EN = 1; /* Move to the next buffer descriptor, or wrap around. */ - desc->currBd++; - if (desc->currBd >= PIC32MZ_MAX_BD) - desc->currBd = 0; + gLHDesc.currBd++; + if (gLHDesc.currBd >= PIC32MZ_MAX_BD) + gLHDesc.currBd = 0; /* Wait until the engine has processed the new BD. */ - while (uc_desc->bd[desc->currBd].BD_CTRL.DESC_EN); - uc_desc->bd[desc->currBd].UPDPTR = KVA_TO_PA(hash); - desc->dbPtr = 0; + while (gLHDesc.bd[gLHDesc.currBd].BD_CTRL.DESC_EN); + gLHDesc.bd[gLHDesc.currBd].UPDPTR = KVA_TO_PA(hash); + gLHDesc.dbPtr = 0; } if (!PIC32MZ_IF_RAM(input)) { /* If we're inputting from flash, let the BD have the address and max the buffer size */ - uc_desc->bd[desc->currBd].SRCADDR = KVA_TO_PA(input); + gLHDesc.bd[gLHDesc.currBd].SRCADDR = KVA_TO_PA(input); total = (len > PIC32MZ_MAX_BLOCK ? PIC32MZ_MAX_BLOCK : len); - desc->dbPtr = total; + gLHDesc.dbPtr = total; len -= total; input += total; } else { - if (len > PIC32_BLOCK_SIZE - desc->dbPtr) { + if (len > PIC32_BLOCK_SIZE - gLHDesc.dbPtr) { /* We have more data than can be put in the buffer. Fill what we can.*/ - total = PIC32_BLOCK_SIZE - desc->dbPtr; - XMEMCPY(&gLHDataBuf[desc->currBd][desc->dbPtr], input, total); + total = PIC32_BLOCK_SIZE - gLHDesc.dbPtr; + XMEMCPY(&gLHDataBuf[gLHDesc.currBd][gLHDesc.dbPtr], input, total); len -= total; - desc->dbPtr = PIC32_BLOCK_SIZE; + gLHDesc.dbPtr = PIC32_BLOCK_SIZE; input += total; } else { /* Fill up what we have, but don't turn on the engine.*/ - XMEMCPY(&gLHDataBuf[desc->currBd][desc->dbPtr], input, len); - desc->dbPtr += len; + XMEMCPY(&gLHDataBuf[gLHDesc.currBd][gLHDesc.dbPtr], input, len); + gLHDesc.dbPtr += len; len = 0; } } } } -static void start_engine(pic32mz_desc *desc) +static void start_engine(void) { /* Wrap up the last buffer descriptor and enable it */ int bufferLen; - pic32mz_desc *uc_desc = KVA0_TO_KVA1(desc); - bufferLen = desc->dbPtr; + bufferLen = gLHDesc.dbPtr; if (bufferLen % 4) bufferLen = (bufferLen + 4) - (bufferLen % 4); /* initialize the MSGLEN on engine startup to avoid infinite loop when * length is less than 257 (size of PIC32_BLOCK_SIZE) */ - uc_desc->bd[desc->currBd].MSGLEN = desc->msgSize; - uc_desc->bd[desc->currBd].BD_CTRL.BUFLEN = bufferLen; - uc_desc->bd[desc->currBd].BD_CTRL.LAST_BD = 1; - uc_desc->bd[desc->currBd].BD_CTRL.LIFM = 1; - uc_desc->bd[desc->currBd].BD_CTRL.DESC_EN = 1; + gLHDesc.bd[gLHDesc.currBd].MSGLEN = gLHDesc.msgSize; + gLHDesc.bd[gLHDesc.currBd].BD_CTRL.BUFLEN = bufferLen; + gLHDesc.bd[gLHDesc.currBd].BD_CTRL.LAST_BD = 1; + gLHDesc.bd[gLHDesc.currBd].BD_CTRL.LIFM = 1; + gLHDesc.bd[gLHDesc.currBd].BD_CTRL.DESC_EN = 1; } -void wait_engine(pic32mz_desc *desc, char *hash, int hash_sz) +void wait_engine(char *hash, int hash_sz) { int i; - pic32mz_desc *uc_desc = KVA0_TO_KVA1(desc); unsigned int engineRunning; do { engineRunning = 0; for (i = 0; i < PIC32MZ_MAX_BD; i++) { - engineRunning = engineRunning || uc_desc->bd[i].BD_CTRL.DESC_EN; + engineRunning = engineRunning || gLHDesc.bd[i].BD_CTRL.DESC_EN; } } while (engineRunning); @@ -489,10 +483,10 @@ static int wc_Pic32HashUpdate(hashUpdCache* cache, byte* stdBuf, int stdBufLen, /* if final length is set then pass straight to hardware */ if (cache->finalLen) { if (cache->bufLen == 0) { - reset_engine(&gLHDesc, algo); + reset_engine(algo); gLHDesc.msgSize = cache->finalLen; } - update_engine(&gLHDesc, data, len, digest); + update_engine(data, len, digest); cache->bufLen += len; /* track progress for blockType */ return 0; } From a4caa42793dee81925269c2a66d099b544f57b9d Mon Sep 17 00:00:00 2001 From: David Garske Date: Fri, 24 Apr 2020 11:17:54 -0700 Subject: [PATCH 056/298] Improve the Base64 line size for `NO_ASN` case. Fix report of unread `ret`. --- wolfcrypt/src/asn.c | 3 +-- wolfcrypt/src/coding.c | 21 +++++++++++++++------ 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/wolfcrypt/src/asn.c b/wolfcrypt/src/asn.c index 11e58a7cb..2c7facc55 100644 --- a/wolfcrypt/src/asn.c +++ b/wolfcrypt/src/asn.c @@ -15573,10 +15573,9 @@ int wc_EccPublicKeyDecode(const byte* input, word32* inOutIdx, /* get curve id */ if ((ret = CheckCurve(oidSum)) < 0) - ret = ECC_CURVE_OID_E; + return ECC_CURVE_OID_E; else { curve_id = ret; - ret = 0; } } diff --git a/wolfcrypt/src/coding.c b/wolfcrypt/src/coding.c index c94efb03e..2a8dcb418 100644 --- a/wolfcrypt/src/coding.c +++ b/wolfcrypt/src/coding.c @@ -29,10 +29,11 @@ #ifndef NO_CODING #include -#include /* For PEM_LINE_SZ */ #include #include - +#ifndef NO_ASN + #include /* For PEM_LINE_SZ */ +#endif enum { BAD = 0xFF, /* invalid encoding */ @@ -42,6 +43,14 @@ enum { }; +#ifndef BASE64_LINE_SZ + #ifdef NO_ASN + #define BASE64_LINE_SZ 64 + #else + #define BASE64_LINE_SZ PEM_LINE_SZ + #endif +#endif + #ifdef WOLFSSL_BASE64_DECODE static @@ -91,7 +100,7 @@ int Base64_Decode(const byte* in, word32 inLen, byte* out, word32* outLen) { word32 i = 0; word32 j = 0; - word32 plainSz = inLen - ((inLen + (PEM_LINE_SZ - 1)) / PEM_LINE_SZ ); + word32 plainSz = inLen - ((inLen + (BASE64_LINE_SZ - 1)) / BASE64_LINE_SZ ); int ret; const byte maxIdx = (byte)sizeof(base64Decode) + BASE64_MIN - 1; @@ -291,7 +300,7 @@ static int DoBase64_Encode(const byte* in, word32 inLen, byte* out, int getSzOnly = (out == NULL); word32 outSz = (inLen + 3 - 1) / 3 * 4; - word32 addSz = (outSz + PEM_LINE_SZ - 1) / PEM_LINE_SZ; /* new lines */ + word32 addSz = (outSz + BASE64_LINE_SZ - 1) / BASE64_LINE_SZ; /* new lines */ if (escaped == WC_ESC_NL_ENC) addSz *= 3; /* instead of just \n, we're doing %0A triplet */ @@ -328,8 +337,8 @@ static int DoBase64_Encode(const byte* in, word32 inLen, byte* out, inLen -= 3; - /* Insert newline after PEM_LINE_SZ, unless no \n requested */ - if (escaped != WC_NO_NL_ENC && (++n % (PEM_LINE_SZ/4)) == 0 && inLen) { + /* Insert newline after BASE64_LINE_SZ, unless no \n requested */ + if (escaped != WC_NO_NL_ENC && (++n % (BASE64_LINE_SZ/4)) == 0 && inLen) { ret = CEscape(escaped, '\n', out, &i, *outLen, 1, getSzOnly); if (ret != 0) break; } From 3c93a7b757a0e97cbf35909bf18bf5fdf48b5c6b Mon Sep 17 00:00:00 2001 From: David Garske Date: Fri, 24 Apr 2020 11:31:12 -0700 Subject: [PATCH 057/298] Fix `Value stored to 'ret' is never read`. --- wolfcrypt/src/evp.c | 39 +++++++++++++++++++++++---------------- 1 file changed, 23 insertions(+), 16 deletions(-) diff --git a/wolfcrypt/src/evp.c b/wolfcrypt/src/evp.c index d63e2a62b..2fb57a2e6 100644 --- a/wolfcrypt/src/evp.c +++ b/wolfcrypt/src/evp.c @@ -3348,66 +3348,85 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) ret = wolfSSL_HmacCopy(&des->hash.hmac, (Hmac*)&src->hash.hmac); } else { - ret = NOT_COMPILED_IN; switch (src->macType) { case WC_HASH_TYPE_MD5: #ifndef NO_MD5 ret = wc_Md5Copy((wc_Md5*)&src->hash.digest, (wc_Md5*)&des->hash.digest); + #else + ret = NOT_COMPILED_IN; #endif /* !NO_MD5 */ break; case WC_HASH_TYPE_SHA: #ifndef NO_SHA ret = wc_ShaCopy((wc_Sha*)&src->hash.digest, (wc_Sha*)&des->hash.digest); + #else + ret = NOT_COMPILED_IN; #endif /* !NO_SHA */ break; case WC_HASH_TYPE_SHA224: #ifdef WOLFSSL_SHA224 ret = wc_Sha224Copy((wc_Sha224*)&src->hash.digest, (wc_Sha224*)&des->hash.digest); + #else + ret = NOT_COMPILED_IN; #endif /* WOLFSSL_SHA224 */ break; case WC_HASH_TYPE_SHA256: #ifndef NO_SHA256 ret = wc_Sha256Copy((wc_Sha256*)&src->hash.digest, (wc_Sha256*)&des->hash.digest); + #else + ret = NOT_COMPILED_IN; #endif /* !NO_SHA256 */ break; case WC_HASH_TYPE_SHA384: #ifdef WOLFSSL_SHA384 ret = wc_Sha384Copy((wc_Sha384*)&src->hash.digest, (wc_Sha384*)&des->hash.digest); + #else + ret = NOT_COMPILED_IN; #endif /* WOLFSSL_SHA384 */ break; case WC_HASH_TYPE_SHA512: #ifdef WOLFSSL_SHA512 ret = wc_Sha512Copy((wc_Sha512*)&src->hash.digest, (wc_Sha512*)&des->hash.digest); + #else + ret = NOT_COMPILED_IN; #endif /* WOLFSSL_SHA512 */ break; case WC_HASH_TYPE_SHA3_224: #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_224) ret = wc_Sha3_224_Copy((wc_Sha3*)&src->hash.digest, (wc_Sha3*)&des->hash.digest); + #else + ret = NOT_COMPILED_IN; #endif break; case WC_HASH_TYPE_SHA3_256: #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_256) ret = wc_Sha3_256_Copy((wc_Sha3*)&src->hash.digest, (wc_Sha3*)&des->hash.digest); + #else + ret = NOT_COMPILED_IN; #endif break; case WC_HASH_TYPE_SHA3_384: #if defined(WOLFSSL_SHA3) ret = wc_Sha3_384_Copy((wc_Sha3*)&src->hash.digest, (wc_Sha3*)&des->hash.digest); + #else + ret = NOT_COMPILED_IN; #endif break; case WC_HASH_TYPE_SHA3_512: #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_512) ret = wc_Sha3_512_Copy((wc_Sha3*)&src->hash.digest, (wc_Sha3*)&des->hash.digest); + #else + ret = NOT_COMPILED_IN; #endif break; case WC_HASH_TYPE_NONE: @@ -3806,76 +3825,64 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) int wolfSSL_EVP_MD_CTX_cleanup(WOLFSSL_EVP_MD_CTX* ctx) { - int ret; + int ret = WOLFSSL_SUCCESS; WOLFSSL_ENTER("EVP_MD_CTX_cleanup"); if (ctx->pctx != NULL) wolfSSL_EVP_PKEY_CTX_free(ctx->pctx); if (ctx->isHMAC) { wc_HmacFree(&ctx->hash.hmac); - ret = 0; } else { - ret = NOT_COMPILED_IN; switch (ctx->macType) { case WC_HASH_TYPE_MD5: #ifndef NO_MD5 wc_Md5Free((wc_Md5*)&ctx->hash.digest); - ret = 0; #endif /* !NO_MD5 */ break; case WC_HASH_TYPE_SHA: #ifndef NO_SHA wc_ShaFree((wc_Sha*)&ctx->hash.digest); - ret = 0; #endif /* !NO_SHA */ break; case WC_HASH_TYPE_SHA224: #ifdef WOLFSSL_SHA224 wc_Sha224Free((wc_Sha224*)&ctx->hash.digest); - ret = 0; #endif /* WOLFSSL_SHA224 */ break; case WC_HASH_TYPE_SHA256: #ifndef NO_SHA256 wc_Sha256Free((wc_Sha256*)&ctx->hash.digest); - ret = 0; #endif /* !NO_SHA256 */ break; case WC_HASH_TYPE_SHA384: #ifdef WOLFSSL_SHA384 wc_Sha384Free((wc_Sha384*)&ctx->hash.digest); - ret = 0; #endif /* WOLFSSL_SHA384 */ break; case WC_HASH_TYPE_SHA512: #ifdef WOLFSSL_SHA512 wc_Sha512Free((wc_Sha512*)&ctx->hash.digest); - ret = 0; #endif /* WOLFSSL_SHA512 */ break; case WC_HASH_TYPE_SHA3_224: #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_224) wc_Sha3_224_Free((wc_Sha3*)&ctx->hash.digest); - ret = 0; #endif break; case WC_HASH_TYPE_SHA3_256: #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_256) wc_Sha3_256_Free((wc_Sha3*)&ctx->hash.digest); - ret = 0; #endif break; case WC_HASH_TYPE_SHA3_384: #if defined(WOLFSSL_SHA3) wc_Sha3_384_Free((wc_Sha3*)&ctx->hash.digest); - ret = 0; #endif break; case WC_HASH_TYPE_SHA3_512: #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_512) wc_Sha3_512_Free((wc_Sha3*)&ctx->hash.digest); - ret = 0; #endif break; case WC_HASH_TYPE_NONE: @@ -3885,13 +3892,13 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) case WC_HASH_TYPE_BLAKE2B: case WC_HASH_TYPE_BLAKE2S: default: - ret = BAD_FUNC_ARG; + ret = WOLFSSL_FAILURE; break; } } ForceZero(ctx, sizeof(*ctx)); ctx->macType = WC_HASH_TYPE_NONE; - return ret == 0 ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE; + return ret; } void wolfSSL_EVP_CIPHER_CTX_init(WOLFSSL_EVP_CIPHER_CTX* ctx) From df1b7f34f173cfc2968ce12e8fcd2fd8bcc61a59 Mon Sep 17 00:00:00 2001 From: Sean Parkinson Date: Mon, 27 Apr 2020 15:27:02 +1000 Subject: [PATCH 058/298] In TLS 1.3, don't allow multiple ChangeCipherSpecs in a row --- src/internal.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/internal.c b/src/internal.c index fbdbb13a0..e7d67ff85 100644 --- a/src/internal.c +++ b/src/internal.c @@ -15157,6 +15157,7 @@ int ProcessReply(WOLFSSL* ssl) } else { #ifdef WOLFSSL_TLS13 + ssl->msgsReceived.got_change_cipher = 0; ret = DoTls13HandShakeMsg(ssl, ssl->buffers.inputBuffer.buffer, &ssl->buffers.inputBuffer.idx, @@ -15219,6 +15220,13 @@ int ProcessReply(WOLFSSL* ssl) return UNKNOWN_RECORD_TYPE; } ssl->buffers.inputBuffer.idx++; + if (!ssl->msgsReceived.got_change_cipher) { + ssl->msgsReceived.got_change_cipher = 1; + } + else { + SendAlert(ssl, alert_fatal, illegal_parameter); + return UNKNOWN_RECORD_TYPE; + } break; } #endif From c153873337d6818bf6c54dc1b0a200bc2ef99112 Mon Sep 17 00:00:00 2001 From: Sean Parkinson Date: Mon, 27 Apr 2020 14:03:15 +1000 Subject: [PATCH 059/298] Fail when WOLFSSL_VERIFY_FAIL_IF_NO_PEER_CERT set in TLS1.3 --- examples/client/client.c | 25 ++++++++++++++++++------- src/internal.c | 3 ++- tests/test-fails.conf | 11 +++++++++++ tests/test-tls13.conf | 9 --------- 4 files changed, 31 insertions(+), 17 deletions(-) diff --git a/examples/client/client.c b/examples/client/client.c index 6c8cf5013..ab4f7ae5c 100644 --- a/examples/client/client.c +++ b/examples/client/client.c @@ -831,8 +831,8 @@ static void ClientWrite(WOLFSSL* ssl, char* msg, int msgSz, const char* str) } } -static void ClientRead(WOLFSSL* ssl, char* reply, int replyLen, int mustRead, - const char* str) +static int ClientRead(WOLFSSL* ssl, char* reply, int replyLen, int mustRead, + const char* str, int exitWithRet) { int ret, err; char buffer[WOLFSSL_MAX_ERROR_SZ]; @@ -853,7 +853,12 @@ static void ClientRead(WOLFSSL* ssl, char* reply, int replyLen, int mustRead, if (err != WOLFSSL_ERROR_WANT_READ) { printf("SSL_read reply error %d, %s\n", err, wolfSSL_ERR_error_string(err, buffer)); - err_sys("SSL_read failed"); + if (!exitWithRet) { + err_sys("SSL_read failed"); + } + else { + break; + } } } @@ -874,6 +879,8 @@ static void ClientRead(WOLFSSL* ssl, char* reply, int replyLen, int mustRead, reply[ret] = 0; printf("%s%s\n", str, reply); } + + return err; } @@ -3095,14 +3102,18 @@ THREAD_RETURN WOLFSSL_THREAD client_test(void* args) ClientWrite(ssl, msg, msgSz, ""); - ClientRead(ssl, reply, sizeof(reply)-1, 1, ""); + err = ClientRead(ssl, reply, sizeof(reply)-1, 1, "", exitWithRet); + if (exitWithRet && (err != 0)) { + ((func_args*)args)->return_code = err; + goto exit; + } #if defined(WOLFSSL_TLS13) if (updateKeysIVs || postHandAuth) ClientWrite(ssl, msg, msgSz, ""); #endif if (sendGET) { /* get html */ - ClientRead(ssl, reply, sizeof(reply)-1, 0, ""); + (void)ClientRead(ssl, reply, sizeof(reply)-1, 0, "", 0); } #ifndef NO_SESSION_CACHE @@ -3353,8 +3364,8 @@ THREAD_RETURN WOLFSSL_THREAD client_test(void* args) ClientWrite(sslResume, resumeMsg, resumeSz, " resume"); - ClientRead(sslResume, reply, sizeof(reply)-1, sendGET, - "Server resume: "); + (void)ClientRead(sslResume, reply, sizeof(reply)-1, sendGET, + "Server resume: ", 0); /* try to send session break */ ClientWrite(sslResume, msg, msgSz, " resume 2"); diff --git a/src/internal.c b/src/internal.c index fbdbb13a0..0aaee32a1 100644 --- a/src/internal.c +++ b/src/internal.c @@ -10663,7 +10663,8 @@ int ProcessPeerCerts(WOLFSSL* ssl, byte* input, word32* inOutIdx, args->count = args->totalCerts; args->certIdx = 0; /* select peer cert (first one) */ - if (args->count == 0 && ssl->options.mutualAuth && + if (args->count == 0 && (ssl->options.mutualAuth || + (ssl->options.failNoCert && IsAtLeastTLSv1_3(ssl->version))) && ssl->options.side == WOLFSSL_SERVER_END) { ret = NO_PEER_CERT; DoCertFatalAlert(ssl, ret); diff --git a/tests/test-fails.conf b/tests/test-fails.conf index d8ea91fd4..d1dd44417 100644 --- a/tests/test-fails.conf +++ b/tests/test-fails.conf @@ -177,3 +177,14 @@ # client send alert on no mutual authentication -v 3 -x + +# server TLSv1.3 fail on no client certificate +# server always sets WOLFSSL_VERIFY_FAIL_IF_NO_PEER_CERT unless using -d +-v 4 +-l TLS13-AES128-GCM-SHA256 + +# client TLSv1.3 no client certificate +-v 4 +-l TLS13-AES128-GCM-SHA256 +-x + diff --git a/tests/test-tls13.conf b/tests/test-tls13.conf index c75b27fe1..3f87cc091 100644 --- a/tests/test-tls13.conf +++ b/tests/test-tls13.conf @@ -135,15 +135,6 @@ -v 4 -l TLS13-AES128-GCM-SHA256 -# client TLSv1.3 no client certificate --v 4 --l TLS13-AES128-GCM-SHA256 --x - -# server TLSv1.3 --v 4 --l TLS13-AES128-GCM-SHA256 - # client TLSv1.3 DH key exchange -v 4 -l TLS13-AES128-GCM-SHA256 From 1e726e19a464d09d7d4064bee3f55a24cb2cc297 Mon Sep 17 00:00:00 2001 From: David Garske Date: Mon, 27 Apr 2020 06:48:41 -0700 Subject: [PATCH 060/298] Fix for XMALLOC cast. --- wolfcrypt/test/test.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wolfcrypt/test/test.c b/wolfcrypt/test/test.c index 17020f224..0f495862e 100644 --- a/wolfcrypt/test/test.c +++ b/wolfcrypt/test/test.c @@ -1322,7 +1322,7 @@ static int _SaveDerAndPem(const byte* der, int derSz, if (pemSz < 0) { return pemSz; } - pem = XMALLOC(pemSz, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + pem = (byte*)XMALLOC(pemSz, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); if (pem == NULL) { return MEMORY_E; } From 01a6dded7241be347543ec610e97a7b5c501bc70 Mon Sep 17 00:00:00 2001 From: Juliusz Sosinowicz Date: Mon, 27 Apr 2020 13:35:51 +0200 Subject: [PATCH 061/298] Fix AES-GCM in EVP layer to have compatiblity with OpenSSL - Tag checking in AES-GCM is done in Final call - Reset `WOLFSSL_EVP_CIPHER_CTX` structure after Final call - Don't zero `ctx->authTag` struct in Init call so that user can get the AES-GCM tag using `EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_GET_TAG, AES_BLOCK_SIZE, tag)` - `ctx->authTag` is only zeroed before authenticated, non-confidential data Update call since this means we are entering a new Udate-Final cycle. This doesn't need to be done in the decrypt case since the tag should be supplied by the user before the final call using `EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_SET_TAG, AES_BLOCK_SIZE, tag)` --- configure.ac | 4 +- tests/api.c | 7 +- wolfcrypt/src/evp.c | 246 +++++++++++++++++++++---------------- wolfssl/openssl/evp.h | 4 + wolfssl/openssl/opensslv.h | 4 +- 5 files changed, 151 insertions(+), 114 deletions(-) diff --git a/configure.ac b/configure.ac index ff6b79f86..b67cc7a74 100644 --- a/configure.ac +++ b/configure.ac @@ -440,7 +440,7 @@ AC_ARG_ENABLE([mcast], # List of open source project defines using our openssl compatibility layer: # openssh (--enable-openssh) WOLFSSL_OPENSSH -# openvpn (--enable-openvpn) +# openvpn (--enable-openvpn) WOLFSSL_OPENVPN # nginix (--enable-nginx) WOLFSSL_NGINX # haproxy (--enable-haproxy) WOLFSSL_HAPROXY # wpa_supplicant (--enable-wpas) WOLFSSL_WPAS @@ -3543,7 +3543,7 @@ fi if test "$ENABLED_OPENVPN" = "yes" then - AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_DES_ECB -DHAVE_EX_DATA -DWOLFSSL_KEY_GEN" + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_DES_ECB -DHAVE_EX_DATA -DWOLFSSL_KEY_GEN -DWOLFSSL_OPENVPN" fi diff --git a/tests/api.c b/tests/api.c index b69812605..3cf7d71b5 100644 --- a/tests/api.c +++ b/tests/api.c @@ -30844,10 +30844,10 @@ static void test_wolfssl_EVP_aes_gcm(void) } AssertIntEQ(1, EVP_DecryptUpdate(&de[i], NULL, &len, aad, aadSz)); - AssertIntEQ(1, EVP_CIPHER_CTX_ctrl(&de[i], EVP_CTRL_GCM_SET_TAG, AES_BLOCK_SIZE, tag)); AssertIntEQ(1, EVP_DecryptUpdate(&de[i], decryptedtxt, &len, ciphertxt, ciphertxtSz)); decryptedtxtSz = len; - AssertIntGT(EVP_DecryptFinal_ex(&de[i], decryptedtxt, &len), 0); + AssertIntEQ(1, EVP_CIPHER_CTX_ctrl(&de[i], EVP_CTRL_GCM_SET_TAG, AES_BLOCK_SIZE, tag)); + AssertIntEQ(1, EVP_DecryptFinal_ex(&de[i], decryptedtxt, &len)); decryptedtxtSz += len; AssertIntEQ(ciphertxtSz, decryptedtxtSz); AssertIntEQ(0, XMEMCMP(plaintxt, decryptedtxt, decryptedtxtSz)); @@ -30857,7 +30857,8 @@ static void test_wolfssl_EVP_aes_gcm(void) AssertIntEQ(1, EVP_DecryptUpdate(&de[i], NULL, &len, aad, aadSz)); AssertIntEQ(1, EVP_CIPHER_CTX_ctrl(&de[i], EVP_CTRL_GCM_SET_TAG, AES_BLOCK_SIZE, tag)); /* fail due to wrong tag */ - AssertIntEQ(0, EVP_DecryptUpdate(&de[i], decryptedtxt, &len, ciphertxt, ciphertxtSz)); + AssertIntEQ(1, EVP_DecryptUpdate(&de[i], decryptedtxt, &len, ciphertxt, ciphertxtSz)); + AssertIntEQ(0, EVP_DecryptFinal_ex(&de[i], decryptedtxt, &len)); AssertIntEQ(0, len); } printf(resultFmt, passed); diff --git a/wolfcrypt/src/evp.c b/wolfcrypt/src/evp.c index d9207900c..033ba9074 100644 --- a/wolfcrypt/src/evp.c +++ b/wolfcrypt/src/evp.c @@ -417,47 +417,6 @@ static int evpCipherBlock(WOLFSSL_EVP_CIPHER_CTX *ctx, ret = wc_AesCbcDecrypt(&ctx->cipher.aes, out, in, inl); break; #endif - #if defined(HAVE_AESGCM) - case AES_128_GCM_TYPE: - case AES_192_GCM_TYPE: - case AES_256_GCM_TYPE: - if (ctx->enc) { - if (out){ - /* encrypt confidential data*/ - ret = wc_AesGcmEncrypt(&ctx->cipher.aes, out, in, inl, - ctx->iv, ctx->ivSz, ctx->authTag, ctx->authTagSz, - NULL, 0); - } - else { - /* authenticated, non-confidential data */ - ret = wc_AesGcmEncrypt(&ctx->cipher.aes, NULL, NULL, 0, - ctx->iv, ctx->ivSz, ctx->authTag, ctx->authTagSz, - in, inl); - /* Reset partial authTag error for AAD*/ - if (ret == AES_GCM_AUTH_E) - ret = 0; - } - } - else { - if (out){ - /* decrypt confidential data*/ - ret = wc_AesGcmDecrypt(&ctx->cipher.aes, out, in, inl, - ctx->iv, ctx->ivSz, ctx->authTag, ctx->authTagSz, - NULL, 0); - } - else { - /* authenticated, non-confidential data*/ - ret = wc_AesGcmDecrypt(&ctx->cipher.aes, NULL, NULL, 0, - ctx->iv, ctx->ivSz, - ctx->authTag, ctx->authTagSz, - in, inl); - /* Reset partial authTag error for AAD*/ - if (ret == AES_GCM_AUTH_E) - ret = 0; - } - } - break; - #endif #if defined(WOLFSSL_AES_COUNTER) case AES_128_CTR_TYPE: case AES_192_CTR_TYPE: @@ -575,10 +534,60 @@ static int wolfSSL_EVP_CipherUpdate_GCM(WOLFSSL_EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl, const unsigned char *in, int inl) { - /* process blocks */ - if (evpCipherBlock(ctx, out, in, inl) == 0) - return WOLFSSL_FAILURE; + int ret = 0; + *outl = inl; + if (ctx->enc) { + if (out) { + /* encrypt confidential data*/ + ret = wc_AesGcmEncrypt(&ctx->cipher.aes, out, in, inl, + ctx->iv, ctx->ivSz, ctx->authTag, ctx->authTagSz, + NULL, 0); + } + else { + /* authenticated, non-confidential data */ + XMEMSET(ctx->authTag, 0, ctx->authTagSz); + ret = wc_AesGcmEncrypt(&ctx->cipher.aes, NULL, NULL, 0, + ctx->iv, ctx->ivSz, ctx->authTag, ctx->authTagSz, + in, inl); + /* Reset partial authTag error for AAD*/ + if (ret == AES_GCM_AUTH_E) + ret = 0; + } + } + else { + if (out) { + byte* tmp; + tmp = (byte*)XREALLOC(ctx->gcmDecryptBuffer, + ctx->gcmDecryptBufferLen + inl, NULL, + DYNAMIC_TYPE_OPENSSL); + if (tmp) { + XMEMCPY(tmp + ctx->gcmDecryptBufferLen, in, inl); + ctx->gcmDecryptBufferLen += inl; + ctx->gcmDecryptBuffer = tmp; + *outl = 0; + } + else { + ret = WOLFSSL_FAILURE; + } + } + else { + /* authenticated, non-confidential data*/ + ret = wc_AesGcmDecrypt(&ctx->cipher.aes, NULL, NULL, 0, + ctx->iv, ctx->ivSz, + ctx->authTag, ctx->authTagSz, + in, inl); + /* Reset partial authTag error for AAD*/ + if (ret == AES_GCM_AUTH_E) + ret = 0; + } + } + + if (ret != 0) { + *outl = 0; + return WOLFSSL_FAILURE; + } + return WOLFSSL_SUCCESS; } #endif @@ -739,76 +748,95 @@ int wolfSSL_EVP_CipherFinal(WOLFSSL_EVP_CIPHER_CTX *ctx, return WOLFSSL_FAILURE; WOLFSSL_ENTER("wolfSSL_EVP_CipherFinal"); - + switch (ctx->cipherType) { #if !defined(NO_AES) && defined(HAVE_AESGCM) - switch (ctx->cipherType) { - case AES_128_GCM_TYPE: - case AES_192_GCM_TYPE: - case AES_256_GCM_TYPE: - *outl = 0; - /* Clear IV, since IV reuse is not recommended for AES GCM. */ - XMEMSET(ctx->iv, 0, AES_BLOCK_SIZE); - return WOLFSSL_SUCCESS; - default: - /* fall-through */ - break; - } -#endif /* !NO_AES && HAVE_AESGCM */ + case AES_128_GCM_TYPE: + case AES_192_GCM_TYPE: + case AES_256_GCM_TYPE: + if (!ctx->enc && ctx->gcmDecryptBuffer && ctx->gcmDecryptBufferLen > 0) { + /* decrypt confidential data*/ + ret = wc_AesGcmDecrypt(&ctx->cipher.aes, out, + ctx->gcmDecryptBuffer, ctx->gcmDecryptBufferLen, + ctx->iv, ctx->ivSz, ctx->authTag, ctx->authTagSz, + NULL, 0); + if (ret == 0) { + ret = WOLFSSL_SUCCESS; + *outl = ctx->gcmDecryptBufferLen; + } + else { + ret = WOLFSSL_FAILURE; + *outl = 0; + } - if (!out) - return WOLFSSL_FAILURE; - - if (ctx->flags & WOLFSSL_EVP_CIPH_NO_PADDING) { - if (ctx->bufUsed != 0) return WOLFSSL_FAILURE; - *outl = 0; - } - else if (ctx->enc) { - if (ctx->block_size == 1) { - *outl = 0; - } - else if ((ctx->bufUsed >= 0) && (ctx->block_size != 1)) { - padBlock(ctx); - PRINT_BUF(ctx->buf, ctx->block_size); - if (evpCipherBlock(ctx, out, ctx->buf, ctx->block_size) == 0) { - WOLFSSL_MSG("Final Cipher Block failed"); - ret = WOLFSSL_FAILURE; + XFREE(ctx->gcmDecryptBuffer, NULL, DYNAMIC_TYPE_OPENSSL); + ctx->gcmDecryptBuffer = NULL; + ctx->gcmDecryptBufferLen = 0; } else { - PRINT_BUF(out, ctx->block_size); - *outl = ctx->block_size; + *outl = 0; } - } - } - else { - if (ctx->block_size == 1) { - *outl = 0; - } - else if ((ctx->bufUsed % ctx->block_size) != 0) { - *outl = 0; - /* not enough padding for decrypt */ - WOLFSSL_MSG("Final Cipher Block not enough padding"); - ret = WOLFSSL_FAILURE; - } - else if (ctx->lastUsed) { - PRINT_BUF(ctx->lastBlock, ctx->block_size); - if ((fl = checkPad(ctx, ctx->lastBlock)) >= 0) { - XMEMCPY(out, ctx->lastBlock, fl); - *outl = fl; - if (ctx->lastUsed == 0 && ctx->bufUsed == 0) { - /* return error in cases where the block length is incorrect */ - WOLFSSL_MSG("Final Cipher Block bad length"); - ret = WOLFSSL_FAILURE; + /* Clear IV, since IV reuse is not recommended for AES GCM. */ + XMEMSET(ctx->iv, 0, AES_BLOCK_SIZE); + break; +#endif /* !NO_AES && HAVE_AESGCM */ + default: + if (!out) + return WOLFSSL_FAILURE; + + if (ctx->flags & WOLFSSL_EVP_CIPH_NO_PADDING) { + if (ctx->bufUsed != 0) return WOLFSSL_FAILURE; + *outl = 0; + } + else if (ctx->enc) { + if (ctx->block_size == 1) { + *outl = 0; + } + else if ((ctx->bufUsed >= 0) && (ctx->block_size != 1)) { + padBlock(ctx); + PRINT_BUF(ctx->buf, ctx->block_size); + if (evpCipherBlock(ctx, out, ctx->buf, ctx->block_size) == 0) { + WOLFSSL_MSG("Final Cipher Block failed"); + ret = WOLFSSL_FAILURE; + } + else { + PRINT_BUF(out, ctx->block_size); + *outl = ctx->block_size; + } } } else { - ret = WOLFSSL_FAILURE; + if (ctx->block_size == 1) { + *outl = 0; + } + else if ((ctx->bufUsed % ctx->block_size) != 0) { + *outl = 0; + /* not enough padding for decrypt */ + WOLFSSL_MSG("Final Cipher Block not enough padding"); + ret = WOLFSSL_FAILURE; + } + else if (ctx->lastUsed) { + PRINT_BUF(ctx->lastBlock, ctx->block_size); + if ((fl = checkPad(ctx, ctx->lastBlock)) >= 0) { + XMEMCPY(out, ctx->lastBlock, fl); + *outl = fl; + if (ctx->lastUsed == 0 && ctx->bufUsed == 0) { + /* return error in cases where the block length is incorrect */ + WOLFSSL_MSG("Final Cipher Block bad length"); + ret = WOLFSSL_FAILURE; + } + } + else { + ret = WOLFSSL_FAILURE; + } + } + else if (ctx->lastUsed == 0 && ctx->bufUsed == 0) { + /* return error in cases where the block length is incorrect */ + ret = WOLFSSL_FAILURE; + } } - } - else if (ctx->lastUsed == 0 && ctx->bufUsed == 0) { - /* return error in cases where the block length is incorrect */ - ret = WOLFSSL_FAILURE; - } + break; } + if (ret == WOLFSSL_SUCCESS) { /* reset cipher state after final */ wolfSSL_EVP_CipherInit(ctx, NULL, NULL, NULL, -1); @@ -4010,6 +4038,13 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) if (ctx) { ctx->cipherType = WOLFSSL_EVP_CIPH_TYPE_INIT; /* not yet initialized */ ctx->keyLen = 0; +#ifdef HAVE_AESGCM + if (ctx->gcmDecryptBuffer) { + XFREE(ctx->gcmDecryptBuffer, NULL, DYNAMIC_TYPE_OPENSSL); + ctx->gcmDecryptBuffer = NULL; + } + ctx->gcmDecryptBufferLen = 0; +#endif } return WOLFSSL_SUCCESS; @@ -4236,7 +4271,6 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) ctx->authTagSz = AES_BLOCK_SIZE; ctx->ivSz = GCM_NONCE_MID_SZ; - XMEMSET(ctx->authTag, 0, ctx->authTagSz); if (key && wc_AesGcmSetKey(&ctx->cipher.aes, key, ctx->keyLen)) { WOLFSSL_MSG("wc_AesGcmSetKey() failed"); return WOLFSSL_FAILURE; @@ -4261,7 +4295,6 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) ctx->authTagSz = AES_BLOCK_SIZE; ctx->ivSz = GCM_NONCE_MID_SZ; - XMEMSET(ctx->authTag, 0, ctx->authTagSz); if (key && wc_AesGcmSetKey(&ctx->cipher.aes, key, ctx->keyLen)) { WOLFSSL_MSG("wc_AesGcmSetKey() failed"); return WOLFSSL_FAILURE; @@ -4286,7 +4319,6 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) ctx->authTagSz = AES_BLOCK_SIZE; ctx->ivSz = GCM_NONCE_MID_SZ; - XMEMSET(ctx->authTag, 0, ctx->authTagSz); if (key && wc_AesGcmSetKey(&ctx->cipher.aes, key, ctx->keyLen)) { WOLFSSL_MSG("wc_AesGcmSetKey() failed"); return WOLFSSL_FAILURE; diff --git a/wolfssl/openssl/evp.h b/wolfssl/openssl/evp.h index 3f9026ac3..f7fff7e47 100644 --- a/wolfssl/openssl/evp.h +++ b/wolfssl/openssl/evp.h @@ -350,6 +350,10 @@ struct WOLFSSL_EVP_CIPHER_CTX { defined(HAVE_AESGCM) || defined (WOLFSSL_AES_XTS) #define HAVE_WOLFSSL_EVP_CIPHER_CTX_IV int ivSz; +#ifdef HAVE_AESGCM + byte* gcmDecryptBuffer; + int gcmDecryptBufferLen; +#endif ALIGN16 unsigned char authTag[AES_BLOCK_SIZE]; int authTagSz; #endif diff --git a/wolfssl/openssl/opensslv.h b/wolfssl/openssl/opensslv.h index 1ec8db137..7f82800d3 100644 --- a/wolfssl/openssl/opensslv.h +++ b/wolfssl/openssl/opensslv.h @@ -31,10 +31,10 @@ #define OPENSSL_VERSION_NUMBER 0x10100000L #elif defined(OPENSSL_ALL) || defined(HAVE_STUNNEL) || defined(HAVE_LIGHTY) || \ defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY) || \ - defined(WOLFSSL_OPENSSH) || defined(WOLFSSL_QT) + defined(WOLFSSL_OPENSSH) || defined(WOLFSSL_QT) || defined(WOLFSSL_OPENVPN) /* version number can be increased for Lighty after compatibility for ECDH is added */ - #define OPENSSL_VERSION_NUMBER 0x1000100fL + #define OPENSSL_VERSION_NUMBER 0x10001040L #else #define OPENSSL_VERSION_NUMBER 0x0090810fL #endif From 327cdefc249578136655a074dc438baa80e6549b Mon Sep 17 00:00:00 2001 From: David Garske Date: Mon, 27 Apr 2020 08:57:19 -0700 Subject: [PATCH 062/298] Fix for SP math with `RSA_LOW_MEM`, which was broken in PR #2892. --- wolfcrypt/src/sp_arm32.c | 351 ++++++++++++++++++------------------ wolfcrypt/src/sp_arm64.c | 351 ++++++++++++++++++------------------ wolfcrypt/src/sp_armthumb.c | 351 ++++++++++++++++++------------------ wolfcrypt/src/sp_cortexm.c | 351 ++++++++++++++++++------------------ 4 files changed, 696 insertions(+), 708 deletions(-) diff --git a/wolfcrypt/src/sp_arm32.c b/wolfcrypt/src/sp_arm32.c index 4540dde65..b33143218 100644 --- a/wolfcrypt/src/sp_arm32.c +++ b/wolfcrypt/src/sp_arm32.c @@ -7489,63 +7489,6 @@ int sp_RsaPublic_2048(const byte* in, word32 inLen, mp_int* em, mp_int* mm, return err; } -#if defined(SP_RSA_PRIVATE_EXP_D) || defined(RSA_LOW_MEM) - sp_digit* a; - sp_digit* d = NULL; - sp_digit* m; - sp_digit* r; - int err = MP_OKAY; - - (void)pm; - (void)qm; - (void)dpm; - (void)dqm; - (void)qim; - - if (*outLen < 256U) { - err = MP_TO_E; - } - if (err == MP_OKAY) { - if (mp_count_bits(dm) > 2048) { - err = MP_READ_E; - } - if (inLen > 256) { - err = MP_READ_E; - } - if (mp_count_bits(mm) != 2048) { - err = MP_READ_E; - } - } - - if (err == MP_OKAY) { - d = (sp_digit*)XMALLOC(sizeof(sp_digit) * 64 * 4, NULL, - DYNAMIC_TYPE_RSA); - if (d == NULL) { - err = MEMORY_E; - } - } - if (err == MP_OKAY) { - a = d + 64; - m = a + 128; - r = a; - - sp_2048_from_bin(a, 64, in, inLen); - sp_2048_from_mp(d, 64, dm); - sp_2048_from_mp(m, 64, mm); - err = sp_2048_mod_exp_64(r, a, d, 2048, m, 0); - } - if (err == MP_OKAY) { - sp_2048_to_bin(r, out); - *outLen = 256; - } - - if (d != NULL) { - XMEMSET(d, 0, sizeof(sp_digit) * 64); - XFREE(d, NULL, DYNAMIC_TYPE_RSA); - } - - return err; -#else #ifndef WOLFSSL_RSA_PUBLIC_ONLY /* Conditionally add a and b using the mask m. * m is -1 to add and 0 when not. @@ -7774,6 +7717,63 @@ int sp_RsaPrivate_2048(const byte* in, word32 inLen, mp_int* dm, mp_int* pm, mp_int* qm, mp_int* dpm, mp_int* dqm, mp_int* qim, mp_int* mm, byte* out, word32* outLen) { +#if defined(SP_RSA_PRIVATE_EXP_D) || defined(RSA_LOW_MEM) + sp_digit* a; + sp_digit* d = NULL; + sp_digit* m; + sp_digit* r; + int err = MP_OKAY; + + (void)pm; + (void)qm; + (void)dpm; + (void)dqm; + (void)qim; + + if (*outLen < 256U) { + err = MP_TO_E; + } + if (err == MP_OKAY) { + if (mp_count_bits(dm) > 2048) { + err = MP_READ_E; + } + if (inLen > 256) { + err = MP_READ_E; + } + if (mp_count_bits(mm) != 2048) { + err = MP_READ_E; + } + } + + if (err == MP_OKAY) { + d = (sp_digit*)XMALLOC(sizeof(sp_digit) * 64 * 4, NULL, + DYNAMIC_TYPE_RSA); + if (d == NULL) { + err = MEMORY_E; + } + } + if (err == MP_OKAY) { + a = d + 64; + m = a + 128; + r = a; + + sp_2048_from_bin(a, 64, in, inLen); + sp_2048_from_mp(d, 64, dm); + sp_2048_from_mp(m, 64, mm); + err = sp_2048_mod_exp_64(r, a, d, 2048, m, 0); + } + if (err == MP_OKAY) { + sp_2048_to_bin(r, out); + *outLen = 256; + } + + if (d != NULL) { + XMEMSET(d, 0, sizeof(sp_digit) * 64); + XFREE(d, NULL, DYNAMIC_TYPE_RSA); + } + + return err; +#else #if (!defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SMALL_STACK)) || defined(WOLFSSL_SP_NO_MALLOC) sp_digit a[64 * 2]; sp_digit p[32], q[32], dp[32]; @@ -7869,11 +7869,10 @@ int sp_RsaPrivate_2048(const byte* in, word32 inLen, mp_int* dm, XMEMSET(q, 0, sizeof(q)); XMEMSET(dp, 0, sizeof(dp)); #endif - +#endif /* SP_RSA_PRIVATE_EXP_D || RSA_LOW_MEM */ return err; } #endif /* WOLFSSL_RSA_PUBLIC_ONLY */ -#endif /* SP_RSA_PRIVATE_EXP_D || RSA_LOW_MEM */ #endif /* WOLFSSL_HAVE_SP_RSA */ #if defined(WOLFSSL_HAVE_SP_DH) || (defined(WOLFSSL_HAVE_SP_RSA) && \ !defined(WOLFSSL_RSA_PUBLIC_ONLY)) @@ -19035,63 +19034,6 @@ int sp_RsaPublic_3072(const byte* in, word32 inLen, mp_int* em, mp_int* mm, return err; } -#if defined(SP_RSA_PRIVATE_EXP_D) || defined(RSA_LOW_MEM) - sp_digit* a; - sp_digit* d = NULL; - sp_digit* m; - sp_digit* r; - int err = MP_OKAY; - - (void)pm; - (void)qm; - (void)dpm; - (void)dqm; - (void)qim; - - if (*outLen < 384U) { - err = MP_TO_E; - } - if (err == MP_OKAY) { - if (mp_count_bits(dm) > 3072) { - err = MP_READ_E; - } - if (inLen > 384) { - err = MP_READ_E; - } - if (mp_count_bits(mm) != 3072) { - err = MP_READ_E; - } - } - - if (err == MP_OKAY) { - d = (sp_digit*)XMALLOC(sizeof(sp_digit) * 96 * 4, NULL, - DYNAMIC_TYPE_RSA); - if (d == NULL) { - err = MEMORY_E; - } - } - if (err == MP_OKAY) { - a = d + 96; - m = a + 192; - r = a; - - sp_3072_from_bin(a, 96, in, inLen); - sp_3072_from_mp(d, 96, dm); - sp_3072_from_mp(m, 96, mm); - err = sp_3072_mod_exp_96(r, a, d, 3072, m, 0); - } - if (err == MP_OKAY) { - sp_3072_to_bin(r, out); - *outLen = 384; - } - - if (d != NULL) { - XMEMSET(d, 0, sizeof(sp_digit) * 96); - XFREE(d, NULL, DYNAMIC_TYPE_RSA); - } - - return err; -#else #ifndef WOLFSSL_RSA_PUBLIC_ONLY /* Conditionally add a and b using the mask m. * m is -1 to add and 0 when not. @@ -19400,6 +19342,63 @@ int sp_RsaPrivate_3072(const byte* in, word32 inLen, mp_int* dm, mp_int* pm, mp_int* qm, mp_int* dpm, mp_int* dqm, mp_int* qim, mp_int* mm, byte* out, word32* outLen) { +#if defined(SP_RSA_PRIVATE_EXP_D) || defined(RSA_LOW_MEM) + sp_digit* a; + sp_digit* d = NULL; + sp_digit* m; + sp_digit* r; + int err = MP_OKAY; + + (void)pm; + (void)qm; + (void)dpm; + (void)dqm; + (void)qim; + + if (*outLen < 384U) { + err = MP_TO_E; + } + if (err == MP_OKAY) { + if (mp_count_bits(dm) > 3072) { + err = MP_READ_E; + } + if (inLen > 384) { + err = MP_READ_E; + } + if (mp_count_bits(mm) != 3072) { + err = MP_READ_E; + } + } + + if (err == MP_OKAY) { + d = (sp_digit*)XMALLOC(sizeof(sp_digit) * 96 * 4, NULL, + DYNAMIC_TYPE_RSA); + if (d == NULL) { + err = MEMORY_E; + } + } + if (err == MP_OKAY) { + a = d + 96; + m = a + 192; + r = a; + + sp_3072_from_bin(a, 96, in, inLen); + sp_3072_from_mp(d, 96, dm); + sp_3072_from_mp(m, 96, mm); + err = sp_3072_mod_exp_96(r, a, d, 3072, m, 0); + } + if (err == MP_OKAY) { + sp_3072_to_bin(r, out); + *outLen = 384; + } + + if (d != NULL) { + XMEMSET(d, 0, sizeof(sp_digit) * 96); + XFREE(d, NULL, DYNAMIC_TYPE_RSA); + } + + return err; +#else #if (!defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SMALL_STACK)) || defined(WOLFSSL_SP_NO_MALLOC) sp_digit a[96 * 2]; sp_digit p[48], q[48], dp[48]; @@ -19495,11 +19494,10 @@ int sp_RsaPrivate_3072(const byte* in, word32 inLen, mp_int* dm, XMEMSET(q, 0, sizeof(q)); XMEMSET(dp, 0, sizeof(dp)); #endif - +#endif /* SP_RSA_PRIVATE_EXP_D || RSA_LOW_MEM */ return err; } #endif /* WOLFSSL_RSA_PUBLIC_ONLY */ -#endif /* SP_RSA_PRIVATE_EXP_D || RSA_LOW_MEM */ #endif /* WOLFSSL_HAVE_SP_RSA */ #if defined(WOLFSSL_HAVE_SP_DH) || (defined(WOLFSSL_HAVE_SP_RSA) && \ !defined(WOLFSSL_RSA_PUBLIC_ONLY)) @@ -71655,63 +71653,6 @@ int sp_RsaPublic_4096(const byte* in, word32 inLen, mp_int* em, mp_int* mm, return err; } -#if defined(SP_RSA_PRIVATE_EXP_D) || defined(RSA_LOW_MEM) - sp_digit* a; - sp_digit* d = NULL; - sp_digit* m; - sp_digit* r; - int err = MP_OKAY; - - (void)pm; - (void)qm; - (void)dpm; - (void)dqm; - (void)qim; - - if (*outLen < 512U) { - err = MP_TO_E; - } - if (err == MP_OKAY) { - if (mp_count_bits(dm) > 4096) { - err = MP_READ_E; - } - if (inLen > 512) { - err = MP_READ_E; - } - if (mp_count_bits(mm) != 4096) { - err = MP_READ_E; - } - } - - if (err == MP_OKAY) { - d = (sp_digit*)XMALLOC(sizeof(sp_digit) * 128 * 4, NULL, - DYNAMIC_TYPE_RSA); - if (d == NULL) { - err = MEMORY_E; - } - } - if (err == MP_OKAY) { - a = d + 128; - m = a + 256; - r = a; - - sp_4096_from_bin(a, 128, in, inLen); - sp_4096_from_mp(d, 128, dm); - sp_4096_from_mp(m, 128, mm); - err = sp_4096_mod_exp_128(r, a, d, 4096, m, 0); - } - if (err == MP_OKAY) { - sp_4096_to_bin(r, out); - *outLen = 512; - } - - if (d != NULL) { - XMEMSET(d, 0, sizeof(sp_digit) * 128); - XFREE(d, NULL, DYNAMIC_TYPE_RSA); - } - - return err; -#else #ifndef WOLFSSL_RSA_PUBLIC_ONLY /* Conditionally add a and b using the mask m. * m is -1 to add and 0 when not. @@ -72100,6 +72041,63 @@ int sp_RsaPrivate_4096(const byte* in, word32 inLen, mp_int* dm, mp_int* pm, mp_int* qm, mp_int* dpm, mp_int* dqm, mp_int* qim, mp_int* mm, byte* out, word32* outLen) { +#if defined(SP_RSA_PRIVATE_EXP_D) || defined(RSA_LOW_MEM) + sp_digit* a; + sp_digit* d = NULL; + sp_digit* m; + sp_digit* r; + int err = MP_OKAY; + + (void)pm; + (void)qm; + (void)dpm; + (void)dqm; + (void)qim; + + if (*outLen < 512U) { + err = MP_TO_E; + } + if (err == MP_OKAY) { + if (mp_count_bits(dm) > 4096) { + err = MP_READ_E; + } + if (inLen > 512) { + err = MP_READ_E; + } + if (mp_count_bits(mm) != 4096) { + err = MP_READ_E; + } + } + + if (err == MP_OKAY) { + d = (sp_digit*)XMALLOC(sizeof(sp_digit) * 128 * 4, NULL, + DYNAMIC_TYPE_RSA); + if (d == NULL) { + err = MEMORY_E; + } + } + if (err == MP_OKAY) { + a = d + 128; + m = a + 256; + r = a; + + sp_4096_from_bin(a, 128, in, inLen); + sp_4096_from_mp(d, 128, dm); + sp_4096_from_mp(m, 128, mm); + err = sp_4096_mod_exp_128(r, a, d, 4096, m, 0); + } + if (err == MP_OKAY) { + sp_4096_to_bin(r, out); + *outLen = 512; + } + + if (d != NULL) { + XMEMSET(d, 0, sizeof(sp_digit) * 128); + XFREE(d, NULL, DYNAMIC_TYPE_RSA); + } + + return err; +#else #if (!defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SMALL_STACK)) || defined(WOLFSSL_SP_NO_MALLOC) sp_digit a[128 * 2]; sp_digit p[64], q[64], dp[64]; @@ -72195,11 +72193,10 @@ int sp_RsaPrivate_4096(const byte* in, word32 inLen, mp_int* dm, XMEMSET(q, 0, sizeof(q)); XMEMSET(dp, 0, sizeof(dp)); #endif - +#endif /* SP_RSA_PRIVATE_EXP_D || RSA_LOW_MEM */ return err; } #endif /* WOLFSSL_RSA_PUBLIC_ONLY */ -#endif /* SP_RSA_PRIVATE_EXP_D || RSA_LOW_MEM */ #endif /* WOLFSSL_HAVE_SP_RSA */ #if defined(WOLFSSL_HAVE_SP_DH) || (defined(WOLFSSL_HAVE_SP_RSA) && \ !defined(WOLFSSL_RSA_PUBLIC_ONLY)) diff --git a/wolfcrypt/src/sp_arm64.c b/wolfcrypt/src/sp_arm64.c index ebebe2a55..370a63dbe 100644 --- a/wolfcrypt/src/sp_arm64.c +++ b/wolfcrypt/src/sp_arm64.c @@ -4991,63 +4991,6 @@ int sp_RsaPublic_2048(const byte* in, word32 inLen, mp_int* em, mp_int* mm, return err; } -#if defined(SP_RSA_PRIVATE_EXP_D) || defined(RSA_LOW_MEM) - sp_digit* a; - sp_digit* d = NULL; - sp_digit* m; - sp_digit* r; - int err = MP_OKAY; - - (void)pm; - (void)qm; - (void)dpm; - (void)dqm; - (void)qim; - - if (*outLen < 256U) { - err = MP_TO_E; - } - if (err == MP_OKAY) { - if (mp_count_bits(dm) > 2048) { - err = MP_READ_E; - } - if (inLen > 256) { - err = MP_READ_E; - } - if (mp_count_bits(mm) != 2048) { - err = MP_READ_E; - } - } - - if (err == MP_OKAY) { - d = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32 * 4, NULL, - DYNAMIC_TYPE_RSA); - if (d == NULL) { - err = MEMORY_E; - } - } - if (err == MP_OKAY) { - a = d + 32; - m = a + 64; - r = a; - - sp_2048_from_bin(a, 32, in, inLen); - sp_2048_from_mp(d, 32, dm); - sp_2048_from_mp(m, 32, mm); - err = sp_2048_mod_exp_32(r, a, d, 2048, m, 0); - } - if (err == MP_OKAY) { - sp_2048_to_bin(r, out); - *outLen = 256; - } - - if (d != NULL) { - XMEMSET(d, 0, sizeof(sp_digit) * 32); - XFREE(d, NULL, DYNAMIC_TYPE_RSA); - } - - return err; -#else #ifndef WOLFSSL_RSA_PUBLIC_ONLY /* Conditionally add a and b using the mask m. * m is -1 to add and 0 when not. @@ -5172,6 +5115,63 @@ int sp_RsaPrivate_2048(const byte* in, word32 inLen, mp_int* dm, mp_int* pm, mp_int* qm, mp_int* dpm, mp_int* dqm, mp_int* qim, mp_int* mm, byte* out, word32* outLen) { +#if defined(SP_RSA_PRIVATE_EXP_D) || defined(RSA_LOW_MEM) + sp_digit* a; + sp_digit* d = NULL; + sp_digit* m; + sp_digit* r; + int err = MP_OKAY; + + (void)pm; + (void)qm; + (void)dpm; + (void)dqm; + (void)qim; + + if (*outLen < 256U) { + err = MP_TO_E; + } + if (err == MP_OKAY) { + if (mp_count_bits(dm) > 2048) { + err = MP_READ_E; + } + if (inLen > 256) { + err = MP_READ_E; + } + if (mp_count_bits(mm) != 2048) { + err = MP_READ_E; + } + } + + if (err == MP_OKAY) { + d = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32 * 4, NULL, + DYNAMIC_TYPE_RSA); + if (d == NULL) { + err = MEMORY_E; + } + } + if (err == MP_OKAY) { + a = d + 32; + m = a + 64; + r = a; + + sp_2048_from_bin(a, 32, in, inLen); + sp_2048_from_mp(d, 32, dm); + sp_2048_from_mp(m, 32, mm); + err = sp_2048_mod_exp_32(r, a, d, 2048, m, 0); + } + if (err == MP_OKAY) { + sp_2048_to_bin(r, out); + *outLen = 256; + } + + if (d != NULL) { + XMEMSET(d, 0, sizeof(sp_digit) * 32); + XFREE(d, NULL, DYNAMIC_TYPE_RSA); + } + + return err; +#else #if (!defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SMALL_STACK)) || defined(WOLFSSL_SP_NO_MALLOC) sp_digit a[32 * 2]; sp_digit p[16], q[16], dp[16]; @@ -5267,11 +5267,10 @@ int sp_RsaPrivate_2048(const byte* in, word32 inLen, mp_int* dm, XMEMSET(q, 0, sizeof(q)); XMEMSET(dp, 0, sizeof(dp)); #endif - +#endif /* SP_RSA_PRIVATE_EXP_D || RSA_LOW_MEM */ return err; } #endif /* WOLFSSL_RSA_PUBLIC_ONLY */ -#endif /* SP_RSA_PRIVATE_EXP_D || RSA_LOW_MEM */ #endif /* WOLFSSL_HAVE_SP_RSA */ #if defined(WOLFSSL_HAVE_SP_DH) || (defined(WOLFSSL_HAVE_SP_RSA) && \ !defined(WOLFSSL_RSA_PUBLIC_ONLY)) @@ -12695,63 +12694,6 @@ int sp_RsaPublic_3072(const byte* in, word32 inLen, mp_int* em, mp_int* mm, return err; } -#if defined(SP_RSA_PRIVATE_EXP_D) || defined(RSA_LOW_MEM) - sp_digit* a; - sp_digit* d = NULL; - sp_digit* m; - sp_digit* r; - int err = MP_OKAY; - - (void)pm; - (void)qm; - (void)dpm; - (void)dqm; - (void)qim; - - if (*outLen < 384U) { - err = MP_TO_E; - } - if (err == MP_OKAY) { - if (mp_count_bits(dm) > 3072) { - err = MP_READ_E; - } - if (inLen > 384) { - err = MP_READ_E; - } - if (mp_count_bits(mm) != 3072) { - err = MP_READ_E; - } - } - - if (err == MP_OKAY) { - d = (sp_digit*)XMALLOC(sizeof(sp_digit) * 48 * 4, NULL, - DYNAMIC_TYPE_RSA); - if (d == NULL) { - err = MEMORY_E; - } - } - if (err == MP_OKAY) { - a = d + 48; - m = a + 96; - r = a; - - sp_3072_from_bin(a, 48, in, inLen); - sp_3072_from_mp(d, 48, dm); - sp_3072_from_mp(m, 48, mm); - err = sp_3072_mod_exp_48(r, a, d, 3072, m, 0); - } - if (err == MP_OKAY) { - sp_3072_to_bin(r, out); - *outLen = 384; - } - - if (d != NULL) { - XMEMSET(d, 0, sizeof(sp_digit) * 48); - XFREE(d, NULL, DYNAMIC_TYPE_RSA); - } - - return err; -#else #ifndef WOLFSSL_RSA_PUBLIC_ONLY /* Conditionally add a and b using the mask m. * m is -1 to add and 0 when not. @@ -12904,6 +12846,63 @@ int sp_RsaPrivate_3072(const byte* in, word32 inLen, mp_int* dm, mp_int* pm, mp_int* qm, mp_int* dpm, mp_int* dqm, mp_int* qim, mp_int* mm, byte* out, word32* outLen) { +#if defined(SP_RSA_PRIVATE_EXP_D) || defined(RSA_LOW_MEM) + sp_digit* a; + sp_digit* d = NULL; + sp_digit* m; + sp_digit* r; + int err = MP_OKAY; + + (void)pm; + (void)qm; + (void)dpm; + (void)dqm; + (void)qim; + + if (*outLen < 384U) { + err = MP_TO_E; + } + if (err == MP_OKAY) { + if (mp_count_bits(dm) > 3072) { + err = MP_READ_E; + } + if (inLen > 384) { + err = MP_READ_E; + } + if (mp_count_bits(mm) != 3072) { + err = MP_READ_E; + } + } + + if (err == MP_OKAY) { + d = (sp_digit*)XMALLOC(sizeof(sp_digit) * 48 * 4, NULL, + DYNAMIC_TYPE_RSA); + if (d == NULL) { + err = MEMORY_E; + } + } + if (err == MP_OKAY) { + a = d + 48; + m = a + 96; + r = a; + + sp_3072_from_bin(a, 48, in, inLen); + sp_3072_from_mp(d, 48, dm); + sp_3072_from_mp(m, 48, mm); + err = sp_3072_mod_exp_48(r, a, d, 3072, m, 0); + } + if (err == MP_OKAY) { + sp_3072_to_bin(r, out); + *outLen = 384; + } + + if (d != NULL) { + XMEMSET(d, 0, sizeof(sp_digit) * 48); + XFREE(d, NULL, DYNAMIC_TYPE_RSA); + } + + return err; +#else #if (!defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SMALL_STACK)) || defined(WOLFSSL_SP_NO_MALLOC) sp_digit a[48 * 2]; sp_digit p[24], q[24], dp[24]; @@ -12999,11 +12998,10 @@ int sp_RsaPrivate_3072(const byte* in, word32 inLen, mp_int* dm, XMEMSET(q, 0, sizeof(q)); XMEMSET(dp, 0, sizeof(dp)); #endif - +#endif /* SP_RSA_PRIVATE_EXP_D || RSA_LOW_MEM */ return err; } #endif /* WOLFSSL_RSA_PUBLIC_ONLY */ -#endif /* SP_RSA_PRIVATE_EXP_D || RSA_LOW_MEM */ #endif /* WOLFSSL_HAVE_SP_RSA */ #if defined(WOLFSSL_HAVE_SP_DH) || (defined(WOLFSSL_HAVE_SP_RSA) && \ !defined(WOLFSSL_RSA_PUBLIC_ONLY)) @@ -17625,63 +17623,6 @@ int sp_RsaPublic_4096(const byte* in, word32 inLen, mp_int* em, mp_int* mm, return err; } -#if defined(SP_RSA_PRIVATE_EXP_D) || defined(RSA_LOW_MEM) - sp_digit* a; - sp_digit* d = NULL; - sp_digit* m; - sp_digit* r; - int err = MP_OKAY; - - (void)pm; - (void)qm; - (void)dpm; - (void)dqm; - (void)qim; - - if (*outLen < 512U) { - err = MP_TO_E; - } - if (err == MP_OKAY) { - if (mp_count_bits(dm) > 4096) { - err = MP_READ_E; - } - if (inLen > 512) { - err = MP_READ_E; - } - if (mp_count_bits(mm) != 4096) { - err = MP_READ_E; - } - } - - if (err == MP_OKAY) { - d = (sp_digit*)XMALLOC(sizeof(sp_digit) * 64 * 4, NULL, - DYNAMIC_TYPE_RSA); - if (d == NULL) { - err = MEMORY_E; - } - } - if (err == MP_OKAY) { - a = d + 64; - m = a + 128; - r = a; - - sp_4096_from_bin(a, 64, in, inLen); - sp_4096_from_mp(d, 64, dm); - sp_4096_from_mp(m, 64, mm); - err = sp_4096_mod_exp_64(r, a, d, 4096, m, 0); - } - if (err == MP_OKAY) { - sp_4096_to_bin(r, out); - *outLen = 512; - } - - if (d != NULL) { - XMEMSET(d, 0, sizeof(sp_digit) * 64); - XFREE(d, NULL, DYNAMIC_TYPE_RSA); - } - - return err; -#else #ifndef WOLFSSL_RSA_PUBLIC_ONLY /* Conditionally add a and b using the mask m. * m is -1 to add and 0 when not. @@ -17862,6 +17803,63 @@ int sp_RsaPrivate_4096(const byte* in, word32 inLen, mp_int* dm, mp_int* pm, mp_int* qm, mp_int* dpm, mp_int* dqm, mp_int* qim, mp_int* mm, byte* out, word32* outLen) { +#if defined(SP_RSA_PRIVATE_EXP_D) || defined(RSA_LOW_MEM) + sp_digit* a; + sp_digit* d = NULL; + sp_digit* m; + sp_digit* r; + int err = MP_OKAY; + + (void)pm; + (void)qm; + (void)dpm; + (void)dqm; + (void)qim; + + if (*outLen < 512U) { + err = MP_TO_E; + } + if (err == MP_OKAY) { + if (mp_count_bits(dm) > 4096) { + err = MP_READ_E; + } + if (inLen > 512) { + err = MP_READ_E; + } + if (mp_count_bits(mm) != 4096) { + err = MP_READ_E; + } + } + + if (err == MP_OKAY) { + d = (sp_digit*)XMALLOC(sizeof(sp_digit) * 64 * 4, NULL, + DYNAMIC_TYPE_RSA); + if (d == NULL) { + err = MEMORY_E; + } + } + if (err == MP_OKAY) { + a = d + 64; + m = a + 128; + r = a; + + sp_4096_from_bin(a, 64, in, inLen); + sp_4096_from_mp(d, 64, dm); + sp_4096_from_mp(m, 64, mm); + err = sp_4096_mod_exp_64(r, a, d, 4096, m, 0); + } + if (err == MP_OKAY) { + sp_4096_to_bin(r, out); + *outLen = 512; + } + + if (d != NULL) { + XMEMSET(d, 0, sizeof(sp_digit) * 64); + XFREE(d, NULL, DYNAMIC_TYPE_RSA); + } + + return err; +#else #if (!defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SMALL_STACK)) || defined(WOLFSSL_SP_NO_MALLOC) sp_digit a[64 * 2]; sp_digit p[32], q[32], dp[32]; @@ -17957,11 +17955,10 @@ int sp_RsaPrivate_4096(const byte* in, word32 inLen, mp_int* dm, XMEMSET(q, 0, sizeof(q)); XMEMSET(dp, 0, sizeof(dp)); #endif - +#endif /* SP_RSA_PRIVATE_EXP_D || RSA_LOW_MEM */ return err; } #endif /* WOLFSSL_RSA_PUBLIC_ONLY */ -#endif /* SP_RSA_PRIVATE_EXP_D || RSA_LOW_MEM */ #endif /* WOLFSSL_HAVE_SP_RSA */ #if defined(WOLFSSL_HAVE_SP_DH) || (defined(WOLFSSL_HAVE_SP_RSA) && \ !defined(WOLFSSL_RSA_PUBLIC_ONLY)) diff --git a/wolfcrypt/src/sp_armthumb.c b/wolfcrypt/src/sp_armthumb.c index 40cb431a3..2275dba3f 100644 --- a/wolfcrypt/src/sp_armthumb.c +++ b/wolfcrypt/src/sp_armthumb.c @@ -4362,63 +4362,6 @@ int sp_RsaPublic_2048(const byte* in, word32 inLen, mp_int* em, mp_int* mm, return err; } -#if defined(SP_RSA_PRIVATE_EXP_D) || defined(RSA_LOW_MEM) - sp_digit* a; - sp_digit* d = NULL; - sp_digit* m; - sp_digit* r; - int err = MP_OKAY; - - (void)pm; - (void)qm; - (void)dpm; - (void)dqm; - (void)qim; - - if (*outLen < 256U) { - err = MP_TO_E; - } - if (err == MP_OKAY) { - if (mp_count_bits(dm) > 2048) { - err = MP_READ_E; - } - if (inLen > 256) { - err = MP_READ_E; - } - if (mp_count_bits(mm) != 2048) { - err = MP_READ_E; - } - } - - if (err == MP_OKAY) { - d = (sp_digit*)XMALLOC(sizeof(sp_digit) * 64 * 4, NULL, - DYNAMIC_TYPE_RSA); - if (d == NULL) { - err = MEMORY_E; - } - } - if (err == MP_OKAY) { - a = d + 64; - m = a + 128; - r = a; - - sp_2048_from_bin(a, 64, in, inLen); - sp_2048_from_mp(d, 64, dm); - sp_2048_from_mp(m, 64, mm); - err = sp_2048_mod_exp_64(r, a, d, 2048, m, 0); - } - if (err == MP_OKAY) { - sp_2048_to_bin(r, out); - *outLen = 256; - } - - if (d != NULL) { - XMEMSET(d, 0, sizeof(sp_digit) * 64); - XFREE(d, NULL, DYNAMIC_TYPE_RSA); - } - - return err; -#else #ifndef WOLFSSL_RSA_PUBLIC_ONLY /* Conditionally add a and b using the mask m. * m is -1 to add and 0 when not. @@ -4480,6 +4423,63 @@ int sp_RsaPrivate_2048(const byte* in, word32 inLen, mp_int* dm, mp_int* pm, mp_int* qm, mp_int* dpm, mp_int* dqm, mp_int* qim, mp_int* mm, byte* out, word32* outLen) { +#if defined(SP_RSA_PRIVATE_EXP_D) || defined(RSA_LOW_MEM) + sp_digit* a; + sp_digit* d = NULL; + sp_digit* m; + sp_digit* r; + int err = MP_OKAY; + + (void)pm; + (void)qm; + (void)dpm; + (void)dqm; + (void)qim; + + if (*outLen < 256U) { + err = MP_TO_E; + } + if (err == MP_OKAY) { + if (mp_count_bits(dm) > 2048) { + err = MP_READ_E; + } + if (inLen > 256) { + err = MP_READ_E; + } + if (mp_count_bits(mm) != 2048) { + err = MP_READ_E; + } + } + + if (err == MP_OKAY) { + d = (sp_digit*)XMALLOC(sizeof(sp_digit) * 64 * 4, NULL, + DYNAMIC_TYPE_RSA); + if (d == NULL) { + err = MEMORY_E; + } + } + if (err == MP_OKAY) { + a = d + 64; + m = a + 128; + r = a; + + sp_2048_from_bin(a, 64, in, inLen); + sp_2048_from_mp(d, 64, dm); + sp_2048_from_mp(m, 64, mm); + err = sp_2048_mod_exp_64(r, a, d, 2048, m, 0); + } + if (err == MP_OKAY) { + sp_2048_to_bin(r, out); + *outLen = 256; + } + + if (d != NULL) { + XMEMSET(d, 0, sizeof(sp_digit) * 64); + XFREE(d, NULL, DYNAMIC_TYPE_RSA); + } + + return err; +#else #if (!defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SMALL_STACK)) || defined(WOLFSSL_SP_NO_MALLOC) sp_digit a[64 * 2]; sp_digit p[32], q[32], dp[32]; @@ -4575,11 +4575,10 @@ int sp_RsaPrivate_2048(const byte* in, word32 inLen, mp_int* dm, XMEMSET(q, 0, sizeof(q)); XMEMSET(dp, 0, sizeof(dp)); #endif - +#endif /* SP_RSA_PRIVATE_EXP_D || RSA_LOW_MEM */ return err; } #endif /* WOLFSSL_RSA_PUBLIC_ONLY */ -#endif /* SP_RSA_PRIVATE_EXP_D || RSA_LOW_MEM */ #endif /* WOLFSSL_HAVE_SP_RSA */ #if defined(WOLFSSL_HAVE_SP_DH) || (defined(WOLFSSL_HAVE_SP_RSA) && \ !defined(WOLFSSL_RSA_PUBLIC_ONLY)) @@ -10163,63 +10162,6 @@ int sp_RsaPublic_3072(const byte* in, word32 inLen, mp_int* em, mp_int* mm, return err; } -#if defined(SP_RSA_PRIVATE_EXP_D) || defined(RSA_LOW_MEM) - sp_digit* a; - sp_digit* d = NULL; - sp_digit* m; - sp_digit* r; - int err = MP_OKAY; - - (void)pm; - (void)qm; - (void)dpm; - (void)dqm; - (void)qim; - - if (*outLen < 384U) { - err = MP_TO_E; - } - if (err == MP_OKAY) { - if (mp_count_bits(dm) > 3072) { - err = MP_READ_E; - } - if (inLen > 384) { - err = MP_READ_E; - } - if (mp_count_bits(mm) != 3072) { - err = MP_READ_E; - } - } - - if (err == MP_OKAY) { - d = (sp_digit*)XMALLOC(sizeof(sp_digit) * 96 * 4, NULL, - DYNAMIC_TYPE_RSA); - if (d == NULL) { - err = MEMORY_E; - } - } - if (err == MP_OKAY) { - a = d + 96; - m = a + 192; - r = a; - - sp_3072_from_bin(a, 96, in, inLen); - sp_3072_from_mp(d, 96, dm); - sp_3072_from_mp(m, 96, mm); - err = sp_3072_mod_exp_96(r, a, d, 3072, m, 0); - } - if (err == MP_OKAY) { - sp_3072_to_bin(r, out); - *outLen = 384; - } - - if (d != NULL) { - XMEMSET(d, 0, sizeof(sp_digit) * 96); - XFREE(d, NULL, DYNAMIC_TYPE_RSA); - } - - return err; -#else #ifndef WOLFSSL_RSA_PUBLIC_ONLY /* Conditionally add a and b using the mask m. * m is -1 to add and 0 when not. @@ -10281,6 +10223,63 @@ int sp_RsaPrivate_3072(const byte* in, word32 inLen, mp_int* dm, mp_int* pm, mp_int* qm, mp_int* dpm, mp_int* dqm, mp_int* qim, mp_int* mm, byte* out, word32* outLen) { +#if defined(SP_RSA_PRIVATE_EXP_D) || defined(RSA_LOW_MEM) + sp_digit* a; + sp_digit* d = NULL; + sp_digit* m; + sp_digit* r; + int err = MP_OKAY; + + (void)pm; + (void)qm; + (void)dpm; + (void)dqm; + (void)qim; + + if (*outLen < 384U) { + err = MP_TO_E; + } + if (err == MP_OKAY) { + if (mp_count_bits(dm) > 3072) { + err = MP_READ_E; + } + if (inLen > 384) { + err = MP_READ_E; + } + if (mp_count_bits(mm) != 3072) { + err = MP_READ_E; + } + } + + if (err == MP_OKAY) { + d = (sp_digit*)XMALLOC(sizeof(sp_digit) * 96 * 4, NULL, + DYNAMIC_TYPE_RSA); + if (d == NULL) { + err = MEMORY_E; + } + } + if (err == MP_OKAY) { + a = d + 96; + m = a + 192; + r = a; + + sp_3072_from_bin(a, 96, in, inLen); + sp_3072_from_mp(d, 96, dm); + sp_3072_from_mp(m, 96, mm); + err = sp_3072_mod_exp_96(r, a, d, 3072, m, 0); + } + if (err == MP_OKAY) { + sp_3072_to_bin(r, out); + *outLen = 384; + } + + if (d != NULL) { + XMEMSET(d, 0, sizeof(sp_digit) * 96); + XFREE(d, NULL, DYNAMIC_TYPE_RSA); + } + + return err; +#else #if (!defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SMALL_STACK)) || defined(WOLFSSL_SP_NO_MALLOC) sp_digit a[96 * 2]; sp_digit p[48], q[48], dp[48]; @@ -10376,11 +10375,10 @@ int sp_RsaPrivate_3072(const byte* in, word32 inLen, mp_int* dm, XMEMSET(q, 0, sizeof(q)); XMEMSET(dp, 0, sizeof(dp)); #endif - +#endif /* SP_RSA_PRIVATE_EXP_D || RSA_LOW_MEM */ return err; } #endif /* WOLFSSL_RSA_PUBLIC_ONLY */ -#endif /* SP_RSA_PRIVATE_EXP_D || RSA_LOW_MEM */ #endif /* WOLFSSL_HAVE_SP_RSA */ #if defined(WOLFSSL_HAVE_SP_DH) || (defined(WOLFSSL_HAVE_SP_RSA) && \ !defined(WOLFSSL_RSA_PUBLIC_ONLY)) @@ -14623,63 +14621,6 @@ int sp_RsaPublic_4096(const byte* in, word32 inLen, mp_int* em, mp_int* mm, return err; } -#if defined(SP_RSA_PRIVATE_EXP_D) || defined(RSA_LOW_MEM) - sp_digit* a; - sp_digit* d = NULL; - sp_digit* m; - sp_digit* r; - int err = MP_OKAY; - - (void)pm; - (void)qm; - (void)dpm; - (void)dqm; - (void)qim; - - if (*outLen < 512U) { - err = MP_TO_E; - } - if (err == MP_OKAY) { - if (mp_count_bits(dm) > 4096) { - err = MP_READ_E; - } - if (inLen > 512) { - err = MP_READ_E; - } - if (mp_count_bits(mm) != 4096) { - err = MP_READ_E; - } - } - - if (err == MP_OKAY) { - d = (sp_digit*)XMALLOC(sizeof(sp_digit) * 128 * 4, NULL, - DYNAMIC_TYPE_RSA); - if (d == NULL) { - err = MEMORY_E; - } - } - if (err == MP_OKAY) { - a = d + 128; - m = a + 256; - r = a; - - sp_4096_from_bin(a, 128, in, inLen); - sp_4096_from_mp(d, 128, dm); - sp_4096_from_mp(m, 128, mm); - err = sp_4096_mod_exp_128(r, a, d, 4096, m, 0); - } - if (err == MP_OKAY) { - sp_4096_to_bin(r, out); - *outLen = 512; - } - - if (d != NULL) { - XMEMSET(d, 0, sizeof(sp_digit) * 128); - XFREE(d, NULL, DYNAMIC_TYPE_RSA); - } - - return err; -#else #ifndef WOLFSSL_RSA_PUBLIC_ONLY /* Conditionally add a and b using the mask m. * m is -1 to add and 0 when not. @@ -14742,6 +14683,63 @@ int sp_RsaPrivate_4096(const byte* in, word32 inLen, mp_int* dm, mp_int* pm, mp_int* qm, mp_int* dpm, mp_int* dqm, mp_int* qim, mp_int* mm, byte* out, word32* outLen) { +#if defined(SP_RSA_PRIVATE_EXP_D) || defined(RSA_LOW_MEM) + sp_digit* a; + sp_digit* d = NULL; + sp_digit* m; + sp_digit* r; + int err = MP_OKAY; + + (void)pm; + (void)qm; + (void)dpm; + (void)dqm; + (void)qim; + + if (*outLen < 512U) { + err = MP_TO_E; + } + if (err == MP_OKAY) { + if (mp_count_bits(dm) > 4096) { + err = MP_READ_E; + } + if (inLen > 512) { + err = MP_READ_E; + } + if (mp_count_bits(mm) != 4096) { + err = MP_READ_E; + } + } + + if (err == MP_OKAY) { + d = (sp_digit*)XMALLOC(sizeof(sp_digit) * 128 * 4, NULL, + DYNAMIC_TYPE_RSA); + if (d == NULL) { + err = MEMORY_E; + } + } + if (err == MP_OKAY) { + a = d + 128; + m = a + 256; + r = a; + + sp_4096_from_bin(a, 128, in, inLen); + sp_4096_from_mp(d, 128, dm); + sp_4096_from_mp(m, 128, mm); + err = sp_4096_mod_exp_128(r, a, d, 4096, m, 0); + } + if (err == MP_OKAY) { + sp_4096_to_bin(r, out); + *outLen = 512; + } + + if (d != NULL) { + XMEMSET(d, 0, sizeof(sp_digit) * 128); + XFREE(d, NULL, DYNAMIC_TYPE_RSA); + } + + return err; +#else #if (!defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SMALL_STACK)) || defined(WOLFSSL_SP_NO_MALLOC) sp_digit a[128 * 2]; sp_digit p[64], q[64], dp[64]; @@ -14837,11 +14835,10 @@ int sp_RsaPrivate_4096(const byte* in, word32 inLen, mp_int* dm, XMEMSET(q, 0, sizeof(q)); XMEMSET(dp, 0, sizeof(dp)); #endif - +#endif /* SP_RSA_PRIVATE_EXP_D || RSA_LOW_MEM */ return err; } #endif /* WOLFSSL_RSA_PUBLIC_ONLY */ -#endif /* SP_RSA_PRIVATE_EXP_D || RSA_LOW_MEM */ #endif /* WOLFSSL_HAVE_SP_RSA */ #if defined(WOLFSSL_HAVE_SP_DH) || (defined(WOLFSSL_HAVE_SP_RSA) && \ !defined(WOLFSSL_RSA_PUBLIC_ONLY)) diff --git a/wolfcrypt/src/sp_cortexm.c b/wolfcrypt/src/sp_cortexm.c index e5214c3e3..6d8ebf0cc 100644 --- a/wolfcrypt/src/sp_cortexm.c +++ b/wolfcrypt/src/sp_cortexm.c @@ -4116,63 +4116,6 @@ int sp_RsaPublic_2048(const byte* in, word32 inLen, mp_int* em, mp_int* mm, return err; } -#if defined(SP_RSA_PRIVATE_EXP_D) || defined(RSA_LOW_MEM) - sp_digit* a; - sp_digit* d = NULL; - sp_digit* m; - sp_digit* r; - int err = MP_OKAY; - - (void)pm; - (void)qm; - (void)dpm; - (void)dqm; - (void)qim; - - if (*outLen < 256U) { - err = MP_TO_E; - } - if (err == MP_OKAY) { - if (mp_count_bits(dm) > 2048) { - err = MP_READ_E; - } - if (inLen > 256) { - err = MP_READ_E; - } - if (mp_count_bits(mm) != 2048) { - err = MP_READ_E; - } - } - - if (err == MP_OKAY) { - d = (sp_digit*)XMALLOC(sizeof(sp_digit) * 64 * 4, NULL, - DYNAMIC_TYPE_RSA); - if (d == NULL) { - err = MEMORY_E; - } - } - if (err == MP_OKAY) { - a = d + 64; - m = a + 128; - r = a; - - sp_2048_from_bin(a, 64, in, inLen); - sp_2048_from_mp(d, 64, dm); - sp_2048_from_mp(m, 64, mm); - err = sp_2048_mod_exp_64(r, a, d, 2048, m, 0); - } - if (err == MP_OKAY) { - sp_2048_to_bin(r, out); - *outLen = 256; - } - - if (d != NULL) { - XMEMSET(d, 0, sizeof(sp_digit) * 64); - XFREE(d, NULL, DYNAMIC_TYPE_RSA); - } - - return err; -#else #ifndef WOLFSSL_RSA_PUBLIC_ONLY /* Conditionally add a and b using the mask m. * m is -1 to add and 0 when not. @@ -4232,6 +4175,63 @@ int sp_RsaPrivate_2048(const byte* in, word32 inLen, mp_int* dm, mp_int* pm, mp_int* qm, mp_int* dpm, mp_int* dqm, mp_int* qim, mp_int* mm, byte* out, word32* outLen) { +#if defined(SP_RSA_PRIVATE_EXP_D) || defined(RSA_LOW_MEM) + sp_digit* a; + sp_digit* d = NULL; + sp_digit* m; + sp_digit* r; + int err = MP_OKAY; + + (void)pm; + (void)qm; + (void)dpm; + (void)dqm; + (void)qim; + + if (*outLen < 256U) { + err = MP_TO_E; + } + if (err == MP_OKAY) { + if (mp_count_bits(dm) > 2048) { + err = MP_READ_E; + } + if (inLen > 256) { + err = MP_READ_E; + } + if (mp_count_bits(mm) != 2048) { + err = MP_READ_E; + } + } + + if (err == MP_OKAY) { + d = (sp_digit*)XMALLOC(sizeof(sp_digit) * 64 * 4, NULL, + DYNAMIC_TYPE_RSA); + if (d == NULL) { + err = MEMORY_E; + } + } + if (err == MP_OKAY) { + a = d + 64; + m = a + 128; + r = a; + + sp_2048_from_bin(a, 64, in, inLen); + sp_2048_from_mp(d, 64, dm); + sp_2048_from_mp(m, 64, mm); + err = sp_2048_mod_exp_64(r, a, d, 2048, m, 0); + } + if (err == MP_OKAY) { + sp_2048_to_bin(r, out); + *outLen = 256; + } + + if (d != NULL) { + XMEMSET(d, 0, sizeof(sp_digit) * 64); + XFREE(d, NULL, DYNAMIC_TYPE_RSA); + } + + return err; +#else #if (!defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SMALL_STACK)) || defined(WOLFSSL_SP_NO_MALLOC) sp_digit a[64 * 2]; sp_digit p[32], q[32], dp[32]; @@ -4327,11 +4327,10 @@ int sp_RsaPrivate_2048(const byte* in, word32 inLen, mp_int* dm, XMEMSET(q, 0, sizeof(q)); XMEMSET(dp, 0, sizeof(dp)); #endif - +#endif /* SP_RSA_PRIVATE_EXP_D || RSA_LOW_MEM */ return err; } #endif /* WOLFSSL_RSA_PUBLIC_ONLY */ -#endif /* SP_RSA_PRIVATE_EXP_D || RSA_LOW_MEM */ #endif /* WOLFSSL_HAVE_SP_RSA */ #if defined(WOLFSSL_HAVE_SP_DH) || (defined(WOLFSSL_HAVE_SP_RSA) && \ !defined(WOLFSSL_RSA_PUBLIC_ONLY)) @@ -8766,63 +8765,6 @@ int sp_RsaPublic_3072(const byte* in, word32 inLen, mp_int* em, mp_int* mm, return err; } -#if defined(SP_RSA_PRIVATE_EXP_D) || defined(RSA_LOW_MEM) - sp_digit* a; - sp_digit* d = NULL; - sp_digit* m; - sp_digit* r; - int err = MP_OKAY; - - (void)pm; - (void)qm; - (void)dpm; - (void)dqm; - (void)qim; - - if (*outLen < 384U) { - err = MP_TO_E; - } - if (err == MP_OKAY) { - if (mp_count_bits(dm) > 3072) { - err = MP_READ_E; - } - if (inLen > 384) { - err = MP_READ_E; - } - if (mp_count_bits(mm) != 3072) { - err = MP_READ_E; - } - } - - if (err == MP_OKAY) { - d = (sp_digit*)XMALLOC(sizeof(sp_digit) * 96 * 4, NULL, - DYNAMIC_TYPE_RSA); - if (d == NULL) { - err = MEMORY_E; - } - } - if (err == MP_OKAY) { - a = d + 96; - m = a + 192; - r = a; - - sp_3072_from_bin(a, 96, in, inLen); - sp_3072_from_mp(d, 96, dm); - sp_3072_from_mp(m, 96, mm); - err = sp_3072_mod_exp_96(r, a, d, 3072, m, 0); - } - if (err == MP_OKAY) { - sp_3072_to_bin(r, out); - *outLen = 384; - } - - if (d != NULL) { - XMEMSET(d, 0, sizeof(sp_digit) * 96); - XFREE(d, NULL, DYNAMIC_TYPE_RSA); - } - - return err; -#else #ifndef WOLFSSL_RSA_PUBLIC_ONLY /* Conditionally add a and b using the mask m. * m is -1 to add and 0 when not. @@ -8882,6 +8824,63 @@ int sp_RsaPrivate_3072(const byte* in, word32 inLen, mp_int* dm, mp_int* pm, mp_int* qm, mp_int* dpm, mp_int* dqm, mp_int* qim, mp_int* mm, byte* out, word32* outLen) { +#if defined(SP_RSA_PRIVATE_EXP_D) || defined(RSA_LOW_MEM) + sp_digit* a; + sp_digit* d = NULL; + sp_digit* m; + sp_digit* r; + int err = MP_OKAY; + + (void)pm; + (void)qm; + (void)dpm; + (void)dqm; + (void)qim; + + if (*outLen < 384U) { + err = MP_TO_E; + } + if (err == MP_OKAY) { + if (mp_count_bits(dm) > 3072) { + err = MP_READ_E; + } + if (inLen > 384) { + err = MP_READ_E; + } + if (mp_count_bits(mm) != 3072) { + err = MP_READ_E; + } + } + + if (err == MP_OKAY) { + d = (sp_digit*)XMALLOC(sizeof(sp_digit) * 96 * 4, NULL, + DYNAMIC_TYPE_RSA); + if (d == NULL) { + err = MEMORY_E; + } + } + if (err == MP_OKAY) { + a = d + 96; + m = a + 192; + r = a; + + sp_3072_from_bin(a, 96, in, inLen); + sp_3072_from_mp(d, 96, dm); + sp_3072_from_mp(m, 96, mm); + err = sp_3072_mod_exp_96(r, a, d, 3072, m, 0); + } + if (err == MP_OKAY) { + sp_3072_to_bin(r, out); + *outLen = 384; + } + + if (d != NULL) { + XMEMSET(d, 0, sizeof(sp_digit) * 96); + XFREE(d, NULL, DYNAMIC_TYPE_RSA); + } + + return err; +#else #if (!defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SMALL_STACK)) || defined(WOLFSSL_SP_NO_MALLOC) sp_digit a[96 * 2]; sp_digit p[48], q[48], dp[48]; @@ -8977,11 +8976,10 @@ int sp_RsaPrivate_3072(const byte* in, word32 inLen, mp_int* dm, XMEMSET(q, 0, sizeof(q)); XMEMSET(dp, 0, sizeof(dp)); #endif - +#endif /* SP_RSA_PRIVATE_EXP_D || RSA_LOW_MEM */ return err; } #endif /* WOLFSSL_RSA_PUBLIC_ONLY */ -#endif /* SP_RSA_PRIVATE_EXP_D || RSA_LOW_MEM */ #endif /* WOLFSSL_HAVE_SP_RSA */ #if defined(WOLFSSL_HAVE_SP_DH) || (defined(WOLFSSL_HAVE_SP_RSA) && \ !defined(WOLFSSL_RSA_PUBLIC_ONLY)) @@ -12362,63 +12360,6 @@ int sp_RsaPublic_4096(const byte* in, word32 inLen, mp_int* em, mp_int* mm, return err; } -#if defined(SP_RSA_PRIVATE_EXP_D) || defined(RSA_LOW_MEM) - sp_digit* a; - sp_digit* d = NULL; - sp_digit* m; - sp_digit* r; - int err = MP_OKAY; - - (void)pm; - (void)qm; - (void)dpm; - (void)dqm; - (void)qim; - - if (*outLen < 512U) { - err = MP_TO_E; - } - if (err == MP_OKAY) { - if (mp_count_bits(dm) > 4096) { - err = MP_READ_E; - } - if (inLen > 512) { - err = MP_READ_E; - } - if (mp_count_bits(mm) != 4096) { - err = MP_READ_E; - } - } - - if (err == MP_OKAY) { - d = (sp_digit*)XMALLOC(sizeof(sp_digit) * 128 * 4, NULL, - DYNAMIC_TYPE_RSA); - if (d == NULL) { - err = MEMORY_E; - } - } - if (err == MP_OKAY) { - a = d + 128; - m = a + 256; - r = a; - - sp_4096_from_bin(a, 128, in, inLen); - sp_4096_from_mp(d, 128, dm); - sp_4096_from_mp(m, 128, mm); - err = sp_4096_mod_exp_128(r, a, d, 4096, m, 0); - } - if (err == MP_OKAY) { - sp_4096_to_bin(r, out); - *outLen = 512; - } - - if (d != NULL) { - XMEMSET(d, 0, sizeof(sp_digit) * 128); - XFREE(d, NULL, DYNAMIC_TYPE_RSA); - } - - return err; -#else #ifndef WOLFSSL_RSA_PUBLIC_ONLY /* Conditionally add a and b using the mask m. * m is -1 to add and 0 when not. @@ -12479,6 +12420,63 @@ int sp_RsaPrivate_4096(const byte* in, word32 inLen, mp_int* dm, mp_int* pm, mp_int* qm, mp_int* dpm, mp_int* dqm, mp_int* qim, mp_int* mm, byte* out, word32* outLen) { +#if defined(SP_RSA_PRIVATE_EXP_D) || defined(RSA_LOW_MEM) + sp_digit* a; + sp_digit* d = NULL; + sp_digit* m; + sp_digit* r; + int err = MP_OKAY; + + (void)pm; + (void)qm; + (void)dpm; + (void)dqm; + (void)qim; + + if (*outLen < 512U) { + err = MP_TO_E; + } + if (err == MP_OKAY) { + if (mp_count_bits(dm) > 4096) { + err = MP_READ_E; + } + if (inLen > 512) { + err = MP_READ_E; + } + if (mp_count_bits(mm) != 4096) { + err = MP_READ_E; + } + } + + if (err == MP_OKAY) { + d = (sp_digit*)XMALLOC(sizeof(sp_digit) * 128 * 4, NULL, + DYNAMIC_TYPE_RSA); + if (d == NULL) { + err = MEMORY_E; + } + } + if (err == MP_OKAY) { + a = d + 128; + m = a + 256; + r = a; + + sp_4096_from_bin(a, 128, in, inLen); + sp_4096_from_mp(d, 128, dm); + sp_4096_from_mp(m, 128, mm); + err = sp_4096_mod_exp_128(r, a, d, 4096, m, 0); + } + if (err == MP_OKAY) { + sp_4096_to_bin(r, out); + *outLen = 512; + } + + if (d != NULL) { + XMEMSET(d, 0, sizeof(sp_digit) * 128); + XFREE(d, NULL, DYNAMIC_TYPE_RSA); + } + + return err; +#else #if (!defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SMALL_STACK)) || defined(WOLFSSL_SP_NO_MALLOC) sp_digit a[128 * 2]; sp_digit p[64], q[64], dp[64]; @@ -12574,11 +12572,10 @@ int sp_RsaPrivate_4096(const byte* in, word32 inLen, mp_int* dm, XMEMSET(q, 0, sizeof(q)); XMEMSET(dp, 0, sizeof(dp)); #endif - +#endif /* SP_RSA_PRIVATE_EXP_D || RSA_LOW_MEM */ return err; } #endif /* WOLFSSL_RSA_PUBLIC_ONLY */ -#endif /* SP_RSA_PRIVATE_EXP_D || RSA_LOW_MEM */ #endif /* WOLFSSL_HAVE_SP_RSA */ #if defined(WOLFSSL_HAVE_SP_DH) || (defined(WOLFSSL_HAVE_SP_RSA) && \ !defined(WOLFSSL_RSA_PUBLIC_ONLY)) From 6185e0f477d614adc44da428fe6beb894cd5f7b9 Mon Sep 17 00:00:00 2001 From: David Garske Date: Mon, 27 Apr 2020 11:16:02 -0700 Subject: [PATCH 063/298] Remove execute bit on files. --- IDE/Renesas/e2studio/RA6M3G/client-wolfssl/wolfssl_thread_entry.h | 0 IDE/Renesas/e2studio/RA6M3G/common/ra6m3g/README.md | 0 IDE/Renesas/e2studio/RA6M3G/server-wolfssl/wolfssl_thread_entry.h | 0 src/ssl.c | 0 wolfcrypt/benchmark/benchmark.c | 0 wrapper/CSharp/wolfSSL-TLS-Server/wolfSSL-TLS-Server.cs | 0 6 files changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 IDE/Renesas/e2studio/RA6M3G/client-wolfssl/wolfssl_thread_entry.h mode change 100755 => 100644 IDE/Renesas/e2studio/RA6M3G/common/ra6m3g/README.md mode change 100755 => 100644 IDE/Renesas/e2studio/RA6M3G/server-wolfssl/wolfssl_thread_entry.h mode change 100755 => 100644 src/ssl.c mode change 100755 => 100644 wolfcrypt/benchmark/benchmark.c mode change 100755 => 100644 wrapper/CSharp/wolfSSL-TLS-Server/wolfSSL-TLS-Server.cs diff --git a/IDE/Renesas/e2studio/RA6M3G/client-wolfssl/wolfssl_thread_entry.h b/IDE/Renesas/e2studio/RA6M3G/client-wolfssl/wolfssl_thread_entry.h old mode 100755 new mode 100644 diff --git a/IDE/Renesas/e2studio/RA6M3G/common/ra6m3g/README.md b/IDE/Renesas/e2studio/RA6M3G/common/ra6m3g/README.md old mode 100755 new mode 100644 diff --git a/IDE/Renesas/e2studio/RA6M3G/server-wolfssl/wolfssl_thread_entry.h b/IDE/Renesas/e2studio/RA6M3G/server-wolfssl/wolfssl_thread_entry.h old mode 100755 new mode 100644 diff --git a/src/ssl.c b/src/ssl.c old mode 100755 new mode 100644 diff --git a/wolfcrypt/benchmark/benchmark.c b/wolfcrypt/benchmark/benchmark.c old mode 100755 new mode 100644 diff --git a/wrapper/CSharp/wolfSSL-TLS-Server/wolfSSL-TLS-Server.cs b/wrapper/CSharp/wolfSSL-TLS-Server/wolfSSL-TLS-Server.cs old mode 100755 new mode 100644 From c85a53c63190fa2e14766b7a8c8a28f0a9bb9e73 Mon Sep 17 00:00:00 2001 From: Jacob Barthelmeh Date: Mon, 27 Apr 2020 15:36:53 -0600 Subject: [PATCH 064/298] add macro guard for fips and selftest builds --- wolfcrypt/test/test.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/wolfcrypt/test/test.c b/wolfcrypt/test/test.c index b96c245a4..76b9468d9 100644 --- a/wolfcrypt/test/test.c +++ b/wolfcrypt/test/test.c @@ -9157,6 +9157,7 @@ int aesccm_test(void) return -6313; #endif +#if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) /* test fail on invalid IV sizes */ result = wc_AesCcmSetKey(&enc, k, sizeof(k)); if (result != 0) @@ -9168,6 +9169,7 @@ int aesccm_test(void) if (result == 0) { return -6315; } +#endif return 0; } From c02c408409ae8b9b2ebcb540db27195f9cb72786 Mon Sep 17 00:00:00 2001 From: Juliusz Sosinowicz Date: Tue, 28 Apr 2020 12:38:02 +0200 Subject: [PATCH 065/298] Only 80 characters a line --- wolfcrypt/src/evp.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/wolfcrypt/src/evp.c b/wolfcrypt/src/evp.c index 033ba9074..d24563132 100644 --- a/wolfcrypt/src/evp.c +++ b/wolfcrypt/src/evp.c @@ -753,7 +753,8 @@ int wolfSSL_EVP_CipherFinal(WOLFSSL_EVP_CIPHER_CTX *ctx, case AES_128_GCM_TYPE: case AES_192_GCM_TYPE: case AES_256_GCM_TYPE: - if (!ctx->enc && ctx->gcmDecryptBuffer && ctx->gcmDecryptBufferLen > 0) { + if (!ctx->enc && ctx->gcmDecryptBuffer && + ctx->gcmDecryptBufferLen > 0) { /* decrypt confidential data*/ ret = wc_AesGcmDecrypt(&ctx->cipher.aes, out, ctx->gcmDecryptBuffer, ctx->gcmDecryptBufferLen, @@ -820,7 +821,8 @@ int wolfSSL_EVP_CipherFinal(WOLFSSL_EVP_CIPHER_CTX *ctx, XMEMCPY(out, ctx->lastBlock, fl); *outl = fl; if (ctx->lastUsed == 0 && ctx->bufUsed == 0) { - /* return error in cases where the block length is incorrect */ + /* return error in cases where the block length is + * incorrect */ WOLFSSL_MSG("Final Cipher Block bad length"); ret = WOLFSSL_FAILURE; } @@ -830,7 +832,8 @@ int wolfSSL_EVP_CipherFinal(WOLFSSL_EVP_CIPHER_CTX *ctx, } } else if (ctx->lastUsed == 0 && ctx->bufUsed == 0) { - /* return error in cases where the block length is incorrect */ + /* return error in cases where the block length is + * incorrect */ ret = WOLFSSL_FAILURE; } } From 951cb4aaf4bda45742b09572a24e966da36426d9 Mon Sep 17 00:00:00 2001 From: kaleb-himes Date: Tue, 28 Apr 2020 14:33:00 -0600 Subject: [PATCH 066/298] Fix building with one-side only tls13/dtls --- examples/benchmark/tls_bench.c | 18 ++++++++----- src/internal.c | 48 +++++++++++++++++----------------- 2 files changed, 35 insertions(+), 31 deletions(-) diff --git a/examples/benchmark/tls_bench.c b/examples/benchmark/tls_bench.c index e22ea9c43..e6419863f 100644 --- a/examples/benchmark/tls_bench.c +++ b/examples/benchmark/tls_bench.c @@ -519,7 +519,7 @@ static int SocketSend(int sockFd, char* buf, int sz) } return sent; } -#ifdef WOLFSSL_DTLS +#if defined(WOLFSSL_DTLS) && !defined(NO_WOLFSSL_SERVER) static int ReceiveFrom(WOLFSSL *ssl, int sd, char *buf, int sz) { int recvd; @@ -573,7 +573,9 @@ static int ReceiveFrom(WOLFSSL *ssl, int sd, char *buf, int sz) return recvd; } +#endif /* WOLFSSL_DTLS && !NO_WOLFSSL_SERVER */ +#if defined(WOLFSSL_DTLS) && !defined(NO_WOLFSSL_CLIENT) static int SendTo(int sd, char *buf, int sz, const struct sockaddr *peer, socklen_t peerSz) { @@ -610,7 +612,7 @@ static int myDoneHsCb(WOLFSSL* ssl, void* user_ctx) DoneHandShake = 1; return 1; } -#endif +#endif /* WOLFSSL_DTLS && !NO_WOLFSSL_CLIENT */ #ifndef NO_WOLFSSL_SERVER static int ServerSend(WOLFSSL* ssl, char* buf, int sz, void* ctx) @@ -621,7 +623,7 @@ static int ServerSend(WOLFSSL* ssl, char* buf, int sz, void* ctx) if (info->useLocalMem) return ServerMemSend(info, buf, sz); #endif -#ifdef WOLFSSL_DTLS +#if defined(WOLFSSL_DTLS) && !defined(NO_WOLFSSL_CLIENT) if (info->doDTLS) { return SendTo(info->server.sockFd, buf, sz, (const struct sockaddr*)&info->clientAddr, sizeof(info->clientAddr)); @@ -671,7 +673,7 @@ static int ClientRecv(WOLFSSL* ssl, char* buf, int sz, void* ctx) if (info->useLocalMem) return ClientMemRecv(info, buf, sz); #endif -#ifdef WOLFSSL_DTLS +#if defined(WOLFSSL_DTLS) && !defined(NO_WOLFSSL_SERVER) if (info->doDTLS) { return ReceiveFrom(ssl, info->client.sockFd, buf, sz); } else @@ -1570,9 +1572,11 @@ int bench_tls(void* args) int argLocalMem = 0; int listenFd = -1; #endif +#if defined(WOLFSSL_DTLS) && !defined(NO_WOLFSSL_SERVER) + int option_p = 0; +#endif #ifdef WOLFSSL_DTLS int doDTLS = 0; - int option_p = 0; #endif if (args != NULL) { argc = ((func_args*)args)->argc; @@ -1631,7 +1635,7 @@ int bench_tls(void* args) Usage(); ret = MY_EX_USAGE; goto exit; } - #ifdef WOLFSSL_DTLS + #if defined(WOLFSSL_DTLS) && !defined(NO_WOLFSSL_SERVER) option_p = 1; #endif break; @@ -1726,7 +1730,7 @@ int bench_tls(void* args) } #endif -#ifdef WOLFSSL_DTLS +#if defined(WOLFSSL_DTLS) && !defined(NO_WOLFSSL_SERVER) if (doDTLS) { if (argLocalMem) { printf("tls_bench hasn't yet supported DTLS with local memory.\n"); diff --git a/src/internal.c b/src/internal.c index e7d67ff85..3b8fc60dd 100644 --- a/src/internal.c +++ b/src/internal.c @@ -19527,6 +19527,30 @@ exit_dpk: #endif /* WOLFSSL_TLS13 || !NO_WOLFSSL_CLIENT */ +#ifdef WOLFSSL_TLS13 + /* returns 1 if able to do TLS 1.3 otherwise 0 */ + static int TLSv1_3_Capable(WOLFSSL* ssl) + { + #ifndef WOLFSSL_TLS13 + return 0; + #else + int ret = 0; + + if (IsAtLeastTLSv1_3(ssl->ctx->method->version)) { + ret = 1; + } + + #ifdef OPENSSL_EXTRA + if ((wolfSSL_get_options(ssl) & SSL_OP_NO_TLSv1_3)) { + /* option set at run time to disable TLS 1.3 */ + ret = 0; + } + #endif + return ret; + #endif + } +#endif /* WOLFSSL_TLS13 */ + /* client only parts */ #ifndef NO_WOLFSSL_CLIENT @@ -20191,30 +20215,6 @@ exit_dpk: return ret; } -#ifdef WOLFSSL_TLS13 - /* returns 1 if able to do TLS 1.3 otherwise 0 */ - static int TLSv1_3_Capable(WOLFSSL* ssl) - { - #ifndef WOLFSSL_TLS13 - return 0; - #else - int ret = 0; - - if (IsAtLeastTLSv1_3(ssl->ctx->method->version)) { - ret = 1; - } - - #ifdef OPENSSL_EXTRA - if ((wolfSSL_get_options(ssl) & SSL_OP_NO_TLSv1_3)) { - /* option set at run time to disable TLS 1.3 */ - ret = 0; - } - #endif - return ret; - #endif - } -#endif /* WOLFSSL_TLS13 */ - int CompleteServerHello(WOLFSSL* ssl) { int ret; From b73e52f33ffeb173c9968d42c3dbea8393dfe65f Mon Sep 17 00:00:00 2001 From: Jacob Barthelmeh Date: Tue, 28 Apr 2020 14:46:06 -0600 Subject: [PATCH 067/298] move AES-CCM tag check into a local function --- wolfcrypt/src/aes.c | 26 +++++++++++++++++--------- wolfcrypt/src/port/arm/armv8-aes.c | 4 ++++ wolfcrypt/src/port/caam/caam_aes.c | 4 ++++ wolfssl/wolfcrypt/aes.h | 1 + 4 files changed, 26 insertions(+), 9 deletions(-) diff --git a/wolfcrypt/src/aes.c b/wolfcrypt/src/aes.c index d1f7dda1c..4fbf3ef15 100644 --- a/wolfcrypt/src/aes.c +++ b/wolfcrypt/src/aes.c @@ -6970,6 +6970,21 @@ int wc_AesCcmSetKey(Aes* aes, const byte* key, word32 keySz) return wc_AesSetKey(aes, key, keySz, NULL, AES_ENCRYPTION); } + +/* Checks if the tag size is an accepted value based on RFC 3610 section 2 + * returns 0 if tag size is ok + */ +int wc_AesCcmCheckTagSize(int sz) +{ + /* values here are from RFC 3610 section 2 */ + if (sz != 4 && sz != 6 && sz != 8 && sz != 10 && sz != 12 && sz != 14 + && sz != 16) { + WOLFSSL_MSG("Bad auth tag size AES-CCM"); + return BAD_FUNC_ARG; + } + return 0; +} + #ifdef WOLFSSL_ARMASM /* implementation located in wolfcrypt/src/port/arm/armv8-aes.c */ @@ -6996,11 +7011,7 @@ int wc_AesCcmEncrypt(Aes* aes, byte* out, const byte* in, word32 inSz, || authTag == NULL || nonceSz < 7 || nonceSz > 13) return BAD_FUNC_ARG; - /* sanity check on tag size */ - if (authTagSz != 4 && authTagSz != 6 && authTagSz != 8 && - authTagSz != 10 && authTagSz != 12 && authTagSz != 14 && - authTagSz != 16) { - WOLFSSL_MSG("Bad auth tag size AES-CCM"); + if (wc_AesCcmCheckTagSize(authTagSz) != 0) { return BAD_FUNC_ARG; } @@ -7193,10 +7204,7 @@ int wc_AesCcmEncrypt(Aes* aes, byte* out, const byte* in, word32 inSz, return BAD_FUNC_ARG; /* sanity check on tag size */ - if (authTagSz != 4 && authTagSz != 6 && authTagSz != 8 && - authTagSz != 10 && authTagSz != 12 && authTagSz != 14 && - authTagSz != 16) { - WOLFSSL_MSG("Bad auth tag size AES-CCM"); + if (wc_AesCcmCheckTagSize(authTagSz) != 0) { return BAD_FUNC_ARG; } diff --git a/wolfcrypt/src/port/arm/armv8-aes.c b/wolfcrypt/src/port/arm/armv8-aes.c index d0f8a9c5c..ad5cfa873 100644 --- a/wolfcrypt/src/port/arm/armv8-aes.c +++ b/wolfcrypt/src/port/arm/armv8-aes.c @@ -4438,6 +4438,10 @@ int wc_AesCcmEncrypt(Aes* aes, byte* out, const byte* in, word32 inSz, || authTag == NULL || nonceSz < 7 || nonceSz > 13) return BAD_FUNC_ARG; + if (wc_AesCcmCheckTagSize(authTagSz) != 0) { + return BAD_FUNC_ARG; + } + XMEMCPY(B+1, nonce, nonceSz); lenSz = AES_BLOCK_SIZE - 1 - (byte)nonceSz; B[0] = (authInSz > 0 ? 64 : 0) diff --git a/wolfcrypt/src/port/caam/caam_aes.c b/wolfcrypt/src/port/caam/caam_aes.c index e00214df3..dad970ccc 100644 --- a/wolfcrypt/src/port/caam/caam_aes.c +++ b/wolfcrypt/src/port/caam/caam_aes.c @@ -497,6 +497,10 @@ int wc_AesCcmEncrypt(Aes* aes, byte* out, authTagSz > AES_BLOCK_SIZE) return BAD_FUNC_ARG; + if (wc_AesCcmCheckTagSize(authTagSz) != 0) { + return BAD_FUNC_ARG; + } + if (wc_AesGetKeySize(aes, &keySz) != 0) { return BAD_FUNC_ARG; } diff --git a/wolfssl/wolfcrypt/aes.h b/wolfssl/wolfcrypt/aes.h index 858291849..15d3ee601 100644 --- a/wolfssl/wolfcrypt/aes.h +++ b/wolfssl/wolfcrypt/aes.h @@ -369,6 +369,7 @@ WOLFSSL_API int wc_AesEcbDecrypt(Aes* aes, byte* out, word32 cSz, byte* s, word32 sSz); #endif /* HAVE_AESGCM */ #ifdef HAVE_AESCCM + WOLFSSL_LOCAL int wc_AesCcmCheckTagSize(int sz); WOLFSSL_API int wc_AesCcmSetKey(Aes* aes, const byte* key, word32 keySz); WOLFSSL_API int wc_AesCcmEncrypt(Aes* aes, byte* out, const byte* in, word32 inSz, From 390f066028c763fe8ce3457176ada2a7560790cd Mon Sep 17 00:00:00 2001 From: Sean Parkinson Date: Wed, 29 Apr 2020 09:44:10 +1000 Subject: [PATCH 068/298] Allow TLS 1.3 CertificateVerify to handle 8192-bit RSA --- wolfssl/internal.h | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/wolfssl/internal.h b/wolfssl/internal.h index ab04b3ded..a60ad2cda 100644 --- a/wolfssl/internal.h +++ b/wolfssl/internal.h @@ -1149,7 +1149,7 @@ enum { /* set maximum DH key size allowed */ #ifndef WOLFSSL_MAX_DHKEY_BITS #if (defined(USE_FAST_MATH) && defined(FP_MAX_BITS) && FP_MAX_BITS >= 16384) - #define WOLFSSL_MAX_DHKEY_BITS 8192 + #define WOLFSSL_MAX_DHKEY_BITS (FP_MAX_BITS / 2) #else #define WOLFSSL_MAX_DHKEY_BITS 4096 #endif @@ -1176,6 +1176,17 @@ enum { #define MAX_EARLY_DATA_SZ 4096 #endif +#ifndef WOLFSSL_MAX_RSA_BITS + #if (defined(USE_FAST_MATH) && defined(FP_MAX_BITS) && FP_MAX_BITS >= 16384) + #define WOLFSSL_MAX_RSA_BITS (FP_MAX_BITS / 2) + #else + #define WOLFSSL_MAX_RSA_BITS 4096 + #endif +#endif +#if (WOLFSSL_MAX_RSA_BITS % 8) + #error RSA maximum bit size must be multiple of 8 +#endif + enum Misc { CIPHER_BYTE = 0x00, /* Default ciphers */ ECC_BYTE = 0xC0, /* ECC first cipher suite byte */ @@ -1218,9 +1229,9 @@ enum Misc { SECRET_LEN = WOLFSSL_MAX_MASTER_KEY_LENGTH, /* pre RSA and all master */ #if defined(WOLFSSL_MYSQL_COMPATIBLE) || \ - (defined(USE_FAST_MATH) && defined(FP_MAX_BITS) && FP_MAX_BITS > 8192) + (defined(USE_FAST_MATH) && defined(FP_MAX_BITS) && FP_MAX_BITS >= 16384) #ifndef NO_PSK - ENCRYPT_LEN = 1024 + MAX_PSK_ID_LEN + 2, /* 8192 bit static buffer */ + ENCRYPT_LEN = (FP_MAX_BITS / 2 / 8) + MAX_PSK_ID_LEN + 2, #else ENCRYPT_LEN = 1024, /* allow 8192 bit static buffer */ #endif @@ -1418,7 +1429,7 @@ enum Misc { MIN_RSA_SHA384_PSS_BITS = 384 * 2 + 8 * 8, /* Min key size */ #ifndef NO_RSA - MAX_CERT_VERIFY_SZ = 4096 / 8, /* max RSA - default 4096-bits */ + MAX_CERT_VERIFY_SZ = WOLFSSL_MAX_RSA_BITS / 8, /* max RSA bytes */ #elif defined(HAVE_ECC) MAX_CERT_VERIFY_SZ = ECC_MAX_SIG_SIZE, /* max ECC */ #elif defined(HAVE_ED448) From 505fbed4df1cd6500415df0059acb136eb6c220f Mon Sep 17 00:00:00 2001 From: Jacob Barthelmeh Date: Wed, 29 Apr 2020 15:15:54 -0600 Subject: [PATCH 069/298] fix AES-CCM tag size check on decryption --- wolfcrypt/src/aes.c | 5 +---- wolfcrypt/src/port/arm/armv8-aes.c | 4 ++++ wolfcrypt/src/port/caam/caam_aes.c | 4 ++++ 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/wolfcrypt/src/aes.c b/wolfcrypt/src/aes.c index 4fbf3ef15..165382b06 100644 --- a/wolfcrypt/src/aes.c +++ b/wolfcrypt/src/aes.c @@ -7305,10 +7305,7 @@ int wc_AesCcmDecrypt(Aes* aes, byte* out, const byte* in, word32 inSz, return BAD_FUNC_ARG; /* sanity check on tag size */ - if (authTagSz != 4 && authTagSz != 6 && authTagSz != 8 && - authTagSz != 10 && authTagSz != 12 && authTagSz != 14 && - authTagSz != 16) { - WOLFSSL_MSG("Bad auth tag size AES-CCM"); + if (wc_AesCcmCheckTagSize(authTagSz) != 0) { return BAD_FUNC_ARG; } diff --git a/wolfcrypt/src/port/arm/armv8-aes.c b/wolfcrypt/src/port/arm/armv8-aes.c index ad5cfa873..8999a6f74 100644 --- a/wolfcrypt/src/port/arm/armv8-aes.c +++ b/wolfcrypt/src/port/arm/armv8-aes.c @@ -4510,6 +4510,10 @@ int wc_AesCcmDecrypt(Aes* aes, byte* out, const byte* in, word32 inSz, || authTag == NULL || nonceSz < 7 || nonceSz > 13) return BAD_FUNC_ARG; + if (wc_AesCcmCheckTagSize(authTagSz) != 0) { + return BAD_FUNC_ARG; + } + o = out; oSz = inSz; XMEMCPY(B+1, nonce, nonceSz); diff --git a/wolfcrypt/src/port/caam/caam_aes.c b/wolfcrypt/src/port/caam/caam_aes.c index dad970ccc..c83e6c931 100644 --- a/wolfcrypt/src/port/caam/caam_aes.c +++ b/wolfcrypt/src/port/caam/caam_aes.c @@ -580,6 +580,10 @@ int wc_AesCcmDecrypt(Aes* aes, byte* out, authTagSz > AES_BLOCK_SIZE) return BAD_FUNC_ARG; + if (wc_AesCcmCheckTagSize(authTagSz) != 0) { + return BAD_FUNC_ARG; + } + if (wc_AesGetKeySize(aes, &keySz) != 0) { return BAD_FUNC_ARG; } From 7879d3762a7c0e33d439c8997b60376a4c91c0c2 Mon Sep 17 00:00:00 2001 From: Sean Parkinson Date: Wed, 29 Apr 2020 11:17:53 +1000 Subject: [PATCH 070/298] TLS13: Prepend the SupportedVersions extension to list Must have SupportedVersions at start of list for Cookie to be constructed correctly. Application can set the key share extension before handshake and SupportedVersions will be added after. Extensions written in order of adding to list. Prepend SupportedVersions so that it will always appear in the correct place so when reconstructing HelloRetryRequest, the extensions will always be in the same order. --- src/tls.c | 45 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 43 insertions(+), 2 deletions(-) diff --git a/src/tls.c b/src/tls.c index 1b9858a75..e065c7659 100644 --- a/src/tls.c +++ b/src/tls.c @@ -1374,6 +1374,43 @@ static int TLSX_Push(TLSX** list, TLSX_Type type, void* data, void* heap) return 0; } +#ifdef WOLFSSL_TLS13 + +/** + * Creates a new extension and prepend it to the provided list. + * Checks for duplicate extensions, keeps the newest. + */ +static int TLSX_Prepend(TLSX** list, TLSX_Type type, void* data, void* heap) +{ + TLSX* extension = TLSX_New(type, data, heap); + TLSX* curr = *list; + + if (extension == NULL) + return MEMORY_E; + + /* remove duplicate extensions, there should be only one of each type. */ + while (curr && curr->next) { + if (curr->next->type == type) { + TLSX *next = curr->next; + + curr->next = next->next; + next->next = NULL; + + TLSX_FreeAll(next, heap); + } + curr = curr->next; + } + + if (curr) + curr->next = extension; + else + *list = extension; + + return 0; +} + +#endif /* WOLFSSL_TLS13 */ + #ifndef NO_WOLFSSL_CLIENT int TLSX_CheckUnsupportedExtension(WOLFSSL* ssl, TLSX_Type type); @@ -5997,6 +6034,7 @@ static int TLSX_SupportedVersions_Parse(WOLFSSL* ssl, byte* input, byte major, minor; int newMinor = 0; int set = 0; + int ret; if (msgType == client_hello) { /* Must contain a length and at least one version. */ @@ -6049,8 +6087,11 @@ static int TLSX_SupportedVersions_Parse(WOLFSSL* ssl, byte* input, if (minor >= TLSv1_3_MINOR) { if (!ssl->options.tls1_3) { ssl->options.tls1_3 = 1; - TLSX_Push(&ssl->extensions, TLSX_SUPPORTED_VERSIONS, ssl, - ssl->heap); + ret = TLSX_Prepend(&ssl->extensions, + TLSX_SUPPORTED_VERSIONS, ssl, ssl->heap); + if (ret != 0) { + return ret; + } #ifndef WOLFSSL_TLS13_DRAFT_18 TLSX_SetResponse(ssl, TLSX_SUPPORTED_VERSIONS); #endif From b6bd86d2b112103eb65efebaf1698aa3193a8c8d Mon Sep 17 00:00:00 2001 From: John Safranek Date: Thu, 30 Apr 2020 19:41:20 -0700 Subject: [PATCH 071/298] TFM Warnings When building in VS, the MSC will complain about some constants getting implicitly promoted to 64-bit. Added some type-casts to hush the warnings. --- wolfcrypt/src/tfm.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/wolfcrypt/src/tfm.c b/wolfcrypt/src/tfm.c index 61b31f0e1..b163a35ff 100644 --- a/wolfcrypt/src/tfm.c +++ b/wolfcrypt/src/tfm.c @@ -1739,7 +1739,7 @@ static int _fp_exptmod_nct(fp_int * G, fp_int * X, fp_int * P, fp_int * Y) if (M == NULL) { return FP_MEM; } - res = &M[1 << winsize]; + res = &M[(word32)(1 << winsize)]; /* init M array */ for(x = 0; x < (1 << winsize); x++) @@ -1769,10 +1769,10 @@ static int _fp_exptmod_nct(fp_int * G, fp_int * X, fp_int * P, fp_int * Y) /* compute the value at M[1<<(winsize-1)] by * squaring M[1] (winsize-1) times */ - fp_copy (&M[1], &M[1 << (winsize - 1)]); + fp_copy (&M[1], &M[(word32)(1 << (winsize - 1))]); for (x = 0; x < (winsize - 1); x++) { - fp_sqr (&M[1 << (winsize - 1)], &M[1 << (winsize - 1)]); - err = fp_montgomery_reduce (&M[1 << (winsize - 1)], P, mp); + fp_sqr (&M[(word32)(1 << (winsize - 1))], &M[(word32)(1 << (winsize - 1))]); + err = fp_montgomery_reduce (&M[(word32)(1 << (winsize - 1))], P, mp); if (err != FP_OKAY) { XFREE(M, NULL, DYNAMIC_TYPE_BIGINT); return err; From 31502ec3f93e8f2d0561ed15e2b43bd7ae077dc4 Mon Sep 17 00:00:00 2001 From: David Garske Date: Fri, 1 May 2020 07:32:00 -0700 Subject: [PATCH 072/298] Fix issue with failed TCP connect using invalid socket file descriptor on close. Fixes #2936 --- src/wolfio.c | 35 +++++++++++++++++++---------------- wolfssl/wolfio.h | 6 ++++++ 2 files changed, 25 insertions(+), 16 deletions(-) diff --git a/src/wolfio.c b/src/wolfio.c index b7032caee..8c9932ff0 100644 --- a/src/wolfio.c +++ b/src/wolfio.c @@ -779,6 +779,10 @@ int wolfIO_TcpConnect(SOCKET_T* sockfd, const char* ip, word16 port, int to_sec) SOCKADDR_IN *sin; #endif + if (sockfd == NULL || ip == NULL) { + return -1; + } + XMEMSET(&addr, 0, sizeof(addr)); #ifdef WOLFIO_DEBUG @@ -821,18 +825,15 @@ int wolfIO_TcpConnect(SOCKET_T* sockfd, const char* ip, word16 port, int to_sec) #endif *sockfd = (SOCKET_T)socket(addr.ss_family, SOCK_STREAM, 0); - #ifdef USE_WINDOWS_API - if (*sockfd == INVALID_SOCKET) { + if (*sockfd == SOCKET_INVALID) +#else + if (*sockfd <= SOCKET_INVALID) +#endif + { WOLFSSL_MSG("bad socket fd, out of fds?"); return -1; } -#else - if (*sockfd < 0) { - WOLFSSL_MSG("bad socket fd, out of fds?"); - return -1; - } -#endif #ifdef HAVE_IO_TIMEOUT /* if timeout value provided then set socket non-blocking */ @@ -857,6 +858,8 @@ int wolfIO_TcpConnect(SOCKET_T* sockfd, const char* ip, word16 port, int to_sec) #endif if (ret != 0) { WOLFSSL_MSG("Responder tcp connect failed"); + CloseSocket(*sockfd); + *sockfd = SOCKET_INVALID; return -1; } return ret; @@ -1338,7 +1341,7 @@ int wolfIO_HttpProcessResponseOcsp(int sfd, byte** respBuf, int EmbedOcspLookup(void* ctx, const char* url, int urlSz, byte* ocspReqBuf, int ocspReqSz, byte** ocspRespBuf) { - SOCKET_T sfd = 0; + SOCKET_T sfd = SOCKET_INVALID; word16 port; int ret = -1; #ifdef WOLFSSL_SMALL_STACK @@ -1385,7 +1388,7 @@ int EmbedOcspLookup(void* ctx, const char* url, int urlSz, httpBuf, httpBufSz); ret = wolfIO_TcpConnect(&sfd, domainName, port, io_timeout_sec); - if ((ret != 0) || ((int)sfd < 0)) { + if (ret != 0) { WOLFSSL_MSG("OCSP Responder connection failed"); } else if (wolfIO_Send(sfd, (char*)httpBuf, httpBufSz, 0) != @@ -1400,8 +1403,8 @@ int EmbedOcspLookup(void* ctx, const char* url, int urlSz, ret = wolfIO_HttpProcessResponseOcsp(sfd, ocspRespBuf, httpBuf, HTTP_SCRATCH_BUFFER_SIZE, ctx); } - - CloseSocket(sfd); + if (sfd != SOCKET_INVALID) + CloseSocket(sfd); XFREE(httpBuf, ctx, DYNAMIC_TYPE_OCSP); } } @@ -1459,7 +1462,7 @@ int wolfIO_HttpProcessResponseCrl(WOLFSSL_CRL* crl, int sfd, byte* httpBuf, int EmbedCrlLookup(WOLFSSL_CRL* crl, const char* url, int urlSz) { - SOCKET_T sfd = 0; + SOCKET_T sfd = SOCKET_INVALID; word16 port; int ret = -1; #ifdef WOLFSSL_SMALL_STACK @@ -1491,7 +1494,7 @@ int EmbedCrlLookup(WOLFSSL_CRL* crl, const char* url, int urlSz) httpBuf, httpBufSz); ret = wolfIO_TcpConnect(&sfd, domainName, port, io_timeout_sec); - if ((ret != 0) || (sfd < 0)) { + if (ret != 0) { WOLFSSL_MSG("CRL connection failed"); } else if (wolfIO_Send(sfd, (char*)httpBuf, httpBufSz, 0) @@ -1502,8 +1505,8 @@ int EmbedCrlLookup(WOLFSSL_CRL* crl, const char* url, int urlSz) ret = wolfIO_HttpProcessResponseCrl(crl, sfd, httpBuf, HTTP_SCRATCH_BUFFER_SIZE); } - - CloseSocket(sfd); + if (sfd != SOCKET_INVALID) + CloseSocket(sfd); XFREE(httpBuf, crl->heap, DYNAMIC_TYPE_CRL); } } diff --git a/wolfssl/wolfio.h b/wolfssl/wolfio.h index 7e97accce..9eaa03a85 100644 --- a/wolfssl/wolfio.h +++ b/wolfssl/wolfio.h @@ -303,8 +303,14 @@ #ifdef USE_WINDOWS_API typedef unsigned int SOCKET_T; + #ifndef SOCKET_INVALID + #define SOCKET_INVALID INVALID_SOCKET + #endif #else typedef int SOCKET_T; + #ifndef SOCKET_INVALID + #define SOCKET_INVALID -1 + #endif #endif #ifndef WOLFSSL_NO_SOCK From 9f735b4d6ea577467111281467133d8fbe323eba Mon Sep 17 00:00:00 2001 From: Jacob Barthelmeh Date: Fri, 1 May 2020 16:41:18 -0600 Subject: [PATCH 073/298] sanity check on PemToDer type --- tests/api.c | 22 ++++++++++ wolfcrypt/src/asn.c | 99 ++++++++++++++++++++++++++------------------- 2 files changed, 80 insertions(+), 41 deletions(-) diff --git a/tests/api.c b/tests/api.c index 899d4ef13..666c1c55f 100644 --- a/tests/api.c +++ b/tests/api.c @@ -20195,6 +20195,28 @@ static void test_wc_PemToDer(void) if (cert_buf) free(cert_buf); + +#ifdef HAVE_ECC + { + const char* ecc_private_key = "./certs/ecc-privOnlyKey.pem"; + byte key_buf[256] = {0}; + + /* Test fail of loading a key with cert type */ + AssertIntEQ(load_file(ecc_private_key, &cert_buf, &cert_sz), 0); + key_buf[0] = '\n'; + XMEMCPY(key_buf + 1, cert_buf, cert_sz); + AssertIntNE((ret = wc_PemToDer(key_buf, cert_sz + 1, CERT_TYPE, + &pDer, NULL, &info, &eccKey)), 0); + + #ifdef OPENSSL_EXTRA + AssertIntEQ((ret = wc_PemToDer(key_buf, cert_sz + 1, PRIVATEKEY_TYPE, + &pDer, NULL, &info, &eccKey)), 0); + #endif + wc_FreeDer(&pDer); + if (cert_buf) + free(cert_buf); + } +#endif printf(resultFmt, passed); #endif } diff --git a/wolfcrypt/src/asn.c b/wolfcrypt/src/asn.c index 2c7facc55..32d4a510c 100644 --- a/wolfcrypt/src/asn.c +++ b/wolfcrypt/src/asn.c @@ -10383,48 +10383,65 @@ int PemToDer(const unsigned char* buff, long longSz, int type, if (!headerEnd) { #ifdef OPENSSL_EXTRA - char* beginEnd; - int endLen; - /* see if there is a -----BEGIN * PRIVATE KEY----- header */ - headerEnd = XSTRNSTR((char*)buff, PRIV_KEY_SUFFIX, sz); - if (headerEnd) { - beginEnd = headerEnd + XSTR_SIZEOF(PRIV_KEY_SUFFIX); - /* back up to BEGIN_PRIV_KEY_PREFIX */ - headerEnd -= XSTR_SIZEOF(BEGIN_PRIV_KEY_PREFIX); - while (headerEnd > (char*)buff && - XSTRNCMP(headerEnd, BEGIN_PRIV_KEY_PREFIX, - XSTR_SIZEOF(BEGIN_PRIV_KEY_PREFIX)) != 0) { - headerEnd--; - } - if (headerEnd <= (char*)buff || - XSTRNCMP(headerEnd, BEGIN_PRIV_KEY_PREFIX, - XSTR_SIZEOF(BEGIN_PRIV_KEY_PREFIX)) != 0 || - beginEnd - headerEnd > PEM_LINE_LEN) { - WOLFSSL_MSG("Couldn't find PEM header"); - return ASN_NO_PEM_HEADER; - } - /* headerEnd now points to beginning of header */ - XMEMCPY(beginBuf, headerEnd, beginEnd - headerEnd); - beginBuf[beginEnd - headerEnd] = '\0'; - /* look for matching footer */ - footer = XSTRNSTR(beginEnd, - beginBuf + XSTR_SIZEOF(BEGIN_PRIV_KEY_PREFIX), - (unsigned int)((char*)buff + sz - beginEnd)); - if (!footer) { - WOLFSSL_MSG("Couldn't find PEM footer"); - return ASN_NO_PEM_HEADER; - } - footer -= XSTR_SIZEOF(END_PRIV_KEY_PREFIX); - endLen = (unsigned int)(beginEnd - headerEnd - - (XSTR_SIZEOF(BEGIN_PRIV_KEY_PREFIX) - - XSTR_SIZEOF(END_PRIV_KEY_PREFIX))); - XMEMCPY(endBuf, footer, endLen); - endBuf[endLen] = '\0'; + if (type == PRIVATEKEY_TYPE) { + char* beginEnd; + int endLen; + /* see if there is a -----BEGIN * PRIVATE KEY----- header */ + headerEnd = XSTRNSTR((char*)buff, PRIV_KEY_SUFFIX, sz); + if (headerEnd) { + beginEnd = headerEnd + XSTR_SIZEOF(PRIV_KEY_SUFFIX); + if (beginEnd >= (char*)buff + sz) { + return BUFFER_E; + } - header = beginBuf; - footer = endBuf; - headerEnd = beginEnd; - } else { + /* back up to BEGIN_PRIV_KEY_PREFIX */ + while (headerEnd > (char*)buff && + XSTRNCMP(headerEnd, BEGIN_PRIV_KEY_PREFIX, + XSTR_SIZEOF(BEGIN_PRIV_KEY_PREFIX)) != 0 && + *headerEnd != '\n') { + headerEnd--; + } + if (headerEnd <= (char*)buff || + XSTRNCMP(headerEnd, BEGIN_PRIV_KEY_PREFIX, + XSTR_SIZEOF(BEGIN_PRIV_KEY_PREFIX)) != 0 || + beginEnd - headerEnd > PEM_LINE_LEN) { + WOLFSSL_MSG("Couldn't find PEM header"); + return ASN_NO_PEM_HEADER; + } + + /* headerEnd now points to beginning of header */ + XMEMCPY(beginBuf, headerEnd, beginEnd - headerEnd); + beginBuf[beginEnd - headerEnd] = '\0'; + /* look for matching footer */ + footer = XSTRNSTR(beginEnd, + beginBuf + XSTR_SIZEOF(BEGIN_PRIV_KEY_PREFIX), + (unsigned int)((char*)buff + sz - beginEnd)); + if (!footer) { + WOLFSSL_MSG("Couldn't find PEM footer"); + return ASN_NO_PEM_HEADER; + } + + footer -= XSTR_SIZEOF(END_PRIV_KEY_PREFIX); + if (footer > (char*)buff + sz - XSTR_SIZEOF(END_PRIV_KEY_PREFIX) + || XSTRNCMP(footer, END_PRIV_KEY_PREFIX, + XSTR_SIZEOF(END_PRIV_KEY_PREFIX)) != 0) { + WOLFSSL_MSG("Unexpected footer for PEM"); + return BUFFER_E; + } + + endLen = (unsigned int)(beginEnd - headerEnd - + (XSTR_SIZEOF(BEGIN_PRIV_KEY_PREFIX) - + XSTR_SIZEOF(END_PRIV_KEY_PREFIX))); + XMEMCPY(endBuf, footer, endLen); + endBuf[endLen] = '\0'; + + header = beginBuf; + footer = endBuf; + headerEnd = beginEnd; + } + } + + if (!headerEnd) { WOLFSSL_MSG("Couldn't find PEM header"); return ASN_NO_PEM_HEADER; } From 082e51d7780cef40f4ee896a8aede5fe6feaa6b5 Mon Sep 17 00:00:00 2001 From: Jacob Barthelmeh Date: Mon, 4 May 2020 10:32:05 -0600 Subject: [PATCH 074/298] check on length of unwrap before memmove --- wolfcrypt/src/asn.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/wolfcrypt/src/asn.c b/wolfcrypt/src/asn.c index 2c7facc55..b14356906 100644 --- a/wolfcrypt/src/asn.c +++ b/wolfcrypt/src/asn.c @@ -2683,6 +2683,9 @@ int ToTraditional_ex(byte* input, word32 sz, word32* algId) if (length < 0) return length; + if (length + inOutIdx > sz) + return BUFFER_E; + XMEMMOVE(input, input + inOutIdx, length); return length; From c28ad38b168a374acf813c138f57a78671a3ec2c Mon Sep 17 00:00:00 2001 From: David Garske Date: Mon, 4 May 2020 10:49:59 -0700 Subject: [PATCH 075/298] Fix for cast issue caused by PR #2900. Applies to `WOLFSSL_SP_CACHE_RESISTANT` and c32/c64 versions only. --- wolfcrypt/src/sp_c32.c | 4 ++-- wolfcrypt/src/sp_c64.c | 4 ++-- wolfcrypt/src/sp_int.c | 1 + 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/wolfcrypt/src/sp_c32.c b/wolfcrypt/src/sp_c32.c index 4b9596dc7..bd7a119fb 100644 --- a/wolfcrypt/src/sp_c32.c +++ b/wolfcrypt/src/sp_c32.c @@ -14021,7 +14021,7 @@ static int sp_256_ecc_mulmod_10(sp_point_256* r, const sp_point_256* g, const sp (void)heap; #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && !defined(WOLFSSL_SP_NO_MALLOC) - t = (sp_point*)XMALLOC(sizeof(*t) * 3, heap, DYNAMIC_TYPE_ECC); + t = (sp_point_256*)XMALLOC(sizeof(*t) * 3, heap, DYNAMIC_TYPE_ECC); if (t == NULL) err = MEMORY_E; tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 10 * 5, heap, @@ -19647,7 +19647,7 @@ static int sp_384_ecc_mulmod_15(sp_point_384* r, const sp_point_384* g, const sp (void)heap; #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && !defined(WOLFSSL_SP_NO_MALLOC) - t = (sp_point*)XMALLOC(sizeof(*t) * 3, heap, DYNAMIC_TYPE_ECC); + t = (sp_point_384*)XMALLOC(sizeof(*t) * 3, heap, DYNAMIC_TYPE_ECC); if (t == NULL) err = MEMORY_E; tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 15 * 6, heap, diff --git a/wolfcrypt/src/sp_c64.c b/wolfcrypt/src/sp_c64.c index 9038173ed..a42071790 100644 --- a/wolfcrypt/src/sp_c64.c +++ b/wolfcrypt/src/sp_c64.c @@ -13841,7 +13841,7 @@ static int sp_256_ecc_mulmod_5(sp_point_256* r, const sp_point_256* g, const sp_ (void)heap; #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && !defined(WOLFSSL_SP_NO_MALLOC) - t = (sp_point*)XMALLOC(sizeof(*t) * 3, heap, DYNAMIC_TYPE_ECC); + t = (sp_point_256*)XMALLOC(sizeof(*t) * 3, heap, DYNAMIC_TYPE_ECC); if (t == NULL) err = MEMORY_E; tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 5 * 5, heap, @@ -19027,7 +19027,7 @@ static int sp_384_ecc_mulmod_7(sp_point_384* r, const sp_point_384* g, const sp_ (void)heap; #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && !defined(WOLFSSL_SP_NO_MALLOC) - t = (sp_point*)XMALLOC(sizeof(*t) * 3, heap, DYNAMIC_TYPE_ECC); + t = (sp_point_384*)XMALLOC(sizeof(*t) * 3, heap, DYNAMIC_TYPE_ECC); if (t == NULL) err = MEMORY_E; tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 7 * 6, heap, diff --git a/wolfcrypt/src/sp_int.c b/wolfcrypt/src/sp_int.c index 0db891b98..36f1165db 100644 --- a/wolfcrypt/src/sp_int.c +++ b/wolfcrypt/src/sp_int.c @@ -53,6 +53,7 @@ * WOLFSSL_SP_ARM64_ASM Enable Aarch64 assembly speedups * WOLFSSL_SP_ARM_CORTEX_M_ASM Enable Cortex-M assembly speedups * WOLFSSL_SP_ARM_THUMB_ASM Enable ARM Thumb assembly speedups (used with -mthumb) + * SP_WORD_SIZE Force 32 or 64 bit mode */ #ifdef WOLFSSL_SP_MATH From 8e0f5ef8ce0696c8c276936e452ea5bb7ab79325 Mon Sep 17 00:00:00 2001 From: David Garske Date: Mon, 4 May 2020 11:18:46 -0700 Subject: [PATCH 076/298] Fixes for `WOLFSSL_SP_CACHE_RESISTANT` with small stack. --- wolfcrypt/src/sp_c32.c | 72 ++++++++++++++---------------------------- wolfcrypt/src/sp_c64.c | 72 ++++++++++++++---------------------------- 2 files changed, 48 insertions(+), 96 deletions(-) diff --git a/wolfcrypt/src/sp_c32.c b/wolfcrypt/src/sp_c32.c index bd7a119fb..72557cb35 100644 --- a/wolfcrypt/src/sp_c32.c +++ b/wolfcrypt/src/sp_c32.c @@ -1976,11 +1976,11 @@ static int sp_2048_mod_exp_45(sp_digit* r, const sp_digit* a, const sp_digit* e, return err; #elif defined(WOLFSSL_SP_CACHE_RESISTANT) #ifndef WOLFSSL_SMALL_STACK - sp_digit t[3][90]; + sp_digit td[90]; #else sp_digit* td; - sp_digit* t[3]; #endif + sp_digit* t[3]; sp_digit* norm; sp_digit mp = 1; sp_digit n; @@ -1997,11 +1997,9 @@ static int sp_2048_mod_exp_45(sp_digit* r, const sp_digit* a, const sp_digit* e, #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK t[0] = td; t[1] = &td[45 * 2]; t[2] = &td[2 * 45 * 2]; -#endif norm = t[0]; sp_2048_mont_setup(m, &mp); @@ -2062,11 +2060,11 @@ static int sp_2048_mod_exp_45(sp_digit* r, const sp_digit* a, const sp_digit* e, return err; #else #ifndef WOLFSSL_SMALL_STACK - sp_digit t[32][90]; + sp_digit td[32][90]; #else - sp_digit* t[32]; sp_digit* td; #endif + sp_digit* t[32]; sp_digit* norm; sp_digit rt[90]; sp_digit mp = 1; @@ -2084,10 +2082,8 @@ static int sp_2048_mod_exp_45(sp_digit* r, const sp_digit* a, const sp_digit* e, #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK for (i=0; i<32; i++) t[i] = td + i * 90; -#endif norm = t[0]; sp_2048_mont_setup(m, &mp); @@ -2908,11 +2904,11 @@ static int sp_2048_mod_exp_90(sp_digit* r, const sp_digit* a, const sp_digit* e, return err; #elif defined(WOLFSSL_SP_CACHE_RESISTANT) #ifndef WOLFSSL_SMALL_STACK - sp_digit t[3][180]; + sp_digit td[180]; #else sp_digit* td; - sp_digit* t[3]; #endif + sp_digit* t[3]; sp_digit* norm; sp_digit mp = 1; sp_digit n; @@ -2929,11 +2925,9 @@ static int sp_2048_mod_exp_90(sp_digit* r, const sp_digit* a, const sp_digit* e, #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK t[0] = td; t[1] = &td[90 * 2]; t[2] = &td[2 * 90 * 2]; -#endif norm = t[0]; sp_2048_mont_setup(m, &mp); @@ -2994,11 +2988,11 @@ static int sp_2048_mod_exp_90(sp_digit* r, const sp_digit* a, const sp_digit* e, return err; #else #ifndef WOLFSSL_SMALL_STACK - sp_digit t[32][180]; + sp_digit td[32][180]; #else - sp_digit* t[32]; sp_digit* td; #endif + sp_digit* t[32]; sp_digit* norm; sp_digit rt[180]; sp_digit mp = 1; @@ -3016,10 +3010,8 @@ static int sp_2048_mod_exp_90(sp_digit* r, const sp_digit* a, const sp_digit* e, #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK for (i=0; i<32; i++) t[i] = td + i * 180; -#endif norm = t[0]; sp_2048_mont_setup(m, &mp); @@ -5777,11 +5769,11 @@ static int sp_3072_mod_exp_67(sp_digit* r, const sp_digit* a, const sp_digit* e, return err; #elif defined(WOLFSSL_SP_CACHE_RESISTANT) #ifndef WOLFSSL_SMALL_STACK - sp_digit t[3][134]; + sp_digit td[134]; #else sp_digit* td; - sp_digit* t[3]; #endif + sp_digit* t[3]; sp_digit* norm; sp_digit mp = 1; sp_digit n; @@ -5798,11 +5790,9 @@ static int sp_3072_mod_exp_67(sp_digit* r, const sp_digit* a, const sp_digit* e, #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK t[0] = td; t[1] = &td[67 * 2]; t[2] = &td[2 * 67 * 2]; -#endif norm = t[0]; sp_3072_mont_setup(m, &mp); @@ -5863,11 +5853,11 @@ static int sp_3072_mod_exp_67(sp_digit* r, const sp_digit* a, const sp_digit* e, return err; #else #ifndef WOLFSSL_SMALL_STACK - sp_digit t[32][134]; + sp_digit td[32][134]; #else - sp_digit* t[32]; sp_digit* td; #endif + sp_digit* t[32]; sp_digit* norm; sp_digit rt[134]; sp_digit mp = 1; @@ -5885,10 +5875,8 @@ static int sp_3072_mod_exp_67(sp_digit* r, const sp_digit* a, const sp_digit* e, #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK for (i=0; i<32; i++) t[i] = td + i * 134; -#endif norm = t[0]; sp_3072_mont_setup(m, &mp); @@ -6745,11 +6733,11 @@ static int sp_3072_mod_exp_134(sp_digit* r, const sp_digit* a, const sp_digit* e return err; #elif defined(WOLFSSL_SP_CACHE_RESISTANT) #ifndef WOLFSSL_SMALL_STACK - sp_digit t[3][268]; + sp_digit td[268]; #else sp_digit* td; - sp_digit* t[3]; #endif + sp_digit* t[3]; sp_digit* norm; sp_digit mp = 1; sp_digit n; @@ -6766,11 +6754,9 @@ static int sp_3072_mod_exp_134(sp_digit* r, const sp_digit* a, const sp_digit* e #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK t[0] = td; t[1] = &td[134 * 2]; t[2] = &td[2 * 134 * 2]; -#endif norm = t[0]; sp_3072_mont_setup(m, &mp); @@ -6831,11 +6817,11 @@ static int sp_3072_mod_exp_134(sp_digit* r, const sp_digit* a, const sp_digit* e return err; #else #ifndef WOLFSSL_SMALL_STACK - sp_digit t[32][268]; + sp_digit td[32][268]; #else - sp_digit* t[32]; sp_digit* td; #endif + sp_digit* t[32]; sp_digit* norm; sp_digit rt[268]; sp_digit mp = 1; @@ -6853,10 +6839,8 @@ static int sp_3072_mod_exp_134(sp_digit* r, const sp_digit* a, const sp_digit* e #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK for (i=0; i<32; i++) t[i] = td + i * 268; -#endif norm = t[0]; sp_3072_mont_setup(m, &mp); @@ -9801,11 +9785,11 @@ static int sp_4096_mod_exp_98(sp_digit* r, const sp_digit* a, const sp_digit* e, return err; #elif defined(WOLFSSL_SP_CACHE_RESISTANT) #ifndef WOLFSSL_SMALL_STACK - sp_digit t[3][196]; + sp_digit td[196]; #else sp_digit* td; - sp_digit* t[3]; #endif + sp_digit* t[3]; sp_digit* norm; sp_digit mp = 1; sp_digit n; @@ -9822,11 +9806,9 @@ static int sp_4096_mod_exp_98(sp_digit* r, const sp_digit* a, const sp_digit* e, #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK t[0] = td; t[1] = &td[98 * 2]; t[2] = &td[2 * 98 * 2]; -#endif norm = t[0]; sp_4096_mont_setup(m, &mp); @@ -9887,11 +9869,11 @@ static int sp_4096_mod_exp_98(sp_digit* r, const sp_digit* a, const sp_digit* e, return err; #else #ifndef WOLFSSL_SMALL_STACK - sp_digit t[32][196]; + sp_digit td[32][196]; #else - sp_digit* t[32]; sp_digit* td; #endif + sp_digit* t[32]; sp_digit* norm; sp_digit rt[196]; sp_digit mp = 1; @@ -9909,10 +9891,8 @@ static int sp_4096_mod_exp_98(sp_digit* r, const sp_digit* a, const sp_digit* e, #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK for (i=0; i<32; i++) t[i] = td + i * 196; -#endif norm = t[0]; sp_4096_mont_setup(m, &mp); @@ -10746,11 +10726,11 @@ static int sp_4096_mod_exp_196(sp_digit* r, const sp_digit* a, const sp_digit* e return err; #elif defined(WOLFSSL_SP_CACHE_RESISTANT) #ifndef WOLFSSL_SMALL_STACK - sp_digit t[3][392]; + sp_digit td[392]; #else sp_digit* td; - sp_digit* t[3]; #endif + sp_digit* t[3]; sp_digit* norm; sp_digit mp = 1; sp_digit n; @@ -10767,11 +10747,9 @@ static int sp_4096_mod_exp_196(sp_digit* r, const sp_digit* a, const sp_digit* e #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK t[0] = td; t[1] = &td[196 * 2]; t[2] = &td[2 * 196 * 2]; -#endif norm = t[0]; sp_4096_mont_setup(m, &mp); @@ -10832,11 +10810,11 @@ static int sp_4096_mod_exp_196(sp_digit* r, const sp_digit* a, const sp_digit* e return err; #else #ifndef WOLFSSL_SMALL_STACK - sp_digit t[32][392]; + sp_digit td[32][392]; #else - sp_digit* t[32]; sp_digit* td; #endif + sp_digit* t[32]; sp_digit* norm; sp_digit rt[392]; sp_digit mp = 1; @@ -10854,10 +10832,8 @@ static int sp_4096_mod_exp_196(sp_digit* r, const sp_digit* a, const sp_digit* e #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK for (i=0; i<32; i++) t[i] = td + i * 392; -#endif norm = t[0]; sp_4096_mont_setup(m, &mp); diff --git a/wolfcrypt/src/sp_c64.c b/wolfcrypt/src/sp_c64.c index a42071790..1e49826ce 100644 --- a/wolfcrypt/src/sp_c64.c +++ b/wolfcrypt/src/sp_c64.c @@ -1624,11 +1624,11 @@ static int sp_2048_mod_exp_18(sp_digit* r, const sp_digit* a, const sp_digit* e, return err; #elif defined(WOLFSSL_SP_CACHE_RESISTANT) #ifndef WOLFSSL_SMALL_STACK - sp_digit t[3][36]; + sp_digit td[36]; #else sp_digit* td; - sp_digit* t[3]; #endif + sp_digit* t[3]; sp_digit* norm; sp_digit mp = 1; sp_digit n; @@ -1645,11 +1645,9 @@ static int sp_2048_mod_exp_18(sp_digit* r, const sp_digit* a, const sp_digit* e, #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK t[0] = td; t[1] = &td[18 * 2]; t[2] = &td[2 * 18 * 2]; -#endif norm = t[0]; sp_2048_mont_setup(m, &mp); @@ -1710,11 +1708,11 @@ static int sp_2048_mod_exp_18(sp_digit* r, const sp_digit* a, const sp_digit* e, return err; #else #ifndef WOLFSSL_SMALL_STACK - sp_digit t[32][36]; + sp_digit td[32][36]; #else - sp_digit* t[32]; sp_digit* td; #endif + sp_digit* t[32]; sp_digit* norm; sp_digit rt[36]; sp_digit mp = 1; @@ -1732,10 +1730,8 @@ static int sp_2048_mod_exp_18(sp_digit* r, const sp_digit* a, const sp_digit* e, #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK for (i=0; i<32; i++) t[i] = td + i * 36; -#endif norm = t[0]; sp_2048_mont_setup(m, &mp); @@ -2548,11 +2544,11 @@ static int sp_2048_mod_exp_36(sp_digit* r, const sp_digit* a, const sp_digit* e, return err; #elif defined(WOLFSSL_SP_CACHE_RESISTANT) #ifndef WOLFSSL_SMALL_STACK - sp_digit t[3][72]; + sp_digit td[72]; #else sp_digit* td; - sp_digit* t[3]; #endif + sp_digit* t[3]; sp_digit* norm; sp_digit mp = 1; sp_digit n; @@ -2569,11 +2565,9 @@ static int sp_2048_mod_exp_36(sp_digit* r, const sp_digit* a, const sp_digit* e, #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK t[0] = td; t[1] = &td[36 * 2]; t[2] = &td[2 * 36 * 2]; -#endif norm = t[0]; sp_2048_mont_setup(m, &mp); @@ -2634,11 +2628,11 @@ static int sp_2048_mod_exp_36(sp_digit* r, const sp_digit* a, const sp_digit* e, return err; #else #ifndef WOLFSSL_SMALL_STACK - sp_digit t[32][72]; + sp_digit td[32][72]; #else - sp_digit* t[32]; sp_digit* td; #endif + sp_digit* t[32]; sp_digit* norm; sp_digit rt[72]; sp_digit mp = 1; @@ -2656,10 +2650,8 @@ static int sp_2048_mod_exp_36(sp_digit* r, const sp_digit* a, const sp_digit* e, #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK for (i=0; i<32; i++) t[i] = td + i * 72; -#endif norm = t[0]; sp_2048_mont_setup(m, &mp); @@ -5765,11 +5757,11 @@ static int sp_3072_mod_exp_27(sp_digit* r, const sp_digit* a, const sp_digit* e, return err; #elif defined(WOLFSSL_SP_CACHE_RESISTANT) #ifndef WOLFSSL_SMALL_STACK - sp_digit t[3][54]; + sp_digit td[54]; #else sp_digit* td; - sp_digit* t[3]; #endif + sp_digit* t[3]; sp_digit* norm; sp_digit mp = 1; sp_digit n; @@ -5786,11 +5778,9 @@ static int sp_3072_mod_exp_27(sp_digit* r, const sp_digit* a, const sp_digit* e, #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK t[0] = td; t[1] = &td[27 * 2]; t[2] = &td[2 * 27 * 2]; -#endif norm = t[0]; sp_3072_mont_setup(m, &mp); @@ -5851,11 +5841,11 @@ static int sp_3072_mod_exp_27(sp_digit* r, const sp_digit* a, const sp_digit* e, return err; #else #ifndef WOLFSSL_SMALL_STACK - sp_digit t[32][54]; + sp_digit td[32][54]; #else - sp_digit* t[32]; sp_digit* td; #endif + sp_digit* t[32]; sp_digit* norm; sp_digit rt[54]; sp_digit mp = 1; @@ -5873,10 +5863,8 @@ static int sp_3072_mod_exp_27(sp_digit* r, const sp_digit* a, const sp_digit* e, #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK for (i=0; i<32; i++) t[i] = td + i * 54; -#endif norm = t[0]; sp_3072_mont_setup(m, &mp); @@ -6659,11 +6647,11 @@ static int sp_3072_mod_exp_54(sp_digit* r, const sp_digit* a, const sp_digit* e, return err; #elif defined(WOLFSSL_SP_CACHE_RESISTANT) #ifndef WOLFSSL_SMALL_STACK - sp_digit t[3][108]; + sp_digit td[108]; #else sp_digit* td; - sp_digit* t[3]; #endif + sp_digit* t[3]; sp_digit* norm; sp_digit mp = 1; sp_digit n; @@ -6680,11 +6668,9 @@ static int sp_3072_mod_exp_54(sp_digit* r, const sp_digit* a, const sp_digit* e, #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK t[0] = td; t[1] = &td[54 * 2]; t[2] = &td[2 * 54 * 2]; -#endif norm = t[0]; sp_3072_mont_setup(m, &mp); @@ -6745,11 +6731,11 @@ static int sp_3072_mod_exp_54(sp_digit* r, const sp_digit* a, const sp_digit* e, return err; #else #ifndef WOLFSSL_SMALL_STACK - sp_digit t[32][108]; + sp_digit td[32][108]; #else - sp_digit* t[32]; sp_digit* td; #endif + sp_digit* t[32]; sp_digit* norm; sp_digit rt[108]; sp_digit mp = 1; @@ -6767,10 +6753,8 @@ static int sp_3072_mod_exp_54(sp_digit* r, const sp_digit* a, const sp_digit* e, #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK for (i=0; i<32; i++) t[i] = td + i * 108; -#endif norm = t[0]; sp_3072_mont_setup(m, &mp); @@ -10022,11 +10006,11 @@ static int sp_4096_mod_exp_39(sp_digit* r, const sp_digit* a, const sp_digit* e, return err; #elif defined(WOLFSSL_SP_CACHE_RESISTANT) #ifndef WOLFSSL_SMALL_STACK - sp_digit t[3][78]; + sp_digit td[78]; #else sp_digit* td; - sp_digit* t[3]; #endif + sp_digit* t[3]; sp_digit* norm; sp_digit mp = 1; sp_digit n; @@ -10043,11 +10027,9 @@ static int sp_4096_mod_exp_39(sp_digit* r, const sp_digit* a, const sp_digit* e, #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK t[0] = td; t[1] = &td[39 * 2]; t[2] = &td[2 * 39 * 2]; -#endif norm = t[0]; sp_4096_mont_setup(m, &mp); @@ -10108,11 +10090,11 @@ static int sp_4096_mod_exp_39(sp_digit* r, const sp_digit* a, const sp_digit* e, return err; #else #ifndef WOLFSSL_SMALL_STACK - sp_digit t[32][78]; + sp_digit td[32][78]; #else - sp_digit* t[32]; sp_digit* td; #endif + sp_digit* t[32]; sp_digit* norm; sp_digit rt[78]; sp_digit mp = 1; @@ -10130,10 +10112,8 @@ static int sp_4096_mod_exp_39(sp_digit* r, const sp_digit* a, const sp_digit* e, #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK for (i=0; i<32; i++) t[i] = td + i * 78; -#endif norm = t[0]; sp_4096_mont_setup(m, &mp); @@ -11015,11 +10995,11 @@ static int sp_4096_mod_exp_78(sp_digit* r, const sp_digit* a, const sp_digit* e, return err; #elif defined(WOLFSSL_SP_CACHE_RESISTANT) #ifndef WOLFSSL_SMALL_STACK - sp_digit t[3][156]; + sp_digit td[156]; #else sp_digit* td; - sp_digit* t[3]; #endif + sp_digit* t[3]; sp_digit* norm; sp_digit mp = 1; sp_digit n; @@ -11036,11 +11016,9 @@ static int sp_4096_mod_exp_78(sp_digit* r, const sp_digit* a, const sp_digit* e, #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK t[0] = td; t[1] = &td[78 * 2]; t[2] = &td[2 * 78 * 2]; -#endif norm = t[0]; sp_4096_mont_setup(m, &mp); @@ -11101,11 +11079,11 @@ static int sp_4096_mod_exp_78(sp_digit* r, const sp_digit* a, const sp_digit* e, return err; #else #ifndef WOLFSSL_SMALL_STACK - sp_digit t[32][156]; + sp_digit td[32][156]; #else - sp_digit* t[32]; sp_digit* td; #endif + sp_digit* t[32]; sp_digit* norm; sp_digit rt[156]; sp_digit mp = 1; @@ -11123,10 +11101,8 @@ static int sp_4096_mod_exp_78(sp_digit* r, const sp_digit* a, const sp_digit* e, #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK for (i=0; i<32; i++) t[i] = td + i * 156; -#endif norm = t[0]; sp_4096_mont_setup(m, &mp); From 62d67c3da12cc52ee59396dbb31de6fa785f114b Mon Sep 17 00:00:00 2001 From: kaleb-himes Date: Mon, 4 May 2020 12:54:36 -0600 Subject: [PATCH 077/298] Don't need if not using TLS 1.2 --- src/internal.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/internal.c b/src/internal.c index 3b8fc60dd..8c6f62a63 100644 --- a/src/internal.c +++ b/src/internal.c @@ -19527,7 +19527,7 @@ exit_dpk: #endif /* WOLFSSL_TLS13 || !NO_WOLFSSL_CLIENT */ -#ifdef WOLFSSL_TLS13 +#if defined(WOLFSSL_TLS13) && !defined(WOLFSSL_NO_TLS12) /* returns 1 if able to do TLS 1.3 otherwise 0 */ static int TLSv1_3_Capable(WOLFSSL* ssl) { From 174b4d515949778e5e547f4bfbb1ffec863fd5de Mon Sep 17 00:00:00 2001 From: David Garske Date: Mon, 4 May 2020 14:23:32 -0700 Subject: [PATCH 078/298] Cleanup of SP with small stack. Expand support for `WOLFSSL_SP_NO_MALLOC`. Fix for evp.c when included directly. --- wolfcrypt/src/evp.c | 12 +- wolfcrypt/src/sp_arm32.c | 274 +++++++++--------- wolfcrypt/src/sp_arm64.c | 274 +++++++++--------- wolfcrypt/src/sp_armthumb.c | 274 +++++++++--------- wolfcrypt/src/sp_c32.c | 558 +++++++++++++++++++++++------------- wolfcrypt/src/sp_c64.c | 558 +++++++++++++++++++++++------------- wolfcrypt/src/sp_cortexm.c | 274 +++++++++--------- wolfcrypt/src/sp_int.c | 3 +- wolfcrypt/src/sp_x86_64.c | 350 +++++++++++----------- 9 files changed, 1471 insertions(+), 1106 deletions(-) diff --git a/wolfcrypt/src/evp.c b/wolfcrypt/src/evp.c index bdc46f02f..4a0bb8103 100644 --- a/wolfcrypt/src/evp.c +++ b/wolfcrypt/src/evp.c @@ -19,6 +19,13 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA */ + +#ifdef HAVE_CONFIG_H + #include +#endif + +#include + #if !defined(WOLFSSL_EVP_INCLUDED) #ifndef WOLFSSL_IGNORE_FILE_WARN #warning evp.c does not need to be compiled separately from ssl.c @@ -26,11 +33,6 @@ #elif defined(WOLFCRYPT_ONLY) #else -#ifdef HAVE_CONFIG_H - #include -#endif - -#include #include #include diff --git a/wolfcrypt/src/sp_arm32.c b/wolfcrypt/src/sp_arm32.c index b33143218..d500965f9 100644 --- a/wolfcrypt/src/sp_arm32.c +++ b/wolfcrypt/src/sp_arm32.c @@ -4830,12 +4830,12 @@ static WC_INLINE int sp_2048_mod_32(sp_digit* r, const sp_digit* a, const sp_dig static int sp_2048_mod_exp_32(sp_digit* r, const sp_digit* a, const sp_digit* e, int bits, const sp_digit* m, int reduceA) { -#ifndef WOLFSSL_SMALL_STACK - sp_digit t[16][64]; -#else - sp_digit* t[16]; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[16 * 64]; #endif + sp_digit* t[16]; sp_digit* norm; sp_digit mp = 1; sp_digit n; @@ -4844,8 +4844,8 @@ static int sp_2048_mod_exp_32(sp_digit* r, const sp_digit* a, const sp_digit* e, int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK - td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 16 * 64, NULL, +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (16 * 64), NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; @@ -4853,12 +4853,14 @@ static int sp_2048_mod_exp_32(sp_digit* r, const sp_digit* a, const sp_digit* e, #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK + norm = td; for (i=0; i<16; i++) { +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) t[i] = td + i * 64; - } +#else + t[i] = &td[i * 64]; #endif - norm = t[0]; + } sp_2048_mont_setup(m, &mp); sp_2048_mont_norm_32(norm, m); @@ -4941,7 +4943,7 @@ static int sp_2048_mod_exp_32(sp_digit* r, const sp_digit* a, const sp_digit* e, sp_2048_cond_sub_32(r, r, m, mask); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } @@ -4962,12 +4964,12 @@ static int sp_2048_mod_exp_32(sp_digit* r, const sp_digit* a, const sp_digit* e, static int sp_2048_mod_exp_32(sp_digit* r, const sp_digit* a, const sp_digit* e, int bits, const sp_digit* m, int reduceA) { -#ifndef WOLFSSL_SMALL_STACK - sp_digit t[32][64]; -#else - sp_digit* t[32]; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[32 * 64]; #endif + sp_digit* t[32]; sp_digit* norm; sp_digit mp = 1; sp_digit n; @@ -4976,8 +4978,8 @@ static int sp_2048_mod_exp_32(sp_digit* r, const sp_digit* a, const sp_digit* e, int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK - td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32 * 64, NULL, +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (32 * 64), NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; @@ -4985,12 +4987,14 @@ static int sp_2048_mod_exp_32(sp_digit* r, const sp_digit* a, const sp_digit* e, #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK + norm = td; for (i=0; i<32; i++) { +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) t[i] = td + i * 64; - } +#else + t[i] = &td[i * 64]; #endif - norm = t[0]; + } sp_2048_mont_setup(m, &mp); sp_2048_mont_norm_32(norm, m); @@ -5090,7 +5094,7 @@ static int sp_2048_mod_exp_32(sp_digit* r, const sp_digit* a, const sp_digit* e, sp_2048_cond_sub_32(r, r, m, mask); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } @@ -7087,12 +7091,12 @@ static WC_INLINE int sp_2048_mod_64_cond(sp_digit* r, const sp_digit* a, const s static int sp_2048_mod_exp_64(sp_digit* r, const sp_digit* a, const sp_digit* e, int bits, const sp_digit* m, int reduceA) { -#ifndef WOLFSSL_SMALL_STACK - sp_digit t[16][128]; -#else - sp_digit* t[16]; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[16 * 128]; #endif + sp_digit* t[16]; sp_digit* norm; sp_digit mp = 1; sp_digit n; @@ -7101,8 +7105,8 @@ static int sp_2048_mod_exp_64(sp_digit* r, const sp_digit* a, const sp_digit* e, int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK - td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 16 * 128, NULL, +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (16 * 128), NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; @@ -7110,12 +7114,14 @@ static int sp_2048_mod_exp_64(sp_digit* r, const sp_digit* a, const sp_digit* e, #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK + norm = td; for (i=0; i<16; i++) { +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) t[i] = td + i * 128; - } +#else + t[i] = &td[i * 128]; #endif - norm = t[0]; + } sp_2048_mont_setup(m, &mp); sp_2048_mont_norm_64(norm, m); @@ -7198,7 +7204,7 @@ static int sp_2048_mod_exp_64(sp_digit* r, const sp_digit* a, const sp_digit* e, sp_2048_cond_sub_64(r, r, m, mask); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } @@ -7219,12 +7225,12 @@ static int sp_2048_mod_exp_64(sp_digit* r, const sp_digit* a, const sp_digit* e, static int sp_2048_mod_exp_64(sp_digit* r, const sp_digit* a, const sp_digit* e, int bits, const sp_digit* m, int reduceA) { -#ifndef WOLFSSL_SMALL_STACK - sp_digit t[32][128]; -#else - sp_digit* t[32]; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[32 * 128]; #endif + sp_digit* t[32]; sp_digit* norm; sp_digit mp = 1; sp_digit n; @@ -7233,8 +7239,8 @@ static int sp_2048_mod_exp_64(sp_digit* r, const sp_digit* a, const sp_digit* e, int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK - td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32 * 128, NULL, +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (32 * 128), NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; @@ -7242,12 +7248,14 @@ static int sp_2048_mod_exp_64(sp_digit* r, const sp_digit* a, const sp_digit* e, #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK + norm = td; for (i=0; i<32; i++) { +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) t[i] = td + i * 128; - } +#else + t[i] = &td[i * 128]; #endif - norm = t[0]; + } sp_2048_mont_setup(m, &mp); sp_2048_mont_norm_64(norm, m); @@ -7347,7 +7355,7 @@ static int sp_2048_mod_exp_64(sp_digit* r, const sp_digit* a, const sp_digit* e, sp_2048_cond_sub_64(r, r, m, mask); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } @@ -8398,11 +8406,10 @@ static void sp_2048_lshift_64(sp_digit* r, sp_digit* a, byte n) static int sp_2048_mod_exp_2_64(sp_digit* r, const sp_digit* e, int bits, const sp_digit* m) { -#ifndef WOLFSSL_SMALL_STACK - sp_digit nd[128]; - sp_digit td[65]; -#else +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[193]; #endif sp_digit* norm; sp_digit* tmp; @@ -8413,7 +8420,7 @@ static int sp_2048_mod_exp_2_64(sp_digit* r, const sp_digit* e, int bits, int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 193, NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { @@ -8422,12 +8429,11 @@ static int sp_2048_mod_exp_2_64(sp_digit* r, const sp_digit* e, int bits, #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK norm = td; - tmp = td + 128; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + tmp = td + 128; #else - norm = nd; - tmp = td; + tmp = &td[128]; #endif sp_2048_mont_setup(m, &mp); @@ -8487,7 +8493,7 @@ static int sp_2048_mod_exp_2_64(sp_digit* r, const sp_digit* e, int bits, sp_2048_cond_sub_64(r, r, m, mask); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } @@ -15575,12 +15581,12 @@ static WC_INLINE int sp_3072_mod_48(sp_digit* r, const sp_digit* a, const sp_dig static int sp_3072_mod_exp_48(sp_digit* r, const sp_digit* a, const sp_digit* e, int bits, const sp_digit* m, int reduceA) { -#ifndef WOLFSSL_SMALL_STACK - sp_digit t[16][96]; -#else - sp_digit* t[16]; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[16 * 96]; #endif + sp_digit* t[16]; sp_digit* norm; sp_digit mp = 1; sp_digit n; @@ -15589,8 +15595,8 @@ static int sp_3072_mod_exp_48(sp_digit* r, const sp_digit* a, const sp_digit* e, int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK - td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 16 * 96, NULL, +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (16 * 96), NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; @@ -15598,12 +15604,14 @@ static int sp_3072_mod_exp_48(sp_digit* r, const sp_digit* a, const sp_digit* e, #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK + norm = td; for (i=0; i<16; i++) { +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) t[i] = td + i * 96; - } +#else + t[i] = &td[i * 96]; #endif - norm = t[0]; + } sp_3072_mont_setup(m, &mp); sp_3072_mont_norm_48(norm, m); @@ -15686,7 +15694,7 @@ static int sp_3072_mod_exp_48(sp_digit* r, const sp_digit* a, const sp_digit* e, sp_3072_cond_sub_48(r, r, m, mask); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } @@ -15707,12 +15715,12 @@ static int sp_3072_mod_exp_48(sp_digit* r, const sp_digit* a, const sp_digit* e, static int sp_3072_mod_exp_48(sp_digit* r, const sp_digit* a, const sp_digit* e, int bits, const sp_digit* m, int reduceA) { -#ifndef WOLFSSL_SMALL_STACK - sp_digit t[32][96]; -#else - sp_digit* t[32]; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[32 * 96]; #endif + sp_digit* t[32]; sp_digit* norm; sp_digit mp = 1; sp_digit n; @@ -15721,8 +15729,8 @@ static int sp_3072_mod_exp_48(sp_digit* r, const sp_digit* a, const sp_digit* e, int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK - td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32 * 96, NULL, +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (32 * 96), NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; @@ -15730,12 +15738,14 @@ static int sp_3072_mod_exp_48(sp_digit* r, const sp_digit* a, const sp_digit* e, #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK + norm = td; for (i=0; i<32; i++) { +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) t[i] = td + i * 96; - } +#else + t[i] = &td[i * 96]; #endif - norm = t[0]; + } sp_3072_mont_setup(m, &mp); sp_3072_mont_norm_48(norm, m); @@ -15835,7 +15845,7 @@ static int sp_3072_mod_exp_48(sp_digit* r, const sp_digit* a, const sp_digit* e, sp_3072_cond_sub_48(r, r, m, mask); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } @@ -18632,12 +18642,12 @@ static WC_INLINE int sp_3072_mod_96_cond(sp_digit* r, const sp_digit* a, const s static int sp_3072_mod_exp_96(sp_digit* r, const sp_digit* a, const sp_digit* e, int bits, const sp_digit* m, int reduceA) { -#ifndef WOLFSSL_SMALL_STACK - sp_digit t[16][192]; -#else - sp_digit* t[16]; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[16 * 192]; #endif + sp_digit* t[16]; sp_digit* norm; sp_digit mp = 1; sp_digit n; @@ -18646,8 +18656,8 @@ static int sp_3072_mod_exp_96(sp_digit* r, const sp_digit* a, const sp_digit* e, int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK - td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 16 * 192, NULL, +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (16 * 192), NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; @@ -18655,12 +18665,14 @@ static int sp_3072_mod_exp_96(sp_digit* r, const sp_digit* a, const sp_digit* e, #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK + norm = td; for (i=0; i<16; i++) { +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) t[i] = td + i * 192; - } +#else + t[i] = &td[i * 192]; #endif - norm = t[0]; + } sp_3072_mont_setup(m, &mp); sp_3072_mont_norm_96(norm, m); @@ -18743,7 +18755,7 @@ static int sp_3072_mod_exp_96(sp_digit* r, const sp_digit* a, const sp_digit* e, sp_3072_cond_sub_96(r, r, m, mask); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } @@ -18764,12 +18776,12 @@ static int sp_3072_mod_exp_96(sp_digit* r, const sp_digit* a, const sp_digit* e, static int sp_3072_mod_exp_96(sp_digit* r, const sp_digit* a, const sp_digit* e, int bits, const sp_digit* m, int reduceA) { -#ifndef WOLFSSL_SMALL_STACK - sp_digit t[32][192]; -#else - sp_digit* t[32]; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[32 * 192]; #endif + sp_digit* t[32]; sp_digit* norm; sp_digit mp = 1; sp_digit n; @@ -18778,8 +18790,8 @@ static int sp_3072_mod_exp_96(sp_digit* r, const sp_digit* a, const sp_digit* e, int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK - td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32 * 192, NULL, +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (32 * 192), NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; @@ -18787,12 +18799,14 @@ static int sp_3072_mod_exp_96(sp_digit* r, const sp_digit* a, const sp_digit* e, #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK + norm = td; for (i=0; i<32; i++) { +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) t[i] = td + i * 192; - } +#else + t[i] = &td[i * 192]; #endif - norm = t[0]; + } sp_3072_mont_setup(m, &mp); sp_3072_mont_norm_96(norm, m); @@ -18892,7 +18906,7 @@ static int sp_3072_mod_exp_96(sp_digit* r, const sp_digit* a, const sp_digit* e, sp_3072_cond_sub_96(r, r, m, mask); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } @@ -20215,11 +20229,10 @@ static void sp_3072_lshift_96(sp_digit* r, sp_digit* a, byte n) static int sp_3072_mod_exp_2_96(sp_digit* r, const sp_digit* e, int bits, const sp_digit* m) { -#ifndef WOLFSSL_SMALL_STACK - sp_digit nd[192]; - sp_digit td[97]; -#else +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[289]; #endif sp_digit* norm; sp_digit* tmp; @@ -20230,7 +20243,7 @@ static int sp_3072_mod_exp_2_96(sp_digit* r, const sp_digit* e, int bits, int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 289, NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { @@ -20239,12 +20252,11 @@ static int sp_3072_mod_exp_2_96(sp_digit* r, const sp_digit* e, int bits, #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK norm = td; - tmp = td + 192; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + tmp = td + 192; #else - norm = nd; - tmp = td; + tmp = &td[192]; #endif sp_3072_mont_setup(m, &mp); @@ -20304,7 +20316,7 @@ static int sp_3072_mod_exp_2_96(sp_digit* r, const sp_digit* e, int bits, sp_3072_cond_sub_96(r, r, m, mask); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } @@ -71251,12 +71263,12 @@ static WC_INLINE int sp_4096_mod_128_cond(sp_digit* r, const sp_digit* a, const static int sp_4096_mod_exp_128(sp_digit* r, const sp_digit* a, const sp_digit* e, int bits, const sp_digit* m, int reduceA) { -#ifndef WOLFSSL_SMALL_STACK - sp_digit t[16][256]; -#else - sp_digit* t[16]; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[16 * 256]; #endif + sp_digit* t[16]; sp_digit* norm; sp_digit mp = 1; sp_digit n; @@ -71265,8 +71277,8 @@ static int sp_4096_mod_exp_128(sp_digit* r, const sp_digit* a, const sp_digit* e int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK - td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 16 * 256, NULL, +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (16 * 256), NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; @@ -71274,12 +71286,14 @@ static int sp_4096_mod_exp_128(sp_digit* r, const sp_digit* a, const sp_digit* e #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK + norm = td; for (i=0; i<16; i++) { +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) t[i] = td + i * 256; - } +#else + t[i] = &td[i * 256]; #endif - norm = t[0]; + } sp_4096_mont_setup(m, &mp); sp_4096_mont_norm_128(norm, m); @@ -71362,7 +71376,7 @@ static int sp_4096_mod_exp_128(sp_digit* r, const sp_digit* a, const sp_digit* e sp_4096_cond_sub_128(r, r, m, mask); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } @@ -71383,12 +71397,12 @@ static int sp_4096_mod_exp_128(sp_digit* r, const sp_digit* a, const sp_digit* e static int sp_4096_mod_exp_128(sp_digit* r, const sp_digit* a, const sp_digit* e, int bits, const sp_digit* m, int reduceA) { -#ifndef WOLFSSL_SMALL_STACK - sp_digit t[32][256]; -#else - sp_digit* t[32]; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[32 * 256]; #endif + sp_digit* t[32]; sp_digit* norm; sp_digit mp = 1; sp_digit n; @@ -71397,8 +71411,8 @@ static int sp_4096_mod_exp_128(sp_digit* r, const sp_digit* a, const sp_digit* e int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK - td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32 * 256, NULL, +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (32 * 256), NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; @@ -71406,12 +71420,14 @@ static int sp_4096_mod_exp_128(sp_digit* r, const sp_digit* a, const sp_digit* e #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK + norm = td; for (i=0; i<32; i++) { +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) t[i] = td + i * 256; - } +#else + t[i] = &td[i * 256]; #endif - norm = t[0]; + } sp_4096_mont_setup(m, &mp); sp_4096_mont_norm_128(norm, m); @@ -71511,7 +71527,7 @@ static int sp_4096_mod_exp_128(sp_digit* r, const sp_digit* a, const sp_digit* e sp_4096_cond_sub_128(r, r, m, mask); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } @@ -73106,11 +73122,10 @@ static void sp_4096_lshift_128(sp_digit* r, sp_digit* a, byte n) static int sp_4096_mod_exp_2_128(sp_digit* r, const sp_digit* e, int bits, const sp_digit* m) { -#ifndef WOLFSSL_SMALL_STACK - sp_digit nd[256]; - sp_digit td[129]; -#else +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[385]; #endif sp_digit* norm; sp_digit* tmp; @@ -73121,7 +73136,7 @@ static int sp_4096_mod_exp_2_128(sp_digit* r, const sp_digit* e, int bits, int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 385, NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { @@ -73130,12 +73145,11 @@ static int sp_4096_mod_exp_2_128(sp_digit* r, const sp_digit* e, int bits, #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK norm = td; - tmp = td + 256; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + tmp = td + 256; #else - norm = nd; - tmp = td; + tmp = &td[256]; #endif sp_4096_mont_setup(m, &mp); @@ -73195,7 +73209,7 @@ static int sp_4096_mod_exp_2_128(sp_digit* r, const sp_digit* e, int bits, sp_4096_cond_sub_128(r, r, m, mask); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } diff --git a/wolfcrypt/src/sp_arm64.c b/wolfcrypt/src/sp_arm64.c index 370a63dbe..3ea3c4ec1 100644 --- a/wolfcrypt/src/sp_arm64.c +++ b/wolfcrypt/src/sp_arm64.c @@ -3152,12 +3152,12 @@ static WC_INLINE int sp_2048_mod_16(sp_digit* r, const sp_digit* a, const sp_dig static int sp_2048_mod_exp_16(sp_digit* r, const sp_digit* a, const sp_digit* e, int bits, const sp_digit* m, int reduceA) { -#ifndef WOLFSSL_SMALL_STACK - sp_digit t[16][32]; -#else - sp_digit* t[16]; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[16 * 32]; #endif + sp_digit* t[16]; sp_digit* norm; sp_digit mp = 1; sp_digit n; @@ -3166,8 +3166,8 @@ static int sp_2048_mod_exp_16(sp_digit* r, const sp_digit* a, const sp_digit* e, int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK - td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 16 * 32, NULL, +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (16 * 32), NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; @@ -3175,12 +3175,14 @@ static int sp_2048_mod_exp_16(sp_digit* r, const sp_digit* a, const sp_digit* e, #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK + norm = td; for (i=0; i<16; i++) { +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) t[i] = td + i * 32; - } +#else + t[i] = &td[i * 32]; #endif - norm = t[0]; + } sp_2048_mont_setup(m, &mp); sp_2048_mont_norm_16(norm, m); @@ -3263,7 +3265,7 @@ static int sp_2048_mod_exp_16(sp_digit* r, const sp_digit* a, const sp_digit* e, sp_2048_cond_sub_16(r, r, m, mask); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } @@ -3284,12 +3286,12 @@ static int sp_2048_mod_exp_16(sp_digit* r, const sp_digit* a, const sp_digit* e, static int sp_2048_mod_exp_16(sp_digit* r, const sp_digit* a, const sp_digit* e, int bits, const sp_digit* m, int reduceA) { -#ifndef WOLFSSL_SMALL_STACK - sp_digit t[32][32]; -#else - sp_digit* t[32]; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[32 * 32]; #endif + sp_digit* t[32]; sp_digit* norm; sp_digit mp = 1; sp_digit n; @@ -3298,8 +3300,8 @@ static int sp_2048_mod_exp_16(sp_digit* r, const sp_digit* a, const sp_digit* e, int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK - td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32 * 32, NULL, +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (32 * 32), NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; @@ -3307,12 +3309,14 @@ static int sp_2048_mod_exp_16(sp_digit* r, const sp_digit* a, const sp_digit* e, #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK + norm = td; for (i=0; i<32; i++) { +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) t[i] = td + i * 32; - } +#else + t[i] = &td[i * 32]; #endif - norm = t[0]; + } sp_2048_mont_setup(m, &mp); sp_2048_mont_norm_16(norm, m); @@ -3412,7 +3416,7 @@ static int sp_2048_mod_exp_16(sp_digit* r, const sp_digit* a, const sp_digit* e, sp_2048_cond_sub_16(r, r, m, mask); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } @@ -4589,12 +4593,12 @@ static WC_INLINE int sp_2048_mod_32_cond(sp_digit* r, const sp_digit* a, const s static int sp_2048_mod_exp_32(sp_digit* r, const sp_digit* a, const sp_digit* e, int bits, const sp_digit* m, int reduceA) { -#ifndef WOLFSSL_SMALL_STACK - sp_digit t[16][64]; -#else - sp_digit* t[16]; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[16 * 64]; #endif + sp_digit* t[16]; sp_digit* norm; sp_digit mp = 1; sp_digit n; @@ -4603,8 +4607,8 @@ static int sp_2048_mod_exp_32(sp_digit* r, const sp_digit* a, const sp_digit* e, int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK - td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 16 * 64, NULL, +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (16 * 64), NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; @@ -4612,12 +4616,14 @@ static int sp_2048_mod_exp_32(sp_digit* r, const sp_digit* a, const sp_digit* e, #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK + norm = td; for (i=0; i<16; i++) { +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) t[i] = td + i * 64; - } +#else + t[i] = &td[i * 64]; #endif - norm = t[0]; + } sp_2048_mont_setup(m, &mp); sp_2048_mont_norm_32(norm, m); @@ -4700,7 +4706,7 @@ static int sp_2048_mod_exp_32(sp_digit* r, const sp_digit* a, const sp_digit* e, sp_2048_cond_sub_32(r, r, m, mask); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } @@ -4721,12 +4727,12 @@ static int sp_2048_mod_exp_32(sp_digit* r, const sp_digit* a, const sp_digit* e, static int sp_2048_mod_exp_32(sp_digit* r, const sp_digit* a, const sp_digit* e, int bits, const sp_digit* m, int reduceA) { -#ifndef WOLFSSL_SMALL_STACK - sp_digit t[32][64]; -#else - sp_digit* t[32]; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[32 * 64]; #endif + sp_digit* t[32]; sp_digit* norm; sp_digit mp = 1; sp_digit n; @@ -4735,8 +4741,8 @@ static int sp_2048_mod_exp_32(sp_digit* r, const sp_digit* a, const sp_digit* e, int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK - td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32 * 64, NULL, +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (32 * 64), NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; @@ -4744,12 +4750,14 @@ static int sp_2048_mod_exp_32(sp_digit* r, const sp_digit* a, const sp_digit* e, #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK + norm = td; for (i=0; i<32; i++) { +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) t[i] = td + i * 64; - } +#else + t[i] = &td[i * 64]; #endif - norm = t[0]; + } sp_2048_mont_setup(m, &mp); sp_2048_mont_norm_32(norm, m); @@ -4849,7 +4857,7 @@ static int sp_2048_mod_exp_32(sp_digit* r, const sp_digit* a, const sp_digit* e, sp_2048_cond_sub_32(r, r, m, mask); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } @@ -5604,11 +5612,10 @@ static void sp_2048_lshift_32(sp_digit* r, sp_digit* a, byte n) static int sp_2048_mod_exp_2_32(sp_digit* r, const sp_digit* e, int bits, const sp_digit* m) { -#ifndef WOLFSSL_SMALL_STACK - sp_digit nd[64]; - sp_digit td[33]; -#else +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[97]; #endif sp_digit* norm; sp_digit* tmp; @@ -5619,7 +5626,7 @@ static int sp_2048_mod_exp_2_32(sp_digit* r, const sp_digit* e, int bits, int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 97, NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { @@ -5628,12 +5635,11 @@ static int sp_2048_mod_exp_2_32(sp_digit* r, const sp_digit* e, int bits, #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK norm = td; - tmp = td + 64; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + tmp = td + 64; #else - norm = nd; - tmp = td; + tmp = &td[64]; #endif sp_2048_mont_setup(m, &mp); @@ -5694,7 +5700,7 @@ static int sp_2048_mod_exp_2_32(sp_digit* r, const sp_digit* e, int bits, sp_2048_cond_sub_32(r, r, m, mask); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } @@ -10487,12 +10493,12 @@ static WC_INLINE int sp_3072_mod_24(sp_digit* r, const sp_digit* a, const sp_dig static int sp_3072_mod_exp_24(sp_digit* r, const sp_digit* a, const sp_digit* e, int bits, const sp_digit* m, int reduceA) { -#ifndef WOLFSSL_SMALL_STACK - sp_digit t[16][48]; -#else - sp_digit* t[16]; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[16 * 48]; #endif + sp_digit* t[16]; sp_digit* norm; sp_digit mp = 1; sp_digit n; @@ -10501,8 +10507,8 @@ static int sp_3072_mod_exp_24(sp_digit* r, const sp_digit* a, const sp_digit* e, int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK - td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 16 * 48, NULL, +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (16 * 48), NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; @@ -10510,12 +10516,14 @@ static int sp_3072_mod_exp_24(sp_digit* r, const sp_digit* a, const sp_digit* e, #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK + norm = td; for (i=0; i<16; i++) { +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) t[i] = td + i * 48; - } +#else + t[i] = &td[i * 48]; #endif - norm = t[0]; + } sp_3072_mont_setup(m, &mp); sp_3072_mont_norm_24(norm, m); @@ -10598,7 +10606,7 @@ static int sp_3072_mod_exp_24(sp_digit* r, const sp_digit* a, const sp_digit* e, sp_3072_cond_sub_24(r, r, m, mask); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } @@ -10619,12 +10627,12 @@ static int sp_3072_mod_exp_24(sp_digit* r, const sp_digit* a, const sp_digit* e, static int sp_3072_mod_exp_24(sp_digit* r, const sp_digit* a, const sp_digit* e, int bits, const sp_digit* m, int reduceA) { -#ifndef WOLFSSL_SMALL_STACK - sp_digit t[32][48]; -#else - sp_digit* t[32]; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[32 * 48]; #endif + sp_digit* t[32]; sp_digit* norm; sp_digit mp = 1; sp_digit n; @@ -10633,8 +10641,8 @@ static int sp_3072_mod_exp_24(sp_digit* r, const sp_digit* a, const sp_digit* e, int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK - td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32 * 48, NULL, +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (32 * 48), NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; @@ -10642,12 +10650,14 @@ static int sp_3072_mod_exp_24(sp_digit* r, const sp_digit* a, const sp_digit* e, #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK + norm = td; for (i=0; i<32; i++) { +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) t[i] = td + i * 48; - } +#else + t[i] = &td[i * 48]; #endif - norm = t[0]; + } sp_3072_mont_setup(m, &mp); sp_3072_mont_norm_24(norm, m); @@ -10747,7 +10757,7 @@ static int sp_3072_mod_exp_24(sp_digit* r, const sp_digit* a, const sp_digit* e, sp_3072_cond_sub_24(r, r, m, mask); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } @@ -12292,12 +12302,12 @@ static WC_INLINE int sp_3072_mod_48_cond(sp_digit* r, const sp_digit* a, const s static int sp_3072_mod_exp_48(sp_digit* r, const sp_digit* a, const sp_digit* e, int bits, const sp_digit* m, int reduceA) { -#ifndef WOLFSSL_SMALL_STACK - sp_digit t[16][96]; -#else - sp_digit* t[16]; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[16 * 96]; #endif + sp_digit* t[16]; sp_digit* norm; sp_digit mp = 1; sp_digit n; @@ -12306,8 +12316,8 @@ static int sp_3072_mod_exp_48(sp_digit* r, const sp_digit* a, const sp_digit* e, int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK - td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 16 * 96, NULL, +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (16 * 96), NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; @@ -12315,12 +12325,14 @@ static int sp_3072_mod_exp_48(sp_digit* r, const sp_digit* a, const sp_digit* e, #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK + norm = td; for (i=0; i<16; i++) { +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) t[i] = td + i * 96; - } +#else + t[i] = &td[i * 96]; #endif - norm = t[0]; + } sp_3072_mont_setup(m, &mp); sp_3072_mont_norm_48(norm, m); @@ -12403,7 +12415,7 @@ static int sp_3072_mod_exp_48(sp_digit* r, const sp_digit* a, const sp_digit* e, sp_3072_cond_sub_48(r, r, m, mask); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } @@ -12424,12 +12436,12 @@ static int sp_3072_mod_exp_48(sp_digit* r, const sp_digit* a, const sp_digit* e, static int sp_3072_mod_exp_48(sp_digit* r, const sp_digit* a, const sp_digit* e, int bits, const sp_digit* m, int reduceA) { -#ifndef WOLFSSL_SMALL_STACK - sp_digit t[32][96]; -#else - sp_digit* t[32]; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[32 * 96]; #endif + sp_digit* t[32]; sp_digit* norm; sp_digit mp = 1; sp_digit n; @@ -12438,8 +12450,8 @@ static int sp_3072_mod_exp_48(sp_digit* r, const sp_digit* a, const sp_digit* e, int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK - td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32 * 96, NULL, +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (32 * 96), NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; @@ -12447,12 +12459,14 @@ static int sp_3072_mod_exp_48(sp_digit* r, const sp_digit* a, const sp_digit* e, #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK + norm = td; for (i=0; i<32; i++) { +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) t[i] = td + i * 96; - } +#else + t[i] = &td[i * 96]; #endif - norm = t[0]; + } sp_3072_mont_setup(m, &mp); sp_3072_mont_norm_48(norm, m); @@ -12552,7 +12566,7 @@ static int sp_3072_mod_exp_48(sp_digit* r, const sp_digit* a, const sp_digit* e, sp_3072_cond_sub_48(r, r, m, mask); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } @@ -13431,11 +13445,10 @@ static void sp_3072_lshift_48(sp_digit* r, sp_digit* a, byte n) static int sp_3072_mod_exp_2_48(sp_digit* r, const sp_digit* e, int bits, const sp_digit* m) { -#ifndef WOLFSSL_SMALL_STACK - sp_digit nd[96]; - sp_digit td[49]; -#else +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[145]; #endif sp_digit* norm; sp_digit* tmp; @@ -13446,7 +13459,7 @@ static int sp_3072_mod_exp_2_48(sp_digit* r, const sp_digit* e, int bits, int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 145, NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { @@ -13455,12 +13468,11 @@ static int sp_3072_mod_exp_2_48(sp_digit* r, const sp_digit* e, int bits, #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK norm = td; - tmp = td + 96; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + tmp = td + 96; #else - norm = nd; - tmp = td; + tmp = &td[96]; #endif sp_3072_mont_setup(m, &mp); @@ -13521,7 +13533,7 @@ static int sp_3072_mod_exp_2_48(sp_digit* r, const sp_digit* e, int bits, sp_3072_cond_sub_48(r, r, m, mask); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } @@ -17221,12 +17233,12 @@ static WC_INLINE int sp_4096_mod_64_cond(sp_digit* r, const sp_digit* a, const s static int sp_4096_mod_exp_64(sp_digit* r, const sp_digit* a, const sp_digit* e, int bits, const sp_digit* m, int reduceA) { -#ifndef WOLFSSL_SMALL_STACK - sp_digit t[16][128]; -#else - sp_digit* t[16]; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[16 * 128]; #endif + sp_digit* t[16]; sp_digit* norm; sp_digit mp = 1; sp_digit n; @@ -17235,8 +17247,8 @@ static int sp_4096_mod_exp_64(sp_digit* r, const sp_digit* a, const sp_digit* e, int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK - td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 16 * 128, NULL, +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (16 * 128), NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; @@ -17244,12 +17256,14 @@ static int sp_4096_mod_exp_64(sp_digit* r, const sp_digit* a, const sp_digit* e, #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK + norm = td; for (i=0; i<16; i++) { +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) t[i] = td + i * 128; - } +#else + t[i] = &td[i * 128]; #endif - norm = t[0]; + } sp_4096_mont_setup(m, &mp); sp_4096_mont_norm_64(norm, m); @@ -17332,7 +17346,7 @@ static int sp_4096_mod_exp_64(sp_digit* r, const sp_digit* a, const sp_digit* e, sp_4096_cond_sub_64(r, r, m, mask); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } @@ -17353,12 +17367,12 @@ static int sp_4096_mod_exp_64(sp_digit* r, const sp_digit* a, const sp_digit* e, static int sp_4096_mod_exp_64(sp_digit* r, const sp_digit* a, const sp_digit* e, int bits, const sp_digit* m, int reduceA) { -#ifndef WOLFSSL_SMALL_STACK - sp_digit t[32][128]; -#else - sp_digit* t[32]; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[32 * 128]; #endif + sp_digit* t[32]; sp_digit* norm; sp_digit mp = 1; sp_digit n; @@ -17367,8 +17381,8 @@ static int sp_4096_mod_exp_64(sp_digit* r, const sp_digit* a, const sp_digit* e, int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK - td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32 * 128, NULL, +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (32 * 128), NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; @@ -17376,12 +17390,14 @@ static int sp_4096_mod_exp_64(sp_digit* r, const sp_digit* a, const sp_digit* e, #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK + norm = td; for (i=0; i<32; i++) { +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) t[i] = td + i * 128; - } +#else + t[i] = &td[i * 128]; #endif - norm = t[0]; + } sp_4096_mont_setup(m, &mp); sp_4096_mont_norm_64(norm, m); @@ -17481,7 +17497,7 @@ static int sp_4096_mod_exp_64(sp_digit* r, const sp_digit* a, const sp_digit* e, sp_4096_cond_sub_64(r, r, m, mask); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } @@ -18484,11 +18500,10 @@ static void sp_4096_lshift_64(sp_digit* r, sp_digit* a, byte n) static int sp_4096_mod_exp_2_64(sp_digit* r, const sp_digit* e, int bits, const sp_digit* m) { -#ifndef WOLFSSL_SMALL_STACK - sp_digit nd[128]; - sp_digit td[65]; -#else +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[193]; #endif sp_digit* norm; sp_digit* tmp; @@ -18499,7 +18514,7 @@ static int sp_4096_mod_exp_2_64(sp_digit* r, const sp_digit* e, int bits, int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 193, NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { @@ -18508,12 +18523,11 @@ static int sp_4096_mod_exp_2_64(sp_digit* r, const sp_digit* e, int bits, #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK norm = td; - tmp = td + 128; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + tmp = td + 128; #else - norm = nd; - tmp = td; + tmp = &td[128]; #endif sp_4096_mont_setup(m, &mp); @@ -18574,7 +18588,7 @@ static int sp_4096_mod_exp_2_64(sp_digit* r, const sp_digit* e, int bits, sp_4096_cond_sub_64(r, r, m, mask); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } diff --git a/wolfcrypt/src/sp_armthumb.c b/wolfcrypt/src/sp_armthumb.c index 2275dba3f..be16eed05 100644 --- a/wolfcrypt/src/sp_armthumb.c +++ b/wolfcrypt/src/sp_armthumb.c @@ -3128,12 +3128,12 @@ static WC_INLINE int sp_2048_mod_32(sp_digit* r, const sp_digit* a, const sp_dig static int sp_2048_mod_exp_32(sp_digit* r, const sp_digit* a, const sp_digit* e, int bits, const sp_digit* m, int reduceA) { -#ifndef WOLFSSL_SMALL_STACK - sp_digit t[16][64]; -#else - sp_digit* t[16]; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[16 * 64]; #endif + sp_digit* t[16]; sp_digit* norm; sp_digit mp = 1; sp_digit n; @@ -3142,8 +3142,8 @@ static int sp_2048_mod_exp_32(sp_digit* r, const sp_digit* a, const sp_digit* e, int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK - td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 16 * 64, NULL, +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (16 * 64), NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; @@ -3151,12 +3151,14 @@ static int sp_2048_mod_exp_32(sp_digit* r, const sp_digit* a, const sp_digit* e, #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK + norm = td; for (i=0; i<16; i++) { +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) t[i] = td + i * 64; - } +#else + t[i] = &td[i * 64]; #endif - norm = t[0]; + } sp_2048_mont_setup(m, &mp); sp_2048_mont_norm_32(norm, m); @@ -3239,7 +3241,7 @@ static int sp_2048_mod_exp_32(sp_digit* r, const sp_digit* a, const sp_digit* e, sp_2048_cond_sub_32(r, r, m, mask); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } @@ -3260,12 +3262,12 @@ static int sp_2048_mod_exp_32(sp_digit* r, const sp_digit* a, const sp_digit* e, static int sp_2048_mod_exp_32(sp_digit* r, const sp_digit* a, const sp_digit* e, int bits, const sp_digit* m, int reduceA) { -#ifndef WOLFSSL_SMALL_STACK - sp_digit t[32][64]; -#else - sp_digit* t[32]; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[32 * 64]; #endif + sp_digit* t[32]; sp_digit* norm; sp_digit mp = 1; sp_digit n; @@ -3274,8 +3276,8 @@ static int sp_2048_mod_exp_32(sp_digit* r, const sp_digit* a, const sp_digit* e, int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK - td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32 * 64, NULL, +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (32 * 64), NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; @@ -3283,12 +3285,14 @@ static int sp_2048_mod_exp_32(sp_digit* r, const sp_digit* a, const sp_digit* e, #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK + norm = td; for (i=0; i<32; i++) { +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) t[i] = td + i * 64; - } +#else + t[i] = &td[i * 64]; #endif - norm = t[0]; + } sp_2048_mont_setup(m, &mp); sp_2048_mont_norm_32(norm, m); @@ -3388,7 +3392,7 @@ static int sp_2048_mod_exp_32(sp_digit* r, const sp_digit* a, const sp_digit* e, sp_2048_cond_sub_32(r, r, m, mask); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } @@ -3960,12 +3964,12 @@ static WC_INLINE int sp_2048_mod_64_cond(sp_digit* r, const sp_digit* a, const s static int sp_2048_mod_exp_64(sp_digit* r, const sp_digit* a, const sp_digit* e, int bits, const sp_digit* m, int reduceA) { -#ifndef WOLFSSL_SMALL_STACK - sp_digit t[16][128]; -#else - sp_digit* t[16]; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[16 * 128]; #endif + sp_digit* t[16]; sp_digit* norm; sp_digit mp = 1; sp_digit n; @@ -3974,8 +3978,8 @@ static int sp_2048_mod_exp_64(sp_digit* r, const sp_digit* a, const sp_digit* e, int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK - td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 16 * 128, NULL, +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (16 * 128), NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; @@ -3983,12 +3987,14 @@ static int sp_2048_mod_exp_64(sp_digit* r, const sp_digit* a, const sp_digit* e, #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK + norm = td; for (i=0; i<16; i++) { +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) t[i] = td + i * 128; - } +#else + t[i] = &td[i * 128]; #endif - norm = t[0]; + } sp_2048_mont_setup(m, &mp); sp_2048_mont_norm_64(norm, m); @@ -4071,7 +4077,7 @@ static int sp_2048_mod_exp_64(sp_digit* r, const sp_digit* a, const sp_digit* e, sp_2048_cond_sub_64(r, r, m, mask); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } @@ -4092,12 +4098,12 @@ static int sp_2048_mod_exp_64(sp_digit* r, const sp_digit* a, const sp_digit* e, static int sp_2048_mod_exp_64(sp_digit* r, const sp_digit* a, const sp_digit* e, int bits, const sp_digit* m, int reduceA) { -#ifndef WOLFSSL_SMALL_STACK - sp_digit t[32][128]; -#else - sp_digit* t[32]; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[32 * 128]; #endif + sp_digit* t[32]; sp_digit* norm; sp_digit mp = 1; sp_digit n; @@ -4106,8 +4112,8 @@ static int sp_2048_mod_exp_64(sp_digit* r, const sp_digit* a, const sp_digit* e, int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK - td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32 * 128, NULL, +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (32 * 128), NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; @@ -4115,12 +4121,14 @@ static int sp_2048_mod_exp_64(sp_digit* r, const sp_digit* a, const sp_digit* e, #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK + norm = td; for (i=0; i<32; i++) { +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) t[i] = td + i * 128; - } +#else + t[i] = &td[i * 128]; #endif - norm = t[0]; + } sp_2048_mont_setup(m, &mp); sp_2048_mont_norm_64(norm, m); @@ -4220,7 +4228,7 @@ static int sp_2048_mod_exp_64(sp_digit* r, const sp_digit* a, const sp_digit* e, sp_2048_cond_sub_64(r, r, m, mask); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } @@ -5112,11 +5120,10 @@ static void sp_2048_lshift_64(sp_digit* r, sp_digit* a, byte n) static int sp_2048_mod_exp_2_64(sp_digit* r, const sp_digit* e, int bits, const sp_digit* m) { -#ifndef WOLFSSL_SMALL_STACK - sp_digit nd[128]; - sp_digit td[65]; -#else +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[193]; #endif sp_digit* norm; sp_digit* tmp; @@ -5127,7 +5134,7 @@ static int sp_2048_mod_exp_2_64(sp_digit* r, const sp_digit* e, int bits, int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 193, NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { @@ -5136,12 +5143,11 @@ static int sp_2048_mod_exp_2_64(sp_digit* r, const sp_digit* e, int bits, #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK norm = td; - tmp = td + 128; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + tmp = td + 128; #else - norm = nd; - tmp = td; + tmp = &td[128]; #endif sp_2048_mont_setup(m, &mp); @@ -5201,7 +5207,7 @@ static int sp_2048_mod_exp_2_64(sp_digit* r, const sp_digit* e, int bits, sp_2048_cond_sub_64(r, r, m, mask); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } @@ -8922,12 +8928,12 @@ static WC_INLINE int sp_3072_mod_48(sp_digit* r, const sp_digit* a, const sp_dig static int sp_3072_mod_exp_48(sp_digit* r, const sp_digit* a, const sp_digit* e, int bits, const sp_digit* m, int reduceA) { -#ifndef WOLFSSL_SMALL_STACK - sp_digit t[16][96]; -#else - sp_digit* t[16]; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[16 * 96]; #endif + sp_digit* t[16]; sp_digit* norm; sp_digit mp = 1; sp_digit n; @@ -8936,8 +8942,8 @@ static int sp_3072_mod_exp_48(sp_digit* r, const sp_digit* a, const sp_digit* e, int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK - td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 16 * 96, NULL, +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (16 * 96), NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; @@ -8945,12 +8951,14 @@ static int sp_3072_mod_exp_48(sp_digit* r, const sp_digit* a, const sp_digit* e, #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK + norm = td; for (i=0; i<16; i++) { +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) t[i] = td + i * 96; - } +#else + t[i] = &td[i * 96]; #endif - norm = t[0]; + } sp_3072_mont_setup(m, &mp); sp_3072_mont_norm_48(norm, m); @@ -9033,7 +9041,7 @@ static int sp_3072_mod_exp_48(sp_digit* r, const sp_digit* a, const sp_digit* e, sp_3072_cond_sub_48(r, r, m, mask); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } @@ -9054,12 +9062,12 @@ static int sp_3072_mod_exp_48(sp_digit* r, const sp_digit* a, const sp_digit* e, static int sp_3072_mod_exp_48(sp_digit* r, const sp_digit* a, const sp_digit* e, int bits, const sp_digit* m, int reduceA) { -#ifndef WOLFSSL_SMALL_STACK - sp_digit t[32][96]; -#else - sp_digit* t[32]; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[32 * 96]; #endif + sp_digit* t[32]; sp_digit* norm; sp_digit mp = 1; sp_digit n; @@ -9068,8 +9076,8 @@ static int sp_3072_mod_exp_48(sp_digit* r, const sp_digit* a, const sp_digit* e, int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK - td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32 * 96, NULL, +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (32 * 96), NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; @@ -9077,12 +9085,14 @@ static int sp_3072_mod_exp_48(sp_digit* r, const sp_digit* a, const sp_digit* e, #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK + norm = td; for (i=0; i<32; i++) { +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) t[i] = td + i * 96; - } +#else + t[i] = &td[i * 96]; #endif - norm = t[0]; + } sp_3072_mont_setup(m, &mp); sp_3072_mont_norm_48(norm, m); @@ -9182,7 +9192,7 @@ static int sp_3072_mod_exp_48(sp_digit* r, const sp_digit* a, const sp_digit* e, sp_3072_cond_sub_48(r, r, m, mask); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } @@ -9760,12 +9770,12 @@ static WC_INLINE int sp_3072_mod_96_cond(sp_digit* r, const sp_digit* a, const s static int sp_3072_mod_exp_96(sp_digit* r, const sp_digit* a, const sp_digit* e, int bits, const sp_digit* m, int reduceA) { -#ifndef WOLFSSL_SMALL_STACK - sp_digit t[16][192]; -#else - sp_digit* t[16]; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[16 * 192]; #endif + sp_digit* t[16]; sp_digit* norm; sp_digit mp = 1; sp_digit n; @@ -9774,8 +9784,8 @@ static int sp_3072_mod_exp_96(sp_digit* r, const sp_digit* a, const sp_digit* e, int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK - td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 16 * 192, NULL, +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (16 * 192), NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; @@ -9783,12 +9793,14 @@ static int sp_3072_mod_exp_96(sp_digit* r, const sp_digit* a, const sp_digit* e, #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK + norm = td; for (i=0; i<16; i++) { +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) t[i] = td + i * 192; - } +#else + t[i] = &td[i * 192]; #endif - norm = t[0]; + } sp_3072_mont_setup(m, &mp); sp_3072_mont_norm_96(norm, m); @@ -9871,7 +9883,7 @@ static int sp_3072_mod_exp_96(sp_digit* r, const sp_digit* a, const sp_digit* e, sp_3072_cond_sub_96(r, r, m, mask); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } @@ -9892,12 +9904,12 @@ static int sp_3072_mod_exp_96(sp_digit* r, const sp_digit* a, const sp_digit* e, static int sp_3072_mod_exp_96(sp_digit* r, const sp_digit* a, const sp_digit* e, int bits, const sp_digit* m, int reduceA) { -#ifndef WOLFSSL_SMALL_STACK - sp_digit t[32][192]; -#else - sp_digit* t[32]; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[32 * 192]; #endif + sp_digit* t[32]; sp_digit* norm; sp_digit mp = 1; sp_digit n; @@ -9906,8 +9918,8 @@ static int sp_3072_mod_exp_96(sp_digit* r, const sp_digit* a, const sp_digit* e, int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK - td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32 * 192, NULL, +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (32 * 192), NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; @@ -9915,12 +9927,14 @@ static int sp_3072_mod_exp_96(sp_digit* r, const sp_digit* a, const sp_digit* e, #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK + norm = td; for (i=0; i<32; i++) { +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) t[i] = td + i * 192; - } +#else + t[i] = &td[i * 192]; #endif - norm = t[0]; + } sp_3072_mont_setup(m, &mp); sp_3072_mont_norm_96(norm, m); @@ -10020,7 +10034,7 @@ static int sp_3072_mod_exp_96(sp_digit* r, const sp_digit* a, const sp_digit* e, sp_3072_cond_sub_96(r, r, m, mask); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } @@ -11110,11 +11124,10 @@ static void sp_3072_lshift_96(sp_digit* r, sp_digit* a, byte n) static int sp_3072_mod_exp_2_96(sp_digit* r, const sp_digit* e, int bits, const sp_digit* m) { -#ifndef WOLFSSL_SMALL_STACK - sp_digit nd[192]; - sp_digit td[97]; -#else +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[289]; #endif sp_digit* norm; sp_digit* tmp; @@ -11125,7 +11138,7 @@ static int sp_3072_mod_exp_2_96(sp_digit* r, const sp_digit* e, int bits, int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 289, NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { @@ -11134,12 +11147,11 @@ static int sp_3072_mod_exp_2_96(sp_digit* r, const sp_digit* e, int bits, #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK norm = td; - tmp = td + 192; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + tmp = td + 192; #else - norm = nd; - tmp = td; + tmp = &td[192]; #endif sp_3072_mont_setup(m, &mp); @@ -11199,7 +11211,7 @@ static int sp_3072_mod_exp_2_96(sp_digit* r, const sp_digit* e, int bits, sp_3072_cond_sub_96(r, r, m, mask); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } @@ -14219,12 +14231,12 @@ static WC_INLINE int sp_4096_mod_128_cond(sp_digit* r, const sp_digit* a, const static int sp_4096_mod_exp_128(sp_digit* r, const sp_digit* a, const sp_digit* e, int bits, const sp_digit* m, int reduceA) { -#ifndef WOLFSSL_SMALL_STACK - sp_digit t[16][256]; -#else - sp_digit* t[16]; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[16 * 256]; #endif + sp_digit* t[16]; sp_digit* norm; sp_digit mp = 1; sp_digit n; @@ -14233,8 +14245,8 @@ static int sp_4096_mod_exp_128(sp_digit* r, const sp_digit* a, const sp_digit* e int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK - td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 16 * 256, NULL, +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (16 * 256), NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; @@ -14242,12 +14254,14 @@ static int sp_4096_mod_exp_128(sp_digit* r, const sp_digit* a, const sp_digit* e #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK + norm = td; for (i=0; i<16; i++) { +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) t[i] = td + i * 256; - } +#else + t[i] = &td[i * 256]; #endif - norm = t[0]; + } sp_4096_mont_setup(m, &mp); sp_4096_mont_norm_128(norm, m); @@ -14330,7 +14344,7 @@ static int sp_4096_mod_exp_128(sp_digit* r, const sp_digit* a, const sp_digit* e sp_4096_cond_sub_128(r, r, m, mask); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } @@ -14351,12 +14365,12 @@ static int sp_4096_mod_exp_128(sp_digit* r, const sp_digit* a, const sp_digit* e static int sp_4096_mod_exp_128(sp_digit* r, const sp_digit* a, const sp_digit* e, int bits, const sp_digit* m, int reduceA) { -#ifndef WOLFSSL_SMALL_STACK - sp_digit t[32][256]; -#else - sp_digit* t[32]; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[32 * 256]; #endif + sp_digit* t[32]; sp_digit* norm; sp_digit mp = 1; sp_digit n; @@ -14365,8 +14379,8 @@ static int sp_4096_mod_exp_128(sp_digit* r, const sp_digit* a, const sp_digit* e int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK - td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32 * 256, NULL, +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (32 * 256), NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; @@ -14374,12 +14388,14 @@ static int sp_4096_mod_exp_128(sp_digit* r, const sp_digit* a, const sp_digit* e #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK + norm = td; for (i=0; i<32; i++) { +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) t[i] = td + i * 256; - } +#else + t[i] = &td[i * 256]; #endif - norm = t[0]; + } sp_4096_mont_setup(m, &mp); sp_4096_mont_norm_128(norm, m); @@ -14479,7 +14495,7 @@ static int sp_4096_mod_exp_128(sp_digit* r, const sp_digit* a, const sp_digit* e sp_4096_cond_sub_128(r, r, m, mask); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } @@ -15766,11 +15782,10 @@ static void sp_4096_lshift_128(sp_digit* r, sp_digit* a, byte n) static int sp_4096_mod_exp_2_128(sp_digit* r, const sp_digit* e, int bits, const sp_digit* m) { -#ifndef WOLFSSL_SMALL_STACK - sp_digit nd[256]; - sp_digit td[129]; -#else +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[385]; #endif sp_digit* norm; sp_digit* tmp; @@ -15781,7 +15796,7 @@ static int sp_4096_mod_exp_2_128(sp_digit* r, const sp_digit* e, int bits, int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 385, NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { @@ -15790,12 +15805,11 @@ static int sp_4096_mod_exp_2_128(sp_digit* r, const sp_digit* e, int bits, #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK norm = td; - tmp = td + 256; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + tmp = td + 256; #else - norm = nd; - tmp = td; + tmp = &td[256]; #endif sp_4096_mont_setup(m, &mp); @@ -15855,7 +15869,7 @@ static int sp_4096_mod_exp_2_128(sp_digit* r, const sp_digit* e, int bits, sp_4096_cond_sub_128(r, r, m, mask); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } diff --git a/wolfcrypt/src/sp_c32.c b/wolfcrypt/src/sp_c32.c index 72557cb35..a607adf15 100644 --- a/wolfcrypt/src/sp_c32.c +++ b/wolfcrypt/src/sp_c32.c @@ -1896,7 +1896,11 @@ static int sp_2048_mod_exp_45(sp_digit* r, const sp_digit* a, const sp_digit* e, const sp_digit* m, int reduceA) { #ifdef WOLFSSL_SP_SMALL +#if !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[3 * 90]; +#endif sp_digit* t[3]; sp_digit* norm; sp_digit mp = 1; @@ -1905,18 +1909,24 @@ static int sp_2048_mod_exp_45(sp_digit* r, const sp_digit* a, const sp_digit* e, int c, y; int err = MP_OKAY; - td = (sp_digit*)XMALLOC(sizeof(*td) * 3 * 45 * 2, NULL, +#if !defined(WOLFSSL_SP_NO_MALLOC) + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 3 * 45 * 2, NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; } +#endif if (err == MP_OKAY) { - XMEMSET(td, 0, sizeof(*td) * 3U * 45U * 2U); - - norm = t[0] = td; - t[1] = &td[45 * 2]; - t[2] = &td[2 * 45 * 2]; + norm = td; + for (i=0; i<3; i++) { +#if !defined(WOLFSSL_SP_NO_MALLOC) + t[i] = td + (i * 45 * 2); +#else + t[i] = &td[i * 45 * 2]; +#endif + XMEMSET(t[i], 0, sizeof(sp_digit) * 45U * 2U); + } sp_2048_mont_setup(m, &mp); sp_2048_mont_norm_45(norm, m); @@ -1954,11 +1964,11 @@ static int sp_2048_mod_exp_45(sp_digit* r, const sp_digit* a, const sp_digit* e, XMEMCPY(t[2], (void*)(((size_t)t[0] & addr_mask[y^1]) + ((size_t)t[1] & addr_mask[y])), - sizeof(*t[2]) * 45 * 2); + sizeof(*t[2]) * 45 * 2); sp_2048_mont_sqr_45(t[2], t[2], m, mp); XMEMCPY((void*)(((size_t)t[0] & addr_mask[y^1]) + ((size_t)t[1] & addr_mask[y])), t[2], - sizeof(*t[2]) * 45 * 2); + sizeof(*t[2]) * 45 * 2); } sp_2048_mont_reduce_45(t[0], m, mp); @@ -1969,16 +1979,18 @@ static int sp_2048_mod_exp_45(sp_digit* r, const sp_digit* a, const sp_digit* e, } +#if !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } +#endif return err; #elif defined(WOLFSSL_SP_CACHE_RESISTANT) -#ifndef WOLFSSL_SMALL_STACK - sp_digit td[90]; -#else +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[90]; #endif sp_digit* t[3]; sp_digit* norm; @@ -1989,7 +2001,7 @@ static int sp_2048_mod_exp_45(sp_digit* r, const sp_digit* a, const sp_digit* e, int err = MP_OKAY; #ifdef WOLFSSL_SMALL_STACK - td = (sp_digit*)XMALLOC(sizeof(*td) * 3 * 45 * 2, NULL, + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 3 * 45 * 2, NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; @@ -1997,10 +2009,14 @@ static int sp_2048_mod_exp_45(sp_digit* r, const sp_digit* a, const sp_digit* e, #endif if (err == MP_OKAY) { - t[0] = td; - t[1] = &td[45 * 2]; - t[2] = &td[2 * 45 * 2]; - norm = t[0]; + norm = td; + for (i=0; i<3; i++) { +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + t[i] = td + (i * 45 * 2); +#else + t[i] = &td[i * 45 * 2)]; +#endif + } sp_2048_mont_setup(m, &mp); sp_2048_mont_norm_45(norm, m); @@ -2038,17 +2054,19 @@ static int sp_2048_mod_exp_45(sp_digit* r, const sp_digit* a, const sp_digit* e, sp_2048_mont_mul_45(t[y^1], t[0], t[1], m, mp); XMEMCPY(t[2], (void*)(((size_t)t[0] & addr_mask[y^1]) + - ((size_t)t[1] & addr_mask[y])), sizeof(t[2])); + ((size_t)t[1] & addr_mask[y])), + sizeof(*t[2]) * 45 * 2); sp_2048_mont_sqr_45(t[2], t[2], m, mp); XMEMCPY((void*)(((size_t)t[0] & addr_mask[y^1]) + - ((size_t)t[1] & addr_mask[y])), t[2], sizeof(t[2])); + ((size_t)t[1] & addr_mask[y])), t[2], + sizeof(*t[2]) * 45 * 2); } sp_2048_mont_reduce_45(t[0], m, mp); n = sp_2048_cmp_45(t[0], m); sp_2048_cond_sub_45(t[0], t[0], m, ((n < 0) ? - (sp_digit)1 : (sp_digit)0) - 1); - XMEMCPY(r, t[0], sizeof(t[0])); + (sp_digit)1 : (sp_digit)0) - 1); + XMEMCPY(r, t[0], sizeof(*r) * 45 * 2); } #ifdef WOLFSSL_SMALL_STACK @@ -2059,22 +2077,22 @@ static int sp_2048_mod_exp_45(sp_digit* r, const sp_digit* a, const sp_digit* e, return err; #else -#ifndef WOLFSSL_SMALL_STACK - sp_digit td[32][90]; -#else +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[(32 * 90) + 90]; #endif sp_digit* t[32]; + sp_digit* rt; sp_digit* norm; - sp_digit rt[90]; sp_digit mp = 1; sp_digit n; int i; int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK - td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32 * 90, NULL, +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * ((32 * 90) + 90), NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; @@ -2082,9 +2100,16 @@ static int sp_2048_mod_exp_45(sp_digit* r, const sp_digit* a, const sp_digit* e, #endif if (err == MP_OKAY) { + norm = td; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) for (i=0; i<32; i++) t[i] = td + i * 90; - norm = t[0]; + rt = td + 2880; +#else + for (i=0; i<32; i++) + t[i] = &td[i * 90]; + rt = &td[2880]; +#endif sp_2048_mont_setup(m, &mp); sp_2048_mont_norm_45(norm, m); @@ -2154,7 +2179,7 @@ static int sp_2048_mod_exp_45(sp_digit* r, const sp_digit* a, const sp_digit* e, y = (n >> 27) & 0x1f; n <<= 5; c -= 5; - XMEMCPY(rt, t[y], sizeof(rt)); + XMEMCPY(rt, t[y], sizeof(sp_digit) * 90); for (; i>=0 || c>=5; ) { if (c < 5) { n |= e[i--] << (9 - c); @@ -2177,10 +2202,10 @@ static int sp_2048_mod_exp_45(sp_digit* r, const sp_digit* a, const sp_digit* e, n = sp_2048_cmp_45(rt, m); sp_2048_cond_sub_45(rt, rt, m, ((n < 0) ? (sp_digit)1 : (sp_digit)0) - 1); - XMEMCPY(r, rt, sizeof(rt)); + XMEMCPY(r, rt, sizeof(sp_digit) * 90); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } @@ -2824,7 +2849,11 @@ static int sp_2048_mod_exp_90(sp_digit* r, const sp_digit* a, const sp_digit* e, const sp_digit* m, int reduceA) { #ifdef WOLFSSL_SP_SMALL +#if !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[3 * 180]; +#endif sp_digit* t[3]; sp_digit* norm; sp_digit mp = 1; @@ -2833,18 +2862,24 @@ static int sp_2048_mod_exp_90(sp_digit* r, const sp_digit* a, const sp_digit* e, int c, y; int err = MP_OKAY; - td = (sp_digit*)XMALLOC(sizeof(*td) * 3 * 90 * 2, NULL, +#if !defined(WOLFSSL_SP_NO_MALLOC) + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 3 * 90 * 2, NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; } +#endif if (err == MP_OKAY) { - XMEMSET(td, 0, sizeof(*td) * 3U * 90U * 2U); - - norm = t[0] = td; - t[1] = &td[90 * 2]; - t[2] = &td[2 * 90 * 2]; + norm = td; + for (i=0; i<3; i++) { +#if !defined(WOLFSSL_SP_NO_MALLOC) + t[i] = td + (i * 90 * 2); +#else + t[i] = &td[i * 90 * 2]; +#endif + XMEMSET(t[i], 0, sizeof(sp_digit) * 90U * 2U); + } sp_2048_mont_setup(m, &mp); sp_2048_mont_norm_90(norm, m); @@ -2882,11 +2917,11 @@ static int sp_2048_mod_exp_90(sp_digit* r, const sp_digit* a, const sp_digit* e, XMEMCPY(t[2], (void*)(((size_t)t[0] & addr_mask[y^1]) + ((size_t)t[1] & addr_mask[y])), - sizeof(*t[2]) * 90 * 2); + sizeof(*t[2]) * 90 * 2); sp_2048_mont_sqr_90(t[2], t[2], m, mp); XMEMCPY((void*)(((size_t)t[0] & addr_mask[y^1]) + ((size_t)t[1] & addr_mask[y])), t[2], - sizeof(*t[2]) * 90 * 2); + sizeof(*t[2]) * 90 * 2); } sp_2048_mont_reduce_90(t[0], m, mp); @@ -2897,16 +2932,18 @@ static int sp_2048_mod_exp_90(sp_digit* r, const sp_digit* a, const sp_digit* e, } +#if !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } +#endif return err; #elif defined(WOLFSSL_SP_CACHE_RESISTANT) -#ifndef WOLFSSL_SMALL_STACK - sp_digit td[180]; -#else +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[180]; #endif sp_digit* t[3]; sp_digit* norm; @@ -2917,7 +2954,7 @@ static int sp_2048_mod_exp_90(sp_digit* r, const sp_digit* a, const sp_digit* e, int err = MP_OKAY; #ifdef WOLFSSL_SMALL_STACK - td = (sp_digit*)XMALLOC(sizeof(*td) * 3 * 90 * 2, NULL, + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 3 * 90 * 2, NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; @@ -2925,10 +2962,14 @@ static int sp_2048_mod_exp_90(sp_digit* r, const sp_digit* a, const sp_digit* e, #endif if (err == MP_OKAY) { - t[0] = td; - t[1] = &td[90 * 2]; - t[2] = &td[2 * 90 * 2]; - norm = t[0]; + norm = td; + for (i=0; i<3; i++) { +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + t[i] = td + (i * 90 * 2); +#else + t[i] = &td[i * 90 * 2)]; +#endif + } sp_2048_mont_setup(m, &mp); sp_2048_mont_norm_90(norm, m); @@ -2966,17 +3007,19 @@ static int sp_2048_mod_exp_90(sp_digit* r, const sp_digit* a, const sp_digit* e, sp_2048_mont_mul_90(t[y^1], t[0], t[1], m, mp); XMEMCPY(t[2], (void*)(((size_t)t[0] & addr_mask[y^1]) + - ((size_t)t[1] & addr_mask[y])), sizeof(t[2])); + ((size_t)t[1] & addr_mask[y])), + sizeof(*t[2]) * 90 * 2); sp_2048_mont_sqr_90(t[2], t[2], m, mp); XMEMCPY((void*)(((size_t)t[0] & addr_mask[y^1]) + - ((size_t)t[1] & addr_mask[y])), t[2], sizeof(t[2])); + ((size_t)t[1] & addr_mask[y])), t[2], + sizeof(*t[2]) * 90 * 2); } sp_2048_mont_reduce_90(t[0], m, mp); n = sp_2048_cmp_90(t[0], m); sp_2048_cond_sub_90(t[0], t[0], m, ((n < 0) ? - (sp_digit)1 : (sp_digit)0) - 1); - XMEMCPY(r, t[0], sizeof(t[0])); + (sp_digit)1 : (sp_digit)0) - 1); + XMEMCPY(r, t[0], sizeof(*r) * 90 * 2); } #ifdef WOLFSSL_SMALL_STACK @@ -2987,22 +3030,22 @@ static int sp_2048_mod_exp_90(sp_digit* r, const sp_digit* a, const sp_digit* e, return err; #else -#ifndef WOLFSSL_SMALL_STACK - sp_digit td[32][180]; -#else +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[(32 * 180) + 180]; #endif sp_digit* t[32]; + sp_digit* rt; sp_digit* norm; - sp_digit rt[180]; sp_digit mp = 1; sp_digit n; int i; int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK - td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32 * 180, NULL, +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * ((32 * 180) + 180), NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; @@ -3010,9 +3053,16 @@ static int sp_2048_mod_exp_90(sp_digit* r, const sp_digit* a, const sp_digit* e, #endif if (err == MP_OKAY) { + norm = td; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) for (i=0; i<32; i++) t[i] = td + i * 180; - norm = t[0]; + rt = td + 5760; +#else + for (i=0; i<32; i++) + t[i] = &td[i * 180]; + rt = &td[5760]; +#endif sp_2048_mont_setup(m, &mp); sp_2048_mont_norm_90(norm, m); @@ -3082,7 +3132,7 @@ static int sp_2048_mod_exp_90(sp_digit* r, const sp_digit* a, const sp_digit* e, y = (n >> 27) & 0x1f; n <<= 5; c -= 5; - XMEMCPY(rt, t[y], sizeof(rt)); + XMEMCPY(rt, t[y], sizeof(sp_digit) * 180); for (; i>=0 || c>=5; ) { if (c < 5) { n |= e[i--] << (9 - c); @@ -3105,10 +3155,10 @@ static int sp_2048_mod_exp_90(sp_digit* r, const sp_digit* a, const sp_digit* e, n = sp_2048_cmp_90(rt, m); sp_2048_cond_sub_90(rt, rt, m, ((n < 0) ? (sp_digit)1 : (sp_digit)0) - 1); - XMEMCPY(r, rt, sizeof(rt)); + XMEMCPY(r, rt, sizeof(sp_digit) * 180); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } @@ -4036,11 +4086,10 @@ SP_NOINLINE static void sp_2048_lshift_90(sp_digit* r, sp_digit* a, byte n) */ static int sp_2048_mod_exp_2_90(sp_digit* r, const sp_digit* e, int bits, const sp_digit* m) { -#ifndef WOLFSSL_SMALL_STACK - sp_digit nd[180]; - sp_digit td[91]; -#else +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[271]; #endif sp_digit* norm; sp_digit* tmp; @@ -4050,7 +4099,7 @@ static int sp_2048_mod_exp_2_90(sp_digit* r, const sp_digit* e, int bits, const int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 271, NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { @@ -4059,13 +4108,12 @@ static int sp_2048_mod_exp_2_90(sp_digit* r, const sp_digit* e, int bits, const #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK norm = td; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) tmp = td + 180; XMEMSET(td, 0, sizeof(sp_digit) * 271); #else - norm = nd; - tmp = td; + tmp = &td[180]; XMEMSET(td, 0, sizeof(td)); #endif @@ -4124,7 +4172,7 @@ static int sp_2048_mod_exp_2_90(sp_digit* r, const sp_digit* e, int bits, const (sp_digit)1 : (sp_digit)0) - 1); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } @@ -5689,7 +5737,11 @@ static int sp_3072_mod_exp_67(sp_digit* r, const sp_digit* a, const sp_digit* e, const sp_digit* m, int reduceA) { #ifdef WOLFSSL_SP_SMALL +#if !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[3 * 134]; +#endif sp_digit* t[3]; sp_digit* norm; sp_digit mp = 1; @@ -5698,18 +5750,24 @@ static int sp_3072_mod_exp_67(sp_digit* r, const sp_digit* a, const sp_digit* e, int c, y; int err = MP_OKAY; - td = (sp_digit*)XMALLOC(sizeof(*td) * 3 * 67 * 2, NULL, +#if !defined(WOLFSSL_SP_NO_MALLOC) + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 3 * 67 * 2, NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; } +#endif if (err == MP_OKAY) { - XMEMSET(td, 0, sizeof(*td) * 3U * 67U * 2U); - - norm = t[0] = td; - t[1] = &td[67 * 2]; - t[2] = &td[2 * 67 * 2]; + norm = td; + for (i=0; i<3; i++) { +#if !defined(WOLFSSL_SP_NO_MALLOC) + t[i] = td + (i * 67 * 2); +#else + t[i] = &td[i * 67 * 2]; +#endif + XMEMSET(t[i], 0, sizeof(sp_digit) * 67U * 2U); + } sp_3072_mont_setup(m, &mp); sp_3072_mont_norm_67(norm, m); @@ -5747,11 +5805,11 @@ static int sp_3072_mod_exp_67(sp_digit* r, const sp_digit* a, const sp_digit* e, XMEMCPY(t[2], (void*)(((size_t)t[0] & addr_mask[y^1]) + ((size_t)t[1] & addr_mask[y])), - sizeof(*t[2]) * 67 * 2); + sizeof(*t[2]) * 67 * 2); sp_3072_mont_sqr_67(t[2], t[2], m, mp); XMEMCPY((void*)(((size_t)t[0] & addr_mask[y^1]) + ((size_t)t[1] & addr_mask[y])), t[2], - sizeof(*t[2]) * 67 * 2); + sizeof(*t[2]) * 67 * 2); } sp_3072_mont_reduce_67(t[0], m, mp); @@ -5762,16 +5820,18 @@ static int sp_3072_mod_exp_67(sp_digit* r, const sp_digit* a, const sp_digit* e, } +#if !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } +#endif return err; #elif defined(WOLFSSL_SP_CACHE_RESISTANT) -#ifndef WOLFSSL_SMALL_STACK - sp_digit td[134]; -#else +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[134]; #endif sp_digit* t[3]; sp_digit* norm; @@ -5782,7 +5842,7 @@ static int sp_3072_mod_exp_67(sp_digit* r, const sp_digit* a, const sp_digit* e, int err = MP_OKAY; #ifdef WOLFSSL_SMALL_STACK - td = (sp_digit*)XMALLOC(sizeof(*td) * 3 * 67 * 2, NULL, + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 3 * 67 * 2, NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; @@ -5790,10 +5850,14 @@ static int sp_3072_mod_exp_67(sp_digit* r, const sp_digit* a, const sp_digit* e, #endif if (err == MP_OKAY) { - t[0] = td; - t[1] = &td[67 * 2]; - t[2] = &td[2 * 67 * 2]; - norm = t[0]; + norm = td; + for (i=0; i<3; i++) { +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + t[i] = td + (i * 67 * 2); +#else + t[i] = &td[i * 67 * 2)]; +#endif + } sp_3072_mont_setup(m, &mp); sp_3072_mont_norm_67(norm, m); @@ -5831,17 +5895,19 @@ static int sp_3072_mod_exp_67(sp_digit* r, const sp_digit* a, const sp_digit* e, sp_3072_mont_mul_67(t[y^1], t[0], t[1], m, mp); XMEMCPY(t[2], (void*)(((size_t)t[0] & addr_mask[y^1]) + - ((size_t)t[1] & addr_mask[y])), sizeof(t[2])); + ((size_t)t[1] & addr_mask[y])), + sizeof(*t[2]) * 67 * 2); sp_3072_mont_sqr_67(t[2], t[2], m, mp); XMEMCPY((void*)(((size_t)t[0] & addr_mask[y^1]) + - ((size_t)t[1] & addr_mask[y])), t[2], sizeof(t[2])); + ((size_t)t[1] & addr_mask[y])), t[2], + sizeof(*t[2]) * 67 * 2); } sp_3072_mont_reduce_67(t[0], m, mp); n = sp_3072_cmp_67(t[0], m); sp_3072_cond_sub_67(t[0], t[0], m, ((n < 0) ? - (sp_digit)1 : (sp_digit)0) - 1); - XMEMCPY(r, t[0], sizeof(t[0])); + (sp_digit)1 : (sp_digit)0) - 1); + XMEMCPY(r, t[0], sizeof(*r) * 67 * 2); } #ifdef WOLFSSL_SMALL_STACK @@ -5852,22 +5918,22 @@ static int sp_3072_mod_exp_67(sp_digit* r, const sp_digit* a, const sp_digit* e, return err; #else -#ifndef WOLFSSL_SMALL_STACK - sp_digit td[32][134]; -#else +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[(32 * 134) + 134]; #endif sp_digit* t[32]; + sp_digit* rt; sp_digit* norm; - sp_digit rt[134]; sp_digit mp = 1; sp_digit n; int i; int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK - td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32 * 134, NULL, +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * ((32 * 134) + 134), NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; @@ -5875,9 +5941,16 @@ static int sp_3072_mod_exp_67(sp_digit* r, const sp_digit* a, const sp_digit* e, #endif if (err == MP_OKAY) { + norm = td; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) for (i=0; i<32; i++) t[i] = td + i * 134; - norm = t[0]; + rt = td + 4288; +#else + for (i=0; i<32; i++) + t[i] = &td[i * 134]; + rt = &td[4288]; +#endif sp_3072_mont_setup(m, &mp); sp_3072_mont_norm_67(norm, m); @@ -5947,7 +6020,7 @@ static int sp_3072_mod_exp_67(sp_digit* r, const sp_digit* a, const sp_digit* e, y = (n >> 27) & 0x1f; n <<= 5; c -= 5; - XMEMCPY(rt, t[y], sizeof(rt)); + XMEMCPY(rt, t[y], sizeof(sp_digit) * 134); for (; i>=0 || c>=5; ) { if (c < 5) { n |= e[i--] << (9 - c); @@ -5970,10 +6043,10 @@ static int sp_3072_mod_exp_67(sp_digit* r, const sp_digit* a, const sp_digit* e, n = sp_3072_cmp_67(rt, m); sp_3072_cond_sub_67(rt, rt, m, ((n < 0) ? (sp_digit)1 : (sp_digit)0) - 1); - XMEMCPY(r, rt, sizeof(rt)); + XMEMCPY(r, rt, sizeof(sp_digit) * 134); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } @@ -6653,7 +6726,11 @@ static int sp_3072_mod_exp_134(sp_digit* r, const sp_digit* a, const sp_digit* e const sp_digit* m, int reduceA) { #ifdef WOLFSSL_SP_SMALL +#if !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[3 * 268]; +#endif sp_digit* t[3]; sp_digit* norm; sp_digit mp = 1; @@ -6662,18 +6739,24 @@ static int sp_3072_mod_exp_134(sp_digit* r, const sp_digit* a, const sp_digit* e int c, y; int err = MP_OKAY; - td = (sp_digit*)XMALLOC(sizeof(*td) * 3 * 134 * 2, NULL, +#if !defined(WOLFSSL_SP_NO_MALLOC) + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 3 * 134 * 2, NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; } +#endif if (err == MP_OKAY) { - XMEMSET(td, 0, sizeof(*td) * 3U * 134U * 2U); - - norm = t[0] = td; - t[1] = &td[134 * 2]; - t[2] = &td[2 * 134 * 2]; + norm = td; + for (i=0; i<3; i++) { +#if !defined(WOLFSSL_SP_NO_MALLOC) + t[i] = td + (i * 134 * 2); +#else + t[i] = &td[i * 134 * 2]; +#endif + XMEMSET(t[i], 0, sizeof(sp_digit) * 134U * 2U); + } sp_3072_mont_setup(m, &mp); sp_3072_mont_norm_134(norm, m); @@ -6711,11 +6794,11 @@ static int sp_3072_mod_exp_134(sp_digit* r, const sp_digit* a, const sp_digit* e XMEMCPY(t[2], (void*)(((size_t)t[0] & addr_mask[y^1]) + ((size_t)t[1] & addr_mask[y])), - sizeof(*t[2]) * 134 * 2); + sizeof(*t[2]) * 134 * 2); sp_3072_mont_sqr_134(t[2], t[2], m, mp); XMEMCPY((void*)(((size_t)t[0] & addr_mask[y^1]) + ((size_t)t[1] & addr_mask[y])), t[2], - sizeof(*t[2]) * 134 * 2); + sizeof(*t[2]) * 134 * 2); } sp_3072_mont_reduce_134(t[0], m, mp); @@ -6726,16 +6809,18 @@ static int sp_3072_mod_exp_134(sp_digit* r, const sp_digit* a, const sp_digit* e } +#if !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } +#endif return err; #elif defined(WOLFSSL_SP_CACHE_RESISTANT) -#ifndef WOLFSSL_SMALL_STACK - sp_digit td[268]; -#else +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[268]; #endif sp_digit* t[3]; sp_digit* norm; @@ -6746,7 +6831,7 @@ static int sp_3072_mod_exp_134(sp_digit* r, const sp_digit* a, const sp_digit* e int err = MP_OKAY; #ifdef WOLFSSL_SMALL_STACK - td = (sp_digit*)XMALLOC(sizeof(*td) * 3 * 134 * 2, NULL, + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 3 * 134 * 2, NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; @@ -6754,10 +6839,14 @@ static int sp_3072_mod_exp_134(sp_digit* r, const sp_digit* a, const sp_digit* e #endif if (err == MP_OKAY) { - t[0] = td; - t[1] = &td[134 * 2]; - t[2] = &td[2 * 134 * 2]; - norm = t[0]; + norm = td; + for (i=0; i<3; i++) { +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + t[i] = td + (i * 134 * 2); +#else + t[i] = &td[i * 134 * 2)]; +#endif + } sp_3072_mont_setup(m, &mp); sp_3072_mont_norm_134(norm, m); @@ -6795,17 +6884,19 @@ static int sp_3072_mod_exp_134(sp_digit* r, const sp_digit* a, const sp_digit* e sp_3072_mont_mul_134(t[y^1], t[0], t[1], m, mp); XMEMCPY(t[2], (void*)(((size_t)t[0] & addr_mask[y^1]) + - ((size_t)t[1] & addr_mask[y])), sizeof(t[2])); + ((size_t)t[1] & addr_mask[y])), + sizeof(*t[2]) * 134 * 2); sp_3072_mont_sqr_134(t[2], t[2], m, mp); XMEMCPY((void*)(((size_t)t[0] & addr_mask[y^1]) + - ((size_t)t[1] & addr_mask[y])), t[2], sizeof(t[2])); + ((size_t)t[1] & addr_mask[y])), t[2], + sizeof(*t[2]) * 134 * 2); } sp_3072_mont_reduce_134(t[0], m, mp); n = sp_3072_cmp_134(t[0], m); sp_3072_cond_sub_134(t[0], t[0], m, ((n < 0) ? - (sp_digit)1 : (sp_digit)0) - 1); - XMEMCPY(r, t[0], sizeof(t[0])); + (sp_digit)1 : (sp_digit)0) - 1); + XMEMCPY(r, t[0], sizeof(*r) * 134 * 2); } #ifdef WOLFSSL_SMALL_STACK @@ -6816,22 +6907,22 @@ static int sp_3072_mod_exp_134(sp_digit* r, const sp_digit* a, const sp_digit* e return err; #else -#ifndef WOLFSSL_SMALL_STACK - sp_digit td[32][268]; -#else +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[(32 * 268) + 268]; #endif sp_digit* t[32]; + sp_digit* rt; sp_digit* norm; - sp_digit rt[268]; sp_digit mp = 1; sp_digit n; int i; int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK - td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32 * 268, NULL, +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * ((32 * 268) + 268), NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; @@ -6839,9 +6930,16 @@ static int sp_3072_mod_exp_134(sp_digit* r, const sp_digit* a, const sp_digit* e #endif if (err == MP_OKAY) { + norm = td; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) for (i=0; i<32; i++) t[i] = td + i * 268; - norm = t[0]; + rt = td + 8576; +#else + for (i=0; i<32; i++) + t[i] = &td[i * 268]; + rt = &td[8576]; +#endif sp_3072_mont_setup(m, &mp); sp_3072_mont_norm_134(norm, m); @@ -6911,7 +7009,7 @@ static int sp_3072_mod_exp_134(sp_digit* r, const sp_digit* a, const sp_digit* e y = (n >> 27) & 0x1f; n <<= 5; c -= 5; - XMEMCPY(rt, t[y], sizeof(rt)); + XMEMCPY(rt, t[y], sizeof(sp_digit) * 268); for (; i>=0 || c>=5; ) { if (c < 5) { n |= e[i--] << (9 - c); @@ -6934,10 +7032,10 @@ static int sp_3072_mod_exp_134(sp_digit* r, const sp_digit* a, const sp_digit* e n = sp_3072_cmp_134(rt, m); sp_3072_cond_sub_134(rt, rt, m, ((n < 0) ? (sp_digit)1 : (sp_digit)0) - 1); - XMEMCPY(r, rt, sizeof(rt)); + XMEMCPY(r, rt, sizeof(sp_digit) * 268); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } @@ -7953,11 +8051,10 @@ SP_NOINLINE static void sp_3072_lshift_134(sp_digit* r, sp_digit* a, byte n) */ static int sp_3072_mod_exp_2_134(sp_digit* r, const sp_digit* e, int bits, const sp_digit* m) { -#ifndef WOLFSSL_SMALL_STACK - sp_digit nd[268]; - sp_digit td[135]; -#else +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[403]; #endif sp_digit* norm; sp_digit* tmp; @@ -7967,7 +8064,7 @@ static int sp_3072_mod_exp_2_134(sp_digit* r, const sp_digit* e, int bits, const int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 403, NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { @@ -7976,13 +8073,12 @@ static int sp_3072_mod_exp_2_134(sp_digit* r, const sp_digit* e, int bits, const #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK norm = td; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) tmp = td + 268; XMEMSET(td, 0, sizeof(sp_digit) * 403); #else - norm = nd; - tmp = td; + tmp = &td[268]; XMEMSET(td, 0, sizeof(td)); #endif @@ -8041,7 +8137,7 @@ static int sp_3072_mod_exp_2_134(sp_digit* r, const sp_digit* e, int bits, const (sp_digit)1 : (sp_digit)0) - 1); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } @@ -9705,7 +9801,11 @@ static int sp_4096_mod_exp_98(sp_digit* r, const sp_digit* a, const sp_digit* e, const sp_digit* m, int reduceA) { #ifdef WOLFSSL_SP_SMALL +#if !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[3 * 196]; +#endif sp_digit* t[3]; sp_digit* norm; sp_digit mp = 1; @@ -9714,18 +9814,24 @@ static int sp_4096_mod_exp_98(sp_digit* r, const sp_digit* a, const sp_digit* e, int c, y; int err = MP_OKAY; - td = (sp_digit*)XMALLOC(sizeof(*td) * 3 * 98 * 2, NULL, +#if !defined(WOLFSSL_SP_NO_MALLOC) + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 3 * 98 * 2, NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; } +#endif if (err == MP_OKAY) { - XMEMSET(td, 0, sizeof(*td) * 3U * 98U * 2U); - - norm = t[0] = td; - t[1] = &td[98 * 2]; - t[2] = &td[2 * 98 * 2]; + norm = td; + for (i=0; i<3; i++) { +#if !defined(WOLFSSL_SP_NO_MALLOC) + t[i] = td + (i * 98 * 2); +#else + t[i] = &td[i * 98 * 2]; +#endif + XMEMSET(t[i], 0, sizeof(sp_digit) * 98U * 2U); + } sp_4096_mont_setup(m, &mp); sp_4096_mont_norm_98(norm, m); @@ -9763,11 +9869,11 @@ static int sp_4096_mod_exp_98(sp_digit* r, const sp_digit* a, const sp_digit* e, XMEMCPY(t[2], (void*)(((size_t)t[0] & addr_mask[y^1]) + ((size_t)t[1] & addr_mask[y])), - sizeof(*t[2]) * 98 * 2); + sizeof(*t[2]) * 98 * 2); sp_4096_mont_sqr_98(t[2], t[2], m, mp); XMEMCPY((void*)(((size_t)t[0] & addr_mask[y^1]) + ((size_t)t[1] & addr_mask[y])), t[2], - sizeof(*t[2]) * 98 * 2); + sizeof(*t[2]) * 98 * 2); } sp_4096_mont_reduce_98(t[0], m, mp); @@ -9778,16 +9884,18 @@ static int sp_4096_mod_exp_98(sp_digit* r, const sp_digit* a, const sp_digit* e, } +#if !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } +#endif return err; #elif defined(WOLFSSL_SP_CACHE_RESISTANT) -#ifndef WOLFSSL_SMALL_STACK - sp_digit td[196]; -#else +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[196]; #endif sp_digit* t[3]; sp_digit* norm; @@ -9798,7 +9906,7 @@ static int sp_4096_mod_exp_98(sp_digit* r, const sp_digit* a, const sp_digit* e, int err = MP_OKAY; #ifdef WOLFSSL_SMALL_STACK - td = (sp_digit*)XMALLOC(sizeof(*td) * 3 * 98 * 2, NULL, + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 3 * 98 * 2, NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; @@ -9806,10 +9914,14 @@ static int sp_4096_mod_exp_98(sp_digit* r, const sp_digit* a, const sp_digit* e, #endif if (err == MP_OKAY) { - t[0] = td; - t[1] = &td[98 * 2]; - t[2] = &td[2 * 98 * 2]; - norm = t[0]; + norm = td; + for (i=0; i<3; i++) { +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + t[i] = td + (i * 98 * 2); +#else + t[i] = &td[i * 98 * 2)]; +#endif + } sp_4096_mont_setup(m, &mp); sp_4096_mont_norm_98(norm, m); @@ -9847,17 +9959,19 @@ static int sp_4096_mod_exp_98(sp_digit* r, const sp_digit* a, const sp_digit* e, sp_4096_mont_mul_98(t[y^1], t[0], t[1], m, mp); XMEMCPY(t[2], (void*)(((size_t)t[0] & addr_mask[y^1]) + - ((size_t)t[1] & addr_mask[y])), sizeof(t[2])); + ((size_t)t[1] & addr_mask[y])), + sizeof(*t[2]) * 98 * 2); sp_4096_mont_sqr_98(t[2], t[2], m, mp); XMEMCPY((void*)(((size_t)t[0] & addr_mask[y^1]) + - ((size_t)t[1] & addr_mask[y])), t[2], sizeof(t[2])); + ((size_t)t[1] & addr_mask[y])), t[2], + sizeof(*t[2]) * 98 * 2); } sp_4096_mont_reduce_98(t[0], m, mp); n = sp_4096_cmp_98(t[0], m); sp_4096_cond_sub_98(t[0], t[0], m, ((n < 0) ? - (sp_digit)1 : (sp_digit)0) - 1); - XMEMCPY(r, t[0], sizeof(t[0])); + (sp_digit)1 : (sp_digit)0) - 1); + XMEMCPY(r, t[0], sizeof(*r) * 98 * 2); } #ifdef WOLFSSL_SMALL_STACK @@ -9868,22 +9982,22 @@ static int sp_4096_mod_exp_98(sp_digit* r, const sp_digit* a, const sp_digit* e, return err; #else -#ifndef WOLFSSL_SMALL_STACK - sp_digit td[32][196]; -#else +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[(32 * 196) + 196]; #endif sp_digit* t[32]; + sp_digit* rt; sp_digit* norm; - sp_digit rt[196]; sp_digit mp = 1; sp_digit n; int i; int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK - td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32 * 196, NULL, +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * ((32 * 196) + 196), NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; @@ -9891,9 +10005,16 @@ static int sp_4096_mod_exp_98(sp_digit* r, const sp_digit* a, const sp_digit* e, #endif if (err == MP_OKAY) { + norm = td; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) for (i=0; i<32; i++) t[i] = td + i * 196; - norm = t[0]; + rt = td + 6272; +#else + for (i=0; i<32; i++) + t[i] = &td[i * 196]; + rt = &td[6272]; +#endif sp_4096_mont_setup(m, &mp); sp_4096_mont_norm_98(norm, m); @@ -9963,7 +10084,7 @@ static int sp_4096_mod_exp_98(sp_digit* r, const sp_digit* a, const sp_digit* e, y = (n >> 27) & 0x1f; n <<= 5; c -= 5; - XMEMCPY(rt, t[y], sizeof(rt)); + XMEMCPY(rt, t[y], sizeof(sp_digit) * 196); for (; i>=0 || c>=5; ) { if (c < 5) { n |= e[i--] << (11 - c); @@ -9986,10 +10107,10 @@ static int sp_4096_mod_exp_98(sp_digit* r, const sp_digit* a, const sp_digit* e, n = sp_4096_cmp_98(rt, m); sp_4096_cond_sub_98(rt, rt, m, ((n < 0) ? (sp_digit)1 : (sp_digit)0) - 1); - XMEMCPY(r, rt, sizeof(rt)); + XMEMCPY(r, rt, sizeof(sp_digit) * 196); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } @@ -10646,7 +10767,11 @@ static int sp_4096_mod_exp_196(sp_digit* r, const sp_digit* a, const sp_digit* e const sp_digit* m, int reduceA) { #ifdef WOLFSSL_SP_SMALL +#if !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[3 * 392]; +#endif sp_digit* t[3]; sp_digit* norm; sp_digit mp = 1; @@ -10655,18 +10780,24 @@ static int sp_4096_mod_exp_196(sp_digit* r, const sp_digit* a, const sp_digit* e int c, y; int err = MP_OKAY; - td = (sp_digit*)XMALLOC(sizeof(*td) * 3 * 196 * 2, NULL, +#if !defined(WOLFSSL_SP_NO_MALLOC) + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 3 * 196 * 2, NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; } +#endif if (err == MP_OKAY) { - XMEMSET(td, 0, sizeof(*td) * 3U * 196U * 2U); - - norm = t[0] = td; - t[1] = &td[196 * 2]; - t[2] = &td[2 * 196 * 2]; + norm = td; + for (i=0; i<3; i++) { +#if !defined(WOLFSSL_SP_NO_MALLOC) + t[i] = td + (i * 196 * 2); +#else + t[i] = &td[i * 196 * 2]; +#endif + XMEMSET(t[i], 0, sizeof(sp_digit) * 196U * 2U); + } sp_4096_mont_setup(m, &mp); sp_4096_mont_norm_196(norm, m); @@ -10704,11 +10835,11 @@ static int sp_4096_mod_exp_196(sp_digit* r, const sp_digit* a, const sp_digit* e XMEMCPY(t[2], (void*)(((size_t)t[0] & addr_mask[y^1]) + ((size_t)t[1] & addr_mask[y])), - sizeof(*t[2]) * 196 * 2); + sizeof(*t[2]) * 196 * 2); sp_4096_mont_sqr_196(t[2], t[2], m, mp); XMEMCPY((void*)(((size_t)t[0] & addr_mask[y^1]) + ((size_t)t[1] & addr_mask[y])), t[2], - sizeof(*t[2]) * 196 * 2); + sizeof(*t[2]) * 196 * 2); } sp_4096_mont_reduce_196(t[0], m, mp); @@ -10719,16 +10850,18 @@ static int sp_4096_mod_exp_196(sp_digit* r, const sp_digit* a, const sp_digit* e } +#if !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } +#endif return err; #elif defined(WOLFSSL_SP_CACHE_RESISTANT) -#ifndef WOLFSSL_SMALL_STACK - sp_digit td[392]; -#else +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[392]; #endif sp_digit* t[3]; sp_digit* norm; @@ -10739,7 +10872,7 @@ static int sp_4096_mod_exp_196(sp_digit* r, const sp_digit* a, const sp_digit* e int err = MP_OKAY; #ifdef WOLFSSL_SMALL_STACK - td = (sp_digit*)XMALLOC(sizeof(*td) * 3 * 196 * 2, NULL, + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 3 * 196 * 2, NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; @@ -10747,10 +10880,14 @@ static int sp_4096_mod_exp_196(sp_digit* r, const sp_digit* a, const sp_digit* e #endif if (err == MP_OKAY) { - t[0] = td; - t[1] = &td[196 * 2]; - t[2] = &td[2 * 196 * 2]; - norm = t[0]; + norm = td; + for (i=0; i<3; i++) { +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + t[i] = td + (i * 196 * 2); +#else + t[i] = &td[i * 196 * 2)]; +#endif + } sp_4096_mont_setup(m, &mp); sp_4096_mont_norm_196(norm, m); @@ -10788,17 +10925,19 @@ static int sp_4096_mod_exp_196(sp_digit* r, const sp_digit* a, const sp_digit* e sp_4096_mont_mul_196(t[y^1], t[0], t[1], m, mp); XMEMCPY(t[2], (void*)(((size_t)t[0] & addr_mask[y^1]) + - ((size_t)t[1] & addr_mask[y])), sizeof(t[2])); + ((size_t)t[1] & addr_mask[y])), + sizeof(*t[2]) * 196 * 2); sp_4096_mont_sqr_196(t[2], t[2], m, mp); XMEMCPY((void*)(((size_t)t[0] & addr_mask[y^1]) + - ((size_t)t[1] & addr_mask[y])), t[2], sizeof(t[2])); + ((size_t)t[1] & addr_mask[y])), t[2], + sizeof(*t[2]) * 196 * 2); } sp_4096_mont_reduce_196(t[0], m, mp); n = sp_4096_cmp_196(t[0], m); sp_4096_cond_sub_196(t[0], t[0], m, ((n < 0) ? - (sp_digit)1 : (sp_digit)0) - 1); - XMEMCPY(r, t[0], sizeof(t[0])); + (sp_digit)1 : (sp_digit)0) - 1); + XMEMCPY(r, t[0], sizeof(*r) * 196 * 2); } #ifdef WOLFSSL_SMALL_STACK @@ -10809,22 +10948,22 @@ static int sp_4096_mod_exp_196(sp_digit* r, const sp_digit* a, const sp_digit* e return err; #else -#ifndef WOLFSSL_SMALL_STACK - sp_digit td[32][392]; -#else +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[(32 * 392) + 392]; #endif sp_digit* t[32]; + sp_digit* rt; sp_digit* norm; - sp_digit rt[392]; sp_digit mp = 1; sp_digit n; int i; int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK - td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32 * 392, NULL, +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * ((32 * 392) + 392), NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; @@ -10832,9 +10971,16 @@ static int sp_4096_mod_exp_196(sp_digit* r, const sp_digit* a, const sp_digit* e #endif if (err == MP_OKAY) { + norm = td; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) for (i=0; i<32; i++) t[i] = td + i * 392; - norm = t[0]; + rt = td + 12544; +#else + for (i=0; i<32; i++) + t[i] = &td[i * 392]; + rt = &td[12544]; +#endif sp_4096_mont_setup(m, &mp); sp_4096_mont_norm_196(norm, m); @@ -10904,7 +11050,7 @@ static int sp_4096_mod_exp_196(sp_digit* r, const sp_digit* a, const sp_digit* e y = (n >> 27) & 0x1f; n <<= 5; c -= 5; - XMEMCPY(rt, t[y], sizeof(rt)); + XMEMCPY(rt, t[y], sizeof(sp_digit) * 392); for (; i>=0 || c>=5; ) { if (c < 5) { n |= e[i--] << (11 - c); @@ -10927,10 +11073,10 @@ static int sp_4096_mod_exp_196(sp_digit* r, const sp_digit* a, const sp_digit* e n = sp_4096_cmp_196(rt, m); sp_4096_cond_sub_196(rt, rt, m, ((n < 0) ? (sp_digit)1 : (sp_digit)0) - 1); - XMEMCPY(r, rt, sizeof(rt)); + XMEMCPY(r, rt, sizeof(sp_digit) * 392); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } @@ -12070,11 +12216,10 @@ SP_NOINLINE static void sp_4096_lshift_196(sp_digit* r, sp_digit* a, byte n) */ static int sp_4096_mod_exp_2_196(sp_digit* r, const sp_digit* e, int bits, const sp_digit* m) { -#ifndef WOLFSSL_SMALL_STACK - sp_digit nd[392]; - sp_digit td[197]; -#else +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[589]; #endif sp_digit* norm; sp_digit* tmp; @@ -12084,7 +12229,7 @@ static int sp_4096_mod_exp_2_196(sp_digit* r, const sp_digit* e, int bits, const int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 589, NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { @@ -12093,13 +12238,12 @@ static int sp_4096_mod_exp_2_196(sp_digit* r, const sp_digit* e, int bits, const #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK norm = td; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) tmp = td + 392; XMEMSET(td, 0, sizeof(sp_digit) * 589); #else - norm = nd; - tmp = td; + tmp = &td[392]; XMEMSET(td, 0, sizeof(td)); #endif @@ -12158,7 +12302,7 @@ static int sp_4096_mod_exp_2_196(sp_digit* r, const sp_digit* e, int bits, const (sp_digit)1 : (sp_digit)0) - 1); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } diff --git a/wolfcrypt/src/sp_c64.c b/wolfcrypt/src/sp_c64.c index 1e49826ce..f956f86ed 100644 --- a/wolfcrypt/src/sp_c64.c +++ b/wolfcrypt/src/sp_c64.c @@ -1544,7 +1544,11 @@ static int sp_2048_mod_exp_18(sp_digit* r, const sp_digit* a, const sp_digit* e, const sp_digit* m, int reduceA) { #ifdef WOLFSSL_SP_SMALL +#if !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[3 * 36]; +#endif sp_digit* t[3]; sp_digit* norm; sp_digit mp = 1; @@ -1553,18 +1557,24 @@ static int sp_2048_mod_exp_18(sp_digit* r, const sp_digit* a, const sp_digit* e, int c, y; int err = MP_OKAY; - td = (sp_digit*)XMALLOC(sizeof(*td) * 3 * 18 * 2, NULL, +#if !defined(WOLFSSL_SP_NO_MALLOC) + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 3 * 18 * 2, NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; } +#endif if (err == MP_OKAY) { - XMEMSET(td, 0, sizeof(*td) * 3U * 18U * 2U); - - norm = t[0] = td; - t[1] = &td[18 * 2]; - t[2] = &td[2 * 18 * 2]; + norm = td; + for (i=0; i<3; i++) { +#if !defined(WOLFSSL_SP_NO_MALLOC) + t[i] = td + (i * 18 * 2); +#else + t[i] = &td[i * 18 * 2]; +#endif + XMEMSET(t[i], 0, sizeof(sp_digit) * 18U * 2U); + } sp_2048_mont_setup(m, &mp); sp_2048_mont_norm_18(norm, m); @@ -1602,11 +1612,11 @@ static int sp_2048_mod_exp_18(sp_digit* r, const sp_digit* a, const sp_digit* e, XMEMCPY(t[2], (void*)(((size_t)t[0] & addr_mask[y^1]) + ((size_t)t[1] & addr_mask[y])), - sizeof(*t[2]) * 18 * 2); + sizeof(*t[2]) * 18 * 2); sp_2048_mont_sqr_18(t[2], t[2], m, mp); XMEMCPY((void*)(((size_t)t[0] & addr_mask[y^1]) + ((size_t)t[1] & addr_mask[y])), t[2], - sizeof(*t[2]) * 18 * 2); + sizeof(*t[2]) * 18 * 2); } sp_2048_mont_reduce_18(t[0], m, mp); @@ -1617,16 +1627,18 @@ static int sp_2048_mod_exp_18(sp_digit* r, const sp_digit* a, const sp_digit* e, } +#if !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } +#endif return err; #elif defined(WOLFSSL_SP_CACHE_RESISTANT) -#ifndef WOLFSSL_SMALL_STACK - sp_digit td[36]; -#else +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[36]; #endif sp_digit* t[3]; sp_digit* norm; @@ -1637,7 +1649,7 @@ static int sp_2048_mod_exp_18(sp_digit* r, const sp_digit* a, const sp_digit* e, int err = MP_OKAY; #ifdef WOLFSSL_SMALL_STACK - td = (sp_digit*)XMALLOC(sizeof(*td) * 3 * 18 * 2, NULL, + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 3 * 18 * 2, NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; @@ -1645,10 +1657,14 @@ static int sp_2048_mod_exp_18(sp_digit* r, const sp_digit* a, const sp_digit* e, #endif if (err == MP_OKAY) { - t[0] = td; - t[1] = &td[18 * 2]; - t[2] = &td[2 * 18 * 2]; - norm = t[0]; + norm = td; + for (i=0; i<3; i++) { +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + t[i] = td + (i * 18 * 2); +#else + t[i] = &td[i * 18 * 2)]; +#endif + } sp_2048_mont_setup(m, &mp); sp_2048_mont_norm_18(norm, m); @@ -1686,17 +1702,19 @@ static int sp_2048_mod_exp_18(sp_digit* r, const sp_digit* a, const sp_digit* e, sp_2048_mont_mul_18(t[y^1], t[0], t[1], m, mp); XMEMCPY(t[2], (void*)(((size_t)t[0] & addr_mask[y^1]) + - ((size_t)t[1] & addr_mask[y])), sizeof(t[2])); + ((size_t)t[1] & addr_mask[y])), + sizeof(*t[2]) * 18 * 2); sp_2048_mont_sqr_18(t[2], t[2], m, mp); XMEMCPY((void*)(((size_t)t[0] & addr_mask[y^1]) + - ((size_t)t[1] & addr_mask[y])), t[2], sizeof(t[2])); + ((size_t)t[1] & addr_mask[y])), t[2], + sizeof(*t[2]) * 18 * 2); } sp_2048_mont_reduce_18(t[0], m, mp); n = sp_2048_cmp_18(t[0], m); sp_2048_cond_sub_18(t[0], t[0], m, ((n < 0) ? - (sp_digit)1 : (sp_digit)0) - 1); - XMEMCPY(r, t[0], sizeof(t[0])); + (sp_digit)1 : (sp_digit)0) - 1); + XMEMCPY(r, t[0], sizeof(*r) * 18 * 2); } #ifdef WOLFSSL_SMALL_STACK @@ -1707,22 +1725,22 @@ static int sp_2048_mod_exp_18(sp_digit* r, const sp_digit* a, const sp_digit* e, return err; #else -#ifndef WOLFSSL_SMALL_STACK - sp_digit td[32][36]; -#else +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[(32 * 36) + 36]; #endif sp_digit* t[32]; + sp_digit* rt; sp_digit* norm; - sp_digit rt[36]; sp_digit mp = 1; sp_digit n; int i; int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK - td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32 * 36, NULL, +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * ((32 * 36) + 36), NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; @@ -1730,9 +1748,16 @@ static int sp_2048_mod_exp_18(sp_digit* r, const sp_digit* a, const sp_digit* e, #endif if (err == MP_OKAY) { + norm = td; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) for (i=0; i<32; i++) t[i] = td + i * 36; - norm = t[0]; + rt = td + 1152; +#else + for (i=0; i<32; i++) + t[i] = &td[i * 36]; + rt = &td[1152]; +#endif sp_2048_mont_setup(m, &mp); sp_2048_mont_norm_18(norm, m); @@ -1802,7 +1827,7 @@ static int sp_2048_mod_exp_18(sp_digit* r, const sp_digit* a, const sp_digit* e, y = (n >> 59) & 0x1f; n <<= 5; c -= 5; - XMEMCPY(rt, t[y], sizeof(rt)); + XMEMCPY(rt, t[y], sizeof(sp_digit) * 36); for (; i>=0 || c>=5; ) { if (c < 5) { n |= e[i--] << (7 - c); @@ -1825,10 +1850,10 @@ static int sp_2048_mod_exp_18(sp_digit* r, const sp_digit* a, const sp_digit* e, n = sp_2048_cmp_18(rt, m); sp_2048_cond_sub_18(rt, rt, m, ((n < 0) ? (sp_digit)1 : (sp_digit)0) - 1); - XMEMCPY(r, rt, sizeof(rt)); + XMEMCPY(r, rt, sizeof(sp_digit) * 36); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } @@ -2464,7 +2489,11 @@ static int sp_2048_mod_exp_36(sp_digit* r, const sp_digit* a, const sp_digit* e, const sp_digit* m, int reduceA) { #ifdef WOLFSSL_SP_SMALL +#if !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[3 * 72]; +#endif sp_digit* t[3]; sp_digit* norm; sp_digit mp = 1; @@ -2473,18 +2502,24 @@ static int sp_2048_mod_exp_36(sp_digit* r, const sp_digit* a, const sp_digit* e, int c, y; int err = MP_OKAY; - td = (sp_digit*)XMALLOC(sizeof(*td) * 3 * 36 * 2, NULL, +#if !defined(WOLFSSL_SP_NO_MALLOC) + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 3 * 36 * 2, NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; } +#endif if (err == MP_OKAY) { - XMEMSET(td, 0, sizeof(*td) * 3U * 36U * 2U); - - norm = t[0] = td; - t[1] = &td[36 * 2]; - t[2] = &td[2 * 36 * 2]; + norm = td; + for (i=0; i<3; i++) { +#if !defined(WOLFSSL_SP_NO_MALLOC) + t[i] = td + (i * 36 * 2); +#else + t[i] = &td[i * 36 * 2]; +#endif + XMEMSET(t[i], 0, sizeof(sp_digit) * 36U * 2U); + } sp_2048_mont_setup(m, &mp); sp_2048_mont_norm_36(norm, m); @@ -2522,11 +2557,11 @@ static int sp_2048_mod_exp_36(sp_digit* r, const sp_digit* a, const sp_digit* e, XMEMCPY(t[2], (void*)(((size_t)t[0] & addr_mask[y^1]) + ((size_t)t[1] & addr_mask[y])), - sizeof(*t[2]) * 36 * 2); + sizeof(*t[2]) * 36 * 2); sp_2048_mont_sqr_36(t[2], t[2], m, mp); XMEMCPY((void*)(((size_t)t[0] & addr_mask[y^1]) + ((size_t)t[1] & addr_mask[y])), t[2], - sizeof(*t[2]) * 36 * 2); + sizeof(*t[2]) * 36 * 2); } sp_2048_mont_reduce_36(t[0], m, mp); @@ -2537,16 +2572,18 @@ static int sp_2048_mod_exp_36(sp_digit* r, const sp_digit* a, const sp_digit* e, } +#if !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } +#endif return err; #elif defined(WOLFSSL_SP_CACHE_RESISTANT) -#ifndef WOLFSSL_SMALL_STACK - sp_digit td[72]; -#else +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[72]; #endif sp_digit* t[3]; sp_digit* norm; @@ -2557,7 +2594,7 @@ static int sp_2048_mod_exp_36(sp_digit* r, const sp_digit* a, const sp_digit* e, int err = MP_OKAY; #ifdef WOLFSSL_SMALL_STACK - td = (sp_digit*)XMALLOC(sizeof(*td) * 3 * 36 * 2, NULL, + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 3 * 36 * 2, NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; @@ -2565,10 +2602,14 @@ static int sp_2048_mod_exp_36(sp_digit* r, const sp_digit* a, const sp_digit* e, #endif if (err == MP_OKAY) { - t[0] = td; - t[1] = &td[36 * 2]; - t[2] = &td[2 * 36 * 2]; - norm = t[0]; + norm = td; + for (i=0; i<3; i++) { +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + t[i] = td + (i * 36 * 2); +#else + t[i] = &td[i * 36 * 2)]; +#endif + } sp_2048_mont_setup(m, &mp); sp_2048_mont_norm_36(norm, m); @@ -2606,17 +2647,19 @@ static int sp_2048_mod_exp_36(sp_digit* r, const sp_digit* a, const sp_digit* e, sp_2048_mont_mul_36(t[y^1], t[0], t[1], m, mp); XMEMCPY(t[2], (void*)(((size_t)t[0] & addr_mask[y^1]) + - ((size_t)t[1] & addr_mask[y])), sizeof(t[2])); + ((size_t)t[1] & addr_mask[y])), + sizeof(*t[2]) * 36 * 2); sp_2048_mont_sqr_36(t[2], t[2], m, mp); XMEMCPY((void*)(((size_t)t[0] & addr_mask[y^1]) + - ((size_t)t[1] & addr_mask[y])), t[2], sizeof(t[2])); + ((size_t)t[1] & addr_mask[y])), t[2], + sizeof(*t[2]) * 36 * 2); } sp_2048_mont_reduce_36(t[0], m, mp); n = sp_2048_cmp_36(t[0], m); sp_2048_cond_sub_36(t[0], t[0], m, ((n < 0) ? - (sp_digit)1 : (sp_digit)0) - 1); - XMEMCPY(r, t[0], sizeof(t[0])); + (sp_digit)1 : (sp_digit)0) - 1); + XMEMCPY(r, t[0], sizeof(*r) * 36 * 2); } #ifdef WOLFSSL_SMALL_STACK @@ -2627,22 +2670,22 @@ static int sp_2048_mod_exp_36(sp_digit* r, const sp_digit* a, const sp_digit* e, return err; #else -#ifndef WOLFSSL_SMALL_STACK - sp_digit td[32][72]; -#else +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[(32 * 72) + 72]; #endif sp_digit* t[32]; + sp_digit* rt; sp_digit* norm; - sp_digit rt[72]; sp_digit mp = 1; sp_digit n; int i; int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK - td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32 * 72, NULL, +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * ((32 * 72) + 72), NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; @@ -2650,9 +2693,16 @@ static int sp_2048_mod_exp_36(sp_digit* r, const sp_digit* a, const sp_digit* e, #endif if (err == MP_OKAY) { + norm = td; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) for (i=0; i<32; i++) t[i] = td + i * 72; - norm = t[0]; + rt = td + 2304; +#else + for (i=0; i<32; i++) + t[i] = &td[i * 72]; + rt = &td[2304]; +#endif sp_2048_mont_setup(m, &mp); sp_2048_mont_norm_36(norm, m); @@ -2722,7 +2772,7 @@ static int sp_2048_mod_exp_36(sp_digit* r, const sp_digit* a, const sp_digit* e, y = (n >> 59) & 0x1f; n <<= 5; c -= 5; - XMEMCPY(rt, t[y], sizeof(rt)); + XMEMCPY(rt, t[y], sizeof(sp_digit) * 72); for (; i>=0 || c>=5; ) { if (c < 5) { n |= e[i--] << (7 - c); @@ -2745,10 +2795,10 @@ static int sp_2048_mod_exp_36(sp_digit* r, const sp_digit* a, const sp_digit* e, n = sp_2048_cmp_36(rt, m); sp_2048_cond_sub_36(rt, rt, m, ((n < 0) ? (sp_digit)1 : (sp_digit)0) - 1); - XMEMCPY(r, rt, sizeof(rt)); + XMEMCPY(r, rt, sizeof(sp_digit) * 72); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } @@ -3568,11 +3618,10 @@ SP_NOINLINE static void sp_2048_lshift_36(sp_digit* r, sp_digit* a, byte n) */ static int sp_2048_mod_exp_2_36(sp_digit* r, const sp_digit* e, int bits, const sp_digit* m) { -#ifndef WOLFSSL_SMALL_STACK - sp_digit nd[72]; - sp_digit td[37]; -#else +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[109]; #endif sp_digit* norm; sp_digit* tmp; @@ -3582,7 +3631,7 @@ static int sp_2048_mod_exp_2_36(sp_digit* r, const sp_digit* e, int bits, const int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 109, NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { @@ -3591,13 +3640,12 @@ static int sp_2048_mod_exp_2_36(sp_digit* r, const sp_digit* e, int bits, const #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK norm = td; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) tmp = td + 72; XMEMSET(td, 0, sizeof(sp_digit) * 109); #else - norm = nd; - tmp = td; + tmp = &td[72]; XMEMSET(td, 0, sizeof(td)); #endif @@ -3657,7 +3705,7 @@ static int sp_2048_mod_exp_2_36(sp_digit* r, const sp_digit* e, int bits, const (sp_digit)1 : (sp_digit)0) - 1); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } @@ -5677,7 +5725,11 @@ static int sp_3072_mod_exp_27(sp_digit* r, const sp_digit* a, const sp_digit* e, const sp_digit* m, int reduceA) { #ifdef WOLFSSL_SP_SMALL +#if !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[3 * 54]; +#endif sp_digit* t[3]; sp_digit* norm; sp_digit mp = 1; @@ -5686,18 +5738,24 @@ static int sp_3072_mod_exp_27(sp_digit* r, const sp_digit* a, const sp_digit* e, int c, y; int err = MP_OKAY; - td = (sp_digit*)XMALLOC(sizeof(*td) * 3 * 27 * 2, NULL, +#if !defined(WOLFSSL_SP_NO_MALLOC) + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 3 * 27 * 2, NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; } +#endif if (err == MP_OKAY) { - XMEMSET(td, 0, sizeof(*td) * 3U * 27U * 2U); - - norm = t[0] = td; - t[1] = &td[27 * 2]; - t[2] = &td[2 * 27 * 2]; + norm = td; + for (i=0; i<3; i++) { +#if !defined(WOLFSSL_SP_NO_MALLOC) + t[i] = td + (i * 27 * 2); +#else + t[i] = &td[i * 27 * 2]; +#endif + XMEMSET(t[i], 0, sizeof(sp_digit) * 27U * 2U); + } sp_3072_mont_setup(m, &mp); sp_3072_mont_norm_27(norm, m); @@ -5735,11 +5793,11 @@ static int sp_3072_mod_exp_27(sp_digit* r, const sp_digit* a, const sp_digit* e, XMEMCPY(t[2], (void*)(((size_t)t[0] & addr_mask[y^1]) + ((size_t)t[1] & addr_mask[y])), - sizeof(*t[2]) * 27 * 2); + sizeof(*t[2]) * 27 * 2); sp_3072_mont_sqr_27(t[2], t[2], m, mp); XMEMCPY((void*)(((size_t)t[0] & addr_mask[y^1]) + ((size_t)t[1] & addr_mask[y])), t[2], - sizeof(*t[2]) * 27 * 2); + sizeof(*t[2]) * 27 * 2); } sp_3072_mont_reduce_27(t[0], m, mp); @@ -5750,16 +5808,18 @@ static int sp_3072_mod_exp_27(sp_digit* r, const sp_digit* a, const sp_digit* e, } +#if !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } +#endif return err; #elif defined(WOLFSSL_SP_CACHE_RESISTANT) -#ifndef WOLFSSL_SMALL_STACK - sp_digit td[54]; -#else +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[54]; #endif sp_digit* t[3]; sp_digit* norm; @@ -5770,7 +5830,7 @@ static int sp_3072_mod_exp_27(sp_digit* r, const sp_digit* a, const sp_digit* e, int err = MP_OKAY; #ifdef WOLFSSL_SMALL_STACK - td = (sp_digit*)XMALLOC(sizeof(*td) * 3 * 27 * 2, NULL, + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 3 * 27 * 2, NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; @@ -5778,10 +5838,14 @@ static int sp_3072_mod_exp_27(sp_digit* r, const sp_digit* a, const sp_digit* e, #endif if (err == MP_OKAY) { - t[0] = td; - t[1] = &td[27 * 2]; - t[2] = &td[2 * 27 * 2]; - norm = t[0]; + norm = td; + for (i=0; i<3; i++) { +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + t[i] = td + (i * 27 * 2); +#else + t[i] = &td[i * 27 * 2)]; +#endif + } sp_3072_mont_setup(m, &mp); sp_3072_mont_norm_27(norm, m); @@ -5819,17 +5883,19 @@ static int sp_3072_mod_exp_27(sp_digit* r, const sp_digit* a, const sp_digit* e, sp_3072_mont_mul_27(t[y^1], t[0], t[1], m, mp); XMEMCPY(t[2], (void*)(((size_t)t[0] & addr_mask[y^1]) + - ((size_t)t[1] & addr_mask[y])), sizeof(t[2])); + ((size_t)t[1] & addr_mask[y])), + sizeof(*t[2]) * 27 * 2); sp_3072_mont_sqr_27(t[2], t[2], m, mp); XMEMCPY((void*)(((size_t)t[0] & addr_mask[y^1]) + - ((size_t)t[1] & addr_mask[y])), t[2], sizeof(t[2])); + ((size_t)t[1] & addr_mask[y])), t[2], + sizeof(*t[2]) * 27 * 2); } sp_3072_mont_reduce_27(t[0], m, mp); n = sp_3072_cmp_27(t[0], m); sp_3072_cond_sub_27(t[0], t[0], m, ((n < 0) ? - (sp_digit)1 : (sp_digit)0) - 1); - XMEMCPY(r, t[0], sizeof(t[0])); + (sp_digit)1 : (sp_digit)0) - 1); + XMEMCPY(r, t[0], sizeof(*r) * 27 * 2); } #ifdef WOLFSSL_SMALL_STACK @@ -5840,22 +5906,22 @@ static int sp_3072_mod_exp_27(sp_digit* r, const sp_digit* a, const sp_digit* e, return err; #else -#ifndef WOLFSSL_SMALL_STACK - sp_digit td[32][54]; -#else +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[(32 * 54) + 54]; #endif sp_digit* t[32]; + sp_digit* rt; sp_digit* norm; - sp_digit rt[54]; sp_digit mp = 1; sp_digit n; int i; int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK - td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32 * 54, NULL, +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * ((32 * 54) + 54), NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; @@ -5863,9 +5929,16 @@ static int sp_3072_mod_exp_27(sp_digit* r, const sp_digit* a, const sp_digit* e, #endif if (err == MP_OKAY) { + norm = td; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) for (i=0; i<32; i++) t[i] = td + i * 54; - norm = t[0]; + rt = td + 1728; +#else + for (i=0; i<32; i++) + t[i] = &td[i * 54]; + rt = &td[1728]; +#endif sp_3072_mont_setup(m, &mp); sp_3072_mont_norm_27(norm, m); @@ -5935,7 +6008,7 @@ static int sp_3072_mod_exp_27(sp_digit* r, const sp_digit* a, const sp_digit* e, y = (n >> 59) & 0x1f; n <<= 5; c -= 5; - XMEMCPY(rt, t[y], sizeof(rt)); + XMEMCPY(rt, t[y], sizeof(sp_digit) * 54); for (; i>=0 || c>=5; ) { if (c < 5) { n |= e[i--] << (7 - c); @@ -5958,10 +6031,10 @@ static int sp_3072_mod_exp_27(sp_digit* r, const sp_digit* a, const sp_digit* e, n = sp_3072_cmp_27(rt, m); sp_3072_cond_sub_27(rt, rt, m, ((n < 0) ? (sp_digit)1 : (sp_digit)0) - 1); - XMEMCPY(r, rt, sizeof(rt)); + XMEMCPY(r, rt, sizeof(sp_digit) * 54); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } @@ -6567,7 +6640,11 @@ static int sp_3072_mod_exp_54(sp_digit* r, const sp_digit* a, const sp_digit* e, const sp_digit* m, int reduceA) { #ifdef WOLFSSL_SP_SMALL +#if !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[3 * 108]; +#endif sp_digit* t[3]; sp_digit* norm; sp_digit mp = 1; @@ -6576,18 +6653,24 @@ static int sp_3072_mod_exp_54(sp_digit* r, const sp_digit* a, const sp_digit* e, int c, y; int err = MP_OKAY; - td = (sp_digit*)XMALLOC(sizeof(*td) * 3 * 54 * 2, NULL, +#if !defined(WOLFSSL_SP_NO_MALLOC) + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 3 * 54 * 2, NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; } +#endif if (err == MP_OKAY) { - XMEMSET(td, 0, sizeof(*td) * 3U * 54U * 2U); - - norm = t[0] = td; - t[1] = &td[54 * 2]; - t[2] = &td[2 * 54 * 2]; + norm = td; + for (i=0; i<3; i++) { +#if !defined(WOLFSSL_SP_NO_MALLOC) + t[i] = td + (i * 54 * 2); +#else + t[i] = &td[i * 54 * 2]; +#endif + XMEMSET(t[i], 0, sizeof(sp_digit) * 54U * 2U); + } sp_3072_mont_setup(m, &mp); sp_3072_mont_norm_54(norm, m); @@ -6625,11 +6708,11 @@ static int sp_3072_mod_exp_54(sp_digit* r, const sp_digit* a, const sp_digit* e, XMEMCPY(t[2], (void*)(((size_t)t[0] & addr_mask[y^1]) + ((size_t)t[1] & addr_mask[y])), - sizeof(*t[2]) * 54 * 2); + sizeof(*t[2]) * 54 * 2); sp_3072_mont_sqr_54(t[2], t[2], m, mp); XMEMCPY((void*)(((size_t)t[0] & addr_mask[y^1]) + ((size_t)t[1] & addr_mask[y])), t[2], - sizeof(*t[2]) * 54 * 2); + sizeof(*t[2]) * 54 * 2); } sp_3072_mont_reduce_54(t[0], m, mp); @@ -6640,16 +6723,18 @@ static int sp_3072_mod_exp_54(sp_digit* r, const sp_digit* a, const sp_digit* e, } +#if !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } +#endif return err; #elif defined(WOLFSSL_SP_CACHE_RESISTANT) -#ifndef WOLFSSL_SMALL_STACK - sp_digit td[108]; -#else +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[108]; #endif sp_digit* t[3]; sp_digit* norm; @@ -6660,7 +6745,7 @@ static int sp_3072_mod_exp_54(sp_digit* r, const sp_digit* a, const sp_digit* e, int err = MP_OKAY; #ifdef WOLFSSL_SMALL_STACK - td = (sp_digit*)XMALLOC(sizeof(*td) * 3 * 54 * 2, NULL, + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 3 * 54 * 2, NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; @@ -6668,10 +6753,14 @@ static int sp_3072_mod_exp_54(sp_digit* r, const sp_digit* a, const sp_digit* e, #endif if (err == MP_OKAY) { - t[0] = td; - t[1] = &td[54 * 2]; - t[2] = &td[2 * 54 * 2]; - norm = t[0]; + norm = td; + for (i=0; i<3; i++) { +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + t[i] = td + (i * 54 * 2); +#else + t[i] = &td[i * 54 * 2)]; +#endif + } sp_3072_mont_setup(m, &mp); sp_3072_mont_norm_54(norm, m); @@ -6709,17 +6798,19 @@ static int sp_3072_mod_exp_54(sp_digit* r, const sp_digit* a, const sp_digit* e, sp_3072_mont_mul_54(t[y^1], t[0], t[1], m, mp); XMEMCPY(t[2], (void*)(((size_t)t[0] & addr_mask[y^1]) + - ((size_t)t[1] & addr_mask[y])), sizeof(t[2])); + ((size_t)t[1] & addr_mask[y])), + sizeof(*t[2]) * 54 * 2); sp_3072_mont_sqr_54(t[2], t[2], m, mp); XMEMCPY((void*)(((size_t)t[0] & addr_mask[y^1]) + - ((size_t)t[1] & addr_mask[y])), t[2], sizeof(t[2])); + ((size_t)t[1] & addr_mask[y])), t[2], + sizeof(*t[2]) * 54 * 2); } sp_3072_mont_reduce_54(t[0], m, mp); n = sp_3072_cmp_54(t[0], m); sp_3072_cond_sub_54(t[0], t[0], m, ((n < 0) ? - (sp_digit)1 : (sp_digit)0) - 1); - XMEMCPY(r, t[0], sizeof(t[0])); + (sp_digit)1 : (sp_digit)0) - 1); + XMEMCPY(r, t[0], sizeof(*r) * 54 * 2); } #ifdef WOLFSSL_SMALL_STACK @@ -6730,22 +6821,22 @@ static int sp_3072_mod_exp_54(sp_digit* r, const sp_digit* a, const sp_digit* e, return err; #else -#ifndef WOLFSSL_SMALL_STACK - sp_digit td[32][108]; -#else +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[(32 * 108) + 108]; #endif sp_digit* t[32]; + sp_digit* rt; sp_digit* norm; - sp_digit rt[108]; sp_digit mp = 1; sp_digit n; int i; int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK - td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32 * 108, NULL, +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * ((32 * 108) + 108), NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; @@ -6753,9 +6844,16 @@ static int sp_3072_mod_exp_54(sp_digit* r, const sp_digit* a, const sp_digit* e, #endif if (err == MP_OKAY) { + norm = td; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) for (i=0; i<32; i++) t[i] = td + i * 108; - norm = t[0]; + rt = td + 3456; +#else + for (i=0; i<32; i++) + t[i] = &td[i * 108]; + rt = &td[3456]; +#endif sp_3072_mont_setup(m, &mp); sp_3072_mont_norm_54(norm, m); @@ -6825,7 +6923,7 @@ static int sp_3072_mod_exp_54(sp_digit* r, const sp_digit* a, const sp_digit* e, y = (n >> 59) & 0x1f; n <<= 5; c -= 5; - XMEMCPY(rt, t[y], sizeof(rt)); + XMEMCPY(rt, t[y], sizeof(sp_digit) * 108); for (; i>=0 || c>=5; ) { if (c < 5) { n |= e[i--] << (7 - c); @@ -6848,10 +6946,10 @@ static int sp_3072_mod_exp_54(sp_digit* r, const sp_digit* a, const sp_digit* e, n = sp_3072_cmp_54(rt, m); sp_3072_cond_sub_54(rt, rt, m, ((n < 0) ? (sp_digit)1 : (sp_digit)0) - 1); - XMEMCPY(r, rt, sizeof(rt)); + XMEMCPY(r, rt, sizeof(sp_digit) * 108); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } @@ -7707,11 +7805,10 @@ SP_NOINLINE static void sp_3072_lshift_54(sp_digit* r, sp_digit* a, byte n) */ static int sp_3072_mod_exp_2_54(sp_digit* r, const sp_digit* e, int bits, const sp_digit* m) { -#ifndef WOLFSSL_SMALL_STACK - sp_digit nd[108]; - sp_digit td[55]; -#else +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[163]; #endif sp_digit* norm; sp_digit* tmp; @@ -7721,7 +7818,7 @@ static int sp_3072_mod_exp_2_54(sp_digit* r, const sp_digit* e, int bits, const int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 163, NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { @@ -7730,13 +7827,12 @@ static int sp_3072_mod_exp_2_54(sp_digit* r, const sp_digit* e, int bits, const #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK norm = td; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) tmp = td + 108; XMEMSET(td, 0, sizeof(sp_digit) * 163); #else - norm = nd; - tmp = td; + tmp = &td[108]; XMEMSET(td, 0, sizeof(td)); #endif @@ -7796,7 +7892,7 @@ static int sp_3072_mod_exp_2_54(sp_digit* r, const sp_digit* e, int bits, const (sp_digit)1 : (sp_digit)0) - 1); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } @@ -9926,7 +10022,11 @@ static int sp_4096_mod_exp_39(sp_digit* r, const sp_digit* a, const sp_digit* e, const sp_digit* m, int reduceA) { #ifdef WOLFSSL_SP_SMALL +#if !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[3 * 78]; +#endif sp_digit* t[3]; sp_digit* norm; sp_digit mp = 1; @@ -9935,18 +10035,24 @@ static int sp_4096_mod_exp_39(sp_digit* r, const sp_digit* a, const sp_digit* e, int c, y; int err = MP_OKAY; - td = (sp_digit*)XMALLOC(sizeof(*td) * 3 * 39 * 2, NULL, +#if !defined(WOLFSSL_SP_NO_MALLOC) + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 3 * 39 * 2, NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; } +#endif if (err == MP_OKAY) { - XMEMSET(td, 0, sizeof(*td) * 3U * 39U * 2U); - - norm = t[0] = td; - t[1] = &td[39 * 2]; - t[2] = &td[2 * 39 * 2]; + norm = td; + for (i=0; i<3; i++) { +#if !defined(WOLFSSL_SP_NO_MALLOC) + t[i] = td + (i * 39 * 2); +#else + t[i] = &td[i * 39 * 2]; +#endif + XMEMSET(t[i], 0, sizeof(sp_digit) * 39U * 2U); + } sp_4096_mont_setup(m, &mp); sp_4096_mont_norm_39(norm, m); @@ -9984,11 +10090,11 @@ static int sp_4096_mod_exp_39(sp_digit* r, const sp_digit* a, const sp_digit* e, XMEMCPY(t[2], (void*)(((size_t)t[0] & addr_mask[y^1]) + ((size_t)t[1] & addr_mask[y])), - sizeof(*t[2]) * 39 * 2); + sizeof(*t[2]) * 39 * 2); sp_4096_mont_sqr_39(t[2], t[2], m, mp); XMEMCPY((void*)(((size_t)t[0] & addr_mask[y^1]) + ((size_t)t[1] & addr_mask[y])), t[2], - sizeof(*t[2]) * 39 * 2); + sizeof(*t[2]) * 39 * 2); } sp_4096_mont_reduce_39(t[0], m, mp); @@ -9999,16 +10105,18 @@ static int sp_4096_mod_exp_39(sp_digit* r, const sp_digit* a, const sp_digit* e, } +#if !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } +#endif return err; #elif defined(WOLFSSL_SP_CACHE_RESISTANT) -#ifndef WOLFSSL_SMALL_STACK - sp_digit td[78]; -#else +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[78]; #endif sp_digit* t[3]; sp_digit* norm; @@ -10019,7 +10127,7 @@ static int sp_4096_mod_exp_39(sp_digit* r, const sp_digit* a, const sp_digit* e, int err = MP_OKAY; #ifdef WOLFSSL_SMALL_STACK - td = (sp_digit*)XMALLOC(sizeof(*td) * 3 * 39 * 2, NULL, + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 3 * 39 * 2, NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; @@ -10027,10 +10135,14 @@ static int sp_4096_mod_exp_39(sp_digit* r, const sp_digit* a, const sp_digit* e, #endif if (err == MP_OKAY) { - t[0] = td; - t[1] = &td[39 * 2]; - t[2] = &td[2 * 39 * 2]; - norm = t[0]; + norm = td; + for (i=0; i<3; i++) { +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + t[i] = td + (i * 39 * 2); +#else + t[i] = &td[i * 39 * 2)]; +#endif + } sp_4096_mont_setup(m, &mp); sp_4096_mont_norm_39(norm, m); @@ -10068,17 +10180,19 @@ static int sp_4096_mod_exp_39(sp_digit* r, const sp_digit* a, const sp_digit* e, sp_4096_mont_mul_39(t[y^1], t[0], t[1], m, mp); XMEMCPY(t[2], (void*)(((size_t)t[0] & addr_mask[y^1]) + - ((size_t)t[1] & addr_mask[y])), sizeof(t[2])); + ((size_t)t[1] & addr_mask[y])), + sizeof(*t[2]) * 39 * 2); sp_4096_mont_sqr_39(t[2], t[2], m, mp); XMEMCPY((void*)(((size_t)t[0] & addr_mask[y^1]) + - ((size_t)t[1] & addr_mask[y])), t[2], sizeof(t[2])); + ((size_t)t[1] & addr_mask[y])), t[2], + sizeof(*t[2]) * 39 * 2); } sp_4096_mont_reduce_39(t[0], m, mp); n = sp_4096_cmp_39(t[0], m); sp_4096_cond_sub_39(t[0], t[0], m, ((n < 0) ? - (sp_digit)1 : (sp_digit)0) - 1); - XMEMCPY(r, t[0], sizeof(t[0])); + (sp_digit)1 : (sp_digit)0) - 1); + XMEMCPY(r, t[0], sizeof(*r) * 39 * 2); } #ifdef WOLFSSL_SMALL_STACK @@ -10089,22 +10203,22 @@ static int sp_4096_mod_exp_39(sp_digit* r, const sp_digit* a, const sp_digit* e, return err; #else -#ifndef WOLFSSL_SMALL_STACK - sp_digit td[32][78]; -#else +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[(32 * 78) + 78]; #endif sp_digit* t[32]; + sp_digit* rt; sp_digit* norm; - sp_digit rt[78]; sp_digit mp = 1; sp_digit n; int i; int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK - td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32 * 78, NULL, +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * ((32 * 78) + 78), NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; @@ -10112,9 +10226,16 @@ static int sp_4096_mod_exp_39(sp_digit* r, const sp_digit* a, const sp_digit* e, #endif if (err == MP_OKAY) { + norm = td; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) for (i=0; i<32; i++) t[i] = td + i * 78; - norm = t[0]; + rt = td + 2496; +#else + for (i=0; i<32; i++) + t[i] = &td[i * 78]; + rt = &td[2496]; +#endif sp_4096_mont_setup(m, &mp); sp_4096_mont_norm_39(norm, m); @@ -10184,7 +10305,7 @@ static int sp_4096_mod_exp_39(sp_digit* r, const sp_digit* a, const sp_digit* e, y = (n >> 59) & 0x1f; n <<= 5; c -= 5; - XMEMCPY(rt, t[y], sizeof(rt)); + XMEMCPY(rt, t[y], sizeof(sp_digit) * 78); for (; i>=0 || c>=5; ) { if (c < 5) { n |= e[i--] << (11 - c); @@ -10207,10 +10328,10 @@ static int sp_4096_mod_exp_39(sp_digit* r, const sp_digit* a, const sp_digit* e, n = sp_4096_cmp_39(rt, m); sp_4096_cond_sub_39(rt, rt, m, ((n < 0) ? (sp_digit)1 : (sp_digit)0) - 1); - XMEMCPY(r, rt, sizeof(rt)); + XMEMCPY(r, rt, sizeof(sp_digit) * 78); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } @@ -10915,7 +11036,11 @@ static int sp_4096_mod_exp_78(sp_digit* r, const sp_digit* a, const sp_digit* e, const sp_digit* m, int reduceA) { #ifdef WOLFSSL_SP_SMALL +#if !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[3 * 156]; +#endif sp_digit* t[3]; sp_digit* norm; sp_digit mp = 1; @@ -10924,18 +11049,24 @@ static int sp_4096_mod_exp_78(sp_digit* r, const sp_digit* a, const sp_digit* e, int c, y; int err = MP_OKAY; - td = (sp_digit*)XMALLOC(sizeof(*td) * 3 * 78 * 2, NULL, +#if !defined(WOLFSSL_SP_NO_MALLOC) + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 3 * 78 * 2, NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; } +#endif if (err == MP_OKAY) { - XMEMSET(td, 0, sizeof(*td) * 3U * 78U * 2U); - - norm = t[0] = td; - t[1] = &td[78 * 2]; - t[2] = &td[2 * 78 * 2]; + norm = td; + for (i=0; i<3; i++) { +#if !defined(WOLFSSL_SP_NO_MALLOC) + t[i] = td + (i * 78 * 2); +#else + t[i] = &td[i * 78 * 2]; +#endif + XMEMSET(t[i], 0, sizeof(sp_digit) * 78U * 2U); + } sp_4096_mont_setup(m, &mp); sp_4096_mont_norm_78(norm, m); @@ -10973,11 +11104,11 @@ static int sp_4096_mod_exp_78(sp_digit* r, const sp_digit* a, const sp_digit* e, XMEMCPY(t[2], (void*)(((size_t)t[0] & addr_mask[y^1]) + ((size_t)t[1] & addr_mask[y])), - sizeof(*t[2]) * 78 * 2); + sizeof(*t[2]) * 78 * 2); sp_4096_mont_sqr_78(t[2], t[2], m, mp); XMEMCPY((void*)(((size_t)t[0] & addr_mask[y^1]) + ((size_t)t[1] & addr_mask[y])), t[2], - sizeof(*t[2]) * 78 * 2); + sizeof(*t[2]) * 78 * 2); } sp_4096_mont_reduce_78(t[0], m, mp); @@ -10988,16 +11119,18 @@ static int sp_4096_mod_exp_78(sp_digit* r, const sp_digit* a, const sp_digit* e, } +#if !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } +#endif return err; #elif defined(WOLFSSL_SP_CACHE_RESISTANT) -#ifndef WOLFSSL_SMALL_STACK - sp_digit td[156]; -#else +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[156]; #endif sp_digit* t[3]; sp_digit* norm; @@ -11008,7 +11141,7 @@ static int sp_4096_mod_exp_78(sp_digit* r, const sp_digit* a, const sp_digit* e, int err = MP_OKAY; #ifdef WOLFSSL_SMALL_STACK - td = (sp_digit*)XMALLOC(sizeof(*td) * 3 * 78 * 2, NULL, + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 3 * 78 * 2, NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; @@ -11016,10 +11149,14 @@ static int sp_4096_mod_exp_78(sp_digit* r, const sp_digit* a, const sp_digit* e, #endif if (err == MP_OKAY) { - t[0] = td; - t[1] = &td[78 * 2]; - t[2] = &td[2 * 78 * 2]; - norm = t[0]; + norm = td; + for (i=0; i<3; i++) { +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + t[i] = td + (i * 78 * 2); +#else + t[i] = &td[i * 78 * 2)]; +#endif + } sp_4096_mont_setup(m, &mp); sp_4096_mont_norm_78(norm, m); @@ -11057,17 +11194,19 @@ static int sp_4096_mod_exp_78(sp_digit* r, const sp_digit* a, const sp_digit* e, sp_4096_mont_mul_78(t[y^1], t[0], t[1], m, mp); XMEMCPY(t[2], (void*)(((size_t)t[0] & addr_mask[y^1]) + - ((size_t)t[1] & addr_mask[y])), sizeof(t[2])); + ((size_t)t[1] & addr_mask[y])), + sizeof(*t[2]) * 78 * 2); sp_4096_mont_sqr_78(t[2], t[2], m, mp); XMEMCPY((void*)(((size_t)t[0] & addr_mask[y^1]) + - ((size_t)t[1] & addr_mask[y])), t[2], sizeof(t[2])); + ((size_t)t[1] & addr_mask[y])), t[2], + sizeof(*t[2]) * 78 * 2); } sp_4096_mont_reduce_78(t[0], m, mp); n = sp_4096_cmp_78(t[0], m); sp_4096_cond_sub_78(t[0], t[0], m, ((n < 0) ? - (sp_digit)1 : (sp_digit)0) - 1); - XMEMCPY(r, t[0], sizeof(t[0])); + (sp_digit)1 : (sp_digit)0) - 1); + XMEMCPY(r, t[0], sizeof(*r) * 78 * 2); } #ifdef WOLFSSL_SMALL_STACK @@ -11078,22 +11217,22 @@ static int sp_4096_mod_exp_78(sp_digit* r, const sp_digit* a, const sp_digit* e, return err; #else -#ifndef WOLFSSL_SMALL_STACK - sp_digit td[32][156]; -#else +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[(32 * 156) + 156]; #endif sp_digit* t[32]; + sp_digit* rt; sp_digit* norm; - sp_digit rt[156]; sp_digit mp = 1; sp_digit n; int i; int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK - td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32 * 156, NULL, +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * ((32 * 156) + 156), NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; @@ -11101,9 +11240,16 @@ static int sp_4096_mod_exp_78(sp_digit* r, const sp_digit* a, const sp_digit* e, #endif if (err == MP_OKAY) { + norm = td; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) for (i=0; i<32; i++) t[i] = td + i * 156; - norm = t[0]; + rt = td + 4992; +#else + for (i=0; i<32; i++) + t[i] = &td[i * 156]; + rt = &td[4992]; +#endif sp_4096_mont_setup(m, &mp); sp_4096_mont_norm_78(norm, m); @@ -11173,7 +11319,7 @@ static int sp_4096_mod_exp_78(sp_digit* r, const sp_digit* a, const sp_digit* e, y = (n >> 59) & 0x1f; n <<= 5; c -= 5; - XMEMCPY(rt, t[y], sizeof(rt)); + XMEMCPY(rt, t[y], sizeof(sp_digit) * 156); for (; i>=0 || c>=5; ) { if (c < 5) { n |= e[i--] << (11 - c); @@ -11196,10 +11342,10 @@ static int sp_4096_mod_exp_78(sp_digit* r, const sp_digit* a, const sp_digit* e, n = sp_4096_cmp_78(rt, m); sp_4096_cond_sub_78(rt, rt, m, ((n < 0) ? (sp_digit)1 : (sp_digit)0) - 1); - XMEMCPY(r, rt, sizeof(rt)); + XMEMCPY(r, rt, sizeof(sp_digit) * 156); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } @@ -12103,11 +12249,10 @@ SP_NOINLINE static void sp_4096_lshift_78(sp_digit* r, sp_digit* a, byte n) */ static int sp_4096_mod_exp_2_78(sp_digit* r, const sp_digit* e, int bits, const sp_digit* m) { -#ifndef WOLFSSL_SMALL_STACK - sp_digit nd[156]; - sp_digit td[79]; -#else +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[235]; #endif sp_digit* norm; sp_digit* tmp; @@ -12117,7 +12262,7 @@ static int sp_4096_mod_exp_2_78(sp_digit* r, const sp_digit* e, int bits, const int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 235, NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { @@ -12126,13 +12271,12 @@ static int sp_4096_mod_exp_2_78(sp_digit* r, const sp_digit* e, int bits, const #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK norm = td; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) tmp = td + 156; XMEMSET(td, 0, sizeof(sp_digit) * 235); #else - norm = nd; - tmp = td; + tmp = &td[156]; XMEMSET(td, 0, sizeof(td)); #endif @@ -12192,7 +12336,7 @@ static int sp_4096_mod_exp_2_78(sp_digit* r, const sp_digit* e, int bits, const (sp_digit)1 : (sp_digit)0) - 1); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } diff --git a/wolfcrypt/src/sp_cortexm.c b/wolfcrypt/src/sp_cortexm.c index 6d8ebf0cc..ec2a5003b 100644 --- a/wolfcrypt/src/sp_cortexm.c +++ b/wolfcrypt/src/sp_cortexm.c @@ -3023,12 +3023,12 @@ static WC_INLINE int sp_2048_mod_32(sp_digit* r, const sp_digit* a, const sp_dig static int sp_2048_mod_exp_32(sp_digit* r, const sp_digit* a, const sp_digit* e, int bits, const sp_digit* m, int reduceA) { -#ifndef WOLFSSL_SMALL_STACK - sp_digit t[16][64]; -#else - sp_digit* t[16]; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[16 * 64]; #endif + sp_digit* t[16]; sp_digit* norm; sp_digit mp = 1; sp_digit n; @@ -3037,8 +3037,8 @@ static int sp_2048_mod_exp_32(sp_digit* r, const sp_digit* a, const sp_digit* e, int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK - td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 16 * 64, NULL, +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (16 * 64), NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; @@ -3046,12 +3046,14 @@ static int sp_2048_mod_exp_32(sp_digit* r, const sp_digit* a, const sp_digit* e, #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK + norm = td; for (i=0; i<16; i++) { +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) t[i] = td + i * 64; - } +#else + t[i] = &td[i * 64]; #endif - norm = t[0]; + } sp_2048_mont_setup(m, &mp); sp_2048_mont_norm_32(norm, m); @@ -3134,7 +3136,7 @@ static int sp_2048_mod_exp_32(sp_digit* r, const sp_digit* a, const sp_digit* e, sp_2048_cond_sub_32(r, r, m, mask); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } @@ -3155,12 +3157,12 @@ static int sp_2048_mod_exp_32(sp_digit* r, const sp_digit* a, const sp_digit* e, static int sp_2048_mod_exp_32(sp_digit* r, const sp_digit* a, const sp_digit* e, int bits, const sp_digit* m, int reduceA) { -#ifndef WOLFSSL_SMALL_STACK - sp_digit t[32][64]; -#else - sp_digit* t[32]; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[32 * 64]; #endif + sp_digit* t[32]; sp_digit* norm; sp_digit mp = 1; sp_digit n; @@ -3169,8 +3171,8 @@ static int sp_2048_mod_exp_32(sp_digit* r, const sp_digit* a, const sp_digit* e, int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK - td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32 * 64, NULL, +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (32 * 64), NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; @@ -3178,12 +3180,14 @@ static int sp_2048_mod_exp_32(sp_digit* r, const sp_digit* a, const sp_digit* e, #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK + norm = td; for (i=0; i<32; i++) { +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) t[i] = td + i * 64; - } +#else + t[i] = &td[i * 64]; #endif - norm = t[0]; + } sp_2048_mont_setup(m, &mp); sp_2048_mont_norm_32(norm, m); @@ -3283,7 +3287,7 @@ static int sp_2048_mod_exp_32(sp_digit* r, const sp_digit* a, const sp_digit* e, sp_2048_cond_sub_32(r, r, m, mask); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } @@ -3714,12 +3718,12 @@ static WC_INLINE int sp_2048_mod_64_cond(sp_digit* r, const sp_digit* a, const s static int sp_2048_mod_exp_64(sp_digit* r, const sp_digit* a, const sp_digit* e, int bits, const sp_digit* m, int reduceA) { -#ifndef WOLFSSL_SMALL_STACK - sp_digit t[16][128]; -#else - sp_digit* t[16]; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[16 * 128]; #endif + sp_digit* t[16]; sp_digit* norm; sp_digit mp = 1; sp_digit n; @@ -3728,8 +3732,8 @@ static int sp_2048_mod_exp_64(sp_digit* r, const sp_digit* a, const sp_digit* e, int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK - td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 16 * 128, NULL, +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (16 * 128), NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; @@ -3737,12 +3741,14 @@ static int sp_2048_mod_exp_64(sp_digit* r, const sp_digit* a, const sp_digit* e, #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK + norm = td; for (i=0; i<16; i++) { +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) t[i] = td + i * 128; - } +#else + t[i] = &td[i * 128]; #endif - norm = t[0]; + } sp_2048_mont_setup(m, &mp); sp_2048_mont_norm_64(norm, m); @@ -3825,7 +3831,7 @@ static int sp_2048_mod_exp_64(sp_digit* r, const sp_digit* a, const sp_digit* e, sp_2048_cond_sub_64(r, r, m, mask); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } @@ -3846,12 +3852,12 @@ static int sp_2048_mod_exp_64(sp_digit* r, const sp_digit* a, const sp_digit* e, static int sp_2048_mod_exp_64(sp_digit* r, const sp_digit* a, const sp_digit* e, int bits, const sp_digit* m, int reduceA) { -#ifndef WOLFSSL_SMALL_STACK - sp_digit t[32][128]; -#else - sp_digit* t[32]; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[32 * 128]; #endif + sp_digit* t[32]; sp_digit* norm; sp_digit mp = 1; sp_digit n; @@ -3860,8 +3866,8 @@ static int sp_2048_mod_exp_64(sp_digit* r, const sp_digit* a, const sp_digit* e, int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK - td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32 * 128, NULL, +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (32 * 128), NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; @@ -3869,12 +3875,14 @@ static int sp_2048_mod_exp_64(sp_digit* r, const sp_digit* a, const sp_digit* e, #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK + norm = td; for (i=0; i<32; i++) { +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) t[i] = td + i * 128; - } +#else + t[i] = &td[i * 128]; #endif - norm = t[0]; + } sp_2048_mont_setup(m, &mp); sp_2048_mont_norm_64(norm, m); @@ -3974,7 +3982,7 @@ static int sp_2048_mod_exp_64(sp_digit* r, const sp_digit* a, const sp_digit* e, sp_2048_cond_sub_64(r, r, m, mask); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } @@ -4864,11 +4872,10 @@ static void sp_2048_lshift_64(sp_digit* r, sp_digit* a, byte n) static int sp_2048_mod_exp_2_64(sp_digit* r, const sp_digit* e, int bits, const sp_digit* m) { -#ifndef WOLFSSL_SMALL_STACK - sp_digit nd[128]; - sp_digit td[65]; -#else +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[193]; #endif sp_digit* norm; sp_digit* tmp; @@ -4879,7 +4886,7 @@ static int sp_2048_mod_exp_2_64(sp_digit* r, const sp_digit* e, int bits, int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 193, NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { @@ -4888,12 +4895,11 @@ static int sp_2048_mod_exp_2_64(sp_digit* r, const sp_digit* e, int bits, #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK norm = td; - tmp = td + 128; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + tmp = td + 128; #else - norm = nd; - tmp = td; + tmp = &td[128]; #endif sp_2048_mont_setup(m, &mp); @@ -4953,7 +4959,7 @@ static int sp_2048_mod_exp_2_64(sp_digit* r, const sp_digit* e, int bits, sp_2048_cond_sub_64(r, r, m, mask); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } @@ -7669,12 +7675,12 @@ static WC_INLINE int sp_3072_mod_48(sp_digit* r, const sp_digit* a, const sp_dig static int sp_3072_mod_exp_48(sp_digit* r, const sp_digit* a, const sp_digit* e, int bits, const sp_digit* m, int reduceA) { -#ifndef WOLFSSL_SMALL_STACK - sp_digit t[16][96]; -#else - sp_digit* t[16]; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[16 * 96]; #endif + sp_digit* t[16]; sp_digit* norm; sp_digit mp = 1; sp_digit n; @@ -7683,8 +7689,8 @@ static int sp_3072_mod_exp_48(sp_digit* r, const sp_digit* a, const sp_digit* e, int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK - td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 16 * 96, NULL, +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (16 * 96), NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; @@ -7692,12 +7698,14 @@ static int sp_3072_mod_exp_48(sp_digit* r, const sp_digit* a, const sp_digit* e, #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK + norm = td; for (i=0; i<16; i++) { +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) t[i] = td + i * 96; - } +#else + t[i] = &td[i * 96]; #endif - norm = t[0]; + } sp_3072_mont_setup(m, &mp); sp_3072_mont_norm_48(norm, m); @@ -7780,7 +7788,7 @@ static int sp_3072_mod_exp_48(sp_digit* r, const sp_digit* a, const sp_digit* e, sp_3072_cond_sub_48(r, r, m, mask); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } @@ -7801,12 +7809,12 @@ static int sp_3072_mod_exp_48(sp_digit* r, const sp_digit* a, const sp_digit* e, static int sp_3072_mod_exp_48(sp_digit* r, const sp_digit* a, const sp_digit* e, int bits, const sp_digit* m, int reduceA) { -#ifndef WOLFSSL_SMALL_STACK - sp_digit t[32][96]; -#else - sp_digit* t[32]; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[32 * 96]; #endif + sp_digit* t[32]; sp_digit* norm; sp_digit mp = 1; sp_digit n; @@ -7815,8 +7823,8 @@ static int sp_3072_mod_exp_48(sp_digit* r, const sp_digit* a, const sp_digit* e, int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK - td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32 * 96, NULL, +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (32 * 96), NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; @@ -7824,12 +7832,14 @@ static int sp_3072_mod_exp_48(sp_digit* r, const sp_digit* a, const sp_digit* e, #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK + norm = td; for (i=0; i<32; i++) { +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) t[i] = td + i * 96; - } +#else + t[i] = &td[i * 96]; #endif - norm = t[0]; + } sp_3072_mont_setup(m, &mp); sp_3072_mont_norm_48(norm, m); @@ -7929,7 +7939,7 @@ static int sp_3072_mod_exp_48(sp_digit* r, const sp_digit* a, const sp_digit* e, sp_3072_cond_sub_48(r, r, m, mask); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } @@ -8363,12 +8373,12 @@ static WC_INLINE int sp_3072_mod_96_cond(sp_digit* r, const sp_digit* a, const s static int sp_3072_mod_exp_96(sp_digit* r, const sp_digit* a, const sp_digit* e, int bits, const sp_digit* m, int reduceA) { -#ifndef WOLFSSL_SMALL_STACK - sp_digit t[16][192]; -#else - sp_digit* t[16]; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[16 * 192]; #endif + sp_digit* t[16]; sp_digit* norm; sp_digit mp = 1; sp_digit n; @@ -8377,8 +8387,8 @@ static int sp_3072_mod_exp_96(sp_digit* r, const sp_digit* a, const sp_digit* e, int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK - td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 16 * 192, NULL, +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (16 * 192), NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; @@ -8386,12 +8396,14 @@ static int sp_3072_mod_exp_96(sp_digit* r, const sp_digit* a, const sp_digit* e, #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK + norm = td; for (i=0; i<16; i++) { +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) t[i] = td + i * 192; - } +#else + t[i] = &td[i * 192]; #endif - norm = t[0]; + } sp_3072_mont_setup(m, &mp); sp_3072_mont_norm_96(norm, m); @@ -8474,7 +8486,7 @@ static int sp_3072_mod_exp_96(sp_digit* r, const sp_digit* a, const sp_digit* e, sp_3072_cond_sub_96(r, r, m, mask); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } @@ -8495,12 +8507,12 @@ static int sp_3072_mod_exp_96(sp_digit* r, const sp_digit* a, const sp_digit* e, static int sp_3072_mod_exp_96(sp_digit* r, const sp_digit* a, const sp_digit* e, int bits, const sp_digit* m, int reduceA) { -#ifndef WOLFSSL_SMALL_STACK - sp_digit t[32][192]; -#else - sp_digit* t[32]; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[32 * 192]; #endif + sp_digit* t[32]; sp_digit* norm; sp_digit mp = 1; sp_digit n; @@ -8509,8 +8521,8 @@ static int sp_3072_mod_exp_96(sp_digit* r, const sp_digit* a, const sp_digit* e, int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK - td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32 * 192, NULL, +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (32 * 192), NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; @@ -8518,12 +8530,14 @@ static int sp_3072_mod_exp_96(sp_digit* r, const sp_digit* a, const sp_digit* e, #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK + norm = td; for (i=0; i<32; i++) { +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) t[i] = td + i * 192; - } +#else + t[i] = &td[i * 192]; #endif - norm = t[0]; + } sp_3072_mont_setup(m, &mp); sp_3072_mont_norm_96(norm, m); @@ -8623,7 +8637,7 @@ static int sp_3072_mod_exp_96(sp_digit* r, const sp_digit* a, const sp_digit* e, sp_3072_cond_sub_96(r, r, m, mask); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } @@ -9709,11 +9723,10 @@ static void sp_3072_lshift_96(sp_digit* r, sp_digit* a, byte n) static int sp_3072_mod_exp_2_96(sp_digit* r, const sp_digit* e, int bits, const sp_digit* m) { -#ifndef WOLFSSL_SMALL_STACK - sp_digit nd[192]; - sp_digit td[97]; -#else +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[289]; #endif sp_digit* norm; sp_digit* tmp; @@ -9724,7 +9737,7 @@ static int sp_3072_mod_exp_2_96(sp_digit* r, const sp_digit* e, int bits, int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 289, NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { @@ -9733,12 +9746,11 @@ static int sp_3072_mod_exp_2_96(sp_digit* r, const sp_digit* e, int bits, #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK norm = td; - tmp = td + 192; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + tmp = td + 192; #else - norm = nd; - tmp = td; + tmp = &td[192]; #endif sp_3072_mont_setup(m, &mp); @@ -9798,7 +9810,7 @@ static int sp_3072_mod_exp_2_96(sp_digit* r, const sp_digit* e, int bits, sp_3072_cond_sub_96(r, r, m, mask); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } @@ -11958,12 +11970,12 @@ static WC_INLINE int sp_4096_mod_128_cond(sp_digit* r, const sp_digit* a, const static int sp_4096_mod_exp_128(sp_digit* r, const sp_digit* a, const sp_digit* e, int bits, const sp_digit* m, int reduceA) { -#ifndef WOLFSSL_SMALL_STACK - sp_digit t[16][256]; -#else - sp_digit* t[16]; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[16 * 256]; #endif + sp_digit* t[16]; sp_digit* norm; sp_digit mp = 1; sp_digit n; @@ -11972,8 +11984,8 @@ static int sp_4096_mod_exp_128(sp_digit* r, const sp_digit* a, const sp_digit* e int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK - td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 16 * 256, NULL, +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (16 * 256), NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; @@ -11981,12 +11993,14 @@ static int sp_4096_mod_exp_128(sp_digit* r, const sp_digit* a, const sp_digit* e #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK + norm = td; for (i=0; i<16; i++) { +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) t[i] = td + i * 256; - } +#else + t[i] = &td[i * 256]; #endif - norm = t[0]; + } sp_4096_mont_setup(m, &mp); sp_4096_mont_norm_128(norm, m); @@ -12069,7 +12083,7 @@ static int sp_4096_mod_exp_128(sp_digit* r, const sp_digit* a, const sp_digit* e sp_4096_cond_sub_128(r, r, m, mask); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } @@ -12090,12 +12104,12 @@ static int sp_4096_mod_exp_128(sp_digit* r, const sp_digit* a, const sp_digit* e static int sp_4096_mod_exp_128(sp_digit* r, const sp_digit* a, const sp_digit* e, int bits, const sp_digit* m, int reduceA) { -#ifndef WOLFSSL_SMALL_STACK - sp_digit t[32][256]; -#else - sp_digit* t[32]; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[32 * 256]; #endif + sp_digit* t[32]; sp_digit* norm; sp_digit mp = 1; sp_digit n; @@ -12104,8 +12118,8 @@ static int sp_4096_mod_exp_128(sp_digit* r, const sp_digit* a, const sp_digit* e int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK - td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32 * 256, NULL, +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (32 * 256), NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; @@ -12113,12 +12127,14 @@ static int sp_4096_mod_exp_128(sp_digit* r, const sp_digit* a, const sp_digit* e #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK + norm = td; for (i=0; i<32; i++) { +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) t[i] = td + i * 256; - } +#else + t[i] = &td[i * 256]; #endif - norm = t[0]; + } sp_4096_mont_setup(m, &mp); sp_4096_mont_norm_128(norm, m); @@ -12218,7 +12234,7 @@ static int sp_4096_mod_exp_128(sp_digit* r, const sp_digit* a, const sp_digit* e sp_4096_cond_sub_128(r, r, m, mask); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } @@ -13501,11 +13517,10 @@ static void sp_4096_lshift_128(sp_digit* r, sp_digit* a, byte n) static int sp_4096_mod_exp_2_128(sp_digit* r, const sp_digit* e, int bits, const sp_digit* m) { -#ifndef WOLFSSL_SMALL_STACK - sp_digit nd[256]; - sp_digit td[129]; -#else +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[385]; #endif sp_digit* norm; sp_digit* tmp; @@ -13516,7 +13531,7 @@ static int sp_4096_mod_exp_2_128(sp_digit* r, const sp_digit* e, int bits, int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 385, NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { @@ -13525,12 +13540,11 @@ static int sp_4096_mod_exp_2_128(sp_digit* r, const sp_digit* e, int bits, #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK norm = td; - tmp = td + 256; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + tmp = td + 256; #else - norm = nd; - tmp = td; + tmp = &td[256]; #endif sp_4096_mont_setup(m, &mp); @@ -13590,7 +13604,7 @@ static int sp_4096_mod_exp_2_128(sp_digit* r, const sp_digit* e, int bits, sp_4096_cond_sub_128(r, r, m, mask); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) { XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); } diff --git a/wolfcrypt/src/sp_int.c b/wolfcrypt/src/sp_int.c index 36f1165db..88ba48c1c 100644 --- a/wolfcrypt/src/sp_int.c +++ b/wolfcrypt/src/sp_int.c @@ -41,8 +41,9 @@ * WOLFSSL_SP_MATH: Use only single precision math and algorithms it supports (no fastmath tfm.c or normal integer.c) * WOLFSSL_SP_SMALL: Use smaller version of code and avoid large stack variables * WOLFSSL_SP_NO_MALLOC: Always use stack, no heap XMALLOC/XFREE allowed - * WOLFSSL_SP_NO_3072: Disable RSA/DH 3072-bit support * WOLFSSL_SP_NO_2048: Disable RSA/DH 2048-bit support + * WOLFSSL_SP_NO_3072: Disable RSA/DH 3072-bit support + * WOLFSSL_SP_NO_4096: Disable RSA/DH 4096-bit support * WOLFSSL_SP_4096: Enable RSA/RH 4096-bit support * WOLFSSL_SP_384 Enable ECC 384-bit SECP384R1 support * WOLFSSL_SP_NO_256 Disable ECC 256-bit SECP256R1 support diff --git a/wolfcrypt/src/sp_x86_64.c b/wolfcrypt/src/sp_x86_64.c index f94612136..b3af97702 100644 --- a/wolfcrypt/src/sp_x86_64.c +++ b/wolfcrypt/src/sp_x86_64.c @@ -399,14 +399,13 @@ static WC_INLINE int sp_2048_mod_16(sp_digit* r, const sp_digit* a, const sp_dig static int sp_2048_mod_exp_16(sp_digit* r, const sp_digit* a, const sp_digit* e, int bits, const sp_digit* m, int reduceA) { -#ifndef WOLFSSL_SMALL_STACK - sp_digit t[32][32]; - sp_digit rt[32]; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + sp_digit* td; #else + sp_digit td[(33 * 32) + 32]; +#endif sp_digit* t[32]; sp_digit* rt; - sp_digit* td; -#endif sp_digit* norm; sp_digit mp = 1; sp_digit n; @@ -415,8 +414,8 @@ static int sp_2048_mod_exp_16(sp_digit* r, const sp_digit* a, const sp_digit* e, int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK - td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 33 * 32, NULL, +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (33 * 32) + 32, NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; @@ -424,12 +423,16 @@ static int sp_2048_mod_exp_16(sp_digit* r, const sp_digit* a, const sp_digit* e, #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK + norm = td; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) for (i=0; i<32; i++) t[i] = td + i * 32; rt = td + 1024; +#else + for (i=0; i<32; i++) + t[i] = &td[i * 32]; + rt = &td[1024]; #endif - norm = t[0]; sp_2048_mont_setup(m, &mp); sp_2048_mont_norm_16(norm, m); @@ -536,7 +539,7 @@ static int sp_2048_mod_exp_16(sp_digit* r, const sp_digit* a, const sp_digit* e, sp_2048_cond_sub_16(r, r, m, mask); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); #endif @@ -592,14 +595,13 @@ static void sp_2048_mont_sqr_avx2_16(sp_digit* r, const sp_digit* a, const sp_di static int sp_2048_mod_exp_avx2_16(sp_digit* r, const sp_digit* a, const sp_digit* e, int bits, const sp_digit* m, int reduceA) { -#ifndef WOLFSSL_SMALL_STACK - sp_digit t[32][32]; - sp_digit rt[32]; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + sp_digit* td; #else + sp_digit td[(33 * 32) + 32]; +#endif sp_digit* t[32]; sp_digit* rt; - sp_digit* td; -#endif sp_digit* norm; sp_digit mp = 1; sp_digit n; @@ -608,8 +610,8 @@ static int sp_2048_mod_exp_avx2_16(sp_digit* r, const sp_digit* a, const sp_digi int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK - td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 33 * 32, NULL, +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (33 * 32) + 32, NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; @@ -617,12 +619,16 @@ static int sp_2048_mod_exp_avx2_16(sp_digit* r, const sp_digit* a, const sp_digi #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK + norm = td; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) for (i=0; i<32; i++) t[i] = td + i * 32; rt = td + 1024; +#else + for (i=0; i<32; i++) + t[i] = &td[i * 32]; + rt = &td[1024]; #endif - norm = t[0]; sp_2048_mont_setup(m, &mp); sp_2048_mont_norm_16(norm, m); @@ -729,7 +735,7 @@ static int sp_2048_mod_exp_avx2_16(sp_digit* r, const sp_digit* a, const sp_digi sp_2048_cond_sub_avx2_16(r, r, m, mask); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); #endif @@ -1000,14 +1006,13 @@ static WC_INLINE int sp_2048_mod_32_cond(sp_digit* r, const sp_digit* a, const s static int sp_2048_mod_exp_32(sp_digit* r, const sp_digit* a, const sp_digit* e, int bits, const sp_digit* m, int reduceA) { -#ifndef WOLFSSL_SMALL_STACK - sp_digit t[32][64]; - sp_digit rt[64]; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + sp_digit* td; #else + sp_digit td[(33 * 64) + 64]; +#endif sp_digit* t[32]; sp_digit* rt; - sp_digit* td; -#endif sp_digit* norm; sp_digit mp = 1; sp_digit n; @@ -1016,8 +1021,8 @@ static int sp_2048_mod_exp_32(sp_digit* r, const sp_digit* a, const sp_digit* e, int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK - td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 33 * 64, NULL, +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (33 * 64) + 64, NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; @@ -1025,12 +1030,16 @@ static int sp_2048_mod_exp_32(sp_digit* r, const sp_digit* a, const sp_digit* e, #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK + norm = td; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) for (i=0; i<32; i++) t[i] = td + i * 64; rt = td + 2048; +#else + for (i=0; i<32; i++) + t[i] = &td[i * 64]; + rt = &td[2048]; #endif - norm = t[0]; sp_2048_mont_setup(m, &mp); sp_2048_mont_norm_32(norm, m); @@ -1137,7 +1146,7 @@ static int sp_2048_mod_exp_32(sp_digit* r, const sp_digit* a, const sp_digit* e, sp_2048_cond_sub_32(r, r, m, mask); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); #endif @@ -1195,14 +1204,13 @@ static void sp_2048_mont_sqr_avx2_32(sp_digit* r, const sp_digit* a, const sp_di static int sp_2048_mod_exp_avx2_32(sp_digit* r, const sp_digit* a, const sp_digit* e, int bits, const sp_digit* m, int reduceA) { -#ifndef WOLFSSL_SMALL_STACK - sp_digit t[32][64]; - sp_digit rt[64]; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + sp_digit* td; #else + sp_digit td[(33 * 64) + 64]; +#endif sp_digit* t[32]; sp_digit* rt; - sp_digit* td; -#endif sp_digit* norm; sp_digit mp = 1; sp_digit n; @@ -1211,8 +1219,8 @@ static int sp_2048_mod_exp_avx2_32(sp_digit* r, const sp_digit* a, const sp_digi int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK - td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 33 * 64, NULL, +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (33 * 64) + 64, NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; @@ -1220,12 +1228,16 @@ static int sp_2048_mod_exp_avx2_32(sp_digit* r, const sp_digit* a, const sp_digi #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK + norm = td; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) for (i=0; i<32; i++) t[i] = td + i * 64; rt = td + 2048; +#else + for (i=0; i<32; i++) + t[i] = &td[i * 64]; + rt = &td[2048]; #endif - norm = t[0]; sp_2048_mont_setup(m, &mp); sp_2048_mont_norm_32(norm, m); @@ -1332,7 +1344,7 @@ static int sp_2048_mod_exp_avx2_32(sp_digit* r, const sp_digit* a, const sp_digi sp_2048_cond_sub_avx2_32(r, r, m, mask); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); #endif @@ -1889,11 +1901,10 @@ extern void sp_2048_lshift_32(sp_digit* r, const sp_digit* a, int n); static int sp_2048_mod_exp_2_avx2_32(sp_digit* r, const sp_digit* e, int bits, const sp_digit* m) { -#ifndef WOLFSSL_SMALL_STACK - sp_digit nd[64]; - sp_digit td[33]; -#else +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[33 + 64]; #endif sp_digit* norm; sp_digit* tmp; @@ -1904,8 +1915,8 @@ static int sp_2048_mod_exp_2_avx2_32(sp_digit* r, const sp_digit* e, int bits, int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK - td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 97, NULL, +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (33 + 64), NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; @@ -1913,12 +1924,11 @@ static int sp_2048_mod_exp_2_avx2_32(sp_digit* r, const sp_digit* e, int bits, #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK norm = td; - tmp = td + 64; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + tmp = td + 64; #else - norm = nd; - tmp = td; + tmp = &td[64]; #endif sp_2048_mont_setup(m, &mp); @@ -1981,7 +1991,7 @@ static int sp_2048_mod_exp_2_avx2_32(sp_digit* r, const sp_digit* e, int bits, sp_2048_cond_sub_avx2_32(r, r, m, mask); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); #endif @@ -2001,11 +2011,10 @@ static int sp_2048_mod_exp_2_avx2_32(sp_digit* r, const sp_digit* e, int bits, static int sp_2048_mod_exp_2_32(sp_digit* r, const sp_digit* e, int bits, const sp_digit* m) { -#ifndef WOLFSSL_SMALL_STACK - sp_digit nd[64]; - sp_digit td[33]; -#else +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[33 + 64]; #endif sp_digit* norm; sp_digit* tmp; @@ -2016,8 +2025,8 @@ static int sp_2048_mod_exp_2_32(sp_digit* r, const sp_digit* e, int bits, int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK - td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 97, NULL, +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (33 + 64), NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; @@ -2025,12 +2034,11 @@ static int sp_2048_mod_exp_2_32(sp_digit* r, const sp_digit* e, int bits, #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK norm = td; - tmp = td + 64; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + tmp = td + 64; #else - norm = nd; - tmp = td; + tmp = &td[64]; #endif sp_2048_mont_setup(m, &mp); @@ -2093,7 +2101,7 @@ static int sp_2048_mod_exp_2_32(sp_digit* r, const sp_digit* e, int bits, sp_2048_cond_sub_32(r, r, m, mask); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); #endif @@ -2587,14 +2595,13 @@ static WC_INLINE int sp_3072_mod_24(sp_digit* r, const sp_digit* a, const sp_dig static int sp_3072_mod_exp_24(sp_digit* r, const sp_digit* a, const sp_digit* e, int bits, const sp_digit* m, int reduceA) { -#ifndef WOLFSSL_SMALL_STACK - sp_digit t[32][48]; - sp_digit rt[48]; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + sp_digit* td; #else + sp_digit td[(33 * 48) + 48]; +#endif sp_digit* t[32]; sp_digit* rt; - sp_digit* td; -#endif sp_digit* norm; sp_digit mp = 1; sp_digit n; @@ -2603,8 +2610,8 @@ static int sp_3072_mod_exp_24(sp_digit* r, const sp_digit* a, const sp_digit* e, int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK - td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 33 * 48, NULL, +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (33 * 48) + 48, NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; @@ -2612,12 +2619,16 @@ static int sp_3072_mod_exp_24(sp_digit* r, const sp_digit* a, const sp_digit* e, #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK + norm = td; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) for (i=0; i<32; i++) t[i] = td + i * 48; rt = td + 1536; +#else + for (i=0; i<32; i++) + t[i] = &td[i * 48]; + rt = &td[1536]; #endif - norm = t[0]; sp_3072_mont_setup(m, &mp); sp_3072_mont_norm_24(norm, m); @@ -2724,7 +2735,7 @@ static int sp_3072_mod_exp_24(sp_digit* r, const sp_digit* a, const sp_digit* e, sp_3072_cond_sub_24(r, r, m, mask); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); #endif @@ -2780,14 +2791,13 @@ static void sp_3072_mont_sqr_avx2_24(sp_digit* r, const sp_digit* a, const sp_di static int sp_3072_mod_exp_avx2_24(sp_digit* r, const sp_digit* a, const sp_digit* e, int bits, const sp_digit* m, int reduceA) { -#ifndef WOLFSSL_SMALL_STACK - sp_digit t[32][48]; - sp_digit rt[48]; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + sp_digit* td; #else + sp_digit td[(33 * 48) + 48]; +#endif sp_digit* t[32]; sp_digit* rt; - sp_digit* td; -#endif sp_digit* norm; sp_digit mp = 1; sp_digit n; @@ -2796,8 +2806,8 @@ static int sp_3072_mod_exp_avx2_24(sp_digit* r, const sp_digit* a, const sp_digi int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK - td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 33 * 48, NULL, +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (33 * 48) + 48, NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; @@ -2805,12 +2815,16 @@ static int sp_3072_mod_exp_avx2_24(sp_digit* r, const sp_digit* a, const sp_digi #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK + norm = td; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) for (i=0; i<32; i++) t[i] = td + i * 48; rt = td + 1536; +#else + for (i=0; i<32; i++) + t[i] = &td[i * 48]; + rt = &td[1536]; #endif - norm = t[0]; sp_3072_mont_setup(m, &mp); sp_3072_mont_norm_24(norm, m); @@ -2917,7 +2931,7 @@ static int sp_3072_mod_exp_avx2_24(sp_digit* r, const sp_digit* a, const sp_digi sp_3072_cond_sub_avx2_24(r, r, m, mask); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); #endif @@ -3188,14 +3202,13 @@ static WC_INLINE int sp_3072_mod_48_cond(sp_digit* r, const sp_digit* a, const s static int sp_3072_mod_exp_48(sp_digit* r, const sp_digit* a, const sp_digit* e, int bits, const sp_digit* m, int reduceA) { -#ifndef WOLFSSL_SMALL_STACK - sp_digit t[32][96]; - sp_digit rt[96]; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + sp_digit* td; #else + sp_digit td[(33 * 96) + 96]; +#endif sp_digit* t[32]; sp_digit* rt; - sp_digit* td; -#endif sp_digit* norm; sp_digit mp = 1; sp_digit n; @@ -3204,8 +3217,8 @@ static int sp_3072_mod_exp_48(sp_digit* r, const sp_digit* a, const sp_digit* e, int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK - td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 33 * 96, NULL, +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (33 * 96) + 96, NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; @@ -3213,12 +3226,16 @@ static int sp_3072_mod_exp_48(sp_digit* r, const sp_digit* a, const sp_digit* e, #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK + norm = td; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) for (i=0; i<32; i++) t[i] = td + i * 96; rt = td + 3072; +#else + for (i=0; i<32; i++) + t[i] = &td[i * 96]; + rt = &td[3072]; #endif - norm = t[0]; sp_3072_mont_setup(m, &mp); sp_3072_mont_norm_48(norm, m); @@ -3325,7 +3342,7 @@ static int sp_3072_mod_exp_48(sp_digit* r, const sp_digit* a, const sp_digit* e, sp_3072_cond_sub_48(r, r, m, mask); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); #endif @@ -3383,14 +3400,13 @@ static void sp_3072_mont_sqr_avx2_48(sp_digit* r, const sp_digit* a, const sp_di static int sp_3072_mod_exp_avx2_48(sp_digit* r, const sp_digit* a, const sp_digit* e, int bits, const sp_digit* m, int reduceA) { -#ifndef WOLFSSL_SMALL_STACK - sp_digit t[32][96]; - sp_digit rt[96]; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + sp_digit* td; #else + sp_digit td[(33 * 96) + 96]; +#endif sp_digit* t[32]; sp_digit* rt; - sp_digit* td; -#endif sp_digit* norm; sp_digit mp = 1; sp_digit n; @@ -3399,8 +3415,8 @@ static int sp_3072_mod_exp_avx2_48(sp_digit* r, const sp_digit* a, const sp_digi int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK - td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 33 * 96, NULL, +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (33 * 96) + 96, NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; @@ -3408,12 +3424,16 @@ static int sp_3072_mod_exp_avx2_48(sp_digit* r, const sp_digit* a, const sp_digi #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK + norm = td; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) for (i=0; i<32; i++) t[i] = td + i * 96; rt = td + 3072; +#else + for (i=0; i<32; i++) + t[i] = &td[i * 96]; + rt = &td[3072]; #endif - norm = t[0]; sp_3072_mont_setup(m, &mp); sp_3072_mont_norm_48(norm, m); @@ -3520,7 +3540,7 @@ static int sp_3072_mod_exp_avx2_48(sp_digit* r, const sp_digit* a, const sp_digi sp_3072_cond_sub_avx2_48(r, r, m, mask); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); #endif @@ -4077,11 +4097,10 @@ extern void sp_3072_lshift_48(sp_digit* r, const sp_digit* a, int n); static int sp_3072_mod_exp_2_avx2_48(sp_digit* r, const sp_digit* e, int bits, const sp_digit* m) { -#ifndef WOLFSSL_SMALL_STACK - sp_digit nd[96]; - sp_digit td[49]; -#else +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[49 + 96]; #endif sp_digit* norm; sp_digit* tmp; @@ -4092,8 +4111,8 @@ static int sp_3072_mod_exp_2_avx2_48(sp_digit* r, const sp_digit* e, int bits, int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK - td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 145, NULL, +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (49 + 96), NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; @@ -4101,12 +4120,11 @@ static int sp_3072_mod_exp_2_avx2_48(sp_digit* r, const sp_digit* e, int bits, #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK norm = td; - tmp = td + 96; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + tmp = td + 96; #else - norm = nd; - tmp = td; + tmp = &td[96]; #endif sp_3072_mont_setup(m, &mp); @@ -4169,7 +4187,7 @@ static int sp_3072_mod_exp_2_avx2_48(sp_digit* r, const sp_digit* e, int bits, sp_3072_cond_sub_avx2_48(r, r, m, mask); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); #endif @@ -4189,11 +4207,10 @@ static int sp_3072_mod_exp_2_avx2_48(sp_digit* r, const sp_digit* e, int bits, static int sp_3072_mod_exp_2_48(sp_digit* r, const sp_digit* e, int bits, const sp_digit* m) { -#ifndef WOLFSSL_SMALL_STACK - sp_digit nd[96]; - sp_digit td[49]; -#else +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[49 + 96]; #endif sp_digit* norm; sp_digit* tmp; @@ -4204,8 +4221,8 @@ static int sp_3072_mod_exp_2_48(sp_digit* r, const sp_digit* e, int bits, int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK - td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 145, NULL, +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (49 + 96), NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; @@ -4213,12 +4230,11 @@ static int sp_3072_mod_exp_2_48(sp_digit* r, const sp_digit* e, int bits, #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK norm = td; - tmp = td + 96; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + tmp = td + 96; #else - norm = nd; - tmp = td; + tmp = &td[96]; #endif sp_3072_mont_setup(m, &mp); @@ -4281,7 +4297,7 @@ static int sp_3072_mod_exp_2_48(sp_digit* r, const sp_digit* e, int bits, sp_3072_cond_sub_48(r, r, m, mask); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); #endif @@ -4830,14 +4846,13 @@ static WC_INLINE int sp_4096_mod_64_cond(sp_digit* r, const sp_digit* a, const s static int sp_4096_mod_exp_64(sp_digit* r, const sp_digit* a, const sp_digit* e, int bits, const sp_digit* m, int reduceA) { -#ifndef WOLFSSL_SMALL_STACK - sp_digit t[32][128]; - sp_digit rt[128]; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + sp_digit* td; #else + sp_digit td[(33 * 128) + 128]; +#endif sp_digit* t[32]; sp_digit* rt; - sp_digit* td; -#endif sp_digit* norm; sp_digit mp = 1; sp_digit n; @@ -4846,8 +4861,8 @@ static int sp_4096_mod_exp_64(sp_digit* r, const sp_digit* a, const sp_digit* e, int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK - td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 33 * 128, NULL, +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (33 * 128) + 128, NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; @@ -4855,12 +4870,16 @@ static int sp_4096_mod_exp_64(sp_digit* r, const sp_digit* a, const sp_digit* e, #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK + norm = td; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) for (i=0; i<32; i++) t[i] = td + i * 128; rt = td + 4096; +#else + for (i=0; i<32; i++) + t[i] = &td[i * 128]; + rt = &td[4096]; #endif - norm = t[0]; sp_4096_mont_setup(m, &mp); sp_4096_mont_norm_64(norm, m); @@ -4967,7 +4986,7 @@ static int sp_4096_mod_exp_64(sp_digit* r, const sp_digit* a, const sp_digit* e, sp_4096_cond_sub_64(r, r, m, mask); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); #endif @@ -5025,14 +5044,13 @@ static void sp_4096_mont_sqr_avx2_64(sp_digit* r, const sp_digit* a, const sp_di static int sp_4096_mod_exp_avx2_64(sp_digit* r, const sp_digit* a, const sp_digit* e, int bits, const sp_digit* m, int reduceA) { -#ifndef WOLFSSL_SMALL_STACK - sp_digit t[32][128]; - sp_digit rt[128]; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + sp_digit* td; #else + sp_digit td[(33 * 128) + 128]; +#endif sp_digit* t[32]; sp_digit* rt; - sp_digit* td; -#endif sp_digit* norm; sp_digit mp = 1; sp_digit n; @@ -5041,8 +5059,8 @@ static int sp_4096_mod_exp_avx2_64(sp_digit* r, const sp_digit* a, const sp_digi int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK - td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 33 * 128, NULL, +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (33 * 128) + 128, NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; @@ -5050,12 +5068,16 @@ static int sp_4096_mod_exp_avx2_64(sp_digit* r, const sp_digit* a, const sp_digi #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK + norm = td; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) for (i=0; i<32; i++) t[i] = td + i * 128; rt = td + 4096; +#else + for (i=0; i<32; i++) + t[i] = &td[i * 128]; + rt = &td[4096]; #endif - norm = t[0]; sp_4096_mont_setup(m, &mp); sp_4096_mont_norm_64(norm, m); @@ -5162,7 +5184,7 @@ static int sp_4096_mod_exp_avx2_64(sp_digit* r, const sp_digit* a, const sp_digi sp_4096_cond_sub_avx2_64(r, r, m, mask); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); #endif @@ -5719,11 +5741,10 @@ extern void sp_4096_lshift_64(sp_digit* r, const sp_digit* a, int n); static int sp_4096_mod_exp_2_avx2_64(sp_digit* r, const sp_digit* e, int bits, const sp_digit* m) { -#ifndef WOLFSSL_SMALL_STACK - sp_digit nd[128]; - sp_digit td[65]; -#else +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[65 + 128]; #endif sp_digit* norm; sp_digit* tmp; @@ -5734,8 +5755,8 @@ static int sp_4096_mod_exp_2_avx2_64(sp_digit* r, const sp_digit* e, int bits, int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK - td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 193, NULL, +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (65 + 128), NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; @@ -5743,12 +5764,11 @@ static int sp_4096_mod_exp_2_avx2_64(sp_digit* r, const sp_digit* e, int bits, #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK norm = td; - tmp = td + 128; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + tmp = td + 128; #else - norm = nd; - tmp = td; + tmp = &td[128]; #endif sp_4096_mont_setup(m, &mp); @@ -5811,7 +5831,7 @@ static int sp_4096_mod_exp_2_avx2_64(sp_digit* r, const sp_digit* e, int bits, sp_4096_cond_sub_avx2_64(r, r, m, mask); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); #endif @@ -5831,11 +5851,10 @@ static int sp_4096_mod_exp_2_avx2_64(sp_digit* r, const sp_digit* e, int bits, static int sp_4096_mod_exp_2_64(sp_digit* r, const sp_digit* e, int bits, const sp_digit* m) { -#ifndef WOLFSSL_SMALL_STACK - sp_digit nd[128]; - sp_digit td[65]; -#else +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; +#else + sp_digit td[65 + 128]; #endif sp_digit* norm; sp_digit* tmp; @@ -5846,8 +5865,8 @@ static int sp_4096_mod_exp_2_64(sp_digit* r, const sp_digit* e, int bits, int c, y; int err = MP_OKAY; -#ifdef WOLFSSL_SMALL_STACK - td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 193, NULL, +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (65 + 128), NULL, DYNAMIC_TYPE_TMP_BUFFER); if (td == NULL) { err = MEMORY_E; @@ -5855,12 +5874,11 @@ static int sp_4096_mod_exp_2_64(sp_digit* r, const sp_digit* e, int bits, #endif if (err == MP_OKAY) { -#ifdef WOLFSSL_SMALL_STACK norm = td; - tmp = td + 128; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) + tmp = td + 128; #else - norm = nd; - tmp = td; + tmp = &td[128]; #endif sp_4096_mont_setup(m, &mp); @@ -5923,7 +5941,7 @@ static int sp_4096_mod_exp_2_64(sp_digit* r, const sp_digit* e, int bits, sp_4096_cond_sub_64(r, r, m, mask); } -#ifdef WOLFSSL_SMALL_STACK +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) if (td != NULL) XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); #endif From 8161dfe3aa6ce43ced80a97df34194f779eedc42 Mon Sep 17 00:00:00 2001 From: David Garske Date: Mon, 4 May 2020 15:07:28 -0700 Subject: [PATCH 079/298] Fix for GCC9 warning. ``` src/tls.c:201:13: note: in expansion of macro 'XSTRNCMP' 201 | if (XSTRNCMP((const char*)sender, (const char*)client, SIZEOF_SENDER) == 0) | ^~~~~~~~ In file included from src/tls.c:33: ./wolfssl/internal.h:4312:19: note: referenced argument declared here 4312 | static const byte client[SIZEOF_SENDER] = { 0x43, 0x4C, 0x4E, 0x54 }; | ^~~~~~ ``` --- wolfssl/internal.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wolfssl/internal.h b/wolfssl/internal.h index a60ad2cda..e43949619 100644 --- a/wolfssl/internal.h +++ b/wolfssl/internal.h @@ -4309,8 +4309,8 @@ enum ProvisionSide { }; -static const byte client[SIZEOF_SENDER] = { 0x43, 0x4C, 0x4E, 0x54 }; -static const byte server[SIZEOF_SENDER] = { 0x53, 0x52, 0x56, 0x52 }; +static const byte client[SIZEOF_SENDER+1] = { 0x43, 0x4C, 0x4E, 0x54, 0x00 }; /* CLNT */ +static const byte server[SIZEOF_SENDER+1] = { 0x53, 0x52, 0x56, 0x52, 0x00 }; /* SRVR */ static const byte tls_client[FINISHED_LABEL_SZ + 1] = "client finished"; static const byte tls_server[FINISHED_LABEL_SZ + 1] = "server finished"; From 0f6fef8384d1644d5ab5e32fd57e59fcbe657521 Mon Sep 17 00:00:00 2001 From: Jacob Barthelmeh Date: Tue, 5 May 2020 09:47:05 -0600 Subject: [PATCH 080/298] update armv8 aes gcm sanity checks --- wolfcrypt/src/port/arm/armv8-aes.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/wolfcrypt/src/port/arm/armv8-aes.c b/wolfcrypt/src/port/arm/armv8-aes.c index 8999a6f74..8c3796e18 100644 --- a/wolfcrypt/src/port/arm/armv8-aes.c +++ b/wolfcrypt/src/port/arm/armv8-aes.c @@ -2534,8 +2534,7 @@ int wc_AesGcmEncrypt(Aes* aes, byte* out, const byte* in, word32 sz, if (aes == NULL || (iv == NULL && ivSz > 0) || (authTag == NULL) || (authIn == NULL && authInSz > 0) || - (in == NULL && sz > 0) || - (out == NULL && sz > 0)) { + (ivSz == 0)) { WOLFSSL_MSG("a NULL parameter passed in when size is larger than 0"); return BAD_FUNC_ARG; } @@ -2599,11 +2598,9 @@ int wc_AesGcmDecrypt(Aes* aes, byte* out, const byte* in, word32 sz, ctr = counter ; /* sanity checks */ - if (aes == NULL || (iv == NULL && ivSz > 0) || - (authTag == NULL) || - (authIn == NULL && authInSz > 0) || - (in == NULL && sz > 0) || - (out == NULL && sz > 0)) { + if (aes == NULL || iv == NULL || (sz != 0 && (in == NULL || out == NULL)) || + authTag == NULL || authTagSz > AES_BLOCK_SIZE || authTagSz == 0 || + ivSz == 0) { WOLFSSL_MSG("a NULL parameter passed in when size is larger than 0"); return BAD_FUNC_ARG; } @@ -4199,8 +4196,7 @@ int wc_AesGcmEncrypt(Aes* aes, byte* out, const byte* in, word32 sz, if (aes == NULL || (iv == NULL && ivSz > 0) || (authTag == NULL) || (authIn == NULL && authInSz > 0) || - (in == NULL && sz > 0) || - (out == NULL && sz > 0)) { + (ivSz == 0)) { WOLFSSL_MSG("a NULL parameter passed in when size is larger than 0"); return BAD_FUNC_ARG; } @@ -4280,11 +4276,9 @@ int wc_AesGcmDecrypt(Aes* aes, byte* out, const byte* in, word32 sz, ctr = counter ; /* sanity checks */ - if (aes == NULL || (iv == NULL && ivSz > 0) || - (authTag == NULL) || - (authIn == NULL && authInSz > 0) || - (in == NULL && sz > 0) || - (out == NULL && sz > 0)) { + if (aes == NULL || iv == NULL || (sz != 0 && (in == NULL || out == NULL)) || + authTag == NULL || authTagSz > AES_BLOCK_SIZE || authTagSz == 0 || + ivSz == 0) { WOLFSSL_MSG("a NULL parameter passed in when size is larger than 0"); return BAD_FUNC_ARG; } From 3b6b59cea0933d6d19b08aa8457e7cf83f165741 Mon Sep 17 00:00:00 2001 From: Jacob Barthelmeh Date: Thu, 30 Apr 2020 15:56:50 -0600 Subject: [PATCH 081/298] add 2019.2 Xilinx example and update README fix to remove xml extension add missing project file update project update dist include rm prj files --- IDE/XilinxSDK/{ => 2018_2}/.cproject | 0 IDE/XilinxSDK/{ => 2018_2}/.project | 0 IDE/XilinxSDK/{ => 2018_2}/lscript.ld | 0 .../2019_2/wolfCrypt_example/.cproject | 378 ++++++++ .../2019_2/wolfCrypt_example/.project | 849 ++++++++++++++++++ .../2019_2/wolfCrypt_example/src/lscript.ld | 309 +++++++ .../2019_2/wolfCrypt_example_system/.cproject | 106 +++ .../2019_2/wolfCrypt_example_system/.project | 28 + IDE/XilinxSDK/README.md | 169 ++-- IDE/XilinxSDK/include.am | 11 +- 10 files changed, 1789 insertions(+), 61 deletions(-) rename IDE/XilinxSDK/{ => 2018_2}/.cproject (100%) rename IDE/XilinxSDK/{ => 2018_2}/.project (100%) rename IDE/XilinxSDK/{ => 2018_2}/lscript.ld (100%) create mode 100644 IDE/XilinxSDK/2019_2/wolfCrypt_example/.cproject create mode 100644 IDE/XilinxSDK/2019_2/wolfCrypt_example/.project create mode 100644 IDE/XilinxSDK/2019_2/wolfCrypt_example/src/lscript.ld create mode 100644 IDE/XilinxSDK/2019_2/wolfCrypt_example_system/.cproject create mode 100644 IDE/XilinxSDK/2019_2/wolfCrypt_example_system/.project diff --git a/IDE/XilinxSDK/.cproject b/IDE/XilinxSDK/2018_2/.cproject similarity index 100% rename from IDE/XilinxSDK/.cproject rename to IDE/XilinxSDK/2018_2/.cproject diff --git a/IDE/XilinxSDK/.project b/IDE/XilinxSDK/2018_2/.project similarity index 100% rename from IDE/XilinxSDK/.project rename to IDE/XilinxSDK/2018_2/.project diff --git a/IDE/XilinxSDK/lscript.ld b/IDE/XilinxSDK/2018_2/lscript.ld similarity index 100% rename from IDE/XilinxSDK/lscript.ld rename to IDE/XilinxSDK/2018_2/lscript.ld diff --git a/IDE/XilinxSDK/2019_2/wolfCrypt_example/.cproject b/IDE/XilinxSDK/2019_2/wolfCrypt_example/.cproject new file mode 100644 index 000000000..ebfdb72b2 --- /dev/null +++ b/IDE/XilinxSDK/2019_2/wolfCrypt_example/.cproject @@ -0,0 +1,378 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/IDE/XilinxSDK/2019_2/wolfCrypt_example/.project b/IDE/XilinxSDK/2019_2/wolfCrypt_example/.project new file mode 100644 index 000000000..c814955a7 --- /dev/null +++ b/IDE/XilinxSDK/2019_2/wolfCrypt_example/.project @@ -0,0 +1,849 @@ + + + wolfCrypt_example + Created by Vitis v2019.2 + + standalone_bsp_0 + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.xilinx.sdx.sdk.core.SdkProjectNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + src/IDE + 2 + virtual:/virtual + + + src/src + 2 + virtual:/virtual + + + src/wolfcrypt + 2 + virtual:/virtual + + + src/IDE/XilinxSDK + 2 + virtual:/virtual + + + src/src/bio.c + 1 + PARENT-4-PROJECT_LOC/src/bio.c + + + src/src/crl.c + 1 + PARENT-4-PROJECT_LOC/src/crl.c + + + src/src/include.am + 1 + PARENT-4-PROJECT_LOC/src/include.am + + + src/src/internal.c + 1 + PARENT-4-PROJECT_LOC/src/internal.c + + + src/src/keys.c + 1 + PARENT-4-PROJECT_LOC/src/keys.c + + + src/src/ocsp.c + 1 + PARENT-4-PROJECT_LOC/src/ocsp.c + + + src/src/sniffer.c + 1 + PARENT-4-PROJECT_LOC/src/sniffer.c + + + src/src/ssl.c + 1 + PARENT-4-PROJECT_LOC/src/ssl.c + + + src/src/tls.c + 1 + PARENT-4-PROJECT_LOC/src/tls.c + + + src/src/tls13.c + 1 + PARENT-4-PROJECT_LOC/src/tls13.c + + + src/src/wolfio.c + 1 + PARENT-4-PROJECT_LOC/src/wolfio.c + + + src/wolfcrypt/benchmark + 2 + virtual:/virtual + + + src/wolfcrypt/src + 2 + virtual:/virtual + + + src/wolfcrypt/test + 2 + virtual:/virtual + + + src/IDE/XilinxSDK/.cproject + 1 + PARENT-2-PROJECT_LOC/.cproject + + + src/IDE/XilinxSDK/.project + 1 + PARENT-2-PROJECT_LOC/.project + + + src/IDE/XilinxSDK/README.md + 1 + PARENT-2-PROJECT_LOC/README.md + + + src/IDE/XilinxSDK/include.am + 1 + PARENT-2-PROJECT_LOC/include.am + + + src/IDE/XilinxSDK/lscript.ld + 1 + PARENT-2-PROJECT_LOC/lscript.ld + + + src/IDE/XilinxSDK/user_settings.h + 1 + PARENT-2-PROJECT_LOC/user_settings.h + + + src/IDE/XilinxSDK/wolfssl_example.c + 1 + PARENT-2-PROJECT_LOC/wolfssl_example.c + + + src/wolfcrypt/benchmark/README.md + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/benchmark/README.md + + + src/wolfcrypt/benchmark/benchmark.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/benchmark/benchmark.c + + + src/wolfcrypt/benchmark/benchmark.h + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/benchmark/benchmark.h + + + src/wolfcrypt/benchmark/benchmark.sln + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/benchmark/benchmark.sln + + + src/wolfcrypt/benchmark/benchmark.vcproj + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/benchmark/benchmark.vcproj + + + src/wolfcrypt/benchmark/include.am + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/benchmark/include.am + + + src/wolfcrypt/src/aes.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/aes.c + + + src/wolfcrypt/src/aes_asm.asm + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/aes_asm.asm + + + src/wolfcrypt/src/arc4.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/arc4.c + + + src/wolfcrypt/src/asm.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/asm.c + + + src/wolfcrypt/src/asn.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/asn.c + + + src/wolfcrypt/src/blake2b.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/blake2b.c + + + src/wolfcrypt/src/blake2s.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/blake2s.c + + + src/wolfcrypt/src/camellia.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/camellia.c + + + src/wolfcrypt/src/chacha.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/chacha.c + + + src/wolfcrypt/src/chacha20_poly1305.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/chacha20_poly1305.c + + + src/wolfcrypt/src/cmac.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/cmac.c + + + src/wolfcrypt/src/coding.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/coding.c + + + src/wolfcrypt/src/compress.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/compress.c + + + src/wolfcrypt/src/cpuid.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/cpuid.c + + + src/wolfcrypt/src/cryptocb.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/cryptocb.c + + + src/wolfcrypt/src/curve25519.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/curve25519.c + + + src/wolfcrypt/src/curve448.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/curve448.c + + + src/wolfcrypt/src/des3.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/des3.c + + + src/wolfcrypt/src/dh.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/dh.c + + + src/wolfcrypt/src/dsa.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/dsa.c + + + src/wolfcrypt/src/ecc.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/ecc.c + + + src/wolfcrypt/src/ecc_fp.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/ecc_fp.c + + + src/wolfcrypt/src/ed25519.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/ed25519.c + + + src/wolfcrypt/src/ed448.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/ed448.c + + + src/wolfcrypt/src/error.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/error.c + + + src/wolfcrypt/src/evp.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/evp.c + + + src/wolfcrypt/src/fe_448.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/fe_448.c + + + src/wolfcrypt/src/fe_low_mem.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/fe_low_mem.c + + + src/wolfcrypt/src/fe_operations.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/fe_operations.c + + + src/wolfcrypt/src/fe_x25519_128.i + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/fe_x25519_128.i + + + src/wolfcrypt/src/fp_mont_small.i + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/fp_mont_small.i + + + src/wolfcrypt/src/fp_mul_comba_12.i + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/fp_mul_comba_12.i + + + src/wolfcrypt/src/fp_mul_comba_17.i + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/fp_mul_comba_17.i + + + src/wolfcrypt/src/fp_mul_comba_20.i + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/fp_mul_comba_20.i + + + src/wolfcrypt/src/fp_mul_comba_24.i + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/fp_mul_comba_24.i + + + src/wolfcrypt/src/fp_mul_comba_28.i + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/fp_mul_comba_28.i + + + src/wolfcrypt/src/fp_mul_comba_3.i + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/fp_mul_comba_3.i + + + src/wolfcrypt/src/fp_mul_comba_32.i + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/fp_mul_comba_32.i + + + src/wolfcrypt/src/fp_mul_comba_4.i + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/fp_mul_comba_4.i + + + src/wolfcrypt/src/fp_mul_comba_48.i + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/fp_mul_comba_48.i + + + src/wolfcrypt/src/fp_mul_comba_6.i + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/fp_mul_comba_6.i + + + src/wolfcrypt/src/fp_mul_comba_64.i + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/fp_mul_comba_64.i + + + src/wolfcrypt/src/fp_mul_comba_7.i + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/fp_mul_comba_7.i + + + src/wolfcrypt/src/fp_mul_comba_8.i + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/fp_mul_comba_8.i + + + src/wolfcrypt/src/fp_mul_comba_9.i + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/fp_mul_comba_9.i + + + src/wolfcrypt/src/fp_mul_comba_small_set.i + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/fp_mul_comba_small_set.i + + + src/wolfcrypt/src/fp_sqr_comba_12.i + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/fp_sqr_comba_12.i + + + src/wolfcrypt/src/fp_sqr_comba_17.i + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/fp_sqr_comba_17.i + + + src/wolfcrypt/src/fp_sqr_comba_20.i + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/fp_sqr_comba_20.i + + + src/wolfcrypt/src/fp_sqr_comba_24.i + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/fp_sqr_comba_24.i + + + src/wolfcrypt/src/fp_sqr_comba_28.i + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/fp_sqr_comba_28.i + + + src/wolfcrypt/src/fp_sqr_comba_3.i + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/fp_sqr_comba_3.i + + + src/wolfcrypt/src/fp_sqr_comba_32.i + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/fp_sqr_comba_32.i + + + src/wolfcrypt/src/fp_sqr_comba_4.i + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/fp_sqr_comba_4.i + + + src/wolfcrypt/src/fp_sqr_comba_48.i + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/fp_sqr_comba_48.i + + + src/wolfcrypt/src/fp_sqr_comba_6.i + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/fp_sqr_comba_6.i + + + src/wolfcrypt/src/fp_sqr_comba_64.i + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/fp_sqr_comba_64.i + + + src/wolfcrypt/src/fp_sqr_comba_7.i + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/fp_sqr_comba_7.i + + + src/wolfcrypt/src/fp_sqr_comba_8.i + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/fp_sqr_comba_8.i + + + src/wolfcrypt/src/fp_sqr_comba_9.i + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/fp_sqr_comba_9.i + + + src/wolfcrypt/src/fp_sqr_comba_small_set.i + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/fp_sqr_comba_small_set.i + + + src/wolfcrypt/src/ge_448.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/ge_448.c + + + src/wolfcrypt/src/ge_low_mem.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/ge_low_mem.c + + + src/wolfcrypt/src/ge_operations.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/ge_operations.c + + + src/wolfcrypt/src/hash.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/hash.c + + + src/wolfcrypt/src/hc128.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/hc128.c + + + src/wolfcrypt/src/hmac.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/hmac.c + + + src/wolfcrypt/src/idea.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/idea.c + + + src/wolfcrypt/src/include.am + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/include.am + + + src/wolfcrypt/src/integer.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/integer.c + + + src/wolfcrypt/src/logging.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/logging.c + + + src/wolfcrypt/src/md2.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/md2.c + + + src/wolfcrypt/src/md4.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/md4.c + + + src/wolfcrypt/src/md5.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/md5.c + + + src/wolfcrypt/src/memory.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/memory.c + + + src/wolfcrypt/src/misc.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/misc.c + + + src/wolfcrypt/src/pkcs12.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/pkcs12.c + + + src/wolfcrypt/src/pkcs7.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/pkcs7.c + + + src/wolfcrypt/src/poly1305.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/poly1305.c + + + src/wolfcrypt/src/port + 2 + virtual:/virtual + + + src/wolfcrypt/src/pwdbased.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/pwdbased.c + + + src/wolfcrypt/src/rabbit.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/rabbit.c + + + src/wolfcrypt/src/random.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/random.c + + + src/wolfcrypt/src/ripemd.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/ripemd.c + + + src/wolfcrypt/src/rsa.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/rsa.c + + + src/wolfcrypt/src/sha.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/sha.c + + + src/wolfcrypt/src/sha256.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/sha256.c + + + src/wolfcrypt/src/sha3.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/sha3.c + + + src/wolfcrypt/src/sha512.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/sha512.c + + + src/wolfcrypt/src/signature.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/signature.c + + + src/wolfcrypt/src/sp_arm32.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/sp_arm32.c + + + src/wolfcrypt/src/sp_arm64.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/sp_arm64.c + + + src/wolfcrypt/src/sp_armthumb.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/sp_armthumb.c + + + src/wolfcrypt/src/sp_c32.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/sp_c32.c + + + src/wolfcrypt/src/sp_c64.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/sp_c64.c + + + src/wolfcrypt/src/sp_cortexm.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/sp_cortexm.c + + + src/wolfcrypt/src/sp_dsp32.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/sp_dsp32.c + + + src/wolfcrypt/src/sp_int.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/sp_int.c + + + src/wolfcrypt/src/sp_x86_64.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/sp_x86_64.c + + + src/wolfcrypt/src/srp.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/srp.c + + + src/wolfcrypt/src/tfm.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/tfm.c + + + src/wolfcrypt/src/wc_dsp.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/wc_dsp.c + + + src/wolfcrypt/src/wc_encrypt.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/wc_encrypt.c + + + src/wolfcrypt/src/wc_pkcs11.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/wc_pkcs11.c + + + src/wolfcrypt/src/wc_port.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/wc_port.c + + + src/wolfcrypt/src/wolfevent.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/wolfevent.c + + + src/wolfcrypt/src/wolfmath.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/wolfmath.c + + + src/wolfcrypt/test/README.md + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/test/README.md + + + src/wolfcrypt/test/include.am + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/test/include.am + + + src/wolfcrypt/test/test.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/test/test.c + + + src/wolfcrypt/test/test.h + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/test/test.h + + + src/wolfcrypt/test/test.sln + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/test/test.sln + + + src/wolfcrypt/test/test.vcproj + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/test/test.vcproj + + + src/wolfcrypt/src/port/arm + 2 + virtual:/virtual + + + src/wolfcrypt/src/port/nrf51.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/port/nrf51.c + + + src/wolfcrypt/src/port/xilinx + 2 + virtual:/virtual + + + src/wolfcrypt/src/port/arm/armv8-32-curve25519.S + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/port/arm/armv8-32-curve25519.S + + + src/wolfcrypt/src/port/arm/armv8-32-curve25519.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/port/arm/armv8-32-curve25519.c + + + src/wolfcrypt/src/port/arm/armv8-32-sha512-asm.S + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/port/arm/armv8-32-sha512-asm.S + + + src/wolfcrypt/src/port/arm/armv8-32-sha512-asm.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/port/arm/armv8-32-sha512-asm.c + + + src/wolfcrypt/src/port/arm/armv8-aes.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/port/arm/armv8-aes.c + + + src/wolfcrypt/src/port/arm/armv8-chacha.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/port/arm/armv8-chacha.c + + + src/wolfcrypt/src/port/arm/armv8-curve25519.S + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/port/arm/armv8-curve25519.S + + + src/wolfcrypt/src/port/arm/armv8-curve25519.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/port/arm/armv8-curve25519.c + + + src/wolfcrypt/src/port/arm/armv8-poly1305.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/port/arm/armv8-poly1305.c + + + src/wolfcrypt/src/port/arm/armv8-sha256.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/port/arm/armv8-sha256.c + + + src/wolfcrypt/src/port/arm/armv8-sha512-asm.S + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/port/arm/armv8-sha512-asm.S + + + src/wolfcrypt/src/port/arm/armv8-sha512-asm.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/port/arm/armv8-sha512-asm.c + + + src/wolfcrypt/src/port/arm/armv8-sha512.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/port/arm/armv8-sha512.c + + + src/wolfcrypt/src/port/arm/cryptoCell.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/port/arm/cryptoCell.c + + + src/wolfcrypt/src/port/arm/cryptoCellHash.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/port/arm/cryptoCellHash.c + + + src/wolfcrypt/src/port/xilinx/xil-aesgcm.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/port/xilinx/xil-aesgcm.c + + + src/wolfcrypt/src/port/xilinx/xil-sha3.c + 1 + PARENT-4-PROJECT_LOC/wolfcrypt/src/port/xilinx/xil-sha3.c + + + diff --git a/IDE/XilinxSDK/2019_2/wolfCrypt_example/src/lscript.ld b/IDE/XilinxSDK/2019_2/wolfCrypt_example/src/lscript.ld new file mode 100644 index 000000000..b881c337a --- /dev/null +++ b/IDE/XilinxSDK/2019_2/wolfCrypt_example/src/lscript.ld @@ -0,0 +1,309 @@ + +/* Linker Script for Zynq MP */ + +/* Stack and Heap increased to 64KB */ +_STACK_SIZE = DEFINED(_STACK_SIZE) ? _STACK_SIZE : 0x10000; +_HEAP_SIZE = DEFINED(_HEAP_SIZE) ? _HEAP_SIZE : 0x10000; + +_EL0_STACK_SIZE = DEFINED(_EL0_STACK_SIZE) ? _EL0_STACK_SIZE : 1024; +_EL1_STACK_SIZE = DEFINED(_EL1_STACK_SIZE) ? _EL1_STACK_SIZE : 2048; +_EL2_STACK_SIZE = DEFINED(_EL2_STACK_SIZE) ? _EL2_STACK_SIZE : 1024; + +/* Define Memories in the system */ +MEMORY +{ + ddr4_ctrl_C0_DDR4_ADDRESS_BLOCK : ORIGIN = 0x500000000, LENGTH = 0x20000000 + psu_ddr_0_MEM_0 : ORIGIN = 0x0, LENGTH = 0x7FF00000 + psu_ddr_1_MEM_0 : ORIGIN = 0x800000000, LENGTH = 0x80000000 + psu_ocm_ram_0_MEM_0 : ORIGIN = 0xFFFC0000, LENGTH = 0x40000 + psu_qspi_linear_0_MEM_0 : ORIGIN = 0xC0000000, LENGTH = 0x20000000 +} + +/* Specify the default entry point to the program */ +ENTRY(_vector_table) + +/* Define the sections, and where they are mapped in memory */ +SECTIONS +{ +.text : { + KEEP (*(.vectors)) + *(.boot) + *(.text) + *(.text.*) + *(.gnu.linkonce.t.*) + *(.plt) + *(.gnu_warning) + *(.gcc_execpt_table) + *(.glue_7) + *(.glue_7t) + *(.ARM.extab) + *(.gnu.linkonce.armextab.*) +} > psu_ddr_0_MEM_0 + +.init (ALIGN(64)) : { + KEEP (*(.init)) +} > psu_ddr_0_MEM_0 + +.fini (ALIGN(64)) : { + KEEP (*(.fini)) +} > psu_ddr_0_MEM_0 + +.interp : { + KEEP (*(.interp)) +} > psu_ddr_0_MEM_0 + +.note-ABI-tag : { + KEEP (*(.note-ABI-tag)) +} > psu_ddr_0_MEM_0 + +.rodata : { + . = ALIGN(64); + __rodata_start = .; + *(.rodata) + *(.rodata.*) + *(.gnu.linkonce.r.*) + __rodata_end = .; +} > psu_ddr_0_MEM_0 + +.rodata1 : { + . = ALIGN(64); + __rodata1_start = .; + *(.rodata1) + *(.rodata1.*) + __rodata1_end = .; +} > psu_ddr_0_MEM_0 + +.sdata2 : { + . = ALIGN(64); + __sdata2_start = .; + *(.sdata2) + *(.sdata2.*) + *(.gnu.linkonce.s2.*) + __sdata2_end = .; +} > psu_ddr_0_MEM_0 + +.sbss2 : { + . = ALIGN(64); + __sbss2_start = .; + *(.sbss2) + *(.sbss2.*) + *(.gnu.linkonce.sb2.*) + __sbss2_end = .; +} > psu_ddr_0_MEM_0 + +.data : { + . = ALIGN(64); + __data_start = .; + *(.data) + *(.data.*) + *(.gnu.linkonce.d.*) + *(.jcr) + *(.got) + *(.got.plt) + __data_end = .; +} > psu_ddr_0_MEM_0 + +.data1 : { + . = ALIGN(64); + __data1_start = .; + *(.data1) + *(.data1.*) + __data1_end = .; +} > psu_ddr_0_MEM_0 + +.got : { + *(.got) +} > psu_ddr_0_MEM_0 + +.got1 : { + *(.got1) +} > psu_ddr_0_MEM_0 + +.got2 : { + *(.got2) +} > psu_ddr_0_MEM_0 + +.ctors : { + . = ALIGN(64); + __CTOR_LIST__ = .; + ___CTORS_LIST___ = .; + KEEP (*crtbegin.o(.ctors)) + KEEP (*(EXCLUDE_FILE(*crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + __CTOR_END__ = .; + ___CTORS_END___ = .; +} > psu_ddr_0_MEM_0 + +.dtors : { + . = ALIGN(64); + __DTOR_LIST__ = .; + ___DTORS_LIST___ = .; + KEEP (*crtbegin.o(.dtors)) + KEEP (*(EXCLUDE_FILE(*crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + __DTOR_END__ = .; + ___DTORS_END___ = .; +} > psu_ddr_0_MEM_0 + +.fixup : { + __fixup_start = .; + *(.fixup) + __fixup_end = .; +} > psu_ddr_0_MEM_0 + +.eh_frame : { + *(.eh_frame) +} > psu_ddr_0_MEM_0 + +.eh_framehdr : { + __eh_framehdr_start = .; + *(.eh_framehdr) + __eh_framehdr_end = .; +} > psu_ddr_0_MEM_0 + +.gcc_except_table : { + *(.gcc_except_table) +} > psu_ddr_0_MEM_0 + +.mmu_tbl0 (ALIGN(4096)) : { + __mmu_tbl0_start = .; + *(.mmu_tbl0) + __mmu_tbl0_end = .; +} > psu_ddr_0_MEM_0 + +.mmu_tbl1 (ALIGN(4096)) : { + __mmu_tbl1_start = .; + *(.mmu_tbl1) + __mmu_tbl1_end = .; +} > psu_ddr_0_MEM_0 + +.mmu_tbl2 (ALIGN(4096)) : { + __mmu_tbl2_start = .; + *(.mmu_tbl2) + __mmu_tbl2_end = .; +} > psu_ddr_0_MEM_0 + +.ARM.exidx : { + __exidx_start = .; + *(.ARM.exidx*) + *(.gnu.linkonce.armexidix.*.*) + __exidx_end = .; +} > psu_ddr_0_MEM_0 + +.preinit_array : { + . = ALIGN(64); + __preinit_array_start = .; + KEEP (*(SORT(.preinit_array.*))) + KEEP (*(.preinit_array)) + __preinit_array_end = .; +} > psu_ddr_0_MEM_0 + +.init_array : { + . = ALIGN(64); + __init_array_start = .; + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array)) + __init_array_end = .; +} > psu_ddr_0_MEM_0 + +.fini_array : { + . = ALIGN(64); + __fini_array_start = .; + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array)) + __fini_array_end = .; +} > psu_ddr_0_MEM_0 + +.ARM.attributes : { + __ARM.attributes_start = .; + *(.ARM.attributes) + __ARM.attributes_end = .; +} > psu_ddr_0_MEM_0 + +.sdata : { + . = ALIGN(64); + __sdata_start = .; + *(.sdata) + *(.sdata.*) + *(.gnu.linkonce.s.*) + __sdata_end = .; +} > psu_ddr_0_MEM_0 + +.sbss (NOLOAD) : { + . = ALIGN(64); + __sbss_start = .; + *(.sbss) + *(.sbss.*) + *(.gnu.linkonce.sb.*) + . = ALIGN(64); + __sbss_end = .; +} > psu_ddr_0_MEM_0 + +.tdata : { + . = ALIGN(64); + __tdata_start = .; + *(.tdata) + *(.tdata.*) + *(.gnu.linkonce.td.*) + __tdata_end = .; +} > psu_ddr_0_MEM_0 + +.tbss : { + . = ALIGN(64); + __tbss_start = .; + *(.tbss) + *(.tbss.*) + *(.gnu.linkonce.tb.*) + __tbss_end = .; +} > psu_ddr_0_MEM_0 + +.bss (NOLOAD) : { + . = ALIGN(64); + __bss_start__ = .; + *(.bss) + *(.bss.*) + *(.gnu.linkonce.b.*) + *(COMMON) + . = ALIGN(64); + __bss_end__ = .; +} > psu_ddr_0_MEM_0 + +_SDA_BASE_ = __sdata_start + ((__sbss_end - __sdata_start) / 2 ); + +_SDA2_BASE_ = __sdata2_start + ((__sbss2_end - __sdata2_start) / 2 ); + +/* Generate Stack and Heap definitions */ + +.heap (NOLOAD) : { + . = ALIGN(64); + _heap = .; + HeapBase = .; + _heap_start = .; + . += _HEAP_SIZE; + _heap_end = .; + HeapLimit = .; +} > psu_ddr_0_MEM_0 + +.stack (NOLOAD) : { + . = ALIGN(64); + _el3_stack_end = .; + . += _STACK_SIZE; + __el3_stack = .; + _el2_stack_end = .; + . += _EL2_STACK_SIZE; + . = ALIGN(64); + __el2_stack = .; + _el1_stack_end = .; + . += _EL1_STACK_SIZE; + . = ALIGN(64); + __el1_stack = .; + _el0_stack_end = .; + . += _EL0_STACK_SIZE; + . = ALIGN(64); + __el0_stack = .; +} > psu_ddr_0_MEM_0 + +_end = .; +} diff --git a/IDE/XilinxSDK/2019_2/wolfCrypt_example_system/.cproject b/IDE/XilinxSDK/2019_2/wolfCrypt_example_system/.cproject new file mode 100644 index 000000000..8e977275f --- /dev/null +++ b/IDE/XilinxSDK/2019_2/wolfCrypt_example_system/.cproject @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/IDE/XilinxSDK/2019_2/wolfCrypt_example_system/.project b/IDE/XilinxSDK/2019_2/wolfCrypt_example_system/.project new file mode 100644 index 000000000..004363c50 --- /dev/null +++ b/IDE/XilinxSDK/2019_2/wolfCrypt_example_system/.project @@ -0,0 +1,28 @@ + + + wolfCrypt_example_system + + + wolfCrypt_example + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.xilinx.sdx.system.systemprojectnature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + diff --git a/IDE/XilinxSDK/README.md b/IDE/XilinxSDK/README.md index 7b131a070..bf923f1e1 100644 --- a/IDE/XilinxSDK/README.md +++ b/IDE/XilinxSDK/README.md @@ -1,58 +1,111 @@ -# Xilinx SDK wolfCrypt Project - -To use this example project: -1. Start a new workspace -2. Create a new BSP called `standalone_bsp_0`. -3. Copy `.cproject` and `.project` into the wolfSSL root. -4. From the Xilinx SDK Import wolfBoot using "Import" -> "Existing Projects into Workspace". - -## Platform - -Tested on the Zynq UltraScale+ MPSoC (ZUC102). - -This is a bare-metal example for wolfCrypt only with algorithm support for: -* RNG -* RSA -* ECC -* AES-GCM -* ChaCha20 -* Poly1305 -* SHA2 -* SHA3 -* PBKDF2 - -## Benchmark Results - -``` ------------------------------------------------------------------------------- - wolfSSL version 4.3.0 ------------------------------------------------------------------------------- -wolfCrypt Benchmark (block bytes 1024, min sec each) -RNG 72 MB took 1.000 seconds, 72.388 MB/s -AES-128-GCM-enc 370 MB took 1.000 seconds, 370.312 MB/s -AES-128-GCM-dec 187 MB took 1.000 seconds, 187.451 MB/s -AES-192-GCM-enc 341 MB took 1.000 seconds, 341.382 MB/s -AES-192-GCM-dec 180 MB took 1.000 seconds, 179.663 MB/s -AES-256-GCM-enc 316 MB took 1.000 seconds, 316.382 MB/s -AES-256-GCM-dec 172 MB took 1.000 seconds, 172.485 MB/s -CHACHA 256 MB took 1.000 seconds, 255.859 MB/s -CHA-POLY 98 MB took 1.000 seconds, 97.559 MB/s -POLY1305 517 MB took 1.000 seconds, 516.895 MB/s -SHA-256 535 MB took 1.000 seconds, 534.595 MB/s -SHA-384 123 MB took 1.000 seconds, 123.291 MB/s -SHA-512 124 MB took 1.000 seconds, 123.657 MB/s -SHA3-224 70 MB took 1.000 seconds, 70.337 MB/s -SHA3-256 67 MB took 1.000 seconds, 66.528 MB/s -SHA3-384 53 MB took 1.000 seconds, 52.710 MB/s -SHA3-512 38 MB took 1.000 seconds, 37.598 MB/s -HMAC-SHA256 520 MB took 1.000 seconds, 520.093 MB/s -HMAC-SHA384 121 MB took 1.000 seconds, 121.265 MB/s -HMAC-SHA512 121 MB took 1.000 seconds, 121.289 MB/s -PBKDF2 28 KB took 1.000 seconds, 28.375 KB/s -ECC 256 key gen 8518 ops took 1.000 sec, avg 0.117 ms, 8518.000 ops/sec -ECDHE 256 agree 1818 ops took 1.000 sec, avg 0.550 ms, 1818.000 ops/sec -ECDSA 256 sign 4448 ops took 1.000 sec, avg 0.225 ms, 4448.000 ops/sec -ECDSA 256 verify 1430 ops took 1.000 sec, avg 0.699 ms, 1430.000 ops/sec -Benchmark complete -Benchmark Test: Return code 0 -``` +# Common Gotcha's + +- If compiling all code togther (ie no sperate wolfssl library) than the -fPIC compiler flag should be used. Without using -fPIC in this build setup there could be unexpected failures. +- If building with ARMv8 crypto extensions then the compiler flags "-mstrict-align -mcpu=generic+crypto" must be used. +- Check that enough stack and heap memory is set for the operations if a crash or stall happens. + +# Xilinx SDK wolfCrypt Vitis 2018.2 Project + +To use this example project: +1. Start a new workspace +2. Create a new BSP called `standalone_bsp_0`. +3. Copy `.cproject` and `.project` from IDE/XilinxSDK/2018_2 into the wolfSSL root. +4. From the Xilinx SDK Import wolfBoot using "Import" -> "Existing Projects into Workspace". + + +# Detailed Instructions For Example Use With Vitis 2019.2 + +1. Create a new workspace located in the directory wolfssl/IDE/XilinxSDK/2019_2 +2. Create a new BSP, by selecting; + - File->New->Platform Project + - Setting "Project name" to standalone_bsp_0, then click "Next" + - Select the "Create from hardware specification" radius and click "Next" + - "Browse..." to the desired XSA file for the hardare + - (optional) change Processor to R5 now + - click "Finish" +3. (optional) If building for TLS support than expand the standalone_bsp_0 project, double click on platform_spr, Expand the cpu (i.e psu_cortexa53_0), click on Board Support Package, select the "Modify BSP Settings..." box and click on lwip211. Note that the api_mode should be changed from RAW API to SOCKET API. +4. Right click on the standalone_bsp_0 project and click on "Build Project" +5. Import the wolfcrypt example project "File->Import->Eclipse workspace or zip file" +6. Uncheck "Copy projects into workspace" +7. Select the root directory of wolfssl/IDE/XilinxSDK/2019_2, and select wolfCrypt_example and wolfCrypt_example_system. Then click "Finish" + + +# Steps For Creating Project From Scratch + +1. Create a new workspace +2. Create a new BSP, by selecting; + - File->New->Platform Project + - Setting "Project name" to standalone_bsp_0, then click "Next" + - Select the "Create from hardware specification" radius and click "Next" + - "Browse..." to the desired XSA file for the hardare + - (optional) change Processor to R5 now + - click "Finish" +3. (optional) If building for TLS support than expand the standalone_bsp_0 project, double click on platform_spr, Expand the cpu (i.e psu_cortexa53_0), click on Board Support Package, select the "Modify BSP Settings..." box and click on lwip211. Note that the api_mode should be changed from RAW API to SOCKET API. +4. Right click on the standalone_bsp_0 project and click on "Build Project" +5. Create wolfssl project File->New->Application Project +6. Name the project wolfCrypt_example, select "Next" +7. For the platform select standalone_bsp_0 and click next, then next once more on Domain. +8. Select "Empty Application" and click "Finish" +9. Expand the wolfCrypt_example project and right click on the folder "src". +10. Select "Import Sources" and set the "From directory" to be the wolfssl root directory. +11. Select the folders to import as ./src, ./IDE/XilinxSDK, ./wolfcrypt/benchmark, ./wolfcrypt/test, ./wolfcrypt/src +12. (optional) Expand the Advanced tabe and select "Create links in workspace" +13. Click on "Finish" +14. Expand the wolfcrypt/src directory and exlude all .S files from the build +15. Right click on the wolfCrypt_example project and got to Properties. Set the macro WOLFSSL_USER_SETTINGS in C/C++ Build->Settings->ARM v8 gcc compiler->Symbols +16. Set the include path for finding user_settings.h by going to the Properties and setting it in C/C++ Build->Settings->ARM v8 gcc compiler->Directories. This is to the directory wolfssl/IDE/XilinxSDK +17. Set the include path for finding wolfSSL headers. To the root directory wolfssl +18. Add compiler flags "-fPIC -mstrict-align -mcpu=generic+crypto" to the project properties. C/C++ Build->Settings->ARM v8 gcc compiler->Miscellaneous +19. Right click on wolfCrypt_example and "Build Project" + + +## Platform + +Tested on the Zynq UltraScale+ MPSoC (ZUC102). + +This is a bare-metal example for wolfCrypt only with algorithm support for: +* RNG +* RSA +* ECC +* AES-GCM +* ChaCha20 +* Poly1305 +* SHA2 +* SHA3 +* PBKDF2 + +## Benchmark Results + +``` +------------------------------------------------------------------------------ + wolfSSL version 4.3.0 +------------------------------------------------------------------------------ +wolfCrypt Benchmark (block bytes 1024, min sec each) +RNG 72 MB took 1.000 seconds, 72.388 MB/s +AES-128-GCM-enc 370 MB took 1.000 seconds, 370.312 MB/s +AES-128-GCM-dec 187 MB took 1.000 seconds, 187.451 MB/s +AES-192-GCM-enc 341 MB took 1.000 seconds, 341.382 MB/s +AES-192-GCM-dec 180 MB took 1.000 seconds, 179.663 MB/s +AES-256-GCM-enc 316 MB took 1.000 seconds, 316.382 MB/s +AES-256-GCM-dec 172 MB took 1.000 seconds, 172.485 MB/s +CHACHA 256 MB took 1.000 seconds, 255.859 MB/s +CHA-POLY 98 MB took 1.000 seconds, 97.559 MB/s +POLY1305 517 MB took 1.000 seconds, 516.895 MB/s +SHA-256 535 MB took 1.000 seconds, 534.595 MB/s +SHA-384 123 MB took 1.000 seconds, 123.291 MB/s +SHA-512 124 MB took 1.000 seconds, 123.657 MB/s +SHA3-224 70 MB took 1.000 seconds, 70.337 MB/s +SHA3-256 67 MB took 1.000 seconds, 66.528 MB/s +SHA3-384 53 MB took 1.000 seconds, 52.710 MB/s +SHA3-512 38 MB took 1.000 seconds, 37.598 MB/s +HMAC-SHA256 520 MB took 1.000 seconds, 520.093 MB/s +HMAC-SHA384 121 MB took 1.000 seconds, 121.265 MB/s +HMAC-SHA512 121 MB took 1.000 seconds, 121.289 MB/s +PBKDF2 28 KB took 1.000 seconds, 28.375 KB/s +ECC 256 key gen 8518 ops took 1.000 sec, avg 0.117 ms, 8518.000 ops/sec +ECDHE 256 agree 1818 ops took 1.000 sec, avg 0.550 ms, 1818.000 ops/sec +ECDSA 256 sign 4448 ops took 1.000 sec, avg 0.225 ms, 4448.000 ops/sec +ECDSA 256 verify 1430 ops took 1.000 sec, avg 0.699 ms, 1430.000 ops/sec +Benchmark complete +Benchmark Test: Return code 0 +``` diff --git a/IDE/XilinxSDK/include.am b/IDE/XilinxSDK/include.am index 26b136e86..e174daa84 100644 --- a/IDE/XilinxSDK/include.am +++ b/IDE/XilinxSDK/include.am @@ -5,6 +5,11 @@ EXTRA_DIST+= IDE/XilinxSDK/README.md EXTRA_DIST+= IDE/XilinxSDK/user_settings.h EXTRA_DIST+= IDE/XilinxSDK/wolfssl_example.c -EXTRA_DIST+= IDE/XilinxSDK/lscript.ld -EXTRA_DIST+= IDE/XilinxSDK/.cproject -EXTRA_DIST+= IDE/XilinxSDK/.project +EXTRA_DIST+= IDE/XilinxSDK/2018_2/lscript.ld +EXTRA_DIST+= IDE/XilinxSDK/2018_2/.cproject +EXTRA_DIST+= IDE/XilinxSDK/2018_2/.project +EXTRA_DIST+= IDE/XilinxSDK/2019_2/wolfCrypt_example/.cproject +EXTRA_DIST+= IDE/XilinxSDK/2019_2/wolfCrypt_example/.project +EXTRA_DIST+= IDE/XilinxSDK/2019_2/wolfCrypt_example/src/lscript.ld +EXTRA_DIST+= IDE/XilinxSDK/2019_2/wolfCrypt_example_system/.cproject +EXTRA_DIST+= IDE/XilinxSDK/2019_2/wolfCrypt_example_system/.project From c962aa41811f74c2bb0dd5fbb90ab37d6a70261c Mon Sep 17 00:00:00 2001 From: JacobBarthelmeh Date: Wed, 6 May 2020 12:13:22 -0700 Subject: [PATCH 082/298] add sprj file --- .../wolfCrypt_example_system.sprj | 19 +++++++++++++++++++ IDE/XilinxSDK/include.am | 1 + 2 files changed, 20 insertions(+) create mode 100644 IDE/XilinxSDK/2019_2/wolfCrypt_example_system/wolfCrypt_example_system.sprj diff --git a/IDE/XilinxSDK/2019_2/wolfCrypt_example_system/wolfCrypt_example_system.sprj b/IDE/XilinxSDK/2019_2/wolfCrypt_example_system/wolfCrypt_example_system.sprj new file mode 100644 index 000000000..af71c2700 --- /dev/null +++ b/IDE/XilinxSDK/2019_2/wolfCrypt_example_system/wolfCrypt_example_system.sprj @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/IDE/XilinxSDK/include.am b/IDE/XilinxSDK/include.am index e174daa84..32d47e4c2 100644 --- a/IDE/XilinxSDK/include.am +++ b/IDE/XilinxSDK/include.am @@ -13,3 +13,4 @@ EXTRA_DIST+= IDE/XilinxSDK/2019_2/wolfCrypt_example/.project EXTRA_DIST+= IDE/XilinxSDK/2019_2/wolfCrypt_example/src/lscript.ld EXTRA_DIST+= IDE/XilinxSDK/2019_2/wolfCrypt_example_system/.cproject EXTRA_DIST+= IDE/XilinxSDK/2019_2/wolfCrypt_example_system/.project +EXTRA_DIST+= IDE/XilinxSDK/2019_2/wolfCrypt_example_system/wolfCrypt_example_system.sprj From c4af5db4b964576a19e5576cfaaa40ebf12480b4 Mon Sep 17 00:00:00 2001 From: Sean Parkinson Date: Thu, 7 May 2020 08:46:48 +1000 Subject: [PATCH 083/298] Only use SP for RSA private operations if P and Q half bits --- wolfcrypt/src/rsa.c | 42 +++++++++++++++++++++++++++--------------- 1 file changed, 27 insertions(+), 15 deletions(-) diff --git a/wolfcrypt/src/rsa.c b/wolfcrypt/src/rsa.c index 69ab7b21b..c625c6921 100644 --- a/wolfcrypt/src/rsa.c +++ b/wolfcrypt/src/rsa.c @@ -2038,12 +2038,16 @@ static int wc_RsaFunctionSync(const byte* in, word32 inLen, byte* out, return MISSING_RNG_E; #endif #ifndef RSA_LOW_MEM - return sp_RsaPrivate_2048(in, inLen, &key->d, &key->p, &key->q, - &key->dP, &key->dQ, &key->u, &key->n, - out, outLen); + if ((mp_count_bits(&key->p) == 1024) && + (mp_count_bits(&key->q) == 1024)) { + return sp_RsaPrivate_2048(in, inLen, &key->d, &key->p, &key->q, + &key->dP, &key->dQ, &key->u, &key->n, + out, outLen); + } + break; #else - return sp_RsaPrivate_2048(in, inLen, &key->d, &key->p, &key->q, - NULL, NULL, NULL, &key->n, out, outLen); + return sp_RsaPrivate_2048(in, inLen, &key->d, NULL, NULL, NULL, + NULL, NULL, &key->n, out, outLen); #endif #endif case RSA_PUBLIC_ENCRYPT: @@ -2063,12 +2067,16 @@ static int wc_RsaFunctionSync(const byte* in, word32 inLen, byte* out, return MISSING_RNG_E; #endif #ifndef RSA_LOW_MEM - return sp_RsaPrivate_3072(in, inLen, &key->d, &key->p, &key->q, - &key->dP, &key->dQ, &key->u, &key->n, - out, outLen); + if ((mp_count_bits(&key->p) == 1536) && + (mp_count_bits(&key->q) == 1536)) { + return sp_RsaPrivate_3072(in, inLen, &key->d, &key->p, &key->q, + &key->dP, &key->dQ, &key->u, &key->n, + out, outLen); + } + break; #else - return sp_RsaPrivate_3072(in, inLen, &key->d, &key->p, &key->q, - NULL, NULL, NULL, &key->n, out, outLen); + return sp_RsaPrivate_3072(in, inLen, &key->d, NULL, NULL, NULL, + NULL, NULL, &key->n, out, outLen); #endif #endif case RSA_PUBLIC_ENCRYPT: @@ -2088,12 +2096,16 @@ static int wc_RsaFunctionSync(const byte* in, word32 inLen, byte* out, return MISSING_RNG_E; #endif #ifndef RSA_LOW_MEM - return sp_RsaPrivate_4096(in, inLen, &key->d, &key->p, &key->q, - &key->dP, &key->dQ, &key->u, &key->n, - out, outLen); + if ((mp_count_bits(&key->p) == 2048) && + (mp_count_bits(&key->q) == 2048)) { + return sp_RsaPrivate_4096(in, inLen, &key->d, &key->p, &key->q, + &key->dP, &key->dQ, &key->u, &key->n, + out, outLen); + } + break; #else - return sp_RsaPrivate_4096(in, inLen, &key->d, &key->p, &key->q, - NULL, NULL, NULL, &key->n, out, outLen); + return sp_RsaPrivate_4096(in, inLen, &key->d, NULL, NULL, NULL, + NULL, NULL, &key->n, out, outLen); #endif #endif case RSA_PUBLIC_ENCRYPT: From 2ab478f8fd54d02e6ba4fc5162abdb174dd382ab Mon Sep 17 00:00:00 2001 From: Tesfa Mael Date: Wed, 6 May 2020 15:47:39 -0700 Subject: [PATCH 084/298] Check length of output <= 255*HashLen --- wolfcrypt/src/hmac.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/wolfcrypt/src/hmac.c b/wolfcrypt/src/hmac.c index bcebc1ce2..a212dc141 100644 --- a/wolfcrypt/src/hmac.c +++ b/wolfcrypt/src/hmac.c @@ -1215,11 +1215,18 @@ int wolfSSL_GetHmacMaxSize(void) word32 outIdx = 0; word32 hashSz = wc_HmacSizeByType(type); byte n = 0x1; + word32 N = 0; /* rf5869: N = ceil(L/HashLen)*/ + + N = (outSz/hashSz) + ((outSz % hashSz) != 0); + + if (out == NULL || N > 255) + return BAD_FUNC_ARG; ret = wc_HmacInit(&myHmac, NULL, INVALID_DEVID); if (ret != 0) return ret; + while (outIdx < outSz) { int tmpSz = (n == 1) ? 0 : hashSz; word32 left = outSz - outIdx; From 6619db580d101b82057db6d37aa49c82a3419c73 Mon Sep 17 00:00:00 2001 From: Jacob Barthelmeh Date: Wed, 6 May 2020 16:58:54 -0600 Subject: [PATCH 085/298] fix for scep build without aes --- wolfssl/openssl/evp.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wolfssl/openssl/evp.h b/wolfssl/openssl/evp.h index 1b69f8bf3..084ccaf00 100644 --- a/wolfssl/openssl/evp.h +++ b/wolfssl/openssl/evp.h @@ -356,10 +356,10 @@ struct WOLFSSL_EVP_CIPHER_CTX { #ifdef HAVE_AESGCM byte* gcmDecryptBuffer; int gcmDecryptBufferLen; -#endif ALIGN16 unsigned char authTag[AES_BLOCK_SIZE]; int authTagSz; #endif +#endif }; struct WOLFSSL_EVP_PKEY_CTX { From b331804c27646be462f7e6336cdb4474cdf34700 Mon Sep 17 00:00:00 2001 From: Sean Parkinson Date: Thu, 7 May 2020 10:00:14 +1000 Subject: [PATCH 086/298] SP C: Fix array size for cache resistant modexp --- wolfcrypt/src/sp_c32.c | 24 ++++++++++++------------ wolfcrypt/src/sp_c64.c | 24 ++++++++++++------------ 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/wolfcrypt/src/sp_c32.c b/wolfcrypt/src/sp_c32.c index a607adf15..44fbc7774 100644 --- a/wolfcrypt/src/sp_c32.c +++ b/wolfcrypt/src/sp_c32.c @@ -1990,7 +1990,7 @@ static int sp_2048_mod_exp_45(sp_digit* r, const sp_digit* a, const sp_digit* e, #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; #else - sp_digit td[90]; + sp_digit td[3 * 90]; #endif sp_digit* t[3]; sp_digit* norm; @@ -2014,7 +2014,7 @@ static int sp_2048_mod_exp_45(sp_digit* r, const sp_digit* a, const sp_digit* e, #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) t[i] = td + (i * 45 * 2); #else - t[i] = &td[i * 45 * 2)]; + t[i] = &td[i * 45 * 2]; #endif } @@ -2943,7 +2943,7 @@ static int sp_2048_mod_exp_90(sp_digit* r, const sp_digit* a, const sp_digit* e, #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; #else - sp_digit td[180]; + sp_digit td[3 * 180]; #endif sp_digit* t[3]; sp_digit* norm; @@ -2967,7 +2967,7 @@ static int sp_2048_mod_exp_90(sp_digit* r, const sp_digit* a, const sp_digit* e, #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) t[i] = td + (i * 90 * 2); #else - t[i] = &td[i * 90 * 2)]; + t[i] = &td[i * 90 * 2]; #endif } @@ -5831,7 +5831,7 @@ static int sp_3072_mod_exp_67(sp_digit* r, const sp_digit* a, const sp_digit* e, #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; #else - sp_digit td[134]; + sp_digit td[3 * 134]; #endif sp_digit* t[3]; sp_digit* norm; @@ -5855,7 +5855,7 @@ static int sp_3072_mod_exp_67(sp_digit* r, const sp_digit* a, const sp_digit* e, #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) t[i] = td + (i * 67 * 2); #else - t[i] = &td[i * 67 * 2)]; + t[i] = &td[i * 67 * 2]; #endif } @@ -6820,7 +6820,7 @@ static int sp_3072_mod_exp_134(sp_digit* r, const sp_digit* a, const sp_digit* e #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; #else - sp_digit td[268]; + sp_digit td[3 * 268]; #endif sp_digit* t[3]; sp_digit* norm; @@ -6844,7 +6844,7 @@ static int sp_3072_mod_exp_134(sp_digit* r, const sp_digit* a, const sp_digit* e #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) t[i] = td + (i * 134 * 2); #else - t[i] = &td[i * 134 * 2)]; + t[i] = &td[i * 134 * 2]; #endif } @@ -9895,7 +9895,7 @@ static int sp_4096_mod_exp_98(sp_digit* r, const sp_digit* a, const sp_digit* e, #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; #else - sp_digit td[196]; + sp_digit td[3 * 196]; #endif sp_digit* t[3]; sp_digit* norm; @@ -9919,7 +9919,7 @@ static int sp_4096_mod_exp_98(sp_digit* r, const sp_digit* a, const sp_digit* e, #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) t[i] = td + (i * 98 * 2); #else - t[i] = &td[i * 98 * 2)]; + t[i] = &td[i * 98 * 2]; #endif } @@ -10861,7 +10861,7 @@ static int sp_4096_mod_exp_196(sp_digit* r, const sp_digit* a, const sp_digit* e #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; #else - sp_digit td[392]; + sp_digit td[3 * 392]; #endif sp_digit* t[3]; sp_digit* norm; @@ -10885,7 +10885,7 @@ static int sp_4096_mod_exp_196(sp_digit* r, const sp_digit* a, const sp_digit* e #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) t[i] = td + (i * 196 * 2); #else - t[i] = &td[i * 196 * 2)]; + t[i] = &td[i * 196 * 2]; #endif } diff --git a/wolfcrypt/src/sp_c64.c b/wolfcrypt/src/sp_c64.c index f956f86ed..86f8dc334 100644 --- a/wolfcrypt/src/sp_c64.c +++ b/wolfcrypt/src/sp_c64.c @@ -1638,7 +1638,7 @@ static int sp_2048_mod_exp_18(sp_digit* r, const sp_digit* a, const sp_digit* e, #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; #else - sp_digit td[36]; + sp_digit td[3 * 36]; #endif sp_digit* t[3]; sp_digit* norm; @@ -1662,7 +1662,7 @@ static int sp_2048_mod_exp_18(sp_digit* r, const sp_digit* a, const sp_digit* e, #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) t[i] = td + (i * 18 * 2); #else - t[i] = &td[i * 18 * 2)]; + t[i] = &td[i * 18 * 2]; #endif } @@ -2583,7 +2583,7 @@ static int sp_2048_mod_exp_36(sp_digit* r, const sp_digit* a, const sp_digit* e, #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; #else - sp_digit td[72]; + sp_digit td[3 * 72]; #endif sp_digit* t[3]; sp_digit* norm; @@ -2607,7 +2607,7 @@ static int sp_2048_mod_exp_36(sp_digit* r, const sp_digit* a, const sp_digit* e, #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) t[i] = td + (i * 36 * 2); #else - t[i] = &td[i * 36 * 2)]; + t[i] = &td[i * 36 * 2]; #endif } @@ -5819,7 +5819,7 @@ static int sp_3072_mod_exp_27(sp_digit* r, const sp_digit* a, const sp_digit* e, #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; #else - sp_digit td[54]; + sp_digit td[3 * 54]; #endif sp_digit* t[3]; sp_digit* norm; @@ -5843,7 +5843,7 @@ static int sp_3072_mod_exp_27(sp_digit* r, const sp_digit* a, const sp_digit* e, #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) t[i] = td + (i * 27 * 2); #else - t[i] = &td[i * 27 * 2)]; + t[i] = &td[i * 27 * 2]; #endif } @@ -6734,7 +6734,7 @@ static int sp_3072_mod_exp_54(sp_digit* r, const sp_digit* a, const sp_digit* e, #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; #else - sp_digit td[108]; + sp_digit td[3 * 108]; #endif sp_digit* t[3]; sp_digit* norm; @@ -6758,7 +6758,7 @@ static int sp_3072_mod_exp_54(sp_digit* r, const sp_digit* a, const sp_digit* e, #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) t[i] = td + (i * 54 * 2); #else - t[i] = &td[i * 54 * 2)]; + t[i] = &td[i * 54 * 2]; #endif } @@ -10116,7 +10116,7 @@ static int sp_4096_mod_exp_39(sp_digit* r, const sp_digit* a, const sp_digit* e, #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; #else - sp_digit td[78]; + sp_digit td[3 * 78]; #endif sp_digit* t[3]; sp_digit* norm; @@ -10140,7 +10140,7 @@ static int sp_4096_mod_exp_39(sp_digit* r, const sp_digit* a, const sp_digit* e, #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) t[i] = td + (i * 39 * 2); #else - t[i] = &td[i * 39 * 2)]; + t[i] = &td[i * 39 * 2]; #endif } @@ -11130,7 +11130,7 @@ static int sp_4096_mod_exp_78(sp_digit* r, const sp_digit* a, const sp_digit* e, #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; #else - sp_digit td[156]; + sp_digit td[3 * 156]; #endif sp_digit* t[3]; sp_digit* norm; @@ -11154,7 +11154,7 @@ static int sp_4096_mod_exp_78(sp_digit* r, const sp_digit* a, const sp_digit* e, #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) t[i] = td + (i * 78 * 2); #else - t[i] = &td[i * 78 * 2)]; + t[i] = &td[i * 78 * 2]; #endif } From 9e68de0fb721a86b3a225a01d22db82b015838a3 Mon Sep 17 00:00:00 2001 From: Juliusz Sosinowicz Date: Thu, 7 May 2020 11:52:49 +0200 Subject: [PATCH 087/298] Add test certs for ASN_IP_TYPE --- certs/1024/ca-cert.der | Bin 953 -> 1006 bytes certs/1024/ca-cert.pem | 76 +- certs/1024/client-cert.der | Bin 969 -> 1021 bytes certs/1024/client-cert.pem | 78 +- certs/1024/server-cert.der | Bin 941 -> 983 bytes certs/1024/server-cert.pem | 133 +- certs/3072/client-cert.der | Bin 1532 -> 1538 bytes certs/3072/client-cert.pem | 83 +- certs/4096/client-cert.der | Bin 1764 -> 1794 bytes certs/4096/client-cert.pem | 105 +- certs/ca-cert.der | Bin 1198 -> 1252 bytes certs/ca-cert.pem | 97 +- certs/ca-ecc-cert.der | Bin 655 -> 666 bytes certs/ca-ecc-cert.pem | 51 +- certs/ca-ecc384-cert.der | Bin 715 -> 725 bytes certs/ca-ecc384-cert.pem | 58 +- certs/client-ca.pem | 164 +- certs/client-cert.der | Bin 1230 -> 1282 bytes certs/client-cert.pem | 102 +- certs/client-ecc-cert.der | Bin 780 -> 835 bytes certs/client-ecc-cert.pem | 62 +- certs/client-relative-uri.pem | 101 +- certs/client-uri-cert.pem | 99 +- certs/crl/caEcc384Crl.pem | 31 +- certs/crl/caEccCrl.pem | 28 +- certs/crl/cliCrl.pem | 58 +- certs/crl/crl.pem | 56 +- certs/crl/crl.revoked | 60 +- certs/crl/crl2.pem | 110 +- certs/crl/eccCliCRL.pem | 28 +- certs/crl/eccSrvCRL.pem | 28 +- certs/ecc-privOnlyCert.pem | 14 +- certs/ecc-rsa-server.p12 | Bin 2406 -> 2278 bytes certs/ed448/ca-ed448.der | Bin 659 -> 659 bytes certs/ed448/ca-ed448.pem | 28 +- certs/ed448/client-ed448.der | Bin 882 -> 888 bytes certs/ed448/client-ed448.pem | 40 +- certs/ed448/root-ed448.der | Bin 680 -> 680 bytes certs/ed448/root-ed448.pem | 32 +- certs/ed448/server-ed448-cert.pem | 28 +- certs/ed448/server-ed448.der | Bin 700 -> 700 bytes certs/ed448/server-ed448.pem | 56 +- certs/ocsp/intermediate1-ca-cert.pem | 118 +- certs/ocsp/intermediate2-ca-cert.pem | 118 +- certs/ocsp/intermediate3-ca-cert.pem | 118 +- certs/ocsp/ocsp-responder-cert.pem | 118 +- certs/ocsp/root-ca-cert.pem | 60 +- certs/ocsp/server1-cert.pem | 174 +- certs/ocsp/server2-cert.pem | 174 +- certs/ocsp/server3-cert.pem | 174 +- certs/ocsp/server4-cert.pem | 174 +- certs/ocsp/server5-cert.pem | 174 +- certs/renewcerts/wolfssl.cnf | 2 +- certs/server-cert.der | Bin 1186 -> 1229 bytes certs/server-cert.pem | 174 +- certs/server-ecc-comp.der | Bin 807 -> 861 bytes certs/server-ecc-comp.pem | 62 +- certs/server-ecc-rsa.der | Bin 996 -> 1039 bytes certs/server-ecc-rsa.pem | 77 +- certs/server-ecc.der | Bin 852 -> 677 bytes certs/server-ecc.pem | 65 +- certs/server-revoked-cert.pem | 173 +- certs/test-degenerate.p7b | Bin 1279 -> 1331 bytes certs/test-pathlen/chainA-ICA1-pathlen0.pem | 62 +- certs/test-pathlen/chainA-assembled.pem | 110 +- certs/test-pathlen/chainA-entity.pem | 48 +- certs/test-pathlen/chainB-ICA1-pathlen0.pem | 48 +- certs/test-pathlen/chainB-ICA2-pathlen1.pem | 62 +- certs/test-pathlen/chainB-assembled.pem | 160 +- certs/test-pathlen/chainB-entity.pem | 50 +- certs/test-pathlen/chainC-ICA1-pathlen1.pem | 62 +- certs/test-pathlen/chainC-assembled.pem | 110 +- certs/test-pathlen/chainC-entity.pem | 48 +- certs/test-pathlen/chainD-ICA1-pathlen127.pem | 62 +- certs/test-pathlen/chainD-assembled.pem | 110 +- certs/test-pathlen/chainD-entity.pem | 48 +- certs/test-pathlen/chainE-ICA1-pathlen128.pem | 62 +- certs/test-pathlen/chainE-assembled.pem | 110 +- certs/test-pathlen/chainE-entity.pem | 48 +- certs/test-pathlen/chainF-ICA1-pathlen1.pem | 48 +- certs/test-pathlen/chainF-ICA2-pathlen0.pem | 62 +- certs/test-pathlen/chainF-assembled.pem | 160 +- certs/test-pathlen/chainF-entity.pem | 50 +- certs/test-pathlen/chainG-ICA1-pathlen0.pem | 48 +- certs/test-pathlen/chainG-ICA2-pathlen1.pem | 48 +- certs/test-pathlen/chainG-ICA3-pathlen99.pem | 48 +- certs/test-pathlen/chainG-ICA4-pathlen5.pem | 48 +- certs/test-pathlen/chainG-ICA5-pathlen20.pem | 48 +- certs/test-pathlen/chainG-ICA6-pathlen10.pem | 48 +- certs/test-pathlen/chainG-ICA7-pathlen100.pem | 62 +- certs/test-pathlen/chainG-assembled.pem | 400 +-- certs/test-pathlen/chainG-entity.pem | 50 +- certs/test-pathlen/chainH-ICA1-pathlen0.pem | 48 +- certs/test-pathlen/chainH-ICA2-pathlen2.pem | 48 +- certs/test-pathlen/chainH-ICA3-pathlen2.pem | 48 +- certs/test-pathlen/chainH-ICA4-pathlen2.pem | 62 +- certs/test-pathlen/chainH-assembled.pem | 256 +- certs/test-pathlen/chainH-entity.pem | 50 +- certs/test-pathlen/chainI-ICA1-no_pathlen.pem | 48 +- certs/test-pathlen/chainI-ICA2-no_pathlen.pem | 48 +- certs/test-pathlen/chainI-ICA3-pathlen2.pem | 62 +- certs/test-pathlen/chainI-assembled.pem | 206 +- certs/test-pathlen/chainI-entity.pem | 48 +- certs/test-pathlen/chainJ-ICA1-no_pathlen.pem | 48 +- certs/test-pathlen/chainJ-ICA2-no_pathlen.pem | 48 +- certs/test-pathlen/chainJ-ICA3-no_pathlen.pem | 48 +- certs/test-pathlen/chainJ-ICA4-pathlen2.pem | 62 +- certs/test-pathlen/chainJ-assembled.pem | 254 +- certs/test-pathlen/chainJ-entity.pem | 48 +- certs/test-servercert.p12 | Bin 5277 -> 5421 bytes certs/test/cert-ext-ia.der | Bin 1022 -> 1033 bytes certs/test/cert-ext-nc.der | Bin 1146 -> 1157 bytes certs/test/cert-ext-nct.der | Bin 1054 -> 1054 bytes certs/test/digsigku.pem | 31 +- certs/test/server-cert-ecc-badsig.der | Bin 852 -> 677 bytes certs/test/server-cert-ecc-badsig.pem | 65 +- certs/test/server-cert-rsa-badsig.der | Bin 1186 -> 1229 bytes certs/test/server-cert-rsa-badsig.pem | 174 +- certs/test/server-duplicate-policy.pem | 171 +- src/ssl.c | 3 + tests/api.c | 24 +- wolfcrypt/test/test.c | 8 +- wolfssl/certs_test.h | 2150 +++++++++-------- 123 files changed, 5105 insertions(+), 5034 deletions(-) diff --git a/certs/1024/ca-cert.der b/certs/1024/ca-cert.der index 6a2b06e40268f9a4a902399dc3fadcdde7aa9ce0..5b350c07a944a39425e7eebca8761e7bf6a7d5db 100644 GIT binary patch delta 321 zcmdnV{*GPQpo#ev5C<<{W@2Pw5((tsON&%{IQz|}6N#dxj&prqcD<5E^_gC<7x$r?Zg@bM-~KWOER&VZjGs0DHj)9B3tn8 v&uhMvteAkh_Ia)Siia(mADv6;s4glA;H*9-+i%>o&OTpI(CN<6y*umyhLv}p delta 263 zcmaFIzLQJB#<<`PuFhmDfufS{RrZ8XKA#85KUR92a#@t8s5;mL_iJL?hV81R7PgjrY(m>C)W z8}PDmYPET^edlFlem!66k)Vz4^iTY2)=h8Y`n|%xMEag&;O(=I1T79OnH#p+J?7r7*Xs9k zPt;lM)zO=+wN}Y`>dH?V%zK``IrE9*$_f43uYT(ViS;-!Es4zaG2SxkQn8oZ{F^75 E0U5GO5QW@2Pw65&etI!$-!qvSBV8Ix1PxVQwBXT(mF*dk+OU|?!s zZeVU~Xxf-5MAy)!ogim}_ G@dp5#5qDVt delta 269 zcmey%ev)0npo#e?5bG^qW@2Pw;$+x;S%CT3Tn*-l%3EX%EeuQyjSWqWj14TK#CeSj z4Gay;q1?&sObaJZVO+|}ZqUTYJlT#(k>@fSbEvE`OXF#S#uJmXnfBEqOf%pC$qBQt z8Za|5{x{%dn9>yW}{i4#|{)izaSJZ}nWf6f!l;a(NGl=oNBx$K3T)ex04epo#f15Zg@T*e-2kU|?!sZeVU~XKPaq4S3l&wc0$|zVk9Na=)y81=Xw-O4(v1ibwj5%AHq`Z>bVI%6 z=5zJ;Z?fn$Z*MLL+A1 jth{Cmj%`u;9`SzZ`)_@Yf6w|t=Q48u1|n%v delta 247 zcmcc4zLuTCpow`U5DQJ@*e-2oVPIltY-nm^Y-kWA&TC|7U}#_t;cmQT$H>BH(D-k% zER!P7IX31{S!I^SV+M_fCwnpNtmkC7^*f9A-}%|@20S1+VHQ>cW=6*U2E1&XT5TR} z-+37sxmg*Q8ygw853hG_O-X#dI!a4=ljha53>T@~v_G~RJKijHlt@o9SrT_L^Q^;( zu)6)P_aw?2n?&pj|NCsl-9Yu4?K*o-T0VU`wdtY#&7IQ?{ET(p|G2&7ooVSjoho~! v{-uRi7*ldSwSF&}snfu}#8CDMx7K^>tyJftK4N-aH{$F^4a~ zF%9*LzcH82xf#+a6IhYU?9j10jrsd`g+m*|Bj$I$dvZK$2G>#+zdF55bDzt$EK(2n zsj0cwp)p0`HpGMMh_m>*B;Y0 zvr9IVm(M&=C)WHUT=MFSxV6`xY+UsIrrzgHlaCWie&p`Fc;>;DEr#h5T)Jw3MqV67 z<{Wxu`O`f&C@uukDrs8dZKWLY`^%#gNn_c E0fbiW+yDRo delta 568 zcmZqT`NOSj(8T(~pot}60W%XL6O)KO8~ciFU)~8!biVh{ZRU{)mCrt2oT$8A($L7r zz|_>x#3D+Z*T~4wz|aE9o!rg5aPt(#m5lsa22G4=2C{6-p|X4|Vl0yjm_;WiGM}x- zW~2cRNSQDTs{u13<9`D&5KoYW-+;G?JGCM)w;(4~FF8NgfR~L^tIebBJ1-+6H!A~k z6JsL-%hv}_OS8|vlYDQpbz8-`O@}|(@!D_CjjY{Pmo<^Ub^z^-UvEN80-r7-zV^dM8%+ofe zDVygS+=_HsxIvC#(&Ri|_4D^{oYy{ky66Aa{N_pO3=xs_i?}CluspS*;%{@9|H8b( z546|4x8Y>@Fgu#z^4o1}-{#y}pP14ASnF`BLYmH+yQ$`8hxB*tn2?q?FJh7RwdDpU zPUh?tc35yKvgT;poY12g$9d|f6fgCD{ZW0|)}NW#+S`(@Tk$%ie&D?~vHZ%n-NMyg zq5XB9sh#F-tojo~ig^Qd<(6F8?U$>0t1_>c<6gY_9c7W*)z6uP^^Q-G{9LPdq$_jR z*Ih}6I<}rZK50?c<4l3PqdPVU)NSJ_)H?jKkY`c%ELj~t#f;#b%7 diff --git a/certs/3072/client-cert.pem b/certs/3072/client-cert.pem index 4359a8817..8fe1f1249 100644 --- a/certs/3072/client-cert.pem +++ b/certs/3072/client-cert.pem @@ -2,12 +2,12 @@ Certificate: Data: Version: 3 (0x2) Serial Number: - 2f:06:07:a8:b6:f4:ee:10:91:43:de:e1:46:99:c4:90:79:e6:f1:d1 + 16:65:10:ff:e8:9a:35:33:57:0c:4b:37:e1:21:fe:8e:ca:70:54:e8 Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, O = wolfSSL_3072, OU = Programming-3072, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Jan 22 05:51:48 2020 GMT - Not After : Oct 18 05:51:48 2022 GMT + Not Before: May 7 07:39:04 2020 GMT + Not After : Feb 1 07:39:04 2023 GMT Subject: C = US, ST = Montana, L = Bozeman, O = wolfSSL_3072, OU = Programming-3072, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -46,42 +46,42 @@ Certificate: X509v3 Authority Key Identifier: keyid:3D:D1:84:C2:AF:B0:20:49:BC:74:87:41:38:AB:BA:D2:D4:0C:A3:A8 DirName:/C=US/ST=Montana/L=Bozeman/O=wolfSSL_3072/OU=Programming-3072/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:2F:06:07:A8:B6:F4:EE:10:91:43:DE:E1:46:99:C4:90:79:E6:F1:D1 + serial:16:65:10:FF:E8:9A:35:33:57:0C:4B:37:E1:21:FE:8E:CA:70:54:E8 X509v3 Basic Constraints: CA:TRUE X509v3 Subject Alternative Name: - DNS:example.com + DNS:example.com, IP Address:127.0.0.1 Signature Algorithm: sha256WithRSAEncryption - 04:f5:e0:e5:75:6b:cf:ee:19:ef:3c:b5:b6:78:ce:b2:c3:f2: - 3e:0d:3f:b7:6d:59:7d:b6:7e:6a:91:0f:85:ac:ca:56:30:3c: - 3f:5d:30:10:7c:5e:7f:98:b2:9d:95:04:e1:ee:c0:9e:1b:01: - 39:cb:02:05:b9:9b:02:88:eb:d0:ad:06:d5:39:2d:24:e6:dc: - 4e:ce:8c:36:7d:b6:8e:1d:e8:b7:ef:ff:b4:17:c1:a5:d8:fa: - 34:dd:99:3d:30:4b:45:a2:14:6a:88:93:ca:25:e2:5c:d5:ba: - e8:9d:ef:d7:68:76:05:92:48:19:92:11:79:c2:fe:11:49:4d: - d6:d1:8f:32:1c:5f:3b:41:2c:08:b2:72:65:1c:e5:86:02:94: - b3:9d:30:da:59:42:a1:b0:1e:00:92:93:6e:0d:27:cf:df:d8: - cf:2b:cd:cb:8c:ff:b5:6f:83:92:27:00:58:59:a2:0b:91:b0: - 39:ca:a8:78:fd:83:56:4f:a1:6e:c3:e0:2b:ae:ef:3c:09:04: - f0:9b:5b:00:d3:ed:b6:06:f6:9c:da:af:61:68:8f:e3:2a:c3: - 85:20:66:2c:ac:dd:65:37:36:c2:2f:ba:b8:90:66:6e:9e:58: - a2:4b:d6:a7:30:c8:c9:6c:bd:13:40:a0:ca:59:7c:c5:86:9c: - 55:c5:68:c7:0c:7f:94:73:a5:4b:eb:f1:27:96:b5:f9:69:6b: - 2b:b6:62:d7:3a:0d:40:65:f0:0d:de:91:77:d4:f6:bb:13:7b: - 4a:55:8f:7e:49:65:89:37:46:05:2f:90:14:73:0d:2d:1e:a4: - d4:bb:4e:6d:29:da:79:6e:73:08:de:5f:27:dc:23:14:db:7b: - e7:02:13:2e:c7:94:19:f3:7d:2e:c4:8a:69:ba:f5:ba:62:c2: - 88:b5:cb:c7:92:a2:8a:e3:69:10:6e:c5:b8:b2:10:7e:b6:0c: - 71:2a:c3:e9:71:0c:a2:8b:9a:1d:2c:4e:21:68:53:51:6d:0c: - d2:b4:4b:50:4b:0a + 0f:ca:1c:23:d1:38:62:9d:6e:0c:d8:2d:d8:4a:c7:b5:b4:50: + ac:d7:4b:84:99:47:fb:d5:eb:71:86:30:2a:46:e2:0d:6e:12: + 1d:16:40:f4:53:5c:80:a3:f6:03:75:9c:d9:54:89:1c:51:78: + 6d:03:40:88:bb:66:03:f7:f7:20:c2:b1:57:58:9f:89:ee:e4: + c7:6a:98:0a:a5:04:4e:7e:2e:b2:9d:e7:1d:84:a2:27:50:f9: + 29:29:bd:40:8f:24:03:ae:b4:0c:48:9e:a8:14:1f:59:3d:fc: + 2c:7e:a8:e3:8d:f0:78:96:16:b9:87:45:16:44:b8:13:24:b8: + 41:bf:b1:1c:cb:da:56:9f:d7:dd:b7:0c:06:4d:5e:90:50:2d: + 25:2d:88:32:82:ec:0f:12:af:57:95:4e:71:21:29:dd:d5:ed: + 48:fd:ed:e3:94:a2:80:61:03:e4:13:ed:9b:87:05:7f:d0:4f: + 1b:36:36:bd:c4:4d:19:b7:df:89:a0:d8:89:6b:90:e5:86:7c: + f4:e4:12:cb:e7:86:c9:c7:f8:79:d7:51:4a:09:69:09:6d:a4: + 17:5f:46:48:f7:41:31:33:dc:5e:f7:ef:b1:4b:be:04:3a:78: + e3:bf:61:9a:d4:6d:d1:53:ef:3d:64:bc:b8:4b:75:c4:0a:a9: + e6:09:e3:02:fc:86:a8:28:1e:01:7a:57:38:a8:93:dc:ef:92: + e5:a3:15:ec:77:b8:96:43:32:e0:e3:7f:7d:c6:2b:36:3e:63: + 31:1f:1f:69:c8:7e:16:83:f8:19:d5:98:5e:ad:d7:e4:b1:a2: + ef:d9:2e:f3:89:34:f1:91:74:f8:6d:b9:d1:cc:e0:b4:b4:31: + 67:18:0a:2d:26:51:32:4a:08:32:37:08:2e:76:6f:97:49:b0: + 23:a2:0d:af:89:17:72:9d:a7:24:7f:07:07:67:f4:7e:d6:1c: + 5b:59:88:15:03:81:b1:7d:0d:c7:ce:1a:95:c8:71:b8:1d:8f: + 17:91:c1:21:83:f3 -----BEGIN CERTIFICATE----- -MIIF+DCCBGCgAwIBAgIULwYHqLb07hCRQ97hRpnEkHnm8dEwDQYJKoZIhvcNAQEL +MIIF/jCCBGagAwIBAgIUFmUQ/+iaNTNXDEs34SH+jspwVOgwDQYJKoZIhvcNAQEL BQAwgZ4xCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdC b3plbWFuMRUwEwYDVQQKDAx3b2xmU1NMXzMwNzIxGTAXBgNVBAsMEFByb2dyYW1t aW5nLTMwNzIxGDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJ -ARYQaW5mb0B3b2xmc3NsLmNvbTAeFw0yMDAxMjIwNTUxNDhaFw0yMjEwMTgwNTUx -NDhaMIGeMQswCQYDVQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwH +ARYQaW5mb0B3b2xmc3NsLmNvbTAeFw0yMDA1MDcwNzM5MDRaFw0yMzAyMDEwNzM5 +MDRaMIGeMQswCQYDVQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwH Qm96ZW1hbjEVMBMGA1UECgwMd29sZlNTTF8zMDcyMRkwFwYDVQQLDBBQcm9ncmFt bWluZy0zMDcyMRgwFgYDVQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0B CQEWEGluZm9Ad29sZnNzbC5jb20wggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGK @@ -93,19 +93,20 @@ dNO2BRHyYgZIKvdmzsGF4dIn6soSpZGXPvyUBllRwOcTtod7X9LAVi9eHQLDESzf pMn8+h6KsPQyz1fNoViKSQ+7qR2Gq7mPjVcZslp+pOrMt5Z6OzjN3uBh/MkGj5Na zq0q4y0+OV1BgwEfD+F/dsco2lbvv9wmNUC+rcc4raQGrMroUevA+GgCLJuhFLz4 YYbXVtdz9Ku7aiHTiCK0529/keUOxghJ3uoTWHKgqjr5NgNFV16H0nNlxIyj7snW -c3yWQZMCAwEAAaOCASowggEmMB0GA1UdDgQWBBQ90YTCr7AgSbx0h0E4q7rS1Ayj +c3yWQZMCAwEAAaOCATAwggEsMB0GA1UdDgQWBBQ90YTCr7AgSbx0h0E4q7rS1Ayj qDCB3gYDVR0jBIHWMIHTgBQ90YTCr7AgSbx0h0E4q7rS1AyjqKGBpKSBoTCBnjEL MAkGA1UEBhMCVVMxEDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4x FTATBgNVBAoMDHdvbGZTU0xfMzA3MjEZMBcGA1UECwwQUHJvZ3JhbW1pbmctMzA3 MjEYMBYGA1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZv -QHdvbGZzc2wuY29tghQvBgeotvTuEJFD3uFGmcSQeebx0TAMBgNVHRMEBTADAQH/ -MBYGA1UdEQQPMA2CC2V4YW1wbGUuY29tMA0GCSqGSIb3DQEBCwUAA4IBgQAE9eDl -dWvP7hnvPLW2eM6yw/I+DT+3bVl9tn5qkQ+FrMpWMDw/XTAQfF5/mLKdlQTh7sCe -GwE5ywIFuZsCiOvQrQbVOS0k5txOzow2fbaOHei37/+0F8Gl2Po03Zk9MEtFohRq -iJPKJeJc1brone/XaHYFkkgZkhF5wv4RSU3W0Y8yHF87QSwIsnJlHOWGApSznTDa -WUKhsB4AkpNuDSfP39jPK83LjP+1b4OSJwBYWaILkbA5yqh4/YNWT6Fuw+Arru88 -CQTwm1sA0+22Bvac2q9haI/jKsOFIGYsrN1lNzbCL7q4kGZunliiS9anMMjJbL0T -QKDKWXzFhpxVxWjHDH+Uc6VL6/EnlrX5aWsrtmLXOg1AZfAN3pF31Pa7E3tKVY9+ -SWWJN0YFL5AUcw0tHqTUu05tKdp5bnMI3l8n3CMU23vnAhMux5QZ830uxIppuvW6 -YsKItcvHkqKK42kQbsW4shB+tgxxKsPpcQyii5odLE4haFNRbQzStEtQSwo= +QHdvbGZzc2wuY29tghQWZRD/6Jo1M1cMSzfhIf6OynBU6DAMBgNVHRMEBTADAQH/ +MBwGA1UdEQQVMBOCC2V4YW1wbGUuY29thwR/AAABMA0GCSqGSIb3DQEBCwUAA4IB +gQAPyhwj0ThinW4M2C3YSse1tFCs10uEmUf71etxhjAqRuINbhIdFkD0U1yAo/YD +dZzZVIkcUXhtA0CIu2YD9/cgwrFXWJ+J7uTHapgKpQROfi6ynecdhKInUPkpKb1A +jyQDrrQMSJ6oFB9ZPfwsfqjjjfB4lha5h0UWRLgTJLhBv7Ecy9pWn9fdtwwGTV6Q +UC0lLYgyguwPEq9XlU5xISnd1e1I/e3jlKKAYQPkE+2bhwV/0E8bNja9xE0Zt9+J +oNiJa5Dlhnz05BLL54bJx/h511FKCWkJbaQXX0ZI90ExM9xe9++xS74EOnjjv2Ga +1G3RU+89ZLy4S3XECqnmCeMC/IaoKB4Belc4qJPc75LloxXsd7iWQzLg4399xis2 +PmMxHx9pyH4Wg/gZ1ZherdfksaLv2S7ziTTxkXT4bbnRzOC0tDFnGAotJlEySggy +Nwgudm+XSbAjog2viRdynackfwcHZ/R+1hxbWYgVA4GxfQ3HzhqVyHG4HY8XkcEh +g/M= -----END CERTIFICATE----- diff --git a/certs/4096/client-cert.der b/certs/4096/client-cert.der index c31698f65563655baadeecc0e895fd7c7f2803a1..47218b4b05a75cea9543fb837cc69641efcee2c6 100644 GIT binary patch delta 691 zcmV;k0!;nn4T26MFoFjDFoFc;paTK{0s<5WBY)D;BR&tzRg@(kQG4giKTNNYBeWbc zFfcVRH!wFdIWRO@7Y#BqFfuSPFgG(fFf>||3k0FFlmRIM4=^x-0W2^b1_Mr+KnNp$($XV756o4RB_C0H=gdD$uP_V-163Up1O+ey0RjIo90mhb9T5Z- zFcX3cWq4t2aBO8RV{dJT1b+Yk0h7=K6n~lL=xb`pCzI&V{mgwh9D zA8ZgD3NqHz!S$m4Pzp>+G#p=Mt61#h->c|XGPk07p^5YuYDfJEO453FCL4*jQAB$m z?m{Mz(R!o&UfKq; z3eVn}V}56Okhk`SWZzd|5)KI{HV|(lf{NV9v8DtGLuS7mT#b zwOV%~H9Gh8g>oLI(@HF$OfWk`W9H@&uYX9j3m4?~ z8Y6-kUbD^mNiY1XN)r-WkqV^}qTgYm(5G5PAGsEgmh^^y-n44u%wq;I@*KjtT7bv@ zsR8T{CPZmV!={iWH`GGd|?+#atlDrQ(DnE;X Z990u0;U0y5G|3)+abg#3jRb>EZeflnGphgq delta 676 zcmV;V0$crp4&)6ZFoFi)FoFcgpaTK{0s<5-533`*qZ9{`230iyV}C-u`|?APBeWbb zIWRXcIWRLYHZU?;7Y#BpFf=eUFf%YVFfv+`3k0FFlmRIM4-znf0S+)71_Mr+e=iTKBfO&&2ayI*u`}8P?|-xXMlJGzWbx=p&ti z>Gwwif2&`7^+9iN5z8dlBf@1dw+oL7CR-2on-PDSjg)O#oL+M^6?@|e=m^k1wB;!* z_C9fL^cx^mG(az~o89r;zZV^+ErkKr(y~@om@|d#_M`Sbd-MaOSdPV8t7hmAG#4#1 zHgOEN*?8v${Mt{U`rCBQ>V+ryb*ZgThHmNse*qZ{C`#=HzGZN-21YIxSKn2~j?G)G zW+=FHhrh(f2tPNYBZQw$=tyjhRG<6c`%|Mq;b@AK$@T6&6-LrxGlqr+G_>R|+9)nB zz`b?oEI;CcpC}VUwQQp&vWaCrYf6HZm|U zH83|YH?}k|i4x~EGBz+WFobY7-rdj0-o&V8(8Q=Tc_EV`&lNW2P+4V`#xn+uCnuj{ z+ES0zR0AH6GGP{017=3X{{}K3o*;{;fp8OdYDHphK~Ab(a(-?*OFaVvqX91)r&gOs z+jm|@Ms8LH<|al)h7Hv%C*>Wd?_d_;kBrXO5p|V5!jyk=(sQXhXKwR_*+$+j{PdAy z7TfF9N9$GR-_Od;%f7H;g5^z*{KWdbXWu4tKh9AO+TOND>;HuBxiRjUpL^fUD@%&0 z-mLW0@0{8H^kv@pnf)%y@@2E;Y|xv@wfs-y^yH;A<#)>ym$hYW zGBRe{vgg#gL&y8>wBA{B=(+aqodMZbqWN0fheK39bnkFoFcCFoFY;paTK{0s;vDhX3`B5Z<`^kt3=bF*qd|163U(1cAXYfxeU50<;(j0EYkd zju76s`!Ea!163Up1O+ey0RjJ$&;t~Io+yZN0Ltd)m&(EMAD$AjxW`fIDB(7>E#@x> zBg?5uhb6{ciAC!50GOYw(J4FQZoz0 z{zKEoq>e9#e|kjf%2RBG?PYdzF#}HOy){%5^JIr>-!$Dcp@=)%O|KhdkdkpQj>ydA ZU?i_G7CAGKQ2DE9LUejH+1q1n?^etWBvnaGpY16C6yR!JKf7?>KE z8<-ng8kj_h^BNf&7#SEsxEt^0Gde$Mcf5F&bK7*88X1Rgn-<>J2xnNFq_T(1E%g!IF&!`kj+9zhbJ;4>?wPQ`?djX?~K{|H(16IXL9Gw1@Ns-~E lcXE3EY|WL|vy*4fm~Yf%cI(5+?}1yUuln`t?)&#%>i|xSH0uBW diff --git a/certs/ca-ecc-cert.pem b/certs/ca-ecc-cert.pem index c613f7694..b1e7b8bd7 100644 --- a/certs/ca-ecc-cert.pem +++ b/certs/ca-ecc-cert.pem @@ -1,17 +1,18 @@ Certificate: Data: Version: 3 (0x2) - Serial Number: 18234557164704975011 (0xfd0e292166cb48a3) - Signature Algorithm: ecdsa-with-SHA256 - Issuer: C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Development, CN=www.wolfssl.com/emailAddress=info@wolfssl.com + Serial Number: + 43:b5:59:67:bc:60:48:29:8c:82:77:db:b5:42:36:14:e4:85:c0:3a + Signature Algorithm: ecdsa-with-SHA256 + Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Development, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Apr 13 15:23:10 2018 GMT - Not After : Jan 7 15:23:10 2021 GMT - Subject: C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Development, CN=www.wolfssl.com/emailAddress=info@wolfssl.com + Not Before: May 7 07:39:04 2020 GMT + Not After : Feb 1 07:39:04 2023 GMT + Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Development, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: id-ecPublicKey Public-Key: (256 bit) - pub: + pub: 04:02:d3:d9:6e:d6:01:8e:45:c8:b9:90:31:e5:c0: 4c:e3:9e:ad:29:38:98:ba:10:d6:e9:09:2a:80:a9: 2e:17:2a:b9:8a:bf:33:83:46:e3:95:0b:e4:77:40: @@ -30,23 +31,23 @@ Certificate: X509v3 Key Usage: critical Digital Signature, Certificate Sign, CRL Sign Signature Algorithm: ecdsa-with-SHA256 - 30:46:02:21:00:f0:7b:cc:24:73:19:3f:61:68:ed:c8:0a:54: - 4a:b8:ac:79:ef:10:32:91:52:2c:3e:bf:50:aa:5f:18:c1:97: - f5:02:21:00:d9:4b:63:67:6f:9b:29:a9:d7:6b:63:9b:98:9f: - 32:82:36:da:f0:a9:f7:51:b4:97:aa:fa:fa:dd:ef:ef:4a:ae + 30:46:02:21:00:e4:87:41:d1:d5:09:b6:97:1c:7c:1c:40:f6: + b2:a1:df:28:57:00:a3:62:2b:d8:0b:e7:f3:d4:24:56:52:62: + 85:02:21:00:cd:0a:3f:60:ca:33:b5:a9:1f:4b:43:2c:60:08: + fd:3e:bd:c4:30:5c:ff:2c:d4:58:ac:77:21:c6:2e:39:d9:11 -----BEGIN CERTIFICATE----- -MIICizCCAjCgAwIBAgIJAP0OKSFmy0ijMAoGCCqGSM49BAMCMIGXMQswCQYDVQQG -EwJVUzETMBEGA1UECAwKV2FzaGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEQMA4G -A1UECgwHd29sZlNTTDEUMBIGA1UECwwLRGV2ZWxvcG1lbnQxGDAWBgNVBAMMD3d3 -dy53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbTAe -Fw0xODA0MTMxNTIzMTBaFw0yMTAxMDcxNTIzMTBaMIGXMQswCQYDVQQGEwJVUzET -MBEGA1UECAwKV2FzaGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEQMA4GA1UECgwH -d29sZlNTTDEUMBIGA1UECwwLRGV2ZWxvcG1lbnQxGDAWBgNVBAMMD3d3dy53b2xm -c3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbTBZMBMGByqG -SM49AgEGCCqGSM49AwEHA0IABALT2W7WAY5FyLmQMeXATOOerSk4mLoQ1ukJKoCp -LhcquYq/M4NG45UL5HdAtTtDRTMPYVN8N0TBy/yAyuhD6qejYzBhMB0GA1UdDgQW -BBRWjprD8ELeGLlFVW75k8/qw/OlITAfBgNVHSMEGDAWgBRWjprD8ELeGLlFVW75 -k8/qw/OlITAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAKBggqhkjO -PQQDAgNJADBGAiEA8HvMJHMZP2Fo7cgKVEq4rHnvEDKRUiw+v1CqXxjBl/UCIQDZ -S2Nnb5spqddrY5uYnzKCNtrwqfdRtJeq+vrd7+9Krg== +MIICljCCAjugAwIBAgIUQ7VZZ7xgSCmMgnfbtUI2FOSFwDowCgYIKoZIzj0EAwIw +gZcxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdT +ZWF0dGxlMRAwDgYDVQQKDAd3b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEY +MBYGA1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdv +bGZzc2wuY29tMB4XDTIwMDUwNzA3MzkwNFoXDTIzMDIwMTA3MzkwNFowgZcxCzAJ +BgNVBAYTAlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxl +MRAwDgYDVQQKDAd3b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEYMBYGA1UE +AwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu +Y29tMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEAtPZbtYBjkXIuZAx5cBM456t +KTiYuhDW6QkqgKkuFyq5ir8zg0bjlQvkd0C1O0NFMw9hU3w3RMHL/IDK6EPqp6Nj +MGEwHQYDVR0OBBYEFFaOmsPwQt4YuUVVbvmTz+rD86UhMB8GA1UdIwQYMBaAFFaO +msPwQt4YuUVVbvmTz+rD86UhMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD +AgGGMAoGCCqGSM49BAMCA0kAMEYCIQDkh0HR1Qm2lxx8HED2sqHfKFcAo2Ir2Avn +89QkVlJihQIhAM0KP2DKM7WpH0tDLGAI/T69xDBc/yzUWKx3IcYuOdkR -----END CERTIFICATE----- diff --git a/certs/ca-ecc384-cert.der b/certs/ca-ecc384-cert.der index 756876f9e5c1b1aacca05f8254ccb49e759cfe55..d39d55c83a08f81c6a02c1c3b3e34042a74b16d2 100644 GIT binary patch delta 180 zcmV;l089VN1=R&3FoFWnFoFVDpaTK{0s<6ri23Aw#*|3UwXU{H%PGL57r?+e_&H delta 174 zcmcc0dYV$&@}ny+TW4+Phs>+Fk!L88RFwmP{*)o4+`<)$#rIYTM-88HF?R=iFWq7o4{s ZLojtuMTth{@szn8pKcto)nsl~1^`i-L-+sy diff --git a/certs/ca-ecc384-cert.pem b/certs/ca-ecc384-cert.pem index b17122ad7..ceb32ad86 100644 --- a/certs/ca-ecc384-cert.pem +++ b/certs/ca-ecc384-cert.pem @@ -1,17 +1,18 @@ Certificate: Data: Version: 3 (0x2) - Serial Number: 18174562873897217159 (0xfc3904a40ea56c87) - Signature Algorithm: ecdsa-with-SHA384 - Issuer: C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Development, CN=www.wolfssl.com/emailAddress=info@wolfssl.com + Serial Number: + 72:88:f9:e4:7d:c6:94:48:cf:b5:ae:b6:4b:cb:29:d2:00:71:de:db + Signature Algorithm: ecdsa-with-SHA384 + Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Development, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Apr 13 15:23:10 2018 GMT - Not After : Jan 7 15:23:10 2021 GMT - Subject: C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Development, CN=www.wolfssl.com/emailAddress=info@wolfssl.com + Not Before: May 7 07:39:04 2020 GMT + Not After : Feb 1 07:39:04 2023 GMT + Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Development, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: id-ecPublicKey Public-Key: (384 bit) - pub: + pub: 04:ee:82:d4:39:9a:b1:27:82:f4:d7:ea:c6:bc:03: 1d:4d:83:61:f4:03:ae:7e:bd:d8:5a:a5:b9:f0:8e: a2:a5:da:ce:87:3b:5a:ab:44:16:9c:f5:9f:62:dd: @@ -32,26 +33,27 @@ Certificate: X509v3 Key Usage: critical Digital Signature, Certificate Sign, CRL Sign Signature Algorithm: ecdsa-with-SHA384 - 30:65:02:30:0d:0a:62:fb:e6:3a:fe:71:d8:2b:44:e5:97:34: - 04:a9:8c:0a:99:88:a0:bd:1f:b0:df:94:59:27:bb:2b:c6:2a: - be:a4:69:1b:cf:97:78:2a:28:96:ee:ba:d4:87:45:fd:02:31: - 00:c0:73:19:66:76:5e:9f:a3:65:85:41:ef:b7:7b:3d:63:6d: - 98:71:99:6f:9c:db:a8:5e:53:6e:a0:68:11:65:bc:78:74:28: - 69:c7:64:9d:88:f2:d8:c2:3d:29:03:83:23 + 30:64:02:30:5e:af:51:ec:81:c8:8d:72:75:66:07:53:cc:05: + 4e:45:28:9b:a3:2a:7f:34:e4:a8:64:82:c5:66:05:17:87:9d: + c7:f9:53:c8:cd:83:90:96:b3:34:93:83:26:5d:ab:fc:02:30: + 4a:57:60:83:50:85:b8:fd:c2:41:39:d4:b0:4f:d8:80:f5:5f: + 42:a8:9a:a8:d0:14:1e:07:48:d7:02:cc:ba:58:b1:1e:cf:fe: + ba:75:12:73:74:84:c6:1d:e2:41:86:94 -----BEGIN CERTIFICATE----- -MIICxzCCAk2gAwIBAgIJAPw5BKQOpWyHMAoGCCqGSM49BAMDMIGXMQswCQYDVQQG -EwJVUzETMBEGA1UECAwKV2FzaGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEQMA4G -A1UECgwHd29sZlNTTDEUMBIGA1UECwwLRGV2ZWxvcG1lbnQxGDAWBgNVBAMMD3d3 -dy53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbTAe -Fw0xODA0MTMxNTIzMTBaFw0yMTAxMDcxNTIzMTBaMIGXMQswCQYDVQQGEwJVUzET -MBEGA1UECAwKV2FzaGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEQMA4GA1UECgwH -d29sZlNTTDEUMBIGA1UECwwLRGV2ZWxvcG1lbnQxGDAWBgNVBAMMD3d3dy53b2xm -c3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbTB2MBAGByqG -SM49AgEGBSuBBAAiA2IABO6C1DmasSeC9NfqxrwDHU2DYfQDrn692FqlufCOoqXa -zoc7WqtEFpz1n2Ld9iDNnHY8QLE/lxffWfbN3s1GNcDtXi5ItmaRcXS3DD+5mreD -vZM/X1AtcD/eNSXhkDuG4KNjMGEwHQYDVR0OBBYEFKvgwyZMGNRyu9KEjJwKBZKA -ElNSMB8GA1UdIwQYMBaAFKvgwyZMGNRyu9KEjJwKBZKAElNSMA8GA1UdEwEB/wQF -MAMBAf8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMDA2gAMGUCMA0KYvvmOv5x -2CtE5Zc0BKmMCpmIoL0fsN+UWSe7K8YqvqRpG8+XeCoolu661IdF/QIxAMBzGWZ2 -Xp+jZYVB77d7PWNtmHGZb5zbqF5TbqBoEWW8eHQoacdknYjy2MI9KQODIw== +MIIC0TCCAligAwIBAgIUcoj55H3GlEjPta62S8sp0gBx3tswCgYIKoZIzj0EAwMw +gZcxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdT +ZWF0dGxlMRAwDgYDVQQKDAd3b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEY +MBYGA1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdv +bGZzc2wuY29tMB4XDTIwMDUwNzA3MzkwNFoXDTIzMDIwMTA3MzkwNFowgZcxCzAJ +BgNVBAYTAlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxl +MRAwDgYDVQQKDAd3b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEYMBYGA1UE +AwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu +Y29tMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE7oLUOZqxJ4L01+rGvAMdTYNh9AOu +fr3YWqW58I6ipdrOhztaq0QWnPWfYt32IM2cdjxAsT+XF99Z9s3ezUY1wO1eLki2 +ZpFxdLcMP7mat4O9kz9fUC1wP941JeGQO4bgo2MwYTAdBgNVHQ4EFgQUq+DDJkwY +1HK70oSMnAoFkoASU1IwHwYDVR0jBBgwFoAUq+DDJkwY1HK70oSMnAoFkoASU1Iw +DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwCgYIKoZIzj0EAwMDZwAw +ZAIwXq9R7IHIjXJ1ZgdTzAVORSiboyp/NOSoZILFZgUXh53H+VPIzYOQlrM0k4Mm +Xav8AjBKV2CDUIW4/cJBOdSwT9iA9V9CqJqo0BQeB0jXAsy6WLEez/66dRJzdITG +HeJBhpQ= -----END CERTIFICATE----- diff --git a/certs/client-ca.pem b/certs/client-ca.pem index 795d5f7ab..951d3c88d 100644 --- a/certs/client-ca.pem +++ b/certs/client-ca.pem @@ -1,16 +1,17 @@ Certificate: Data: Version: 3 (0x2) - Serial Number: 12305170416376042871 (0xaac4bf4c50bd5577) - Signature Algorithm: sha256WithRSAEncryption - Issuer: C=US, ST=Montana, L=Bozeman, O=wolfSSL_2048, OU=Programming-2048, CN=www.wolfssl.com/emailAddress=info@wolfssl.com + Serial Number: + 6f:b0:b4:88:a8:2e:e4:23:a4:dc:af:14:4c:33:40:79:52:47:ef:97 + Signature Algorithm: sha256WithRSAEncryption + Issuer: C = US, ST = Montana, L = Bozeman, O = wolfSSL_2048, OU = Programming-2048, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Apr 13 15:23:09 2018 GMT - Not After : Jan 7 15:23:09 2021 GMT - Subject: C=US, ST=Montana, L=Bozeman, O=wolfSSL_2048, OU=Programming-2048, CN=www.wolfssl.com/emailAddress=info@wolfssl.com + Not Before: May 7 07:39:03 2020 GMT + Not After : Feb 1 07:39:03 2023 GMT + Subject: C = US, ST = Montana, L = Bozeman, O = wolfSSL_2048, OU = Programming-2048, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption - Public-Key: (2048 bit) + RSA Public-Key: (2048 bit) Modulus: 00:c3:03:d1:2b:fe:39:a4:32:45:3b:53:c8:84:2b: 2a:7c:74:9a:bd:aa:2a:52:07:47:d6:a6:36:b2:07: @@ -37,68 +38,72 @@ Certificate: X509v3 Authority Key Identifier: keyid:33:D8:45:66:D7:68:87:18:7E:54:0D:70:27:91:C7:26:D7:85:65:C0 DirName:/C=US/ST=Montana/L=Bozeman/O=wolfSSL_2048/OU=Programming-2048/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:AA:C4:BF:4C:50:BD:55:77 + serial:6F:B0:B4:88:A8:2E:E4:23:A4:DC:AF:14:4C:33:40:79:52:47:EF:97 X509v3 Basic Constraints: CA:TRUE + X509v3 Subject Alternative Name: + DNS:example.com, IP Address:127.0.0.1 Signature Algorithm: sha256WithRSAEncryption - 80:52:54:61:2a:77:80:53:44:a9:80:6d:45:ff:0d:25:7d:1a: - 8f:23:93:53:74:35:12:6f:f0:2e:20:ea:ed:80:63:69:88:e6: - 0c:a1:49:30:e0:82:db:68:0f:7e:84:ac:ff:ff:7b:42:fa:7e: - 2f:b2:52:9f:d2:79:5e:35:12:27:36:bc:df:96:58:44:96:55: - c8:4a:94:02:5f:4a:9d:dc:d3:3a:f7:6d:ac:8b:79:6e:fc:be: - 8f:23:58:6a:8a:f5:38:0a:42:f6:98:74:88:53:2e:02:af:e1: - 0e:be:6f:cc:74:33:7c:ec:b4:cb:a7:49:6d:82:42:4f:eb:73: - 29:c3:32:00:2b:15:f8:88:7a:8f:6d:20:1b:ae:65:5f:c5:d0: - 8a:d1:e2:64:6d:a3:a8:fe:64:e1:a9:5b:e6:d0:23:d6:02:72: - 5a:ec:03:8e:87:67:19:8d:e4:a8:99:15:c1:3d:91:48:99:8d: - fe:ae:1c:bf:f6:28:1b:45:be:ad:ef:72:83:9a:f6:c7:3b:51: - a3:6e:7a:73:bd:83:aa:97:fd:63:b4:f4:6b:1c:14:81:9a:ef: - 14:24:d3:e1:8b:f4:04:04:84:54:0f:61:a2:a8:f2:50:37:0c: - 17:0c:bc:e0:c2:84:85:f4:0b:ae:00:ca:9f:27:e2:44:4f:15: - 0b:8b:1d:b4 + 33:fe:14:e8:37:91:19:d4:15:bf:53:81:48:b9:21:3a:9b:0a: + 8a:4a:02:59:89:2b:37:8f:54:c8:33:41:8f:3f:4b:80:31:62: + fc:73:bd:64:04:24:c7:c1:f9:f0:da:21:0b:5d:f1:11:c8:3a: + 12:88:a0:84:57:43:d9:df:16:c3:b2:d9:f6:48:5c:be:22:23: + e0:de:0f:a7:51:22:67:38:9a:26:37:6a:cc:9e:77:8f:50:0d: + e8:f2:e0:d8:74:47:ea:7e:7f:00:a9:01:e4:54:c7:b0:f5:56: + ea:7d:b7:2d:4e:2e:ff:4e:38:a1:ee:f8:4d:90:cd:1e:dc:43: + 44:66:a4:00:d8:b7:5d:3b:6f:da:d1:90:e3:5a:43:b9:30:de: + 52:a2:ce:84:89:da:fc:02:f5:87:38:14:84:14:6f:8b:49:15: + 33:aa:1f:04:5b:42:ec:02:7e:b2:5c:9b:62:5b:67:43:f4:f7: + ec:e5:52:e9:0e:04:83:23:64:ca:a5:dc:3d:d6:e7:a7:6a:3e: + bd:de:f5:58:a7:04:5e:cd:75:74:c2:12:eb:49:1a:d6:8f:38: + 60:df:1a:5e:30:ad:d6:45:56:29:ab:0a:53:d7:66:d9:b4:ab: + 5b:5b:2a:22:4a:19:f4:42:aa:d3:de:dc:b4:9f:1d:25:b7:91: + ca:3d:07:9d -----BEGIN CERTIFICATE----- -MIIEyjCCA7KgAwIBAgIJAKrEv0xQvVV3MA0GCSqGSIb3DQEBCwUAMIGeMQswCQYD -VQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjEVMBMG -A1UECgwMd29sZlNTTF8yMDQ4MRkwFwYDVQQLDBBQcm9ncmFtbWluZy0yMDQ4MRgw -FgYDVQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29s -ZnNzbC5jb20wHhcNMTgwNDEzMTUyMzA5WhcNMjEwMTA3MTUyMzA5WjCBnjELMAkG -A1UEBhMCVVMxEDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xFTAT -BgNVBAoMDHdvbGZTU0xfMjA0ODEZMBcGA1UECwwQUHJvZ3JhbW1pbmctMjA0ODEY -MBYGA1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdv -bGZzc2wuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwwPRK/45 -pDJFO1PIhCsqfHSavaoqUgdH1qY2sgcyjtC6aXvGw0Se1IFI/S1oootnu6F1yDYs -StIb94u6zw357+zxgR57mwNHmr9lzH9lJGmm6BSJW+Q098WwFJP1Z3s6enjhAVZW -kaYTQo3SPECcTO/Rht83URsMoTv18aNKNeThzpbfG36/TpfQEOioCDCBryALQxTF -dGe0MoJvjYbCiECZNoO6HkByIhfXUmUkc7DO7xnNrv94bHvAEgPUTnINUG07ozuj -mV6dyNkMhbPZitlUJttt+qy7/yVMxNF59HHThkAYE7BjtXJOMMSXhIYtVi/XFfd/ -wK71/Fvl+6G60wIDAQABo4IBBzCCAQMwHQYDVR0OBBYEFDPYRWbXaIcYflQNcCeR -xybXhWXAMIHTBgNVHSMEgcswgciAFDPYRWbXaIcYflQNcCeRxybXhWXAoYGkpIGh -MIGeMQswCQYDVQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96 -ZW1hbjEVMBMGA1UECgwMd29sZlNTTF8yMDQ4MRkwFwYDVQQLDBBQcm9ncmFtbWlu -Zy0yMDQ4MRgwFgYDVQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEW -EGluZm9Ad29sZnNzbC5jb22CCQCqxL9MUL1VdzAMBgNVHRMEBTADAQH/MA0GCSqG -SIb3DQEBCwUAA4IBAQCAUlRhKneAU0SpgG1F/w0lfRqPI5NTdDUSb/AuIOrtgGNp -iOYMoUkw4ILbaA9+hKz//3tC+n4vslKf0nleNRInNrzfllhEllXISpQCX0qd3NM6 -922si3lu/L6PI1hqivU4CkL2mHSIUy4Cr+EOvm/MdDN87LTLp0ltgkJP63MpwzIA -KxX4iHqPbSAbrmVfxdCK0eJkbaOo/mThqVvm0CPWAnJa7AOOh2cZjeSomRXBPZFI -mY3+rhy/9igbRb6t73KDmvbHO1GjbnpzvYOql/1jtPRrHBSBmu8UJNPhi/QEBIRU -D2GiqPJQNwwXDLzgwoSF9AuuAMqfJ+JETxULix20 +MIIE/jCCA+agAwIBAgIUb7C0iKgu5COk3K8UTDNAeVJH75cwDQYJKoZIhvcNAQEL +BQAwgZ4xCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdC +b3plbWFuMRUwEwYDVQQKDAx3b2xmU1NMXzIwNDgxGTAXBgNVBAsMEFByb2dyYW1t +aW5nLTIwNDgxGDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJ +ARYQaW5mb0B3b2xmc3NsLmNvbTAeFw0yMDA1MDcwNzM5MDNaFw0yMzAyMDEwNzM5 +MDNaMIGeMQswCQYDVQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwH +Qm96ZW1hbjEVMBMGA1UECgwMd29sZlNTTF8yMDQ4MRkwFwYDVQQLDBBQcm9ncmFt +bWluZy0yMDQ4MRgwFgYDVQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0B +CQEWEGluZm9Ad29sZnNzbC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQDDA9Er/jmkMkU7U8iEKyp8dJq9qipSB0fWpjayBzKO0Lppe8bDRJ7UgUj9 +LWiii2e7oXXINixK0hv3i7rPDfnv7PGBHnubA0eav2XMf2UkaaboFIlb5DT3xbAU +k/Vnezp6eOEBVlaRphNCjdI8QJxM79GG3zdRGwyhO/Xxo0o15OHOlt8bfr9Ol9AQ +6KgIMIGvIAtDFMV0Z7Qygm+NhsKIQJk2g7oeQHIiF9dSZSRzsM7vGc2u/3hse8AS +A9ROcg1QbTujO6OZXp3I2QyFs9mK2VQm2236rLv/JUzE0Xn0cdOGQBgTsGO1ck4w +xJeEhi1WL9cV93/ArvX8W+X7obrTAgMBAAGjggEwMIIBLDAdBgNVHQ4EFgQUM9hF +Ztdohxh+VA1wJ5HHJteFZcAwgd4GA1UdIwSB1jCB04AUM9hFZtdohxh+VA1wJ5HH +JteFZcChgaSkgaEwgZ4xCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAw +DgYDVQQHDAdCb3plbWFuMRUwEwYDVQQKDAx3b2xmU1NMXzIwNDgxGTAXBgNVBAsM +EFByb2dyYW1taW5nLTIwNDgxGDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEfMB0G +CSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIUb7C0iKgu5COk3K8UTDNAeVJH +75cwDAYDVR0TBAUwAwEB/zAcBgNVHREEFTATggtleGFtcGxlLmNvbYcEfwAAATAN +BgkqhkiG9w0BAQsFAAOCAQEAM/4U6DeRGdQVv1OBSLkhOpsKikoCWYkrN49UyDNB +jz9LgDFi/HO9ZAQkx8H58NohC13xEcg6EoighFdD2d8Ww7LZ9khcviIj4N4Pp1Ei +ZziaJjdqzJ53j1AN6PLg2HRH6n5/AKkB5FTHsPVW6n23LU4u/044oe74TZDNHtxD +RGakANi3XTtv2tGQ41pDuTDeUqLOhIna/AL1hzgUhBRvi0kVM6ofBFtC7AJ+slyb +YltnQ/T37OVS6Q4EgyNkyqXcPdbnp2o+vd71WKcEXs11dMIS60ka1o84YN8aXjCt +1kVWKasKU9dm2bSrW1sqIkoZ9EKq097ctJ8dJbeRyj0HnQ== -----END CERTIFICATE----- Certificate: Data: Version: 3 (0x2) - Serial Number: 10646345548447194541 (0x93bf6ade9b419dad) - Signature Algorithm: ecdsa-with-SHA256 - Issuer: C=US, ST=Oregon, L=Salem, O=Client ECC, OU=Fast, CN=www.wolfssl.com/emailAddress=info@wolfssl.com + Serial Number: + 15:7a:fc:3f:63:cb:8d:db:76:d2:2a:71:25:78:b6:f5:cf:38:51:1c + Signature Algorithm: ecdsa-with-SHA256 + Issuer: C = US, ST = Oregon, L = Salem, O = Client ECC, OU = Fast, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Apr 13 15:23:10 2018 GMT - Not After : Jan 7 15:23:10 2021 GMT - Subject: C=US, ST=Oregon, L=Salem, O=Client ECC, OU=Fast, CN=www.wolfssl.com/emailAddress=info@wolfssl.com + Not Before: May 7 07:39:04 2020 GMT + Not After : Feb 1 07:39:04 2023 GMT + Subject: C = US, ST = Oregon, L = Salem, O = Client ECC, OU = Fast, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: id-ecPublicKey Public-Key: (256 bit) - pub: + pub: 04:55:bf:f4:0f:44:50:9a:3d:ce:9b:b7:f0:c5:4d: f5:70:7b:d4:ec:24:8e:19:80:ec:5a:4c:a2:24:03: 62:2c:9b:da:ef:a2:35:12:43:84:76:16:c6:56:95: @@ -112,31 +117,34 @@ Certificate: X509v3 Authority Key Identifier: keyid:EB:D4:4B:59:6B:95:61:3F:51:57:B6:04:4D:89:41:88:44:5C:AB:F2 DirName:/C=US/ST=Oregon/L=Salem/O=Client ECC/OU=Fast/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:93:BF:6A:DE:9B:41:9D:AD + serial:15:7A:FC:3F:63:CB:8D:DB:76:D2:2A:71:25:78:B6:F5:CF:38:51:1C X509v3 Basic Constraints: CA:TRUE + X509v3 Subject Alternative Name: + DNS:example.com, IP Address:127.0.0.1 Signature Algorithm: ecdsa-with-SHA256 - 30:44:02:20:61:bc:9d:4d:88:64:86:b8:71:aa:35:59:68:b8: - ee:2c:f3:23:b5:1a:b9:ba:41:50:a8:c6:c3:58:eb:58:bd:60: - 02:20:61:aa:eb:b5:73:0d:01:db:69:8f:52:f5:72:6d:37:42: - b5:fd:94:b6:6e:b1:c4:25:2e:96:96:f3:39:b2:5d:ea + 30:45:02:21:00:9d:66:d9:5e:ea:33:82:61:20:17:fa:3e:55: + c5:e1:45:fc:64:8c:9d:57:06:77:16:6c:c8:04:a6:3a:9e:b1: + 61:02:20:05:b9:c0:2b:6b:21:0e:45:6b:2d:b4:15:62:80:28: + 2a:f1:b3:e0:4d:d2:68:ae:8a:4e:2e:5b:83:e2:3d:04:b1 -----BEGIN CERTIFICATE----- -MIIDCDCCAq+gAwIBAgIJAJO/at6bQZ2tMAoGCCqGSM49BAMCMIGNMQswCQYDVQQG -EwJVUzEPMA0GA1UECAwGT3JlZ29uMQ4wDAYDVQQHDAVTYWxlbTETMBEGA1UECgwK -Q2xpZW50IEVDQzENMAsGA1UECwwERmFzdDEYMBYGA1UEAwwPd3d3LndvbGZzc2wu -Y29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMB4XDTE4MDQxMzE1 -MjMxMFoXDTIxMDEwNzE1MjMxMFowgY0xCzAJBgNVBAYTAlVTMQ8wDQYDVQQIDAZP -cmVnb24xDjAMBgNVBAcMBVNhbGVtMRMwEQYDVQQKDApDbGllbnQgRUNDMQ0wCwYD -VQQLDARGYXN0MRgwFgYDVQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0B -CQEWEGluZm9Ad29sZnNzbC5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARV -v/QPRFCaPc6bt/DFTfVwe9TsJI4ZgOxaTKIkA2Ism9rvojUSQ4R2FsZWlQbMAam9 -9nUaQve9qbI2Il/HXX+0o4H1MIHyMB0GA1UdDgQWBBTr1EtZa5VhP1FXtgRNiUGI -RFyr8jCBwgYDVR0jBIG6MIG3gBTr1EtZa5VhP1FXtgRNiUGIRFyr8qGBk6SBkDCB -jTELMAkGA1UEBhMCVVMxDzANBgNVBAgMBk9yZWdvbjEOMAwGA1UEBwwFU2FsZW0x -EzARBgNVBAoMCkNsaWVudCBFQ0MxDTALBgNVBAsMBEZhc3QxGDAWBgNVBAMMD3d3 -dy53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIJ -AJO/at6bQZ2tMAwGA1UdEwQFMAMBAf8wCgYIKoZIzj0EAwIDRwAwRAIgYbydTYhk -hrhxqjVZaLjuLPMjtRq5ukFQqMbDWOtYvWACIGGq67VzDQHbaY9S9XJtN0K1/ZS2 -brHEJS6WlvM5sl3q +MIIDPzCCAuWgAwIBAgIUFXr8P2PLjdt20ipxJXi29c84URwwCgYIKoZIzj0EAwIw +gY0xCzAJBgNVBAYTAlVTMQ8wDQYDVQQIDAZPcmVnb24xDjAMBgNVBAcMBVNhbGVt +MRMwEQYDVQQKDApDbGllbnQgRUNDMQ0wCwYDVQQLDARGYXN0MRgwFgYDVQQDDA93 +d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20w +HhcNMjAwNTA3MDczOTA0WhcNMjMwMjAxMDczOTA0WjCBjTELMAkGA1UEBhMCVVMx +DzANBgNVBAgMBk9yZWdvbjEOMAwGA1UEBwwFU2FsZW0xEzARBgNVBAoMCkNsaWVu +dCBFQ0MxDTALBgNVBAsMBEZhc3QxGDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEf +MB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbTBZMBMGByqGSM49AgEGCCqG +SM49AwEHA0IABFW/9A9EUJo9zpu38MVN9XB71OwkjhmA7FpMoiQDYiyb2u+iNRJD +hHYWxlaVBswBqb32dRpC972psjYiX8ddf7SjggEfMIIBGzAdBgNVHQ4EFgQU69RL +WWuVYT9RV7YETYlBiERcq/Iwgc0GA1UdIwSBxTCBwoAU69RLWWuVYT9RV7YETYlB +iERcq/KhgZOkgZAwgY0xCzAJBgNVBAYTAlVTMQ8wDQYDVQQIDAZPcmVnb24xDjAM +BgNVBAcMBVNhbGVtMRMwEQYDVQQKDApDbGllbnQgRUNDMQ0wCwYDVQQLDARGYXN0 +MRgwFgYDVQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9A +d29sZnNzbC5jb22CFBV6/D9jy43bdtIqcSV4tvXPOFEcMAwGA1UdEwQFMAMBAf8w +HAYDVR0RBBUwE4ILZXhhbXBsZS5jb22HBH8AAAEwCgYIKoZIzj0EAwIDSAAwRQIh +AJ1m2V7qM4JhIBf6PlXF4UX8ZIydVwZ3FmzIBKY6nrFhAiAFucArayEORWsttBVi +gCgq8bPgTdJoropOLluD4j0EsQ== -----END CERTIFICATE----- diff --git a/certs/client-cert.der b/certs/client-cert.der index 5241ec374ff59f34874f21debcc99b1e6499953a..65d8a18f9f4827b50055a62c111ccccf318f3180 100644 GIT binary patch delta 456 zcmX@d*~F!6(8Ti3po#g}0%j&gCMJ>m4O==^=si(ha%a7WkFi5#ko)`T6D79D7#SFt z8kifH8(SI}M~U+q85eydIknY z170>xtu~Lg@4SqR+^h`DO^l2T#{WcKm`{|vBDz1g(PO8g)oiXVFQ&*&ZS($+6UL7H z_TCMKNq>s>rm(2gA3yl>!!1Sb*pGrItb{riw1hj~yf1cm)6H)lG5eI1AKc?#9;lRV zF-y%n>&(3J{s7(=pB~&Oaeq};&#;p5NyzaHU&CJ2ZrAnG`|oG5@ZAsJ31{W*IJ=}R zVYsn9);j;z#R-q2oOc@B3tDuprSsMwrmyW5A}u2M-JYVxtK?ato!*2q)oqHIofMt! z{N?+br$I0ISelhnPA$D-d+qu1EW5q;zD6u(i91_ba!Ba4r_{B6i-h}9aRzIzxrS-3 k<_f-^c5}<>=x8k^FUc=Xt1jQWvt_=l>h_7JY}w}m0Ma|Swg3PC delta 412 zcmZqTI>#wt(8O}epow|Y0%j&gCMHgXRY&&w1ndnhpQyY=#?ZpR#L(E#)X3PtGD@7+ z$k4#hz#Ph*%+0)T^Atu+Mt*jKCProhSvKZSSw0pqmdPKOMEMLFFN65XERClP8c$4q z&$O=|VYC4cNKTlA)qt6i@xK8t8>d#AN85K^Mn-N{2IeM4Muvusr?Q|6lF&t4@DY(ELl4ai&7* zW_#{Wi*T71dctc8Q@q#QJD07#*XOS3uFU(huU|PLtLv);m(#ZyB^|+fOzR)=?aMz? zVqEiP%jxBwxlK;~uZuMg8!>2${^+Rc&sC6Kml}WcLf6GdDY=VR{7ZSbGWyvCtyzS(~x%ExAuKe^Q>>jtpgY5RTb}TUN!x1@|G`p z*)k%Hv)+rSTz=U7g@vUhgg diff --git a/certs/client-cert.pem b/certs/client-cert.pem index 9b6a8190d..e3fd680a1 100644 --- a/certs/client-cert.pem +++ b/certs/client-cert.pem @@ -1,16 +1,17 @@ Certificate: Data: Version: 3 (0x2) - Serial Number: 12305170416376042871 (0xaac4bf4c50bd5577) - Signature Algorithm: sha256WithRSAEncryption - Issuer: C=US, ST=Montana, L=Bozeman, O=wolfSSL_2048, OU=Programming-2048, CN=www.wolfssl.com/emailAddress=info@wolfssl.com + Serial Number: + 6f:b0:b4:88:a8:2e:e4:23:a4:dc:af:14:4c:33:40:79:52:47:ef:97 + Signature Algorithm: sha256WithRSAEncryption + Issuer: C = US, ST = Montana, L = Bozeman, O = wolfSSL_2048, OU = Programming-2048, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Apr 13 15:23:09 2018 GMT - Not After : Jan 7 15:23:09 2021 GMT - Subject: C=US, ST=Montana, L=Bozeman, O=wolfSSL_2048, OU=Programming-2048, CN=www.wolfssl.com/emailAddress=info@wolfssl.com + Not Before: May 7 07:39:03 2020 GMT + Not After : Feb 1 07:39:03 2023 GMT + Subject: C = US, ST = Montana, L = Bozeman, O = wolfSSL_2048, OU = Programming-2048, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption - Public-Key: (2048 bit) + RSA Public-Key: (2048 bit) Modulus: 00:c3:03:d1:2b:fe:39:a4:32:45:3b:53:c8:84:2b: 2a:7c:74:9a:bd:aa:2a:52:07:47:d6:a6:36:b2:07: @@ -37,51 +38,54 @@ Certificate: X509v3 Authority Key Identifier: keyid:33:D8:45:66:D7:68:87:18:7E:54:0D:70:27:91:C7:26:D7:85:65:C0 DirName:/C=US/ST=Montana/L=Bozeman/O=wolfSSL_2048/OU=Programming-2048/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:AA:C4:BF:4C:50:BD:55:77 + serial:6F:B0:B4:88:A8:2E:E4:23:A4:DC:AF:14:4C:33:40:79:52:47:EF:97 X509v3 Basic Constraints: CA:TRUE + X509v3 Subject Alternative Name: + DNS:example.com, IP Address:127.0.0.1 Signature Algorithm: sha256WithRSAEncryption - 80:52:54:61:2a:77:80:53:44:a9:80:6d:45:ff:0d:25:7d:1a: - 8f:23:93:53:74:35:12:6f:f0:2e:20:ea:ed:80:63:69:88:e6: - 0c:a1:49:30:e0:82:db:68:0f:7e:84:ac:ff:ff:7b:42:fa:7e: - 2f:b2:52:9f:d2:79:5e:35:12:27:36:bc:df:96:58:44:96:55: - c8:4a:94:02:5f:4a:9d:dc:d3:3a:f7:6d:ac:8b:79:6e:fc:be: - 8f:23:58:6a:8a:f5:38:0a:42:f6:98:74:88:53:2e:02:af:e1: - 0e:be:6f:cc:74:33:7c:ec:b4:cb:a7:49:6d:82:42:4f:eb:73: - 29:c3:32:00:2b:15:f8:88:7a:8f:6d:20:1b:ae:65:5f:c5:d0: - 8a:d1:e2:64:6d:a3:a8:fe:64:e1:a9:5b:e6:d0:23:d6:02:72: - 5a:ec:03:8e:87:67:19:8d:e4:a8:99:15:c1:3d:91:48:99:8d: - fe:ae:1c:bf:f6:28:1b:45:be:ad:ef:72:83:9a:f6:c7:3b:51: - a3:6e:7a:73:bd:83:aa:97:fd:63:b4:f4:6b:1c:14:81:9a:ef: - 14:24:d3:e1:8b:f4:04:04:84:54:0f:61:a2:a8:f2:50:37:0c: - 17:0c:bc:e0:c2:84:85:f4:0b:ae:00:ca:9f:27:e2:44:4f:15: - 0b:8b:1d:b4 + 33:fe:14:e8:37:91:19:d4:15:bf:53:81:48:b9:21:3a:9b:0a: + 8a:4a:02:59:89:2b:37:8f:54:c8:33:41:8f:3f:4b:80:31:62: + fc:73:bd:64:04:24:c7:c1:f9:f0:da:21:0b:5d:f1:11:c8:3a: + 12:88:a0:84:57:43:d9:df:16:c3:b2:d9:f6:48:5c:be:22:23: + e0:de:0f:a7:51:22:67:38:9a:26:37:6a:cc:9e:77:8f:50:0d: + e8:f2:e0:d8:74:47:ea:7e:7f:00:a9:01:e4:54:c7:b0:f5:56: + ea:7d:b7:2d:4e:2e:ff:4e:38:a1:ee:f8:4d:90:cd:1e:dc:43: + 44:66:a4:00:d8:b7:5d:3b:6f:da:d1:90:e3:5a:43:b9:30:de: + 52:a2:ce:84:89:da:fc:02:f5:87:38:14:84:14:6f:8b:49:15: + 33:aa:1f:04:5b:42:ec:02:7e:b2:5c:9b:62:5b:67:43:f4:f7: + ec:e5:52:e9:0e:04:83:23:64:ca:a5:dc:3d:d6:e7:a7:6a:3e: + bd:de:f5:58:a7:04:5e:cd:75:74:c2:12:eb:49:1a:d6:8f:38: + 60:df:1a:5e:30:ad:d6:45:56:29:ab:0a:53:d7:66:d9:b4:ab: + 5b:5b:2a:22:4a:19:f4:42:aa:d3:de:dc:b4:9f:1d:25:b7:91: + ca:3d:07:9d -----BEGIN CERTIFICATE----- -MIIEyjCCA7KgAwIBAgIJAKrEv0xQvVV3MA0GCSqGSIb3DQEBCwUAMIGeMQswCQYD -VQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjEVMBMG -A1UECgwMd29sZlNTTF8yMDQ4MRkwFwYDVQQLDBBQcm9ncmFtbWluZy0yMDQ4MRgw -FgYDVQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29s -ZnNzbC5jb20wHhcNMTgwNDEzMTUyMzA5WhcNMjEwMTA3MTUyMzA5WjCBnjELMAkG -A1UEBhMCVVMxEDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xFTAT -BgNVBAoMDHdvbGZTU0xfMjA0ODEZMBcGA1UECwwQUHJvZ3JhbW1pbmctMjA0ODEY -MBYGA1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdv -bGZzc2wuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwwPRK/45 -pDJFO1PIhCsqfHSavaoqUgdH1qY2sgcyjtC6aXvGw0Se1IFI/S1oootnu6F1yDYs -StIb94u6zw357+zxgR57mwNHmr9lzH9lJGmm6BSJW+Q098WwFJP1Z3s6enjhAVZW -kaYTQo3SPECcTO/Rht83URsMoTv18aNKNeThzpbfG36/TpfQEOioCDCBryALQxTF -dGe0MoJvjYbCiECZNoO6HkByIhfXUmUkc7DO7xnNrv94bHvAEgPUTnINUG07ozuj -mV6dyNkMhbPZitlUJttt+qy7/yVMxNF59HHThkAYE7BjtXJOMMSXhIYtVi/XFfd/ -wK71/Fvl+6G60wIDAQABo4IBBzCCAQMwHQYDVR0OBBYEFDPYRWbXaIcYflQNcCeR -xybXhWXAMIHTBgNVHSMEgcswgciAFDPYRWbXaIcYflQNcCeRxybXhWXAoYGkpIGh -MIGeMQswCQYDVQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96 -ZW1hbjEVMBMGA1UECgwMd29sZlNTTF8yMDQ4MRkwFwYDVQQLDBBQcm9ncmFtbWlu -Zy0yMDQ4MRgwFgYDVQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEW -EGluZm9Ad29sZnNzbC5jb22CCQCqxL9MUL1VdzAMBgNVHRMEBTADAQH/MA0GCSqG -SIb3DQEBCwUAA4IBAQCAUlRhKneAU0SpgG1F/w0lfRqPI5NTdDUSb/AuIOrtgGNp -iOYMoUkw4ILbaA9+hKz//3tC+n4vslKf0nleNRInNrzfllhEllXISpQCX0qd3NM6 -922si3lu/L6PI1hqivU4CkL2mHSIUy4Cr+EOvm/MdDN87LTLp0ltgkJP63MpwzIA -KxX4iHqPbSAbrmVfxdCK0eJkbaOo/mThqVvm0CPWAnJa7AOOh2cZjeSomRXBPZFI -mY3+rhy/9igbRb6t73KDmvbHO1GjbnpzvYOql/1jtPRrHBSBmu8UJNPhi/QEBIRU -D2GiqPJQNwwXDLzgwoSF9AuuAMqfJ+JETxULix20 +MIIE/jCCA+agAwIBAgIUb7C0iKgu5COk3K8UTDNAeVJH75cwDQYJKoZIhvcNAQEL +BQAwgZ4xCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdC +b3plbWFuMRUwEwYDVQQKDAx3b2xmU1NMXzIwNDgxGTAXBgNVBAsMEFByb2dyYW1t +aW5nLTIwNDgxGDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJ +ARYQaW5mb0B3b2xmc3NsLmNvbTAeFw0yMDA1MDcwNzM5MDNaFw0yMzAyMDEwNzM5 +MDNaMIGeMQswCQYDVQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwH +Qm96ZW1hbjEVMBMGA1UECgwMd29sZlNTTF8yMDQ4MRkwFwYDVQQLDBBQcm9ncmFt +bWluZy0yMDQ4MRgwFgYDVQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0B +CQEWEGluZm9Ad29sZnNzbC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQDDA9Er/jmkMkU7U8iEKyp8dJq9qipSB0fWpjayBzKO0Lppe8bDRJ7UgUj9 +LWiii2e7oXXINixK0hv3i7rPDfnv7PGBHnubA0eav2XMf2UkaaboFIlb5DT3xbAU +k/Vnezp6eOEBVlaRphNCjdI8QJxM79GG3zdRGwyhO/Xxo0o15OHOlt8bfr9Ol9AQ +6KgIMIGvIAtDFMV0Z7Qygm+NhsKIQJk2g7oeQHIiF9dSZSRzsM7vGc2u/3hse8AS +A9ROcg1QbTujO6OZXp3I2QyFs9mK2VQm2236rLv/JUzE0Xn0cdOGQBgTsGO1ck4w +xJeEhi1WL9cV93/ArvX8W+X7obrTAgMBAAGjggEwMIIBLDAdBgNVHQ4EFgQUM9hF +Ztdohxh+VA1wJ5HHJteFZcAwgd4GA1UdIwSB1jCB04AUM9hFZtdohxh+VA1wJ5HH +JteFZcChgaSkgaEwgZ4xCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAw +DgYDVQQHDAdCb3plbWFuMRUwEwYDVQQKDAx3b2xmU1NMXzIwNDgxGTAXBgNVBAsM +EFByb2dyYW1taW5nLTIwNDgxGDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEfMB0G +CSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIUb7C0iKgu5COk3K8UTDNAeVJH +75cwDAYDVR0TBAUwAwEB/zAcBgNVHREEFTATggtleGFtcGxlLmNvbYcEfwAAATAN +BgkqhkiG9w0BAQsFAAOCAQEAM/4U6DeRGdQVv1OBSLkhOpsKikoCWYkrN49UyDNB +jz9LgDFi/HO9ZAQkx8H58NohC13xEcg6EoighFdD2d8Ww7LZ9khcviIj4N4Pp1Ei +ZziaJjdqzJ53j1AN6PLg2HRH6n5/AKkB5FTHsPVW6n23LU4u/044oe74TZDNHtxD +RGakANi3XTtv2tGQ41pDuTDeUqLOhIna/AL1hzgUhBRvi0kVM6ofBFtC7AJ+slyb +YltnQ/T37OVS6Q4EgyNkyqXcPdbnp2o+vd71WKcEXs11dMIS60ka1o84YN8aXjCt +1kVWKasKU9dm2bSrW1sqIkoZ9EKq097ctJ8dJbeRyj0HnQ== -----END CERTIFICATE----- diff --git a/certs/client-ecc-cert.der b/certs/client-ecc-cert.der index d6c5dbba9d7431740b1d2d880662fedba5fa2028..18381e39be91ce5163692f25cc9ae943916670ff 100644 GIT binary patch delta 267 zcmeBSJItnR(8O$S(8Tm~0W%XL6O)K&)gSxh)4jLLE@>62R&4uv-Xc(DqQn9jBLf3d z19Jm&V@m^*C~;mRV*?`tLnwDLAJc@%DU31fO^oseO^ni$k1{Iqo@HYWl~rbGJZjK* zsA2MXM$yR}Ow;SJns2}ZQY*~DYQW6M_}@SV#1mu@H4tv%POV7HEyzjLOU}=2XQ^jk zU^L)j6shORxXxvf@PW2 syp4%W3amR1XlE<(xk_Z~ZV^pt(9rt0`GN1HjCEapdeO~~Y*{t}06d;nga7~l delta 211 zcmX@i*25-Y(8SDP(8RQU0W%XL6B8%HEICePVb;RBTpo&$mw-)m<-p=d~`dXB0?zHvqlx=w%kErTRoA%jqQ|v1MvS3PS diff --git a/certs/client-ecc-cert.pem b/certs/client-ecc-cert.pem index 217035bdd..d77e7bf60 100644 --- a/certs/client-ecc-cert.pem +++ b/certs/client-ecc-cert.pem @@ -1,17 +1,18 @@ Certificate: Data: Version: 3 (0x2) - Serial Number: 10646345548447194541 (0x93bf6ade9b419dad) - Signature Algorithm: ecdsa-with-SHA256 - Issuer: C=US, ST=Oregon, L=Salem, O=Client ECC, OU=Fast, CN=www.wolfssl.com/emailAddress=info@wolfssl.com + Serial Number: + 15:7a:fc:3f:63:cb:8d:db:76:d2:2a:71:25:78:b6:f5:cf:38:51:1c + Signature Algorithm: ecdsa-with-SHA256 + Issuer: C = US, ST = Oregon, L = Salem, O = Client ECC, OU = Fast, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Apr 13 15:23:10 2018 GMT - Not After : Jan 7 15:23:10 2021 GMT - Subject: C=US, ST=Oregon, L=Salem, O=Client ECC, OU=Fast, CN=www.wolfssl.com/emailAddress=info@wolfssl.com + Not Before: May 7 07:39:04 2020 GMT + Not After : Feb 1 07:39:04 2023 GMT + Subject: C = US, ST = Oregon, L = Salem, O = Client ECC, OU = Fast, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: id-ecPublicKey Public-Key: (256 bit) - pub: + pub: 04:55:bf:f4:0f:44:50:9a:3d:ce:9b:b7:f0:c5:4d: f5:70:7b:d4:ec:24:8e:19:80:ec:5a:4c:a2:24:03: 62:2c:9b:da:ef:a2:35:12:43:84:76:16:c6:56:95: @@ -25,31 +26,34 @@ Certificate: X509v3 Authority Key Identifier: keyid:EB:D4:4B:59:6B:95:61:3F:51:57:B6:04:4D:89:41:88:44:5C:AB:F2 DirName:/C=US/ST=Oregon/L=Salem/O=Client ECC/OU=Fast/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:93:BF:6A:DE:9B:41:9D:AD + serial:15:7A:FC:3F:63:CB:8D:DB:76:D2:2A:71:25:78:B6:F5:CF:38:51:1C X509v3 Basic Constraints: CA:TRUE + X509v3 Subject Alternative Name: + DNS:example.com, IP Address:127.0.0.1 Signature Algorithm: ecdsa-with-SHA256 - 30:44:02:20:61:bc:9d:4d:88:64:86:b8:71:aa:35:59:68:b8: - ee:2c:f3:23:b5:1a:b9:ba:41:50:a8:c6:c3:58:eb:58:bd:60: - 02:20:61:aa:eb:b5:73:0d:01:db:69:8f:52:f5:72:6d:37:42: - b5:fd:94:b6:6e:b1:c4:25:2e:96:96:f3:39:b2:5d:ea + 30:45:02:21:00:9d:66:d9:5e:ea:33:82:61:20:17:fa:3e:55: + c5:e1:45:fc:64:8c:9d:57:06:77:16:6c:c8:04:a6:3a:9e:b1: + 61:02:20:05:b9:c0:2b:6b:21:0e:45:6b:2d:b4:15:62:80:28: + 2a:f1:b3:e0:4d:d2:68:ae:8a:4e:2e:5b:83:e2:3d:04:b1 -----BEGIN CERTIFICATE----- -MIIDCDCCAq+gAwIBAgIJAJO/at6bQZ2tMAoGCCqGSM49BAMCMIGNMQswCQYDVQQG -EwJVUzEPMA0GA1UECAwGT3JlZ29uMQ4wDAYDVQQHDAVTYWxlbTETMBEGA1UECgwK -Q2xpZW50IEVDQzENMAsGA1UECwwERmFzdDEYMBYGA1UEAwwPd3d3LndvbGZzc2wu -Y29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMB4XDTE4MDQxMzE1 -MjMxMFoXDTIxMDEwNzE1MjMxMFowgY0xCzAJBgNVBAYTAlVTMQ8wDQYDVQQIDAZP -cmVnb24xDjAMBgNVBAcMBVNhbGVtMRMwEQYDVQQKDApDbGllbnQgRUNDMQ0wCwYD -VQQLDARGYXN0MRgwFgYDVQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0B -CQEWEGluZm9Ad29sZnNzbC5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARV -v/QPRFCaPc6bt/DFTfVwe9TsJI4ZgOxaTKIkA2Ism9rvojUSQ4R2FsZWlQbMAam9 -9nUaQve9qbI2Il/HXX+0o4H1MIHyMB0GA1UdDgQWBBTr1EtZa5VhP1FXtgRNiUGI -RFyr8jCBwgYDVR0jBIG6MIG3gBTr1EtZa5VhP1FXtgRNiUGIRFyr8qGBk6SBkDCB -jTELMAkGA1UEBhMCVVMxDzANBgNVBAgMBk9yZWdvbjEOMAwGA1UEBwwFU2FsZW0x -EzARBgNVBAoMCkNsaWVudCBFQ0MxDTALBgNVBAsMBEZhc3QxGDAWBgNVBAMMD3d3 -dy53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIJ -AJO/at6bQZ2tMAwGA1UdEwQFMAMBAf8wCgYIKoZIzj0EAwIDRwAwRAIgYbydTYhk -hrhxqjVZaLjuLPMjtRq5ukFQqMbDWOtYvWACIGGq67VzDQHbaY9S9XJtN0K1/ZS2 -brHEJS6WlvM5sl3q +MIIDPzCCAuWgAwIBAgIUFXr8P2PLjdt20ipxJXi29c84URwwCgYIKoZIzj0EAwIw +gY0xCzAJBgNVBAYTAlVTMQ8wDQYDVQQIDAZPcmVnb24xDjAMBgNVBAcMBVNhbGVt +MRMwEQYDVQQKDApDbGllbnQgRUNDMQ0wCwYDVQQLDARGYXN0MRgwFgYDVQQDDA93 +d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20w +HhcNMjAwNTA3MDczOTA0WhcNMjMwMjAxMDczOTA0WjCBjTELMAkGA1UEBhMCVVMx +DzANBgNVBAgMBk9yZWdvbjEOMAwGA1UEBwwFU2FsZW0xEzARBgNVBAoMCkNsaWVu +dCBFQ0MxDTALBgNVBAsMBEZhc3QxGDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEf +MB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbTBZMBMGByqGSM49AgEGCCqG +SM49AwEHA0IABFW/9A9EUJo9zpu38MVN9XB71OwkjhmA7FpMoiQDYiyb2u+iNRJD +hHYWxlaVBswBqb32dRpC972psjYiX8ddf7SjggEfMIIBGzAdBgNVHQ4EFgQU69RL +WWuVYT9RV7YETYlBiERcq/Iwgc0GA1UdIwSBxTCBwoAU69RLWWuVYT9RV7YETYlB +iERcq/KhgZOkgZAwgY0xCzAJBgNVBAYTAlVTMQ8wDQYDVQQIDAZPcmVnb24xDjAM +BgNVBAcMBVNhbGVtMRMwEQYDVQQKDApDbGllbnQgRUNDMQ0wCwYDVQQLDARGYXN0 +MRgwFgYDVQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9A +d29sZnNzbC5jb22CFBV6/D9jy43bdtIqcSV4tvXPOFEcMAwGA1UdEwQFMAMBAf8w +HAYDVR0RBBUwE4ILZXhhbXBsZS5jb22HBH8AAAEwCgYIKoZIzj0EAwIDSAAwRQIh +AJ1m2V7qM4JhIBf6PlXF4UX8ZIydVwZ3FmzIBKY6nrFhAiAFucArayEORWsttBVi +gCgq8bPgTdJoropOLluD4j0EsQ== -----END CERTIFICATE----- diff --git a/certs/client-relative-uri.pem b/certs/client-relative-uri.pem index f4e0f5ca0..a805d19b5 100644 --- a/certs/client-relative-uri.pem +++ b/certs/client-relative-uri.pem @@ -1,16 +1,17 @@ Certificate: Data: Version: 3 (0x2) - Serial Number: 9930516258332383263 (0x89d047ec3e24981f) - Signature Algorithm: sha256WithRSAEncryption - Issuer: C=US, ST=Montana, L=Bozeman, O=wolfSSL_2048, OU=RELATIVE_URI, CN=www.wolfssl.com/emailAddress=info@wolfssl.com + Serial Number: + 18:30:15:64:49:85:1c:47:af:51:9c:5d:e4:2d:7e:dd:65:2b:f7:3c + Signature Algorithm: sha256WithRSAEncryption + Issuer: C = US, ST = Montana, L = Bozeman, O = wolfSSL_2048, OU = RELATIVE_URI, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: May 14 20:24:06 2018 GMT - Not After : Feb 7 20:24:06 2021 GMT - Subject: C=US, ST=Montana, L=Bozeman, O=wolfSSL_2048, OU=RELATIVE_URI, CN=www.wolfssl.com/emailAddress=info@wolfssl.com + Not Before: May 7 07:39:03 2020 GMT + Not After : Feb 1 07:39:03 2023 GMT + Subject: C = US, ST = Montana, L = Bozeman, O = wolfSSL_2048, OU = RELATIVE_URI, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption - Public-Key: (2048 bit) + RSA Public-Key: (2048 bit) Modulus: 00:c3:03:d1:2b:fe:39:a4:32:45:3b:53:c8:84:2b: 2a:7c:74:9a:bd:aa:2a:52:07:47:d6:a6:36:b2:07: @@ -37,54 +38,54 @@ Certificate: X509v3 Authority Key Identifier: keyid:33:D8:45:66:D7:68:87:18:7E:54:0D:70:27:91:C7:26:D7:85:65:C0 DirName:/C=US/ST=Montana/L=Bozeman/O=wolfSSL_2048/OU=RELATIVE_URI/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:89:D0:47:EC:3E:24:98:1F + serial:18:30:15:64:49:85:1C:47:AF:51:9C:5D:E4:2D:7E:DD:65:2B:F7:3C X509v3 Basic Constraints: CA:FALSE X509v3 Subject Alternative Name: URI:../relative/page.html Signature Algorithm: sha256WithRSAEncryption - 29:cb:c0:50:61:da:51:c5:da:50:15:b7:bd:c3:f4:9b:c5:b8: - 2a:9b:6c:c7:91:7a:26:e3:eb:48:d2:40:fa:e3:ab:f9:b7:e2: - 4a:37:9b:b6:03:ad:9c:f4:f2:5d:12:eb:5c:c6:97:c4:3a:18: - 99:70:47:49:93:f3:a5:32:ab:aa:22:71:6f:5c:36:1c:42:2f: - d4:19:da:64:73:84:d3:1e:a8:5f:af:8a:58:e7:64:18:38:79: - 69:f2:08:d4:f2:be:b0:9c:18:d8:f1:a5:eb:b6:9c:67:21:0f: - ba:bf:95:68:e9:d2:23:56:84:cf:87:7c:a4:2a:3a:0d:c1:72: - 3a:43:da:53:bb:6c:f0:b5:f1:03:3c:ff:b6:0a:1f:54:c5:1b: - d5:40:80:24:74:e2:f6:4c:41:88:f1:df:a3:36:64:78:e9:c2: - 0e:c3:0f:f3:5f:19:e6:44:85:79:e1:6a:ee:78:39:9b:58:e3: - c4:39:27:d7:05:1a:b9:7c:21:75:61:7a:71:53:fd:fc:7f:57: - ef:3a:19:be:69:c6:cb:73:49:bd:72:7d:2b:eb:68:52:8e:0f: - d7:47:d3:90:86:5a:14:03:0d:dc:6b:07:10:57:2b:e0:b6:d2: - a0:49:2d:63:88:d0:17:b3:b2:50:c4:60:15:1e:b6:ce:13:14: - 0d:ec:45:eb + 3e:6a:b5:99:4f:e9:44:c0:64:53:21:d7:d4:29:6b:73:a9:98: + 5f:90:2a:89:45:35:bf:cb:0d:1b:73:eb:5e:c6:bf:64:21:9f: + d7:5d:b2:ee:20:04:3d:db:5c:f1:80:05:d3:fc:62:d3:b4:50: + 1e:b9:14:ac:2e:d6:75:8d:04:f4:76:cd:05:dc:aa:be:65:0c: + be:0d:70:d7:6e:27:37:fb:26:42:00:f6:0e:b1:32:36:ef:09: + eb:98:e0:22:2f:df:15:92:2a:bf:6a:76:bf:b9:c7:65:22:5a: + a5:01:68:f2:51:eb:53:46:45:89:ce:54:83:da:98:1a:cb:73: + 5b:54:43:13:ea:54:72:b6:e4:f7:fc:69:63:86:e3:9e:23:c8: + c0:f9:6c:62:84:0b:71:fc:6b:0b:0b:4b:a9:18:c3:cd:70:6f: + e3:e7:5e:e4:5e:c0:4e:4f:38:8d:bb:8f:b7:c7:2e:96:2a:c2: + 1c:ed:b7:65:8f:48:8d:79:89:ac:2e:86:12:c7:e2:c1:e0:80: + 70:7f:c7:57:2f:96:d2:ba:77:bb:e9:71:5c:05:74:cc:9a:ea: + 87:49:a5:63:e5:05:85:d0:a5:1a:45:d9:f0:f5:48:1f:55:ed: + 29:36:0c:aa:86:7d:c1:7a:6b:9c:e2:a5:7d:35:77:d4:2a:c5: + f3:e2:c7:42 -----BEGIN CERTIFICATE----- -MIIE3TCCA8WgAwIBAgIJAInQR+w+JJgfMA0GCSqGSIb3DQEBCwUAMIGaMQswCQYD -VQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjEVMBMG -A1UECgwMd29sZlNTTF8yMDQ4MRUwEwYDVQQLDAxSRUxBVElWRV9VUkkxGDAWBgNV -BAMMD3d3dy53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3Ns -LmNvbTAeFw0xODA1MTQyMDI0MDZaFw0yMTAyMDcyMDI0MDZaMIGaMQswCQYDVQQG -EwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjEVMBMGA1UE -CgwMd29sZlNTTF8yMDQ4MRUwEwYDVQQLDAxSRUxBVElWRV9VUkkxGDAWBgNVBAMM -D3d3dy53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNv -bTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMMD0Sv+OaQyRTtTyIQr -Knx0mr2qKlIHR9amNrIHMo7Quml7xsNEntSBSP0taKKLZ7uhdcg2LErSG/eLus8N -+e/s8YEee5sDR5q/Zcx/ZSRppugUiVvkNPfFsBST9Wd7Onp44QFWVpGmE0KN0jxA -nEzv0YbfN1EbDKE79fGjSjXk4c6W3xt+v06X0BDoqAgwga8gC0MUxXRntDKCb42G -wohAmTaDuh5AciIX11JlJHOwzu8Zza7/eGx7wBID1E5yDVBtO6M7o5lencjZDIWz -2YrZVCbbbfqsu/8lTMTRefRx04ZAGBOwY7VyTjDEl4SGLVYv1xX3f8Cu9fxb5fuh -utMCAwEAAaOCASIwggEeMB0GA1UdDgQWBBQz2EVm12iHGH5UDXAnkccm14VlwDCB -zwYDVR0jBIHHMIHEgBQz2EVm12iHGH5UDXAnkccm14VlwKGBoKSBnTCBmjELMAkG -A1UEBhMCVVMxEDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xFTAT -BgNVBAoMDHdvbGZTU0xfMjA0ODEVMBMGA1UECwwMUkVMQVRJVkVfVVJJMRgwFgYD -VQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNz -bC5jb22CCQCJ0EfsPiSYHzAJBgNVHRMEAjAAMCAGA1UdEQQZMBeGFS4uL3JlbGF0 -aXZlL3BhZ2UuaHRtbDANBgkqhkiG9w0BAQsFAAOCAQEAKcvAUGHaUcXaUBW3vcP0 -m8W4Kptsx5F6JuPrSNJA+uOr+bfiSjebtgOtnPTyXRLrXMaXxDoYmXBHSZPzpTKr -qiJxb1w2HEIv1BnaZHOE0x6oX6+KWOdkGDh5afII1PK+sJwY2PGl67acZyEPur+V -aOnSI1aEz4d8pCo6DcFyOkPaU7ts8LXxAzz/tgofVMUb1UCAJHTi9kxBiPHfozZk -eOnCDsMP818Z5kSFeeFq7ng5m1jjxDkn1wUauXwhdWF6cVP9/H9X7zoZvmnGy3NJ -vXJ9K+toUo4P10fTkIZaFAMN3GsHEFcr4LbSoEktY4jQF7OyUMRgFR62zhMUDexF -6w== +MIIE8zCCA9ugAwIBAgIUGDAVZEmFHEevUZxd5C1+3WUr9zwwDQYJKoZIhvcNAQEL +BQAwgZoxCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdC +b3plbWFuMRUwEwYDVQQKDAx3b2xmU1NMXzIwNDgxFTATBgNVBAsMDFJFTEFUSVZF +X1VSSTEYMBYGA1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBp +bmZvQHdvbGZzc2wuY29tMB4XDTIwMDUwNzA3MzkwM1oXDTIzMDIwMTA3MzkwM1ow +gZoxCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3pl +bWFuMRUwEwYDVQQKDAx3b2xmU1NMXzIwNDgxFTATBgNVBAsMDFJFTEFUSVZFX1VS +STEYMBYGA1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZv +QHdvbGZzc2wuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwwPR +K/45pDJFO1PIhCsqfHSavaoqUgdH1qY2sgcyjtC6aXvGw0Se1IFI/S1oootnu6F1 +yDYsStIb94u6zw357+zxgR57mwNHmr9lzH9lJGmm6BSJW+Q098WwFJP1Z3s6enjh +AVZWkaYTQo3SPECcTO/Rht83URsMoTv18aNKNeThzpbfG36/TpfQEOioCDCBryAL +QxTFdGe0MoJvjYbCiECZNoO6HkByIhfXUmUkc7DO7xnNrv94bHvAEgPUTnINUG07 +ozujmV6dyNkMhbPZitlUJttt+qy7/yVMxNF59HHThkAYE7BjtXJOMMSXhIYtVi/X +Ffd/wK71/Fvl+6G60wIDAQABo4IBLTCCASkwHQYDVR0OBBYEFDPYRWbXaIcYflQN +cCeRxybXhWXAMIHaBgNVHSMEgdIwgc+AFDPYRWbXaIcYflQNcCeRxybXhWXAoYGg +pIGdMIGaMQswCQYDVQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwH +Qm96ZW1hbjEVMBMGA1UECgwMd29sZlNTTF8yMDQ4MRUwEwYDVQQLDAxSRUxBVElW +RV9VUkkxGDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQ +aW5mb0B3b2xmc3NsLmNvbYIUGDAVZEmFHEevUZxd5C1+3WUr9zwwCQYDVR0TBAIw +ADAgBgNVHREEGTAXhhUuLi9yZWxhdGl2ZS9wYWdlLmh0bWwwDQYJKoZIhvcNAQEL +BQADggEBAD5qtZlP6UTAZFMh19Qpa3OpmF+QKolFNb/LDRtz617Gv2Qhn9ddsu4g +BD3bXPGABdP8YtO0UB65FKwu1nWNBPR2zQXcqr5lDL4NcNduJzf7JkIA9g6xMjbv +CeuY4CIv3xWSKr9qdr+5x2UiWqUBaPJR61NGRYnOVIPamBrLc1tUQxPqVHK25Pf8 +aWOG454jyMD5bGKEC3H8awsLS6kYw81wb+PnXuRewE5POI27j7fHLpYqwhztt2WP +SI15iawuhhLH4sHggHB/x1cvltK6d7vpcVwFdMya6odJpWPlBYXQpRpF2fD1SB9V +7Sk2DKqGfcF6a5zipX01d9QqxfPix0I= -----END CERTIFICATE----- diff --git a/certs/client-uri-cert.pem b/certs/client-uri-cert.pem index 1a96baccd..e1ad8a60a 100644 --- a/certs/client-uri-cert.pem +++ b/certs/client-uri-cert.pem @@ -1,16 +1,17 @@ Certificate: Data: Version: 3 (0x2) - Serial Number: 9402123678722384441 (0x827b0dabd4896239) - Signature Algorithm: sha256WithRSAEncryption - Issuer: C=US, ST=Montana, L=Bozeman, O=wolfSSL_2048, OU=URI, CN=www.wolfssl.com/emailAddress=info@wolfssl.com + Serial Number: + 5c:07:e6:13:57:41:c7:db:42:a8:a3:4c:b9:6d:f6:c1:3f:a9:63:cc + Signature Algorithm: sha256WithRSAEncryption + Issuer: C = US, ST = Montana, L = Bozeman, O = wolfSSL_2048, OU = URI, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: May 8 21:54:16 2018 GMT - Not After : Feb 1 21:54:16 2021 GMT - Subject: C=US, ST=Montana, L=Bozeman, O=wolfSSL_2048, OU=URI, CN=www.wolfssl.com/emailAddress=info@wolfssl.com + Not Before: May 7 07:39:03 2020 GMT + Not After : Feb 1 07:39:03 2023 GMT + Subject: C = US, ST = Montana, L = Bozeman, O = wolfSSL_2048, OU = URI, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption - Public-Key: (2048 bit) + RSA Public-Key: (2048 bit) Modulus: 00:c3:03:d1:2b:fe:39:a4:32:45:3b:53:c8:84:2b: 2a:7c:74:9a:bd:aa:2a:52:07:47:d6:a6:36:b2:07: @@ -37,53 +38,53 @@ Certificate: X509v3 Authority Key Identifier: keyid:33:D8:45:66:D7:68:87:18:7E:54:0D:70:27:91:C7:26:D7:85:65:C0 DirName:/C=US/ST=Montana/L=Bozeman/O=wolfSSL_2048/OU=URI/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:82:7B:0D:AB:D4:89:62:39 + serial:5C:07:E6:13:57:41:C7:DB:42:A8:A3:4C:B9:6D:F6:C1:3F:A9:63:CC X509v3 Basic Constraints: CA:FALSE X509v3 Subject Alternative Name: URI:https://www.wolfssl.com Signature Algorithm: sha256WithRSAEncryption - 18:bb:46:7a:13:a5:32:c2:aa:1c:60:cf:d1:b7:59:f3:86:fd: - b4:db:62:6e:40:4d:d3:cb:b5:8f:0a:45:43:9f:0b:50:7b:ac: - 41:ed:27:32:a5:b3:fb:6a:a5:9c:36:00:f2:88:da:dd:80:b5: - 49:29:6c:4d:1c:22:24:07:5b:7b:9a:88:8b:21:a0:62:43:1c: - 14:23:d2:08:a8:27:cc:f2:d5:4f:e2:5c:b1:f8:3c:f5:7c:b2: - ef:b1:ad:1e:fe:a9:92:5f:00:26:fb:f3:8d:e2:c7:38:8a:9a: - e4:a8:4a:29:61:44:f6:80:61:09:5d:49:9b:1c:10:e0:1e:27: - 03:26:e2:46:01:83:49:6a:1d:5f:6e:71:c8:1e:61:44:32:2a: - 84:cd:5a:45:d3:9f:a4:ec:76:4b:1a:6c:26:ca:55:d7:c3:ad: - 94:57:7b:8b:d4:9f:be:25:3d:e2:30:08:d5:fb:18:9a:aa:ee: - c1:ce:bb:ea:de:5d:a7:77:40:c2:b1:57:aa:11:43:41:69:73: - 0c:bd:87:0e:b9:8d:ba:f9:cc:ac:38:60:8a:62:32:2a:c0:0d: - 1c:88:d3:d3:92:d6:f1:2e:82:67:8e:f5:42:b9:e4:28:b3:fd: - fb:7c:9a:16:5f:fe:20:da:37:5f:c2:5e:74:9b:99:f3:de:35: - 45:8d:49:28 + 9a:6c:2c:53:cc:26:b6:9d:76:ae:ef:9a:e7:35:8a:6d:19:ec: + 93:6f:1f:cf:a0:c6:1e:54:74:2c:eb:3b:75:00:88:25:fc:ca: + 2d:60:54:ad:cc:a2:78:18:54:99:ed:d8:27:9d:0d:a5:a3:bf: + bd:c2:5c:bf:55:71:11:51:ac:a9:e4:32:7b:89:c8:cc:78:4d: + c5:16:79:a1:56:f6:46:e3:38:5b:e7:76:d5:d0:5c:df:b1:1f: + d6:0a:8e:7e:a2:65:1a:83:9d:69:ba:54:13:fb:e3:93:fa:70: + 8b:40:90:79:e1:14:db:b0:e6:49:d2:1e:e1:ef:52:be:55:10: + 2d:63:07:45:70:87:fc:5a:25:5c:57:9a:56:94:77:ca:49:0f: + a0:d1:83:00:f8:d3:9a:cc:8e:7f:06:f5:98:bc:ed:02:cf:fa: + 0d:3e:3a:3d:dc:8e:2f:a0:57:b3:dc:1e:71:54:59:50:15:f8: + 5e:69:9f:9c:de:09:d7:e5:39:4e:66:61:e3:99:61:f7:70:c6: + 05:ba:21:5e:be:f9:82:52:8e:f9:4a:2e:9a:8e:16:47:15:35: + 34:3c:fb:75:39:0d:f7:c5:e5:fe:ef:a4:f2:7f:3d:4d:59:d6: + 39:26:f0:df:3d:26:9e:e0:dd:1a:d6:08:7c:bf:b9:a6:1f:f6: + 54:d0:19:24 -----BEGIN CERTIFICATE----- -MIIExDCCA6ygAwIBAgIJAIJ7DavUiWI5MA0GCSqGSIb3DQEBCwUAMIGRMQswCQYD -VQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjEVMBMG -A1UECgwMd29sZlNTTF8yMDQ4MQwwCgYDVQQLDANVUkkxGDAWBgNVBAMMD3d3dy53 -b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbTAeFw0x -ODA1MDgyMTU0MTZaFw0yMTAyMDEyMTU0MTZaMIGRMQswCQYDVQQGEwJVUzEQMA4G -A1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjEVMBMGA1UECgwMd29sZlNT -TF8yMDQ4MQwwCgYDVQQLDANVUkkxGDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEf -MB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbTCCASIwDQYJKoZIhvcNAQEB -BQADggEPADCCAQoCggEBAMMD0Sv+OaQyRTtTyIQrKnx0mr2qKlIHR9amNrIHMo7Q -uml7xsNEntSBSP0taKKLZ7uhdcg2LErSG/eLus8N+e/s8YEee5sDR5q/Zcx/ZSRp -pugUiVvkNPfFsBST9Wd7Onp44QFWVpGmE0KN0jxAnEzv0YbfN1EbDKE79fGjSjXk -4c6W3xt+v06X0BDoqAgwga8gC0MUxXRntDKCb42GwohAmTaDuh5AciIX11JlJHOw -zu8Zza7/eGx7wBID1E5yDVBtO6M7o5lencjZDIWz2YrZVCbbbfqsu/8lTMTRefRx -04ZAGBOwY7VyTjDEl4SGLVYv1xX3f8Cu9fxb5fuhutMCAwEAAaOCARswggEXMB0G -A1UdDgQWBBQz2EVm12iHGH5UDXAnkccm14VlwDCBxgYDVR0jBIG+MIG7gBQz2EVm -12iHGH5UDXAnkccm14VlwKGBl6SBlDCBkTELMAkGA1UEBhMCVVMxEDAOBgNVBAgM -B01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xFTATBgNVBAoMDHdvbGZTU0xfMjA0 -ODEMMAoGA1UECwwDVVJJMRgwFgYDVQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkq -hkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb22CCQCCew2r1IliOTAJBgNVHRMEAjAA -MCIGA1UdEQQbMBmGF2h0dHBzOi8vd3d3LndvbGZzc2wuY29tMA0GCSqGSIb3DQEB -CwUAA4IBAQAYu0Z6E6UywqocYM/Rt1nzhv2022JuQE3Ty7WPCkVDnwtQe6xB7Scy -pbP7aqWcNgDyiNrdgLVJKWxNHCIkB1t7moiLIaBiQxwUI9IIqCfM8tVP4lyx+Dz1 -fLLvsa0e/qmSXwAm+/ON4sc4iprkqEopYUT2gGEJXUmbHBDgHicDJuJGAYNJah1f -bnHIHmFEMiqEzVpF05+k7HZLGmwmylXXw62UV3uL1J++JT3iMAjV+xiaqu7Bzrvq -3l2nd0DCsVeqEUNBaXMMvYcOuY26+cysOGCKYjIqwA0ciNPTktbxLoJnjvVCueQo -s/37fJoWX/4g2jdfwl50m5nz3jVFjUko +MIIE2jCCA8KgAwIBAgIUXAfmE1dBx9tCqKNMuW32wT+pY8wwDQYJKoZIhvcNAQEL +BQAwgZExCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdC +b3plbWFuMRUwEwYDVQQKDAx3b2xmU1NMXzIwNDgxDDAKBgNVBAsMA1VSSTEYMBYG +A1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZz +c2wuY29tMB4XDTIwMDUwNzA3MzkwM1oXDTIzMDIwMTA3MzkwM1owgZExCzAJBgNV +BAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMRUwEwYD +VQQKDAx3b2xmU1NMXzIwNDgxDDAKBgNVBAsMA1VSSTEYMBYGA1UEAwwPd3d3Lndv +bGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMIIBIjAN +BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwwPRK/45pDJFO1PIhCsqfHSavaoq +UgdH1qY2sgcyjtC6aXvGw0Se1IFI/S1oootnu6F1yDYsStIb94u6zw357+zxgR57 +mwNHmr9lzH9lJGmm6BSJW+Q098WwFJP1Z3s6enjhAVZWkaYTQo3SPECcTO/Rht83 +URsMoTv18aNKNeThzpbfG36/TpfQEOioCDCBryALQxTFdGe0MoJvjYbCiECZNoO6 +HkByIhfXUmUkc7DO7xnNrv94bHvAEgPUTnINUG07ozujmV6dyNkMhbPZitlUJttt ++qy7/yVMxNF59HHThkAYE7BjtXJOMMSXhIYtVi/XFfd/wK71/Fvl+6G60wIDAQAB +o4IBJjCCASIwHQYDVR0OBBYEFDPYRWbXaIcYflQNcCeRxybXhWXAMIHRBgNVHSME +gckwgcaAFDPYRWbXaIcYflQNcCeRxybXhWXAoYGXpIGUMIGRMQswCQYDVQQGEwJV +UzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjEVMBMGA1UECgwM +d29sZlNTTF8yMDQ4MQwwCgYDVQQLDANVUkkxGDAWBgNVBAMMD3d3dy53b2xmc3Ns +LmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIUXAfmE1dBx9tC +qKNMuW32wT+pY8wwCQYDVR0TBAIwADAiBgNVHREEGzAZhhdodHRwczovL3d3dy53 +b2xmc3NsLmNvbTANBgkqhkiG9w0BAQsFAAOCAQEAmmwsU8wmtp12ru+a5zWKbRns +k28fz6DGHlR0LOs7dQCIJfzKLWBUrcyieBhUme3YJ50NpaO/vcJcv1VxEVGsqeQy +e4nIzHhNxRZ5oVb2RuM4W+d21dBc37Ef1gqOfqJlGoOdabpUE/vjk/pwi0CQeeEU +27DmSdIe4e9SvlUQLWMHRXCH/FolXFeaVpR3ykkPoNGDAPjTmsyOfwb1mLztAs/6 +DT46PdyOL6BXs9wecVRZUBX4XmmfnN4J1+U5TmZh45lh93DGBbohXr75glKO+Uou +mo4WRxU1NDz7dTkN98Xl/u+k8n89TVnWOSbw3z0mnuDdGtYIfL+5ph/2VNAZJA== -----END CERTIFICATE----- diff --git a/certs/crl/caEcc384Crl.pem b/certs/crl/caEcc384Crl.pem index f8b35397c..29352071a 100644 --- a/certs/crl/caEcc384Crl.pem +++ b/certs/crl/caEcc384Crl.pem @@ -1,29 +1,10 @@ -Certificate Revocation List (CRL): - Version 2 (0x1) - Signature Algorithm: ecdsa-with-SHA256 - Issuer: /C=US/ST=Washington/L=Seattle/O=wolfSSL/OU=Development/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - Last Update: May 29 22:47:57 2018 GMT - Next Update: Jan 7 22:47:57 2021 GMT - CRL extensions: - X509v3 CRL Number: - 5 -Revoked Certificates: - Serial Number: 02 - Revocation Date: May 29 22:47:57 2018 GMT - Signature Algorithm: ecdsa-with-SHA256 - 30:65:02:31:00:93:d7:82:a5:dc:83:90:fd:67:07:55:0a:70: - f4:61:8c:7d:9a:22:49:e7:a2:27:02:90:99:9e:cd:5d:58:ef: - 5e:fc:cb:ad:88:6a:ac:93:39:b2:85:e5:7b:22:fd:f4:23:02: - 30:5a:a8:08:73:d1:ac:59:02:7d:5c:33:16:b2:18:d1:8b:98: - a4:16:f5:bd:cb:aa:60:07:7a:39:17:0b:06:8d:58:f2:12:98: - 2e:09:01:a7:f2:b6:7d:69:3c:35:ef:4b:e0 -----BEGIN X509 CRL----- -MIIBZjCB7QIBATAKBggqhkjOPQQDAjCBlzELMAkGA1UEBhMCVVMxEzARBgNVBAgM +MIIBcjCB+AIBATAKBggqhkjOPQQDAjCBlzELMAkGA1UEBhMCVVMxEzARBgNVBAgM Cldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoMB3dvbGZTU0wx FDASBgNVBAsMC0RldmVsb3BtZW50MRgwFgYDVQQDDA93d3cud29sZnNzbC5jb20x -HzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20XDTE4MDUyOTIyNDc1N1oX -DTIxMDEwNzIyNDc1N1owFDASAgECFw0xODA1MjkyMjQ3NTdaoA4wDDAKBgNVHRQE -AwIBBTAKBggqhkjOPQQDAgNoADBlAjEAk9eCpdyDkP1nB1UKcPRhjH2aIknnoicC -kJmezV1Y7178y62IaqyTObKF5Xsi/fQjAjBaqAhz0axZAn1cMxayGNGLmKQW9b3L -qmAHejkXCwaNWPISmC4JAafytn1pPDXvS+A= +HzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20XDTIwMDUwNzA3MzkwNVoX +DTIzMDIwMTA3MzkwNVqgLzAtMB8GA1UdIwQYMBaAFKvgwyZMGNRyu9KEjJwKBZKA +ElNSMAoGA1UdFAQDAgEKMAoGCCqGSM49BAMCA2kAMGYCMQDL+JjRIWokH5IpEpT/ +mwJGgda6tesfMu7+bSH6zM2oPx9w8fuSI6KNGGE9hmzaZYwCMQC0pYAkXz7h98P6 +L9MD/z6+RMe4xsTzrgYIkwiGO3z3mSFwCpeKpYJPdqVibyLF600= -----END X509 CRL----- diff --git a/certs/crl/caEccCrl.pem b/certs/crl/caEccCrl.pem index 23799573c..b41e34e8a 100644 --- a/certs/crl/caEccCrl.pem +++ b/certs/crl/caEccCrl.pem @@ -1,26 +1,10 @@ -Certificate Revocation List (CRL): - Version 2 (0x1) - Signature Algorithm: ecdsa-with-SHA256 - Issuer: /C=US/ST=Washington/L=Seattle/O=wolfSSL/OU=Development/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - Last Update: May 29 22:47:57 2018 GMT - Next Update: Jan 7 22:47:57 2021 GMT - CRL extensions: - X509v3 CRL Number: - 4 -Revoked Certificates: - Serial Number: 02 - Revocation Date: May 29 22:47:57 2018 GMT - Signature Algorithm: ecdsa-with-SHA256 - 30:45:02:20:56:6f:9b:7d:a8:f2:8e:f1:f5:76:fa:f2:89:1a: - a4:0f:c4:5c:e8:60:33:a5:39:2d:d1:0a:72:4e:4e:ac:5e:fe: - 02:21:00:b9:66:ac:5c:dc:8c:98:f1:f8:bb:cf:ff:13:06:3e: - 47:b8:24:22:54:89:95:60:11:ab:31:60:27:4d:c4:9c:70 -----BEGIN X509 CRL----- -MIIBRjCB7QIBATAKBggqhkjOPQQDAjCBlzELMAkGA1UEBhMCVVMxEzARBgNVBAgM +MIIBUTCB+AIBATAKBggqhkjOPQQDAjCBlzELMAkGA1UEBhMCVVMxEzARBgNVBAgM Cldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoMB3dvbGZTU0wx FDASBgNVBAsMC0RldmVsb3BtZW50MRgwFgYDVQQDDA93d3cud29sZnNzbC5jb20x -HzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20XDTE4MDUyOTIyNDc1N1oX -DTIxMDEwNzIyNDc1N1owFDASAgECFw0xODA1MjkyMjQ3NTdaoA4wDDAKBgNVHRQE -AwIBBDAKBggqhkjOPQQDAgNIADBFAiBWb5t9qPKO8fV2+vKJGqQPxFzoYDOlOS3R -CnJOTqxe/gIhALlmrFzcjJjx+LvP/xMGPke4JCJUiZVgEasxYCdNxJxw +HzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20XDTIwMDUwNzA3MzkwNVoX +DTIzMDIwMTA3MzkwNVqgLzAtMB8GA1UdIwQYMBaAFFaOmsPwQt4YuUVVbvmTz+rD +86UhMAoGA1UdFAQDAgEJMAoGCCqGSM49BAMCA0gAMEUCIQCOU0jVUCIyvCbHYrPz +MYq+2W5NVgpR13bzUPMb9CNi0wIgP3KPV352FkVNRf7/H8LJPacmPQm/RchUCrrE +oxZSCQ8= -----END X509 CRL----- diff --git a/certs/crl/cliCrl.pem b/certs/crl/cliCrl.pem index 6a0ce1b37..e14b4de99 100644 --- a/certs/crl/cliCrl.pem +++ b/certs/crl/cliCrl.pem @@ -1,42 +1,42 @@ Certificate Revocation List (CRL): Version 2 (0x1) - Signature Algorithm: sha256WithRSAEncryption - Issuer: /C=US/ST=Montana/L=Bozeman/O=wolfSSL_2048/OU=Programming-2048/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - Last Update: May 29 22:47:57 2018 GMT - Next Update: Jan 7 22:47:57 2021 GMT + Signature Algorithm: sha256WithRSAEncryption + Issuer: C = US, ST = Montana, L = Bozeman, O = wolfSSL_2048, OU = Programming-2048, CN = www.wolfssl.com, emailAddress = info@wolfssl.com + Last Update: May 7 07:39:05 2020 GMT + Next Update: Feb 1 07:39:05 2023 GMT CRL extensions: X509v3 CRL Number: 6 Revoked Certificates: Serial Number: 02 - Revocation Date: May 29 22:47:57 2018 GMT + Revocation Date: May 7 07:39:05 2020 GMT Signature Algorithm: sha256WithRSAEncryption - 7b:c2:9a:bc:3a:b4:15:d0:fc:7c:8c:cd:da:23:30:08:7b:2d: - 8e:a7:2a:d7:e0:2e:c7:a6:2b:54:c9:0b:2f:d6:52:6c:98:c6: - 2a:fb:5d:68:0f:43:26:d6:c6:63:8c:79:1f:53:df:55:a9:64: - 88:da:da:09:49:90:11:dd:d2:43:87:14:f7:54:37:8d:57:52: - 72:af:56:0a:cf:93:f1:46:fa:ed:f8:cd:af:a9:9e:26:ec:45: - e3:ec:3f:ed:7e:48:10:cf:3a:94:45:8f:24:e0:e6:41:2e:1e: - bf:11:a9:4b:d3:d9:b3:1e:95:5b:6b:9b:68:18:a3:74:08:a6: - 87:b2:f3:a8:9a:33:5b:8b:97:09:16:72:68:8b:52:a2:79:2a: - e7:b5:aa:17:4e:b3:99:60:8f:30:35:c0:19:6a:0f:1a:23:b9: - bc:5a:8c:99:0e:cd:e4:bd:a3:6e:47:5e:e9:c1:53:97:40:ec: - 56:0b:24:cf:e5:7f:aa:1e:62:4d:46:a1:21:85:c7:b8:1b:74: - d4:03:52:d7:50:58:70:e0:db:03:66:ef:77:cc:6d:1e:a1:4d: - 84:45:c5:c2:15:d0:88:76:73:44:be:7b:8b:f2:94:b6:5b:99: - d4:69:7e:0f:4a:4e:90:ed:a9:b8:19:92:e1:b5:64:75:56:26: - f9:c1:2f:06 + 5d:00:8f:fe:61:75:86:11:3a:50:ee:fe:9a:50:42:f6:20:5a: + 5e:4e:6a:01:41:66:da:18:63:65:80:48:b9:91:c1:c0:b5:a1: + 2d:85:89:4a:0c:ad:c6:99:21:ec:82:97:aa:e2:8f:b1:c3:11: + 1e:96:b4:bb:f8:ad:b3:9b:5c:b5:ab:a6:68:d0:a8:df:63:04: + 51:22:eb:01:cc:f1:2e:94:9f:a1:b1:9f:1b:c4:f7:5c:98:87: + cd:cd:de:fe:d2:fe:f8:1d:24:10:67:75:2c:ec:3c:44:22:18: + b8:6e:41:8e:1c:00:41:ca:a1:ed:28:c0:b9:20:9c:35:fa:de: + f6:a3:b7:bd:4d:67:3f:50:f9:cd:a2:c3:5b:d9:0a:17:e9:75: + a9:e8:25:f8:1c:ed:fa:09:f0:87:be:19:21:88:60:bc:f2:23: + 76:9f:96:42:fe:0b:de:10:be:91:29:14:12:70:e9:85:d9:93: + fc:11:f9:c9:f3:eb:dc:0e:5f:7a:69:96:71:bf:eb:38:14:f3: + 21:d8:94:6f:9d:1c:2d:fc:56:45:20:7f:80:54:8b:cb:ae:f9: + 43:1a:99:95:a0:f0:9d:3c:ce:a3:cf:eb:c0:93:5c:df:19:69: + b0:c7:f1:89:7c:29:29:31:1e:2b:6e:79:a0:a9:de:8e:ba:20: + ba:17:8b:0c -----BEGIN X509 CRL----- MIICDjCB9wIBATANBgkqhkiG9w0BAQsFADCBnjELMAkGA1UEBhMCVVMxEDAOBgNV BAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xFTATBgNVBAoMDHdvbGZTU0xf MjA0ODEZMBcGA1UECwwQUHJvZ3JhbW1pbmctMjA0ODEYMBYGA1UEAwwPd3d3Lndv -bGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tFw0xODA1 -MjkyMjQ3NTdaFw0yMTAxMDcyMjQ3NTdaMBQwEgIBAhcNMTgwNTI5MjI0NzU3WqAO -MAwwCgYDVR0UBAMCAQYwDQYJKoZIhvcNAQELBQADggEBAHvCmrw6tBXQ/HyMzdoj -MAh7LY6nKtfgLsemK1TJCy/WUmyYxir7XWgPQybWxmOMeR9T31WpZIja2glJkBHd -0kOHFPdUN41XUnKvVgrPk/FG+u34za+pnibsRePsP+1+SBDPOpRFjyTg5kEuHr8R -qUvT2bMelVtrm2gYo3QIpoey86iaM1uLlwkWcmiLUqJ5Kue1qhdOs5lgjzA1wBlq -DxojubxajJkOzeS9o25HXunBU5dA7FYLJM/lf6oeYk1GoSGFx7gbdNQDUtdQWHDg -2wNm73fMbR6hTYRFxcIV0Ih2c0S+e4vylLZbmdRpfg9KTpDtqbgZkuG1ZHVWJvnB -LwY= +bGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tFw0yMDA1 +MDcwNzM5MDVaFw0yMzAyMDEwNzM5MDVaMBQwEgIBAhcNMjAwNTA3MDczOTA1WqAO +MAwwCgYDVR0UBAMCAQYwDQYJKoZIhvcNAQELBQADggEBAF0Aj/5hdYYROlDu/ppQ +QvYgWl5OagFBZtoYY2WASLmRwcC1oS2FiUoMrcaZIeyCl6rij7HDER6WtLv4rbOb +XLWrpmjQqN9jBFEi6wHM8S6Un6GxnxvE91yYh83N3v7S/vgdJBBndSzsPEQiGLhu +QY4cAEHKoe0owLkgnDX63vajt71NZz9Q+c2iw1vZChfpdanoJfgc7foJ8Ie+GSGI +YLzyI3aflkL+C94QvpEpFBJw6YXZk/wR+cnz69wOX3pplnG/6zgU8yHYlG+dHC38 +VkUgf4BUi8uu+UMamZWg8J08zqPP68CTXN8ZabDH8Yl8KSkxHitueaCp3o66ILoX +iww= -----END X509 CRL----- diff --git a/certs/crl/crl.pem b/certs/crl/crl.pem index bbcf5ecdd..faf24b5d3 100644 --- a/certs/crl/crl.pem +++ b/certs/crl/crl.pem @@ -1,41 +1,41 @@ Certificate Revocation List (CRL): Version 2 (0x1) - Signature Algorithm: sha256WithRSAEncryption - Issuer: /C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - Last Update: May 29 22:47:57 2018 GMT - Next Update: Jan 7 22:47:57 2021 GMT + Signature Algorithm: sha256WithRSAEncryption + Issuer: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting, CN = www.wolfssl.com, emailAddress = info@wolfssl.com + Last Update: May 7 07:39:05 2020 GMT + Next Update: Feb 1 07:39:05 2023 GMT CRL extensions: X509v3 CRL Number: 2 Revoked Certificates: Serial Number: 02 - Revocation Date: May 29 22:47:57 2018 GMT + Revocation Date: May 7 07:39:05 2020 GMT Signature Algorithm: sha256WithRSAEncryption - 6b:c1:26:13:77:62:8e:4e:a9:e5:87:b6:f6:66:c8:1f:cc:6a: - 20:94:f0:f6:a5:c6:b7:aa:03:b7:60:cf:74:16:5e:2f:c6:10: - 8c:82:c9:31:da:20:23:c0:9e:f0:64:4b:cc:d8:6c:ec:57:1a: - 5c:27:ec:36:db:64:f0:28:b2:34:33:d2:aa:1b:55:e7:4a:1f: - c2:51:e9:b8:32:a8:be:53:ee:21:65:f7:c5:92:d0:0d:98:db: - 65:50:7f:35:98:21:5b:52:a0:1e:ce:79:af:66:de:55:81:11: - 0f:b0:8d:20:a8:48:f3:ff:ca:99:69:04:d8:c6:ec:98:de:8b: - 56:e1:53:cf:0b:da:47:91:9e:27:ff:d2:2d:a3:65:61:80:89: - 64:20:65:12:41:ce:8e:c8:55:a5:90:8d:fa:02:45:6b:28:6e: - 28:ab:5a:94:c3:49:37:d0:b1:8e:d1:3b:9f:da:7e:36:73:d9: - 8d:a5:60:97:71:51:6f:7b:88:90:84:14:0a:50:31:3c:e1:63: - d6:dd:26:e9:f5:63:b2:ae:54:4e:8f:80:aa:2b:4c:94:ab:08: - 16:03:b0:31:3a:16:f3:c6:20:0a:00:c9:52:7c:88:72:23:8d: - 80:c9:98:45:c3:44:1e:84:99:b8:53:1e:67:23:bc:aa:80:f6: - 77:58:0a:7a + 99:6d:5f:dc:32:d2:39:58:25:2a:c3:80:3c:e6:89:5c:ca:da: + fc:c5:f9:11:16:4e:1e:d2:be:78:dd:fc:10:f8:f4:f6:86:bf: + 29:8d:62:4d:b3:4a:f4:8e:b7:77:d6:2f:fa:4f:fe:ec:01:de: + a5:a5:4e:0d:e4:d4:0c:c9:04:c5:7b:e1:87:cc:32:a5:9b:f4: + 11:12:fc:51:cc:9f:34:11:5d:4e:c6:f2:f5:db:dd:75:e6:da: + 2f:15:57:db:78:10:44:18:0d:f4:54:ce:ea:92:b2:15:43:83: + 7e:3d:2a:0e:e4:04:e1:13:ea:8e:ba:6c:2b:80:29:75:81:c5: + 21:67:95:ec:1c:37:42:03:8c:ba:8e:c1:bd:44:c6:a1:b1:52: + 73:10:ba:b8:a4:75:da:60:9a:ee:30:45:9b:a8:7b:f4:87:be: + de:51:11:5d:2b:23:2d:23:df:1e:ef:47:fd:bf:0d:34:ca:79: + 47:ef:16:a0:00:d7:9b:07:cb:42:77:e6:b3:cf:38:f9:88:82: + b1:4d:70:61:a4:11:7b:11:ec:bf:47:9c:25:82:82:eb:37:df: + 8a:76:eb:77:6f:5b:9e:11:fb:9c:8a:66:01:94:cf:4e:cb:93: + 3e:14:ae:77:a1:4e:ba:7f:59:46:6b:d0:0d:b7:c5:83:ef:da: + 48:d4:1d:d2 -----BEGIN X509 CRL----- MIICBDCB7QIBATANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMxEDAOBgNV BAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNhd3Rvb3Ro MRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cud29sZnNzbC5jb20x -HzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20XDTE4MDUyOTIyNDc1N1oX -DTIxMDEwNzIyNDc1N1owFDASAgECFw0xODA1MjkyMjQ3NTdaoA4wDDAKBgNVHRQE -AwIBAjANBgkqhkiG9w0BAQsFAAOCAQEAa8EmE3dijk6p5Ye29mbIH8xqIJTw9qXG -t6oDt2DPdBZeL8YQjILJMdogI8Ce8GRLzNhs7FcaXCfsNttk8CiyNDPSqhtV50of -wlHpuDKovlPuIWX3xZLQDZjbZVB/NZghW1KgHs55r2beVYERD7CNIKhI8//KmWkE -2MbsmN6LVuFTzwvaR5GeJ//SLaNlYYCJZCBlEkHOjshVpZCN+gJFayhuKKtalMNJ -N9CxjtE7n9p+NnPZjaVgl3FRb3uIkIQUClAxPOFj1t0m6fVjsq5UTo+AqitMlKsI -FgOwMToW88YgCgDJUnyIciONgMmYRcNEHoSZuFMeZyO8qoD2d1gKeg== +HzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20XDTIwMDUwNzA3MzkwNVoX +DTIzMDIwMTA3MzkwNVowFDASAgECFw0yMDA1MDcwNzM5MDVaoA4wDDAKBgNVHRQE +AwIBAjANBgkqhkiG9w0BAQsFAAOCAQEAmW1f3DLSOVglKsOAPOaJXMra/MX5ERZO +HtK+eN38EPj09oa/KY1iTbNK9I63d9Yv+k/+7AHepaVODeTUDMkExXvhh8wypZv0 +ERL8UcyfNBFdTsby9dvddebaLxVX23gQRBgN9FTO6pKyFUODfj0qDuQE4RPqjrps +K4ApdYHFIWeV7Bw3QgOMuo7BvUTGobFScxC6uKR12mCa7jBFm6h79Ie+3lERXSsj +LSPfHu9H/b8NNMp5R+8WoADXmwfLQnfms884+YiCsU1wYaQRexHsv0ecJYKC6zff +inbrd29bnhH7nIpmAZTPTsuTPhSud6FOun9ZRmvQDbfFg+/aSNQd0g== -----END X509 CRL----- diff --git a/certs/crl/crl.revoked b/certs/crl/crl.revoked index df6c204e8..20823413e 100644 --- a/certs/crl/crl.revoked +++ b/certs/crl/crl.revoked @@ -1,44 +1,44 @@ Certificate Revocation List (CRL): Version 2 (0x1) - Signature Algorithm: sha256WithRSAEncryption - Issuer: /C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - Last Update: May 29 22:47:57 2018 GMT - Next Update: Jan 7 22:47:57 2021 GMT + Signature Algorithm: sha256WithRSAEncryption + Issuer: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting, CN = www.wolfssl.com, emailAddress = info@wolfssl.com + Last Update: May 7 07:39:05 2020 GMT + Next Update: Feb 1 07:39:05 2023 GMT CRL extensions: X509v3 CRL Number: 3 Revoked Certificates: Serial Number: 01 - Revocation Date: May 29 22:47:57 2018 GMT + Revocation Date: May 7 07:39:05 2020 GMT Serial Number: 02 - Revocation Date: May 29 22:47:57 2018 GMT + Revocation Date: May 7 07:39:05 2020 GMT Signature Algorithm: sha256WithRSAEncryption - b4:bb:8c:be:03:d7:e3:38:93:ef:31:1c:11:a4:de:77:9a:5d: - 11:4c:5c:e4:7b:e5:c7:ac:6a:b4:bc:2a:f9:5a:01:bd:72:20: - 77:b6:46:4b:8c:c3:25:d7:c4:a6:39:fe:cf:9a:99:9d:af:02: - 3e:15:fe:38:b2:04:7e:99:74:63:61:07:8e:8e:f7:23:b4:96: - b8:85:2f:01:cb:e6:e4:c3:3d:cb:31:e7:60:38:02:3b:8a:da: - 15:d2:37:34:8b:da:3d:c7:c8:0d:f6:1f:da:f5:ac:66:a1:0d: - 22:73:a5:78:76:88:04:ec:7c:80:8b:a0:99:40:4b:56:aa:aa: - 8e:01:7b:66:b7:6e:9e:5b:82:e7:4c:9d:99:27:8f:cb:cb:26: - c1:38:ed:bc:3c:e5:07:79:0b:79:7c:29:60:08:72:01:fc:9a: - 2a:60:7e:93:f3:a8:a5:29:93:58:e6:8d:2f:6a:02:d5:70:7e: - cc:fd:69:6f:b4:09:60:c0:da:bb:ca:b1:e1:e2:91:85:9c:a3: - 46:73:99:19:4d:77:e5:1c:80:33:04:34:5d:c1:e3:88:6d:b1: - 10:6c:79:9a:dd:e9:ac:d8:82:f6:0d:f0:7c:4b:de:fd:f1:17: - 04:54:8e:56:ec:3c:79:06:17:30:42:39:d5:98:0d:bb:78:b3: - 9f:4e:5b:87 + a5:88:b2:03:e0:41:99:61:7a:aa:9a:1a:91:2c:1e:06:7a:18: + a5:6f:ab:42:63:58:d1:aa:b6:b9:9e:28:a2:28:9b:94:4b:ba: + 06:06:ad:dc:98:03:8c:40:07:43:e7:e9:ca:ea:d8:13:67:bd: + 4d:e3:77:c7:df:4f:e2:30:45:85:58:1b:a2:f4:08:4e:4b:45: + 04:9e:fd:1d:67:f3:aa:6c:16:2e:48:d1:bd:ea:1d:06:a2:9b: + e9:5a:74:ba:df:e2:e5:a4:1e:7e:d9:9c:7a:77:5e:16:3f:cc: + 10:c0:66:9c:c0:c3:d7:97:17:bf:c4:67:80:4d:5d:2e:84:84: + da:84:03:a9:62:4e:54:1e:5e:7c:42:7f:db:49:d5:aa:c2:e1: + c2:67:87:55:d7:9b:68:83:99:0d:1f:7d:93:56:ab:a6:43:41: + 15:10:56:02:51:d1:20:66:ac:7a:64:09:82:77:bd:80:2f:fa: + 09:5d:ce:29:61:ed:b0:f2:f8:44:ea:ce:b9:d9:7f:c2:2f:06: + e4:fa:a8:20:d4:09:89:11:4e:9b:46:f3:a7:3b:8f:b6:32:3b: + 92:57:13:15:4a:af:a0:de:1d:c4:32:de:c3:f4:94:34:da:49: + e7:b6:9d:8e:bf:50:94:9f:4d:9e:04:54:4a:96:bc:d8:25:f0: + 8a:f5:f4:93 -----BEGIN X509 CRL----- MIICGTCCAQECAQEwDQYJKoZIhvcNAQELBQAwgZQxCzAJBgNVBAYTAlVTMRAwDgYD VQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMREwDwYDVQQKDAhTYXd0b290 aDETMBEGA1UECwwKQ29uc3VsdGluZzEYMBYGA1UEAwwPd3d3LndvbGZzc2wuY29t -MR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tFw0xODA1MjkyMjQ3NTda -Fw0yMTAxMDcyMjQ3NTdaMCgwEgIBARcNMTgwNTI5MjI0NzU3WjASAgECFw0xODA1 -MjkyMjQ3NTdaoA4wDDAKBgNVHRQEAwIBAzANBgkqhkiG9w0BAQsFAAOCAQEAtLuM -vgPX4ziT7zEcEaTed5pdEUxc5Hvlx6xqtLwq+VoBvXIgd7ZGS4zDJdfEpjn+z5qZ -na8CPhX+OLIEfpl0Y2EHjo73I7SWuIUvAcvm5MM9yzHnYDgCO4raFdI3NIvaPcfI -DfYf2vWsZqENInOleHaIBOx8gIugmUBLVqqqjgF7ZrdunluC50ydmSePy8smwTjt -vDzlB3kLeXwpYAhyAfyaKmB+k/OopSmTWOaNL2oC1XB+zP1pb7QJYMDau8qx4eKR -hZyjRnOZGU135RyAMwQ0XcHjiG2xEGx5mt3prNiC9g3wfEve/fEXBFSOVuw8eQYX -MEI51ZgNu3izn05bhw== +MR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tFw0yMDA1MDcwNzM5MDVa +Fw0yMzAyMDEwNzM5MDVaMCgwEgIBARcNMjAwNTA3MDczOTA1WjASAgECFw0yMDA1 +MDcwNzM5MDVaoA4wDDAKBgNVHRQEAwIBAzANBgkqhkiG9w0BAQsFAAOCAQEApYiy +A+BBmWF6qpoakSweBnoYpW+rQmNY0aq2uZ4ooiiblEu6Bgat3JgDjEAHQ+fpyurY +E2e9TeN3x99P4jBFhVgbovQITktFBJ79HWfzqmwWLkjRveodBqKb6Vp0ut/i5aQe +ftmcendeFj/MEMBmnMDD15cXv8RngE1dLoSE2oQDqWJOVB5efEJ/20nVqsLhwmeH +VdebaIOZDR99k1arpkNBFRBWAlHRIGasemQJgne9gC/6CV3OKWHtsPL4ROrOudl/ +wi8G5PqoINQJiRFOm0bzpzuPtjI7klcTFUqvoN4dxDLew/SUNNpJ57adjr9QlJ9N +ngRUSpa82CXwivX0kw== -----END X509 CRL----- diff --git a/certs/crl/crl2.pem b/certs/crl/crl2.pem index 75a916a91..583bc8462 100644 --- a/certs/crl/crl2.pem +++ b/certs/crl/crl2.pem @@ -1,80 +1,80 @@ Certificate Revocation List (CRL): Version 2 (0x1) - Signature Algorithm: sha256WithRSAEncryption - Issuer: /C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - Last Update: May 29 22:47:57 2018 GMT - Next Update: Jan 7 22:47:57 2021 GMT + Signature Algorithm: sha256WithRSAEncryption + Issuer: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting, CN = www.wolfssl.com, emailAddress = info@wolfssl.com + Last Update: May 7 07:39:05 2020 GMT + Next Update: Feb 1 07:39:05 2023 GMT CRL extensions: X509v3 CRL Number: 2 Revoked Certificates: Serial Number: 02 - Revocation Date: May 29 22:47:57 2018 GMT + Revocation Date: May 7 07:39:05 2020 GMT Signature Algorithm: sha256WithRSAEncryption - 6b:c1:26:13:77:62:8e:4e:a9:e5:87:b6:f6:66:c8:1f:cc:6a: - 20:94:f0:f6:a5:c6:b7:aa:03:b7:60:cf:74:16:5e:2f:c6:10: - 8c:82:c9:31:da:20:23:c0:9e:f0:64:4b:cc:d8:6c:ec:57:1a: - 5c:27:ec:36:db:64:f0:28:b2:34:33:d2:aa:1b:55:e7:4a:1f: - c2:51:e9:b8:32:a8:be:53:ee:21:65:f7:c5:92:d0:0d:98:db: - 65:50:7f:35:98:21:5b:52:a0:1e:ce:79:af:66:de:55:81:11: - 0f:b0:8d:20:a8:48:f3:ff:ca:99:69:04:d8:c6:ec:98:de:8b: - 56:e1:53:cf:0b:da:47:91:9e:27:ff:d2:2d:a3:65:61:80:89: - 64:20:65:12:41:ce:8e:c8:55:a5:90:8d:fa:02:45:6b:28:6e: - 28:ab:5a:94:c3:49:37:d0:b1:8e:d1:3b:9f:da:7e:36:73:d9: - 8d:a5:60:97:71:51:6f:7b:88:90:84:14:0a:50:31:3c:e1:63: - d6:dd:26:e9:f5:63:b2:ae:54:4e:8f:80:aa:2b:4c:94:ab:08: - 16:03:b0:31:3a:16:f3:c6:20:0a:00:c9:52:7c:88:72:23:8d: - 80:c9:98:45:c3:44:1e:84:99:b8:53:1e:67:23:bc:aa:80:f6: - 77:58:0a:7a + 99:6d:5f:dc:32:d2:39:58:25:2a:c3:80:3c:e6:89:5c:ca:da: + fc:c5:f9:11:16:4e:1e:d2:be:78:dd:fc:10:f8:f4:f6:86:bf: + 29:8d:62:4d:b3:4a:f4:8e:b7:77:d6:2f:fa:4f:fe:ec:01:de: + a5:a5:4e:0d:e4:d4:0c:c9:04:c5:7b:e1:87:cc:32:a5:9b:f4: + 11:12:fc:51:cc:9f:34:11:5d:4e:c6:f2:f5:db:dd:75:e6:da: + 2f:15:57:db:78:10:44:18:0d:f4:54:ce:ea:92:b2:15:43:83: + 7e:3d:2a:0e:e4:04:e1:13:ea:8e:ba:6c:2b:80:29:75:81:c5: + 21:67:95:ec:1c:37:42:03:8c:ba:8e:c1:bd:44:c6:a1:b1:52: + 73:10:ba:b8:a4:75:da:60:9a:ee:30:45:9b:a8:7b:f4:87:be: + de:51:11:5d:2b:23:2d:23:df:1e:ef:47:fd:bf:0d:34:ca:79: + 47:ef:16:a0:00:d7:9b:07:cb:42:77:e6:b3:cf:38:f9:88:82: + b1:4d:70:61:a4:11:7b:11:ec:bf:47:9c:25:82:82:eb:37:df: + 8a:76:eb:77:6f:5b:9e:11:fb:9c:8a:66:01:94:cf:4e:cb:93: + 3e:14:ae:77:a1:4e:ba:7f:59:46:6b:d0:0d:b7:c5:83:ef:da: + 48:d4:1d:d2 -----BEGIN X509 CRL----- MIICBDCB7QIBATANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMxEDAOBgNV BAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNhd3Rvb3Ro MRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cud29sZnNzbC5jb20x -HzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20XDTE4MDUyOTIyNDc1N1oX -DTIxMDEwNzIyNDc1N1owFDASAgECFw0xODA1MjkyMjQ3NTdaoA4wDDAKBgNVHRQE -AwIBAjANBgkqhkiG9w0BAQsFAAOCAQEAa8EmE3dijk6p5Ye29mbIH8xqIJTw9qXG -t6oDt2DPdBZeL8YQjILJMdogI8Ce8GRLzNhs7FcaXCfsNttk8CiyNDPSqhtV50of -wlHpuDKovlPuIWX3xZLQDZjbZVB/NZghW1KgHs55r2beVYERD7CNIKhI8//KmWkE -2MbsmN6LVuFTzwvaR5GeJ//SLaNlYYCJZCBlEkHOjshVpZCN+gJFayhuKKtalMNJ -N9CxjtE7n9p+NnPZjaVgl3FRb3uIkIQUClAxPOFj1t0m6fVjsq5UTo+AqitMlKsI -FgOwMToW88YgCgDJUnyIciONgMmYRcNEHoSZuFMeZyO8qoD2d1gKeg== +HzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20XDTIwMDUwNzA3MzkwNVoX +DTIzMDIwMTA3MzkwNVowFDASAgECFw0yMDA1MDcwNzM5MDVaoA4wDDAKBgNVHRQE +AwIBAjANBgkqhkiG9w0BAQsFAAOCAQEAmW1f3DLSOVglKsOAPOaJXMra/MX5ERZO +HtK+eN38EPj09oa/KY1iTbNK9I63d9Yv+k/+7AHepaVODeTUDMkExXvhh8wypZv0 +ERL8UcyfNBFdTsby9dvddebaLxVX23gQRBgN9FTO6pKyFUODfj0qDuQE4RPqjrps +K4ApdYHFIWeV7Bw3QgOMuo7BvUTGobFScxC6uKR12mCa7jBFm6h79Ie+3lERXSsj +LSPfHu9H/b8NNMp5R+8WoADXmwfLQnfms884+YiCsU1wYaQRexHsv0ecJYKC6zff +inbrd29bnhH7nIpmAZTPTsuTPhSud6FOun9ZRmvQDbfFg+/aSNQd0g== -----END X509 CRL----- Certificate Revocation List (CRL): Version 2 (0x1) - Signature Algorithm: sha256WithRSAEncryption - Issuer: /C=US/ST=Montana/L=Bozeman/O=wolfSSL_2048/OU=Programming-2048/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - Last Update: May 29 22:47:57 2018 GMT - Next Update: Jan 7 22:47:57 2021 GMT + Signature Algorithm: sha256WithRSAEncryption + Issuer: C = US, ST = Montana, L = Bozeman, O = wolfSSL_2048, OU = Programming-2048, CN = www.wolfssl.com, emailAddress = info@wolfssl.com + Last Update: May 7 07:39:05 2020 GMT + Next Update: Feb 1 07:39:05 2023 GMT CRL extensions: X509v3 CRL Number: 1 No Revoked Certificates. Signature Algorithm: sha256WithRSAEncryption - 84:f8:1b:da:76:f6:ea:e9:17:f3:01:18:8f:4e:51:10:37:4b: - b4:2a:2d:6f:9b:0e:47:d4:f0:3d:c1:44:3d:67:9c:77:21:eb: - 26:c0:93:f6:19:7c:21:a1:d5:1a:72:e4:7d:5d:9b:a8:67:83: - bc:d1:f1:c8:17:1b:55:d6:eb:bc:59:46:ca:95:15:76:55:be: - 99:b9:de:3a:b0:d7:aa:dd:36:16:43:29:61:8d:7a:50:ee:e7: - 44:f8:d0:b0:9a:96:39:a8:62:86:3b:6c:28:85:b3:66:27:38: - c3:81:f7:38:32:bd:0a:be:db:33:3e:2f:3b:85:32:1a:56:d4: - 5d:b9:c1:ac:a1:f0:2a:34:1f:30:85:3b:2b:8f:95:bc:7b:21: - 52:86:3a:d2:b1:f7:6e:b3:98:47:6c:df:2f:6d:e1:e4:86:d9: - 06:08:ee:f1:7f:ae:02:3b:3f:99:dc:01:3e:41:1a:4d:76:fd: - 53:fa:84:9c:11:fd:81:b7:ce:e1:31:c5:eb:f8:57:39:11:0d: - 77:44:dd:ae:80:26:ef:48:cd:fe:7d:25:83:5f:54:b2:a1:50: - 82:10:25:47:b1:c7:86:12:37:b1:09:22:ef:97:3e:45:15:e0: - 21:69:61:e8:4c:0e:c1:74:1a:e1:e4:bb:80:92:dd:9b:b5:9b: - e7:1b:57:d7 + 71:e4:a8:f9:68:d2:18:ce:86:c0:d6:9a:78:61:5c:74:8f:ed: + d3:67:83:45:22:99:e7:22:4f:f8:8b:02:0b:7f:70:91:17:fa: + 16:2b:d8:54:7d:db:ed:26:55:06:27:64:ec:3f:7a:d6:75:4f: + 0d:cc:23:fc:f5:de:74:66:d2:60:8b:6c:f9:fa:f5:a7:45:1e: + 40:c5:a2:34:5f:6d:e9:5d:4b:a0:04:19:23:ba:5e:48:23:b9: + 21:74:dc:bf:8b:44:ad:1a:f0:21:45:49:a1:cf:1c:38:2a:33: + 07:4a:76:88:1b:ff:8b:c9:94:70:d2:1a:db:61:70:b9:2e:f2: + 01:0b:f5:16:e2:36:a7:45:99:57:cb:09:4b:16:51:16:d7:24: + 09:8b:54:f4:cd:43:c1:3a:f5:a6:c2:9b:20:ac:1e:88:20:f8: + 61:f4:6e:c4:e4:56:f6:c4:59:40:11:98:85:7a:46:52:8c:31: + b2:0e:38:92:23:d1:16:42:c3:cc:6d:2c:ce:72:b6:aa:ce:42: + 97:1b:44:b7:d2:e3:bd:d5:7b:db:82:5b:2b:82:b1:89:05:60: + f5:d3:dd:20:e6:e4:27:9f:fb:d8:4d:0c:00:f5:70:c4:a4:cc: + 5e:c5:10:63:33:66:97:0c:65:f3:0e:1d:43:8f:39:11:12:d9: + a0:67:8a:2e -----BEGIN X509 CRL----- MIIB+DCB4QIBATANBgkqhkiG9w0BAQsFADCBnjELMAkGA1UEBhMCVVMxEDAOBgNV BAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xFTATBgNVBAoMDHdvbGZTU0xf MjA0ODEZMBcGA1UECwwQUHJvZ3JhbW1pbmctMjA0ODEYMBYGA1UEAwwPd3d3Lndv -bGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tFw0xODA1 -MjkyMjQ3NTdaFw0yMTAxMDcyMjQ3NTdaoA4wDDAKBgNVHRQEAwIBATANBgkqhkiG -9w0BAQsFAAOCAQEAhPgb2nb26ukX8wEYj05REDdLtCotb5sOR9TwPcFEPWecdyHr -JsCT9hl8IaHVGnLkfV2bqGeDvNHxyBcbVdbrvFlGypUVdlW+mbneOrDXqt02FkMp -YY16UO7nRPjQsJqWOahihjtsKIWzZic4w4H3ODK9Cr7bMz4vO4UyGlbUXbnBrKHw -KjQfMIU7K4+VvHshUoY60rH3brOYR2zfL23h5IbZBgju8X+uAjs/mdwBPkEaTXb9 -U/qEnBH9gbfO4THF6/hXORENd0TdroAm70jN/n0lg19UsqFQghAlR7HHhhI3sQki -75c+RRXgIWlh6EwOwXQa4eS7gJLdm7Wb5xtX1w== +bGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tFw0yMDA1 +MDcwNzM5MDVaFw0yMzAyMDEwNzM5MDVaoA4wDDAKBgNVHRQEAwIBATANBgkqhkiG +9w0BAQsFAAOCAQEAceSo+WjSGM6GwNaaeGFcdI/t02eDRSKZ5yJP+IsCC39wkRf6 +FivYVH3b7SZVBidk7D961nVPDcwj/PXedGbSYIts+fr1p0UeQMWiNF9t6V1LoAQZ +I7peSCO5IXTcv4tErRrwIUVJoc8cOCozB0p2iBv/i8mUcNIa22FwuS7yAQv1FuI2 +p0WZV8sJSxZRFtckCYtU9M1DwTr1psKbIKweiCD4YfRuxORW9sRZQBGYhXpGUowx +sg44kiPRFkLDzG0sznK2qs5ClxtEt9LjvdV724JbK4KxiQVg9dPdIObkJ5/72E0M +APVwxKTMXsUQYzNmlwxl8w4dQ485ERLZoGeKLg== -----END X509 CRL----- diff --git a/certs/crl/eccCliCRL.pem b/certs/crl/eccCliCRL.pem index ffa155b49..87ee2e70b 100644 --- a/certs/crl/eccCliCRL.pem +++ b/certs/crl/eccCliCRL.pem @@ -1,26 +1,26 @@ Certificate Revocation List (CRL): Version 2 (0x1) - Signature Algorithm: ecdsa-with-SHA256 - Issuer: /C=US/ST=Oregon/L=Salem/O=Client ECC/OU=Fast/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - Last Update: May 29 22:47:57 2018 GMT - Next Update: Jan 7 22:47:57 2021 GMT + Signature Algorithm: ecdsa-with-SHA256 + Issuer: C = US, ST = Oregon, L = Salem, O = Client ECC, OU = Fast, CN = www.wolfssl.com, emailAddress = info@wolfssl.com + Last Update: May 7 07:39:05 2020 GMT + Next Update: Feb 1 07:39:05 2023 GMT CRL extensions: X509v3 CRL Number: 7 Revoked Certificates: Serial Number: 02 - Revocation Date: May 29 22:47:57 2018 GMT + Revocation Date: May 7 07:39:05 2020 GMT Signature Algorithm: ecdsa-with-SHA256 - 30:44:02:20:7b:58:a3:78:b4:fa:98:8b:bb:ce:83:a0:36:ee: - d5:69:ac:d2:8b:f6:67:86:c3:1d:44:2a:58:28:de:29:3e:d8: - 02:20:5a:56:34:28:7f:2b:75:0e:81:7f:80:2b:53:6c:13:e5: - d8:3a:2d:68:78:8d:c3:d6:e6:39:11:82:ee:ed:1f:5b + 30:46:02:21:00:8f:38:fa:0f:06:56:78:06:a6:61:49:56:40: + 84:cb:85:08:1d:72:f0:16:22:0d:d3:93:e8:6d:d8:c4:8c:f4: + 2e:02:21:00:e1:26:fa:65:dd:0f:45:fe:3a:82:f7:4f:7b:bb: + 09:b0:80:c5:03:a1:3f:bb:78:e6:0f:73:99:cd:73:f6:6f:c1 -----BEGIN X509 CRL----- -MIIBOzCB4wIBATAKBggqhkjOPQQDAjCBjTELMAkGA1UEBhMCVVMxDzANBgNVBAgM +MIIBPTCB4wIBATAKBggqhkjOPQQDAjCBjTELMAkGA1UEBhMCVVMxDzANBgNVBAgM Bk9yZWdvbjEOMAwGA1UEBwwFU2FsZW0xEzARBgNVBAoMCkNsaWVudCBFQ0MxDTAL BgNVBAsMBEZhc3QxGDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEfMB0GCSqGSIb3 -DQEJARYQaW5mb0B3b2xmc3NsLmNvbRcNMTgwNTI5MjI0NzU3WhcNMjEwMTA3MjI0 -NzU3WjAUMBICAQIXDTE4MDUyOTIyNDc1N1qgDjAMMAoGA1UdFAQDAgEHMAoGCCqG -SM49BAMCA0cAMEQCIHtYo3i0+piLu86DoDbu1Wms0ov2Z4bDHUQqWCjeKT7YAiBa -VjQofyt1DoF/gCtTbBPl2DotaHiNw9bmORGC7u0fWw== +DQEJARYQaW5mb0B3b2xmc3NsLmNvbRcNMjAwNTA3MDczOTA1WhcNMjMwMjAxMDcz +OTA1WjAUMBICAQIXDTIwMDUwNzA3MzkwNVqgDjAMMAoGA1UdFAQDAgEHMAoGCCqG +SM49BAMCA0kAMEYCIQCPOPoPBlZ4BqZhSVZAhMuFCB1y8BYiDdOT6G3YxIz0LgIh +AOEm+mXdD0X+OoL3T3u7CbCAxQOhP7t45g9zmc1z9m/B -----END X509 CRL----- diff --git a/certs/crl/eccSrvCRL.pem b/certs/crl/eccSrvCRL.pem index 1af3e8f8e..0321208ad 100644 --- a/certs/crl/eccSrvCRL.pem +++ b/certs/crl/eccSrvCRL.pem @@ -1,26 +1,26 @@ Certificate Revocation List (CRL): Version 2 (0x1) - Signature Algorithm: ecdsa-with-SHA256 - Issuer: /C=US/ST=Washington/L=Seattle/O=Eliptic/OU=ECC/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - Last Update: May 29 22:47:57 2018 GMT - Next Update: Jan 7 22:47:57 2021 GMT + Signature Algorithm: ecdsa-with-SHA256 + Issuer: C = US, ST = Washington, L = Seattle, O = Eliptic, OU = ECC, CN = www.wolfssl.com, emailAddress = info@wolfssl.com + Last Update: May 7 07:39:05 2020 GMT + Next Update: Feb 1 07:39:05 2023 GMT CRL extensions: X509v3 CRL Number: 8 Revoked Certificates: Serial Number: 02 - Revocation Date: May 29 22:47:57 2018 GMT + Revocation Date: May 7 07:39:05 2020 GMT Signature Algorithm: ecdsa-with-SHA256 - 30:44:02:20:17:18:ac:ac:96:28:7b:87:6a:d4:10:03:df:d8: - 34:23:33:67:ed:ad:20:df:ab:da:a9:7c:f4:61:c0:d1:d5:4b: - 02:20:74:47:c1:26:c7:8c:92:f3:7c:c2:91:96:26:91:90:ff: - d2:23:b8:dc:e9:62:f9:d2:19:18:11:94:e5:b2:ff:85 + 30:46:02:21:00:a5:cd:fa:b6:7a:60:6b:9a:a7:ef:aa:09:80: + bd:a7:78:6e:c4:3b:bb:df:8a:fa:d8:c6:54:d5:4f:51:8f:4d: + 7b:02:21:00:bd:cb:d6:cb:5f:23:39:70:69:8d:7a:cf:f0:7e: + 56:6f:5a:17:ea:58:75:18:08:57:b3:6b:ee:8f:b4:53:56:04 -----BEGIN X509 CRL----- -MIIBPTCB5QIBATAKBggqhkjOPQQDAjCBjzELMAkGA1UEBhMCVVMxEzARBgNVBAgM +MIIBPzCB5QIBATAKBggqhkjOPQQDAjCBjzELMAkGA1UEBhMCVVMxEzARBgNVBAgM Cldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoMB0VsaXB0aWMx DDAKBgNVBAsMA0VDQzEYMBYGA1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZI -hvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tFw0xODA1MjkyMjQ3NTdaFw0yMTAxMDcy -MjQ3NTdaMBQwEgIBAhcNMTgwNTI5MjI0NzU3WqAOMAwwCgYDVR0UBAMCAQgwCgYI -KoZIzj0EAwIDRwAwRAIgFxisrJYoe4dq1BAD39g0IzNn7a0g36vaqXz0YcDR1UsC -IHRHwSbHjJLzfMKRliaRkP/SI7jc6WL50hkYEZTlsv+F +hvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tFw0yMDA1MDcwNzM5MDVaFw0yMzAyMDEw +NzM5MDVaMBQwEgIBAhcNMjAwNTA3MDczOTA1WqAOMAwwCgYDVR0UBAMCAQgwCgYI +KoZIzj0EAwIDSQAwRgIhAKXN+rZ6YGuap++qCYC9p3huxDu734r62MZU1U9Rj017 +AiEAvcvWy18jOXBpjXrP8H5Wb1oX6lh1GAhXs2vuj7RTVgQ= -----END X509 CRL----- diff --git a/certs/ecc-privOnlyCert.pem b/certs/ecc-privOnlyCert.pem index e6034bed8..7fe84feaf 100644 --- a/certs/ecc-privOnlyCert.pem +++ b/certs/ecc-privOnlyCert.pem @@ -1,9 +1,9 @@ -----BEGIN CERTIFICATE----- -MIIBIzCBygIJAIQV31BIhAeYMAoGCCqGSM49BAMCMBoxCzAJBgNVBAoMAldSMQsw -CQYDVQQDDAJERTAeFw0xODA0MTMxNTIzMTBaFw0yMTAxMDcxNTIzMTBaMBoxCzAJ -BgNVBAoMAldSMQswCQYDVQQDDAJERTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IA -BCXA/Ra4K/K4Ch7drM5iUnxYCmB9V3XavRHB1SrqVGt25j02991Rl2uoJv57pr2W -VYVQnZp+aQHYQ0WJ2f5KKyYwCgYIKoZIzj0EAwIDSAAwRQIhAJvs7Y00EWq/Yv9A -ymP/fVWsxz8/fhbZKi09eq2eqV/gAiBW9u61nV2snwijm5r6EWrnlGKoNb9niPCD -qg/y+r8d1A== +MIIBLzCB1QIUNbvmAiaGsI7T/uDqhNGbv8xIBEAwCgYIKoZIzj0EAwIwGjELMAkG +A1UECgwCV1IxCzAJBgNVBAMMAkRFMB4XDTIwMDUwNzA3MzkwNFoXDTIzMDIwMTA3 +MzkwNFowGjELMAkGA1UECgwCV1IxCzAJBgNVBAMMAkRFMFkwEwYHKoZIzj0CAQYI +KoZIzj0DAQcDQgAEJcD9Frgr8rgKHt2szmJSfFgKYH1Xddq9EcHVKupUa3bmPTb3 +3VGXa6gm/numvZZVhVCdmn5pAdhDRYnZ/korJjAKBggqhkjOPQQDAgNJADBGAiEA +hdGxZ2LtYbAW4j/Y6C0YXp6RHqB/p+NH486IE8dZNAUCIQCuq8AkD0pSSDKmDLPT +P2baUEqh9flqEOaPZvVzitKkfQ== -----END CERTIFICATE----- diff --git a/certs/ecc-rsa-server.p12 b/certs/ecc-rsa-server.p12 index 84cb0a4b6564e297fd454c2c9ed91ead7d236fd9..ff54cfca715c32abd6cd81003bc2a199ad522b0e 100644 GIT binary patch delta 2214 zcmV;X2wC^$66O&=FoFo;0s#Xsf(WPv2`Yw2hW8Bt2LYgh2$=+e2$e8`2$3*?2Zsg; zDuzgg_YDCD2B3lmcrbzobOHeYFoFkdkw6`P80HAS_h{V@0s;sCfPx1=Vjh>KxD3D( zE!DO3O@a`gA%D1FONM-+*ClNB@8l8?t%t~`cLsDxBX-U1?CUtBH%KnhJSgk9?$M9?WX7@dXYrZ0;jMq+O9I}1 zp|vv$Hid*I=8E220DhV{nd7W@#oZaj5~{!hArbCB*q)w~`x6NDnEB%QY!qQD3v$O6 z$(a4O*|18z(xT@mGl`G4vb}1T`yCkZSTZ}wa5_v+GOQO98rpw`Lk>9(3YWJEW7!*dB^>j)S#-$E(TYjW`Hmh&1d>D>3qhe_E(M?0_mb#4fbV zqL=J;J|Kjf+8cY#t91w#QH_jo*PCt#ia(WewTYgUZ-hwrGT!ed&pcF0D7YONKg%oo zR-tirn&#{vH68N`Qu>r2F#DL&%!zl;D0{7Oqr3TiZeqLK<= zfe6am{6r#FAOT5%1)1=lB#vm&5EkkvGq7-MQ|$ZDQ3}=cj8L82f+SPpZm zoa|YEAX;XP4axFVWGQCLth3&n39Ob*=WRs9Br1JbJ&-(fuLb<8K3Ievoy{-N&9K7m z#8NO<*Idyp7S$U1Iif!KvHE7Jycq3Qtj)@6^EZMDSA+Q852LDDx>KfR_WhNiv4*T5 z7nwe!vw|RfW@6p1^u0VMX6WzhC)? z%$YG8n1i6;@Gf?u%B`;FrYPzDlt!F{sbn98oMy}S2pD?XtOweELVmkbNQu%~23d^@ z?>iHW_XJJnoXQIskO_WTNoKu%^u*O}am9@`S9}O~eXnhax$TCNpcE7ZQ>IdIzX9={ za%d^gX(Hf_$Nv2r1{sOrtKKjl^-A>`IdW%=>c_S*s*TjTfudl@=Sw%A%J(sF!yty` z#-bZOk#Lx7?ifFRcS=;+yL~SGVQC($zQ3GWloR~NlV8`i7Z5Ew!0^0wc^d)@FbQ?Slic%q}Fsj@9 zDLd<__423>!Pp(NdA7rp{Syp;`qV6gC327i|s-z?>dfT#{b z^bEIuTpm<3P+zraJe2xi834INS@&wOY6^%n5RwLv2A#g-q@*ZHxR`GVO2)-67c)&V5<(3@;8DU*TEPyqfyjfg? zC~-}7ZDct@uWi=q{r3%bj&vKgC(6a={!FcBh`#b6Jz@_2w}~)#8vg*B-(xdsP=s10 zQY+6kj||JnX3~lCJ}P3^IiuPjK=SknwA|x=^KpvAf|r$il4pMGM&Ei{GuHKWi#8MB z{p0exOif@Q9*>OL?Z1EpHCuX$!|B{ zB2r-j0tf&Efsg~+eGk5@IyI8@VS`z>y^P0>es}MC75;DwXpc|3fh5=wZrYg9Z!#FR zDLE@BIy5P|Lrq?eQC|fnrQC*FfuC$~s+F3T>TaPZY(z2a9YoI8U;a+(l$XMzartcd z<+XN8Iz7FMcMo~a5k$ELS7&BFC z(gPb(fN1ikr{Mi!>w43dG`hE)Zc{+)$7tR<8Mm#i-bJFa1AMJ38>^58>=VWa>rmr= zwi8rfy(y#bZ3w9c_YqL$;>}(xz$CsT-CF4%$}MsB83lTV<5CQAW!AD#s6FfTz9*d; z?2!m=YtPsgTq!|K=X6XM5OfflqgSh=#-OEgj<~vjOu!U^oWqYXM-^k{0c2gK1did3ut0znRB18+y4AeK=nK8ic!>`Xl#oi;4l^9{&oitSRJ_s`PgP#^L z{5cO2&6$7jE*q||sOkDA7rKTE$dD|yPFKbWyFVRy;b@sgCXm0<#yZL>sTa+EzYzyJ zw*8JH@XECV@>-@RzgW1&hZ)-j!auz2w{#H= zRM`H4awfwNt{JXilKxWJ>>bA@fso!;x_ zmUZW3&gq#T;$9%8t~dvMA8$-9iA^GG0;*OHLbjLoqJtpVlqQYu#ACnQAZCGh0yE+3 zWxx6XhDSYy3*w*#Sct<+!_uv>SB(j7GT>rDsK}WbiwW-FQ~%`v*cStT3yA~Q2F$U+ zIKGln_bcA58h0|r&IT@i-6hOYIr}XLw%UIx+nS5oBK50}WbP4kU}c4cvLNPoJSE^lRj+WIfDIBag($iJsJ zABdDw_&`37-FF}%8gG13qIUA3f7myp_|0K2H2RMvWEPuLgc3C(!&pmr^mH)eYpo6? z29m|?0iG9**BJh@m#tm)c}m=LU_cD%9(2vAT&ERYkj$UU6Ma1Y)!Ef1OCdH#m}ck) zpC8N|v*+-*7g1(^c;M_=kpssL;{mld|8~D~Cwl$_0Cyh`Fjgku2d-$@*i$4amYWRH z?@0W}V=1Mr&L4*B@d>Q6Y|kDjGIWM()liwVoJH8}dFQ?DB>a+9)#Yy!T1#6yHRr_K zT%6zZ66NCX`*tP&%hDbM52;;`Dw~6%FGMSSsoyX zYGMcQ@4WZ!ab>v%dYoZj6DYcYL4_Y*S&q&OQ4s>#@ctG+R$0X9W)`l_K2p=|eI3;? z;=ggbcd(X!9xgY6?a|GCmgdt5ax+Z~F^*dt16}iJ(*aK|@dLewKUT2+`^GYC>nTlS zHM+o=lg`lxjq`hf8pBoC>?HEor#t>;oevfltL3Tx5Uue5o!;WuMl%UtnRe2@DbE$Z z23*b>C~N6^|EzM}#Jee}0dmEpn@q@A@vyMqXM@szQYGub3j)XPzUUFPTqVW40D`B{ z3cIJK^@OJ;9w_rx(f^sHXj$0KGl(2nCNeuZi$$PlRoPiVs{X7P1_#C+%ZKTycvm}W1pC_FpFPMZ z9~ST<(ZbU(X!~2J`(hok&S&bAxHX3=su@y$727y*Vf3a@ru&2wb!K;YfI>3LJX$^q zW46F^cg|BA-3^jjymI8%2v2Tb!@jAUW3Fa0+&R zi>uKNxwWK567y73^&{MP_*z5EeT#M=2|d;?JewbBdx*2xtD1T+0fjuUA=}3pQHv5Q ze+Np!U<(>~xk9!-=9`}?95B}nQATRf=cf-y+qC(RLmG{Z1lA+`E6{zI0j3D$zCh)b zH1q4&&bs>)i#iD;y<*bL`ZL)uTAw0c7}adT&hW1H@;zLLx5-J^zSv_*nmw3Eitd|Q zJKY9-C@VHc$f{Vs8E2(9ght&Ezq`L29Q+=!@`@=E+BHPHja|%q34NH1xJB}GK8{IA)CKYBOed4x8p^gXM3q#bP{73R#j zoTdpa)#3y!fcYZx5^x@#xXt{Gv546aF(oh~1_>&LNQUIoizUziebjgv04`m8_<#?(}QaxGOk(Vh*$?bO1_ zGEDOn4CKUljSLJ-4a^P9jV%pKqJUgu10w@NC>Nw?avP%uzpg6v;HJoc>r zro#4eiaWcZZQq6`4S5x8D>4);WKKU!UGeYW%Yx{L>sHn#2Sewz)h9+}wn)^MhH>4O Zy2@v2FB@-iPU`Sm-QKf%l|C>s002M!X&V3l delta 300 zcmeyt_K8i)pouxppo!_-0%j&gCMFT7vTdu+hTppzUO2C6{e?UQiF@yV8nCi4Yo``Y zmSLKwU?3;XYh++xWN2()Xl!a?5(VTM85$Z`Lb)JCliL_Q_|*-X7?llV*_cCR`B=nQ zCNnaLPX5GrsvfHaJRoJlEUX61jEw&c#6Ubj7JdWXChpXV#N2|MRK4WeBLiT60_W^*OD-{#&fN`U#UK`zFKO*-On&$9BhWU6}iJYV2~h=%a?; zKCeiX)MC(aGq2rS6V}AoZ>?%^Vfwz*4;e@QxNg=8W8I@~u*}1JKiB5#7NYkb+0Hysd6lH8fw_UX zv891YlsK=Ev4N3+A(T5&YwqM`#?3_m7ZMucUfeK0$XdwR0DoBXeOsZDxC z_dh?Aa+E#vYi9VA3fEH%T+c1c&UyYnA!1?nQ?)@kau3rUGlvz^rKaUo95*;@65g=? rxaE-@7Zzj)#d9T^r2bg?Q@>9_vvAh`;FL)pk!*t?Ry+l+%7<|+)M{iRDfXN|HrRg6hL_%NA)TgAs tUONDW9FC_-PfH|Y9Q;lOIj;nLgnwqKYkNJ$}8AFaWMZQwjh8 diff --git a/certs/ed448/root-ed448.pem b/certs/ed448/root-ed448.pem index 8cfaf623f..8052dca30 100644 --- a/certs/ed448/root-ed448.pem +++ b/certs/ed448/root-ed448.pem @@ -2,12 +2,12 @@ Certificate: Data: Version: 3 (0x2) Serial Number: - 4c:ed:9f:66:e8:c6:f4:c2:6d:5d:bc:da:14:f7:e9:61:92:fb:8d:d8 + 14:b1:9c:29:b7:25:60:05:7c:fb:01:03:b5:14:d9:95:b5:74:b7:03 Signature Algorithm: ED448 Issuer: C = US, ST = Montana, L = Bozeman, O = wolfSSL_Ed448, OU = Root-Ed448, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Feb 13 01:35:44 2020 GMT - Not After : Nov 9 01:35:44 2022 GMT + Not Before: May 7 07:39:04 2020 GMT + Not After : Feb 1 07:39:04 2023 GMT Subject: C = US, ST = Montana, L = Bozeman, O = wolfSSL_Ed448, OU = Root-Ed448, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: ED448 @@ -28,27 +28,27 @@ Certificate: X509v3 Key Usage: critical Digital Signature, Certificate Sign, CRL Sign Signature Algorithm: ED448 - 32:f2:95:d6:56:9f:c4:5c:2a:36:da:51:b7:96:cb:97:f7:c5: - 02:f2:20:f4:20:fa:a8:25:6f:dc:f9:c4:b7:ac:be:39:68:3b: - 9e:58:4a:42:c3:74:e2:55:bd:44:54:40:18:7c:d4:30:47:6f: - 53:03:80:c9:21:50:a5:e9:1f:27:44:42:5f:ce:d4:a7:a4:bf: - 5e:3b:00:86:1c:8e:a7:4a:4f:4b:24:63:1c:fc:4e:06:39:af: - 04:7d:84:7f:66:a9:e4:e9:e7:ba:b7:87:e8:27:7c:1a:d5:55: - 3d:7e:bd:90:30:00 + 50:d0:60:80:5e:e8:d8:30:58:1b:03:79:85:43:b4:5a:3d:cb: + 93:37:46:1f:fa:7f:1a:b2:2e:72:df:f3:e6:1a:41:1d:c2:fa: + 99:57:94:78:45:ca:00:0a:e7:38:36:ce:49:ff:c8:14:38:36: + f9:25:80:23:59:bc:02:bc:36:40:a8:97:1a:96:6e:78:c7:30: + c3:34:57:80:bf:c7:39:c4:b8:d0:a0:68:12:5f:0a:61:34:65: + f8:a5:f9:2f:74:94:77:40:27:9d:6f:8e:d0:90:19:86:40:ae: + 3a:44:6c:a4:33:00 -----BEGIN CERTIFICATE----- -MIICpDCCAiSgAwIBAgIUTO2fZujG9MJtXbzaFPfpYZL7jdgwBQYDK2VxMIGZMQsw +MIICpDCCAiSgAwIBAgIUFLGcKbclYAV8+wEDtRTZlbV0twMwBQYDK2VxMIGZMQsw CQYDVQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjEW MBQGA1UECgwNd29sZlNTTF9FZDQ0ODETMBEGA1UECwwKUm9vdC1FZDQ0ODEYMBYG A1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZz -c2wuY29tMB4XDTIwMDIxMzAxMzU0NFoXDTIyMTEwOTAxMzU0NFowgZkxCzAJBgNV +c2wuY29tMB4XDTIwMDUwNzA3MzkwNFoXDTIzMDIwMTA3MzkwNFowgZkxCzAJBgNV BAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMRYwFAYD VQQKDA13b2xmU1NMX0VkNDQ4MRMwEQYDVQQLDApSb290LUVkNDQ4MRgwFgYDVQQD DA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5j b20wQzAFBgMrZXEDOgALZCYoz7VGm+4/6jv1Znoy1P59+IBfWFds13nuZqI9VI+N CK/LuEOUUF3lU2JpyHWCpl5EyktbCwCjYzBhMB0GA1UdDgQWBBTaaZjJJkp1+1le U5pjSwy4iAsPHjAfBgNVHSMEGDAWgBTaaZjJJkp1+1leU5pjSwy4iAsPHjAPBgNV -HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAFBgMrZXEDcwAy8pXWVp/EXCo2 -2lG3lsuX98UC8iD0IPqoJW/c+cS3rL45aDueWEpCw3TiVb1EVEAYfNQwR29TA4DJ -IVCl6R8nREJfztSnpL9eOwCGHI6nSk9LJGMc/E4GOa8EfYR/Zqnk6ee6t4foJ3wa -1VU9fr2QMAA= +HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAFBgMrZXEDcwBQ0GCAXujYMFgb +A3mFQ7RaPcuTN0Yf+n8asi5y3/PmGkEdwvqZV5R4RcoACuc4Ns5J/8gUODb5JYAj +WbwCvDZAqJcalm54xzDDNFeAv8c5xLjQoGgSXwphNGX4pfkvdJR3QCedb47QkBmG +QK46RGykMwA= -----END CERTIFICATE----- diff --git a/certs/ed448/server-ed448-cert.pem b/certs/ed448/server-ed448-cert.pem index c239c13db..425d14c5f 100644 --- a/certs/ed448/server-ed448-cert.pem +++ b/certs/ed448/server-ed448-cert.pem @@ -5,8 +5,8 @@ Certificate: Signature Algorithm: ED448 Issuer: C = US, ST = Montana, L = Bozeman, O = wolfSSL_ed448, OU = CA-ed448, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Feb 13 01:35:44 2020 GMT - Not After : Nov 9 01:35:44 2022 GMT + Not Before: May 7 07:39:04 2020 GMT + Not After : Feb 1 07:39:04 2023 GMT Subject: C = US, ST = Montana, L = Bozeman, O = wolfSSL_ed448, OU = Server-ed448, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: ED448 @@ -31,19 +31,19 @@ Certificate: Netscape Cert Type: SSL Server Signature Algorithm: ED448 - 91:15:fc:8e:a6:00:50:bf:8e:44:4e:14:39:a3:91:29:12:25: - a5:8b:42:5b:85:a0:c3:d7:b3:6a:1b:4c:d9:4f:20:5a:92:5b: - 58:2a:f4:86:21:35:0b:d6:a5:b1:ca:98:6a:cb:09:c7:98:a5: - 22:b6:00:a2:ef:81:19:4f:4d:28:4e:80:47:6a:3c:82:88:84: - 8b:03:99:48:5b:cc:c4:75:98:b2:70:b1:93:6c:24:a7:8e:01: - 6a:2f:15:53:25:c2:45:5c:b6:25:db:17:93:fb:9c:1d:0f:c6: - a6:88:70:44:2e:00 + 43:c9:1f:31:8a:90:cb:9b:e9:00:14:ec:d9:c8:5d:20:61:4f: + 9d:44:2e:99:30:6e:29:5b:41:34:ee:78:43:cd:1d:7c:ff:a7: + b4:75:32:94:a5:9a:22:fc:8f:7f:05:17:c8:a8:b3:70:38:61: + 45:ef:80:0c:83:a6:af:7c:8b:52:1c:5f:53:1b:e8:4a:5c:d8: + af:26:3e:ef:5c:7c:1d:10:bb:7a:1c:4b:d0:24:82:39:9e:1b: + 5d:9f:cb:56:18:3d:c9:3c:03:1f:c4:cd:c4:48:69:6d:de:fb: + f4:45:02:eb:08:00 -----BEGIN CERTIFICATE----- MIICuDCCAjigAwIBAgIBATAFBgMrZXEwgZcxCzAJBgNVBAYTAlVTMRAwDgYDVQQI DAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMRYwFAYDVQQKDA13b2xmU1NMX2Vk NDQ4MREwDwYDVQQLDAhDQS1lZDQ0ODEYMBYGA1UEAwwPd3d3LndvbGZzc2wuY29t -MR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMB4XDTIwMDIxMzAxMzU0 -NFoXDTIyMTEwOTAxMzU0NFowgZsxCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250 +MR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMB4XDTIwMDUwNzA3Mzkw +NFoXDTIzMDIwMTA3MzkwNFowgZsxCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250 YW5hMRAwDgYDVQQHDAdCb3plbWFuMRYwFAYDVQQKDA13b2xmU1NMX2VkNDQ4MRUw EwYDVQQLDAxTZXJ2ZXItZWQ0NDgxGDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEf MB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbTBDMAUGAytlcQM6AFSBOQHr @@ -51,7 +51,7 @@ N9mpB80BvJ1wFsIsK3VbY9vuOi1Ekka0ewcDT6Kuhobci0ssf+hrFI1Y3W3nbzoF lajvAKOBiTCBhjAdBgNVHQ4EFgQUfKtcEqlo2BgQKH2SxUq4TEx2DtswHwYDVR0j BBgwFoAUOFlF6N1ELLV9pSXWC8w58HLAlGMwDAYDVR0TAQH/BAIwADAOBgNVHQ8B Af8EBAMCA6gwEwYDVR0lBAwwCgYIKwYBBQUHAwEwEQYJYIZIAYb4QgEBBAQDAgZA -MAUGAytlcQNzAJEV/I6mAFC/jkROFDmjkSkSJaWLQluFoMPXs2obTNlPIFqSW1gq -9IYhNQvWpbHKmGrLCceYpSK2AKLvgRlPTShOgEdqPIKIhIsDmUhbzMR1mLJwsZNs -JKeOAWovFVMlwkVctiXbF5P7nB0PxqaIcEQuAA== +MAUGAytlcQNzAEPJHzGKkMub6QAU7NnIXSBhT51ELpkwbilbQTTueEPNHXz/p7R1 +MpSlmiL8j38FF8ios3A4YUXvgAyDpq98i1IcX1Mb6Epc2K8mPu9cfB0Qu3ocS9Ak +gjmeG12fy1YYPck8Ax/EzcRIaW3e+/RFAusIAA== -----END CERTIFICATE----- diff --git a/certs/ed448/server-ed448.der b/certs/ed448/server-ed448.der index c9971b413037bc0add36d48b3549da9f876c3d11..d6581895f2113e968f8ad486916678e8b71eeae1 100644 GIT binary patch delta 149 zcmV;G0BZld1-u22xED1rH!wFdIWRO@7Y#BqFfuSPFgG(fFtN{j0dhmhA2EuM%bV!{ z6zti^T_9mkokT8~Fm5SZK{W1oL(Lt0|EIKdGL)s7BK(hk1sBMuvv4?JMel$NgQl;1 zi&7k4Qyb_?T-dKBKJQ$79T2;E981t7f;pZWU7yQV7(K~610TfA#7Jpv-uv`L0_z9> D#`Qf@ delta 149 zcmV;G0BZld1-u22xEC@pGcYkTH8eC@7Y#BpF)=VXFflVVG_lWn0dkQQ{EnsoP`{2u zP82z#ktq@-rHevag`mUNvuYbm*-s!^l3Q3R^oAid3)ZEv%9v`)3CEbFBDMgc?|~Ul zO(;%)M`}ERh=hv+nMhmA#C4dmaIuqYB&Uu6YA+R2CBj8qwk6vallz<<55}g5a6~Qu DTX#E{ diff --git a/certs/ed448/server-ed448.pem b/certs/ed448/server-ed448.pem index 6dfa73000..7e2d0ae12 100644 --- a/certs/ed448/server-ed448.pem +++ b/certs/ed448/server-ed448.pem @@ -5,8 +5,8 @@ Certificate: Signature Algorithm: ED448 Issuer: C = US, ST = Montana, L = Bozeman, O = wolfSSL_ed448, OU = CA-ed448, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Feb 13 01:35:44 2020 GMT - Not After : Nov 9 01:35:44 2022 GMT + Not Before: May 7 07:39:04 2020 GMT + Not After : Feb 1 07:39:04 2023 GMT Subject: C = US, ST = Montana, L = Bozeman, O = wolfSSL_ed448, OU = Server-ed448, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: ED448 @@ -31,19 +31,19 @@ Certificate: Netscape Cert Type: SSL Server Signature Algorithm: ED448 - 91:15:fc:8e:a6:00:50:bf:8e:44:4e:14:39:a3:91:29:12:25: - a5:8b:42:5b:85:a0:c3:d7:b3:6a:1b:4c:d9:4f:20:5a:92:5b: - 58:2a:f4:86:21:35:0b:d6:a5:b1:ca:98:6a:cb:09:c7:98:a5: - 22:b6:00:a2:ef:81:19:4f:4d:28:4e:80:47:6a:3c:82:88:84: - 8b:03:99:48:5b:cc:c4:75:98:b2:70:b1:93:6c:24:a7:8e:01: - 6a:2f:15:53:25:c2:45:5c:b6:25:db:17:93:fb:9c:1d:0f:c6: - a6:88:70:44:2e:00 + 43:c9:1f:31:8a:90:cb:9b:e9:00:14:ec:d9:c8:5d:20:61:4f: + 9d:44:2e:99:30:6e:29:5b:41:34:ee:78:43:cd:1d:7c:ff:a7: + b4:75:32:94:a5:9a:22:fc:8f:7f:05:17:c8:a8:b3:70:38:61: + 45:ef:80:0c:83:a6:af:7c:8b:52:1c:5f:53:1b:e8:4a:5c:d8: + af:26:3e:ef:5c:7c:1d:10:bb:7a:1c:4b:d0:24:82:39:9e:1b: + 5d:9f:cb:56:18:3d:c9:3c:03:1f:c4:cd:c4:48:69:6d:de:fb: + f4:45:02:eb:08:00 -----BEGIN CERTIFICATE----- MIICuDCCAjigAwIBAgIBATAFBgMrZXEwgZcxCzAJBgNVBAYTAlVTMRAwDgYDVQQI DAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMRYwFAYDVQQKDA13b2xmU1NMX2Vk NDQ4MREwDwYDVQQLDAhDQS1lZDQ0ODEYMBYGA1UEAwwPd3d3LndvbGZzc2wuY29t -MR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMB4XDTIwMDIxMzAxMzU0 -NFoXDTIyMTEwOTAxMzU0NFowgZsxCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250 +MR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMB4XDTIwMDUwNzA3Mzkw +NFoXDTIzMDIwMTA3MzkwNFowgZsxCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250 YW5hMRAwDgYDVQQHDAdCb3plbWFuMRYwFAYDVQQKDA13b2xmU1NMX2VkNDQ4MRUw EwYDVQQLDAxTZXJ2ZXItZWQ0NDgxGDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEf MB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbTBDMAUGAytlcQM6AFSBOQHr @@ -51,9 +51,9 @@ N9mpB80BvJ1wFsIsK3VbY9vuOi1Ekka0ewcDT6Kuhobci0ssf+hrFI1Y3W3nbzoF lajvAKOBiTCBhjAdBgNVHQ4EFgQUfKtcEqlo2BgQKH2SxUq4TEx2DtswHwYDVR0j BBgwFoAUOFlF6N1ELLV9pSXWC8w58HLAlGMwDAYDVR0TAQH/BAIwADAOBgNVHQ8B Af8EBAMCA6gwEwYDVR0lBAwwCgYIKwYBBQUHAwEwEQYJYIZIAYb4QgEBBAQDAgZA -MAUGAytlcQNzAJEV/I6mAFC/jkROFDmjkSkSJaWLQluFoMPXs2obTNlPIFqSW1gq -9IYhNQvWpbHKmGrLCceYpSK2AKLvgRlPTShOgEdqPIKIhIsDmUhbzMR1mLJwsZNs -JKeOAWovFVMlwkVctiXbF5P7nB0PxqaIcEQuAA== +MAUGAytlcQNzAEPJHzGKkMub6QAU7NnIXSBhT51ELpkwbilbQTTueEPNHXz/p7R1 +MpSlmiL8j38FF8ios3A4YUXvgAyDpq98i1IcX1Mb6Epc2K8mPu9cfB0Qu3ocS9Ak +gjmeG12fy1YYPck8Ax/EzcRIaW3e+/RFAusIAA== -----END CERTIFICATE----- Certificate: Data: @@ -62,8 +62,8 @@ Certificate: Signature Algorithm: ED448 Issuer: C = US, ST = Montana, L = Bozeman, O = wolfSSL_Ed448, OU = Root-Ed448, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Feb 13 01:35:44 2020 GMT - Not After : Nov 9 01:35:44 2022 GMT + Not Before: May 7 07:39:04 2020 GMT + Not After : Feb 1 07:39:04 2023 GMT Subject: C = US, ST = Montana, L = Bozeman, O = wolfSSL_ed448, OU = CA-ed448, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: ED448 @@ -84,26 +84,26 @@ Certificate: X509v3 Key Usage: critical Digital Signature, Certificate Sign, CRL Sign Signature Algorithm: ED448 - a0:94:c1:de:f0:7f:40:b2:88:77:f7:f7:7b:da:42:b3:3f:f6: - 32:57:a9:e9:41:7f:51:53:1c:f3:5e:d5:77:d7:fa:55:f9:0e: - 54:eb:d8:6b:4e:bc:e9:0d:38:ea:da:c4:81:23:2c:84:bd:8b: - 65:e3:80:ad:26:ce:a9:e5:21:65:59:5c:e7:44:75:a3:d5:c5: - 2d:70:30:48:55:76:64:58:dd:a5:6a:77:3c:e5:46:aa:54:49: - a9:cd:48:f7:7b:ac:36:01:4a:61:aa:f3:3b:0b:fe:9f:56:5a: - ba:51:e4:33:2e:00 + b9:75:55:89:7d:cb:d7:35:7a:21:3c:be:43:be:2b:c1:5c:95: + 98:2b:74:f3:0c:27:da:1d:dc:f9:5e:2f:cd:5d:53:18:24:c5: + b3:f7:54:44:8d:fc:d0:d2:32:58:15:29:62:3f:d2:88:43:96: + a9:26:80:1a:ec:a8:17:c3:c2:79:30:06:6c:cb:27:9b:a3:b9: + 71:70:1e:73:34:ec:2b:50:9b:34:39:da:cc:e7:bf:6c:64:47: + 84:c3:e9:73:95:ac:a6:ab:ee:f4:6b:d4:b8:2b:38:7c:62:0e: + b4:24:74:50:03:00 -----BEGIN CERTIFICATE----- MIICjzCCAg+gAwIBAgIBATAFBgMrZXEwgZkxCzAJBgNVBAYTAlVTMRAwDgYDVQQI DAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMRYwFAYDVQQKDA13b2xmU1NMX0Vk NDQ4MRMwEQYDVQQLDApSb290LUVkNDQ4MRgwFgYDVQQDDA93d3cud29sZnNzbC5j -b20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjAwMjEzMDEz -NTQ0WhcNMjIxMTA5MDEzNTQ0WjCBlzELMAkGA1UEBhMCVVMxEDAOBgNVBAgMB01v +b20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjAwNTA3MDcz +OTA0WhcNMjMwMjAxMDczOTA0WjCBlzELMAkGA1UEBhMCVVMxEDAOBgNVBAgMB01v bnRhbmExEDAOBgNVBAcMB0JvemVtYW4xFjAUBgNVBAoMDXdvbGZTU0xfZWQ0NDgx ETAPBgNVBAsMCENBLWVkNDQ4MRgwFgYDVQQDDA93d3cud29sZnNzbC5jb20xHzAd BgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wQzAFBgMrZXEDOgAO4rR25dLM wkt7sCm+kvvDr2mllLpwJOij78hjmt2mr1hDOAQk8BCRvqcBkVTzz2mFTLmXjKQ3 qgCjYzBhMB0GA1UdDgQWBBQ4WUXo3UQstX2lJdYLzDnwcsCUYzAfBgNVHSMEGDAW gBTaaZjJJkp1+1leU5pjSwy4iAsPHjAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB -/wQEAwIBhjAFBgMrZXEDcwCglMHe8H9Asoh39/d72kKzP/YyV6npQX9RUxzzXtV3 -1/pV+Q5U69hrTrzpDTjq2sSBIyyEvYtl44CtJs6p5SFlWVznRHWj1cUtcDBIVXZk -WN2lanc85UaqVEmpzUj3e6w2AUphqvM7C/6fVlq6UeQzLgA= +/wQEAwIBhjAFBgMrZXEDcwC5dVWJfcvXNXohPL5DvivBXJWYK3TzDCfaHdz5Xi/N +XVMYJMWz91REjfzQ0jJYFSliP9KIQ5apJoAa7KgXw8J5MAZsyyebo7lxcB5zNOwr +UJs0OdrM579sZEeEw+lzlaymq+70a9S4Kzh8Yg60JHRQAwA= -----END CERTIFICATE----- diff --git a/certs/ocsp/intermediate1-ca-cert.pem b/certs/ocsp/intermediate1-ca-cert.pem index a0593b2f7..cfd34c09f 100644 --- a/certs/ocsp/intermediate1-ca-cert.pem +++ b/certs/ocsp/intermediate1-ca-cert.pem @@ -2,15 +2,15 @@ Certificate: Data: Version: 3 (0x2) Serial Number: 1 (0x1) - Signature Algorithm: sha256WithRSAEncryption - Issuer: C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Engineering, CN=wolfSSL root CA/emailAddress=info@wolfssl.com + Signature Algorithm: sha256WithRSAEncryption + Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL root CA, emailAddress = info@wolfssl.com Validity - Not Before: Apr 13 15:23:10 2018 GMT - Not After : Jan 7 15:23:10 2021 GMT - Subject: C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Engineering, CN=wolfSSL intermediate CA 1/emailAddress=info@wolfssl.com + Not Before: May 7 07:39:04 2020 GMT + Not After : Feb 1 07:39:04 2023 GMT + Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL intermediate CA 1, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption - Public-Key: (2048 bit) + RSA Public-Key: (2048 bit) Modulus: 00:de:b4:c8:5c:77:e0:2d:b1:f5:b9:ad:16:47:35: a0:35:65:65:c6:e1:40:ab:1e:b4:b9:13:b7:cb:8c: @@ -47,27 +47,27 @@ Certificate: OCSP - URI:http://127.0.0.1:22220 Signature Algorithm: sha256WithRSAEncryption - 18:a3:09:fe:c3:53:c7:ce:11:f0:36:86:43:9c:46:9b:43:42: - a0:20:6e:b6:32:29:34:22:fa:27:a1:00:0c:e5:51:c3:35:7b: - 2f:ce:2c:48:7f:47:cf:1b:45:f9:30:b2:d0:17:15:a0:c3:a8: - 3a:e4:5f:a4:96:e4:25:ea:4e:80:90:2e:8d:f5:19:98:ae:2a: - 6d:39:f0:06:8f:e6:0b:c4:2b:dd:07:4a:ad:3d:34:11:79:3d: - 15:db:65:c6:33:60:6b:2f:2d:47:26:bb:91:53:28:35:5c:fd: - 57:3b:27:1b:a1:85:03:24:74:84:f4:f2:b2:e3:53:41:83:9c: - 6b:5a:0c:0f:3b:c4:5f:a7:4b:8b:04:f2:0d:f5:81:aa:16:33: - d2:f4:f5:8d:83:c1:10:2d:57:55:f8:d3:16:62:27:50:b2:57: - 20:1d:a3:07:0c:b8:8d:c5:5a:2f:d9:d3:c4:6a:c3:1e:51:10: - de:7e:60:cf:d0:78:2c:00:d4:da:df:de:de:ee:ed:1d:25:da: - 6c:9f:57:69:2a:f1:a2:6c:8a:fe:72:c0:57:9f:f8:6e:b7:47: - f1:4f:f6:4b:9c:a2:2a:d2:10:9c:4e:bc:b4:8a:a2:8e:51:5a: - c1:e7:9c:f1:7c:9c:f9:7d:d7:9c:8f:ed:e9:57:91:0a:6c:4b: - b4:ac:6f:30 + 96:51:ad:53:a8:aa:ef:a7:88:8e:d1:7e:04:97:48:e8:25:37: + 94:b5:ca:cf:33:66:dd:44:9a:f8:77:67:bc:6a:9a:89:9c:98: + de:f1:71:84:2f:b6:4f:7f:c2:d7:33:dd:c7:90:b7:4d:90:41: + bd:81:a3:73:89:48:b2:40:4b:8b:6e:34:78:c0:a3:7f:92:00: + 86:9f:f4:f5:43:ac:73:80:b8:4b:89:87:08:30:51:36:82:6b: + 33:74:4a:db:dc:08:b4:78:90:90:95:73:ac:76:80:99:e8:e6: + 8f:1d:5b:f8:a3:41:0d:96:d6:3f:28:36:6d:ec:17:f5:a4:89: + cf:a6:a5:60:ad:f2:c4:88:5d:ea:32:aa:a9:ab:c0:c7:f5:7e: + 91:54:78:3d:84:d4:91:f6:4c:48:3f:2d:ae:ae:4a:04:9a:0c: + cf:c2:b2:e8:51:56:9a:50:73:bf:7c:0e:8c:09:99:04:25:dd: + cf:e3:d1:11:f1:fd:98:97:c3:df:c0:bd:17:50:3a:93:15:8f: + a7:97:18:15:14:a1:a4:8b:0b:2f:3d:5e:23:77:f9:6f:11:2a: + 93:5c:6f:2e:2b:70:74:9e:62:58:f7:56:ab:b6:e7:c8:7c:86: + 18:4a:c8:c5:0f:e5:34:a8:16:f6:f9:78:3f:70:32:99:94:41: + 4d:19:b0:e9 -----BEGIN CERTIFICATE----- MIIE8DCCA9igAwIBAgIBATANBgkqhkiG9w0BAQsFADCBlzELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoM B3dvbGZTU0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMRgwFgYDVQQDDA93b2xmU1NM -IHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMTgw -NDEzMTUyMzEwWhcNMjEwMTA3MTUyMzEwWjCBoTELMAkGA1UEBhMCVVMxEzARBgNV +IHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjAw +NTA3MDczOTA0WhcNMjMwMjAxMDczOTA0WjCBoTELMAkGA1UEBhMCVVMxEzARBgNV BAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoMB3dvbGZT U0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMSIwIAYDVQQDDBl3b2xmU1NMIGludGVy bWVkaWF0ZSBDQSAxMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMIIB @@ -84,26 +84,26 @@ DAdTZWF0dGxlMRAwDgYDVQQKDAd3b2xmU1NMMRQwEgYDVQQLDAtFbmdpbmVlcmlu ZzEYMBYGA1UEAwwPd29sZlNTTCByb290IENBMR8wHQYJKoZIhvcNAQkBFhBpbmZv QHdvbGZzc2wuY29tggFjMAsGA1UdDwQEAwIBBjAyBggrBgEFBQcBAQQmMCQwIgYI KwYBBQUHMAGGFmh0dHA6Ly8xMjcuMC4wLjE6MjIyMjAwDQYJKoZIhvcNAQELBQAD -ggEBABijCf7DU8fOEfA2hkOcRptDQqAgbrYyKTQi+iehAAzlUcM1ey/OLEh/R88b -RfkwstAXFaDDqDrkX6SW5CXqToCQLo31GZiuKm058AaP5gvEK90HSq09NBF5PRXb -ZcYzYGsvLUcmu5FTKDVc/Vc7JxuhhQMkdIT08rLjU0GDnGtaDA87xF+nS4sE8g31 -gaoWM9L09Y2DwRAtV1X40xZiJ1CyVyAdowcMuI3FWi/Z08Rqwx5REN5+YM/QeCwA -1Nrf3t7u7R0l2myfV2kq8aJsiv5ywFef+G63R/FP9kucoirSEJxOvLSKoo5RWsHn -nPF8nPl915yP7elXkQpsS7SsbzA= +ggEBAJZRrVOoqu+niI7RfgSXSOglN5S1ys8zZt1Emvh3Z7xqmomcmN7xcYQvtk9/ +wtcz3ceQt02QQb2Bo3OJSLJAS4tuNHjAo3+SAIaf9PVDrHOAuEuJhwgwUTaCazN0 +StvcCLR4kJCVc6x2gJno5o8dW/ijQQ2W1j8oNm3sF/Wkic+mpWCt8sSIXeoyqqmr +wMf1fpFUeD2E1JH2TEg/La6uSgSaDM/CsuhRVppQc798DowJmQQl3c/j0RHx/ZiX +w9/AvRdQOpMVj6eXGBUUoaSLCy89XiN3+W8RKpNcby4rcHSeYlj3Vqu258h8hhhK +yMUP5TSoFvb5eD9wMpmUQU0ZsOk= -----END CERTIFICATE----- Certificate: Data: Version: 3 (0x2) Serial Number: 99 (0x63) - Signature Algorithm: sha256WithRSAEncryption - Issuer: C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Engineering, CN=wolfSSL root CA/emailAddress=info@wolfssl.com + Signature Algorithm: sha256WithRSAEncryption + Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL root CA, emailAddress = info@wolfssl.com Validity - Not Before: Apr 13 15:23:10 2018 GMT - Not After : Jan 7 15:23:10 2021 GMT - Subject: C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Engineering, CN=wolfSSL root CA/emailAddress=info@wolfssl.com + Not Before: May 7 07:39:04 2020 GMT + Not After : Feb 1 07:39:04 2023 GMT + Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL root CA, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption - Public-Key: (2048 bit) + RSA Public-Key: (2048 bit) Modulus: 00:ab:2c:b4:2f:1d:06:09:ef:4e:29:86:84:7e:cc: bf:a6:79:7c:f0:c0:c1:64:25:8c:75:b7:10:05:ca: @@ -140,27 +140,27 @@ Certificate: OCSP - URI:http://127.0.0.1:22220 Signature Algorithm: sha256WithRSAEncryption - 6b:10:b1:f8:cb:77:ef:72:f5:f8:fc:70:6d:18:dc:34:fe:d7: - 95:d8:fd:85:8e:ca:4b:f3:be:1f:eb:14:08:dc:23:34:78:98: - 39:d7:9f:c3:52:f6:14:3d:e9:de:5c:c2:d8:b1:4b:a8:4c:5b: - 91:42:66:da:7f:3c:e9:03:20:5e:08:0f:76:79:b9:21:10:89: - b7:73:46:44:7e:6e:28:0c:00:e4:f4:3e:65:aa:f5:c6:27:57: - 2c:bb:1d:ae:e5:94:57:a3:73:9e:6b:44:00:35:4a:f3:c7:34: - 9c:a2:a7:aa:62:9f:1d:ef:a8:6c:be:07:ad:ef:ae:ee:93:0b: - ba:c3:59:4e:90:40:2d:00:5e:f0:0f:0a:de:18:2a:b3:97:31: - 63:84:ff:18:1c:b6:d8:7d:ee:33:ed:99:f0:f5:7f:88:58:b3: - 0d:90:db:eb:44:7e:06:37:61:d4:34:b9:f6:fd:3e:8d:07:e4: - b5:b0:ae:09:ce:98:e4:b0:1b:d5:7b:53:94:dd:8a:b2:20:d6: - b0:72:f8:b1:bc:76:df:16:86:39:7b:e4:a9:15:47:57:ae:ca: - 41:d6:3a:ba:15:d1:c0:b5:38:66:0b:0f:80:8b:a2:07:b4:fc: - 80:1f:a3:4c:1f:d2:65:97:c1:2c:ae:46:31:61:49:0d:d7:5f: - ac:d2:a6:05 + 45:4c:4f:04:eb:c4:00:00:8a:ff:a2:b8:93:29:ca:fc:90:5b: + a3:6f:4a:02:d4:64:b2:87:4b:70:4e:e5:0d:c5:0c:34:eb:fb: + ce:3b:ba:9e:68:9a:1f:97:94:19:ed:d6:29:fa:1a:4b:88:e4: + b2:55:69:50:b7:68:be:61:ed:15:58:f0:0e:5a:ee:1e:80:cf: + 31:78:82:d3:cb:fa:b2:c3:92:01:f1:e4:ec:44:61:0b:68:81: + 92:24:a3:05:9b:0e:7a:3e:b9:cc:7d:2f:eb:02:77:56:65:6a: + bc:f3:03:0a:6d:75:54:d8:70:6f:c6:fc:c1:27:a5:26:58:bc: + 9d:96:e6:84:fa:2c:cd:ed:bc:dc:20:b8:84:15:33:ce:8f:dd: + 6d:34:99:1a:22:f0:1c:8a:14:b4:04:0d:8d:fd:38:d6:e3:80: + 4c:7c:f6:7f:bc:44:a8:ec:9a:75:cf:8d:65:5c:d1:00:4c:4d: + d4:ed:7d:21:18:e1:08:e7:87:a0:78:94:74:2c:d9:f6:bf:de: + 1f:fc:56:a0:53:7d:43:4a:53:a7:7c:9f:14:58:2c:e5:a8:0e: + f2:3c:af:cb:c5:ad:ba:94:2b:59:23:f6:f3:40:8d:bc:b1:bc: + c2:4f:99:16:10:2b:47:30:5f:5b:12:02:b8:5b:1d:26:f1:7d: + 91:2b:65:53 -----BEGIN CERTIFICATE----- MIIE5jCCA86gAwIBAgIBYzANBgkqhkiG9w0BAQsFADCBlzELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoM B3dvbGZTU0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMRgwFgYDVQQDDA93b2xmU1NM -IHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMTgw -NDEzMTUyMzEwWhcNMjEwMTA3MTUyMzEwWjCBlzELMAkGA1UEBhMCVVMxEzARBgNV +IHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjAw +NTA3MDczOTA0WhcNMjMwMjAxMDczOTA0WjCBlzELMAkGA1UEBhMCVVMxEzARBgNV BAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoMB3dvbGZT U0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMRgwFgYDVQQDDA93b2xmU1NMIHJvb3Qg Q0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wggEiMA0GCSqGSIb3 @@ -176,11 +176,11 @@ A1UEBhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUx EDAOBgNVBAoMB3dvbGZTU0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMRgwFgYDVQQD DA93b2xmU1NMIHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5j b22CAWMwCwYDVR0PBAQDAgEGMDIGCCsGAQUFBwEBBCYwJDAiBggrBgEFBQcwAYYW -aHR0cDovLzEyNy4wLjAuMToyMjIyMDANBgkqhkiG9w0BAQsFAAOCAQEAaxCx+Mt3 -73L1+PxwbRjcNP7Xldj9hY7KS/O+H+sUCNwjNHiYOdefw1L2FD3p3lzC2LFLqExb -kUJm2n886QMgXggPdnm5IRCJt3NGRH5uKAwA5PQ+Zar1xidXLLsdruWUV6NznmtE -ADVK88c0nKKnqmKfHe+obL4Hre+u7pMLusNZTpBALQBe8A8K3hgqs5cxY4T/GBy2 -2H3uM+2Z8PV/iFizDZDb60R+Bjdh1DS59v0+jQfktbCuCc6Y5LAb1XtTlN2KsiDW -sHL4sbx23xaGOXvkqRVHV67KQdY6uhXRwLU4ZgsPgIuiB7T8gB+jTB/SZZfBLK5G -MWFJDddfrNKmBQ== +aHR0cDovLzEyNy4wLjAuMToyMjIyMDANBgkqhkiG9w0BAQsFAAOCAQEARUxPBOvE +AACK/6K4kynK/JBbo29KAtRksodLcE7lDcUMNOv7zju6nmiaH5eUGe3WKfoaS4jk +slVpULdovmHtFVjwDlruHoDPMXiC08v6ssOSAfHk7ERhC2iBkiSjBZsOej65zH0v +6wJ3VmVqvPMDCm11VNhwb8b8wSelJli8nZbmhPosze283CC4hBUzzo/dbTSZGiLw +HIoUtAQNjf041uOATHz2f7xEqOyadc+NZVzRAExN1O19IRjhCOeHoHiUdCzZ9r/e +H/xWoFN9Q0pTp3yfFFgs5agO8jyvy8WtupQrWSP280CNvLG8wk+ZFhArRzBfWxIC +uFsdJvF9kStlUw== -----END CERTIFICATE----- diff --git a/certs/ocsp/intermediate2-ca-cert.pem b/certs/ocsp/intermediate2-ca-cert.pem index 7305fe0e1..f52a4e687 100644 --- a/certs/ocsp/intermediate2-ca-cert.pem +++ b/certs/ocsp/intermediate2-ca-cert.pem @@ -2,15 +2,15 @@ Certificate: Data: Version: 3 (0x2) Serial Number: 2 (0x2) - Signature Algorithm: sha256WithRSAEncryption - Issuer: C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Engineering, CN=wolfSSL root CA/emailAddress=info@wolfssl.com + Signature Algorithm: sha256WithRSAEncryption + Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL root CA, emailAddress = info@wolfssl.com Validity - Not Before: Apr 13 15:23:10 2018 GMT - Not After : Jan 7 15:23:10 2021 GMT - Subject: C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Engineering, CN=wolfSSL intermediate CA 2/emailAddress=info@wolfssl.com + Not Before: May 7 07:39:04 2020 GMT + Not After : Feb 1 07:39:04 2023 GMT + Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL intermediate CA 2, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption - Public-Key: (2048 bit) + RSA Public-Key: (2048 bit) Modulus: 00:d0:20:3c:35:19:6f:2c:44:b4:7e:42:c7:75:b4: 6a:2b:a9:23:85:bf:87:b4:ee:ca:d7:4b:1f:31:d7: @@ -47,27 +47,27 @@ Certificate: OCSP - URI:http://127.0.0.1:22220 Signature Algorithm: sha256WithRSAEncryption - 92:6e:c1:af:88:af:46:f2:6e:8a:8c:27:06:8e:b4:38:35:9b: - 47:92:24:20:e5:a5:13:d8:35:d3:2e:37:ca:74:47:e5:16:a3: - 03:63:16:b4:28:2b:d9:04:ab:ee:e4:0a:e5:87:da:d4:00:3a: - 53:c6:c9:25:6a:8f:49:d2:2e:34:f2:40:65:6e:02:fc:b9:42: - 3f:ef:cb:8c:79:84:03:84:dc:a0:68:1e:c7:c7:36:8c:60:14: - 55:f2:5f:f9:c1:3f:2b:f6:a2:1e:34:1f:83:ba:73:bc:b7:62: - bc:97:66:84:09:b9:2d:76:71:c8:91:fd:e2:e1:39:cf:dd:ec: - 98:a8:49:69:89:a8:18:2a:42:e7:fc:ab:2c:cf:13:ab:63:fe: - b0:19:ea:1a:38:22:16:11:31:34:43:fc:50:c6:ec:19:97:03: - db:e8:07:28:48:88:3a:e5:35:a2:fd:83:12:df:55:70:72:61: - 0d:f8:66:18:52:58:c9:46:97:86:31:9e:a2:43:0c:b9:0f:d3: - eb:35:c9:e5:19:4e:b4:8b:d2:ac:ea:bf:83:2a:48:9d:20:a0: - 08:45:60:92:8a:27:06:93:77:74:bb:0e:22:8e:54:17:f2:d4: - e7:7f:f3:90:4d:cc:75:e7:16:c5:9c:4a:cf:dc:f2:19:18:12: - f5:72:8e:2e + 8a:53:ed:5e:45:6d:f1:23:ee:ec:db:0a:fe:1b:7a:1c:fd:f0: + 30:ac:f8:e6:6b:62:b7:74:62:a3:aa:84:6c:8c:c1:cd:62:42: + cb:e2:fd:e5:57:79:ec:36:b2:49:50:25:e6:5f:95:02:0a:54: + 5a:75:ba:11:28:fe:5c:f1:ed:68:97:08:64:df:ad:97:30:ef: + c0:35:03:93:e8:40:c9:bb:6c:ed:23:01:22:f8:9b:cf:c2:fe: + 23:9d:0d:b4:d9:6a:cd:ad:ac:95:fc:03:72:ff:e7:bd:7b:19: + e5:2f:b7:b1:ec:20:44:d3:90:46:df:76:dc:ca:47:69:a1:54: + 0c:62:4c:2c:de:54:b8:08:09:a5:0d:59:ae:66:5b:9b:df:2d: + 54:e2:06:4e:46:5f:bc:38:38:87:ca:65:bf:d4:4b:53:11:2f: + 7b:30:c7:94:d7:f1:91:80:ab:d2:c1:67:ae:a2:95:7a:3c:26: + 92:2b:78:33:9e:c0:16:99:86:1f:0e:56:9b:83:eb:54:e4:10: + fa:46:b0:e7:ff:ed:a6:38:83:40:5e:49:58:99:23:17:37:d1: + 66:6a:6d:59:b1:d8:62:19:6c:25:ab:08:54:07:a4:8c:2e:2a: + 0c:a9:81:ba:dd:71:ad:af:cb:22:ec:31:6b:d3:a3:a3:4c:11: + 16:dc:91:06 -----BEGIN CERTIFICATE----- MIIE8DCCA9igAwIBAgIBAjANBgkqhkiG9w0BAQsFADCBlzELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoM B3dvbGZTU0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMRgwFgYDVQQDDA93b2xmU1NM -IHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMTgw -NDEzMTUyMzEwWhcNMjEwMTA3MTUyMzEwWjCBoTELMAkGA1UEBhMCVVMxEzARBgNV +IHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjAw +NTA3MDczOTA0WhcNMjMwMjAxMDczOTA0WjCBoTELMAkGA1UEBhMCVVMxEzARBgNV BAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoMB3dvbGZT U0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMSIwIAYDVQQDDBl3b2xmU1NMIGludGVy bWVkaWF0ZSBDQSAyMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMIIB @@ -84,26 +84,26 @@ DAdTZWF0dGxlMRAwDgYDVQQKDAd3b2xmU1NMMRQwEgYDVQQLDAtFbmdpbmVlcmlu ZzEYMBYGA1UEAwwPd29sZlNTTCByb290IENBMR8wHQYJKoZIhvcNAQkBFhBpbmZv QHdvbGZzc2wuY29tggFjMAsGA1UdDwQEAwIBBjAyBggrBgEFBQcBAQQmMCQwIgYI KwYBBQUHMAGGFmh0dHA6Ly8xMjcuMC4wLjE6MjIyMjAwDQYJKoZIhvcNAQELBQAD -ggEBAJJuwa+Ir0byboqMJwaOtDg1m0eSJCDlpRPYNdMuN8p0R+UWowNjFrQoK9kE -q+7kCuWH2tQAOlPGySVqj0nSLjTyQGVuAvy5Qj/vy4x5hAOE3KBoHsfHNoxgFFXy -X/nBPyv2oh40H4O6c7y3YryXZoQJuS12cciR/eLhOc/d7JioSWmJqBgqQuf8qyzP -E6tj/rAZ6ho4IhYRMTRD/FDG7BmXA9voByhIiDrlNaL9gxLfVXByYQ34ZhhSWMlG -l4YxnqJDDLkP0+s1yeUZTrSL0qzqv4MqSJ0goAhFYJKKJwaTd3S7DiKOVBfy1Od/ -85BNzHXnFsWcSs/c8hkYEvVyji4= +ggEBAIpT7V5FbfEj7uzbCv4behz98DCs+OZrYrd0YqOqhGyMwc1iQsvi/eVXeew2 +sklQJeZflQIKVFp1uhEo/lzx7WiXCGTfrZcw78A1A5PoQMm7bO0jASL4m8/C/iOd +DbTZas2trJX8A3L/5717GeUvt7HsIETTkEbfdtzKR2mhVAxiTCzeVLgICaUNWa5m +W5vfLVTiBk5GX7w4OIfKZb/US1MRL3swx5TX8ZGAq9LBZ66ilXo8JpIreDOewBaZ +hh8OVpuD61TkEPpGsOf/7aY4g0BeSViZIxc30WZqbVmx2GIZbCWrCFQHpIwuKgyp +gbrdca2vyyLsMWvTo6NMERbckQY= -----END CERTIFICATE----- Certificate: Data: Version: 3 (0x2) Serial Number: 99 (0x63) - Signature Algorithm: sha256WithRSAEncryption - Issuer: C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Engineering, CN=wolfSSL root CA/emailAddress=info@wolfssl.com + Signature Algorithm: sha256WithRSAEncryption + Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL root CA, emailAddress = info@wolfssl.com Validity - Not Before: Apr 13 15:23:10 2018 GMT - Not After : Jan 7 15:23:10 2021 GMT - Subject: C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Engineering, CN=wolfSSL root CA/emailAddress=info@wolfssl.com + Not Before: May 7 07:39:04 2020 GMT + Not After : Feb 1 07:39:04 2023 GMT + Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL root CA, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption - Public-Key: (2048 bit) + RSA Public-Key: (2048 bit) Modulus: 00:ab:2c:b4:2f:1d:06:09:ef:4e:29:86:84:7e:cc: bf:a6:79:7c:f0:c0:c1:64:25:8c:75:b7:10:05:ca: @@ -140,27 +140,27 @@ Certificate: OCSP - URI:http://127.0.0.1:22220 Signature Algorithm: sha256WithRSAEncryption - 6b:10:b1:f8:cb:77:ef:72:f5:f8:fc:70:6d:18:dc:34:fe:d7: - 95:d8:fd:85:8e:ca:4b:f3:be:1f:eb:14:08:dc:23:34:78:98: - 39:d7:9f:c3:52:f6:14:3d:e9:de:5c:c2:d8:b1:4b:a8:4c:5b: - 91:42:66:da:7f:3c:e9:03:20:5e:08:0f:76:79:b9:21:10:89: - b7:73:46:44:7e:6e:28:0c:00:e4:f4:3e:65:aa:f5:c6:27:57: - 2c:bb:1d:ae:e5:94:57:a3:73:9e:6b:44:00:35:4a:f3:c7:34: - 9c:a2:a7:aa:62:9f:1d:ef:a8:6c:be:07:ad:ef:ae:ee:93:0b: - ba:c3:59:4e:90:40:2d:00:5e:f0:0f:0a:de:18:2a:b3:97:31: - 63:84:ff:18:1c:b6:d8:7d:ee:33:ed:99:f0:f5:7f:88:58:b3: - 0d:90:db:eb:44:7e:06:37:61:d4:34:b9:f6:fd:3e:8d:07:e4: - b5:b0:ae:09:ce:98:e4:b0:1b:d5:7b:53:94:dd:8a:b2:20:d6: - b0:72:f8:b1:bc:76:df:16:86:39:7b:e4:a9:15:47:57:ae:ca: - 41:d6:3a:ba:15:d1:c0:b5:38:66:0b:0f:80:8b:a2:07:b4:fc: - 80:1f:a3:4c:1f:d2:65:97:c1:2c:ae:46:31:61:49:0d:d7:5f: - ac:d2:a6:05 + 45:4c:4f:04:eb:c4:00:00:8a:ff:a2:b8:93:29:ca:fc:90:5b: + a3:6f:4a:02:d4:64:b2:87:4b:70:4e:e5:0d:c5:0c:34:eb:fb: + ce:3b:ba:9e:68:9a:1f:97:94:19:ed:d6:29:fa:1a:4b:88:e4: + b2:55:69:50:b7:68:be:61:ed:15:58:f0:0e:5a:ee:1e:80:cf: + 31:78:82:d3:cb:fa:b2:c3:92:01:f1:e4:ec:44:61:0b:68:81: + 92:24:a3:05:9b:0e:7a:3e:b9:cc:7d:2f:eb:02:77:56:65:6a: + bc:f3:03:0a:6d:75:54:d8:70:6f:c6:fc:c1:27:a5:26:58:bc: + 9d:96:e6:84:fa:2c:cd:ed:bc:dc:20:b8:84:15:33:ce:8f:dd: + 6d:34:99:1a:22:f0:1c:8a:14:b4:04:0d:8d:fd:38:d6:e3:80: + 4c:7c:f6:7f:bc:44:a8:ec:9a:75:cf:8d:65:5c:d1:00:4c:4d: + d4:ed:7d:21:18:e1:08:e7:87:a0:78:94:74:2c:d9:f6:bf:de: + 1f:fc:56:a0:53:7d:43:4a:53:a7:7c:9f:14:58:2c:e5:a8:0e: + f2:3c:af:cb:c5:ad:ba:94:2b:59:23:f6:f3:40:8d:bc:b1:bc: + c2:4f:99:16:10:2b:47:30:5f:5b:12:02:b8:5b:1d:26:f1:7d: + 91:2b:65:53 -----BEGIN CERTIFICATE----- MIIE5jCCA86gAwIBAgIBYzANBgkqhkiG9w0BAQsFADCBlzELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoM B3dvbGZTU0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMRgwFgYDVQQDDA93b2xmU1NM -IHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMTgw -NDEzMTUyMzEwWhcNMjEwMTA3MTUyMzEwWjCBlzELMAkGA1UEBhMCVVMxEzARBgNV +IHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjAw +NTA3MDczOTA0WhcNMjMwMjAxMDczOTA0WjCBlzELMAkGA1UEBhMCVVMxEzARBgNV BAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoMB3dvbGZT U0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMRgwFgYDVQQDDA93b2xmU1NMIHJvb3Qg Q0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wggEiMA0GCSqGSIb3 @@ -176,11 +176,11 @@ A1UEBhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUx EDAOBgNVBAoMB3dvbGZTU0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMRgwFgYDVQQD DA93b2xmU1NMIHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5j b22CAWMwCwYDVR0PBAQDAgEGMDIGCCsGAQUFBwEBBCYwJDAiBggrBgEFBQcwAYYW -aHR0cDovLzEyNy4wLjAuMToyMjIyMDANBgkqhkiG9w0BAQsFAAOCAQEAaxCx+Mt3 -73L1+PxwbRjcNP7Xldj9hY7KS/O+H+sUCNwjNHiYOdefw1L2FD3p3lzC2LFLqExb -kUJm2n886QMgXggPdnm5IRCJt3NGRH5uKAwA5PQ+Zar1xidXLLsdruWUV6NznmtE -ADVK88c0nKKnqmKfHe+obL4Hre+u7pMLusNZTpBALQBe8A8K3hgqs5cxY4T/GBy2 -2H3uM+2Z8PV/iFizDZDb60R+Bjdh1DS59v0+jQfktbCuCc6Y5LAb1XtTlN2KsiDW -sHL4sbx23xaGOXvkqRVHV67KQdY6uhXRwLU4ZgsPgIuiB7T8gB+jTB/SZZfBLK5G -MWFJDddfrNKmBQ== +aHR0cDovLzEyNy4wLjAuMToyMjIyMDANBgkqhkiG9w0BAQsFAAOCAQEARUxPBOvE +AACK/6K4kynK/JBbo29KAtRksodLcE7lDcUMNOv7zju6nmiaH5eUGe3WKfoaS4jk +slVpULdovmHtFVjwDlruHoDPMXiC08v6ssOSAfHk7ERhC2iBkiSjBZsOej65zH0v +6wJ3VmVqvPMDCm11VNhwb8b8wSelJli8nZbmhPosze283CC4hBUzzo/dbTSZGiLw +HIoUtAQNjf041uOATHz2f7xEqOyadc+NZVzRAExN1O19IRjhCOeHoHiUdCzZ9r/e +H/xWoFN9Q0pTp3yfFFgs5agO8jyvy8WtupQrWSP280CNvLG8wk+ZFhArRzBfWxIC +uFsdJvF9kStlUw== -----END CERTIFICATE----- diff --git a/certs/ocsp/intermediate3-ca-cert.pem b/certs/ocsp/intermediate3-ca-cert.pem index 365426bb5..b2c9198f6 100644 --- a/certs/ocsp/intermediate3-ca-cert.pem +++ b/certs/ocsp/intermediate3-ca-cert.pem @@ -2,15 +2,15 @@ Certificate: Data: Version: 3 (0x2) Serial Number: 3 (0x3) - Signature Algorithm: sha256WithRSAEncryption - Issuer: C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Engineering, CN=wolfSSL root CA/emailAddress=info@wolfssl.com + Signature Algorithm: sha256WithRSAEncryption + Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL root CA, emailAddress = info@wolfssl.com Validity - Not Before: Apr 13 15:23:10 2018 GMT - Not After : Jan 7 15:23:10 2021 GMT - Subject: C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Engineering, CN=wolfSSL REVOKED intermediate CA/emailAddress=info@wolfssl.com + Not Before: May 7 07:39:04 2020 GMT + Not After : Feb 1 07:39:04 2023 GMT + Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL REVOKED intermediate CA, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption - Public-Key: (2048 bit) + RSA Public-Key: (2048 bit) Modulus: 00:de:c5:04:10:7d:c2:21:e9:12:45:da:d5:ba:28: fd:a6:f4:30:44:a0:df:f9:70:5e:17:26:97:59:5c: @@ -47,27 +47,27 @@ Certificate: OCSP - URI:http://127.0.0.1:22220 Signature Algorithm: sha256WithRSAEncryption - 63:bf:90:58:0c:44:08:57:7d:94:7e:eb:fd:9d:90:f6:1d:a5: - 91:2a:32:38:a7:f7:39:c2:c0:9c:93:26:bc:f4:4b:81:0a:0f: - 07:2d:4f:a9:20:9a:3e:2c:24:0c:30:10:d7:be:96:ab:ee:1f: - 2c:f8:71:7c:1a:c1:ae:b7:64:e1:7e:18:53:c3:ae:d5:04:16: - f7:e5:34:c2:d1:a3:31:d4:9b:f4:b7:c1:96:1f:a7:3c:3a:bf: - fd:06:be:76:f4:da:95:f9:6f:be:4f:24:a7:0f:b0:2c:12:4d: - d6:55:ea:f8:0a:30:91:32:4f:a3:14:6d:ec:cd:85:12:1f:da: - 78:8a:b1:9a:74:fb:fd:00:45:4a:30:83:45:16:a0:8f:b7:7f: - 23:33:91:c6:81:ac:f3:9b:cd:53:6b:9a:fa:36:9b:5d:3c:72: - a8:73:4f:1e:b5:da:ba:08:3d:9b:ca:7a:d6:c2:bf:6e:9f:a5: - 9e:db:61:bc:a5:42:a7:d4:92:4a:7e:a3:3d:1b:aa:d3:c2:93: - ad:ce:3b:0e:2b:61:44:1e:3c:61:54:0d:6a:26:21:54:c6:e0: - ed:3d:da:27:cd:89:5a:f8:1f:0f:46:80:c1:f2:80:cc:52:f1: - 7f:ce:10:68:66:3f:ee:90:25:45:d4:f8:87:f9:5d:5d:74:3d: - aa:3d:43:1c + 79:14:07:86:9c:ca:f0:db:23:4d:97:81:38:ce:c4:29:d4:6d: + 31:78:e5:58:1f:6e:bd:2a:0a:c2:27:9c:32:d8:b6:fb:d0:37: + c0:8e:a3:da:ab:c1:2d:71:07:78:42:9e:8d:16:47:92:6e:44: + 06:46:1c:db:34:2d:8b:56:60:af:42:bc:bb:30:d8:37:4b:d9: + bb:de:10:88:d1:39:10:a7:09:ee:5b:40:cd:4c:e2:3c:b9:34: + 14:ef:91:00:c8:c9:97:d2:e7:ff:8c:a4:64:70:ca:37:68:95: + 39:87:5c:0a:dc:9a:69:d0:b9:39:25:69:cd:37:b4:4a:29:3a: + 13:a0:3b:b0:59:c3:da:42:b7:70:1e:b5:b6:5b:70:46:85:1c: + d9:3a:34:06:4d:4c:e3:1d:7f:ef:26:98:4c:f1:0e:7a:f2:ce: + 6e:fe:7b:6a:74:fa:c6:5b:10:71:23:db:c9:03:13:c2:64:9e: + a0:1b:41:d1:ba:1c:17:cf:77:30:92:a6:76:75:24:b0:df:8a: + f4:1e:c0:37:98:6c:30:66:f6:8a:f4:c5:74:4d:21:58:99:7a: + ae:dc:08:6b:16:0f:61:1d:2a:e2:a8:78:f9:de:1f:3b:b1:dc: + 73:d9:1b:3e:ed:19:e6:38:cb:f2:c1:a3:17:dc:4a:b5:11:d4: + 2d:0f:55:08 -----BEGIN CERTIFICATE----- MIIE9jCCA96gAwIBAgIBAzANBgkqhkiG9w0BAQsFADCBlzELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoM B3dvbGZTU0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMRgwFgYDVQQDDA93b2xmU1NM -IHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMTgw -NDEzMTUyMzEwWhcNMjEwMTA3MTUyMzEwWjCBpzELMAkGA1UEBhMCVVMxEzARBgNV +IHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjAw +NTA3MDczOTA0WhcNMjMwMjAxMDczOTA0WjCBpzELMAkGA1UEBhMCVVMxEzARBgNV BAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoMB3dvbGZT U0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMSgwJgYDVQQDDB93b2xmU1NMIFJFVk9L RUQgaW50ZXJtZWRpYXRlIENBMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu @@ -84,26 +84,26 @@ DgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3b2xmU1NMMRQwEgYDVQQLDAtFbmdp bmVlcmluZzEYMBYGA1UEAwwPd29sZlNTTCByb290IENBMR8wHQYJKoZIhvcNAQkB FhBpbmZvQHdvbGZzc2wuY29tggFjMAsGA1UdDwQEAwIBBjAyBggrBgEFBQcBAQQm MCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly8xMjcuMC4wLjE6MjIyMjAwDQYJKoZIhvcN -AQELBQADggEBAGO/kFgMRAhXfZR+6/2dkPYdpZEqMjin9znCwJyTJrz0S4EKDwct -T6kgmj4sJAwwENe+lqvuHyz4cXwawa63ZOF+GFPDrtUEFvflNMLRozHUm/S3wZYf -pzw6v/0Gvnb02pX5b75PJKcPsCwSTdZV6vgKMJEyT6MUbezNhRIf2niKsZp0+/0A -RUowg0UWoI+3fyMzkcaBrPObzVNrmvo2m108cqhzTx612roIPZvKetbCv26fpZ7b -YbylQqfUkkp+oz0bqtPCk63OOw4rYUQePGFUDWomIVTG4O092ifNiVr4Hw9GgMHy -gMxS8X/OEGhmP+6QJUXU+If5XV10Pao9Qxw= +AQELBQADggEBAHkUB4acyvDbI02XgTjOxCnUbTF45Vgfbr0qCsInnDLYtvvQN8CO +o9qrwS1xB3hCno0WR5JuRAZGHNs0LYtWYK9CvLsw2DdL2bveEIjRORCnCe5bQM1M +4jy5NBTvkQDIyZfS5/+MpGRwyjdolTmHXArcmmnQuTklac03tEopOhOgO7BZw9pC +t3AetbZbcEaFHNk6NAZNTOMdf+8mmEzxDnryzm7+e2p0+sZbEHEj28kDE8JknqAb +QdG6HBfPdzCSpnZ1JLDfivQewDeYbDBm9or0xXRNIViZeq7cCGsWD2EdKuKoePne +Hzux3HPZGz7tGeY4y/LBoxfcSrUR1C0PVQg= -----END CERTIFICATE----- Certificate: Data: Version: 3 (0x2) Serial Number: 99 (0x63) - Signature Algorithm: sha256WithRSAEncryption - Issuer: C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Engineering, CN=wolfSSL root CA/emailAddress=info@wolfssl.com + Signature Algorithm: sha256WithRSAEncryption + Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL root CA, emailAddress = info@wolfssl.com Validity - Not Before: Apr 13 15:23:10 2018 GMT - Not After : Jan 7 15:23:10 2021 GMT - Subject: C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Engineering, CN=wolfSSL root CA/emailAddress=info@wolfssl.com + Not Before: May 7 07:39:04 2020 GMT + Not After : Feb 1 07:39:04 2023 GMT + Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL root CA, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption - Public-Key: (2048 bit) + RSA Public-Key: (2048 bit) Modulus: 00:ab:2c:b4:2f:1d:06:09:ef:4e:29:86:84:7e:cc: bf:a6:79:7c:f0:c0:c1:64:25:8c:75:b7:10:05:ca: @@ -140,27 +140,27 @@ Certificate: OCSP - URI:http://127.0.0.1:22220 Signature Algorithm: sha256WithRSAEncryption - 6b:10:b1:f8:cb:77:ef:72:f5:f8:fc:70:6d:18:dc:34:fe:d7: - 95:d8:fd:85:8e:ca:4b:f3:be:1f:eb:14:08:dc:23:34:78:98: - 39:d7:9f:c3:52:f6:14:3d:e9:de:5c:c2:d8:b1:4b:a8:4c:5b: - 91:42:66:da:7f:3c:e9:03:20:5e:08:0f:76:79:b9:21:10:89: - b7:73:46:44:7e:6e:28:0c:00:e4:f4:3e:65:aa:f5:c6:27:57: - 2c:bb:1d:ae:e5:94:57:a3:73:9e:6b:44:00:35:4a:f3:c7:34: - 9c:a2:a7:aa:62:9f:1d:ef:a8:6c:be:07:ad:ef:ae:ee:93:0b: - ba:c3:59:4e:90:40:2d:00:5e:f0:0f:0a:de:18:2a:b3:97:31: - 63:84:ff:18:1c:b6:d8:7d:ee:33:ed:99:f0:f5:7f:88:58:b3: - 0d:90:db:eb:44:7e:06:37:61:d4:34:b9:f6:fd:3e:8d:07:e4: - b5:b0:ae:09:ce:98:e4:b0:1b:d5:7b:53:94:dd:8a:b2:20:d6: - b0:72:f8:b1:bc:76:df:16:86:39:7b:e4:a9:15:47:57:ae:ca: - 41:d6:3a:ba:15:d1:c0:b5:38:66:0b:0f:80:8b:a2:07:b4:fc: - 80:1f:a3:4c:1f:d2:65:97:c1:2c:ae:46:31:61:49:0d:d7:5f: - ac:d2:a6:05 + 45:4c:4f:04:eb:c4:00:00:8a:ff:a2:b8:93:29:ca:fc:90:5b: + a3:6f:4a:02:d4:64:b2:87:4b:70:4e:e5:0d:c5:0c:34:eb:fb: + ce:3b:ba:9e:68:9a:1f:97:94:19:ed:d6:29:fa:1a:4b:88:e4: + b2:55:69:50:b7:68:be:61:ed:15:58:f0:0e:5a:ee:1e:80:cf: + 31:78:82:d3:cb:fa:b2:c3:92:01:f1:e4:ec:44:61:0b:68:81: + 92:24:a3:05:9b:0e:7a:3e:b9:cc:7d:2f:eb:02:77:56:65:6a: + bc:f3:03:0a:6d:75:54:d8:70:6f:c6:fc:c1:27:a5:26:58:bc: + 9d:96:e6:84:fa:2c:cd:ed:bc:dc:20:b8:84:15:33:ce:8f:dd: + 6d:34:99:1a:22:f0:1c:8a:14:b4:04:0d:8d:fd:38:d6:e3:80: + 4c:7c:f6:7f:bc:44:a8:ec:9a:75:cf:8d:65:5c:d1:00:4c:4d: + d4:ed:7d:21:18:e1:08:e7:87:a0:78:94:74:2c:d9:f6:bf:de: + 1f:fc:56:a0:53:7d:43:4a:53:a7:7c:9f:14:58:2c:e5:a8:0e: + f2:3c:af:cb:c5:ad:ba:94:2b:59:23:f6:f3:40:8d:bc:b1:bc: + c2:4f:99:16:10:2b:47:30:5f:5b:12:02:b8:5b:1d:26:f1:7d: + 91:2b:65:53 -----BEGIN CERTIFICATE----- MIIE5jCCA86gAwIBAgIBYzANBgkqhkiG9w0BAQsFADCBlzELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoM B3dvbGZTU0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMRgwFgYDVQQDDA93b2xmU1NM -IHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMTgw -NDEzMTUyMzEwWhcNMjEwMTA3MTUyMzEwWjCBlzELMAkGA1UEBhMCVVMxEzARBgNV +IHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjAw +NTA3MDczOTA0WhcNMjMwMjAxMDczOTA0WjCBlzELMAkGA1UEBhMCVVMxEzARBgNV BAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoMB3dvbGZT U0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMRgwFgYDVQQDDA93b2xmU1NMIHJvb3Qg Q0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wggEiMA0GCSqGSIb3 @@ -176,11 +176,11 @@ A1UEBhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUx EDAOBgNVBAoMB3dvbGZTU0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMRgwFgYDVQQD DA93b2xmU1NMIHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5j b22CAWMwCwYDVR0PBAQDAgEGMDIGCCsGAQUFBwEBBCYwJDAiBggrBgEFBQcwAYYW -aHR0cDovLzEyNy4wLjAuMToyMjIyMDANBgkqhkiG9w0BAQsFAAOCAQEAaxCx+Mt3 -73L1+PxwbRjcNP7Xldj9hY7KS/O+H+sUCNwjNHiYOdefw1L2FD3p3lzC2LFLqExb -kUJm2n886QMgXggPdnm5IRCJt3NGRH5uKAwA5PQ+Zar1xidXLLsdruWUV6NznmtE -ADVK88c0nKKnqmKfHe+obL4Hre+u7pMLusNZTpBALQBe8A8K3hgqs5cxY4T/GBy2 -2H3uM+2Z8PV/iFizDZDb60R+Bjdh1DS59v0+jQfktbCuCc6Y5LAb1XtTlN2KsiDW -sHL4sbx23xaGOXvkqRVHV67KQdY6uhXRwLU4ZgsPgIuiB7T8gB+jTB/SZZfBLK5G -MWFJDddfrNKmBQ== +aHR0cDovLzEyNy4wLjAuMToyMjIyMDANBgkqhkiG9w0BAQsFAAOCAQEARUxPBOvE +AACK/6K4kynK/JBbo29KAtRksodLcE7lDcUMNOv7zju6nmiaH5eUGe3WKfoaS4jk +slVpULdovmHtFVjwDlruHoDPMXiC08v6ssOSAfHk7ERhC2iBkiSjBZsOej65zH0v +6wJ3VmVqvPMDCm11VNhwb8b8wSelJli8nZbmhPosze283CC4hBUzzo/dbTSZGiLw +HIoUtAQNjf041uOATHz2f7xEqOyadc+NZVzRAExN1O19IRjhCOeHoHiUdCzZ9r/e +H/xWoFN9Q0pTp3yfFFgs5agO8jyvy8WtupQrWSP280CNvLG8wk+ZFhArRzBfWxIC +uFsdJvF9kStlUw== -----END CERTIFICATE----- diff --git a/certs/ocsp/ocsp-responder-cert.pem b/certs/ocsp/ocsp-responder-cert.pem index 447bc0f77..650465b2d 100644 --- a/certs/ocsp/ocsp-responder-cert.pem +++ b/certs/ocsp/ocsp-responder-cert.pem @@ -2,15 +2,15 @@ Certificate: Data: Version: 3 (0x2) Serial Number: 4 (0x4) - Signature Algorithm: sha256WithRSAEncryption - Issuer: C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Engineering, CN=wolfSSL root CA/emailAddress=info@wolfssl.com + Signature Algorithm: sha256WithRSAEncryption + Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL root CA, emailAddress = info@wolfssl.com Validity - Not Before: Apr 13 15:23:10 2018 GMT - Not After : Jan 7 15:23:10 2021 GMT - Subject: C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Engineering, CN=wolfSSL OCSP Responder/emailAddress=info@wolfssl.com + Not Before: May 7 07:39:04 2020 GMT + Not After : Feb 1 07:39:04 2023 GMT + Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL OCSP Responder, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption - Public-Key: (2048 bit) + RSA Public-Key: (2048 bit) Modulus: 00:b8:ba:23:b4:f6:c3:7b:14:c3:a4:f5:1d:61:a1: f5:1e:63:b9:85:23:34:50:6d:f8:7c:a2:8a:04:8b: @@ -44,27 +44,27 @@ Certificate: X509v3 Extended Key Usage: OCSP Signing Signature Algorithm: sha256WithRSAEncryption - 9b:56:c5:5f:b9:b2:00:30:ca:05:2a:e8:c6:96:ba:aa:23:40: - 40:89:6d:a2:7a:93:f2:c9:8a:6f:0e:5d:5f:6f:ce:5e:4b:38: - a9:d2:ab:97:78:e3:73:3d:3d:27:e9:00:ce:16:d9:c5:c5:06: - a8:eb:c6:e5:76:4c:f7:60:1a:69:ae:35:d6:f8:0f:da:9c:83: - c6:fb:74:a6:12:e5:c7:64:ae:e7:2c:b6:d3:62:1f:f3:20:11: - 2e:09:9b:14:f0:a3:17:d0:2c:be:4a:39:3a:55:58:2f:90:37: - 04:c5:54:27:9d:0e:51:97:da:21:df:05:ec:ca:79:a8:ca:02: - ca:cf:b7:05:ef:04:fa:f9:81:20:10:c1:7d:4a:a7:93:13:28: - 1e:98:a7:3e:4c:01:13:c3:6b:14:e1:87:37:5f:3a:d3:7d:b6: - d4:d9:0d:56:93:7f:1d:e9:c2:35:c7:11:7f:42:d0:d5:3d:5f: - f6:fc:23:24:e3:45:7f:4f:9e:18:df:7b:41:80:fa:bb:bd:16: - e1:eb:c5:78:52:88:cd:82:c7:92:3a:ce:cb:c6:07:05:ec:70: - 0e:e8:db:44:8f:3b:f3:41:de:b2:19:b0:f6:e0:5a:06:48:d9: - b9:e2:2b:0f:ec:ec:1f:fb:83:4d:80:d4:6e:34:ed:78:a1:be: - a2:cb:07:ab + 38:08:7b:c8:b4:e8:5f:1e:b6:fc:05:4c:a7:51:5a:25:c2:7c: + 37:b5:92:ab:61:19:36:87:ae:30:5a:96:90:71:1e:fa:4a:84: + ac:25:be:cf:10:43:1d:71:51:ca:d6:df:25:ab:d2:1e:06:96: + db:b5:3f:11:9a:e1:e1:7f:38:ac:20:30:d6:64:0d:f5:99:ed: + 65:cd:a8:11:e6:1b:54:58:11:98:90:ab:de:17:d6:03:f7:9c: + 29:26:98:59:f9:8d:e7:26:26:a8:4c:33:81:ba:da:a1:1d:be: + 1b:e2:e3:4e:92:35:f6:b0:8d:57:d8:c1:be:c0:c7:d5:08:78: + e2:31:a1:85:e0:1a:d7:5d:93:9d:92:c7:13:ca:a4:25:a2:54: + 91:6a:99:58:4d:bd:64:6f:cd:09:1c:29:49:e4:32:e4:e9:9d: + d4:12:cf:af:38:a0:48:8c:c8:e6:92:0d:1a:86:4f:89:8d:c0: + 47:d1:f1:1d:39:bb:e9:c4:e8:78:03:4c:c0:d5:d1:30:f7:88: + 27:3f:d3:ad:86:e9:65:52:9f:01:f3:aa:91:f9:69:96:bb:d4: + af:73:d2:b5:ce:bd:a5:f9:bf:49:6c:e3:81:a4:c9:e4:54:0d: + 72:cf:00:bc:97:e7:93:c0:25:32:8c:57:dc:c1:fa:a6:d9:11: + 1e:95:5c:5f -----BEGIN CERTIFICATE----- MIIEvjCCA6agAwIBAgIBBDANBgkqhkiG9w0BAQsFADCBlzELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoM B3dvbGZTU0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMRgwFgYDVQQDDA93b2xmU1NM -IHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMTgw -NDEzMTUyMzEwWhcNMjEwMTA3MTUyMzEwWjCBnjELMAkGA1UEBhMCVVMxEzARBgNV +IHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjAw +NTA3MDczOTA0WhcNMjMwMjAxMDczOTA0WjCBnjELMAkGA1UEBhMCVVMxEzARBgNV BAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoMB3dvbGZT U0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMR8wHQYDVQQDDBZ3b2xmU1NMIE9DU1Ag UmVzcG9uZGVyMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMIIBIjAN @@ -80,26 +80,26 @@ CzAJBgNVBAYTAlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0 dGxlMRAwDgYDVQQKDAd3b2xmU1NMMRQwEgYDVQQLDAtFbmdpbmVlcmluZzEYMBYG A1UEAwwPd29sZlNTTCByb290IENBMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZz c2wuY29tggFjMBMGA1UdJQQMMAoGCCsGAQUFBwMJMA0GCSqGSIb3DQEBCwUAA4IB -AQCbVsVfubIAMMoFKujGlrqqI0BAiW2iepPyyYpvDl1fb85eSzip0quXeONzPT0n -6QDOFtnFxQao68bldkz3YBpprjXW+A/anIPG+3SmEuXHZK7nLLbTYh/zIBEuCZsU -8KMX0Cy+Sjk6VVgvkDcExVQnnQ5Rl9oh3wXsynmoygLKz7cF7wT6+YEgEMF9SqeT -EygemKc+TAETw2sU4Yc3XzrTfbbU2Q1Wk38d6cI1xxF/QtDVPV/2/CMk40V/T54Y -33tBgPq7vRbh68V4UojNgseSOs7LxgcF7HAO6NtEjzvzQd6yGbD24FoGSNm54isP -7Owf+4NNgNRuNO14ob6iywer +AQA4CHvItOhfHrb8BUynUVolwnw3tZKrYRk2h64wWpaQcR76SoSsJb7PEEMdcVHK +1t8lq9IeBpbbtT8RmuHhfzisIDDWZA31me1lzagR5htUWBGYkKveF9YD95wpJphZ ++Y3nJiaoTDOButqhHb4b4uNOkjX2sI1X2MG+wMfVCHjiMaGF4BrXXZOdkscTyqQl +olSRaplYTb1kb80JHClJ5DLk6Z3UEs+vOKBIjMjmkg0ahk+JjcBH0fEdObvpxOh4 +A0zA1dEw94gnP9OthullUp8B86qR+WmWu9Svc9K1zr2l+b9JbOOBpMnkVA1yzwC8 +l+eTwCUyjFfcwfqm2REelVxf -----END CERTIFICATE----- Certificate: Data: Version: 3 (0x2) Serial Number: 99 (0x63) - Signature Algorithm: sha256WithRSAEncryption - Issuer: C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Engineering, CN=wolfSSL root CA/emailAddress=info@wolfssl.com + Signature Algorithm: sha256WithRSAEncryption + Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL root CA, emailAddress = info@wolfssl.com Validity - Not Before: Apr 13 15:23:10 2018 GMT - Not After : Jan 7 15:23:10 2021 GMT - Subject: C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Engineering, CN=wolfSSL root CA/emailAddress=info@wolfssl.com + Not Before: May 7 07:39:04 2020 GMT + Not After : Feb 1 07:39:04 2023 GMT + Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL root CA, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption - Public-Key: (2048 bit) + RSA Public-Key: (2048 bit) Modulus: 00:ab:2c:b4:2f:1d:06:09:ef:4e:29:86:84:7e:cc: bf:a6:79:7c:f0:c0:c1:64:25:8c:75:b7:10:05:ca: @@ -136,27 +136,27 @@ Certificate: OCSP - URI:http://127.0.0.1:22220 Signature Algorithm: sha256WithRSAEncryption - 6b:10:b1:f8:cb:77:ef:72:f5:f8:fc:70:6d:18:dc:34:fe:d7: - 95:d8:fd:85:8e:ca:4b:f3:be:1f:eb:14:08:dc:23:34:78:98: - 39:d7:9f:c3:52:f6:14:3d:e9:de:5c:c2:d8:b1:4b:a8:4c:5b: - 91:42:66:da:7f:3c:e9:03:20:5e:08:0f:76:79:b9:21:10:89: - b7:73:46:44:7e:6e:28:0c:00:e4:f4:3e:65:aa:f5:c6:27:57: - 2c:bb:1d:ae:e5:94:57:a3:73:9e:6b:44:00:35:4a:f3:c7:34: - 9c:a2:a7:aa:62:9f:1d:ef:a8:6c:be:07:ad:ef:ae:ee:93:0b: - ba:c3:59:4e:90:40:2d:00:5e:f0:0f:0a:de:18:2a:b3:97:31: - 63:84:ff:18:1c:b6:d8:7d:ee:33:ed:99:f0:f5:7f:88:58:b3: - 0d:90:db:eb:44:7e:06:37:61:d4:34:b9:f6:fd:3e:8d:07:e4: - b5:b0:ae:09:ce:98:e4:b0:1b:d5:7b:53:94:dd:8a:b2:20:d6: - b0:72:f8:b1:bc:76:df:16:86:39:7b:e4:a9:15:47:57:ae:ca: - 41:d6:3a:ba:15:d1:c0:b5:38:66:0b:0f:80:8b:a2:07:b4:fc: - 80:1f:a3:4c:1f:d2:65:97:c1:2c:ae:46:31:61:49:0d:d7:5f: - ac:d2:a6:05 + 45:4c:4f:04:eb:c4:00:00:8a:ff:a2:b8:93:29:ca:fc:90:5b: + a3:6f:4a:02:d4:64:b2:87:4b:70:4e:e5:0d:c5:0c:34:eb:fb: + ce:3b:ba:9e:68:9a:1f:97:94:19:ed:d6:29:fa:1a:4b:88:e4: + b2:55:69:50:b7:68:be:61:ed:15:58:f0:0e:5a:ee:1e:80:cf: + 31:78:82:d3:cb:fa:b2:c3:92:01:f1:e4:ec:44:61:0b:68:81: + 92:24:a3:05:9b:0e:7a:3e:b9:cc:7d:2f:eb:02:77:56:65:6a: + bc:f3:03:0a:6d:75:54:d8:70:6f:c6:fc:c1:27:a5:26:58:bc: + 9d:96:e6:84:fa:2c:cd:ed:bc:dc:20:b8:84:15:33:ce:8f:dd: + 6d:34:99:1a:22:f0:1c:8a:14:b4:04:0d:8d:fd:38:d6:e3:80: + 4c:7c:f6:7f:bc:44:a8:ec:9a:75:cf:8d:65:5c:d1:00:4c:4d: + d4:ed:7d:21:18:e1:08:e7:87:a0:78:94:74:2c:d9:f6:bf:de: + 1f:fc:56:a0:53:7d:43:4a:53:a7:7c:9f:14:58:2c:e5:a8:0e: + f2:3c:af:cb:c5:ad:ba:94:2b:59:23:f6:f3:40:8d:bc:b1:bc: + c2:4f:99:16:10:2b:47:30:5f:5b:12:02:b8:5b:1d:26:f1:7d: + 91:2b:65:53 -----BEGIN CERTIFICATE----- MIIE5jCCA86gAwIBAgIBYzANBgkqhkiG9w0BAQsFADCBlzELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoM B3dvbGZTU0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMRgwFgYDVQQDDA93b2xmU1NM -IHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMTgw -NDEzMTUyMzEwWhcNMjEwMTA3MTUyMzEwWjCBlzELMAkGA1UEBhMCVVMxEzARBgNV +IHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjAw +NTA3MDczOTA0WhcNMjMwMjAxMDczOTA0WjCBlzELMAkGA1UEBhMCVVMxEzARBgNV BAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoMB3dvbGZT U0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMRgwFgYDVQQDDA93b2xmU1NMIHJvb3Qg Q0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wggEiMA0GCSqGSIb3 @@ -172,11 +172,11 @@ A1UEBhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUx EDAOBgNVBAoMB3dvbGZTU0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMRgwFgYDVQQD DA93b2xmU1NMIHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5j b22CAWMwCwYDVR0PBAQDAgEGMDIGCCsGAQUFBwEBBCYwJDAiBggrBgEFBQcwAYYW -aHR0cDovLzEyNy4wLjAuMToyMjIyMDANBgkqhkiG9w0BAQsFAAOCAQEAaxCx+Mt3 -73L1+PxwbRjcNP7Xldj9hY7KS/O+H+sUCNwjNHiYOdefw1L2FD3p3lzC2LFLqExb -kUJm2n886QMgXggPdnm5IRCJt3NGRH5uKAwA5PQ+Zar1xidXLLsdruWUV6NznmtE -ADVK88c0nKKnqmKfHe+obL4Hre+u7pMLusNZTpBALQBe8A8K3hgqs5cxY4T/GBy2 -2H3uM+2Z8PV/iFizDZDb60R+Bjdh1DS59v0+jQfktbCuCc6Y5LAb1XtTlN2KsiDW -sHL4sbx23xaGOXvkqRVHV67KQdY6uhXRwLU4ZgsPgIuiB7T8gB+jTB/SZZfBLK5G -MWFJDddfrNKmBQ== +aHR0cDovLzEyNy4wLjAuMToyMjIyMDANBgkqhkiG9w0BAQsFAAOCAQEARUxPBOvE +AACK/6K4kynK/JBbo29KAtRksodLcE7lDcUMNOv7zju6nmiaH5eUGe3WKfoaS4jk +slVpULdovmHtFVjwDlruHoDPMXiC08v6ssOSAfHk7ERhC2iBkiSjBZsOej65zH0v +6wJ3VmVqvPMDCm11VNhwb8b8wSelJli8nZbmhPosze283CC4hBUzzo/dbTSZGiLw +HIoUtAQNjf041uOATHz2f7xEqOyadc+NZVzRAExN1O19IRjhCOeHoHiUdCzZ9r/e +H/xWoFN9Q0pTp3yfFFgs5agO8jyvy8WtupQrWSP280CNvLG8wk+ZFhArRzBfWxIC +uFsdJvF9kStlUw== -----END CERTIFICATE----- diff --git a/certs/ocsp/root-ca-cert.pem b/certs/ocsp/root-ca-cert.pem index a6fb14512..f0a541696 100644 --- a/certs/ocsp/root-ca-cert.pem +++ b/certs/ocsp/root-ca-cert.pem @@ -2,15 +2,15 @@ Certificate: Data: Version: 3 (0x2) Serial Number: 99 (0x63) - Signature Algorithm: sha256WithRSAEncryption - Issuer: C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Engineering, CN=wolfSSL root CA/emailAddress=info@wolfssl.com + Signature Algorithm: sha256WithRSAEncryption + Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL root CA, emailAddress = info@wolfssl.com Validity - Not Before: Apr 13 15:23:10 2018 GMT - Not After : Jan 7 15:23:10 2021 GMT - Subject: C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Engineering, CN=wolfSSL root CA/emailAddress=info@wolfssl.com + Not Before: May 7 07:39:04 2020 GMT + Not After : Feb 1 07:39:04 2023 GMT + Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL root CA, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption - Public-Key: (2048 bit) + RSA Public-Key: (2048 bit) Modulus: 00:ab:2c:b4:2f:1d:06:09:ef:4e:29:86:84:7e:cc: bf:a6:79:7c:f0:c0:c1:64:25:8c:75:b7:10:05:ca: @@ -47,27 +47,27 @@ Certificate: OCSP - URI:http://127.0.0.1:22220 Signature Algorithm: sha256WithRSAEncryption - 6b:10:b1:f8:cb:77:ef:72:f5:f8:fc:70:6d:18:dc:34:fe:d7: - 95:d8:fd:85:8e:ca:4b:f3:be:1f:eb:14:08:dc:23:34:78:98: - 39:d7:9f:c3:52:f6:14:3d:e9:de:5c:c2:d8:b1:4b:a8:4c:5b: - 91:42:66:da:7f:3c:e9:03:20:5e:08:0f:76:79:b9:21:10:89: - b7:73:46:44:7e:6e:28:0c:00:e4:f4:3e:65:aa:f5:c6:27:57: - 2c:bb:1d:ae:e5:94:57:a3:73:9e:6b:44:00:35:4a:f3:c7:34: - 9c:a2:a7:aa:62:9f:1d:ef:a8:6c:be:07:ad:ef:ae:ee:93:0b: - ba:c3:59:4e:90:40:2d:00:5e:f0:0f:0a:de:18:2a:b3:97:31: - 63:84:ff:18:1c:b6:d8:7d:ee:33:ed:99:f0:f5:7f:88:58:b3: - 0d:90:db:eb:44:7e:06:37:61:d4:34:b9:f6:fd:3e:8d:07:e4: - b5:b0:ae:09:ce:98:e4:b0:1b:d5:7b:53:94:dd:8a:b2:20:d6: - b0:72:f8:b1:bc:76:df:16:86:39:7b:e4:a9:15:47:57:ae:ca: - 41:d6:3a:ba:15:d1:c0:b5:38:66:0b:0f:80:8b:a2:07:b4:fc: - 80:1f:a3:4c:1f:d2:65:97:c1:2c:ae:46:31:61:49:0d:d7:5f: - ac:d2:a6:05 + 45:4c:4f:04:eb:c4:00:00:8a:ff:a2:b8:93:29:ca:fc:90:5b: + a3:6f:4a:02:d4:64:b2:87:4b:70:4e:e5:0d:c5:0c:34:eb:fb: + ce:3b:ba:9e:68:9a:1f:97:94:19:ed:d6:29:fa:1a:4b:88:e4: + b2:55:69:50:b7:68:be:61:ed:15:58:f0:0e:5a:ee:1e:80:cf: + 31:78:82:d3:cb:fa:b2:c3:92:01:f1:e4:ec:44:61:0b:68:81: + 92:24:a3:05:9b:0e:7a:3e:b9:cc:7d:2f:eb:02:77:56:65:6a: + bc:f3:03:0a:6d:75:54:d8:70:6f:c6:fc:c1:27:a5:26:58:bc: + 9d:96:e6:84:fa:2c:cd:ed:bc:dc:20:b8:84:15:33:ce:8f:dd: + 6d:34:99:1a:22:f0:1c:8a:14:b4:04:0d:8d:fd:38:d6:e3:80: + 4c:7c:f6:7f:bc:44:a8:ec:9a:75:cf:8d:65:5c:d1:00:4c:4d: + d4:ed:7d:21:18:e1:08:e7:87:a0:78:94:74:2c:d9:f6:bf:de: + 1f:fc:56:a0:53:7d:43:4a:53:a7:7c:9f:14:58:2c:e5:a8:0e: + f2:3c:af:cb:c5:ad:ba:94:2b:59:23:f6:f3:40:8d:bc:b1:bc: + c2:4f:99:16:10:2b:47:30:5f:5b:12:02:b8:5b:1d:26:f1:7d: + 91:2b:65:53 -----BEGIN CERTIFICATE----- MIIE5jCCA86gAwIBAgIBYzANBgkqhkiG9w0BAQsFADCBlzELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoM B3dvbGZTU0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMRgwFgYDVQQDDA93b2xmU1NM -IHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMTgw -NDEzMTUyMzEwWhcNMjEwMTA3MTUyMzEwWjCBlzELMAkGA1UEBhMCVVMxEzARBgNV +IHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjAw +NTA3MDczOTA0WhcNMjMwMjAxMDczOTA0WjCBlzELMAkGA1UEBhMCVVMxEzARBgNV BAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoMB3dvbGZT U0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMRgwFgYDVQQDDA93b2xmU1NMIHJvb3Qg Q0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wggEiMA0GCSqGSIb3 @@ -83,11 +83,11 @@ A1UEBhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUx EDAOBgNVBAoMB3dvbGZTU0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMRgwFgYDVQQD DA93b2xmU1NMIHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5j b22CAWMwCwYDVR0PBAQDAgEGMDIGCCsGAQUFBwEBBCYwJDAiBggrBgEFBQcwAYYW -aHR0cDovLzEyNy4wLjAuMToyMjIyMDANBgkqhkiG9w0BAQsFAAOCAQEAaxCx+Mt3 -73L1+PxwbRjcNP7Xldj9hY7KS/O+H+sUCNwjNHiYOdefw1L2FD3p3lzC2LFLqExb -kUJm2n886QMgXggPdnm5IRCJt3NGRH5uKAwA5PQ+Zar1xidXLLsdruWUV6NznmtE -ADVK88c0nKKnqmKfHe+obL4Hre+u7pMLusNZTpBALQBe8A8K3hgqs5cxY4T/GBy2 -2H3uM+2Z8PV/iFizDZDb60R+Bjdh1DS59v0+jQfktbCuCc6Y5LAb1XtTlN2KsiDW -sHL4sbx23xaGOXvkqRVHV67KQdY6uhXRwLU4ZgsPgIuiB7T8gB+jTB/SZZfBLK5G -MWFJDddfrNKmBQ== +aHR0cDovLzEyNy4wLjAuMToyMjIyMDANBgkqhkiG9w0BAQsFAAOCAQEARUxPBOvE +AACK/6K4kynK/JBbo29KAtRksodLcE7lDcUMNOv7zju6nmiaH5eUGe3WKfoaS4jk +slVpULdovmHtFVjwDlruHoDPMXiC08v6ssOSAfHk7ERhC2iBkiSjBZsOej65zH0v +6wJ3VmVqvPMDCm11VNhwb8b8wSelJli8nZbmhPosze283CC4hBUzzo/dbTSZGiLw +HIoUtAQNjf041uOATHz2f7xEqOyadc+NZVzRAExN1O19IRjhCOeHoHiUdCzZ9r/e +H/xWoFN9Q0pTp3yfFFgs5agO8jyvy8WtupQrWSP280CNvLG8wk+ZFhArRzBfWxIC +uFsdJvF9kStlUw== -----END CERTIFICATE----- diff --git a/certs/ocsp/server1-cert.pem b/certs/ocsp/server1-cert.pem index f41c534f5..e2a45f18c 100644 --- a/certs/ocsp/server1-cert.pem +++ b/certs/ocsp/server1-cert.pem @@ -2,15 +2,15 @@ Certificate: Data: Version: 3 (0x2) Serial Number: 5 (0x5) - Signature Algorithm: sha256WithRSAEncryption - Issuer: C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Engineering, CN=wolfSSL intermediate CA 1/emailAddress=info@wolfssl.com + Signature Algorithm: sha256WithRSAEncryption + Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL intermediate CA 1, emailAddress = info@wolfssl.com Validity - Not Before: Apr 13 15:23:10 2018 GMT - Not After : Jan 7 15:23:10 2021 GMT - Subject: C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Engineering, CN=www1.wolfssl.com/emailAddress=info@wolfssl.com + Not Before: May 7 07:39:04 2020 GMT + Not After : Feb 1 07:39:04 2023 GMT + Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = www1.wolfssl.com, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption - Public-Key: (2048 bit) + RSA Public-Key: (2048 bit) Modulus: 00:e6:96:55:75:cf:8a:97:68:8c:b6:38:f6:7a:05: be:33:b6:51:47:37:8a:f7:db:91:be:92:6b:b7:00: @@ -47,27 +47,27 @@ Certificate: OCSP - URI:http://127.0.0.1:22221 Signature Algorithm: sha256WithRSAEncryption - 13:fc:55:34:0b:04:b3:16:06:81:b7:11:e8:ec:b4:37:3e:52: - 21:50:8a:48:3f:9b:3d:80:04:8e:d1:8e:b2:0f:84:f8:0a:8c: - 79:6e:65:e3:33:5f:29:9c:39:2b:3c:20:80:96:94:ee:87:2e: - 4a:05:7e:a7:30:8f:d8:ea:56:6d:ce:4b:e5:23:34:80:b1:cb: - 37:11:39:ad:60:3d:ce:87:d1:af:96:3c:53:03:5e:50:c9:70: - ab:d1:38:ba:ea:53:d8:17:03:59:42:f3:cf:8f:68:98:31:4b: - 6b:8f:e6:67:b6:42:d1:9d:24:b5:ab:d3:40:81:bd:6d:d4:d7: - 8a:0d:49:11:eb:b6:be:27:d2:bb:f2:6d:3c:7e:e4:f4:d4:f1: - 03:88:57:8b:25:ce:3e:6e:62:2c:01:9d:1f:c1:11:15:ab:37: - 5a:56:1f:75:aa:5a:70:ac:57:d1:8a:38:c1:e5:a1:b0:1f:33: - e3:84:7d:6b:f9:1a:f2:0a:9c:fa:ed:10:41:ad:56:57:9d:76: - d0:d8:3d:ac:fd:f5:13:3d:01:8e:a3:2c:8f:bd:ab:4d:a9:39: - 52:c9:76:a2:80:49:18:20:8b:4b:85:86:11:1e:19:d1:26:6c: - 92:72:2c:28:eb:38:67:ce:a0:d3:4f:7c:f7:a8:fe:1a:3f:17: - 83:2b:b6:9a + 1e:79:5b:c4:8a:ec:c8:c9:66:26:67:54:42:d2:fc:12:5f:20: + e9:4a:9d:d7:02:aa:a4:5c:ee:4d:17:26:55:ff:86:ea:27:27: + be:6a:e4:20:52:94:86:d4:a3:d5:57:78:61:cc:5b:c4:d9:3d: + a6:8e:a7:c9:54:ad:69:a7:4f:b1:b9:a6:b8:88:ea:c9:49:ff: + 08:9e:02:c3:0d:ea:e1:2e:9f:64:6c:17:35:be:42:48:b8:a4: + d7:fb:d9:1e:5f:3e:6e:d7:d5:5c:d3:0c:de:fa:cd:d8:74:43: + 7e:7b:7f:65:bf:43:31:62:59:6c:45:e6:28:e3:01:f2:1f:fd: + 05:da:93:81:49:63:0a:6a:81:73:d7:8b:ef:f9:d9:85:d1:78: + 12:c1:15:2d:4a:2f:6c:4b:5e:8d:84:2c:7b:4b:73:b6:71:53: + d7:14:89:80:b2:6a:b5:9f:41:80:c2:0c:c7:7d:db:71:07:3e: + c7:5c:4c:92:15:ea:34:7e:94:d9:28:8c:1b:5e:f7:48:fd:e7: + c5:ec:9b:09:cd:33:dd:a4:64:d7:69:99:2a:c7:65:11:ba:51: + 05:ac:be:fd:31:0e:4d:40:62:33:2e:7f:56:9d:6f:c3:97:62: + ac:b8:b7:9f:5c:a7:fb:f3:a0:df:a5:9f:ca:9e:a9:18:3b:1b: + dc:69:f3:c1 -----BEGIN CERTIFICATE----- MIIE7jCCA9agAwIBAgIBBTANBgkqhkiG9w0BAQsFADCBoTELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoM B3dvbGZTU0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMSIwIAYDVQQDDBl3b2xmU1NM IGludGVybWVkaWF0ZSBDQSAxMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTE4MDQxMzE1MjMxMFoXDTIxMDEwNzE1MjMxMFowgZgxCzAJBgNVBAYT +Y29tMB4XDTIwMDUwNzA3MzkwNFoXDTIzMDIwMTA3MzkwNFowgZgxCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYD VQQKDAd3b2xmU1NMMRQwEgYDVQQLDAtFbmdpbmVlcmluZzEZMBcGA1UEAwwQd3d3 MS53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbTCC @@ -84,26 +84,26 @@ U2VhdHRsZTEQMA4GA1UECgwHd29sZlNTTDEUMBIGA1UECwwLRW5naW5lZXJpbmcx GDAWBgNVBAMMD3dvbGZTU0wgcm9vdCBDQTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3 b2xmc3NsLmNvbYIBATALBgNVHQ8EBAMCBeAwMgYIKwYBBQUHAQEEJjAkMCIGCCsG AQUFBzABhhZodHRwOi8vMTI3LjAuMC4xOjIyMjIxMA0GCSqGSIb3DQEBCwUAA4IB -AQAT/FU0CwSzFgaBtxHo7LQ3PlIhUIpIP5s9gASO0Y6yD4T4Cox5bmXjM18pnDkr -PCCAlpTuhy5KBX6nMI/Y6lZtzkvlIzSAscs3ETmtYD3Oh9GvljxTA15QyXCr0Ti6 -6lPYFwNZQvPPj2iYMUtrj+ZntkLRnSS1q9NAgb1t1NeKDUkR67a+J9K78m08fuT0 -1PEDiFeLJc4+bmIsAZ0fwREVqzdaVh91qlpwrFfRijjB5aGwHzPjhH1r+RryCpz6 -7RBBrVZXnXbQ2D2s/fUTPQGOoyyPvatNqTlSyXaigEkYIItLhYYRHhnRJmySciwo -6zhnzqDTT3z3qP4aPxeDK7aa +AQAeeVvEiuzIyWYmZ1RC0vwSXyDpSp3XAqqkXO5NFyZV/4bqJye+auQgUpSG1KPV +V3hhzFvE2T2mjqfJVK1pp0+xuaa4iOrJSf8IngLDDerhLp9kbBc1vkJIuKTX+9ke +Xz5u19Vc0wze+s3YdEN+e39lv0MxYllsReYo4wHyH/0F2pOBSWMKaoFz14vv+dmF +0XgSwRUtSi9sS16NhCx7S3O2cVPXFImAsmq1n0GAwgzHfdtxBz7HXEySFeo0fpTZ +KIwbXvdI/efF7JsJzTPdpGTXaZkqx2URulEFrL79MQ5NQGIzLn9WnW/Dl2KsuLef +XKf786DfpZ/KnqkYOxvcafPB -----END CERTIFICATE----- Certificate: Data: Version: 3 (0x2) Serial Number: 1 (0x1) - Signature Algorithm: sha256WithRSAEncryption - Issuer: C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Engineering, CN=wolfSSL root CA/emailAddress=info@wolfssl.com + Signature Algorithm: sha256WithRSAEncryption + Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL root CA, emailAddress = info@wolfssl.com Validity - Not Before: Apr 13 15:23:10 2018 GMT - Not After : Jan 7 15:23:10 2021 GMT - Subject: C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Engineering, CN=wolfSSL intermediate CA 1/emailAddress=info@wolfssl.com + Not Before: May 7 07:39:04 2020 GMT + Not After : Feb 1 07:39:04 2023 GMT + Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL intermediate CA 1, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption - Public-Key: (2048 bit) + RSA Public-Key: (2048 bit) Modulus: 00:de:b4:c8:5c:77:e0:2d:b1:f5:b9:ad:16:47:35: a0:35:65:65:c6:e1:40:ab:1e:b4:b9:13:b7:cb:8c: @@ -140,27 +140,27 @@ Certificate: OCSP - URI:http://127.0.0.1:22220 Signature Algorithm: sha256WithRSAEncryption - 18:a3:09:fe:c3:53:c7:ce:11:f0:36:86:43:9c:46:9b:43:42: - a0:20:6e:b6:32:29:34:22:fa:27:a1:00:0c:e5:51:c3:35:7b: - 2f:ce:2c:48:7f:47:cf:1b:45:f9:30:b2:d0:17:15:a0:c3:a8: - 3a:e4:5f:a4:96:e4:25:ea:4e:80:90:2e:8d:f5:19:98:ae:2a: - 6d:39:f0:06:8f:e6:0b:c4:2b:dd:07:4a:ad:3d:34:11:79:3d: - 15:db:65:c6:33:60:6b:2f:2d:47:26:bb:91:53:28:35:5c:fd: - 57:3b:27:1b:a1:85:03:24:74:84:f4:f2:b2:e3:53:41:83:9c: - 6b:5a:0c:0f:3b:c4:5f:a7:4b:8b:04:f2:0d:f5:81:aa:16:33: - d2:f4:f5:8d:83:c1:10:2d:57:55:f8:d3:16:62:27:50:b2:57: - 20:1d:a3:07:0c:b8:8d:c5:5a:2f:d9:d3:c4:6a:c3:1e:51:10: - de:7e:60:cf:d0:78:2c:00:d4:da:df:de:de:ee:ed:1d:25:da: - 6c:9f:57:69:2a:f1:a2:6c:8a:fe:72:c0:57:9f:f8:6e:b7:47: - f1:4f:f6:4b:9c:a2:2a:d2:10:9c:4e:bc:b4:8a:a2:8e:51:5a: - c1:e7:9c:f1:7c:9c:f9:7d:d7:9c:8f:ed:e9:57:91:0a:6c:4b: - b4:ac:6f:30 + 96:51:ad:53:a8:aa:ef:a7:88:8e:d1:7e:04:97:48:e8:25:37: + 94:b5:ca:cf:33:66:dd:44:9a:f8:77:67:bc:6a:9a:89:9c:98: + de:f1:71:84:2f:b6:4f:7f:c2:d7:33:dd:c7:90:b7:4d:90:41: + bd:81:a3:73:89:48:b2:40:4b:8b:6e:34:78:c0:a3:7f:92:00: + 86:9f:f4:f5:43:ac:73:80:b8:4b:89:87:08:30:51:36:82:6b: + 33:74:4a:db:dc:08:b4:78:90:90:95:73:ac:76:80:99:e8:e6: + 8f:1d:5b:f8:a3:41:0d:96:d6:3f:28:36:6d:ec:17:f5:a4:89: + cf:a6:a5:60:ad:f2:c4:88:5d:ea:32:aa:a9:ab:c0:c7:f5:7e: + 91:54:78:3d:84:d4:91:f6:4c:48:3f:2d:ae:ae:4a:04:9a:0c: + cf:c2:b2:e8:51:56:9a:50:73:bf:7c:0e:8c:09:99:04:25:dd: + cf:e3:d1:11:f1:fd:98:97:c3:df:c0:bd:17:50:3a:93:15:8f: + a7:97:18:15:14:a1:a4:8b:0b:2f:3d:5e:23:77:f9:6f:11:2a: + 93:5c:6f:2e:2b:70:74:9e:62:58:f7:56:ab:b6:e7:c8:7c:86: + 18:4a:c8:c5:0f:e5:34:a8:16:f6:f9:78:3f:70:32:99:94:41: + 4d:19:b0:e9 -----BEGIN CERTIFICATE----- MIIE8DCCA9igAwIBAgIBATANBgkqhkiG9w0BAQsFADCBlzELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoM B3dvbGZTU0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMRgwFgYDVQQDDA93b2xmU1NM -IHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMTgw -NDEzMTUyMzEwWhcNMjEwMTA3MTUyMzEwWjCBoTELMAkGA1UEBhMCVVMxEzARBgNV +IHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjAw +NTA3MDczOTA0WhcNMjMwMjAxMDczOTA0WjCBoTELMAkGA1UEBhMCVVMxEzARBgNV BAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoMB3dvbGZT U0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMSIwIAYDVQQDDBl3b2xmU1NMIGludGVy bWVkaWF0ZSBDQSAxMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMIIB @@ -177,26 +177,26 @@ DAdTZWF0dGxlMRAwDgYDVQQKDAd3b2xmU1NMMRQwEgYDVQQLDAtFbmdpbmVlcmlu ZzEYMBYGA1UEAwwPd29sZlNTTCByb290IENBMR8wHQYJKoZIhvcNAQkBFhBpbmZv QHdvbGZzc2wuY29tggFjMAsGA1UdDwQEAwIBBjAyBggrBgEFBQcBAQQmMCQwIgYI KwYBBQUHMAGGFmh0dHA6Ly8xMjcuMC4wLjE6MjIyMjAwDQYJKoZIhvcNAQELBQAD -ggEBABijCf7DU8fOEfA2hkOcRptDQqAgbrYyKTQi+iehAAzlUcM1ey/OLEh/R88b -RfkwstAXFaDDqDrkX6SW5CXqToCQLo31GZiuKm058AaP5gvEK90HSq09NBF5PRXb -ZcYzYGsvLUcmu5FTKDVc/Vc7JxuhhQMkdIT08rLjU0GDnGtaDA87xF+nS4sE8g31 -gaoWM9L09Y2DwRAtV1X40xZiJ1CyVyAdowcMuI3FWi/Z08Rqwx5REN5+YM/QeCwA -1Nrf3t7u7R0l2myfV2kq8aJsiv5ywFef+G63R/FP9kucoirSEJxOvLSKoo5RWsHn -nPF8nPl915yP7elXkQpsS7SsbzA= +ggEBAJZRrVOoqu+niI7RfgSXSOglN5S1ys8zZt1Emvh3Z7xqmomcmN7xcYQvtk9/ +wtcz3ceQt02QQb2Bo3OJSLJAS4tuNHjAo3+SAIaf9PVDrHOAuEuJhwgwUTaCazN0 +StvcCLR4kJCVc6x2gJno5o8dW/ijQQ2W1j8oNm3sF/Wkic+mpWCt8sSIXeoyqqmr +wMf1fpFUeD2E1JH2TEg/La6uSgSaDM/CsuhRVppQc798DowJmQQl3c/j0RHx/ZiX +w9/AvRdQOpMVj6eXGBUUoaSLCy89XiN3+W8RKpNcby4rcHSeYlj3Vqu258h8hhhK +yMUP5TSoFvb5eD9wMpmUQU0ZsOk= -----END CERTIFICATE----- Certificate: Data: Version: 3 (0x2) Serial Number: 99 (0x63) - Signature Algorithm: sha256WithRSAEncryption - Issuer: C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Engineering, CN=wolfSSL root CA/emailAddress=info@wolfssl.com + Signature Algorithm: sha256WithRSAEncryption + Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL root CA, emailAddress = info@wolfssl.com Validity - Not Before: Apr 13 15:23:10 2018 GMT - Not After : Jan 7 15:23:10 2021 GMT - Subject: C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Engineering, CN=wolfSSL root CA/emailAddress=info@wolfssl.com + Not Before: May 7 07:39:04 2020 GMT + Not After : Feb 1 07:39:04 2023 GMT + Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL root CA, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption - Public-Key: (2048 bit) + RSA Public-Key: (2048 bit) Modulus: 00:ab:2c:b4:2f:1d:06:09:ef:4e:29:86:84:7e:cc: bf:a6:79:7c:f0:c0:c1:64:25:8c:75:b7:10:05:ca: @@ -233,27 +233,27 @@ Certificate: OCSP - URI:http://127.0.0.1:22220 Signature Algorithm: sha256WithRSAEncryption - 6b:10:b1:f8:cb:77:ef:72:f5:f8:fc:70:6d:18:dc:34:fe:d7: - 95:d8:fd:85:8e:ca:4b:f3:be:1f:eb:14:08:dc:23:34:78:98: - 39:d7:9f:c3:52:f6:14:3d:e9:de:5c:c2:d8:b1:4b:a8:4c:5b: - 91:42:66:da:7f:3c:e9:03:20:5e:08:0f:76:79:b9:21:10:89: - b7:73:46:44:7e:6e:28:0c:00:e4:f4:3e:65:aa:f5:c6:27:57: - 2c:bb:1d:ae:e5:94:57:a3:73:9e:6b:44:00:35:4a:f3:c7:34: - 9c:a2:a7:aa:62:9f:1d:ef:a8:6c:be:07:ad:ef:ae:ee:93:0b: - ba:c3:59:4e:90:40:2d:00:5e:f0:0f:0a:de:18:2a:b3:97:31: - 63:84:ff:18:1c:b6:d8:7d:ee:33:ed:99:f0:f5:7f:88:58:b3: - 0d:90:db:eb:44:7e:06:37:61:d4:34:b9:f6:fd:3e:8d:07:e4: - b5:b0:ae:09:ce:98:e4:b0:1b:d5:7b:53:94:dd:8a:b2:20:d6: - b0:72:f8:b1:bc:76:df:16:86:39:7b:e4:a9:15:47:57:ae:ca: - 41:d6:3a:ba:15:d1:c0:b5:38:66:0b:0f:80:8b:a2:07:b4:fc: - 80:1f:a3:4c:1f:d2:65:97:c1:2c:ae:46:31:61:49:0d:d7:5f: - ac:d2:a6:05 + 45:4c:4f:04:eb:c4:00:00:8a:ff:a2:b8:93:29:ca:fc:90:5b: + a3:6f:4a:02:d4:64:b2:87:4b:70:4e:e5:0d:c5:0c:34:eb:fb: + ce:3b:ba:9e:68:9a:1f:97:94:19:ed:d6:29:fa:1a:4b:88:e4: + b2:55:69:50:b7:68:be:61:ed:15:58:f0:0e:5a:ee:1e:80:cf: + 31:78:82:d3:cb:fa:b2:c3:92:01:f1:e4:ec:44:61:0b:68:81: + 92:24:a3:05:9b:0e:7a:3e:b9:cc:7d:2f:eb:02:77:56:65:6a: + bc:f3:03:0a:6d:75:54:d8:70:6f:c6:fc:c1:27:a5:26:58:bc: + 9d:96:e6:84:fa:2c:cd:ed:bc:dc:20:b8:84:15:33:ce:8f:dd: + 6d:34:99:1a:22:f0:1c:8a:14:b4:04:0d:8d:fd:38:d6:e3:80: + 4c:7c:f6:7f:bc:44:a8:ec:9a:75:cf:8d:65:5c:d1:00:4c:4d: + d4:ed:7d:21:18:e1:08:e7:87:a0:78:94:74:2c:d9:f6:bf:de: + 1f:fc:56:a0:53:7d:43:4a:53:a7:7c:9f:14:58:2c:e5:a8:0e: + f2:3c:af:cb:c5:ad:ba:94:2b:59:23:f6:f3:40:8d:bc:b1:bc: + c2:4f:99:16:10:2b:47:30:5f:5b:12:02:b8:5b:1d:26:f1:7d: + 91:2b:65:53 -----BEGIN CERTIFICATE----- MIIE5jCCA86gAwIBAgIBYzANBgkqhkiG9w0BAQsFADCBlzELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoM B3dvbGZTU0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMRgwFgYDVQQDDA93b2xmU1NM -IHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMTgw -NDEzMTUyMzEwWhcNMjEwMTA3MTUyMzEwWjCBlzELMAkGA1UEBhMCVVMxEzARBgNV +IHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjAw +NTA3MDczOTA0WhcNMjMwMjAxMDczOTA0WjCBlzELMAkGA1UEBhMCVVMxEzARBgNV BAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoMB3dvbGZT U0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMRgwFgYDVQQDDA93b2xmU1NMIHJvb3Qg Q0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wggEiMA0GCSqGSIb3 @@ -269,11 +269,11 @@ A1UEBhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUx EDAOBgNVBAoMB3dvbGZTU0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMRgwFgYDVQQD DA93b2xmU1NMIHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5j b22CAWMwCwYDVR0PBAQDAgEGMDIGCCsGAQUFBwEBBCYwJDAiBggrBgEFBQcwAYYW -aHR0cDovLzEyNy4wLjAuMToyMjIyMDANBgkqhkiG9w0BAQsFAAOCAQEAaxCx+Mt3 -73L1+PxwbRjcNP7Xldj9hY7KS/O+H+sUCNwjNHiYOdefw1L2FD3p3lzC2LFLqExb -kUJm2n886QMgXggPdnm5IRCJt3NGRH5uKAwA5PQ+Zar1xidXLLsdruWUV6NznmtE -ADVK88c0nKKnqmKfHe+obL4Hre+u7pMLusNZTpBALQBe8A8K3hgqs5cxY4T/GBy2 -2H3uM+2Z8PV/iFizDZDb60R+Bjdh1DS59v0+jQfktbCuCc6Y5LAb1XtTlN2KsiDW -sHL4sbx23xaGOXvkqRVHV67KQdY6uhXRwLU4ZgsPgIuiB7T8gB+jTB/SZZfBLK5G -MWFJDddfrNKmBQ== +aHR0cDovLzEyNy4wLjAuMToyMjIyMDANBgkqhkiG9w0BAQsFAAOCAQEARUxPBOvE +AACK/6K4kynK/JBbo29KAtRksodLcE7lDcUMNOv7zju6nmiaH5eUGe3WKfoaS4jk +slVpULdovmHtFVjwDlruHoDPMXiC08v6ssOSAfHk7ERhC2iBkiSjBZsOej65zH0v +6wJ3VmVqvPMDCm11VNhwb8b8wSelJli8nZbmhPosze283CC4hBUzzo/dbTSZGiLw +HIoUtAQNjf041uOATHz2f7xEqOyadc+NZVzRAExN1O19IRjhCOeHoHiUdCzZ9r/e +H/xWoFN9Q0pTp3yfFFgs5agO8jyvy8WtupQrWSP280CNvLG8wk+ZFhArRzBfWxIC +uFsdJvF9kStlUw== -----END CERTIFICATE----- diff --git a/certs/ocsp/server2-cert.pem b/certs/ocsp/server2-cert.pem index 455d18de5..091cf14c8 100644 --- a/certs/ocsp/server2-cert.pem +++ b/certs/ocsp/server2-cert.pem @@ -2,15 +2,15 @@ Certificate: Data: Version: 3 (0x2) Serial Number: 6 (0x6) - Signature Algorithm: sha256WithRSAEncryption - Issuer: C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Engineering, CN=wolfSSL intermediate CA 1/emailAddress=info@wolfssl.com + Signature Algorithm: sha256WithRSAEncryption + Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL intermediate CA 1, emailAddress = info@wolfssl.com Validity - Not Before: Apr 13 15:23:10 2018 GMT - Not After : Jan 7 15:23:10 2021 GMT - Subject: C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Engineering, CN=www2.wolfssl.com/emailAddress=info@wolfssl.com + Not Before: May 7 07:39:04 2020 GMT + Not After : Feb 1 07:39:04 2023 GMT + Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = www2.wolfssl.com, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption - Public-Key: (2048 bit) + RSA Public-Key: (2048 bit) Modulus: 00:c6:35:8a:e8:aa:bd:33:c9:5e:84:43:67:42:65: 2a:3c:e3:89:b4:a6:67:a1:3b:ee:6d:85:d1:d3:2b: @@ -47,27 +47,27 @@ Certificate: OCSP - URI:http://127.0.0.1:22221 Signature Algorithm: sha256WithRSAEncryption - 1d:d0:b5:1d:a1:ae:ef:5e:36:00:36:b3:ae:22:13:32:37:22: - 00:24:b6:b9:c2:b3:a2:55:e5:de:e1:82:83:e9:78:5c:a1:50: - 62:c3:ca:92:2f:21:aa:85:d9:26:56:b1:b0:a1:3c:1f:41:ca: - e6:1a:a3:b0:c1:b1:4c:d2:c0:ab:55:dc:fa:e9:d6:46:63:83: - 2f:8e:c5:ec:28:0e:a9:e5:1b:d9:de:2b:8a:5d:58:56:3a:f8: - 88:bd:99:c4:3a:33:6a:83:4a:26:aa:e3:74:40:a4:82:5a:b2: - 26:23:3b:6d:aa:09:bc:c0:78:2c:c4:75:74:f1:19:e9:ad:39: - 74:53:11:6d:ad:33:b2:f8:45:51:06:f5:5b:19:fd:a7:26:d1: - 11:77:09:f4:c5:07:97:a1:fe:36:3a:6a:fb:64:f1:ed:9b:c4: - 4c:64:cd:6a:bf:17:b8:5b:3f:b7:36:20:4a:cc:34:3e:ec:f5: - a2:68:ae:8d:87:e5:4e:e3:c0:d8:70:67:6a:3c:41:04:0a:36: - 07:40:52:6c:97:15:52:d3:13:a0:fb:c5:b7:f1:c9:40:03:40: - e6:1e:fb:b0:11:77:80:fa:ec:17:24:88:ca:e6:17:1b:b4:f3: - b2:38:bc:bf:c2:98:ec:69:14:c9:2e:75:99:6c:16:78:cc:c5: - 36:d9:0f:f0 + 1c:ff:c1:eb:81:33:20:29:f9:e2:06:11:20:c7:9f:74:c5:80: + f7:76:22:cb:d3:23:54:ed:6d:44:31:b7:9e:95:5d:49:e4:fc: + 46:f7:01:97:8c:0a:88:a9:99:2a:df:e0:4c:18:9b:b4:06:ad: + 64:3e:dc:c4:cf:a4:03:51:85:64:6e:fc:b8:b1:56:0b:92:f4: + be:d2:78:ee:ed:0f:36:f4:64:2d:07:10:e6:02:35:2b:eb:16: + 83:81:a8:08:70:22:33:a6:5d:57:10:83:4f:a6:d5:1e:21:b4: + 5a:d4:92:83:72:9d:b1:6b:e4:68:d3:3a:0e:6b:c5:f5:72:71: + 5b:a2:1e:61:89:fb:86:c9:ad:88:d2:ab:16:c2:bc:79:37:5e: + f3:51:3b:5a:d6:f3:bd:e5:b5:05:a9:bb:f6:1a:2d:78:35:35: + 69:d8:ef:4a:54:33:da:ec:01:7d:a1:0c:f8:d4:80:d2:9a:df: + 8f:87:e8:da:48:24:01:b1:2b:2a:a6:53:a6:ee:c3:3a:c9:3a: + fd:7a:9e:36:02:8f:fa:3a:bf:5a:b4:7e:0f:36:c4:d1:74:56: + de:dd:7a:0a:38:1f:66:c0:f5:ac:82:60:d1:35:b6:b1:cd:da: + 72:7e:3d:3a:7f:07:c7:15:29:56:bc:be:cd:dd:ce:5a:11:8b: + d1:6a:5e:2d -----BEGIN CERTIFICATE----- MIIE7jCCA9agAwIBAgIBBjANBgkqhkiG9w0BAQsFADCBoTELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoM B3dvbGZTU0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMSIwIAYDVQQDDBl3b2xmU1NM IGludGVybWVkaWF0ZSBDQSAxMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTE4MDQxMzE1MjMxMFoXDTIxMDEwNzE1MjMxMFowgZgxCzAJBgNVBAYT +Y29tMB4XDTIwMDUwNzA3MzkwNFoXDTIzMDIwMTA3MzkwNFowgZgxCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYD VQQKDAd3b2xmU1NMMRQwEgYDVQQLDAtFbmdpbmVlcmluZzEZMBcGA1UEAwwQd3d3 Mi53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbTCC @@ -84,26 +84,26 @@ U2VhdHRsZTEQMA4GA1UECgwHd29sZlNTTDEUMBIGA1UECwwLRW5naW5lZXJpbmcx GDAWBgNVBAMMD3dvbGZTU0wgcm9vdCBDQTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3 b2xmc3NsLmNvbYIBATALBgNVHQ8EBAMCBeAwMgYIKwYBBQUHAQEEJjAkMCIGCCsG AQUFBzABhhZodHRwOi8vMTI3LjAuMC4xOjIyMjIxMA0GCSqGSIb3DQEBCwUAA4IB -AQAd0LUdoa7vXjYANrOuIhMyNyIAJLa5wrOiVeXe4YKD6XhcoVBiw8qSLyGqhdkm -VrGwoTwfQcrmGqOwwbFM0sCrVdz66dZGY4MvjsXsKA6p5RvZ3iuKXVhWOviIvZnE -OjNqg0omquN0QKSCWrImIzttqgm8wHgsxHV08RnprTl0UxFtrTOy+EVRBvVbGf2n -JtERdwn0xQeXof42Omr7ZPHtm8RMZM1qvxe4Wz+3NiBKzDQ+7PWiaK6Nh+VO48DY -cGdqPEEECjYHQFJslxVS0xOg+8W38clAA0DmHvuwEXeA+uwXJIjK5hcbtPOyOLy/ -wpjsaRTJLnWZbBZ4zMU22Q/w +AQAc/8HrgTMgKfniBhEgx590xYD3diLL0yNU7W1EMbeelV1J5PxG9wGXjAqIqZkq +3+BMGJu0Bq1kPtzEz6QDUYVkbvy4sVYLkvS+0nju7Q829GQtBxDmAjUr6xaDgagI +cCIzpl1XEINPptUeIbRa1JKDcp2xa+Ro0zoOa8X1cnFboh5hifuGya2I0qsWwrx5 +N17zUTta1vO95bUFqbv2Gi14NTVp2O9KVDPa7AF9oQz41IDSmt+Ph+jaSCQBsSsq +plOm7sM6yTr9ep42Ao/6Or9atH4PNsTRdFbe3XoKOB9mwPWsgmDRNbaxzdpyfj06 +fwfHFSlWvL7N3c5aEYvRal4t -----END CERTIFICATE----- Certificate: Data: Version: 3 (0x2) Serial Number: 1 (0x1) - Signature Algorithm: sha256WithRSAEncryption - Issuer: C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Engineering, CN=wolfSSL root CA/emailAddress=info@wolfssl.com + Signature Algorithm: sha256WithRSAEncryption + Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL root CA, emailAddress = info@wolfssl.com Validity - Not Before: Apr 13 15:23:10 2018 GMT - Not After : Jan 7 15:23:10 2021 GMT - Subject: C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Engineering, CN=wolfSSL intermediate CA 1/emailAddress=info@wolfssl.com + Not Before: May 7 07:39:04 2020 GMT + Not After : Feb 1 07:39:04 2023 GMT + Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL intermediate CA 1, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption - Public-Key: (2048 bit) + RSA Public-Key: (2048 bit) Modulus: 00:de:b4:c8:5c:77:e0:2d:b1:f5:b9:ad:16:47:35: a0:35:65:65:c6:e1:40:ab:1e:b4:b9:13:b7:cb:8c: @@ -140,27 +140,27 @@ Certificate: OCSP - URI:http://127.0.0.1:22220 Signature Algorithm: sha256WithRSAEncryption - 18:a3:09:fe:c3:53:c7:ce:11:f0:36:86:43:9c:46:9b:43:42: - a0:20:6e:b6:32:29:34:22:fa:27:a1:00:0c:e5:51:c3:35:7b: - 2f:ce:2c:48:7f:47:cf:1b:45:f9:30:b2:d0:17:15:a0:c3:a8: - 3a:e4:5f:a4:96:e4:25:ea:4e:80:90:2e:8d:f5:19:98:ae:2a: - 6d:39:f0:06:8f:e6:0b:c4:2b:dd:07:4a:ad:3d:34:11:79:3d: - 15:db:65:c6:33:60:6b:2f:2d:47:26:bb:91:53:28:35:5c:fd: - 57:3b:27:1b:a1:85:03:24:74:84:f4:f2:b2:e3:53:41:83:9c: - 6b:5a:0c:0f:3b:c4:5f:a7:4b:8b:04:f2:0d:f5:81:aa:16:33: - d2:f4:f5:8d:83:c1:10:2d:57:55:f8:d3:16:62:27:50:b2:57: - 20:1d:a3:07:0c:b8:8d:c5:5a:2f:d9:d3:c4:6a:c3:1e:51:10: - de:7e:60:cf:d0:78:2c:00:d4:da:df:de:de:ee:ed:1d:25:da: - 6c:9f:57:69:2a:f1:a2:6c:8a:fe:72:c0:57:9f:f8:6e:b7:47: - f1:4f:f6:4b:9c:a2:2a:d2:10:9c:4e:bc:b4:8a:a2:8e:51:5a: - c1:e7:9c:f1:7c:9c:f9:7d:d7:9c:8f:ed:e9:57:91:0a:6c:4b: - b4:ac:6f:30 + 96:51:ad:53:a8:aa:ef:a7:88:8e:d1:7e:04:97:48:e8:25:37: + 94:b5:ca:cf:33:66:dd:44:9a:f8:77:67:bc:6a:9a:89:9c:98: + de:f1:71:84:2f:b6:4f:7f:c2:d7:33:dd:c7:90:b7:4d:90:41: + bd:81:a3:73:89:48:b2:40:4b:8b:6e:34:78:c0:a3:7f:92:00: + 86:9f:f4:f5:43:ac:73:80:b8:4b:89:87:08:30:51:36:82:6b: + 33:74:4a:db:dc:08:b4:78:90:90:95:73:ac:76:80:99:e8:e6: + 8f:1d:5b:f8:a3:41:0d:96:d6:3f:28:36:6d:ec:17:f5:a4:89: + cf:a6:a5:60:ad:f2:c4:88:5d:ea:32:aa:a9:ab:c0:c7:f5:7e: + 91:54:78:3d:84:d4:91:f6:4c:48:3f:2d:ae:ae:4a:04:9a:0c: + cf:c2:b2:e8:51:56:9a:50:73:bf:7c:0e:8c:09:99:04:25:dd: + cf:e3:d1:11:f1:fd:98:97:c3:df:c0:bd:17:50:3a:93:15:8f: + a7:97:18:15:14:a1:a4:8b:0b:2f:3d:5e:23:77:f9:6f:11:2a: + 93:5c:6f:2e:2b:70:74:9e:62:58:f7:56:ab:b6:e7:c8:7c:86: + 18:4a:c8:c5:0f:e5:34:a8:16:f6:f9:78:3f:70:32:99:94:41: + 4d:19:b0:e9 -----BEGIN CERTIFICATE----- MIIE8DCCA9igAwIBAgIBATANBgkqhkiG9w0BAQsFADCBlzELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoM B3dvbGZTU0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMRgwFgYDVQQDDA93b2xmU1NM -IHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMTgw -NDEzMTUyMzEwWhcNMjEwMTA3MTUyMzEwWjCBoTELMAkGA1UEBhMCVVMxEzARBgNV +IHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjAw +NTA3MDczOTA0WhcNMjMwMjAxMDczOTA0WjCBoTELMAkGA1UEBhMCVVMxEzARBgNV BAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoMB3dvbGZT U0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMSIwIAYDVQQDDBl3b2xmU1NMIGludGVy bWVkaWF0ZSBDQSAxMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMIIB @@ -177,26 +177,26 @@ DAdTZWF0dGxlMRAwDgYDVQQKDAd3b2xmU1NMMRQwEgYDVQQLDAtFbmdpbmVlcmlu ZzEYMBYGA1UEAwwPd29sZlNTTCByb290IENBMR8wHQYJKoZIhvcNAQkBFhBpbmZv QHdvbGZzc2wuY29tggFjMAsGA1UdDwQEAwIBBjAyBggrBgEFBQcBAQQmMCQwIgYI KwYBBQUHMAGGFmh0dHA6Ly8xMjcuMC4wLjE6MjIyMjAwDQYJKoZIhvcNAQELBQAD -ggEBABijCf7DU8fOEfA2hkOcRptDQqAgbrYyKTQi+iehAAzlUcM1ey/OLEh/R88b -RfkwstAXFaDDqDrkX6SW5CXqToCQLo31GZiuKm058AaP5gvEK90HSq09NBF5PRXb -ZcYzYGsvLUcmu5FTKDVc/Vc7JxuhhQMkdIT08rLjU0GDnGtaDA87xF+nS4sE8g31 -gaoWM9L09Y2DwRAtV1X40xZiJ1CyVyAdowcMuI3FWi/Z08Rqwx5REN5+YM/QeCwA -1Nrf3t7u7R0l2myfV2kq8aJsiv5ywFef+G63R/FP9kucoirSEJxOvLSKoo5RWsHn -nPF8nPl915yP7elXkQpsS7SsbzA= +ggEBAJZRrVOoqu+niI7RfgSXSOglN5S1ys8zZt1Emvh3Z7xqmomcmN7xcYQvtk9/ +wtcz3ceQt02QQb2Bo3OJSLJAS4tuNHjAo3+SAIaf9PVDrHOAuEuJhwgwUTaCazN0 +StvcCLR4kJCVc6x2gJno5o8dW/ijQQ2W1j8oNm3sF/Wkic+mpWCt8sSIXeoyqqmr +wMf1fpFUeD2E1JH2TEg/La6uSgSaDM/CsuhRVppQc798DowJmQQl3c/j0RHx/ZiX +w9/AvRdQOpMVj6eXGBUUoaSLCy89XiN3+W8RKpNcby4rcHSeYlj3Vqu258h8hhhK +yMUP5TSoFvb5eD9wMpmUQU0ZsOk= -----END CERTIFICATE----- Certificate: Data: Version: 3 (0x2) Serial Number: 99 (0x63) - Signature Algorithm: sha256WithRSAEncryption - Issuer: C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Engineering, CN=wolfSSL root CA/emailAddress=info@wolfssl.com + Signature Algorithm: sha256WithRSAEncryption + Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL root CA, emailAddress = info@wolfssl.com Validity - Not Before: Apr 13 15:23:10 2018 GMT - Not After : Jan 7 15:23:10 2021 GMT - Subject: C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Engineering, CN=wolfSSL root CA/emailAddress=info@wolfssl.com + Not Before: May 7 07:39:04 2020 GMT + Not After : Feb 1 07:39:04 2023 GMT + Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL root CA, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption - Public-Key: (2048 bit) + RSA Public-Key: (2048 bit) Modulus: 00:ab:2c:b4:2f:1d:06:09:ef:4e:29:86:84:7e:cc: bf:a6:79:7c:f0:c0:c1:64:25:8c:75:b7:10:05:ca: @@ -233,27 +233,27 @@ Certificate: OCSP - URI:http://127.0.0.1:22220 Signature Algorithm: sha256WithRSAEncryption - 6b:10:b1:f8:cb:77:ef:72:f5:f8:fc:70:6d:18:dc:34:fe:d7: - 95:d8:fd:85:8e:ca:4b:f3:be:1f:eb:14:08:dc:23:34:78:98: - 39:d7:9f:c3:52:f6:14:3d:e9:de:5c:c2:d8:b1:4b:a8:4c:5b: - 91:42:66:da:7f:3c:e9:03:20:5e:08:0f:76:79:b9:21:10:89: - b7:73:46:44:7e:6e:28:0c:00:e4:f4:3e:65:aa:f5:c6:27:57: - 2c:bb:1d:ae:e5:94:57:a3:73:9e:6b:44:00:35:4a:f3:c7:34: - 9c:a2:a7:aa:62:9f:1d:ef:a8:6c:be:07:ad:ef:ae:ee:93:0b: - ba:c3:59:4e:90:40:2d:00:5e:f0:0f:0a:de:18:2a:b3:97:31: - 63:84:ff:18:1c:b6:d8:7d:ee:33:ed:99:f0:f5:7f:88:58:b3: - 0d:90:db:eb:44:7e:06:37:61:d4:34:b9:f6:fd:3e:8d:07:e4: - b5:b0:ae:09:ce:98:e4:b0:1b:d5:7b:53:94:dd:8a:b2:20:d6: - b0:72:f8:b1:bc:76:df:16:86:39:7b:e4:a9:15:47:57:ae:ca: - 41:d6:3a:ba:15:d1:c0:b5:38:66:0b:0f:80:8b:a2:07:b4:fc: - 80:1f:a3:4c:1f:d2:65:97:c1:2c:ae:46:31:61:49:0d:d7:5f: - ac:d2:a6:05 + 45:4c:4f:04:eb:c4:00:00:8a:ff:a2:b8:93:29:ca:fc:90:5b: + a3:6f:4a:02:d4:64:b2:87:4b:70:4e:e5:0d:c5:0c:34:eb:fb: + ce:3b:ba:9e:68:9a:1f:97:94:19:ed:d6:29:fa:1a:4b:88:e4: + b2:55:69:50:b7:68:be:61:ed:15:58:f0:0e:5a:ee:1e:80:cf: + 31:78:82:d3:cb:fa:b2:c3:92:01:f1:e4:ec:44:61:0b:68:81: + 92:24:a3:05:9b:0e:7a:3e:b9:cc:7d:2f:eb:02:77:56:65:6a: + bc:f3:03:0a:6d:75:54:d8:70:6f:c6:fc:c1:27:a5:26:58:bc: + 9d:96:e6:84:fa:2c:cd:ed:bc:dc:20:b8:84:15:33:ce:8f:dd: + 6d:34:99:1a:22:f0:1c:8a:14:b4:04:0d:8d:fd:38:d6:e3:80: + 4c:7c:f6:7f:bc:44:a8:ec:9a:75:cf:8d:65:5c:d1:00:4c:4d: + d4:ed:7d:21:18:e1:08:e7:87:a0:78:94:74:2c:d9:f6:bf:de: + 1f:fc:56:a0:53:7d:43:4a:53:a7:7c:9f:14:58:2c:e5:a8:0e: + f2:3c:af:cb:c5:ad:ba:94:2b:59:23:f6:f3:40:8d:bc:b1:bc: + c2:4f:99:16:10:2b:47:30:5f:5b:12:02:b8:5b:1d:26:f1:7d: + 91:2b:65:53 -----BEGIN CERTIFICATE----- MIIE5jCCA86gAwIBAgIBYzANBgkqhkiG9w0BAQsFADCBlzELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoM B3dvbGZTU0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMRgwFgYDVQQDDA93b2xmU1NM -IHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMTgw -NDEzMTUyMzEwWhcNMjEwMTA3MTUyMzEwWjCBlzELMAkGA1UEBhMCVVMxEzARBgNV +IHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjAw +NTA3MDczOTA0WhcNMjMwMjAxMDczOTA0WjCBlzELMAkGA1UEBhMCVVMxEzARBgNV BAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoMB3dvbGZT U0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMRgwFgYDVQQDDA93b2xmU1NMIHJvb3Qg Q0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wggEiMA0GCSqGSIb3 @@ -269,11 +269,11 @@ A1UEBhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUx EDAOBgNVBAoMB3dvbGZTU0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMRgwFgYDVQQD DA93b2xmU1NMIHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5j b22CAWMwCwYDVR0PBAQDAgEGMDIGCCsGAQUFBwEBBCYwJDAiBggrBgEFBQcwAYYW -aHR0cDovLzEyNy4wLjAuMToyMjIyMDANBgkqhkiG9w0BAQsFAAOCAQEAaxCx+Mt3 -73L1+PxwbRjcNP7Xldj9hY7KS/O+H+sUCNwjNHiYOdefw1L2FD3p3lzC2LFLqExb -kUJm2n886QMgXggPdnm5IRCJt3NGRH5uKAwA5PQ+Zar1xidXLLsdruWUV6NznmtE -ADVK88c0nKKnqmKfHe+obL4Hre+u7pMLusNZTpBALQBe8A8K3hgqs5cxY4T/GBy2 -2H3uM+2Z8PV/iFizDZDb60R+Bjdh1DS59v0+jQfktbCuCc6Y5LAb1XtTlN2KsiDW -sHL4sbx23xaGOXvkqRVHV67KQdY6uhXRwLU4ZgsPgIuiB7T8gB+jTB/SZZfBLK5G -MWFJDddfrNKmBQ== +aHR0cDovLzEyNy4wLjAuMToyMjIyMDANBgkqhkiG9w0BAQsFAAOCAQEARUxPBOvE +AACK/6K4kynK/JBbo29KAtRksodLcE7lDcUMNOv7zju6nmiaH5eUGe3WKfoaS4jk +slVpULdovmHtFVjwDlruHoDPMXiC08v6ssOSAfHk7ERhC2iBkiSjBZsOej65zH0v +6wJ3VmVqvPMDCm11VNhwb8b8wSelJli8nZbmhPosze283CC4hBUzzo/dbTSZGiLw +HIoUtAQNjf041uOATHz2f7xEqOyadc+NZVzRAExN1O19IRjhCOeHoHiUdCzZ9r/e +H/xWoFN9Q0pTp3yfFFgs5agO8jyvy8WtupQrWSP280CNvLG8wk+ZFhArRzBfWxIC +uFsdJvF9kStlUw== -----END CERTIFICATE----- diff --git a/certs/ocsp/server3-cert.pem b/certs/ocsp/server3-cert.pem index 34cc27c12..c378649a5 100644 --- a/certs/ocsp/server3-cert.pem +++ b/certs/ocsp/server3-cert.pem @@ -2,15 +2,15 @@ Certificate: Data: Version: 3 (0x2) Serial Number: 7 (0x7) - Signature Algorithm: sha256WithRSAEncryption - Issuer: C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Engineering, CN=wolfSSL intermediate CA 2/emailAddress=info@wolfssl.com + Signature Algorithm: sha256WithRSAEncryption + Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL intermediate CA 2, emailAddress = info@wolfssl.com Validity - Not Before: Apr 13 15:23:10 2018 GMT - Not After : Jan 7 15:23:10 2021 GMT - Subject: C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Engineering, CN=www3.wolfssl.com/emailAddress=info@wolfssl.com + Not Before: May 7 07:39:04 2020 GMT + Not After : Feb 1 07:39:04 2023 GMT + Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = www3.wolfssl.com, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption - Public-Key: (2048 bit) + RSA Public-Key: (2048 bit) Modulus: 00:be:19:65:1e:17:39:d4:33:fc:97:64:69:80:51: fb:6c:7c:ca:e1:ba:2a:ab:d2:dd:30:61:f3:2e:47: @@ -47,27 +47,27 @@ Certificate: OCSP - URI:http://127.0.0.1:22222 Signature Algorithm: sha256WithRSAEncryption - 4e:22:d8:3b:f8:92:f0:1a:0d:6f:94:a6:88:d8:27:b8:28:a4: - 86:4a:2f:4e:6e:ed:38:62:8e:6d:d8:de:33:e9:9d:c8:b1:a8: - f2:0a:66:b8:17:f0:34:79:c0:bf:4a:0b:fe:00:c3:38:db:c0: - 40:1b:84:22:58:b1:e6:60:87:c8:28:f7:52:5c:2b:02:cf:3d: - d4:28:84:3c:cb:74:8a:5a:da:4b:50:ce:95:81:ef:df:c8:dd: - 45:f0:8d:a0:62:3e:4a:b3:d8:0b:3d:d9:75:d5:0d:43:65:01: - fc:f4:70:92:ae:f9:30:6c:21:7c:17:d4:b6:00:1d:97:7b:e6: - 1d:c4:9f:a7:d5:00:87:e7:bd:5a:80:ba:14:9f:56:fc:f1:b5: - f8:ed:14:61:1c:24:7f:ac:39:03:41:dc:c2:da:b2:2e:df:06: - 70:6a:81:1d:6d:a6:e4:cf:f1:5a:c8:80:8d:ea:13:f3:3b:73: - 17:41:87:f2:fa:25:c8:47:73:86:d5:ba:e3:8f:ab:f7:f0:b1: - 1f:b7:33:57:0f:76:01:5c:59:55:fe:13:05:69:2c:e1:02:85: - ac:28:72:48:f7:2d:8c:6b:da:72:fa:95:d5:8f:23:1d:d0:37: - 5d:70:97:af:53:aa:37:11:5d:9e:c3:79:da:bf:c2:01:f3:32: - a2:e4:b0:bd + 78:09:68:a3:a1:ab:ca:c8:a5:db:e9:54:77:43:c1:74:c7:f9: + c0:da:22:82:50:0c:91:d7:09:bc:57:39:40:64:a5:d0:3a:1e: + 0c:00:ef:2b:14:0a:52:92:3a:d7:81:cd:6f:60:ca:51:03:32: + b3:0f:fe:6f:6b:26:7f:ff:98:4d:db:4a:4a:11:53:d6:12:c8: + 36:bb:44:fa:38:d6:73:fa:45:e6:2b:58:78:d8:c4:89:cb:0a: + b6:34:e1:58:2a:e6:cd:cb:49:c7:d1:6b:3a:5f:f4:7e:ab:e8: + 91:48:d7:fc:fd:09:34:1f:54:51:37:83:cf:94:04:d9:ff:3a: + 3c:b7:66:c3:51:ef:64:28:16:a3:eb:fb:8f:da:ab:bc:8a:db: + 32:c3:92:61:e5:9b:4e:3a:ba:e5:57:5a:10:cd:22:70:60:7b: + 3a:db:88:16:f8:16:58:31:dc:12:15:e5:a0:9f:fc:68:bd:14: + 64:c0:2b:10:02:2c:4d:9b:2a:29:3c:e9:5c:59:28:25:e3:24: + ea:d2:73:9e:db:4a:77:dd:26:bc:5b:47:91:84:53:75:63:7e: + 3d:c4:9f:f2:c8:74:2a:a5:40:e0:45:e9:8d:53:48:9a:07:8b: + ad:fa:b8:b3:46:6e:e8:7d:6b:b1:55:60:31:19:b9:66:ec:1f: + c6:a7:7e:21 -----BEGIN CERTIFICATE----- MIIE7jCCA9agAwIBAgIBBzANBgkqhkiG9w0BAQsFADCBoTELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoM B3dvbGZTU0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMSIwIAYDVQQDDBl3b2xmU1NM IGludGVybWVkaWF0ZSBDQSAyMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTE4MDQxMzE1MjMxMFoXDTIxMDEwNzE1MjMxMFowgZgxCzAJBgNVBAYT +Y29tMB4XDTIwMDUwNzA3MzkwNFoXDTIzMDIwMTA3MzkwNFowgZgxCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYD VQQKDAd3b2xmU1NMMRQwEgYDVQQLDAtFbmdpbmVlcmluZzEZMBcGA1UEAwwQd3d3 My53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbTCC @@ -84,26 +84,26 @@ U2VhdHRsZTEQMA4GA1UECgwHd29sZlNTTDEUMBIGA1UECwwLRW5naW5lZXJpbmcx GDAWBgNVBAMMD3dvbGZTU0wgcm9vdCBDQTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3 b2xmc3NsLmNvbYIBAjALBgNVHQ8EBAMCBeAwMgYIKwYBBQUHAQEEJjAkMCIGCCsG AQUFBzABhhZodHRwOi8vMTI3LjAuMC4xOjIyMjIyMA0GCSqGSIb3DQEBCwUAA4IB -AQBOItg7+JLwGg1vlKaI2Ce4KKSGSi9Obu04Yo5t2N4z6Z3IsajyCma4F/A0ecC/ -Sgv+AMM428BAG4QiWLHmYIfIKPdSXCsCzz3UKIQ8y3SKWtpLUM6Vge/fyN1F8I2g -Yj5Ks9gLPdl11Q1DZQH89HCSrvkwbCF8F9S2AB2Xe+YdxJ+n1QCH571agLoUn1b8 -8bX47RRhHCR/rDkDQdzC2rIu3wZwaoEdbabkz/FayICN6hPzO3MXQYfy+iXIR3OG -1brjj6v38LEftzNXD3YBXFlV/hMFaSzhAoWsKHJI9y2Ma9py+pXVjyMd0DddcJev -U6o3EV2ew3nav8IB8zKi5LC9 +AQB4CWijoavKyKXb6VR3Q8F0x/nA2iKCUAyR1wm8VzlAZKXQOh4MAO8rFApSkjrX +gc1vYMpRAzKzD/5vayZ//5hN20pKEVPWEsg2u0T6ONZz+kXmK1h42MSJywq2NOFY +KubNy0nH0Ws6X/R+q+iRSNf8/Qk0H1RRN4PPlATZ/zo8t2bDUe9kKBaj6/uP2qu8 +itsyw5Jh5ZtOOrrlV1oQzSJwYHs624gW+BZYMdwSFeWgn/xovRRkwCsQAixNmyop +POlcWSgl4yTq0nOe20p33Sa8W0eRhFN1Y349xJ/yyHQqpUDgRemNU0iaB4ut+riz +Rm7ofWuxVWAxGblm7B/Gp34h -----END CERTIFICATE----- Certificate: Data: Version: 3 (0x2) Serial Number: 2 (0x2) - Signature Algorithm: sha256WithRSAEncryption - Issuer: C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Engineering, CN=wolfSSL root CA/emailAddress=info@wolfssl.com + Signature Algorithm: sha256WithRSAEncryption + Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL root CA, emailAddress = info@wolfssl.com Validity - Not Before: Apr 13 15:23:10 2018 GMT - Not After : Jan 7 15:23:10 2021 GMT - Subject: C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Engineering, CN=wolfSSL intermediate CA 2/emailAddress=info@wolfssl.com + Not Before: May 7 07:39:04 2020 GMT + Not After : Feb 1 07:39:04 2023 GMT + Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL intermediate CA 2, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption - Public-Key: (2048 bit) + RSA Public-Key: (2048 bit) Modulus: 00:d0:20:3c:35:19:6f:2c:44:b4:7e:42:c7:75:b4: 6a:2b:a9:23:85:bf:87:b4:ee:ca:d7:4b:1f:31:d7: @@ -140,27 +140,27 @@ Certificate: OCSP - URI:http://127.0.0.1:22220 Signature Algorithm: sha256WithRSAEncryption - 92:6e:c1:af:88:af:46:f2:6e:8a:8c:27:06:8e:b4:38:35:9b: - 47:92:24:20:e5:a5:13:d8:35:d3:2e:37:ca:74:47:e5:16:a3: - 03:63:16:b4:28:2b:d9:04:ab:ee:e4:0a:e5:87:da:d4:00:3a: - 53:c6:c9:25:6a:8f:49:d2:2e:34:f2:40:65:6e:02:fc:b9:42: - 3f:ef:cb:8c:79:84:03:84:dc:a0:68:1e:c7:c7:36:8c:60:14: - 55:f2:5f:f9:c1:3f:2b:f6:a2:1e:34:1f:83:ba:73:bc:b7:62: - bc:97:66:84:09:b9:2d:76:71:c8:91:fd:e2:e1:39:cf:dd:ec: - 98:a8:49:69:89:a8:18:2a:42:e7:fc:ab:2c:cf:13:ab:63:fe: - b0:19:ea:1a:38:22:16:11:31:34:43:fc:50:c6:ec:19:97:03: - db:e8:07:28:48:88:3a:e5:35:a2:fd:83:12:df:55:70:72:61: - 0d:f8:66:18:52:58:c9:46:97:86:31:9e:a2:43:0c:b9:0f:d3: - eb:35:c9:e5:19:4e:b4:8b:d2:ac:ea:bf:83:2a:48:9d:20:a0: - 08:45:60:92:8a:27:06:93:77:74:bb:0e:22:8e:54:17:f2:d4: - e7:7f:f3:90:4d:cc:75:e7:16:c5:9c:4a:cf:dc:f2:19:18:12: - f5:72:8e:2e + 8a:53:ed:5e:45:6d:f1:23:ee:ec:db:0a:fe:1b:7a:1c:fd:f0: + 30:ac:f8:e6:6b:62:b7:74:62:a3:aa:84:6c:8c:c1:cd:62:42: + cb:e2:fd:e5:57:79:ec:36:b2:49:50:25:e6:5f:95:02:0a:54: + 5a:75:ba:11:28:fe:5c:f1:ed:68:97:08:64:df:ad:97:30:ef: + c0:35:03:93:e8:40:c9:bb:6c:ed:23:01:22:f8:9b:cf:c2:fe: + 23:9d:0d:b4:d9:6a:cd:ad:ac:95:fc:03:72:ff:e7:bd:7b:19: + e5:2f:b7:b1:ec:20:44:d3:90:46:df:76:dc:ca:47:69:a1:54: + 0c:62:4c:2c:de:54:b8:08:09:a5:0d:59:ae:66:5b:9b:df:2d: + 54:e2:06:4e:46:5f:bc:38:38:87:ca:65:bf:d4:4b:53:11:2f: + 7b:30:c7:94:d7:f1:91:80:ab:d2:c1:67:ae:a2:95:7a:3c:26: + 92:2b:78:33:9e:c0:16:99:86:1f:0e:56:9b:83:eb:54:e4:10: + fa:46:b0:e7:ff:ed:a6:38:83:40:5e:49:58:99:23:17:37:d1: + 66:6a:6d:59:b1:d8:62:19:6c:25:ab:08:54:07:a4:8c:2e:2a: + 0c:a9:81:ba:dd:71:ad:af:cb:22:ec:31:6b:d3:a3:a3:4c:11: + 16:dc:91:06 -----BEGIN CERTIFICATE----- MIIE8DCCA9igAwIBAgIBAjANBgkqhkiG9w0BAQsFADCBlzELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoM B3dvbGZTU0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMRgwFgYDVQQDDA93b2xmU1NM -IHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMTgw -NDEzMTUyMzEwWhcNMjEwMTA3MTUyMzEwWjCBoTELMAkGA1UEBhMCVVMxEzARBgNV +IHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjAw +NTA3MDczOTA0WhcNMjMwMjAxMDczOTA0WjCBoTELMAkGA1UEBhMCVVMxEzARBgNV BAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoMB3dvbGZT U0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMSIwIAYDVQQDDBl3b2xmU1NMIGludGVy bWVkaWF0ZSBDQSAyMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMIIB @@ -177,26 +177,26 @@ DAdTZWF0dGxlMRAwDgYDVQQKDAd3b2xmU1NMMRQwEgYDVQQLDAtFbmdpbmVlcmlu ZzEYMBYGA1UEAwwPd29sZlNTTCByb290IENBMR8wHQYJKoZIhvcNAQkBFhBpbmZv QHdvbGZzc2wuY29tggFjMAsGA1UdDwQEAwIBBjAyBggrBgEFBQcBAQQmMCQwIgYI KwYBBQUHMAGGFmh0dHA6Ly8xMjcuMC4wLjE6MjIyMjAwDQYJKoZIhvcNAQELBQAD -ggEBAJJuwa+Ir0byboqMJwaOtDg1m0eSJCDlpRPYNdMuN8p0R+UWowNjFrQoK9kE -q+7kCuWH2tQAOlPGySVqj0nSLjTyQGVuAvy5Qj/vy4x5hAOE3KBoHsfHNoxgFFXy -X/nBPyv2oh40H4O6c7y3YryXZoQJuS12cciR/eLhOc/d7JioSWmJqBgqQuf8qyzP -E6tj/rAZ6ho4IhYRMTRD/FDG7BmXA9voByhIiDrlNaL9gxLfVXByYQ34ZhhSWMlG -l4YxnqJDDLkP0+s1yeUZTrSL0qzqv4MqSJ0goAhFYJKKJwaTd3S7DiKOVBfy1Od/ -85BNzHXnFsWcSs/c8hkYEvVyji4= +ggEBAIpT7V5FbfEj7uzbCv4behz98DCs+OZrYrd0YqOqhGyMwc1iQsvi/eVXeew2 +sklQJeZflQIKVFp1uhEo/lzx7WiXCGTfrZcw78A1A5PoQMm7bO0jASL4m8/C/iOd +DbTZas2trJX8A3L/5717GeUvt7HsIETTkEbfdtzKR2mhVAxiTCzeVLgICaUNWa5m +W5vfLVTiBk5GX7w4OIfKZb/US1MRL3swx5TX8ZGAq9LBZ66ilXo8JpIreDOewBaZ +hh8OVpuD61TkEPpGsOf/7aY4g0BeSViZIxc30WZqbVmx2GIZbCWrCFQHpIwuKgyp +gbrdca2vyyLsMWvTo6NMERbckQY= -----END CERTIFICATE----- Certificate: Data: Version: 3 (0x2) Serial Number: 99 (0x63) - Signature Algorithm: sha256WithRSAEncryption - Issuer: C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Engineering, CN=wolfSSL root CA/emailAddress=info@wolfssl.com + Signature Algorithm: sha256WithRSAEncryption + Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL root CA, emailAddress = info@wolfssl.com Validity - Not Before: Apr 13 15:23:10 2018 GMT - Not After : Jan 7 15:23:10 2021 GMT - Subject: C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Engineering, CN=wolfSSL root CA/emailAddress=info@wolfssl.com + Not Before: May 7 07:39:04 2020 GMT + Not After : Feb 1 07:39:04 2023 GMT + Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL root CA, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption - Public-Key: (2048 bit) + RSA Public-Key: (2048 bit) Modulus: 00:ab:2c:b4:2f:1d:06:09:ef:4e:29:86:84:7e:cc: bf:a6:79:7c:f0:c0:c1:64:25:8c:75:b7:10:05:ca: @@ -233,27 +233,27 @@ Certificate: OCSP - URI:http://127.0.0.1:22220 Signature Algorithm: sha256WithRSAEncryption - 6b:10:b1:f8:cb:77:ef:72:f5:f8:fc:70:6d:18:dc:34:fe:d7: - 95:d8:fd:85:8e:ca:4b:f3:be:1f:eb:14:08:dc:23:34:78:98: - 39:d7:9f:c3:52:f6:14:3d:e9:de:5c:c2:d8:b1:4b:a8:4c:5b: - 91:42:66:da:7f:3c:e9:03:20:5e:08:0f:76:79:b9:21:10:89: - b7:73:46:44:7e:6e:28:0c:00:e4:f4:3e:65:aa:f5:c6:27:57: - 2c:bb:1d:ae:e5:94:57:a3:73:9e:6b:44:00:35:4a:f3:c7:34: - 9c:a2:a7:aa:62:9f:1d:ef:a8:6c:be:07:ad:ef:ae:ee:93:0b: - ba:c3:59:4e:90:40:2d:00:5e:f0:0f:0a:de:18:2a:b3:97:31: - 63:84:ff:18:1c:b6:d8:7d:ee:33:ed:99:f0:f5:7f:88:58:b3: - 0d:90:db:eb:44:7e:06:37:61:d4:34:b9:f6:fd:3e:8d:07:e4: - b5:b0:ae:09:ce:98:e4:b0:1b:d5:7b:53:94:dd:8a:b2:20:d6: - b0:72:f8:b1:bc:76:df:16:86:39:7b:e4:a9:15:47:57:ae:ca: - 41:d6:3a:ba:15:d1:c0:b5:38:66:0b:0f:80:8b:a2:07:b4:fc: - 80:1f:a3:4c:1f:d2:65:97:c1:2c:ae:46:31:61:49:0d:d7:5f: - ac:d2:a6:05 + 45:4c:4f:04:eb:c4:00:00:8a:ff:a2:b8:93:29:ca:fc:90:5b: + a3:6f:4a:02:d4:64:b2:87:4b:70:4e:e5:0d:c5:0c:34:eb:fb: + ce:3b:ba:9e:68:9a:1f:97:94:19:ed:d6:29:fa:1a:4b:88:e4: + b2:55:69:50:b7:68:be:61:ed:15:58:f0:0e:5a:ee:1e:80:cf: + 31:78:82:d3:cb:fa:b2:c3:92:01:f1:e4:ec:44:61:0b:68:81: + 92:24:a3:05:9b:0e:7a:3e:b9:cc:7d:2f:eb:02:77:56:65:6a: + bc:f3:03:0a:6d:75:54:d8:70:6f:c6:fc:c1:27:a5:26:58:bc: + 9d:96:e6:84:fa:2c:cd:ed:bc:dc:20:b8:84:15:33:ce:8f:dd: + 6d:34:99:1a:22:f0:1c:8a:14:b4:04:0d:8d:fd:38:d6:e3:80: + 4c:7c:f6:7f:bc:44:a8:ec:9a:75:cf:8d:65:5c:d1:00:4c:4d: + d4:ed:7d:21:18:e1:08:e7:87:a0:78:94:74:2c:d9:f6:bf:de: + 1f:fc:56:a0:53:7d:43:4a:53:a7:7c:9f:14:58:2c:e5:a8:0e: + f2:3c:af:cb:c5:ad:ba:94:2b:59:23:f6:f3:40:8d:bc:b1:bc: + c2:4f:99:16:10:2b:47:30:5f:5b:12:02:b8:5b:1d:26:f1:7d: + 91:2b:65:53 -----BEGIN CERTIFICATE----- MIIE5jCCA86gAwIBAgIBYzANBgkqhkiG9w0BAQsFADCBlzELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoM B3dvbGZTU0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMRgwFgYDVQQDDA93b2xmU1NM -IHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMTgw -NDEzMTUyMzEwWhcNMjEwMTA3MTUyMzEwWjCBlzELMAkGA1UEBhMCVVMxEzARBgNV +IHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjAw +NTA3MDczOTA0WhcNMjMwMjAxMDczOTA0WjCBlzELMAkGA1UEBhMCVVMxEzARBgNV BAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoMB3dvbGZT U0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMRgwFgYDVQQDDA93b2xmU1NMIHJvb3Qg Q0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wggEiMA0GCSqGSIb3 @@ -269,11 +269,11 @@ A1UEBhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUx EDAOBgNVBAoMB3dvbGZTU0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMRgwFgYDVQQD DA93b2xmU1NMIHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5j b22CAWMwCwYDVR0PBAQDAgEGMDIGCCsGAQUFBwEBBCYwJDAiBggrBgEFBQcwAYYW -aHR0cDovLzEyNy4wLjAuMToyMjIyMDANBgkqhkiG9w0BAQsFAAOCAQEAaxCx+Mt3 -73L1+PxwbRjcNP7Xldj9hY7KS/O+H+sUCNwjNHiYOdefw1L2FD3p3lzC2LFLqExb -kUJm2n886QMgXggPdnm5IRCJt3NGRH5uKAwA5PQ+Zar1xidXLLsdruWUV6NznmtE -ADVK88c0nKKnqmKfHe+obL4Hre+u7pMLusNZTpBALQBe8A8K3hgqs5cxY4T/GBy2 -2H3uM+2Z8PV/iFizDZDb60R+Bjdh1DS59v0+jQfktbCuCc6Y5LAb1XtTlN2KsiDW -sHL4sbx23xaGOXvkqRVHV67KQdY6uhXRwLU4ZgsPgIuiB7T8gB+jTB/SZZfBLK5G -MWFJDddfrNKmBQ== +aHR0cDovLzEyNy4wLjAuMToyMjIyMDANBgkqhkiG9w0BAQsFAAOCAQEARUxPBOvE +AACK/6K4kynK/JBbo29KAtRksodLcE7lDcUMNOv7zju6nmiaH5eUGe3WKfoaS4jk +slVpULdovmHtFVjwDlruHoDPMXiC08v6ssOSAfHk7ERhC2iBkiSjBZsOej65zH0v +6wJ3VmVqvPMDCm11VNhwb8b8wSelJli8nZbmhPosze283CC4hBUzzo/dbTSZGiLw +HIoUtAQNjf041uOATHz2f7xEqOyadc+NZVzRAExN1O19IRjhCOeHoHiUdCzZ9r/e +H/xWoFN9Q0pTp3yfFFgs5agO8jyvy8WtupQrWSP280CNvLG8wk+ZFhArRzBfWxIC +uFsdJvF9kStlUw== -----END CERTIFICATE----- diff --git a/certs/ocsp/server4-cert.pem b/certs/ocsp/server4-cert.pem index 95eb15a0a..d7e65b123 100644 --- a/certs/ocsp/server4-cert.pem +++ b/certs/ocsp/server4-cert.pem @@ -2,15 +2,15 @@ Certificate: Data: Version: 3 (0x2) Serial Number: 8 (0x8) - Signature Algorithm: sha256WithRSAEncryption - Issuer: C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Engineering, CN=wolfSSL intermediate CA 2/emailAddress=info@wolfssl.com + Signature Algorithm: sha256WithRSAEncryption + Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL intermediate CA 2, emailAddress = info@wolfssl.com Validity - Not Before: Apr 13 15:23:10 2018 GMT - Not After : Jan 7 15:23:10 2021 GMT - Subject: C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Engineering, CN=www4.wolfssl.com/emailAddress=info@wolfssl.com + Not Before: May 7 07:39:04 2020 GMT + Not After : Feb 1 07:39:04 2023 GMT + Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = www4.wolfssl.com, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption - Public-Key: (2048 bit) + RSA Public-Key: (2048 bit) Modulus: 00:9c:ef:8a:7e:84:4d:58:7a:b1:91:c8:cb:68:76: df:fe:0a:29:fe:7f:74:35:d5:c3:fd:43:be:d7:89: @@ -47,27 +47,27 @@ Certificate: OCSP - URI:http://127.0.0.1:22222 Signature Algorithm: sha256WithRSAEncryption - 18:72:41:57:9a:c3:fa:b0:30:f4:bc:16:81:bf:3a:38:99:d2: - ac:24:b9:80:24:57:d2:9b:e6:29:ad:5d:7c:7c:f7:50:dd:9d: - 0b:0f:90:b5:cb:96:a1:19:3f:5b:6d:28:52:ee:a4:bb:28:3e: - 38:54:73:bb:9a:13:91:3d:f5:57:cf:bc:a8:21:64:dc:5c:d1: - 19:94:a6:8a:80:f8:92:e4:10:f9:19:c2:2b:b3:78:6b:2c:3d: - 81:9c:e9:3d:61:78:01:34:dd:f1:be:54:db:31:54:ed:ef:67: - a3:9b:c1:a1:5b:9b:ce:be:23:3a:6b:ab:92:34:1b:a1:d6:0b: - 1d:65:8a:cd:e2:f3:d1:ce:a9:c5:bf:19:a9:25:15:e6:98:f5: - 3f:3f:fa:22:72:48:a6:65:64:06:74:0c:49:bd:fe:7d:4e:5b: - 23:20:a8:a7:18:0e:7a:39:7e:d2:1f:a6:03:c2:31:6e:ce:49: - de:81:3c:7d:9f:1c:39:bb:df:8b:5c:58:8f:7a:08:77:f7:f8: - e3:f0:fe:14:73:0f:40:35:6a:1c:5a:46:79:b8:8b:4e:dd:75: - e0:55:89:57:d9:19:43:91:ca:66:39:00:7e:9b:0d:b2:3d:fc: - 35:7e:15:74:ed:36:61:94:7b:37:e2:17:37:4a:43:63:2e:24: - a7:e6:01:cb + 77:27:77:21:55:28:5a:8b:f0:b6:d0:a9:a2:1e:8d:4a:09:70: + 63:84:f6:ab:6f:8c:dc:88:7e:b9:ae:2c:8e:91:69:b0:f6:2c: + 89:df:70:12:90:e4:80:63:9b:76:cb:86:89:1b:15:6d:04:2e: + 76:cb:cb:70:a5:80:1b:ab:1d:cc:40:0e:44:e2:93:69:7f:46: + b9:22:70:fa:6e:45:25:a2:9c:fc:d8:b8:11:44:e6:cf:8d:4b: + aa:ce:1b:1e:75:e7:9e:57:49:be:00:cb:b9:ff:7b:1a:a8:2a: + 3d:bf:f9:e3:9e:5c:cc:d6:9f:6c:7c:8a:9d:09:75:8d:1c:61: + 94:0e:f5:43:97:4e:cf:64:c9:de:b3:ed:af:05:f6:b8:74:0f: + 3f:83:a6:24:f6:6e:ae:dd:12:2d:33:be:4f:9a:a8:4a:12:41: + 4f:8a:70:30:93:eb:9a:62:d4:80:0e:96:09:4d:8c:a3:74:5d: + aa:c9:35:dc:7c:0c:7b:66:b4:ec:7b:b3:4d:5e:62:87:3d:cd: + e3:f8:56:fd:79:a2:a1:24:ca:bb:d4:be:4d:3d:ed:de:dd:4a: + d1:8f:e9:01:22:c6:ef:6d:48:ce:2c:ff:b8:9b:86:47:48:d3: + 50:55:24:8c:f3:07:57:b7:82:85:47:85:95:fe:63:01:e7:30: + 7c:06:1e:8a -----BEGIN CERTIFICATE----- MIIE7jCCA9agAwIBAgIBCDANBgkqhkiG9w0BAQsFADCBoTELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoM B3dvbGZTU0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMSIwIAYDVQQDDBl3b2xmU1NM IGludGVybWVkaWF0ZSBDQSAyMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTE4MDQxMzE1MjMxMFoXDTIxMDEwNzE1MjMxMFowgZgxCzAJBgNVBAYT +Y29tMB4XDTIwMDUwNzA3MzkwNFoXDTIzMDIwMTA3MzkwNFowgZgxCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYD VQQKDAd3b2xmU1NMMRQwEgYDVQQLDAtFbmdpbmVlcmluZzEZMBcGA1UEAwwQd3d3 NC53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbTCC @@ -84,26 +84,26 @@ U2VhdHRsZTEQMA4GA1UECgwHd29sZlNTTDEUMBIGA1UECwwLRW5naW5lZXJpbmcx GDAWBgNVBAMMD3dvbGZTU0wgcm9vdCBDQTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3 b2xmc3NsLmNvbYIBAjALBgNVHQ8EBAMCBeAwMgYIKwYBBQUHAQEEJjAkMCIGCCsG AQUFBzABhhZodHRwOi8vMTI3LjAuMC4xOjIyMjIyMA0GCSqGSIb3DQEBCwUAA4IB -AQAYckFXmsP6sDD0vBaBvzo4mdKsJLmAJFfSm+YprV18fPdQ3Z0LD5C1y5ahGT9b -bShS7qS7KD44VHO7mhORPfVXz7yoIWTcXNEZlKaKgPiS5BD5GcIrs3hrLD2BnOk9 -YXgBNN3xvlTbMVTt72ejm8GhW5vOviM6a6uSNBuh1gsdZYrN4vPRzqnFvxmpJRXm -mPU/P/oickimZWQGdAxJvf59TlsjIKinGA56OX7SH6YDwjFuzknegTx9nxw5u9+L -XFiPegh39/jj8P4Ucw9ANWocWkZ5uItO3XXgVYlX2RlDkcpmOQB+mw2yPfw1fhV0 -7TZhlHs34hc3SkNjLiSn5gHL +AQB3J3chVShai/C20KmiHo1KCXBjhParb4zciH65riyOkWmw9iyJ33ASkOSAY5t2 +y4aJGxVtBC52y8twpYAbqx3MQA5E4pNpf0a5InD6bkUlopz82LgRRObPjUuqzhse +deeeV0m+AMu5/3saqCo9v/njnlzM1p9sfIqdCXWNHGGUDvVDl07PZMnes+2vBfa4 +dA8/g6Yk9m6u3RItM75PmqhKEkFPinAwk+uaYtSADpYJTYyjdF2qyTXcfAx7ZrTs +e7NNXmKHPc3j+Fb9eaKhJMq71L5NPe3e3UrRj+kBIsbvbUjOLP+4m4ZHSNNQVSSM +8wdXt4KFR4WV/mMB5zB8Bh6K -----END CERTIFICATE----- Certificate: Data: Version: 3 (0x2) Serial Number: 2 (0x2) - Signature Algorithm: sha256WithRSAEncryption - Issuer: C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Engineering, CN=wolfSSL root CA/emailAddress=info@wolfssl.com + Signature Algorithm: sha256WithRSAEncryption + Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL root CA, emailAddress = info@wolfssl.com Validity - Not Before: Apr 13 15:23:10 2018 GMT - Not After : Jan 7 15:23:10 2021 GMT - Subject: C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Engineering, CN=wolfSSL intermediate CA 2/emailAddress=info@wolfssl.com + Not Before: May 7 07:39:04 2020 GMT + Not After : Feb 1 07:39:04 2023 GMT + Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL intermediate CA 2, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption - Public-Key: (2048 bit) + RSA Public-Key: (2048 bit) Modulus: 00:d0:20:3c:35:19:6f:2c:44:b4:7e:42:c7:75:b4: 6a:2b:a9:23:85:bf:87:b4:ee:ca:d7:4b:1f:31:d7: @@ -140,27 +140,27 @@ Certificate: OCSP - URI:http://127.0.0.1:22220 Signature Algorithm: sha256WithRSAEncryption - 92:6e:c1:af:88:af:46:f2:6e:8a:8c:27:06:8e:b4:38:35:9b: - 47:92:24:20:e5:a5:13:d8:35:d3:2e:37:ca:74:47:e5:16:a3: - 03:63:16:b4:28:2b:d9:04:ab:ee:e4:0a:e5:87:da:d4:00:3a: - 53:c6:c9:25:6a:8f:49:d2:2e:34:f2:40:65:6e:02:fc:b9:42: - 3f:ef:cb:8c:79:84:03:84:dc:a0:68:1e:c7:c7:36:8c:60:14: - 55:f2:5f:f9:c1:3f:2b:f6:a2:1e:34:1f:83:ba:73:bc:b7:62: - bc:97:66:84:09:b9:2d:76:71:c8:91:fd:e2:e1:39:cf:dd:ec: - 98:a8:49:69:89:a8:18:2a:42:e7:fc:ab:2c:cf:13:ab:63:fe: - b0:19:ea:1a:38:22:16:11:31:34:43:fc:50:c6:ec:19:97:03: - db:e8:07:28:48:88:3a:e5:35:a2:fd:83:12:df:55:70:72:61: - 0d:f8:66:18:52:58:c9:46:97:86:31:9e:a2:43:0c:b9:0f:d3: - eb:35:c9:e5:19:4e:b4:8b:d2:ac:ea:bf:83:2a:48:9d:20:a0: - 08:45:60:92:8a:27:06:93:77:74:bb:0e:22:8e:54:17:f2:d4: - e7:7f:f3:90:4d:cc:75:e7:16:c5:9c:4a:cf:dc:f2:19:18:12: - f5:72:8e:2e + 8a:53:ed:5e:45:6d:f1:23:ee:ec:db:0a:fe:1b:7a:1c:fd:f0: + 30:ac:f8:e6:6b:62:b7:74:62:a3:aa:84:6c:8c:c1:cd:62:42: + cb:e2:fd:e5:57:79:ec:36:b2:49:50:25:e6:5f:95:02:0a:54: + 5a:75:ba:11:28:fe:5c:f1:ed:68:97:08:64:df:ad:97:30:ef: + c0:35:03:93:e8:40:c9:bb:6c:ed:23:01:22:f8:9b:cf:c2:fe: + 23:9d:0d:b4:d9:6a:cd:ad:ac:95:fc:03:72:ff:e7:bd:7b:19: + e5:2f:b7:b1:ec:20:44:d3:90:46:df:76:dc:ca:47:69:a1:54: + 0c:62:4c:2c:de:54:b8:08:09:a5:0d:59:ae:66:5b:9b:df:2d: + 54:e2:06:4e:46:5f:bc:38:38:87:ca:65:bf:d4:4b:53:11:2f: + 7b:30:c7:94:d7:f1:91:80:ab:d2:c1:67:ae:a2:95:7a:3c:26: + 92:2b:78:33:9e:c0:16:99:86:1f:0e:56:9b:83:eb:54:e4:10: + fa:46:b0:e7:ff:ed:a6:38:83:40:5e:49:58:99:23:17:37:d1: + 66:6a:6d:59:b1:d8:62:19:6c:25:ab:08:54:07:a4:8c:2e:2a: + 0c:a9:81:ba:dd:71:ad:af:cb:22:ec:31:6b:d3:a3:a3:4c:11: + 16:dc:91:06 -----BEGIN CERTIFICATE----- MIIE8DCCA9igAwIBAgIBAjANBgkqhkiG9w0BAQsFADCBlzELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoM B3dvbGZTU0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMRgwFgYDVQQDDA93b2xmU1NM -IHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMTgw -NDEzMTUyMzEwWhcNMjEwMTA3MTUyMzEwWjCBoTELMAkGA1UEBhMCVVMxEzARBgNV +IHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjAw +NTA3MDczOTA0WhcNMjMwMjAxMDczOTA0WjCBoTELMAkGA1UEBhMCVVMxEzARBgNV BAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoMB3dvbGZT U0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMSIwIAYDVQQDDBl3b2xmU1NMIGludGVy bWVkaWF0ZSBDQSAyMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMIIB @@ -177,26 +177,26 @@ DAdTZWF0dGxlMRAwDgYDVQQKDAd3b2xmU1NMMRQwEgYDVQQLDAtFbmdpbmVlcmlu ZzEYMBYGA1UEAwwPd29sZlNTTCByb290IENBMR8wHQYJKoZIhvcNAQkBFhBpbmZv QHdvbGZzc2wuY29tggFjMAsGA1UdDwQEAwIBBjAyBggrBgEFBQcBAQQmMCQwIgYI KwYBBQUHMAGGFmh0dHA6Ly8xMjcuMC4wLjE6MjIyMjAwDQYJKoZIhvcNAQELBQAD -ggEBAJJuwa+Ir0byboqMJwaOtDg1m0eSJCDlpRPYNdMuN8p0R+UWowNjFrQoK9kE -q+7kCuWH2tQAOlPGySVqj0nSLjTyQGVuAvy5Qj/vy4x5hAOE3KBoHsfHNoxgFFXy -X/nBPyv2oh40H4O6c7y3YryXZoQJuS12cciR/eLhOc/d7JioSWmJqBgqQuf8qyzP -E6tj/rAZ6ho4IhYRMTRD/FDG7BmXA9voByhIiDrlNaL9gxLfVXByYQ34ZhhSWMlG -l4YxnqJDDLkP0+s1yeUZTrSL0qzqv4MqSJ0goAhFYJKKJwaTd3S7DiKOVBfy1Od/ -85BNzHXnFsWcSs/c8hkYEvVyji4= +ggEBAIpT7V5FbfEj7uzbCv4behz98DCs+OZrYrd0YqOqhGyMwc1iQsvi/eVXeew2 +sklQJeZflQIKVFp1uhEo/lzx7WiXCGTfrZcw78A1A5PoQMm7bO0jASL4m8/C/iOd +DbTZas2trJX8A3L/5717GeUvt7HsIETTkEbfdtzKR2mhVAxiTCzeVLgICaUNWa5m +W5vfLVTiBk5GX7w4OIfKZb/US1MRL3swx5TX8ZGAq9LBZ66ilXo8JpIreDOewBaZ +hh8OVpuD61TkEPpGsOf/7aY4g0BeSViZIxc30WZqbVmx2GIZbCWrCFQHpIwuKgyp +gbrdca2vyyLsMWvTo6NMERbckQY= -----END CERTIFICATE----- Certificate: Data: Version: 3 (0x2) Serial Number: 99 (0x63) - Signature Algorithm: sha256WithRSAEncryption - Issuer: C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Engineering, CN=wolfSSL root CA/emailAddress=info@wolfssl.com + Signature Algorithm: sha256WithRSAEncryption + Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL root CA, emailAddress = info@wolfssl.com Validity - Not Before: Apr 13 15:23:10 2018 GMT - Not After : Jan 7 15:23:10 2021 GMT - Subject: C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Engineering, CN=wolfSSL root CA/emailAddress=info@wolfssl.com + Not Before: May 7 07:39:04 2020 GMT + Not After : Feb 1 07:39:04 2023 GMT + Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL root CA, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption - Public-Key: (2048 bit) + RSA Public-Key: (2048 bit) Modulus: 00:ab:2c:b4:2f:1d:06:09:ef:4e:29:86:84:7e:cc: bf:a6:79:7c:f0:c0:c1:64:25:8c:75:b7:10:05:ca: @@ -233,27 +233,27 @@ Certificate: OCSP - URI:http://127.0.0.1:22220 Signature Algorithm: sha256WithRSAEncryption - 6b:10:b1:f8:cb:77:ef:72:f5:f8:fc:70:6d:18:dc:34:fe:d7: - 95:d8:fd:85:8e:ca:4b:f3:be:1f:eb:14:08:dc:23:34:78:98: - 39:d7:9f:c3:52:f6:14:3d:e9:de:5c:c2:d8:b1:4b:a8:4c:5b: - 91:42:66:da:7f:3c:e9:03:20:5e:08:0f:76:79:b9:21:10:89: - b7:73:46:44:7e:6e:28:0c:00:e4:f4:3e:65:aa:f5:c6:27:57: - 2c:bb:1d:ae:e5:94:57:a3:73:9e:6b:44:00:35:4a:f3:c7:34: - 9c:a2:a7:aa:62:9f:1d:ef:a8:6c:be:07:ad:ef:ae:ee:93:0b: - ba:c3:59:4e:90:40:2d:00:5e:f0:0f:0a:de:18:2a:b3:97:31: - 63:84:ff:18:1c:b6:d8:7d:ee:33:ed:99:f0:f5:7f:88:58:b3: - 0d:90:db:eb:44:7e:06:37:61:d4:34:b9:f6:fd:3e:8d:07:e4: - b5:b0:ae:09:ce:98:e4:b0:1b:d5:7b:53:94:dd:8a:b2:20:d6: - b0:72:f8:b1:bc:76:df:16:86:39:7b:e4:a9:15:47:57:ae:ca: - 41:d6:3a:ba:15:d1:c0:b5:38:66:0b:0f:80:8b:a2:07:b4:fc: - 80:1f:a3:4c:1f:d2:65:97:c1:2c:ae:46:31:61:49:0d:d7:5f: - ac:d2:a6:05 + 45:4c:4f:04:eb:c4:00:00:8a:ff:a2:b8:93:29:ca:fc:90:5b: + a3:6f:4a:02:d4:64:b2:87:4b:70:4e:e5:0d:c5:0c:34:eb:fb: + ce:3b:ba:9e:68:9a:1f:97:94:19:ed:d6:29:fa:1a:4b:88:e4: + b2:55:69:50:b7:68:be:61:ed:15:58:f0:0e:5a:ee:1e:80:cf: + 31:78:82:d3:cb:fa:b2:c3:92:01:f1:e4:ec:44:61:0b:68:81: + 92:24:a3:05:9b:0e:7a:3e:b9:cc:7d:2f:eb:02:77:56:65:6a: + bc:f3:03:0a:6d:75:54:d8:70:6f:c6:fc:c1:27:a5:26:58:bc: + 9d:96:e6:84:fa:2c:cd:ed:bc:dc:20:b8:84:15:33:ce:8f:dd: + 6d:34:99:1a:22:f0:1c:8a:14:b4:04:0d:8d:fd:38:d6:e3:80: + 4c:7c:f6:7f:bc:44:a8:ec:9a:75:cf:8d:65:5c:d1:00:4c:4d: + d4:ed:7d:21:18:e1:08:e7:87:a0:78:94:74:2c:d9:f6:bf:de: + 1f:fc:56:a0:53:7d:43:4a:53:a7:7c:9f:14:58:2c:e5:a8:0e: + f2:3c:af:cb:c5:ad:ba:94:2b:59:23:f6:f3:40:8d:bc:b1:bc: + c2:4f:99:16:10:2b:47:30:5f:5b:12:02:b8:5b:1d:26:f1:7d: + 91:2b:65:53 -----BEGIN CERTIFICATE----- MIIE5jCCA86gAwIBAgIBYzANBgkqhkiG9w0BAQsFADCBlzELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoM B3dvbGZTU0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMRgwFgYDVQQDDA93b2xmU1NM -IHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMTgw -NDEzMTUyMzEwWhcNMjEwMTA3MTUyMzEwWjCBlzELMAkGA1UEBhMCVVMxEzARBgNV +IHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjAw +NTA3MDczOTA0WhcNMjMwMjAxMDczOTA0WjCBlzELMAkGA1UEBhMCVVMxEzARBgNV BAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoMB3dvbGZT U0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMRgwFgYDVQQDDA93b2xmU1NMIHJvb3Qg Q0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wggEiMA0GCSqGSIb3 @@ -269,11 +269,11 @@ A1UEBhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUx EDAOBgNVBAoMB3dvbGZTU0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMRgwFgYDVQQD DA93b2xmU1NMIHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5j b22CAWMwCwYDVR0PBAQDAgEGMDIGCCsGAQUFBwEBBCYwJDAiBggrBgEFBQcwAYYW -aHR0cDovLzEyNy4wLjAuMToyMjIyMDANBgkqhkiG9w0BAQsFAAOCAQEAaxCx+Mt3 -73L1+PxwbRjcNP7Xldj9hY7KS/O+H+sUCNwjNHiYOdefw1L2FD3p3lzC2LFLqExb -kUJm2n886QMgXggPdnm5IRCJt3NGRH5uKAwA5PQ+Zar1xidXLLsdruWUV6NznmtE -ADVK88c0nKKnqmKfHe+obL4Hre+u7pMLusNZTpBALQBe8A8K3hgqs5cxY4T/GBy2 -2H3uM+2Z8PV/iFizDZDb60R+Bjdh1DS59v0+jQfktbCuCc6Y5LAb1XtTlN2KsiDW -sHL4sbx23xaGOXvkqRVHV67KQdY6uhXRwLU4ZgsPgIuiB7T8gB+jTB/SZZfBLK5G -MWFJDddfrNKmBQ== +aHR0cDovLzEyNy4wLjAuMToyMjIyMDANBgkqhkiG9w0BAQsFAAOCAQEARUxPBOvE +AACK/6K4kynK/JBbo29KAtRksodLcE7lDcUMNOv7zju6nmiaH5eUGe3WKfoaS4jk +slVpULdovmHtFVjwDlruHoDPMXiC08v6ssOSAfHk7ERhC2iBkiSjBZsOej65zH0v +6wJ3VmVqvPMDCm11VNhwb8b8wSelJli8nZbmhPosze283CC4hBUzzo/dbTSZGiLw +HIoUtAQNjf041uOATHz2f7xEqOyadc+NZVzRAExN1O19IRjhCOeHoHiUdCzZ9r/e +H/xWoFN9Q0pTp3yfFFgs5agO8jyvy8WtupQrWSP280CNvLG8wk+ZFhArRzBfWxIC +uFsdJvF9kStlUw== -----END CERTIFICATE----- diff --git a/certs/ocsp/server5-cert.pem b/certs/ocsp/server5-cert.pem index 1a6b81c67..363117100 100644 --- a/certs/ocsp/server5-cert.pem +++ b/certs/ocsp/server5-cert.pem @@ -2,15 +2,15 @@ Certificate: Data: Version: 3 (0x2) Serial Number: 9 (0x9) - Signature Algorithm: sha256WithRSAEncryption - Issuer: C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Engineering, CN=wolfSSL REVOKED intermediate CA/emailAddress=info@wolfssl.com + Signature Algorithm: sha256WithRSAEncryption + Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL REVOKED intermediate CA, emailAddress = info@wolfssl.com Validity - Not Before: Apr 13 15:23:10 2018 GMT - Not After : Jan 7 15:23:10 2021 GMT - Subject: C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Engineering, CN=www5.wolfssl.com/emailAddress=info@wolfssl.com + Not Before: May 7 07:39:04 2020 GMT + Not After : Feb 1 07:39:04 2023 GMT + Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = www5.wolfssl.com, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption - Public-Key: (2048 bit) + RSA Public-Key: (2048 bit) Modulus: 00:ac:73:6d:e9:fa:8c:36:72:3e:89:3b:52:29:bd: 14:70:a2:00:b4:08:58:b6:c6:c0:bf:80:6a:1f:a5: @@ -47,27 +47,27 @@ Certificate: OCSP - URI:http://127.0.0.1:22223 Signature Algorithm: sha256WithRSAEncryption - ba:fe:ad:1d:d4:33:69:13:86:4d:1a:ea:fc:a0:61:00:9a:bd: - 83:7d:53:3d:b5:63:a9:c8:c2:b6:10:4d:fb:5f:f2:e5:b1:e4: - 1a:9b:85:36:8f:3c:d3:09:98:4c:c5:3e:10:ed:a3:74:a5:3c: - fc:d9:b2:80:38:6c:be:f4:8b:52:40:0e:45:e8:fd:a2:29:d8: - 5c:f9:1d:14:76:3d:8d:41:74:3c:56:05:d2:a3:2e:14:5b:35: - 95:97:cf:c1:01:cf:a2:26:38:0b:76:12:bd:c4:68:f2:f5:49: - ed:7e:eb:4e:08:73:fe:82:06:8e:ce:c4:22:d5:16:ef:0e:62: - d5:f1:08:b8:2e:02:75:23:52:04:cf:cb:aa:1c:ce:77:b6:3a: - e9:78:53:c4:37:d4:cc:7f:96:5d:97:89:35:da:a6:23:77:87: - 60:4a:a8:f8:b6:e6:1a:00:c5:74:98:88:b2:01:fd:23:81:05: - f5:bb:96:60:55:ae:3b:9f:bf:c9:82:e1:24:d6:1d:1f:5d:9c: - f7:1b:cb:37:3e:4f:c8:ca:65:c1:33:69:75:62:83:bb:87:45: - 47:bd:b2:b6:55:ef:8f:7c:5f:fd:14:75:96:4f:3e:19:d8:88: - 67:5d:75:ae:77:8f:38:3f:a2:7e:f6:f8:b8:c8:57:28:10:9d: - 1e:cd:c3:5c + 5d:46:57:bf:93:14:9c:79:78:f0:82:9b:23:76:af:8b:63:a1: + c1:bf:3f:ae:aa:7f:c2:52:34:22:ee:8b:19:59:8f:eb:c7:d2: + 8a:0b:78:b3:4b:40:4f:16:43:d5:1d:cb:86:02:20:48:66:1d: + 41:6f:4d:53:02:ba:1e:94:65:9d:23:a2:19:17:a9:57:37:09: + d8:cb:2f:3b:75:43:16:66:61:1d:f4:5e:57:fd:fc:d3:7d:d7: + 10:fa:bc:f7:b3:ba:8b:4c:a8:e0:b8:d5:90:40:79:4e:85:ee: + c5:9b:61:27:26:88:51:70:52:7d:5c:b3:75:c3:a9:83:a0:3d: + 63:13:f3:82:15:55:ce:65:7f:0b:14:cd:30:e3:22:5b:01:83: + 05:5a:92:d4:bf:16:9d:b3:0e:69:f2:b5:99:83:b3:05:c6:84: + 6d:e5:b4:a5:c5:8c:c2:c8:71:d2:b4:93:39:cd:98:54:7f:29: + 77:8a:33:d6:ca:bb:b5:f9:87:ef:ec:a0:5b:87:1d:43:05:cb: + 3e:8c:e3:40:75:8f:bc:54:12:84:e0:3d:b0:a0:a4:87:e1:c0: + ae:50:03:ce:64:43:e4:81:3a:11:79:e0:45:4a:2b:24:11:a8: + da:73:e3:d3:c1:7b:d8:31:35:0e:c8:d8:f3:89:01:0d:dc:8e: + d7:eb:95:53 -----BEGIN CERTIFICATE----- MIIE9DCCA9ygAwIBAgIBCTANBgkqhkiG9w0BAQsFADCBpzELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoM B3dvbGZTU0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMSgwJgYDVQQDDB93b2xmU1NM IFJFVk9LRUQgaW50ZXJtZWRpYXRlIENBMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdv -bGZzc2wuY29tMB4XDTE4MDQxMzE1MjMxMFoXDTIxMDEwNzE1MjMxMFowgZgxCzAJ +bGZzc2wuY29tMB4XDTIwMDUwNzA3MzkwNFoXDTIzMDIwMTA3MzkwNFowgZgxCzAJ BgNVBAYTAlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxl MRAwDgYDVQQKDAd3b2xmU1NMMRQwEgYDVQQLDAtFbmdpbmVlcmluZzEZMBcGA1UE AwwQd3d3NS53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3Ns @@ -84,26 +84,26 @@ A1UEBwwHU2VhdHRsZTEQMA4GA1UECgwHd29sZlNTTDEUMBIGA1UECwwLRW5naW5l ZXJpbmcxGDAWBgNVBAMMD3dvbGZTU0wgcm9vdCBDQTEfMB0GCSqGSIb3DQEJARYQ aW5mb0B3b2xmc3NsLmNvbYIBAzALBgNVHQ8EBAMCBeAwMgYIKwYBBQUHAQEEJjAk MCIGCCsGAQUFBzABhhZodHRwOi8vMTI3LjAuMC4xOjIyMjIzMA0GCSqGSIb3DQEB -CwUAA4IBAQC6/q0d1DNpE4ZNGur8oGEAmr2DfVM9tWOpyMK2EE37X/LlseQam4U2 -jzzTCZhMxT4Q7aN0pTz82bKAOGy+9ItSQA5F6P2iKdhc+R0Udj2NQXQ8VgXSoy4U -WzWVl8/BAc+iJjgLdhK9xGjy9UntfutOCHP+ggaOzsQi1RbvDmLV8Qi4LgJ1I1IE -z8uqHM53tjrpeFPEN9TMf5Zdl4k12qYjd4dgSqj4tuYaAMV0mIiyAf0jgQX1u5Zg -Va47n7/JguEk1h0fXZz3G8s3Pk/IymXBM2l1YoO7h0VHvbK2Ve+PfF/9FHWWTz4Z -2IhnXXWud484P6J+9vi4yFcoEJ0ezcNc +CwUAA4IBAQBdRle/kxSceXjwgpsjdq+LY6HBvz+uqn/CUjQi7osZWY/rx9KKC3iz +S0BPFkPVHcuGAiBIZh1Bb01TAroelGWdI6IZF6lXNwnYyy87dUMWZmEd9F5X/fzT +fdcQ+rz3s7qLTKjguNWQQHlOhe7Fm2EnJohRcFJ9XLN1w6mDoD1jE/OCFVXOZX8L +FM0w4yJbAYMFWpLUvxadsw5p8rWZg7MFxoRt5bSlxYzCyHHStJM5zZhUfyl3ijPW +yru1+Yfv7KBbhx1DBcs+jONAdY+8VBKE4D2woKSH4cCuUAPOZEPkgToReeBFSisk +Eajac+PTwXvYMTUOyNjziQEN3I7X65VT -----END CERTIFICATE----- Certificate: Data: Version: 3 (0x2) Serial Number: 3 (0x3) - Signature Algorithm: sha256WithRSAEncryption - Issuer: C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Engineering, CN=wolfSSL root CA/emailAddress=info@wolfssl.com + Signature Algorithm: sha256WithRSAEncryption + Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL root CA, emailAddress = info@wolfssl.com Validity - Not Before: Apr 13 15:23:10 2018 GMT - Not After : Jan 7 15:23:10 2021 GMT - Subject: C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Engineering, CN=wolfSSL REVOKED intermediate CA/emailAddress=info@wolfssl.com + Not Before: May 7 07:39:04 2020 GMT + Not After : Feb 1 07:39:04 2023 GMT + Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL REVOKED intermediate CA, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption - Public-Key: (2048 bit) + RSA Public-Key: (2048 bit) Modulus: 00:de:c5:04:10:7d:c2:21:e9:12:45:da:d5:ba:28: fd:a6:f4:30:44:a0:df:f9:70:5e:17:26:97:59:5c: @@ -140,27 +140,27 @@ Certificate: OCSP - URI:http://127.0.0.1:22220 Signature Algorithm: sha256WithRSAEncryption - 63:bf:90:58:0c:44:08:57:7d:94:7e:eb:fd:9d:90:f6:1d:a5: - 91:2a:32:38:a7:f7:39:c2:c0:9c:93:26:bc:f4:4b:81:0a:0f: - 07:2d:4f:a9:20:9a:3e:2c:24:0c:30:10:d7:be:96:ab:ee:1f: - 2c:f8:71:7c:1a:c1:ae:b7:64:e1:7e:18:53:c3:ae:d5:04:16: - f7:e5:34:c2:d1:a3:31:d4:9b:f4:b7:c1:96:1f:a7:3c:3a:bf: - fd:06:be:76:f4:da:95:f9:6f:be:4f:24:a7:0f:b0:2c:12:4d: - d6:55:ea:f8:0a:30:91:32:4f:a3:14:6d:ec:cd:85:12:1f:da: - 78:8a:b1:9a:74:fb:fd:00:45:4a:30:83:45:16:a0:8f:b7:7f: - 23:33:91:c6:81:ac:f3:9b:cd:53:6b:9a:fa:36:9b:5d:3c:72: - a8:73:4f:1e:b5:da:ba:08:3d:9b:ca:7a:d6:c2:bf:6e:9f:a5: - 9e:db:61:bc:a5:42:a7:d4:92:4a:7e:a3:3d:1b:aa:d3:c2:93: - ad:ce:3b:0e:2b:61:44:1e:3c:61:54:0d:6a:26:21:54:c6:e0: - ed:3d:da:27:cd:89:5a:f8:1f:0f:46:80:c1:f2:80:cc:52:f1: - 7f:ce:10:68:66:3f:ee:90:25:45:d4:f8:87:f9:5d:5d:74:3d: - aa:3d:43:1c + 79:14:07:86:9c:ca:f0:db:23:4d:97:81:38:ce:c4:29:d4:6d: + 31:78:e5:58:1f:6e:bd:2a:0a:c2:27:9c:32:d8:b6:fb:d0:37: + c0:8e:a3:da:ab:c1:2d:71:07:78:42:9e:8d:16:47:92:6e:44: + 06:46:1c:db:34:2d:8b:56:60:af:42:bc:bb:30:d8:37:4b:d9: + bb:de:10:88:d1:39:10:a7:09:ee:5b:40:cd:4c:e2:3c:b9:34: + 14:ef:91:00:c8:c9:97:d2:e7:ff:8c:a4:64:70:ca:37:68:95: + 39:87:5c:0a:dc:9a:69:d0:b9:39:25:69:cd:37:b4:4a:29:3a: + 13:a0:3b:b0:59:c3:da:42:b7:70:1e:b5:b6:5b:70:46:85:1c: + d9:3a:34:06:4d:4c:e3:1d:7f:ef:26:98:4c:f1:0e:7a:f2:ce: + 6e:fe:7b:6a:74:fa:c6:5b:10:71:23:db:c9:03:13:c2:64:9e: + a0:1b:41:d1:ba:1c:17:cf:77:30:92:a6:76:75:24:b0:df:8a: + f4:1e:c0:37:98:6c:30:66:f6:8a:f4:c5:74:4d:21:58:99:7a: + ae:dc:08:6b:16:0f:61:1d:2a:e2:a8:78:f9:de:1f:3b:b1:dc: + 73:d9:1b:3e:ed:19:e6:38:cb:f2:c1:a3:17:dc:4a:b5:11:d4: + 2d:0f:55:08 -----BEGIN CERTIFICATE----- MIIE9jCCA96gAwIBAgIBAzANBgkqhkiG9w0BAQsFADCBlzELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoM B3dvbGZTU0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMRgwFgYDVQQDDA93b2xmU1NM -IHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMTgw -NDEzMTUyMzEwWhcNMjEwMTA3MTUyMzEwWjCBpzELMAkGA1UEBhMCVVMxEzARBgNV +IHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjAw +NTA3MDczOTA0WhcNMjMwMjAxMDczOTA0WjCBpzELMAkGA1UEBhMCVVMxEzARBgNV BAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoMB3dvbGZT U0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMSgwJgYDVQQDDB93b2xmU1NMIFJFVk9L RUQgaW50ZXJtZWRpYXRlIENBMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu @@ -177,26 +177,26 @@ DgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3b2xmU1NMMRQwEgYDVQQLDAtFbmdp bmVlcmluZzEYMBYGA1UEAwwPd29sZlNTTCByb290IENBMR8wHQYJKoZIhvcNAQkB FhBpbmZvQHdvbGZzc2wuY29tggFjMAsGA1UdDwQEAwIBBjAyBggrBgEFBQcBAQQm MCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly8xMjcuMC4wLjE6MjIyMjAwDQYJKoZIhvcN -AQELBQADggEBAGO/kFgMRAhXfZR+6/2dkPYdpZEqMjin9znCwJyTJrz0S4EKDwct -T6kgmj4sJAwwENe+lqvuHyz4cXwawa63ZOF+GFPDrtUEFvflNMLRozHUm/S3wZYf -pzw6v/0Gvnb02pX5b75PJKcPsCwSTdZV6vgKMJEyT6MUbezNhRIf2niKsZp0+/0A -RUowg0UWoI+3fyMzkcaBrPObzVNrmvo2m108cqhzTx612roIPZvKetbCv26fpZ7b -YbylQqfUkkp+oz0bqtPCk63OOw4rYUQePGFUDWomIVTG4O092ifNiVr4Hw9GgMHy -gMxS8X/OEGhmP+6QJUXU+If5XV10Pao9Qxw= +AQELBQADggEBAHkUB4acyvDbI02XgTjOxCnUbTF45Vgfbr0qCsInnDLYtvvQN8CO +o9qrwS1xB3hCno0WR5JuRAZGHNs0LYtWYK9CvLsw2DdL2bveEIjRORCnCe5bQM1M +4jy5NBTvkQDIyZfS5/+MpGRwyjdolTmHXArcmmnQuTklac03tEopOhOgO7BZw9pC +t3AetbZbcEaFHNk6NAZNTOMdf+8mmEzxDnryzm7+e2p0+sZbEHEj28kDE8JknqAb +QdG6HBfPdzCSpnZ1JLDfivQewDeYbDBm9or0xXRNIViZeq7cCGsWD2EdKuKoePne +Hzux3HPZGz7tGeY4y/LBoxfcSrUR1C0PVQg= -----END CERTIFICATE----- Certificate: Data: Version: 3 (0x2) Serial Number: 99 (0x63) - Signature Algorithm: sha256WithRSAEncryption - Issuer: C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Engineering, CN=wolfSSL root CA/emailAddress=info@wolfssl.com + Signature Algorithm: sha256WithRSAEncryption + Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL root CA, emailAddress = info@wolfssl.com Validity - Not Before: Apr 13 15:23:10 2018 GMT - Not After : Jan 7 15:23:10 2021 GMT - Subject: C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Engineering, CN=wolfSSL root CA/emailAddress=info@wolfssl.com + Not Before: May 7 07:39:04 2020 GMT + Not After : Feb 1 07:39:04 2023 GMT + Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL root CA, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption - Public-Key: (2048 bit) + RSA Public-Key: (2048 bit) Modulus: 00:ab:2c:b4:2f:1d:06:09:ef:4e:29:86:84:7e:cc: bf:a6:79:7c:f0:c0:c1:64:25:8c:75:b7:10:05:ca: @@ -233,27 +233,27 @@ Certificate: OCSP - URI:http://127.0.0.1:22220 Signature Algorithm: sha256WithRSAEncryption - 6b:10:b1:f8:cb:77:ef:72:f5:f8:fc:70:6d:18:dc:34:fe:d7: - 95:d8:fd:85:8e:ca:4b:f3:be:1f:eb:14:08:dc:23:34:78:98: - 39:d7:9f:c3:52:f6:14:3d:e9:de:5c:c2:d8:b1:4b:a8:4c:5b: - 91:42:66:da:7f:3c:e9:03:20:5e:08:0f:76:79:b9:21:10:89: - b7:73:46:44:7e:6e:28:0c:00:e4:f4:3e:65:aa:f5:c6:27:57: - 2c:bb:1d:ae:e5:94:57:a3:73:9e:6b:44:00:35:4a:f3:c7:34: - 9c:a2:a7:aa:62:9f:1d:ef:a8:6c:be:07:ad:ef:ae:ee:93:0b: - ba:c3:59:4e:90:40:2d:00:5e:f0:0f:0a:de:18:2a:b3:97:31: - 63:84:ff:18:1c:b6:d8:7d:ee:33:ed:99:f0:f5:7f:88:58:b3: - 0d:90:db:eb:44:7e:06:37:61:d4:34:b9:f6:fd:3e:8d:07:e4: - b5:b0:ae:09:ce:98:e4:b0:1b:d5:7b:53:94:dd:8a:b2:20:d6: - b0:72:f8:b1:bc:76:df:16:86:39:7b:e4:a9:15:47:57:ae:ca: - 41:d6:3a:ba:15:d1:c0:b5:38:66:0b:0f:80:8b:a2:07:b4:fc: - 80:1f:a3:4c:1f:d2:65:97:c1:2c:ae:46:31:61:49:0d:d7:5f: - ac:d2:a6:05 + 45:4c:4f:04:eb:c4:00:00:8a:ff:a2:b8:93:29:ca:fc:90:5b: + a3:6f:4a:02:d4:64:b2:87:4b:70:4e:e5:0d:c5:0c:34:eb:fb: + ce:3b:ba:9e:68:9a:1f:97:94:19:ed:d6:29:fa:1a:4b:88:e4: + b2:55:69:50:b7:68:be:61:ed:15:58:f0:0e:5a:ee:1e:80:cf: + 31:78:82:d3:cb:fa:b2:c3:92:01:f1:e4:ec:44:61:0b:68:81: + 92:24:a3:05:9b:0e:7a:3e:b9:cc:7d:2f:eb:02:77:56:65:6a: + bc:f3:03:0a:6d:75:54:d8:70:6f:c6:fc:c1:27:a5:26:58:bc: + 9d:96:e6:84:fa:2c:cd:ed:bc:dc:20:b8:84:15:33:ce:8f:dd: + 6d:34:99:1a:22:f0:1c:8a:14:b4:04:0d:8d:fd:38:d6:e3:80: + 4c:7c:f6:7f:bc:44:a8:ec:9a:75:cf:8d:65:5c:d1:00:4c:4d: + d4:ed:7d:21:18:e1:08:e7:87:a0:78:94:74:2c:d9:f6:bf:de: + 1f:fc:56:a0:53:7d:43:4a:53:a7:7c:9f:14:58:2c:e5:a8:0e: + f2:3c:af:cb:c5:ad:ba:94:2b:59:23:f6:f3:40:8d:bc:b1:bc: + c2:4f:99:16:10:2b:47:30:5f:5b:12:02:b8:5b:1d:26:f1:7d: + 91:2b:65:53 -----BEGIN CERTIFICATE----- MIIE5jCCA86gAwIBAgIBYzANBgkqhkiG9w0BAQsFADCBlzELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoM B3dvbGZTU0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMRgwFgYDVQQDDA93b2xmU1NM -IHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMTgw -NDEzMTUyMzEwWhcNMjEwMTA3MTUyMzEwWjCBlzELMAkGA1UEBhMCVVMxEzARBgNV +IHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjAw +NTA3MDczOTA0WhcNMjMwMjAxMDczOTA0WjCBlzELMAkGA1UEBhMCVVMxEzARBgNV BAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoMB3dvbGZT U0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMRgwFgYDVQQDDA93b2xmU1NMIHJvb3Qg Q0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wggEiMA0GCSqGSIb3 @@ -269,11 +269,11 @@ A1UEBhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUx EDAOBgNVBAoMB3dvbGZTU0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMRgwFgYDVQQD DA93b2xmU1NMIHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5j b22CAWMwCwYDVR0PBAQDAgEGMDIGCCsGAQUFBwEBBCYwJDAiBggrBgEFBQcwAYYW -aHR0cDovLzEyNy4wLjAuMToyMjIyMDANBgkqhkiG9w0BAQsFAAOCAQEAaxCx+Mt3 -73L1+PxwbRjcNP7Xldj9hY7KS/O+H+sUCNwjNHiYOdefw1L2FD3p3lzC2LFLqExb -kUJm2n886QMgXggPdnm5IRCJt3NGRH5uKAwA5PQ+Zar1xidXLLsdruWUV6NznmtE -ADVK88c0nKKnqmKfHe+obL4Hre+u7pMLusNZTpBALQBe8A8K3hgqs5cxY4T/GBy2 -2H3uM+2Z8PV/iFizDZDb60R+Bjdh1DS59v0+jQfktbCuCc6Y5LAb1XtTlN2KsiDW -sHL4sbx23xaGOXvkqRVHV67KQdY6uhXRwLU4ZgsPgIuiB7T8gB+jTB/SZZfBLK5G -MWFJDddfrNKmBQ== +aHR0cDovLzEyNy4wLjAuMToyMjIyMDANBgkqhkiG9w0BAQsFAAOCAQEARUxPBOvE +AACK/6K4kynK/JBbo29KAtRksodLcE7lDcUMNOv7zju6nmiaH5eUGe3WKfoaS4jk +slVpULdovmHtFVjwDlruHoDPMXiC08v6ssOSAfHk7ERhC2iBkiSjBZsOej65zH0v +6wJ3VmVqvPMDCm11VNhwb8b8wSelJli8nZbmhPosze283CC4hBUzzo/dbTSZGiLw +HIoUtAQNjf041uOATHz2f7xEqOyadc+NZVzRAExN1O19IRjhCOeHoHiUdCzZ9r/e +H/xWoFN9Q0pTp3yfFFgs5agO8jyvy8WtupQrWSP280CNvLG8wk+ZFhArRzBfWxIC +uFsdJvF9kStlUw== -----END CERTIFICATE----- diff --git a/certs/renewcerts/wolfssl.cnf b/certs/renewcerts/wolfssl.cnf index 14476efbd..a6592a348 100644 --- a/certs/renewcerts/wolfssl.cnf +++ b/certs/renewcerts/wolfssl.cnf @@ -124,7 +124,7 @@ authorityKeyIdentifier=keyid,issuer subjectKeyIdentifier=hash authorityKeyIdentifier=keyid:always,issuer:always basicConstraints=CA:true -subjectAltName=DNS:example.com +subjectAltName=DNS:example.com, IP:127.0.0.1 #wolfssl extensions for intermediate CAs [wolfssl_opts_ICA] diff --git a/certs/server-cert.der b/certs/server-cert.der index 0dc446b099fed7776d49e860e4f2ed81711ed223..a13ba302f4e588984ca21b8eb70543c98efef5b5 100644 GIT binary patch delta 430 zcmV;f0a5;<3C#%zFoFchFoFZIkqELMGB7YTFgGwaGdVCcS{Ds6GcYnRF)%kXIWRO@ zFoBSh;Q}(V3ju`z2Z8}6FoFRhla&G?4Ace#RUIP)fy^+0$&XYHkKgw-f;BaR#qQxvh!MxS#2Sh=1p$4d7 zemXVX>FT-1k((HuHkU>3Dlk->g1&f{`T=tx0TLqqE^C2Ktvtz%1^u9s1l}!VuaA*) zz>45j2*9a}F*__`HC;~fK|jSyT<^0psZB}mW9DAiKo-CmMOV-VYymtqbq_yR_kCbS z?IRV_s4Rds*b<5MwxOi={F{BxKomS8LOihg<8n8%lfFwp%JZ3u_`RSSIjeqoC+j+| Y4atEseVt4gfMIGGU1h{95&3d|163U(1cAXYfxeT(0g)O@gOK6I}GhYAX<#Sl+8^d?E$GgPqI&Jmf7`YNnRo)4^!t(#C^Jm*U1U z4!(cH1Gxu^TeyU}#W_D5Sf^Fj@SEt;MY-dHF7CE*R=GOvKPT9C==(%SWhX~W`~Gsn ztOa`=%j;fcnyUijh+8|03&+fr z3mgd{(9M7O#9k*LpF diff --git a/certs/server-cert.pem b/certs/server-cert.pem index c44ba3e64..f4451b906 100644 --- a/certs/server-cert.pem +++ b/certs/server-cert.pem @@ -2,15 +2,15 @@ Certificate: Data: Version: 3 (0x2) Serial Number: 1 (0x1) - Signature Algorithm: sha256WithRSAEncryption - Issuer: C=US, ST=Montana, L=Bozeman, O=Sawtooth, OU=Consulting, CN=www.wolfssl.com/emailAddress=info@wolfssl.com + Signature Algorithm: sha256WithRSAEncryption + Issuer: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Apr 13 15:23:10 2018 GMT - Not After : Jan 7 15:23:10 2021 GMT - Subject: C=US, ST=Montana, L=Bozeman, O=wolfSSL, OU=Support, CN=www.wolfssl.com/emailAddress=info@wolfssl.com + Not Before: May 7 07:39:04 2020 GMT + Not After : Feb 1 07:39:04 2023 GMT + Subject: C = US, ST = Montana, L = Bozeman, O = wolfSSL, OU = Support, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption - Public-Key: (2048 bit) + RSA Public-Key: (2048 bit) Modulus: 00:c0:95:08:e1:57:41:f2:71:6d:b7:d2:45:41:27: 01:65:c6:45:ae:f2:bc:24:30:b8:95:ce:2f:4e:d6: @@ -37,32 +37,34 @@ Certificate: X509v3 Authority Key Identifier: keyid:27:8E:67:11:74:C3:26:1D:3F:ED:33:63:B3:A4:D8:1D:30:E5:E8:D5 DirName:/C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:86:FF:F5:8E:10:DE:B8:FB + serial:3F:32:13:52:92:C6:DF:4A:D5:42:05:6C:B0:B2:2E:46:C2:F8:B8:67 X509v3 Basic Constraints: CA:TRUE + X509v3 Subject Alternative Name: + DNS:example.com, IP Address:127.0.0.1 Signature Algorithm: sha256WithRSAEncryption - b4:54:60:ad:a0:03:32:de:02:7f:21:4a:81:c6:ed:cd:cd:d8: - 12:8a:c0:ba:82:5b:75:ad:54:e3:7c:80:6a:ac:2e:6c:20:4e: - be:4d:82:a7:47:13:5c:f4:c6:6a:2b:10:99:58:de:ab:6b:7c: - 22:05:c1:83:9d:cb:ff:3c:e4:2d:57:6a:a6:96:df:d3:c1:68: - e3:d2:c6:83:4b:97:e2:c6:32:0e:be:c4:03:b9:07:8a:5b:b8: - 84:ba:c5:39:3f:1c:58:a7:55:d7:f0:9b:e8:d2:45:b9:e3:83: - 2e:ee:b6:71:56:b9:3a:ee:3f:27:d8:77:e8:fb:44:48:65:27: - 47:4c:fb:fe:72:c3:ac:05:7b:1d:cb:eb:5e:65:9a:ab:02:e4: - 88:5b:3b:8b:0b:c7:cc:a9:a6:8b:e1:87:b0:19:1a:0c:28:58: - 6f:99:52:7e:ed:b0:3a:68:3b:8c:0a:08:74:72:ab:b9:09:c5: - ed:04:7e:6f:0b:1c:09:21:d0:cd:7f:f9:c4:5e:27:20:e4:85: - 73:52:05:d2:ba:f8:d5:8f:41:cc:23:2e:12:6d:bc:31:98:e7: - 63:a3:8e:26:cd:e8:2b:88:ee:e2:fe:3a:74:52:34:0e:fd:12: - e5:5e:69:50:20:31:34:e4:31:f1:e7:e4:5b:03:13:da:ac:41: - 6c:e7:cf:2b + 8e:62:6e:e4:bc:c5:e7:a9:ec:df:d0:e7:c8:ef:56:86:32:2d: + a1:cb:ab:b7:b1:eb:44:d9:e4:03:51:85:14:06:1f:ba:0c:64: + e2:c3:7c:40:1b:01:43:cb:09:65:5b:52:0c:91:85:38:ea:93: + e1:cd:3f:ca:6d:5c:e0:70:67:31:a2:c5:2c:41:c1:bc:d5:ea: + 07:44:41:74:a1:06:a8:61:7e:3a:35:dd:e9:ea:b9:c7:91:9b: + 18:9d:36:97:45:ef:2a:30:54:9c:82:be:78:97:fa:01:73:21: + 01:12:22:fe:2e:6b:81:4e:ad:3c:c9:8d:05:fd:a0:92:04:de: + 2d:64:af:8f:91:73:c0:8a:e0:56:08:c0:a9:8b:31:3b:2c:62: + 35:5d:4e:f2:41:3f:c5:4b:5c:ef:b3:33:a9:4d:49:ef:63:e6: + 5e:d8:40:16:c0:19:45:d0:07:6c:01:3c:35:75:0f:3f:57:f7: + 7d:60:46:ed:23:15:d3:a8:2c:80:36:d8:12:89:f6:b6:a1:a4: + f7:fc:9b:7d:cf:40:14:3c:22:42:3c:b0:fa:e3:72:37:b3:93: + be:4b:40:ca:f3:99:8a:f8:bd:a0:1a:39:ab:7e:79:27:eb:3a: + af:0d:c9:81:33:7d:9d:4c:18:80:61:6a:19:5d:65:c4:2c:11: + f9:7d:a3:9b -----BEGIN CERTIFICATE----- -MIIEnjCCA4agAwIBAgIBATANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx +MIIEyTCCA7GgAwIBAgIBATANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx EDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNh d3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cud29sZnNz -bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMTgwNDEz -MTUyMzEwWhcNMjEwMTA3MTUyMzEwWjCBkDELMAkGA1UEBhMCVVMxEDAOBgNVBAgM +bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjAwNTA3 +MDczOTA0WhcNMjMwMjAxMDczOTA0WjCBkDELMAkGA1UEBhMCVVMxEDAOBgNVBAgM B01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xEDAOBgNVBAoMB3dvbGZTU0wxEDAO BgNVBAsMB1N1cHBvcnQxGDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEfMB0GCSqG SIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEP @@ -71,32 +73,34 @@ f/5cnFF194rKB+c1L4/hvXvAL3yrZKgX/Mpde7rgIeVyLm8uhtiVc9qsG1O5Xz/X GQ0lT+FjY1GLC2Q/rUO4pRxcNLOuAKBjxfZ/C1loeHOmjBipAm2vwxkBLrgQ48bM QLRpo0YzaYduxLsXpvPo3a1zvHsvIbX9ZlEMvVSz4W1fHLwjc9EJA4kU0hC5ZMMq 0KGWSrzh1Bpbx6DAwWN4D0Q3MDKWgDIjlaF3uhPSl3PiXSXJag3DOWCktLBpQkIJ -6dgIvDMgs1gip6rrxOHmYYPF0pbf2dBPrdcCAwEAAaOB/DCB+TAdBgNVHQ4EFgQU -sxEyyZKYhOLJ+NA7bgNCyh8OjjwwgckGA1UdIwSBwTCBvoAUJ45nEXTDJh0/7TNj -s6TYHTDl6NWhgZqkgZcwgZQxCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5h -MRAwDgYDVQQHDAdCb3plbWFuMREwDwYDVQQKDAhTYXd0b290aDETMBEGA1UECwwK -Q29uc3VsdGluZzEYMBYGA1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcN -AQkBFhBpbmZvQHdvbGZzc2wuY29tggkAhv/1jhDeuPswDAYDVR0TBAUwAwEB/zAN -BgkqhkiG9w0BAQsFAAOCAQEAtFRgraADMt4CfyFKgcbtzc3YEorAuoJbda1U43yA -aqwubCBOvk2Cp0cTXPTGaisQmVjeq2t8IgXBg53L/zzkLVdqppbf08Fo49LGg0uX -4sYyDr7EA7kHilu4hLrFOT8cWKdV1/Cb6NJFueODLu62cVa5Ou4/J9h36PtESGUn -R0z7/nLDrAV7HcvrXmWaqwLkiFs7iwvHzKmmi+GHsBkaDChYb5lSfu2wOmg7jAoI -dHKruQnF7QR+bwscCSHQzX/5xF4nIOSFc1IF0rr41Y9BzCMuEm28MZjnY6OOJs3o -K4ju4v46dFI0Dv0S5V5pUCAxNOQx8efkWwMT2qxBbOfPKw== +6dgIvDMgs1gip6rrxOHmYYPF0pbf2dBPrdcCAwEAAaOCASYwggEiMB0GA1UdDgQW +BBSzETLJkpiE4sn40DtuA0LKHw6OPDCB1AYDVR0jBIHMMIHJgBQnjmcRdMMmHT/t +M2OzpNgdMOXo1aGBmqSBlzCBlDELMAkGA1UEBhMCVVMxEDAOBgNVBAgMB01vbnRh +bmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNhd3Rvb3RoMRMwEQYDVQQL +DApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG +9w0BCQEWEGluZm9Ad29sZnNzbC5jb22CFD8yE1KSxt9K1UIFbLCyLkbC+LhnMAwG +A1UdEwQFMAMBAf8wHAYDVR0RBBUwE4ILZXhhbXBsZS5jb22HBH8AAAEwDQYJKoZI +hvcNAQELBQADggEBAI5ibuS8xeep7N/Q58jvVoYyLaHLq7ex60TZ5ANRhRQGH7oM +ZOLDfEAbAUPLCWVbUgyRhTjqk+HNP8ptXOBwZzGixSxBwbzV6gdEQXShBqhhfjo1 +3enquceRmxidNpdF7yowVJyCvniX+gFzIQESIv4ua4FOrTzJjQX9oJIE3i1kr4+R +c8CK4FYIwKmLMTssYjVdTvJBP8VLXO+zM6lNSe9j5l7YQBbAGUXQB2wBPDV1Dz9X +931gRu0jFdOoLIA22BKJ9rahpPf8m33PQBQ8IkI8sPrjcjezk75LQMrzmYr4vaAa +Oat+eSfrOq8NyYEzfZ1MGIBhahldZcQsEfl9o5s= -----END CERTIFICATE----- Certificate: Data: Version: 3 (0x2) - Serial Number: 9727763710660753659 (0x86fff58e10deb8fb) - Signature Algorithm: sha256WithRSAEncryption - Issuer: C=US, ST=Montana, L=Bozeman, O=Sawtooth, OU=Consulting, CN=www.wolfssl.com/emailAddress=info@wolfssl.com + Serial Number: + 3f:32:13:52:92:c6:df:4a:d5:42:05:6c:b0:b2:2e:46:c2:f8:b8:67 + Signature Algorithm: sha256WithRSAEncryption + Issuer: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Apr 13 15:23:09 2018 GMT - Not After : Jan 7 15:23:09 2021 GMT - Subject: C=US, ST=Montana, L=Bozeman, O=Sawtooth, OU=Consulting, CN=www.wolfssl.com/emailAddress=info@wolfssl.com + Not Before: May 7 07:39:04 2020 GMT + Not After : Feb 1 07:39:04 2023 GMT + Subject: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption - Public-Key: (2048 bit) + RSA Public-Key: (2048 bit) Modulus: 00:bf:0c:ca:2d:14:b2:1e:84:42:5b:cd:38:1f:4a: f2:4d:75:10:f1:b6:35:9f:df:ca:7d:03:98:d3:ac: @@ -123,50 +127,54 @@ Certificate: X509v3 Authority Key Identifier: keyid:27:8E:67:11:74:C3:26:1D:3F:ED:33:63:B3:A4:D8:1D:30:E5:E8:D5 DirName:/C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:86:FF:F5:8E:10:DE:B8:FB + serial:3F:32:13:52:92:C6:DF:4A:D5:42:05:6C:B0:B2:2E:46:C2:F8:B8:67 X509v3 Basic Constraints: CA:TRUE + X509v3 Subject Alternative Name: + DNS:example.com, IP Address:127.0.0.1 Signature Algorithm: sha256WithRSAEncryption - 9e:28:88:72:00:ca:e6:e7:97:ca:c1:f1:1f:9e:12:b2:b8:c7: - 51:ea:28:e1:36:b5:2d:e6:2f:08:23:cb:a9:4a:87:25:c6:5d: - 89:45:ea:f5:00:98:ac:76:fb:1b:af:f0:ce:64:9e:da:08:bf: - b6:eb:b4:b5:0c:a0:e7:f6:47:59:1c:61:cf:2e:0e:58:a4:82: - ac:0f:3f:ec:c4:ae:80:f7:b0:8a:1e:85:41:e8:ff:fe:fe:4f: - 1a:24:d5:49:fa:fb:fe:5e:e5:d3:91:0e:4f:4e:0c:21:51:71: - 83:04:6b:62:7b:4f:59:76:48:81:1e:b4:f7:04:47:8a:91:57: - a3:11:a9:f2:20:b4:78:33:62:3d:b0:5e:0d:f9:86:38:82:da: - a1:98:8d:19:06:87:21:39:b7:02:f7:da:7d:58:ba:52:15:d8: - 3b:c9:7b:58:34:a0:c7:e2:7c:a9:83:13:e1:b6:ec:01:bf:52: - 33:0b:c4:fe:43:d3:c6:a4:8e:2f:87:7f:7a:44:ea:ca:53:6c: - 85:ed:65:76:73:31:03:4e:ea:bd:35:54:13:f3:64:87:6b:df: - 34:dd:34:a1:88:3b:db:4d:af:1b:64:90:92:71:30:8e:c8:cc: - e5:60:24:af:31:16:39:33:91:50:f9:ab:68:42:74:7a:35:d9: - dd:c8:c4:52 + b0:7b:84:c9:1f:41:97:b8:03:14:0f:59:5b:6f:2c:15:45:1b: + c4:02:6f:d9:92:e7:1a:dc:cc:db:0e:56:3d:59:db:71:f2:f1: + 08:9a:06:eb:ab:c5:25:9f:df:6a:6d:6e:6b:d0:a8:90:39:d9: + 48:6f:61:7f:bd:cd:ed:60:8b:e3:6c:23:52:b7:86:bc:2a:ff: + 90:f7:6d:5c:47:69:f3:8d:ee:9e:76:62:5c:7b:b3:22:e5:4e: + ce:26:f6:3f:2f:b7:00:8c:20:d2:71:f6:31:4e:e1:4d:03:b9: + f3:07:dd:04:a7:a6:9a:9c:b0:2e:99:0a:a7:fc:59:97:63:a5: + 7c:77:dd:77:61:a6:86:6a:b2:32:33:06:b4:bc:ca:ae:c2:c7: + 8e:dc:85:dc:ac:c2:e7:2b:fb:b9:50:6b:d4:5b:0f:6d:93:a9: + 51:d2:dd:75:5e:88:ae:bc:ca:40:c7:2b:e9:5e:5b:a7:cf:e2: + e2:5d:0b:c9:69:20:d3:41:5a:7a:b9:14:17:f1:85:d7:b9:17: + b0:ad:ca:17:6c:38:8d:73:8d:74:25:01:70:c1:34:cf:62:02: + 48:9a:56:d8:44:a4:0d:e7:32:a0:b0:4b:c5:a4:9b:95:66:00: + fa:7e:97:0a:6b:08:ec:a0:9f:3f:90:99:57:39:63:81:76:f7: + ed:ea:01:1d -----BEGIN CERTIFICATE----- -MIIEqjCCA5KgAwIBAgIJAIb/9Y4Q3rj7MA0GCSqGSIb3DQEBCwUAMIGUMQswCQYD +MIIE4DCCA8igAwIBAgIUPzITUpLG30rVQgVssLIuRsL4uGcwDQYJKoZIhvcNAQEL +BQAwgZQxCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdC +b3plbWFuMREwDwYDVQQKDAhTYXd0b290aDETMBEGA1UECwwKQ29uc3VsdGluZzEY +MBYGA1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdv +bGZzc2wuY29tMB4XDTIwMDUwNzA3MzkwNFoXDTIzMDIwMTA3MzkwNFowgZQxCzAJ +BgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMREw +DwYDVQQKDAhTYXd0b290aDETMBEGA1UECwwKQ29uc3VsdGluZzEYMBYGA1UEAwwP +d3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29t +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvwzKLRSyHoRCW804H0ry +TXUQ8bY1n9/KfQOY06zeA2buKvHYsH1uB1QLEJghTYDLEiDnzE/eRX3Jcncy6sqQ +u2lSEAMvqPOVxfGLYlYb72dvpBBBla0Km+OlwLDScHZQMFuo6AgsfO2nonqNOCkc +rMft8nyVsJWCfUlcOM13Je+9gHVTlDw9ymNbnxW10x0TLxnRPNt2Osy4fcnlwtfa +QG/YIdxzG0ItU5z+Gvx9q3o2P5jehHwFZ85qFDiHqfGMtWjLaH9xICv1oGP1Vi+j +JtK3b7FaF9c4mQj+k1hv/sMTSQgWC6dNZwBSMWcjTpjtUUUduQTZC+zYKLNLve02 +eQIDAQABo4IBJjCCASIwHQYDVR0OBBYEFCeOZxF0wyYdP+0zY7Ok2B0w5ejVMIHU +BgNVHSMEgcwwgcmAFCeOZxF0wyYdP+0zY7Ok2B0w5ejVoYGapIGXMIGUMQswCQYD VQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjERMA8G A1UECgwIU2F3dG9vdGgxEzARBgNVBAsMCkNvbnN1bHRpbmcxGDAWBgNVBAMMD3d3 -dy53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbTAe -Fw0xODA0MTMxNTIzMDlaFw0yMTAxMDcxNTIzMDlaMIGUMQswCQYDVQQGEwJVUzEQ -MA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjERMA8GA1UECgwIU2F3 -dG9vdGgxEzARBgNVBAsMCkNvbnN1bHRpbmcxGDAWBgNVBAMMD3d3dy53b2xmc3Ns -LmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbTCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAL8Myi0Ush6EQlvNOB9K8k11EPG2NZ/fyn0D -mNOs3gNm7irx2LB9bgdUCxCYIU2AyxIg58xP3kV9yXJ3MurKkLtpUhADL6jzlcXx -i2JWG+9nb6QQQZWtCpvjpcCw0nB2UDBbqOgILHztp6J6jTgpHKzH7fJ8lbCVgn1J -XDjNdyXvvYB1U5Q8PcpjW58VtdMdEy8Z0TzbdjrMuH3J5cLX2kBv2CHccxtCLVOc -/hr8fat6Nj+Y3oR8BWfOahQ4h6nxjLVoy2h/cSAr9aBj9VYvoybSt2+xWhfXOJkI -/pNYb/7DE0kIFgunTWcAUjFnI06Y7VFFHbkE2Qvs2CizS73tNnkCAwEAAaOB/DCB -+TAdBgNVHQ4EFgQUJ45nEXTDJh0/7TNjs6TYHTDl6NUwgckGA1UdIwSBwTCBvoAU -J45nEXTDJh0/7TNjs6TYHTDl6NWhgZqkgZcwgZQxCzAJBgNVBAYTAlVTMRAwDgYD -VQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMREwDwYDVQQKDAhTYXd0b290 -aDETMBEGA1UECwwKQ29uc3VsdGluZzEYMBYGA1UEAwwPd3d3LndvbGZzc2wuY29t -MR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tggkAhv/1jhDeuPswDAYD -VR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAniiIcgDK5ueXysHxH54SsrjH -Ueoo4Ta1LeYvCCPLqUqHJcZdiUXq9QCYrHb7G6/wzmSe2gi/tuu0tQyg5/ZHWRxh -zy4OWKSCrA8/7MSugPewih6FQej//v5PGiTVSfr7/l7l05EOT04MIVFxgwRrYntP -WXZIgR609wRHipFXoxGp8iC0eDNiPbBeDfmGOILaoZiNGQaHITm3AvfafVi6UhXY -O8l7WDSgx+J8qYMT4bbsAb9SMwvE/kPTxqSOL4d/ekTqylNshe1ldnMxA07qvTVU -E/Nkh2vfNN00oYg7202vG2SQknEwjsjM5WAkrzEWOTORUPmraEJ0ejXZ3cjEUg== +dy53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIU +PzITUpLG30rVQgVssLIuRsL4uGcwDAYDVR0TBAUwAwEB/zAcBgNVHREEFTATggtl +eGFtcGxlLmNvbYcEfwAAATANBgkqhkiG9w0BAQsFAAOCAQEAsHuEyR9Bl7gDFA9Z +W28sFUUbxAJv2ZLnGtzM2w5WPVnbcfLxCJoG66vFJZ/fam1ua9CokDnZSG9hf73N +7WCL42wjUreGvCr/kPdtXEdp843unnZiXHuzIuVOzib2Py+3AIwg0nH2MU7hTQO5 +8wfdBKemmpywLpkKp/xZl2OlfHfdd2GmhmqyMjMGtLzKrsLHjtyF3KzC5yv7uVBr +1FsPbZOpUdLddV6IrrzKQMcr6V5bp8/i4l0LyWkg00FaerkUF/GF17kXsK3KF2w4 +jXONdCUBcME0z2ICSJpW2ESkDecyoLBLxaSblWYA+n6XCmsI7KCfP5CZVzljgXb3 +7eoBHQ== -----END CERTIFICATE----- diff --git a/certs/server-ecc-comp.der b/certs/server-ecc-comp.der index b53fe8c8123c90a67fe1bb51756f22ca4ca42cd3..da32ddbd6439801669f4b9afca02ca4bfe6227e7 100644 GIT binary patch delta 255 zcmZ3^c9%`rpouxspo!_<0%j&gCMJ>cWes~Hf8Ki&k;-m#_vOp#g$LQbOqAFxZDe3z zYG7_)Zft2_5+%-SWNct$UvICth2@e?MCfJ&BpIlGQU hXP@NDlVSTps-FgFby#*ReEF%xaD&4nt&r&8HvkA4USR+L delta 217 zcmcc1wwz7Hpov-8po!_!0%j&gCMHgXhKiHh*`kg%8*s64XtjBqvt?msnykpQSl&QR zoY&C8z{Jql(A3D-&>%{j*T~So(7+tRo%rz)E2lvdBkSZFjEX#0*_cCRm023k8Z@4o z%*u2i7s+5Akeo0Js{u13<9}ppnB5r+T$mILT`u@tKeA=o;%BOVe_hj9kseqyVXEQJ xvjY1CpS;=b6wRdIdfSytC8AI7*(;u$Jw^Up(w}vwzdR)QbGlW+U5?8^b^tXtM=1aR diff --git a/certs/server-ecc-comp.pem b/certs/server-ecc-comp.pem index 1f40a07a8..a9eec2b04 100644 --- a/certs/server-ecc-comp.pem +++ b/certs/server-ecc-comp.pem @@ -1,17 +1,18 @@ Certificate: Data: Version: 3 (0x2) - Serial Number: 9257370821982864771 (0x8078c9b7065ac583) - Signature Algorithm: ecdsa-with-SHA256 - Issuer: C=US, ST=Montana, L=Bozeman, O=Elliptic - comp, OU=Server ECC-comp, CN=www.wolfssl.com/emailAddress=info@wolfssl.com + Serial Number: + 77:a6:80:bd:59:f9:de:ec:58:65:07:32:dd:e9:e9:7b:a1:c1:06:f4 + Signature Algorithm: ecdsa-with-SHA256 + Issuer: C = US, ST = Montana, L = Bozeman, O = Elliptic - comp, OU = Server ECC-comp, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Apr 13 15:23:10 2018 GMT - Not After : Jan 7 15:23:10 2021 GMT - Subject: C=US, ST=Montana, L=Bozeman, O=Elliptic - comp, OU=Server ECC-comp, CN=www.wolfssl.com/emailAddress=info@wolfssl.com + Not Before: May 7 07:39:04 2020 GMT + Not After : Feb 1 07:39:04 2023 GMT + Subject: C = US, ST = Montana, L = Bozeman, O = Elliptic - comp, OU = Server ECC-comp, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: id-ecPublicKey Public-Key: (256 bit) - pub: + pub: 02:bb:33:ac:4c:27:50:4a:c6:4a:a5:04:c3:3c:de: 9f:36:db:72:2d:ce:94:ea:2b:fa:cb:20:09:39:2c: 16:e8:61 @@ -23,31 +24,34 @@ Certificate: X509v3 Authority Key Identifier: keyid:8C:38:3A:6B:B8:24:B7:DF:6E:F4:59:AC:56:4E:AA:E2:58:A6:5A:18 DirName:/C=US/ST=Montana/L=Bozeman/O=Elliptic - comp/OU=Server ECC-comp/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:80:78:C9:B7:06:5A:C5:83 + serial:77:A6:80:BD:59:F9:DE:EC:58:65:07:32:DD:E9:E9:7B:A1:C1:06:F4 X509v3 Basic Constraints: CA:TRUE + X509v3 Subject Alternative Name: + DNS:example.com, IP Address:127.0.0.1 Signature Algorithm: ecdsa-with-SHA256 - 30:44:02:20:31:44:d0:4e:d7:c4:b4:96:a3:e6:25:fd:fa:d6: - 28:a8:67:51:72:90:95:31:f9:cd:10:bf:11:e4:ec:b7:42:5b: - 02:20:45:db:45:0a:24:58:8e:2e:e6:ea:0c:6c:bc:72:4f:0a: - 1b:f3:2d:97:e9:c2:19:f9:97:3a:60:dd:08:d3:52:3e + 30:46:02:21:00:f2:c6:cb:05:2a:fc:73:ce:9c:f1:59:27:dc: + 52:44:19:77:ad:97:7b:73:39:25:e7:91:9d:99:b4:17:c8:34: + a2:02:21:00:a4:f4:cd:ae:04:2c:be:e9:c9:56:be:54:7b:e5: + 52:2a:88:39:88:a1:e9:f2:84:31:b0:40:92:2a:54:5b:53:ec -----BEGIN CERTIFICATE----- -MIIDIzCCAsqgAwIBAgIJAIB4ybcGWsWDMAoGCCqGSM49BAMCMIGgMQswCQYDVQQG -EwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjEYMBYGA1UE -CgwPRWxsaXB0aWMgLSBjb21wMRgwFgYDVQQLDA9TZXJ2ZXIgRUNDLWNvbXAxGDAW -BgNVBAMMD3d3dy53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xm -c3NsLmNvbTAeFw0xODA0MTMxNTIzMTBaFw0yMTAxMDcxNTIzMTBaMIGgMQswCQYD -VQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjEYMBYG -A1UECgwPRWxsaXB0aWMgLSBjb21wMRgwFgYDVQQLDA9TZXJ2ZXIgRUNDLWNvbXAx -GDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3 -b2xmc3NsLmNvbTA5MBMGByqGSM49AgEGCCqGSM49AwEHAyIAArszrEwnUErGSqUE -wzzenzbbci3OlOor+ssgCTksFuhho4IBCTCCAQUwHQYDVR0OBBYEFIw4Omu4JLff -bvRZrFZOquJYploYMIHVBgNVHSMEgc0wgcqAFIw4Omu4JLffbvRZrFZOquJYploY -oYGmpIGjMIGgMQswCQYDVQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UE -BwwHQm96ZW1hbjEYMBYGA1UECgwPRWxsaXB0aWMgLSBjb21wMRgwFgYDVQQLDA9T -ZXJ2ZXIgRUNDLWNvbXAxGDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEfMB0GCSqG -SIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIJAIB4ybcGWsWDMAwGA1UdEwQFMAMB -Af8wCgYIKoZIzj0EAwIDRwAwRAIgMUTQTtfEtJaj5iX9+tYoqGdRcpCVMfnNEL8R -5Oy3QlsCIEXbRQokWI4u5uoMbLxyTwob8y2X6cIZ+Zc6YN0I01I+ +MIIDWTCCAv6gAwIBAgIUd6aAvVn53uxYZQcy3enpe6HBBvQwCgYIKoZIzj0EAwIw +gaAxCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3pl +bWFuMRgwFgYDVQQKDA9FbGxpcHRpYyAtIGNvbXAxGDAWBgNVBAsMD1NlcnZlciBF +Q0MtY29tcDEYMBYGA1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkB +FhBpbmZvQHdvbGZzc2wuY29tMB4XDTIwMDUwNzA3MzkwNFoXDTIzMDIwMTA3Mzkw +NFowgaAxCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdC +b3plbWFuMRgwFgYDVQQKDA9FbGxpcHRpYyAtIGNvbXAxGDAWBgNVBAsMD1NlcnZl +ciBFQ0MtY29tcDEYMBYGA1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcN +AQkBFhBpbmZvQHdvbGZzc2wuY29tMDkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDIgAC +uzOsTCdQSsZKpQTDPN6fNttyLc6U6iv6yyAJOSwW6GGjggEyMIIBLjAdBgNVHQ4E +FgQUjDg6a7gkt99u9FmsVk6q4limWhgwgeAGA1UdIwSB2DCB1YAUjDg6a7gkt99u +9FmsVk6q4limWhihgaakgaMwgaAxCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250 +YW5hMRAwDgYDVQQHDAdCb3plbWFuMRgwFgYDVQQKDA9FbGxpcHRpYyAtIGNvbXAx +GDAWBgNVBAsMD1NlcnZlciBFQ0MtY29tcDEYMBYGA1UEAwwPd3d3LndvbGZzc2wu +Y29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tghR3poC9Wfne7Fhl +BzLd6el7ocEG9DAMBgNVHRMEBTADAQH/MBwGA1UdEQQVMBOCC2V4YW1wbGUuY29t +hwR/AAABMAoGCCqGSM49BAMCA0kAMEYCIQDyxssFKvxzzpzxWSfcUkQZd62Xe3M5 +JeeRnZm0F8g0ogIhAKT0za4ELL7pyVa+VHvlUiqIOYih6fKEMbBAkipUW1Ps -----END CERTIFICATE----- diff --git a/certs/server-ecc-rsa.der b/certs/server-ecc-rsa.der index 82aba2a5d3bd9dd5cb296d77439c0c477fbfbcb3..ad79141063ba4a21293a083f4f3978aaa1133d55 100644 GIT binary patch delta 405 zcmV;G0c!r_2agB{FoFaNFoFW}kqELIGB7YTFgGwaGdVCcS{Ds6GcYnRF)%kXIWRPl z)%^#80VXhl0V0#v0U-?31_M+_;-*G+FXXty>6mXB2np)<_mU?QHlvBD#;kpJHa;;Yyb+-NdwsJk=E(Q zvC)fFp`^wAM)CL=9+LGL>g+t5 zldf4HiMGT!oy>{#;nisX&SDD>GC@>Wtkobvwbo^c-Px&QV4AVEJF8-l7K@chxdP>uOEIfQ delta 377 zcmV-<0fzpM2;>I{FoFZ%FoFWekqELIF*q&LNQUK^;X)Z6ov@fDg5M;0ip-~7OkyE01RUkoS zHGe(}I007zj3wu*Pm5Xb?T$(n3o`q9ivsGM;j6?4%-Rp57Tb0 zpQvCzS(0%LYh$NDW836cj0$@4Y|Npu$}AEFVhti;eX|aKaJnb4(={~j=j8LR4u4*% zXutzfAk4`4pM}YQVe$^LLuA|?gha>4j69#O@W^Wu-L ZT$X+F)nS+lDsdlEZcL-T%4KL6_Q=cS4Z8|N-*oHbEq7IzaT!}KkC z#VUTdf0``Lq!z}-#-Y{ban2TK9J42bfg6(|!@eC6AD)OZ%HJ;tDfY^7kS|}c<#mwU z{;#|njZbAADccEDGM(d|j>bXP!fiSs?K6_gRw$ZGSn++H{U4?c&o6Ttsy_h$$^lkX diff --git a/certs/server-ecc.pem b/certs/server-ecc.pem index b68297414..f860726f8 100644 --- a/certs/server-ecc.pem +++ b/certs/server-ecc.pem @@ -1,17 +1,17 @@ Certificate: Data: Version: 3 (0x2) - Serial Number: 4096 (0x1000) - Signature Algorithm: ecdsa-with-SHA256 - Issuer: C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Development, CN=www.wolfssl.com/emailAddress=info@wolfssl.com + Serial Number: 3 (0x3) + Signature Algorithm: ecdsa-with-SHA256 + Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Development, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Oct 20 18:19:06 2017 GMT - Not After : Oct 18 18:19:06 2027 GMT - Subject: C=US, ST=Washington, L=Seattle, O=Eliptic, OU=ECC, CN=www.wolfssl.com/emailAddress=info@wolfssl.com + Not Before: May 7 07:39:04 2020 GMT + Not After : Feb 1 07:39:04 2023 GMT + Subject: C = US, ST = Washington, L = Seattle, O = Eliptic, OU = ECC, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: id-ecPublicKey Public-Key: (256 bit) - pub: + pub: 04:bb:33:ac:4c:27:50:4a:c6:4a:a5:04:c3:3c:de: 9f:36:db:72:2d:ce:94:ea:2b:fa:cb:20:09:39:2c: 16:e8:61:02:e9:af:4d:d3:02:93:9a:31:5b:97:92: @@ -20,43 +20,38 @@ Certificate: ASN1 OID: prime256v1 NIST CURVE: P-256 X509v3 extensions: - X509v3 Basic Constraints: - CA:FALSE - Netscape Cert Type: - SSL Server X509v3 Subject Key Identifier: 5D:5D:26:EF:AC:7E:36:F9:9B:76:15:2B:4A:25:02:23:EF:B2:89:30 X509v3 Authority Key Identifier: keyid:56:8E:9A:C3:F0:42:DE:18:B9:45:55:6E:F9:93:CF:EA:C3:F3:A5:21 - DirName:/C=US/ST=Washington/L=Seattle/O=wolfSSL/OU=Development/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:97:B4:BD:16:78:F8:47:F2 + X509v3 Basic Constraints: critical + CA:FALSE X509v3 Key Usage: critical Digital Signature, Key Encipherment, Key Agreement X509v3 Extended Key Usage: TLS Web Server Authentication + Netscape Cert Type: + SSL Server Signature Algorithm: ecdsa-with-SHA256 - 30:46:02:21:00:be:b8:58:f0:e4:15:01:1f:df:70:54:73:4a: - 6c:40:1f:77:a8:b4:eb:52:1e:bf:f5:0d:b1:33:ca:6a:c4:76: - b9:02:21:00:97:08:de:2c:28:c1:45:71:b6:2c:54:87:98:63: - 76:a8:21:34:90:a8:f7:9e:3f:fc:02:b0:e7:d3:09:31:27:e4 + 30:45:02:21:00:99:a5:f0:5e:85:e8:0f:b3:f8:a1:df:fa:e3: + bf:78:35:1d:77:f1:e3:6a:b2:8b:c3:28:52:87:9b:5e:32:4b: + 72:02:20:2d:77:11:5f:8a:0c:15:21:a9:9e:5f:c5:a9:a6:6b: + d9:ea:c3:1c:90:8c:19:db:eb:a7:e1:64:0e:b2:5e:10:92 -----BEGIN CERTIFICATE----- -MIIDUDCCAvWgAwIBAgICEAAwCgYIKoZIzj0EAwIwgZcxCzAJBgNVBAYTAlVTMRMw -EQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3 -b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEYMBYGA1UEAwwPd3d3LndvbGZz -c2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMB4XDTE3MTAy -MDE4MTkwNloXDTI3MTAxODE4MTkwNlowgY8xCzAJBgNVBAYTAlVTMRMwEQYDVQQI -DApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAdFbGlwdGlj -MQwwCgYDVQQLDANFQ0MxGDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEfMB0GCSqG -SIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEH -A0IABLszrEwnUErGSqUEwzzenzbbci3OlOor+ssgCTksFuhhAumvTdMCk5oxW5eS -IX/wzxjakRECNIboIFgzC4A0idijggE1MIIBMTAJBgNVHRMEAjAAMBEGCWCGSAGG -+EIBAQQEAwIGQDAdBgNVHQ4EFgQUXV0m76x+NvmbdhUrSiUCI++yiTAwgcwGA1Ud -IwSBxDCBwYAUVo6aw/BC3hi5RVVu+ZPP6sPzpSGhgZ2kgZowgZcxCzAJBgNVBAYT -AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYD -VQQKDAd3b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEYMBYGA1UEAwwPd3d3 -LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tggkA -l7S9Fnj4R/IwDgYDVR0PAQH/BAQDAgOoMBMGA1UdJQQMMAoGCCsGAQUFBwMBMAoG -CCqGSM49BAMCA0kAMEYCIQC+uFjw5BUBH99wVHNKbEAfd6i061Iev/UNsTPKasR2 -uQIhAJcI3iwowUVxtixUh5hjdqghNJCo954//AKw59MJMSfk +MIICoTCCAkegAwIBAgIBAzAKBggqhkjOPQQDAjCBlzELMAkGA1UEBhMCVVMxEzAR +BgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoMB3dv +bGZTU0wxFDASBgNVBAsMC0RldmVsb3BtZW50MRgwFgYDVQQDDA93d3cud29sZnNz +bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjAwNTA3 +MDczOTA0WhcNMjMwMjAxMDczOTA0WjCBjzELMAkGA1UEBhMCVVMxEzARBgNVBAgM +Cldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoMB0VsaXB0aWMx +DDAKBgNVBAsMA0VDQzEYMBYGA1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZI +hvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcD +QgAEuzOsTCdQSsZKpQTDPN6fNttyLc6U6iv6yyAJOSwW6GEC6a9N0wKTmjFbl5Ih +f/DPGNqREQI0huggWDMLgDSJ2KOBiTCBhjAdBgNVHQ4EFgQUXV0m76x+NvmbdhUr +SiUCI++yiTAwHwYDVR0jBBgwFoAUVo6aw/BC3hi5RVVu+ZPP6sPzpSEwDAYDVR0T +AQH/BAIwADAOBgNVHQ8BAf8EBAMCA6gwEwYDVR0lBAwwCgYIKwYBBQUHAwEwEQYJ +YIZIAYb4QgEBBAQDAgZAMAoGCCqGSM49BAMCA0gAMEUCIQCZpfBehegPs/ih3/rj +v3g1HXfx42qyi8MoUoebXjJLcgIgLXcRX4oMFSGpnl/FqaZr2erDHJCMGdvrp+Fk +DrJeEJI= -----END CERTIFICATE----- diff --git a/certs/server-revoked-cert.pem b/certs/server-revoked-cert.pem index 09dbb1dd0..baf1b5992 100644 --- a/certs/server-revoked-cert.pem +++ b/certs/server-revoked-cert.pem @@ -2,15 +2,15 @@ Certificate: Data: Version: 3 (0x2) Serial Number: 2 (0x2) - Signature Algorithm: sha256WithRSAEncryption - Issuer: C=US, ST=Montana, L=Bozeman, O=Sawtooth, OU=Consulting, CN=www.wolfssl.com/emailAddress=info@wolfssl.com + Signature Algorithm: sha256WithRSAEncryption + Issuer: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Apr 13 15:23:10 2018 GMT - Not After : Jan 7 15:23:10 2021 GMT - Subject: C=US, ST=Montana, L=Bozeman, O=wolfSSL_revoked, OU=Support_revoked, CN=www.wolfssl.com/emailAddress=info@wolfssl.com + Not Before: May 7 07:39:04 2020 GMT + Not After : Feb 1 07:39:04 2023 GMT + Subject: C = US, ST = Montana, L = Bozeman, O = wolfSSL_revoked, OU = Support_revoked, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption - Public-Key: (2048 bit) + RSA Public-Key: (2048 bit) Modulus: 00:b0:14:16:3a:43:dd:e1:50:45:4f:cf:80:b3:dd: 66:96:c7:e9:f4:dc:de:b6:6b:24:1b:76:48:ac:c6: @@ -37,32 +37,34 @@ Certificate: X509v3 Authority Key Identifier: keyid:27:8E:67:11:74:C3:26:1D:3F:ED:33:63:B3:A4:D8:1D:30:E5:E8:D5 DirName:/C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:86:FF:F5:8E:10:DE:B8:FB + serial:3F:32:13:52:92:C6:DF:4A:D5:42:05:6C:B0:B2:2E:46:C2:F8:B8:67 X509v3 Basic Constraints: CA:TRUE + X509v3 Subject Alternative Name: + DNS:example.com, IP Address:127.0.0.1 Signature Algorithm: sha256WithRSAEncryption - 41:29:ba:25:3f:17:70:85:1e:5c:e2:2c:8c:8d:16:1b:d5:1f: - d6:05:e8:e8:8b:43:a0:5b:62:e8:19:7d:d1:1c:60:26:2f:3a: - 6f:7a:3f:ec:ad:96:c6:9a:cc:53:3f:12:d9:12:14:ee:2a:f0: - a5:2c:31:c7:ae:5c:12:9a:80:3f:ef:de:f3:be:bc:9d:0e:d6: - c6:8b:e2:8c:58:4e:15:78:4f:16:2e:20:ef:f8:c9:57:6e:a3: - d2:d0:03:32:47:72:84:59:af:5a:46:dd:65:54:d4:9b:7c:42: - 5d:9d:86:eb:21:e8:fc:0f:f7:37:ae:95:43:75:6d:f2:12:f3: - a5:e5:10:25:7c:63:ee:03:ce:8f:48:c8:ab:a5:74:2d:1c:dd: - d4:28:9a:eb:c6:94:fa:ed:57:31:aa:7e:d9:44:40:69:9f:44: - f6:b3:9f:0e:d3:d8:58:66:d4:fc:c0:83:67:a7:85:ae:03:f7: - 83:b4:45:3b:0f:a9:3d:4f:f8:07:31:b0:8a:50:6d:80:f4:36: - be:86:df:ae:da:7c:f5:bc:e2:fc:d3:ed:da:18:7a:f4:f0:ac: - 84:1f:6a:73:00:41:42:71:d4:19:3f:d7:d3:29:9e:b1:94:fd: - 49:d8:a5:e6:1d:a9:40:b5:1d:c4:28:42:a9:24:b7:54:c2:94: - 5d:16:05:c0 + 2a:87:0a:b1:f7:e4:eb:1a:f1:97:2a:61:24:34:d4:98:04:2c: + d0:82:4f:d8:95:73:a9:85:34:2f:c0:a7:47:1f:88:ae:c5:22: + 98:55:9e:c7:24:09:60:b0:0c:f6:2a:12:99:cd:f9:eb:45:1b: + b5:8a:c0:83:ff:8b:57:84:80:b7:ad:25:44:cf:6c:6e:64:19: + ad:f8:56:56:db:72:62:7d:6f:1a:98:2e:d4:62:cf:56:72:91: + b3:9f:49:1f:31:19:69:9f:46:a5:8f:bd:92:3e:75:b0:09:9e: + aa:ad:57:fd:d9:55:55:36:d9:9d:a6:2e:eb:5c:8e:3d:a0:fb: + 84:6b:84:71:bd:3d:22:09:d1:6c:22:ee:33:91:eb:55:aa:b8: + 69:9b:6b:74:f5:73:99:9f:75:62:00:71:8a:48:18:22:19:82: + cf:7a:db:96:a1:17:9a:00:72:51:55:b1:05:28:07:ff:de:26: + c4:be:d8:43:45:bb:53:77:63:a5:bf:8e:1d:f3:2c:39:c1:c7: + e9:97:5e:d1:10:ca:4b:48:af:27:40:ae:73:9f:bb:e0:b2:0e: + 8b:31:f9:de:33:a2:cf:43:19:6e:f6:82:e3:62:c9:c7:9d:22: + eb:f3:f8:a2:cf:f4:77:7e:60:51:ad:81:12:d3:61:b4:dd:90: + 3a:70:1d:a5 -----BEGIN CERTIFICATE----- -MIIErjCCA5agAwIBAgIBAjANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx +MIIE2TCCA8GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx EDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNh d3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cud29sZnNz -bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMTgwNDEz -MTUyMzEwWhcNMjEwMTA3MTUyMzEwWjCBoDELMAkGA1UEBhMCVVMxEDAOBgNVBAgM +bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjAwNTA3 +MDczOTA0WhcNMjMwMjAxMDczOTA0WjCBoDELMAkGA1UEBhMCVVMxEDAOBgNVBAgM B01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xGDAWBgNVBAoMD3dvbGZTU0xfcmV2 b2tlZDEYMBYGA1UECwwPU3VwcG9ydF9yZXZva2VkMRgwFgYDVQQDDA93d3cud29s ZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wggEiMA0G @@ -72,32 +74,33 @@ ayQbdkisxiOlp+QFGb239t76/+1bPHmKqdXx++vIseSyq1JyiZMiXLrNijYqLNFA Hf3mQ8cbM7j05RtZORI4TS2bZGiY/I1yEpHyJCVsTEpIV5IAzH7Y1D24HfKe6rIj D1EPEUEc9ScAGwh6EjoFWwMk/rF7IPrkqFjGys5/vpUBEp0F5jkTG8A+Vi4rn3Y3 3t6b4A16Yw2nIljbMcf3tEZcurZLSLEYmmizY0f9rxJfL/4Qy1grM2iFAgMBAAGj -gfwwgfkwHQYDVR0OBBYEFNgJK1nhKu7Z7kCqnKvwXSgJTyK7MIHJBgNVHSMEgcEw -gb6AFCeOZxF0wyYdP+0zY7Ok2B0w5ejVoYGapIGXMIGUMQswCQYDVQQGEwJVUzEQ -MA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjERMA8GA1UECgwIU2F3 -dG9vdGgxEzARBgNVBAsMCkNvbnN1bHRpbmcxGDAWBgNVBAMMD3d3dy53b2xmc3Ns -LmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIJAIb/9Y4Q3rj7 -MAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAEEpuiU/F3CFHlziLIyN -FhvVH9YF6OiLQ6BbYugZfdEcYCYvOm96P+ytlsaazFM/EtkSFO4q8KUsMceuXBKa -gD/v3vO+vJ0O1saL4oxYThV4TxYuIO/4yVduo9LQAzJHcoRZr1pG3WVU1Jt8Ql2d -hush6PwP9zeulUN1bfIS86XlECV8Y+4Dzo9IyKuldC0c3dQomuvGlPrtVzGqftlE -QGmfRPaznw7T2Fhm1PzAg2enha4D94O0RTsPqT1P+AcxsIpQbYD0Nr6G367afPW8 -4vzT7doYevTwrIQfanMAQUJx1Bk/19MpnrGU/UnYpeYdqUC1HcQoQqkkt1TClF0W -BcA= +ggEmMIIBIjAdBgNVHQ4EFgQU2AkrWeEq7tnuQKqcq/BdKAlPIrswgdQGA1UdIwSB +zDCByYAUJ45nEXTDJh0/7TNjs6TYHTDl6NWhgZqkgZcwgZQxCzAJBgNVBAYTAlVT +MRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMREwDwYDVQQKDAhT +YXd0b290aDETMBEGA1UECwwKQ29uc3VsdGluZzEYMBYGA1UEAwwPd3d3LndvbGZz +c2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tghQ/MhNSksbf +StVCBWywsi5Gwvi4ZzAMBgNVHRMEBTADAQH/MBwGA1UdEQQVMBOCC2V4YW1wbGUu +Y29thwR/AAABMA0GCSqGSIb3DQEBCwUAA4IBAQAqhwqx9+TrGvGXKmEkNNSYBCzQ +gk/YlXOphTQvwKdHH4iuxSKYVZ7HJAlgsAz2KhKZzfnrRRu1isCD/4tXhIC3rSVE +z2xuZBmt+FZW23JifW8amC7UYs9WcpGzn0kfMRlpn0alj72SPnWwCZ6qrVf92VVV +Ntmdpi7rXI49oPuEa4RxvT0iCdFsIu4zketVqrhpm2t09XOZn3ViAHGKSBgiGYLP +etuWoReaAHJRVbEFKAf/3ibEvthDRbtTd2Olv44d8yw5wcfpl17REMpLSK8nQK5z +n7vgsg6LMfneM6LPQxlu9oLjYsnHnSLr8/iiz/R3fmBRrYES02G03ZA6cB2l -----END CERTIFICATE----- Certificate: Data: Version: 3 (0x2) - Serial Number: 9727763710660753659 (0x86fff58e10deb8fb) - Signature Algorithm: sha256WithRSAEncryption - Issuer: C=US, ST=Montana, L=Bozeman, O=Sawtooth, OU=Consulting, CN=www.wolfssl.com/emailAddress=info@wolfssl.com + Serial Number: + 3f:32:13:52:92:c6:df:4a:d5:42:05:6c:b0:b2:2e:46:c2:f8:b8:67 + Signature Algorithm: sha256WithRSAEncryption + Issuer: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Apr 13 15:23:09 2018 GMT - Not After : Jan 7 15:23:09 2021 GMT - Subject: C=US, ST=Montana, L=Bozeman, O=Sawtooth, OU=Consulting, CN=www.wolfssl.com/emailAddress=info@wolfssl.com + Not Before: May 7 07:39:04 2020 GMT + Not After : Feb 1 07:39:04 2023 GMT + Subject: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption - Public-Key: (2048 bit) + RSA Public-Key: (2048 bit) Modulus: 00:bf:0c:ca:2d:14:b2:1e:84:42:5b:cd:38:1f:4a: f2:4d:75:10:f1:b6:35:9f:df:ca:7d:03:98:d3:ac: @@ -124,50 +127,54 @@ Certificate: X509v3 Authority Key Identifier: keyid:27:8E:67:11:74:C3:26:1D:3F:ED:33:63:B3:A4:D8:1D:30:E5:E8:D5 DirName:/C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:86:FF:F5:8E:10:DE:B8:FB + serial:3F:32:13:52:92:C6:DF:4A:D5:42:05:6C:B0:B2:2E:46:C2:F8:B8:67 X509v3 Basic Constraints: CA:TRUE + X509v3 Subject Alternative Name: + DNS:example.com, IP Address:127.0.0.1 Signature Algorithm: sha256WithRSAEncryption - 9e:28:88:72:00:ca:e6:e7:97:ca:c1:f1:1f:9e:12:b2:b8:c7: - 51:ea:28:e1:36:b5:2d:e6:2f:08:23:cb:a9:4a:87:25:c6:5d: - 89:45:ea:f5:00:98:ac:76:fb:1b:af:f0:ce:64:9e:da:08:bf: - b6:eb:b4:b5:0c:a0:e7:f6:47:59:1c:61:cf:2e:0e:58:a4:82: - ac:0f:3f:ec:c4:ae:80:f7:b0:8a:1e:85:41:e8:ff:fe:fe:4f: - 1a:24:d5:49:fa:fb:fe:5e:e5:d3:91:0e:4f:4e:0c:21:51:71: - 83:04:6b:62:7b:4f:59:76:48:81:1e:b4:f7:04:47:8a:91:57: - a3:11:a9:f2:20:b4:78:33:62:3d:b0:5e:0d:f9:86:38:82:da: - a1:98:8d:19:06:87:21:39:b7:02:f7:da:7d:58:ba:52:15:d8: - 3b:c9:7b:58:34:a0:c7:e2:7c:a9:83:13:e1:b6:ec:01:bf:52: - 33:0b:c4:fe:43:d3:c6:a4:8e:2f:87:7f:7a:44:ea:ca:53:6c: - 85:ed:65:76:73:31:03:4e:ea:bd:35:54:13:f3:64:87:6b:df: - 34:dd:34:a1:88:3b:db:4d:af:1b:64:90:92:71:30:8e:c8:cc: - e5:60:24:af:31:16:39:33:91:50:f9:ab:68:42:74:7a:35:d9: - dd:c8:c4:52 + b0:7b:84:c9:1f:41:97:b8:03:14:0f:59:5b:6f:2c:15:45:1b: + c4:02:6f:d9:92:e7:1a:dc:cc:db:0e:56:3d:59:db:71:f2:f1: + 08:9a:06:eb:ab:c5:25:9f:df:6a:6d:6e:6b:d0:a8:90:39:d9: + 48:6f:61:7f:bd:cd:ed:60:8b:e3:6c:23:52:b7:86:bc:2a:ff: + 90:f7:6d:5c:47:69:f3:8d:ee:9e:76:62:5c:7b:b3:22:e5:4e: + ce:26:f6:3f:2f:b7:00:8c:20:d2:71:f6:31:4e:e1:4d:03:b9: + f3:07:dd:04:a7:a6:9a:9c:b0:2e:99:0a:a7:fc:59:97:63:a5: + 7c:77:dd:77:61:a6:86:6a:b2:32:33:06:b4:bc:ca:ae:c2:c7: + 8e:dc:85:dc:ac:c2:e7:2b:fb:b9:50:6b:d4:5b:0f:6d:93:a9: + 51:d2:dd:75:5e:88:ae:bc:ca:40:c7:2b:e9:5e:5b:a7:cf:e2: + e2:5d:0b:c9:69:20:d3:41:5a:7a:b9:14:17:f1:85:d7:b9:17: + b0:ad:ca:17:6c:38:8d:73:8d:74:25:01:70:c1:34:cf:62:02: + 48:9a:56:d8:44:a4:0d:e7:32:a0:b0:4b:c5:a4:9b:95:66:00: + fa:7e:97:0a:6b:08:ec:a0:9f:3f:90:99:57:39:63:81:76:f7: + ed:ea:01:1d -----BEGIN CERTIFICATE----- -MIIEqjCCA5KgAwIBAgIJAIb/9Y4Q3rj7MA0GCSqGSIb3DQEBCwUAMIGUMQswCQYD +MIIE4DCCA8igAwIBAgIUPzITUpLG30rVQgVssLIuRsL4uGcwDQYJKoZIhvcNAQEL +BQAwgZQxCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdC +b3plbWFuMREwDwYDVQQKDAhTYXd0b290aDETMBEGA1UECwwKQ29uc3VsdGluZzEY +MBYGA1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdv +bGZzc2wuY29tMB4XDTIwMDUwNzA3MzkwNFoXDTIzMDIwMTA3MzkwNFowgZQxCzAJ +BgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMREw +DwYDVQQKDAhTYXd0b290aDETMBEGA1UECwwKQ29uc3VsdGluZzEYMBYGA1UEAwwP +d3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29t +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvwzKLRSyHoRCW804H0ry +TXUQ8bY1n9/KfQOY06zeA2buKvHYsH1uB1QLEJghTYDLEiDnzE/eRX3Jcncy6sqQ +u2lSEAMvqPOVxfGLYlYb72dvpBBBla0Km+OlwLDScHZQMFuo6AgsfO2nonqNOCkc +rMft8nyVsJWCfUlcOM13Je+9gHVTlDw9ymNbnxW10x0TLxnRPNt2Osy4fcnlwtfa +QG/YIdxzG0ItU5z+Gvx9q3o2P5jehHwFZ85qFDiHqfGMtWjLaH9xICv1oGP1Vi+j +JtK3b7FaF9c4mQj+k1hv/sMTSQgWC6dNZwBSMWcjTpjtUUUduQTZC+zYKLNLve02 +eQIDAQABo4IBJjCCASIwHQYDVR0OBBYEFCeOZxF0wyYdP+0zY7Ok2B0w5ejVMIHU +BgNVHSMEgcwwgcmAFCeOZxF0wyYdP+0zY7Ok2B0w5ejVoYGapIGXMIGUMQswCQYD VQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjERMA8G A1UECgwIU2F3dG9vdGgxEzARBgNVBAsMCkNvbnN1bHRpbmcxGDAWBgNVBAMMD3d3 -dy53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbTAe -Fw0xODA0MTMxNTIzMDlaFw0yMTAxMDcxNTIzMDlaMIGUMQswCQYDVQQGEwJVUzEQ -MA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjERMA8GA1UECgwIU2F3 -dG9vdGgxEzARBgNVBAsMCkNvbnN1bHRpbmcxGDAWBgNVBAMMD3d3dy53b2xmc3Ns -LmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbTCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAL8Myi0Ush6EQlvNOB9K8k11EPG2NZ/fyn0D -mNOs3gNm7irx2LB9bgdUCxCYIU2AyxIg58xP3kV9yXJ3MurKkLtpUhADL6jzlcXx -i2JWG+9nb6QQQZWtCpvjpcCw0nB2UDBbqOgILHztp6J6jTgpHKzH7fJ8lbCVgn1J -XDjNdyXvvYB1U5Q8PcpjW58VtdMdEy8Z0TzbdjrMuH3J5cLX2kBv2CHccxtCLVOc -/hr8fat6Nj+Y3oR8BWfOahQ4h6nxjLVoy2h/cSAr9aBj9VYvoybSt2+xWhfXOJkI -/pNYb/7DE0kIFgunTWcAUjFnI06Y7VFFHbkE2Qvs2CizS73tNnkCAwEAAaOB/DCB -+TAdBgNVHQ4EFgQUJ45nEXTDJh0/7TNjs6TYHTDl6NUwgckGA1UdIwSBwTCBvoAU -J45nEXTDJh0/7TNjs6TYHTDl6NWhgZqkgZcwgZQxCzAJBgNVBAYTAlVTMRAwDgYD -VQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMREwDwYDVQQKDAhTYXd0b290 -aDETMBEGA1UECwwKQ29uc3VsdGluZzEYMBYGA1UEAwwPd3d3LndvbGZzc2wuY29t -MR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tggkAhv/1jhDeuPswDAYD -VR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAniiIcgDK5ueXysHxH54SsrjH -Ueoo4Ta1LeYvCCPLqUqHJcZdiUXq9QCYrHb7G6/wzmSe2gi/tuu0tQyg5/ZHWRxh -zy4OWKSCrA8/7MSugPewih6FQej//v5PGiTVSfr7/l7l05EOT04MIVFxgwRrYntP -WXZIgR609wRHipFXoxGp8iC0eDNiPbBeDfmGOILaoZiNGQaHITm3AvfafVi6UhXY -O8l7WDSgx+J8qYMT4bbsAb9SMwvE/kPTxqSOL4d/ekTqylNshe1ldnMxA07qvTVU -E/Nkh2vfNN00oYg7202vG2SQknEwjsjM5WAkrzEWOTORUPmraEJ0ejXZ3cjEUg== +dy53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIU +PzITUpLG30rVQgVssLIuRsL4uGcwDAYDVR0TBAUwAwEB/zAcBgNVHREEFTATggtl +eGFtcGxlLmNvbYcEfwAAATANBgkqhkiG9w0BAQsFAAOCAQEAsHuEyR9Bl7gDFA9Z +W28sFUUbxAJv2ZLnGtzM2w5WPVnbcfLxCJoG66vFJZ/fam1ua9CokDnZSG9hf73N +7WCL42wjUreGvCr/kPdtXEdp843unnZiXHuzIuVOzib2Py+3AIwg0nH2MU7hTQO5 +8wfdBKemmpywLpkKp/xZl2OlfHfdd2GmhmqyMjMGtLzKrsLHjtyF3KzC5yv7uVBr +1FsPbZOpUdLddV6IrrzKQMcr6V5bp8/i4l0LyWkg00FaerkUF/GF17kXsK3KF2w4 +jXONdCUBcME0z2ICSJpW2ESkDecyoLBLxaSblWYA+n6XCmsI7KCfP5CZVzljgXb3 +7eoBHQ== -----END CERTIFICATE----- diff --git a/certs/test-degenerate.p7b b/certs/test-degenerate.p7b index f52482f9b1831fb8170230b9a92cb685e3defe3a..641c8aa018c7271938066e9c6ae54dc12e00965a 100644 GIT binary patch delta 501 zcmey*xtS}#povwVjZ>@5qwPB{BRkWACRPQYkPH(eqalL>85o!vm>ZZITN)TgiSrs68yFcF zLb;Q5nHO%}#;D22YGBaBs5AKqlOoSOHs(-SWtPTk291{|3o`Gk$7-?x4@j9X3#$P$ zBjbMq84yp9MbtpJi959-F}ENmRWCU|x1FV)fq~J07w&RKZdL~7CPqdE<9{MA%qL1- z5#1l$=&@7LYBpDw7gJ=Xwt0WZ31i28d+!Frq(8-bQ&?2$k01Q`;g%wI>_@>9Rze*M zTEd-g-WNN(>E<_&n0-ph5AN|V4^&FGn5AZ(b!J|9e*o``PY-UCxWB5aXIRPjB;@#p zuVJrhx9j@p{r9t2`0j`AgtKyYoL$nEFx=Q4Yn^}V;)KUh&N~h61uZ()(s}C-)7N$j zkrt8sZckC;Rq`y+PH&=_>Nds9PKr)<{__3J)1a4pEX~R(rY z#GNfIIVAMjQ|em3MZ$flID@sd#AN85K^Ms}tJO)PJKLNAyY84Vc>xDhgpK$&wunNtQ$%$pW4 zGchtTaWbqrvfn3QZ)o|%fGyI776vAU#)hUw#s-#A;=D$N28IUa5bkDq#?y?f>;_GY z%#+_UDe_!qV-A&7W@$Wa(0F394D-Hvgh>WGAUR%O(`i<)PBJ8m7g zIIpUBZ}Y0@f0MU-G0K(^X`J<5MCJ0s?k_AXEg}4gi&lIJFy|5H+4JB~OY0ZzbquHG St3Pt_7v=7j-LjCukO2S^)3BKU diff --git a/certs/test-pathlen/chainA-ICA1-pathlen0.pem b/certs/test-pathlen/chainA-ICA1-pathlen0.pem index f4e62b953..73273f32d 100644 --- a/certs/test-pathlen/chainA-ICA1-pathlen0.pem +++ b/certs/test-pathlen/chainA-ICA1-pathlen0.pem @@ -5,8 +5,8 @@ Certificate: Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Oct 11 00:28:08 2019 GMT - Not After : Jul 7 00:28:08 2022 GMT + Not Before: May 7 07:39:04 2020 GMT + Not After : Feb 1 07:39:04 2023 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainA-ICA1-pathlen0, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -37,34 +37,34 @@ Certificate: X509v3 Authority Key Identifier: keyid:27:8E:67:11:74:C3:26:1D:3F:ED:33:63:B3:A4:D8:1D:30:E5:E8:D5 DirName:/C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:86:FF:F5:8E:10:DE:B8:FB + serial:3F:32:13:52:92:C6:DF:4A:D5:42:05:6C:B0:B2:2E:46:C2:F8:B8:67 X509v3 Basic Constraints: CA:TRUE, pathlen:0 X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 2a:15:34:be:88:ed:0b:5d:97:b4:c0:9e:f7:45:a2:ba:bb:a0: - 7f:a0:b3:93:15:79:38:27:36:25:91:5d:73:10:bb:d0:f9:f3: - e9:5f:98:c6:9b:6b:da:08:60:48:3e:26:17:2b:ae:22:08:ac: - 10:ed:a1:28:65:96:7f:94:75:c8:da:6c:c9:f6:4c:4c:b1:a3: - 45:4b:74:c7:de:49:f6:c1:1c:2c:eb:41:3c:2d:56:52:75:5b: - 7c:13:c0:dc:41:34:02:c0:e5:5e:79:71:65:ac:d1:f3:36:f7: - 55:d5:13:8f:0a:42:49:d9:fc:7f:5c:a4:cb:ad:7b:72:2f:98: - e2:56:92:9e:11:1a:b2:9d:5b:b9:2c:14:1e:51:f5:c5:b7:2c: - c2:39:52:90:0f:4e:04:5e:59:23:6f:d8:f9:75:2b:54:b0:6e: - 98:0a:54:3a:45:fd:9a:63:31:ce:a3:a8:ae:7b:be:03:81:a5: - 18:d3:00:51:a4:29:d4:f7:8d:53:31:72:85:80:c0:62:71:06: - 2b:07:b6:0a:b2:12:cf:2b:bd:99:34:6b:5e:ea:94:0c:1a:e8: - 2b:ee:e5:d6:3d:cb:7a:f6:f8:6e:e4:e2:f4:25:07:13:11:b1: - 18:b3:75:29:40:dc:bc:31:57:37:71:7c:09:bb:74:1c:9e:b4: - 3e:1d:47:20 + 2f:03:42:42:3e:12:ed:38:62:a7:31:a8:e1:36:a1:70:a6:d5: + 1e:14:9f:6c:67:32:05:40:ad:6b:9f:06:d4:ba:e3:27:17:f4: + 0c:13:45:bc:4f:7e:36:35:c3:94:82:e8:d3:e0:ae:9a:e5:c0: + c3:c0:8b:c8:cb:78:5a:5d:d2:2a:d9:86:53:a1:3c:8c:d4:cd: + 64:61:0c:fd:51:2a:02:e7:82:59:6d:c0:5b:1d:68:d0:bf:0f: + 89:77:a5:e1:40:18:f7:e7:d5:4c:c5:f8:7d:bb:2e:92:e0:fa: + b7:b2:6d:a7:6e:0d:22:08:b0:ad:5c:92:f3:6f:69:f1:b3:11: + fc:6c:03:b2:6e:e5:b5:26:9a:01:ea:72:7f:a1:00:86:87:7a: + 66:e5:1d:0e:9c:93:c5:06:46:c1:1c:ed:6a:53:47:12:d2:2e: + 9a:fa:fd:7a:67:bb:85:37:00:c4:19:ed:0f:88:b7:f2:2a:df: + ea:b1:2c:0c:3d:59:60:1e:96:31:f5:96:4f:6a:94:a1:46:79: + 52:db:b3:f3:8f:35:13:12:94:8a:38:82:62:ae:b8:41:cb:21: + 29:d1:27:3a:05:0f:3a:8e:79:08:30:f5:1f:49:1d:c1:26:bd: + b4:10:21:e3:63:cf:ae:a5:da:e4:67:85:95:60:99:f7:d2:56: + 61:39:df:1e -----BEGIN CERTIFICATE----- -MIIEwTCCA6mgAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx +MIIEzDCCA7SgAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx EDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNh d3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cud29sZnNz -bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMTkxMDEx -MDAyODA4WhcNMjIwNzA3MDAyODA4WjCBoTELMAkGA1UEBhMCVVMxEzARBgNVBAgM +bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjAwNTA3 +MDczOTA0WhcNMjMwMjAxMDczOTA0WjCBoTELMAkGA1UEBhMCVVMxEzARBgNVBAgM Cldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoMDHdvbGZTU0wg SW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNoYWluQS1JQ0Ex LXBhdGhsZW4wMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMIIBIjAN @@ -74,16 +74,16 @@ nWIkme23/8tNnUBU1eOqRaam2/5zQpRCwdAyXMQhrpyTALdKH56VpihtS9jAZeft o23KGLP638lnGnUjYIOlA19hveXWjZ0FRyN+oI3Rf0JOOKzOcLy/ewVbD4ICsJqN wBTK0EVelxDRoeEj2txpnM5TzGiJxkBNabyrT8cRXmKi3+KlNHw5NidnNBEELCqz FtuO/dd7HZNfM8LKliIqQ4KKSEYHE/9sHLC6C/DNP0zcNBePInBpnSLXxwIDAQAB -o4IBDTCCAQkwHQYDVR0OBBYEFKgQ6sjvTwDN43nD69/2yIadRGwmMIHJBgNVHSME -gcEwgb6AFCeOZxF0wyYdP+0zY7Ok2B0w5ejVoYGapIGXMIGUMQswCQYDVQQGEwJV +o4IBGDCCARQwHQYDVR0OBBYEFKgQ6sjvTwDN43nD69/2yIadRGwmMIHUBgNVHSME +gcwwgcmAFCeOZxF0wyYdP+0zY7Ok2B0w5ejVoYGapIGXMIGUMQswCQYDVQQGEwJV UzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjERMA8GA1UECgwI U2F3dG9vdGgxEzARBgNVBAsMCkNvbnN1bHRpbmcxGDAWBgNVBAMMD3d3dy53b2xm -c3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIJAIb/9Y4Q -3rj7MA8GA1UdEwQIMAYBAf8CAQAwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBCwUA -A4IBAQAqFTS+iO0LXZe0wJ73RaK6u6B/oLOTFXk4JzYlkV1zELvQ+fPpX5jGm2va -CGBIPiYXK64iCKwQ7aEoZZZ/lHXI2mzJ9kxMsaNFS3TH3kn2wRws60E8LVZSdVt8 -E8DcQTQCwOVeeXFlrNHzNvdV1ROPCkJJ2fx/XKTLrXtyL5jiVpKeERqynVu5LBQe -UfXFtyzCOVKQD04EXlkjb9j5dStUsG6YClQ6Rf2aYzHOo6iue74DgaUY0wBRpCnU -941TMXKFgMBicQYrB7YKshLPK72ZNGte6pQMGugr7uXWPct69vhu5OL0JQcTEbEY -s3UpQNy8MVc3cXwJu3QcnrQ+HUcg +c3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIUPzITUpLG +30rVQgVssLIuRsL4uGcwDwYDVR0TBAgwBgEB/wIBADALBgNVHQ8EBAMCAQYwDQYJ +KoZIhvcNAQELBQADggEBAC8DQkI+Eu04YqcxqOE2oXCm1R4Un2xnMgVArWufBtS6 +4ycX9AwTRbxPfjY1w5SC6NPgrprlwMPAi8jLeFpd0irZhlOhPIzUzWRhDP1RKgLn +glltwFsdaNC/D4l3peFAGPfn1UzF+H27LpLg+reybaduDSIIsK1ckvNvafGzEfxs +A7Ju5bUmmgHqcn+hAIaHemblHQ6ck8UGRsEc7WpTRxLSLpr6/Xpnu4U3AMQZ7Q+I +t/Iq3+qxLAw9WWAeljH1lk9qlKFGeVLbs/OPNRMSlIo4gmKuuEHLISnRJzoFDzqO +eQgw9R9JHcEmvbQQIeNjz66l2uRnhZVgmffSVmE53x4= -----END CERTIFICATE----- diff --git a/certs/test-pathlen/chainA-assembled.pem b/certs/test-pathlen/chainA-assembled.pem index 0661644ff..23bea56e1 100644 --- a/certs/test-pathlen/chainA-assembled.pem +++ b/certs/test-pathlen/chainA-assembled.pem @@ -5,8 +5,8 @@ Certificate: Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainA-ICA1-pathlen0, emailAddress = info@wolfssl.com Validity - Not Before: Oct 11 00:28:08 2019 GMT - Not After : Jul 7 00:28:08 2022 GMT + Not Before: May 7 07:39:04 2020 GMT + Not After : Feb 1 07:39:04 2023 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainA-entity, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -42,27 +42,27 @@ Certificate: X509v3 Basic Constraints: CA:FALSE Signature Algorithm: sha256WithRSAEncryption - 72:8d:c5:a7:a8:d5:4a:bc:d9:72:ef:46:79:53:5c:e8:32:10: - f5:29:ee:b0:6c:ef:68:80:a3:f6:0f:fe:ba:73:ce:a9:c4:93: - 01:ba:78:eb:a9:4a:f3:32:e2:4c:74:6c:f7:23:c9:70:44:a1: - d1:f7:59:d7:fd:34:12:ab:81:91:16:20:60:59:dd:ff:d5:6f: - 1f:d6:25:d9:95:85:7f:9d:dc:18:49:39:44:43:03:03:98:db: - 2e:03:a8:88:27:13:d2:a5:52:0e:15:a0:e5:5d:15:81:2b:3d: - 1c:cb:41:58:46:d3:4f:37:be:ae:45:eb:7d:9c:52:91:50:98: - a5:c1:e6:7b:1a:60:e0:d6:61:7e:88:19:b7:ec:8a:33:07:24: - 04:9f:78:89:50:97:9c:a4:1e:15:fc:ef:bf:29:4d:c3:8c:19: - d7:59:68:30:d2:08:d8:80:d8:7e:32:31:2b:ee:cf:7f:b4:47: - a4:bb:7d:cf:b6:64:9d:55:5c:e9:44:0a:43:ed:3b:c2:ae:1d: - 34:1c:bf:7e:5b:91:8c:26:76:fb:68:d9:3e:6b:68:22:ae:60: - 56:d3:4e:f3:b7:d1:de:da:47:03:2e:22:74:85:ea:52:de:22: - fd:90:55:21:8d:b2:e4:35:c3:15:44:f6:1a:01:3c:0a:56:f8: - 89:98:59:4a + 71:f4:4f:27:6c:6e:25:3d:50:f5:70:66:b1:0c:6f:0d:6f:47: + 3c:d3:a0:37:6d:a6:58:12:4c:3a:73:53:be:0f:8a:f9:63:ad: + af:f1:b4:69:43:22:35:bd:dc:8d:7a:2a:f3:05:bc:10:2e:09: + 67:1d:8c:cc:0d:e8:30:3b:02:b0:f2:9d:36:76:4a:dc:b3:bb: + b0:d1:61:f7:48:6c:46:ed:f4:a4:1b:23:bb:17:6a:74:c6:18: + 4b:16:f2:b2:02:7d:a9:c0:30:0a:87:25:a7:3f:88:2c:01:8e: + 6c:52:93:81:96:0a:6e:03:d5:b1:fe:e6:69:90:9b:24:6f:0c: + 60:d0:90:92:2d:af:60:ab:4f:1f:e6:3a:ec:c1:78:4c:58:7b: + 25:bd:44:2d:b6:8f:4d:f9:03:d0:99:38:b4:ea:8f:52:da:3b: + dc:40:58:7a:e7:bd:20:d7:75:ad:d1:bf:fd:7b:7a:80:3e:da: + a7:9c:9e:52:68:35:f3:fa:c2:06:e8:f3:7d:ea:84:e0:37:34: + 71:42:40:6c:f0:44:bd:cd:bb:10:66:b8:fe:02:dd:78:1c:30: + d2:23:56:25:29:38:73:5c:82:64:da:0b:1f:d9:16:c5:c7:54: + 7a:85:d6:d2:cb:ae:e0:f7:88:6a:53:d3:cd:3b:b8:9d:77:19: + 6c:76:f3:f8 -----BEGIN CERTIFICATE----- MIIEqjCCA5KgAwIBAgIBZTANBgkqhkiG9w0BAQsFADCBoTELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNo YWluQS1JQ0ExLXBhdGhsZW4wMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTE5MTAxMTAwMjgwOFoXDTIyMDcwNzAwMjgwOFowgZoxCzAJBgNVBAYT +Y29tMB4XDTIwMDUwNzA3MzkwNFoXDTIzMDIwMTA3MzkwNFowgZoxCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRUwEwYD VQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2luZWVyaW5nMRYwFAYDVQQD DA1jaGFpbkEtZW50aXR5MR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29t @@ -77,12 +77,12 @@ VR0jBIG5MIG2gBSoEOrI708AzeN5w+vf9siGnURsJqGBmqSBlzCBlDELMAkGA1UE BhMCVVMxEDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNV BAoMCFNhd3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cu d29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb22CAWQw -CQYDVR0TBAIwADANBgkqhkiG9w0BAQsFAAOCAQEAco3Fp6jVSrzZcu9GeVNc6DIQ -9SnusGzvaICj9g/+unPOqcSTAbp466lK8zLiTHRs9yPJcESh0fdZ1/00EquBkRYg -YFnd/9VvH9Yl2ZWFf53cGEk5REMDA5jbLgOoiCcT0qVSDhWg5V0VgSs9HMtBWEbT -Tze+rkXrfZxSkVCYpcHmexpg4NZhfogZt+yKMwckBJ94iVCXnKQeFfzvvylNw4wZ -11loMNII2IDYfjIxK+7Pf7RHpLt9z7ZknVVc6UQKQ+07wq4dNBy/fluRjCZ2+2jZ -PmtoIq5gVtNO87fR3tpHAy4idIXqUt4i/ZBVIY2y5DXDFUT2GgE8Clb4iZhZSg== +CQYDVR0TBAIwADANBgkqhkiG9w0BAQsFAAOCAQEAcfRPJ2xuJT1Q9XBmsQxvDW9H +PNOgN22mWBJMOnNTvg+K+WOtr/G0aUMiNb3cjXoq8wW8EC4JZx2MzA3oMDsCsPKd +NnZK3LO7sNFh90hsRu30pBsjuxdqdMYYSxbysgJ9qcAwCoclpz+ILAGObFKTgZYK +bgPVsf7maZCbJG8MYNCQki2vYKtPH+Y67MF4TFh7Jb1ELbaPTfkD0Jk4tOqPUto7 +3EBYeue9INd1rdG//Xt6gD7ap5yeUmg18/rCBujzfeqE4Dc0cUJAbPBEvc27EGa4 +/gLdeBww0iNWJSk4c1yCZNoLH9kWxcdUeoXW0suu4PeIalPTzTu4nXcZbHbz+A== -----END CERTIFICATE----- Certificate: Data: @@ -91,8 +91,8 @@ Certificate: Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Oct 11 00:28:08 2019 GMT - Not After : Jul 7 00:28:08 2022 GMT + Not Before: May 7 07:39:04 2020 GMT + Not After : Feb 1 07:39:04 2023 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainA-ICA1-pathlen0, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -123,34 +123,34 @@ Certificate: X509v3 Authority Key Identifier: keyid:27:8E:67:11:74:C3:26:1D:3F:ED:33:63:B3:A4:D8:1D:30:E5:E8:D5 DirName:/C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:86:FF:F5:8E:10:DE:B8:FB + serial:3F:32:13:52:92:C6:DF:4A:D5:42:05:6C:B0:B2:2E:46:C2:F8:B8:67 X509v3 Basic Constraints: CA:TRUE, pathlen:0 X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 2a:15:34:be:88:ed:0b:5d:97:b4:c0:9e:f7:45:a2:ba:bb:a0: - 7f:a0:b3:93:15:79:38:27:36:25:91:5d:73:10:bb:d0:f9:f3: - e9:5f:98:c6:9b:6b:da:08:60:48:3e:26:17:2b:ae:22:08:ac: - 10:ed:a1:28:65:96:7f:94:75:c8:da:6c:c9:f6:4c:4c:b1:a3: - 45:4b:74:c7:de:49:f6:c1:1c:2c:eb:41:3c:2d:56:52:75:5b: - 7c:13:c0:dc:41:34:02:c0:e5:5e:79:71:65:ac:d1:f3:36:f7: - 55:d5:13:8f:0a:42:49:d9:fc:7f:5c:a4:cb:ad:7b:72:2f:98: - e2:56:92:9e:11:1a:b2:9d:5b:b9:2c:14:1e:51:f5:c5:b7:2c: - c2:39:52:90:0f:4e:04:5e:59:23:6f:d8:f9:75:2b:54:b0:6e: - 98:0a:54:3a:45:fd:9a:63:31:ce:a3:a8:ae:7b:be:03:81:a5: - 18:d3:00:51:a4:29:d4:f7:8d:53:31:72:85:80:c0:62:71:06: - 2b:07:b6:0a:b2:12:cf:2b:bd:99:34:6b:5e:ea:94:0c:1a:e8: - 2b:ee:e5:d6:3d:cb:7a:f6:f8:6e:e4:e2:f4:25:07:13:11:b1: - 18:b3:75:29:40:dc:bc:31:57:37:71:7c:09:bb:74:1c:9e:b4: - 3e:1d:47:20 + 2f:03:42:42:3e:12:ed:38:62:a7:31:a8:e1:36:a1:70:a6:d5: + 1e:14:9f:6c:67:32:05:40:ad:6b:9f:06:d4:ba:e3:27:17:f4: + 0c:13:45:bc:4f:7e:36:35:c3:94:82:e8:d3:e0:ae:9a:e5:c0: + c3:c0:8b:c8:cb:78:5a:5d:d2:2a:d9:86:53:a1:3c:8c:d4:cd: + 64:61:0c:fd:51:2a:02:e7:82:59:6d:c0:5b:1d:68:d0:bf:0f: + 89:77:a5:e1:40:18:f7:e7:d5:4c:c5:f8:7d:bb:2e:92:e0:fa: + b7:b2:6d:a7:6e:0d:22:08:b0:ad:5c:92:f3:6f:69:f1:b3:11: + fc:6c:03:b2:6e:e5:b5:26:9a:01:ea:72:7f:a1:00:86:87:7a: + 66:e5:1d:0e:9c:93:c5:06:46:c1:1c:ed:6a:53:47:12:d2:2e: + 9a:fa:fd:7a:67:bb:85:37:00:c4:19:ed:0f:88:b7:f2:2a:df: + ea:b1:2c:0c:3d:59:60:1e:96:31:f5:96:4f:6a:94:a1:46:79: + 52:db:b3:f3:8f:35:13:12:94:8a:38:82:62:ae:b8:41:cb:21: + 29:d1:27:3a:05:0f:3a:8e:79:08:30:f5:1f:49:1d:c1:26:bd: + b4:10:21:e3:63:cf:ae:a5:da:e4:67:85:95:60:99:f7:d2:56: + 61:39:df:1e -----BEGIN CERTIFICATE----- -MIIEwTCCA6mgAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx +MIIEzDCCA7SgAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx EDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNh d3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cud29sZnNz -bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMTkxMDEx -MDAyODA4WhcNMjIwNzA3MDAyODA4WjCBoTELMAkGA1UEBhMCVVMxEzARBgNVBAgM +bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjAwNTA3 +MDczOTA0WhcNMjMwMjAxMDczOTA0WjCBoTELMAkGA1UEBhMCVVMxEzARBgNVBAgM Cldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoMDHdvbGZTU0wg SW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNoYWluQS1JQ0Ex LXBhdGhsZW4wMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMIIBIjAN @@ -160,16 +160,16 @@ nWIkme23/8tNnUBU1eOqRaam2/5zQpRCwdAyXMQhrpyTALdKH56VpihtS9jAZeft o23KGLP638lnGnUjYIOlA19hveXWjZ0FRyN+oI3Rf0JOOKzOcLy/ewVbD4ICsJqN wBTK0EVelxDRoeEj2txpnM5TzGiJxkBNabyrT8cRXmKi3+KlNHw5NidnNBEELCqz FtuO/dd7HZNfM8LKliIqQ4KKSEYHE/9sHLC6C/DNP0zcNBePInBpnSLXxwIDAQAB -o4IBDTCCAQkwHQYDVR0OBBYEFKgQ6sjvTwDN43nD69/2yIadRGwmMIHJBgNVHSME -gcEwgb6AFCeOZxF0wyYdP+0zY7Ok2B0w5ejVoYGapIGXMIGUMQswCQYDVQQGEwJV +o4IBGDCCARQwHQYDVR0OBBYEFKgQ6sjvTwDN43nD69/2yIadRGwmMIHUBgNVHSME +gcwwgcmAFCeOZxF0wyYdP+0zY7Ok2B0w5ejVoYGapIGXMIGUMQswCQYDVQQGEwJV UzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjERMA8GA1UECgwI U2F3dG9vdGgxEzARBgNVBAsMCkNvbnN1bHRpbmcxGDAWBgNVBAMMD3d3dy53b2xm -c3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIJAIb/9Y4Q -3rj7MA8GA1UdEwQIMAYBAf8CAQAwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBCwUA -A4IBAQAqFTS+iO0LXZe0wJ73RaK6u6B/oLOTFXk4JzYlkV1zELvQ+fPpX5jGm2va -CGBIPiYXK64iCKwQ7aEoZZZ/lHXI2mzJ9kxMsaNFS3TH3kn2wRws60E8LVZSdVt8 -E8DcQTQCwOVeeXFlrNHzNvdV1ROPCkJJ2fx/XKTLrXtyL5jiVpKeERqynVu5LBQe -UfXFtyzCOVKQD04EXlkjb9j5dStUsG6YClQ6Rf2aYzHOo6iue74DgaUY0wBRpCnU -941TMXKFgMBicQYrB7YKshLPK72ZNGte6pQMGugr7uXWPct69vhu5OL0JQcTEbEY -s3UpQNy8MVc3cXwJu3QcnrQ+HUcg +c3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIUPzITUpLG +30rVQgVssLIuRsL4uGcwDwYDVR0TBAgwBgEB/wIBADALBgNVHQ8EBAMCAQYwDQYJ +KoZIhvcNAQELBQADggEBAC8DQkI+Eu04YqcxqOE2oXCm1R4Un2xnMgVArWufBtS6 +4ycX9AwTRbxPfjY1w5SC6NPgrprlwMPAi8jLeFpd0irZhlOhPIzUzWRhDP1RKgLn +glltwFsdaNC/D4l3peFAGPfn1UzF+H27LpLg+reybaduDSIIsK1ckvNvafGzEfxs +A7Ju5bUmmgHqcn+hAIaHemblHQ6ck8UGRsEc7WpTRxLSLpr6/Xpnu4U3AMQZ7Q+I +t/Iq3+qxLAw9WWAeljH1lk9qlKFGeVLbs/OPNRMSlIo4gmKuuEHLISnRJzoFDzqO +eQgw9R9JHcEmvbQQIeNjz66l2uRnhZVgmffSVmE53x4= -----END CERTIFICATE----- diff --git a/certs/test-pathlen/chainA-entity.pem b/certs/test-pathlen/chainA-entity.pem index 277c4a644..1f2e64aeb 100644 --- a/certs/test-pathlen/chainA-entity.pem +++ b/certs/test-pathlen/chainA-entity.pem @@ -5,8 +5,8 @@ Certificate: Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainA-ICA1-pathlen0, emailAddress = info@wolfssl.com Validity - Not Before: Oct 11 00:28:08 2019 GMT - Not After : Jul 7 00:28:08 2022 GMT + Not Before: May 7 07:39:04 2020 GMT + Not After : Feb 1 07:39:04 2023 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainA-entity, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -42,27 +42,27 @@ Certificate: X509v3 Basic Constraints: CA:FALSE Signature Algorithm: sha256WithRSAEncryption - 72:8d:c5:a7:a8:d5:4a:bc:d9:72:ef:46:79:53:5c:e8:32:10: - f5:29:ee:b0:6c:ef:68:80:a3:f6:0f:fe:ba:73:ce:a9:c4:93: - 01:ba:78:eb:a9:4a:f3:32:e2:4c:74:6c:f7:23:c9:70:44:a1: - d1:f7:59:d7:fd:34:12:ab:81:91:16:20:60:59:dd:ff:d5:6f: - 1f:d6:25:d9:95:85:7f:9d:dc:18:49:39:44:43:03:03:98:db: - 2e:03:a8:88:27:13:d2:a5:52:0e:15:a0:e5:5d:15:81:2b:3d: - 1c:cb:41:58:46:d3:4f:37:be:ae:45:eb:7d:9c:52:91:50:98: - a5:c1:e6:7b:1a:60:e0:d6:61:7e:88:19:b7:ec:8a:33:07:24: - 04:9f:78:89:50:97:9c:a4:1e:15:fc:ef:bf:29:4d:c3:8c:19: - d7:59:68:30:d2:08:d8:80:d8:7e:32:31:2b:ee:cf:7f:b4:47: - a4:bb:7d:cf:b6:64:9d:55:5c:e9:44:0a:43:ed:3b:c2:ae:1d: - 34:1c:bf:7e:5b:91:8c:26:76:fb:68:d9:3e:6b:68:22:ae:60: - 56:d3:4e:f3:b7:d1:de:da:47:03:2e:22:74:85:ea:52:de:22: - fd:90:55:21:8d:b2:e4:35:c3:15:44:f6:1a:01:3c:0a:56:f8: - 89:98:59:4a + 71:f4:4f:27:6c:6e:25:3d:50:f5:70:66:b1:0c:6f:0d:6f:47: + 3c:d3:a0:37:6d:a6:58:12:4c:3a:73:53:be:0f:8a:f9:63:ad: + af:f1:b4:69:43:22:35:bd:dc:8d:7a:2a:f3:05:bc:10:2e:09: + 67:1d:8c:cc:0d:e8:30:3b:02:b0:f2:9d:36:76:4a:dc:b3:bb: + b0:d1:61:f7:48:6c:46:ed:f4:a4:1b:23:bb:17:6a:74:c6:18: + 4b:16:f2:b2:02:7d:a9:c0:30:0a:87:25:a7:3f:88:2c:01:8e: + 6c:52:93:81:96:0a:6e:03:d5:b1:fe:e6:69:90:9b:24:6f:0c: + 60:d0:90:92:2d:af:60:ab:4f:1f:e6:3a:ec:c1:78:4c:58:7b: + 25:bd:44:2d:b6:8f:4d:f9:03:d0:99:38:b4:ea:8f:52:da:3b: + dc:40:58:7a:e7:bd:20:d7:75:ad:d1:bf:fd:7b:7a:80:3e:da: + a7:9c:9e:52:68:35:f3:fa:c2:06:e8:f3:7d:ea:84:e0:37:34: + 71:42:40:6c:f0:44:bd:cd:bb:10:66:b8:fe:02:dd:78:1c:30: + d2:23:56:25:29:38:73:5c:82:64:da:0b:1f:d9:16:c5:c7:54: + 7a:85:d6:d2:cb:ae:e0:f7:88:6a:53:d3:cd:3b:b8:9d:77:19: + 6c:76:f3:f8 -----BEGIN CERTIFICATE----- MIIEqjCCA5KgAwIBAgIBZTANBgkqhkiG9w0BAQsFADCBoTELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNo YWluQS1JQ0ExLXBhdGhsZW4wMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTE5MTAxMTAwMjgwOFoXDTIyMDcwNzAwMjgwOFowgZoxCzAJBgNVBAYT +Y29tMB4XDTIwMDUwNzA3MzkwNFoXDTIzMDIwMTA3MzkwNFowgZoxCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRUwEwYD VQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2luZWVyaW5nMRYwFAYDVQQD DA1jaGFpbkEtZW50aXR5MR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29t @@ -77,10 +77,10 @@ VR0jBIG5MIG2gBSoEOrI708AzeN5w+vf9siGnURsJqGBmqSBlzCBlDELMAkGA1UE BhMCVVMxEDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNV BAoMCFNhd3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cu d29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb22CAWQw -CQYDVR0TBAIwADANBgkqhkiG9w0BAQsFAAOCAQEAco3Fp6jVSrzZcu9GeVNc6DIQ -9SnusGzvaICj9g/+unPOqcSTAbp466lK8zLiTHRs9yPJcESh0fdZ1/00EquBkRYg -YFnd/9VvH9Yl2ZWFf53cGEk5REMDA5jbLgOoiCcT0qVSDhWg5V0VgSs9HMtBWEbT -Tze+rkXrfZxSkVCYpcHmexpg4NZhfogZt+yKMwckBJ94iVCXnKQeFfzvvylNw4wZ -11loMNII2IDYfjIxK+7Pf7RHpLt9z7ZknVVc6UQKQ+07wq4dNBy/fluRjCZ2+2jZ -PmtoIq5gVtNO87fR3tpHAy4idIXqUt4i/ZBVIY2y5DXDFUT2GgE8Clb4iZhZSg== +CQYDVR0TBAIwADANBgkqhkiG9w0BAQsFAAOCAQEAcfRPJ2xuJT1Q9XBmsQxvDW9H +PNOgN22mWBJMOnNTvg+K+WOtr/G0aUMiNb3cjXoq8wW8EC4JZx2MzA3oMDsCsPKd +NnZK3LO7sNFh90hsRu30pBsjuxdqdMYYSxbysgJ9qcAwCoclpz+ILAGObFKTgZYK +bgPVsf7maZCbJG8MYNCQki2vYKtPH+Y67MF4TFh7Jb1ELbaPTfkD0Jk4tOqPUto7 +3EBYeue9INd1rdG//Xt6gD7ap5yeUmg18/rCBujzfeqE4Dc0cUJAbPBEvc27EGa4 +/gLdeBww0iNWJSk4c1yCZNoLH9kWxcdUeoXW0suu4PeIalPTzTu4nXcZbHbz+A== -----END CERTIFICATE----- diff --git a/certs/test-pathlen/chainB-ICA1-pathlen0.pem b/certs/test-pathlen/chainB-ICA1-pathlen0.pem index 138560784..0674b4bd1 100644 --- a/certs/test-pathlen/chainB-ICA1-pathlen0.pem +++ b/certs/test-pathlen/chainB-ICA1-pathlen0.pem @@ -5,8 +5,8 @@ Certificate: Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainB-ICA2-pathlen1, emailAddress = info@wolfssl.com Validity - Not Before: Oct 11 00:28:08 2019 GMT - Not After : Jul 7 00:28:08 2022 GMT + Not Before: May 7 07:39:04 2020 GMT + Not After : Feb 1 07:39:04 2023 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainB-ICA1-pathlen0, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -44,27 +44,27 @@ Certificate: X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - cd:0b:7e:66:b9:1d:a8:14:81:a8:e0:b3:74:d9:79:8a:c1:e5: - 15:cf:6a:a7:a3:ca:d2:ad:f8:f6:9f:c2:be:67:ee:cf:9a:3c: - 1c:a3:c4:db:2b:c8:a9:b1:55:94:a1:9e:e3:c2:6c:3a:95:90: - 7e:8f:29:56:c6:99:d2:e5:3b:8f:f3:9a:11:4a:97:22:07:d9: - e2:e5:f8:3e:0f:08:50:43:ea:66:13:6c:20:2e:71:95:10:07: - 88:89:2d:30:9c:96:b1:7e:42:5f:63:c3:8b:71:c6:1d:00:ee: - 83:d7:80:1b:fa:f4:fe:f5:b1:29:f8:c1:ca:1d:89:9b:7c:2a: - 84:00:e4:f5:04:2d:35:be:12:c1:fa:78:cb:bc:c9:04:8a:bf: - 87:57:99:3a:9f:0a:88:a5:e8:94:db:2b:8f:ba:5f:b4:75:7f: - ac:56:75:b4:db:7f:57:24:17:cb:89:f8:cb:8b:c4:b2:44:4a: - d9:57:82:fb:ce:0c:84:e2:2b:a5:f2:90:63:aa:b3:c5:e1:00: - 22:60:8f:23:1f:a8:97:4b:49:f7:f7:cb:92:f7:94:80:52:5b: - 8d:4a:c1:f1:d1:3e:9f:28:96:61:af:8e:72:8d:b6:9e:14:ed: - 14:db:ea:f0:fc:50:39:ca:c8:ab:1e:49:c3:9e:97:0a:d7:1c: - 6f:b2:17:9a + 04:0a:e8:4e:60:2f:29:8d:52:95:ca:47:9b:b1:93:6b:36:99: + 31:ba:8a:62:9b:ff:ad:08:c9:f5:7a:ef:57:00:96:71:c1:fe: + cd:a8:49:44:dd:a4:0f:ef:f8:20:d0:04:42:f9:75:78:df:85: + da:ae:04:4d:ca:35:1a:ab:00:ce:06:32:a5:9f:46:35:71:de: + b9:a7:5b:bb:e2:8e:22:64:47:94:f4:60:da:37:7b:c4:d5:5c: + 89:16:84:b2:8b:91:53:95:2b:ec:c3:7a:c9:b3:f5:ab:53:c8: + c5:65:3a:5b:9c:17:f7:04:b8:1e:e6:28:96:b9:75:03:54:a5: + f2:07:63:d7:86:42:cf:44:ab:ea:79:a0:04:55:a6:5c:2e:63: + d1:7e:13:0b:24:f8:09:1e:ee:66:48:7f:cf:40:a4:61:18:28: + ef:da:d2:5f:68:8d:66:4a:68:d5:be:82:ef:92:70:b5:66:4e: + 5e:6b:55:9e:b5:fa:e3:98:b0:35:d4:b0:a9:3a:35:43:d4:94: + 02:cd:97:47:d2:aa:03:15:24:f3:b4:51:69:f1:78:93:e5:8c: + af:92:2a:00:bf:e6:53:20:08:c3:9a:29:93:82:28:db:df:6f: + 60:28:fc:b5:19:15:32:b7:00:d0:cf:78:b5:3e:9e:7d:74:e9: + 5d:cd:7f:0a -----BEGIN CERTIFICATE----- MIIExjCCA66gAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBoTELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNo YWluQi1JQ0EyLXBhdGhsZW4xMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTE5MTAxMTAwMjgwOFoXDTIyMDcwNzAwMjgwOFowgaExCzAJBgNVBAYT +Y29tMB4XDTIwMDUwNzA3MzkwNFoXDTIzMDIwMTA3MzkwNFowgaExCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRUwEwYD VQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2luZWVyaW5nMR0wGwYDVQQD DBRjaGFpbkItSUNBMS1wYXRobGVuMDEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xm @@ -80,10 +80,10 @@ lDELMAkGA1UEBhMCVVMxEDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVt YW4xETAPBgNVBAoMCFNhd3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYD VQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNz bC5jb22CAWQwDwYDVR0TBAgwBgEB/wIBADALBgNVHQ8EBAMCAQYwDQYJKoZIhvcN -AQELBQADggEBAM0Lfma5HagUgajgs3TZeYrB5RXPaqejytKt+Pafwr5n7s+aPByj -xNsryKmxVZShnuPCbDqVkH6PKVbGmdLlO4/zmhFKlyIH2eLl+D4PCFBD6mYTbCAu -cZUQB4iJLTCclrF+Ql9jw4txxh0A7oPXgBv69P71sSn4wcodiZt8KoQA5PUELTW+ -EsH6eMu8yQSKv4dXmTqfCoil6JTbK4+6X7R1f6xWdbTbf1ckF8uJ+MuLxLJEStlX -gvvODITiK6XykGOqs8XhACJgjyMfqJdLSff3y5L3lIBSW41KwfHRPp8olmGvjnKN -tp4U7RTb6vD8UDnKyKseScOelwrXHG+yF5o= +AQELBQADggEBAAQK6E5gLymNUpXKR5uxk2s2mTG6imKb/60IyfV671cAlnHB/s2o +SUTdpA/v+CDQBEL5dXjfhdquBE3KNRqrAM4GMqWfRjVx3rmnW7vijiJkR5T0YNo3 +e8TVXIkWhLKLkVOVK+zDesmz9atTyMVlOlucF/cEuB7mKJa5dQNUpfIHY9eGQs9E +q+p5oARVplwuY9F+Ewsk+Ake7mZIf89ApGEYKO/a0l9ojWZKaNW+gu+ScLVmTl5r +VZ61+uOYsDXUsKk6NUPUlALNl0fSqgMVJPO0UWnxeJPljK+SKgC/5lMgCMOaKZOC +KNvfb2Ao/LUZFTK3ANDPeLU+nn106V3Nfwo= -----END CERTIFICATE----- diff --git a/certs/test-pathlen/chainB-ICA2-pathlen1.pem b/certs/test-pathlen/chainB-ICA2-pathlen1.pem index 5197a077d..ec9dc8fc1 100644 --- a/certs/test-pathlen/chainB-ICA2-pathlen1.pem +++ b/certs/test-pathlen/chainB-ICA2-pathlen1.pem @@ -5,8 +5,8 @@ Certificate: Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Oct 11 00:28:08 2019 GMT - Not After : Jul 7 00:28:08 2022 GMT + Not Before: May 7 07:39:04 2020 GMT + Not After : Feb 1 07:39:04 2023 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainB-ICA2-pathlen1, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -37,34 +37,34 @@ Certificate: X509v3 Authority Key Identifier: keyid:27:8E:67:11:74:C3:26:1D:3F:ED:33:63:B3:A4:D8:1D:30:E5:E8:D5 DirName:/C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:86:FF:F5:8E:10:DE:B8:FB + serial:3F:32:13:52:92:C6:DF:4A:D5:42:05:6C:B0:B2:2E:46:C2:F8:B8:67 X509v3 Basic Constraints: CA:TRUE, pathlen:1 X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - ab:c7:2b:9d:15:73:97:47:e0:88:32:9d:10:71:81:53:62:97: - dc:c4:72:73:49:3e:50:50:10:03:1e:22:58:82:e0:b3:da:ca: - 89:92:70:c8:54:0d:8e:a6:44:a0:26:5d:5d:52:d2:fb:63:e4: - 13:7e:30:9a:13:25:4e:c8:34:a1:c9:e6:69:24:64:98:e3:88: - 9c:86:18:62:53:70:ae:f0:d9:ed:f3:0c:e8:ec:5b:e5:27:85: - 16:d0:b0:f6:bd:5d:9a:62:41:26:25:31:88:70:fe:25:97:48: - f1:e6:21:1c:78:f7:68:03:59:21:db:f1:c5:92:96:24:b8:23: - fc:ab:52:95:70:6a:52:16:4d:fc:36:6b:5f:58:4f:3f:c9:f4: - e7:6e:52:41:42:99:41:07:c2:75:74:db:c2:49:84:7c:3f:c1: - ac:bd:d4:d5:8f:d0:73:95:18:8a:5d:f0:8d:dd:2d:f0:b7:61: - 8d:8a:ef:14:9f:fd:30:ba:10:e8:57:d3:1b:8e:2d:9b:74:b3: - 63:0d:0e:8c:f9:a2:f7:42:c8:e6:5e:83:6f:0f:9a:85:3b:6e: - 66:48:b9:a7:a8:fc:da:19:47:0c:90:26:0d:ce:15:fe:6a:1e: - 47:5a:49:f8:76:0f:3a:a8:68:cd:a6:38:4c:a6:ca:b2:b0:9b: - c7:46:43:cd + 92:d5:a7:bc:16:7e:7f:40:27:a1:7c:50:74:a7:30:4f:5a:6c: + 1b:d3:d9:78:77:85:8d:7b:d1:16:52:65:06:9f:45:22:81:37: + ca:48:d1:6c:bb:87:7f:6a:1f:72:76:a9:93:74:2a:65:c8:99: + 87:15:ae:50:ed:9b:cd:1a:e0:20:14:ec:31:cf:99:92:c1:86: + b3:e9:bc:74:b8:7f:c3:b7:17:5b:80:94:a7:85:82:4e:17:2f: + 37:69:e1:ed:4b:05:07:77:ba:02:d1:fd:b1:34:d9:2a:45:53: + 9b:3d:18:52:be:fd:48:78:10:a0:bf:da:29:b0:7e:4d:c4:1e: + 20:b6:6e:59:fb:04:76:fa:df:16:95:01:3c:47:38:32:bd:f0: + 75:b7:0c:8c:29:61:f1:ed:a0:89:93:b3:6c:a5:7d:50:83:e2: + a5:04:f5:55:6f:fa:8c:dc:ab:ca:f8:d7:86:ce:62:2a:7f:14: + 17:8c:ef:56:a0:bb:67:06:a7:c2:7c:d2:66:21:29:16:8f:72: + 24:95:1c:63:45:c1:cf:1a:d4:7d:04:1e:6a:a1:5b:45:10:e5: + cb:a3:60:3f:da:71:d3:d2:6c:e4:32:dc:9a:8f:f1:9e:bf:f1: + 8a:75:56:26:e7:26:97:a9:1f:7b:5d:e7:a4:10:c3:c6:64:53: + ce:8c:92:7c -----BEGIN CERTIFICATE----- -MIIEwTCCA6mgAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx +MIIEzDCCA7SgAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx EDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNh d3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cud29sZnNz -bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMTkxMDEx -MDAyODA4WhcNMjIwNzA3MDAyODA4WjCBoTELMAkGA1UEBhMCVVMxEzARBgNVBAgM +bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjAwNTA3 +MDczOTA0WhcNMjMwMjAxMDczOTA0WjCBoTELMAkGA1UEBhMCVVMxEzARBgNVBAgM Cldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoMDHdvbGZTU0wg SW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNoYWluQi1JQ0Ey LXBhdGhsZW4xMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMIIBIjAN @@ -74,16 +74,16 @@ wt+hVv6Vl1ZeW/502fIuyn7bUHda0ZDcItb+S8BXocY7SrqtBRTJJGh2teIm1ctQ /dB3DowMuV73pJpFNWxiyuk41BCaXDClTyZHAwNzVoWMvvXQwAkGPg7o5X3QGVTt V+xRz7yVFZHP0JqE3YpQfDPCGmFwMZoZFyizjNpfuNIGa4I/tmooKYa0IMulr3Nm 5Dc2gfA/rb8FuNsuxCLi60aH9GDRpn/unEGn86rpN93a1vDNSKxR0XeNoQIDAQAB -o4IBDTCCAQkwHQYDVR0OBBYEFO5ZnVYLfApFROMVV+Ky8x1kb696MIHJBgNVHSME -gcEwgb6AFCeOZxF0wyYdP+0zY7Ok2B0w5ejVoYGapIGXMIGUMQswCQYDVQQGEwJV +o4IBGDCCARQwHQYDVR0OBBYEFO5ZnVYLfApFROMVV+Ky8x1kb696MIHUBgNVHSME +gcwwgcmAFCeOZxF0wyYdP+0zY7Ok2B0w5ejVoYGapIGXMIGUMQswCQYDVQQGEwJV UzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjERMA8GA1UECgwI U2F3dG9vdGgxEzARBgNVBAsMCkNvbnN1bHRpbmcxGDAWBgNVBAMMD3d3dy53b2xm -c3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIJAIb/9Y4Q -3rj7MA8GA1UdEwQIMAYBAf8CAQEwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBCwUA -A4IBAQCrxyudFXOXR+CIMp0QcYFTYpfcxHJzST5QUBADHiJYguCz2sqJknDIVA2O -pkSgJl1dUtL7Y+QTfjCaEyVOyDShyeZpJGSY44ichhhiU3Cu8Nnt8wzo7FvlJ4UW -0LD2vV2aYkEmJTGIcP4ll0jx5iEcePdoA1kh2/HFkpYkuCP8q1KVcGpSFk38Nmtf -WE8/yfTnblJBQplBB8J1dNvCSYR8P8GsvdTVj9BzlRiKXfCN3S3wt2GNiu8Un/0w -uhDoV9Mbji2bdLNjDQ6M+aL3QsjmXoNvD5qFO25mSLmnqPzaGUcMkCYNzhX+ah5H -Wkn4dg86qGjNpjhMpsqysJvHRkPN +c3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIUPzITUpLG +30rVQgVssLIuRsL4uGcwDwYDVR0TBAgwBgEB/wIBATALBgNVHQ8EBAMCAQYwDQYJ +KoZIhvcNAQELBQADggEBAJLVp7wWfn9AJ6F8UHSnME9abBvT2Xh3hY170RZSZQaf +RSKBN8pI0Wy7h39qH3J2qZN0KmXImYcVrlDtm80a4CAU7DHPmZLBhrPpvHS4f8O3 +F1uAlKeFgk4XLzdp4e1LBQd3ugLR/bE02SpFU5s9GFK+/Uh4EKC/2imwfk3EHiC2 +bln7BHb63xaVATxHODK98HW3DIwpYfHtoImTs2ylfVCD4qUE9VVv+ozcq8r414bO +Yip/FBeM71agu2cGp8J80mYhKRaPciSVHGNFwc8a1H0EHmqhW0UQ5cujYD/acdPS +bOQy3JqP8Z6/8Yp1VibnJpepH3td56QQw8ZkU86Mknw= -----END CERTIFICATE----- diff --git a/certs/test-pathlen/chainB-assembled.pem b/certs/test-pathlen/chainB-assembled.pem index 7f83c5f55..ba62966ea 100644 --- a/certs/test-pathlen/chainB-assembled.pem +++ b/certs/test-pathlen/chainB-assembled.pem @@ -5,8 +5,8 @@ Certificate: Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainB-ICA1-pathlen0, emailAddress = info@wolfssl.com Validity - Not Before: Oct 11 00:28:08 2019 GMT - Not After : Jul 7 00:28:08 2022 GMT + Not Before: May 7 07:39:04 2020 GMT + Not After : Feb 1 07:39:04 2023 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainB-entity, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -42,27 +42,27 @@ Certificate: X509v3 Basic Constraints: CA:FALSE Signature Algorithm: sha256WithRSAEncryption - 1f:ee:5c:85:ed:4e:3b:39:6b:29:a2:ef:65:b9:f3:c7:47:85: - 8e:79:a0:35:1b:aa:0e:98:67:a8:df:03:9c:2b:81:24:ed:cb: - cc:c0:42:49:76:bf:78:7b:b9:39:ca:f6:06:35:76:dd:e3:59: - c5:70:3b:b3:cf:62:0a:09:1d:07:90:96:c4:0e:0a:38:97:f7: - 31:1d:ad:44:f9:03:f9:30:22:b6:68:01:00:38:23:3d:f6:e7: - 71:5a:e4:d4:59:52:4f:80:86:ec:8f:ca:92:1d:9b:07:93:fe: - 34:22:ac:9a:a2:aa:9e:fe:f5:7b:99:fd:72:32:40:98:88:d8: - 42:1d:33:59:4c:38:2e:97:f2:9d:a2:fc:b7:33:cd:84:c1:c6: - ef:f5:c5:d9:be:32:ba:44:66:06:62:5c:55:31:38:b4:25:1a: - 6a:64:de:14:39:b4:38:74:1b:d7:c4:ec:81:fc:3a:13:4b:e1: - d1:b1:5f:3c:8e:25:bc:63:7f:30:78:04:4e:79:3a:83:97:52: - f6:00:6a:9e:d8:b5:c6:06:21:97:4a:98:ee:cf:e8:83:94:23: - 11:6c:00:d7:e9:35:1f:89:77:85:9a:d7:8f:29:90:c6:61:14: - e5:7d:55:5b:66:65:60:44:79:8a:1b:58:88:b9:0f:5f:a6:5f: - 7a:ca:6b:0c + 4c:68:70:3b:15:49:d0:d7:71:36:8b:fd:ee:19:14:d0:ad:7d: + 68:a1:81:79:38:d2:bd:a5:48:2a:0a:e3:8a:38:a2:a0:e8:9a: + a5:e1:f2:4c:9b:06:64:fb:7b:e6:d1:b1:da:6f:4d:dc:b8:34: + 05:87:73:b6:77:a0:01:e9:2f:a4:6a:da:be:0e:16:8e:07:e8: + 20:55:59:6e:32:e9:94:67:46:f0:42:02:f3:84:7f:f8:13:18: + 4c:ae:6f:11:63:c6:3b:24:1e:67:4a:ea:9b:b4:d7:c3:58:ab: + 88:41:31:ef:0d:72:df:40:83:86:1d:a1:6a:51:d6:98:37:84: + ef:80:c7:47:2a:2d:1b:33:b9:ba:e3:cc:53:36:e0:9f:06:c3: + 92:3c:1a:26:d5:38:1b:11:06:f1:d6:7a:bf:42:52:e9:08:80: + d5:94:16:70:c5:b1:bc:2f:ae:89:07:5f:77:f3:63:21:8b:5f: + 51:09:a4:76:5f:83:d5:b2:f6:04:3d:60:e4:64:f8:a8:2f:d8: + 79:de:15:e3:fa:48:78:37:62:ca:e8:d2:09:ce:73:69:b7:1f: + 90:5f:67:85:b8:65:d2:95:ac:ef:a7:cf:92:95:19:ce:7a:bd: + 45:c0:db:f0:a6:28:d1:3d:0b:ee:28:09:8d:30:e0:17:a3:50: + 2d:03:cb:d7 -----BEGIN CERTIFICATE----- MIIEtzCCA5+gAwIBAgIBZTANBgkqhkiG9w0BAQsFADCBoTELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNo YWluQi1JQ0ExLXBhdGhsZW4wMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTE5MTAxMTAwMjgwOFoXDTIyMDcwNzAwMjgwOFowgZoxCzAJBgNVBAYT +Y29tMB4XDTIwMDUwNzA3MzkwNFoXDTIzMDIwMTA3MzkwNFowgZoxCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRUwEwYD VQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2luZWVyaW5nMRYwFAYDVQQD DA1jaGFpbkItZW50aXR5MR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29t @@ -77,13 +77,13 @@ VR0jBIHGMIHDgBTXkOSGWST5K7gGjrGPM+UsY/EDFqGBp6SBpDCBoTELMAkGA1UE BhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTAT BgNVBAoMDHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNV BAMMFGNoYWluQi1JQ0EyLXBhdGhsZW4xMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdv -bGZzc2wuY29tggFkMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAB/uXIXt -Tjs5aymi72W588dHhY55oDUbqg6YZ6jfA5wrgSTty8zAQkl2v3h7uTnK9gY1dt3j -WcVwO7PPYgoJHQeQlsQOCjiX9zEdrUT5A/kwIrZoAQA4Iz3253Fa5NRZUk+AhuyP -ypIdmweT/jQirJqiqp7+9XuZ/XIyQJiI2EIdM1lMOC6X8p2i/LczzYTBxu/1xdm+ -MrpEZgZiXFUxOLQlGmpk3hQ5tDh0G9fE7IH8OhNL4dGxXzyOJbxjfzB4BE55OoOX -UvYAap7YtcYGIZdKmO7P6IOUIxFsANfpNR+Jd4Wa148pkMZhFOV9VVtmZWBEeYob -WIi5D1+mX3rKaww= +bGZzc2wuY29tggFkMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAExocDsV +SdDXcTaL/e4ZFNCtfWihgXk40r2lSCoK44o4oqDomqXh8kybBmT7e+bRsdpvTdy4 +NAWHc7Z3oAHpL6Rq2r4OFo4H6CBVWW4y6ZRnRvBCAvOEf/gTGEyubxFjxjskHmdK +6pu018NYq4hBMe8Nct9Ag4YdoWpR1pg3hO+Ax0cqLRszubrjzFM24J8Gw5I8GibV +OBsRBvHWer9CUukIgNWUFnDFsbwvrokHX3fzYyGLX1EJpHZfg9Wy9gQ9YORk+Kgv +2HneFeP6SHg3Ysro0gnOc2m3H5BfZ4W4ZdKVrO+nz5KVGc56vUXA2/CmKNE9C+4o +CY0w4BejUC0Dy9c= -----END CERTIFICATE----- Certificate: Data: @@ -92,8 +92,8 @@ Certificate: Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainB-ICA2-pathlen1, emailAddress = info@wolfssl.com Validity - Not Before: Oct 11 00:28:08 2019 GMT - Not After : Jul 7 00:28:08 2022 GMT + Not Before: May 7 07:39:04 2020 GMT + Not After : Feb 1 07:39:04 2023 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainB-ICA1-pathlen0, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -131,27 +131,27 @@ Certificate: X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - cd:0b:7e:66:b9:1d:a8:14:81:a8:e0:b3:74:d9:79:8a:c1:e5: - 15:cf:6a:a7:a3:ca:d2:ad:f8:f6:9f:c2:be:67:ee:cf:9a:3c: - 1c:a3:c4:db:2b:c8:a9:b1:55:94:a1:9e:e3:c2:6c:3a:95:90: - 7e:8f:29:56:c6:99:d2:e5:3b:8f:f3:9a:11:4a:97:22:07:d9: - e2:e5:f8:3e:0f:08:50:43:ea:66:13:6c:20:2e:71:95:10:07: - 88:89:2d:30:9c:96:b1:7e:42:5f:63:c3:8b:71:c6:1d:00:ee: - 83:d7:80:1b:fa:f4:fe:f5:b1:29:f8:c1:ca:1d:89:9b:7c:2a: - 84:00:e4:f5:04:2d:35:be:12:c1:fa:78:cb:bc:c9:04:8a:bf: - 87:57:99:3a:9f:0a:88:a5:e8:94:db:2b:8f:ba:5f:b4:75:7f: - ac:56:75:b4:db:7f:57:24:17:cb:89:f8:cb:8b:c4:b2:44:4a: - d9:57:82:fb:ce:0c:84:e2:2b:a5:f2:90:63:aa:b3:c5:e1:00: - 22:60:8f:23:1f:a8:97:4b:49:f7:f7:cb:92:f7:94:80:52:5b: - 8d:4a:c1:f1:d1:3e:9f:28:96:61:af:8e:72:8d:b6:9e:14:ed: - 14:db:ea:f0:fc:50:39:ca:c8:ab:1e:49:c3:9e:97:0a:d7:1c: - 6f:b2:17:9a + 04:0a:e8:4e:60:2f:29:8d:52:95:ca:47:9b:b1:93:6b:36:99: + 31:ba:8a:62:9b:ff:ad:08:c9:f5:7a:ef:57:00:96:71:c1:fe: + cd:a8:49:44:dd:a4:0f:ef:f8:20:d0:04:42:f9:75:78:df:85: + da:ae:04:4d:ca:35:1a:ab:00:ce:06:32:a5:9f:46:35:71:de: + b9:a7:5b:bb:e2:8e:22:64:47:94:f4:60:da:37:7b:c4:d5:5c: + 89:16:84:b2:8b:91:53:95:2b:ec:c3:7a:c9:b3:f5:ab:53:c8: + c5:65:3a:5b:9c:17:f7:04:b8:1e:e6:28:96:b9:75:03:54:a5: + f2:07:63:d7:86:42:cf:44:ab:ea:79:a0:04:55:a6:5c:2e:63: + d1:7e:13:0b:24:f8:09:1e:ee:66:48:7f:cf:40:a4:61:18:28: + ef:da:d2:5f:68:8d:66:4a:68:d5:be:82:ef:92:70:b5:66:4e: + 5e:6b:55:9e:b5:fa:e3:98:b0:35:d4:b0:a9:3a:35:43:d4:94: + 02:cd:97:47:d2:aa:03:15:24:f3:b4:51:69:f1:78:93:e5:8c: + af:92:2a:00:bf:e6:53:20:08:c3:9a:29:93:82:28:db:df:6f: + 60:28:fc:b5:19:15:32:b7:00:d0:cf:78:b5:3e:9e:7d:74:e9: + 5d:cd:7f:0a -----BEGIN CERTIFICATE----- MIIExjCCA66gAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBoTELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNo YWluQi1JQ0EyLXBhdGhsZW4xMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTE5MTAxMTAwMjgwOFoXDTIyMDcwNzAwMjgwOFowgaExCzAJBgNVBAYT +Y29tMB4XDTIwMDUwNzA3MzkwNFoXDTIzMDIwMTA3MzkwNFowgaExCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRUwEwYD VQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2luZWVyaW5nMR0wGwYDVQQD DBRjaGFpbkItSUNBMS1wYXRobGVuMDEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xm @@ -167,12 +167,12 @@ lDELMAkGA1UEBhMCVVMxEDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVt YW4xETAPBgNVBAoMCFNhd3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYD VQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNz bC5jb22CAWQwDwYDVR0TBAgwBgEB/wIBADALBgNVHQ8EBAMCAQYwDQYJKoZIhvcN -AQELBQADggEBAM0Lfma5HagUgajgs3TZeYrB5RXPaqejytKt+Pafwr5n7s+aPByj -xNsryKmxVZShnuPCbDqVkH6PKVbGmdLlO4/zmhFKlyIH2eLl+D4PCFBD6mYTbCAu -cZUQB4iJLTCclrF+Ql9jw4txxh0A7oPXgBv69P71sSn4wcodiZt8KoQA5PUELTW+ -EsH6eMu8yQSKv4dXmTqfCoil6JTbK4+6X7R1f6xWdbTbf1ckF8uJ+MuLxLJEStlX -gvvODITiK6XykGOqs8XhACJgjyMfqJdLSff3y5L3lIBSW41KwfHRPp8olmGvjnKN -tp4U7RTb6vD8UDnKyKseScOelwrXHG+yF5o= +AQELBQADggEBAAQK6E5gLymNUpXKR5uxk2s2mTG6imKb/60IyfV671cAlnHB/s2o +SUTdpA/v+CDQBEL5dXjfhdquBE3KNRqrAM4GMqWfRjVx3rmnW7vijiJkR5T0YNo3 +e8TVXIkWhLKLkVOVK+zDesmz9atTyMVlOlucF/cEuB7mKJa5dQNUpfIHY9eGQs9E +q+p5oARVplwuY9F+Ewsk+Ake7mZIf89ApGEYKO/a0l9ojWZKaNW+gu+ScLVmTl5r +VZ61+uOYsDXUsKk6NUPUlALNl0fSqgMVJPO0UWnxeJPljK+SKgC/5lMgCMOaKZOC +KNvfb2Ao/LUZFTK3ANDPeLU+nn106V3Nfwo= -----END CERTIFICATE----- Certificate: Data: @@ -181,8 +181,8 @@ Certificate: Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Oct 11 00:28:08 2019 GMT - Not After : Jul 7 00:28:08 2022 GMT + Not Before: May 7 07:39:04 2020 GMT + Not After : Feb 1 07:39:04 2023 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainB-ICA2-pathlen1, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -213,34 +213,34 @@ Certificate: X509v3 Authority Key Identifier: keyid:27:8E:67:11:74:C3:26:1D:3F:ED:33:63:B3:A4:D8:1D:30:E5:E8:D5 DirName:/C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:86:FF:F5:8E:10:DE:B8:FB + serial:3F:32:13:52:92:C6:DF:4A:D5:42:05:6C:B0:B2:2E:46:C2:F8:B8:67 X509v3 Basic Constraints: CA:TRUE, pathlen:1 X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - ab:c7:2b:9d:15:73:97:47:e0:88:32:9d:10:71:81:53:62:97: - dc:c4:72:73:49:3e:50:50:10:03:1e:22:58:82:e0:b3:da:ca: - 89:92:70:c8:54:0d:8e:a6:44:a0:26:5d:5d:52:d2:fb:63:e4: - 13:7e:30:9a:13:25:4e:c8:34:a1:c9:e6:69:24:64:98:e3:88: - 9c:86:18:62:53:70:ae:f0:d9:ed:f3:0c:e8:ec:5b:e5:27:85: - 16:d0:b0:f6:bd:5d:9a:62:41:26:25:31:88:70:fe:25:97:48: - f1:e6:21:1c:78:f7:68:03:59:21:db:f1:c5:92:96:24:b8:23: - fc:ab:52:95:70:6a:52:16:4d:fc:36:6b:5f:58:4f:3f:c9:f4: - e7:6e:52:41:42:99:41:07:c2:75:74:db:c2:49:84:7c:3f:c1: - ac:bd:d4:d5:8f:d0:73:95:18:8a:5d:f0:8d:dd:2d:f0:b7:61: - 8d:8a:ef:14:9f:fd:30:ba:10:e8:57:d3:1b:8e:2d:9b:74:b3: - 63:0d:0e:8c:f9:a2:f7:42:c8:e6:5e:83:6f:0f:9a:85:3b:6e: - 66:48:b9:a7:a8:fc:da:19:47:0c:90:26:0d:ce:15:fe:6a:1e: - 47:5a:49:f8:76:0f:3a:a8:68:cd:a6:38:4c:a6:ca:b2:b0:9b: - c7:46:43:cd + 92:d5:a7:bc:16:7e:7f:40:27:a1:7c:50:74:a7:30:4f:5a:6c: + 1b:d3:d9:78:77:85:8d:7b:d1:16:52:65:06:9f:45:22:81:37: + ca:48:d1:6c:bb:87:7f:6a:1f:72:76:a9:93:74:2a:65:c8:99: + 87:15:ae:50:ed:9b:cd:1a:e0:20:14:ec:31:cf:99:92:c1:86: + b3:e9:bc:74:b8:7f:c3:b7:17:5b:80:94:a7:85:82:4e:17:2f: + 37:69:e1:ed:4b:05:07:77:ba:02:d1:fd:b1:34:d9:2a:45:53: + 9b:3d:18:52:be:fd:48:78:10:a0:bf:da:29:b0:7e:4d:c4:1e: + 20:b6:6e:59:fb:04:76:fa:df:16:95:01:3c:47:38:32:bd:f0: + 75:b7:0c:8c:29:61:f1:ed:a0:89:93:b3:6c:a5:7d:50:83:e2: + a5:04:f5:55:6f:fa:8c:dc:ab:ca:f8:d7:86:ce:62:2a:7f:14: + 17:8c:ef:56:a0:bb:67:06:a7:c2:7c:d2:66:21:29:16:8f:72: + 24:95:1c:63:45:c1:cf:1a:d4:7d:04:1e:6a:a1:5b:45:10:e5: + cb:a3:60:3f:da:71:d3:d2:6c:e4:32:dc:9a:8f:f1:9e:bf:f1: + 8a:75:56:26:e7:26:97:a9:1f:7b:5d:e7:a4:10:c3:c6:64:53: + ce:8c:92:7c -----BEGIN CERTIFICATE----- -MIIEwTCCA6mgAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx +MIIEzDCCA7SgAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx EDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNh d3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cud29sZnNz -bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMTkxMDEx -MDAyODA4WhcNMjIwNzA3MDAyODA4WjCBoTELMAkGA1UEBhMCVVMxEzARBgNVBAgM +bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjAwNTA3 +MDczOTA0WhcNMjMwMjAxMDczOTA0WjCBoTELMAkGA1UEBhMCVVMxEzARBgNVBAgM Cldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoMDHdvbGZTU0wg SW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNoYWluQi1JQ0Ey LXBhdGhsZW4xMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMIIBIjAN @@ -250,16 +250,16 @@ wt+hVv6Vl1ZeW/502fIuyn7bUHda0ZDcItb+S8BXocY7SrqtBRTJJGh2teIm1ctQ /dB3DowMuV73pJpFNWxiyuk41BCaXDClTyZHAwNzVoWMvvXQwAkGPg7o5X3QGVTt V+xRz7yVFZHP0JqE3YpQfDPCGmFwMZoZFyizjNpfuNIGa4I/tmooKYa0IMulr3Nm 5Dc2gfA/rb8FuNsuxCLi60aH9GDRpn/unEGn86rpN93a1vDNSKxR0XeNoQIDAQAB -o4IBDTCCAQkwHQYDVR0OBBYEFO5ZnVYLfApFROMVV+Ky8x1kb696MIHJBgNVHSME -gcEwgb6AFCeOZxF0wyYdP+0zY7Ok2B0w5ejVoYGapIGXMIGUMQswCQYDVQQGEwJV +o4IBGDCCARQwHQYDVR0OBBYEFO5ZnVYLfApFROMVV+Ky8x1kb696MIHUBgNVHSME +gcwwgcmAFCeOZxF0wyYdP+0zY7Ok2B0w5ejVoYGapIGXMIGUMQswCQYDVQQGEwJV UzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjERMA8GA1UECgwI U2F3dG9vdGgxEzARBgNVBAsMCkNvbnN1bHRpbmcxGDAWBgNVBAMMD3d3dy53b2xm -c3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIJAIb/9Y4Q -3rj7MA8GA1UdEwQIMAYBAf8CAQEwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBCwUA -A4IBAQCrxyudFXOXR+CIMp0QcYFTYpfcxHJzST5QUBADHiJYguCz2sqJknDIVA2O -pkSgJl1dUtL7Y+QTfjCaEyVOyDShyeZpJGSY44ichhhiU3Cu8Nnt8wzo7FvlJ4UW -0LD2vV2aYkEmJTGIcP4ll0jx5iEcePdoA1kh2/HFkpYkuCP8q1KVcGpSFk38Nmtf -WE8/yfTnblJBQplBB8J1dNvCSYR8P8GsvdTVj9BzlRiKXfCN3S3wt2GNiu8Un/0w -uhDoV9Mbji2bdLNjDQ6M+aL3QsjmXoNvD5qFO25mSLmnqPzaGUcMkCYNzhX+ah5H -Wkn4dg86qGjNpjhMpsqysJvHRkPN +c3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIUPzITUpLG +30rVQgVssLIuRsL4uGcwDwYDVR0TBAgwBgEB/wIBATALBgNVHQ8EBAMCAQYwDQYJ +KoZIhvcNAQELBQADggEBAJLVp7wWfn9AJ6F8UHSnME9abBvT2Xh3hY170RZSZQaf +RSKBN8pI0Wy7h39qH3J2qZN0KmXImYcVrlDtm80a4CAU7DHPmZLBhrPpvHS4f8O3 +F1uAlKeFgk4XLzdp4e1LBQd3ugLR/bE02SpFU5s9GFK+/Uh4EKC/2imwfk3EHiC2 +bln7BHb63xaVATxHODK98HW3DIwpYfHtoImTs2ylfVCD4qUE9VVv+ozcq8r414bO +Yip/FBeM71agu2cGp8J80mYhKRaPciSVHGNFwc8a1H0EHmqhW0UQ5cujYD/acdPS +bOQy3JqP8Z6/8Yp1VibnJpepH3td56QQw8ZkU86Mknw= -----END CERTIFICATE----- diff --git a/certs/test-pathlen/chainB-entity.pem b/certs/test-pathlen/chainB-entity.pem index cca6f6697..50f8f4e56 100644 --- a/certs/test-pathlen/chainB-entity.pem +++ b/certs/test-pathlen/chainB-entity.pem @@ -5,8 +5,8 @@ Certificate: Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainB-ICA1-pathlen0, emailAddress = info@wolfssl.com Validity - Not Before: Oct 11 00:28:08 2019 GMT - Not After : Jul 7 00:28:08 2022 GMT + Not Before: May 7 07:39:04 2020 GMT + Not After : Feb 1 07:39:04 2023 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainB-entity, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -42,27 +42,27 @@ Certificate: X509v3 Basic Constraints: CA:FALSE Signature Algorithm: sha256WithRSAEncryption - 1f:ee:5c:85:ed:4e:3b:39:6b:29:a2:ef:65:b9:f3:c7:47:85: - 8e:79:a0:35:1b:aa:0e:98:67:a8:df:03:9c:2b:81:24:ed:cb: - cc:c0:42:49:76:bf:78:7b:b9:39:ca:f6:06:35:76:dd:e3:59: - c5:70:3b:b3:cf:62:0a:09:1d:07:90:96:c4:0e:0a:38:97:f7: - 31:1d:ad:44:f9:03:f9:30:22:b6:68:01:00:38:23:3d:f6:e7: - 71:5a:e4:d4:59:52:4f:80:86:ec:8f:ca:92:1d:9b:07:93:fe: - 34:22:ac:9a:a2:aa:9e:fe:f5:7b:99:fd:72:32:40:98:88:d8: - 42:1d:33:59:4c:38:2e:97:f2:9d:a2:fc:b7:33:cd:84:c1:c6: - ef:f5:c5:d9:be:32:ba:44:66:06:62:5c:55:31:38:b4:25:1a: - 6a:64:de:14:39:b4:38:74:1b:d7:c4:ec:81:fc:3a:13:4b:e1: - d1:b1:5f:3c:8e:25:bc:63:7f:30:78:04:4e:79:3a:83:97:52: - f6:00:6a:9e:d8:b5:c6:06:21:97:4a:98:ee:cf:e8:83:94:23: - 11:6c:00:d7:e9:35:1f:89:77:85:9a:d7:8f:29:90:c6:61:14: - e5:7d:55:5b:66:65:60:44:79:8a:1b:58:88:b9:0f:5f:a6:5f: - 7a:ca:6b:0c + 4c:68:70:3b:15:49:d0:d7:71:36:8b:fd:ee:19:14:d0:ad:7d: + 68:a1:81:79:38:d2:bd:a5:48:2a:0a:e3:8a:38:a2:a0:e8:9a: + a5:e1:f2:4c:9b:06:64:fb:7b:e6:d1:b1:da:6f:4d:dc:b8:34: + 05:87:73:b6:77:a0:01:e9:2f:a4:6a:da:be:0e:16:8e:07:e8: + 20:55:59:6e:32:e9:94:67:46:f0:42:02:f3:84:7f:f8:13:18: + 4c:ae:6f:11:63:c6:3b:24:1e:67:4a:ea:9b:b4:d7:c3:58:ab: + 88:41:31:ef:0d:72:df:40:83:86:1d:a1:6a:51:d6:98:37:84: + ef:80:c7:47:2a:2d:1b:33:b9:ba:e3:cc:53:36:e0:9f:06:c3: + 92:3c:1a:26:d5:38:1b:11:06:f1:d6:7a:bf:42:52:e9:08:80: + d5:94:16:70:c5:b1:bc:2f:ae:89:07:5f:77:f3:63:21:8b:5f: + 51:09:a4:76:5f:83:d5:b2:f6:04:3d:60:e4:64:f8:a8:2f:d8: + 79:de:15:e3:fa:48:78:37:62:ca:e8:d2:09:ce:73:69:b7:1f: + 90:5f:67:85:b8:65:d2:95:ac:ef:a7:cf:92:95:19:ce:7a:bd: + 45:c0:db:f0:a6:28:d1:3d:0b:ee:28:09:8d:30:e0:17:a3:50: + 2d:03:cb:d7 -----BEGIN CERTIFICATE----- MIIEtzCCA5+gAwIBAgIBZTANBgkqhkiG9w0BAQsFADCBoTELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNo YWluQi1JQ0ExLXBhdGhsZW4wMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTE5MTAxMTAwMjgwOFoXDTIyMDcwNzAwMjgwOFowgZoxCzAJBgNVBAYT +Y29tMB4XDTIwMDUwNzA3MzkwNFoXDTIzMDIwMTA3MzkwNFowgZoxCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRUwEwYD VQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2luZWVyaW5nMRYwFAYDVQQD DA1jaGFpbkItZW50aXR5MR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29t @@ -77,11 +77,11 @@ VR0jBIHGMIHDgBTXkOSGWST5K7gGjrGPM+UsY/EDFqGBp6SBpDCBoTELMAkGA1UE BhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTAT BgNVBAoMDHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNV BAMMFGNoYWluQi1JQ0EyLXBhdGhsZW4xMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdv -bGZzc2wuY29tggFkMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAB/uXIXt -Tjs5aymi72W588dHhY55oDUbqg6YZ6jfA5wrgSTty8zAQkl2v3h7uTnK9gY1dt3j -WcVwO7PPYgoJHQeQlsQOCjiX9zEdrUT5A/kwIrZoAQA4Iz3253Fa5NRZUk+AhuyP -ypIdmweT/jQirJqiqp7+9XuZ/XIyQJiI2EIdM1lMOC6X8p2i/LczzYTBxu/1xdm+ -MrpEZgZiXFUxOLQlGmpk3hQ5tDh0G9fE7IH8OhNL4dGxXzyOJbxjfzB4BE55OoOX -UvYAap7YtcYGIZdKmO7P6IOUIxFsANfpNR+Jd4Wa148pkMZhFOV9VVtmZWBEeYob -WIi5D1+mX3rKaww= +bGZzc2wuY29tggFkMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAExocDsV +SdDXcTaL/e4ZFNCtfWihgXk40r2lSCoK44o4oqDomqXh8kybBmT7e+bRsdpvTdy4 +NAWHc7Z3oAHpL6Rq2r4OFo4H6CBVWW4y6ZRnRvBCAvOEf/gTGEyubxFjxjskHmdK +6pu018NYq4hBMe8Nct9Ag4YdoWpR1pg3hO+Ax0cqLRszubrjzFM24J8Gw5I8GibV +OBsRBvHWer9CUukIgNWUFnDFsbwvrokHX3fzYyGLX1EJpHZfg9Wy9gQ9YORk+Kgv +2HneFeP6SHg3Ysro0gnOc2m3H5BfZ4W4ZdKVrO+nz5KVGc56vUXA2/CmKNE9C+4o +CY0w4BejUC0Dy9c= -----END CERTIFICATE----- diff --git a/certs/test-pathlen/chainC-ICA1-pathlen1.pem b/certs/test-pathlen/chainC-ICA1-pathlen1.pem index 64cbc0c6b..7bb927d24 100644 --- a/certs/test-pathlen/chainC-ICA1-pathlen1.pem +++ b/certs/test-pathlen/chainC-ICA1-pathlen1.pem @@ -5,8 +5,8 @@ Certificate: Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Oct 11 00:28:08 2019 GMT - Not After : Jul 7 00:28:08 2022 GMT + Not Before: May 7 07:39:04 2020 GMT + Not After : Feb 1 07:39:04 2023 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainC-ICA1-pathlen1, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -37,34 +37,34 @@ Certificate: X509v3 Authority Key Identifier: keyid:27:8E:67:11:74:C3:26:1D:3F:ED:33:63:B3:A4:D8:1D:30:E5:E8:D5 DirName:/C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:86:FF:F5:8E:10:DE:B8:FB + serial:3F:32:13:52:92:C6:DF:4A:D5:42:05:6C:B0:B2:2E:46:C2:F8:B8:67 X509v3 Basic Constraints: CA:TRUE, pathlen:1 X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 65:d2:6a:a3:a2:98:ac:5a:53:e4:b4:02:66:8e:9c:64:fa:53: - 88:a7:31:09:fa:31:4d:27:7a:17:7a:1c:8f:13:2a:e5:60:e4: - f2:0f:6a:e6:a6:48:ed:e4:17:0e:cb:57:77:66:98:c0:37:2f: - 00:26:1e:1a:a8:e4:ad:9e:c9:47:4d:6c:c5:57:75:79:97:be: - 0f:82:92:aa:b0:df:0d:f4:25:49:fd:c6:6f:e7:70:f1:f0:0d: - e7:13:81:ed:a1:1e:69:f3:10:3d:3e:3c:5b:c0:71:fb:44:47: - e2:bc:51:62:6c:21:7a:ea:ad:74:f5:46:35:63:93:ab:f9:89: - 31:e6:01:5f:eb:ca:df:d3:93:86:3d:8b:0a:88:79:f1:b1:47: - df:1f:2e:a0:7e:34:f6:80:30:7d:bd:e5:70:43:0d:76:2a:fc: - fe:38:4f:3a:bc:58:52:81:37:5e:e9:3b:26:f4:8d:20:5f:f2: - 44:56:e8:b8:cc:42:7a:5e:67:28:34:c3:8f:a9:08:87:92:4b: - bc:1d:3b:d1:1a:d8:79:20:eb:4a:6f:87:b3:3b:ef:2f:a6:98: - 34:48:a6:43:ba:d4:fa:65:6f:54:9b:28:a1:e1:77:fe:0e:91: - 0b:4f:f5:95:3e:b3:c9:4e:2d:17:67:37:5b:d5:dd:83:ef:a4: - b4:41:53:36 + 05:43:77:49:21:83:0c:6c:55:93:aa:fc:9d:e3:37:c8:d5:ee: + c8:98:f4:db:63:e3:fe:4f:ce:aa:a8:4b:db:ec:0d:b9:07:a9: + f2:9f:72:b6:5f:68:17:be:ae:75:87:af:5f:d1:bd:e6:34:9a: + a1:21:8b:91:96:5d:d2:8e:1c:3c:46:a6:9e:5c:c4:60:5e:c2: + be:bb:15:91:71:45:c7:28:93:69:f0:e0:ee:1a:93:6e:15:fe: + c5:2d:7a:ee:a1:2f:f3:60:36:b7:28:65:4e:07:9b:79:bb:c2: + af:8b:78:51:f5:47:0b:0e:f1:5d:4e:57:04:86:28:98:14:c8: + de:d9:83:16:fe:57:79:41:0d:60:24:fd:73:cd:82:e9:d4:3c: + 47:f6:dc:03:f3:0a:5b:3d:66:e2:53:18:71:1c:aa:3b:a1:0f: + 9d:00:ed:10:5a:1f:5f:61:ff:36:36:52:79:71:a4:9b:58:92: + 1b:c4:38:d6:e2:4b:05:62:24:9e:32:0d:a9:67:09:e3:1f:5f: + e2:7a:4e:bd:99:b0:1a:ad:ee:bc:20:99:c1:ed:3b:fe:88:ff: + 58:3f:2a:7d:de:e1:48:49:29:d2:43:31:84:f2:1d:d8:02:2d: + 78:a7:7a:91:03:c4:59:08:c6:87:5b:5f:06:b7:8a:68:60:d5: + 7e:6b:15:8a -----BEGIN CERTIFICATE----- -MIIEwTCCA6mgAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx +MIIEzDCCA7SgAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx EDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNh d3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cud29sZnNz -bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMTkxMDEx -MDAyODA4WhcNMjIwNzA3MDAyODA4WjCBoTELMAkGA1UEBhMCVVMxEzARBgNVBAgM +bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjAwNTA3 +MDczOTA0WhcNMjMwMjAxMDczOTA0WjCBoTELMAkGA1UEBhMCVVMxEzARBgNVBAgM Cldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoMDHdvbGZTU0wg SW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNoYWluQy1JQ0Ex LXBhdGhsZW4xMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMIIBIjAN @@ -74,16 +74,16 @@ T/w3Jk5UedcXOVB5bqMpmQetnVzY4QLnM37k2qQFvGID059qkZJm3SnQlfsvP/BZ uHBbJVR7oAqfMwlk7fvUHC2WVEXjUJj/sX+axs8Jo9rpV60dBY8edXXn0gcz3tp9 QtgOlP6ux5vDtZ7zayGfdMSzMnwoTg+8FTO6nAk8wUAGeLuxID9hFfYeSXNRiZUt lb801sKp0TQdjSFtT6Nu7/wjonb80CVTDkN2O+2C7NgjyzPvPJ2h3uZ6rQIDAQAB -o4IBDTCCAQkwHQYDVR0OBBYEFJQdLgc3xi9Swex5axPOCZBf9MRRMIHJBgNVHSME -gcEwgb6AFCeOZxF0wyYdP+0zY7Ok2B0w5ejVoYGapIGXMIGUMQswCQYDVQQGEwJV +o4IBGDCCARQwHQYDVR0OBBYEFJQdLgc3xi9Swex5axPOCZBf9MRRMIHUBgNVHSME +gcwwgcmAFCeOZxF0wyYdP+0zY7Ok2B0w5ejVoYGapIGXMIGUMQswCQYDVQQGEwJV UzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjERMA8GA1UECgwI U2F3dG9vdGgxEzARBgNVBAsMCkNvbnN1bHRpbmcxGDAWBgNVBAMMD3d3dy53b2xm -c3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIJAIb/9Y4Q -3rj7MA8GA1UdEwQIMAYBAf8CAQEwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBCwUA -A4IBAQBl0mqjopisWlPktAJmjpxk+lOIpzEJ+jFNJ3oXehyPEyrlYOTyD2rmpkjt -5BcOy1d3ZpjANy8AJh4aqOStnslHTWzFV3V5l74PgpKqsN8N9CVJ/cZv53Dx8A3n -E4HtoR5p8xA9PjxbwHH7REfivFFibCF66q109UY1Y5Or+Ykx5gFf68rf05OGPYsK -iHnxsUffHy6gfjT2gDB9veVwQw12Kvz+OE86vFhSgTde6Tsm9I0gX/JEVui4zEJ6 -XmcoNMOPqQiHkku8HTvRGth5IOtKb4ezO+8vppg0SKZDutT6ZW9Umyih4Xf+DpEL -T/WVPrPJTi0XZzdb1d2D76S0QVM2 +c3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIUPzITUpLG +30rVQgVssLIuRsL4uGcwDwYDVR0TBAgwBgEB/wIBATALBgNVHQ8EBAMCAQYwDQYJ +KoZIhvcNAQELBQADggEBAAVDd0khgwxsVZOq/J3jN8jV7siY9Ntj4/5PzqqoS9vs +DbkHqfKfcrZfaBe+rnWHr1/RveY0mqEhi5GWXdKOHDxGpp5cxGBewr67FZFxRcco +k2nw4O4ak24V/sUteu6hL/NgNrcoZU4Hm3m7wq+LeFH1RwsO8V1OVwSGKJgUyN7Z +gxb+V3lBDWAk/XPNgunUPEf23APzCls9ZuJTGHEcqjuhD50A7RBaH19h/zY2Unlx +pJtYkhvEONbiSwViJJ4yDalnCeMfX+J6Tr2ZsBqt7rwgmcHtO/6I/1g/Kn3e4UhJ +KdJDMYTyHdgCLXinepEDxFkIxodbXwa3imhg1X5rFYo= -----END CERTIFICATE----- diff --git a/certs/test-pathlen/chainC-assembled.pem b/certs/test-pathlen/chainC-assembled.pem index 0fae68780..a0a99f0e6 100644 --- a/certs/test-pathlen/chainC-assembled.pem +++ b/certs/test-pathlen/chainC-assembled.pem @@ -5,8 +5,8 @@ Certificate: Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainC-ICA1-pathlen1, emailAddress = info@wolfssl.com Validity - Not Before: Oct 11 00:28:08 2019 GMT - Not After : Jul 7 00:28:08 2022 GMT + Not Before: May 7 07:39:04 2020 GMT + Not After : Feb 1 07:39:04 2023 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainC-entity, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -42,27 +42,27 @@ Certificate: X509v3 Basic Constraints: CA:FALSE Signature Algorithm: sha256WithRSAEncryption - b7:d0:5e:86:77:76:45:77:c3:f8:5c:cd:9b:84:52:b7:8b:d6: - 84:ed:d3:1b:fa:7f:27:d1:24:05:11:9d:bf:74:eb:14:93:ee: - 08:2c:16:0a:d8:00:46:31:e3:43:f1:95:64:b1:72:93:49:fa: - fe:73:e8:be:2a:02:95:e8:3a:56:f3:aa:8b:fa:cb:3a:f5:06: - a2:00:ae:19:36:86:be:93:79:3f:58:f7:95:de:a8:e2:12:89: - 52:2f:a0:be:09:3e:18:69:19:d5:96:7c:94:9a:ee:ab:f1:2b: - 74:54:c9:1c:0a:5f:aa:d1:62:34:24:33:f8:5e:b2:43:9c:c9: - e6:8c:fa:b5:89:a7:3e:6b:51:00:a6:e3:d5:c4:f9:ac:78:a5: - 4d:85:7c:e3:7d:f9:b5:e8:ad:3e:32:56:fb:99:bf:f9:3b:a4: - 98:04:72:cd:ea:95:08:af:7e:62:2d:74:e4:25:48:43:25:ba: - 07:7c:00:c9:31:41:6f:59:ff:da:bb:ac:08:06:18:1a:0a:3d: - 1d:2e:ad:98:2c:06:72:51:f2:75:7c:87:ef:e0:37:f6:80:70: - aa:8d:d9:a8:13:e5:31:91:3c:e3:0f:21:33:0a:15:91:1c:4d: - 3a:1b:35:f6:4c:f5:5f:70:34:b2:dc:ed:10:5d:37:58:16:e4: - e0:83:12:90 + 15:72:e5:58:c1:68:5f:5a:e0:8c:93:4e:2d:e2:74:4d:da:54: + ce:59:5a:3f:3c:36:b9:4a:30:3d:62:f9:9a:fd:dd:c8:cc:f1: + 39:3e:e7:06:1a:ed:b9:0e:2d:13:39:61:5a:1e:75:77:82:d3: + 12:a8:05:99:5e:88:d4:fe:86:89:d3:b4:d0:6c:80:84:51:62: + dd:9c:d9:1d:30:40:18:e5:79:70:54:6d:b5:21:33:7b:55:49: + 69:76:68:96:0f:a8:0c:3a:82:1d:b6:21:83:89:c1:dc:2b:7f: + 45:89:29:ff:d5:48:4d:20:28:0b:15:54:28:f3:0a:f3:f3:a8: + ba:a5:5e:18:c3:dd:7f:07:9f:91:f5:e5:98:c5:bb:8a:9b:14: + aa:6c:20:6a:44:2d:35:3d:7f:99:68:84:08:91:95:f4:b0:e3: + f3:cd:bd:26:de:d2:af:5b:78:86:65:00:6f:60:67:a4:88:f0: + 41:98:62:f7:6d:cf:a9:24:44:4a:02:cf:9d:7d:ac:d5:d9:86: + 30:c0:d9:ae:5a:6c:09:e6:bd:cf:80:2f:a3:6a:22:de:c6:bd: + 2c:66:ef:a6:b2:e3:9e:58:e7:27:9a:23:b0:39:84:aa:d6:c9: + 2e:04:c8:2e:5c:70:d5:22:f6:2a:65:7c:66:1f:03:6c:29:31: + d4:0d:46:71 -----BEGIN CERTIFICATE----- MIIEqjCCA5KgAwIBAgIBZTANBgkqhkiG9w0BAQsFADCBoTELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNo YWluQy1JQ0ExLXBhdGhsZW4xMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTE5MTAxMTAwMjgwOFoXDTIyMDcwNzAwMjgwOFowgZoxCzAJBgNVBAYT +Y29tMB4XDTIwMDUwNzA3MzkwNFoXDTIzMDIwMTA3MzkwNFowgZoxCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRUwEwYD VQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2luZWVyaW5nMRYwFAYDVQQD DA1jaGFpbkMtZW50aXR5MR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29t @@ -77,12 +77,12 @@ VR0jBIG5MIG2gBSUHS4HN8YvUsHseWsTzgmQX/TEUaGBmqSBlzCBlDELMAkGA1UE BhMCVVMxEDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNV BAoMCFNhd3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cu d29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb22CAWQw -CQYDVR0TBAIwADANBgkqhkiG9w0BAQsFAAOCAQEAt9Behnd2RXfD+FzNm4RSt4vW -hO3TG/p/J9EkBRGdv3TrFJPuCCwWCtgARjHjQ/GVZLFyk0n6/nPovioCleg6VvOq -i/rLOvUGogCuGTaGvpN5P1j3ld6o4hKJUi+gvgk+GGkZ1ZZ8lJruq/ErdFTJHApf -qtFiNCQz+F6yQ5zJ5oz6tYmnPmtRAKbj1cT5rHilTYV84335teitPjJW+5m/+Tuk -mARyzeqVCK9+Yi105CVIQyW6B3wAyTFBb1n/2rusCAYYGgo9HS6tmCwGclHydXyH -7+A39oBwqo3ZqBPlMZE84w8hMwoVkRxNOhs19kz1X3A0stztEF03WBbk4IMSkA== +CQYDVR0TBAIwADANBgkqhkiG9w0BAQsFAAOCAQEAFXLlWMFoX1rgjJNOLeJ0TdpU +zllaPzw2uUowPWL5mv3dyMzxOT7nBhrtuQ4tEzlhWh51d4LTEqgFmV6I1P6GidO0 +0GyAhFFi3ZzZHTBAGOV5cFRttSEze1VJaXZolg+oDDqCHbYhg4nB3Ct/RYkp/9VI +TSAoCxVUKPMK8/OouqVeGMPdfwefkfXlmMW7ipsUqmwgakQtNT1/mWiECJGV9LDj +8829Jt7Sr1t4hmUAb2BnpIjwQZhi923PqSRESgLPnX2s1dmGMMDZrlpsCea9z4Av +o2oi3sa9LGbvprLjnljnJ5ojsDmEqtbJLgTILlxw1SL2KmV8Zh8DbCkx1A1GcQ== -----END CERTIFICATE----- Certificate: Data: @@ -91,8 +91,8 @@ Certificate: Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Oct 11 00:28:08 2019 GMT - Not After : Jul 7 00:28:08 2022 GMT + Not Before: May 7 07:39:04 2020 GMT + Not After : Feb 1 07:39:04 2023 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainC-ICA1-pathlen1, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -123,34 +123,34 @@ Certificate: X509v3 Authority Key Identifier: keyid:27:8E:67:11:74:C3:26:1D:3F:ED:33:63:B3:A4:D8:1D:30:E5:E8:D5 DirName:/C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:86:FF:F5:8E:10:DE:B8:FB + serial:3F:32:13:52:92:C6:DF:4A:D5:42:05:6C:B0:B2:2E:46:C2:F8:B8:67 X509v3 Basic Constraints: CA:TRUE, pathlen:1 X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 65:d2:6a:a3:a2:98:ac:5a:53:e4:b4:02:66:8e:9c:64:fa:53: - 88:a7:31:09:fa:31:4d:27:7a:17:7a:1c:8f:13:2a:e5:60:e4: - f2:0f:6a:e6:a6:48:ed:e4:17:0e:cb:57:77:66:98:c0:37:2f: - 00:26:1e:1a:a8:e4:ad:9e:c9:47:4d:6c:c5:57:75:79:97:be: - 0f:82:92:aa:b0:df:0d:f4:25:49:fd:c6:6f:e7:70:f1:f0:0d: - e7:13:81:ed:a1:1e:69:f3:10:3d:3e:3c:5b:c0:71:fb:44:47: - e2:bc:51:62:6c:21:7a:ea:ad:74:f5:46:35:63:93:ab:f9:89: - 31:e6:01:5f:eb:ca:df:d3:93:86:3d:8b:0a:88:79:f1:b1:47: - df:1f:2e:a0:7e:34:f6:80:30:7d:bd:e5:70:43:0d:76:2a:fc: - fe:38:4f:3a:bc:58:52:81:37:5e:e9:3b:26:f4:8d:20:5f:f2: - 44:56:e8:b8:cc:42:7a:5e:67:28:34:c3:8f:a9:08:87:92:4b: - bc:1d:3b:d1:1a:d8:79:20:eb:4a:6f:87:b3:3b:ef:2f:a6:98: - 34:48:a6:43:ba:d4:fa:65:6f:54:9b:28:a1:e1:77:fe:0e:91: - 0b:4f:f5:95:3e:b3:c9:4e:2d:17:67:37:5b:d5:dd:83:ef:a4: - b4:41:53:36 + 05:43:77:49:21:83:0c:6c:55:93:aa:fc:9d:e3:37:c8:d5:ee: + c8:98:f4:db:63:e3:fe:4f:ce:aa:a8:4b:db:ec:0d:b9:07:a9: + f2:9f:72:b6:5f:68:17:be:ae:75:87:af:5f:d1:bd:e6:34:9a: + a1:21:8b:91:96:5d:d2:8e:1c:3c:46:a6:9e:5c:c4:60:5e:c2: + be:bb:15:91:71:45:c7:28:93:69:f0:e0:ee:1a:93:6e:15:fe: + c5:2d:7a:ee:a1:2f:f3:60:36:b7:28:65:4e:07:9b:79:bb:c2: + af:8b:78:51:f5:47:0b:0e:f1:5d:4e:57:04:86:28:98:14:c8: + de:d9:83:16:fe:57:79:41:0d:60:24:fd:73:cd:82:e9:d4:3c: + 47:f6:dc:03:f3:0a:5b:3d:66:e2:53:18:71:1c:aa:3b:a1:0f: + 9d:00:ed:10:5a:1f:5f:61:ff:36:36:52:79:71:a4:9b:58:92: + 1b:c4:38:d6:e2:4b:05:62:24:9e:32:0d:a9:67:09:e3:1f:5f: + e2:7a:4e:bd:99:b0:1a:ad:ee:bc:20:99:c1:ed:3b:fe:88:ff: + 58:3f:2a:7d:de:e1:48:49:29:d2:43:31:84:f2:1d:d8:02:2d: + 78:a7:7a:91:03:c4:59:08:c6:87:5b:5f:06:b7:8a:68:60:d5: + 7e:6b:15:8a -----BEGIN CERTIFICATE----- -MIIEwTCCA6mgAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx +MIIEzDCCA7SgAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx EDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNh d3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cud29sZnNz -bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMTkxMDEx -MDAyODA4WhcNMjIwNzA3MDAyODA4WjCBoTELMAkGA1UEBhMCVVMxEzARBgNVBAgM +bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjAwNTA3 +MDczOTA0WhcNMjMwMjAxMDczOTA0WjCBoTELMAkGA1UEBhMCVVMxEzARBgNVBAgM Cldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoMDHdvbGZTU0wg SW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNoYWluQy1JQ0Ex LXBhdGhsZW4xMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMIIBIjAN @@ -160,16 +160,16 @@ T/w3Jk5UedcXOVB5bqMpmQetnVzY4QLnM37k2qQFvGID059qkZJm3SnQlfsvP/BZ uHBbJVR7oAqfMwlk7fvUHC2WVEXjUJj/sX+axs8Jo9rpV60dBY8edXXn0gcz3tp9 QtgOlP6ux5vDtZ7zayGfdMSzMnwoTg+8FTO6nAk8wUAGeLuxID9hFfYeSXNRiZUt lb801sKp0TQdjSFtT6Nu7/wjonb80CVTDkN2O+2C7NgjyzPvPJ2h3uZ6rQIDAQAB -o4IBDTCCAQkwHQYDVR0OBBYEFJQdLgc3xi9Swex5axPOCZBf9MRRMIHJBgNVHSME -gcEwgb6AFCeOZxF0wyYdP+0zY7Ok2B0w5ejVoYGapIGXMIGUMQswCQYDVQQGEwJV +o4IBGDCCARQwHQYDVR0OBBYEFJQdLgc3xi9Swex5axPOCZBf9MRRMIHUBgNVHSME +gcwwgcmAFCeOZxF0wyYdP+0zY7Ok2B0w5ejVoYGapIGXMIGUMQswCQYDVQQGEwJV UzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjERMA8GA1UECgwI U2F3dG9vdGgxEzARBgNVBAsMCkNvbnN1bHRpbmcxGDAWBgNVBAMMD3d3dy53b2xm -c3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIJAIb/9Y4Q -3rj7MA8GA1UdEwQIMAYBAf8CAQEwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBCwUA -A4IBAQBl0mqjopisWlPktAJmjpxk+lOIpzEJ+jFNJ3oXehyPEyrlYOTyD2rmpkjt -5BcOy1d3ZpjANy8AJh4aqOStnslHTWzFV3V5l74PgpKqsN8N9CVJ/cZv53Dx8A3n -E4HtoR5p8xA9PjxbwHH7REfivFFibCF66q109UY1Y5Or+Ykx5gFf68rf05OGPYsK -iHnxsUffHy6gfjT2gDB9veVwQw12Kvz+OE86vFhSgTde6Tsm9I0gX/JEVui4zEJ6 -XmcoNMOPqQiHkku8HTvRGth5IOtKb4ezO+8vppg0SKZDutT6ZW9Umyih4Xf+DpEL -T/WVPrPJTi0XZzdb1d2D76S0QVM2 +c3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIUPzITUpLG +30rVQgVssLIuRsL4uGcwDwYDVR0TBAgwBgEB/wIBATALBgNVHQ8EBAMCAQYwDQYJ +KoZIhvcNAQELBQADggEBAAVDd0khgwxsVZOq/J3jN8jV7siY9Ntj4/5PzqqoS9vs +DbkHqfKfcrZfaBe+rnWHr1/RveY0mqEhi5GWXdKOHDxGpp5cxGBewr67FZFxRcco +k2nw4O4ak24V/sUteu6hL/NgNrcoZU4Hm3m7wq+LeFH1RwsO8V1OVwSGKJgUyN7Z +gxb+V3lBDWAk/XPNgunUPEf23APzCls9ZuJTGHEcqjuhD50A7RBaH19h/zY2Unlx +pJtYkhvEONbiSwViJJ4yDalnCeMfX+J6Tr2ZsBqt7rwgmcHtO/6I/1g/Kn3e4UhJ +KdJDMYTyHdgCLXinepEDxFkIxodbXwa3imhg1X5rFYo= -----END CERTIFICATE----- diff --git a/certs/test-pathlen/chainC-entity.pem b/certs/test-pathlen/chainC-entity.pem index 34f198f2e..d6dd8622f 100644 --- a/certs/test-pathlen/chainC-entity.pem +++ b/certs/test-pathlen/chainC-entity.pem @@ -5,8 +5,8 @@ Certificate: Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainC-ICA1-pathlen1, emailAddress = info@wolfssl.com Validity - Not Before: Oct 11 00:28:08 2019 GMT - Not After : Jul 7 00:28:08 2022 GMT + Not Before: May 7 07:39:04 2020 GMT + Not After : Feb 1 07:39:04 2023 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainC-entity, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -42,27 +42,27 @@ Certificate: X509v3 Basic Constraints: CA:FALSE Signature Algorithm: sha256WithRSAEncryption - b7:d0:5e:86:77:76:45:77:c3:f8:5c:cd:9b:84:52:b7:8b:d6: - 84:ed:d3:1b:fa:7f:27:d1:24:05:11:9d:bf:74:eb:14:93:ee: - 08:2c:16:0a:d8:00:46:31:e3:43:f1:95:64:b1:72:93:49:fa: - fe:73:e8:be:2a:02:95:e8:3a:56:f3:aa:8b:fa:cb:3a:f5:06: - a2:00:ae:19:36:86:be:93:79:3f:58:f7:95:de:a8:e2:12:89: - 52:2f:a0:be:09:3e:18:69:19:d5:96:7c:94:9a:ee:ab:f1:2b: - 74:54:c9:1c:0a:5f:aa:d1:62:34:24:33:f8:5e:b2:43:9c:c9: - e6:8c:fa:b5:89:a7:3e:6b:51:00:a6:e3:d5:c4:f9:ac:78:a5: - 4d:85:7c:e3:7d:f9:b5:e8:ad:3e:32:56:fb:99:bf:f9:3b:a4: - 98:04:72:cd:ea:95:08:af:7e:62:2d:74:e4:25:48:43:25:ba: - 07:7c:00:c9:31:41:6f:59:ff:da:bb:ac:08:06:18:1a:0a:3d: - 1d:2e:ad:98:2c:06:72:51:f2:75:7c:87:ef:e0:37:f6:80:70: - aa:8d:d9:a8:13:e5:31:91:3c:e3:0f:21:33:0a:15:91:1c:4d: - 3a:1b:35:f6:4c:f5:5f:70:34:b2:dc:ed:10:5d:37:58:16:e4: - e0:83:12:90 + 15:72:e5:58:c1:68:5f:5a:e0:8c:93:4e:2d:e2:74:4d:da:54: + ce:59:5a:3f:3c:36:b9:4a:30:3d:62:f9:9a:fd:dd:c8:cc:f1: + 39:3e:e7:06:1a:ed:b9:0e:2d:13:39:61:5a:1e:75:77:82:d3: + 12:a8:05:99:5e:88:d4:fe:86:89:d3:b4:d0:6c:80:84:51:62: + dd:9c:d9:1d:30:40:18:e5:79:70:54:6d:b5:21:33:7b:55:49: + 69:76:68:96:0f:a8:0c:3a:82:1d:b6:21:83:89:c1:dc:2b:7f: + 45:89:29:ff:d5:48:4d:20:28:0b:15:54:28:f3:0a:f3:f3:a8: + ba:a5:5e:18:c3:dd:7f:07:9f:91:f5:e5:98:c5:bb:8a:9b:14: + aa:6c:20:6a:44:2d:35:3d:7f:99:68:84:08:91:95:f4:b0:e3: + f3:cd:bd:26:de:d2:af:5b:78:86:65:00:6f:60:67:a4:88:f0: + 41:98:62:f7:6d:cf:a9:24:44:4a:02:cf:9d:7d:ac:d5:d9:86: + 30:c0:d9:ae:5a:6c:09:e6:bd:cf:80:2f:a3:6a:22:de:c6:bd: + 2c:66:ef:a6:b2:e3:9e:58:e7:27:9a:23:b0:39:84:aa:d6:c9: + 2e:04:c8:2e:5c:70:d5:22:f6:2a:65:7c:66:1f:03:6c:29:31: + d4:0d:46:71 -----BEGIN CERTIFICATE----- MIIEqjCCA5KgAwIBAgIBZTANBgkqhkiG9w0BAQsFADCBoTELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNo YWluQy1JQ0ExLXBhdGhsZW4xMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTE5MTAxMTAwMjgwOFoXDTIyMDcwNzAwMjgwOFowgZoxCzAJBgNVBAYT +Y29tMB4XDTIwMDUwNzA3MzkwNFoXDTIzMDIwMTA3MzkwNFowgZoxCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRUwEwYD VQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2luZWVyaW5nMRYwFAYDVQQD DA1jaGFpbkMtZW50aXR5MR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29t @@ -77,10 +77,10 @@ VR0jBIG5MIG2gBSUHS4HN8YvUsHseWsTzgmQX/TEUaGBmqSBlzCBlDELMAkGA1UE BhMCVVMxEDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNV BAoMCFNhd3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cu d29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb22CAWQw -CQYDVR0TBAIwADANBgkqhkiG9w0BAQsFAAOCAQEAt9Behnd2RXfD+FzNm4RSt4vW -hO3TG/p/J9EkBRGdv3TrFJPuCCwWCtgARjHjQ/GVZLFyk0n6/nPovioCleg6VvOq -i/rLOvUGogCuGTaGvpN5P1j3ld6o4hKJUi+gvgk+GGkZ1ZZ8lJruq/ErdFTJHApf -qtFiNCQz+F6yQ5zJ5oz6tYmnPmtRAKbj1cT5rHilTYV84335teitPjJW+5m/+Tuk -mARyzeqVCK9+Yi105CVIQyW6B3wAyTFBb1n/2rusCAYYGgo9HS6tmCwGclHydXyH -7+A39oBwqo3ZqBPlMZE84w8hMwoVkRxNOhs19kz1X3A0stztEF03WBbk4IMSkA== +CQYDVR0TBAIwADANBgkqhkiG9w0BAQsFAAOCAQEAFXLlWMFoX1rgjJNOLeJ0TdpU +zllaPzw2uUowPWL5mv3dyMzxOT7nBhrtuQ4tEzlhWh51d4LTEqgFmV6I1P6GidO0 +0GyAhFFi3ZzZHTBAGOV5cFRttSEze1VJaXZolg+oDDqCHbYhg4nB3Ct/RYkp/9VI +TSAoCxVUKPMK8/OouqVeGMPdfwefkfXlmMW7ipsUqmwgakQtNT1/mWiECJGV9LDj +8829Jt7Sr1t4hmUAb2BnpIjwQZhi923PqSRESgLPnX2s1dmGMMDZrlpsCea9z4Av +o2oi3sa9LGbvprLjnljnJ5ojsDmEqtbJLgTILlxw1SL2KmV8Zh8DbCkx1A1GcQ== -----END CERTIFICATE----- diff --git a/certs/test-pathlen/chainD-ICA1-pathlen127.pem b/certs/test-pathlen/chainD-ICA1-pathlen127.pem index 97ad8d4f5..2359c8f23 100644 --- a/certs/test-pathlen/chainD-ICA1-pathlen127.pem +++ b/certs/test-pathlen/chainD-ICA1-pathlen127.pem @@ -5,8 +5,8 @@ Certificate: Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Oct 11 00:28:09 2019 GMT - Not After : Jul 7 00:28:09 2022 GMT + Not Before: May 7 07:39:05 2020 GMT + Not After : Feb 1 07:39:05 2023 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainD-ICA1-pathlen127, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -37,34 +37,34 @@ Certificate: X509v3 Authority Key Identifier: keyid:27:8E:67:11:74:C3:26:1D:3F:ED:33:63:B3:A4:D8:1D:30:E5:E8:D5 DirName:/C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:86:FF:F5:8E:10:DE:B8:FB + serial:3F:32:13:52:92:C6:DF:4A:D5:42:05:6C:B0:B2:2E:46:C2:F8:B8:67 X509v3 Basic Constraints: CA:TRUE, pathlen:127 X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 12:87:4f:82:bb:5a:21:b0:95:f6:b5:2b:95:53:a5:10:fc:f6: - fe:7e:03:9c:fa:cf:d7:d5:a1:72:1d:33:69:1b:0e:07:07:62: - 74:9b:0c:2b:46:d2:b8:80:b1:72:f3:c1:83:13:62:fd:dd:17: - 15:14:0b:64:57:26:db:70:e5:3d:44:88:05:f9:91:b0:9a:4a: - c0:f9:87:3c:70:16:d6:1c:58:51:d9:b9:b8:ac:11:d2:4d:94: - 58:cf:fd:9e:74:51:28:b0:4f:ed:7d:88:25:ce:6b:eb:5e:ca: - e8:f9:ce:31:e1:b9:2d:e6:d9:0c:13:ff:3f:24:1f:fa:25:e8: - cd:cd:25:88:e7:98:dc:b5:f8:cd:21:d2:a8:71:d1:b9:18:dd: - 18:5d:0b:97:a7:82:04:d5:e8:36:29:4b:dc:7f:d9:42:85:55: - 81:dc:da:f9:ca:58:38:f3:2c:df:b4:2c:23:65:d3:17:01:ed: - f4:8b:f6:9b:0b:b5:32:ea:28:cb:c2:fb:16:2a:fe:3d:3d:0b: - e6:f3:bf:8f:43:75:a7:d1:b8:c9:04:31:4f:60:3a:3a:4a:b0: - 1b:16:7d:24:b8:78:be:be:7a:80:a5:81:8c:77:7c:aa:79:75: - 4d:3f:a2:14:36:5a:81:1f:6c:44:7d:d1:9a:db:a6:f6:e3:48: - d3:bb:ea:9c + b6:9c:3d:f0:28:b4:9b:19:21:a2:5f:6e:58:1f:bd:83:ad:1f: + f8:c6:dc:cd:14:4f:ea:bd:d6:33:bd:c7:a1:5f:0a:f1:7b:ae: + 9f:ac:12:75:28:ef:67:25:cf:6f:cd:89:62:e6:da:f8:3b:c6: + d5:c4:af:97:bb:cb:47:7c:36:ab:d1:35:27:0d:03:18:bf:6e: + c7:43:d8:36:a4:df:af:73:43:27:0e:73:2a:6f:99:0c:60:88: + 5e:76:5e:33:79:2e:e0:37:fc:9c:42:78:f6:29:0a:d0:ed:14: + 84:14:96:ca:1e:8a:f4:95:26:86:7c:d7:4c:67:b7:e0:7d:17: + c6:f1:99:a2:63:a6:24:81:b3:18:b1:ea:3a:ed:d1:b4:74:6b: + 08:d4:48:17:e7:3e:3e:a3:b0:e8:34:d0:3a:a8:54:37:43:75: + d0:a3:d6:bd:47:8d:65:d0:77:9d:c6:98:c5:65:aa:b9:de:a0: + 8f:5d:55:0e:2b:79:86:0a:41:6a:ee:2c:c6:39:3e:48:d7:b4: + 24:9f:6b:48:28:b8:ae:3e:29:1a:6c:08:bf:e0:14:86:49:4b: + e0:6b:fd:8a:5d:69:ee:33:81:86:08:0e:32:46:94:61:ca:4f: + 56:48:ea:da:68:06:0d:21:92:6d:41:77:eb:32:b2:7e:34:83: + 88:9d:f5:f2 -----BEGIN CERTIFICATE----- -MIIEwzCCA6ugAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx +MIIEzjCCA7agAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx EDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNh d3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cud29sZnNz -bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMTkxMDEx -MDAyODA5WhcNMjIwNzA3MDAyODA5WjCBozELMAkGA1UEBhMCVVMxEzARBgNVBAgM +bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjAwNTA3 +MDczOTA1WhcNMjMwMjAxMDczOTA1WjCBozELMAkGA1UEBhMCVVMxEzARBgNVBAgM Cldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoMDHdvbGZTU0wg SW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHzAdBgNVBAMMFmNoYWluRC1JQ0Ex LXBhdGhsZW4xMjcxHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wggEi @@ -74,16 +74,16 @@ sr1DzFh/HdtLl6WDXIdem3OHyB0rR5JV5Nu+UdXrdsKqWXJ79icvvsDb3Dzy4hnJ sDC7LqKVSAa9jp29jGtexppzS2ywIJZHRNMJa2or+oZfHQunYiJy1VYcqpeMzlej D+a8zWNUVWCHUOv6jOkVcLNcTQ4nYP0HbozsP6AlxQFZo/wtgEuETBC1yKdrseXF wZqw1kswIbpCZeA/Wc9/SUs7z2IG9ImuW4FdFWP7fCmmtc/ztbVmBk+j2mc5AgMB -AAGjggENMIIBCTAdBgNVHQ4EFgQUZ3j5rRxTQR9GvUmbcy583FwtC/swgckGA1Ud -IwSBwTCBvoAUJ45nEXTDJh0/7TNjs6TYHTDl6NWhgZqkgZcwgZQxCzAJBgNVBAYT +AAGjggEYMIIBFDAdBgNVHQ4EFgQUZ3j5rRxTQR9GvUmbcy583FwtC/swgdQGA1Ud +IwSBzDCByYAUJ45nEXTDJh0/7TNjs6TYHTDl6NWhgZqkgZcwgZQxCzAJBgNVBAYT AlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMREwDwYDVQQK DAhTYXd0b290aDETMBEGA1UECwwKQ29uc3VsdGluZzEYMBYGA1UEAwwPd3d3Lndv -bGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tggkAhv/1 -jhDeuPswDwYDVR0TBAgwBgEB/wIBfzALBgNVHQ8EBAMCAQYwDQYJKoZIhvcNAQEL -BQADggEBABKHT4K7WiGwlfa1K5VTpRD89v5+A5z6z9fVoXIdM2kbDgcHYnSbDCtG -0riAsXLzwYMTYv3dFxUUC2RXJttw5T1EiAX5kbCaSsD5hzxwFtYcWFHZubisEdJN -lFjP/Z50USiwT+19iCXOa+teyuj5zjHhuS3m2QwT/z8kH/ol6M3NJYjnmNy1+M0h -0qhx0bkY3RhdC5enggTV6DYpS9x/2UKFVYHc2vnKWDjzLN+0LCNl0xcB7fSL9psL -tTLqKMvC+xYq/j09C+bzv49DdafRuMkEMU9gOjpKsBsWfSS4eL6+eoClgYx3fKp5 -dU0/ohQ2WoEfbER90ZrbpvbjSNO76pw= +bGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tghQ/MhNS +ksbfStVCBWywsi5Gwvi4ZzAPBgNVHRMECDAGAQH/AgF/MAsGA1UdDwQEAwIBBjAN +BgkqhkiG9w0BAQsFAAOCAQEAtpw98Ci0mxkhol9uWB+9g60f+MbczRRP6r3WM73H +oV8K8Xuun6wSdSjvZyXPb82JYuba+DvG1cSvl7vLR3w2q9E1Jw0DGL9ux0PYNqTf +r3NDJw5zKm+ZDGCIXnZeM3ku4Df8nEJ49ikK0O0UhBSWyh6K9JUmhnzXTGe34H0X +xvGZomOmJIGzGLHqOu3RtHRrCNRIF+c+PqOw6DTQOqhUN0N10KPWvUeNZdB3ncaY +xWWqud6gj11VDit5hgpBau4sxjk+SNe0JJ9rSCi4rj4pGmwIv+AUhklL4Gv9il1p +7jOBhggOMkaUYcpPVkjq2mgGDSGSbUF36zKyfjSDiJ318g== -----END CERTIFICATE----- diff --git a/certs/test-pathlen/chainD-assembled.pem b/certs/test-pathlen/chainD-assembled.pem index 28cc30acd..4ec4e9dcc 100644 --- a/certs/test-pathlen/chainD-assembled.pem +++ b/certs/test-pathlen/chainD-assembled.pem @@ -5,8 +5,8 @@ Certificate: Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainD-ICA1-pathlen127, emailAddress = info@wolfssl.com Validity - Not Before: Oct 11 00:28:09 2019 GMT - Not After : Jul 7 00:28:09 2022 GMT + Not Before: May 7 07:39:05 2020 GMT + Not After : Feb 1 07:39:05 2023 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainD-entity, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -42,27 +42,27 @@ Certificate: X509v3 Basic Constraints: CA:FALSE Signature Algorithm: sha256WithRSAEncryption - 58:fd:0d:2f:47:32:d2:11:b4:b5:a5:b5:ea:26:23:66:85:cc: - 46:b5:42:fc:63:98:57:14:84:ca:2a:02:30:9e:a0:64:d4:24: - cb:42:2e:53:a3:0f:d7:24:46:cb:37:0c:ba:d9:73:50:11:15: - d0:4a:4a:f5:10:15:db:c9:e5:e6:a2:c3:91:89:70:c8:df:59: - c3:2f:c3:94:a4:50:5b:f5:d8:71:e8:ba:fa:85:ee:aa:f4:b1: - 64:29:54:62:08:cc:89:a3:41:be:df:03:d3:75:f8:92:41:95: - 4b:06:cc:95:30:ef:a8:6f:01:9a:2e:bc:a0:7e:4c:08:4e:d4: - f0:91:fe:b4:a3:67:0f:9c:5d:4d:7d:ad:04:d7:cf:e4:79:d8: - b2:18:78:33:fd:a3:cb:14:d3:50:1b:50:62:ef:9d:1b:88:8d: - 7b:42:76:ce:c7:88:70:58:40:f4:bf:7c:1e:c5:26:8c:23:b7: - 7e:d2:85:67:c7:fe:ae:59:98:06:60:54:43:1e:31:74:25:c9: - 1e:4c:05:d2:6d:01:3e:33:ac:5d:42:c5:47:c4:20:9f:04:30: - ca:c7:22:63:bd:8e:16:0a:42:4c:5b:2c:3b:b4:77:3c:b4:43: - bb:6d:4d:40:d6:ed:30:df:29:a4:3e:e2:78:c3:4f:11:a4:53: - 65:33:e0:c9 + 38:d1:67:2b:24:4b:0f:79:e3:ec:5c:ba:b3:c9:43:a3:aa:74: + 34:54:2e:1c:2a:36:77:62:8a:88:20:8f:30:27:2d:7e:d5:b3: + e3:df:b3:e0:db:50:1d:5d:16:4d:66:0c:85:3c:f3:56:4d:63: + f6:ae:1d:dd:a5:5d:69:09:97:59:1b:95:24:92:35:8c:a3:8b: + 4a:8c:f5:af:d6:51:47:27:47:ee:f9:c7:58:b2:fc:5f:0e:a6: + e4:85:fc:c4:06:6b:aa:a0:d7:d8:a4:92:31:12:c0:3b:18:44: + 64:88:7e:49:22:42:e9:4d:1d:68:50:69:8c:b3:e5:53:25:36: + a5:14:2a:04:bc:7b:cc:92:bc:c6:6d:6f:3e:81:0b:da:8d:61: + 47:ba:33:20:96:38:b4:29:ca:d9:99:72:48:c8:9f:30:2e:de: + 46:42:84:50:20:85:9d:37:8e:01:ae:5f:c9:10:28:db:ff:46: + bf:d9:4c:2c:ac:5d:16:c5:45:2c:c4:94:11:5f:cc:a0:70:8d: + 81:4a:d9:ca:5e:34:38:14:31:5e:b4:7d:51:e4:f7:06:4c:91: + 44:e9:78:85:bf:26:50:37:31:81:cb:33:94:af:51:21:5c:f5: + 47:73:b3:f6:2f:4e:6a:77:be:4e:cf:11:3e:f7:54:4f:93:fe: + 4d:2e:d3:85 -----BEGIN CERTIFICATE----- MIIErDCCA5SgAwIBAgIBZTANBgkqhkiG9w0BAQsFADCBozELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHzAdBgNVBAMMFmNo YWluRC1JQ0ExLXBhdGhsZW4xMjcxHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNz -bC5jb20wHhcNMTkxMDExMDAyODA5WhcNMjIwNzA3MDAyODA5WjCBmjELMAkGA1UE +bC5jb20wHhcNMjAwNTA3MDczOTA1WhcNMjMwMjAxMDczOTA1WjCBmjELMAkGA1UE BhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTAT BgNVBAoMDHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxFjAUBgNV BAMMDWNoYWluRC1lbnRpdHkxHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5j @@ -77,12 +77,12 @@ BgNVHSMEgbkwgbaAFGd4+a0cU0EfRr1Jm3MufNxcLQv7oYGapIGXMIGUMQswCQYD VQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjERMA8G A1UECgwIU2F3dG9vdGgxEzARBgNVBAsMCkNvbnN1bHRpbmcxGDAWBgNVBAMMD3d3 dy53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIB -ZDAJBgNVHRMEAjAAMA0GCSqGSIb3DQEBCwUAA4IBAQBY/Q0vRzLSEbS1pbXqJiNm -hcxGtUL8Y5hXFITKKgIwnqBk1CTLQi5Tow/XJEbLNwy62XNQERXQSkr1EBXbyeXm -osORiXDI31nDL8OUpFBb9dhx6Lr6he6q9LFkKVRiCMyJo0G+3wPTdfiSQZVLBsyV -MO+obwGaLrygfkwITtTwkf60o2cPnF1Nfa0E18/kediyGHgz/aPLFNNQG1Bi750b -iI17QnbOx4hwWED0v3wexSaMI7d+0oVnx/6uWZgGYFRDHjF0JckeTAXSbQE+M6xd -QsVHxCCfBDDKxyJjvY4WCkJMWyw7tHc8tEO7bU1A1u0w3ymkPuJ4w08RpFNlM+DJ +ZDAJBgNVHRMEAjAAMA0GCSqGSIb3DQEBCwUAA4IBAQA40WcrJEsPeePsXLqzyUOj +qnQ0VC4cKjZ3YoqIII8wJy1+1bPj37Pg21AdXRZNZgyFPPNWTWP2rh3dpV1pCZdZ +G5UkkjWMo4tKjPWv1lFHJ0fu+cdYsvxfDqbkhfzEBmuqoNfYpJIxEsA7GERkiH5J +IkLpTR1oUGmMs+VTJTalFCoEvHvMkrzGbW8+gQvajWFHujMglji0KcrZmXJIyJ8w +Lt5GQoRQIIWdN44Brl/JECjb/0a/2UwsrF0WxUUsxJQRX8ygcI2BStnKXjQ4FDFe +tH1R5PcGTJFE6XiFvyZQNzGByzOUr1EhXPVHc7P2L05qd75OzxE+91RPk/5NLtOF -----END CERTIFICATE----- Certificate: Data: @@ -91,8 +91,8 @@ Certificate: Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Oct 11 00:28:09 2019 GMT - Not After : Jul 7 00:28:09 2022 GMT + Not Before: May 7 07:39:05 2020 GMT + Not After : Feb 1 07:39:05 2023 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainD-ICA1-pathlen127, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -123,34 +123,34 @@ Certificate: X509v3 Authority Key Identifier: keyid:27:8E:67:11:74:C3:26:1D:3F:ED:33:63:B3:A4:D8:1D:30:E5:E8:D5 DirName:/C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:86:FF:F5:8E:10:DE:B8:FB + serial:3F:32:13:52:92:C6:DF:4A:D5:42:05:6C:B0:B2:2E:46:C2:F8:B8:67 X509v3 Basic Constraints: CA:TRUE, pathlen:127 X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 12:87:4f:82:bb:5a:21:b0:95:f6:b5:2b:95:53:a5:10:fc:f6: - fe:7e:03:9c:fa:cf:d7:d5:a1:72:1d:33:69:1b:0e:07:07:62: - 74:9b:0c:2b:46:d2:b8:80:b1:72:f3:c1:83:13:62:fd:dd:17: - 15:14:0b:64:57:26:db:70:e5:3d:44:88:05:f9:91:b0:9a:4a: - c0:f9:87:3c:70:16:d6:1c:58:51:d9:b9:b8:ac:11:d2:4d:94: - 58:cf:fd:9e:74:51:28:b0:4f:ed:7d:88:25:ce:6b:eb:5e:ca: - e8:f9:ce:31:e1:b9:2d:e6:d9:0c:13:ff:3f:24:1f:fa:25:e8: - cd:cd:25:88:e7:98:dc:b5:f8:cd:21:d2:a8:71:d1:b9:18:dd: - 18:5d:0b:97:a7:82:04:d5:e8:36:29:4b:dc:7f:d9:42:85:55: - 81:dc:da:f9:ca:58:38:f3:2c:df:b4:2c:23:65:d3:17:01:ed: - f4:8b:f6:9b:0b:b5:32:ea:28:cb:c2:fb:16:2a:fe:3d:3d:0b: - e6:f3:bf:8f:43:75:a7:d1:b8:c9:04:31:4f:60:3a:3a:4a:b0: - 1b:16:7d:24:b8:78:be:be:7a:80:a5:81:8c:77:7c:aa:79:75: - 4d:3f:a2:14:36:5a:81:1f:6c:44:7d:d1:9a:db:a6:f6:e3:48: - d3:bb:ea:9c + b6:9c:3d:f0:28:b4:9b:19:21:a2:5f:6e:58:1f:bd:83:ad:1f: + f8:c6:dc:cd:14:4f:ea:bd:d6:33:bd:c7:a1:5f:0a:f1:7b:ae: + 9f:ac:12:75:28:ef:67:25:cf:6f:cd:89:62:e6:da:f8:3b:c6: + d5:c4:af:97:bb:cb:47:7c:36:ab:d1:35:27:0d:03:18:bf:6e: + c7:43:d8:36:a4:df:af:73:43:27:0e:73:2a:6f:99:0c:60:88: + 5e:76:5e:33:79:2e:e0:37:fc:9c:42:78:f6:29:0a:d0:ed:14: + 84:14:96:ca:1e:8a:f4:95:26:86:7c:d7:4c:67:b7:e0:7d:17: + c6:f1:99:a2:63:a6:24:81:b3:18:b1:ea:3a:ed:d1:b4:74:6b: + 08:d4:48:17:e7:3e:3e:a3:b0:e8:34:d0:3a:a8:54:37:43:75: + d0:a3:d6:bd:47:8d:65:d0:77:9d:c6:98:c5:65:aa:b9:de:a0: + 8f:5d:55:0e:2b:79:86:0a:41:6a:ee:2c:c6:39:3e:48:d7:b4: + 24:9f:6b:48:28:b8:ae:3e:29:1a:6c:08:bf:e0:14:86:49:4b: + e0:6b:fd:8a:5d:69:ee:33:81:86:08:0e:32:46:94:61:ca:4f: + 56:48:ea:da:68:06:0d:21:92:6d:41:77:eb:32:b2:7e:34:83: + 88:9d:f5:f2 -----BEGIN CERTIFICATE----- -MIIEwzCCA6ugAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx +MIIEzjCCA7agAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx EDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNh d3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cud29sZnNz -bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMTkxMDEx -MDAyODA5WhcNMjIwNzA3MDAyODA5WjCBozELMAkGA1UEBhMCVVMxEzARBgNVBAgM +bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjAwNTA3 +MDczOTA1WhcNMjMwMjAxMDczOTA1WjCBozELMAkGA1UEBhMCVVMxEzARBgNVBAgM Cldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoMDHdvbGZTU0wg SW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHzAdBgNVBAMMFmNoYWluRC1JQ0Ex LXBhdGhsZW4xMjcxHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wggEi @@ -160,16 +160,16 @@ sr1DzFh/HdtLl6WDXIdem3OHyB0rR5JV5Nu+UdXrdsKqWXJ79icvvsDb3Dzy4hnJ sDC7LqKVSAa9jp29jGtexppzS2ywIJZHRNMJa2or+oZfHQunYiJy1VYcqpeMzlej D+a8zWNUVWCHUOv6jOkVcLNcTQ4nYP0HbozsP6AlxQFZo/wtgEuETBC1yKdrseXF wZqw1kswIbpCZeA/Wc9/SUs7z2IG9ImuW4FdFWP7fCmmtc/ztbVmBk+j2mc5AgMB -AAGjggENMIIBCTAdBgNVHQ4EFgQUZ3j5rRxTQR9GvUmbcy583FwtC/swgckGA1Ud -IwSBwTCBvoAUJ45nEXTDJh0/7TNjs6TYHTDl6NWhgZqkgZcwgZQxCzAJBgNVBAYT +AAGjggEYMIIBFDAdBgNVHQ4EFgQUZ3j5rRxTQR9GvUmbcy583FwtC/swgdQGA1Ud +IwSBzDCByYAUJ45nEXTDJh0/7TNjs6TYHTDl6NWhgZqkgZcwgZQxCzAJBgNVBAYT AlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMREwDwYDVQQK DAhTYXd0b290aDETMBEGA1UECwwKQ29uc3VsdGluZzEYMBYGA1UEAwwPd3d3Lndv -bGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tggkAhv/1 -jhDeuPswDwYDVR0TBAgwBgEB/wIBfzALBgNVHQ8EBAMCAQYwDQYJKoZIhvcNAQEL -BQADggEBABKHT4K7WiGwlfa1K5VTpRD89v5+A5z6z9fVoXIdM2kbDgcHYnSbDCtG -0riAsXLzwYMTYv3dFxUUC2RXJttw5T1EiAX5kbCaSsD5hzxwFtYcWFHZubisEdJN -lFjP/Z50USiwT+19iCXOa+teyuj5zjHhuS3m2QwT/z8kH/ol6M3NJYjnmNy1+M0h -0qhx0bkY3RhdC5enggTV6DYpS9x/2UKFVYHc2vnKWDjzLN+0LCNl0xcB7fSL9psL -tTLqKMvC+xYq/j09C+bzv49DdafRuMkEMU9gOjpKsBsWfSS4eL6+eoClgYx3fKp5 -dU0/ohQ2WoEfbER90ZrbpvbjSNO76pw= +bGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tghQ/MhNS +ksbfStVCBWywsi5Gwvi4ZzAPBgNVHRMECDAGAQH/AgF/MAsGA1UdDwQEAwIBBjAN +BgkqhkiG9w0BAQsFAAOCAQEAtpw98Ci0mxkhol9uWB+9g60f+MbczRRP6r3WM73H +oV8K8Xuun6wSdSjvZyXPb82JYuba+DvG1cSvl7vLR3w2q9E1Jw0DGL9ux0PYNqTf +r3NDJw5zKm+ZDGCIXnZeM3ku4Df8nEJ49ikK0O0UhBSWyh6K9JUmhnzXTGe34H0X +xvGZomOmJIGzGLHqOu3RtHRrCNRIF+c+PqOw6DTQOqhUN0N10KPWvUeNZdB3ncaY +xWWqud6gj11VDit5hgpBau4sxjk+SNe0JJ9rSCi4rj4pGmwIv+AUhklL4Gv9il1p +7jOBhggOMkaUYcpPVkjq2mgGDSGSbUF36zKyfjSDiJ318g== -----END CERTIFICATE----- diff --git a/certs/test-pathlen/chainD-entity.pem b/certs/test-pathlen/chainD-entity.pem index 640b8394e..59bbfe56c 100644 --- a/certs/test-pathlen/chainD-entity.pem +++ b/certs/test-pathlen/chainD-entity.pem @@ -5,8 +5,8 @@ Certificate: Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainD-ICA1-pathlen127, emailAddress = info@wolfssl.com Validity - Not Before: Oct 11 00:28:09 2019 GMT - Not After : Jul 7 00:28:09 2022 GMT + Not Before: May 7 07:39:05 2020 GMT + Not After : Feb 1 07:39:05 2023 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainD-entity, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -42,27 +42,27 @@ Certificate: X509v3 Basic Constraints: CA:FALSE Signature Algorithm: sha256WithRSAEncryption - 58:fd:0d:2f:47:32:d2:11:b4:b5:a5:b5:ea:26:23:66:85:cc: - 46:b5:42:fc:63:98:57:14:84:ca:2a:02:30:9e:a0:64:d4:24: - cb:42:2e:53:a3:0f:d7:24:46:cb:37:0c:ba:d9:73:50:11:15: - d0:4a:4a:f5:10:15:db:c9:e5:e6:a2:c3:91:89:70:c8:df:59: - c3:2f:c3:94:a4:50:5b:f5:d8:71:e8:ba:fa:85:ee:aa:f4:b1: - 64:29:54:62:08:cc:89:a3:41:be:df:03:d3:75:f8:92:41:95: - 4b:06:cc:95:30:ef:a8:6f:01:9a:2e:bc:a0:7e:4c:08:4e:d4: - f0:91:fe:b4:a3:67:0f:9c:5d:4d:7d:ad:04:d7:cf:e4:79:d8: - b2:18:78:33:fd:a3:cb:14:d3:50:1b:50:62:ef:9d:1b:88:8d: - 7b:42:76:ce:c7:88:70:58:40:f4:bf:7c:1e:c5:26:8c:23:b7: - 7e:d2:85:67:c7:fe:ae:59:98:06:60:54:43:1e:31:74:25:c9: - 1e:4c:05:d2:6d:01:3e:33:ac:5d:42:c5:47:c4:20:9f:04:30: - ca:c7:22:63:bd:8e:16:0a:42:4c:5b:2c:3b:b4:77:3c:b4:43: - bb:6d:4d:40:d6:ed:30:df:29:a4:3e:e2:78:c3:4f:11:a4:53: - 65:33:e0:c9 + 38:d1:67:2b:24:4b:0f:79:e3:ec:5c:ba:b3:c9:43:a3:aa:74: + 34:54:2e:1c:2a:36:77:62:8a:88:20:8f:30:27:2d:7e:d5:b3: + e3:df:b3:e0:db:50:1d:5d:16:4d:66:0c:85:3c:f3:56:4d:63: + f6:ae:1d:dd:a5:5d:69:09:97:59:1b:95:24:92:35:8c:a3:8b: + 4a:8c:f5:af:d6:51:47:27:47:ee:f9:c7:58:b2:fc:5f:0e:a6: + e4:85:fc:c4:06:6b:aa:a0:d7:d8:a4:92:31:12:c0:3b:18:44: + 64:88:7e:49:22:42:e9:4d:1d:68:50:69:8c:b3:e5:53:25:36: + a5:14:2a:04:bc:7b:cc:92:bc:c6:6d:6f:3e:81:0b:da:8d:61: + 47:ba:33:20:96:38:b4:29:ca:d9:99:72:48:c8:9f:30:2e:de: + 46:42:84:50:20:85:9d:37:8e:01:ae:5f:c9:10:28:db:ff:46: + bf:d9:4c:2c:ac:5d:16:c5:45:2c:c4:94:11:5f:cc:a0:70:8d: + 81:4a:d9:ca:5e:34:38:14:31:5e:b4:7d:51:e4:f7:06:4c:91: + 44:e9:78:85:bf:26:50:37:31:81:cb:33:94:af:51:21:5c:f5: + 47:73:b3:f6:2f:4e:6a:77:be:4e:cf:11:3e:f7:54:4f:93:fe: + 4d:2e:d3:85 -----BEGIN CERTIFICATE----- MIIErDCCA5SgAwIBAgIBZTANBgkqhkiG9w0BAQsFADCBozELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHzAdBgNVBAMMFmNo YWluRC1JQ0ExLXBhdGhsZW4xMjcxHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNz -bC5jb20wHhcNMTkxMDExMDAyODA5WhcNMjIwNzA3MDAyODA5WjCBmjELMAkGA1UE +bC5jb20wHhcNMjAwNTA3MDczOTA1WhcNMjMwMjAxMDczOTA1WjCBmjELMAkGA1UE BhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTAT BgNVBAoMDHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxFjAUBgNV BAMMDWNoYWluRC1lbnRpdHkxHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5j @@ -77,10 +77,10 @@ BgNVHSMEgbkwgbaAFGd4+a0cU0EfRr1Jm3MufNxcLQv7oYGapIGXMIGUMQswCQYD VQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjERMA8G A1UECgwIU2F3dG9vdGgxEzARBgNVBAsMCkNvbnN1bHRpbmcxGDAWBgNVBAMMD3d3 dy53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIB -ZDAJBgNVHRMEAjAAMA0GCSqGSIb3DQEBCwUAA4IBAQBY/Q0vRzLSEbS1pbXqJiNm -hcxGtUL8Y5hXFITKKgIwnqBk1CTLQi5Tow/XJEbLNwy62XNQERXQSkr1EBXbyeXm -osORiXDI31nDL8OUpFBb9dhx6Lr6he6q9LFkKVRiCMyJo0G+3wPTdfiSQZVLBsyV -MO+obwGaLrygfkwITtTwkf60o2cPnF1Nfa0E18/kediyGHgz/aPLFNNQG1Bi750b -iI17QnbOx4hwWED0v3wexSaMI7d+0oVnx/6uWZgGYFRDHjF0JckeTAXSbQE+M6xd -QsVHxCCfBDDKxyJjvY4WCkJMWyw7tHc8tEO7bU1A1u0w3ymkPuJ4w08RpFNlM+DJ +ZDAJBgNVHRMEAjAAMA0GCSqGSIb3DQEBCwUAA4IBAQA40WcrJEsPeePsXLqzyUOj +qnQ0VC4cKjZ3YoqIII8wJy1+1bPj37Pg21AdXRZNZgyFPPNWTWP2rh3dpV1pCZdZ +G5UkkjWMo4tKjPWv1lFHJ0fu+cdYsvxfDqbkhfzEBmuqoNfYpJIxEsA7GERkiH5J +IkLpTR1oUGmMs+VTJTalFCoEvHvMkrzGbW8+gQvajWFHujMglji0KcrZmXJIyJ8w +Lt5GQoRQIIWdN44Brl/JECjb/0a/2UwsrF0WxUUsxJQRX8ygcI2BStnKXjQ4FDFe +tH1R5PcGTJFE6XiFvyZQNzGByzOUr1EhXPVHc7P2L05qd75OzxE+91RPk/5NLtOF -----END CERTIFICATE----- diff --git a/certs/test-pathlen/chainE-ICA1-pathlen128.pem b/certs/test-pathlen/chainE-ICA1-pathlen128.pem index da10c86f7..7d54b90d1 100644 --- a/certs/test-pathlen/chainE-ICA1-pathlen128.pem +++ b/certs/test-pathlen/chainE-ICA1-pathlen128.pem @@ -5,8 +5,8 @@ Certificate: Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Oct 11 00:28:09 2019 GMT - Not After : Jul 7 00:28:09 2022 GMT + Not Before: May 7 07:39:05 2020 GMT + Not After : Feb 1 07:39:05 2023 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainE-ICA1-pathlen128, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -37,34 +37,34 @@ Certificate: X509v3 Authority Key Identifier: keyid:27:8E:67:11:74:C3:26:1D:3F:ED:33:63:B3:A4:D8:1D:30:E5:E8:D5 DirName:/C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:86:FF:F5:8E:10:DE:B8:FB + serial:3F:32:13:52:92:C6:DF:4A:D5:42:05:6C:B0:B2:2E:46:C2:F8:B8:67 X509v3 Basic Constraints: CA:TRUE, pathlen:128 X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 81:17:73:e0:8e:30:5f:5e:a7:25:a8:c0:89:f0:2a:c5:cc:72: - 30:0a:55:f2:c8:13:34:de:3c:7c:5e:e1:56:5e:72:04:10:8b: - 4b:05:3b:14:3c:37:0e:48:68:23:a1:2c:f5:72:f0:36:57:79: - fa:6f:ee:b0:17:83:f0:8a:1f:f0:6b:88:3b:57:c8:b2:57:c9: - 4e:35:14:a8:d7:31:db:68:74:8c:30:24:b3:9d:c9:8d:8c:36: - 34:30:0e:f3:4e:74:bd:14:77:c8:13:7f:bc:d3:21:34:e8:87: - e7:a3:80:62:ea:20:4b:40:ef:f5:97:db:c7:63:6b:e4:06:12: - 1a:b7:55:da:5a:34:32:95:59:c4:68:85:2c:87:dd:77:5f:ff: - 28:cf:95:c3:68:f8:c4:32:af:8e:c6:2c:39:6b:bd:3a:dd:18: - 16:a8:a7:0e:9d:93:6d:8e:77:b1:0e:86:55:0d:a4:aa:e6:3f: - f5:69:1d:d5:c0:5e:1a:b1:bc:ab:5f:eb:1f:76:6a:c5:22:57: - a9:f1:ee:55:56:37:61:9e:49:e6:bc:8b:e9:9d:6b:11:6f:90: - cb:d6:18:3c:81:f2:c8:4c:92:e4:4d:73:d1:a1:be:8d:fe:d7: - 54:20:d4:df:43:7d:e7:57:f1:dd:9f:a0:6d:cd:e3:ab:30:fa: - cc:29:0b:01 + 22:57:ad:de:9b:b2:52:5a:b0:a7:a2:cc:8f:4d:22:40:ce:45: + c4:e4:ee:d2:90:e4:cb:e8:8b:2f:91:ef:e0:94:8b:6e:0a:05: + 4d:e2:1b:de:67:bf:44:49:cf:55:5d:53:55:7a:5b:02:98:fb: + 44:3b:81:7e:81:80:41:4c:80:da:8b:e2:ec:f6:ae:4b:6b:35: + 7c:9f:e9:da:7d:d8:11:19:12:a1:f4:55:fb:c7:10:70:7e:48: + d4:d3:81:3a:e9:4a:19:da:f7:8c:9a:c4:54:da:54:20:d4:e3: + 9e:6d:de:e1:22:5f:85:78:18:4d:53:fd:5d:58:e8:13:7a:d6: + 90:48:36:a4:d8:70:d7:16:60:c0:46:f9:7a:76:9c:2e:f9:f0: + 4e:f4:02:22:95:1d:e3:fa:fa:af:33:ba:02:08:fb:3f:c3:20: + ef:91:15:90:44:ef:30:26:71:2b:c7:fb:97:0c:a7:34:c2:da: + 4c:58:f7:12:3f:99:e7:9c:94:a6:ca:68:87:95:92:5b:a6:20: + 3e:4f:c8:c6:78:d1:47:2f:9c:09:db:1d:24:4f:0b:a8:4d:17: + 0b:65:ae:d0:35:2f:df:b4:2c:94:26:48:2e:40:51:15:e1:6f: + 5c:ea:1e:07:26:8c:a5:4d:5e:39:57:dd:09:a4:17:d1:d2:48: + b9:d9:9f:68 -----BEGIN CERTIFICATE----- -MIIExDCCA6ygAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx +MIIEzzCCA7egAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx EDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNh d3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cud29sZnNz -bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMTkxMDEx -MDAyODA5WhcNMjIwNzA3MDAyODA5WjCBozELMAkGA1UEBhMCVVMxEzARBgNVBAgM +bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjAwNTA3 +MDczOTA1WhcNMjMwMjAxMDczOTA1WjCBozELMAkGA1UEBhMCVVMxEzARBgNVBAgM Cldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoMDHdvbGZTU0wg SW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHzAdBgNVBAMMFmNoYWluRS1JQ0Ex LXBhdGhsZW4xMjgxHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wggEi @@ -74,16 +74,16 @@ F/1WuDrPz+33kGpzbAaZ7w6PZdzQ6Nt7wehNbWGezFog3oY6WIH6sdRfPHRDRWE2 LP6kNa7iOcf93bOD1hfc9Zk/Zw7BYNFpjTz5YumDrmYQqkCRYwsq5cGoH46KmxGf v6ZF+xZw7WwbFJiAaQTDvRMi59kzSJ2KbA+cOQgpkoN7c6PahtZKAA+nwnu/rA8q YpZbO++f4Qi7RLrEmU+guV5Ny3Nz/u6CaU+vx1laNoFExuNQO7+NFO9+lu/BAgMB -AAGjggEOMIIBCjAdBgNVHQ4EFgQURHsAfJwcl5+XqmvyXuaBfA6u5iswgckGA1Ud -IwSBwTCBvoAUJ45nEXTDJh0/7TNjs6TYHTDl6NWhgZqkgZcwgZQxCzAJBgNVBAYT +AAGjggEZMIIBFTAdBgNVHQ4EFgQURHsAfJwcl5+XqmvyXuaBfA6u5iswgdQGA1Ud +IwSBzDCByYAUJ45nEXTDJh0/7TNjs6TYHTDl6NWhgZqkgZcwgZQxCzAJBgNVBAYT AlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMREwDwYDVQQK DAhTYXd0b290aDETMBEGA1UECwwKQ29uc3VsdGluZzEYMBYGA1UEAwwPd3d3Lndv -bGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tggkAhv/1 -jhDeuPswEAYDVR0TBAkwBwEB/wICAIAwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEB -CwUAA4IBAQCBF3PgjjBfXqclqMCJ8CrFzHIwClXyyBM03jx8XuFWXnIEEItLBTsU -PDcOSGgjoSz1cvA2V3n6b+6wF4Pwih/wa4g7V8iyV8lONRSo1zHbaHSMMCSzncmN -jDY0MA7zTnS9FHfIE3+80yE06Ifno4Bi6iBLQO/1l9vHY2vkBhIat1XaWjQylVnE -aIUsh913X/8oz5XDaPjEMq+Oxiw5a7063RgWqKcOnZNtjnexDoZVDaSq5j/1aR3V -wF4asbyrX+sfdmrFIlep8e5VVjdhnknmvIvpnWsRb5DL1hg8gfLITJLkTXPRob6N -/tdUINTfQ33nV/Hdn6BtzeOrMPrMKQsB +bGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tghQ/MhNS +ksbfStVCBWywsi5Gwvi4ZzAQBgNVHRMECTAHAQH/AgIAgDALBgNVHQ8EBAMCAQYw +DQYJKoZIhvcNAQELBQADggEBACJXrd6bslJasKeizI9NIkDORcTk7tKQ5Mvoiy+R +7+CUi24KBU3iG95nv0RJz1VdU1V6WwKY+0Q7gX6BgEFMgNqL4uz2rktrNXyf6dp9 +2BEZEqH0VfvHEHB+SNTTgTrpShna94yaxFTaVCDU455t3uEiX4V4GE1T/V1Y6BN6 +1pBINqTYcNcWYMBG+Xp2nC758E70AiKVHeP6+q8zugII+z/DIO+RFZBE7zAmcSvH ++5cMpzTC2kxY9xI/meeclKbKaIeVklumID5PyMZ40UcvnAnbHSRPC6hNFwtlrtA1 +L9+0LJQmSC5AURXhb1zqHgcmjKVNXjlX3QmkF9HSSLnZn2g= -----END CERTIFICATE----- diff --git a/certs/test-pathlen/chainE-assembled.pem b/certs/test-pathlen/chainE-assembled.pem index be49ab5be..d60993025 100644 --- a/certs/test-pathlen/chainE-assembled.pem +++ b/certs/test-pathlen/chainE-assembled.pem @@ -5,8 +5,8 @@ Certificate: Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainE-ICA1-pathlen128, emailAddress = info@wolfssl.com Validity - Not Before: Oct 11 00:28:09 2019 GMT - Not After : Jul 7 00:28:09 2022 GMT + Not Before: May 7 07:39:05 2020 GMT + Not After : Feb 1 07:39:05 2023 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainE-entity, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -42,27 +42,27 @@ Certificate: X509v3 Basic Constraints: CA:FALSE Signature Algorithm: sha256WithRSAEncryption - 1a:af:fd:cb:5e:63:ed:ac:39:c5:e1:0f:32:2c:6e:f2:0b:23: - 1d:d8:61:e4:39:d6:a6:e6:69:a3:df:f7:3b:80:84:22:72:58: - 0e:bc:ef:92:10:65:93:16:20:e4:69:d7:d1:58:0b:33:f2:68: - a2:6b:76:36:d0:f0:36:3c:61:31:dc:44:a0:00:e2:80:9e:62: - d5:fe:cc:08:66:ca:23:88:b3:e0:48:32:be:d8:dd:d2:a6:f9: - 20:13:1a:1f:a0:65:80:8d:d8:c5:c6:c5:3f:1a:ec:ae:2a:a5: - ac:de:97:eb:56:96:c7:55:16:ee:5f:e2:74:e2:03:1f:91:69: - 70:b8:fb:5a:42:26:7a:fa:5e:8d:19:eb:5a:2e:32:09:c9:95: - be:9e:34:d4:90:88:42:7e:ad:70:8b:cf:7d:5d:d0:a8:91:aa: - 93:1a:d1:15:7c:2d:a7:af:c2:d2:d7:65:20:5e:8b:3d:b1:df: - 98:5f:56:ad:ed:57:ca:53:ac:0e:f7:86:a4:80:d2:ea:f2:01: - e6:b0:5f:6f:4f:12:17:31:7c:8e:24:43:ac:94:06:aa:6d:a4: - eb:eb:43:b6:64:ed:76:24:bf:73:d8:7c:56:7e:d5:8b:66:f6: - cb:09:0d:f7:44:34:a3:93:d8:e7:36:1a:5f:0f:51:22:09:79: - 24:dd:31:9e + a6:b3:38:8e:42:bb:bf:f6:35:b8:3c:01:3c:06:e5:f6:e4:2b: + 56:3f:82:67:85:f7:2a:e0:cb:e8:b9:38:f3:35:67:16:e3:94: + f1:60:88:0b:a7:30:49:dc:0c:f7:72:bf:d1:b9:69:6d:b7:c0: + ab:af:7e:62:df:f4:25:6d:7c:33:45:5c:2d:9b:c9:77:61:67: + f6:09:83:2e:51:8f:a1:92:c4:30:75:0b:d4:a8:33:30:09:a7: + 10:ec:a7:1a:f2:9c:f3:3c:f3:2b:d5:04:31:67:a8:de:3c:bf: + e6:68:81:21:ae:33:44:0b:b4:cd:29:22:ca:6b:51:5d:70:d6: + ba:6b:de:f8:5c:36:c2:f3:a4:57:b3:ea:dd:c8:a8:31:33:1f: + 87:bc:9a:e4:70:1b:eb:00:d2:b7:d5:62:94:64:04:98:f6:36: + 47:e8:9b:f7:76:bf:ac:d5:b1:ef:2c:3c:9b:9a:42:b2:ed:9f: + 27:42:20:a8:15:2a:6b:c1:21:f1:64:07:53:12:ce:8d:79:4c: + 87:91:ab:50:a5:93:d0:d4:aa:41:fd:47:41:4f:50:3f:df:5a: + b0:80:d5:d7:ee:10:75:59:5a:82:c2:bb:c7:50:9d:1a:2c:1f: + bc:49:6c:0d:9b:06:c2:5d:b8:0c:65:5a:5b:8f:55:8c:b9:d9: + 02:73:f6:03 -----BEGIN CERTIFICATE----- MIIErDCCA5SgAwIBAgIBZTANBgkqhkiG9w0BAQsFADCBozELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHzAdBgNVBAMMFmNo YWluRS1JQ0ExLXBhdGhsZW4xMjgxHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNz -bC5jb20wHhcNMTkxMDExMDAyODA5WhcNMjIwNzA3MDAyODA5WjCBmjELMAkGA1UE +bC5jb20wHhcNMjAwNTA3MDczOTA1WhcNMjMwMjAxMDczOTA1WjCBmjELMAkGA1UE BhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTAT BgNVBAoMDHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxFjAUBgNV BAMMDWNoYWluRS1lbnRpdHkxHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5j @@ -77,12 +77,12 @@ BgNVHSMEgbkwgbaAFER7AHycHJefl6pr8l7mgXwOruYroYGapIGXMIGUMQswCQYD VQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjERMA8G A1UECgwIU2F3dG9vdGgxEzARBgNVBAsMCkNvbnN1bHRpbmcxGDAWBgNVBAMMD3d3 dy53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIB -ZDAJBgNVHRMEAjAAMA0GCSqGSIb3DQEBCwUAA4IBAQAar/3LXmPtrDnF4Q8yLG7y -CyMd2GHkOdam5mmj3/c7gIQiclgOvO+SEGWTFiDkadfRWAsz8miia3Y20PA2PGEx -3ESgAOKAnmLV/swIZsojiLPgSDK+2N3SpvkgExofoGWAjdjFxsU/GuyuKqWs3pfr -VpbHVRbuX+J04gMfkWlwuPtaQiZ6+l6NGetaLjIJyZW+njTUkIhCfq1wi899XdCo -kaqTGtEVfC2nr8LS12UgXos9sd+YX1at7VfKU6wO94akgNLq8gHmsF9vTxIXMXyO -JEOslAaqbaTr60O2ZO12JL9z2HxWftWLZvbLCQ33RDSjk9jnNhpfD1EiCXkk3TGe +ZDAJBgNVHRMEAjAAMA0GCSqGSIb3DQEBCwUAA4IBAQCmsziOQru/9jW4PAE8BuX2 +5CtWP4Jnhfcq4MvouTjzNWcW45TxYIgLpzBJ3Az3cr/RuWltt8Crr35i3/QlbXwz +RVwtm8l3YWf2CYMuUY+hksQwdQvUqDMwCacQ7Kca8pzzPPMr1QQxZ6jePL/maIEh +rjNEC7TNKSLKa1FdcNa6a974XDbC86RXs+rdyKgxMx+HvJrkcBvrANK31WKUZASY +9jZH6Jv3dr+s1bHvLDybmkKy7Z8nQiCoFSprwSHxZAdTEs6NeUyHkatQpZPQ1KpB +/UdBT1A/31qwgNXX7hB1WVqCwrvHUJ0aLB+8SWwNmwbCXbgMZVpbj1WMudkCc/YD -----END CERTIFICATE----- Certificate: Data: @@ -91,8 +91,8 @@ Certificate: Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Oct 11 00:28:09 2019 GMT - Not After : Jul 7 00:28:09 2022 GMT + Not Before: May 7 07:39:05 2020 GMT + Not After : Feb 1 07:39:05 2023 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainE-ICA1-pathlen128, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -123,34 +123,34 @@ Certificate: X509v3 Authority Key Identifier: keyid:27:8E:67:11:74:C3:26:1D:3F:ED:33:63:B3:A4:D8:1D:30:E5:E8:D5 DirName:/C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:86:FF:F5:8E:10:DE:B8:FB + serial:3F:32:13:52:92:C6:DF:4A:D5:42:05:6C:B0:B2:2E:46:C2:F8:B8:67 X509v3 Basic Constraints: CA:TRUE, pathlen:128 X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 81:17:73:e0:8e:30:5f:5e:a7:25:a8:c0:89:f0:2a:c5:cc:72: - 30:0a:55:f2:c8:13:34:de:3c:7c:5e:e1:56:5e:72:04:10:8b: - 4b:05:3b:14:3c:37:0e:48:68:23:a1:2c:f5:72:f0:36:57:79: - fa:6f:ee:b0:17:83:f0:8a:1f:f0:6b:88:3b:57:c8:b2:57:c9: - 4e:35:14:a8:d7:31:db:68:74:8c:30:24:b3:9d:c9:8d:8c:36: - 34:30:0e:f3:4e:74:bd:14:77:c8:13:7f:bc:d3:21:34:e8:87: - e7:a3:80:62:ea:20:4b:40:ef:f5:97:db:c7:63:6b:e4:06:12: - 1a:b7:55:da:5a:34:32:95:59:c4:68:85:2c:87:dd:77:5f:ff: - 28:cf:95:c3:68:f8:c4:32:af:8e:c6:2c:39:6b:bd:3a:dd:18: - 16:a8:a7:0e:9d:93:6d:8e:77:b1:0e:86:55:0d:a4:aa:e6:3f: - f5:69:1d:d5:c0:5e:1a:b1:bc:ab:5f:eb:1f:76:6a:c5:22:57: - a9:f1:ee:55:56:37:61:9e:49:e6:bc:8b:e9:9d:6b:11:6f:90: - cb:d6:18:3c:81:f2:c8:4c:92:e4:4d:73:d1:a1:be:8d:fe:d7: - 54:20:d4:df:43:7d:e7:57:f1:dd:9f:a0:6d:cd:e3:ab:30:fa: - cc:29:0b:01 + 22:57:ad:de:9b:b2:52:5a:b0:a7:a2:cc:8f:4d:22:40:ce:45: + c4:e4:ee:d2:90:e4:cb:e8:8b:2f:91:ef:e0:94:8b:6e:0a:05: + 4d:e2:1b:de:67:bf:44:49:cf:55:5d:53:55:7a:5b:02:98:fb: + 44:3b:81:7e:81:80:41:4c:80:da:8b:e2:ec:f6:ae:4b:6b:35: + 7c:9f:e9:da:7d:d8:11:19:12:a1:f4:55:fb:c7:10:70:7e:48: + d4:d3:81:3a:e9:4a:19:da:f7:8c:9a:c4:54:da:54:20:d4:e3: + 9e:6d:de:e1:22:5f:85:78:18:4d:53:fd:5d:58:e8:13:7a:d6: + 90:48:36:a4:d8:70:d7:16:60:c0:46:f9:7a:76:9c:2e:f9:f0: + 4e:f4:02:22:95:1d:e3:fa:fa:af:33:ba:02:08:fb:3f:c3:20: + ef:91:15:90:44:ef:30:26:71:2b:c7:fb:97:0c:a7:34:c2:da: + 4c:58:f7:12:3f:99:e7:9c:94:a6:ca:68:87:95:92:5b:a6:20: + 3e:4f:c8:c6:78:d1:47:2f:9c:09:db:1d:24:4f:0b:a8:4d:17: + 0b:65:ae:d0:35:2f:df:b4:2c:94:26:48:2e:40:51:15:e1:6f: + 5c:ea:1e:07:26:8c:a5:4d:5e:39:57:dd:09:a4:17:d1:d2:48: + b9:d9:9f:68 -----BEGIN CERTIFICATE----- -MIIExDCCA6ygAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx +MIIEzzCCA7egAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx EDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNh d3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cud29sZnNz -bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMTkxMDEx -MDAyODA5WhcNMjIwNzA3MDAyODA5WjCBozELMAkGA1UEBhMCVVMxEzARBgNVBAgM +bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjAwNTA3 +MDczOTA1WhcNMjMwMjAxMDczOTA1WjCBozELMAkGA1UEBhMCVVMxEzARBgNVBAgM Cldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoMDHdvbGZTU0wg SW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHzAdBgNVBAMMFmNoYWluRS1JQ0Ex LXBhdGhsZW4xMjgxHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wggEi @@ -160,16 +160,16 @@ F/1WuDrPz+33kGpzbAaZ7w6PZdzQ6Nt7wehNbWGezFog3oY6WIH6sdRfPHRDRWE2 LP6kNa7iOcf93bOD1hfc9Zk/Zw7BYNFpjTz5YumDrmYQqkCRYwsq5cGoH46KmxGf v6ZF+xZw7WwbFJiAaQTDvRMi59kzSJ2KbA+cOQgpkoN7c6PahtZKAA+nwnu/rA8q YpZbO++f4Qi7RLrEmU+guV5Ny3Nz/u6CaU+vx1laNoFExuNQO7+NFO9+lu/BAgMB -AAGjggEOMIIBCjAdBgNVHQ4EFgQURHsAfJwcl5+XqmvyXuaBfA6u5iswgckGA1Ud -IwSBwTCBvoAUJ45nEXTDJh0/7TNjs6TYHTDl6NWhgZqkgZcwgZQxCzAJBgNVBAYT +AAGjggEZMIIBFTAdBgNVHQ4EFgQURHsAfJwcl5+XqmvyXuaBfA6u5iswgdQGA1Ud +IwSBzDCByYAUJ45nEXTDJh0/7TNjs6TYHTDl6NWhgZqkgZcwgZQxCzAJBgNVBAYT AlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMREwDwYDVQQK DAhTYXd0b290aDETMBEGA1UECwwKQ29uc3VsdGluZzEYMBYGA1UEAwwPd3d3Lndv -bGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tggkAhv/1 -jhDeuPswEAYDVR0TBAkwBwEB/wICAIAwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEB -CwUAA4IBAQCBF3PgjjBfXqclqMCJ8CrFzHIwClXyyBM03jx8XuFWXnIEEItLBTsU -PDcOSGgjoSz1cvA2V3n6b+6wF4Pwih/wa4g7V8iyV8lONRSo1zHbaHSMMCSzncmN -jDY0MA7zTnS9FHfIE3+80yE06Ifno4Bi6iBLQO/1l9vHY2vkBhIat1XaWjQylVnE -aIUsh913X/8oz5XDaPjEMq+Oxiw5a7063RgWqKcOnZNtjnexDoZVDaSq5j/1aR3V -wF4asbyrX+sfdmrFIlep8e5VVjdhnknmvIvpnWsRb5DL1hg8gfLITJLkTXPRob6N -/tdUINTfQ33nV/Hdn6BtzeOrMPrMKQsB +bGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tghQ/MhNS +ksbfStVCBWywsi5Gwvi4ZzAQBgNVHRMECTAHAQH/AgIAgDALBgNVHQ8EBAMCAQYw +DQYJKoZIhvcNAQELBQADggEBACJXrd6bslJasKeizI9NIkDORcTk7tKQ5Mvoiy+R +7+CUi24KBU3iG95nv0RJz1VdU1V6WwKY+0Q7gX6BgEFMgNqL4uz2rktrNXyf6dp9 +2BEZEqH0VfvHEHB+SNTTgTrpShna94yaxFTaVCDU455t3uEiX4V4GE1T/V1Y6BN6 +1pBINqTYcNcWYMBG+Xp2nC758E70AiKVHeP6+q8zugII+z/DIO+RFZBE7zAmcSvH ++5cMpzTC2kxY9xI/meeclKbKaIeVklumID5PyMZ40UcvnAnbHSRPC6hNFwtlrtA1 +L9+0LJQmSC5AURXhb1zqHgcmjKVNXjlX3QmkF9HSSLnZn2g= -----END CERTIFICATE----- diff --git a/certs/test-pathlen/chainE-entity.pem b/certs/test-pathlen/chainE-entity.pem index a4b979416..a80236de5 100644 --- a/certs/test-pathlen/chainE-entity.pem +++ b/certs/test-pathlen/chainE-entity.pem @@ -5,8 +5,8 @@ Certificate: Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainE-ICA1-pathlen128, emailAddress = info@wolfssl.com Validity - Not Before: Oct 11 00:28:09 2019 GMT - Not After : Jul 7 00:28:09 2022 GMT + Not Before: May 7 07:39:05 2020 GMT + Not After : Feb 1 07:39:05 2023 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainE-entity, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -42,27 +42,27 @@ Certificate: X509v3 Basic Constraints: CA:FALSE Signature Algorithm: sha256WithRSAEncryption - 1a:af:fd:cb:5e:63:ed:ac:39:c5:e1:0f:32:2c:6e:f2:0b:23: - 1d:d8:61:e4:39:d6:a6:e6:69:a3:df:f7:3b:80:84:22:72:58: - 0e:bc:ef:92:10:65:93:16:20:e4:69:d7:d1:58:0b:33:f2:68: - a2:6b:76:36:d0:f0:36:3c:61:31:dc:44:a0:00:e2:80:9e:62: - d5:fe:cc:08:66:ca:23:88:b3:e0:48:32:be:d8:dd:d2:a6:f9: - 20:13:1a:1f:a0:65:80:8d:d8:c5:c6:c5:3f:1a:ec:ae:2a:a5: - ac:de:97:eb:56:96:c7:55:16:ee:5f:e2:74:e2:03:1f:91:69: - 70:b8:fb:5a:42:26:7a:fa:5e:8d:19:eb:5a:2e:32:09:c9:95: - be:9e:34:d4:90:88:42:7e:ad:70:8b:cf:7d:5d:d0:a8:91:aa: - 93:1a:d1:15:7c:2d:a7:af:c2:d2:d7:65:20:5e:8b:3d:b1:df: - 98:5f:56:ad:ed:57:ca:53:ac:0e:f7:86:a4:80:d2:ea:f2:01: - e6:b0:5f:6f:4f:12:17:31:7c:8e:24:43:ac:94:06:aa:6d:a4: - eb:eb:43:b6:64:ed:76:24:bf:73:d8:7c:56:7e:d5:8b:66:f6: - cb:09:0d:f7:44:34:a3:93:d8:e7:36:1a:5f:0f:51:22:09:79: - 24:dd:31:9e + a6:b3:38:8e:42:bb:bf:f6:35:b8:3c:01:3c:06:e5:f6:e4:2b: + 56:3f:82:67:85:f7:2a:e0:cb:e8:b9:38:f3:35:67:16:e3:94: + f1:60:88:0b:a7:30:49:dc:0c:f7:72:bf:d1:b9:69:6d:b7:c0: + ab:af:7e:62:df:f4:25:6d:7c:33:45:5c:2d:9b:c9:77:61:67: + f6:09:83:2e:51:8f:a1:92:c4:30:75:0b:d4:a8:33:30:09:a7: + 10:ec:a7:1a:f2:9c:f3:3c:f3:2b:d5:04:31:67:a8:de:3c:bf: + e6:68:81:21:ae:33:44:0b:b4:cd:29:22:ca:6b:51:5d:70:d6: + ba:6b:de:f8:5c:36:c2:f3:a4:57:b3:ea:dd:c8:a8:31:33:1f: + 87:bc:9a:e4:70:1b:eb:00:d2:b7:d5:62:94:64:04:98:f6:36: + 47:e8:9b:f7:76:bf:ac:d5:b1:ef:2c:3c:9b:9a:42:b2:ed:9f: + 27:42:20:a8:15:2a:6b:c1:21:f1:64:07:53:12:ce:8d:79:4c: + 87:91:ab:50:a5:93:d0:d4:aa:41:fd:47:41:4f:50:3f:df:5a: + b0:80:d5:d7:ee:10:75:59:5a:82:c2:bb:c7:50:9d:1a:2c:1f: + bc:49:6c:0d:9b:06:c2:5d:b8:0c:65:5a:5b:8f:55:8c:b9:d9: + 02:73:f6:03 -----BEGIN CERTIFICATE----- MIIErDCCA5SgAwIBAgIBZTANBgkqhkiG9w0BAQsFADCBozELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHzAdBgNVBAMMFmNo YWluRS1JQ0ExLXBhdGhsZW4xMjgxHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNz -bC5jb20wHhcNMTkxMDExMDAyODA5WhcNMjIwNzA3MDAyODA5WjCBmjELMAkGA1UE +bC5jb20wHhcNMjAwNTA3MDczOTA1WhcNMjMwMjAxMDczOTA1WjCBmjELMAkGA1UE BhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTAT BgNVBAoMDHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxFjAUBgNV BAMMDWNoYWluRS1lbnRpdHkxHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5j @@ -77,10 +77,10 @@ BgNVHSMEgbkwgbaAFER7AHycHJefl6pr8l7mgXwOruYroYGapIGXMIGUMQswCQYD VQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjERMA8G A1UECgwIU2F3dG9vdGgxEzARBgNVBAsMCkNvbnN1bHRpbmcxGDAWBgNVBAMMD3d3 dy53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIB -ZDAJBgNVHRMEAjAAMA0GCSqGSIb3DQEBCwUAA4IBAQAar/3LXmPtrDnF4Q8yLG7y -CyMd2GHkOdam5mmj3/c7gIQiclgOvO+SEGWTFiDkadfRWAsz8miia3Y20PA2PGEx -3ESgAOKAnmLV/swIZsojiLPgSDK+2N3SpvkgExofoGWAjdjFxsU/GuyuKqWs3pfr -VpbHVRbuX+J04gMfkWlwuPtaQiZ6+l6NGetaLjIJyZW+njTUkIhCfq1wi899XdCo -kaqTGtEVfC2nr8LS12UgXos9sd+YX1at7VfKU6wO94akgNLq8gHmsF9vTxIXMXyO -JEOslAaqbaTr60O2ZO12JL9z2HxWftWLZvbLCQ33RDSjk9jnNhpfD1EiCXkk3TGe +ZDAJBgNVHRMEAjAAMA0GCSqGSIb3DQEBCwUAA4IBAQCmsziOQru/9jW4PAE8BuX2 +5CtWP4Jnhfcq4MvouTjzNWcW45TxYIgLpzBJ3Az3cr/RuWltt8Crr35i3/QlbXwz +RVwtm8l3YWf2CYMuUY+hksQwdQvUqDMwCacQ7Kca8pzzPPMr1QQxZ6jePL/maIEh +rjNEC7TNKSLKa1FdcNa6a974XDbC86RXs+rdyKgxMx+HvJrkcBvrANK31WKUZASY +9jZH6Jv3dr+s1bHvLDybmkKy7Z8nQiCoFSprwSHxZAdTEs6NeUyHkatQpZPQ1KpB +/UdBT1A/31qwgNXX7hB1WVqCwrvHUJ0aLB+8SWwNmwbCXbgMZVpbj1WMudkCc/YD -----END CERTIFICATE----- diff --git a/certs/test-pathlen/chainF-ICA1-pathlen1.pem b/certs/test-pathlen/chainF-ICA1-pathlen1.pem index 580610852..8f6e921d6 100644 --- a/certs/test-pathlen/chainF-ICA1-pathlen1.pem +++ b/certs/test-pathlen/chainF-ICA1-pathlen1.pem @@ -5,8 +5,8 @@ Certificate: Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainF-ICA2-pathlen0, emailAddress = info@wolfssl.com Validity - Not Before: Oct 11 00:28:09 2019 GMT - Not After : Jul 7 00:28:09 2022 GMT + Not Before: May 7 07:39:05 2020 GMT + Not After : Feb 1 07:39:05 2023 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainF-ICA1-pathlen1, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -44,27 +44,27 @@ Certificate: X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 6a:e9:07:00:56:3b:70:9a:2b:3d:42:e9:93:ad:76:a9:43:82: - a9:44:2a:35:a2:c7:56:d4:1e:cd:26:7c:d4:3f:49:19:3a:1e: - 88:ed:f7:3d:b5:88:65:41:b4:69:81:59:fd:bd:93:b3:5c:ba: - ae:60:b9:0b:e7:4b:60:a7:e4:b1:fa:ec:85:09:2b:e8:ff:84: - 77:71:75:63:c2:8a:10:51:76:7a:c9:6f:9a:a3:8b:10:b4:ed: - 9d:75:18:52:f5:a9:8a:ed:e0:0c:a4:23:96:f8:39:f6:fd:ce: - 58:21:54:2c:b1:a2:a1:73:eb:9f:93:99:0c:12:1e:9a:bb:3d: - 1e:91:da:df:b3:66:6a:cb:44:33:a8:d2:5d:31:76:d5:96:30: - 51:dd:d0:12:e9:7b:9b:9f:98:ac:35:03:0f:6f:2d:b5:b6:e1: - 30:14:50:31:2e:4c:fd:65:f5:d2:20:7b:8d:1d:a3:7f:6c:4f: - 47:d6:c8:97:26:cf:28:65:d8:a0:19:d1:ca:2e:e8:f7:11:cb: - ab:a6:32:2b:82:4d:c1:df:0a:c5:e5:9e:00:39:65:20:7e:55: - ad:81:ac:14:b1:f9:f3:88:96:94:26:e1:66:44:96:68:1b:1a: - 8d:db:f3:b9:e7:b8:9b:50:0b:03:19:53:70:c8:58:75:70:1f: - 0e:a4:bb:9f + 08:20:7b:38:85:96:2d:6e:76:b3:0a:d8:bc:a7:81:3c:ee:6b: + dd:91:7c:1d:a2:22:62:f2:0a:3f:67:e5:7b:b3:41:a4:ed:28: + 19:31:f4:be:6f:bd:b9:47:4c:1a:c5:76:b6:d7:92:8f:a4:95: + 11:53:c8:5d:10:66:c9:ba:81:67:3b:a9:73:02:25:59:e1:30: + 03:fd:81:71:20:8b:ef:b5:93:42:27:7d:16:bc:eb:1e:d9:80: + e1:e8:41:ca:5f:f3:19:ea:1c:30:32:2b:e7:83:31:f1:85:64: + 03:62:12:06:29:9d:19:0e:ba:b3:af:65:9d:77:d6:2b:18:00: + 31:72:c8:56:fa:10:89:18:ff:c1:44:32:c7:39:ac:45:18:d4: + 38:7d:90:fe:e2:78:4f:19:9c:82:31:d9:2c:2b:1e:a9:60:40: + eb:d3:a1:c3:ef:9d:ad:56:35:fe:15:2d:ed:ba:29:8f:e7:2a: + 5f:96:cc:c3:4e:2e:a3:60:59:2c:97:f9:1b:62:b2:e1:3b:ae: + 44:62:6e:12:61:95:06:68:7b:b9:e9:83:3e:e7:38:91:7c:a9: + e5:a7:73:41:e7:40:33:70:0d:6f:98:16:a8:b7:d4:b5:5a:2f: + ca:cc:fd:55:b0:ee:f5:3d:1b:9c:4e:75:8f:1c:4d:6f:dd:13: + 1e:b0:a0:78 -----BEGIN CERTIFICATE----- MIIExjCCA66gAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBoTELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNo YWluRi1JQ0EyLXBhdGhsZW4wMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTE5MTAxMTAwMjgwOVoXDTIyMDcwNzAwMjgwOVowgaExCzAJBgNVBAYT +Y29tMB4XDTIwMDUwNzA3MzkwNVoXDTIzMDIwMTA3MzkwNVowgaExCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRUwEwYD VQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2luZWVyaW5nMR0wGwYDVQQD DBRjaGFpbkYtSUNBMS1wYXRobGVuMTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xm @@ -80,10 +80,10 @@ lDELMAkGA1UEBhMCVVMxEDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVt YW4xETAPBgNVBAoMCFNhd3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYD VQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNz bC5jb22CAWQwDwYDVR0TBAgwBgEB/wIBATALBgNVHQ8EBAMCAQYwDQYJKoZIhvcN -AQELBQADggEBAGrpBwBWO3CaKz1C6ZOtdqlDgqlEKjWix1bUHs0mfNQ/SRk6Hojt -9z21iGVBtGmBWf29k7Ncuq5guQvnS2Cn5LH67IUJK+j/hHdxdWPCihBRdnrJb5qj -ixC07Z11GFL1qYrt4AykI5b4Ofb9zlghVCyxoqFz65+TmQwSHpq7PR6R2t+zZmrL -RDOo0l0xdtWWMFHd0BLpe5ufmKw1Aw9vLbW24TAUUDEuTP1l9dIge40do39sT0fW -yJcmzyhl2KAZ0cou6PcRy6umMiuCTcHfCsXlngA5ZSB+Va2BrBSx+fOIlpQm4WZE -lmgbGo3b87nnuJtQCwMZU3DIWHVwHw6ku58= +AQELBQADggEBAAggeziFli1udrMK2LyngTzua92RfB2iImLyCj9n5XuzQaTtKBkx +9L5vvblHTBrFdrbXko+klRFTyF0QZsm6gWc7qXMCJVnhMAP9gXEgi++1k0InfRa8 +6x7ZgOHoQcpf8xnqHDAyK+eDMfGFZANiEgYpnRkOurOvZZ131isYADFyyFb6EIkY +/8FEMsc5rEUY1Dh9kP7ieE8ZnIIx2SwrHqlgQOvTocPvna1WNf4VLe26KY/nKl+W +zMNOLqNgWSyX+RtisuE7rkRibhJhlQZoe7npgz7nOJF8qeWnc0HnQDNwDW+YFqi3 +1LVaL8rM/VWw7vU9G5xOdY8cTW/dEx6woHg= -----END CERTIFICATE----- diff --git a/certs/test-pathlen/chainF-ICA2-pathlen0.pem b/certs/test-pathlen/chainF-ICA2-pathlen0.pem index 128b32370..42a8c1bf3 100644 --- a/certs/test-pathlen/chainF-ICA2-pathlen0.pem +++ b/certs/test-pathlen/chainF-ICA2-pathlen0.pem @@ -5,8 +5,8 @@ Certificate: Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Oct 11 00:28:09 2019 GMT - Not After : Jul 7 00:28:09 2022 GMT + Not Before: May 7 07:39:05 2020 GMT + Not After : Feb 1 07:39:05 2023 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainF-ICA2-pathlen0, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -37,34 +37,34 @@ Certificate: X509v3 Authority Key Identifier: keyid:27:8E:67:11:74:C3:26:1D:3F:ED:33:63:B3:A4:D8:1D:30:E5:E8:D5 DirName:/C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:86:FF:F5:8E:10:DE:B8:FB + serial:3F:32:13:52:92:C6:DF:4A:D5:42:05:6C:B0:B2:2E:46:C2:F8:B8:67 X509v3 Basic Constraints: CA:TRUE, pathlen:0 X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 1a:93:21:25:ab:3a:1a:d6:18:60:81:26:16:9c:d6:4b:2f:62: - 3e:57:e2:e7:a8:59:77:fc:22:33:8b:0d:bd:14:79:80:cf:95: - 8a:d5:4f:3c:92:a0:eb:65:42:76:81:80:10:aa:03:21:ea:68: - 5d:72:98:ce:e3:01:65:f8:b2:1a:e8:8d:a9:d6:0a:2b:22:cf: - 11:22:fb:d0:7c:9f:d2:bb:04:4a:34:07:b4:4d:71:31:48:5b: - a0:08:83:ec:96:6d:5e:9a:fb:e3:da:63:32:b6:83:87:37:cb: - 67:dc:8e:7f:9d:a7:83:5c:13:bc:af:82:a0:9a:d2:b2:b7:1e: - 38:38:5c:e5:64:75:37:10:4a:82:a0:4d:f6:f8:5e:bf:36:f3: - 68:01:1a:0a:6b:e3:03:50:79:d6:14:da:26:48:d9:b6:8e:23: - 28:8a:a7:6e:c9:b0:54:c3:0b:48:25:7b:bf:e6:9f:be:f3:f0: - b9:1d:c2:30:11:e4:fc:5f:90:96:69:d9:c0:cd:89:89:58:51: - 43:8b:4c:d9:2a:d0:90:04:fc:db:21:32:c0:32:50:e4:4b:88: - 4c:42:9c:d5:2a:ba:30:6e:5e:49:87:a1:c7:03:9e:6c:45:cc: - bb:cf:d2:4a:af:1d:18:1c:9e:cb:66:50:e9:f9:b8:0b:08:bf: - 39:95:bb:62 + 68:8e:f3:20:ff:1a:de:76:72:21:a5:07:a4:88:27:e0:0f:c6: + 4b:7c:2a:e6:67:8c:75:14:ce:54:69:2f:3b:1b:71:09:fb:99: + 84:ff:ec:3f:9f:05:66:8c:cf:92:55:2e:32:3e:24:f7:34:4a: + 69:21:82:a0:ee:c4:61:20:ac:b6:f9:70:3a:17:5a:65:5a:53: + 42:b7:2d:8c:a9:65:4b:5f:07:0c:bf:7c:b9:41:80:d7:0d:8c: + c1:38:02:18:21:3c:80:99:8f:d8:eb:5e:75:12:e5:85:7f:4b: + ad:a4:fe:fd:64:f8:4f:02:d5:3e:2e:b5:f6:ea:39:a7:8b:8e: + 94:1f:fc:68:1d:bf:53:dd:27:e3:70:64:55:b5:07:25:69:6d: + 17:16:41:27:ef:08:40:81:fd:db:39:a9:b6:f7:f3:b0:97:6b: + c7:76:60:32:51:12:8f:23:5c:e2:d9:1c:35:f9:56:55:91:22: + 9c:a3:cc:0f:eb:06:9b:34:11:64:14:43:90:6e:b4:60:3c:27: + d1:8d:12:9f:3b:24:74:65:b0:42:b2:ea:cd:92:8f:55:b6:9d: + c7:3e:1b:6b:18:22:29:d7:f9:29:b1:1b:c3:c2:fd:27:8e:18: + 06:74:44:75:32:ed:3c:5d:da:b1:87:c2:ca:6b:e7:1c:7f:b3: + d5:c0:52:31 -----BEGIN CERTIFICATE----- -MIIEwTCCA6mgAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx +MIIEzDCCA7SgAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx EDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNh d3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cud29sZnNz -bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMTkxMDEx -MDAyODA5WhcNMjIwNzA3MDAyODA5WjCBoTELMAkGA1UEBhMCVVMxEzARBgNVBAgM +bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjAwNTA3 +MDczOTA1WhcNMjMwMjAxMDczOTA1WjCBoTELMAkGA1UEBhMCVVMxEzARBgNVBAgM Cldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoMDHdvbGZTU0wg SW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNoYWluRi1JQ0Ey LXBhdGhsZW4wMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMIIBIjAN @@ -74,16 +74,16 @@ bHhY4fbPRorWpXlNR4jKbGlOKNSNhKjhbB3TNn4j42TVCqP8NomQCv9+i/ouZvvH M0SS3w9DsuskfiuusEOprVOC+N4XGSZfyoysDB8kvRXtT12C6hDrBXBPA2DZI20h B00SnPNk7nb7nfnD2Bo7bqmCey0usHS3E9ZligbyJXTCJulxZlRh/io0JwfJje+g ooaTQUdzCAEHzE3s/oCIk/uutJEW+oOWhGZTzfNS2tQl4QkVIOIQ6t057wIDAQAB -o4IBDTCCAQkwHQYDVR0OBBYEFEpTSrcweDWRtMvdyCJ0ia+AD39oMIHJBgNVHSME -gcEwgb6AFCeOZxF0wyYdP+0zY7Ok2B0w5ejVoYGapIGXMIGUMQswCQYDVQQGEwJV +o4IBGDCCARQwHQYDVR0OBBYEFEpTSrcweDWRtMvdyCJ0ia+AD39oMIHUBgNVHSME +gcwwgcmAFCeOZxF0wyYdP+0zY7Ok2B0w5ejVoYGapIGXMIGUMQswCQYDVQQGEwJV UzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjERMA8GA1UECgwI U2F3dG9vdGgxEzARBgNVBAsMCkNvbnN1bHRpbmcxGDAWBgNVBAMMD3d3dy53b2xm -c3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIJAIb/9Y4Q -3rj7MA8GA1UdEwQIMAYBAf8CAQAwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBCwUA -A4IBAQAakyElqzoa1hhggSYWnNZLL2I+V+LnqFl3/CIziw29FHmAz5WK1U88kqDr -ZUJ2gYAQqgMh6mhdcpjO4wFl+LIa6I2p1gorIs8RIvvQfJ/SuwRKNAe0TXExSFug -CIPslm1emvvj2mMytoOHN8tn3I5/naeDXBO8r4KgmtKytx44OFzlZHU3EEqCoE32 -+F6/NvNoARoKa+MDUHnWFNomSNm2jiMoiqduybBUwwtIJXu/5p++8/C5HcIwEeT8 -X5CWadnAzYmJWFFDi0zZKtCQBPzbITLAMlDkS4hMQpzVKrowbl5Jh6HHA55sRcy7 -z9JKrx0YHJ7LZlDp+bgLCL85lbti +c3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIUPzITUpLG +30rVQgVssLIuRsL4uGcwDwYDVR0TBAgwBgEB/wIBADALBgNVHQ8EBAMCAQYwDQYJ +KoZIhvcNAQELBQADggEBAGiO8yD/Gt52ciGlB6SIJ+APxkt8KuZnjHUUzlRpLzsb +cQn7mYT/7D+fBWaMz5JVLjI+JPc0SmkhgqDuxGEgrLb5cDoXWmVaU0K3LYypZUtf +Bwy/fLlBgNcNjME4AhghPICZj9jrXnUS5YV/S62k/v1k+E8C1T4utfbqOaeLjpQf +/Ggdv1PdJ+NwZFW1ByVpbRcWQSfvCECB/ds5qbb387CXa8d2YDJREo8jXOLZHDX5 +VlWRIpyjzA/rBps0EWQUQ5ButGA8J9GNEp87JHRlsEKy6s2Sj1W2ncc+G2sYIinX ++SmxG8PC/SeOGAZ0RHUy7Txd2rGHwspr5xx/s9XAUjE= -----END CERTIFICATE----- diff --git a/certs/test-pathlen/chainF-assembled.pem b/certs/test-pathlen/chainF-assembled.pem index 14b0e0b25..bbe96262c 100644 --- a/certs/test-pathlen/chainF-assembled.pem +++ b/certs/test-pathlen/chainF-assembled.pem @@ -5,8 +5,8 @@ Certificate: Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainF-ICA1-pathlen1, emailAddress = info@wolfssl.com Validity - Not Before: Oct 11 00:28:09 2019 GMT - Not After : Jul 7 00:28:09 2022 GMT + Not Before: May 7 07:39:05 2020 GMT + Not After : Feb 1 07:39:05 2023 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainF-entity, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -42,27 +42,27 @@ Certificate: X509v3 Basic Constraints: CA:FALSE Signature Algorithm: sha256WithRSAEncryption - 24:20:aa:3a:98:e1:d4:42:a1:0f:7b:58:10:83:72:da:d4:ed: - e2:e6:08:0d:d2:fb:c0:ff:5b:97:72:03:b1:20:fa:b1:88:60: - 29:af:44:64:82:51:44:75:a7:cb:90:0d:af:63:a3:93:6f:a8: - 12:18:16:60:2f:58:37:ec:be:23:64:1b:06:ad:a7:d6:fa:cf: - 34:06:3d:99:21:19:d4:27:24:19:a0:00:8a:28:80:7b:8a:48: - ea:61:63:20:4f:14:f2:60:a0:a3:3a:5a:45:4a:b1:24:1d:46: - 69:84:76:0e:ff:29:5b:4b:74:a2:75:2c:f1:4b:ba:dc:c5:4b: - dd:b3:52:b9:fd:45:8d:fd:71:68:78:71:f8:3e:7c:62:50:a2: - 8d:07:df:45:a7:39:9c:df:df:9d:78:de:a4:9e:ef:e6:0a:7a: - 53:42:0c:9e:7e:4a:bf:9c:70:66:a7:08:ab:bf:b5:f8:b3:3b: - 99:28:2c:73:f4:6f:da:4d:21:59:35:82:58:f4:5e:59:25:1e: - d6:7a:0a:c8:7f:4a:74:33:16:86:b4:bb:65:2e:9b:32:e5:78: - 53:95:33:38:a4:8a:04:36:eb:fa:51:d5:46:94:72:7d:d7:16: - c9:e7:e3:45:94:ab:ec:08:b6:87:e4:3a:34:7c:ca:dd:f9:27: - 65:21:c5:5f + 60:29:4d:33:92:ad:24:1e:0e:a2:b6:e4:f3:2e:47:c2:0c:6b: + 4d:1e:28:62:5a:d2:c1:03:a2:c2:83:4f:2f:79:c9:1b:f3:15: + e0:e9:90:ce:e2:a4:e9:a0:20:b3:df:22:02:c4:da:c7:d8:ea: + 7d:45:8f:65:1b:d5:cf:1f:5a:90:6b:cc:e8:28:69:78:e8:67: + 43:04:92:9b:8b:80:f1:36:40:9e:35:ca:91:7f:dc:80:33:41: + 4c:98:88:61:5a:07:bf:52:b9:79:df:70:40:13:76:58:fb:7b: + 78:09:c9:01:8a:f3:09:1d:a7:04:4b:28:ce:dc:0a:96:11:dc: + 39:7e:6f:89:8c:63:a8:c1:a5:5b:24:7a:f3:0e:16:bd:6d:f0: + 4b:5b:04:5a:ba:66:ef:0d:35:9e:7a:61:39:c8:24:10:82:70: + 7b:67:b1:5c:56:fe:d5:38:f7:3d:a4:55:05:99:75:74:15:a9: + 3b:d4:f1:57:73:36:d2:a3:c5:c0:a3:a2:d9:f7:31:14:f8:59: + 7b:87:ae:ad:13:c3:c9:0a:56:b2:a4:b4:c8:ae:88:5c:0e:1f: + 07:4b:2f:ce:19:1e:a1:f0:31:b3:13:7e:bb:1b:f2:8c:c3:86: + 7f:41:95:cc:ea:2f:34:91:fc:61:60:8d:54:95:ed:f0:26:b2: + c0:ae:55:0f -----BEGIN CERTIFICATE----- MIIEtzCCA5+gAwIBAgIBZTANBgkqhkiG9w0BAQsFADCBoTELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNo YWluRi1JQ0ExLXBhdGhsZW4xMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTE5MTAxMTAwMjgwOVoXDTIyMDcwNzAwMjgwOVowgZoxCzAJBgNVBAYT +Y29tMB4XDTIwMDUwNzA3MzkwNVoXDTIzMDIwMTA3MzkwNVowgZoxCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRUwEwYD VQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2luZWVyaW5nMRYwFAYDVQQD DA1jaGFpbkYtZW50aXR5MR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29t @@ -77,13 +77,13 @@ VR0jBIHGMIHDgBR1MiEFK2D+RBevGGWGhRmCP/lkg6GBp6SBpDCBoTELMAkGA1UE BhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTAT BgNVBAoMDHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNV BAMMFGNoYWluRi1JQ0EyLXBhdGhsZW4wMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdv -bGZzc2wuY29tggFkMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBACQgqjqY -4dRCoQ97WBCDctrU7eLmCA3S+8D/W5dyA7Eg+rGIYCmvRGSCUUR1p8uQDa9jo5Nv -qBIYFmAvWDfsviNkGwatp9b6zzQGPZkhGdQnJBmgAIoogHuKSOphYyBPFPJgoKM6 -WkVKsSQdRmmEdg7/KVtLdKJ1LPFLutzFS92zUrn9RY39cWh4cfg+fGJQoo0H30Wn -OZzf35143qSe7+YKelNCDJ5+Sr+ccGanCKu/tfizO5koLHP0b9pNIVk1glj0Xlkl -HtZ6Csh/SnQzFoa0u2UumzLleFOVMzikigQ26/pR1UaUcn3XFsnn40WUq+wItofk -OjR8yt35J2UhxV8= +bGZzc2wuY29tggFkMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAGApTTOS +rSQeDqK25PMuR8IMa00eKGJa0sEDosKDTy95yRvzFeDpkM7ipOmgILPfIgLE2sfY +6n1Fj2Ub1c8fWpBrzOgoaXjoZ0MEkpuLgPE2QJ41ypF/3IAzQUyYiGFaB79SuXnf +cEATdlj7e3gJyQGK8wkdpwRLKM7cCpYR3Dl+b4mMY6jBpVskevMOFr1t8EtbBFq6 +Zu8NNZ56YTnIJBCCcHtnsVxW/tU49z2kVQWZdXQVqTvU8VdzNtKjxcCjotn3MRT4 +WXuHrq0Tw8kKVrKktMiuiFwOHwdLL84ZHqHwMbMTfrsb8ozDhn9BlczqLzSR/GFg +jVSV7fAmssCuVQ8= -----END CERTIFICATE----- Certificate: Data: @@ -92,8 +92,8 @@ Certificate: Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainF-ICA2-pathlen0, emailAddress = info@wolfssl.com Validity - Not Before: Oct 11 00:28:09 2019 GMT - Not After : Jul 7 00:28:09 2022 GMT + Not Before: May 7 07:39:05 2020 GMT + Not After : Feb 1 07:39:05 2023 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainF-ICA1-pathlen1, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -131,27 +131,27 @@ Certificate: X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 6a:e9:07:00:56:3b:70:9a:2b:3d:42:e9:93:ad:76:a9:43:82: - a9:44:2a:35:a2:c7:56:d4:1e:cd:26:7c:d4:3f:49:19:3a:1e: - 88:ed:f7:3d:b5:88:65:41:b4:69:81:59:fd:bd:93:b3:5c:ba: - ae:60:b9:0b:e7:4b:60:a7:e4:b1:fa:ec:85:09:2b:e8:ff:84: - 77:71:75:63:c2:8a:10:51:76:7a:c9:6f:9a:a3:8b:10:b4:ed: - 9d:75:18:52:f5:a9:8a:ed:e0:0c:a4:23:96:f8:39:f6:fd:ce: - 58:21:54:2c:b1:a2:a1:73:eb:9f:93:99:0c:12:1e:9a:bb:3d: - 1e:91:da:df:b3:66:6a:cb:44:33:a8:d2:5d:31:76:d5:96:30: - 51:dd:d0:12:e9:7b:9b:9f:98:ac:35:03:0f:6f:2d:b5:b6:e1: - 30:14:50:31:2e:4c:fd:65:f5:d2:20:7b:8d:1d:a3:7f:6c:4f: - 47:d6:c8:97:26:cf:28:65:d8:a0:19:d1:ca:2e:e8:f7:11:cb: - ab:a6:32:2b:82:4d:c1:df:0a:c5:e5:9e:00:39:65:20:7e:55: - ad:81:ac:14:b1:f9:f3:88:96:94:26:e1:66:44:96:68:1b:1a: - 8d:db:f3:b9:e7:b8:9b:50:0b:03:19:53:70:c8:58:75:70:1f: - 0e:a4:bb:9f + 08:20:7b:38:85:96:2d:6e:76:b3:0a:d8:bc:a7:81:3c:ee:6b: + dd:91:7c:1d:a2:22:62:f2:0a:3f:67:e5:7b:b3:41:a4:ed:28: + 19:31:f4:be:6f:bd:b9:47:4c:1a:c5:76:b6:d7:92:8f:a4:95: + 11:53:c8:5d:10:66:c9:ba:81:67:3b:a9:73:02:25:59:e1:30: + 03:fd:81:71:20:8b:ef:b5:93:42:27:7d:16:bc:eb:1e:d9:80: + e1:e8:41:ca:5f:f3:19:ea:1c:30:32:2b:e7:83:31:f1:85:64: + 03:62:12:06:29:9d:19:0e:ba:b3:af:65:9d:77:d6:2b:18:00: + 31:72:c8:56:fa:10:89:18:ff:c1:44:32:c7:39:ac:45:18:d4: + 38:7d:90:fe:e2:78:4f:19:9c:82:31:d9:2c:2b:1e:a9:60:40: + eb:d3:a1:c3:ef:9d:ad:56:35:fe:15:2d:ed:ba:29:8f:e7:2a: + 5f:96:cc:c3:4e:2e:a3:60:59:2c:97:f9:1b:62:b2:e1:3b:ae: + 44:62:6e:12:61:95:06:68:7b:b9:e9:83:3e:e7:38:91:7c:a9: + e5:a7:73:41:e7:40:33:70:0d:6f:98:16:a8:b7:d4:b5:5a:2f: + ca:cc:fd:55:b0:ee:f5:3d:1b:9c:4e:75:8f:1c:4d:6f:dd:13: + 1e:b0:a0:78 -----BEGIN CERTIFICATE----- MIIExjCCA66gAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBoTELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNo YWluRi1JQ0EyLXBhdGhsZW4wMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTE5MTAxMTAwMjgwOVoXDTIyMDcwNzAwMjgwOVowgaExCzAJBgNVBAYT +Y29tMB4XDTIwMDUwNzA3MzkwNVoXDTIzMDIwMTA3MzkwNVowgaExCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRUwEwYD VQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2luZWVyaW5nMR0wGwYDVQQD DBRjaGFpbkYtSUNBMS1wYXRobGVuMTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xm @@ -167,12 +167,12 @@ lDELMAkGA1UEBhMCVVMxEDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVt YW4xETAPBgNVBAoMCFNhd3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYD VQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNz bC5jb22CAWQwDwYDVR0TBAgwBgEB/wIBATALBgNVHQ8EBAMCAQYwDQYJKoZIhvcN -AQELBQADggEBAGrpBwBWO3CaKz1C6ZOtdqlDgqlEKjWix1bUHs0mfNQ/SRk6Hojt -9z21iGVBtGmBWf29k7Ncuq5guQvnS2Cn5LH67IUJK+j/hHdxdWPCihBRdnrJb5qj -ixC07Z11GFL1qYrt4AykI5b4Ofb9zlghVCyxoqFz65+TmQwSHpq7PR6R2t+zZmrL -RDOo0l0xdtWWMFHd0BLpe5ufmKw1Aw9vLbW24TAUUDEuTP1l9dIge40do39sT0fW -yJcmzyhl2KAZ0cou6PcRy6umMiuCTcHfCsXlngA5ZSB+Va2BrBSx+fOIlpQm4WZE -lmgbGo3b87nnuJtQCwMZU3DIWHVwHw6ku58= +AQELBQADggEBAAggeziFli1udrMK2LyngTzua92RfB2iImLyCj9n5XuzQaTtKBkx +9L5vvblHTBrFdrbXko+klRFTyF0QZsm6gWc7qXMCJVnhMAP9gXEgi++1k0InfRa8 +6x7ZgOHoQcpf8xnqHDAyK+eDMfGFZANiEgYpnRkOurOvZZ131isYADFyyFb6EIkY +/8FEMsc5rEUY1Dh9kP7ieE8ZnIIx2SwrHqlgQOvTocPvna1WNf4VLe26KY/nKl+W +zMNOLqNgWSyX+RtisuE7rkRibhJhlQZoe7npgz7nOJF8qeWnc0HnQDNwDW+YFqi3 +1LVaL8rM/VWw7vU9G5xOdY8cTW/dEx6woHg= -----END CERTIFICATE----- Certificate: Data: @@ -181,8 +181,8 @@ Certificate: Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Oct 11 00:28:09 2019 GMT - Not After : Jul 7 00:28:09 2022 GMT + Not Before: May 7 07:39:05 2020 GMT + Not After : Feb 1 07:39:05 2023 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainF-ICA2-pathlen0, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -213,34 +213,34 @@ Certificate: X509v3 Authority Key Identifier: keyid:27:8E:67:11:74:C3:26:1D:3F:ED:33:63:B3:A4:D8:1D:30:E5:E8:D5 DirName:/C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:86:FF:F5:8E:10:DE:B8:FB + serial:3F:32:13:52:92:C6:DF:4A:D5:42:05:6C:B0:B2:2E:46:C2:F8:B8:67 X509v3 Basic Constraints: CA:TRUE, pathlen:0 X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 1a:93:21:25:ab:3a:1a:d6:18:60:81:26:16:9c:d6:4b:2f:62: - 3e:57:e2:e7:a8:59:77:fc:22:33:8b:0d:bd:14:79:80:cf:95: - 8a:d5:4f:3c:92:a0:eb:65:42:76:81:80:10:aa:03:21:ea:68: - 5d:72:98:ce:e3:01:65:f8:b2:1a:e8:8d:a9:d6:0a:2b:22:cf: - 11:22:fb:d0:7c:9f:d2:bb:04:4a:34:07:b4:4d:71:31:48:5b: - a0:08:83:ec:96:6d:5e:9a:fb:e3:da:63:32:b6:83:87:37:cb: - 67:dc:8e:7f:9d:a7:83:5c:13:bc:af:82:a0:9a:d2:b2:b7:1e: - 38:38:5c:e5:64:75:37:10:4a:82:a0:4d:f6:f8:5e:bf:36:f3: - 68:01:1a:0a:6b:e3:03:50:79:d6:14:da:26:48:d9:b6:8e:23: - 28:8a:a7:6e:c9:b0:54:c3:0b:48:25:7b:bf:e6:9f:be:f3:f0: - b9:1d:c2:30:11:e4:fc:5f:90:96:69:d9:c0:cd:89:89:58:51: - 43:8b:4c:d9:2a:d0:90:04:fc:db:21:32:c0:32:50:e4:4b:88: - 4c:42:9c:d5:2a:ba:30:6e:5e:49:87:a1:c7:03:9e:6c:45:cc: - bb:cf:d2:4a:af:1d:18:1c:9e:cb:66:50:e9:f9:b8:0b:08:bf: - 39:95:bb:62 + 68:8e:f3:20:ff:1a:de:76:72:21:a5:07:a4:88:27:e0:0f:c6: + 4b:7c:2a:e6:67:8c:75:14:ce:54:69:2f:3b:1b:71:09:fb:99: + 84:ff:ec:3f:9f:05:66:8c:cf:92:55:2e:32:3e:24:f7:34:4a: + 69:21:82:a0:ee:c4:61:20:ac:b6:f9:70:3a:17:5a:65:5a:53: + 42:b7:2d:8c:a9:65:4b:5f:07:0c:bf:7c:b9:41:80:d7:0d:8c: + c1:38:02:18:21:3c:80:99:8f:d8:eb:5e:75:12:e5:85:7f:4b: + ad:a4:fe:fd:64:f8:4f:02:d5:3e:2e:b5:f6:ea:39:a7:8b:8e: + 94:1f:fc:68:1d:bf:53:dd:27:e3:70:64:55:b5:07:25:69:6d: + 17:16:41:27:ef:08:40:81:fd:db:39:a9:b6:f7:f3:b0:97:6b: + c7:76:60:32:51:12:8f:23:5c:e2:d9:1c:35:f9:56:55:91:22: + 9c:a3:cc:0f:eb:06:9b:34:11:64:14:43:90:6e:b4:60:3c:27: + d1:8d:12:9f:3b:24:74:65:b0:42:b2:ea:cd:92:8f:55:b6:9d: + c7:3e:1b:6b:18:22:29:d7:f9:29:b1:1b:c3:c2:fd:27:8e:18: + 06:74:44:75:32:ed:3c:5d:da:b1:87:c2:ca:6b:e7:1c:7f:b3: + d5:c0:52:31 -----BEGIN CERTIFICATE----- -MIIEwTCCA6mgAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx +MIIEzDCCA7SgAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx EDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNh d3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cud29sZnNz -bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMTkxMDEx -MDAyODA5WhcNMjIwNzA3MDAyODA5WjCBoTELMAkGA1UEBhMCVVMxEzARBgNVBAgM +bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjAwNTA3 +MDczOTA1WhcNMjMwMjAxMDczOTA1WjCBoTELMAkGA1UEBhMCVVMxEzARBgNVBAgM Cldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoMDHdvbGZTU0wg SW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNoYWluRi1JQ0Ey LXBhdGhsZW4wMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMIIBIjAN @@ -250,16 +250,16 @@ bHhY4fbPRorWpXlNR4jKbGlOKNSNhKjhbB3TNn4j42TVCqP8NomQCv9+i/ouZvvH M0SS3w9DsuskfiuusEOprVOC+N4XGSZfyoysDB8kvRXtT12C6hDrBXBPA2DZI20h B00SnPNk7nb7nfnD2Bo7bqmCey0usHS3E9ZligbyJXTCJulxZlRh/io0JwfJje+g ooaTQUdzCAEHzE3s/oCIk/uutJEW+oOWhGZTzfNS2tQl4QkVIOIQ6t057wIDAQAB -o4IBDTCCAQkwHQYDVR0OBBYEFEpTSrcweDWRtMvdyCJ0ia+AD39oMIHJBgNVHSME -gcEwgb6AFCeOZxF0wyYdP+0zY7Ok2B0w5ejVoYGapIGXMIGUMQswCQYDVQQGEwJV +o4IBGDCCARQwHQYDVR0OBBYEFEpTSrcweDWRtMvdyCJ0ia+AD39oMIHUBgNVHSME +gcwwgcmAFCeOZxF0wyYdP+0zY7Ok2B0w5ejVoYGapIGXMIGUMQswCQYDVQQGEwJV UzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjERMA8GA1UECgwI U2F3dG9vdGgxEzARBgNVBAsMCkNvbnN1bHRpbmcxGDAWBgNVBAMMD3d3dy53b2xm -c3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIJAIb/9Y4Q -3rj7MA8GA1UdEwQIMAYBAf8CAQAwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBCwUA -A4IBAQAakyElqzoa1hhggSYWnNZLL2I+V+LnqFl3/CIziw29FHmAz5WK1U88kqDr -ZUJ2gYAQqgMh6mhdcpjO4wFl+LIa6I2p1gorIs8RIvvQfJ/SuwRKNAe0TXExSFug -CIPslm1emvvj2mMytoOHN8tn3I5/naeDXBO8r4KgmtKytx44OFzlZHU3EEqCoE32 -+F6/NvNoARoKa+MDUHnWFNomSNm2jiMoiqduybBUwwtIJXu/5p++8/C5HcIwEeT8 -X5CWadnAzYmJWFFDi0zZKtCQBPzbITLAMlDkS4hMQpzVKrowbl5Jh6HHA55sRcy7 -z9JKrx0YHJ7LZlDp+bgLCL85lbti +c3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIUPzITUpLG +30rVQgVssLIuRsL4uGcwDwYDVR0TBAgwBgEB/wIBADALBgNVHQ8EBAMCAQYwDQYJ +KoZIhvcNAQELBQADggEBAGiO8yD/Gt52ciGlB6SIJ+APxkt8KuZnjHUUzlRpLzsb +cQn7mYT/7D+fBWaMz5JVLjI+JPc0SmkhgqDuxGEgrLb5cDoXWmVaU0K3LYypZUtf +Bwy/fLlBgNcNjME4AhghPICZj9jrXnUS5YV/S62k/v1k+E8C1T4utfbqOaeLjpQf +/Ggdv1PdJ+NwZFW1ByVpbRcWQSfvCECB/ds5qbb387CXa8d2YDJREo8jXOLZHDX5 +VlWRIpyjzA/rBps0EWQUQ5ButGA8J9GNEp87JHRlsEKy6s2Sj1W2ncc+G2sYIinX ++SmxG8PC/SeOGAZ0RHUy7Txd2rGHwspr5xx/s9XAUjE= -----END CERTIFICATE----- diff --git a/certs/test-pathlen/chainF-entity.pem b/certs/test-pathlen/chainF-entity.pem index 27bd2dcd7..6a12127a5 100644 --- a/certs/test-pathlen/chainF-entity.pem +++ b/certs/test-pathlen/chainF-entity.pem @@ -5,8 +5,8 @@ Certificate: Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainF-ICA1-pathlen1, emailAddress = info@wolfssl.com Validity - Not Before: Oct 11 00:28:09 2019 GMT - Not After : Jul 7 00:28:09 2022 GMT + Not Before: May 7 07:39:05 2020 GMT + Not After : Feb 1 07:39:05 2023 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainF-entity, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -42,27 +42,27 @@ Certificate: X509v3 Basic Constraints: CA:FALSE Signature Algorithm: sha256WithRSAEncryption - 24:20:aa:3a:98:e1:d4:42:a1:0f:7b:58:10:83:72:da:d4:ed: - e2:e6:08:0d:d2:fb:c0:ff:5b:97:72:03:b1:20:fa:b1:88:60: - 29:af:44:64:82:51:44:75:a7:cb:90:0d:af:63:a3:93:6f:a8: - 12:18:16:60:2f:58:37:ec:be:23:64:1b:06:ad:a7:d6:fa:cf: - 34:06:3d:99:21:19:d4:27:24:19:a0:00:8a:28:80:7b:8a:48: - ea:61:63:20:4f:14:f2:60:a0:a3:3a:5a:45:4a:b1:24:1d:46: - 69:84:76:0e:ff:29:5b:4b:74:a2:75:2c:f1:4b:ba:dc:c5:4b: - dd:b3:52:b9:fd:45:8d:fd:71:68:78:71:f8:3e:7c:62:50:a2: - 8d:07:df:45:a7:39:9c:df:df:9d:78:de:a4:9e:ef:e6:0a:7a: - 53:42:0c:9e:7e:4a:bf:9c:70:66:a7:08:ab:bf:b5:f8:b3:3b: - 99:28:2c:73:f4:6f:da:4d:21:59:35:82:58:f4:5e:59:25:1e: - d6:7a:0a:c8:7f:4a:74:33:16:86:b4:bb:65:2e:9b:32:e5:78: - 53:95:33:38:a4:8a:04:36:eb:fa:51:d5:46:94:72:7d:d7:16: - c9:e7:e3:45:94:ab:ec:08:b6:87:e4:3a:34:7c:ca:dd:f9:27: - 65:21:c5:5f + 60:29:4d:33:92:ad:24:1e:0e:a2:b6:e4:f3:2e:47:c2:0c:6b: + 4d:1e:28:62:5a:d2:c1:03:a2:c2:83:4f:2f:79:c9:1b:f3:15: + e0:e9:90:ce:e2:a4:e9:a0:20:b3:df:22:02:c4:da:c7:d8:ea: + 7d:45:8f:65:1b:d5:cf:1f:5a:90:6b:cc:e8:28:69:78:e8:67: + 43:04:92:9b:8b:80:f1:36:40:9e:35:ca:91:7f:dc:80:33:41: + 4c:98:88:61:5a:07:bf:52:b9:79:df:70:40:13:76:58:fb:7b: + 78:09:c9:01:8a:f3:09:1d:a7:04:4b:28:ce:dc:0a:96:11:dc: + 39:7e:6f:89:8c:63:a8:c1:a5:5b:24:7a:f3:0e:16:bd:6d:f0: + 4b:5b:04:5a:ba:66:ef:0d:35:9e:7a:61:39:c8:24:10:82:70: + 7b:67:b1:5c:56:fe:d5:38:f7:3d:a4:55:05:99:75:74:15:a9: + 3b:d4:f1:57:73:36:d2:a3:c5:c0:a3:a2:d9:f7:31:14:f8:59: + 7b:87:ae:ad:13:c3:c9:0a:56:b2:a4:b4:c8:ae:88:5c:0e:1f: + 07:4b:2f:ce:19:1e:a1:f0:31:b3:13:7e:bb:1b:f2:8c:c3:86: + 7f:41:95:cc:ea:2f:34:91:fc:61:60:8d:54:95:ed:f0:26:b2: + c0:ae:55:0f -----BEGIN CERTIFICATE----- MIIEtzCCA5+gAwIBAgIBZTANBgkqhkiG9w0BAQsFADCBoTELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNo YWluRi1JQ0ExLXBhdGhsZW4xMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTE5MTAxMTAwMjgwOVoXDTIyMDcwNzAwMjgwOVowgZoxCzAJBgNVBAYT +Y29tMB4XDTIwMDUwNzA3MzkwNVoXDTIzMDIwMTA3MzkwNVowgZoxCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRUwEwYD VQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2luZWVyaW5nMRYwFAYDVQQD DA1jaGFpbkYtZW50aXR5MR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29t @@ -77,11 +77,11 @@ VR0jBIHGMIHDgBR1MiEFK2D+RBevGGWGhRmCP/lkg6GBp6SBpDCBoTELMAkGA1UE BhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTAT BgNVBAoMDHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNV BAMMFGNoYWluRi1JQ0EyLXBhdGhsZW4wMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdv -bGZzc2wuY29tggFkMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBACQgqjqY -4dRCoQ97WBCDctrU7eLmCA3S+8D/W5dyA7Eg+rGIYCmvRGSCUUR1p8uQDa9jo5Nv -qBIYFmAvWDfsviNkGwatp9b6zzQGPZkhGdQnJBmgAIoogHuKSOphYyBPFPJgoKM6 -WkVKsSQdRmmEdg7/KVtLdKJ1LPFLutzFS92zUrn9RY39cWh4cfg+fGJQoo0H30Wn -OZzf35143qSe7+YKelNCDJ5+Sr+ccGanCKu/tfizO5koLHP0b9pNIVk1glj0Xlkl -HtZ6Csh/SnQzFoa0u2UumzLleFOVMzikigQ26/pR1UaUcn3XFsnn40WUq+wItofk -OjR8yt35J2UhxV8= +bGZzc2wuY29tggFkMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAGApTTOS +rSQeDqK25PMuR8IMa00eKGJa0sEDosKDTy95yRvzFeDpkM7ipOmgILPfIgLE2sfY +6n1Fj2Ub1c8fWpBrzOgoaXjoZ0MEkpuLgPE2QJ41ypF/3IAzQUyYiGFaB79SuXnf +cEATdlj7e3gJyQGK8wkdpwRLKM7cCpYR3Dl+b4mMY6jBpVskevMOFr1t8EtbBFq6 +Zu8NNZ56YTnIJBCCcHtnsVxW/tU49z2kVQWZdXQVqTvU8VdzNtKjxcCjotn3MRT4 +WXuHrq0Tw8kKVrKktMiuiFwOHwdLL84ZHqHwMbMTfrsb8ozDhn9BlczqLzSR/GFg +jVSV7fAmssCuVQ8= -----END CERTIFICATE----- diff --git a/certs/test-pathlen/chainG-ICA1-pathlen0.pem b/certs/test-pathlen/chainG-ICA1-pathlen0.pem index ad1f9456c..6ca468455 100644 --- a/certs/test-pathlen/chainG-ICA1-pathlen0.pem +++ b/certs/test-pathlen/chainG-ICA1-pathlen0.pem @@ -5,8 +5,8 @@ Certificate: Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainG-ICA2-pathlen1, emailAddress = info@wolfssl.com Validity - Not Before: Oct 11 00:28:09 2019 GMT - Not After : Jul 7 00:28:09 2022 GMT + Not Before: May 7 07:39:05 2020 GMT + Not After : Feb 1 07:39:05 2023 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainG-ICA1-pathlen0, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -44,27 +44,27 @@ Certificate: X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 56:81:8e:f1:e8:5f:b2:9f:ab:8f:2e:ec:79:c7:3d:0d:af:f2: - 18:f7:d2:2e:07:2c:d0:1d:2a:90:c7:c1:fc:ac:aa:0d:86:f0: - 78:6d:33:43:81:02:70:3b:e6:d9:75:db:2e:ca:4a:61:4d:20: - cb:a9:3e:0c:a9:b3:ca:ff:bb:52:cb:06:14:2d:53:b5:68:9f: - a7:02:83:90:3d:f8:b6:a2:46:e4:2b:c5:48:ed:50:7f:ea:27: - cf:7b:9d:88:1f:1c:5d:16:b7:21:0a:42:95:0b:67:6c:29:34: - 64:61:c0:f5:00:6f:36:dc:e9:68:e3:81:bd:07:a6:bc:6c:9d: - f0:61:b0:50:14:d5:89:46:1f:34:b0:90:42:a0:c3:09:64:6e: - a4:46:13:c6:6a:86:98:63:c7:8e:79:d3:a2:d6:73:23:68:a9: - 8d:ac:b0:93:b0:89:f5:ee:08:cc:47:14:95:3b:1f:d3:eb:42: - 3f:68:b8:6b:80:11:8d:85:8c:90:39:29:e8:5d:7d:e5:c1:c2: - 5c:e7:92:8c:ab:79:17:74:60:a5:ee:fe:52:ff:4a:78:62:5c: - 1b:4b:f8:44:41:8c:05:c7:11:e7:5a:c9:a1:a1:d3:6b:82:36: - c3:1f:23:19:ce:68:9d:c3:80:d5:08:8d:68:d2:49:52:95:44: - 3f:1b:50:9d + 39:99:54:2f:2f:e7:73:86:78:6d:5a:76:90:cd:46:fe:32:ac: + 19:f6:8a:18:7a:c4:8d:bf:14:ed:9d:f2:00:f4:f1:2d:b4:a8: + 7a:f8:88:8d:04:ad:20:94:d9:05:1c:82:0c:01:92:9a:7b:95: + 8a:21:84:7f:fe:17:f3:1f:bf:ab:06:be:a5:c8:c9:53:f1:58: + 15:04:58:aa:e7:fb:80:28:d2:d1:40:52:c7:46:33:d8:9e:fe: + c6:2e:82:49:b2:98:08:23:8e:87:09:8f:8e:7a:9c:d3:b2:3f: + 83:98:0d:72:85:42:eb:4f:7a:a0:3e:29:62:58:aa:9a:9b:be: + ae:31:52:8b:b4:6e:d5:1d:5a:7e:0c:36:60:0c:04:5f:b7:28: + b1:e8:ea:6d:68:b9:12:3f:db:b3:54:4e:dd:8c:8f:e7:98:93: + 58:1a:68:0b:b7:3b:5c:7d:c1:77:b1:98:29:92:f4:91:5e:44: + 55:79:fd:a2:0e:a2:87:57:9b:6f:11:6d:58:ef:f1:dd:4a:36: + f5:4b:ad:73:dc:4f:cf:f0:70:46:65:36:95:80:88:d4:55:5a: + 21:3d:20:b2:98:93:0c:7b:db:1e:08:f6:b8:e9:02:92:a4:f6: + a5:a2:d6:fb:7a:40:8f:bd:99:bc:e2:74:1d:06:25:ba:f6:3e: + 95:3a:ae:c3 -----BEGIN CERTIFICATE----- MIIE1DCCA7ygAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBoTELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNo YWluRy1JQ0EyLXBhdGhsZW4xMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTE5MTAxMTAwMjgwOVoXDTIyMDcwNzAwMjgwOVowgaExCzAJBgNVBAYT +Y29tMB4XDTIwMDUwNzA3MzkwNVoXDTIzMDIwMTA3MzkwNVowgaExCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRUwEwYD VQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2luZWVyaW5nMR0wGwYDVQQD DBRjaGFpbkctSUNBMS1wYXRobGVuMDEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xm @@ -80,10 +80,10 @@ ojELMAkGA1UEBhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1Nl YXR0bGUxFTATBgNVBAoMDHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJp bmcxHjAcBgNVBAMMFWNoYWluRy1JQ0EzLXBhdGhsZW45OTEfMB0GCSqGSIb3DQEJ ARYQaW5mb0B3b2xmc3NsLmNvbYIBZDAPBgNVHRMECDAGAQH/AgEAMAsGA1UdDwQE -AwIBBjANBgkqhkiG9w0BAQsFAAOCAQEAVoGO8ehfsp+rjy7secc9Da/yGPfSLgcs -0B0qkMfB/KyqDYbweG0zQ4ECcDvm2XXbLspKYU0gy6k+DKmzyv+7UssGFC1TtWif -pwKDkD34tqJG5CvFSO1Qf+onz3udiB8cXRa3IQpClQtnbCk0ZGHA9QBvNtzpaOOB -vQemvGyd8GGwUBTViUYfNLCQQqDDCWRupEYTxmqGmGPHjnnTotZzI2ipjaywk7CJ -9e4IzEcUlTsf0+tCP2i4a4ARjYWMkDkp6F195cHCXOeSjKt5F3Rgpe7+Uv9KeGJc -G0v4REGMBccR51rJoaHTa4I2wx8jGc5oncOA1QiNaNJJUpVEPxtQnQ== +AwIBBjANBgkqhkiG9w0BAQsFAAOCAQEAOZlULy/nc4Z4bVp2kM1G/jKsGfaKGHrE +jb8U7Z3yAPTxLbSoeviIjQStIJTZBRyCDAGSmnuViiGEf/4X8x+/qwa+pcjJU/FY +FQRYquf7gCjS0UBSx0Yz2J7+xi6CSbKYCCOOhwmPjnqc07I/g5gNcoVC6096oD4p +Yliqmpu+rjFSi7Ru1R1afgw2YAwEX7cosejqbWi5Ej/bs1RO3YyP55iTWBpoC7c7 +XH3Bd7GYKZL0kV5EVXn9og6ih1ebbxFtWO/x3Uo29Uutc9xPz/BwRmU2lYCI1FVa +IT0gspiTDHvbHgj2uOkCkqT2paLW+3pAj72ZvOJ0HQYluvY+lTquww== -----END CERTIFICATE----- diff --git a/certs/test-pathlen/chainG-ICA2-pathlen1.pem b/certs/test-pathlen/chainG-ICA2-pathlen1.pem index 1592a0143..702698d2b 100644 --- a/certs/test-pathlen/chainG-ICA2-pathlen1.pem +++ b/certs/test-pathlen/chainG-ICA2-pathlen1.pem @@ -5,8 +5,8 @@ Certificate: Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainG-ICA3-pathlen99, emailAddress = info@wolfssl.com Validity - Not Before: Oct 11 00:28:09 2019 GMT - Not After : Jul 7 00:28:09 2022 GMT + Not Before: May 7 07:39:05 2020 GMT + Not After : Feb 1 07:39:05 2023 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainG-ICA2-pathlen1, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -44,27 +44,27 @@ Certificate: X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 3b:e4:43:62:32:48:75:cf:da:f6:fa:38:4f:1b:b2:25:84:5b: - 79:8f:ce:9c:19:10:ef:ab:b4:b5:f0:2b:d1:16:77:f6:cc:f6: - 43:c7:1f:ca:92:f9:d7:69:3c:82:02:02:19:55:a4:a1:d0:1c: - 7c:e8:b8:8f:4c:7b:42:6c:68:0d:0c:b0:05:ad:39:29:7c:45: - 8e:e2:b3:54:e7:98:84:95:21:3d:73:26:33:5e:5b:59:59:f2: - 03:13:28:86:e1:2c:da:a8:37:7e:2e:93:5e:e1:41:9c:6d:03: - 16:0f:8a:b2:4d:67:b6:1b:65:8a:cb:30:b5:ed:ad:e7:9f:81: - 21:a7:6d:39:f7:af:93:82:1c:89:55:ae:0d:e8:88:be:a5:27: - 60:56:7b:f3:5c:1d:57:49:36:c2:9f:cc:50:62:a7:82:54:61: - 36:10:01:2f:cf:85:b2:dd:d7:56:cc:18:7e:85:5d:f1:b7:b7: - b6:c3:04:6b:01:5e:b8:68:28:9a:6b:fc:83:33:b7:28:64:55: - 38:ee:a4:5a:d5:87:ef:89:07:c4:60:9d:8a:25:d5:71:94:5b: - 96:3f:a4:3f:1d:80:3e:ef:97:9e:c4:25:f1:82:01:27:40:27: - cc:61:e6:67:e0:58:33:e9:9f:35:65:89:40:17:6a:a7:6c:d9: - 70:2c:59:a1 + 6f:69:6c:e6:90:b2:20:d6:98:dc:52:e9:49:34:cd:cc:64:78: + 36:18:d8:aa:4f:52:b5:ae:21:07:74:d2:af:06:f8:59:10:29: + de:6e:75:65:ea:cb:0e:c0:9a:64:77:71:5f:e2:0e:01:9e:70: + ae:86:c6:c7:f0:47:95:1c:27:b2:ea:13:8f:4d:44:e7:82:17: + 90:58:f1:17:d8:ec:9a:f2:07:03:8a:53:3f:2c:b3:89:ad:46: + f5:0a:58:29:31:98:6b:af:a2:4b:da:93:6d:4c:1a:49:ea:eb: + f9:66:00:16:94:c4:08:fa:66:94:d5:eb:4d:fe:26:c9:cb:04: + da:cf:f3:ca:9a:ce:21:84:7d:ef:14:d9:90:b6:cc:68:ed:9b: + 2a:d7:1b:da:59:f9:ea:89:61:34:c1:5b:aa:94:90:71:f2:ed: + b2:2b:5a:63:56:71:8a:ce:f7:3e:86:2d:70:9b:8e:d8:e4:f2: + 64:bc:99:53:25:ea:7b:24:d7:0a:97:1b:84:26:5c:d5:d8:f1: + 61:cd:08:6c:58:c2:42:b5:01:66:78:a8:ec:a5:0b:aa:d8:2c: + f3:08:0d:f3:d7:e0:6a:70:3a:4a:77:51:a7:39:36:48:f7:37: + 06:df:69:ec:80:2c:0b:33:74:72:d3:2f:0a:56:dd:0c:3c:f4: + 25:33:f8:6f -----BEGIN CERTIFICATE----- MIIE1DCCA7ygAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBojELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHjAcBgNVBAMMFWNo YWluRy1JQ0EzLXBhdGhsZW45OTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3Ns -LmNvbTAeFw0xOTEwMTEwMDI4MDlaFw0yMjA3MDcwMDI4MDlaMIGhMQswCQYDVQQG +LmNvbTAeFw0yMDA1MDcwNzM5MDVaFw0yMzAyMDEwNzM5MDVaMIGhMQswCQYDVQQG EwJVUzETMBEGA1UECAwKV2FzaGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEVMBMG A1UECgwMd29sZlNTTCBJbmMuMRQwEgYDVQQLDAtFbmdpbmVlcmluZzEdMBsGA1UE AwwUY2hhaW5HLUlDQTItcGF0aGxlbjExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29s @@ -80,10 +80,10 @@ gaExCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdT ZWF0dGxlMRUwEwYDVQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2luZWVy aW5nMR0wGwYDVQQDDBRjaGFpbkctSUNBNC1wYXRobGVuNTEfMB0GCSqGSIb3DQEJ ARYQaW5mb0B3b2xmc3NsLmNvbYIBZDAPBgNVHRMECDAGAQH/AgEBMAsGA1UdDwQE -AwIBBjANBgkqhkiG9w0BAQsFAAOCAQEAO+RDYjJIdc/a9vo4TxuyJYRbeY/OnBkQ -76u0tfAr0RZ39sz2Q8cfypL512k8ggICGVWkodAcfOi4j0x7QmxoDQywBa05KXxF -juKzVOeYhJUhPXMmM15bWVnyAxMohuEs2qg3fi6TXuFBnG0DFg+Ksk1nthtlissw -te2t55+BIadtOfevk4IciVWuDeiIvqUnYFZ781wdV0k2wp/MUGKnglRhNhABL8+F -st3XVswYfoVd8be3tsMEawFeuGgommv8gzO3KGRVOO6kWtWH74kHxGCdiiXVcZRb -lj+kPx2APu+XnsQl8YIBJ0AnzGHmZ+BYM+mfNWWJQBdqp2zZcCxZoQ== +AwIBBjANBgkqhkiG9w0BAQsFAAOCAQEAb2ls5pCyINaY3FLpSTTNzGR4NhjYqk9S +ta4hB3TSrwb4WRAp3m51ZerLDsCaZHdxX+IOAZ5wrobGx/BHlRwnsuoTj01E54IX +kFjxF9jsmvIHA4pTPyyzia1G9QpYKTGYa6+iS9qTbUwaSerr+WYAFpTECPpmlNXr +Tf4mycsE2s/zyprOIYR97xTZkLbMaO2bKtcb2ln56olhNMFbqpSQcfLtsitaY1Zx +is73PoYtcJuO2OTyZLyZUyXqeyTXCpcbhCZc1djxYc0IbFjCQrUBZnio7KULqtgs +8wgN89fganA6SndRpzk2SPc3Bt9p7IAsCzN0ctMvClbdDDz0JTP4bw== -----END CERTIFICATE----- diff --git a/certs/test-pathlen/chainG-ICA3-pathlen99.pem b/certs/test-pathlen/chainG-ICA3-pathlen99.pem index 9c6429cff..39b2fdbe3 100644 --- a/certs/test-pathlen/chainG-ICA3-pathlen99.pem +++ b/certs/test-pathlen/chainG-ICA3-pathlen99.pem @@ -5,8 +5,8 @@ Certificate: Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainG-ICA4-pathlen5, emailAddress = info@wolfssl.com Validity - Not Before: Oct 11 00:28:09 2019 GMT - Not After : Jul 7 00:28:09 2022 GMT + Not Before: May 7 07:39:05 2020 GMT + Not After : Feb 1 07:39:05 2023 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainG-ICA3-pathlen99, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -44,27 +44,27 @@ Certificate: X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 77:4b:04:d7:e6:fd:c1:bb:55:0c:2d:23:bf:90:a3:20:af:cd: - 54:11:34:97:fb:06:55:c1:11:ee:c5:bc:fe:5c:34:73:08:f9: - e9:c3:81:b8:0d:fa:6b:44:cd:ed:4a:d0:3b:40:6d:96:e5:cf: - 96:7d:aa:0d:65:fa:d7:6d:f7:3d:c9:9d:e5:e1:5e:be:34:7d: - b8:62:0c:22:e1:88:c8:02:b8:90:89:9f:1c:1d:18:5c:2d:01: - c9:95:f4:19:01:a6:5b:7a:26:6a:38:71:16:87:88:19:3f:60: - 35:99:71:4c:79:90:db:f9:9b:73:0d:74:45:87:b1:4f:e5:63: - a2:21:b4:38:32:d2:78:f0:15:a6:3a:ac:50:2a:a1:b2:41:f9: - 2b:0a:5c:5b:9a:94:17:42:88:44:41:fa:aa:d3:17:49:c1:31: - eb:a2:89:1f:c7:e7:b2:b0:71:98:64:4e:d6:de:b9:c2:5d:de: - 0e:86:68:1d:9c:ea:7c:b0:72:ee:2a:fa:26:26:1a:21:99:60: - 03:a2:01:67:0e:7d:4a:00:d9:23:2e:c2:c8:c8:3d:04:7a:78: - 08:81:f7:e4:0d:dc:e2:db:b6:1f:8a:33:ab:6f:a1:0d:5f:86: - cd:b7:c9:e1:35:a3:c8:81:da:15:3c:de:39:30:b7:d3:ec:4f: - d3:44:fe:dc + 51:0a:0c:20:2b:d2:0d:f9:25:bd:9b:de:41:bd:08:9f:36:80: + 80:b3:eb:6a:6a:eb:12:dc:32:c1:27:c5:04:1b:49:f3:c3:53: + f2:0d:db:1f:a7:a3:4b:52:4d:30:dc:24:c3:ff:ee:74:ff:7b: + 6b:29:ce:ed:62:e4:db:16:e9:bd:c6:76:a6:4b:e1:0a:5a:d8: + fd:32:a5:1f:04:df:b5:0c:c9:65:97:59:9e:f7:56:ef:25:da: + 7f:30:7e:d0:ef:c9:2e:de:e0:f6:f0:a4:d1:0d:8a:fd:c1:b9: + 7b:09:af:62:1d:93:38:64:78:10:1e:6d:83:a4:be:07:17:44: + 0b:73:0d:ce:ec:90:31:9f:a0:36:38:e4:e6:fe:ca:2d:9b:44: + 23:09:92:29:8c:3c:38:74:0e:14:ec:19:b6:4e:17:e9:4f:97: + 9d:dc:02:c0:00:fd:64:aa:cc:77:3a:d7:57:d2:52:90:ea:14: + 8e:21:00:e0:19:43:61:ac:97:37:84:88:d6:f0:5b:a6:03:21: + 1f:df:a6:4e:21:64:25:09:39:32:70:27:f8:ef:34:53:87:03: + fb:b4:27:e9:36:2b:ae:64:56:82:01:cb:3d:c3:c8:90:c2:d0: + fc:51:21:f9:38:3a:ad:8a:ff:ef:91:b0:2b:cc:f0:02:e8:32: + e8:0d:6a:52 -----BEGIN CERTIFICATE----- MIIE1TCCA72gAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBoTELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNo YWluRy1JQ0E0LXBhdGhsZW41MR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTE5MTAxMTAwMjgwOVoXDTIyMDcwNzAwMjgwOVowgaIxCzAJBgNVBAYT +Y29tMB4XDTIwMDUwNzA3MzkwNVoXDTIzMDIwMTA3MzkwNVowgaIxCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRUwEwYD VQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2luZWVyaW5nMR4wHAYDVQQD DBVjaGFpbkctSUNBMy1wYXRobGVuOTkxHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29s @@ -80,10 +80,10 @@ gaIxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdT ZWF0dGxlMRUwEwYDVQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2luZWVy aW5nMR4wHAYDVQQDDBVjaGFpbkctSUNBNS1wYXRobGVuMjAxHzAdBgkqhkiG9w0B CQEWEGluZm9Ad29sZnNzbC5jb22CAWQwDwYDVR0TBAgwBgEB/wIBYzALBgNVHQ8E -BAMCAQYwDQYJKoZIhvcNAQELBQADggEBAHdLBNfm/cG7VQwtI7+QoyCvzVQRNJf7 -BlXBEe7FvP5cNHMI+enDgbgN+mtEze1K0DtAbZblz5Z9qg1l+tdt9z3JneXhXr40 -fbhiDCLhiMgCuJCJnxwdGFwtAcmV9BkBplt6Jmo4cRaHiBk/YDWZcUx5kNv5m3MN -dEWHsU/lY6IhtDgy0njwFaY6rFAqobJB+SsKXFualBdCiERB+qrTF0nBMeuiiR/H -57KwcZhkTtbeucJd3g6GaB2c6nywcu4q+iYmGiGZYAOiAWcOfUoA2SMuwsjIPQR6 -eAiB9+QN3OLbth+KM6tvoQ1fhs23yeE1o8iB2hU83jkwt9PsT9NE/tw= +BAMCAQYwDQYJKoZIhvcNAQELBQADggEBAFEKDCAr0g35Jb2b3kG9CJ82gICz62pq +6xLcMsEnxQQbSfPDU/IN2x+no0tSTTDcJMP/7nT/e2spzu1i5NsW6b3GdqZL4Qpa +2P0ypR8E37UMyWWXWZ73Vu8l2n8wftDvyS7e4PbwpNENiv3BuXsJr2IdkzhkeBAe +bYOkvgcXRAtzDc7skDGfoDY45Ob+yi2bRCMJkimMPDh0DhTsGbZOF+lPl53cAsAA +/WSqzHc611fSUpDqFI4hAOAZQ2GslzeEiNbwW6YDIR/fpk4hZCUJOTJwJ/jvNFOH +A/u0J+k2K65kVoIByz3DyJDC0PxRIfk4Oq2K/++RsCvM8ALoMugNalI= -----END CERTIFICATE----- diff --git a/certs/test-pathlen/chainG-ICA4-pathlen5.pem b/certs/test-pathlen/chainG-ICA4-pathlen5.pem index 8467d9f36..8bd1c1364 100644 --- a/certs/test-pathlen/chainG-ICA4-pathlen5.pem +++ b/certs/test-pathlen/chainG-ICA4-pathlen5.pem @@ -5,8 +5,8 @@ Certificate: Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainG-ICA5-pathlen20, emailAddress = info@wolfssl.com Validity - Not Before: Oct 11 00:28:09 2019 GMT - Not After : Jul 7 00:28:09 2022 GMT + Not Before: May 7 07:39:05 2020 GMT + Not After : Feb 1 07:39:05 2023 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainG-ICA4-pathlen5, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -44,27 +44,27 @@ Certificate: X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - ab:ff:d4:87:51:61:f9:a5:68:8d:4e:fd:01:0c:e3:75:9a:c5: - 16:f2:c4:1e:d8:bd:d4:ce:9e:b9:bd:72:db:f2:89:2b:7a:46: - b4:6c:16:e5:dc:5a:eb:d0:3f:63:a8:98:82:0e:df:c6:1a:40: - a2:1a:a0:d5:49:10:a6:f4:ae:10:61:0a:2e:91:0d:bc:cf:e9: - bf:9e:98:23:38:30:f2:00:e3:ca:47:df:ad:46:e8:7b:b2:ae: - 1e:af:fd:c7:2e:b7:7d:b7:46:df:cd:bf:06:77:19:29:2b:fc: - 7c:f9:f7:2f:59:ce:90:a6:9e:70:33:58:b6:72:a4:ed:63:9b: - 50:62:6c:38:01:73:63:48:4e:6b:34:3f:c4:d5:de:45:09:a9: - 27:d1:78:36:59:1e:21:ad:a9:a3:1f:14:25:d1:ce:ab:90:3f: - c0:82:7a:54:fe:6b:48:fc:52:e1:f4:69:2d:84:2e:1c:7b:6f: - 42:4a:7b:05:91:70:0d:f3:ae:b3:d6:bc:7a:fa:9c:c8:0a:e8: - f1:a0:fa:ee:f3:fe:1d:34:0e:31:79:d8:80:57:53:23:af:65: - 92:94:ef:16:de:e0:9f:0a:5a:17:ba:e8:81:90:e1:e4:24:97: - b4:73:82:4c:38:4c:45:2f:82:75:55:4b:af:b8:58:b3:b1:d1: - 60:ab:53:5f + 04:a3:fa:bf:6f:ba:04:40:09:78:cc:32:4e:1e:a0:e6:5f:f4: + f0:20:c8:d4:b7:5a:e7:4e:50:83:7a:b1:43:61:23:62:f6:76: + db:a4:37:13:a3:1b:9a:a5:b5:33:ec:75:5e:87:c3:37:50:18: + 40:cc:b8:e1:23:3e:63:43:b0:8e:b9:2b:f2:84:d5:18:2a:a2: + 15:67:3a:3b:c8:17:d4:0d:6e:97:c7:d4:77:66:54:cb:ca:69: + 4b:95:a2:52:23:e8:d9:d5:f9:9d:58:2e:6c:c6:58:fa:9c:16: + 0c:c0:bc:38:2d:f5:d0:3d:8d:8d:29:89:d9:8d:cb:08:ea:e1: + 36:3b:80:c1:9f:68:53:1f:fb:7f:c9:d5:65:45:fe:32:3b:b8: + 77:07:5b:b2:db:d7:12:6c:5b:3c:9b:5a:19:8b:18:76:0c:3b: + 80:d9:97:05:eb:e4:da:a1:e5:35:e9:47:39:06:1e:8d:16:be: + f3:85:88:25:6f:38:8c:60:34:a7:2e:d6:34:b1:62:52:12:b0: + a3:4a:e3:5a:a1:22:b0:f8:34:76:5a:57:af:32:fd:11:9a:2b: + 90:db:04:f7:c0:26:a7:09:23:11:d9:30:9c:33:4a:87:66:e8: + 56:62:39:b2:f4:20:d9:2d:2c:ed:f8:44:9f:75:e6:d8:9f:ca: + 4d:5d:27:c9 -----BEGIN CERTIFICATE----- MIIE1TCCA72gAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBojELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHjAcBgNVBAMMFWNo YWluRy1JQ0E1LXBhdGhsZW4yMDEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3Ns -LmNvbTAeFw0xOTEwMTEwMDI4MDlaFw0yMjA3MDcwMDI4MDlaMIGhMQswCQYDVQQG +LmNvbTAeFw0yMDA1MDcwNzM5MDVaFw0yMzAyMDEwNzM5MDVaMIGhMQswCQYDVQQG EwJVUzETMBEGA1UECAwKV2FzaGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEVMBMG A1UECgwMd29sZlNTTCBJbmMuMRQwEgYDVQQLDAtFbmdpbmVlcmluZzEdMBsGA1UE AwwUY2hhaW5HLUlDQTQtcGF0aGxlbjUxHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29s @@ -80,10 +80,10 @@ gaIxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdT ZWF0dGxlMRUwEwYDVQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2luZWVy aW5nMR4wHAYDVQQDDBVjaGFpbkctSUNBNi1wYXRobGVuMTAxHzAdBgkqhkiG9w0B CQEWEGluZm9Ad29sZnNzbC5jb22CAWQwDwYDVR0TBAgwBgEB/wIBBTALBgNVHQ8E -BAMCAQYwDQYJKoZIhvcNAQELBQADggEBAKv/1IdRYfmlaI1O/QEM43WaxRbyxB7Y -vdTOnrm9ctvyiSt6RrRsFuXcWuvQP2OomIIO38YaQKIaoNVJEKb0rhBhCi6RDbzP -6b+emCM4MPIA48pH361G6Huyrh6v/ccut323Rt/NvwZ3GSkr/Hz59y9ZzpCmnnAz -WLZypO1jm1BibDgBc2NITms0P8TV3kUJqSfReDZZHiGtqaMfFCXRzquQP8CCelT+ -a0j8UuH0aS2ELhx7b0JKewWRcA3zrrPWvHr6nMgK6PGg+u7z/h00DjF52IBXUyOv -ZZKU7xbe4J8KWhe66IGQ4eQkl7Rzgkw4TEUvgnVVS6+4WLOx0WCrU18= +BAMCAQYwDQYJKoZIhvcNAQELBQADggEBAASj+r9vugRACXjMMk4eoOZf9PAgyNS3 +WudOUIN6sUNhI2L2dtukNxOjG5qltTPsdV6HwzdQGEDMuOEjPmNDsI65K/KE1Rgq +ohVnOjvIF9QNbpfH1HdmVMvKaUuVolIj6NnV+Z1YLmzGWPqcFgzAvDgt9dA9jY0p +idmNywjq4TY7gMGfaFMf+3/J1WVF/jI7uHcHW7Lb1xJsWzybWhmLGHYMO4DZlwXr +5Nqh5TXpRzkGHo0WvvOFiCVvOIxgNKcu1jSxYlISsKNK41qhIrD4NHZaV68y/RGa +K5DbBPfAJqcJIxHZMJwzSodm6FZiObL0INktLO34RJ915tifyk1dJ8k= -----END CERTIFICATE----- diff --git a/certs/test-pathlen/chainG-ICA5-pathlen20.pem b/certs/test-pathlen/chainG-ICA5-pathlen20.pem index f9c3486bb..4af86829b 100644 --- a/certs/test-pathlen/chainG-ICA5-pathlen20.pem +++ b/certs/test-pathlen/chainG-ICA5-pathlen20.pem @@ -5,8 +5,8 @@ Certificate: Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainG-ICA6-pathlen10, emailAddress = info@wolfssl.com Validity - Not Before: Oct 11 00:28:09 2019 GMT - Not After : Jul 7 00:28:09 2022 GMT + Not Before: May 7 07:39:05 2020 GMT + Not After : Feb 1 07:39:05 2023 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainG-ICA5-pathlen20, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -44,27 +44,27 @@ Certificate: X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - a4:e7:16:a9:20:7b:9c:89:49:48:94:e7:58:31:71:34:10:35: - d5:b6:91:5f:5e:2d:63:66:48:ff:45:7f:d4:dc:53:39:6f:7b: - 13:0a:de:37:7c:c1:43:e9:f9:b2:71:b8:93:22:12:7f:50:9b: - b9:0c:e4:3a:47:7a:95:bc:a4:08:41:73:f0:a3:9a:88:98:7e: - d0:7c:bb:76:ab:5c:ad:3c:41:73:78:5b:b1:0d:06:ae:46:d2: - 81:af:9a:53:f7:d2:45:66:99:45:5e:2e:05:48:47:78:49:b4: - 27:c9:76:5f:93:be:d4:f7:3d:a7:16:39:ef:dc:a1:57:7f:78: - ca:d3:33:94:87:cb:dd:aa:88:07:0b:62:fa:eb:f0:c9:5f:d8: - 3f:a3:6d:d5:dc:ea:a0:b9:c6:dc:7f:08:46:9e:ed:41:52:46: - d2:7a:96:20:37:f6:69:ef:85:23:43:fa:a8:27:1c:2b:70:37: - 7d:50:ce:48:4b:f7:ce:2d:6a:08:3d:45:f3:a3:e4:1f:ef:1f: - 0e:72:e2:f2:f1:e7:5f:72:1f:84:53:1b:d6:b4:2b:e4:4a:3d: - 39:db:a7:02:6a:02:5e:de:3a:43:05:32:de:16:e9:5e:cf:12: - b2:0e:60:36:e1:47:12:ab:98:ce:ef:c4:76:d5:30:b6:72:ae: - af:13:14:17 + 4e:2d:a6:ee:56:15:a1:4e:c8:cf:2b:16:2b:67:e5:fc:e2:37: + 13:f6:5f:51:63:59:76:4f:05:78:2b:ee:5b:69:c5:41:b8:da: + 35:c3:cf:ae:13:42:2d:38:71:5b:1d:69:4b:46:14:9f:8a:3f: + 09:3d:a2:f3:31:6d:0a:c8:cf:6d:b9:55:d8:c4:2c:3d:ae:0c: + b4:fd:ab:a0:58:5a:81:47:25:9b:8b:d8:28:d9:ef:ff:88:93: + db:4b:41:f9:6c:70:e7:ed:19:ec:4c:12:d3:32:8b:7a:93:0e: + 3e:cd:c0:13:fe:4d:5a:96:65:43:35:8c:eb:48:f5:8a:65:da: + b3:98:28:df:c9:24:82:0c:2b:28:e4:79:74:87:43:86:69:c4: + 3e:a6:66:ec:fb:2c:42:9b:a5:71:8f:2d:49:95:b6:3d:e8:1b: + a3:b8:14:1d:30:92:e3:c7:2d:72:60:e0:7d:b9:92:ee:ca:16: + 69:82:dc:81:a3:cd:2f:a4:67:34:a7:f3:bf:6c:00:74:69:25: + a8:7b:be:2b:a9:11:f2:47:6e:6c:0e:13:55:7d:31:21:f2:c1: + c2:1b:4c:db:70:35:0f:b4:26:76:93:79:ba:77:45:2f:33:9e: + bd:28:f2:4c:39:4f:49:41:e1:f8:87:61:66:9e:1c:54:8e:af: + ea:53:a0:e3 -----BEGIN CERTIFICATE----- MIIE1zCCA7+gAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBojELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHjAcBgNVBAMMFWNo YWluRy1JQ0E2LXBhdGhsZW4xMDEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3Ns -LmNvbTAeFw0xOTEwMTEwMDI4MDlaFw0yMjA3MDcwMDI4MDlaMIGiMQswCQYDVQQG +LmNvbTAeFw0yMDA1MDcwNzM5MDVaFw0yMzAyMDEwNzM5MDVaMIGiMQswCQYDVQQG EwJVUzETMBEGA1UECAwKV2FzaGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEVMBMG A1UECgwMd29sZlNTTCBJbmMuMRQwEgYDVQQLDAtFbmdpbmVlcmluZzEeMBwGA1UE AwwVY2hhaW5HLUlDQTUtcGF0aGxlbjIwMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdv @@ -80,10 +80,10 @@ MIGjMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3RvbjEQMA4GA1UEBwwH U2VhdHRsZTEVMBMGA1UECgwMd29sZlNTTCBJbmMuMRQwEgYDVQQLDAtFbmdpbmVl cmluZzEfMB0GA1UEAwwWY2hhaW5HLUlDQTctcGF0aGxlbjEwMDEfMB0GCSqGSIb3 DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIBZDAPBgNVHRMECDAGAQH/AgEUMAsGA1Ud -DwQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAQEApOcWqSB7nIlJSJTnWDFxNBA11baR -X14tY2ZI/0V/1NxTOW97EwreN3zBQ+n5snG4kyISf1CbuQzkOkd6lbykCEFz8KOa -iJh+0Hy7dqtcrTxBc3hbsQ0GrkbSga+aU/fSRWaZRV4uBUhHeEm0J8l2X5O+1Pc9 -pxY579yhV394ytMzlIfL3aqIBwti+uvwyV/YP6Nt1dzqoLnG3H8IRp7tQVJG0nqW -IDf2ae+FI0P6qCccK3A3fVDOSEv3zi1qCD1F86PkH+8fDnLi8vHnX3IfhFMb1rQr -5Eo9OdunAmoCXt46QwUy3hbpXs8Ssg5gNuFHEquYzu/EdtUwtnKurxMUFw== +DwQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAQEATi2m7lYVoU7IzysWK2fl/OI3E/Zf +UWNZdk8FeCvuW2nFQbjaNcPPrhNCLThxWx1pS0YUn4o/CT2i8zFtCsjPbblV2MQs +Pa4MtP2roFhagUclm4vYKNnv/4iT20tB+Wxw5+0Z7EwS0zKLepMOPs3AE/5NWpZl +QzWM60j1imXas5go38kkggwrKOR5dIdDhmnEPqZm7PssQpulcY8tSZW2Pegbo7gU +HTCS48ctcmDgfbmS7soWaYLcgaPNL6RnNKfzv2wAdGklqHu+K6kR8kdubA4TVX0x +IfLBwhtM23A1D7QmdpN5undFLzOevSjyTDlPSUHh+IdhZp4cVI6v6lOg4w== -----END CERTIFICATE----- diff --git a/certs/test-pathlen/chainG-ICA6-pathlen10.pem b/certs/test-pathlen/chainG-ICA6-pathlen10.pem index 8de172a62..8449428d5 100644 --- a/certs/test-pathlen/chainG-ICA6-pathlen10.pem +++ b/certs/test-pathlen/chainG-ICA6-pathlen10.pem @@ -5,8 +5,8 @@ Certificate: Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainG-ICA7-pathlen100, emailAddress = info@wolfssl.com Validity - Not Before: Oct 11 00:28:09 2019 GMT - Not After : Jul 7 00:28:09 2022 GMT + Not Before: May 7 07:39:05 2020 GMT + Not After : Feb 1 07:39:05 2023 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainG-ICA6-pathlen10, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -44,27 +44,27 @@ Certificate: X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 70:24:57:3f:1a:0c:94:f9:64:14:2e:20:81:bf:02:ba:bb:a5: - 21:02:2b:c0:09:0b:9e:8a:e3:c8:b2:39:4d:05:c1:34:62:44: - 62:5c:d5:ae:0f:17:cf:c0:ab:71:f8:5c:d5:74:8d:3d:eb:90: - d5:d6:a5:97:b8:c1:ab:d7:9c:e7:ca:4f:ee:8f:f2:5d:c7:81: - 22:fc:2e:b0:2d:f2:ff:e3:1a:c5:85:31:21:49:3f:38:f9:5b: - 55:e6:f3:f8:5c:63:fc:9a:c8:76:f0:3d:87:d2:fb:06:6d:5e: - f4:f4:e9:8c:3a:99:7b:1c:8f:29:fb:f6:c3:0c:23:9a:2c:1e: - f4:97:4f:b8:48:37:33:b4:aa:15:a6:5a:75:09:e9:c4:d5:44: - c6:e8:4e:a2:f0:70:a8:9f:10:91:56:55:59:f4:4a:b6:36:4a: - fc:b9:3a:60:01:e6:6e:61:58:f3:b0:ac:cd:02:38:97:bd:eb: - d3:6b:9e:b5:a6:58:ee:ce:86:c2:1b:cf:12:b3:1b:78:00:df: - 5f:da:77:5d:9c:8e:a5:ca:f1:77:87:c1:ed:ad:fd:cf:ea:05: - 53:f9:7e:34:e7:95:23:de:36:36:65:59:08:76:11:6f:d9:6e: - 55:17:af:33:1f:9e:0b:fe:fb:53:5c:67:1a:4d:8a:83:7f:5b: - ca:ff:e4:94 + c6:3d:f4:a7:1b:9d:e0:53:2c:a0:46:51:5a:3c:71:bd:27:d1: + 72:7f:a7:30:30:0e:81:29:08:09:ec:4d:1a:89:eb:21:af:c1: + 10:d6:ac:28:24:d2:c7:4a:4a:3e:c9:98:0b:4a:2d:49:cc:9f: + 5a:db:4f:7e:06:b2:1e:e1:07:33:71:52:84:b2:c9:a7:d5:81: + 12:44:7e:c3:8a:51:10:5f:8e:b0:db:a5:0d:00:90:e1:17:d5: + 10:8e:47:0b:80:5f:94:01:a6:7a:19:69:54:27:0c:d0:e2:66: + a8:dc:86:6a:b8:4a:f9:d8:ef:a9:ca:d3:e9:e6:ab:0f:3e:38: + 40:c7:f3:34:8f:2c:6b:0c:0e:b9:8e:e9:c9:b0:c5:67:37:d1: + 2e:47:89:f7:19:02:f8:fd:98:82:db:14:dc:88:fb:10:83:b7: + da:14:46:d2:81:de:52:e2:4a:22:7f:40:70:ec:70:2a:b0:3f: + 73:f7:6b:ff:90:fb:b6:ca:d1:ea:86:8c:20:b2:1c:ac:37:9b: + b0:aa:c5:97:e7:8d:c7:24:73:40:3e:af:4f:d9:78:66:a0:5d: + 0d:9a:c0:23:9a:91:7d:c2:2e:ac:07:f6:0e:de:f9:0b:23:06: + e7:e8:da:4f:5c:5f:32:3f:ab:49:18:f5:df:7f:53:87:81:ef: + e3:9d:55:88 -----BEGIN CERTIFICATE----- MIIEyTCCA7GgAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBozELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHzAdBgNVBAMMFmNo YWluRy1JQ0E3LXBhdGhsZW4xMDAxHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNz -bC5jb20wHhcNMTkxMDExMDAyODA5WhcNMjIwNzA3MDAyODA5WjCBojELMAkGA1UE +bC5jb20wHhcNMjAwNTA3MDczOTA1WhcNMjMwMjAxMDczOTA1WjCBojELMAkGA1UE BhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTAT BgNVBAoMDHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHjAcBgNV BAMMFWNoYWluRy1JQ0E2LXBhdGhsZW4xMDEfMB0GCSqGSIb3DQEJARYQaW5mb0B3 @@ -80,10 +80,10 @@ lzCBlDELMAkGA1UEBhMCVVMxEDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0Jv emVtYW4xETAPBgNVBAoMCFNhd3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgw FgYDVQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29s ZnNzbC5jb22CAWQwDwYDVR0TBAgwBgEB/wIBCjALBgNVHQ8EBAMCAQYwDQYJKoZI -hvcNAQELBQADggEBAHAkVz8aDJT5ZBQuIIG/Arq7pSECK8AJC56K48iyOU0FwTRi -RGJc1a4PF8/Aq3H4XNV0jT3rkNXWpZe4wavXnOfKT+6P8l3HgSL8LrAt8v/jGsWF -MSFJPzj5W1Xm8/hcY/yayHbwPYfS+wZtXvT06Yw6mXscjyn79sMMI5osHvSXT7hI -NzO0qhWmWnUJ6cTVRMboTqLwcKifEJFWVVn0SrY2Svy5OmAB5m5hWPOwrM0COJe9 -69NrnrWmWO7OhsIbzxKzG3gA31/ad12cjqXK8XeHwe2t/c/qBVP5fjTnlSPeNjZl -WQh2EW/ZblUXrzMfngv++1NcZxpNioN/W8r/5JQ= +hvcNAQELBQADggEBAMY99KcbneBTLKBGUVo8cb0n0XJ/pzAwDoEpCAnsTRqJ6yGv +wRDWrCgk0sdKSj7JmAtKLUnMn1rbT34Gsh7hBzNxUoSyyafVgRJEfsOKURBfjrDb +pQ0AkOEX1RCORwuAX5QBpnoZaVQnDNDiZqjchmq4SvnY76nK0+nmqw8+OEDH8zSP +LGsMDrmO6cmwxWc30S5HifcZAvj9mILbFNyI+xCDt9oURtKB3lLiSiJ/QHDscCqw +P3P3a/+Q+7bK0eqGjCCyHKw3m7CqxZfnjcckc0A+r0/ZeGagXQ2awCOakX3CLqwH +9g7e+QsjBufo2k9cXzI/q0kY9d9/U4eB7+OdVYg= -----END CERTIFICATE----- diff --git a/certs/test-pathlen/chainG-ICA7-pathlen100.pem b/certs/test-pathlen/chainG-ICA7-pathlen100.pem index 5382cbae0..fd7661dd5 100644 --- a/certs/test-pathlen/chainG-ICA7-pathlen100.pem +++ b/certs/test-pathlen/chainG-ICA7-pathlen100.pem @@ -5,8 +5,8 @@ Certificate: Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Oct 11 00:28:09 2019 GMT - Not After : Jul 7 00:28:09 2022 GMT + Not Before: May 7 07:39:05 2020 GMT + Not After : Feb 1 07:39:05 2023 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainG-ICA7-pathlen100, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -37,34 +37,34 @@ Certificate: X509v3 Authority Key Identifier: keyid:27:8E:67:11:74:C3:26:1D:3F:ED:33:63:B3:A4:D8:1D:30:E5:E8:D5 DirName:/C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:86:FF:F5:8E:10:DE:B8:FB + serial:3F:32:13:52:92:C6:DF:4A:D5:42:05:6C:B0:B2:2E:46:C2:F8:B8:67 X509v3 Basic Constraints: CA:TRUE, pathlen:100 X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - ae:bd:d0:c5:e1:4f:80:0f:85:0d:d2:e0:b5:c3:dc:73:99:94: - 90:19:01:f2:23:66:83:da:92:f2:e8:14:dc:70:e0:20:14:26: - c5:63:88:6a:1b:b3:f3:2f:5c:28:39:1e:6b:a7:40:9b:02:12: - ac:88:06:1e:c6:dd:9d:d4:6a:b8:22:cb:b7:aa:7a:9c:77:9a: - 37:0a:62:54:23:f3:e7:b9:4f:e0:8a:41:bd:74:21:69:be:7c: - 19:50:7d:d1:93:98:7c:4a:06:60:64:72:f0:09:71:6e:86:43: - 2f:89:dc:38:4a:c1:e4:cc:bc:72:6f:c2:b1:c1:9c:38:ff:98: - 87:92:3b:a6:f2:b5:2d:0a:41:38:0d:e7:b5:41:cf:c1:6d:96: - 34:98:9e:97:c8:87:a9:9e:4b:bb:73:bb:34:d6:bd:61:ef:36: - c8:45:f3:c9:31:36:2c:f1:11:68:4b:a0:f8:b6:9d:c4:a6:8a: - dc:e3:fc:60:f7:50:d2:d4:98:d4:e5:f9:76:ca:4a:3c:74:9a: - bb:95:ce:3c:29:ce:be:b5:9e:07:55:e2:c4:a1:1f:b4:0d:eb: - 87:03:1d:79:1b:e2:fc:f3:aa:4b:df:3e:24:72:56:00:b9:b4: - a0:fc:48:80:6a:76:84:1b:79:ea:03:95:32:42:bc:9d:7a:83: - 87:be:51:d2 + 2d:f4:16:5d:54:f0:96:9b:b8:44:4e:c7:63:12:1a:10:67:8f: + 8f:2a:08:24:9b:01:91:5b:c2:a9:53:d3:ff:51:bf:61:9e:c7: + 4b:96:b7:f8:b2:d3:36:1e:cd:7e:6a:cf:28:49:e1:ed:c2:12: + e9:b2:db:73:c2:52:5a:25:22:9e:47:01:34:b5:6d:66:f2:cf: + 3b:85:15:52:8e:3c:56:53:69:ac:4a:fa:19:29:3f:fa:3a:a5: + 8e:28:8b:a5:26:ef:a5:c8:8a:56:b9:4b:ef:dd:fb:b4:62:6f: + ad:1e:64:2e:c2:6a:6e:c8:df:71:28:f8:71:7b:61:ec:89:83: + 6a:7f:a2:a2:0b:38:2a:cf:06:6e:2b:87:43:7e:79:42:ca:14: + 1e:8b:12:8f:ae:f7:65:a0:ad:28:3b:f2:2a:e7:70:23:1e:b7: + 17:e8:4b:4b:29:3d:05:24:fa:9f:a1:0c:bc:c8:8e:6b:ba:48: + 37:ac:d4:b1:22:d3:7b:97:9f:39:5d:ad:21:ee:2e:f7:cf:06: + 6b:fd:db:cc:58:8c:c8:9c:2b:06:bd:ac:72:5c:e2:6f:75:a7: + 3a:7c:46:c0:c4:68:60:61:35:62:14:a7:6d:5d:23:12:d5:fc: + 1f:16:6c:86:c7:f8:ca:38:c2:e7:a4:bb:a9:67:c8:ef:2b:65: + 7e:f7:6d:82 -----BEGIN CERTIFICATE----- -MIIEwzCCA6ugAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx +MIIEzjCCA7agAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx EDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNh d3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cud29sZnNz -bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMTkxMDEx -MDAyODA5WhcNMjIwNzA3MDAyODA5WjCBozELMAkGA1UEBhMCVVMxEzARBgNVBAgM +bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjAwNTA3 +MDczOTA1WhcNMjMwMjAxMDczOTA1WjCBozELMAkGA1UEBhMCVVMxEzARBgNVBAgM Cldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoMDHdvbGZTU0wg SW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHzAdBgNVBAMMFmNoYWluRy1JQ0E3 LXBhdGhsZW4xMDAxHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wggEi @@ -74,16 +74,16 @@ xPxXZypQ2OviahxZBvJtPrlP/knFIcAW+ClvUQzqeNcOFUHaWssL4FTWg/0P6E4w /RYKOrjHI0uv4M0SXp9PYhPwyOTiqAHTN7AIIdMPbOTYwQRR6UzFsW3MYyOXMO7w Hqtt6pPKrVZvHu0arowbkQTqq50bO1anwcwvOS+zuowW/V4QEJ4k6kCXdLa05RzA 0195LARDOo70sVa9xyVjXDRQTb0t8Qi9jD7Sb/rkBKFR69DQkJGXe0bGEJKvAgMB -AAGjggENMIIBCTAdBgNVHQ4EFgQUEuSkGYWuhbfW62ME1bmwfldfDBYwgckGA1Ud -IwSBwTCBvoAUJ45nEXTDJh0/7TNjs6TYHTDl6NWhgZqkgZcwgZQxCzAJBgNVBAYT +AAGjggEYMIIBFDAdBgNVHQ4EFgQUEuSkGYWuhbfW62ME1bmwfldfDBYwgdQGA1Ud +IwSBzDCByYAUJ45nEXTDJh0/7TNjs6TYHTDl6NWhgZqkgZcwgZQxCzAJBgNVBAYT AlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMREwDwYDVQQK DAhTYXd0b290aDETMBEGA1UECwwKQ29uc3VsdGluZzEYMBYGA1UEAwwPd3d3Lndv -bGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tggkAhv/1 -jhDeuPswDwYDVR0TBAgwBgEB/wIBZDALBgNVHQ8EBAMCAQYwDQYJKoZIhvcNAQEL -BQADggEBAK690MXhT4APhQ3S4LXD3HOZlJAZAfIjZoPakvLoFNxw4CAUJsVjiGob -s/MvXCg5HmunQJsCEqyIBh7G3Z3Uargiy7eqepx3mjcKYlQj8+e5T+CKQb10IWm+ -fBlQfdGTmHxKBmBkcvAJcW6GQy+J3DhKweTMvHJvwrHBnDj/mIeSO6bytS0KQTgN -57VBz8FtljSYnpfIh6meS7tzuzTWvWHvNshF88kxNizxEWhLoPi2ncSmitzj/GD3 -UNLUmNTl+XbKSjx0mruVzjwpzr61ngdV4sShH7QN64cDHXkb4vzzqkvfPiRyVgC5 -tKD8SIBqdoQbeeoDlTJCvJ16g4e+UdI= +bGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tghQ/MhNS +ksbfStVCBWywsi5Gwvi4ZzAPBgNVHRMECDAGAQH/AgFkMAsGA1UdDwQEAwIBBjAN +BgkqhkiG9w0BAQsFAAOCAQEALfQWXVTwlpu4RE7HYxIaEGePjyoIJJsBkVvCqVPT +/1G/YZ7HS5a3+LLTNh7NfmrPKEnh7cIS6bLbc8JSWiUinkcBNLVtZvLPO4UVUo48 +VlNprEr6GSk/+jqljiiLpSbvpciKVrlL7937tGJvrR5kLsJqbsjfcSj4cXth7ImD +an+iogs4Ks8GbiuHQ355QsoUHosSj673ZaCtKDvyKudwIx63F+hLSyk9BST6n6EM +vMiOa7pIN6zUsSLTe5efOV2tIe4u988Ga/3bzFiMyJwrBr2sclzib3WnOnxGwMRo +YGE1YhSnbV0jEtX8HxZshsf4yjjC56S7qWfI7ytlfvdtgg== -----END CERTIFICATE----- diff --git a/certs/test-pathlen/chainG-assembled.pem b/certs/test-pathlen/chainG-assembled.pem index 39ee469f7..a9217dd09 100644 --- a/certs/test-pathlen/chainG-assembled.pem +++ b/certs/test-pathlen/chainG-assembled.pem @@ -5,8 +5,8 @@ Certificate: Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainG-ICA1-pathlen0, emailAddress = info@wolfssl.com Validity - Not Before: Oct 11 00:28:09 2019 GMT - Not After : Jul 7 00:28:09 2022 GMT + Not Before: May 7 07:39:05 2020 GMT + Not After : Feb 1 07:39:05 2023 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainG-entity, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -42,27 +42,27 @@ Certificate: X509v3 Basic Constraints: CA:FALSE Signature Algorithm: sha256WithRSAEncryption - 06:c8:08:8c:cc:5d:4e:b5:81:35:06:f3:e5:9d:4e:c8:38:3f: - ec:87:8b:55:3c:fc:6e:4c:f8:3c:78:7d:46:03:33:a7:49:55: - 6c:13:37:e9:11:d5:dd:8c:51:70:2c:28:18:6a:01:63:9b:35: - 04:ba:79:49:95:10:ed:31:4b:70:5f:be:a4:67:d4:8d:2f:95: - 45:f7:1f:3d:a0:fc:29:db:55:65:8d:98:ae:79:ad:ce:c7:b9: - 97:54:9d:69:ca:fa:87:01:fb:0d:9b:57:67:b8:44:f6:91:14: - e5:31:b5:c1:d8:96:b7:1d:7a:05:ed:53:d5:04:8a:8b:8e:74: - f1:13:3d:93:d6:16:10:17:d7:de:b1:4e:13:e8:72:ae:83:91: - 1f:46:3e:86:bd:49:79:9c:99:a9:aa:67:ff:cf:7c:34:b1:2c: - d8:bf:e5:3a:22:c2:70:97:47:db:d0:05:77:e9:46:09:f0:c1: - 06:1c:61:df:8b:8f:6d:a6:5b:d5:ae:9a:52:71:ed:5e:9e:38: - e3:8c:9a:52:cf:8a:8f:20:e9:f1:e4:a3:11:bd:b9:ff:a9:1e: - b7:f9:83:26:18:a8:0b:7b:2b:74:f5:c5:3a:58:e1:0b:71:0a: - 3d:ef:15:ee:2c:28:b3:ba:0e:59:3c:a4:46:24:d3:b7:14:b5: - 4a:8f:c1:25 + b1:66:36:26:0a:3c:98:7f:bc:40:7b:e6:4b:18:ea:9f:3d:11: + 03:84:fd:b1:45:db:6b:e2:e2:4b:7f:d5:ae:be:9e:49:44:e2: + e5:65:b0:12:ed:f4:13:ce:b9:50:7d:c0:39:2f:f4:b8:76:ce: + 1d:7d:00:63:cd:2d:6a:2d:52:89:c7:2a:d0:ec:75:a7:ca:2c: + af:3a:22:07:c9:4b:44:4a:8e:29:46:2c:14:59:0c:d4:c2:2b: + 3f:92:ec:82:f8:65:62:fa:08:69:f7:f9:04:5d:80:f8:64:cb: + df:0d:90:8f:bc:39:fd:3d:f5:20:7d:85:90:2f:c2:e7:91:8a: + 11:c8:6e:c5:ce:06:3d:d1:5f:c8:5d:c7:cb:07:24:d8:8c:bd: + 52:e6:f4:10:03:70:a8:ae:29:80:e3:d5:30:74:52:60:67:6a: + 19:14:2b:65:82:2a:9b:a4:94:20:14:d5:21:18:e4:8f:92:a8: + 43:00:16:f1:19:ee:a4:83:48:66:cf:a4:49:dc:62:1b:3f:0b: + 5e:cd:71:68:8e:29:cf:50:2e:02:57:9e:ea:df:97:4e:72:d5: + b9:ea:e2:66:18:44:0b:27:c6:68:b5:98:ab:52:56:d5:26:46: + 88:6a:ff:fc:eb:37:e9:36:04:28:77:89:06:7e:b8:25:07:83: + cd:f6:b5:5d -----BEGIN CERTIFICATE----- MIIEtzCCA5+gAwIBAgIBZTANBgkqhkiG9w0BAQsFADCBoTELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNo YWluRy1JQ0ExLXBhdGhsZW4wMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTE5MTAxMTAwMjgwOVoXDTIyMDcwNzAwMjgwOVowgZoxCzAJBgNVBAYT +Y29tMB4XDTIwMDUwNzA3MzkwNVoXDTIzMDIwMTA3MzkwNVowgZoxCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRUwEwYD VQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2luZWVyaW5nMRYwFAYDVQQD DA1jaGFpbkctZW50aXR5MR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29t @@ -77,13 +77,13 @@ VR0jBIHGMIHDgBRHwBlL7cTal7Fg6loKQm2l09glMaGBp6SBpDCBoTELMAkGA1UE BhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTAT BgNVBAoMDHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNV BAMMFGNoYWluRy1JQ0EyLXBhdGhsZW4xMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdv -bGZzc2wuY29tggFkMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAAbICIzM -XU61gTUG8+WdTsg4P+yHi1U8/G5M+Dx4fUYDM6dJVWwTN+kR1d2MUXAsKBhqAWOb -NQS6eUmVEO0xS3BfvqRn1I0vlUX3Hz2g/CnbVWWNmK55rc7HuZdUnWnK+ocB+w2b -V2e4RPaRFOUxtcHYlrcdegXtU9UEiouOdPETPZPWFhAX196xThPocq6DkR9GPoa9 -SXmcmamqZ//PfDSxLNi/5ToiwnCXR9vQBXfpRgnwwQYcYd+Lj22mW9WumlJx7V6e -OOOMmlLPio8g6fHkoxG9uf+pHrf5gyYYqAt7K3T1xTpY4QtxCj3vFe4sKLO6Dlk8 -pEYk07cUtUqPwSU= +bGZzc2wuY29tggFkMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBALFmNiYK +PJh/vEB75ksY6p89EQOE/bFF22vi4kt/1a6+nklE4uVlsBLt9BPOuVB9wDkv9Lh2 +zh19AGPNLWotUonHKtDsdafKLK86IgfJS0RKjilGLBRZDNTCKz+S7IL4ZWL6CGn3 ++QRdgPhky98NkI+8Of099SB9hZAvwueRihHIbsXOBj3RX8hdx8sHJNiMvVLm9BAD +cKiuKYDj1TB0UmBnahkUK2WCKpuklCAU1SEY5I+SqEMAFvEZ7qSDSGbPpEncYhs/ +C17NcWiOKc9QLgJXnurfl05y1bnq4mYYRAsnxmi1mKtSVtUmRohq//zrN+k2BCh3 +iQZ+uCUHg832tV0= -----END CERTIFICATE----- Certificate: Data: @@ -92,8 +92,8 @@ Certificate: Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainG-ICA2-pathlen1, emailAddress = info@wolfssl.com Validity - Not Before: Oct 11 00:28:09 2019 GMT - Not After : Jul 7 00:28:09 2022 GMT + Not Before: May 7 07:39:05 2020 GMT + Not After : Feb 1 07:39:05 2023 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainG-ICA1-pathlen0, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -131,27 +131,27 @@ Certificate: X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 56:81:8e:f1:e8:5f:b2:9f:ab:8f:2e:ec:79:c7:3d:0d:af:f2: - 18:f7:d2:2e:07:2c:d0:1d:2a:90:c7:c1:fc:ac:aa:0d:86:f0: - 78:6d:33:43:81:02:70:3b:e6:d9:75:db:2e:ca:4a:61:4d:20: - cb:a9:3e:0c:a9:b3:ca:ff:bb:52:cb:06:14:2d:53:b5:68:9f: - a7:02:83:90:3d:f8:b6:a2:46:e4:2b:c5:48:ed:50:7f:ea:27: - cf:7b:9d:88:1f:1c:5d:16:b7:21:0a:42:95:0b:67:6c:29:34: - 64:61:c0:f5:00:6f:36:dc:e9:68:e3:81:bd:07:a6:bc:6c:9d: - f0:61:b0:50:14:d5:89:46:1f:34:b0:90:42:a0:c3:09:64:6e: - a4:46:13:c6:6a:86:98:63:c7:8e:79:d3:a2:d6:73:23:68:a9: - 8d:ac:b0:93:b0:89:f5:ee:08:cc:47:14:95:3b:1f:d3:eb:42: - 3f:68:b8:6b:80:11:8d:85:8c:90:39:29:e8:5d:7d:e5:c1:c2: - 5c:e7:92:8c:ab:79:17:74:60:a5:ee:fe:52:ff:4a:78:62:5c: - 1b:4b:f8:44:41:8c:05:c7:11:e7:5a:c9:a1:a1:d3:6b:82:36: - c3:1f:23:19:ce:68:9d:c3:80:d5:08:8d:68:d2:49:52:95:44: - 3f:1b:50:9d + 39:99:54:2f:2f:e7:73:86:78:6d:5a:76:90:cd:46:fe:32:ac: + 19:f6:8a:18:7a:c4:8d:bf:14:ed:9d:f2:00:f4:f1:2d:b4:a8: + 7a:f8:88:8d:04:ad:20:94:d9:05:1c:82:0c:01:92:9a:7b:95: + 8a:21:84:7f:fe:17:f3:1f:bf:ab:06:be:a5:c8:c9:53:f1:58: + 15:04:58:aa:e7:fb:80:28:d2:d1:40:52:c7:46:33:d8:9e:fe: + c6:2e:82:49:b2:98:08:23:8e:87:09:8f:8e:7a:9c:d3:b2:3f: + 83:98:0d:72:85:42:eb:4f:7a:a0:3e:29:62:58:aa:9a:9b:be: + ae:31:52:8b:b4:6e:d5:1d:5a:7e:0c:36:60:0c:04:5f:b7:28: + b1:e8:ea:6d:68:b9:12:3f:db:b3:54:4e:dd:8c:8f:e7:98:93: + 58:1a:68:0b:b7:3b:5c:7d:c1:77:b1:98:29:92:f4:91:5e:44: + 55:79:fd:a2:0e:a2:87:57:9b:6f:11:6d:58:ef:f1:dd:4a:36: + f5:4b:ad:73:dc:4f:cf:f0:70:46:65:36:95:80:88:d4:55:5a: + 21:3d:20:b2:98:93:0c:7b:db:1e:08:f6:b8:e9:02:92:a4:f6: + a5:a2:d6:fb:7a:40:8f:bd:99:bc:e2:74:1d:06:25:ba:f6:3e: + 95:3a:ae:c3 -----BEGIN CERTIFICATE----- MIIE1DCCA7ygAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBoTELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNo YWluRy1JQ0EyLXBhdGhsZW4xMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTE5MTAxMTAwMjgwOVoXDTIyMDcwNzAwMjgwOVowgaExCzAJBgNVBAYT +Y29tMB4XDTIwMDUwNzA3MzkwNVoXDTIzMDIwMTA3MzkwNVowgaExCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRUwEwYD VQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2luZWVyaW5nMR0wGwYDVQQD DBRjaGFpbkctSUNBMS1wYXRobGVuMDEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xm @@ -167,12 +167,12 @@ ojELMAkGA1UEBhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1Nl YXR0bGUxFTATBgNVBAoMDHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJp bmcxHjAcBgNVBAMMFWNoYWluRy1JQ0EzLXBhdGhsZW45OTEfMB0GCSqGSIb3DQEJ ARYQaW5mb0B3b2xmc3NsLmNvbYIBZDAPBgNVHRMECDAGAQH/AgEAMAsGA1UdDwQE -AwIBBjANBgkqhkiG9w0BAQsFAAOCAQEAVoGO8ehfsp+rjy7secc9Da/yGPfSLgcs -0B0qkMfB/KyqDYbweG0zQ4ECcDvm2XXbLspKYU0gy6k+DKmzyv+7UssGFC1TtWif -pwKDkD34tqJG5CvFSO1Qf+onz3udiB8cXRa3IQpClQtnbCk0ZGHA9QBvNtzpaOOB -vQemvGyd8GGwUBTViUYfNLCQQqDDCWRupEYTxmqGmGPHjnnTotZzI2ipjaywk7CJ -9e4IzEcUlTsf0+tCP2i4a4ARjYWMkDkp6F195cHCXOeSjKt5F3Rgpe7+Uv9KeGJc -G0v4REGMBccR51rJoaHTa4I2wx8jGc5oncOA1QiNaNJJUpVEPxtQnQ== +AwIBBjANBgkqhkiG9w0BAQsFAAOCAQEAOZlULy/nc4Z4bVp2kM1G/jKsGfaKGHrE +jb8U7Z3yAPTxLbSoeviIjQStIJTZBRyCDAGSmnuViiGEf/4X8x+/qwa+pcjJU/FY +FQRYquf7gCjS0UBSx0Yz2J7+xi6CSbKYCCOOhwmPjnqc07I/g5gNcoVC6096oD4p +Yliqmpu+rjFSi7Ru1R1afgw2YAwEX7cosejqbWi5Ej/bs1RO3YyP55iTWBpoC7c7 +XH3Bd7GYKZL0kV5EVXn9og6ih1ebbxFtWO/x3Uo29Uutc9xPz/BwRmU2lYCI1FVa +IT0gspiTDHvbHgj2uOkCkqT2paLW+3pAj72ZvOJ0HQYluvY+lTquww== -----END CERTIFICATE----- Certificate: Data: @@ -181,8 +181,8 @@ Certificate: Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainG-ICA3-pathlen99, emailAddress = info@wolfssl.com Validity - Not Before: Oct 11 00:28:09 2019 GMT - Not After : Jul 7 00:28:09 2022 GMT + Not Before: May 7 07:39:05 2020 GMT + Not After : Feb 1 07:39:05 2023 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainG-ICA2-pathlen1, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -220,27 +220,27 @@ Certificate: X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 3b:e4:43:62:32:48:75:cf:da:f6:fa:38:4f:1b:b2:25:84:5b: - 79:8f:ce:9c:19:10:ef:ab:b4:b5:f0:2b:d1:16:77:f6:cc:f6: - 43:c7:1f:ca:92:f9:d7:69:3c:82:02:02:19:55:a4:a1:d0:1c: - 7c:e8:b8:8f:4c:7b:42:6c:68:0d:0c:b0:05:ad:39:29:7c:45: - 8e:e2:b3:54:e7:98:84:95:21:3d:73:26:33:5e:5b:59:59:f2: - 03:13:28:86:e1:2c:da:a8:37:7e:2e:93:5e:e1:41:9c:6d:03: - 16:0f:8a:b2:4d:67:b6:1b:65:8a:cb:30:b5:ed:ad:e7:9f:81: - 21:a7:6d:39:f7:af:93:82:1c:89:55:ae:0d:e8:88:be:a5:27: - 60:56:7b:f3:5c:1d:57:49:36:c2:9f:cc:50:62:a7:82:54:61: - 36:10:01:2f:cf:85:b2:dd:d7:56:cc:18:7e:85:5d:f1:b7:b7: - b6:c3:04:6b:01:5e:b8:68:28:9a:6b:fc:83:33:b7:28:64:55: - 38:ee:a4:5a:d5:87:ef:89:07:c4:60:9d:8a:25:d5:71:94:5b: - 96:3f:a4:3f:1d:80:3e:ef:97:9e:c4:25:f1:82:01:27:40:27: - cc:61:e6:67:e0:58:33:e9:9f:35:65:89:40:17:6a:a7:6c:d9: - 70:2c:59:a1 + 6f:69:6c:e6:90:b2:20:d6:98:dc:52:e9:49:34:cd:cc:64:78: + 36:18:d8:aa:4f:52:b5:ae:21:07:74:d2:af:06:f8:59:10:29: + de:6e:75:65:ea:cb:0e:c0:9a:64:77:71:5f:e2:0e:01:9e:70: + ae:86:c6:c7:f0:47:95:1c:27:b2:ea:13:8f:4d:44:e7:82:17: + 90:58:f1:17:d8:ec:9a:f2:07:03:8a:53:3f:2c:b3:89:ad:46: + f5:0a:58:29:31:98:6b:af:a2:4b:da:93:6d:4c:1a:49:ea:eb: + f9:66:00:16:94:c4:08:fa:66:94:d5:eb:4d:fe:26:c9:cb:04: + da:cf:f3:ca:9a:ce:21:84:7d:ef:14:d9:90:b6:cc:68:ed:9b: + 2a:d7:1b:da:59:f9:ea:89:61:34:c1:5b:aa:94:90:71:f2:ed: + b2:2b:5a:63:56:71:8a:ce:f7:3e:86:2d:70:9b:8e:d8:e4:f2: + 64:bc:99:53:25:ea:7b:24:d7:0a:97:1b:84:26:5c:d5:d8:f1: + 61:cd:08:6c:58:c2:42:b5:01:66:78:a8:ec:a5:0b:aa:d8:2c: + f3:08:0d:f3:d7:e0:6a:70:3a:4a:77:51:a7:39:36:48:f7:37: + 06:df:69:ec:80:2c:0b:33:74:72:d3:2f:0a:56:dd:0c:3c:f4: + 25:33:f8:6f -----BEGIN CERTIFICATE----- MIIE1DCCA7ygAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBojELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHjAcBgNVBAMMFWNo YWluRy1JQ0EzLXBhdGhsZW45OTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3Ns -LmNvbTAeFw0xOTEwMTEwMDI4MDlaFw0yMjA3MDcwMDI4MDlaMIGhMQswCQYDVQQG +LmNvbTAeFw0yMDA1MDcwNzM5MDVaFw0yMzAyMDEwNzM5MDVaMIGhMQswCQYDVQQG EwJVUzETMBEGA1UECAwKV2FzaGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEVMBMG A1UECgwMd29sZlNTTCBJbmMuMRQwEgYDVQQLDAtFbmdpbmVlcmluZzEdMBsGA1UE AwwUY2hhaW5HLUlDQTItcGF0aGxlbjExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29s @@ -256,12 +256,12 @@ gaExCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdT ZWF0dGxlMRUwEwYDVQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2luZWVy aW5nMR0wGwYDVQQDDBRjaGFpbkctSUNBNC1wYXRobGVuNTEfMB0GCSqGSIb3DQEJ ARYQaW5mb0B3b2xmc3NsLmNvbYIBZDAPBgNVHRMECDAGAQH/AgEBMAsGA1UdDwQE -AwIBBjANBgkqhkiG9w0BAQsFAAOCAQEAO+RDYjJIdc/a9vo4TxuyJYRbeY/OnBkQ -76u0tfAr0RZ39sz2Q8cfypL512k8ggICGVWkodAcfOi4j0x7QmxoDQywBa05KXxF -juKzVOeYhJUhPXMmM15bWVnyAxMohuEs2qg3fi6TXuFBnG0DFg+Ksk1nthtlissw -te2t55+BIadtOfevk4IciVWuDeiIvqUnYFZ781wdV0k2wp/MUGKnglRhNhABL8+F -st3XVswYfoVd8be3tsMEawFeuGgommv8gzO3KGRVOO6kWtWH74kHxGCdiiXVcZRb -lj+kPx2APu+XnsQl8YIBJ0AnzGHmZ+BYM+mfNWWJQBdqp2zZcCxZoQ== +AwIBBjANBgkqhkiG9w0BAQsFAAOCAQEAb2ls5pCyINaY3FLpSTTNzGR4NhjYqk9S +ta4hB3TSrwb4WRAp3m51ZerLDsCaZHdxX+IOAZ5wrobGx/BHlRwnsuoTj01E54IX +kFjxF9jsmvIHA4pTPyyzia1G9QpYKTGYa6+iS9qTbUwaSerr+WYAFpTECPpmlNXr +Tf4mycsE2s/zyprOIYR97xTZkLbMaO2bKtcb2ln56olhNMFbqpSQcfLtsitaY1Zx +is73PoYtcJuO2OTyZLyZUyXqeyTXCpcbhCZc1djxYc0IbFjCQrUBZnio7KULqtgs +8wgN89fganA6SndRpzk2SPc3Bt9p7IAsCzN0ctMvClbdDDz0JTP4bw== -----END CERTIFICATE----- Certificate: Data: @@ -270,8 +270,8 @@ Certificate: Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainG-ICA4-pathlen5, emailAddress = info@wolfssl.com Validity - Not Before: Oct 11 00:28:09 2019 GMT - Not After : Jul 7 00:28:09 2022 GMT + Not Before: May 7 07:39:05 2020 GMT + Not After : Feb 1 07:39:05 2023 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainG-ICA3-pathlen99, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -309,27 +309,27 @@ Certificate: X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 77:4b:04:d7:e6:fd:c1:bb:55:0c:2d:23:bf:90:a3:20:af:cd: - 54:11:34:97:fb:06:55:c1:11:ee:c5:bc:fe:5c:34:73:08:f9: - e9:c3:81:b8:0d:fa:6b:44:cd:ed:4a:d0:3b:40:6d:96:e5:cf: - 96:7d:aa:0d:65:fa:d7:6d:f7:3d:c9:9d:e5:e1:5e:be:34:7d: - b8:62:0c:22:e1:88:c8:02:b8:90:89:9f:1c:1d:18:5c:2d:01: - c9:95:f4:19:01:a6:5b:7a:26:6a:38:71:16:87:88:19:3f:60: - 35:99:71:4c:79:90:db:f9:9b:73:0d:74:45:87:b1:4f:e5:63: - a2:21:b4:38:32:d2:78:f0:15:a6:3a:ac:50:2a:a1:b2:41:f9: - 2b:0a:5c:5b:9a:94:17:42:88:44:41:fa:aa:d3:17:49:c1:31: - eb:a2:89:1f:c7:e7:b2:b0:71:98:64:4e:d6:de:b9:c2:5d:de: - 0e:86:68:1d:9c:ea:7c:b0:72:ee:2a:fa:26:26:1a:21:99:60: - 03:a2:01:67:0e:7d:4a:00:d9:23:2e:c2:c8:c8:3d:04:7a:78: - 08:81:f7:e4:0d:dc:e2:db:b6:1f:8a:33:ab:6f:a1:0d:5f:86: - cd:b7:c9:e1:35:a3:c8:81:da:15:3c:de:39:30:b7:d3:ec:4f: - d3:44:fe:dc + 51:0a:0c:20:2b:d2:0d:f9:25:bd:9b:de:41:bd:08:9f:36:80: + 80:b3:eb:6a:6a:eb:12:dc:32:c1:27:c5:04:1b:49:f3:c3:53: + f2:0d:db:1f:a7:a3:4b:52:4d:30:dc:24:c3:ff:ee:74:ff:7b: + 6b:29:ce:ed:62:e4:db:16:e9:bd:c6:76:a6:4b:e1:0a:5a:d8: + fd:32:a5:1f:04:df:b5:0c:c9:65:97:59:9e:f7:56:ef:25:da: + 7f:30:7e:d0:ef:c9:2e:de:e0:f6:f0:a4:d1:0d:8a:fd:c1:b9: + 7b:09:af:62:1d:93:38:64:78:10:1e:6d:83:a4:be:07:17:44: + 0b:73:0d:ce:ec:90:31:9f:a0:36:38:e4:e6:fe:ca:2d:9b:44: + 23:09:92:29:8c:3c:38:74:0e:14:ec:19:b6:4e:17:e9:4f:97: + 9d:dc:02:c0:00:fd:64:aa:cc:77:3a:d7:57:d2:52:90:ea:14: + 8e:21:00:e0:19:43:61:ac:97:37:84:88:d6:f0:5b:a6:03:21: + 1f:df:a6:4e:21:64:25:09:39:32:70:27:f8:ef:34:53:87:03: + fb:b4:27:e9:36:2b:ae:64:56:82:01:cb:3d:c3:c8:90:c2:d0: + fc:51:21:f9:38:3a:ad:8a:ff:ef:91:b0:2b:cc:f0:02:e8:32: + e8:0d:6a:52 -----BEGIN CERTIFICATE----- MIIE1TCCA72gAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBoTELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNo YWluRy1JQ0E0LXBhdGhsZW41MR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTE5MTAxMTAwMjgwOVoXDTIyMDcwNzAwMjgwOVowgaIxCzAJBgNVBAYT +Y29tMB4XDTIwMDUwNzA3MzkwNVoXDTIzMDIwMTA3MzkwNVowgaIxCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRUwEwYD VQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2luZWVyaW5nMR4wHAYDVQQD DBVjaGFpbkctSUNBMy1wYXRobGVuOTkxHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29s @@ -345,12 +345,12 @@ gaIxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdT ZWF0dGxlMRUwEwYDVQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2luZWVy aW5nMR4wHAYDVQQDDBVjaGFpbkctSUNBNS1wYXRobGVuMjAxHzAdBgkqhkiG9w0B CQEWEGluZm9Ad29sZnNzbC5jb22CAWQwDwYDVR0TBAgwBgEB/wIBYzALBgNVHQ8E -BAMCAQYwDQYJKoZIhvcNAQELBQADggEBAHdLBNfm/cG7VQwtI7+QoyCvzVQRNJf7 -BlXBEe7FvP5cNHMI+enDgbgN+mtEze1K0DtAbZblz5Z9qg1l+tdt9z3JneXhXr40 -fbhiDCLhiMgCuJCJnxwdGFwtAcmV9BkBplt6Jmo4cRaHiBk/YDWZcUx5kNv5m3MN -dEWHsU/lY6IhtDgy0njwFaY6rFAqobJB+SsKXFualBdCiERB+qrTF0nBMeuiiR/H -57KwcZhkTtbeucJd3g6GaB2c6nywcu4q+iYmGiGZYAOiAWcOfUoA2SMuwsjIPQR6 -eAiB9+QN3OLbth+KM6tvoQ1fhs23yeE1o8iB2hU83jkwt9PsT9NE/tw= +BAMCAQYwDQYJKoZIhvcNAQELBQADggEBAFEKDCAr0g35Jb2b3kG9CJ82gICz62pq +6xLcMsEnxQQbSfPDU/IN2x+no0tSTTDcJMP/7nT/e2spzu1i5NsW6b3GdqZL4Qpa +2P0ypR8E37UMyWWXWZ73Vu8l2n8wftDvyS7e4PbwpNENiv3BuXsJr2IdkzhkeBAe +bYOkvgcXRAtzDc7skDGfoDY45Ob+yi2bRCMJkimMPDh0DhTsGbZOF+lPl53cAsAA +/WSqzHc611fSUpDqFI4hAOAZQ2GslzeEiNbwW6YDIR/fpk4hZCUJOTJwJ/jvNFOH +A/u0J+k2K65kVoIByz3DyJDC0PxRIfk4Oq2K/++RsCvM8ALoMugNalI= -----END CERTIFICATE----- Certificate: Data: @@ -359,8 +359,8 @@ Certificate: Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainG-ICA5-pathlen20, emailAddress = info@wolfssl.com Validity - Not Before: Oct 11 00:28:09 2019 GMT - Not After : Jul 7 00:28:09 2022 GMT + Not Before: May 7 07:39:05 2020 GMT + Not After : Feb 1 07:39:05 2023 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainG-ICA4-pathlen5, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -398,27 +398,27 @@ Certificate: X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - ab:ff:d4:87:51:61:f9:a5:68:8d:4e:fd:01:0c:e3:75:9a:c5: - 16:f2:c4:1e:d8:bd:d4:ce:9e:b9:bd:72:db:f2:89:2b:7a:46: - b4:6c:16:e5:dc:5a:eb:d0:3f:63:a8:98:82:0e:df:c6:1a:40: - a2:1a:a0:d5:49:10:a6:f4:ae:10:61:0a:2e:91:0d:bc:cf:e9: - bf:9e:98:23:38:30:f2:00:e3:ca:47:df:ad:46:e8:7b:b2:ae: - 1e:af:fd:c7:2e:b7:7d:b7:46:df:cd:bf:06:77:19:29:2b:fc: - 7c:f9:f7:2f:59:ce:90:a6:9e:70:33:58:b6:72:a4:ed:63:9b: - 50:62:6c:38:01:73:63:48:4e:6b:34:3f:c4:d5:de:45:09:a9: - 27:d1:78:36:59:1e:21:ad:a9:a3:1f:14:25:d1:ce:ab:90:3f: - c0:82:7a:54:fe:6b:48:fc:52:e1:f4:69:2d:84:2e:1c:7b:6f: - 42:4a:7b:05:91:70:0d:f3:ae:b3:d6:bc:7a:fa:9c:c8:0a:e8: - f1:a0:fa:ee:f3:fe:1d:34:0e:31:79:d8:80:57:53:23:af:65: - 92:94:ef:16:de:e0:9f:0a:5a:17:ba:e8:81:90:e1:e4:24:97: - b4:73:82:4c:38:4c:45:2f:82:75:55:4b:af:b8:58:b3:b1:d1: - 60:ab:53:5f + 04:a3:fa:bf:6f:ba:04:40:09:78:cc:32:4e:1e:a0:e6:5f:f4: + f0:20:c8:d4:b7:5a:e7:4e:50:83:7a:b1:43:61:23:62:f6:76: + db:a4:37:13:a3:1b:9a:a5:b5:33:ec:75:5e:87:c3:37:50:18: + 40:cc:b8:e1:23:3e:63:43:b0:8e:b9:2b:f2:84:d5:18:2a:a2: + 15:67:3a:3b:c8:17:d4:0d:6e:97:c7:d4:77:66:54:cb:ca:69: + 4b:95:a2:52:23:e8:d9:d5:f9:9d:58:2e:6c:c6:58:fa:9c:16: + 0c:c0:bc:38:2d:f5:d0:3d:8d:8d:29:89:d9:8d:cb:08:ea:e1: + 36:3b:80:c1:9f:68:53:1f:fb:7f:c9:d5:65:45:fe:32:3b:b8: + 77:07:5b:b2:db:d7:12:6c:5b:3c:9b:5a:19:8b:18:76:0c:3b: + 80:d9:97:05:eb:e4:da:a1:e5:35:e9:47:39:06:1e:8d:16:be: + f3:85:88:25:6f:38:8c:60:34:a7:2e:d6:34:b1:62:52:12:b0: + a3:4a:e3:5a:a1:22:b0:f8:34:76:5a:57:af:32:fd:11:9a:2b: + 90:db:04:f7:c0:26:a7:09:23:11:d9:30:9c:33:4a:87:66:e8: + 56:62:39:b2:f4:20:d9:2d:2c:ed:f8:44:9f:75:e6:d8:9f:ca: + 4d:5d:27:c9 -----BEGIN CERTIFICATE----- MIIE1TCCA72gAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBojELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHjAcBgNVBAMMFWNo YWluRy1JQ0E1LXBhdGhsZW4yMDEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3Ns -LmNvbTAeFw0xOTEwMTEwMDI4MDlaFw0yMjA3MDcwMDI4MDlaMIGhMQswCQYDVQQG +LmNvbTAeFw0yMDA1MDcwNzM5MDVaFw0yMzAyMDEwNzM5MDVaMIGhMQswCQYDVQQG EwJVUzETMBEGA1UECAwKV2FzaGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEVMBMG A1UECgwMd29sZlNTTCBJbmMuMRQwEgYDVQQLDAtFbmdpbmVlcmluZzEdMBsGA1UE AwwUY2hhaW5HLUlDQTQtcGF0aGxlbjUxHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29s @@ -434,12 +434,12 @@ gaIxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdT ZWF0dGxlMRUwEwYDVQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2luZWVy aW5nMR4wHAYDVQQDDBVjaGFpbkctSUNBNi1wYXRobGVuMTAxHzAdBgkqhkiG9w0B CQEWEGluZm9Ad29sZnNzbC5jb22CAWQwDwYDVR0TBAgwBgEB/wIBBTALBgNVHQ8E -BAMCAQYwDQYJKoZIhvcNAQELBQADggEBAKv/1IdRYfmlaI1O/QEM43WaxRbyxB7Y -vdTOnrm9ctvyiSt6RrRsFuXcWuvQP2OomIIO38YaQKIaoNVJEKb0rhBhCi6RDbzP -6b+emCM4MPIA48pH361G6Huyrh6v/ccut323Rt/NvwZ3GSkr/Hz59y9ZzpCmnnAz -WLZypO1jm1BibDgBc2NITms0P8TV3kUJqSfReDZZHiGtqaMfFCXRzquQP8CCelT+ -a0j8UuH0aS2ELhx7b0JKewWRcA3zrrPWvHr6nMgK6PGg+u7z/h00DjF52IBXUyOv -ZZKU7xbe4J8KWhe66IGQ4eQkl7Rzgkw4TEUvgnVVS6+4WLOx0WCrU18= +BAMCAQYwDQYJKoZIhvcNAQELBQADggEBAASj+r9vugRACXjMMk4eoOZf9PAgyNS3 +WudOUIN6sUNhI2L2dtukNxOjG5qltTPsdV6HwzdQGEDMuOEjPmNDsI65K/KE1Rgq +ohVnOjvIF9QNbpfH1HdmVMvKaUuVolIj6NnV+Z1YLmzGWPqcFgzAvDgt9dA9jY0p +idmNywjq4TY7gMGfaFMf+3/J1WVF/jI7uHcHW7Lb1xJsWzybWhmLGHYMO4DZlwXr +5Nqh5TXpRzkGHo0WvvOFiCVvOIxgNKcu1jSxYlISsKNK41qhIrD4NHZaV68y/RGa +K5DbBPfAJqcJIxHZMJwzSodm6FZiObL0INktLO34RJ915tifyk1dJ8k= -----END CERTIFICATE----- Certificate: Data: @@ -448,8 +448,8 @@ Certificate: Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainG-ICA6-pathlen10, emailAddress = info@wolfssl.com Validity - Not Before: Oct 11 00:28:09 2019 GMT - Not After : Jul 7 00:28:09 2022 GMT + Not Before: May 7 07:39:05 2020 GMT + Not After : Feb 1 07:39:05 2023 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainG-ICA5-pathlen20, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -487,27 +487,27 @@ Certificate: X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - a4:e7:16:a9:20:7b:9c:89:49:48:94:e7:58:31:71:34:10:35: - d5:b6:91:5f:5e:2d:63:66:48:ff:45:7f:d4:dc:53:39:6f:7b: - 13:0a:de:37:7c:c1:43:e9:f9:b2:71:b8:93:22:12:7f:50:9b: - b9:0c:e4:3a:47:7a:95:bc:a4:08:41:73:f0:a3:9a:88:98:7e: - d0:7c:bb:76:ab:5c:ad:3c:41:73:78:5b:b1:0d:06:ae:46:d2: - 81:af:9a:53:f7:d2:45:66:99:45:5e:2e:05:48:47:78:49:b4: - 27:c9:76:5f:93:be:d4:f7:3d:a7:16:39:ef:dc:a1:57:7f:78: - ca:d3:33:94:87:cb:dd:aa:88:07:0b:62:fa:eb:f0:c9:5f:d8: - 3f:a3:6d:d5:dc:ea:a0:b9:c6:dc:7f:08:46:9e:ed:41:52:46: - d2:7a:96:20:37:f6:69:ef:85:23:43:fa:a8:27:1c:2b:70:37: - 7d:50:ce:48:4b:f7:ce:2d:6a:08:3d:45:f3:a3:e4:1f:ef:1f: - 0e:72:e2:f2:f1:e7:5f:72:1f:84:53:1b:d6:b4:2b:e4:4a:3d: - 39:db:a7:02:6a:02:5e:de:3a:43:05:32:de:16:e9:5e:cf:12: - b2:0e:60:36:e1:47:12:ab:98:ce:ef:c4:76:d5:30:b6:72:ae: - af:13:14:17 + 4e:2d:a6:ee:56:15:a1:4e:c8:cf:2b:16:2b:67:e5:fc:e2:37: + 13:f6:5f:51:63:59:76:4f:05:78:2b:ee:5b:69:c5:41:b8:da: + 35:c3:cf:ae:13:42:2d:38:71:5b:1d:69:4b:46:14:9f:8a:3f: + 09:3d:a2:f3:31:6d:0a:c8:cf:6d:b9:55:d8:c4:2c:3d:ae:0c: + b4:fd:ab:a0:58:5a:81:47:25:9b:8b:d8:28:d9:ef:ff:88:93: + db:4b:41:f9:6c:70:e7:ed:19:ec:4c:12:d3:32:8b:7a:93:0e: + 3e:cd:c0:13:fe:4d:5a:96:65:43:35:8c:eb:48:f5:8a:65:da: + b3:98:28:df:c9:24:82:0c:2b:28:e4:79:74:87:43:86:69:c4: + 3e:a6:66:ec:fb:2c:42:9b:a5:71:8f:2d:49:95:b6:3d:e8:1b: + a3:b8:14:1d:30:92:e3:c7:2d:72:60:e0:7d:b9:92:ee:ca:16: + 69:82:dc:81:a3:cd:2f:a4:67:34:a7:f3:bf:6c:00:74:69:25: + a8:7b:be:2b:a9:11:f2:47:6e:6c:0e:13:55:7d:31:21:f2:c1: + c2:1b:4c:db:70:35:0f:b4:26:76:93:79:ba:77:45:2f:33:9e: + bd:28:f2:4c:39:4f:49:41:e1:f8:87:61:66:9e:1c:54:8e:af: + ea:53:a0:e3 -----BEGIN CERTIFICATE----- MIIE1zCCA7+gAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBojELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHjAcBgNVBAMMFWNo YWluRy1JQ0E2LXBhdGhsZW4xMDEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3Ns -LmNvbTAeFw0xOTEwMTEwMDI4MDlaFw0yMjA3MDcwMDI4MDlaMIGiMQswCQYDVQQG +LmNvbTAeFw0yMDA1MDcwNzM5MDVaFw0yMzAyMDEwNzM5MDVaMIGiMQswCQYDVQQG EwJVUzETMBEGA1UECAwKV2FzaGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEVMBMG A1UECgwMd29sZlNTTCBJbmMuMRQwEgYDVQQLDAtFbmdpbmVlcmluZzEeMBwGA1UE AwwVY2hhaW5HLUlDQTUtcGF0aGxlbjIwMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdv @@ -523,12 +523,12 @@ MIGjMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3RvbjEQMA4GA1UEBwwH U2VhdHRsZTEVMBMGA1UECgwMd29sZlNTTCBJbmMuMRQwEgYDVQQLDAtFbmdpbmVl cmluZzEfMB0GA1UEAwwWY2hhaW5HLUlDQTctcGF0aGxlbjEwMDEfMB0GCSqGSIb3 DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIBZDAPBgNVHRMECDAGAQH/AgEUMAsGA1Ud -DwQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAQEApOcWqSB7nIlJSJTnWDFxNBA11baR -X14tY2ZI/0V/1NxTOW97EwreN3zBQ+n5snG4kyISf1CbuQzkOkd6lbykCEFz8KOa -iJh+0Hy7dqtcrTxBc3hbsQ0GrkbSga+aU/fSRWaZRV4uBUhHeEm0J8l2X5O+1Pc9 -pxY579yhV394ytMzlIfL3aqIBwti+uvwyV/YP6Nt1dzqoLnG3H8IRp7tQVJG0nqW -IDf2ae+FI0P6qCccK3A3fVDOSEv3zi1qCD1F86PkH+8fDnLi8vHnX3IfhFMb1rQr -5Eo9OdunAmoCXt46QwUy3hbpXs8Ssg5gNuFHEquYzu/EdtUwtnKurxMUFw== +DwQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAQEATi2m7lYVoU7IzysWK2fl/OI3E/Zf +UWNZdk8FeCvuW2nFQbjaNcPPrhNCLThxWx1pS0YUn4o/CT2i8zFtCsjPbblV2MQs +Pa4MtP2roFhagUclm4vYKNnv/4iT20tB+Wxw5+0Z7EwS0zKLepMOPs3AE/5NWpZl +QzWM60j1imXas5go38kkggwrKOR5dIdDhmnEPqZm7PssQpulcY8tSZW2Pegbo7gU +HTCS48ctcmDgfbmS7soWaYLcgaPNL6RnNKfzv2wAdGklqHu+K6kR8kdubA4TVX0x +IfLBwhtM23A1D7QmdpN5undFLzOevSjyTDlPSUHh+IdhZp4cVI6v6lOg4w== -----END CERTIFICATE----- Certificate: Data: @@ -537,8 +537,8 @@ Certificate: Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainG-ICA7-pathlen100, emailAddress = info@wolfssl.com Validity - Not Before: Oct 11 00:28:09 2019 GMT - Not After : Jul 7 00:28:09 2022 GMT + Not Before: May 7 07:39:05 2020 GMT + Not After : Feb 1 07:39:05 2023 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainG-ICA6-pathlen10, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -576,27 +576,27 @@ Certificate: X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 70:24:57:3f:1a:0c:94:f9:64:14:2e:20:81:bf:02:ba:bb:a5: - 21:02:2b:c0:09:0b:9e:8a:e3:c8:b2:39:4d:05:c1:34:62:44: - 62:5c:d5:ae:0f:17:cf:c0:ab:71:f8:5c:d5:74:8d:3d:eb:90: - d5:d6:a5:97:b8:c1:ab:d7:9c:e7:ca:4f:ee:8f:f2:5d:c7:81: - 22:fc:2e:b0:2d:f2:ff:e3:1a:c5:85:31:21:49:3f:38:f9:5b: - 55:e6:f3:f8:5c:63:fc:9a:c8:76:f0:3d:87:d2:fb:06:6d:5e: - f4:f4:e9:8c:3a:99:7b:1c:8f:29:fb:f6:c3:0c:23:9a:2c:1e: - f4:97:4f:b8:48:37:33:b4:aa:15:a6:5a:75:09:e9:c4:d5:44: - c6:e8:4e:a2:f0:70:a8:9f:10:91:56:55:59:f4:4a:b6:36:4a: - fc:b9:3a:60:01:e6:6e:61:58:f3:b0:ac:cd:02:38:97:bd:eb: - d3:6b:9e:b5:a6:58:ee:ce:86:c2:1b:cf:12:b3:1b:78:00:df: - 5f:da:77:5d:9c:8e:a5:ca:f1:77:87:c1:ed:ad:fd:cf:ea:05: - 53:f9:7e:34:e7:95:23:de:36:36:65:59:08:76:11:6f:d9:6e: - 55:17:af:33:1f:9e:0b:fe:fb:53:5c:67:1a:4d:8a:83:7f:5b: - ca:ff:e4:94 + c6:3d:f4:a7:1b:9d:e0:53:2c:a0:46:51:5a:3c:71:bd:27:d1: + 72:7f:a7:30:30:0e:81:29:08:09:ec:4d:1a:89:eb:21:af:c1: + 10:d6:ac:28:24:d2:c7:4a:4a:3e:c9:98:0b:4a:2d:49:cc:9f: + 5a:db:4f:7e:06:b2:1e:e1:07:33:71:52:84:b2:c9:a7:d5:81: + 12:44:7e:c3:8a:51:10:5f:8e:b0:db:a5:0d:00:90:e1:17:d5: + 10:8e:47:0b:80:5f:94:01:a6:7a:19:69:54:27:0c:d0:e2:66: + a8:dc:86:6a:b8:4a:f9:d8:ef:a9:ca:d3:e9:e6:ab:0f:3e:38: + 40:c7:f3:34:8f:2c:6b:0c:0e:b9:8e:e9:c9:b0:c5:67:37:d1: + 2e:47:89:f7:19:02:f8:fd:98:82:db:14:dc:88:fb:10:83:b7: + da:14:46:d2:81:de:52:e2:4a:22:7f:40:70:ec:70:2a:b0:3f: + 73:f7:6b:ff:90:fb:b6:ca:d1:ea:86:8c:20:b2:1c:ac:37:9b: + b0:aa:c5:97:e7:8d:c7:24:73:40:3e:af:4f:d9:78:66:a0:5d: + 0d:9a:c0:23:9a:91:7d:c2:2e:ac:07:f6:0e:de:f9:0b:23:06: + e7:e8:da:4f:5c:5f:32:3f:ab:49:18:f5:df:7f:53:87:81:ef: + e3:9d:55:88 -----BEGIN CERTIFICATE----- MIIEyTCCA7GgAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBozELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHzAdBgNVBAMMFmNo YWluRy1JQ0E3LXBhdGhsZW4xMDAxHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNz -bC5jb20wHhcNMTkxMDExMDAyODA5WhcNMjIwNzA3MDAyODA5WjCBojELMAkGA1UE +bC5jb20wHhcNMjAwNTA3MDczOTA1WhcNMjMwMjAxMDczOTA1WjCBojELMAkGA1UE BhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTAT BgNVBAoMDHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHjAcBgNV BAMMFWNoYWluRy1JQ0E2LXBhdGhsZW4xMDEfMB0GCSqGSIb3DQEJARYQaW5mb0B3 @@ -612,12 +612,12 @@ lzCBlDELMAkGA1UEBhMCVVMxEDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0Jv emVtYW4xETAPBgNVBAoMCFNhd3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgw FgYDVQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29s ZnNzbC5jb22CAWQwDwYDVR0TBAgwBgEB/wIBCjALBgNVHQ8EBAMCAQYwDQYJKoZI -hvcNAQELBQADggEBAHAkVz8aDJT5ZBQuIIG/Arq7pSECK8AJC56K48iyOU0FwTRi -RGJc1a4PF8/Aq3H4XNV0jT3rkNXWpZe4wavXnOfKT+6P8l3HgSL8LrAt8v/jGsWF -MSFJPzj5W1Xm8/hcY/yayHbwPYfS+wZtXvT06Yw6mXscjyn79sMMI5osHvSXT7hI -NzO0qhWmWnUJ6cTVRMboTqLwcKifEJFWVVn0SrY2Svy5OmAB5m5hWPOwrM0COJe9 -69NrnrWmWO7OhsIbzxKzG3gA31/ad12cjqXK8XeHwe2t/c/qBVP5fjTnlSPeNjZl -WQh2EW/ZblUXrzMfngv++1NcZxpNioN/W8r/5JQ= +hvcNAQELBQADggEBAMY99KcbneBTLKBGUVo8cb0n0XJ/pzAwDoEpCAnsTRqJ6yGv +wRDWrCgk0sdKSj7JmAtKLUnMn1rbT34Gsh7hBzNxUoSyyafVgRJEfsOKURBfjrDb +pQ0AkOEX1RCORwuAX5QBpnoZaVQnDNDiZqjchmq4SvnY76nK0+nmqw8+OEDH8zSP +LGsMDrmO6cmwxWc30S5HifcZAvj9mILbFNyI+xCDt9oURtKB3lLiSiJ/QHDscCqw +P3P3a/+Q+7bK0eqGjCCyHKw3m7CqxZfnjcckc0A+r0/ZeGagXQ2awCOakX3CLqwH +9g7e+QsjBufo2k9cXzI/q0kY9d9/U4eB7+OdVYg= -----END CERTIFICATE----- Certificate: Data: @@ -626,8 +626,8 @@ Certificate: Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Oct 11 00:28:09 2019 GMT - Not After : Jul 7 00:28:09 2022 GMT + Not Before: May 7 07:39:05 2020 GMT + Not After : Feb 1 07:39:05 2023 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainG-ICA7-pathlen100, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -658,34 +658,34 @@ Certificate: X509v3 Authority Key Identifier: keyid:27:8E:67:11:74:C3:26:1D:3F:ED:33:63:B3:A4:D8:1D:30:E5:E8:D5 DirName:/C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:86:FF:F5:8E:10:DE:B8:FB + serial:3F:32:13:52:92:C6:DF:4A:D5:42:05:6C:B0:B2:2E:46:C2:F8:B8:67 X509v3 Basic Constraints: CA:TRUE, pathlen:100 X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - ae:bd:d0:c5:e1:4f:80:0f:85:0d:d2:e0:b5:c3:dc:73:99:94: - 90:19:01:f2:23:66:83:da:92:f2:e8:14:dc:70:e0:20:14:26: - c5:63:88:6a:1b:b3:f3:2f:5c:28:39:1e:6b:a7:40:9b:02:12: - ac:88:06:1e:c6:dd:9d:d4:6a:b8:22:cb:b7:aa:7a:9c:77:9a: - 37:0a:62:54:23:f3:e7:b9:4f:e0:8a:41:bd:74:21:69:be:7c: - 19:50:7d:d1:93:98:7c:4a:06:60:64:72:f0:09:71:6e:86:43: - 2f:89:dc:38:4a:c1:e4:cc:bc:72:6f:c2:b1:c1:9c:38:ff:98: - 87:92:3b:a6:f2:b5:2d:0a:41:38:0d:e7:b5:41:cf:c1:6d:96: - 34:98:9e:97:c8:87:a9:9e:4b:bb:73:bb:34:d6:bd:61:ef:36: - c8:45:f3:c9:31:36:2c:f1:11:68:4b:a0:f8:b6:9d:c4:a6:8a: - dc:e3:fc:60:f7:50:d2:d4:98:d4:e5:f9:76:ca:4a:3c:74:9a: - bb:95:ce:3c:29:ce:be:b5:9e:07:55:e2:c4:a1:1f:b4:0d:eb: - 87:03:1d:79:1b:e2:fc:f3:aa:4b:df:3e:24:72:56:00:b9:b4: - a0:fc:48:80:6a:76:84:1b:79:ea:03:95:32:42:bc:9d:7a:83: - 87:be:51:d2 + 2d:f4:16:5d:54:f0:96:9b:b8:44:4e:c7:63:12:1a:10:67:8f: + 8f:2a:08:24:9b:01:91:5b:c2:a9:53:d3:ff:51:bf:61:9e:c7: + 4b:96:b7:f8:b2:d3:36:1e:cd:7e:6a:cf:28:49:e1:ed:c2:12: + e9:b2:db:73:c2:52:5a:25:22:9e:47:01:34:b5:6d:66:f2:cf: + 3b:85:15:52:8e:3c:56:53:69:ac:4a:fa:19:29:3f:fa:3a:a5: + 8e:28:8b:a5:26:ef:a5:c8:8a:56:b9:4b:ef:dd:fb:b4:62:6f: + ad:1e:64:2e:c2:6a:6e:c8:df:71:28:f8:71:7b:61:ec:89:83: + 6a:7f:a2:a2:0b:38:2a:cf:06:6e:2b:87:43:7e:79:42:ca:14: + 1e:8b:12:8f:ae:f7:65:a0:ad:28:3b:f2:2a:e7:70:23:1e:b7: + 17:e8:4b:4b:29:3d:05:24:fa:9f:a1:0c:bc:c8:8e:6b:ba:48: + 37:ac:d4:b1:22:d3:7b:97:9f:39:5d:ad:21:ee:2e:f7:cf:06: + 6b:fd:db:cc:58:8c:c8:9c:2b:06:bd:ac:72:5c:e2:6f:75:a7: + 3a:7c:46:c0:c4:68:60:61:35:62:14:a7:6d:5d:23:12:d5:fc: + 1f:16:6c:86:c7:f8:ca:38:c2:e7:a4:bb:a9:67:c8:ef:2b:65: + 7e:f7:6d:82 -----BEGIN CERTIFICATE----- -MIIEwzCCA6ugAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx +MIIEzjCCA7agAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx EDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNh d3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cud29sZnNz -bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMTkxMDEx -MDAyODA5WhcNMjIwNzA3MDAyODA5WjCBozELMAkGA1UEBhMCVVMxEzARBgNVBAgM +bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjAwNTA3 +MDczOTA1WhcNMjMwMjAxMDczOTA1WjCBozELMAkGA1UEBhMCVVMxEzARBgNVBAgM Cldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoMDHdvbGZTU0wg SW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHzAdBgNVBAMMFmNoYWluRy1JQ0E3 LXBhdGhsZW4xMDAxHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wggEi @@ -695,16 +695,16 @@ xPxXZypQ2OviahxZBvJtPrlP/knFIcAW+ClvUQzqeNcOFUHaWssL4FTWg/0P6E4w /RYKOrjHI0uv4M0SXp9PYhPwyOTiqAHTN7AIIdMPbOTYwQRR6UzFsW3MYyOXMO7w Hqtt6pPKrVZvHu0arowbkQTqq50bO1anwcwvOS+zuowW/V4QEJ4k6kCXdLa05RzA 0195LARDOo70sVa9xyVjXDRQTb0t8Qi9jD7Sb/rkBKFR69DQkJGXe0bGEJKvAgMB -AAGjggENMIIBCTAdBgNVHQ4EFgQUEuSkGYWuhbfW62ME1bmwfldfDBYwgckGA1Ud -IwSBwTCBvoAUJ45nEXTDJh0/7TNjs6TYHTDl6NWhgZqkgZcwgZQxCzAJBgNVBAYT +AAGjggEYMIIBFDAdBgNVHQ4EFgQUEuSkGYWuhbfW62ME1bmwfldfDBYwgdQGA1Ud +IwSBzDCByYAUJ45nEXTDJh0/7TNjs6TYHTDl6NWhgZqkgZcwgZQxCzAJBgNVBAYT AlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMREwDwYDVQQK DAhTYXd0b290aDETMBEGA1UECwwKQ29uc3VsdGluZzEYMBYGA1UEAwwPd3d3Lndv -bGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tggkAhv/1 -jhDeuPswDwYDVR0TBAgwBgEB/wIBZDALBgNVHQ8EBAMCAQYwDQYJKoZIhvcNAQEL -BQADggEBAK690MXhT4APhQ3S4LXD3HOZlJAZAfIjZoPakvLoFNxw4CAUJsVjiGob -s/MvXCg5HmunQJsCEqyIBh7G3Z3Uargiy7eqepx3mjcKYlQj8+e5T+CKQb10IWm+ -fBlQfdGTmHxKBmBkcvAJcW6GQy+J3DhKweTMvHJvwrHBnDj/mIeSO6bytS0KQTgN -57VBz8FtljSYnpfIh6meS7tzuzTWvWHvNshF88kxNizxEWhLoPi2ncSmitzj/GD3 -UNLUmNTl+XbKSjx0mruVzjwpzr61ngdV4sShH7QN64cDHXkb4vzzqkvfPiRyVgC5 -tKD8SIBqdoQbeeoDlTJCvJ16g4e+UdI= +bGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tghQ/MhNS +ksbfStVCBWywsi5Gwvi4ZzAPBgNVHRMECDAGAQH/AgFkMAsGA1UdDwQEAwIBBjAN +BgkqhkiG9w0BAQsFAAOCAQEALfQWXVTwlpu4RE7HYxIaEGePjyoIJJsBkVvCqVPT +/1G/YZ7HS5a3+LLTNh7NfmrPKEnh7cIS6bLbc8JSWiUinkcBNLVtZvLPO4UVUo48 +VlNprEr6GSk/+jqljiiLpSbvpciKVrlL7937tGJvrR5kLsJqbsjfcSj4cXth7ImD +an+iogs4Ks8GbiuHQ355QsoUHosSj673ZaCtKDvyKudwIx63F+hLSyk9BST6n6EM +vMiOa7pIN6zUsSLTe5efOV2tIe4u988Ga/3bzFiMyJwrBr2sclzib3WnOnxGwMRo +YGE1YhSnbV0jEtX8HxZshsf4yjjC56S7qWfI7ytlfvdtgg== -----END CERTIFICATE----- diff --git a/certs/test-pathlen/chainG-entity.pem b/certs/test-pathlen/chainG-entity.pem index d563eef64..2cacfdfdd 100644 --- a/certs/test-pathlen/chainG-entity.pem +++ b/certs/test-pathlen/chainG-entity.pem @@ -5,8 +5,8 @@ Certificate: Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainG-ICA1-pathlen0, emailAddress = info@wolfssl.com Validity - Not Before: Oct 11 00:28:09 2019 GMT - Not After : Jul 7 00:28:09 2022 GMT + Not Before: May 7 07:39:05 2020 GMT + Not After : Feb 1 07:39:05 2023 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainG-entity, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -42,27 +42,27 @@ Certificate: X509v3 Basic Constraints: CA:FALSE Signature Algorithm: sha256WithRSAEncryption - 06:c8:08:8c:cc:5d:4e:b5:81:35:06:f3:e5:9d:4e:c8:38:3f: - ec:87:8b:55:3c:fc:6e:4c:f8:3c:78:7d:46:03:33:a7:49:55: - 6c:13:37:e9:11:d5:dd:8c:51:70:2c:28:18:6a:01:63:9b:35: - 04:ba:79:49:95:10:ed:31:4b:70:5f:be:a4:67:d4:8d:2f:95: - 45:f7:1f:3d:a0:fc:29:db:55:65:8d:98:ae:79:ad:ce:c7:b9: - 97:54:9d:69:ca:fa:87:01:fb:0d:9b:57:67:b8:44:f6:91:14: - e5:31:b5:c1:d8:96:b7:1d:7a:05:ed:53:d5:04:8a:8b:8e:74: - f1:13:3d:93:d6:16:10:17:d7:de:b1:4e:13:e8:72:ae:83:91: - 1f:46:3e:86:bd:49:79:9c:99:a9:aa:67:ff:cf:7c:34:b1:2c: - d8:bf:e5:3a:22:c2:70:97:47:db:d0:05:77:e9:46:09:f0:c1: - 06:1c:61:df:8b:8f:6d:a6:5b:d5:ae:9a:52:71:ed:5e:9e:38: - e3:8c:9a:52:cf:8a:8f:20:e9:f1:e4:a3:11:bd:b9:ff:a9:1e: - b7:f9:83:26:18:a8:0b:7b:2b:74:f5:c5:3a:58:e1:0b:71:0a: - 3d:ef:15:ee:2c:28:b3:ba:0e:59:3c:a4:46:24:d3:b7:14:b5: - 4a:8f:c1:25 + b1:66:36:26:0a:3c:98:7f:bc:40:7b:e6:4b:18:ea:9f:3d:11: + 03:84:fd:b1:45:db:6b:e2:e2:4b:7f:d5:ae:be:9e:49:44:e2: + e5:65:b0:12:ed:f4:13:ce:b9:50:7d:c0:39:2f:f4:b8:76:ce: + 1d:7d:00:63:cd:2d:6a:2d:52:89:c7:2a:d0:ec:75:a7:ca:2c: + af:3a:22:07:c9:4b:44:4a:8e:29:46:2c:14:59:0c:d4:c2:2b: + 3f:92:ec:82:f8:65:62:fa:08:69:f7:f9:04:5d:80:f8:64:cb: + df:0d:90:8f:bc:39:fd:3d:f5:20:7d:85:90:2f:c2:e7:91:8a: + 11:c8:6e:c5:ce:06:3d:d1:5f:c8:5d:c7:cb:07:24:d8:8c:bd: + 52:e6:f4:10:03:70:a8:ae:29:80:e3:d5:30:74:52:60:67:6a: + 19:14:2b:65:82:2a:9b:a4:94:20:14:d5:21:18:e4:8f:92:a8: + 43:00:16:f1:19:ee:a4:83:48:66:cf:a4:49:dc:62:1b:3f:0b: + 5e:cd:71:68:8e:29:cf:50:2e:02:57:9e:ea:df:97:4e:72:d5: + b9:ea:e2:66:18:44:0b:27:c6:68:b5:98:ab:52:56:d5:26:46: + 88:6a:ff:fc:eb:37:e9:36:04:28:77:89:06:7e:b8:25:07:83: + cd:f6:b5:5d -----BEGIN CERTIFICATE----- MIIEtzCCA5+gAwIBAgIBZTANBgkqhkiG9w0BAQsFADCBoTELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNo YWluRy1JQ0ExLXBhdGhsZW4wMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTE5MTAxMTAwMjgwOVoXDTIyMDcwNzAwMjgwOVowgZoxCzAJBgNVBAYT +Y29tMB4XDTIwMDUwNzA3MzkwNVoXDTIzMDIwMTA3MzkwNVowgZoxCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRUwEwYD VQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2luZWVyaW5nMRYwFAYDVQQD DA1jaGFpbkctZW50aXR5MR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29t @@ -77,11 +77,11 @@ VR0jBIHGMIHDgBRHwBlL7cTal7Fg6loKQm2l09glMaGBp6SBpDCBoTELMAkGA1UE BhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTAT BgNVBAoMDHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNV BAMMFGNoYWluRy1JQ0EyLXBhdGhsZW4xMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdv -bGZzc2wuY29tggFkMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAAbICIzM -XU61gTUG8+WdTsg4P+yHi1U8/G5M+Dx4fUYDM6dJVWwTN+kR1d2MUXAsKBhqAWOb -NQS6eUmVEO0xS3BfvqRn1I0vlUX3Hz2g/CnbVWWNmK55rc7HuZdUnWnK+ocB+w2b -V2e4RPaRFOUxtcHYlrcdegXtU9UEiouOdPETPZPWFhAX196xThPocq6DkR9GPoa9 -SXmcmamqZ//PfDSxLNi/5ToiwnCXR9vQBXfpRgnwwQYcYd+Lj22mW9WumlJx7V6e -OOOMmlLPio8g6fHkoxG9uf+pHrf5gyYYqAt7K3T1xTpY4QtxCj3vFe4sKLO6Dlk8 -pEYk07cUtUqPwSU= +bGZzc2wuY29tggFkMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBALFmNiYK +PJh/vEB75ksY6p89EQOE/bFF22vi4kt/1a6+nklE4uVlsBLt9BPOuVB9wDkv9Lh2 +zh19AGPNLWotUonHKtDsdafKLK86IgfJS0RKjilGLBRZDNTCKz+S7IL4ZWL6CGn3 ++QRdgPhky98NkI+8Of099SB9hZAvwueRihHIbsXOBj3RX8hdx8sHJNiMvVLm9BAD +cKiuKYDj1TB0UmBnahkUK2WCKpuklCAU1SEY5I+SqEMAFvEZ7qSDSGbPpEncYhs/ +C17NcWiOKc9QLgJXnurfl05y1bnq4mYYRAsnxmi1mKtSVtUmRohq//zrN+k2BCh3 +iQZ+uCUHg832tV0= -----END CERTIFICATE----- diff --git a/certs/test-pathlen/chainH-ICA1-pathlen0.pem b/certs/test-pathlen/chainH-ICA1-pathlen0.pem index 974ddd46a..5868a08c6 100644 --- a/certs/test-pathlen/chainH-ICA1-pathlen0.pem +++ b/certs/test-pathlen/chainH-ICA1-pathlen0.pem @@ -5,8 +5,8 @@ Certificate: Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainH-ICA2-pathlen2, emailAddress = info@wolfssl.com Validity - Not Before: Oct 11 00:28:10 2019 GMT - Not After : Jul 7 00:28:10 2022 GMT + Not Before: May 7 07:39:05 2020 GMT + Not After : Feb 1 07:39:05 2023 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainH-ICA1-pathlen0, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -44,27 +44,27 @@ Certificate: X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 5f:77:d6:d2:55:4e:25:be:4b:f4:9f:9d:a8:ff:92:ac:4d:19: - 1f:0b:50:5b:51:01:7f:b8:a2:56:0d:cd:0c:c8:66:7a:08:bf: - 1e:07:6a:a5:6d:ad:68:c4:bb:da:99:d7:f3:62:bb:b5:28:de: - 47:dc:e2:b0:e1:27:cd:14:4b:7d:1c:7d:1a:60:eb:37:6f:fc: - ff:4e:1f:9f:ce:52:da:b4:a7:f4:6c:92:b5:65:b5:8f:53:1b: - d8:bd:7d:f6:a8:7e:23:9f:7d:b6:09:18:f2:a3:17:55:aa:fe: - 57:87:3d:a9:18:52:76:6e:fe:7c:ed:2a:85:45:63:d3:4d:7b: - f2:5e:ff:0f:a7:ae:24:ef:5f:71:66:25:29:31:9e:4a:12:a0: - 56:5b:39:2c:79:64:d0:1a:fb:97:99:df:42:9c:23:b4:f1:1d: - be:fc:da:41:16:b1:a0:fc:3a:b8:6e:a7:cf:3c:21:ea:22:7c: - f6:d2:a1:25:96:1e:b9:2f:eb:bf:61:c2:ee:58:c6:a1:7e:d0: - 73:e3:fd:58:62:ca:44:95:2b:b1:a8:d0:f8:1a:0d:40:9a:fb: - b1:27:4b:fc:57:4c:32:b5:09:5e:6e:ac:1d:dc:bc:77:f5:1b: - 27:88:40:df:70:da:f7:28:32:ef:8f:2e:53:41:78:69:e9:3e: - 7b:64:da:e4 + 9b:f5:9e:a9:32:af:ac:0b:be:d2:bf:96:3e:37:ee:b4:cf:ad: + be:21:dc:17:c6:a3:5a:4c:7d:9b:ca:a8:26:81:f2:3c:01:e6: + c0:ab:04:16:e6:75:47:c4:7e:31:2c:06:2c:31:c2:81:7d:9a: + c7:e9:f9:13:9b:c6:ac:ed:e7:05:63:d4:6b:50:b3:2f:39:3d: + 84:1f:86:e8:11:bd:de:35:71:d2:1a:9e:13:9c:d7:c2:fb:a2: + 01:bd:55:c8:39:6c:96:f0:1f:db:11:7e:fc:c9:e9:24:09:ce: + 32:d4:9a:99:58:a6:80:63:95:96:4c:73:1e:8b:15:e3:d2:e3: + e6:d2:6a:81:8f:ac:81:b2:23:ef:a1:a2:66:a2:5d:49:03:97: + e2:2e:90:65:e0:2f:55:5e:15:d6:e1:10:6f:d2:a9:07:c1:a1: + a7:16:d6:5a:62:9d:44:22:46:22:e6:a7:0c:11:3a:89:c4:86: + 12:19:7f:90:7b:27:99:c5:d4:6e:05:3e:96:c0:f7:21:ba:5c: + 2a:b2:ca:1c:45:44:53:8a:6e:2a:ee:35:60:e7:37:4d:18:a0: + 18:7e:93:19:c8:98:e4:dc:e2:b6:2a:de:84:e3:80:42:fe:48: + 87:0a:5e:e4:44:c1:9c:75:04:c8:9b:4f:d8:7b:cb:75:1b:ae: + 41:4c:b4:46 -----BEGIN CERTIFICATE----- MIIE0zCCA7ugAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBoTELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNo YWluSC1JQ0EyLXBhdGhsZW4yMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTE5MTAxMTAwMjgxMFoXDTIyMDcwNzAwMjgxMFowgaExCzAJBgNVBAYT +Y29tMB4XDTIwMDUwNzA3MzkwNVoXDTIzMDIwMTA3MzkwNVowgaExCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRUwEwYD VQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2luZWVyaW5nMR0wGwYDVQQD DBRjaGFpbkgtSUNBMS1wYXRobGVuMDEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xm @@ -80,10 +80,10 @@ oTELMAkGA1UEBhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1Nl YXR0bGUxFTATBgNVBAoMDHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJp bmcxHTAbBgNVBAMMFGNoYWluSC1JQ0EzLXBhdGhsZW4yMR8wHQYJKoZIhvcNAQkB FhBpbmZvQHdvbGZzc2wuY29tggFkMA8GA1UdEwQIMAYBAf8CAQAwCwYDVR0PBAQD -AgEGMA0GCSqGSIb3DQEBCwUAA4IBAQBfd9bSVU4lvkv0n52o/5KsTRkfC1BbUQF/ -uKJWDc0MyGZ6CL8eB2qlba1oxLvamdfzYru1KN5H3OKw4SfNFEt9HH0aYOs3b/z/ -Th+fzlLatKf0bJK1ZbWPUxvYvX32qH4jn322CRjyoxdVqv5Xhz2pGFJ2bv587SqF -RWPTTXvyXv8Pp64k719xZiUpMZ5KEqBWWzkseWTQGvuXmd9CnCO08R2+/NpBFrGg -/Dq4bqfPPCHqInz20qEllh65L+u/YcLuWMahftBz4/1YYspElSuxqND4Gg1Amvux -J0v8V0wytQlebqwd3Lx39RsniEDfcNr3KDLvjy5TQXhp6T57ZNrk +AgEGMA0GCSqGSIb3DQEBCwUAA4IBAQCb9Z6pMq+sC77Sv5Y+N+60z62+IdwXxqNa +TH2byqgmgfI8AebAqwQW5nVHxH4xLAYsMcKBfZrH6fkTm8as7ecFY9RrULMvOT2E +H4boEb3eNXHSGp4TnNfC+6IBvVXIOWyW8B/bEX78yekkCc4y1JqZWKaAY5WWTHMe +ixXj0uPm0mqBj6yBsiPvoaJmol1JA5fiLpBl4C9VXhXW4RBv0qkHwaGnFtZaYp1E +IkYi5qcMETqJxIYSGX+QeyeZxdRuBT6WwPchulwqssocRURTim4q7jVg5zdNGKAY +fpMZyJjk3OK2Kt6E44BC/kiHCl7kRMGcdQTIm0/Ye8t1G65BTLRG -----END CERTIFICATE----- diff --git a/certs/test-pathlen/chainH-ICA2-pathlen2.pem b/certs/test-pathlen/chainH-ICA2-pathlen2.pem index 31230193c..28a2d93cd 100644 --- a/certs/test-pathlen/chainH-ICA2-pathlen2.pem +++ b/certs/test-pathlen/chainH-ICA2-pathlen2.pem @@ -5,8 +5,8 @@ Certificate: Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainH-ICA3-pathlen2, emailAddress = info@wolfssl.com Validity - Not Before: Oct 11 00:28:09 2019 GMT - Not After : Jul 7 00:28:09 2022 GMT + Not Before: May 7 07:39:05 2020 GMT + Not After : Feb 1 07:39:05 2023 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainH-ICA2-pathlen2, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -44,27 +44,27 @@ Certificate: X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 16:6f:a3:cd:f6:de:87:1c:86:f8:b4:b8:e6:e0:dc:11:2f:f3: - bb:f1:57:34:ec:1a:59:8a:81:63:40:01:df:53:24:a7:50:b0: - 6d:3d:29:2a:41:e7:08:71:0f:37:4b:10:b5:95:ae:a0:81:ba: - ba:b5:3e:72:48:be:6b:9e:be:34:3b:0d:15:f8:8f:9d:24:68: - 01:0c:d4:4a:0d:86:d5:b3:71:b6:d6:8e:71:44:16:7e:e3:db: - ba:7d:0e:5f:b3:2f:e2:60:f9:ff:bc:91:a6:ae:3c:ba:30:e4: - f5:55:bf:1e:72:0b:cc:5e:b4:7e:1f:09:aa:b4:52:bd:8c:2c: - 37:d0:0d:82:b4:ec:ff:c1:cf:91:a2:43:24:b8:b4:c0:ac:f2: - 29:eb:84:1d:49:ef:a4:8f:65:b3:06:01:2f:23:cf:a6:27:42: - cd:99:17:b9:69:40:1d:df:99:f6:f8:c4:61:cc:4a:a1:f0:38: - ce:4e:c4:27:f6:8f:d2:ae:74:5f:39:93:66:77:55:b2:25:8d: - 7e:7f:7d:b4:2b:f1:ee:83:9e:7b:f5:31:3f:d7:27:53:e6:21: - bd:69:a5:ca:0e:d8:6e:54:67:56:bf:f3:ec:e8:e1:aa:a4:76: - fa:0d:42:d4:7d:26:bd:f5:e5:25:ee:81:c4:ed:59:eb:0a:54: - d3:c9:18:30 + 18:c5:91:36:f9:99:81:ef:04:b9:3d:9b:9a:a7:d6:e5:2c:68: + ab:db:44:c4:ac:77:bd:2d:de:5c:f1:d9:fa:6b:41:ff:51:62: + 2a:e3:f3:04:0e:f8:b5:98:28:ee:0c:28:b3:aa:32:39:c0:64: + 09:a2:98:1d:49:be:b3:9a:15:e3:4b:69:e3:50:b8:25:3f:af: + 69:c3:83:08:00:a1:15:5f:e7:4b:ee:15:4f:72:5c:d8:8a:a1: + e5:15:26:e1:f7:4c:82:0c:6a:5f:71:bb:11:ee:49:b4:08:16: + bd:20:0a:d9:ed:25:69:3e:66:cf:d8:92:dd:55:bb:78:34:52: + 47:d7:49:cd:6f:bd:43:e3:f5:39:74:2c:76:97:ed:8d:3f:b1: + c9:a0:21:90:44:8e:38:ba:f5:17:9e:5a:2b:05:b8:61:b3:6b: + 3a:0e:98:f8:fc:b7:05:a6:61:36:0e:ba:d5:9f:8c:ae:73:73: + 29:4a:df:c4:da:78:ce:4d:99:fd:70:56:de:bb:fc:9c:a8:96: + 9d:93:7f:fc:9e:88:0b:de:58:73:65:c3:c3:4c:3e:97:5a:29: + 7c:4c:29:87:55:02:b4:56:88:84:94:17:45:dc:c6:96:13:9a: + e5:7e:18:fb:45:e2:e4:c7:47:34:72:3d:1f:d0:d6:e6:12:1d: + b1:f7:17:61 -----BEGIN CERTIFICATE----- MIIE0zCCA7ugAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBoTELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNo YWluSC1JQ0EzLXBhdGhsZW4yMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTE5MTAxMTAwMjgwOVoXDTIyMDcwNzAwMjgwOVowgaExCzAJBgNVBAYT +Y29tMB4XDTIwMDUwNzA3MzkwNVoXDTIzMDIwMTA3MzkwNVowgaExCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRUwEwYD VQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2luZWVyaW5nMR0wGwYDVQQD DBRjaGFpbkgtSUNBMi1wYXRobGVuMjEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xm @@ -80,10 +80,10 @@ oTELMAkGA1UEBhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1Nl YXR0bGUxFTATBgNVBAoMDHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJp bmcxHTAbBgNVBAMMFGNoYWluSC1JQ0E0LXBhdGhsZW4yMR8wHQYJKoZIhvcNAQkB FhBpbmZvQHdvbGZzc2wuY29tggFkMA8GA1UdEwQIMAYBAf8CAQIwCwYDVR0PBAQD -AgEGMA0GCSqGSIb3DQEBCwUAA4IBAQAWb6PN9t6HHIb4tLjm4NwRL/O78Vc07BpZ -ioFjQAHfUySnULBtPSkqQecIcQ83SxC1la6ggbq6tT5ySL5rnr40Ow0V+I+dJGgB -DNRKDYbVs3G21o5xRBZ+49u6fQ5fsy/iYPn/vJGmrjy6MOT1Vb8ecgvMXrR+Hwmq -tFK9jCw30A2CtOz/wc+RokMkuLTArPIp64QdSe+kj2WzBgEvI8+mJ0LNmRe5aUAd -35n2+MRhzEqh8DjOTsQn9o/SrnRfOZNmd1WyJY1+f320K/Hug5579TE/1ydT5iG9 -aaXKDthuVGdWv/Ps6OGqpHb6DULUfSa99eUl7oHE7VnrClTTyRgw +AgEGMA0GCSqGSIb3DQEBCwUAA4IBAQAYxZE2+ZmB7wS5PZuap9blLGir20TErHe9 +Ld5c8dn6a0H/UWIq4/MEDvi1mCjuDCizqjI5wGQJopgdSb6zmhXjS2njULglP69p +w4MIAKEVX+dL7hVPclzYiqHlFSbh90yCDGpfcbsR7km0CBa9IArZ7SVpPmbP2JLd +Vbt4NFJH10nNb71D4/U5dCx2l+2NP7HJoCGQRI44uvUXnlorBbhhs2s6Dpj4/LcF +pmE2DrrVn4yuc3MpSt/E2njOTZn9cFbeu/ycqJadk3/8nogL3lhzZcPDTD6XWil8 +TCmHVQK0VoiElBdF3MaWE5rlfhj7ReLkx0c0cj0f0NbmEh2x9xdh -----END CERTIFICATE----- diff --git a/certs/test-pathlen/chainH-ICA3-pathlen2.pem b/certs/test-pathlen/chainH-ICA3-pathlen2.pem index 7f4dd677b..9be512fd6 100644 --- a/certs/test-pathlen/chainH-ICA3-pathlen2.pem +++ b/certs/test-pathlen/chainH-ICA3-pathlen2.pem @@ -5,8 +5,8 @@ Certificate: Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainH-ICA4-pathlen2, emailAddress = info@wolfssl.com Validity - Not Before: Oct 11 00:28:09 2019 GMT - Not After : Jul 7 00:28:09 2022 GMT + Not Before: May 7 07:39:05 2020 GMT + Not After : Feb 1 07:39:05 2023 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainH-ICA3-pathlen2, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -44,27 +44,27 @@ Certificate: X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 2a:35:ca:d5:dd:97:31:4d:29:21:90:67:ba:68:ef:2a:56:b0: - 08:0a:c5:a2:cc:30:11:71:59:1b:59:2b:ca:c4:cc:22:52:d7: - f3:a7:d2:14:c5:fc:e4:c5:6f:9d:45:ce:7f:d0:dd:ec:5f:6b: - c3:d1:78:7a:29:bb:73:98:b6:15:9b:41:37:7a:50:b3:04:1d: - 72:90:9b:e9:f2:4b:68:f3:60:e9:bb:34:6e:2a:6c:6c:50:a6: - 38:ac:61:bc:ca:25:23:f5:f5:70:3a:8a:33:94:cf:97:1c:5c: - a3:76:b0:7b:88:35:8a:6e:18:44:01:e6:80:23:e9:14:ea:66: - 56:34:9a:0b:ca:1a:37:c8:e7:00:03:39:7d:73:e5:13:cb:be: - 9e:df:c6:87:c3:24:a7:7f:39:1d:cc:ca:1f:e7:14:38:fe:3d: - 06:7a:2f:95:f3:9a:79:49:e9:9c:f3:72:e5:b4:b5:fb:87:13: - 83:4f:9f:76:2f:41:8f:a4:55:1d:e4:74:2f:0a:0f:cd:ee:a8: - 50:06:1e:a7:9e:25:9f:f3:9d:b2:c1:44:de:c5:44:3e:42:64: - e1:75:16:33:56:a7:93:68:bb:fa:96:46:33:de:58:c1:81:42: - ca:1c:28:4f:09:71:db:60:e1:88:ac:d6:0d:37:3a:63:8d:50: - b7:35:2d:e5 + 24:09:87:f3:36:d4:a7:b2:e2:90:7b:f8:18:17:53:f6:d4:9e: + 79:18:e8:9a:0e:fb:49:78:90:48:38:2a:8a:0b:ed:73:3c:2e: + dd:ac:66:5a:78:01:66:e2:10:eb:c0:7f:44:4f:38:59:9c:c9: + fb:63:95:6d:70:98:74:5a:b7:82:77:5e:99:6f:d5:e6:e0:60: + 90:98:6e:05:f0:e3:4e:9e:53:dc:5e:b8:a8:d9:8b:ea:06:1d: + 31:6e:20:9e:10:05:92:27:2d:11:8f:71:f9:39:02:d8:77:f7: + f6:40:1d:b4:8a:57:5c:bb:31:39:b7:64:6d:d0:3f:9d:2d:42: + 26:90:08:bd:78:88:bf:42:45:7b:f9:f0:e3:f8:cf:7e:9f:f8: + 5c:10:2f:e7:46:89:28:de:7f:3a:91:92:d3:f9:76:1b:78:99: + b4:e7:7f:0a:1b:02:97:00:46:a5:f1:f8:89:8a:75:73:1a:8c: + 62:70:00:02:82:14:90:b4:0f:e5:6e:66:9d:3f:09:8c:ee:3a: + 4e:94:70:53:1c:22:71:00:18:da:41:46:d1:44:98:5f:15:67: + 80:33:79:d0:a6:a0:69:89:26:e0:71:26:9f:02:0b:50:8d:76: + d6:06:ad:24:25:01:c8:a7:71:e1:6f:94:f6:11:f8:1f:09:65: + a6:40:b1:28 -----BEGIN CERTIFICATE----- MIIExjCCA66gAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBoTELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNo YWluSC1JQ0E0LXBhdGhsZW4yMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTE5MTAxMTAwMjgwOVoXDTIyMDcwNzAwMjgwOVowgaExCzAJBgNVBAYT +Y29tMB4XDTIwMDUwNzA3MzkwNVoXDTIzMDIwMTA3MzkwNVowgaExCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRUwEwYD VQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2luZWVyaW5nMR0wGwYDVQQD DBRjaGFpbkgtSUNBMy1wYXRobGVuMjEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xm @@ -80,10 +80,10 @@ lDELMAkGA1UEBhMCVVMxEDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVt YW4xETAPBgNVBAoMCFNhd3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYD VQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNz bC5jb22CAWQwDwYDVR0TBAgwBgEB/wIBAjALBgNVHQ8EBAMCAQYwDQYJKoZIhvcN -AQELBQADggEBACo1ytXdlzFNKSGQZ7po7ypWsAgKxaLMMBFxWRtZK8rEzCJS1/On -0hTF/OTFb51Fzn/Q3exfa8PReHopu3OYthWbQTd6ULMEHXKQm+nyS2jzYOm7NG4q -bGxQpjisYbzKJSP19XA6ijOUz5ccXKN2sHuINYpuGEQB5oAj6RTqZlY0mgvKGjfI -5wADOX1z5RPLvp7fxofDJKd/OR3Myh/nFDj+PQZ6L5XzmnlJ6ZzzcuW0tfuHE4NP -n3YvQY+kVR3kdC8KD83uqFAGHqeeJZ/znbLBRN7FRD5CZOF1FjNWp5Nou/qWRjPe -WMGBQsocKE8Jcdtg4Yis1g03OmONULc1LeU= +AQELBQADggEBACQJh/M21Key4pB7+BgXU/bUnnkY6JoO+0l4kEg4KooL7XM8Lt2s +Zlp4AWbiEOvAf0RPOFmcyftjlW1wmHRat4J3Xplv1ebgYJCYbgXw406eU9xeuKjZ +i+oGHTFuIJ4QBZInLRGPcfk5Ath39/ZAHbSKV1y7MTm3ZG3QP50tQiaQCL14iL9C +RXv58OP4z36f+FwQL+dGiSjefzqRktP5dht4mbTnfwobApcARqXx+ImKdXMajGJw +AAKCFJC0D+VuZp0/CYzuOk6UcFMcInEAGNpBRtFEmF8VZ4AzedCmoGmJJuBxJp8C +C1CNdtYGrSQlAcinceFvlPYR+B8JZaZAsSg= -----END CERTIFICATE----- diff --git a/certs/test-pathlen/chainH-ICA4-pathlen2.pem b/certs/test-pathlen/chainH-ICA4-pathlen2.pem index df74193db..a9602646f 100644 --- a/certs/test-pathlen/chainH-ICA4-pathlen2.pem +++ b/certs/test-pathlen/chainH-ICA4-pathlen2.pem @@ -5,8 +5,8 @@ Certificate: Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Oct 11 00:28:09 2019 GMT - Not After : Jul 7 00:28:09 2022 GMT + Not Before: May 7 07:39:05 2020 GMT + Not After : Feb 1 07:39:05 2023 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainH-ICA4-pathlen2, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -37,34 +37,34 @@ Certificate: X509v3 Authority Key Identifier: keyid:27:8E:67:11:74:C3:26:1D:3F:ED:33:63:B3:A4:D8:1D:30:E5:E8:D5 DirName:/C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:86:FF:F5:8E:10:DE:B8:FB + serial:3F:32:13:52:92:C6:DF:4A:D5:42:05:6C:B0:B2:2E:46:C2:F8:B8:67 X509v3 Basic Constraints: CA:TRUE, pathlen:2 X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 61:c0:d8:c4:02:cd:b4:54:d3:44:e9:06:78:0b:a2:16:b5:4a: - b6:b5:09:f1:d1:fc:9f:be:e5:12:0b:6c:61:8d:66:3f:ce:8f: - 95:98:24:ea:d2:99:3a:4f:89:e3:2d:a9:f7:69:cb:05:9e:90: - af:5a:f1:93:ac:ee:fe:78:f8:e3:22:fa:69:7f:e4:71:1d:c9: - 1e:ac:61:81:8d:93:33:bc:b2:e4:67:75:97:9d:af:0a:db:ab: - 24:3f:8d:1d:16:c6:05:c6:89:a7:5f:cf:2d:73:39:de:8f:40: - 94:4b:7a:a4:ea:35:1e:70:ce:3a:f5:75:76:e5:ab:e4:8a:9a: - a4:a1:ec:49:59:3d:b7:23:fa:3c:af:dd:09:d7:aa:47:60:11: - 07:07:f4:8b:a1:40:b2:d9:bb:0f:88:b8:d1:a5:e2:88:22:76: - 8b:45:d6:96:2c:45:11:98:04:85:22:99:1f:49:a7:30:b0:b0: - 74:c3:ea:1a:a6:53:ed:c9:48:40:1a:d8:02:a8:fb:35:3a:f7: - 69:42:b2:75:dd:98:41:30:a9:e3:b1:ec:c6:66:f1:61:16:5b: - f6:e3:bc:31:8e:46:66:fa:39:34:66:cc:95:1d:69:15:12:41: - 16:ce:e6:a6:d4:4c:eb:f4:99:b4:6d:66:99:76:ae:5a:e8:24: - 92:a7:ef:45 + 89:da:33:5e:fd:6a:73:18:ab:43:2f:ae:94:44:a6:93:9b:9d: + 11:bb:c9:59:a2:67:48:4e:45:01:71:7d:c4:5e:c2:aa:b3:ff: + 86:89:77:1c:2c:29:90:21:d8:39:23:6d:0f:a0:37:79:d8:91: + 9c:59:53:2a:8f:f4:01:8c:a7:2e:b9:43:9b:c1:e9:30:0c:e4: + 56:8b:d3:a2:b2:22:41:b9:7e:e9:b0:2c:50:ad:b9:3d:b3:80: + 48:5e:a0:bf:bd:85:1f:95:53:56:0f:70:a4:34:a5:43:d1:be: + e1:01:8f:5a:c3:47:46:a0:13:04:93:17:44:0f:41:cd:f0:2b: + 8e:ae:e0:2b:e8:fc:04:c8:ed:13:a1:71:64:9a:9a:49:2e:aa: + 81:d7:81:11:18:4a:30:8c:84:df:ec:fc:ad:4a:fa:d6:05:bb: + 9b:85:8e:c2:40:16:4f:30:fa:03:8e:a6:fd:93:db:eb:cb:bb: + 0f:f8:83:7d:c5:fa:ff:80:1b:7d:b1:49:3d:2e:6b:87:d7:d9: + 2c:d9:ae:22:b7:61:0a:b7:91:7a:9b:81:6e:31:e0:2e:96:dc: + f9:24:83:82:9d:d6:70:ec:5e:ee:98:fa:e3:36:a6:bf:e8:f1: + 31:27:10:44:9f:46:1b:af:dc:1b:fb:56:96:27:1b:cd:4c:a4: + 99:44:85:d2 -----BEGIN CERTIFICATE----- -MIIEwTCCA6mgAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx +MIIEzDCCA7SgAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx EDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNh d3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cud29sZnNz -bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMTkxMDEx -MDAyODA5WhcNMjIwNzA3MDAyODA5WjCBoTELMAkGA1UEBhMCVVMxEzARBgNVBAgM +bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjAwNTA3 +MDczOTA1WhcNMjMwMjAxMDczOTA1WjCBoTELMAkGA1UEBhMCVVMxEzARBgNVBAgM Cldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoMDHdvbGZTU0wg SW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNoYWluSC1JQ0E0 LXBhdGhsZW4yMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMIIBIjAN @@ -74,16 +74,16 @@ N6kYdo3+ywlUP0+7X6u6cOm0oV6gaX5FP8DMeOnydGR5wmoW0JgwgkRKs5ksZjCs mYIEKr8PYIkENvop0whWYWqoM0CaU30gqFFvm6DZPtyaix03nq3J/VOnBNwfNj7T ZVKEJGHQTuJBYL/7/bIEsz/rFJlevOh96WXRP/4ESeW7oy3j25bf2YGgMtcBubgC jrmiHwrUJBc6GQ9tOhBfXH24VoLHf0DwLYdjwbHYZMc8JxNKY4IhsfI56QIDAQAB -o4IBDTCCAQkwHQYDVR0OBBYEFBhtRIPuH+y0IvCc61QeShVYAaoTMIHJBgNVHSME -gcEwgb6AFCeOZxF0wyYdP+0zY7Ok2B0w5ejVoYGapIGXMIGUMQswCQYDVQQGEwJV +o4IBGDCCARQwHQYDVR0OBBYEFBhtRIPuH+y0IvCc61QeShVYAaoTMIHUBgNVHSME +gcwwgcmAFCeOZxF0wyYdP+0zY7Ok2B0w5ejVoYGapIGXMIGUMQswCQYDVQQGEwJV UzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjERMA8GA1UECgwI U2F3dG9vdGgxEzARBgNVBAsMCkNvbnN1bHRpbmcxGDAWBgNVBAMMD3d3dy53b2xm -c3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIJAIb/9Y4Q -3rj7MA8GA1UdEwQIMAYBAf8CAQIwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBCwUA -A4IBAQBhwNjEAs20VNNE6QZ4C6IWtUq2tQnx0fyfvuUSC2xhjWY/zo+VmCTq0pk6 -T4njLan3acsFnpCvWvGTrO7+ePjjIvppf+RxHckerGGBjZMzvLLkZ3WXna8K26sk -P40dFsYFxomnX88tcznej0CUS3qk6jUecM469XV25avkipqkoexJWT23I/o8r90J -16pHYBEHB/SLoUCy2bsPiLjRpeKIInaLRdaWLEURmASFIpkfSacwsLB0w+oaplPt -yUhAGtgCqPs1OvdpQrJ13ZhBMKnjsezGZvFhFlv247wxjkZm+jk0ZsyVHWkVEkEW -zuam1Ezr9Jm0bWaZdq5a6CSSp+9F +c3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIUPzITUpLG +30rVQgVssLIuRsL4uGcwDwYDVR0TBAgwBgEB/wIBAjALBgNVHQ8EBAMCAQYwDQYJ +KoZIhvcNAQELBQADggEBAInaM179anMYq0MvrpREppObnRG7yVmiZ0hORQFxfcRe +wqqz/4aJdxwsKZAh2DkjbQ+gN3nYkZxZUyqP9AGMpy65Q5vB6TAM5FaL06KyIkG5 +fumwLFCtuT2zgEheoL+9hR+VU1YPcKQ0pUPRvuEBj1rDR0agEwSTF0QPQc3wK46u +4Cvo/ATI7ROhcWSamkkuqoHXgREYSjCMhN/s/K1K+tYFu5uFjsJAFk8w+gOOpv2T +2+vLuw/4g33F+v+AG32xST0ua4fX2SzZriK3YQq3kXqbgW4x4C6W3Pkkg4Kd1nDs +Xu6Y+uM2pr/o8TEnEESfRhuv3Bv7VpYnG81MpJlEhdI= -----END CERTIFICATE----- diff --git a/certs/test-pathlen/chainH-assembled.pem b/certs/test-pathlen/chainH-assembled.pem index bbf203142..c8f3a82b3 100644 --- a/certs/test-pathlen/chainH-assembled.pem +++ b/certs/test-pathlen/chainH-assembled.pem @@ -5,8 +5,8 @@ Certificate: Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainH-ICA1-pathlen0, emailAddress = info@wolfssl.com Validity - Not Before: Oct 11 00:28:10 2019 GMT - Not After : Jul 7 00:28:10 2022 GMT + Not Before: May 7 07:39:05 2020 GMT + Not After : Feb 1 07:39:05 2023 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainH-entity, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -42,27 +42,27 @@ Certificate: X509v3 Basic Constraints: CA:FALSE Signature Algorithm: sha256WithRSAEncryption - bc:fc:a7:c3:c9:a4:57:9e:37:9d:f7:71:eb:5b:7c:a2:1a:0d: - 24:97:12:92:18:fd:0f:5e:5b:f9:27:c9:98:2c:9a:06:bd:77: - 85:63:3c:a4:ed:90:92:3a:79:41:82:c3:54:66:f6:c6:a0:d3: - ba:a3:19:93:d9:5f:54:90:fc:2b:37:d1:96:88:ba:be:e1:71: - 8c:a2:24:d7:ce:d8:7c:5e:87:9f:4f:f2:52:51:1c:82:5b:2c: - 8b:b4:5d:7e:d6:03:95:a0:e9:29:68:5e:76:18:2b:93:6f:a1: - 58:a6:f6:35:8b:37:b9:6b:82:5d:3a:8c:bc:a6:bd:18:ca:2f: - ea:0c:4d:36:7a:58:80:52:9c:b3:fa:a4:2b:0e:97:e6:0f:fc: - 41:62:6d:45:19:15:6d:3e:16:e5:bc:81:ce:c0:34:d3:b5:d4: - 0c:54:a5:62:a6:55:57:ad:e8:6f:94:58:cb:31:ff:0f:1c:13: - 63:82:91:1f:a3:68:f5:9f:9c:d9:dd:54:e0:d0:36:ea:ad:2a: - 9d:4e:66:be:c7:2f:1a:16:70:be:b4:1b:c5:2d:b2:1b:0c:87: - 64:10:4d:db:8b:79:5b:2e:10:a4:95:25:7b:be:b2:21:26:47: - e9:d2:74:c8:34:b1:e3:7b:73:8c:93:7a:82:ce:50:d4:46:34: - ab:11:71:c0 + 57:ec:60:72:12:aa:49:ec:21:09:65:0d:ee:35:93:70:be:8a: + a5:a3:5e:c6:ca:ba:45:c3:69:12:2a:22:cb:87:40:4c:6e:80: + c5:f1:72:d8:d6:a0:cc:f4:ef:5b:67:d3:00:32:c9:91:8a:5e: + 42:bd:02:31:86:73:15:7b:eb:d8:ae:11:94:d2:40:b8:20:c0: + 6c:74:53:1b:72:6e:87:d9:f7:7a:c3:42:fa:67:43:fd:d8:e2: + eb:48:41:88:e7:2f:e0:4f:30:b6:20:6f:f2:30:60:d7:a5:ad: + 22:97:13:81:9d:e1:b7:d8:9c:9c:19:6b:0d:45:21:21:3a:86: + 7a:a9:26:21:b2:90:25:2f:9a:d4:4b:1d:5d:b3:5e:05:d3:99: + 2f:09:be:e4:76:40:8c:4e:83:5b:10:45:cc:b3:b5:2f:77:7a: + 73:7b:f7:de:31:36:96:3a:f1:20:a2:03:47:ce:89:e9:56:54: + e7:43:e1:47:15:13:22:6d:22:73:c9:70:05:23:30:06:d8:9e: + dd:94:55:b0:41:79:b3:cf:63:35:46:bb:9c:d6:64:9c:f2:94: + 01:a8:08:16:94:b0:b1:e1:70:66:4b:34:fa:6f:f0:ac:e6:0b: + 46:0b:cd:7f:00:2d:92:2d:06:23:a1:8b:78:8a:42:b3:70:40: + 34:e7:13:e1 -----BEGIN CERTIFICATE----- MIIEtzCCA5+gAwIBAgIBZTANBgkqhkiG9w0BAQsFADCBoTELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNo YWluSC1JQ0ExLXBhdGhsZW4wMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTE5MTAxMTAwMjgxMFoXDTIyMDcwNzAwMjgxMFowgZoxCzAJBgNVBAYT +Y29tMB4XDTIwMDUwNzA3MzkwNVoXDTIzMDIwMTA3MzkwNVowgZoxCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRUwEwYD VQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2luZWVyaW5nMRYwFAYDVQQD DA1jaGFpbkgtZW50aXR5MR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29t @@ -77,13 +77,13 @@ VR0jBIHGMIHDgBRIgIco7+YoDwOb3zNIEKDlILNpUKGBp6SBpDCBoTELMAkGA1UE BhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTAT BgNVBAoMDHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNV BAMMFGNoYWluSC1JQ0EyLXBhdGhsZW4yMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdv -bGZzc2wuY29tggFkMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBALz8p8PJ -pFeeN533cetbfKIaDSSXEpIY/Q9eW/knyZgsmga9d4VjPKTtkJI6eUGCw1Rm9sag -07qjGZPZX1SQ/Cs30ZaIur7hcYyiJNfO2Hxeh59P8lJRHIJbLIu0XX7WA5Wg6Slo -XnYYK5NvoVim9jWLN7lrgl06jLymvRjKL+oMTTZ6WIBSnLP6pCsOl+YP/EFibUUZ -FW0+FuW8gc7ANNO11AxUpWKmVVet6G+UWMsx/w8cE2OCkR+jaPWfnNndVODQNuqt -Kp1OZr7HLxoWcL60G8UtshsMh2QQTduLeVsuEKSVJXu+siEmR+nSdMg0seN7c4yT -eoLOUNRGNKsRccA= +bGZzc2wuY29tggFkMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAFfsYHIS +qknsIQllDe41k3C+iqWjXsbKukXDaRIqIsuHQExugMXxctjWoMz071tn0wAyyZGK +XkK9AjGGcxV769iuEZTSQLggwGx0UxtybofZ93rDQvpnQ/3Y4utIQYjnL+BPMLYg +b/IwYNelrSKXE4Gd4bfYnJwZaw1FISE6hnqpJiGykCUvmtRLHV2zXgXTmS8JvuR2 +QIxOg1sQRcyztS93enN7994xNpY68SCiA0fOielWVOdD4UcVEyJtInPJcAUjMAbY +nt2UVbBBebPPYzVGu5zWZJzylAGoCBaUsLHhcGZLNPpv8KzmC0YLzX8ALZItBiOh +i3iKQrNwQDTnE+E= -----END CERTIFICATE----- Certificate: Data: @@ -92,8 +92,8 @@ Certificate: Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainH-ICA2-pathlen2, emailAddress = info@wolfssl.com Validity - Not Before: Oct 11 00:28:10 2019 GMT - Not After : Jul 7 00:28:10 2022 GMT + Not Before: May 7 07:39:05 2020 GMT + Not After : Feb 1 07:39:05 2023 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainH-ICA1-pathlen0, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -131,27 +131,27 @@ Certificate: X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 5f:77:d6:d2:55:4e:25:be:4b:f4:9f:9d:a8:ff:92:ac:4d:19: - 1f:0b:50:5b:51:01:7f:b8:a2:56:0d:cd:0c:c8:66:7a:08:bf: - 1e:07:6a:a5:6d:ad:68:c4:bb:da:99:d7:f3:62:bb:b5:28:de: - 47:dc:e2:b0:e1:27:cd:14:4b:7d:1c:7d:1a:60:eb:37:6f:fc: - ff:4e:1f:9f:ce:52:da:b4:a7:f4:6c:92:b5:65:b5:8f:53:1b: - d8:bd:7d:f6:a8:7e:23:9f:7d:b6:09:18:f2:a3:17:55:aa:fe: - 57:87:3d:a9:18:52:76:6e:fe:7c:ed:2a:85:45:63:d3:4d:7b: - f2:5e:ff:0f:a7:ae:24:ef:5f:71:66:25:29:31:9e:4a:12:a0: - 56:5b:39:2c:79:64:d0:1a:fb:97:99:df:42:9c:23:b4:f1:1d: - be:fc:da:41:16:b1:a0:fc:3a:b8:6e:a7:cf:3c:21:ea:22:7c: - f6:d2:a1:25:96:1e:b9:2f:eb:bf:61:c2:ee:58:c6:a1:7e:d0: - 73:e3:fd:58:62:ca:44:95:2b:b1:a8:d0:f8:1a:0d:40:9a:fb: - b1:27:4b:fc:57:4c:32:b5:09:5e:6e:ac:1d:dc:bc:77:f5:1b: - 27:88:40:df:70:da:f7:28:32:ef:8f:2e:53:41:78:69:e9:3e: - 7b:64:da:e4 + 9b:f5:9e:a9:32:af:ac:0b:be:d2:bf:96:3e:37:ee:b4:cf:ad: + be:21:dc:17:c6:a3:5a:4c:7d:9b:ca:a8:26:81:f2:3c:01:e6: + c0:ab:04:16:e6:75:47:c4:7e:31:2c:06:2c:31:c2:81:7d:9a: + c7:e9:f9:13:9b:c6:ac:ed:e7:05:63:d4:6b:50:b3:2f:39:3d: + 84:1f:86:e8:11:bd:de:35:71:d2:1a:9e:13:9c:d7:c2:fb:a2: + 01:bd:55:c8:39:6c:96:f0:1f:db:11:7e:fc:c9:e9:24:09:ce: + 32:d4:9a:99:58:a6:80:63:95:96:4c:73:1e:8b:15:e3:d2:e3: + e6:d2:6a:81:8f:ac:81:b2:23:ef:a1:a2:66:a2:5d:49:03:97: + e2:2e:90:65:e0:2f:55:5e:15:d6:e1:10:6f:d2:a9:07:c1:a1: + a7:16:d6:5a:62:9d:44:22:46:22:e6:a7:0c:11:3a:89:c4:86: + 12:19:7f:90:7b:27:99:c5:d4:6e:05:3e:96:c0:f7:21:ba:5c: + 2a:b2:ca:1c:45:44:53:8a:6e:2a:ee:35:60:e7:37:4d:18:a0: + 18:7e:93:19:c8:98:e4:dc:e2:b6:2a:de:84:e3:80:42:fe:48: + 87:0a:5e:e4:44:c1:9c:75:04:c8:9b:4f:d8:7b:cb:75:1b:ae: + 41:4c:b4:46 -----BEGIN CERTIFICATE----- MIIE0zCCA7ugAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBoTELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNo YWluSC1JQ0EyLXBhdGhsZW4yMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTE5MTAxMTAwMjgxMFoXDTIyMDcwNzAwMjgxMFowgaExCzAJBgNVBAYT +Y29tMB4XDTIwMDUwNzA3MzkwNVoXDTIzMDIwMTA3MzkwNVowgaExCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRUwEwYD VQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2luZWVyaW5nMR0wGwYDVQQD DBRjaGFpbkgtSUNBMS1wYXRobGVuMDEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xm @@ -167,12 +167,12 @@ oTELMAkGA1UEBhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1Nl YXR0bGUxFTATBgNVBAoMDHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJp bmcxHTAbBgNVBAMMFGNoYWluSC1JQ0EzLXBhdGhsZW4yMR8wHQYJKoZIhvcNAQkB FhBpbmZvQHdvbGZzc2wuY29tggFkMA8GA1UdEwQIMAYBAf8CAQAwCwYDVR0PBAQD -AgEGMA0GCSqGSIb3DQEBCwUAA4IBAQBfd9bSVU4lvkv0n52o/5KsTRkfC1BbUQF/ -uKJWDc0MyGZ6CL8eB2qlba1oxLvamdfzYru1KN5H3OKw4SfNFEt9HH0aYOs3b/z/ -Th+fzlLatKf0bJK1ZbWPUxvYvX32qH4jn322CRjyoxdVqv5Xhz2pGFJ2bv587SqF -RWPTTXvyXv8Pp64k719xZiUpMZ5KEqBWWzkseWTQGvuXmd9CnCO08R2+/NpBFrGg -/Dq4bqfPPCHqInz20qEllh65L+u/YcLuWMahftBz4/1YYspElSuxqND4Gg1Amvux -J0v8V0wytQlebqwd3Lx39RsniEDfcNr3KDLvjy5TQXhp6T57ZNrk +AgEGMA0GCSqGSIb3DQEBCwUAA4IBAQCb9Z6pMq+sC77Sv5Y+N+60z62+IdwXxqNa +TH2byqgmgfI8AebAqwQW5nVHxH4xLAYsMcKBfZrH6fkTm8as7ecFY9RrULMvOT2E +H4boEb3eNXHSGp4TnNfC+6IBvVXIOWyW8B/bEX78yekkCc4y1JqZWKaAY5WWTHMe +ixXj0uPm0mqBj6yBsiPvoaJmol1JA5fiLpBl4C9VXhXW4RBv0qkHwaGnFtZaYp1E +IkYi5qcMETqJxIYSGX+QeyeZxdRuBT6WwPchulwqssocRURTim4q7jVg5zdNGKAY +fpMZyJjk3OK2Kt6E44BC/kiHCl7kRMGcdQTIm0/Ye8t1G65BTLRG -----END CERTIFICATE----- Certificate: Data: @@ -181,8 +181,8 @@ Certificate: Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainH-ICA3-pathlen2, emailAddress = info@wolfssl.com Validity - Not Before: Oct 11 00:28:09 2019 GMT - Not After : Jul 7 00:28:09 2022 GMT + Not Before: May 7 07:39:05 2020 GMT + Not After : Feb 1 07:39:05 2023 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainH-ICA2-pathlen2, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -220,27 +220,27 @@ Certificate: X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 16:6f:a3:cd:f6:de:87:1c:86:f8:b4:b8:e6:e0:dc:11:2f:f3: - bb:f1:57:34:ec:1a:59:8a:81:63:40:01:df:53:24:a7:50:b0: - 6d:3d:29:2a:41:e7:08:71:0f:37:4b:10:b5:95:ae:a0:81:ba: - ba:b5:3e:72:48:be:6b:9e:be:34:3b:0d:15:f8:8f:9d:24:68: - 01:0c:d4:4a:0d:86:d5:b3:71:b6:d6:8e:71:44:16:7e:e3:db: - ba:7d:0e:5f:b3:2f:e2:60:f9:ff:bc:91:a6:ae:3c:ba:30:e4: - f5:55:bf:1e:72:0b:cc:5e:b4:7e:1f:09:aa:b4:52:bd:8c:2c: - 37:d0:0d:82:b4:ec:ff:c1:cf:91:a2:43:24:b8:b4:c0:ac:f2: - 29:eb:84:1d:49:ef:a4:8f:65:b3:06:01:2f:23:cf:a6:27:42: - cd:99:17:b9:69:40:1d:df:99:f6:f8:c4:61:cc:4a:a1:f0:38: - ce:4e:c4:27:f6:8f:d2:ae:74:5f:39:93:66:77:55:b2:25:8d: - 7e:7f:7d:b4:2b:f1:ee:83:9e:7b:f5:31:3f:d7:27:53:e6:21: - bd:69:a5:ca:0e:d8:6e:54:67:56:bf:f3:ec:e8:e1:aa:a4:76: - fa:0d:42:d4:7d:26:bd:f5:e5:25:ee:81:c4:ed:59:eb:0a:54: - d3:c9:18:30 + 18:c5:91:36:f9:99:81:ef:04:b9:3d:9b:9a:a7:d6:e5:2c:68: + ab:db:44:c4:ac:77:bd:2d:de:5c:f1:d9:fa:6b:41:ff:51:62: + 2a:e3:f3:04:0e:f8:b5:98:28:ee:0c:28:b3:aa:32:39:c0:64: + 09:a2:98:1d:49:be:b3:9a:15:e3:4b:69:e3:50:b8:25:3f:af: + 69:c3:83:08:00:a1:15:5f:e7:4b:ee:15:4f:72:5c:d8:8a:a1: + e5:15:26:e1:f7:4c:82:0c:6a:5f:71:bb:11:ee:49:b4:08:16: + bd:20:0a:d9:ed:25:69:3e:66:cf:d8:92:dd:55:bb:78:34:52: + 47:d7:49:cd:6f:bd:43:e3:f5:39:74:2c:76:97:ed:8d:3f:b1: + c9:a0:21:90:44:8e:38:ba:f5:17:9e:5a:2b:05:b8:61:b3:6b: + 3a:0e:98:f8:fc:b7:05:a6:61:36:0e:ba:d5:9f:8c:ae:73:73: + 29:4a:df:c4:da:78:ce:4d:99:fd:70:56:de:bb:fc:9c:a8:96: + 9d:93:7f:fc:9e:88:0b:de:58:73:65:c3:c3:4c:3e:97:5a:29: + 7c:4c:29:87:55:02:b4:56:88:84:94:17:45:dc:c6:96:13:9a: + e5:7e:18:fb:45:e2:e4:c7:47:34:72:3d:1f:d0:d6:e6:12:1d: + b1:f7:17:61 -----BEGIN CERTIFICATE----- MIIE0zCCA7ugAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBoTELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNo YWluSC1JQ0EzLXBhdGhsZW4yMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTE5MTAxMTAwMjgwOVoXDTIyMDcwNzAwMjgwOVowgaExCzAJBgNVBAYT +Y29tMB4XDTIwMDUwNzA3MzkwNVoXDTIzMDIwMTA3MzkwNVowgaExCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRUwEwYD VQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2luZWVyaW5nMR0wGwYDVQQD DBRjaGFpbkgtSUNBMi1wYXRobGVuMjEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xm @@ -256,12 +256,12 @@ oTELMAkGA1UEBhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1Nl YXR0bGUxFTATBgNVBAoMDHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJp bmcxHTAbBgNVBAMMFGNoYWluSC1JQ0E0LXBhdGhsZW4yMR8wHQYJKoZIhvcNAQkB FhBpbmZvQHdvbGZzc2wuY29tggFkMA8GA1UdEwQIMAYBAf8CAQIwCwYDVR0PBAQD -AgEGMA0GCSqGSIb3DQEBCwUAA4IBAQAWb6PN9t6HHIb4tLjm4NwRL/O78Vc07BpZ -ioFjQAHfUySnULBtPSkqQecIcQ83SxC1la6ggbq6tT5ySL5rnr40Ow0V+I+dJGgB -DNRKDYbVs3G21o5xRBZ+49u6fQ5fsy/iYPn/vJGmrjy6MOT1Vb8ecgvMXrR+Hwmq -tFK9jCw30A2CtOz/wc+RokMkuLTArPIp64QdSe+kj2WzBgEvI8+mJ0LNmRe5aUAd -35n2+MRhzEqh8DjOTsQn9o/SrnRfOZNmd1WyJY1+f320K/Hug5579TE/1ydT5iG9 -aaXKDthuVGdWv/Ps6OGqpHb6DULUfSa99eUl7oHE7VnrClTTyRgw +AgEGMA0GCSqGSIb3DQEBCwUAA4IBAQAYxZE2+ZmB7wS5PZuap9blLGir20TErHe9 +Ld5c8dn6a0H/UWIq4/MEDvi1mCjuDCizqjI5wGQJopgdSb6zmhXjS2njULglP69p +w4MIAKEVX+dL7hVPclzYiqHlFSbh90yCDGpfcbsR7km0CBa9IArZ7SVpPmbP2JLd +Vbt4NFJH10nNb71D4/U5dCx2l+2NP7HJoCGQRI44uvUXnlorBbhhs2s6Dpj4/LcF +pmE2DrrVn4yuc3MpSt/E2njOTZn9cFbeu/ycqJadk3/8nogL3lhzZcPDTD6XWil8 +TCmHVQK0VoiElBdF3MaWE5rlfhj7ReLkx0c0cj0f0NbmEh2x9xdh -----END CERTIFICATE----- Certificate: Data: @@ -270,8 +270,8 @@ Certificate: Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainH-ICA4-pathlen2, emailAddress = info@wolfssl.com Validity - Not Before: Oct 11 00:28:09 2019 GMT - Not After : Jul 7 00:28:09 2022 GMT + Not Before: May 7 07:39:05 2020 GMT + Not After : Feb 1 07:39:05 2023 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainH-ICA3-pathlen2, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -309,27 +309,27 @@ Certificate: X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 2a:35:ca:d5:dd:97:31:4d:29:21:90:67:ba:68:ef:2a:56:b0: - 08:0a:c5:a2:cc:30:11:71:59:1b:59:2b:ca:c4:cc:22:52:d7: - f3:a7:d2:14:c5:fc:e4:c5:6f:9d:45:ce:7f:d0:dd:ec:5f:6b: - c3:d1:78:7a:29:bb:73:98:b6:15:9b:41:37:7a:50:b3:04:1d: - 72:90:9b:e9:f2:4b:68:f3:60:e9:bb:34:6e:2a:6c:6c:50:a6: - 38:ac:61:bc:ca:25:23:f5:f5:70:3a:8a:33:94:cf:97:1c:5c: - a3:76:b0:7b:88:35:8a:6e:18:44:01:e6:80:23:e9:14:ea:66: - 56:34:9a:0b:ca:1a:37:c8:e7:00:03:39:7d:73:e5:13:cb:be: - 9e:df:c6:87:c3:24:a7:7f:39:1d:cc:ca:1f:e7:14:38:fe:3d: - 06:7a:2f:95:f3:9a:79:49:e9:9c:f3:72:e5:b4:b5:fb:87:13: - 83:4f:9f:76:2f:41:8f:a4:55:1d:e4:74:2f:0a:0f:cd:ee:a8: - 50:06:1e:a7:9e:25:9f:f3:9d:b2:c1:44:de:c5:44:3e:42:64: - e1:75:16:33:56:a7:93:68:bb:fa:96:46:33:de:58:c1:81:42: - ca:1c:28:4f:09:71:db:60:e1:88:ac:d6:0d:37:3a:63:8d:50: - b7:35:2d:e5 + 24:09:87:f3:36:d4:a7:b2:e2:90:7b:f8:18:17:53:f6:d4:9e: + 79:18:e8:9a:0e:fb:49:78:90:48:38:2a:8a:0b:ed:73:3c:2e: + dd:ac:66:5a:78:01:66:e2:10:eb:c0:7f:44:4f:38:59:9c:c9: + fb:63:95:6d:70:98:74:5a:b7:82:77:5e:99:6f:d5:e6:e0:60: + 90:98:6e:05:f0:e3:4e:9e:53:dc:5e:b8:a8:d9:8b:ea:06:1d: + 31:6e:20:9e:10:05:92:27:2d:11:8f:71:f9:39:02:d8:77:f7: + f6:40:1d:b4:8a:57:5c:bb:31:39:b7:64:6d:d0:3f:9d:2d:42: + 26:90:08:bd:78:88:bf:42:45:7b:f9:f0:e3:f8:cf:7e:9f:f8: + 5c:10:2f:e7:46:89:28:de:7f:3a:91:92:d3:f9:76:1b:78:99: + b4:e7:7f:0a:1b:02:97:00:46:a5:f1:f8:89:8a:75:73:1a:8c: + 62:70:00:02:82:14:90:b4:0f:e5:6e:66:9d:3f:09:8c:ee:3a: + 4e:94:70:53:1c:22:71:00:18:da:41:46:d1:44:98:5f:15:67: + 80:33:79:d0:a6:a0:69:89:26:e0:71:26:9f:02:0b:50:8d:76: + d6:06:ad:24:25:01:c8:a7:71:e1:6f:94:f6:11:f8:1f:09:65: + a6:40:b1:28 -----BEGIN CERTIFICATE----- MIIExjCCA66gAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBoTELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNo YWluSC1JQ0E0LXBhdGhsZW4yMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTE5MTAxMTAwMjgwOVoXDTIyMDcwNzAwMjgwOVowgaExCzAJBgNVBAYT +Y29tMB4XDTIwMDUwNzA3MzkwNVoXDTIzMDIwMTA3MzkwNVowgaExCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRUwEwYD VQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2luZWVyaW5nMR0wGwYDVQQD DBRjaGFpbkgtSUNBMy1wYXRobGVuMjEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xm @@ -345,12 +345,12 @@ lDELMAkGA1UEBhMCVVMxEDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVt YW4xETAPBgNVBAoMCFNhd3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYD VQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNz bC5jb22CAWQwDwYDVR0TBAgwBgEB/wIBAjALBgNVHQ8EBAMCAQYwDQYJKoZIhvcN -AQELBQADggEBACo1ytXdlzFNKSGQZ7po7ypWsAgKxaLMMBFxWRtZK8rEzCJS1/On -0hTF/OTFb51Fzn/Q3exfa8PReHopu3OYthWbQTd6ULMEHXKQm+nyS2jzYOm7NG4q -bGxQpjisYbzKJSP19XA6ijOUz5ccXKN2sHuINYpuGEQB5oAj6RTqZlY0mgvKGjfI -5wADOX1z5RPLvp7fxofDJKd/OR3Myh/nFDj+PQZ6L5XzmnlJ6ZzzcuW0tfuHE4NP -n3YvQY+kVR3kdC8KD83uqFAGHqeeJZ/znbLBRN7FRD5CZOF1FjNWp5Nou/qWRjPe -WMGBQsocKE8Jcdtg4Yis1g03OmONULc1LeU= +AQELBQADggEBACQJh/M21Key4pB7+BgXU/bUnnkY6JoO+0l4kEg4KooL7XM8Lt2s +Zlp4AWbiEOvAf0RPOFmcyftjlW1wmHRat4J3Xplv1ebgYJCYbgXw406eU9xeuKjZ +i+oGHTFuIJ4QBZInLRGPcfk5Ath39/ZAHbSKV1y7MTm3ZG3QP50tQiaQCL14iL9C +RXv58OP4z36f+FwQL+dGiSjefzqRktP5dht4mbTnfwobApcARqXx+ImKdXMajGJw +AAKCFJC0D+VuZp0/CYzuOk6UcFMcInEAGNpBRtFEmF8VZ4AzedCmoGmJJuBxJp8C +C1CNdtYGrSQlAcinceFvlPYR+B8JZaZAsSg= -----END CERTIFICATE----- Certificate: Data: @@ -359,8 +359,8 @@ Certificate: Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Oct 11 00:28:09 2019 GMT - Not After : Jul 7 00:28:09 2022 GMT + Not Before: May 7 07:39:05 2020 GMT + Not After : Feb 1 07:39:05 2023 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainH-ICA4-pathlen2, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -391,34 +391,34 @@ Certificate: X509v3 Authority Key Identifier: keyid:27:8E:67:11:74:C3:26:1D:3F:ED:33:63:B3:A4:D8:1D:30:E5:E8:D5 DirName:/C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:86:FF:F5:8E:10:DE:B8:FB + serial:3F:32:13:52:92:C6:DF:4A:D5:42:05:6C:B0:B2:2E:46:C2:F8:B8:67 X509v3 Basic Constraints: CA:TRUE, pathlen:2 X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 61:c0:d8:c4:02:cd:b4:54:d3:44:e9:06:78:0b:a2:16:b5:4a: - b6:b5:09:f1:d1:fc:9f:be:e5:12:0b:6c:61:8d:66:3f:ce:8f: - 95:98:24:ea:d2:99:3a:4f:89:e3:2d:a9:f7:69:cb:05:9e:90: - af:5a:f1:93:ac:ee:fe:78:f8:e3:22:fa:69:7f:e4:71:1d:c9: - 1e:ac:61:81:8d:93:33:bc:b2:e4:67:75:97:9d:af:0a:db:ab: - 24:3f:8d:1d:16:c6:05:c6:89:a7:5f:cf:2d:73:39:de:8f:40: - 94:4b:7a:a4:ea:35:1e:70:ce:3a:f5:75:76:e5:ab:e4:8a:9a: - a4:a1:ec:49:59:3d:b7:23:fa:3c:af:dd:09:d7:aa:47:60:11: - 07:07:f4:8b:a1:40:b2:d9:bb:0f:88:b8:d1:a5:e2:88:22:76: - 8b:45:d6:96:2c:45:11:98:04:85:22:99:1f:49:a7:30:b0:b0: - 74:c3:ea:1a:a6:53:ed:c9:48:40:1a:d8:02:a8:fb:35:3a:f7: - 69:42:b2:75:dd:98:41:30:a9:e3:b1:ec:c6:66:f1:61:16:5b: - f6:e3:bc:31:8e:46:66:fa:39:34:66:cc:95:1d:69:15:12:41: - 16:ce:e6:a6:d4:4c:eb:f4:99:b4:6d:66:99:76:ae:5a:e8:24: - 92:a7:ef:45 + 89:da:33:5e:fd:6a:73:18:ab:43:2f:ae:94:44:a6:93:9b:9d: + 11:bb:c9:59:a2:67:48:4e:45:01:71:7d:c4:5e:c2:aa:b3:ff: + 86:89:77:1c:2c:29:90:21:d8:39:23:6d:0f:a0:37:79:d8:91: + 9c:59:53:2a:8f:f4:01:8c:a7:2e:b9:43:9b:c1:e9:30:0c:e4: + 56:8b:d3:a2:b2:22:41:b9:7e:e9:b0:2c:50:ad:b9:3d:b3:80: + 48:5e:a0:bf:bd:85:1f:95:53:56:0f:70:a4:34:a5:43:d1:be: + e1:01:8f:5a:c3:47:46:a0:13:04:93:17:44:0f:41:cd:f0:2b: + 8e:ae:e0:2b:e8:fc:04:c8:ed:13:a1:71:64:9a:9a:49:2e:aa: + 81:d7:81:11:18:4a:30:8c:84:df:ec:fc:ad:4a:fa:d6:05:bb: + 9b:85:8e:c2:40:16:4f:30:fa:03:8e:a6:fd:93:db:eb:cb:bb: + 0f:f8:83:7d:c5:fa:ff:80:1b:7d:b1:49:3d:2e:6b:87:d7:d9: + 2c:d9:ae:22:b7:61:0a:b7:91:7a:9b:81:6e:31:e0:2e:96:dc: + f9:24:83:82:9d:d6:70:ec:5e:ee:98:fa:e3:36:a6:bf:e8:f1: + 31:27:10:44:9f:46:1b:af:dc:1b:fb:56:96:27:1b:cd:4c:a4: + 99:44:85:d2 -----BEGIN CERTIFICATE----- -MIIEwTCCA6mgAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx +MIIEzDCCA7SgAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx EDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNh d3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cud29sZnNz -bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMTkxMDEx -MDAyODA5WhcNMjIwNzA3MDAyODA5WjCBoTELMAkGA1UEBhMCVVMxEzARBgNVBAgM +bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjAwNTA3 +MDczOTA1WhcNMjMwMjAxMDczOTA1WjCBoTELMAkGA1UEBhMCVVMxEzARBgNVBAgM Cldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoMDHdvbGZTU0wg SW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNoYWluSC1JQ0E0 LXBhdGhsZW4yMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMIIBIjAN @@ -428,16 +428,16 @@ N6kYdo3+ywlUP0+7X6u6cOm0oV6gaX5FP8DMeOnydGR5wmoW0JgwgkRKs5ksZjCs mYIEKr8PYIkENvop0whWYWqoM0CaU30gqFFvm6DZPtyaix03nq3J/VOnBNwfNj7T ZVKEJGHQTuJBYL/7/bIEsz/rFJlevOh96WXRP/4ESeW7oy3j25bf2YGgMtcBubgC jrmiHwrUJBc6GQ9tOhBfXH24VoLHf0DwLYdjwbHYZMc8JxNKY4IhsfI56QIDAQAB -o4IBDTCCAQkwHQYDVR0OBBYEFBhtRIPuH+y0IvCc61QeShVYAaoTMIHJBgNVHSME -gcEwgb6AFCeOZxF0wyYdP+0zY7Ok2B0w5ejVoYGapIGXMIGUMQswCQYDVQQGEwJV +o4IBGDCCARQwHQYDVR0OBBYEFBhtRIPuH+y0IvCc61QeShVYAaoTMIHUBgNVHSME +gcwwgcmAFCeOZxF0wyYdP+0zY7Ok2B0w5ejVoYGapIGXMIGUMQswCQYDVQQGEwJV UzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjERMA8GA1UECgwI U2F3dG9vdGgxEzARBgNVBAsMCkNvbnN1bHRpbmcxGDAWBgNVBAMMD3d3dy53b2xm -c3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIJAIb/9Y4Q -3rj7MA8GA1UdEwQIMAYBAf8CAQIwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBCwUA -A4IBAQBhwNjEAs20VNNE6QZ4C6IWtUq2tQnx0fyfvuUSC2xhjWY/zo+VmCTq0pk6 -T4njLan3acsFnpCvWvGTrO7+ePjjIvppf+RxHckerGGBjZMzvLLkZ3WXna8K26sk -P40dFsYFxomnX88tcznej0CUS3qk6jUecM469XV25avkipqkoexJWT23I/o8r90J -16pHYBEHB/SLoUCy2bsPiLjRpeKIInaLRdaWLEURmASFIpkfSacwsLB0w+oaplPt -yUhAGtgCqPs1OvdpQrJ13ZhBMKnjsezGZvFhFlv247wxjkZm+jk0ZsyVHWkVEkEW -zuam1Ezr9Jm0bWaZdq5a6CSSp+9F +c3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIUPzITUpLG +30rVQgVssLIuRsL4uGcwDwYDVR0TBAgwBgEB/wIBAjALBgNVHQ8EBAMCAQYwDQYJ +KoZIhvcNAQELBQADggEBAInaM179anMYq0MvrpREppObnRG7yVmiZ0hORQFxfcRe +wqqz/4aJdxwsKZAh2DkjbQ+gN3nYkZxZUyqP9AGMpy65Q5vB6TAM5FaL06KyIkG5 +fumwLFCtuT2zgEheoL+9hR+VU1YPcKQ0pUPRvuEBj1rDR0agEwSTF0QPQc3wK46u +4Cvo/ATI7ROhcWSamkkuqoHXgREYSjCMhN/s/K1K+tYFu5uFjsJAFk8w+gOOpv2T +2+vLuw/4g33F+v+AG32xST0ua4fX2SzZriK3YQq3kXqbgW4x4C6W3Pkkg4Kd1nDs +Xu6Y+uM2pr/o8TEnEESfRhuv3Bv7VpYnG81MpJlEhdI= -----END CERTIFICATE----- diff --git a/certs/test-pathlen/chainH-entity.pem b/certs/test-pathlen/chainH-entity.pem index b125341e5..ad427478c 100644 --- a/certs/test-pathlen/chainH-entity.pem +++ b/certs/test-pathlen/chainH-entity.pem @@ -5,8 +5,8 @@ Certificate: Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainH-ICA1-pathlen0, emailAddress = info@wolfssl.com Validity - Not Before: Oct 11 00:28:10 2019 GMT - Not After : Jul 7 00:28:10 2022 GMT + Not Before: May 7 07:39:05 2020 GMT + Not After : Feb 1 07:39:05 2023 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainH-entity, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -42,27 +42,27 @@ Certificate: X509v3 Basic Constraints: CA:FALSE Signature Algorithm: sha256WithRSAEncryption - bc:fc:a7:c3:c9:a4:57:9e:37:9d:f7:71:eb:5b:7c:a2:1a:0d: - 24:97:12:92:18:fd:0f:5e:5b:f9:27:c9:98:2c:9a:06:bd:77: - 85:63:3c:a4:ed:90:92:3a:79:41:82:c3:54:66:f6:c6:a0:d3: - ba:a3:19:93:d9:5f:54:90:fc:2b:37:d1:96:88:ba:be:e1:71: - 8c:a2:24:d7:ce:d8:7c:5e:87:9f:4f:f2:52:51:1c:82:5b:2c: - 8b:b4:5d:7e:d6:03:95:a0:e9:29:68:5e:76:18:2b:93:6f:a1: - 58:a6:f6:35:8b:37:b9:6b:82:5d:3a:8c:bc:a6:bd:18:ca:2f: - ea:0c:4d:36:7a:58:80:52:9c:b3:fa:a4:2b:0e:97:e6:0f:fc: - 41:62:6d:45:19:15:6d:3e:16:e5:bc:81:ce:c0:34:d3:b5:d4: - 0c:54:a5:62:a6:55:57:ad:e8:6f:94:58:cb:31:ff:0f:1c:13: - 63:82:91:1f:a3:68:f5:9f:9c:d9:dd:54:e0:d0:36:ea:ad:2a: - 9d:4e:66:be:c7:2f:1a:16:70:be:b4:1b:c5:2d:b2:1b:0c:87: - 64:10:4d:db:8b:79:5b:2e:10:a4:95:25:7b:be:b2:21:26:47: - e9:d2:74:c8:34:b1:e3:7b:73:8c:93:7a:82:ce:50:d4:46:34: - ab:11:71:c0 + 57:ec:60:72:12:aa:49:ec:21:09:65:0d:ee:35:93:70:be:8a: + a5:a3:5e:c6:ca:ba:45:c3:69:12:2a:22:cb:87:40:4c:6e:80: + c5:f1:72:d8:d6:a0:cc:f4:ef:5b:67:d3:00:32:c9:91:8a:5e: + 42:bd:02:31:86:73:15:7b:eb:d8:ae:11:94:d2:40:b8:20:c0: + 6c:74:53:1b:72:6e:87:d9:f7:7a:c3:42:fa:67:43:fd:d8:e2: + eb:48:41:88:e7:2f:e0:4f:30:b6:20:6f:f2:30:60:d7:a5:ad: + 22:97:13:81:9d:e1:b7:d8:9c:9c:19:6b:0d:45:21:21:3a:86: + 7a:a9:26:21:b2:90:25:2f:9a:d4:4b:1d:5d:b3:5e:05:d3:99: + 2f:09:be:e4:76:40:8c:4e:83:5b:10:45:cc:b3:b5:2f:77:7a: + 73:7b:f7:de:31:36:96:3a:f1:20:a2:03:47:ce:89:e9:56:54: + e7:43:e1:47:15:13:22:6d:22:73:c9:70:05:23:30:06:d8:9e: + dd:94:55:b0:41:79:b3:cf:63:35:46:bb:9c:d6:64:9c:f2:94: + 01:a8:08:16:94:b0:b1:e1:70:66:4b:34:fa:6f:f0:ac:e6:0b: + 46:0b:cd:7f:00:2d:92:2d:06:23:a1:8b:78:8a:42:b3:70:40: + 34:e7:13:e1 -----BEGIN CERTIFICATE----- MIIEtzCCA5+gAwIBAgIBZTANBgkqhkiG9w0BAQsFADCBoTELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNo YWluSC1JQ0ExLXBhdGhsZW4wMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTE5MTAxMTAwMjgxMFoXDTIyMDcwNzAwMjgxMFowgZoxCzAJBgNVBAYT +Y29tMB4XDTIwMDUwNzA3MzkwNVoXDTIzMDIwMTA3MzkwNVowgZoxCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRUwEwYD VQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2luZWVyaW5nMRYwFAYDVQQD DA1jaGFpbkgtZW50aXR5MR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29t @@ -77,11 +77,11 @@ VR0jBIHGMIHDgBRIgIco7+YoDwOb3zNIEKDlILNpUKGBp6SBpDCBoTELMAkGA1UE BhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTAT BgNVBAoMDHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNV BAMMFGNoYWluSC1JQ0EyLXBhdGhsZW4yMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdv -bGZzc2wuY29tggFkMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBALz8p8PJ -pFeeN533cetbfKIaDSSXEpIY/Q9eW/knyZgsmga9d4VjPKTtkJI6eUGCw1Rm9sag -07qjGZPZX1SQ/Cs30ZaIur7hcYyiJNfO2Hxeh59P8lJRHIJbLIu0XX7WA5Wg6Slo -XnYYK5NvoVim9jWLN7lrgl06jLymvRjKL+oMTTZ6WIBSnLP6pCsOl+YP/EFibUUZ -FW0+FuW8gc7ANNO11AxUpWKmVVet6G+UWMsx/w8cE2OCkR+jaPWfnNndVODQNuqt -Kp1OZr7HLxoWcL60G8UtshsMh2QQTduLeVsuEKSVJXu+siEmR+nSdMg0seN7c4yT -eoLOUNRGNKsRccA= +bGZzc2wuY29tggFkMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAFfsYHIS +qknsIQllDe41k3C+iqWjXsbKukXDaRIqIsuHQExugMXxctjWoMz071tn0wAyyZGK +XkK9AjGGcxV769iuEZTSQLggwGx0UxtybofZ93rDQvpnQ/3Y4utIQYjnL+BPMLYg +b/IwYNelrSKXE4Gd4bfYnJwZaw1FISE6hnqpJiGykCUvmtRLHV2zXgXTmS8JvuR2 +QIxOg1sQRcyztS93enN7994xNpY68SCiA0fOielWVOdD4UcVEyJtInPJcAUjMAbY +nt2UVbBBebPPYzVGu5zWZJzylAGoCBaUsLHhcGZLNPpv8KzmC0YLzX8ALZItBiOh +i3iKQrNwQDTnE+E= -----END CERTIFICATE----- diff --git a/certs/test-pathlen/chainI-ICA1-no_pathlen.pem b/certs/test-pathlen/chainI-ICA1-no_pathlen.pem index 0013267db..213a84f89 100644 --- a/certs/test-pathlen/chainI-ICA1-no_pathlen.pem +++ b/certs/test-pathlen/chainI-ICA1-no_pathlen.pem @@ -5,8 +5,8 @@ Certificate: Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainI-ICA2-no_pathlen, emailAddress = info@wolfssl.com Validity - Not Before: Oct 11 18:30:30 2019 GMT - Not After : Jul 7 18:30:30 2022 GMT + Not Before: May 7 07:39:05 2020 GMT + Not After : Feb 1 07:39:05 2023 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainI-ICA1-no_pathlen, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -44,27 +44,27 @@ Certificate: X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - b3:b8:b9:c2:44:3a:36:0a:cf:fd:da:80:8c:81:54:c1:cd:a6: - 52:a8:60:b1:f8:fd:62:01:fc:d9:85:89:15:9a:df:45:f0:68: - 3e:bb:fe:f3:94:dc:1c:69:3c:7c:47:df:04:0c:7b:2f:4f:3f: - 56:58:9a:fa:1a:4c:16:21:cf:f2:21:a5:f9:d9:49:1b:69:b4: - 4d:df:d0:c2:d7:2c:fa:0f:23:d6:45:61:12:cd:2a:5a:06:db: - 22:6f:99:7a:a0:fc:17:ba:05:bc:02:79:db:f8:cd:ec:a0:98: - 7c:7f:6b:d6:ca:5c:cd:07:89:b6:0d:3e:0b:d3:d7:7f:7c:6b: - 73:7b:b9:28:69:d2:5f:27:1c:13:60:a0:50:23:16:00:d1:cb: - 7a:1d:62:7c:a1:c2:63:1d:c9:0b:0f:d7:5c:91:af:7a:5b:93: - 7e:e5:12:36:f0:3b:fa:59:7b:a8:88:f7:bf:11:19:4b:6a:81: - 61:77:54:61:a3:73:b6:54:64:92:49:22:c9:6a:19:73:33:6d: - 01:4c:5a:9c:0a:fa:ce:a1:34:50:b1:54:de:0b:7b:ce:fe:e0: - 00:fa:8e:7f:48:36:58:ed:98:42:ce:8d:a4:a0:67:c9:88:1c: - 7f:58:df:fb:62:0f:ee:4b:7d:5a:c7:52:2f:9f:2d:13:13:0b: - 72:bd:a0:2e + 32:84:ce:04:02:b1:f9:94:40:43:d6:38:8a:1a:aa:3f:47:fa: + cf:01:0a:0e:bb:b8:79:ba:22:be:04:d7:f8:8d:b8:39:0e:3b: + 5d:d8:74:28:93:0c:64:98:78:09:c8:6f:5d:ae:a9:66:b9:80: + 21:03:f1:b8:18:6b:c1:f8:49:3a:e4:9e:10:2e:0c:54:da:df: + 10:70:9f:6d:25:20:66:32:67:1d:ec:47:02:96:f5:b6:e6:72: + 6a:5d:11:b4:39:14:2d:17:10:fe:9b:e8:3f:8b:f5:58:98:36: + b2:7a:e9:db:d8:b8:23:e3:16:12:72:86:15:3f:13:65:f1:2c: + a5:df:de:77:50:8a:cc:5c:68:d1:63:c1:57:5e:90:19:4f:77: + 9b:cc:7c:fb:cd:1e:d5:24:aa:08:42:14:ad:26:77:4a:17:4e: + e8:85:1c:68:af:c6:2f:84:78:3c:ae:54:a0:c6:44:3a:ed:d2: + d1:8a:6d:26:98:50:84:e3:13:d0:ca:54:21:4a:fb:a6:1b:65: + 4c:51:7b:ab:58:58:e6:02:ee:98:56:d7:06:b2:60:3c:d9:bc: + f4:13:5c:8d:d8:bd:99:fd:06:1e:46:47:04:dd:f3:3f:fc:0d: + ae:3b:53:61:54:01:02:c9:89:49:37:5f:76:c4:1d:f9:e9:0f: + b1:47:70:f0 -----BEGIN CERTIFICATE----- MIIE1DCCA7ygAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBozELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHzAdBgNVBAMMFmNo YWluSS1JQ0EyLW5vX3BhdGhsZW4xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNz -bC5jb20wHhcNMTkxMDExMTgzMDMwWhcNMjIwNzA3MTgzMDMwWjCBozELMAkGA1UE +bC5jb20wHhcNMjAwNTA3MDczOTA1WhcNMjMwMjAxMDczOTA1WjCBozELMAkGA1UE BhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTAT BgNVBAoMDHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHzAdBgNV BAMMFmNoYWluSS1JQ0ExLW5vX3BhdGhsZW4xHzAdBgkqhkiG9w0BCQEWEGluZm9A @@ -80,10 +80,10 @@ gaQwgaExCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQH DAdTZWF0dGxlMRUwEwYDVQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2lu ZWVyaW5nMR0wGwYDVQQDDBRjaGFpbkktSUNBMy1wYXRobGVuMjEfMB0GCSqGSIb3 DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIBZDAMBgNVHRMEBTADAQH/MAsGA1UdDwQE -AwIBBjANBgkqhkiG9w0BAQsFAAOCAQEAs7i5wkQ6NgrP/dqAjIFUwc2mUqhgsfj9 -YgH82YWJFZrfRfBoPrv+85TcHGk8fEffBAx7L08/Vlia+hpMFiHP8iGl+dlJG2m0 -Td/Qwtcs+g8j1kVhEs0qWgbbIm+ZeqD8F7oFvAJ52/jN7KCYfH9r1spczQeJtg0+ -C9PXf3xrc3u5KGnSXyccE2CgUCMWANHLeh1ifKHCYx3JCw/XXJGveluTfuUSNvA7 -+ll7qIj3vxEZS2qBYXdUYaNztlRkkkkiyWoZczNtAUxanAr6zqE0ULFU3gt7zv7g -APqOf0g2WO2YQs6NpKBnyYgcf1jf+2IP7kt9WsdSL58tExMLcr2gLg== +AwIBBjANBgkqhkiG9w0BAQsFAAOCAQEAMoTOBAKx+ZRAQ9Y4ihqqP0f6zwEKDru4 +eboivgTX+I24OQ47Xdh0KJMMZJh4CchvXa6pZrmAIQPxuBhrwfhJOuSeEC4MVNrf +EHCfbSUgZjJnHexHApb1tuZyal0RtDkULRcQ/pvoP4v1WJg2snrp29i4I+MWEnKG +FT8TZfEspd/ed1CKzFxo0WPBV16QGU93m8x8+80e1SSqCEIUrSZ3ShdO6IUcaK/G +L4R4PK5UoMZEOu3S0YptJphQhOMT0MpUIUr7phtlTFF7q1hY5gLumFbXBrJgPNm8 +9BNcjdi9mf0GHkZHBN3zP/wNrjtTYVQBAsmJSTdfdsQd+ekPsUdw8A== -----END CERTIFICATE----- diff --git a/certs/test-pathlen/chainI-ICA2-no_pathlen.pem b/certs/test-pathlen/chainI-ICA2-no_pathlen.pem index 4e39c84b6..790626144 100644 --- a/certs/test-pathlen/chainI-ICA2-no_pathlen.pem +++ b/certs/test-pathlen/chainI-ICA2-no_pathlen.pem @@ -5,8 +5,8 @@ Certificate: Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainI-ICA3-pathlen2, emailAddress = info@wolfssl.com Validity - Not Before: Oct 11 18:30:30 2019 GMT - Not After : Jul 7 18:30:30 2022 GMT + Not Before: May 7 07:39:05 2020 GMT + Not After : Feb 1 07:39:05 2023 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainI-ICA2-no_pathlen, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -44,27 +44,27 @@ Certificate: X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 8f:9b:f7:bd:1a:90:58:f0:ab:0f:1d:45:b2:29:10:66:2d:cc: - 96:d6:3c:f4:3c:a8:49:e2:cf:db:17:16:8c:e8:76:de:79:c9: - 42:10:a7:ad:b7:c3:c2:82:93:6b:19:3e:56:af:be:c8:d7:dd: - ee:87:1d:5f:1d:ad:6a:02:8d:14:22:9f:54:58:d7:d8:16:79: - 64:4d:eb:55:88:74:74:f6:59:2c:40:9f:d0:f4:a8:36:ea:c9: - 4f:9c:2b:3a:72:5f:20:2d:25:b3:b2:fb:c1:03:11:ab:57:57: - d0:55:13:b9:f5:10:09:9e:56:a2:0d:95:3c:16:3e:59:f3:71: - 60:50:06:53:45:ff:0f:e2:f8:61:5b:d2:fc:0a:65:59:dc:ee: - 6f:c6:26:c4:7d:27:69:4d:76:55:2f:07:01:3f:30:ea:17:3d: - bb:8a:f0:df:ae:c8:47:70:0e:b4:28:c9:e9:7b:8c:8a:22:a0: - ea:32:9b:f8:1e:35:a4:f0:a5:09:81:dc:9a:a4:d1:63:34:9e: - 3c:32:2f:f3:b1:f0:43:3b:f1:31:9b:8b:99:bf:c2:b4:eb:78: - 39:a3:e7:d8:2c:e6:6c:f2:8b:2f:21:83:c3:28:1b:77:f3:75: - 9b:79:f7:f0:73:a0:a2:47:af:93:32:0b:d2:88:04:14:3a:cd: - 48:7f:58:32 + 81:fe:5f:5a:4b:ed:1e:72:84:59:b4:59:83:95:2d:4d:d9:4d: + a2:07:77:4c:66:b0:f2:fb:a4:81:04:3c:98:36:b0:50:c4:40: + ca:f1:2f:02:49:05:a3:ea:7f:49:54:13:ca:0d:14:f6:5e:eb: + 59:7f:6e:2a:bc:67:5f:40:46:1d:f4:12:b4:b1:4d:31:ec:2c: + aa:fc:a5:37:b5:de:eb:68:78:18:61:40:32:66:92:fc:5c:41: + 40:a2:8b:45:fd:71:6a:fa:7e:c1:23:90:3b:40:a0:bc:42:89: + 49:4c:bf:ea:de:d7:0c:76:b5:62:74:4c:ab:a5:f9:a5:67:d6: + 14:9b:c2:ee:ab:7e:1f:24:42:7b:99:d9:24:38:bf:a7:80:43: + a0:e5:88:ef:c3:85:3b:ca:58:d5:5d:08:1e:f0:91:91:f7:6c: + db:89:02:d0:87:68:5b:d6:c7:9f:06:b3:25:1c:9c:3f:51:28: + 07:d6:da:8e:c0:0b:13:f6:8e:73:64:38:73:ab:22:c0:0f:51: + ff:af:29:3b:e8:09:68:83:21:a3:1e:47:98:92:b0:b0:5b:35: + cb:27:70:78:cf:a4:19:df:7a:61:39:c4:2e:d0:d3:97:c0:4a: + 58:74:89:4a:11:31:62:2d:c4:e9:d1:2a:82:b8:d6:98:39:26: + 6a:eb:03:37 -----BEGIN CERTIFICATE----- MIIExDCCA6ygAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBoTELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNo YWluSS1JQ0EzLXBhdGhsZW4yMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTE5MTAxMTE4MzAzMFoXDTIyMDcwNzE4MzAzMFowgaMxCzAJBgNVBAYT +Y29tMB4XDTIwMDUwNzA3MzkwNVoXDTIzMDIwMTA3MzkwNVowgaMxCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRUwEwYD VQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2luZWVyaW5nMR8wHQYDVQQD DBZjaGFpbkktSUNBMi1ub19wYXRobGVuMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdv @@ -80,10 +80,10 @@ gZQxCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3pl bWFuMREwDwYDVQQKDAhTYXd0b290aDETMBEGA1UECwwKQ29uc3VsdGluZzEYMBYG A1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZz c2wuY29tggFkMAwGA1UdEwQFMAMBAf8wCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEB -CwUAA4IBAQCPm/e9GpBY8KsPHUWyKRBmLcyW1jz0PKhJ4s/bFxaM6HbeeclCEKet -t8PCgpNrGT5Wr77I193uhx1fHa1qAo0UIp9UWNfYFnlkTetViHR09lksQJ/Q9Kg2 -6slPnCs6cl8gLSWzsvvBAxGrV1fQVRO59RAJnlaiDZU8Fj5Z83FgUAZTRf8P4vhh -W9L8CmVZ3O5vxibEfSdpTXZVLwcBPzDqFz27ivDfrshHcA60KMnpe4yKIqDqMpv4 -HjWk8KUJgdyapNFjNJ48Mi/zsfBDO/Exm4uZv8K063g5o+fYLOZs8osvIYPDKBt3 -83Wbeffwc6CiR6+TMgvSiAQUOs1If1gy +CwUAA4IBAQCB/l9aS+0ecoRZtFmDlS1N2U2iB3dMZrDy+6SBBDyYNrBQxEDK8S8C +SQWj6n9JVBPKDRT2XutZf24qvGdfQEYd9BK0sU0x7Cyq/KU3td7raHgYYUAyZpL8 +XEFAootF/XFq+n7BI5A7QKC8QolJTL/q3tcMdrVidEyrpfmlZ9YUm8Luq34fJEJ7 +mdkkOL+ngEOg5Yjvw4U7yljVXQge8JGR92zbiQLQh2hb1sefBrMlHJw/USgH1tqO +wAsT9o5zZDhzqyLAD1H/ryk76AlogyGjHkeYkrCwWzXLJ3B4z6QZ33phOcQu0NOX +wEpYdIlKETFiLcTp0SqCuNaYOSZq6wM3 -----END CERTIFICATE----- diff --git a/certs/test-pathlen/chainI-ICA3-pathlen2.pem b/certs/test-pathlen/chainI-ICA3-pathlen2.pem index 44e10332d..87f9f9869 100644 --- a/certs/test-pathlen/chainI-ICA3-pathlen2.pem +++ b/certs/test-pathlen/chainI-ICA3-pathlen2.pem @@ -5,8 +5,8 @@ Certificate: Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Oct 11 18:30:30 2019 GMT - Not After : Jul 7 18:30:30 2022 GMT + Not Before: May 7 07:39:05 2020 GMT + Not After : Feb 1 07:39:05 2023 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainI-ICA3-pathlen2, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -37,34 +37,34 @@ Certificate: X509v3 Authority Key Identifier: keyid:27:8E:67:11:74:C3:26:1D:3F:ED:33:63:B3:A4:D8:1D:30:E5:E8:D5 DirName:/C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:86:FF:F5:8E:10:DE:B8:FB + serial:3F:32:13:52:92:C6:DF:4A:D5:42:05:6C:B0:B2:2E:46:C2:F8:B8:67 X509v3 Basic Constraints: CA:TRUE, pathlen:2 X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 5a:8e:b7:fa:c9:b8:f9:a7:1e:fd:16:5b:75:4d:5e:b6:f2:6e: - c0:48:f3:7f:3e:61:59:25:64:8e:6a:e5:19:fb:03:20:93:de: - 0c:d9:88:68:e6:c3:9c:ad:b8:b1:08:a4:74:ef:e7:5c:1e:ea: - 3b:9f:0a:64:40:74:ff:d8:9d:14:38:d8:c7:68:f4:8c:b2:76: - cb:77:40:c4:55:23:b6:42:4c:82:16:47:a4:97:31:12:f0:ac: - e8:b9:aa:72:d8:e7:e5:5f:6c:92:0e:07:d7:9f:df:4b:53:85: - e5:d3:8b:74:ad:b3:58:09:d0:cf:2f:66:a3:28:8c:86:3a:5a: - c8:39:f5:03:35:42:72:8b:b8:fc:28:51:37:b0:31:f6:29:c4: - ab:f3:4f:ff:42:de:48:6d:bd:94:cd:3c:5a:bf:f3:a5:d2:13: - 2c:7b:81:d8:0d:2f:f0:49:bf:c2:07:25:a5:2a:ae:3c:9f:4a: - 3e:74:03:70:36:a9:67:68:1a:e8:72:18:2d:79:7e:65:2c:95: - 3a:5c:9d:46:50:d0:9a:fd:c1:7a:6d:cd:d6:6c:83:f2:cb:aa: - 19:c2:03:7c:2e:95:30:40:88:25:47:3c:d2:7a:ad:ac:a1:12: - 25:42:17:d0:17:00:53:4b:32:ae:70:a4:08:7b:9b:fc:bc:93: - 08:e6:b1:7a + 46:4a:3b:ae:67:9d:d9:e6:c1:8c:0c:01:78:e7:19:91:19:8f: + 01:46:b1:2c:a4:6d:2c:17:9f:6e:ef:c2:1a:dc:fd:de:d7:8d: + 23:10:57:7b:69:03:fe:5a:48:44:80:81:13:a1:79:3e:28:ff: + 9b:f1:3a:c4:87:83:b1:cb:8e:52:b5:50:61:98:74:11:3a:39: + 73:20:a4:3e:c0:51:94:0a:a7:f5:c8:e2:60:59:5c:13:ed:fb: + 0c:3e:5e:f2:bc:72:5f:10:4a:b5:6b:02:7c:45:5c:1c:5d:58: + a0:5a:30:5a:f2:1f:4a:07:6a:f9:42:83:7b:72:c5:a1:84:ff: + 8a:32:11:bf:fd:8a:36:bc:39:ba:c2:f3:d1:cf:50:d1:5a:21: + 94:55:10:15:0d:09:fd:51:1b:04:e9:f6:58:54:6b:e8:7f:37: + 4f:56:10:36:35:e8:af:5f:04:e2:a7:f1:7f:67:a9:a0:91:e4: + a3:e8:9f:5e:91:03:8b:79:b1:0c:aa:7b:04:19:6d:11:7d:ab: + 1e:27:41:f0:7b:13:43:29:a0:58:d6:72:68:d8:96:72:08:ab: + e6:91:99:e5:a5:f7:41:ef:c1:5d:a5:44:7e:a4:12:92:67:3d: + 5f:f3:a8:18:ef:fa:ec:23:d6:ac:7f:6c:c0:20:ca:33:71:c8: + 4e:c1:2b:2e -----BEGIN CERTIFICATE----- -MIIEwTCCA6mgAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx +MIIEzDCCA7SgAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx EDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNh d3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cud29sZnNz -bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMTkxMDEx -MTgzMDMwWhcNMjIwNzA3MTgzMDMwWjCBoTELMAkGA1UEBhMCVVMxEzARBgNVBAgM +bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjAwNTA3 +MDczOTA1WhcNMjMwMjAxMDczOTA1WjCBoTELMAkGA1UEBhMCVVMxEzARBgNVBAgM Cldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoMDHdvbGZTU0wg SW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNoYWluSS1JQ0Ez LXBhdGhsZW4yMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMIIBIjAN @@ -74,16 +74,16 @@ dTmJcCqcAOAubHx0Jxg0/SmYQ4PW4VGzE0EcvCnciy+TCJWLkCJL5Jj11nAqm4tk 5kkGYqQjCGBol4mpssCUjk85HCU7D+TFHX2JiV7GAmlo/BNVtYBrd/dZVwscfsbt RsZw+zShKByCscKrpsHwExt9C7waOSM85x3uyO4vaV+hMT8aL5hdU9dCk9tJrNZ6 Ei6dDcmw70DRpAJeUuj71JIHmLF22RYP5Ive3Ihl4P1SHYvi4+0IN9AR9wIDAQAB -o4IBDTCCAQkwHQYDVR0OBBYEFO43pvJA0O/9IsejtGxXR0C5mfmNMIHJBgNVHSME -gcEwgb6AFCeOZxF0wyYdP+0zY7Ok2B0w5ejVoYGapIGXMIGUMQswCQYDVQQGEwJV +o4IBGDCCARQwHQYDVR0OBBYEFO43pvJA0O/9IsejtGxXR0C5mfmNMIHUBgNVHSME +gcwwgcmAFCeOZxF0wyYdP+0zY7Ok2B0w5ejVoYGapIGXMIGUMQswCQYDVQQGEwJV UzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjERMA8GA1UECgwI U2F3dG9vdGgxEzARBgNVBAsMCkNvbnN1bHRpbmcxGDAWBgNVBAMMD3d3dy53b2xm -c3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIJAIb/9Y4Q -3rj7MA8GA1UdEwQIMAYBAf8CAQIwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBCwUA -A4IBAQBajrf6ybj5px79Flt1TV628m7ASPN/PmFZJWSOauUZ+wMgk94M2Yho5sOc -rbixCKR07+dcHuo7nwpkQHT/2J0UONjHaPSMsnbLd0DEVSO2QkyCFkeklzES8Kzo -uapy2OflX2ySDgfXn99LU4Xl04t0rbNYCdDPL2ajKIyGOlrIOfUDNUJyi7j8KFE3 -sDH2KcSr80//Qt5Ibb2UzTxav/Ol0hMse4HYDS/wSb/CByWlKq48n0o+dANwNqln -aBrochgteX5lLJU6XJ1GUNCa/cF6bc3WbIPyy6oZwgN8LpUwQIglRzzSeq2soRIl -QhfQFwBTSzKucKQIe5v8vJMI5rF6 +c3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIUPzITUpLG +30rVQgVssLIuRsL4uGcwDwYDVR0TBAgwBgEB/wIBAjALBgNVHQ8EBAMCAQYwDQYJ +KoZIhvcNAQELBQADggEBAEZKO65nndnmwYwMAXjnGZEZjwFGsSykbSwXn27vwhrc +/d7XjSMQV3tpA/5aSESAgROheT4o/5vxOsSHg7HLjlK1UGGYdBE6OXMgpD7AUZQK +p/XI4mBZXBPt+ww+XvK8cl8QSrVrAnxFXBxdWKBaMFryH0oHavlCg3tyxaGE/4oy +Eb/9ija8ObrC89HPUNFaIZRVEBUNCf1RGwTp9lhUa+h/N09WEDY16K9fBOKn8X9n +qaCR5KPon16RA4t5sQyqewQZbRF9qx4nQfB7E0MpoFjWcmjYlnIIq+aRmeWl90Hv +wV2lRH6kEpJnPV/zqBjv+uwj1qx/bMAgyjNxyE7BKy4= -----END CERTIFICATE----- diff --git a/certs/test-pathlen/chainI-assembled.pem b/certs/test-pathlen/chainI-assembled.pem index baf1cdcf0..cca77e6fc 100644 --- a/certs/test-pathlen/chainI-assembled.pem +++ b/certs/test-pathlen/chainI-assembled.pem @@ -5,8 +5,8 @@ Certificate: Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainI-ICA1-no_pathlen, emailAddress = info@wolfssl.com Validity - Not Before: Oct 11 18:30:30 2019 GMT - Not After : Jul 7 18:30:30 2022 GMT + Not Before: May 7 07:39:05 2020 GMT + Not After : Feb 1 07:39:05 2023 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainI-entity, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -42,27 +42,27 @@ Certificate: X509v3 Basic Constraints: CA:FALSE Signature Algorithm: sha256WithRSAEncryption - 78:f3:ac:4b:db:c6:63:c3:f5:67:97:b8:99:f4:72:6f:b2:07: - 3b:99:ce:85:e7:5c:59:c1:80:bf:06:92:a8:34:be:1b:74:d1: - 61:b6:75:07:18:0e:2e:77:7f:77:c7:e9:5d:cc:1e:7b:b5:04: - 95:5b:99:a1:15:2e:b6:2b:67:13:09:0f:b7:6e:62:04:dd:01: - 27:fd:18:f3:d9:b2:d7:8f:6e:bb:b3:1d:57:76:91:42:dd:78: - 77:22:b3:ed:79:10:63:94:40:c5:88:09:bb:bf:fd:fe:6e:60: - 23:53:30:8e:11:e2:b7:3d:39:24:96:f2:86:cc:59:eb:83:07: - ad:7a:2e:85:63:be:70:15:92:f8:f2:2b:f1:6f:5f:c2:4d:3a: - 7d:c6:b9:9d:c4:82:6a:fe:b2:7e:ec:5d:eb:b3:ba:82:09:04: - f9:7e:47:37:a9:8a:e2:2a:4f:30:7d:b7:dd:1f:c2:f4:db:61: - f3:b1:81:5d:10:8c:41:22:76:93:5b:a3:b9:b2:69:85:88:3a: - eb:ae:42:0f:16:e7:2f:f3:cd:03:4c:08:65:90:a9:4f:dd:89: - 23:d7:56:bd:e9:d7:cf:9f:bf:0f:a2:11:5b:e1:89:2c:d4:76: - 16:1f:83:5c:e9:8c:f6:93:7c:b5:f2:f1:ef:d3:07:35:2f:93: - 33:16:9c:63 + b7:2d:06:f7:a6:0d:11:c2:78:32:61:db:d3:82:5d:89:a8:00: + 0c:be:56:77:16:05:2c:96:39:77:31:79:af:17:0a:ff:d8:cf: + 73:29:c6:e8:92:b4:42:e5:89:51:92:d7:01:75:18:88:ee:71: + 24:37:9a:d7:85:fe:38:46:33:08:f8:35:60:6a:92:b7:4a:b3: + fb:53:6b:21:10:fb:6b:de:e3:98:cf:e3:26:5f:7d:31:d0:52: + 58:32:ed:1c:08:5e:9c:f5:45:be:9e:6d:17:8d:f4:0c:3e:91: + 9c:5f:7b:ad:9a:69:e5:43:b1:73:65:c9:10:dd:a0:6e:c8:49: + b6:e7:67:5a:ca:6d:33:a9:56:bb:45:32:b8:8a:44:7e:ba:f1: + e8:67:3e:3d:cf:2f:a4:79:ae:f5:16:be:68:a5:e5:f9:0a:c3: + d9:5a:f1:1c:aa:c0:28:46:b2:e5:51:d1:d5:70:91:b5:41:23: + 73:80:01:df:c4:9b:bc:52:95:a9:28:3f:de:87:ed:40:a8:ac: + e2:63:40:a0:a1:78:3f:0f:60:e0:64:33:57:3c:64:a7:ed:32: + d7:73:14:82:99:c4:2f:e4:47:7a:1c:75:dd:45:d7:9a:c3:85: + a0:1d:41:77:29:62:03:f9:e7:aa:03:31:ed:ee:dd:aa:43:34: + 9c:d8:b0:6b -----BEGIN CERTIFICATE----- MIIEvDCCA6SgAwIBAgIBZTANBgkqhkiG9w0BAQsFADCBozELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHzAdBgNVBAMMFmNo YWluSS1JQ0ExLW5vX3BhdGhsZW4xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNz -bC5jb20wHhcNMTkxMDExMTgzMDMwWhcNMjIwNzA3MTgzMDMwWjCBmjELMAkGA1UE +bC5jb20wHhcNMjAwNTA3MDczOTA1WhcNMjMwMjAxMDczOTA1WjCBmjELMAkGA1UE BhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTAT BgNVBAoMDHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxFjAUBgNV BAMMDWNoYWluSS1lbnRpdHkxHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5j @@ -78,12 +78,12 @@ A1UEBhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUx FTATBgNVBAoMDHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHzAd BgNVBAMMFmNoYWluSS1JQ0EyLW5vX3BhdGhsZW4xHzAdBgkqhkiG9w0BCQEWEGlu Zm9Ad29sZnNzbC5jb22CAWQwCQYDVR0TBAIwADANBgkqhkiG9w0BAQsFAAOCAQEA -ePOsS9vGY8P1Z5e4mfRyb7IHO5nOhedcWcGAvwaSqDS+G3TRYbZ1BxgOLnd/d8fp -Xcwee7UElVuZoRUutitnEwkPt25iBN0BJ/0Y89my149uu7MdV3aRQt14dyKz7XkQ -Y5RAxYgJu7/9/m5gI1MwjhHitz05JJbyhsxZ64MHrXouhWO+cBWS+PIr8W9fwk06 -fca5ncSCav6yfuxd67O6ggkE+X5HN6mK4ipPMH233R/C9Nth87GBXRCMQSJ2k1uj -ubJphYg6665CDxbnL/PNA0wIZZCpT92JI9dWvenXz5+/D6IRW+GJLNR2Fh+DXOmM -9pN8tfLx79MHNS+TMxacYw== +ty0G96YNEcJ4MmHb04JdiagADL5WdxYFLJY5dzF5rxcK/9jPcynG6JK0QuWJUZLX +AXUYiO5xJDea14X+OEYzCPg1YGqSt0qz+1NrIRD7a97jmM/jJl99MdBSWDLtHAhe +nPVFvp5tF430DD6RnF97rZpp5UOxc2XJEN2gbshJtudnWsptM6lWu0UyuIpEfrrx +6Gc+Pc8vpHmu9Ra+aKXl+QrD2VrxHKrAKEay5VHR1XCRtUEjc4AB38SbvFKVqSg/ +3oftQKis4mNAoKF4Pw9g4GQzVzxkp+0y13MUgpnEL+RHehx13UXXmsOFoB1Bdyli +A/nnqgMx7e7dqkM0nNiwaw== -----END CERTIFICATE----- Certificate: Data: @@ -92,8 +92,8 @@ Certificate: Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainI-ICA2-no_pathlen, emailAddress = info@wolfssl.com Validity - Not Before: Oct 11 18:30:30 2019 GMT - Not After : Jul 7 18:30:30 2022 GMT + Not Before: May 7 07:39:05 2020 GMT + Not After : Feb 1 07:39:05 2023 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainI-ICA1-no_pathlen, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -131,27 +131,27 @@ Certificate: X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - b3:b8:b9:c2:44:3a:36:0a:cf:fd:da:80:8c:81:54:c1:cd:a6: - 52:a8:60:b1:f8:fd:62:01:fc:d9:85:89:15:9a:df:45:f0:68: - 3e:bb:fe:f3:94:dc:1c:69:3c:7c:47:df:04:0c:7b:2f:4f:3f: - 56:58:9a:fa:1a:4c:16:21:cf:f2:21:a5:f9:d9:49:1b:69:b4: - 4d:df:d0:c2:d7:2c:fa:0f:23:d6:45:61:12:cd:2a:5a:06:db: - 22:6f:99:7a:a0:fc:17:ba:05:bc:02:79:db:f8:cd:ec:a0:98: - 7c:7f:6b:d6:ca:5c:cd:07:89:b6:0d:3e:0b:d3:d7:7f:7c:6b: - 73:7b:b9:28:69:d2:5f:27:1c:13:60:a0:50:23:16:00:d1:cb: - 7a:1d:62:7c:a1:c2:63:1d:c9:0b:0f:d7:5c:91:af:7a:5b:93: - 7e:e5:12:36:f0:3b:fa:59:7b:a8:88:f7:bf:11:19:4b:6a:81: - 61:77:54:61:a3:73:b6:54:64:92:49:22:c9:6a:19:73:33:6d: - 01:4c:5a:9c:0a:fa:ce:a1:34:50:b1:54:de:0b:7b:ce:fe:e0: - 00:fa:8e:7f:48:36:58:ed:98:42:ce:8d:a4:a0:67:c9:88:1c: - 7f:58:df:fb:62:0f:ee:4b:7d:5a:c7:52:2f:9f:2d:13:13:0b: - 72:bd:a0:2e + 32:84:ce:04:02:b1:f9:94:40:43:d6:38:8a:1a:aa:3f:47:fa: + cf:01:0a:0e:bb:b8:79:ba:22:be:04:d7:f8:8d:b8:39:0e:3b: + 5d:d8:74:28:93:0c:64:98:78:09:c8:6f:5d:ae:a9:66:b9:80: + 21:03:f1:b8:18:6b:c1:f8:49:3a:e4:9e:10:2e:0c:54:da:df: + 10:70:9f:6d:25:20:66:32:67:1d:ec:47:02:96:f5:b6:e6:72: + 6a:5d:11:b4:39:14:2d:17:10:fe:9b:e8:3f:8b:f5:58:98:36: + b2:7a:e9:db:d8:b8:23:e3:16:12:72:86:15:3f:13:65:f1:2c: + a5:df:de:77:50:8a:cc:5c:68:d1:63:c1:57:5e:90:19:4f:77: + 9b:cc:7c:fb:cd:1e:d5:24:aa:08:42:14:ad:26:77:4a:17:4e: + e8:85:1c:68:af:c6:2f:84:78:3c:ae:54:a0:c6:44:3a:ed:d2: + d1:8a:6d:26:98:50:84:e3:13:d0:ca:54:21:4a:fb:a6:1b:65: + 4c:51:7b:ab:58:58:e6:02:ee:98:56:d7:06:b2:60:3c:d9:bc: + f4:13:5c:8d:d8:bd:99:fd:06:1e:46:47:04:dd:f3:3f:fc:0d: + ae:3b:53:61:54:01:02:c9:89:49:37:5f:76:c4:1d:f9:e9:0f: + b1:47:70:f0 -----BEGIN CERTIFICATE----- MIIE1DCCA7ygAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBozELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHzAdBgNVBAMMFmNo YWluSS1JQ0EyLW5vX3BhdGhsZW4xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNz -bC5jb20wHhcNMTkxMDExMTgzMDMwWhcNMjIwNzA3MTgzMDMwWjCBozELMAkGA1UE +bC5jb20wHhcNMjAwNTA3MDczOTA1WhcNMjMwMjAxMDczOTA1WjCBozELMAkGA1UE BhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTAT BgNVBAoMDHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHzAdBgNV BAMMFmNoYWluSS1JQ0ExLW5vX3BhdGhsZW4xHzAdBgkqhkiG9w0BCQEWEGluZm9A @@ -167,12 +167,12 @@ gaQwgaExCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQH DAdTZWF0dGxlMRUwEwYDVQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2lu ZWVyaW5nMR0wGwYDVQQDDBRjaGFpbkktSUNBMy1wYXRobGVuMjEfMB0GCSqGSIb3 DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIBZDAMBgNVHRMEBTADAQH/MAsGA1UdDwQE -AwIBBjANBgkqhkiG9w0BAQsFAAOCAQEAs7i5wkQ6NgrP/dqAjIFUwc2mUqhgsfj9 -YgH82YWJFZrfRfBoPrv+85TcHGk8fEffBAx7L08/Vlia+hpMFiHP8iGl+dlJG2m0 -Td/Qwtcs+g8j1kVhEs0qWgbbIm+ZeqD8F7oFvAJ52/jN7KCYfH9r1spczQeJtg0+ -C9PXf3xrc3u5KGnSXyccE2CgUCMWANHLeh1ifKHCYx3JCw/XXJGveluTfuUSNvA7 -+ll7qIj3vxEZS2qBYXdUYaNztlRkkkkiyWoZczNtAUxanAr6zqE0ULFU3gt7zv7g -APqOf0g2WO2YQs6NpKBnyYgcf1jf+2IP7kt9WsdSL58tExMLcr2gLg== +AwIBBjANBgkqhkiG9w0BAQsFAAOCAQEAMoTOBAKx+ZRAQ9Y4ihqqP0f6zwEKDru4 +eboivgTX+I24OQ47Xdh0KJMMZJh4CchvXa6pZrmAIQPxuBhrwfhJOuSeEC4MVNrf +EHCfbSUgZjJnHexHApb1tuZyal0RtDkULRcQ/pvoP4v1WJg2snrp29i4I+MWEnKG +FT8TZfEspd/ed1CKzFxo0WPBV16QGU93m8x8+80e1SSqCEIUrSZ3ShdO6IUcaK/G +L4R4PK5UoMZEOu3S0YptJphQhOMT0MpUIUr7phtlTFF7q1hY5gLumFbXBrJgPNm8 +9BNcjdi9mf0GHkZHBN3zP/wNrjtTYVQBAsmJSTdfdsQd+ekPsUdw8A== -----END CERTIFICATE----- Certificate: Data: @@ -181,8 +181,8 @@ Certificate: Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainI-ICA3-pathlen2, emailAddress = info@wolfssl.com Validity - Not Before: Oct 11 18:30:30 2019 GMT - Not After : Jul 7 18:30:30 2022 GMT + Not Before: May 7 07:39:05 2020 GMT + Not After : Feb 1 07:39:05 2023 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainI-ICA2-no_pathlen, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -220,27 +220,27 @@ Certificate: X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 8f:9b:f7:bd:1a:90:58:f0:ab:0f:1d:45:b2:29:10:66:2d:cc: - 96:d6:3c:f4:3c:a8:49:e2:cf:db:17:16:8c:e8:76:de:79:c9: - 42:10:a7:ad:b7:c3:c2:82:93:6b:19:3e:56:af:be:c8:d7:dd: - ee:87:1d:5f:1d:ad:6a:02:8d:14:22:9f:54:58:d7:d8:16:79: - 64:4d:eb:55:88:74:74:f6:59:2c:40:9f:d0:f4:a8:36:ea:c9: - 4f:9c:2b:3a:72:5f:20:2d:25:b3:b2:fb:c1:03:11:ab:57:57: - d0:55:13:b9:f5:10:09:9e:56:a2:0d:95:3c:16:3e:59:f3:71: - 60:50:06:53:45:ff:0f:e2:f8:61:5b:d2:fc:0a:65:59:dc:ee: - 6f:c6:26:c4:7d:27:69:4d:76:55:2f:07:01:3f:30:ea:17:3d: - bb:8a:f0:df:ae:c8:47:70:0e:b4:28:c9:e9:7b:8c:8a:22:a0: - ea:32:9b:f8:1e:35:a4:f0:a5:09:81:dc:9a:a4:d1:63:34:9e: - 3c:32:2f:f3:b1:f0:43:3b:f1:31:9b:8b:99:bf:c2:b4:eb:78: - 39:a3:e7:d8:2c:e6:6c:f2:8b:2f:21:83:c3:28:1b:77:f3:75: - 9b:79:f7:f0:73:a0:a2:47:af:93:32:0b:d2:88:04:14:3a:cd: - 48:7f:58:32 + 81:fe:5f:5a:4b:ed:1e:72:84:59:b4:59:83:95:2d:4d:d9:4d: + a2:07:77:4c:66:b0:f2:fb:a4:81:04:3c:98:36:b0:50:c4:40: + ca:f1:2f:02:49:05:a3:ea:7f:49:54:13:ca:0d:14:f6:5e:eb: + 59:7f:6e:2a:bc:67:5f:40:46:1d:f4:12:b4:b1:4d:31:ec:2c: + aa:fc:a5:37:b5:de:eb:68:78:18:61:40:32:66:92:fc:5c:41: + 40:a2:8b:45:fd:71:6a:fa:7e:c1:23:90:3b:40:a0:bc:42:89: + 49:4c:bf:ea:de:d7:0c:76:b5:62:74:4c:ab:a5:f9:a5:67:d6: + 14:9b:c2:ee:ab:7e:1f:24:42:7b:99:d9:24:38:bf:a7:80:43: + a0:e5:88:ef:c3:85:3b:ca:58:d5:5d:08:1e:f0:91:91:f7:6c: + db:89:02:d0:87:68:5b:d6:c7:9f:06:b3:25:1c:9c:3f:51:28: + 07:d6:da:8e:c0:0b:13:f6:8e:73:64:38:73:ab:22:c0:0f:51: + ff:af:29:3b:e8:09:68:83:21:a3:1e:47:98:92:b0:b0:5b:35: + cb:27:70:78:cf:a4:19:df:7a:61:39:c4:2e:d0:d3:97:c0:4a: + 58:74:89:4a:11:31:62:2d:c4:e9:d1:2a:82:b8:d6:98:39:26: + 6a:eb:03:37 -----BEGIN CERTIFICATE----- MIIExDCCA6ygAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBoTELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNo YWluSS1JQ0EzLXBhdGhsZW4yMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTE5MTAxMTE4MzAzMFoXDTIyMDcwNzE4MzAzMFowgaMxCzAJBgNVBAYT +Y29tMB4XDTIwMDUwNzA3MzkwNVoXDTIzMDIwMTA3MzkwNVowgaMxCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRUwEwYD VQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2luZWVyaW5nMR8wHQYDVQQD DBZjaGFpbkktSUNBMi1ub19wYXRobGVuMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdv @@ -256,12 +256,12 @@ gZQxCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3pl bWFuMREwDwYDVQQKDAhTYXd0b290aDETMBEGA1UECwwKQ29uc3VsdGluZzEYMBYG A1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZz c2wuY29tggFkMAwGA1UdEwQFMAMBAf8wCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEB -CwUAA4IBAQCPm/e9GpBY8KsPHUWyKRBmLcyW1jz0PKhJ4s/bFxaM6HbeeclCEKet -t8PCgpNrGT5Wr77I193uhx1fHa1qAo0UIp9UWNfYFnlkTetViHR09lksQJ/Q9Kg2 -6slPnCs6cl8gLSWzsvvBAxGrV1fQVRO59RAJnlaiDZU8Fj5Z83FgUAZTRf8P4vhh -W9L8CmVZ3O5vxibEfSdpTXZVLwcBPzDqFz27ivDfrshHcA60KMnpe4yKIqDqMpv4 -HjWk8KUJgdyapNFjNJ48Mi/zsfBDO/Exm4uZv8K063g5o+fYLOZs8osvIYPDKBt3 -83Wbeffwc6CiR6+TMgvSiAQUOs1If1gy +CwUAA4IBAQCB/l9aS+0ecoRZtFmDlS1N2U2iB3dMZrDy+6SBBDyYNrBQxEDK8S8C +SQWj6n9JVBPKDRT2XutZf24qvGdfQEYd9BK0sU0x7Cyq/KU3td7raHgYYUAyZpL8 +XEFAootF/XFq+n7BI5A7QKC8QolJTL/q3tcMdrVidEyrpfmlZ9YUm8Luq34fJEJ7 +mdkkOL+ngEOg5Yjvw4U7yljVXQge8JGR92zbiQLQh2hb1sefBrMlHJw/USgH1tqO +wAsT9o5zZDhzqyLAD1H/ryk76AlogyGjHkeYkrCwWzXLJ3B4z6QZ33phOcQu0NOX +wEpYdIlKETFiLcTp0SqCuNaYOSZq6wM3 -----END CERTIFICATE----- Certificate: Data: @@ -270,8 +270,8 @@ Certificate: Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Oct 11 18:30:30 2019 GMT - Not After : Jul 7 18:30:30 2022 GMT + Not Before: May 7 07:39:05 2020 GMT + Not After : Feb 1 07:39:05 2023 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainI-ICA3-pathlen2, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -302,34 +302,34 @@ Certificate: X509v3 Authority Key Identifier: keyid:27:8E:67:11:74:C3:26:1D:3F:ED:33:63:B3:A4:D8:1D:30:E5:E8:D5 DirName:/C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:86:FF:F5:8E:10:DE:B8:FB + serial:3F:32:13:52:92:C6:DF:4A:D5:42:05:6C:B0:B2:2E:46:C2:F8:B8:67 X509v3 Basic Constraints: CA:TRUE, pathlen:2 X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 5a:8e:b7:fa:c9:b8:f9:a7:1e:fd:16:5b:75:4d:5e:b6:f2:6e: - c0:48:f3:7f:3e:61:59:25:64:8e:6a:e5:19:fb:03:20:93:de: - 0c:d9:88:68:e6:c3:9c:ad:b8:b1:08:a4:74:ef:e7:5c:1e:ea: - 3b:9f:0a:64:40:74:ff:d8:9d:14:38:d8:c7:68:f4:8c:b2:76: - cb:77:40:c4:55:23:b6:42:4c:82:16:47:a4:97:31:12:f0:ac: - e8:b9:aa:72:d8:e7:e5:5f:6c:92:0e:07:d7:9f:df:4b:53:85: - e5:d3:8b:74:ad:b3:58:09:d0:cf:2f:66:a3:28:8c:86:3a:5a: - c8:39:f5:03:35:42:72:8b:b8:fc:28:51:37:b0:31:f6:29:c4: - ab:f3:4f:ff:42:de:48:6d:bd:94:cd:3c:5a:bf:f3:a5:d2:13: - 2c:7b:81:d8:0d:2f:f0:49:bf:c2:07:25:a5:2a:ae:3c:9f:4a: - 3e:74:03:70:36:a9:67:68:1a:e8:72:18:2d:79:7e:65:2c:95: - 3a:5c:9d:46:50:d0:9a:fd:c1:7a:6d:cd:d6:6c:83:f2:cb:aa: - 19:c2:03:7c:2e:95:30:40:88:25:47:3c:d2:7a:ad:ac:a1:12: - 25:42:17:d0:17:00:53:4b:32:ae:70:a4:08:7b:9b:fc:bc:93: - 08:e6:b1:7a + 46:4a:3b:ae:67:9d:d9:e6:c1:8c:0c:01:78:e7:19:91:19:8f: + 01:46:b1:2c:a4:6d:2c:17:9f:6e:ef:c2:1a:dc:fd:de:d7:8d: + 23:10:57:7b:69:03:fe:5a:48:44:80:81:13:a1:79:3e:28:ff: + 9b:f1:3a:c4:87:83:b1:cb:8e:52:b5:50:61:98:74:11:3a:39: + 73:20:a4:3e:c0:51:94:0a:a7:f5:c8:e2:60:59:5c:13:ed:fb: + 0c:3e:5e:f2:bc:72:5f:10:4a:b5:6b:02:7c:45:5c:1c:5d:58: + a0:5a:30:5a:f2:1f:4a:07:6a:f9:42:83:7b:72:c5:a1:84:ff: + 8a:32:11:bf:fd:8a:36:bc:39:ba:c2:f3:d1:cf:50:d1:5a:21: + 94:55:10:15:0d:09:fd:51:1b:04:e9:f6:58:54:6b:e8:7f:37: + 4f:56:10:36:35:e8:af:5f:04:e2:a7:f1:7f:67:a9:a0:91:e4: + a3:e8:9f:5e:91:03:8b:79:b1:0c:aa:7b:04:19:6d:11:7d:ab: + 1e:27:41:f0:7b:13:43:29:a0:58:d6:72:68:d8:96:72:08:ab: + e6:91:99:e5:a5:f7:41:ef:c1:5d:a5:44:7e:a4:12:92:67:3d: + 5f:f3:a8:18:ef:fa:ec:23:d6:ac:7f:6c:c0:20:ca:33:71:c8: + 4e:c1:2b:2e -----BEGIN CERTIFICATE----- -MIIEwTCCA6mgAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx +MIIEzDCCA7SgAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx EDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNh d3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cud29sZnNz -bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMTkxMDEx -MTgzMDMwWhcNMjIwNzA3MTgzMDMwWjCBoTELMAkGA1UEBhMCVVMxEzARBgNVBAgM +bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjAwNTA3 +MDczOTA1WhcNMjMwMjAxMDczOTA1WjCBoTELMAkGA1UEBhMCVVMxEzARBgNVBAgM Cldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoMDHdvbGZTU0wg SW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNoYWluSS1JQ0Ez LXBhdGhsZW4yMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMIIBIjAN @@ -339,16 +339,16 @@ dTmJcCqcAOAubHx0Jxg0/SmYQ4PW4VGzE0EcvCnciy+TCJWLkCJL5Jj11nAqm4tk 5kkGYqQjCGBol4mpssCUjk85HCU7D+TFHX2JiV7GAmlo/BNVtYBrd/dZVwscfsbt RsZw+zShKByCscKrpsHwExt9C7waOSM85x3uyO4vaV+hMT8aL5hdU9dCk9tJrNZ6 Ei6dDcmw70DRpAJeUuj71JIHmLF22RYP5Ive3Ihl4P1SHYvi4+0IN9AR9wIDAQAB -o4IBDTCCAQkwHQYDVR0OBBYEFO43pvJA0O/9IsejtGxXR0C5mfmNMIHJBgNVHSME -gcEwgb6AFCeOZxF0wyYdP+0zY7Ok2B0w5ejVoYGapIGXMIGUMQswCQYDVQQGEwJV +o4IBGDCCARQwHQYDVR0OBBYEFO43pvJA0O/9IsejtGxXR0C5mfmNMIHUBgNVHSME +gcwwgcmAFCeOZxF0wyYdP+0zY7Ok2B0w5ejVoYGapIGXMIGUMQswCQYDVQQGEwJV UzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjERMA8GA1UECgwI U2F3dG9vdGgxEzARBgNVBAsMCkNvbnN1bHRpbmcxGDAWBgNVBAMMD3d3dy53b2xm -c3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIJAIb/9Y4Q -3rj7MA8GA1UdEwQIMAYBAf8CAQIwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBCwUA -A4IBAQBajrf6ybj5px79Flt1TV628m7ASPN/PmFZJWSOauUZ+wMgk94M2Yho5sOc -rbixCKR07+dcHuo7nwpkQHT/2J0UONjHaPSMsnbLd0DEVSO2QkyCFkeklzES8Kzo -uapy2OflX2ySDgfXn99LU4Xl04t0rbNYCdDPL2ajKIyGOlrIOfUDNUJyi7j8KFE3 -sDH2KcSr80//Qt5Ibb2UzTxav/Ol0hMse4HYDS/wSb/CByWlKq48n0o+dANwNqln -aBrochgteX5lLJU6XJ1GUNCa/cF6bc3WbIPyy6oZwgN8LpUwQIglRzzSeq2soRIl -QhfQFwBTSzKucKQIe5v8vJMI5rF6 +c3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIUPzITUpLG +30rVQgVssLIuRsL4uGcwDwYDVR0TBAgwBgEB/wIBAjALBgNVHQ8EBAMCAQYwDQYJ +KoZIhvcNAQELBQADggEBAEZKO65nndnmwYwMAXjnGZEZjwFGsSykbSwXn27vwhrc +/d7XjSMQV3tpA/5aSESAgROheT4o/5vxOsSHg7HLjlK1UGGYdBE6OXMgpD7AUZQK +p/XI4mBZXBPt+ww+XvK8cl8QSrVrAnxFXBxdWKBaMFryH0oHavlCg3tyxaGE/4oy +Eb/9ija8ObrC89HPUNFaIZRVEBUNCf1RGwTp9lhUa+h/N09WEDY16K9fBOKn8X9n +qaCR5KPon16RA4t5sQyqewQZbRF9qx4nQfB7E0MpoFjWcmjYlnIIq+aRmeWl90Hv +wV2lRH6kEpJnPV/zqBjv+uwj1qx/bMAgyjNxyE7BKy4= -----END CERTIFICATE----- diff --git a/certs/test-pathlen/chainI-entity.pem b/certs/test-pathlen/chainI-entity.pem index 1e7564198..f3efb471d 100644 --- a/certs/test-pathlen/chainI-entity.pem +++ b/certs/test-pathlen/chainI-entity.pem @@ -5,8 +5,8 @@ Certificate: Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainI-ICA1-no_pathlen, emailAddress = info@wolfssl.com Validity - Not Before: Oct 11 18:30:30 2019 GMT - Not After : Jul 7 18:30:30 2022 GMT + Not Before: May 7 07:39:05 2020 GMT + Not After : Feb 1 07:39:05 2023 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainI-entity, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -42,27 +42,27 @@ Certificate: X509v3 Basic Constraints: CA:FALSE Signature Algorithm: sha256WithRSAEncryption - 78:f3:ac:4b:db:c6:63:c3:f5:67:97:b8:99:f4:72:6f:b2:07: - 3b:99:ce:85:e7:5c:59:c1:80:bf:06:92:a8:34:be:1b:74:d1: - 61:b6:75:07:18:0e:2e:77:7f:77:c7:e9:5d:cc:1e:7b:b5:04: - 95:5b:99:a1:15:2e:b6:2b:67:13:09:0f:b7:6e:62:04:dd:01: - 27:fd:18:f3:d9:b2:d7:8f:6e:bb:b3:1d:57:76:91:42:dd:78: - 77:22:b3:ed:79:10:63:94:40:c5:88:09:bb:bf:fd:fe:6e:60: - 23:53:30:8e:11:e2:b7:3d:39:24:96:f2:86:cc:59:eb:83:07: - ad:7a:2e:85:63:be:70:15:92:f8:f2:2b:f1:6f:5f:c2:4d:3a: - 7d:c6:b9:9d:c4:82:6a:fe:b2:7e:ec:5d:eb:b3:ba:82:09:04: - f9:7e:47:37:a9:8a:e2:2a:4f:30:7d:b7:dd:1f:c2:f4:db:61: - f3:b1:81:5d:10:8c:41:22:76:93:5b:a3:b9:b2:69:85:88:3a: - eb:ae:42:0f:16:e7:2f:f3:cd:03:4c:08:65:90:a9:4f:dd:89: - 23:d7:56:bd:e9:d7:cf:9f:bf:0f:a2:11:5b:e1:89:2c:d4:76: - 16:1f:83:5c:e9:8c:f6:93:7c:b5:f2:f1:ef:d3:07:35:2f:93: - 33:16:9c:63 + b7:2d:06:f7:a6:0d:11:c2:78:32:61:db:d3:82:5d:89:a8:00: + 0c:be:56:77:16:05:2c:96:39:77:31:79:af:17:0a:ff:d8:cf: + 73:29:c6:e8:92:b4:42:e5:89:51:92:d7:01:75:18:88:ee:71: + 24:37:9a:d7:85:fe:38:46:33:08:f8:35:60:6a:92:b7:4a:b3: + fb:53:6b:21:10:fb:6b:de:e3:98:cf:e3:26:5f:7d:31:d0:52: + 58:32:ed:1c:08:5e:9c:f5:45:be:9e:6d:17:8d:f4:0c:3e:91: + 9c:5f:7b:ad:9a:69:e5:43:b1:73:65:c9:10:dd:a0:6e:c8:49: + b6:e7:67:5a:ca:6d:33:a9:56:bb:45:32:b8:8a:44:7e:ba:f1: + e8:67:3e:3d:cf:2f:a4:79:ae:f5:16:be:68:a5:e5:f9:0a:c3: + d9:5a:f1:1c:aa:c0:28:46:b2:e5:51:d1:d5:70:91:b5:41:23: + 73:80:01:df:c4:9b:bc:52:95:a9:28:3f:de:87:ed:40:a8:ac: + e2:63:40:a0:a1:78:3f:0f:60:e0:64:33:57:3c:64:a7:ed:32: + d7:73:14:82:99:c4:2f:e4:47:7a:1c:75:dd:45:d7:9a:c3:85: + a0:1d:41:77:29:62:03:f9:e7:aa:03:31:ed:ee:dd:aa:43:34: + 9c:d8:b0:6b -----BEGIN CERTIFICATE----- MIIEvDCCA6SgAwIBAgIBZTANBgkqhkiG9w0BAQsFADCBozELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHzAdBgNVBAMMFmNo YWluSS1JQ0ExLW5vX3BhdGhsZW4xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNz -bC5jb20wHhcNMTkxMDExMTgzMDMwWhcNMjIwNzA3MTgzMDMwWjCBmjELMAkGA1UE +bC5jb20wHhcNMjAwNTA3MDczOTA1WhcNMjMwMjAxMDczOTA1WjCBmjELMAkGA1UE BhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTAT BgNVBAoMDHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxFjAUBgNV BAMMDWNoYWluSS1lbnRpdHkxHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5j @@ -78,10 +78,10 @@ A1UEBhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUx FTATBgNVBAoMDHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHzAd BgNVBAMMFmNoYWluSS1JQ0EyLW5vX3BhdGhsZW4xHzAdBgkqhkiG9w0BCQEWEGlu Zm9Ad29sZnNzbC5jb22CAWQwCQYDVR0TBAIwADANBgkqhkiG9w0BAQsFAAOCAQEA -ePOsS9vGY8P1Z5e4mfRyb7IHO5nOhedcWcGAvwaSqDS+G3TRYbZ1BxgOLnd/d8fp -Xcwee7UElVuZoRUutitnEwkPt25iBN0BJ/0Y89my149uu7MdV3aRQt14dyKz7XkQ -Y5RAxYgJu7/9/m5gI1MwjhHitz05JJbyhsxZ64MHrXouhWO+cBWS+PIr8W9fwk06 -fca5ncSCav6yfuxd67O6ggkE+X5HN6mK4ipPMH233R/C9Nth87GBXRCMQSJ2k1uj -ubJphYg6665CDxbnL/PNA0wIZZCpT92JI9dWvenXz5+/D6IRW+GJLNR2Fh+DXOmM -9pN8tfLx79MHNS+TMxacYw== +ty0G96YNEcJ4MmHb04JdiagADL5WdxYFLJY5dzF5rxcK/9jPcynG6JK0QuWJUZLX +AXUYiO5xJDea14X+OEYzCPg1YGqSt0qz+1NrIRD7a97jmM/jJl99MdBSWDLtHAhe +nPVFvp5tF430DD6RnF97rZpp5UOxc2XJEN2gbshJtudnWsptM6lWu0UyuIpEfrrx +6Gc+Pc8vpHmu9Ra+aKXl+QrD2VrxHKrAKEay5VHR1XCRtUEjc4AB38SbvFKVqSg/ +3oftQKis4mNAoKF4Pw9g4GQzVzxkp+0y13MUgpnEL+RHehx13UXXmsOFoB1Bdyli +A/nnqgMx7e7dqkM0nNiwaw== -----END CERTIFICATE----- diff --git a/certs/test-pathlen/chainJ-ICA1-no_pathlen.pem b/certs/test-pathlen/chainJ-ICA1-no_pathlen.pem index 302d2c78d..61377edc0 100644 --- a/certs/test-pathlen/chainJ-ICA1-no_pathlen.pem +++ b/certs/test-pathlen/chainJ-ICA1-no_pathlen.pem @@ -5,8 +5,8 @@ Certificate: Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainJ-ICA2-no_pathlen, emailAddress = info@wolfssl.com Validity - Not Before: Oct 11 18:30:30 2019 GMT - Not After : Jul 7 18:30:30 2022 GMT + Not Before: May 7 07:39:05 2020 GMT + Not After : Feb 1 07:39:05 2023 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainJ-ICA1-no_pathlen, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -44,27 +44,27 @@ Certificate: X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 1c:0b:c0:44:10:dc:db:df:b9:3e:a0:95:09:d7:13:63:81:f7: - 32:57:19:84:72:2d:8e:60:66:0e:78:f3:35:7d:71:f8:95:88: - bc:90:52:e1:e2:4e:fe:4a:f7:bd:66:fe:b7:73:84:7f:96:ee: - ba:93:97:31:01:af:74:4f:60:40:74:d2:b5:a1:2f:e0:79:1a: - e2:67:08:ee:d4:60:43:1d:bc:79:9d:61:ae:fe:5e:9b:c8:b3: - 69:4e:d0:2b:2b:61:7a:51:1a:c9:bf:8c:b5:ff:ee:ee:42:eb: - ad:e4:90:53:1c:ed:a6:6f:27:51:1f:bf:b1:e3:0e:28:70:46: - 36:91:2e:72:82:b8:05:ee:42:c0:bd:17:0a:38:96:da:13:a4: - d5:a3:9d:bd:82:c3:aa:9f:ff:a8:cd:28:38:ae:18:44:a6:e3: - 60:eb:e0:4c:bd:1f:9e:99:e9:47:38:86:08:29:61:64:d6:6a: - 55:a0:eb:5a:62:24:d5:48:36:5b:51:5c:7f:5f:94:21:ea:d4: - 5e:7d:ee:ec:e7:3f:5b:35:59:8f:84:b9:00:53:80:3e:6a:a0: - db:de:a9:36:9e:f2:1e:48:77:cb:df:94:af:4c:a8:cc:93:c4: - 03:74:ca:ec:d8:86:a3:b9:49:76:b7:af:44:b3:b4:51:ca:a8: - 8b:78:73:f5 + 61:28:67:29:88:59:da:5c:6a:11:fb:9e:59:81:e2:5d:29:0f: + d5:13:b7:fa:e6:c6:b8:6e:75:92:13:a1:90:86:38:b2:e1:f6: + 2b:88:12:2d:83:c7:d9:c4:64:ae:7b:80:15:7f:41:91:bd:17: + 9d:6c:7b:db:46:61:22:53:c9:04:5e:02:bd:bc:11:0b:10:e6: + 93:f5:30:20:38:df:72:a0:64:a2:1c:11:1e:f6:d7:11:4e:bb: + 2e:b4:dd:fc:fe:45:40:6f:b8:c0:23:41:5a:57:ba:37:1f:76: + 4e:01:3b:f3:76:b5:66:23:53:8e:e9:1b:b8:5b:41:41:65:22: + 46:f4:dc:46:0e:21:12:ef:05:bc:f8:53:34:c2:c2:c5:bc:67: + 0a:cb:c9:6f:79:a0:df:aa:aa:ea:63:49:d7:99:e7:8c:d0:e5: + 40:c9:aa:6b:5d:e0:7d:32:b4:33:19:f6:74:0d:4e:2a:e1:a2: + 32:0f:02:0f:06:4a:b0:55:49:55:fe:9c:13:71:e7:b4:8d:5f: + 52:1e:dd:07:66:b1:13:1a:99:8c:db:78:16:6e:b4:dc:76:af: + d5:95:cd:fb:24:05:bc:aa:69:42:89:31:14:82:63:c5:de:3d: + 47:eb:a0:88:b9:d0:84:5b:4c:23:b0:8e:be:d4:09:6b:9a:3c: + 9a:fc:da:2a -----BEGIN CERTIFICATE----- MIIE1jCCA76gAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBozELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHzAdBgNVBAMMFmNo YWluSi1JQ0EyLW5vX3BhdGhsZW4xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNz -bC5jb20wHhcNMTkxMDExMTgzMDMwWhcNMjIwNzA3MTgzMDMwWjCBozELMAkGA1UE +bC5jb20wHhcNMjAwNTA3MDczOTA1WhcNMjMwMjAxMDczOTA1WjCBozELMAkGA1UE BhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTAT BgNVBAoMDHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHzAdBgNV BAMMFmNoYWluSi1JQ0ExLW5vX3BhdGhsZW4xHzAdBgkqhkiG9w0BCQEWEGluZm9A @@ -80,10 +80,10 @@ gaYwgaMxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQH DAdTZWF0dGxlMRUwEwYDVQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2lu ZWVyaW5nMR8wHQYDVQQDDBZjaGFpbkotSUNBMy1ub19wYXRobGVuMR8wHQYJKoZI hvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tggFkMAwGA1UdEwQFMAMBAf8wCwYDVR0P -BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4IBAQAcC8BEENzb37k+oJUJ1xNjgfcyVxmE -ci2OYGYOePM1fXH4lYi8kFLh4k7+Sve9Zv63c4R/lu66k5cxAa90T2BAdNK1oS/g -eRriZwju1GBDHbx5nWGu/l6byLNpTtArK2F6URrJv4y1/+7uQuut5JBTHO2mbydR -H7+x4w4ocEY2kS5ygrgF7kLAvRcKOJbaE6TVo529gsOqn/+ozSg4rhhEpuNg6+BM -vR+emelHOIYIKWFk1mpVoOtaYiTVSDZbUVx/X5Qh6tRefe7s5z9bNVmPhLkAU4A+ -aqDb3qk2nvIeSHfL35SvTKjMk8QDdMrs2IajuUl2t69Es7RRyqiLeHP1 +BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4IBAQBhKGcpiFnaXGoR+55ZgeJdKQ/VE7f6 +5sa4bnWSE6GQhjiy4fYriBItg8fZxGSue4AVf0GRvRedbHvbRmEiU8kEXgK9vBEL +EOaT9TAgON9yoGSiHBEe9tcRTrsutN38/kVAb7jAI0FaV7o3H3ZOATvzdrVmI1OO +6Ru4W0FBZSJG9NxGDiES7wW8+FM0wsLFvGcKy8lveaDfqqrqY0nXmeeM0OVAyapr +XeB9MrQzGfZ0DU4q4aIyDwIPBkqwVUlV/pwTcee0jV9SHt0HZrETGpmM23gWbrTc +dq/Vlc37JAW8qmlCiTEUgmPF3j1H66CIudCEW0wjsI6+1Alrmjya/Noq -----END CERTIFICATE----- diff --git a/certs/test-pathlen/chainJ-ICA2-no_pathlen.pem b/certs/test-pathlen/chainJ-ICA2-no_pathlen.pem index 92fa68dc2..92c7d1db8 100644 --- a/certs/test-pathlen/chainJ-ICA2-no_pathlen.pem +++ b/certs/test-pathlen/chainJ-ICA2-no_pathlen.pem @@ -5,8 +5,8 @@ Certificate: Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainJ-ICA3-no_pathlen, emailAddress = info@wolfssl.com Validity - Not Before: Oct 11 18:30:30 2019 GMT - Not After : Jul 7 18:30:30 2022 GMT + Not Before: May 7 07:39:05 2020 GMT + Not After : Feb 1 07:39:05 2023 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainJ-ICA2-no_pathlen, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -44,27 +44,27 @@ Certificate: X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 5b:56:cd:5e:fc:3a:fb:2b:be:7c:63:ad:a7:7b:e4:9a:00:78: - cb:d8:e6:00:41:3d:3d:e3:f6:43:78:75:d7:c9:07:61:0c:2b: - 43:46:8f:12:a3:5a:f0:3d:22:f4:72:ea:27:1a:70:57:48:c5: - ec:7d:00:dd:5d:83:a6:71:f7:90:ec:69:bd:2e:86:97:06:dc: - 9c:be:4e:a8:4c:9f:db:93:5e:fd:d8:ba:ae:89:55:65:16:cf: - ab:a5:a4:4e:ae:21:ce:5e:e0:91:e1:77:de:e3:b4:3d:ba:d2: - 12:f3:54:c0:50:94:16:e5:b2:62:71:58:03:2c:d1:f4:1f:ce: - 9d:a5:ce:2a:57:9f:f7:19:41:b0:4d:e8:27:5d:f2:e6:c8:44: - 1b:c3:57:51:76:d4:15:1a:05:31:61:c3:02:db:56:81:1e:24: - f2:23:04:a9:5a:31:ee:08:1d:08:1f:49:d7:2c:ba:1e:00:5a: - e5:57:8b:fd:aa:a4:2f:6a:d7:93:19:09:92:30:7d:95:68:3b: - b7:ce:a3:f2:b9:e4:e4:e4:48:a4:22:6b:00:33:91:56:28:fc: - 50:f7:1d:f6:70:5b:83:a8:99:98:2d:7a:6c:aa:9b:5a:a5:56: - 5b:89:95:a8:50:27:68:ce:63:5e:d3:84:cb:80:1b:ae:3e:a2: - 5c:13:9b:ff + 54:57:fa:58:c7:ae:60:55:9f:7e:41:2c:c4:dc:8d:b6:f8:fb: + cf:d3:ea:c9:88:0e:9a:c8:51:f2:2b:8f:e5:6c:a1:96:40:1c: + 0d:cb:ae:a8:8a:0b:ab:e8:fb:83:1b:4f:d4:5e:e9:92:94:70: + a8:1b:d8:10:62:a5:83:cd:0e:27:91:26:4f:1d:c6:ce:36:52: + 26:92:28:c0:e8:eb:c5:d3:88:a8:d5:fd:1f:b0:2c:e4:e2:f3: + d1:1f:d8:e3:7c:76:ab:f7:94:5f:d8:9f:9e:34:9e:80:9c:50: + 81:e6:cc:c6:cb:d6:7c:dd:4a:a9:dd:22:01:79:ba:ef:20:9b: + 89:72:a6:c9:89:f2:68:fd:76:a6:55:fa:7b:4a:bd:ea:53:ed: + af:7c:07:81:23:c7:71:2d:cc:ae:1d:be:6e:5d:77:08:a4:aa: + 36:92:8d:20:af:5d:6c:e7:ee:72:e2:89:9c:41:11:5b:e2:42: + 35:6f:0c:a0:41:10:93:2a:e5:57:7f:84:16:b3:af:0c:29:b5: + cd:69:96:f2:7e:20:6f:78:80:be:be:e8:3d:27:c2:d8:58:de: + 8c:f5:bd:fc:be:fd:66:ee:19:37:57:25:cb:fa:ee:cc:0d:16: + fa:81:15:df:ce:74:1a:52:55:df:02:17:50:45:10:6c:d4:bc: + 57:2f:bc:21 -----BEGIN CERTIFICATE----- MIIE1DCCA7ygAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBozELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHzAdBgNVBAMMFmNo YWluSi1JQ0EzLW5vX3BhdGhsZW4xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNz -bC5jb20wHhcNMTkxMDExMTgzMDMwWhcNMjIwNzA3MTgzMDMwWjCBozELMAkGA1UE +bC5jb20wHhcNMjAwNTA3MDczOTA1WhcNMjMwMjAxMDczOTA1WjCBozELMAkGA1UE BhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTAT BgNVBAoMDHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHzAdBgNV BAMMFmNoYWluSi1JQ0EyLW5vX3BhdGhsZW4xHzAdBgkqhkiG9w0BCQEWEGluZm9A @@ -80,10 +80,10 @@ gaQwgaExCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQH DAdTZWF0dGxlMRUwEwYDVQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2lu ZWVyaW5nMR0wGwYDVQQDDBRjaGFpbkotSUNBNC1wYXRobGVuMjEfMB0GCSqGSIb3 DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIBZDAMBgNVHRMEBTADAQH/MAsGA1UdDwQE -AwIBBjANBgkqhkiG9w0BAQsFAAOCAQEAW1bNXvw6+yu+fGOtp3vkmgB4y9jmAEE9 -PeP2Q3h118kHYQwrQ0aPEqNa8D0i9HLqJxpwV0jF7H0A3V2DpnH3kOxpvS6Glwbc -nL5OqEyf25Ne/di6rolVZRbPq6WkTq4hzl7gkeF33uO0PbrSEvNUwFCUFuWyYnFY -AyzR9B/OnaXOKlef9xlBsE3oJ13y5shEG8NXUXbUFRoFMWHDAttWgR4k8iMEqVox -7ggdCB9J1yy6HgBa5VeL/aqkL2rXkxkJkjB9lWg7t86j8rnk5ORIpCJrADORVij8 -UPcd9nBbg6iZmC16bKqbWqVWW4mVqFAnaM5jXtOEy4Abrj6iXBOb/w== +AwIBBjANBgkqhkiG9w0BAQsFAAOCAQEAVFf6WMeuYFWffkEsxNyNtvj7z9PqyYgO +mshR8iuP5WyhlkAcDcuuqIoLq+j7gxtP1F7pkpRwqBvYEGKlg80OJ5EmTx3GzjZS +JpIowOjrxdOIqNX9H7As5OLz0R/Y43x2q/eUX9ifnjSegJxQgebMxsvWfN1Kqd0i +AXm67yCbiXKmyYnyaP12plX6e0q96lPtr3wHgSPHcS3Mrh2+bl13CKSqNpKNIK9d +bOfucuKJnEERW+JCNW8MoEEQkyrlV3+EFrOvDCm1zWmW8n4gb3iAvr7oPSfC2Fje +jPW9/L79Zu4ZN1cly/ruzA0W+oEV3850GlJV3wIXUEUQbNS8Vy+8IQ== -----END CERTIFICATE----- diff --git a/certs/test-pathlen/chainJ-ICA3-no_pathlen.pem b/certs/test-pathlen/chainJ-ICA3-no_pathlen.pem index 7c1bfed06..042cb7914 100644 --- a/certs/test-pathlen/chainJ-ICA3-no_pathlen.pem +++ b/certs/test-pathlen/chainJ-ICA3-no_pathlen.pem @@ -5,8 +5,8 @@ Certificate: Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainJ-ICA4-pathlen2, emailAddress = info@wolfssl.com Validity - Not Before: Oct 11 18:30:30 2019 GMT - Not After : Jul 7 18:30:30 2022 GMT + Not Before: May 7 07:39:05 2020 GMT + Not After : Feb 1 07:39:05 2023 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainJ-ICA3-no_pathlen, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -44,27 +44,27 @@ Certificate: X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 38:56:e6:30:a8:f8:db:32:4c:53:e0:8f:c5:08:98:3f:ce:bf: - b1:04:b0:52:24:63:6a:14:86:41:08:13:78:aa:98:7e:07:9b: - 1d:22:9e:61:b6:69:fb:f9:24:a3:8e:4b:f2:1f:39:6a:0b:a1: - ff:1f:9b:65:7c:7f:85:8c:d8:ce:3d:83:93:4c:00:4e:7f:d0: - 44:53:b1:a8:7d:bf:43:f1:d7:f2:2c:86:20:b8:cf:11:39:bb: - 7e:21:28:ca:20:4b:0a:46:97:d3:c6:82:2c:4e:25:8a:e4:92: - 84:da:c2:9b:15:3a:5c:8b:fc:a1:b7:76:f9:e8:80:79:1f:fc: - 4f:d4:18:f1:17:fa:19:87:4d:3c:81:e1:82:ce:e2:5c:d2:c0: - cd:e8:44:5a:dd:f1:41:5f:a2:df:27:a9:d4:4e:f7:2c:7a:8c: - 5f:dd:f2:3e:e3:c5:1f:7b:5f:0e:6f:9c:9a:c8:eb:63:0f:98: - eb:7e:e6:89:56:d9:c7:f4:6d:20:d9:0f:a5:81:82:90:90:95: - 53:62:80:9d:e3:93:44:4c:33:00:1e:b9:c8:b2:13:53:d2:a3: - 18:96:86:40:92:74:bf:a9:8e:77:ff:a8:3b:7f:c6:92:c8:b4: - 4e:6c:17:7f:36:9d:f6:64:11:f9:26:5e:55:09:36:fe:8c:84: - 81:08:0e:a3 + 60:6c:d2:1a:ea:b9:91:d1:e4:7e:03:d7:3c:60:73:0f:c7:7d: + f2:0d:99:40:2e:ba:f5:5d:17:0a:e1:65:1f:00:1f:37:a2:3b: + 0d:f2:eb:0b:b9:ec:6d:1f:bc:5f:f8:87:b4:b9:d7:23:15:78: + 7b:97:f2:d0:84:22:2e:6f:2e:08:0d:a1:1c:1c:f6:71:79:60: + 65:ed:1e:a8:14:0f:4a:3d:2b:f5:50:9d:89:09:20:b6:4a:03: + fe:7d:f9:03:7b:4d:c4:74:b9:c7:66:b5:69:1f:1b:d3:01:b5: + 1e:c0:27:5c:fe:2d:c6:aa:1f:b0:c9:14:28:62:41:4a:f0:ad: + d4:49:7b:ca:74:75:12:3b:b2:f4:06:90:d1:80:ca:33:3e:57: + 91:6b:c6:b4:de:24:3e:86:86:20:62:01:d6:a2:e9:3f:2e:11: + ca:7d:f9:2b:46:e4:b4:fb:f0:fe:2f:f6:93:94:a3:9f:9f:14: + a2:54:33:90:3c:31:6d:1f:99:54:a8:7e:7e:e6:7f:06:a8:9d: + 53:93:24:c8:20:e6:3c:74:a6:ba:fc:be:8b:f6:3c:53:94:8e: + fb:34:24:4b:71:5f:c0:33:80:79:22:7f:0e:ce:6a:8c:5e:63: + fc:96:90:d4:2a:26:2f:3c:7a:06:b8:4e:30:89:4d:b9:c7:19: + 52:6e:98:82 -----BEGIN CERTIFICATE----- MIIExDCCA6ygAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBoTELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNo YWluSi1JQ0E0LXBhdGhsZW4yMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTE5MTAxMTE4MzAzMFoXDTIyMDcwNzE4MzAzMFowgaMxCzAJBgNVBAYT +Y29tMB4XDTIwMDUwNzA3MzkwNVoXDTIzMDIwMTA3MzkwNVowgaMxCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRUwEwYD VQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2luZWVyaW5nMR8wHQYDVQQD DBZjaGFpbkotSUNBMy1ub19wYXRobGVuMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdv @@ -80,10 +80,10 @@ gZQxCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3pl bWFuMREwDwYDVQQKDAhTYXd0b290aDETMBEGA1UECwwKQ29uc3VsdGluZzEYMBYG A1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZz c2wuY29tggFkMAwGA1UdEwQFMAMBAf8wCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEB -CwUAA4IBAQA4VuYwqPjbMkxT4I/FCJg/zr+xBLBSJGNqFIZBCBN4qph+B5sdIp5h -tmn7+SSjjkvyHzlqC6H/H5tlfH+FjNjOPYOTTABOf9BEU7Gofb9D8dfyLIYguM8R -Obt+ISjKIEsKRpfTxoIsTiWK5JKE2sKbFTpci/yht3b56IB5H/xP1BjxF/oZh008 -geGCzuJc0sDN6ERa3fFBX6LfJ6nUTvcseoxf3fI+48Ufe18Ob5yayOtjD5jrfuaJ -VtnH9G0g2Q+lgYKQkJVTYoCd45NETDMAHrnIshNT0qMYloZAknS/qY53/6g7f8aS -yLRObBd/Np32ZBH5Jl5VCTb+jISBCA6j +CwUAA4IBAQBgbNIa6rmR0eR+A9c8YHMPx33yDZlALrr1XRcK4WUfAB83ojsN8usL +uextH7xf+Ie0udcjFXh7l/LQhCIuby4IDaEcHPZxeWBl7R6oFA9KPSv1UJ2JCSC2 +SgP+ffkDe03EdLnHZrVpHxvTAbUewCdc/i3Gqh+wyRQoYkFK8K3USXvKdHUSO7L0 +BpDRgMozPleRa8a03iQ+hoYgYgHWouk/LhHKffkrRuS0+/D+L/aTlKOfnxSiVDOQ +PDFtH5lUqH5+5n8GqJ1TkyTIIOY8dKa6/L6L9jxTlI77NCRLcV/AM4B5In8OzmqM +XmP8lpDUKiYvPHoGuE4wiU25xxlSbpiC -----END CERTIFICATE----- diff --git a/certs/test-pathlen/chainJ-ICA4-pathlen2.pem b/certs/test-pathlen/chainJ-ICA4-pathlen2.pem index 0d3e8258a..5296432d0 100644 --- a/certs/test-pathlen/chainJ-ICA4-pathlen2.pem +++ b/certs/test-pathlen/chainJ-ICA4-pathlen2.pem @@ -5,8 +5,8 @@ Certificate: Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Oct 11 18:30:30 2019 GMT - Not After : Jul 7 18:30:30 2022 GMT + Not Before: May 7 07:39:05 2020 GMT + Not After : Feb 1 07:39:05 2023 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainJ-ICA4-pathlen2, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -37,34 +37,34 @@ Certificate: X509v3 Authority Key Identifier: keyid:27:8E:67:11:74:C3:26:1D:3F:ED:33:63:B3:A4:D8:1D:30:E5:E8:D5 DirName:/C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:86:FF:F5:8E:10:DE:B8:FB + serial:3F:32:13:52:92:C6:DF:4A:D5:42:05:6C:B0:B2:2E:46:C2:F8:B8:67 X509v3 Basic Constraints: CA:TRUE, pathlen:2 X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 0d:bc:87:df:e4:68:a5:56:54:d2:89:42:d8:b4:1b:45:6f:88: - b2:39:d1:ad:38:f4:0b:68:5e:e1:3e:88:60:4f:69:be:a8:ee: - 1d:14:08:69:86:ee:6a:08:42:35:6e:44:4f:5f:be:13:00:81: - ca:41:a7:70:d3:48:9f:60:03:14:a4:4b:7f:35:7e:6d:94:0b: - cf:63:00:fe:8e:54:2c:4c:ac:fb:ef:4c:68:91:9a:0f:45:3e: - 07:12:f2:74:e6:83:36:8e:61:49:f9:03:17:e2:16:72:eb:6b: - c3:c1:7b:95:37:31:1f:10:b9:fc:7b:e4:54:d4:4f:81:a0:f8: - 0e:be:99:43:50:dd:19:7e:f9:41:8b:0d:2e:b2:e5:2c:ec:9b: - 20:42:f4:3a:da:03:99:bc:c1:c2:6c:69:4e:8e:6e:ad:22:57: - dc:2c:1a:e3:4f:15:c4:b3:b4:5d:2d:be:d8:62:0a:a4:c9:62: - fb:9a:53:26:ee:8f:8e:43:a6:e2:77:9b:1f:1f:4f:86:b5:65: - 22:3c:0d:f7:75:ab:24:2d:5b:6f:96:3f:26:22:b0:de:b2:4e: - 37:fd:f9:9a:22:81:15:91:c5:b0:54:f2:ee:f0:e9:7f:23:ab: - 43:1c:43:e1:e4:bf:61:20:13:f3:4f:b6:71:77:a3:23:89:fb: - 02:c2:24:5e + 51:21:92:8f:59:88:72:3a:6d:36:06:83:3f:89:d0:e0:91:19: + 99:3e:3e:be:16:4e:0a:fe:9e:ef:1e:f8:a3:e2:aa:53:95:68: + fa:f9:09:fc:dd:54:f2:9a:1e:75:67:90:b9:54:58:bc:4d:03: + 6c:15:b4:11:c4:d1:f7:1d:6a:b4:84:21:3e:1b:c3:be:08:95: + 6d:8c:f6:91:42:4f:0c:cb:56:ce:ae:47:ef:f7:ac:92:76:f7: + 59:03:aa:a4:be:95:fe:b4:4e:b1:72:10:2f:58:07:d5:e8:9d: + 3d:b1:70:ee:52:8e:33:da:e5:94:c1:03:c4:1e:d2:96:3a:23: + 7d:d6:34:6d:98:13:c0:c8:3d:bb:d3:32:da:66:33:03:64:ba: + 25:1f:96:d0:e0:62:b9:98:4c:ba:ab:51:68:af:a0:17:34:21: + 6b:2b:73:96:98:cf:74:b9:26:c8:68:96:18:97:30:dc:d3:eb: + 2e:fe:04:4d:b1:43:cb:8f:29:9d:40:f3:92:ed:ef:16:3a:2c: + 96:6e:7b:c3:a7:e7:0c:16:c2:de:9a:c7:75:8e:89:93:64:82: + ea:ed:10:7b:4c:71:d2:3d:40:97:05:68:cd:2d:5e:a3:c3:fa: + 19:97:a8:21:c7:a5:a6:e1:d4:a5:63:4e:b4:e1:3f:25:02:0f: + 2a:78:69:d6 -----BEGIN CERTIFICATE----- -MIIEwTCCA6mgAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx +MIIEzDCCA7SgAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx EDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNh d3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cud29sZnNz -bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMTkxMDEx -MTgzMDMwWhcNMjIwNzA3MTgzMDMwWjCBoTELMAkGA1UEBhMCVVMxEzARBgNVBAgM +bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjAwNTA3 +MDczOTA1WhcNMjMwMjAxMDczOTA1WjCBoTELMAkGA1UEBhMCVVMxEzARBgNVBAgM Cldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoMDHdvbGZTU0wg SW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNoYWluSi1JQ0E0 LXBhdGhsZW4yMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMIIBIjAN @@ -74,16 +74,16 @@ Jo/8HgYX8N5Yh+8eppESOWilBfOMZ8nlmRik/JA/vabK8qbdteaTyxSJgzyIWjGr 42YqG4fFhQNFsM7hD8EPknDXrGXqqAnB/h3bt+fdmNPGsRa0VFjBqrqhzxkUp+RV ptq7H57RhQDgjUrE0oYIdf3YHoUhbCePGNVEc1irlHVKNj2NTcZ6hp0A28W6vnAC g79u2DGJs/IWmL4n9hRa6dRyZ42p33YnvxmsIFkoWxtC2dVbbftuol7T6QIDAQAB -o4IBDTCCAQkwHQYDVR0OBBYEFPwYE1K7M0rbHFvRgJg+QIaVWHL5MIHJBgNVHSME -gcEwgb6AFCeOZxF0wyYdP+0zY7Ok2B0w5ejVoYGapIGXMIGUMQswCQYDVQQGEwJV +o4IBGDCCARQwHQYDVR0OBBYEFPwYE1K7M0rbHFvRgJg+QIaVWHL5MIHUBgNVHSME +gcwwgcmAFCeOZxF0wyYdP+0zY7Ok2B0w5ejVoYGapIGXMIGUMQswCQYDVQQGEwJV UzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjERMA8GA1UECgwI U2F3dG9vdGgxEzARBgNVBAsMCkNvbnN1bHRpbmcxGDAWBgNVBAMMD3d3dy53b2xm -c3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIJAIb/9Y4Q -3rj7MA8GA1UdEwQIMAYBAf8CAQIwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBCwUA -A4IBAQANvIff5GilVlTSiULYtBtFb4iyOdGtOPQLaF7hPohgT2m+qO4dFAhphu5q -CEI1bkRPX74TAIHKQadw00ifYAMUpEt/NX5tlAvPYwD+jlQsTKz770xokZoPRT4H -EvJ05oM2jmFJ+QMX4hZy62vDwXuVNzEfELn8e+RU1E+BoPgOvplDUN0ZfvlBiw0u -suUs7JsgQvQ62gOZvMHCbGlOjm6tIlfcLBrjTxXEs7RdLb7YYgqkyWL7mlMm7o+O -Q6bid5sfH0+GtWUiPA33daskLVtvlj8mIrDesk43/fmaIoEVkcWwVPLu8Ol/I6tD -HEPh5L9hIBPzT7Zxd6MjifsCwiRe +c3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIUPzITUpLG +30rVQgVssLIuRsL4uGcwDwYDVR0TBAgwBgEB/wIBAjALBgNVHQ8EBAMCAQYwDQYJ +KoZIhvcNAQELBQADggEBAFEhko9ZiHI6bTYGgz+J0OCRGZk+Pr4WTgr+nu8e+KPi +qlOVaPr5CfzdVPKaHnVnkLlUWLxNA2wVtBHE0fcdarSEIT4bw74IlW2M9pFCTwzL +Vs6uR+/3rJJ291kDqqS+lf60TrFyEC9YB9XonT2xcO5SjjPa5ZTBA8Qe0pY6I33W +NG2YE8DIPbvTMtpmMwNkuiUfltDgYrmYTLqrUWivoBc0IWsrc5aYz3S5JsholhiX +MNzT6y7+BE2xQ8uPKZ1A85Lt7xY6LJZue8On5wwWwt6ax3WOiZNkgurtEHtMcdI9 +QJcFaM0tXqPD+hmXqCHHpabh1KVjTrThPyUCDyp4adY= -----END CERTIFICATE----- diff --git a/certs/test-pathlen/chainJ-assembled.pem b/certs/test-pathlen/chainJ-assembled.pem index 4e93b51f6..baf628d44 100644 --- a/certs/test-pathlen/chainJ-assembled.pem +++ b/certs/test-pathlen/chainJ-assembled.pem @@ -5,8 +5,8 @@ Certificate: Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainJ-ICA1-no_pathlen, emailAddress = info@wolfssl.com Validity - Not Before: Oct 11 18:30:30 2019 GMT - Not After : Jul 7 18:30:30 2022 GMT + Not Before: May 7 07:39:05 2020 GMT + Not After : Feb 1 07:39:05 2023 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainJ-entity, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -42,27 +42,27 @@ Certificate: X509v3 Basic Constraints: CA:FALSE Signature Algorithm: sha256WithRSAEncryption - 10:a0:e0:ea:4b:df:4c:5b:92:da:6b:13:5a:4b:e9:46:1a:17: - 48:42:5e:08:c8:28:e4:ce:69:46:25:55:70:57:bd:4e:b2:0b: - a4:75:22:b6:5b:d7:e0:54:3f:31:14:99:09:c1:3b:6f:b7:59: - 5a:52:67:46:0c:4f:ec:fa:31:4a:6e:59:04:50:99:60:1e:74: - ed:3a:ac:4d:cd:98:31:4d:b1:54:07:3e:76:bb:92:e2:1d:53: - 65:08:38:e3:4d:b0:d8:74:14:5f:00:94:e7:d2:c9:9d:80:23: - f5:9e:3d:8c:22:72:b3:20:5a:01:a3:02:f2:9c:cc:b8:1d:73: - db:eb:cc:cb:27:4f:75:17:1d:23:68:07:4f:15:be:00:cc:a9: - 2a:14:82:2c:0e:e3:92:40:dc:62:ac:d9:61:24:99:19:43:d5: - 3e:85:ca:e5:6d:e1:76:9a:4e:01:ef:34:98:7a:1b:ca:8b:c3: - de:99:22:75:28:11:0c:17:7a:58:7b:44:33:22:58:61:24:8c: - 96:a5:a7:63:19:31:6d:61:83:1c:5f:50:66:48:29:b4:2d:8e: - 5e:f3:63:85:e8:9c:d8:6e:93:4a:4d:ff:b1:d5:60:96:d0:9f: - 4e:3f:6f:c9:b4:e1:04:b8:ef:55:c2:77:c1:e1:50:d0:a7:b8: - 9d:a3:81:71 + 94:3f:3c:06:04:ee:37:70:7f:f8:37:6b:f1:50:f2:1c:40:e0: + d8:c0:ab:f9:ae:64:43:b3:bc:25:30:93:a4:e8:d7:93:56:30: + d7:93:7b:b9:3f:2c:af:34:c8:2c:f2:42:25:08:66:b8:90:12: + 19:cb:a1:b9:15:20:7b:0d:ad:7a:36:c0:47:f7:bc:d8:c6:d4: + 4d:be:9a:2e:de:ca:81:fb:52:64:9e:c4:96:c9:91:be:cb:fe: + b7:44:d5:df:f4:44:32:fa:43:a0:bc:c9:0a:1d:7a:ce:1b:f7: + ee:52:1c:df:db:81:2c:01:4b:65:fb:5d:2c:68:a6:a6:8d:d3: + 70:73:24:43:0a:89:dd:2f:e7:37:84:e2:b5:28:b6:9c:1b:d7: + b6:ae:e5:71:be:24:fc:5e:61:a4:a7:75:cd:fd:10:95:78:64: + 5c:f9:13:cc:9a:c0:e5:fc:13:e5:b3:51:e2:a2:27:86:03:c3: + c0:ce:a3:56:c2:2a:73:12:60:82:66:27:19:4c:95:61:0f:6a: + 56:43:11:fa:2a:78:a8:5e:1d:92:e2:54:19:53:46:ca:1f:71: + 56:02:59:d2:20:a4:06:31:03:34:e1:0c:db:3e:0a:8e:52:ec: + ec:76:73:b3:8d:6c:21:7f:54:16:bd:ed:41:65:ba:c0:0e:5f: + 08:9e:6a:0c -----BEGIN CERTIFICATE----- MIIEvDCCA6SgAwIBAgIBZTANBgkqhkiG9w0BAQsFADCBozELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHzAdBgNVBAMMFmNo YWluSi1JQ0ExLW5vX3BhdGhsZW4xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNz -bC5jb20wHhcNMTkxMDExMTgzMDMwWhcNMjIwNzA3MTgzMDMwWjCBmjELMAkGA1UE +bC5jb20wHhcNMjAwNTA3MDczOTA1WhcNMjMwMjAxMDczOTA1WjCBmjELMAkGA1UE BhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTAT BgNVBAoMDHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxFjAUBgNV BAMMDWNoYWluSi1lbnRpdHkxHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5j @@ -78,12 +78,12 @@ A1UEBhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUx FTATBgNVBAoMDHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHzAd BgNVBAMMFmNoYWluSi1JQ0EyLW5vX3BhdGhsZW4xHzAdBgkqhkiG9w0BCQEWEGlu Zm9Ad29sZnNzbC5jb22CAWQwCQYDVR0TBAIwADANBgkqhkiG9w0BAQsFAAOCAQEA -EKDg6kvfTFuS2msTWkvpRhoXSEJeCMgo5M5pRiVVcFe9TrILpHUitlvX4FQ/MRSZ -CcE7b7dZWlJnRgxP7PoxSm5ZBFCZYB507TqsTc2YMU2xVAc+druS4h1TZQg4402w -2HQUXwCU59LJnYAj9Z49jCJysyBaAaMC8pzMuB1z2+vMyydPdRcdI2gHTxW+AMyp -KhSCLA7jkkDcYqzZYSSZGUPVPoXK5W3hdppOAe80mHobyovD3pkidSgRDBd6WHtE -MyJYYSSMlqWnYxkxbWGDHF9QZkgptC2OXvNjheic2G6TSk3/sdVgltCfTj9vybTh -BLjvVcJ3weFQ0Ke4naOBcQ== +lD88BgTuN3B/+Ddr8VDyHEDg2MCr+a5kQ7O8JTCTpOjXk1Yw15N7uT8srzTILPJC +JQhmuJASGcuhuRUgew2tejbAR/e82MbUTb6aLt7KgftSZJ7ElsmRvsv+t0TV3/RE +MvpDoLzJCh16zhv37lIc39uBLAFLZftdLGimpo3TcHMkQwqJ3S/nN4TitSi2nBvX +tq7lcb4k/F5hpKd1zf0QlXhkXPkTzJrA5fwT5bNR4qInhgPDwM6jVsIqcxJggmYn +GUyVYQ9qVkMR+ip4qF4dkuJUGVNGyh9xVgJZ0iCkBjEDNOEM2z4KjlLs7HZzs41s +IX9UFr3tQWW6wA5fCJ5qDA== -----END CERTIFICATE----- Certificate: Data: @@ -92,8 +92,8 @@ Certificate: Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainJ-ICA2-no_pathlen, emailAddress = info@wolfssl.com Validity - Not Before: Oct 11 18:30:30 2019 GMT - Not After : Jul 7 18:30:30 2022 GMT + Not Before: May 7 07:39:05 2020 GMT + Not After : Feb 1 07:39:05 2023 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainJ-ICA1-no_pathlen, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -131,27 +131,27 @@ Certificate: X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 1c:0b:c0:44:10:dc:db:df:b9:3e:a0:95:09:d7:13:63:81:f7: - 32:57:19:84:72:2d:8e:60:66:0e:78:f3:35:7d:71:f8:95:88: - bc:90:52:e1:e2:4e:fe:4a:f7:bd:66:fe:b7:73:84:7f:96:ee: - ba:93:97:31:01:af:74:4f:60:40:74:d2:b5:a1:2f:e0:79:1a: - e2:67:08:ee:d4:60:43:1d:bc:79:9d:61:ae:fe:5e:9b:c8:b3: - 69:4e:d0:2b:2b:61:7a:51:1a:c9:bf:8c:b5:ff:ee:ee:42:eb: - ad:e4:90:53:1c:ed:a6:6f:27:51:1f:bf:b1:e3:0e:28:70:46: - 36:91:2e:72:82:b8:05:ee:42:c0:bd:17:0a:38:96:da:13:a4: - d5:a3:9d:bd:82:c3:aa:9f:ff:a8:cd:28:38:ae:18:44:a6:e3: - 60:eb:e0:4c:bd:1f:9e:99:e9:47:38:86:08:29:61:64:d6:6a: - 55:a0:eb:5a:62:24:d5:48:36:5b:51:5c:7f:5f:94:21:ea:d4: - 5e:7d:ee:ec:e7:3f:5b:35:59:8f:84:b9:00:53:80:3e:6a:a0: - db:de:a9:36:9e:f2:1e:48:77:cb:df:94:af:4c:a8:cc:93:c4: - 03:74:ca:ec:d8:86:a3:b9:49:76:b7:af:44:b3:b4:51:ca:a8: - 8b:78:73:f5 + 61:28:67:29:88:59:da:5c:6a:11:fb:9e:59:81:e2:5d:29:0f: + d5:13:b7:fa:e6:c6:b8:6e:75:92:13:a1:90:86:38:b2:e1:f6: + 2b:88:12:2d:83:c7:d9:c4:64:ae:7b:80:15:7f:41:91:bd:17: + 9d:6c:7b:db:46:61:22:53:c9:04:5e:02:bd:bc:11:0b:10:e6: + 93:f5:30:20:38:df:72:a0:64:a2:1c:11:1e:f6:d7:11:4e:bb: + 2e:b4:dd:fc:fe:45:40:6f:b8:c0:23:41:5a:57:ba:37:1f:76: + 4e:01:3b:f3:76:b5:66:23:53:8e:e9:1b:b8:5b:41:41:65:22: + 46:f4:dc:46:0e:21:12:ef:05:bc:f8:53:34:c2:c2:c5:bc:67: + 0a:cb:c9:6f:79:a0:df:aa:aa:ea:63:49:d7:99:e7:8c:d0:e5: + 40:c9:aa:6b:5d:e0:7d:32:b4:33:19:f6:74:0d:4e:2a:e1:a2: + 32:0f:02:0f:06:4a:b0:55:49:55:fe:9c:13:71:e7:b4:8d:5f: + 52:1e:dd:07:66:b1:13:1a:99:8c:db:78:16:6e:b4:dc:76:af: + d5:95:cd:fb:24:05:bc:aa:69:42:89:31:14:82:63:c5:de:3d: + 47:eb:a0:88:b9:d0:84:5b:4c:23:b0:8e:be:d4:09:6b:9a:3c: + 9a:fc:da:2a -----BEGIN CERTIFICATE----- MIIE1jCCA76gAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBozELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHzAdBgNVBAMMFmNo YWluSi1JQ0EyLW5vX3BhdGhsZW4xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNz -bC5jb20wHhcNMTkxMDExMTgzMDMwWhcNMjIwNzA3MTgzMDMwWjCBozELMAkGA1UE +bC5jb20wHhcNMjAwNTA3MDczOTA1WhcNMjMwMjAxMDczOTA1WjCBozELMAkGA1UE BhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTAT BgNVBAoMDHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHzAdBgNV BAMMFmNoYWluSi1JQ0ExLW5vX3BhdGhsZW4xHzAdBgkqhkiG9w0BCQEWEGluZm9A @@ -167,12 +167,12 @@ gaYwgaMxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQH DAdTZWF0dGxlMRUwEwYDVQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2lu ZWVyaW5nMR8wHQYDVQQDDBZjaGFpbkotSUNBMy1ub19wYXRobGVuMR8wHQYJKoZI hvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tggFkMAwGA1UdEwQFMAMBAf8wCwYDVR0P -BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4IBAQAcC8BEENzb37k+oJUJ1xNjgfcyVxmE -ci2OYGYOePM1fXH4lYi8kFLh4k7+Sve9Zv63c4R/lu66k5cxAa90T2BAdNK1oS/g -eRriZwju1GBDHbx5nWGu/l6byLNpTtArK2F6URrJv4y1/+7uQuut5JBTHO2mbydR -H7+x4w4ocEY2kS5ygrgF7kLAvRcKOJbaE6TVo529gsOqn/+ozSg4rhhEpuNg6+BM -vR+emelHOIYIKWFk1mpVoOtaYiTVSDZbUVx/X5Qh6tRefe7s5z9bNVmPhLkAU4A+ -aqDb3qk2nvIeSHfL35SvTKjMk8QDdMrs2IajuUl2t69Es7RRyqiLeHP1 +BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4IBAQBhKGcpiFnaXGoR+55ZgeJdKQ/VE7f6 +5sa4bnWSE6GQhjiy4fYriBItg8fZxGSue4AVf0GRvRedbHvbRmEiU8kEXgK9vBEL +EOaT9TAgON9yoGSiHBEe9tcRTrsutN38/kVAb7jAI0FaV7o3H3ZOATvzdrVmI1OO +6Ru4W0FBZSJG9NxGDiES7wW8+FM0wsLFvGcKy8lveaDfqqrqY0nXmeeM0OVAyapr +XeB9MrQzGfZ0DU4q4aIyDwIPBkqwVUlV/pwTcee0jV9SHt0HZrETGpmM23gWbrTc +dq/Vlc37JAW8qmlCiTEUgmPF3j1H66CIudCEW0wjsI6+1Alrmjya/Noq -----END CERTIFICATE----- Certificate: Data: @@ -181,8 +181,8 @@ Certificate: Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainJ-ICA3-no_pathlen, emailAddress = info@wolfssl.com Validity - Not Before: Oct 11 18:30:30 2019 GMT - Not After : Jul 7 18:30:30 2022 GMT + Not Before: May 7 07:39:05 2020 GMT + Not After : Feb 1 07:39:05 2023 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainJ-ICA2-no_pathlen, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -220,27 +220,27 @@ Certificate: X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 5b:56:cd:5e:fc:3a:fb:2b:be:7c:63:ad:a7:7b:e4:9a:00:78: - cb:d8:e6:00:41:3d:3d:e3:f6:43:78:75:d7:c9:07:61:0c:2b: - 43:46:8f:12:a3:5a:f0:3d:22:f4:72:ea:27:1a:70:57:48:c5: - ec:7d:00:dd:5d:83:a6:71:f7:90:ec:69:bd:2e:86:97:06:dc: - 9c:be:4e:a8:4c:9f:db:93:5e:fd:d8:ba:ae:89:55:65:16:cf: - ab:a5:a4:4e:ae:21:ce:5e:e0:91:e1:77:de:e3:b4:3d:ba:d2: - 12:f3:54:c0:50:94:16:e5:b2:62:71:58:03:2c:d1:f4:1f:ce: - 9d:a5:ce:2a:57:9f:f7:19:41:b0:4d:e8:27:5d:f2:e6:c8:44: - 1b:c3:57:51:76:d4:15:1a:05:31:61:c3:02:db:56:81:1e:24: - f2:23:04:a9:5a:31:ee:08:1d:08:1f:49:d7:2c:ba:1e:00:5a: - e5:57:8b:fd:aa:a4:2f:6a:d7:93:19:09:92:30:7d:95:68:3b: - b7:ce:a3:f2:b9:e4:e4:e4:48:a4:22:6b:00:33:91:56:28:fc: - 50:f7:1d:f6:70:5b:83:a8:99:98:2d:7a:6c:aa:9b:5a:a5:56: - 5b:89:95:a8:50:27:68:ce:63:5e:d3:84:cb:80:1b:ae:3e:a2: - 5c:13:9b:ff + 54:57:fa:58:c7:ae:60:55:9f:7e:41:2c:c4:dc:8d:b6:f8:fb: + cf:d3:ea:c9:88:0e:9a:c8:51:f2:2b:8f:e5:6c:a1:96:40:1c: + 0d:cb:ae:a8:8a:0b:ab:e8:fb:83:1b:4f:d4:5e:e9:92:94:70: + a8:1b:d8:10:62:a5:83:cd:0e:27:91:26:4f:1d:c6:ce:36:52: + 26:92:28:c0:e8:eb:c5:d3:88:a8:d5:fd:1f:b0:2c:e4:e2:f3: + d1:1f:d8:e3:7c:76:ab:f7:94:5f:d8:9f:9e:34:9e:80:9c:50: + 81:e6:cc:c6:cb:d6:7c:dd:4a:a9:dd:22:01:79:ba:ef:20:9b: + 89:72:a6:c9:89:f2:68:fd:76:a6:55:fa:7b:4a:bd:ea:53:ed: + af:7c:07:81:23:c7:71:2d:cc:ae:1d:be:6e:5d:77:08:a4:aa: + 36:92:8d:20:af:5d:6c:e7:ee:72:e2:89:9c:41:11:5b:e2:42: + 35:6f:0c:a0:41:10:93:2a:e5:57:7f:84:16:b3:af:0c:29:b5: + cd:69:96:f2:7e:20:6f:78:80:be:be:e8:3d:27:c2:d8:58:de: + 8c:f5:bd:fc:be:fd:66:ee:19:37:57:25:cb:fa:ee:cc:0d:16: + fa:81:15:df:ce:74:1a:52:55:df:02:17:50:45:10:6c:d4:bc: + 57:2f:bc:21 -----BEGIN CERTIFICATE----- MIIE1DCCA7ygAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBozELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHzAdBgNVBAMMFmNo YWluSi1JQ0EzLW5vX3BhdGhsZW4xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNz -bC5jb20wHhcNMTkxMDExMTgzMDMwWhcNMjIwNzA3MTgzMDMwWjCBozELMAkGA1UE +bC5jb20wHhcNMjAwNTA3MDczOTA1WhcNMjMwMjAxMDczOTA1WjCBozELMAkGA1UE BhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTAT BgNVBAoMDHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHzAdBgNV BAMMFmNoYWluSi1JQ0EyLW5vX3BhdGhsZW4xHzAdBgkqhkiG9w0BCQEWEGluZm9A @@ -256,12 +256,12 @@ gaQwgaExCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQH DAdTZWF0dGxlMRUwEwYDVQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2lu ZWVyaW5nMR0wGwYDVQQDDBRjaGFpbkotSUNBNC1wYXRobGVuMjEfMB0GCSqGSIb3 DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIBZDAMBgNVHRMEBTADAQH/MAsGA1UdDwQE -AwIBBjANBgkqhkiG9w0BAQsFAAOCAQEAW1bNXvw6+yu+fGOtp3vkmgB4y9jmAEE9 -PeP2Q3h118kHYQwrQ0aPEqNa8D0i9HLqJxpwV0jF7H0A3V2DpnH3kOxpvS6Glwbc -nL5OqEyf25Ne/di6rolVZRbPq6WkTq4hzl7gkeF33uO0PbrSEvNUwFCUFuWyYnFY -AyzR9B/OnaXOKlef9xlBsE3oJ13y5shEG8NXUXbUFRoFMWHDAttWgR4k8iMEqVox -7ggdCB9J1yy6HgBa5VeL/aqkL2rXkxkJkjB9lWg7t86j8rnk5ORIpCJrADORVij8 -UPcd9nBbg6iZmC16bKqbWqVWW4mVqFAnaM5jXtOEy4Abrj6iXBOb/w== +AwIBBjANBgkqhkiG9w0BAQsFAAOCAQEAVFf6WMeuYFWffkEsxNyNtvj7z9PqyYgO +mshR8iuP5WyhlkAcDcuuqIoLq+j7gxtP1F7pkpRwqBvYEGKlg80OJ5EmTx3GzjZS +JpIowOjrxdOIqNX9H7As5OLz0R/Y43x2q/eUX9ifnjSegJxQgebMxsvWfN1Kqd0i +AXm67yCbiXKmyYnyaP12plX6e0q96lPtr3wHgSPHcS3Mrh2+bl13CKSqNpKNIK9d +bOfucuKJnEERW+JCNW8MoEEQkyrlV3+EFrOvDCm1zWmW8n4gb3iAvr7oPSfC2Fje +jPW9/L79Zu4ZN1cly/ruzA0W+oEV3850GlJV3wIXUEUQbNS8Vy+8IQ== -----END CERTIFICATE----- Certificate: Data: @@ -270,8 +270,8 @@ Certificate: Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainJ-ICA4-pathlen2, emailAddress = info@wolfssl.com Validity - Not Before: Oct 11 18:30:30 2019 GMT - Not After : Jul 7 18:30:30 2022 GMT + Not Before: May 7 07:39:05 2020 GMT + Not After : Feb 1 07:39:05 2023 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainJ-ICA3-no_pathlen, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -309,27 +309,27 @@ Certificate: X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 38:56:e6:30:a8:f8:db:32:4c:53:e0:8f:c5:08:98:3f:ce:bf: - b1:04:b0:52:24:63:6a:14:86:41:08:13:78:aa:98:7e:07:9b: - 1d:22:9e:61:b6:69:fb:f9:24:a3:8e:4b:f2:1f:39:6a:0b:a1: - ff:1f:9b:65:7c:7f:85:8c:d8:ce:3d:83:93:4c:00:4e:7f:d0: - 44:53:b1:a8:7d:bf:43:f1:d7:f2:2c:86:20:b8:cf:11:39:bb: - 7e:21:28:ca:20:4b:0a:46:97:d3:c6:82:2c:4e:25:8a:e4:92: - 84:da:c2:9b:15:3a:5c:8b:fc:a1:b7:76:f9:e8:80:79:1f:fc: - 4f:d4:18:f1:17:fa:19:87:4d:3c:81:e1:82:ce:e2:5c:d2:c0: - cd:e8:44:5a:dd:f1:41:5f:a2:df:27:a9:d4:4e:f7:2c:7a:8c: - 5f:dd:f2:3e:e3:c5:1f:7b:5f:0e:6f:9c:9a:c8:eb:63:0f:98: - eb:7e:e6:89:56:d9:c7:f4:6d:20:d9:0f:a5:81:82:90:90:95: - 53:62:80:9d:e3:93:44:4c:33:00:1e:b9:c8:b2:13:53:d2:a3: - 18:96:86:40:92:74:bf:a9:8e:77:ff:a8:3b:7f:c6:92:c8:b4: - 4e:6c:17:7f:36:9d:f6:64:11:f9:26:5e:55:09:36:fe:8c:84: - 81:08:0e:a3 + 60:6c:d2:1a:ea:b9:91:d1:e4:7e:03:d7:3c:60:73:0f:c7:7d: + f2:0d:99:40:2e:ba:f5:5d:17:0a:e1:65:1f:00:1f:37:a2:3b: + 0d:f2:eb:0b:b9:ec:6d:1f:bc:5f:f8:87:b4:b9:d7:23:15:78: + 7b:97:f2:d0:84:22:2e:6f:2e:08:0d:a1:1c:1c:f6:71:79:60: + 65:ed:1e:a8:14:0f:4a:3d:2b:f5:50:9d:89:09:20:b6:4a:03: + fe:7d:f9:03:7b:4d:c4:74:b9:c7:66:b5:69:1f:1b:d3:01:b5: + 1e:c0:27:5c:fe:2d:c6:aa:1f:b0:c9:14:28:62:41:4a:f0:ad: + d4:49:7b:ca:74:75:12:3b:b2:f4:06:90:d1:80:ca:33:3e:57: + 91:6b:c6:b4:de:24:3e:86:86:20:62:01:d6:a2:e9:3f:2e:11: + ca:7d:f9:2b:46:e4:b4:fb:f0:fe:2f:f6:93:94:a3:9f:9f:14: + a2:54:33:90:3c:31:6d:1f:99:54:a8:7e:7e:e6:7f:06:a8:9d: + 53:93:24:c8:20:e6:3c:74:a6:ba:fc:be:8b:f6:3c:53:94:8e: + fb:34:24:4b:71:5f:c0:33:80:79:22:7f:0e:ce:6a:8c:5e:63: + fc:96:90:d4:2a:26:2f:3c:7a:06:b8:4e:30:89:4d:b9:c7:19: + 52:6e:98:82 -----BEGIN CERTIFICATE----- MIIExDCCA6ygAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBoTELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNo YWluSi1JQ0E0LXBhdGhsZW4yMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTE5MTAxMTE4MzAzMFoXDTIyMDcwNzE4MzAzMFowgaMxCzAJBgNVBAYT +Y29tMB4XDTIwMDUwNzA3MzkwNVoXDTIzMDIwMTA3MzkwNVowgaMxCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRUwEwYD VQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2luZWVyaW5nMR8wHQYDVQQD DBZjaGFpbkotSUNBMy1ub19wYXRobGVuMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdv @@ -345,12 +345,12 @@ gZQxCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3pl bWFuMREwDwYDVQQKDAhTYXd0b290aDETMBEGA1UECwwKQ29uc3VsdGluZzEYMBYG A1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZz c2wuY29tggFkMAwGA1UdEwQFMAMBAf8wCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEB -CwUAA4IBAQA4VuYwqPjbMkxT4I/FCJg/zr+xBLBSJGNqFIZBCBN4qph+B5sdIp5h -tmn7+SSjjkvyHzlqC6H/H5tlfH+FjNjOPYOTTABOf9BEU7Gofb9D8dfyLIYguM8R -Obt+ISjKIEsKRpfTxoIsTiWK5JKE2sKbFTpci/yht3b56IB5H/xP1BjxF/oZh008 -geGCzuJc0sDN6ERa3fFBX6LfJ6nUTvcseoxf3fI+48Ufe18Ob5yayOtjD5jrfuaJ -VtnH9G0g2Q+lgYKQkJVTYoCd45NETDMAHrnIshNT0qMYloZAknS/qY53/6g7f8aS -yLRObBd/Np32ZBH5Jl5VCTb+jISBCA6j +CwUAA4IBAQBgbNIa6rmR0eR+A9c8YHMPx33yDZlALrr1XRcK4WUfAB83ojsN8usL +uextH7xf+Ie0udcjFXh7l/LQhCIuby4IDaEcHPZxeWBl7R6oFA9KPSv1UJ2JCSC2 +SgP+ffkDe03EdLnHZrVpHxvTAbUewCdc/i3Gqh+wyRQoYkFK8K3USXvKdHUSO7L0 +BpDRgMozPleRa8a03iQ+hoYgYgHWouk/LhHKffkrRuS0+/D+L/aTlKOfnxSiVDOQ +PDFtH5lUqH5+5n8GqJ1TkyTIIOY8dKa6/L6L9jxTlI77NCRLcV/AM4B5In8OzmqM +XmP8lpDUKiYvPHoGuE4wiU25xxlSbpiC -----END CERTIFICATE----- Certificate: Data: @@ -359,8 +359,8 @@ Certificate: Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Oct 11 18:30:30 2019 GMT - Not After : Jul 7 18:30:30 2022 GMT + Not Before: May 7 07:39:05 2020 GMT + Not After : Feb 1 07:39:05 2023 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainJ-ICA4-pathlen2, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -391,34 +391,34 @@ Certificate: X509v3 Authority Key Identifier: keyid:27:8E:67:11:74:C3:26:1D:3F:ED:33:63:B3:A4:D8:1D:30:E5:E8:D5 DirName:/C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:86:FF:F5:8E:10:DE:B8:FB + serial:3F:32:13:52:92:C6:DF:4A:D5:42:05:6C:B0:B2:2E:46:C2:F8:B8:67 X509v3 Basic Constraints: CA:TRUE, pathlen:2 X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 0d:bc:87:df:e4:68:a5:56:54:d2:89:42:d8:b4:1b:45:6f:88: - b2:39:d1:ad:38:f4:0b:68:5e:e1:3e:88:60:4f:69:be:a8:ee: - 1d:14:08:69:86:ee:6a:08:42:35:6e:44:4f:5f:be:13:00:81: - ca:41:a7:70:d3:48:9f:60:03:14:a4:4b:7f:35:7e:6d:94:0b: - cf:63:00:fe:8e:54:2c:4c:ac:fb:ef:4c:68:91:9a:0f:45:3e: - 07:12:f2:74:e6:83:36:8e:61:49:f9:03:17:e2:16:72:eb:6b: - c3:c1:7b:95:37:31:1f:10:b9:fc:7b:e4:54:d4:4f:81:a0:f8: - 0e:be:99:43:50:dd:19:7e:f9:41:8b:0d:2e:b2:e5:2c:ec:9b: - 20:42:f4:3a:da:03:99:bc:c1:c2:6c:69:4e:8e:6e:ad:22:57: - dc:2c:1a:e3:4f:15:c4:b3:b4:5d:2d:be:d8:62:0a:a4:c9:62: - fb:9a:53:26:ee:8f:8e:43:a6:e2:77:9b:1f:1f:4f:86:b5:65: - 22:3c:0d:f7:75:ab:24:2d:5b:6f:96:3f:26:22:b0:de:b2:4e: - 37:fd:f9:9a:22:81:15:91:c5:b0:54:f2:ee:f0:e9:7f:23:ab: - 43:1c:43:e1:e4:bf:61:20:13:f3:4f:b6:71:77:a3:23:89:fb: - 02:c2:24:5e + 51:21:92:8f:59:88:72:3a:6d:36:06:83:3f:89:d0:e0:91:19: + 99:3e:3e:be:16:4e:0a:fe:9e:ef:1e:f8:a3:e2:aa:53:95:68: + fa:f9:09:fc:dd:54:f2:9a:1e:75:67:90:b9:54:58:bc:4d:03: + 6c:15:b4:11:c4:d1:f7:1d:6a:b4:84:21:3e:1b:c3:be:08:95: + 6d:8c:f6:91:42:4f:0c:cb:56:ce:ae:47:ef:f7:ac:92:76:f7: + 59:03:aa:a4:be:95:fe:b4:4e:b1:72:10:2f:58:07:d5:e8:9d: + 3d:b1:70:ee:52:8e:33:da:e5:94:c1:03:c4:1e:d2:96:3a:23: + 7d:d6:34:6d:98:13:c0:c8:3d:bb:d3:32:da:66:33:03:64:ba: + 25:1f:96:d0:e0:62:b9:98:4c:ba:ab:51:68:af:a0:17:34:21: + 6b:2b:73:96:98:cf:74:b9:26:c8:68:96:18:97:30:dc:d3:eb: + 2e:fe:04:4d:b1:43:cb:8f:29:9d:40:f3:92:ed:ef:16:3a:2c: + 96:6e:7b:c3:a7:e7:0c:16:c2:de:9a:c7:75:8e:89:93:64:82: + ea:ed:10:7b:4c:71:d2:3d:40:97:05:68:cd:2d:5e:a3:c3:fa: + 19:97:a8:21:c7:a5:a6:e1:d4:a5:63:4e:b4:e1:3f:25:02:0f: + 2a:78:69:d6 -----BEGIN CERTIFICATE----- -MIIEwTCCA6mgAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx +MIIEzDCCA7SgAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx EDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNh d3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cud29sZnNz -bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMTkxMDEx -MTgzMDMwWhcNMjIwNzA3MTgzMDMwWjCBoTELMAkGA1UEBhMCVVMxEzARBgNVBAgM +bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjAwNTA3 +MDczOTA1WhcNMjMwMjAxMDczOTA1WjCBoTELMAkGA1UEBhMCVVMxEzARBgNVBAgM Cldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoMDHdvbGZTU0wg SW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNoYWluSi1JQ0E0 LXBhdGhsZW4yMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMIIBIjAN @@ -428,16 +428,16 @@ Jo/8HgYX8N5Yh+8eppESOWilBfOMZ8nlmRik/JA/vabK8qbdteaTyxSJgzyIWjGr 42YqG4fFhQNFsM7hD8EPknDXrGXqqAnB/h3bt+fdmNPGsRa0VFjBqrqhzxkUp+RV ptq7H57RhQDgjUrE0oYIdf3YHoUhbCePGNVEc1irlHVKNj2NTcZ6hp0A28W6vnAC g79u2DGJs/IWmL4n9hRa6dRyZ42p33YnvxmsIFkoWxtC2dVbbftuol7T6QIDAQAB -o4IBDTCCAQkwHQYDVR0OBBYEFPwYE1K7M0rbHFvRgJg+QIaVWHL5MIHJBgNVHSME -gcEwgb6AFCeOZxF0wyYdP+0zY7Ok2B0w5ejVoYGapIGXMIGUMQswCQYDVQQGEwJV +o4IBGDCCARQwHQYDVR0OBBYEFPwYE1K7M0rbHFvRgJg+QIaVWHL5MIHUBgNVHSME +gcwwgcmAFCeOZxF0wyYdP+0zY7Ok2B0w5ejVoYGapIGXMIGUMQswCQYDVQQGEwJV UzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjERMA8GA1UECgwI U2F3dG9vdGgxEzARBgNVBAsMCkNvbnN1bHRpbmcxGDAWBgNVBAMMD3d3dy53b2xm -c3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIJAIb/9Y4Q -3rj7MA8GA1UdEwQIMAYBAf8CAQIwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBCwUA -A4IBAQANvIff5GilVlTSiULYtBtFb4iyOdGtOPQLaF7hPohgT2m+qO4dFAhphu5q -CEI1bkRPX74TAIHKQadw00ifYAMUpEt/NX5tlAvPYwD+jlQsTKz770xokZoPRT4H -EvJ05oM2jmFJ+QMX4hZy62vDwXuVNzEfELn8e+RU1E+BoPgOvplDUN0ZfvlBiw0u -suUs7JsgQvQ62gOZvMHCbGlOjm6tIlfcLBrjTxXEs7RdLb7YYgqkyWL7mlMm7o+O -Q6bid5sfH0+GtWUiPA33daskLVtvlj8mIrDesk43/fmaIoEVkcWwVPLu8Ol/I6tD -HEPh5L9hIBPzT7Zxd6MjifsCwiRe +c3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIUPzITUpLG +30rVQgVssLIuRsL4uGcwDwYDVR0TBAgwBgEB/wIBAjALBgNVHQ8EBAMCAQYwDQYJ +KoZIhvcNAQELBQADggEBAFEhko9ZiHI6bTYGgz+J0OCRGZk+Pr4WTgr+nu8e+KPi +qlOVaPr5CfzdVPKaHnVnkLlUWLxNA2wVtBHE0fcdarSEIT4bw74IlW2M9pFCTwzL +Vs6uR+/3rJJ291kDqqS+lf60TrFyEC9YB9XonT2xcO5SjjPa5ZTBA8Qe0pY6I33W +NG2YE8DIPbvTMtpmMwNkuiUfltDgYrmYTLqrUWivoBc0IWsrc5aYz3S5JsholhiX +MNzT6y7+BE2xQ8uPKZ1A85Lt7xY6LJZue8On5wwWwt6ax3WOiZNkgurtEHtMcdI9 +QJcFaM0tXqPD+hmXqCHHpabh1KVjTrThPyUCDyp4adY= -----END CERTIFICATE----- diff --git a/certs/test-pathlen/chainJ-entity.pem b/certs/test-pathlen/chainJ-entity.pem index 35c5f6367..3ae787378 100644 --- a/certs/test-pathlen/chainJ-entity.pem +++ b/certs/test-pathlen/chainJ-entity.pem @@ -5,8 +5,8 @@ Certificate: Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainJ-ICA1-no_pathlen, emailAddress = info@wolfssl.com Validity - Not Before: Oct 11 18:30:30 2019 GMT - Not After : Jul 7 18:30:30 2022 GMT + Not Before: May 7 07:39:05 2020 GMT + Not After : Feb 1 07:39:05 2023 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainJ-entity, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -42,27 +42,27 @@ Certificate: X509v3 Basic Constraints: CA:FALSE Signature Algorithm: sha256WithRSAEncryption - 10:a0:e0:ea:4b:df:4c:5b:92:da:6b:13:5a:4b:e9:46:1a:17: - 48:42:5e:08:c8:28:e4:ce:69:46:25:55:70:57:bd:4e:b2:0b: - a4:75:22:b6:5b:d7:e0:54:3f:31:14:99:09:c1:3b:6f:b7:59: - 5a:52:67:46:0c:4f:ec:fa:31:4a:6e:59:04:50:99:60:1e:74: - ed:3a:ac:4d:cd:98:31:4d:b1:54:07:3e:76:bb:92:e2:1d:53: - 65:08:38:e3:4d:b0:d8:74:14:5f:00:94:e7:d2:c9:9d:80:23: - f5:9e:3d:8c:22:72:b3:20:5a:01:a3:02:f2:9c:cc:b8:1d:73: - db:eb:cc:cb:27:4f:75:17:1d:23:68:07:4f:15:be:00:cc:a9: - 2a:14:82:2c:0e:e3:92:40:dc:62:ac:d9:61:24:99:19:43:d5: - 3e:85:ca:e5:6d:e1:76:9a:4e:01:ef:34:98:7a:1b:ca:8b:c3: - de:99:22:75:28:11:0c:17:7a:58:7b:44:33:22:58:61:24:8c: - 96:a5:a7:63:19:31:6d:61:83:1c:5f:50:66:48:29:b4:2d:8e: - 5e:f3:63:85:e8:9c:d8:6e:93:4a:4d:ff:b1:d5:60:96:d0:9f: - 4e:3f:6f:c9:b4:e1:04:b8:ef:55:c2:77:c1:e1:50:d0:a7:b8: - 9d:a3:81:71 + 94:3f:3c:06:04:ee:37:70:7f:f8:37:6b:f1:50:f2:1c:40:e0: + d8:c0:ab:f9:ae:64:43:b3:bc:25:30:93:a4:e8:d7:93:56:30: + d7:93:7b:b9:3f:2c:af:34:c8:2c:f2:42:25:08:66:b8:90:12: + 19:cb:a1:b9:15:20:7b:0d:ad:7a:36:c0:47:f7:bc:d8:c6:d4: + 4d:be:9a:2e:de:ca:81:fb:52:64:9e:c4:96:c9:91:be:cb:fe: + b7:44:d5:df:f4:44:32:fa:43:a0:bc:c9:0a:1d:7a:ce:1b:f7: + ee:52:1c:df:db:81:2c:01:4b:65:fb:5d:2c:68:a6:a6:8d:d3: + 70:73:24:43:0a:89:dd:2f:e7:37:84:e2:b5:28:b6:9c:1b:d7: + b6:ae:e5:71:be:24:fc:5e:61:a4:a7:75:cd:fd:10:95:78:64: + 5c:f9:13:cc:9a:c0:e5:fc:13:e5:b3:51:e2:a2:27:86:03:c3: + c0:ce:a3:56:c2:2a:73:12:60:82:66:27:19:4c:95:61:0f:6a: + 56:43:11:fa:2a:78:a8:5e:1d:92:e2:54:19:53:46:ca:1f:71: + 56:02:59:d2:20:a4:06:31:03:34:e1:0c:db:3e:0a:8e:52:ec: + ec:76:73:b3:8d:6c:21:7f:54:16:bd:ed:41:65:ba:c0:0e:5f: + 08:9e:6a:0c -----BEGIN CERTIFICATE----- MIIEvDCCA6SgAwIBAgIBZTANBgkqhkiG9w0BAQsFADCBozELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHzAdBgNVBAMMFmNo YWluSi1JQ0ExLW5vX3BhdGhsZW4xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNz -bC5jb20wHhcNMTkxMDExMTgzMDMwWhcNMjIwNzA3MTgzMDMwWjCBmjELMAkGA1UE +bC5jb20wHhcNMjAwNTA3MDczOTA1WhcNMjMwMjAxMDczOTA1WjCBmjELMAkGA1UE BhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTAT BgNVBAoMDHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxFjAUBgNV BAMMDWNoYWluSi1lbnRpdHkxHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5j @@ -78,10 +78,10 @@ A1UEBhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUx FTATBgNVBAoMDHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHzAd BgNVBAMMFmNoYWluSi1JQ0EyLW5vX3BhdGhsZW4xHzAdBgkqhkiG9w0BCQEWEGlu Zm9Ad29sZnNzbC5jb22CAWQwCQYDVR0TBAIwADANBgkqhkiG9w0BAQsFAAOCAQEA -EKDg6kvfTFuS2msTWkvpRhoXSEJeCMgo5M5pRiVVcFe9TrILpHUitlvX4FQ/MRSZ -CcE7b7dZWlJnRgxP7PoxSm5ZBFCZYB507TqsTc2YMU2xVAc+druS4h1TZQg4402w -2HQUXwCU59LJnYAj9Z49jCJysyBaAaMC8pzMuB1z2+vMyydPdRcdI2gHTxW+AMyp -KhSCLA7jkkDcYqzZYSSZGUPVPoXK5W3hdppOAe80mHobyovD3pkidSgRDBd6WHtE -MyJYYSSMlqWnYxkxbWGDHF9QZkgptC2OXvNjheic2G6TSk3/sdVgltCfTj9vybTh -BLjvVcJ3weFQ0Ke4naOBcQ== +lD88BgTuN3B/+Ddr8VDyHEDg2MCr+a5kQ7O8JTCTpOjXk1Yw15N7uT8srzTILPJC +JQhmuJASGcuhuRUgew2tejbAR/e82MbUTb6aLt7KgftSZJ7ElsmRvsv+t0TV3/RE +MvpDoLzJCh16zhv37lIc39uBLAFLZftdLGimpo3TcHMkQwqJ3S/nN4TitSi2nBvX +tq7lcb4k/F5hpKd1zf0QlXhkXPkTzJrA5fwT5bNR4qInhgPDwM6jVsIqcxJggmYn +GUyVYQ9qVkMR+ip4qF4dkuJUGVNGyh9xVgJZ0iCkBjEDNOEM2z4KjlLs7HZzs41s +IX9UFr3tQWW6wA5fCJ5qDA== -----END CERTIFICATE----- diff --git a/certs/test-servercert.p12 b/certs/test-servercert.p12 index c85fdd27920792f450a379f825e30978dc693687..cdf47184290e52cacc3d71a29ab2af7d646ff10e 100644 GIT binary patch delta 5385 zcmV+k753_#DXl6%FoG2+0s#Xsf)wut2`Yw2hW8Bt2LYgh6yOAc6x=X^6xc9=503^3 zDuzgg_YDCD2B3lufG~m&d;$RgFoF+tkw6`P%8p#e9R&tj0s;sCfPxQ5vzDHvUeYT& z?LP@~EwIkX{4*rH0?`{#+j?0RrrhPX zg1ib|!k)^$`$g zgc=gwglp84El{e7PJ&-^3$AI6+9MP$5(}Ef6Ea>t2m1MO-v;|(s!{}Q>qKv$HP~xq zZT;p($Q+lH;KKCq0EJzXN@@ATBxPc7>i4)KgtRI48?-?W9vUsAqWxwlfQYJpvesMy zB|aFd)6TiINUm0!x&M|aj0w9Q!p2wBZo3v|+*ZYJ?AE`0%yY>2@{J4iyopa$->38# zT0R?@Tb`I~ghc7F(E*qEV|AmFe?m^FjrRd0mC{QqA}jvaH~$Eb2ToDbjdxJq`d%&V zueN!k@}LQcdpXJd#^p=5eb}LY=u_F~{U}Fgz}-(0hK$6xV{jTQAHKyq?zwO&O`VtQ z9ad@zA5N3_8aY8E^CIRjBp1w-S$CJ6qbzT4koRSN;tPQB@otabT0Z!zS^w58A(uyT zjp|>v@9&Y$AIM~|@(eynG3`=8R9i?Xw3#8_f;bC%aA)HSx+->J@%6fYVcA}Pdc)DO zDN!f>LHoyaqXT$1{kY%YX|NSty3cB{P*;$A?>_Q^7oXBZJ(w9Hpn&VI?Qx*l0;xvf zz8*G%4abaX`9?`yKgb(^*IT+2Rr*H$58(RuR{-zA<{_9|X4#!dkFM{k4=qfZSm)&R zM!hhL?}ZLj((v*MKKE9C3_9KUBj2IrMBA?iK@`eh&IG@b2czA40;}5QMn41Sb(lc^ zhOO-VGZ;r-o=MTZ>HR2ra~`OU=apFU&<-)Y%-{V~EHIh^RAW`zRDBn9-FS=yX$!gu zja|NUuZq-S$*V+PpUQOIOx8nJbBZ8?={j!vpbDU|^aVo_K(5(;_|8s0X)w)lSNr_5 zUb)1#o&t`01LVW4FP27SCTj^<_=Qf`BUK2F6o4~o;Qzc^dw8Ex(#qQe3+667is zTG;iNvD31qWD-Sx6l*37N7FfdQ0e|_YKQN`@oJ!zw_jwR*O;mopI{95ga=aI@httfarvXilFFi z1A|o^T|0pHCt!uY?(52buBGpU+h^>kGnam$jWL^F$jPM^Do3GQKbEKfvS5w_bTf<1Q*i`us7-UltqfW{NFEHgp zZ`9SP7M{SN_i8vvhv^Vr()Ffo3(rQ57oH7fq649_YIgof{l+DTxoq2Wb(^&Kr#KHlDTN9aI(W#I|YoIM3U?|W%Fa^(|buGUaw$&1;3ZBV*#8%>i; z?^ML9&3N2^ zS5`@nxs)|+C)suZWQoMfOqvJOsdjGOt%fc-#%vchCXTSOc6n5dor7lryUfkGKc%Yp zgz_Fo>d^WGN5CP9Li@qQVwHmEa=H6cEMI-#w<&zw=TTpgRr*;K8i*(R#ZF1p7|2)WDA&m;$+2SpqKq31*&M)2V>?Uh0&Q{*L<4THfBTu;du|vX z*qsyrr*^!Y8>^^R<5XSWD;zHNC)V?J*bTv5U~YZhHw&9mygv^+Bcn!5hv7x}`sU8_QW zi93n2fr*%t^Mvb2epP(?@^zh%+&1N>vTX!O0TrD5!{SlgeUL(2-0%Q%#$YJ8%)yO+ z^gdiN9+xbq=c@vfisY?ZzBeABfEnRqixA}ei5!g>9?9C*?<=81nKdg}!4h`CTH99 z&sulHg~IgAW#=JnRx4-M-;SPm6GeYx!mUKOtuWAq95Jpq>J#^Dsg5ZSD6BLPA#9(eYqjP*SmL zXw>xQsXDJ%3%pg@omsXgme$UZE5|3nEzl&m=!X^o#N>CKaO z-A66|(jH#*)n=?5cI_8`CBXgJhPg<`O(jYYSMs6M>}&t48WVqo|AHnpZ~xE@hvAZR zuemi0q{a{|oVSFQxM}lubh`?$Y0O6yXn!CVSETof?)>2d+B5n*lJ=umx!1Vxw8{_C zQWQ1v`xo4;V`I8WnfieifiB`mX9Q~8Jg@BjO?x$^@in|HV>o1gU;PIfmM8^@_dLF0 zJO^h*Y=N%AsS0ZA_K>xsMp4^*oFnUlHhiAVd+MU^qD?*B31I*)I(%-=qk=`DKi>~? zv!?UD74Cmp$#OTShBG`dXegx?N#tK69)hbaKe>ab9MLp{j3ngr_0mK(h+ZXXr$F~6 z$FP4zrN$y6thkCBPcybJ}WFrghvJA7N& zm&NC9>YKT9SnWQarBQ6)xqd3cx(ckjYd=Gffk-e}utgs(Qj}54w)tCQD(xxYb~%q9 ze%c_tt*lhiX{l4qOZGInx7fZQr*7!`0CM%$H_pMbW_2rnTo=P1)EU}}4rn{x*xY6i z3u%?>p|8ZIVq8g78f41J+}u@V>EHVqaxz#(2@ZseRE+*(gQ1@xEyCL@i-=90B#)1m zq>cFH^FP&ot2#CpUEAVYsbCOLxQ8)XI@RwGXUTMkE0CCeEz<2N8UIIlrIr>w3q82n z;N%1jR`}I_G7>*AihZAW_UGm=Ps>m>8DozfBgZ7SQ`L_$Kjf2bakBuhm8-tau6|+qbSw)Ud*-e z+Y-nW?gACLLZ<8Ee-Z`m?mp#+^fZp7#s=c3wVXpxMbC!yfN8NGI?^)z<|cQXBMWWf zT#b8wuR_{6L5N;hO&PIj%uA!07laqJscuX<{)bl&=Xi^x*OcfhX2TkW z;OX3ZnYtyb(<6{}9mDWZ@p^0c&Psf;?1N$=XTw`n0k_VqXfF`KlMHHh$|gAA+^?Hz zzGL=O`bD(!@?BnUmQA91<+u-UFcHt0- zA9zKavn~^CeMBbtg1w;(#9%Mh_&z?adL5)_#3xG0PJs6%gk})T?^1;qr|0V+?Ueu@ zx!{Pa&8};>Oh`B_q1uoGUmdaLVjg7s($y`hCTDy_a~Cjz1wjT0DuzgtE)P9_Y4^86 zt6mhY0s;sC1cC&}Pc7*#%2KBBfn=-$N%BY>kJZs$Gp4_4?E&_1=rn!(CAt9<$QV8& z_zl4Yc8SE1U z-G?6(>g-QK@RPV{g&E^hbdfI4z8fY$*(taoFcu$oQUKIwxQ`7^Q}h7!2j0k{5>W-O zuB5qYUA^bXxOK|+jxh}%a!9nv**OJviYgmVp~WBIO^<0=WsFZeeNk+G?9Q;|r9oj3 zJOkFt!-woNY@}KDP1N=Ozip&!tu{w*%@TqgzEY{`{hL&((>z!!W>te+|JLfEw(6YG zqrRamhmMcm@@pBf4~Jsb|Lc(sA>u&DZSm49|Csw{yRzY2xu9KQ(-;NJ?kjH`QEQTc zr$bhE#Mz|o$vZvBC*{t6sN%FTYant*;^k|jWna>2!UBCWd9nauz|Bnqi*Q_gT?20d zBQQ~EIoYhRH9m@X`5#{rY>MY64g{mnIjXYlSUQEI`p!uzpR!6R|izT1{D#c0U39pd=>3+`FrCQ3}i7A;AC{Z;IDgo!-U-TN5^xhyk` zBb1O!t69CkIpO5c^<_kju}_nVz^gFUr!BD3spF{(Z{;9ud{c1s2V$?Jme?dFhZyy8 zC36T;K$37+Bg~;C<$IQ~{HROcELc4*IxFUS-V2^hA6e>8>XHb6eP$kZVbBdInuS=-MLWtqKB-$IXL?6# zJF_|oyuNCRo#>D(w)UuAxmEDC%=*u-Cmf-P;{Cb7s10V2meslAk8q(I5k0*R4=^sT zAY5jbd#D$lITZI}KQLOsrM7;zN$D2F|G>Tn5P0tkoM8FR)iIqhpYw?71|V5&3juudH02Xdo1 zmTUHZjfn{&Rzv&Z%DRnFkhm^oU;o;*OZjg`O=45laV2J~Leo&MVQq>O59?8)Bnb&! z5#Q1aluEIpBGoSd`vZbO-v7lMOIqhr1x^zv%=B)pKC_gCb4H0s;sCVVQNz delta 5257 zcmV;46n5*aDxE1nFoG1B0s#Xsf)rl{2`Yw2hW8Bt2LYgh6i@_$6ihIJ6i6_F4*v!T zDuzgg_YDCD2B3lt@Gyc7>;eG*FoF){kw6`PCGONX3hh|d0s;sCfPxOV@+x9DR)y@? zfSrX`xY56Qzpyl!ERz^kQGOsAjec;tI-?_CwHn9Uk5V3Pw)!F+V$kqQ2Kp%KkA@3B z3SV1Tdv`d8bL6G)^K9q2hP;hq{rTPI=!&pRi zjdvfyawXT>iryQ+6DnwkgIkmR4bFal%JQ8QeqP#MI&D5bz5a3uxsEvXBEI&z#5))9 z?gPkN4gn^$V)pCy%6bu-u*5|>WbIvacf2!8<0KL&mt4PO=%}MsU+ca0Xq2~*n9upR zM$OH}v=t$=J#5X7ac!yaz!a0crxqcfVsJ=&*Lf9*DZj^Kvh z4ddjv)&3i0uC6S=Ca%;`Qc{7mqI0&^n(pc3@8z}QJ&ESTq*wge@sxuM|ofqu4VW?=rUg&CX@ziVcZ=D_OLH$S2z~!aPQ<5wXaVqtr#EWJlGBHV zt6mxJ@gqk?j@#4OPhZspX*$$82VsUZsIL28A-2bxHGZL$M^kcqZ<_>vA3qJkFJ6JW zy9v+sgnC$|zgg&>3ie?mH_GihE=|%4+(&Y#@NU*|-JG4ZFcs zv;%SMX5xwk1cfo@1tW*f-0jwHdD<#JTOJ}9q8Ea3V{_$ zGt3Gqp;?0Gi&-HvLrw#K86GQ~4HJybIA1h*=1)bI!`T>SJg+&~{IVLIc^UFejOxWK z;B^m+%P!aQgbjPfA9pK=pszkf<<%yH5eHr17!n#g+!fS1zdEPm@JkP_ z;zb2kS^Jw)}a|XXBcNl;CvITQw@9&3+0>;;(-}7y$RK_ zf5H6m@X!@`kDCX7*$iR5UJ{@$InV}#2qjz9#6tN(y%HIFPjK@}58OGW&bK83S1J?n3p{@$kVMJO<2?v=d^H=bv=F2;dk`8^ZJ;3qE&?0{CBBKR( z?&yYR$=xTXt46>3yL&=})`a-uyCF@JjTH)Jq2~I<6Xgw<4F&Ci?ijF<`Ts%&viL_d z7o3MdS=rHlv^C-kxdWtO;Q^aEP6xRoNzekf_2_JC&C&u9tgFpbx7?6R0;O`r6hI7r zHwtCy!L24IP;ukM-*K4-Gptu)e6v)5_4oITHwyK5iRpfk+~3X#27=Mbeny;LLdXjq zdKhk74|SA;bf+gEa4i*bN_QB%d?q0}H#@-cA z_miengN=3QEPr0c&n7N3yVggJLA{7x(i4f5KG+G-Cq#%_8e5&!m+%+(yI|(F=;CiR zPp{>jPJf42t>ZQh(&IXapm@qZ&(2;YV{n`eYPf%N7TeyCy)b;A9*k;_9+pCPdHe?W z1O5PiYbC|!E>wKN6e9IBi>V%Jr})Z?eW`;^`?-}lG3l7%9gLJSwrw2QNCgNoW2Pe!TwbeF>YeB2j80NQ6M8hh)A`WF7K*5uMS7({tY(J zz-ylqY)yi#yQuV87iKj%%0_YB{tOp+_Y^>ojdG-ZF`l_kU8z~>AU9xs=q2utuM9*% znPDEiF`nR*u53sTG-$qiOT8Dgh9KL>97a4l5~xT>y)|T(f!yI>h1imRbPI#A zQP$}|eK}8NJHZA}ahGpHZVe_Zs9byYGbodF+(z@rm2@Sq;b`h!jcHAQGUA8UEX_W|RLrJ|^`SMt81#E# z3i{mdgvtiLFhf5>nb`Yg{=D?fEp*-I(D6bzXy6kL}03HD<(rQ(1DcQTAF% z%1zwMv}8K3#bAFg-OeM@qv1Ux6o^S5Ia>et>dMQ&7Ol1~lt%aAeo>uZ+mt|Jnz#8* z89N=nBL?}A)u(qCCjg6=GYU<4lM7jIlvw{RKP~L%F~Np-(;PnS%*z$pKohajtyZt2 z&5s92*)@h`P;^!I>pz!&P^qei$gg!}@hafl#bi0jv<@nqkz*B?pY|3_Cdpy}Wr7N5 zX^&mxhsL5aJHH4u=YX|T(91vGMOD$ky62wSb&8Ls6(U;UXi249U{*QW5i5&>FDM8N zi!QXSvXZHLKgwTkK7s9suEO8g6_s_3j1|FeY91HehmcWR@arpoavvi>1OJSrC$gRr z_mz}x&?d>?T7*6 z`3)+N6CYTtO}@*2{9b@pq;p5tZ7#mSUbgXlZaH0Mpd%~UFevk%;S{d}wUIFLcT9FYXvqV^T1g1z; zPCP|=QrhF2ffjnR%0dDCKW^+BYelh?I{x zpf(}=i#XMP4$W(RSNHYcOuTf6rWo|LO)QKi``Ck6XrNQaL^&UU^%Iv1?-A_BiK$Mp zvFu7pLasfj*YvLN|yKMH>RO?et@>!e!(y^_EWjLQI6x%TI>$b@3b*>t!Z_p}lr z)cw`gfT**hRjqUVBgG;_|CM=HBIz4=re)b+_9@8nhZ$g+=lg-_$v%9+lEp0CftEq`Jer)p--FKAO;=hfcfn zd(i>+W1)U6wG55+mUl~nrD3?X`8bEH-~kPPrgPN{@2Iyvz>?+z2agx+#(DUQ#n zLcX*Bbs&?m72qMGeos%or%J$#VDM*SwNN|HWekObwLh^BLYm8L;y;18o}z-Q$QfHj znc*V)7Hu8g5yVJ?+pAgkp_6IZf_h=@_&gRu)b!4b-jK|8*uF`*NjsP#0B5UzIU_)W zJHgnBcFPHWp`^P5w%>6fw12RP_OBuuh>m+Nbb#ut<>Pj4*%tj1;|W~AfZ%*h+DN1+ z22FK!cICV4_YUrQE&krnrg5^1oo;cSf0s;sC1cC&}SQNNb1I{QSSE4;3 zET_Rz?#G8pYypb0CKmOr1FO1fmpP)H^)^8ewYd&gb&ZGf!_gZ-qf3ePRLohOP=KiA zcsqqESx42Ss6O(q#y3L7Z|ivf2hRyLoOg@1LYio6TL=Q>38x-n?vU=hByXe+33LIquScmAE1D_zhB4J;3y;KYP822<3? z*empv{uGI7kE#KLOHwAyn}hS3!B(pIe|pHclH&L2^5}`v+B{@oDG-C;1I?9+P3LkG ziHvk!-dY>C%|Y*66~J>&`yM`jJFPEm$3N3M8@pt>L6Hq5X*f#^j;k4>B4@ASkXP{c za&48tcIS6#*j%44gpj5W;pvEPqF}TucLz);Q@%~f`av9}E?o&iZDVn*Gb9`TQB^N2 zFrx_0j};C3R*qAi{aRPfw*XUmipeA#1D-B7VK;0kiAI#uK=i}1mY&sr;Qd7;(+g&t z0;Q6nkv%oe_au;Ks_&NW_#3o}no}1#?gal4splZ2-?*S30>d%sLM{qL_5^dQiLvf< zp4ee~kG^oon|Z@Kd!556jEab4b(2E|7m&1%5>|vh2-N_%K0XoK^Gl8y03A+!4WM$= z#tYE0H*pFSkF^`#QGNSwnVG_&XfFupD?8^40tP~&pFptSVkPCP}}ZPi=H%$ z5q!zIei|t~UuESJYbVo~4U_F9EA~eq1*qUXAGCnqxzRU^n0N6!CD=9mUDOO|pCPDz z|K4~?;*!{2iLTwh^WQZ$eIs!$TTIneJGw1CuiBi>C`Xfg( z??~@3=@VlVo=kU7hcfS!qwvj+&cELuRS`gn2^=R^Z-v#R43R^+Ad>j%I0NQOX=A}y z5kfIO+$^$+gY-v#^}azykU_og6I>N~2auvl$i)|#K|*b&bz?IUv9J){Ve>3PJ~Ii1 zU{rRBX+ugXwKA*13QSw<|s%9>YAo zVFt?EG0^vP70ej*x1>+hwi{}kdgP3)L~?&C7m{fH&+Imf(u6rH@1)j?FmoiafsvMD z;KPt*Jtxh7a0y$UhVt}k0O5H6V1IpFNjd{N_MyK>Q!nt$Y_z)gER>CG(U;9IJHb5h z3ZB$~(eR*?7Avdhw0$xgMcFBs8W9m1DWB4kzx#*1;7Uw24Cx82Uo^rvc%Nw`uvEw(L8JxJp@= znI&_Pq%>y6|MeKu`wkuBL)d7hDe6@4FL%iF%|?AyOI`^?-@a- zO8(G1@b>8#)F!rzUobH+AutIB1uG5%0vZJX1Qe%M>5@&OUUa{0()YfF5f!H7!=nTU P*gexw&OPB<0s;sCF!TyG diff --git a/certs/test/cert-ext-ia.der b/certs/test/cert-ext-ia.der index a6fb6508c60523319dbcd1e7e08bf407ed2af2e6..75508bcc49b9f2cd2c83eb4a5a389477a57dafd0 100644 GIT binary patch delta 334 zcmV-U0kQu62Z;zHFoFaHFoFW@paTK{0s<5gQQKjUH8=t9QX@q!daf}G7u>Ot7`7WS zFfcVRH!wFdIWRO@7Y#BqFfuSPFgG(fFf_606#{>ips7$a7TFygbEA^2Xyo9+@%@zw zcH0jnK-7&lxMbS2bIxLq*brrp*bfNWmAu!-i(MJ*+|}EWX`qFCD87VS+S~4`+^M!X zM0bn*GX-1bsyvk6V;l5wq*uRLl*P)~g=H0w{l gmj$nVjB!JCe}LdszKXEAehp_as2$|j3kw3Q2{O%=QUCw| delta 323 zcmV-J0lfZ+2>u5cFoFa6FoFW&paTK{0s;vD#9OH9&kX+tkt4PnF*q(kh{*G;)auyyM1W#I)= z(hR#8S*g3b?bYdS*_5-{J!-UNo&t7YM=>J#j0(MX7s+40a1mqZ(T-PtIc;uYWsQbO zoQ1z#_{OgtsjZ VylQ1$wMhlkcB6EE9UzhdPG^8Tn^gb+ diff --git a/certs/test/cert-ext-nc.der b/certs/test/cert-ext-nc.der index 10438666b3d551d97f78837611b4634dde0ac363..2f933347de8de520ef6f75aadb0efb6135884e5f 100644 GIT binary patch delta 334 zcmV-U0kQu22!#nFFoFbuFoFYVpaTK{0s<6ys3N&KmGc4uAgTqFn~6`2983O@7`7WS zFfcVRH!wFdIWRO@7Y#BqFfuSPFgG(fFf_60kph1~(nKWZh!v97-`xfOL7ofgUE2&zTr)=2HOnsr3_hkp^gZ|@A@KlE8lOyUp7+7Zy$7ZH4#_-lKGeM z508H&guILxB=uS?P);!6Ka4Wzqxz_=3zl*495JulvxWsxP|h<%Y&8Im$12E9Si_uJ zP0~qYU;1r@2i}ft06caDuxa_yI?En0$s$qh;1rCZmL7~wJ$For&WBv9zBxni0duYdv{ghUvX>Hq)$ delta 323 zcmV-J0lfZ&3Hk^aFoFbjFoFYKpaTK{0s;vDhiXzRf_hvFkt4PnF*q2A~@53&FKOM2JC04 z!jPeVklDjyVG!04*Ows0CE;MDoTU)Y0$s(aE@`J?&F=Xwa(o!eoA?BfFA*%4MdZc; zdsy~wz`%!I@r0%LA!|z*OKAmlU6rULV(8-rbTmlEM1K=Bv%|<$Y*)ptLmgOF2cjRo VA$VM4qab;u25+enoYz~+;%aNCNvNH#w5+83}A9fd6+ko@y_#ZLmQt_)UXGf?QO}+AyL1)$VKDSJI z4%a9nRDCcY7j;&x+>NeEe$CE?uR7xjOdzH3mKJ8S?6JE7!naC=*NP1T|2mx4tbvVx zG*;R*d-&-^Sh5+)X`x`7jQ{bF(D!rB)u?iYgCJbSi4LUk5|u+mcVu$j?Rl;uI#U=I z*S(@X5=VBI0EqbTcwi6n0|NwYYq;k;VULq_R^N&U6_a4AAQ#MK#lT((Z$yErw1Z{M d$-wT!j>otgWv_idGmp@;h(gA{v+BzN?SN8zmRSG* delta 331 zcmV-R0kr;}2%ZQdFoFacFoFXDpaTK{0s<6rBconbYsm9x`~=cNHmI9l%#AjYBe@te zF*z_YGC4IdS{Ds6GBGkSG%zwUIW;k{^eO^>0~r|ziu4)R#UwG?tbpn&1&StSISis& z!iyoM0 zpQvCzS(0%LYh$NDW836cj0$@4Y|Npu$}AEFVhti;eX|aKaJnb4(={~j=j8LR4u4*% zXutzfAk4`4pM}YQVe$^LLuA|?gha>4j69#O@W^Wu-L ZT$X+F)nS+lDsdlEZcL-T%4KL6_Q=cS4Z8|N-*oHbEq7IzaT!}KkC z#VUTdf0``Lq!z}-#-Y{ban2TK9J42bfg6(|!@eC6AD)OZ%HJ;tDfY^7kS|}c<#mwU z{;#|njZbAADccEDGM(d|j>bXP!fiSs?K6_gRw$ZGSn++H{U4?c&o6TxReu5i%e_|U diff --git a/certs/test/server-cert-ecc-badsig.pem b/certs/test/server-cert-ecc-badsig.pem index c4991c994..8bad16b86 100644 --- a/certs/test/server-cert-ecc-badsig.pem +++ b/certs/test/server-cert-ecc-badsig.pem @@ -1,17 +1,17 @@ Certificate: Data: Version: 3 (0x2) - Serial Number: 4096 (0x1000) - Signature Algorithm: ecdsa-with-SHA256 - Issuer: C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Development, CN=www.wolfssl.com/emailAddress=info@wolfssl.com + Serial Number: 3 (0x3) + Signature Algorithm: ecdsa-with-SHA256 + Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Development, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Oct 20 18:19:06 2017 GMT - Not After : Oct 18 18:19:06 2027 GMT - Subject: C=US, ST=Washington, L=Seattle, O=Eliptic, OU=ECC, CN=www.wolfssl.com/emailAddress=info@wolfssl.com + Not Before: May 7 07:39:04 2020 GMT + Not After : Feb 1 07:39:04 2023 GMT + Subject: C = US, ST = Washington, L = Seattle, O = Eliptic, OU = ECC, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: id-ecPublicKey Public-Key: (256 bit) - pub: + pub: 04:bb:33:ac:4c:27:50:4a:c6:4a:a5:04:c3:3c:de: 9f:36:db:72:2d:ce:94:ea:2b:fa:cb:20:09:39:2c: 16:e8:61:02:e9:af:4d:d3:02:93:9a:31:5b:97:92: @@ -20,43 +20,38 @@ Certificate: ASN1 OID: prime256v1 NIST CURVE: P-256 X509v3 extensions: - X509v3 Basic Constraints: - CA:FALSE - Netscape Cert Type: - SSL Server X509v3 Subject Key Identifier: 5D:5D:26:EF:AC:7E:36:F9:9B:76:15:2B:4A:25:02:23:EF:B2:89:30 X509v3 Authority Key Identifier: keyid:56:8E:9A:C3:F0:42:DE:18:B9:45:55:6E:F9:93:CF:EA:C3:F3:A5:21 - DirName:/C=US/ST=Washington/L=Seattle/O=wolfSSL/OU=Development/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:97:B4:BD:16:78:F8:47:F2 + X509v3 Basic Constraints: critical + CA:FALSE X509v3 Key Usage: critical Digital Signature, Key Encipherment, Key Agreement X509v3 Extended Key Usage: TLS Web Server Authentication + Netscape Cert Type: + SSL Server Signature Algorithm: ecdsa-with-SHA256 - 30:46:02:21:00:be:b8:58:f0:e4:15:01:1f:df:70:54:73:4a: - 6c:40:1f:77:a8:b4:eb:52:1e:bf:f5:0d:b1:33:ca:6a:c4:76: - b9:02:21:00:97:08:de:2c:28:c1:45:71:b6:2c:54:87:98:63: - 76:a8:21:34:90:a8:f7:9e:3f:fc:02:b0:e7:d3:09:31:27:e4 + 30:45:02:21:00:99:a5:f0:5e:85:e8:0f:b3:f8:a1:df:fa:e3: + bf:78:35:1d:77:f1:e3:6a:b2:8b:c3:28:52:87:9b:5e:32:4b: + 72:02:20:2d:77:11:5f:8a:0c:15:21:a9:9e:5f:c5:a9:a6:6b: + d9:ea:c3:1c:90:8c:19:db:eb:a7:e1:64:0e:b2:5e:10:92 -----BEGIN CERTIFICATE----- -MIIDUDCCAvWgAwIBAgICEAAwCgYIKoZIzj0EAwIwgZcxCzAJBgNVBAYTAlVTMRMw -EQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3 -b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEYMBYGA1UEAwwPd3d3LndvbGZz -c2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMB4XDTE3MTAy -MDE4MTkwNloXDTI3MTAxODE4MTkwNlowgY8xCzAJBgNVBAYTAlVTMRMwEQYDVQQI -DApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAdFbGlwdGlj -MQwwCgYDVQQLDANFQ0MxGDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEfMB0GCSqG -SIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEH -A0IABLszrEwnUErGSqUEwzzenzbbci3OlOor+ssgCTksFuhhAumvTdMCk5oxW5eS -IX/wzxjakRECNIboIFgzC4A0idijggE1MIIBMTAJBgNVHRMEAjAAMBEGCWCGSAGG -+EIBAQQEAwIGQDAdBgNVHQ4EFgQUXV0m76x+NvmbdhUrSiUCI++yiTAwgcwGA1Ud -IwSBxDCBwYAUVo6aw/BC3hi5RVVu+ZPP6sPzpSGhgZ2kgZowgZcxCzAJBgNVBAYT -AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYD -VQQKDAd3b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEYMBYGA1UEAwwPd3d3 -LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tggkA -l7S9Fnj4R/IwDgYDVR0PAQH/BAQDAgOoMBMGA1UdJQQMMAoGCCsGAQUFBwMBMAoG -CCqGSM49BAMCA0kAMEYCIQC+uFjw5BUBH99wVHNKbEAfd6i061Iev/UNsTPKasR2 -uQIhAJcI3iwowUVxtixUh5hjdqghNJCo954//AKw59MJxSfk +MIICoTCCAkegAwIBAgIBAzAKBggqhkjOPQQDAjCBlzELMAkGA1UEBhMCVVMxEzAR +BgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoMB3dv +bGZTU0wxFDASBgNVBAsMC0RldmVsb3BtZW50MRgwFgYDVQQDDA93d3cud29sZnNz +bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjAwNTA3 +MDczOTA0WhcNMjMwMjAxMDczOTA0WjCBjzELMAkGA1UEBhMCVVMxEzARBgNVBAgM +Cldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoMB0VsaXB0aWMx +DDAKBgNVBAsMA0VDQzEYMBYGA1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZI +hvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcD +QgAEuzOsTCdQSsZKpQTDPN6fNttyLc6U6iv6yyAJOSwW6GEC6a9N0wKTmjFbl5Ih +f/DPGNqREQI0huggWDMLgDSJ2KOBiTCBhjAdBgNVHQ4EFgQUXV0m76x+NvmbdhUr +SiUCI++yiTAwHwYDVR0jBBgwFoAUVo6aw/BC3hi5RVVu+ZPP6sPzpSEwDAYDVR0T +AQH/BAIwADAOBgNVHQ8BAf8EBAMCA6gwEwYDVR0lBAwwCgYIKwYBBQUHAwEwEQYJ +YIZIAYb4QgEBBAQDAgZAMAoGCCqGSM49BAMCA0gAMEUCIQCZpfBehegPs/ih3/rj +v3g1HXfx42qyi8MoUoebXjJLcgIgLXcRX4oMFSGpnl/FqaZr2erDHJCMGdvrp+Fk +DrJexJI= -----END CERTIFICATE----- diff --git a/certs/test/server-cert-rsa-badsig.der b/certs/test/server-cert-rsa-badsig.der index 0dc446b099fed7776d49e860e4f2ed81711ed223..a13ba302f4e588984ca21b8eb70543c98efef5b5 100644 GIT binary patch delta 430 zcmV;f0a5;<3C#%zFoFchFoFZIkqELMGB7YTFgGwaGdVCcS{Ds6GcYnRF)%kXIWRO@ zFoBSh;Q}(V3ju`z2Z8}6FoFRhla&G?4Ace#RUIP)fy^+0$&XYHkKgw-f;BaR#qQxvh!MxS#2Sh=1p$4d7 zemXVX>FT-1k((HuHkU>3Dlk->g1&f{`T=tx0TLqqE^C2Ktvtz%1^u9s1l}!VuaA*) zz>45j2*9a}F*__`HC;~fK|jSyT<^0psZB}mW9DAiKo-CmMOV-VYymtqbq_yR_kCbS z?IRV_s4Rds*b<5MwxOi={F{BxKomS8LOihg<8n8%lfFwp%JZ3u_`RSSIjeqoC+j+| Y4atEseVt4gfMIGGU1h{95&3d|163U(1cAXYfxeT(0g)O@gOK6I}GhYAX<#Sl+8^d?E$GgPqI&Jmf7`YNnRo)4^!t(#C^Jm*U1U z4!(cH1Gxu^TeyU}#W_D5Sf^Fj@SEt;MY-dHF7CE*R=GOvKPT9C==(%SWhX~W`~Gsn ztOa`=%j;fcnyUijh+8|03&+fr z3mgd{(9M7O#9k*LpF diff --git a/certs/test/server-cert-rsa-badsig.pem b/certs/test/server-cert-rsa-badsig.pem index addafbad3..8008f377b 100644 --- a/certs/test/server-cert-rsa-badsig.pem +++ b/certs/test/server-cert-rsa-badsig.pem @@ -2,15 +2,15 @@ Certificate: Data: Version: 3 (0x2) Serial Number: 1 (0x1) - Signature Algorithm: sha256WithRSAEncryption - Issuer: C=US, ST=Montana, L=Bozeman, O=Sawtooth, OU=Consulting, CN=www.wolfssl.com/emailAddress=info@wolfssl.com + Signature Algorithm: sha256WithRSAEncryption + Issuer: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Apr 13 15:23:10 2018 GMT - Not After : Jan 7 15:23:10 2021 GMT - Subject: C=US, ST=Montana, L=Bozeman, O=wolfSSL, OU=Support, CN=www.wolfssl.com/emailAddress=info@wolfssl.com + Not Before: May 7 07:39:04 2020 GMT + Not After : Feb 1 07:39:04 2023 GMT + Subject: C = US, ST = Montana, L = Bozeman, O = wolfSSL, OU = Support, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption - Public-Key: (2048 bit) + RSA Public-Key: (2048 bit) Modulus: 00:c0:95:08:e1:57:41:f2:71:6d:b7:d2:45:41:27: 01:65:c6:45:ae:f2:bc:24:30:b8:95:ce:2f:4e:d6: @@ -37,32 +37,34 @@ Certificate: X509v3 Authority Key Identifier: keyid:27:8E:67:11:74:C3:26:1D:3F:ED:33:63:B3:A4:D8:1D:30:E5:E8:D5 DirName:/C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:86:FF:F5:8E:10:DE:B8:FB + serial:3F:32:13:52:92:C6:DF:4A:D5:42:05:6C:B0:B2:2E:46:C2:F8:B8:67 X509v3 Basic Constraints: CA:TRUE + X509v3 Subject Alternative Name: + DNS:example.com, IP Address:127.0.0.1 Signature Algorithm: sha256WithRSAEncryption - b4:54:60:ad:a0:03:32:de:02:7f:21:4a:81:c6:ed:cd:cd:d8: - 12:8a:c0:ba:82:5b:75:ad:54:e3:7c:80:6a:ac:2e:6c:20:4e: - be:4d:82:a7:47:13:5c:f4:c6:6a:2b:10:99:58:de:ab:6b:7c: - 22:05:c1:83:9d:cb:ff:3c:e4:2d:57:6a:a6:96:df:d3:c1:68: - e3:d2:c6:83:4b:97:e2:c6:32:0e:be:c4:03:b9:07:8a:5b:b8: - 84:ba:c5:39:3f:1c:58:a7:55:d7:f0:9b:e8:d2:45:b9:e3:83: - 2e:ee:b6:71:56:b9:3a:ee:3f:27:d8:77:e8:fb:44:48:65:27: - 47:4c:fb:fe:72:c3:ac:05:7b:1d:cb:eb:5e:65:9a:ab:02:e4: - 88:5b:3b:8b:0b:c7:cc:a9:a6:8b:e1:87:b0:19:1a:0c:28:58: - 6f:99:52:7e:ed:b0:3a:68:3b:8c:0a:08:74:72:ab:b9:09:c5: - ed:04:7e:6f:0b:1c:09:21:d0:cd:7f:f9:c4:5e:27:20:e4:85: - 73:52:05:d2:ba:f8:d5:8f:41:cc:23:2e:12:6d:bc:31:98:e7: - 63:a3:8e:26:cd:e8:2b:88:ee:e2:fe:3a:74:52:34:0e:fd:12: - e5:5e:69:50:20:31:34:e4:31:f1:e7:e4:5b:03:13:da:ac:41: - 6c:e7:cf:2b + 8e:62:6e:e4:bc:c5:e7:a9:ec:df:d0:e7:c8:ef:56:86:32:2d: + a1:cb:ab:b7:b1:eb:44:d9:e4:03:51:85:14:06:1f:ba:0c:64: + e2:c3:7c:40:1b:01:43:cb:09:65:5b:52:0c:91:85:38:ea:93: + e1:cd:3f:ca:6d:5c:e0:70:67:31:a2:c5:2c:41:c1:bc:d5:ea: + 07:44:41:74:a1:06:a8:61:7e:3a:35:dd:e9:ea:b9:c7:91:9b: + 18:9d:36:97:45:ef:2a:30:54:9c:82:be:78:97:fa:01:73:21: + 01:12:22:fe:2e:6b:81:4e:ad:3c:c9:8d:05:fd:a0:92:04:de: + 2d:64:af:8f:91:73:c0:8a:e0:56:08:c0:a9:8b:31:3b:2c:62: + 35:5d:4e:f2:41:3f:c5:4b:5c:ef:b3:33:a9:4d:49:ef:63:e6: + 5e:d8:40:16:c0:19:45:d0:07:6c:01:3c:35:75:0f:3f:57:f7: + 7d:60:46:ed:23:15:d3:a8:2c:80:36:d8:12:89:f6:b6:a1:a4: + f7:fc:9b:7d:cf:40:14:3c:22:42:3c:b0:fa:e3:72:37:b3:93: + be:4b:40:ca:f3:99:8a:f8:bd:a0:1a:39:ab:7e:79:27:eb:3a: + af:0d:c9:81:33:7d:9d:4c:18:80:61:6a:19:5d:65:c4:2c:11: + f9:7d:a3:9b -----BEGIN CERTIFICATE----- -MIIEnjCCA4agAwIBAgIBATANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx +MIIEyTCCA7GgAwIBAgIBATANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx EDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNh d3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cud29sZnNz -bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMTgwNDEz -MTUyMzEwWhcNMjEwMTA3MTUyMzEwWjCBkDELMAkGA1UEBhMCVVMxEDAOBgNVBAgM +bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjAwNTA3 +MDczOTA0WhcNMjMwMjAxMDczOTA0WjCBkDELMAkGA1UEBhMCVVMxEDAOBgNVBAgM B01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xEDAOBgNVBAoMB3dvbGZTU0wxEDAO BgNVBAsMB1N1cHBvcnQxGDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEfMB0GCSqG SIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEP @@ -71,32 +73,34 @@ f/5cnFF194rKB+c1L4/hvXvAL3yrZKgX/Mpde7rgIeVyLm8uhtiVc9qsG1O5Xz/X GQ0lT+FjY1GLC2Q/rUO4pRxcNLOuAKBjxfZ/C1loeHOmjBipAm2vwxkBLrgQ48bM QLRpo0YzaYduxLsXpvPo3a1zvHsvIbX9ZlEMvVSz4W1fHLwjc9EJA4kU0hC5ZMMq 0KGWSrzh1Bpbx6DAwWN4D0Q3MDKWgDIjlaF3uhPSl3PiXSXJag3DOWCktLBpQkIJ -6dgIvDMgs1gip6rrxOHmYYPF0pbf2dBPrdcCAwEAAaOB/DCB+TAdBgNVHQ4EFgQU -sxEyyZKYhOLJ+NA7bgNCyh8OjjwwgckGA1UdIwSBwTCBvoAUJ45nEXTDJh0/7TNj -s6TYHTDl6NWhgZqkgZcwgZQxCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5h -MRAwDgYDVQQHDAdCb3plbWFuMREwDwYDVQQKDAhTYXd0b290aDETMBEGA1UECwwK -Q29uc3VsdGluZzEYMBYGA1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcN -AQkBFhBpbmZvQHdvbGZzc2wuY29tggkAhv/1jhDeuPswDAYDVR0TBAUwAwEB/zAN -BgkqhkiG9w0BAQsFAAOCAQEAtFRgraADMt4CfyFKgcbtzc3YEorAuoJbda1U43yA -aqwubCBOvk2Cp0cTXPTGaisQmVjeq2t8IgXBg53L/zzkLVdqppbf08Fo49LGg0uX -4sYyDr7EA7kHilu4hLrFOT8cWKdV1/Cb6NJFueODLu62cVa5Ou4/J9h36PtESGUn -R0z7/nLDrAV7HcvrXmWaqwLkiFs7iwvHzKmmi+GHsBkaDChYb5lSfu2wOmg7jAoI -dHKruQnF7QR+bwscCSHQzX/5xF4nIOSFc1IF0rr41Y9BzCMuEm28MZjnY6OOJs3o -K4ju4v46dFI0Dv0S5V5pUCAxNOQx8efkWwMT2qxBbOfPKw== +6dgIvDMgs1gip6rrxOHmYYPF0pbf2dBPrdcCAwEAAaOCASYwggEiMB0GA1UdDgQW +BBSzETLJkpiE4sn40DtuA0LKHw6OPDCB1AYDVR0jBIHMMIHJgBQnjmcRdMMmHT/t +M2OzpNgdMOXo1aGBmqSBlzCBlDELMAkGA1UEBhMCVVMxEDAOBgNVBAgMB01vbnRh +bmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNhd3Rvb3RoMRMwEQYDVQQL +DApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG +9w0BCQEWEGluZm9Ad29sZnNzbC5jb22CFD8yE1KSxt9K1UIFbLCyLkbC+LhnMAwG +A1UdEwQFMAMBAf8wHAYDVR0RBBUwE4ILZXhhbXBsZS5jb22HBH8AAAEwDQYJKoZI +hvcNAQELBQADggEBAI5ibuS8xeep7N/Q58jvVoYyLaHLq7ex60TZ5ANRhRQGH7oM +ZOLDfEAbAUPLCWVbUgyRhTjqk+HNP8ptXOBwZzGixSxBwbzV6gdEQXShBqhhfjo1 +3enquceRmxidNpdF7yowVJyCvniX+gFzIQESIv4ua4FOrTzJjQX9oJIE3i1kr4+R +c8CK4FYIwKmLMTssYjVdTvJBP8VLXO+zM6lNSe9j5l7YQBbAGUXQB2wBPDV1Dz9X +931gRu0jFdOoLIA22BKJ9rahpPf8m33PQBQ8IkI8sPrjcjezk75LQMrzmYr4vaAa +Oat+eSfrOq8NyYEzfZ1MGIBhahldZcQsEfl9o5s= -----END CERTIFICATE----- Certificate: Data: Version: 3 (0x2) - Serial Number: 9727763710660753659 (0x86fff58e10deb8fb) - Signature Algorithm: sha256WithRSAEncryption - Issuer: C=US, ST=Montana, L=Bozeman, O=Sawtooth, OU=Consulting, CN=www.wolfssl.com/emailAddress=info@wolfssl.com + Serial Number: + 3f:32:13:52:92:c6:df:4a:d5:42:05:6c:b0:b2:2e:46:c2:f8:b8:67 + Signature Algorithm: sha256WithRSAEncryption + Issuer: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Apr 13 15:23:09 2018 GMT - Not After : Jan 7 15:23:09 2021 GMT - Subject: C=US, ST=Montana, L=Bozeman, O=Sawtooth, OU=Consulting, CN=www.wolfssl.com/emailAddress=info@wolfssl.com + Not Before: May 7 07:39:04 2020 GMT + Not After : Feb 1 07:39:04 2023 GMT + Subject: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption - Public-Key: (2048 bit) + RSA Public-Key: (2048 bit) Modulus: 00:bf:0c:ca:2d:14:b2:1e:84:42:5b:cd:38:1f:4a: f2:4d:75:10:f1:b6:35:9f:df:ca:7d:03:98:d3:ac: @@ -123,50 +127,54 @@ Certificate: X509v3 Authority Key Identifier: keyid:27:8E:67:11:74:C3:26:1D:3F:ED:33:63:B3:A4:D8:1D:30:E5:E8:D5 DirName:/C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:86:FF:F5:8E:10:DE:B8:FB + serial:3F:32:13:52:92:C6:DF:4A:D5:42:05:6C:B0:B2:2E:46:C2:F8:B8:67 X509v3 Basic Constraints: CA:TRUE + X509v3 Subject Alternative Name: + DNS:example.com, IP Address:127.0.0.1 Signature Algorithm: sha256WithRSAEncryption - 9e:28:88:72:00:ca:e6:e7:97:ca:c1:f1:1f:9e:12:b2:b8:c7: - 51:ea:28:e1:36:b5:2d:e6:2f:08:23:cb:a9:4a:87:25:c6:5d: - 89:45:ea:f5:00:98:ac:76:fb:1b:af:f0:ce:64:9e:da:08:bf: - b6:eb:b4:b5:0c:a0:e7:f6:47:59:1c:61:cf:2e:0e:58:a4:82: - ac:0f:3f:ec:c4:ae:80:f7:b0:8a:1e:85:41:e8:ff:fe:fe:4f: - 1a:24:d5:49:fa:fb:fe:5e:e5:d3:91:0e:4f:4e:0c:21:51:71: - 83:04:6b:62:7b:4f:59:76:48:81:1e:b4:f7:04:47:8a:91:57: - a3:11:a9:f2:20:b4:78:33:62:3d:b0:5e:0d:f9:86:38:82:da: - a1:98:8d:19:06:87:21:39:b7:02:f7:da:7d:58:ba:52:15:d8: - 3b:c9:7b:58:34:a0:c7:e2:7c:a9:83:13:e1:b6:ec:01:bf:52: - 33:0b:c4:fe:43:d3:c6:a4:8e:2f:87:7f:7a:44:ea:ca:53:6c: - 85:ed:65:76:73:31:03:4e:ea:bd:35:54:13:f3:64:87:6b:df: - 34:dd:34:a1:88:3b:db:4d:af:1b:64:90:92:71:30:8e:c8:cc: - e5:60:24:af:31:16:39:33:91:50:f9:ab:68:42:74:7a:35:d9: - dd:c8:c4:52 + b0:7b:84:c9:1f:41:97:b8:03:14:0f:59:5b:6f:2c:15:45:1b: + c4:02:6f:d9:92:e7:1a:dc:cc:db:0e:56:3d:59:db:71:f2:f1: + 08:9a:06:eb:ab:c5:25:9f:df:6a:6d:6e:6b:d0:a8:90:39:d9: + 48:6f:61:7f:bd:cd:ed:60:8b:e3:6c:23:52:b7:86:bc:2a:ff: + 90:f7:6d:5c:47:69:f3:8d:ee:9e:76:62:5c:7b:b3:22:e5:4e: + ce:26:f6:3f:2f:b7:00:8c:20:d2:71:f6:31:4e:e1:4d:03:b9: + f3:07:dd:04:a7:a6:9a:9c:b0:2e:99:0a:a7:fc:59:97:63:a5: + 7c:77:dd:77:61:a6:86:6a:b2:32:33:06:b4:bc:ca:ae:c2:c7: + 8e:dc:85:dc:ac:c2:e7:2b:fb:b9:50:6b:d4:5b:0f:6d:93:a9: + 51:d2:dd:75:5e:88:ae:bc:ca:40:c7:2b:e9:5e:5b:a7:cf:e2: + e2:5d:0b:c9:69:20:d3:41:5a:7a:b9:14:17:f1:85:d7:b9:17: + b0:ad:ca:17:6c:38:8d:73:8d:74:25:01:70:c1:34:cf:62:02: + 48:9a:56:d8:44:a4:0d:e7:32:a0:b0:4b:c5:a4:9b:95:66:00: + fa:7e:97:0a:6b:08:ec:a0:9f:3f:90:99:57:39:63:81:76:f7: + ed:ea:01:1d -----BEGIN CERTIFICATE----- -MIIEqjCCA5KgAwIBAgIJAIb/9Y4Q3rj7MA0GCSqGSIb3DQEBCwUAMIGUMQswCQYD +MIIE4DCCA8igAwIBAgIUPzITUpLG30rVQgVssLIuRsL4uGcwDQYJKoZIhvcNAQEL +BQAwgZQxCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdC +b3plbWFuMREwDwYDVQQKDAhTYXd0b290aDETMBEGA1UECwwKQ29uc3VsdGluZzEY +MBYGA1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdv +bGZzc2wuY29tMB4XDTIwMDUwNzA3MzkwNFoXDTIzMDIwMTA3MzkwNFowgZQxCzAJ +BgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMREw +DwYDVQQKDAhTYXd0b290aDETMBEGA1UECwwKQ29uc3VsdGluZzEYMBYGA1UEAwwP +d3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29t +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvwzKLRSyHoRCW804H0ry +TXUQ8bY1n9/KfQOY06zeA2buKvHYsH1uB1QLEJghTYDLEiDnzE/eRX3Jcncy6sqQ +u2lSEAMvqPOVxfGLYlYb72dvpBBBla0Km+OlwLDScHZQMFuo6AgsfO2nonqNOCkc +rMft8nyVsJWCfUlcOM13Je+9gHVTlDw9ymNbnxW10x0TLxnRPNt2Osy4fcnlwtfa +QG/YIdxzG0ItU5z+Gvx9q3o2P5jehHwFZ85qFDiHqfGMtWjLaH9xICv1oGP1Vi+j +JtK3b7FaF9c4mQj+k1hv/sMTSQgWC6dNZwBSMWcjTpjtUUUduQTZC+zYKLNLve02 +eQIDAQABo4IBJjCCASIwHQYDVR0OBBYEFCeOZxF0wyYdP+0zY7Ok2B0w5ejVMIHU +BgNVHSMEgcwwgcmAFCeOZxF0wyYdP+0zY7Ok2B0w5ejVoYGapIGXMIGUMQswCQYD VQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjERMA8G A1UECgwIU2F3dG9vdGgxEzARBgNVBAsMCkNvbnN1bHRpbmcxGDAWBgNVBAMMD3d3 -dy53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbTAe -Fw0xODA0MTMxNTIzMDlaFw0yMTAxMDcxNTIzMDlaMIGUMQswCQYDVQQGEwJVUzEQ -MA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjERMA8GA1UECgwIU2F3 -dG9vdGgxEzARBgNVBAsMCkNvbnN1bHRpbmcxGDAWBgNVBAMMD3d3dy53b2xmc3Ns -LmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbTCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAL8Myi0Ush6EQlvNOB9K8k11EPG2NZ/fyn0D -mNOs3gNm7irx2LB9bgdUCxCYIU2AyxIg58xP3kV9yXJ3MurKkLtpUhADL6jzlcXx -i2JWG+9nb6QQQZWtCpvjpcCw0nB2UDBbqOgILHztp6J6jTgpHKzH7fJ8lbCVgn1J -XDjNdyXvvYB1U5Q8PcpjW58VtdMdEy8Z0TzbdjrMuH3J5cLX2kBv2CHccxtCLVOc -/hr8fat6Nj+Y3oR8BWfOahQ4h6nxjLVoy2h/cSAr9aBj9VYvoybSt2+xWhfXOJkI -/pNYb/7DE0kIFgunTWcAUjFnI06Y7VFFHbkE2Qvs2CizS73tNnkCAwEAAaOB/DCB -+TAdBgNVHQ4EFgQUJ45nEXTDJh0/7TNjs6TYHTDl6NUwgckGA1UdIwSBwTCBvoAU -J45nEXTDJh0/7TNjs6TYHTDl6NWhgZqkgZcwgZQxCzAJBgNVBAYTAlVTMRAwDgYD -VQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMREwDwYDVQQKDAhTYXd0b290 -aDETMBEGA1UECwwKQ29uc3VsdGluZzEYMBYGA1UEAwwPd3d3LndvbGZzc2wuY29t -MR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tggkAhv/1jhDeuPswDAYD -VR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAniiIcgDK5ueXysHxH54SsrjH -Ueoo4Ta1LeYvCCPLqUqHJcZdiUXq9QCYrHb7G6/wzmSe2gi/tuu0tQyg5/ZHWRxh -zy4OWKSCrA8/7MSugPewih6FQej//v5PGiTVSfr7/l7l05EOT04MIVFxgwRrYntP -WXZIgR609wRHipFXoxGp8iC0eDNiPbBeDfmGOILaoZiNGQaHITm3AvfafVi6UhXY -O8l7WDSgx+J8qYMT4bbsAb9SMwvE/kPTxqSOL4d/ekTqylNshe1ldnMxA07qvTVU -E/Nkh2vfNN00oYg7202vG2SQknEwjsjM5WAkrzEWOTORUPmraEJ0ejXZ3cjExg== +dy53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIU +PzITUpLG30rVQgVssLIuRsL4uGcwDAYDVR0TBAUwAwEB/zAcBgNVHREEFTATggtl +eGFtcGxlLmNvbYcEfwAAATANBgkqhkiG9w0BAQsFAAOCAQEAsHuEyR9Bl7gDFA9Z +W28sFUUbxAJv2ZLnGtzM2w5WPVnbcfLxCJoG66vFJZ/fam1ua9CokDnZSG9hf73N +7WCL42wjUreGvCr/kPdtXEdp843unnZiXHuzIuVOzib2Py+3AIwg0nH2MU7hTQO5 +8wfdBKemmpywLpkKp/xZl2OlfHfdd2GmhmqyMjMGtLzKrsLHjtyF3KzC5yv7uVBr +1FsPbZOpUdLddV6IrrzKQMcr6V5bp8/i4l0LyWkg00FaerkUF/GF17kXsK3KF2w4 +jXONdCUBcME0z2ICSJpW2ESkDecyoLBLxaSblWYA+n6XCmsI7KCfP5CZVzljgXb3 +7eoBxQ== -----END CERTIFICATE----- diff --git a/certs/test/server-duplicate-policy.pem b/certs/test/server-duplicate-policy.pem index bdc9af911..462a0a8f7 100644 --- a/certs/test/server-duplicate-policy.pem +++ b/certs/test/server-duplicate-policy.pem @@ -2,15 +2,15 @@ Certificate: Data: Version: 3 (0x2) Serial Number: 2 (0x2) - Signature Algorithm: sha256WithRSAEncryption - Issuer: C=US, ST=Montana, L=Bozeman, O=Sawtooth, OU=Consulting, CN=www.wolfssl.com/emailAddress=info@wolfssl.com + Signature Algorithm: sha256WithRSAEncryption + Issuer: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Apr 13 15:23:10 2018 GMT - Not After : Jan 7 15:23:10 2021 GMT - Subject: C=US, ST=Montana, L=Bozeman, O=wolfSSL, OU=testing duplicate policy, CN=www.wolfssl.com/emailAddress=info@wolfssl.com + Not Before: May 7 07:39:04 2020 GMT + Not After : Feb 1 07:39:04 2023 GMT + Subject: C = US, ST = Montana, L = Bozeman, O = wolfSSL, OU = testing duplicate policy, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption - Public-Key: (2048 bit) + RSA Public-Key: (2048 bit) Modulus: 00:c0:95:08:e1:57:41:f2:71:6d:b7:d2:45:41:27: 01:65:c6:45:ae:f2:bc:24:30:b8:95:ce:2f:4e:d6: @@ -37,7 +37,7 @@ Certificate: X509v3 Authority Key Identifier: keyid:27:8E:67:11:74:C3:26:1D:3F:ED:33:63:B3:A4:D8:1D:30:E5:E8:D5 DirName:/C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:86:FF:F5:8E:10:DE:B8:FB + serial:3F:32:13:52:92:C6:DF:4A:D5:42:05:6C:B0:B2:2E:46:C2:F8:B8:67 X509v3 Basic Constraints: CA:FALSE @@ -49,27 +49,27 @@ Certificate: Explicit Text: Test of duplicate OIDs with different qualifiers Signature Algorithm: sha256WithRSAEncryption - a0:b0:d4:b9:0b:bb:1e:3a:50:21:43:6a:e0:99:61:7e:46:cb: - d6:d3:5a:84:47:4c:9b:e9:13:c8:d4:44:b5:17:1f:52:29:a8: - 3d:e1:33:50:4a:4a:9c:a4:8d:86:99:83:72:7e:87:ba:04:b0: - bc:9b:39:ce:73:15:49:99:03:f1:e1:b5:ef:cb:85:bc:45:5e: - a8:fd:f6:82:f2:45:80:31:e9:cd:56:9b:cc:84:ff:6c:36:ee: - a6:e0:7f:a7:f1:49:0d:b6:ed:12:5b:34:05:b8:c5:4d:e2:ec: - 5b:25:dd:9c:3a:1a:4b:dc:cf:8e:41:a4:dd:ca:83:6a:cc:bc: - cd:4d:75:92:1f:45:8a:b0:6d:e4:72:8d:2c:18:12:26:b2:dc: - 3f:47:bd:76:c1:cb:da:9e:bd:58:10:6c:3e:57:22:9b:34:3e: - 6f:88:d7:e3:fd:4f:f5:97:a2:d2:9f:1d:58:fc:36:fa:94:dd: - 4e:13:e6:57:35:1c:5c:a5:69:6a:ce:3d:d3:21:51:1a:1a:3e: - cf:89:a4:c1:a0:9e:c4:0f:a1:d1:39:ac:31:1e:5e:e7:2f:d0: - 22:c3:9f:4d:57:90:ab:d6:f8:3d:dc:7f:9d:71:94:5d:95:48: - 9d:01:66:13:3a:26:0f:76:cc:c2:63:7d:0c:c8:0c:88:6b:84: - 01:c7:0a:a4 + 15:7a:97:1b:9d:73:c0:51:05:a1:4a:2b:44:34:cb:6b:8d:aa: + e3:16:41:d3:c6:01:1f:be:c4:79:11:13:be:bd:96:3a:a5:9e: + e8:17:83:df:9a:c4:96:f9:8b:d4:22:1a:ec:b2:96:83:24:10: + e8:e8:5c:e5:c7:75:d6:78:bb:79:7f:56:72:5c:f3:2a:00:12: + fc:05:49:fb:39:91:19:63:ab:57:78:d3:e9:e9:78:a7:e9:30: + 1c:68:d2:ca:a3:8f:13:0b:35:dc:3c:76:9f:2d:89:01:7a:27: + 03:01:36:7e:33:69:d9:10:20:d1:1a:29:7d:81:15:9c:70:5c: + 73:19:96:d4:69:0d:96:56:81:a7:bd:85:a8:0a:6e:f5:5e:d7: + ff:42:77:ab:20:f3:85:df:3f:d2:39:a8:65:87:52:1a:3f:0f: + 4f:f9:c1:06:d7:04:8e:3f:0f:55:06:ab:42:10:51:57:8e:72: + 84:94:1a:ef:54:33:89:60:39:58:30:c2:b1:e3:8c:04:2b:9d: + 56:41:b1:5c:ae:1c:c3:e7:3a:9e:a3:bb:6a:43:5e:47:0a:a6: + 45:af:f4:ab:64:08:41:f9:1b:12:3f:f5:b5:07:87:f1:19:7a: + 8c:76:af:6d:8a:c7:14:0f:d6:7a:7f:d2:6e:25:dc:5b:32:19: + bd:c6:a5:1e -----BEGIN CERTIFICATE----- -MIIFJjCCBA6gAwIBAgIBAjANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx +MIIFMTCCBBmgAwIBAgIBAjANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx EDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNh d3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cud29sZnNz -bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMTgwNDEz -MTUyMzEwWhcNMjEwMTA3MTUyMzEwWjCBoTELMAkGA1UEBhMCVVMxEDAOBgNVBAgM +bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjAwNTA3 +MDczOTA0WhcNMjMwMjAxMDczOTA0WjCBoTELMAkGA1UEBhMCVVMxEDAOBgNVBAgM B01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xEDAOBgNVBAoMB3dvbGZTU0wxITAf BgNVBAsMGHRlc3RpbmcgZHVwbGljYXRlIHBvbGljeTEYMBYGA1UEAwwPd3d3Lndv bGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMIIBIjAN @@ -79,34 +79,35 @@ JDC4lc4vTtb2HIi8fJ/7qGd//lycUXX3isoH5zUvj+G9e8AvfKtkqBf8yl17uuAh c6aMGKkCba/DGQEuuBDjxsxAtGmjRjNph27Euxem8+jdrXO8ey8htf1mUQy9VLPh bV8cvCNz0QkDiRTSELlkwyrQoZZKvOHUGlvHoMDBY3gPRDcwMpaAMiOVoXe6E9KX c+JdJclqDcM5YKS0sGlCQgnp2Ai8MyCzWCKnquvE4eZhg8XSlt/Z0E+t1wIDAQAB -o4IBcjCCAW4wHQYDVR0OBBYEFLMRMsmSmITiyfjQO24DQsofDo48MIHJBgNVHSME -gcEwgb6AFCeOZxF0wyYdP+0zY7Ok2B0w5ejVoYGapIGXMIGUMQswCQYDVQQGEwJV +o4IBfTCCAXkwHQYDVR0OBBYEFLMRMsmSmITiyfjQO24DQsofDo48MIHUBgNVHSME +gcwwgcmAFCeOZxF0wyYdP+0zY7Ok2B0w5ejVoYGapIGXMIGUMQswCQYDVQQGEwJV UzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjERMA8GA1UECgwI U2F3dG9vdGgxEzARBgNVBAsMCkNvbnN1bHRpbmcxGDAWBgNVBAMMD3d3dy53b2xm -c3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIJAIb/9Y4Q -3rj7MAkGA1UdEwQCMAAwdgYDVR0gBG8wbTAFBgMqAwQwZAYDKgMEMF0wGwYIKwYB -BQUHAgEWD3d3dy53b2xmc3NsLmNvbTA+BggrBgEFBQcCAjAyGjBUZXN0IG9mIGR1 -cGxpY2F0ZSBPSURzIHdpdGggZGlmZmVyZW50IHF1YWxpZmllcnMwDQYJKoZIhvcN -AQELBQADggEBAKCw1LkLux46UCFDauCZYX5Gy9bTWoRHTJvpE8jURLUXH1IpqD3h -M1BKSpykjYaZg3J+h7oEsLybOc5zFUmZA/Hhte/LhbxFXqj99oLyRYAx6c1Wm8yE -/2w27qbgf6fxSQ227RJbNAW4xU3i7Fsl3Zw6Gkvcz45BpN3Kg2rMvM1NdZIfRYqw -beRyjSwYEiay3D9HvXbBy9qevVgQbD5XIps0Pm+I1+P9T/WXotKfHVj8NvqU3U4T -5lc1HFylaWrOPdMhURoaPs+JpMGgnsQPodE5rDEeXucv0CLDn01XkKvW+D3cf51x -lF2VSJ0BZhM6Jg92zMJjfQzIDIhrhAHHCqQ= +c3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIUPzITUpLG +30rVQgVssLIuRsL4uGcwCQYDVR0TBAIwADB2BgNVHSAEbzBtMAUGAyoDBDBkBgMq +AwQwXTAbBggrBgEFBQcCARYPd3d3LndvbGZzc2wuY29tMD4GCCsGAQUFBwICMDIa +MFRlc3Qgb2YgZHVwbGljYXRlIE9JRHMgd2l0aCBkaWZmZXJlbnQgcXVhbGlmaWVy +czANBgkqhkiG9w0BAQsFAAOCAQEAFXqXG51zwFEFoUorRDTLa42q4xZB08YBH77E +eRETvr2WOqWe6BeD35rElvmL1CIa7LKWgyQQ6Ohc5cd11ni7eX9WclzzKgAS/AVJ ++zmRGWOrV3jT6el4p+kwHGjSyqOPEws13Dx2ny2JAXonAwE2fjNp2RAg0RopfYEV +nHBccxmW1GkNllaBp72FqApu9V7X/0J3qyDzhd8/0jmoZYdSGj8PT/nBBtcEjj8P +VQarQhBRV45yhJQa71QziWA5WDDCseOMBCudVkGxXK4cw+c6nqO7akNeRwqmRa/0 +q2QIQfkbEj/1tQeH8Rl6jHavbYrHFA/Wen/SbiXcWzIZvcalHg== -----END CERTIFICATE----- Certificate: Data: Version: 3 (0x2) - Serial Number: 9727763710660753659 (0x86fff58e10deb8fb) - Signature Algorithm: sha256WithRSAEncryption - Issuer: C=US, ST=Montana, L=Bozeman, O=Sawtooth, OU=Consulting, CN=www.wolfssl.com/emailAddress=info@wolfssl.com + Serial Number: + 3f:32:13:52:92:c6:df:4a:d5:42:05:6c:b0:b2:2e:46:c2:f8:b8:67 + Signature Algorithm: sha256WithRSAEncryption + Issuer: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Apr 13 15:23:09 2018 GMT - Not After : Jan 7 15:23:09 2021 GMT - Subject: C=US, ST=Montana, L=Bozeman, O=Sawtooth, OU=Consulting, CN=www.wolfssl.com/emailAddress=info@wolfssl.com + Not Before: May 7 07:39:04 2020 GMT + Not After : Feb 1 07:39:04 2023 GMT + Subject: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption - Public-Key: (2048 bit) + RSA Public-Key: (2048 bit) Modulus: 00:bf:0c:ca:2d:14:b2:1e:84:42:5b:cd:38:1f:4a: f2:4d:75:10:f1:b6:35:9f:df:ca:7d:03:98:d3:ac: @@ -133,50 +134,54 @@ Certificate: X509v3 Authority Key Identifier: keyid:27:8E:67:11:74:C3:26:1D:3F:ED:33:63:B3:A4:D8:1D:30:E5:E8:D5 DirName:/C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:86:FF:F5:8E:10:DE:B8:FB + serial:3F:32:13:52:92:C6:DF:4A:D5:42:05:6C:B0:B2:2E:46:C2:F8:B8:67 X509v3 Basic Constraints: CA:TRUE + X509v3 Subject Alternative Name: + DNS:example.com, IP Address:127.0.0.1 Signature Algorithm: sha256WithRSAEncryption - 9e:28:88:72:00:ca:e6:e7:97:ca:c1:f1:1f:9e:12:b2:b8:c7: - 51:ea:28:e1:36:b5:2d:e6:2f:08:23:cb:a9:4a:87:25:c6:5d: - 89:45:ea:f5:00:98:ac:76:fb:1b:af:f0:ce:64:9e:da:08:bf: - b6:eb:b4:b5:0c:a0:e7:f6:47:59:1c:61:cf:2e:0e:58:a4:82: - ac:0f:3f:ec:c4:ae:80:f7:b0:8a:1e:85:41:e8:ff:fe:fe:4f: - 1a:24:d5:49:fa:fb:fe:5e:e5:d3:91:0e:4f:4e:0c:21:51:71: - 83:04:6b:62:7b:4f:59:76:48:81:1e:b4:f7:04:47:8a:91:57: - a3:11:a9:f2:20:b4:78:33:62:3d:b0:5e:0d:f9:86:38:82:da: - a1:98:8d:19:06:87:21:39:b7:02:f7:da:7d:58:ba:52:15:d8: - 3b:c9:7b:58:34:a0:c7:e2:7c:a9:83:13:e1:b6:ec:01:bf:52: - 33:0b:c4:fe:43:d3:c6:a4:8e:2f:87:7f:7a:44:ea:ca:53:6c: - 85:ed:65:76:73:31:03:4e:ea:bd:35:54:13:f3:64:87:6b:df: - 34:dd:34:a1:88:3b:db:4d:af:1b:64:90:92:71:30:8e:c8:cc: - e5:60:24:af:31:16:39:33:91:50:f9:ab:68:42:74:7a:35:d9: - dd:c8:c4:52 + b0:7b:84:c9:1f:41:97:b8:03:14:0f:59:5b:6f:2c:15:45:1b: + c4:02:6f:d9:92:e7:1a:dc:cc:db:0e:56:3d:59:db:71:f2:f1: + 08:9a:06:eb:ab:c5:25:9f:df:6a:6d:6e:6b:d0:a8:90:39:d9: + 48:6f:61:7f:bd:cd:ed:60:8b:e3:6c:23:52:b7:86:bc:2a:ff: + 90:f7:6d:5c:47:69:f3:8d:ee:9e:76:62:5c:7b:b3:22:e5:4e: + ce:26:f6:3f:2f:b7:00:8c:20:d2:71:f6:31:4e:e1:4d:03:b9: + f3:07:dd:04:a7:a6:9a:9c:b0:2e:99:0a:a7:fc:59:97:63:a5: + 7c:77:dd:77:61:a6:86:6a:b2:32:33:06:b4:bc:ca:ae:c2:c7: + 8e:dc:85:dc:ac:c2:e7:2b:fb:b9:50:6b:d4:5b:0f:6d:93:a9: + 51:d2:dd:75:5e:88:ae:bc:ca:40:c7:2b:e9:5e:5b:a7:cf:e2: + e2:5d:0b:c9:69:20:d3:41:5a:7a:b9:14:17:f1:85:d7:b9:17: + b0:ad:ca:17:6c:38:8d:73:8d:74:25:01:70:c1:34:cf:62:02: + 48:9a:56:d8:44:a4:0d:e7:32:a0:b0:4b:c5:a4:9b:95:66:00: + fa:7e:97:0a:6b:08:ec:a0:9f:3f:90:99:57:39:63:81:76:f7: + ed:ea:01:1d -----BEGIN CERTIFICATE----- -MIIEqjCCA5KgAwIBAgIJAIb/9Y4Q3rj7MA0GCSqGSIb3DQEBCwUAMIGUMQswCQYD +MIIE4DCCA8igAwIBAgIUPzITUpLG30rVQgVssLIuRsL4uGcwDQYJKoZIhvcNAQEL +BQAwgZQxCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdC +b3plbWFuMREwDwYDVQQKDAhTYXd0b290aDETMBEGA1UECwwKQ29uc3VsdGluZzEY +MBYGA1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdv +bGZzc2wuY29tMB4XDTIwMDUwNzA3MzkwNFoXDTIzMDIwMTA3MzkwNFowgZQxCzAJ +BgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMREw +DwYDVQQKDAhTYXd0b290aDETMBEGA1UECwwKQ29uc3VsdGluZzEYMBYGA1UEAwwP +d3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29t +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvwzKLRSyHoRCW804H0ry +TXUQ8bY1n9/KfQOY06zeA2buKvHYsH1uB1QLEJghTYDLEiDnzE/eRX3Jcncy6sqQ +u2lSEAMvqPOVxfGLYlYb72dvpBBBla0Km+OlwLDScHZQMFuo6AgsfO2nonqNOCkc +rMft8nyVsJWCfUlcOM13Je+9gHVTlDw9ymNbnxW10x0TLxnRPNt2Osy4fcnlwtfa +QG/YIdxzG0ItU5z+Gvx9q3o2P5jehHwFZ85qFDiHqfGMtWjLaH9xICv1oGP1Vi+j +JtK3b7FaF9c4mQj+k1hv/sMTSQgWC6dNZwBSMWcjTpjtUUUduQTZC+zYKLNLve02 +eQIDAQABo4IBJjCCASIwHQYDVR0OBBYEFCeOZxF0wyYdP+0zY7Ok2B0w5ejVMIHU +BgNVHSMEgcwwgcmAFCeOZxF0wyYdP+0zY7Ok2B0w5ejVoYGapIGXMIGUMQswCQYD VQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjERMA8G A1UECgwIU2F3dG9vdGgxEzARBgNVBAsMCkNvbnN1bHRpbmcxGDAWBgNVBAMMD3d3 -dy53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbTAe -Fw0xODA0MTMxNTIzMDlaFw0yMTAxMDcxNTIzMDlaMIGUMQswCQYDVQQGEwJVUzEQ -MA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjERMA8GA1UECgwIU2F3 -dG9vdGgxEzARBgNVBAsMCkNvbnN1bHRpbmcxGDAWBgNVBAMMD3d3dy53b2xmc3Ns -LmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbTCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAL8Myi0Ush6EQlvNOB9K8k11EPG2NZ/fyn0D -mNOs3gNm7irx2LB9bgdUCxCYIU2AyxIg58xP3kV9yXJ3MurKkLtpUhADL6jzlcXx -i2JWG+9nb6QQQZWtCpvjpcCw0nB2UDBbqOgILHztp6J6jTgpHKzH7fJ8lbCVgn1J -XDjNdyXvvYB1U5Q8PcpjW58VtdMdEy8Z0TzbdjrMuH3J5cLX2kBv2CHccxtCLVOc -/hr8fat6Nj+Y3oR8BWfOahQ4h6nxjLVoy2h/cSAr9aBj9VYvoybSt2+xWhfXOJkI -/pNYb/7DE0kIFgunTWcAUjFnI06Y7VFFHbkE2Qvs2CizS73tNnkCAwEAAaOB/DCB -+TAdBgNVHQ4EFgQUJ45nEXTDJh0/7TNjs6TYHTDl6NUwgckGA1UdIwSBwTCBvoAU -J45nEXTDJh0/7TNjs6TYHTDl6NWhgZqkgZcwgZQxCzAJBgNVBAYTAlVTMRAwDgYD -VQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMREwDwYDVQQKDAhTYXd0b290 -aDETMBEGA1UECwwKQ29uc3VsdGluZzEYMBYGA1UEAwwPd3d3LndvbGZzc2wuY29t -MR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tggkAhv/1jhDeuPswDAYD -VR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAniiIcgDK5ueXysHxH54SsrjH -Ueoo4Ta1LeYvCCPLqUqHJcZdiUXq9QCYrHb7G6/wzmSe2gi/tuu0tQyg5/ZHWRxh -zy4OWKSCrA8/7MSugPewih6FQej//v5PGiTVSfr7/l7l05EOT04MIVFxgwRrYntP -WXZIgR609wRHipFXoxGp8iC0eDNiPbBeDfmGOILaoZiNGQaHITm3AvfafVi6UhXY -O8l7WDSgx+J8qYMT4bbsAb9SMwvE/kPTxqSOL4d/ekTqylNshe1ldnMxA07qvTVU -E/Nkh2vfNN00oYg7202vG2SQknEwjsjM5WAkrzEWOTORUPmraEJ0ejXZ3cjEUg== +dy53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIU +PzITUpLG30rVQgVssLIuRsL4uGcwDAYDVR0TBAUwAwEB/zAcBgNVHREEFTATggtl +eGFtcGxlLmNvbYcEfwAAATANBgkqhkiG9w0BAQsFAAOCAQEAsHuEyR9Bl7gDFA9Z +W28sFUUbxAJv2ZLnGtzM2w5WPVnbcfLxCJoG66vFJZ/fam1ua9CokDnZSG9hf73N +7WCL42wjUreGvCr/kPdtXEdp843unnZiXHuzIuVOzib2Py+3AIwg0nH2MU7hTQO5 +8wfdBKemmpywLpkKp/xZl2OlfHfdd2GmhmqyMjMGtLzKrsLHjtyF3KzC5yv7uVBr +1FsPbZOpUdLddV6IrrzKQMcr6V5bp8/i4l0LyWkg00FaerkUF/GF17kXsK3KF2w4 +jXONdCUBcME0z2ICSJpW2ESkDecyoLBLxaSblWYA+n6XCmsI7KCfP5CZVzljgXb3 +7eoBHQ== -----END CERTIFICATE----- diff --git a/src/ssl.c b/src/ssl.c index 1c203ab25..2c1ca2079 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -8588,6 +8588,9 @@ const WOLFSSL_v3_ext_method* wolfSSL_X509V3_EXT_get(WOLFSSL_X509_EXTENSION* ex) case NID_subject_key_identifier: method.i2s = (X509V3_EXT_I2S)wolfSSL_i2s_ASN1_STRING; break; + case NID_subject_alt_name: + WOLFSSL_MSG("i2v function not yet implemented for Subject Alternative Name"); + break; case NID_key_usage: WOLFSSL_MSG("i2v function not yet implemented for Key Usage"); break; diff --git a/tests/api.c b/tests/api.c index 666c1c55f..cb00ba43c 100644 --- a/tests/api.c +++ b/tests/api.c @@ -4577,7 +4577,7 @@ static void test_wolfSSL_PKCS12(void) #if defined(OPENSSL_EXTRA) && !defined(NO_DES3) && !defined(NO_FILESYSTEM) && \ !defined(NO_ASN) && !defined(NO_PWDBASED) && !defined(NO_RSA) && \ !defined(NO_SHA) - byte buffer[5300]; + byte buffer[6000]; char file[] = "./certs/test-servercert.p12"; char order[] = "./certs/ecc-rsa-server.p12"; char pass[] = "a password"; @@ -5269,7 +5269,7 @@ static void test_wolfSSL_TBS(void) AssertNull(tbs = wolfSSL_X509_get_tbs(NULL, &tbsSz)); AssertNull(tbs = wolfSSL_X509_get_tbs(x509, NULL)); AssertNotNull(tbs = wolfSSL_X509_get_tbs(x509, &tbsSz)); - AssertIntEQ(tbsSz, 918); + AssertIntEQ(tbsSz, 972); wolfSSL_FreeX509(x509); @@ -21314,7 +21314,7 @@ static void test_wolfSSL_tmp_dh(void) { #if defined(OPENSSL_EXTRA) && !defined(NO_CERTS) && !defined(NO_FILESYSTEM) && \ !defined(NO_DSA) && !defined(NO_RSA) && !defined(NO_DH) - byte buffer[5300]; + byte buffer[6000]; char file[] = "./certs/dsaparams.pem"; XFILE f; int bytes; @@ -21369,7 +21369,7 @@ static void test_wolfSSL_tmp_dh(void) static void test_wolfSSL_ctrl(void) { #if defined (OPENSSL_EXTRA) - byte buff[5300]; + byte buff[6000]; BIO* bio; int bytes; BUF_MEM* ptr = NULL; @@ -23171,7 +23171,7 @@ static void test_wolfSSL_PEM_read_bio(void) { #if defined(OPENSSL_EXTRA) && !defined(NO_CERTS) && \ !defined(NO_FILESYSTEM) && !defined(NO_RSA) - byte buff[5300]; + byte buff[6000]; XFILE f; int bytes; X509* x509; @@ -23738,7 +23738,7 @@ static void test_wolfSSL_X509_get_ext_count(void) AssertNotNull(x509 = wolfSSL_X509_load_certificate_file(svrCertFile, SSL_FILETYPE_PEM)); - AssertIntEQ(X509_get_ext_count(x509), 3); + AssertIntEQ(X509_get_ext_count(x509), 4); wolfSSL_X509_free(x509); AssertNotNull(x509 = wolfSSL_X509_load_certificate_file(ocspRootCaFile, @@ -23751,8 +23751,8 @@ static void test_wolfSSL_X509_get_ext_count(void) fclose(f); printf(testingFmt, "wolfSSL_X509_get_ext_count() valid input"); - AssertIntEQ((ret = wolfSSL_X509_get_ext_count(x509)), 3); - printf(resultFmt, ret == 3 ? passed : failed); + AssertIntEQ((ret = wolfSSL_X509_get_ext_count(x509)), 4); + printf(resultFmt, ret == 4 ? passed : failed); printf(testingFmt, "wolfSSL_X509_get_ext_count() NULL argument"); AssertIntEQ((ret = wolfSSL_X509_get_ext_count(NULL)), WOLFSSL_FAILURE); @@ -27733,7 +27733,7 @@ static void test_wolfSSL_CTX_ctrl(void) SSL_CTX* ctx; X509* x509 = NULL; #if !defined(NO_DH) && !defined(NO_DSA) - byte buf[5300]; + byte buf[6000]; char file[] = "./certs/dsaparams.pem"; XFILE f; int bytes; @@ -27876,7 +27876,7 @@ static void test_wolfSSL_CTX_ctrl(void) static void test_wolfSSL_DH_check(void) { #if !defined(NO_DH) && !defined(NO_DSA) - byte buf[5300]; + byte buf[6000]; char file[] = "./certs/dsaparams.pem"; XFILE f; int bytes; @@ -28089,7 +28089,7 @@ static void test_wolfSSL_X509V3_EXT_get(void) { fclose(f); printf(testingFmt, "wolfSSL_X509V3_EXT_get() return struct and nid test"); - AssertIntEQ((numOfExt = wolfSSL_X509_get_ext_count(x509)), 3); + AssertIntEQ((numOfExt = wolfSSL_X509_get_ext_count(x509)), 4); for (i = 0; i < numOfExt; i++) { AssertNotNull(ext = wolfSSL_X509_get_ext(x509, i)); AssertNotNull(extNid = ext->obj->nid); @@ -28240,7 +28240,7 @@ static void test_wolfSSL_X509_get_ext(void){ AssertNotNull(f = fopen("./certs/server-cert.pem", "rb")); AssertNotNull(x509 = wolfSSL_PEM_read_X509(f, NULL, NULL, NULL)); fclose(f); - AssertIntEQ((ret = wolfSSL_X509_get_ext_count(x509)), 3); + AssertIntEQ((ret = wolfSSL_X509_get_ext_count(x509)), 4); printf(testingFmt, "wolfSSL_X509_get_ext() valid input"); AssertNotNull(foundExtension = wolfSSL_X509_get_ext(x509, 0)); diff --git a/wolfcrypt/test/test.c b/wolfcrypt/test/test.c index f160687d4..bdb170f31 100644 --- a/wolfcrypt/test/test.c +++ b/wolfcrypt/test/test.c @@ -25725,8 +25725,8 @@ int pkcs7callback_test(byte* cert, word32 certSz, byte* key, word32 keySz) { int ret = 0; - byte derBuf[FOURK_BUF/2]; - word32 derSz = FOURK_BUF/2; + byte derBuf[FOURK_BUF]; + word32 derSz = sizeof(derBuf); /* Doing default generation and verify */ ret = generateBundle(derBuf, &derSz, p7DefKey, sizeof(p7DefKey), 0, cert, @@ -25741,7 +25741,7 @@ int pkcs7callback_test(byte* cert, word32 certSz, byte* key, word32 keySz) } /* test choosing other key with keyID */ - derSz = FOURK_BUF/2; + derSz = sizeof(derBuf); ret = generateBundle(derBuf, &derSz, p7AltKey, sizeof(p7AltKey), 1, cert, certSz, key, keySz); if (ret <= 0) { @@ -25754,7 +25754,7 @@ int pkcs7callback_test(byte* cert, word32 certSz, byte* key, word32 keySz) } /* test fail case with wrong keyID */ - derSz = FOURK_BUF/2; + derSz = sizeof(derBuf); ret = generateBundle(derBuf, &derSz, p7DefKey, sizeof(p7DefKey), 1, cert, certSz, key, keySz); if (ret <= 0) { diff --git a/wolfssl/certs_test.h b/wolfssl/certs_test.h index 6562e9f6e..624bf7fd7 100644 --- a/wolfssl/certs_test.h +++ b/wolfssl/certs_test.h @@ -98,103 +98,109 @@ static const int sizeof_client_keypub_der_1024 = sizeof(client_keypub_der_1024); /* ./certs/1024/client-cert.der, 1024-bit */ static const unsigned char client_cert_der_1024[] = { - 0x30, 0x82, 0x03, 0xC5, 0x30, 0x82, 0x03, 0x2E, 0xA0, 0x03, - 0x02, 0x01, 0x02, 0x02, 0x09, 0x00, 0xBB, 0xD3, 0x10, 0x03, - 0xE6, 0x9D, 0x28, 0x03, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, - 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0B, 0x05, 0x00, 0x30, - 0x81, 0x9E, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, - 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x10, 0x30, 0x0E, 0x06, - 0x03, 0x55, 0x04, 0x08, 0x0C, 0x07, 0x4D, 0x6F, 0x6E, 0x74, - 0x61, 0x6E, 0x61, 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, - 0x04, 0x07, 0x0C, 0x07, 0x42, 0x6F, 0x7A, 0x65, 0x6D, 0x61, - 0x6E, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x0A, - 0x0C, 0x0C, 0x77, 0x6F, 0x6C, 0x66, 0x53, 0x53, 0x4C, 0x5F, - 0x31, 0x30, 0x32, 0x34, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, - 0x55, 0x04, 0x0B, 0x0C, 0x10, 0x50, 0x72, 0x6F, 0x67, 0x72, - 0x61, 0x6D, 0x6D, 0x69, 0x6E, 0x67, 0x2D, 0x31, 0x30, 0x32, - 0x34, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, 0x03, - 0x0C, 0x0F, 0x77, 0x77, 0x77, 0x2E, 0x77, 0x6F, 0x6C, 0x66, - 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, 0x6D, 0x31, 0x1F, 0x30, - 0x1D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, - 0x09, 0x01, 0x16, 0x10, 0x69, 0x6E, 0x66, 0x6F, 0x40, 0x77, - 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, 0x6D, - 0x30, 0x1E, 0x17, 0x0D, 0x31, 0x38, 0x30, 0x34, 0x31, 0x33, - 0x31, 0x35, 0x32, 0x33, 0x30, 0x39, 0x5A, 0x17, 0x0D, 0x32, - 0x31, 0x30, 0x31, 0x30, 0x37, 0x31, 0x35, 0x32, 0x33, 0x30, - 0x39, 0x5A, 0x30, 0x81, 0x9E, 0x31, 0x0B, 0x30, 0x09, 0x06, - 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x10, - 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0C, 0x07, 0x4D, - 0x6F, 0x6E, 0x74, 0x61, 0x6E, 0x61, 0x31, 0x10, 0x30, 0x0E, - 0x06, 0x03, 0x55, 0x04, 0x07, 0x0C, 0x07, 0x42, 0x6F, 0x7A, - 0x65, 0x6D, 0x61, 0x6E, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, - 0x55, 0x04, 0x0A, 0x0C, 0x0C, 0x77, 0x6F, 0x6C, 0x66, 0x53, - 0x53, 0x4C, 0x5F, 0x31, 0x30, 0x32, 0x34, 0x31, 0x19, 0x30, - 0x17, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x0C, 0x10, 0x50, 0x72, - 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x6D, 0x69, 0x6E, 0x67, 0x2D, - 0x31, 0x30, 0x32, 0x34, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, - 0x55, 0x04, 0x03, 0x0C, 0x0F, 0x77, 0x77, 0x77, 0x2E, 0x77, - 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, 0x6D, - 0x31, 0x1F, 0x30, 0x1D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, - 0xF7, 0x0D, 0x01, 0x09, 0x01, 0x16, 0x10, 0x69, 0x6E, 0x66, - 0x6F, 0x40, 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, - 0x63, 0x6F, 0x6D, 0x30, 0x81, 0x9F, 0x30, 0x0D, 0x06, 0x09, - 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, 0x05, - 0x00, 0x03, 0x81, 0x8D, 0x00, 0x30, 0x81, 0x89, 0x02, 0x81, - 0x81, 0x00, 0xBC, 0x73, 0x0E, 0xA8, 0x49, 0xF3, 0x74, 0xA2, - 0xA9, 0xEF, 0x18, 0xA5, 0xDA, 0x55, 0x99, 0x21, 0xF9, 0xC8, - 0xEC, 0xB3, 0x6D, 0x48, 0xE5, 0x35, 0x35, 0x75, 0x77, 0x37, - 0xEC, 0xD1, 0x61, 0x90, 0x5F, 0x3E, 0xD9, 0xE4, 0xD5, 0xDF, - 0x94, 0xCA, 0xC1, 0xA9, 0xD7, 0x19, 0xDA, 0x86, 0xC9, 0xE8, - 0x4D, 0xC4, 0x61, 0x36, 0x82, 0xFE, 0xAB, 0xAD, 0x7E, 0x77, - 0x25, 0xBB, 0x8D, 0x11, 0xA5, 0xBC, 0x62, 0x3A, 0xA8, 0x38, - 0xCC, 0x39, 0xA2, 0x04, 0x66, 0xB4, 0xF7, 0xF7, 0xF3, 0xAA, - 0xDA, 0x4D, 0x02, 0x0E, 0xBB, 0x5E, 0x8D, 0x69, 0x48, 0xDC, - 0x77, 0xC9, 0x28, 0x0E, 0x22, 0xE9, 0x6B, 0xA4, 0x26, 0xBA, - 0x4C, 0xE8, 0xC1, 0xFD, 0x4A, 0x6F, 0x2B, 0x1F, 0xEF, 0x8A, - 0xAE, 0xF6, 0x90, 0x62, 0xE5, 0x64, 0x1E, 0xEB, 0x2B, 0x3C, - 0x67, 0xC8, 0xDC, 0x27, 0x00, 0xF6, 0x91, 0x68, 0x65, 0xA9, - 0x02, 0x03, 0x01, 0x00, 0x01, 0xA3, 0x82, 0x01, 0x07, 0x30, - 0x82, 0x01, 0x03, 0x30, 0x1D, 0x06, 0x03, 0x55, 0x1D, 0x0E, - 0x04, 0x16, 0x04, 0x14, 0x81, 0x69, 0x0F, 0xF8, 0xDF, 0xDD, - 0xCF, 0x34, 0x29, 0xD5, 0x67, 0x75, 0x71, 0x85, 0xC7, 0x75, - 0x10, 0x69, 0x59, 0xEC, 0x30, 0x81, 0xD3, 0x06, 0x03, 0x55, - 0x1D, 0x23, 0x04, 0x81, 0xCB, 0x30, 0x81, 0xC8, 0x80, 0x14, - 0x81, 0x69, 0x0F, 0xF8, 0xDF, 0xDD, 0xCF, 0x34, 0x29, 0xD5, - 0x67, 0x75, 0x71, 0x85, 0xC7, 0x75, 0x10, 0x69, 0x59, 0xEC, - 0xA1, 0x81, 0xA4, 0xA4, 0x81, 0xA1, 0x30, 0x81, 0x9E, 0x31, - 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, - 0x55, 0x53, 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, - 0x08, 0x0C, 0x07, 0x4D, 0x6F, 0x6E, 0x74, 0x61, 0x6E, 0x61, - 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0C, - 0x07, 0x42, 0x6F, 0x7A, 0x65, 0x6D, 0x61, 0x6E, 0x31, 0x15, - 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x0A, 0x0C, 0x0C, 0x77, - 0x6F, 0x6C, 0x66, 0x53, 0x53, 0x4C, 0x5F, 0x31, 0x30, 0x32, - 0x34, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0B, - 0x0C, 0x10, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x6D, - 0x69, 0x6E, 0x67, 0x2D, 0x31, 0x30, 0x32, 0x34, 0x31, 0x18, - 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0C, 0x0F, 0x77, - 0x77, 0x77, 0x2E, 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, - 0x2E, 0x63, 0x6F, 0x6D, 0x31, 0x1F, 0x30, 0x1D, 0x06, 0x09, - 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x01, 0x16, - 0x10, 0x69, 0x6E, 0x66, 0x6F, 0x40, 0x77, 0x6F, 0x6C, 0x66, - 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, 0x6D, 0x82, 0x09, 0x00, - 0xBB, 0xD3, 0x10, 0x03, 0xE6, 0x9D, 0x28, 0x03, 0x30, 0x0C, - 0x06, 0x03, 0x55, 0x1D, 0x13, 0x04, 0x05, 0x30, 0x03, 0x01, - 0x01, 0xFF, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, - 0xF7, 0x0D, 0x01, 0x01, 0x0B, 0x05, 0x00, 0x03, 0x81, 0x81, - 0x00, 0x84, 0x99, 0xD9, 0xE5, 0x37, 0xC4, 0x44, 0x7D, 0xCE, - 0x29, 0xB8, 0xB6, 0x80, 0x0E, 0xEA, 0xA3, 0xE2, 0xFA, 0xA2, - 0x2F, 0x5C, 0xD2, 0x4A, 0x85, 0x67, 0xB9, 0x8B, 0xFA, 0x9F, - 0x7D, 0xDA, 0x6D, 0x85, 0x2A, 0xC2, 0x20, 0xF3, 0x18, 0xC8, - 0xD4, 0x6B, 0x26, 0xB2, 0x7A, 0x68, 0xE7, 0x82, 0x52, 0x87, - 0xE7, 0x0C, 0x5B, 0x08, 0x47, 0x7A, 0x55, 0xA5, 0x0D, 0xFA, - 0x72, 0xCE, 0x6B, 0xA1, 0xB2, 0xAE, 0x5A, 0xA1, 0x63, 0xFF, - 0x68, 0xDB, 0xE5, 0x49, 0xEF, 0xF1, 0x0E, 0x98, 0x96, 0x09, - 0xB5, 0x04, 0x5F, 0xD4, 0x0A, 0x9B, 0x8A, 0xAF, 0xD2, 0x31, - 0x1F, 0x95, 0xE5, 0x0F, 0xA8, 0xCD, 0xBB, 0xA1, 0x2D, 0x64, - 0xB0, 0xB7, 0xEE, 0x47, 0xA7, 0x58, 0xD9, 0xC7, 0xDB, 0xB0, - 0x92, 0xBB, 0xAA, 0xCF, 0xB8, 0x8A, 0x04, 0x5B, 0x0F, 0x9F, - 0x3E, 0xE0, 0xD2, 0x42, 0x52, 0xBD, 0x5D, 0xA7, 0x48 + 0x30, 0x82, 0x03, 0xF9, 0x30, 0x82, 0x03, 0x62, 0xA0, 0x03, + 0x02, 0x01, 0x02, 0x02, 0x14, 0x0A, 0x60, 0xF5, 0x96, 0x2D, + 0xA5, 0xE2, 0x63, 0x56, 0x3E, 0x98, 0x93, 0x65, 0x56, 0x0A, + 0x0A, 0x11, 0x23, 0x98, 0x5D, 0x30, 0x0D, 0x06, 0x09, 0x2A, + 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0B, 0x05, 0x00, + 0x30, 0x81, 0x9E, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, + 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x10, 0x30, 0x0E, + 0x06, 0x03, 0x55, 0x04, 0x08, 0x0C, 0x07, 0x4D, 0x6F, 0x6E, + 0x74, 0x61, 0x6E, 0x61, 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, + 0x55, 0x04, 0x07, 0x0C, 0x07, 0x42, 0x6F, 0x7A, 0x65, 0x6D, + 0x61, 0x6E, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, + 0x0A, 0x0C, 0x0C, 0x77, 0x6F, 0x6C, 0x66, 0x53, 0x53, 0x4C, + 0x5F, 0x31, 0x30, 0x32, 0x34, 0x31, 0x19, 0x30, 0x17, 0x06, + 0x03, 0x55, 0x04, 0x0B, 0x0C, 0x10, 0x50, 0x72, 0x6F, 0x67, + 0x72, 0x61, 0x6D, 0x6D, 0x69, 0x6E, 0x67, 0x2D, 0x31, 0x30, + 0x32, 0x34, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, + 0x03, 0x0C, 0x0F, 0x77, 0x77, 0x77, 0x2E, 0x77, 0x6F, 0x6C, + 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, 0x6D, 0x31, 0x1F, + 0x30, 0x1D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, + 0x01, 0x09, 0x01, 0x16, 0x10, 0x69, 0x6E, 0x66, 0x6F, 0x40, + 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, + 0x6D, 0x30, 0x1E, 0x17, 0x0D, 0x32, 0x30, 0x30, 0x35, 0x30, + 0x37, 0x30, 0x37, 0x33, 0x39, 0x30, 0x34, 0x5A, 0x17, 0x0D, + 0x32, 0x33, 0x30, 0x32, 0x30, 0x31, 0x30, 0x37, 0x33, 0x39, + 0x30, 0x34, 0x5A, 0x30, 0x81, 0x9E, 0x31, 0x0B, 0x30, 0x09, + 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, + 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0C, 0x07, + 0x4D, 0x6F, 0x6E, 0x74, 0x61, 0x6E, 0x61, 0x31, 0x10, 0x30, + 0x0E, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0C, 0x07, 0x42, 0x6F, + 0x7A, 0x65, 0x6D, 0x61, 0x6E, 0x31, 0x15, 0x30, 0x13, 0x06, + 0x03, 0x55, 0x04, 0x0A, 0x0C, 0x0C, 0x77, 0x6F, 0x6C, 0x66, + 0x53, 0x53, 0x4C, 0x5F, 0x31, 0x30, 0x32, 0x34, 0x31, 0x19, + 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x0C, 0x10, 0x50, + 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x6D, 0x69, 0x6E, 0x67, + 0x2D, 0x31, 0x30, 0x32, 0x34, 0x31, 0x18, 0x30, 0x16, 0x06, + 0x03, 0x55, 0x04, 0x03, 0x0C, 0x0F, 0x77, 0x77, 0x77, 0x2E, + 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, + 0x6D, 0x31, 0x1F, 0x30, 0x1D, 0x06, 0x09, 0x2A, 0x86, 0x48, + 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x01, 0x16, 0x10, 0x69, 0x6E, + 0x66, 0x6F, 0x40, 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, + 0x2E, 0x63, 0x6F, 0x6D, 0x30, 0x81, 0x9F, 0x30, 0x0D, 0x06, + 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, + 0x05, 0x00, 0x03, 0x81, 0x8D, 0x00, 0x30, 0x81, 0x89, 0x02, + 0x81, 0x81, 0x00, 0xBC, 0x73, 0x0E, 0xA8, 0x49, 0xF3, 0x74, + 0xA2, 0xA9, 0xEF, 0x18, 0xA5, 0xDA, 0x55, 0x99, 0x21, 0xF9, + 0xC8, 0xEC, 0xB3, 0x6D, 0x48, 0xE5, 0x35, 0x35, 0x75, 0x77, + 0x37, 0xEC, 0xD1, 0x61, 0x90, 0x5F, 0x3E, 0xD9, 0xE4, 0xD5, + 0xDF, 0x94, 0xCA, 0xC1, 0xA9, 0xD7, 0x19, 0xDA, 0x86, 0xC9, + 0xE8, 0x4D, 0xC4, 0x61, 0x36, 0x82, 0xFE, 0xAB, 0xAD, 0x7E, + 0x77, 0x25, 0xBB, 0x8D, 0x11, 0xA5, 0xBC, 0x62, 0x3A, 0xA8, + 0x38, 0xCC, 0x39, 0xA2, 0x04, 0x66, 0xB4, 0xF7, 0xF7, 0xF3, + 0xAA, 0xDA, 0x4D, 0x02, 0x0E, 0xBB, 0x5E, 0x8D, 0x69, 0x48, + 0xDC, 0x77, 0xC9, 0x28, 0x0E, 0x22, 0xE9, 0x6B, 0xA4, 0x26, + 0xBA, 0x4C, 0xE8, 0xC1, 0xFD, 0x4A, 0x6F, 0x2B, 0x1F, 0xEF, + 0x8A, 0xAE, 0xF6, 0x90, 0x62, 0xE5, 0x64, 0x1E, 0xEB, 0x2B, + 0x3C, 0x67, 0xC8, 0xDC, 0x27, 0x00, 0xF6, 0x91, 0x68, 0x65, + 0xA9, 0x02, 0x03, 0x01, 0x00, 0x01, 0xA3, 0x82, 0x01, 0x30, + 0x30, 0x82, 0x01, 0x2C, 0x30, 0x1D, 0x06, 0x03, 0x55, 0x1D, + 0x0E, 0x04, 0x16, 0x04, 0x14, 0x81, 0x69, 0x0F, 0xF8, 0xDF, + 0xDD, 0xCF, 0x34, 0x29, 0xD5, 0x67, 0x75, 0x71, 0x85, 0xC7, + 0x75, 0x10, 0x69, 0x59, 0xEC, 0x30, 0x81, 0xDE, 0x06, 0x03, + 0x55, 0x1D, 0x23, 0x04, 0x81, 0xD6, 0x30, 0x81, 0xD3, 0x80, + 0x14, 0x81, 0x69, 0x0F, 0xF8, 0xDF, 0xDD, 0xCF, 0x34, 0x29, + 0xD5, 0x67, 0x75, 0x71, 0x85, 0xC7, 0x75, 0x10, 0x69, 0x59, + 0xEC, 0xA1, 0x81, 0xA4, 0xA4, 0x81, 0xA1, 0x30, 0x81, 0x9E, + 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, + 0x02, 0x55, 0x53, 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, + 0x04, 0x08, 0x0C, 0x07, 0x4D, 0x6F, 0x6E, 0x74, 0x61, 0x6E, + 0x61, 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x07, + 0x0C, 0x07, 0x42, 0x6F, 0x7A, 0x65, 0x6D, 0x61, 0x6E, 0x31, + 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x0A, 0x0C, 0x0C, + 0x77, 0x6F, 0x6C, 0x66, 0x53, 0x53, 0x4C, 0x5F, 0x31, 0x30, + 0x32, 0x34, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, + 0x0B, 0x0C, 0x10, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, + 0x6D, 0x69, 0x6E, 0x67, 0x2D, 0x31, 0x30, 0x32, 0x34, 0x31, + 0x18, 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0C, 0x0F, + 0x77, 0x77, 0x77, 0x2E, 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, + 0x6C, 0x2E, 0x63, 0x6F, 0x6D, 0x31, 0x1F, 0x30, 0x1D, 0x06, + 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x01, + 0x16, 0x10, 0x69, 0x6E, 0x66, 0x6F, 0x40, 0x77, 0x6F, 0x6C, + 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, 0x6D, 0x82, 0x14, + 0x0A, 0x60, 0xF5, 0x96, 0x2D, 0xA5, 0xE2, 0x63, 0x56, 0x3E, + 0x98, 0x93, 0x65, 0x56, 0x0A, 0x0A, 0x11, 0x23, 0x98, 0x5D, + 0x30, 0x0C, 0x06, 0x03, 0x55, 0x1D, 0x13, 0x04, 0x05, 0x30, + 0x03, 0x01, 0x01, 0xFF, 0x30, 0x1C, 0x06, 0x03, 0x55, 0x1D, + 0x11, 0x04, 0x15, 0x30, 0x13, 0x82, 0x0B, 0x65, 0x78, 0x61, + 0x6D, 0x70, 0x6C, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x87, 0x04, + 0x7F, 0x00, 0x00, 0x01, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, + 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0B, 0x05, 0x00, 0x03, + 0x81, 0x81, 0x00, 0x3D, 0x88, 0x55, 0x62, 0x85, 0xD5, 0xB6, + 0xF5, 0xCF, 0xC8, 0x1E, 0xC6, 0x6F, 0x40, 0x00, 0x4C, 0x72, + 0x2A, 0xC1, 0xEA, 0xA5, 0xA3, 0x1D, 0xFC, 0xA8, 0xFB, 0x9B, + 0x01, 0x56, 0x1E, 0x36, 0xCF, 0x6D, 0x06, 0xBB, 0x2D, 0x4D, + 0x1D, 0xF2, 0xBD, 0x95, 0xE0, 0x21, 0x74, 0x7C, 0xDD, 0x8C, + 0x64, 0xF9, 0x6D, 0x8F, 0x96, 0x99, 0x22, 0x71, 0x4F, 0xC6, + 0xE5, 0xC0, 0x5D, 0xCA, 0xF8, 0x1A, 0xB7, 0x23, 0xF7, 0x40, + 0x13, 0x7D, 0x92, 0x0D, 0x5A, 0x80, 0x28, 0xB9, 0x7C, 0xE2, + 0x87, 0x68, 0xDA, 0x3C, 0xA5, 0xC7, 0x1B, 0x0A, 0x60, 0x32, + 0x71, 0x38, 0xDA, 0xF4, 0xFE, 0x56, 0x7E, 0xFF, 0xF4, 0xA3, + 0x1F, 0xD9, 0x30, 0x96, 0x48, 0x2A, 0x56, 0x90, 0x0E, 0x7D, + 0x86, 0x97, 0xD2, 0xC7, 0xBF, 0xB6, 0x4B, 0x7A, 0x6D, 0x28, + 0x49, 0x42, 0x54, 0xD4, 0x50, 0x5C, 0x13, 0xC8, 0xF1, 0x24, + 0x4F }; static const int sizeof_client_cert_der_1024 = sizeof(client_cert_der_1024); @@ -407,29 +413,70 @@ static const int sizeof_ca_key_der_1024 = sizeof(ca_key_der_1024); /* ./certs/1024/ca-cert.der, 1024-bit */ static const unsigned char ca_cert_der_1024[] = { - 0x30, 0x82, 0x03, 0xB5, 0x30, 0x82, 0x03, 0x1E, 0xA0, 0x03, - 0x02, 0x01, 0x02, 0x02, 0x09, 0x00, 0xDA, 0xFB, 0x6A, 0x0D, - 0xFE, 0xCF, 0x9B, 0x47, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, - 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0B, 0x05, 0x00, 0x30, - 0x81, 0x99, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, - 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x10, 0x30, 0x0E, 0x06, - 0x03, 0x55, 0x04, 0x08, 0x0C, 0x07, 0x4D, 0x6F, 0x6E, 0x74, - 0x61, 0x6E, 0x61, 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, - 0x04, 0x07, 0x0C, 0x07, 0x42, 0x6F, 0x7A, 0x65, 0x6D, 0x61, - 0x6E, 0x31, 0x11, 0x30, 0x0F, 0x06, 0x03, 0x55, 0x04, 0x0A, - 0x0C, 0x08, 0x53, 0x61, 0x77, 0x74, 0x6F, 0x6F, 0x74, 0x68, - 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x0C, - 0x0F, 0x43, 0x6F, 0x6E, 0x73, 0x75, 0x6C, 0x74, 0x69, 0x6E, - 0x67, 0x5F, 0x31, 0x30, 0x32, 0x34, 0x31, 0x18, 0x30, 0x16, - 0x06, 0x03, 0x55, 0x04, 0x03, 0x0C, 0x0F, 0x77, 0x77, 0x77, - 0x2E, 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, - 0x6F, 0x6D, 0x31, 0x1F, 0x30, 0x1D, 0x06, 0x09, 0x2A, 0x86, - 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x01, 0x16, 0x10, 0x69, - 0x6E, 0x66, 0x6F, 0x40, 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, - 0x6C, 0x2E, 0x63, 0x6F, 0x6D, 0x30, 0x1E, 0x17, 0x0D, 0x31, - 0x38, 0x30, 0x34, 0x31, 0x33, 0x31, 0x35, 0x32, 0x33, 0x31, - 0x30, 0x5A, 0x17, 0x0D, 0x32, 0x31, 0x30, 0x31, 0x30, 0x37, - 0x31, 0x35, 0x32, 0x33, 0x31, 0x30, 0x5A, 0x30, 0x81, 0x99, + 0x30, 0x82, 0x03, 0xEA, 0x30, 0x82, 0x03, 0x53, 0xA0, 0x03, + 0x02, 0x01, 0x02, 0x02, 0x14, 0x51, 0x08, 0x0E, 0x66, 0x59, + 0x26, 0xE1, 0x9B, 0xEC, 0xB2, 0xC8, 0x61, 0x15, 0x35, 0x41, + 0x9D, 0x4D, 0xE9, 0x8A, 0xEA, 0x30, 0x0D, 0x06, 0x09, 0x2A, + 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0B, 0x05, 0x00, + 0x30, 0x81, 0x99, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, + 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x10, 0x30, 0x0E, + 0x06, 0x03, 0x55, 0x04, 0x08, 0x0C, 0x07, 0x4D, 0x6F, 0x6E, + 0x74, 0x61, 0x6E, 0x61, 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, + 0x55, 0x04, 0x07, 0x0C, 0x07, 0x42, 0x6F, 0x7A, 0x65, 0x6D, + 0x61, 0x6E, 0x31, 0x11, 0x30, 0x0F, 0x06, 0x03, 0x55, 0x04, + 0x0A, 0x0C, 0x08, 0x53, 0x61, 0x77, 0x74, 0x6F, 0x6F, 0x74, + 0x68, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, 0x0B, + 0x0C, 0x0F, 0x43, 0x6F, 0x6E, 0x73, 0x75, 0x6C, 0x74, 0x69, + 0x6E, 0x67, 0x5F, 0x31, 0x30, 0x32, 0x34, 0x31, 0x18, 0x30, + 0x16, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0C, 0x0F, 0x77, 0x77, + 0x77, 0x2E, 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, + 0x63, 0x6F, 0x6D, 0x31, 0x1F, 0x30, 0x1D, 0x06, 0x09, 0x2A, + 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x01, 0x16, 0x10, + 0x69, 0x6E, 0x66, 0x6F, 0x40, 0x77, 0x6F, 0x6C, 0x66, 0x73, + 0x73, 0x6C, 0x2E, 0x63, 0x6F, 0x6D, 0x30, 0x1E, 0x17, 0x0D, + 0x32, 0x30, 0x30, 0x35, 0x30, 0x37, 0x30, 0x37, 0x33, 0x39, + 0x30, 0x34, 0x5A, 0x17, 0x0D, 0x32, 0x33, 0x30, 0x32, 0x30, + 0x31, 0x30, 0x37, 0x33, 0x39, 0x30, 0x34, 0x5A, 0x30, 0x81, + 0x99, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, + 0x13, 0x02, 0x55, 0x53, 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, + 0x55, 0x04, 0x08, 0x0C, 0x07, 0x4D, 0x6F, 0x6E, 0x74, 0x61, + 0x6E, 0x61, 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, + 0x07, 0x0C, 0x07, 0x42, 0x6F, 0x7A, 0x65, 0x6D, 0x61, 0x6E, + 0x31, 0x11, 0x30, 0x0F, 0x06, 0x03, 0x55, 0x04, 0x0A, 0x0C, + 0x08, 0x53, 0x61, 0x77, 0x74, 0x6F, 0x6F, 0x74, 0x68, 0x31, + 0x18, 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x0C, 0x0F, + 0x43, 0x6F, 0x6E, 0x73, 0x75, 0x6C, 0x74, 0x69, 0x6E, 0x67, + 0x5F, 0x31, 0x30, 0x32, 0x34, 0x31, 0x18, 0x30, 0x16, 0x06, + 0x03, 0x55, 0x04, 0x03, 0x0C, 0x0F, 0x77, 0x77, 0x77, 0x2E, + 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, + 0x6D, 0x31, 0x1F, 0x30, 0x1D, 0x06, 0x09, 0x2A, 0x86, 0x48, + 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x01, 0x16, 0x10, 0x69, 0x6E, + 0x66, 0x6F, 0x40, 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, + 0x2E, 0x63, 0x6F, 0x6D, 0x30, 0x81, 0x9F, 0x30, 0x0D, 0x06, + 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, + 0x05, 0x00, 0x03, 0x81, 0x8D, 0x00, 0x30, 0x81, 0x89, 0x02, + 0x81, 0x81, 0x00, 0xCD, 0xAC, 0xDD, 0x47, 0xEC, 0xBE, 0xB7, + 0x24, 0xC3, 0x63, 0x1B, 0x54, 0x98, 0x79, 0xE1, 0xC7, 0x31, + 0x16, 0x59, 0xD6, 0x9D, 0x77, 0x9D, 0x8D, 0xE2, 0x8B, 0xED, + 0x04, 0x17, 0xB2, 0xC6, 0xEB, 0xE4, 0x9B, 0x91, 0xBE, 0x31, + 0x50, 0x62, 0x97, 0x58, 0xB5, 0x7F, 0x29, 0xDE, 0xB3, 0x71, + 0x24, 0x0B, 0xBF, 0x97, 0x09, 0x7F, 0x26, 0xDC, 0x2D, 0xEC, + 0xA8, 0x2E, 0xB2, 0x64, 0x2B, 0x7A, 0x2B, 0x35, 0x19, 0x2D, + 0xA2, 0x80, 0xCB, 0x99, 0xFD, 0x94, 0x71, 0x1B, 0x23, 0x8D, + 0x54, 0xDB, 0x2E, 0x62, 0x8D, 0x81, 0x08, 0x2D, 0xF4, 0x24, + 0x72, 0x27, 0x6C, 0xF9, 0xC9, 0x8E, 0xDB, 0x4C, 0x75, 0xBA, + 0x9B, 0x01, 0xF8, 0x3F, 0x18, 0xF4, 0xE6, 0x7F, 0xFB, 0x57, + 0x94, 0x92, 0xCC, 0x88, 0xC4, 0xB4, 0x00, 0xC2, 0xAA, 0xD4, + 0xE5, 0x88, 0x18, 0xB3, 0x11, 0x2F, 0x73, 0xC0, 0xD6, 0x29, + 0x09, 0x02, 0x03, 0x01, 0x00, 0x01, 0xA3, 0x82, 0x01, 0x2B, + 0x30, 0x82, 0x01, 0x27, 0x30, 0x1D, 0x06, 0x03, 0x55, 0x1D, + 0x0E, 0x04, 0x16, 0x04, 0x14, 0xD3, 0x22, 0x8F, 0x28, 0x2C, + 0xE0, 0x05, 0xEE, 0xD3, 0xED, 0xC3, 0x71, 0x3D, 0xC9, 0xB2, + 0x36, 0x3A, 0x1D, 0xBF, 0xA8, 0x30, 0x81, 0xD9, 0x06, 0x03, + 0x55, 0x1D, 0x23, 0x04, 0x81, 0xD1, 0x30, 0x81, 0xCE, 0x80, + 0x14, 0xD3, 0x22, 0x8F, 0x28, 0x2C, 0xE0, 0x05, 0xEE, 0xD3, + 0xED, 0xC3, 0x71, 0x3D, 0xC9, 0xB2, 0x36, 0x3A, 0x1D, 0xBF, + 0xA8, 0xA1, 0x81, 0x9F, 0xA4, 0x81, 0x9C, 0x30, 0x81, 0x99, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0C, 0x07, 0x4D, 0x6F, 0x6E, 0x74, 0x61, 0x6E, @@ -445,64 +492,28 @@ static const unsigned char ca_cert_der_1024[] = 0x31, 0x1F, 0x30, 0x1D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x01, 0x16, 0x10, 0x69, 0x6E, 0x66, 0x6F, 0x40, 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, - 0x63, 0x6F, 0x6D, 0x30, 0x81, 0x9F, 0x30, 0x0D, 0x06, 0x09, - 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, 0x05, - 0x00, 0x03, 0x81, 0x8D, 0x00, 0x30, 0x81, 0x89, 0x02, 0x81, - 0x81, 0x00, 0xCD, 0xAC, 0xDD, 0x47, 0xEC, 0xBE, 0xB7, 0x24, - 0xC3, 0x63, 0x1B, 0x54, 0x98, 0x79, 0xE1, 0xC7, 0x31, 0x16, - 0x59, 0xD6, 0x9D, 0x77, 0x9D, 0x8D, 0xE2, 0x8B, 0xED, 0x04, - 0x17, 0xB2, 0xC6, 0xEB, 0xE4, 0x9B, 0x91, 0xBE, 0x31, 0x50, - 0x62, 0x97, 0x58, 0xB5, 0x7F, 0x29, 0xDE, 0xB3, 0x71, 0x24, - 0x0B, 0xBF, 0x97, 0x09, 0x7F, 0x26, 0xDC, 0x2D, 0xEC, 0xA8, - 0x2E, 0xB2, 0x64, 0x2B, 0x7A, 0x2B, 0x35, 0x19, 0x2D, 0xA2, - 0x80, 0xCB, 0x99, 0xFD, 0x94, 0x71, 0x1B, 0x23, 0x8D, 0x54, - 0xDB, 0x2E, 0x62, 0x8D, 0x81, 0x08, 0x2D, 0xF4, 0x24, 0x72, - 0x27, 0x6C, 0xF9, 0xC9, 0x8E, 0xDB, 0x4C, 0x75, 0xBA, 0x9B, - 0x01, 0xF8, 0x3F, 0x18, 0xF4, 0xE6, 0x7F, 0xFB, 0x57, 0x94, - 0x92, 0xCC, 0x88, 0xC4, 0xB4, 0x00, 0xC2, 0xAA, 0xD4, 0xE5, - 0x88, 0x18, 0xB3, 0x11, 0x2F, 0x73, 0xC0, 0xD6, 0x29, 0x09, - 0x02, 0x03, 0x01, 0x00, 0x01, 0xA3, 0x82, 0x01, 0x01, 0x30, - 0x81, 0xFE, 0x30, 0x1D, 0x06, 0x03, 0x55, 0x1D, 0x0E, 0x04, - 0x16, 0x04, 0x14, 0xD3, 0x22, 0x8F, 0x28, 0x2C, 0xE0, 0x05, - 0xEE, 0xD3, 0xED, 0xC3, 0x71, 0x3D, 0xC9, 0xB2, 0x36, 0x3A, - 0x1D, 0xBF, 0xA8, 0x30, 0x81, 0xCE, 0x06, 0x03, 0x55, 0x1D, - 0x23, 0x04, 0x81, 0xC6, 0x30, 0x81, 0xC3, 0x80, 0x14, 0xD3, - 0x22, 0x8F, 0x28, 0x2C, 0xE0, 0x05, 0xEE, 0xD3, 0xED, 0xC3, - 0x71, 0x3D, 0xC9, 0xB2, 0x36, 0x3A, 0x1D, 0xBF, 0xA8, 0xA1, - 0x81, 0x9F, 0xA4, 0x81, 0x9C, 0x30, 0x81, 0x99, 0x31, 0x0B, - 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, - 0x53, 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x08, - 0x0C, 0x07, 0x4D, 0x6F, 0x6E, 0x74, 0x61, 0x6E, 0x61, 0x31, - 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0C, 0x07, - 0x42, 0x6F, 0x7A, 0x65, 0x6D, 0x61, 0x6E, 0x31, 0x11, 0x30, - 0x0F, 0x06, 0x03, 0x55, 0x04, 0x0A, 0x0C, 0x08, 0x53, 0x61, - 0x77, 0x74, 0x6F, 0x6F, 0x74, 0x68, 0x31, 0x18, 0x30, 0x16, - 0x06, 0x03, 0x55, 0x04, 0x0B, 0x0C, 0x0F, 0x43, 0x6F, 0x6E, - 0x73, 0x75, 0x6C, 0x74, 0x69, 0x6E, 0x67, 0x5F, 0x31, 0x30, - 0x32, 0x34, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, - 0x03, 0x0C, 0x0F, 0x77, 0x77, 0x77, 0x2E, 0x77, 0x6F, 0x6C, - 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, 0x6D, 0x31, 0x1F, - 0x30, 0x1D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, - 0x01, 0x09, 0x01, 0x16, 0x10, 0x69, 0x6E, 0x66, 0x6F, 0x40, - 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, - 0x6D, 0x82, 0x09, 0x00, 0xDA, 0xFB, 0x6A, 0x0D, 0xFE, 0xCF, - 0x9B, 0x47, 0x30, 0x0C, 0x06, 0x03, 0x55, 0x1D, 0x13, 0x04, - 0x05, 0x30, 0x03, 0x01, 0x01, 0xFF, 0x30, 0x0D, 0x06, 0x09, - 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0B, 0x05, - 0x00, 0x03, 0x81, 0x81, 0x00, 0x1D, 0x48, 0xF6, 0x40, 0x41, - 0x04, 0x06, 0xF2, 0xE4, 0x72, 0x2F, 0xEA, 0xFF, 0xC1, 0x67, - 0x6B, 0x15, 0xBB, 0x0A, 0x28, 0x23, 0x28, 0x07, 0xC6, 0xD7, - 0x13, 0x2C, 0xBE, 0x00, 0x00, 0xAC, 0x1D, 0xF7, 0xF4, 0x92, - 0xD3, 0x2B, 0xAF, 0x23, 0xEB, 0x9F, 0x1A, 0xE2, 0x11, 0x3C, - 0x2D, 0x97, 0xF2, 0x0F, 0xAC, 0xAE, 0x97, 0x86, 0x0A, 0xFB, - 0xA8, 0x4F, 0x74, 0x1B, 0xDE, 0x19, 0x51, 0xDB, 0xCD, 0xE2, - 0x11, 0x38, 0xC1, 0xA4, 0x9D, 0x56, 0xAB, 0x47, 0x5C, 0xDE, - 0xBA, 0xEB, 0x27, 0xDF, 0x6D, 0xC8, 0x7E, 0x3A, 0xBD, 0x2E, - 0x9B, 0x2A, 0xAD, 0x22, 0x3B, 0x95, 0xA9, 0xF2, 0x28, 0x03, - 0xBC, 0xE5, 0xEC, 0xCC, 0xF2, 0x08, 0xD4, 0xC8, 0x2F, 0xDB, - 0xEA, 0xFB, 0x2E, 0x52, 0x16, 0x8C, 0x42, 0x02, 0xA4, 0x59, - 0x6D, 0x4C, 0x33, 0xB4, 0x9A, 0xD2, 0x73, 0x4A, 0x1E, 0x9F, - 0xD9, 0xC8, 0x83 + 0x63, 0x6F, 0x6D, 0x82, 0x14, 0x51, 0x08, 0x0E, 0x66, 0x59, + 0x26, 0xE1, 0x9B, 0xEC, 0xB2, 0xC8, 0x61, 0x15, 0x35, 0x41, + 0x9D, 0x4D, 0xE9, 0x8A, 0xEA, 0x30, 0x0C, 0x06, 0x03, 0x55, + 0x1D, 0x13, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xFF, 0x30, + 0x1C, 0x06, 0x03, 0x55, 0x1D, 0x11, 0x04, 0x15, 0x30, 0x13, + 0x82, 0x0B, 0x65, 0x78, 0x61, 0x6D, 0x70, 0x6C, 0x65, 0x2E, + 0x63, 0x6F, 0x6D, 0x87, 0x04, 0x7F, 0x00, 0x00, 0x01, 0x30, + 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, + 0x01, 0x0B, 0x05, 0x00, 0x03, 0x81, 0x81, 0x00, 0xBB, 0x85, + 0x81, 0x52, 0xE4, 0x7E, 0xD9, 0x40, 0x36, 0x97, 0x7F, 0xE1, + 0xDB, 0xFE, 0x8E, 0x1F, 0xE5, 0xF4, 0xD8, 0x05, 0x8E, 0x25, + 0x43, 0x6A, 0xF2, 0x6F, 0x5F, 0xD2, 0x5C, 0xB8, 0xF0, 0xA2, + 0x71, 0x16, 0xB7, 0x87, 0x0C, 0x53, 0xD5, 0x50, 0x94, 0x4A, + 0x89, 0xCA, 0xD7, 0xA3, 0xF1, 0xDB, 0xBC, 0x03, 0x44, 0x34, + 0x84, 0xF9, 0xCB, 0x98, 0xA8, 0x3C, 0xCD, 0xA1, 0x1C, 0x95, + 0x19, 0xD0, 0x48, 0xAE, 0xB3, 0x59, 0x70, 0x52, 0x2B, 0x19, + 0x02, 0x05, 0x35, 0xB5, 0x5C, 0x7A, 0xA9, 0x1E, 0x5E, 0x53, + 0x74, 0x1D, 0x70, 0xEE, 0xFC, 0xEB, 0x0E, 0x64, 0x6A, 0x5C, + 0x50, 0x7E, 0x87, 0x9E, 0x85, 0x8F, 0x21, 0xC3, 0x39, 0x83, + 0xE2, 0xCE, 0x62, 0x88, 0x7B, 0x72, 0x74, 0x50, 0x09, 0x7B, + 0xC6, 0x1D, 0x8F, 0x33, 0x82, 0xAE, 0x3F, 0x6F, 0x11, 0x11, + 0x42, 0xDC, 0xC5, 0xBD, 0xB8, 0x3F }; static const int sizeof_ca_cert_der_1024 = sizeof(ca_cert_der_1024); @@ -576,7 +587,7 @@ static const int sizeof_server_key_der_1024 = sizeof(server_key_der_1024); /* ./certs/1024/server-cert.der, 1024-bit */ static const unsigned char server_cert_der_1024[] = { - 0x30, 0x82, 0x03, 0xA9, 0x30, 0x82, 0x03, 0x12, 0xA0, 0x03, + 0x30, 0x82, 0x03, 0xD3, 0x30, 0x82, 0x03, 0x3C, 0xA0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x01, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0B, 0x05, 0x00, 0x30, 0x81, 0x99, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, @@ -595,9 +606,9 @@ static const unsigned char server_cert_der_1024[] = 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x01, 0x16, 0x10, 0x69, 0x6E, 0x66, 0x6F, 0x40, 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, 0x6D, 0x30, 0x1E, 0x17, - 0x0D, 0x31, 0x38, 0x30, 0x34, 0x31, 0x33, 0x31, 0x35, 0x32, - 0x33, 0x31, 0x30, 0x5A, 0x17, 0x0D, 0x32, 0x31, 0x30, 0x31, - 0x30, 0x37, 0x31, 0x35, 0x32, 0x33, 0x31, 0x30, 0x5A, 0x30, + 0x0D, 0x32, 0x30, 0x30, 0x35, 0x30, 0x37, 0x30, 0x37, 0x33, + 0x39, 0x30, 0x34, 0x5A, 0x17, 0x0D, 0x32, 0x33, 0x30, 0x32, + 0x30, 0x31, 0x30, 0x37, 0x33, 0x39, 0x30, 0x34, 0x5A, 0x30, 0x81, 0x95, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0C, 0x07, 0x4D, 0x6F, 0x6E, 0x74, @@ -629,48 +640,52 @@ static const unsigned char server_cert_der_1024[] = 0xAD, 0xFD, 0x5C, 0x86, 0x73, 0xAA, 0x6B, 0x47, 0xD8, 0x8B, 0x2E, 0x58, 0x4B, 0x69, 0x12, 0x82, 0x26, 0x55, 0xE6, 0x14, 0xBF, 0x55, 0x70, 0x88, 0xFE, 0xF9, 0x75, 0xE1, 0x02, 0x03, - 0x01, 0x00, 0x01, 0xA3, 0x82, 0x01, 0x01, 0x30, 0x81, 0xFE, - 0x30, 0x1D, 0x06, 0x03, 0x55, 0x1D, 0x0E, 0x04, 0x16, 0x04, - 0x14, 0xD9, 0x3C, 0x35, 0xEA, 0x74, 0x0E, 0x23, 0xBE, 0x9C, - 0xFC, 0xFA, 0x29, 0x90, 0x09, 0xC1, 0xE7, 0x84, 0x16, 0x9F, - 0x7C, 0x30, 0x81, 0xCE, 0x06, 0x03, 0x55, 0x1D, 0x23, 0x04, - 0x81, 0xC6, 0x30, 0x81, 0xC3, 0x80, 0x14, 0xD3, 0x22, 0x8F, - 0x28, 0x2C, 0xE0, 0x05, 0xEE, 0xD3, 0xED, 0xC3, 0x71, 0x3D, - 0xC9, 0xB2, 0x36, 0x3A, 0x1D, 0xBF, 0xA8, 0xA1, 0x81, 0x9F, - 0xA4, 0x81, 0x9C, 0x30, 0x81, 0x99, 0x31, 0x0B, 0x30, 0x09, - 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, - 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0C, 0x07, - 0x4D, 0x6F, 0x6E, 0x74, 0x61, 0x6E, 0x61, 0x31, 0x10, 0x30, - 0x0E, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0C, 0x07, 0x42, 0x6F, - 0x7A, 0x65, 0x6D, 0x61, 0x6E, 0x31, 0x11, 0x30, 0x0F, 0x06, - 0x03, 0x55, 0x04, 0x0A, 0x0C, 0x08, 0x53, 0x61, 0x77, 0x74, - 0x6F, 0x6F, 0x74, 0x68, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, - 0x55, 0x04, 0x0B, 0x0C, 0x0F, 0x43, 0x6F, 0x6E, 0x73, 0x75, - 0x6C, 0x74, 0x69, 0x6E, 0x67, 0x5F, 0x31, 0x30, 0x32, 0x34, - 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0C, - 0x0F, 0x77, 0x77, 0x77, 0x2E, 0x77, 0x6F, 0x6C, 0x66, 0x73, - 0x73, 0x6C, 0x2E, 0x63, 0x6F, 0x6D, 0x31, 0x1F, 0x30, 0x1D, - 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, - 0x01, 0x16, 0x10, 0x69, 0x6E, 0x66, 0x6F, 0x40, 0x77, 0x6F, - 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, 0x6D, 0x82, - 0x09, 0x00, 0xDA, 0xFB, 0x6A, 0x0D, 0xFE, 0xCF, 0x9B, 0x47, - 0x30, 0x0C, 0x06, 0x03, 0x55, 0x1D, 0x13, 0x04, 0x05, 0x30, - 0x03, 0x01, 0x01, 0xFF, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, - 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0B, 0x05, 0x00, 0x03, - 0x81, 0x81, 0x00, 0x0B, 0xC3, 0xAF, 0x43, 0x85, 0x64, 0x61, - 0xE7, 0xAB, 0x5A, 0x2A, 0x1B, 0xB2, 0x29, 0xD5, 0x66, 0x68, - 0x44, 0x1A, 0x6D, 0x66, 0xFC, 0x3D, 0xB1, 0x88, 0xEC, 0xA5, - 0x41, 0x18, 0x67, 0x62, 0x34, 0xA4, 0x5E, 0xC9, 0x69, 0xCD, - 0x40, 0xC8, 0x56, 0x7E, 0xBF, 0xEB, 0xBC, 0x61, 0x1F, 0x33, - 0x34, 0x58, 0xBE, 0x57, 0xFD, 0xE6, 0x98, 0xDD, 0x51, 0x27, - 0x7C, 0xB7, 0x2C, 0xBC, 0xC9, 0x39, 0xE5, 0xE5, 0x95, 0x82, - 0xE1, 0x3F, 0xD9, 0xB9, 0x97, 0x30, 0x4E, 0x33, 0x2C, 0xEF, - 0xF8, 0xDB, 0xB4, 0xEE, 0x35, 0x75, 0x9E, 0x7A, 0x3F, 0x22, - 0x8F, 0xA5, 0x71, 0xD4, 0x01, 0x64, 0x6C, 0xF2, 0x85, 0xF7, - 0x72, 0x99, 0x2C, 0x80, 0x0F, 0xA4, 0x31, 0x1D, 0xD4, 0x0B, - 0x1E, 0xA5, 0x0F, 0xE7, 0x53, 0x0A, 0xDE, 0x15, 0x0D, 0xB2, - 0xD0, 0x6B, 0xF4, 0xD6, 0x2F, 0xE2, 0x0B, 0xA3, 0x8A, 0x5A, - 0x6E + 0x01, 0x00, 0x01, 0xA3, 0x82, 0x01, 0x2B, 0x30, 0x82, 0x01, + 0x27, 0x30, 0x1D, 0x06, 0x03, 0x55, 0x1D, 0x0E, 0x04, 0x16, + 0x04, 0x14, 0xD9, 0x3C, 0x35, 0xEA, 0x74, 0x0E, 0x23, 0xBE, + 0x9C, 0xFC, 0xFA, 0x29, 0x90, 0x09, 0xC1, 0xE7, 0x84, 0x16, + 0x9F, 0x7C, 0x30, 0x81, 0xD9, 0x06, 0x03, 0x55, 0x1D, 0x23, + 0x04, 0x81, 0xD1, 0x30, 0x81, 0xCE, 0x80, 0x14, 0xD3, 0x22, + 0x8F, 0x28, 0x2C, 0xE0, 0x05, 0xEE, 0xD3, 0xED, 0xC3, 0x71, + 0x3D, 0xC9, 0xB2, 0x36, 0x3A, 0x1D, 0xBF, 0xA8, 0xA1, 0x81, + 0x9F, 0xA4, 0x81, 0x9C, 0x30, 0x81, 0x99, 0x31, 0x0B, 0x30, + 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, + 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0C, + 0x07, 0x4D, 0x6F, 0x6E, 0x74, 0x61, 0x6E, 0x61, 0x31, 0x10, + 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0C, 0x07, 0x42, + 0x6F, 0x7A, 0x65, 0x6D, 0x61, 0x6E, 0x31, 0x11, 0x30, 0x0F, + 0x06, 0x03, 0x55, 0x04, 0x0A, 0x0C, 0x08, 0x53, 0x61, 0x77, + 0x74, 0x6F, 0x6F, 0x74, 0x68, 0x31, 0x18, 0x30, 0x16, 0x06, + 0x03, 0x55, 0x04, 0x0B, 0x0C, 0x0F, 0x43, 0x6F, 0x6E, 0x73, + 0x75, 0x6C, 0x74, 0x69, 0x6E, 0x67, 0x5F, 0x31, 0x30, 0x32, + 0x34, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, 0x03, + 0x0C, 0x0F, 0x77, 0x77, 0x77, 0x2E, 0x77, 0x6F, 0x6C, 0x66, + 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, 0x6D, 0x31, 0x1F, 0x30, + 0x1D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, + 0x09, 0x01, 0x16, 0x10, 0x69, 0x6E, 0x66, 0x6F, 0x40, 0x77, + 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, 0x6D, + 0x82, 0x14, 0x51, 0x08, 0x0E, 0x66, 0x59, 0x26, 0xE1, 0x9B, + 0xEC, 0xB2, 0xC8, 0x61, 0x15, 0x35, 0x41, 0x9D, 0x4D, 0xE9, + 0x8A, 0xEA, 0x30, 0x0C, 0x06, 0x03, 0x55, 0x1D, 0x13, 0x04, + 0x05, 0x30, 0x03, 0x01, 0x01, 0xFF, 0x30, 0x1C, 0x06, 0x03, + 0x55, 0x1D, 0x11, 0x04, 0x15, 0x30, 0x13, 0x82, 0x0B, 0x65, + 0x78, 0x61, 0x6D, 0x70, 0x6C, 0x65, 0x2E, 0x63, 0x6F, 0x6D, + 0x87, 0x04, 0x7F, 0x00, 0x00, 0x01, 0x30, 0x0D, 0x06, 0x09, + 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0B, 0x05, + 0x00, 0x03, 0x81, 0x81, 0x00, 0x89, 0xCD, 0xFC, 0x5F, 0x7B, + 0x99, 0x2C, 0xCD, 0x83, 0x9D, 0xC9, 0xA5, 0xDD, 0xC8, 0x7C, + 0x66, 0x1D, 0x05, 0x9D, 0xA6, 0xFA, 0x01, 0xD7, 0x20, 0x25, + 0x6A, 0xA8, 0x22, 0x6B, 0x16, 0x74, 0x21, 0xC4, 0x8F, 0x32, + 0x36, 0xDF, 0xE3, 0x08, 0xBE, 0x8F, 0xA4, 0x1D, 0x45, 0xFE, + 0x1B, 0x80, 0x7F, 0x39, 0xB3, 0xCE, 0x7F, 0xDF, 0xD9, 0x04, + 0x2E, 0x83, 0xB7, 0x18, 0x9D, 0x5D, 0xD9, 0x6C, 0x23, 0xFA, + 0xCD, 0x0D, 0x0F, 0x98, 0x7B, 0x53, 0x8A, 0xC1, 0xA7, 0xA4, + 0x90, 0xD5, 0x2A, 0xB7, 0x44, 0x29, 0x83, 0x74, 0xCA, 0xB5, + 0xB9, 0x41, 0xA5, 0x43, 0xD7, 0x22, 0xA6, 0x02, 0x6A, 0xA8, + 0x28, 0x5C, 0xBE, 0x9A, 0x6E, 0x83, 0x38, 0x08, 0xB6, 0x5A, + 0x2F, 0x48, 0x5F, 0x4E, 0x67, 0xBF, 0xDA, 0xF3, 0x5F, 0xEF, + 0x0E, 0xF6, 0x53, 0x0B, 0x80, 0x43, 0x48, 0xBC, 0x4A, 0x4A, + 0x89, 0xA6, 0x37 }; static const int sizeof_server_cert_der_1024 = sizeof(server_cert_der_1024); @@ -843,10 +858,84 @@ static const int sizeof_client_keypub_der_2048 = sizeof(client_keypub_der_2048); /* ./certs/client-cert.der, 2048-bit */ static const unsigned char client_cert_der_2048[] = { - 0x30, 0x82, 0x04, 0xCA, 0x30, 0x82, 0x03, 0xB2, 0xA0, 0x03, - 0x02, 0x01, 0x02, 0x02, 0x09, 0x00, 0xAA, 0xC4, 0xBF, 0x4C, - 0x50, 0xBD, 0x55, 0x77, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, - 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0B, 0x05, 0x00, 0x30, + 0x30, 0x82, 0x04, 0xFE, 0x30, 0x82, 0x03, 0xE6, 0xA0, 0x03, + 0x02, 0x01, 0x02, 0x02, 0x14, 0x6F, 0xB0, 0xB4, 0x88, 0xA8, + 0x2E, 0xE4, 0x23, 0xA4, 0xDC, 0xAF, 0x14, 0x4C, 0x33, 0x40, + 0x79, 0x52, 0x47, 0xEF, 0x97, 0x30, 0x0D, 0x06, 0x09, 0x2A, + 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0B, 0x05, 0x00, + 0x30, 0x81, 0x9E, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, + 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x10, 0x30, 0x0E, + 0x06, 0x03, 0x55, 0x04, 0x08, 0x0C, 0x07, 0x4D, 0x6F, 0x6E, + 0x74, 0x61, 0x6E, 0x61, 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, + 0x55, 0x04, 0x07, 0x0C, 0x07, 0x42, 0x6F, 0x7A, 0x65, 0x6D, + 0x61, 0x6E, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, + 0x0A, 0x0C, 0x0C, 0x77, 0x6F, 0x6C, 0x66, 0x53, 0x53, 0x4C, + 0x5F, 0x32, 0x30, 0x34, 0x38, 0x31, 0x19, 0x30, 0x17, 0x06, + 0x03, 0x55, 0x04, 0x0B, 0x0C, 0x10, 0x50, 0x72, 0x6F, 0x67, + 0x72, 0x61, 0x6D, 0x6D, 0x69, 0x6E, 0x67, 0x2D, 0x32, 0x30, + 0x34, 0x38, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, + 0x03, 0x0C, 0x0F, 0x77, 0x77, 0x77, 0x2E, 0x77, 0x6F, 0x6C, + 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, 0x6D, 0x31, 0x1F, + 0x30, 0x1D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, + 0x01, 0x09, 0x01, 0x16, 0x10, 0x69, 0x6E, 0x66, 0x6F, 0x40, + 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, + 0x6D, 0x30, 0x1E, 0x17, 0x0D, 0x32, 0x30, 0x30, 0x35, 0x30, + 0x37, 0x30, 0x37, 0x33, 0x39, 0x30, 0x33, 0x5A, 0x17, 0x0D, + 0x32, 0x33, 0x30, 0x32, 0x30, 0x31, 0x30, 0x37, 0x33, 0x39, + 0x30, 0x33, 0x5A, 0x30, 0x81, 0x9E, 0x31, 0x0B, 0x30, 0x09, + 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, + 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0C, 0x07, + 0x4D, 0x6F, 0x6E, 0x74, 0x61, 0x6E, 0x61, 0x31, 0x10, 0x30, + 0x0E, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0C, 0x07, 0x42, 0x6F, + 0x7A, 0x65, 0x6D, 0x61, 0x6E, 0x31, 0x15, 0x30, 0x13, 0x06, + 0x03, 0x55, 0x04, 0x0A, 0x0C, 0x0C, 0x77, 0x6F, 0x6C, 0x66, + 0x53, 0x53, 0x4C, 0x5F, 0x32, 0x30, 0x34, 0x38, 0x31, 0x19, + 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x0C, 0x10, 0x50, + 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x6D, 0x69, 0x6E, 0x67, + 0x2D, 0x32, 0x30, 0x34, 0x38, 0x31, 0x18, 0x30, 0x16, 0x06, + 0x03, 0x55, 0x04, 0x03, 0x0C, 0x0F, 0x77, 0x77, 0x77, 0x2E, + 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, + 0x6D, 0x31, 0x1F, 0x30, 0x1D, 0x06, 0x09, 0x2A, 0x86, 0x48, + 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x01, 0x16, 0x10, 0x69, 0x6E, + 0x66, 0x6F, 0x40, 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, + 0x2E, 0x63, 0x6F, 0x6D, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0D, + 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, + 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0F, 0x00, 0x30, 0x82, + 0x01, 0x0A, 0x02, 0x82, 0x01, 0x01, 0x00, 0xC3, 0x03, 0xD1, + 0x2B, 0xFE, 0x39, 0xA4, 0x32, 0x45, 0x3B, 0x53, 0xC8, 0x84, + 0x2B, 0x2A, 0x7C, 0x74, 0x9A, 0xBD, 0xAA, 0x2A, 0x52, 0x07, + 0x47, 0xD6, 0xA6, 0x36, 0xB2, 0x07, 0x32, 0x8E, 0xD0, 0xBA, + 0x69, 0x7B, 0xC6, 0xC3, 0x44, 0x9E, 0xD4, 0x81, 0x48, 0xFD, + 0x2D, 0x68, 0xA2, 0x8B, 0x67, 0xBB, 0xA1, 0x75, 0xC8, 0x36, + 0x2C, 0x4A, 0xD2, 0x1B, 0xF7, 0x8B, 0xBA, 0xCF, 0x0D, 0xF9, + 0xEF, 0xEC, 0xF1, 0x81, 0x1E, 0x7B, 0x9B, 0x03, 0x47, 0x9A, + 0xBF, 0x65, 0xCC, 0x7F, 0x65, 0x24, 0x69, 0xA6, 0xE8, 0x14, + 0x89, 0x5B, 0xE4, 0x34, 0xF7, 0xC5, 0xB0, 0x14, 0x93, 0xF5, + 0x67, 0x7B, 0x3A, 0x7A, 0x78, 0xE1, 0x01, 0x56, 0x56, 0x91, + 0xA6, 0x13, 0x42, 0x8D, 0xD2, 0x3C, 0x40, 0x9C, 0x4C, 0xEF, + 0xD1, 0x86, 0xDF, 0x37, 0x51, 0x1B, 0x0C, 0xA1, 0x3B, 0xF5, + 0xF1, 0xA3, 0x4A, 0x35, 0xE4, 0xE1, 0xCE, 0x96, 0xDF, 0x1B, + 0x7E, 0xBF, 0x4E, 0x97, 0xD0, 0x10, 0xE8, 0xA8, 0x08, 0x30, + 0x81, 0xAF, 0x20, 0x0B, 0x43, 0x14, 0xC5, 0x74, 0x67, 0xB4, + 0x32, 0x82, 0x6F, 0x8D, 0x86, 0xC2, 0x88, 0x40, 0x99, 0x36, + 0x83, 0xBA, 0x1E, 0x40, 0x72, 0x22, 0x17, 0xD7, 0x52, 0x65, + 0x24, 0x73, 0xB0, 0xCE, 0xEF, 0x19, 0xCD, 0xAE, 0xFF, 0x78, + 0x6C, 0x7B, 0xC0, 0x12, 0x03, 0xD4, 0x4E, 0x72, 0x0D, 0x50, + 0x6D, 0x3B, 0xA3, 0x3B, 0xA3, 0x99, 0x5E, 0x9D, 0xC8, 0xD9, + 0x0C, 0x85, 0xB3, 0xD9, 0x8A, 0xD9, 0x54, 0x26, 0xDB, 0x6D, + 0xFA, 0xAC, 0xBB, 0xFF, 0x25, 0x4C, 0xC4, 0xD1, 0x79, 0xF4, + 0x71, 0xD3, 0x86, 0x40, 0x18, 0x13, 0xB0, 0x63, 0xB5, 0x72, + 0x4E, 0x30, 0xC4, 0x97, 0x84, 0x86, 0x2D, 0x56, 0x2F, 0xD7, + 0x15, 0xF7, 0x7F, 0xC0, 0xAE, 0xF5, 0xFC, 0x5B, 0xE5, 0xFB, + 0xA1, 0xBA, 0xD3, 0x02, 0x03, 0x01, 0x00, 0x01, 0xA3, 0x82, + 0x01, 0x30, 0x30, 0x82, 0x01, 0x2C, 0x30, 0x1D, 0x06, 0x03, + 0x55, 0x1D, 0x0E, 0x04, 0x16, 0x04, 0x14, 0x33, 0xD8, 0x45, + 0x66, 0xD7, 0x68, 0x87, 0x18, 0x7E, 0x54, 0x0D, 0x70, 0x27, + 0x91, 0xC7, 0x26, 0xD7, 0x85, 0x65, 0xC0, 0x30, 0x81, 0xDE, + 0x06, 0x03, 0x55, 0x1D, 0x23, 0x04, 0x81, 0xD6, 0x30, 0x81, + 0xD3, 0x80, 0x14, 0x33, 0xD8, 0x45, 0x66, 0xD7, 0x68, 0x87, + 0x18, 0x7E, 0x54, 0x0D, 0x70, 0x27, 0x91, 0xC7, 0x26, 0xD7, + 0x85, 0x65, 0xC0, 0xA1, 0x81, 0xA4, 0xA4, 0x81, 0xA1, 0x30, 0x81, 0x9E, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0C, 0x07, 0x4D, 0x6F, 0x6E, 0x74, @@ -863,110 +952,41 @@ static const unsigned char client_cert_der_2048[] = 0x1D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x01, 0x16, 0x10, 0x69, 0x6E, 0x66, 0x6F, 0x40, 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, 0x6D, - 0x30, 0x1E, 0x17, 0x0D, 0x31, 0x38, 0x30, 0x34, 0x31, 0x33, - 0x31, 0x35, 0x32, 0x33, 0x30, 0x39, 0x5A, 0x17, 0x0D, 0x32, - 0x31, 0x30, 0x31, 0x30, 0x37, 0x31, 0x35, 0x32, 0x33, 0x30, - 0x39, 0x5A, 0x30, 0x81, 0x9E, 0x31, 0x0B, 0x30, 0x09, 0x06, - 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x10, - 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0C, 0x07, 0x4D, - 0x6F, 0x6E, 0x74, 0x61, 0x6E, 0x61, 0x31, 0x10, 0x30, 0x0E, - 0x06, 0x03, 0x55, 0x04, 0x07, 0x0C, 0x07, 0x42, 0x6F, 0x7A, - 0x65, 0x6D, 0x61, 0x6E, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, - 0x55, 0x04, 0x0A, 0x0C, 0x0C, 0x77, 0x6F, 0x6C, 0x66, 0x53, - 0x53, 0x4C, 0x5F, 0x32, 0x30, 0x34, 0x38, 0x31, 0x19, 0x30, - 0x17, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x0C, 0x10, 0x50, 0x72, - 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x6D, 0x69, 0x6E, 0x67, 0x2D, - 0x32, 0x30, 0x34, 0x38, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, - 0x55, 0x04, 0x03, 0x0C, 0x0F, 0x77, 0x77, 0x77, 0x2E, 0x77, - 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, 0x6D, - 0x31, 0x1F, 0x30, 0x1D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, - 0xF7, 0x0D, 0x01, 0x09, 0x01, 0x16, 0x10, 0x69, 0x6E, 0x66, - 0x6F, 0x40, 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, - 0x63, 0x6F, 0x6D, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0D, 0x06, - 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, - 0x05, 0x00, 0x03, 0x82, 0x01, 0x0F, 0x00, 0x30, 0x82, 0x01, - 0x0A, 0x02, 0x82, 0x01, 0x01, 0x00, 0xC3, 0x03, 0xD1, 0x2B, - 0xFE, 0x39, 0xA4, 0x32, 0x45, 0x3B, 0x53, 0xC8, 0x84, 0x2B, - 0x2A, 0x7C, 0x74, 0x9A, 0xBD, 0xAA, 0x2A, 0x52, 0x07, 0x47, - 0xD6, 0xA6, 0x36, 0xB2, 0x07, 0x32, 0x8E, 0xD0, 0xBA, 0x69, - 0x7B, 0xC6, 0xC3, 0x44, 0x9E, 0xD4, 0x81, 0x48, 0xFD, 0x2D, - 0x68, 0xA2, 0x8B, 0x67, 0xBB, 0xA1, 0x75, 0xC8, 0x36, 0x2C, - 0x4A, 0xD2, 0x1B, 0xF7, 0x8B, 0xBA, 0xCF, 0x0D, 0xF9, 0xEF, - 0xEC, 0xF1, 0x81, 0x1E, 0x7B, 0x9B, 0x03, 0x47, 0x9A, 0xBF, - 0x65, 0xCC, 0x7F, 0x65, 0x24, 0x69, 0xA6, 0xE8, 0x14, 0x89, - 0x5B, 0xE4, 0x34, 0xF7, 0xC5, 0xB0, 0x14, 0x93, 0xF5, 0x67, - 0x7B, 0x3A, 0x7A, 0x78, 0xE1, 0x01, 0x56, 0x56, 0x91, 0xA6, - 0x13, 0x42, 0x8D, 0xD2, 0x3C, 0x40, 0x9C, 0x4C, 0xEF, 0xD1, - 0x86, 0xDF, 0x37, 0x51, 0x1B, 0x0C, 0xA1, 0x3B, 0xF5, 0xF1, - 0xA3, 0x4A, 0x35, 0xE4, 0xE1, 0xCE, 0x96, 0xDF, 0x1B, 0x7E, - 0xBF, 0x4E, 0x97, 0xD0, 0x10, 0xE8, 0xA8, 0x08, 0x30, 0x81, - 0xAF, 0x20, 0x0B, 0x43, 0x14, 0xC5, 0x74, 0x67, 0xB4, 0x32, - 0x82, 0x6F, 0x8D, 0x86, 0xC2, 0x88, 0x40, 0x99, 0x36, 0x83, - 0xBA, 0x1E, 0x40, 0x72, 0x22, 0x17, 0xD7, 0x52, 0x65, 0x24, - 0x73, 0xB0, 0xCE, 0xEF, 0x19, 0xCD, 0xAE, 0xFF, 0x78, 0x6C, - 0x7B, 0xC0, 0x12, 0x03, 0xD4, 0x4E, 0x72, 0x0D, 0x50, 0x6D, - 0x3B, 0xA3, 0x3B, 0xA3, 0x99, 0x5E, 0x9D, 0xC8, 0xD9, 0x0C, - 0x85, 0xB3, 0xD9, 0x8A, 0xD9, 0x54, 0x26, 0xDB, 0x6D, 0xFA, - 0xAC, 0xBB, 0xFF, 0x25, 0x4C, 0xC4, 0xD1, 0x79, 0xF4, 0x71, - 0xD3, 0x86, 0x40, 0x18, 0x13, 0xB0, 0x63, 0xB5, 0x72, 0x4E, - 0x30, 0xC4, 0x97, 0x84, 0x86, 0x2D, 0x56, 0x2F, 0xD7, 0x15, - 0xF7, 0x7F, 0xC0, 0xAE, 0xF5, 0xFC, 0x5B, 0xE5, 0xFB, 0xA1, - 0xBA, 0xD3, 0x02, 0x03, 0x01, 0x00, 0x01, 0xA3, 0x82, 0x01, - 0x07, 0x30, 0x82, 0x01, 0x03, 0x30, 0x1D, 0x06, 0x03, 0x55, - 0x1D, 0x0E, 0x04, 0x16, 0x04, 0x14, 0x33, 0xD8, 0x45, 0x66, - 0xD7, 0x68, 0x87, 0x18, 0x7E, 0x54, 0x0D, 0x70, 0x27, 0x91, - 0xC7, 0x26, 0xD7, 0x85, 0x65, 0xC0, 0x30, 0x81, 0xD3, 0x06, - 0x03, 0x55, 0x1D, 0x23, 0x04, 0x81, 0xCB, 0x30, 0x81, 0xC8, - 0x80, 0x14, 0x33, 0xD8, 0x45, 0x66, 0xD7, 0x68, 0x87, 0x18, - 0x7E, 0x54, 0x0D, 0x70, 0x27, 0x91, 0xC7, 0x26, 0xD7, 0x85, - 0x65, 0xC0, 0xA1, 0x81, 0xA4, 0xA4, 0x81, 0xA1, 0x30, 0x81, - 0x9E, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, - 0x13, 0x02, 0x55, 0x53, 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, - 0x55, 0x04, 0x08, 0x0C, 0x07, 0x4D, 0x6F, 0x6E, 0x74, 0x61, - 0x6E, 0x61, 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, - 0x07, 0x0C, 0x07, 0x42, 0x6F, 0x7A, 0x65, 0x6D, 0x61, 0x6E, - 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x0A, 0x0C, - 0x0C, 0x77, 0x6F, 0x6C, 0x66, 0x53, 0x53, 0x4C, 0x5F, 0x32, - 0x30, 0x34, 0x38, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, - 0x04, 0x0B, 0x0C, 0x10, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, - 0x6D, 0x6D, 0x69, 0x6E, 0x67, 0x2D, 0x32, 0x30, 0x34, 0x38, - 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0C, - 0x0F, 0x77, 0x77, 0x77, 0x2E, 0x77, 0x6F, 0x6C, 0x66, 0x73, - 0x73, 0x6C, 0x2E, 0x63, 0x6F, 0x6D, 0x31, 0x1F, 0x30, 0x1D, - 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, - 0x01, 0x16, 0x10, 0x69, 0x6E, 0x66, 0x6F, 0x40, 0x77, 0x6F, - 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, 0x6D, 0x82, - 0x09, 0x00, 0xAA, 0xC4, 0xBF, 0x4C, 0x50, 0xBD, 0x55, 0x77, - 0x30, 0x0C, 0x06, 0x03, 0x55, 0x1D, 0x13, 0x04, 0x05, 0x30, - 0x03, 0x01, 0x01, 0xFF, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, - 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0B, 0x05, 0x00, 0x03, - 0x82, 0x01, 0x01, 0x00, 0x80, 0x52, 0x54, 0x61, 0x2A, 0x77, - 0x80, 0x53, 0x44, 0xA9, 0x80, 0x6D, 0x45, 0xFF, 0x0D, 0x25, - 0x7D, 0x1A, 0x8F, 0x23, 0x93, 0x53, 0x74, 0x35, 0x12, 0x6F, - 0xF0, 0x2E, 0x20, 0xEA, 0xED, 0x80, 0x63, 0x69, 0x88, 0xE6, - 0x0C, 0xA1, 0x49, 0x30, 0xE0, 0x82, 0xDB, 0x68, 0x0F, 0x7E, - 0x84, 0xAC, 0xFF, 0xFF, 0x7B, 0x42, 0xFA, 0x7E, 0x2F, 0xB2, - 0x52, 0x9F, 0xD2, 0x79, 0x5E, 0x35, 0x12, 0x27, 0x36, 0xBC, - 0xDF, 0x96, 0x58, 0x44, 0x96, 0x55, 0xC8, 0x4A, 0x94, 0x02, - 0x5F, 0x4A, 0x9D, 0xDC, 0xD3, 0x3A, 0xF7, 0x6D, 0xAC, 0x8B, - 0x79, 0x6E, 0xFC, 0xBE, 0x8F, 0x23, 0x58, 0x6A, 0x8A, 0xF5, - 0x38, 0x0A, 0x42, 0xF6, 0x98, 0x74, 0x88, 0x53, 0x2E, 0x02, - 0xAF, 0xE1, 0x0E, 0xBE, 0x6F, 0xCC, 0x74, 0x33, 0x7C, 0xEC, - 0xB4, 0xCB, 0xA7, 0x49, 0x6D, 0x82, 0x42, 0x4F, 0xEB, 0x73, - 0x29, 0xC3, 0x32, 0x00, 0x2B, 0x15, 0xF8, 0x88, 0x7A, 0x8F, - 0x6D, 0x20, 0x1B, 0xAE, 0x65, 0x5F, 0xC5, 0xD0, 0x8A, 0xD1, - 0xE2, 0x64, 0x6D, 0xA3, 0xA8, 0xFE, 0x64, 0xE1, 0xA9, 0x5B, - 0xE6, 0xD0, 0x23, 0xD6, 0x02, 0x72, 0x5A, 0xEC, 0x03, 0x8E, - 0x87, 0x67, 0x19, 0x8D, 0xE4, 0xA8, 0x99, 0x15, 0xC1, 0x3D, - 0x91, 0x48, 0x99, 0x8D, 0xFE, 0xAE, 0x1C, 0xBF, 0xF6, 0x28, - 0x1B, 0x45, 0xBE, 0xAD, 0xEF, 0x72, 0x83, 0x9A, 0xF6, 0xC7, - 0x3B, 0x51, 0xA3, 0x6E, 0x7A, 0x73, 0xBD, 0x83, 0xAA, 0x97, - 0xFD, 0x63, 0xB4, 0xF4, 0x6B, 0x1C, 0x14, 0x81, 0x9A, 0xEF, - 0x14, 0x24, 0xD3, 0xE1, 0x8B, 0xF4, 0x04, 0x04, 0x84, 0x54, - 0x0F, 0x61, 0xA2, 0xA8, 0xF2, 0x50, 0x37, 0x0C, 0x17, 0x0C, - 0xBC, 0xE0, 0xC2, 0x84, 0x85, 0xF4, 0x0B, 0xAE, 0x00, 0xCA, - 0x9F, 0x27, 0xE2, 0x44, 0x4F, 0x15, 0x0B, 0x8B, 0x1D, 0xB4 - + 0x82, 0x14, 0x6F, 0xB0, 0xB4, 0x88, 0xA8, 0x2E, 0xE4, 0x23, + 0xA4, 0xDC, 0xAF, 0x14, 0x4C, 0x33, 0x40, 0x79, 0x52, 0x47, + 0xEF, 0x97, 0x30, 0x0C, 0x06, 0x03, 0x55, 0x1D, 0x13, 0x04, + 0x05, 0x30, 0x03, 0x01, 0x01, 0xFF, 0x30, 0x1C, 0x06, 0x03, + 0x55, 0x1D, 0x11, 0x04, 0x15, 0x30, 0x13, 0x82, 0x0B, 0x65, + 0x78, 0x61, 0x6D, 0x70, 0x6C, 0x65, 0x2E, 0x63, 0x6F, 0x6D, + 0x87, 0x04, 0x7F, 0x00, 0x00, 0x01, 0x30, 0x0D, 0x06, 0x09, + 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0B, 0x05, + 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x33, 0xFE, 0x14, 0xE8, + 0x37, 0x91, 0x19, 0xD4, 0x15, 0xBF, 0x53, 0x81, 0x48, 0xB9, + 0x21, 0x3A, 0x9B, 0x0A, 0x8A, 0x4A, 0x02, 0x59, 0x89, 0x2B, + 0x37, 0x8F, 0x54, 0xC8, 0x33, 0x41, 0x8F, 0x3F, 0x4B, 0x80, + 0x31, 0x62, 0xFC, 0x73, 0xBD, 0x64, 0x04, 0x24, 0xC7, 0xC1, + 0xF9, 0xF0, 0xDA, 0x21, 0x0B, 0x5D, 0xF1, 0x11, 0xC8, 0x3A, + 0x12, 0x88, 0xA0, 0x84, 0x57, 0x43, 0xD9, 0xDF, 0x16, 0xC3, + 0xB2, 0xD9, 0xF6, 0x48, 0x5C, 0xBE, 0x22, 0x23, 0xE0, 0xDE, + 0x0F, 0xA7, 0x51, 0x22, 0x67, 0x38, 0x9A, 0x26, 0x37, 0x6A, + 0xCC, 0x9E, 0x77, 0x8F, 0x50, 0x0D, 0xE8, 0xF2, 0xE0, 0xD8, + 0x74, 0x47, 0xEA, 0x7E, 0x7F, 0x00, 0xA9, 0x01, 0xE4, 0x54, + 0xC7, 0xB0, 0xF5, 0x56, 0xEA, 0x7D, 0xB7, 0x2D, 0x4E, 0x2E, + 0xFF, 0x4E, 0x38, 0xA1, 0xEE, 0xF8, 0x4D, 0x90, 0xCD, 0x1E, + 0xDC, 0x43, 0x44, 0x66, 0xA4, 0x00, 0xD8, 0xB7, 0x5D, 0x3B, + 0x6F, 0xDA, 0xD1, 0x90, 0xE3, 0x5A, 0x43, 0xB9, 0x30, 0xDE, + 0x52, 0xA2, 0xCE, 0x84, 0x89, 0xDA, 0xFC, 0x02, 0xF5, 0x87, + 0x38, 0x14, 0x84, 0x14, 0x6F, 0x8B, 0x49, 0x15, 0x33, 0xAA, + 0x1F, 0x04, 0x5B, 0x42, 0xEC, 0x02, 0x7E, 0xB2, 0x5C, 0x9B, + 0x62, 0x5B, 0x67, 0x43, 0xF4, 0xF7, 0xEC, 0xE5, 0x52, 0xE9, + 0x0E, 0x04, 0x83, 0x23, 0x64, 0xCA, 0xA5, 0xDC, 0x3D, 0xD6, + 0xE7, 0xA7, 0x6A, 0x3E, 0xBD, 0xDE, 0xF5, 0x58, 0xA7, 0x04, + 0x5E, 0xCD, 0x75, 0x74, 0xC2, 0x12, 0xEB, 0x49, 0x1A, 0xD6, + 0x8F, 0x38, 0x60, 0xDF, 0x1A, 0x5E, 0x30, 0xAD, 0xD6, 0x45, + 0x56, 0x29, 0xAB, 0x0A, 0x53, 0xD7, 0x66, 0xD9, 0xB4, 0xAB, + 0x5B, 0x5B, 0x2A, 0x22, 0x4A, 0x19, 0xF4, 0x42, 0xAA, 0xD3, + 0xDE, 0xDC, 0xB4, 0x9F, 0x1D, 0x25, 0xB7, 0x91, 0xCA, 0x3D, + 0x07, 0x9D }; static const int sizeof_client_cert_der_2048 = sizeof(client_cert_der_2048); @@ -1348,10 +1368,82 @@ static const int sizeof_ca_key_der_2048 = sizeof(ca_key_der_2048); /* ./certs/ca-cert.der, 2048-bit */ static const unsigned char ca_cert_der_2048[] = { - 0x30, 0x82, 0x04, 0xAA, 0x30, 0x82, 0x03, 0x92, 0xA0, 0x03, - 0x02, 0x01, 0x02, 0x02, 0x09, 0x00, 0x86, 0xFF, 0xF5, 0x8E, - 0x10, 0xDE, 0xB8, 0xFB, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, - 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0B, 0x05, 0x00, 0x30, + 0x30, 0x82, 0x04, 0xE0, 0x30, 0x82, 0x03, 0xC8, 0xA0, 0x03, + 0x02, 0x01, 0x02, 0x02, 0x14, 0x3F, 0x32, 0x13, 0x52, 0x92, + 0xC6, 0xDF, 0x4A, 0xD5, 0x42, 0x05, 0x6C, 0xB0, 0xB2, 0x2E, + 0x46, 0xC2, 0xF8, 0xB8, 0x67, 0x30, 0x0D, 0x06, 0x09, 0x2A, + 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0B, 0x05, 0x00, + 0x30, 0x81, 0x94, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, + 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x10, 0x30, 0x0E, + 0x06, 0x03, 0x55, 0x04, 0x08, 0x0C, 0x07, 0x4D, 0x6F, 0x6E, + 0x74, 0x61, 0x6E, 0x61, 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, + 0x55, 0x04, 0x07, 0x0C, 0x07, 0x42, 0x6F, 0x7A, 0x65, 0x6D, + 0x61, 0x6E, 0x31, 0x11, 0x30, 0x0F, 0x06, 0x03, 0x55, 0x04, + 0x0A, 0x0C, 0x08, 0x53, 0x61, 0x77, 0x74, 0x6F, 0x6F, 0x74, + 0x68, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x0B, + 0x0C, 0x0A, 0x43, 0x6F, 0x6E, 0x73, 0x75, 0x6C, 0x74, 0x69, + 0x6E, 0x67, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, + 0x03, 0x0C, 0x0F, 0x77, 0x77, 0x77, 0x2E, 0x77, 0x6F, 0x6C, + 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, 0x6D, 0x31, 0x1F, + 0x30, 0x1D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, + 0x01, 0x09, 0x01, 0x16, 0x10, 0x69, 0x6E, 0x66, 0x6F, 0x40, + 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, + 0x6D, 0x30, 0x1E, 0x17, 0x0D, 0x32, 0x30, 0x30, 0x35, 0x30, + 0x37, 0x30, 0x37, 0x33, 0x39, 0x30, 0x34, 0x5A, 0x17, 0x0D, + 0x32, 0x33, 0x30, 0x32, 0x30, 0x31, 0x30, 0x37, 0x33, 0x39, + 0x30, 0x34, 0x5A, 0x30, 0x81, 0x94, 0x31, 0x0B, 0x30, 0x09, + 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, + 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0C, 0x07, + 0x4D, 0x6F, 0x6E, 0x74, 0x61, 0x6E, 0x61, 0x31, 0x10, 0x30, + 0x0E, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0C, 0x07, 0x42, 0x6F, + 0x7A, 0x65, 0x6D, 0x61, 0x6E, 0x31, 0x11, 0x30, 0x0F, 0x06, + 0x03, 0x55, 0x04, 0x0A, 0x0C, 0x08, 0x53, 0x61, 0x77, 0x74, + 0x6F, 0x6F, 0x74, 0x68, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, + 0x55, 0x04, 0x0B, 0x0C, 0x0A, 0x43, 0x6F, 0x6E, 0x73, 0x75, + 0x6C, 0x74, 0x69, 0x6E, 0x67, 0x31, 0x18, 0x30, 0x16, 0x06, + 0x03, 0x55, 0x04, 0x03, 0x0C, 0x0F, 0x77, 0x77, 0x77, 0x2E, + 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, + 0x6D, 0x31, 0x1F, 0x30, 0x1D, 0x06, 0x09, 0x2A, 0x86, 0x48, + 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x01, 0x16, 0x10, 0x69, 0x6E, + 0x66, 0x6F, 0x40, 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, + 0x2E, 0x63, 0x6F, 0x6D, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0D, + 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, + 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0F, 0x00, 0x30, 0x82, + 0x01, 0x0A, 0x02, 0x82, 0x01, 0x01, 0x00, 0xBF, 0x0C, 0xCA, + 0x2D, 0x14, 0xB2, 0x1E, 0x84, 0x42, 0x5B, 0xCD, 0x38, 0x1F, + 0x4A, 0xF2, 0x4D, 0x75, 0x10, 0xF1, 0xB6, 0x35, 0x9F, 0xDF, + 0xCA, 0x7D, 0x03, 0x98, 0xD3, 0xAC, 0xDE, 0x03, 0x66, 0xEE, + 0x2A, 0xF1, 0xD8, 0xB0, 0x7D, 0x6E, 0x07, 0x54, 0x0B, 0x10, + 0x98, 0x21, 0x4D, 0x80, 0xCB, 0x12, 0x20, 0xE7, 0xCC, 0x4F, + 0xDE, 0x45, 0x7D, 0xC9, 0x72, 0x77, 0x32, 0xEA, 0xCA, 0x90, + 0xBB, 0x69, 0x52, 0x10, 0x03, 0x2F, 0xA8, 0xF3, 0x95, 0xC5, + 0xF1, 0x8B, 0x62, 0x56, 0x1B, 0xEF, 0x67, 0x6F, 0xA4, 0x10, + 0x41, 0x95, 0xAD, 0x0A, 0x9B, 0xE3, 0xA5, 0xC0, 0xB0, 0xD2, + 0x70, 0x76, 0x50, 0x30, 0x5B, 0xA8, 0xE8, 0x08, 0x2C, 0x7C, + 0xED, 0xA7, 0xA2, 0x7A, 0x8D, 0x38, 0x29, 0x1C, 0xAC, 0xC7, + 0xED, 0xF2, 0x7C, 0x95, 0xB0, 0x95, 0x82, 0x7D, 0x49, 0x5C, + 0x38, 0xCD, 0x77, 0x25, 0xEF, 0xBD, 0x80, 0x75, 0x53, 0x94, + 0x3C, 0x3D, 0xCA, 0x63, 0x5B, 0x9F, 0x15, 0xB5, 0xD3, 0x1D, + 0x13, 0x2F, 0x19, 0xD1, 0x3C, 0xDB, 0x76, 0x3A, 0xCC, 0xB8, + 0x7D, 0xC9, 0xE5, 0xC2, 0xD7, 0xDA, 0x40, 0x6F, 0xD8, 0x21, + 0xDC, 0x73, 0x1B, 0x42, 0x2D, 0x53, 0x9C, 0xFE, 0x1A, 0xFC, + 0x7D, 0xAB, 0x7A, 0x36, 0x3F, 0x98, 0xDE, 0x84, 0x7C, 0x05, + 0x67, 0xCE, 0x6A, 0x14, 0x38, 0x87, 0xA9, 0xF1, 0x8C, 0xB5, + 0x68, 0xCB, 0x68, 0x7F, 0x71, 0x20, 0x2B, 0xF5, 0xA0, 0x63, + 0xF5, 0x56, 0x2F, 0xA3, 0x26, 0xD2, 0xB7, 0x6F, 0xB1, 0x5A, + 0x17, 0xD7, 0x38, 0x99, 0x08, 0xFE, 0x93, 0x58, 0x6F, 0xFE, + 0xC3, 0x13, 0x49, 0x08, 0x16, 0x0B, 0xA7, 0x4D, 0x67, 0x00, + 0x52, 0x31, 0x67, 0x23, 0x4E, 0x98, 0xED, 0x51, 0x45, 0x1D, + 0xB9, 0x04, 0xD9, 0x0B, 0xEC, 0xD8, 0x28, 0xB3, 0x4B, 0xBD, + 0xED, 0x36, 0x79, 0x02, 0x03, 0x01, 0x00, 0x01, 0xA3, 0x82, + 0x01, 0x26, 0x30, 0x82, 0x01, 0x22, 0x30, 0x1D, 0x06, 0x03, + 0x55, 0x1D, 0x0E, 0x04, 0x16, 0x04, 0x14, 0x27, 0x8E, 0x67, + 0x11, 0x74, 0xC3, 0x26, 0x1D, 0x3F, 0xED, 0x33, 0x63, 0xB3, + 0xA4, 0xD8, 0x1D, 0x30, 0xE5, 0xE8, 0xD5, 0x30, 0x81, 0xD4, + 0x06, 0x03, 0x55, 0x1D, 0x23, 0x04, 0x81, 0xCC, 0x30, 0x81, + 0xC9, 0x80, 0x14, 0x27, 0x8E, 0x67, 0x11, 0x74, 0xC3, 0x26, + 0x1D, 0x3F, 0xED, 0x33, 0x63, 0xB3, 0xA4, 0xD8, 0x1D, 0x30, + 0xE5, 0xE8, 0xD5, 0xA1, 0x81, 0x9A, 0xA4, 0x81, 0x97, 0x30, 0x81, 0x94, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0C, 0x07, 0x4D, 0x6F, 0x6E, 0x74, @@ -1367,107 +1459,41 @@ static const unsigned char ca_cert_der_2048[] = 0x1D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x01, 0x16, 0x10, 0x69, 0x6E, 0x66, 0x6F, 0x40, 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, 0x6D, - 0x30, 0x1E, 0x17, 0x0D, 0x31, 0x38, 0x30, 0x34, 0x31, 0x33, - 0x31, 0x35, 0x32, 0x33, 0x30, 0x39, 0x5A, 0x17, 0x0D, 0x32, - 0x31, 0x30, 0x31, 0x30, 0x37, 0x31, 0x35, 0x32, 0x33, 0x30, - 0x39, 0x5A, 0x30, 0x81, 0x94, 0x31, 0x0B, 0x30, 0x09, 0x06, - 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x10, - 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0C, 0x07, 0x4D, - 0x6F, 0x6E, 0x74, 0x61, 0x6E, 0x61, 0x31, 0x10, 0x30, 0x0E, - 0x06, 0x03, 0x55, 0x04, 0x07, 0x0C, 0x07, 0x42, 0x6F, 0x7A, - 0x65, 0x6D, 0x61, 0x6E, 0x31, 0x11, 0x30, 0x0F, 0x06, 0x03, - 0x55, 0x04, 0x0A, 0x0C, 0x08, 0x53, 0x61, 0x77, 0x74, 0x6F, - 0x6F, 0x74, 0x68, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, - 0x04, 0x0B, 0x0C, 0x0A, 0x43, 0x6F, 0x6E, 0x73, 0x75, 0x6C, - 0x74, 0x69, 0x6E, 0x67, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, - 0x55, 0x04, 0x03, 0x0C, 0x0F, 0x77, 0x77, 0x77, 0x2E, 0x77, - 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, 0x6D, - 0x31, 0x1F, 0x30, 0x1D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, - 0xF7, 0x0D, 0x01, 0x09, 0x01, 0x16, 0x10, 0x69, 0x6E, 0x66, - 0x6F, 0x40, 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, - 0x63, 0x6F, 0x6D, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0D, 0x06, - 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, - 0x05, 0x00, 0x03, 0x82, 0x01, 0x0F, 0x00, 0x30, 0x82, 0x01, - 0x0A, 0x02, 0x82, 0x01, 0x01, 0x00, 0xBF, 0x0C, 0xCA, 0x2D, - 0x14, 0xB2, 0x1E, 0x84, 0x42, 0x5B, 0xCD, 0x38, 0x1F, 0x4A, - 0xF2, 0x4D, 0x75, 0x10, 0xF1, 0xB6, 0x35, 0x9F, 0xDF, 0xCA, - 0x7D, 0x03, 0x98, 0xD3, 0xAC, 0xDE, 0x03, 0x66, 0xEE, 0x2A, - 0xF1, 0xD8, 0xB0, 0x7D, 0x6E, 0x07, 0x54, 0x0B, 0x10, 0x98, - 0x21, 0x4D, 0x80, 0xCB, 0x12, 0x20, 0xE7, 0xCC, 0x4F, 0xDE, - 0x45, 0x7D, 0xC9, 0x72, 0x77, 0x32, 0xEA, 0xCA, 0x90, 0xBB, - 0x69, 0x52, 0x10, 0x03, 0x2F, 0xA8, 0xF3, 0x95, 0xC5, 0xF1, - 0x8B, 0x62, 0x56, 0x1B, 0xEF, 0x67, 0x6F, 0xA4, 0x10, 0x41, - 0x95, 0xAD, 0x0A, 0x9B, 0xE3, 0xA5, 0xC0, 0xB0, 0xD2, 0x70, - 0x76, 0x50, 0x30, 0x5B, 0xA8, 0xE8, 0x08, 0x2C, 0x7C, 0xED, - 0xA7, 0xA2, 0x7A, 0x8D, 0x38, 0x29, 0x1C, 0xAC, 0xC7, 0xED, - 0xF2, 0x7C, 0x95, 0xB0, 0x95, 0x82, 0x7D, 0x49, 0x5C, 0x38, - 0xCD, 0x77, 0x25, 0xEF, 0xBD, 0x80, 0x75, 0x53, 0x94, 0x3C, - 0x3D, 0xCA, 0x63, 0x5B, 0x9F, 0x15, 0xB5, 0xD3, 0x1D, 0x13, - 0x2F, 0x19, 0xD1, 0x3C, 0xDB, 0x76, 0x3A, 0xCC, 0xB8, 0x7D, - 0xC9, 0xE5, 0xC2, 0xD7, 0xDA, 0x40, 0x6F, 0xD8, 0x21, 0xDC, - 0x73, 0x1B, 0x42, 0x2D, 0x53, 0x9C, 0xFE, 0x1A, 0xFC, 0x7D, - 0xAB, 0x7A, 0x36, 0x3F, 0x98, 0xDE, 0x84, 0x7C, 0x05, 0x67, - 0xCE, 0x6A, 0x14, 0x38, 0x87, 0xA9, 0xF1, 0x8C, 0xB5, 0x68, - 0xCB, 0x68, 0x7F, 0x71, 0x20, 0x2B, 0xF5, 0xA0, 0x63, 0xF5, - 0x56, 0x2F, 0xA3, 0x26, 0xD2, 0xB7, 0x6F, 0xB1, 0x5A, 0x17, - 0xD7, 0x38, 0x99, 0x08, 0xFE, 0x93, 0x58, 0x6F, 0xFE, 0xC3, - 0x13, 0x49, 0x08, 0x16, 0x0B, 0xA7, 0x4D, 0x67, 0x00, 0x52, - 0x31, 0x67, 0x23, 0x4E, 0x98, 0xED, 0x51, 0x45, 0x1D, 0xB9, - 0x04, 0xD9, 0x0B, 0xEC, 0xD8, 0x28, 0xB3, 0x4B, 0xBD, 0xED, - 0x36, 0x79, 0x02, 0x03, 0x01, 0x00, 0x01, 0xA3, 0x81, 0xFC, - 0x30, 0x81, 0xF9, 0x30, 0x1D, 0x06, 0x03, 0x55, 0x1D, 0x0E, - 0x04, 0x16, 0x04, 0x14, 0x27, 0x8E, 0x67, 0x11, 0x74, 0xC3, - 0x26, 0x1D, 0x3F, 0xED, 0x33, 0x63, 0xB3, 0xA4, 0xD8, 0x1D, - 0x30, 0xE5, 0xE8, 0xD5, 0x30, 0x81, 0xC9, 0x06, 0x03, 0x55, - 0x1D, 0x23, 0x04, 0x81, 0xC1, 0x30, 0x81, 0xBE, 0x80, 0x14, - 0x27, 0x8E, 0x67, 0x11, 0x74, 0xC3, 0x26, 0x1D, 0x3F, 0xED, - 0x33, 0x63, 0xB3, 0xA4, 0xD8, 0x1D, 0x30, 0xE5, 0xE8, 0xD5, - 0xA1, 0x81, 0x9A, 0xA4, 0x81, 0x97, 0x30, 0x81, 0x94, 0x31, - 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, - 0x55, 0x53, 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, - 0x08, 0x0C, 0x07, 0x4D, 0x6F, 0x6E, 0x74, 0x61, 0x6E, 0x61, - 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0C, - 0x07, 0x42, 0x6F, 0x7A, 0x65, 0x6D, 0x61, 0x6E, 0x31, 0x11, - 0x30, 0x0F, 0x06, 0x03, 0x55, 0x04, 0x0A, 0x0C, 0x08, 0x53, - 0x61, 0x77, 0x74, 0x6F, 0x6F, 0x74, 0x68, 0x31, 0x13, 0x30, - 0x11, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x0C, 0x0A, 0x43, 0x6F, - 0x6E, 0x73, 0x75, 0x6C, 0x74, 0x69, 0x6E, 0x67, 0x31, 0x18, - 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0C, 0x0F, 0x77, - 0x77, 0x77, 0x2E, 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, - 0x2E, 0x63, 0x6F, 0x6D, 0x31, 0x1F, 0x30, 0x1D, 0x06, 0x09, - 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x01, 0x16, - 0x10, 0x69, 0x6E, 0x66, 0x6F, 0x40, 0x77, 0x6F, 0x6C, 0x66, - 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, 0x6D, 0x82, 0x09, 0x00, - 0x86, 0xFF, 0xF5, 0x8E, 0x10, 0xDE, 0xB8, 0xFB, 0x30, 0x0C, - 0x06, 0x03, 0x55, 0x1D, 0x13, 0x04, 0x05, 0x30, 0x03, 0x01, - 0x01, 0xFF, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, - 0xF7, 0x0D, 0x01, 0x01, 0x0B, 0x05, 0x00, 0x03, 0x82, 0x01, - 0x01, 0x00, 0x9E, 0x28, 0x88, 0x72, 0x00, 0xCA, 0xE6, 0xE7, - 0x97, 0xCA, 0xC1, 0xF1, 0x1F, 0x9E, 0x12, 0xB2, 0xB8, 0xC7, - 0x51, 0xEA, 0x28, 0xE1, 0x36, 0xB5, 0x2D, 0xE6, 0x2F, 0x08, - 0x23, 0xCB, 0xA9, 0x4A, 0x87, 0x25, 0xC6, 0x5D, 0x89, 0x45, - 0xEA, 0xF5, 0x00, 0x98, 0xAC, 0x76, 0xFB, 0x1B, 0xAF, 0xF0, - 0xCE, 0x64, 0x9E, 0xDA, 0x08, 0xBF, 0xB6, 0xEB, 0xB4, 0xB5, - 0x0C, 0xA0, 0xE7, 0xF6, 0x47, 0x59, 0x1C, 0x61, 0xCF, 0x2E, - 0x0E, 0x58, 0xA4, 0x82, 0xAC, 0x0F, 0x3F, 0xEC, 0xC4, 0xAE, - 0x80, 0xF7, 0xB0, 0x8A, 0x1E, 0x85, 0x41, 0xE8, 0xFF, 0xFE, - 0xFE, 0x4F, 0x1A, 0x24, 0xD5, 0x49, 0xFA, 0xFB, 0xFE, 0x5E, - 0xE5, 0xD3, 0x91, 0x0E, 0x4F, 0x4E, 0x0C, 0x21, 0x51, 0x71, - 0x83, 0x04, 0x6B, 0x62, 0x7B, 0x4F, 0x59, 0x76, 0x48, 0x81, - 0x1E, 0xB4, 0xF7, 0x04, 0x47, 0x8A, 0x91, 0x57, 0xA3, 0x11, - 0xA9, 0xF2, 0x20, 0xB4, 0x78, 0x33, 0x62, 0x3D, 0xB0, 0x5E, - 0x0D, 0xF9, 0x86, 0x38, 0x82, 0xDA, 0xA1, 0x98, 0x8D, 0x19, - 0x06, 0x87, 0x21, 0x39, 0xB7, 0x02, 0xF7, 0xDA, 0x7D, 0x58, - 0xBA, 0x52, 0x15, 0xD8, 0x3B, 0xC9, 0x7B, 0x58, 0x34, 0xA0, - 0xC7, 0xE2, 0x7C, 0xA9, 0x83, 0x13, 0xE1, 0xB6, 0xEC, 0x01, - 0xBF, 0x52, 0x33, 0x0B, 0xC4, 0xFE, 0x43, 0xD3, 0xC6, 0xA4, - 0x8E, 0x2F, 0x87, 0x7F, 0x7A, 0x44, 0xEA, 0xCA, 0x53, 0x6C, - 0x85, 0xED, 0x65, 0x76, 0x73, 0x31, 0x03, 0x4E, 0xEA, 0xBD, - 0x35, 0x54, 0x13, 0xF3, 0x64, 0x87, 0x6B, 0xDF, 0x34, 0xDD, - 0x34, 0xA1, 0x88, 0x3B, 0xDB, 0x4D, 0xAF, 0x1B, 0x64, 0x90, - 0x92, 0x71, 0x30, 0x8E, 0xC8, 0xCC, 0xE5, 0x60, 0x24, 0xAF, - 0x31, 0x16, 0x39, 0x33, 0x91, 0x50, 0xF9, 0xAB, 0x68, 0x42, - 0x74, 0x7A, 0x35, 0xD9, 0xDD, 0xC8, 0xC4, 0x52 + 0x82, 0x14, 0x3F, 0x32, 0x13, 0x52, 0x92, 0xC6, 0xDF, 0x4A, + 0xD5, 0x42, 0x05, 0x6C, 0xB0, 0xB2, 0x2E, 0x46, 0xC2, 0xF8, + 0xB8, 0x67, 0x30, 0x0C, 0x06, 0x03, 0x55, 0x1D, 0x13, 0x04, + 0x05, 0x30, 0x03, 0x01, 0x01, 0xFF, 0x30, 0x1C, 0x06, 0x03, + 0x55, 0x1D, 0x11, 0x04, 0x15, 0x30, 0x13, 0x82, 0x0B, 0x65, + 0x78, 0x61, 0x6D, 0x70, 0x6C, 0x65, 0x2E, 0x63, 0x6F, 0x6D, + 0x87, 0x04, 0x7F, 0x00, 0x00, 0x01, 0x30, 0x0D, 0x06, 0x09, + 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0B, 0x05, + 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0xB0, 0x7B, 0x84, 0xC9, + 0x1F, 0x41, 0x97, 0xB8, 0x03, 0x14, 0x0F, 0x59, 0x5B, 0x6F, + 0x2C, 0x15, 0x45, 0x1B, 0xC4, 0x02, 0x6F, 0xD9, 0x92, 0xE7, + 0x1A, 0xDC, 0xCC, 0xDB, 0x0E, 0x56, 0x3D, 0x59, 0xDB, 0x71, + 0xF2, 0xF1, 0x08, 0x9A, 0x06, 0xEB, 0xAB, 0xC5, 0x25, 0x9F, + 0xDF, 0x6A, 0x6D, 0x6E, 0x6B, 0xD0, 0xA8, 0x90, 0x39, 0xD9, + 0x48, 0x6F, 0x61, 0x7F, 0xBD, 0xCD, 0xED, 0x60, 0x8B, 0xE3, + 0x6C, 0x23, 0x52, 0xB7, 0x86, 0xBC, 0x2A, 0xFF, 0x90, 0xF7, + 0x6D, 0x5C, 0x47, 0x69, 0xF3, 0x8D, 0xEE, 0x9E, 0x76, 0x62, + 0x5C, 0x7B, 0xB3, 0x22, 0xE5, 0x4E, 0xCE, 0x26, 0xF6, 0x3F, + 0x2F, 0xB7, 0x00, 0x8C, 0x20, 0xD2, 0x71, 0xF6, 0x31, 0x4E, + 0xE1, 0x4D, 0x03, 0xB9, 0xF3, 0x07, 0xDD, 0x04, 0xA7, 0xA6, + 0x9A, 0x9C, 0xB0, 0x2E, 0x99, 0x0A, 0xA7, 0xFC, 0x59, 0x97, + 0x63, 0xA5, 0x7C, 0x77, 0xDD, 0x77, 0x61, 0xA6, 0x86, 0x6A, + 0xB2, 0x32, 0x33, 0x06, 0xB4, 0xBC, 0xCA, 0xAE, 0xC2, 0xC7, + 0x8E, 0xDC, 0x85, 0xDC, 0xAC, 0xC2, 0xE7, 0x2B, 0xFB, 0xB9, + 0x50, 0x6B, 0xD4, 0x5B, 0x0F, 0x6D, 0x93, 0xA9, 0x51, 0xD2, + 0xDD, 0x75, 0x5E, 0x88, 0xAE, 0xBC, 0xCA, 0x40, 0xC7, 0x2B, + 0xE9, 0x5E, 0x5B, 0xA7, 0xCF, 0xE2, 0xE2, 0x5D, 0x0B, 0xC9, + 0x69, 0x20, 0xD3, 0x41, 0x5A, 0x7A, 0xB9, 0x14, 0x17, 0xF1, + 0x85, 0xD7, 0xB9, 0x17, 0xB0, 0xAD, 0xCA, 0x17, 0x6C, 0x38, + 0x8D, 0x73, 0x8D, 0x74, 0x25, 0x01, 0x70, 0xC1, 0x34, 0xCF, + 0x62, 0x02, 0x48, 0x9A, 0x56, 0xD8, 0x44, 0xA4, 0x0D, 0xE7, + 0x32, 0xA0, 0xB0, 0x4B, 0xC5, 0xA4, 0x9B, 0x95, 0x66, 0x00, + 0xFA, 0x7E, 0x97, 0x0A, 0x6B, 0x08, 0xEC, 0xA0, 0x9F, 0x3F, + 0x90, 0x99, 0x57, 0x39, 0x63, 0x81, 0x76, 0xF7, 0xED, 0xEA, + 0x01, 0x1D }; static const int sizeof_ca_cert_der_2048 = sizeof(ca_cert_der_2048); @@ -1822,7 +1848,7 @@ static const int sizeof_server_key_der_2048 = sizeof(server_key_der_2048); /* ./certs/server-cert.der, 2048-bit */ static const unsigned char server_cert_der_2048[] = { - 0x30, 0x82, 0x04, 0x9E, 0x30, 0x82, 0x03, 0x86, 0xA0, 0x03, + 0x30, 0x82, 0x04, 0xC9, 0x30, 0x82, 0x03, 0xB1, 0xA0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x01, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0B, 0x05, 0x00, 0x30, 0x81, 0x94, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, @@ -1840,10 +1866,10 @@ static const unsigned char server_cert_der_2048[] = 0x1F, 0x30, 0x1D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x01, 0x16, 0x10, 0x69, 0x6E, 0x66, 0x6F, 0x40, 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, - 0x6F, 0x6D, 0x30, 0x1E, 0x17, 0x0D, 0x31, 0x38, 0x30, 0x34, - 0x31, 0x33, 0x31, 0x35, 0x32, 0x33, 0x31, 0x30, 0x5A, 0x17, - 0x0D, 0x32, 0x31, 0x30, 0x31, 0x30, 0x37, 0x31, 0x35, 0x32, - 0x33, 0x31, 0x30, 0x5A, 0x30, 0x81, 0x90, 0x31, 0x0B, 0x30, + 0x6F, 0x6D, 0x30, 0x1E, 0x17, 0x0D, 0x32, 0x30, 0x30, 0x35, + 0x30, 0x37, 0x30, 0x37, 0x33, 0x39, 0x30, 0x34, 0x5A, 0x17, + 0x0D, 0x32, 0x33, 0x30, 0x32, 0x30, 0x31, 0x30, 0x37, 0x33, + 0x39, 0x30, 0x34, 0x5A, 0x30, 0x81, 0x90, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0C, 0x07, 0x4D, 0x6F, 0x6E, 0x74, 0x61, 0x6E, 0x61, 0x31, 0x10, @@ -1887,60 +1913,64 @@ static const unsigned char server_cert_der_2048[] = 0x69, 0x42, 0x42, 0x09, 0xE9, 0xD8, 0x08, 0xBC, 0x33, 0x20, 0xB3, 0x58, 0x22, 0xA7, 0xAA, 0xEB, 0xC4, 0xE1, 0xE6, 0x61, 0x83, 0xC5, 0xD2, 0x96, 0xDF, 0xD9, 0xD0, 0x4F, 0xAD, 0xD7, - 0x02, 0x03, 0x01, 0x00, 0x01, 0xA3, 0x81, 0xFC, 0x30, 0x81, - 0xF9, 0x30, 0x1D, 0x06, 0x03, 0x55, 0x1D, 0x0E, 0x04, 0x16, - 0x04, 0x14, 0xB3, 0x11, 0x32, 0xC9, 0x92, 0x98, 0x84, 0xE2, - 0xC9, 0xF8, 0xD0, 0x3B, 0x6E, 0x03, 0x42, 0xCA, 0x1F, 0x0E, - 0x8E, 0x3C, 0x30, 0x81, 0xC9, 0x06, 0x03, 0x55, 0x1D, 0x23, - 0x04, 0x81, 0xC1, 0x30, 0x81, 0xBE, 0x80, 0x14, 0x27, 0x8E, - 0x67, 0x11, 0x74, 0xC3, 0x26, 0x1D, 0x3F, 0xED, 0x33, 0x63, - 0xB3, 0xA4, 0xD8, 0x1D, 0x30, 0xE5, 0xE8, 0xD5, 0xA1, 0x81, - 0x9A, 0xA4, 0x81, 0x97, 0x30, 0x81, 0x94, 0x31, 0x0B, 0x30, - 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, - 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0C, - 0x07, 0x4D, 0x6F, 0x6E, 0x74, 0x61, 0x6E, 0x61, 0x31, 0x10, - 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0C, 0x07, 0x42, - 0x6F, 0x7A, 0x65, 0x6D, 0x61, 0x6E, 0x31, 0x11, 0x30, 0x0F, - 0x06, 0x03, 0x55, 0x04, 0x0A, 0x0C, 0x08, 0x53, 0x61, 0x77, - 0x74, 0x6F, 0x6F, 0x74, 0x68, 0x31, 0x13, 0x30, 0x11, 0x06, - 0x03, 0x55, 0x04, 0x0B, 0x0C, 0x0A, 0x43, 0x6F, 0x6E, 0x73, - 0x75, 0x6C, 0x74, 0x69, 0x6E, 0x67, 0x31, 0x18, 0x30, 0x16, - 0x06, 0x03, 0x55, 0x04, 0x03, 0x0C, 0x0F, 0x77, 0x77, 0x77, - 0x2E, 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, - 0x6F, 0x6D, 0x31, 0x1F, 0x30, 0x1D, 0x06, 0x09, 0x2A, 0x86, - 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x01, 0x16, 0x10, 0x69, - 0x6E, 0x66, 0x6F, 0x40, 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, - 0x6C, 0x2E, 0x63, 0x6F, 0x6D, 0x82, 0x09, 0x00, 0x86, 0xFF, - 0xF5, 0x8E, 0x10, 0xDE, 0xB8, 0xFB, 0x30, 0x0C, 0x06, 0x03, - 0x55, 0x1D, 0x13, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xFF, - 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, - 0x01, 0x01, 0x0B, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, - 0xB4, 0x54, 0x60, 0xAD, 0xA0, 0x03, 0x32, 0xDE, 0x02, 0x7F, - 0x21, 0x4A, 0x81, 0xC6, 0xED, 0xCD, 0xCD, 0xD8, 0x12, 0x8A, - 0xC0, 0xBA, 0x82, 0x5B, 0x75, 0xAD, 0x54, 0xE3, 0x7C, 0x80, - 0x6A, 0xAC, 0x2E, 0x6C, 0x20, 0x4E, 0xBE, 0x4D, 0x82, 0xA7, - 0x47, 0x13, 0x5C, 0xF4, 0xC6, 0x6A, 0x2B, 0x10, 0x99, 0x58, - 0xDE, 0xAB, 0x6B, 0x7C, 0x22, 0x05, 0xC1, 0x83, 0x9D, 0xCB, - 0xFF, 0x3C, 0xE4, 0x2D, 0x57, 0x6A, 0xA6, 0x96, 0xDF, 0xD3, - 0xC1, 0x68, 0xE3, 0xD2, 0xC6, 0x83, 0x4B, 0x97, 0xE2, 0xC6, - 0x32, 0x0E, 0xBE, 0xC4, 0x03, 0xB9, 0x07, 0x8A, 0x5B, 0xB8, - 0x84, 0xBA, 0xC5, 0x39, 0x3F, 0x1C, 0x58, 0xA7, 0x55, 0xD7, - 0xF0, 0x9B, 0xE8, 0xD2, 0x45, 0xB9, 0xE3, 0x83, 0x2E, 0xEE, - 0xB6, 0x71, 0x56, 0xB9, 0x3A, 0xEE, 0x3F, 0x27, 0xD8, 0x77, - 0xE8, 0xFB, 0x44, 0x48, 0x65, 0x27, 0x47, 0x4C, 0xFB, 0xFE, - 0x72, 0xC3, 0xAC, 0x05, 0x7B, 0x1D, 0xCB, 0xEB, 0x5E, 0x65, - 0x9A, 0xAB, 0x02, 0xE4, 0x88, 0x5B, 0x3B, 0x8B, 0x0B, 0xC7, - 0xCC, 0xA9, 0xA6, 0x8B, 0xE1, 0x87, 0xB0, 0x19, 0x1A, 0x0C, - 0x28, 0x58, 0x6F, 0x99, 0x52, 0x7E, 0xED, 0xB0, 0x3A, 0x68, - 0x3B, 0x8C, 0x0A, 0x08, 0x74, 0x72, 0xAB, 0xB9, 0x09, 0xC5, - 0xED, 0x04, 0x7E, 0x6F, 0x0B, 0x1C, 0x09, 0x21, 0xD0, 0xCD, - 0x7F, 0xF9, 0xC4, 0x5E, 0x27, 0x20, 0xE4, 0x85, 0x73, 0x52, - 0x05, 0xD2, 0xBA, 0xF8, 0xD5, 0x8F, 0x41, 0xCC, 0x23, 0x2E, - 0x12, 0x6D, 0xBC, 0x31, 0x98, 0xE7, 0x63, 0xA3, 0x8E, 0x26, - 0xCD, 0xE8, 0x2B, 0x88, 0xEE, 0xE2, 0xFE, 0x3A, 0x74, 0x52, - 0x34, 0x0E, 0xFD, 0x12, 0xE5, 0x5E, 0x69, 0x50, 0x20, 0x31, - 0x34, 0xE4, 0x31, 0xF1, 0xE7, 0xE4, 0x5B, 0x03, 0x13, 0xDA, - 0xAC, 0x41, 0x6C, 0xE7, 0xCF, 0x2B + 0x02, 0x03, 0x01, 0x00, 0x01, 0xA3, 0x82, 0x01, 0x26, 0x30, + 0x82, 0x01, 0x22, 0x30, 0x1D, 0x06, 0x03, 0x55, 0x1D, 0x0E, + 0x04, 0x16, 0x04, 0x14, 0xB3, 0x11, 0x32, 0xC9, 0x92, 0x98, + 0x84, 0xE2, 0xC9, 0xF8, 0xD0, 0x3B, 0x6E, 0x03, 0x42, 0xCA, + 0x1F, 0x0E, 0x8E, 0x3C, 0x30, 0x81, 0xD4, 0x06, 0x03, 0x55, + 0x1D, 0x23, 0x04, 0x81, 0xCC, 0x30, 0x81, 0xC9, 0x80, 0x14, + 0x27, 0x8E, 0x67, 0x11, 0x74, 0xC3, 0x26, 0x1D, 0x3F, 0xED, + 0x33, 0x63, 0xB3, 0xA4, 0xD8, 0x1D, 0x30, 0xE5, 0xE8, 0xD5, + 0xA1, 0x81, 0x9A, 0xA4, 0x81, 0x97, 0x30, 0x81, 0x94, 0x31, + 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, + 0x55, 0x53, 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, + 0x08, 0x0C, 0x07, 0x4D, 0x6F, 0x6E, 0x74, 0x61, 0x6E, 0x61, + 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0C, + 0x07, 0x42, 0x6F, 0x7A, 0x65, 0x6D, 0x61, 0x6E, 0x31, 0x11, + 0x30, 0x0F, 0x06, 0x03, 0x55, 0x04, 0x0A, 0x0C, 0x08, 0x53, + 0x61, 0x77, 0x74, 0x6F, 0x6F, 0x74, 0x68, 0x31, 0x13, 0x30, + 0x11, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x0C, 0x0A, 0x43, 0x6F, + 0x6E, 0x73, 0x75, 0x6C, 0x74, 0x69, 0x6E, 0x67, 0x31, 0x18, + 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0C, 0x0F, 0x77, + 0x77, 0x77, 0x2E, 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, + 0x2E, 0x63, 0x6F, 0x6D, 0x31, 0x1F, 0x30, 0x1D, 0x06, 0x09, + 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x01, 0x16, + 0x10, 0x69, 0x6E, 0x66, 0x6F, 0x40, 0x77, 0x6F, 0x6C, 0x66, + 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, 0x6D, 0x82, 0x14, 0x3F, + 0x32, 0x13, 0x52, 0x92, 0xC6, 0xDF, 0x4A, 0xD5, 0x42, 0x05, + 0x6C, 0xB0, 0xB2, 0x2E, 0x46, 0xC2, 0xF8, 0xB8, 0x67, 0x30, + 0x0C, 0x06, 0x03, 0x55, 0x1D, 0x13, 0x04, 0x05, 0x30, 0x03, + 0x01, 0x01, 0xFF, 0x30, 0x1C, 0x06, 0x03, 0x55, 0x1D, 0x11, + 0x04, 0x15, 0x30, 0x13, 0x82, 0x0B, 0x65, 0x78, 0x61, 0x6D, + 0x70, 0x6C, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x87, 0x04, 0x7F, + 0x00, 0x00, 0x01, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, + 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0B, 0x05, 0x00, 0x03, 0x82, + 0x01, 0x01, 0x00, 0x8E, 0x62, 0x6E, 0xE4, 0xBC, 0xC5, 0xE7, + 0xA9, 0xEC, 0xDF, 0xD0, 0xE7, 0xC8, 0xEF, 0x56, 0x86, 0x32, + 0x2D, 0xA1, 0xCB, 0xAB, 0xB7, 0xB1, 0xEB, 0x44, 0xD9, 0xE4, + 0x03, 0x51, 0x85, 0x14, 0x06, 0x1F, 0xBA, 0x0C, 0x64, 0xE2, + 0xC3, 0x7C, 0x40, 0x1B, 0x01, 0x43, 0xCB, 0x09, 0x65, 0x5B, + 0x52, 0x0C, 0x91, 0x85, 0x38, 0xEA, 0x93, 0xE1, 0xCD, 0x3F, + 0xCA, 0x6D, 0x5C, 0xE0, 0x70, 0x67, 0x31, 0xA2, 0xC5, 0x2C, + 0x41, 0xC1, 0xBC, 0xD5, 0xEA, 0x07, 0x44, 0x41, 0x74, 0xA1, + 0x06, 0xA8, 0x61, 0x7E, 0x3A, 0x35, 0xDD, 0xE9, 0xEA, 0xB9, + 0xC7, 0x91, 0x9B, 0x18, 0x9D, 0x36, 0x97, 0x45, 0xEF, 0x2A, + 0x30, 0x54, 0x9C, 0x82, 0xBE, 0x78, 0x97, 0xFA, 0x01, 0x73, + 0x21, 0x01, 0x12, 0x22, 0xFE, 0x2E, 0x6B, 0x81, 0x4E, 0xAD, + 0x3C, 0xC9, 0x8D, 0x05, 0xFD, 0xA0, 0x92, 0x04, 0xDE, 0x2D, + 0x64, 0xAF, 0x8F, 0x91, 0x73, 0xC0, 0x8A, 0xE0, 0x56, 0x08, + 0xC0, 0xA9, 0x8B, 0x31, 0x3B, 0x2C, 0x62, 0x35, 0x5D, 0x4E, + 0xF2, 0x41, 0x3F, 0xC5, 0x4B, 0x5C, 0xEF, 0xB3, 0x33, 0xA9, + 0x4D, 0x49, 0xEF, 0x63, 0xE6, 0x5E, 0xD8, 0x40, 0x16, 0xC0, + 0x19, 0x45, 0xD0, 0x07, 0x6C, 0x01, 0x3C, 0x35, 0x75, 0x0F, + 0x3F, 0x57, 0xF7, 0x7D, 0x60, 0x46, 0xED, 0x23, 0x15, 0xD3, + 0xA8, 0x2C, 0x80, 0x36, 0xD8, 0x12, 0x89, 0xF6, 0xB6, 0xA1, + 0xA4, 0xF7, 0xFC, 0x9B, 0x7D, 0xCF, 0x40, 0x14, 0x3C, 0x22, + 0x42, 0x3C, 0xB0, 0xFA, 0xE3, 0x72, 0x37, 0xB3, 0x93, 0xBE, + 0x4B, 0x40, 0xCA, 0xF3, 0x99, 0x8A, 0xF8, 0xBD, 0xA0, 0x1A, + 0x39, 0xAB, 0x7E, 0x79, 0x27, 0xEB, 0x3A, 0xAF, 0x0D, 0xC9, + 0x81, 0x33, 0x7D, 0x9D, 0x4C, 0x18, 0x80, 0x61, 0x6A, 0x19, + 0x5D, 0x65, 0xC4, 0x2C, 0x11, 0xF9, 0x7D, 0xA3, 0x9B }; static const int sizeof_server_cert_der_2048 = sizeof(server_cert_der_2048); @@ -2543,10 +2573,10 @@ static const int sizeof_client_keypub_der_3072 = sizeof(client_keypub_der_3072); /* ./certs/3072/client-cert.der, 3072-bit */ static const unsigned char client_cert_der_3072[] = { - 0x30, 0x82, 0x05, 0xF8, 0x30, 0x82, 0x04, 0x60, 0xA0, 0x03, - 0x02, 0x01, 0x02, 0x02, 0x14, 0x2F, 0x06, 0x07, 0xA8, 0xB6, - 0xF4, 0xEE, 0x10, 0x91, 0x43, 0xDE, 0xE1, 0x46, 0x99, 0xC4, - 0x90, 0x79, 0xE6, 0xF1, 0xD1, 0x30, 0x0D, 0x06, 0x09, 0x2A, + 0x30, 0x82, 0x05, 0xFE, 0x30, 0x82, 0x04, 0x66, 0xA0, 0x03, + 0x02, 0x01, 0x02, 0x02, 0x14, 0x16, 0x65, 0x10, 0xFF, 0xE8, + 0x9A, 0x35, 0x33, 0x57, 0x0C, 0x4B, 0x37, 0xE1, 0x21, 0xFE, + 0x8E, 0xCA, 0x70, 0x54, 0xE8, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0B, 0x05, 0x00, 0x30, 0x81, 0x9E, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x10, 0x30, 0x0E, @@ -2564,10 +2594,10 @@ static const unsigned char client_cert_der_3072[] = 0x30, 0x1D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x01, 0x16, 0x10, 0x69, 0x6E, 0x66, 0x6F, 0x40, 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, - 0x6D, 0x30, 0x1E, 0x17, 0x0D, 0x32, 0x30, 0x30, 0x31, 0x32, - 0x32, 0x30, 0x35, 0x35, 0x31, 0x34, 0x38, 0x5A, 0x17, 0x0D, - 0x32, 0x32, 0x31, 0x30, 0x31, 0x38, 0x30, 0x35, 0x35, 0x31, - 0x34, 0x38, 0x5A, 0x30, 0x81, 0x9E, 0x31, 0x0B, 0x30, 0x09, + 0x6D, 0x30, 0x1E, 0x17, 0x0D, 0x32, 0x30, 0x30, 0x35, 0x30, + 0x37, 0x30, 0x37, 0x33, 0x39, 0x30, 0x34, 0x5A, 0x17, 0x0D, + 0x32, 0x33, 0x30, 0x32, 0x30, 0x31, 0x30, 0x37, 0x33, 0x39, + 0x30, 0x34, 0x5A, 0x30, 0x81, 0x9E, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0C, 0x07, 0x4D, 0x6F, 0x6E, 0x74, 0x61, 0x6E, 0x61, 0x31, 0x10, 0x30, @@ -2625,8 +2655,8 @@ static const unsigned char client_cert_der_3072[] = 0x08, 0x49, 0xDE, 0xEA, 0x13, 0x58, 0x72, 0xA0, 0xAA, 0x3A, 0xF9, 0x36, 0x03, 0x45, 0x57, 0x5E, 0x87, 0xD2, 0x73, 0x65, 0xC4, 0x8C, 0xA3, 0xEE, 0xC9, 0xD6, 0x73, 0x7C, 0x96, 0x41, - 0x93, 0x02, 0x03, 0x01, 0x00, 0x01, 0xA3, 0x82, 0x01, 0x2A, - 0x30, 0x82, 0x01, 0x26, 0x30, 0x1D, 0x06, 0x03, 0x55, 0x1D, + 0x93, 0x02, 0x03, 0x01, 0x00, 0x01, 0xA3, 0x82, 0x01, 0x30, + 0x30, 0x82, 0x01, 0x2C, 0x30, 0x1D, 0x06, 0x03, 0x55, 0x1D, 0x0E, 0x04, 0x16, 0x04, 0x14, 0x3D, 0xD1, 0x84, 0xC2, 0xAF, 0xB0, 0x20, 0x49, 0xBC, 0x74, 0x87, 0x41, 0x38, 0xAB, 0xBA, 0xD2, 0xD4, 0x0C, 0xA3, 0xA8, 0x30, 0x81, 0xDE, 0x06, 0x03, @@ -2650,53 +2680,53 @@ static const unsigned char client_cert_der_3072[] = 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x01, 0x16, 0x10, 0x69, 0x6E, 0x66, 0x6F, 0x40, 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, 0x6D, 0x82, 0x14, - 0x2F, 0x06, 0x07, 0xA8, 0xB6, 0xF4, 0xEE, 0x10, 0x91, 0x43, - 0xDE, 0xE1, 0x46, 0x99, 0xC4, 0x90, 0x79, 0xE6, 0xF1, 0xD1, + 0x16, 0x65, 0x10, 0xFF, 0xE8, 0x9A, 0x35, 0x33, 0x57, 0x0C, + 0x4B, 0x37, 0xE1, 0x21, 0xFE, 0x8E, 0xCA, 0x70, 0x54, 0xE8, 0x30, 0x0C, 0x06, 0x03, 0x55, 0x1D, 0x13, 0x04, 0x05, 0x30, - 0x03, 0x01, 0x01, 0xFF, 0x30, 0x16, 0x06, 0x03, 0x55, 0x1D, - 0x11, 0x04, 0x0F, 0x30, 0x0D, 0x82, 0x0B, 0x65, 0x78, 0x61, - 0x6D, 0x70, 0x6C, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x30, 0x0D, - 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, - 0x0B, 0x05, 0x00, 0x03, 0x82, 0x01, 0x81, 0x00, 0x04, 0xF5, - 0xE0, 0xE5, 0x75, 0x6B, 0xCF, 0xEE, 0x19, 0xEF, 0x3C, 0xB5, - 0xB6, 0x78, 0xCE, 0xB2, 0xC3, 0xF2, 0x3E, 0x0D, 0x3F, 0xB7, - 0x6D, 0x59, 0x7D, 0xB6, 0x7E, 0x6A, 0x91, 0x0F, 0x85, 0xAC, - 0xCA, 0x56, 0x30, 0x3C, 0x3F, 0x5D, 0x30, 0x10, 0x7C, 0x5E, - 0x7F, 0x98, 0xB2, 0x9D, 0x95, 0x04, 0xE1, 0xEE, 0xC0, 0x9E, - 0x1B, 0x01, 0x39, 0xCB, 0x02, 0x05, 0xB9, 0x9B, 0x02, 0x88, - 0xEB, 0xD0, 0xAD, 0x06, 0xD5, 0x39, 0x2D, 0x24, 0xE6, 0xDC, - 0x4E, 0xCE, 0x8C, 0x36, 0x7D, 0xB6, 0x8E, 0x1D, 0xE8, 0xB7, - 0xEF, 0xFF, 0xB4, 0x17, 0xC1, 0xA5, 0xD8, 0xFA, 0x34, 0xDD, - 0x99, 0x3D, 0x30, 0x4B, 0x45, 0xA2, 0x14, 0x6A, 0x88, 0x93, - 0xCA, 0x25, 0xE2, 0x5C, 0xD5, 0xBA, 0xE8, 0x9D, 0xEF, 0xD7, - 0x68, 0x76, 0x05, 0x92, 0x48, 0x19, 0x92, 0x11, 0x79, 0xC2, - 0xFE, 0x11, 0x49, 0x4D, 0xD6, 0xD1, 0x8F, 0x32, 0x1C, 0x5F, - 0x3B, 0x41, 0x2C, 0x08, 0xB2, 0x72, 0x65, 0x1C, 0xE5, 0x86, - 0x02, 0x94, 0xB3, 0x9D, 0x30, 0xDA, 0x59, 0x42, 0xA1, 0xB0, - 0x1E, 0x00, 0x92, 0x93, 0x6E, 0x0D, 0x27, 0xCF, 0xDF, 0xD8, - 0xCF, 0x2B, 0xCD, 0xCB, 0x8C, 0xFF, 0xB5, 0x6F, 0x83, 0x92, - 0x27, 0x00, 0x58, 0x59, 0xA2, 0x0B, 0x91, 0xB0, 0x39, 0xCA, - 0xA8, 0x78, 0xFD, 0x83, 0x56, 0x4F, 0xA1, 0x6E, 0xC3, 0xE0, - 0x2B, 0xAE, 0xEF, 0x3C, 0x09, 0x04, 0xF0, 0x9B, 0x5B, 0x00, - 0xD3, 0xED, 0xB6, 0x06, 0xF6, 0x9C, 0xDA, 0xAF, 0x61, 0x68, - 0x8F, 0xE3, 0x2A, 0xC3, 0x85, 0x20, 0x66, 0x2C, 0xAC, 0xDD, - 0x65, 0x37, 0x36, 0xC2, 0x2F, 0xBA, 0xB8, 0x90, 0x66, 0x6E, - 0x9E, 0x58, 0xA2, 0x4B, 0xD6, 0xA7, 0x30, 0xC8, 0xC9, 0x6C, - 0xBD, 0x13, 0x40, 0xA0, 0xCA, 0x59, 0x7C, 0xC5, 0x86, 0x9C, - 0x55, 0xC5, 0x68, 0xC7, 0x0C, 0x7F, 0x94, 0x73, 0xA5, 0x4B, - 0xEB, 0xF1, 0x27, 0x96, 0xB5, 0xF9, 0x69, 0x6B, 0x2B, 0xB6, - 0x62, 0xD7, 0x3A, 0x0D, 0x40, 0x65, 0xF0, 0x0D, 0xDE, 0x91, - 0x77, 0xD4, 0xF6, 0xBB, 0x13, 0x7B, 0x4A, 0x55, 0x8F, 0x7E, - 0x49, 0x65, 0x89, 0x37, 0x46, 0x05, 0x2F, 0x90, 0x14, 0x73, - 0x0D, 0x2D, 0x1E, 0xA4, 0xD4, 0xBB, 0x4E, 0x6D, 0x29, 0xDA, - 0x79, 0x6E, 0x73, 0x08, 0xDE, 0x5F, 0x27, 0xDC, 0x23, 0x14, - 0xDB, 0x7B, 0xE7, 0x02, 0x13, 0x2E, 0xC7, 0x94, 0x19, 0xF3, - 0x7D, 0x2E, 0xC4, 0x8A, 0x69, 0xBA, 0xF5, 0xBA, 0x62, 0xC2, - 0x88, 0xB5, 0xCB, 0xC7, 0x92, 0xA2, 0x8A, 0xE3, 0x69, 0x10, - 0x6E, 0xC5, 0xB8, 0xB2, 0x10, 0x7E, 0xB6, 0x0C, 0x71, 0x2A, - 0xC3, 0xE9, 0x71, 0x0C, 0xA2, 0x8B, 0x9A, 0x1D, 0x2C, 0x4E, - 0x21, 0x68, 0x53, 0x51, 0x6D, 0x0C, 0xD2, 0xB4, 0x4B, 0x50, - 0x4B, 0x0A + 0x03, 0x01, 0x01, 0xFF, 0x30, 0x1C, 0x06, 0x03, 0x55, 0x1D, + 0x11, 0x04, 0x15, 0x30, 0x13, 0x82, 0x0B, 0x65, 0x78, 0x61, + 0x6D, 0x70, 0x6C, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x87, 0x04, + 0x7F, 0x00, 0x00, 0x01, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, + 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0B, 0x05, 0x00, 0x03, + 0x82, 0x01, 0x81, 0x00, 0x0F, 0xCA, 0x1C, 0x23, 0xD1, 0x38, + 0x62, 0x9D, 0x6E, 0x0C, 0xD8, 0x2D, 0xD8, 0x4A, 0xC7, 0xB5, + 0xB4, 0x50, 0xAC, 0xD7, 0x4B, 0x84, 0x99, 0x47, 0xFB, 0xD5, + 0xEB, 0x71, 0x86, 0x30, 0x2A, 0x46, 0xE2, 0x0D, 0x6E, 0x12, + 0x1D, 0x16, 0x40, 0xF4, 0x53, 0x5C, 0x80, 0xA3, 0xF6, 0x03, + 0x75, 0x9C, 0xD9, 0x54, 0x89, 0x1C, 0x51, 0x78, 0x6D, 0x03, + 0x40, 0x88, 0xBB, 0x66, 0x03, 0xF7, 0xF7, 0x20, 0xC2, 0xB1, + 0x57, 0x58, 0x9F, 0x89, 0xEE, 0xE4, 0xC7, 0x6A, 0x98, 0x0A, + 0xA5, 0x04, 0x4E, 0x7E, 0x2E, 0xB2, 0x9D, 0xE7, 0x1D, 0x84, + 0xA2, 0x27, 0x50, 0xF9, 0x29, 0x29, 0xBD, 0x40, 0x8F, 0x24, + 0x03, 0xAE, 0xB4, 0x0C, 0x48, 0x9E, 0xA8, 0x14, 0x1F, 0x59, + 0x3D, 0xFC, 0x2C, 0x7E, 0xA8, 0xE3, 0x8D, 0xF0, 0x78, 0x96, + 0x16, 0xB9, 0x87, 0x45, 0x16, 0x44, 0xB8, 0x13, 0x24, 0xB8, + 0x41, 0xBF, 0xB1, 0x1C, 0xCB, 0xDA, 0x56, 0x9F, 0xD7, 0xDD, + 0xB7, 0x0C, 0x06, 0x4D, 0x5E, 0x90, 0x50, 0x2D, 0x25, 0x2D, + 0x88, 0x32, 0x82, 0xEC, 0x0F, 0x12, 0xAF, 0x57, 0x95, 0x4E, + 0x71, 0x21, 0x29, 0xDD, 0xD5, 0xED, 0x48, 0xFD, 0xED, 0xE3, + 0x94, 0xA2, 0x80, 0x61, 0x03, 0xE4, 0x13, 0xED, 0x9B, 0x87, + 0x05, 0x7F, 0xD0, 0x4F, 0x1B, 0x36, 0x36, 0xBD, 0xC4, 0x4D, + 0x19, 0xB7, 0xDF, 0x89, 0xA0, 0xD8, 0x89, 0x6B, 0x90, 0xE5, + 0x86, 0x7C, 0xF4, 0xE4, 0x12, 0xCB, 0xE7, 0x86, 0xC9, 0xC7, + 0xF8, 0x79, 0xD7, 0x51, 0x4A, 0x09, 0x69, 0x09, 0x6D, 0xA4, + 0x17, 0x5F, 0x46, 0x48, 0xF7, 0x41, 0x31, 0x33, 0xDC, 0x5E, + 0xF7, 0xEF, 0xB1, 0x4B, 0xBE, 0x04, 0x3A, 0x78, 0xE3, 0xBF, + 0x61, 0x9A, 0xD4, 0x6D, 0xD1, 0x53, 0xEF, 0x3D, 0x64, 0xBC, + 0xB8, 0x4B, 0x75, 0xC4, 0x0A, 0xA9, 0xE6, 0x09, 0xE3, 0x02, + 0xFC, 0x86, 0xA8, 0x28, 0x1E, 0x01, 0x7A, 0x57, 0x38, 0xA8, + 0x93, 0xDC, 0xEF, 0x92, 0xE5, 0xA3, 0x15, 0xEC, 0x77, 0xB8, + 0x96, 0x43, 0x32, 0xE0, 0xE3, 0x7F, 0x7D, 0xC6, 0x2B, 0x36, + 0x3E, 0x63, 0x31, 0x1F, 0x1F, 0x69, 0xC8, 0x7E, 0x16, 0x83, + 0xF8, 0x19, 0xD5, 0x98, 0x5E, 0xAD, 0xD7, 0xE4, 0xB1, 0xA2, + 0xEF, 0xD9, 0x2E, 0xF3, 0x89, 0x34, 0xF1, 0x91, 0x74, 0xF8, + 0x6D, 0xB9, 0xD1, 0xCC, 0xE0, 0xB4, 0xB4, 0x31, 0x67, 0x18, + 0x0A, 0x2D, 0x26, 0x51, 0x32, 0x4A, 0x08, 0x32, 0x37, 0x08, + 0x2E, 0x76, 0x6F, 0x97, 0x49, 0xB0, 0x23, 0xA2, 0x0D, 0xAF, + 0x89, 0x17, 0x72, 0x9D, 0xA7, 0x24, 0x7F, 0x07, 0x07, 0x67, + 0xF4, 0x7E, 0xD6, 0x1C, 0x5B, 0x59, 0x88, 0x15, 0x03, 0x81, + 0xB1, 0x7D, 0x0D, 0xC7, 0xCE, 0x1A, 0x95, 0xC8, 0x71, 0xB8, + 0x1D, 0x8F, 0x17, 0x91, 0xC1, 0x21, 0x83, 0xF3 }; static const int sizeof_client_cert_der_3072 = sizeof(client_cert_der_3072); @@ -3010,10 +3040,10 @@ static const int sizeof_client_keypub_der_4096 = sizeof(client_keypub_der_4096); /* ./certs/4096/client-cert.der, 4096-bit */ static const unsigned char client_cert_der_4096[] = { - 0x30, 0x82, 0x06, 0xE0, 0x30, 0x82, 0x04, 0xC8, 0xA0, 0x03, - 0x02, 0x01, 0x02, 0x02, 0x14, 0x2F, 0x0F, 0xAB, 0x23, 0xBC, - 0xA3, 0x14, 0x07, 0x91, 0x06, 0x55, 0x35, 0x01, 0x63, 0x7F, - 0x42, 0xBD, 0xFB, 0xF2, 0x43, 0x30, 0x0D, 0x06, 0x09, 0x2A, + 0x30, 0x82, 0x06, 0xFE, 0x30, 0x82, 0x04, 0xE6, 0xA0, 0x03, + 0x02, 0x01, 0x02, 0x02, 0x14, 0x08, 0x23, 0x7F, 0xD2, 0xD2, + 0x23, 0x3E, 0x0F, 0xCC, 0x55, 0x94, 0x25, 0x1F, 0x51, 0x7B, + 0xE7, 0xCC, 0x3F, 0x4C, 0xAF, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0B, 0x05, 0x00, 0x30, 0x81, 0x9E, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x10, 0x30, 0x0E, @@ -3031,10 +3061,10 @@ static const unsigned char client_cert_der_4096[] = 0x30, 0x1D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x01, 0x16, 0x10, 0x69, 0x6E, 0x66, 0x6F, 0x40, 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, - 0x6D, 0x30, 0x1E, 0x17, 0x0D, 0x31, 0x39, 0x30, 0x37, 0x30, - 0x39, 0x30, 0x33, 0x30, 0x36, 0x30, 0x32, 0x5A, 0x17, 0x0D, - 0x32, 0x32, 0x30, 0x34, 0x30, 0x34, 0x30, 0x33, 0x30, 0x36, - 0x30, 0x32, 0x5A, 0x30, 0x81, 0x9E, 0x31, 0x0B, 0x30, 0x09, + 0x6D, 0x30, 0x1E, 0x17, 0x0D, 0x32, 0x30, 0x30, 0x35, 0x30, + 0x37, 0x30, 0x37, 0x33, 0x39, 0x30, 0x34, 0x5A, 0x17, 0x0D, + 0x32, 0x33, 0x30, 0x32, 0x30, 0x31, 0x30, 0x37, 0x33, 0x39, + 0x30, 0x34, 0x5A, 0x30, 0x81, 0x9E, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0C, 0x07, 0x4D, 0x6F, 0x6E, 0x74, 0x61, 0x6E, 0x61, 0x31, 0x10, 0x30, @@ -3105,8 +3135,8 @@ static const unsigned char client_cert_der_4096[] = 0x17, 0xB6, 0x03, 0xA9, 0x08, 0xDD, 0x9C, 0xF4, 0x14, 0xC9, 0xC9, 0x59, 0x39, 0x72, 0xD4, 0x7E, 0x02, 0x37, 0x31, 0xCD, 0x0E, 0xA7, 0x3D, 0xF8, 0xF2, 0xCF, 0x6B, 0x15, 0xAB, 0x02, - 0x03, 0x01, 0x00, 0x01, 0xA3, 0x82, 0x01, 0x12, 0x30, 0x82, - 0x01, 0x0E, 0x30, 0x1D, 0x06, 0x03, 0x55, 0x1D, 0x0E, 0x04, + 0x03, 0x01, 0x00, 0x01, 0xA3, 0x82, 0x01, 0x30, 0x30, 0x82, + 0x01, 0x2C, 0x30, 0x1D, 0x06, 0x03, 0x55, 0x1D, 0x0E, 0x04, 0x16, 0x04, 0x14, 0xFA, 0x54, 0x89, 0x67, 0xE5, 0x5F, 0xB7, 0x31, 0x40, 0xEA, 0xFD, 0xE7, 0xF6, 0xA3, 0xC6, 0x5A, 0x56, 0x16, 0xA5, 0x6E, 0x30, 0x81, 0xDE, 0x06, 0x03, 0x55, 0x1D, @@ -3129,64 +3159,67 @@ static const unsigned char client_cert_der_4096[] = 0x63, 0x6F, 0x6D, 0x31, 0x1F, 0x30, 0x1D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x01, 0x16, 0x10, 0x69, 0x6E, 0x66, 0x6F, 0x40, 0x77, 0x6F, 0x6C, 0x66, 0x73, - 0x73, 0x6C, 0x2E, 0x63, 0x6F, 0x6D, 0x82, 0x14, 0x2F, 0x0F, - 0xAB, 0x23, 0xBC, 0xA3, 0x14, 0x07, 0x91, 0x06, 0x55, 0x35, - 0x01, 0x63, 0x7F, 0x42, 0xBD, 0xFB, 0xF2, 0x43, 0x30, 0x0C, + 0x73, 0x6C, 0x2E, 0x63, 0x6F, 0x6D, 0x82, 0x14, 0x08, 0x23, + 0x7F, 0xD2, 0xD2, 0x23, 0x3E, 0x0F, 0xCC, 0x55, 0x94, 0x25, + 0x1F, 0x51, 0x7B, 0xE7, 0xCC, 0x3F, 0x4C, 0xAF, 0x30, 0x0C, 0x06, 0x03, 0x55, 0x1D, 0x13, 0x04, 0x05, 0x30, 0x03, 0x01, - 0x01, 0xFF, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, + 0x01, 0xFF, 0x30, 0x1C, 0x06, 0x03, 0x55, 0x1D, 0x11, 0x04, + 0x15, 0x30, 0x13, 0x82, 0x0B, 0x65, 0x78, 0x61, 0x6D, 0x70, + 0x6C, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x87, 0x04, 0x7F, 0x00, + 0x00, 0x01, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0B, 0x05, 0x00, 0x03, 0x82, 0x02, - 0x01, 0x00, 0x57, 0x0D, 0x97, 0x98, 0x78, 0xBF, 0x2A, 0x31, - 0x9A, 0x39, 0x41, 0x38, 0x33, 0x46, 0xD5, 0x50, 0x47, 0xE8, - 0x19, 0x62, 0xA8, 0x36, 0x1E, 0xB7, 0xFD, 0xD1, 0xBC, 0x50, - 0x5C, 0x3A, 0xEB, 0x96, 0x1A, 0x9B, 0x43, 0xB0, 0x67, 0x5D, - 0xF4, 0x51, 0x77, 0x87, 0x33, 0x0B, 0x90, 0x6F, 0xE8, 0xD3, - 0x82, 0x4D, 0x1A, 0xAA, 0x93, 0x5F, 0x7D, 0x78, 0xB1, 0xE0, - 0x7B, 0xEE, 0x88, 0x01, 0xE7, 0xB3, 0xFA, 0x7E, 0x0B, 0x76, - 0x9C, 0x9E, 0x81, 0x36, 0xE4, 0xA3, 0xC1, 0x41, 0x62, 0xA4, - 0x0A, 0x7E, 0x24, 0xD0, 0xAB, 0x9F, 0xBA, 0xD8, 0x1E, 0x38, - 0xAD, 0xF1, 0x12, 0x52, 0x0D, 0xF2, 0x96, 0x8A, 0x0B, 0x25, - 0xA2, 0x49, 0x3F, 0x88, 0x5B, 0xEA, 0x23, 0x87, 0x26, 0x22, - 0x7A, 0xB9, 0x60, 0x6B, 0xD6, 0x7A, 0x88, 0x37, 0xAC, 0x64, - 0x9B, 0x18, 0x51, 0x07, 0xEA, 0xDF, 0x00, 0x96, 0x70, 0x95, - 0x88, 0x9D, 0x8F, 0xAF, 0xBE, 0x3C, 0x4E, 0xC7, 0x5E, 0x55, - 0x15, 0x3D, 0x1F, 0xE4, 0x2D, 0xDC, 0xC9, 0xA3, 0xAE, 0xAF, - 0xFA, 0x44, 0xA8, 0xE2, 0xF4, 0xDF, 0x8E, 0xCD, 0xF9, 0x10, - 0x7F, 0x8B, 0x86, 0xCC, 0x6D, 0x45, 0x91, 0x91, 0x4F, 0xE3, - 0xD0, 0xA7, 0xD2, 0xD9, 0x8E, 0x09, 0xC6, 0xF8, 0xEB, 0xE7, - 0xBD, 0x17, 0x19, 0xD6, 0xE7, 0x1A, 0xB8, 0xCA, 0x4D, 0xEC, - 0x34, 0x07, 0x7D, 0x2D, 0xE8, 0x23, 0x9D, 0x82, 0xE9, 0xF7, - 0x47, 0x03, 0xAB, 0x5F, 0x7C, 0xF5, 0x41, 0x6F, 0x70, 0x11, - 0xCB, 0x24, 0xD8, 0x23, 0xC2, 0x65, 0x31, 0xB7, 0x0B, 0x8F, - 0x0A, 0x26, 0x5B, 0x0F, 0xF6, 0x9B, 0x11, 0x7F, 0x9A, 0x8D, - 0x94, 0x6D, 0x5A, 0x9C, 0x5E, 0x73, 0x35, 0x15, 0x7B, 0xE3, - 0x09, 0xE8, 0x08, 0xD0, 0x3F, 0xB4, 0xE5, 0x29, 0x2C, 0xF6, - 0x3E, 0x71, 0x6E, 0xF4, 0x1B, 0x20, 0x55, 0x34, 0x40, 0x2F, - 0xB0, 0x9B, 0xDD, 0xF1, 0xDC, 0xBF, 0x17, 0x1D, 0xA7, 0x2D, - 0x85, 0x01, 0xD6, 0xD2, 0xB2, 0x56, 0x56, 0x98, 0x33, 0x85, - 0xED, 0xF6, 0xA3, 0xF6, 0x3E, 0x7B, 0xF4, 0x03, 0xA4, 0x58, - 0x8E, 0xC5, 0x5B, 0xAB, 0x66, 0xE8, 0x0F, 0x34, 0x17, 0x2D, - 0x33, 0x36, 0x71, 0x0C, 0xB8, 0xD9, 0x78, 0xE7, 0x06, 0xFC, - 0xDA, 0x4F, 0xA1, 0xFA, 0xDB, 0x74, 0xCE, 0xEA, 0x85, 0x27, - 0xF9, 0x75, 0xA9, 0xAD, 0x50, 0x86, 0x6E, 0xEA, 0x01, 0x01, - 0x19, 0x0D, 0x28, 0x4A, 0xED, 0x06, 0xBE, 0x65, 0x70, 0xB2, - 0x06, 0x46, 0x2E, 0x16, 0x57, 0xDF, 0x55, 0xC7, 0x8E, 0xCD, - 0x5B, 0xAD, 0x66, 0x28, 0xB8, 0x74, 0x87, 0xBF, 0xC4, 0xC7, - 0x08, 0x3F, 0x37, 0xA3, 0x23, 0x84, 0x9F, 0x4E, 0xE8, 0x48, - 0x6C, 0x8D, 0x54, 0x9F, 0xFB, 0xE0, 0xFB, 0x53, 0xA3, 0x41, - 0xE1, 0x68, 0x8A, 0x94, 0xC9, 0xF5, 0xEE, 0x3E, 0x15, 0x46, - 0xD2, 0x62, 0x33, 0x86, 0x86, 0x06, 0x34, 0xB4, 0xE4, 0x2F, - 0xDA, 0x28, 0x2E, 0x2F, 0xC0, 0xBD, 0x75, 0xE8, 0x2C, 0x3F, - 0xE2, 0xA5, 0x43, 0x7D, 0x02, 0xEB, 0x25, 0xB9, 0xEF, 0x87, - 0x8A, 0xD7, 0x57, 0x61, 0x16, 0xE8, 0x9E, 0x83, 0x65, 0xF9, - 0x10, 0xF4, 0x5E, 0x5F, 0x1C, 0x7A, 0x25, 0xD6, 0x47, 0xBD, - 0x29, 0xC5, 0x4F, 0x8B, 0xB9, 0x6A, 0x48, 0x7A, 0x9B, 0x1E, - 0x6D, 0x77, 0x8E, 0x72, 0x6C, 0x0C, 0x07, 0xFE, 0x4C, 0xC5, - 0xCF, 0x55, 0x0E, 0xCB, 0x4B, 0xAD, 0x16, 0xE1, 0xE2, 0x54, - 0xB8, 0x9D, 0x34, 0x03, 0xD1, 0x8D, 0xB7, 0x37, 0x9B, 0xE3, - 0x5A, 0x32, 0x60, 0x03, 0x7F, 0x61, 0x0F, 0x50, 0x0B, 0x72, - 0x54, 0x8B, 0x0D, 0xC7, 0x97, 0x7E, 0xBB, 0x9B, 0xB2, 0xF7, - 0x73, 0x47, 0x71, 0x7B, 0x78, 0x65, 0x36, 0xDF, 0x57, 0x72, - 0x9E, 0x42, 0x9C, 0x8A + 0x01, 0x00, 0x99, 0xE7, 0xE8, 0x6B, 0x6A, 0xC9, 0x27, 0x93, + 0xE8, 0xD0, 0xFD, 0xCC, 0x82, 0x54, 0x17, 0xA8, 0x0B, 0x6D, + 0x10, 0x58, 0x63, 0x07, 0x35, 0xBA, 0x1C, 0x42, 0xB2, 0xFD, + 0x4D, 0xF3, 0x98, 0x3F, 0x86, 0xAD, 0x45, 0xEC, 0x5C, 0xEB, + 0xDE, 0x90, 0x00, 0x7A, 0x3E, 0x93, 0xB0, 0x8F, 0xA8, 0x06, + 0x62, 0x25, 0x91, 0x79, 0xA0, 0x14, 0x47, 0xC8, 0x1E, 0x87, + 0x35, 0x98, 0x1F, 0x41, 0x95, 0xE7, 0x68, 0x61, 0xE7, 0xFC, + 0xAD, 0x1A, 0xDC, 0x34, 0x0A, 0x12, 0xD2, 0x8D, 0x58, 0x22, + 0xF6, 0xBB, 0x6F, 0xCF, 0x1A, 0x55, 0xFF, 0x76, 0x28, 0x3C, + 0xA1, 0xE9, 0x6A, 0xEA, 0x3E, 0xD0, 0x1B, 0x88, 0xF9, 0x7F, + 0x4E, 0x59, 0xA5, 0x86, 0x6F, 0x18, 0xA1, 0xAC, 0xE0, 0x87, + 0xF4, 0xEE, 0x12, 0xF3, 0xCD, 0x79, 0x2A, 0xDD, 0xB1, 0x9F, + 0x4D, 0x01, 0x74, 0x59, 0x9F, 0x0E, 0xB0, 0xF8, 0xEB, 0x22, + 0x2A, 0x1F, 0x6C, 0x10, 0x1C, 0x0A, 0x32, 0xD6, 0xD4, 0xC1, + 0xF5, 0xA2, 0xFE, 0x50, 0x0A, 0x4C, 0x4A, 0x34, 0x1C, 0x5F, + 0x66, 0xAB, 0x58, 0xEC, 0xE4, 0xDF, 0xAB, 0xE8, 0x57, 0x32, + 0xB7, 0xA2, 0x7A, 0xA1, 0x89, 0xF4, 0x18, 0x6A, 0x47, 0xFD, + 0x09, 0x4A, 0xD2, 0x7A, 0x77, 0x26, 0x1B, 0x89, 0xB7, 0x51, + 0x44, 0x7B, 0x1F, 0xEE, 0x41, 0x45, 0xC1, 0x7B, 0xC0, 0xD0, + 0xAB, 0xC5, 0x56, 0x90, 0x97, 0xD3, 0x8C, 0xED, 0xE6, 0xA7, + 0xE6, 0xE6, 0x7B, 0x58, 0x79, 0x65, 0xA3, 0x13, 0x2C, 0xF0, + 0x90, 0xDE, 0x77, 0x09, 0xA2, 0x37, 0xF0, 0xD1, 0xC7, 0xB8, + 0x60, 0x69, 0xB0, 0xBD, 0x76, 0xDE, 0x7F, 0xD1, 0x7A, 0xA3, + 0xFC, 0x5E, 0xDA, 0x06, 0xB3, 0x0A, 0xCF, 0xDE, 0x9A, 0x63, + 0x7E, 0x67, 0x79, 0xE3, 0xD9, 0xC5, 0x98, 0xAB, 0x9B, 0x23, + 0x2D, 0xD5, 0x0D, 0xE4, 0xD4, 0x1A, 0xE3, 0x16, 0x75, 0x27, + 0xEA, 0xCA, 0x46, 0x9D, 0xFA, 0x2D, 0x27, 0xF6, 0x25, 0xB4, + 0x5F, 0xA3, 0x4F, 0x10, 0x9A, 0x80, 0x25, 0x9B, 0xE3, 0x03, + 0xA9, 0xE3, 0xCA, 0xA5, 0xE0, 0x86, 0x61, 0x9E, 0xBF, 0xB8, + 0x69, 0x03, 0x3B, 0x1D, 0xBA, 0xBF, 0x05, 0x8F, 0x96, 0x78, + 0x71, 0xFA, 0x1F, 0xDD, 0xEA, 0xBE, 0x53, 0xA9, 0x6A, 0x1C, + 0xF9, 0xF3, 0x6C, 0x38, 0x7C, 0x59, 0x42, 0xA6, 0x3A, 0xFA, + 0x47, 0xD5, 0xD2, 0x33, 0xC7, 0xF3, 0x60, 0xCE, 0xB3, 0x2A, + 0xAB, 0xB8, 0xD4, 0x38, 0x17, 0x8C, 0xB4, 0xCC, 0xB5, 0x5A, + 0x77, 0x22, 0xE4, 0x0B, 0xB6, 0x09, 0x48, 0xE9, 0xFC, 0x0E, + 0x96, 0xB5, 0x2B, 0x28, 0x6D, 0x90, 0x9A, 0x51, 0xA8, 0x09, + 0xCF, 0x74, 0x35, 0x3A, 0xF7, 0xF5, 0x85, 0x72, 0x1E, 0xA6, + 0xD3, 0x4A, 0x2C, 0xA0, 0x4C, 0x30, 0x3B, 0x43, 0x63, 0xE6, + 0xE6, 0x11, 0xAF, 0x48, 0xB5, 0x0B, 0x17, 0xE4, 0xF7, 0x1A, + 0x23, 0x82, 0x19, 0x5E, 0xB3, 0xCD, 0xFA, 0x49, 0x2F, 0xFC, + 0xAB, 0x4A, 0x13, 0x12, 0x5B, 0x91, 0x0A, 0xA5, 0x12, 0xA2, + 0xDF, 0x61, 0xA1, 0xD0, 0xA7, 0x5A, 0x46, 0x1F, 0xB9, 0x16, + 0x90, 0x96, 0xF4, 0x86, 0x7F, 0xDE, 0xB4, 0x6A, 0xE4, 0xCC, + 0x63, 0x06, 0x31, 0xF2, 0x1C, 0xC2, 0xBA, 0x5A, 0x80, 0xC7, + 0xFF, 0xA9, 0x01, 0xEC, 0x0F, 0x26, 0x44, 0x69, 0x4B, 0xC3, + 0xA6, 0x90, 0x25, 0xE4, 0x78, 0x6D, 0x91, 0x3C, 0x22, 0xAC, + 0x48, 0x25, 0x1F, 0x92, 0x97, 0x1D, 0xAA, 0xD2, 0x24, 0x60, + 0xBF, 0x3B, 0xE2, 0x35, 0x9D, 0x04, 0x8F, 0xF9, 0x81, 0x36, + 0xF5, 0xEF, 0x0E, 0x57, 0x8C, 0x92, 0xBC, 0x0F, 0x3A, 0x2A, + 0x3F, 0x8B, 0x81, 0x1C, 0x55, 0x13, 0x26, 0xE1, 0x1E, 0x85, + 0x7F, 0x34, 0xC9, 0x1E, 0x7F, 0x71, 0x62, 0x17, 0x6D, 0x8D, + 0x83, 0x4E, 0x6E, 0x61 }; static const int sizeof_client_cert_der_4096 = sizeof(client_cert_der_4096); @@ -3291,85 +3324,90 @@ static const int sizeof_ecc_clikeypub_der_256 = sizeof(ecc_clikeypub_der_256); /* ./certs/client-ecc-cert.der, ECC */ static const unsigned char cliecc_cert_der_256[] = { - 0x30, 0x82, 0x03, 0x08, 0x30, 0x82, 0x02, 0xAF, 0xA0, 0x03, - 0x02, 0x01, 0x02, 0x02, 0x09, 0x00, 0x93, 0xBF, 0x6A, 0xDE, - 0x9B, 0x41, 0x9D, 0xAD, 0x30, 0x0A, 0x06, 0x08, 0x2A, 0x86, - 0x48, 0xCE, 0x3D, 0x04, 0x03, 0x02, 0x30, 0x81, 0x8D, 0x31, - 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, - 0x55, 0x53, 0x31, 0x0F, 0x30, 0x0D, 0x06, 0x03, 0x55, 0x04, - 0x08, 0x0C, 0x06, 0x4F, 0x72, 0x65, 0x67, 0x6F, 0x6E, 0x31, - 0x0E, 0x30, 0x0C, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0C, 0x05, - 0x53, 0x61, 0x6C, 0x65, 0x6D, 0x31, 0x13, 0x30, 0x11, 0x06, - 0x03, 0x55, 0x04, 0x0A, 0x0C, 0x0A, 0x43, 0x6C, 0x69, 0x65, - 0x6E, 0x74, 0x20, 0x45, 0x43, 0x43, 0x31, 0x0D, 0x30, 0x0B, - 0x06, 0x03, 0x55, 0x04, 0x0B, 0x0C, 0x04, 0x46, 0x61, 0x73, - 0x74, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, 0x03, - 0x0C, 0x0F, 0x77, 0x77, 0x77, 0x2E, 0x77, 0x6F, 0x6C, 0x66, - 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, 0x6D, 0x31, 0x1F, 0x30, - 0x1D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, - 0x09, 0x01, 0x16, 0x10, 0x69, 0x6E, 0x66, 0x6F, 0x40, 0x77, + 0x30, 0x82, 0x03, 0x3F, 0x30, 0x82, 0x02, 0xE5, 0xA0, 0x03, + 0x02, 0x01, 0x02, 0x02, 0x14, 0x15, 0x7A, 0xFC, 0x3F, 0x63, + 0xCB, 0x8D, 0xDB, 0x76, 0xD2, 0x2A, 0x71, 0x25, 0x78, 0xB6, + 0xF5, 0xCF, 0x38, 0x51, 0x1C, 0x30, 0x0A, 0x06, 0x08, 0x2A, + 0x86, 0x48, 0xCE, 0x3D, 0x04, 0x03, 0x02, 0x30, 0x81, 0x8D, + 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, + 0x02, 0x55, 0x53, 0x31, 0x0F, 0x30, 0x0D, 0x06, 0x03, 0x55, + 0x04, 0x08, 0x0C, 0x06, 0x4F, 0x72, 0x65, 0x67, 0x6F, 0x6E, + 0x31, 0x0E, 0x30, 0x0C, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0C, + 0x05, 0x53, 0x61, 0x6C, 0x65, 0x6D, 0x31, 0x13, 0x30, 0x11, + 0x06, 0x03, 0x55, 0x04, 0x0A, 0x0C, 0x0A, 0x43, 0x6C, 0x69, + 0x65, 0x6E, 0x74, 0x20, 0x45, 0x43, 0x43, 0x31, 0x0D, 0x30, + 0x0B, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x0C, 0x04, 0x46, 0x61, + 0x73, 0x74, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, + 0x03, 0x0C, 0x0F, 0x77, 0x77, 0x77, 0x2E, 0x77, 0x6F, 0x6C, + 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, 0x6D, 0x31, 0x1F, + 0x30, 0x1D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, + 0x01, 0x09, 0x01, 0x16, 0x10, 0x69, 0x6E, 0x66, 0x6F, 0x40, + 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, + 0x6D, 0x30, 0x1E, 0x17, 0x0D, 0x32, 0x30, 0x30, 0x35, 0x30, + 0x37, 0x30, 0x37, 0x33, 0x39, 0x30, 0x34, 0x5A, 0x17, 0x0D, + 0x32, 0x33, 0x30, 0x32, 0x30, 0x31, 0x30, 0x37, 0x33, 0x39, + 0x30, 0x34, 0x5A, 0x30, 0x81, 0x8D, 0x31, 0x0B, 0x30, 0x09, + 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, + 0x0F, 0x30, 0x0D, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0C, 0x06, + 0x4F, 0x72, 0x65, 0x67, 0x6F, 0x6E, 0x31, 0x0E, 0x30, 0x0C, + 0x06, 0x03, 0x55, 0x04, 0x07, 0x0C, 0x05, 0x53, 0x61, 0x6C, + 0x65, 0x6D, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, + 0x0A, 0x0C, 0x0A, 0x43, 0x6C, 0x69, 0x65, 0x6E, 0x74, 0x20, + 0x45, 0x43, 0x43, 0x31, 0x0D, 0x30, 0x0B, 0x06, 0x03, 0x55, + 0x04, 0x0B, 0x0C, 0x04, 0x46, 0x61, 0x73, 0x74, 0x31, 0x18, + 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0C, 0x0F, 0x77, + 0x77, 0x77, 0x2E, 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, + 0x2E, 0x63, 0x6F, 0x6D, 0x31, 0x1F, 0x30, 0x1D, 0x06, 0x09, + 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x01, 0x16, + 0x10, 0x69, 0x6E, 0x66, 0x6F, 0x40, 0x77, 0x6F, 0x6C, 0x66, + 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, 0x6D, 0x30, 0x59, 0x30, + 0x13, 0x06, 0x07, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x02, 0x01, + 0x06, 0x08, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x01, 0x07, + 0x03, 0x42, 0x00, 0x04, 0x55, 0xBF, 0xF4, 0x0F, 0x44, 0x50, + 0x9A, 0x3D, 0xCE, 0x9B, 0xB7, 0xF0, 0xC5, 0x4D, 0xF5, 0x70, + 0x7B, 0xD4, 0xEC, 0x24, 0x8E, 0x19, 0x80, 0xEC, 0x5A, 0x4C, + 0xA2, 0x24, 0x03, 0x62, 0x2C, 0x9B, 0xDA, 0xEF, 0xA2, 0x35, + 0x12, 0x43, 0x84, 0x76, 0x16, 0xC6, 0x56, 0x95, 0x06, 0xCC, + 0x01, 0xA9, 0xBD, 0xF6, 0x75, 0x1A, 0x42, 0xF7, 0xBD, 0xA9, + 0xB2, 0x36, 0x22, 0x5F, 0xC7, 0x5D, 0x7F, 0xB4, 0xA3, 0x82, + 0x01, 0x1F, 0x30, 0x82, 0x01, 0x1B, 0x30, 0x1D, 0x06, 0x03, + 0x55, 0x1D, 0x0E, 0x04, 0x16, 0x04, 0x14, 0xEB, 0xD4, 0x4B, + 0x59, 0x6B, 0x95, 0x61, 0x3F, 0x51, 0x57, 0xB6, 0x04, 0x4D, + 0x89, 0x41, 0x88, 0x44, 0x5C, 0xAB, 0xF2, 0x30, 0x81, 0xCD, + 0x06, 0x03, 0x55, 0x1D, 0x23, 0x04, 0x81, 0xC5, 0x30, 0x81, + 0xC2, 0x80, 0x14, 0xEB, 0xD4, 0x4B, 0x59, 0x6B, 0x95, 0x61, + 0x3F, 0x51, 0x57, 0xB6, 0x04, 0x4D, 0x89, 0x41, 0x88, 0x44, + 0x5C, 0xAB, 0xF2, 0xA1, 0x81, 0x93, 0xA4, 0x81, 0x90, 0x30, + 0x81, 0x8D, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, + 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x0F, 0x30, 0x0D, 0x06, + 0x03, 0x55, 0x04, 0x08, 0x0C, 0x06, 0x4F, 0x72, 0x65, 0x67, + 0x6F, 0x6E, 0x31, 0x0E, 0x30, 0x0C, 0x06, 0x03, 0x55, 0x04, + 0x07, 0x0C, 0x05, 0x53, 0x61, 0x6C, 0x65, 0x6D, 0x31, 0x13, + 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x0A, 0x0C, 0x0A, 0x43, + 0x6C, 0x69, 0x65, 0x6E, 0x74, 0x20, 0x45, 0x43, 0x43, 0x31, + 0x0D, 0x30, 0x0B, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x0C, 0x04, + 0x46, 0x61, 0x73, 0x74, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, + 0x55, 0x04, 0x03, 0x0C, 0x0F, 0x77, 0x77, 0x77, 0x2E, 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, 0x6D, - 0x30, 0x1E, 0x17, 0x0D, 0x31, 0x38, 0x30, 0x34, 0x31, 0x33, - 0x31, 0x35, 0x32, 0x33, 0x31, 0x30, 0x5A, 0x17, 0x0D, 0x32, - 0x31, 0x30, 0x31, 0x30, 0x37, 0x31, 0x35, 0x32, 0x33, 0x31, - 0x30, 0x5A, 0x30, 0x81, 0x8D, 0x31, 0x0B, 0x30, 0x09, 0x06, - 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x0F, - 0x30, 0x0D, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0C, 0x06, 0x4F, - 0x72, 0x65, 0x67, 0x6F, 0x6E, 0x31, 0x0E, 0x30, 0x0C, 0x06, - 0x03, 0x55, 0x04, 0x07, 0x0C, 0x05, 0x53, 0x61, 0x6C, 0x65, - 0x6D, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x0A, - 0x0C, 0x0A, 0x43, 0x6C, 0x69, 0x65, 0x6E, 0x74, 0x20, 0x45, - 0x43, 0x43, 0x31, 0x0D, 0x30, 0x0B, 0x06, 0x03, 0x55, 0x04, - 0x0B, 0x0C, 0x04, 0x46, 0x61, 0x73, 0x74, 0x31, 0x18, 0x30, - 0x16, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0C, 0x0F, 0x77, 0x77, - 0x77, 0x2E, 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, - 0x63, 0x6F, 0x6D, 0x31, 0x1F, 0x30, 0x1D, 0x06, 0x09, 0x2A, - 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x01, 0x16, 0x10, - 0x69, 0x6E, 0x66, 0x6F, 0x40, 0x77, 0x6F, 0x6C, 0x66, 0x73, - 0x73, 0x6C, 0x2E, 0x63, 0x6F, 0x6D, 0x30, 0x59, 0x30, 0x13, - 0x06, 0x07, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x02, 0x01, 0x06, - 0x08, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x01, 0x07, 0x03, - 0x42, 0x00, 0x04, 0x55, 0xBF, 0xF4, 0x0F, 0x44, 0x50, 0x9A, - 0x3D, 0xCE, 0x9B, 0xB7, 0xF0, 0xC5, 0x4D, 0xF5, 0x70, 0x7B, - 0xD4, 0xEC, 0x24, 0x8E, 0x19, 0x80, 0xEC, 0x5A, 0x4C, 0xA2, - 0x24, 0x03, 0x62, 0x2C, 0x9B, 0xDA, 0xEF, 0xA2, 0x35, 0x12, - 0x43, 0x84, 0x76, 0x16, 0xC6, 0x56, 0x95, 0x06, 0xCC, 0x01, - 0xA9, 0xBD, 0xF6, 0x75, 0x1A, 0x42, 0xF7, 0xBD, 0xA9, 0xB2, - 0x36, 0x22, 0x5F, 0xC7, 0x5D, 0x7F, 0xB4, 0xA3, 0x81, 0xF5, - 0x30, 0x81, 0xF2, 0x30, 0x1D, 0x06, 0x03, 0x55, 0x1D, 0x0E, - 0x04, 0x16, 0x04, 0x14, 0xEB, 0xD4, 0x4B, 0x59, 0x6B, 0x95, - 0x61, 0x3F, 0x51, 0x57, 0xB6, 0x04, 0x4D, 0x89, 0x41, 0x88, - 0x44, 0x5C, 0xAB, 0xF2, 0x30, 0x81, 0xC2, 0x06, 0x03, 0x55, - 0x1D, 0x23, 0x04, 0x81, 0xBA, 0x30, 0x81, 0xB7, 0x80, 0x14, - 0xEB, 0xD4, 0x4B, 0x59, 0x6B, 0x95, 0x61, 0x3F, 0x51, 0x57, - 0xB6, 0x04, 0x4D, 0x89, 0x41, 0x88, 0x44, 0x5C, 0xAB, 0xF2, - 0xA1, 0x81, 0x93, 0xA4, 0x81, 0x90, 0x30, 0x81, 0x8D, 0x31, - 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, - 0x55, 0x53, 0x31, 0x0F, 0x30, 0x0D, 0x06, 0x03, 0x55, 0x04, - 0x08, 0x0C, 0x06, 0x4F, 0x72, 0x65, 0x67, 0x6F, 0x6E, 0x31, - 0x0E, 0x30, 0x0C, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0C, 0x05, - 0x53, 0x61, 0x6C, 0x65, 0x6D, 0x31, 0x13, 0x30, 0x11, 0x06, - 0x03, 0x55, 0x04, 0x0A, 0x0C, 0x0A, 0x43, 0x6C, 0x69, 0x65, - 0x6E, 0x74, 0x20, 0x45, 0x43, 0x43, 0x31, 0x0D, 0x30, 0x0B, - 0x06, 0x03, 0x55, 0x04, 0x0B, 0x0C, 0x04, 0x46, 0x61, 0x73, - 0x74, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, 0x03, - 0x0C, 0x0F, 0x77, 0x77, 0x77, 0x2E, 0x77, 0x6F, 0x6C, 0x66, - 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, 0x6D, 0x31, 0x1F, 0x30, - 0x1D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, - 0x09, 0x01, 0x16, 0x10, 0x69, 0x6E, 0x66, 0x6F, 0x40, 0x77, - 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, 0x6D, - 0x82, 0x09, 0x00, 0x93, 0xBF, 0x6A, 0xDE, 0x9B, 0x41, 0x9D, - 0xAD, 0x30, 0x0C, 0x06, 0x03, 0x55, 0x1D, 0x13, 0x04, 0x05, - 0x30, 0x03, 0x01, 0x01, 0xFF, 0x30, 0x0A, 0x06, 0x08, 0x2A, - 0x86, 0x48, 0xCE, 0x3D, 0x04, 0x03, 0x02, 0x03, 0x47, 0x00, - 0x30, 0x44, 0x02, 0x20, 0x61, 0xBC, 0x9D, 0x4D, 0x88, 0x64, - 0x86, 0xB8, 0x71, 0xAA, 0x35, 0x59, 0x68, 0xB8, 0xEE, 0x2C, - 0xF3, 0x23, 0xB5, 0x1A, 0xB9, 0xBA, 0x41, 0x50, 0xA8, 0xC6, - 0xC3, 0x58, 0xEB, 0x58, 0xBD, 0x60, 0x02, 0x20, 0x61, 0xAA, - 0xEB, 0xB5, 0x73, 0x0D, 0x01, 0xDB, 0x69, 0x8F, 0x52, 0xF5, - 0x72, 0x6D, 0x37, 0x42, 0xB5, 0xFD, 0x94, 0xB6, 0x6E, 0xB1, - 0xC4, 0x25, 0x2E, 0x96, 0x96, 0xF3, 0x39, 0xB2, 0x5D, 0xEA - + 0x31, 0x1F, 0x30, 0x1D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, + 0xF7, 0x0D, 0x01, 0x09, 0x01, 0x16, 0x10, 0x69, 0x6E, 0x66, + 0x6F, 0x40, 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, + 0x63, 0x6F, 0x6D, 0x82, 0x14, 0x15, 0x7A, 0xFC, 0x3F, 0x63, + 0xCB, 0x8D, 0xDB, 0x76, 0xD2, 0x2A, 0x71, 0x25, 0x78, 0xB6, + 0xF5, 0xCF, 0x38, 0x51, 0x1C, 0x30, 0x0C, 0x06, 0x03, 0x55, + 0x1D, 0x13, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xFF, 0x30, + 0x1C, 0x06, 0x03, 0x55, 0x1D, 0x11, 0x04, 0x15, 0x30, 0x13, + 0x82, 0x0B, 0x65, 0x78, 0x61, 0x6D, 0x70, 0x6C, 0x65, 0x2E, + 0x63, 0x6F, 0x6D, 0x87, 0x04, 0x7F, 0x00, 0x00, 0x01, 0x30, + 0x0A, 0x06, 0x08, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x04, 0x03, + 0x02, 0x03, 0x48, 0x00, 0x30, 0x45, 0x02, 0x21, 0x00, 0x9D, + 0x66, 0xD9, 0x5E, 0xEA, 0x33, 0x82, 0x61, 0x20, 0x17, 0xFA, + 0x3E, 0x55, 0xC5, 0xE1, 0x45, 0xFC, 0x64, 0x8C, 0x9D, 0x57, + 0x06, 0x77, 0x16, 0x6C, 0xC8, 0x04, 0xA6, 0x3A, 0x9E, 0xB1, + 0x61, 0x02, 0x20, 0x05, 0xB9, 0xC0, 0x2B, 0x6B, 0x21, 0x0E, + 0x45, 0x6B, 0x2D, 0xB4, 0x15, 0x62, 0x80, 0x28, 0x2A, 0xF1, + 0xB3, 0xE0, 0x4D, 0xD2, 0x68, 0xAE, 0x8A, 0x4E, 0x2E, 0x5B, + 0x83, 0xE2, 0x3D, 0x04, 0xB1 }; static const int sizeof_cliecc_cert_der_256 = sizeof(cliecc_cert_der_256); @@ -3411,94 +3449,100 @@ static const int sizeof_ecc_key_pub_der_256 = sizeof(ecc_key_pub_der_256); /* ./certs/server-ecc-comp.der, ECC */ static const unsigned char serv_ecc_comp_der_256[] = { - 0x30, 0x82, 0x03, 0x23, 0x30, 0x82, 0x02, 0xCA, 0xA0, 0x03, - 0x02, 0x01, 0x02, 0x02, 0x09, 0x00, 0x80, 0x78, 0xC9, 0xB7, - 0x06, 0x5A, 0xC5, 0x83, 0x30, 0x0A, 0x06, 0x08, 0x2A, 0x86, - 0x48, 0xCE, 0x3D, 0x04, 0x03, 0x02, 0x30, 0x81, 0xA0, 0x31, - 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, - 0x55, 0x53, 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, - 0x08, 0x0C, 0x07, 0x4D, 0x6F, 0x6E, 0x74, 0x61, 0x6E, 0x61, - 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0C, - 0x07, 0x42, 0x6F, 0x7A, 0x65, 0x6D, 0x61, 0x6E, 0x31, 0x18, - 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, 0x0A, 0x0C, 0x0F, 0x45, - 0x6C, 0x6C, 0x69, 0x70, 0x74, 0x69, 0x63, 0x20, 0x2D, 0x20, - 0x63, 0x6F, 0x6D, 0x70, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, - 0x55, 0x04, 0x0B, 0x0C, 0x0F, 0x53, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x20, 0x45, 0x43, 0x43, 0x2D, 0x63, 0x6F, 0x6D, 0x70, - 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0C, - 0x0F, 0x77, 0x77, 0x77, 0x2E, 0x77, 0x6F, 0x6C, 0x66, 0x73, - 0x73, 0x6C, 0x2E, 0x63, 0x6F, 0x6D, 0x31, 0x1F, 0x30, 0x1D, - 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, - 0x01, 0x16, 0x10, 0x69, 0x6E, 0x66, 0x6F, 0x40, 0x77, 0x6F, - 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, 0x6D, 0x30, - 0x1E, 0x17, 0x0D, 0x31, 0x38, 0x30, 0x34, 0x31, 0x33, 0x31, - 0x35, 0x32, 0x33, 0x31, 0x30, 0x5A, 0x17, 0x0D, 0x32, 0x31, - 0x30, 0x31, 0x30, 0x37, 0x31, 0x35, 0x32, 0x33, 0x31, 0x30, - 0x5A, 0x30, 0x81, 0xA0, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, - 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x10, 0x30, - 0x0E, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0C, 0x07, 0x4D, 0x6F, - 0x6E, 0x74, 0x61, 0x6E, 0x61, 0x31, 0x10, 0x30, 0x0E, 0x06, - 0x03, 0x55, 0x04, 0x07, 0x0C, 0x07, 0x42, 0x6F, 0x7A, 0x65, - 0x6D, 0x61, 0x6E, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, 0x55, - 0x04, 0x0A, 0x0C, 0x0F, 0x45, 0x6C, 0x6C, 0x69, 0x70, 0x74, - 0x69, 0x63, 0x20, 0x2D, 0x20, 0x63, 0x6F, 0x6D, 0x70, 0x31, - 0x18, 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x0C, 0x0F, - 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x45, 0x43, 0x43, - 0x2D, 0x63, 0x6F, 0x6D, 0x70, 0x31, 0x18, 0x30, 0x16, 0x06, - 0x03, 0x55, 0x04, 0x03, 0x0C, 0x0F, 0x77, 0x77, 0x77, 0x2E, - 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, - 0x6D, 0x31, 0x1F, 0x30, 0x1D, 0x06, 0x09, 0x2A, 0x86, 0x48, - 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x01, 0x16, 0x10, 0x69, 0x6E, - 0x66, 0x6F, 0x40, 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, - 0x2E, 0x63, 0x6F, 0x6D, 0x30, 0x39, 0x30, 0x13, 0x06, 0x07, - 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x02, 0x01, 0x06, 0x08, 0x2A, - 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x01, 0x07, 0x03, 0x22, 0x00, - 0x02, 0xBB, 0x33, 0xAC, 0x4C, 0x27, 0x50, 0x4A, 0xC6, 0x4A, - 0xA5, 0x04, 0xC3, 0x3C, 0xDE, 0x9F, 0x36, 0xDB, 0x72, 0x2D, - 0xCE, 0x94, 0xEA, 0x2B, 0xFA, 0xCB, 0x20, 0x09, 0x39, 0x2C, - 0x16, 0xE8, 0x61, 0xA3, 0x82, 0x01, 0x09, 0x30, 0x82, 0x01, - 0x05, 0x30, 0x1D, 0x06, 0x03, 0x55, 0x1D, 0x0E, 0x04, 0x16, - 0x04, 0x14, 0x8C, 0x38, 0x3A, 0x6B, 0xB8, 0x24, 0xB7, 0xDF, - 0x6E, 0xF4, 0x59, 0xAC, 0x56, 0x4E, 0xAA, 0xE2, 0x58, 0xA6, - 0x5A, 0x18, 0x30, 0x81, 0xD5, 0x06, 0x03, 0x55, 0x1D, 0x23, - 0x04, 0x81, 0xCD, 0x30, 0x81, 0xCA, 0x80, 0x14, 0x8C, 0x38, - 0x3A, 0x6B, 0xB8, 0x24, 0xB7, 0xDF, 0x6E, 0xF4, 0x59, 0xAC, - 0x56, 0x4E, 0xAA, 0xE2, 0x58, 0xA6, 0x5A, 0x18, 0xA1, 0x81, - 0xA6, 0xA4, 0x81, 0xA3, 0x30, 0x81, 0xA0, 0x31, 0x0B, 0x30, - 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, - 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0C, - 0x07, 0x4D, 0x6F, 0x6E, 0x74, 0x61, 0x6E, 0x61, 0x31, 0x10, - 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0C, 0x07, 0x42, - 0x6F, 0x7A, 0x65, 0x6D, 0x61, 0x6E, 0x31, 0x18, 0x30, 0x16, - 0x06, 0x03, 0x55, 0x04, 0x0A, 0x0C, 0x0F, 0x45, 0x6C, 0x6C, - 0x69, 0x70, 0x74, 0x69, 0x63, 0x20, 0x2D, 0x20, 0x63, 0x6F, - 0x6D, 0x70, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, - 0x0B, 0x0C, 0x0F, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, - 0x45, 0x43, 0x43, 0x2D, 0x63, 0x6F, 0x6D, 0x70, 0x31, 0x18, - 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0C, 0x0F, 0x77, - 0x77, 0x77, 0x2E, 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, - 0x2E, 0x63, 0x6F, 0x6D, 0x31, 0x1F, 0x30, 0x1D, 0x06, 0x09, - 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x01, 0x16, - 0x10, 0x69, 0x6E, 0x66, 0x6F, 0x40, 0x77, 0x6F, 0x6C, 0x66, - 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, 0x6D, 0x82, 0x09, 0x00, - 0x80, 0x78, 0xC9, 0xB7, 0x06, 0x5A, 0xC5, 0x83, 0x30, 0x0C, - 0x06, 0x03, 0x55, 0x1D, 0x13, 0x04, 0x05, 0x30, 0x03, 0x01, - 0x01, 0xFF, 0x30, 0x0A, 0x06, 0x08, 0x2A, 0x86, 0x48, 0xCE, - 0x3D, 0x04, 0x03, 0x02, 0x03, 0x47, 0x00, 0x30, 0x44, 0x02, - 0x20, 0x31, 0x44, 0xD0, 0x4E, 0xD7, 0xC4, 0xB4, 0x96, 0xA3, - 0xE6, 0x25, 0xFD, 0xFA, 0xD6, 0x28, 0xA8, 0x67, 0x51, 0x72, - 0x90, 0x95, 0x31, 0xF9, 0xCD, 0x10, 0xBF, 0x11, 0xE4, 0xEC, - 0xB7, 0x42, 0x5B, 0x02, 0x20, 0x45, 0xDB, 0x45, 0x0A, 0x24, - 0x58, 0x8E, 0x2E, 0xE6, 0xEA, 0x0C, 0x6C, 0xBC, 0x72, 0x4F, - 0x0A, 0x1B, 0xF3, 0x2D, 0x97, 0xE9, 0xC2, 0x19, 0xF9, 0x97, - 0x3A, 0x60, 0xDD, 0x08, 0xD3, 0x52, 0x3E + 0x30, 0x82, 0x03, 0x59, 0x30, 0x82, 0x02, 0xFE, 0xA0, 0x03, + 0x02, 0x01, 0x02, 0x02, 0x14, 0x77, 0xA6, 0x80, 0xBD, 0x59, + 0xF9, 0xDE, 0xEC, 0x58, 0x65, 0x07, 0x32, 0xDD, 0xE9, 0xE9, + 0x7B, 0xA1, 0xC1, 0x06, 0xF4, 0x30, 0x0A, 0x06, 0x08, 0x2A, + 0x86, 0x48, 0xCE, 0x3D, 0x04, 0x03, 0x02, 0x30, 0x81, 0xA0, + 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, + 0x02, 0x55, 0x53, 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, + 0x04, 0x08, 0x0C, 0x07, 0x4D, 0x6F, 0x6E, 0x74, 0x61, 0x6E, + 0x61, 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x07, + 0x0C, 0x07, 0x42, 0x6F, 0x7A, 0x65, 0x6D, 0x61, 0x6E, 0x31, + 0x18, 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, 0x0A, 0x0C, 0x0F, + 0x45, 0x6C, 0x6C, 0x69, 0x70, 0x74, 0x69, 0x63, 0x20, 0x2D, + 0x20, 0x63, 0x6F, 0x6D, 0x70, 0x31, 0x18, 0x30, 0x16, 0x06, + 0x03, 0x55, 0x04, 0x0B, 0x0C, 0x0F, 0x53, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x20, 0x45, 0x43, 0x43, 0x2D, 0x63, 0x6F, 0x6D, + 0x70, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, 0x03, + 0x0C, 0x0F, 0x77, 0x77, 0x77, 0x2E, 0x77, 0x6F, 0x6C, 0x66, + 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, 0x6D, 0x31, 0x1F, 0x30, + 0x1D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, + 0x09, 0x01, 0x16, 0x10, 0x69, 0x6E, 0x66, 0x6F, 0x40, 0x77, + 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, 0x6D, + 0x30, 0x1E, 0x17, 0x0D, 0x32, 0x30, 0x30, 0x35, 0x30, 0x37, + 0x30, 0x37, 0x33, 0x39, 0x30, 0x34, 0x5A, 0x17, 0x0D, 0x32, + 0x33, 0x30, 0x32, 0x30, 0x31, 0x30, 0x37, 0x33, 0x39, 0x30, + 0x34, 0x5A, 0x30, 0x81, 0xA0, 0x31, 0x0B, 0x30, 0x09, 0x06, + 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x10, + 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0C, 0x07, 0x4D, + 0x6F, 0x6E, 0x74, 0x61, 0x6E, 0x61, 0x31, 0x10, 0x30, 0x0E, + 0x06, 0x03, 0x55, 0x04, 0x07, 0x0C, 0x07, 0x42, 0x6F, 0x7A, + 0x65, 0x6D, 0x61, 0x6E, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, + 0x55, 0x04, 0x0A, 0x0C, 0x0F, 0x45, 0x6C, 0x6C, 0x69, 0x70, + 0x74, 0x69, 0x63, 0x20, 0x2D, 0x20, 0x63, 0x6F, 0x6D, 0x70, + 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x0C, + 0x0F, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x45, 0x43, + 0x43, 0x2D, 0x63, 0x6F, 0x6D, 0x70, 0x31, 0x18, 0x30, 0x16, + 0x06, 0x03, 0x55, 0x04, 0x03, 0x0C, 0x0F, 0x77, 0x77, 0x77, + 0x2E, 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, + 0x6F, 0x6D, 0x31, 0x1F, 0x30, 0x1D, 0x06, 0x09, 0x2A, 0x86, + 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x01, 0x16, 0x10, 0x69, + 0x6E, 0x66, 0x6F, 0x40, 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, + 0x6C, 0x2E, 0x63, 0x6F, 0x6D, 0x30, 0x39, 0x30, 0x13, 0x06, + 0x07, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x02, 0x01, 0x06, 0x08, + 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x01, 0x07, 0x03, 0x22, + 0x00, 0x02, 0xBB, 0x33, 0xAC, 0x4C, 0x27, 0x50, 0x4A, 0xC6, + 0x4A, 0xA5, 0x04, 0xC3, 0x3C, 0xDE, 0x9F, 0x36, 0xDB, 0x72, + 0x2D, 0xCE, 0x94, 0xEA, 0x2B, 0xFA, 0xCB, 0x20, 0x09, 0x39, + 0x2C, 0x16, 0xE8, 0x61, 0xA3, 0x82, 0x01, 0x32, 0x30, 0x82, + 0x01, 0x2E, 0x30, 0x1D, 0x06, 0x03, 0x55, 0x1D, 0x0E, 0x04, + 0x16, 0x04, 0x14, 0x8C, 0x38, 0x3A, 0x6B, 0xB8, 0x24, 0xB7, + 0xDF, 0x6E, 0xF4, 0x59, 0xAC, 0x56, 0x4E, 0xAA, 0xE2, 0x58, + 0xA6, 0x5A, 0x18, 0x30, 0x81, 0xE0, 0x06, 0x03, 0x55, 0x1D, + 0x23, 0x04, 0x81, 0xD8, 0x30, 0x81, 0xD5, 0x80, 0x14, 0x8C, + 0x38, 0x3A, 0x6B, 0xB8, 0x24, 0xB7, 0xDF, 0x6E, 0xF4, 0x59, + 0xAC, 0x56, 0x4E, 0xAA, 0xE2, 0x58, 0xA6, 0x5A, 0x18, 0xA1, + 0x81, 0xA6, 0xA4, 0x81, 0xA3, 0x30, 0x81, 0xA0, 0x31, 0x0B, + 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, + 0x53, 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x08, + 0x0C, 0x07, 0x4D, 0x6F, 0x6E, 0x74, 0x61, 0x6E, 0x61, 0x31, + 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0C, 0x07, + 0x42, 0x6F, 0x7A, 0x65, 0x6D, 0x61, 0x6E, 0x31, 0x18, 0x30, + 0x16, 0x06, 0x03, 0x55, 0x04, 0x0A, 0x0C, 0x0F, 0x45, 0x6C, + 0x6C, 0x69, 0x70, 0x74, 0x69, 0x63, 0x20, 0x2D, 0x20, 0x63, + 0x6F, 0x6D, 0x70, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, 0x55, + 0x04, 0x0B, 0x0C, 0x0F, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x20, 0x45, 0x43, 0x43, 0x2D, 0x63, 0x6F, 0x6D, 0x70, 0x31, + 0x18, 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0C, 0x0F, + 0x77, 0x77, 0x77, 0x2E, 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, + 0x6C, 0x2E, 0x63, 0x6F, 0x6D, 0x31, 0x1F, 0x30, 0x1D, 0x06, + 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x01, + 0x16, 0x10, 0x69, 0x6E, 0x66, 0x6F, 0x40, 0x77, 0x6F, 0x6C, + 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, 0x6D, 0x82, 0x14, + 0x77, 0xA6, 0x80, 0xBD, 0x59, 0xF9, 0xDE, 0xEC, 0x58, 0x65, + 0x07, 0x32, 0xDD, 0xE9, 0xE9, 0x7B, 0xA1, 0xC1, 0x06, 0xF4, + 0x30, 0x0C, 0x06, 0x03, 0x55, 0x1D, 0x13, 0x04, 0x05, 0x30, + 0x03, 0x01, 0x01, 0xFF, 0x30, 0x1C, 0x06, 0x03, 0x55, 0x1D, + 0x11, 0x04, 0x15, 0x30, 0x13, 0x82, 0x0B, 0x65, 0x78, 0x61, + 0x6D, 0x70, 0x6C, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x87, 0x04, + 0x7F, 0x00, 0x00, 0x01, 0x30, 0x0A, 0x06, 0x08, 0x2A, 0x86, + 0x48, 0xCE, 0x3D, 0x04, 0x03, 0x02, 0x03, 0x49, 0x00, 0x30, + 0x46, 0x02, 0x21, 0x00, 0xF2, 0xC6, 0xCB, 0x05, 0x2A, 0xFC, + 0x73, 0xCE, 0x9C, 0xF1, 0x59, 0x27, 0xDC, 0x52, 0x44, 0x19, + 0x77, 0xAD, 0x97, 0x7B, 0x73, 0x39, 0x25, 0xE7, 0x91, 0x9D, + 0x99, 0xB4, 0x17, 0xC8, 0x34, 0xA2, 0x02, 0x21, 0x00, 0xA4, + 0xF4, 0xCD, 0xAE, 0x04, 0x2C, 0xBE, 0xE9, 0xC9, 0x56, 0xBE, + 0x54, 0x7B, 0xE5, 0x52, 0x2A, 0x88, 0x39, 0x88, 0xA1, 0xE9, + 0xF2, 0x84, 0x31, 0xB0, 0x40, 0x92, 0x2A, 0x54, 0x5B, 0x53, + 0xEC }; static const int sizeof_serv_ecc_comp_der_256 = sizeof(serv_ecc_comp_der_256); /* ./certs/server-ecc-rsa.der, ECC */ static const unsigned char serv_ecc_rsa_der_256[] = { - 0x30, 0x82, 0x03, 0xE0, 0x30, 0x82, 0x02, 0xC8, 0xA0, 0x03, + 0x30, 0x82, 0x04, 0x0B, 0x30, 0x82, 0x02, 0xF3, 0xA0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x01, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0B, 0x05, 0x00, 0x30, 0x81, 0x94, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, @@ -3516,10 +3560,10 @@ static const unsigned char serv_ecc_rsa_der_256[] = 0x1F, 0x30, 0x1D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x01, 0x16, 0x10, 0x69, 0x6E, 0x66, 0x6F, 0x40, 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, - 0x6F, 0x6D, 0x30, 0x1E, 0x17, 0x0D, 0x31, 0x38, 0x30, 0x34, - 0x31, 0x33, 0x31, 0x35, 0x32, 0x33, 0x31, 0x30, 0x5A, 0x17, - 0x0D, 0x32, 0x31, 0x30, 0x31, 0x30, 0x37, 0x31, 0x35, 0x32, - 0x33, 0x31, 0x30, 0x5A, 0x30, 0x81, 0x9D, 0x31, 0x0B, 0x30, + 0x6F, 0x6D, 0x30, 0x1E, 0x17, 0x0D, 0x32, 0x30, 0x30, 0x35, + 0x30, 0x37, 0x30, 0x37, 0x33, 0x39, 0x30, 0x34, 0x5A, 0x17, + 0x0D, 0x32, 0x33, 0x30, 0x32, 0x30, 0x31, 0x30, 0x37, 0x33, + 0x39, 0x30, 0x34, 0x5A, 0x30, 0x81, 0x9D, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0C, 0x07, 0x4D, 0x6F, 0x6E, 0x74, 0x61, 0x6E, 0x61, 0x31, 0x10, @@ -3544,152 +3588,138 @@ static const unsigned char serv_ecc_rsa_der_256[] = 0x16, 0xE8, 0x61, 0x02, 0xE9, 0xAF, 0x4D, 0xD3, 0x02, 0x93, 0x9A, 0x31, 0x5B, 0x97, 0x92, 0x21, 0x7F, 0xF0, 0xCF, 0x18, 0xDA, 0x91, 0x11, 0x02, 0x34, 0x86, 0xE8, 0x20, 0x58, 0x33, - 0x0B, 0x80, 0x34, 0x89, 0xD8, 0xA3, 0x81, 0xFC, 0x30, 0x81, - 0xF9, 0x30, 0x1D, 0x06, 0x03, 0x55, 0x1D, 0x0E, 0x04, 0x16, - 0x04, 0x14, 0x5D, 0x5D, 0x26, 0xEF, 0xAC, 0x7E, 0x36, 0xF9, - 0x9B, 0x76, 0x15, 0x2B, 0x4A, 0x25, 0x02, 0x23, 0xEF, 0xB2, - 0x89, 0x30, 0x30, 0x81, 0xC9, 0x06, 0x03, 0x55, 0x1D, 0x23, - 0x04, 0x81, 0xC1, 0x30, 0x81, 0xBE, 0x80, 0x14, 0x27, 0x8E, - 0x67, 0x11, 0x74, 0xC3, 0x26, 0x1D, 0x3F, 0xED, 0x33, 0x63, - 0xB3, 0xA4, 0xD8, 0x1D, 0x30, 0xE5, 0xE8, 0xD5, 0xA1, 0x81, - 0x9A, 0xA4, 0x81, 0x97, 0x30, 0x81, 0x94, 0x31, 0x0B, 0x30, - 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, - 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0C, - 0x07, 0x4D, 0x6F, 0x6E, 0x74, 0x61, 0x6E, 0x61, 0x31, 0x10, - 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0C, 0x07, 0x42, - 0x6F, 0x7A, 0x65, 0x6D, 0x61, 0x6E, 0x31, 0x11, 0x30, 0x0F, - 0x06, 0x03, 0x55, 0x04, 0x0A, 0x0C, 0x08, 0x53, 0x61, 0x77, - 0x74, 0x6F, 0x6F, 0x74, 0x68, 0x31, 0x13, 0x30, 0x11, 0x06, - 0x03, 0x55, 0x04, 0x0B, 0x0C, 0x0A, 0x43, 0x6F, 0x6E, 0x73, - 0x75, 0x6C, 0x74, 0x69, 0x6E, 0x67, 0x31, 0x18, 0x30, 0x16, - 0x06, 0x03, 0x55, 0x04, 0x03, 0x0C, 0x0F, 0x77, 0x77, 0x77, - 0x2E, 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, - 0x6F, 0x6D, 0x31, 0x1F, 0x30, 0x1D, 0x06, 0x09, 0x2A, 0x86, - 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x01, 0x16, 0x10, 0x69, - 0x6E, 0x66, 0x6F, 0x40, 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, - 0x6C, 0x2E, 0x63, 0x6F, 0x6D, 0x82, 0x09, 0x00, 0x86, 0xFF, - 0xF5, 0x8E, 0x10, 0xDE, 0xB8, 0xFB, 0x30, 0x0C, 0x06, 0x03, - 0x55, 0x1D, 0x13, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xFF, - 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, - 0x01, 0x01, 0x0B, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, - 0x0C, 0xBB, 0x67, 0xBD, 0xFC, 0xCD, 0x53, 0x6C, 0xFB, 0x4E, - 0x58, 0xC8, 0xEA, 0x52, 0x92, 0xEB, 0xE4, 0xC8, 0xBC, 0x57, - 0x0F, 0x08, 0x20, 0xC8, 0x83, 0xB0, 0xD5, 0xEA, 0x57, 0x27, - 0xBD, 0x68, 0x91, 0xFB, 0x99, 0x84, 0x8D, 0x15, 0x9E, 0x4F, - 0x8F, 0xC4, 0xCB, 0x34, 0x61, 0xC0, 0x59, 0x12, 0x9B, 0xC8, - 0x82, 0x17, 0x38, 0x4F, 0x9E, 0x53, 0x08, 0xA3, 0x69, 0x2E, - 0x2F, 0xC0, 0xB4, 0x2F, 0xA2, 0x4E, 0x10, 0x64, 0xB0, 0x07, - 0xA1, 0x51, 0x08, 0x1D, 0x91, 0x53, 0xA2, 0x79, 0x55, 0x20, - 0x41, 0x65, 0x35, 0x3E, 0x0B, 0x38, 0x01, 0x57, 0x02, 0x8C, - 0x25, 0xE7, 0xAB, 0x4F, 0x8B, 0x59, 0xF0, 0xED, 0x8E, 0x4A, - 0x15, 0x0B, 0x32, 0xFB, 0x7A, 0x8B, 0x02, 0xEA, 0x9D, 0xE1, - 0xAB, 0xC4, 0x07, 0xCC, 0xDA, 0x0F, 0xA3, 0x16, 0xDB, 0x8E, - 0x5B, 0xBC, 0x96, 0xAB, 0x10, 0xB8, 0xDE, 0x09, 0x8B, 0xF7, - 0xCB, 0xA7, 0x78, 0x66, 0x17, 0xE3, 0x25, 0x6E, 0x57, 0x9D, - 0x13, 0x61, 0x7B, 0x55, 0x1A, 0xDF, 0x8F, 0x39, 0x15, 0x4E, - 0x42, 0x22, 0x00, 0x85, 0xC4, 0x51, 0x0B, 0x6B, 0xA6, 0x67, - 0xC0, 0xFB, 0xEA, 0x22, 0x77, 0x7D, 0x48, 0x76, 0xAB, 0x39, - 0x20, 0x09, 0xD5, 0x52, 0x89, 0x3E, 0x6B, 0x30, 0x7B, 0x50, - 0x18, 0xE8, 0x62, 0x05, 0xBE, 0xBB, 0x7F, 0x16, 0x77, 0x9C, - 0xBB, 0x5A, 0x22, 0x96, 0x99, 0xB0, 0x96, 0x83, 0xB7, 0x43, - 0x31, 0x97, 0xCF, 0xFD, 0x85, 0x52, 0xD8, 0x52, 0xC8, 0x67, - 0x5C, 0xF8, 0x22, 0x72, 0x35, 0x93, 0x92, 0x6C, 0xEC, 0x3C, - 0x6A, 0xC6, 0x81, 0x20, 0xA5, 0xCD, 0x50, 0xF9, 0x21, 0x7A, - 0xA6, 0x7A, 0x1E, 0xE7, 0x59, 0x22, 0x5D, 0x8A, 0x93, 0x51, - 0x8E, 0xFB, 0x29, 0x56, 0xFB, 0xBE, 0x9B, 0x87, 0x48, 0x5F, - 0xA5, 0x72, 0xE7, 0x4E, 0xFE, 0x5E + 0x0B, 0x80, 0x34, 0x89, 0xD8, 0xA3, 0x82, 0x01, 0x26, 0x30, + 0x82, 0x01, 0x22, 0x30, 0x1D, 0x06, 0x03, 0x55, 0x1D, 0x0E, + 0x04, 0x16, 0x04, 0x14, 0x5D, 0x5D, 0x26, 0xEF, 0xAC, 0x7E, + 0x36, 0xF9, 0x9B, 0x76, 0x15, 0x2B, 0x4A, 0x25, 0x02, 0x23, + 0xEF, 0xB2, 0x89, 0x30, 0x30, 0x81, 0xD4, 0x06, 0x03, 0x55, + 0x1D, 0x23, 0x04, 0x81, 0xCC, 0x30, 0x81, 0xC9, 0x80, 0x14, + 0x27, 0x8E, 0x67, 0x11, 0x74, 0xC3, 0x26, 0x1D, 0x3F, 0xED, + 0x33, 0x63, 0xB3, 0xA4, 0xD8, 0x1D, 0x30, 0xE5, 0xE8, 0xD5, + 0xA1, 0x81, 0x9A, 0xA4, 0x81, 0x97, 0x30, 0x81, 0x94, 0x31, + 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, + 0x55, 0x53, 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, + 0x08, 0x0C, 0x07, 0x4D, 0x6F, 0x6E, 0x74, 0x61, 0x6E, 0x61, + 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0C, + 0x07, 0x42, 0x6F, 0x7A, 0x65, 0x6D, 0x61, 0x6E, 0x31, 0x11, + 0x30, 0x0F, 0x06, 0x03, 0x55, 0x04, 0x0A, 0x0C, 0x08, 0x53, + 0x61, 0x77, 0x74, 0x6F, 0x6F, 0x74, 0x68, 0x31, 0x13, 0x30, + 0x11, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x0C, 0x0A, 0x43, 0x6F, + 0x6E, 0x73, 0x75, 0x6C, 0x74, 0x69, 0x6E, 0x67, 0x31, 0x18, + 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0C, 0x0F, 0x77, + 0x77, 0x77, 0x2E, 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, + 0x2E, 0x63, 0x6F, 0x6D, 0x31, 0x1F, 0x30, 0x1D, 0x06, 0x09, + 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x01, 0x16, + 0x10, 0x69, 0x6E, 0x66, 0x6F, 0x40, 0x77, 0x6F, 0x6C, 0x66, + 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, 0x6D, 0x82, 0x14, 0x3F, + 0x32, 0x13, 0x52, 0x92, 0xC6, 0xDF, 0x4A, 0xD5, 0x42, 0x05, + 0x6C, 0xB0, 0xB2, 0x2E, 0x46, 0xC2, 0xF8, 0xB8, 0x67, 0x30, + 0x0C, 0x06, 0x03, 0x55, 0x1D, 0x13, 0x04, 0x05, 0x30, 0x03, + 0x01, 0x01, 0xFF, 0x30, 0x1C, 0x06, 0x03, 0x55, 0x1D, 0x11, + 0x04, 0x15, 0x30, 0x13, 0x82, 0x0B, 0x65, 0x78, 0x61, 0x6D, + 0x70, 0x6C, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x87, 0x04, 0x7F, + 0x00, 0x00, 0x01, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, + 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0B, 0x05, 0x00, 0x03, 0x82, + 0x01, 0x01, 0x00, 0x76, 0x70, 0x55, 0xEA, 0xCD, 0x57, 0xD3, + 0xA6, 0x32, 0x44, 0xF8, 0x77, 0x90, 0x0F, 0xDA, 0x5C, 0x86, + 0xCE, 0xBD, 0x6E, 0xA2, 0x52, 0x22, 0x51, 0xE9, 0x91, 0xE6, + 0x0B, 0x76, 0x8E, 0x51, 0x8A, 0x09, 0x26, 0x2A, 0xC9, 0x18, + 0xD1, 0x3B, 0xC1, 0x37, 0x14, 0x6C, 0x00, 0x0A, 0xD0, 0x49, + 0x03, 0xD8, 0xED, 0x91, 0xD6, 0xE9, 0xC7, 0xE4, 0x62, 0xC3, + 0x10, 0x8F, 0xE5, 0x34, 0xA2, 0xBF, 0xA2, 0xEB, 0x5A, 0x18, + 0xA2, 0x56, 0x37, 0x94, 0xA4, 0x1E, 0x94, 0x67, 0x86, 0x55, + 0x11, 0x08, 0x5B, 0xC1, 0xB1, 0xDA, 0x3F, 0xA3, 0x21, 0xAF, + 0x94, 0xA6, 0x64, 0x90, 0x48, 0x07, 0xA8, 0x7B, 0x73, 0x5B, + 0xB1, 0x81, 0x38, 0x7E, 0x36, 0x9E, 0x4E, 0x7D, 0x64, 0x60, + 0xC1, 0x19, 0x63, 0xDB, 0x96, 0x97, 0x3B, 0x63, 0x86, 0xD1, + 0x0C, 0x2B, 0x6C, 0xEF, 0xC6, 0x44, 0xEC, 0xDF, 0x3F, 0xA1, + 0x8C, 0xC5, 0xD7, 0xE6, 0x4A, 0xA3, 0xBC, 0xDD, 0x85, 0xD5, + 0xB1, 0xD1, 0x8B, 0x55, 0xA1, 0xA4, 0xC5, 0xFD, 0x46, 0xF1, + 0xF8, 0x19, 0x1E, 0x92, 0xF5, 0x19, 0xEA, 0xEC, 0x3C, 0x9B, + 0x93, 0xAE, 0x59, 0x20, 0x89, 0xB6, 0xC4, 0x39, 0x9D, 0xCC, + 0x89, 0xF5, 0xE1, 0xD5, 0x69, 0x00, 0xCE, 0x62, 0x0B, 0x0F, + 0x32, 0x41, 0x54, 0x58, 0xAC, 0xD5, 0x20, 0x51, 0x92, 0x50, + 0x27, 0x43, 0x64, 0xDA, 0xEC, 0x2E, 0x5A, 0x7D, 0x23, 0xB2, + 0x25, 0x43, 0x73, 0x72, 0x81, 0x1E, 0x87, 0x57, 0x0F, 0x29, + 0x09, 0xD3, 0xCA, 0xA0, 0x0E, 0xCD, 0x8E, 0x93, 0x95, 0x50, + 0xF7, 0x2D, 0x21, 0x56, 0x8F, 0x45, 0x02, 0xAE, 0x8B, 0x3E, + 0x3F, 0x7D, 0xBE, 0xC8, 0xD6, 0x85, 0xB5, 0xD6, 0x65, 0x89, + 0xDD, 0xD9, 0xA9, 0x63, 0x60, 0x9A, 0xB1, 0xB6, 0x3B, 0xAB, + 0x62, 0x90, 0x16, 0x8B, 0x95, 0x49, 0xB9, 0xE5, 0x96 }; static const int sizeof_serv_ecc_rsa_der_256 = sizeof(serv_ecc_rsa_der_256); /* ./certs/server-ecc.der, ECC */ static const unsigned char serv_ecc_der_256[] = { - 0x30, 0x82, 0x03, 0x50, 0x30, 0x82, 0x02, 0xF5, 0xA0, 0x03, - 0x02, 0x01, 0x02, 0x02, 0x02, 0x10, 0x00, 0x30, 0x0A, 0x06, - 0x08, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x04, 0x03, 0x02, 0x30, - 0x81, 0x97, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, - 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, - 0x03, 0x55, 0x04, 0x08, 0x0C, 0x0A, 0x57, 0x61, 0x73, 0x68, - 0x69, 0x6E, 0x67, 0x74, 0x6F, 0x6E, 0x31, 0x10, 0x30, 0x0E, - 0x06, 0x03, 0x55, 0x04, 0x07, 0x0C, 0x07, 0x53, 0x65, 0x61, - 0x74, 0x74, 0x6C, 0x65, 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, - 0x55, 0x04, 0x0A, 0x0C, 0x07, 0x77, 0x6F, 0x6C, 0x66, 0x53, - 0x53, 0x4C, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, - 0x0B, 0x0C, 0x0B, 0x44, 0x65, 0x76, 0x65, 0x6C, 0x6F, 0x70, - 0x6D, 0x65, 0x6E, 0x74, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, - 0x55, 0x04, 0x03, 0x0C, 0x0F, 0x77, 0x77, 0x77, 0x2E, 0x77, + 0x30, 0x82, 0x02, 0xA1, 0x30, 0x82, 0x02, 0x47, 0xA0, 0x03, + 0x02, 0x01, 0x02, 0x02, 0x01, 0x03, 0x30, 0x0A, 0x06, 0x08, + 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x04, 0x03, 0x02, 0x30, 0x81, + 0x97, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, + 0x13, 0x02, 0x55, 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, + 0x55, 0x04, 0x08, 0x0C, 0x0A, 0x57, 0x61, 0x73, 0x68, 0x69, + 0x6E, 0x67, 0x74, 0x6F, 0x6E, 0x31, 0x10, 0x30, 0x0E, 0x06, + 0x03, 0x55, 0x04, 0x07, 0x0C, 0x07, 0x53, 0x65, 0x61, 0x74, + 0x74, 0x6C, 0x65, 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, + 0x04, 0x0A, 0x0C, 0x07, 0x77, 0x6F, 0x6C, 0x66, 0x53, 0x53, + 0x4C, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0B, + 0x0C, 0x0B, 0x44, 0x65, 0x76, 0x65, 0x6C, 0x6F, 0x70, 0x6D, + 0x65, 0x6E, 0x74, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, 0x55, + 0x04, 0x03, 0x0C, 0x0F, 0x77, 0x77, 0x77, 0x2E, 0x77, 0x6F, + 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, 0x6D, 0x31, + 0x1F, 0x30, 0x1D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, + 0x0D, 0x01, 0x09, 0x01, 0x16, 0x10, 0x69, 0x6E, 0x66, 0x6F, + 0x40, 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, + 0x6F, 0x6D, 0x30, 0x1E, 0x17, 0x0D, 0x32, 0x30, 0x30, 0x35, + 0x30, 0x37, 0x30, 0x37, 0x33, 0x39, 0x30, 0x34, 0x5A, 0x17, + 0x0D, 0x32, 0x33, 0x30, 0x32, 0x30, 0x31, 0x30, 0x37, 0x33, + 0x39, 0x30, 0x34, 0x5A, 0x30, 0x81, 0x8F, 0x31, 0x0B, 0x30, + 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, + 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0C, + 0x0A, 0x57, 0x61, 0x73, 0x68, 0x69, 0x6E, 0x67, 0x74, 0x6F, + 0x6E, 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x07, + 0x0C, 0x07, 0x53, 0x65, 0x61, 0x74, 0x74, 0x6C, 0x65, 0x31, + 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x0A, 0x0C, 0x07, + 0x45, 0x6C, 0x69, 0x70, 0x74, 0x69, 0x63, 0x31, 0x0C, 0x30, + 0x0A, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x0C, 0x03, 0x45, 0x43, + 0x43, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, 0x03, + 0x0C, 0x0F, 0x77, 0x77, 0x77, 0x2E, 0x77, 0x6F, 0x6C, 0x66, + 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, 0x6D, 0x31, 0x1F, 0x30, + 0x1D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, + 0x09, 0x01, 0x16, 0x10, 0x69, 0x6E, 0x66, 0x6F, 0x40, 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, 0x6D, - 0x31, 0x1F, 0x30, 0x1D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, - 0xF7, 0x0D, 0x01, 0x09, 0x01, 0x16, 0x10, 0x69, 0x6E, 0x66, - 0x6F, 0x40, 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, - 0x63, 0x6F, 0x6D, 0x30, 0x1E, 0x17, 0x0D, 0x31, 0x37, 0x31, - 0x30, 0x32, 0x30, 0x31, 0x38, 0x31, 0x39, 0x30, 0x36, 0x5A, - 0x17, 0x0D, 0x32, 0x37, 0x31, 0x30, 0x31, 0x38, 0x31, 0x38, - 0x31, 0x39, 0x30, 0x36, 0x5A, 0x30, 0x81, 0x8F, 0x31, 0x0B, - 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, - 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x08, - 0x0C, 0x0A, 0x57, 0x61, 0x73, 0x68, 0x69, 0x6E, 0x67, 0x74, - 0x6F, 0x6E, 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, - 0x07, 0x0C, 0x07, 0x53, 0x65, 0x61, 0x74, 0x74, 0x6C, 0x65, - 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x0A, 0x0C, - 0x07, 0x45, 0x6C, 0x69, 0x70, 0x74, 0x69, 0x63, 0x31, 0x0C, - 0x30, 0x0A, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x0C, 0x03, 0x45, - 0x43, 0x43, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, - 0x03, 0x0C, 0x0F, 0x77, 0x77, 0x77, 0x2E, 0x77, 0x6F, 0x6C, - 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, 0x6D, 0x31, 0x1F, - 0x30, 0x1D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, - 0x01, 0x09, 0x01, 0x16, 0x10, 0x69, 0x6E, 0x66, 0x6F, 0x40, - 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, - 0x6D, 0x30, 0x59, 0x30, 0x13, 0x06, 0x07, 0x2A, 0x86, 0x48, - 0xCE, 0x3D, 0x02, 0x01, 0x06, 0x08, 0x2A, 0x86, 0x48, 0xCE, - 0x3D, 0x03, 0x01, 0x07, 0x03, 0x42, 0x00, 0x04, 0xBB, 0x33, - 0xAC, 0x4C, 0x27, 0x50, 0x4A, 0xC6, 0x4A, 0xA5, 0x04, 0xC3, - 0x3C, 0xDE, 0x9F, 0x36, 0xDB, 0x72, 0x2D, 0xCE, 0x94, 0xEA, - 0x2B, 0xFA, 0xCB, 0x20, 0x09, 0x39, 0x2C, 0x16, 0xE8, 0x61, - 0x02, 0xE9, 0xAF, 0x4D, 0xD3, 0x02, 0x93, 0x9A, 0x31, 0x5B, - 0x97, 0x92, 0x21, 0x7F, 0xF0, 0xCF, 0x18, 0xDA, 0x91, 0x11, - 0x02, 0x34, 0x86, 0xE8, 0x20, 0x58, 0x33, 0x0B, 0x80, 0x34, - 0x89, 0xD8, 0xA3, 0x82, 0x01, 0x35, 0x30, 0x82, 0x01, 0x31, - 0x30, 0x09, 0x06, 0x03, 0x55, 0x1D, 0x13, 0x04, 0x02, 0x30, - 0x00, 0x30, 0x11, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x86, - 0xF8, 0x42, 0x01, 0x01, 0x04, 0x04, 0x03, 0x02, 0x06, 0x40, - 0x30, 0x1D, 0x06, 0x03, 0x55, 0x1D, 0x0E, 0x04, 0x16, 0x04, - 0x14, 0x5D, 0x5D, 0x26, 0xEF, 0xAC, 0x7E, 0x36, 0xF9, 0x9B, - 0x76, 0x15, 0x2B, 0x4A, 0x25, 0x02, 0x23, 0xEF, 0xB2, 0x89, - 0x30, 0x30, 0x81, 0xCC, 0x06, 0x03, 0x55, 0x1D, 0x23, 0x04, - 0x81, 0xC4, 0x30, 0x81, 0xC1, 0x80, 0x14, 0x56, 0x8E, 0x9A, - 0xC3, 0xF0, 0x42, 0xDE, 0x18, 0xB9, 0x45, 0x55, 0x6E, 0xF9, - 0x93, 0xCF, 0xEA, 0xC3, 0xF3, 0xA5, 0x21, 0xA1, 0x81, 0x9D, - 0xA4, 0x81, 0x9A, 0x30, 0x81, 0x97, 0x31, 0x0B, 0x30, 0x09, - 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, - 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0C, 0x0A, - 0x57, 0x61, 0x73, 0x68, 0x69, 0x6E, 0x67, 0x74, 0x6F, 0x6E, - 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0C, - 0x07, 0x53, 0x65, 0x61, 0x74, 0x74, 0x6C, 0x65, 0x31, 0x10, - 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x0A, 0x0C, 0x07, 0x77, - 0x6F, 0x6C, 0x66, 0x53, 0x53, 0x4C, 0x31, 0x14, 0x30, 0x12, - 0x06, 0x03, 0x55, 0x04, 0x0B, 0x0C, 0x0B, 0x44, 0x65, 0x76, - 0x65, 0x6C, 0x6F, 0x70, 0x6D, 0x65, 0x6E, 0x74, 0x31, 0x18, - 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0C, 0x0F, 0x77, - 0x77, 0x77, 0x2E, 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, - 0x2E, 0x63, 0x6F, 0x6D, 0x31, 0x1F, 0x30, 0x1D, 0x06, 0x09, - 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x01, 0x16, - 0x10, 0x69, 0x6E, 0x66, 0x6F, 0x40, 0x77, 0x6F, 0x6C, 0x66, - 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, 0x6D, 0x82, 0x09, 0x00, - 0x97, 0xB4, 0xBD, 0x16, 0x78, 0xF8, 0x47, 0xF2, 0x30, 0x0E, - 0x06, 0x03, 0x55, 0x1D, 0x0F, 0x01, 0x01, 0xFF, 0x04, 0x04, - 0x03, 0x02, 0x03, 0xA8, 0x30, 0x13, 0x06, 0x03, 0x55, 0x1D, - 0x25, 0x04, 0x0C, 0x30, 0x0A, 0x06, 0x08, 0x2B, 0x06, 0x01, - 0x05, 0x05, 0x07, 0x03, 0x01, 0x30, 0x0A, 0x06, 0x08, 0x2A, - 0x86, 0x48, 0xCE, 0x3D, 0x04, 0x03, 0x02, 0x03, 0x49, 0x00, - 0x30, 0x46, 0x02, 0x21, 0x00, 0xBE, 0xB8, 0x58, 0xF0, 0xE4, - 0x15, 0x01, 0x1F, 0xDF, 0x70, 0x54, 0x73, 0x4A, 0x6C, 0x40, - 0x1F, 0x77, 0xA8, 0xB4, 0xEB, 0x52, 0x1E, 0xBF, 0xF5, 0x0D, - 0xB1, 0x33, 0xCA, 0x6A, 0xC4, 0x76, 0xB9, 0x02, 0x21, 0x00, - 0x97, 0x08, 0xDE, 0x2C, 0x28, 0xC1, 0x45, 0x71, 0xB6, 0x2C, - 0x54, 0x87, 0x98, 0x63, 0x76, 0xA8, 0x21, 0x34, 0x90, 0xA8, - 0xF7, 0x9E, 0x3F, 0xFC, 0x02, 0xB0, 0xE7, 0xD3, 0x09, 0x31, - 0x27, 0xE4 + 0x30, 0x59, 0x30, 0x13, 0x06, 0x07, 0x2A, 0x86, 0x48, 0xCE, + 0x3D, 0x02, 0x01, 0x06, 0x08, 0x2A, 0x86, 0x48, 0xCE, 0x3D, + 0x03, 0x01, 0x07, 0x03, 0x42, 0x00, 0x04, 0xBB, 0x33, 0xAC, + 0x4C, 0x27, 0x50, 0x4A, 0xC6, 0x4A, 0xA5, 0x04, 0xC3, 0x3C, + 0xDE, 0x9F, 0x36, 0xDB, 0x72, 0x2D, 0xCE, 0x94, 0xEA, 0x2B, + 0xFA, 0xCB, 0x20, 0x09, 0x39, 0x2C, 0x16, 0xE8, 0x61, 0x02, + 0xE9, 0xAF, 0x4D, 0xD3, 0x02, 0x93, 0x9A, 0x31, 0x5B, 0x97, + 0x92, 0x21, 0x7F, 0xF0, 0xCF, 0x18, 0xDA, 0x91, 0x11, 0x02, + 0x34, 0x86, 0xE8, 0x20, 0x58, 0x33, 0x0B, 0x80, 0x34, 0x89, + 0xD8, 0xA3, 0x81, 0x89, 0x30, 0x81, 0x86, 0x30, 0x1D, 0x06, + 0x03, 0x55, 0x1D, 0x0E, 0x04, 0x16, 0x04, 0x14, 0x5D, 0x5D, + 0x26, 0xEF, 0xAC, 0x7E, 0x36, 0xF9, 0x9B, 0x76, 0x15, 0x2B, + 0x4A, 0x25, 0x02, 0x23, 0xEF, 0xB2, 0x89, 0x30, 0x30, 0x1F, + 0x06, 0x03, 0x55, 0x1D, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, + 0x14, 0x56, 0x8E, 0x9A, 0xC3, 0xF0, 0x42, 0xDE, 0x18, 0xB9, + 0x45, 0x55, 0x6E, 0xF9, 0x93, 0xCF, 0xEA, 0xC3, 0xF3, 0xA5, + 0x21, 0x30, 0x0C, 0x06, 0x03, 0x55, 0x1D, 0x13, 0x01, 0x01, + 0xFF, 0x04, 0x02, 0x30, 0x00, 0x30, 0x0E, 0x06, 0x03, 0x55, + 0x1D, 0x0F, 0x01, 0x01, 0xFF, 0x04, 0x04, 0x03, 0x02, 0x03, + 0xA8, 0x30, 0x13, 0x06, 0x03, 0x55, 0x1D, 0x25, 0x04, 0x0C, + 0x30, 0x0A, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07, + 0x03, 0x01, 0x30, 0x11, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, + 0x86, 0xF8, 0x42, 0x01, 0x01, 0x04, 0x04, 0x03, 0x02, 0x06, + 0x40, 0x30, 0x0A, 0x06, 0x08, 0x2A, 0x86, 0x48, 0xCE, 0x3D, + 0x04, 0x03, 0x02, 0x03, 0x48, 0x00, 0x30, 0x45, 0x02, 0x21, + 0x00, 0x99, 0xA5, 0xF0, 0x5E, 0x85, 0xE8, 0x0F, 0xB3, 0xF8, + 0xA1, 0xDF, 0xFA, 0xE3, 0xBF, 0x78, 0x35, 0x1D, 0x77, 0xF1, + 0xE3, 0x6A, 0xB2, 0x8B, 0xC3, 0x28, 0x52, 0x87, 0x9B, 0x5E, + 0x32, 0x4B, 0x72, 0x02, 0x20, 0x2D, 0x77, 0x11, 0x5F, 0x8A, + 0x0C, 0x15, 0x21, 0xA9, 0x9E, 0x5F, 0xC5, 0xA9, 0xA6, 0x6B, + 0xD9, 0xEA, 0xC3, 0x1C, 0x90, 0x8C, 0x19, 0xDB, 0xEB, 0xA7, + 0xE1, 0x64, 0x0E, 0xB2, 0x5E, 0x10, 0x92 }; static const int sizeof_serv_ecc_der_256 = sizeof(serv_ecc_der_256); @@ -3715,72 +3745,73 @@ static const int sizeof_ca_ecc_key_der_256 = sizeof(ca_ecc_key_der_256); /* ./certs/ca-ecc-cert.der, ECC */ static const unsigned char ca_ecc_cert_der_256[] = { - 0x30, 0x82, 0x02, 0x8B, 0x30, 0x82, 0x02, 0x30, 0xA0, 0x03, - 0x02, 0x01, 0x02, 0x02, 0x09, 0x00, 0xFD, 0x0E, 0x29, 0x21, - 0x66, 0xCB, 0x48, 0xA3, 0x30, 0x0A, 0x06, 0x08, 0x2A, 0x86, - 0x48, 0xCE, 0x3D, 0x04, 0x03, 0x02, 0x30, 0x81, 0x97, 0x31, - 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, - 0x55, 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, - 0x08, 0x0C, 0x0A, 0x57, 0x61, 0x73, 0x68, 0x69, 0x6E, 0x67, - 0x74, 0x6F, 0x6E, 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, - 0x04, 0x07, 0x0C, 0x07, 0x53, 0x65, 0x61, 0x74, 0x74, 0x6C, - 0x65, 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x0A, - 0x0C, 0x07, 0x77, 0x6F, 0x6C, 0x66, 0x53, 0x53, 0x4C, 0x31, - 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x0C, 0x0B, - 0x44, 0x65, 0x76, 0x65, 0x6C, 0x6F, 0x70, 0x6D, 0x65, 0x6E, - 0x74, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, 0x03, - 0x0C, 0x0F, 0x77, 0x77, 0x77, 0x2E, 0x77, 0x6F, 0x6C, 0x66, - 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, 0x6D, 0x31, 0x1F, 0x30, - 0x1D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, - 0x09, 0x01, 0x16, 0x10, 0x69, 0x6E, 0x66, 0x6F, 0x40, 0x77, - 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, 0x6D, - 0x30, 0x1E, 0x17, 0x0D, 0x31, 0x38, 0x30, 0x34, 0x31, 0x33, - 0x31, 0x35, 0x32, 0x33, 0x31, 0x30, 0x5A, 0x17, 0x0D, 0x32, - 0x31, 0x30, 0x31, 0x30, 0x37, 0x31, 0x35, 0x32, 0x33, 0x31, - 0x30, 0x5A, 0x30, 0x81, 0x97, 0x31, 0x0B, 0x30, 0x09, 0x06, - 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x13, - 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0C, 0x0A, 0x57, - 0x61, 0x73, 0x68, 0x69, 0x6E, 0x67, 0x74, 0x6F, 0x6E, 0x31, - 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0C, 0x07, - 0x53, 0x65, 0x61, 0x74, 0x74, 0x6C, 0x65, 0x31, 0x10, 0x30, - 0x0E, 0x06, 0x03, 0x55, 0x04, 0x0A, 0x0C, 0x07, 0x77, 0x6F, - 0x6C, 0x66, 0x53, 0x53, 0x4C, 0x31, 0x14, 0x30, 0x12, 0x06, - 0x03, 0x55, 0x04, 0x0B, 0x0C, 0x0B, 0x44, 0x65, 0x76, 0x65, - 0x6C, 0x6F, 0x70, 0x6D, 0x65, 0x6E, 0x74, 0x31, 0x18, 0x30, - 0x16, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0C, 0x0F, 0x77, 0x77, - 0x77, 0x2E, 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, - 0x63, 0x6F, 0x6D, 0x31, 0x1F, 0x30, 0x1D, 0x06, 0x09, 0x2A, - 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x01, 0x16, 0x10, - 0x69, 0x6E, 0x66, 0x6F, 0x40, 0x77, 0x6F, 0x6C, 0x66, 0x73, - 0x73, 0x6C, 0x2E, 0x63, 0x6F, 0x6D, 0x30, 0x59, 0x30, 0x13, - 0x06, 0x07, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x02, 0x01, 0x06, - 0x08, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x01, 0x07, 0x03, - 0x42, 0x00, 0x04, 0x02, 0xD3, 0xD9, 0x6E, 0xD6, 0x01, 0x8E, - 0x45, 0xC8, 0xB9, 0x90, 0x31, 0xE5, 0xC0, 0x4C, 0xE3, 0x9E, - 0xAD, 0x29, 0x38, 0x98, 0xBA, 0x10, 0xD6, 0xE9, 0x09, 0x2A, - 0x80, 0xA9, 0x2E, 0x17, 0x2A, 0xB9, 0x8A, 0xBF, 0x33, 0x83, - 0x46, 0xE3, 0x95, 0x0B, 0xE4, 0x77, 0x40, 0xB5, 0x3B, 0x43, - 0x45, 0x33, 0x0F, 0x61, 0x53, 0x7C, 0x37, 0x44, 0xC1, 0xCB, - 0xFC, 0x80, 0xCA, 0xE8, 0x43, 0xEA, 0xA7, 0xA3, 0x63, 0x30, - 0x61, 0x30, 0x1D, 0x06, 0x03, 0x55, 0x1D, 0x0E, 0x04, 0x16, - 0x04, 0x14, 0x56, 0x8E, 0x9A, 0xC3, 0xF0, 0x42, 0xDE, 0x18, - 0xB9, 0x45, 0x55, 0x6E, 0xF9, 0x93, 0xCF, 0xEA, 0xC3, 0xF3, - 0xA5, 0x21, 0x30, 0x1F, 0x06, 0x03, 0x55, 0x1D, 0x23, 0x04, - 0x18, 0x30, 0x16, 0x80, 0x14, 0x56, 0x8E, 0x9A, 0xC3, 0xF0, - 0x42, 0xDE, 0x18, 0xB9, 0x45, 0x55, 0x6E, 0xF9, 0x93, 0xCF, - 0xEA, 0xC3, 0xF3, 0xA5, 0x21, 0x30, 0x0F, 0x06, 0x03, 0x55, - 0x1D, 0x13, 0x01, 0x01, 0xFF, 0x04, 0x05, 0x30, 0x03, 0x01, - 0x01, 0xFF, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x1D, 0x0F, 0x01, - 0x01, 0xFF, 0x04, 0x04, 0x03, 0x02, 0x01, 0x86, 0x30, 0x0A, - 0x06, 0x08, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x04, 0x03, 0x02, - 0x03, 0x49, 0x00, 0x30, 0x46, 0x02, 0x21, 0x00, 0xF0, 0x7B, - 0xCC, 0x24, 0x73, 0x19, 0x3F, 0x61, 0x68, 0xED, 0xC8, 0x0A, - 0x54, 0x4A, 0xB8, 0xAC, 0x79, 0xEF, 0x10, 0x32, 0x91, 0x52, - 0x2C, 0x3E, 0xBF, 0x50, 0xAA, 0x5F, 0x18, 0xC1, 0x97, 0xF5, - 0x02, 0x21, 0x00, 0xD9, 0x4B, 0x63, 0x67, 0x6F, 0x9B, 0x29, - 0xA9, 0xD7, 0x6B, 0x63, 0x9B, 0x98, 0x9F, 0x32, 0x82, 0x36, - 0xDA, 0xF0, 0xA9, 0xF7, 0x51, 0xB4, 0x97, 0xAA, 0xFA, 0xFA, - 0xDD, 0xEF, 0xEF, 0x4A, 0xAE + 0x30, 0x82, 0x02, 0x96, 0x30, 0x82, 0x02, 0x3B, 0xA0, 0x03, + 0x02, 0x01, 0x02, 0x02, 0x14, 0x43, 0xB5, 0x59, 0x67, 0xBC, + 0x60, 0x48, 0x29, 0x8C, 0x82, 0x77, 0xDB, 0xB5, 0x42, 0x36, + 0x14, 0xE4, 0x85, 0xC0, 0x3A, 0x30, 0x0A, 0x06, 0x08, 0x2A, + 0x86, 0x48, 0xCE, 0x3D, 0x04, 0x03, 0x02, 0x30, 0x81, 0x97, + 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, + 0x02, 0x55, 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, + 0x04, 0x08, 0x0C, 0x0A, 0x57, 0x61, 0x73, 0x68, 0x69, 0x6E, + 0x67, 0x74, 0x6F, 0x6E, 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, + 0x55, 0x04, 0x07, 0x0C, 0x07, 0x53, 0x65, 0x61, 0x74, 0x74, + 0x6C, 0x65, 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, + 0x0A, 0x0C, 0x07, 0x77, 0x6F, 0x6C, 0x66, 0x53, 0x53, 0x4C, + 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x0C, + 0x0B, 0x44, 0x65, 0x76, 0x65, 0x6C, 0x6F, 0x70, 0x6D, 0x65, + 0x6E, 0x74, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, + 0x03, 0x0C, 0x0F, 0x77, 0x77, 0x77, 0x2E, 0x77, 0x6F, 0x6C, + 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, 0x6D, 0x31, 0x1F, + 0x30, 0x1D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, + 0x01, 0x09, 0x01, 0x16, 0x10, 0x69, 0x6E, 0x66, 0x6F, 0x40, + 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, + 0x6D, 0x30, 0x1E, 0x17, 0x0D, 0x32, 0x30, 0x30, 0x35, 0x30, + 0x37, 0x30, 0x37, 0x33, 0x39, 0x30, 0x34, 0x5A, 0x17, 0x0D, + 0x32, 0x33, 0x30, 0x32, 0x30, 0x31, 0x30, 0x37, 0x33, 0x39, + 0x30, 0x34, 0x5A, 0x30, 0x81, 0x97, 0x31, 0x0B, 0x30, 0x09, + 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, + 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0C, 0x0A, + 0x57, 0x61, 0x73, 0x68, 0x69, 0x6E, 0x67, 0x74, 0x6F, 0x6E, + 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0C, + 0x07, 0x53, 0x65, 0x61, 0x74, 0x74, 0x6C, 0x65, 0x31, 0x10, + 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x0A, 0x0C, 0x07, 0x77, + 0x6F, 0x6C, 0x66, 0x53, 0x53, 0x4C, 0x31, 0x14, 0x30, 0x12, + 0x06, 0x03, 0x55, 0x04, 0x0B, 0x0C, 0x0B, 0x44, 0x65, 0x76, + 0x65, 0x6C, 0x6F, 0x70, 0x6D, 0x65, 0x6E, 0x74, 0x31, 0x18, + 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0C, 0x0F, 0x77, + 0x77, 0x77, 0x2E, 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, + 0x2E, 0x63, 0x6F, 0x6D, 0x31, 0x1F, 0x30, 0x1D, 0x06, 0x09, + 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x01, 0x16, + 0x10, 0x69, 0x6E, 0x66, 0x6F, 0x40, 0x77, 0x6F, 0x6C, 0x66, + 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, 0x6D, 0x30, 0x59, 0x30, + 0x13, 0x06, 0x07, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x02, 0x01, + 0x06, 0x08, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x01, 0x07, + 0x03, 0x42, 0x00, 0x04, 0x02, 0xD3, 0xD9, 0x6E, 0xD6, 0x01, + 0x8E, 0x45, 0xC8, 0xB9, 0x90, 0x31, 0xE5, 0xC0, 0x4C, 0xE3, + 0x9E, 0xAD, 0x29, 0x38, 0x98, 0xBA, 0x10, 0xD6, 0xE9, 0x09, + 0x2A, 0x80, 0xA9, 0x2E, 0x17, 0x2A, 0xB9, 0x8A, 0xBF, 0x33, + 0x83, 0x46, 0xE3, 0x95, 0x0B, 0xE4, 0x77, 0x40, 0xB5, 0x3B, + 0x43, 0x45, 0x33, 0x0F, 0x61, 0x53, 0x7C, 0x37, 0x44, 0xC1, + 0xCB, 0xFC, 0x80, 0xCA, 0xE8, 0x43, 0xEA, 0xA7, 0xA3, 0x63, + 0x30, 0x61, 0x30, 0x1D, 0x06, 0x03, 0x55, 0x1D, 0x0E, 0x04, + 0x16, 0x04, 0x14, 0x56, 0x8E, 0x9A, 0xC3, 0xF0, 0x42, 0xDE, + 0x18, 0xB9, 0x45, 0x55, 0x6E, 0xF9, 0x93, 0xCF, 0xEA, 0xC3, + 0xF3, 0xA5, 0x21, 0x30, 0x1F, 0x06, 0x03, 0x55, 0x1D, 0x23, + 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0x56, 0x8E, 0x9A, 0xC3, + 0xF0, 0x42, 0xDE, 0x18, 0xB9, 0x45, 0x55, 0x6E, 0xF9, 0x93, + 0xCF, 0xEA, 0xC3, 0xF3, 0xA5, 0x21, 0x30, 0x0F, 0x06, 0x03, + 0x55, 0x1D, 0x13, 0x01, 0x01, 0xFF, 0x04, 0x05, 0x30, 0x03, + 0x01, 0x01, 0xFF, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x1D, 0x0F, + 0x01, 0x01, 0xFF, 0x04, 0x04, 0x03, 0x02, 0x01, 0x86, 0x30, + 0x0A, 0x06, 0x08, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x04, 0x03, + 0x02, 0x03, 0x49, 0x00, 0x30, 0x46, 0x02, 0x21, 0x00, 0xE4, + 0x87, 0x41, 0xD1, 0xD5, 0x09, 0xB6, 0x97, 0x1C, 0x7C, 0x1C, + 0x40, 0xF6, 0xB2, 0xA1, 0xDF, 0x28, 0x57, 0x00, 0xA3, 0x62, + 0x2B, 0xD8, 0x0B, 0xE7, 0xF3, 0xD4, 0x24, 0x56, 0x52, 0x62, + 0x85, 0x02, 0x21, 0x00, 0xCD, 0x0A, 0x3F, 0x60, 0xCA, 0x33, + 0xB5, 0xA9, 0x1F, 0x4B, 0x43, 0x2C, 0x60, 0x08, 0xFD, 0x3E, + 0xBD, 0xC4, 0x30, 0x5C, 0xFF, 0x2C, 0xD4, 0x58, 0xAC, 0x77, + 0x21, 0xC6, 0x2E, 0x39, 0xD9, 0x11 }; static const int sizeof_ca_ecc_cert_der_256 = sizeof(ca_ecc_cert_der_256); @@ -3810,78 +3841,79 @@ static const int sizeof_ca_ecc_key_der_384 = sizeof(ca_ecc_key_der_384); /* ./certs/ca-ecc384-cert.der, ECC */ static const unsigned char ca_ecc_cert_der_384[] = { - 0x30, 0x82, 0x02, 0xC7, 0x30, 0x82, 0x02, 0x4D, 0xA0, 0x03, - 0x02, 0x01, 0x02, 0x02, 0x09, 0x00, 0xFC, 0x39, 0x04, 0xA4, - 0x0E, 0xA5, 0x6C, 0x87, 0x30, 0x0A, 0x06, 0x08, 0x2A, 0x86, - 0x48, 0xCE, 0x3D, 0x04, 0x03, 0x03, 0x30, 0x81, 0x97, 0x31, - 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, - 0x55, 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, - 0x08, 0x0C, 0x0A, 0x57, 0x61, 0x73, 0x68, 0x69, 0x6E, 0x67, - 0x74, 0x6F, 0x6E, 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, - 0x04, 0x07, 0x0C, 0x07, 0x53, 0x65, 0x61, 0x74, 0x74, 0x6C, - 0x65, 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x0A, - 0x0C, 0x07, 0x77, 0x6F, 0x6C, 0x66, 0x53, 0x53, 0x4C, 0x31, - 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x0C, 0x0B, - 0x44, 0x65, 0x76, 0x65, 0x6C, 0x6F, 0x70, 0x6D, 0x65, 0x6E, - 0x74, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, 0x03, - 0x0C, 0x0F, 0x77, 0x77, 0x77, 0x2E, 0x77, 0x6F, 0x6C, 0x66, - 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, 0x6D, 0x31, 0x1F, 0x30, - 0x1D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, - 0x09, 0x01, 0x16, 0x10, 0x69, 0x6E, 0x66, 0x6F, 0x40, 0x77, - 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, 0x6D, - 0x30, 0x1E, 0x17, 0x0D, 0x31, 0x38, 0x30, 0x34, 0x31, 0x33, - 0x31, 0x35, 0x32, 0x33, 0x31, 0x30, 0x5A, 0x17, 0x0D, 0x32, - 0x31, 0x30, 0x31, 0x30, 0x37, 0x31, 0x35, 0x32, 0x33, 0x31, - 0x30, 0x5A, 0x30, 0x81, 0x97, 0x31, 0x0B, 0x30, 0x09, 0x06, - 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x13, - 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0C, 0x0A, 0x57, - 0x61, 0x73, 0x68, 0x69, 0x6E, 0x67, 0x74, 0x6F, 0x6E, 0x31, - 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0C, 0x07, - 0x53, 0x65, 0x61, 0x74, 0x74, 0x6C, 0x65, 0x31, 0x10, 0x30, - 0x0E, 0x06, 0x03, 0x55, 0x04, 0x0A, 0x0C, 0x07, 0x77, 0x6F, - 0x6C, 0x66, 0x53, 0x53, 0x4C, 0x31, 0x14, 0x30, 0x12, 0x06, - 0x03, 0x55, 0x04, 0x0B, 0x0C, 0x0B, 0x44, 0x65, 0x76, 0x65, - 0x6C, 0x6F, 0x70, 0x6D, 0x65, 0x6E, 0x74, 0x31, 0x18, 0x30, - 0x16, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0C, 0x0F, 0x77, 0x77, - 0x77, 0x2E, 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, - 0x63, 0x6F, 0x6D, 0x31, 0x1F, 0x30, 0x1D, 0x06, 0x09, 0x2A, - 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x01, 0x16, 0x10, - 0x69, 0x6E, 0x66, 0x6F, 0x40, 0x77, 0x6F, 0x6C, 0x66, 0x73, - 0x73, 0x6C, 0x2E, 0x63, 0x6F, 0x6D, 0x30, 0x76, 0x30, 0x10, - 0x06, 0x07, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x02, 0x01, 0x06, - 0x05, 0x2B, 0x81, 0x04, 0x00, 0x22, 0x03, 0x62, 0x00, 0x04, - 0xEE, 0x82, 0xD4, 0x39, 0x9A, 0xB1, 0x27, 0x82, 0xF4, 0xD7, - 0xEA, 0xC6, 0xBC, 0x03, 0x1D, 0x4D, 0x83, 0x61, 0xF4, 0x03, - 0xAE, 0x7E, 0xBD, 0xD8, 0x5A, 0xA5, 0xB9, 0xF0, 0x8E, 0xA2, - 0xA5, 0xDA, 0xCE, 0x87, 0x3B, 0x5A, 0xAB, 0x44, 0x16, 0x9C, - 0xF5, 0x9F, 0x62, 0xDD, 0xF6, 0x20, 0xCD, 0x9C, 0x76, 0x3C, - 0x40, 0xB1, 0x3F, 0x97, 0x17, 0xDF, 0x59, 0xF6, 0xCD, 0xDE, - 0xCD, 0x46, 0x35, 0xC0, 0xED, 0x5E, 0x2E, 0x48, 0xB6, 0x66, - 0x91, 0x71, 0x74, 0xB7, 0x0C, 0x3F, 0xB9, 0x9A, 0xB7, 0x83, - 0xBD, 0x93, 0x3F, 0x5F, 0x50, 0x2D, 0x70, 0x3F, 0xDE, 0x35, - 0x25, 0xE1, 0x90, 0x3B, 0x86, 0xE0, 0xA3, 0x63, 0x30, 0x61, - 0x30, 0x1D, 0x06, 0x03, 0x55, 0x1D, 0x0E, 0x04, 0x16, 0x04, - 0x14, 0xAB, 0xE0, 0xC3, 0x26, 0x4C, 0x18, 0xD4, 0x72, 0xBB, - 0xD2, 0x84, 0x8C, 0x9C, 0x0A, 0x05, 0x92, 0x80, 0x12, 0x53, - 0x52, 0x30, 0x1F, 0x06, 0x03, 0x55, 0x1D, 0x23, 0x04, 0x18, - 0x30, 0x16, 0x80, 0x14, 0xAB, 0xE0, 0xC3, 0x26, 0x4C, 0x18, - 0xD4, 0x72, 0xBB, 0xD2, 0x84, 0x8C, 0x9C, 0x0A, 0x05, 0x92, - 0x80, 0x12, 0x53, 0x52, 0x30, 0x0F, 0x06, 0x03, 0x55, 0x1D, - 0x13, 0x01, 0x01, 0xFF, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, - 0xFF, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x1D, 0x0F, 0x01, 0x01, - 0xFF, 0x04, 0x04, 0x03, 0x02, 0x01, 0x86, 0x30, 0x0A, 0x06, - 0x08, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x04, 0x03, 0x03, 0x03, - 0x68, 0x00, 0x30, 0x65, 0x02, 0x30, 0x0D, 0x0A, 0x62, 0xFB, - 0xE6, 0x3A, 0xFE, 0x71, 0xD8, 0x2B, 0x44, 0xE5, 0x97, 0x34, - 0x04, 0xA9, 0x8C, 0x0A, 0x99, 0x88, 0xA0, 0xBD, 0x1F, 0xB0, - 0xDF, 0x94, 0x59, 0x27, 0xBB, 0x2B, 0xC6, 0x2A, 0xBE, 0xA4, - 0x69, 0x1B, 0xCF, 0x97, 0x78, 0x2A, 0x28, 0x96, 0xEE, 0xBA, - 0xD4, 0x87, 0x45, 0xFD, 0x02, 0x31, 0x00, 0xC0, 0x73, 0x19, - 0x66, 0x76, 0x5E, 0x9F, 0xA3, 0x65, 0x85, 0x41, 0xEF, 0xB7, - 0x7B, 0x3D, 0x63, 0x6D, 0x98, 0x71, 0x99, 0x6F, 0x9C, 0xDB, - 0xA8, 0x5E, 0x53, 0x6E, 0xA0, 0x68, 0x11, 0x65, 0xBC, 0x78, - 0x74, 0x28, 0x69, 0xC7, 0x64, 0x9D, 0x88, 0xF2, 0xD8, 0xC2, - 0x3D, 0x29, 0x03, 0x83, 0x23 + 0x30, 0x82, 0x02, 0xD1, 0x30, 0x82, 0x02, 0x58, 0xA0, 0x03, + 0x02, 0x01, 0x02, 0x02, 0x14, 0x72, 0x88, 0xF9, 0xE4, 0x7D, + 0xC6, 0x94, 0x48, 0xCF, 0xB5, 0xAE, 0xB6, 0x4B, 0xCB, 0x29, + 0xD2, 0x00, 0x71, 0xDE, 0xDB, 0x30, 0x0A, 0x06, 0x08, 0x2A, + 0x86, 0x48, 0xCE, 0x3D, 0x04, 0x03, 0x03, 0x30, 0x81, 0x97, + 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, + 0x02, 0x55, 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, + 0x04, 0x08, 0x0C, 0x0A, 0x57, 0x61, 0x73, 0x68, 0x69, 0x6E, + 0x67, 0x74, 0x6F, 0x6E, 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, + 0x55, 0x04, 0x07, 0x0C, 0x07, 0x53, 0x65, 0x61, 0x74, 0x74, + 0x6C, 0x65, 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, + 0x0A, 0x0C, 0x07, 0x77, 0x6F, 0x6C, 0x66, 0x53, 0x53, 0x4C, + 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x0C, + 0x0B, 0x44, 0x65, 0x76, 0x65, 0x6C, 0x6F, 0x70, 0x6D, 0x65, + 0x6E, 0x74, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, + 0x03, 0x0C, 0x0F, 0x77, 0x77, 0x77, 0x2E, 0x77, 0x6F, 0x6C, + 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, 0x6D, 0x31, 0x1F, + 0x30, 0x1D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, + 0x01, 0x09, 0x01, 0x16, 0x10, 0x69, 0x6E, 0x66, 0x6F, 0x40, + 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, + 0x6D, 0x30, 0x1E, 0x17, 0x0D, 0x32, 0x30, 0x30, 0x35, 0x30, + 0x37, 0x30, 0x37, 0x33, 0x39, 0x30, 0x34, 0x5A, 0x17, 0x0D, + 0x32, 0x33, 0x30, 0x32, 0x30, 0x31, 0x30, 0x37, 0x33, 0x39, + 0x30, 0x34, 0x5A, 0x30, 0x81, 0x97, 0x31, 0x0B, 0x30, 0x09, + 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, + 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0C, 0x0A, + 0x57, 0x61, 0x73, 0x68, 0x69, 0x6E, 0x67, 0x74, 0x6F, 0x6E, + 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0C, + 0x07, 0x53, 0x65, 0x61, 0x74, 0x74, 0x6C, 0x65, 0x31, 0x10, + 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x0A, 0x0C, 0x07, 0x77, + 0x6F, 0x6C, 0x66, 0x53, 0x53, 0x4C, 0x31, 0x14, 0x30, 0x12, + 0x06, 0x03, 0x55, 0x04, 0x0B, 0x0C, 0x0B, 0x44, 0x65, 0x76, + 0x65, 0x6C, 0x6F, 0x70, 0x6D, 0x65, 0x6E, 0x74, 0x31, 0x18, + 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0C, 0x0F, 0x77, + 0x77, 0x77, 0x2E, 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, + 0x2E, 0x63, 0x6F, 0x6D, 0x31, 0x1F, 0x30, 0x1D, 0x06, 0x09, + 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x01, 0x16, + 0x10, 0x69, 0x6E, 0x66, 0x6F, 0x40, 0x77, 0x6F, 0x6C, 0x66, + 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, 0x6D, 0x30, 0x76, 0x30, + 0x10, 0x06, 0x07, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x02, 0x01, + 0x06, 0x05, 0x2B, 0x81, 0x04, 0x00, 0x22, 0x03, 0x62, 0x00, + 0x04, 0xEE, 0x82, 0xD4, 0x39, 0x9A, 0xB1, 0x27, 0x82, 0xF4, + 0xD7, 0xEA, 0xC6, 0xBC, 0x03, 0x1D, 0x4D, 0x83, 0x61, 0xF4, + 0x03, 0xAE, 0x7E, 0xBD, 0xD8, 0x5A, 0xA5, 0xB9, 0xF0, 0x8E, + 0xA2, 0xA5, 0xDA, 0xCE, 0x87, 0x3B, 0x5A, 0xAB, 0x44, 0x16, + 0x9C, 0xF5, 0x9F, 0x62, 0xDD, 0xF6, 0x20, 0xCD, 0x9C, 0x76, + 0x3C, 0x40, 0xB1, 0x3F, 0x97, 0x17, 0xDF, 0x59, 0xF6, 0xCD, + 0xDE, 0xCD, 0x46, 0x35, 0xC0, 0xED, 0x5E, 0x2E, 0x48, 0xB6, + 0x66, 0x91, 0x71, 0x74, 0xB7, 0x0C, 0x3F, 0xB9, 0x9A, 0xB7, + 0x83, 0xBD, 0x93, 0x3F, 0x5F, 0x50, 0x2D, 0x70, 0x3F, 0xDE, + 0x35, 0x25, 0xE1, 0x90, 0x3B, 0x86, 0xE0, 0xA3, 0x63, 0x30, + 0x61, 0x30, 0x1D, 0x06, 0x03, 0x55, 0x1D, 0x0E, 0x04, 0x16, + 0x04, 0x14, 0xAB, 0xE0, 0xC3, 0x26, 0x4C, 0x18, 0xD4, 0x72, + 0xBB, 0xD2, 0x84, 0x8C, 0x9C, 0x0A, 0x05, 0x92, 0x80, 0x12, + 0x53, 0x52, 0x30, 0x1F, 0x06, 0x03, 0x55, 0x1D, 0x23, 0x04, + 0x18, 0x30, 0x16, 0x80, 0x14, 0xAB, 0xE0, 0xC3, 0x26, 0x4C, + 0x18, 0xD4, 0x72, 0xBB, 0xD2, 0x84, 0x8C, 0x9C, 0x0A, 0x05, + 0x92, 0x80, 0x12, 0x53, 0x52, 0x30, 0x0F, 0x06, 0x03, 0x55, + 0x1D, 0x13, 0x01, 0x01, 0xFF, 0x04, 0x05, 0x30, 0x03, 0x01, + 0x01, 0xFF, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x1D, 0x0F, 0x01, + 0x01, 0xFF, 0x04, 0x04, 0x03, 0x02, 0x01, 0x86, 0x30, 0x0A, + 0x06, 0x08, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x04, 0x03, 0x03, + 0x03, 0x67, 0x00, 0x30, 0x64, 0x02, 0x30, 0x5E, 0xAF, 0x51, + 0xEC, 0x81, 0xC8, 0x8D, 0x72, 0x75, 0x66, 0x07, 0x53, 0xCC, + 0x05, 0x4E, 0x45, 0x28, 0x9B, 0xA3, 0x2A, 0x7F, 0x34, 0xE4, + 0xA8, 0x64, 0x82, 0xC5, 0x66, 0x05, 0x17, 0x87, 0x9D, 0xC7, + 0xF9, 0x53, 0xC8, 0xCD, 0x83, 0x90, 0x96, 0xB3, 0x34, 0x93, + 0x83, 0x26, 0x5D, 0xAB, 0xFC, 0x02, 0x30, 0x4A, 0x57, 0x60, + 0x83, 0x50, 0x85, 0xB8, 0xFD, 0xC2, 0x41, 0x39, 0xD4, 0xB0, + 0x4F, 0xD8, 0x80, 0xF5, 0x5F, 0x42, 0xA8, 0x9A, 0xA8, 0xD0, + 0x14, 0x1E, 0x07, 0x48, 0xD7, 0x02, 0xCC, 0xBA, 0x58, 0xB1, + 0x1E, 0xCF, 0xFE, 0xBA, 0x75, 0x12, 0x73, 0x74, 0x84, 0xC6, + 0x1D, 0xE2, 0x41, 0x86, 0x94 }; static const int sizeof_ca_ecc_cert_der_384 = sizeof(ca_ecc_cert_der_384); From b39e384cfddb0222554a9a612cdf048fdc54ce01 Mon Sep 17 00:00:00 2001 From: Tesfa Mael Date: Thu, 7 May 2020 13:39:53 -0700 Subject: [PATCH 088/298] Review comment --- wolfcrypt/src/hmac.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/wolfcrypt/src/hmac.c b/wolfcrypt/src/hmac.c index a212dc141..8667be102 100644 --- a/wolfcrypt/src/hmac.c +++ b/wolfcrypt/src/hmac.c @@ -1215,12 +1215,12 @@ int wolfSSL_GetHmacMaxSize(void) word32 outIdx = 0; word32 hashSz = wc_HmacSizeByType(type); byte n = 0x1; - word32 N = 0; /* rf5869: N = ceil(L/HashLen)*/ - N = (outSz/hashSz) + ((outSz % hashSz) != 0); + /* RFC 5869 states that the length of output keying material in + octets must be L <= 255*HashLen or N = ceil(L/HashLen) */ - if (out == NULL || N > 255) - return BAD_FUNC_ARG; + if (out == NULL || ((outSz/hashSz) + ((outSz % hashSz) != 0)) > 255) + return BAD_FUNC_ARG; ret = wc_HmacInit(&myHmac, NULL, INVALID_DEVID); if (ret != 0) From b5886e0e37d29b97305a616a1740f1bfe5ad597e Mon Sep 17 00:00:00 2001 From: Juliusz Sosinowicz Date: Thu, 7 May 2020 12:26:52 +0200 Subject: [PATCH 089/298] Add option `--enable-ip-alt-name` This commit adds the configure option `--enable-ip-alt-name` that enables support for the IP alternative subject name parsing in `wolfcrypt/src/asn.c:DecodeAltNames`. --- configure.ac | 12 ++++++++++++ tests/api.c | 2 +- wolfcrypt/src/asn.c | 2 +- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index b67cc7a74..eaf03c5da 100644 --- a/configure.ac +++ b/configure.ac @@ -528,6 +528,18 @@ then AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_OPENSSH -DHAVE_EX_DATA -DWOLFSSL_BASE16" fi +#IP alternative name Support +AC_ARG_ENABLE([ip-alt-name], + [AS_HELP_STRING([--enable-ip-alt-name],[Enable IP subject alternative name (default: disabled)])], + [ ENABLE_IP_ALT_NAME=$enableval ], + [ ENABLE_IP_ALT_NAME=no ] + ) + +if test "$ENABLE_IP_ALT_NAME" = "yes" +then + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_IP_ALT_NAME" +fi + #Qt Support AC_ARG_ENABLE([qt], [AS_HELP_STRING([--enable-qt],[Enable qt (default: disabled)])], diff --git a/tests/api.c b/tests/api.c index cb00ba43c..3c291b928 100644 --- a/tests/api.c +++ b/tests/api.c @@ -20521,7 +20521,7 @@ static void test_wolfSSL_ASN1_TIME_print(void) sizeof_client_cert_der_2048, WOLFSSL_FILETYPE_ASN1)); AssertIntEQ(ASN1_TIME_print(bio, X509_get_notBefore(x509)), 1); AssertIntEQ(BIO_read(bio, buf, sizeof(buf)), 24); - AssertIntEQ(XMEMCMP(buf, "Apr 13 15:23:09 2018 GMT", sizeof(buf) - 1), 0); + AssertIntEQ(XMEMCMP(buf, "May 7 07:39:03 2020 GMT", sizeof(buf) - 1), 0); /* create a bad time and test results */ AssertNotNull(t = X509_get_notAfter(x509)); diff --git a/wolfcrypt/src/asn.c b/wolfcrypt/src/asn.c index b5ec41a18..226278441 100644 --- a/wolfcrypt/src/asn.c +++ b/wolfcrypt/src/asn.c @@ -7798,7 +7798,7 @@ static int DecodeAltNames(const byte* input, int sz, DecodedCert* cert) length -= strLen; idx += strLen; } -#if defined(WOLFSSL_QT) || defined(OPENSSL_ALL) +#if defined(WOLFSSL_QT) || defined(OPENSSL_ALL) || defined(WOLFSSL_IP_ALT_NAME) else if (b == (ASN_CONTEXT_SPECIFIC | ASN_IP_TYPE)) { DNS_entry* ipAddr; int strLen; From 10aa8a4ffcd84870bfa718561c1ea17a14ddeabe Mon Sep 17 00:00:00 2001 From: David Garske Date: Fri, 8 May 2020 13:38:26 -0700 Subject: [PATCH 090/298] Added support `--enable-wpas=small` for reduced code size when building against the WPA supplicant with EAP-TLS. This does not use `OPENSSL_EXTRA`, which helps reduce code size. --- configure.ac | 12 +- src/internal.c | 4 +- src/ssl.c | 317 +++++++++++++++++++++++++++------------- wolfssl/internal.h | 6 +- wolfssl/openssl/stack.h | 2 + wolfssl/ssl.h | 92 ++++++++---- 6 files changed, 293 insertions(+), 140 deletions(-) diff --git a/configure.ac b/configure.ac index b67cc7a74..765adeb34 100644 --- a/configure.ac +++ b/configure.ac @@ -666,6 +666,14 @@ then AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_WPAS" fi +if test "$ENABLED_WPAS" = "small" +then + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_ALWAYS_VERIFY_CB" + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_ALWAYS_KEEP_SNI" + AM_CFLAGS="$AM_CFLAGS -DHAVE_EX_DATA" + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_EITHER_SIDE" + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_WPAS_SMALL" +fi if test "$ENABLED_FORTRESS" = "yes" then @@ -3165,7 +3173,7 @@ AC_ARG_ENABLE([session-ticket], [ ENABLED_SESSION_TICKET=no ] ) -if test "x$ENABLED_NGINX" = "xyes" || test "$ENABLED_WPAS" = "yes" || test "x$ENABLED_HAPROXY" = "xyes" +if test "x$ENABLED_NGINX" = "xyes" || test "$ENABLED_WPAS" != "no" || test "x$ENABLED_HAPROXY" = "xyes" then ENABLED_SESSION_TICKET=yes fi @@ -3836,7 +3844,7 @@ AC_ARG_ENABLE([enckeys], [ ENABLED_ENCKEYS=no ] ) -if test "$ENABLED_OPENSSLEXTRA" = "yes" || test "$ENABLED_WEBSERVER" = "yes" +if test "$ENABLED_OPENSSLEXTRA" = "yes" || test "$ENABLED_WEBSERVER" = "yes" || test "$ENABLED_WPAS" != "no" then ENABLED_ENCKEYS=yes fi diff --git a/src/internal.c b/src/internal.c index 8c6f62a63..ea94788ca 100644 --- a/src/internal.c +++ b/src/internal.c @@ -5267,8 +5267,10 @@ int SetSSL_CTX(WOLFSSL* ssl, WOLFSSL_CTX* ctx, int writeDup) ssl->pkCurveOID = ctx->pkCurveOID; #endif -#ifdef OPENSSL_EXTRA +#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) ssl->options.mask = ctx->mask; +#endif +#ifdef OPENSSL_EXTRA ssl->CBIS = ctx->CBIS; #endif ssl->timeout = ctx->timeout; diff --git a/src/ssl.c b/src/ssl.c index 1c203ab25..eefda8bcc 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -3022,7 +3022,7 @@ int wolfSSL_shutdown(WOLFSSL* ssl) } } -#ifdef OPENSSL_EXTRA +#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) /* reset WOLFSSL structure state for possible re-use */ if (ret == WOLFSSL_SUCCESS) { if (wolfSSL_clear(ssl) != WOLFSSL_SUCCESS) { @@ -9003,6 +9003,11 @@ int wolfSSL_X509_get_ext_by_NID(const WOLFSSL_X509* x509, int nid, int lastPos) #endif /* OPENSSL_ALL */ +#endif /* !NO_CERTS */ +#endif /* OPENSSL_EXTRA */ + +#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) + WOLFSSL_ASN1_BIT_STRING* wolfSSL_ASN1_BIT_STRING_new(void) { WOLFSSL_ASN1_BIT_STRING* str; @@ -9455,8 +9460,10 @@ err: } return NULL; } +#endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */ - +#ifdef OPENSSL_EXTRA +#ifndef NO_CERTS int wolfSSL_X509_add_altname(WOLFSSL_X509* x509, const char* name, int type) { DNS_entry* newAltName = NULL; @@ -13998,7 +14005,7 @@ int wolfSSL_set_compression(WOLFSSL* ssl) #endif -#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EXTRA) +#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) void wolfSSL_CTX_set_quiet_shutdown(WOLFSSL_CTX* ctx, int mode) { WOLFSSL_ENTER("wolfSSL_CTX_set_quiet_shutdown"); @@ -14013,7 +14020,7 @@ int wolfSSL_set_compression(WOLFSSL* ssl) if (mode) ssl->options.quietShutdown = 1; } -#endif +#endif /* OPENSSL_EXTRA || WOLFSSL_EXTRA || WOLFSSL_WPAS_SMALL */ #ifdef OPENSSL_EXTRA void wolfSSL_set_bio(WOLFSSL* ssl, WOLFSSL_BIO* rd, WOLFSSL_BIO* wr) @@ -14456,6 +14463,9 @@ int wolfSSL_set_compression(WOLFSSL* ssl) ssl->specs.hash_size); } +#endif /* OPENSSL_EXTRA */ + +#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) /* store keys returns WOLFSSL_SUCCESS or -1 on error */ int wolfSSL_get_keys(WOLFSSL* ssl, unsigned char** ms, unsigned int* msLen, @@ -14476,9 +14486,6 @@ int wolfSSL_set_compression(WOLFSSL* ssl) return WOLFSSL_SUCCESS; } -#endif /* OPENSSL_EXTRA */ - -#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EXTRA) void wolfSSL_set_accept_state(WOLFSSL* ssl) { WOLFSSL_ENTER("wolfSSL_set_accept_state"); @@ -14514,7 +14521,7 @@ int wolfSSL_set_compression(WOLFSSL* ssl) } } -#endif /* OPENSSL_EXTRA || WOLFSSL_EXTRA */ +#endif /* OPENSSL_EXTRA || WOLFSSL_EXTRA || WOLFSSL_WPAS_SMALL */ /* return true if connection established */ int wolfSSL_is_init_finished(WOLFSSL* ssl) @@ -14611,9 +14618,9 @@ int wolfSSL_set_compression(WOLFSSL* ssl) return WOLFSSL_SUCCESS; } +#endif /* OPENSSL_EXTRA */ -#ifndef NO_CERTS - +#if !defined(NO_CERTS) && (defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)) WOLFSSL_X509_STORE* wolfSSL_CTX_get_cert_store(WOLFSSL_CTX* ctx) { if (ctx == NULL) { @@ -14673,7 +14680,10 @@ int wolfSSL_set_compression(WOLFSSL* ssl) return ctx->error_depth; return WOLFSSL_FATAL_ERROR; } +#endif /* !NO_CERTS && (OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL) */ +#ifdef OPENSSL_EXTRA +#ifndef NO_CERTS void wolfSSL_X509_STORE_CTX_set_verify_cb(WOLFSSL_X509_STORE_CTX *ctx, WOLFSSL_X509_STORE_CTX_verify_cb verify_cb) { @@ -14692,9 +14702,7 @@ int wolfSSL_set_compression(WOLFSSL* ssl) st->verify_cb = verify_cb; } } -#endif - - +#endif /* WOLFSSL_QT || OPENSSL_ALL */ #endif /* !NO_CERTS */ WOLFSSL_BIO_METHOD* wolfSSL_BIO_f_md(void) @@ -15171,8 +15179,7 @@ int wolfSSL_set_compression(WOLFSSL* ssl) #endif /* OPENSSL_EXTRA || HAVE_WEBSERVER */ -#ifdef OPENSSL_EXTRA - +#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) #if !defined(NO_WOLFSSL_SERVER) size_t wolfSSL_get_server_random(const WOLFSSL *ssl, unsigned char *out, size_t outSz) @@ -15203,8 +15210,11 @@ size_t wolfSSL_get_server_random(const WOLFSSL *ssl, unsigned char *out, XMEMCPY(out, ssl->arrays->serverRandom, size); return size; } +#endif /* !NO_WOLFSSL_SERVER */ +#endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */ - +#ifdef OPENSSL_EXTRA +#if !defined(NO_WOLFSSL_SERVER) /* Used to get the peer ephemeral public key sent during the connection * NOTE: currently wolfSSL_KeepHandshakeResources(WOLFSSL* ssl) must be called * before the ephemeral key is stored. @@ -15323,7 +15333,9 @@ int wolfSSL_CTX_set_max_proto_version(WOLFSSL_CTX* ctx, int ver) return WOLFSSL_SUCCESS; } +#endif /* OPENSSL_EXTRA */ +#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) #if !defined(NO_WOLFSSL_CLIENT) /* Return the amount of random bytes copied over or error case. * ssl : ssl struct after handshake @@ -15362,8 +15374,9 @@ size_t wolfSSL_get_client_random(const WOLFSSL* ssl, unsigned char* out, return size; } #endif /* !NO_WOLFSSL_CLIENT */ +#endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */ - +#ifdef OPENSSL_EXTRA unsigned long wolfSSLeay(void) { return SSLEAY_VERSION_NUMBER; @@ -16508,6 +16521,9 @@ size_t wolfSSL_get_client_random(const WOLFSSL* ssl, unsigned char* out, /* nothing to do here */ } +#endif /* OPENSSL_EXTRA */ + +#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) int wolfSSL_clear(WOLFSSL* ssl) { if (ssl == NULL) { @@ -16602,7 +16618,7 @@ size_t wolfSSL_get_client_random(const WOLFSSL* ssl, unsigned char* out, return WOLFSSL_SUCCESS; } -#endif +#endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */ #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) long wolfSSL_CTX_set_mode(WOLFSSL_CTX* ctx, long mode) @@ -17752,7 +17768,9 @@ void* wolfSSL_sk_X509_OBJECT_value(WOLF_STACK_OF(WOLFSSL_X509_OBJECT)* sk, int x } #endif +#endif /* !NO_CERTS && OPENSSL_EXTRA */ +#if !defined(NO_CERTS) && (defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)) /* Free's all nodes in X509 stack. This is different then wolfSSL_sk_X509_free * in that it allows for choosing the function to use when freeing an X509s. * @@ -17803,7 +17821,7 @@ void wolfSSL_sk_X509_free(WOLF_STACK_OF(WOLFSSL_X509)* sk) wolfSSL_sk_X509_pop_free(sk, NULL); } -#endif /* NO_CERTS && OPENSSL_EXTRA */ +#endif /* !NO_CERTS && (OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL) */ #if defined(OPENSSL_ALL) || defined (WOLFSSL_QT) /* return 1 on success 0 on fail */ @@ -18000,7 +18018,9 @@ int wolfSSL_sk_push(WOLFSSL_STACK* sk, const void *data) return ret; } +#endif /* OPENSSL_EXTRA */ +#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) /* Creates and returns new GENERAL_NAME structure */ WOLFSSL_GENERAL_NAME* wolfSSL_GENERAL_NAME_new(void) { @@ -18061,6 +18081,10 @@ int wolfSSL_sk_GENERAL_NAME_push(WOLF_STACK_OF(WOLFSSL_GENERAL_NAME)* sk, return WOLFSSL_SUCCESS; } +#endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */ + +#ifdef OPENSSL_EXTRA + /* Returns the general name at index i from the stack * * sk stack to get general name from @@ -18100,6 +18124,10 @@ int wolfSSL_sk_GENERAL_NAME_num(WOLFSSL_STACK* sk) return (int)sk->num; } +#endif /* OPENSSL_EXTRA */ + +#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) + /* Frees all nodes in a GENERAL NAME stack * * sk stack of nodes to free @@ -18145,8 +18173,9 @@ void wolfSSL_sk_GENERAL_NAME_free(WOLFSSL_STACK* sk) WOLFSSL_ENTER("sk_GENERAL_NAME_free"); wolfSSL_sk_GENERAL_NAME_pop_free(sk, NULL); } +#endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */ - +#ifdef OPENSSL_EXTRA /* returns the number of nodes in stack on success and WOLFSSL_FATAL_ERROR * on fail */ int wolfSSL_sk_ACCESS_DESCRIPTION_num(WOLFSSL_STACK* sk) @@ -18202,7 +18231,9 @@ WOLFSSL_ACCESS_DESCRIPTION* wolfSSL_sk_ACCESS_DESCRIPTION_value( } return NULL; } +#endif /* OPENSSL_EXTRA */ +#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) /* Frees GENERAL_NAME objects. */ void wolfSSL_GENERAL_NAME_free(WOLFSSL_GENERAL_NAME* name) @@ -18232,7 +18263,9 @@ void wolfSSL_GENERAL_NAME_free(WOLFSSL_GENERAL_NAME* name) XFREE(name, NULL, DYNAMIC_TYPE_OPENSSL); } } +#endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */ +#ifdef OPENSSL_EXTRA void wolfSSL_GENERAL_NAMES_free(WOLFSSL_GENERAL_NAMES *gens) { WOLFSSL_STACK* node; @@ -18855,7 +18888,7 @@ void wolfSSL_ASN1_OBJECT_free(WOLFSSL_ASN1_OBJECT* obj) #endif /* NO_ASN */ #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */ -#ifdef OPENSSL_EXTRA +#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) #ifndef NO_ASN WOLFSSL_ASN1_OBJECT* wolfSSL_ASN1_OBJECT_new(void) { @@ -19014,6 +19047,12 @@ void wolfSSL_sk_ASN1_OBJECT_pop_free(WOLF_STACK_OF(WOLFSSL_ASN1_OBJECT)* sk, XFREE(sk, NULL, DYNAMIC_TYPE_ASN1); } +#endif /* !NO_ASN */ +#endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */ + +#ifdef OPENSSL_EXTRA +#ifndef NO_ASN + int wolfSSL_ASN1_STRING_to_UTF8(unsigned char **out, WOLFSSL_ASN1_STRING *in) { /* @@ -19088,7 +19127,9 @@ char* wolfSSL_i2s_ASN1_STRING(WOLFSSL_v3_ext_method *method, return tmp; } #endif /* NO_ASN */ +#endif /* OPENSSL_EXTRA */ +#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) void wolfSSL_set_connect_state(WOLFSSL* ssl) { WOLFSSL_ENTER("wolfSSL_set_connect_state"); @@ -19115,7 +19156,7 @@ void wolfSSL_set_connect_state(WOLFSSL* ssl) WOLFSSL_MSG("Error initializing client side"); } } -#endif /* OPENSSL_EXTRA */ +#endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */ int wolfSSL_get_shutdown(const WOLFSSL* ssl) @@ -19630,7 +19671,7 @@ unsigned long wolfSSL_X509_subject_name_hash(const WOLFSSL_X509* x509) return (unsigned long)ret; } -#endif +#endif /* OPENSSL_EXTRA && !NO_SHA */ WOLFSSL_ABI WOLFSSL_X509_NAME* wolfSSL_X509_get_issuer_name(WOLFSSL_X509* cert) @@ -19860,7 +19901,7 @@ WOLFSSL_EVP_PKEY* wolfSSL_X509_get_pubkey(WOLFSSL_X509* x509) /* End of smaller subset of X509 compatibility functions. Avoid increasing the * size of this subset and its memory usage */ -#endif /* OPENSSL_EXTRA_X509_SMALL */ +#endif /* OPENSSL_EXTRA_X509_SMALL || KEEP_PEER_CERT || SESSION_CERTS */ #if defined(OPENSSL_ALL) /* Takes two WOLFSSL_X509* certificates and performs a Sha hash of each, if the @@ -19931,10 +19972,9 @@ int wolfSSL_X509_cmp(const WOLFSSL_X509 *a, const WOLFSSL_X509 *b) return WOLFSSL_FATAL_ERROR; } } -#endif +#endif /* OPENSSL_ALL */ -#if defined(OPENSSL_EXTRA) -#if !defined(NO_CERTS) +#if defined(OPENSSL_EXTRA) && !defined(NO_CERTS) int wolfSSL_X509_ext_isSet_by_NID(WOLFSSL_X509* x509, int nid) { int isSet = 0; @@ -20105,8 +20145,9 @@ int wolfSSL_X509_cmp(const WOLFSSL_X509 *a, const WOLFSSL_X509 *b) WOLFSSL_LEAVE("wolfSSL_X509_NAME_entry_count", count); return count; } +#endif /* !NO_CERTS && OPENSSL_EXTRA */ - +#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) int wolfSSL_X509_NAME_get_index_by_NID(WOLFSSL_X509_NAME* name, int nid, int pos) @@ -20181,7 +20222,9 @@ int wolfSSL_X509_cmp(const WOLFSSL_X509 *a, const WOLFSSL_X509 *b) XFREE(asn1, NULL, DYNAMIC_TYPE_OPENSSL); } } +#endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */ +#if !defined(NO_CERTS) && defined(OPENSSL_EXTRA) /* Creates a new WOLFSSL_ASN1_STRING structure given the input type. * @@ -20223,6 +20266,9 @@ int wolfSSL_X509_cmp(const WOLFSSL_X509 *a, const WOLFSSL_X509 *b) return asn1->type; } +#endif /* !NO_CERTS && OPENSSL_EXTRA */ + +#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) /* if dataSz is negative then use XSTRLEN to find length of data * return WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure */ /* `data` can be NULL and only buffer will be allocated */ @@ -20275,7 +20321,10 @@ int wolfSSL_X509_cmp(const WOLFSSL_X509 *a, const WOLFSSL_X509 *b) return WOLFSSL_SUCCESS; } +#endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */ +#ifdef OPENSSL_EXTRA +#ifndef NO_CERTS unsigned char* wolfSSL_ASN1_STRING_data(WOLFSSL_ASN1_STRING* asn) { @@ -21004,7 +21053,7 @@ int wolfSSL_X509_cmp(const WOLFSSL_X509 *a, const WOLFSSL_X509 *b) #endif /* XSNPRINTF */ -#endif /* NO_CERTS */ +#endif /* !NO_CERTS */ #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT) /* Creates cipher->description based on cipher->offset @@ -21125,7 +21174,7 @@ int wolfSSL_sk_CIPHER_description(WOLFSSL_CIPHER* cipher) return WOLFSSL_SUCCESS; } -#endif +#endif /* OPENSSL_ALL || WOLFSSL_QT */ char* wolfSSL_CIPHER_description(const WOLFSSL_CIPHER* cipher, char* in, int len) @@ -21525,15 +21574,15 @@ void wolfSSL_BIO_clear_flags(WOLFSSL_BIO *bio, int flags) int wolfSSL_BIO_set_ex_data(WOLFSSL_BIO *bio, int idx, void *data) { WOLFSSL_ENTER("wolfSSL_BIO_set_ex_data"); - #ifdef HAVE_EX_DATA +#ifdef HAVE_EX_DATA if (bio != NULL && idx < MAX_EX_DATA) { return wolfSSL_CRYPTO_set_ex_data(&bio->ex_data, idx, data); } - #else +#else (void)bio; (void)idx; (void)data; - #endif +#endif return WOLFSSL_FAILURE; } @@ -21547,14 +21596,14 @@ int wolfSSL_BIO_set_ex_data(WOLFSSL_BIO *bio, int idx, void *data) void *wolfSSL_BIO_get_ex_data(WOLFSSL_BIO *bio, int idx) { WOLFSSL_ENTER("wolfSSL_BIO_get_ex_data"); - #ifdef HAVE_EX_DATA +#ifdef HAVE_EX_DATA if (bio != NULL && idx < MAX_EX_DATA && idx >= 0) { return wolfSSL_CRYPTO_get_ex_data(&bio->ex_data, idx); } - #else +#else (void)bio; (void)idx; - #endif +#endif return NULL; } @@ -21631,12 +21680,16 @@ void wolfSSL_set_dynlock_destroy_callback( } #endif +#endif /* OPENSSL_EXTRA */ +#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) const char* wolfSSL_X509_verify_cert_error_string(long err) { return wolfSSL_ERR_reason_error_string(err); } +#endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */ +#ifdef OPENSSL_EXTRA #ifndef NO_WOLFSSL_STUB int wolfSSL_X509_LOOKUP_add_dir(WOLFSSL_X509_LOOKUP* lookup, const char* dir, @@ -22390,7 +22443,7 @@ int wolfSSL_PKCS12_parse(WC_PKCS12* pkcs12, const char* psw, return WOLFSSL_SUCCESS; } -#endif /* !defined(NO_ASN) && !defined(NO_PWDBASED) */ +#endif /* !NO_ASN && !NO_PWDBASED */ /* no-op function. Was initially used for adding encryption algorithms available @@ -22590,7 +22643,10 @@ int wolfSSL_X509_STORE_add_cert(WOLFSSL_X509_STORE* store, WOLFSSL_X509* x509) return result; } +#endif /* !NO_CERTS */ +#endif /* OPENSSL_EXTRA */ +#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) WOLFSSL_X509_STORE* wolfSSL_X509_STORE_new(void) { WOLFSSL_X509_STORE* store = NULL; @@ -22615,11 +22671,12 @@ WOLFSSL_X509_STORE* wolfSSL_X509_STORE_new(void) goto err_exit; #endif -#ifdef OPENSSL_EXTRA +#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) if ((store->param = (WOLFSSL_X509_VERIFY_PARAM*)XMALLOC( sizeof(WOLFSSL_X509_VERIFY_PARAM), - NULL,DYNAMIC_TYPE_OPENSSL)) == NULL) + NULL, DYNAMIC_TYPE_OPENSSL)) == NULL) { goto err_exit; + } #endif @@ -22634,7 +22691,6 @@ err_exit: return NULL; } - void wolfSSL_X509_STORE_free(WOLFSSL_X509_STORE* store) { if (store != NULL && store->isDynamic) { @@ -22644,7 +22700,7 @@ void wolfSSL_X509_STORE_free(WOLFSSL_X509_STORE* store) if (store->crl != NULL) wolfSSL_X509_CRL_free(store->crl); #endif -#ifdef OPENSSL_EXTRA +#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) if (store->param != NULL) XFREE(store->param, NULL, DYNAMIC_TYPE_OPENSSL); #endif @@ -22652,7 +22708,10 @@ void wolfSSL_X509_STORE_free(WOLFSSL_X509_STORE* store) } } +#endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */ +#ifdef OPENSSL_EXTRA +#ifndef NO_CERTS int wolfSSL_X509_STORE_set_flags(WOLFSSL_X509_STORE* store, unsigned long flag) { int ret = WOLFSSL_SUCCESS; @@ -22822,7 +22881,7 @@ static int GetX509Error(int e) return e; } } -#endif +#endif /* OPENSSL_ALL || WOLFSSL_QT */ /* Verifies certificate chain using WOLFSSL_X509_STORE_CTX * returns 0 on success or < 0 on failure. @@ -22933,7 +22992,7 @@ int wolfSSL_X509_verify(WOLFSSL_X509* x509, WOLFSSL_EVP_PKEY* pkey) } return WOLFSSL_FAILURE; } -#endif /* NO_CERTS */ +#endif /* !NO_CERTS */ #if !defined(NO_FILESYSTEM) static void *wolfSSL_d2i_X509_fp_ex(XFILE file, void **x509, int type) @@ -23079,7 +23138,10 @@ WOLFSSL_X509_CRL* wolfSSL_d2i_X509_CRL(WOLFSSL_X509_CRL** crl, return newcrl; } +#endif /* HAVE_CRL */ +#endif /* OPENSSL_EXTRA */ +#if defined(HAVE_CRL) && (defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)) void wolfSSL_X509_CRL_free(WOLFSSL_X509_CRL *crl) { WOLFSSL_ENTER("wolfSSL_X509_CRL_free"); @@ -23087,8 +23149,9 @@ void wolfSSL_X509_CRL_free(WOLFSSL_X509_CRL *crl) FreeCRL(crl, 1); return; } -#endif /* HAVE_CRL */ +#endif /* HAVE_CRL && (OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL) */ +#ifdef OPENSSL_EXTRA #ifndef NO_WOLFSSL_STUB WOLFSSL_ASN1_TIME* wolfSSL_X509_CRL_get_lastUpdate(WOLFSSL_X509_CRL* crl) { @@ -23667,21 +23730,26 @@ long wolfSSL_ASN1_INTEGER_get(const WOLFSSL_ASN1_INTEGER* i) } #endif +#endif /* OPENSSL_EXTRA */ + +#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) /* get X509_STORE_CTX ex_data, max idx is MAX_EX_DATA */ void* wolfSSL_X509_STORE_CTX_get_ex_data(WOLFSSL_X509_STORE_CTX* ctx, int idx) { WOLFSSL_ENTER("wolfSSL_X509_STORE_CTX_get_ex_data"); - #if defined(HAVE_EX_DATA) || defined(FORTRESS) +#if defined(HAVE_EX_DATA) || defined(FORTRESS) if (ctx != NULL) { return wolfSSL_CRYPTO_get_ex_data(&ctx->ex_data, idx); } - #else +#else (void)ctx; (void)idx; - #endif +#endif return NULL; } +#endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */ +#ifdef OPENSSL_EXTRA /* set X509_STORE_CTX ex_data, max idx is MAX_EX_DATA. Return WOLFSSL_SUCCESS * on success, WOLFSSL_FAILURE on error. */ @@ -23689,16 +23757,16 @@ int wolfSSL_X509_STORE_CTX_set_ex_data(WOLFSSL_X509_STORE_CTX* ctx, int idx, void *data) { WOLFSSL_ENTER("wolfSSL_X509_STORE_CTX_set_ex_data"); - #if defined(HAVE_EX_DATA) || defined(FORTRESS) +#if defined(HAVE_EX_DATA) || defined(FORTRESS) if (ctx != NULL) { return wolfSSL_CRYPTO_set_ex_data(&ctx->ex_data, idx, data); } - #else +#else (void)ctx; (void)idx; (void)data; - #endif +#endif return WOLFSSL_FAILURE; } @@ -23732,7 +23800,9 @@ WOLFSSL_X509* wolfSSL_X509_STORE_CTX_get0_current_issuer( return NULL; } +#endif /* OPENSSL_EXTRA */ +#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) /* Gets an index to store SSL structure at. * * Returns positive index on success and negative values on failure @@ -23744,8 +23814,9 @@ int wolfSSL_get_ex_data_X509_STORE_CTX_idx(void) /* store SSL at index 0 */ return 0; } +#endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */ - +#ifdef OPENSSL_EXTRA /* Set an error stat in the X509 STORE CTX * */ @@ -24522,7 +24593,7 @@ int wolfSSL_PEM_def_callback(char* name, int num, int w, void* key) #endif /* OPENSSL_EXTRA */ -#if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) +#if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || defined(WOLFSSL_WPAS_SMALL) static long wolf_set_options(long old_op, long op) { /* if SSL_OP_ALL then turn all bug workarounds on */ @@ -24575,9 +24646,9 @@ static long wolf_set_options(long old_op, long op) return old_op | op; } -#endif +#endif /* OPENSSL_EXTRA || HAVE_WEBSERVER || WOLFSSL_WPAS_SMALL */ -#ifdef OPENSSL_EXTRA +#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) long wolfSSL_set_options(WOLFSSL* ssl, long op) { word16 haveRSA = 1; @@ -24648,6 +24719,10 @@ long wolfSSL_get_options(const WOLFSSL* ssl) return ssl->options.mask; } +#endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */ + +#ifdef OPENSSL_EXTRA + long wolfSSL_clear_options(WOLFSSL* ssl, long opt) { WOLFSSL_ENTER("SSL_clear_options"); @@ -26376,7 +26451,7 @@ int wolfSSL_BIO_printf(WOLFSSL_BIO* bio, const char* format, ...) return ret; } -#endif /* !defined(NO_FILESYSTEM) && defined (OPENSSL_EXTRA) */ +#endif /* !NO_FILESYSTEM && OPENSSL_EXTRA */ #if !defined(NO_FILESYSTEM) && defined(__clang__) #pragma clang diagnostic pop @@ -26535,6 +26610,9 @@ void wolfSSL_ASN1_GENERALIZEDTIME_free(WOLFSSL_ASN1_TIME* asn1Time) XMEMSET(asn1Time->data, 0, sizeof(asn1Time->data)); } +#endif /* OPENSSL_EXTRA */ + +#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) int wolfSSL_sk_num(WOLFSSL_STACK* sk) { WOLFSSL_ENTER("wolfSSL_sk_num"); @@ -26625,6 +26703,7 @@ void wolfSSL_sk_free(WOLFSSL_STACK* sk) wolfSSL_sk_GENERIC_free(sk); } } + /* Frees each node in the stack and frees the stack. * Does not free any internal members of the stack nodes. */ @@ -26693,7 +26772,9 @@ void wolfSSL_sk_GENERIC_free(WOLFSSL_STACK* sk) { wolfSSL_sk_GENERIC_pop_free(sk, NULL); } +#endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */ +#ifdef OPENSSL_EXTRA /* Free all nodes in a stack */ void wolfSSL_sk_pop_free(WOLF_STACK_OF(WOLFSSL_ASN1_OBJECT)* sk, @@ -26772,8 +26853,10 @@ void wolfSSL_sk_CONF_VALUE_free(WOLF_STACK_OF(WOLFSSL_CONF_VALUE)* sk) /* free head of stack */ XFREE(sk, NULL, DYNAMIC_TYPE_ASN1); } -#endif +#endif /* OPENSSL_ALL */ +#endif /* OPENSSL_EXTRA */ +#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) /* Creates and returns a new null stack. */ WOLFSSL_STACK* wolfSSL_sk_new_null(void) { @@ -26792,6 +26875,9 @@ WOLFSSL_STACK* wolfSSL_sk_new_null(void) return sk; } +#endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */ + +#ifdef OPENSSL_EXTRA /* frees the wolfSSL_BASIC_CONSTRAINTS object */ void wolfSSL_BASIC_CONSTRAINTS_free(WOLFSSL_BASIC_CONSTRAINTS *bc) @@ -26868,6 +26954,9 @@ void wolfSSL_CTX_sess_set_new_cb(WOLFSSL_CTX* ctx, #endif } +#endif /* OPENSSL_EXTRA || HAVE_EXT_CACHE */ + +#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) void wolfSSL_CTX_sess_set_remove_cb(WOLFSSL_CTX* ctx, void (*f)(WOLFSSL_CTX*, WOLFSSL_SESSION*)) { @@ -26880,7 +26969,7 @@ void wolfSSL_CTX_sess_set_remove_cb(WOLFSSL_CTX* ctx, void (*f)(WOLFSSL_CTX*, (void)f; #endif } -#endif /* OPENSSL_EXTRA || HAVE_EXT_CACHE */ +#endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */ #ifdef OPENSSL_EXTRA @@ -38560,7 +38649,7 @@ err: return (unsigned char*)dig; } } -#endif /* defined(WOLFSSL_SHA512) */ +#endif /* WOLFSSL_SHA512 */ #endif /* OPENSSL_EXTRA */ #ifndef WOLFCRYPT_ONLY @@ -38915,11 +39004,7 @@ err: void wolfSSL_set_verify_depth(WOLFSSL *ssl, int depth) { - #if !defined(OPENSSL_EXTRA) && !defined(NO_WOLFSSL_STUB) - (void)ssl; - (void)depth; - WOLFSSL_STUB("wolfSSL_set_verify_depth"); - #else + #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) WOLFSSL_ENTER("wolfSSL_set_verify_depth"); ssl->options.verifyDepth = (byte)depth; #endif @@ -38937,6 +39022,11 @@ err: } +#endif /* OPENSSL_ALL || HAVE_LIGHTY || WOLFSSL_MYSQL_COMPATIBLE || + HAVE_STUNNEL || WOLFSSL_NGINX || HAVE_POCO_LIB || WOLFSSL_HAPROXY */ + +#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) + /* looks up the DN given the location "loc". "loc" is the number indicating * the order that the DN was parsed as, 0 is first DN parsed. * @@ -39095,8 +39185,11 @@ err: } return &name->cnEntry; } +#endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */ - #ifndef NO_WOLFSSL_STUB +#ifdef OPENSSL_EXTRA + +#ifndef NO_WOLFSSL_STUB int wolfSSL_X509_check_private_key(WOLFSSL_X509 *x509, WOLFSSL_EVP_PKEY *key) { (void) x509; @@ -39116,16 +39209,7 @@ err: return NULL; } - - #endif - -#endif /* OPENSSL_ALL || HAVE_LIGHTY || WOLFSSL_MYSQL_COMPATIBLE || - HAVE_STUNNEL || WOLFSSL_NGINX || HAVE_POCO_LIB || WOLFSSL_HAPROXY */ -#endif /* OPENSSL_EXTRA */ - -#ifndef WOLFCRYPT_ONLY - -#ifdef OPENSSL_EXTRA +#endif /* wolfSSL uses negative values for error states. This function returns an * unsigned type so the value returned is the absolute value of the error. @@ -39178,19 +39262,21 @@ int wolfSSL_CTX_use_PrivateKey(WOLFSSL_CTX *ctx, WOLFSSL_EVP_PKEY *pkey) } #endif /* !NO_CERTS */ +#endif /* OPENSSL_EXTRA */ -#if defined(HAVE_EX_DATA) || defined(FORTRESS) +#if (defined(OPENSSL_EXTRA) && defined(HAVE_EX_DATA)) || defined(FORTRESS) || \ + defined(WOLFSSL_WPAS_SMALL) void* wolfSSL_CTX_get_ex_data(const WOLFSSL_CTX* ctx, int idx) { WOLFSSL_ENTER("wolfSSL_CTX_get_ex_data"); - #ifdef HAVE_EX_DATA +#ifdef HAVE_EX_DATA if(ctx != NULL) { return wolfSSL_CRYPTO_get_ex_data(&ctx->ex_data, idx); } - #else +#else (void)ctx; (void)idx; - #endif +#endif return NULL; } @@ -39246,8 +39332,10 @@ int wolfSSL_CTX_set_ex_data(WOLFSSL_CTX* ctx, int idx, void* data) #endif return WOLFSSL_FAILURE; } -#endif +#endif /* (OPENSSL_EXTRA && HAVE_EX_DATA) || FORTRESS || WOLFSSL_WPAS_SMALL */ + +#ifdef OPENSSL_EXTRA /* Returns char* to app data stored in ex[0]. * @@ -39275,6 +39363,9 @@ int wolfSSL_set_app_data(WOLFSSL *ssl, void* arg) { return wolfSSL_set_ex_data(ssl, 0, arg); } +#endif /* OPENSSL_EXTRA */ + +#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) int wolfSSL_set_ex_data(WOLFSSL* ssl, int idx, void* data) { @@ -39293,8 +39384,6 @@ int wolfSSL_set_ex_data(WOLFSSL* ssl, int idx, void* data) return WOLFSSL_FAILURE; } - - void* wolfSSL_get_ex_data(const WOLFSSL* ssl, int idx) { WOLFSSL_ENTER("wolfSSL_get_ex_data"); @@ -39310,6 +39399,10 @@ void* wolfSSL_get_ex_data(const WOLFSSL* ssl, int idx) return 0; } +#endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */ + +#ifdef OPENSSL_EXTRA + #ifndef NO_DSA WOLFSSL_DSA *wolfSSL_PEM_read_bio_DSAparams(WOLFSSL_BIO *bp, WOLFSSL_DSA **x, pem_password_cb *cb, void *u) @@ -40814,8 +40907,13 @@ void wolfSSL_print_all_errors_fp(XFILE fp) { (void)fp; } -#endif +#endif /* !NO_FILESYSTEM */ +#endif /* OPENSSL_ALL || OPENSSL_EXTRA || HAVE_STUNNEL || WOLFSSL_NGINX || + HAVE_LIGHTY || WOLFSSL_HAPROXY || WOLFSSL_OPENSSH */ + + +#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) || defined(FORTRESS) int wolfSSL_SESSION_set_ex_data(WOLFSSL_SESSION* session, int idx, void* data) { WOLFSSL_ENTER("wolfSSL_SESSION_set_ex_data"); @@ -40831,6 +40929,25 @@ int wolfSSL_SESSION_set_ex_data(WOLFSSL_SESSION* session, int idx, void* data) return WOLFSSL_FAILURE; } +void* wolfSSL_SESSION_get_ex_data(const WOLFSSL_SESSION* session, int idx) +{ + WOLFSSL_ENTER("wolfSSL_SESSION_get_ex_data"); +#ifdef HAVE_EX_DATA + if (session != NULL) { + return wolfSSL_CRYPTO_get_ex_data(&session->ex_data, idx); + } +#else + (void)session; + (void)idx; +#endif + return NULL; +} +#endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL || FORTRESS */ + +#if defined(OPENSSL_ALL) || (defined(OPENSSL_EXTRA) && (defined(HAVE_STUNNEL) || \ + defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY) || \ + defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_OPENSSH))) + int wolfSSL_SESSION_get_ex_new_index(long idx, void* data, void* cb1, void* cb2, CRYPTO_free_func* cb3) @@ -40849,21 +40966,6 @@ int wolfSSL_SESSION_get_ex_new_index(long idx, void* data, void* cb1, return WOLFSSL_FAILURE; } - -void* wolfSSL_SESSION_get_ex_data(const WOLFSSL_SESSION* session, int idx) -{ - WOLFSSL_ENTER("wolfSSL_SESSION_get_ex_data"); -#ifdef HAVE_EX_DATA - if (session != NULL) { - return wolfSSL_CRYPTO_get_ex_data(&session->ex_data, idx); - } -#else - (void)session; - (void)idx; -#endif - return NULL; -} - #ifndef NO_WOLFSSL_STUB int wolfSSL_CRYPTO_set_mem_ex_functions(void *(*m) (size_t, const char *, int), void *(*r) (void *, size_t, const char *, @@ -42876,6 +42978,7 @@ void wolfSSL_OPENSSL_config(char *config_name) #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY) \ || defined(OPENSSL_EXTRA) || defined(HAVE_LIGHTY) + int wolfSSL_X509_get_ex_new_index(int idx, void *arg, void *a, void *b, void *c) { static int x509_idx = 0; @@ -42889,7 +42992,9 @@ int wolfSSL_X509_get_ex_new_index(int idx, void *arg, void *a, void *b, void *c) return x509_idx++; } +#endif +#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) #if defined(HAVE_EX_DATA) || defined(FORTRESS) void* wolfSSL_CRYPTO_get_ex_data(const WOLFSSL_CRYPTO_EX_DATA* ex_data, int idx) { @@ -42920,37 +43025,41 @@ int wolfSSL_CRYPTO_set_ex_data(WOLFSSL_CRYPTO_EX_DATA* ex_data, int idx, void *d #endif return WOLFSSL_FAILURE; } -#endif /* defined(HAVE_EX_DATA) || defined(FORTRESS) */ +#endif /* HAVE_EX_DATA || FORTRESS */ void *wolfSSL_X509_get_ex_data(X509 *x509, int idx) { WOLFSSL_ENTER("wolfSSL_X509_get_ex_data"); - #ifdef HAVE_EX_DATA +#ifdef HAVE_EX_DATA if (x509 != NULL) { return wolfSSL_CRYPTO_get_ex_data(&x509->ex_data, idx); } - #else +#else (void)x509; (void)idx; - #endif +#endif return NULL; } int wolfSSL_X509_set_ex_data(X509 *x509, int idx, void *data) { WOLFSSL_ENTER("wolfSSL_X509_set_ex_data"); - #ifdef HAVE_EX_DATA +#ifdef HAVE_EX_DATA if (x509 != NULL) { return wolfSSL_CRYPTO_set_ex_data(&x509->ex_data, idx, data); } - #else +#else (void)x509; (void)idx; (void)data; - #endif +#endif return WOLFSSL_FAILURE; } +#endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */ + +#if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY) \ + || defined(OPENSSL_EXTRA) || defined(HAVE_LIGHTY) int wolfSSL_X509_NAME_digest(const WOLFSSL_X509_NAME *name, const WOLFSSL_EVP_MD *type, unsigned char *md, unsigned int *len) diff --git a/wolfssl/internal.h b/wolfssl/internal.h index e43949619..5cfcc9b85 100644 --- a/wolfssl/internal.h +++ b/wolfssl/internal.h @@ -2710,7 +2710,7 @@ struct WOLFSSL_CTX { #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448) short minEccKeySz; /* minimum ECC key size */ #endif -#if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) +#if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || defined(WOLFSSL_WPAS_SMALL) unsigned long mask; /* store SSL_OP_ flags */ #endif #ifdef OPENSSL_EXTRA @@ -2771,7 +2771,7 @@ struct WOLFSSL_CTX { pem_password_cb* passwd_cb; void* passwd_userdata; #endif -#if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) +#if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || defined(WOLFSSL_WPAS_SMALL) WOLFSSL_X509_STORE x509_store; /* points to ctx->cm */ WOLFSSL_X509_STORE* x509_store_pt; /* take ownership of external store */ byte readAhead; @@ -3347,7 +3347,7 @@ typedef struct Options { wc_psk_server_tls13_callback server_psk_tls13_cb; /* server callback */ #endif #endif /* NO_PSK */ -#if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) +#if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || defined(WOLFSSL_WPAS_SMALL) unsigned long mask; /* store SSL_OP_ flags */ #endif diff --git a/wolfssl/openssl/stack.h b/wolfssl/openssl/stack.h index 13e2c5d45..b13923916 100644 --- a/wolfssl/openssl/stack.h +++ b/wolfssl/openssl/stack.h @@ -28,6 +28,8 @@ extern "C" { #endif +#include + typedef void (*wolfSSL_sk_freefunc)(void *); WOLFSSL_API void wolfSSL_sk_GENERIC_pop_free(WOLFSSL_STACK* sk, wolfSSL_sk_freefunc); diff --git a/wolfssl/ssl.h b/wolfssl/ssl.h index 87bac7c45..c9b441b5a 100644 --- a/wolfssl/ssl.h +++ b/wolfssl/ssl.h @@ -506,7 +506,7 @@ struct WOLFSSL_X509_STORE { int cache; /* stunnel dereference */ WOLFSSL_CERT_MANAGER* cm; WOLFSSL_X509_LOOKUP lookup; -#ifdef OPENSSL_EXTRA +#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) int isDynamic; WOLFSSL_X509_VERIFY_PARAM* param; /* certificate validation parameter */ #endif @@ -516,12 +516,12 @@ struct WOLFSSL_X509_STORE { #ifdef HAVE_EX_DATA WOLFSSL_CRYPTO_EX_DATA ex_data; #endif -#if defined(OPENSSL_EXTRA) && defined(HAVE_CRL) +#if (defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)) && defined(HAVE_CRL) WOLFSSL_X509_CRL *crl; #endif }; -#ifdef OPENSSL_EXTRA +#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) #define WOLFSSL_USE_CHECK_TIME 0x2 #define WOLFSSL_NO_CHECK_TIME 0x200000 #define WOLFSSL_NO_WILDCARDS 0x4 @@ -534,7 +534,7 @@ struct WOLFSSL_X509_VERIFY_PARAM { unsigned int hostFlags; char ipasc[WOLFSSL_MAX_IPSTR]; }; -#endif +#endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */ typedef struct WOLFSSL_ALERT { int code; @@ -893,8 +893,8 @@ WOLFSSL_API int wolfSSL_CTX_set_max_early_data(WOLFSSL_CTX* ctx, WOLFSSL_API int wolfSSL_set_max_early_data(WOLFSSL* ssl, unsigned int sz); WOLFSSL_API int wolfSSL_write_early_data(WOLFSSL*, const void*, int, int*); WOLFSSL_API int wolfSSL_read_early_data(WOLFSSL*, void*, int, int*); -#endif -#endif +#endif /* WOLFSSL_EARLY_DATA */ +#endif /* WOLFSSL_TLS13 */ WOLFSSL_ABI WOLFSSL_API void wolfSSL_CTX_free(WOLFSSL_CTX*); WOLFSSL_ABI WOLFSSL_API void wolfSSL_free(WOLFSSL*); WOLFSSL_ABI WOLFSSL_API int wolfSSL_shutdown(WOLFSSL*); @@ -2045,7 +2045,8 @@ WOLFSSL_API WOLFSSL_ASN1_TIME *wolfSSL_ASN1_TIME_set(WOLFSSL_ASN1_TIME *s, time_ WOLFSSL_API int wolfSSL_sk_num(WOLFSSL_STACK* sk); WOLFSSL_API void* wolfSSL_sk_value(WOLFSSL_STACK* sk, int i); -#if defined(HAVE_EX_DATA) || defined(FORTRESS) +#if (defined(HAVE_EX_DATA) || defined(FORTRESS)) && \ + (defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)) WOLFSSL_API void* wolfSSL_CRYPTO_get_ex_data(const WOLFSSL_CRYPTO_EX_DATA* ex_data, int idx); WOLFSSL_API int wolfSSL_CRYPTO_set_ex_data(WOLFSSL_CRYPTO_EX_DATA* ex_data, int idx, @@ -3294,8 +3295,16 @@ WOLFSSL_API WOLFSSL_X509_NAME* wolfSSL_X509_NAME_new(void); WOLFSSL_API WOLFSSL_X509* wolfSSL_X509_dup(WOLFSSL_X509*); WOLFSSL_API WOLFSSL_X509_NAME* wolfSSL_X509_NAME_dup(WOLFSSL_X509_NAME*); WOLFSSL_API int wolfSSL_check_private_key(const WOLFSSL* ssl); +#endif /* !NO_CERTS */ +#endif /* OPENSSL_EXTRA || OPENSSL_ALL */ + +#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) WOLFSSL_API void* wolfSSL_X509_get_ext_d2i(const WOLFSSL_X509* x509, int nid, int* c, int* idx); +#endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */ + +#if defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL) +#ifndef NO_CERTS WOLFSSL_API int wolfSSL_X509_get_ext_count(const WOLFSSL_X509* passedCert); WOLFSSL_API int wolfSSL_X509_get_ext_by_NID(const WOLFSSL_X509 *x, int nid, int lastpos); WOLFSSL_API int wolfSSL_X509_add_ext(WOLFSSL_X509 *x, WOLFSSL_X509_EXTENSION *ex, int loc); @@ -3335,7 +3344,7 @@ WOLFSSL_API WOLFSSL_STACK* wolfSSL_sk_new_x509_ext(void); WOLFSSL_API WOLFSSL_ASN1_OBJECT* wolfSSL_X509_EXTENSION_get_object(WOLFSSL_X509_EXTENSION* ext); WOLFSSL_API WOLFSSL_ASN1_STRING* wolfSSL_X509_EXTENSION_get_data(WOLFSSL_X509_EXTENSION* ext); -#endif /* NO_CERTS */ +#endif /* !NO_CERTS */ WOLFSSL_API WOLFSSL_DH *wolfSSL_DSA_dup_DH(const WOLFSSL_DSA *r); @@ -3343,8 +3352,6 @@ WOLFSSL_API int wolfSSL_SESSION_get_master_key(const WOLFSSL_SESSION* ses, unsigned char* out, int outSz); WOLFSSL_API int wolfSSL_SESSION_get_master_key_length(const WOLFSSL_SESSION* ses); -WOLFSSL_API void wolfSSL_CTX_set_cert_store(WOLFSSL_CTX* ctx, - WOLFSSL_X509_STORE* str); WOLFSSL_API int wolfSSL_i2d_X509_bio(WOLFSSL_BIO* bio, WOLFSSL_X509* x509); #if !defined(NO_FILESYSTEM) WOLFSSL_API WOLFSSL_X509* wolfSSL_d2i_X509_fp(XFILE fp, @@ -3353,20 +3360,27 @@ WOLFSSL_API WOLFSSL_STACK* wolfSSL_X509_STORE_GetCerts(WOLFSSL_X509_STORE_CTX* s #endif WOLFSSL_API WOLFSSL_X509* wolfSSL_d2i_X509_bio(WOLFSSL_BIO* bio, WOLFSSL_X509** x509); -WOLFSSL_API WOLFSSL_X509_STORE* wolfSSL_CTX_get_cert_store(WOLFSSL_CTX* ctx); +#endif /* OPENSSL_EXTRA || OPENSSL_ALL */ +#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) +WOLFSSL_API void wolfSSL_CTX_set_cert_store(WOLFSSL_CTX* ctx, + WOLFSSL_X509_STORE* str); +WOLFSSL_API WOLFSSL_X509_STORE* wolfSSL_CTX_get_cert_store(WOLFSSL_CTX* ctx); +WOLFSSL_API size_t wolfSSL_get_server_random(const WOLFSSL *ssl, + unsigned char *out, size_t outlen); +WOLFSSL_API size_t wolfSSL_get_client_random(const WOLFSSL* ssl, + unsigned char* out, size_t outSz); +#endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */ + +#if defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL) WOLFSSL_API size_t wolfSSL_BIO_wpending(const WOLFSSL_BIO *bio); WOLFSSL_API size_t wolfSSL_BIO_ctrl_pending(WOLFSSL_BIO *b); -WOLFSSL_API size_t wolfSSL_get_server_random(const WOLFSSL *ssl, - unsigned char *out, size_t outlen); WOLFSSL_API int wolfSSL_get_server_tmp_key(const WOLFSSL*, WOLFSSL_EVP_PKEY**); WOLFSSL_API int wolfSSL_CTX_set_min_proto_version(WOLFSSL_CTX*, int); WOLFSSL_API int wolfSSL_CTX_set_max_proto_version(WOLFSSL_CTX*, int); -WOLFSSL_API size_t wolfSSL_get_client_random(const WOLFSSL* ssl, - unsigned char* out, size_t outSz); WOLFSSL_API int wolfSSL_CTX_use_PrivateKey(WOLFSSL_CTX *ctx, WOLFSSL_EVP_PKEY *pkey); WOLFSSL_API WOLFSSL_X509 *wolfSSL_PEM_read_bio_X509(WOLFSSL_BIO *bp, WOLFSSL_X509 **x, pem_password_cb *cb, void *u); WOLFSSL_API WOLFSSL_X509_CRL *wolfSSL_PEM_read_bio_X509_CRL(WOLFSSL_BIO *bp, @@ -3385,9 +3399,11 @@ WOLFSSL_API int wolfSSL_PEM_get_EVP_CIPHER_INFO(char* header, WOLFSSL_API int wolfSSL_PEM_do_header(EncryptedInfo* cipher, unsigned char* data, long* len, pem_password_cb* callback, void* ctx); +#endif /* OPENSSL_EXTRA || OPENSSL_ALL */ /*lighttp compatibility */ +#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) struct WOLFSSL_ASN1_BIT_STRING { int length; int type; @@ -3395,6 +3411,10 @@ struct WOLFSSL_ASN1_BIT_STRING { long flags; }; +WOLFSSL_API WOLFSSL_X509_NAME_ENTRY *wolfSSL_X509_NAME_get_entry(WOLFSSL_X509_NAME *name, int loc); +#endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */ + +#if defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL) #if defined(OPENSSL_EXTRA) \ || defined(OPENSSL_ALL) \ @@ -3414,7 +3434,6 @@ WOLFSSL_API void wolfSSL_set_verify_depth(WOLFSSL *ssl,int depth); WOLFSSL_API void* wolfSSL_get_app_data( const WOLFSSL *ssl); WOLFSSL_API int wolfSSL_set_app_data(WOLFSSL *ssl, void *arg); WOLFSSL_API WOLFSSL_ASN1_OBJECT * wolfSSL_X509_NAME_ENTRY_get_object(WOLFSSL_X509_NAME_ENTRY *ne); -WOLFSSL_API WOLFSSL_X509_NAME_ENTRY *wolfSSL_X509_NAME_get_entry(WOLFSSL_X509_NAME *name, int loc); WOLFSSL_API unsigned char *wolfSSL_SHA1(const unsigned char *d, size_t n, unsigned char *md); WOLFSSL_API unsigned char *wolfSSL_SHA256(const unsigned char *d, size_t n, unsigned char *md); WOLFSSL_API unsigned char *wolfSSL_SHA384(const unsigned char *d, size_t n, unsigned char *md); @@ -3468,12 +3487,8 @@ WOLFSSL_API int wolfSSL_X509_REQ_set_pubkey(WOLFSSL_X509 *req, #endif -#if defined(OPENSSL_ALL) \ - || defined(HAVE_STUNNEL) \ - || defined(WOLFSSL_NGINX) \ - || defined(WOLFSSL_HAPROXY) \ - || defined(OPENSSL_EXTRA) \ - || defined(HAVE_LIGHTY) +#if defined(OPENSSL_ALL) || defined(HAVE_STUNNEL) || defined(WOLFSSL_NGINX) \ + || defined(WOLFSSL_HAPROXY) || defined(OPENSSL_EXTRA) || defined(HAVE_LIGHTY) #include @@ -3550,7 +3565,9 @@ WOLFSSL_API int wolfSSL_sk_X509_OBJECT_num(const WOLF_STACK_OF(WOLFSSL_X509_OBJE WOLFSSL_API int wolfSSL_X509_NAME_print_ex(WOLFSSL_BIO*,WOLFSSL_X509_NAME*,int, unsigned long); +#endif /* OPENSSL_ALL || HAVE_STUNNEL || WOLFSSL_NGINX || WOLFSSL_HAPROXY || OPENSSL_EXTRA || HAVE_LIGHTY */ +#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) WOLFSSL_API WOLFSSL_ASN1_BIT_STRING* wolfSSL_ASN1_BIT_STRING_new(void); WOLFSSL_API void wolfSSL_ASN1_BIT_STRING_free(WOLFSSL_ASN1_BIT_STRING*); WOLFSSL_API WOLFSSL_ASN1_BIT_STRING* wolfSSL_X509_get0_pubkey_bitstr( @@ -3559,6 +3576,10 @@ WOLFSSL_API int wolfSSL_ASN1_BIT_STRING_get_bit( const WOLFSSL_ASN1_BIT_STRING*, int); WOLFSSL_API int wolfSSL_ASN1_BIT_STRING_set_bit( WOLFSSL_ASN1_BIT_STRING*, int, int); +#endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */ + +#if defined(OPENSSL_ALL) || defined(HAVE_STUNNEL) || defined(WOLFSSL_NGINX) \ + || defined(WOLFSSL_HAPROXY) || defined(OPENSSL_EXTRA) || defined(HAVE_LIGHTY) WOLFSSL_API int wolfSSL_CTX_add_session(WOLFSSL_CTX*, WOLFSSL_SESSION*); @@ -3571,17 +3592,22 @@ WOLFSSL_API WOLFSSL_X509* wolfSSL_sk_X509_value(WOLF_STACK_OF(WOLFSSL_X509)*, in WOLFSSL_API WOLFSSL_X509* wolfSSL_sk_X509_shift(WOLF_STACK_OF(WOLFSSL_X509)*); WOLFSSL_API void* wolfSSL_sk_X509_OBJECT_value(WOLF_STACK_OF(WOLFSSL_X509_OBJECT)*, int); +#endif /* OPENSSL_ALL || HAVE_STUNNEL || WOLFSSL_NGINX || WOLFSSL_HAPROXY || OPENSSL_EXTRA || HAVE_LIGHTY */ +#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) WOLFSSL_API void* wolfSSL_SESSION_get_ex_data(const WOLFSSL_SESSION*, int); WOLFSSL_API int wolfSSL_SESSION_set_ex_data(WOLFSSL_SESSION*, int, void*); +#endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */ + +#if defined(OPENSSL_ALL) || defined(HAVE_STUNNEL) || defined(WOLFSSL_NGINX) \ + || defined(WOLFSSL_HAPROXY) || defined(OPENSSL_EXTRA) || defined(HAVE_LIGHTY) WOLFSSL_API int wolfSSL_SESSION_get_ex_new_index(long,void*,void*,void*, CRYPTO_free_func*); WOLFSSL_API int wolfSSL_X509_NAME_get_sz(WOLFSSL_X509_NAME*); - WOLFSSL_API const unsigned char* wolfSSL_SESSION_get_id(WOLFSSL_SESSION*, unsigned int*); @@ -3624,10 +3650,13 @@ WOLFSSL_API WOLF_STACK_OF(WOLFSSL_X509_OBJECT)* WOLFSSL_API WOLFSSL_X509_OBJECT* wolfSSL_sk_X509_OBJECT_delete(WOLF_STACK_OF(WOLFSSL_X509_OBJECT)* sk, int i); WOLFSSL_API void wolfSSL_X509_OBJECT_free(WOLFSSL_X509_OBJECT *a); - -WOLFSSL_API void wolfSSL_sk_X509_pop_free(WOLF_STACK_OF(WOLFSSL_X509)* sk, void (*f) (WOLFSSL_X509*)); #endif /* OPENSSL_ALL || HAVE_STUNNEL || WOLFSSL_NGINX || WOLFSSL_HAPROXY || HAVE_LIGHTY */ +#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) +#include +WOLFSSL_API void wolfSSL_sk_X509_pop_free(WOLF_STACK_OF(WOLFSSL_X509)* sk, void (*f) (WOLFSSL_X509*)); +#endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */ + #if defined(OPENSSL_EXTRA) && defined(HAVE_ECC) WOLFSSL_API int wolfSSL_CTX_set1_curves_list(WOLFSSL_CTX* ctx, const char* names); WOLFSSL_API int wolfSSL_set1_curves_list(WOLFSSL* ssl, const char* names); @@ -3688,14 +3717,17 @@ WOLFSSL_LOCAL char* wolfSSL_get_ocsp_url(WOLFSSL* ssl); WOLFSSL_API int wolfSSL_set_ocsp_url(WOLFSSL* ssl, char* url); #endif +#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) +WOLFSSL_API void *wolfSSL_X509_get_ex_data(WOLFSSL_X509 *x509, int idx); +WOLFSSL_API int wolfSSL_X509_set_ex_data(WOLFSSL_X509 *x509, int idx, + void *data); +#endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */ + #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY) \ || defined(OPENSSL_EXTRA) || defined(HAVE_LIGHTY) WOLFSSL_API WOLF_STACK_OF(WOLFSSL_CIPHER) *wolfSSL_get_ciphers_compat(const WOLFSSL *ssl); WOLFSSL_API int wolfSSL_X509_get_ex_new_index(int idx, void *arg, void *a, void *b, void *c); -WOLFSSL_API void *wolfSSL_X509_get_ex_data(WOLFSSL_X509 *x509, int idx); -WOLFSSL_API int wolfSSL_X509_set_ex_data(WOLFSSL_X509 *x509, int idx, - void *data); WOLFSSL_API int wolfSSL_X509_NAME_digest(const WOLFSSL_X509_NAME *data, const WOLFSSL_EVP_MD *type, unsigned char *md, unsigned int *len); @@ -3745,13 +3777,13 @@ WOLFSSL_API int wolfSSL_X509_check_issued(WOLFSSL_X509 *issuer, WOLFSSL_API char* wolfSSL_sk_WOLFSSL_STRING_value( WOLF_STACK_OF(WOLFSSL_STRING)* strings, int idx); -#endif /* HAVE_OCSP */ +#endif /* HAVE_OCSP || OPENSSL_EXTRA || OPENSSL_ALL || WOLFSSL_NGINX || WOLFSSL_HAPROXY */ WOLFSSL_API int PEM_write_bio_WOLFSSL_X509(WOLFSSL_BIO *bio, WOLFSSL_X509 *cert); #endif /* OPENSSL_ALL || WOLFSSL_NGINX || WOLFSSL_HAPROXY || - OPENSSL_EXTRA || HAVE_LIGHTY*/ + OPENSSL_EXTRA || HAVE_LIGHTY */ WOLFSSL_API void wolfSSL_get0_alpn_selected(const WOLFSSL *ssl, const unsigned char **data, unsigned int *len); From 82c86447e7ccf7dd5070fd9d5430bd7cecf72d59 Mon Sep 17 00:00:00 2001 From: kaleb-himes Date: Fri, 8 May 2020 16:18:30 -0600 Subject: [PATCH 091/298] Fix failing build for rsa_verify_only example --- wolfcrypt/src/sp_int.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/wolfcrypt/src/sp_int.c b/wolfcrypt/src/sp_int.c index 88ba48c1c..e53bc93fc 100644 --- a/wolfcrypt/src/sp_int.c +++ b/wolfcrypt/src/sp_int.c @@ -498,7 +498,7 @@ void sp_clamp(sp_int* a) a->used = i + 1; } -#if !defined(WOLFSSL_RSA_VERIFY_ONLY) || (!defined(NO_DH) || defined(HAVE_ECC)) +#if defined(WOLFSSL_RSA_VERIFY_ONLY) || (!defined(NO_DH) || defined(HAVE_ECC)) /* Grow big number to be able to hold l digits. * This function does nothing as the number of digits is fixed. * @@ -516,7 +516,9 @@ int sp_grow(sp_int* a, int l) return err; } +#endif +#if !defined(WOLFSSL_RSA_VERIFY_ONLY) || (!defined(NO_DH) || defined(HAVE_ECC)) /* Sub a one digit number from the big number. * * a SP integer. From 5dfc36d32a123b56190668bafb56a15dab458148 Mon Sep 17 00:00:00 2001 From: Hideki Miyazaki Date: Sat, 9 May 2020 17:03:17 +0900 Subject: [PATCH 092/298] added WOLFSSL_LEAVE for measuring peak memory script --- src/ssl.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/src/ssl.c b/src/ssl.c index 1c203ab25..7c25d8458 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -13600,6 +13600,7 @@ int wolfSSL_set_compression(WOLFSSL* ssl) word32 flags) { int verify; + int ret = WOLFSSL_FAILURE; WOLFSSL_ENTER("wolfSSL_CTX_load_verify_buffer_ex"); @@ -13608,11 +13609,13 @@ int wolfSSL_set_compression(WOLFSSL* ssl) verify = VERIFY_SKIP_DATE; if (format == WOLFSSL_FILETYPE_PEM) - return ProcessChainBuffer(ctx, in, sz, format, CA_TYPE, NULL, + ret = ProcessChainBuffer(ctx, in, sz, format, CA_TYPE, NULL, verify); else - return ProcessBuffer(ctx, in, sz, format, CA_TYPE, NULL, NULL, + ret = ProcessBuffer(ctx, in, sz, format, CA_TYPE, NULL, NULL, userChain, verify); + WOLFSSL_LEAVE("wolfSSL_CTX_load_verify_buffer_ex", ret); + return ret; } /* wolfSSL extension allows DER files to be loaded from buffers as well */ @@ -13658,18 +13661,26 @@ int wolfSSL_set_compression(WOLFSSL* ssl) int wolfSSL_CTX_use_certificate_buffer(WOLFSSL_CTX* ctx, const unsigned char* in, long sz, int format) { + int ret = WOLFSSL_FAILURE; + WOLFSSL_ENTER("wolfSSL_CTX_use_certificate_buffer"); - return ProcessBuffer(ctx, in, sz, format, CERT_TYPE, NULL, NULL, 0, + ret = ProcessBuffer(ctx, in, sz, format, CERT_TYPE, NULL, NULL, 0, GET_VERIFY_SETTING_CTX(ctx)); + WOLFSSL_LEAVE("wolfSSL_CTX_use_certificate_buffer", ret); + return ret; } int wolfSSL_CTX_use_PrivateKey_buffer(WOLFSSL_CTX* ctx, const unsigned char* in, long sz, int format) { + int ret = WOLFSSL_FAILURE; + WOLFSSL_ENTER("wolfSSL_CTX_use_PrivateKey_buffer"); - return ProcessBuffer(ctx, in, sz, format, PRIVATEKEY_TYPE, NULL, NULL, + ret = ProcessBuffer(ctx, in, sz, format, PRIVATEKEY_TYPE, NULL, NULL, 0, GET_VERIFY_SETTING_CTX(ctx)); + WOLFSSL_LEAVE("wolfSSL_CTX_use_PrivateKey_buffer", ret); + return ret; } #ifdef HAVE_PKCS11 From ed4899dd91a3901b30f874f7fde9f7a1d1a041a4 Mon Sep 17 00:00:00 2001 From: Sean Parkinson Date: Mon, 11 May 2020 13:18:50 +1000 Subject: [PATCH 093/298] Only check downgrade when TLS 1.2 and no flag set The flag, SSL_OP_NO_TLSv1_2, indicates not to negotiate TLS v1.2. --- src/internal.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/internal.c b/src/internal.c index 8c6f62a63..2e8715d2f 100644 --- a/src/internal.c +++ b/src/internal.c @@ -20238,7 +20238,11 @@ exit_dpk: else #endif if (ssl->ctx->method->version.major == SSLv3_MAJOR && - ssl->ctx->method->version.minor == TLSv1_2_MINOR) { + ssl->ctx->method->version.minor == TLSv1_2_MINOR +#ifdef OPENSSL_EXTRA + && (wolfSSL_get_options(ssl) & SSL_OP_NO_TLSv1_2) == 0 +#endif + ) { /* TLS v1.2 capable client not allowed to downgrade when * connecting to TLS v1.2 capable server. */ @@ -24230,6 +24234,9 @@ static int DoSessionTicket(WOLFSSL* ssl, const byte* input, word32* inOutIdx, #endif if (ssl->ctx->method->version.major == SSLv3_MAJOR && ssl->ctx->method->version.minor == TLSv1_2_MINOR && +#ifdef OPENSSL_EXTRA + (wolfSSL_get_options(ssl) & SSL_OP_NO_TLSv1_2) == 0 && +#endif !IsAtLeastTLSv1_2(ssl)) { /* TLS v1.2 capable server downgraded. */ XMEMCPY(output + idx + RAN_LEN - (TLS13_DOWNGRADE_SZ + 1), From 3d2cbdd3e8a1c0f8afb07a03ecef719a23c446e2 Mon Sep 17 00:00:00 2001 From: Juliusz Sosinowicz Date: Tue, 12 May 2020 13:48:59 +0200 Subject: [PATCH 094/298] Fix LUT cache implementation - Make sure that the cache is actually set (and not just depend on the LRU_count) - test_wolfSSL_EC should also be run without ECC_SHAMIR --- tests/api.c | 17 +++++++++++++---- wolfcrypt/src/ecc.c | 27 +++++++++++++++++---------- 2 files changed, 30 insertions(+), 14 deletions(-) diff --git a/tests/api.c b/tests/api.c index 3c291b928..91f391d6a 100644 --- a/tests/api.c +++ b/tests/api.c @@ -1789,7 +1789,7 @@ static int test_wolfSSL_SetMinVersion(void) # if defined(OPENSSL_EXTRA) static void test_wolfSSL_EC(void) { -#if defined(HAVE_ECC) && defined(ECC_SHAMIR) +#if defined(HAVE_ECC) BN_CTX *ctx; EC_GROUP *group; EC_POINT *Gxy, *new_point, *set_point; @@ -1853,14 +1853,23 @@ static void test_wolfSSL_EC(void) #ifndef HAVE_SELFTEST /* perform point multiplication */ AssertIntEQ(EC_POINT_mul(group, new_point, Gx, Gxy, k, ctx), WOLFSSL_SUCCESS); + AssertIntEQ(BN_is_zero(new_point->X), 0); + AssertIntEQ(BN_is_zero(new_point->Y), 0); + AssertIntEQ(BN_is_zero(new_point->Z), 0); AssertIntEQ(EC_POINT_mul(group, new_point, NULL, Gxy, k, ctx), WOLFSSL_SUCCESS); + AssertIntEQ(BN_is_zero(new_point->X), 0); + AssertIntEQ(BN_is_zero(new_point->Y), 0); + AssertIntEQ(BN_is_zero(new_point->Z), 0); AssertIntEQ(EC_POINT_mul(group, new_point, Gx, NULL, NULL, ctx), WOLFSSL_SUCCESS); + AssertIntEQ(BN_is_zero(new_point->X), 0); + AssertIntEQ(BN_is_zero(new_point->Y), 0); + AssertIntEQ(BN_is_zero(new_point->Z), 0); #else AssertIntEQ(EC_POINT_set_affine_coordinates_GFp(group, new_point, Gx, Gy, ctx), WOLFSSL_SUCCESS); -#endif - - /* check if point X coordinate is zero */ AssertIntEQ(BN_is_zero(new_point->X), 0); + AssertIntEQ(BN_is_zero(new_point->Y), 0); + AssertIntEQ(BN_is_zero(new_point->Z), 0); +#endif /* Force non-affine coordinates */ AssertIntEQ(BN_add(new_point->Z, (WOLFSSL_BIGNUM*)BN_value_one(), diff --git a/wolfcrypt/src/ecc.c b/wolfcrypt/src/ecc.c index 22db7f167..5c561a1ee 100644 --- a/wolfcrypt/src/ecc.c +++ b/wolfcrypt/src/ecc.c @@ -8092,6 +8092,7 @@ int wc_ecc_sig_size(ecc_key* key) typedef struct { ecc_point* g; /* cached COPY of base point */ ecc_point* LUT[1U<= 0 && fp_cache[idx1].lru_count == 2) { + /* if it's >=2 build the LUT, if it's higher just use the LUT */ + if (idx1 >= 0 && fp_cache[idx1].lru_count >= 2 && !fp_cache[idx1].LUT_set) { /* compute mp */ err = mp_montgomery_setup(modulus, &mp); @@ -9443,8 +9449,8 @@ int ecc_mul2add(ecc_point* A, mp_int* kA, } if (err == MP_OKAY) { - /* if it's 2 build the LUT, if it's higher just use the LUT */ - if (idx2 >= 0 && fp_cache[idx2].lru_count == 2) { + /* if it's >=2 build the LUT, if it's higher just use the LUT */ + if (idx2 >= 0 && fp_cache[idx2].lru_count >= 2 && !fp_cache[idx2].LUT_set) { if (mpInit == 0) { /* compute mp */ err = mp_montgomery_setup(modulus, &mp); @@ -9462,8 +9468,8 @@ int ecc_mul2add(ecc_point* A, mp_int* kA, if (err == MP_OKAY) { - if (idx1 >=0 && idx2 >= 0 && fp_cache[idx1].lru_count >= 2 && - fp_cache[idx2].lru_count >= 2) { + if (idx1 >=0 && idx2 >= 0 && fp_cache[idx1].LUT_set && + fp_cache[idx2].LUT_set) { if (mpInit == 0) { /* compute mp */ err = mp_montgomery_setup(modulus, &mp); @@ -9540,7 +9546,7 @@ int wc_ecc_mulmod_ex(mp_int* k, ecc_point *G, ecc_point *R, mp_int* a, if (err == MP_OKAY) { /* if it's 2 build the LUT, if it's higher just use the LUT */ - if (idx >= 0 && fp_cache[idx].lru_count == 2) { + if (idx >= 0 && fp_cache[idx].lru_count >= 2 && !fp_cache[idx].LUT_set) { /* compute mp */ err = mp_montgomery_setup(modulus, &mp); @@ -9557,7 +9563,7 @@ int wc_ecc_mulmod_ex(mp_int* k, ecc_point *G, ecc_point *R, mp_int* a, } if (err == MP_OKAY) { - if (idx >= 0 && fp_cache[idx].lru_count >= 2) { + if (idx >= 0 && fp_cache[idx].LUT_set) { if (mpSetup == 0) { /* compute mp */ err = mp_montgomery_setup(modulus, &mp); @@ -9609,6 +9615,7 @@ static void wc_ecc_fp_free_cache(void) wc_ecc_del_point(fp_cache[x].g); fp_cache[x].g = NULL; mp_clear(&fp_cache[x].mu); + fp_cache[x].LUT_set = 0; fp_cache[x].lru_count = 0; fp_cache[x].lock = 0; } From 479b54e78e35dac1d682f655b1bc902be8950f85 Mon Sep 17 00:00:00 2001 From: Sean Parkinson Date: Tue, 12 May 2020 23:14:57 +1000 Subject: [PATCH 095/298] Fix div word in SP ARM32 --- wolfcrypt/src/sp_arm32.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/wolfcrypt/src/sp_arm32.c b/wolfcrypt/src/sp_arm32.c index d500965f9..8bdc61501 100644 --- a/wolfcrypt/src/sp_arm32.c +++ b/wolfcrypt/src/sp_arm32.c @@ -4353,6 +4353,10 @@ static sp_digit div_2048_word_32(sp_digit d1, sp_digit d0, sp_digit div) "subs r4, %[d0], r4\n\t" "sbc r5, %[d1], r5\n\t" "add %[r], %[r], r5\n\t" + "umull r4, r5, %[r], %[div]\n\t" + "subs r4, %[d0], r4\n\t" + "sbc r5, %[d1], r5\n\t" + "add %[r], %[r], r5\n\t" "subs r8, %[div], r4\n\t" "sbc r8, r8, r8\n\t" "sub %[r], %[r], r8\n\t" @@ -6177,6 +6181,10 @@ static sp_digit div_2048_word_64(sp_digit d1, sp_digit d0, sp_digit div) "subs r4, %[d0], r4\n\t" "sbc r5, %[d1], r5\n\t" "add %[r], %[r], r5\n\t" + "umull r4, r5, %[r], %[div]\n\t" + "subs r4, %[d0], r4\n\t" + "sbc r5, %[d1], r5\n\t" + "add %[r], %[r], r5\n\t" "subs r8, %[div], r4\n\t" "sbc r8, r8, r8\n\t" "sub %[r], %[r], r8\n\t" @@ -14928,6 +14936,10 @@ static sp_digit div_3072_word_48(sp_digit d1, sp_digit d0, sp_digit div) "subs r4, %[d0], r4\n\t" "sbc r5, %[d1], r5\n\t" "add %[r], %[r], r5\n\t" + "umull r4, r5, %[r], %[div]\n\t" + "subs r4, %[d0], r4\n\t" + "sbc r5, %[d1], r5\n\t" + "add %[r], %[r], r5\n\t" "subs r8, %[div], r4\n\t" "sbc r8, r8, r8\n\t" "sub %[r], %[r], r8\n\t" @@ -17376,6 +17388,10 @@ static sp_digit div_3072_word_96(sp_digit d1, sp_digit d0, sp_digit div) "subs r4, %[d0], r4\n\t" "sbc r5, %[d1], r5\n\t" "add %[r], %[r], r5\n\t" + "umull r4, r5, %[r], %[div]\n\t" + "subs r4, %[d0], r4\n\t" + "sbc r5, %[d1], r5\n\t" + "add %[r], %[r], r5\n\t" "subs r8, %[div], r4\n\t" "sbc r8, r8, r8\n\t" "sub %[r], %[r], r8\n\t" @@ -69645,6 +69661,10 @@ static sp_digit div_4096_word_128(sp_digit d1, sp_digit d0, sp_digit div) "subs r4, %[d0], r4\n\t" "sbc r5, %[d1], r5\n\t" "add %[r], %[r], r5\n\t" + "umull r4, r5, %[r], %[div]\n\t" + "subs r4, %[d0], r4\n\t" + "sbc r5, %[d1], r5\n\t" + "add %[r], %[r], r5\n\t" "subs r8, %[div], r4\n\t" "sbc r8, r8, r8\n\t" "sub %[r], %[r], r8\n\t" @@ -79741,6 +79761,10 @@ static sp_digit div_256_word_8(sp_digit d1, sp_digit d0, sp_digit div) "subs r4, %[d0], r4\n\t" "sbc r5, %[d1], r5\n\t" "add %[r], %[r], r5\n\t" + "umull r4, r5, %[r], %[div]\n\t" + "subs r4, %[d0], r4\n\t" + "sbc r5, %[d1], r5\n\t" + "add %[r], %[r], r5\n\t" "subs r8, %[div], r4\n\t" "sbc r8, r8, r8\n\t" "sub %[r], %[r], r8\n\t" @@ -87913,6 +87937,10 @@ static sp_digit div_384_word_12(sp_digit d1, sp_digit d0, sp_digit div) "subs r4, %[d0], r4\n\t" "sbc r5, %[d1], r5\n\t" "add %[r], %[r], r5\n\t" + "umull r4, r5, %[r], %[div]\n\t" + "subs r4, %[d0], r4\n\t" + "sbc r5, %[d1], r5\n\t" + "add %[r], %[r], r5\n\t" "subs r8, %[div], r4\n\t" "sbc r8, r8, r8\n\t" "sub %[r], %[r], r8\n\t" From 786e21b107cc381b4548ebe9c789ee6e40108d8b Mon Sep 17 00:00:00 2001 From: Sean Parkinson Date: Tue, 12 May 2020 23:28:39 +1000 Subject: [PATCH 096/298] Fix SP Cortex-M ASM comments --- wolfcrypt/src/sp_cortexm.c | 324 ++++++++++++++++++------------------- 1 file changed, 162 insertions(+), 162 deletions(-) diff --git a/wolfcrypt/src/sp_cortexm.c b/wolfcrypt/src/sp_cortexm.c index ec2a5003b..a46954f69 100644 --- a/wolfcrypt/src/sp_cortexm.c +++ b/wolfcrypt/src/sp_cortexm.c @@ -13826,10 +13826,10 @@ static int sp_256_mod_mul_norm_8(sp_digit* r, const sp_digit* a, const sp_digit* "ldr r8, [%[a], #20]\n\t" "ldr r9, [%[a], #24]\n\t" "ldr r10, [%[a], #28]\n\t" - "# Clear overflow and underflow\n\t" + /* Clear overflow and underflow */ "mov r14, #0\n\t" "mov r12, #0\n\t" - "# t[0] = 1 1 0 -1 -1 -1 -1 0\n\t" + /* t[0] = 1 1 0 -1 -1 -1 -1 0 */ "adds r11, r2, r3\n\t" "adc r14, r14, #0\n\t" "subs r11, r11, r5\n\t" @@ -13840,11 +13840,11 @@ static int sp_256_mod_mul_norm_8(sp_digit* r, const sp_digit* a, const sp_digit* "sbc r12, r12, #0\n\t" "subs r11, r11, r9\n\t" "sbc r12, r12, #0\n\t" - "# Store t[0]\n\t" + /* Store t[0] */ "str r11, [sp, #0]\n\t" "neg r12, r12\n\t" "mov r11, #0\n\t" - "# t[1] = 0 1 1 0 -1 -1 -1 -1\n\t" + /* t[1] = 0 1 1 0 -1 -1 -1 -1 */ "adds r14, r14, r3\n\t" "adc r11, r11, #0\n\t" "adds r14, r14, r4\n\t" @@ -13860,11 +13860,11 @@ static int sp_256_mod_mul_norm_8(sp_digit* r, const sp_digit* a, const sp_digit* "sbc r12, r12, #0\n\t" "subs r14, r14, r10\n\t" "sbc r12, r12, #0\n\t" - "# Store t[1]\n\t" + /* Store t[1] */ "str r14, [sp, #4]\n\t" "neg r12, r12\n\t" "mov r14, #0\n\t" - "# t[2] = 0 0 1 1 0 -1 -1 -1\n\t" + /* t[2] = 0 0 1 1 0 -1 -1 -1 */ "adds r11, r11, r4\n\t" "adc r14, r14, #0\n\t" "adds r11, r11, r5\n\t" @@ -13878,11 +13878,11 @@ static int sp_256_mod_mul_norm_8(sp_digit* r, const sp_digit* a, const sp_digit* "sbc r12, r12, #0\n\t" "subs r11, r11, r10\n\t" "sbc r12, r12, #0\n\t" - "# Store t[2]\n\t" + /* Store t[2] */ "str r11, [sp, #8]\n\t" "neg r12, r12\n\t" "mov r11, #0\n\t" - "# t[3] = -1 -1 0 2 2 1 0 -1\n\t" + /* t[3] = -1 -1 0 2 2 1 0 -1 */ "adds r14, r14, r5\n\t" "adc r11, r11, #0\n\t" "adds r14, r14, r5\n\t" @@ -13902,11 +13902,11 @@ static int sp_256_mod_mul_norm_8(sp_digit* r, const sp_digit* a, const sp_digit* "sbc r12, r12, #0\n\t" "subs r14, r14, r10\n\t" "sbc r12, r12, #0\n\t" - "# Store t[3]\n\t" + /* Store t[3] */ "str r14, [sp, #12]\n\t" "neg r12, r12\n\t" "mov r14, #0\n\t" - "# t[4] = 0 -1 -1 0 2 2 1 0\n\t" + /* t[4] = 0 -1 -1 0 2 2 1 0 */ "adds r11, r11, r6\n\t" "adc r14, r14, #0\n\t" "adds r11, r11, r6\n\t" @@ -13924,11 +13924,11 @@ static int sp_256_mod_mul_norm_8(sp_digit* r, const sp_digit* a, const sp_digit* "sbc r12, r12, #0\n\t" "subs r11, r11, r4\n\t" "sbc r12, r12, #0\n\t" - "# Store t[4]\n\t" + /* Store t[4] */ "str r11, [sp, #16]\n\t" "neg r12, r12\n\t" "mov r11, #0\n\t" - "# t[5] = 0 0 -1 -1 0 2 2 1\n\t" + /* t[5] = 0 0 -1 -1 0 2 2 1 */ "adds r14, r14, r8\n\t" "adc r11, r11, #0\n\t" "adds r14, r14, r8\n\t" @@ -13946,11 +13946,11 @@ static int sp_256_mod_mul_norm_8(sp_digit* r, const sp_digit* a, const sp_digit* "sbc r12, r12, #0\n\t" "subs r14, r14, r5\n\t" "sbc r12, r12, #0\n\t" - "# Store t[5]\n\t" + /* Store t[5] */ "str r14, [sp, #20]\n\t" "neg r12, r12\n\t" "mov r14, #0\n\t" - "# t[6] = -1 -1 0 0 0 1 3 2\n\t" + /* t[6] = -1 -1 0 0 0 1 3 2 */ "adds r11, r11, r8\n\t" "adc r14, r14, #0\n\t" "adds r11, r11, r9\n\t" @@ -13970,11 +13970,11 @@ static int sp_256_mod_mul_norm_8(sp_digit* r, const sp_digit* a, const sp_digit* "sbc r12, r12, #0\n\t" "subs r11, r11, r3\n\t" "sbc r12, r12, #0\n\t" - "# Store t[6]\n\t" + /* Store t[6] */ "mov r9, r11\n\t" "neg r12, r12\n\t" "mov r11, #0\n\t" - "# t[7] = 1 0 -1 -1 -1 -1 0 3\n\t" + /* t[7] = 1 0 -1 -1 -1 -1 0 3 */ "adds r14, r14, r2\n\t" "adc r11, r11, #0\n\t" "adds r14, r14, r10\n\t" @@ -13994,8 +13994,8 @@ static int sp_256_mod_mul_norm_8(sp_digit* r, const sp_digit* a, const sp_digit* "sbc r12, r12, #0\n\t" "subs r14, r14, r8\n\t" "sbc r12, r12, #0\n\t" - "# Store t[7]\n\t" - "# Load intermediate\n\t" + /* Store t[7] */ + /* Load intermediate */ "ldr r2, [sp, #0]\n\t" "ldr r3, [sp, #4]\n\t" "ldr r4, [sp, #8]\n\t" @@ -14003,8 +14003,8 @@ static int sp_256_mod_mul_norm_8(sp_digit* r, const sp_digit* a, const sp_digit* "ldr r6, [sp, #16]\n\t" "ldr r8, [sp, #20]\n\t" "neg r12, r12\n\t" - "# Add overflow\n\t" - "# Subtract underflow - add neg underflow\n\t" + /* Add overflow */ + /* Subtract underflow - add neg underflow */ "adds r2, r2, r11\n\t" "adcs r3, r3, #0\n\t" "adcs r4, r4, #0\n\t" @@ -14013,8 +14013,8 @@ static int sp_256_mod_mul_norm_8(sp_digit* r, const sp_digit* a, const sp_digit* "adcs r8, r8, #0\n\t" "adcs r9, r9, r12\n\t" "adc r14, r14, r11\n\t" - "# Subtract overflow\n\t" - "# Add underflow - subtract neg underflow\n\t" + /* Subtract overflow */ + /* Add underflow - subtract neg underflow */ "subs r2, r2, r12\n\t" "sbcs r3, r3, #0\n\t" "sbcs r4, r4, #0\n\t" @@ -14023,7 +14023,7 @@ static int sp_256_mod_mul_norm_8(sp_digit* r, const sp_digit* a, const sp_digit* "sbcs r8, r8, #0\n\t" "sbcs r9, r9, r11\n\t" "sbc r14, r14, r12\n\t" - "# Store result\n\t" + /* Store result */ "str r2, [%[r], #0]\n\t" "str r3, [%[r], #4]\n\t" "str r4, [%[r], #8]\n\t" @@ -14243,18 +14243,18 @@ SP_NOINLINE static void sp_256_mont_mul_8(sp_digit* r, const sp_digit* a, const __asm__ __volatile__ ( "sub sp, sp, #68\n\t" "mov r5, #0\n\t" - "# A[0] * B[0]\n\t" + /* A[0] * B[0] */ "ldr r6, [%[a], #0]\n\t" "ldr r8, [%[b], #0]\n\t" "umull r9, r10, r6, r8\n\t" "str r9, [sp, #0]\n\t" - "# A[0] * B[1]\n\t" + /* A[0] * B[1] */ "ldr r6, [%[a], #0]\n\t" "ldr r8, [%[b], #4]\n\t" "umull r3, r4, r6, r8\n\t" "adds r10, r3, r10\n\t" "adc r11, r4, #0\n\t" - "# A[1] * B[0]\n\t" + /* A[1] * B[0] */ "ldr r6, [%[a], #4]\n\t" "ldr r8, [%[b], #0]\n\t" "umull r3, r4, r6, r8\n\t" @@ -14262,20 +14262,20 @@ SP_NOINLINE static void sp_256_mont_mul_8(sp_digit* r, const sp_digit* a, const "adcs r11, r4, r11\n\t" "adc r14, r5, #0\n\t" "str r10, [sp, #4]\n\t" - "# A[0] * B[2]\n\t" + /* A[0] * B[2] */ "ldr r6, [%[a], #0]\n\t" "ldr r8, [%[b], #8]\n\t" "umull r3, r4, r6, r8\n\t" "adds r11, r3, r11\n\t" "adc r14, r4, r14\n\t" - "# A[1] * B[1]\n\t" + /* A[1] * B[1] */ "ldr r6, [%[a], #4]\n\t" "ldr r8, [%[b], #4]\n\t" "umull r3, r4, r6, r8\n\t" "adds r11, r3, r11\n\t" "adcs r14, r4, r14\n\t" "adc r9, r5, #0\n\t" - "# A[2] * B[0]\n\t" + /* A[2] * B[0] */ "ldr r6, [%[a], #8]\n\t" "ldr r8, [%[b], #0]\n\t" "umull r3, r4, r6, r8\n\t" @@ -14283,28 +14283,28 @@ SP_NOINLINE static void sp_256_mont_mul_8(sp_digit* r, const sp_digit* a, const "adcs r14, r4, r14\n\t" "adc r9, r5, r9\n\t" "str r11, [sp, #8]\n\t" - "# A[0] * B[3]\n\t" + /* A[0] * B[3] */ "ldr r6, [%[a], #0]\n\t" "ldr r8, [%[b], #12]\n\t" "umull r3, r4, r6, r8\n\t" "adds r14, r3, r14\n\t" "adcs r9, r4, r9\n\t" "adc r10, r5, #0\n\t" - "# A[1] * B[2]\n\t" + /* A[1] * B[2] */ "ldr r6, [%[a], #4]\n\t" "ldr r8, [%[b], #8]\n\t" "umull r3, r4, r6, r8\n\t" "adds r14, r3, r14\n\t" "adcs r9, r4, r9\n\t" "adc r10, r5, r10\n\t" - "# A[2] * B[1]\n\t" + /* A[2] * B[1] */ "ldr r6, [%[a], #8]\n\t" "ldr r8, [%[b], #4]\n\t" "umull r3, r4, r6, r8\n\t" "adds r14, r3, r14\n\t" "adcs r9, r4, r9\n\t" "adc r10, r5, r10\n\t" - "# A[3] * B[0]\n\t" + /* A[3] * B[0] */ "ldr r6, [%[a], #12]\n\t" "ldr r8, [%[b], #0]\n\t" "umull r3, r4, r6, r8\n\t" @@ -14312,35 +14312,35 @@ SP_NOINLINE static void sp_256_mont_mul_8(sp_digit* r, const sp_digit* a, const "adcs r9, r4, r9\n\t" "adc r10, r5, r10\n\t" "str r14, [sp, #12]\n\t" - "# A[0] * B[4]\n\t" + /* A[0] * B[4] */ "ldr r6, [%[a], #0]\n\t" "ldr r8, [%[b], #16]\n\t" "umull r3, r4, r6, r8\n\t" "adds r9, r3, r9\n\t" "adcs r10, r4, r10\n\t" "adc r11, r5, #0\n\t" - "# A[1] * B[3]\n\t" + /* A[1] * B[3] */ "ldr r6, [%[a], #4]\n\t" "ldr r8, [%[b], #12]\n\t" "umull r3, r4, r6, r8\n\t" "adds r9, r3, r9\n\t" "adcs r10, r4, r10\n\t" "adc r11, r5, r11\n\t" - "# A[2] * B[2]\n\t" + /* A[2] * B[2] */ "ldr r6, [%[a], #8]\n\t" "ldr r8, [%[b], #8]\n\t" "umull r3, r4, r6, r8\n\t" "adds r9, r3, r9\n\t" "adcs r10, r4, r10\n\t" "adc r11, r5, r11\n\t" - "# A[3] * B[1]\n\t" + /* A[3] * B[1] */ "ldr r6, [%[a], #12]\n\t" "ldr r8, [%[b], #4]\n\t" "umull r3, r4, r6, r8\n\t" "adds r9, r3, r9\n\t" "adcs r10, r4, r10\n\t" "adc r11, r5, r11\n\t" - "# A[4] * B[0]\n\t" + /* A[4] * B[0] */ "ldr r6, [%[a], #16]\n\t" "ldr r8, [%[b], #0]\n\t" "umull r3, r4, r6, r8\n\t" @@ -14348,42 +14348,42 @@ SP_NOINLINE static void sp_256_mont_mul_8(sp_digit* r, const sp_digit* a, const "adcs r10, r4, r10\n\t" "adc r11, r5, r11\n\t" "str r9, [sp, #16]\n\t" - "# A[0] * B[5]\n\t" + /* A[0] * B[5] */ "ldr r6, [%[a], #0]\n\t" "ldr r8, [%[b], #20]\n\t" "umull r3, r4, r6, r8\n\t" "adds r10, r3, r10\n\t" "adcs r11, r4, r11\n\t" "adc r14, r5, #0\n\t" - "# A[1] * B[4]\n\t" + /* A[1] * B[4] */ "ldr r6, [%[a], #4]\n\t" "ldr r8, [%[b], #16]\n\t" "umull r3, r4, r6, r8\n\t" "adds r10, r3, r10\n\t" "adcs r11, r4, r11\n\t" "adc r14, r5, r14\n\t" - "# A[2] * B[3]\n\t" + /* A[2] * B[3] */ "ldr r6, [%[a], #8]\n\t" "ldr r8, [%[b], #12]\n\t" "umull r3, r4, r6, r8\n\t" "adds r10, r3, r10\n\t" "adcs r11, r4, r11\n\t" "adc r14, r5, r14\n\t" - "# A[3] * B[2]\n\t" + /* A[3] * B[2] */ "ldr r6, [%[a], #12]\n\t" "ldr r8, [%[b], #8]\n\t" "umull r3, r4, r6, r8\n\t" "adds r10, r3, r10\n\t" "adcs r11, r4, r11\n\t" "adc r14, r5, r14\n\t" - "# A[4] * B[1]\n\t" + /* A[4] * B[1] */ "ldr r6, [%[a], #16]\n\t" "ldr r8, [%[b], #4]\n\t" "umull r3, r4, r6, r8\n\t" "adds r10, r3, r10\n\t" "adcs r11, r4, r11\n\t" "adc r14, r5, r14\n\t" - "# A[5] * B[0]\n\t" + /* A[5] * B[0] */ "ldr r6, [%[a], #20]\n\t" "ldr r8, [%[b], #0]\n\t" "umull r3, r4, r6, r8\n\t" @@ -14391,49 +14391,49 @@ SP_NOINLINE static void sp_256_mont_mul_8(sp_digit* r, const sp_digit* a, const "adcs r11, r4, r11\n\t" "adc r14, r5, r14\n\t" "str r10, [sp, #20]\n\t" - "# A[0] * B[6]\n\t" + /* A[0] * B[6] */ "ldr r6, [%[a], #0]\n\t" "ldr r8, [%[b], #24]\n\t" "umull r3, r4, r6, r8\n\t" "adds r11, r3, r11\n\t" "adcs r14, r4, r14\n\t" "adc r9, r5, #0\n\t" - "# A[1] * B[5]\n\t" + /* A[1] * B[5] */ "ldr r6, [%[a], #4]\n\t" "ldr r8, [%[b], #20]\n\t" "umull r3, r4, r6, r8\n\t" "adds r11, r3, r11\n\t" "adcs r14, r4, r14\n\t" "adc r9, r5, r9\n\t" - "# A[2] * B[4]\n\t" + /* A[2] * B[4] */ "ldr r6, [%[a], #8]\n\t" "ldr r8, [%[b], #16]\n\t" "umull r3, r4, r6, r8\n\t" "adds r11, r3, r11\n\t" "adcs r14, r4, r14\n\t" "adc r9, r5, r9\n\t" - "# A[3] * B[3]\n\t" + /* A[3] * B[3] */ "ldr r6, [%[a], #12]\n\t" "ldr r8, [%[b], #12]\n\t" "umull r3, r4, r6, r8\n\t" "adds r11, r3, r11\n\t" "adcs r14, r4, r14\n\t" "adc r9, r5, r9\n\t" - "# A[4] * B[2]\n\t" + /* A[4] * B[2] */ "ldr r6, [%[a], #16]\n\t" "ldr r8, [%[b], #8]\n\t" "umull r3, r4, r6, r8\n\t" "adds r11, r3, r11\n\t" "adcs r14, r4, r14\n\t" "adc r9, r5, r9\n\t" - "# A[5] * B[1]\n\t" + /* A[5] * B[1] */ "ldr r6, [%[a], #20]\n\t" "ldr r8, [%[b], #4]\n\t" "umull r3, r4, r6, r8\n\t" "adds r11, r3, r11\n\t" "adcs r14, r4, r14\n\t" "adc r9, r5, r9\n\t" - "# A[6] * B[0]\n\t" + /* A[6] * B[0] */ "ldr r6, [%[a], #24]\n\t" "ldr r8, [%[b], #0]\n\t" "umull r3, r4, r6, r8\n\t" @@ -14441,56 +14441,56 @@ SP_NOINLINE static void sp_256_mont_mul_8(sp_digit* r, const sp_digit* a, const "adcs r14, r4, r14\n\t" "adc r9, r5, r9\n\t" "str r11, [sp, #24]\n\t" - "# A[0] * B[7]\n\t" + /* A[0] * B[7] */ "ldr r6, [%[a], #0]\n\t" "ldr r8, [%[b], #28]\n\t" "umull r3, r4, r6, r8\n\t" "adds r14, r3, r14\n\t" "adcs r9, r4, r9\n\t" "adc r10, r5, #0\n\t" - "# A[1] * B[6]\n\t" + /* A[1] * B[6] */ "ldr r6, [%[a], #4]\n\t" "ldr r8, [%[b], #24]\n\t" "umull r3, r4, r6, r8\n\t" "adds r14, r3, r14\n\t" "adcs r9, r4, r9\n\t" "adc r10, r5, r10\n\t" - "# A[2] * B[5]\n\t" + /* A[2] * B[5] */ "ldr r6, [%[a], #8]\n\t" "ldr r8, [%[b], #20]\n\t" "umull r3, r4, r6, r8\n\t" "adds r14, r3, r14\n\t" "adcs r9, r4, r9\n\t" "adc r10, r5, r10\n\t" - "# A[3] * B[4]\n\t" + /* A[3] * B[4] */ "ldr r6, [%[a], #12]\n\t" "ldr r8, [%[b], #16]\n\t" "umull r3, r4, r6, r8\n\t" "adds r14, r3, r14\n\t" "adcs r9, r4, r9\n\t" "adc r10, r5, r10\n\t" - "# A[4] * B[3]\n\t" + /* A[4] * B[3] */ "ldr r6, [%[a], #16]\n\t" "ldr r8, [%[b], #12]\n\t" "umull r3, r4, r6, r8\n\t" "adds r14, r3, r14\n\t" "adcs r9, r4, r9\n\t" "adc r10, r5, r10\n\t" - "# A[5] * B[2]\n\t" + /* A[5] * B[2] */ "ldr r6, [%[a], #20]\n\t" "ldr r8, [%[b], #8]\n\t" "umull r3, r4, r6, r8\n\t" "adds r14, r3, r14\n\t" "adcs r9, r4, r9\n\t" "adc r10, r5, r10\n\t" - "# A[6] * B[1]\n\t" + /* A[6] * B[1] */ "ldr r6, [%[a], #24]\n\t" "ldr r8, [%[b], #4]\n\t" "umull r3, r4, r6, r8\n\t" "adds r14, r3, r14\n\t" "adcs r9, r4, r9\n\t" "adc r10, r5, r10\n\t" - "# A[7] * B[0]\n\t" + /* A[7] * B[0] */ "ldr r6, [%[a], #28]\n\t" "ldr r8, [%[b], #0]\n\t" "umull r3, r4, r6, r8\n\t" @@ -14498,49 +14498,49 @@ SP_NOINLINE static void sp_256_mont_mul_8(sp_digit* r, const sp_digit* a, const "adcs r9, r4, r9\n\t" "adc r10, r5, r10\n\t" "str r14, [sp, #28]\n\t" - "# A[1] * B[7]\n\t" + /* A[1] * B[7] */ "ldr r6, [%[a], #4]\n\t" "ldr r8, [%[b], #28]\n\t" "umull r3, r4, r6, r8\n\t" "adds r9, r3, r9\n\t" "adcs r10, r4, r10\n\t" "adc r11, r5, #0\n\t" - "# A[2] * B[6]\n\t" + /* A[2] * B[6] */ "ldr r6, [%[a], #8]\n\t" "ldr r8, [%[b], #24]\n\t" "umull r3, r4, r6, r8\n\t" "adds r9, r3, r9\n\t" "adcs r10, r4, r10\n\t" "adc r11, r5, r11\n\t" - "# A[3] * B[5]\n\t" + /* A[3] * B[5] */ "ldr r6, [%[a], #12]\n\t" "ldr r8, [%[b], #20]\n\t" "umull r3, r4, r6, r8\n\t" "adds r9, r3, r9\n\t" "adcs r10, r4, r10\n\t" "adc r11, r5, r11\n\t" - "# A[4] * B[4]\n\t" + /* A[4] * B[4] */ "ldr r6, [%[a], #16]\n\t" "ldr r8, [%[b], #16]\n\t" "umull r3, r4, r6, r8\n\t" "adds r9, r3, r9\n\t" "adcs r10, r4, r10\n\t" "adc r11, r5, r11\n\t" - "# A[5] * B[3]\n\t" + /* A[5] * B[3] */ "ldr r6, [%[a], #20]\n\t" "ldr r8, [%[b], #12]\n\t" "umull r3, r4, r6, r8\n\t" "adds r9, r3, r9\n\t" "adcs r10, r4, r10\n\t" "adc r11, r5, r11\n\t" - "# A[6] * B[2]\n\t" + /* A[6] * B[2] */ "ldr r6, [%[a], #24]\n\t" "ldr r8, [%[b], #8]\n\t" "umull r3, r4, r6, r8\n\t" "adds r9, r3, r9\n\t" "adcs r10, r4, r10\n\t" "adc r11, r5, r11\n\t" - "# A[7] * B[1]\n\t" + /* A[7] * B[1] */ "ldr r6, [%[a], #28]\n\t" "ldr r8, [%[b], #4]\n\t" "umull r3, r4, r6, r8\n\t" @@ -14548,42 +14548,42 @@ SP_NOINLINE static void sp_256_mont_mul_8(sp_digit* r, const sp_digit* a, const "adcs r10, r4, r10\n\t" "adc r11, r5, r11\n\t" "str r9, [sp, #32]\n\t" - "# A[2] * B[7]\n\t" + /* A[2] * B[7] */ "ldr r6, [%[a], #8]\n\t" "ldr r8, [%[b], #28]\n\t" "umull r3, r4, r6, r8\n\t" "adds r10, r3, r10\n\t" "adcs r11, r4, r11\n\t" "adc r14, r5, #0\n\t" - "# A[3] * B[6]\n\t" + /* A[3] * B[6] */ "ldr r6, [%[a], #12]\n\t" "ldr r8, [%[b], #24]\n\t" "umull r3, r4, r6, r8\n\t" "adds r10, r3, r10\n\t" "adcs r11, r4, r11\n\t" "adc r14, r5, r14\n\t" - "# A[4] * B[5]\n\t" + /* A[4] * B[5] */ "ldr r6, [%[a], #16]\n\t" "ldr r8, [%[b], #20]\n\t" "umull r3, r4, r6, r8\n\t" "adds r10, r3, r10\n\t" "adcs r11, r4, r11\n\t" "adc r14, r5, r14\n\t" - "# A[5] * B[4]\n\t" + /* A[5] * B[4] */ "ldr r6, [%[a], #20]\n\t" "ldr r8, [%[b], #16]\n\t" "umull r3, r4, r6, r8\n\t" "adds r10, r3, r10\n\t" "adcs r11, r4, r11\n\t" "adc r14, r5, r14\n\t" - "# A[6] * B[3]\n\t" + /* A[6] * B[3] */ "ldr r6, [%[a], #24]\n\t" "ldr r8, [%[b], #12]\n\t" "umull r3, r4, r6, r8\n\t" "adds r10, r3, r10\n\t" "adcs r11, r4, r11\n\t" "adc r14, r5, r14\n\t" - "# A[7] * B[2]\n\t" + /* A[7] * B[2] */ "ldr r6, [%[a], #28]\n\t" "ldr r8, [%[b], #8]\n\t" "umull r3, r4, r6, r8\n\t" @@ -14591,35 +14591,35 @@ SP_NOINLINE static void sp_256_mont_mul_8(sp_digit* r, const sp_digit* a, const "adcs r11, r4, r11\n\t" "adc r14, r5, r14\n\t" "str r10, [sp, #36]\n\t" - "# A[3] * B[7]\n\t" + /* A[3] * B[7] */ "ldr r6, [%[a], #12]\n\t" "ldr r8, [%[b], #28]\n\t" "umull r3, r4, r6, r8\n\t" "adds r11, r3, r11\n\t" "adcs r14, r4, r14\n\t" "adc r9, r5, #0\n\t" - "# A[4] * B[6]\n\t" + /* A[4] * B[6] */ "ldr r6, [%[a], #16]\n\t" "ldr r8, [%[b], #24]\n\t" "umull r3, r4, r6, r8\n\t" "adds r11, r3, r11\n\t" "adcs r14, r4, r14\n\t" "adc r9, r5, r9\n\t" - "# A[5] * B[5]\n\t" + /* A[5] * B[5] */ "ldr r6, [%[a], #20]\n\t" "ldr r8, [%[b], #20]\n\t" "umull r3, r4, r6, r8\n\t" "adds r11, r3, r11\n\t" "adcs r14, r4, r14\n\t" "adc r9, r5, r9\n\t" - "# A[6] * B[4]\n\t" + /* A[6] * B[4] */ "ldr r6, [%[a], #24]\n\t" "ldr r8, [%[b], #16]\n\t" "umull r3, r4, r6, r8\n\t" "adds r11, r3, r11\n\t" "adcs r14, r4, r14\n\t" "adc r9, r5, r9\n\t" - "# A[7] * B[3]\n\t" + /* A[7] * B[3] */ "ldr r6, [%[a], #28]\n\t" "ldr r8, [%[b], #12]\n\t" "umull r3, r4, r6, r8\n\t" @@ -14627,28 +14627,28 @@ SP_NOINLINE static void sp_256_mont_mul_8(sp_digit* r, const sp_digit* a, const "adcs r14, r4, r14\n\t" "adc r9, r5, r9\n\t" "str r11, [sp, #40]\n\t" - "# A[4] * B[7]\n\t" + /* A[4] * B[7] */ "ldr r6, [%[a], #16]\n\t" "ldr r8, [%[b], #28]\n\t" "umull r3, r4, r6, r8\n\t" "adds r14, r3, r14\n\t" "adcs r9, r4, r9\n\t" "adc r10, r5, #0\n\t" - "# A[5] * B[6]\n\t" + /* A[5] * B[6] */ "ldr r6, [%[a], #20]\n\t" "ldr r8, [%[b], #24]\n\t" "umull r3, r4, r6, r8\n\t" "adds r14, r3, r14\n\t" "adcs r9, r4, r9\n\t" "adc r10, r5, r10\n\t" - "# A[6] * B[5]\n\t" + /* A[6] * B[5] */ "ldr r6, [%[a], #24]\n\t" "ldr r8, [%[b], #20]\n\t" "umull r3, r4, r6, r8\n\t" "adds r14, r3, r14\n\t" "adcs r9, r4, r9\n\t" "adc r10, r5, r10\n\t" - "# A[7] * B[4]\n\t" + /* A[7] * B[4] */ "ldr r6, [%[a], #28]\n\t" "ldr r8, [%[b], #16]\n\t" "umull r3, r4, r6, r8\n\t" @@ -14656,42 +14656,42 @@ SP_NOINLINE static void sp_256_mont_mul_8(sp_digit* r, const sp_digit* a, const "adcs r9, r4, r9\n\t" "adc r10, r5, r10\n\t" "str r14, [sp, #44]\n\t" - "# A[5] * B[7]\n\t" + /* A[5] * B[7] */ "ldr r6, [%[a], #20]\n\t" "ldr r8, [%[b], #28]\n\t" "umull r3, r4, r6, r8\n\t" "adds r9, r3, r9\n\t" "adcs r10, r4, r10\n\t" "adc r11, r5, #0\n\t" - "# A[6] * B[6]\n\t" + /* A[6] * B[6] */ "ldr r6, [%[a], #24]\n\t" "ldr r8, [%[b], #24]\n\t" "umull r3, r4, r6, r8\n\t" "adds r9, r3, r9\n\t" "adcs r10, r4, r10\n\t" "adc r11, r5, r11\n\t" - "# A[7] * B[5]\n\t" + /* A[7] * B[5] */ "ldr r6, [%[a], #28]\n\t" "ldr r8, [%[b], #20]\n\t" "umull r3, r4, r6, r8\n\t" "adds r9, r3, r9\n\t" "adcs r10, r4, r10\n\t" "adc r11, r5, r11\n\t" - "# A[6] * B[7]\n\t" + /* A[6] * B[7] */ "ldr r6, [%[a], #24]\n\t" "ldr r8, [%[b], #28]\n\t" "umull r3, r4, r6, r8\n\t" "adds r10, r3, r10\n\t" "adcs r11, r4, r11\n\t" "adc r14, r5, #0\n\t" - "# A[7] * B[6]\n\t" + /* A[7] * B[6] */ "ldr r6, [%[a], #28]\n\t" "ldr r8, [%[b], #24]\n\t" "umull r3, r4, r6, r8\n\t" "adds r10, r3, r10\n\t" "adcs r11, r4, r11\n\t" "adc r14, r5, r14\n\t" - "# A[7] * B[7]\n\t" + /* A[7] * B[7] */ "ldr r6, [%[a], #28]\n\t" "ldr r8, [%[b], #28]\n\t" "umull r3, r4, r6, r8\n\t" @@ -14701,7 +14701,7 @@ SP_NOINLINE static void sp_256_mont_mul_8(sp_digit* r, const sp_digit* a, const "str r10, [sp, #52]\n\t" "str r11, [sp, #56]\n\t" "str r14, [sp, #60]\n\t" - "# Start Reduction\n\t" + /* Start Reduction */ "ldr r4, [sp, #0]\n\t" "ldr r5, [sp, #4]\n\t" "ldr r6, [sp, #8]\n\t" @@ -14710,16 +14710,16 @@ SP_NOINLINE static void sp_256_mont_mul_8(sp_digit* r, const sp_digit* a, const "ldr r10, [sp, #20]\n\t" "ldr r11, [sp, #24]\n\t" "ldr r14, [sp, #28]\n\t" - "# mu = a[0]-a[7] + a[0]-a[4] << 96 + (a[0]-a[1] * 2) << 192\n\t" - "# - a[0] << 224\n\t" - "# + (a[0]-a[1] * 2) << (6 * 32)\n\t" + /* mu = a[0]-a[7] + a[0]-a[4] << 96 + (a[0]-a[1] * 2) << 192 */ + /* - a[0] << 224 */ + /* + (a[0]-a[1] * 2) << (6 * 32) */ "adds r11, r11, r4\n\t" "adc r14, r14, r5\n\t" "adds r11, r11, r4\n\t" "adc r14, r14, r5\n\t" - "# - a[0] << (7 * 32)\n\t" + /* - a[0] << (7 * 32) */ "sub r14, r14, r4\n\t" - "# + a[0]-a[4] << (3 * 32)\n\t" + /* + a[0]-a[4] << (3 * 32) */ "mov %[a], r8\n\t" "mov %[b], r9\n\t" "adds r8, r8, r4\n\t" @@ -14733,17 +14733,17 @@ SP_NOINLINE static void sp_256_mont_mul_8(sp_digit* r, const sp_digit* a, const "str r8, [sp, #12]\n\t" "str r9, [sp, #16]\n\t" "str r10, [sp, #20]\n\t" - "# a += mu * m\n\t" - "# += mu * ((1 << 256) - (1 << 224) + (1 << 192) + (1 << 96) - 1)\n\t" + /* a += mu * m */ + /* += mu * ((1 << 256) - (1 << 224) + (1 << 192) + (1 << 96) - 1) */ "mov %[a], #0\n\t" - "# a[6] += t[0] + t[3]\n\t" + /* a[6] += t[0] + t[3] */ "ldr r3, [sp, #24]\n\t" "adds r3, r3, r4\n\t" "adc %[b], %[a], #0\n\t" "adds r3, r3, r8\n\t" "adc %[b], %[b], #0\n\t" "str r11, [sp, #24]\n\t" - "# a[7] += t[1] + t[4]\n\t" + /* a[7] += t[1] + t[4] */ "ldr r3, [sp, #28]\n\t" "adds r3, r3, %[b]\n\t" "adc %[b], %[a], #0\n\t" @@ -14753,7 +14753,7 @@ SP_NOINLINE static void sp_256_mont_mul_8(sp_digit* r, const sp_digit* a, const "adc %[b], %[b], #0\n\t" "str r14, [sp, #28]\n\t" "str r3, [sp, #64]\n\t" - "# a[8] += t[0] + t[2] + t[5]\n\t" + /* a[8] += t[0] + t[2] + t[5] */ "ldr r3, [sp, #32]\n\t" "adds r3, r3, %[b]\n\t" "adc %[b], %[a], #0\n\t" @@ -14764,8 +14764,8 @@ SP_NOINLINE static void sp_256_mont_mul_8(sp_digit* r, const sp_digit* a, const "adds r3, r3, r10\n\t" "adc %[b], %[b], #0\n\t" "str r3, [sp, #32]\n\t" - "# a[9] += t[1] + t[3] + t[6]\n\t" - "# a[10] += t[2] + t[4] + t[7]\n\t" + /* a[9] += t[1] + t[3] + t[6] */ + /* a[10] += t[2] + t[4] + t[7] */ "ldr r3, [sp, #36]\n\t" "ldr r4, [sp, #40]\n\t" "adds r3, r3, %[b]\n\t" @@ -14782,10 +14782,10 @@ SP_NOINLINE static void sp_256_mont_mul_8(sp_digit* r, const sp_digit* a, const "adc %[b], %[b], #0\n\t" "str r3, [sp, #36]\n\t" "str r4, [sp, #40]\n\t" - "# a[11] += t[3] + t[5]\n\t" - "# a[12] += t[4] + t[6]\n\t" - "# a[13] += t[5] + t[7]\n\t" - "# a[14] += t[6]\n\t" + /* a[11] += t[3] + t[5] */ + /* a[12] += t[4] + t[6] */ + /* a[13] += t[5] + t[7] */ + /* a[14] += t[6] */ "ldr r3, [sp, #44]\n\t" "ldr r4, [sp, #48]\n\t" "ldr r5, [sp, #52]\n\t" @@ -14809,7 +14809,7 @@ SP_NOINLINE static void sp_256_mont_mul_8(sp_digit* r, const sp_digit* a, const "str r4, [sp, #48]\n\t" "str r5, [sp, #52]\n\t" "str r6, [sp, #56]\n\t" - "# a[15] += t[7]\n\t" + /* a[15] += t[7] */ "ldr r3, [sp, #60]\n\t" "adds r3, r3, %[b]\n\t" "adc %[b], %[a], #0\n\t" @@ -14850,7 +14850,7 @@ SP_NOINLINE static void sp_256_mont_mul_8(sp_digit* r, const sp_digit* a, const "str r5, [sp, #52]\n\t" "str r6, [sp, #56]\n\t" "str r8, [sp, #60]\n\t" - "# mask m and sub from result if overflow\n\t" + /* mask m and sub from result if overflow */ "sub %[b], %[a], %[b]\n\t" "and %[a], %[b], #1\n\t" "ldr r3, [sp, #32]\n\t" @@ -14900,25 +14900,25 @@ SP_NOINLINE static void sp_256_mont_sqr_8(sp_digit* r, const sp_digit* a, const __asm__ __volatile__ ( "sub sp, sp, #68\n\t" "mov r5, #0\n\t" - "# A[0] * A[1]\n\t" + /* A[0] * A[1] */ "ldr r6, [%[a], #0]\n\t" "ldr r8, [%[a], #4]\n\t" "umull r10, r11, r6, r8\n\t" "str r10, [sp, #4]\n\t" - "# A[0] * A[2]\n\t" + /* A[0] * A[2] */ "ldr r6, [%[a], #0]\n\t" "ldr r8, [%[a], #8]\n\t" "umull r3, r4, r6, r8\n\t" "adds r11, r3, r11\n\t" "adc r14, r4, #0\n\t" "str r11, [sp, #8]\n\t" - "# A[0] * A[3]\n\t" + /* A[0] * A[3] */ "ldr r6, [%[a], #0]\n\t" "ldr r8, [%[a], #12]\n\t" "umull r3, r4, r6, r8\n\t" "adds r14, r3, r14\n\t" "adc r9, r4, #0\n\t" - "# A[1] * A[2]\n\t" + /* A[1] * A[2] */ "ldr r6, [%[a], #4]\n\t" "ldr r8, [%[a], #8]\n\t" "umull r3, r4, r6, r8\n\t" @@ -14926,13 +14926,13 @@ SP_NOINLINE static void sp_256_mont_sqr_8(sp_digit* r, const sp_digit* a, const "adcs r9, r4, r9\n\t" "adc r10, r5, #0\n\t" "str r14, [sp, #12]\n\t" - "# A[0] * A[4]\n\t" + /* A[0] * A[4] */ "ldr r6, [%[a], #0]\n\t" "ldr r8, [%[a], #16]\n\t" "umull r3, r4, r6, r8\n\t" "adds r9, r3, r9\n\t" "adc r10, r4, r10\n\t" - "# A[1] * A[3]\n\t" + /* A[1] * A[3] */ "ldr r6, [%[a], #4]\n\t" "ldr r8, [%[a], #12]\n\t" "umull r3, r4, r6, r8\n\t" @@ -14940,20 +14940,20 @@ SP_NOINLINE static void sp_256_mont_sqr_8(sp_digit* r, const sp_digit* a, const "adcs r10, r4, r10\n\t" "adc r11, r5, #0\n\t" "str r9, [sp, #16]\n\t" - "# A[0] * A[5]\n\t" + /* A[0] * A[5] */ "ldr r6, [%[a], #0]\n\t" "ldr r8, [%[a], #20]\n\t" "umull r3, r4, r6, r8\n\t" "adds r10, r3, r10\n\t" "adc r11, r4, r11\n\t" - "# A[1] * A[4]\n\t" + /* A[1] * A[4] */ "ldr r6, [%[a], #4]\n\t" "ldr r8, [%[a], #16]\n\t" "umull r3, r4, r6, r8\n\t" "adds r10, r3, r10\n\t" "adcs r11, r4, r11\n\t" "adc r14, r5, #0\n\t" - "# A[2] * A[3]\n\t" + /* A[2] * A[3] */ "ldr r6, [%[a], #8]\n\t" "ldr r8, [%[a], #12]\n\t" "umull r3, r4, r6, r8\n\t" @@ -14961,21 +14961,21 @@ SP_NOINLINE static void sp_256_mont_sqr_8(sp_digit* r, const sp_digit* a, const "adcs r11, r4, r11\n\t" "adc r14, r5, r14\n\t" "str r10, [sp, #20]\n\t" - "# A[0] * A[6]\n\t" + /* A[0] * A[6] */ "ldr r6, [%[a], #0]\n\t" "ldr r8, [%[a], #24]\n\t" "umull r3, r4, r6, r8\n\t" "adds r11, r3, r11\n\t" "adcs r14, r4, r14\n\t" "adc r9, r5, #0\n\t" - "# A[1] * A[5]\n\t" + /* A[1] * A[5] */ "ldr r6, [%[a], #4]\n\t" "ldr r8, [%[a], #20]\n\t" "umull r3, r4, r6, r8\n\t" "adds r11, r3, r11\n\t" "adcs r14, r4, r14\n\t" "adc r9, r5, r9\n\t" - "# A[2] * A[4]\n\t" + /* A[2] * A[4] */ "ldr r6, [%[a], #8]\n\t" "ldr r8, [%[a], #16]\n\t" "umull r3, r4, r6, r8\n\t" @@ -14983,28 +14983,28 @@ SP_NOINLINE static void sp_256_mont_sqr_8(sp_digit* r, const sp_digit* a, const "adcs r14, r4, r14\n\t" "adc r9, r5, r9\n\t" "str r11, [sp, #24]\n\t" - "# A[0] * A[7]\n\t" + /* A[0] * A[7] */ "ldr r6, [%[a], #0]\n\t" "ldr r8, [%[a], #28]\n\t" "umull r3, r4, r6, r8\n\t" "adds r14, r3, r14\n\t" "adcs r9, r4, r9\n\t" "adc r10, r5, #0\n\t" - "# A[1] * A[6]\n\t" + /* A[1] * A[6] */ "ldr r6, [%[a], #4]\n\t" "ldr r8, [%[a], #24]\n\t" "umull r3, r4, r6, r8\n\t" "adds r14, r3, r14\n\t" "adcs r9, r4, r9\n\t" "adc r10, r5, r10\n\t" - "# A[2] * A[5]\n\t" + /* A[2] * A[5] */ "ldr r6, [%[a], #8]\n\t" "ldr r8, [%[a], #20]\n\t" "umull r3, r4, r6, r8\n\t" "adds r14, r3, r14\n\t" "adcs r9, r4, r9\n\t" "adc r10, r5, r10\n\t" - "# A[3] * A[4]\n\t" + /* A[3] * A[4] */ "ldr r6, [%[a], #12]\n\t" "ldr r8, [%[a], #16]\n\t" "umull r3, r4, r6, r8\n\t" @@ -15012,21 +15012,21 @@ SP_NOINLINE static void sp_256_mont_sqr_8(sp_digit* r, const sp_digit* a, const "adcs r9, r4, r9\n\t" "adc r10, r5, r10\n\t" "str r14, [sp, #28]\n\t" - "# A[1] * A[7]\n\t" + /* A[1] * A[7] */ "ldr r6, [%[a], #4]\n\t" "ldr r8, [%[a], #28]\n\t" "umull r3, r4, r6, r8\n\t" "adds r9, r3, r9\n\t" "adcs r10, r4, r10\n\t" "adc r11, r5, #0\n\t" - "# A[2] * A[6]\n\t" + /* A[2] * A[6] */ "ldr r6, [%[a], #8]\n\t" "ldr r8, [%[a], #24]\n\t" "umull r3, r4, r6, r8\n\t" "adds r9, r3, r9\n\t" "adcs r10, r4, r10\n\t" "adc r11, r5, r11\n\t" - "# A[3] * A[5]\n\t" + /* A[3] * A[5] */ "ldr r6, [%[a], #12]\n\t" "ldr r8, [%[a], #20]\n\t" "umull r3, r4, r6, r8\n\t" @@ -15034,21 +15034,21 @@ SP_NOINLINE static void sp_256_mont_sqr_8(sp_digit* r, const sp_digit* a, const "adcs r10, r4, r10\n\t" "adc r11, r5, r11\n\t" "str r9, [sp, #32]\n\t" - "# A[2] * A[7]\n\t" + /* A[2] * A[7] */ "ldr r6, [%[a], #8]\n\t" "ldr r8, [%[a], #28]\n\t" "umull r3, r4, r6, r8\n\t" "adds r10, r3, r10\n\t" "adcs r11, r4, r11\n\t" "adc r14, r5, #0\n\t" - "# A[3] * A[6]\n\t" + /* A[3] * A[6] */ "ldr r6, [%[a], #12]\n\t" "ldr r8, [%[a], #24]\n\t" "umull r3, r4, r6, r8\n\t" "adds r10, r3, r10\n\t" "adcs r11, r4, r11\n\t" "adc r14, r5, r14\n\t" - "# A[4] * A[5]\n\t" + /* A[4] * A[5] */ "ldr r6, [%[a], #16]\n\t" "ldr r8, [%[a], #20]\n\t" "umull r3, r4, r6, r8\n\t" @@ -15056,14 +15056,14 @@ SP_NOINLINE static void sp_256_mont_sqr_8(sp_digit* r, const sp_digit* a, const "adcs r11, r4, r11\n\t" "adc r14, r5, r14\n\t" "str r10, [sp, #36]\n\t" - "# A[3] * A[7]\n\t" + /* A[3] * A[7] */ "ldr r6, [%[a], #12]\n\t" "ldr r8, [%[a], #28]\n\t" "umull r3, r4, r6, r8\n\t" "adds r11, r3, r11\n\t" "adcs r14, r4, r14\n\t" "adc r9, r5, #0\n\t" - "# A[4] * A[6]\n\t" + /* A[4] * A[6] */ "ldr r6, [%[a], #16]\n\t" "ldr r8, [%[a], #24]\n\t" "umull r3, r4, r6, r8\n\t" @@ -15071,14 +15071,14 @@ SP_NOINLINE static void sp_256_mont_sqr_8(sp_digit* r, const sp_digit* a, const "adcs r14, r4, r14\n\t" "adc r9, r5, r9\n\t" "str r11, [sp, #40]\n\t" - "# A[4] * A[7]\n\t" + /* A[4] * A[7] */ "ldr r6, [%[a], #16]\n\t" "ldr r8, [%[a], #28]\n\t" "umull r3, r4, r6, r8\n\t" "adds r14, r3, r14\n\t" "adcs r9, r4, r9\n\t" "adc r10, r5, #0\n\t" - "# A[5] * A[6]\n\t" + /* A[5] * A[6] */ "ldr r6, [%[a], #20]\n\t" "ldr r8, [%[a], #24]\n\t" "umull r3, r4, r6, r8\n\t" @@ -15086,7 +15086,7 @@ SP_NOINLINE static void sp_256_mont_sqr_8(sp_digit* r, const sp_digit* a, const "adcs r9, r4, r9\n\t" "adc r10, r5, r10\n\t" "str r14, [sp, #44]\n\t" - "# A[5] * A[7]\n\t" + /* A[5] * A[7] */ "ldr r6, [%[a], #20]\n\t" "ldr r8, [%[a], #28]\n\t" "umull r3, r4, r6, r8\n\t" @@ -15094,7 +15094,7 @@ SP_NOINLINE static void sp_256_mont_sqr_8(sp_digit* r, const sp_digit* a, const "adcs r10, r4, r10\n\t" "adc r11, r5, #0\n\t" "str r9, [sp, #48]\n\t" - "# A[6] * A[7]\n\t" + /* A[6] * A[7] */ "ldr r6, [%[a], #24]\n\t" "ldr r8, [%[a], #28]\n\t" "umull r3, r4, r6, r8\n\t" @@ -15102,7 +15102,7 @@ SP_NOINLINE static void sp_256_mont_sqr_8(sp_digit* r, const sp_digit* a, const "adc r11, r4, r11\n\t" "str r10, [sp, #52]\n\t" "str r11, [sp, #56]\n\t" - "# Double\n\t" + /* Double */ "ldr r4, [sp, #4]\n\t" "ldr r6, [sp, #8]\n\t" "ldr r8, [sp, #12]\n\t" @@ -15150,10 +15150,10 @@ SP_NOINLINE static void sp_256_mont_sqr_8(sp_digit* r, const sp_digit* a, const "ldr r4, [sp, #4]\n\t" "ldr r5, [sp, #8]\n\t" "ldr r12, [sp, #12]\n\t" - "# A[0] * A[0]\n\t" + /* A[0] * A[0] */ "ldr r6, [%[a], #0]\n\t" "umull r9, r10, r6, r6\n\t" - "# A[1] * A[1]\n\t" + /* A[1] * A[1] */ "ldr r6, [%[a], #4]\n\t" "umull r11, r14, r6, r6\n\t" "adds r10, r10, r4\n\t" @@ -15167,10 +15167,10 @@ SP_NOINLINE static void sp_256_mont_sqr_8(sp_digit* r, const sp_digit* a, const "ldr r4, [sp, #20]\n\t" "ldr r5, [sp, #24]\n\t" "ldr r12, [sp, #28]\n\t" - "# A[2] * A[2]\n\t" + /* A[2] * A[2] */ "ldr r6, [%[a], #8]\n\t" "umull r9, r10, r6, r6\n\t" - "# A[3] * A[3]\n\t" + /* A[3] * A[3] */ "ldr r6, [%[a], #12]\n\t" "umull r11, r14, r6, r6\n\t" "adcs r9, r9, r3\n\t" @@ -15185,10 +15185,10 @@ SP_NOINLINE static void sp_256_mont_sqr_8(sp_digit* r, const sp_digit* a, const "ldr r4, [sp, #36]\n\t" "ldr r5, [sp, #40]\n\t" "ldr r12, [sp, #44]\n\t" - "# A[4] * A[4]\n\t" + /* A[4] * A[4] */ "ldr r6, [%[a], #16]\n\t" "umull r9, r10, r6, r6\n\t" - "# A[5] * A[5]\n\t" + /* A[5] * A[5] */ "ldr r6, [%[a], #20]\n\t" "umull r11, r14, r6, r6\n\t" "adcs r9, r9, r3\n\t" @@ -15203,10 +15203,10 @@ SP_NOINLINE static void sp_256_mont_sqr_8(sp_digit* r, const sp_digit* a, const "ldr r4, [sp, #52]\n\t" "ldr r5, [sp, #56]\n\t" "ldr r12, [sp, #60]\n\t" - "# A[6] * A[6]\n\t" + /* A[6] * A[6] */ "ldr r6, [%[a], #24]\n\t" "umull r9, r10, r6, r6\n\t" - "# A[7] * A[7]\n\t" + /* A[7] * A[7] */ "ldr r6, [%[a], #28]\n\t" "umull r11, r14, r6, r6\n\t" "adcs r9, r9, r3\n\t" @@ -15217,7 +15217,7 @@ SP_NOINLINE static void sp_256_mont_sqr_8(sp_digit* r, const sp_digit* a, const "str r10, [sp, #52]\n\t" "str r11, [sp, #56]\n\t" "str r14, [sp, #60]\n\t" - "# Start Reduction\n\t" + /* Start Reduction */ "ldr r4, [sp, #0]\n\t" "ldr r5, [sp, #4]\n\t" "ldr r6, [sp, #8]\n\t" @@ -15226,16 +15226,16 @@ SP_NOINLINE static void sp_256_mont_sqr_8(sp_digit* r, const sp_digit* a, const "ldr r10, [sp, #20]\n\t" "ldr r11, [sp, #24]\n\t" "ldr r14, [sp, #28]\n\t" - "# mu = a[0]-a[7] + a[0]-a[4] << 96 + (a[0]-a[1] * 2) << 192\n\t" - "# - a[0] << 224\n\t" - "# + (a[0]-a[1] * 2) << (6 * 32)\n\t" + /* mu = a[0]-a[7] + a[0]-a[4] << 96 + (a[0]-a[1] * 2) << 192 */ + /* - a[0] << 224 */ + /* + (a[0]-a[1] * 2) << (6 * 32) */ "adds r11, r11, r4\n\t" "adc r14, r14, r5\n\t" "adds r11, r11, r4\n\t" "adc r14, r14, r5\n\t" - "# - a[0] << (7 * 32)\n\t" + /* - a[0] << (7 * 32) */ "sub r14, r14, r4\n\t" - "# + a[0]-a[4] << (3 * 32)\n\t" + /* + a[0]-a[4] << (3 * 32) */ "mov %[a], r8\n\t" "mov r12, r9\n\t" "adds r8, r8, r4\n\t" @@ -15249,17 +15249,17 @@ SP_NOINLINE static void sp_256_mont_sqr_8(sp_digit* r, const sp_digit* a, const "str r8, [sp, #12]\n\t" "str r9, [sp, #16]\n\t" "str r10, [sp, #20]\n\t" - "# a += mu * m\n\t" - "# += mu * ((1 << 256) - (1 << 224) + (1 << 192) + (1 << 96) - 1)\n\t" + /* a += mu * m */ + /* += mu * ((1 << 256) - (1 << 224) + (1 << 192) + (1 << 96) - 1) */ "mov %[a], #0\n\t" - "# a[6] += t[0] + t[3]\n\t" + /* a[6] += t[0] + t[3] */ "ldr r3, [sp, #24]\n\t" "adds r3, r3, r4\n\t" "adc r12, %[a], #0\n\t" "adds r3, r3, r8\n\t" "adc r12, r12, #0\n\t" "str r11, [sp, #24]\n\t" - "# a[7] += t[1] + t[4]\n\t" + /* a[7] += t[1] + t[4] */ "ldr r3, [sp, #28]\n\t" "adds r3, r3, r12\n\t" "adc r12, %[a], #0\n\t" @@ -15269,7 +15269,7 @@ SP_NOINLINE static void sp_256_mont_sqr_8(sp_digit* r, const sp_digit* a, const "adc r12, r12, #0\n\t" "str r14, [sp, #28]\n\t" "str r3, [sp, #64]\n\t" - "# a[8] += t[0] + t[2] + t[5]\n\t" + /* a[8] += t[0] + t[2] + t[5] */ "ldr r3, [sp, #32]\n\t" "adds r3, r3, r12\n\t" "adc r12, %[a], #0\n\t" @@ -15280,8 +15280,8 @@ SP_NOINLINE static void sp_256_mont_sqr_8(sp_digit* r, const sp_digit* a, const "adds r3, r3, r10\n\t" "adc r12, r12, #0\n\t" "str r3, [sp, #32]\n\t" - "# a[9] += t[1] + t[3] + t[6]\n\t" - "# a[10] += t[2] + t[4] + t[7]\n\t" + /* a[9] += t[1] + t[3] + t[6] */ + /* a[10] += t[2] + t[4] + t[7] */ "ldr r3, [sp, #36]\n\t" "ldr r4, [sp, #40]\n\t" "adds r3, r3, r12\n\t" @@ -15298,10 +15298,10 @@ SP_NOINLINE static void sp_256_mont_sqr_8(sp_digit* r, const sp_digit* a, const "adc r12, r12, #0\n\t" "str r3, [sp, #36]\n\t" "str r4, [sp, #40]\n\t" - "# a[11] += t[3] + t[5]\n\t" - "# a[12] += t[4] + t[6]\n\t" - "# a[13] += t[5] + t[7]\n\t" - "# a[14] += t[6]\n\t" + /* a[11] += t[3] + t[5] */ + /* a[12] += t[4] + t[6] */ + /* a[13] += t[5] + t[7] */ + /* a[14] += t[6] */ "ldr r3, [sp, #44]\n\t" "ldr r4, [sp, #48]\n\t" "ldr r5, [sp, #52]\n\t" @@ -15325,7 +15325,7 @@ SP_NOINLINE static void sp_256_mont_sqr_8(sp_digit* r, const sp_digit* a, const "str r4, [sp, #48]\n\t" "str r5, [sp, #52]\n\t" "str r6, [sp, #56]\n\t" - "# a[15] += t[7]\n\t" + /* a[15] += t[7] */ "ldr r3, [sp, #60]\n\t" "adds r3, r3, r12\n\t" "adc r12, %[a], #0\n\t" @@ -15366,7 +15366,7 @@ SP_NOINLINE static void sp_256_mont_sqr_8(sp_digit* r, const sp_digit* a, const "str r5, [sp, #52]\n\t" "str r6, [sp, #56]\n\t" "str r8, [sp, #60]\n\t" - "# mask m and sub from result if overflow\n\t" + /* mask m and sub from result if overflow */ "sub r12, %[a], r12\n\t" "and %[a], r12, #1\n\t" "ldr r3, [sp, #32]\n\t" From 778b5dd9d512569e040c2a3e26d0878e530fa66c Mon Sep 17 00:00:00 2001 From: David Garske Date: Mon, 11 May 2020 15:46:31 -0700 Subject: [PATCH 097/298] Fixes for STM32 CubeMX HAL with AES GCM. Fix AES GCM authentication header size, which expects size as number of 32-bit values. Fix the authentication size round up logic. Fix to use software for authentication tag if authentication data size is not multiple of 4. Fix to ensure 32-bit aligned buffers are used. --- wolfcrypt/src/aes.c | 92 ++++++++++++++++++++++++--------------------- 1 file changed, 49 insertions(+), 43 deletions(-) diff --git a/wolfcrypt/src/aes.c b/wolfcrypt/src/aes.c index 165382b06..341b1c053 100644 --- a/wolfcrypt/src/aes.c +++ b/wolfcrypt/src/aes.c @@ -1474,7 +1474,7 @@ static const word32 Td[4][256] = { #ifdef HAVE_AES_DECRYPT #if (defined(HAVE_AES_CBC) && !defined(WOLFSSL_DEVCRYPTO_CBC)) \ - || defined(WOLFSSL_AES_DIRECT) + || defined(WOLFSSL_AES_DIRECT) static const byte Td4[256] = { 0x52U, 0x09U, 0x6aU, 0xd5U, 0x30U, 0x36U, 0xa5U, 0x38U, @@ -5930,9 +5930,9 @@ static int wc_AesGcmEncrypt_STM32(Aes* aes, byte* out, const byte* in, word32 sz int status = HAL_OK; word32 blocks = sz / AES_BLOCK_SIZE; word32 partial = sz % AES_BLOCK_SIZE; - byte tag[AES_BLOCK_SIZE]; - byte partialBlock[AES_BLOCK_SIZE]; - byte ctr[AES_BLOCK_SIZE]; + word32 tag[AES_BLOCK_SIZE/sizeof(word32)]; + word32 partialBlock[AES_BLOCK_SIZE/sizeof(word32)]; + word32 ctr[AES_BLOCK_SIZE/sizeof(word32)]; byte* authInPadded = NULL; int authPadSz; @@ -5953,18 +5953,20 @@ static int wc_AesGcmEncrypt_STM32(Aes* aes, byte* out, const byte* in, word32 sz XMEMSET(ctr, 0, AES_BLOCK_SIZE); if (ivSz == GCM_NONCE_MID_SZ) { + byte* pCtr = (byte*)ctr; XMEMCPY(ctr, iv, ivSz); - ctr[AES_BLOCK_SIZE - 1] = 1; + pCtr[AES_BLOCK_SIZE - 1] = 1; } else { - GHASH(aes, NULL, 0, iv, ivSz, ctr, AES_BLOCK_SIZE); + GHASH(aes, NULL, 0, iv, ivSz, (byte*)ctr, AES_BLOCK_SIZE); } /* Hardware requires counter + 1 */ - IncrementGcmCounter(ctr); + IncrementGcmCounter((byte*)ctr); - if (authInSz == 0 || (authInSz % AES_BLOCK_SIZE) != 0) { - /* Need to pad the AAD to a full block with zeros. */ - authPadSz = ((authInSz / AES_BLOCK_SIZE) + 1) * AES_BLOCK_SIZE; + /* Authentication buffer - must be 4-byte multiple zero padded */ + authPadSz = authInSz % sizeof(word32); + if (authInSz == 0 || authPadSz != 0) { + authPadSz = authInSz + sizeof(word32) - authPadSz; authInPadded = (byte*)XMALLOC(authPadSz, aes->heap, DYNAMIC_TYPE_TMP_BUFFER); if (authInPadded == NULL) { @@ -5981,7 +5983,7 @@ static int wc_AesGcmEncrypt_STM32(Aes* aes, byte* out, const byte* in, word32 sz #ifdef WOLFSSL_STM32_CUBEMX hcryp.Init.pInitVect = (STM_CRYPT_TYPE*)ctr; hcryp.Init.Header = (STM_CRYPT_TYPE*)authInPadded; - hcryp.Init.HeaderSize = authInSz; + hcryp.Init.HeaderSize = authPadSz/sizeof(word32); #ifdef STM32_CRYPTO_AES_ONLY /* Set the CRYP parameters */ @@ -5994,12 +5996,12 @@ static int wc_AesGcmEncrypt_STM32(Aes* aes, byte* out, const byte* in, word32 sz status = HAL_CRYPEx_AES_Auth(&hcryp, NULL, 0, NULL, STM32_HAL_TIMEOUT); if (status == HAL_OK) { /* GCM header phase */ - hcryp.Init.GCMCMACPhase = CRYP_HEADER_PHASE; + hcryp.Init.GCMCMACPhase = CRYP_HEADER_PHASE; status = HAL_CRYPEx_AES_Auth(&hcryp, NULL, 0, NULL, STM32_HAL_TIMEOUT); } if (status == HAL_OK) { /* GCM payload phase - blocks */ - hcryp.Init.GCMCMACPhase = CRYP_PAYLOAD_PHASE; + hcryp.Init.GCMCMACPhase = CRYP_PAYLOAD_PHASE; if (blocks) { status = HAL_CRYPEx_AES_Auth(&hcryp, (byte*)in, (blocks * AES_BLOCK_SIZE), out, STM32_HAL_TIMEOUT); @@ -6020,7 +6022,7 @@ static int wc_AesGcmEncrypt_STM32(Aes* aes, byte* out, const byte* in, word32 sz } #elif defined(STM32_HAL_V2) hcryp.Init.Algorithm = CRYP_AES_GCM; - ByteReverseWords((word32*)partialBlock, (word32*)ctr, AES_BLOCK_SIZE); + ByteReverseWords(partialBlock, ctr, AES_BLOCK_SIZE); hcryp.Init.pInitVect = (STM_CRYPT_TYPE*)partialBlock; HAL_CRYP_Init(&hcryp); @@ -6071,12 +6073,12 @@ static int wc_AesGcmEncrypt_STM32(Aes* aes, byte* out, const byte* in, word32 sz if (ret == 0) { /* return authTag */ if (authTag) { - /* STM32 GCM won't compute Auth correctly for partial or - when IV != 12, so use software here */ - if (sz == 0 || partial != 0 || ivSz != GCM_NONCE_MID_SZ) { - DecrementGcmCounter(ctr); /* hardware requires +1, so subtract it */ + /* For STM32 GCM fallback to software if partial AES block or + * IV != 12 or when auth data is not 4 byte aligned */ + if (sz == 0 || partial != 0 || ivSz != GCM_NONCE_MID_SZ || authInPadded != authIn) { + DecrementGcmCounter((byte*)ctr); /* hardware requires +1, so subtract it */ GHASH(aes, authIn, authInSz, out, sz, authTag, authTagSz); - wc_AesEncrypt(aes, ctr, tag); + wc_AesEncrypt(aes, (byte*)ctr, (byte*)tag); xorbuf(authTag, tag, authTagSz); } else { @@ -6366,9 +6368,9 @@ static int wc_AesGcmDecrypt_STM32(Aes* aes, byte* out, int status = HAL_OK; word32 blocks = sz / AES_BLOCK_SIZE; word32 partial = sz % AES_BLOCK_SIZE; - byte tag[AES_BLOCK_SIZE]; - byte partialBlock[AES_BLOCK_SIZE]; - byte ctr[AES_BLOCK_SIZE]; + word32 tag[AES_BLOCK_SIZE/sizeof(word32)]; + word32 partialBlock[AES_BLOCK_SIZE/sizeof(word32)]; + word32 ctr[AES_BLOCK_SIZE/sizeof(word32)]; byte* authInPadded = NULL; int authPadSz; @@ -6389,18 +6391,20 @@ static int wc_AesGcmDecrypt_STM32(Aes* aes, byte* out, XMEMSET(ctr, 0, AES_BLOCK_SIZE); if (ivSz == GCM_NONCE_MID_SZ) { + byte* pCtr = (byte*)ctr; XMEMCPY(ctr, iv, ivSz); - ctr[AES_BLOCK_SIZE - 1] = 1; + pCtr[AES_BLOCK_SIZE - 1] = 1; } else { - GHASH(aes, NULL, 0, iv, ivSz, ctr, AES_BLOCK_SIZE); + GHASH(aes, NULL, 0, iv, ivSz, (byte*)ctr, AES_BLOCK_SIZE); } /* Hardware requires counter + 1 */ - IncrementGcmCounter(ctr); + IncrementGcmCounter((byte*)ctr); - if (authInSz == 0 || (authInSz % AES_BLOCK_SIZE) != 0) { - /* Need to pad the AAD to a full block with zeros. */ - authPadSz = ((authInSz / AES_BLOCK_SIZE) + 1) * AES_BLOCK_SIZE; + /* Authentication buffer - must be 4-byte multiple zero padded */ + authPadSz = authInSz % sizeof(word32); + if (authInSz == 0 || authPadSz != 0) { + authPadSz = authInSz + sizeof(word32) - authPadSz; authInPadded = (byte*)XMALLOC(authPadSz, aes->heap, DYNAMIC_TYPE_TMP_BUFFER); if (authInPadded == NULL) { @@ -6417,7 +6421,7 @@ static int wc_AesGcmDecrypt_STM32(Aes* aes, byte* out, #ifdef WOLFSSL_STM32_CUBEMX hcryp.Init.pInitVect = (STM_CRYPT_TYPE*)ctr; hcryp.Init.Header = (STM_CRYPT_TYPE*)authInPadded; - hcryp.Init.HeaderSize = authInSz; + hcryp.Init.HeaderSize = authPadSz/sizeof(word32); #ifdef STM32_CRYPTO_AES_ONLY /* Set the CRYP parameters */ @@ -6435,7 +6439,7 @@ static int wc_AesGcmDecrypt_STM32(Aes* aes, byte* out, } if (status == HAL_OK) { /* GCM payload phase - blocks */ - hcryp.Init.GCMCMACPhase = CRYP_PAYLOAD_PHASE; + hcryp.Init.GCMCMACPhase = CRYP_PAYLOAD_PHASE; if (blocks) { status = HAL_CRYPEx_AES_Auth(&hcryp, (byte*)in, (blocks * AES_BLOCK_SIZE), out, STM32_HAL_TIMEOUT); @@ -6445,18 +6449,18 @@ static int wc_AesGcmDecrypt_STM32(Aes* aes, byte* out, /* GCM payload phase - partial remainder */ XMEMSET(partialBlock, 0, sizeof(partialBlock)); XMEMCPY(partialBlock, in + (blocks * AES_BLOCK_SIZE), partial); - status = HAL_CRYPEx_AES_Auth(&hcryp, partialBlock, partial, - partialBlock, STM32_HAL_TIMEOUT); + status = HAL_CRYPEx_AES_Auth(&hcryp, (byte*)partialBlock, partial, + (byte*)partialBlock, STM32_HAL_TIMEOUT); XMEMCPY(out + (blocks * AES_BLOCK_SIZE), partialBlock, partial); } if (status == HAL_OK) { /* GCM final phase */ hcryp.Init.GCMCMACPhase = CRYP_FINAL_PHASE; - status = HAL_CRYPEx_AES_Auth(&hcryp, NULL, sz, tag, STM32_HAL_TIMEOUT); + status = HAL_CRYPEx_AES_Auth(&hcryp, NULL, sz, (byte*)tag, STM32_HAL_TIMEOUT); } #elif defined(STM32_HAL_V2) hcryp.Init.Algorithm = CRYP_AES_GCM; - ByteReverseWords((word32*)partialBlock, (word32*)ctr, AES_BLOCK_SIZE); + ByteReverseWords(partialBlock, ctr, AES_BLOCK_SIZE); hcryp.Init.pInitVect = (STM_CRYPT_TYPE*)partialBlock; HAL_CRYP_Init(&hcryp); @@ -6479,13 +6483,13 @@ static int wc_AesGcmDecrypt_STM32(Aes* aes, byte* out, /* GCM payload phase - partial remainder */ XMEMSET(partialBlock, 0, sizeof(partialBlock)); XMEMCPY(partialBlock, in + (blocks * AES_BLOCK_SIZE), partial); - status = HAL_CRYPEx_AESGCM_Decrypt(&hcryp, partialBlock, partial, - partialBlock, STM32_HAL_TIMEOUT); + status = HAL_CRYPEx_AESGCM_Decrypt(&hcryp, (byte*)partialBlock, partial, + (byte*)partialBlock, STM32_HAL_TIMEOUT); XMEMCPY(out + (blocks * AES_BLOCK_SIZE), partialBlock, partial); } if (status == HAL_OK) { /* Compute the authTag */ - status = HAL_CRYPEx_AESGCM_Finish(&hcryp, sz, tag, STM32_HAL_TIMEOUT); + status = HAL_CRYPEx_AESGCM_Finish(&hcryp, sz, (byte*)tag, STM32_HAL_TIMEOUT); } #endif @@ -6509,15 +6513,17 @@ static int wc_AesGcmDecrypt_STM32(Aes* aes, byte* out, ret = AES_GCM_AUTH_E; #endif /* WOLFSSL_STM32_CUBEMX */ - /* STM32 GCM hardware only supports IV of 12 bytes, so use software for auth */ - if (sz == 0 || ivSz != GCM_NONCE_MID_SZ) { - DecrementGcmCounter(ctr); /* hardware requires +1, so subtract it */ - GHASH(aes, authIn, authInSz, in, sz, tag, sizeof(tag)); - wc_AesEncrypt(aes, ctr, partialBlock); + /* For STM32 GCM fallback to software if partial AES block or + * IV != 12 or when auth data is not 4 byte aligned */ + if (sz == 0 || partial != 0 || ivSz != GCM_NONCE_MID_SZ || authInPadded != authIn) { + DecrementGcmCounter((byte*)ctr); /* hardware requires +1, so subtract it */ + GHASH(aes, authIn, authInSz, in, sz, (byte*)tag, sizeof(tag)); + wc_AesEncrypt(aes, (byte*)ctr, (byte*)partialBlock); xorbuf(tag, partialBlock, sizeof(tag)); } - if (ConstantCompare(authTag, tag, authTagSz) != 0) { + /* Check authentication tag */ + if (ConstantCompare(authTag, (byte*)tag, authTagSz) != 0) { ret = AES_GCM_AUTH_E; } From 9a8fc941815416a73647fb21a6076267ebd2093d Mon Sep 17 00:00:00 2001 From: kaleb-himes Date: Tue, 12 May 2020 16:28:39 -0600 Subject: [PATCH 098/298] for OE6 sp_arm32.c asm code is inlined in rsa.c and ecc.c --- src/include.am | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/include.am b/src/include.am index a7f20deac..506671dca 100644 --- a/src/include.am +++ b/src/include.am @@ -215,9 +215,11 @@ if BUILD_SP_X86_64 src_libwolfssl_la_SOURCES += wolfcrypt/src/sp_x86_64.c src_libwolfssl_la_SOURCES += wolfcrypt/src/sp_x86_64_asm.S endif +if !BUILD_FIPS_V2 if BUILD_SP_ARM32 src_libwolfssl_la_SOURCES += wolfcrypt/src/sp_arm32.c endif +endif if BUILD_SP_ARM_THUMB src_libwolfssl_la_SOURCES += wolfcrypt/src/sp_armthumb.c endif From 57756bfa8dcf4600cdcdb07997312115d278ca77 Mon Sep 17 00:00:00 2001 From: Sean Parkinson Date: Wed, 13 May 2020 10:23:05 +1000 Subject: [PATCH 099/298] Remove unused 4096-bit functions --- wolfcrypt/src/sp_arm32.c | 44638 ---------------------------------- wolfcrypt/src/sp_armthumb.c | 574 - wolfcrypt/src/sp_c32.c | 24 +- wolfcrypt/src/sp_c64.c | 24 +- wolfcrypt/src/sp_cortexm.c | 390 - 5 files changed, 24 insertions(+), 45626 deletions(-) diff --git a/wolfcrypt/src/sp_arm32.c b/wolfcrypt/src/sp_arm32.c index 8bdc61501..c0743d619 100644 --- a/wolfcrypt/src/sp_arm32.c +++ b/wolfcrypt/src/sp_arm32.c @@ -20619,284 +20619,6 @@ static void sp_4096_to_bin(sp_digit* r, byte* a) } #ifndef WOLFSSL_SP_SMALL -/* Add b to a into r. (r = a + b) - * - * r A single precision integer. - * a A single precision integer. - * b A single precision integer. - */ -static sp_digit sp_4096_add_64(sp_digit* r, const sp_digit* a, - const sp_digit* b) -{ - sp_digit c = 0; - - __asm__ __volatile__ ( - "mov r12, #0\n\t" - "ldr r4, [%[a], #0]\n\t" - "ldr r5, [%[a], #4]\n\t" - "ldr r6, [%[a], #8]\n\t" - "ldr r7, [%[a], #12]\n\t" - "ldr r8, [%[b], #0]\n\t" - "ldr r9, [%[b], #4]\n\t" - "ldr r10, [%[b], #8]\n\t" - "ldr r14, [%[b], #12]\n\t" - "adds r4, r4, r8\n\t" - "adcs r5, r5, r9\n\t" - "adcs r6, r6, r10\n\t" - "adcs r7, r7, r14\n\t" - "str r4, [%[r], #0]\n\t" - "str r5, [%[r], #4]\n\t" - "str r6, [%[r], #8]\n\t" - "str r7, [%[r], #12]\n\t" - "ldr r4, [%[a], #16]\n\t" - "ldr r5, [%[a], #20]\n\t" - "ldr r6, [%[a], #24]\n\t" - "ldr r7, [%[a], #28]\n\t" - "ldr r8, [%[b], #16]\n\t" - "ldr r9, [%[b], #20]\n\t" - "ldr r10, [%[b], #24]\n\t" - "ldr r14, [%[b], #28]\n\t" - "adcs r4, r4, r8\n\t" - "adcs r5, r5, r9\n\t" - "adcs r6, r6, r10\n\t" - "adcs r7, r7, r14\n\t" - "str r4, [%[r], #16]\n\t" - "str r5, [%[r], #20]\n\t" - "str r6, [%[r], #24]\n\t" - "str r7, [%[r], #28]\n\t" - "ldr r4, [%[a], #32]\n\t" - "ldr r5, [%[a], #36]\n\t" - "ldr r6, [%[a], #40]\n\t" - "ldr r7, [%[a], #44]\n\t" - "ldr r8, [%[b], #32]\n\t" - "ldr r9, [%[b], #36]\n\t" - "ldr r10, [%[b], #40]\n\t" - "ldr r14, [%[b], #44]\n\t" - "adcs r4, r4, r8\n\t" - "adcs r5, r5, r9\n\t" - "adcs r6, r6, r10\n\t" - "adcs r7, r7, r14\n\t" - "str r4, [%[r], #32]\n\t" - "str r5, [%[r], #36]\n\t" - "str r6, [%[r], #40]\n\t" - "str r7, [%[r], #44]\n\t" - "ldr r4, [%[a], #48]\n\t" - "ldr r5, [%[a], #52]\n\t" - "ldr r6, [%[a], #56]\n\t" - "ldr r7, [%[a], #60]\n\t" - "ldr r8, [%[b], #48]\n\t" - "ldr r9, [%[b], #52]\n\t" - "ldr r10, [%[b], #56]\n\t" - "ldr r14, [%[b], #60]\n\t" - "adcs r4, r4, r8\n\t" - "adcs r5, r5, r9\n\t" - "adcs r6, r6, r10\n\t" - "adcs r7, r7, r14\n\t" - "str r4, [%[r], #48]\n\t" - "str r5, [%[r], #52]\n\t" - "str r6, [%[r], #56]\n\t" - "str r7, [%[r], #60]\n\t" - "ldr r4, [%[a], #64]\n\t" - "ldr r5, [%[a], #68]\n\t" - "ldr r6, [%[a], #72]\n\t" - "ldr r7, [%[a], #76]\n\t" - "ldr r8, [%[b], #64]\n\t" - "ldr r9, [%[b], #68]\n\t" - "ldr r10, [%[b], #72]\n\t" - "ldr r14, [%[b], #76]\n\t" - "adcs r4, r4, r8\n\t" - "adcs r5, r5, r9\n\t" - "adcs r6, r6, r10\n\t" - "adcs r7, r7, r14\n\t" - "str r4, [%[r], #64]\n\t" - "str r5, [%[r], #68]\n\t" - "str r6, [%[r], #72]\n\t" - "str r7, [%[r], #76]\n\t" - "ldr r4, [%[a], #80]\n\t" - "ldr r5, [%[a], #84]\n\t" - "ldr r6, [%[a], #88]\n\t" - "ldr r7, [%[a], #92]\n\t" - "ldr r8, [%[b], #80]\n\t" - "ldr r9, [%[b], #84]\n\t" - "ldr r10, [%[b], #88]\n\t" - "ldr r14, [%[b], #92]\n\t" - "adcs r4, r4, r8\n\t" - "adcs r5, r5, r9\n\t" - "adcs r6, r6, r10\n\t" - "adcs r7, r7, r14\n\t" - "str r4, [%[r], #80]\n\t" - "str r5, [%[r], #84]\n\t" - "str r6, [%[r], #88]\n\t" - "str r7, [%[r], #92]\n\t" - "ldr r4, [%[a], #96]\n\t" - "ldr r5, [%[a], #100]\n\t" - "ldr r6, [%[a], #104]\n\t" - "ldr r7, [%[a], #108]\n\t" - "ldr r8, [%[b], #96]\n\t" - "ldr r9, [%[b], #100]\n\t" - "ldr r10, [%[b], #104]\n\t" - "ldr r14, [%[b], #108]\n\t" - "adcs r4, r4, r8\n\t" - "adcs r5, r5, r9\n\t" - "adcs r6, r6, r10\n\t" - "adcs r7, r7, r14\n\t" - "str r4, [%[r], #96]\n\t" - "str r5, [%[r], #100]\n\t" - "str r6, [%[r], #104]\n\t" - "str r7, [%[r], #108]\n\t" - "ldr r4, [%[a], #112]\n\t" - "ldr r5, [%[a], #116]\n\t" - "ldr r6, [%[a], #120]\n\t" - "ldr r7, [%[a], #124]\n\t" - "ldr r8, [%[b], #112]\n\t" - "ldr r9, [%[b], #116]\n\t" - "ldr r10, [%[b], #120]\n\t" - "ldr r14, [%[b], #124]\n\t" - "adcs r4, r4, r8\n\t" - "adcs r5, r5, r9\n\t" - "adcs r6, r6, r10\n\t" - "adcs r7, r7, r14\n\t" - "str r4, [%[r], #112]\n\t" - "str r5, [%[r], #116]\n\t" - "str r6, [%[r], #120]\n\t" - "str r7, [%[r], #124]\n\t" - "ldr r4, [%[a], #128]\n\t" - "ldr r5, [%[a], #132]\n\t" - "ldr r6, [%[a], #136]\n\t" - "ldr r7, [%[a], #140]\n\t" - "ldr r8, [%[b], #128]\n\t" - "ldr r9, [%[b], #132]\n\t" - "ldr r10, [%[b], #136]\n\t" - "ldr r14, [%[b], #140]\n\t" - "adcs r4, r4, r8\n\t" - "adcs r5, r5, r9\n\t" - "adcs r6, r6, r10\n\t" - "adcs r7, r7, r14\n\t" - "str r4, [%[r], #128]\n\t" - "str r5, [%[r], #132]\n\t" - "str r6, [%[r], #136]\n\t" - "str r7, [%[r], #140]\n\t" - "ldr r4, [%[a], #144]\n\t" - "ldr r5, [%[a], #148]\n\t" - "ldr r6, [%[a], #152]\n\t" - "ldr r7, [%[a], #156]\n\t" - "ldr r8, [%[b], #144]\n\t" - "ldr r9, [%[b], #148]\n\t" - "ldr r10, [%[b], #152]\n\t" - "ldr r14, [%[b], #156]\n\t" - "adcs r4, r4, r8\n\t" - "adcs r5, r5, r9\n\t" - "adcs r6, r6, r10\n\t" - "adcs r7, r7, r14\n\t" - "str r4, [%[r], #144]\n\t" - "str r5, [%[r], #148]\n\t" - "str r6, [%[r], #152]\n\t" - "str r7, [%[r], #156]\n\t" - "ldr r4, [%[a], #160]\n\t" - "ldr r5, [%[a], #164]\n\t" - "ldr r6, [%[a], #168]\n\t" - "ldr r7, [%[a], #172]\n\t" - "ldr r8, [%[b], #160]\n\t" - "ldr r9, [%[b], #164]\n\t" - "ldr r10, [%[b], #168]\n\t" - "ldr r14, [%[b], #172]\n\t" - "adcs r4, r4, r8\n\t" - "adcs r5, r5, r9\n\t" - "adcs r6, r6, r10\n\t" - "adcs r7, r7, r14\n\t" - "str r4, [%[r], #160]\n\t" - "str r5, [%[r], #164]\n\t" - "str r6, [%[r], #168]\n\t" - "str r7, [%[r], #172]\n\t" - "ldr r4, [%[a], #176]\n\t" - "ldr r5, [%[a], #180]\n\t" - "ldr r6, [%[a], #184]\n\t" - "ldr r7, [%[a], #188]\n\t" - "ldr r8, [%[b], #176]\n\t" - "ldr r9, [%[b], #180]\n\t" - "ldr r10, [%[b], #184]\n\t" - "ldr r14, [%[b], #188]\n\t" - "adcs r4, r4, r8\n\t" - "adcs r5, r5, r9\n\t" - "adcs r6, r6, r10\n\t" - "adcs r7, r7, r14\n\t" - "str r4, [%[r], #176]\n\t" - "str r5, [%[r], #180]\n\t" - "str r6, [%[r], #184]\n\t" - "str r7, [%[r], #188]\n\t" - "ldr r4, [%[a], #192]\n\t" - "ldr r5, [%[a], #196]\n\t" - "ldr r6, [%[a], #200]\n\t" - "ldr r7, [%[a], #204]\n\t" - "ldr r8, [%[b], #192]\n\t" - "ldr r9, [%[b], #196]\n\t" - "ldr r10, [%[b], #200]\n\t" - "ldr r14, [%[b], #204]\n\t" - "adcs r4, r4, r8\n\t" - "adcs r5, r5, r9\n\t" - "adcs r6, r6, r10\n\t" - "adcs r7, r7, r14\n\t" - "str r4, [%[r], #192]\n\t" - "str r5, [%[r], #196]\n\t" - "str r6, [%[r], #200]\n\t" - "str r7, [%[r], #204]\n\t" - "ldr r4, [%[a], #208]\n\t" - "ldr r5, [%[a], #212]\n\t" - "ldr r6, [%[a], #216]\n\t" - "ldr r7, [%[a], #220]\n\t" - "ldr r8, [%[b], #208]\n\t" - "ldr r9, [%[b], #212]\n\t" - "ldr r10, [%[b], #216]\n\t" - "ldr r14, [%[b], #220]\n\t" - "adcs r4, r4, r8\n\t" - "adcs r5, r5, r9\n\t" - "adcs r6, r6, r10\n\t" - "adcs r7, r7, r14\n\t" - "str r4, [%[r], #208]\n\t" - "str r5, [%[r], #212]\n\t" - "str r6, [%[r], #216]\n\t" - "str r7, [%[r], #220]\n\t" - "ldr r4, [%[a], #224]\n\t" - "ldr r5, [%[a], #228]\n\t" - "ldr r6, [%[a], #232]\n\t" - "ldr r7, [%[a], #236]\n\t" - "ldr r8, [%[b], #224]\n\t" - "ldr r9, [%[b], #228]\n\t" - "ldr r10, [%[b], #232]\n\t" - "ldr r14, [%[b], #236]\n\t" - "adcs r4, r4, r8\n\t" - "adcs r5, r5, r9\n\t" - "adcs r6, r6, r10\n\t" - "adcs r7, r7, r14\n\t" - "str r4, [%[r], #224]\n\t" - "str r5, [%[r], #228]\n\t" - "str r6, [%[r], #232]\n\t" - "str r7, [%[r], #236]\n\t" - "ldr r4, [%[a], #240]\n\t" - "ldr r5, [%[a], #244]\n\t" - "ldr r6, [%[a], #248]\n\t" - "ldr r7, [%[a], #252]\n\t" - "ldr r8, [%[b], #240]\n\t" - "ldr r9, [%[b], #244]\n\t" - "ldr r10, [%[b], #248]\n\t" - "ldr r14, [%[b], #252]\n\t" - "adcs r4, r4, r8\n\t" - "adcs r5, r5, r9\n\t" - "adcs r6, r6, r10\n\t" - "adcs r7, r7, r14\n\t" - "str r4, [%[r], #240]\n\t" - "str r5, [%[r], #244]\n\t" - "str r6, [%[r], #248]\n\t" - "str r7, [%[r], #252]\n\t" - "adc %[c], r12, r12\n\t" - : [c] "+r" (c) - : [r] "r" (r), [a] "r" (a), [b] "r" (b) - : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r14", "r12" - ); - - return c; -} - /* Sub b from a into a. (a -= b) * * a A single precision integer and result. @@ -21962,28979 +21684,6 @@ static sp_digit sp_4096_add_128(sp_digit* r, const sp_digit* a, return c; } -/* Multiply a and b into r. (r = a * b) - * - * r A single precision integer. - * a A single precision integer. - * b A single precision integer. - */ -static void sp_4096_mul_64(sp_digit* r, const sp_digit* a, const sp_digit* b) -{ - __asm__ __volatile__ ( - "sub sp, sp, #256\n\t" - "mov r10, #0\n\t" - "# A[0] * B[0]\n\t" - "ldr r8, [%[a], #0]\n\t" - "ldr r9, [%[b], #0]\n\t" - "umull r3, r4, r8, r9\n\t" - "mov r5, #0\n\t" - "str r3, [sp]\n\t" - "# A[0] * B[1]\n\t" - "ldr r8, [%[a], #0]\n\t" - "ldr r9, [%[b], #4]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r10, r10\n\t" - "# A[1] * B[0]\n\t" - "ldr r8, [%[a], #4]\n\t" - "ldr r9, [%[b], #0]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "str r4, [sp, #4]\n\t" - "# A[0] * B[2]\n\t" - "ldr r8, [%[a], #0]\n\t" - "ldr r9, [%[b], #8]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r10, r10\n\t" - "# A[1] * B[1]\n\t" - "ldr r8, [%[a], #4]\n\t" - "ldr r9, [%[b], #4]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[2] * B[0]\n\t" - "ldr r8, [%[a], #8]\n\t" - "ldr r9, [%[b], #0]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "str r5, [sp, #8]\n\t" - "# A[0] * B[3]\n\t" - "ldr r8, [%[a], #0]\n\t" - "ldr r9, [%[b], #12]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r10, r10\n\t" - "# A[1] * B[2]\n\t" - "ldr r8, [%[a], #4]\n\t" - "ldr r9, [%[b], #8]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[2] * B[1]\n\t" - "ldr r8, [%[a], #8]\n\t" - "ldr r9, [%[b], #4]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[3] * B[0]\n\t" - "ldr r8, [%[a], #12]\n\t" - "ldr r9, [%[b], #0]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "str r3, [sp, #12]\n\t" - "# A[0] * B[4]\n\t" - "ldr r8, [%[a], #0]\n\t" - "ldr r9, [%[b], #16]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r10, r10\n\t" - "# A[1] * B[3]\n\t" - "ldr r8, [%[a], #4]\n\t" - "ldr r9, [%[b], #12]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[2] * B[2]\n\t" - "ldr r8, [%[a], #8]\n\t" - "ldr r9, [%[b], #8]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[3] * B[1]\n\t" - "ldr r8, [%[a], #12]\n\t" - "ldr r9, [%[b], #4]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[4] * B[0]\n\t" - "ldr r8, [%[a], #16]\n\t" - "ldr r9, [%[b], #0]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "str r4, [sp, #16]\n\t" - "# A[0] * B[5]\n\t" - "ldr r8, [%[a], #0]\n\t" - "ldr r9, [%[b], #20]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r10, r10\n\t" - "# A[1] * B[4]\n\t" - "ldr r8, [%[a], #4]\n\t" - "ldr r9, [%[b], #16]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[2] * B[3]\n\t" - "ldr r8, [%[a], #8]\n\t" - "ldr r9, [%[b], #12]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[3] * B[2]\n\t" - "ldr r8, [%[a], #12]\n\t" - "ldr r9, [%[b], #8]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[4] * B[1]\n\t" - "ldr r8, [%[a], #16]\n\t" - "ldr r9, [%[b], #4]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[5] * B[0]\n\t" - "ldr r8, [%[a], #20]\n\t" - "ldr r9, [%[b], #0]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "str r5, [sp, #20]\n\t" - "# A[0] * B[6]\n\t" - "ldr r8, [%[a], #0]\n\t" - "ldr r9, [%[b], #24]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r10, r10\n\t" - "# A[1] * B[5]\n\t" - "ldr r8, [%[a], #4]\n\t" - "ldr r9, [%[b], #20]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[2] * B[4]\n\t" - "ldr r8, [%[a], #8]\n\t" - "ldr r9, [%[b], #16]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[3] * B[3]\n\t" - "ldr r8, [%[a], #12]\n\t" - "ldr r9, [%[b], #12]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[4] * B[2]\n\t" - "ldr r8, [%[a], #16]\n\t" - "ldr r9, [%[b], #8]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[5] * B[1]\n\t" - "ldr r8, [%[a], #20]\n\t" - "ldr r9, [%[b], #4]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[6] * B[0]\n\t" - "ldr r8, [%[a], #24]\n\t" - "ldr r9, [%[b], #0]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "str r3, [sp, #24]\n\t" - "# A[0] * B[7]\n\t" - "ldr r8, [%[a], #0]\n\t" - "ldr r9, [%[b], #28]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r10, r10\n\t" - "# A[1] * B[6]\n\t" - "ldr r8, [%[a], #4]\n\t" - "ldr r9, [%[b], #24]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[2] * B[5]\n\t" - "ldr r8, [%[a], #8]\n\t" - "ldr r9, [%[b], #20]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[3] * B[4]\n\t" - "ldr r8, [%[a], #12]\n\t" - "ldr r9, [%[b], #16]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[4] * B[3]\n\t" - "ldr r8, [%[a], #16]\n\t" - "ldr r9, [%[b], #12]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[5] * B[2]\n\t" - "ldr r8, [%[a], #20]\n\t" - "ldr r9, [%[b], #8]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[6] * B[1]\n\t" - "ldr r8, [%[a], #24]\n\t" - "ldr r9, [%[b], #4]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[7] * B[0]\n\t" - "ldr r8, [%[a], #28]\n\t" - "ldr r9, [%[b], #0]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "str r4, [sp, #28]\n\t" - "# A[0] * B[8]\n\t" - "ldr r8, [%[a], #0]\n\t" - "ldr r9, [%[b], #32]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r10, r10\n\t" - "# A[1] * B[7]\n\t" - "ldr r8, [%[a], #4]\n\t" - "ldr r9, [%[b], #28]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[2] * B[6]\n\t" - "ldr r8, [%[a], #8]\n\t" - "ldr r9, [%[b], #24]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[3] * B[5]\n\t" - "ldr r8, [%[a], #12]\n\t" - "ldr r9, [%[b], #20]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[4] * B[4]\n\t" - "ldr r8, [%[a], #16]\n\t" - "ldr r9, [%[b], #16]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[5] * B[3]\n\t" - "ldr r8, [%[a], #20]\n\t" - "ldr r9, [%[b], #12]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[6] * B[2]\n\t" - "ldr r8, [%[a], #24]\n\t" - "ldr r9, [%[b], #8]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[7] * B[1]\n\t" - "ldr r8, [%[a], #28]\n\t" - "ldr r9, [%[b], #4]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[8] * B[0]\n\t" - "ldr r8, [%[a], #32]\n\t" - "ldr r9, [%[b], #0]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "str r5, [sp, #32]\n\t" - "# A[0] * B[9]\n\t" - "ldr r8, [%[a], #0]\n\t" - "ldr r9, [%[b], #36]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r10, r10\n\t" - "# A[1] * B[8]\n\t" - "ldr r8, [%[a], #4]\n\t" - "ldr r9, [%[b], #32]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[2] * B[7]\n\t" - "ldr r8, [%[a], #8]\n\t" - "ldr r9, [%[b], #28]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[3] * B[6]\n\t" - "ldr r8, [%[a], #12]\n\t" - "ldr r9, [%[b], #24]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[4] * B[5]\n\t" - "ldr r8, [%[a], #16]\n\t" - "ldr r9, [%[b], #20]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[5] * B[4]\n\t" - "ldr r8, [%[a], #20]\n\t" - "ldr r9, [%[b], #16]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[6] * B[3]\n\t" - "ldr r8, [%[a], #24]\n\t" - "ldr r9, [%[b], #12]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[7] * B[2]\n\t" - "ldr r8, [%[a], #28]\n\t" - "ldr r9, [%[b], #8]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[8] * B[1]\n\t" - "ldr r8, [%[a], #32]\n\t" - "ldr r9, [%[b], #4]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[9] * B[0]\n\t" - "ldr r8, [%[a], #36]\n\t" - "ldr r9, [%[b], #0]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "str r3, [sp, #36]\n\t" - "# A[0] * B[10]\n\t" - "ldr r8, [%[a], #0]\n\t" - "ldr r9, [%[b], #40]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r10, r10\n\t" - "# A[1] * B[9]\n\t" - "ldr r8, [%[a], #4]\n\t" - "ldr r9, [%[b], #36]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[2] * B[8]\n\t" - "ldr r8, [%[a], #8]\n\t" - "ldr r9, [%[b], #32]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[3] * B[7]\n\t" - "ldr r8, [%[a], #12]\n\t" - "ldr r9, [%[b], #28]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[4] * B[6]\n\t" - "ldr r8, [%[a], #16]\n\t" - "ldr r9, [%[b], #24]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[5] * B[5]\n\t" - "ldr r8, [%[a], #20]\n\t" - "ldr r9, [%[b], #20]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[6] * B[4]\n\t" - "ldr r8, [%[a], #24]\n\t" - "ldr r9, [%[b], #16]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[7] * B[3]\n\t" - "ldr r8, [%[a], #28]\n\t" - "ldr r9, [%[b], #12]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[8] * B[2]\n\t" - "ldr r8, [%[a], #32]\n\t" - "ldr r9, [%[b], #8]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[9] * B[1]\n\t" - "ldr r8, [%[a], #36]\n\t" - "ldr r9, [%[b], #4]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[10] * B[0]\n\t" - "ldr r8, [%[a], #40]\n\t" - "ldr r9, [%[b], #0]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "str r4, [sp, #40]\n\t" - "# A[0] * B[11]\n\t" - "ldr r8, [%[a], #0]\n\t" - "ldr r9, [%[b], #44]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r10, r10\n\t" - "# A[1] * B[10]\n\t" - "ldr r8, [%[a], #4]\n\t" - "ldr r9, [%[b], #40]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[2] * B[9]\n\t" - "ldr r8, [%[a], #8]\n\t" - "ldr r9, [%[b], #36]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[3] * B[8]\n\t" - "ldr r8, [%[a], #12]\n\t" - "ldr r9, [%[b], #32]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[4] * B[7]\n\t" - "ldr r8, [%[a], #16]\n\t" - "ldr r9, [%[b], #28]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[5] * B[6]\n\t" - "ldr r8, [%[a], #20]\n\t" - "ldr r9, [%[b], #24]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[6] * B[5]\n\t" - "ldr r8, [%[a], #24]\n\t" - "ldr r9, [%[b], #20]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[7] * B[4]\n\t" - "ldr r8, [%[a], #28]\n\t" - "ldr r9, [%[b], #16]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[8] * B[3]\n\t" - "ldr r8, [%[a], #32]\n\t" - "ldr r9, [%[b], #12]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[9] * B[2]\n\t" - "ldr r8, [%[a], #36]\n\t" - "ldr r9, [%[b], #8]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[10] * B[1]\n\t" - "ldr r8, [%[a], #40]\n\t" - "ldr r9, [%[b], #4]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[11] * B[0]\n\t" - "ldr r8, [%[a], #44]\n\t" - "ldr r9, [%[b], #0]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "str r5, [sp, #44]\n\t" - "# A[0] * B[12]\n\t" - "ldr r8, [%[a], #0]\n\t" - "ldr r9, [%[b], #48]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r10, r10\n\t" - "# A[1] * B[11]\n\t" - "ldr r8, [%[a], #4]\n\t" - "ldr r9, [%[b], #44]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[2] * B[10]\n\t" - "ldr r8, [%[a], #8]\n\t" - "ldr r9, [%[b], #40]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[3] * B[9]\n\t" - "ldr r8, [%[a], #12]\n\t" - "ldr r9, [%[b], #36]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[4] * B[8]\n\t" - "ldr r8, [%[a], #16]\n\t" - "ldr r9, [%[b], #32]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[5] * B[7]\n\t" - "ldr r8, [%[a], #20]\n\t" - "ldr r9, [%[b], #28]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[6] * B[6]\n\t" - "ldr r8, [%[a], #24]\n\t" - "ldr r9, [%[b], #24]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[7] * B[5]\n\t" - "ldr r8, [%[a], #28]\n\t" - "ldr r9, [%[b], #20]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[8] * B[4]\n\t" - "ldr r8, [%[a], #32]\n\t" - "ldr r9, [%[b], #16]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[9] * B[3]\n\t" - "ldr r8, [%[a], #36]\n\t" - "ldr r9, [%[b], #12]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[10] * B[2]\n\t" - "ldr r8, [%[a], #40]\n\t" - "ldr r9, [%[b], #8]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[11] * B[1]\n\t" - "ldr r8, [%[a], #44]\n\t" - "ldr r9, [%[b], #4]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[12] * B[0]\n\t" - "ldr r8, [%[a], #48]\n\t" - "ldr r9, [%[b], #0]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "str r3, [sp, #48]\n\t" - "# A[0] * B[13]\n\t" - "ldr r8, [%[a], #0]\n\t" - "ldr r9, [%[b], #52]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r10, r10\n\t" - "# A[1] * B[12]\n\t" - "ldr r8, [%[a], #4]\n\t" - "ldr r9, [%[b], #48]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[2] * B[11]\n\t" - "ldr r8, [%[a], #8]\n\t" - "ldr r9, [%[b], #44]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[3] * B[10]\n\t" - "ldr r8, [%[a], #12]\n\t" - "ldr r9, [%[b], #40]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[4] * B[9]\n\t" - "ldr r8, [%[a], #16]\n\t" - "ldr r9, [%[b], #36]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[5] * B[8]\n\t" - "ldr r8, [%[a], #20]\n\t" - "ldr r9, [%[b], #32]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[6] * B[7]\n\t" - "ldr r8, [%[a], #24]\n\t" - "ldr r9, [%[b], #28]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[7] * B[6]\n\t" - "ldr r8, [%[a], #28]\n\t" - "ldr r9, [%[b], #24]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[8] * B[5]\n\t" - "ldr r8, [%[a], #32]\n\t" - "ldr r9, [%[b], #20]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[9] * B[4]\n\t" - "ldr r8, [%[a], #36]\n\t" - "ldr r9, [%[b], #16]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[10] * B[3]\n\t" - "ldr r8, [%[a], #40]\n\t" - "ldr r9, [%[b], #12]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[11] * B[2]\n\t" - "ldr r8, [%[a], #44]\n\t" - "ldr r9, [%[b], #8]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[12] * B[1]\n\t" - "ldr r8, [%[a], #48]\n\t" - "ldr r9, [%[b], #4]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[13] * B[0]\n\t" - "ldr r8, [%[a], #52]\n\t" - "ldr r9, [%[b], #0]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "str r4, [sp, #52]\n\t" - "# A[0] * B[14]\n\t" - "ldr r8, [%[a], #0]\n\t" - "ldr r9, [%[b], #56]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r10, r10\n\t" - "# A[1] * B[13]\n\t" - "ldr r8, [%[a], #4]\n\t" - "ldr r9, [%[b], #52]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[2] * B[12]\n\t" - "ldr r8, [%[a], #8]\n\t" - "ldr r9, [%[b], #48]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[3] * B[11]\n\t" - "ldr r8, [%[a], #12]\n\t" - "ldr r9, [%[b], #44]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[4] * B[10]\n\t" - "ldr r8, [%[a], #16]\n\t" - "ldr r9, [%[b], #40]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[5] * B[9]\n\t" - "ldr r8, [%[a], #20]\n\t" - "ldr r9, [%[b], #36]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[6] * B[8]\n\t" - "ldr r8, [%[a], #24]\n\t" - "ldr r9, [%[b], #32]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[7] * B[7]\n\t" - "ldr r8, [%[a], #28]\n\t" - "ldr r9, [%[b], #28]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[8] * B[6]\n\t" - "ldr r8, [%[a], #32]\n\t" - "ldr r9, [%[b], #24]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[9] * B[5]\n\t" - "ldr r8, [%[a], #36]\n\t" - "ldr r9, [%[b], #20]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[10] * B[4]\n\t" - "ldr r8, [%[a], #40]\n\t" - "ldr r9, [%[b], #16]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[11] * B[3]\n\t" - "ldr r8, [%[a], #44]\n\t" - "ldr r9, [%[b], #12]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[12] * B[2]\n\t" - "ldr r8, [%[a], #48]\n\t" - "ldr r9, [%[b], #8]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[13] * B[1]\n\t" - "ldr r8, [%[a], #52]\n\t" - "ldr r9, [%[b], #4]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[14] * B[0]\n\t" - "ldr r8, [%[a], #56]\n\t" - "ldr r9, [%[b], #0]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "str r5, [sp, #56]\n\t" - "# A[0] * B[15]\n\t" - "ldr r8, [%[a], #0]\n\t" - "ldr r9, [%[b], #60]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r10, r10\n\t" - "# A[1] * B[14]\n\t" - "ldr r8, [%[a], #4]\n\t" - "ldr r9, [%[b], #56]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[2] * B[13]\n\t" - "ldr r8, [%[a], #8]\n\t" - "ldr r9, [%[b], #52]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[3] * B[12]\n\t" - "ldr r8, [%[a], #12]\n\t" - "ldr r9, [%[b], #48]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[4] * B[11]\n\t" - "ldr r8, [%[a], #16]\n\t" - "ldr r9, [%[b], #44]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[5] * B[10]\n\t" - "ldr r8, [%[a], #20]\n\t" - "ldr r9, [%[b], #40]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[6] * B[9]\n\t" - "ldr r8, [%[a], #24]\n\t" - "ldr r9, [%[b], #36]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[7] * B[8]\n\t" - "ldr r8, [%[a], #28]\n\t" - "ldr r9, [%[b], #32]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[8] * B[7]\n\t" - "ldr r8, [%[a], #32]\n\t" - "ldr r9, [%[b], #28]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[9] * B[6]\n\t" - "ldr r8, [%[a], #36]\n\t" - "ldr r9, [%[b], #24]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[10] * B[5]\n\t" - "ldr r8, [%[a], #40]\n\t" - "ldr r9, [%[b], #20]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[11] * B[4]\n\t" - "ldr r8, [%[a], #44]\n\t" - "ldr r9, [%[b], #16]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[12] * B[3]\n\t" - "ldr r8, [%[a], #48]\n\t" - "ldr r9, [%[b], #12]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[13] * B[2]\n\t" - "ldr r8, [%[a], #52]\n\t" - "ldr r9, [%[b], #8]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[14] * B[1]\n\t" - "ldr r8, [%[a], #56]\n\t" - "ldr r9, [%[b], #4]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[15] * B[0]\n\t" - "ldr r8, [%[a], #60]\n\t" - "ldr r9, [%[b], #0]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "str r3, [sp, #60]\n\t" - "# A[0] * B[16]\n\t" - "ldr r8, [%[a], #0]\n\t" - "ldr r9, [%[b], #64]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r10, r10\n\t" - "# A[1] * B[15]\n\t" - "ldr r8, [%[a], #4]\n\t" - "ldr r9, [%[b], #60]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[2] * B[14]\n\t" - "ldr r8, [%[a], #8]\n\t" - "ldr r9, [%[b], #56]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[3] * B[13]\n\t" - "ldr r8, [%[a], #12]\n\t" - "ldr r9, [%[b], #52]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[4] * B[12]\n\t" - "ldr r8, [%[a], #16]\n\t" - "ldr r9, [%[b], #48]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[5] * B[11]\n\t" - "ldr r8, [%[a], #20]\n\t" - "ldr r9, [%[b], #44]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[6] * B[10]\n\t" - "ldr r8, [%[a], #24]\n\t" - "ldr r9, [%[b], #40]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[7] * B[9]\n\t" - "ldr r8, [%[a], #28]\n\t" - "ldr r9, [%[b], #36]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[8] * B[8]\n\t" - "ldr r8, [%[a], #32]\n\t" - "ldr r9, [%[b], #32]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[9] * B[7]\n\t" - "ldr r8, [%[a], #36]\n\t" - "ldr r9, [%[b], #28]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[10] * B[6]\n\t" - "ldr r8, [%[a], #40]\n\t" - "ldr r9, [%[b], #24]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[11] * B[5]\n\t" - "ldr r8, [%[a], #44]\n\t" - "ldr r9, [%[b], #20]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[12] * B[4]\n\t" - "ldr r8, [%[a], #48]\n\t" - "ldr r9, [%[b], #16]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[13] * B[3]\n\t" - "ldr r8, [%[a], #52]\n\t" - "ldr r9, [%[b], #12]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[14] * B[2]\n\t" - "ldr r8, [%[a], #56]\n\t" - "ldr r9, [%[b], #8]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[15] * B[1]\n\t" - "ldr r8, [%[a], #60]\n\t" - "ldr r9, [%[b], #4]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[16] * B[0]\n\t" - "ldr r8, [%[a], #64]\n\t" - "ldr r9, [%[b], #0]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "str r4, [sp, #64]\n\t" - "# A[0] * B[17]\n\t" - "ldr r8, [%[a], #0]\n\t" - "ldr r9, [%[b], #68]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r10, r10\n\t" - "# A[1] * B[16]\n\t" - "ldr r8, [%[a], #4]\n\t" - "ldr r9, [%[b], #64]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[2] * B[15]\n\t" - "ldr r8, [%[a], #8]\n\t" - "ldr r9, [%[b], #60]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[3] * B[14]\n\t" - "ldr r8, [%[a], #12]\n\t" - "ldr r9, [%[b], #56]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[4] * B[13]\n\t" - "ldr r8, [%[a], #16]\n\t" - "ldr r9, [%[b], #52]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[5] * B[12]\n\t" - "ldr r8, [%[a], #20]\n\t" - "ldr r9, [%[b], #48]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[6] * B[11]\n\t" - "ldr r8, [%[a], #24]\n\t" - "ldr r9, [%[b], #44]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[7] * B[10]\n\t" - "ldr r8, [%[a], #28]\n\t" - "ldr r9, [%[b], #40]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[8] * B[9]\n\t" - "ldr r8, [%[a], #32]\n\t" - "ldr r9, [%[b], #36]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[9] * B[8]\n\t" - "ldr r8, [%[a], #36]\n\t" - "ldr r9, [%[b], #32]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[10] * B[7]\n\t" - "ldr r8, [%[a], #40]\n\t" - "ldr r9, [%[b], #28]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[11] * B[6]\n\t" - "ldr r8, [%[a], #44]\n\t" - "ldr r9, [%[b], #24]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[12] * B[5]\n\t" - "ldr r8, [%[a], #48]\n\t" - "ldr r9, [%[b], #20]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[13] * B[4]\n\t" - "ldr r8, [%[a], #52]\n\t" - "ldr r9, [%[b], #16]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[14] * B[3]\n\t" - "ldr r8, [%[a], #56]\n\t" - "ldr r9, [%[b], #12]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[15] * B[2]\n\t" - "ldr r8, [%[a], #60]\n\t" - "ldr r9, [%[b], #8]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[16] * B[1]\n\t" - "ldr r8, [%[a], #64]\n\t" - "ldr r9, [%[b], #4]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[17] * B[0]\n\t" - "ldr r8, [%[a], #68]\n\t" - "ldr r9, [%[b], #0]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "str r5, [sp, #68]\n\t" - "# A[0] * B[18]\n\t" - "ldr r8, [%[a], #0]\n\t" - "ldr r9, [%[b], #72]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r10, r10\n\t" - "# A[1] * B[17]\n\t" - "ldr r8, [%[a], #4]\n\t" - "ldr r9, [%[b], #68]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[2] * B[16]\n\t" - "ldr r8, [%[a], #8]\n\t" - "ldr r9, [%[b], #64]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[3] * B[15]\n\t" - "ldr r8, [%[a], #12]\n\t" - "ldr r9, [%[b], #60]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[4] * B[14]\n\t" - "ldr r8, [%[a], #16]\n\t" - "ldr r9, [%[b], #56]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[5] * B[13]\n\t" - "ldr r8, [%[a], #20]\n\t" - "ldr r9, [%[b], #52]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[6] * B[12]\n\t" - "ldr r8, [%[a], #24]\n\t" - "ldr r9, [%[b], #48]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[7] * B[11]\n\t" - "ldr r8, [%[a], #28]\n\t" - "ldr r9, [%[b], #44]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[8] * B[10]\n\t" - "ldr r8, [%[a], #32]\n\t" - "ldr r9, [%[b], #40]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[9] * B[9]\n\t" - "ldr r8, [%[a], #36]\n\t" - "ldr r9, [%[b], #36]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[10] * B[8]\n\t" - "ldr r8, [%[a], #40]\n\t" - "ldr r9, [%[b], #32]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[11] * B[7]\n\t" - "ldr r8, [%[a], #44]\n\t" - "ldr r9, [%[b], #28]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[12] * B[6]\n\t" - "ldr r8, [%[a], #48]\n\t" - "ldr r9, [%[b], #24]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[13] * B[5]\n\t" - "ldr r8, [%[a], #52]\n\t" - "ldr r9, [%[b], #20]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[14] * B[4]\n\t" - "ldr r8, [%[a], #56]\n\t" - "ldr r9, [%[b], #16]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[15] * B[3]\n\t" - "ldr r8, [%[a], #60]\n\t" - "ldr r9, [%[b], #12]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[16] * B[2]\n\t" - "ldr r8, [%[a], #64]\n\t" - "ldr r9, [%[b], #8]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[17] * B[1]\n\t" - "ldr r8, [%[a], #68]\n\t" - "ldr r9, [%[b], #4]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[18] * B[0]\n\t" - "ldr r8, [%[a], #72]\n\t" - "ldr r9, [%[b], #0]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "str r3, [sp, #72]\n\t" - "# A[0] * B[19]\n\t" - "ldr r8, [%[a], #0]\n\t" - "ldr r9, [%[b], #76]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r10, r10\n\t" - "# A[1] * B[18]\n\t" - "ldr r8, [%[a], #4]\n\t" - "ldr r9, [%[b], #72]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[2] * B[17]\n\t" - "ldr r8, [%[a], #8]\n\t" - "ldr r9, [%[b], #68]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[3] * B[16]\n\t" - "ldr r8, [%[a], #12]\n\t" - "ldr r9, [%[b], #64]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[4] * B[15]\n\t" - "ldr r8, [%[a], #16]\n\t" - "ldr r9, [%[b], #60]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[5] * B[14]\n\t" - "ldr r8, [%[a], #20]\n\t" - "ldr r9, [%[b], #56]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[6] * B[13]\n\t" - "ldr r8, [%[a], #24]\n\t" - "ldr r9, [%[b], #52]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[7] * B[12]\n\t" - "ldr r8, [%[a], #28]\n\t" - "ldr r9, [%[b], #48]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[8] * B[11]\n\t" - "ldr r8, [%[a], #32]\n\t" - "ldr r9, [%[b], #44]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[9] * B[10]\n\t" - "ldr r8, [%[a], #36]\n\t" - "ldr r9, [%[b], #40]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[10] * B[9]\n\t" - "ldr r8, [%[a], #40]\n\t" - "ldr r9, [%[b], #36]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[11] * B[8]\n\t" - "ldr r8, [%[a], #44]\n\t" - "ldr r9, [%[b], #32]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[12] * B[7]\n\t" - "ldr r8, [%[a], #48]\n\t" - "ldr r9, [%[b], #28]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[13] * B[6]\n\t" - "ldr r8, [%[a], #52]\n\t" - "ldr r9, [%[b], #24]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[14] * B[5]\n\t" - "ldr r8, [%[a], #56]\n\t" - "ldr r9, [%[b], #20]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[15] * B[4]\n\t" - "ldr r8, [%[a], #60]\n\t" - "ldr r9, [%[b], #16]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[16] * B[3]\n\t" - "ldr r8, [%[a], #64]\n\t" - "ldr r9, [%[b], #12]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[17] * B[2]\n\t" - "ldr r8, [%[a], #68]\n\t" - "ldr r9, [%[b], #8]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[18] * B[1]\n\t" - "ldr r8, [%[a], #72]\n\t" - "ldr r9, [%[b], #4]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[19] * B[0]\n\t" - "ldr r8, [%[a], #76]\n\t" - "ldr r9, [%[b], #0]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "str r4, [sp, #76]\n\t" - "# A[0] * B[20]\n\t" - "ldr r8, [%[a], #0]\n\t" - "ldr r9, [%[b], #80]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r10, r10\n\t" - "# A[1] * B[19]\n\t" - "ldr r8, [%[a], #4]\n\t" - "ldr r9, [%[b], #76]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[2] * B[18]\n\t" - "ldr r8, [%[a], #8]\n\t" - "ldr r9, [%[b], #72]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[3] * B[17]\n\t" - "ldr r8, [%[a], #12]\n\t" - "ldr r9, [%[b], #68]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[4] * B[16]\n\t" - "ldr r8, [%[a], #16]\n\t" - "ldr r9, [%[b], #64]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[5] * B[15]\n\t" - "ldr r8, [%[a], #20]\n\t" - "ldr r9, [%[b], #60]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[6] * B[14]\n\t" - "ldr r8, [%[a], #24]\n\t" - "ldr r9, [%[b], #56]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[7] * B[13]\n\t" - "ldr r8, [%[a], #28]\n\t" - "ldr r9, [%[b], #52]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[8] * B[12]\n\t" - "ldr r8, [%[a], #32]\n\t" - "ldr r9, [%[b], #48]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[9] * B[11]\n\t" - "ldr r8, [%[a], #36]\n\t" - "ldr r9, [%[b], #44]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[10] * B[10]\n\t" - "ldr r8, [%[a], #40]\n\t" - "ldr r9, [%[b], #40]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[11] * B[9]\n\t" - "ldr r8, [%[a], #44]\n\t" - "ldr r9, [%[b], #36]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[12] * B[8]\n\t" - "ldr r8, [%[a], #48]\n\t" - "ldr r9, [%[b], #32]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[13] * B[7]\n\t" - "ldr r8, [%[a], #52]\n\t" - "ldr r9, [%[b], #28]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[14] * B[6]\n\t" - "ldr r8, [%[a], #56]\n\t" - "ldr r9, [%[b], #24]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[15] * B[5]\n\t" - "ldr r8, [%[a], #60]\n\t" - "ldr r9, [%[b], #20]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[16] * B[4]\n\t" - "ldr r8, [%[a], #64]\n\t" - "ldr r9, [%[b], #16]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[17] * B[3]\n\t" - "ldr r8, [%[a], #68]\n\t" - "ldr r9, [%[b], #12]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[18] * B[2]\n\t" - "ldr r8, [%[a], #72]\n\t" - "ldr r9, [%[b], #8]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[19] * B[1]\n\t" - "ldr r8, [%[a], #76]\n\t" - "ldr r9, [%[b], #4]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[20] * B[0]\n\t" - "ldr r8, [%[a], #80]\n\t" - "ldr r9, [%[b], #0]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "str r5, [sp, #80]\n\t" - "# A[0] * B[21]\n\t" - "ldr r8, [%[a], #0]\n\t" - "ldr r9, [%[b], #84]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r10, r10\n\t" - "# A[1] * B[20]\n\t" - "ldr r8, [%[a], #4]\n\t" - "ldr r9, [%[b], #80]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[2] * B[19]\n\t" - "ldr r8, [%[a], #8]\n\t" - "ldr r9, [%[b], #76]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[3] * B[18]\n\t" - "ldr r8, [%[a], #12]\n\t" - "ldr r9, [%[b], #72]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[4] * B[17]\n\t" - "ldr r8, [%[a], #16]\n\t" - "ldr r9, [%[b], #68]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[5] * B[16]\n\t" - "ldr r8, [%[a], #20]\n\t" - "ldr r9, [%[b], #64]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[6] * B[15]\n\t" - "ldr r8, [%[a], #24]\n\t" - "ldr r9, [%[b], #60]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[7] * B[14]\n\t" - "ldr r8, [%[a], #28]\n\t" - "ldr r9, [%[b], #56]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[8] * B[13]\n\t" - "ldr r8, [%[a], #32]\n\t" - "ldr r9, [%[b], #52]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[9] * B[12]\n\t" - "ldr r8, [%[a], #36]\n\t" - "ldr r9, [%[b], #48]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[10] * B[11]\n\t" - "ldr r8, [%[a], #40]\n\t" - "ldr r9, [%[b], #44]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[11] * B[10]\n\t" - "ldr r8, [%[a], #44]\n\t" - "ldr r9, [%[b], #40]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[12] * B[9]\n\t" - "ldr r8, [%[a], #48]\n\t" - "ldr r9, [%[b], #36]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[13] * B[8]\n\t" - "ldr r8, [%[a], #52]\n\t" - "ldr r9, [%[b], #32]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[14] * B[7]\n\t" - "ldr r8, [%[a], #56]\n\t" - "ldr r9, [%[b], #28]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[15] * B[6]\n\t" - "ldr r8, [%[a], #60]\n\t" - "ldr r9, [%[b], #24]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[16] * B[5]\n\t" - "ldr r8, [%[a], #64]\n\t" - "ldr r9, [%[b], #20]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[17] * B[4]\n\t" - "ldr r8, [%[a], #68]\n\t" - "ldr r9, [%[b], #16]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[18] * B[3]\n\t" - "ldr r8, [%[a], #72]\n\t" - "ldr r9, [%[b], #12]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[19] * B[2]\n\t" - "ldr r8, [%[a], #76]\n\t" - "ldr r9, [%[b], #8]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[20] * B[1]\n\t" - "ldr r8, [%[a], #80]\n\t" - "ldr r9, [%[b], #4]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[21] * B[0]\n\t" - "ldr r8, [%[a], #84]\n\t" - "ldr r9, [%[b], #0]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "str r3, [sp, #84]\n\t" - "# A[0] * B[22]\n\t" - "ldr r8, [%[a], #0]\n\t" - "ldr r9, [%[b], #88]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r10, r10\n\t" - "# A[1] * B[21]\n\t" - "ldr r8, [%[a], #4]\n\t" - "ldr r9, [%[b], #84]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[2] * B[20]\n\t" - "ldr r8, [%[a], #8]\n\t" - "ldr r9, [%[b], #80]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[3] * B[19]\n\t" - "ldr r8, [%[a], #12]\n\t" - "ldr r9, [%[b], #76]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[4] * B[18]\n\t" - "ldr r8, [%[a], #16]\n\t" - "ldr r9, [%[b], #72]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[5] * B[17]\n\t" - "ldr r8, [%[a], #20]\n\t" - "ldr r9, [%[b], #68]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[6] * B[16]\n\t" - "ldr r8, [%[a], #24]\n\t" - "ldr r9, [%[b], #64]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[7] * B[15]\n\t" - "ldr r8, [%[a], #28]\n\t" - "ldr r9, [%[b], #60]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[8] * B[14]\n\t" - "ldr r8, [%[a], #32]\n\t" - "ldr r9, [%[b], #56]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[9] * B[13]\n\t" - "ldr r8, [%[a], #36]\n\t" - "ldr r9, [%[b], #52]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[10] * B[12]\n\t" - "ldr r8, [%[a], #40]\n\t" - "ldr r9, [%[b], #48]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[11] * B[11]\n\t" - "ldr r8, [%[a], #44]\n\t" - "ldr r9, [%[b], #44]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[12] * B[10]\n\t" - "ldr r8, [%[a], #48]\n\t" - "ldr r9, [%[b], #40]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[13] * B[9]\n\t" - "ldr r8, [%[a], #52]\n\t" - "ldr r9, [%[b], #36]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[14] * B[8]\n\t" - "ldr r8, [%[a], #56]\n\t" - "ldr r9, [%[b], #32]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[15] * B[7]\n\t" - "ldr r8, [%[a], #60]\n\t" - "ldr r9, [%[b], #28]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[16] * B[6]\n\t" - "ldr r8, [%[a], #64]\n\t" - "ldr r9, [%[b], #24]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[17] * B[5]\n\t" - "ldr r8, [%[a], #68]\n\t" - "ldr r9, [%[b], #20]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[18] * B[4]\n\t" - "ldr r8, [%[a], #72]\n\t" - "ldr r9, [%[b], #16]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[19] * B[3]\n\t" - "ldr r8, [%[a], #76]\n\t" - "ldr r9, [%[b], #12]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[20] * B[2]\n\t" - "ldr r8, [%[a], #80]\n\t" - "ldr r9, [%[b], #8]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[21] * B[1]\n\t" - "ldr r8, [%[a], #84]\n\t" - "ldr r9, [%[b], #4]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[22] * B[0]\n\t" - "ldr r8, [%[a], #88]\n\t" - "ldr r9, [%[b], #0]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "str r4, [sp, #88]\n\t" - "# A[0] * B[23]\n\t" - "ldr r8, [%[a], #0]\n\t" - "ldr r9, [%[b], #92]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r10, r10\n\t" - "# A[1] * B[22]\n\t" - "ldr r8, [%[a], #4]\n\t" - "ldr r9, [%[b], #88]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[2] * B[21]\n\t" - "ldr r8, [%[a], #8]\n\t" - "ldr r9, [%[b], #84]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[3] * B[20]\n\t" - "ldr r8, [%[a], #12]\n\t" - "ldr r9, [%[b], #80]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[4] * B[19]\n\t" - "ldr r8, [%[a], #16]\n\t" - "ldr r9, [%[b], #76]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[5] * B[18]\n\t" - "ldr r8, [%[a], #20]\n\t" - "ldr r9, [%[b], #72]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[6] * B[17]\n\t" - "ldr r8, [%[a], #24]\n\t" - "ldr r9, [%[b], #68]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[7] * B[16]\n\t" - "ldr r8, [%[a], #28]\n\t" - "ldr r9, [%[b], #64]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[8] * B[15]\n\t" - "ldr r8, [%[a], #32]\n\t" - "ldr r9, [%[b], #60]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[9] * B[14]\n\t" - "ldr r8, [%[a], #36]\n\t" - "ldr r9, [%[b], #56]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[10] * B[13]\n\t" - "ldr r8, [%[a], #40]\n\t" - "ldr r9, [%[b], #52]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[11] * B[12]\n\t" - "ldr r8, [%[a], #44]\n\t" - "ldr r9, [%[b], #48]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[12] * B[11]\n\t" - "ldr r8, [%[a], #48]\n\t" - "ldr r9, [%[b], #44]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[13] * B[10]\n\t" - "ldr r8, [%[a], #52]\n\t" - "ldr r9, [%[b], #40]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[14] * B[9]\n\t" - "ldr r8, [%[a], #56]\n\t" - "ldr r9, [%[b], #36]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[15] * B[8]\n\t" - "ldr r8, [%[a], #60]\n\t" - "ldr r9, [%[b], #32]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[16] * B[7]\n\t" - "ldr r8, [%[a], #64]\n\t" - "ldr r9, [%[b], #28]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[17] * B[6]\n\t" - "ldr r8, [%[a], #68]\n\t" - "ldr r9, [%[b], #24]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[18] * B[5]\n\t" - "ldr r8, [%[a], #72]\n\t" - "ldr r9, [%[b], #20]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[19] * B[4]\n\t" - "ldr r8, [%[a], #76]\n\t" - "ldr r9, [%[b], #16]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[20] * B[3]\n\t" - "ldr r8, [%[a], #80]\n\t" - "ldr r9, [%[b], #12]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[21] * B[2]\n\t" - "ldr r8, [%[a], #84]\n\t" - "ldr r9, [%[b], #8]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[22] * B[1]\n\t" - "ldr r8, [%[a], #88]\n\t" - "ldr r9, [%[b], #4]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[23] * B[0]\n\t" - "ldr r8, [%[a], #92]\n\t" - "ldr r9, [%[b], #0]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "str r5, [sp, #92]\n\t" - "# A[0] * B[24]\n\t" - "ldr r8, [%[a], #0]\n\t" - "ldr r9, [%[b], #96]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r10, r10\n\t" - "# A[1] * B[23]\n\t" - "ldr r8, [%[a], #4]\n\t" - "ldr r9, [%[b], #92]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[2] * B[22]\n\t" - "ldr r8, [%[a], #8]\n\t" - "ldr r9, [%[b], #88]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[3] * B[21]\n\t" - "ldr r8, [%[a], #12]\n\t" - "ldr r9, [%[b], #84]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[4] * B[20]\n\t" - "ldr r8, [%[a], #16]\n\t" - "ldr r9, [%[b], #80]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[5] * B[19]\n\t" - "ldr r8, [%[a], #20]\n\t" - "ldr r9, [%[b], #76]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[6] * B[18]\n\t" - "ldr r8, [%[a], #24]\n\t" - "ldr r9, [%[b], #72]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[7] * B[17]\n\t" - "ldr r8, [%[a], #28]\n\t" - "ldr r9, [%[b], #68]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[8] * B[16]\n\t" - "ldr r8, [%[a], #32]\n\t" - "ldr r9, [%[b], #64]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[9] * B[15]\n\t" - "ldr r8, [%[a], #36]\n\t" - "ldr r9, [%[b], #60]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[10] * B[14]\n\t" - "ldr r8, [%[a], #40]\n\t" - "ldr r9, [%[b], #56]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[11] * B[13]\n\t" - "ldr r8, [%[a], #44]\n\t" - "ldr r9, [%[b], #52]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[12] * B[12]\n\t" - "ldr r8, [%[a], #48]\n\t" - "ldr r9, [%[b], #48]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[13] * B[11]\n\t" - "ldr r8, [%[a], #52]\n\t" - "ldr r9, [%[b], #44]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[14] * B[10]\n\t" - "ldr r8, [%[a], #56]\n\t" - "ldr r9, [%[b], #40]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[15] * B[9]\n\t" - "ldr r8, [%[a], #60]\n\t" - "ldr r9, [%[b], #36]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[16] * B[8]\n\t" - "ldr r8, [%[a], #64]\n\t" - "ldr r9, [%[b], #32]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[17] * B[7]\n\t" - "ldr r8, [%[a], #68]\n\t" - "ldr r9, [%[b], #28]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[18] * B[6]\n\t" - "ldr r8, [%[a], #72]\n\t" - "ldr r9, [%[b], #24]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[19] * B[5]\n\t" - "ldr r8, [%[a], #76]\n\t" - "ldr r9, [%[b], #20]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[20] * B[4]\n\t" - "ldr r8, [%[a], #80]\n\t" - "ldr r9, [%[b], #16]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[21] * B[3]\n\t" - "ldr r8, [%[a], #84]\n\t" - "ldr r9, [%[b], #12]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[22] * B[2]\n\t" - "ldr r8, [%[a], #88]\n\t" - "ldr r9, [%[b], #8]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[23] * B[1]\n\t" - "ldr r8, [%[a], #92]\n\t" - "ldr r9, [%[b], #4]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[24] * B[0]\n\t" - "ldr r8, [%[a], #96]\n\t" - "ldr r9, [%[b], #0]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "str r3, [sp, #96]\n\t" - "# A[0] * B[25]\n\t" - "ldr r8, [%[a], #0]\n\t" - "ldr r9, [%[b], #100]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r10, r10\n\t" - "# A[1] * B[24]\n\t" - "ldr r8, [%[a], #4]\n\t" - "ldr r9, [%[b], #96]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[2] * B[23]\n\t" - "ldr r8, [%[a], #8]\n\t" - "ldr r9, [%[b], #92]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[3] * B[22]\n\t" - "ldr r8, [%[a], #12]\n\t" - "ldr r9, [%[b], #88]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[4] * B[21]\n\t" - "ldr r8, [%[a], #16]\n\t" - "ldr r9, [%[b], #84]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[5] * B[20]\n\t" - "ldr r8, [%[a], #20]\n\t" - "ldr r9, [%[b], #80]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[6] * B[19]\n\t" - "ldr r8, [%[a], #24]\n\t" - "ldr r9, [%[b], #76]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[7] * B[18]\n\t" - "ldr r8, [%[a], #28]\n\t" - "ldr r9, [%[b], #72]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[8] * B[17]\n\t" - "ldr r8, [%[a], #32]\n\t" - "ldr r9, [%[b], #68]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[9] * B[16]\n\t" - "ldr r8, [%[a], #36]\n\t" - "ldr r9, [%[b], #64]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[10] * B[15]\n\t" - "ldr r8, [%[a], #40]\n\t" - "ldr r9, [%[b], #60]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[11] * B[14]\n\t" - "ldr r8, [%[a], #44]\n\t" - "ldr r9, [%[b], #56]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[12] * B[13]\n\t" - "ldr r8, [%[a], #48]\n\t" - "ldr r9, [%[b], #52]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[13] * B[12]\n\t" - "ldr r8, [%[a], #52]\n\t" - "ldr r9, [%[b], #48]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[14] * B[11]\n\t" - "ldr r8, [%[a], #56]\n\t" - "ldr r9, [%[b], #44]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[15] * B[10]\n\t" - "ldr r8, [%[a], #60]\n\t" - "ldr r9, [%[b], #40]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[16] * B[9]\n\t" - "ldr r8, [%[a], #64]\n\t" - "ldr r9, [%[b], #36]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[17] * B[8]\n\t" - "ldr r8, [%[a], #68]\n\t" - "ldr r9, [%[b], #32]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[18] * B[7]\n\t" - "ldr r8, [%[a], #72]\n\t" - "ldr r9, [%[b], #28]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[19] * B[6]\n\t" - "ldr r8, [%[a], #76]\n\t" - "ldr r9, [%[b], #24]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[20] * B[5]\n\t" - "ldr r8, [%[a], #80]\n\t" - "ldr r9, [%[b], #20]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[21] * B[4]\n\t" - "ldr r8, [%[a], #84]\n\t" - "ldr r9, [%[b], #16]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[22] * B[3]\n\t" - "ldr r8, [%[a], #88]\n\t" - "ldr r9, [%[b], #12]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[23] * B[2]\n\t" - "ldr r8, [%[a], #92]\n\t" - "ldr r9, [%[b], #8]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[24] * B[1]\n\t" - "ldr r8, [%[a], #96]\n\t" - "ldr r9, [%[b], #4]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[25] * B[0]\n\t" - "ldr r8, [%[a], #100]\n\t" - "ldr r9, [%[b], #0]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "str r4, [sp, #100]\n\t" - "# A[0] * B[26]\n\t" - "ldr r8, [%[a], #0]\n\t" - "ldr r9, [%[b], #104]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r10, r10\n\t" - "# A[1] * B[25]\n\t" - "ldr r8, [%[a], #4]\n\t" - "ldr r9, [%[b], #100]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[2] * B[24]\n\t" - "ldr r8, [%[a], #8]\n\t" - "ldr r9, [%[b], #96]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[3] * B[23]\n\t" - "ldr r8, [%[a], #12]\n\t" - "ldr r9, [%[b], #92]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[4] * B[22]\n\t" - "ldr r8, [%[a], #16]\n\t" - "ldr r9, [%[b], #88]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[5] * B[21]\n\t" - "ldr r8, [%[a], #20]\n\t" - "ldr r9, [%[b], #84]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[6] * B[20]\n\t" - "ldr r8, [%[a], #24]\n\t" - "ldr r9, [%[b], #80]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[7] * B[19]\n\t" - "ldr r8, [%[a], #28]\n\t" - "ldr r9, [%[b], #76]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[8] * B[18]\n\t" - "ldr r8, [%[a], #32]\n\t" - "ldr r9, [%[b], #72]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[9] * B[17]\n\t" - "ldr r8, [%[a], #36]\n\t" - "ldr r9, [%[b], #68]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[10] * B[16]\n\t" - "ldr r8, [%[a], #40]\n\t" - "ldr r9, [%[b], #64]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[11] * B[15]\n\t" - "ldr r8, [%[a], #44]\n\t" - "ldr r9, [%[b], #60]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[12] * B[14]\n\t" - "ldr r8, [%[a], #48]\n\t" - "ldr r9, [%[b], #56]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[13] * B[13]\n\t" - "ldr r8, [%[a], #52]\n\t" - "ldr r9, [%[b], #52]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[14] * B[12]\n\t" - "ldr r8, [%[a], #56]\n\t" - "ldr r9, [%[b], #48]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[15] * B[11]\n\t" - "ldr r8, [%[a], #60]\n\t" - "ldr r9, [%[b], #44]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[16] * B[10]\n\t" - "ldr r8, [%[a], #64]\n\t" - "ldr r9, [%[b], #40]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[17] * B[9]\n\t" - "ldr r8, [%[a], #68]\n\t" - "ldr r9, [%[b], #36]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[18] * B[8]\n\t" - "ldr r8, [%[a], #72]\n\t" - "ldr r9, [%[b], #32]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[19] * B[7]\n\t" - "ldr r8, [%[a], #76]\n\t" - "ldr r9, [%[b], #28]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[20] * B[6]\n\t" - "ldr r8, [%[a], #80]\n\t" - "ldr r9, [%[b], #24]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[21] * B[5]\n\t" - "ldr r8, [%[a], #84]\n\t" - "ldr r9, [%[b], #20]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[22] * B[4]\n\t" - "ldr r8, [%[a], #88]\n\t" - "ldr r9, [%[b], #16]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[23] * B[3]\n\t" - "ldr r8, [%[a], #92]\n\t" - "ldr r9, [%[b], #12]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[24] * B[2]\n\t" - "ldr r8, [%[a], #96]\n\t" - "ldr r9, [%[b], #8]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[25] * B[1]\n\t" - "ldr r8, [%[a], #100]\n\t" - "ldr r9, [%[b], #4]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[26] * B[0]\n\t" - "ldr r8, [%[a], #104]\n\t" - "ldr r9, [%[b], #0]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "str r5, [sp, #104]\n\t" - "# A[0] * B[27]\n\t" - "ldr r8, [%[a], #0]\n\t" - "ldr r9, [%[b], #108]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r10, r10\n\t" - "# A[1] * B[26]\n\t" - "ldr r8, [%[a], #4]\n\t" - "ldr r9, [%[b], #104]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[2] * B[25]\n\t" - "ldr r8, [%[a], #8]\n\t" - "ldr r9, [%[b], #100]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[3] * B[24]\n\t" - "ldr r8, [%[a], #12]\n\t" - "ldr r9, [%[b], #96]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[4] * B[23]\n\t" - "ldr r8, [%[a], #16]\n\t" - "ldr r9, [%[b], #92]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[5] * B[22]\n\t" - "ldr r8, [%[a], #20]\n\t" - "ldr r9, [%[b], #88]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[6] * B[21]\n\t" - "ldr r8, [%[a], #24]\n\t" - "ldr r9, [%[b], #84]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[7] * B[20]\n\t" - "ldr r8, [%[a], #28]\n\t" - "ldr r9, [%[b], #80]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[8] * B[19]\n\t" - "ldr r8, [%[a], #32]\n\t" - "ldr r9, [%[b], #76]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[9] * B[18]\n\t" - "ldr r8, [%[a], #36]\n\t" - "ldr r9, [%[b], #72]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[10] * B[17]\n\t" - "ldr r8, [%[a], #40]\n\t" - "ldr r9, [%[b], #68]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[11] * B[16]\n\t" - "ldr r8, [%[a], #44]\n\t" - "ldr r9, [%[b], #64]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[12] * B[15]\n\t" - "ldr r8, [%[a], #48]\n\t" - "ldr r9, [%[b], #60]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[13] * B[14]\n\t" - "ldr r8, [%[a], #52]\n\t" - "ldr r9, [%[b], #56]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[14] * B[13]\n\t" - "ldr r8, [%[a], #56]\n\t" - "ldr r9, [%[b], #52]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[15] * B[12]\n\t" - "ldr r8, [%[a], #60]\n\t" - "ldr r9, [%[b], #48]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[16] * B[11]\n\t" - "ldr r8, [%[a], #64]\n\t" - "ldr r9, [%[b], #44]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[17] * B[10]\n\t" - "ldr r8, [%[a], #68]\n\t" - "ldr r9, [%[b], #40]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[18] * B[9]\n\t" - "ldr r8, [%[a], #72]\n\t" - "ldr r9, [%[b], #36]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[19] * B[8]\n\t" - "ldr r8, [%[a], #76]\n\t" - "ldr r9, [%[b], #32]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[20] * B[7]\n\t" - "ldr r8, [%[a], #80]\n\t" - "ldr r9, [%[b], #28]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[21] * B[6]\n\t" - "ldr r8, [%[a], #84]\n\t" - "ldr r9, [%[b], #24]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[22] * B[5]\n\t" - "ldr r8, [%[a], #88]\n\t" - "ldr r9, [%[b], #20]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[23] * B[4]\n\t" - "ldr r8, [%[a], #92]\n\t" - "ldr r9, [%[b], #16]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[24] * B[3]\n\t" - "ldr r8, [%[a], #96]\n\t" - "ldr r9, [%[b], #12]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[25] * B[2]\n\t" - "ldr r8, [%[a], #100]\n\t" - "ldr r9, [%[b], #8]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[26] * B[1]\n\t" - "ldr r8, [%[a], #104]\n\t" - "ldr r9, [%[b], #4]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[27] * B[0]\n\t" - "ldr r8, [%[a], #108]\n\t" - "ldr r9, [%[b], #0]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "str r3, [sp, #108]\n\t" - "# A[0] * B[28]\n\t" - "ldr r8, [%[a], #0]\n\t" - "ldr r9, [%[b], #112]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r10, r10\n\t" - "# A[1] * B[27]\n\t" - "ldr r8, [%[a], #4]\n\t" - "ldr r9, [%[b], #108]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[2] * B[26]\n\t" - "ldr r8, [%[a], #8]\n\t" - "ldr r9, [%[b], #104]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[3] * B[25]\n\t" - "ldr r8, [%[a], #12]\n\t" - "ldr r9, [%[b], #100]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[4] * B[24]\n\t" - "ldr r8, [%[a], #16]\n\t" - "ldr r9, [%[b], #96]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[5] * B[23]\n\t" - "ldr r8, [%[a], #20]\n\t" - "ldr r9, [%[b], #92]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[6] * B[22]\n\t" - "ldr r8, [%[a], #24]\n\t" - "ldr r9, [%[b], #88]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[7] * B[21]\n\t" - "ldr r8, [%[a], #28]\n\t" - "ldr r9, [%[b], #84]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[8] * B[20]\n\t" - "ldr r8, [%[a], #32]\n\t" - "ldr r9, [%[b], #80]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[9] * B[19]\n\t" - "ldr r8, [%[a], #36]\n\t" - "ldr r9, [%[b], #76]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[10] * B[18]\n\t" - "ldr r8, [%[a], #40]\n\t" - "ldr r9, [%[b], #72]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[11] * B[17]\n\t" - "ldr r8, [%[a], #44]\n\t" - "ldr r9, [%[b], #68]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[12] * B[16]\n\t" - "ldr r8, [%[a], #48]\n\t" - "ldr r9, [%[b], #64]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[13] * B[15]\n\t" - "ldr r8, [%[a], #52]\n\t" - "ldr r9, [%[b], #60]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[14] * B[14]\n\t" - "ldr r8, [%[a], #56]\n\t" - "ldr r9, [%[b], #56]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[15] * B[13]\n\t" - "ldr r8, [%[a], #60]\n\t" - "ldr r9, [%[b], #52]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[16] * B[12]\n\t" - "ldr r8, [%[a], #64]\n\t" - "ldr r9, [%[b], #48]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[17] * B[11]\n\t" - "ldr r8, [%[a], #68]\n\t" - "ldr r9, [%[b], #44]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[18] * B[10]\n\t" - "ldr r8, [%[a], #72]\n\t" - "ldr r9, [%[b], #40]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[19] * B[9]\n\t" - "ldr r8, [%[a], #76]\n\t" - "ldr r9, [%[b], #36]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[20] * B[8]\n\t" - "ldr r8, [%[a], #80]\n\t" - "ldr r9, [%[b], #32]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[21] * B[7]\n\t" - "ldr r8, [%[a], #84]\n\t" - "ldr r9, [%[b], #28]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[22] * B[6]\n\t" - "ldr r8, [%[a], #88]\n\t" - "ldr r9, [%[b], #24]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[23] * B[5]\n\t" - "ldr r8, [%[a], #92]\n\t" - "ldr r9, [%[b], #20]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[24] * B[4]\n\t" - "ldr r8, [%[a], #96]\n\t" - "ldr r9, [%[b], #16]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[25] * B[3]\n\t" - "ldr r8, [%[a], #100]\n\t" - "ldr r9, [%[b], #12]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[26] * B[2]\n\t" - "ldr r8, [%[a], #104]\n\t" - "ldr r9, [%[b], #8]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[27] * B[1]\n\t" - "ldr r8, [%[a], #108]\n\t" - "ldr r9, [%[b], #4]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[28] * B[0]\n\t" - "ldr r8, [%[a], #112]\n\t" - "ldr r9, [%[b], #0]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "str r4, [sp, #112]\n\t" - "# A[0] * B[29]\n\t" - "ldr r8, [%[a], #0]\n\t" - "ldr r9, [%[b], #116]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r10, r10\n\t" - "# A[1] * B[28]\n\t" - "ldr r8, [%[a], #4]\n\t" - "ldr r9, [%[b], #112]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[2] * B[27]\n\t" - "ldr r8, [%[a], #8]\n\t" - "ldr r9, [%[b], #108]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[3] * B[26]\n\t" - "ldr r8, [%[a], #12]\n\t" - "ldr r9, [%[b], #104]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[4] * B[25]\n\t" - "ldr r8, [%[a], #16]\n\t" - "ldr r9, [%[b], #100]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[5] * B[24]\n\t" - "ldr r8, [%[a], #20]\n\t" - "ldr r9, [%[b], #96]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[6] * B[23]\n\t" - "ldr r8, [%[a], #24]\n\t" - "ldr r9, [%[b], #92]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[7] * B[22]\n\t" - "ldr r8, [%[a], #28]\n\t" - "ldr r9, [%[b], #88]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[8] * B[21]\n\t" - "ldr r8, [%[a], #32]\n\t" - "ldr r9, [%[b], #84]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[9] * B[20]\n\t" - "ldr r8, [%[a], #36]\n\t" - "ldr r9, [%[b], #80]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[10] * B[19]\n\t" - "ldr r8, [%[a], #40]\n\t" - "ldr r9, [%[b], #76]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[11] * B[18]\n\t" - "ldr r8, [%[a], #44]\n\t" - "ldr r9, [%[b], #72]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[12] * B[17]\n\t" - "ldr r8, [%[a], #48]\n\t" - "ldr r9, [%[b], #68]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[13] * B[16]\n\t" - "ldr r8, [%[a], #52]\n\t" - "ldr r9, [%[b], #64]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[14] * B[15]\n\t" - "ldr r8, [%[a], #56]\n\t" - "ldr r9, [%[b], #60]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[15] * B[14]\n\t" - "ldr r8, [%[a], #60]\n\t" - "ldr r9, [%[b], #56]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[16] * B[13]\n\t" - "ldr r8, [%[a], #64]\n\t" - "ldr r9, [%[b], #52]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[17] * B[12]\n\t" - "ldr r8, [%[a], #68]\n\t" - "ldr r9, [%[b], #48]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[18] * B[11]\n\t" - "ldr r8, [%[a], #72]\n\t" - "ldr r9, [%[b], #44]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[19] * B[10]\n\t" - "ldr r8, [%[a], #76]\n\t" - "ldr r9, [%[b], #40]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[20] * B[9]\n\t" - "ldr r8, [%[a], #80]\n\t" - "ldr r9, [%[b], #36]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[21] * B[8]\n\t" - "ldr r8, [%[a], #84]\n\t" - "ldr r9, [%[b], #32]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[22] * B[7]\n\t" - "ldr r8, [%[a], #88]\n\t" - "ldr r9, [%[b], #28]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[23] * B[6]\n\t" - "ldr r8, [%[a], #92]\n\t" - "ldr r9, [%[b], #24]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[24] * B[5]\n\t" - "ldr r8, [%[a], #96]\n\t" - "ldr r9, [%[b], #20]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[25] * B[4]\n\t" - "ldr r8, [%[a], #100]\n\t" - "ldr r9, [%[b], #16]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[26] * B[3]\n\t" - "ldr r8, [%[a], #104]\n\t" - "ldr r9, [%[b], #12]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[27] * B[2]\n\t" - "ldr r8, [%[a], #108]\n\t" - "ldr r9, [%[b], #8]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[28] * B[1]\n\t" - "ldr r8, [%[a], #112]\n\t" - "ldr r9, [%[b], #4]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[29] * B[0]\n\t" - "ldr r8, [%[a], #116]\n\t" - "ldr r9, [%[b], #0]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "str r5, [sp, #116]\n\t" - "# A[0] * B[30]\n\t" - "ldr r8, [%[a], #0]\n\t" - "ldr r9, [%[b], #120]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r10, r10\n\t" - "# A[1] * B[29]\n\t" - "ldr r8, [%[a], #4]\n\t" - "ldr r9, [%[b], #116]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[2] * B[28]\n\t" - "ldr r8, [%[a], #8]\n\t" - "ldr r9, [%[b], #112]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[3] * B[27]\n\t" - "ldr r8, [%[a], #12]\n\t" - "ldr r9, [%[b], #108]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[4] * B[26]\n\t" - "ldr r8, [%[a], #16]\n\t" - "ldr r9, [%[b], #104]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[5] * B[25]\n\t" - "ldr r8, [%[a], #20]\n\t" - "ldr r9, [%[b], #100]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[6] * B[24]\n\t" - "ldr r8, [%[a], #24]\n\t" - "ldr r9, [%[b], #96]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[7] * B[23]\n\t" - "ldr r8, [%[a], #28]\n\t" - "ldr r9, [%[b], #92]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[8] * B[22]\n\t" - "ldr r8, [%[a], #32]\n\t" - "ldr r9, [%[b], #88]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[9] * B[21]\n\t" - "ldr r8, [%[a], #36]\n\t" - "ldr r9, [%[b], #84]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[10] * B[20]\n\t" - "ldr r8, [%[a], #40]\n\t" - "ldr r9, [%[b], #80]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[11] * B[19]\n\t" - "ldr r8, [%[a], #44]\n\t" - "ldr r9, [%[b], #76]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[12] * B[18]\n\t" - "ldr r8, [%[a], #48]\n\t" - "ldr r9, [%[b], #72]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[13] * B[17]\n\t" - "ldr r8, [%[a], #52]\n\t" - "ldr r9, [%[b], #68]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[14] * B[16]\n\t" - "ldr r8, [%[a], #56]\n\t" - "ldr r9, [%[b], #64]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[15] * B[15]\n\t" - "ldr r8, [%[a], #60]\n\t" - "ldr r9, [%[b], #60]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[16] * B[14]\n\t" - "ldr r8, [%[a], #64]\n\t" - "ldr r9, [%[b], #56]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[17] * B[13]\n\t" - "ldr r8, [%[a], #68]\n\t" - "ldr r9, [%[b], #52]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[18] * B[12]\n\t" - "ldr r8, [%[a], #72]\n\t" - "ldr r9, [%[b], #48]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[19] * B[11]\n\t" - "ldr r8, [%[a], #76]\n\t" - "ldr r9, [%[b], #44]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[20] * B[10]\n\t" - "ldr r8, [%[a], #80]\n\t" - "ldr r9, [%[b], #40]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[21] * B[9]\n\t" - "ldr r8, [%[a], #84]\n\t" - "ldr r9, [%[b], #36]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[22] * B[8]\n\t" - "ldr r8, [%[a], #88]\n\t" - "ldr r9, [%[b], #32]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[23] * B[7]\n\t" - "ldr r8, [%[a], #92]\n\t" - "ldr r9, [%[b], #28]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[24] * B[6]\n\t" - "ldr r8, [%[a], #96]\n\t" - "ldr r9, [%[b], #24]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[25] * B[5]\n\t" - "ldr r8, [%[a], #100]\n\t" - "ldr r9, [%[b], #20]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[26] * B[4]\n\t" - "ldr r8, [%[a], #104]\n\t" - "ldr r9, [%[b], #16]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[27] * B[3]\n\t" - "ldr r8, [%[a], #108]\n\t" - "ldr r9, [%[b], #12]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[28] * B[2]\n\t" - "ldr r8, [%[a], #112]\n\t" - "ldr r9, [%[b], #8]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[29] * B[1]\n\t" - "ldr r8, [%[a], #116]\n\t" - "ldr r9, [%[b], #4]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[30] * B[0]\n\t" - "ldr r8, [%[a], #120]\n\t" - "ldr r9, [%[b], #0]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "str r3, [sp, #120]\n\t" - "# A[0] * B[31]\n\t" - "ldr r8, [%[a], #0]\n\t" - "ldr r9, [%[b], #124]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r10, r10\n\t" - "# A[1] * B[30]\n\t" - "ldr r8, [%[a], #4]\n\t" - "ldr r9, [%[b], #120]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[2] * B[29]\n\t" - "ldr r8, [%[a], #8]\n\t" - "ldr r9, [%[b], #116]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[3] * B[28]\n\t" - "ldr r8, [%[a], #12]\n\t" - "ldr r9, [%[b], #112]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[4] * B[27]\n\t" - "ldr r8, [%[a], #16]\n\t" - "ldr r9, [%[b], #108]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[5] * B[26]\n\t" - "ldr r8, [%[a], #20]\n\t" - "ldr r9, [%[b], #104]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[6] * B[25]\n\t" - "ldr r8, [%[a], #24]\n\t" - "ldr r9, [%[b], #100]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[7] * B[24]\n\t" - "ldr r8, [%[a], #28]\n\t" - "ldr r9, [%[b], #96]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[8] * B[23]\n\t" - "ldr r8, [%[a], #32]\n\t" - "ldr r9, [%[b], #92]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[9] * B[22]\n\t" - "ldr r8, [%[a], #36]\n\t" - "ldr r9, [%[b], #88]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[10] * B[21]\n\t" - "ldr r8, [%[a], #40]\n\t" - "ldr r9, [%[b], #84]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[11] * B[20]\n\t" - "ldr r8, [%[a], #44]\n\t" - "ldr r9, [%[b], #80]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[12] * B[19]\n\t" - "ldr r8, [%[a], #48]\n\t" - "ldr r9, [%[b], #76]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[13] * B[18]\n\t" - "ldr r8, [%[a], #52]\n\t" - "ldr r9, [%[b], #72]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[14] * B[17]\n\t" - "ldr r8, [%[a], #56]\n\t" - "ldr r9, [%[b], #68]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[15] * B[16]\n\t" - "ldr r8, [%[a], #60]\n\t" - "ldr r9, [%[b], #64]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[16] * B[15]\n\t" - "ldr r8, [%[a], #64]\n\t" - "ldr r9, [%[b], #60]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[17] * B[14]\n\t" - "ldr r8, [%[a], #68]\n\t" - "ldr r9, [%[b], #56]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[18] * B[13]\n\t" - "ldr r8, [%[a], #72]\n\t" - "ldr r9, [%[b], #52]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[19] * B[12]\n\t" - "ldr r8, [%[a], #76]\n\t" - "ldr r9, [%[b], #48]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[20] * B[11]\n\t" - "ldr r8, [%[a], #80]\n\t" - "ldr r9, [%[b], #44]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[21] * B[10]\n\t" - "ldr r8, [%[a], #84]\n\t" - "ldr r9, [%[b], #40]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[22] * B[9]\n\t" - "ldr r8, [%[a], #88]\n\t" - "ldr r9, [%[b], #36]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[23] * B[8]\n\t" - "ldr r8, [%[a], #92]\n\t" - "ldr r9, [%[b], #32]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[24] * B[7]\n\t" - "ldr r8, [%[a], #96]\n\t" - "ldr r9, [%[b], #28]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[25] * B[6]\n\t" - "ldr r8, [%[a], #100]\n\t" - "ldr r9, [%[b], #24]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[26] * B[5]\n\t" - "ldr r8, [%[a], #104]\n\t" - "ldr r9, [%[b], #20]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[27] * B[4]\n\t" - "ldr r8, [%[a], #108]\n\t" - "ldr r9, [%[b], #16]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[28] * B[3]\n\t" - "ldr r8, [%[a], #112]\n\t" - "ldr r9, [%[b], #12]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[29] * B[2]\n\t" - "ldr r8, [%[a], #116]\n\t" - "ldr r9, [%[b], #8]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[30] * B[1]\n\t" - "ldr r8, [%[a], #120]\n\t" - "ldr r9, [%[b], #4]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[31] * B[0]\n\t" - "ldr r8, [%[a], #124]\n\t" - "ldr r9, [%[b], #0]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "str r4, [sp, #124]\n\t" - "# A[0] * B[32]\n\t" - "ldr r8, [%[a], #0]\n\t" - "ldr r9, [%[b], #128]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r10, r10\n\t" - "# A[1] * B[31]\n\t" - "ldr r8, [%[a], #4]\n\t" - "ldr r9, [%[b], #124]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[2] * B[30]\n\t" - "ldr r8, [%[a], #8]\n\t" - "ldr r9, [%[b], #120]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[3] * B[29]\n\t" - "ldr r8, [%[a], #12]\n\t" - "ldr r9, [%[b], #116]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[4] * B[28]\n\t" - "ldr r8, [%[a], #16]\n\t" - "ldr r9, [%[b], #112]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[5] * B[27]\n\t" - "ldr r8, [%[a], #20]\n\t" - "ldr r9, [%[b], #108]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[6] * B[26]\n\t" - "ldr r8, [%[a], #24]\n\t" - "ldr r9, [%[b], #104]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[7] * B[25]\n\t" - "ldr r8, [%[a], #28]\n\t" - "ldr r9, [%[b], #100]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[8] * B[24]\n\t" - "ldr r8, [%[a], #32]\n\t" - "ldr r9, [%[b], #96]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[9] * B[23]\n\t" - "ldr r8, [%[a], #36]\n\t" - "ldr r9, [%[b], #92]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[10] * B[22]\n\t" - "ldr r8, [%[a], #40]\n\t" - "ldr r9, [%[b], #88]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[11] * B[21]\n\t" - "ldr r8, [%[a], #44]\n\t" - "ldr r9, [%[b], #84]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[12] * B[20]\n\t" - "ldr r8, [%[a], #48]\n\t" - "ldr r9, [%[b], #80]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[13] * B[19]\n\t" - "ldr r8, [%[a], #52]\n\t" - "ldr r9, [%[b], #76]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[14] * B[18]\n\t" - "ldr r8, [%[a], #56]\n\t" - "ldr r9, [%[b], #72]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[15] * B[17]\n\t" - "ldr r8, [%[a], #60]\n\t" - "ldr r9, [%[b], #68]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[16] * B[16]\n\t" - "ldr r8, [%[a], #64]\n\t" - "ldr r9, [%[b], #64]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[17] * B[15]\n\t" - "ldr r8, [%[a], #68]\n\t" - "ldr r9, [%[b], #60]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[18] * B[14]\n\t" - "ldr r8, [%[a], #72]\n\t" - "ldr r9, [%[b], #56]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[19] * B[13]\n\t" - "ldr r8, [%[a], #76]\n\t" - "ldr r9, [%[b], #52]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[20] * B[12]\n\t" - "ldr r8, [%[a], #80]\n\t" - "ldr r9, [%[b], #48]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[21] * B[11]\n\t" - "ldr r8, [%[a], #84]\n\t" - "ldr r9, [%[b], #44]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[22] * B[10]\n\t" - "ldr r8, [%[a], #88]\n\t" - "ldr r9, [%[b], #40]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[23] * B[9]\n\t" - "ldr r8, [%[a], #92]\n\t" - "ldr r9, [%[b], #36]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[24] * B[8]\n\t" - "ldr r8, [%[a], #96]\n\t" - "ldr r9, [%[b], #32]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[25] * B[7]\n\t" - "ldr r8, [%[a], #100]\n\t" - "ldr r9, [%[b], #28]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[26] * B[6]\n\t" - "ldr r8, [%[a], #104]\n\t" - "ldr r9, [%[b], #24]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[27] * B[5]\n\t" - "ldr r8, [%[a], #108]\n\t" - "ldr r9, [%[b], #20]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[28] * B[4]\n\t" - "ldr r8, [%[a], #112]\n\t" - "ldr r9, [%[b], #16]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[29] * B[3]\n\t" - "ldr r8, [%[a], #116]\n\t" - "ldr r9, [%[b], #12]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[30] * B[2]\n\t" - "ldr r8, [%[a], #120]\n\t" - "ldr r9, [%[b], #8]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[31] * B[1]\n\t" - "ldr r8, [%[a], #124]\n\t" - "ldr r9, [%[b], #4]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[32] * B[0]\n\t" - "ldr r8, [%[a], #128]\n\t" - "ldr r9, [%[b], #0]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "str r5, [sp, #128]\n\t" - "# A[0] * B[33]\n\t" - "ldr r8, [%[a], #0]\n\t" - "ldr r9, [%[b], #132]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r10, r10\n\t" - "# A[1] * B[32]\n\t" - "ldr r8, [%[a], #4]\n\t" - "ldr r9, [%[b], #128]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[2] * B[31]\n\t" - "ldr r8, [%[a], #8]\n\t" - "ldr r9, [%[b], #124]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[3] * B[30]\n\t" - "ldr r8, [%[a], #12]\n\t" - "ldr r9, [%[b], #120]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[4] * B[29]\n\t" - "ldr r8, [%[a], #16]\n\t" - "ldr r9, [%[b], #116]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[5] * B[28]\n\t" - "ldr r8, [%[a], #20]\n\t" - "ldr r9, [%[b], #112]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[6] * B[27]\n\t" - "ldr r8, [%[a], #24]\n\t" - "ldr r9, [%[b], #108]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[7] * B[26]\n\t" - "ldr r8, [%[a], #28]\n\t" - "ldr r9, [%[b], #104]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[8] * B[25]\n\t" - "ldr r8, [%[a], #32]\n\t" - "ldr r9, [%[b], #100]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[9] * B[24]\n\t" - "ldr r8, [%[a], #36]\n\t" - "ldr r9, [%[b], #96]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[10] * B[23]\n\t" - "ldr r8, [%[a], #40]\n\t" - "ldr r9, [%[b], #92]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[11] * B[22]\n\t" - "ldr r8, [%[a], #44]\n\t" - "ldr r9, [%[b], #88]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[12] * B[21]\n\t" - "ldr r8, [%[a], #48]\n\t" - "ldr r9, [%[b], #84]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[13] * B[20]\n\t" - "ldr r8, [%[a], #52]\n\t" - "ldr r9, [%[b], #80]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[14] * B[19]\n\t" - "ldr r8, [%[a], #56]\n\t" - "ldr r9, [%[b], #76]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[15] * B[18]\n\t" - "ldr r8, [%[a], #60]\n\t" - "ldr r9, [%[b], #72]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[16] * B[17]\n\t" - "ldr r8, [%[a], #64]\n\t" - "ldr r9, [%[b], #68]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[17] * B[16]\n\t" - "ldr r8, [%[a], #68]\n\t" - "ldr r9, [%[b], #64]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[18] * B[15]\n\t" - "ldr r8, [%[a], #72]\n\t" - "ldr r9, [%[b], #60]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[19] * B[14]\n\t" - "ldr r8, [%[a], #76]\n\t" - "ldr r9, [%[b], #56]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[20] * B[13]\n\t" - "ldr r8, [%[a], #80]\n\t" - "ldr r9, [%[b], #52]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[21] * B[12]\n\t" - "ldr r8, [%[a], #84]\n\t" - "ldr r9, [%[b], #48]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[22] * B[11]\n\t" - "ldr r8, [%[a], #88]\n\t" - "ldr r9, [%[b], #44]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[23] * B[10]\n\t" - "ldr r8, [%[a], #92]\n\t" - "ldr r9, [%[b], #40]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[24] * B[9]\n\t" - "ldr r8, [%[a], #96]\n\t" - "ldr r9, [%[b], #36]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[25] * B[8]\n\t" - "ldr r8, [%[a], #100]\n\t" - "ldr r9, [%[b], #32]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[26] * B[7]\n\t" - "ldr r8, [%[a], #104]\n\t" - "ldr r9, [%[b], #28]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[27] * B[6]\n\t" - "ldr r8, [%[a], #108]\n\t" - "ldr r9, [%[b], #24]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[28] * B[5]\n\t" - "ldr r8, [%[a], #112]\n\t" - "ldr r9, [%[b], #20]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[29] * B[4]\n\t" - "ldr r8, [%[a], #116]\n\t" - "ldr r9, [%[b], #16]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[30] * B[3]\n\t" - "ldr r8, [%[a], #120]\n\t" - "ldr r9, [%[b], #12]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[31] * B[2]\n\t" - "ldr r8, [%[a], #124]\n\t" - "ldr r9, [%[b], #8]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[32] * B[1]\n\t" - "ldr r8, [%[a], #128]\n\t" - "ldr r9, [%[b], #4]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[33] * B[0]\n\t" - "ldr r8, [%[a], #132]\n\t" - "ldr r9, [%[b], #0]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "str r3, [sp, #132]\n\t" - "# A[0] * B[34]\n\t" - "ldr r8, [%[a], #0]\n\t" - "ldr r9, [%[b], #136]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r10, r10\n\t" - "# A[1] * B[33]\n\t" - "ldr r8, [%[a], #4]\n\t" - "ldr r9, [%[b], #132]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[2] * B[32]\n\t" - "ldr r8, [%[a], #8]\n\t" - "ldr r9, [%[b], #128]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[3] * B[31]\n\t" - "ldr r8, [%[a], #12]\n\t" - "ldr r9, [%[b], #124]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[4] * B[30]\n\t" - "ldr r8, [%[a], #16]\n\t" - "ldr r9, [%[b], #120]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[5] * B[29]\n\t" - "ldr r8, [%[a], #20]\n\t" - "ldr r9, [%[b], #116]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[6] * B[28]\n\t" - "ldr r8, [%[a], #24]\n\t" - "ldr r9, [%[b], #112]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[7] * B[27]\n\t" - "ldr r8, [%[a], #28]\n\t" - "ldr r9, [%[b], #108]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[8] * B[26]\n\t" - "ldr r8, [%[a], #32]\n\t" - "ldr r9, [%[b], #104]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[9] * B[25]\n\t" - "ldr r8, [%[a], #36]\n\t" - "ldr r9, [%[b], #100]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[10] * B[24]\n\t" - "ldr r8, [%[a], #40]\n\t" - "ldr r9, [%[b], #96]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[11] * B[23]\n\t" - "ldr r8, [%[a], #44]\n\t" - "ldr r9, [%[b], #92]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[12] * B[22]\n\t" - "ldr r8, [%[a], #48]\n\t" - "ldr r9, [%[b], #88]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[13] * B[21]\n\t" - "ldr r8, [%[a], #52]\n\t" - "ldr r9, [%[b], #84]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[14] * B[20]\n\t" - "ldr r8, [%[a], #56]\n\t" - "ldr r9, [%[b], #80]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[15] * B[19]\n\t" - "ldr r8, [%[a], #60]\n\t" - "ldr r9, [%[b], #76]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[16] * B[18]\n\t" - "ldr r8, [%[a], #64]\n\t" - "ldr r9, [%[b], #72]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[17] * B[17]\n\t" - "ldr r8, [%[a], #68]\n\t" - "ldr r9, [%[b], #68]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[18] * B[16]\n\t" - "ldr r8, [%[a], #72]\n\t" - "ldr r9, [%[b], #64]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[19] * B[15]\n\t" - "ldr r8, [%[a], #76]\n\t" - "ldr r9, [%[b], #60]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[20] * B[14]\n\t" - "ldr r8, [%[a], #80]\n\t" - "ldr r9, [%[b], #56]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[21] * B[13]\n\t" - "ldr r8, [%[a], #84]\n\t" - "ldr r9, [%[b], #52]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[22] * B[12]\n\t" - "ldr r8, [%[a], #88]\n\t" - "ldr r9, [%[b], #48]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[23] * B[11]\n\t" - "ldr r8, [%[a], #92]\n\t" - "ldr r9, [%[b], #44]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[24] * B[10]\n\t" - "ldr r8, [%[a], #96]\n\t" - "ldr r9, [%[b], #40]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[25] * B[9]\n\t" - "ldr r8, [%[a], #100]\n\t" - "ldr r9, [%[b], #36]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[26] * B[8]\n\t" - "ldr r8, [%[a], #104]\n\t" - "ldr r9, [%[b], #32]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[27] * B[7]\n\t" - "ldr r8, [%[a], #108]\n\t" - "ldr r9, [%[b], #28]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[28] * B[6]\n\t" - "ldr r8, [%[a], #112]\n\t" - "ldr r9, [%[b], #24]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[29] * B[5]\n\t" - "ldr r8, [%[a], #116]\n\t" - "ldr r9, [%[b], #20]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[30] * B[4]\n\t" - "ldr r8, [%[a], #120]\n\t" - "ldr r9, [%[b], #16]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[31] * B[3]\n\t" - "ldr r8, [%[a], #124]\n\t" - "ldr r9, [%[b], #12]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[32] * B[2]\n\t" - "ldr r8, [%[a], #128]\n\t" - "ldr r9, [%[b], #8]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[33] * B[1]\n\t" - "ldr r8, [%[a], #132]\n\t" - "ldr r9, [%[b], #4]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[34] * B[0]\n\t" - "ldr r8, [%[a], #136]\n\t" - "ldr r9, [%[b], #0]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "str r4, [sp, #136]\n\t" - "# A[0] * B[35]\n\t" - "ldr r8, [%[a], #0]\n\t" - "ldr r9, [%[b], #140]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r10, r10\n\t" - "# A[1] * B[34]\n\t" - "ldr r8, [%[a], #4]\n\t" - "ldr r9, [%[b], #136]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[2] * B[33]\n\t" - "ldr r8, [%[a], #8]\n\t" - "ldr r9, [%[b], #132]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[3] * B[32]\n\t" - "ldr r8, [%[a], #12]\n\t" - "ldr r9, [%[b], #128]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[4] * B[31]\n\t" - "ldr r8, [%[a], #16]\n\t" - "ldr r9, [%[b], #124]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[5] * B[30]\n\t" - "ldr r8, [%[a], #20]\n\t" - "ldr r9, [%[b], #120]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[6] * B[29]\n\t" - "ldr r8, [%[a], #24]\n\t" - "ldr r9, [%[b], #116]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[7] * B[28]\n\t" - "ldr r8, [%[a], #28]\n\t" - "ldr r9, [%[b], #112]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[8] * B[27]\n\t" - "ldr r8, [%[a], #32]\n\t" - "ldr r9, [%[b], #108]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[9] * B[26]\n\t" - "ldr r8, [%[a], #36]\n\t" - "ldr r9, [%[b], #104]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[10] * B[25]\n\t" - "ldr r8, [%[a], #40]\n\t" - "ldr r9, [%[b], #100]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[11] * B[24]\n\t" - "ldr r8, [%[a], #44]\n\t" - "ldr r9, [%[b], #96]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[12] * B[23]\n\t" - "ldr r8, [%[a], #48]\n\t" - "ldr r9, [%[b], #92]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[13] * B[22]\n\t" - "ldr r8, [%[a], #52]\n\t" - "ldr r9, [%[b], #88]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[14] * B[21]\n\t" - "ldr r8, [%[a], #56]\n\t" - "ldr r9, [%[b], #84]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[15] * B[20]\n\t" - "ldr r8, [%[a], #60]\n\t" - "ldr r9, [%[b], #80]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[16] * B[19]\n\t" - "ldr r8, [%[a], #64]\n\t" - "ldr r9, [%[b], #76]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[17] * B[18]\n\t" - "ldr r8, [%[a], #68]\n\t" - "ldr r9, [%[b], #72]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[18] * B[17]\n\t" - "ldr r8, [%[a], #72]\n\t" - "ldr r9, [%[b], #68]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[19] * B[16]\n\t" - "ldr r8, [%[a], #76]\n\t" - "ldr r9, [%[b], #64]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[20] * B[15]\n\t" - "ldr r8, [%[a], #80]\n\t" - "ldr r9, [%[b], #60]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[21] * B[14]\n\t" - "ldr r8, [%[a], #84]\n\t" - "ldr r9, [%[b], #56]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[22] * B[13]\n\t" - "ldr r8, [%[a], #88]\n\t" - "ldr r9, [%[b], #52]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[23] * B[12]\n\t" - "ldr r8, [%[a], #92]\n\t" - "ldr r9, [%[b], #48]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[24] * B[11]\n\t" - "ldr r8, [%[a], #96]\n\t" - "ldr r9, [%[b], #44]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[25] * B[10]\n\t" - "ldr r8, [%[a], #100]\n\t" - "ldr r9, [%[b], #40]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[26] * B[9]\n\t" - "ldr r8, [%[a], #104]\n\t" - "ldr r9, [%[b], #36]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[27] * B[8]\n\t" - "ldr r8, [%[a], #108]\n\t" - "ldr r9, [%[b], #32]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[28] * B[7]\n\t" - "ldr r8, [%[a], #112]\n\t" - "ldr r9, [%[b], #28]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[29] * B[6]\n\t" - "ldr r8, [%[a], #116]\n\t" - "ldr r9, [%[b], #24]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[30] * B[5]\n\t" - "ldr r8, [%[a], #120]\n\t" - "ldr r9, [%[b], #20]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[31] * B[4]\n\t" - "ldr r8, [%[a], #124]\n\t" - "ldr r9, [%[b], #16]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[32] * B[3]\n\t" - "ldr r8, [%[a], #128]\n\t" - "ldr r9, [%[b], #12]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[33] * B[2]\n\t" - "ldr r8, [%[a], #132]\n\t" - "ldr r9, [%[b], #8]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[34] * B[1]\n\t" - "ldr r8, [%[a], #136]\n\t" - "ldr r9, [%[b], #4]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[35] * B[0]\n\t" - "ldr r8, [%[a], #140]\n\t" - "ldr r9, [%[b], #0]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "str r5, [sp, #140]\n\t" - "# A[0] * B[36]\n\t" - "ldr r8, [%[a], #0]\n\t" - "ldr r9, [%[b], #144]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r10, r10\n\t" - "# A[1] * B[35]\n\t" - "ldr r8, [%[a], #4]\n\t" - "ldr r9, [%[b], #140]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[2] * B[34]\n\t" - "ldr r8, [%[a], #8]\n\t" - "ldr r9, [%[b], #136]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[3] * B[33]\n\t" - "ldr r8, [%[a], #12]\n\t" - "ldr r9, [%[b], #132]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[4] * B[32]\n\t" - "ldr r8, [%[a], #16]\n\t" - "ldr r9, [%[b], #128]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[5] * B[31]\n\t" - "ldr r8, [%[a], #20]\n\t" - "ldr r9, [%[b], #124]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[6] * B[30]\n\t" - "ldr r8, [%[a], #24]\n\t" - "ldr r9, [%[b], #120]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[7] * B[29]\n\t" - "ldr r8, [%[a], #28]\n\t" - "ldr r9, [%[b], #116]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[8] * B[28]\n\t" - "ldr r8, [%[a], #32]\n\t" - "ldr r9, [%[b], #112]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[9] * B[27]\n\t" - "ldr r8, [%[a], #36]\n\t" - "ldr r9, [%[b], #108]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[10] * B[26]\n\t" - "ldr r8, [%[a], #40]\n\t" - "ldr r9, [%[b], #104]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[11] * B[25]\n\t" - "ldr r8, [%[a], #44]\n\t" - "ldr r9, [%[b], #100]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[12] * B[24]\n\t" - "ldr r8, [%[a], #48]\n\t" - "ldr r9, [%[b], #96]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[13] * B[23]\n\t" - "ldr r8, [%[a], #52]\n\t" - "ldr r9, [%[b], #92]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[14] * B[22]\n\t" - "ldr r8, [%[a], #56]\n\t" - "ldr r9, [%[b], #88]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[15] * B[21]\n\t" - "ldr r8, [%[a], #60]\n\t" - "ldr r9, [%[b], #84]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[16] * B[20]\n\t" - "ldr r8, [%[a], #64]\n\t" - "ldr r9, [%[b], #80]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[17] * B[19]\n\t" - "ldr r8, [%[a], #68]\n\t" - "ldr r9, [%[b], #76]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[18] * B[18]\n\t" - "ldr r8, [%[a], #72]\n\t" - "ldr r9, [%[b], #72]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[19] * B[17]\n\t" - "ldr r8, [%[a], #76]\n\t" - "ldr r9, [%[b], #68]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[20] * B[16]\n\t" - "ldr r8, [%[a], #80]\n\t" - "ldr r9, [%[b], #64]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[21] * B[15]\n\t" - "ldr r8, [%[a], #84]\n\t" - "ldr r9, [%[b], #60]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[22] * B[14]\n\t" - "ldr r8, [%[a], #88]\n\t" - "ldr r9, [%[b], #56]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[23] * B[13]\n\t" - "ldr r8, [%[a], #92]\n\t" - "ldr r9, [%[b], #52]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[24] * B[12]\n\t" - "ldr r8, [%[a], #96]\n\t" - "ldr r9, [%[b], #48]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[25] * B[11]\n\t" - "ldr r8, [%[a], #100]\n\t" - "ldr r9, [%[b], #44]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[26] * B[10]\n\t" - "ldr r8, [%[a], #104]\n\t" - "ldr r9, [%[b], #40]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[27] * B[9]\n\t" - "ldr r8, [%[a], #108]\n\t" - "ldr r9, [%[b], #36]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[28] * B[8]\n\t" - "ldr r8, [%[a], #112]\n\t" - "ldr r9, [%[b], #32]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[29] * B[7]\n\t" - "ldr r8, [%[a], #116]\n\t" - "ldr r9, [%[b], #28]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[30] * B[6]\n\t" - "ldr r8, [%[a], #120]\n\t" - "ldr r9, [%[b], #24]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[31] * B[5]\n\t" - "ldr r8, [%[a], #124]\n\t" - "ldr r9, [%[b], #20]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[32] * B[4]\n\t" - "ldr r8, [%[a], #128]\n\t" - "ldr r9, [%[b], #16]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[33] * B[3]\n\t" - "ldr r8, [%[a], #132]\n\t" - "ldr r9, [%[b], #12]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[34] * B[2]\n\t" - "ldr r8, [%[a], #136]\n\t" - "ldr r9, [%[b], #8]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[35] * B[1]\n\t" - "ldr r8, [%[a], #140]\n\t" - "ldr r9, [%[b], #4]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[36] * B[0]\n\t" - "ldr r8, [%[a], #144]\n\t" - "ldr r9, [%[b], #0]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "str r3, [sp, #144]\n\t" - "# A[0] * B[37]\n\t" - "ldr r8, [%[a], #0]\n\t" - "ldr r9, [%[b], #148]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r10, r10\n\t" - "# A[1] * B[36]\n\t" - "ldr r8, [%[a], #4]\n\t" - "ldr r9, [%[b], #144]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[2] * B[35]\n\t" - "ldr r8, [%[a], #8]\n\t" - "ldr r9, [%[b], #140]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[3] * B[34]\n\t" - "ldr r8, [%[a], #12]\n\t" - "ldr r9, [%[b], #136]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[4] * B[33]\n\t" - "ldr r8, [%[a], #16]\n\t" - "ldr r9, [%[b], #132]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[5] * B[32]\n\t" - "ldr r8, [%[a], #20]\n\t" - "ldr r9, [%[b], #128]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[6] * B[31]\n\t" - "ldr r8, [%[a], #24]\n\t" - "ldr r9, [%[b], #124]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[7] * B[30]\n\t" - "ldr r8, [%[a], #28]\n\t" - "ldr r9, [%[b], #120]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[8] * B[29]\n\t" - "ldr r8, [%[a], #32]\n\t" - "ldr r9, [%[b], #116]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[9] * B[28]\n\t" - "ldr r8, [%[a], #36]\n\t" - "ldr r9, [%[b], #112]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[10] * B[27]\n\t" - "ldr r8, [%[a], #40]\n\t" - "ldr r9, [%[b], #108]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[11] * B[26]\n\t" - "ldr r8, [%[a], #44]\n\t" - "ldr r9, [%[b], #104]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[12] * B[25]\n\t" - "ldr r8, [%[a], #48]\n\t" - "ldr r9, [%[b], #100]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[13] * B[24]\n\t" - "ldr r8, [%[a], #52]\n\t" - "ldr r9, [%[b], #96]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[14] * B[23]\n\t" - "ldr r8, [%[a], #56]\n\t" - "ldr r9, [%[b], #92]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[15] * B[22]\n\t" - "ldr r8, [%[a], #60]\n\t" - "ldr r9, [%[b], #88]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[16] * B[21]\n\t" - "ldr r8, [%[a], #64]\n\t" - "ldr r9, [%[b], #84]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[17] * B[20]\n\t" - "ldr r8, [%[a], #68]\n\t" - "ldr r9, [%[b], #80]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[18] * B[19]\n\t" - "ldr r8, [%[a], #72]\n\t" - "ldr r9, [%[b], #76]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[19] * B[18]\n\t" - "ldr r8, [%[a], #76]\n\t" - "ldr r9, [%[b], #72]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[20] * B[17]\n\t" - "ldr r8, [%[a], #80]\n\t" - "ldr r9, [%[b], #68]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[21] * B[16]\n\t" - "ldr r8, [%[a], #84]\n\t" - "ldr r9, [%[b], #64]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[22] * B[15]\n\t" - "ldr r8, [%[a], #88]\n\t" - "ldr r9, [%[b], #60]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[23] * B[14]\n\t" - "ldr r8, [%[a], #92]\n\t" - "ldr r9, [%[b], #56]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[24] * B[13]\n\t" - "ldr r8, [%[a], #96]\n\t" - "ldr r9, [%[b], #52]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[25] * B[12]\n\t" - "ldr r8, [%[a], #100]\n\t" - "ldr r9, [%[b], #48]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[26] * B[11]\n\t" - "ldr r8, [%[a], #104]\n\t" - "ldr r9, [%[b], #44]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[27] * B[10]\n\t" - "ldr r8, [%[a], #108]\n\t" - "ldr r9, [%[b], #40]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[28] * B[9]\n\t" - "ldr r8, [%[a], #112]\n\t" - "ldr r9, [%[b], #36]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[29] * B[8]\n\t" - "ldr r8, [%[a], #116]\n\t" - "ldr r9, [%[b], #32]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[30] * B[7]\n\t" - "ldr r8, [%[a], #120]\n\t" - "ldr r9, [%[b], #28]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[31] * B[6]\n\t" - "ldr r8, [%[a], #124]\n\t" - "ldr r9, [%[b], #24]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[32] * B[5]\n\t" - "ldr r8, [%[a], #128]\n\t" - "ldr r9, [%[b], #20]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[33] * B[4]\n\t" - "ldr r8, [%[a], #132]\n\t" - "ldr r9, [%[b], #16]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[34] * B[3]\n\t" - "ldr r8, [%[a], #136]\n\t" - "ldr r9, [%[b], #12]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[35] * B[2]\n\t" - "ldr r8, [%[a], #140]\n\t" - "ldr r9, [%[b], #8]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[36] * B[1]\n\t" - "ldr r8, [%[a], #144]\n\t" - "ldr r9, [%[b], #4]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[37] * B[0]\n\t" - "ldr r8, [%[a], #148]\n\t" - "ldr r9, [%[b], #0]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "str r4, [sp, #148]\n\t" - "# A[0] * B[38]\n\t" - "ldr r8, [%[a], #0]\n\t" - "ldr r9, [%[b], #152]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r10, r10\n\t" - "# A[1] * B[37]\n\t" - "ldr r8, [%[a], #4]\n\t" - "ldr r9, [%[b], #148]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[2] * B[36]\n\t" - "ldr r8, [%[a], #8]\n\t" - "ldr r9, [%[b], #144]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[3] * B[35]\n\t" - "ldr r8, [%[a], #12]\n\t" - "ldr r9, [%[b], #140]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[4] * B[34]\n\t" - "ldr r8, [%[a], #16]\n\t" - "ldr r9, [%[b], #136]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[5] * B[33]\n\t" - "ldr r8, [%[a], #20]\n\t" - "ldr r9, [%[b], #132]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[6] * B[32]\n\t" - "ldr r8, [%[a], #24]\n\t" - "ldr r9, [%[b], #128]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[7] * B[31]\n\t" - "ldr r8, [%[a], #28]\n\t" - "ldr r9, [%[b], #124]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[8] * B[30]\n\t" - "ldr r8, [%[a], #32]\n\t" - "ldr r9, [%[b], #120]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[9] * B[29]\n\t" - "ldr r8, [%[a], #36]\n\t" - "ldr r9, [%[b], #116]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[10] * B[28]\n\t" - "ldr r8, [%[a], #40]\n\t" - "ldr r9, [%[b], #112]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[11] * B[27]\n\t" - "ldr r8, [%[a], #44]\n\t" - "ldr r9, [%[b], #108]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[12] * B[26]\n\t" - "ldr r8, [%[a], #48]\n\t" - "ldr r9, [%[b], #104]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[13] * B[25]\n\t" - "ldr r8, [%[a], #52]\n\t" - "ldr r9, [%[b], #100]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[14] * B[24]\n\t" - "ldr r8, [%[a], #56]\n\t" - "ldr r9, [%[b], #96]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[15] * B[23]\n\t" - "ldr r8, [%[a], #60]\n\t" - "ldr r9, [%[b], #92]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[16] * B[22]\n\t" - "ldr r8, [%[a], #64]\n\t" - "ldr r9, [%[b], #88]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[17] * B[21]\n\t" - "ldr r8, [%[a], #68]\n\t" - "ldr r9, [%[b], #84]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[18] * B[20]\n\t" - "ldr r8, [%[a], #72]\n\t" - "ldr r9, [%[b], #80]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[19] * B[19]\n\t" - "ldr r8, [%[a], #76]\n\t" - "ldr r9, [%[b], #76]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[20] * B[18]\n\t" - "ldr r8, [%[a], #80]\n\t" - "ldr r9, [%[b], #72]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[21] * B[17]\n\t" - "ldr r8, [%[a], #84]\n\t" - "ldr r9, [%[b], #68]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[22] * B[16]\n\t" - "ldr r8, [%[a], #88]\n\t" - "ldr r9, [%[b], #64]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[23] * B[15]\n\t" - "ldr r8, [%[a], #92]\n\t" - "ldr r9, [%[b], #60]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[24] * B[14]\n\t" - "ldr r8, [%[a], #96]\n\t" - "ldr r9, [%[b], #56]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[25] * B[13]\n\t" - "ldr r8, [%[a], #100]\n\t" - "ldr r9, [%[b], #52]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[26] * B[12]\n\t" - "ldr r8, [%[a], #104]\n\t" - "ldr r9, [%[b], #48]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[27] * B[11]\n\t" - "ldr r8, [%[a], #108]\n\t" - "ldr r9, [%[b], #44]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[28] * B[10]\n\t" - "ldr r8, [%[a], #112]\n\t" - "ldr r9, [%[b], #40]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[29] * B[9]\n\t" - "ldr r8, [%[a], #116]\n\t" - "ldr r9, [%[b], #36]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[30] * B[8]\n\t" - "ldr r8, [%[a], #120]\n\t" - "ldr r9, [%[b], #32]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[31] * B[7]\n\t" - "ldr r8, [%[a], #124]\n\t" - "ldr r9, [%[b], #28]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[32] * B[6]\n\t" - "ldr r8, [%[a], #128]\n\t" - "ldr r9, [%[b], #24]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[33] * B[5]\n\t" - "ldr r8, [%[a], #132]\n\t" - "ldr r9, [%[b], #20]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[34] * B[4]\n\t" - "ldr r8, [%[a], #136]\n\t" - "ldr r9, [%[b], #16]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[35] * B[3]\n\t" - "ldr r8, [%[a], #140]\n\t" - "ldr r9, [%[b], #12]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[36] * B[2]\n\t" - "ldr r8, [%[a], #144]\n\t" - "ldr r9, [%[b], #8]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[37] * B[1]\n\t" - "ldr r8, [%[a], #148]\n\t" - "ldr r9, [%[b], #4]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[38] * B[0]\n\t" - "ldr r8, [%[a], #152]\n\t" - "ldr r9, [%[b], #0]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "str r5, [sp, #152]\n\t" - "# A[0] * B[39]\n\t" - "ldr r8, [%[a], #0]\n\t" - "ldr r9, [%[b], #156]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r10, r10\n\t" - "# A[1] * B[38]\n\t" - "ldr r8, [%[a], #4]\n\t" - "ldr r9, [%[b], #152]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[2] * B[37]\n\t" - "ldr r8, [%[a], #8]\n\t" - "ldr r9, [%[b], #148]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[3] * B[36]\n\t" - "ldr r8, [%[a], #12]\n\t" - "ldr r9, [%[b], #144]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[4] * B[35]\n\t" - "ldr r8, [%[a], #16]\n\t" - "ldr r9, [%[b], #140]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[5] * B[34]\n\t" - "ldr r8, [%[a], #20]\n\t" - "ldr r9, [%[b], #136]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[6] * B[33]\n\t" - "ldr r8, [%[a], #24]\n\t" - "ldr r9, [%[b], #132]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[7] * B[32]\n\t" - "ldr r8, [%[a], #28]\n\t" - "ldr r9, [%[b], #128]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[8] * B[31]\n\t" - "ldr r8, [%[a], #32]\n\t" - "ldr r9, [%[b], #124]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[9] * B[30]\n\t" - "ldr r8, [%[a], #36]\n\t" - "ldr r9, [%[b], #120]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[10] * B[29]\n\t" - "ldr r8, [%[a], #40]\n\t" - "ldr r9, [%[b], #116]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[11] * B[28]\n\t" - "ldr r8, [%[a], #44]\n\t" - "ldr r9, [%[b], #112]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[12] * B[27]\n\t" - "ldr r8, [%[a], #48]\n\t" - "ldr r9, [%[b], #108]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[13] * B[26]\n\t" - "ldr r8, [%[a], #52]\n\t" - "ldr r9, [%[b], #104]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[14] * B[25]\n\t" - "ldr r8, [%[a], #56]\n\t" - "ldr r9, [%[b], #100]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[15] * B[24]\n\t" - "ldr r8, [%[a], #60]\n\t" - "ldr r9, [%[b], #96]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[16] * B[23]\n\t" - "ldr r8, [%[a], #64]\n\t" - "ldr r9, [%[b], #92]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[17] * B[22]\n\t" - "ldr r8, [%[a], #68]\n\t" - "ldr r9, [%[b], #88]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[18] * B[21]\n\t" - "ldr r8, [%[a], #72]\n\t" - "ldr r9, [%[b], #84]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[19] * B[20]\n\t" - "ldr r8, [%[a], #76]\n\t" - "ldr r9, [%[b], #80]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[20] * B[19]\n\t" - "ldr r8, [%[a], #80]\n\t" - "ldr r9, [%[b], #76]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[21] * B[18]\n\t" - "ldr r8, [%[a], #84]\n\t" - "ldr r9, [%[b], #72]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[22] * B[17]\n\t" - "ldr r8, [%[a], #88]\n\t" - "ldr r9, [%[b], #68]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[23] * B[16]\n\t" - "ldr r8, [%[a], #92]\n\t" - "ldr r9, [%[b], #64]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[24] * B[15]\n\t" - "ldr r8, [%[a], #96]\n\t" - "ldr r9, [%[b], #60]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[25] * B[14]\n\t" - "ldr r8, [%[a], #100]\n\t" - "ldr r9, [%[b], #56]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[26] * B[13]\n\t" - "ldr r8, [%[a], #104]\n\t" - "ldr r9, [%[b], #52]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[27] * B[12]\n\t" - "ldr r8, [%[a], #108]\n\t" - "ldr r9, [%[b], #48]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[28] * B[11]\n\t" - "ldr r8, [%[a], #112]\n\t" - "ldr r9, [%[b], #44]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[29] * B[10]\n\t" - "ldr r8, [%[a], #116]\n\t" - "ldr r9, [%[b], #40]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[30] * B[9]\n\t" - "ldr r8, [%[a], #120]\n\t" - "ldr r9, [%[b], #36]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[31] * B[8]\n\t" - "ldr r8, [%[a], #124]\n\t" - "ldr r9, [%[b], #32]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[32] * B[7]\n\t" - "ldr r8, [%[a], #128]\n\t" - "ldr r9, [%[b], #28]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[33] * B[6]\n\t" - "ldr r8, [%[a], #132]\n\t" - "ldr r9, [%[b], #24]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[34] * B[5]\n\t" - "ldr r8, [%[a], #136]\n\t" - "ldr r9, [%[b], #20]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[35] * B[4]\n\t" - "ldr r8, [%[a], #140]\n\t" - "ldr r9, [%[b], #16]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[36] * B[3]\n\t" - "ldr r8, [%[a], #144]\n\t" - "ldr r9, [%[b], #12]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[37] * B[2]\n\t" - "ldr r8, [%[a], #148]\n\t" - "ldr r9, [%[b], #8]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[38] * B[1]\n\t" - "ldr r8, [%[a], #152]\n\t" - "ldr r9, [%[b], #4]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[39] * B[0]\n\t" - "ldr r8, [%[a], #156]\n\t" - "ldr r9, [%[b], #0]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "str r3, [sp, #156]\n\t" - "# A[0] * B[40]\n\t" - "ldr r8, [%[a], #0]\n\t" - "ldr r9, [%[b], #160]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r10, r10\n\t" - "# A[1] * B[39]\n\t" - "ldr r8, [%[a], #4]\n\t" - "ldr r9, [%[b], #156]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[2] * B[38]\n\t" - "ldr r8, [%[a], #8]\n\t" - "ldr r9, [%[b], #152]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[3] * B[37]\n\t" - "ldr r8, [%[a], #12]\n\t" - "ldr r9, [%[b], #148]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[4] * B[36]\n\t" - "ldr r8, [%[a], #16]\n\t" - "ldr r9, [%[b], #144]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[5] * B[35]\n\t" - "ldr r8, [%[a], #20]\n\t" - "ldr r9, [%[b], #140]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[6] * B[34]\n\t" - "ldr r8, [%[a], #24]\n\t" - "ldr r9, [%[b], #136]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[7] * B[33]\n\t" - "ldr r8, [%[a], #28]\n\t" - "ldr r9, [%[b], #132]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[8] * B[32]\n\t" - "ldr r8, [%[a], #32]\n\t" - "ldr r9, [%[b], #128]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[9] * B[31]\n\t" - "ldr r8, [%[a], #36]\n\t" - "ldr r9, [%[b], #124]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[10] * B[30]\n\t" - "ldr r8, [%[a], #40]\n\t" - "ldr r9, [%[b], #120]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[11] * B[29]\n\t" - "ldr r8, [%[a], #44]\n\t" - "ldr r9, [%[b], #116]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[12] * B[28]\n\t" - "ldr r8, [%[a], #48]\n\t" - "ldr r9, [%[b], #112]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[13] * B[27]\n\t" - "ldr r8, [%[a], #52]\n\t" - "ldr r9, [%[b], #108]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[14] * B[26]\n\t" - "ldr r8, [%[a], #56]\n\t" - "ldr r9, [%[b], #104]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[15] * B[25]\n\t" - "ldr r8, [%[a], #60]\n\t" - "ldr r9, [%[b], #100]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[16] * B[24]\n\t" - "ldr r8, [%[a], #64]\n\t" - "ldr r9, [%[b], #96]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[17] * B[23]\n\t" - "ldr r8, [%[a], #68]\n\t" - "ldr r9, [%[b], #92]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[18] * B[22]\n\t" - "ldr r8, [%[a], #72]\n\t" - "ldr r9, [%[b], #88]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[19] * B[21]\n\t" - "ldr r8, [%[a], #76]\n\t" - "ldr r9, [%[b], #84]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[20] * B[20]\n\t" - "ldr r8, [%[a], #80]\n\t" - "ldr r9, [%[b], #80]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[21] * B[19]\n\t" - "ldr r8, [%[a], #84]\n\t" - "ldr r9, [%[b], #76]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[22] * B[18]\n\t" - "ldr r8, [%[a], #88]\n\t" - "ldr r9, [%[b], #72]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[23] * B[17]\n\t" - "ldr r8, [%[a], #92]\n\t" - "ldr r9, [%[b], #68]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[24] * B[16]\n\t" - "ldr r8, [%[a], #96]\n\t" - "ldr r9, [%[b], #64]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[25] * B[15]\n\t" - "ldr r8, [%[a], #100]\n\t" - "ldr r9, [%[b], #60]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[26] * B[14]\n\t" - "ldr r8, [%[a], #104]\n\t" - "ldr r9, [%[b], #56]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[27] * B[13]\n\t" - "ldr r8, [%[a], #108]\n\t" - "ldr r9, [%[b], #52]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[28] * B[12]\n\t" - "ldr r8, [%[a], #112]\n\t" - "ldr r9, [%[b], #48]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[29] * B[11]\n\t" - "ldr r8, [%[a], #116]\n\t" - "ldr r9, [%[b], #44]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[30] * B[10]\n\t" - "ldr r8, [%[a], #120]\n\t" - "ldr r9, [%[b], #40]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[31] * B[9]\n\t" - "ldr r8, [%[a], #124]\n\t" - "ldr r9, [%[b], #36]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[32] * B[8]\n\t" - "ldr r8, [%[a], #128]\n\t" - "ldr r9, [%[b], #32]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[33] * B[7]\n\t" - "ldr r8, [%[a], #132]\n\t" - "ldr r9, [%[b], #28]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[34] * B[6]\n\t" - "ldr r8, [%[a], #136]\n\t" - "ldr r9, [%[b], #24]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[35] * B[5]\n\t" - "ldr r8, [%[a], #140]\n\t" - "ldr r9, [%[b], #20]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[36] * B[4]\n\t" - "ldr r8, [%[a], #144]\n\t" - "ldr r9, [%[b], #16]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[37] * B[3]\n\t" - "ldr r8, [%[a], #148]\n\t" - "ldr r9, [%[b], #12]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[38] * B[2]\n\t" - "ldr r8, [%[a], #152]\n\t" - "ldr r9, [%[b], #8]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[39] * B[1]\n\t" - "ldr r8, [%[a], #156]\n\t" - "ldr r9, [%[b], #4]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[40] * B[0]\n\t" - "ldr r8, [%[a], #160]\n\t" - "ldr r9, [%[b], #0]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "str r4, [sp, #160]\n\t" - "# A[0] * B[41]\n\t" - "ldr r8, [%[a], #0]\n\t" - "ldr r9, [%[b], #164]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r10, r10\n\t" - "# A[1] * B[40]\n\t" - "ldr r8, [%[a], #4]\n\t" - "ldr r9, [%[b], #160]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[2] * B[39]\n\t" - "ldr r8, [%[a], #8]\n\t" - "ldr r9, [%[b], #156]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[3] * B[38]\n\t" - "ldr r8, [%[a], #12]\n\t" - "ldr r9, [%[b], #152]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[4] * B[37]\n\t" - "ldr r8, [%[a], #16]\n\t" - "ldr r9, [%[b], #148]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[5] * B[36]\n\t" - "ldr r8, [%[a], #20]\n\t" - "ldr r9, [%[b], #144]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[6] * B[35]\n\t" - "ldr r8, [%[a], #24]\n\t" - "ldr r9, [%[b], #140]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[7] * B[34]\n\t" - "ldr r8, [%[a], #28]\n\t" - "ldr r9, [%[b], #136]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[8] * B[33]\n\t" - "ldr r8, [%[a], #32]\n\t" - "ldr r9, [%[b], #132]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[9] * B[32]\n\t" - "ldr r8, [%[a], #36]\n\t" - "ldr r9, [%[b], #128]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[10] * B[31]\n\t" - "ldr r8, [%[a], #40]\n\t" - "ldr r9, [%[b], #124]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[11] * B[30]\n\t" - "ldr r8, [%[a], #44]\n\t" - "ldr r9, [%[b], #120]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[12] * B[29]\n\t" - "ldr r8, [%[a], #48]\n\t" - "ldr r9, [%[b], #116]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[13] * B[28]\n\t" - "ldr r8, [%[a], #52]\n\t" - "ldr r9, [%[b], #112]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[14] * B[27]\n\t" - "ldr r8, [%[a], #56]\n\t" - "ldr r9, [%[b], #108]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[15] * B[26]\n\t" - "ldr r8, [%[a], #60]\n\t" - "ldr r9, [%[b], #104]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[16] * B[25]\n\t" - "ldr r8, [%[a], #64]\n\t" - "ldr r9, [%[b], #100]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[17] * B[24]\n\t" - "ldr r8, [%[a], #68]\n\t" - "ldr r9, [%[b], #96]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[18] * B[23]\n\t" - "ldr r8, [%[a], #72]\n\t" - "ldr r9, [%[b], #92]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[19] * B[22]\n\t" - "ldr r8, [%[a], #76]\n\t" - "ldr r9, [%[b], #88]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[20] * B[21]\n\t" - "ldr r8, [%[a], #80]\n\t" - "ldr r9, [%[b], #84]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[21] * B[20]\n\t" - "ldr r8, [%[a], #84]\n\t" - "ldr r9, [%[b], #80]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[22] * B[19]\n\t" - "ldr r8, [%[a], #88]\n\t" - "ldr r9, [%[b], #76]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[23] * B[18]\n\t" - "ldr r8, [%[a], #92]\n\t" - "ldr r9, [%[b], #72]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[24] * B[17]\n\t" - "ldr r8, [%[a], #96]\n\t" - "ldr r9, [%[b], #68]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[25] * B[16]\n\t" - "ldr r8, [%[a], #100]\n\t" - "ldr r9, [%[b], #64]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[26] * B[15]\n\t" - "ldr r8, [%[a], #104]\n\t" - "ldr r9, [%[b], #60]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[27] * B[14]\n\t" - "ldr r8, [%[a], #108]\n\t" - "ldr r9, [%[b], #56]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[28] * B[13]\n\t" - "ldr r8, [%[a], #112]\n\t" - "ldr r9, [%[b], #52]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[29] * B[12]\n\t" - "ldr r8, [%[a], #116]\n\t" - "ldr r9, [%[b], #48]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[30] * B[11]\n\t" - "ldr r8, [%[a], #120]\n\t" - "ldr r9, [%[b], #44]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[31] * B[10]\n\t" - "ldr r8, [%[a], #124]\n\t" - "ldr r9, [%[b], #40]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[32] * B[9]\n\t" - "ldr r8, [%[a], #128]\n\t" - "ldr r9, [%[b], #36]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[33] * B[8]\n\t" - "ldr r8, [%[a], #132]\n\t" - "ldr r9, [%[b], #32]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[34] * B[7]\n\t" - "ldr r8, [%[a], #136]\n\t" - "ldr r9, [%[b], #28]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[35] * B[6]\n\t" - "ldr r8, [%[a], #140]\n\t" - "ldr r9, [%[b], #24]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[36] * B[5]\n\t" - "ldr r8, [%[a], #144]\n\t" - "ldr r9, [%[b], #20]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[37] * B[4]\n\t" - "ldr r8, [%[a], #148]\n\t" - "ldr r9, [%[b], #16]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[38] * B[3]\n\t" - "ldr r8, [%[a], #152]\n\t" - "ldr r9, [%[b], #12]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[39] * B[2]\n\t" - "ldr r8, [%[a], #156]\n\t" - "ldr r9, [%[b], #8]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[40] * B[1]\n\t" - "ldr r8, [%[a], #160]\n\t" - "ldr r9, [%[b], #4]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[41] * B[0]\n\t" - "ldr r8, [%[a], #164]\n\t" - "ldr r9, [%[b], #0]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "str r5, [sp, #164]\n\t" - "# A[0] * B[42]\n\t" - "ldr r8, [%[a], #0]\n\t" - "ldr r9, [%[b], #168]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r10, r10\n\t" - "# A[1] * B[41]\n\t" - "ldr r8, [%[a], #4]\n\t" - "ldr r9, [%[b], #164]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[2] * B[40]\n\t" - "ldr r8, [%[a], #8]\n\t" - "ldr r9, [%[b], #160]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[3] * B[39]\n\t" - "ldr r8, [%[a], #12]\n\t" - "ldr r9, [%[b], #156]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[4] * B[38]\n\t" - "ldr r8, [%[a], #16]\n\t" - "ldr r9, [%[b], #152]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[5] * B[37]\n\t" - "ldr r8, [%[a], #20]\n\t" - "ldr r9, [%[b], #148]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[6] * B[36]\n\t" - "ldr r8, [%[a], #24]\n\t" - "ldr r9, [%[b], #144]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[7] * B[35]\n\t" - "ldr r8, [%[a], #28]\n\t" - "ldr r9, [%[b], #140]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[8] * B[34]\n\t" - "ldr r8, [%[a], #32]\n\t" - "ldr r9, [%[b], #136]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[9] * B[33]\n\t" - "ldr r8, [%[a], #36]\n\t" - "ldr r9, [%[b], #132]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[10] * B[32]\n\t" - "ldr r8, [%[a], #40]\n\t" - "ldr r9, [%[b], #128]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[11] * B[31]\n\t" - "ldr r8, [%[a], #44]\n\t" - "ldr r9, [%[b], #124]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[12] * B[30]\n\t" - "ldr r8, [%[a], #48]\n\t" - "ldr r9, [%[b], #120]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[13] * B[29]\n\t" - "ldr r8, [%[a], #52]\n\t" - "ldr r9, [%[b], #116]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[14] * B[28]\n\t" - "ldr r8, [%[a], #56]\n\t" - "ldr r9, [%[b], #112]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[15] * B[27]\n\t" - "ldr r8, [%[a], #60]\n\t" - "ldr r9, [%[b], #108]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[16] * B[26]\n\t" - "ldr r8, [%[a], #64]\n\t" - "ldr r9, [%[b], #104]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[17] * B[25]\n\t" - "ldr r8, [%[a], #68]\n\t" - "ldr r9, [%[b], #100]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[18] * B[24]\n\t" - "ldr r8, [%[a], #72]\n\t" - "ldr r9, [%[b], #96]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[19] * B[23]\n\t" - "ldr r8, [%[a], #76]\n\t" - "ldr r9, [%[b], #92]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[20] * B[22]\n\t" - "ldr r8, [%[a], #80]\n\t" - "ldr r9, [%[b], #88]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[21] * B[21]\n\t" - "ldr r8, [%[a], #84]\n\t" - "ldr r9, [%[b], #84]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[22] * B[20]\n\t" - "ldr r8, [%[a], #88]\n\t" - "ldr r9, [%[b], #80]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[23] * B[19]\n\t" - "ldr r8, [%[a], #92]\n\t" - "ldr r9, [%[b], #76]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[24] * B[18]\n\t" - "ldr r8, [%[a], #96]\n\t" - "ldr r9, [%[b], #72]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[25] * B[17]\n\t" - "ldr r8, [%[a], #100]\n\t" - "ldr r9, [%[b], #68]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[26] * B[16]\n\t" - "ldr r8, [%[a], #104]\n\t" - "ldr r9, [%[b], #64]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[27] * B[15]\n\t" - "ldr r8, [%[a], #108]\n\t" - "ldr r9, [%[b], #60]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[28] * B[14]\n\t" - "ldr r8, [%[a], #112]\n\t" - "ldr r9, [%[b], #56]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[29] * B[13]\n\t" - "ldr r8, [%[a], #116]\n\t" - "ldr r9, [%[b], #52]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[30] * B[12]\n\t" - "ldr r8, [%[a], #120]\n\t" - "ldr r9, [%[b], #48]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[31] * B[11]\n\t" - "ldr r8, [%[a], #124]\n\t" - "ldr r9, [%[b], #44]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[32] * B[10]\n\t" - "ldr r8, [%[a], #128]\n\t" - "ldr r9, [%[b], #40]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[33] * B[9]\n\t" - "ldr r8, [%[a], #132]\n\t" - "ldr r9, [%[b], #36]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[34] * B[8]\n\t" - "ldr r8, [%[a], #136]\n\t" - "ldr r9, [%[b], #32]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[35] * B[7]\n\t" - "ldr r8, [%[a], #140]\n\t" - "ldr r9, [%[b], #28]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[36] * B[6]\n\t" - "ldr r8, [%[a], #144]\n\t" - "ldr r9, [%[b], #24]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[37] * B[5]\n\t" - "ldr r8, [%[a], #148]\n\t" - "ldr r9, [%[b], #20]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[38] * B[4]\n\t" - "ldr r8, [%[a], #152]\n\t" - "ldr r9, [%[b], #16]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[39] * B[3]\n\t" - "ldr r8, [%[a], #156]\n\t" - "ldr r9, [%[b], #12]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[40] * B[2]\n\t" - "ldr r8, [%[a], #160]\n\t" - "ldr r9, [%[b], #8]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[41] * B[1]\n\t" - "ldr r8, [%[a], #164]\n\t" - "ldr r9, [%[b], #4]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[42] * B[0]\n\t" - "ldr r8, [%[a], #168]\n\t" - "ldr r9, [%[b], #0]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "str r3, [sp, #168]\n\t" - "# A[0] * B[43]\n\t" - "ldr r8, [%[a], #0]\n\t" - "ldr r9, [%[b], #172]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r10, r10\n\t" - "# A[1] * B[42]\n\t" - "ldr r8, [%[a], #4]\n\t" - "ldr r9, [%[b], #168]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[2] * B[41]\n\t" - "ldr r8, [%[a], #8]\n\t" - "ldr r9, [%[b], #164]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[3] * B[40]\n\t" - "ldr r8, [%[a], #12]\n\t" - "ldr r9, [%[b], #160]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[4] * B[39]\n\t" - "ldr r8, [%[a], #16]\n\t" - "ldr r9, [%[b], #156]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[5] * B[38]\n\t" - "ldr r8, [%[a], #20]\n\t" - "ldr r9, [%[b], #152]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[6] * B[37]\n\t" - "ldr r8, [%[a], #24]\n\t" - "ldr r9, [%[b], #148]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[7] * B[36]\n\t" - "ldr r8, [%[a], #28]\n\t" - "ldr r9, [%[b], #144]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[8] * B[35]\n\t" - "ldr r8, [%[a], #32]\n\t" - "ldr r9, [%[b], #140]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[9] * B[34]\n\t" - "ldr r8, [%[a], #36]\n\t" - "ldr r9, [%[b], #136]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[10] * B[33]\n\t" - "ldr r8, [%[a], #40]\n\t" - "ldr r9, [%[b], #132]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[11] * B[32]\n\t" - "ldr r8, [%[a], #44]\n\t" - "ldr r9, [%[b], #128]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[12] * B[31]\n\t" - "ldr r8, [%[a], #48]\n\t" - "ldr r9, [%[b], #124]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[13] * B[30]\n\t" - "ldr r8, [%[a], #52]\n\t" - "ldr r9, [%[b], #120]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[14] * B[29]\n\t" - "ldr r8, [%[a], #56]\n\t" - "ldr r9, [%[b], #116]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[15] * B[28]\n\t" - "ldr r8, [%[a], #60]\n\t" - "ldr r9, [%[b], #112]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[16] * B[27]\n\t" - "ldr r8, [%[a], #64]\n\t" - "ldr r9, [%[b], #108]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[17] * B[26]\n\t" - "ldr r8, [%[a], #68]\n\t" - "ldr r9, [%[b], #104]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[18] * B[25]\n\t" - "ldr r8, [%[a], #72]\n\t" - "ldr r9, [%[b], #100]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[19] * B[24]\n\t" - "ldr r8, [%[a], #76]\n\t" - "ldr r9, [%[b], #96]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[20] * B[23]\n\t" - "ldr r8, [%[a], #80]\n\t" - "ldr r9, [%[b], #92]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[21] * B[22]\n\t" - "ldr r8, [%[a], #84]\n\t" - "ldr r9, [%[b], #88]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[22] * B[21]\n\t" - "ldr r8, [%[a], #88]\n\t" - "ldr r9, [%[b], #84]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[23] * B[20]\n\t" - "ldr r8, [%[a], #92]\n\t" - "ldr r9, [%[b], #80]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[24] * B[19]\n\t" - "ldr r8, [%[a], #96]\n\t" - "ldr r9, [%[b], #76]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[25] * B[18]\n\t" - "ldr r8, [%[a], #100]\n\t" - "ldr r9, [%[b], #72]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[26] * B[17]\n\t" - "ldr r8, [%[a], #104]\n\t" - "ldr r9, [%[b], #68]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[27] * B[16]\n\t" - "ldr r8, [%[a], #108]\n\t" - "ldr r9, [%[b], #64]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[28] * B[15]\n\t" - "ldr r8, [%[a], #112]\n\t" - "ldr r9, [%[b], #60]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[29] * B[14]\n\t" - "ldr r8, [%[a], #116]\n\t" - "ldr r9, [%[b], #56]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[30] * B[13]\n\t" - "ldr r8, [%[a], #120]\n\t" - "ldr r9, [%[b], #52]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[31] * B[12]\n\t" - "ldr r8, [%[a], #124]\n\t" - "ldr r9, [%[b], #48]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[32] * B[11]\n\t" - "ldr r8, [%[a], #128]\n\t" - "ldr r9, [%[b], #44]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[33] * B[10]\n\t" - "ldr r8, [%[a], #132]\n\t" - "ldr r9, [%[b], #40]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[34] * B[9]\n\t" - "ldr r8, [%[a], #136]\n\t" - "ldr r9, [%[b], #36]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[35] * B[8]\n\t" - "ldr r8, [%[a], #140]\n\t" - "ldr r9, [%[b], #32]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[36] * B[7]\n\t" - "ldr r8, [%[a], #144]\n\t" - "ldr r9, [%[b], #28]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[37] * B[6]\n\t" - "ldr r8, [%[a], #148]\n\t" - "ldr r9, [%[b], #24]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[38] * B[5]\n\t" - "ldr r8, [%[a], #152]\n\t" - "ldr r9, [%[b], #20]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[39] * B[4]\n\t" - "ldr r8, [%[a], #156]\n\t" - "ldr r9, [%[b], #16]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[40] * B[3]\n\t" - "ldr r8, [%[a], #160]\n\t" - "ldr r9, [%[b], #12]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[41] * B[2]\n\t" - "ldr r8, [%[a], #164]\n\t" - "ldr r9, [%[b], #8]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[42] * B[1]\n\t" - "ldr r8, [%[a], #168]\n\t" - "ldr r9, [%[b], #4]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[43] * B[0]\n\t" - "ldr r8, [%[a], #172]\n\t" - "ldr r9, [%[b], #0]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "str r4, [sp, #172]\n\t" - "# A[0] * B[44]\n\t" - "ldr r8, [%[a], #0]\n\t" - "ldr r9, [%[b], #176]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r10, r10\n\t" - "# A[1] * B[43]\n\t" - "ldr r8, [%[a], #4]\n\t" - "ldr r9, [%[b], #172]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[2] * B[42]\n\t" - "ldr r8, [%[a], #8]\n\t" - "ldr r9, [%[b], #168]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[3] * B[41]\n\t" - "ldr r8, [%[a], #12]\n\t" - "ldr r9, [%[b], #164]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[4] * B[40]\n\t" - "ldr r8, [%[a], #16]\n\t" - "ldr r9, [%[b], #160]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[5] * B[39]\n\t" - "ldr r8, [%[a], #20]\n\t" - "ldr r9, [%[b], #156]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[6] * B[38]\n\t" - "ldr r8, [%[a], #24]\n\t" - "ldr r9, [%[b], #152]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[7] * B[37]\n\t" - "ldr r8, [%[a], #28]\n\t" - "ldr r9, [%[b], #148]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[8] * B[36]\n\t" - "ldr r8, [%[a], #32]\n\t" - "ldr r9, [%[b], #144]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[9] * B[35]\n\t" - "ldr r8, [%[a], #36]\n\t" - "ldr r9, [%[b], #140]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[10] * B[34]\n\t" - "ldr r8, [%[a], #40]\n\t" - "ldr r9, [%[b], #136]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[11] * B[33]\n\t" - "ldr r8, [%[a], #44]\n\t" - "ldr r9, [%[b], #132]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[12] * B[32]\n\t" - "ldr r8, [%[a], #48]\n\t" - "ldr r9, [%[b], #128]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[13] * B[31]\n\t" - "ldr r8, [%[a], #52]\n\t" - "ldr r9, [%[b], #124]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[14] * B[30]\n\t" - "ldr r8, [%[a], #56]\n\t" - "ldr r9, [%[b], #120]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[15] * B[29]\n\t" - "ldr r8, [%[a], #60]\n\t" - "ldr r9, [%[b], #116]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[16] * B[28]\n\t" - "ldr r8, [%[a], #64]\n\t" - "ldr r9, [%[b], #112]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[17] * B[27]\n\t" - "ldr r8, [%[a], #68]\n\t" - "ldr r9, [%[b], #108]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[18] * B[26]\n\t" - "ldr r8, [%[a], #72]\n\t" - "ldr r9, [%[b], #104]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[19] * B[25]\n\t" - "ldr r8, [%[a], #76]\n\t" - "ldr r9, [%[b], #100]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[20] * B[24]\n\t" - "ldr r8, [%[a], #80]\n\t" - "ldr r9, [%[b], #96]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[21] * B[23]\n\t" - "ldr r8, [%[a], #84]\n\t" - "ldr r9, [%[b], #92]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[22] * B[22]\n\t" - "ldr r8, [%[a], #88]\n\t" - "ldr r9, [%[b], #88]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[23] * B[21]\n\t" - "ldr r8, [%[a], #92]\n\t" - "ldr r9, [%[b], #84]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[24] * B[20]\n\t" - "ldr r8, [%[a], #96]\n\t" - "ldr r9, [%[b], #80]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[25] * B[19]\n\t" - "ldr r8, [%[a], #100]\n\t" - "ldr r9, [%[b], #76]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[26] * B[18]\n\t" - "ldr r8, [%[a], #104]\n\t" - "ldr r9, [%[b], #72]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[27] * B[17]\n\t" - "ldr r8, [%[a], #108]\n\t" - "ldr r9, [%[b], #68]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[28] * B[16]\n\t" - "ldr r8, [%[a], #112]\n\t" - "ldr r9, [%[b], #64]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[29] * B[15]\n\t" - "ldr r8, [%[a], #116]\n\t" - "ldr r9, [%[b], #60]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[30] * B[14]\n\t" - "ldr r8, [%[a], #120]\n\t" - "ldr r9, [%[b], #56]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[31] * B[13]\n\t" - "ldr r8, [%[a], #124]\n\t" - "ldr r9, [%[b], #52]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[32] * B[12]\n\t" - "ldr r8, [%[a], #128]\n\t" - "ldr r9, [%[b], #48]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[33] * B[11]\n\t" - "ldr r8, [%[a], #132]\n\t" - "ldr r9, [%[b], #44]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[34] * B[10]\n\t" - "ldr r8, [%[a], #136]\n\t" - "ldr r9, [%[b], #40]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[35] * B[9]\n\t" - "ldr r8, [%[a], #140]\n\t" - "ldr r9, [%[b], #36]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[36] * B[8]\n\t" - "ldr r8, [%[a], #144]\n\t" - "ldr r9, [%[b], #32]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[37] * B[7]\n\t" - "ldr r8, [%[a], #148]\n\t" - "ldr r9, [%[b], #28]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[38] * B[6]\n\t" - "ldr r8, [%[a], #152]\n\t" - "ldr r9, [%[b], #24]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[39] * B[5]\n\t" - "ldr r8, [%[a], #156]\n\t" - "ldr r9, [%[b], #20]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[40] * B[4]\n\t" - "ldr r8, [%[a], #160]\n\t" - "ldr r9, [%[b], #16]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[41] * B[3]\n\t" - "ldr r8, [%[a], #164]\n\t" - "ldr r9, [%[b], #12]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[42] * B[2]\n\t" - "ldr r8, [%[a], #168]\n\t" - "ldr r9, [%[b], #8]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[43] * B[1]\n\t" - "ldr r8, [%[a], #172]\n\t" - "ldr r9, [%[b], #4]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[44] * B[0]\n\t" - "ldr r8, [%[a], #176]\n\t" - "ldr r9, [%[b], #0]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "str r5, [sp, #176]\n\t" - "# A[0] * B[45]\n\t" - "ldr r8, [%[a], #0]\n\t" - "ldr r9, [%[b], #180]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r10, r10\n\t" - "# A[1] * B[44]\n\t" - "ldr r8, [%[a], #4]\n\t" - "ldr r9, [%[b], #176]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[2] * B[43]\n\t" - "ldr r8, [%[a], #8]\n\t" - "ldr r9, [%[b], #172]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[3] * B[42]\n\t" - "ldr r8, [%[a], #12]\n\t" - "ldr r9, [%[b], #168]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[4] * B[41]\n\t" - "ldr r8, [%[a], #16]\n\t" - "ldr r9, [%[b], #164]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[5] * B[40]\n\t" - "ldr r8, [%[a], #20]\n\t" - "ldr r9, [%[b], #160]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[6] * B[39]\n\t" - "ldr r8, [%[a], #24]\n\t" - "ldr r9, [%[b], #156]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[7] * B[38]\n\t" - "ldr r8, [%[a], #28]\n\t" - "ldr r9, [%[b], #152]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[8] * B[37]\n\t" - "ldr r8, [%[a], #32]\n\t" - "ldr r9, [%[b], #148]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[9] * B[36]\n\t" - "ldr r8, [%[a], #36]\n\t" - "ldr r9, [%[b], #144]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[10] * B[35]\n\t" - "ldr r8, [%[a], #40]\n\t" - "ldr r9, [%[b], #140]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[11] * B[34]\n\t" - "ldr r8, [%[a], #44]\n\t" - "ldr r9, [%[b], #136]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[12] * B[33]\n\t" - "ldr r8, [%[a], #48]\n\t" - "ldr r9, [%[b], #132]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[13] * B[32]\n\t" - "ldr r8, [%[a], #52]\n\t" - "ldr r9, [%[b], #128]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[14] * B[31]\n\t" - "ldr r8, [%[a], #56]\n\t" - "ldr r9, [%[b], #124]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[15] * B[30]\n\t" - "ldr r8, [%[a], #60]\n\t" - "ldr r9, [%[b], #120]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[16] * B[29]\n\t" - "ldr r8, [%[a], #64]\n\t" - "ldr r9, [%[b], #116]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[17] * B[28]\n\t" - "ldr r8, [%[a], #68]\n\t" - "ldr r9, [%[b], #112]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[18] * B[27]\n\t" - "ldr r8, [%[a], #72]\n\t" - "ldr r9, [%[b], #108]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[19] * B[26]\n\t" - "ldr r8, [%[a], #76]\n\t" - "ldr r9, [%[b], #104]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[20] * B[25]\n\t" - "ldr r8, [%[a], #80]\n\t" - "ldr r9, [%[b], #100]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[21] * B[24]\n\t" - "ldr r8, [%[a], #84]\n\t" - "ldr r9, [%[b], #96]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[22] * B[23]\n\t" - "ldr r8, [%[a], #88]\n\t" - "ldr r9, [%[b], #92]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[23] * B[22]\n\t" - "ldr r8, [%[a], #92]\n\t" - "ldr r9, [%[b], #88]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[24] * B[21]\n\t" - "ldr r8, [%[a], #96]\n\t" - "ldr r9, [%[b], #84]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[25] * B[20]\n\t" - "ldr r8, [%[a], #100]\n\t" - "ldr r9, [%[b], #80]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[26] * B[19]\n\t" - "ldr r8, [%[a], #104]\n\t" - "ldr r9, [%[b], #76]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[27] * B[18]\n\t" - "ldr r8, [%[a], #108]\n\t" - "ldr r9, [%[b], #72]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[28] * B[17]\n\t" - "ldr r8, [%[a], #112]\n\t" - "ldr r9, [%[b], #68]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[29] * B[16]\n\t" - "ldr r8, [%[a], #116]\n\t" - "ldr r9, [%[b], #64]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[30] * B[15]\n\t" - "ldr r8, [%[a], #120]\n\t" - "ldr r9, [%[b], #60]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[31] * B[14]\n\t" - "ldr r8, [%[a], #124]\n\t" - "ldr r9, [%[b], #56]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[32] * B[13]\n\t" - "ldr r8, [%[a], #128]\n\t" - "ldr r9, [%[b], #52]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[33] * B[12]\n\t" - "ldr r8, [%[a], #132]\n\t" - "ldr r9, [%[b], #48]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[34] * B[11]\n\t" - "ldr r8, [%[a], #136]\n\t" - "ldr r9, [%[b], #44]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[35] * B[10]\n\t" - "ldr r8, [%[a], #140]\n\t" - "ldr r9, [%[b], #40]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[36] * B[9]\n\t" - "ldr r8, [%[a], #144]\n\t" - "ldr r9, [%[b], #36]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[37] * B[8]\n\t" - "ldr r8, [%[a], #148]\n\t" - "ldr r9, [%[b], #32]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[38] * B[7]\n\t" - "ldr r8, [%[a], #152]\n\t" - "ldr r9, [%[b], #28]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[39] * B[6]\n\t" - "ldr r8, [%[a], #156]\n\t" - "ldr r9, [%[b], #24]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[40] * B[5]\n\t" - "ldr r8, [%[a], #160]\n\t" - "ldr r9, [%[b], #20]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[41] * B[4]\n\t" - "ldr r8, [%[a], #164]\n\t" - "ldr r9, [%[b], #16]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[42] * B[3]\n\t" - "ldr r8, [%[a], #168]\n\t" - "ldr r9, [%[b], #12]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[43] * B[2]\n\t" - "ldr r8, [%[a], #172]\n\t" - "ldr r9, [%[b], #8]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[44] * B[1]\n\t" - "ldr r8, [%[a], #176]\n\t" - "ldr r9, [%[b], #4]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[45] * B[0]\n\t" - "ldr r8, [%[a], #180]\n\t" - "ldr r9, [%[b], #0]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "str r3, [sp, #180]\n\t" - "# A[0] * B[46]\n\t" - "ldr r8, [%[a], #0]\n\t" - "ldr r9, [%[b], #184]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r10, r10\n\t" - "# A[1] * B[45]\n\t" - "ldr r8, [%[a], #4]\n\t" - "ldr r9, [%[b], #180]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[2] * B[44]\n\t" - "ldr r8, [%[a], #8]\n\t" - "ldr r9, [%[b], #176]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[3] * B[43]\n\t" - "ldr r8, [%[a], #12]\n\t" - "ldr r9, [%[b], #172]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[4] * B[42]\n\t" - "ldr r8, [%[a], #16]\n\t" - "ldr r9, [%[b], #168]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[5] * B[41]\n\t" - "ldr r8, [%[a], #20]\n\t" - "ldr r9, [%[b], #164]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[6] * B[40]\n\t" - "ldr r8, [%[a], #24]\n\t" - "ldr r9, [%[b], #160]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[7] * B[39]\n\t" - "ldr r8, [%[a], #28]\n\t" - "ldr r9, [%[b], #156]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[8] * B[38]\n\t" - "ldr r8, [%[a], #32]\n\t" - "ldr r9, [%[b], #152]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[9] * B[37]\n\t" - "ldr r8, [%[a], #36]\n\t" - "ldr r9, [%[b], #148]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[10] * B[36]\n\t" - "ldr r8, [%[a], #40]\n\t" - "ldr r9, [%[b], #144]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[11] * B[35]\n\t" - "ldr r8, [%[a], #44]\n\t" - "ldr r9, [%[b], #140]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[12] * B[34]\n\t" - "ldr r8, [%[a], #48]\n\t" - "ldr r9, [%[b], #136]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[13] * B[33]\n\t" - "ldr r8, [%[a], #52]\n\t" - "ldr r9, [%[b], #132]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[14] * B[32]\n\t" - "ldr r8, [%[a], #56]\n\t" - "ldr r9, [%[b], #128]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[15] * B[31]\n\t" - "ldr r8, [%[a], #60]\n\t" - "ldr r9, [%[b], #124]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[16] * B[30]\n\t" - "ldr r8, [%[a], #64]\n\t" - "ldr r9, [%[b], #120]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[17] * B[29]\n\t" - "ldr r8, [%[a], #68]\n\t" - "ldr r9, [%[b], #116]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[18] * B[28]\n\t" - "ldr r8, [%[a], #72]\n\t" - "ldr r9, [%[b], #112]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[19] * B[27]\n\t" - "ldr r8, [%[a], #76]\n\t" - "ldr r9, [%[b], #108]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[20] * B[26]\n\t" - "ldr r8, [%[a], #80]\n\t" - "ldr r9, [%[b], #104]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[21] * B[25]\n\t" - "ldr r8, [%[a], #84]\n\t" - "ldr r9, [%[b], #100]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[22] * B[24]\n\t" - "ldr r8, [%[a], #88]\n\t" - "ldr r9, [%[b], #96]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[23] * B[23]\n\t" - "ldr r8, [%[a], #92]\n\t" - "ldr r9, [%[b], #92]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[24] * B[22]\n\t" - "ldr r8, [%[a], #96]\n\t" - "ldr r9, [%[b], #88]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[25] * B[21]\n\t" - "ldr r8, [%[a], #100]\n\t" - "ldr r9, [%[b], #84]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[26] * B[20]\n\t" - "ldr r8, [%[a], #104]\n\t" - "ldr r9, [%[b], #80]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[27] * B[19]\n\t" - "ldr r8, [%[a], #108]\n\t" - "ldr r9, [%[b], #76]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[28] * B[18]\n\t" - "ldr r8, [%[a], #112]\n\t" - "ldr r9, [%[b], #72]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[29] * B[17]\n\t" - "ldr r8, [%[a], #116]\n\t" - "ldr r9, [%[b], #68]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[30] * B[16]\n\t" - "ldr r8, [%[a], #120]\n\t" - "ldr r9, [%[b], #64]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[31] * B[15]\n\t" - "ldr r8, [%[a], #124]\n\t" - "ldr r9, [%[b], #60]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[32] * B[14]\n\t" - "ldr r8, [%[a], #128]\n\t" - "ldr r9, [%[b], #56]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[33] * B[13]\n\t" - "ldr r8, [%[a], #132]\n\t" - "ldr r9, [%[b], #52]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[34] * B[12]\n\t" - "ldr r8, [%[a], #136]\n\t" - "ldr r9, [%[b], #48]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[35] * B[11]\n\t" - "ldr r8, [%[a], #140]\n\t" - "ldr r9, [%[b], #44]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[36] * B[10]\n\t" - "ldr r8, [%[a], #144]\n\t" - "ldr r9, [%[b], #40]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[37] * B[9]\n\t" - "ldr r8, [%[a], #148]\n\t" - "ldr r9, [%[b], #36]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[38] * B[8]\n\t" - "ldr r8, [%[a], #152]\n\t" - "ldr r9, [%[b], #32]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[39] * B[7]\n\t" - "ldr r8, [%[a], #156]\n\t" - "ldr r9, [%[b], #28]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[40] * B[6]\n\t" - "ldr r8, [%[a], #160]\n\t" - "ldr r9, [%[b], #24]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[41] * B[5]\n\t" - "ldr r8, [%[a], #164]\n\t" - "ldr r9, [%[b], #20]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[42] * B[4]\n\t" - "ldr r8, [%[a], #168]\n\t" - "ldr r9, [%[b], #16]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[43] * B[3]\n\t" - "ldr r8, [%[a], #172]\n\t" - "ldr r9, [%[b], #12]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[44] * B[2]\n\t" - "ldr r8, [%[a], #176]\n\t" - "ldr r9, [%[b], #8]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[45] * B[1]\n\t" - "ldr r8, [%[a], #180]\n\t" - "ldr r9, [%[b], #4]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[46] * B[0]\n\t" - "ldr r8, [%[a], #184]\n\t" - "ldr r9, [%[b], #0]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "str r4, [sp, #184]\n\t" - "# A[0] * B[47]\n\t" - "ldr r8, [%[a], #0]\n\t" - "ldr r9, [%[b], #188]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r10, r10\n\t" - "# A[1] * B[46]\n\t" - "ldr r8, [%[a], #4]\n\t" - "ldr r9, [%[b], #184]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[2] * B[45]\n\t" - "ldr r8, [%[a], #8]\n\t" - "ldr r9, [%[b], #180]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[3] * B[44]\n\t" - "ldr r8, [%[a], #12]\n\t" - "ldr r9, [%[b], #176]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[4] * B[43]\n\t" - "ldr r8, [%[a], #16]\n\t" - "ldr r9, [%[b], #172]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[5] * B[42]\n\t" - "ldr r8, [%[a], #20]\n\t" - "ldr r9, [%[b], #168]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[6] * B[41]\n\t" - "ldr r8, [%[a], #24]\n\t" - "ldr r9, [%[b], #164]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[7] * B[40]\n\t" - "ldr r8, [%[a], #28]\n\t" - "ldr r9, [%[b], #160]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[8] * B[39]\n\t" - "ldr r8, [%[a], #32]\n\t" - "ldr r9, [%[b], #156]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[9] * B[38]\n\t" - "ldr r8, [%[a], #36]\n\t" - "ldr r9, [%[b], #152]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[10] * B[37]\n\t" - "ldr r8, [%[a], #40]\n\t" - "ldr r9, [%[b], #148]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[11] * B[36]\n\t" - "ldr r8, [%[a], #44]\n\t" - "ldr r9, [%[b], #144]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[12] * B[35]\n\t" - "ldr r8, [%[a], #48]\n\t" - "ldr r9, [%[b], #140]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[13] * B[34]\n\t" - "ldr r8, [%[a], #52]\n\t" - "ldr r9, [%[b], #136]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[14] * B[33]\n\t" - "ldr r8, [%[a], #56]\n\t" - "ldr r9, [%[b], #132]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[15] * B[32]\n\t" - "ldr r8, [%[a], #60]\n\t" - "ldr r9, [%[b], #128]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[16] * B[31]\n\t" - "ldr r8, [%[a], #64]\n\t" - "ldr r9, [%[b], #124]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[17] * B[30]\n\t" - "ldr r8, [%[a], #68]\n\t" - "ldr r9, [%[b], #120]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[18] * B[29]\n\t" - "ldr r8, [%[a], #72]\n\t" - "ldr r9, [%[b], #116]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[19] * B[28]\n\t" - "ldr r8, [%[a], #76]\n\t" - "ldr r9, [%[b], #112]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[20] * B[27]\n\t" - "ldr r8, [%[a], #80]\n\t" - "ldr r9, [%[b], #108]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[21] * B[26]\n\t" - "ldr r8, [%[a], #84]\n\t" - "ldr r9, [%[b], #104]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[22] * B[25]\n\t" - "ldr r8, [%[a], #88]\n\t" - "ldr r9, [%[b], #100]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[23] * B[24]\n\t" - "ldr r8, [%[a], #92]\n\t" - "ldr r9, [%[b], #96]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[24] * B[23]\n\t" - "ldr r8, [%[a], #96]\n\t" - "ldr r9, [%[b], #92]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[25] * B[22]\n\t" - "ldr r8, [%[a], #100]\n\t" - "ldr r9, [%[b], #88]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[26] * B[21]\n\t" - "ldr r8, [%[a], #104]\n\t" - "ldr r9, [%[b], #84]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[27] * B[20]\n\t" - "ldr r8, [%[a], #108]\n\t" - "ldr r9, [%[b], #80]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[28] * B[19]\n\t" - "ldr r8, [%[a], #112]\n\t" - "ldr r9, [%[b], #76]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[29] * B[18]\n\t" - "ldr r8, [%[a], #116]\n\t" - "ldr r9, [%[b], #72]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[30] * B[17]\n\t" - "ldr r8, [%[a], #120]\n\t" - "ldr r9, [%[b], #68]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[31] * B[16]\n\t" - "ldr r8, [%[a], #124]\n\t" - "ldr r9, [%[b], #64]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[32] * B[15]\n\t" - "ldr r8, [%[a], #128]\n\t" - "ldr r9, [%[b], #60]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[33] * B[14]\n\t" - "ldr r8, [%[a], #132]\n\t" - "ldr r9, [%[b], #56]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[34] * B[13]\n\t" - "ldr r8, [%[a], #136]\n\t" - "ldr r9, [%[b], #52]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[35] * B[12]\n\t" - "ldr r8, [%[a], #140]\n\t" - "ldr r9, [%[b], #48]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[36] * B[11]\n\t" - "ldr r8, [%[a], #144]\n\t" - "ldr r9, [%[b], #44]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[37] * B[10]\n\t" - "ldr r8, [%[a], #148]\n\t" - "ldr r9, [%[b], #40]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[38] * B[9]\n\t" - "ldr r8, [%[a], #152]\n\t" - "ldr r9, [%[b], #36]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[39] * B[8]\n\t" - "ldr r8, [%[a], #156]\n\t" - "ldr r9, [%[b], #32]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[40] * B[7]\n\t" - "ldr r8, [%[a], #160]\n\t" - "ldr r9, [%[b], #28]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[41] * B[6]\n\t" - "ldr r8, [%[a], #164]\n\t" - "ldr r9, [%[b], #24]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[42] * B[5]\n\t" - "ldr r8, [%[a], #168]\n\t" - "ldr r9, [%[b], #20]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[43] * B[4]\n\t" - "ldr r8, [%[a], #172]\n\t" - "ldr r9, [%[b], #16]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[44] * B[3]\n\t" - "ldr r8, [%[a], #176]\n\t" - "ldr r9, [%[b], #12]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[45] * B[2]\n\t" - "ldr r8, [%[a], #180]\n\t" - "ldr r9, [%[b], #8]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[46] * B[1]\n\t" - "ldr r8, [%[a], #184]\n\t" - "ldr r9, [%[b], #4]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[47] * B[0]\n\t" - "ldr r8, [%[a], #188]\n\t" - "ldr r9, [%[b], #0]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "str r5, [sp, #188]\n\t" - "# A[0] * B[48]\n\t" - "ldr r8, [%[a], #0]\n\t" - "ldr r9, [%[b], #192]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r10, r10\n\t" - "# A[1] * B[47]\n\t" - "ldr r8, [%[a], #4]\n\t" - "ldr r9, [%[b], #188]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[2] * B[46]\n\t" - "ldr r8, [%[a], #8]\n\t" - "ldr r9, [%[b], #184]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[3] * B[45]\n\t" - "ldr r8, [%[a], #12]\n\t" - "ldr r9, [%[b], #180]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[4] * B[44]\n\t" - "ldr r8, [%[a], #16]\n\t" - "ldr r9, [%[b], #176]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[5] * B[43]\n\t" - "ldr r8, [%[a], #20]\n\t" - "ldr r9, [%[b], #172]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[6] * B[42]\n\t" - "ldr r8, [%[a], #24]\n\t" - "ldr r9, [%[b], #168]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[7] * B[41]\n\t" - "ldr r8, [%[a], #28]\n\t" - "ldr r9, [%[b], #164]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[8] * B[40]\n\t" - "ldr r8, [%[a], #32]\n\t" - "ldr r9, [%[b], #160]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[9] * B[39]\n\t" - "ldr r8, [%[a], #36]\n\t" - "ldr r9, [%[b], #156]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[10] * B[38]\n\t" - "ldr r8, [%[a], #40]\n\t" - "ldr r9, [%[b], #152]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[11] * B[37]\n\t" - "ldr r8, [%[a], #44]\n\t" - "ldr r9, [%[b], #148]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[12] * B[36]\n\t" - "ldr r8, [%[a], #48]\n\t" - "ldr r9, [%[b], #144]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[13] * B[35]\n\t" - "ldr r8, [%[a], #52]\n\t" - "ldr r9, [%[b], #140]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[14] * B[34]\n\t" - "ldr r8, [%[a], #56]\n\t" - "ldr r9, [%[b], #136]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[15] * B[33]\n\t" - "ldr r8, [%[a], #60]\n\t" - "ldr r9, [%[b], #132]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[16] * B[32]\n\t" - "ldr r8, [%[a], #64]\n\t" - "ldr r9, [%[b], #128]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[17] * B[31]\n\t" - "ldr r8, [%[a], #68]\n\t" - "ldr r9, [%[b], #124]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[18] * B[30]\n\t" - "ldr r8, [%[a], #72]\n\t" - "ldr r9, [%[b], #120]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[19] * B[29]\n\t" - "ldr r8, [%[a], #76]\n\t" - "ldr r9, [%[b], #116]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[20] * B[28]\n\t" - "ldr r8, [%[a], #80]\n\t" - "ldr r9, [%[b], #112]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[21] * B[27]\n\t" - "ldr r8, [%[a], #84]\n\t" - "ldr r9, [%[b], #108]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[22] * B[26]\n\t" - "ldr r8, [%[a], #88]\n\t" - "ldr r9, [%[b], #104]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[23] * B[25]\n\t" - "ldr r8, [%[a], #92]\n\t" - "ldr r9, [%[b], #100]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[24] * B[24]\n\t" - "ldr r8, [%[a], #96]\n\t" - "ldr r9, [%[b], #96]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[25] * B[23]\n\t" - "ldr r8, [%[a], #100]\n\t" - "ldr r9, [%[b], #92]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[26] * B[22]\n\t" - "ldr r8, [%[a], #104]\n\t" - "ldr r9, [%[b], #88]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[27] * B[21]\n\t" - "ldr r8, [%[a], #108]\n\t" - "ldr r9, [%[b], #84]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[28] * B[20]\n\t" - "ldr r8, [%[a], #112]\n\t" - "ldr r9, [%[b], #80]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[29] * B[19]\n\t" - "ldr r8, [%[a], #116]\n\t" - "ldr r9, [%[b], #76]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[30] * B[18]\n\t" - "ldr r8, [%[a], #120]\n\t" - "ldr r9, [%[b], #72]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[31] * B[17]\n\t" - "ldr r8, [%[a], #124]\n\t" - "ldr r9, [%[b], #68]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[32] * B[16]\n\t" - "ldr r8, [%[a], #128]\n\t" - "ldr r9, [%[b], #64]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[33] * B[15]\n\t" - "ldr r8, [%[a], #132]\n\t" - "ldr r9, [%[b], #60]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[34] * B[14]\n\t" - "ldr r8, [%[a], #136]\n\t" - "ldr r9, [%[b], #56]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[35] * B[13]\n\t" - "ldr r8, [%[a], #140]\n\t" - "ldr r9, [%[b], #52]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[36] * B[12]\n\t" - "ldr r8, [%[a], #144]\n\t" - "ldr r9, [%[b], #48]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[37] * B[11]\n\t" - "ldr r8, [%[a], #148]\n\t" - "ldr r9, [%[b], #44]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[38] * B[10]\n\t" - "ldr r8, [%[a], #152]\n\t" - "ldr r9, [%[b], #40]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[39] * B[9]\n\t" - "ldr r8, [%[a], #156]\n\t" - "ldr r9, [%[b], #36]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[40] * B[8]\n\t" - "ldr r8, [%[a], #160]\n\t" - "ldr r9, [%[b], #32]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[41] * B[7]\n\t" - "ldr r8, [%[a], #164]\n\t" - "ldr r9, [%[b], #28]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[42] * B[6]\n\t" - "ldr r8, [%[a], #168]\n\t" - "ldr r9, [%[b], #24]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[43] * B[5]\n\t" - "ldr r8, [%[a], #172]\n\t" - "ldr r9, [%[b], #20]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[44] * B[4]\n\t" - "ldr r8, [%[a], #176]\n\t" - "ldr r9, [%[b], #16]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[45] * B[3]\n\t" - "ldr r8, [%[a], #180]\n\t" - "ldr r9, [%[b], #12]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[46] * B[2]\n\t" - "ldr r8, [%[a], #184]\n\t" - "ldr r9, [%[b], #8]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[47] * B[1]\n\t" - "ldr r8, [%[a], #188]\n\t" - "ldr r9, [%[b], #4]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[48] * B[0]\n\t" - "ldr r8, [%[a], #192]\n\t" - "ldr r9, [%[b], #0]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "str r3, [sp, #192]\n\t" - "# A[0] * B[49]\n\t" - "ldr r8, [%[a], #0]\n\t" - "ldr r9, [%[b], #196]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r10, r10\n\t" - "# A[1] * B[48]\n\t" - "ldr r8, [%[a], #4]\n\t" - "ldr r9, [%[b], #192]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[2] * B[47]\n\t" - "ldr r8, [%[a], #8]\n\t" - "ldr r9, [%[b], #188]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[3] * B[46]\n\t" - "ldr r8, [%[a], #12]\n\t" - "ldr r9, [%[b], #184]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[4] * B[45]\n\t" - "ldr r8, [%[a], #16]\n\t" - "ldr r9, [%[b], #180]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[5] * B[44]\n\t" - "ldr r8, [%[a], #20]\n\t" - "ldr r9, [%[b], #176]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[6] * B[43]\n\t" - "ldr r8, [%[a], #24]\n\t" - "ldr r9, [%[b], #172]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[7] * B[42]\n\t" - "ldr r8, [%[a], #28]\n\t" - "ldr r9, [%[b], #168]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[8] * B[41]\n\t" - "ldr r8, [%[a], #32]\n\t" - "ldr r9, [%[b], #164]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[9] * B[40]\n\t" - "ldr r8, [%[a], #36]\n\t" - "ldr r9, [%[b], #160]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[10] * B[39]\n\t" - "ldr r8, [%[a], #40]\n\t" - "ldr r9, [%[b], #156]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[11] * B[38]\n\t" - "ldr r8, [%[a], #44]\n\t" - "ldr r9, [%[b], #152]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[12] * B[37]\n\t" - "ldr r8, [%[a], #48]\n\t" - "ldr r9, [%[b], #148]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[13] * B[36]\n\t" - "ldr r8, [%[a], #52]\n\t" - "ldr r9, [%[b], #144]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[14] * B[35]\n\t" - "ldr r8, [%[a], #56]\n\t" - "ldr r9, [%[b], #140]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[15] * B[34]\n\t" - "ldr r8, [%[a], #60]\n\t" - "ldr r9, [%[b], #136]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[16] * B[33]\n\t" - "ldr r8, [%[a], #64]\n\t" - "ldr r9, [%[b], #132]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[17] * B[32]\n\t" - "ldr r8, [%[a], #68]\n\t" - "ldr r9, [%[b], #128]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[18] * B[31]\n\t" - "ldr r8, [%[a], #72]\n\t" - "ldr r9, [%[b], #124]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[19] * B[30]\n\t" - "ldr r8, [%[a], #76]\n\t" - "ldr r9, [%[b], #120]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[20] * B[29]\n\t" - "ldr r8, [%[a], #80]\n\t" - "ldr r9, [%[b], #116]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[21] * B[28]\n\t" - "ldr r8, [%[a], #84]\n\t" - "ldr r9, [%[b], #112]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[22] * B[27]\n\t" - "ldr r8, [%[a], #88]\n\t" - "ldr r9, [%[b], #108]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[23] * B[26]\n\t" - "ldr r8, [%[a], #92]\n\t" - "ldr r9, [%[b], #104]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[24] * B[25]\n\t" - "ldr r8, [%[a], #96]\n\t" - "ldr r9, [%[b], #100]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[25] * B[24]\n\t" - "ldr r8, [%[a], #100]\n\t" - "ldr r9, [%[b], #96]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[26] * B[23]\n\t" - "ldr r8, [%[a], #104]\n\t" - "ldr r9, [%[b], #92]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[27] * B[22]\n\t" - "ldr r8, [%[a], #108]\n\t" - "ldr r9, [%[b], #88]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[28] * B[21]\n\t" - "ldr r8, [%[a], #112]\n\t" - "ldr r9, [%[b], #84]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[29] * B[20]\n\t" - "ldr r8, [%[a], #116]\n\t" - "ldr r9, [%[b], #80]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[30] * B[19]\n\t" - "ldr r8, [%[a], #120]\n\t" - "ldr r9, [%[b], #76]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[31] * B[18]\n\t" - "ldr r8, [%[a], #124]\n\t" - "ldr r9, [%[b], #72]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[32] * B[17]\n\t" - "ldr r8, [%[a], #128]\n\t" - "ldr r9, [%[b], #68]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[33] * B[16]\n\t" - "ldr r8, [%[a], #132]\n\t" - "ldr r9, [%[b], #64]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[34] * B[15]\n\t" - "ldr r8, [%[a], #136]\n\t" - "ldr r9, [%[b], #60]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[35] * B[14]\n\t" - "ldr r8, [%[a], #140]\n\t" - "ldr r9, [%[b], #56]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[36] * B[13]\n\t" - "ldr r8, [%[a], #144]\n\t" - "ldr r9, [%[b], #52]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[37] * B[12]\n\t" - "ldr r8, [%[a], #148]\n\t" - "ldr r9, [%[b], #48]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[38] * B[11]\n\t" - "ldr r8, [%[a], #152]\n\t" - "ldr r9, [%[b], #44]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[39] * B[10]\n\t" - "ldr r8, [%[a], #156]\n\t" - "ldr r9, [%[b], #40]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[40] * B[9]\n\t" - "ldr r8, [%[a], #160]\n\t" - "ldr r9, [%[b], #36]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[41] * B[8]\n\t" - "ldr r8, [%[a], #164]\n\t" - "ldr r9, [%[b], #32]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[42] * B[7]\n\t" - "ldr r8, [%[a], #168]\n\t" - "ldr r9, [%[b], #28]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[43] * B[6]\n\t" - "ldr r8, [%[a], #172]\n\t" - "ldr r9, [%[b], #24]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[44] * B[5]\n\t" - "ldr r8, [%[a], #176]\n\t" - "ldr r9, [%[b], #20]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[45] * B[4]\n\t" - "ldr r8, [%[a], #180]\n\t" - "ldr r9, [%[b], #16]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[46] * B[3]\n\t" - "ldr r8, [%[a], #184]\n\t" - "ldr r9, [%[b], #12]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[47] * B[2]\n\t" - "ldr r8, [%[a], #188]\n\t" - "ldr r9, [%[b], #8]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[48] * B[1]\n\t" - "ldr r8, [%[a], #192]\n\t" - "ldr r9, [%[b], #4]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[49] * B[0]\n\t" - "ldr r8, [%[a], #196]\n\t" - "ldr r9, [%[b], #0]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "str r4, [sp, #196]\n\t" - "# A[0] * B[50]\n\t" - "ldr r8, [%[a], #0]\n\t" - "ldr r9, [%[b], #200]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r10, r10\n\t" - "# A[1] * B[49]\n\t" - "ldr r8, [%[a], #4]\n\t" - "ldr r9, [%[b], #196]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[2] * B[48]\n\t" - "ldr r8, [%[a], #8]\n\t" - "ldr r9, [%[b], #192]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[3] * B[47]\n\t" - "ldr r8, [%[a], #12]\n\t" - "ldr r9, [%[b], #188]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[4] * B[46]\n\t" - "ldr r8, [%[a], #16]\n\t" - "ldr r9, [%[b], #184]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[5] * B[45]\n\t" - "ldr r8, [%[a], #20]\n\t" - "ldr r9, [%[b], #180]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[6] * B[44]\n\t" - "ldr r8, [%[a], #24]\n\t" - "ldr r9, [%[b], #176]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[7] * B[43]\n\t" - "ldr r8, [%[a], #28]\n\t" - "ldr r9, [%[b], #172]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[8] * B[42]\n\t" - "ldr r8, [%[a], #32]\n\t" - "ldr r9, [%[b], #168]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[9] * B[41]\n\t" - "ldr r8, [%[a], #36]\n\t" - "ldr r9, [%[b], #164]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[10] * B[40]\n\t" - "ldr r8, [%[a], #40]\n\t" - "ldr r9, [%[b], #160]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[11] * B[39]\n\t" - "ldr r8, [%[a], #44]\n\t" - "ldr r9, [%[b], #156]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[12] * B[38]\n\t" - "ldr r8, [%[a], #48]\n\t" - "ldr r9, [%[b], #152]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[13] * B[37]\n\t" - "ldr r8, [%[a], #52]\n\t" - "ldr r9, [%[b], #148]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[14] * B[36]\n\t" - "ldr r8, [%[a], #56]\n\t" - "ldr r9, [%[b], #144]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[15] * B[35]\n\t" - "ldr r8, [%[a], #60]\n\t" - "ldr r9, [%[b], #140]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[16] * B[34]\n\t" - "ldr r8, [%[a], #64]\n\t" - "ldr r9, [%[b], #136]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[17] * B[33]\n\t" - "ldr r8, [%[a], #68]\n\t" - "ldr r9, [%[b], #132]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[18] * B[32]\n\t" - "ldr r8, [%[a], #72]\n\t" - "ldr r9, [%[b], #128]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[19] * B[31]\n\t" - "ldr r8, [%[a], #76]\n\t" - "ldr r9, [%[b], #124]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[20] * B[30]\n\t" - "ldr r8, [%[a], #80]\n\t" - "ldr r9, [%[b], #120]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[21] * B[29]\n\t" - "ldr r8, [%[a], #84]\n\t" - "ldr r9, [%[b], #116]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[22] * B[28]\n\t" - "ldr r8, [%[a], #88]\n\t" - "ldr r9, [%[b], #112]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[23] * B[27]\n\t" - "ldr r8, [%[a], #92]\n\t" - "ldr r9, [%[b], #108]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[24] * B[26]\n\t" - "ldr r8, [%[a], #96]\n\t" - "ldr r9, [%[b], #104]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[25] * B[25]\n\t" - "ldr r8, [%[a], #100]\n\t" - "ldr r9, [%[b], #100]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[26] * B[24]\n\t" - "ldr r8, [%[a], #104]\n\t" - "ldr r9, [%[b], #96]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[27] * B[23]\n\t" - "ldr r8, [%[a], #108]\n\t" - "ldr r9, [%[b], #92]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[28] * B[22]\n\t" - "ldr r8, [%[a], #112]\n\t" - "ldr r9, [%[b], #88]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[29] * B[21]\n\t" - "ldr r8, [%[a], #116]\n\t" - "ldr r9, [%[b], #84]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[30] * B[20]\n\t" - "ldr r8, [%[a], #120]\n\t" - "ldr r9, [%[b], #80]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[31] * B[19]\n\t" - "ldr r8, [%[a], #124]\n\t" - "ldr r9, [%[b], #76]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[32] * B[18]\n\t" - "ldr r8, [%[a], #128]\n\t" - "ldr r9, [%[b], #72]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[33] * B[17]\n\t" - "ldr r8, [%[a], #132]\n\t" - "ldr r9, [%[b], #68]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[34] * B[16]\n\t" - "ldr r8, [%[a], #136]\n\t" - "ldr r9, [%[b], #64]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[35] * B[15]\n\t" - "ldr r8, [%[a], #140]\n\t" - "ldr r9, [%[b], #60]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[36] * B[14]\n\t" - "ldr r8, [%[a], #144]\n\t" - "ldr r9, [%[b], #56]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[37] * B[13]\n\t" - "ldr r8, [%[a], #148]\n\t" - "ldr r9, [%[b], #52]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[38] * B[12]\n\t" - "ldr r8, [%[a], #152]\n\t" - "ldr r9, [%[b], #48]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[39] * B[11]\n\t" - "ldr r8, [%[a], #156]\n\t" - "ldr r9, [%[b], #44]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[40] * B[10]\n\t" - "ldr r8, [%[a], #160]\n\t" - "ldr r9, [%[b], #40]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[41] * B[9]\n\t" - "ldr r8, [%[a], #164]\n\t" - "ldr r9, [%[b], #36]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[42] * B[8]\n\t" - "ldr r8, [%[a], #168]\n\t" - "ldr r9, [%[b], #32]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[43] * B[7]\n\t" - "ldr r8, [%[a], #172]\n\t" - "ldr r9, [%[b], #28]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[44] * B[6]\n\t" - "ldr r8, [%[a], #176]\n\t" - "ldr r9, [%[b], #24]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[45] * B[5]\n\t" - "ldr r8, [%[a], #180]\n\t" - "ldr r9, [%[b], #20]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[46] * B[4]\n\t" - "ldr r8, [%[a], #184]\n\t" - "ldr r9, [%[b], #16]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[47] * B[3]\n\t" - "ldr r8, [%[a], #188]\n\t" - "ldr r9, [%[b], #12]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[48] * B[2]\n\t" - "ldr r8, [%[a], #192]\n\t" - "ldr r9, [%[b], #8]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[49] * B[1]\n\t" - "ldr r8, [%[a], #196]\n\t" - "ldr r9, [%[b], #4]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[50] * B[0]\n\t" - "ldr r8, [%[a], #200]\n\t" - "ldr r9, [%[b], #0]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "str r5, [sp, #200]\n\t" - "# A[0] * B[51]\n\t" - "ldr r8, [%[a], #0]\n\t" - "ldr r9, [%[b], #204]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r10, r10\n\t" - "# A[1] * B[50]\n\t" - "ldr r8, [%[a], #4]\n\t" - "ldr r9, [%[b], #200]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[2] * B[49]\n\t" - "ldr r8, [%[a], #8]\n\t" - "ldr r9, [%[b], #196]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[3] * B[48]\n\t" - "ldr r8, [%[a], #12]\n\t" - "ldr r9, [%[b], #192]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[4] * B[47]\n\t" - "ldr r8, [%[a], #16]\n\t" - "ldr r9, [%[b], #188]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[5] * B[46]\n\t" - "ldr r8, [%[a], #20]\n\t" - "ldr r9, [%[b], #184]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[6] * B[45]\n\t" - "ldr r8, [%[a], #24]\n\t" - "ldr r9, [%[b], #180]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[7] * B[44]\n\t" - "ldr r8, [%[a], #28]\n\t" - "ldr r9, [%[b], #176]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[8] * B[43]\n\t" - "ldr r8, [%[a], #32]\n\t" - "ldr r9, [%[b], #172]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[9] * B[42]\n\t" - "ldr r8, [%[a], #36]\n\t" - "ldr r9, [%[b], #168]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[10] * B[41]\n\t" - "ldr r8, [%[a], #40]\n\t" - "ldr r9, [%[b], #164]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[11] * B[40]\n\t" - "ldr r8, [%[a], #44]\n\t" - "ldr r9, [%[b], #160]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[12] * B[39]\n\t" - "ldr r8, [%[a], #48]\n\t" - "ldr r9, [%[b], #156]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[13] * B[38]\n\t" - "ldr r8, [%[a], #52]\n\t" - "ldr r9, [%[b], #152]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[14] * B[37]\n\t" - "ldr r8, [%[a], #56]\n\t" - "ldr r9, [%[b], #148]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[15] * B[36]\n\t" - "ldr r8, [%[a], #60]\n\t" - "ldr r9, [%[b], #144]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[16] * B[35]\n\t" - "ldr r8, [%[a], #64]\n\t" - "ldr r9, [%[b], #140]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[17] * B[34]\n\t" - "ldr r8, [%[a], #68]\n\t" - "ldr r9, [%[b], #136]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[18] * B[33]\n\t" - "ldr r8, [%[a], #72]\n\t" - "ldr r9, [%[b], #132]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[19] * B[32]\n\t" - "ldr r8, [%[a], #76]\n\t" - "ldr r9, [%[b], #128]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[20] * B[31]\n\t" - "ldr r8, [%[a], #80]\n\t" - "ldr r9, [%[b], #124]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[21] * B[30]\n\t" - "ldr r8, [%[a], #84]\n\t" - "ldr r9, [%[b], #120]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[22] * B[29]\n\t" - "ldr r8, [%[a], #88]\n\t" - "ldr r9, [%[b], #116]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[23] * B[28]\n\t" - "ldr r8, [%[a], #92]\n\t" - "ldr r9, [%[b], #112]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[24] * B[27]\n\t" - "ldr r8, [%[a], #96]\n\t" - "ldr r9, [%[b], #108]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[25] * B[26]\n\t" - "ldr r8, [%[a], #100]\n\t" - "ldr r9, [%[b], #104]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[26] * B[25]\n\t" - "ldr r8, [%[a], #104]\n\t" - "ldr r9, [%[b], #100]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[27] * B[24]\n\t" - "ldr r8, [%[a], #108]\n\t" - "ldr r9, [%[b], #96]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[28] * B[23]\n\t" - "ldr r8, [%[a], #112]\n\t" - "ldr r9, [%[b], #92]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[29] * B[22]\n\t" - "ldr r8, [%[a], #116]\n\t" - "ldr r9, [%[b], #88]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[30] * B[21]\n\t" - "ldr r8, [%[a], #120]\n\t" - "ldr r9, [%[b], #84]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[31] * B[20]\n\t" - "ldr r8, [%[a], #124]\n\t" - "ldr r9, [%[b], #80]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[32] * B[19]\n\t" - "ldr r8, [%[a], #128]\n\t" - "ldr r9, [%[b], #76]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[33] * B[18]\n\t" - "ldr r8, [%[a], #132]\n\t" - "ldr r9, [%[b], #72]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[34] * B[17]\n\t" - "ldr r8, [%[a], #136]\n\t" - "ldr r9, [%[b], #68]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[35] * B[16]\n\t" - "ldr r8, [%[a], #140]\n\t" - "ldr r9, [%[b], #64]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[36] * B[15]\n\t" - "ldr r8, [%[a], #144]\n\t" - "ldr r9, [%[b], #60]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[37] * B[14]\n\t" - "ldr r8, [%[a], #148]\n\t" - "ldr r9, [%[b], #56]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[38] * B[13]\n\t" - "ldr r8, [%[a], #152]\n\t" - "ldr r9, [%[b], #52]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[39] * B[12]\n\t" - "ldr r8, [%[a], #156]\n\t" - "ldr r9, [%[b], #48]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[40] * B[11]\n\t" - "ldr r8, [%[a], #160]\n\t" - "ldr r9, [%[b], #44]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[41] * B[10]\n\t" - "ldr r8, [%[a], #164]\n\t" - "ldr r9, [%[b], #40]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[42] * B[9]\n\t" - "ldr r8, [%[a], #168]\n\t" - "ldr r9, [%[b], #36]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[43] * B[8]\n\t" - "ldr r8, [%[a], #172]\n\t" - "ldr r9, [%[b], #32]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[44] * B[7]\n\t" - "ldr r8, [%[a], #176]\n\t" - "ldr r9, [%[b], #28]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[45] * B[6]\n\t" - "ldr r8, [%[a], #180]\n\t" - "ldr r9, [%[b], #24]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[46] * B[5]\n\t" - "ldr r8, [%[a], #184]\n\t" - "ldr r9, [%[b], #20]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[47] * B[4]\n\t" - "ldr r8, [%[a], #188]\n\t" - "ldr r9, [%[b], #16]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[48] * B[3]\n\t" - "ldr r8, [%[a], #192]\n\t" - "ldr r9, [%[b], #12]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[49] * B[2]\n\t" - "ldr r8, [%[a], #196]\n\t" - "ldr r9, [%[b], #8]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[50] * B[1]\n\t" - "ldr r8, [%[a], #200]\n\t" - "ldr r9, [%[b], #4]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[51] * B[0]\n\t" - "ldr r8, [%[a], #204]\n\t" - "ldr r9, [%[b], #0]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "str r3, [sp, #204]\n\t" - "# A[0] * B[52]\n\t" - "ldr r8, [%[a], #0]\n\t" - "ldr r9, [%[b], #208]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r10, r10\n\t" - "# A[1] * B[51]\n\t" - "ldr r8, [%[a], #4]\n\t" - "ldr r9, [%[b], #204]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[2] * B[50]\n\t" - "ldr r8, [%[a], #8]\n\t" - "ldr r9, [%[b], #200]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[3] * B[49]\n\t" - "ldr r8, [%[a], #12]\n\t" - "ldr r9, [%[b], #196]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[4] * B[48]\n\t" - "ldr r8, [%[a], #16]\n\t" - "ldr r9, [%[b], #192]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[5] * B[47]\n\t" - "ldr r8, [%[a], #20]\n\t" - "ldr r9, [%[b], #188]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[6] * B[46]\n\t" - "ldr r8, [%[a], #24]\n\t" - "ldr r9, [%[b], #184]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[7] * B[45]\n\t" - "ldr r8, [%[a], #28]\n\t" - "ldr r9, [%[b], #180]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[8] * B[44]\n\t" - "ldr r8, [%[a], #32]\n\t" - "ldr r9, [%[b], #176]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[9] * B[43]\n\t" - "ldr r8, [%[a], #36]\n\t" - "ldr r9, [%[b], #172]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[10] * B[42]\n\t" - "ldr r8, [%[a], #40]\n\t" - "ldr r9, [%[b], #168]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[11] * B[41]\n\t" - "ldr r8, [%[a], #44]\n\t" - "ldr r9, [%[b], #164]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[12] * B[40]\n\t" - "ldr r8, [%[a], #48]\n\t" - "ldr r9, [%[b], #160]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[13] * B[39]\n\t" - "ldr r8, [%[a], #52]\n\t" - "ldr r9, [%[b], #156]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[14] * B[38]\n\t" - "ldr r8, [%[a], #56]\n\t" - "ldr r9, [%[b], #152]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[15] * B[37]\n\t" - "ldr r8, [%[a], #60]\n\t" - "ldr r9, [%[b], #148]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[16] * B[36]\n\t" - "ldr r8, [%[a], #64]\n\t" - "ldr r9, [%[b], #144]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[17] * B[35]\n\t" - "ldr r8, [%[a], #68]\n\t" - "ldr r9, [%[b], #140]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[18] * B[34]\n\t" - "ldr r8, [%[a], #72]\n\t" - "ldr r9, [%[b], #136]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[19] * B[33]\n\t" - "ldr r8, [%[a], #76]\n\t" - "ldr r9, [%[b], #132]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[20] * B[32]\n\t" - "ldr r8, [%[a], #80]\n\t" - "ldr r9, [%[b], #128]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[21] * B[31]\n\t" - "ldr r8, [%[a], #84]\n\t" - "ldr r9, [%[b], #124]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[22] * B[30]\n\t" - "ldr r8, [%[a], #88]\n\t" - "ldr r9, [%[b], #120]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[23] * B[29]\n\t" - "ldr r8, [%[a], #92]\n\t" - "ldr r9, [%[b], #116]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[24] * B[28]\n\t" - "ldr r8, [%[a], #96]\n\t" - "ldr r9, [%[b], #112]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[25] * B[27]\n\t" - "ldr r8, [%[a], #100]\n\t" - "ldr r9, [%[b], #108]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[26] * B[26]\n\t" - "ldr r8, [%[a], #104]\n\t" - "ldr r9, [%[b], #104]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[27] * B[25]\n\t" - "ldr r8, [%[a], #108]\n\t" - "ldr r9, [%[b], #100]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[28] * B[24]\n\t" - "ldr r8, [%[a], #112]\n\t" - "ldr r9, [%[b], #96]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[29] * B[23]\n\t" - "ldr r8, [%[a], #116]\n\t" - "ldr r9, [%[b], #92]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[30] * B[22]\n\t" - "ldr r8, [%[a], #120]\n\t" - "ldr r9, [%[b], #88]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[31] * B[21]\n\t" - "ldr r8, [%[a], #124]\n\t" - "ldr r9, [%[b], #84]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[32] * B[20]\n\t" - "ldr r8, [%[a], #128]\n\t" - "ldr r9, [%[b], #80]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[33] * B[19]\n\t" - "ldr r8, [%[a], #132]\n\t" - "ldr r9, [%[b], #76]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[34] * B[18]\n\t" - "ldr r8, [%[a], #136]\n\t" - "ldr r9, [%[b], #72]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[35] * B[17]\n\t" - "ldr r8, [%[a], #140]\n\t" - "ldr r9, [%[b], #68]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[36] * B[16]\n\t" - "ldr r8, [%[a], #144]\n\t" - "ldr r9, [%[b], #64]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[37] * B[15]\n\t" - "ldr r8, [%[a], #148]\n\t" - "ldr r9, [%[b], #60]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[38] * B[14]\n\t" - "ldr r8, [%[a], #152]\n\t" - "ldr r9, [%[b], #56]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[39] * B[13]\n\t" - "ldr r8, [%[a], #156]\n\t" - "ldr r9, [%[b], #52]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[40] * B[12]\n\t" - "ldr r8, [%[a], #160]\n\t" - "ldr r9, [%[b], #48]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[41] * B[11]\n\t" - "ldr r8, [%[a], #164]\n\t" - "ldr r9, [%[b], #44]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[42] * B[10]\n\t" - "ldr r8, [%[a], #168]\n\t" - "ldr r9, [%[b], #40]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[43] * B[9]\n\t" - "ldr r8, [%[a], #172]\n\t" - "ldr r9, [%[b], #36]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[44] * B[8]\n\t" - "ldr r8, [%[a], #176]\n\t" - "ldr r9, [%[b], #32]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[45] * B[7]\n\t" - "ldr r8, [%[a], #180]\n\t" - "ldr r9, [%[b], #28]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[46] * B[6]\n\t" - "ldr r8, [%[a], #184]\n\t" - "ldr r9, [%[b], #24]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[47] * B[5]\n\t" - "ldr r8, [%[a], #188]\n\t" - "ldr r9, [%[b], #20]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[48] * B[4]\n\t" - "ldr r8, [%[a], #192]\n\t" - "ldr r9, [%[b], #16]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[49] * B[3]\n\t" - "ldr r8, [%[a], #196]\n\t" - "ldr r9, [%[b], #12]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[50] * B[2]\n\t" - "ldr r8, [%[a], #200]\n\t" - "ldr r9, [%[b], #8]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[51] * B[1]\n\t" - "ldr r8, [%[a], #204]\n\t" - "ldr r9, [%[b], #4]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[52] * B[0]\n\t" - "ldr r8, [%[a], #208]\n\t" - "ldr r9, [%[b], #0]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "str r4, [sp, #208]\n\t" - "# A[0] * B[53]\n\t" - "ldr r8, [%[a], #0]\n\t" - "ldr r9, [%[b], #212]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r10, r10\n\t" - "# A[1] * B[52]\n\t" - "ldr r8, [%[a], #4]\n\t" - "ldr r9, [%[b], #208]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[2] * B[51]\n\t" - "ldr r8, [%[a], #8]\n\t" - "ldr r9, [%[b], #204]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[3] * B[50]\n\t" - "ldr r8, [%[a], #12]\n\t" - "ldr r9, [%[b], #200]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[4] * B[49]\n\t" - "ldr r8, [%[a], #16]\n\t" - "ldr r9, [%[b], #196]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[5] * B[48]\n\t" - "ldr r8, [%[a], #20]\n\t" - "ldr r9, [%[b], #192]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[6] * B[47]\n\t" - "ldr r8, [%[a], #24]\n\t" - "ldr r9, [%[b], #188]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[7] * B[46]\n\t" - "ldr r8, [%[a], #28]\n\t" - "ldr r9, [%[b], #184]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[8] * B[45]\n\t" - "ldr r8, [%[a], #32]\n\t" - "ldr r9, [%[b], #180]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[9] * B[44]\n\t" - "ldr r8, [%[a], #36]\n\t" - "ldr r9, [%[b], #176]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[10] * B[43]\n\t" - "ldr r8, [%[a], #40]\n\t" - "ldr r9, [%[b], #172]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[11] * B[42]\n\t" - "ldr r8, [%[a], #44]\n\t" - "ldr r9, [%[b], #168]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[12] * B[41]\n\t" - "ldr r8, [%[a], #48]\n\t" - "ldr r9, [%[b], #164]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[13] * B[40]\n\t" - "ldr r8, [%[a], #52]\n\t" - "ldr r9, [%[b], #160]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[14] * B[39]\n\t" - "ldr r8, [%[a], #56]\n\t" - "ldr r9, [%[b], #156]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[15] * B[38]\n\t" - "ldr r8, [%[a], #60]\n\t" - "ldr r9, [%[b], #152]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[16] * B[37]\n\t" - "ldr r8, [%[a], #64]\n\t" - "ldr r9, [%[b], #148]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[17] * B[36]\n\t" - "ldr r8, [%[a], #68]\n\t" - "ldr r9, [%[b], #144]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[18] * B[35]\n\t" - "ldr r8, [%[a], #72]\n\t" - "ldr r9, [%[b], #140]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[19] * B[34]\n\t" - "ldr r8, [%[a], #76]\n\t" - "ldr r9, [%[b], #136]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[20] * B[33]\n\t" - "ldr r8, [%[a], #80]\n\t" - "ldr r9, [%[b], #132]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[21] * B[32]\n\t" - "ldr r8, [%[a], #84]\n\t" - "ldr r9, [%[b], #128]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[22] * B[31]\n\t" - "ldr r8, [%[a], #88]\n\t" - "ldr r9, [%[b], #124]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[23] * B[30]\n\t" - "ldr r8, [%[a], #92]\n\t" - "ldr r9, [%[b], #120]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[24] * B[29]\n\t" - "ldr r8, [%[a], #96]\n\t" - "ldr r9, [%[b], #116]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[25] * B[28]\n\t" - "ldr r8, [%[a], #100]\n\t" - "ldr r9, [%[b], #112]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[26] * B[27]\n\t" - "ldr r8, [%[a], #104]\n\t" - "ldr r9, [%[b], #108]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[27] * B[26]\n\t" - "ldr r8, [%[a], #108]\n\t" - "ldr r9, [%[b], #104]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[28] * B[25]\n\t" - "ldr r8, [%[a], #112]\n\t" - "ldr r9, [%[b], #100]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[29] * B[24]\n\t" - "ldr r8, [%[a], #116]\n\t" - "ldr r9, [%[b], #96]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[30] * B[23]\n\t" - "ldr r8, [%[a], #120]\n\t" - "ldr r9, [%[b], #92]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[31] * B[22]\n\t" - "ldr r8, [%[a], #124]\n\t" - "ldr r9, [%[b], #88]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[32] * B[21]\n\t" - "ldr r8, [%[a], #128]\n\t" - "ldr r9, [%[b], #84]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[33] * B[20]\n\t" - "ldr r8, [%[a], #132]\n\t" - "ldr r9, [%[b], #80]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[34] * B[19]\n\t" - "ldr r8, [%[a], #136]\n\t" - "ldr r9, [%[b], #76]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[35] * B[18]\n\t" - "ldr r8, [%[a], #140]\n\t" - "ldr r9, [%[b], #72]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[36] * B[17]\n\t" - "ldr r8, [%[a], #144]\n\t" - "ldr r9, [%[b], #68]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[37] * B[16]\n\t" - "ldr r8, [%[a], #148]\n\t" - "ldr r9, [%[b], #64]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[38] * B[15]\n\t" - "ldr r8, [%[a], #152]\n\t" - "ldr r9, [%[b], #60]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[39] * B[14]\n\t" - "ldr r8, [%[a], #156]\n\t" - "ldr r9, [%[b], #56]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[40] * B[13]\n\t" - "ldr r8, [%[a], #160]\n\t" - "ldr r9, [%[b], #52]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[41] * B[12]\n\t" - "ldr r8, [%[a], #164]\n\t" - "ldr r9, [%[b], #48]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[42] * B[11]\n\t" - "ldr r8, [%[a], #168]\n\t" - "ldr r9, [%[b], #44]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[43] * B[10]\n\t" - "ldr r8, [%[a], #172]\n\t" - "ldr r9, [%[b], #40]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[44] * B[9]\n\t" - "ldr r8, [%[a], #176]\n\t" - "ldr r9, [%[b], #36]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[45] * B[8]\n\t" - "ldr r8, [%[a], #180]\n\t" - "ldr r9, [%[b], #32]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[46] * B[7]\n\t" - "ldr r8, [%[a], #184]\n\t" - "ldr r9, [%[b], #28]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[47] * B[6]\n\t" - "ldr r8, [%[a], #188]\n\t" - "ldr r9, [%[b], #24]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[48] * B[5]\n\t" - "ldr r8, [%[a], #192]\n\t" - "ldr r9, [%[b], #20]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[49] * B[4]\n\t" - "ldr r8, [%[a], #196]\n\t" - "ldr r9, [%[b], #16]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[50] * B[3]\n\t" - "ldr r8, [%[a], #200]\n\t" - "ldr r9, [%[b], #12]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[51] * B[2]\n\t" - "ldr r8, [%[a], #204]\n\t" - "ldr r9, [%[b], #8]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[52] * B[1]\n\t" - "ldr r8, [%[a], #208]\n\t" - "ldr r9, [%[b], #4]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[53] * B[0]\n\t" - "ldr r8, [%[a], #212]\n\t" - "ldr r9, [%[b], #0]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "str r5, [sp, #212]\n\t" - "# A[0] * B[54]\n\t" - "ldr r8, [%[a], #0]\n\t" - "ldr r9, [%[b], #216]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r10, r10\n\t" - "# A[1] * B[53]\n\t" - "ldr r8, [%[a], #4]\n\t" - "ldr r9, [%[b], #212]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[2] * B[52]\n\t" - "ldr r8, [%[a], #8]\n\t" - "ldr r9, [%[b], #208]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[3] * B[51]\n\t" - "ldr r8, [%[a], #12]\n\t" - "ldr r9, [%[b], #204]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[4] * B[50]\n\t" - "ldr r8, [%[a], #16]\n\t" - "ldr r9, [%[b], #200]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[5] * B[49]\n\t" - "ldr r8, [%[a], #20]\n\t" - "ldr r9, [%[b], #196]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[6] * B[48]\n\t" - "ldr r8, [%[a], #24]\n\t" - "ldr r9, [%[b], #192]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[7] * B[47]\n\t" - "ldr r8, [%[a], #28]\n\t" - "ldr r9, [%[b], #188]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[8] * B[46]\n\t" - "ldr r8, [%[a], #32]\n\t" - "ldr r9, [%[b], #184]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[9] * B[45]\n\t" - "ldr r8, [%[a], #36]\n\t" - "ldr r9, [%[b], #180]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[10] * B[44]\n\t" - "ldr r8, [%[a], #40]\n\t" - "ldr r9, [%[b], #176]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[11] * B[43]\n\t" - "ldr r8, [%[a], #44]\n\t" - "ldr r9, [%[b], #172]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[12] * B[42]\n\t" - "ldr r8, [%[a], #48]\n\t" - "ldr r9, [%[b], #168]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[13] * B[41]\n\t" - "ldr r8, [%[a], #52]\n\t" - "ldr r9, [%[b], #164]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[14] * B[40]\n\t" - "ldr r8, [%[a], #56]\n\t" - "ldr r9, [%[b], #160]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[15] * B[39]\n\t" - "ldr r8, [%[a], #60]\n\t" - "ldr r9, [%[b], #156]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[16] * B[38]\n\t" - "ldr r8, [%[a], #64]\n\t" - "ldr r9, [%[b], #152]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[17] * B[37]\n\t" - "ldr r8, [%[a], #68]\n\t" - "ldr r9, [%[b], #148]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[18] * B[36]\n\t" - "ldr r8, [%[a], #72]\n\t" - "ldr r9, [%[b], #144]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[19] * B[35]\n\t" - "ldr r8, [%[a], #76]\n\t" - "ldr r9, [%[b], #140]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[20] * B[34]\n\t" - "ldr r8, [%[a], #80]\n\t" - "ldr r9, [%[b], #136]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[21] * B[33]\n\t" - "ldr r8, [%[a], #84]\n\t" - "ldr r9, [%[b], #132]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[22] * B[32]\n\t" - "ldr r8, [%[a], #88]\n\t" - "ldr r9, [%[b], #128]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[23] * B[31]\n\t" - "ldr r8, [%[a], #92]\n\t" - "ldr r9, [%[b], #124]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[24] * B[30]\n\t" - "ldr r8, [%[a], #96]\n\t" - "ldr r9, [%[b], #120]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[25] * B[29]\n\t" - "ldr r8, [%[a], #100]\n\t" - "ldr r9, [%[b], #116]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[26] * B[28]\n\t" - "ldr r8, [%[a], #104]\n\t" - "ldr r9, [%[b], #112]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[27] * B[27]\n\t" - "ldr r8, [%[a], #108]\n\t" - "ldr r9, [%[b], #108]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[28] * B[26]\n\t" - "ldr r8, [%[a], #112]\n\t" - "ldr r9, [%[b], #104]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[29] * B[25]\n\t" - "ldr r8, [%[a], #116]\n\t" - "ldr r9, [%[b], #100]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[30] * B[24]\n\t" - "ldr r8, [%[a], #120]\n\t" - "ldr r9, [%[b], #96]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[31] * B[23]\n\t" - "ldr r8, [%[a], #124]\n\t" - "ldr r9, [%[b], #92]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[32] * B[22]\n\t" - "ldr r8, [%[a], #128]\n\t" - "ldr r9, [%[b], #88]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[33] * B[21]\n\t" - "ldr r8, [%[a], #132]\n\t" - "ldr r9, [%[b], #84]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[34] * B[20]\n\t" - "ldr r8, [%[a], #136]\n\t" - "ldr r9, [%[b], #80]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[35] * B[19]\n\t" - "ldr r8, [%[a], #140]\n\t" - "ldr r9, [%[b], #76]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[36] * B[18]\n\t" - "ldr r8, [%[a], #144]\n\t" - "ldr r9, [%[b], #72]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[37] * B[17]\n\t" - "ldr r8, [%[a], #148]\n\t" - "ldr r9, [%[b], #68]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[38] * B[16]\n\t" - "ldr r8, [%[a], #152]\n\t" - "ldr r9, [%[b], #64]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[39] * B[15]\n\t" - "ldr r8, [%[a], #156]\n\t" - "ldr r9, [%[b], #60]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[40] * B[14]\n\t" - "ldr r8, [%[a], #160]\n\t" - "ldr r9, [%[b], #56]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[41] * B[13]\n\t" - "ldr r8, [%[a], #164]\n\t" - "ldr r9, [%[b], #52]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[42] * B[12]\n\t" - "ldr r8, [%[a], #168]\n\t" - "ldr r9, [%[b], #48]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[43] * B[11]\n\t" - "ldr r8, [%[a], #172]\n\t" - "ldr r9, [%[b], #44]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[44] * B[10]\n\t" - "ldr r8, [%[a], #176]\n\t" - "ldr r9, [%[b], #40]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[45] * B[9]\n\t" - "ldr r8, [%[a], #180]\n\t" - "ldr r9, [%[b], #36]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[46] * B[8]\n\t" - "ldr r8, [%[a], #184]\n\t" - "ldr r9, [%[b], #32]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[47] * B[7]\n\t" - "ldr r8, [%[a], #188]\n\t" - "ldr r9, [%[b], #28]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[48] * B[6]\n\t" - "ldr r8, [%[a], #192]\n\t" - "ldr r9, [%[b], #24]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[49] * B[5]\n\t" - "ldr r8, [%[a], #196]\n\t" - "ldr r9, [%[b], #20]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[50] * B[4]\n\t" - "ldr r8, [%[a], #200]\n\t" - "ldr r9, [%[b], #16]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[51] * B[3]\n\t" - "ldr r8, [%[a], #204]\n\t" - "ldr r9, [%[b], #12]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[52] * B[2]\n\t" - "ldr r8, [%[a], #208]\n\t" - "ldr r9, [%[b], #8]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[53] * B[1]\n\t" - "ldr r8, [%[a], #212]\n\t" - "ldr r9, [%[b], #4]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[54] * B[0]\n\t" - "ldr r8, [%[a], #216]\n\t" - "ldr r9, [%[b], #0]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "str r3, [sp, #216]\n\t" - "# A[0] * B[55]\n\t" - "ldr r8, [%[a], #0]\n\t" - "ldr r9, [%[b], #220]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r10, r10\n\t" - "# A[1] * B[54]\n\t" - "ldr r8, [%[a], #4]\n\t" - "ldr r9, [%[b], #216]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[2] * B[53]\n\t" - "ldr r8, [%[a], #8]\n\t" - "ldr r9, [%[b], #212]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[3] * B[52]\n\t" - "ldr r8, [%[a], #12]\n\t" - "ldr r9, [%[b], #208]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[4] * B[51]\n\t" - "ldr r8, [%[a], #16]\n\t" - "ldr r9, [%[b], #204]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[5] * B[50]\n\t" - "ldr r8, [%[a], #20]\n\t" - "ldr r9, [%[b], #200]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[6] * B[49]\n\t" - "ldr r8, [%[a], #24]\n\t" - "ldr r9, [%[b], #196]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[7] * B[48]\n\t" - "ldr r8, [%[a], #28]\n\t" - "ldr r9, [%[b], #192]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[8] * B[47]\n\t" - "ldr r8, [%[a], #32]\n\t" - "ldr r9, [%[b], #188]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[9] * B[46]\n\t" - "ldr r8, [%[a], #36]\n\t" - "ldr r9, [%[b], #184]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[10] * B[45]\n\t" - "ldr r8, [%[a], #40]\n\t" - "ldr r9, [%[b], #180]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[11] * B[44]\n\t" - "ldr r8, [%[a], #44]\n\t" - "ldr r9, [%[b], #176]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[12] * B[43]\n\t" - "ldr r8, [%[a], #48]\n\t" - "ldr r9, [%[b], #172]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[13] * B[42]\n\t" - "ldr r8, [%[a], #52]\n\t" - "ldr r9, [%[b], #168]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[14] * B[41]\n\t" - "ldr r8, [%[a], #56]\n\t" - "ldr r9, [%[b], #164]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[15] * B[40]\n\t" - "ldr r8, [%[a], #60]\n\t" - "ldr r9, [%[b], #160]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[16] * B[39]\n\t" - "ldr r8, [%[a], #64]\n\t" - "ldr r9, [%[b], #156]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[17] * B[38]\n\t" - "ldr r8, [%[a], #68]\n\t" - "ldr r9, [%[b], #152]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[18] * B[37]\n\t" - "ldr r8, [%[a], #72]\n\t" - "ldr r9, [%[b], #148]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[19] * B[36]\n\t" - "ldr r8, [%[a], #76]\n\t" - "ldr r9, [%[b], #144]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[20] * B[35]\n\t" - "ldr r8, [%[a], #80]\n\t" - "ldr r9, [%[b], #140]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[21] * B[34]\n\t" - "ldr r8, [%[a], #84]\n\t" - "ldr r9, [%[b], #136]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[22] * B[33]\n\t" - "ldr r8, [%[a], #88]\n\t" - "ldr r9, [%[b], #132]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[23] * B[32]\n\t" - "ldr r8, [%[a], #92]\n\t" - "ldr r9, [%[b], #128]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[24] * B[31]\n\t" - "ldr r8, [%[a], #96]\n\t" - "ldr r9, [%[b], #124]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[25] * B[30]\n\t" - "ldr r8, [%[a], #100]\n\t" - "ldr r9, [%[b], #120]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[26] * B[29]\n\t" - "ldr r8, [%[a], #104]\n\t" - "ldr r9, [%[b], #116]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[27] * B[28]\n\t" - "ldr r8, [%[a], #108]\n\t" - "ldr r9, [%[b], #112]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[28] * B[27]\n\t" - "ldr r8, [%[a], #112]\n\t" - "ldr r9, [%[b], #108]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[29] * B[26]\n\t" - "ldr r8, [%[a], #116]\n\t" - "ldr r9, [%[b], #104]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[30] * B[25]\n\t" - "ldr r8, [%[a], #120]\n\t" - "ldr r9, [%[b], #100]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[31] * B[24]\n\t" - "ldr r8, [%[a], #124]\n\t" - "ldr r9, [%[b], #96]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[32] * B[23]\n\t" - "ldr r8, [%[a], #128]\n\t" - "ldr r9, [%[b], #92]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[33] * B[22]\n\t" - "ldr r8, [%[a], #132]\n\t" - "ldr r9, [%[b], #88]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[34] * B[21]\n\t" - "ldr r8, [%[a], #136]\n\t" - "ldr r9, [%[b], #84]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[35] * B[20]\n\t" - "ldr r8, [%[a], #140]\n\t" - "ldr r9, [%[b], #80]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[36] * B[19]\n\t" - "ldr r8, [%[a], #144]\n\t" - "ldr r9, [%[b], #76]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[37] * B[18]\n\t" - "ldr r8, [%[a], #148]\n\t" - "ldr r9, [%[b], #72]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[38] * B[17]\n\t" - "ldr r8, [%[a], #152]\n\t" - "ldr r9, [%[b], #68]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[39] * B[16]\n\t" - "ldr r8, [%[a], #156]\n\t" - "ldr r9, [%[b], #64]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[40] * B[15]\n\t" - "ldr r8, [%[a], #160]\n\t" - "ldr r9, [%[b], #60]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[41] * B[14]\n\t" - "ldr r8, [%[a], #164]\n\t" - "ldr r9, [%[b], #56]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[42] * B[13]\n\t" - "ldr r8, [%[a], #168]\n\t" - "ldr r9, [%[b], #52]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[43] * B[12]\n\t" - "ldr r8, [%[a], #172]\n\t" - "ldr r9, [%[b], #48]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[44] * B[11]\n\t" - "ldr r8, [%[a], #176]\n\t" - "ldr r9, [%[b], #44]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[45] * B[10]\n\t" - "ldr r8, [%[a], #180]\n\t" - "ldr r9, [%[b], #40]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[46] * B[9]\n\t" - "ldr r8, [%[a], #184]\n\t" - "ldr r9, [%[b], #36]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[47] * B[8]\n\t" - "ldr r8, [%[a], #188]\n\t" - "ldr r9, [%[b], #32]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[48] * B[7]\n\t" - "ldr r8, [%[a], #192]\n\t" - "ldr r9, [%[b], #28]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[49] * B[6]\n\t" - "ldr r8, [%[a], #196]\n\t" - "ldr r9, [%[b], #24]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[50] * B[5]\n\t" - "ldr r8, [%[a], #200]\n\t" - "ldr r9, [%[b], #20]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[51] * B[4]\n\t" - "ldr r8, [%[a], #204]\n\t" - "ldr r9, [%[b], #16]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[52] * B[3]\n\t" - "ldr r8, [%[a], #208]\n\t" - "ldr r9, [%[b], #12]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[53] * B[2]\n\t" - "ldr r8, [%[a], #212]\n\t" - "ldr r9, [%[b], #8]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[54] * B[1]\n\t" - "ldr r8, [%[a], #216]\n\t" - "ldr r9, [%[b], #4]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[55] * B[0]\n\t" - "ldr r8, [%[a], #220]\n\t" - "ldr r9, [%[b], #0]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "str r4, [sp, #220]\n\t" - "# A[0] * B[56]\n\t" - "ldr r8, [%[a], #0]\n\t" - "ldr r9, [%[b], #224]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r10, r10\n\t" - "# A[1] * B[55]\n\t" - "ldr r8, [%[a], #4]\n\t" - "ldr r9, [%[b], #220]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[2] * B[54]\n\t" - "ldr r8, [%[a], #8]\n\t" - "ldr r9, [%[b], #216]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[3] * B[53]\n\t" - "ldr r8, [%[a], #12]\n\t" - "ldr r9, [%[b], #212]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[4] * B[52]\n\t" - "ldr r8, [%[a], #16]\n\t" - "ldr r9, [%[b], #208]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[5] * B[51]\n\t" - "ldr r8, [%[a], #20]\n\t" - "ldr r9, [%[b], #204]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[6] * B[50]\n\t" - "ldr r8, [%[a], #24]\n\t" - "ldr r9, [%[b], #200]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[7] * B[49]\n\t" - "ldr r8, [%[a], #28]\n\t" - "ldr r9, [%[b], #196]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[8] * B[48]\n\t" - "ldr r8, [%[a], #32]\n\t" - "ldr r9, [%[b], #192]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[9] * B[47]\n\t" - "ldr r8, [%[a], #36]\n\t" - "ldr r9, [%[b], #188]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[10] * B[46]\n\t" - "ldr r8, [%[a], #40]\n\t" - "ldr r9, [%[b], #184]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[11] * B[45]\n\t" - "ldr r8, [%[a], #44]\n\t" - "ldr r9, [%[b], #180]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[12] * B[44]\n\t" - "ldr r8, [%[a], #48]\n\t" - "ldr r9, [%[b], #176]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[13] * B[43]\n\t" - "ldr r8, [%[a], #52]\n\t" - "ldr r9, [%[b], #172]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[14] * B[42]\n\t" - "ldr r8, [%[a], #56]\n\t" - "ldr r9, [%[b], #168]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[15] * B[41]\n\t" - "ldr r8, [%[a], #60]\n\t" - "ldr r9, [%[b], #164]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[16] * B[40]\n\t" - "ldr r8, [%[a], #64]\n\t" - "ldr r9, [%[b], #160]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[17] * B[39]\n\t" - "ldr r8, [%[a], #68]\n\t" - "ldr r9, [%[b], #156]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[18] * B[38]\n\t" - "ldr r8, [%[a], #72]\n\t" - "ldr r9, [%[b], #152]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[19] * B[37]\n\t" - "ldr r8, [%[a], #76]\n\t" - "ldr r9, [%[b], #148]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[20] * B[36]\n\t" - "ldr r8, [%[a], #80]\n\t" - "ldr r9, [%[b], #144]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[21] * B[35]\n\t" - "ldr r8, [%[a], #84]\n\t" - "ldr r9, [%[b], #140]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[22] * B[34]\n\t" - "ldr r8, [%[a], #88]\n\t" - "ldr r9, [%[b], #136]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[23] * B[33]\n\t" - "ldr r8, [%[a], #92]\n\t" - "ldr r9, [%[b], #132]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[24] * B[32]\n\t" - "ldr r8, [%[a], #96]\n\t" - "ldr r9, [%[b], #128]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[25] * B[31]\n\t" - "ldr r8, [%[a], #100]\n\t" - "ldr r9, [%[b], #124]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[26] * B[30]\n\t" - "ldr r8, [%[a], #104]\n\t" - "ldr r9, [%[b], #120]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[27] * B[29]\n\t" - "ldr r8, [%[a], #108]\n\t" - "ldr r9, [%[b], #116]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[28] * B[28]\n\t" - "ldr r8, [%[a], #112]\n\t" - "ldr r9, [%[b], #112]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[29] * B[27]\n\t" - "ldr r8, [%[a], #116]\n\t" - "ldr r9, [%[b], #108]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[30] * B[26]\n\t" - "ldr r8, [%[a], #120]\n\t" - "ldr r9, [%[b], #104]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[31] * B[25]\n\t" - "ldr r8, [%[a], #124]\n\t" - "ldr r9, [%[b], #100]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[32] * B[24]\n\t" - "ldr r8, [%[a], #128]\n\t" - "ldr r9, [%[b], #96]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[33] * B[23]\n\t" - "ldr r8, [%[a], #132]\n\t" - "ldr r9, [%[b], #92]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[34] * B[22]\n\t" - "ldr r8, [%[a], #136]\n\t" - "ldr r9, [%[b], #88]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[35] * B[21]\n\t" - "ldr r8, [%[a], #140]\n\t" - "ldr r9, [%[b], #84]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[36] * B[20]\n\t" - "ldr r8, [%[a], #144]\n\t" - "ldr r9, [%[b], #80]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[37] * B[19]\n\t" - "ldr r8, [%[a], #148]\n\t" - "ldr r9, [%[b], #76]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[38] * B[18]\n\t" - "ldr r8, [%[a], #152]\n\t" - "ldr r9, [%[b], #72]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[39] * B[17]\n\t" - "ldr r8, [%[a], #156]\n\t" - "ldr r9, [%[b], #68]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[40] * B[16]\n\t" - "ldr r8, [%[a], #160]\n\t" - "ldr r9, [%[b], #64]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[41] * B[15]\n\t" - "ldr r8, [%[a], #164]\n\t" - "ldr r9, [%[b], #60]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[42] * B[14]\n\t" - "ldr r8, [%[a], #168]\n\t" - "ldr r9, [%[b], #56]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[43] * B[13]\n\t" - "ldr r8, [%[a], #172]\n\t" - "ldr r9, [%[b], #52]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[44] * B[12]\n\t" - "ldr r8, [%[a], #176]\n\t" - "ldr r9, [%[b], #48]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[45] * B[11]\n\t" - "ldr r8, [%[a], #180]\n\t" - "ldr r9, [%[b], #44]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[46] * B[10]\n\t" - "ldr r8, [%[a], #184]\n\t" - "ldr r9, [%[b], #40]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[47] * B[9]\n\t" - "ldr r8, [%[a], #188]\n\t" - "ldr r9, [%[b], #36]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[48] * B[8]\n\t" - "ldr r8, [%[a], #192]\n\t" - "ldr r9, [%[b], #32]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[49] * B[7]\n\t" - "ldr r8, [%[a], #196]\n\t" - "ldr r9, [%[b], #28]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[50] * B[6]\n\t" - "ldr r8, [%[a], #200]\n\t" - "ldr r9, [%[b], #24]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[51] * B[5]\n\t" - "ldr r8, [%[a], #204]\n\t" - "ldr r9, [%[b], #20]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[52] * B[4]\n\t" - "ldr r8, [%[a], #208]\n\t" - "ldr r9, [%[b], #16]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[53] * B[3]\n\t" - "ldr r8, [%[a], #212]\n\t" - "ldr r9, [%[b], #12]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[54] * B[2]\n\t" - "ldr r8, [%[a], #216]\n\t" - "ldr r9, [%[b], #8]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[55] * B[1]\n\t" - "ldr r8, [%[a], #220]\n\t" - "ldr r9, [%[b], #4]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[56] * B[0]\n\t" - "ldr r8, [%[a], #224]\n\t" - "ldr r9, [%[b], #0]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "str r5, [sp, #224]\n\t" - "# A[0] * B[57]\n\t" - "ldr r8, [%[a], #0]\n\t" - "ldr r9, [%[b], #228]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r10, r10\n\t" - "# A[1] * B[56]\n\t" - "ldr r8, [%[a], #4]\n\t" - "ldr r9, [%[b], #224]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[2] * B[55]\n\t" - "ldr r8, [%[a], #8]\n\t" - "ldr r9, [%[b], #220]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[3] * B[54]\n\t" - "ldr r8, [%[a], #12]\n\t" - "ldr r9, [%[b], #216]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[4] * B[53]\n\t" - "ldr r8, [%[a], #16]\n\t" - "ldr r9, [%[b], #212]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[5] * B[52]\n\t" - "ldr r8, [%[a], #20]\n\t" - "ldr r9, [%[b], #208]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[6] * B[51]\n\t" - "ldr r8, [%[a], #24]\n\t" - "ldr r9, [%[b], #204]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[7] * B[50]\n\t" - "ldr r8, [%[a], #28]\n\t" - "ldr r9, [%[b], #200]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[8] * B[49]\n\t" - "ldr r8, [%[a], #32]\n\t" - "ldr r9, [%[b], #196]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[9] * B[48]\n\t" - "ldr r8, [%[a], #36]\n\t" - "ldr r9, [%[b], #192]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[10] * B[47]\n\t" - "ldr r8, [%[a], #40]\n\t" - "ldr r9, [%[b], #188]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[11] * B[46]\n\t" - "ldr r8, [%[a], #44]\n\t" - "ldr r9, [%[b], #184]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[12] * B[45]\n\t" - "ldr r8, [%[a], #48]\n\t" - "ldr r9, [%[b], #180]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[13] * B[44]\n\t" - "ldr r8, [%[a], #52]\n\t" - "ldr r9, [%[b], #176]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[14] * B[43]\n\t" - "ldr r8, [%[a], #56]\n\t" - "ldr r9, [%[b], #172]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[15] * B[42]\n\t" - "ldr r8, [%[a], #60]\n\t" - "ldr r9, [%[b], #168]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[16] * B[41]\n\t" - "ldr r8, [%[a], #64]\n\t" - "ldr r9, [%[b], #164]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[17] * B[40]\n\t" - "ldr r8, [%[a], #68]\n\t" - "ldr r9, [%[b], #160]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[18] * B[39]\n\t" - "ldr r8, [%[a], #72]\n\t" - "ldr r9, [%[b], #156]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[19] * B[38]\n\t" - "ldr r8, [%[a], #76]\n\t" - "ldr r9, [%[b], #152]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[20] * B[37]\n\t" - "ldr r8, [%[a], #80]\n\t" - "ldr r9, [%[b], #148]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[21] * B[36]\n\t" - "ldr r8, [%[a], #84]\n\t" - "ldr r9, [%[b], #144]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[22] * B[35]\n\t" - "ldr r8, [%[a], #88]\n\t" - "ldr r9, [%[b], #140]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[23] * B[34]\n\t" - "ldr r8, [%[a], #92]\n\t" - "ldr r9, [%[b], #136]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[24] * B[33]\n\t" - "ldr r8, [%[a], #96]\n\t" - "ldr r9, [%[b], #132]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[25] * B[32]\n\t" - "ldr r8, [%[a], #100]\n\t" - "ldr r9, [%[b], #128]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[26] * B[31]\n\t" - "ldr r8, [%[a], #104]\n\t" - "ldr r9, [%[b], #124]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[27] * B[30]\n\t" - "ldr r8, [%[a], #108]\n\t" - "ldr r9, [%[b], #120]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[28] * B[29]\n\t" - "ldr r8, [%[a], #112]\n\t" - "ldr r9, [%[b], #116]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[29] * B[28]\n\t" - "ldr r8, [%[a], #116]\n\t" - "ldr r9, [%[b], #112]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[30] * B[27]\n\t" - "ldr r8, [%[a], #120]\n\t" - "ldr r9, [%[b], #108]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[31] * B[26]\n\t" - "ldr r8, [%[a], #124]\n\t" - "ldr r9, [%[b], #104]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[32] * B[25]\n\t" - "ldr r8, [%[a], #128]\n\t" - "ldr r9, [%[b], #100]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[33] * B[24]\n\t" - "ldr r8, [%[a], #132]\n\t" - "ldr r9, [%[b], #96]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[34] * B[23]\n\t" - "ldr r8, [%[a], #136]\n\t" - "ldr r9, [%[b], #92]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[35] * B[22]\n\t" - "ldr r8, [%[a], #140]\n\t" - "ldr r9, [%[b], #88]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[36] * B[21]\n\t" - "ldr r8, [%[a], #144]\n\t" - "ldr r9, [%[b], #84]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[37] * B[20]\n\t" - "ldr r8, [%[a], #148]\n\t" - "ldr r9, [%[b], #80]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[38] * B[19]\n\t" - "ldr r8, [%[a], #152]\n\t" - "ldr r9, [%[b], #76]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[39] * B[18]\n\t" - "ldr r8, [%[a], #156]\n\t" - "ldr r9, [%[b], #72]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[40] * B[17]\n\t" - "ldr r8, [%[a], #160]\n\t" - "ldr r9, [%[b], #68]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[41] * B[16]\n\t" - "ldr r8, [%[a], #164]\n\t" - "ldr r9, [%[b], #64]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[42] * B[15]\n\t" - "ldr r8, [%[a], #168]\n\t" - "ldr r9, [%[b], #60]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[43] * B[14]\n\t" - "ldr r8, [%[a], #172]\n\t" - "ldr r9, [%[b], #56]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[44] * B[13]\n\t" - "ldr r8, [%[a], #176]\n\t" - "ldr r9, [%[b], #52]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[45] * B[12]\n\t" - "ldr r8, [%[a], #180]\n\t" - "ldr r9, [%[b], #48]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[46] * B[11]\n\t" - "ldr r8, [%[a], #184]\n\t" - "ldr r9, [%[b], #44]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[47] * B[10]\n\t" - "ldr r8, [%[a], #188]\n\t" - "ldr r9, [%[b], #40]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[48] * B[9]\n\t" - "ldr r8, [%[a], #192]\n\t" - "ldr r9, [%[b], #36]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[49] * B[8]\n\t" - "ldr r8, [%[a], #196]\n\t" - "ldr r9, [%[b], #32]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[50] * B[7]\n\t" - "ldr r8, [%[a], #200]\n\t" - "ldr r9, [%[b], #28]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[51] * B[6]\n\t" - "ldr r8, [%[a], #204]\n\t" - "ldr r9, [%[b], #24]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[52] * B[5]\n\t" - "ldr r8, [%[a], #208]\n\t" - "ldr r9, [%[b], #20]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[53] * B[4]\n\t" - "ldr r8, [%[a], #212]\n\t" - "ldr r9, [%[b], #16]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[54] * B[3]\n\t" - "ldr r8, [%[a], #216]\n\t" - "ldr r9, [%[b], #12]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[55] * B[2]\n\t" - "ldr r8, [%[a], #220]\n\t" - "ldr r9, [%[b], #8]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[56] * B[1]\n\t" - "ldr r8, [%[a], #224]\n\t" - "ldr r9, [%[b], #4]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[57] * B[0]\n\t" - "ldr r8, [%[a], #228]\n\t" - "ldr r9, [%[b], #0]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "str r3, [sp, #228]\n\t" - "# A[0] * B[58]\n\t" - "ldr r8, [%[a], #0]\n\t" - "ldr r9, [%[b], #232]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r10, r10\n\t" - "# A[1] * B[57]\n\t" - "ldr r8, [%[a], #4]\n\t" - "ldr r9, [%[b], #228]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[2] * B[56]\n\t" - "ldr r8, [%[a], #8]\n\t" - "ldr r9, [%[b], #224]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[3] * B[55]\n\t" - "ldr r8, [%[a], #12]\n\t" - "ldr r9, [%[b], #220]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[4] * B[54]\n\t" - "ldr r8, [%[a], #16]\n\t" - "ldr r9, [%[b], #216]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[5] * B[53]\n\t" - "ldr r8, [%[a], #20]\n\t" - "ldr r9, [%[b], #212]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[6] * B[52]\n\t" - "ldr r8, [%[a], #24]\n\t" - "ldr r9, [%[b], #208]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[7] * B[51]\n\t" - "ldr r8, [%[a], #28]\n\t" - "ldr r9, [%[b], #204]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[8] * B[50]\n\t" - "ldr r8, [%[a], #32]\n\t" - "ldr r9, [%[b], #200]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[9] * B[49]\n\t" - "ldr r8, [%[a], #36]\n\t" - "ldr r9, [%[b], #196]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[10] * B[48]\n\t" - "ldr r8, [%[a], #40]\n\t" - "ldr r9, [%[b], #192]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[11] * B[47]\n\t" - "ldr r8, [%[a], #44]\n\t" - "ldr r9, [%[b], #188]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[12] * B[46]\n\t" - "ldr r8, [%[a], #48]\n\t" - "ldr r9, [%[b], #184]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[13] * B[45]\n\t" - "ldr r8, [%[a], #52]\n\t" - "ldr r9, [%[b], #180]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[14] * B[44]\n\t" - "ldr r8, [%[a], #56]\n\t" - "ldr r9, [%[b], #176]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[15] * B[43]\n\t" - "ldr r8, [%[a], #60]\n\t" - "ldr r9, [%[b], #172]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[16] * B[42]\n\t" - "ldr r8, [%[a], #64]\n\t" - "ldr r9, [%[b], #168]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[17] * B[41]\n\t" - "ldr r8, [%[a], #68]\n\t" - "ldr r9, [%[b], #164]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[18] * B[40]\n\t" - "ldr r8, [%[a], #72]\n\t" - "ldr r9, [%[b], #160]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[19] * B[39]\n\t" - "ldr r8, [%[a], #76]\n\t" - "ldr r9, [%[b], #156]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[20] * B[38]\n\t" - "ldr r8, [%[a], #80]\n\t" - "ldr r9, [%[b], #152]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[21] * B[37]\n\t" - "ldr r8, [%[a], #84]\n\t" - "ldr r9, [%[b], #148]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[22] * B[36]\n\t" - "ldr r8, [%[a], #88]\n\t" - "ldr r9, [%[b], #144]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[23] * B[35]\n\t" - "ldr r8, [%[a], #92]\n\t" - "ldr r9, [%[b], #140]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[24] * B[34]\n\t" - "ldr r8, [%[a], #96]\n\t" - "ldr r9, [%[b], #136]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[25] * B[33]\n\t" - "ldr r8, [%[a], #100]\n\t" - "ldr r9, [%[b], #132]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[26] * B[32]\n\t" - "ldr r8, [%[a], #104]\n\t" - "ldr r9, [%[b], #128]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[27] * B[31]\n\t" - "ldr r8, [%[a], #108]\n\t" - "ldr r9, [%[b], #124]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[28] * B[30]\n\t" - "ldr r8, [%[a], #112]\n\t" - "ldr r9, [%[b], #120]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[29] * B[29]\n\t" - "ldr r8, [%[a], #116]\n\t" - "ldr r9, [%[b], #116]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[30] * B[28]\n\t" - "ldr r8, [%[a], #120]\n\t" - "ldr r9, [%[b], #112]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[31] * B[27]\n\t" - "ldr r8, [%[a], #124]\n\t" - "ldr r9, [%[b], #108]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[32] * B[26]\n\t" - "ldr r8, [%[a], #128]\n\t" - "ldr r9, [%[b], #104]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[33] * B[25]\n\t" - "ldr r8, [%[a], #132]\n\t" - "ldr r9, [%[b], #100]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[34] * B[24]\n\t" - "ldr r8, [%[a], #136]\n\t" - "ldr r9, [%[b], #96]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[35] * B[23]\n\t" - "ldr r8, [%[a], #140]\n\t" - "ldr r9, [%[b], #92]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[36] * B[22]\n\t" - "ldr r8, [%[a], #144]\n\t" - "ldr r9, [%[b], #88]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[37] * B[21]\n\t" - "ldr r8, [%[a], #148]\n\t" - "ldr r9, [%[b], #84]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[38] * B[20]\n\t" - "ldr r8, [%[a], #152]\n\t" - "ldr r9, [%[b], #80]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[39] * B[19]\n\t" - "ldr r8, [%[a], #156]\n\t" - "ldr r9, [%[b], #76]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[40] * B[18]\n\t" - "ldr r8, [%[a], #160]\n\t" - "ldr r9, [%[b], #72]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[41] * B[17]\n\t" - "ldr r8, [%[a], #164]\n\t" - "ldr r9, [%[b], #68]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[42] * B[16]\n\t" - "ldr r8, [%[a], #168]\n\t" - "ldr r9, [%[b], #64]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[43] * B[15]\n\t" - "ldr r8, [%[a], #172]\n\t" - "ldr r9, [%[b], #60]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[44] * B[14]\n\t" - "ldr r8, [%[a], #176]\n\t" - "ldr r9, [%[b], #56]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[45] * B[13]\n\t" - "ldr r8, [%[a], #180]\n\t" - "ldr r9, [%[b], #52]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[46] * B[12]\n\t" - "ldr r8, [%[a], #184]\n\t" - "ldr r9, [%[b], #48]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[47] * B[11]\n\t" - "ldr r8, [%[a], #188]\n\t" - "ldr r9, [%[b], #44]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[48] * B[10]\n\t" - "ldr r8, [%[a], #192]\n\t" - "ldr r9, [%[b], #40]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[49] * B[9]\n\t" - "ldr r8, [%[a], #196]\n\t" - "ldr r9, [%[b], #36]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[50] * B[8]\n\t" - "ldr r8, [%[a], #200]\n\t" - "ldr r9, [%[b], #32]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[51] * B[7]\n\t" - "ldr r8, [%[a], #204]\n\t" - "ldr r9, [%[b], #28]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[52] * B[6]\n\t" - "ldr r8, [%[a], #208]\n\t" - "ldr r9, [%[b], #24]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[53] * B[5]\n\t" - "ldr r8, [%[a], #212]\n\t" - "ldr r9, [%[b], #20]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[54] * B[4]\n\t" - "ldr r8, [%[a], #216]\n\t" - "ldr r9, [%[b], #16]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[55] * B[3]\n\t" - "ldr r8, [%[a], #220]\n\t" - "ldr r9, [%[b], #12]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[56] * B[2]\n\t" - "ldr r8, [%[a], #224]\n\t" - "ldr r9, [%[b], #8]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[57] * B[1]\n\t" - "ldr r8, [%[a], #228]\n\t" - "ldr r9, [%[b], #4]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[58] * B[0]\n\t" - "ldr r8, [%[a], #232]\n\t" - "ldr r9, [%[b], #0]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "str r4, [sp, #232]\n\t" - "# A[0] * B[59]\n\t" - "ldr r8, [%[a], #0]\n\t" - "ldr r9, [%[b], #236]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r10, r10\n\t" - "# A[1] * B[58]\n\t" - "ldr r8, [%[a], #4]\n\t" - "ldr r9, [%[b], #232]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[2] * B[57]\n\t" - "ldr r8, [%[a], #8]\n\t" - "ldr r9, [%[b], #228]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[3] * B[56]\n\t" - "ldr r8, [%[a], #12]\n\t" - "ldr r9, [%[b], #224]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[4] * B[55]\n\t" - "ldr r8, [%[a], #16]\n\t" - "ldr r9, [%[b], #220]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[5] * B[54]\n\t" - "ldr r8, [%[a], #20]\n\t" - "ldr r9, [%[b], #216]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[6] * B[53]\n\t" - "ldr r8, [%[a], #24]\n\t" - "ldr r9, [%[b], #212]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[7] * B[52]\n\t" - "ldr r8, [%[a], #28]\n\t" - "ldr r9, [%[b], #208]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[8] * B[51]\n\t" - "ldr r8, [%[a], #32]\n\t" - "ldr r9, [%[b], #204]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[9] * B[50]\n\t" - "ldr r8, [%[a], #36]\n\t" - "ldr r9, [%[b], #200]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[10] * B[49]\n\t" - "ldr r8, [%[a], #40]\n\t" - "ldr r9, [%[b], #196]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[11] * B[48]\n\t" - "ldr r8, [%[a], #44]\n\t" - "ldr r9, [%[b], #192]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[12] * B[47]\n\t" - "ldr r8, [%[a], #48]\n\t" - "ldr r9, [%[b], #188]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[13] * B[46]\n\t" - "ldr r8, [%[a], #52]\n\t" - "ldr r9, [%[b], #184]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[14] * B[45]\n\t" - "ldr r8, [%[a], #56]\n\t" - "ldr r9, [%[b], #180]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[15] * B[44]\n\t" - "ldr r8, [%[a], #60]\n\t" - "ldr r9, [%[b], #176]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[16] * B[43]\n\t" - "ldr r8, [%[a], #64]\n\t" - "ldr r9, [%[b], #172]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[17] * B[42]\n\t" - "ldr r8, [%[a], #68]\n\t" - "ldr r9, [%[b], #168]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[18] * B[41]\n\t" - "ldr r8, [%[a], #72]\n\t" - "ldr r9, [%[b], #164]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[19] * B[40]\n\t" - "ldr r8, [%[a], #76]\n\t" - "ldr r9, [%[b], #160]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[20] * B[39]\n\t" - "ldr r8, [%[a], #80]\n\t" - "ldr r9, [%[b], #156]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[21] * B[38]\n\t" - "ldr r8, [%[a], #84]\n\t" - "ldr r9, [%[b], #152]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[22] * B[37]\n\t" - "ldr r8, [%[a], #88]\n\t" - "ldr r9, [%[b], #148]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[23] * B[36]\n\t" - "ldr r8, [%[a], #92]\n\t" - "ldr r9, [%[b], #144]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[24] * B[35]\n\t" - "ldr r8, [%[a], #96]\n\t" - "ldr r9, [%[b], #140]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[25] * B[34]\n\t" - "ldr r8, [%[a], #100]\n\t" - "ldr r9, [%[b], #136]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[26] * B[33]\n\t" - "ldr r8, [%[a], #104]\n\t" - "ldr r9, [%[b], #132]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[27] * B[32]\n\t" - "ldr r8, [%[a], #108]\n\t" - "ldr r9, [%[b], #128]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[28] * B[31]\n\t" - "ldr r8, [%[a], #112]\n\t" - "ldr r9, [%[b], #124]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[29] * B[30]\n\t" - "ldr r8, [%[a], #116]\n\t" - "ldr r9, [%[b], #120]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[30] * B[29]\n\t" - "ldr r8, [%[a], #120]\n\t" - "ldr r9, [%[b], #116]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[31] * B[28]\n\t" - "ldr r8, [%[a], #124]\n\t" - "ldr r9, [%[b], #112]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[32] * B[27]\n\t" - "ldr r8, [%[a], #128]\n\t" - "ldr r9, [%[b], #108]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[33] * B[26]\n\t" - "ldr r8, [%[a], #132]\n\t" - "ldr r9, [%[b], #104]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[34] * B[25]\n\t" - "ldr r8, [%[a], #136]\n\t" - "ldr r9, [%[b], #100]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[35] * B[24]\n\t" - "ldr r8, [%[a], #140]\n\t" - "ldr r9, [%[b], #96]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[36] * B[23]\n\t" - "ldr r8, [%[a], #144]\n\t" - "ldr r9, [%[b], #92]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[37] * B[22]\n\t" - "ldr r8, [%[a], #148]\n\t" - "ldr r9, [%[b], #88]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[38] * B[21]\n\t" - "ldr r8, [%[a], #152]\n\t" - "ldr r9, [%[b], #84]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[39] * B[20]\n\t" - "ldr r8, [%[a], #156]\n\t" - "ldr r9, [%[b], #80]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[40] * B[19]\n\t" - "ldr r8, [%[a], #160]\n\t" - "ldr r9, [%[b], #76]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[41] * B[18]\n\t" - "ldr r8, [%[a], #164]\n\t" - "ldr r9, [%[b], #72]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[42] * B[17]\n\t" - "ldr r8, [%[a], #168]\n\t" - "ldr r9, [%[b], #68]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[43] * B[16]\n\t" - "ldr r8, [%[a], #172]\n\t" - "ldr r9, [%[b], #64]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[44] * B[15]\n\t" - "ldr r8, [%[a], #176]\n\t" - "ldr r9, [%[b], #60]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[45] * B[14]\n\t" - "ldr r8, [%[a], #180]\n\t" - "ldr r9, [%[b], #56]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[46] * B[13]\n\t" - "ldr r8, [%[a], #184]\n\t" - "ldr r9, [%[b], #52]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[47] * B[12]\n\t" - "ldr r8, [%[a], #188]\n\t" - "ldr r9, [%[b], #48]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[48] * B[11]\n\t" - "ldr r8, [%[a], #192]\n\t" - "ldr r9, [%[b], #44]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[49] * B[10]\n\t" - "ldr r8, [%[a], #196]\n\t" - "ldr r9, [%[b], #40]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[50] * B[9]\n\t" - "ldr r8, [%[a], #200]\n\t" - "ldr r9, [%[b], #36]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[51] * B[8]\n\t" - "ldr r8, [%[a], #204]\n\t" - "ldr r9, [%[b], #32]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[52] * B[7]\n\t" - "ldr r8, [%[a], #208]\n\t" - "ldr r9, [%[b], #28]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[53] * B[6]\n\t" - "ldr r8, [%[a], #212]\n\t" - "ldr r9, [%[b], #24]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[54] * B[5]\n\t" - "ldr r8, [%[a], #216]\n\t" - "ldr r9, [%[b], #20]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[55] * B[4]\n\t" - "ldr r8, [%[a], #220]\n\t" - "ldr r9, [%[b], #16]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[56] * B[3]\n\t" - "ldr r8, [%[a], #224]\n\t" - "ldr r9, [%[b], #12]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[57] * B[2]\n\t" - "ldr r8, [%[a], #228]\n\t" - "ldr r9, [%[b], #8]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[58] * B[1]\n\t" - "ldr r8, [%[a], #232]\n\t" - "ldr r9, [%[b], #4]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[59] * B[0]\n\t" - "ldr r8, [%[a], #236]\n\t" - "ldr r9, [%[b], #0]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "str r5, [sp, #236]\n\t" - "# A[0] * B[60]\n\t" - "ldr r8, [%[a], #0]\n\t" - "ldr r9, [%[b], #240]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r10, r10\n\t" - "# A[1] * B[59]\n\t" - "ldr r8, [%[a], #4]\n\t" - "ldr r9, [%[b], #236]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[2] * B[58]\n\t" - "ldr r8, [%[a], #8]\n\t" - "ldr r9, [%[b], #232]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[3] * B[57]\n\t" - "ldr r8, [%[a], #12]\n\t" - "ldr r9, [%[b], #228]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[4] * B[56]\n\t" - "ldr r8, [%[a], #16]\n\t" - "ldr r9, [%[b], #224]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[5] * B[55]\n\t" - "ldr r8, [%[a], #20]\n\t" - "ldr r9, [%[b], #220]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[6] * B[54]\n\t" - "ldr r8, [%[a], #24]\n\t" - "ldr r9, [%[b], #216]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[7] * B[53]\n\t" - "ldr r8, [%[a], #28]\n\t" - "ldr r9, [%[b], #212]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[8] * B[52]\n\t" - "ldr r8, [%[a], #32]\n\t" - "ldr r9, [%[b], #208]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[9] * B[51]\n\t" - "ldr r8, [%[a], #36]\n\t" - "ldr r9, [%[b], #204]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[10] * B[50]\n\t" - "ldr r8, [%[a], #40]\n\t" - "ldr r9, [%[b], #200]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[11] * B[49]\n\t" - "ldr r8, [%[a], #44]\n\t" - "ldr r9, [%[b], #196]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[12] * B[48]\n\t" - "ldr r8, [%[a], #48]\n\t" - "ldr r9, [%[b], #192]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[13] * B[47]\n\t" - "ldr r8, [%[a], #52]\n\t" - "ldr r9, [%[b], #188]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[14] * B[46]\n\t" - "ldr r8, [%[a], #56]\n\t" - "ldr r9, [%[b], #184]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[15] * B[45]\n\t" - "ldr r8, [%[a], #60]\n\t" - "ldr r9, [%[b], #180]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[16] * B[44]\n\t" - "ldr r8, [%[a], #64]\n\t" - "ldr r9, [%[b], #176]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[17] * B[43]\n\t" - "ldr r8, [%[a], #68]\n\t" - "ldr r9, [%[b], #172]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[18] * B[42]\n\t" - "ldr r8, [%[a], #72]\n\t" - "ldr r9, [%[b], #168]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[19] * B[41]\n\t" - "ldr r8, [%[a], #76]\n\t" - "ldr r9, [%[b], #164]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[20] * B[40]\n\t" - "ldr r8, [%[a], #80]\n\t" - "ldr r9, [%[b], #160]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[21] * B[39]\n\t" - "ldr r8, [%[a], #84]\n\t" - "ldr r9, [%[b], #156]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[22] * B[38]\n\t" - "ldr r8, [%[a], #88]\n\t" - "ldr r9, [%[b], #152]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[23] * B[37]\n\t" - "ldr r8, [%[a], #92]\n\t" - "ldr r9, [%[b], #148]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[24] * B[36]\n\t" - "ldr r8, [%[a], #96]\n\t" - "ldr r9, [%[b], #144]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[25] * B[35]\n\t" - "ldr r8, [%[a], #100]\n\t" - "ldr r9, [%[b], #140]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[26] * B[34]\n\t" - "ldr r8, [%[a], #104]\n\t" - "ldr r9, [%[b], #136]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[27] * B[33]\n\t" - "ldr r8, [%[a], #108]\n\t" - "ldr r9, [%[b], #132]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[28] * B[32]\n\t" - "ldr r8, [%[a], #112]\n\t" - "ldr r9, [%[b], #128]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[29] * B[31]\n\t" - "ldr r8, [%[a], #116]\n\t" - "ldr r9, [%[b], #124]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[30] * B[30]\n\t" - "ldr r8, [%[a], #120]\n\t" - "ldr r9, [%[b], #120]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[31] * B[29]\n\t" - "ldr r8, [%[a], #124]\n\t" - "ldr r9, [%[b], #116]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[32] * B[28]\n\t" - "ldr r8, [%[a], #128]\n\t" - "ldr r9, [%[b], #112]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[33] * B[27]\n\t" - "ldr r8, [%[a], #132]\n\t" - "ldr r9, [%[b], #108]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[34] * B[26]\n\t" - "ldr r8, [%[a], #136]\n\t" - "ldr r9, [%[b], #104]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[35] * B[25]\n\t" - "ldr r8, [%[a], #140]\n\t" - "ldr r9, [%[b], #100]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[36] * B[24]\n\t" - "ldr r8, [%[a], #144]\n\t" - "ldr r9, [%[b], #96]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[37] * B[23]\n\t" - "ldr r8, [%[a], #148]\n\t" - "ldr r9, [%[b], #92]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[38] * B[22]\n\t" - "ldr r8, [%[a], #152]\n\t" - "ldr r9, [%[b], #88]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[39] * B[21]\n\t" - "ldr r8, [%[a], #156]\n\t" - "ldr r9, [%[b], #84]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[40] * B[20]\n\t" - "ldr r8, [%[a], #160]\n\t" - "ldr r9, [%[b], #80]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[41] * B[19]\n\t" - "ldr r8, [%[a], #164]\n\t" - "ldr r9, [%[b], #76]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[42] * B[18]\n\t" - "ldr r8, [%[a], #168]\n\t" - "ldr r9, [%[b], #72]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[43] * B[17]\n\t" - "ldr r8, [%[a], #172]\n\t" - "ldr r9, [%[b], #68]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[44] * B[16]\n\t" - "ldr r8, [%[a], #176]\n\t" - "ldr r9, [%[b], #64]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[45] * B[15]\n\t" - "ldr r8, [%[a], #180]\n\t" - "ldr r9, [%[b], #60]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[46] * B[14]\n\t" - "ldr r8, [%[a], #184]\n\t" - "ldr r9, [%[b], #56]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[47] * B[13]\n\t" - "ldr r8, [%[a], #188]\n\t" - "ldr r9, [%[b], #52]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[48] * B[12]\n\t" - "ldr r8, [%[a], #192]\n\t" - "ldr r9, [%[b], #48]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[49] * B[11]\n\t" - "ldr r8, [%[a], #196]\n\t" - "ldr r9, [%[b], #44]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[50] * B[10]\n\t" - "ldr r8, [%[a], #200]\n\t" - "ldr r9, [%[b], #40]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[51] * B[9]\n\t" - "ldr r8, [%[a], #204]\n\t" - "ldr r9, [%[b], #36]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[52] * B[8]\n\t" - "ldr r8, [%[a], #208]\n\t" - "ldr r9, [%[b], #32]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[53] * B[7]\n\t" - "ldr r8, [%[a], #212]\n\t" - "ldr r9, [%[b], #28]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[54] * B[6]\n\t" - "ldr r8, [%[a], #216]\n\t" - "ldr r9, [%[b], #24]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[55] * B[5]\n\t" - "ldr r8, [%[a], #220]\n\t" - "ldr r9, [%[b], #20]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[56] * B[4]\n\t" - "ldr r8, [%[a], #224]\n\t" - "ldr r9, [%[b], #16]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[57] * B[3]\n\t" - "ldr r8, [%[a], #228]\n\t" - "ldr r9, [%[b], #12]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[58] * B[2]\n\t" - "ldr r8, [%[a], #232]\n\t" - "ldr r9, [%[b], #8]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[59] * B[1]\n\t" - "ldr r8, [%[a], #236]\n\t" - "ldr r9, [%[b], #4]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[60] * B[0]\n\t" - "ldr r8, [%[a], #240]\n\t" - "ldr r9, [%[b], #0]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "str r3, [sp, #240]\n\t" - "# A[0] * B[61]\n\t" - "ldr r8, [%[a], #0]\n\t" - "ldr r9, [%[b], #244]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r10, r10\n\t" - "# A[1] * B[60]\n\t" - "ldr r8, [%[a], #4]\n\t" - "ldr r9, [%[b], #240]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[2] * B[59]\n\t" - "ldr r8, [%[a], #8]\n\t" - "ldr r9, [%[b], #236]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[3] * B[58]\n\t" - "ldr r8, [%[a], #12]\n\t" - "ldr r9, [%[b], #232]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[4] * B[57]\n\t" - "ldr r8, [%[a], #16]\n\t" - "ldr r9, [%[b], #228]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[5] * B[56]\n\t" - "ldr r8, [%[a], #20]\n\t" - "ldr r9, [%[b], #224]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[6] * B[55]\n\t" - "ldr r8, [%[a], #24]\n\t" - "ldr r9, [%[b], #220]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[7] * B[54]\n\t" - "ldr r8, [%[a], #28]\n\t" - "ldr r9, [%[b], #216]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[8] * B[53]\n\t" - "ldr r8, [%[a], #32]\n\t" - "ldr r9, [%[b], #212]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[9] * B[52]\n\t" - "ldr r8, [%[a], #36]\n\t" - "ldr r9, [%[b], #208]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[10] * B[51]\n\t" - "ldr r8, [%[a], #40]\n\t" - "ldr r9, [%[b], #204]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[11] * B[50]\n\t" - "ldr r8, [%[a], #44]\n\t" - "ldr r9, [%[b], #200]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[12] * B[49]\n\t" - "ldr r8, [%[a], #48]\n\t" - "ldr r9, [%[b], #196]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[13] * B[48]\n\t" - "ldr r8, [%[a], #52]\n\t" - "ldr r9, [%[b], #192]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[14] * B[47]\n\t" - "ldr r8, [%[a], #56]\n\t" - "ldr r9, [%[b], #188]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[15] * B[46]\n\t" - "ldr r8, [%[a], #60]\n\t" - "ldr r9, [%[b], #184]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[16] * B[45]\n\t" - "ldr r8, [%[a], #64]\n\t" - "ldr r9, [%[b], #180]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[17] * B[44]\n\t" - "ldr r8, [%[a], #68]\n\t" - "ldr r9, [%[b], #176]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[18] * B[43]\n\t" - "ldr r8, [%[a], #72]\n\t" - "ldr r9, [%[b], #172]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[19] * B[42]\n\t" - "ldr r8, [%[a], #76]\n\t" - "ldr r9, [%[b], #168]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[20] * B[41]\n\t" - "ldr r8, [%[a], #80]\n\t" - "ldr r9, [%[b], #164]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[21] * B[40]\n\t" - "ldr r8, [%[a], #84]\n\t" - "ldr r9, [%[b], #160]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[22] * B[39]\n\t" - "ldr r8, [%[a], #88]\n\t" - "ldr r9, [%[b], #156]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[23] * B[38]\n\t" - "ldr r8, [%[a], #92]\n\t" - "ldr r9, [%[b], #152]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[24] * B[37]\n\t" - "ldr r8, [%[a], #96]\n\t" - "ldr r9, [%[b], #148]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[25] * B[36]\n\t" - "ldr r8, [%[a], #100]\n\t" - "ldr r9, [%[b], #144]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[26] * B[35]\n\t" - "ldr r8, [%[a], #104]\n\t" - "ldr r9, [%[b], #140]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[27] * B[34]\n\t" - "ldr r8, [%[a], #108]\n\t" - "ldr r9, [%[b], #136]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[28] * B[33]\n\t" - "ldr r8, [%[a], #112]\n\t" - "ldr r9, [%[b], #132]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[29] * B[32]\n\t" - "ldr r8, [%[a], #116]\n\t" - "ldr r9, [%[b], #128]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[30] * B[31]\n\t" - "ldr r8, [%[a], #120]\n\t" - "ldr r9, [%[b], #124]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[31] * B[30]\n\t" - "ldr r8, [%[a], #124]\n\t" - "ldr r9, [%[b], #120]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[32] * B[29]\n\t" - "ldr r8, [%[a], #128]\n\t" - "ldr r9, [%[b], #116]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[33] * B[28]\n\t" - "ldr r8, [%[a], #132]\n\t" - "ldr r9, [%[b], #112]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[34] * B[27]\n\t" - "ldr r8, [%[a], #136]\n\t" - "ldr r9, [%[b], #108]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[35] * B[26]\n\t" - "ldr r8, [%[a], #140]\n\t" - "ldr r9, [%[b], #104]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[36] * B[25]\n\t" - "ldr r8, [%[a], #144]\n\t" - "ldr r9, [%[b], #100]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[37] * B[24]\n\t" - "ldr r8, [%[a], #148]\n\t" - "ldr r9, [%[b], #96]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[38] * B[23]\n\t" - "ldr r8, [%[a], #152]\n\t" - "ldr r9, [%[b], #92]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[39] * B[22]\n\t" - "ldr r8, [%[a], #156]\n\t" - "ldr r9, [%[b], #88]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[40] * B[21]\n\t" - "ldr r8, [%[a], #160]\n\t" - "ldr r9, [%[b], #84]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[41] * B[20]\n\t" - "ldr r8, [%[a], #164]\n\t" - "ldr r9, [%[b], #80]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[42] * B[19]\n\t" - "ldr r8, [%[a], #168]\n\t" - "ldr r9, [%[b], #76]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[43] * B[18]\n\t" - "ldr r8, [%[a], #172]\n\t" - "ldr r9, [%[b], #72]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[44] * B[17]\n\t" - "ldr r8, [%[a], #176]\n\t" - "ldr r9, [%[b], #68]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[45] * B[16]\n\t" - "ldr r8, [%[a], #180]\n\t" - "ldr r9, [%[b], #64]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[46] * B[15]\n\t" - "ldr r8, [%[a], #184]\n\t" - "ldr r9, [%[b], #60]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[47] * B[14]\n\t" - "ldr r8, [%[a], #188]\n\t" - "ldr r9, [%[b], #56]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[48] * B[13]\n\t" - "ldr r8, [%[a], #192]\n\t" - "ldr r9, [%[b], #52]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[49] * B[12]\n\t" - "ldr r8, [%[a], #196]\n\t" - "ldr r9, [%[b], #48]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[50] * B[11]\n\t" - "ldr r8, [%[a], #200]\n\t" - "ldr r9, [%[b], #44]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[51] * B[10]\n\t" - "ldr r8, [%[a], #204]\n\t" - "ldr r9, [%[b], #40]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[52] * B[9]\n\t" - "ldr r8, [%[a], #208]\n\t" - "ldr r9, [%[b], #36]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[53] * B[8]\n\t" - "ldr r8, [%[a], #212]\n\t" - "ldr r9, [%[b], #32]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[54] * B[7]\n\t" - "ldr r8, [%[a], #216]\n\t" - "ldr r9, [%[b], #28]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[55] * B[6]\n\t" - "ldr r8, [%[a], #220]\n\t" - "ldr r9, [%[b], #24]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[56] * B[5]\n\t" - "ldr r8, [%[a], #224]\n\t" - "ldr r9, [%[b], #20]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[57] * B[4]\n\t" - "ldr r8, [%[a], #228]\n\t" - "ldr r9, [%[b], #16]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[58] * B[3]\n\t" - "ldr r8, [%[a], #232]\n\t" - "ldr r9, [%[b], #12]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[59] * B[2]\n\t" - "ldr r8, [%[a], #236]\n\t" - "ldr r9, [%[b], #8]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[60] * B[1]\n\t" - "ldr r8, [%[a], #240]\n\t" - "ldr r9, [%[b], #4]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[61] * B[0]\n\t" - "ldr r8, [%[a], #244]\n\t" - "ldr r9, [%[b], #0]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "str r4, [sp, #244]\n\t" - "# A[0] * B[62]\n\t" - "ldr r8, [%[a], #0]\n\t" - "ldr r9, [%[b], #248]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r10, r10\n\t" - "# A[1] * B[61]\n\t" - "ldr r8, [%[a], #4]\n\t" - "ldr r9, [%[b], #244]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[2] * B[60]\n\t" - "ldr r8, [%[a], #8]\n\t" - "ldr r9, [%[b], #240]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[3] * B[59]\n\t" - "ldr r8, [%[a], #12]\n\t" - "ldr r9, [%[b], #236]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[4] * B[58]\n\t" - "ldr r8, [%[a], #16]\n\t" - "ldr r9, [%[b], #232]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[5] * B[57]\n\t" - "ldr r8, [%[a], #20]\n\t" - "ldr r9, [%[b], #228]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[6] * B[56]\n\t" - "ldr r8, [%[a], #24]\n\t" - "ldr r9, [%[b], #224]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[7] * B[55]\n\t" - "ldr r8, [%[a], #28]\n\t" - "ldr r9, [%[b], #220]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[8] * B[54]\n\t" - "ldr r8, [%[a], #32]\n\t" - "ldr r9, [%[b], #216]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[9] * B[53]\n\t" - "ldr r8, [%[a], #36]\n\t" - "ldr r9, [%[b], #212]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[10] * B[52]\n\t" - "ldr r8, [%[a], #40]\n\t" - "ldr r9, [%[b], #208]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[11] * B[51]\n\t" - "ldr r8, [%[a], #44]\n\t" - "ldr r9, [%[b], #204]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[12] * B[50]\n\t" - "ldr r8, [%[a], #48]\n\t" - "ldr r9, [%[b], #200]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[13] * B[49]\n\t" - "ldr r8, [%[a], #52]\n\t" - "ldr r9, [%[b], #196]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[14] * B[48]\n\t" - "ldr r8, [%[a], #56]\n\t" - "ldr r9, [%[b], #192]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[15] * B[47]\n\t" - "ldr r8, [%[a], #60]\n\t" - "ldr r9, [%[b], #188]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[16] * B[46]\n\t" - "ldr r8, [%[a], #64]\n\t" - "ldr r9, [%[b], #184]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[17] * B[45]\n\t" - "ldr r8, [%[a], #68]\n\t" - "ldr r9, [%[b], #180]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[18] * B[44]\n\t" - "ldr r8, [%[a], #72]\n\t" - "ldr r9, [%[b], #176]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[19] * B[43]\n\t" - "ldr r8, [%[a], #76]\n\t" - "ldr r9, [%[b], #172]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[20] * B[42]\n\t" - "ldr r8, [%[a], #80]\n\t" - "ldr r9, [%[b], #168]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[21] * B[41]\n\t" - "ldr r8, [%[a], #84]\n\t" - "ldr r9, [%[b], #164]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[22] * B[40]\n\t" - "ldr r8, [%[a], #88]\n\t" - "ldr r9, [%[b], #160]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[23] * B[39]\n\t" - "ldr r8, [%[a], #92]\n\t" - "ldr r9, [%[b], #156]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[24] * B[38]\n\t" - "ldr r8, [%[a], #96]\n\t" - "ldr r9, [%[b], #152]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[25] * B[37]\n\t" - "ldr r8, [%[a], #100]\n\t" - "ldr r9, [%[b], #148]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[26] * B[36]\n\t" - "ldr r8, [%[a], #104]\n\t" - "ldr r9, [%[b], #144]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[27] * B[35]\n\t" - "ldr r8, [%[a], #108]\n\t" - "ldr r9, [%[b], #140]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[28] * B[34]\n\t" - "ldr r8, [%[a], #112]\n\t" - "ldr r9, [%[b], #136]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[29] * B[33]\n\t" - "ldr r8, [%[a], #116]\n\t" - "ldr r9, [%[b], #132]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[30] * B[32]\n\t" - "ldr r8, [%[a], #120]\n\t" - "ldr r9, [%[b], #128]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[31] * B[31]\n\t" - "ldr r8, [%[a], #124]\n\t" - "ldr r9, [%[b], #124]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[32] * B[30]\n\t" - "ldr r8, [%[a], #128]\n\t" - "ldr r9, [%[b], #120]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[33] * B[29]\n\t" - "ldr r8, [%[a], #132]\n\t" - "ldr r9, [%[b], #116]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[34] * B[28]\n\t" - "ldr r8, [%[a], #136]\n\t" - "ldr r9, [%[b], #112]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[35] * B[27]\n\t" - "ldr r8, [%[a], #140]\n\t" - "ldr r9, [%[b], #108]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[36] * B[26]\n\t" - "ldr r8, [%[a], #144]\n\t" - "ldr r9, [%[b], #104]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[37] * B[25]\n\t" - "ldr r8, [%[a], #148]\n\t" - "ldr r9, [%[b], #100]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[38] * B[24]\n\t" - "ldr r8, [%[a], #152]\n\t" - "ldr r9, [%[b], #96]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[39] * B[23]\n\t" - "ldr r8, [%[a], #156]\n\t" - "ldr r9, [%[b], #92]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[40] * B[22]\n\t" - "ldr r8, [%[a], #160]\n\t" - "ldr r9, [%[b], #88]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[41] * B[21]\n\t" - "ldr r8, [%[a], #164]\n\t" - "ldr r9, [%[b], #84]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[42] * B[20]\n\t" - "ldr r8, [%[a], #168]\n\t" - "ldr r9, [%[b], #80]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[43] * B[19]\n\t" - "ldr r8, [%[a], #172]\n\t" - "ldr r9, [%[b], #76]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[44] * B[18]\n\t" - "ldr r8, [%[a], #176]\n\t" - "ldr r9, [%[b], #72]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[45] * B[17]\n\t" - "ldr r8, [%[a], #180]\n\t" - "ldr r9, [%[b], #68]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[46] * B[16]\n\t" - "ldr r8, [%[a], #184]\n\t" - "ldr r9, [%[b], #64]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[47] * B[15]\n\t" - "ldr r8, [%[a], #188]\n\t" - "ldr r9, [%[b], #60]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[48] * B[14]\n\t" - "ldr r8, [%[a], #192]\n\t" - "ldr r9, [%[b], #56]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[49] * B[13]\n\t" - "ldr r8, [%[a], #196]\n\t" - "ldr r9, [%[b], #52]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[50] * B[12]\n\t" - "ldr r8, [%[a], #200]\n\t" - "ldr r9, [%[b], #48]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[51] * B[11]\n\t" - "ldr r8, [%[a], #204]\n\t" - "ldr r9, [%[b], #44]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[52] * B[10]\n\t" - "ldr r8, [%[a], #208]\n\t" - "ldr r9, [%[b], #40]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[53] * B[9]\n\t" - "ldr r8, [%[a], #212]\n\t" - "ldr r9, [%[b], #36]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[54] * B[8]\n\t" - "ldr r8, [%[a], #216]\n\t" - "ldr r9, [%[b], #32]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[55] * B[7]\n\t" - "ldr r8, [%[a], #220]\n\t" - "ldr r9, [%[b], #28]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[56] * B[6]\n\t" - "ldr r8, [%[a], #224]\n\t" - "ldr r9, [%[b], #24]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[57] * B[5]\n\t" - "ldr r8, [%[a], #228]\n\t" - "ldr r9, [%[b], #20]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[58] * B[4]\n\t" - "ldr r8, [%[a], #232]\n\t" - "ldr r9, [%[b], #16]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[59] * B[3]\n\t" - "ldr r8, [%[a], #236]\n\t" - "ldr r9, [%[b], #12]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[60] * B[2]\n\t" - "ldr r8, [%[a], #240]\n\t" - "ldr r9, [%[b], #8]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[61] * B[1]\n\t" - "ldr r8, [%[a], #244]\n\t" - "ldr r9, [%[b], #4]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[62] * B[0]\n\t" - "ldr r8, [%[a], #248]\n\t" - "ldr r9, [%[b], #0]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "str r5, [sp, #248]\n\t" - "# A[0] * B[63]\n\t" - "ldr r8, [%[a], #0]\n\t" - "ldr r9, [%[b], #252]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r10, r10\n\t" - "# A[1] * B[62]\n\t" - "ldr r8, [%[a], #4]\n\t" - "ldr r9, [%[b], #248]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[2] * B[61]\n\t" - "ldr r8, [%[a], #8]\n\t" - "ldr r9, [%[b], #244]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[3] * B[60]\n\t" - "ldr r8, [%[a], #12]\n\t" - "ldr r9, [%[b], #240]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[4] * B[59]\n\t" - "ldr r8, [%[a], #16]\n\t" - "ldr r9, [%[b], #236]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[5] * B[58]\n\t" - "ldr r8, [%[a], #20]\n\t" - "ldr r9, [%[b], #232]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[6] * B[57]\n\t" - "ldr r8, [%[a], #24]\n\t" - "ldr r9, [%[b], #228]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[7] * B[56]\n\t" - "ldr r8, [%[a], #28]\n\t" - "ldr r9, [%[b], #224]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[8] * B[55]\n\t" - "ldr r8, [%[a], #32]\n\t" - "ldr r9, [%[b], #220]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[9] * B[54]\n\t" - "ldr r8, [%[a], #36]\n\t" - "ldr r9, [%[b], #216]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[10] * B[53]\n\t" - "ldr r8, [%[a], #40]\n\t" - "ldr r9, [%[b], #212]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[11] * B[52]\n\t" - "ldr r8, [%[a], #44]\n\t" - "ldr r9, [%[b], #208]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[12] * B[51]\n\t" - "ldr r8, [%[a], #48]\n\t" - "ldr r9, [%[b], #204]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[13] * B[50]\n\t" - "ldr r8, [%[a], #52]\n\t" - "ldr r9, [%[b], #200]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[14] * B[49]\n\t" - "ldr r8, [%[a], #56]\n\t" - "ldr r9, [%[b], #196]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[15] * B[48]\n\t" - "ldr r8, [%[a], #60]\n\t" - "ldr r9, [%[b], #192]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[16] * B[47]\n\t" - "ldr r8, [%[a], #64]\n\t" - "ldr r9, [%[b], #188]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[17] * B[46]\n\t" - "ldr r8, [%[a], #68]\n\t" - "ldr r9, [%[b], #184]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[18] * B[45]\n\t" - "ldr r8, [%[a], #72]\n\t" - "ldr r9, [%[b], #180]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[19] * B[44]\n\t" - "ldr r8, [%[a], #76]\n\t" - "ldr r9, [%[b], #176]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[20] * B[43]\n\t" - "ldr r8, [%[a], #80]\n\t" - "ldr r9, [%[b], #172]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[21] * B[42]\n\t" - "ldr r8, [%[a], #84]\n\t" - "ldr r9, [%[b], #168]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[22] * B[41]\n\t" - "ldr r8, [%[a], #88]\n\t" - "ldr r9, [%[b], #164]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[23] * B[40]\n\t" - "ldr r8, [%[a], #92]\n\t" - "ldr r9, [%[b], #160]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[24] * B[39]\n\t" - "ldr r8, [%[a], #96]\n\t" - "ldr r9, [%[b], #156]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[25] * B[38]\n\t" - "ldr r8, [%[a], #100]\n\t" - "ldr r9, [%[b], #152]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[26] * B[37]\n\t" - "ldr r8, [%[a], #104]\n\t" - "ldr r9, [%[b], #148]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[27] * B[36]\n\t" - "ldr r8, [%[a], #108]\n\t" - "ldr r9, [%[b], #144]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[28] * B[35]\n\t" - "ldr r8, [%[a], #112]\n\t" - "ldr r9, [%[b], #140]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[29] * B[34]\n\t" - "ldr r8, [%[a], #116]\n\t" - "ldr r9, [%[b], #136]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[30] * B[33]\n\t" - "ldr r8, [%[a], #120]\n\t" - "ldr r9, [%[b], #132]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[31] * B[32]\n\t" - "ldr r8, [%[a], #124]\n\t" - "ldr r9, [%[b], #128]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[32] * B[31]\n\t" - "ldr r8, [%[a], #128]\n\t" - "ldr r9, [%[b], #124]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[33] * B[30]\n\t" - "ldr r8, [%[a], #132]\n\t" - "ldr r9, [%[b], #120]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[34] * B[29]\n\t" - "ldr r8, [%[a], #136]\n\t" - "ldr r9, [%[b], #116]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[35] * B[28]\n\t" - "ldr r8, [%[a], #140]\n\t" - "ldr r9, [%[b], #112]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[36] * B[27]\n\t" - "ldr r8, [%[a], #144]\n\t" - "ldr r9, [%[b], #108]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[37] * B[26]\n\t" - "ldr r8, [%[a], #148]\n\t" - "ldr r9, [%[b], #104]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[38] * B[25]\n\t" - "ldr r8, [%[a], #152]\n\t" - "ldr r9, [%[b], #100]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[39] * B[24]\n\t" - "ldr r8, [%[a], #156]\n\t" - "ldr r9, [%[b], #96]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[40] * B[23]\n\t" - "ldr r8, [%[a], #160]\n\t" - "ldr r9, [%[b], #92]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[41] * B[22]\n\t" - "ldr r8, [%[a], #164]\n\t" - "ldr r9, [%[b], #88]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[42] * B[21]\n\t" - "ldr r8, [%[a], #168]\n\t" - "ldr r9, [%[b], #84]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[43] * B[20]\n\t" - "ldr r8, [%[a], #172]\n\t" - "ldr r9, [%[b], #80]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[44] * B[19]\n\t" - "ldr r8, [%[a], #176]\n\t" - "ldr r9, [%[b], #76]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[45] * B[18]\n\t" - "ldr r8, [%[a], #180]\n\t" - "ldr r9, [%[b], #72]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[46] * B[17]\n\t" - "ldr r8, [%[a], #184]\n\t" - "ldr r9, [%[b], #68]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[47] * B[16]\n\t" - "ldr r8, [%[a], #188]\n\t" - "ldr r9, [%[b], #64]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[48] * B[15]\n\t" - "ldr r8, [%[a], #192]\n\t" - "ldr r9, [%[b], #60]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[49] * B[14]\n\t" - "ldr r8, [%[a], #196]\n\t" - "ldr r9, [%[b], #56]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[50] * B[13]\n\t" - "ldr r8, [%[a], #200]\n\t" - "ldr r9, [%[b], #52]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[51] * B[12]\n\t" - "ldr r8, [%[a], #204]\n\t" - "ldr r9, [%[b], #48]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[52] * B[11]\n\t" - "ldr r8, [%[a], #208]\n\t" - "ldr r9, [%[b], #44]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[53] * B[10]\n\t" - "ldr r8, [%[a], #212]\n\t" - "ldr r9, [%[b], #40]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[54] * B[9]\n\t" - "ldr r8, [%[a], #216]\n\t" - "ldr r9, [%[b], #36]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[55] * B[8]\n\t" - "ldr r8, [%[a], #220]\n\t" - "ldr r9, [%[b], #32]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[56] * B[7]\n\t" - "ldr r8, [%[a], #224]\n\t" - "ldr r9, [%[b], #28]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[57] * B[6]\n\t" - "ldr r8, [%[a], #228]\n\t" - "ldr r9, [%[b], #24]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[58] * B[5]\n\t" - "ldr r8, [%[a], #232]\n\t" - "ldr r9, [%[b], #20]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[59] * B[4]\n\t" - "ldr r8, [%[a], #236]\n\t" - "ldr r9, [%[b], #16]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[60] * B[3]\n\t" - "ldr r8, [%[a], #240]\n\t" - "ldr r9, [%[b], #12]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[61] * B[2]\n\t" - "ldr r8, [%[a], #244]\n\t" - "ldr r9, [%[b], #8]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[62] * B[1]\n\t" - "ldr r8, [%[a], #248]\n\t" - "ldr r9, [%[b], #4]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[63] * B[0]\n\t" - "ldr r8, [%[a], #252]\n\t" - "ldr r9, [%[b], #0]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "str r3, [sp, #252]\n\t" - "# A[1] * B[63]\n\t" - "ldr r8, [%[a], #4]\n\t" - "ldr r9, [%[b], #252]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r10, r10\n\t" - "# A[2] * B[62]\n\t" - "ldr r8, [%[a], #8]\n\t" - "ldr r9, [%[b], #248]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[3] * B[61]\n\t" - "ldr r8, [%[a], #12]\n\t" - "ldr r9, [%[b], #244]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[4] * B[60]\n\t" - "ldr r8, [%[a], #16]\n\t" - "ldr r9, [%[b], #240]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[5] * B[59]\n\t" - "ldr r8, [%[a], #20]\n\t" - "ldr r9, [%[b], #236]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[6] * B[58]\n\t" - "ldr r8, [%[a], #24]\n\t" - "ldr r9, [%[b], #232]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[7] * B[57]\n\t" - "ldr r8, [%[a], #28]\n\t" - "ldr r9, [%[b], #228]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[8] * B[56]\n\t" - "ldr r8, [%[a], #32]\n\t" - "ldr r9, [%[b], #224]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[9] * B[55]\n\t" - "ldr r8, [%[a], #36]\n\t" - "ldr r9, [%[b], #220]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[10] * B[54]\n\t" - "ldr r8, [%[a], #40]\n\t" - "ldr r9, [%[b], #216]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[11] * B[53]\n\t" - "ldr r8, [%[a], #44]\n\t" - "ldr r9, [%[b], #212]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[12] * B[52]\n\t" - "ldr r8, [%[a], #48]\n\t" - "ldr r9, [%[b], #208]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[13] * B[51]\n\t" - "ldr r8, [%[a], #52]\n\t" - "ldr r9, [%[b], #204]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[14] * B[50]\n\t" - "ldr r8, [%[a], #56]\n\t" - "ldr r9, [%[b], #200]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[15] * B[49]\n\t" - "ldr r8, [%[a], #60]\n\t" - "ldr r9, [%[b], #196]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[16] * B[48]\n\t" - "ldr r8, [%[a], #64]\n\t" - "ldr r9, [%[b], #192]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[17] * B[47]\n\t" - "ldr r8, [%[a], #68]\n\t" - "ldr r9, [%[b], #188]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[18] * B[46]\n\t" - "ldr r8, [%[a], #72]\n\t" - "ldr r9, [%[b], #184]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[19] * B[45]\n\t" - "ldr r8, [%[a], #76]\n\t" - "ldr r9, [%[b], #180]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[20] * B[44]\n\t" - "ldr r8, [%[a], #80]\n\t" - "ldr r9, [%[b], #176]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[21] * B[43]\n\t" - "ldr r8, [%[a], #84]\n\t" - "ldr r9, [%[b], #172]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[22] * B[42]\n\t" - "ldr r8, [%[a], #88]\n\t" - "ldr r9, [%[b], #168]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[23] * B[41]\n\t" - "ldr r8, [%[a], #92]\n\t" - "ldr r9, [%[b], #164]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[24] * B[40]\n\t" - "ldr r8, [%[a], #96]\n\t" - "ldr r9, [%[b], #160]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[25] * B[39]\n\t" - "ldr r8, [%[a], #100]\n\t" - "ldr r9, [%[b], #156]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[26] * B[38]\n\t" - "ldr r8, [%[a], #104]\n\t" - "ldr r9, [%[b], #152]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[27] * B[37]\n\t" - "ldr r8, [%[a], #108]\n\t" - "ldr r9, [%[b], #148]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[28] * B[36]\n\t" - "ldr r8, [%[a], #112]\n\t" - "ldr r9, [%[b], #144]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[29] * B[35]\n\t" - "ldr r8, [%[a], #116]\n\t" - "ldr r9, [%[b], #140]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[30] * B[34]\n\t" - "ldr r8, [%[a], #120]\n\t" - "ldr r9, [%[b], #136]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[31] * B[33]\n\t" - "ldr r8, [%[a], #124]\n\t" - "ldr r9, [%[b], #132]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[32] * B[32]\n\t" - "ldr r8, [%[a], #128]\n\t" - "ldr r9, [%[b], #128]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[33] * B[31]\n\t" - "ldr r8, [%[a], #132]\n\t" - "ldr r9, [%[b], #124]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[34] * B[30]\n\t" - "ldr r8, [%[a], #136]\n\t" - "ldr r9, [%[b], #120]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[35] * B[29]\n\t" - "ldr r8, [%[a], #140]\n\t" - "ldr r9, [%[b], #116]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[36] * B[28]\n\t" - "ldr r8, [%[a], #144]\n\t" - "ldr r9, [%[b], #112]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[37] * B[27]\n\t" - "ldr r8, [%[a], #148]\n\t" - "ldr r9, [%[b], #108]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[38] * B[26]\n\t" - "ldr r8, [%[a], #152]\n\t" - "ldr r9, [%[b], #104]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[39] * B[25]\n\t" - "ldr r8, [%[a], #156]\n\t" - "ldr r9, [%[b], #100]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[40] * B[24]\n\t" - "ldr r8, [%[a], #160]\n\t" - "ldr r9, [%[b], #96]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[41] * B[23]\n\t" - "ldr r8, [%[a], #164]\n\t" - "ldr r9, [%[b], #92]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[42] * B[22]\n\t" - "ldr r8, [%[a], #168]\n\t" - "ldr r9, [%[b], #88]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[43] * B[21]\n\t" - "ldr r8, [%[a], #172]\n\t" - "ldr r9, [%[b], #84]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[44] * B[20]\n\t" - "ldr r8, [%[a], #176]\n\t" - "ldr r9, [%[b], #80]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[45] * B[19]\n\t" - "ldr r8, [%[a], #180]\n\t" - "ldr r9, [%[b], #76]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[46] * B[18]\n\t" - "ldr r8, [%[a], #184]\n\t" - "ldr r9, [%[b], #72]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[47] * B[17]\n\t" - "ldr r8, [%[a], #188]\n\t" - "ldr r9, [%[b], #68]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[48] * B[16]\n\t" - "ldr r8, [%[a], #192]\n\t" - "ldr r9, [%[b], #64]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[49] * B[15]\n\t" - "ldr r8, [%[a], #196]\n\t" - "ldr r9, [%[b], #60]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[50] * B[14]\n\t" - "ldr r8, [%[a], #200]\n\t" - "ldr r9, [%[b], #56]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[51] * B[13]\n\t" - "ldr r8, [%[a], #204]\n\t" - "ldr r9, [%[b], #52]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[52] * B[12]\n\t" - "ldr r8, [%[a], #208]\n\t" - "ldr r9, [%[b], #48]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[53] * B[11]\n\t" - "ldr r8, [%[a], #212]\n\t" - "ldr r9, [%[b], #44]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[54] * B[10]\n\t" - "ldr r8, [%[a], #216]\n\t" - "ldr r9, [%[b], #40]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[55] * B[9]\n\t" - "ldr r8, [%[a], #220]\n\t" - "ldr r9, [%[b], #36]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[56] * B[8]\n\t" - "ldr r8, [%[a], #224]\n\t" - "ldr r9, [%[b], #32]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[57] * B[7]\n\t" - "ldr r8, [%[a], #228]\n\t" - "ldr r9, [%[b], #28]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[58] * B[6]\n\t" - "ldr r8, [%[a], #232]\n\t" - "ldr r9, [%[b], #24]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[59] * B[5]\n\t" - "ldr r8, [%[a], #236]\n\t" - "ldr r9, [%[b], #20]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[60] * B[4]\n\t" - "ldr r8, [%[a], #240]\n\t" - "ldr r9, [%[b], #16]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[61] * B[3]\n\t" - "ldr r8, [%[a], #244]\n\t" - "ldr r9, [%[b], #12]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[62] * B[2]\n\t" - "ldr r8, [%[a], #248]\n\t" - "ldr r9, [%[b], #8]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[63] * B[1]\n\t" - "ldr r8, [%[a], #252]\n\t" - "ldr r9, [%[b], #4]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "str r4, [%[r], #256]\n\t" - "# A[2] * B[63]\n\t" - "ldr r8, [%[a], #8]\n\t" - "ldr r9, [%[b], #252]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r10, r10\n\t" - "# A[3] * B[62]\n\t" - "ldr r8, [%[a], #12]\n\t" - "ldr r9, [%[b], #248]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[4] * B[61]\n\t" - "ldr r8, [%[a], #16]\n\t" - "ldr r9, [%[b], #244]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[5] * B[60]\n\t" - "ldr r8, [%[a], #20]\n\t" - "ldr r9, [%[b], #240]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[6] * B[59]\n\t" - "ldr r8, [%[a], #24]\n\t" - "ldr r9, [%[b], #236]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[7] * B[58]\n\t" - "ldr r8, [%[a], #28]\n\t" - "ldr r9, [%[b], #232]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[8] * B[57]\n\t" - "ldr r8, [%[a], #32]\n\t" - "ldr r9, [%[b], #228]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[9] * B[56]\n\t" - "ldr r8, [%[a], #36]\n\t" - "ldr r9, [%[b], #224]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[10] * B[55]\n\t" - "ldr r8, [%[a], #40]\n\t" - "ldr r9, [%[b], #220]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[11] * B[54]\n\t" - "ldr r8, [%[a], #44]\n\t" - "ldr r9, [%[b], #216]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[12] * B[53]\n\t" - "ldr r8, [%[a], #48]\n\t" - "ldr r9, [%[b], #212]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[13] * B[52]\n\t" - "ldr r8, [%[a], #52]\n\t" - "ldr r9, [%[b], #208]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[14] * B[51]\n\t" - "ldr r8, [%[a], #56]\n\t" - "ldr r9, [%[b], #204]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[15] * B[50]\n\t" - "ldr r8, [%[a], #60]\n\t" - "ldr r9, [%[b], #200]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[16] * B[49]\n\t" - "ldr r8, [%[a], #64]\n\t" - "ldr r9, [%[b], #196]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[17] * B[48]\n\t" - "ldr r8, [%[a], #68]\n\t" - "ldr r9, [%[b], #192]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[18] * B[47]\n\t" - "ldr r8, [%[a], #72]\n\t" - "ldr r9, [%[b], #188]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[19] * B[46]\n\t" - "ldr r8, [%[a], #76]\n\t" - "ldr r9, [%[b], #184]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[20] * B[45]\n\t" - "ldr r8, [%[a], #80]\n\t" - "ldr r9, [%[b], #180]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[21] * B[44]\n\t" - "ldr r8, [%[a], #84]\n\t" - "ldr r9, [%[b], #176]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[22] * B[43]\n\t" - "ldr r8, [%[a], #88]\n\t" - "ldr r9, [%[b], #172]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[23] * B[42]\n\t" - "ldr r8, [%[a], #92]\n\t" - "ldr r9, [%[b], #168]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[24] * B[41]\n\t" - "ldr r8, [%[a], #96]\n\t" - "ldr r9, [%[b], #164]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[25] * B[40]\n\t" - "ldr r8, [%[a], #100]\n\t" - "ldr r9, [%[b], #160]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[26] * B[39]\n\t" - "ldr r8, [%[a], #104]\n\t" - "ldr r9, [%[b], #156]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[27] * B[38]\n\t" - "ldr r8, [%[a], #108]\n\t" - "ldr r9, [%[b], #152]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[28] * B[37]\n\t" - "ldr r8, [%[a], #112]\n\t" - "ldr r9, [%[b], #148]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[29] * B[36]\n\t" - "ldr r8, [%[a], #116]\n\t" - "ldr r9, [%[b], #144]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[30] * B[35]\n\t" - "ldr r8, [%[a], #120]\n\t" - "ldr r9, [%[b], #140]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[31] * B[34]\n\t" - "ldr r8, [%[a], #124]\n\t" - "ldr r9, [%[b], #136]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[32] * B[33]\n\t" - "ldr r8, [%[a], #128]\n\t" - "ldr r9, [%[b], #132]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[33] * B[32]\n\t" - "ldr r8, [%[a], #132]\n\t" - "ldr r9, [%[b], #128]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[34] * B[31]\n\t" - "ldr r8, [%[a], #136]\n\t" - "ldr r9, [%[b], #124]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[35] * B[30]\n\t" - "ldr r8, [%[a], #140]\n\t" - "ldr r9, [%[b], #120]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[36] * B[29]\n\t" - "ldr r8, [%[a], #144]\n\t" - "ldr r9, [%[b], #116]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[37] * B[28]\n\t" - "ldr r8, [%[a], #148]\n\t" - "ldr r9, [%[b], #112]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[38] * B[27]\n\t" - "ldr r8, [%[a], #152]\n\t" - "ldr r9, [%[b], #108]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[39] * B[26]\n\t" - "ldr r8, [%[a], #156]\n\t" - "ldr r9, [%[b], #104]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[40] * B[25]\n\t" - "ldr r8, [%[a], #160]\n\t" - "ldr r9, [%[b], #100]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[41] * B[24]\n\t" - "ldr r8, [%[a], #164]\n\t" - "ldr r9, [%[b], #96]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[42] * B[23]\n\t" - "ldr r8, [%[a], #168]\n\t" - "ldr r9, [%[b], #92]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[43] * B[22]\n\t" - "ldr r8, [%[a], #172]\n\t" - "ldr r9, [%[b], #88]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[44] * B[21]\n\t" - "ldr r8, [%[a], #176]\n\t" - "ldr r9, [%[b], #84]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[45] * B[20]\n\t" - "ldr r8, [%[a], #180]\n\t" - "ldr r9, [%[b], #80]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[46] * B[19]\n\t" - "ldr r8, [%[a], #184]\n\t" - "ldr r9, [%[b], #76]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[47] * B[18]\n\t" - "ldr r8, [%[a], #188]\n\t" - "ldr r9, [%[b], #72]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[48] * B[17]\n\t" - "ldr r8, [%[a], #192]\n\t" - "ldr r9, [%[b], #68]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[49] * B[16]\n\t" - "ldr r8, [%[a], #196]\n\t" - "ldr r9, [%[b], #64]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[50] * B[15]\n\t" - "ldr r8, [%[a], #200]\n\t" - "ldr r9, [%[b], #60]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[51] * B[14]\n\t" - "ldr r8, [%[a], #204]\n\t" - "ldr r9, [%[b], #56]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[52] * B[13]\n\t" - "ldr r8, [%[a], #208]\n\t" - "ldr r9, [%[b], #52]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[53] * B[12]\n\t" - "ldr r8, [%[a], #212]\n\t" - "ldr r9, [%[b], #48]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[54] * B[11]\n\t" - "ldr r8, [%[a], #216]\n\t" - "ldr r9, [%[b], #44]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[55] * B[10]\n\t" - "ldr r8, [%[a], #220]\n\t" - "ldr r9, [%[b], #40]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[56] * B[9]\n\t" - "ldr r8, [%[a], #224]\n\t" - "ldr r9, [%[b], #36]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[57] * B[8]\n\t" - "ldr r8, [%[a], #228]\n\t" - "ldr r9, [%[b], #32]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[58] * B[7]\n\t" - "ldr r8, [%[a], #232]\n\t" - "ldr r9, [%[b], #28]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[59] * B[6]\n\t" - "ldr r8, [%[a], #236]\n\t" - "ldr r9, [%[b], #24]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[60] * B[5]\n\t" - "ldr r8, [%[a], #240]\n\t" - "ldr r9, [%[b], #20]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[61] * B[4]\n\t" - "ldr r8, [%[a], #244]\n\t" - "ldr r9, [%[b], #16]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[62] * B[3]\n\t" - "ldr r8, [%[a], #248]\n\t" - "ldr r9, [%[b], #12]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[63] * B[2]\n\t" - "ldr r8, [%[a], #252]\n\t" - "ldr r9, [%[b], #8]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "str r5, [%[r], #260]\n\t" - "# A[3] * B[63]\n\t" - "ldr r8, [%[a], #12]\n\t" - "ldr r9, [%[b], #252]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r10, r10\n\t" - "# A[4] * B[62]\n\t" - "ldr r8, [%[a], #16]\n\t" - "ldr r9, [%[b], #248]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[5] * B[61]\n\t" - "ldr r8, [%[a], #20]\n\t" - "ldr r9, [%[b], #244]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[6] * B[60]\n\t" - "ldr r8, [%[a], #24]\n\t" - "ldr r9, [%[b], #240]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[7] * B[59]\n\t" - "ldr r8, [%[a], #28]\n\t" - "ldr r9, [%[b], #236]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[8] * B[58]\n\t" - "ldr r8, [%[a], #32]\n\t" - "ldr r9, [%[b], #232]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[9] * B[57]\n\t" - "ldr r8, [%[a], #36]\n\t" - "ldr r9, [%[b], #228]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[10] * B[56]\n\t" - "ldr r8, [%[a], #40]\n\t" - "ldr r9, [%[b], #224]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[11] * B[55]\n\t" - "ldr r8, [%[a], #44]\n\t" - "ldr r9, [%[b], #220]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[12] * B[54]\n\t" - "ldr r8, [%[a], #48]\n\t" - "ldr r9, [%[b], #216]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[13] * B[53]\n\t" - "ldr r8, [%[a], #52]\n\t" - "ldr r9, [%[b], #212]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[14] * B[52]\n\t" - "ldr r8, [%[a], #56]\n\t" - "ldr r9, [%[b], #208]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[15] * B[51]\n\t" - "ldr r8, [%[a], #60]\n\t" - "ldr r9, [%[b], #204]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[16] * B[50]\n\t" - "ldr r8, [%[a], #64]\n\t" - "ldr r9, [%[b], #200]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[17] * B[49]\n\t" - "ldr r8, [%[a], #68]\n\t" - "ldr r9, [%[b], #196]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[18] * B[48]\n\t" - "ldr r8, [%[a], #72]\n\t" - "ldr r9, [%[b], #192]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[19] * B[47]\n\t" - "ldr r8, [%[a], #76]\n\t" - "ldr r9, [%[b], #188]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[20] * B[46]\n\t" - "ldr r8, [%[a], #80]\n\t" - "ldr r9, [%[b], #184]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[21] * B[45]\n\t" - "ldr r8, [%[a], #84]\n\t" - "ldr r9, [%[b], #180]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[22] * B[44]\n\t" - "ldr r8, [%[a], #88]\n\t" - "ldr r9, [%[b], #176]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[23] * B[43]\n\t" - "ldr r8, [%[a], #92]\n\t" - "ldr r9, [%[b], #172]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[24] * B[42]\n\t" - "ldr r8, [%[a], #96]\n\t" - "ldr r9, [%[b], #168]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[25] * B[41]\n\t" - "ldr r8, [%[a], #100]\n\t" - "ldr r9, [%[b], #164]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[26] * B[40]\n\t" - "ldr r8, [%[a], #104]\n\t" - "ldr r9, [%[b], #160]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[27] * B[39]\n\t" - "ldr r8, [%[a], #108]\n\t" - "ldr r9, [%[b], #156]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[28] * B[38]\n\t" - "ldr r8, [%[a], #112]\n\t" - "ldr r9, [%[b], #152]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[29] * B[37]\n\t" - "ldr r8, [%[a], #116]\n\t" - "ldr r9, [%[b], #148]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[30] * B[36]\n\t" - "ldr r8, [%[a], #120]\n\t" - "ldr r9, [%[b], #144]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[31] * B[35]\n\t" - "ldr r8, [%[a], #124]\n\t" - "ldr r9, [%[b], #140]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[32] * B[34]\n\t" - "ldr r8, [%[a], #128]\n\t" - "ldr r9, [%[b], #136]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[33] * B[33]\n\t" - "ldr r8, [%[a], #132]\n\t" - "ldr r9, [%[b], #132]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[34] * B[32]\n\t" - "ldr r8, [%[a], #136]\n\t" - "ldr r9, [%[b], #128]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[35] * B[31]\n\t" - "ldr r8, [%[a], #140]\n\t" - "ldr r9, [%[b], #124]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[36] * B[30]\n\t" - "ldr r8, [%[a], #144]\n\t" - "ldr r9, [%[b], #120]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[37] * B[29]\n\t" - "ldr r8, [%[a], #148]\n\t" - "ldr r9, [%[b], #116]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[38] * B[28]\n\t" - "ldr r8, [%[a], #152]\n\t" - "ldr r9, [%[b], #112]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[39] * B[27]\n\t" - "ldr r8, [%[a], #156]\n\t" - "ldr r9, [%[b], #108]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[40] * B[26]\n\t" - "ldr r8, [%[a], #160]\n\t" - "ldr r9, [%[b], #104]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[41] * B[25]\n\t" - "ldr r8, [%[a], #164]\n\t" - "ldr r9, [%[b], #100]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[42] * B[24]\n\t" - "ldr r8, [%[a], #168]\n\t" - "ldr r9, [%[b], #96]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[43] * B[23]\n\t" - "ldr r8, [%[a], #172]\n\t" - "ldr r9, [%[b], #92]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[44] * B[22]\n\t" - "ldr r8, [%[a], #176]\n\t" - "ldr r9, [%[b], #88]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[45] * B[21]\n\t" - "ldr r8, [%[a], #180]\n\t" - "ldr r9, [%[b], #84]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[46] * B[20]\n\t" - "ldr r8, [%[a], #184]\n\t" - "ldr r9, [%[b], #80]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[47] * B[19]\n\t" - "ldr r8, [%[a], #188]\n\t" - "ldr r9, [%[b], #76]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[48] * B[18]\n\t" - "ldr r8, [%[a], #192]\n\t" - "ldr r9, [%[b], #72]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[49] * B[17]\n\t" - "ldr r8, [%[a], #196]\n\t" - "ldr r9, [%[b], #68]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[50] * B[16]\n\t" - "ldr r8, [%[a], #200]\n\t" - "ldr r9, [%[b], #64]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[51] * B[15]\n\t" - "ldr r8, [%[a], #204]\n\t" - "ldr r9, [%[b], #60]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[52] * B[14]\n\t" - "ldr r8, [%[a], #208]\n\t" - "ldr r9, [%[b], #56]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[53] * B[13]\n\t" - "ldr r8, [%[a], #212]\n\t" - "ldr r9, [%[b], #52]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[54] * B[12]\n\t" - "ldr r8, [%[a], #216]\n\t" - "ldr r9, [%[b], #48]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[55] * B[11]\n\t" - "ldr r8, [%[a], #220]\n\t" - "ldr r9, [%[b], #44]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[56] * B[10]\n\t" - "ldr r8, [%[a], #224]\n\t" - "ldr r9, [%[b], #40]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[57] * B[9]\n\t" - "ldr r8, [%[a], #228]\n\t" - "ldr r9, [%[b], #36]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[58] * B[8]\n\t" - "ldr r8, [%[a], #232]\n\t" - "ldr r9, [%[b], #32]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[59] * B[7]\n\t" - "ldr r8, [%[a], #236]\n\t" - "ldr r9, [%[b], #28]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[60] * B[6]\n\t" - "ldr r8, [%[a], #240]\n\t" - "ldr r9, [%[b], #24]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[61] * B[5]\n\t" - "ldr r8, [%[a], #244]\n\t" - "ldr r9, [%[b], #20]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[62] * B[4]\n\t" - "ldr r8, [%[a], #248]\n\t" - "ldr r9, [%[b], #16]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[63] * B[3]\n\t" - "ldr r8, [%[a], #252]\n\t" - "ldr r9, [%[b], #12]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "str r3, [%[r], #264]\n\t" - "# A[4] * B[63]\n\t" - "ldr r8, [%[a], #16]\n\t" - "ldr r9, [%[b], #252]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r10, r10\n\t" - "# A[5] * B[62]\n\t" - "ldr r8, [%[a], #20]\n\t" - "ldr r9, [%[b], #248]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[6] * B[61]\n\t" - "ldr r8, [%[a], #24]\n\t" - "ldr r9, [%[b], #244]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[7] * B[60]\n\t" - "ldr r8, [%[a], #28]\n\t" - "ldr r9, [%[b], #240]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[8] * B[59]\n\t" - "ldr r8, [%[a], #32]\n\t" - "ldr r9, [%[b], #236]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[9] * B[58]\n\t" - "ldr r8, [%[a], #36]\n\t" - "ldr r9, [%[b], #232]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[10] * B[57]\n\t" - "ldr r8, [%[a], #40]\n\t" - "ldr r9, [%[b], #228]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[11] * B[56]\n\t" - "ldr r8, [%[a], #44]\n\t" - "ldr r9, [%[b], #224]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[12] * B[55]\n\t" - "ldr r8, [%[a], #48]\n\t" - "ldr r9, [%[b], #220]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[13] * B[54]\n\t" - "ldr r8, [%[a], #52]\n\t" - "ldr r9, [%[b], #216]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[14] * B[53]\n\t" - "ldr r8, [%[a], #56]\n\t" - "ldr r9, [%[b], #212]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[15] * B[52]\n\t" - "ldr r8, [%[a], #60]\n\t" - "ldr r9, [%[b], #208]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[16] * B[51]\n\t" - "ldr r8, [%[a], #64]\n\t" - "ldr r9, [%[b], #204]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[17] * B[50]\n\t" - "ldr r8, [%[a], #68]\n\t" - "ldr r9, [%[b], #200]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[18] * B[49]\n\t" - "ldr r8, [%[a], #72]\n\t" - "ldr r9, [%[b], #196]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[19] * B[48]\n\t" - "ldr r8, [%[a], #76]\n\t" - "ldr r9, [%[b], #192]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[20] * B[47]\n\t" - "ldr r8, [%[a], #80]\n\t" - "ldr r9, [%[b], #188]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[21] * B[46]\n\t" - "ldr r8, [%[a], #84]\n\t" - "ldr r9, [%[b], #184]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[22] * B[45]\n\t" - "ldr r8, [%[a], #88]\n\t" - "ldr r9, [%[b], #180]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[23] * B[44]\n\t" - "ldr r8, [%[a], #92]\n\t" - "ldr r9, [%[b], #176]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[24] * B[43]\n\t" - "ldr r8, [%[a], #96]\n\t" - "ldr r9, [%[b], #172]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[25] * B[42]\n\t" - "ldr r8, [%[a], #100]\n\t" - "ldr r9, [%[b], #168]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[26] * B[41]\n\t" - "ldr r8, [%[a], #104]\n\t" - "ldr r9, [%[b], #164]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[27] * B[40]\n\t" - "ldr r8, [%[a], #108]\n\t" - "ldr r9, [%[b], #160]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[28] * B[39]\n\t" - "ldr r8, [%[a], #112]\n\t" - "ldr r9, [%[b], #156]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[29] * B[38]\n\t" - "ldr r8, [%[a], #116]\n\t" - "ldr r9, [%[b], #152]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[30] * B[37]\n\t" - "ldr r8, [%[a], #120]\n\t" - "ldr r9, [%[b], #148]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[31] * B[36]\n\t" - "ldr r8, [%[a], #124]\n\t" - "ldr r9, [%[b], #144]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[32] * B[35]\n\t" - "ldr r8, [%[a], #128]\n\t" - "ldr r9, [%[b], #140]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[33] * B[34]\n\t" - "ldr r8, [%[a], #132]\n\t" - "ldr r9, [%[b], #136]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[34] * B[33]\n\t" - "ldr r8, [%[a], #136]\n\t" - "ldr r9, [%[b], #132]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[35] * B[32]\n\t" - "ldr r8, [%[a], #140]\n\t" - "ldr r9, [%[b], #128]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[36] * B[31]\n\t" - "ldr r8, [%[a], #144]\n\t" - "ldr r9, [%[b], #124]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[37] * B[30]\n\t" - "ldr r8, [%[a], #148]\n\t" - "ldr r9, [%[b], #120]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[38] * B[29]\n\t" - "ldr r8, [%[a], #152]\n\t" - "ldr r9, [%[b], #116]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[39] * B[28]\n\t" - "ldr r8, [%[a], #156]\n\t" - "ldr r9, [%[b], #112]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[40] * B[27]\n\t" - "ldr r8, [%[a], #160]\n\t" - "ldr r9, [%[b], #108]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[41] * B[26]\n\t" - "ldr r8, [%[a], #164]\n\t" - "ldr r9, [%[b], #104]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[42] * B[25]\n\t" - "ldr r8, [%[a], #168]\n\t" - "ldr r9, [%[b], #100]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[43] * B[24]\n\t" - "ldr r8, [%[a], #172]\n\t" - "ldr r9, [%[b], #96]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[44] * B[23]\n\t" - "ldr r8, [%[a], #176]\n\t" - "ldr r9, [%[b], #92]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[45] * B[22]\n\t" - "ldr r8, [%[a], #180]\n\t" - "ldr r9, [%[b], #88]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[46] * B[21]\n\t" - "ldr r8, [%[a], #184]\n\t" - "ldr r9, [%[b], #84]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[47] * B[20]\n\t" - "ldr r8, [%[a], #188]\n\t" - "ldr r9, [%[b], #80]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[48] * B[19]\n\t" - "ldr r8, [%[a], #192]\n\t" - "ldr r9, [%[b], #76]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[49] * B[18]\n\t" - "ldr r8, [%[a], #196]\n\t" - "ldr r9, [%[b], #72]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[50] * B[17]\n\t" - "ldr r8, [%[a], #200]\n\t" - "ldr r9, [%[b], #68]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[51] * B[16]\n\t" - "ldr r8, [%[a], #204]\n\t" - "ldr r9, [%[b], #64]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[52] * B[15]\n\t" - "ldr r8, [%[a], #208]\n\t" - "ldr r9, [%[b], #60]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[53] * B[14]\n\t" - "ldr r8, [%[a], #212]\n\t" - "ldr r9, [%[b], #56]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[54] * B[13]\n\t" - "ldr r8, [%[a], #216]\n\t" - "ldr r9, [%[b], #52]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[55] * B[12]\n\t" - "ldr r8, [%[a], #220]\n\t" - "ldr r9, [%[b], #48]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[56] * B[11]\n\t" - "ldr r8, [%[a], #224]\n\t" - "ldr r9, [%[b], #44]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[57] * B[10]\n\t" - "ldr r8, [%[a], #228]\n\t" - "ldr r9, [%[b], #40]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[58] * B[9]\n\t" - "ldr r8, [%[a], #232]\n\t" - "ldr r9, [%[b], #36]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[59] * B[8]\n\t" - "ldr r8, [%[a], #236]\n\t" - "ldr r9, [%[b], #32]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[60] * B[7]\n\t" - "ldr r8, [%[a], #240]\n\t" - "ldr r9, [%[b], #28]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[61] * B[6]\n\t" - "ldr r8, [%[a], #244]\n\t" - "ldr r9, [%[b], #24]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[62] * B[5]\n\t" - "ldr r8, [%[a], #248]\n\t" - "ldr r9, [%[b], #20]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[63] * B[4]\n\t" - "ldr r8, [%[a], #252]\n\t" - "ldr r9, [%[b], #16]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "str r4, [%[r], #268]\n\t" - "# A[5] * B[63]\n\t" - "ldr r8, [%[a], #20]\n\t" - "ldr r9, [%[b], #252]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r10, r10\n\t" - "# A[6] * B[62]\n\t" - "ldr r8, [%[a], #24]\n\t" - "ldr r9, [%[b], #248]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[7] * B[61]\n\t" - "ldr r8, [%[a], #28]\n\t" - "ldr r9, [%[b], #244]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[8] * B[60]\n\t" - "ldr r8, [%[a], #32]\n\t" - "ldr r9, [%[b], #240]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[9] * B[59]\n\t" - "ldr r8, [%[a], #36]\n\t" - "ldr r9, [%[b], #236]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[10] * B[58]\n\t" - "ldr r8, [%[a], #40]\n\t" - "ldr r9, [%[b], #232]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[11] * B[57]\n\t" - "ldr r8, [%[a], #44]\n\t" - "ldr r9, [%[b], #228]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[12] * B[56]\n\t" - "ldr r8, [%[a], #48]\n\t" - "ldr r9, [%[b], #224]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[13] * B[55]\n\t" - "ldr r8, [%[a], #52]\n\t" - "ldr r9, [%[b], #220]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[14] * B[54]\n\t" - "ldr r8, [%[a], #56]\n\t" - "ldr r9, [%[b], #216]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[15] * B[53]\n\t" - "ldr r8, [%[a], #60]\n\t" - "ldr r9, [%[b], #212]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[16] * B[52]\n\t" - "ldr r8, [%[a], #64]\n\t" - "ldr r9, [%[b], #208]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[17] * B[51]\n\t" - "ldr r8, [%[a], #68]\n\t" - "ldr r9, [%[b], #204]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[18] * B[50]\n\t" - "ldr r8, [%[a], #72]\n\t" - "ldr r9, [%[b], #200]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[19] * B[49]\n\t" - "ldr r8, [%[a], #76]\n\t" - "ldr r9, [%[b], #196]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[20] * B[48]\n\t" - "ldr r8, [%[a], #80]\n\t" - "ldr r9, [%[b], #192]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[21] * B[47]\n\t" - "ldr r8, [%[a], #84]\n\t" - "ldr r9, [%[b], #188]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[22] * B[46]\n\t" - "ldr r8, [%[a], #88]\n\t" - "ldr r9, [%[b], #184]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[23] * B[45]\n\t" - "ldr r8, [%[a], #92]\n\t" - "ldr r9, [%[b], #180]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[24] * B[44]\n\t" - "ldr r8, [%[a], #96]\n\t" - "ldr r9, [%[b], #176]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[25] * B[43]\n\t" - "ldr r8, [%[a], #100]\n\t" - "ldr r9, [%[b], #172]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[26] * B[42]\n\t" - "ldr r8, [%[a], #104]\n\t" - "ldr r9, [%[b], #168]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[27] * B[41]\n\t" - "ldr r8, [%[a], #108]\n\t" - "ldr r9, [%[b], #164]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[28] * B[40]\n\t" - "ldr r8, [%[a], #112]\n\t" - "ldr r9, [%[b], #160]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[29] * B[39]\n\t" - "ldr r8, [%[a], #116]\n\t" - "ldr r9, [%[b], #156]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[30] * B[38]\n\t" - "ldr r8, [%[a], #120]\n\t" - "ldr r9, [%[b], #152]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[31] * B[37]\n\t" - "ldr r8, [%[a], #124]\n\t" - "ldr r9, [%[b], #148]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[32] * B[36]\n\t" - "ldr r8, [%[a], #128]\n\t" - "ldr r9, [%[b], #144]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[33] * B[35]\n\t" - "ldr r8, [%[a], #132]\n\t" - "ldr r9, [%[b], #140]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[34] * B[34]\n\t" - "ldr r8, [%[a], #136]\n\t" - "ldr r9, [%[b], #136]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[35] * B[33]\n\t" - "ldr r8, [%[a], #140]\n\t" - "ldr r9, [%[b], #132]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[36] * B[32]\n\t" - "ldr r8, [%[a], #144]\n\t" - "ldr r9, [%[b], #128]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[37] * B[31]\n\t" - "ldr r8, [%[a], #148]\n\t" - "ldr r9, [%[b], #124]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[38] * B[30]\n\t" - "ldr r8, [%[a], #152]\n\t" - "ldr r9, [%[b], #120]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[39] * B[29]\n\t" - "ldr r8, [%[a], #156]\n\t" - "ldr r9, [%[b], #116]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[40] * B[28]\n\t" - "ldr r8, [%[a], #160]\n\t" - "ldr r9, [%[b], #112]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[41] * B[27]\n\t" - "ldr r8, [%[a], #164]\n\t" - "ldr r9, [%[b], #108]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[42] * B[26]\n\t" - "ldr r8, [%[a], #168]\n\t" - "ldr r9, [%[b], #104]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[43] * B[25]\n\t" - "ldr r8, [%[a], #172]\n\t" - "ldr r9, [%[b], #100]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[44] * B[24]\n\t" - "ldr r8, [%[a], #176]\n\t" - "ldr r9, [%[b], #96]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[45] * B[23]\n\t" - "ldr r8, [%[a], #180]\n\t" - "ldr r9, [%[b], #92]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[46] * B[22]\n\t" - "ldr r8, [%[a], #184]\n\t" - "ldr r9, [%[b], #88]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[47] * B[21]\n\t" - "ldr r8, [%[a], #188]\n\t" - "ldr r9, [%[b], #84]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[48] * B[20]\n\t" - "ldr r8, [%[a], #192]\n\t" - "ldr r9, [%[b], #80]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[49] * B[19]\n\t" - "ldr r8, [%[a], #196]\n\t" - "ldr r9, [%[b], #76]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[50] * B[18]\n\t" - "ldr r8, [%[a], #200]\n\t" - "ldr r9, [%[b], #72]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[51] * B[17]\n\t" - "ldr r8, [%[a], #204]\n\t" - "ldr r9, [%[b], #68]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[52] * B[16]\n\t" - "ldr r8, [%[a], #208]\n\t" - "ldr r9, [%[b], #64]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[53] * B[15]\n\t" - "ldr r8, [%[a], #212]\n\t" - "ldr r9, [%[b], #60]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[54] * B[14]\n\t" - "ldr r8, [%[a], #216]\n\t" - "ldr r9, [%[b], #56]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[55] * B[13]\n\t" - "ldr r8, [%[a], #220]\n\t" - "ldr r9, [%[b], #52]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[56] * B[12]\n\t" - "ldr r8, [%[a], #224]\n\t" - "ldr r9, [%[b], #48]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[57] * B[11]\n\t" - "ldr r8, [%[a], #228]\n\t" - "ldr r9, [%[b], #44]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[58] * B[10]\n\t" - "ldr r8, [%[a], #232]\n\t" - "ldr r9, [%[b], #40]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[59] * B[9]\n\t" - "ldr r8, [%[a], #236]\n\t" - "ldr r9, [%[b], #36]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[60] * B[8]\n\t" - "ldr r8, [%[a], #240]\n\t" - "ldr r9, [%[b], #32]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[61] * B[7]\n\t" - "ldr r8, [%[a], #244]\n\t" - "ldr r9, [%[b], #28]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[62] * B[6]\n\t" - "ldr r8, [%[a], #248]\n\t" - "ldr r9, [%[b], #24]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[63] * B[5]\n\t" - "ldr r8, [%[a], #252]\n\t" - "ldr r9, [%[b], #20]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "str r5, [%[r], #272]\n\t" - "# A[6] * B[63]\n\t" - "ldr r8, [%[a], #24]\n\t" - "ldr r9, [%[b], #252]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r10, r10\n\t" - "# A[7] * B[62]\n\t" - "ldr r8, [%[a], #28]\n\t" - "ldr r9, [%[b], #248]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[8] * B[61]\n\t" - "ldr r8, [%[a], #32]\n\t" - "ldr r9, [%[b], #244]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[9] * B[60]\n\t" - "ldr r8, [%[a], #36]\n\t" - "ldr r9, [%[b], #240]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[10] * B[59]\n\t" - "ldr r8, [%[a], #40]\n\t" - "ldr r9, [%[b], #236]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[11] * B[58]\n\t" - "ldr r8, [%[a], #44]\n\t" - "ldr r9, [%[b], #232]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[12] * B[57]\n\t" - "ldr r8, [%[a], #48]\n\t" - "ldr r9, [%[b], #228]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[13] * B[56]\n\t" - "ldr r8, [%[a], #52]\n\t" - "ldr r9, [%[b], #224]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[14] * B[55]\n\t" - "ldr r8, [%[a], #56]\n\t" - "ldr r9, [%[b], #220]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[15] * B[54]\n\t" - "ldr r8, [%[a], #60]\n\t" - "ldr r9, [%[b], #216]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[16] * B[53]\n\t" - "ldr r8, [%[a], #64]\n\t" - "ldr r9, [%[b], #212]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[17] * B[52]\n\t" - "ldr r8, [%[a], #68]\n\t" - "ldr r9, [%[b], #208]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[18] * B[51]\n\t" - "ldr r8, [%[a], #72]\n\t" - "ldr r9, [%[b], #204]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[19] * B[50]\n\t" - "ldr r8, [%[a], #76]\n\t" - "ldr r9, [%[b], #200]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[20] * B[49]\n\t" - "ldr r8, [%[a], #80]\n\t" - "ldr r9, [%[b], #196]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[21] * B[48]\n\t" - "ldr r8, [%[a], #84]\n\t" - "ldr r9, [%[b], #192]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[22] * B[47]\n\t" - "ldr r8, [%[a], #88]\n\t" - "ldr r9, [%[b], #188]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[23] * B[46]\n\t" - "ldr r8, [%[a], #92]\n\t" - "ldr r9, [%[b], #184]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[24] * B[45]\n\t" - "ldr r8, [%[a], #96]\n\t" - "ldr r9, [%[b], #180]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[25] * B[44]\n\t" - "ldr r8, [%[a], #100]\n\t" - "ldr r9, [%[b], #176]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[26] * B[43]\n\t" - "ldr r8, [%[a], #104]\n\t" - "ldr r9, [%[b], #172]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[27] * B[42]\n\t" - "ldr r8, [%[a], #108]\n\t" - "ldr r9, [%[b], #168]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[28] * B[41]\n\t" - "ldr r8, [%[a], #112]\n\t" - "ldr r9, [%[b], #164]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[29] * B[40]\n\t" - "ldr r8, [%[a], #116]\n\t" - "ldr r9, [%[b], #160]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[30] * B[39]\n\t" - "ldr r8, [%[a], #120]\n\t" - "ldr r9, [%[b], #156]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[31] * B[38]\n\t" - "ldr r8, [%[a], #124]\n\t" - "ldr r9, [%[b], #152]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[32] * B[37]\n\t" - "ldr r8, [%[a], #128]\n\t" - "ldr r9, [%[b], #148]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[33] * B[36]\n\t" - "ldr r8, [%[a], #132]\n\t" - "ldr r9, [%[b], #144]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[34] * B[35]\n\t" - "ldr r8, [%[a], #136]\n\t" - "ldr r9, [%[b], #140]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[35] * B[34]\n\t" - "ldr r8, [%[a], #140]\n\t" - "ldr r9, [%[b], #136]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[36] * B[33]\n\t" - "ldr r8, [%[a], #144]\n\t" - "ldr r9, [%[b], #132]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[37] * B[32]\n\t" - "ldr r8, [%[a], #148]\n\t" - "ldr r9, [%[b], #128]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[38] * B[31]\n\t" - "ldr r8, [%[a], #152]\n\t" - "ldr r9, [%[b], #124]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[39] * B[30]\n\t" - "ldr r8, [%[a], #156]\n\t" - "ldr r9, [%[b], #120]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[40] * B[29]\n\t" - "ldr r8, [%[a], #160]\n\t" - "ldr r9, [%[b], #116]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[41] * B[28]\n\t" - "ldr r8, [%[a], #164]\n\t" - "ldr r9, [%[b], #112]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[42] * B[27]\n\t" - "ldr r8, [%[a], #168]\n\t" - "ldr r9, [%[b], #108]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[43] * B[26]\n\t" - "ldr r8, [%[a], #172]\n\t" - "ldr r9, [%[b], #104]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[44] * B[25]\n\t" - "ldr r8, [%[a], #176]\n\t" - "ldr r9, [%[b], #100]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[45] * B[24]\n\t" - "ldr r8, [%[a], #180]\n\t" - "ldr r9, [%[b], #96]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[46] * B[23]\n\t" - "ldr r8, [%[a], #184]\n\t" - "ldr r9, [%[b], #92]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[47] * B[22]\n\t" - "ldr r8, [%[a], #188]\n\t" - "ldr r9, [%[b], #88]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[48] * B[21]\n\t" - "ldr r8, [%[a], #192]\n\t" - "ldr r9, [%[b], #84]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[49] * B[20]\n\t" - "ldr r8, [%[a], #196]\n\t" - "ldr r9, [%[b], #80]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[50] * B[19]\n\t" - "ldr r8, [%[a], #200]\n\t" - "ldr r9, [%[b], #76]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[51] * B[18]\n\t" - "ldr r8, [%[a], #204]\n\t" - "ldr r9, [%[b], #72]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[52] * B[17]\n\t" - "ldr r8, [%[a], #208]\n\t" - "ldr r9, [%[b], #68]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[53] * B[16]\n\t" - "ldr r8, [%[a], #212]\n\t" - "ldr r9, [%[b], #64]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[54] * B[15]\n\t" - "ldr r8, [%[a], #216]\n\t" - "ldr r9, [%[b], #60]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[55] * B[14]\n\t" - "ldr r8, [%[a], #220]\n\t" - "ldr r9, [%[b], #56]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[56] * B[13]\n\t" - "ldr r8, [%[a], #224]\n\t" - "ldr r9, [%[b], #52]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[57] * B[12]\n\t" - "ldr r8, [%[a], #228]\n\t" - "ldr r9, [%[b], #48]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[58] * B[11]\n\t" - "ldr r8, [%[a], #232]\n\t" - "ldr r9, [%[b], #44]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[59] * B[10]\n\t" - "ldr r8, [%[a], #236]\n\t" - "ldr r9, [%[b], #40]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[60] * B[9]\n\t" - "ldr r8, [%[a], #240]\n\t" - "ldr r9, [%[b], #36]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[61] * B[8]\n\t" - "ldr r8, [%[a], #244]\n\t" - "ldr r9, [%[b], #32]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[62] * B[7]\n\t" - "ldr r8, [%[a], #248]\n\t" - "ldr r9, [%[b], #28]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[63] * B[6]\n\t" - "ldr r8, [%[a], #252]\n\t" - "ldr r9, [%[b], #24]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "str r3, [%[r], #276]\n\t" - "# A[7] * B[63]\n\t" - "ldr r8, [%[a], #28]\n\t" - "ldr r9, [%[b], #252]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r10, r10\n\t" - "# A[8] * B[62]\n\t" - "ldr r8, [%[a], #32]\n\t" - "ldr r9, [%[b], #248]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[9] * B[61]\n\t" - "ldr r8, [%[a], #36]\n\t" - "ldr r9, [%[b], #244]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[10] * B[60]\n\t" - "ldr r8, [%[a], #40]\n\t" - "ldr r9, [%[b], #240]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[11] * B[59]\n\t" - "ldr r8, [%[a], #44]\n\t" - "ldr r9, [%[b], #236]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[12] * B[58]\n\t" - "ldr r8, [%[a], #48]\n\t" - "ldr r9, [%[b], #232]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[13] * B[57]\n\t" - "ldr r8, [%[a], #52]\n\t" - "ldr r9, [%[b], #228]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[14] * B[56]\n\t" - "ldr r8, [%[a], #56]\n\t" - "ldr r9, [%[b], #224]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[15] * B[55]\n\t" - "ldr r8, [%[a], #60]\n\t" - "ldr r9, [%[b], #220]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[16] * B[54]\n\t" - "ldr r8, [%[a], #64]\n\t" - "ldr r9, [%[b], #216]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[17] * B[53]\n\t" - "ldr r8, [%[a], #68]\n\t" - "ldr r9, [%[b], #212]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[18] * B[52]\n\t" - "ldr r8, [%[a], #72]\n\t" - "ldr r9, [%[b], #208]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[19] * B[51]\n\t" - "ldr r8, [%[a], #76]\n\t" - "ldr r9, [%[b], #204]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[20] * B[50]\n\t" - "ldr r8, [%[a], #80]\n\t" - "ldr r9, [%[b], #200]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[21] * B[49]\n\t" - "ldr r8, [%[a], #84]\n\t" - "ldr r9, [%[b], #196]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[22] * B[48]\n\t" - "ldr r8, [%[a], #88]\n\t" - "ldr r9, [%[b], #192]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[23] * B[47]\n\t" - "ldr r8, [%[a], #92]\n\t" - "ldr r9, [%[b], #188]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[24] * B[46]\n\t" - "ldr r8, [%[a], #96]\n\t" - "ldr r9, [%[b], #184]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[25] * B[45]\n\t" - "ldr r8, [%[a], #100]\n\t" - "ldr r9, [%[b], #180]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[26] * B[44]\n\t" - "ldr r8, [%[a], #104]\n\t" - "ldr r9, [%[b], #176]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[27] * B[43]\n\t" - "ldr r8, [%[a], #108]\n\t" - "ldr r9, [%[b], #172]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[28] * B[42]\n\t" - "ldr r8, [%[a], #112]\n\t" - "ldr r9, [%[b], #168]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[29] * B[41]\n\t" - "ldr r8, [%[a], #116]\n\t" - "ldr r9, [%[b], #164]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[30] * B[40]\n\t" - "ldr r8, [%[a], #120]\n\t" - "ldr r9, [%[b], #160]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[31] * B[39]\n\t" - "ldr r8, [%[a], #124]\n\t" - "ldr r9, [%[b], #156]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[32] * B[38]\n\t" - "ldr r8, [%[a], #128]\n\t" - "ldr r9, [%[b], #152]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[33] * B[37]\n\t" - "ldr r8, [%[a], #132]\n\t" - "ldr r9, [%[b], #148]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[34] * B[36]\n\t" - "ldr r8, [%[a], #136]\n\t" - "ldr r9, [%[b], #144]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[35] * B[35]\n\t" - "ldr r8, [%[a], #140]\n\t" - "ldr r9, [%[b], #140]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[36] * B[34]\n\t" - "ldr r8, [%[a], #144]\n\t" - "ldr r9, [%[b], #136]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[37] * B[33]\n\t" - "ldr r8, [%[a], #148]\n\t" - "ldr r9, [%[b], #132]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[38] * B[32]\n\t" - "ldr r8, [%[a], #152]\n\t" - "ldr r9, [%[b], #128]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[39] * B[31]\n\t" - "ldr r8, [%[a], #156]\n\t" - "ldr r9, [%[b], #124]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[40] * B[30]\n\t" - "ldr r8, [%[a], #160]\n\t" - "ldr r9, [%[b], #120]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[41] * B[29]\n\t" - "ldr r8, [%[a], #164]\n\t" - "ldr r9, [%[b], #116]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[42] * B[28]\n\t" - "ldr r8, [%[a], #168]\n\t" - "ldr r9, [%[b], #112]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[43] * B[27]\n\t" - "ldr r8, [%[a], #172]\n\t" - "ldr r9, [%[b], #108]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[44] * B[26]\n\t" - "ldr r8, [%[a], #176]\n\t" - "ldr r9, [%[b], #104]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[45] * B[25]\n\t" - "ldr r8, [%[a], #180]\n\t" - "ldr r9, [%[b], #100]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[46] * B[24]\n\t" - "ldr r8, [%[a], #184]\n\t" - "ldr r9, [%[b], #96]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[47] * B[23]\n\t" - "ldr r8, [%[a], #188]\n\t" - "ldr r9, [%[b], #92]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[48] * B[22]\n\t" - "ldr r8, [%[a], #192]\n\t" - "ldr r9, [%[b], #88]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[49] * B[21]\n\t" - "ldr r8, [%[a], #196]\n\t" - "ldr r9, [%[b], #84]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[50] * B[20]\n\t" - "ldr r8, [%[a], #200]\n\t" - "ldr r9, [%[b], #80]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[51] * B[19]\n\t" - "ldr r8, [%[a], #204]\n\t" - "ldr r9, [%[b], #76]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[52] * B[18]\n\t" - "ldr r8, [%[a], #208]\n\t" - "ldr r9, [%[b], #72]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[53] * B[17]\n\t" - "ldr r8, [%[a], #212]\n\t" - "ldr r9, [%[b], #68]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[54] * B[16]\n\t" - "ldr r8, [%[a], #216]\n\t" - "ldr r9, [%[b], #64]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[55] * B[15]\n\t" - "ldr r8, [%[a], #220]\n\t" - "ldr r9, [%[b], #60]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[56] * B[14]\n\t" - "ldr r8, [%[a], #224]\n\t" - "ldr r9, [%[b], #56]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[57] * B[13]\n\t" - "ldr r8, [%[a], #228]\n\t" - "ldr r9, [%[b], #52]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[58] * B[12]\n\t" - "ldr r8, [%[a], #232]\n\t" - "ldr r9, [%[b], #48]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[59] * B[11]\n\t" - "ldr r8, [%[a], #236]\n\t" - "ldr r9, [%[b], #44]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[60] * B[10]\n\t" - "ldr r8, [%[a], #240]\n\t" - "ldr r9, [%[b], #40]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[61] * B[9]\n\t" - "ldr r8, [%[a], #244]\n\t" - "ldr r9, [%[b], #36]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[62] * B[8]\n\t" - "ldr r8, [%[a], #248]\n\t" - "ldr r9, [%[b], #32]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[63] * B[7]\n\t" - "ldr r8, [%[a], #252]\n\t" - "ldr r9, [%[b], #28]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "str r4, [%[r], #280]\n\t" - "# A[8] * B[63]\n\t" - "ldr r8, [%[a], #32]\n\t" - "ldr r9, [%[b], #252]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r10, r10\n\t" - "# A[9] * B[62]\n\t" - "ldr r8, [%[a], #36]\n\t" - "ldr r9, [%[b], #248]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[10] * B[61]\n\t" - "ldr r8, [%[a], #40]\n\t" - "ldr r9, [%[b], #244]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[11] * B[60]\n\t" - "ldr r8, [%[a], #44]\n\t" - "ldr r9, [%[b], #240]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[12] * B[59]\n\t" - "ldr r8, [%[a], #48]\n\t" - "ldr r9, [%[b], #236]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[13] * B[58]\n\t" - "ldr r8, [%[a], #52]\n\t" - "ldr r9, [%[b], #232]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[14] * B[57]\n\t" - "ldr r8, [%[a], #56]\n\t" - "ldr r9, [%[b], #228]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[15] * B[56]\n\t" - "ldr r8, [%[a], #60]\n\t" - "ldr r9, [%[b], #224]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[16] * B[55]\n\t" - "ldr r8, [%[a], #64]\n\t" - "ldr r9, [%[b], #220]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[17] * B[54]\n\t" - "ldr r8, [%[a], #68]\n\t" - "ldr r9, [%[b], #216]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[18] * B[53]\n\t" - "ldr r8, [%[a], #72]\n\t" - "ldr r9, [%[b], #212]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[19] * B[52]\n\t" - "ldr r8, [%[a], #76]\n\t" - "ldr r9, [%[b], #208]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[20] * B[51]\n\t" - "ldr r8, [%[a], #80]\n\t" - "ldr r9, [%[b], #204]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[21] * B[50]\n\t" - "ldr r8, [%[a], #84]\n\t" - "ldr r9, [%[b], #200]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[22] * B[49]\n\t" - "ldr r8, [%[a], #88]\n\t" - "ldr r9, [%[b], #196]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[23] * B[48]\n\t" - "ldr r8, [%[a], #92]\n\t" - "ldr r9, [%[b], #192]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[24] * B[47]\n\t" - "ldr r8, [%[a], #96]\n\t" - "ldr r9, [%[b], #188]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[25] * B[46]\n\t" - "ldr r8, [%[a], #100]\n\t" - "ldr r9, [%[b], #184]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[26] * B[45]\n\t" - "ldr r8, [%[a], #104]\n\t" - "ldr r9, [%[b], #180]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[27] * B[44]\n\t" - "ldr r8, [%[a], #108]\n\t" - "ldr r9, [%[b], #176]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[28] * B[43]\n\t" - "ldr r8, [%[a], #112]\n\t" - "ldr r9, [%[b], #172]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[29] * B[42]\n\t" - "ldr r8, [%[a], #116]\n\t" - "ldr r9, [%[b], #168]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[30] * B[41]\n\t" - "ldr r8, [%[a], #120]\n\t" - "ldr r9, [%[b], #164]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[31] * B[40]\n\t" - "ldr r8, [%[a], #124]\n\t" - "ldr r9, [%[b], #160]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[32] * B[39]\n\t" - "ldr r8, [%[a], #128]\n\t" - "ldr r9, [%[b], #156]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[33] * B[38]\n\t" - "ldr r8, [%[a], #132]\n\t" - "ldr r9, [%[b], #152]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[34] * B[37]\n\t" - "ldr r8, [%[a], #136]\n\t" - "ldr r9, [%[b], #148]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[35] * B[36]\n\t" - "ldr r8, [%[a], #140]\n\t" - "ldr r9, [%[b], #144]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[36] * B[35]\n\t" - "ldr r8, [%[a], #144]\n\t" - "ldr r9, [%[b], #140]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[37] * B[34]\n\t" - "ldr r8, [%[a], #148]\n\t" - "ldr r9, [%[b], #136]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[38] * B[33]\n\t" - "ldr r8, [%[a], #152]\n\t" - "ldr r9, [%[b], #132]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[39] * B[32]\n\t" - "ldr r8, [%[a], #156]\n\t" - "ldr r9, [%[b], #128]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[40] * B[31]\n\t" - "ldr r8, [%[a], #160]\n\t" - "ldr r9, [%[b], #124]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[41] * B[30]\n\t" - "ldr r8, [%[a], #164]\n\t" - "ldr r9, [%[b], #120]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[42] * B[29]\n\t" - "ldr r8, [%[a], #168]\n\t" - "ldr r9, [%[b], #116]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[43] * B[28]\n\t" - "ldr r8, [%[a], #172]\n\t" - "ldr r9, [%[b], #112]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[44] * B[27]\n\t" - "ldr r8, [%[a], #176]\n\t" - "ldr r9, [%[b], #108]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[45] * B[26]\n\t" - "ldr r8, [%[a], #180]\n\t" - "ldr r9, [%[b], #104]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[46] * B[25]\n\t" - "ldr r8, [%[a], #184]\n\t" - "ldr r9, [%[b], #100]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[47] * B[24]\n\t" - "ldr r8, [%[a], #188]\n\t" - "ldr r9, [%[b], #96]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[48] * B[23]\n\t" - "ldr r8, [%[a], #192]\n\t" - "ldr r9, [%[b], #92]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[49] * B[22]\n\t" - "ldr r8, [%[a], #196]\n\t" - "ldr r9, [%[b], #88]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[50] * B[21]\n\t" - "ldr r8, [%[a], #200]\n\t" - "ldr r9, [%[b], #84]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[51] * B[20]\n\t" - "ldr r8, [%[a], #204]\n\t" - "ldr r9, [%[b], #80]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[52] * B[19]\n\t" - "ldr r8, [%[a], #208]\n\t" - "ldr r9, [%[b], #76]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[53] * B[18]\n\t" - "ldr r8, [%[a], #212]\n\t" - "ldr r9, [%[b], #72]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[54] * B[17]\n\t" - "ldr r8, [%[a], #216]\n\t" - "ldr r9, [%[b], #68]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[55] * B[16]\n\t" - "ldr r8, [%[a], #220]\n\t" - "ldr r9, [%[b], #64]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[56] * B[15]\n\t" - "ldr r8, [%[a], #224]\n\t" - "ldr r9, [%[b], #60]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[57] * B[14]\n\t" - "ldr r8, [%[a], #228]\n\t" - "ldr r9, [%[b], #56]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[58] * B[13]\n\t" - "ldr r8, [%[a], #232]\n\t" - "ldr r9, [%[b], #52]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[59] * B[12]\n\t" - "ldr r8, [%[a], #236]\n\t" - "ldr r9, [%[b], #48]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[60] * B[11]\n\t" - "ldr r8, [%[a], #240]\n\t" - "ldr r9, [%[b], #44]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[61] * B[10]\n\t" - "ldr r8, [%[a], #244]\n\t" - "ldr r9, [%[b], #40]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[62] * B[9]\n\t" - "ldr r8, [%[a], #248]\n\t" - "ldr r9, [%[b], #36]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[63] * B[8]\n\t" - "ldr r8, [%[a], #252]\n\t" - "ldr r9, [%[b], #32]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "str r5, [%[r], #284]\n\t" - "# A[9] * B[63]\n\t" - "ldr r8, [%[a], #36]\n\t" - "ldr r9, [%[b], #252]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r10, r10\n\t" - "# A[10] * B[62]\n\t" - "ldr r8, [%[a], #40]\n\t" - "ldr r9, [%[b], #248]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[11] * B[61]\n\t" - "ldr r8, [%[a], #44]\n\t" - "ldr r9, [%[b], #244]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[12] * B[60]\n\t" - "ldr r8, [%[a], #48]\n\t" - "ldr r9, [%[b], #240]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[13] * B[59]\n\t" - "ldr r8, [%[a], #52]\n\t" - "ldr r9, [%[b], #236]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[14] * B[58]\n\t" - "ldr r8, [%[a], #56]\n\t" - "ldr r9, [%[b], #232]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[15] * B[57]\n\t" - "ldr r8, [%[a], #60]\n\t" - "ldr r9, [%[b], #228]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[16] * B[56]\n\t" - "ldr r8, [%[a], #64]\n\t" - "ldr r9, [%[b], #224]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[17] * B[55]\n\t" - "ldr r8, [%[a], #68]\n\t" - "ldr r9, [%[b], #220]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[18] * B[54]\n\t" - "ldr r8, [%[a], #72]\n\t" - "ldr r9, [%[b], #216]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[19] * B[53]\n\t" - "ldr r8, [%[a], #76]\n\t" - "ldr r9, [%[b], #212]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[20] * B[52]\n\t" - "ldr r8, [%[a], #80]\n\t" - "ldr r9, [%[b], #208]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[21] * B[51]\n\t" - "ldr r8, [%[a], #84]\n\t" - "ldr r9, [%[b], #204]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[22] * B[50]\n\t" - "ldr r8, [%[a], #88]\n\t" - "ldr r9, [%[b], #200]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[23] * B[49]\n\t" - "ldr r8, [%[a], #92]\n\t" - "ldr r9, [%[b], #196]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[24] * B[48]\n\t" - "ldr r8, [%[a], #96]\n\t" - "ldr r9, [%[b], #192]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[25] * B[47]\n\t" - "ldr r8, [%[a], #100]\n\t" - "ldr r9, [%[b], #188]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[26] * B[46]\n\t" - "ldr r8, [%[a], #104]\n\t" - "ldr r9, [%[b], #184]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[27] * B[45]\n\t" - "ldr r8, [%[a], #108]\n\t" - "ldr r9, [%[b], #180]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[28] * B[44]\n\t" - "ldr r8, [%[a], #112]\n\t" - "ldr r9, [%[b], #176]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[29] * B[43]\n\t" - "ldr r8, [%[a], #116]\n\t" - "ldr r9, [%[b], #172]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[30] * B[42]\n\t" - "ldr r8, [%[a], #120]\n\t" - "ldr r9, [%[b], #168]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[31] * B[41]\n\t" - "ldr r8, [%[a], #124]\n\t" - "ldr r9, [%[b], #164]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[32] * B[40]\n\t" - "ldr r8, [%[a], #128]\n\t" - "ldr r9, [%[b], #160]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[33] * B[39]\n\t" - "ldr r8, [%[a], #132]\n\t" - "ldr r9, [%[b], #156]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[34] * B[38]\n\t" - "ldr r8, [%[a], #136]\n\t" - "ldr r9, [%[b], #152]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[35] * B[37]\n\t" - "ldr r8, [%[a], #140]\n\t" - "ldr r9, [%[b], #148]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[36] * B[36]\n\t" - "ldr r8, [%[a], #144]\n\t" - "ldr r9, [%[b], #144]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[37] * B[35]\n\t" - "ldr r8, [%[a], #148]\n\t" - "ldr r9, [%[b], #140]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[38] * B[34]\n\t" - "ldr r8, [%[a], #152]\n\t" - "ldr r9, [%[b], #136]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[39] * B[33]\n\t" - "ldr r8, [%[a], #156]\n\t" - "ldr r9, [%[b], #132]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[40] * B[32]\n\t" - "ldr r8, [%[a], #160]\n\t" - "ldr r9, [%[b], #128]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[41] * B[31]\n\t" - "ldr r8, [%[a], #164]\n\t" - "ldr r9, [%[b], #124]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[42] * B[30]\n\t" - "ldr r8, [%[a], #168]\n\t" - "ldr r9, [%[b], #120]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[43] * B[29]\n\t" - "ldr r8, [%[a], #172]\n\t" - "ldr r9, [%[b], #116]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[44] * B[28]\n\t" - "ldr r8, [%[a], #176]\n\t" - "ldr r9, [%[b], #112]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[45] * B[27]\n\t" - "ldr r8, [%[a], #180]\n\t" - "ldr r9, [%[b], #108]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[46] * B[26]\n\t" - "ldr r8, [%[a], #184]\n\t" - "ldr r9, [%[b], #104]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[47] * B[25]\n\t" - "ldr r8, [%[a], #188]\n\t" - "ldr r9, [%[b], #100]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[48] * B[24]\n\t" - "ldr r8, [%[a], #192]\n\t" - "ldr r9, [%[b], #96]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[49] * B[23]\n\t" - "ldr r8, [%[a], #196]\n\t" - "ldr r9, [%[b], #92]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[50] * B[22]\n\t" - "ldr r8, [%[a], #200]\n\t" - "ldr r9, [%[b], #88]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[51] * B[21]\n\t" - "ldr r8, [%[a], #204]\n\t" - "ldr r9, [%[b], #84]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[52] * B[20]\n\t" - "ldr r8, [%[a], #208]\n\t" - "ldr r9, [%[b], #80]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[53] * B[19]\n\t" - "ldr r8, [%[a], #212]\n\t" - "ldr r9, [%[b], #76]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[54] * B[18]\n\t" - "ldr r8, [%[a], #216]\n\t" - "ldr r9, [%[b], #72]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[55] * B[17]\n\t" - "ldr r8, [%[a], #220]\n\t" - "ldr r9, [%[b], #68]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[56] * B[16]\n\t" - "ldr r8, [%[a], #224]\n\t" - "ldr r9, [%[b], #64]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[57] * B[15]\n\t" - "ldr r8, [%[a], #228]\n\t" - "ldr r9, [%[b], #60]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[58] * B[14]\n\t" - "ldr r8, [%[a], #232]\n\t" - "ldr r9, [%[b], #56]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[59] * B[13]\n\t" - "ldr r8, [%[a], #236]\n\t" - "ldr r9, [%[b], #52]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[60] * B[12]\n\t" - "ldr r8, [%[a], #240]\n\t" - "ldr r9, [%[b], #48]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[61] * B[11]\n\t" - "ldr r8, [%[a], #244]\n\t" - "ldr r9, [%[b], #44]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[62] * B[10]\n\t" - "ldr r8, [%[a], #248]\n\t" - "ldr r9, [%[b], #40]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[63] * B[9]\n\t" - "ldr r8, [%[a], #252]\n\t" - "ldr r9, [%[b], #36]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "str r3, [%[r], #288]\n\t" - "# A[10] * B[63]\n\t" - "ldr r8, [%[a], #40]\n\t" - "ldr r9, [%[b], #252]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r10, r10\n\t" - "# A[11] * B[62]\n\t" - "ldr r8, [%[a], #44]\n\t" - "ldr r9, [%[b], #248]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[12] * B[61]\n\t" - "ldr r8, [%[a], #48]\n\t" - "ldr r9, [%[b], #244]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[13] * B[60]\n\t" - "ldr r8, [%[a], #52]\n\t" - "ldr r9, [%[b], #240]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[14] * B[59]\n\t" - "ldr r8, [%[a], #56]\n\t" - "ldr r9, [%[b], #236]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[15] * B[58]\n\t" - "ldr r8, [%[a], #60]\n\t" - "ldr r9, [%[b], #232]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[16] * B[57]\n\t" - "ldr r8, [%[a], #64]\n\t" - "ldr r9, [%[b], #228]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[17] * B[56]\n\t" - "ldr r8, [%[a], #68]\n\t" - "ldr r9, [%[b], #224]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[18] * B[55]\n\t" - "ldr r8, [%[a], #72]\n\t" - "ldr r9, [%[b], #220]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[19] * B[54]\n\t" - "ldr r8, [%[a], #76]\n\t" - "ldr r9, [%[b], #216]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[20] * B[53]\n\t" - "ldr r8, [%[a], #80]\n\t" - "ldr r9, [%[b], #212]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[21] * B[52]\n\t" - "ldr r8, [%[a], #84]\n\t" - "ldr r9, [%[b], #208]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[22] * B[51]\n\t" - "ldr r8, [%[a], #88]\n\t" - "ldr r9, [%[b], #204]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[23] * B[50]\n\t" - "ldr r8, [%[a], #92]\n\t" - "ldr r9, [%[b], #200]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[24] * B[49]\n\t" - "ldr r8, [%[a], #96]\n\t" - "ldr r9, [%[b], #196]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[25] * B[48]\n\t" - "ldr r8, [%[a], #100]\n\t" - "ldr r9, [%[b], #192]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[26] * B[47]\n\t" - "ldr r8, [%[a], #104]\n\t" - "ldr r9, [%[b], #188]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[27] * B[46]\n\t" - "ldr r8, [%[a], #108]\n\t" - "ldr r9, [%[b], #184]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[28] * B[45]\n\t" - "ldr r8, [%[a], #112]\n\t" - "ldr r9, [%[b], #180]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[29] * B[44]\n\t" - "ldr r8, [%[a], #116]\n\t" - "ldr r9, [%[b], #176]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[30] * B[43]\n\t" - "ldr r8, [%[a], #120]\n\t" - "ldr r9, [%[b], #172]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[31] * B[42]\n\t" - "ldr r8, [%[a], #124]\n\t" - "ldr r9, [%[b], #168]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[32] * B[41]\n\t" - "ldr r8, [%[a], #128]\n\t" - "ldr r9, [%[b], #164]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[33] * B[40]\n\t" - "ldr r8, [%[a], #132]\n\t" - "ldr r9, [%[b], #160]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[34] * B[39]\n\t" - "ldr r8, [%[a], #136]\n\t" - "ldr r9, [%[b], #156]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[35] * B[38]\n\t" - "ldr r8, [%[a], #140]\n\t" - "ldr r9, [%[b], #152]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[36] * B[37]\n\t" - "ldr r8, [%[a], #144]\n\t" - "ldr r9, [%[b], #148]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[37] * B[36]\n\t" - "ldr r8, [%[a], #148]\n\t" - "ldr r9, [%[b], #144]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[38] * B[35]\n\t" - "ldr r8, [%[a], #152]\n\t" - "ldr r9, [%[b], #140]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[39] * B[34]\n\t" - "ldr r8, [%[a], #156]\n\t" - "ldr r9, [%[b], #136]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[40] * B[33]\n\t" - "ldr r8, [%[a], #160]\n\t" - "ldr r9, [%[b], #132]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[41] * B[32]\n\t" - "ldr r8, [%[a], #164]\n\t" - "ldr r9, [%[b], #128]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[42] * B[31]\n\t" - "ldr r8, [%[a], #168]\n\t" - "ldr r9, [%[b], #124]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[43] * B[30]\n\t" - "ldr r8, [%[a], #172]\n\t" - "ldr r9, [%[b], #120]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[44] * B[29]\n\t" - "ldr r8, [%[a], #176]\n\t" - "ldr r9, [%[b], #116]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[45] * B[28]\n\t" - "ldr r8, [%[a], #180]\n\t" - "ldr r9, [%[b], #112]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[46] * B[27]\n\t" - "ldr r8, [%[a], #184]\n\t" - "ldr r9, [%[b], #108]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[47] * B[26]\n\t" - "ldr r8, [%[a], #188]\n\t" - "ldr r9, [%[b], #104]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[48] * B[25]\n\t" - "ldr r8, [%[a], #192]\n\t" - "ldr r9, [%[b], #100]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[49] * B[24]\n\t" - "ldr r8, [%[a], #196]\n\t" - "ldr r9, [%[b], #96]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[50] * B[23]\n\t" - "ldr r8, [%[a], #200]\n\t" - "ldr r9, [%[b], #92]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[51] * B[22]\n\t" - "ldr r8, [%[a], #204]\n\t" - "ldr r9, [%[b], #88]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[52] * B[21]\n\t" - "ldr r8, [%[a], #208]\n\t" - "ldr r9, [%[b], #84]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[53] * B[20]\n\t" - "ldr r8, [%[a], #212]\n\t" - "ldr r9, [%[b], #80]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[54] * B[19]\n\t" - "ldr r8, [%[a], #216]\n\t" - "ldr r9, [%[b], #76]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[55] * B[18]\n\t" - "ldr r8, [%[a], #220]\n\t" - "ldr r9, [%[b], #72]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[56] * B[17]\n\t" - "ldr r8, [%[a], #224]\n\t" - "ldr r9, [%[b], #68]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[57] * B[16]\n\t" - "ldr r8, [%[a], #228]\n\t" - "ldr r9, [%[b], #64]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[58] * B[15]\n\t" - "ldr r8, [%[a], #232]\n\t" - "ldr r9, [%[b], #60]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[59] * B[14]\n\t" - "ldr r8, [%[a], #236]\n\t" - "ldr r9, [%[b], #56]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[60] * B[13]\n\t" - "ldr r8, [%[a], #240]\n\t" - "ldr r9, [%[b], #52]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[61] * B[12]\n\t" - "ldr r8, [%[a], #244]\n\t" - "ldr r9, [%[b], #48]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[62] * B[11]\n\t" - "ldr r8, [%[a], #248]\n\t" - "ldr r9, [%[b], #44]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[63] * B[10]\n\t" - "ldr r8, [%[a], #252]\n\t" - "ldr r9, [%[b], #40]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "str r4, [%[r], #292]\n\t" - "# A[11] * B[63]\n\t" - "ldr r8, [%[a], #44]\n\t" - "ldr r9, [%[b], #252]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r10, r10\n\t" - "# A[12] * B[62]\n\t" - "ldr r8, [%[a], #48]\n\t" - "ldr r9, [%[b], #248]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[13] * B[61]\n\t" - "ldr r8, [%[a], #52]\n\t" - "ldr r9, [%[b], #244]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[14] * B[60]\n\t" - "ldr r8, [%[a], #56]\n\t" - "ldr r9, [%[b], #240]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[15] * B[59]\n\t" - "ldr r8, [%[a], #60]\n\t" - "ldr r9, [%[b], #236]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[16] * B[58]\n\t" - "ldr r8, [%[a], #64]\n\t" - "ldr r9, [%[b], #232]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[17] * B[57]\n\t" - "ldr r8, [%[a], #68]\n\t" - "ldr r9, [%[b], #228]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[18] * B[56]\n\t" - "ldr r8, [%[a], #72]\n\t" - "ldr r9, [%[b], #224]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[19] * B[55]\n\t" - "ldr r8, [%[a], #76]\n\t" - "ldr r9, [%[b], #220]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[20] * B[54]\n\t" - "ldr r8, [%[a], #80]\n\t" - "ldr r9, [%[b], #216]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[21] * B[53]\n\t" - "ldr r8, [%[a], #84]\n\t" - "ldr r9, [%[b], #212]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[22] * B[52]\n\t" - "ldr r8, [%[a], #88]\n\t" - "ldr r9, [%[b], #208]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[23] * B[51]\n\t" - "ldr r8, [%[a], #92]\n\t" - "ldr r9, [%[b], #204]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[24] * B[50]\n\t" - "ldr r8, [%[a], #96]\n\t" - "ldr r9, [%[b], #200]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[25] * B[49]\n\t" - "ldr r8, [%[a], #100]\n\t" - "ldr r9, [%[b], #196]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[26] * B[48]\n\t" - "ldr r8, [%[a], #104]\n\t" - "ldr r9, [%[b], #192]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[27] * B[47]\n\t" - "ldr r8, [%[a], #108]\n\t" - "ldr r9, [%[b], #188]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[28] * B[46]\n\t" - "ldr r8, [%[a], #112]\n\t" - "ldr r9, [%[b], #184]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[29] * B[45]\n\t" - "ldr r8, [%[a], #116]\n\t" - "ldr r9, [%[b], #180]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[30] * B[44]\n\t" - "ldr r8, [%[a], #120]\n\t" - "ldr r9, [%[b], #176]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[31] * B[43]\n\t" - "ldr r8, [%[a], #124]\n\t" - "ldr r9, [%[b], #172]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[32] * B[42]\n\t" - "ldr r8, [%[a], #128]\n\t" - "ldr r9, [%[b], #168]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[33] * B[41]\n\t" - "ldr r8, [%[a], #132]\n\t" - "ldr r9, [%[b], #164]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[34] * B[40]\n\t" - "ldr r8, [%[a], #136]\n\t" - "ldr r9, [%[b], #160]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[35] * B[39]\n\t" - "ldr r8, [%[a], #140]\n\t" - "ldr r9, [%[b], #156]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[36] * B[38]\n\t" - "ldr r8, [%[a], #144]\n\t" - "ldr r9, [%[b], #152]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[37] * B[37]\n\t" - "ldr r8, [%[a], #148]\n\t" - "ldr r9, [%[b], #148]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[38] * B[36]\n\t" - "ldr r8, [%[a], #152]\n\t" - "ldr r9, [%[b], #144]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[39] * B[35]\n\t" - "ldr r8, [%[a], #156]\n\t" - "ldr r9, [%[b], #140]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[40] * B[34]\n\t" - "ldr r8, [%[a], #160]\n\t" - "ldr r9, [%[b], #136]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[41] * B[33]\n\t" - "ldr r8, [%[a], #164]\n\t" - "ldr r9, [%[b], #132]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[42] * B[32]\n\t" - "ldr r8, [%[a], #168]\n\t" - "ldr r9, [%[b], #128]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[43] * B[31]\n\t" - "ldr r8, [%[a], #172]\n\t" - "ldr r9, [%[b], #124]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[44] * B[30]\n\t" - "ldr r8, [%[a], #176]\n\t" - "ldr r9, [%[b], #120]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[45] * B[29]\n\t" - "ldr r8, [%[a], #180]\n\t" - "ldr r9, [%[b], #116]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[46] * B[28]\n\t" - "ldr r8, [%[a], #184]\n\t" - "ldr r9, [%[b], #112]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[47] * B[27]\n\t" - "ldr r8, [%[a], #188]\n\t" - "ldr r9, [%[b], #108]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[48] * B[26]\n\t" - "ldr r8, [%[a], #192]\n\t" - "ldr r9, [%[b], #104]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[49] * B[25]\n\t" - "ldr r8, [%[a], #196]\n\t" - "ldr r9, [%[b], #100]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[50] * B[24]\n\t" - "ldr r8, [%[a], #200]\n\t" - "ldr r9, [%[b], #96]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[51] * B[23]\n\t" - "ldr r8, [%[a], #204]\n\t" - "ldr r9, [%[b], #92]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[52] * B[22]\n\t" - "ldr r8, [%[a], #208]\n\t" - "ldr r9, [%[b], #88]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[53] * B[21]\n\t" - "ldr r8, [%[a], #212]\n\t" - "ldr r9, [%[b], #84]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[54] * B[20]\n\t" - "ldr r8, [%[a], #216]\n\t" - "ldr r9, [%[b], #80]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[55] * B[19]\n\t" - "ldr r8, [%[a], #220]\n\t" - "ldr r9, [%[b], #76]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[56] * B[18]\n\t" - "ldr r8, [%[a], #224]\n\t" - "ldr r9, [%[b], #72]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[57] * B[17]\n\t" - "ldr r8, [%[a], #228]\n\t" - "ldr r9, [%[b], #68]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[58] * B[16]\n\t" - "ldr r8, [%[a], #232]\n\t" - "ldr r9, [%[b], #64]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[59] * B[15]\n\t" - "ldr r8, [%[a], #236]\n\t" - "ldr r9, [%[b], #60]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[60] * B[14]\n\t" - "ldr r8, [%[a], #240]\n\t" - "ldr r9, [%[b], #56]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[61] * B[13]\n\t" - "ldr r8, [%[a], #244]\n\t" - "ldr r9, [%[b], #52]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[62] * B[12]\n\t" - "ldr r8, [%[a], #248]\n\t" - "ldr r9, [%[b], #48]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[63] * B[11]\n\t" - "ldr r8, [%[a], #252]\n\t" - "ldr r9, [%[b], #44]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "str r5, [%[r], #296]\n\t" - "# A[12] * B[63]\n\t" - "ldr r8, [%[a], #48]\n\t" - "ldr r9, [%[b], #252]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r10, r10\n\t" - "# A[13] * B[62]\n\t" - "ldr r8, [%[a], #52]\n\t" - "ldr r9, [%[b], #248]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[14] * B[61]\n\t" - "ldr r8, [%[a], #56]\n\t" - "ldr r9, [%[b], #244]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[15] * B[60]\n\t" - "ldr r8, [%[a], #60]\n\t" - "ldr r9, [%[b], #240]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[16] * B[59]\n\t" - "ldr r8, [%[a], #64]\n\t" - "ldr r9, [%[b], #236]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[17] * B[58]\n\t" - "ldr r8, [%[a], #68]\n\t" - "ldr r9, [%[b], #232]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[18] * B[57]\n\t" - "ldr r8, [%[a], #72]\n\t" - "ldr r9, [%[b], #228]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[19] * B[56]\n\t" - "ldr r8, [%[a], #76]\n\t" - "ldr r9, [%[b], #224]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[20] * B[55]\n\t" - "ldr r8, [%[a], #80]\n\t" - "ldr r9, [%[b], #220]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[21] * B[54]\n\t" - "ldr r8, [%[a], #84]\n\t" - "ldr r9, [%[b], #216]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[22] * B[53]\n\t" - "ldr r8, [%[a], #88]\n\t" - "ldr r9, [%[b], #212]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[23] * B[52]\n\t" - "ldr r8, [%[a], #92]\n\t" - "ldr r9, [%[b], #208]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[24] * B[51]\n\t" - "ldr r8, [%[a], #96]\n\t" - "ldr r9, [%[b], #204]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[25] * B[50]\n\t" - "ldr r8, [%[a], #100]\n\t" - "ldr r9, [%[b], #200]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[26] * B[49]\n\t" - "ldr r8, [%[a], #104]\n\t" - "ldr r9, [%[b], #196]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[27] * B[48]\n\t" - "ldr r8, [%[a], #108]\n\t" - "ldr r9, [%[b], #192]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[28] * B[47]\n\t" - "ldr r8, [%[a], #112]\n\t" - "ldr r9, [%[b], #188]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[29] * B[46]\n\t" - "ldr r8, [%[a], #116]\n\t" - "ldr r9, [%[b], #184]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[30] * B[45]\n\t" - "ldr r8, [%[a], #120]\n\t" - "ldr r9, [%[b], #180]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[31] * B[44]\n\t" - "ldr r8, [%[a], #124]\n\t" - "ldr r9, [%[b], #176]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[32] * B[43]\n\t" - "ldr r8, [%[a], #128]\n\t" - "ldr r9, [%[b], #172]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[33] * B[42]\n\t" - "ldr r8, [%[a], #132]\n\t" - "ldr r9, [%[b], #168]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[34] * B[41]\n\t" - "ldr r8, [%[a], #136]\n\t" - "ldr r9, [%[b], #164]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[35] * B[40]\n\t" - "ldr r8, [%[a], #140]\n\t" - "ldr r9, [%[b], #160]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[36] * B[39]\n\t" - "ldr r8, [%[a], #144]\n\t" - "ldr r9, [%[b], #156]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[37] * B[38]\n\t" - "ldr r8, [%[a], #148]\n\t" - "ldr r9, [%[b], #152]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[38] * B[37]\n\t" - "ldr r8, [%[a], #152]\n\t" - "ldr r9, [%[b], #148]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[39] * B[36]\n\t" - "ldr r8, [%[a], #156]\n\t" - "ldr r9, [%[b], #144]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[40] * B[35]\n\t" - "ldr r8, [%[a], #160]\n\t" - "ldr r9, [%[b], #140]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[41] * B[34]\n\t" - "ldr r8, [%[a], #164]\n\t" - "ldr r9, [%[b], #136]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[42] * B[33]\n\t" - "ldr r8, [%[a], #168]\n\t" - "ldr r9, [%[b], #132]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[43] * B[32]\n\t" - "ldr r8, [%[a], #172]\n\t" - "ldr r9, [%[b], #128]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[44] * B[31]\n\t" - "ldr r8, [%[a], #176]\n\t" - "ldr r9, [%[b], #124]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[45] * B[30]\n\t" - "ldr r8, [%[a], #180]\n\t" - "ldr r9, [%[b], #120]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[46] * B[29]\n\t" - "ldr r8, [%[a], #184]\n\t" - "ldr r9, [%[b], #116]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[47] * B[28]\n\t" - "ldr r8, [%[a], #188]\n\t" - "ldr r9, [%[b], #112]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[48] * B[27]\n\t" - "ldr r8, [%[a], #192]\n\t" - "ldr r9, [%[b], #108]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[49] * B[26]\n\t" - "ldr r8, [%[a], #196]\n\t" - "ldr r9, [%[b], #104]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[50] * B[25]\n\t" - "ldr r8, [%[a], #200]\n\t" - "ldr r9, [%[b], #100]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[51] * B[24]\n\t" - "ldr r8, [%[a], #204]\n\t" - "ldr r9, [%[b], #96]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[52] * B[23]\n\t" - "ldr r8, [%[a], #208]\n\t" - "ldr r9, [%[b], #92]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[53] * B[22]\n\t" - "ldr r8, [%[a], #212]\n\t" - "ldr r9, [%[b], #88]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[54] * B[21]\n\t" - "ldr r8, [%[a], #216]\n\t" - "ldr r9, [%[b], #84]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[55] * B[20]\n\t" - "ldr r8, [%[a], #220]\n\t" - "ldr r9, [%[b], #80]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[56] * B[19]\n\t" - "ldr r8, [%[a], #224]\n\t" - "ldr r9, [%[b], #76]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[57] * B[18]\n\t" - "ldr r8, [%[a], #228]\n\t" - "ldr r9, [%[b], #72]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[58] * B[17]\n\t" - "ldr r8, [%[a], #232]\n\t" - "ldr r9, [%[b], #68]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[59] * B[16]\n\t" - "ldr r8, [%[a], #236]\n\t" - "ldr r9, [%[b], #64]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[60] * B[15]\n\t" - "ldr r8, [%[a], #240]\n\t" - "ldr r9, [%[b], #60]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[61] * B[14]\n\t" - "ldr r8, [%[a], #244]\n\t" - "ldr r9, [%[b], #56]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[62] * B[13]\n\t" - "ldr r8, [%[a], #248]\n\t" - "ldr r9, [%[b], #52]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[63] * B[12]\n\t" - "ldr r8, [%[a], #252]\n\t" - "ldr r9, [%[b], #48]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "str r3, [%[r], #300]\n\t" - "# A[13] * B[63]\n\t" - "ldr r8, [%[a], #52]\n\t" - "ldr r9, [%[b], #252]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r10, r10\n\t" - "# A[14] * B[62]\n\t" - "ldr r8, [%[a], #56]\n\t" - "ldr r9, [%[b], #248]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[15] * B[61]\n\t" - "ldr r8, [%[a], #60]\n\t" - "ldr r9, [%[b], #244]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[16] * B[60]\n\t" - "ldr r8, [%[a], #64]\n\t" - "ldr r9, [%[b], #240]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[17] * B[59]\n\t" - "ldr r8, [%[a], #68]\n\t" - "ldr r9, [%[b], #236]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[18] * B[58]\n\t" - "ldr r8, [%[a], #72]\n\t" - "ldr r9, [%[b], #232]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[19] * B[57]\n\t" - "ldr r8, [%[a], #76]\n\t" - "ldr r9, [%[b], #228]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[20] * B[56]\n\t" - "ldr r8, [%[a], #80]\n\t" - "ldr r9, [%[b], #224]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[21] * B[55]\n\t" - "ldr r8, [%[a], #84]\n\t" - "ldr r9, [%[b], #220]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[22] * B[54]\n\t" - "ldr r8, [%[a], #88]\n\t" - "ldr r9, [%[b], #216]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[23] * B[53]\n\t" - "ldr r8, [%[a], #92]\n\t" - "ldr r9, [%[b], #212]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[24] * B[52]\n\t" - "ldr r8, [%[a], #96]\n\t" - "ldr r9, [%[b], #208]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[25] * B[51]\n\t" - "ldr r8, [%[a], #100]\n\t" - "ldr r9, [%[b], #204]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[26] * B[50]\n\t" - "ldr r8, [%[a], #104]\n\t" - "ldr r9, [%[b], #200]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[27] * B[49]\n\t" - "ldr r8, [%[a], #108]\n\t" - "ldr r9, [%[b], #196]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[28] * B[48]\n\t" - "ldr r8, [%[a], #112]\n\t" - "ldr r9, [%[b], #192]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[29] * B[47]\n\t" - "ldr r8, [%[a], #116]\n\t" - "ldr r9, [%[b], #188]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[30] * B[46]\n\t" - "ldr r8, [%[a], #120]\n\t" - "ldr r9, [%[b], #184]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[31] * B[45]\n\t" - "ldr r8, [%[a], #124]\n\t" - "ldr r9, [%[b], #180]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[32] * B[44]\n\t" - "ldr r8, [%[a], #128]\n\t" - "ldr r9, [%[b], #176]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[33] * B[43]\n\t" - "ldr r8, [%[a], #132]\n\t" - "ldr r9, [%[b], #172]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[34] * B[42]\n\t" - "ldr r8, [%[a], #136]\n\t" - "ldr r9, [%[b], #168]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[35] * B[41]\n\t" - "ldr r8, [%[a], #140]\n\t" - "ldr r9, [%[b], #164]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[36] * B[40]\n\t" - "ldr r8, [%[a], #144]\n\t" - "ldr r9, [%[b], #160]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[37] * B[39]\n\t" - "ldr r8, [%[a], #148]\n\t" - "ldr r9, [%[b], #156]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[38] * B[38]\n\t" - "ldr r8, [%[a], #152]\n\t" - "ldr r9, [%[b], #152]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[39] * B[37]\n\t" - "ldr r8, [%[a], #156]\n\t" - "ldr r9, [%[b], #148]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[40] * B[36]\n\t" - "ldr r8, [%[a], #160]\n\t" - "ldr r9, [%[b], #144]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[41] * B[35]\n\t" - "ldr r8, [%[a], #164]\n\t" - "ldr r9, [%[b], #140]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[42] * B[34]\n\t" - "ldr r8, [%[a], #168]\n\t" - "ldr r9, [%[b], #136]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[43] * B[33]\n\t" - "ldr r8, [%[a], #172]\n\t" - "ldr r9, [%[b], #132]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[44] * B[32]\n\t" - "ldr r8, [%[a], #176]\n\t" - "ldr r9, [%[b], #128]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[45] * B[31]\n\t" - "ldr r8, [%[a], #180]\n\t" - "ldr r9, [%[b], #124]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[46] * B[30]\n\t" - "ldr r8, [%[a], #184]\n\t" - "ldr r9, [%[b], #120]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[47] * B[29]\n\t" - "ldr r8, [%[a], #188]\n\t" - "ldr r9, [%[b], #116]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[48] * B[28]\n\t" - "ldr r8, [%[a], #192]\n\t" - "ldr r9, [%[b], #112]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[49] * B[27]\n\t" - "ldr r8, [%[a], #196]\n\t" - "ldr r9, [%[b], #108]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[50] * B[26]\n\t" - "ldr r8, [%[a], #200]\n\t" - "ldr r9, [%[b], #104]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[51] * B[25]\n\t" - "ldr r8, [%[a], #204]\n\t" - "ldr r9, [%[b], #100]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[52] * B[24]\n\t" - "ldr r8, [%[a], #208]\n\t" - "ldr r9, [%[b], #96]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[53] * B[23]\n\t" - "ldr r8, [%[a], #212]\n\t" - "ldr r9, [%[b], #92]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[54] * B[22]\n\t" - "ldr r8, [%[a], #216]\n\t" - "ldr r9, [%[b], #88]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[55] * B[21]\n\t" - "ldr r8, [%[a], #220]\n\t" - "ldr r9, [%[b], #84]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[56] * B[20]\n\t" - "ldr r8, [%[a], #224]\n\t" - "ldr r9, [%[b], #80]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[57] * B[19]\n\t" - "ldr r8, [%[a], #228]\n\t" - "ldr r9, [%[b], #76]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[58] * B[18]\n\t" - "ldr r8, [%[a], #232]\n\t" - "ldr r9, [%[b], #72]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[59] * B[17]\n\t" - "ldr r8, [%[a], #236]\n\t" - "ldr r9, [%[b], #68]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[60] * B[16]\n\t" - "ldr r8, [%[a], #240]\n\t" - "ldr r9, [%[b], #64]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[61] * B[15]\n\t" - "ldr r8, [%[a], #244]\n\t" - "ldr r9, [%[b], #60]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[62] * B[14]\n\t" - "ldr r8, [%[a], #248]\n\t" - "ldr r9, [%[b], #56]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[63] * B[13]\n\t" - "ldr r8, [%[a], #252]\n\t" - "ldr r9, [%[b], #52]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "str r4, [%[r], #304]\n\t" - "# A[14] * B[63]\n\t" - "ldr r8, [%[a], #56]\n\t" - "ldr r9, [%[b], #252]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r10, r10\n\t" - "# A[15] * B[62]\n\t" - "ldr r8, [%[a], #60]\n\t" - "ldr r9, [%[b], #248]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[16] * B[61]\n\t" - "ldr r8, [%[a], #64]\n\t" - "ldr r9, [%[b], #244]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[17] * B[60]\n\t" - "ldr r8, [%[a], #68]\n\t" - "ldr r9, [%[b], #240]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[18] * B[59]\n\t" - "ldr r8, [%[a], #72]\n\t" - "ldr r9, [%[b], #236]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[19] * B[58]\n\t" - "ldr r8, [%[a], #76]\n\t" - "ldr r9, [%[b], #232]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[20] * B[57]\n\t" - "ldr r8, [%[a], #80]\n\t" - "ldr r9, [%[b], #228]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[21] * B[56]\n\t" - "ldr r8, [%[a], #84]\n\t" - "ldr r9, [%[b], #224]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[22] * B[55]\n\t" - "ldr r8, [%[a], #88]\n\t" - "ldr r9, [%[b], #220]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[23] * B[54]\n\t" - "ldr r8, [%[a], #92]\n\t" - "ldr r9, [%[b], #216]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[24] * B[53]\n\t" - "ldr r8, [%[a], #96]\n\t" - "ldr r9, [%[b], #212]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[25] * B[52]\n\t" - "ldr r8, [%[a], #100]\n\t" - "ldr r9, [%[b], #208]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[26] * B[51]\n\t" - "ldr r8, [%[a], #104]\n\t" - "ldr r9, [%[b], #204]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[27] * B[50]\n\t" - "ldr r8, [%[a], #108]\n\t" - "ldr r9, [%[b], #200]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[28] * B[49]\n\t" - "ldr r8, [%[a], #112]\n\t" - "ldr r9, [%[b], #196]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[29] * B[48]\n\t" - "ldr r8, [%[a], #116]\n\t" - "ldr r9, [%[b], #192]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[30] * B[47]\n\t" - "ldr r8, [%[a], #120]\n\t" - "ldr r9, [%[b], #188]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[31] * B[46]\n\t" - "ldr r8, [%[a], #124]\n\t" - "ldr r9, [%[b], #184]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[32] * B[45]\n\t" - "ldr r8, [%[a], #128]\n\t" - "ldr r9, [%[b], #180]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[33] * B[44]\n\t" - "ldr r8, [%[a], #132]\n\t" - "ldr r9, [%[b], #176]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[34] * B[43]\n\t" - "ldr r8, [%[a], #136]\n\t" - "ldr r9, [%[b], #172]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[35] * B[42]\n\t" - "ldr r8, [%[a], #140]\n\t" - "ldr r9, [%[b], #168]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[36] * B[41]\n\t" - "ldr r8, [%[a], #144]\n\t" - "ldr r9, [%[b], #164]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[37] * B[40]\n\t" - "ldr r8, [%[a], #148]\n\t" - "ldr r9, [%[b], #160]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[38] * B[39]\n\t" - "ldr r8, [%[a], #152]\n\t" - "ldr r9, [%[b], #156]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[39] * B[38]\n\t" - "ldr r8, [%[a], #156]\n\t" - "ldr r9, [%[b], #152]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[40] * B[37]\n\t" - "ldr r8, [%[a], #160]\n\t" - "ldr r9, [%[b], #148]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[41] * B[36]\n\t" - "ldr r8, [%[a], #164]\n\t" - "ldr r9, [%[b], #144]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[42] * B[35]\n\t" - "ldr r8, [%[a], #168]\n\t" - "ldr r9, [%[b], #140]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[43] * B[34]\n\t" - "ldr r8, [%[a], #172]\n\t" - "ldr r9, [%[b], #136]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[44] * B[33]\n\t" - "ldr r8, [%[a], #176]\n\t" - "ldr r9, [%[b], #132]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[45] * B[32]\n\t" - "ldr r8, [%[a], #180]\n\t" - "ldr r9, [%[b], #128]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[46] * B[31]\n\t" - "ldr r8, [%[a], #184]\n\t" - "ldr r9, [%[b], #124]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[47] * B[30]\n\t" - "ldr r8, [%[a], #188]\n\t" - "ldr r9, [%[b], #120]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[48] * B[29]\n\t" - "ldr r8, [%[a], #192]\n\t" - "ldr r9, [%[b], #116]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[49] * B[28]\n\t" - "ldr r8, [%[a], #196]\n\t" - "ldr r9, [%[b], #112]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[50] * B[27]\n\t" - "ldr r8, [%[a], #200]\n\t" - "ldr r9, [%[b], #108]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[51] * B[26]\n\t" - "ldr r8, [%[a], #204]\n\t" - "ldr r9, [%[b], #104]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[52] * B[25]\n\t" - "ldr r8, [%[a], #208]\n\t" - "ldr r9, [%[b], #100]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[53] * B[24]\n\t" - "ldr r8, [%[a], #212]\n\t" - "ldr r9, [%[b], #96]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[54] * B[23]\n\t" - "ldr r8, [%[a], #216]\n\t" - "ldr r9, [%[b], #92]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[55] * B[22]\n\t" - "ldr r8, [%[a], #220]\n\t" - "ldr r9, [%[b], #88]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[56] * B[21]\n\t" - "ldr r8, [%[a], #224]\n\t" - "ldr r9, [%[b], #84]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[57] * B[20]\n\t" - "ldr r8, [%[a], #228]\n\t" - "ldr r9, [%[b], #80]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[58] * B[19]\n\t" - "ldr r8, [%[a], #232]\n\t" - "ldr r9, [%[b], #76]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[59] * B[18]\n\t" - "ldr r8, [%[a], #236]\n\t" - "ldr r9, [%[b], #72]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[60] * B[17]\n\t" - "ldr r8, [%[a], #240]\n\t" - "ldr r9, [%[b], #68]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[61] * B[16]\n\t" - "ldr r8, [%[a], #244]\n\t" - "ldr r9, [%[b], #64]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[62] * B[15]\n\t" - "ldr r8, [%[a], #248]\n\t" - "ldr r9, [%[b], #60]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[63] * B[14]\n\t" - "ldr r8, [%[a], #252]\n\t" - "ldr r9, [%[b], #56]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "str r5, [%[r], #308]\n\t" - "# A[15] * B[63]\n\t" - "ldr r8, [%[a], #60]\n\t" - "ldr r9, [%[b], #252]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r10, r10\n\t" - "# A[16] * B[62]\n\t" - "ldr r8, [%[a], #64]\n\t" - "ldr r9, [%[b], #248]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[17] * B[61]\n\t" - "ldr r8, [%[a], #68]\n\t" - "ldr r9, [%[b], #244]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[18] * B[60]\n\t" - "ldr r8, [%[a], #72]\n\t" - "ldr r9, [%[b], #240]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[19] * B[59]\n\t" - "ldr r8, [%[a], #76]\n\t" - "ldr r9, [%[b], #236]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[20] * B[58]\n\t" - "ldr r8, [%[a], #80]\n\t" - "ldr r9, [%[b], #232]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[21] * B[57]\n\t" - "ldr r8, [%[a], #84]\n\t" - "ldr r9, [%[b], #228]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[22] * B[56]\n\t" - "ldr r8, [%[a], #88]\n\t" - "ldr r9, [%[b], #224]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[23] * B[55]\n\t" - "ldr r8, [%[a], #92]\n\t" - "ldr r9, [%[b], #220]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[24] * B[54]\n\t" - "ldr r8, [%[a], #96]\n\t" - "ldr r9, [%[b], #216]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[25] * B[53]\n\t" - "ldr r8, [%[a], #100]\n\t" - "ldr r9, [%[b], #212]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[26] * B[52]\n\t" - "ldr r8, [%[a], #104]\n\t" - "ldr r9, [%[b], #208]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[27] * B[51]\n\t" - "ldr r8, [%[a], #108]\n\t" - "ldr r9, [%[b], #204]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[28] * B[50]\n\t" - "ldr r8, [%[a], #112]\n\t" - "ldr r9, [%[b], #200]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[29] * B[49]\n\t" - "ldr r8, [%[a], #116]\n\t" - "ldr r9, [%[b], #196]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[30] * B[48]\n\t" - "ldr r8, [%[a], #120]\n\t" - "ldr r9, [%[b], #192]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[31] * B[47]\n\t" - "ldr r8, [%[a], #124]\n\t" - "ldr r9, [%[b], #188]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[32] * B[46]\n\t" - "ldr r8, [%[a], #128]\n\t" - "ldr r9, [%[b], #184]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[33] * B[45]\n\t" - "ldr r8, [%[a], #132]\n\t" - "ldr r9, [%[b], #180]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[34] * B[44]\n\t" - "ldr r8, [%[a], #136]\n\t" - "ldr r9, [%[b], #176]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[35] * B[43]\n\t" - "ldr r8, [%[a], #140]\n\t" - "ldr r9, [%[b], #172]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[36] * B[42]\n\t" - "ldr r8, [%[a], #144]\n\t" - "ldr r9, [%[b], #168]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[37] * B[41]\n\t" - "ldr r8, [%[a], #148]\n\t" - "ldr r9, [%[b], #164]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[38] * B[40]\n\t" - "ldr r8, [%[a], #152]\n\t" - "ldr r9, [%[b], #160]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[39] * B[39]\n\t" - "ldr r8, [%[a], #156]\n\t" - "ldr r9, [%[b], #156]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[40] * B[38]\n\t" - "ldr r8, [%[a], #160]\n\t" - "ldr r9, [%[b], #152]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[41] * B[37]\n\t" - "ldr r8, [%[a], #164]\n\t" - "ldr r9, [%[b], #148]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[42] * B[36]\n\t" - "ldr r8, [%[a], #168]\n\t" - "ldr r9, [%[b], #144]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[43] * B[35]\n\t" - "ldr r8, [%[a], #172]\n\t" - "ldr r9, [%[b], #140]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[44] * B[34]\n\t" - "ldr r8, [%[a], #176]\n\t" - "ldr r9, [%[b], #136]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[45] * B[33]\n\t" - "ldr r8, [%[a], #180]\n\t" - "ldr r9, [%[b], #132]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[46] * B[32]\n\t" - "ldr r8, [%[a], #184]\n\t" - "ldr r9, [%[b], #128]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[47] * B[31]\n\t" - "ldr r8, [%[a], #188]\n\t" - "ldr r9, [%[b], #124]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[48] * B[30]\n\t" - "ldr r8, [%[a], #192]\n\t" - "ldr r9, [%[b], #120]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[49] * B[29]\n\t" - "ldr r8, [%[a], #196]\n\t" - "ldr r9, [%[b], #116]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[50] * B[28]\n\t" - "ldr r8, [%[a], #200]\n\t" - "ldr r9, [%[b], #112]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[51] * B[27]\n\t" - "ldr r8, [%[a], #204]\n\t" - "ldr r9, [%[b], #108]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[52] * B[26]\n\t" - "ldr r8, [%[a], #208]\n\t" - "ldr r9, [%[b], #104]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[53] * B[25]\n\t" - "ldr r8, [%[a], #212]\n\t" - "ldr r9, [%[b], #100]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[54] * B[24]\n\t" - "ldr r8, [%[a], #216]\n\t" - "ldr r9, [%[b], #96]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[55] * B[23]\n\t" - "ldr r8, [%[a], #220]\n\t" - "ldr r9, [%[b], #92]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[56] * B[22]\n\t" - "ldr r8, [%[a], #224]\n\t" - "ldr r9, [%[b], #88]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[57] * B[21]\n\t" - "ldr r8, [%[a], #228]\n\t" - "ldr r9, [%[b], #84]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[58] * B[20]\n\t" - "ldr r8, [%[a], #232]\n\t" - "ldr r9, [%[b], #80]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[59] * B[19]\n\t" - "ldr r8, [%[a], #236]\n\t" - "ldr r9, [%[b], #76]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[60] * B[18]\n\t" - "ldr r8, [%[a], #240]\n\t" - "ldr r9, [%[b], #72]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[61] * B[17]\n\t" - "ldr r8, [%[a], #244]\n\t" - "ldr r9, [%[b], #68]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[62] * B[16]\n\t" - "ldr r8, [%[a], #248]\n\t" - "ldr r9, [%[b], #64]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[63] * B[15]\n\t" - "ldr r8, [%[a], #252]\n\t" - "ldr r9, [%[b], #60]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "str r3, [%[r], #312]\n\t" - "# A[16] * B[63]\n\t" - "ldr r8, [%[a], #64]\n\t" - "ldr r9, [%[b], #252]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r10, r10\n\t" - "# A[17] * B[62]\n\t" - "ldr r8, [%[a], #68]\n\t" - "ldr r9, [%[b], #248]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[18] * B[61]\n\t" - "ldr r8, [%[a], #72]\n\t" - "ldr r9, [%[b], #244]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[19] * B[60]\n\t" - "ldr r8, [%[a], #76]\n\t" - "ldr r9, [%[b], #240]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[20] * B[59]\n\t" - "ldr r8, [%[a], #80]\n\t" - "ldr r9, [%[b], #236]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[21] * B[58]\n\t" - "ldr r8, [%[a], #84]\n\t" - "ldr r9, [%[b], #232]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[22] * B[57]\n\t" - "ldr r8, [%[a], #88]\n\t" - "ldr r9, [%[b], #228]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[23] * B[56]\n\t" - "ldr r8, [%[a], #92]\n\t" - "ldr r9, [%[b], #224]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[24] * B[55]\n\t" - "ldr r8, [%[a], #96]\n\t" - "ldr r9, [%[b], #220]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[25] * B[54]\n\t" - "ldr r8, [%[a], #100]\n\t" - "ldr r9, [%[b], #216]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[26] * B[53]\n\t" - "ldr r8, [%[a], #104]\n\t" - "ldr r9, [%[b], #212]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[27] * B[52]\n\t" - "ldr r8, [%[a], #108]\n\t" - "ldr r9, [%[b], #208]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[28] * B[51]\n\t" - "ldr r8, [%[a], #112]\n\t" - "ldr r9, [%[b], #204]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[29] * B[50]\n\t" - "ldr r8, [%[a], #116]\n\t" - "ldr r9, [%[b], #200]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[30] * B[49]\n\t" - "ldr r8, [%[a], #120]\n\t" - "ldr r9, [%[b], #196]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[31] * B[48]\n\t" - "ldr r8, [%[a], #124]\n\t" - "ldr r9, [%[b], #192]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[32] * B[47]\n\t" - "ldr r8, [%[a], #128]\n\t" - "ldr r9, [%[b], #188]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[33] * B[46]\n\t" - "ldr r8, [%[a], #132]\n\t" - "ldr r9, [%[b], #184]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[34] * B[45]\n\t" - "ldr r8, [%[a], #136]\n\t" - "ldr r9, [%[b], #180]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[35] * B[44]\n\t" - "ldr r8, [%[a], #140]\n\t" - "ldr r9, [%[b], #176]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[36] * B[43]\n\t" - "ldr r8, [%[a], #144]\n\t" - "ldr r9, [%[b], #172]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[37] * B[42]\n\t" - "ldr r8, [%[a], #148]\n\t" - "ldr r9, [%[b], #168]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[38] * B[41]\n\t" - "ldr r8, [%[a], #152]\n\t" - "ldr r9, [%[b], #164]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[39] * B[40]\n\t" - "ldr r8, [%[a], #156]\n\t" - "ldr r9, [%[b], #160]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[40] * B[39]\n\t" - "ldr r8, [%[a], #160]\n\t" - "ldr r9, [%[b], #156]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[41] * B[38]\n\t" - "ldr r8, [%[a], #164]\n\t" - "ldr r9, [%[b], #152]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[42] * B[37]\n\t" - "ldr r8, [%[a], #168]\n\t" - "ldr r9, [%[b], #148]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[43] * B[36]\n\t" - "ldr r8, [%[a], #172]\n\t" - "ldr r9, [%[b], #144]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[44] * B[35]\n\t" - "ldr r8, [%[a], #176]\n\t" - "ldr r9, [%[b], #140]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[45] * B[34]\n\t" - "ldr r8, [%[a], #180]\n\t" - "ldr r9, [%[b], #136]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[46] * B[33]\n\t" - "ldr r8, [%[a], #184]\n\t" - "ldr r9, [%[b], #132]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[47] * B[32]\n\t" - "ldr r8, [%[a], #188]\n\t" - "ldr r9, [%[b], #128]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[48] * B[31]\n\t" - "ldr r8, [%[a], #192]\n\t" - "ldr r9, [%[b], #124]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[49] * B[30]\n\t" - "ldr r8, [%[a], #196]\n\t" - "ldr r9, [%[b], #120]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[50] * B[29]\n\t" - "ldr r8, [%[a], #200]\n\t" - "ldr r9, [%[b], #116]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[51] * B[28]\n\t" - "ldr r8, [%[a], #204]\n\t" - "ldr r9, [%[b], #112]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[52] * B[27]\n\t" - "ldr r8, [%[a], #208]\n\t" - "ldr r9, [%[b], #108]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[53] * B[26]\n\t" - "ldr r8, [%[a], #212]\n\t" - "ldr r9, [%[b], #104]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[54] * B[25]\n\t" - "ldr r8, [%[a], #216]\n\t" - "ldr r9, [%[b], #100]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[55] * B[24]\n\t" - "ldr r8, [%[a], #220]\n\t" - "ldr r9, [%[b], #96]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[56] * B[23]\n\t" - "ldr r8, [%[a], #224]\n\t" - "ldr r9, [%[b], #92]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[57] * B[22]\n\t" - "ldr r8, [%[a], #228]\n\t" - "ldr r9, [%[b], #88]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[58] * B[21]\n\t" - "ldr r8, [%[a], #232]\n\t" - "ldr r9, [%[b], #84]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[59] * B[20]\n\t" - "ldr r8, [%[a], #236]\n\t" - "ldr r9, [%[b], #80]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[60] * B[19]\n\t" - "ldr r8, [%[a], #240]\n\t" - "ldr r9, [%[b], #76]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[61] * B[18]\n\t" - "ldr r8, [%[a], #244]\n\t" - "ldr r9, [%[b], #72]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[62] * B[17]\n\t" - "ldr r8, [%[a], #248]\n\t" - "ldr r9, [%[b], #68]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[63] * B[16]\n\t" - "ldr r8, [%[a], #252]\n\t" - "ldr r9, [%[b], #64]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "str r4, [%[r], #316]\n\t" - "# A[17] * B[63]\n\t" - "ldr r8, [%[a], #68]\n\t" - "ldr r9, [%[b], #252]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r10, r10\n\t" - "# A[18] * B[62]\n\t" - "ldr r8, [%[a], #72]\n\t" - "ldr r9, [%[b], #248]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[19] * B[61]\n\t" - "ldr r8, [%[a], #76]\n\t" - "ldr r9, [%[b], #244]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[20] * B[60]\n\t" - "ldr r8, [%[a], #80]\n\t" - "ldr r9, [%[b], #240]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[21] * B[59]\n\t" - "ldr r8, [%[a], #84]\n\t" - "ldr r9, [%[b], #236]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[22] * B[58]\n\t" - "ldr r8, [%[a], #88]\n\t" - "ldr r9, [%[b], #232]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[23] * B[57]\n\t" - "ldr r8, [%[a], #92]\n\t" - "ldr r9, [%[b], #228]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[24] * B[56]\n\t" - "ldr r8, [%[a], #96]\n\t" - "ldr r9, [%[b], #224]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[25] * B[55]\n\t" - "ldr r8, [%[a], #100]\n\t" - "ldr r9, [%[b], #220]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[26] * B[54]\n\t" - "ldr r8, [%[a], #104]\n\t" - "ldr r9, [%[b], #216]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[27] * B[53]\n\t" - "ldr r8, [%[a], #108]\n\t" - "ldr r9, [%[b], #212]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[28] * B[52]\n\t" - "ldr r8, [%[a], #112]\n\t" - "ldr r9, [%[b], #208]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[29] * B[51]\n\t" - "ldr r8, [%[a], #116]\n\t" - "ldr r9, [%[b], #204]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[30] * B[50]\n\t" - "ldr r8, [%[a], #120]\n\t" - "ldr r9, [%[b], #200]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[31] * B[49]\n\t" - "ldr r8, [%[a], #124]\n\t" - "ldr r9, [%[b], #196]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[32] * B[48]\n\t" - "ldr r8, [%[a], #128]\n\t" - "ldr r9, [%[b], #192]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[33] * B[47]\n\t" - "ldr r8, [%[a], #132]\n\t" - "ldr r9, [%[b], #188]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[34] * B[46]\n\t" - "ldr r8, [%[a], #136]\n\t" - "ldr r9, [%[b], #184]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[35] * B[45]\n\t" - "ldr r8, [%[a], #140]\n\t" - "ldr r9, [%[b], #180]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[36] * B[44]\n\t" - "ldr r8, [%[a], #144]\n\t" - "ldr r9, [%[b], #176]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[37] * B[43]\n\t" - "ldr r8, [%[a], #148]\n\t" - "ldr r9, [%[b], #172]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[38] * B[42]\n\t" - "ldr r8, [%[a], #152]\n\t" - "ldr r9, [%[b], #168]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[39] * B[41]\n\t" - "ldr r8, [%[a], #156]\n\t" - "ldr r9, [%[b], #164]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[40] * B[40]\n\t" - "ldr r8, [%[a], #160]\n\t" - "ldr r9, [%[b], #160]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[41] * B[39]\n\t" - "ldr r8, [%[a], #164]\n\t" - "ldr r9, [%[b], #156]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[42] * B[38]\n\t" - "ldr r8, [%[a], #168]\n\t" - "ldr r9, [%[b], #152]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[43] * B[37]\n\t" - "ldr r8, [%[a], #172]\n\t" - "ldr r9, [%[b], #148]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[44] * B[36]\n\t" - "ldr r8, [%[a], #176]\n\t" - "ldr r9, [%[b], #144]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[45] * B[35]\n\t" - "ldr r8, [%[a], #180]\n\t" - "ldr r9, [%[b], #140]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[46] * B[34]\n\t" - "ldr r8, [%[a], #184]\n\t" - "ldr r9, [%[b], #136]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[47] * B[33]\n\t" - "ldr r8, [%[a], #188]\n\t" - "ldr r9, [%[b], #132]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[48] * B[32]\n\t" - "ldr r8, [%[a], #192]\n\t" - "ldr r9, [%[b], #128]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[49] * B[31]\n\t" - "ldr r8, [%[a], #196]\n\t" - "ldr r9, [%[b], #124]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[50] * B[30]\n\t" - "ldr r8, [%[a], #200]\n\t" - "ldr r9, [%[b], #120]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[51] * B[29]\n\t" - "ldr r8, [%[a], #204]\n\t" - "ldr r9, [%[b], #116]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[52] * B[28]\n\t" - "ldr r8, [%[a], #208]\n\t" - "ldr r9, [%[b], #112]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[53] * B[27]\n\t" - "ldr r8, [%[a], #212]\n\t" - "ldr r9, [%[b], #108]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[54] * B[26]\n\t" - "ldr r8, [%[a], #216]\n\t" - "ldr r9, [%[b], #104]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[55] * B[25]\n\t" - "ldr r8, [%[a], #220]\n\t" - "ldr r9, [%[b], #100]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[56] * B[24]\n\t" - "ldr r8, [%[a], #224]\n\t" - "ldr r9, [%[b], #96]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[57] * B[23]\n\t" - "ldr r8, [%[a], #228]\n\t" - "ldr r9, [%[b], #92]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[58] * B[22]\n\t" - "ldr r8, [%[a], #232]\n\t" - "ldr r9, [%[b], #88]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[59] * B[21]\n\t" - "ldr r8, [%[a], #236]\n\t" - "ldr r9, [%[b], #84]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[60] * B[20]\n\t" - "ldr r8, [%[a], #240]\n\t" - "ldr r9, [%[b], #80]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[61] * B[19]\n\t" - "ldr r8, [%[a], #244]\n\t" - "ldr r9, [%[b], #76]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[62] * B[18]\n\t" - "ldr r8, [%[a], #248]\n\t" - "ldr r9, [%[b], #72]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[63] * B[17]\n\t" - "ldr r8, [%[a], #252]\n\t" - "ldr r9, [%[b], #68]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "str r5, [%[r], #320]\n\t" - "# A[18] * B[63]\n\t" - "ldr r8, [%[a], #72]\n\t" - "ldr r9, [%[b], #252]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r10, r10\n\t" - "# A[19] * B[62]\n\t" - "ldr r8, [%[a], #76]\n\t" - "ldr r9, [%[b], #248]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[20] * B[61]\n\t" - "ldr r8, [%[a], #80]\n\t" - "ldr r9, [%[b], #244]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[21] * B[60]\n\t" - "ldr r8, [%[a], #84]\n\t" - "ldr r9, [%[b], #240]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[22] * B[59]\n\t" - "ldr r8, [%[a], #88]\n\t" - "ldr r9, [%[b], #236]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[23] * B[58]\n\t" - "ldr r8, [%[a], #92]\n\t" - "ldr r9, [%[b], #232]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[24] * B[57]\n\t" - "ldr r8, [%[a], #96]\n\t" - "ldr r9, [%[b], #228]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[25] * B[56]\n\t" - "ldr r8, [%[a], #100]\n\t" - "ldr r9, [%[b], #224]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[26] * B[55]\n\t" - "ldr r8, [%[a], #104]\n\t" - "ldr r9, [%[b], #220]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[27] * B[54]\n\t" - "ldr r8, [%[a], #108]\n\t" - "ldr r9, [%[b], #216]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[28] * B[53]\n\t" - "ldr r8, [%[a], #112]\n\t" - "ldr r9, [%[b], #212]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[29] * B[52]\n\t" - "ldr r8, [%[a], #116]\n\t" - "ldr r9, [%[b], #208]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[30] * B[51]\n\t" - "ldr r8, [%[a], #120]\n\t" - "ldr r9, [%[b], #204]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[31] * B[50]\n\t" - "ldr r8, [%[a], #124]\n\t" - "ldr r9, [%[b], #200]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[32] * B[49]\n\t" - "ldr r8, [%[a], #128]\n\t" - "ldr r9, [%[b], #196]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[33] * B[48]\n\t" - "ldr r8, [%[a], #132]\n\t" - "ldr r9, [%[b], #192]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[34] * B[47]\n\t" - "ldr r8, [%[a], #136]\n\t" - "ldr r9, [%[b], #188]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[35] * B[46]\n\t" - "ldr r8, [%[a], #140]\n\t" - "ldr r9, [%[b], #184]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[36] * B[45]\n\t" - "ldr r8, [%[a], #144]\n\t" - "ldr r9, [%[b], #180]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[37] * B[44]\n\t" - "ldr r8, [%[a], #148]\n\t" - "ldr r9, [%[b], #176]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[38] * B[43]\n\t" - "ldr r8, [%[a], #152]\n\t" - "ldr r9, [%[b], #172]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[39] * B[42]\n\t" - "ldr r8, [%[a], #156]\n\t" - "ldr r9, [%[b], #168]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[40] * B[41]\n\t" - "ldr r8, [%[a], #160]\n\t" - "ldr r9, [%[b], #164]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[41] * B[40]\n\t" - "ldr r8, [%[a], #164]\n\t" - "ldr r9, [%[b], #160]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[42] * B[39]\n\t" - "ldr r8, [%[a], #168]\n\t" - "ldr r9, [%[b], #156]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[43] * B[38]\n\t" - "ldr r8, [%[a], #172]\n\t" - "ldr r9, [%[b], #152]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[44] * B[37]\n\t" - "ldr r8, [%[a], #176]\n\t" - "ldr r9, [%[b], #148]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[45] * B[36]\n\t" - "ldr r8, [%[a], #180]\n\t" - "ldr r9, [%[b], #144]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[46] * B[35]\n\t" - "ldr r8, [%[a], #184]\n\t" - "ldr r9, [%[b], #140]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[47] * B[34]\n\t" - "ldr r8, [%[a], #188]\n\t" - "ldr r9, [%[b], #136]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[48] * B[33]\n\t" - "ldr r8, [%[a], #192]\n\t" - "ldr r9, [%[b], #132]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[49] * B[32]\n\t" - "ldr r8, [%[a], #196]\n\t" - "ldr r9, [%[b], #128]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[50] * B[31]\n\t" - "ldr r8, [%[a], #200]\n\t" - "ldr r9, [%[b], #124]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[51] * B[30]\n\t" - "ldr r8, [%[a], #204]\n\t" - "ldr r9, [%[b], #120]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[52] * B[29]\n\t" - "ldr r8, [%[a], #208]\n\t" - "ldr r9, [%[b], #116]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[53] * B[28]\n\t" - "ldr r8, [%[a], #212]\n\t" - "ldr r9, [%[b], #112]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[54] * B[27]\n\t" - "ldr r8, [%[a], #216]\n\t" - "ldr r9, [%[b], #108]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[55] * B[26]\n\t" - "ldr r8, [%[a], #220]\n\t" - "ldr r9, [%[b], #104]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[56] * B[25]\n\t" - "ldr r8, [%[a], #224]\n\t" - "ldr r9, [%[b], #100]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[57] * B[24]\n\t" - "ldr r8, [%[a], #228]\n\t" - "ldr r9, [%[b], #96]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[58] * B[23]\n\t" - "ldr r8, [%[a], #232]\n\t" - "ldr r9, [%[b], #92]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[59] * B[22]\n\t" - "ldr r8, [%[a], #236]\n\t" - "ldr r9, [%[b], #88]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[60] * B[21]\n\t" - "ldr r8, [%[a], #240]\n\t" - "ldr r9, [%[b], #84]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[61] * B[20]\n\t" - "ldr r8, [%[a], #244]\n\t" - "ldr r9, [%[b], #80]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[62] * B[19]\n\t" - "ldr r8, [%[a], #248]\n\t" - "ldr r9, [%[b], #76]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[63] * B[18]\n\t" - "ldr r8, [%[a], #252]\n\t" - "ldr r9, [%[b], #72]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "str r3, [%[r], #324]\n\t" - "# A[19] * B[63]\n\t" - "ldr r8, [%[a], #76]\n\t" - "ldr r9, [%[b], #252]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r10, r10\n\t" - "# A[20] * B[62]\n\t" - "ldr r8, [%[a], #80]\n\t" - "ldr r9, [%[b], #248]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[21] * B[61]\n\t" - "ldr r8, [%[a], #84]\n\t" - "ldr r9, [%[b], #244]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[22] * B[60]\n\t" - "ldr r8, [%[a], #88]\n\t" - "ldr r9, [%[b], #240]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[23] * B[59]\n\t" - "ldr r8, [%[a], #92]\n\t" - "ldr r9, [%[b], #236]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[24] * B[58]\n\t" - "ldr r8, [%[a], #96]\n\t" - "ldr r9, [%[b], #232]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[25] * B[57]\n\t" - "ldr r8, [%[a], #100]\n\t" - "ldr r9, [%[b], #228]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[26] * B[56]\n\t" - "ldr r8, [%[a], #104]\n\t" - "ldr r9, [%[b], #224]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[27] * B[55]\n\t" - "ldr r8, [%[a], #108]\n\t" - "ldr r9, [%[b], #220]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[28] * B[54]\n\t" - "ldr r8, [%[a], #112]\n\t" - "ldr r9, [%[b], #216]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[29] * B[53]\n\t" - "ldr r8, [%[a], #116]\n\t" - "ldr r9, [%[b], #212]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[30] * B[52]\n\t" - "ldr r8, [%[a], #120]\n\t" - "ldr r9, [%[b], #208]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[31] * B[51]\n\t" - "ldr r8, [%[a], #124]\n\t" - "ldr r9, [%[b], #204]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[32] * B[50]\n\t" - "ldr r8, [%[a], #128]\n\t" - "ldr r9, [%[b], #200]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[33] * B[49]\n\t" - "ldr r8, [%[a], #132]\n\t" - "ldr r9, [%[b], #196]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[34] * B[48]\n\t" - "ldr r8, [%[a], #136]\n\t" - "ldr r9, [%[b], #192]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[35] * B[47]\n\t" - "ldr r8, [%[a], #140]\n\t" - "ldr r9, [%[b], #188]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[36] * B[46]\n\t" - "ldr r8, [%[a], #144]\n\t" - "ldr r9, [%[b], #184]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[37] * B[45]\n\t" - "ldr r8, [%[a], #148]\n\t" - "ldr r9, [%[b], #180]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[38] * B[44]\n\t" - "ldr r8, [%[a], #152]\n\t" - "ldr r9, [%[b], #176]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[39] * B[43]\n\t" - "ldr r8, [%[a], #156]\n\t" - "ldr r9, [%[b], #172]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[40] * B[42]\n\t" - "ldr r8, [%[a], #160]\n\t" - "ldr r9, [%[b], #168]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[41] * B[41]\n\t" - "ldr r8, [%[a], #164]\n\t" - "ldr r9, [%[b], #164]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[42] * B[40]\n\t" - "ldr r8, [%[a], #168]\n\t" - "ldr r9, [%[b], #160]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[43] * B[39]\n\t" - "ldr r8, [%[a], #172]\n\t" - "ldr r9, [%[b], #156]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[44] * B[38]\n\t" - "ldr r8, [%[a], #176]\n\t" - "ldr r9, [%[b], #152]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[45] * B[37]\n\t" - "ldr r8, [%[a], #180]\n\t" - "ldr r9, [%[b], #148]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[46] * B[36]\n\t" - "ldr r8, [%[a], #184]\n\t" - "ldr r9, [%[b], #144]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[47] * B[35]\n\t" - "ldr r8, [%[a], #188]\n\t" - "ldr r9, [%[b], #140]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[48] * B[34]\n\t" - "ldr r8, [%[a], #192]\n\t" - "ldr r9, [%[b], #136]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[49] * B[33]\n\t" - "ldr r8, [%[a], #196]\n\t" - "ldr r9, [%[b], #132]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[50] * B[32]\n\t" - "ldr r8, [%[a], #200]\n\t" - "ldr r9, [%[b], #128]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[51] * B[31]\n\t" - "ldr r8, [%[a], #204]\n\t" - "ldr r9, [%[b], #124]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[52] * B[30]\n\t" - "ldr r8, [%[a], #208]\n\t" - "ldr r9, [%[b], #120]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[53] * B[29]\n\t" - "ldr r8, [%[a], #212]\n\t" - "ldr r9, [%[b], #116]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[54] * B[28]\n\t" - "ldr r8, [%[a], #216]\n\t" - "ldr r9, [%[b], #112]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[55] * B[27]\n\t" - "ldr r8, [%[a], #220]\n\t" - "ldr r9, [%[b], #108]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[56] * B[26]\n\t" - "ldr r8, [%[a], #224]\n\t" - "ldr r9, [%[b], #104]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[57] * B[25]\n\t" - "ldr r8, [%[a], #228]\n\t" - "ldr r9, [%[b], #100]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[58] * B[24]\n\t" - "ldr r8, [%[a], #232]\n\t" - "ldr r9, [%[b], #96]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[59] * B[23]\n\t" - "ldr r8, [%[a], #236]\n\t" - "ldr r9, [%[b], #92]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[60] * B[22]\n\t" - "ldr r8, [%[a], #240]\n\t" - "ldr r9, [%[b], #88]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[61] * B[21]\n\t" - "ldr r8, [%[a], #244]\n\t" - "ldr r9, [%[b], #84]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[62] * B[20]\n\t" - "ldr r8, [%[a], #248]\n\t" - "ldr r9, [%[b], #80]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[63] * B[19]\n\t" - "ldr r8, [%[a], #252]\n\t" - "ldr r9, [%[b], #76]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "str r4, [%[r], #328]\n\t" - "# A[20] * B[63]\n\t" - "ldr r8, [%[a], #80]\n\t" - "ldr r9, [%[b], #252]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r10, r10\n\t" - "# A[21] * B[62]\n\t" - "ldr r8, [%[a], #84]\n\t" - "ldr r9, [%[b], #248]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[22] * B[61]\n\t" - "ldr r8, [%[a], #88]\n\t" - "ldr r9, [%[b], #244]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[23] * B[60]\n\t" - "ldr r8, [%[a], #92]\n\t" - "ldr r9, [%[b], #240]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[24] * B[59]\n\t" - "ldr r8, [%[a], #96]\n\t" - "ldr r9, [%[b], #236]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[25] * B[58]\n\t" - "ldr r8, [%[a], #100]\n\t" - "ldr r9, [%[b], #232]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[26] * B[57]\n\t" - "ldr r8, [%[a], #104]\n\t" - "ldr r9, [%[b], #228]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[27] * B[56]\n\t" - "ldr r8, [%[a], #108]\n\t" - "ldr r9, [%[b], #224]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[28] * B[55]\n\t" - "ldr r8, [%[a], #112]\n\t" - "ldr r9, [%[b], #220]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[29] * B[54]\n\t" - "ldr r8, [%[a], #116]\n\t" - "ldr r9, [%[b], #216]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[30] * B[53]\n\t" - "ldr r8, [%[a], #120]\n\t" - "ldr r9, [%[b], #212]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[31] * B[52]\n\t" - "ldr r8, [%[a], #124]\n\t" - "ldr r9, [%[b], #208]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[32] * B[51]\n\t" - "ldr r8, [%[a], #128]\n\t" - "ldr r9, [%[b], #204]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[33] * B[50]\n\t" - "ldr r8, [%[a], #132]\n\t" - "ldr r9, [%[b], #200]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[34] * B[49]\n\t" - "ldr r8, [%[a], #136]\n\t" - "ldr r9, [%[b], #196]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[35] * B[48]\n\t" - "ldr r8, [%[a], #140]\n\t" - "ldr r9, [%[b], #192]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[36] * B[47]\n\t" - "ldr r8, [%[a], #144]\n\t" - "ldr r9, [%[b], #188]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[37] * B[46]\n\t" - "ldr r8, [%[a], #148]\n\t" - "ldr r9, [%[b], #184]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[38] * B[45]\n\t" - "ldr r8, [%[a], #152]\n\t" - "ldr r9, [%[b], #180]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[39] * B[44]\n\t" - "ldr r8, [%[a], #156]\n\t" - "ldr r9, [%[b], #176]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[40] * B[43]\n\t" - "ldr r8, [%[a], #160]\n\t" - "ldr r9, [%[b], #172]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[41] * B[42]\n\t" - "ldr r8, [%[a], #164]\n\t" - "ldr r9, [%[b], #168]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[42] * B[41]\n\t" - "ldr r8, [%[a], #168]\n\t" - "ldr r9, [%[b], #164]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[43] * B[40]\n\t" - "ldr r8, [%[a], #172]\n\t" - "ldr r9, [%[b], #160]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[44] * B[39]\n\t" - "ldr r8, [%[a], #176]\n\t" - "ldr r9, [%[b], #156]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[45] * B[38]\n\t" - "ldr r8, [%[a], #180]\n\t" - "ldr r9, [%[b], #152]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[46] * B[37]\n\t" - "ldr r8, [%[a], #184]\n\t" - "ldr r9, [%[b], #148]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[47] * B[36]\n\t" - "ldr r8, [%[a], #188]\n\t" - "ldr r9, [%[b], #144]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[48] * B[35]\n\t" - "ldr r8, [%[a], #192]\n\t" - "ldr r9, [%[b], #140]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[49] * B[34]\n\t" - "ldr r8, [%[a], #196]\n\t" - "ldr r9, [%[b], #136]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[50] * B[33]\n\t" - "ldr r8, [%[a], #200]\n\t" - "ldr r9, [%[b], #132]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[51] * B[32]\n\t" - "ldr r8, [%[a], #204]\n\t" - "ldr r9, [%[b], #128]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[52] * B[31]\n\t" - "ldr r8, [%[a], #208]\n\t" - "ldr r9, [%[b], #124]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[53] * B[30]\n\t" - "ldr r8, [%[a], #212]\n\t" - "ldr r9, [%[b], #120]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[54] * B[29]\n\t" - "ldr r8, [%[a], #216]\n\t" - "ldr r9, [%[b], #116]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[55] * B[28]\n\t" - "ldr r8, [%[a], #220]\n\t" - "ldr r9, [%[b], #112]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[56] * B[27]\n\t" - "ldr r8, [%[a], #224]\n\t" - "ldr r9, [%[b], #108]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[57] * B[26]\n\t" - "ldr r8, [%[a], #228]\n\t" - "ldr r9, [%[b], #104]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[58] * B[25]\n\t" - "ldr r8, [%[a], #232]\n\t" - "ldr r9, [%[b], #100]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[59] * B[24]\n\t" - "ldr r8, [%[a], #236]\n\t" - "ldr r9, [%[b], #96]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[60] * B[23]\n\t" - "ldr r8, [%[a], #240]\n\t" - "ldr r9, [%[b], #92]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[61] * B[22]\n\t" - "ldr r8, [%[a], #244]\n\t" - "ldr r9, [%[b], #88]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[62] * B[21]\n\t" - "ldr r8, [%[a], #248]\n\t" - "ldr r9, [%[b], #84]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[63] * B[20]\n\t" - "ldr r8, [%[a], #252]\n\t" - "ldr r9, [%[b], #80]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "str r5, [%[r], #332]\n\t" - "# A[21] * B[63]\n\t" - "ldr r8, [%[a], #84]\n\t" - "ldr r9, [%[b], #252]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r10, r10\n\t" - "# A[22] * B[62]\n\t" - "ldr r8, [%[a], #88]\n\t" - "ldr r9, [%[b], #248]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[23] * B[61]\n\t" - "ldr r8, [%[a], #92]\n\t" - "ldr r9, [%[b], #244]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[24] * B[60]\n\t" - "ldr r8, [%[a], #96]\n\t" - "ldr r9, [%[b], #240]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[25] * B[59]\n\t" - "ldr r8, [%[a], #100]\n\t" - "ldr r9, [%[b], #236]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[26] * B[58]\n\t" - "ldr r8, [%[a], #104]\n\t" - "ldr r9, [%[b], #232]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[27] * B[57]\n\t" - "ldr r8, [%[a], #108]\n\t" - "ldr r9, [%[b], #228]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[28] * B[56]\n\t" - "ldr r8, [%[a], #112]\n\t" - "ldr r9, [%[b], #224]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[29] * B[55]\n\t" - "ldr r8, [%[a], #116]\n\t" - "ldr r9, [%[b], #220]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[30] * B[54]\n\t" - "ldr r8, [%[a], #120]\n\t" - "ldr r9, [%[b], #216]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[31] * B[53]\n\t" - "ldr r8, [%[a], #124]\n\t" - "ldr r9, [%[b], #212]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[32] * B[52]\n\t" - "ldr r8, [%[a], #128]\n\t" - "ldr r9, [%[b], #208]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[33] * B[51]\n\t" - "ldr r8, [%[a], #132]\n\t" - "ldr r9, [%[b], #204]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[34] * B[50]\n\t" - "ldr r8, [%[a], #136]\n\t" - "ldr r9, [%[b], #200]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[35] * B[49]\n\t" - "ldr r8, [%[a], #140]\n\t" - "ldr r9, [%[b], #196]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[36] * B[48]\n\t" - "ldr r8, [%[a], #144]\n\t" - "ldr r9, [%[b], #192]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[37] * B[47]\n\t" - "ldr r8, [%[a], #148]\n\t" - "ldr r9, [%[b], #188]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[38] * B[46]\n\t" - "ldr r8, [%[a], #152]\n\t" - "ldr r9, [%[b], #184]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[39] * B[45]\n\t" - "ldr r8, [%[a], #156]\n\t" - "ldr r9, [%[b], #180]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[40] * B[44]\n\t" - "ldr r8, [%[a], #160]\n\t" - "ldr r9, [%[b], #176]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[41] * B[43]\n\t" - "ldr r8, [%[a], #164]\n\t" - "ldr r9, [%[b], #172]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[42] * B[42]\n\t" - "ldr r8, [%[a], #168]\n\t" - "ldr r9, [%[b], #168]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[43] * B[41]\n\t" - "ldr r8, [%[a], #172]\n\t" - "ldr r9, [%[b], #164]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[44] * B[40]\n\t" - "ldr r8, [%[a], #176]\n\t" - "ldr r9, [%[b], #160]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[45] * B[39]\n\t" - "ldr r8, [%[a], #180]\n\t" - "ldr r9, [%[b], #156]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[46] * B[38]\n\t" - "ldr r8, [%[a], #184]\n\t" - "ldr r9, [%[b], #152]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[47] * B[37]\n\t" - "ldr r8, [%[a], #188]\n\t" - "ldr r9, [%[b], #148]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[48] * B[36]\n\t" - "ldr r8, [%[a], #192]\n\t" - "ldr r9, [%[b], #144]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[49] * B[35]\n\t" - "ldr r8, [%[a], #196]\n\t" - "ldr r9, [%[b], #140]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[50] * B[34]\n\t" - "ldr r8, [%[a], #200]\n\t" - "ldr r9, [%[b], #136]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[51] * B[33]\n\t" - "ldr r8, [%[a], #204]\n\t" - "ldr r9, [%[b], #132]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[52] * B[32]\n\t" - "ldr r8, [%[a], #208]\n\t" - "ldr r9, [%[b], #128]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[53] * B[31]\n\t" - "ldr r8, [%[a], #212]\n\t" - "ldr r9, [%[b], #124]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[54] * B[30]\n\t" - "ldr r8, [%[a], #216]\n\t" - "ldr r9, [%[b], #120]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[55] * B[29]\n\t" - "ldr r8, [%[a], #220]\n\t" - "ldr r9, [%[b], #116]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[56] * B[28]\n\t" - "ldr r8, [%[a], #224]\n\t" - "ldr r9, [%[b], #112]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[57] * B[27]\n\t" - "ldr r8, [%[a], #228]\n\t" - "ldr r9, [%[b], #108]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[58] * B[26]\n\t" - "ldr r8, [%[a], #232]\n\t" - "ldr r9, [%[b], #104]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[59] * B[25]\n\t" - "ldr r8, [%[a], #236]\n\t" - "ldr r9, [%[b], #100]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[60] * B[24]\n\t" - "ldr r8, [%[a], #240]\n\t" - "ldr r9, [%[b], #96]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[61] * B[23]\n\t" - "ldr r8, [%[a], #244]\n\t" - "ldr r9, [%[b], #92]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[62] * B[22]\n\t" - "ldr r8, [%[a], #248]\n\t" - "ldr r9, [%[b], #88]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[63] * B[21]\n\t" - "ldr r8, [%[a], #252]\n\t" - "ldr r9, [%[b], #84]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "str r3, [%[r], #336]\n\t" - "# A[22] * B[63]\n\t" - "ldr r8, [%[a], #88]\n\t" - "ldr r9, [%[b], #252]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r10, r10\n\t" - "# A[23] * B[62]\n\t" - "ldr r8, [%[a], #92]\n\t" - "ldr r9, [%[b], #248]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[24] * B[61]\n\t" - "ldr r8, [%[a], #96]\n\t" - "ldr r9, [%[b], #244]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[25] * B[60]\n\t" - "ldr r8, [%[a], #100]\n\t" - "ldr r9, [%[b], #240]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[26] * B[59]\n\t" - "ldr r8, [%[a], #104]\n\t" - "ldr r9, [%[b], #236]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[27] * B[58]\n\t" - "ldr r8, [%[a], #108]\n\t" - "ldr r9, [%[b], #232]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[28] * B[57]\n\t" - "ldr r8, [%[a], #112]\n\t" - "ldr r9, [%[b], #228]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[29] * B[56]\n\t" - "ldr r8, [%[a], #116]\n\t" - "ldr r9, [%[b], #224]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[30] * B[55]\n\t" - "ldr r8, [%[a], #120]\n\t" - "ldr r9, [%[b], #220]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[31] * B[54]\n\t" - "ldr r8, [%[a], #124]\n\t" - "ldr r9, [%[b], #216]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[32] * B[53]\n\t" - "ldr r8, [%[a], #128]\n\t" - "ldr r9, [%[b], #212]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[33] * B[52]\n\t" - "ldr r8, [%[a], #132]\n\t" - "ldr r9, [%[b], #208]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[34] * B[51]\n\t" - "ldr r8, [%[a], #136]\n\t" - "ldr r9, [%[b], #204]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[35] * B[50]\n\t" - "ldr r8, [%[a], #140]\n\t" - "ldr r9, [%[b], #200]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[36] * B[49]\n\t" - "ldr r8, [%[a], #144]\n\t" - "ldr r9, [%[b], #196]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[37] * B[48]\n\t" - "ldr r8, [%[a], #148]\n\t" - "ldr r9, [%[b], #192]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[38] * B[47]\n\t" - "ldr r8, [%[a], #152]\n\t" - "ldr r9, [%[b], #188]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[39] * B[46]\n\t" - "ldr r8, [%[a], #156]\n\t" - "ldr r9, [%[b], #184]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[40] * B[45]\n\t" - "ldr r8, [%[a], #160]\n\t" - "ldr r9, [%[b], #180]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[41] * B[44]\n\t" - "ldr r8, [%[a], #164]\n\t" - "ldr r9, [%[b], #176]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[42] * B[43]\n\t" - "ldr r8, [%[a], #168]\n\t" - "ldr r9, [%[b], #172]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[43] * B[42]\n\t" - "ldr r8, [%[a], #172]\n\t" - "ldr r9, [%[b], #168]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[44] * B[41]\n\t" - "ldr r8, [%[a], #176]\n\t" - "ldr r9, [%[b], #164]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[45] * B[40]\n\t" - "ldr r8, [%[a], #180]\n\t" - "ldr r9, [%[b], #160]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[46] * B[39]\n\t" - "ldr r8, [%[a], #184]\n\t" - "ldr r9, [%[b], #156]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[47] * B[38]\n\t" - "ldr r8, [%[a], #188]\n\t" - "ldr r9, [%[b], #152]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[48] * B[37]\n\t" - "ldr r8, [%[a], #192]\n\t" - "ldr r9, [%[b], #148]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[49] * B[36]\n\t" - "ldr r8, [%[a], #196]\n\t" - "ldr r9, [%[b], #144]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[50] * B[35]\n\t" - "ldr r8, [%[a], #200]\n\t" - "ldr r9, [%[b], #140]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[51] * B[34]\n\t" - "ldr r8, [%[a], #204]\n\t" - "ldr r9, [%[b], #136]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[52] * B[33]\n\t" - "ldr r8, [%[a], #208]\n\t" - "ldr r9, [%[b], #132]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[53] * B[32]\n\t" - "ldr r8, [%[a], #212]\n\t" - "ldr r9, [%[b], #128]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[54] * B[31]\n\t" - "ldr r8, [%[a], #216]\n\t" - "ldr r9, [%[b], #124]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[55] * B[30]\n\t" - "ldr r8, [%[a], #220]\n\t" - "ldr r9, [%[b], #120]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[56] * B[29]\n\t" - "ldr r8, [%[a], #224]\n\t" - "ldr r9, [%[b], #116]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[57] * B[28]\n\t" - "ldr r8, [%[a], #228]\n\t" - "ldr r9, [%[b], #112]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[58] * B[27]\n\t" - "ldr r8, [%[a], #232]\n\t" - "ldr r9, [%[b], #108]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[59] * B[26]\n\t" - "ldr r8, [%[a], #236]\n\t" - "ldr r9, [%[b], #104]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[60] * B[25]\n\t" - "ldr r8, [%[a], #240]\n\t" - "ldr r9, [%[b], #100]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[61] * B[24]\n\t" - "ldr r8, [%[a], #244]\n\t" - "ldr r9, [%[b], #96]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[62] * B[23]\n\t" - "ldr r8, [%[a], #248]\n\t" - "ldr r9, [%[b], #92]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[63] * B[22]\n\t" - "ldr r8, [%[a], #252]\n\t" - "ldr r9, [%[b], #88]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "str r4, [%[r], #340]\n\t" - "# A[23] * B[63]\n\t" - "ldr r8, [%[a], #92]\n\t" - "ldr r9, [%[b], #252]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r10, r10\n\t" - "# A[24] * B[62]\n\t" - "ldr r8, [%[a], #96]\n\t" - "ldr r9, [%[b], #248]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[25] * B[61]\n\t" - "ldr r8, [%[a], #100]\n\t" - "ldr r9, [%[b], #244]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[26] * B[60]\n\t" - "ldr r8, [%[a], #104]\n\t" - "ldr r9, [%[b], #240]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[27] * B[59]\n\t" - "ldr r8, [%[a], #108]\n\t" - "ldr r9, [%[b], #236]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[28] * B[58]\n\t" - "ldr r8, [%[a], #112]\n\t" - "ldr r9, [%[b], #232]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[29] * B[57]\n\t" - "ldr r8, [%[a], #116]\n\t" - "ldr r9, [%[b], #228]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[30] * B[56]\n\t" - "ldr r8, [%[a], #120]\n\t" - "ldr r9, [%[b], #224]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[31] * B[55]\n\t" - "ldr r8, [%[a], #124]\n\t" - "ldr r9, [%[b], #220]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[32] * B[54]\n\t" - "ldr r8, [%[a], #128]\n\t" - "ldr r9, [%[b], #216]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[33] * B[53]\n\t" - "ldr r8, [%[a], #132]\n\t" - "ldr r9, [%[b], #212]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[34] * B[52]\n\t" - "ldr r8, [%[a], #136]\n\t" - "ldr r9, [%[b], #208]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[35] * B[51]\n\t" - "ldr r8, [%[a], #140]\n\t" - "ldr r9, [%[b], #204]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[36] * B[50]\n\t" - "ldr r8, [%[a], #144]\n\t" - "ldr r9, [%[b], #200]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[37] * B[49]\n\t" - "ldr r8, [%[a], #148]\n\t" - "ldr r9, [%[b], #196]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[38] * B[48]\n\t" - "ldr r8, [%[a], #152]\n\t" - "ldr r9, [%[b], #192]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[39] * B[47]\n\t" - "ldr r8, [%[a], #156]\n\t" - "ldr r9, [%[b], #188]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[40] * B[46]\n\t" - "ldr r8, [%[a], #160]\n\t" - "ldr r9, [%[b], #184]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[41] * B[45]\n\t" - "ldr r8, [%[a], #164]\n\t" - "ldr r9, [%[b], #180]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[42] * B[44]\n\t" - "ldr r8, [%[a], #168]\n\t" - "ldr r9, [%[b], #176]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[43] * B[43]\n\t" - "ldr r8, [%[a], #172]\n\t" - "ldr r9, [%[b], #172]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[44] * B[42]\n\t" - "ldr r8, [%[a], #176]\n\t" - "ldr r9, [%[b], #168]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[45] * B[41]\n\t" - "ldr r8, [%[a], #180]\n\t" - "ldr r9, [%[b], #164]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[46] * B[40]\n\t" - "ldr r8, [%[a], #184]\n\t" - "ldr r9, [%[b], #160]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[47] * B[39]\n\t" - "ldr r8, [%[a], #188]\n\t" - "ldr r9, [%[b], #156]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[48] * B[38]\n\t" - "ldr r8, [%[a], #192]\n\t" - "ldr r9, [%[b], #152]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[49] * B[37]\n\t" - "ldr r8, [%[a], #196]\n\t" - "ldr r9, [%[b], #148]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[50] * B[36]\n\t" - "ldr r8, [%[a], #200]\n\t" - "ldr r9, [%[b], #144]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[51] * B[35]\n\t" - "ldr r8, [%[a], #204]\n\t" - "ldr r9, [%[b], #140]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[52] * B[34]\n\t" - "ldr r8, [%[a], #208]\n\t" - "ldr r9, [%[b], #136]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[53] * B[33]\n\t" - "ldr r8, [%[a], #212]\n\t" - "ldr r9, [%[b], #132]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[54] * B[32]\n\t" - "ldr r8, [%[a], #216]\n\t" - "ldr r9, [%[b], #128]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[55] * B[31]\n\t" - "ldr r8, [%[a], #220]\n\t" - "ldr r9, [%[b], #124]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[56] * B[30]\n\t" - "ldr r8, [%[a], #224]\n\t" - "ldr r9, [%[b], #120]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[57] * B[29]\n\t" - "ldr r8, [%[a], #228]\n\t" - "ldr r9, [%[b], #116]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[58] * B[28]\n\t" - "ldr r8, [%[a], #232]\n\t" - "ldr r9, [%[b], #112]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[59] * B[27]\n\t" - "ldr r8, [%[a], #236]\n\t" - "ldr r9, [%[b], #108]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[60] * B[26]\n\t" - "ldr r8, [%[a], #240]\n\t" - "ldr r9, [%[b], #104]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[61] * B[25]\n\t" - "ldr r8, [%[a], #244]\n\t" - "ldr r9, [%[b], #100]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[62] * B[24]\n\t" - "ldr r8, [%[a], #248]\n\t" - "ldr r9, [%[b], #96]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[63] * B[23]\n\t" - "ldr r8, [%[a], #252]\n\t" - "ldr r9, [%[b], #92]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "str r5, [%[r], #344]\n\t" - "# A[24] * B[63]\n\t" - "ldr r8, [%[a], #96]\n\t" - "ldr r9, [%[b], #252]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r10, r10\n\t" - "# A[25] * B[62]\n\t" - "ldr r8, [%[a], #100]\n\t" - "ldr r9, [%[b], #248]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[26] * B[61]\n\t" - "ldr r8, [%[a], #104]\n\t" - "ldr r9, [%[b], #244]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[27] * B[60]\n\t" - "ldr r8, [%[a], #108]\n\t" - "ldr r9, [%[b], #240]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[28] * B[59]\n\t" - "ldr r8, [%[a], #112]\n\t" - "ldr r9, [%[b], #236]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[29] * B[58]\n\t" - "ldr r8, [%[a], #116]\n\t" - "ldr r9, [%[b], #232]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[30] * B[57]\n\t" - "ldr r8, [%[a], #120]\n\t" - "ldr r9, [%[b], #228]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[31] * B[56]\n\t" - "ldr r8, [%[a], #124]\n\t" - "ldr r9, [%[b], #224]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[32] * B[55]\n\t" - "ldr r8, [%[a], #128]\n\t" - "ldr r9, [%[b], #220]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[33] * B[54]\n\t" - "ldr r8, [%[a], #132]\n\t" - "ldr r9, [%[b], #216]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[34] * B[53]\n\t" - "ldr r8, [%[a], #136]\n\t" - "ldr r9, [%[b], #212]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[35] * B[52]\n\t" - "ldr r8, [%[a], #140]\n\t" - "ldr r9, [%[b], #208]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[36] * B[51]\n\t" - "ldr r8, [%[a], #144]\n\t" - "ldr r9, [%[b], #204]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[37] * B[50]\n\t" - "ldr r8, [%[a], #148]\n\t" - "ldr r9, [%[b], #200]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[38] * B[49]\n\t" - "ldr r8, [%[a], #152]\n\t" - "ldr r9, [%[b], #196]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[39] * B[48]\n\t" - "ldr r8, [%[a], #156]\n\t" - "ldr r9, [%[b], #192]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[40] * B[47]\n\t" - "ldr r8, [%[a], #160]\n\t" - "ldr r9, [%[b], #188]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[41] * B[46]\n\t" - "ldr r8, [%[a], #164]\n\t" - "ldr r9, [%[b], #184]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[42] * B[45]\n\t" - "ldr r8, [%[a], #168]\n\t" - "ldr r9, [%[b], #180]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[43] * B[44]\n\t" - "ldr r8, [%[a], #172]\n\t" - "ldr r9, [%[b], #176]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[44] * B[43]\n\t" - "ldr r8, [%[a], #176]\n\t" - "ldr r9, [%[b], #172]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[45] * B[42]\n\t" - "ldr r8, [%[a], #180]\n\t" - "ldr r9, [%[b], #168]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[46] * B[41]\n\t" - "ldr r8, [%[a], #184]\n\t" - "ldr r9, [%[b], #164]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[47] * B[40]\n\t" - "ldr r8, [%[a], #188]\n\t" - "ldr r9, [%[b], #160]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[48] * B[39]\n\t" - "ldr r8, [%[a], #192]\n\t" - "ldr r9, [%[b], #156]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[49] * B[38]\n\t" - "ldr r8, [%[a], #196]\n\t" - "ldr r9, [%[b], #152]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[50] * B[37]\n\t" - "ldr r8, [%[a], #200]\n\t" - "ldr r9, [%[b], #148]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[51] * B[36]\n\t" - "ldr r8, [%[a], #204]\n\t" - "ldr r9, [%[b], #144]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[52] * B[35]\n\t" - "ldr r8, [%[a], #208]\n\t" - "ldr r9, [%[b], #140]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[53] * B[34]\n\t" - "ldr r8, [%[a], #212]\n\t" - "ldr r9, [%[b], #136]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[54] * B[33]\n\t" - "ldr r8, [%[a], #216]\n\t" - "ldr r9, [%[b], #132]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[55] * B[32]\n\t" - "ldr r8, [%[a], #220]\n\t" - "ldr r9, [%[b], #128]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[56] * B[31]\n\t" - "ldr r8, [%[a], #224]\n\t" - "ldr r9, [%[b], #124]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[57] * B[30]\n\t" - "ldr r8, [%[a], #228]\n\t" - "ldr r9, [%[b], #120]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[58] * B[29]\n\t" - "ldr r8, [%[a], #232]\n\t" - "ldr r9, [%[b], #116]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[59] * B[28]\n\t" - "ldr r8, [%[a], #236]\n\t" - "ldr r9, [%[b], #112]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[60] * B[27]\n\t" - "ldr r8, [%[a], #240]\n\t" - "ldr r9, [%[b], #108]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[61] * B[26]\n\t" - "ldr r8, [%[a], #244]\n\t" - "ldr r9, [%[b], #104]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[62] * B[25]\n\t" - "ldr r8, [%[a], #248]\n\t" - "ldr r9, [%[b], #100]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[63] * B[24]\n\t" - "ldr r8, [%[a], #252]\n\t" - "ldr r9, [%[b], #96]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "str r3, [%[r], #348]\n\t" - "# A[25] * B[63]\n\t" - "ldr r8, [%[a], #100]\n\t" - "ldr r9, [%[b], #252]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r10, r10\n\t" - "# A[26] * B[62]\n\t" - "ldr r8, [%[a], #104]\n\t" - "ldr r9, [%[b], #248]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[27] * B[61]\n\t" - "ldr r8, [%[a], #108]\n\t" - "ldr r9, [%[b], #244]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[28] * B[60]\n\t" - "ldr r8, [%[a], #112]\n\t" - "ldr r9, [%[b], #240]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[29] * B[59]\n\t" - "ldr r8, [%[a], #116]\n\t" - "ldr r9, [%[b], #236]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[30] * B[58]\n\t" - "ldr r8, [%[a], #120]\n\t" - "ldr r9, [%[b], #232]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[31] * B[57]\n\t" - "ldr r8, [%[a], #124]\n\t" - "ldr r9, [%[b], #228]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[32] * B[56]\n\t" - "ldr r8, [%[a], #128]\n\t" - "ldr r9, [%[b], #224]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[33] * B[55]\n\t" - "ldr r8, [%[a], #132]\n\t" - "ldr r9, [%[b], #220]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[34] * B[54]\n\t" - "ldr r8, [%[a], #136]\n\t" - "ldr r9, [%[b], #216]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[35] * B[53]\n\t" - "ldr r8, [%[a], #140]\n\t" - "ldr r9, [%[b], #212]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[36] * B[52]\n\t" - "ldr r8, [%[a], #144]\n\t" - "ldr r9, [%[b], #208]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[37] * B[51]\n\t" - "ldr r8, [%[a], #148]\n\t" - "ldr r9, [%[b], #204]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[38] * B[50]\n\t" - "ldr r8, [%[a], #152]\n\t" - "ldr r9, [%[b], #200]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[39] * B[49]\n\t" - "ldr r8, [%[a], #156]\n\t" - "ldr r9, [%[b], #196]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[40] * B[48]\n\t" - "ldr r8, [%[a], #160]\n\t" - "ldr r9, [%[b], #192]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[41] * B[47]\n\t" - "ldr r8, [%[a], #164]\n\t" - "ldr r9, [%[b], #188]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[42] * B[46]\n\t" - "ldr r8, [%[a], #168]\n\t" - "ldr r9, [%[b], #184]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[43] * B[45]\n\t" - "ldr r8, [%[a], #172]\n\t" - "ldr r9, [%[b], #180]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[44] * B[44]\n\t" - "ldr r8, [%[a], #176]\n\t" - "ldr r9, [%[b], #176]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[45] * B[43]\n\t" - "ldr r8, [%[a], #180]\n\t" - "ldr r9, [%[b], #172]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[46] * B[42]\n\t" - "ldr r8, [%[a], #184]\n\t" - "ldr r9, [%[b], #168]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[47] * B[41]\n\t" - "ldr r8, [%[a], #188]\n\t" - "ldr r9, [%[b], #164]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[48] * B[40]\n\t" - "ldr r8, [%[a], #192]\n\t" - "ldr r9, [%[b], #160]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[49] * B[39]\n\t" - "ldr r8, [%[a], #196]\n\t" - "ldr r9, [%[b], #156]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[50] * B[38]\n\t" - "ldr r8, [%[a], #200]\n\t" - "ldr r9, [%[b], #152]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[51] * B[37]\n\t" - "ldr r8, [%[a], #204]\n\t" - "ldr r9, [%[b], #148]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[52] * B[36]\n\t" - "ldr r8, [%[a], #208]\n\t" - "ldr r9, [%[b], #144]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[53] * B[35]\n\t" - "ldr r8, [%[a], #212]\n\t" - "ldr r9, [%[b], #140]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[54] * B[34]\n\t" - "ldr r8, [%[a], #216]\n\t" - "ldr r9, [%[b], #136]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[55] * B[33]\n\t" - "ldr r8, [%[a], #220]\n\t" - "ldr r9, [%[b], #132]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[56] * B[32]\n\t" - "ldr r8, [%[a], #224]\n\t" - "ldr r9, [%[b], #128]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[57] * B[31]\n\t" - "ldr r8, [%[a], #228]\n\t" - "ldr r9, [%[b], #124]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[58] * B[30]\n\t" - "ldr r8, [%[a], #232]\n\t" - "ldr r9, [%[b], #120]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[59] * B[29]\n\t" - "ldr r8, [%[a], #236]\n\t" - "ldr r9, [%[b], #116]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[60] * B[28]\n\t" - "ldr r8, [%[a], #240]\n\t" - "ldr r9, [%[b], #112]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[61] * B[27]\n\t" - "ldr r8, [%[a], #244]\n\t" - "ldr r9, [%[b], #108]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[62] * B[26]\n\t" - "ldr r8, [%[a], #248]\n\t" - "ldr r9, [%[b], #104]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[63] * B[25]\n\t" - "ldr r8, [%[a], #252]\n\t" - "ldr r9, [%[b], #100]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "str r4, [%[r], #352]\n\t" - "# A[26] * B[63]\n\t" - "ldr r8, [%[a], #104]\n\t" - "ldr r9, [%[b], #252]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r10, r10\n\t" - "# A[27] * B[62]\n\t" - "ldr r8, [%[a], #108]\n\t" - "ldr r9, [%[b], #248]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[28] * B[61]\n\t" - "ldr r8, [%[a], #112]\n\t" - "ldr r9, [%[b], #244]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[29] * B[60]\n\t" - "ldr r8, [%[a], #116]\n\t" - "ldr r9, [%[b], #240]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[30] * B[59]\n\t" - "ldr r8, [%[a], #120]\n\t" - "ldr r9, [%[b], #236]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[31] * B[58]\n\t" - "ldr r8, [%[a], #124]\n\t" - "ldr r9, [%[b], #232]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[32] * B[57]\n\t" - "ldr r8, [%[a], #128]\n\t" - "ldr r9, [%[b], #228]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[33] * B[56]\n\t" - "ldr r8, [%[a], #132]\n\t" - "ldr r9, [%[b], #224]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[34] * B[55]\n\t" - "ldr r8, [%[a], #136]\n\t" - "ldr r9, [%[b], #220]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[35] * B[54]\n\t" - "ldr r8, [%[a], #140]\n\t" - "ldr r9, [%[b], #216]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[36] * B[53]\n\t" - "ldr r8, [%[a], #144]\n\t" - "ldr r9, [%[b], #212]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[37] * B[52]\n\t" - "ldr r8, [%[a], #148]\n\t" - "ldr r9, [%[b], #208]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[38] * B[51]\n\t" - "ldr r8, [%[a], #152]\n\t" - "ldr r9, [%[b], #204]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[39] * B[50]\n\t" - "ldr r8, [%[a], #156]\n\t" - "ldr r9, [%[b], #200]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[40] * B[49]\n\t" - "ldr r8, [%[a], #160]\n\t" - "ldr r9, [%[b], #196]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[41] * B[48]\n\t" - "ldr r8, [%[a], #164]\n\t" - "ldr r9, [%[b], #192]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[42] * B[47]\n\t" - "ldr r8, [%[a], #168]\n\t" - "ldr r9, [%[b], #188]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[43] * B[46]\n\t" - "ldr r8, [%[a], #172]\n\t" - "ldr r9, [%[b], #184]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[44] * B[45]\n\t" - "ldr r8, [%[a], #176]\n\t" - "ldr r9, [%[b], #180]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[45] * B[44]\n\t" - "ldr r8, [%[a], #180]\n\t" - "ldr r9, [%[b], #176]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[46] * B[43]\n\t" - "ldr r8, [%[a], #184]\n\t" - "ldr r9, [%[b], #172]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[47] * B[42]\n\t" - "ldr r8, [%[a], #188]\n\t" - "ldr r9, [%[b], #168]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[48] * B[41]\n\t" - "ldr r8, [%[a], #192]\n\t" - "ldr r9, [%[b], #164]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[49] * B[40]\n\t" - "ldr r8, [%[a], #196]\n\t" - "ldr r9, [%[b], #160]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[50] * B[39]\n\t" - "ldr r8, [%[a], #200]\n\t" - "ldr r9, [%[b], #156]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[51] * B[38]\n\t" - "ldr r8, [%[a], #204]\n\t" - "ldr r9, [%[b], #152]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[52] * B[37]\n\t" - "ldr r8, [%[a], #208]\n\t" - "ldr r9, [%[b], #148]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[53] * B[36]\n\t" - "ldr r8, [%[a], #212]\n\t" - "ldr r9, [%[b], #144]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[54] * B[35]\n\t" - "ldr r8, [%[a], #216]\n\t" - "ldr r9, [%[b], #140]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[55] * B[34]\n\t" - "ldr r8, [%[a], #220]\n\t" - "ldr r9, [%[b], #136]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[56] * B[33]\n\t" - "ldr r8, [%[a], #224]\n\t" - "ldr r9, [%[b], #132]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[57] * B[32]\n\t" - "ldr r8, [%[a], #228]\n\t" - "ldr r9, [%[b], #128]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[58] * B[31]\n\t" - "ldr r8, [%[a], #232]\n\t" - "ldr r9, [%[b], #124]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[59] * B[30]\n\t" - "ldr r8, [%[a], #236]\n\t" - "ldr r9, [%[b], #120]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[60] * B[29]\n\t" - "ldr r8, [%[a], #240]\n\t" - "ldr r9, [%[b], #116]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[61] * B[28]\n\t" - "ldr r8, [%[a], #244]\n\t" - "ldr r9, [%[b], #112]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[62] * B[27]\n\t" - "ldr r8, [%[a], #248]\n\t" - "ldr r9, [%[b], #108]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[63] * B[26]\n\t" - "ldr r8, [%[a], #252]\n\t" - "ldr r9, [%[b], #104]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "str r5, [%[r], #356]\n\t" - "# A[27] * B[63]\n\t" - "ldr r8, [%[a], #108]\n\t" - "ldr r9, [%[b], #252]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r10, r10\n\t" - "# A[28] * B[62]\n\t" - "ldr r8, [%[a], #112]\n\t" - "ldr r9, [%[b], #248]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[29] * B[61]\n\t" - "ldr r8, [%[a], #116]\n\t" - "ldr r9, [%[b], #244]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[30] * B[60]\n\t" - "ldr r8, [%[a], #120]\n\t" - "ldr r9, [%[b], #240]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[31] * B[59]\n\t" - "ldr r8, [%[a], #124]\n\t" - "ldr r9, [%[b], #236]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[32] * B[58]\n\t" - "ldr r8, [%[a], #128]\n\t" - "ldr r9, [%[b], #232]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[33] * B[57]\n\t" - "ldr r8, [%[a], #132]\n\t" - "ldr r9, [%[b], #228]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[34] * B[56]\n\t" - "ldr r8, [%[a], #136]\n\t" - "ldr r9, [%[b], #224]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[35] * B[55]\n\t" - "ldr r8, [%[a], #140]\n\t" - "ldr r9, [%[b], #220]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[36] * B[54]\n\t" - "ldr r8, [%[a], #144]\n\t" - "ldr r9, [%[b], #216]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[37] * B[53]\n\t" - "ldr r8, [%[a], #148]\n\t" - "ldr r9, [%[b], #212]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[38] * B[52]\n\t" - "ldr r8, [%[a], #152]\n\t" - "ldr r9, [%[b], #208]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[39] * B[51]\n\t" - "ldr r8, [%[a], #156]\n\t" - "ldr r9, [%[b], #204]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[40] * B[50]\n\t" - "ldr r8, [%[a], #160]\n\t" - "ldr r9, [%[b], #200]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[41] * B[49]\n\t" - "ldr r8, [%[a], #164]\n\t" - "ldr r9, [%[b], #196]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[42] * B[48]\n\t" - "ldr r8, [%[a], #168]\n\t" - "ldr r9, [%[b], #192]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[43] * B[47]\n\t" - "ldr r8, [%[a], #172]\n\t" - "ldr r9, [%[b], #188]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[44] * B[46]\n\t" - "ldr r8, [%[a], #176]\n\t" - "ldr r9, [%[b], #184]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[45] * B[45]\n\t" - "ldr r8, [%[a], #180]\n\t" - "ldr r9, [%[b], #180]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[46] * B[44]\n\t" - "ldr r8, [%[a], #184]\n\t" - "ldr r9, [%[b], #176]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[47] * B[43]\n\t" - "ldr r8, [%[a], #188]\n\t" - "ldr r9, [%[b], #172]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[48] * B[42]\n\t" - "ldr r8, [%[a], #192]\n\t" - "ldr r9, [%[b], #168]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[49] * B[41]\n\t" - "ldr r8, [%[a], #196]\n\t" - "ldr r9, [%[b], #164]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[50] * B[40]\n\t" - "ldr r8, [%[a], #200]\n\t" - "ldr r9, [%[b], #160]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[51] * B[39]\n\t" - "ldr r8, [%[a], #204]\n\t" - "ldr r9, [%[b], #156]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[52] * B[38]\n\t" - "ldr r8, [%[a], #208]\n\t" - "ldr r9, [%[b], #152]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[53] * B[37]\n\t" - "ldr r8, [%[a], #212]\n\t" - "ldr r9, [%[b], #148]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[54] * B[36]\n\t" - "ldr r8, [%[a], #216]\n\t" - "ldr r9, [%[b], #144]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[55] * B[35]\n\t" - "ldr r8, [%[a], #220]\n\t" - "ldr r9, [%[b], #140]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[56] * B[34]\n\t" - "ldr r8, [%[a], #224]\n\t" - "ldr r9, [%[b], #136]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[57] * B[33]\n\t" - "ldr r8, [%[a], #228]\n\t" - "ldr r9, [%[b], #132]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[58] * B[32]\n\t" - "ldr r8, [%[a], #232]\n\t" - "ldr r9, [%[b], #128]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[59] * B[31]\n\t" - "ldr r8, [%[a], #236]\n\t" - "ldr r9, [%[b], #124]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[60] * B[30]\n\t" - "ldr r8, [%[a], #240]\n\t" - "ldr r9, [%[b], #120]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[61] * B[29]\n\t" - "ldr r8, [%[a], #244]\n\t" - "ldr r9, [%[b], #116]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[62] * B[28]\n\t" - "ldr r8, [%[a], #248]\n\t" - "ldr r9, [%[b], #112]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[63] * B[27]\n\t" - "ldr r8, [%[a], #252]\n\t" - "ldr r9, [%[b], #108]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "str r3, [%[r], #360]\n\t" - "# A[28] * B[63]\n\t" - "ldr r8, [%[a], #112]\n\t" - "ldr r9, [%[b], #252]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r10, r10\n\t" - "# A[29] * B[62]\n\t" - "ldr r8, [%[a], #116]\n\t" - "ldr r9, [%[b], #248]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[30] * B[61]\n\t" - "ldr r8, [%[a], #120]\n\t" - "ldr r9, [%[b], #244]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[31] * B[60]\n\t" - "ldr r8, [%[a], #124]\n\t" - "ldr r9, [%[b], #240]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[32] * B[59]\n\t" - "ldr r8, [%[a], #128]\n\t" - "ldr r9, [%[b], #236]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[33] * B[58]\n\t" - "ldr r8, [%[a], #132]\n\t" - "ldr r9, [%[b], #232]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[34] * B[57]\n\t" - "ldr r8, [%[a], #136]\n\t" - "ldr r9, [%[b], #228]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[35] * B[56]\n\t" - "ldr r8, [%[a], #140]\n\t" - "ldr r9, [%[b], #224]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[36] * B[55]\n\t" - "ldr r8, [%[a], #144]\n\t" - "ldr r9, [%[b], #220]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[37] * B[54]\n\t" - "ldr r8, [%[a], #148]\n\t" - "ldr r9, [%[b], #216]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[38] * B[53]\n\t" - "ldr r8, [%[a], #152]\n\t" - "ldr r9, [%[b], #212]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[39] * B[52]\n\t" - "ldr r8, [%[a], #156]\n\t" - "ldr r9, [%[b], #208]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[40] * B[51]\n\t" - "ldr r8, [%[a], #160]\n\t" - "ldr r9, [%[b], #204]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[41] * B[50]\n\t" - "ldr r8, [%[a], #164]\n\t" - "ldr r9, [%[b], #200]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[42] * B[49]\n\t" - "ldr r8, [%[a], #168]\n\t" - "ldr r9, [%[b], #196]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[43] * B[48]\n\t" - "ldr r8, [%[a], #172]\n\t" - "ldr r9, [%[b], #192]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[44] * B[47]\n\t" - "ldr r8, [%[a], #176]\n\t" - "ldr r9, [%[b], #188]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[45] * B[46]\n\t" - "ldr r8, [%[a], #180]\n\t" - "ldr r9, [%[b], #184]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[46] * B[45]\n\t" - "ldr r8, [%[a], #184]\n\t" - "ldr r9, [%[b], #180]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[47] * B[44]\n\t" - "ldr r8, [%[a], #188]\n\t" - "ldr r9, [%[b], #176]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[48] * B[43]\n\t" - "ldr r8, [%[a], #192]\n\t" - "ldr r9, [%[b], #172]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[49] * B[42]\n\t" - "ldr r8, [%[a], #196]\n\t" - "ldr r9, [%[b], #168]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[50] * B[41]\n\t" - "ldr r8, [%[a], #200]\n\t" - "ldr r9, [%[b], #164]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[51] * B[40]\n\t" - "ldr r8, [%[a], #204]\n\t" - "ldr r9, [%[b], #160]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[52] * B[39]\n\t" - "ldr r8, [%[a], #208]\n\t" - "ldr r9, [%[b], #156]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[53] * B[38]\n\t" - "ldr r8, [%[a], #212]\n\t" - "ldr r9, [%[b], #152]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[54] * B[37]\n\t" - "ldr r8, [%[a], #216]\n\t" - "ldr r9, [%[b], #148]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[55] * B[36]\n\t" - "ldr r8, [%[a], #220]\n\t" - "ldr r9, [%[b], #144]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[56] * B[35]\n\t" - "ldr r8, [%[a], #224]\n\t" - "ldr r9, [%[b], #140]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[57] * B[34]\n\t" - "ldr r8, [%[a], #228]\n\t" - "ldr r9, [%[b], #136]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[58] * B[33]\n\t" - "ldr r8, [%[a], #232]\n\t" - "ldr r9, [%[b], #132]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[59] * B[32]\n\t" - "ldr r8, [%[a], #236]\n\t" - "ldr r9, [%[b], #128]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[60] * B[31]\n\t" - "ldr r8, [%[a], #240]\n\t" - "ldr r9, [%[b], #124]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[61] * B[30]\n\t" - "ldr r8, [%[a], #244]\n\t" - "ldr r9, [%[b], #120]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[62] * B[29]\n\t" - "ldr r8, [%[a], #248]\n\t" - "ldr r9, [%[b], #116]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[63] * B[28]\n\t" - "ldr r8, [%[a], #252]\n\t" - "ldr r9, [%[b], #112]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "str r4, [%[r], #364]\n\t" - "# A[29] * B[63]\n\t" - "ldr r8, [%[a], #116]\n\t" - "ldr r9, [%[b], #252]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r10, r10\n\t" - "# A[30] * B[62]\n\t" - "ldr r8, [%[a], #120]\n\t" - "ldr r9, [%[b], #248]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[31] * B[61]\n\t" - "ldr r8, [%[a], #124]\n\t" - "ldr r9, [%[b], #244]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[32] * B[60]\n\t" - "ldr r8, [%[a], #128]\n\t" - "ldr r9, [%[b], #240]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[33] * B[59]\n\t" - "ldr r8, [%[a], #132]\n\t" - "ldr r9, [%[b], #236]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[34] * B[58]\n\t" - "ldr r8, [%[a], #136]\n\t" - "ldr r9, [%[b], #232]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[35] * B[57]\n\t" - "ldr r8, [%[a], #140]\n\t" - "ldr r9, [%[b], #228]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[36] * B[56]\n\t" - "ldr r8, [%[a], #144]\n\t" - "ldr r9, [%[b], #224]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[37] * B[55]\n\t" - "ldr r8, [%[a], #148]\n\t" - "ldr r9, [%[b], #220]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[38] * B[54]\n\t" - "ldr r8, [%[a], #152]\n\t" - "ldr r9, [%[b], #216]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[39] * B[53]\n\t" - "ldr r8, [%[a], #156]\n\t" - "ldr r9, [%[b], #212]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[40] * B[52]\n\t" - "ldr r8, [%[a], #160]\n\t" - "ldr r9, [%[b], #208]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[41] * B[51]\n\t" - "ldr r8, [%[a], #164]\n\t" - "ldr r9, [%[b], #204]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[42] * B[50]\n\t" - "ldr r8, [%[a], #168]\n\t" - "ldr r9, [%[b], #200]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[43] * B[49]\n\t" - "ldr r8, [%[a], #172]\n\t" - "ldr r9, [%[b], #196]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[44] * B[48]\n\t" - "ldr r8, [%[a], #176]\n\t" - "ldr r9, [%[b], #192]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[45] * B[47]\n\t" - "ldr r8, [%[a], #180]\n\t" - "ldr r9, [%[b], #188]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[46] * B[46]\n\t" - "ldr r8, [%[a], #184]\n\t" - "ldr r9, [%[b], #184]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[47] * B[45]\n\t" - "ldr r8, [%[a], #188]\n\t" - "ldr r9, [%[b], #180]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[48] * B[44]\n\t" - "ldr r8, [%[a], #192]\n\t" - "ldr r9, [%[b], #176]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[49] * B[43]\n\t" - "ldr r8, [%[a], #196]\n\t" - "ldr r9, [%[b], #172]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[50] * B[42]\n\t" - "ldr r8, [%[a], #200]\n\t" - "ldr r9, [%[b], #168]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[51] * B[41]\n\t" - "ldr r8, [%[a], #204]\n\t" - "ldr r9, [%[b], #164]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[52] * B[40]\n\t" - "ldr r8, [%[a], #208]\n\t" - "ldr r9, [%[b], #160]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[53] * B[39]\n\t" - "ldr r8, [%[a], #212]\n\t" - "ldr r9, [%[b], #156]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[54] * B[38]\n\t" - "ldr r8, [%[a], #216]\n\t" - "ldr r9, [%[b], #152]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[55] * B[37]\n\t" - "ldr r8, [%[a], #220]\n\t" - "ldr r9, [%[b], #148]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[56] * B[36]\n\t" - "ldr r8, [%[a], #224]\n\t" - "ldr r9, [%[b], #144]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[57] * B[35]\n\t" - "ldr r8, [%[a], #228]\n\t" - "ldr r9, [%[b], #140]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[58] * B[34]\n\t" - "ldr r8, [%[a], #232]\n\t" - "ldr r9, [%[b], #136]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[59] * B[33]\n\t" - "ldr r8, [%[a], #236]\n\t" - "ldr r9, [%[b], #132]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[60] * B[32]\n\t" - "ldr r8, [%[a], #240]\n\t" - "ldr r9, [%[b], #128]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[61] * B[31]\n\t" - "ldr r8, [%[a], #244]\n\t" - "ldr r9, [%[b], #124]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[62] * B[30]\n\t" - "ldr r8, [%[a], #248]\n\t" - "ldr r9, [%[b], #120]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[63] * B[29]\n\t" - "ldr r8, [%[a], #252]\n\t" - "ldr r9, [%[b], #116]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "str r5, [%[r], #368]\n\t" - "# A[30] * B[63]\n\t" - "ldr r8, [%[a], #120]\n\t" - "ldr r9, [%[b], #252]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r10, r10\n\t" - "# A[31] * B[62]\n\t" - "ldr r8, [%[a], #124]\n\t" - "ldr r9, [%[b], #248]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[32] * B[61]\n\t" - "ldr r8, [%[a], #128]\n\t" - "ldr r9, [%[b], #244]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[33] * B[60]\n\t" - "ldr r8, [%[a], #132]\n\t" - "ldr r9, [%[b], #240]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[34] * B[59]\n\t" - "ldr r8, [%[a], #136]\n\t" - "ldr r9, [%[b], #236]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[35] * B[58]\n\t" - "ldr r8, [%[a], #140]\n\t" - "ldr r9, [%[b], #232]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[36] * B[57]\n\t" - "ldr r8, [%[a], #144]\n\t" - "ldr r9, [%[b], #228]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[37] * B[56]\n\t" - "ldr r8, [%[a], #148]\n\t" - "ldr r9, [%[b], #224]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[38] * B[55]\n\t" - "ldr r8, [%[a], #152]\n\t" - "ldr r9, [%[b], #220]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[39] * B[54]\n\t" - "ldr r8, [%[a], #156]\n\t" - "ldr r9, [%[b], #216]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[40] * B[53]\n\t" - "ldr r8, [%[a], #160]\n\t" - "ldr r9, [%[b], #212]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[41] * B[52]\n\t" - "ldr r8, [%[a], #164]\n\t" - "ldr r9, [%[b], #208]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[42] * B[51]\n\t" - "ldr r8, [%[a], #168]\n\t" - "ldr r9, [%[b], #204]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[43] * B[50]\n\t" - "ldr r8, [%[a], #172]\n\t" - "ldr r9, [%[b], #200]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[44] * B[49]\n\t" - "ldr r8, [%[a], #176]\n\t" - "ldr r9, [%[b], #196]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[45] * B[48]\n\t" - "ldr r8, [%[a], #180]\n\t" - "ldr r9, [%[b], #192]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[46] * B[47]\n\t" - "ldr r8, [%[a], #184]\n\t" - "ldr r9, [%[b], #188]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[47] * B[46]\n\t" - "ldr r8, [%[a], #188]\n\t" - "ldr r9, [%[b], #184]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[48] * B[45]\n\t" - "ldr r8, [%[a], #192]\n\t" - "ldr r9, [%[b], #180]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[49] * B[44]\n\t" - "ldr r8, [%[a], #196]\n\t" - "ldr r9, [%[b], #176]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[50] * B[43]\n\t" - "ldr r8, [%[a], #200]\n\t" - "ldr r9, [%[b], #172]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[51] * B[42]\n\t" - "ldr r8, [%[a], #204]\n\t" - "ldr r9, [%[b], #168]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[52] * B[41]\n\t" - "ldr r8, [%[a], #208]\n\t" - "ldr r9, [%[b], #164]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[53] * B[40]\n\t" - "ldr r8, [%[a], #212]\n\t" - "ldr r9, [%[b], #160]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[54] * B[39]\n\t" - "ldr r8, [%[a], #216]\n\t" - "ldr r9, [%[b], #156]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[55] * B[38]\n\t" - "ldr r8, [%[a], #220]\n\t" - "ldr r9, [%[b], #152]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[56] * B[37]\n\t" - "ldr r8, [%[a], #224]\n\t" - "ldr r9, [%[b], #148]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[57] * B[36]\n\t" - "ldr r8, [%[a], #228]\n\t" - "ldr r9, [%[b], #144]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[58] * B[35]\n\t" - "ldr r8, [%[a], #232]\n\t" - "ldr r9, [%[b], #140]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[59] * B[34]\n\t" - "ldr r8, [%[a], #236]\n\t" - "ldr r9, [%[b], #136]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[60] * B[33]\n\t" - "ldr r8, [%[a], #240]\n\t" - "ldr r9, [%[b], #132]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[61] * B[32]\n\t" - "ldr r8, [%[a], #244]\n\t" - "ldr r9, [%[b], #128]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[62] * B[31]\n\t" - "ldr r8, [%[a], #248]\n\t" - "ldr r9, [%[b], #124]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[63] * B[30]\n\t" - "ldr r8, [%[a], #252]\n\t" - "ldr r9, [%[b], #120]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "str r3, [%[r], #372]\n\t" - "# A[31] * B[63]\n\t" - "ldr r8, [%[a], #124]\n\t" - "ldr r9, [%[b], #252]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r10, r10\n\t" - "# A[32] * B[62]\n\t" - "ldr r8, [%[a], #128]\n\t" - "ldr r9, [%[b], #248]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[33] * B[61]\n\t" - "ldr r8, [%[a], #132]\n\t" - "ldr r9, [%[b], #244]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[34] * B[60]\n\t" - "ldr r8, [%[a], #136]\n\t" - "ldr r9, [%[b], #240]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[35] * B[59]\n\t" - "ldr r8, [%[a], #140]\n\t" - "ldr r9, [%[b], #236]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[36] * B[58]\n\t" - "ldr r8, [%[a], #144]\n\t" - "ldr r9, [%[b], #232]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[37] * B[57]\n\t" - "ldr r8, [%[a], #148]\n\t" - "ldr r9, [%[b], #228]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[38] * B[56]\n\t" - "ldr r8, [%[a], #152]\n\t" - "ldr r9, [%[b], #224]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[39] * B[55]\n\t" - "ldr r8, [%[a], #156]\n\t" - "ldr r9, [%[b], #220]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[40] * B[54]\n\t" - "ldr r8, [%[a], #160]\n\t" - "ldr r9, [%[b], #216]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[41] * B[53]\n\t" - "ldr r8, [%[a], #164]\n\t" - "ldr r9, [%[b], #212]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[42] * B[52]\n\t" - "ldr r8, [%[a], #168]\n\t" - "ldr r9, [%[b], #208]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[43] * B[51]\n\t" - "ldr r8, [%[a], #172]\n\t" - "ldr r9, [%[b], #204]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[44] * B[50]\n\t" - "ldr r8, [%[a], #176]\n\t" - "ldr r9, [%[b], #200]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[45] * B[49]\n\t" - "ldr r8, [%[a], #180]\n\t" - "ldr r9, [%[b], #196]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[46] * B[48]\n\t" - "ldr r8, [%[a], #184]\n\t" - "ldr r9, [%[b], #192]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[47] * B[47]\n\t" - "ldr r8, [%[a], #188]\n\t" - "ldr r9, [%[b], #188]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[48] * B[46]\n\t" - "ldr r8, [%[a], #192]\n\t" - "ldr r9, [%[b], #184]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[49] * B[45]\n\t" - "ldr r8, [%[a], #196]\n\t" - "ldr r9, [%[b], #180]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[50] * B[44]\n\t" - "ldr r8, [%[a], #200]\n\t" - "ldr r9, [%[b], #176]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[51] * B[43]\n\t" - "ldr r8, [%[a], #204]\n\t" - "ldr r9, [%[b], #172]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[52] * B[42]\n\t" - "ldr r8, [%[a], #208]\n\t" - "ldr r9, [%[b], #168]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[53] * B[41]\n\t" - "ldr r8, [%[a], #212]\n\t" - "ldr r9, [%[b], #164]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[54] * B[40]\n\t" - "ldr r8, [%[a], #216]\n\t" - "ldr r9, [%[b], #160]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[55] * B[39]\n\t" - "ldr r8, [%[a], #220]\n\t" - "ldr r9, [%[b], #156]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[56] * B[38]\n\t" - "ldr r8, [%[a], #224]\n\t" - "ldr r9, [%[b], #152]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[57] * B[37]\n\t" - "ldr r8, [%[a], #228]\n\t" - "ldr r9, [%[b], #148]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[58] * B[36]\n\t" - "ldr r8, [%[a], #232]\n\t" - "ldr r9, [%[b], #144]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[59] * B[35]\n\t" - "ldr r8, [%[a], #236]\n\t" - "ldr r9, [%[b], #140]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[60] * B[34]\n\t" - "ldr r8, [%[a], #240]\n\t" - "ldr r9, [%[b], #136]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[61] * B[33]\n\t" - "ldr r8, [%[a], #244]\n\t" - "ldr r9, [%[b], #132]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[62] * B[32]\n\t" - "ldr r8, [%[a], #248]\n\t" - "ldr r9, [%[b], #128]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[63] * B[31]\n\t" - "ldr r8, [%[a], #252]\n\t" - "ldr r9, [%[b], #124]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "str r4, [%[r], #376]\n\t" - "# A[32] * B[63]\n\t" - "ldr r8, [%[a], #128]\n\t" - "ldr r9, [%[b], #252]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r10, r10\n\t" - "# A[33] * B[62]\n\t" - "ldr r8, [%[a], #132]\n\t" - "ldr r9, [%[b], #248]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[34] * B[61]\n\t" - "ldr r8, [%[a], #136]\n\t" - "ldr r9, [%[b], #244]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[35] * B[60]\n\t" - "ldr r8, [%[a], #140]\n\t" - "ldr r9, [%[b], #240]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[36] * B[59]\n\t" - "ldr r8, [%[a], #144]\n\t" - "ldr r9, [%[b], #236]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[37] * B[58]\n\t" - "ldr r8, [%[a], #148]\n\t" - "ldr r9, [%[b], #232]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[38] * B[57]\n\t" - "ldr r8, [%[a], #152]\n\t" - "ldr r9, [%[b], #228]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[39] * B[56]\n\t" - "ldr r8, [%[a], #156]\n\t" - "ldr r9, [%[b], #224]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[40] * B[55]\n\t" - "ldr r8, [%[a], #160]\n\t" - "ldr r9, [%[b], #220]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[41] * B[54]\n\t" - "ldr r8, [%[a], #164]\n\t" - "ldr r9, [%[b], #216]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[42] * B[53]\n\t" - "ldr r8, [%[a], #168]\n\t" - "ldr r9, [%[b], #212]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[43] * B[52]\n\t" - "ldr r8, [%[a], #172]\n\t" - "ldr r9, [%[b], #208]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[44] * B[51]\n\t" - "ldr r8, [%[a], #176]\n\t" - "ldr r9, [%[b], #204]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[45] * B[50]\n\t" - "ldr r8, [%[a], #180]\n\t" - "ldr r9, [%[b], #200]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[46] * B[49]\n\t" - "ldr r8, [%[a], #184]\n\t" - "ldr r9, [%[b], #196]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[47] * B[48]\n\t" - "ldr r8, [%[a], #188]\n\t" - "ldr r9, [%[b], #192]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[48] * B[47]\n\t" - "ldr r8, [%[a], #192]\n\t" - "ldr r9, [%[b], #188]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[49] * B[46]\n\t" - "ldr r8, [%[a], #196]\n\t" - "ldr r9, [%[b], #184]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[50] * B[45]\n\t" - "ldr r8, [%[a], #200]\n\t" - "ldr r9, [%[b], #180]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[51] * B[44]\n\t" - "ldr r8, [%[a], #204]\n\t" - "ldr r9, [%[b], #176]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[52] * B[43]\n\t" - "ldr r8, [%[a], #208]\n\t" - "ldr r9, [%[b], #172]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[53] * B[42]\n\t" - "ldr r8, [%[a], #212]\n\t" - "ldr r9, [%[b], #168]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[54] * B[41]\n\t" - "ldr r8, [%[a], #216]\n\t" - "ldr r9, [%[b], #164]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[55] * B[40]\n\t" - "ldr r8, [%[a], #220]\n\t" - "ldr r9, [%[b], #160]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[56] * B[39]\n\t" - "ldr r8, [%[a], #224]\n\t" - "ldr r9, [%[b], #156]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[57] * B[38]\n\t" - "ldr r8, [%[a], #228]\n\t" - "ldr r9, [%[b], #152]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[58] * B[37]\n\t" - "ldr r8, [%[a], #232]\n\t" - "ldr r9, [%[b], #148]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[59] * B[36]\n\t" - "ldr r8, [%[a], #236]\n\t" - "ldr r9, [%[b], #144]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[60] * B[35]\n\t" - "ldr r8, [%[a], #240]\n\t" - "ldr r9, [%[b], #140]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[61] * B[34]\n\t" - "ldr r8, [%[a], #244]\n\t" - "ldr r9, [%[b], #136]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[62] * B[33]\n\t" - "ldr r8, [%[a], #248]\n\t" - "ldr r9, [%[b], #132]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[63] * B[32]\n\t" - "ldr r8, [%[a], #252]\n\t" - "ldr r9, [%[b], #128]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "str r5, [%[r], #380]\n\t" - "# A[33] * B[63]\n\t" - "ldr r8, [%[a], #132]\n\t" - "ldr r9, [%[b], #252]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r10, r10\n\t" - "# A[34] * B[62]\n\t" - "ldr r8, [%[a], #136]\n\t" - "ldr r9, [%[b], #248]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[35] * B[61]\n\t" - "ldr r8, [%[a], #140]\n\t" - "ldr r9, [%[b], #244]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[36] * B[60]\n\t" - "ldr r8, [%[a], #144]\n\t" - "ldr r9, [%[b], #240]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[37] * B[59]\n\t" - "ldr r8, [%[a], #148]\n\t" - "ldr r9, [%[b], #236]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[38] * B[58]\n\t" - "ldr r8, [%[a], #152]\n\t" - "ldr r9, [%[b], #232]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[39] * B[57]\n\t" - "ldr r8, [%[a], #156]\n\t" - "ldr r9, [%[b], #228]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[40] * B[56]\n\t" - "ldr r8, [%[a], #160]\n\t" - "ldr r9, [%[b], #224]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[41] * B[55]\n\t" - "ldr r8, [%[a], #164]\n\t" - "ldr r9, [%[b], #220]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[42] * B[54]\n\t" - "ldr r8, [%[a], #168]\n\t" - "ldr r9, [%[b], #216]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[43] * B[53]\n\t" - "ldr r8, [%[a], #172]\n\t" - "ldr r9, [%[b], #212]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[44] * B[52]\n\t" - "ldr r8, [%[a], #176]\n\t" - "ldr r9, [%[b], #208]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[45] * B[51]\n\t" - "ldr r8, [%[a], #180]\n\t" - "ldr r9, [%[b], #204]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[46] * B[50]\n\t" - "ldr r8, [%[a], #184]\n\t" - "ldr r9, [%[b], #200]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[47] * B[49]\n\t" - "ldr r8, [%[a], #188]\n\t" - "ldr r9, [%[b], #196]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[48] * B[48]\n\t" - "ldr r8, [%[a], #192]\n\t" - "ldr r9, [%[b], #192]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[49] * B[47]\n\t" - "ldr r8, [%[a], #196]\n\t" - "ldr r9, [%[b], #188]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[50] * B[46]\n\t" - "ldr r8, [%[a], #200]\n\t" - "ldr r9, [%[b], #184]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[51] * B[45]\n\t" - "ldr r8, [%[a], #204]\n\t" - "ldr r9, [%[b], #180]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[52] * B[44]\n\t" - "ldr r8, [%[a], #208]\n\t" - "ldr r9, [%[b], #176]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[53] * B[43]\n\t" - "ldr r8, [%[a], #212]\n\t" - "ldr r9, [%[b], #172]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[54] * B[42]\n\t" - "ldr r8, [%[a], #216]\n\t" - "ldr r9, [%[b], #168]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[55] * B[41]\n\t" - "ldr r8, [%[a], #220]\n\t" - "ldr r9, [%[b], #164]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[56] * B[40]\n\t" - "ldr r8, [%[a], #224]\n\t" - "ldr r9, [%[b], #160]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[57] * B[39]\n\t" - "ldr r8, [%[a], #228]\n\t" - "ldr r9, [%[b], #156]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[58] * B[38]\n\t" - "ldr r8, [%[a], #232]\n\t" - "ldr r9, [%[b], #152]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[59] * B[37]\n\t" - "ldr r8, [%[a], #236]\n\t" - "ldr r9, [%[b], #148]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[60] * B[36]\n\t" - "ldr r8, [%[a], #240]\n\t" - "ldr r9, [%[b], #144]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[61] * B[35]\n\t" - "ldr r8, [%[a], #244]\n\t" - "ldr r9, [%[b], #140]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[62] * B[34]\n\t" - "ldr r8, [%[a], #248]\n\t" - "ldr r9, [%[b], #136]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[63] * B[33]\n\t" - "ldr r8, [%[a], #252]\n\t" - "ldr r9, [%[b], #132]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "str r3, [%[r], #384]\n\t" - "# A[34] * B[63]\n\t" - "ldr r8, [%[a], #136]\n\t" - "ldr r9, [%[b], #252]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r10, r10\n\t" - "# A[35] * B[62]\n\t" - "ldr r8, [%[a], #140]\n\t" - "ldr r9, [%[b], #248]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[36] * B[61]\n\t" - "ldr r8, [%[a], #144]\n\t" - "ldr r9, [%[b], #244]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[37] * B[60]\n\t" - "ldr r8, [%[a], #148]\n\t" - "ldr r9, [%[b], #240]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[38] * B[59]\n\t" - "ldr r8, [%[a], #152]\n\t" - "ldr r9, [%[b], #236]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[39] * B[58]\n\t" - "ldr r8, [%[a], #156]\n\t" - "ldr r9, [%[b], #232]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[40] * B[57]\n\t" - "ldr r8, [%[a], #160]\n\t" - "ldr r9, [%[b], #228]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[41] * B[56]\n\t" - "ldr r8, [%[a], #164]\n\t" - "ldr r9, [%[b], #224]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[42] * B[55]\n\t" - "ldr r8, [%[a], #168]\n\t" - "ldr r9, [%[b], #220]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[43] * B[54]\n\t" - "ldr r8, [%[a], #172]\n\t" - "ldr r9, [%[b], #216]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[44] * B[53]\n\t" - "ldr r8, [%[a], #176]\n\t" - "ldr r9, [%[b], #212]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[45] * B[52]\n\t" - "ldr r8, [%[a], #180]\n\t" - "ldr r9, [%[b], #208]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[46] * B[51]\n\t" - "ldr r8, [%[a], #184]\n\t" - "ldr r9, [%[b], #204]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[47] * B[50]\n\t" - "ldr r8, [%[a], #188]\n\t" - "ldr r9, [%[b], #200]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[48] * B[49]\n\t" - "ldr r8, [%[a], #192]\n\t" - "ldr r9, [%[b], #196]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[49] * B[48]\n\t" - "ldr r8, [%[a], #196]\n\t" - "ldr r9, [%[b], #192]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[50] * B[47]\n\t" - "ldr r8, [%[a], #200]\n\t" - "ldr r9, [%[b], #188]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[51] * B[46]\n\t" - "ldr r8, [%[a], #204]\n\t" - "ldr r9, [%[b], #184]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[52] * B[45]\n\t" - "ldr r8, [%[a], #208]\n\t" - "ldr r9, [%[b], #180]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[53] * B[44]\n\t" - "ldr r8, [%[a], #212]\n\t" - "ldr r9, [%[b], #176]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[54] * B[43]\n\t" - "ldr r8, [%[a], #216]\n\t" - "ldr r9, [%[b], #172]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[55] * B[42]\n\t" - "ldr r8, [%[a], #220]\n\t" - "ldr r9, [%[b], #168]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[56] * B[41]\n\t" - "ldr r8, [%[a], #224]\n\t" - "ldr r9, [%[b], #164]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[57] * B[40]\n\t" - "ldr r8, [%[a], #228]\n\t" - "ldr r9, [%[b], #160]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[58] * B[39]\n\t" - "ldr r8, [%[a], #232]\n\t" - "ldr r9, [%[b], #156]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[59] * B[38]\n\t" - "ldr r8, [%[a], #236]\n\t" - "ldr r9, [%[b], #152]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[60] * B[37]\n\t" - "ldr r8, [%[a], #240]\n\t" - "ldr r9, [%[b], #148]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[61] * B[36]\n\t" - "ldr r8, [%[a], #244]\n\t" - "ldr r9, [%[b], #144]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[62] * B[35]\n\t" - "ldr r8, [%[a], #248]\n\t" - "ldr r9, [%[b], #140]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[63] * B[34]\n\t" - "ldr r8, [%[a], #252]\n\t" - "ldr r9, [%[b], #136]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "str r4, [%[r], #388]\n\t" - "# A[35] * B[63]\n\t" - "ldr r8, [%[a], #140]\n\t" - "ldr r9, [%[b], #252]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r10, r10\n\t" - "# A[36] * B[62]\n\t" - "ldr r8, [%[a], #144]\n\t" - "ldr r9, [%[b], #248]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[37] * B[61]\n\t" - "ldr r8, [%[a], #148]\n\t" - "ldr r9, [%[b], #244]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[38] * B[60]\n\t" - "ldr r8, [%[a], #152]\n\t" - "ldr r9, [%[b], #240]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[39] * B[59]\n\t" - "ldr r8, [%[a], #156]\n\t" - "ldr r9, [%[b], #236]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[40] * B[58]\n\t" - "ldr r8, [%[a], #160]\n\t" - "ldr r9, [%[b], #232]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[41] * B[57]\n\t" - "ldr r8, [%[a], #164]\n\t" - "ldr r9, [%[b], #228]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[42] * B[56]\n\t" - "ldr r8, [%[a], #168]\n\t" - "ldr r9, [%[b], #224]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[43] * B[55]\n\t" - "ldr r8, [%[a], #172]\n\t" - "ldr r9, [%[b], #220]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[44] * B[54]\n\t" - "ldr r8, [%[a], #176]\n\t" - "ldr r9, [%[b], #216]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[45] * B[53]\n\t" - "ldr r8, [%[a], #180]\n\t" - "ldr r9, [%[b], #212]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[46] * B[52]\n\t" - "ldr r8, [%[a], #184]\n\t" - "ldr r9, [%[b], #208]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[47] * B[51]\n\t" - "ldr r8, [%[a], #188]\n\t" - "ldr r9, [%[b], #204]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[48] * B[50]\n\t" - "ldr r8, [%[a], #192]\n\t" - "ldr r9, [%[b], #200]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[49] * B[49]\n\t" - "ldr r8, [%[a], #196]\n\t" - "ldr r9, [%[b], #196]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[50] * B[48]\n\t" - "ldr r8, [%[a], #200]\n\t" - "ldr r9, [%[b], #192]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[51] * B[47]\n\t" - "ldr r8, [%[a], #204]\n\t" - "ldr r9, [%[b], #188]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[52] * B[46]\n\t" - "ldr r8, [%[a], #208]\n\t" - "ldr r9, [%[b], #184]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[53] * B[45]\n\t" - "ldr r8, [%[a], #212]\n\t" - "ldr r9, [%[b], #180]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[54] * B[44]\n\t" - "ldr r8, [%[a], #216]\n\t" - "ldr r9, [%[b], #176]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[55] * B[43]\n\t" - "ldr r8, [%[a], #220]\n\t" - "ldr r9, [%[b], #172]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[56] * B[42]\n\t" - "ldr r8, [%[a], #224]\n\t" - "ldr r9, [%[b], #168]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[57] * B[41]\n\t" - "ldr r8, [%[a], #228]\n\t" - "ldr r9, [%[b], #164]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[58] * B[40]\n\t" - "ldr r8, [%[a], #232]\n\t" - "ldr r9, [%[b], #160]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[59] * B[39]\n\t" - "ldr r8, [%[a], #236]\n\t" - "ldr r9, [%[b], #156]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[60] * B[38]\n\t" - "ldr r8, [%[a], #240]\n\t" - "ldr r9, [%[b], #152]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[61] * B[37]\n\t" - "ldr r8, [%[a], #244]\n\t" - "ldr r9, [%[b], #148]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[62] * B[36]\n\t" - "ldr r8, [%[a], #248]\n\t" - "ldr r9, [%[b], #144]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[63] * B[35]\n\t" - "ldr r8, [%[a], #252]\n\t" - "ldr r9, [%[b], #140]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "str r5, [%[r], #392]\n\t" - "# A[36] * B[63]\n\t" - "ldr r8, [%[a], #144]\n\t" - "ldr r9, [%[b], #252]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r10, r10\n\t" - "# A[37] * B[62]\n\t" - "ldr r8, [%[a], #148]\n\t" - "ldr r9, [%[b], #248]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[38] * B[61]\n\t" - "ldr r8, [%[a], #152]\n\t" - "ldr r9, [%[b], #244]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[39] * B[60]\n\t" - "ldr r8, [%[a], #156]\n\t" - "ldr r9, [%[b], #240]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[40] * B[59]\n\t" - "ldr r8, [%[a], #160]\n\t" - "ldr r9, [%[b], #236]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[41] * B[58]\n\t" - "ldr r8, [%[a], #164]\n\t" - "ldr r9, [%[b], #232]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[42] * B[57]\n\t" - "ldr r8, [%[a], #168]\n\t" - "ldr r9, [%[b], #228]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[43] * B[56]\n\t" - "ldr r8, [%[a], #172]\n\t" - "ldr r9, [%[b], #224]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[44] * B[55]\n\t" - "ldr r8, [%[a], #176]\n\t" - "ldr r9, [%[b], #220]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[45] * B[54]\n\t" - "ldr r8, [%[a], #180]\n\t" - "ldr r9, [%[b], #216]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[46] * B[53]\n\t" - "ldr r8, [%[a], #184]\n\t" - "ldr r9, [%[b], #212]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[47] * B[52]\n\t" - "ldr r8, [%[a], #188]\n\t" - "ldr r9, [%[b], #208]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[48] * B[51]\n\t" - "ldr r8, [%[a], #192]\n\t" - "ldr r9, [%[b], #204]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[49] * B[50]\n\t" - "ldr r8, [%[a], #196]\n\t" - "ldr r9, [%[b], #200]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[50] * B[49]\n\t" - "ldr r8, [%[a], #200]\n\t" - "ldr r9, [%[b], #196]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[51] * B[48]\n\t" - "ldr r8, [%[a], #204]\n\t" - "ldr r9, [%[b], #192]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[52] * B[47]\n\t" - "ldr r8, [%[a], #208]\n\t" - "ldr r9, [%[b], #188]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[53] * B[46]\n\t" - "ldr r8, [%[a], #212]\n\t" - "ldr r9, [%[b], #184]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[54] * B[45]\n\t" - "ldr r8, [%[a], #216]\n\t" - "ldr r9, [%[b], #180]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[55] * B[44]\n\t" - "ldr r8, [%[a], #220]\n\t" - "ldr r9, [%[b], #176]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[56] * B[43]\n\t" - "ldr r8, [%[a], #224]\n\t" - "ldr r9, [%[b], #172]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[57] * B[42]\n\t" - "ldr r8, [%[a], #228]\n\t" - "ldr r9, [%[b], #168]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[58] * B[41]\n\t" - "ldr r8, [%[a], #232]\n\t" - "ldr r9, [%[b], #164]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[59] * B[40]\n\t" - "ldr r8, [%[a], #236]\n\t" - "ldr r9, [%[b], #160]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[60] * B[39]\n\t" - "ldr r8, [%[a], #240]\n\t" - "ldr r9, [%[b], #156]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[61] * B[38]\n\t" - "ldr r8, [%[a], #244]\n\t" - "ldr r9, [%[b], #152]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[62] * B[37]\n\t" - "ldr r8, [%[a], #248]\n\t" - "ldr r9, [%[b], #148]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[63] * B[36]\n\t" - "ldr r8, [%[a], #252]\n\t" - "ldr r9, [%[b], #144]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "str r3, [%[r], #396]\n\t" - "# A[37] * B[63]\n\t" - "ldr r8, [%[a], #148]\n\t" - "ldr r9, [%[b], #252]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r10, r10\n\t" - "# A[38] * B[62]\n\t" - "ldr r8, [%[a], #152]\n\t" - "ldr r9, [%[b], #248]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[39] * B[61]\n\t" - "ldr r8, [%[a], #156]\n\t" - "ldr r9, [%[b], #244]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[40] * B[60]\n\t" - "ldr r8, [%[a], #160]\n\t" - "ldr r9, [%[b], #240]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[41] * B[59]\n\t" - "ldr r8, [%[a], #164]\n\t" - "ldr r9, [%[b], #236]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[42] * B[58]\n\t" - "ldr r8, [%[a], #168]\n\t" - "ldr r9, [%[b], #232]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[43] * B[57]\n\t" - "ldr r8, [%[a], #172]\n\t" - "ldr r9, [%[b], #228]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[44] * B[56]\n\t" - "ldr r8, [%[a], #176]\n\t" - "ldr r9, [%[b], #224]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[45] * B[55]\n\t" - "ldr r8, [%[a], #180]\n\t" - "ldr r9, [%[b], #220]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[46] * B[54]\n\t" - "ldr r8, [%[a], #184]\n\t" - "ldr r9, [%[b], #216]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[47] * B[53]\n\t" - "ldr r8, [%[a], #188]\n\t" - "ldr r9, [%[b], #212]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[48] * B[52]\n\t" - "ldr r8, [%[a], #192]\n\t" - "ldr r9, [%[b], #208]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[49] * B[51]\n\t" - "ldr r8, [%[a], #196]\n\t" - "ldr r9, [%[b], #204]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[50] * B[50]\n\t" - "ldr r8, [%[a], #200]\n\t" - "ldr r9, [%[b], #200]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[51] * B[49]\n\t" - "ldr r8, [%[a], #204]\n\t" - "ldr r9, [%[b], #196]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[52] * B[48]\n\t" - "ldr r8, [%[a], #208]\n\t" - "ldr r9, [%[b], #192]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[53] * B[47]\n\t" - "ldr r8, [%[a], #212]\n\t" - "ldr r9, [%[b], #188]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[54] * B[46]\n\t" - "ldr r8, [%[a], #216]\n\t" - "ldr r9, [%[b], #184]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[55] * B[45]\n\t" - "ldr r8, [%[a], #220]\n\t" - "ldr r9, [%[b], #180]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[56] * B[44]\n\t" - "ldr r8, [%[a], #224]\n\t" - "ldr r9, [%[b], #176]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[57] * B[43]\n\t" - "ldr r8, [%[a], #228]\n\t" - "ldr r9, [%[b], #172]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[58] * B[42]\n\t" - "ldr r8, [%[a], #232]\n\t" - "ldr r9, [%[b], #168]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[59] * B[41]\n\t" - "ldr r8, [%[a], #236]\n\t" - "ldr r9, [%[b], #164]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[60] * B[40]\n\t" - "ldr r8, [%[a], #240]\n\t" - "ldr r9, [%[b], #160]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[61] * B[39]\n\t" - "ldr r8, [%[a], #244]\n\t" - "ldr r9, [%[b], #156]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[62] * B[38]\n\t" - "ldr r8, [%[a], #248]\n\t" - "ldr r9, [%[b], #152]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[63] * B[37]\n\t" - "ldr r8, [%[a], #252]\n\t" - "ldr r9, [%[b], #148]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "str r4, [%[r], #400]\n\t" - "# A[38] * B[63]\n\t" - "ldr r8, [%[a], #152]\n\t" - "ldr r9, [%[b], #252]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r10, r10\n\t" - "# A[39] * B[62]\n\t" - "ldr r8, [%[a], #156]\n\t" - "ldr r9, [%[b], #248]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[40] * B[61]\n\t" - "ldr r8, [%[a], #160]\n\t" - "ldr r9, [%[b], #244]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[41] * B[60]\n\t" - "ldr r8, [%[a], #164]\n\t" - "ldr r9, [%[b], #240]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[42] * B[59]\n\t" - "ldr r8, [%[a], #168]\n\t" - "ldr r9, [%[b], #236]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[43] * B[58]\n\t" - "ldr r8, [%[a], #172]\n\t" - "ldr r9, [%[b], #232]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[44] * B[57]\n\t" - "ldr r8, [%[a], #176]\n\t" - "ldr r9, [%[b], #228]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[45] * B[56]\n\t" - "ldr r8, [%[a], #180]\n\t" - "ldr r9, [%[b], #224]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[46] * B[55]\n\t" - "ldr r8, [%[a], #184]\n\t" - "ldr r9, [%[b], #220]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[47] * B[54]\n\t" - "ldr r8, [%[a], #188]\n\t" - "ldr r9, [%[b], #216]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[48] * B[53]\n\t" - "ldr r8, [%[a], #192]\n\t" - "ldr r9, [%[b], #212]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[49] * B[52]\n\t" - "ldr r8, [%[a], #196]\n\t" - "ldr r9, [%[b], #208]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[50] * B[51]\n\t" - "ldr r8, [%[a], #200]\n\t" - "ldr r9, [%[b], #204]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[51] * B[50]\n\t" - "ldr r8, [%[a], #204]\n\t" - "ldr r9, [%[b], #200]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[52] * B[49]\n\t" - "ldr r8, [%[a], #208]\n\t" - "ldr r9, [%[b], #196]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[53] * B[48]\n\t" - "ldr r8, [%[a], #212]\n\t" - "ldr r9, [%[b], #192]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[54] * B[47]\n\t" - "ldr r8, [%[a], #216]\n\t" - "ldr r9, [%[b], #188]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[55] * B[46]\n\t" - "ldr r8, [%[a], #220]\n\t" - "ldr r9, [%[b], #184]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[56] * B[45]\n\t" - "ldr r8, [%[a], #224]\n\t" - "ldr r9, [%[b], #180]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[57] * B[44]\n\t" - "ldr r8, [%[a], #228]\n\t" - "ldr r9, [%[b], #176]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[58] * B[43]\n\t" - "ldr r8, [%[a], #232]\n\t" - "ldr r9, [%[b], #172]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[59] * B[42]\n\t" - "ldr r8, [%[a], #236]\n\t" - "ldr r9, [%[b], #168]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[60] * B[41]\n\t" - "ldr r8, [%[a], #240]\n\t" - "ldr r9, [%[b], #164]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[61] * B[40]\n\t" - "ldr r8, [%[a], #244]\n\t" - "ldr r9, [%[b], #160]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[62] * B[39]\n\t" - "ldr r8, [%[a], #248]\n\t" - "ldr r9, [%[b], #156]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[63] * B[38]\n\t" - "ldr r8, [%[a], #252]\n\t" - "ldr r9, [%[b], #152]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "str r5, [%[r], #404]\n\t" - "# A[39] * B[63]\n\t" - "ldr r8, [%[a], #156]\n\t" - "ldr r9, [%[b], #252]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r10, r10\n\t" - "# A[40] * B[62]\n\t" - "ldr r8, [%[a], #160]\n\t" - "ldr r9, [%[b], #248]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[41] * B[61]\n\t" - "ldr r8, [%[a], #164]\n\t" - "ldr r9, [%[b], #244]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[42] * B[60]\n\t" - "ldr r8, [%[a], #168]\n\t" - "ldr r9, [%[b], #240]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[43] * B[59]\n\t" - "ldr r8, [%[a], #172]\n\t" - "ldr r9, [%[b], #236]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[44] * B[58]\n\t" - "ldr r8, [%[a], #176]\n\t" - "ldr r9, [%[b], #232]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[45] * B[57]\n\t" - "ldr r8, [%[a], #180]\n\t" - "ldr r9, [%[b], #228]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[46] * B[56]\n\t" - "ldr r8, [%[a], #184]\n\t" - "ldr r9, [%[b], #224]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[47] * B[55]\n\t" - "ldr r8, [%[a], #188]\n\t" - "ldr r9, [%[b], #220]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[48] * B[54]\n\t" - "ldr r8, [%[a], #192]\n\t" - "ldr r9, [%[b], #216]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[49] * B[53]\n\t" - "ldr r8, [%[a], #196]\n\t" - "ldr r9, [%[b], #212]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[50] * B[52]\n\t" - "ldr r8, [%[a], #200]\n\t" - "ldr r9, [%[b], #208]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[51] * B[51]\n\t" - "ldr r8, [%[a], #204]\n\t" - "ldr r9, [%[b], #204]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[52] * B[50]\n\t" - "ldr r8, [%[a], #208]\n\t" - "ldr r9, [%[b], #200]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[53] * B[49]\n\t" - "ldr r8, [%[a], #212]\n\t" - "ldr r9, [%[b], #196]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[54] * B[48]\n\t" - "ldr r8, [%[a], #216]\n\t" - "ldr r9, [%[b], #192]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[55] * B[47]\n\t" - "ldr r8, [%[a], #220]\n\t" - "ldr r9, [%[b], #188]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[56] * B[46]\n\t" - "ldr r8, [%[a], #224]\n\t" - "ldr r9, [%[b], #184]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[57] * B[45]\n\t" - "ldr r8, [%[a], #228]\n\t" - "ldr r9, [%[b], #180]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[58] * B[44]\n\t" - "ldr r8, [%[a], #232]\n\t" - "ldr r9, [%[b], #176]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[59] * B[43]\n\t" - "ldr r8, [%[a], #236]\n\t" - "ldr r9, [%[b], #172]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[60] * B[42]\n\t" - "ldr r8, [%[a], #240]\n\t" - "ldr r9, [%[b], #168]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[61] * B[41]\n\t" - "ldr r8, [%[a], #244]\n\t" - "ldr r9, [%[b], #164]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[62] * B[40]\n\t" - "ldr r8, [%[a], #248]\n\t" - "ldr r9, [%[b], #160]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[63] * B[39]\n\t" - "ldr r8, [%[a], #252]\n\t" - "ldr r9, [%[b], #156]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "str r3, [%[r], #408]\n\t" - "# A[40] * B[63]\n\t" - "ldr r8, [%[a], #160]\n\t" - "ldr r9, [%[b], #252]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r10, r10\n\t" - "# A[41] * B[62]\n\t" - "ldr r8, [%[a], #164]\n\t" - "ldr r9, [%[b], #248]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[42] * B[61]\n\t" - "ldr r8, [%[a], #168]\n\t" - "ldr r9, [%[b], #244]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[43] * B[60]\n\t" - "ldr r8, [%[a], #172]\n\t" - "ldr r9, [%[b], #240]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[44] * B[59]\n\t" - "ldr r8, [%[a], #176]\n\t" - "ldr r9, [%[b], #236]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[45] * B[58]\n\t" - "ldr r8, [%[a], #180]\n\t" - "ldr r9, [%[b], #232]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[46] * B[57]\n\t" - "ldr r8, [%[a], #184]\n\t" - "ldr r9, [%[b], #228]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[47] * B[56]\n\t" - "ldr r8, [%[a], #188]\n\t" - "ldr r9, [%[b], #224]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[48] * B[55]\n\t" - "ldr r8, [%[a], #192]\n\t" - "ldr r9, [%[b], #220]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[49] * B[54]\n\t" - "ldr r8, [%[a], #196]\n\t" - "ldr r9, [%[b], #216]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[50] * B[53]\n\t" - "ldr r8, [%[a], #200]\n\t" - "ldr r9, [%[b], #212]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[51] * B[52]\n\t" - "ldr r8, [%[a], #204]\n\t" - "ldr r9, [%[b], #208]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[52] * B[51]\n\t" - "ldr r8, [%[a], #208]\n\t" - "ldr r9, [%[b], #204]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[53] * B[50]\n\t" - "ldr r8, [%[a], #212]\n\t" - "ldr r9, [%[b], #200]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[54] * B[49]\n\t" - "ldr r8, [%[a], #216]\n\t" - "ldr r9, [%[b], #196]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[55] * B[48]\n\t" - "ldr r8, [%[a], #220]\n\t" - "ldr r9, [%[b], #192]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[56] * B[47]\n\t" - "ldr r8, [%[a], #224]\n\t" - "ldr r9, [%[b], #188]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[57] * B[46]\n\t" - "ldr r8, [%[a], #228]\n\t" - "ldr r9, [%[b], #184]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[58] * B[45]\n\t" - "ldr r8, [%[a], #232]\n\t" - "ldr r9, [%[b], #180]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[59] * B[44]\n\t" - "ldr r8, [%[a], #236]\n\t" - "ldr r9, [%[b], #176]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[60] * B[43]\n\t" - "ldr r8, [%[a], #240]\n\t" - "ldr r9, [%[b], #172]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[61] * B[42]\n\t" - "ldr r8, [%[a], #244]\n\t" - "ldr r9, [%[b], #168]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[62] * B[41]\n\t" - "ldr r8, [%[a], #248]\n\t" - "ldr r9, [%[b], #164]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[63] * B[40]\n\t" - "ldr r8, [%[a], #252]\n\t" - "ldr r9, [%[b], #160]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "str r4, [%[r], #412]\n\t" - "# A[41] * B[63]\n\t" - "ldr r8, [%[a], #164]\n\t" - "ldr r9, [%[b], #252]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r10, r10\n\t" - "# A[42] * B[62]\n\t" - "ldr r8, [%[a], #168]\n\t" - "ldr r9, [%[b], #248]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[43] * B[61]\n\t" - "ldr r8, [%[a], #172]\n\t" - "ldr r9, [%[b], #244]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[44] * B[60]\n\t" - "ldr r8, [%[a], #176]\n\t" - "ldr r9, [%[b], #240]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[45] * B[59]\n\t" - "ldr r8, [%[a], #180]\n\t" - "ldr r9, [%[b], #236]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[46] * B[58]\n\t" - "ldr r8, [%[a], #184]\n\t" - "ldr r9, [%[b], #232]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[47] * B[57]\n\t" - "ldr r8, [%[a], #188]\n\t" - "ldr r9, [%[b], #228]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[48] * B[56]\n\t" - "ldr r8, [%[a], #192]\n\t" - "ldr r9, [%[b], #224]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[49] * B[55]\n\t" - "ldr r8, [%[a], #196]\n\t" - "ldr r9, [%[b], #220]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[50] * B[54]\n\t" - "ldr r8, [%[a], #200]\n\t" - "ldr r9, [%[b], #216]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[51] * B[53]\n\t" - "ldr r8, [%[a], #204]\n\t" - "ldr r9, [%[b], #212]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[52] * B[52]\n\t" - "ldr r8, [%[a], #208]\n\t" - "ldr r9, [%[b], #208]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[53] * B[51]\n\t" - "ldr r8, [%[a], #212]\n\t" - "ldr r9, [%[b], #204]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[54] * B[50]\n\t" - "ldr r8, [%[a], #216]\n\t" - "ldr r9, [%[b], #200]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[55] * B[49]\n\t" - "ldr r8, [%[a], #220]\n\t" - "ldr r9, [%[b], #196]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[56] * B[48]\n\t" - "ldr r8, [%[a], #224]\n\t" - "ldr r9, [%[b], #192]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[57] * B[47]\n\t" - "ldr r8, [%[a], #228]\n\t" - "ldr r9, [%[b], #188]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[58] * B[46]\n\t" - "ldr r8, [%[a], #232]\n\t" - "ldr r9, [%[b], #184]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[59] * B[45]\n\t" - "ldr r8, [%[a], #236]\n\t" - "ldr r9, [%[b], #180]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[60] * B[44]\n\t" - "ldr r8, [%[a], #240]\n\t" - "ldr r9, [%[b], #176]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[61] * B[43]\n\t" - "ldr r8, [%[a], #244]\n\t" - "ldr r9, [%[b], #172]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[62] * B[42]\n\t" - "ldr r8, [%[a], #248]\n\t" - "ldr r9, [%[b], #168]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[63] * B[41]\n\t" - "ldr r8, [%[a], #252]\n\t" - "ldr r9, [%[b], #164]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "str r5, [%[r], #416]\n\t" - "# A[42] * B[63]\n\t" - "ldr r8, [%[a], #168]\n\t" - "ldr r9, [%[b], #252]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r10, r10\n\t" - "# A[43] * B[62]\n\t" - "ldr r8, [%[a], #172]\n\t" - "ldr r9, [%[b], #248]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[44] * B[61]\n\t" - "ldr r8, [%[a], #176]\n\t" - "ldr r9, [%[b], #244]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[45] * B[60]\n\t" - "ldr r8, [%[a], #180]\n\t" - "ldr r9, [%[b], #240]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[46] * B[59]\n\t" - "ldr r8, [%[a], #184]\n\t" - "ldr r9, [%[b], #236]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[47] * B[58]\n\t" - "ldr r8, [%[a], #188]\n\t" - "ldr r9, [%[b], #232]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[48] * B[57]\n\t" - "ldr r8, [%[a], #192]\n\t" - "ldr r9, [%[b], #228]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[49] * B[56]\n\t" - "ldr r8, [%[a], #196]\n\t" - "ldr r9, [%[b], #224]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[50] * B[55]\n\t" - "ldr r8, [%[a], #200]\n\t" - "ldr r9, [%[b], #220]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[51] * B[54]\n\t" - "ldr r8, [%[a], #204]\n\t" - "ldr r9, [%[b], #216]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[52] * B[53]\n\t" - "ldr r8, [%[a], #208]\n\t" - "ldr r9, [%[b], #212]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[53] * B[52]\n\t" - "ldr r8, [%[a], #212]\n\t" - "ldr r9, [%[b], #208]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[54] * B[51]\n\t" - "ldr r8, [%[a], #216]\n\t" - "ldr r9, [%[b], #204]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[55] * B[50]\n\t" - "ldr r8, [%[a], #220]\n\t" - "ldr r9, [%[b], #200]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[56] * B[49]\n\t" - "ldr r8, [%[a], #224]\n\t" - "ldr r9, [%[b], #196]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[57] * B[48]\n\t" - "ldr r8, [%[a], #228]\n\t" - "ldr r9, [%[b], #192]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[58] * B[47]\n\t" - "ldr r8, [%[a], #232]\n\t" - "ldr r9, [%[b], #188]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[59] * B[46]\n\t" - "ldr r8, [%[a], #236]\n\t" - "ldr r9, [%[b], #184]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[60] * B[45]\n\t" - "ldr r8, [%[a], #240]\n\t" - "ldr r9, [%[b], #180]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[61] * B[44]\n\t" - "ldr r8, [%[a], #244]\n\t" - "ldr r9, [%[b], #176]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[62] * B[43]\n\t" - "ldr r8, [%[a], #248]\n\t" - "ldr r9, [%[b], #172]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[63] * B[42]\n\t" - "ldr r8, [%[a], #252]\n\t" - "ldr r9, [%[b], #168]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "str r3, [%[r], #420]\n\t" - "# A[43] * B[63]\n\t" - "ldr r8, [%[a], #172]\n\t" - "ldr r9, [%[b], #252]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r10, r10\n\t" - "# A[44] * B[62]\n\t" - "ldr r8, [%[a], #176]\n\t" - "ldr r9, [%[b], #248]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[45] * B[61]\n\t" - "ldr r8, [%[a], #180]\n\t" - "ldr r9, [%[b], #244]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[46] * B[60]\n\t" - "ldr r8, [%[a], #184]\n\t" - "ldr r9, [%[b], #240]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[47] * B[59]\n\t" - "ldr r8, [%[a], #188]\n\t" - "ldr r9, [%[b], #236]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[48] * B[58]\n\t" - "ldr r8, [%[a], #192]\n\t" - "ldr r9, [%[b], #232]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[49] * B[57]\n\t" - "ldr r8, [%[a], #196]\n\t" - "ldr r9, [%[b], #228]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[50] * B[56]\n\t" - "ldr r8, [%[a], #200]\n\t" - "ldr r9, [%[b], #224]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[51] * B[55]\n\t" - "ldr r8, [%[a], #204]\n\t" - "ldr r9, [%[b], #220]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[52] * B[54]\n\t" - "ldr r8, [%[a], #208]\n\t" - "ldr r9, [%[b], #216]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[53] * B[53]\n\t" - "ldr r8, [%[a], #212]\n\t" - "ldr r9, [%[b], #212]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[54] * B[52]\n\t" - "ldr r8, [%[a], #216]\n\t" - "ldr r9, [%[b], #208]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[55] * B[51]\n\t" - "ldr r8, [%[a], #220]\n\t" - "ldr r9, [%[b], #204]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[56] * B[50]\n\t" - "ldr r8, [%[a], #224]\n\t" - "ldr r9, [%[b], #200]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[57] * B[49]\n\t" - "ldr r8, [%[a], #228]\n\t" - "ldr r9, [%[b], #196]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[58] * B[48]\n\t" - "ldr r8, [%[a], #232]\n\t" - "ldr r9, [%[b], #192]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[59] * B[47]\n\t" - "ldr r8, [%[a], #236]\n\t" - "ldr r9, [%[b], #188]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[60] * B[46]\n\t" - "ldr r8, [%[a], #240]\n\t" - "ldr r9, [%[b], #184]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[61] * B[45]\n\t" - "ldr r8, [%[a], #244]\n\t" - "ldr r9, [%[b], #180]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[62] * B[44]\n\t" - "ldr r8, [%[a], #248]\n\t" - "ldr r9, [%[b], #176]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[63] * B[43]\n\t" - "ldr r8, [%[a], #252]\n\t" - "ldr r9, [%[b], #172]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "str r4, [%[r], #424]\n\t" - "# A[44] * B[63]\n\t" - "ldr r8, [%[a], #176]\n\t" - "ldr r9, [%[b], #252]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r10, r10\n\t" - "# A[45] * B[62]\n\t" - "ldr r8, [%[a], #180]\n\t" - "ldr r9, [%[b], #248]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[46] * B[61]\n\t" - "ldr r8, [%[a], #184]\n\t" - "ldr r9, [%[b], #244]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[47] * B[60]\n\t" - "ldr r8, [%[a], #188]\n\t" - "ldr r9, [%[b], #240]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[48] * B[59]\n\t" - "ldr r8, [%[a], #192]\n\t" - "ldr r9, [%[b], #236]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[49] * B[58]\n\t" - "ldr r8, [%[a], #196]\n\t" - "ldr r9, [%[b], #232]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[50] * B[57]\n\t" - "ldr r8, [%[a], #200]\n\t" - "ldr r9, [%[b], #228]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[51] * B[56]\n\t" - "ldr r8, [%[a], #204]\n\t" - "ldr r9, [%[b], #224]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[52] * B[55]\n\t" - "ldr r8, [%[a], #208]\n\t" - "ldr r9, [%[b], #220]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[53] * B[54]\n\t" - "ldr r8, [%[a], #212]\n\t" - "ldr r9, [%[b], #216]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[54] * B[53]\n\t" - "ldr r8, [%[a], #216]\n\t" - "ldr r9, [%[b], #212]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[55] * B[52]\n\t" - "ldr r8, [%[a], #220]\n\t" - "ldr r9, [%[b], #208]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[56] * B[51]\n\t" - "ldr r8, [%[a], #224]\n\t" - "ldr r9, [%[b], #204]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[57] * B[50]\n\t" - "ldr r8, [%[a], #228]\n\t" - "ldr r9, [%[b], #200]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[58] * B[49]\n\t" - "ldr r8, [%[a], #232]\n\t" - "ldr r9, [%[b], #196]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[59] * B[48]\n\t" - "ldr r8, [%[a], #236]\n\t" - "ldr r9, [%[b], #192]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[60] * B[47]\n\t" - "ldr r8, [%[a], #240]\n\t" - "ldr r9, [%[b], #188]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[61] * B[46]\n\t" - "ldr r8, [%[a], #244]\n\t" - "ldr r9, [%[b], #184]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[62] * B[45]\n\t" - "ldr r8, [%[a], #248]\n\t" - "ldr r9, [%[b], #180]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[63] * B[44]\n\t" - "ldr r8, [%[a], #252]\n\t" - "ldr r9, [%[b], #176]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "str r5, [%[r], #428]\n\t" - "# A[45] * B[63]\n\t" - "ldr r8, [%[a], #180]\n\t" - "ldr r9, [%[b], #252]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r10, r10\n\t" - "# A[46] * B[62]\n\t" - "ldr r8, [%[a], #184]\n\t" - "ldr r9, [%[b], #248]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[47] * B[61]\n\t" - "ldr r8, [%[a], #188]\n\t" - "ldr r9, [%[b], #244]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[48] * B[60]\n\t" - "ldr r8, [%[a], #192]\n\t" - "ldr r9, [%[b], #240]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[49] * B[59]\n\t" - "ldr r8, [%[a], #196]\n\t" - "ldr r9, [%[b], #236]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[50] * B[58]\n\t" - "ldr r8, [%[a], #200]\n\t" - "ldr r9, [%[b], #232]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[51] * B[57]\n\t" - "ldr r8, [%[a], #204]\n\t" - "ldr r9, [%[b], #228]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[52] * B[56]\n\t" - "ldr r8, [%[a], #208]\n\t" - "ldr r9, [%[b], #224]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[53] * B[55]\n\t" - "ldr r8, [%[a], #212]\n\t" - "ldr r9, [%[b], #220]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[54] * B[54]\n\t" - "ldr r8, [%[a], #216]\n\t" - "ldr r9, [%[b], #216]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[55] * B[53]\n\t" - "ldr r8, [%[a], #220]\n\t" - "ldr r9, [%[b], #212]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[56] * B[52]\n\t" - "ldr r8, [%[a], #224]\n\t" - "ldr r9, [%[b], #208]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[57] * B[51]\n\t" - "ldr r8, [%[a], #228]\n\t" - "ldr r9, [%[b], #204]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[58] * B[50]\n\t" - "ldr r8, [%[a], #232]\n\t" - "ldr r9, [%[b], #200]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[59] * B[49]\n\t" - "ldr r8, [%[a], #236]\n\t" - "ldr r9, [%[b], #196]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[60] * B[48]\n\t" - "ldr r8, [%[a], #240]\n\t" - "ldr r9, [%[b], #192]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[61] * B[47]\n\t" - "ldr r8, [%[a], #244]\n\t" - "ldr r9, [%[b], #188]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[62] * B[46]\n\t" - "ldr r8, [%[a], #248]\n\t" - "ldr r9, [%[b], #184]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[63] * B[45]\n\t" - "ldr r8, [%[a], #252]\n\t" - "ldr r9, [%[b], #180]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "str r3, [%[r], #432]\n\t" - "# A[46] * B[63]\n\t" - "ldr r8, [%[a], #184]\n\t" - "ldr r9, [%[b], #252]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r10, r10\n\t" - "# A[47] * B[62]\n\t" - "ldr r8, [%[a], #188]\n\t" - "ldr r9, [%[b], #248]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[48] * B[61]\n\t" - "ldr r8, [%[a], #192]\n\t" - "ldr r9, [%[b], #244]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[49] * B[60]\n\t" - "ldr r8, [%[a], #196]\n\t" - "ldr r9, [%[b], #240]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[50] * B[59]\n\t" - "ldr r8, [%[a], #200]\n\t" - "ldr r9, [%[b], #236]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[51] * B[58]\n\t" - "ldr r8, [%[a], #204]\n\t" - "ldr r9, [%[b], #232]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[52] * B[57]\n\t" - "ldr r8, [%[a], #208]\n\t" - "ldr r9, [%[b], #228]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[53] * B[56]\n\t" - "ldr r8, [%[a], #212]\n\t" - "ldr r9, [%[b], #224]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[54] * B[55]\n\t" - "ldr r8, [%[a], #216]\n\t" - "ldr r9, [%[b], #220]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[55] * B[54]\n\t" - "ldr r8, [%[a], #220]\n\t" - "ldr r9, [%[b], #216]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[56] * B[53]\n\t" - "ldr r8, [%[a], #224]\n\t" - "ldr r9, [%[b], #212]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[57] * B[52]\n\t" - "ldr r8, [%[a], #228]\n\t" - "ldr r9, [%[b], #208]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[58] * B[51]\n\t" - "ldr r8, [%[a], #232]\n\t" - "ldr r9, [%[b], #204]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[59] * B[50]\n\t" - "ldr r8, [%[a], #236]\n\t" - "ldr r9, [%[b], #200]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[60] * B[49]\n\t" - "ldr r8, [%[a], #240]\n\t" - "ldr r9, [%[b], #196]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[61] * B[48]\n\t" - "ldr r8, [%[a], #244]\n\t" - "ldr r9, [%[b], #192]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[62] * B[47]\n\t" - "ldr r8, [%[a], #248]\n\t" - "ldr r9, [%[b], #188]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[63] * B[46]\n\t" - "ldr r8, [%[a], #252]\n\t" - "ldr r9, [%[b], #184]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "str r4, [%[r], #436]\n\t" - "# A[47] * B[63]\n\t" - "ldr r8, [%[a], #188]\n\t" - "ldr r9, [%[b], #252]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r10, r10\n\t" - "# A[48] * B[62]\n\t" - "ldr r8, [%[a], #192]\n\t" - "ldr r9, [%[b], #248]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[49] * B[61]\n\t" - "ldr r8, [%[a], #196]\n\t" - "ldr r9, [%[b], #244]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[50] * B[60]\n\t" - "ldr r8, [%[a], #200]\n\t" - "ldr r9, [%[b], #240]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[51] * B[59]\n\t" - "ldr r8, [%[a], #204]\n\t" - "ldr r9, [%[b], #236]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[52] * B[58]\n\t" - "ldr r8, [%[a], #208]\n\t" - "ldr r9, [%[b], #232]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[53] * B[57]\n\t" - "ldr r8, [%[a], #212]\n\t" - "ldr r9, [%[b], #228]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[54] * B[56]\n\t" - "ldr r8, [%[a], #216]\n\t" - "ldr r9, [%[b], #224]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[55] * B[55]\n\t" - "ldr r8, [%[a], #220]\n\t" - "ldr r9, [%[b], #220]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[56] * B[54]\n\t" - "ldr r8, [%[a], #224]\n\t" - "ldr r9, [%[b], #216]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[57] * B[53]\n\t" - "ldr r8, [%[a], #228]\n\t" - "ldr r9, [%[b], #212]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[58] * B[52]\n\t" - "ldr r8, [%[a], #232]\n\t" - "ldr r9, [%[b], #208]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[59] * B[51]\n\t" - "ldr r8, [%[a], #236]\n\t" - "ldr r9, [%[b], #204]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[60] * B[50]\n\t" - "ldr r8, [%[a], #240]\n\t" - "ldr r9, [%[b], #200]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[61] * B[49]\n\t" - "ldr r8, [%[a], #244]\n\t" - "ldr r9, [%[b], #196]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[62] * B[48]\n\t" - "ldr r8, [%[a], #248]\n\t" - "ldr r9, [%[b], #192]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[63] * B[47]\n\t" - "ldr r8, [%[a], #252]\n\t" - "ldr r9, [%[b], #188]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "str r5, [%[r], #440]\n\t" - "# A[48] * B[63]\n\t" - "ldr r8, [%[a], #192]\n\t" - "ldr r9, [%[b], #252]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r10, r10\n\t" - "# A[49] * B[62]\n\t" - "ldr r8, [%[a], #196]\n\t" - "ldr r9, [%[b], #248]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[50] * B[61]\n\t" - "ldr r8, [%[a], #200]\n\t" - "ldr r9, [%[b], #244]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[51] * B[60]\n\t" - "ldr r8, [%[a], #204]\n\t" - "ldr r9, [%[b], #240]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[52] * B[59]\n\t" - "ldr r8, [%[a], #208]\n\t" - "ldr r9, [%[b], #236]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[53] * B[58]\n\t" - "ldr r8, [%[a], #212]\n\t" - "ldr r9, [%[b], #232]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[54] * B[57]\n\t" - "ldr r8, [%[a], #216]\n\t" - "ldr r9, [%[b], #228]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[55] * B[56]\n\t" - "ldr r8, [%[a], #220]\n\t" - "ldr r9, [%[b], #224]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[56] * B[55]\n\t" - "ldr r8, [%[a], #224]\n\t" - "ldr r9, [%[b], #220]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[57] * B[54]\n\t" - "ldr r8, [%[a], #228]\n\t" - "ldr r9, [%[b], #216]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[58] * B[53]\n\t" - "ldr r8, [%[a], #232]\n\t" - "ldr r9, [%[b], #212]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[59] * B[52]\n\t" - "ldr r8, [%[a], #236]\n\t" - "ldr r9, [%[b], #208]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[60] * B[51]\n\t" - "ldr r8, [%[a], #240]\n\t" - "ldr r9, [%[b], #204]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[61] * B[50]\n\t" - "ldr r8, [%[a], #244]\n\t" - "ldr r9, [%[b], #200]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[62] * B[49]\n\t" - "ldr r8, [%[a], #248]\n\t" - "ldr r9, [%[b], #196]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[63] * B[48]\n\t" - "ldr r8, [%[a], #252]\n\t" - "ldr r9, [%[b], #192]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "str r3, [%[r], #444]\n\t" - "# A[49] * B[63]\n\t" - "ldr r8, [%[a], #196]\n\t" - "ldr r9, [%[b], #252]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r10, r10\n\t" - "# A[50] * B[62]\n\t" - "ldr r8, [%[a], #200]\n\t" - "ldr r9, [%[b], #248]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[51] * B[61]\n\t" - "ldr r8, [%[a], #204]\n\t" - "ldr r9, [%[b], #244]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[52] * B[60]\n\t" - "ldr r8, [%[a], #208]\n\t" - "ldr r9, [%[b], #240]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[53] * B[59]\n\t" - "ldr r8, [%[a], #212]\n\t" - "ldr r9, [%[b], #236]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[54] * B[58]\n\t" - "ldr r8, [%[a], #216]\n\t" - "ldr r9, [%[b], #232]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[55] * B[57]\n\t" - "ldr r8, [%[a], #220]\n\t" - "ldr r9, [%[b], #228]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[56] * B[56]\n\t" - "ldr r8, [%[a], #224]\n\t" - "ldr r9, [%[b], #224]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[57] * B[55]\n\t" - "ldr r8, [%[a], #228]\n\t" - "ldr r9, [%[b], #220]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[58] * B[54]\n\t" - "ldr r8, [%[a], #232]\n\t" - "ldr r9, [%[b], #216]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[59] * B[53]\n\t" - "ldr r8, [%[a], #236]\n\t" - "ldr r9, [%[b], #212]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[60] * B[52]\n\t" - "ldr r8, [%[a], #240]\n\t" - "ldr r9, [%[b], #208]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[61] * B[51]\n\t" - "ldr r8, [%[a], #244]\n\t" - "ldr r9, [%[b], #204]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[62] * B[50]\n\t" - "ldr r8, [%[a], #248]\n\t" - "ldr r9, [%[b], #200]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[63] * B[49]\n\t" - "ldr r8, [%[a], #252]\n\t" - "ldr r9, [%[b], #196]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "str r4, [%[r], #448]\n\t" - "# A[50] * B[63]\n\t" - "ldr r8, [%[a], #200]\n\t" - "ldr r9, [%[b], #252]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r10, r10\n\t" - "# A[51] * B[62]\n\t" - "ldr r8, [%[a], #204]\n\t" - "ldr r9, [%[b], #248]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[52] * B[61]\n\t" - "ldr r8, [%[a], #208]\n\t" - "ldr r9, [%[b], #244]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[53] * B[60]\n\t" - "ldr r8, [%[a], #212]\n\t" - "ldr r9, [%[b], #240]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[54] * B[59]\n\t" - "ldr r8, [%[a], #216]\n\t" - "ldr r9, [%[b], #236]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[55] * B[58]\n\t" - "ldr r8, [%[a], #220]\n\t" - "ldr r9, [%[b], #232]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[56] * B[57]\n\t" - "ldr r8, [%[a], #224]\n\t" - "ldr r9, [%[b], #228]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[57] * B[56]\n\t" - "ldr r8, [%[a], #228]\n\t" - "ldr r9, [%[b], #224]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[58] * B[55]\n\t" - "ldr r8, [%[a], #232]\n\t" - "ldr r9, [%[b], #220]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[59] * B[54]\n\t" - "ldr r8, [%[a], #236]\n\t" - "ldr r9, [%[b], #216]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[60] * B[53]\n\t" - "ldr r8, [%[a], #240]\n\t" - "ldr r9, [%[b], #212]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[61] * B[52]\n\t" - "ldr r8, [%[a], #244]\n\t" - "ldr r9, [%[b], #208]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[62] * B[51]\n\t" - "ldr r8, [%[a], #248]\n\t" - "ldr r9, [%[b], #204]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[63] * B[50]\n\t" - "ldr r8, [%[a], #252]\n\t" - "ldr r9, [%[b], #200]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "str r5, [%[r], #452]\n\t" - "# A[51] * B[63]\n\t" - "ldr r8, [%[a], #204]\n\t" - "ldr r9, [%[b], #252]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r10, r10\n\t" - "# A[52] * B[62]\n\t" - "ldr r8, [%[a], #208]\n\t" - "ldr r9, [%[b], #248]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[53] * B[61]\n\t" - "ldr r8, [%[a], #212]\n\t" - "ldr r9, [%[b], #244]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[54] * B[60]\n\t" - "ldr r8, [%[a], #216]\n\t" - "ldr r9, [%[b], #240]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[55] * B[59]\n\t" - "ldr r8, [%[a], #220]\n\t" - "ldr r9, [%[b], #236]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[56] * B[58]\n\t" - "ldr r8, [%[a], #224]\n\t" - "ldr r9, [%[b], #232]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[57] * B[57]\n\t" - "ldr r8, [%[a], #228]\n\t" - "ldr r9, [%[b], #228]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[58] * B[56]\n\t" - "ldr r8, [%[a], #232]\n\t" - "ldr r9, [%[b], #224]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[59] * B[55]\n\t" - "ldr r8, [%[a], #236]\n\t" - "ldr r9, [%[b], #220]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[60] * B[54]\n\t" - "ldr r8, [%[a], #240]\n\t" - "ldr r9, [%[b], #216]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[61] * B[53]\n\t" - "ldr r8, [%[a], #244]\n\t" - "ldr r9, [%[b], #212]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[62] * B[52]\n\t" - "ldr r8, [%[a], #248]\n\t" - "ldr r9, [%[b], #208]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[63] * B[51]\n\t" - "ldr r8, [%[a], #252]\n\t" - "ldr r9, [%[b], #204]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "str r3, [%[r], #456]\n\t" - "# A[52] * B[63]\n\t" - "ldr r8, [%[a], #208]\n\t" - "ldr r9, [%[b], #252]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r10, r10\n\t" - "# A[53] * B[62]\n\t" - "ldr r8, [%[a], #212]\n\t" - "ldr r9, [%[b], #248]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[54] * B[61]\n\t" - "ldr r8, [%[a], #216]\n\t" - "ldr r9, [%[b], #244]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[55] * B[60]\n\t" - "ldr r8, [%[a], #220]\n\t" - "ldr r9, [%[b], #240]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[56] * B[59]\n\t" - "ldr r8, [%[a], #224]\n\t" - "ldr r9, [%[b], #236]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[57] * B[58]\n\t" - "ldr r8, [%[a], #228]\n\t" - "ldr r9, [%[b], #232]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[58] * B[57]\n\t" - "ldr r8, [%[a], #232]\n\t" - "ldr r9, [%[b], #228]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[59] * B[56]\n\t" - "ldr r8, [%[a], #236]\n\t" - "ldr r9, [%[b], #224]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[60] * B[55]\n\t" - "ldr r8, [%[a], #240]\n\t" - "ldr r9, [%[b], #220]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[61] * B[54]\n\t" - "ldr r8, [%[a], #244]\n\t" - "ldr r9, [%[b], #216]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[62] * B[53]\n\t" - "ldr r8, [%[a], #248]\n\t" - "ldr r9, [%[b], #212]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[63] * B[52]\n\t" - "ldr r8, [%[a], #252]\n\t" - "ldr r9, [%[b], #208]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "str r4, [%[r], #460]\n\t" - "# A[53] * B[63]\n\t" - "ldr r8, [%[a], #212]\n\t" - "ldr r9, [%[b], #252]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r10, r10\n\t" - "# A[54] * B[62]\n\t" - "ldr r8, [%[a], #216]\n\t" - "ldr r9, [%[b], #248]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[55] * B[61]\n\t" - "ldr r8, [%[a], #220]\n\t" - "ldr r9, [%[b], #244]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[56] * B[60]\n\t" - "ldr r8, [%[a], #224]\n\t" - "ldr r9, [%[b], #240]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[57] * B[59]\n\t" - "ldr r8, [%[a], #228]\n\t" - "ldr r9, [%[b], #236]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[58] * B[58]\n\t" - "ldr r8, [%[a], #232]\n\t" - "ldr r9, [%[b], #232]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[59] * B[57]\n\t" - "ldr r8, [%[a], #236]\n\t" - "ldr r9, [%[b], #228]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[60] * B[56]\n\t" - "ldr r8, [%[a], #240]\n\t" - "ldr r9, [%[b], #224]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[61] * B[55]\n\t" - "ldr r8, [%[a], #244]\n\t" - "ldr r9, [%[b], #220]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[62] * B[54]\n\t" - "ldr r8, [%[a], #248]\n\t" - "ldr r9, [%[b], #216]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[63] * B[53]\n\t" - "ldr r8, [%[a], #252]\n\t" - "ldr r9, [%[b], #212]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "str r5, [%[r], #464]\n\t" - "# A[54] * B[63]\n\t" - "ldr r8, [%[a], #216]\n\t" - "ldr r9, [%[b], #252]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r10, r10\n\t" - "# A[55] * B[62]\n\t" - "ldr r8, [%[a], #220]\n\t" - "ldr r9, [%[b], #248]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[56] * B[61]\n\t" - "ldr r8, [%[a], #224]\n\t" - "ldr r9, [%[b], #244]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[57] * B[60]\n\t" - "ldr r8, [%[a], #228]\n\t" - "ldr r9, [%[b], #240]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[58] * B[59]\n\t" - "ldr r8, [%[a], #232]\n\t" - "ldr r9, [%[b], #236]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[59] * B[58]\n\t" - "ldr r8, [%[a], #236]\n\t" - "ldr r9, [%[b], #232]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[60] * B[57]\n\t" - "ldr r8, [%[a], #240]\n\t" - "ldr r9, [%[b], #228]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[61] * B[56]\n\t" - "ldr r8, [%[a], #244]\n\t" - "ldr r9, [%[b], #224]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[62] * B[55]\n\t" - "ldr r8, [%[a], #248]\n\t" - "ldr r9, [%[b], #220]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[63] * B[54]\n\t" - "ldr r8, [%[a], #252]\n\t" - "ldr r9, [%[b], #216]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "str r3, [%[r], #468]\n\t" - "# A[55] * B[63]\n\t" - "ldr r8, [%[a], #220]\n\t" - "ldr r9, [%[b], #252]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r10, r10\n\t" - "# A[56] * B[62]\n\t" - "ldr r8, [%[a], #224]\n\t" - "ldr r9, [%[b], #248]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[57] * B[61]\n\t" - "ldr r8, [%[a], #228]\n\t" - "ldr r9, [%[b], #244]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[58] * B[60]\n\t" - "ldr r8, [%[a], #232]\n\t" - "ldr r9, [%[b], #240]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[59] * B[59]\n\t" - "ldr r8, [%[a], #236]\n\t" - "ldr r9, [%[b], #236]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[60] * B[58]\n\t" - "ldr r8, [%[a], #240]\n\t" - "ldr r9, [%[b], #232]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[61] * B[57]\n\t" - "ldr r8, [%[a], #244]\n\t" - "ldr r9, [%[b], #228]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[62] * B[56]\n\t" - "ldr r8, [%[a], #248]\n\t" - "ldr r9, [%[b], #224]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[63] * B[55]\n\t" - "ldr r8, [%[a], #252]\n\t" - "ldr r9, [%[b], #220]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "str r4, [%[r], #472]\n\t" - "# A[56] * B[63]\n\t" - "ldr r8, [%[a], #224]\n\t" - "ldr r9, [%[b], #252]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r10, r10\n\t" - "# A[57] * B[62]\n\t" - "ldr r8, [%[a], #228]\n\t" - "ldr r9, [%[b], #248]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[58] * B[61]\n\t" - "ldr r8, [%[a], #232]\n\t" - "ldr r9, [%[b], #244]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[59] * B[60]\n\t" - "ldr r8, [%[a], #236]\n\t" - "ldr r9, [%[b], #240]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[60] * B[59]\n\t" - "ldr r8, [%[a], #240]\n\t" - "ldr r9, [%[b], #236]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[61] * B[58]\n\t" - "ldr r8, [%[a], #244]\n\t" - "ldr r9, [%[b], #232]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[62] * B[57]\n\t" - "ldr r8, [%[a], #248]\n\t" - "ldr r9, [%[b], #228]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[63] * B[56]\n\t" - "ldr r8, [%[a], #252]\n\t" - "ldr r9, [%[b], #224]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "str r5, [%[r], #476]\n\t" - "# A[57] * B[63]\n\t" - "ldr r8, [%[a], #228]\n\t" - "ldr r9, [%[b], #252]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r10, r10\n\t" - "# A[58] * B[62]\n\t" - "ldr r8, [%[a], #232]\n\t" - "ldr r9, [%[b], #248]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[59] * B[61]\n\t" - "ldr r8, [%[a], #236]\n\t" - "ldr r9, [%[b], #244]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[60] * B[60]\n\t" - "ldr r8, [%[a], #240]\n\t" - "ldr r9, [%[b], #240]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[61] * B[59]\n\t" - "ldr r8, [%[a], #244]\n\t" - "ldr r9, [%[b], #236]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[62] * B[58]\n\t" - "ldr r8, [%[a], #248]\n\t" - "ldr r9, [%[b], #232]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[63] * B[57]\n\t" - "ldr r8, [%[a], #252]\n\t" - "ldr r9, [%[b], #228]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "str r3, [%[r], #480]\n\t" - "# A[58] * B[63]\n\t" - "ldr r8, [%[a], #232]\n\t" - "ldr r9, [%[b], #252]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r10, r10\n\t" - "# A[59] * B[62]\n\t" - "ldr r8, [%[a], #236]\n\t" - "ldr r9, [%[b], #248]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[60] * B[61]\n\t" - "ldr r8, [%[a], #240]\n\t" - "ldr r9, [%[b], #244]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[61] * B[60]\n\t" - "ldr r8, [%[a], #244]\n\t" - "ldr r9, [%[b], #240]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[62] * B[59]\n\t" - "ldr r8, [%[a], #248]\n\t" - "ldr r9, [%[b], #236]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[63] * B[58]\n\t" - "ldr r8, [%[a], #252]\n\t" - "ldr r9, [%[b], #232]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "str r4, [%[r], #484]\n\t" - "# A[59] * B[63]\n\t" - "ldr r8, [%[a], #236]\n\t" - "ldr r9, [%[b], #252]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r10, r10\n\t" - "# A[60] * B[62]\n\t" - "ldr r8, [%[a], #240]\n\t" - "ldr r9, [%[b], #248]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[61] * B[61]\n\t" - "ldr r8, [%[a], #244]\n\t" - "ldr r9, [%[b], #244]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[62] * B[60]\n\t" - "ldr r8, [%[a], #248]\n\t" - "ldr r9, [%[b], #240]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "# A[63] * B[59]\n\t" - "ldr r8, [%[a], #252]\n\t" - "ldr r9, [%[b], #236]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "str r5, [%[r], #488]\n\t" - "# A[60] * B[63]\n\t" - "ldr r8, [%[a], #240]\n\t" - "ldr r9, [%[b], #252]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r10, r10\n\t" - "# A[61] * B[62]\n\t" - "ldr r8, [%[a], #244]\n\t" - "ldr r9, [%[b], #248]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[62] * B[61]\n\t" - "ldr r8, [%[a], #248]\n\t" - "ldr r9, [%[b], #244]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "# A[63] * B[60]\n\t" - "ldr r8, [%[a], #252]\n\t" - "ldr r9, [%[b], #240]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, r10\n\t" - "str r3, [%[r], #492]\n\t" - "# A[61] * B[63]\n\t" - "ldr r8, [%[a], #244]\n\t" - "ldr r9, [%[b], #252]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r10, r10\n\t" - "# A[62] * B[62]\n\t" - "ldr r8, [%[a], #248]\n\t" - "ldr r9, [%[b], #248]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "# A[63] * B[61]\n\t" - "ldr r8, [%[a], #252]\n\t" - "ldr r9, [%[b], #244]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, r10\n\t" - "str r4, [%[r], #496]\n\t" - "# A[62] * B[63]\n\t" - "ldr r8, [%[a], #248]\n\t" - "ldr r9, [%[b], #252]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r10, r10\n\t" - "# A[63] * B[62]\n\t" - "ldr r8, [%[a], #252]\n\t" - "ldr r9, [%[b], #248]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, r10\n\t" - "str r5, [%[r], #500]\n\t" - "# A[63] * B[63]\n\t" - "ldr r8, [%[a], #252]\n\t" - "ldr r9, [%[b], #252]\n\t" - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adc r4, r4, r7\n\t" - "str r3, [%[r], #504]\n\t" - "str r4, [%[r], #508]\n\t" - "ldr r3, [sp, #0]\n\t" - "ldr r4, [sp, #4]\n\t" - "ldr r5, [sp, #8]\n\t" - "ldr r6, [sp, #12]\n\t" - "str r3, [%[r], #0]\n\t" - "str r4, [%[r], #4]\n\t" - "str r5, [%[r], #8]\n\t" - "str r6, [%[r], #12]\n\t" - "ldr r3, [sp, #16]\n\t" - "ldr r4, [sp, #20]\n\t" - "ldr r5, [sp, #24]\n\t" - "ldr r6, [sp, #28]\n\t" - "str r3, [%[r], #16]\n\t" - "str r4, [%[r], #20]\n\t" - "str r5, [%[r], #24]\n\t" - "str r6, [%[r], #28]\n\t" - "ldr r3, [sp, #32]\n\t" - "ldr r4, [sp, #36]\n\t" - "ldr r5, [sp, #40]\n\t" - "ldr r6, [sp, #44]\n\t" - "str r3, [%[r], #32]\n\t" - "str r4, [%[r], #36]\n\t" - "str r5, [%[r], #40]\n\t" - "str r6, [%[r], #44]\n\t" - "ldr r3, [sp, #48]\n\t" - "ldr r4, [sp, #52]\n\t" - "ldr r5, [sp, #56]\n\t" - "ldr r6, [sp, #60]\n\t" - "str r3, [%[r], #48]\n\t" - "str r4, [%[r], #52]\n\t" - "str r5, [%[r], #56]\n\t" - "str r6, [%[r], #60]\n\t" - "ldr r3, [sp, #64]\n\t" - "ldr r4, [sp, #68]\n\t" - "ldr r5, [sp, #72]\n\t" - "ldr r6, [sp, #76]\n\t" - "str r3, [%[r], #64]\n\t" - "str r4, [%[r], #68]\n\t" - "str r5, [%[r], #72]\n\t" - "str r6, [%[r], #76]\n\t" - "ldr r3, [sp, #80]\n\t" - "ldr r4, [sp, #84]\n\t" - "ldr r5, [sp, #88]\n\t" - "ldr r6, [sp, #92]\n\t" - "str r3, [%[r], #80]\n\t" - "str r4, [%[r], #84]\n\t" - "str r5, [%[r], #88]\n\t" - "str r6, [%[r], #92]\n\t" - "ldr r3, [sp, #96]\n\t" - "ldr r4, [sp, #100]\n\t" - "ldr r5, [sp, #104]\n\t" - "ldr r6, [sp, #108]\n\t" - "str r3, [%[r], #96]\n\t" - "str r4, [%[r], #100]\n\t" - "str r5, [%[r], #104]\n\t" - "str r6, [%[r], #108]\n\t" - "ldr r3, [sp, #112]\n\t" - "ldr r4, [sp, #116]\n\t" - "ldr r5, [sp, #120]\n\t" - "ldr r6, [sp, #124]\n\t" - "str r3, [%[r], #112]\n\t" - "str r4, [%[r], #116]\n\t" - "str r5, [%[r], #120]\n\t" - "str r6, [%[r], #124]\n\t" - "ldr r3, [sp, #128]\n\t" - "ldr r4, [sp, #132]\n\t" - "ldr r5, [sp, #136]\n\t" - "ldr r6, [sp, #140]\n\t" - "str r3, [%[r], #128]\n\t" - "str r4, [%[r], #132]\n\t" - "str r5, [%[r], #136]\n\t" - "str r6, [%[r], #140]\n\t" - "ldr r3, [sp, #144]\n\t" - "ldr r4, [sp, #148]\n\t" - "ldr r5, [sp, #152]\n\t" - "ldr r6, [sp, #156]\n\t" - "str r3, [%[r], #144]\n\t" - "str r4, [%[r], #148]\n\t" - "str r5, [%[r], #152]\n\t" - "str r6, [%[r], #156]\n\t" - "ldr r3, [sp, #160]\n\t" - "ldr r4, [sp, #164]\n\t" - "ldr r5, [sp, #168]\n\t" - "ldr r6, [sp, #172]\n\t" - "str r3, [%[r], #160]\n\t" - "str r4, [%[r], #164]\n\t" - "str r5, [%[r], #168]\n\t" - "str r6, [%[r], #172]\n\t" - "ldr r3, [sp, #176]\n\t" - "ldr r4, [sp, #180]\n\t" - "ldr r5, [sp, #184]\n\t" - "ldr r6, [sp, #188]\n\t" - "str r3, [%[r], #176]\n\t" - "str r4, [%[r], #180]\n\t" - "str r5, [%[r], #184]\n\t" - "str r6, [%[r], #188]\n\t" - "ldr r3, [sp, #192]\n\t" - "ldr r4, [sp, #196]\n\t" - "ldr r5, [sp, #200]\n\t" - "ldr r6, [sp, #204]\n\t" - "str r3, [%[r], #192]\n\t" - "str r4, [%[r], #196]\n\t" - "str r5, [%[r], #200]\n\t" - "str r6, [%[r], #204]\n\t" - "ldr r3, [sp, #208]\n\t" - "ldr r4, [sp, #212]\n\t" - "ldr r5, [sp, #216]\n\t" - "ldr r6, [sp, #220]\n\t" - "str r3, [%[r], #208]\n\t" - "str r4, [%[r], #212]\n\t" - "str r5, [%[r], #216]\n\t" - "str r6, [%[r], #220]\n\t" - "ldr r3, [sp, #224]\n\t" - "ldr r4, [sp, #228]\n\t" - "ldr r5, [sp, #232]\n\t" - "ldr r6, [sp, #236]\n\t" - "str r3, [%[r], #224]\n\t" - "str r4, [%[r], #228]\n\t" - "str r5, [%[r], #232]\n\t" - "str r6, [%[r], #236]\n\t" - "ldr r3, [sp, #240]\n\t" - "ldr r4, [sp, #244]\n\t" - "ldr r5, [sp, #248]\n\t" - "ldr r6, [sp, #252]\n\t" - "str r3, [%[r], #240]\n\t" - "str r4, [%[r], #244]\n\t" - "str r5, [%[r], #248]\n\t" - "str r6, [%[r], #252]\n\t" - "add sp, sp, #256\n\t" - : - : [r] "r" (r), [a] "r" (a), [b] "r" (b) - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10" - ); -} - -/* AND m into each word of a and store in r. - * - * r A single precision integer. - * a A single precision integer. - * m Mask to AND against each digit. - */ -static void sp_4096_mask_64(sp_digit* r, const sp_digit* a, sp_digit m) -{ -#ifdef WOLFSSL_SP_SMALL - int i; - - for (i=0; i<64; i++) { - r[i] = a[i] & m; - } -#else - int i; - - for (i = 0; i < 64; i += 8) { - r[i+0] = a[i+0] & m; - r[i+1] = a[i+1] & m; - r[i+2] = a[i+2] & m; - r[i+3] = a[i+3] & m; - r[i+4] = a[i+4] & m; - r[i+5] = a[i+5] & m; - r[i+6] = a[i+6] & m; - r[i+7] = a[i+7] & m; - } -#endif -} - /* Multiply a and b into r. (r = a * b) * * r A single precision integer. @@ -50968,15393 +21717,6 @@ SP_NOINLINE static void sp_4096_mul_128(sp_digit* r, const sp_digit* a, (void)sp_4096_add_128(r + 128, r + 128, z2); } -/* Square a and put result in r. (r = a * a) - * - * r A single precision integer. - * a A single precision integer. - */ -static void sp_4096_sqr_64(sp_digit* r, const sp_digit* a) -{ - __asm__ __volatile__ ( - "sub sp, sp, #256\n\t" - "mov r14, #0\n\t" - "# A[0] * A[0]\n\t" - "ldr r10, [%[a], #0]\n\t" - "umull r8, r3, r10, r10\n\t" - "mov r4, #0\n\t" - "str r8, [sp]\n\t" - "# A[0] * A[1]\n\t" - "ldr r10, [%[a], #4]\n\t" - "ldr r8, [%[a], #0]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r3, r3, r8\n\t" - "adcs r4, r4, r9\n\t" - "adc r2, r14, r14\n\t" - "adds r3, r3, r8\n\t" - "adcs r4, r4, r9\n\t" - "adc r2, r2, r14\n\t" - "str r3, [sp, #4]\n\t" - "# A[0] * A[2]\n\t" - "ldr r10, [%[a], #8]\n\t" - "ldr r8, [%[a], #0]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r4, r4, r8\n\t" - "adcs r2, r2, r9\n\t" - "adc r3, r14, r14\n\t" - "adds r4, r4, r8\n\t" - "adcs r2, r2, r9\n\t" - "adc r3, r3, r14\n\t" - "# A[1] * A[1]\n\t" - "ldr r10, [%[a], #4]\n\t" - "umull r8, r9, r10, r10\n\t" - "adds r4, r4, r8\n\t" - "adcs r2, r2, r9\n\t" - "adc r3, r3, r14\n\t" - "str r4, [sp, #8]\n\t" - "# A[0] * A[3]\n\t" - "ldr r10, [%[a], #12]\n\t" - "ldr r8, [%[a], #0]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r2, r2, r8\n\t" - "adcs r3, r3, r9\n\t" - "adc r4, r14, r14\n\t" - "adds r2, r2, r8\n\t" - "adcs r3, r3, r9\n\t" - "adc r4, r4, r14\n\t" - "# A[1] * A[2]\n\t" - "ldr r10, [%[a], #8]\n\t" - "ldr r8, [%[a], #4]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r2, r2, r8\n\t" - "adcs r3, r3, r9\n\t" - "adc r4, r4, r14\n\t" - "adds r2, r2, r8\n\t" - "adcs r3, r3, r9\n\t" - "adc r4, r4, r14\n\t" - "str r2, [sp, #12]\n\t" - "# A[0] * A[4]\n\t" - "ldr r10, [%[a], #16]\n\t" - "ldr r8, [%[a], #0]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r3, r3, r8\n\t" - "adcs r4, r4, r9\n\t" - "adc r2, r14, r14\n\t" - "adds r3, r3, r8\n\t" - "adcs r4, r4, r9\n\t" - "adc r2, r2, r14\n\t" - "# A[1] * A[3]\n\t" - "ldr r10, [%[a], #12]\n\t" - "ldr r8, [%[a], #4]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r3, r3, r8\n\t" - "adcs r4, r4, r9\n\t" - "adc r2, r2, r14\n\t" - "adds r3, r3, r8\n\t" - "adcs r4, r4, r9\n\t" - "adc r2, r2, r14\n\t" - "# A[2] * A[2]\n\t" - "ldr r10, [%[a], #8]\n\t" - "umull r8, r9, r10, r10\n\t" - "adds r3, r3, r8\n\t" - "adcs r4, r4, r9\n\t" - "adc r2, r2, r14\n\t" - "str r3, [sp, #16]\n\t" - "# A[0] * A[5]\n\t" - "ldr r10, [%[a], #20]\n\t" - "ldr r8, [%[a], #0]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r3, #0\n\t" - "mov r7, #0\n\t" - "# A[1] * A[4]\n\t" - "ldr r10, [%[a], #16]\n\t" - "ldr r8, [%[a], #4]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[2] * A[3]\n\t" - "ldr r10, [%[a], #12]\n\t" - "ldr r8, [%[a], #8]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r4, r4, r5\n\t" - "adcs r2, r2, r6\n\t" - "adc r3, r3, r7\n\t" - "str r4, [sp, #20]\n\t" - "# A[0] * A[6]\n\t" - "ldr r10, [%[a], #24]\n\t" - "ldr r8, [%[a], #0]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r4, #0\n\t" - "mov r7, #0\n\t" - "# A[1] * A[5]\n\t" - "ldr r10, [%[a], #20]\n\t" - "ldr r8, [%[a], #4]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[2] * A[4]\n\t" - "ldr r10, [%[a], #16]\n\t" - "ldr r8, [%[a], #8]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[3] * A[3]\n\t" - "ldr r10, [%[a], #12]\n\t" - "umull r8, r9, r10, r10\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r2, r2, r5\n\t" - "adcs r3, r3, r6\n\t" - "adc r4, r4, r7\n\t" - "str r2, [sp, #24]\n\t" - "# A[0] * A[7]\n\t" - "ldr r10, [%[a], #28]\n\t" - "ldr r8, [%[a], #0]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r2, #0\n\t" - "mov r7, #0\n\t" - "# A[1] * A[6]\n\t" - "ldr r10, [%[a], #24]\n\t" - "ldr r8, [%[a], #4]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[2] * A[5]\n\t" - "ldr r10, [%[a], #20]\n\t" - "ldr r8, [%[a], #8]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[3] * A[4]\n\t" - "ldr r10, [%[a], #16]\n\t" - "ldr r8, [%[a], #12]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r3, r3, r5\n\t" - "adcs r4, r4, r6\n\t" - "adc r2, r2, r7\n\t" - "str r3, [sp, #28]\n\t" - "# A[0] * A[8]\n\t" - "ldr r10, [%[a], #32]\n\t" - "ldr r8, [%[a], #0]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r3, #0\n\t" - "mov r7, #0\n\t" - "# A[1] * A[7]\n\t" - "ldr r10, [%[a], #28]\n\t" - "ldr r8, [%[a], #4]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[2] * A[6]\n\t" - "ldr r10, [%[a], #24]\n\t" - "ldr r8, [%[a], #8]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[3] * A[5]\n\t" - "ldr r10, [%[a], #20]\n\t" - "ldr r8, [%[a], #12]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[4] * A[4]\n\t" - "ldr r10, [%[a], #16]\n\t" - "umull r8, r9, r10, r10\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r4, r4, r5\n\t" - "adcs r2, r2, r6\n\t" - "adc r3, r3, r7\n\t" - "str r4, [sp, #32]\n\t" - "# A[0] * A[9]\n\t" - "ldr r10, [%[a], #36]\n\t" - "ldr r8, [%[a], #0]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r4, #0\n\t" - "mov r7, #0\n\t" - "# A[1] * A[8]\n\t" - "ldr r10, [%[a], #32]\n\t" - "ldr r8, [%[a], #4]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[2] * A[7]\n\t" - "ldr r10, [%[a], #28]\n\t" - "ldr r8, [%[a], #8]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[3] * A[6]\n\t" - "ldr r10, [%[a], #24]\n\t" - "ldr r8, [%[a], #12]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[4] * A[5]\n\t" - "ldr r10, [%[a], #20]\n\t" - "ldr r8, [%[a], #16]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r2, r2, r5\n\t" - "adcs r3, r3, r6\n\t" - "adc r4, r4, r7\n\t" - "str r2, [sp, #36]\n\t" - "# A[0] * A[10]\n\t" - "ldr r10, [%[a], #40]\n\t" - "ldr r8, [%[a], #0]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r2, #0\n\t" - "mov r7, #0\n\t" - "# A[1] * A[9]\n\t" - "ldr r10, [%[a], #36]\n\t" - "ldr r8, [%[a], #4]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[2] * A[8]\n\t" - "ldr r10, [%[a], #32]\n\t" - "ldr r8, [%[a], #8]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[3] * A[7]\n\t" - "ldr r10, [%[a], #28]\n\t" - "ldr r8, [%[a], #12]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[4] * A[6]\n\t" - "ldr r10, [%[a], #24]\n\t" - "ldr r8, [%[a], #16]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[5] * A[5]\n\t" - "ldr r10, [%[a], #20]\n\t" - "umull r8, r9, r10, r10\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r3, r3, r5\n\t" - "adcs r4, r4, r6\n\t" - "adc r2, r2, r7\n\t" - "str r3, [sp, #40]\n\t" - "# A[0] * A[11]\n\t" - "ldr r10, [%[a], #44]\n\t" - "ldr r8, [%[a], #0]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r3, #0\n\t" - "mov r7, #0\n\t" - "# A[1] * A[10]\n\t" - "ldr r10, [%[a], #40]\n\t" - "ldr r8, [%[a], #4]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[2] * A[9]\n\t" - "ldr r10, [%[a], #36]\n\t" - "ldr r8, [%[a], #8]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[3] * A[8]\n\t" - "ldr r10, [%[a], #32]\n\t" - "ldr r8, [%[a], #12]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[4] * A[7]\n\t" - "ldr r10, [%[a], #28]\n\t" - "ldr r8, [%[a], #16]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[5] * A[6]\n\t" - "ldr r10, [%[a], #24]\n\t" - "ldr r8, [%[a], #20]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r4, r4, r5\n\t" - "adcs r2, r2, r6\n\t" - "adc r3, r3, r7\n\t" - "str r4, [sp, #44]\n\t" - "# A[0] * A[12]\n\t" - "ldr r10, [%[a], #48]\n\t" - "ldr r8, [%[a], #0]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r4, #0\n\t" - "mov r7, #0\n\t" - "# A[1] * A[11]\n\t" - "ldr r10, [%[a], #44]\n\t" - "ldr r8, [%[a], #4]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[2] * A[10]\n\t" - "ldr r10, [%[a], #40]\n\t" - "ldr r8, [%[a], #8]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[3] * A[9]\n\t" - "ldr r10, [%[a], #36]\n\t" - "ldr r8, [%[a], #12]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[4] * A[8]\n\t" - "ldr r10, [%[a], #32]\n\t" - "ldr r8, [%[a], #16]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[5] * A[7]\n\t" - "ldr r10, [%[a], #28]\n\t" - "ldr r8, [%[a], #20]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[6] * A[6]\n\t" - "ldr r10, [%[a], #24]\n\t" - "umull r8, r9, r10, r10\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r2, r2, r5\n\t" - "adcs r3, r3, r6\n\t" - "adc r4, r4, r7\n\t" - "str r2, [sp, #48]\n\t" - "# A[0] * A[13]\n\t" - "ldr r10, [%[a], #52]\n\t" - "ldr r8, [%[a], #0]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r2, #0\n\t" - "mov r7, #0\n\t" - "# A[1] * A[12]\n\t" - "ldr r10, [%[a], #48]\n\t" - "ldr r8, [%[a], #4]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[2] * A[11]\n\t" - "ldr r10, [%[a], #44]\n\t" - "ldr r8, [%[a], #8]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[3] * A[10]\n\t" - "ldr r10, [%[a], #40]\n\t" - "ldr r8, [%[a], #12]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[4] * A[9]\n\t" - "ldr r10, [%[a], #36]\n\t" - "ldr r8, [%[a], #16]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[5] * A[8]\n\t" - "ldr r10, [%[a], #32]\n\t" - "ldr r8, [%[a], #20]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[6] * A[7]\n\t" - "ldr r10, [%[a], #28]\n\t" - "ldr r8, [%[a], #24]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r3, r3, r5\n\t" - "adcs r4, r4, r6\n\t" - "adc r2, r2, r7\n\t" - "str r3, [sp, #52]\n\t" - "# A[0] * A[14]\n\t" - "ldr r10, [%[a], #56]\n\t" - "ldr r8, [%[a], #0]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r3, #0\n\t" - "mov r7, #0\n\t" - "# A[1] * A[13]\n\t" - "ldr r10, [%[a], #52]\n\t" - "ldr r8, [%[a], #4]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[2] * A[12]\n\t" - "ldr r10, [%[a], #48]\n\t" - "ldr r8, [%[a], #8]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[3] * A[11]\n\t" - "ldr r10, [%[a], #44]\n\t" - "ldr r8, [%[a], #12]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[4] * A[10]\n\t" - "ldr r10, [%[a], #40]\n\t" - "ldr r8, [%[a], #16]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[5] * A[9]\n\t" - "ldr r10, [%[a], #36]\n\t" - "ldr r8, [%[a], #20]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[6] * A[8]\n\t" - "ldr r10, [%[a], #32]\n\t" - "ldr r8, [%[a], #24]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[7] * A[7]\n\t" - "ldr r10, [%[a], #28]\n\t" - "umull r8, r9, r10, r10\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r4, r4, r5\n\t" - "adcs r2, r2, r6\n\t" - "adc r3, r3, r7\n\t" - "str r4, [sp, #56]\n\t" - "# A[0] * A[15]\n\t" - "ldr r10, [%[a], #60]\n\t" - "ldr r8, [%[a], #0]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r4, #0\n\t" - "mov r7, #0\n\t" - "# A[1] * A[14]\n\t" - "ldr r10, [%[a], #56]\n\t" - "ldr r8, [%[a], #4]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[2] * A[13]\n\t" - "ldr r10, [%[a], #52]\n\t" - "ldr r8, [%[a], #8]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[3] * A[12]\n\t" - "ldr r10, [%[a], #48]\n\t" - "ldr r8, [%[a], #12]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[4] * A[11]\n\t" - "ldr r10, [%[a], #44]\n\t" - "ldr r8, [%[a], #16]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[5] * A[10]\n\t" - "ldr r10, [%[a], #40]\n\t" - "ldr r8, [%[a], #20]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[6] * A[9]\n\t" - "ldr r10, [%[a], #36]\n\t" - "ldr r8, [%[a], #24]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[7] * A[8]\n\t" - "ldr r10, [%[a], #32]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r2, r2, r5\n\t" - "adcs r3, r3, r6\n\t" - "adc r4, r4, r7\n\t" - "str r2, [sp, #60]\n\t" - "# A[0] * A[16]\n\t" - "ldr r10, [%[a], #64]\n\t" - "ldr r8, [%[a], #0]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r2, #0\n\t" - "mov r7, #0\n\t" - "# A[1] * A[15]\n\t" - "ldr r10, [%[a], #60]\n\t" - "ldr r8, [%[a], #4]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[2] * A[14]\n\t" - "ldr r10, [%[a], #56]\n\t" - "ldr r8, [%[a], #8]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[3] * A[13]\n\t" - "ldr r10, [%[a], #52]\n\t" - "ldr r8, [%[a], #12]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[4] * A[12]\n\t" - "ldr r10, [%[a], #48]\n\t" - "ldr r8, [%[a], #16]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[5] * A[11]\n\t" - "ldr r10, [%[a], #44]\n\t" - "ldr r8, [%[a], #20]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[6] * A[10]\n\t" - "ldr r10, [%[a], #40]\n\t" - "ldr r8, [%[a], #24]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[7] * A[9]\n\t" - "ldr r10, [%[a], #36]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[8] * A[8]\n\t" - "ldr r10, [%[a], #32]\n\t" - "umull r8, r9, r10, r10\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r3, r3, r5\n\t" - "adcs r4, r4, r6\n\t" - "adc r2, r2, r7\n\t" - "str r3, [sp, #64]\n\t" - "# A[0] * A[17]\n\t" - "ldr r10, [%[a], #68]\n\t" - "ldr r8, [%[a], #0]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r3, #0\n\t" - "mov r7, #0\n\t" - "# A[1] * A[16]\n\t" - "ldr r10, [%[a], #64]\n\t" - "ldr r8, [%[a], #4]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[2] * A[15]\n\t" - "ldr r10, [%[a], #60]\n\t" - "ldr r8, [%[a], #8]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[3] * A[14]\n\t" - "ldr r10, [%[a], #56]\n\t" - "ldr r8, [%[a], #12]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[4] * A[13]\n\t" - "ldr r10, [%[a], #52]\n\t" - "ldr r8, [%[a], #16]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[5] * A[12]\n\t" - "ldr r10, [%[a], #48]\n\t" - "ldr r8, [%[a], #20]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[6] * A[11]\n\t" - "ldr r10, [%[a], #44]\n\t" - "ldr r8, [%[a], #24]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[7] * A[10]\n\t" - "ldr r10, [%[a], #40]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[8] * A[9]\n\t" - "ldr r10, [%[a], #36]\n\t" - "ldr r8, [%[a], #32]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r4, r4, r5\n\t" - "adcs r2, r2, r6\n\t" - "adc r3, r3, r7\n\t" - "str r4, [sp, #68]\n\t" - "# A[0] * A[18]\n\t" - "ldr r10, [%[a], #72]\n\t" - "ldr r8, [%[a], #0]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r4, #0\n\t" - "mov r7, #0\n\t" - "# A[1] * A[17]\n\t" - "ldr r10, [%[a], #68]\n\t" - "ldr r8, [%[a], #4]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[2] * A[16]\n\t" - "ldr r10, [%[a], #64]\n\t" - "ldr r8, [%[a], #8]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[3] * A[15]\n\t" - "ldr r10, [%[a], #60]\n\t" - "ldr r8, [%[a], #12]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[4] * A[14]\n\t" - "ldr r10, [%[a], #56]\n\t" - "ldr r8, [%[a], #16]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[5] * A[13]\n\t" - "ldr r10, [%[a], #52]\n\t" - "ldr r8, [%[a], #20]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[6] * A[12]\n\t" - "ldr r10, [%[a], #48]\n\t" - "ldr r8, [%[a], #24]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[7] * A[11]\n\t" - "ldr r10, [%[a], #44]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[8] * A[10]\n\t" - "ldr r10, [%[a], #40]\n\t" - "ldr r8, [%[a], #32]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[9] * A[9]\n\t" - "ldr r10, [%[a], #36]\n\t" - "umull r8, r9, r10, r10\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r2, r2, r5\n\t" - "adcs r3, r3, r6\n\t" - "adc r4, r4, r7\n\t" - "str r2, [sp, #72]\n\t" - "# A[0] * A[19]\n\t" - "ldr r10, [%[a], #76]\n\t" - "ldr r8, [%[a], #0]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r2, #0\n\t" - "mov r7, #0\n\t" - "# A[1] * A[18]\n\t" - "ldr r10, [%[a], #72]\n\t" - "ldr r8, [%[a], #4]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[2] * A[17]\n\t" - "ldr r10, [%[a], #68]\n\t" - "ldr r8, [%[a], #8]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[3] * A[16]\n\t" - "ldr r10, [%[a], #64]\n\t" - "ldr r8, [%[a], #12]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[4] * A[15]\n\t" - "ldr r10, [%[a], #60]\n\t" - "ldr r8, [%[a], #16]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[5] * A[14]\n\t" - "ldr r10, [%[a], #56]\n\t" - "ldr r8, [%[a], #20]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[6] * A[13]\n\t" - "ldr r10, [%[a], #52]\n\t" - "ldr r8, [%[a], #24]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[7] * A[12]\n\t" - "ldr r10, [%[a], #48]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[8] * A[11]\n\t" - "ldr r10, [%[a], #44]\n\t" - "ldr r8, [%[a], #32]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[9] * A[10]\n\t" - "ldr r10, [%[a], #40]\n\t" - "ldr r8, [%[a], #36]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r3, r3, r5\n\t" - "adcs r4, r4, r6\n\t" - "adc r2, r2, r7\n\t" - "str r3, [sp, #76]\n\t" - "# A[0] * A[20]\n\t" - "ldr r10, [%[a], #80]\n\t" - "ldr r8, [%[a], #0]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r3, #0\n\t" - "mov r7, #0\n\t" - "# A[1] * A[19]\n\t" - "ldr r10, [%[a], #76]\n\t" - "ldr r8, [%[a], #4]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[2] * A[18]\n\t" - "ldr r10, [%[a], #72]\n\t" - "ldr r8, [%[a], #8]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[3] * A[17]\n\t" - "ldr r10, [%[a], #68]\n\t" - "ldr r8, [%[a], #12]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[4] * A[16]\n\t" - "ldr r10, [%[a], #64]\n\t" - "ldr r8, [%[a], #16]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[5] * A[15]\n\t" - "ldr r10, [%[a], #60]\n\t" - "ldr r8, [%[a], #20]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[6] * A[14]\n\t" - "ldr r10, [%[a], #56]\n\t" - "ldr r8, [%[a], #24]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[7] * A[13]\n\t" - "ldr r10, [%[a], #52]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[8] * A[12]\n\t" - "ldr r10, [%[a], #48]\n\t" - "ldr r8, [%[a], #32]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[9] * A[11]\n\t" - "ldr r10, [%[a], #44]\n\t" - "ldr r8, [%[a], #36]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[10] * A[10]\n\t" - "ldr r10, [%[a], #40]\n\t" - "umull r8, r9, r10, r10\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r4, r4, r5\n\t" - "adcs r2, r2, r6\n\t" - "adc r3, r3, r7\n\t" - "str r4, [sp, #80]\n\t" - "# A[0] * A[21]\n\t" - "ldr r10, [%[a], #84]\n\t" - "ldr r8, [%[a], #0]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r4, #0\n\t" - "mov r7, #0\n\t" - "# A[1] * A[20]\n\t" - "ldr r10, [%[a], #80]\n\t" - "ldr r8, [%[a], #4]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[2] * A[19]\n\t" - "ldr r10, [%[a], #76]\n\t" - "ldr r8, [%[a], #8]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[3] * A[18]\n\t" - "ldr r10, [%[a], #72]\n\t" - "ldr r8, [%[a], #12]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[4] * A[17]\n\t" - "ldr r10, [%[a], #68]\n\t" - "ldr r8, [%[a], #16]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[5] * A[16]\n\t" - "ldr r10, [%[a], #64]\n\t" - "ldr r8, [%[a], #20]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[6] * A[15]\n\t" - "ldr r10, [%[a], #60]\n\t" - "ldr r8, [%[a], #24]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[7] * A[14]\n\t" - "ldr r10, [%[a], #56]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[8] * A[13]\n\t" - "ldr r10, [%[a], #52]\n\t" - "ldr r8, [%[a], #32]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[9] * A[12]\n\t" - "ldr r10, [%[a], #48]\n\t" - "ldr r8, [%[a], #36]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[10] * A[11]\n\t" - "ldr r10, [%[a], #44]\n\t" - "ldr r8, [%[a], #40]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r2, r2, r5\n\t" - "adcs r3, r3, r6\n\t" - "adc r4, r4, r7\n\t" - "str r2, [sp, #84]\n\t" - "# A[0] * A[22]\n\t" - "ldr r10, [%[a], #88]\n\t" - "ldr r8, [%[a], #0]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r2, #0\n\t" - "mov r7, #0\n\t" - "# A[1] * A[21]\n\t" - "ldr r10, [%[a], #84]\n\t" - "ldr r8, [%[a], #4]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[2] * A[20]\n\t" - "ldr r10, [%[a], #80]\n\t" - "ldr r8, [%[a], #8]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[3] * A[19]\n\t" - "ldr r10, [%[a], #76]\n\t" - "ldr r8, [%[a], #12]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[4] * A[18]\n\t" - "ldr r10, [%[a], #72]\n\t" - "ldr r8, [%[a], #16]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[5] * A[17]\n\t" - "ldr r10, [%[a], #68]\n\t" - "ldr r8, [%[a], #20]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[6] * A[16]\n\t" - "ldr r10, [%[a], #64]\n\t" - "ldr r8, [%[a], #24]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[7] * A[15]\n\t" - "ldr r10, [%[a], #60]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[8] * A[14]\n\t" - "ldr r10, [%[a], #56]\n\t" - "ldr r8, [%[a], #32]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[9] * A[13]\n\t" - "ldr r10, [%[a], #52]\n\t" - "ldr r8, [%[a], #36]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[10] * A[12]\n\t" - "ldr r10, [%[a], #48]\n\t" - "ldr r8, [%[a], #40]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[11] * A[11]\n\t" - "ldr r10, [%[a], #44]\n\t" - "umull r8, r9, r10, r10\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r3, r3, r5\n\t" - "adcs r4, r4, r6\n\t" - "adc r2, r2, r7\n\t" - "str r3, [sp, #88]\n\t" - "# A[0] * A[23]\n\t" - "ldr r10, [%[a], #92]\n\t" - "ldr r8, [%[a], #0]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r3, #0\n\t" - "mov r7, #0\n\t" - "# A[1] * A[22]\n\t" - "ldr r10, [%[a], #88]\n\t" - "ldr r8, [%[a], #4]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[2] * A[21]\n\t" - "ldr r10, [%[a], #84]\n\t" - "ldr r8, [%[a], #8]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[3] * A[20]\n\t" - "ldr r10, [%[a], #80]\n\t" - "ldr r8, [%[a], #12]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[4] * A[19]\n\t" - "ldr r10, [%[a], #76]\n\t" - "ldr r8, [%[a], #16]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[5] * A[18]\n\t" - "ldr r10, [%[a], #72]\n\t" - "ldr r8, [%[a], #20]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[6] * A[17]\n\t" - "ldr r10, [%[a], #68]\n\t" - "ldr r8, [%[a], #24]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[7] * A[16]\n\t" - "ldr r10, [%[a], #64]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[8] * A[15]\n\t" - "ldr r10, [%[a], #60]\n\t" - "ldr r8, [%[a], #32]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[9] * A[14]\n\t" - "ldr r10, [%[a], #56]\n\t" - "ldr r8, [%[a], #36]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[10] * A[13]\n\t" - "ldr r10, [%[a], #52]\n\t" - "ldr r8, [%[a], #40]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[11] * A[12]\n\t" - "ldr r10, [%[a], #48]\n\t" - "ldr r8, [%[a], #44]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r4, r4, r5\n\t" - "adcs r2, r2, r6\n\t" - "adc r3, r3, r7\n\t" - "str r4, [sp, #92]\n\t" - "# A[0] * A[24]\n\t" - "ldr r10, [%[a], #96]\n\t" - "ldr r8, [%[a], #0]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r4, #0\n\t" - "mov r7, #0\n\t" - "# A[1] * A[23]\n\t" - "ldr r10, [%[a], #92]\n\t" - "ldr r8, [%[a], #4]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[2] * A[22]\n\t" - "ldr r10, [%[a], #88]\n\t" - "ldr r8, [%[a], #8]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[3] * A[21]\n\t" - "ldr r10, [%[a], #84]\n\t" - "ldr r8, [%[a], #12]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[4] * A[20]\n\t" - "ldr r10, [%[a], #80]\n\t" - "ldr r8, [%[a], #16]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[5] * A[19]\n\t" - "ldr r10, [%[a], #76]\n\t" - "ldr r8, [%[a], #20]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[6] * A[18]\n\t" - "ldr r10, [%[a], #72]\n\t" - "ldr r8, [%[a], #24]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[7] * A[17]\n\t" - "ldr r10, [%[a], #68]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[8] * A[16]\n\t" - "ldr r10, [%[a], #64]\n\t" - "ldr r8, [%[a], #32]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[9] * A[15]\n\t" - "ldr r10, [%[a], #60]\n\t" - "ldr r8, [%[a], #36]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[10] * A[14]\n\t" - "ldr r10, [%[a], #56]\n\t" - "ldr r8, [%[a], #40]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[11] * A[13]\n\t" - "ldr r10, [%[a], #52]\n\t" - "ldr r8, [%[a], #44]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[12] * A[12]\n\t" - "ldr r10, [%[a], #48]\n\t" - "umull r8, r9, r10, r10\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r2, r2, r5\n\t" - "adcs r3, r3, r6\n\t" - "adc r4, r4, r7\n\t" - "str r2, [sp, #96]\n\t" - "# A[0] * A[25]\n\t" - "ldr r10, [%[a], #100]\n\t" - "ldr r8, [%[a], #0]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r2, #0\n\t" - "mov r7, #0\n\t" - "# A[1] * A[24]\n\t" - "ldr r10, [%[a], #96]\n\t" - "ldr r8, [%[a], #4]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[2] * A[23]\n\t" - "ldr r10, [%[a], #92]\n\t" - "ldr r8, [%[a], #8]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[3] * A[22]\n\t" - "ldr r10, [%[a], #88]\n\t" - "ldr r8, [%[a], #12]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[4] * A[21]\n\t" - "ldr r10, [%[a], #84]\n\t" - "ldr r8, [%[a], #16]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[5] * A[20]\n\t" - "ldr r10, [%[a], #80]\n\t" - "ldr r8, [%[a], #20]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[6] * A[19]\n\t" - "ldr r10, [%[a], #76]\n\t" - "ldr r8, [%[a], #24]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[7] * A[18]\n\t" - "ldr r10, [%[a], #72]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[8] * A[17]\n\t" - "ldr r10, [%[a], #68]\n\t" - "ldr r8, [%[a], #32]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[9] * A[16]\n\t" - "ldr r10, [%[a], #64]\n\t" - "ldr r8, [%[a], #36]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[10] * A[15]\n\t" - "ldr r10, [%[a], #60]\n\t" - "ldr r8, [%[a], #40]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[11] * A[14]\n\t" - "ldr r10, [%[a], #56]\n\t" - "ldr r8, [%[a], #44]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[12] * A[13]\n\t" - "ldr r10, [%[a], #52]\n\t" - "ldr r8, [%[a], #48]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r3, r3, r5\n\t" - "adcs r4, r4, r6\n\t" - "adc r2, r2, r7\n\t" - "str r3, [sp, #100]\n\t" - "# A[0] * A[26]\n\t" - "ldr r10, [%[a], #104]\n\t" - "ldr r8, [%[a], #0]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r3, #0\n\t" - "mov r7, #0\n\t" - "# A[1] * A[25]\n\t" - "ldr r10, [%[a], #100]\n\t" - "ldr r8, [%[a], #4]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[2] * A[24]\n\t" - "ldr r10, [%[a], #96]\n\t" - "ldr r8, [%[a], #8]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[3] * A[23]\n\t" - "ldr r10, [%[a], #92]\n\t" - "ldr r8, [%[a], #12]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[4] * A[22]\n\t" - "ldr r10, [%[a], #88]\n\t" - "ldr r8, [%[a], #16]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[5] * A[21]\n\t" - "ldr r10, [%[a], #84]\n\t" - "ldr r8, [%[a], #20]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[6] * A[20]\n\t" - "ldr r10, [%[a], #80]\n\t" - "ldr r8, [%[a], #24]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[7] * A[19]\n\t" - "ldr r10, [%[a], #76]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[8] * A[18]\n\t" - "ldr r10, [%[a], #72]\n\t" - "ldr r8, [%[a], #32]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[9] * A[17]\n\t" - "ldr r10, [%[a], #68]\n\t" - "ldr r8, [%[a], #36]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[10] * A[16]\n\t" - "ldr r10, [%[a], #64]\n\t" - "ldr r8, [%[a], #40]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[11] * A[15]\n\t" - "ldr r10, [%[a], #60]\n\t" - "ldr r8, [%[a], #44]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[12] * A[14]\n\t" - "ldr r10, [%[a], #56]\n\t" - "ldr r8, [%[a], #48]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[13] * A[13]\n\t" - "ldr r10, [%[a], #52]\n\t" - "umull r8, r9, r10, r10\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r4, r4, r5\n\t" - "adcs r2, r2, r6\n\t" - "adc r3, r3, r7\n\t" - "str r4, [sp, #104]\n\t" - "# A[0] * A[27]\n\t" - "ldr r10, [%[a], #108]\n\t" - "ldr r8, [%[a], #0]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r4, #0\n\t" - "mov r7, #0\n\t" - "# A[1] * A[26]\n\t" - "ldr r10, [%[a], #104]\n\t" - "ldr r8, [%[a], #4]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[2] * A[25]\n\t" - "ldr r10, [%[a], #100]\n\t" - "ldr r8, [%[a], #8]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[3] * A[24]\n\t" - "ldr r10, [%[a], #96]\n\t" - "ldr r8, [%[a], #12]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[4] * A[23]\n\t" - "ldr r10, [%[a], #92]\n\t" - "ldr r8, [%[a], #16]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[5] * A[22]\n\t" - "ldr r10, [%[a], #88]\n\t" - "ldr r8, [%[a], #20]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[6] * A[21]\n\t" - "ldr r10, [%[a], #84]\n\t" - "ldr r8, [%[a], #24]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[7] * A[20]\n\t" - "ldr r10, [%[a], #80]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[8] * A[19]\n\t" - "ldr r10, [%[a], #76]\n\t" - "ldr r8, [%[a], #32]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[9] * A[18]\n\t" - "ldr r10, [%[a], #72]\n\t" - "ldr r8, [%[a], #36]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[10] * A[17]\n\t" - "ldr r10, [%[a], #68]\n\t" - "ldr r8, [%[a], #40]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[11] * A[16]\n\t" - "ldr r10, [%[a], #64]\n\t" - "ldr r8, [%[a], #44]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[12] * A[15]\n\t" - "ldr r10, [%[a], #60]\n\t" - "ldr r8, [%[a], #48]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[13] * A[14]\n\t" - "ldr r10, [%[a], #56]\n\t" - "ldr r8, [%[a], #52]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r2, r2, r5\n\t" - "adcs r3, r3, r6\n\t" - "adc r4, r4, r7\n\t" - "str r2, [sp, #108]\n\t" - "# A[0] * A[28]\n\t" - "ldr r10, [%[a], #112]\n\t" - "ldr r8, [%[a], #0]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r2, #0\n\t" - "mov r7, #0\n\t" - "# A[1] * A[27]\n\t" - "ldr r10, [%[a], #108]\n\t" - "ldr r8, [%[a], #4]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[2] * A[26]\n\t" - "ldr r10, [%[a], #104]\n\t" - "ldr r8, [%[a], #8]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[3] * A[25]\n\t" - "ldr r10, [%[a], #100]\n\t" - "ldr r8, [%[a], #12]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[4] * A[24]\n\t" - "ldr r10, [%[a], #96]\n\t" - "ldr r8, [%[a], #16]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[5] * A[23]\n\t" - "ldr r10, [%[a], #92]\n\t" - "ldr r8, [%[a], #20]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[6] * A[22]\n\t" - "ldr r10, [%[a], #88]\n\t" - "ldr r8, [%[a], #24]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[7] * A[21]\n\t" - "ldr r10, [%[a], #84]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[8] * A[20]\n\t" - "ldr r10, [%[a], #80]\n\t" - "ldr r8, [%[a], #32]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[9] * A[19]\n\t" - "ldr r10, [%[a], #76]\n\t" - "ldr r8, [%[a], #36]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[10] * A[18]\n\t" - "ldr r10, [%[a], #72]\n\t" - "ldr r8, [%[a], #40]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[11] * A[17]\n\t" - "ldr r10, [%[a], #68]\n\t" - "ldr r8, [%[a], #44]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[12] * A[16]\n\t" - "ldr r10, [%[a], #64]\n\t" - "ldr r8, [%[a], #48]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[13] * A[15]\n\t" - "ldr r10, [%[a], #60]\n\t" - "ldr r8, [%[a], #52]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[14] * A[14]\n\t" - "ldr r10, [%[a], #56]\n\t" - "umull r8, r9, r10, r10\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r3, r3, r5\n\t" - "adcs r4, r4, r6\n\t" - "adc r2, r2, r7\n\t" - "str r3, [sp, #112]\n\t" - "# A[0] * A[29]\n\t" - "ldr r10, [%[a], #116]\n\t" - "ldr r8, [%[a], #0]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r3, #0\n\t" - "mov r7, #0\n\t" - "# A[1] * A[28]\n\t" - "ldr r10, [%[a], #112]\n\t" - "ldr r8, [%[a], #4]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[2] * A[27]\n\t" - "ldr r10, [%[a], #108]\n\t" - "ldr r8, [%[a], #8]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[3] * A[26]\n\t" - "ldr r10, [%[a], #104]\n\t" - "ldr r8, [%[a], #12]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[4] * A[25]\n\t" - "ldr r10, [%[a], #100]\n\t" - "ldr r8, [%[a], #16]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[5] * A[24]\n\t" - "ldr r10, [%[a], #96]\n\t" - "ldr r8, [%[a], #20]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[6] * A[23]\n\t" - "ldr r10, [%[a], #92]\n\t" - "ldr r8, [%[a], #24]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[7] * A[22]\n\t" - "ldr r10, [%[a], #88]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[8] * A[21]\n\t" - "ldr r10, [%[a], #84]\n\t" - "ldr r8, [%[a], #32]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[9] * A[20]\n\t" - "ldr r10, [%[a], #80]\n\t" - "ldr r8, [%[a], #36]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[10] * A[19]\n\t" - "ldr r10, [%[a], #76]\n\t" - "ldr r8, [%[a], #40]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[11] * A[18]\n\t" - "ldr r10, [%[a], #72]\n\t" - "ldr r8, [%[a], #44]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[12] * A[17]\n\t" - "ldr r10, [%[a], #68]\n\t" - "ldr r8, [%[a], #48]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[13] * A[16]\n\t" - "ldr r10, [%[a], #64]\n\t" - "ldr r8, [%[a], #52]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[14] * A[15]\n\t" - "ldr r10, [%[a], #60]\n\t" - "ldr r8, [%[a], #56]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r4, r4, r5\n\t" - "adcs r2, r2, r6\n\t" - "adc r3, r3, r7\n\t" - "str r4, [sp, #116]\n\t" - "# A[0] * A[30]\n\t" - "ldr r10, [%[a], #120]\n\t" - "ldr r8, [%[a], #0]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r4, #0\n\t" - "mov r7, #0\n\t" - "# A[1] * A[29]\n\t" - "ldr r10, [%[a], #116]\n\t" - "ldr r8, [%[a], #4]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[2] * A[28]\n\t" - "ldr r10, [%[a], #112]\n\t" - "ldr r8, [%[a], #8]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[3] * A[27]\n\t" - "ldr r10, [%[a], #108]\n\t" - "ldr r8, [%[a], #12]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[4] * A[26]\n\t" - "ldr r10, [%[a], #104]\n\t" - "ldr r8, [%[a], #16]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[5] * A[25]\n\t" - "ldr r10, [%[a], #100]\n\t" - "ldr r8, [%[a], #20]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[6] * A[24]\n\t" - "ldr r10, [%[a], #96]\n\t" - "ldr r8, [%[a], #24]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[7] * A[23]\n\t" - "ldr r10, [%[a], #92]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[8] * A[22]\n\t" - "ldr r10, [%[a], #88]\n\t" - "ldr r8, [%[a], #32]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[9] * A[21]\n\t" - "ldr r10, [%[a], #84]\n\t" - "ldr r8, [%[a], #36]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[10] * A[20]\n\t" - "ldr r10, [%[a], #80]\n\t" - "ldr r8, [%[a], #40]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[11] * A[19]\n\t" - "ldr r10, [%[a], #76]\n\t" - "ldr r8, [%[a], #44]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[12] * A[18]\n\t" - "ldr r10, [%[a], #72]\n\t" - "ldr r8, [%[a], #48]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[13] * A[17]\n\t" - "ldr r10, [%[a], #68]\n\t" - "ldr r8, [%[a], #52]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[14] * A[16]\n\t" - "ldr r10, [%[a], #64]\n\t" - "ldr r8, [%[a], #56]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[15] * A[15]\n\t" - "ldr r10, [%[a], #60]\n\t" - "umull r8, r9, r10, r10\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r2, r2, r5\n\t" - "adcs r3, r3, r6\n\t" - "adc r4, r4, r7\n\t" - "str r2, [sp, #120]\n\t" - "# A[0] * A[31]\n\t" - "ldr r10, [%[a], #124]\n\t" - "ldr r8, [%[a], #0]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r2, #0\n\t" - "mov r7, #0\n\t" - "# A[1] * A[30]\n\t" - "ldr r10, [%[a], #120]\n\t" - "ldr r8, [%[a], #4]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[2] * A[29]\n\t" - "ldr r10, [%[a], #116]\n\t" - "ldr r8, [%[a], #8]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[3] * A[28]\n\t" - "ldr r10, [%[a], #112]\n\t" - "ldr r8, [%[a], #12]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[4] * A[27]\n\t" - "ldr r10, [%[a], #108]\n\t" - "ldr r8, [%[a], #16]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[5] * A[26]\n\t" - "ldr r10, [%[a], #104]\n\t" - "ldr r8, [%[a], #20]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[6] * A[25]\n\t" - "ldr r10, [%[a], #100]\n\t" - "ldr r8, [%[a], #24]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[7] * A[24]\n\t" - "ldr r10, [%[a], #96]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[8] * A[23]\n\t" - "ldr r10, [%[a], #92]\n\t" - "ldr r8, [%[a], #32]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[9] * A[22]\n\t" - "ldr r10, [%[a], #88]\n\t" - "ldr r8, [%[a], #36]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[10] * A[21]\n\t" - "ldr r10, [%[a], #84]\n\t" - "ldr r8, [%[a], #40]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[11] * A[20]\n\t" - "ldr r10, [%[a], #80]\n\t" - "ldr r8, [%[a], #44]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[12] * A[19]\n\t" - "ldr r10, [%[a], #76]\n\t" - "ldr r8, [%[a], #48]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[13] * A[18]\n\t" - "ldr r10, [%[a], #72]\n\t" - "ldr r8, [%[a], #52]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[14] * A[17]\n\t" - "ldr r10, [%[a], #68]\n\t" - "ldr r8, [%[a], #56]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[15] * A[16]\n\t" - "ldr r10, [%[a], #64]\n\t" - "ldr r8, [%[a], #60]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r3, r3, r5\n\t" - "adcs r4, r4, r6\n\t" - "adc r2, r2, r7\n\t" - "str r3, [sp, #124]\n\t" - "# A[0] * A[32]\n\t" - "ldr r10, [%[a], #128]\n\t" - "ldr r8, [%[a], #0]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r3, #0\n\t" - "mov r7, #0\n\t" - "# A[1] * A[31]\n\t" - "ldr r10, [%[a], #124]\n\t" - "ldr r8, [%[a], #4]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[2] * A[30]\n\t" - "ldr r10, [%[a], #120]\n\t" - "ldr r8, [%[a], #8]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[3] * A[29]\n\t" - "ldr r10, [%[a], #116]\n\t" - "ldr r8, [%[a], #12]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[4] * A[28]\n\t" - "ldr r10, [%[a], #112]\n\t" - "ldr r8, [%[a], #16]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[5] * A[27]\n\t" - "ldr r10, [%[a], #108]\n\t" - "ldr r8, [%[a], #20]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[6] * A[26]\n\t" - "ldr r10, [%[a], #104]\n\t" - "ldr r8, [%[a], #24]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[7] * A[25]\n\t" - "ldr r10, [%[a], #100]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[8] * A[24]\n\t" - "ldr r10, [%[a], #96]\n\t" - "ldr r8, [%[a], #32]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[9] * A[23]\n\t" - "ldr r10, [%[a], #92]\n\t" - "ldr r8, [%[a], #36]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[10] * A[22]\n\t" - "ldr r10, [%[a], #88]\n\t" - "ldr r8, [%[a], #40]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[11] * A[21]\n\t" - "ldr r10, [%[a], #84]\n\t" - "ldr r8, [%[a], #44]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[12] * A[20]\n\t" - "ldr r10, [%[a], #80]\n\t" - "ldr r8, [%[a], #48]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[13] * A[19]\n\t" - "ldr r10, [%[a], #76]\n\t" - "ldr r8, [%[a], #52]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[14] * A[18]\n\t" - "ldr r10, [%[a], #72]\n\t" - "ldr r8, [%[a], #56]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[15] * A[17]\n\t" - "ldr r10, [%[a], #68]\n\t" - "ldr r8, [%[a], #60]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[16] * A[16]\n\t" - "ldr r10, [%[a], #64]\n\t" - "umull r8, r9, r10, r10\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r4, r4, r5\n\t" - "adcs r2, r2, r6\n\t" - "adc r3, r3, r7\n\t" - "str r4, [sp, #128]\n\t" - "# A[0] * A[33]\n\t" - "ldr r10, [%[a], #132]\n\t" - "ldr r8, [%[a], #0]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r4, #0\n\t" - "mov r7, #0\n\t" - "# A[1] * A[32]\n\t" - "ldr r10, [%[a], #128]\n\t" - "ldr r8, [%[a], #4]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[2] * A[31]\n\t" - "ldr r10, [%[a], #124]\n\t" - "ldr r8, [%[a], #8]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[3] * A[30]\n\t" - "ldr r10, [%[a], #120]\n\t" - "ldr r8, [%[a], #12]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[4] * A[29]\n\t" - "ldr r10, [%[a], #116]\n\t" - "ldr r8, [%[a], #16]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[5] * A[28]\n\t" - "ldr r10, [%[a], #112]\n\t" - "ldr r8, [%[a], #20]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[6] * A[27]\n\t" - "ldr r10, [%[a], #108]\n\t" - "ldr r8, [%[a], #24]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[7] * A[26]\n\t" - "ldr r10, [%[a], #104]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[8] * A[25]\n\t" - "ldr r10, [%[a], #100]\n\t" - "ldr r8, [%[a], #32]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[9] * A[24]\n\t" - "ldr r10, [%[a], #96]\n\t" - "ldr r8, [%[a], #36]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[10] * A[23]\n\t" - "ldr r10, [%[a], #92]\n\t" - "ldr r8, [%[a], #40]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[11] * A[22]\n\t" - "ldr r10, [%[a], #88]\n\t" - "ldr r8, [%[a], #44]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[12] * A[21]\n\t" - "ldr r10, [%[a], #84]\n\t" - "ldr r8, [%[a], #48]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[13] * A[20]\n\t" - "ldr r10, [%[a], #80]\n\t" - "ldr r8, [%[a], #52]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[14] * A[19]\n\t" - "ldr r10, [%[a], #76]\n\t" - "ldr r8, [%[a], #56]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[15] * A[18]\n\t" - "ldr r10, [%[a], #72]\n\t" - "ldr r8, [%[a], #60]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[16] * A[17]\n\t" - "ldr r10, [%[a], #68]\n\t" - "ldr r8, [%[a], #64]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r2, r2, r5\n\t" - "adcs r3, r3, r6\n\t" - "adc r4, r4, r7\n\t" - "str r2, [sp, #132]\n\t" - "# A[0] * A[34]\n\t" - "ldr r10, [%[a], #136]\n\t" - "ldr r8, [%[a], #0]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r2, #0\n\t" - "mov r7, #0\n\t" - "# A[1] * A[33]\n\t" - "ldr r10, [%[a], #132]\n\t" - "ldr r8, [%[a], #4]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[2] * A[32]\n\t" - "ldr r10, [%[a], #128]\n\t" - "ldr r8, [%[a], #8]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[3] * A[31]\n\t" - "ldr r10, [%[a], #124]\n\t" - "ldr r8, [%[a], #12]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[4] * A[30]\n\t" - "ldr r10, [%[a], #120]\n\t" - "ldr r8, [%[a], #16]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[5] * A[29]\n\t" - "ldr r10, [%[a], #116]\n\t" - "ldr r8, [%[a], #20]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[6] * A[28]\n\t" - "ldr r10, [%[a], #112]\n\t" - "ldr r8, [%[a], #24]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[7] * A[27]\n\t" - "ldr r10, [%[a], #108]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[8] * A[26]\n\t" - "ldr r10, [%[a], #104]\n\t" - "ldr r8, [%[a], #32]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[9] * A[25]\n\t" - "ldr r10, [%[a], #100]\n\t" - "ldr r8, [%[a], #36]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[10] * A[24]\n\t" - "ldr r10, [%[a], #96]\n\t" - "ldr r8, [%[a], #40]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[11] * A[23]\n\t" - "ldr r10, [%[a], #92]\n\t" - "ldr r8, [%[a], #44]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[12] * A[22]\n\t" - "ldr r10, [%[a], #88]\n\t" - "ldr r8, [%[a], #48]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[13] * A[21]\n\t" - "ldr r10, [%[a], #84]\n\t" - "ldr r8, [%[a], #52]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[14] * A[20]\n\t" - "ldr r10, [%[a], #80]\n\t" - "ldr r8, [%[a], #56]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[15] * A[19]\n\t" - "ldr r10, [%[a], #76]\n\t" - "ldr r8, [%[a], #60]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[16] * A[18]\n\t" - "ldr r10, [%[a], #72]\n\t" - "ldr r8, [%[a], #64]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[17] * A[17]\n\t" - "ldr r10, [%[a], #68]\n\t" - "umull r8, r9, r10, r10\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r3, r3, r5\n\t" - "adcs r4, r4, r6\n\t" - "adc r2, r2, r7\n\t" - "str r3, [sp, #136]\n\t" - "# A[0] * A[35]\n\t" - "ldr r10, [%[a], #140]\n\t" - "ldr r8, [%[a], #0]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r3, #0\n\t" - "mov r7, #0\n\t" - "# A[1] * A[34]\n\t" - "ldr r10, [%[a], #136]\n\t" - "ldr r8, [%[a], #4]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[2] * A[33]\n\t" - "ldr r10, [%[a], #132]\n\t" - "ldr r8, [%[a], #8]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[3] * A[32]\n\t" - "ldr r10, [%[a], #128]\n\t" - "ldr r8, [%[a], #12]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[4] * A[31]\n\t" - "ldr r10, [%[a], #124]\n\t" - "ldr r8, [%[a], #16]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[5] * A[30]\n\t" - "ldr r10, [%[a], #120]\n\t" - "ldr r8, [%[a], #20]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[6] * A[29]\n\t" - "ldr r10, [%[a], #116]\n\t" - "ldr r8, [%[a], #24]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[7] * A[28]\n\t" - "ldr r10, [%[a], #112]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[8] * A[27]\n\t" - "ldr r10, [%[a], #108]\n\t" - "ldr r8, [%[a], #32]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[9] * A[26]\n\t" - "ldr r10, [%[a], #104]\n\t" - "ldr r8, [%[a], #36]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[10] * A[25]\n\t" - "ldr r10, [%[a], #100]\n\t" - "ldr r8, [%[a], #40]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[11] * A[24]\n\t" - "ldr r10, [%[a], #96]\n\t" - "ldr r8, [%[a], #44]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[12] * A[23]\n\t" - "ldr r10, [%[a], #92]\n\t" - "ldr r8, [%[a], #48]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[13] * A[22]\n\t" - "ldr r10, [%[a], #88]\n\t" - "ldr r8, [%[a], #52]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[14] * A[21]\n\t" - "ldr r10, [%[a], #84]\n\t" - "ldr r8, [%[a], #56]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[15] * A[20]\n\t" - "ldr r10, [%[a], #80]\n\t" - "ldr r8, [%[a], #60]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[16] * A[19]\n\t" - "ldr r10, [%[a], #76]\n\t" - "ldr r8, [%[a], #64]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[17] * A[18]\n\t" - "ldr r10, [%[a], #72]\n\t" - "ldr r8, [%[a], #68]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r4, r4, r5\n\t" - "adcs r2, r2, r6\n\t" - "adc r3, r3, r7\n\t" - "str r4, [sp, #140]\n\t" - "# A[0] * A[36]\n\t" - "ldr r10, [%[a], #144]\n\t" - "ldr r8, [%[a], #0]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r4, #0\n\t" - "mov r7, #0\n\t" - "# A[1] * A[35]\n\t" - "ldr r10, [%[a], #140]\n\t" - "ldr r8, [%[a], #4]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[2] * A[34]\n\t" - "ldr r10, [%[a], #136]\n\t" - "ldr r8, [%[a], #8]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[3] * A[33]\n\t" - "ldr r10, [%[a], #132]\n\t" - "ldr r8, [%[a], #12]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[4] * A[32]\n\t" - "ldr r10, [%[a], #128]\n\t" - "ldr r8, [%[a], #16]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[5] * A[31]\n\t" - "ldr r10, [%[a], #124]\n\t" - "ldr r8, [%[a], #20]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[6] * A[30]\n\t" - "ldr r10, [%[a], #120]\n\t" - "ldr r8, [%[a], #24]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[7] * A[29]\n\t" - "ldr r10, [%[a], #116]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[8] * A[28]\n\t" - "ldr r10, [%[a], #112]\n\t" - "ldr r8, [%[a], #32]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[9] * A[27]\n\t" - "ldr r10, [%[a], #108]\n\t" - "ldr r8, [%[a], #36]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[10] * A[26]\n\t" - "ldr r10, [%[a], #104]\n\t" - "ldr r8, [%[a], #40]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[11] * A[25]\n\t" - "ldr r10, [%[a], #100]\n\t" - "ldr r8, [%[a], #44]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[12] * A[24]\n\t" - "ldr r10, [%[a], #96]\n\t" - "ldr r8, [%[a], #48]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[13] * A[23]\n\t" - "ldr r10, [%[a], #92]\n\t" - "ldr r8, [%[a], #52]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[14] * A[22]\n\t" - "ldr r10, [%[a], #88]\n\t" - "ldr r8, [%[a], #56]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[15] * A[21]\n\t" - "ldr r10, [%[a], #84]\n\t" - "ldr r8, [%[a], #60]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[16] * A[20]\n\t" - "ldr r10, [%[a], #80]\n\t" - "ldr r8, [%[a], #64]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[17] * A[19]\n\t" - "ldr r10, [%[a], #76]\n\t" - "ldr r8, [%[a], #68]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[18] * A[18]\n\t" - "ldr r10, [%[a], #72]\n\t" - "umull r8, r9, r10, r10\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r2, r2, r5\n\t" - "adcs r3, r3, r6\n\t" - "adc r4, r4, r7\n\t" - "str r2, [sp, #144]\n\t" - "# A[0] * A[37]\n\t" - "ldr r10, [%[a], #148]\n\t" - "ldr r8, [%[a], #0]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r2, #0\n\t" - "mov r7, #0\n\t" - "# A[1] * A[36]\n\t" - "ldr r10, [%[a], #144]\n\t" - "ldr r8, [%[a], #4]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[2] * A[35]\n\t" - "ldr r10, [%[a], #140]\n\t" - "ldr r8, [%[a], #8]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[3] * A[34]\n\t" - "ldr r10, [%[a], #136]\n\t" - "ldr r8, [%[a], #12]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[4] * A[33]\n\t" - "ldr r10, [%[a], #132]\n\t" - "ldr r8, [%[a], #16]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[5] * A[32]\n\t" - "ldr r10, [%[a], #128]\n\t" - "ldr r8, [%[a], #20]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[6] * A[31]\n\t" - "ldr r10, [%[a], #124]\n\t" - "ldr r8, [%[a], #24]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[7] * A[30]\n\t" - "ldr r10, [%[a], #120]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[8] * A[29]\n\t" - "ldr r10, [%[a], #116]\n\t" - "ldr r8, [%[a], #32]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[9] * A[28]\n\t" - "ldr r10, [%[a], #112]\n\t" - "ldr r8, [%[a], #36]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[10] * A[27]\n\t" - "ldr r10, [%[a], #108]\n\t" - "ldr r8, [%[a], #40]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[11] * A[26]\n\t" - "ldr r10, [%[a], #104]\n\t" - "ldr r8, [%[a], #44]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[12] * A[25]\n\t" - "ldr r10, [%[a], #100]\n\t" - "ldr r8, [%[a], #48]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[13] * A[24]\n\t" - "ldr r10, [%[a], #96]\n\t" - "ldr r8, [%[a], #52]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[14] * A[23]\n\t" - "ldr r10, [%[a], #92]\n\t" - "ldr r8, [%[a], #56]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[15] * A[22]\n\t" - "ldr r10, [%[a], #88]\n\t" - "ldr r8, [%[a], #60]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[16] * A[21]\n\t" - "ldr r10, [%[a], #84]\n\t" - "ldr r8, [%[a], #64]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[17] * A[20]\n\t" - "ldr r10, [%[a], #80]\n\t" - "ldr r8, [%[a], #68]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[18] * A[19]\n\t" - "ldr r10, [%[a], #76]\n\t" - "ldr r8, [%[a], #72]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r3, r3, r5\n\t" - "adcs r4, r4, r6\n\t" - "adc r2, r2, r7\n\t" - "str r3, [sp, #148]\n\t" - "# A[0] * A[38]\n\t" - "ldr r10, [%[a], #152]\n\t" - "ldr r8, [%[a], #0]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r3, #0\n\t" - "mov r7, #0\n\t" - "# A[1] * A[37]\n\t" - "ldr r10, [%[a], #148]\n\t" - "ldr r8, [%[a], #4]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[2] * A[36]\n\t" - "ldr r10, [%[a], #144]\n\t" - "ldr r8, [%[a], #8]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[3] * A[35]\n\t" - "ldr r10, [%[a], #140]\n\t" - "ldr r8, [%[a], #12]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[4] * A[34]\n\t" - "ldr r10, [%[a], #136]\n\t" - "ldr r8, [%[a], #16]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[5] * A[33]\n\t" - "ldr r10, [%[a], #132]\n\t" - "ldr r8, [%[a], #20]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[6] * A[32]\n\t" - "ldr r10, [%[a], #128]\n\t" - "ldr r8, [%[a], #24]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[7] * A[31]\n\t" - "ldr r10, [%[a], #124]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[8] * A[30]\n\t" - "ldr r10, [%[a], #120]\n\t" - "ldr r8, [%[a], #32]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[9] * A[29]\n\t" - "ldr r10, [%[a], #116]\n\t" - "ldr r8, [%[a], #36]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[10] * A[28]\n\t" - "ldr r10, [%[a], #112]\n\t" - "ldr r8, [%[a], #40]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[11] * A[27]\n\t" - "ldr r10, [%[a], #108]\n\t" - "ldr r8, [%[a], #44]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[12] * A[26]\n\t" - "ldr r10, [%[a], #104]\n\t" - "ldr r8, [%[a], #48]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[13] * A[25]\n\t" - "ldr r10, [%[a], #100]\n\t" - "ldr r8, [%[a], #52]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[14] * A[24]\n\t" - "ldr r10, [%[a], #96]\n\t" - "ldr r8, [%[a], #56]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[15] * A[23]\n\t" - "ldr r10, [%[a], #92]\n\t" - "ldr r8, [%[a], #60]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[16] * A[22]\n\t" - "ldr r10, [%[a], #88]\n\t" - "ldr r8, [%[a], #64]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[17] * A[21]\n\t" - "ldr r10, [%[a], #84]\n\t" - "ldr r8, [%[a], #68]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[18] * A[20]\n\t" - "ldr r10, [%[a], #80]\n\t" - "ldr r8, [%[a], #72]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[19] * A[19]\n\t" - "ldr r10, [%[a], #76]\n\t" - "umull r8, r9, r10, r10\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r4, r4, r5\n\t" - "adcs r2, r2, r6\n\t" - "adc r3, r3, r7\n\t" - "str r4, [sp, #152]\n\t" - "# A[0] * A[39]\n\t" - "ldr r10, [%[a], #156]\n\t" - "ldr r8, [%[a], #0]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r4, #0\n\t" - "mov r7, #0\n\t" - "# A[1] * A[38]\n\t" - "ldr r10, [%[a], #152]\n\t" - "ldr r8, [%[a], #4]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[2] * A[37]\n\t" - "ldr r10, [%[a], #148]\n\t" - "ldr r8, [%[a], #8]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[3] * A[36]\n\t" - "ldr r10, [%[a], #144]\n\t" - "ldr r8, [%[a], #12]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[4] * A[35]\n\t" - "ldr r10, [%[a], #140]\n\t" - "ldr r8, [%[a], #16]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[5] * A[34]\n\t" - "ldr r10, [%[a], #136]\n\t" - "ldr r8, [%[a], #20]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[6] * A[33]\n\t" - "ldr r10, [%[a], #132]\n\t" - "ldr r8, [%[a], #24]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[7] * A[32]\n\t" - "ldr r10, [%[a], #128]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[8] * A[31]\n\t" - "ldr r10, [%[a], #124]\n\t" - "ldr r8, [%[a], #32]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[9] * A[30]\n\t" - "ldr r10, [%[a], #120]\n\t" - "ldr r8, [%[a], #36]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[10] * A[29]\n\t" - "ldr r10, [%[a], #116]\n\t" - "ldr r8, [%[a], #40]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[11] * A[28]\n\t" - "ldr r10, [%[a], #112]\n\t" - "ldr r8, [%[a], #44]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[12] * A[27]\n\t" - "ldr r10, [%[a], #108]\n\t" - "ldr r8, [%[a], #48]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[13] * A[26]\n\t" - "ldr r10, [%[a], #104]\n\t" - "ldr r8, [%[a], #52]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[14] * A[25]\n\t" - "ldr r10, [%[a], #100]\n\t" - "ldr r8, [%[a], #56]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[15] * A[24]\n\t" - "ldr r10, [%[a], #96]\n\t" - "ldr r8, [%[a], #60]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[16] * A[23]\n\t" - "ldr r10, [%[a], #92]\n\t" - "ldr r8, [%[a], #64]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[17] * A[22]\n\t" - "ldr r10, [%[a], #88]\n\t" - "ldr r8, [%[a], #68]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[18] * A[21]\n\t" - "ldr r10, [%[a], #84]\n\t" - "ldr r8, [%[a], #72]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[19] * A[20]\n\t" - "ldr r10, [%[a], #80]\n\t" - "ldr r8, [%[a], #76]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r2, r2, r5\n\t" - "adcs r3, r3, r6\n\t" - "adc r4, r4, r7\n\t" - "str r2, [sp, #156]\n\t" - "# A[0] * A[40]\n\t" - "ldr r10, [%[a], #160]\n\t" - "ldr r8, [%[a], #0]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r2, #0\n\t" - "mov r7, #0\n\t" - "# A[1] * A[39]\n\t" - "ldr r10, [%[a], #156]\n\t" - "ldr r8, [%[a], #4]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[2] * A[38]\n\t" - "ldr r10, [%[a], #152]\n\t" - "ldr r8, [%[a], #8]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[3] * A[37]\n\t" - "ldr r10, [%[a], #148]\n\t" - "ldr r8, [%[a], #12]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[4] * A[36]\n\t" - "ldr r10, [%[a], #144]\n\t" - "ldr r8, [%[a], #16]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[5] * A[35]\n\t" - "ldr r10, [%[a], #140]\n\t" - "ldr r8, [%[a], #20]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[6] * A[34]\n\t" - "ldr r10, [%[a], #136]\n\t" - "ldr r8, [%[a], #24]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[7] * A[33]\n\t" - "ldr r10, [%[a], #132]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[8] * A[32]\n\t" - "ldr r10, [%[a], #128]\n\t" - "ldr r8, [%[a], #32]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[9] * A[31]\n\t" - "ldr r10, [%[a], #124]\n\t" - "ldr r8, [%[a], #36]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[10] * A[30]\n\t" - "ldr r10, [%[a], #120]\n\t" - "ldr r8, [%[a], #40]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[11] * A[29]\n\t" - "ldr r10, [%[a], #116]\n\t" - "ldr r8, [%[a], #44]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[12] * A[28]\n\t" - "ldr r10, [%[a], #112]\n\t" - "ldr r8, [%[a], #48]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[13] * A[27]\n\t" - "ldr r10, [%[a], #108]\n\t" - "ldr r8, [%[a], #52]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[14] * A[26]\n\t" - "ldr r10, [%[a], #104]\n\t" - "ldr r8, [%[a], #56]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[15] * A[25]\n\t" - "ldr r10, [%[a], #100]\n\t" - "ldr r8, [%[a], #60]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[16] * A[24]\n\t" - "ldr r10, [%[a], #96]\n\t" - "ldr r8, [%[a], #64]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[17] * A[23]\n\t" - "ldr r10, [%[a], #92]\n\t" - "ldr r8, [%[a], #68]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[18] * A[22]\n\t" - "ldr r10, [%[a], #88]\n\t" - "ldr r8, [%[a], #72]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[19] * A[21]\n\t" - "ldr r10, [%[a], #84]\n\t" - "ldr r8, [%[a], #76]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[20] * A[20]\n\t" - "ldr r10, [%[a], #80]\n\t" - "umull r8, r9, r10, r10\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r3, r3, r5\n\t" - "adcs r4, r4, r6\n\t" - "adc r2, r2, r7\n\t" - "str r3, [sp, #160]\n\t" - "# A[0] * A[41]\n\t" - "ldr r10, [%[a], #164]\n\t" - "ldr r8, [%[a], #0]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r3, #0\n\t" - "mov r7, #0\n\t" - "# A[1] * A[40]\n\t" - "ldr r10, [%[a], #160]\n\t" - "ldr r8, [%[a], #4]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[2] * A[39]\n\t" - "ldr r10, [%[a], #156]\n\t" - "ldr r8, [%[a], #8]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[3] * A[38]\n\t" - "ldr r10, [%[a], #152]\n\t" - "ldr r8, [%[a], #12]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[4] * A[37]\n\t" - "ldr r10, [%[a], #148]\n\t" - "ldr r8, [%[a], #16]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[5] * A[36]\n\t" - "ldr r10, [%[a], #144]\n\t" - "ldr r8, [%[a], #20]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[6] * A[35]\n\t" - "ldr r10, [%[a], #140]\n\t" - "ldr r8, [%[a], #24]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[7] * A[34]\n\t" - "ldr r10, [%[a], #136]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[8] * A[33]\n\t" - "ldr r10, [%[a], #132]\n\t" - "ldr r8, [%[a], #32]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[9] * A[32]\n\t" - "ldr r10, [%[a], #128]\n\t" - "ldr r8, [%[a], #36]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[10] * A[31]\n\t" - "ldr r10, [%[a], #124]\n\t" - "ldr r8, [%[a], #40]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[11] * A[30]\n\t" - "ldr r10, [%[a], #120]\n\t" - "ldr r8, [%[a], #44]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[12] * A[29]\n\t" - "ldr r10, [%[a], #116]\n\t" - "ldr r8, [%[a], #48]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[13] * A[28]\n\t" - "ldr r10, [%[a], #112]\n\t" - "ldr r8, [%[a], #52]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[14] * A[27]\n\t" - "ldr r10, [%[a], #108]\n\t" - "ldr r8, [%[a], #56]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[15] * A[26]\n\t" - "ldr r10, [%[a], #104]\n\t" - "ldr r8, [%[a], #60]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[16] * A[25]\n\t" - "ldr r10, [%[a], #100]\n\t" - "ldr r8, [%[a], #64]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[17] * A[24]\n\t" - "ldr r10, [%[a], #96]\n\t" - "ldr r8, [%[a], #68]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[18] * A[23]\n\t" - "ldr r10, [%[a], #92]\n\t" - "ldr r8, [%[a], #72]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[19] * A[22]\n\t" - "ldr r10, [%[a], #88]\n\t" - "ldr r8, [%[a], #76]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[20] * A[21]\n\t" - "ldr r10, [%[a], #84]\n\t" - "ldr r8, [%[a], #80]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r4, r4, r5\n\t" - "adcs r2, r2, r6\n\t" - "adc r3, r3, r7\n\t" - "str r4, [sp, #164]\n\t" - "# A[0] * A[42]\n\t" - "ldr r10, [%[a], #168]\n\t" - "ldr r8, [%[a], #0]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r4, #0\n\t" - "mov r7, #0\n\t" - "# A[1] * A[41]\n\t" - "ldr r10, [%[a], #164]\n\t" - "ldr r8, [%[a], #4]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[2] * A[40]\n\t" - "ldr r10, [%[a], #160]\n\t" - "ldr r8, [%[a], #8]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[3] * A[39]\n\t" - "ldr r10, [%[a], #156]\n\t" - "ldr r8, [%[a], #12]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[4] * A[38]\n\t" - "ldr r10, [%[a], #152]\n\t" - "ldr r8, [%[a], #16]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[5] * A[37]\n\t" - "ldr r10, [%[a], #148]\n\t" - "ldr r8, [%[a], #20]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[6] * A[36]\n\t" - "ldr r10, [%[a], #144]\n\t" - "ldr r8, [%[a], #24]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[7] * A[35]\n\t" - "ldr r10, [%[a], #140]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[8] * A[34]\n\t" - "ldr r10, [%[a], #136]\n\t" - "ldr r8, [%[a], #32]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[9] * A[33]\n\t" - "ldr r10, [%[a], #132]\n\t" - "ldr r8, [%[a], #36]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[10] * A[32]\n\t" - "ldr r10, [%[a], #128]\n\t" - "ldr r8, [%[a], #40]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[11] * A[31]\n\t" - "ldr r10, [%[a], #124]\n\t" - "ldr r8, [%[a], #44]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[12] * A[30]\n\t" - "ldr r10, [%[a], #120]\n\t" - "ldr r8, [%[a], #48]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[13] * A[29]\n\t" - "ldr r10, [%[a], #116]\n\t" - "ldr r8, [%[a], #52]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[14] * A[28]\n\t" - "ldr r10, [%[a], #112]\n\t" - "ldr r8, [%[a], #56]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[15] * A[27]\n\t" - "ldr r10, [%[a], #108]\n\t" - "ldr r8, [%[a], #60]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[16] * A[26]\n\t" - "ldr r10, [%[a], #104]\n\t" - "ldr r8, [%[a], #64]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[17] * A[25]\n\t" - "ldr r10, [%[a], #100]\n\t" - "ldr r8, [%[a], #68]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[18] * A[24]\n\t" - "ldr r10, [%[a], #96]\n\t" - "ldr r8, [%[a], #72]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[19] * A[23]\n\t" - "ldr r10, [%[a], #92]\n\t" - "ldr r8, [%[a], #76]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[20] * A[22]\n\t" - "ldr r10, [%[a], #88]\n\t" - "ldr r8, [%[a], #80]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[21] * A[21]\n\t" - "ldr r10, [%[a], #84]\n\t" - "umull r8, r9, r10, r10\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r2, r2, r5\n\t" - "adcs r3, r3, r6\n\t" - "adc r4, r4, r7\n\t" - "str r2, [sp, #168]\n\t" - "# A[0] * A[43]\n\t" - "ldr r10, [%[a], #172]\n\t" - "ldr r8, [%[a], #0]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r2, #0\n\t" - "mov r7, #0\n\t" - "# A[1] * A[42]\n\t" - "ldr r10, [%[a], #168]\n\t" - "ldr r8, [%[a], #4]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[2] * A[41]\n\t" - "ldr r10, [%[a], #164]\n\t" - "ldr r8, [%[a], #8]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[3] * A[40]\n\t" - "ldr r10, [%[a], #160]\n\t" - "ldr r8, [%[a], #12]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[4] * A[39]\n\t" - "ldr r10, [%[a], #156]\n\t" - "ldr r8, [%[a], #16]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[5] * A[38]\n\t" - "ldr r10, [%[a], #152]\n\t" - "ldr r8, [%[a], #20]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[6] * A[37]\n\t" - "ldr r10, [%[a], #148]\n\t" - "ldr r8, [%[a], #24]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[7] * A[36]\n\t" - "ldr r10, [%[a], #144]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[8] * A[35]\n\t" - "ldr r10, [%[a], #140]\n\t" - "ldr r8, [%[a], #32]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[9] * A[34]\n\t" - "ldr r10, [%[a], #136]\n\t" - "ldr r8, [%[a], #36]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[10] * A[33]\n\t" - "ldr r10, [%[a], #132]\n\t" - "ldr r8, [%[a], #40]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[11] * A[32]\n\t" - "ldr r10, [%[a], #128]\n\t" - "ldr r8, [%[a], #44]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[12] * A[31]\n\t" - "ldr r10, [%[a], #124]\n\t" - "ldr r8, [%[a], #48]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[13] * A[30]\n\t" - "ldr r10, [%[a], #120]\n\t" - "ldr r8, [%[a], #52]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[14] * A[29]\n\t" - "ldr r10, [%[a], #116]\n\t" - "ldr r8, [%[a], #56]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[15] * A[28]\n\t" - "ldr r10, [%[a], #112]\n\t" - "ldr r8, [%[a], #60]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[16] * A[27]\n\t" - "ldr r10, [%[a], #108]\n\t" - "ldr r8, [%[a], #64]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[17] * A[26]\n\t" - "ldr r10, [%[a], #104]\n\t" - "ldr r8, [%[a], #68]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[18] * A[25]\n\t" - "ldr r10, [%[a], #100]\n\t" - "ldr r8, [%[a], #72]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[19] * A[24]\n\t" - "ldr r10, [%[a], #96]\n\t" - "ldr r8, [%[a], #76]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[20] * A[23]\n\t" - "ldr r10, [%[a], #92]\n\t" - "ldr r8, [%[a], #80]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[21] * A[22]\n\t" - "ldr r10, [%[a], #88]\n\t" - "ldr r8, [%[a], #84]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r3, r3, r5\n\t" - "adcs r4, r4, r6\n\t" - "adc r2, r2, r7\n\t" - "str r3, [sp, #172]\n\t" - "# A[0] * A[44]\n\t" - "ldr r10, [%[a], #176]\n\t" - "ldr r8, [%[a], #0]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r3, #0\n\t" - "mov r7, #0\n\t" - "# A[1] * A[43]\n\t" - "ldr r10, [%[a], #172]\n\t" - "ldr r8, [%[a], #4]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[2] * A[42]\n\t" - "ldr r10, [%[a], #168]\n\t" - "ldr r8, [%[a], #8]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[3] * A[41]\n\t" - "ldr r10, [%[a], #164]\n\t" - "ldr r8, [%[a], #12]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[4] * A[40]\n\t" - "ldr r10, [%[a], #160]\n\t" - "ldr r8, [%[a], #16]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[5] * A[39]\n\t" - "ldr r10, [%[a], #156]\n\t" - "ldr r8, [%[a], #20]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[6] * A[38]\n\t" - "ldr r10, [%[a], #152]\n\t" - "ldr r8, [%[a], #24]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[7] * A[37]\n\t" - "ldr r10, [%[a], #148]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[8] * A[36]\n\t" - "ldr r10, [%[a], #144]\n\t" - "ldr r8, [%[a], #32]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[9] * A[35]\n\t" - "ldr r10, [%[a], #140]\n\t" - "ldr r8, [%[a], #36]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[10] * A[34]\n\t" - "ldr r10, [%[a], #136]\n\t" - "ldr r8, [%[a], #40]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[11] * A[33]\n\t" - "ldr r10, [%[a], #132]\n\t" - "ldr r8, [%[a], #44]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[12] * A[32]\n\t" - "ldr r10, [%[a], #128]\n\t" - "ldr r8, [%[a], #48]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[13] * A[31]\n\t" - "ldr r10, [%[a], #124]\n\t" - "ldr r8, [%[a], #52]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[14] * A[30]\n\t" - "ldr r10, [%[a], #120]\n\t" - "ldr r8, [%[a], #56]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[15] * A[29]\n\t" - "ldr r10, [%[a], #116]\n\t" - "ldr r8, [%[a], #60]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[16] * A[28]\n\t" - "ldr r10, [%[a], #112]\n\t" - "ldr r8, [%[a], #64]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[17] * A[27]\n\t" - "ldr r10, [%[a], #108]\n\t" - "ldr r8, [%[a], #68]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[18] * A[26]\n\t" - "ldr r10, [%[a], #104]\n\t" - "ldr r8, [%[a], #72]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[19] * A[25]\n\t" - "ldr r10, [%[a], #100]\n\t" - "ldr r8, [%[a], #76]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[20] * A[24]\n\t" - "ldr r10, [%[a], #96]\n\t" - "ldr r8, [%[a], #80]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[21] * A[23]\n\t" - "ldr r10, [%[a], #92]\n\t" - "ldr r8, [%[a], #84]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[22] * A[22]\n\t" - "ldr r10, [%[a], #88]\n\t" - "umull r8, r9, r10, r10\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r4, r4, r5\n\t" - "adcs r2, r2, r6\n\t" - "adc r3, r3, r7\n\t" - "str r4, [sp, #176]\n\t" - "# A[0] * A[45]\n\t" - "ldr r10, [%[a], #180]\n\t" - "ldr r8, [%[a], #0]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r4, #0\n\t" - "mov r7, #0\n\t" - "# A[1] * A[44]\n\t" - "ldr r10, [%[a], #176]\n\t" - "ldr r8, [%[a], #4]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[2] * A[43]\n\t" - "ldr r10, [%[a], #172]\n\t" - "ldr r8, [%[a], #8]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[3] * A[42]\n\t" - "ldr r10, [%[a], #168]\n\t" - "ldr r8, [%[a], #12]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[4] * A[41]\n\t" - "ldr r10, [%[a], #164]\n\t" - "ldr r8, [%[a], #16]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[5] * A[40]\n\t" - "ldr r10, [%[a], #160]\n\t" - "ldr r8, [%[a], #20]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[6] * A[39]\n\t" - "ldr r10, [%[a], #156]\n\t" - "ldr r8, [%[a], #24]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[7] * A[38]\n\t" - "ldr r10, [%[a], #152]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[8] * A[37]\n\t" - "ldr r10, [%[a], #148]\n\t" - "ldr r8, [%[a], #32]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[9] * A[36]\n\t" - "ldr r10, [%[a], #144]\n\t" - "ldr r8, [%[a], #36]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[10] * A[35]\n\t" - "ldr r10, [%[a], #140]\n\t" - "ldr r8, [%[a], #40]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[11] * A[34]\n\t" - "ldr r10, [%[a], #136]\n\t" - "ldr r8, [%[a], #44]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[12] * A[33]\n\t" - "ldr r10, [%[a], #132]\n\t" - "ldr r8, [%[a], #48]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[13] * A[32]\n\t" - "ldr r10, [%[a], #128]\n\t" - "ldr r8, [%[a], #52]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[14] * A[31]\n\t" - "ldr r10, [%[a], #124]\n\t" - "ldr r8, [%[a], #56]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[15] * A[30]\n\t" - "ldr r10, [%[a], #120]\n\t" - "ldr r8, [%[a], #60]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[16] * A[29]\n\t" - "ldr r10, [%[a], #116]\n\t" - "ldr r8, [%[a], #64]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[17] * A[28]\n\t" - "ldr r10, [%[a], #112]\n\t" - "ldr r8, [%[a], #68]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[18] * A[27]\n\t" - "ldr r10, [%[a], #108]\n\t" - "ldr r8, [%[a], #72]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[19] * A[26]\n\t" - "ldr r10, [%[a], #104]\n\t" - "ldr r8, [%[a], #76]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[20] * A[25]\n\t" - "ldr r10, [%[a], #100]\n\t" - "ldr r8, [%[a], #80]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[21] * A[24]\n\t" - "ldr r10, [%[a], #96]\n\t" - "ldr r8, [%[a], #84]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[22] * A[23]\n\t" - "ldr r10, [%[a], #92]\n\t" - "ldr r8, [%[a], #88]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r2, r2, r5\n\t" - "adcs r3, r3, r6\n\t" - "adc r4, r4, r7\n\t" - "str r2, [sp, #180]\n\t" - "# A[0] * A[46]\n\t" - "ldr r10, [%[a], #184]\n\t" - "ldr r8, [%[a], #0]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r2, #0\n\t" - "mov r7, #0\n\t" - "# A[1] * A[45]\n\t" - "ldr r10, [%[a], #180]\n\t" - "ldr r8, [%[a], #4]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[2] * A[44]\n\t" - "ldr r10, [%[a], #176]\n\t" - "ldr r8, [%[a], #8]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[3] * A[43]\n\t" - "ldr r10, [%[a], #172]\n\t" - "ldr r8, [%[a], #12]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[4] * A[42]\n\t" - "ldr r10, [%[a], #168]\n\t" - "ldr r8, [%[a], #16]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[5] * A[41]\n\t" - "ldr r10, [%[a], #164]\n\t" - "ldr r8, [%[a], #20]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[6] * A[40]\n\t" - "ldr r10, [%[a], #160]\n\t" - "ldr r8, [%[a], #24]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[7] * A[39]\n\t" - "ldr r10, [%[a], #156]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[8] * A[38]\n\t" - "ldr r10, [%[a], #152]\n\t" - "ldr r8, [%[a], #32]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[9] * A[37]\n\t" - "ldr r10, [%[a], #148]\n\t" - "ldr r8, [%[a], #36]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[10] * A[36]\n\t" - "ldr r10, [%[a], #144]\n\t" - "ldr r8, [%[a], #40]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[11] * A[35]\n\t" - "ldr r10, [%[a], #140]\n\t" - "ldr r8, [%[a], #44]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[12] * A[34]\n\t" - "ldr r10, [%[a], #136]\n\t" - "ldr r8, [%[a], #48]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[13] * A[33]\n\t" - "ldr r10, [%[a], #132]\n\t" - "ldr r8, [%[a], #52]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[14] * A[32]\n\t" - "ldr r10, [%[a], #128]\n\t" - "ldr r8, [%[a], #56]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[15] * A[31]\n\t" - "ldr r10, [%[a], #124]\n\t" - "ldr r8, [%[a], #60]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[16] * A[30]\n\t" - "ldr r10, [%[a], #120]\n\t" - "ldr r8, [%[a], #64]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[17] * A[29]\n\t" - "ldr r10, [%[a], #116]\n\t" - "ldr r8, [%[a], #68]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[18] * A[28]\n\t" - "ldr r10, [%[a], #112]\n\t" - "ldr r8, [%[a], #72]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[19] * A[27]\n\t" - "ldr r10, [%[a], #108]\n\t" - "ldr r8, [%[a], #76]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[20] * A[26]\n\t" - "ldr r10, [%[a], #104]\n\t" - "ldr r8, [%[a], #80]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[21] * A[25]\n\t" - "ldr r10, [%[a], #100]\n\t" - "ldr r8, [%[a], #84]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[22] * A[24]\n\t" - "ldr r10, [%[a], #96]\n\t" - "ldr r8, [%[a], #88]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[23] * A[23]\n\t" - "ldr r10, [%[a], #92]\n\t" - "umull r8, r9, r10, r10\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r3, r3, r5\n\t" - "adcs r4, r4, r6\n\t" - "adc r2, r2, r7\n\t" - "str r3, [sp, #184]\n\t" - "# A[0] * A[47]\n\t" - "ldr r10, [%[a], #188]\n\t" - "ldr r8, [%[a], #0]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r3, #0\n\t" - "mov r7, #0\n\t" - "# A[1] * A[46]\n\t" - "ldr r10, [%[a], #184]\n\t" - "ldr r8, [%[a], #4]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[2] * A[45]\n\t" - "ldr r10, [%[a], #180]\n\t" - "ldr r8, [%[a], #8]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[3] * A[44]\n\t" - "ldr r10, [%[a], #176]\n\t" - "ldr r8, [%[a], #12]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[4] * A[43]\n\t" - "ldr r10, [%[a], #172]\n\t" - "ldr r8, [%[a], #16]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[5] * A[42]\n\t" - "ldr r10, [%[a], #168]\n\t" - "ldr r8, [%[a], #20]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[6] * A[41]\n\t" - "ldr r10, [%[a], #164]\n\t" - "ldr r8, [%[a], #24]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[7] * A[40]\n\t" - "ldr r10, [%[a], #160]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[8] * A[39]\n\t" - "ldr r10, [%[a], #156]\n\t" - "ldr r8, [%[a], #32]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[9] * A[38]\n\t" - "ldr r10, [%[a], #152]\n\t" - "ldr r8, [%[a], #36]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[10] * A[37]\n\t" - "ldr r10, [%[a], #148]\n\t" - "ldr r8, [%[a], #40]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[11] * A[36]\n\t" - "ldr r10, [%[a], #144]\n\t" - "ldr r8, [%[a], #44]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[12] * A[35]\n\t" - "ldr r10, [%[a], #140]\n\t" - "ldr r8, [%[a], #48]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[13] * A[34]\n\t" - "ldr r10, [%[a], #136]\n\t" - "ldr r8, [%[a], #52]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[14] * A[33]\n\t" - "ldr r10, [%[a], #132]\n\t" - "ldr r8, [%[a], #56]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[15] * A[32]\n\t" - "ldr r10, [%[a], #128]\n\t" - "ldr r8, [%[a], #60]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[16] * A[31]\n\t" - "ldr r10, [%[a], #124]\n\t" - "ldr r8, [%[a], #64]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[17] * A[30]\n\t" - "ldr r10, [%[a], #120]\n\t" - "ldr r8, [%[a], #68]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[18] * A[29]\n\t" - "ldr r10, [%[a], #116]\n\t" - "ldr r8, [%[a], #72]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[19] * A[28]\n\t" - "ldr r10, [%[a], #112]\n\t" - "ldr r8, [%[a], #76]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[20] * A[27]\n\t" - "ldr r10, [%[a], #108]\n\t" - "ldr r8, [%[a], #80]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[21] * A[26]\n\t" - "ldr r10, [%[a], #104]\n\t" - "ldr r8, [%[a], #84]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[22] * A[25]\n\t" - "ldr r10, [%[a], #100]\n\t" - "ldr r8, [%[a], #88]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[23] * A[24]\n\t" - "ldr r10, [%[a], #96]\n\t" - "ldr r8, [%[a], #92]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r4, r4, r5\n\t" - "adcs r2, r2, r6\n\t" - "adc r3, r3, r7\n\t" - "str r4, [sp, #188]\n\t" - "# A[0] * A[48]\n\t" - "ldr r10, [%[a], #192]\n\t" - "ldr r8, [%[a], #0]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r4, #0\n\t" - "mov r7, #0\n\t" - "# A[1] * A[47]\n\t" - "ldr r10, [%[a], #188]\n\t" - "ldr r8, [%[a], #4]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[2] * A[46]\n\t" - "ldr r10, [%[a], #184]\n\t" - "ldr r8, [%[a], #8]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[3] * A[45]\n\t" - "ldr r10, [%[a], #180]\n\t" - "ldr r8, [%[a], #12]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[4] * A[44]\n\t" - "ldr r10, [%[a], #176]\n\t" - "ldr r8, [%[a], #16]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[5] * A[43]\n\t" - "ldr r10, [%[a], #172]\n\t" - "ldr r8, [%[a], #20]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[6] * A[42]\n\t" - "ldr r10, [%[a], #168]\n\t" - "ldr r8, [%[a], #24]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[7] * A[41]\n\t" - "ldr r10, [%[a], #164]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[8] * A[40]\n\t" - "ldr r10, [%[a], #160]\n\t" - "ldr r8, [%[a], #32]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[9] * A[39]\n\t" - "ldr r10, [%[a], #156]\n\t" - "ldr r8, [%[a], #36]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[10] * A[38]\n\t" - "ldr r10, [%[a], #152]\n\t" - "ldr r8, [%[a], #40]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[11] * A[37]\n\t" - "ldr r10, [%[a], #148]\n\t" - "ldr r8, [%[a], #44]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[12] * A[36]\n\t" - "ldr r10, [%[a], #144]\n\t" - "ldr r8, [%[a], #48]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[13] * A[35]\n\t" - "ldr r10, [%[a], #140]\n\t" - "ldr r8, [%[a], #52]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[14] * A[34]\n\t" - "ldr r10, [%[a], #136]\n\t" - "ldr r8, [%[a], #56]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[15] * A[33]\n\t" - "ldr r10, [%[a], #132]\n\t" - "ldr r8, [%[a], #60]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[16] * A[32]\n\t" - "ldr r10, [%[a], #128]\n\t" - "ldr r8, [%[a], #64]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[17] * A[31]\n\t" - "ldr r10, [%[a], #124]\n\t" - "ldr r8, [%[a], #68]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[18] * A[30]\n\t" - "ldr r10, [%[a], #120]\n\t" - "ldr r8, [%[a], #72]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[19] * A[29]\n\t" - "ldr r10, [%[a], #116]\n\t" - "ldr r8, [%[a], #76]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[20] * A[28]\n\t" - "ldr r10, [%[a], #112]\n\t" - "ldr r8, [%[a], #80]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[21] * A[27]\n\t" - "ldr r10, [%[a], #108]\n\t" - "ldr r8, [%[a], #84]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[22] * A[26]\n\t" - "ldr r10, [%[a], #104]\n\t" - "ldr r8, [%[a], #88]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[23] * A[25]\n\t" - "ldr r10, [%[a], #100]\n\t" - "ldr r8, [%[a], #92]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[24] * A[24]\n\t" - "ldr r10, [%[a], #96]\n\t" - "umull r8, r9, r10, r10\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r2, r2, r5\n\t" - "adcs r3, r3, r6\n\t" - "adc r4, r4, r7\n\t" - "str r2, [sp, #192]\n\t" - "# A[0] * A[49]\n\t" - "ldr r10, [%[a], #196]\n\t" - "ldr r8, [%[a], #0]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r2, #0\n\t" - "mov r7, #0\n\t" - "# A[1] * A[48]\n\t" - "ldr r10, [%[a], #192]\n\t" - "ldr r8, [%[a], #4]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[2] * A[47]\n\t" - "ldr r10, [%[a], #188]\n\t" - "ldr r8, [%[a], #8]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[3] * A[46]\n\t" - "ldr r10, [%[a], #184]\n\t" - "ldr r8, [%[a], #12]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[4] * A[45]\n\t" - "ldr r10, [%[a], #180]\n\t" - "ldr r8, [%[a], #16]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[5] * A[44]\n\t" - "ldr r10, [%[a], #176]\n\t" - "ldr r8, [%[a], #20]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[6] * A[43]\n\t" - "ldr r10, [%[a], #172]\n\t" - "ldr r8, [%[a], #24]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[7] * A[42]\n\t" - "ldr r10, [%[a], #168]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[8] * A[41]\n\t" - "ldr r10, [%[a], #164]\n\t" - "ldr r8, [%[a], #32]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[9] * A[40]\n\t" - "ldr r10, [%[a], #160]\n\t" - "ldr r8, [%[a], #36]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[10] * A[39]\n\t" - "ldr r10, [%[a], #156]\n\t" - "ldr r8, [%[a], #40]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[11] * A[38]\n\t" - "ldr r10, [%[a], #152]\n\t" - "ldr r8, [%[a], #44]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[12] * A[37]\n\t" - "ldr r10, [%[a], #148]\n\t" - "ldr r8, [%[a], #48]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[13] * A[36]\n\t" - "ldr r10, [%[a], #144]\n\t" - "ldr r8, [%[a], #52]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[14] * A[35]\n\t" - "ldr r10, [%[a], #140]\n\t" - "ldr r8, [%[a], #56]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[15] * A[34]\n\t" - "ldr r10, [%[a], #136]\n\t" - "ldr r8, [%[a], #60]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[16] * A[33]\n\t" - "ldr r10, [%[a], #132]\n\t" - "ldr r8, [%[a], #64]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[17] * A[32]\n\t" - "ldr r10, [%[a], #128]\n\t" - "ldr r8, [%[a], #68]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[18] * A[31]\n\t" - "ldr r10, [%[a], #124]\n\t" - "ldr r8, [%[a], #72]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[19] * A[30]\n\t" - "ldr r10, [%[a], #120]\n\t" - "ldr r8, [%[a], #76]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[20] * A[29]\n\t" - "ldr r10, [%[a], #116]\n\t" - "ldr r8, [%[a], #80]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[21] * A[28]\n\t" - "ldr r10, [%[a], #112]\n\t" - "ldr r8, [%[a], #84]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[22] * A[27]\n\t" - "ldr r10, [%[a], #108]\n\t" - "ldr r8, [%[a], #88]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[23] * A[26]\n\t" - "ldr r10, [%[a], #104]\n\t" - "ldr r8, [%[a], #92]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[24] * A[25]\n\t" - "ldr r10, [%[a], #100]\n\t" - "ldr r8, [%[a], #96]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r3, r3, r5\n\t" - "adcs r4, r4, r6\n\t" - "adc r2, r2, r7\n\t" - "str r3, [sp, #196]\n\t" - "# A[0] * A[50]\n\t" - "ldr r10, [%[a], #200]\n\t" - "ldr r8, [%[a], #0]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r3, #0\n\t" - "mov r7, #0\n\t" - "# A[1] * A[49]\n\t" - "ldr r10, [%[a], #196]\n\t" - "ldr r8, [%[a], #4]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[2] * A[48]\n\t" - "ldr r10, [%[a], #192]\n\t" - "ldr r8, [%[a], #8]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[3] * A[47]\n\t" - "ldr r10, [%[a], #188]\n\t" - "ldr r8, [%[a], #12]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[4] * A[46]\n\t" - "ldr r10, [%[a], #184]\n\t" - "ldr r8, [%[a], #16]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[5] * A[45]\n\t" - "ldr r10, [%[a], #180]\n\t" - "ldr r8, [%[a], #20]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[6] * A[44]\n\t" - "ldr r10, [%[a], #176]\n\t" - "ldr r8, [%[a], #24]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[7] * A[43]\n\t" - "ldr r10, [%[a], #172]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[8] * A[42]\n\t" - "ldr r10, [%[a], #168]\n\t" - "ldr r8, [%[a], #32]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[9] * A[41]\n\t" - "ldr r10, [%[a], #164]\n\t" - "ldr r8, [%[a], #36]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[10] * A[40]\n\t" - "ldr r10, [%[a], #160]\n\t" - "ldr r8, [%[a], #40]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[11] * A[39]\n\t" - "ldr r10, [%[a], #156]\n\t" - "ldr r8, [%[a], #44]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[12] * A[38]\n\t" - "ldr r10, [%[a], #152]\n\t" - "ldr r8, [%[a], #48]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[13] * A[37]\n\t" - "ldr r10, [%[a], #148]\n\t" - "ldr r8, [%[a], #52]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[14] * A[36]\n\t" - "ldr r10, [%[a], #144]\n\t" - "ldr r8, [%[a], #56]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[15] * A[35]\n\t" - "ldr r10, [%[a], #140]\n\t" - "ldr r8, [%[a], #60]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[16] * A[34]\n\t" - "ldr r10, [%[a], #136]\n\t" - "ldr r8, [%[a], #64]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[17] * A[33]\n\t" - "ldr r10, [%[a], #132]\n\t" - "ldr r8, [%[a], #68]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[18] * A[32]\n\t" - "ldr r10, [%[a], #128]\n\t" - "ldr r8, [%[a], #72]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[19] * A[31]\n\t" - "ldr r10, [%[a], #124]\n\t" - "ldr r8, [%[a], #76]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[20] * A[30]\n\t" - "ldr r10, [%[a], #120]\n\t" - "ldr r8, [%[a], #80]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[21] * A[29]\n\t" - "ldr r10, [%[a], #116]\n\t" - "ldr r8, [%[a], #84]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[22] * A[28]\n\t" - "ldr r10, [%[a], #112]\n\t" - "ldr r8, [%[a], #88]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[23] * A[27]\n\t" - "ldr r10, [%[a], #108]\n\t" - "ldr r8, [%[a], #92]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[24] * A[26]\n\t" - "ldr r10, [%[a], #104]\n\t" - "ldr r8, [%[a], #96]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[25] * A[25]\n\t" - "ldr r10, [%[a], #100]\n\t" - "umull r8, r9, r10, r10\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r4, r4, r5\n\t" - "adcs r2, r2, r6\n\t" - "adc r3, r3, r7\n\t" - "str r4, [sp, #200]\n\t" - "# A[0] * A[51]\n\t" - "ldr r10, [%[a], #204]\n\t" - "ldr r8, [%[a], #0]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r4, #0\n\t" - "mov r7, #0\n\t" - "# A[1] * A[50]\n\t" - "ldr r10, [%[a], #200]\n\t" - "ldr r8, [%[a], #4]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[2] * A[49]\n\t" - "ldr r10, [%[a], #196]\n\t" - "ldr r8, [%[a], #8]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[3] * A[48]\n\t" - "ldr r10, [%[a], #192]\n\t" - "ldr r8, [%[a], #12]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[4] * A[47]\n\t" - "ldr r10, [%[a], #188]\n\t" - "ldr r8, [%[a], #16]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[5] * A[46]\n\t" - "ldr r10, [%[a], #184]\n\t" - "ldr r8, [%[a], #20]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[6] * A[45]\n\t" - "ldr r10, [%[a], #180]\n\t" - "ldr r8, [%[a], #24]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[7] * A[44]\n\t" - "ldr r10, [%[a], #176]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[8] * A[43]\n\t" - "ldr r10, [%[a], #172]\n\t" - "ldr r8, [%[a], #32]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[9] * A[42]\n\t" - "ldr r10, [%[a], #168]\n\t" - "ldr r8, [%[a], #36]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[10] * A[41]\n\t" - "ldr r10, [%[a], #164]\n\t" - "ldr r8, [%[a], #40]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[11] * A[40]\n\t" - "ldr r10, [%[a], #160]\n\t" - "ldr r8, [%[a], #44]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[12] * A[39]\n\t" - "ldr r10, [%[a], #156]\n\t" - "ldr r8, [%[a], #48]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[13] * A[38]\n\t" - "ldr r10, [%[a], #152]\n\t" - "ldr r8, [%[a], #52]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[14] * A[37]\n\t" - "ldr r10, [%[a], #148]\n\t" - "ldr r8, [%[a], #56]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[15] * A[36]\n\t" - "ldr r10, [%[a], #144]\n\t" - "ldr r8, [%[a], #60]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[16] * A[35]\n\t" - "ldr r10, [%[a], #140]\n\t" - "ldr r8, [%[a], #64]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[17] * A[34]\n\t" - "ldr r10, [%[a], #136]\n\t" - "ldr r8, [%[a], #68]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[18] * A[33]\n\t" - "ldr r10, [%[a], #132]\n\t" - "ldr r8, [%[a], #72]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[19] * A[32]\n\t" - "ldr r10, [%[a], #128]\n\t" - "ldr r8, [%[a], #76]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[20] * A[31]\n\t" - "ldr r10, [%[a], #124]\n\t" - "ldr r8, [%[a], #80]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[21] * A[30]\n\t" - "ldr r10, [%[a], #120]\n\t" - "ldr r8, [%[a], #84]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[22] * A[29]\n\t" - "ldr r10, [%[a], #116]\n\t" - "ldr r8, [%[a], #88]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[23] * A[28]\n\t" - "ldr r10, [%[a], #112]\n\t" - "ldr r8, [%[a], #92]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[24] * A[27]\n\t" - "ldr r10, [%[a], #108]\n\t" - "ldr r8, [%[a], #96]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[25] * A[26]\n\t" - "ldr r10, [%[a], #104]\n\t" - "ldr r8, [%[a], #100]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r2, r2, r5\n\t" - "adcs r3, r3, r6\n\t" - "adc r4, r4, r7\n\t" - "str r2, [sp, #204]\n\t" - "# A[0] * A[52]\n\t" - "ldr r10, [%[a], #208]\n\t" - "ldr r8, [%[a], #0]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r2, #0\n\t" - "mov r7, #0\n\t" - "# A[1] * A[51]\n\t" - "ldr r10, [%[a], #204]\n\t" - "ldr r8, [%[a], #4]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[2] * A[50]\n\t" - "ldr r10, [%[a], #200]\n\t" - "ldr r8, [%[a], #8]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[3] * A[49]\n\t" - "ldr r10, [%[a], #196]\n\t" - "ldr r8, [%[a], #12]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[4] * A[48]\n\t" - "ldr r10, [%[a], #192]\n\t" - "ldr r8, [%[a], #16]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[5] * A[47]\n\t" - "ldr r10, [%[a], #188]\n\t" - "ldr r8, [%[a], #20]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[6] * A[46]\n\t" - "ldr r10, [%[a], #184]\n\t" - "ldr r8, [%[a], #24]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[7] * A[45]\n\t" - "ldr r10, [%[a], #180]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[8] * A[44]\n\t" - "ldr r10, [%[a], #176]\n\t" - "ldr r8, [%[a], #32]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[9] * A[43]\n\t" - "ldr r10, [%[a], #172]\n\t" - "ldr r8, [%[a], #36]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[10] * A[42]\n\t" - "ldr r10, [%[a], #168]\n\t" - "ldr r8, [%[a], #40]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[11] * A[41]\n\t" - "ldr r10, [%[a], #164]\n\t" - "ldr r8, [%[a], #44]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[12] * A[40]\n\t" - "ldr r10, [%[a], #160]\n\t" - "ldr r8, [%[a], #48]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[13] * A[39]\n\t" - "ldr r10, [%[a], #156]\n\t" - "ldr r8, [%[a], #52]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[14] * A[38]\n\t" - "ldr r10, [%[a], #152]\n\t" - "ldr r8, [%[a], #56]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[15] * A[37]\n\t" - "ldr r10, [%[a], #148]\n\t" - "ldr r8, [%[a], #60]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[16] * A[36]\n\t" - "ldr r10, [%[a], #144]\n\t" - "ldr r8, [%[a], #64]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[17] * A[35]\n\t" - "ldr r10, [%[a], #140]\n\t" - "ldr r8, [%[a], #68]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[18] * A[34]\n\t" - "ldr r10, [%[a], #136]\n\t" - "ldr r8, [%[a], #72]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[19] * A[33]\n\t" - "ldr r10, [%[a], #132]\n\t" - "ldr r8, [%[a], #76]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[20] * A[32]\n\t" - "ldr r10, [%[a], #128]\n\t" - "ldr r8, [%[a], #80]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[21] * A[31]\n\t" - "ldr r10, [%[a], #124]\n\t" - "ldr r8, [%[a], #84]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[22] * A[30]\n\t" - "ldr r10, [%[a], #120]\n\t" - "ldr r8, [%[a], #88]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[23] * A[29]\n\t" - "ldr r10, [%[a], #116]\n\t" - "ldr r8, [%[a], #92]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[24] * A[28]\n\t" - "ldr r10, [%[a], #112]\n\t" - "ldr r8, [%[a], #96]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[25] * A[27]\n\t" - "ldr r10, [%[a], #108]\n\t" - "ldr r8, [%[a], #100]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[26] * A[26]\n\t" - "ldr r10, [%[a], #104]\n\t" - "umull r8, r9, r10, r10\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r3, r3, r5\n\t" - "adcs r4, r4, r6\n\t" - "adc r2, r2, r7\n\t" - "str r3, [sp, #208]\n\t" - "# A[0] * A[53]\n\t" - "ldr r10, [%[a], #212]\n\t" - "ldr r8, [%[a], #0]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r3, #0\n\t" - "mov r7, #0\n\t" - "# A[1] * A[52]\n\t" - "ldr r10, [%[a], #208]\n\t" - "ldr r8, [%[a], #4]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[2] * A[51]\n\t" - "ldr r10, [%[a], #204]\n\t" - "ldr r8, [%[a], #8]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[3] * A[50]\n\t" - "ldr r10, [%[a], #200]\n\t" - "ldr r8, [%[a], #12]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[4] * A[49]\n\t" - "ldr r10, [%[a], #196]\n\t" - "ldr r8, [%[a], #16]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[5] * A[48]\n\t" - "ldr r10, [%[a], #192]\n\t" - "ldr r8, [%[a], #20]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[6] * A[47]\n\t" - "ldr r10, [%[a], #188]\n\t" - "ldr r8, [%[a], #24]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[7] * A[46]\n\t" - "ldr r10, [%[a], #184]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[8] * A[45]\n\t" - "ldr r10, [%[a], #180]\n\t" - "ldr r8, [%[a], #32]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[9] * A[44]\n\t" - "ldr r10, [%[a], #176]\n\t" - "ldr r8, [%[a], #36]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[10] * A[43]\n\t" - "ldr r10, [%[a], #172]\n\t" - "ldr r8, [%[a], #40]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[11] * A[42]\n\t" - "ldr r10, [%[a], #168]\n\t" - "ldr r8, [%[a], #44]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[12] * A[41]\n\t" - "ldr r10, [%[a], #164]\n\t" - "ldr r8, [%[a], #48]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[13] * A[40]\n\t" - "ldr r10, [%[a], #160]\n\t" - "ldr r8, [%[a], #52]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[14] * A[39]\n\t" - "ldr r10, [%[a], #156]\n\t" - "ldr r8, [%[a], #56]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[15] * A[38]\n\t" - "ldr r10, [%[a], #152]\n\t" - "ldr r8, [%[a], #60]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[16] * A[37]\n\t" - "ldr r10, [%[a], #148]\n\t" - "ldr r8, [%[a], #64]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[17] * A[36]\n\t" - "ldr r10, [%[a], #144]\n\t" - "ldr r8, [%[a], #68]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[18] * A[35]\n\t" - "ldr r10, [%[a], #140]\n\t" - "ldr r8, [%[a], #72]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[19] * A[34]\n\t" - "ldr r10, [%[a], #136]\n\t" - "ldr r8, [%[a], #76]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[20] * A[33]\n\t" - "ldr r10, [%[a], #132]\n\t" - "ldr r8, [%[a], #80]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[21] * A[32]\n\t" - "ldr r10, [%[a], #128]\n\t" - "ldr r8, [%[a], #84]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[22] * A[31]\n\t" - "ldr r10, [%[a], #124]\n\t" - "ldr r8, [%[a], #88]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[23] * A[30]\n\t" - "ldr r10, [%[a], #120]\n\t" - "ldr r8, [%[a], #92]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[24] * A[29]\n\t" - "ldr r10, [%[a], #116]\n\t" - "ldr r8, [%[a], #96]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[25] * A[28]\n\t" - "ldr r10, [%[a], #112]\n\t" - "ldr r8, [%[a], #100]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[26] * A[27]\n\t" - "ldr r10, [%[a], #108]\n\t" - "ldr r8, [%[a], #104]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r4, r4, r5\n\t" - "adcs r2, r2, r6\n\t" - "adc r3, r3, r7\n\t" - "str r4, [sp, #212]\n\t" - "# A[0] * A[54]\n\t" - "ldr r10, [%[a], #216]\n\t" - "ldr r8, [%[a], #0]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r4, #0\n\t" - "mov r7, #0\n\t" - "# A[1] * A[53]\n\t" - "ldr r10, [%[a], #212]\n\t" - "ldr r8, [%[a], #4]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[2] * A[52]\n\t" - "ldr r10, [%[a], #208]\n\t" - "ldr r8, [%[a], #8]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[3] * A[51]\n\t" - "ldr r10, [%[a], #204]\n\t" - "ldr r8, [%[a], #12]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[4] * A[50]\n\t" - "ldr r10, [%[a], #200]\n\t" - "ldr r8, [%[a], #16]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[5] * A[49]\n\t" - "ldr r10, [%[a], #196]\n\t" - "ldr r8, [%[a], #20]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[6] * A[48]\n\t" - "ldr r10, [%[a], #192]\n\t" - "ldr r8, [%[a], #24]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[7] * A[47]\n\t" - "ldr r10, [%[a], #188]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[8] * A[46]\n\t" - "ldr r10, [%[a], #184]\n\t" - "ldr r8, [%[a], #32]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[9] * A[45]\n\t" - "ldr r10, [%[a], #180]\n\t" - "ldr r8, [%[a], #36]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[10] * A[44]\n\t" - "ldr r10, [%[a], #176]\n\t" - "ldr r8, [%[a], #40]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[11] * A[43]\n\t" - "ldr r10, [%[a], #172]\n\t" - "ldr r8, [%[a], #44]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[12] * A[42]\n\t" - "ldr r10, [%[a], #168]\n\t" - "ldr r8, [%[a], #48]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[13] * A[41]\n\t" - "ldr r10, [%[a], #164]\n\t" - "ldr r8, [%[a], #52]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[14] * A[40]\n\t" - "ldr r10, [%[a], #160]\n\t" - "ldr r8, [%[a], #56]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[15] * A[39]\n\t" - "ldr r10, [%[a], #156]\n\t" - "ldr r8, [%[a], #60]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[16] * A[38]\n\t" - "ldr r10, [%[a], #152]\n\t" - "ldr r8, [%[a], #64]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[17] * A[37]\n\t" - "ldr r10, [%[a], #148]\n\t" - "ldr r8, [%[a], #68]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[18] * A[36]\n\t" - "ldr r10, [%[a], #144]\n\t" - "ldr r8, [%[a], #72]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[19] * A[35]\n\t" - "ldr r10, [%[a], #140]\n\t" - "ldr r8, [%[a], #76]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[20] * A[34]\n\t" - "ldr r10, [%[a], #136]\n\t" - "ldr r8, [%[a], #80]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[21] * A[33]\n\t" - "ldr r10, [%[a], #132]\n\t" - "ldr r8, [%[a], #84]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[22] * A[32]\n\t" - "ldr r10, [%[a], #128]\n\t" - "ldr r8, [%[a], #88]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[23] * A[31]\n\t" - "ldr r10, [%[a], #124]\n\t" - "ldr r8, [%[a], #92]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[24] * A[30]\n\t" - "ldr r10, [%[a], #120]\n\t" - "ldr r8, [%[a], #96]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[25] * A[29]\n\t" - "ldr r10, [%[a], #116]\n\t" - "ldr r8, [%[a], #100]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[26] * A[28]\n\t" - "ldr r10, [%[a], #112]\n\t" - "ldr r8, [%[a], #104]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[27] * A[27]\n\t" - "ldr r10, [%[a], #108]\n\t" - "umull r8, r9, r10, r10\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r2, r2, r5\n\t" - "adcs r3, r3, r6\n\t" - "adc r4, r4, r7\n\t" - "str r2, [sp, #216]\n\t" - "# A[0] * A[55]\n\t" - "ldr r10, [%[a], #220]\n\t" - "ldr r8, [%[a], #0]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r2, #0\n\t" - "mov r7, #0\n\t" - "# A[1] * A[54]\n\t" - "ldr r10, [%[a], #216]\n\t" - "ldr r8, [%[a], #4]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[2] * A[53]\n\t" - "ldr r10, [%[a], #212]\n\t" - "ldr r8, [%[a], #8]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[3] * A[52]\n\t" - "ldr r10, [%[a], #208]\n\t" - "ldr r8, [%[a], #12]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[4] * A[51]\n\t" - "ldr r10, [%[a], #204]\n\t" - "ldr r8, [%[a], #16]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[5] * A[50]\n\t" - "ldr r10, [%[a], #200]\n\t" - "ldr r8, [%[a], #20]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[6] * A[49]\n\t" - "ldr r10, [%[a], #196]\n\t" - "ldr r8, [%[a], #24]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[7] * A[48]\n\t" - "ldr r10, [%[a], #192]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[8] * A[47]\n\t" - "ldr r10, [%[a], #188]\n\t" - "ldr r8, [%[a], #32]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[9] * A[46]\n\t" - "ldr r10, [%[a], #184]\n\t" - "ldr r8, [%[a], #36]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[10] * A[45]\n\t" - "ldr r10, [%[a], #180]\n\t" - "ldr r8, [%[a], #40]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[11] * A[44]\n\t" - "ldr r10, [%[a], #176]\n\t" - "ldr r8, [%[a], #44]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[12] * A[43]\n\t" - "ldr r10, [%[a], #172]\n\t" - "ldr r8, [%[a], #48]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[13] * A[42]\n\t" - "ldr r10, [%[a], #168]\n\t" - "ldr r8, [%[a], #52]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[14] * A[41]\n\t" - "ldr r10, [%[a], #164]\n\t" - "ldr r8, [%[a], #56]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[15] * A[40]\n\t" - "ldr r10, [%[a], #160]\n\t" - "ldr r8, [%[a], #60]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[16] * A[39]\n\t" - "ldr r10, [%[a], #156]\n\t" - "ldr r8, [%[a], #64]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[17] * A[38]\n\t" - "ldr r10, [%[a], #152]\n\t" - "ldr r8, [%[a], #68]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[18] * A[37]\n\t" - "ldr r10, [%[a], #148]\n\t" - "ldr r8, [%[a], #72]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[19] * A[36]\n\t" - "ldr r10, [%[a], #144]\n\t" - "ldr r8, [%[a], #76]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[20] * A[35]\n\t" - "ldr r10, [%[a], #140]\n\t" - "ldr r8, [%[a], #80]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[21] * A[34]\n\t" - "ldr r10, [%[a], #136]\n\t" - "ldr r8, [%[a], #84]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[22] * A[33]\n\t" - "ldr r10, [%[a], #132]\n\t" - "ldr r8, [%[a], #88]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[23] * A[32]\n\t" - "ldr r10, [%[a], #128]\n\t" - "ldr r8, [%[a], #92]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[24] * A[31]\n\t" - "ldr r10, [%[a], #124]\n\t" - "ldr r8, [%[a], #96]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[25] * A[30]\n\t" - "ldr r10, [%[a], #120]\n\t" - "ldr r8, [%[a], #100]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[26] * A[29]\n\t" - "ldr r10, [%[a], #116]\n\t" - "ldr r8, [%[a], #104]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[27] * A[28]\n\t" - "ldr r10, [%[a], #112]\n\t" - "ldr r8, [%[a], #108]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r3, r3, r5\n\t" - "adcs r4, r4, r6\n\t" - "adc r2, r2, r7\n\t" - "str r3, [sp, #220]\n\t" - "# A[0] * A[56]\n\t" - "ldr r10, [%[a], #224]\n\t" - "ldr r8, [%[a], #0]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r3, #0\n\t" - "mov r7, #0\n\t" - "# A[1] * A[55]\n\t" - "ldr r10, [%[a], #220]\n\t" - "ldr r8, [%[a], #4]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[2] * A[54]\n\t" - "ldr r10, [%[a], #216]\n\t" - "ldr r8, [%[a], #8]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[3] * A[53]\n\t" - "ldr r10, [%[a], #212]\n\t" - "ldr r8, [%[a], #12]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[4] * A[52]\n\t" - "ldr r10, [%[a], #208]\n\t" - "ldr r8, [%[a], #16]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[5] * A[51]\n\t" - "ldr r10, [%[a], #204]\n\t" - "ldr r8, [%[a], #20]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[6] * A[50]\n\t" - "ldr r10, [%[a], #200]\n\t" - "ldr r8, [%[a], #24]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[7] * A[49]\n\t" - "ldr r10, [%[a], #196]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[8] * A[48]\n\t" - "ldr r10, [%[a], #192]\n\t" - "ldr r8, [%[a], #32]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[9] * A[47]\n\t" - "ldr r10, [%[a], #188]\n\t" - "ldr r8, [%[a], #36]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[10] * A[46]\n\t" - "ldr r10, [%[a], #184]\n\t" - "ldr r8, [%[a], #40]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[11] * A[45]\n\t" - "ldr r10, [%[a], #180]\n\t" - "ldr r8, [%[a], #44]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[12] * A[44]\n\t" - "ldr r10, [%[a], #176]\n\t" - "ldr r8, [%[a], #48]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[13] * A[43]\n\t" - "ldr r10, [%[a], #172]\n\t" - "ldr r8, [%[a], #52]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[14] * A[42]\n\t" - "ldr r10, [%[a], #168]\n\t" - "ldr r8, [%[a], #56]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[15] * A[41]\n\t" - "ldr r10, [%[a], #164]\n\t" - "ldr r8, [%[a], #60]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[16] * A[40]\n\t" - "ldr r10, [%[a], #160]\n\t" - "ldr r8, [%[a], #64]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[17] * A[39]\n\t" - "ldr r10, [%[a], #156]\n\t" - "ldr r8, [%[a], #68]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[18] * A[38]\n\t" - "ldr r10, [%[a], #152]\n\t" - "ldr r8, [%[a], #72]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[19] * A[37]\n\t" - "ldr r10, [%[a], #148]\n\t" - "ldr r8, [%[a], #76]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[20] * A[36]\n\t" - "ldr r10, [%[a], #144]\n\t" - "ldr r8, [%[a], #80]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[21] * A[35]\n\t" - "ldr r10, [%[a], #140]\n\t" - "ldr r8, [%[a], #84]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[22] * A[34]\n\t" - "ldr r10, [%[a], #136]\n\t" - "ldr r8, [%[a], #88]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[23] * A[33]\n\t" - "ldr r10, [%[a], #132]\n\t" - "ldr r8, [%[a], #92]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[24] * A[32]\n\t" - "ldr r10, [%[a], #128]\n\t" - "ldr r8, [%[a], #96]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[25] * A[31]\n\t" - "ldr r10, [%[a], #124]\n\t" - "ldr r8, [%[a], #100]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[26] * A[30]\n\t" - "ldr r10, [%[a], #120]\n\t" - "ldr r8, [%[a], #104]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[27] * A[29]\n\t" - "ldr r10, [%[a], #116]\n\t" - "ldr r8, [%[a], #108]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[28] * A[28]\n\t" - "ldr r10, [%[a], #112]\n\t" - "umull r8, r9, r10, r10\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r4, r4, r5\n\t" - "adcs r2, r2, r6\n\t" - "adc r3, r3, r7\n\t" - "str r4, [sp, #224]\n\t" - "# A[0] * A[57]\n\t" - "ldr r10, [%[a], #228]\n\t" - "ldr r8, [%[a], #0]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r4, #0\n\t" - "mov r7, #0\n\t" - "# A[1] * A[56]\n\t" - "ldr r10, [%[a], #224]\n\t" - "ldr r8, [%[a], #4]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[2] * A[55]\n\t" - "ldr r10, [%[a], #220]\n\t" - "ldr r8, [%[a], #8]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[3] * A[54]\n\t" - "ldr r10, [%[a], #216]\n\t" - "ldr r8, [%[a], #12]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[4] * A[53]\n\t" - "ldr r10, [%[a], #212]\n\t" - "ldr r8, [%[a], #16]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[5] * A[52]\n\t" - "ldr r10, [%[a], #208]\n\t" - "ldr r8, [%[a], #20]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[6] * A[51]\n\t" - "ldr r10, [%[a], #204]\n\t" - "ldr r8, [%[a], #24]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[7] * A[50]\n\t" - "ldr r10, [%[a], #200]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[8] * A[49]\n\t" - "ldr r10, [%[a], #196]\n\t" - "ldr r8, [%[a], #32]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[9] * A[48]\n\t" - "ldr r10, [%[a], #192]\n\t" - "ldr r8, [%[a], #36]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[10] * A[47]\n\t" - "ldr r10, [%[a], #188]\n\t" - "ldr r8, [%[a], #40]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[11] * A[46]\n\t" - "ldr r10, [%[a], #184]\n\t" - "ldr r8, [%[a], #44]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[12] * A[45]\n\t" - "ldr r10, [%[a], #180]\n\t" - "ldr r8, [%[a], #48]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[13] * A[44]\n\t" - "ldr r10, [%[a], #176]\n\t" - "ldr r8, [%[a], #52]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[14] * A[43]\n\t" - "ldr r10, [%[a], #172]\n\t" - "ldr r8, [%[a], #56]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[15] * A[42]\n\t" - "ldr r10, [%[a], #168]\n\t" - "ldr r8, [%[a], #60]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[16] * A[41]\n\t" - "ldr r10, [%[a], #164]\n\t" - "ldr r8, [%[a], #64]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[17] * A[40]\n\t" - "ldr r10, [%[a], #160]\n\t" - "ldr r8, [%[a], #68]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[18] * A[39]\n\t" - "ldr r10, [%[a], #156]\n\t" - "ldr r8, [%[a], #72]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[19] * A[38]\n\t" - "ldr r10, [%[a], #152]\n\t" - "ldr r8, [%[a], #76]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[20] * A[37]\n\t" - "ldr r10, [%[a], #148]\n\t" - "ldr r8, [%[a], #80]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[21] * A[36]\n\t" - "ldr r10, [%[a], #144]\n\t" - "ldr r8, [%[a], #84]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[22] * A[35]\n\t" - "ldr r10, [%[a], #140]\n\t" - "ldr r8, [%[a], #88]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[23] * A[34]\n\t" - "ldr r10, [%[a], #136]\n\t" - "ldr r8, [%[a], #92]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[24] * A[33]\n\t" - "ldr r10, [%[a], #132]\n\t" - "ldr r8, [%[a], #96]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[25] * A[32]\n\t" - "ldr r10, [%[a], #128]\n\t" - "ldr r8, [%[a], #100]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[26] * A[31]\n\t" - "ldr r10, [%[a], #124]\n\t" - "ldr r8, [%[a], #104]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[27] * A[30]\n\t" - "ldr r10, [%[a], #120]\n\t" - "ldr r8, [%[a], #108]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[28] * A[29]\n\t" - "ldr r10, [%[a], #116]\n\t" - "ldr r8, [%[a], #112]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r2, r2, r5\n\t" - "adcs r3, r3, r6\n\t" - "adc r4, r4, r7\n\t" - "str r2, [sp, #228]\n\t" - "# A[0] * A[58]\n\t" - "ldr r10, [%[a], #232]\n\t" - "ldr r8, [%[a], #0]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r2, #0\n\t" - "mov r7, #0\n\t" - "# A[1] * A[57]\n\t" - "ldr r10, [%[a], #228]\n\t" - "ldr r8, [%[a], #4]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[2] * A[56]\n\t" - "ldr r10, [%[a], #224]\n\t" - "ldr r8, [%[a], #8]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[3] * A[55]\n\t" - "ldr r10, [%[a], #220]\n\t" - "ldr r8, [%[a], #12]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[4] * A[54]\n\t" - "ldr r10, [%[a], #216]\n\t" - "ldr r8, [%[a], #16]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[5] * A[53]\n\t" - "ldr r10, [%[a], #212]\n\t" - "ldr r8, [%[a], #20]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[6] * A[52]\n\t" - "ldr r10, [%[a], #208]\n\t" - "ldr r8, [%[a], #24]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[7] * A[51]\n\t" - "ldr r10, [%[a], #204]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[8] * A[50]\n\t" - "ldr r10, [%[a], #200]\n\t" - "ldr r8, [%[a], #32]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[9] * A[49]\n\t" - "ldr r10, [%[a], #196]\n\t" - "ldr r8, [%[a], #36]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[10] * A[48]\n\t" - "ldr r10, [%[a], #192]\n\t" - "ldr r8, [%[a], #40]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[11] * A[47]\n\t" - "ldr r10, [%[a], #188]\n\t" - "ldr r8, [%[a], #44]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[12] * A[46]\n\t" - "ldr r10, [%[a], #184]\n\t" - "ldr r8, [%[a], #48]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[13] * A[45]\n\t" - "ldr r10, [%[a], #180]\n\t" - "ldr r8, [%[a], #52]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[14] * A[44]\n\t" - "ldr r10, [%[a], #176]\n\t" - "ldr r8, [%[a], #56]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[15] * A[43]\n\t" - "ldr r10, [%[a], #172]\n\t" - "ldr r8, [%[a], #60]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[16] * A[42]\n\t" - "ldr r10, [%[a], #168]\n\t" - "ldr r8, [%[a], #64]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[17] * A[41]\n\t" - "ldr r10, [%[a], #164]\n\t" - "ldr r8, [%[a], #68]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[18] * A[40]\n\t" - "ldr r10, [%[a], #160]\n\t" - "ldr r8, [%[a], #72]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[19] * A[39]\n\t" - "ldr r10, [%[a], #156]\n\t" - "ldr r8, [%[a], #76]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[20] * A[38]\n\t" - "ldr r10, [%[a], #152]\n\t" - "ldr r8, [%[a], #80]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[21] * A[37]\n\t" - "ldr r10, [%[a], #148]\n\t" - "ldr r8, [%[a], #84]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[22] * A[36]\n\t" - "ldr r10, [%[a], #144]\n\t" - "ldr r8, [%[a], #88]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[23] * A[35]\n\t" - "ldr r10, [%[a], #140]\n\t" - "ldr r8, [%[a], #92]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[24] * A[34]\n\t" - "ldr r10, [%[a], #136]\n\t" - "ldr r8, [%[a], #96]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[25] * A[33]\n\t" - "ldr r10, [%[a], #132]\n\t" - "ldr r8, [%[a], #100]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[26] * A[32]\n\t" - "ldr r10, [%[a], #128]\n\t" - "ldr r8, [%[a], #104]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[27] * A[31]\n\t" - "ldr r10, [%[a], #124]\n\t" - "ldr r8, [%[a], #108]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[28] * A[30]\n\t" - "ldr r10, [%[a], #120]\n\t" - "ldr r8, [%[a], #112]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[29] * A[29]\n\t" - "ldr r10, [%[a], #116]\n\t" - "umull r8, r9, r10, r10\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r3, r3, r5\n\t" - "adcs r4, r4, r6\n\t" - "adc r2, r2, r7\n\t" - "str r3, [sp, #232]\n\t" - "# A[0] * A[59]\n\t" - "ldr r10, [%[a], #236]\n\t" - "ldr r8, [%[a], #0]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r3, #0\n\t" - "mov r7, #0\n\t" - "# A[1] * A[58]\n\t" - "ldr r10, [%[a], #232]\n\t" - "ldr r8, [%[a], #4]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[2] * A[57]\n\t" - "ldr r10, [%[a], #228]\n\t" - "ldr r8, [%[a], #8]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[3] * A[56]\n\t" - "ldr r10, [%[a], #224]\n\t" - "ldr r8, [%[a], #12]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[4] * A[55]\n\t" - "ldr r10, [%[a], #220]\n\t" - "ldr r8, [%[a], #16]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[5] * A[54]\n\t" - "ldr r10, [%[a], #216]\n\t" - "ldr r8, [%[a], #20]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[6] * A[53]\n\t" - "ldr r10, [%[a], #212]\n\t" - "ldr r8, [%[a], #24]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[7] * A[52]\n\t" - "ldr r10, [%[a], #208]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[8] * A[51]\n\t" - "ldr r10, [%[a], #204]\n\t" - "ldr r8, [%[a], #32]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[9] * A[50]\n\t" - "ldr r10, [%[a], #200]\n\t" - "ldr r8, [%[a], #36]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[10] * A[49]\n\t" - "ldr r10, [%[a], #196]\n\t" - "ldr r8, [%[a], #40]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[11] * A[48]\n\t" - "ldr r10, [%[a], #192]\n\t" - "ldr r8, [%[a], #44]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[12] * A[47]\n\t" - "ldr r10, [%[a], #188]\n\t" - "ldr r8, [%[a], #48]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[13] * A[46]\n\t" - "ldr r10, [%[a], #184]\n\t" - "ldr r8, [%[a], #52]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[14] * A[45]\n\t" - "ldr r10, [%[a], #180]\n\t" - "ldr r8, [%[a], #56]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[15] * A[44]\n\t" - "ldr r10, [%[a], #176]\n\t" - "ldr r8, [%[a], #60]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[16] * A[43]\n\t" - "ldr r10, [%[a], #172]\n\t" - "ldr r8, [%[a], #64]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[17] * A[42]\n\t" - "ldr r10, [%[a], #168]\n\t" - "ldr r8, [%[a], #68]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[18] * A[41]\n\t" - "ldr r10, [%[a], #164]\n\t" - "ldr r8, [%[a], #72]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[19] * A[40]\n\t" - "ldr r10, [%[a], #160]\n\t" - "ldr r8, [%[a], #76]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[20] * A[39]\n\t" - "ldr r10, [%[a], #156]\n\t" - "ldr r8, [%[a], #80]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[21] * A[38]\n\t" - "ldr r10, [%[a], #152]\n\t" - "ldr r8, [%[a], #84]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[22] * A[37]\n\t" - "ldr r10, [%[a], #148]\n\t" - "ldr r8, [%[a], #88]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[23] * A[36]\n\t" - "ldr r10, [%[a], #144]\n\t" - "ldr r8, [%[a], #92]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[24] * A[35]\n\t" - "ldr r10, [%[a], #140]\n\t" - "ldr r8, [%[a], #96]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[25] * A[34]\n\t" - "ldr r10, [%[a], #136]\n\t" - "ldr r8, [%[a], #100]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[26] * A[33]\n\t" - "ldr r10, [%[a], #132]\n\t" - "ldr r8, [%[a], #104]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[27] * A[32]\n\t" - "ldr r10, [%[a], #128]\n\t" - "ldr r8, [%[a], #108]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[28] * A[31]\n\t" - "ldr r10, [%[a], #124]\n\t" - "ldr r8, [%[a], #112]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[29] * A[30]\n\t" - "ldr r10, [%[a], #120]\n\t" - "ldr r8, [%[a], #116]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r4, r4, r5\n\t" - "adcs r2, r2, r6\n\t" - "adc r3, r3, r7\n\t" - "str r4, [sp, #236]\n\t" - "# A[0] * A[60]\n\t" - "ldr r10, [%[a], #240]\n\t" - "ldr r8, [%[a], #0]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r4, #0\n\t" - "mov r7, #0\n\t" - "# A[1] * A[59]\n\t" - "ldr r10, [%[a], #236]\n\t" - "ldr r8, [%[a], #4]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[2] * A[58]\n\t" - "ldr r10, [%[a], #232]\n\t" - "ldr r8, [%[a], #8]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[3] * A[57]\n\t" - "ldr r10, [%[a], #228]\n\t" - "ldr r8, [%[a], #12]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[4] * A[56]\n\t" - "ldr r10, [%[a], #224]\n\t" - "ldr r8, [%[a], #16]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[5] * A[55]\n\t" - "ldr r10, [%[a], #220]\n\t" - "ldr r8, [%[a], #20]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[6] * A[54]\n\t" - "ldr r10, [%[a], #216]\n\t" - "ldr r8, [%[a], #24]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[7] * A[53]\n\t" - "ldr r10, [%[a], #212]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[8] * A[52]\n\t" - "ldr r10, [%[a], #208]\n\t" - "ldr r8, [%[a], #32]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[9] * A[51]\n\t" - "ldr r10, [%[a], #204]\n\t" - "ldr r8, [%[a], #36]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[10] * A[50]\n\t" - "ldr r10, [%[a], #200]\n\t" - "ldr r8, [%[a], #40]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[11] * A[49]\n\t" - "ldr r10, [%[a], #196]\n\t" - "ldr r8, [%[a], #44]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[12] * A[48]\n\t" - "ldr r10, [%[a], #192]\n\t" - "ldr r8, [%[a], #48]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[13] * A[47]\n\t" - "ldr r10, [%[a], #188]\n\t" - "ldr r8, [%[a], #52]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[14] * A[46]\n\t" - "ldr r10, [%[a], #184]\n\t" - "ldr r8, [%[a], #56]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[15] * A[45]\n\t" - "ldr r10, [%[a], #180]\n\t" - "ldr r8, [%[a], #60]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[16] * A[44]\n\t" - "ldr r10, [%[a], #176]\n\t" - "ldr r8, [%[a], #64]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[17] * A[43]\n\t" - "ldr r10, [%[a], #172]\n\t" - "ldr r8, [%[a], #68]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[18] * A[42]\n\t" - "ldr r10, [%[a], #168]\n\t" - "ldr r8, [%[a], #72]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[19] * A[41]\n\t" - "ldr r10, [%[a], #164]\n\t" - "ldr r8, [%[a], #76]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[20] * A[40]\n\t" - "ldr r10, [%[a], #160]\n\t" - "ldr r8, [%[a], #80]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[21] * A[39]\n\t" - "ldr r10, [%[a], #156]\n\t" - "ldr r8, [%[a], #84]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[22] * A[38]\n\t" - "ldr r10, [%[a], #152]\n\t" - "ldr r8, [%[a], #88]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[23] * A[37]\n\t" - "ldr r10, [%[a], #148]\n\t" - "ldr r8, [%[a], #92]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[24] * A[36]\n\t" - "ldr r10, [%[a], #144]\n\t" - "ldr r8, [%[a], #96]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[25] * A[35]\n\t" - "ldr r10, [%[a], #140]\n\t" - "ldr r8, [%[a], #100]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[26] * A[34]\n\t" - "ldr r10, [%[a], #136]\n\t" - "ldr r8, [%[a], #104]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[27] * A[33]\n\t" - "ldr r10, [%[a], #132]\n\t" - "ldr r8, [%[a], #108]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[28] * A[32]\n\t" - "ldr r10, [%[a], #128]\n\t" - "ldr r8, [%[a], #112]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[29] * A[31]\n\t" - "ldr r10, [%[a], #124]\n\t" - "ldr r8, [%[a], #116]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[30] * A[30]\n\t" - "ldr r10, [%[a], #120]\n\t" - "umull r8, r9, r10, r10\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r2, r2, r5\n\t" - "adcs r3, r3, r6\n\t" - "adc r4, r4, r7\n\t" - "str r2, [sp, #240]\n\t" - "# A[0] * A[61]\n\t" - "ldr r10, [%[a], #244]\n\t" - "ldr r8, [%[a], #0]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r2, #0\n\t" - "mov r7, #0\n\t" - "# A[1] * A[60]\n\t" - "ldr r10, [%[a], #240]\n\t" - "ldr r8, [%[a], #4]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[2] * A[59]\n\t" - "ldr r10, [%[a], #236]\n\t" - "ldr r8, [%[a], #8]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[3] * A[58]\n\t" - "ldr r10, [%[a], #232]\n\t" - "ldr r8, [%[a], #12]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[4] * A[57]\n\t" - "ldr r10, [%[a], #228]\n\t" - "ldr r8, [%[a], #16]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[5] * A[56]\n\t" - "ldr r10, [%[a], #224]\n\t" - "ldr r8, [%[a], #20]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[6] * A[55]\n\t" - "ldr r10, [%[a], #220]\n\t" - "ldr r8, [%[a], #24]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[7] * A[54]\n\t" - "ldr r10, [%[a], #216]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[8] * A[53]\n\t" - "ldr r10, [%[a], #212]\n\t" - "ldr r8, [%[a], #32]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[9] * A[52]\n\t" - "ldr r10, [%[a], #208]\n\t" - "ldr r8, [%[a], #36]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[10] * A[51]\n\t" - "ldr r10, [%[a], #204]\n\t" - "ldr r8, [%[a], #40]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[11] * A[50]\n\t" - "ldr r10, [%[a], #200]\n\t" - "ldr r8, [%[a], #44]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[12] * A[49]\n\t" - "ldr r10, [%[a], #196]\n\t" - "ldr r8, [%[a], #48]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[13] * A[48]\n\t" - "ldr r10, [%[a], #192]\n\t" - "ldr r8, [%[a], #52]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[14] * A[47]\n\t" - "ldr r10, [%[a], #188]\n\t" - "ldr r8, [%[a], #56]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[15] * A[46]\n\t" - "ldr r10, [%[a], #184]\n\t" - "ldr r8, [%[a], #60]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[16] * A[45]\n\t" - "ldr r10, [%[a], #180]\n\t" - "ldr r8, [%[a], #64]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[17] * A[44]\n\t" - "ldr r10, [%[a], #176]\n\t" - "ldr r8, [%[a], #68]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[18] * A[43]\n\t" - "ldr r10, [%[a], #172]\n\t" - "ldr r8, [%[a], #72]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[19] * A[42]\n\t" - "ldr r10, [%[a], #168]\n\t" - "ldr r8, [%[a], #76]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[20] * A[41]\n\t" - "ldr r10, [%[a], #164]\n\t" - "ldr r8, [%[a], #80]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[21] * A[40]\n\t" - "ldr r10, [%[a], #160]\n\t" - "ldr r8, [%[a], #84]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[22] * A[39]\n\t" - "ldr r10, [%[a], #156]\n\t" - "ldr r8, [%[a], #88]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[23] * A[38]\n\t" - "ldr r10, [%[a], #152]\n\t" - "ldr r8, [%[a], #92]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[24] * A[37]\n\t" - "ldr r10, [%[a], #148]\n\t" - "ldr r8, [%[a], #96]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[25] * A[36]\n\t" - "ldr r10, [%[a], #144]\n\t" - "ldr r8, [%[a], #100]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[26] * A[35]\n\t" - "ldr r10, [%[a], #140]\n\t" - "ldr r8, [%[a], #104]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[27] * A[34]\n\t" - "ldr r10, [%[a], #136]\n\t" - "ldr r8, [%[a], #108]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[28] * A[33]\n\t" - "ldr r10, [%[a], #132]\n\t" - "ldr r8, [%[a], #112]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[29] * A[32]\n\t" - "ldr r10, [%[a], #128]\n\t" - "ldr r8, [%[a], #116]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[30] * A[31]\n\t" - "ldr r10, [%[a], #124]\n\t" - "ldr r8, [%[a], #120]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r3, r3, r5\n\t" - "adcs r4, r4, r6\n\t" - "adc r2, r2, r7\n\t" - "str r3, [sp, #244]\n\t" - "# A[0] * A[62]\n\t" - "ldr r10, [%[a], #248]\n\t" - "ldr r8, [%[a], #0]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r3, #0\n\t" - "mov r7, #0\n\t" - "# A[1] * A[61]\n\t" - "ldr r10, [%[a], #244]\n\t" - "ldr r8, [%[a], #4]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[2] * A[60]\n\t" - "ldr r10, [%[a], #240]\n\t" - "ldr r8, [%[a], #8]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[3] * A[59]\n\t" - "ldr r10, [%[a], #236]\n\t" - "ldr r8, [%[a], #12]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[4] * A[58]\n\t" - "ldr r10, [%[a], #232]\n\t" - "ldr r8, [%[a], #16]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[5] * A[57]\n\t" - "ldr r10, [%[a], #228]\n\t" - "ldr r8, [%[a], #20]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[6] * A[56]\n\t" - "ldr r10, [%[a], #224]\n\t" - "ldr r8, [%[a], #24]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[7] * A[55]\n\t" - "ldr r10, [%[a], #220]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[8] * A[54]\n\t" - "ldr r10, [%[a], #216]\n\t" - "ldr r8, [%[a], #32]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[9] * A[53]\n\t" - "ldr r10, [%[a], #212]\n\t" - "ldr r8, [%[a], #36]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[10] * A[52]\n\t" - "ldr r10, [%[a], #208]\n\t" - "ldr r8, [%[a], #40]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[11] * A[51]\n\t" - "ldr r10, [%[a], #204]\n\t" - "ldr r8, [%[a], #44]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[12] * A[50]\n\t" - "ldr r10, [%[a], #200]\n\t" - "ldr r8, [%[a], #48]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[13] * A[49]\n\t" - "ldr r10, [%[a], #196]\n\t" - "ldr r8, [%[a], #52]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[14] * A[48]\n\t" - "ldr r10, [%[a], #192]\n\t" - "ldr r8, [%[a], #56]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[15] * A[47]\n\t" - "ldr r10, [%[a], #188]\n\t" - "ldr r8, [%[a], #60]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[16] * A[46]\n\t" - "ldr r10, [%[a], #184]\n\t" - "ldr r8, [%[a], #64]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[17] * A[45]\n\t" - "ldr r10, [%[a], #180]\n\t" - "ldr r8, [%[a], #68]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[18] * A[44]\n\t" - "ldr r10, [%[a], #176]\n\t" - "ldr r8, [%[a], #72]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[19] * A[43]\n\t" - "ldr r10, [%[a], #172]\n\t" - "ldr r8, [%[a], #76]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[20] * A[42]\n\t" - "ldr r10, [%[a], #168]\n\t" - "ldr r8, [%[a], #80]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[21] * A[41]\n\t" - "ldr r10, [%[a], #164]\n\t" - "ldr r8, [%[a], #84]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[22] * A[40]\n\t" - "ldr r10, [%[a], #160]\n\t" - "ldr r8, [%[a], #88]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[23] * A[39]\n\t" - "ldr r10, [%[a], #156]\n\t" - "ldr r8, [%[a], #92]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[24] * A[38]\n\t" - "ldr r10, [%[a], #152]\n\t" - "ldr r8, [%[a], #96]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[25] * A[37]\n\t" - "ldr r10, [%[a], #148]\n\t" - "ldr r8, [%[a], #100]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[26] * A[36]\n\t" - "ldr r10, [%[a], #144]\n\t" - "ldr r8, [%[a], #104]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[27] * A[35]\n\t" - "ldr r10, [%[a], #140]\n\t" - "ldr r8, [%[a], #108]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[28] * A[34]\n\t" - "ldr r10, [%[a], #136]\n\t" - "ldr r8, [%[a], #112]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[29] * A[33]\n\t" - "ldr r10, [%[a], #132]\n\t" - "ldr r8, [%[a], #116]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[30] * A[32]\n\t" - "ldr r10, [%[a], #128]\n\t" - "ldr r8, [%[a], #120]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[31] * A[31]\n\t" - "ldr r10, [%[a], #124]\n\t" - "umull r8, r9, r10, r10\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r4, r4, r5\n\t" - "adcs r2, r2, r6\n\t" - "adc r3, r3, r7\n\t" - "str r4, [sp, #248]\n\t" - "# A[0] * A[63]\n\t" - "ldr r10, [%[a], #252]\n\t" - "ldr r8, [%[a], #0]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r4, #0\n\t" - "mov r7, #0\n\t" - "# A[1] * A[62]\n\t" - "ldr r10, [%[a], #248]\n\t" - "ldr r8, [%[a], #4]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[2] * A[61]\n\t" - "ldr r10, [%[a], #244]\n\t" - "ldr r8, [%[a], #8]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[3] * A[60]\n\t" - "ldr r10, [%[a], #240]\n\t" - "ldr r8, [%[a], #12]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[4] * A[59]\n\t" - "ldr r10, [%[a], #236]\n\t" - "ldr r8, [%[a], #16]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[5] * A[58]\n\t" - "ldr r10, [%[a], #232]\n\t" - "ldr r8, [%[a], #20]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[6] * A[57]\n\t" - "ldr r10, [%[a], #228]\n\t" - "ldr r8, [%[a], #24]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[7] * A[56]\n\t" - "ldr r10, [%[a], #224]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[8] * A[55]\n\t" - "ldr r10, [%[a], #220]\n\t" - "ldr r8, [%[a], #32]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[9] * A[54]\n\t" - "ldr r10, [%[a], #216]\n\t" - "ldr r8, [%[a], #36]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[10] * A[53]\n\t" - "ldr r10, [%[a], #212]\n\t" - "ldr r8, [%[a], #40]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[11] * A[52]\n\t" - "ldr r10, [%[a], #208]\n\t" - "ldr r8, [%[a], #44]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[12] * A[51]\n\t" - "ldr r10, [%[a], #204]\n\t" - "ldr r8, [%[a], #48]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[13] * A[50]\n\t" - "ldr r10, [%[a], #200]\n\t" - "ldr r8, [%[a], #52]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[14] * A[49]\n\t" - "ldr r10, [%[a], #196]\n\t" - "ldr r8, [%[a], #56]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[15] * A[48]\n\t" - "ldr r10, [%[a], #192]\n\t" - "ldr r8, [%[a], #60]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[16] * A[47]\n\t" - "ldr r10, [%[a], #188]\n\t" - "ldr r8, [%[a], #64]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[17] * A[46]\n\t" - "ldr r10, [%[a], #184]\n\t" - "ldr r8, [%[a], #68]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[18] * A[45]\n\t" - "ldr r10, [%[a], #180]\n\t" - "ldr r8, [%[a], #72]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[19] * A[44]\n\t" - "ldr r10, [%[a], #176]\n\t" - "ldr r8, [%[a], #76]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[20] * A[43]\n\t" - "ldr r10, [%[a], #172]\n\t" - "ldr r8, [%[a], #80]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[21] * A[42]\n\t" - "ldr r10, [%[a], #168]\n\t" - "ldr r8, [%[a], #84]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[22] * A[41]\n\t" - "ldr r10, [%[a], #164]\n\t" - "ldr r8, [%[a], #88]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[23] * A[40]\n\t" - "ldr r10, [%[a], #160]\n\t" - "ldr r8, [%[a], #92]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[24] * A[39]\n\t" - "ldr r10, [%[a], #156]\n\t" - "ldr r8, [%[a], #96]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[25] * A[38]\n\t" - "ldr r10, [%[a], #152]\n\t" - "ldr r8, [%[a], #100]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[26] * A[37]\n\t" - "ldr r10, [%[a], #148]\n\t" - "ldr r8, [%[a], #104]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[27] * A[36]\n\t" - "ldr r10, [%[a], #144]\n\t" - "ldr r8, [%[a], #108]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[28] * A[35]\n\t" - "ldr r10, [%[a], #140]\n\t" - "ldr r8, [%[a], #112]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[29] * A[34]\n\t" - "ldr r10, [%[a], #136]\n\t" - "ldr r8, [%[a], #116]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[30] * A[33]\n\t" - "ldr r10, [%[a], #132]\n\t" - "ldr r8, [%[a], #120]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[31] * A[32]\n\t" - "ldr r10, [%[a], #128]\n\t" - "ldr r8, [%[a], #124]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r2, r2, r5\n\t" - "adcs r3, r3, r6\n\t" - "adc r4, r4, r7\n\t" - "str r2, [sp, #252]\n\t" - "# A[1] * A[63]\n\t" - "ldr r10, [%[a], #252]\n\t" - "ldr r8, [%[a], #4]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r2, #0\n\t" - "mov r7, #0\n\t" - "# A[2] * A[62]\n\t" - "ldr r10, [%[a], #248]\n\t" - "ldr r8, [%[a], #8]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[3] * A[61]\n\t" - "ldr r10, [%[a], #244]\n\t" - "ldr r8, [%[a], #12]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[4] * A[60]\n\t" - "ldr r10, [%[a], #240]\n\t" - "ldr r8, [%[a], #16]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[5] * A[59]\n\t" - "ldr r10, [%[a], #236]\n\t" - "ldr r8, [%[a], #20]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[6] * A[58]\n\t" - "ldr r10, [%[a], #232]\n\t" - "ldr r8, [%[a], #24]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[7] * A[57]\n\t" - "ldr r10, [%[a], #228]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[8] * A[56]\n\t" - "ldr r10, [%[a], #224]\n\t" - "ldr r8, [%[a], #32]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[9] * A[55]\n\t" - "ldr r10, [%[a], #220]\n\t" - "ldr r8, [%[a], #36]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[10] * A[54]\n\t" - "ldr r10, [%[a], #216]\n\t" - "ldr r8, [%[a], #40]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[11] * A[53]\n\t" - "ldr r10, [%[a], #212]\n\t" - "ldr r8, [%[a], #44]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[12] * A[52]\n\t" - "ldr r10, [%[a], #208]\n\t" - "ldr r8, [%[a], #48]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[13] * A[51]\n\t" - "ldr r10, [%[a], #204]\n\t" - "ldr r8, [%[a], #52]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[14] * A[50]\n\t" - "ldr r10, [%[a], #200]\n\t" - "ldr r8, [%[a], #56]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[15] * A[49]\n\t" - "ldr r10, [%[a], #196]\n\t" - "ldr r8, [%[a], #60]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[16] * A[48]\n\t" - "ldr r10, [%[a], #192]\n\t" - "ldr r8, [%[a], #64]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[17] * A[47]\n\t" - "ldr r10, [%[a], #188]\n\t" - "ldr r8, [%[a], #68]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[18] * A[46]\n\t" - "ldr r10, [%[a], #184]\n\t" - "ldr r8, [%[a], #72]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[19] * A[45]\n\t" - "ldr r10, [%[a], #180]\n\t" - "ldr r8, [%[a], #76]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[20] * A[44]\n\t" - "ldr r10, [%[a], #176]\n\t" - "ldr r8, [%[a], #80]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[21] * A[43]\n\t" - "ldr r10, [%[a], #172]\n\t" - "ldr r8, [%[a], #84]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[22] * A[42]\n\t" - "ldr r10, [%[a], #168]\n\t" - "ldr r8, [%[a], #88]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[23] * A[41]\n\t" - "ldr r10, [%[a], #164]\n\t" - "ldr r8, [%[a], #92]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[24] * A[40]\n\t" - "ldr r10, [%[a], #160]\n\t" - "ldr r8, [%[a], #96]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[25] * A[39]\n\t" - "ldr r10, [%[a], #156]\n\t" - "ldr r8, [%[a], #100]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[26] * A[38]\n\t" - "ldr r10, [%[a], #152]\n\t" - "ldr r8, [%[a], #104]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[27] * A[37]\n\t" - "ldr r10, [%[a], #148]\n\t" - "ldr r8, [%[a], #108]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[28] * A[36]\n\t" - "ldr r10, [%[a], #144]\n\t" - "ldr r8, [%[a], #112]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[29] * A[35]\n\t" - "ldr r10, [%[a], #140]\n\t" - "ldr r8, [%[a], #116]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[30] * A[34]\n\t" - "ldr r10, [%[a], #136]\n\t" - "ldr r8, [%[a], #120]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[31] * A[33]\n\t" - "ldr r10, [%[a], #132]\n\t" - "ldr r8, [%[a], #124]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[32] * A[32]\n\t" - "ldr r10, [%[a], #128]\n\t" - "umull r8, r9, r10, r10\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r3, r3, r5\n\t" - "adcs r4, r4, r6\n\t" - "adc r2, r2, r7\n\t" - "str r3, [%[r], #256]\n\t" - "# A[2] * A[63]\n\t" - "ldr r10, [%[a], #252]\n\t" - "ldr r8, [%[a], #8]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r3, #0\n\t" - "mov r7, #0\n\t" - "# A[3] * A[62]\n\t" - "ldr r10, [%[a], #248]\n\t" - "ldr r8, [%[a], #12]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[4] * A[61]\n\t" - "ldr r10, [%[a], #244]\n\t" - "ldr r8, [%[a], #16]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[5] * A[60]\n\t" - "ldr r10, [%[a], #240]\n\t" - "ldr r8, [%[a], #20]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[6] * A[59]\n\t" - "ldr r10, [%[a], #236]\n\t" - "ldr r8, [%[a], #24]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[7] * A[58]\n\t" - "ldr r10, [%[a], #232]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[8] * A[57]\n\t" - "ldr r10, [%[a], #228]\n\t" - "ldr r8, [%[a], #32]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[9] * A[56]\n\t" - "ldr r10, [%[a], #224]\n\t" - "ldr r8, [%[a], #36]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[10] * A[55]\n\t" - "ldr r10, [%[a], #220]\n\t" - "ldr r8, [%[a], #40]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[11] * A[54]\n\t" - "ldr r10, [%[a], #216]\n\t" - "ldr r8, [%[a], #44]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[12] * A[53]\n\t" - "ldr r10, [%[a], #212]\n\t" - "ldr r8, [%[a], #48]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[13] * A[52]\n\t" - "ldr r10, [%[a], #208]\n\t" - "ldr r8, [%[a], #52]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[14] * A[51]\n\t" - "ldr r10, [%[a], #204]\n\t" - "ldr r8, [%[a], #56]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[15] * A[50]\n\t" - "ldr r10, [%[a], #200]\n\t" - "ldr r8, [%[a], #60]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[16] * A[49]\n\t" - "ldr r10, [%[a], #196]\n\t" - "ldr r8, [%[a], #64]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[17] * A[48]\n\t" - "ldr r10, [%[a], #192]\n\t" - "ldr r8, [%[a], #68]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[18] * A[47]\n\t" - "ldr r10, [%[a], #188]\n\t" - "ldr r8, [%[a], #72]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[19] * A[46]\n\t" - "ldr r10, [%[a], #184]\n\t" - "ldr r8, [%[a], #76]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[20] * A[45]\n\t" - "ldr r10, [%[a], #180]\n\t" - "ldr r8, [%[a], #80]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[21] * A[44]\n\t" - "ldr r10, [%[a], #176]\n\t" - "ldr r8, [%[a], #84]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[22] * A[43]\n\t" - "ldr r10, [%[a], #172]\n\t" - "ldr r8, [%[a], #88]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[23] * A[42]\n\t" - "ldr r10, [%[a], #168]\n\t" - "ldr r8, [%[a], #92]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[24] * A[41]\n\t" - "ldr r10, [%[a], #164]\n\t" - "ldr r8, [%[a], #96]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[25] * A[40]\n\t" - "ldr r10, [%[a], #160]\n\t" - "ldr r8, [%[a], #100]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[26] * A[39]\n\t" - "ldr r10, [%[a], #156]\n\t" - "ldr r8, [%[a], #104]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[27] * A[38]\n\t" - "ldr r10, [%[a], #152]\n\t" - "ldr r8, [%[a], #108]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[28] * A[37]\n\t" - "ldr r10, [%[a], #148]\n\t" - "ldr r8, [%[a], #112]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[29] * A[36]\n\t" - "ldr r10, [%[a], #144]\n\t" - "ldr r8, [%[a], #116]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[30] * A[35]\n\t" - "ldr r10, [%[a], #140]\n\t" - "ldr r8, [%[a], #120]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[31] * A[34]\n\t" - "ldr r10, [%[a], #136]\n\t" - "ldr r8, [%[a], #124]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[32] * A[33]\n\t" - "ldr r10, [%[a], #132]\n\t" - "ldr r8, [%[a], #128]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r4, r4, r5\n\t" - "adcs r2, r2, r6\n\t" - "adc r3, r3, r7\n\t" - "str r4, [%[r], #260]\n\t" - "# A[3] * A[63]\n\t" - "ldr r10, [%[a], #252]\n\t" - "ldr r8, [%[a], #12]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r4, #0\n\t" - "mov r7, #0\n\t" - "# A[4] * A[62]\n\t" - "ldr r10, [%[a], #248]\n\t" - "ldr r8, [%[a], #16]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[5] * A[61]\n\t" - "ldr r10, [%[a], #244]\n\t" - "ldr r8, [%[a], #20]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[6] * A[60]\n\t" - "ldr r10, [%[a], #240]\n\t" - "ldr r8, [%[a], #24]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[7] * A[59]\n\t" - "ldr r10, [%[a], #236]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[8] * A[58]\n\t" - "ldr r10, [%[a], #232]\n\t" - "ldr r8, [%[a], #32]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[9] * A[57]\n\t" - "ldr r10, [%[a], #228]\n\t" - "ldr r8, [%[a], #36]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[10] * A[56]\n\t" - "ldr r10, [%[a], #224]\n\t" - "ldr r8, [%[a], #40]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[11] * A[55]\n\t" - "ldr r10, [%[a], #220]\n\t" - "ldr r8, [%[a], #44]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[12] * A[54]\n\t" - "ldr r10, [%[a], #216]\n\t" - "ldr r8, [%[a], #48]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[13] * A[53]\n\t" - "ldr r10, [%[a], #212]\n\t" - "ldr r8, [%[a], #52]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[14] * A[52]\n\t" - "ldr r10, [%[a], #208]\n\t" - "ldr r8, [%[a], #56]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[15] * A[51]\n\t" - "ldr r10, [%[a], #204]\n\t" - "ldr r8, [%[a], #60]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[16] * A[50]\n\t" - "ldr r10, [%[a], #200]\n\t" - "ldr r8, [%[a], #64]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[17] * A[49]\n\t" - "ldr r10, [%[a], #196]\n\t" - "ldr r8, [%[a], #68]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[18] * A[48]\n\t" - "ldr r10, [%[a], #192]\n\t" - "ldr r8, [%[a], #72]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[19] * A[47]\n\t" - "ldr r10, [%[a], #188]\n\t" - "ldr r8, [%[a], #76]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[20] * A[46]\n\t" - "ldr r10, [%[a], #184]\n\t" - "ldr r8, [%[a], #80]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[21] * A[45]\n\t" - "ldr r10, [%[a], #180]\n\t" - "ldr r8, [%[a], #84]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[22] * A[44]\n\t" - "ldr r10, [%[a], #176]\n\t" - "ldr r8, [%[a], #88]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[23] * A[43]\n\t" - "ldr r10, [%[a], #172]\n\t" - "ldr r8, [%[a], #92]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[24] * A[42]\n\t" - "ldr r10, [%[a], #168]\n\t" - "ldr r8, [%[a], #96]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[25] * A[41]\n\t" - "ldr r10, [%[a], #164]\n\t" - "ldr r8, [%[a], #100]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[26] * A[40]\n\t" - "ldr r10, [%[a], #160]\n\t" - "ldr r8, [%[a], #104]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[27] * A[39]\n\t" - "ldr r10, [%[a], #156]\n\t" - "ldr r8, [%[a], #108]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[28] * A[38]\n\t" - "ldr r10, [%[a], #152]\n\t" - "ldr r8, [%[a], #112]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[29] * A[37]\n\t" - "ldr r10, [%[a], #148]\n\t" - "ldr r8, [%[a], #116]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[30] * A[36]\n\t" - "ldr r10, [%[a], #144]\n\t" - "ldr r8, [%[a], #120]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[31] * A[35]\n\t" - "ldr r10, [%[a], #140]\n\t" - "ldr r8, [%[a], #124]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[32] * A[34]\n\t" - "ldr r10, [%[a], #136]\n\t" - "ldr r8, [%[a], #128]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[33] * A[33]\n\t" - "ldr r10, [%[a], #132]\n\t" - "umull r8, r9, r10, r10\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r2, r2, r5\n\t" - "adcs r3, r3, r6\n\t" - "adc r4, r4, r7\n\t" - "str r2, [%[r], #264]\n\t" - "# A[4] * A[63]\n\t" - "ldr r10, [%[a], #252]\n\t" - "ldr r8, [%[a], #16]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r2, #0\n\t" - "mov r7, #0\n\t" - "# A[5] * A[62]\n\t" - "ldr r10, [%[a], #248]\n\t" - "ldr r8, [%[a], #20]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[6] * A[61]\n\t" - "ldr r10, [%[a], #244]\n\t" - "ldr r8, [%[a], #24]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[7] * A[60]\n\t" - "ldr r10, [%[a], #240]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[8] * A[59]\n\t" - "ldr r10, [%[a], #236]\n\t" - "ldr r8, [%[a], #32]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[9] * A[58]\n\t" - "ldr r10, [%[a], #232]\n\t" - "ldr r8, [%[a], #36]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[10] * A[57]\n\t" - "ldr r10, [%[a], #228]\n\t" - "ldr r8, [%[a], #40]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[11] * A[56]\n\t" - "ldr r10, [%[a], #224]\n\t" - "ldr r8, [%[a], #44]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[12] * A[55]\n\t" - "ldr r10, [%[a], #220]\n\t" - "ldr r8, [%[a], #48]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[13] * A[54]\n\t" - "ldr r10, [%[a], #216]\n\t" - "ldr r8, [%[a], #52]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[14] * A[53]\n\t" - "ldr r10, [%[a], #212]\n\t" - "ldr r8, [%[a], #56]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[15] * A[52]\n\t" - "ldr r10, [%[a], #208]\n\t" - "ldr r8, [%[a], #60]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[16] * A[51]\n\t" - "ldr r10, [%[a], #204]\n\t" - "ldr r8, [%[a], #64]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[17] * A[50]\n\t" - "ldr r10, [%[a], #200]\n\t" - "ldr r8, [%[a], #68]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[18] * A[49]\n\t" - "ldr r10, [%[a], #196]\n\t" - "ldr r8, [%[a], #72]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[19] * A[48]\n\t" - "ldr r10, [%[a], #192]\n\t" - "ldr r8, [%[a], #76]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[20] * A[47]\n\t" - "ldr r10, [%[a], #188]\n\t" - "ldr r8, [%[a], #80]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[21] * A[46]\n\t" - "ldr r10, [%[a], #184]\n\t" - "ldr r8, [%[a], #84]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[22] * A[45]\n\t" - "ldr r10, [%[a], #180]\n\t" - "ldr r8, [%[a], #88]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[23] * A[44]\n\t" - "ldr r10, [%[a], #176]\n\t" - "ldr r8, [%[a], #92]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[24] * A[43]\n\t" - "ldr r10, [%[a], #172]\n\t" - "ldr r8, [%[a], #96]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[25] * A[42]\n\t" - "ldr r10, [%[a], #168]\n\t" - "ldr r8, [%[a], #100]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[26] * A[41]\n\t" - "ldr r10, [%[a], #164]\n\t" - "ldr r8, [%[a], #104]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[27] * A[40]\n\t" - "ldr r10, [%[a], #160]\n\t" - "ldr r8, [%[a], #108]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[28] * A[39]\n\t" - "ldr r10, [%[a], #156]\n\t" - "ldr r8, [%[a], #112]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[29] * A[38]\n\t" - "ldr r10, [%[a], #152]\n\t" - "ldr r8, [%[a], #116]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[30] * A[37]\n\t" - "ldr r10, [%[a], #148]\n\t" - "ldr r8, [%[a], #120]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[31] * A[36]\n\t" - "ldr r10, [%[a], #144]\n\t" - "ldr r8, [%[a], #124]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[32] * A[35]\n\t" - "ldr r10, [%[a], #140]\n\t" - "ldr r8, [%[a], #128]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[33] * A[34]\n\t" - "ldr r10, [%[a], #136]\n\t" - "ldr r8, [%[a], #132]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r3, r3, r5\n\t" - "adcs r4, r4, r6\n\t" - "adc r2, r2, r7\n\t" - "str r3, [%[r], #268]\n\t" - "# A[5] * A[63]\n\t" - "ldr r10, [%[a], #252]\n\t" - "ldr r8, [%[a], #20]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r3, #0\n\t" - "mov r7, #0\n\t" - "# A[6] * A[62]\n\t" - "ldr r10, [%[a], #248]\n\t" - "ldr r8, [%[a], #24]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[7] * A[61]\n\t" - "ldr r10, [%[a], #244]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[8] * A[60]\n\t" - "ldr r10, [%[a], #240]\n\t" - "ldr r8, [%[a], #32]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[9] * A[59]\n\t" - "ldr r10, [%[a], #236]\n\t" - "ldr r8, [%[a], #36]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[10] * A[58]\n\t" - "ldr r10, [%[a], #232]\n\t" - "ldr r8, [%[a], #40]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[11] * A[57]\n\t" - "ldr r10, [%[a], #228]\n\t" - "ldr r8, [%[a], #44]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[12] * A[56]\n\t" - "ldr r10, [%[a], #224]\n\t" - "ldr r8, [%[a], #48]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[13] * A[55]\n\t" - "ldr r10, [%[a], #220]\n\t" - "ldr r8, [%[a], #52]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[14] * A[54]\n\t" - "ldr r10, [%[a], #216]\n\t" - "ldr r8, [%[a], #56]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[15] * A[53]\n\t" - "ldr r10, [%[a], #212]\n\t" - "ldr r8, [%[a], #60]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[16] * A[52]\n\t" - "ldr r10, [%[a], #208]\n\t" - "ldr r8, [%[a], #64]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[17] * A[51]\n\t" - "ldr r10, [%[a], #204]\n\t" - "ldr r8, [%[a], #68]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[18] * A[50]\n\t" - "ldr r10, [%[a], #200]\n\t" - "ldr r8, [%[a], #72]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[19] * A[49]\n\t" - "ldr r10, [%[a], #196]\n\t" - "ldr r8, [%[a], #76]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[20] * A[48]\n\t" - "ldr r10, [%[a], #192]\n\t" - "ldr r8, [%[a], #80]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[21] * A[47]\n\t" - "ldr r10, [%[a], #188]\n\t" - "ldr r8, [%[a], #84]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[22] * A[46]\n\t" - "ldr r10, [%[a], #184]\n\t" - "ldr r8, [%[a], #88]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[23] * A[45]\n\t" - "ldr r10, [%[a], #180]\n\t" - "ldr r8, [%[a], #92]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[24] * A[44]\n\t" - "ldr r10, [%[a], #176]\n\t" - "ldr r8, [%[a], #96]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[25] * A[43]\n\t" - "ldr r10, [%[a], #172]\n\t" - "ldr r8, [%[a], #100]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[26] * A[42]\n\t" - "ldr r10, [%[a], #168]\n\t" - "ldr r8, [%[a], #104]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[27] * A[41]\n\t" - "ldr r10, [%[a], #164]\n\t" - "ldr r8, [%[a], #108]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[28] * A[40]\n\t" - "ldr r10, [%[a], #160]\n\t" - "ldr r8, [%[a], #112]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[29] * A[39]\n\t" - "ldr r10, [%[a], #156]\n\t" - "ldr r8, [%[a], #116]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[30] * A[38]\n\t" - "ldr r10, [%[a], #152]\n\t" - "ldr r8, [%[a], #120]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[31] * A[37]\n\t" - "ldr r10, [%[a], #148]\n\t" - "ldr r8, [%[a], #124]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[32] * A[36]\n\t" - "ldr r10, [%[a], #144]\n\t" - "ldr r8, [%[a], #128]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[33] * A[35]\n\t" - "ldr r10, [%[a], #140]\n\t" - "ldr r8, [%[a], #132]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[34] * A[34]\n\t" - "ldr r10, [%[a], #136]\n\t" - "umull r8, r9, r10, r10\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r4, r4, r5\n\t" - "adcs r2, r2, r6\n\t" - "adc r3, r3, r7\n\t" - "str r4, [%[r], #272]\n\t" - "# A[6] * A[63]\n\t" - "ldr r10, [%[a], #252]\n\t" - "ldr r8, [%[a], #24]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r4, #0\n\t" - "mov r7, #0\n\t" - "# A[7] * A[62]\n\t" - "ldr r10, [%[a], #248]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[8] * A[61]\n\t" - "ldr r10, [%[a], #244]\n\t" - "ldr r8, [%[a], #32]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[9] * A[60]\n\t" - "ldr r10, [%[a], #240]\n\t" - "ldr r8, [%[a], #36]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[10] * A[59]\n\t" - "ldr r10, [%[a], #236]\n\t" - "ldr r8, [%[a], #40]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[11] * A[58]\n\t" - "ldr r10, [%[a], #232]\n\t" - "ldr r8, [%[a], #44]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[12] * A[57]\n\t" - "ldr r10, [%[a], #228]\n\t" - "ldr r8, [%[a], #48]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[13] * A[56]\n\t" - "ldr r10, [%[a], #224]\n\t" - "ldr r8, [%[a], #52]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[14] * A[55]\n\t" - "ldr r10, [%[a], #220]\n\t" - "ldr r8, [%[a], #56]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[15] * A[54]\n\t" - "ldr r10, [%[a], #216]\n\t" - "ldr r8, [%[a], #60]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[16] * A[53]\n\t" - "ldr r10, [%[a], #212]\n\t" - "ldr r8, [%[a], #64]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[17] * A[52]\n\t" - "ldr r10, [%[a], #208]\n\t" - "ldr r8, [%[a], #68]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[18] * A[51]\n\t" - "ldr r10, [%[a], #204]\n\t" - "ldr r8, [%[a], #72]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[19] * A[50]\n\t" - "ldr r10, [%[a], #200]\n\t" - "ldr r8, [%[a], #76]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[20] * A[49]\n\t" - "ldr r10, [%[a], #196]\n\t" - "ldr r8, [%[a], #80]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[21] * A[48]\n\t" - "ldr r10, [%[a], #192]\n\t" - "ldr r8, [%[a], #84]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[22] * A[47]\n\t" - "ldr r10, [%[a], #188]\n\t" - "ldr r8, [%[a], #88]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[23] * A[46]\n\t" - "ldr r10, [%[a], #184]\n\t" - "ldr r8, [%[a], #92]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[24] * A[45]\n\t" - "ldr r10, [%[a], #180]\n\t" - "ldr r8, [%[a], #96]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[25] * A[44]\n\t" - "ldr r10, [%[a], #176]\n\t" - "ldr r8, [%[a], #100]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[26] * A[43]\n\t" - "ldr r10, [%[a], #172]\n\t" - "ldr r8, [%[a], #104]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[27] * A[42]\n\t" - "ldr r10, [%[a], #168]\n\t" - "ldr r8, [%[a], #108]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[28] * A[41]\n\t" - "ldr r10, [%[a], #164]\n\t" - "ldr r8, [%[a], #112]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[29] * A[40]\n\t" - "ldr r10, [%[a], #160]\n\t" - "ldr r8, [%[a], #116]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[30] * A[39]\n\t" - "ldr r10, [%[a], #156]\n\t" - "ldr r8, [%[a], #120]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[31] * A[38]\n\t" - "ldr r10, [%[a], #152]\n\t" - "ldr r8, [%[a], #124]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[32] * A[37]\n\t" - "ldr r10, [%[a], #148]\n\t" - "ldr r8, [%[a], #128]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[33] * A[36]\n\t" - "ldr r10, [%[a], #144]\n\t" - "ldr r8, [%[a], #132]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[34] * A[35]\n\t" - "ldr r10, [%[a], #140]\n\t" - "ldr r8, [%[a], #136]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r2, r2, r5\n\t" - "adcs r3, r3, r6\n\t" - "adc r4, r4, r7\n\t" - "str r2, [%[r], #276]\n\t" - "# A[7] * A[63]\n\t" - "ldr r10, [%[a], #252]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r2, #0\n\t" - "mov r7, #0\n\t" - "# A[8] * A[62]\n\t" - "ldr r10, [%[a], #248]\n\t" - "ldr r8, [%[a], #32]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[9] * A[61]\n\t" - "ldr r10, [%[a], #244]\n\t" - "ldr r8, [%[a], #36]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[10] * A[60]\n\t" - "ldr r10, [%[a], #240]\n\t" - "ldr r8, [%[a], #40]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[11] * A[59]\n\t" - "ldr r10, [%[a], #236]\n\t" - "ldr r8, [%[a], #44]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[12] * A[58]\n\t" - "ldr r10, [%[a], #232]\n\t" - "ldr r8, [%[a], #48]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[13] * A[57]\n\t" - "ldr r10, [%[a], #228]\n\t" - "ldr r8, [%[a], #52]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[14] * A[56]\n\t" - "ldr r10, [%[a], #224]\n\t" - "ldr r8, [%[a], #56]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[15] * A[55]\n\t" - "ldr r10, [%[a], #220]\n\t" - "ldr r8, [%[a], #60]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[16] * A[54]\n\t" - "ldr r10, [%[a], #216]\n\t" - "ldr r8, [%[a], #64]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[17] * A[53]\n\t" - "ldr r10, [%[a], #212]\n\t" - "ldr r8, [%[a], #68]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[18] * A[52]\n\t" - "ldr r10, [%[a], #208]\n\t" - "ldr r8, [%[a], #72]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[19] * A[51]\n\t" - "ldr r10, [%[a], #204]\n\t" - "ldr r8, [%[a], #76]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[20] * A[50]\n\t" - "ldr r10, [%[a], #200]\n\t" - "ldr r8, [%[a], #80]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[21] * A[49]\n\t" - "ldr r10, [%[a], #196]\n\t" - "ldr r8, [%[a], #84]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[22] * A[48]\n\t" - "ldr r10, [%[a], #192]\n\t" - "ldr r8, [%[a], #88]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[23] * A[47]\n\t" - "ldr r10, [%[a], #188]\n\t" - "ldr r8, [%[a], #92]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[24] * A[46]\n\t" - "ldr r10, [%[a], #184]\n\t" - "ldr r8, [%[a], #96]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[25] * A[45]\n\t" - "ldr r10, [%[a], #180]\n\t" - "ldr r8, [%[a], #100]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[26] * A[44]\n\t" - "ldr r10, [%[a], #176]\n\t" - "ldr r8, [%[a], #104]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[27] * A[43]\n\t" - "ldr r10, [%[a], #172]\n\t" - "ldr r8, [%[a], #108]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[28] * A[42]\n\t" - "ldr r10, [%[a], #168]\n\t" - "ldr r8, [%[a], #112]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[29] * A[41]\n\t" - "ldr r10, [%[a], #164]\n\t" - "ldr r8, [%[a], #116]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[30] * A[40]\n\t" - "ldr r10, [%[a], #160]\n\t" - "ldr r8, [%[a], #120]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[31] * A[39]\n\t" - "ldr r10, [%[a], #156]\n\t" - "ldr r8, [%[a], #124]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[32] * A[38]\n\t" - "ldr r10, [%[a], #152]\n\t" - "ldr r8, [%[a], #128]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[33] * A[37]\n\t" - "ldr r10, [%[a], #148]\n\t" - "ldr r8, [%[a], #132]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[34] * A[36]\n\t" - "ldr r10, [%[a], #144]\n\t" - "ldr r8, [%[a], #136]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[35] * A[35]\n\t" - "ldr r10, [%[a], #140]\n\t" - "umull r8, r9, r10, r10\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r3, r3, r5\n\t" - "adcs r4, r4, r6\n\t" - "adc r2, r2, r7\n\t" - "str r3, [%[r], #280]\n\t" - "# A[8] * A[63]\n\t" - "ldr r10, [%[a], #252]\n\t" - "ldr r8, [%[a], #32]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r3, #0\n\t" - "mov r7, #0\n\t" - "# A[9] * A[62]\n\t" - "ldr r10, [%[a], #248]\n\t" - "ldr r8, [%[a], #36]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[10] * A[61]\n\t" - "ldr r10, [%[a], #244]\n\t" - "ldr r8, [%[a], #40]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[11] * A[60]\n\t" - "ldr r10, [%[a], #240]\n\t" - "ldr r8, [%[a], #44]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[12] * A[59]\n\t" - "ldr r10, [%[a], #236]\n\t" - "ldr r8, [%[a], #48]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[13] * A[58]\n\t" - "ldr r10, [%[a], #232]\n\t" - "ldr r8, [%[a], #52]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[14] * A[57]\n\t" - "ldr r10, [%[a], #228]\n\t" - "ldr r8, [%[a], #56]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[15] * A[56]\n\t" - "ldr r10, [%[a], #224]\n\t" - "ldr r8, [%[a], #60]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[16] * A[55]\n\t" - "ldr r10, [%[a], #220]\n\t" - "ldr r8, [%[a], #64]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[17] * A[54]\n\t" - "ldr r10, [%[a], #216]\n\t" - "ldr r8, [%[a], #68]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[18] * A[53]\n\t" - "ldr r10, [%[a], #212]\n\t" - "ldr r8, [%[a], #72]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[19] * A[52]\n\t" - "ldr r10, [%[a], #208]\n\t" - "ldr r8, [%[a], #76]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[20] * A[51]\n\t" - "ldr r10, [%[a], #204]\n\t" - "ldr r8, [%[a], #80]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[21] * A[50]\n\t" - "ldr r10, [%[a], #200]\n\t" - "ldr r8, [%[a], #84]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[22] * A[49]\n\t" - "ldr r10, [%[a], #196]\n\t" - "ldr r8, [%[a], #88]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[23] * A[48]\n\t" - "ldr r10, [%[a], #192]\n\t" - "ldr r8, [%[a], #92]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[24] * A[47]\n\t" - "ldr r10, [%[a], #188]\n\t" - "ldr r8, [%[a], #96]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[25] * A[46]\n\t" - "ldr r10, [%[a], #184]\n\t" - "ldr r8, [%[a], #100]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[26] * A[45]\n\t" - "ldr r10, [%[a], #180]\n\t" - "ldr r8, [%[a], #104]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[27] * A[44]\n\t" - "ldr r10, [%[a], #176]\n\t" - "ldr r8, [%[a], #108]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[28] * A[43]\n\t" - "ldr r10, [%[a], #172]\n\t" - "ldr r8, [%[a], #112]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[29] * A[42]\n\t" - "ldr r10, [%[a], #168]\n\t" - "ldr r8, [%[a], #116]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[30] * A[41]\n\t" - "ldr r10, [%[a], #164]\n\t" - "ldr r8, [%[a], #120]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[31] * A[40]\n\t" - "ldr r10, [%[a], #160]\n\t" - "ldr r8, [%[a], #124]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[32] * A[39]\n\t" - "ldr r10, [%[a], #156]\n\t" - "ldr r8, [%[a], #128]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[33] * A[38]\n\t" - "ldr r10, [%[a], #152]\n\t" - "ldr r8, [%[a], #132]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[34] * A[37]\n\t" - "ldr r10, [%[a], #148]\n\t" - "ldr r8, [%[a], #136]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[35] * A[36]\n\t" - "ldr r10, [%[a], #144]\n\t" - "ldr r8, [%[a], #140]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r4, r4, r5\n\t" - "adcs r2, r2, r6\n\t" - "adc r3, r3, r7\n\t" - "str r4, [%[r], #284]\n\t" - "# A[9] * A[63]\n\t" - "ldr r10, [%[a], #252]\n\t" - "ldr r8, [%[a], #36]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r4, #0\n\t" - "mov r7, #0\n\t" - "# A[10] * A[62]\n\t" - "ldr r10, [%[a], #248]\n\t" - "ldr r8, [%[a], #40]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[11] * A[61]\n\t" - "ldr r10, [%[a], #244]\n\t" - "ldr r8, [%[a], #44]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[12] * A[60]\n\t" - "ldr r10, [%[a], #240]\n\t" - "ldr r8, [%[a], #48]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[13] * A[59]\n\t" - "ldr r10, [%[a], #236]\n\t" - "ldr r8, [%[a], #52]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[14] * A[58]\n\t" - "ldr r10, [%[a], #232]\n\t" - "ldr r8, [%[a], #56]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[15] * A[57]\n\t" - "ldr r10, [%[a], #228]\n\t" - "ldr r8, [%[a], #60]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[16] * A[56]\n\t" - "ldr r10, [%[a], #224]\n\t" - "ldr r8, [%[a], #64]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[17] * A[55]\n\t" - "ldr r10, [%[a], #220]\n\t" - "ldr r8, [%[a], #68]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[18] * A[54]\n\t" - "ldr r10, [%[a], #216]\n\t" - "ldr r8, [%[a], #72]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[19] * A[53]\n\t" - "ldr r10, [%[a], #212]\n\t" - "ldr r8, [%[a], #76]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[20] * A[52]\n\t" - "ldr r10, [%[a], #208]\n\t" - "ldr r8, [%[a], #80]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[21] * A[51]\n\t" - "ldr r10, [%[a], #204]\n\t" - "ldr r8, [%[a], #84]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[22] * A[50]\n\t" - "ldr r10, [%[a], #200]\n\t" - "ldr r8, [%[a], #88]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[23] * A[49]\n\t" - "ldr r10, [%[a], #196]\n\t" - "ldr r8, [%[a], #92]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[24] * A[48]\n\t" - "ldr r10, [%[a], #192]\n\t" - "ldr r8, [%[a], #96]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[25] * A[47]\n\t" - "ldr r10, [%[a], #188]\n\t" - "ldr r8, [%[a], #100]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[26] * A[46]\n\t" - "ldr r10, [%[a], #184]\n\t" - "ldr r8, [%[a], #104]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[27] * A[45]\n\t" - "ldr r10, [%[a], #180]\n\t" - "ldr r8, [%[a], #108]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[28] * A[44]\n\t" - "ldr r10, [%[a], #176]\n\t" - "ldr r8, [%[a], #112]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[29] * A[43]\n\t" - "ldr r10, [%[a], #172]\n\t" - "ldr r8, [%[a], #116]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[30] * A[42]\n\t" - "ldr r10, [%[a], #168]\n\t" - "ldr r8, [%[a], #120]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[31] * A[41]\n\t" - "ldr r10, [%[a], #164]\n\t" - "ldr r8, [%[a], #124]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[32] * A[40]\n\t" - "ldr r10, [%[a], #160]\n\t" - "ldr r8, [%[a], #128]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[33] * A[39]\n\t" - "ldr r10, [%[a], #156]\n\t" - "ldr r8, [%[a], #132]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[34] * A[38]\n\t" - "ldr r10, [%[a], #152]\n\t" - "ldr r8, [%[a], #136]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[35] * A[37]\n\t" - "ldr r10, [%[a], #148]\n\t" - "ldr r8, [%[a], #140]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[36] * A[36]\n\t" - "ldr r10, [%[a], #144]\n\t" - "umull r8, r9, r10, r10\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r2, r2, r5\n\t" - "adcs r3, r3, r6\n\t" - "adc r4, r4, r7\n\t" - "str r2, [%[r], #288]\n\t" - "# A[10] * A[63]\n\t" - "ldr r10, [%[a], #252]\n\t" - "ldr r8, [%[a], #40]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r2, #0\n\t" - "mov r7, #0\n\t" - "# A[11] * A[62]\n\t" - "ldr r10, [%[a], #248]\n\t" - "ldr r8, [%[a], #44]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[12] * A[61]\n\t" - "ldr r10, [%[a], #244]\n\t" - "ldr r8, [%[a], #48]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[13] * A[60]\n\t" - "ldr r10, [%[a], #240]\n\t" - "ldr r8, [%[a], #52]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[14] * A[59]\n\t" - "ldr r10, [%[a], #236]\n\t" - "ldr r8, [%[a], #56]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[15] * A[58]\n\t" - "ldr r10, [%[a], #232]\n\t" - "ldr r8, [%[a], #60]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[16] * A[57]\n\t" - "ldr r10, [%[a], #228]\n\t" - "ldr r8, [%[a], #64]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[17] * A[56]\n\t" - "ldr r10, [%[a], #224]\n\t" - "ldr r8, [%[a], #68]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[18] * A[55]\n\t" - "ldr r10, [%[a], #220]\n\t" - "ldr r8, [%[a], #72]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[19] * A[54]\n\t" - "ldr r10, [%[a], #216]\n\t" - "ldr r8, [%[a], #76]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[20] * A[53]\n\t" - "ldr r10, [%[a], #212]\n\t" - "ldr r8, [%[a], #80]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[21] * A[52]\n\t" - "ldr r10, [%[a], #208]\n\t" - "ldr r8, [%[a], #84]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[22] * A[51]\n\t" - "ldr r10, [%[a], #204]\n\t" - "ldr r8, [%[a], #88]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[23] * A[50]\n\t" - "ldr r10, [%[a], #200]\n\t" - "ldr r8, [%[a], #92]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[24] * A[49]\n\t" - "ldr r10, [%[a], #196]\n\t" - "ldr r8, [%[a], #96]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[25] * A[48]\n\t" - "ldr r10, [%[a], #192]\n\t" - "ldr r8, [%[a], #100]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[26] * A[47]\n\t" - "ldr r10, [%[a], #188]\n\t" - "ldr r8, [%[a], #104]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[27] * A[46]\n\t" - "ldr r10, [%[a], #184]\n\t" - "ldr r8, [%[a], #108]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[28] * A[45]\n\t" - "ldr r10, [%[a], #180]\n\t" - "ldr r8, [%[a], #112]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[29] * A[44]\n\t" - "ldr r10, [%[a], #176]\n\t" - "ldr r8, [%[a], #116]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[30] * A[43]\n\t" - "ldr r10, [%[a], #172]\n\t" - "ldr r8, [%[a], #120]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[31] * A[42]\n\t" - "ldr r10, [%[a], #168]\n\t" - "ldr r8, [%[a], #124]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[32] * A[41]\n\t" - "ldr r10, [%[a], #164]\n\t" - "ldr r8, [%[a], #128]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[33] * A[40]\n\t" - "ldr r10, [%[a], #160]\n\t" - "ldr r8, [%[a], #132]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[34] * A[39]\n\t" - "ldr r10, [%[a], #156]\n\t" - "ldr r8, [%[a], #136]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[35] * A[38]\n\t" - "ldr r10, [%[a], #152]\n\t" - "ldr r8, [%[a], #140]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[36] * A[37]\n\t" - "ldr r10, [%[a], #148]\n\t" - "ldr r8, [%[a], #144]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r3, r3, r5\n\t" - "adcs r4, r4, r6\n\t" - "adc r2, r2, r7\n\t" - "str r3, [%[r], #292]\n\t" - "# A[11] * A[63]\n\t" - "ldr r10, [%[a], #252]\n\t" - "ldr r8, [%[a], #44]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r3, #0\n\t" - "mov r7, #0\n\t" - "# A[12] * A[62]\n\t" - "ldr r10, [%[a], #248]\n\t" - "ldr r8, [%[a], #48]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[13] * A[61]\n\t" - "ldr r10, [%[a], #244]\n\t" - "ldr r8, [%[a], #52]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[14] * A[60]\n\t" - "ldr r10, [%[a], #240]\n\t" - "ldr r8, [%[a], #56]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[15] * A[59]\n\t" - "ldr r10, [%[a], #236]\n\t" - "ldr r8, [%[a], #60]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[16] * A[58]\n\t" - "ldr r10, [%[a], #232]\n\t" - "ldr r8, [%[a], #64]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[17] * A[57]\n\t" - "ldr r10, [%[a], #228]\n\t" - "ldr r8, [%[a], #68]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[18] * A[56]\n\t" - "ldr r10, [%[a], #224]\n\t" - "ldr r8, [%[a], #72]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[19] * A[55]\n\t" - "ldr r10, [%[a], #220]\n\t" - "ldr r8, [%[a], #76]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[20] * A[54]\n\t" - "ldr r10, [%[a], #216]\n\t" - "ldr r8, [%[a], #80]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[21] * A[53]\n\t" - "ldr r10, [%[a], #212]\n\t" - "ldr r8, [%[a], #84]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[22] * A[52]\n\t" - "ldr r10, [%[a], #208]\n\t" - "ldr r8, [%[a], #88]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[23] * A[51]\n\t" - "ldr r10, [%[a], #204]\n\t" - "ldr r8, [%[a], #92]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[24] * A[50]\n\t" - "ldr r10, [%[a], #200]\n\t" - "ldr r8, [%[a], #96]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[25] * A[49]\n\t" - "ldr r10, [%[a], #196]\n\t" - "ldr r8, [%[a], #100]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[26] * A[48]\n\t" - "ldr r10, [%[a], #192]\n\t" - "ldr r8, [%[a], #104]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[27] * A[47]\n\t" - "ldr r10, [%[a], #188]\n\t" - "ldr r8, [%[a], #108]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[28] * A[46]\n\t" - "ldr r10, [%[a], #184]\n\t" - "ldr r8, [%[a], #112]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[29] * A[45]\n\t" - "ldr r10, [%[a], #180]\n\t" - "ldr r8, [%[a], #116]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[30] * A[44]\n\t" - "ldr r10, [%[a], #176]\n\t" - "ldr r8, [%[a], #120]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[31] * A[43]\n\t" - "ldr r10, [%[a], #172]\n\t" - "ldr r8, [%[a], #124]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[32] * A[42]\n\t" - "ldr r10, [%[a], #168]\n\t" - "ldr r8, [%[a], #128]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[33] * A[41]\n\t" - "ldr r10, [%[a], #164]\n\t" - "ldr r8, [%[a], #132]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[34] * A[40]\n\t" - "ldr r10, [%[a], #160]\n\t" - "ldr r8, [%[a], #136]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[35] * A[39]\n\t" - "ldr r10, [%[a], #156]\n\t" - "ldr r8, [%[a], #140]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[36] * A[38]\n\t" - "ldr r10, [%[a], #152]\n\t" - "ldr r8, [%[a], #144]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[37] * A[37]\n\t" - "ldr r10, [%[a], #148]\n\t" - "umull r8, r9, r10, r10\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r4, r4, r5\n\t" - "adcs r2, r2, r6\n\t" - "adc r3, r3, r7\n\t" - "str r4, [%[r], #296]\n\t" - "# A[12] * A[63]\n\t" - "ldr r10, [%[a], #252]\n\t" - "ldr r8, [%[a], #48]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r4, #0\n\t" - "mov r7, #0\n\t" - "# A[13] * A[62]\n\t" - "ldr r10, [%[a], #248]\n\t" - "ldr r8, [%[a], #52]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[14] * A[61]\n\t" - "ldr r10, [%[a], #244]\n\t" - "ldr r8, [%[a], #56]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[15] * A[60]\n\t" - "ldr r10, [%[a], #240]\n\t" - "ldr r8, [%[a], #60]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[16] * A[59]\n\t" - "ldr r10, [%[a], #236]\n\t" - "ldr r8, [%[a], #64]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[17] * A[58]\n\t" - "ldr r10, [%[a], #232]\n\t" - "ldr r8, [%[a], #68]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[18] * A[57]\n\t" - "ldr r10, [%[a], #228]\n\t" - "ldr r8, [%[a], #72]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[19] * A[56]\n\t" - "ldr r10, [%[a], #224]\n\t" - "ldr r8, [%[a], #76]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[20] * A[55]\n\t" - "ldr r10, [%[a], #220]\n\t" - "ldr r8, [%[a], #80]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[21] * A[54]\n\t" - "ldr r10, [%[a], #216]\n\t" - "ldr r8, [%[a], #84]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[22] * A[53]\n\t" - "ldr r10, [%[a], #212]\n\t" - "ldr r8, [%[a], #88]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[23] * A[52]\n\t" - "ldr r10, [%[a], #208]\n\t" - "ldr r8, [%[a], #92]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[24] * A[51]\n\t" - "ldr r10, [%[a], #204]\n\t" - "ldr r8, [%[a], #96]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[25] * A[50]\n\t" - "ldr r10, [%[a], #200]\n\t" - "ldr r8, [%[a], #100]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[26] * A[49]\n\t" - "ldr r10, [%[a], #196]\n\t" - "ldr r8, [%[a], #104]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[27] * A[48]\n\t" - "ldr r10, [%[a], #192]\n\t" - "ldr r8, [%[a], #108]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[28] * A[47]\n\t" - "ldr r10, [%[a], #188]\n\t" - "ldr r8, [%[a], #112]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[29] * A[46]\n\t" - "ldr r10, [%[a], #184]\n\t" - "ldr r8, [%[a], #116]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[30] * A[45]\n\t" - "ldr r10, [%[a], #180]\n\t" - "ldr r8, [%[a], #120]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[31] * A[44]\n\t" - "ldr r10, [%[a], #176]\n\t" - "ldr r8, [%[a], #124]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[32] * A[43]\n\t" - "ldr r10, [%[a], #172]\n\t" - "ldr r8, [%[a], #128]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[33] * A[42]\n\t" - "ldr r10, [%[a], #168]\n\t" - "ldr r8, [%[a], #132]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[34] * A[41]\n\t" - "ldr r10, [%[a], #164]\n\t" - "ldr r8, [%[a], #136]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[35] * A[40]\n\t" - "ldr r10, [%[a], #160]\n\t" - "ldr r8, [%[a], #140]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[36] * A[39]\n\t" - "ldr r10, [%[a], #156]\n\t" - "ldr r8, [%[a], #144]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[37] * A[38]\n\t" - "ldr r10, [%[a], #152]\n\t" - "ldr r8, [%[a], #148]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r2, r2, r5\n\t" - "adcs r3, r3, r6\n\t" - "adc r4, r4, r7\n\t" - "str r2, [%[r], #300]\n\t" - "# A[13] * A[63]\n\t" - "ldr r10, [%[a], #252]\n\t" - "ldr r8, [%[a], #52]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r2, #0\n\t" - "mov r7, #0\n\t" - "# A[14] * A[62]\n\t" - "ldr r10, [%[a], #248]\n\t" - "ldr r8, [%[a], #56]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[15] * A[61]\n\t" - "ldr r10, [%[a], #244]\n\t" - "ldr r8, [%[a], #60]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[16] * A[60]\n\t" - "ldr r10, [%[a], #240]\n\t" - "ldr r8, [%[a], #64]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[17] * A[59]\n\t" - "ldr r10, [%[a], #236]\n\t" - "ldr r8, [%[a], #68]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[18] * A[58]\n\t" - "ldr r10, [%[a], #232]\n\t" - "ldr r8, [%[a], #72]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[19] * A[57]\n\t" - "ldr r10, [%[a], #228]\n\t" - "ldr r8, [%[a], #76]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[20] * A[56]\n\t" - "ldr r10, [%[a], #224]\n\t" - "ldr r8, [%[a], #80]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[21] * A[55]\n\t" - "ldr r10, [%[a], #220]\n\t" - "ldr r8, [%[a], #84]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[22] * A[54]\n\t" - "ldr r10, [%[a], #216]\n\t" - "ldr r8, [%[a], #88]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[23] * A[53]\n\t" - "ldr r10, [%[a], #212]\n\t" - "ldr r8, [%[a], #92]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[24] * A[52]\n\t" - "ldr r10, [%[a], #208]\n\t" - "ldr r8, [%[a], #96]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[25] * A[51]\n\t" - "ldr r10, [%[a], #204]\n\t" - "ldr r8, [%[a], #100]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[26] * A[50]\n\t" - "ldr r10, [%[a], #200]\n\t" - "ldr r8, [%[a], #104]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[27] * A[49]\n\t" - "ldr r10, [%[a], #196]\n\t" - "ldr r8, [%[a], #108]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[28] * A[48]\n\t" - "ldr r10, [%[a], #192]\n\t" - "ldr r8, [%[a], #112]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[29] * A[47]\n\t" - "ldr r10, [%[a], #188]\n\t" - "ldr r8, [%[a], #116]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[30] * A[46]\n\t" - "ldr r10, [%[a], #184]\n\t" - "ldr r8, [%[a], #120]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[31] * A[45]\n\t" - "ldr r10, [%[a], #180]\n\t" - "ldr r8, [%[a], #124]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[32] * A[44]\n\t" - "ldr r10, [%[a], #176]\n\t" - "ldr r8, [%[a], #128]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[33] * A[43]\n\t" - "ldr r10, [%[a], #172]\n\t" - "ldr r8, [%[a], #132]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[34] * A[42]\n\t" - "ldr r10, [%[a], #168]\n\t" - "ldr r8, [%[a], #136]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[35] * A[41]\n\t" - "ldr r10, [%[a], #164]\n\t" - "ldr r8, [%[a], #140]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[36] * A[40]\n\t" - "ldr r10, [%[a], #160]\n\t" - "ldr r8, [%[a], #144]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[37] * A[39]\n\t" - "ldr r10, [%[a], #156]\n\t" - "ldr r8, [%[a], #148]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[38] * A[38]\n\t" - "ldr r10, [%[a], #152]\n\t" - "umull r8, r9, r10, r10\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r3, r3, r5\n\t" - "adcs r4, r4, r6\n\t" - "adc r2, r2, r7\n\t" - "str r3, [%[r], #304]\n\t" - "# A[14] * A[63]\n\t" - "ldr r10, [%[a], #252]\n\t" - "ldr r8, [%[a], #56]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r3, #0\n\t" - "mov r7, #0\n\t" - "# A[15] * A[62]\n\t" - "ldr r10, [%[a], #248]\n\t" - "ldr r8, [%[a], #60]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[16] * A[61]\n\t" - "ldr r10, [%[a], #244]\n\t" - "ldr r8, [%[a], #64]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[17] * A[60]\n\t" - "ldr r10, [%[a], #240]\n\t" - "ldr r8, [%[a], #68]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[18] * A[59]\n\t" - "ldr r10, [%[a], #236]\n\t" - "ldr r8, [%[a], #72]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[19] * A[58]\n\t" - "ldr r10, [%[a], #232]\n\t" - "ldr r8, [%[a], #76]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[20] * A[57]\n\t" - "ldr r10, [%[a], #228]\n\t" - "ldr r8, [%[a], #80]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[21] * A[56]\n\t" - "ldr r10, [%[a], #224]\n\t" - "ldr r8, [%[a], #84]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[22] * A[55]\n\t" - "ldr r10, [%[a], #220]\n\t" - "ldr r8, [%[a], #88]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[23] * A[54]\n\t" - "ldr r10, [%[a], #216]\n\t" - "ldr r8, [%[a], #92]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[24] * A[53]\n\t" - "ldr r10, [%[a], #212]\n\t" - "ldr r8, [%[a], #96]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[25] * A[52]\n\t" - "ldr r10, [%[a], #208]\n\t" - "ldr r8, [%[a], #100]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[26] * A[51]\n\t" - "ldr r10, [%[a], #204]\n\t" - "ldr r8, [%[a], #104]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[27] * A[50]\n\t" - "ldr r10, [%[a], #200]\n\t" - "ldr r8, [%[a], #108]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[28] * A[49]\n\t" - "ldr r10, [%[a], #196]\n\t" - "ldr r8, [%[a], #112]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[29] * A[48]\n\t" - "ldr r10, [%[a], #192]\n\t" - "ldr r8, [%[a], #116]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[30] * A[47]\n\t" - "ldr r10, [%[a], #188]\n\t" - "ldr r8, [%[a], #120]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[31] * A[46]\n\t" - "ldr r10, [%[a], #184]\n\t" - "ldr r8, [%[a], #124]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[32] * A[45]\n\t" - "ldr r10, [%[a], #180]\n\t" - "ldr r8, [%[a], #128]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[33] * A[44]\n\t" - "ldr r10, [%[a], #176]\n\t" - "ldr r8, [%[a], #132]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[34] * A[43]\n\t" - "ldr r10, [%[a], #172]\n\t" - "ldr r8, [%[a], #136]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[35] * A[42]\n\t" - "ldr r10, [%[a], #168]\n\t" - "ldr r8, [%[a], #140]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[36] * A[41]\n\t" - "ldr r10, [%[a], #164]\n\t" - "ldr r8, [%[a], #144]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[37] * A[40]\n\t" - "ldr r10, [%[a], #160]\n\t" - "ldr r8, [%[a], #148]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[38] * A[39]\n\t" - "ldr r10, [%[a], #156]\n\t" - "ldr r8, [%[a], #152]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r4, r4, r5\n\t" - "adcs r2, r2, r6\n\t" - "adc r3, r3, r7\n\t" - "str r4, [%[r], #308]\n\t" - "# A[15] * A[63]\n\t" - "ldr r10, [%[a], #252]\n\t" - "ldr r8, [%[a], #60]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r4, #0\n\t" - "mov r7, #0\n\t" - "# A[16] * A[62]\n\t" - "ldr r10, [%[a], #248]\n\t" - "ldr r8, [%[a], #64]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[17] * A[61]\n\t" - "ldr r10, [%[a], #244]\n\t" - "ldr r8, [%[a], #68]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[18] * A[60]\n\t" - "ldr r10, [%[a], #240]\n\t" - "ldr r8, [%[a], #72]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[19] * A[59]\n\t" - "ldr r10, [%[a], #236]\n\t" - "ldr r8, [%[a], #76]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[20] * A[58]\n\t" - "ldr r10, [%[a], #232]\n\t" - "ldr r8, [%[a], #80]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[21] * A[57]\n\t" - "ldr r10, [%[a], #228]\n\t" - "ldr r8, [%[a], #84]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[22] * A[56]\n\t" - "ldr r10, [%[a], #224]\n\t" - "ldr r8, [%[a], #88]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[23] * A[55]\n\t" - "ldr r10, [%[a], #220]\n\t" - "ldr r8, [%[a], #92]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[24] * A[54]\n\t" - "ldr r10, [%[a], #216]\n\t" - "ldr r8, [%[a], #96]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[25] * A[53]\n\t" - "ldr r10, [%[a], #212]\n\t" - "ldr r8, [%[a], #100]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[26] * A[52]\n\t" - "ldr r10, [%[a], #208]\n\t" - "ldr r8, [%[a], #104]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[27] * A[51]\n\t" - "ldr r10, [%[a], #204]\n\t" - "ldr r8, [%[a], #108]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[28] * A[50]\n\t" - "ldr r10, [%[a], #200]\n\t" - "ldr r8, [%[a], #112]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[29] * A[49]\n\t" - "ldr r10, [%[a], #196]\n\t" - "ldr r8, [%[a], #116]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[30] * A[48]\n\t" - "ldr r10, [%[a], #192]\n\t" - "ldr r8, [%[a], #120]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[31] * A[47]\n\t" - "ldr r10, [%[a], #188]\n\t" - "ldr r8, [%[a], #124]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[32] * A[46]\n\t" - "ldr r10, [%[a], #184]\n\t" - "ldr r8, [%[a], #128]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[33] * A[45]\n\t" - "ldr r10, [%[a], #180]\n\t" - "ldr r8, [%[a], #132]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[34] * A[44]\n\t" - "ldr r10, [%[a], #176]\n\t" - "ldr r8, [%[a], #136]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[35] * A[43]\n\t" - "ldr r10, [%[a], #172]\n\t" - "ldr r8, [%[a], #140]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[36] * A[42]\n\t" - "ldr r10, [%[a], #168]\n\t" - "ldr r8, [%[a], #144]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[37] * A[41]\n\t" - "ldr r10, [%[a], #164]\n\t" - "ldr r8, [%[a], #148]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[38] * A[40]\n\t" - "ldr r10, [%[a], #160]\n\t" - "ldr r8, [%[a], #152]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[39] * A[39]\n\t" - "ldr r10, [%[a], #156]\n\t" - "umull r8, r9, r10, r10\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r2, r2, r5\n\t" - "adcs r3, r3, r6\n\t" - "adc r4, r4, r7\n\t" - "str r2, [%[r], #312]\n\t" - "# A[16] * A[63]\n\t" - "ldr r10, [%[a], #252]\n\t" - "ldr r8, [%[a], #64]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r2, #0\n\t" - "mov r7, #0\n\t" - "# A[17] * A[62]\n\t" - "ldr r10, [%[a], #248]\n\t" - "ldr r8, [%[a], #68]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[18] * A[61]\n\t" - "ldr r10, [%[a], #244]\n\t" - "ldr r8, [%[a], #72]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[19] * A[60]\n\t" - "ldr r10, [%[a], #240]\n\t" - "ldr r8, [%[a], #76]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[20] * A[59]\n\t" - "ldr r10, [%[a], #236]\n\t" - "ldr r8, [%[a], #80]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[21] * A[58]\n\t" - "ldr r10, [%[a], #232]\n\t" - "ldr r8, [%[a], #84]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[22] * A[57]\n\t" - "ldr r10, [%[a], #228]\n\t" - "ldr r8, [%[a], #88]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[23] * A[56]\n\t" - "ldr r10, [%[a], #224]\n\t" - "ldr r8, [%[a], #92]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[24] * A[55]\n\t" - "ldr r10, [%[a], #220]\n\t" - "ldr r8, [%[a], #96]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[25] * A[54]\n\t" - "ldr r10, [%[a], #216]\n\t" - "ldr r8, [%[a], #100]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[26] * A[53]\n\t" - "ldr r10, [%[a], #212]\n\t" - "ldr r8, [%[a], #104]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[27] * A[52]\n\t" - "ldr r10, [%[a], #208]\n\t" - "ldr r8, [%[a], #108]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[28] * A[51]\n\t" - "ldr r10, [%[a], #204]\n\t" - "ldr r8, [%[a], #112]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[29] * A[50]\n\t" - "ldr r10, [%[a], #200]\n\t" - "ldr r8, [%[a], #116]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[30] * A[49]\n\t" - "ldr r10, [%[a], #196]\n\t" - "ldr r8, [%[a], #120]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[31] * A[48]\n\t" - "ldr r10, [%[a], #192]\n\t" - "ldr r8, [%[a], #124]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[32] * A[47]\n\t" - "ldr r10, [%[a], #188]\n\t" - "ldr r8, [%[a], #128]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[33] * A[46]\n\t" - "ldr r10, [%[a], #184]\n\t" - "ldr r8, [%[a], #132]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[34] * A[45]\n\t" - "ldr r10, [%[a], #180]\n\t" - "ldr r8, [%[a], #136]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[35] * A[44]\n\t" - "ldr r10, [%[a], #176]\n\t" - "ldr r8, [%[a], #140]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[36] * A[43]\n\t" - "ldr r10, [%[a], #172]\n\t" - "ldr r8, [%[a], #144]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[37] * A[42]\n\t" - "ldr r10, [%[a], #168]\n\t" - "ldr r8, [%[a], #148]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[38] * A[41]\n\t" - "ldr r10, [%[a], #164]\n\t" - "ldr r8, [%[a], #152]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[39] * A[40]\n\t" - "ldr r10, [%[a], #160]\n\t" - "ldr r8, [%[a], #156]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r3, r3, r5\n\t" - "adcs r4, r4, r6\n\t" - "adc r2, r2, r7\n\t" - "str r3, [%[r], #316]\n\t" - "# A[17] * A[63]\n\t" - "ldr r10, [%[a], #252]\n\t" - "ldr r8, [%[a], #68]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r3, #0\n\t" - "mov r7, #0\n\t" - "# A[18] * A[62]\n\t" - "ldr r10, [%[a], #248]\n\t" - "ldr r8, [%[a], #72]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[19] * A[61]\n\t" - "ldr r10, [%[a], #244]\n\t" - "ldr r8, [%[a], #76]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[20] * A[60]\n\t" - "ldr r10, [%[a], #240]\n\t" - "ldr r8, [%[a], #80]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[21] * A[59]\n\t" - "ldr r10, [%[a], #236]\n\t" - "ldr r8, [%[a], #84]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[22] * A[58]\n\t" - "ldr r10, [%[a], #232]\n\t" - "ldr r8, [%[a], #88]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[23] * A[57]\n\t" - "ldr r10, [%[a], #228]\n\t" - "ldr r8, [%[a], #92]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[24] * A[56]\n\t" - "ldr r10, [%[a], #224]\n\t" - "ldr r8, [%[a], #96]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[25] * A[55]\n\t" - "ldr r10, [%[a], #220]\n\t" - "ldr r8, [%[a], #100]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[26] * A[54]\n\t" - "ldr r10, [%[a], #216]\n\t" - "ldr r8, [%[a], #104]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[27] * A[53]\n\t" - "ldr r10, [%[a], #212]\n\t" - "ldr r8, [%[a], #108]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[28] * A[52]\n\t" - "ldr r10, [%[a], #208]\n\t" - "ldr r8, [%[a], #112]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[29] * A[51]\n\t" - "ldr r10, [%[a], #204]\n\t" - "ldr r8, [%[a], #116]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[30] * A[50]\n\t" - "ldr r10, [%[a], #200]\n\t" - "ldr r8, [%[a], #120]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[31] * A[49]\n\t" - "ldr r10, [%[a], #196]\n\t" - "ldr r8, [%[a], #124]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[32] * A[48]\n\t" - "ldr r10, [%[a], #192]\n\t" - "ldr r8, [%[a], #128]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[33] * A[47]\n\t" - "ldr r10, [%[a], #188]\n\t" - "ldr r8, [%[a], #132]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[34] * A[46]\n\t" - "ldr r10, [%[a], #184]\n\t" - "ldr r8, [%[a], #136]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[35] * A[45]\n\t" - "ldr r10, [%[a], #180]\n\t" - "ldr r8, [%[a], #140]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[36] * A[44]\n\t" - "ldr r10, [%[a], #176]\n\t" - "ldr r8, [%[a], #144]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[37] * A[43]\n\t" - "ldr r10, [%[a], #172]\n\t" - "ldr r8, [%[a], #148]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[38] * A[42]\n\t" - "ldr r10, [%[a], #168]\n\t" - "ldr r8, [%[a], #152]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[39] * A[41]\n\t" - "ldr r10, [%[a], #164]\n\t" - "ldr r8, [%[a], #156]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[40] * A[40]\n\t" - "ldr r10, [%[a], #160]\n\t" - "umull r8, r9, r10, r10\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r4, r4, r5\n\t" - "adcs r2, r2, r6\n\t" - "adc r3, r3, r7\n\t" - "str r4, [%[r], #320]\n\t" - "# A[18] * A[63]\n\t" - "ldr r10, [%[a], #252]\n\t" - "ldr r8, [%[a], #72]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r4, #0\n\t" - "mov r7, #0\n\t" - "# A[19] * A[62]\n\t" - "ldr r10, [%[a], #248]\n\t" - "ldr r8, [%[a], #76]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[20] * A[61]\n\t" - "ldr r10, [%[a], #244]\n\t" - "ldr r8, [%[a], #80]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[21] * A[60]\n\t" - "ldr r10, [%[a], #240]\n\t" - "ldr r8, [%[a], #84]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[22] * A[59]\n\t" - "ldr r10, [%[a], #236]\n\t" - "ldr r8, [%[a], #88]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[23] * A[58]\n\t" - "ldr r10, [%[a], #232]\n\t" - "ldr r8, [%[a], #92]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[24] * A[57]\n\t" - "ldr r10, [%[a], #228]\n\t" - "ldr r8, [%[a], #96]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[25] * A[56]\n\t" - "ldr r10, [%[a], #224]\n\t" - "ldr r8, [%[a], #100]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[26] * A[55]\n\t" - "ldr r10, [%[a], #220]\n\t" - "ldr r8, [%[a], #104]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[27] * A[54]\n\t" - "ldr r10, [%[a], #216]\n\t" - "ldr r8, [%[a], #108]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[28] * A[53]\n\t" - "ldr r10, [%[a], #212]\n\t" - "ldr r8, [%[a], #112]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[29] * A[52]\n\t" - "ldr r10, [%[a], #208]\n\t" - "ldr r8, [%[a], #116]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[30] * A[51]\n\t" - "ldr r10, [%[a], #204]\n\t" - "ldr r8, [%[a], #120]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[31] * A[50]\n\t" - "ldr r10, [%[a], #200]\n\t" - "ldr r8, [%[a], #124]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[32] * A[49]\n\t" - "ldr r10, [%[a], #196]\n\t" - "ldr r8, [%[a], #128]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[33] * A[48]\n\t" - "ldr r10, [%[a], #192]\n\t" - "ldr r8, [%[a], #132]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[34] * A[47]\n\t" - "ldr r10, [%[a], #188]\n\t" - "ldr r8, [%[a], #136]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[35] * A[46]\n\t" - "ldr r10, [%[a], #184]\n\t" - "ldr r8, [%[a], #140]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[36] * A[45]\n\t" - "ldr r10, [%[a], #180]\n\t" - "ldr r8, [%[a], #144]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[37] * A[44]\n\t" - "ldr r10, [%[a], #176]\n\t" - "ldr r8, [%[a], #148]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[38] * A[43]\n\t" - "ldr r10, [%[a], #172]\n\t" - "ldr r8, [%[a], #152]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[39] * A[42]\n\t" - "ldr r10, [%[a], #168]\n\t" - "ldr r8, [%[a], #156]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[40] * A[41]\n\t" - "ldr r10, [%[a], #164]\n\t" - "ldr r8, [%[a], #160]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r2, r2, r5\n\t" - "adcs r3, r3, r6\n\t" - "adc r4, r4, r7\n\t" - "str r2, [%[r], #324]\n\t" - "# A[19] * A[63]\n\t" - "ldr r10, [%[a], #252]\n\t" - "ldr r8, [%[a], #76]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r2, #0\n\t" - "mov r7, #0\n\t" - "# A[20] * A[62]\n\t" - "ldr r10, [%[a], #248]\n\t" - "ldr r8, [%[a], #80]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[21] * A[61]\n\t" - "ldr r10, [%[a], #244]\n\t" - "ldr r8, [%[a], #84]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[22] * A[60]\n\t" - "ldr r10, [%[a], #240]\n\t" - "ldr r8, [%[a], #88]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[23] * A[59]\n\t" - "ldr r10, [%[a], #236]\n\t" - "ldr r8, [%[a], #92]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[24] * A[58]\n\t" - "ldr r10, [%[a], #232]\n\t" - "ldr r8, [%[a], #96]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[25] * A[57]\n\t" - "ldr r10, [%[a], #228]\n\t" - "ldr r8, [%[a], #100]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[26] * A[56]\n\t" - "ldr r10, [%[a], #224]\n\t" - "ldr r8, [%[a], #104]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[27] * A[55]\n\t" - "ldr r10, [%[a], #220]\n\t" - "ldr r8, [%[a], #108]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[28] * A[54]\n\t" - "ldr r10, [%[a], #216]\n\t" - "ldr r8, [%[a], #112]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[29] * A[53]\n\t" - "ldr r10, [%[a], #212]\n\t" - "ldr r8, [%[a], #116]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[30] * A[52]\n\t" - "ldr r10, [%[a], #208]\n\t" - "ldr r8, [%[a], #120]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[31] * A[51]\n\t" - "ldr r10, [%[a], #204]\n\t" - "ldr r8, [%[a], #124]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[32] * A[50]\n\t" - "ldr r10, [%[a], #200]\n\t" - "ldr r8, [%[a], #128]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[33] * A[49]\n\t" - "ldr r10, [%[a], #196]\n\t" - "ldr r8, [%[a], #132]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[34] * A[48]\n\t" - "ldr r10, [%[a], #192]\n\t" - "ldr r8, [%[a], #136]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[35] * A[47]\n\t" - "ldr r10, [%[a], #188]\n\t" - "ldr r8, [%[a], #140]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[36] * A[46]\n\t" - "ldr r10, [%[a], #184]\n\t" - "ldr r8, [%[a], #144]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[37] * A[45]\n\t" - "ldr r10, [%[a], #180]\n\t" - "ldr r8, [%[a], #148]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[38] * A[44]\n\t" - "ldr r10, [%[a], #176]\n\t" - "ldr r8, [%[a], #152]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[39] * A[43]\n\t" - "ldr r10, [%[a], #172]\n\t" - "ldr r8, [%[a], #156]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[40] * A[42]\n\t" - "ldr r10, [%[a], #168]\n\t" - "ldr r8, [%[a], #160]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[41] * A[41]\n\t" - "ldr r10, [%[a], #164]\n\t" - "umull r8, r9, r10, r10\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r3, r3, r5\n\t" - "adcs r4, r4, r6\n\t" - "adc r2, r2, r7\n\t" - "str r3, [%[r], #328]\n\t" - "# A[20] * A[63]\n\t" - "ldr r10, [%[a], #252]\n\t" - "ldr r8, [%[a], #80]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r3, #0\n\t" - "mov r7, #0\n\t" - "# A[21] * A[62]\n\t" - "ldr r10, [%[a], #248]\n\t" - "ldr r8, [%[a], #84]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[22] * A[61]\n\t" - "ldr r10, [%[a], #244]\n\t" - "ldr r8, [%[a], #88]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[23] * A[60]\n\t" - "ldr r10, [%[a], #240]\n\t" - "ldr r8, [%[a], #92]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[24] * A[59]\n\t" - "ldr r10, [%[a], #236]\n\t" - "ldr r8, [%[a], #96]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[25] * A[58]\n\t" - "ldr r10, [%[a], #232]\n\t" - "ldr r8, [%[a], #100]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[26] * A[57]\n\t" - "ldr r10, [%[a], #228]\n\t" - "ldr r8, [%[a], #104]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[27] * A[56]\n\t" - "ldr r10, [%[a], #224]\n\t" - "ldr r8, [%[a], #108]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[28] * A[55]\n\t" - "ldr r10, [%[a], #220]\n\t" - "ldr r8, [%[a], #112]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[29] * A[54]\n\t" - "ldr r10, [%[a], #216]\n\t" - "ldr r8, [%[a], #116]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[30] * A[53]\n\t" - "ldr r10, [%[a], #212]\n\t" - "ldr r8, [%[a], #120]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[31] * A[52]\n\t" - "ldr r10, [%[a], #208]\n\t" - "ldr r8, [%[a], #124]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[32] * A[51]\n\t" - "ldr r10, [%[a], #204]\n\t" - "ldr r8, [%[a], #128]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[33] * A[50]\n\t" - "ldr r10, [%[a], #200]\n\t" - "ldr r8, [%[a], #132]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[34] * A[49]\n\t" - "ldr r10, [%[a], #196]\n\t" - "ldr r8, [%[a], #136]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[35] * A[48]\n\t" - "ldr r10, [%[a], #192]\n\t" - "ldr r8, [%[a], #140]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[36] * A[47]\n\t" - "ldr r10, [%[a], #188]\n\t" - "ldr r8, [%[a], #144]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[37] * A[46]\n\t" - "ldr r10, [%[a], #184]\n\t" - "ldr r8, [%[a], #148]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[38] * A[45]\n\t" - "ldr r10, [%[a], #180]\n\t" - "ldr r8, [%[a], #152]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[39] * A[44]\n\t" - "ldr r10, [%[a], #176]\n\t" - "ldr r8, [%[a], #156]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[40] * A[43]\n\t" - "ldr r10, [%[a], #172]\n\t" - "ldr r8, [%[a], #160]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[41] * A[42]\n\t" - "ldr r10, [%[a], #168]\n\t" - "ldr r8, [%[a], #164]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r4, r4, r5\n\t" - "adcs r2, r2, r6\n\t" - "adc r3, r3, r7\n\t" - "str r4, [%[r], #332]\n\t" - "# A[21] * A[63]\n\t" - "ldr r10, [%[a], #252]\n\t" - "ldr r8, [%[a], #84]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r4, #0\n\t" - "mov r7, #0\n\t" - "# A[22] * A[62]\n\t" - "ldr r10, [%[a], #248]\n\t" - "ldr r8, [%[a], #88]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[23] * A[61]\n\t" - "ldr r10, [%[a], #244]\n\t" - "ldr r8, [%[a], #92]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[24] * A[60]\n\t" - "ldr r10, [%[a], #240]\n\t" - "ldr r8, [%[a], #96]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[25] * A[59]\n\t" - "ldr r10, [%[a], #236]\n\t" - "ldr r8, [%[a], #100]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[26] * A[58]\n\t" - "ldr r10, [%[a], #232]\n\t" - "ldr r8, [%[a], #104]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[27] * A[57]\n\t" - "ldr r10, [%[a], #228]\n\t" - "ldr r8, [%[a], #108]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[28] * A[56]\n\t" - "ldr r10, [%[a], #224]\n\t" - "ldr r8, [%[a], #112]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[29] * A[55]\n\t" - "ldr r10, [%[a], #220]\n\t" - "ldr r8, [%[a], #116]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[30] * A[54]\n\t" - "ldr r10, [%[a], #216]\n\t" - "ldr r8, [%[a], #120]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[31] * A[53]\n\t" - "ldr r10, [%[a], #212]\n\t" - "ldr r8, [%[a], #124]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[32] * A[52]\n\t" - "ldr r10, [%[a], #208]\n\t" - "ldr r8, [%[a], #128]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[33] * A[51]\n\t" - "ldr r10, [%[a], #204]\n\t" - "ldr r8, [%[a], #132]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[34] * A[50]\n\t" - "ldr r10, [%[a], #200]\n\t" - "ldr r8, [%[a], #136]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[35] * A[49]\n\t" - "ldr r10, [%[a], #196]\n\t" - "ldr r8, [%[a], #140]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[36] * A[48]\n\t" - "ldr r10, [%[a], #192]\n\t" - "ldr r8, [%[a], #144]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[37] * A[47]\n\t" - "ldr r10, [%[a], #188]\n\t" - "ldr r8, [%[a], #148]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[38] * A[46]\n\t" - "ldr r10, [%[a], #184]\n\t" - "ldr r8, [%[a], #152]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[39] * A[45]\n\t" - "ldr r10, [%[a], #180]\n\t" - "ldr r8, [%[a], #156]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[40] * A[44]\n\t" - "ldr r10, [%[a], #176]\n\t" - "ldr r8, [%[a], #160]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[41] * A[43]\n\t" - "ldr r10, [%[a], #172]\n\t" - "ldr r8, [%[a], #164]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[42] * A[42]\n\t" - "ldr r10, [%[a], #168]\n\t" - "umull r8, r9, r10, r10\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r2, r2, r5\n\t" - "adcs r3, r3, r6\n\t" - "adc r4, r4, r7\n\t" - "str r2, [%[r], #336]\n\t" - "# A[22] * A[63]\n\t" - "ldr r10, [%[a], #252]\n\t" - "ldr r8, [%[a], #88]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r2, #0\n\t" - "mov r7, #0\n\t" - "# A[23] * A[62]\n\t" - "ldr r10, [%[a], #248]\n\t" - "ldr r8, [%[a], #92]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[24] * A[61]\n\t" - "ldr r10, [%[a], #244]\n\t" - "ldr r8, [%[a], #96]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[25] * A[60]\n\t" - "ldr r10, [%[a], #240]\n\t" - "ldr r8, [%[a], #100]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[26] * A[59]\n\t" - "ldr r10, [%[a], #236]\n\t" - "ldr r8, [%[a], #104]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[27] * A[58]\n\t" - "ldr r10, [%[a], #232]\n\t" - "ldr r8, [%[a], #108]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[28] * A[57]\n\t" - "ldr r10, [%[a], #228]\n\t" - "ldr r8, [%[a], #112]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[29] * A[56]\n\t" - "ldr r10, [%[a], #224]\n\t" - "ldr r8, [%[a], #116]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[30] * A[55]\n\t" - "ldr r10, [%[a], #220]\n\t" - "ldr r8, [%[a], #120]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[31] * A[54]\n\t" - "ldr r10, [%[a], #216]\n\t" - "ldr r8, [%[a], #124]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[32] * A[53]\n\t" - "ldr r10, [%[a], #212]\n\t" - "ldr r8, [%[a], #128]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[33] * A[52]\n\t" - "ldr r10, [%[a], #208]\n\t" - "ldr r8, [%[a], #132]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[34] * A[51]\n\t" - "ldr r10, [%[a], #204]\n\t" - "ldr r8, [%[a], #136]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[35] * A[50]\n\t" - "ldr r10, [%[a], #200]\n\t" - "ldr r8, [%[a], #140]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[36] * A[49]\n\t" - "ldr r10, [%[a], #196]\n\t" - "ldr r8, [%[a], #144]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[37] * A[48]\n\t" - "ldr r10, [%[a], #192]\n\t" - "ldr r8, [%[a], #148]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[38] * A[47]\n\t" - "ldr r10, [%[a], #188]\n\t" - "ldr r8, [%[a], #152]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[39] * A[46]\n\t" - "ldr r10, [%[a], #184]\n\t" - "ldr r8, [%[a], #156]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[40] * A[45]\n\t" - "ldr r10, [%[a], #180]\n\t" - "ldr r8, [%[a], #160]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[41] * A[44]\n\t" - "ldr r10, [%[a], #176]\n\t" - "ldr r8, [%[a], #164]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[42] * A[43]\n\t" - "ldr r10, [%[a], #172]\n\t" - "ldr r8, [%[a], #168]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r3, r3, r5\n\t" - "adcs r4, r4, r6\n\t" - "adc r2, r2, r7\n\t" - "str r3, [%[r], #340]\n\t" - "# A[23] * A[63]\n\t" - "ldr r10, [%[a], #252]\n\t" - "ldr r8, [%[a], #92]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r3, #0\n\t" - "mov r7, #0\n\t" - "# A[24] * A[62]\n\t" - "ldr r10, [%[a], #248]\n\t" - "ldr r8, [%[a], #96]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[25] * A[61]\n\t" - "ldr r10, [%[a], #244]\n\t" - "ldr r8, [%[a], #100]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[26] * A[60]\n\t" - "ldr r10, [%[a], #240]\n\t" - "ldr r8, [%[a], #104]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[27] * A[59]\n\t" - "ldr r10, [%[a], #236]\n\t" - "ldr r8, [%[a], #108]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[28] * A[58]\n\t" - "ldr r10, [%[a], #232]\n\t" - "ldr r8, [%[a], #112]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[29] * A[57]\n\t" - "ldr r10, [%[a], #228]\n\t" - "ldr r8, [%[a], #116]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[30] * A[56]\n\t" - "ldr r10, [%[a], #224]\n\t" - "ldr r8, [%[a], #120]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[31] * A[55]\n\t" - "ldr r10, [%[a], #220]\n\t" - "ldr r8, [%[a], #124]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[32] * A[54]\n\t" - "ldr r10, [%[a], #216]\n\t" - "ldr r8, [%[a], #128]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[33] * A[53]\n\t" - "ldr r10, [%[a], #212]\n\t" - "ldr r8, [%[a], #132]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[34] * A[52]\n\t" - "ldr r10, [%[a], #208]\n\t" - "ldr r8, [%[a], #136]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[35] * A[51]\n\t" - "ldr r10, [%[a], #204]\n\t" - "ldr r8, [%[a], #140]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[36] * A[50]\n\t" - "ldr r10, [%[a], #200]\n\t" - "ldr r8, [%[a], #144]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[37] * A[49]\n\t" - "ldr r10, [%[a], #196]\n\t" - "ldr r8, [%[a], #148]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[38] * A[48]\n\t" - "ldr r10, [%[a], #192]\n\t" - "ldr r8, [%[a], #152]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[39] * A[47]\n\t" - "ldr r10, [%[a], #188]\n\t" - "ldr r8, [%[a], #156]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[40] * A[46]\n\t" - "ldr r10, [%[a], #184]\n\t" - "ldr r8, [%[a], #160]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[41] * A[45]\n\t" - "ldr r10, [%[a], #180]\n\t" - "ldr r8, [%[a], #164]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[42] * A[44]\n\t" - "ldr r10, [%[a], #176]\n\t" - "ldr r8, [%[a], #168]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[43] * A[43]\n\t" - "ldr r10, [%[a], #172]\n\t" - "umull r8, r9, r10, r10\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r4, r4, r5\n\t" - "adcs r2, r2, r6\n\t" - "adc r3, r3, r7\n\t" - "str r4, [%[r], #344]\n\t" - "# A[24] * A[63]\n\t" - "ldr r10, [%[a], #252]\n\t" - "ldr r8, [%[a], #96]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r4, #0\n\t" - "mov r7, #0\n\t" - "# A[25] * A[62]\n\t" - "ldr r10, [%[a], #248]\n\t" - "ldr r8, [%[a], #100]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[26] * A[61]\n\t" - "ldr r10, [%[a], #244]\n\t" - "ldr r8, [%[a], #104]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[27] * A[60]\n\t" - "ldr r10, [%[a], #240]\n\t" - "ldr r8, [%[a], #108]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[28] * A[59]\n\t" - "ldr r10, [%[a], #236]\n\t" - "ldr r8, [%[a], #112]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[29] * A[58]\n\t" - "ldr r10, [%[a], #232]\n\t" - "ldr r8, [%[a], #116]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[30] * A[57]\n\t" - "ldr r10, [%[a], #228]\n\t" - "ldr r8, [%[a], #120]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[31] * A[56]\n\t" - "ldr r10, [%[a], #224]\n\t" - "ldr r8, [%[a], #124]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[32] * A[55]\n\t" - "ldr r10, [%[a], #220]\n\t" - "ldr r8, [%[a], #128]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[33] * A[54]\n\t" - "ldr r10, [%[a], #216]\n\t" - "ldr r8, [%[a], #132]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[34] * A[53]\n\t" - "ldr r10, [%[a], #212]\n\t" - "ldr r8, [%[a], #136]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[35] * A[52]\n\t" - "ldr r10, [%[a], #208]\n\t" - "ldr r8, [%[a], #140]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[36] * A[51]\n\t" - "ldr r10, [%[a], #204]\n\t" - "ldr r8, [%[a], #144]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[37] * A[50]\n\t" - "ldr r10, [%[a], #200]\n\t" - "ldr r8, [%[a], #148]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[38] * A[49]\n\t" - "ldr r10, [%[a], #196]\n\t" - "ldr r8, [%[a], #152]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[39] * A[48]\n\t" - "ldr r10, [%[a], #192]\n\t" - "ldr r8, [%[a], #156]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[40] * A[47]\n\t" - "ldr r10, [%[a], #188]\n\t" - "ldr r8, [%[a], #160]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[41] * A[46]\n\t" - "ldr r10, [%[a], #184]\n\t" - "ldr r8, [%[a], #164]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[42] * A[45]\n\t" - "ldr r10, [%[a], #180]\n\t" - "ldr r8, [%[a], #168]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[43] * A[44]\n\t" - "ldr r10, [%[a], #176]\n\t" - "ldr r8, [%[a], #172]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r2, r2, r5\n\t" - "adcs r3, r3, r6\n\t" - "adc r4, r4, r7\n\t" - "str r2, [%[r], #348]\n\t" - "# A[25] * A[63]\n\t" - "ldr r10, [%[a], #252]\n\t" - "ldr r8, [%[a], #100]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r2, #0\n\t" - "mov r7, #0\n\t" - "# A[26] * A[62]\n\t" - "ldr r10, [%[a], #248]\n\t" - "ldr r8, [%[a], #104]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[27] * A[61]\n\t" - "ldr r10, [%[a], #244]\n\t" - "ldr r8, [%[a], #108]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[28] * A[60]\n\t" - "ldr r10, [%[a], #240]\n\t" - "ldr r8, [%[a], #112]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[29] * A[59]\n\t" - "ldr r10, [%[a], #236]\n\t" - "ldr r8, [%[a], #116]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[30] * A[58]\n\t" - "ldr r10, [%[a], #232]\n\t" - "ldr r8, [%[a], #120]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[31] * A[57]\n\t" - "ldr r10, [%[a], #228]\n\t" - "ldr r8, [%[a], #124]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[32] * A[56]\n\t" - "ldr r10, [%[a], #224]\n\t" - "ldr r8, [%[a], #128]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[33] * A[55]\n\t" - "ldr r10, [%[a], #220]\n\t" - "ldr r8, [%[a], #132]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[34] * A[54]\n\t" - "ldr r10, [%[a], #216]\n\t" - "ldr r8, [%[a], #136]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[35] * A[53]\n\t" - "ldr r10, [%[a], #212]\n\t" - "ldr r8, [%[a], #140]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[36] * A[52]\n\t" - "ldr r10, [%[a], #208]\n\t" - "ldr r8, [%[a], #144]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[37] * A[51]\n\t" - "ldr r10, [%[a], #204]\n\t" - "ldr r8, [%[a], #148]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[38] * A[50]\n\t" - "ldr r10, [%[a], #200]\n\t" - "ldr r8, [%[a], #152]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[39] * A[49]\n\t" - "ldr r10, [%[a], #196]\n\t" - "ldr r8, [%[a], #156]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[40] * A[48]\n\t" - "ldr r10, [%[a], #192]\n\t" - "ldr r8, [%[a], #160]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[41] * A[47]\n\t" - "ldr r10, [%[a], #188]\n\t" - "ldr r8, [%[a], #164]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[42] * A[46]\n\t" - "ldr r10, [%[a], #184]\n\t" - "ldr r8, [%[a], #168]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[43] * A[45]\n\t" - "ldr r10, [%[a], #180]\n\t" - "ldr r8, [%[a], #172]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[44] * A[44]\n\t" - "ldr r10, [%[a], #176]\n\t" - "umull r8, r9, r10, r10\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r3, r3, r5\n\t" - "adcs r4, r4, r6\n\t" - "adc r2, r2, r7\n\t" - "str r3, [%[r], #352]\n\t" - "# A[26] * A[63]\n\t" - "ldr r10, [%[a], #252]\n\t" - "ldr r8, [%[a], #104]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r3, #0\n\t" - "mov r7, #0\n\t" - "# A[27] * A[62]\n\t" - "ldr r10, [%[a], #248]\n\t" - "ldr r8, [%[a], #108]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[28] * A[61]\n\t" - "ldr r10, [%[a], #244]\n\t" - "ldr r8, [%[a], #112]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[29] * A[60]\n\t" - "ldr r10, [%[a], #240]\n\t" - "ldr r8, [%[a], #116]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[30] * A[59]\n\t" - "ldr r10, [%[a], #236]\n\t" - "ldr r8, [%[a], #120]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[31] * A[58]\n\t" - "ldr r10, [%[a], #232]\n\t" - "ldr r8, [%[a], #124]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[32] * A[57]\n\t" - "ldr r10, [%[a], #228]\n\t" - "ldr r8, [%[a], #128]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[33] * A[56]\n\t" - "ldr r10, [%[a], #224]\n\t" - "ldr r8, [%[a], #132]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[34] * A[55]\n\t" - "ldr r10, [%[a], #220]\n\t" - "ldr r8, [%[a], #136]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[35] * A[54]\n\t" - "ldr r10, [%[a], #216]\n\t" - "ldr r8, [%[a], #140]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[36] * A[53]\n\t" - "ldr r10, [%[a], #212]\n\t" - "ldr r8, [%[a], #144]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[37] * A[52]\n\t" - "ldr r10, [%[a], #208]\n\t" - "ldr r8, [%[a], #148]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[38] * A[51]\n\t" - "ldr r10, [%[a], #204]\n\t" - "ldr r8, [%[a], #152]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[39] * A[50]\n\t" - "ldr r10, [%[a], #200]\n\t" - "ldr r8, [%[a], #156]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[40] * A[49]\n\t" - "ldr r10, [%[a], #196]\n\t" - "ldr r8, [%[a], #160]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[41] * A[48]\n\t" - "ldr r10, [%[a], #192]\n\t" - "ldr r8, [%[a], #164]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[42] * A[47]\n\t" - "ldr r10, [%[a], #188]\n\t" - "ldr r8, [%[a], #168]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[43] * A[46]\n\t" - "ldr r10, [%[a], #184]\n\t" - "ldr r8, [%[a], #172]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[44] * A[45]\n\t" - "ldr r10, [%[a], #180]\n\t" - "ldr r8, [%[a], #176]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r4, r4, r5\n\t" - "adcs r2, r2, r6\n\t" - "adc r3, r3, r7\n\t" - "str r4, [%[r], #356]\n\t" - "# A[27] * A[63]\n\t" - "ldr r10, [%[a], #252]\n\t" - "ldr r8, [%[a], #108]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r4, #0\n\t" - "mov r7, #0\n\t" - "# A[28] * A[62]\n\t" - "ldr r10, [%[a], #248]\n\t" - "ldr r8, [%[a], #112]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[29] * A[61]\n\t" - "ldr r10, [%[a], #244]\n\t" - "ldr r8, [%[a], #116]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[30] * A[60]\n\t" - "ldr r10, [%[a], #240]\n\t" - "ldr r8, [%[a], #120]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[31] * A[59]\n\t" - "ldr r10, [%[a], #236]\n\t" - "ldr r8, [%[a], #124]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[32] * A[58]\n\t" - "ldr r10, [%[a], #232]\n\t" - "ldr r8, [%[a], #128]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[33] * A[57]\n\t" - "ldr r10, [%[a], #228]\n\t" - "ldr r8, [%[a], #132]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[34] * A[56]\n\t" - "ldr r10, [%[a], #224]\n\t" - "ldr r8, [%[a], #136]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[35] * A[55]\n\t" - "ldr r10, [%[a], #220]\n\t" - "ldr r8, [%[a], #140]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[36] * A[54]\n\t" - "ldr r10, [%[a], #216]\n\t" - "ldr r8, [%[a], #144]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[37] * A[53]\n\t" - "ldr r10, [%[a], #212]\n\t" - "ldr r8, [%[a], #148]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[38] * A[52]\n\t" - "ldr r10, [%[a], #208]\n\t" - "ldr r8, [%[a], #152]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[39] * A[51]\n\t" - "ldr r10, [%[a], #204]\n\t" - "ldr r8, [%[a], #156]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[40] * A[50]\n\t" - "ldr r10, [%[a], #200]\n\t" - "ldr r8, [%[a], #160]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[41] * A[49]\n\t" - "ldr r10, [%[a], #196]\n\t" - "ldr r8, [%[a], #164]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[42] * A[48]\n\t" - "ldr r10, [%[a], #192]\n\t" - "ldr r8, [%[a], #168]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[43] * A[47]\n\t" - "ldr r10, [%[a], #188]\n\t" - "ldr r8, [%[a], #172]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[44] * A[46]\n\t" - "ldr r10, [%[a], #184]\n\t" - "ldr r8, [%[a], #176]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[45] * A[45]\n\t" - "ldr r10, [%[a], #180]\n\t" - "umull r8, r9, r10, r10\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r2, r2, r5\n\t" - "adcs r3, r3, r6\n\t" - "adc r4, r4, r7\n\t" - "str r2, [%[r], #360]\n\t" - "# A[28] * A[63]\n\t" - "ldr r10, [%[a], #252]\n\t" - "ldr r8, [%[a], #112]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r2, #0\n\t" - "mov r7, #0\n\t" - "# A[29] * A[62]\n\t" - "ldr r10, [%[a], #248]\n\t" - "ldr r8, [%[a], #116]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[30] * A[61]\n\t" - "ldr r10, [%[a], #244]\n\t" - "ldr r8, [%[a], #120]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[31] * A[60]\n\t" - "ldr r10, [%[a], #240]\n\t" - "ldr r8, [%[a], #124]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[32] * A[59]\n\t" - "ldr r10, [%[a], #236]\n\t" - "ldr r8, [%[a], #128]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[33] * A[58]\n\t" - "ldr r10, [%[a], #232]\n\t" - "ldr r8, [%[a], #132]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[34] * A[57]\n\t" - "ldr r10, [%[a], #228]\n\t" - "ldr r8, [%[a], #136]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[35] * A[56]\n\t" - "ldr r10, [%[a], #224]\n\t" - "ldr r8, [%[a], #140]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[36] * A[55]\n\t" - "ldr r10, [%[a], #220]\n\t" - "ldr r8, [%[a], #144]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[37] * A[54]\n\t" - "ldr r10, [%[a], #216]\n\t" - "ldr r8, [%[a], #148]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[38] * A[53]\n\t" - "ldr r10, [%[a], #212]\n\t" - "ldr r8, [%[a], #152]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[39] * A[52]\n\t" - "ldr r10, [%[a], #208]\n\t" - "ldr r8, [%[a], #156]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[40] * A[51]\n\t" - "ldr r10, [%[a], #204]\n\t" - "ldr r8, [%[a], #160]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[41] * A[50]\n\t" - "ldr r10, [%[a], #200]\n\t" - "ldr r8, [%[a], #164]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[42] * A[49]\n\t" - "ldr r10, [%[a], #196]\n\t" - "ldr r8, [%[a], #168]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[43] * A[48]\n\t" - "ldr r10, [%[a], #192]\n\t" - "ldr r8, [%[a], #172]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[44] * A[47]\n\t" - "ldr r10, [%[a], #188]\n\t" - "ldr r8, [%[a], #176]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[45] * A[46]\n\t" - "ldr r10, [%[a], #184]\n\t" - "ldr r8, [%[a], #180]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r3, r3, r5\n\t" - "adcs r4, r4, r6\n\t" - "adc r2, r2, r7\n\t" - "str r3, [%[r], #364]\n\t" - "# A[29] * A[63]\n\t" - "ldr r10, [%[a], #252]\n\t" - "ldr r8, [%[a], #116]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r3, #0\n\t" - "mov r7, #0\n\t" - "# A[30] * A[62]\n\t" - "ldr r10, [%[a], #248]\n\t" - "ldr r8, [%[a], #120]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[31] * A[61]\n\t" - "ldr r10, [%[a], #244]\n\t" - "ldr r8, [%[a], #124]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[32] * A[60]\n\t" - "ldr r10, [%[a], #240]\n\t" - "ldr r8, [%[a], #128]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[33] * A[59]\n\t" - "ldr r10, [%[a], #236]\n\t" - "ldr r8, [%[a], #132]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[34] * A[58]\n\t" - "ldr r10, [%[a], #232]\n\t" - "ldr r8, [%[a], #136]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[35] * A[57]\n\t" - "ldr r10, [%[a], #228]\n\t" - "ldr r8, [%[a], #140]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[36] * A[56]\n\t" - "ldr r10, [%[a], #224]\n\t" - "ldr r8, [%[a], #144]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[37] * A[55]\n\t" - "ldr r10, [%[a], #220]\n\t" - "ldr r8, [%[a], #148]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[38] * A[54]\n\t" - "ldr r10, [%[a], #216]\n\t" - "ldr r8, [%[a], #152]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[39] * A[53]\n\t" - "ldr r10, [%[a], #212]\n\t" - "ldr r8, [%[a], #156]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[40] * A[52]\n\t" - "ldr r10, [%[a], #208]\n\t" - "ldr r8, [%[a], #160]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[41] * A[51]\n\t" - "ldr r10, [%[a], #204]\n\t" - "ldr r8, [%[a], #164]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[42] * A[50]\n\t" - "ldr r10, [%[a], #200]\n\t" - "ldr r8, [%[a], #168]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[43] * A[49]\n\t" - "ldr r10, [%[a], #196]\n\t" - "ldr r8, [%[a], #172]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[44] * A[48]\n\t" - "ldr r10, [%[a], #192]\n\t" - "ldr r8, [%[a], #176]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[45] * A[47]\n\t" - "ldr r10, [%[a], #188]\n\t" - "ldr r8, [%[a], #180]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[46] * A[46]\n\t" - "ldr r10, [%[a], #184]\n\t" - "umull r8, r9, r10, r10\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r4, r4, r5\n\t" - "adcs r2, r2, r6\n\t" - "adc r3, r3, r7\n\t" - "str r4, [%[r], #368]\n\t" - "# A[30] * A[63]\n\t" - "ldr r10, [%[a], #252]\n\t" - "ldr r8, [%[a], #120]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r4, #0\n\t" - "mov r7, #0\n\t" - "# A[31] * A[62]\n\t" - "ldr r10, [%[a], #248]\n\t" - "ldr r8, [%[a], #124]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[32] * A[61]\n\t" - "ldr r10, [%[a], #244]\n\t" - "ldr r8, [%[a], #128]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[33] * A[60]\n\t" - "ldr r10, [%[a], #240]\n\t" - "ldr r8, [%[a], #132]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[34] * A[59]\n\t" - "ldr r10, [%[a], #236]\n\t" - "ldr r8, [%[a], #136]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[35] * A[58]\n\t" - "ldr r10, [%[a], #232]\n\t" - "ldr r8, [%[a], #140]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[36] * A[57]\n\t" - "ldr r10, [%[a], #228]\n\t" - "ldr r8, [%[a], #144]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[37] * A[56]\n\t" - "ldr r10, [%[a], #224]\n\t" - "ldr r8, [%[a], #148]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[38] * A[55]\n\t" - "ldr r10, [%[a], #220]\n\t" - "ldr r8, [%[a], #152]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[39] * A[54]\n\t" - "ldr r10, [%[a], #216]\n\t" - "ldr r8, [%[a], #156]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[40] * A[53]\n\t" - "ldr r10, [%[a], #212]\n\t" - "ldr r8, [%[a], #160]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[41] * A[52]\n\t" - "ldr r10, [%[a], #208]\n\t" - "ldr r8, [%[a], #164]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[42] * A[51]\n\t" - "ldr r10, [%[a], #204]\n\t" - "ldr r8, [%[a], #168]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[43] * A[50]\n\t" - "ldr r10, [%[a], #200]\n\t" - "ldr r8, [%[a], #172]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[44] * A[49]\n\t" - "ldr r10, [%[a], #196]\n\t" - "ldr r8, [%[a], #176]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[45] * A[48]\n\t" - "ldr r10, [%[a], #192]\n\t" - "ldr r8, [%[a], #180]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[46] * A[47]\n\t" - "ldr r10, [%[a], #188]\n\t" - "ldr r8, [%[a], #184]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r2, r2, r5\n\t" - "adcs r3, r3, r6\n\t" - "adc r4, r4, r7\n\t" - "str r2, [%[r], #372]\n\t" - "# A[31] * A[63]\n\t" - "ldr r10, [%[a], #252]\n\t" - "ldr r8, [%[a], #124]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r2, #0\n\t" - "mov r7, #0\n\t" - "# A[32] * A[62]\n\t" - "ldr r10, [%[a], #248]\n\t" - "ldr r8, [%[a], #128]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[33] * A[61]\n\t" - "ldr r10, [%[a], #244]\n\t" - "ldr r8, [%[a], #132]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[34] * A[60]\n\t" - "ldr r10, [%[a], #240]\n\t" - "ldr r8, [%[a], #136]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[35] * A[59]\n\t" - "ldr r10, [%[a], #236]\n\t" - "ldr r8, [%[a], #140]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[36] * A[58]\n\t" - "ldr r10, [%[a], #232]\n\t" - "ldr r8, [%[a], #144]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[37] * A[57]\n\t" - "ldr r10, [%[a], #228]\n\t" - "ldr r8, [%[a], #148]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[38] * A[56]\n\t" - "ldr r10, [%[a], #224]\n\t" - "ldr r8, [%[a], #152]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[39] * A[55]\n\t" - "ldr r10, [%[a], #220]\n\t" - "ldr r8, [%[a], #156]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[40] * A[54]\n\t" - "ldr r10, [%[a], #216]\n\t" - "ldr r8, [%[a], #160]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[41] * A[53]\n\t" - "ldr r10, [%[a], #212]\n\t" - "ldr r8, [%[a], #164]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[42] * A[52]\n\t" - "ldr r10, [%[a], #208]\n\t" - "ldr r8, [%[a], #168]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[43] * A[51]\n\t" - "ldr r10, [%[a], #204]\n\t" - "ldr r8, [%[a], #172]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[44] * A[50]\n\t" - "ldr r10, [%[a], #200]\n\t" - "ldr r8, [%[a], #176]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[45] * A[49]\n\t" - "ldr r10, [%[a], #196]\n\t" - "ldr r8, [%[a], #180]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[46] * A[48]\n\t" - "ldr r10, [%[a], #192]\n\t" - "ldr r8, [%[a], #184]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[47] * A[47]\n\t" - "ldr r10, [%[a], #188]\n\t" - "umull r8, r9, r10, r10\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r3, r3, r5\n\t" - "adcs r4, r4, r6\n\t" - "adc r2, r2, r7\n\t" - "str r3, [%[r], #376]\n\t" - "# A[32] * A[63]\n\t" - "ldr r10, [%[a], #252]\n\t" - "ldr r8, [%[a], #128]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r3, #0\n\t" - "mov r7, #0\n\t" - "# A[33] * A[62]\n\t" - "ldr r10, [%[a], #248]\n\t" - "ldr r8, [%[a], #132]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[34] * A[61]\n\t" - "ldr r10, [%[a], #244]\n\t" - "ldr r8, [%[a], #136]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[35] * A[60]\n\t" - "ldr r10, [%[a], #240]\n\t" - "ldr r8, [%[a], #140]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[36] * A[59]\n\t" - "ldr r10, [%[a], #236]\n\t" - "ldr r8, [%[a], #144]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[37] * A[58]\n\t" - "ldr r10, [%[a], #232]\n\t" - "ldr r8, [%[a], #148]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[38] * A[57]\n\t" - "ldr r10, [%[a], #228]\n\t" - "ldr r8, [%[a], #152]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[39] * A[56]\n\t" - "ldr r10, [%[a], #224]\n\t" - "ldr r8, [%[a], #156]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[40] * A[55]\n\t" - "ldr r10, [%[a], #220]\n\t" - "ldr r8, [%[a], #160]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[41] * A[54]\n\t" - "ldr r10, [%[a], #216]\n\t" - "ldr r8, [%[a], #164]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[42] * A[53]\n\t" - "ldr r10, [%[a], #212]\n\t" - "ldr r8, [%[a], #168]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[43] * A[52]\n\t" - "ldr r10, [%[a], #208]\n\t" - "ldr r8, [%[a], #172]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[44] * A[51]\n\t" - "ldr r10, [%[a], #204]\n\t" - "ldr r8, [%[a], #176]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[45] * A[50]\n\t" - "ldr r10, [%[a], #200]\n\t" - "ldr r8, [%[a], #180]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[46] * A[49]\n\t" - "ldr r10, [%[a], #196]\n\t" - "ldr r8, [%[a], #184]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[47] * A[48]\n\t" - "ldr r10, [%[a], #192]\n\t" - "ldr r8, [%[a], #188]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r4, r4, r5\n\t" - "adcs r2, r2, r6\n\t" - "adc r3, r3, r7\n\t" - "str r4, [%[r], #380]\n\t" - "# A[33] * A[63]\n\t" - "ldr r10, [%[a], #252]\n\t" - "ldr r8, [%[a], #132]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r4, #0\n\t" - "mov r7, #0\n\t" - "# A[34] * A[62]\n\t" - "ldr r10, [%[a], #248]\n\t" - "ldr r8, [%[a], #136]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[35] * A[61]\n\t" - "ldr r10, [%[a], #244]\n\t" - "ldr r8, [%[a], #140]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[36] * A[60]\n\t" - "ldr r10, [%[a], #240]\n\t" - "ldr r8, [%[a], #144]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[37] * A[59]\n\t" - "ldr r10, [%[a], #236]\n\t" - "ldr r8, [%[a], #148]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[38] * A[58]\n\t" - "ldr r10, [%[a], #232]\n\t" - "ldr r8, [%[a], #152]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[39] * A[57]\n\t" - "ldr r10, [%[a], #228]\n\t" - "ldr r8, [%[a], #156]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[40] * A[56]\n\t" - "ldr r10, [%[a], #224]\n\t" - "ldr r8, [%[a], #160]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[41] * A[55]\n\t" - "ldr r10, [%[a], #220]\n\t" - "ldr r8, [%[a], #164]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[42] * A[54]\n\t" - "ldr r10, [%[a], #216]\n\t" - "ldr r8, [%[a], #168]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[43] * A[53]\n\t" - "ldr r10, [%[a], #212]\n\t" - "ldr r8, [%[a], #172]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[44] * A[52]\n\t" - "ldr r10, [%[a], #208]\n\t" - "ldr r8, [%[a], #176]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[45] * A[51]\n\t" - "ldr r10, [%[a], #204]\n\t" - "ldr r8, [%[a], #180]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[46] * A[50]\n\t" - "ldr r10, [%[a], #200]\n\t" - "ldr r8, [%[a], #184]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[47] * A[49]\n\t" - "ldr r10, [%[a], #196]\n\t" - "ldr r8, [%[a], #188]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[48] * A[48]\n\t" - "ldr r10, [%[a], #192]\n\t" - "umull r8, r9, r10, r10\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r2, r2, r5\n\t" - "adcs r3, r3, r6\n\t" - "adc r4, r4, r7\n\t" - "str r2, [%[r], #384]\n\t" - "# A[34] * A[63]\n\t" - "ldr r10, [%[a], #252]\n\t" - "ldr r8, [%[a], #136]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r2, #0\n\t" - "mov r7, #0\n\t" - "# A[35] * A[62]\n\t" - "ldr r10, [%[a], #248]\n\t" - "ldr r8, [%[a], #140]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[36] * A[61]\n\t" - "ldr r10, [%[a], #244]\n\t" - "ldr r8, [%[a], #144]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[37] * A[60]\n\t" - "ldr r10, [%[a], #240]\n\t" - "ldr r8, [%[a], #148]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[38] * A[59]\n\t" - "ldr r10, [%[a], #236]\n\t" - "ldr r8, [%[a], #152]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[39] * A[58]\n\t" - "ldr r10, [%[a], #232]\n\t" - "ldr r8, [%[a], #156]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[40] * A[57]\n\t" - "ldr r10, [%[a], #228]\n\t" - "ldr r8, [%[a], #160]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[41] * A[56]\n\t" - "ldr r10, [%[a], #224]\n\t" - "ldr r8, [%[a], #164]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[42] * A[55]\n\t" - "ldr r10, [%[a], #220]\n\t" - "ldr r8, [%[a], #168]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[43] * A[54]\n\t" - "ldr r10, [%[a], #216]\n\t" - "ldr r8, [%[a], #172]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[44] * A[53]\n\t" - "ldr r10, [%[a], #212]\n\t" - "ldr r8, [%[a], #176]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[45] * A[52]\n\t" - "ldr r10, [%[a], #208]\n\t" - "ldr r8, [%[a], #180]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[46] * A[51]\n\t" - "ldr r10, [%[a], #204]\n\t" - "ldr r8, [%[a], #184]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[47] * A[50]\n\t" - "ldr r10, [%[a], #200]\n\t" - "ldr r8, [%[a], #188]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[48] * A[49]\n\t" - "ldr r10, [%[a], #196]\n\t" - "ldr r8, [%[a], #192]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r3, r3, r5\n\t" - "adcs r4, r4, r6\n\t" - "adc r2, r2, r7\n\t" - "str r3, [%[r], #388]\n\t" - "# A[35] * A[63]\n\t" - "ldr r10, [%[a], #252]\n\t" - "ldr r8, [%[a], #140]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r3, #0\n\t" - "mov r7, #0\n\t" - "# A[36] * A[62]\n\t" - "ldr r10, [%[a], #248]\n\t" - "ldr r8, [%[a], #144]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[37] * A[61]\n\t" - "ldr r10, [%[a], #244]\n\t" - "ldr r8, [%[a], #148]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[38] * A[60]\n\t" - "ldr r10, [%[a], #240]\n\t" - "ldr r8, [%[a], #152]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[39] * A[59]\n\t" - "ldr r10, [%[a], #236]\n\t" - "ldr r8, [%[a], #156]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[40] * A[58]\n\t" - "ldr r10, [%[a], #232]\n\t" - "ldr r8, [%[a], #160]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[41] * A[57]\n\t" - "ldr r10, [%[a], #228]\n\t" - "ldr r8, [%[a], #164]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[42] * A[56]\n\t" - "ldr r10, [%[a], #224]\n\t" - "ldr r8, [%[a], #168]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[43] * A[55]\n\t" - "ldr r10, [%[a], #220]\n\t" - "ldr r8, [%[a], #172]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[44] * A[54]\n\t" - "ldr r10, [%[a], #216]\n\t" - "ldr r8, [%[a], #176]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[45] * A[53]\n\t" - "ldr r10, [%[a], #212]\n\t" - "ldr r8, [%[a], #180]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[46] * A[52]\n\t" - "ldr r10, [%[a], #208]\n\t" - "ldr r8, [%[a], #184]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[47] * A[51]\n\t" - "ldr r10, [%[a], #204]\n\t" - "ldr r8, [%[a], #188]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[48] * A[50]\n\t" - "ldr r10, [%[a], #200]\n\t" - "ldr r8, [%[a], #192]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[49] * A[49]\n\t" - "ldr r10, [%[a], #196]\n\t" - "umull r8, r9, r10, r10\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r4, r4, r5\n\t" - "adcs r2, r2, r6\n\t" - "adc r3, r3, r7\n\t" - "str r4, [%[r], #392]\n\t" - "# A[36] * A[63]\n\t" - "ldr r10, [%[a], #252]\n\t" - "ldr r8, [%[a], #144]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r4, #0\n\t" - "mov r7, #0\n\t" - "# A[37] * A[62]\n\t" - "ldr r10, [%[a], #248]\n\t" - "ldr r8, [%[a], #148]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[38] * A[61]\n\t" - "ldr r10, [%[a], #244]\n\t" - "ldr r8, [%[a], #152]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[39] * A[60]\n\t" - "ldr r10, [%[a], #240]\n\t" - "ldr r8, [%[a], #156]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[40] * A[59]\n\t" - "ldr r10, [%[a], #236]\n\t" - "ldr r8, [%[a], #160]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[41] * A[58]\n\t" - "ldr r10, [%[a], #232]\n\t" - "ldr r8, [%[a], #164]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[42] * A[57]\n\t" - "ldr r10, [%[a], #228]\n\t" - "ldr r8, [%[a], #168]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[43] * A[56]\n\t" - "ldr r10, [%[a], #224]\n\t" - "ldr r8, [%[a], #172]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[44] * A[55]\n\t" - "ldr r10, [%[a], #220]\n\t" - "ldr r8, [%[a], #176]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[45] * A[54]\n\t" - "ldr r10, [%[a], #216]\n\t" - "ldr r8, [%[a], #180]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[46] * A[53]\n\t" - "ldr r10, [%[a], #212]\n\t" - "ldr r8, [%[a], #184]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[47] * A[52]\n\t" - "ldr r10, [%[a], #208]\n\t" - "ldr r8, [%[a], #188]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[48] * A[51]\n\t" - "ldr r10, [%[a], #204]\n\t" - "ldr r8, [%[a], #192]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[49] * A[50]\n\t" - "ldr r10, [%[a], #200]\n\t" - "ldr r8, [%[a], #196]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r2, r2, r5\n\t" - "adcs r3, r3, r6\n\t" - "adc r4, r4, r7\n\t" - "str r2, [%[r], #396]\n\t" - "# A[37] * A[63]\n\t" - "ldr r10, [%[a], #252]\n\t" - "ldr r8, [%[a], #148]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r2, #0\n\t" - "mov r7, #0\n\t" - "# A[38] * A[62]\n\t" - "ldr r10, [%[a], #248]\n\t" - "ldr r8, [%[a], #152]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[39] * A[61]\n\t" - "ldr r10, [%[a], #244]\n\t" - "ldr r8, [%[a], #156]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[40] * A[60]\n\t" - "ldr r10, [%[a], #240]\n\t" - "ldr r8, [%[a], #160]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[41] * A[59]\n\t" - "ldr r10, [%[a], #236]\n\t" - "ldr r8, [%[a], #164]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[42] * A[58]\n\t" - "ldr r10, [%[a], #232]\n\t" - "ldr r8, [%[a], #168]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[43] * A[57]\n\t" - "ldr r10, [%[a], #228]\n\t" - "ldr r8, [%[a], #172]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[44] * A[56]\n\t" - "ldr r10, [%[a], #224]\n\t" - "ldr r8, [%[a], #176]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[45] * A[55]\n\t" - "ldr r10, [%[a], #220]\n\t" - "ldr r8, [%[a], #180]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[46] * A[54]\n\t" - "ldr r10, [%[a], #216]\n\t" - "ldr r8, [%[a], #184]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[47] * A[53]\n\t" - "ldr r10, [%[a], #212]\n\t" - "ldr r8, [%[a], #188]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[48] * A[52]\n\t" - "ldr r10, [%[a], #208]\n\t" - "ldr r8, [%[a], #192]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[49] * A[51]\n\t" - "ldr r10, [%[a], #204]\n\t" - "ldr r8, [%[a], #196]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[50] * A[50]\n\t" - "ldr r10, [%[a], #200]\n\t" - "umull r8, r9, r10, r10\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r3, r3, r5\n\t" - "adcs r4, r4, r6\n\t" - "adc r2, r2, r7\n\t" - "str r3, [%[r], #400]\n\t" - "# A[38] * A[63]\n\t" - "ldr r10, [%[a], #252]\n\t" - "ldr r8, [%[a], #152]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r3, #0\n\t" - "mov r7, #0\n\t" - "# A[39] * A[62]\n\t" - "ldr r10, [%[a], #248]\n\t" - "ldr r8, [%[a], #156]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[40] * A[61]\n\t" - "ldr r10, [%[a], #244]\n\t" - "ldr r8, [%[a], #160]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[41] * A[60]\n\t" - "ldr r10, [%[a], #240]\n\t" - "ldr r8, [%[a], #164]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[42] * A[59]\n\t" - "ldr r10, [%[a], #236]\n\t" - "ldr r8, [%[a], #168]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[43] * A[58]\n\t" - "ldr r10, [%[a], #232]\n\t" - "ldr r8, [%[a], #172]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[44] * A[57]\n\t" - "ldr r10, [%[a], #228]\n\t" - "ldr r8, [%[a], #176]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[45] * A[56]\n\t" - "ldr r10, [%[a], #224]\n\t" - "ldr r8, [%[a], #180]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[46] * A[55]\n\t" - "ldr r10, [%[a], #220]\n\t" - "ldr r8, [%[a], #184]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[47] * A[54]\n\t" - "ldr r10, [%[a], #216]\n\t" - "ldr r8, [%[a], #188]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[48] * A[53]\n\t" - "ldr r10, [%[a], #212]\n\t" - "ldr r8, [%[a], #192]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[49] * A[52]\n\t" - "ldr r10, [%[a], #208]\n\t" - "ldr r8, [%[a], #196]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[50] * A[51]\n\t" - "ldr r10, [%[a], #204]\n\t" - "ldr r8, [%[a], #200]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r4, r4, r5\n\t" - "adcs r2, r2, r6\n\t" - "adc r3, r3, r7\n\t" - "str r4, [%[r], #404]\n\t" - "# A[39] * A[63]\n\t" - "ldr r10, [%[a], #252]\n\t" - "ldr r8, [%[a], #156]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r4, #0\n\t" - "mov r7, #0\n\t" - "# A[40] * A[62]\n\t" - "ldr r10, [%[a], #248]\n\t" - "ldr r8, [%[a], #160]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[41] * A[61]\n\t" - "ldr r10, [%[a], #244]\n\t" - "ldr r8, [%[a], #164]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[42] * A[60]\n\t" - "ldr r10, [%[a], #240]\n\t" - "ldr r8, [%[a], #168]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[43] * A[59]\n\t" - "ldr r10, [%[a], #236]\n\t" - "ldr r8, [%[a], #172]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[44] * A[58]\n\t" - "ldr r10, [%[a], #232]\n\t" - "ldr r8, [%[a], #176]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[45] * A[57]\n\t" - "ldr r10, [%[a], #228]\n\t" - "ldr r8, [%[a], #180]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[46] * A[56]\n\t" - "ldr r10, [%[a], #224]\n\t" - "ldr r8, [%[a], #184]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[47] * A[55]\n\t" - "ldr r10, [%[a], #220]\n\t" - "ldr r8, [%[a], #188]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[48] * A[54]\n\t" - "ldr r10, [%[a], #216]\n\t" - "ldr r8, [%[a], #192]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[49] * A[53]\n\t" - "ldr r10, [%[a], #212]\n\t" - "ldr r8, [%[a], #196]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[50] * A[52]\n\t" - "ldr r10, [%[a], #208]\n\t" - "ldr r8, [%[a], #200]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[51] * A[51]\n\t" - "ldr r10, [%[a], #204]\n\t" - "umull r8, r9, r10, r10\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r2, r2, r5\n\t" - "adcs r3, r3, r6\n\t" - "adc r4, r4, r7\n\t" - "str r2, [%[r], #408]\n\t" - "# A[40] * A[63]\n\t" - "ldr r10, [%[a], #252]\n\t" - "ldr r8, [%[a], #160]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r2, #0\n\t" - "mov r7, #0\n\t" - "# A[41] * A[62]\n\t" - "ldr r10, [%[a], #248]\n\t" - "ldr r8, [%[a], #164]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[42] * A[61]\n\t" - "ldr r10, [%[a], #244]\n\t" - "ldr r8, [%[a], #168]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[43] * A[60]\n\t" - "ldr r10, [%[a], #240]\n\t" - "ldr r8, [%[a], #172]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[44] * A[59]\n\t" - "ldr r10, [%[a], #236]\n\t" - "ldr r8, [%[a], #176]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[45] * A[58]\n\t" - "ldr r10, [%[a], #232]\n\t" - "ldr r8, [%[a], #180]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[46] * A[57]\n\t" - "ldr r10, [%[a], #228]\n\t" - "ldr r8, [%[a], #184]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[47] * A[56]\n\t" - "ldr r10, [%[a], #224]\n\t" - "ldr r8, [%[a], #188]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[48] * A[55]\n\t" - "ldr r10, [%[a], #220]\n\t" - "ldr r8, [%[a], #192]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[49] * A[54]\n\t" - "ldr r10, [%[a], #216]\n\t" - "ldr r8, [%[a], #196]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[50] * A[53]\n\t" - "ldr r10, [%[a], #212]\n\t" - "ldr r8, [%[a], #200]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[51] * A[52]\n\t" - "ldr r10, [%[a], #208]\n\t" - "ldr r8, [%[a], #204]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r3, r3, r5\n\t" - "adcs r4, r4, r6\n\t" - "adc r2, r2, r7\n\t" - "str r3, [%[r], #412]\n\t" - "# A[41] * A[63]\n\t" - "ldr r10, [%[a], #252]\n\t" - "ldr r8, [%[a], #164]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r3, #0\n\t" - "mov r7, #0\n\t" - "# A[42] * A[62]\n\t" - "ldr r10, [%[a], #248]\n\t" - "ldr r8, [%[a], #168]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[43] * A[61]\n\t" - "ldr r10, [%[a], #244]\n\t" - "ldr r8, [%[a], #172]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[44] * A[60]\n\t" - "ldr r10, [%[a], #240]\n\t" - "ldr r8, [%[a], #176]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[45] * A[59]\n\t" - "ldr r10, [%[a], #236]\n\t" - "ldr r8, [%[a], #180]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[46] * A[58]\n\t" - "ldr r10, [%[a], #232]\n\t" - "ldr r8, [%[a], #184]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[47] * A[57]\n\t" - "ldr r10, [%[a], #228]\n\t" - "ldr r8, [%[a], #188]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[48] * A[56]\n\t" - "ldr r10, [%[a], #224]\n\t" - "ldr r8, [%[a], #192]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[49] * A[55]\n\t" - "ldr r10, [%[a], #220]\n\t" - "ldr r8, [%[a], #196]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[50] * A[54]\n\t" - "ldr r10, [%[a], #216]\n\t" - "ldr r8, [%[a], #200]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[51] * A[53]\n\t" - "ldr r10, [%[a], #212]\n\t" - "ldr r8, [%[a], #204]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[52] * A[52]\n\t" - "ldr r10, [%[a], #208]\n\t" - "umull r8, r9, r10, r10\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r4, r4, r5\n\t" - "adcs r2, r2, r6\n\t" - "adc r3, r3, r7\n\t" - "str r4, [%[r], #416]\n\t" - "# A[42] * A[63]\n\t" - "ldr r10, [%[a], #252]\n\t" - "ldr r8, [%[a], #168]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r4, #0\n\t" - "mov r7, #0\n\t" - "# A[43] * A[62]\n\t" - "ldr r10, [%[a], #248]\n\t" - "ldr r8, [%[a], #172]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[44] * A[61]\n\t" - "ldr r10, [%[a], #244]\n\t" - "ldr r8, [%[a], #176]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[45] * A[60]\n\t" - "ldr r10, [%[a], #240]\n\t" - "ldr r8, [%[a], #180]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[46] * A[59]\n\t" - "ldr r10, [%[a], #236]\n\t" - "ldr r8, [%[a], #184]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[47] * A[58]\n\t" - "ldr r10, [%[a], #232]\n\t" - "ldr r8, [%[a], #188]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[48] * A[57]\n\t" - "ldr r10, [%[a], #228]\n\t" - "ldr r8, [%[a], #192]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[49] * A[56]\n\t" - "ldr r10, [%[a], #224]\n\t" - "ldr r8, [%[a], #196]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[50] * A[55]\n\t" - "ldr r10, [%[a], #220]\n\t" - "ldr r8, [%[a], #200]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[51] * A[54]\n\t" - "ldr r10, [%[a], #216]\n\t" - "ldr r8, [%[a], #204]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[52] * A[53]\n\t" - "ldr r10, [%[a], #212]\n\t" - "ldr r8, [%[a], #208]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r2, r2, r5\n\t" - "adcs r3, r3, r6\n\t" - "adc r4, r4, r7\n\t" - "str r2, [%[r], #420]\n\t" - "# A[43] * A[63]\n\t" - "ldr r10, [%[a], #252]\n\t" - "ldr r8, [%[a], #172]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r2, #0\n\t" - "mov r7, #0\n\t" - "# A[44] * A[62]\n\t" - "ldr r10, [%[a], #248]\n\t" - "ldr r8, [%[a], #176]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[45] * A[61]\n\t" - "ldr r10, [%[a], #244]\n\t" - "ldr r8, [%[a], #180]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[46] * A[60]\n\t" - "ldr r10, [%[a], #240]\n\t" - "ldr r8, [%[a], #184]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[47] * A[59]\n\t" - "ldr r10, [%[a], #236]\n\t" - "ldr r8, [%[a], #188]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[48] * A[58]\n\t" - "ldr r10, [%[a], #232]\n\t" - "ldr r8, [%[a], #192]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[49] * A[57]\n\t" - "ldr r10, [%[a], #228]\n\t" - "ldr r8, [%[a], #196]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[50] * A[56]\n\t" - "ldr r10, [%[a], #224]\n\t" - "ldr r8, [%[a], #200]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[51] * A[55]\n\t" - "ldr r10, [%[a], #220]\n\t" - "ldr r8, [%[a], #204]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[52] * A[54]\n\t" - "ldr r10, [%[a], #216]\n\t" - "ldr r8, [%[a], #208]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[53] * A[53]\n\t" - "ldr r10, [%[a], #212]\n\t" - "umull r8, r9, r10, r10\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r3, r3, r5\n\t" - "adcs r4, r4, r6\n\t" - "adc r2, r2, r7\n\t" - "str r3, [%[r], #424]\n\t" - "# A[44] * A[63]\n\t" - "ldr r10, [%[a], #252]\n\t" - "ldr r8, [%[a], #176]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r3, #0\n\t" - "mov r7, #0\n\t" - "# A[45] * A[62]\n\t" - "ldr r10, [%[a], #248]\n\t" - "ldr r8, [%[a], #180]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[46] * A[61]\n\t" - "ldr r10, [%[a], #244]\n\t" - "ldr r8, [%[a], #184]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[47] * A[60]\n\t" - "ldr r10, [%[a], #240]\n\t" - "ldr r8, [%[a], #188]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[48] * A[59]\n\t" - "ldr r10, [%[a], #236]\n\t" - "ldr r8, [%[a], #192]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[49] * A[58]\n\t" - "ldr r10, [%[a], #232]\n\t" - "ldr r8, [%[a], #196]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[50] * A[57]\n\t" - "ldr r10, [%[a], #228]\n\t" - "ldr r8, [%[a], #200]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[51] * A[56]\n\t" - "ldr r10, [%[a], #224]\n\t" - "ldr r8, [%[a], #204]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[52] * A[55]\n\t" - "ldr r10, [%[a], #220]\n\t" - "ldr r8, [%[a], #208]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[53] * A[54]\n\t" - "ldr r10, [%[a], #216]\n\t" - "ldr r8, [%[a], #212]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r4, r4, r5\n\t" - "adcs r2, r2, r6\n\t" - "adc r3, r3, r7\n\t" - "str r4, [%[r], #428]\n\t" - "# A[45] * A[63]\n\t" - "ldr r10, [%[a], #252]\n\t" - "ldr r8, [%[a], #180]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r4, #0\n\t" - "mov r7, #0\n\t" - "# A[46] * A[62]\n\t" - "ldr r10, [%[a], #248]\n\t" - "ldr r8, [%[a], #184]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[47] * A[61]\n\t" - "ldr r10, [%[a], #244]\n\t" - "ldr r8, [%[a], #188]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[48] * A[60]\n\t" - "ldr r10, [%[a], #240]\n\t" - "ldr r8, [%[a], #192]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[49] * A[59]\n\t" - "ldr r10, [%[a], #236]\n\t" - "ldr r8, [%[a], #196]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[50] * A[58]\n\t" - "ldr r10, [%[a], #232]\n\t" - "ldr r8, [%[a], #200]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[51] * A[57]\n\t" - "ldr r10, [%[a], #228]\n\t" - "ldr r8, [%[a], #204]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[52] * A[56]\n\t" - "ldr r10, [%[a], #224]\n\t" - "ldr r8, [%[a], #208]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[53] * A[55]\n\t" - "ldr r10, [%[a], #220]\n\t" - "ldr r8, [%[a], #212]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[54] * A[54]\n\t" - "ldr r10, [%[a], #216]\n\t" - "umull r8, r9, r10, r10\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r2, r2, r5\n\t" - "adcs r3, r3, r6\n\t" - "adc r4, r4, r7\n\t" - "str r2, [%[r], #432]\n\t" - "# A[46] * A[63]\n\t" - "ldr r10, [%[a], #252]\n\t" - "ldr r8, [%[a], #184]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r2, #0\n\t" - "mov r7, #0\n\t" - "# A[47] * A[62]\n\t" - "ldr r10, [%[a], #248]\n\t" - "ldr r8, [%[a], #188]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[48] * A[61]\n\t" - "ldr r10, [%[a], #244]\n\t" - "ldr r8, [%[a], #192]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[49] * A[60]\n\t" - "ldr r10, [%[a], #240]\n\t" - "ldr r8, [%[a], #196]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[50] * A[59]\n\t" - "ldr r10, [%[a], #236]\n\t" - "ldr r8, [%[a], #200]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[51] * A[58]\n\t" - "ldr r10, [%[a], #232]\n\t" - "ldr r8, [%[a], #204]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[52] * A[57]\n\t" - "ldr r10, [%[a], #228]\n\t" - "ldr r8, [%[a], #208]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[53] * A[56]\n\t" - "ldr r10, [%[a], #224]\n\t" - "ldr r8, [%[a], #212]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[54] * A[55]\n\t" - "ldr r10, [%[a], #220]\n\t" - "ldr r8, [%[a], #216]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r3, r3, r5\n\t" - "adcs r4, r4, r6\n\t" - "adc r2, r2, r7\n\t" - "str r3, [%[r], #436]\n\t" - "# A[47] * A[63]\n\t" - "ldr r10, [%[a], #252]\n\t" - "ldr r8, [%[a], #188]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r3, #0\n\t" - "mov r7, #0\n\t" - "# A[48] * A[62]\n\t" - "ldr r10, [%[a], #248]\n\t" - "ldr r8, [%[a], #192]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[49] * A[61]\n\t" - "ldr r10, [%[a], #244]\n\t" - "ldr r8, [%[a], #196]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[50] * A[60]\n\t" - "ldr r10, [%[a], #240]\n\t" - "ldr r8, [%[a], #200]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[51] * A[59]\n\t" - "ldr r10, [%[a], #236]\n\t" - "ldr r8, [%[a], #204]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[52] * A[58]\n\t" - "ldr r10, [%[a], #232]\n\t" - "ldr r8, [%[a], #208]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[53] * A[57]\n\t" - "ldr r10, [%[a], #228]\n\t" - "ldr r8, [%[a], #212]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[54] * A[56]\n\t" - "ldr r10, [%[a], #224]\n\t" - "ldr r8, [%[a], #216]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[55] * A[55]\n\t" - "ldr r10, [%[a], #220]\n\t" - "umull r8, r9, r10, r10\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r4, r4, r5\n\t" - "adcs r2, r2, r6\n\t" - "adc r3, r3, r7\n\t" - "str r4, [%[r], #440]\n\t" - "# A[48] * A[63]\n\t" - "ldr r10, [%[a], #252]\n\t" - "ldr r8, [%[a], #192]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r4, #0\n\t" - "mov r7, #0\n\t" - "# A[49] * A[62]\n\t" - "ldr r10, [%[a], #248]\n\t" - "ldr r8, [%[a], #196]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[50] * A[61]\n\t" - "ldr r10, [%[a], #244]\n\t" - "ldr r8, [%[a], #200]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[51] * A[60]\n\t" - "ldr r10, [%[a], #240]\n\t" - "ldr r8, [%[a], #204]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[52] * A[59]\n\t" - "ldr r10, [%[a], #236]\n\t" - "ldr r8, [%[a], #208]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[53] * A[58]\n\t" - "ldr r10, [%[a], #232]\n\t" - "ldr r8, [%[a], #212]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[54] * A[57]\n\t" - "ldr r10, [%[a], #228]\n\t" - "ldr r8, [%[a], #216]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[55] * A[56]\n\t" - "ldr r10, [%[a], #224]\n\t" - "ldr r8, [%[a], #220]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r2, r2, r5\n\t" - "adcs r3, r3, r6\n\t" - "adc r4, r4, r7\n\t" - "str r2, [%[r], #444]\n\t" - "# A[49] * A[63]\n\t" - "ldr r10, [%[a], #252]\n\t" - "ldr r8, [%[a], #196]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r2, #0\n\t" - "mov r7, #0\n\t" - "# A[50] * A[62]\n\t" - "ldr r10, [%[a], #248]\n\t" - "ldr r8, [%[a], #200]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[51] * A[61]\n\t" - "ldr r10, [%[a], #244]\n\t" - "ldr r8, [%[a], #204]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[52] * A[60]\n\t" - "ldr r10, [%[a], #240]\n\t" - "ldr r8, [%[a], #208]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[53] * A[59]\n\t" - "ldr r10, [%[a], #236]\n\t" - "ldr r8, [%[a], #212]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[54] * A[58]\n\t" - "ldr r10, [%[a], #232]\n\t" - "ldr r8, [%[a], #216]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[55] * A[57]\n\t" - "ldr r10, [%[a], #228]\n\t" - "ldr r8, [%[a], #220]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[56] * A[56]\n\t" - "ldr r10, [%[a], #224]\n\t" - "umull r8, r9, r10, r10\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r3, r3, r5\n\t" - "adcs r4, r4, r6\n\t" - "adc r2, r2, r7\n\t" - "str r3, [%[r], #448]\n\t" - "# A[50] * A[63]\n\t" - "ldr r10, [%[a], #252]\n\t" - "ldr r8, [%[a], #200]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r3, #0\n\t" - "mov r7, #0\n\t" - "# A[51] * A[62]\n\t" - "ldr r10, [%[a], #248]\n\t" - "ldr r8, [%[a], #204]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[52] * A[61]\n\t" - "ldr r10, [%[a], #244]\n\t" - "ldr r8, [%[a], #208]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[53] * A[60]\n\t" - "ldr r10, [%[a], #240]\n\t" - "ldr r8, [%[a], #212]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[54] * A[59]\n\t" - "ldr r10, [%[a], #236]\n\t" - "ldr r8, [%[a], #216]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[55] * A[58]\n\t" - "ldr r10, [%[a], #232]\n\t" - "ldr r8, [%[a], #220]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[56] * A[57]\n\t" - "ldr r10, [%[a], #228]\n\t" - "ldr r8, [%[a], #224]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r4, r4, r5\n\t" - "adcs r2, r2, r6\n\t" - "adc r3, r3, r7\n\t" - "str r4, [%[r], #452]\n\t" - "# A[51] * A[63]\n\t" - "ldr r10, [%[a], #252]\n\t" - "ldr r8, [%[a], #204]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r4, #0\n\t" - "mov r7, #0\n\t" - "# A[52] * A[62]\n\t" - "ldr r10, [%[a], #248]\n\t" - "ldr r8, [%[a], #208]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[53] * A[61]\n\t" - "ldr r10, [%[a], #244]\n\t" - "ldr r8, [%[a], #212]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[54] * A[60]\n\t" - "ldr r10, [%[a], #240]\n\t" - "ldr r8, [%[a], #216]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[55] * A[59]\n\t" - "ldr r10, [%[a], #236]\n\t" - "ldr r8, [%[a], #220]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[56] * A[58]\n\t" - "ldr r10, [%[a], #232]\n\t" - "ldr r8, [%[a], #224]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[57] * A[57]\n\t" - "ldr r10, [%[a], #228]\n\t" - "umull r8, r9, r10, r10\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r2, r2, r5\n\t" - "adcs r3, r3, r6\n\t" - "adc r4, r4, r7\n\t" - "str r2, [%[r], #456]\n\t" - "# A[52] * A[63]\n\t" - "ldr r10, [%[a], #252]\n\t" - "ldr r8, [%[a], #208]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r2, #0\n\t" - "mov r7, #0\n\t" - "# A[53] * A[62]\n\t" - "ldr r10, [%[a], #248]\n\t" - "ldr r8, [%[a], #212]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[54] * A[61]\n\t" - "ldr r10, [%[a], #244]\n\t" - "ldr r8, [%[a], #216]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[55] * A[60]\n\t" - "ldr r10, [%[a], #240]\n\t" - "ldr r8, [%[a], #220]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[56] * A[59]\n\t" - "ldr r10, [%[a], #236]\n\t" - "ldr r8, [%[a], #224]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[57] * A[58]\n\t" - "ldr r10, [%[a], #232]\n\t" - "ldr r8, [%[a], #228]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r3, r3, r5\n\t" - "adcs r4, r4, r6\n\t" - "adc r2, r2, r7\n\t" - "str r3, [%[r], #460]\n\t" - "# A[53] * A[63]\n\t" - "ldr r10, [%[a], #252]\n\t" - "ldr r8, [%[a], #212]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r3, #0\n\t" - "mov r7, #0\n\t" - "# A[54] * A[62]\n\t" - "ldr r10, [%[a], #248]\n\t" - "ldr r8, [%[a], #216]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[55] * A[61]\n\t" - "ldr r10, [%[a], #244]\n\t" - "ldr r8, [%[a], #220]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[56] * A[60]\n\t" - "ldr r10, [%[a], #240]\n\t" - "ldr r8, [%[a], #224]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[57] * A[59]\n\t" - "ldr r10, [%[a], #236]\n\t" - "ldr r8, [%[a], #228]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[58] * A[58]\n\t" - "ldr r10, [%[a], #232]\n\t" - "umull r8, r9, r10, r10\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r4, r4, r5\n\t" - "adcs r2, r2, r6\n\t" - "adc r3, r3, r7\n\t" - "str r4, [%[r], #464]\n\t" - "# A[54] * A[63]\n\t" - "ldr r10, [%[a], #252]\n\t" - "ldr r8, [%[a], #216]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r4, #0\n\t" - "mov r7, #0\n\t" - "# A[55] * A[62]\n\t" - "ldr r10, [%[a], #248]\n\t" - "ldr r8, [%[a], #220]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[56] * A[61]\n\t" - "ldr r10, [%[a], #244]\n\t" - "ldr r8, [%[a], #224]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[57] * A[60]\n\t" - "ldr r10, [%[a], #240]\n\t" - "ldr r8, [%[a], #228]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[58] * A[59]\n\t" - "ldr r10, [%[a], #236]\n\t" - "ldr r8, [%[a], #232]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r2, r2, r5\n\t" - "adcs r3, r3, r6\n\t" - "adc r4, r4, r7\n\t" - "str r2, [%[r], #468]\n\t" - "# A[55] * A[63]\n\t" - "ldr r10, [%[a], #252]\n\t" - "ldr r8, [%[a], #220]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r2, #0\n\t" - "mov r7, #0\n\t" - "# A[56] * A[62]\n\t" - "ldr r10, [%[a], #248]\n\t" - "ldr r8, [%[a], #224]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[57] * A[61]\n\t" - "ldr r10, [%[a], #244]\n\t" - "ldr r8, [%[a], #228]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[58] * A[60]\n\t" - "ldr r10, [%[a], #240]\n\t" - "ldr r8, [%[a], #232]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[59] * A[59]\n\t" - "ldr r10, [%[a], #236]\n\t" - "umull r8, r9, r10, r10\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r3, r3, r5\n\t" - "adcs r4, r4, r6\n\t" - "adc r2, r2, r7\n\t" - "str r3, [%[r], #472]\n\t" - "# A[56] * A[63]\n\t" - "ldr r10, [%[a], #252]\n\t" - "ldr r8, [%[a], #224]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r3, #0\n\t" - "mov r7, #0\n\t" - "# A[57] * A[62]\n\t" - "ldr r10, [%[a], #248]\n\t" - "ldr r8, [%[a], #228]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[58] * A[61]\n\t" - "ldr r10, [%[a], #244]\n\t" - "ldr r8, [%[a], #232]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[59] * A[60]\n\t" - "ldr r10, [%[a], #240]\n\t" - "ldr r8, [%[a], #236]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r4, r4, r5\n\t" - "adcs r2, r2, r6\n\t" - "adc r3, r3, r7\n\t" - "str r4, [%[r], #476]\n\t" - "# A[57] * A[63]\n\t" - "ldr r10, [%[a], #252]\n\t" - "ldr r8, [%[a], #228]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r4, #0\n\t" - "mov r7, #0\n\t" - "# A[58] * A[62]\n\t" - "ldr r10, [%[a], #248]\n\t" - "ldr r8, [%[a], #232]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[59] * A[61]\n\t" - "ldr r10, [%[a], #244]\n\t" - "ldr r8, [%[a], #236]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[60] * A[60]\n\t" - "ldr r10, [%[a], #240]\n\t" - "umull r8, r9, r10, r10\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r2, r2, r5\n\t" - "adcs r3, r3, r6\n\t" - "adc r4, r4, r7\n\t" - "str r2, [%[r], #480]\n\t" - "# A[58] * A[63]\n\t" - "ldr r10, [%[a], #252]\n\t" - "ldr r8, [%[a], #232]\n\t" - "umull r5, r6, r10, r8\n\t" - "mov r2, #0\n\t" - "mov r7, #0\n\t" - "# A[59] * A[62]\n\t" - "ldr r10, [%[a], #248]\n\t" - "ldr r8, [%[a], #236]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "# A[60] * A[61]\n\t" - "ldr r10, [%[a], #244]\n\t" - "ldr r8, [%[a], #240]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, r14\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r3, r3, r5\n\t" - "adcs r4, r4, r6\n\t" - "adc r2, r2, r7\n\t" - "str r3, [%[r], #484]\n\t" - "# A[59] * A[63]\n\t" - "ldr r10, [%[a], #252]\n\t" - "ldr r8, [%[a], #236]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r4, r4, r8\n\t" - "adcs r2, r2, r9\n\t" - "adc r3, r14, r14\n\t" - "adds r4, r4, r8\n\t" - "adcs r2, r2, r9\n\t" - "adc r3, r3, r14\n\t" - "# A[60] * A[62]\n\t" - "ldr r10, [%[a], #248]\n\t" - "ldr r8, [%[a], #240]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r4, r4, r8\n\t" - "adcs r2, r2, r9\n\t" - "adc r3, r3, r14\n\t" - "adds r4, r4, r8\n\t" - "adcs r2, r2, r9\n\t" - "adc r3, r3, r14\n\t" - "# A[61] * A[61]\n\t" - "ldr r10, [%[a], #244]\n\t" - "umull r8, r9, r10, r10\n\t" - "adds r4, r4, r8\n\t" - "adcs r2, r2, r9\n\t" - "adc r3, r3, r14\n\t" - "str r4, [%[r], #488]\n\t" - "# A[60] * A[63]\n\t" - "ldr r10, [%[a], #252]\n\t" - "ldr r8, [%[a], #240]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r2, r2, r8\n\t" - "adcs r3, r3, r9\n\t" - "adc r4, r14, r14\n\t" - "adds r2, r2, r8\n\t" - "adcs r3, r3, r9\n\t" - "adc r4, r4, r14\n\t" - "# A[61] * A[62]\n\t" - "ldr r10, [%[a], #248]\n\t" - "ldr r8, [%[a], #244]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r2, r2, r8\n\t" - "adcs r3, r3, r9\n\t" - "adc r4, r4, r14\n\t" - "adds r2, r2, r8\n\t" - "adcs r3, r3, r9\n\t" - "adc r4, r4, r14\n\t" - "str r2, [%[r], #492]\n\t" - "# A[61] * A[63]\n\t" - "ldr r10, [%[a], #252]\n\t" - "ldr r8, [%[a], #244]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r3, r3, r8\n\t" - "adcs r4, r4, r9\n\t" - "adc r2, r14, r14\n\t" - "adds r3, r3, r8\n\t" - "adcs r4, r4, r9\n\t" - "adc r2, r2, r14\n\t" - "# A[62] * A[62]\n\t" - "ldr r10, [%[a], #248]\n\t" - "umull r8, r9, r10, r10\n\t" - "adds r3, r3, r8\n\t" - "adcs r4, r4, r9\n\t" - "adc r2, r2, r14\n\t" - "str r3, [%[r], #496]\n\t" - "# A[62] * A[63]\n\t" - "ldr r10, [%[a], #252]\n\t" - "ldr r8, [%[a], #248]\n\t" - "umull r8, r9, r10, r8\n\t" - "adds r4, r4, r8\n\t" - "adcs r2, r2, r9\n\t" - "adc r3, r14, r14\n\t" - "adds r4, r4, r8\n\t" - "adcs r2, r2, r9\n\t" - "adc r3, r3, r14\n\t" - "str r4, [%[r], #500]\n\t" - "# A[63] * A[63]\n\t" - "ldr r10, [%[a], #252]\n\t" - "umull r8, r9, r10, r10\n\t" - "adds r2, r2, r8\n\t" - "adc r3, r3, r9\n\t" - "str r2, [%[r], #504]\n\t" - "str r3, [%[r], #508]\n\t" - "ldr r2, [sp, #0]\n\t" - "ldr r3, [sp, #4]\n\t" - "ldr r4, [sp, #8]\n\t" - "ldr r8, [sp, #12]\n\t" - "str r2, [%[r], #0]\n\t" - "str r3, [%[r], #4]\n\t" - "str r4, [%[r], #8]\n\t" - "str r8, [%[r], #12]\n\t" - "ldr r2, [sp, #16]\n\t" - "ldr r3, [sp, #20]\n\t" - "ldr r4, [sp, #24]\n\t" - "ldr r8, [sp, #28]\n\t" - "str r2, [%[r], #16]\n\t" - "str r3, [%[r], #20]\n\t" - "str r4, [%[r], #24]\n\t" - "str r8, [%[r], #28]\n\t" - "ldr r2, [sp, #32]\n\t" - "ldr r3, [sp, #36]\n\t" - "ldr r4, [sp, #40]\n\t" - "ldr r8, [sp, #44]\n\t" - "str r2, [%[r], #32]\n\t" - "str r3, [%[r], #36]\n\t" - "str r4, [%[r], #40]\n\t" - "str r8, [%[r], #44]\n\t" - "ldr r2, [sp, #48]\n\t" - "ldr r3, [sp, #52]\n\t" - "ldr r4, [sp, #56]\n\t" - "ldr r8, [sp, #60]\n\t" - "str r2, [%[r], #48]\n\t" - "str r3, [%[r], #52]\n\t" - "str r4, [%[r], #56]\n\t" - "str r8, [%[r], #60]\n\t" - "ldr r2, [sp, #64]\n\t" - "ldr r3, [sp, #68]\n\t" - "ldr r4, [sp, #72]\n\t" - "ldr r8, [sp, #76]\n\t" - "str r2, [%[r], #64]\n\t" - "str r3, [%[r], #68]\n\t" - "str r4, [%[r], #72]\n\t" - "str r8, [%[r], #76]\n\t" - "ldr r2, [sp, #80]\n\t" - "ldr r3, [sp, #84]\n\t" - "ldr r4, [sp, #88]\n\t" - "ldr r8, [sp, #92]\n\t" - "str r2, [%[r], #80]\n\t" - "str r3, [%[r], #84]\n\t" - "str r4, [%[r], #88]\n\t" - "str r8, [%[r], #92]\n\t" - "ldr r2, [sp, #96]\n\t" - "ldr r3, [sp, #100]\n\t" - "ldr r4, [sp, #104]\n\t" - "ldr r8, [sp, #108]\n\t" - "str r2, [%[r], #96]\n\t" - "str r3, [%[r], #100]\n\t" - "str r4, [%[r], #104]\n\t" - "str r8, [%[r], #108]\n\t" - "ldr r2, [sp, #112]\n\t" - "ldr r3, [sp, #116]\n\t" - "ldr r4, [sp, #120]\n\t" - "ldr r8, [sp, #124]\n\t" - "str r2, [%[r], #112]\n\t" - "str r3, [%[r], #116]\n\t" - "str r4, [%[r], #120]\n\t" - "str r8, [%[r], #124]\n\t" - "ldr r2, [sp, #128]\n\t" - "ldr r3, [sp, #132]\n\t" - "ldr r4, [sp, #136]\n\t" - "ldr r8, [sp, #140]\n\t" - "str r2, [%[r], #128]\n\t" - "str r3, [%[r], #132]\n\t" - "str r4, [%[r], #136]\n\t" - "str r8, [%[r], #140]\n\t" - "ldr r2, [sp, #144]\n\t" - "ldr r3, [sp, #148]\n\t" - "ldr r4, [sp, #152]\n\t" - "ldr r8, [sp, #156]\n\t" - "str r2, [%[r], #144]\n\t" - "str r3, [%[r], #148]\n\t" - "str r4, [%[r], #152]\n\t" - "str r8, [%[r], #156]\n\t" - "ldr r2, [sp, #160]\n\t" - "ldr r3, [sp, #164]\n\t" - "ldr r4, [sp, #168]\n\t" - "ldr r8, [sp, #172]\n\t" - "str r2, [%[r], #160]\n\t" - "str r3, [%[r], #164]\n\t" - "str r4, [%[r], #168]\n\t" - "str r8, [%[r], #172]\n\t" - "ldr r2, [sp, #176]\n\t" - "ldr r3, [sp, #180]\n\t" - "ldr r4, [sp, #184]\n\t" - "ldr r8, [sp, #188]\n\t" - "str r2, [%[r], #176]\n\t" - "str r3, [%[r], #180]\n\t" - "str r4, [%[r], #184]\n\t" - "str r8, [%[r], #188]\n\t" - "ldr r2, [sp, #192]\n\t" - "ldr r3, [sp, #196]\n\t" - "ldr r4, [sp, #200]\n\t" - "ldr r8, [sp, #204]\n\t" - "str r2, [%[r], #192]\n\t" - "str r3, [%[r], #196]\n\t" - "str r4, [%[r], #200]\n\t" - "str r8, [%[r], #204]\n\t" - "ldr r2, [sp, #208]\n\t" - "ldr r3, [sp, #212]\n\t" - "ldr r4, [sp, #216]\n\t" - "ldr r8, [sp, #220]\n\t" - "str r2, [%[r], #208]\n\t" - "str r3, [%[r], #212]\n\t" - "str r4, [%[r], #216]\n\t" - "str r8, [%[r], #220]\n\t" - "ldr r2, [sp, #224]\n\t" - "ldr r3, [sp, #228]\n\t" - "ldr r4, [sp, #232]\n\t" - "ldr r8, [sp, #236]\n\t" - "str r2, [%[r], #224]\n\t" - "str r3, [%[r], #228]\n\t" - "str r4, [%[r], #232]\n\t" - "str r8, [%[r], #236]\n\t" - "ldr r2, [sp, #240]\n\t" - "ldr r3, [sp, #244]\n\t" - "ldr r4, [sp, #248]\n\t" - "ldr r8, [sp, #252]\n\t" - "str r2, [%[r], #240]\n\t" - "str r3, [%[r], #244]\n\t" - "str r4, [%[r], #248]\n\t" - "str r8, [%[r], #252]\n\t" - "add sp, sp, #256\n\t" - : - : [r] "r" (r), [a] "r" (a) - : "memory", "r2", "r3", "r4", "r8", "r9", "r10", "r8", "r5", "r6", "r7", "r14" - ); -} - /* Square a and put result in r. (r = a * a) * * r A single precision integer. diff --git a/wolfcrypt/src/sp_armthumb.c b/wolfcrypt/src/sp_armthumb.c index be16eed05..b1c23b8d2 100644 --- a/wolfcrypt/src/sp_armthumb.c +++ b/wolfcrypt/src/sp_armthumb.c @@ -11498,292 +11498,6 @@ static void sp_4096_to_bin(sp_digit* r, byte* a) } #ifndef WOLFSSL_SP_SMALL -/* Add b to a into r. (r = a + b) - * - * r A single precision integer. - * a A single precision integer. - * b A single precision integer. - */ -SP_NOINLINE static sp_digit sp_4096_add_64(sp_digit* r, const sp_digit* a, - const sp_digit* b) -{ - sp_digit c = 0; - - __asm__ __volatile__ ( - "mov r7, #0\n\t" - "mvn r7, r7\n\t" - "ldr r4, [%[a], #0]\n\t" - "ldr r5, [%[b], #0]\n\t" - "add r4, r5\n\t" - "str r4, [%[r], #0]\n\t" - "ldr r4, [%[a], #4]\n\t" - "ldr r5, [%[b], #4]\n\t" - "adc r4, r5\n\t" - "str r4, [%[r], #4]\n\t" - "ldr r4, [%[a], #8]\n\t" - "ldr r5, [%[b], #8]\n\t" - "adc r4, r5\n\t" - "str r4, [%[r], #8]\n\t" - "ldr r4, [%[a], #12]\n\t" - "ldr r5, [%[b], #12]\n\t" - "adc r4, r5\n\t" - "str r4, [%[r], #12]\n\t" - "ldr r4, [%[a], #16]\n\t" - "ldr r5, [%[b], #16]\n\t" - "adc r4, r5\n\t" - "str r4, [%[r], #16]\n\t" - "ldr r4, [%[a], #20]\n\t" - "ldr r5, [%[b], #20]\n\t" - "adc r4, r5\n\t" - "str r4, [%[r], #20]\n\t" - "ldr r4, [%[a], #24]\n\t" - "ldr r5, [%[b], #24]\n\t" - "adc r4, r5\n\t" - "str r4, [%[r], #24]\n\t" - "ldr r4, [%[a], #28]\n\t" - "ldr r5, [%[b], #28]\n\t" - "adc r4, r5\n\t" - "str r4, [%[r], #28]\n\t" - "ldr r4, [%[a], #32]\n\t" - "ldr r5, [%[b], #32]\n\t" - "adc r4, r5\n\t" - "str r4, [%[r], #32]\n\t" - "ldr r4, [%[a], #36]\n\t" - "ldr r5, [%[b], #36]\n\t" - "adc r4, r5\n\t" - "str r4, [%[r], #36]\n\t" - "ldr r4, [%[a], #40]\n\t" - "ldr r5, [%[b], #40]\n\t" - "adc r4, r5\n\t" - "str r4, [%[r], #40]\n\t" - "ldr r4, [%[a], #44]\n\t" - "ldr r5, [%[b], #44]\n\t" - "adc r4, r5\n\t" - "str r4, [%[r], #44]\n\t" - "ldr r4, [%[a], #48]\n\t" - "ldr r5, [%[b], #48]\n\t" - "adc r4, r5\n\t" - "str r4, [%[r], #48]\n\t" - "ldr r4, [%[a], #52]\n\t" - "ldr r5, [%[b], #52]\n\t" - "adc r4, r5\n\t" - "str r4, [%[r], #52]\n\t" - "ldr r4, [%[a], #56]\n\t" - "ldr r5, [%[b], #56]\n\t" - "adc r4, r5\n\t" - "str r4, [%[r], #56]\n\t" - "ldr r4, [%[a], #60]\n\t" - "ldr r5, [%[b], #60]\n\t" - "adc r4, r5\n\t" - "str r4, [%[r], #60]\n\t" - "ldr r4, [%[a], #64]\n\t" - "ldr r5, [%[b], #64]\n\t" - "adc r4, r5\n\t" - "str r4, [%[r], #64]\n\t" - "ldr r4, [%[a], #68]\n\t" - "ldr r5, [%[b], #68]\n\t" - "adc r4, r5\n\t" - "str r4, [%[r], #68]\n\t" - "ldr r4, [%[a], #72]\n\t" - "ldr r5, [%[b], #72]\n\t" - "adc r4, r5\n\t" - "str r4, [%[r], #72]\n\t" - "ldr r4, [%[a], #76]\n\t" - "ldr r5, [%[b], #76]\n\t" - "adc r4, r5\n\t" - "str r4, [%[r], #76]\n\t" - "ldr r4, [%[a], #80]\n\t" - "ldr r5, [%[b], #80]\n\t" - "adc r4, r5\n\t" - "str r4, [%[r], #80]\n\t" - "ldr r4, [%[a], #84]\n\t" - "ldr r5, [%[b], #84]\n\t" - "adc r4, r5\n\t" - "str r4, [%[r], #84]\n\t" - "ldr r4, [%[a], #88]\n\t" - "ldr r5, [%[b], #88]\n\t" - "adc r4, r5\n\t" - "str r4, [%[r], #88]\n\t" - "ldr r4, [%[a], #92]\n\t" - "ldr r5, [%[b], #92]\n\t" - "adc r4, r5\n\t" - "str r4, [%[r], #92]\n\t" - "ldr r4, [%[a], #96]\n\t" - "ldr r5, [%[b], #96]\n\t" - "adc r4, r5\n\t" - "str r4, [%[r], #96]\n\t" - "ldr r4, [%[a], #100]\n\t" - "ldr r5, [%[b], #100]\n\t" - "adc r4, r5\n\t" - "str r4, [%[r], #100]\n\t" - "ldr r4, [%[a], #104]\n\t" - "ldr r5, [%[b], #104]\n\t" - "adc r4, r5\n\t" - "str r4, [%[r], #104]\n\t" - "ldr r4, [%[a], #108]\n\t" - "ldr r5, [%[b], #108]\n\t" - "adc r4, r5\n\t" - "str r4, [%[r], #108]\n\t" - "ldr r4, [%[a], #112]\n\t" - "ldr r5, [%[b], #112]\n\t" - "adc r4, r5\n\t" - "str r4, [%[r], #112]\n\t" - "ldr r4, [%[a], #116]\n\t" - "ldr r5, [%[b], #116]\n\t" - "adc r4, r5\n\t" - "str r4, [%[r], #116]\n\t" - "ldr r4, [%[a], #120]\n\t" - "ldr r5, [%[b], #120]\n\t" - "adc r4, r5\n\t" - "str r4, [%[r], #120]\n\t" - "ldr r4, [%[a], #124]\n\t" - "ldr r5, [%[b], #124]\n\t" - "adc r4, r5\n\t" - "str r4, [%[r], #124]\n\t" - "mov %[c], #0\n\t" - "adc %[c], %[c]\n\t" - "add %[a], #0x80\n\t" - "add %[b], #0x80\n\t" - "add %[r], #0x80\n\t" - "add %[c], r7\n\t" - "ldr r4, [%[a], #0]\n\t" - "ldr r5, [%[b], #0]\n\t" - "adc r4, r5\n\t" - "str r4, [%[r], #0]\n\t" - "ldr r4, [%[a], #4]\n\t" - "ldr r5, [%[b], #4]\n\t" - "adc r4, r5\n\t" - "str r4, [%[r], #4]\n\t" - "ldr r4, [%[a], #8]\n\t" - "ldr r5, [%[b], #8]\n\t" - "adc r4, r5\n\t" - "str r4, [%[r], #8]\n\t" - "ldr r4, [%[a], #12]\n\t" - "ldr r5, [%[b], #12]\n\t" - "adc r4, r5\n\t" - "str r4, [%[r], #12]\n\t" - "ldr r4, [%[a], #16]\n\t" - "ldr r5, [%[b], #16]\n\t" - "adc r4, r5\n\t" - "str r4, [%[r], #16]\n\t" - "ldr r4, [%[a], #20]\n\t" - "ldr r5, [%[b], #20]\n\t" - "adc r4, r5\n\t" - "str r4, [%[r], #20]\n\t" - "ldr r4, [%[a], #24]\n\t" - "ldr r5, [%[b], #24]\n\t" - "adc r4, r5\n\t" - "str r4, [%[r], #24]\n\t" - "ldr r4, [%[a], #28]\n\t" - "ldr r5, [%[b], #28]\n\t" - "adc r4, r5\n\t" - "str r4, [%[r], #28]\n\t" - "ldr r4, [%[a], #32]\n\t" - "ldr r5, [%[b], #32]\n\t" - "adc r4, r5\n\t" - "str r4, [%[r], #32]\n\t" - "ldr r4, [%[a], #36]\n\t" - "ldr r5, [%[b], #36]\n\t" - "adc r4, r5\n\t" - "str r4, [%[r], #36]\n\t" - "ldr r4, [%[a], #40]\n\t" - "ldr r5, [%[b], #40]\n\t" - "adc r4, r5\n\t" - "str r4, [%[r], #40]\n\t" - "ldr r4, [%[a], #44]\n\t" - "ldr r5, [%[b], #44]\n\t" - "adc r4, r5\n\t" - "str r4, [%[r], #44]\n\t" - "ldr r4, [%[a], #48]\n\t" - "ldr r5, [%[b], #48]\n\t" - "adc r4, r5\n\t" - "str r4, [%[r], #48]\n\t" - "ldr r4, [%[a], #52]\n\t" - "ldr r5, [%[b], #52]\n\t" - "adc r4, r5\n\t" - "str r4, [%[r], #52]\n\t" - "ldr r4, [%[a], #56]\n\t" - "ldr r5, [%[b], #56]\n\t" - "adc r4, r5\n\t" - "str r4, [%[r], #56]\n\t" - "ldr r4, [%[a], #60]\n\t" - "ldr r5, [%[b], #60]\n\t" - "adc r4, r5\n\t" - "str r4, [%[r], #60]\n\t" - "ldr r4, [%[a], #64]\n\t" - "ldr r5, [%[b], #64]\n\t" - "adc r4, r5\n\t" - "str r4, [%[r], #64]\n\t" - "ldr r4, [%[a], #68]\n\t" - "ldr r5, [%[b], #68]\n\t" - "adc r4, r5\n\t" - "str r4, [%[r], #68]\n\t" - "ldr r4, [%[a], #72]\n\t" - "ldr r5, [%[b], #72]\n\t" - "adc r4, r5\n\t" - "str r4, [%[r], #72]\n\t" - "ldr r4, [%[a], #76]\n\t" - "ldr r5, [%[b], #76]\n\t" - "adc r4, r5\n\t" - "str r4, [%[r], #76]\n\t" - "ldr r4, [%[a], #80]\n\t" - "ldr r5, [%[b], #80]\n\t" - "adc r4, r5\n\t" - "str r4, [%[r], #80]\n\t" - "ldr r4, [%[a], #84]\n\t" - "ldr r5, [%[b], #84]\n\t" - "adc r4, r5\n\t" - "str r4, [%[r], #84]\n\t" - "ldr r4, [%[a], #88]\n\t" - "ldr r5, [%[b], #88]\n\t" - "adc r4, r5\n\t" - "str r4, [%[r], #88]\n\t" - "ldr r4, [%[a], #92]\n\t" - "ldr r5, [%[b], #92]\n\t" - "adc r4, r5\n\t" - "str r4, [%[r], #92]\n\t" - "ldr r4, [%[a], #96]\n\t" - "ldr r5, [%[b], #96]\n\t" - "adc r4, r5\n\t" - "str r4, [%[r], #96]\n\t" - "ldr r4, [%[a], #100]\n\t" - "ldr r5, [%[b], #100]\n\t" - "adc r4, r5\n\t" - "str r4, [%[r], #100]\n\t" - "ldr r4, [%[a], #104]\n\t" - "ldr r5, [%[b], #104]\n\t" - "adc r4, r5\n\t" - "str r4, [%[r], #104]\n\t" - "ldr r4, [%[a], #108]\n\t" - "ldr r5, [%[b], #108]\n\t" - "adc r4, r5\n\t" - "str r4, [%[r], #108]\n\t" - "ldr r4, [%[a], #112]\n\t" - "ldr r5, [%[b], #112]\n\t" - "adc r4, r5\n\t" - "str r4, [%[r], #112]\n\t" - "ldr r4, [%[a], #116]\n\t" - "ldr r5, [%[b], #116]\n\t" - "adc r4, r5\n\t" - "str r4, [%[r], #116]\n\t" - "ldr r4, [%[a], #120]\n\t" - "ldr r5, [%[b], #120]\n\t" - "adc r4, r5\n\t" - "str r4, [%[r], #120]\n\t" - "ldr r4, [%[a], #124]\n\t" - "ldr r5, [%[b], #124]\n\t" - "adc r4, r5\n\t" - "str r4, [%[r], #124]\n\t" - "mov %[c], #0\n\t" - "adc %[c], %[c]\n\t" - : [c] "+r" (c), [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) - : - : "memory", "r4", "r5", "r7" - ); - - return c; -} - /* Sub b from a into r. (r = a - b) * * r A single precision integer. @@ -12886,139 +12600,6 @@ SP_NOINLINE static sp_digit sp_4096_add_128(sp_digit* r, const sp_digit* a, return c; } -/* Multiply a and b into r. (r = a * b) - * - * r A single precision integer. - * a A single precision integer. - * b A single precision integer. - */ -SP_NOINLINE static void sp_4096_mul_64(sp_digit* r, const sp_digit* a, - const sp_digit* b) -{ - sp_digit tmp[64 * 2]; - __asm__ __volatile__ ( - "mov r3, #0\n\t" - "mov r4, #0\n\t" - "mov r8, r3\n\t" - "mov r11, %[r]\n\t" - "mov r9, %[a]\n\t" - "mov r10, %[b]\n\t" - "mov r6, #1\n\t" - "lsl r6, r6, #8\n\t" - "add r6, r9\n\t" - "mov r12, r6\n\t" - "\n1:\n\t" - "mov %[r], #0\n\t" - "mov r5, #0\n\t" - "mov r6, #252\n\t" - "mov %[a], r8\n\t" - "sub %[a], r6\n\t" - "sbc r6, r6\n\t" - "mvn r6, r6\n\t" - "and %[a], r6\n\t" - "mov %[b], r8\n\t" - "sub %[b], %[a]\n\t" - "add %[a], r9\n\t" - "add %[b], r10\n\t" - "\n2:\n\t" - "# Multiply Start\n\t" - "ldr r6, [%[a]]\n\t" - "ldr r7, [%[b]]\n\t" - "lsl r6, r6, #16\n\t" - "lsl r7, r7, #16\n\t" - "lsr r6, r6, #16\n\t" - "lsr r7, r7, #16\n\t" - "mul r7, r6\n\t" - "add r3, r7\n\t" - "adc r4, %[r]\n\t" - "adc r5, %[r]\n\t" - "ldr r7, [%[b]]\n\t" - "lsr r7, r7, #16\n\t" - "mul r6, r7\n\t" - "lsr r7, r6, #16\n\t" - "lsl r6, r6, #16\n\t" - "add r3, r6\n\t" - "adc r4, r7\n\t" - "adc r5, %[r]\n\t" - "ldr r6, [%[a]]\n\t" - "ldr r7, [%[b]]\n\t" - "lsr r6, r6, #16\n\t" - "lsr r7, r7, #16\n\t" - "mul r7, r6\n\t" - "add r4, r7\n\t" - "adc r5, %[r]\n\t" - "ldr r7, [%[b]]\n\t" - "lsl r7, r7, #16\n\t" - "lsr r7, r7, #16\n\t" - "mul r6, r7\n\t" - "lsr r7, r6, #16\n\t" - "lsl r6, r6, #16\n\t" - "add r3, r6\n\t" - "adc r4, r7\n\t" - "adc r5, %[r]\n\t" - "# Multiply Done\n\t" - "add %[a], #4\n\t" - "sub %[b], #4\n\t" - "cmp %[a], r12\n\t" - "beq 3f\n\t" - "mov r6, r8\n\t" - "add r6, r9\n\t" - "cmp %[a], r6\n\t" - "ble 2b\n\t" - "\n3:\n\t" - "mov %[r], r11\n\t" - "mov r7, r8\n\t" - "str r3, [%[r], r7]\n\t" - "mov r3, r4\n\t" - "mov r4, r5\n\t" - "add r7, #4\n\t" - "mov r8, r7\n\t" - "mov r6, #1\n\t" - "lsl r6, r6, #8\n\t" - "add r6, #248\n\t" - "cmp r7, r6\n\t" - "ble 1b\n\t" - "str r3, [%[r], r7]\n\t" - "mov %[a], r9\n\t" - "mov %[b], r10\n\t" - : - : [r] "r" (tmp), [a] "r" (a), [b] "r" (b) - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12" - ); - - XMEMCPY(r, tmp, sizeof(tmp)); -} - -/* AND m into each word of a and store in r. - * - * r A single precision integer. - * a A single precision integer. - * m Mask to AND against each digit. - */ -static void sp_4096_mask_64(sp_digit* r, const sp_digit* a, sp_digit m) -{ -#ifdef WOLFSSL_SP_SMALL - int i; - - for (i=0; i<64; i++) { - r[i] = a[i] & m; - } -#else - int i; - - for (i = 0; i < 64; i += 8) { - r[i+0] = a[i+0] & m; - r[i+1] = a[i+1] & m; - r[i+2] = a[i+2] & m; - r[i+3] = a[i+3] & m; - r[i+4] = a[i+4] & m; - r[i+5] = a[i+5] & m; - r[i+6] = a[i+6] & m; - r[i+7] = a[i+7] & m; - } -#endif -} - /* Multiply a and b into r. (r = a * b) * * r A single precision integer. @@ -13052,161 +12633,6 @@ SP_NOINLINE static void sp_4096_mul_128(sp_digit* r, const sp_digit* a, (void)sp_4096_add_128(r + 128, r + 128, z2); } -/* Square a and put result in r. (r = a * a) - * - * r A single precision integer. - * a A single precision integer. - */ -SP_NOINLINE static void sp_4096_sqr_64(sp_digit* r, const sp_digit* a) -{ - __asm__ __volatile__ ( - "mov r3, #0\n\t" - "mov r4, #0\n\t" - "mov r5, #0\n\t" - "mov r8, r3\n\t" - "mov r11, %[r]\n\t" - "mov r6, #2\n\t" - "lsl r6, r6, #8\n\t" - "neg r6, r6\n\t" - "add sp, r6\n\t" - "mov r10, sp\n\t" - "mov r9, %[a]\n\t" - "\n1:\n\t" - "mov %[r], #0\n\t" - "mov r6, #252\n\t" - "mov %[a], r8\n\t" - "sub %[a], r6\n\t" - "sbc r6, r6\n\t" - "mvn r6, r6\n\t" - "and %[a], r6\n\t" - "mov r2, r8\n\t" - "sub r2, %[a]\n\t" - "add %[a], r9\n\t" - "add r2, r9\n\t" - "\n2:\n\t" - "cmp r2, %[a]\n\t" - "beq 4f\n\t" - "# Multiply * 2: Start\n\t" - "ldr r6, [%[a]]\n\t" - "ldr r7, [r2]\n\t" - "lsl r6, r6, #16\n\t" - "lsl r7, r7, #16\n\t" - "lsr r6, r6, #16\n\t" - "lsr r7, r7, #16\n\t" - "mul r7, r6\n\t" - "add r3, r7\n\t" - "adc r4, %[r]\n\t" - "adc r5, %[r]\n\t" - "add r3, r7\n\t" - "adc r4, %[r]\n\t" - "adc r5, %[r]\n\t" - "ldr r7, [r2]\n\t" - "lsr r7, r7, #16\n\t" - "mul r6, r7\n\t" - "lsr r7, r6, #16\n\t" - "lsl r6, r6, #16\n\t" - "add r3, r6\n\t" - "adc r4, r7\n\t" - "adc r5, %[r]\n\t" - "add r3, r6\n\t" - "adc r4, r7\n\t" - "adc r5, %[r]\n\t" - "ldr r6, [%[a]]\n\t" - "ldr r7, [r2]\n\t" - "lsr r6, r6, #16\n\t" - "lsr r7, r7, #16\n\t" - "mul r7, r6\n\t" - "add r4, r7\n\t" - "adc r5, %[r]\n\t" - "add r4, r7\n\t" - "adc r5, %[r]\n\t" - "ldr r7, [r2]\n\t" - "lsl r7, r7, #16\n\t" - "lsr r7, r7, #16\n\t" - "mul r6, r7\n\t" - "lsr r7, r6, #16\n\t" - "lsl r6, r6, #16\n\t" - "add r3, r6\n\t" - "adc r4, r7\n\t" - "adc r5, %[r]\n\t" - "add r3, r6\n\t" - "adc r4, r7\n\t" - "adc r5, %[r]\n\t" - "# Multiply * 2: Done\n\t" - "bal 5f\n\t" - "\n4:\n\t" - "# Square: Start\n\t" - "ldr r6, [%[a]]\n\t" - "lsr r7, r6, #16\n\t" - "lsl r6, r6, #16\n\t" - "lsr r6, r6, #16\n\t" - "mul r6, r6\n\t" - "add r3, r6\n\t" - "adc r4, %[r]\n\t" - "adc r5, %[r]\n\t" - "mul r7, r7\n\t" - "add r4, r7\n\t" - "adc r5, %[r]\n\t" - "ldr r6, [%[a]]\n\t" - "lsr r7, r6, #16\n\t" - "lsl r6, r6, #16\n\t" - "lsr r6, r6, #16\n\t" - "mul r6, r7\n\t" - "lsr r7, r6, #15\n\t" - "lsl r6, r6, #17\n\t" - "add r3, r6\n\t" - "adc r4, r7\n\t" - "adc r5, %[r]\n\t" - "# Square: Done\n\t" - "\n5:\n\t" - "add %[a], #4\n\t" - "sub r2, #4\n\t" - "mov r6, #1\n\t" - "lsl r6, r6, #8\n\t" - "add r6, r9\n\t" - "cmp %[a], r6\n\t" - "beq 3f\n\t" - "cmp %[a], r2\n\t" - "bgt 3f\n\t" - "mov r7, r8\n\t" - "add r7, r9\n\t" - "cmp %[a], r7\n\t" - "ble 2b\n\t" - "\n3:\n\t" - "mov %[r], r10\n\t" - "mov r7, r8\n\t" - "str r3, [%[r], r7]\n\t" - "mov r3, r4\n\t" - "mov r4, r5\n\t" - "mov r5, #0\n\t" - "add r7, #4\n\t" - "mov r8, r7\n\t" - "mov r6, #1\n\t" - "lsl r6, r6, #8\n\t" - "add r6, #248\n\t" - "cmp r7, r6\n\t" - "ble 1b\n\t" - "mov %[a], r9\n\t" - "str r3, [%[r], r7]\n\t" - "mov %[r], r11\n\t" - "mov %[a], r10\n\t" - "mov r3, #1\n\t" - "lsl r3, r3, #8\n\t" - "add r3, #252\n\t" - "\n4:\n\t" - "ldr r6, [%[a], r3]\n\t" - "str r6, [%[r], r3]\n\t" - "sub r3, #4\n\t" - "bge 4b\n\t" - "mov r6, #2\n\t" - "lsl r6, r6, #8\n\t" - "add sp, r6\n\t" - : - : [r] "r" (r), [a] "r" (a) - : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11" - ); -} - /* Square a and put result in r. (r = a * a) * * r A single precision integer. diff --git a/wolfcrypt/src/sp_c32.c b/wolfcrypt/src/sp_c32.c index 44fbc7774..a607adf15 100644 --- a/wolfcrypt/src/sp_c32.c +++ b/wolfcrypt/src/sp_c32.c @@ -1990,7 +1990,7 @@ static int sp_2048_mod_exp_45(sp_digit* r, const sp_digit* a, const sp_digit* e, #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; #else - sp_digit td[3 * 90]; + sp_digit td[90]; #endif sp_digit* t[3]; sp_digit* norm; @@ -2014,7 +2014,7 @@ static int sp_2048_mod_exp_45(sp_digit* r, const sp_digit* a, const sp_digit* e, #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) t[i] = td + (i * 45 * 2); #else - t[i] = &td[i * 45 * 2]; + t[i] = &td[i * 45 * 2)]; #endif } @@ -2943,7 +2943,7 @@ static int sp_2048_mod_exp_90(sp_digit* r, const sp_digit* a, const sp_digit* e, #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; #else - sp_digit td[3 * 180]; + sp_digit td[180]; #endif sp_digit* t[3]; sp_digit* norm; @@ -2967,7 +2967,7 @@ static int sp_2048_mod_exp_90(sp_digit* r, const sp_digit* a, const sp_digit* e, #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) t[i] = td + (i * 90 * 2); #else - t[i] = &td[i * 90 * 2]; + t[i] = &td[i * 90 * 2)]; #endif } @@ -5831,7 +5831,7 @@ static int sp_3072_mod_exp_67(sp_digit* r, const sp_digit* a, const sp_digit* e, #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; #else - sp_digit td[3 * 134]; + sp_digit td[134]; #endif sp_digit* t[3]; sp_digit* norm; @@ -5855,7 +5855,7 @@ static int sp_3072_mod_exp_67(sp_digit* r, const sp_digit* a, const sp_digit* e, #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) t[i] = td + (i * 67 * 2); #else - t[i] = &td[i * 67 * 2]; + t[i] = &td[i * 67 * 2)]; #endif } @@ -6820,7 +6820,7 @@ static int sp_3072_mod_exp_134(sp_digit* r, const sp_digit* a, const sp_digit* e #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; #else - sp_digit td[3 * 268]; + sp_digit td[268]; #endif sp_digit* t[3]; sp_digit* norm; @@ -6844,7 +6844,7 @@ static int sp_3072_mod_exp_134(sp_digit* r, const sp_digit* a, const sp_digit* e #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) t[i] = td + (i * 134 * 2); #else - t[i] = &td[i * 134 * 2]; + t[i] = &td[i * 134 * 2)]; #endif } @@ -9895,7 +9895,7 @@ static int sp_4096_mod_exp_98(sp_digit* r, const sp_digit* a, const sp_digit* e, #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; #else - sp_digit td[3 * 196]; + sp_digit td[196]; #endif sp_digit* t[3]; sp_digit* norm; @@ -9919,7 +9919,7 @@ static int sp_4096_mod_exp_98(sp_digit* r, const sp_digit* a, const sp_digit* e, #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) t[i] = td + (i * 98 * 2); #else - t[i] = &td[i * 98 * 2]; + t[i] = &td[i * 98 * 2)]; #endif } @@ -10861,7 +10861,7 @@ static int sp_4096_mod_exp_196(sp_digit* r, const sp_digit* a, const sp_digit* e #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; #else - sp_digit td[3 * 392]; + sp_digit td[392]; #endif sp_digit* t[3]; sp_digit* norm; @@ -10885,7 +10885,7 @@ static int sp_4096_mod_exp_196(sp_digit* r, const sp_digit* a, const sp_digit* e #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) t[i] = td + (i * 196 * 2); #else - t[i] = &td[i * 196 * 2]; + t[i] = &td[i * 196 * 2)]; #endif } diff --git a/wolfcrypt/src/sp_c64.c b/wolfcrypt/src/sp_c64.c index 86f8dc334..f956f86ed 100644 --- a/wolfcrypt/src/sp_c64.c +++ b/wolfcrypt/src/sp_c64.c @@ -1638,7 +1638,7 @@ static int sp_2048_mod_exp_18(sp_digit* r, const sp_digit* a, const sp_digit* e, #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; #else - sp_digit td[3 * 36]; + sp_digit td[36]; #endif sp_digit* t[3]; sp_digit* norm; @@ -1662,7 +1662,7 @@ static int sp_2048_mod_exp_18(sp_digit* r, const sp_digit* a, const sp_digit* e, #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) t[i] = td + (i * 18 * 2); #else - t[i] = &td[i * 18 * 2]; + t[i] = &td[i * 18 * 2)]; #endif } @@ -2583,7 +2583,7 @@ static int sp_2048_mod_exp_36(sp_digit* r, const sp_digit* a, const sp_digit* e, #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; #else - sp_digit td[3 * 72]; + sp_digit td[72]; #endif sp_digit* t[3]; sp_digit* norm; @@ -2607,7 +2607,7 @@ static int sp_2048_mod_exp_36(sp_digit* r, const sp_digit* a, const sp_digit* e, #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) t[i] = td + (i * 36 * 2); #else - t[i] = &td[i * 36 * 2]; + t[i] = &td[i * 36 * 2)]; #endif } @@ -5819,7 +5819,7 @@ static int sp_3072_mod_exp_27(sp_digit* r, const sp_digit* a, const sp_digit* e, #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; #else - sp_digit td[3 * 54]; + sp_digit td[54]; #endif sp_digit* t[3]; sp_digit* norm; @@ -5843,7 +5843,7 @@ static int sp_3072_mod_exp_27(sp_digit* r, const sp_digit* a, const sp_digit* e, #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) t[i] = td + (i * 27 * 2); #else - t[i] = &td[i * 27 * 2]; + t[i] = &td[i * 27 * 2)]; #endif } @@ -6734,7 +6734,7 @@ static int sp_3072_mod_exp_54(sp_digit* r, const sp_digit* a, const sp_digit* e, #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; #else - sp_digit td[3 * 108]; + sp_digit td[108]; #endif sp_digit* t[3]; sp_digit* norm; @@ -6758,7 +6758,7 @@ static int sp_3072_mod_exp_54(sp_digit* r, const sp_digit* a, const sp_digit* e, #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) t[i] = td + (i * 54 * 2); #else - t[i] = &td[i * 54 * 2]; + t[i] = &td[i * 54 * 2)]; #endif } @@ -10116,7 +10116,7 @@ static int sp_4096_mod_exp_39(sp_digit* r, const sp_digit* a, const sp_digit* e, #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; #else - sp_digit td[3 * 78]; + sp_digit td[78]; #endif sp_digit* t[3]; sp_digit* norm; @@ -10140,7 +10140,7 @@ static int sp_4096_mod_exp_39(sp_digit* r, const sp_digit* a, const sp_digit* e, #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) t[i] = td + (i * 39 * 2); #else - t[i] = &td[i * 39 * 2]; + t[i] = &td[i * 39 * 2)]; #endif } @@ -11130,7 +11130,7 @@ static int sp_4096_mod_exp_78(sp_digit* r, const sp_digit* a, const sp_digit* e, #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; #else - sp_digit td[3 * 156]; + sp_digit td[156]; #endif sp_digit* t[3]; sp_digit* norm; @@ -11154,7 +11154,7 @@ static int sp_4096_mod_exp_78(sp_digit* r, const sp_digit* a, const sp_digit* e, #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) t[i] = td + (i * 78 * 2); #else - t[i] = &td[i * 78 * 2]; + t[i] = &td[i * 78 * 2)]; #endif } diff --git a/wolfcrypt/src/sp_cortexm.c b/wolfcrypt/src/sp_cortexm.c index ec2a5003b..57093533a 100644 --- a/wolfcrypt/src/sp_cortexm.c +++ b/wolfcrypt/src/sp_cortexm.c @@ -10097,188 +10097,6 @@ static void sp_4096_to_bin(sp_digit* r, byte* a) } #ifndef WOLFSSL_SP_SMALL -/* Add b to a into r. (r = a + b) - * - * r A single precision integer. - * a A single precision integer. - * b A single precision integer. - */ -SP_NOINLINE static sp_digit sp_4096_add_64(sp_digit* r, const sp_digit* a, - const sp_digit* b) -{ - sp_digit c = 0; - - __asm__ __volatile__ ( - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "mov %[c], #0\n\t" - "adc %[c], %[c], %[c]\n\t" - : [c] "+r" (c), [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) - : - : "memory", "r4", "r5", "r6", "r8" - ); - - return c; -} - /* Sub b from a into r. (r = a - b) * * r A single precision integer. @@ -10962,111 +10780,6 @@ SP_NOINLINE static sp_digit sp_4096_add_128(sp_digit* r, const sp_digit* a, return c; } -/* Multiply a and b into r. (r = a * b) - * - * r A single precision integer. - * a A single precision integer. - * b A single precision integer. - */ -SP_NOINLINE static void sp_4096_mul_64(sp_digit* r, const sp_digit* a, - const sp_digit* b) -{ - sp_digit tmp[64 * 2]; - __asm__ __volatile__ ( - "mov r3, #0\n\t" - "mov r4, #0\n\t" - "mov r9, r3\n\t" - "mov r12, %[r]\n\t" - "mov r10, %[a]\n\t" - "mov r11, %[b]\n\t" - "mov r6, #1\n\t" - "lsl r6, r6, #8\n\t" - "add r6, r6, r10\n\t" - "mov r14, r6\n\t" - "\n1:\n\t" - "mov %[r], #0\n\t" - "mov r5, #0\n\t" - "mov r6, #252\n\t" - "mov %[a], r9\n\t" - "subs %[a], %[a], r6\n\t" - "sbc r6, r6, r6\n\t" - "mvn r6, r6\n\t" - "and %[a], %[a], r6\n\t" - "mov %[b], r9\n\t" - "sub %[b], %[b], %[a]\n\t" - "add %[a], %[a], r10\n\t" - "add %[b], %[b], r11\n\t" - "\n2:\n\t" - /* Multiply Start */ - "ldr r6, [%[a]]\n\t" - "ldr r8, [%[b]]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, %[r]\n\t" - /* Multiply Done */ - "add %[a], %[a], #4\n\t" - "sub %[b], %[b], #4\n\t" - "cmp %[a], r14\n\t" - "beq 3f\n\t" - "mov r6, r9\n\t" - "add r6, r6, r10\n\t" - "cmp %[a], r6\n\t" - "ble 2b\n\t" - "\n3:\n\t" - "mov %[r], r12\n\t" - "mov r8, r9\n\t" - "str r3, [%[r], r8]\n\t" - "mov r3, r4\n\t" - "mov r4, r5\n\t" - "add r8, r8, #4\n\t" - "mov r9, r8\n\t" - "mov r6, #1\n\t" - "lsl r6, r6, #8\n\t" - "add r6, r6, #248\n\t" - "cmp r8, r6\n\t" - "ble 1b\n\t" - "str r3, [%[r], r8]\n\t" - "mov %[a], r10\n\t" - "mov %[b], r11\n\t" - : - : [r] "r" (tmp), [a] "r" (a), [b] "r" (b) - : "memory", "r3", "r4", "r5", "r6", "r8", "r9", "r10", "r11", "r12", "r14" - ); - - XMEMCPY(r, tmp, sizeof(tmp)); -} - -/* AND m into each word of a and store in r. - * - * r A single precision integer. - * a A single precision integer. - * m Mask to AND against each digit. - */ -static void sp_4096_mask_64(sp_digit* r, const sp_digit* a, sp_digit m) -{ -#ifdef WOLFSSL_SP_SMALL - int i; - - for (i=0; i<64; i++) { - r[i] = a[i] & m; - } -#else - int i; - - for (i = 0; i < 64; i += 8) { - r[i+0] = a[i+0] & m; - r[i+1] = a[i+1] & m; - r[i+2] = a[i+2] & m; - r[i+3] = a[i+3] & m; - r[i+4] = a[i+4] & m; - r[i+5] = a[i+5] & m; - r[i+6] = a[i+6] & m; - r[i+7] = a[i+7] & m; - } -#endif -} - /* Multiply a and b into r. (r = a * b) * * r A single precision integer. @@ -11100,109 +10813,6 @@ SP_NOINLINE static void sp_4096_mul_128(sp_digit* r, const sp_digit* a, (void)sp_4096_add_128(r + 128, r + 128, z2); } -/* Square a and put result in r. (r = a * a) - * - * r A single precision integer. - * a A single precision integer. - */ -SP_NOINLINE static void sp_4096_sqr_64(sp_digit* r, const sp_digit* a) -{ - __asm__ __volatile__ ( - "mov r3, #0\n\t" - "mov r4, #0\n\t" - "mov r5, #0\n\t" - "mov r9, r3\n\t" - "mov r12, %[r]\n\t" - "mov r6, #2\n\t" - "lsl r6, r6, #8\n\t" - "neg r6, r6\n\t" - "add sp, sp, r6\n\t" - "mov r11, sp\n\t" - "mov r10, %[a]\n\t" - "\n1:\n\t" - "mov %[r], #0\n\t" - "mov r6, #252\n\t" - "mov %[a], r9\n\t" - "subs %[a], %[a], r6\n\t" - "sbc r6, r6, r6\n\t" - "mvn r6, r6\n\t" - "and %[a], %[a], r6\n\t" - "mov r2, r9\n\t" - "sub r2, r2, %[a]\n\t" - "add %[a], %[a], r10\n\t" - "add r2, r2, r10\n\t" - "\n2:\n\t" - "cmp r2, %[a]\n\t" - "beq 4f\n\t" - /* Multiply * 2: Start */ - "ldr r6, [%[a]]\n\t" - "ldr r8, [r2]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, %[r]\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, %[r]\n\t" - /* Multiply * 2: Done */ - "bal 5f\n\t" - "\n4:\n\t" - /* Square: Start */ - "ldr r6, [%[a]]\n\t" - "umull r6, r8, r6, r6\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, %[r]\n\t" - /* Square: Done */ - "\n5:\n\t" - "add %[a], %[a], #4\n\t" - "sub r2, r2, #4\n\t" - "mov r6, #1\n\t" - "lsl r6, r6, #8\n\t" - "add r6, r6, r10\n\t" - "cmp %[a], r6\n\t" - "beq 3f\n\t" - "cmp %[a], r2\n\t" - "bgt 3f\n\t" - "mov r8, r9\n\t" - "add r8, r8, r10\n\t" - "cmp %[a], r8\n\t" - "ble 2b\n\t" - "\n3:\n\t" - "mov %[r], r11\n\t" - "mov r8, r9\n\t" - "str r3, [%[r], r8]\n\t" - "mov r3, r4\n\t" - "mov r4, r5\n\t" - "mov r5, #0\n\t" - "add r8, r8, #4\n\t" - "mov r9, r8\n\t" - "mov r6, #1\n\t" - "lsl r6, r6, #8\n\t" - "add r6, r6, #248\n\t" - "cmp r8, r6\n\t" - "ble 1b\n\t" - "mov %[a], r10\n\t" - "str r3, [%[r], r8]\n\t" - "mov %[r], r12\n\t" - "mov %[a], r11\n\t" - "mov r3, #1\n\t" - "lsl r3, r3, #8\n\t" - "add r3, r3, #252\n\t" - "\n4:\n\t" - "ldr r6, [%[a], r3]\n\t" - "str r6, [%[r], r3]\n\t" - "subs r3, r3, #4\n\t" - "bge 4b\n\t" - "mov r6, #2\n\t" - "lsl r6, r6, #8\n\t" - "add sp, sp, r6\n\t" - : - : [r] "r" (r), [a] "r" (a) - : "memory", "r2", "r3", "r4", "r5", "r6", "r8", "r9", "r10", "r11", "r12" - ); -} - /* Square a and put result in r. (r = a * a) * * r A single precision integer. From 0295b5ae3bfbda8d80a392b4193affc26da5ec91 Mon Sep 17 00:00:00 2001 From: Sean Parkinson Date: Wed, 13 May 2020 16:14:47 +1000 Subject: [PATCH 100/298] If encryption setup, TLS 1.3 alerts encrypted --- src/internal.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/internal.c b/src/internal.c index ea94788ca..36eaaeda9 100644 --- a/src/internal.c +++ b/src/internal.c @@ -17521,7 +17521,7 @@ int SendAlert(WOLFSSL* ssl, int severity, int type) /* only send encrypted alert if handshake actually complete, otherwise other side may not be able to handle it */ if (IsEncryptionOn(ssl, 1) && (IsAtLeastTLSv1_3(ssl->version) || - ssl->options.handShakeDone)) { + ssl->encrypt.setup)) { sendSz = BuildMessage(ssl, output, outputSz, input, ALERT_SIZE, alert, 0, 0, 0); } From 1876fe1c220d6236de209ee4080a622ece31eeb5 Mon Sep 17 00:00:00 2001 From: JacobBarthelmeh Date: Wed, 13 May 2020 13:59:35 -0700 Subject: [PATCH 101/298] init FP mutex on wolfCrypt init --- wolfcrypt/src/ecc.c | 23 ++++++++++++----------- wolfcrypt/src/wc_port.c | 3 +++ wolfssl/wolfcrypt/ecc.h | 2 ++ 3 files changed, 17 insertions(+), 11 deletions(-) diff --git a/wolfcrypt/src/ecc.c b/wolfcrypt/src/ecc.c index 22db7f167..f27ee2192 100644 --- a/wolfcrypt/src/ecc.c +++ b/wolfcrypt/src/ecc.c @@ -9385,10 +9385,6 @@ int ecc_mul2add(ecc_point* A, mp_int* kA, return err; #ifndef HAVE_THREAD_LS - if (initMutex == 0) { - wc_InitMutex(&ecc_fp_lock); - initMutex = 1; - } if (wc_LockMutex(&ecc_fp_lock) != 0) return BAD_MUTEX_E; #endif /* HAVE_THREAD_LS */ @@ -9512,11 +9508,6 @@ int wc_ecc_mulmod_ex(mp_int* k, ecc_point *G, ecc_point *R, mp_int* a, return MP_INIT_E; #ifndef HAVE_THREAD_LS - if (initMutex == 0) { - wc_InitMutex(&ecc_fp_lock); - initMutex = 1; - } - if (wc_LockMutex(&ecc_fp_lock) != 0) return BAD_MUTEX_E; #endif /* HAVE_THREAD_LS */ @@ -9616,8 +9607,9 @@ static void wc_ecc_fp_free_cache(void) } #endif -/** Free the Fixed Point cache */ -void wc_ecc_fp_free(void) + +/** Init the Fixed Point cache */ +void wc_ecc_fp_init(void) { #ifndef WOLFSSL_SP_MATH #ifndef HAVE_THREAD_LS @@ -9625,7 +9617,16 @@ void wc_ecc_fp_free(void) wc_InitMutex(&ecc_fp_lock); initMutex = 1; } +#endif +#endif +} + +/** Free the Fixed Point cache */ +void wc_ecc_fp_free(void) +{ +#ifndef WOLFSSL_SP_MATH +#ifndef HAVE_THREAD_LS if (wc_LockMutex(&ecc_fp_lock) == 0) { #endif /* HAVE_THREAD_LS */ diff --git a/wolfcrypt/src/wc_port.c b/wolfcrypt/src/wc_port.c index 087807b71..bb847fe94 100644 --- a/wolfcrypt/src/wc_port.c +++ b/wolfcrypt/src/wc_port.c @@ -219,6 +219,9 @@ int wolfCrypt_Init(void) #endif #ifdef HAVE_ECC + #ifdef FP_ECC + wc_ecc_fp_init(); + #endif #ifdef ECC_CACHE_CURVE if ((ret = wc_ecc_curve_cache_init()) != 0) { WOLFSSL_MSG("Error creating curve cache"); diff --git a/wolfssl/wolfcrypt/ecc.h b/wolfssl/wolfcrypt/ecc.h index 27f42067f..f67a3930b 100644 --- a/wolfssl/wolfcrypt/ecc.h +++ b/wolfssl/wolfcrypt/ecc.h @@ -521,6 +521,8 @@ WOLFSSL_API int wc_ecc_set_flags(ecc_key* key, word32 flags); WOLFSSL_API void wc_ecc_fp_free(void); +WOLFSSL_LOCAL +void wc_ecc_fp_init(void); WOLFSSL_API int wc_ecc_set_curve(ecc_key* key, int keysize, int curve_id); From 24634a02c9118b441e64d1951438ec05d12b35e0 Mon Sep 17 00:00:00 2001 From: Juliusz Sosinowicz Date: Thu, 14 May 2020 10:54:45 +0200 Subject: [PATCH 102/298] Fix comment --- wolfcrypt/src/ecc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wolfcrypt/src/ecc.c b/wolfcrypt/src/ecc.c index 5c561a1ee..9de60c4e3 100644 --- a/wolfcrypt/src/ecc.c +++ b/wolfcrypt/src/ecc.c @@ -9432,7 +9432,7 @@ int ecc_mul2add(ecc_point* A, mp_int* kA, } if (err == MP_OKAY) { - /* if it's >=2 build the LUT, if it's higher just use the LUT */ + /* if it's >= 2 AND the LUT is not set build the LUT */ if (idx1 >= 0 && fp_cache[idx1].lru_count >= 2 && !fp_cache[idx1].LUT_set) { /* compute mp */ err = mp_montgomery_setup(modulus, &mp); @@ -9449,7 +9449,7 @@ int ecc_mul2add(ecc_point* A, mp_int* kA, } if (err == MP_OKAY) { - /* if it's >=2 build the LUT, if it's higher just use the LUT */ + /* if it's >= 2 AND the LUT is not set build the LUT */ if (idx2 >= 0 && fp_cache[idx2].lru_count >= 2 && !fp_cache[idx2].LUT_set) { if (mpInit == 0) { /* compute mp */ From f894d4c0d2d08e4227e015aacb518c55a5397f02 Mon Sep 17 00:00:00 2001 From: Tesfa Mael Date: Fri, 8 May 2020 14:28:14 -0700 Subject: [PATCH 103/298] FIPS on Solaris --- fips-check.sh | 22 +++++++++++++++++++--- wolfcrypt/test/test.c | 22 ++++++++++++---------- wolfssl/wolfcrypt/settings.h | 22 +++++++++++++++++++++- 3 files changed, 52 insertions(+), 14 deletions(-) diff --git a/fips-check.sh b/fips-check.sh index adccd4ee8..bbd71ff86 100755 --- a/fips-check.sh +++ b/fips-check.sh @@ -34,6 +34,7 @@ Platform is one of: fips-ready stm32l4-v2 (FIPSv2, use for STM32L4) wolfrand + solaris Keep (default off) retains the XXX-fips-test temp dir for inspection. Example: @@ -41,6 +42,8 @@ Example: usageText } +MAKE=make + LINUX_FIPS_VERSION=v3.2.6 LINUX_FIPS_REPO=git@github.com:wolfSSL/fips.git LINUX_CRYPT_VERSION=v3.2.6 @@ -229,6 +232,19 @@ wolfrand) FIPS_INCS=( fips.h ) FIPS_OPTION=rand ;; +solaris) + FIPS_VERSION=WCv4-stable + FIPS_REPO=git@github.com:wolfssl/fips.git + CRYPT_VERSION=WCv4-stable + CRYPT_INC_PATH=wolfssl/wolfcrypt + CRYPT_SRC_PATH=wolfcrypt/src + WC_MODS+=( cmac dh ecc sha3 ) + RNG_VERSION=WCv4-rng-stable + FIPS_SRCS+=( wolfcrypt_first.c wolfcrypt_last.c ) + FIPS_INCS=( fips.h ) + FIPS_OPTION=v2 + MAKE=gmake + ;; *) Usage exit 1 @@ -321,7 +337,7 @@ then else ./configure --enable-fips=$FIPS_OPTION fi -if ! make; then +if ! $MAKE; then echo "fips-check: Make failed. Debris left for analysis." exit 3 fi @@ -331,11 +347,11 @@ then NEWHASH=$(./wolfcrypt/test/testwolfcrypt | sed -n 's/hash = \(.*\)/\1/p') if [ -n "$NEWHASH" ]; then sed -i.bak "s/^\".*\";/\"${NEWHASH}\";/" $CRYPT_SRC_PATH/fips_test.c - make clean + $MAKE clean fi fi -if ! make test; then +if ! $MAKE test; then echo "fips-check: Test failed. Debris left for analysis." exit 3 fi diff --git a/wolfcrypt/test/test.c b/wolfcrypt/test/test.c index bdb170f31..22fd7d9a3 100644 --- a/wolfcrypt/test/test.c +++ b/wolfcrypt/test/test.c @@ -12360,7 +12360,7 @@ static int rsa_certgen_test(RsaKey* key, RsaKey* keypub, WC_RNG* rng, byte* tmp) FreeDecodedCert(&decode); #endif - ret = SaveDerAndPem(der, certSz, certDerFile, certPemFile, + ret = SaveDerAndPem(der, certSz, certDerFile, certPemFile, CERT_TYPE, -5578); if (ret != 0) { goto exit_rsa; @@ -12523,7 +12523,7 @@ static int rsa_certgen_test(RsaKey* key, RsaKey* keypub, WC_RNG* rng, byte* tmp) FreeDecodedCert(&decode); #endif - ret = SaveDerAndPem(der, certSz, otherCertDerFile, otherCertPemFile, + ret = SaveDerAndPem(der, certSz, otherCertDerFile, otherCertPemFile, CERT_TYPE, -5598); if (ret != 0) { goto exit_rsa; @@ -12714,7 +12714,7 @@ static int rsa_ecc_certgen_test(WC_RNG* rng, byte* tmp) FreeDecodedCert(&decode); #endif - ret = SaveDerAndPem(der, certSz, certEccRsaDerFile, certEccRsaPemFile, + ret = SaveDerAndPem(der, certSz, certEccRsaDerFile, certEccRsaPemFile, CERT_TYPE, -5616); if (ret != 0) { goto exit_rsa; @@ -12786,7 +12786,7 @@ static int rsa_keygen_test(WC_RNG* rng) ERROR_OUT(-7667, exit_rsa); } - ret = SaveDerAndPem(der, derSz, keyDerFile, keyPemFile, + ret = SaveDerAndPem(der, derSz, keyDerFile, keyPemFile, PRIVATEKEY_TYPE, -5555); if (ret != 0) { goto exit_rsa; @@ -13736,7 +13736,7 @@ int rsa_test(void) FreeDecodedCert(&decode); #endif - ret = SaveDerAndPem(der, certSz, "./ntru-cert.der", "./ntru-cert.pem", + ret = SaveDerAndPem(der, certSz, "./ntru-cert.der", "./ntru-cert.pem", CERT_TYPE, -5637); if (ret != 0) { goto exit_rsa; @@ -13841,7 +13841,7 @@ int rsa_test(void) } derSz = ret; - ret = SaveDerAndPem(der, derSz, certReqDerFile, certReqPemFile, + ret = SaveDerAndPem(der, derSz, certReqDerFile, certReqPemFile, CERTREQ_TYPE, -5650); if (ret != 0) { goto exit_rsa; @@ -14629,7 +14629,7 @@ int dsa_test(void) return -8013; } - ret = SaveDerAndPem(der, derSz, keyDerFile, keyPemFile, + ret = SaveDerAndPem(der, derSz, keyDerFile, keyPemFile, DSA_PRIVATEKEY_TYPE, -5814); if (ret != 0) { XFREE(der, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); @@ -18487,7 +18487,7 @@ static int ecc_test_key_gen(WC_RNG* rng, int keySize) ERROR_OUT(derSz, done); } - ret = SaveDerAndPem(der, derSz, eccCaKeyTempFile, eccCaKeyPemFile, + ret = SaveDerAndPem(der, derSz, eccCaKeyTempFile, eccCaKeyPemFile, ECC_PRIVATEKEY_TYPE, -8347); if (ret != 0) { goto done; @@ -19924,7 +19924,7 @@ static int ecc_test_cert_gen(WC_RNG* rng) FreeDecodedCert(&decode); #endif - ret = SaveDerAndPem(der, certSz, certEccDerFile, certEccPemFile, + ret = SaveDerAndPem(der, certSz, certEccDerFile, certEccPemFile, CERT_TYPE, -6735); if (ret != 0) { goto exit; @@ -27921,13 +27921,15 @@ int mutex_test(void) return -12701; if (wc_LockMutex(&m) != 0) return -12702; +#if !defined(WOLFSSL_SOLARIS) if (wc_FreeMutex(&m) != BAD_MUTEX_E) return -12703; +#endif if (wc_UnLockMutex(&m) != 0) return -12704; if (wc_FreeMutex(&m) != 0) return -12705; -#ifndef WOLFSSL_NO_MUTEXLOCK_AFTER_FREE +#if !defined(WOLFSSL_NO_MUTEXLOCK_AFTER_FREE) if (wc_LockMutex(&m) != BAD_MUTEX_E) return -12706; if (wc_UnLockMutex(&m) != BAD_MUTEX_E) diff --git a/wolfssl/wolfcrypt/settings.h b/wolfssl/wolfcrypt/settings.h index c439bc33a..6b52f998d 100644 --- a/wolfssl/wolfcrypt/settings.h +++ b/wolfssl/wolfcrypt/settings.h @@ -209,6 +209,9 @@ /* Uncomment next line if using RENESAS RX64N */ /* #define WOLFSSL_RENESAS_RX65N */ +/* Uncomment next line if using Solaris OS*/ +/* #define WOLFSSL_SOLARIS */ + #include #ifdef WOLFSSL_USER_SETTINGS @@ -703,7 +706,7 @@ extern void uITRON4_free(void *p) ; https://github.com/wolfSSL/wolfssl-freertos/pull/3/files */ #if !defined(USE_FAST_MATH) || defined(HAVE_ED25519) || defined(HAVE_ED448) #if defined(WOLFSSL_ESPIDF) - /*In IDF, realloc(p, n) is equivalent to + /*In IDF, realloc(p, n) is equivalent to heap_caps_realloc(p, s, MALLOC_CAP_8BIT) */ #define XREALLOC(p, n, h, t) realloc((p), (n)) #else @@ -1400,6 +1403,23 @@ extern void uITRON4_free(void *p) ; #endif #endif /* MICRIUM */ +#if defined(sun) || defined(__sun) +# if defined(__SVR4) || defined(__svr4__) + /* Solaris */ + #ifndef WOLFSSL_SOLARIS + #define WOLFSSL_SOLARIS + #endif +# else + /* SunOS */ +# endif +#endif + +#ifdef WOLFSSL_SOLARIS + #define WOLFSSL_NO_MUTEXLOCK_AFTER_FREE + /* Avoid naming clash with fp_zero from math.h > ieefp.h */ + #define WOLFSSL_DH_CONST +#endif + #ifdef WOLFSSL_MCF5441X #define BIG_ENDIAN_ORDER #ifndef SIZEOF_LONG From b615dbe9d5dbd88920fc2571a3404d8796b7f29b Mon Sep 17 00:00:00 2001 From: Jacob Barthelmeh Date: Fri, 15 May 2020 11:50:05 -0600 Subject: [PATCH 104/298] add additional FP_ECC lock sanity check for case where wolfCrypt_Init is not called --- wolfcrypt/src/ecc.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/wolfcrypt/src/ecc.c b/wolfcrypt/src/ecc.c index f27ee2192..900b8c30c 100644 --- a/wolfcrypt/src/ecc.c +++ b/wolfcrypt/src/ecc.c @@ -9385,6 +9385,11 @@ int ecc_mul2add(ecc_point* A, mp_int* kA, return err; #ifndef HAVE_THREAD_LS + if (initMutex == 0) { /* extra sanity check if wolfCrypt_Init not called */ + wc_InitMutex(&ecc_fp_lock); + initMutex = 1; + } + if (wc_LockMutex(&ecc_fp_lock) != 0) return BAD_MUTEX_E; #endif /* HAVE_THREAD_LS */ @@ -9508,6 +9513,11 @@ int wc_ecc_mulmod_ex(mp_int* k, ecc_point *G, ecc_point *R, mp_int* a, return MP_INIT_E; #ifndef HAVE_THREAD_LS + if (initMutex == 0) { /* extra sanity check if wolfCrypt_Init not called */ + wc_InitMutex(&ecc_fp_lock); + initMutex = 1; + } + if (wc_LockMutex(&ecc_fp_lock) != 0) return BAD_MUTEX_E; #endif /* HAVE_THREAD_LS */ @@ -9627,6 +9637,11 @@ void wc_ecc_fp_free(void) { #ifndef WOLFSSL_SP_MATH #ifndef HAVE_THREAD_LS + if (initMutex == 0) { /* extra sanity check if wolfCrypt_Init not called */ + wc_InitMutex(&ecc_fp_lock); + initMutex = 1; + } + if (wc_LockMutex(&ecc_fp_lock) == 0) { #endif /* HAVE_THREAD_LS */ From 5b918f7aced6634201634a967c7692a639750c04 Mon Sep 17 00:00:00 2001 From: Sean Parkinson Date: Mon, 18 May 2020 08:49:38 +1000 Subject: [PATCH 105/298] KeyShare ECC shift index range check --- src/tls.c | 12 ++++++++---- wolfssl/ssl.h | 1 + 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/tls.c b/src/tls.c index e065c7659..d6b8815d2 100644 --- a/src/tls.c +++ b/src/tls.c @@ -8131,13 +8131,17 @@ int TLSX_KeyShare_Establish(WOLFSSL *ssl) if (!TLSX_SupportedGroups_Find(ssl, clientKSE->group)) return BAD_KEY_SHARE_DATA; - #ifdef OPENSSL_EXTRA if ((clientKSE->group & NAMED_DH_MASK) == 0) { - /* Check if server supports group. */ - if (ssl->ctx->disabledCurves & (1 << clientKSE->group)) + /* Check max value supported. */ + if (clientKSE->group > WOLFSSL_ECC_MAX) { continue; + } + #ifdef OPENSSL_EXTRA + /* Check if server supports group. */ + if (ssl->ctx->disabledCurves & ((word32)1 << clientKSE->group)) + continue; + #endif } - #endif if (!TLSX_KeyShare_IsSupported(clientKSE->group)) continue; diff --git a/wolfssl/ssl.h b/wolfssl/ssl.h index c9b441b5a..5522c7d61 100644 --- a/wolfssl/ssl.h +++ b/wolfssl/ssl.h @@ -3032,6 +3032,7 @@ enum { WOLFSSL_ECC_BRAINPOOLP512R1 = 28, WOLFSSL_ECC_X25519 = 29, WOLFSSL_ECC_X448 = 30, + WOLFSSL_ECC_MAX = 30, WOLFSSL_FFDHE_2048 = 256, WOLFSSL_FFDHE_3072 = 257, From adb3bdd26e7c8514e3a679be0452839d91d63f00 Mon Sep 17 00:00:00 2001 From: Sean Parkinson Date: Mon, 18 May 2020 09:07:20 +1000 Subject: [PATCH 106/298] Curve448 - cast down --- wolfcrypt/src/fe_448.c | 336 ++++++++++++++++++++--------------------- 1 file changed, 168 insertions(+), 168 deletions(-) diff --git a/wolfcrypt/src/fe_448.c b/wolfcrypt/src/fe_448.c index bc38c112f..6d202e502 100644 --- a/wolfcrypt/src/fe_448.c +++ b/wolfcrypt/src/fe_448.c @@ -600,14 +600,14 @@ void fe448_to_bytes(unsigned char* b, const int64_t* a) in0 += o; in4 += o; in7 -= o << 56; - o = in0 >> 56; in1 += o; t = o << 56; in0 -= t; - o = in1 >> 56; in2 += o; t = o << 56; in1 -= t; - o = in2 >> 56; in3 += o; t = o << 56; in2 -= t; - o = in3 >> 56; in4 += o; t = o << 56; in3 -= t; - o = in4 >> 56; in5 += o; t = o << 56; in4 -= t; - o = in5 >> 56; in6 += o; t = o << 56; in5 -= t; - o = in6 >> 56; in7 += o; t = o << 56; in6 -= t; - o = in7 >> 56; in0 += o; + o = (int64_t)(in0 >> 56); in1 += o; t = o << 56; in0 -= t; + o = (int64_t)(in1 >> 56); in2 += o; t = o << 56; in1 -= t; + o = (int64_t)(in2 >> 56); in3 += o; t = o << 56; in2 -= t; + o = (int64_t)(in3 >> 56); in4 += o; t = o << 56; in3 -= t; + o = (int64_t)(in4 >> 56); in5 += o; t = o << 56; in4 -= t; + o = (int64_t)(in5 >> 56); in6 += o; t = o << 56; in5 -= t; + o = (int64_t)(in6 >> 56); in7 += o; t = o << 56; in6 -= t; + o = (int64_t)(in7 >> 56); in0 += o; in4 += o; t = o << 56; in7 -= t; /* Output as bytes */ @@ -807,25 +807,25 @@ void fe448_mul39081(int64_t* r, const int64_t* a) int128_t t5 = a[5] * (int128_t)39081; int128_t t6 = a[6] * (int128_t)39081; int128_t t7 = a[7] * (int128_t)39081; - o = t0 >> 56; t1 += o; t = (int128_t)o << 56; t0 -= t; - o = t1 >> 56; t2 += o; t = (int128_t)o << 56; t1 -= t; - o = t2 >> 56; t3 += o; t = (int128_t)o << 56; t2 -= t; - o = t3 >> 56; t4 += o; t = (int128_t)o << 56; t3 -= t; - o = t4 >> 56; t5 += o; t = (int128_t)o << 56; t4 -= t; - o = t5 >> 56; t6 += o; t = (int128_t)o << 56; t5 -= t; - o = t6 >> 56; t7 += o; t = (int128_t)o << 56; t6 -= t; - o = t7 >> 56; t0 += o; + o = (int64_t)(t0 >> 56); t1 += o; t = (int128_t)o << 56; t0 -= t; + o = (int64_t)(t1 >> 56); t2 += o; t = (int128_t)o << 56; t1 -= t; + o = (int64_t)(t2 >> 56); t3 += o; t = (int128_t)o << 56; t2 -= t; + o = (int64_t)(t3 >> 56); t4 += o; t = (int128_t)o << 56; t3 -= t; + o = (int64_t)(t4 >> 56); t5 += o; t = (int128_t)o << 56; t4 -= t; + o = (int64_t)(t5 >> 56); t6 += o; t = (int128_t)o << 56; t5 -= t; + o = (int64_t)(t6 >> 56); t7 += o; t = (int128_t)o << 56; t6 -= t; + o = (int64_t)(t7 >> 56); t0 += o; t4 += o; t = (int128_t)o << 56; t7 -= t; /* Store */ - r[0] = t0; - r[1] = t1; - r[2] = t2; - r[3] = t3; - r[4] = t4; - r[5] = t5; - r[6] = t6; - r[7] = t7; + r[0] = (int64_t)t0; + r[1] = (int64_t)t1; + r[2] = (int64_t)t2; + r[3] = (int64_t)t3; + r[4] = (int64_t)t4; + r[5] = (int64_t)t5; + r[6] = (int64_t)t6; + r[7] = (int64_t)t7; } /* Mulitply two field elements. r = (a * b) mod (2^448 - 2^224 - 1) @@ -931,25 +931,25 @@ void fe448_mul(int64_t* r, const int64_t* a, const int64_t* b) t7 += t11; o = t7 >> 56; t0 += o; t4 += o; t = (int128_t)o << 56; t7 -= t; - o = t0 >> 56; t1 += o; t = (int128_t)o << 56; t0 -= t; - o = t1 >> 56; t2 += o; t = (int128_t)o << 56; t1 -= t; - o = t2 >> 56; t3 += o; t = (int128_t)o << 56; t2 -= t; - o = t3 >> 56; t4 += o; t = (int128_t)o << 56; t3 -= t; - o = t4 >> 56; t5 += o; t = (int128_t)o << 56; t4 -= t; - o = t5 >> 56; t6 += o; t = (int128_t)o << 56; t5 -= t; - o = t6 >> 56; t7 += o; t = (int128_t)o << 56; t6 -= t; - o = t7 >> 56; t0 += o; + o = (int64_t)(t0 >> 56); t1 += o; t = (int128_t)o << 56; t0 -= t; + o = (int64_t)(t1 >> 56); t2 += o; t = (int128_t)o << 56; t1 -= t; + o = (int64_t)(t2 >> 56); t3 += o; t = (int128_t)o << 56; t2 -= t; + o = (int64_t)(t3 >> 56); t4 += o; t = (int128_t)o << 56; t3 -= t; + o = (int64_t)(t4 >> 56); t5 += o; t = (int128_t)o << 56; t4 -= t; + o = (int64_t)(t5 >> 56); t6 += o; t = (int128_t)o << 56; t5 -= t; + o = (int64_t)(t6 >> 56); t7 += o; t = (int128_t)o << 56; t6 -= t; + o = (int64_t)(t7 >> 56); t0 += o; t4 += o; t = (int128_t)o << 56; t7 -= t; /* Store */ - r[0] = t0; - r[1] = t1; - r[2] = t2; - r[3] = t3; - r[4] = t4; - r[5] = t5; - r[6] = t6; - r[7] = t7; + r[0] = (int64_t)t0; + r[1] = (int64_t)t1; + r[2] = (int64_t)t2; + r[3] = (int64_t)t3; + r[4] = (int64_t)t4; + r[5] = (int64_t)t5; + r[6] = (int64_t)t6; + r[7] = (int64_t)t7; } /* Square a field element. r = (a * a) mod (2^448 - 2^224 - 1) @@ -1020,25 +1020,25 @@ void fe448_sqr(int64_t* r, const int64_t* a) t7 += t11; o = t7 >> 56; t0 += o; t4 += o; t = (int128_t)o << 56; t7 -= t; - o = t0 >> 56; t1 += o; t = (int128_t)o << 56; t0 -= t; - o = t1 >> 56; t2 += o; t = (int128_t)o << 56; t1 -= t; - o = t2 >> 56; t3 += o; t = (int128_t)o << 56; t2 -= t; - o = t3 >> 56; t4 += o; t = (int128_t)o << 56; t3 -= t; - o = t4 >> 56; t5 += o; t = (int128_t)o << 56; t4 -= t; - o = t5 >> 56; t6 += o; t = (int128_t)o << 56; t5 -= t; - o = t6 >> 56; t7 += o; t = (int128_t)o << 56; t6 -= t; - o = t7 >> 56; t0 += o; + o = (int64_t)(t0 >> 56); t1 += o; t = (int128_t)o << 56; t0 -= t; + o = (int64_t)(t1 >> 56); t2 += o; t = (int128_t)o << 56; t1 -= t; + o = (int64_t)(t2 >> 56); t3 += o; t = (int128_t)o << 56; t2 -= t; + o = (int64_t)(t3 >> 56); t4 += o; t = (int128_t)o << 56; t3 -= t; + o = (int64_t)(t4 >> 56); t5 += o; t = (int128_t)o << 56; t4 -= t; + o = (int64_t)(t5 >> 56); t6 += o; t = (int128_t)o << 56; t5 -= t; + o = (int64_t)(t6 >> 56); t7 += o; t = (int128_t)o << 56; t6 -= t; + o = (int64_t)(t7 >> 56); t0 += o; t4 += o; t = (int128_t)o << 56; t7 -= t; /* Store */ - r[0] = t0; - r[1] = t1; - r[2] = t2; - r[3] = t3; - r[4] = t4; - r[5] = t5; - r[6] = t6; - r[7] = t7; + r[0] = (int64_t)t0; + r[1] = (int64_t)t1; + r[2] = (int64_t)t2; + r[3] = (int64_t)t3; + r[4] = (int64_t)t4; + r[5] = (int64_t)t5; + r[6] = (int64_t)t6; + r[7] = (int64_t)t7; } /* Invert the field element. (r * a) mod (2^448 - 2^224 - 1) = 1 @@ -1469,22 +1469,22 @@ void fe448_to_bytes(unsigned char* b, const int32_t* a) in0 += o; in8 += o; in15 -= o << 28; - o = in0 >> 28; in1 += o; t = o << 28; in0 -= t; - o = in1 >> 28; in2 += o; t = o << 28; in1 -= t; - o = in2 >> 28; in3 += o; t = o << 28; in2 -= t; - o = in3 >> 28; in4 += o; t = o << 28; in3 -= t; - o = in4 >> 28; in5 += o; t = o << 28; in4 -= t; - o = in5 >> 28; in6 += o; t = o << 28; in5 -= t; - o = in6 >> 28; in7 += o; t = o << 28; in6 -= t; - o = in7 >> 28; in8 += o; t = o << 28; in7 -= t; - o = in8 >> 28; in9 += o; t = o << 28; in8 -= t; - o = in9 >> 28; in10 += o; t = o << 28; in9 -= t; - o = in10 >> 28; in11 += o; t = o << 28; in10 -= t; - o = in11 >> 28; in12 += o; t = o << 28; in11 -= t; - o = in12 >> 28; in13 += o; t = o << 28; in12 -= t; - o = in13 >> 28; in14 += o; t = o << 28; in13 -= t; - o = in14 >> 28; in15 += o; t = o << 28; in14 -= t; - o = in15 >> 28; in0 += o; + o = (int32_t)(in0 >> 28); in1 += o; t = o << 28; in0 -= t; + o = (int32_t)(in1 >> 28); in2 += o; t = o << 28; in1 -= t; + o = (int32_t)(in2 >> 28); in3 += o; t = o << 28; in2 -= t; + o = (int32_t)(in3 >> 28); in4 += o; t = o << 28; in3 -= t; + o = (int32_t)(in4 >> 28); in5 += o; t = o << 28; in4 -= t; + o = (int32_t)(in5 >> 28); in6 += o; t = o << 28; in5 -= t; + o = (int32_t)(in6 >> 28); in7 += o; t = o << 28; in6 -= t; + o = (int32_t)(in7 >> 28); in8 += o; t = o << 28; in7 -= t; + o = (int32_t)(in8 >> 28); in9 += o; t = o << 28; in8 -= t; + o = (int32_t)(in9 >> 28); in10 += o; t = o << 28; in9 -= t; + o = (int32_t)(in10 >> 28); in11 += o; t = o << 28; in10 -= t; + o = (int32_t)(in11 >> 28); in12 += o; t = o << 28; in11 -= t; + o = (int32_t)(in12 >> 28); in13 += o; t = o << 28; in12 -= t; + o = (int32_t)(in13 >> 28); in14 += o; t = o << 28; in13 -= t; + o = (int32_t)(in14 >> 28); in15 += o; t = o << 28; in14 -= t; + o = (int32_t)(in15 >> 28); in0 += o; in8 += o; t = o << 28; in15 -= t; /* Output as bytes */ @@ -1778,41 +1778,41 @@ void fe448_mul39081(int32_t* r, const int32_t* a) int64_t t13 = a[13] * (int64_t)39081; int64_t t14 = a[14] * (int64_t)39081; int64_t t15 = a[15] * (int64_t)39081; - o = t0 >> 28; t1 += o; t = (int64_t)o << 28; t0 -= t; - o = t1 >> 28; t2 += o; t = (int64_t)o << 28; t1 -= t; - o = t2 >> 28; t3 += o; t = (int64_t)o << 28; t2 -= t; - o = t3 >> 28; t4 += o; t = (int64_t)o << 28; t3 -= t; - o = t4 >> 28; t5 += o; t = (int64_t)o << 28; t4 -= t; - o = t5 >> 28; t6 += o; t = (int64_t)o << 28; t5 -= t; - o = t6 >> 28; t7 += o; t = (int64_t)o << 28; t6 -= t; - o = t7 >> 28; t8 += o; t = (int64_t)o << 28; t7 -= t; - o = t8 >> 28; t9 += o; t = (int64_t)o << 28; t8 -= t; - o = t9 >> 28; t10 += o; t = (int64_t)o << 28; t9 -= t; - o = t10 >> 28; t11 += o; t = (int64_t)o << 28; t10 -= t; - o = t11 >> 28; t12 += o; t = (int64_t)o << 28; t11 -= t; - o = t12 >> 28; t13 += o; t = (int64_t)o << 28; t12 -= t; - o = t13 >> 28; t14 += o; t = (int64_t)o << 28; t13 -= t; - o = t14 >> 28; t15 += o; t = (int64_t)o << 28; t14 -= t; - o = t15 >> 28; t0 += o; + o = (int32_t)(t0 >> 28); t1 += o; t = (int64_t)o << 28; t0 -= t; + o = (int32_t)(t1 >> 28); t2 += o; t = (int64_t)o << 28; t1 -= t; + o = (int32_t)(t2 >> 28); t3 += o; t = (int64_t)o << 28; t2 -= t; + o = (int32_t)(t3 >> 28); t4 += o; t = (int64_t)o << 28; t3 -= t; + o = (int32_t)(t4 >> 28); t5 += o; t = (int64_t)o << 28; t4 -= t; + o = (int32_t)(t5 >> 28); t6 += o; t = (int64_t)o << 28; t5 -= t; + o = (int32_t)(t6 >> 28); t7 += o; t = (int64_t)o << 28; t6 -= t; + o = (int32_t)(t7 >> 28); t8 += o; t = (int64_t)o << 28; t7 -= t; + o = (int32_t)(t8 >> 28); t9 += o; t = (int64_t)o << 28; t8 -= t; + o = (int32_t)(t9 >> 28); t10 += o; t = (int64_t)o << 28; t9 -= t; + o = (int32_t)(t10 >> 28); t11 += o; t = (int64_t)o << 28; t10 -= t; + o = (int32_t)(t11 >> 28); t12 += o; t = (int64_t)o << 28; t11 -= t; + o = (int32_t)(t12 >> 28); t13 += o; t = (int64_t)o << 28; t12 -= t; + o = (int32_t)(t13 >> 28); t14 += o; t = (int64_t)o << 28; t13 -= t; + o = (int32_t)(t14 >> 28); t15 += o; t = (int64_t)o << 28; t14 -= t; + o = (int32_t)(t15 >> 28); t0 += o; t8 += o; t = (int64_t)o << 28; t15 -= t; /* Store */ - r[0] = t0; - r[1] = t1; - r[2] = t2; - r[3] = t3; - r[4] = t4; - r[5] = t5; - r[6] = t6; - r[7] = t7; - r[8] = t8; - r[9] = t9; - r[10] = t10; - r[11] = t11; - r[12] = t12; - r[13] = t13; - r[14] = t14; - r[15] = t15; + r[0] = (int32_t)t0; + r[1] = (int32_t)t1; + r[2] = (int32_t)t2; + r[3] = (int32_t)t3; + r[4] = (int32_t)t4; + r[5] = (int32_t)t5; + r[6] = (int32_t)t6; + r[7] = (int32_t)t7; + r[8] = (int32_t)t8; + r[9] = (int32_t)t9; + r[10] = (int32_t)t10; + r[11] = (int32_t)t11; + r[12] = (int32_t)t12; + r[13] = (int32_t)t13; + r[14] = (int32_t)t14; + r[15] = (int32_t)t15; } /* Mulitply two field elements. r = a * b @@ -1908,41 +1908,41 @@ static WC_INLINE void fe448_mul_8(int32_t* r, const int32_t* a, const int32_t* b int64_t o = t14 >> 28; int64_t t15 = o; t14 -= o << 28; - o = t0 >> 28; t1 += o; t = (int64_t)o << 28; t0 -= t; - o = t1 >> 28; t2 += o; t = (int64_t)o << 28; t1 -= t; - o = t2 >> 28; t3 += o; t = (int64_t)o << 28; t2 -= t; - o = t3 >> 28; t4 += o; t = (int64_t)o << 28; t3 -= t; - o = t4 >> 28; t5 += o; t = (int64_t)o << 28; t4 -= t; - o = t5 >> 28; t6 += o; t = (int64_t)o << 28; t5 -= t; - o = t6 >> 28; t7 += o; t = (int64_t)o << 28; t6 -= t; - o = t7 >> 28; t8 += o; t = (int64_t)o << 28; t7 -= t; - o = t8 >> 28; t9 += o; t = (int64_t)o << 28; t8 -= t; - o = t9 >> 28; t10 += o; t = (int64_t)o << 28; t9 -= t; - o = t10 >> 28; t11 += o; t = (int64_t)o << 28; t10 -= t; - o = t11 >> 28; t12 += o; t = (int64_t)o << 28; t11 -= t; - o = t12 >> 28; t13 += o; t = (int64_t)o << 28; t12 -= t; - o = t13 >> 28; t14 += o; t = (int64_t)o << 28; t13 -= t; - o = t14 >> 28; t15 += o; t = (int64_t)o << 28; t14 -= t; - o = t15 >> 28; t0 += o; + o = (int32_t)(t0 >> 28); t1 += o; t = (int64_t)o << 28; t0 -= t; + o = (int32_t)(t1 >> 28); t2 += o; t = (int64_t)o << 28; t1 -= t; + o = (int32_t)(t2 >> 28); t3 += o; t = (int64_t)o << 28; t2 -= t; + o = (int32_t)(t3 >> 28); t4 += o; t = (int64_t)o << 28; t3 -= t; + o = (int32_t)(t4 >> 28); t5 += o; t = (int64_t)o << 28; t4 -= t; + o = (int32_t)(t5 >> 28); t6 += o; t = (int64_t)o << 28; t5 -= t; + o = (int32_t)(t6 >> 28); t7 += o; t = (int64_t)o << 28; t6 -= t; + o = (int32_t)(t7 >> 28); t8 += o; t = (int64_t)o << 28; t7 -= t; + o = (int32_t)(t8 >> 28); t9 += o; t = (int64_t)o << 28; t8 -= t; + o = (int32_t)(t9 >> 28); t10 += o; t = (int64_t)o << 28; t9 -= t; + o = (int32_t)(t10 >> 28); t11 += o; t = (int64_t)o << 28; t10 -= t; + o = (int32_t)(t11 >> 28); t12 += o; t = (int64_t)o << 28; t11 -= t; + o = (int32_t)(t12 >> 28); t13 += o; t = (int64_t)o << 28; t12 -= t; + o = (int32_t)(t13 >> 28); t14 += o; t = (int64_t)o << 28; t13 -= t; + o = (int32_t)(t14 >> 28); t15 += o; t = (int64_t)o << 28; t14 -= t; + o = (int32_t)(t15 >> 28); t0 += o; t8 += o; t = (int64_t)o << 28; t15 -= t; /* Store */ - r[0] = t0; - r[1] = t1; - r[2] = t2; - r[3] = t3; - r[4] = t4; - r[5] = t5; - r[6] = t6; - r[7] = t7; - r[8] = t8; - r[9] = t9; - r[10] = t10; - r[11] = t11; - r[12] = t12; - r[13] = t13; - r[14] = t14; - r[15] = t15; + r[0] = (int32_t)t0; + r[1] = (int32_t)t1; + r[2] = (int32_t)t2; + r[3] = (int32_t)t3; + r[4] = (int32_t)t4; + r[5] = (int32_t)t5; + r[6] = (int32_t)t6; + r[7] = (int32_t)t7; + r[8] = (int32_t)t8; + r[9] = (int32_t)t9; + r[10] = (int32_t)t10; + r[11] = (int32_t)t11; + r[12] = (int32_t)t12; + r[13] = (int32_t)t13; + r[14] = (int32_t)t14; + r[15] = (int32_t)t15; } /* Mulitply two field elements. r = (a * b) mod (2^448 - 2^224 - 1) @@ -2053,41 +2053,41 @@ static WC_INLINE void fe448_sqr_8(int32_t* r, const int32_t* a) int64_t o = t14 >> 28; int64_t t15 = o; t14 -= o << 28; - o = t0 >> 28; t1 += o; t = (int64_t)o << 28; t0 -= t; - o = t1 >> 28; t2 += o; t = (int64_t)o << 28; t1 -= t; - o = t2 >> 28; t3 += o; t = (int64_t)o << 28; t2 -= t; - o = t3 >> 28; t4 += o; t = (int64_t)o << 28; t3 -= t; - o = t4 >> 28; t5 += o; t = (int64_t)o << 28; t4 -= t; - o = t5 >> 28; t6 += o; t = (int64_t)o << 28; t5 -= t; - o = t6 >> 28; t7 += o; t = (int64_t)o << 28; t6 -= t; - o = t7 >> 28; t8 += o; t = (int64_t)o << 28; t7 -= t; - o = t8 >> 28; t9 += o; t = (int64_t)o << 28; t8 -= t; - o = t9 >> 28; t10 += o; t = (int64_t)o << 28; t9 -= t; - o = t10 >> 28; t11 += o; t = (int64_t)o << 28; t10 -= t; - o = t11 >> 28; t12 += o; t = (int64_t)o << 28; t11 -= t; - o = t12 >> 28; t13 += o; t = (int64_t)o << 28; t12 -= t; - o = t13 >> 28; t14 += o; t = (int64_t)o << 28; t13 -= t; - o = t14 >> 28; t15 += o; t = (int64_t)o << 28; t14 -= t; - o = t15 >> 28; t0 += o; + o = (int32_t)(t0 >> 28); t1 += o; t = (int64_t)o << 28; t0 -= t; + o = (int32_t)(t1 >> 28); t2 += o; t = (int64_t)o << 28; t1 -= t; + o = (int32_t)(t2 >> 28); t3 += o; t = (int64_t)o << 28; t2 -= t; + o = (int32_t)(t3 >> 28); t4 += o; t = (int64_t)o << 28; t3 -= t; + o = (int32_t)(t4 >> 28); t5 += o; t = (int64_t)o << 28; t4 -= t; + o = (int32_t)(t5 >> 28); t6 += o; t = (int64_t)o << 28; t5 -= t; + o = (int32_t)(t6 >> 28); t7 += o; t = (int64_t)o << 28; t6 -= t; + o = (int32_t)(t7 >> 28); t8 += o; t = (int64_t)o << 28; t7 -= t; + o = (int32_t)(t8 >> 28); t9 += o; t = (int64_t)o << 28; t8 -= t; + o = (int32_t)(t9 >> 28); t10 += o; t = (int64_t)o << 28; t9 -= t; + o = (int32_t)(t10 >> 28); t11 += o; t = (int64_t)o << 28; t10 -= t; + o = (int32_t)(t11 >> 28); t12 += o; t = (int64_t)o << 28; t11 -= t; + o = (int32_t)(t12 >> 28); t13 += o; t = (int64_t)o << 28; t12 -= t; + o = (int32_t)(t13 >> 28); t14 += o; t = (int64_t)o << 28; t13 -= t; + o = (int32_t)(t14 >> 28); t15 += o; t = (int64_t)o << 28; t14 -= t; + o = (int32_t)(t15 >> 28); t0 += o; t8 += o; t = (int64_t)o << 28; t15 -= t; /* Store */ - r[0] = t0; - r[1] = t1; - r[2] = t2; - r[3] = t3; - r[4] = t4; - r[5] = t5; - r[6] = t6; - r[7] = t7; - r[8] = t8; - r[9] = t9; - r[10] = t10; - r[11] = t11; - r[12] = t12; - r[13] = t13; - r[14] = t14; - r[15] = t15; + r[0] = (int32_t)t0; + r[1] = (int32_t)t1; + r[2] = (int32_t)t2; + r[3] = (int32_t)t3; + r[4] = (int32_t)t4; + r[5] = (int32_t)t5; + r[6] = (int32_t)t6; + r[7] = (int32_t)t7; + r[8] = (int32_t)t8; + r[9] = (int32_t)t9; + r[10] = (int32_t)t10; + r[11] = (int32_t)t11; + r[12] = (int32_t)t12; + r[13] = (int32_t)t13; + r[14] = (int32_t)t14; + r[15] = (int32_t)t15; } /* Square a field element. r = (a * a) mod (2^448 - 2^224 - 1) From ba9fd89314079ec1a21b343b6b4032615f5cd97d Mon Sep 17 00:00:00 2001 From: John Safranek Date: Tue, 12 May 2020 17:27:56 -0700 Subject: [PATCH 107/298] Script Portability 1. The openssl interop test script should check that it should run before doing anything else. 2. The process to create a random port number was using a non-portable option to the head command. Changed to use the od tool reading from /dev/random. 3. Ran into a sed that doesn't use the -i option, so changed it to cp its own bak file and sed from that. --- fips-check.sh | 5 +++-- fips-hash.sh | 3 ++- scripts/openssl.test | 19 ++++++++----------- 3 files changed, 13 insertions(+), 14 deletions(-) diff --git a/fips-check.sh b/fips-check.sh index bbd71ff86..1e7de07aa 100755 --- a/fips-check.sh +++ b/fips-check.sh @@ -346,8 +346,9 @@ if [ "x$CAVP_SELFTEST_ONLY" == "xno" ]; then NEWHASH=$(./wolfcrypt/test/testwolfcrypt | sed -n 's/hash = \(.*\)/\1/p') if [ -n "$NEWHASH" ]; then - sed -i.bak "s/^\".*\";/\"${NEWHASH}\";/" $CRYPT_SRC_PATH/fips_test.c - $MAKE clean + cp $CRYPT_SRC_PATH/fips_test.c $CRYPT_SRC_PATH/fips_test.c.bak + sed "s/^\".*\";/\"${NEWHASH}\";/" $CRYPT_SRC_PATH/fips_test.c.bak >$CRYPT_SRC_PATH/fips_test.c + make clean fi fi diff --git a/fips-hash.sh b/fips-hash.sh index fa2c1b908..8bb6de4ec 100755 --- a/fips-hash.sh +++ b/fips-hash.sh @@ -15,6 +15,7 @@ fi NEWHASH=$(./wolfcrypt/test/testwolfcrypt | sed -n 's/hash = \(.*\)/\1/p') if test -n "$NEWHASH" then - sed -i.bak "s/^\".*\";/\"${NEWHASH}\";/" wolfcrypt/src/fips_test.c + cp wolfcrypt/src/fips_test.c wolfcrypt/src/fips_test.c.bak + sed "s/^\".*\";/\"${NEWHASH}\";/" wolfcrypt/src/fips_test.c.bak >wolfcrypt/src/fips_test.c fi diff --git a/scripts/openssl.test b/scripts/openssl.test index 341beff6a..6c50edf58 100755 --- a/scripts/openssl.test +++ b/scripts/openssl.test @@ -2,12 +2,16 @@ #openssl.test +if test -n "$WOLFSSL_OPENSSL_TEST"; then + echo "WOLFSSL_OPENSSL_TEST set, running test..." +else + echo "WOLFSSL_OPENSSL_TEST NOT set, won't run" + exit 0 +fi + # need a unique port since may run the same time as testsuite generate_port() { - port=`LC_CTYPE=C tr -cd 0-9 /dev/null 2>&1 || { echo >&2 "Requires openssl command, but it's not installed. Ending."; exit 0; } From 9efd9afdfbd6dea85c049ed5ae46e0fe8d8bfb08 Mon Sep 17 00:00:00 2001 From: Chris Conlon Date: Tue, 19 May 2020 14:12:13 -0600 Subject: [PATCH 108/298] fix minor IAR warnings in test.c --- wolfcrypt/test/test.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/wolfcrypt/test/test.c b/wolfcrypt/test/test.c index 22fd7d9a3..afdf191db 100644 --- a/wolfcrypt/test/test.c +++ b/wolfcrypt/test/test.c @@ -8573,7 +8573,7 @@ int aesgcm_test(void) byte resultT[sizeof(t1)]; byte resultP[sizeof(p) + AES_BLOCK_SIZE]; byte resultC[sizeof(p) + AES_BLOCK_SIZE]; - int result; + int result = 0; #ifdef WOLFSSL_AES_256 int alen; #if !defined(WOLFSSL_AFALG_XILINX_AES) && !defined(WOLFSSL_XILINX_CRYPT) @@ -18542,7 +18542,7 @@ static int ecc_test_curve_size(WC_RNG* rng, int keySize, int testVerifyCount, #ifdef HAVE_ECC_KEY_EXPORT byte exportBuf[MAX_ECC_BYTES * 2 + 32]; #endif - word32 x; + word32 x = 0; #if defined(HAVE_ECC_DHE) || defined(HAVE_ECC_CDH) word32 y; #endif @@ -20664,7 +20664,7 @@ int curve25519_test(void) #ifdef HAVE_CURVE25519_KEY_EXPORT byte exportBuf[32]; #endif - word32 x; + word32 x = 0; curve25519_key userA, userB, pubKey; #if defined(HAVE_CURVE25519_SHARED_SECRET) && \ From 08c02b037c2b22387ee790bb70a9e2bc4889efbd Mon Sep 17 00:00:00 2001 From: kaleb-himes Date: Tue, 19 May 2020 17:12:36 -0600 Subject: [PATCH 109/298] Fix building with openssl extra x509 small writes to heap without alloc --- src/internal.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/internal.c b/src/internal.c index 8ccbdc6be..95a1cbcbe 100644 --- a/src/internal.c +++ b/src/internal.c @@ -10563,7 +10563,7 @@ int ProcessPeerCerts(WOLFSSL* ssl, byte* input, word32* inOutIdx, #endif /* allocate buffer for certs */ - #ifdef OPENSSL_EXTRA + #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) args->certs = (buffer*)XMALLOC(sizeof(buffer) * (ssl->verifyDepth + 1), ssl->heap, DYNAMIC_TYPE_DER); if (args->certs == NULL) { From 13e6462ea721be3959f0c7399a5139f42b5f518c Mon Sep 17 00:00:00 2001 From: David Garske Date: Tue, 19 May 2020 07:47:12 -0700 Subject: [PATCH 110/298] Fixes for build with STM32 Standard Periperal Library (StdPeriLib). --- wolfcrypt/src/aes.c | 15 ++++++++++----- wolfcrypt/src/des3.c | 9 ++++----- wolfcrypt/src/ecc.c | 2 +- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/wolfcrypt/src/aes.c b/wolfcrypt/src/aes.c index 341b1c053..4494fadc7 100644 --- a/wolfcrypt/src/aes.c +++ b/wolfcrypt/src/aes.c @@ -5927,11 +5927,15 @@ static int wc_AesGcmEncrypt_STM32(Aes* aes, byte* out, const byte* in, word32 sz word32 keyCopy[AES_256_KEY_SIZE/sizeof(word32)]; #endif word32 keySize; +#ifdef WOLFSSL_STM32_CUBEMX int status = HAL_OK; word32 blocks = sz / AES_BLOCK_SIZE; + word32 partialBlock[AES_BLOCK_SIZE/sizeof(word32)]; +#else + int status = SUCCESS; +#endif word32 partial = sz % AES_BLOCK_SIZE; word32 tag[AES_BLOCK_SIZE/sizeof(word32)]; - word32 partialBlock[AES_BLOCK_SIZE/sizeof(word32)]; word32 ctr[AES_BLOCK_SIZE/sizeof(word32)]; byte* authInPadded = NULL; int authPadSz; @@ -6065,7 +6069,7 @@ static int wc_AesGcmEncrypt_STM32(Aes* aes, byte* out, const byte* in, word32 sz (uint8_t*)keyCopy, keySize * 8, (uint8_t*)in, sz, (uint8_t*)authInPadded, authInSz, - (uint8_t*)out, tag); + (uint8_t*)out, (uint8_t*)tag); if (status != SUCCESS) ret = AES_GCM_AUTH_E; #endif /* WOLFSSL_STM32_CUBEMX */ @@ -6360,13 +6364,14 @@ static int wc_AesGcmDecrypt_STM32(Aes* aes, byte* out, { int ret; #ifdef WOLFSSL_STM32_CUBEMX + int status = HAL_OK; CRYP_HandleTypeDef hcryp; + word32 blocks = sz / AES_BLOCK_SIZE; #else + int status = SUCCESS; word32 keyCopy[AES_256_KEY_SIZE/sizeof(word32)]; #endif word32 keySize; - int status = HAL_OK; - word32 blocks = sz / AES_BLOCK_SIZE; word32 partial = sz % AES_BLOCK_SIZE; word32 tag[AES_BLOCK_SIZE/sizeof(word32)]; word32 partialBlock[AES_BLOCK_SIZE/sizeof(word32)]; @@ -6508,7 +6513,7 @@ static int wc_AesGcmDecrypt_STM32(Aes* aes, byte* out, (uint8_t*)keyCopy, keySize * 8, (uint8_t*)in, sz, (uint8_t*)authInPadded, authInSz, - (uint8_t*)out, tag); + (uint8_t*)out, (uint8_t*)tag); if (status != SUCCESS) ret = AES_GCM_AUTH_E; #endif /* WOLFSSL_STM32_CUBEMX */ diff --git a/wolfcrypt/src/des3.c b/wolfcrypt/src/des3.c index b4b0187cd..9daa195eb 100644 --- a/wolfcrypt/src/des3.c +++ b/wolfcrypt/src/des3.c @@ -345,7 +345,7 @@ return 0; } - static void Des3Crypt(Des3* des, byte* out, const byte* in, word32 sz, + static int Des3Crypt(Des3* des, byte* out, const byte* in, word32 sz, int dir) { if (des == NULL || out == NULL || in == NULL) @@ -460,18 +460,17 @@ CRYP_Cmd(DISABLE); } #endif /* WOLFSSL_STM32_CUBEMX */ + return 0; } int wc_Des3_CbcEncrypt(Des3* des, byte* out, const byte* in, word32 sz) { - Des3Crypt(des, out, in, sz, DES_ENCRYPTION); - return 0; + return Des3Crypt(des, out, in, sz, DES_ENCRYPTION); } int wc_Des3_CbcDecrypt(Des3* des, byte* out, const byte* in, word32 sz) { - Des3Crypt(des, out, in, sz, DES_DECRYPTION); - return 0; + return Des3Crypt(des, out, in, sz, DES_DECRYPTION); } #elif defined(HAVE_COLDFIRE_SEC) diff --git a/wolfcrypt/src/ecc.c b/wolfcrypt/src/ecc.c index 9de60c4e3..e527645d2 100644 --- a/wolfcrypt/src/ecc.c +++ b/wolfcrypt/src/ecc.c @@ -987,7 +987,7 @@ const ecc_set_type ecc_sets[] = { "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551", /* order */ "6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296", /* Gx */ "4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5", /* Gy */ - ecc_oid_secp256r1, /* oid/oidSz */ + ecc_oid_secp256r1, /* oid/oidSz */ ecc_oid_secp256r1_sz, ECC_SECP256R1_OID, /* oid sum */ 1, /* cofactor */ From 2033be9aed24e9cc8d996429038dd15a79a4d3a3 Mon Sep 17 00:00:00 2001 From: David Garske Date: Tue, 19 May 2020 17:41:56 -0700 Subject: [PATCH 111/298] Fixes for building against older STM32 CubeMX HAL. --- wolfcrypt/src/aes.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/wolfcrypt/src/aes.c b/wolfcrypt/src/aes.c index 4494fadc7..327290a71 100644 --- a/wolfcrypt/src/aes.c +++ b/wolfcrypt/src/aes.c @@ -6049,13 +6049,13 @@ static int wc_AesGcmEncrypt_STM32(Aes* aes, byte* out, const byte* in, word32 sz /* GCM payload phase - partial remainder */ XMEMSET(partialBlock, 0, sizeof(partialBlock)); XMEMCPY(partialBlock, in + (blocks * AES_BLOCK_SIZE), partial); - status = HAL_CRYPEx_AESGCM_Encrypt(&hcryp, partialBlock, partial, - partialBlock, STM32_HAL_TIMEOUT); + status = HAL_CRYPEx_AESGCM_Encrypt(&hcryp, (uint8_t*)partialBlock, partial, + (uint8_t*)partialBlock, STM32_HAL_TIMEOUT); XMEMCPY(out + (blocks * AES_BLOCK_SIZE), partialBlock, partial); } if (status == HAL_OK) { /* Compute the authTag */ - status = HAL_CRYPEx_AESGCM_Finish(&hcryp, sz, tag, STM32_HAL_TIMEOUT); + status = HAL_CRYPEx_AESGCM_Finish(&hcryp, sz, (uint8_t*)tag, STM32_HAL_TIMEOUT); } #endif From 6a7a8fa5b7f093b010b5fd8d374e6f73359b8fed Mon Sep 17 00:00:00 2001 From: JacobBarthelmeh Date: Tue, 19 May 2020 16:41:51 -0700 Subject: [PATCH 112/298] updated RSA calls to Xilsecure --- wolfcrypt/benchmark/benchmark.c | 6 +- wolfcrypt/src/rsa.c | 139 +++++++++++++++++++------------- wolfcrypt/test/test.c | 4 +- 3 files changed, 91 insertions(+), 58 deletions(-) diff --git a/wolfcrypt/benchmark/benchmark.c b/wolfcrypt/benchmark/benchmark.c index f79f7c86f..07cc21415 100644 --- a/wolfcrypt/benchmark/benchmark.c +++ b/wolfcrypt/benchmark/benchmark.c @@ -2340,11 +2340,13 @@ exit: void bench_aesgcm(int doAsync) { -#if defined(WOLFSSL_AES_128) && !defined(WOLFSSL_AFALG_XILINX_AES) +#if defined(WOLFSSL_AES_128) && !defined(WOLFSSL_AFALG_XILINX_AES) \ + && !defined(WOLFSSL_XILINX_CRYPT) bench_aesgcm_internal(doAsync, bench_key, 16, bench_iv, 12, "AES-128-GCM-enc", "AES-128-GCM-dec"); #endif -#if defined(WOLFSSL_AES_192) && !defined(WOLFSSL_AFALG_XILINX_AES) +#if defined(WOLFSSL_AES_192) && !defined(WOLFSSL_AFALG_XILINX_AES) \ + && !defined(WOLFSSL_XILINX_CRYPT) bench_aesgcm_internal(doAsync, bench_key, 24, bench_iv, 12, "AES-192-GCM-enc", "AES-192-GCM-dec"); #endif diff --git a/wolfcrypt/src/rsa.c b/wolfcrypt/src/rsa.c index c625c6921..db91ec539 100644 --- a/wolfcrypt/src/rsa.c +++ b/wolfcrypt/src/rsa.c @@ -380,7 +380,7 @@ int wc_InitRsaHw(RsaKey* key) mSz = mp_unsigned_bin_size(&(key->n)); m = (unsigned char*)XMALLOC(mSz, key->heap, DYNAMIC_TYPE_KEY); - if (m == 0) { + if (m == NULL) { return MEMORY_E; } @@ -1718,54 +1718,6 @@ int wc_RsaUnPad_ex(byte* pkcsBlock, word32 pkcsBlockLen, byte** out, return ret; } -#if defined(WOLFSSL_XILINX_CRYPT) -/* - * Xilinx hardened crypto acceleration. - * - * Returns 0 on success and negative values on error. - */ -static int wc_RsaFunctionXil(const byte* in, word32 inLen, byte* out, - word32* outLen, int type, RsaKey* key, WC_RNG* rng) -{ - int ret = 0; - word32 keyLen; - (void)rng; - - keyLen = wc_RsaEncryptSize(key); - if (keyLen > *outLen) { - WOLFSSL_MSG("Output buffer is not big enough"); - return BAD_FUNC_ARG; - } - - if (inLen != keyLen) { - WOLFSSL_MSG("Expected that inLen equals RSA key length"); - return BAD_FUNC_ARG; - } - - switch(type) { - case RSA_PRIVATE_DECRYPT: - case RSA_PRIVATE_ENCRYPT: - /* Currently public exponent is loaded by default. - * In SDK 2017.1 RSA exponent values are expected to be of 4 bytes - * leading to private key operations with Xsecure_RsaDecrypt not being - * supported */ - ret = RSA_WRONG_TYPE_E; - break; - case RSA_PUBLIC_ENCRYPT: - case RSA_PUBLIC_DECRYPT: - if (XSecure_RsaDecrypt(&(key->xRsa), in, out) != XST_SUCCESS) { - ret = BAD_STATE_E; - } - break; - default: - ret = RSA_WRONG_TYPE_E; - } - - *outLen = keyLen; - - return ret; -} -#endif /* WOLFSSL_XILINX_CRYPT */ #ifdef WC_RSA_NONBLOCK static int wc_RsaFunctionNonBlock(const byte* in, word32 inLen, byte* out, @@ -1845,7 +1797,87 @@ static int wc_RsaFunctionNonBlock(const byte* in, word32 inLen, byte* out, } #endif /* WC_RSA_NONBLOCK */ -#ifdef WOLFSSL_AFALG_XILINX_RSA +#ifdef WOLFSSL_XILINX_CRYPT +/* + * Xilinx hardened crypto acceleration. + * + * Returns 0 on success and negative values on error. + */ +static int wc_RsaFunctionSync(const byte* in, word32 inLen, byte* out, + word32* outLen, int type, RsaKey* key, WC_RNG* rng) +{ + int ret = 0; + word32 keyLen; + (void)rng; + + keyLen = wc_RsaEncryptSize(key); + if (keyLen > *outLen) { + WOLFSSL_MSG("Output buffer is not big enough"); + return BAD_FUNC_ARG; + } + + if (inLen != keyLen) { + WOLFSSL_MSG("Expected that inLen equals RSA key length"); + return BAD_FUNC_ARG; + } + + switch(type) { + case RSA_PRIVATE_DECRYPT: + case RSA_PRIVATE_ENCRYPT: + #ifdef WOLFSSL_XILINX_CRYPTO_OLD + /* Currently public exponent is loaded by default. + * In SDK 2017.1 RSA exponent values are expected to be of 4 bytes + * leading to private key operations with Xsecure_RsaDecrypt not being + * supported */ + ret = RSA_WRONG_TYPE_E; + #else + { + byte *d; + int dSz; + XSecure_Rsa rsa; + + dSz = mp_unsigned_bin_size(&key->d); + d = (byte*)XMALLOC(dSz, key->heap, DYNAMIC_TYPE_PRIVATE_KEY); + if (d == NULL) { + ret = MEMORY_E; + } + else { + ret = mp_to_unsigned_bin(&key->d, d); + XSecure_RsaInitialize(&rsa, key->mod, NULL, d); + } + + if (ret == 0) { + if (XSecure_RsaPrivateDecrypt(&rsa, (u8*)in, inLen, out) != XST_SUCCESS) { + ret = BAD_STATE_E; + } + } + } + #endif + break; + case RSA_PUBLIC_ENCRYPT: + case RSA_PUBLIC_DECRYPT: +#ifdef WOLFSSL_XILINX_CRYPTO_OLD + if (XSecure_RsaDecrypt(&(key->xRsa), in, out) != XST_SUCCESS) { + ret = BAD_STATE_E; + } +#else + /* starting at Xilinx release 2019 the function XSecure_RsaDecrypt was removed */ + if (XSecure_RsaPublicEncrypt(&(key->xRsa), (u8*)in, inLen, out) != XST_SUCCESS) { + WOLFSSL_MSG("Error happened when calling hardware RSA public operation"); + ret = BAD_STATE_E; + } +#endif + break; + default: + ret = RSA_WRONG_TYPE_E; + } + + *outLen = keyLen; + + return ret; +} + +#elif defined(WOLFSSL_AFALG_XILINX_RSA) #ifndef ERROR_OUT #define ERROR_OUT(x) ret = (x); goto done #endif @@ -2265,12 +2297,8 @@ static int wc_RsaFunctionSync(const byte* in, word32 inLen, byte* out, #endif case RSA_PUBLIC_ENCRYPT: case RSA_PUBLIC_DECRYPT: - #ifdef WOLFSSL_XILINX_CRYPT - ret = wc_RsaFunctionXil(in, inLen, out, outLen, type, key, rng); - #else if (mp_exptmod_nct(tmp, &key->e, &key->n, tmp) != MP_OKAY) ret = MP_EXPTMOD_E; - #endif break; default: ret = RSA_WRONG_TYPE_E; @@ -2283,11 +2311,14 @@ static int wc_RsaFunctionSync(const byte* in, word32 inLen, byte* out, if (keyLen > *outLen) ret = RSA_BUFFER_E; } + +#ifndef WOLFSSL_XILINX_CRYPT if (ret == 0) { *outLen = keyLen; if (mp_to_unsigned_bin_len(tmp, out, keyLen) != MP_OKAY) ret = MP_TO_E; } +#endif #else (void)type; (void)key; diff --git a/wolfcrypt/test/test.c b/wolfcrypt/test/test.c index afdf191db..d581c5fa1 100644 --- a/wolfcrypt/test/test.c +++ b/wolfcrypt/test/test.c @@ -7513,10 +7513,10 @@ static int aes_cbc_test(void) int aes_test(void) { -#if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_COUNTER) +#if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_COUNTER) || defined(WOLFSSL_AES_DIRECT) Aes enc; byte cipher[AES_BLOCK_SIZE * 4]; -#if defined(HAVE_AES_DECRYPT) || defined(WOLFSSL_AES_COUNTER) +#if defined(HAVE_AES_DECRYPT) || defined(WOLFSSL_AES_COUNTER) || defined(WOLFSSL_AES_DIRECT) Aes dec; byte plain [AES_BLOCK_SIZE * 4]; #endif From 03ed495f84c4916d6cfc042127cb5acec661cfee Mon Sep 17 00:00:00 2001 From: JacobBarthelmeh Date: Tue, 19 May 2020 16:48:44 -0700 Subject: [PATCH 113/298] free temporary buffer --- wolfcrypt/src/rsa.c | 1 + 1 file changed, 1 insertion(+) diff --git a/wolfcrypt/src/rsa.c b/wolfcrypt/src/rsa.c index db91ec539..a441b61ba 100644 --- a/wolfcrypt/src/rsa.c +++ b/wolfcrypt/src/rsa.c @@ -1851,6 +1851,7 @@ static int wc_RsaFunctionSync(const byte* in, word32 inLen, byte* out, ret = BAD_STATE_E; } } + XFREE(d, key->heap, DYNAMIC_TYPE_PRIVATE_KEY); } #endif break; From d09b94747835715ae02483164f7b275be80caa49 Mon Sep 17 00:00:00 2001 From: JacobBarthelmeh Date: Tue, 19 May 2020 18:13:39 -0700 Subject: [PATCH 114/298] update for test case and sha3 --- wolfcrypt/src/port/xilinx/xil-sha3.c | 21 +++++++++++++++------ wolfcrypt/test/test.c | 2 +- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/wolfcrypt/src/port/xilinx/xil-sha3.c b/wolfcrypt/src/port/xilinx/xil-sha3.c index a9db6b955..2f42e1d78 100644 --- a/wolfcrypt/src/port/xilinx/xil-sha3.c +++ b/wolfcrypt/src/port/xilinx/xil-sha3.c @@ -130,13 +130,17 @@ int wc_Sha3_384_GetHash(wc_Sha3* sha, byte* out) if (sha == NULL || out == NULL) { return BAD_FUNC_ARG; } +#ifdef WOLFSSL_XILINX_CRYPTO_OLD + if (wc_Sha3_384_Copy(sha, &s) != 0) { + WOLFSSL_MSG("Unable to copy SHA3 structure"); + return MEMORY_E; + } - if (wc_Sha3_384_Copy(sha, &s) != 0) { - WOLFSSL_MSG("Unable to copy SHA3 structure"); - return MEMORY_E; - } - - return wc_Sha3_384_Final(&s, out); + return wc_Sha3_384_Final(&s, out); +#else + XSecure_Sha3_ReadHash(&(sha->hw), out); + return 0; +#endif } @@ -151,8 +155,13 @@ int wc_Sha3_384_Copy(wc_Sha3* src, wc_Sha3* dst) return BAD_FUNC_ARG; } +#ifdef WOLFSSL_XILINX_CRYPTO_OLD XMEMCPY((byte*)dst, (byte*)src, sizeof(wc_Sha3)); return 0; +#else + WOLFSSL_MSG("Copy of SHA3 struct not supported with this build"); + return -1; +#endif } #endif diff --git a/wolfcrypt/test/test.c b/wolfcrypt/test/test.c index d581c5fa1..25d0cf24c 100644 --- a/wolfcrypt/test/test.c +++ b/wolfcrypt/test/test.c @@ -11251,7 +11251,7 @@ static int rsa_sig_test(RsaKey* key, word32 keyLen, int modLen, WC_RNG* rng) * -101 = USER_CRYPTO_ERROR */ if (ret == 0) -#elif defined(WOLFSSL_AFALG_XILINX_RSA) +#elif defined(WOLFSSL_AFALG_XILINX_RSA) || defined(WOLFSSL_XILINX_CRYPT) /* blinding / rng handled with hardware acceleration */ if (ret != 0) #elif defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLF_CRYPTO_CB) From 4a85bf81083f06a5fa10a2eb9990e43a5a28c7b3 Mon Sep 17 00:00:00 2001 From: Juliusz Sosinowicz Date: Thu, 7 May 2020 15:42:14 +0200 Subject: [PATCH 115/298] Additional OpenSSL compat layer stuff - Add X509_get0_notBefore and X509_get0_notAfter - Implement EVP_PKEY_get0_DSA and DSA_bits - OpenSSL_version now prints "wolfSSL $VERSION" - Remove define guards in `wolfSSL_internal_get_version` as all protocols are defined regardless in `wolfssl/internal.h`and this function just returns the string description of the protocol --- configure.ac | 2 +- src/ssl.c | 27 ++++++++++++++++++--------- tests/api.c | 33 +++++++++++++++++---------------- wolfcrypt/src/evp.c | 8 ++++++++ wolfssl/openssl/dsa.h | 2 ++ wolfssl/openssl/evp.h | 1 + wolfssl/openssl/ssl.h | 8 +++++--- wolfssl/ssl.h | 1 + 8 files changed, 53 insertions(+), 29 deletions(-) diff --git a/configure.ac b/configure.ac index bed125b5b..fd49fbeaf 100644 --- a/configure.ac +++ b/configure.ac @@ -1536,7 +1536,7 @@ AC_ARG_ENABLE([dsa], [ ENABLED_DSA=no ] ) -if test "$ENABLED_OPENSSH" = "yes" || test "$ENABLED_NGINX" = "yes" || test "$ENABLED_WPAS" = "yes" || test "$ENABLED_QT" = "yes" +if test "$ENABLED_OPENSSH" = "yes" || test "$ENABLED_OPENVPN" = "yes" || test "$ENABLED_NGINX" = "yes" || test "$ENABLED_WPAS" = "yes" || test "$ENABLED_QT" = "yes" then ENABLED_DSA="yes" fi diff --git a/src/ssl.c b/src/ssl.c index bc14865ad..255ec7cc8 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -19268,21 +19268,14 @@ static const char* wolfSSL_internal_get_version(ProtocolVersion* version) if (version->major == SSLv3_MAJOR) { switch (version->minor) { - #ifndef NO_OLD_TLS - #ifdef WOLFSSL_ALLOW_SSLV3 case SSLv3_MINOR : return "SSLv3"; - #endif - #ifdef WOLFSSL_ALLOW_TLSV10 case TLSv1_MINOR : return "TLSv1"; - #endif case TLSv1_1_MINOR : return "TLSv1.1"; - #endif case TLSv1_2_MINOR : return "TLSv1.2"; - #ifdef WOLFSSL_TLS13 case TLSv1_3_MINOR : #ifdef WOLFSSL_TLS13_DRAFT #ifdef WOLFSSL_TLS13_DRAFT_18 @@ -19299,7 +19292,6 @@ static const char* wolfSSL_internal_get_version(ProtocolVersion* version) #else return "TLSv1.3"; #endif - #endif default: return "unknown"; } @@ -19337,6 +19329,13 @@ const char* wolfSSL_lib_version(void) return LIBWOLFSSL_VERSION_STRING; } +#ifdef OPENSSL_EXTRA +const char* wolfSSL_OpenSSL_version(void) +{ + return "wolfSSL " LIBWOLFSSL_VERSION_STRING; +} +#endif + /* current library version in hex */ word32 wolfSSL_lib_version_hex(void) @@ -29954,6 +29953,16 @@ int wolfSSL_DSA_do_verify(const unsigned char* d, unsigned char* sig, return WOLFSSL_SUCCESS; } + +int wolfSSL_DSA_bits(const WOLFSSL_DSA *d) +{ + if (!d) + return WOLFSSL_FAILURE; + if (!d->exSet && SetDsaExternal((WOLFSSL_DSA*)d) != WOLFSSL_SUCCESS) + return WOLFSSL_FAILURE; + return wolfSSL_BN_num_bits(d->p); +} + #if !defined(HAVE_SELFTEST) && !defined(HAVE_FIPS) int wolfSSL_DSA_do_verify_ex(const unsigned char* digest, int digest_len, WOLFSSL_DSA_SIG* sig, WOLFSSL_DSA* dsa) @@ -33232,7 +33241,7 @@ size_t wolfSSL_EC_get_builtin_curves(WOLFSSL_EC_BUILTIN_CURVE *r, size_t nitems) r[i].comment = wolfSSL_OBJ_nid2sn(r[i].nid); } - return ecc_sets_count; + return min_nitems; } /* Start ECDSA_SIG */ diff --git a/tests/api.c b/tests/api.c index 91f391d6a..c230c3c4a 100644 --- a/tests/api.c +++ b/tests/api.c @@ -27185,7 +27185,7 @@ static void test_wolfSSL_AES_cbc_encrypt() #endif } -#if defined(WOLFSSL_QT) +#if defined(OPENSSL_ALL) #if !defined(NO_ASN) static void test_wolfSSL_ASN1_STRING_to_UTF8(void) { @@ -27253,7 +27253,7 @@ static void test_wolfSSL_sk_CIPHER_description(void) printf(testingFmt, "wolfSSL_sk_CIPHER_description"); - AssertNotNull(method = TLSv1_client_method()); + AssertNotNull(method = TLSv1_2_client_method()); AssertNotNull(ctx = SSL_CTX_new(method)); SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, 0); @@ -27311,7 +27311,7 @@ static void test_wolfSSL_get_ciphers_compat(void) printf(testingFmt, "wolfSSL_get_ciphers_compat"); - AssertNotNull(method = TLSv1_client_method()); + AssertNotNull(method = SSLv23_client_method()); AssertNotNull(ctx = SSL_CTX_new(method)); SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, 0); @@ -27618,14 +27618,18 @@ static void test_wolfSSL_EVP_PKEY_set1_get1_DSA(void) AssertIntEQ(SHA1_Final(hash,&sha), WOLFSSL_SUCCESS); /* Initialize pkey with der format dsa key */ - AssertNotNull(wolfSSL_d2i_PrivateKey(EVP_PKEY_DSA, &pkey, + AssertNotNull(d2i_PrivateKey(EVP_PKEY_DSA, &pkey, &dsaKeyDer ,(long)dsaKeySz)); /* Test wolfSSL_EVP_PKEY_get1_DSA */ /* Should Fail: NULL argument */ - AssertNull(dsa = wolfSSL_EVP_PKEY_get1_DSA(NULL)); + AssertNull(dsa = EVP_PKEY_get0_DSA(NULL)); + AssertNull(dsa = EVP_PKEY_get1_DSA(NULL)); /* Should Pass: Initialized pkey argument */ - AssertNotNull(dsa = wolfSSL_EVP_PKEY_get1_DSA(pkey)); + AssertNotNull(dsa = EVP_PKEY_get0_DSA(pkey)); + AssertNotNull(dsa = EVP_PKEY_get1_DSA(pkey)); + + AssertIntEQ(DSA_bits(dsa), 2048); /* Sign */ AssertIntEQ(wolfSSL_DSA_do_sign(hash, signature, dsa), WOLFSSL_SUCCESS); @@ -27635,17 +27639,17 @@ static void test_wolfSSL_EVP_PKEY_set1_get1_DSA(void) /* Test wolfSSL_EVP_PKEY_set1_DSA */ /* Should Fail: set1Pkey not initialized */ - AssertIntNE(wolfSSL_EVP_PKEY_set1_DSA(set1Pkey, dsa), WOLFSSL_SUCCESS); + AssertIntNE(EVP_PKEY_set1_DSA(set1Pkey, dsa), WOLFSSL_SUCCESS); /* Initialize set1Pkey */ - set1Pkey = wolfSSL_EVP_PKEY_new(); + set1Pkey = EVP_PKEY_new(); /* Should Fail Verify: setDsa not initialized from set1Pkey */ AssertIntNE(wolfSSL_DSA_do_verify(hash,signature,setDsa,&answer), WOLFSSL_SUCCESS); /* Should Pass: set dsa into set1Pkey */ - AssertIntEQ(wolfSSL_EVP_PKEY_set1_DSA(set1Pkey, dsa), WOLFSSL_SUCCESS); + AssertIntEQ(EVP_PKEY_set1_DSA(set1Pkey, dsa), WOLFSSL_SUCCESS); printf(resultFmt, passed); DSA_free(dsa); @@ -28041,7 +28045,7 @@ static void test_wolfSSL_OBJ_ln(void) { int nCurves = 27; EC_builtin_curve r[nCurves]; - EC_get_builtin_curves(r,nCurves); + nCurves = EC_get_builtin_curves(r,nCurves); for (i = 0; i < nCurves; i++) { AssertIntEQ(OBJ_ln2nid(r[i].comment), r[i].nid); @@ -28080,7 +28084,7 @@ static void test_wolfSSL_OBJ_sn(void) printf(resultFmt, passed); } -#endif /* WOLFSSL_QT */ +#endif /* OPENSSL_ALL */ static void test_wolfSSL_X509V3_EXT_get(void) { @@ -32172,8 +32176,7 @@ void ApiTest(void) test_wolfSSL_EVP_PKEY_derive(); test_wolfSSL_RSA_padding_add_PKCS1_PSS(); -#if defined(WOLFSSL_QT) - printf("\n----------------Qt Unit Tests-------------------\n"); +#if defined(OPENSSL_ALL) test_wolfSSL_X509_PUBKEY_get(); test_wolfSSL_sk_CIPHER_description(); test_wolfSSL_get_ciphers_compat(); @@ -32190,9 +32193,7 @@ void ApiTest(void) test_wolfSSL_OBJ_ln(); test_wolfSSL_OBJ_sn(); - printf("\n-------------End Of Qt Unit Tests---------------\n"); - -#endif /* WOLFSSL_QT */ +#endif /* OPENSSL_ALL */ #if (defined(OPENSSL_ALL) || defined(WOLFSSL_ASIO)) && !defined(NO_RSA) AssertIntEQ(test_wolfSSL_CTX_use_certificate_ASN1(), WOLFSSL_SUCCESS); diff --git a/wolfcrypt/src/evp.c b/wolfcrypt/src/evp.c index 4a0bb8103..9681a37cd 100644 --- a/wolfcrypt/src/evp.c +++ b/wolfcrypt/src/evp.c @@ -5800,6 +5800,14 @@ int wolfSSL_EVP_PKEY_set1_DSA(WOLFSSL_EVP_PKEY *pkey, WOLFSSL_DSA *key) return WOLFSSL_SUCCESS; } +WOLFSSL_DSA* wolfSSL_EVP_PKEY_get0_DSA(struct WOLFSSL_EVP_PKEY *pkey) +{ + if (!pkey) { + return NULL; + } + return pkey->dsa; +} + WOLFSSL_DSA* wolfSSL_EVP_PKEY_get1_DSA(WOLFSSL_EVP_PKEY* key) { WOLFSSL_DSA* local; diff --git a/wolfssl/openssl/dsa.h b/wolfssl/openssl/dsa.h index 9267cf479..2729c09bd 100644 --- a/wolfssl/openssl/dsa.h +++ b/wolfssl/openssl/dsa.h @@ -80,6 +80,8 @@ WOLFSSL_API int wolfSSL_DSA_do_verify(const unsigned char* d, unsigned char* sig, WOLFSSL_DSA* dsa, int *dsacheck); +WOLFSSL_API int wolfSSL_DSA_bits(const WOLFSSL_DSA *d); + WOLFSSL_API WOLFSSL_DSA_SIG* wolfSSL_DSA_SIG_new(void); WOLFSSL_API void wolfSSL_DSA_SIG_free(WOLFSSL_DSA_SIG *sig); WOLFSSL_API WOLFSSL_DSA_SIG* wolfSSL_DSA_do_sign_ex(const unsigned char* digest, diff --git a/wolfssl/openssl/evp.h b/wolfssl/openssl/evp.h index 084ccaf00..e8846609c 100644 --- a/wolfssl/openssl/evp.h +++ b/wolfssl/openssl/evp.h @@ -521,6 +521,7 @@ WOLFSSL_API int wolfSSL_EVP_PKEY_assign_EC_KEY(WOLFSSL_EVP_PKEY* pkey, WOLFSSL_API int wolfSSL_EVP_PKEY_assign_DSA(EVP_PKEY* pkey, WOLFSSL_DSA* key); WOLFSSL_API int wolfSSL_EVP_PKEY_assign_DH(EVP_PKEY* pkey, WOLFSSL_DH* key); WOLFSSL_API WOLFSSL_RSA* wolfSSL_EVP_PKEY_get0_RSA(struct WOLFSSL_EVP_PKEY *pkey); +WOLFSSL_API WOLFSSL_DSA* wolfSSL_EVP_PKEY_get0_DSA(struct WOLFSSL_EVP_PKEY *pkey); WOLFSSL_API WOLFSSL_RSA* wolfSSL_EVP_PKEY_get1_RSA(WOLFSSL_EVP_PKEY*); WOLFSSL_API WOLFSSL_DSA* wolfSSL_EVP_PKEY_get1_DSA(WOLFSSL_EVP_PKEY*); WOLFSSL_API WOLFSSL_EC_KEY *wolfSSL_EVP_PKEY_get0_EC_KEY(WOLFSSL_EVP_PKEY *pkey); diff --git a/wolfssl/openssl/ssl.h b/wolfssl/openssl/ssl.h index 6a435f649..485e8bb1c 100644 --- a/wolfssl/openssl/ssl.h +++ b/wolfssl/openssl/ssl.h @@ -340,8 +340,8 @@ typedef STACK_OF(ACCESS_DESCRIPTION) AUTHORITY_INFO_ACCESS; #define DSA_dup_DH wolfSSL_DSA_dup_DH /* wolfSSL does not support DSA as the cert public key */ -#define EVP_PKEY_get0_DSA(...) NULL -#define DSA_bits(...) 0 +#define EVP_PKEY_get0_DSA wolfSSL_EVP_PKEY_get0_DSA +#define DSA_bits wolfSSL_DSA_bits #define i2d_X509_bio wolfSSL_i2d_X509_bio #define d2i_X509_bio wolfSSL_d2i_X509_bio @@ -381,7 +381,9 @@ typedef STACK_OF(ACCESS_DESCRIPTION) AUTHORITY_INFO_ACCESS; #define X509_get_pubkey wolfSSL_X509_get_pubkey #define X509_get0_pubkey wolfSSL_X509_get_pubkey #define X509_get_notBefore wolfSSL_X509_get_notBefore +#define X509_get0_notBefore wolfSSL_X509_get_notBefore #define X509_get_notAfter wolfSSL_X509_get_notAfter +#define X509_get0_notAfter wolfSSL_X509_get_notAfter #define X509_get_serialNumber wolfSSL_X509_get_serialNumber #define X509_get0_pubkey_bitstr wolfSSL_X509_get0_pubkey_bitstr #define X509_get_ex_new_index wolfSSL_X509_get_ex_new_index @@ -1227,7 +1229,7 @@ enum { #define X509_OBJECT_free wolfSSL_X509_OBJECT_free #define X509_OBJECT_get_type(x) 0 -#define OpenSSL_version(x) wolfSSL_lib_version() +#define OpenSSL_version(x) wolfSSL_OpenSSL_version() #ifdef __cplusplus } /* extern "C" */ diff --git a/wolfssl/ssl.h b/wolfssl/ssl.h index 5522c7d61..798c5d6b5 100644 --- a/wolfssl/ssl.h +++ b/wolfssl/ssl.h @@ -2088,6 +2088,7 @@ WOLFSSL_ABI WOLFSSL_API int wolfSSL_Cleanup(void); /* which library version do we have */ WOLFSSL_API const char* wolfSSL_lib_version(void); +WOLFSSL_API const char* wolfSSL_OpenSSL_version(void); /* which library version do we have in hex */ WOLFSSL_API word32 wolfSSL_lib_version_hex(void); From 5f7832909b9500e8d97291c3095ae095f58be5e5 Mon Sep 17 00:00:00 2001 From: Juliusz Sosinowicz Date: Wed, 20 May 2020 16:53:05 +0200 Subject: [PATCH 116/298] BIO_new_mem_buf with negative len should take strlen of buf as len --- src/ssl.c | 5 ++++- tests/api.c | 3 +-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/ssl.c b/src/ssl.c index 255ec7cc8..95e228442 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -14913,7 +14913,7 @@ int wolfSSL_set_compression(WOLFSSL* ssl) { WOLFSSL_BIO* bio = NULL; - if (buf == NULL || len < 0) { + if (buf == NULL) { return bio; } @@ -14922,6 +14922,9 @@ int wolfSSL_set_compression(WOLFSSL* ssl) return bio; } + if (len < 0) { + len = XSTRLEN(buf); + } bio->num = bio->wrSz = len; bio->ptr = (byte*)XMALLOC(len, 0, DYNAMIC_TYPE_OPENSSL); if (bio->ptr == NULL) { diff --git a/tests/api.c b/tests/api.c index c230c3c4a..507d59116 100644 --- a/tests/api.c +++ b/tests/api.c @@ -24983,10 +24983,9 @@ static void test_wolfSSL_BIO_gets(void) /* try with bad args */ AssertNull(bio = BIO_new_mem_buf(NULL, sizeof(msg))); - AssertNull(bio = BIO_new_mem_buf((void*)msg, -1)); /* try with real msg */ - AssertNotNull(bio = BIO_new_mem_buf((void*)msg, sizeof(msg))); + AssertNotNull(bio = BIO_new_mem_buf((void*)msg, -1)); XMEMSET(bio_buffer, 0, bufferSz); AssertNotNull(BIO_push(bio, BIO_new(BIO_s_bio()))); AssertNull(bio2 = BIO_find_type(bio, BIO_TYPE_FILE)); From de4d2e643690ced6a8368473bbb939717805ecff Mon Sep 17 00:00:00 2001 From: David Garske Date: Wed, 20 May 2020 10:49:26 -0700 Subject: [PATCH 117/298] Fix for CubeMX HAL `headerSize` (older CubeMX HAL uses actual bytes, not multiple of 32-bit). Fix for GMAC case in `STM32_CRYPTO_AES_ONLY`. --- wolfcrypt/src/aes.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/wolfcrypt/src/aes.c b/wolfcrypt/src/aes.c index 327290a71..9037583d0 100644 --- a/wolfcrypt/src/aes.c +++ b/wolfcrypt/src/aes.c @@ -5987,10 +5987,10 @@ static int wc_AesGcmEncrypt_STM32(Aes* aes, byte* out, const byte* in, word32 sz #ifdef WOLFSSL_STM32_CUBEMX hcryp.Init.pInitVect = (STM_CRYPT_TYPE*)ctr; hcryp.Init.Header = (STM_CRYPT_TYPE*)authInPadded; - hcryp.Init.HeaderSize = authPadSz/sizeof(word32); #ifdef STM32_CRYPTO_AES_ONLY /* Set the CRYP parameters */ + hcryp.Init.HeaderSize = authPadSz; hcryp.Init.ChainingMode = CRYP_CHAINMODE_AES_GCM_GMAC; hcryp.Init.OperatingMode = CRYP_ALGOMODE_ENCRYPT; hcryp.Init.GCMCMACPhase = CRYP_INIT_PHASE; @@ -6011,21 +6011,22 @@ static int wc_AesGcmEncrypt_STM32(Aes* aes, byte* out, const byte* in, word32 sz (blocks * AES_BLOCK_SIZE), out, STM32_HAL_TIMEOUT); } } - if (status == HAL_OK && (partial != 0 || blocks == 0)) { + if (status == HAL_OK && (partial != 0 || (sz > 0 && blocks == 0))) { /* GCM payload phase - partial remainder */ XMEMSET(partialBlock, 0, sizeof(partialBlock)); XMEMCPY(partialBlock, in + (blocks * AES_BLOCK_SIZE), partial); - status = HAL_CRYPEx_AES_Auth(&hcryp, partialBlock, partial, - partialBlock, STM32_HAL_TIMEOUT); + status = HAL_CRYPEx_AES_Auth(&hcryp, (uint8_t*)partialBlock, partial, + (uint8_t*)partialBlock, STM32_HAL_TIMEOUT); XMEMCPY(out + (blocks * AES_BLOCK_SIZE), partialBlock, partial); } if (status == HAL_OK) { /* GCM final phase */ hcryp.Init.GCMCMACPhase = CRYP_FINAL_PHASE; - status = HAL_CRYPEx_AES_Auth(&hcryp, NULL, sz, tag, STM32_HAL_TIMEOUT); + status = HAL_CRYPEx_AES_Auth(&hcryp, NULL, sz, (uint8_t*)tag, STM32_HAL_TIMEOUT); } #elif defined(STM32_HAL_V2) hcryp.Init.Algorithm = CRYP_AES_GCM; + hcryp.Init.HeaderSize = authPadSz/sizeof(word32); ByteReverseWords(partialBlock, ctr, AES_BLOCK_SIZE); hcryp.Init.pInitVect = (STM_CRYPT_TYPE*)partialBlock; HAL_CRYP_Init(&hcryp); @@ -6039,6 +6040,7 @@ static int wc_AesGcmEncrypt_STM32(Aes* aes, byte* out, const byte* in, word32 sz STM32_HAL_TIMEOUT); } #else + hcryp.Init.HeaderSize = authPadSz; HAL_CRYP_Init(&hcryp); if (blocks) { /* GCM payload phase - blocks */ @@ -6426,10 +6428,10 @@ static int wc_AesGcmDecrypt_STM32(Aes* aes, byte* out, #ifdef WOLFSSL_STM32_CUBEMX hcryp.Init.pInitVect = (STM_CRYPT_TYPE*)ctr; hcryp.Init.Header = (STM_CRYPT_TYPE*)authInPadded; - hcryp.Init.HeaderSize = authPadSz/sizeof(word32); #ifdef STM32_CRYPTO_AES_ONLY /* Set the CRYP parameters */ + hcryp.Init.HeaderSize = authPadSz; hcryp.Init.ChainingMode = CRYP_CHAINMODE_AES_GCM_GMAC; hcryp.Init.OperatingMode = CRYP_ALGOMODE_DECRYPT; hcryp.Init.GCMCMACPhase = CRYP_INIT_PHASE; @@ -6450,7 +6452,7 @@ static int wc_AesGcmDecrypt_STM32(Aes* aes, byte* out, (blocks * AES_BLOCK_SIZE), out, STM32_HAL_TIMEOUT); } } - if (status == HAL_OK && (partial != 0 || blocks == 0)) { + if (status == HAL_OK && (partial != 0 || (sz > 0 && blocks == 0))) { /* GCM payload phase - partial remainder */ XMEMSET(partialBlock, 0, sizeof(partialBlock)); XMEMCPY(partialBlock, in + (blocks * AES_BLOCK_SIZE), partial); @@ -6464,6 +6466,7 @@ static int wc_AesGcmDecrypt_STM32(Aes* aes, byte* out, status = HAL_CRYPEx_AES_Auth(&hcryp, NULL, sz, (byte*)tag, STM32_HAL_TIMEOUT); } #elif defined(STM32_HAL_V2) + hcryp.Init.HeaderSize = authPadSz/sizeof(word32); hcryp.Init.Algorithm = CRYP_AES_GCM; ByteReverseWords(partialBlock, ctr, AES_BLOCK_SIZE); hcryp.Init.pInitVect = (STM_CRYPT_TYPE*)partialBlock; @@ -6478,6 +6481,7 @@ static int wc_AesGcmDecrypt_STM32(Aes* aes, byte* out, STM32_HAL_TIMEOUT); } #else + hcryp.Init.HeaderSize = authPadSz; HAL_CRYP_Init(&hcryp); if (blocks) { /* GCM payload phase - blocks */ From 363b9528af3a4f930cbd33402eb74b87b5f5fdcc Mon Sep 17 00:00:00 2001 From: David Garske Date: Wed, 20 May 2020 11:23:14 -0700 Subject: [PATCH 118/298] Fix for STM32 AES only (L4) AES Decrypt Direct (ECB). --- wolfcrypt/src/aes.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wolfcrypt/src/aes.c b/wolfcrypt/src/aes.c index 9037583d0..516884670 100644 --- a/wolfcrypt/src/aes.c +++ b/wolfcrypt/src/aes.c @@ -392,7 +392,7 @@ return ret; #ifdef STM32_CRYPTO_AES_ONLY - hcryp.Init.OperatingMode = CRYP_ALGOMODE_DECRYPT; + hcryp.Init.OperatingMode = CRYP_ALGOMODE_KEYDERIVATION_DECRYPT; hcryp.Init.ChainingMode = CRYP_CHAINMODE_AES_ECB; hcryp.Init.KeyWriteFlag = CRYP_KEY_WRITE_ENABLE; #elif defined(STM32_HAL_V2) From 986c8f351c8d065a23e7848f74411d75e3452662 Mon Sep 17 00:00:00 2001 From: Juliusz Sosinowicz Date: Wed, 20 May 2020 20:34:45 +0200 Subject: [PATCH 119/298] Fix leak in SetIndividualInternal SetIndividualInternal should not do mp_init on mpi since it should have been zero'ed during allocation and if it isn't zero'ed then it must mean that memory has already been allocated to it --- src/ssl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ssl.c b/src/ssl.c index bc14865ad..07f0822ba 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -44418,7 +44418,7 @@ int SetIndividualInternal(WOLFSSL_BIGNUM* bn, mp_int* mpi) return WOLFSSL_FATAL_ERROR; } - if (mpi == NULL || (mp_init(mpi) != MP_OKAY)) { + if (mpi == NULL) { WOLFSSL_MSG("mpi NULL error"); return WOLFSSL_FATAL_ERROR; } From 70c55ce30a676113a9a5ffd6d14ffdeed1e50ca0 Mon Sep 17 00:00:00 2001 From: Juliusz Sosinowicz Date: Thu, 21 May 2020 12:51:23 +0200 Subject: [PATCH 120/298] Set offset in cipher struct --- src/ssl.c | 31 ++++++++++++++++++++++--------- wolfssl/internal.h | 3 +-- wolfssl/ssl.h | 2 +- 3 files changed, 24 insertions(+), 12 deletions(-) diff --git a/src/ssl.c b/src/ssl.c index 95e228442..5daad9676 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -19261,7 +19261,7 @@ void wolfSSL_SESSION_free(WOLFSSL_SESSION* session) /* helper function that takes in a protocol version struct and returns string */ -static const char* wolfSSL_internal_get_version(ProtocolVersion* version) +static const char* wolfSSL_internal_get_version(const ProtocolVersion* version) { WOLFSSL_ENTER("wolfSSL_get_version"); @@ -19315,7 +19315,7 @@ static const char* wolfSSL_internal_get_version(ProtocolVersion* version) } -const char* wolfSSL_get_version(WOLFSSL* ssl) +const char* wolfSSL_get_version(const WOLFSSL* ssl) { if (ssl == NULL) { WOLFSSL_MSG("Bad argument"); @@ -21092,6 +21092,8 @@ int wolfSSL_sk_CIPHER_description(WOLFSSL_CIPHER* cipher) cipher_names = GetCipherNames(); offset = cipher->offset; + if (offset >= (unsigned long)GetCipherNamesSize()) + return WOLFSSL_FAILURE; pv.major = cipher_names[offset].major; pv.minor = cipher_names[offset].minor; protocol = wolfSSL_internal_get_version(&pv); @@ -26628,9 +26630,6 @@ int wolfSSL_sk_num(WOLFSSL_STACK* sk) void* wolfSSL_sk_value(WOLFSSL_STACK* sk, int i) { -#if defined(OPENSSL_ALL) || defined(WOLFSSL_QT) - int offset = i; -#endif WOLFSSL_ENTER("wolfSSL_sk_value"); for (; sk != NULL && i > 0; i--) @@ -26642,9 +26641,6 @@ void* wolfSSL_sk_value(WOLFSSL_STACK* sk, int i) case STACK_TYPE_X509: return (void*)sk->data.x509; case STACK_TYPE_CIPHER: - #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT) - sk->data.cipher.offset = offset; - #endif return (void*)&sk->data.cipher; case STACK_TYPE_GEN_NAME: return (void*)sk->data.gn; @@ -42940,6 +42936,8 @@ WOLF_STACK_OF(WOLFSSL_CIPHER) *wolfSSL_get_ciphers_compat(const WOLFSSL *ssl) { WOLF_STACK_OF(WOLFSSL_CIPHER)* ret = NULL; Suites* suites; + const CipherSuiteInfo* cipher_names = GetCipherNames(); + int cipherSz = GetCipherNamesSize(); WOLFSSL_ENTER("wolfSSL_get_ciphers_compat"); if (ssl == NULL || (ssl->suites == NULL && ssl->ctx->suites == NULL)) { @@ -42956,15 +42954,30 @@ WOLF_STACK_OF(WOLFSSL_CIPHER) *wolfSSL_get_ciphers_compat(const WOLFSSL *ssl) /* check if stack needs populated */ if (suites->stack == NULL) { int i; +#if defined(OPENSSL_ALL) || defined(WOLFSSL_QT) + int j; +#endif for (i = 0; i < suites->suiteSz; i+=2) { WOLFSSL_STACK* add = wolfSSL_sk_new_node(ssl->heap); if (add != NULL) { add->type = STACK_TYPE_CIPHER; add->data.cipher.cipherSuite0 = suites->suites[i]; add->data.cipher.cipherSuite = suites->suites[i+1]; + add->data.cipher.ssl = ssl; +#if defined(OPENSSL_ALL) || defined(WOLFSSL_QT) + for (j = 0; j < cipherSz; j++) { + if (cipher_names[j].cipherSuite0 == + add->data.cipher.cipherSuite0 && + cipher_names[j].cipherSuite == + add->data.cipher.cipherSuite) { + add->data.cipher.offset = j; + break; + } + } +#endif #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL) /* in_stack is checked in wolfSSL_CIPHER_description */ - add->data.cipher.in_stack = 1; + add->data.cipher.in_stack = 1; #endif add->next = ret; diff --git a/wolfssl/internal.h b/wolfssl/internal.h index 5cfcc9b85..961ef3d2c 100644 --- a/wolfssl/internal.h +++ b/wolfssl/internal.h @@ -1840,11 +1840,10 @@ WOLFSSL_LOCAL int SetCipherList(WOLFSSL_CTX*, Suites*, const char* list); #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT) #define MAX_DESCRIPTION_SZ 255 #endif -/* wolfSSL Cipher type just points back to SSL */ struct WOLFSSL_CIPHER { byte cipherSuite0; byte cipherSuite; - WOLFSSL* ssl; + const WOLFSSL* ssl; #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT) char description[MAX_DESCRIPTION_SZ]; unsigned long offset; diff --git a/wolfssl/ssl.h b/wolfssl/ssl.h index 798c5d6b5..96a3e1d0e 100644 --- a/wolfssl/ssl.h +++ b/wolfssl/ssl.h @@ -1157,7 +1157,7 @@ WOLFSSL_API WOLFSSL_SESSION* wolfSSL_SESSION_dup(WOLFSSL_SESSION* session); WOLFSSL_API void wolfSSL_SESSION_free(WOLFSSL_SESSION* session); WOLFSSL_API int wolfSSL_is_init_finished(WOLFSSL*); -WOLFSSL_API const char* wolfSSL_get_version(WOLFSSL*); +WOLFSSL_API const char* wolfSSL_get_version(const WOLFSSL*); WOLFSSL_API int wolfSSL_get_current_cipher_suite(WOLFSSL* ssl); WOLFSSL_API WOLFSSL_CIPHER* wolfSSL_get_current_cipher(WOLFSSL*); WOLFSSL_API char* wolfSSL_CIPHER_description(const WOLFSSL_CIPHER*, char*, int); From a67e1fc2adb798cb754df39f5ace1830a4d8e4b8 Mon Sep 17 00:00:00 2001 From: Juliusz Sosinowicz Date: Thu, 21 May 2020 12:58:58 +0200 Subject: [PATCH 121/298] Fix implicit conversions --- src/ssl.c | 2 +- tests/api.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/ssl.c b/src/ssl.c index 5daad9676..6029f0a09 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -14923,7 +14923,7 @@ int wolfSSL_set_compression(WOLFSSL* ssl) } if (len < 0) { - len = XSTRLEN(buf); + len = (int)XSTRLEN((const char*)buf); } bio->num = bio->wrSz = len; bio->ptr = (byte*)XMALLOC(len, 0, DYNAMIC_TYPE_OPENSSL); diff --git a/tests/api.c b/tests/api.c index 507d59116..f70a7b46c 100644 --- a/tests/api.c +++ b/tests/api.c @@ -28034,7 +28034,7 @@ static void test_wolfSSL_OBJ_ln(void) "jurisdictionStateOrProvinceName", "emailAddress", }; - int i = 0, maxIdx = sizeof(ln_set)/sizeof(char*); + size_t i = 0, maxIdx = sizeof(ln_set)/sizeof(char*); printf(testingFmt, "wolfSSL_OBJ_ln"); @@ -28042,7 +28042,7 @@ static void test_wolfSSL_OBJ_ln(void) #ifdef HAVE_ECC { - int nCurves = 27; + size_t nCurves = 27; EC_builtin_curve r[nCurves]; nCurves = EC_get_builtin_curves(r,nCurves); From cd1a50bfb61190f8a98e3cb831616faa34c86993 Mon Sep 17 00:00:00 2001 From: Jacob Barthelmeh Date: Thu, 21 May 2020 11:19:17 -0600 Subject: [PATCH 122/298] add additional sanity check on pointer before free --- wolfcrypt/src/rsa.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/wolfcrypt/src/rsa.c b/wolfcrypt/src/rsa.c index a441b61ba..98251eddc 100644 --- a/wolfcrypt/src/rsa.c +++ b/wolfcrypt/src/rsa.c @@ -1847,11 +1847,15 @@ static int wc_RsaFunctionSync(const byte* in, word32 inLen, byte* out, } if (ret == 0) { - if (XSecure_RsaPrivateDecrypt(&rsa, (u8*)in, inLen, out) != XST_SUCCESS) { + if (XSecure_RsaPrivateDecrypt(&rsa, (u8*)in, inLen, out) != + XST_SUCCESS) { ret = BAD_STATE_E; } } - XFREE(d, key->heap, DYNAMIC_TYPE_PRIVATE_KEY); + + if (d != NULL) { + XFREE(d, key->heap, DYNAMIC_TYPE_PRIVATE_KEY); + } } #endif break; From de61a8e5d3c91b298d6031cb9227fb698d418ba2 Mon Sep 17 00:00:00 2001 From: Juliusz Sosinowicz Date: Thu, 21 May 2020 19:41:40 +0200 Subject: [PATCH 123/298] Enable wolfSSL_BIO_vprintf on Windows Enable wolfSSL_BIO_vprintf use with WOLFSSL_BIO_MEMORY and WOLFSSL_BIO_SSL on Windows with the HAVE_VA_COPY flag --- src/ssl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ssl.c b/src/ssl.c index bc14865ad..cb19ebc5b 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -26404,7 +26404,7 @@ int wolfSSL_BIO_vprintf(WOLFSSL_BIO* bio, const char* format, va_list args) break; case WOLFSSL_BIO_MEMORY: - #if defined(OPENSSL_EXTRA) && !defined(_WIN32) + #if defined(OPENSSL_EXTRA) && (!defined(_WIN32) || defined(HAVE_VA_COPY)) case WOLFSSL_BIO_SSL: { int count; From 53d2a17b43540dadef68e5266c8c4d6ce04d2a68 Mon Sep 17 00:00:00 2001 From: kaleb-himes Date: Fri, 22 May 2020 15:03:11 -0600 Subject: [PATCH 124/298] Fix a seg fault when cert not loaded prior to key check --- src/ssl.c | 2 +- tests/api.c | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/ssl.c b/src/ssl.c index bc14865ad..62fec9bf8 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -6798,7 +6798,7 @@ int wolfSSL_CTX_check_private_key(const WOLFSSL_CTX* ctx) WOLFSSL_ENTER("wolfSSL_CTX_check_private_key"); - if (ctx == NULL) { + if (ctx == NULL || ctx->certificate == NULL) { return WOLFSSL_FAILURE; } diff --git a/tests/api.c b/tests/api.c index 91f391d6a..81889c5f5 100644 --- a/tests/api.c +++ b/tests/api.c @@ -20637,8 +20637,12 @@ static void test_wolfSSL_private_keys(void) #else AssertNotNull(ctx = SSL_CTX_new(wolfSSLv23_client_method())); #endif - AssertTrue(SSL_CTX_use_certificate_file(ctx, svrCertFile, WOLFSSL_FILETYPE_PEM)); AssertTrue(SSL_CTX_use_PrivateKey_file(ctx, svrKeyFile, WOLFSSL_FILETYPE_PEM)); + /* Have to load a cert before you can check the private key against that + * certificates public key! */ + AssertIntEQ(wolfSSL_CTX_check_private_key(ctx), WOLFSSL_FAILURE); + AssertTrue(SSL_CTX_use_certificate_file(ctx, svrCertFile, WOLFSSL_FILETYPE_PEM)); + AssertIntEQ(wolfSSL_CTX_check_private_key(ctx), WOLFSSL_SUCCESS); AssertNotNull(ssl = SSL_new(ctx)); AssertIntEQ(wolfSSL_check_private_key(ssl), WOLFSSL_SUCCESS); From eed5943b6f0c645e8347d74582160ba07419a2b8 Mon Sep 17 00:00:00 2001 From: Sean Parkinson Date: Tue, 5 May 2020 10:05:20 +1000 Subject: [PATCH 125/298] Fix TLS 1.3 integrity only for interop Make key size the size of the digest. --- src/keys.c | 12 ++++++++++-- wolfssl/internal.h | 15 ++++++++++++++- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/keys.c b/src/keys.c index 55b2d9bed..4b4e6a43d 100644 --- a/src/keys.c +++ b/src/keys.c @@ -1074,7 +1074,7 @@ int SetCipherSpecs(WOLFSSL* ssl) ssl->specs.hash_size = WC_SHA256_DIGEST_SIZE; ssl->specs.pad_size = PAD_SHA; ssl->specs.static_ecdh = 0; - ssl->specs.key_size = WC_SHA256_DIGEST_SIZE / 2; + ssl->specs.key_size = WC_SHA256_DIGEST_SIZE; ssl->specs.block_size = 0; ssl->specs.iv_size = HMAC_NONCE_SZ; ssl->specs.aead_mac_size = WC_SHA256_DIGEST_SIZE; @@ -1092,7 +1092,7 @@ int SetCipherSpecs(WOLFSSL* ssl) ssl->specs.hash_size = WC_SHA384_DIGEST_SIZE; ssl->specs.pad_size = PAD_SHA; ssl->specs.static_ecdh = 0; - ssl->specs.key_size = WC_SHA384_DIGEST_SIZE / 2; + ssl->specs.key_size = WC_SHA384_DIGEST_SIZE; ssl->specs.block_size = 0; ssl->specs.iv_size = HMAC_NONCE_SZ; ssl->specs.aead_mac_size = WC_SHA384_DIGEST_SIZE; @@ -2931,11 +2931,15 @@ static int SetKeys(Ciphers* enc, Ciphers* dec, Keys* keys, CipherSpecs* specs, if (side == WOLFSSL_CLIENT_END) { if (enc) { + XMEMCPY(keys->aead_enc_imp_IV, keys->client_write_IV, + HMAC_NONCE_SZ); hmacRet = wc_HmacSetKey(enc->hmac, hashType, keys->client_write_key, specs->key_size); if (hmacRet != 0) return hmacRet; } if (dec) { + XMEMCPY(keys->aead_dec_imp_IV, keys->server_write_IV, + HMAC_NONCE_SZ); hmacRet = wc_HmacSetKey(dec->hmac, hashType, keys->server_write_key, specs->key_size); if (hmacRet != 0) return hmacRet; @@ -2943,11 +2947,15 @@ static int SetKeys(Ciphers* enc, Ciphers* dec, Keys* keys, CipherSpecs* specs, } else { if (enc) { + XMEMCPY(keys->aead_enc_imp_IV, keys->server_write_IV, + HMAC_NONCE_SZ); hmacRet = wc_HmacSetKey(enc->hmac, hashType, keys->server_write_key, specs->key_size); if (hmacRet != 0) return hmacRet; } if (dec) { + XMEMCPY(keys->aead_dec_imp_IV, keys->client_write_IV, + HMAC_NONCE_SZ); hmacRet = wc_HmacSetKey(dec->hmac, hashType, keys->client_write_key, specs->key_size); if (hmacRet != 0) return hmacRet; diff --git a/wolfssl/internal.h b/wolfssl/internal.h index a60ad2cda..68865bf0a 100644 --- a/wolfssl/internal.h +++ b/wolfssl/internal.h @@ -72,6 +72,9 @@ #ifndef NO_SHA256 #include #endif +#if defined(WOLFSSL_SHA384) + #include +#endif #ifdef HAVE_OCSP #include #endif @@ -1355,7 +1358,17 @@ enum Misc { (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)) MAX_SYM_KEY_SIZE = AES_256_KEY_SIZE, #else - MAX_SYM_KEY_SIZE = WC_MAX_SYM_KEY_SIZE, + #if defined(HAVE_NULL_CIPHER) && defined(WOLFSSL_TLS13) + #if defined(WOLFSSL_SHA384) && WC_MAX_SYM_KEY_SIZE < 48 + MAX_SYM_KEY_SIZE = WC_SHA384_DIGEST_SIZE, + #elif !defined(NO_SHA256) && WC_MAX_SYM_KEY_SIZE < 32 + MAX_SYM_KEY_SIZE = WC_SHA256_DIGEST_SIZE, + #else + MAX_SYM_KEY_SIZE = WC_MAX_SYM_KEY_SIZE, + #endif + #else + MAX_SYM_KEY_SIZE = WC_MAX_SYM_KEY_SIZE, + #endif #endif #ifdef HAVE_SELFTEST From 5ef738855c7ef57e64be851f220058861cf41acd Mon Sep 17 00:00:00 2001 From: DKubasekRA <51989790+DKubasekRA@users.noreply.github.com> Date: Wed, 27 May 2020 10:43:36 +0200 Subject: [PATCH 126/298] Reverted comparison in ctMask16LT --- wolfcrypt/src/misc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wolfcrypt/src/misc.c b/wolfcrypt/src/misc.c index 7f779dc24..7ff7eb01f 100644 --- a/wolfcrypt/src/misc.c +++ b/wolfcrypt/src/misc.c @@ -363,7 +363,7 @@ WC_STATIC WC_INLINE word16 ctMask16GT(int a, int b) WC_STATIC WC_INLINE word16 ctMask16LT(int a, int b) { - return (((word32)a - b - 1) >> 31) - 1; + return (((word32)b - a - 1) >> 31) - 1; } WC_STATIC WC_INLINE word16 ctMask16Eq(int a, int b) From 19fba3648cbfe7be47bd6d4c0756159b90335b11 Mon Sep 17 00:00:00 2001 From: John Safranek Date: Wed, 27 May 2020 10:11:58 -0700 Subject: [PATCH 127/298] Bump Patch Version 1. Increase the patch level of the version number in configure.ac. 2. Added a template for the next version in ChangeLog.md. 3. Bumped version.h. --- ChangeLog.md | 30 ++++++++++++++++++++++++++++++ configure.ac | 2 +- wolfssl/version.h | 4 ++-- 3 files changed, 33 insertions(+), 3 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 94de8f63b..a3255c3ac 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -1,3 +1,33 @@ +# wolfSSL Release 4.4.1 (XX/XX/2020) **IN DEVELOPMENT** + +If you have questions about this release, then feel free to contact us on our +info@ address. + +Release 4.4.1 of wolfSSL embedded TLS has bug fixes and new features including: + +## New Feature Additions + + * Place holder. + +## Fixes + + * Place holder. + +## Improvements/Optimizations + + * Place holder. + +## This release of wolfSSL includes fixes for X security vulnerabilities. + + * Place holder. + +For additional vulnerability information visit the vulnerability page at +https://www.wolfssl.com/docs/security-vulnerabilities/ + +See INSTALL file for build instructions. +More info can be found on-line at https://wolfssl.com/wolfSSL/Docs.html + + # wolfSSL Release 4.4.0 (04/22/2020) If you have questions about this release, then feel free to contact us on our diff --git a/configure.ac b/configure.ac index bed125b5b..2b4effa89 100644 --- a/configure.ac +++ b/configure.ac @@ -7,7 +7,7 @@ # AC_COPYRIGHT([Copyright (C) 2006-2020 wolfSSL Inc.]) AC_PREREQ([2.63]) -AC_INIT([wolfssl],[4.4.0],[https://github.com/wolfssl/wolfssl/issues],[wolfssl],[https://www.wolfssl.com]) +AC_INIT([wolfssl],[4.4.1],[https://github.com/wolfssl/wolfssl/issues],[wolfssl],[https://www.wolfssl.com]) AC_CONFIG_AUX_DIR([build-aux]) # The following sets CFLAGS to empty if unset on command line. We do not diff --git a/wolfssl/version.h b/wolfssl/version.h index 332cadfae..eda79bd86 100644 --- a/wolfssl/version.h +++ b/wolfssl/version.h @@ -28,8 +28,8 @@ extern "C" { #endif -#define LIBWOLFSSL_VERSION_STRING "4.4.0" -#define LIBWOLFSSL_VERSION_HEX 0x04004000 +#define LIBWOLFSSL_VERSION_STRING "4.4.1" +#define LIBWOLFSSL_VERSION_HEX 0x04004001 #ifdef __cplusplus } From 8e9f518caaa99392bb2ff3edc8ae5a57129a1439 Mon Sep 17 00:00:00 2001 From: JacobBarthelmeh Date: Wed, 27 May 2020 16:20:39 -0600 Subject: [PATCH 128/298] fix for gcc 10+ error on snprintf --- src/ssl.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/ssl.c b/src/ssl.c index 9362b6bdc..33eff33ed 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -34639,7 +34639,8 @@ int wolfSSL_RSA_print(WOLFSSL_BIO* bio, WOLFSSL_RSA* rsa, int offset) RsaKey* iRsa = NULL; int i = 0; mp_int *rsaElem = NULL; - char rsaStr[][20] = { "Modulus:", + const char *rsaStr[] = { + "Modulus:", "PublicExponent:", "PrivateExponent:", "Prime1:", From b8e1fe666b7d900db99678406200e9dd1dd042f0 Mon Sep 17 00:00:00 2001 From: Chris Conlon Date: Mon, 20 Apr 2020 13:48:08 -0600 Subject: [PATCH 129/298] include errno.h with MICROCHIP_PIC32 for GetLastError use --- wolfssl/wolfio.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/wolfssl/wolfio.h b/wolfssl/wolfio.h index 9eaa03a85..a4f892a46 100644 --- a/wolfssl/wolfio.h +++ b/wolfssl/wolfio.h @@ -126,6 +126,8 @@ #include #elif defined(WOLFSSL_ZEPHYR) #include + #elif defined(MICROCHIP_PIC32) + #include #elif defined(HAVE_NETX) #include "nx_api.h" #include "errno.h" From d8a6d16f7242fb5a2acc4049bff57b398e36adfe Mon Sep 17 00:00:00 2001 From: Chris Conlon Date: Mon, 20 Apr 2020 13:54:32 -0600 Subject: [PATCH 130/298] add MICROCHIP_TCPIP_BSD_API for using Microchip TCP/IP with BSD API --- wolfssl/wolfcrypt/settings.h | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/wolfssl/wolfcrypt/settings.h b/wolfssl/wolfcrypt/settings.h index 6b52f998d..917027971 100644 --- a/wolfssl/wolfcrypt/settings.h +++ b/wolfssl/wolfcrypt/settings.h @@ -62,6 +62,9 @@ /* Uncomment next line if using Microchip TCP/IP stack, version 6 or later */ /* #define MICROCHIP_TCPIP */ +/* Uncomment next line if using above Microchip TCP/IP defines with BSD API */ +/* #define MICROCHIP_TCPIP_BSD_API */ + /* Uncomment next line if using PIC32MZ Crypto Engine */ /* #define WOLFSSL_MICROCHIP_PIC32MZ */ @@ -340,7 +343,9 @@ /* #define WOLFSSL_MICROCHIP_PIC32MZ */ #define SIZEOF_LONG_LONG 8 #define SINGLE_THREADED - #define WOLFSSL_USER_IO + #ifndef MICROCHIP_TCPIP_BSD_API + #define WOLFSSL_USER_IO + #endif #define NO_WRITEV #define NO_DEV_RANDOM #define NO_FILESYSTEM From 8ebd121cacc914926106f69066ec01783266de1c Mon Sep 17 00:00:00 2001 From: Chris Conlon Date: Mon, 20 Apr 2020 14:03:50 -0600 Subject: [PATCH 131/298] add extern prototype for PIC32 pic32_time() --- wolfssl/wolfcrypt/wc_port.h | 1 + 1 file changed, 1 insertion(+) diff --git a/wolfssl/wolfcrypt/wc_port.h b/wolfssl/wolfcrypt/wc_port.h index 88c7bfe34..bfc514263 100644 --- a/wolfssl/wolfcrypt/wc_port.h +++ b/wolfssl/wolfcrypt/wc_port.h @@ -553,6 +553,7 @@ WOLFSSL_API int wolfCrypt_Cleanup(void); #elif defined(MICROCHIP_TCPIP_V5) || defined(MICROCHIP_TCPIP) #include + extern time_t pic32_time(time_t* timer); #define XTIME(t1) pic32_time((t1)) #define XGMTIME(c, t) gmtime((c)) From 896fcd9aecb91d8dfd45299f018e1e24b3025153 Mon Sep 17 00:00:00 2001 From: Chris Conlon Date: Mon, 20 Apr 2020 14:59:00 -0600 Subject: [PATCH 132/298] add WOLFSSL_ATECC6088A, Trust&GO support, PIC32 HAL compatibility, 608A expansions --- src/ssl.c | 3 +- tests/api.c | 12 ++- wolfcrypt/src/ecc.c | 94 +++++++++++--------- wolfcrypt/src/port/atmel/README.md | 27 +++--- wolfcrypt/src/port/atmel/atmel.c | 125 +++++++++++++++++++++------ wolfcrypt/src/random.c | 35 ++++---- wolfcrypt/src/wc_port.c | 6 +- wolfcrypt/test/test.c | 51 +++++++---- wolfssl/wolfcrypt/ecc.h | 13 +-- wolfssl/wolfcrypt/port/atmel/atmel.h | 21 +++-- wolfssl/wolfcrypt/settings.h | 8 ++ 11 files changed, 266 insertions(+), 129 deletions(-) diff --git a/src/ssl.c b/src/ssl.c index 9362b6bdc..6d85d2285 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -32961,7 +32961,8 @@ int wolfSSL_EC_POINT_set_affine_coordinates_GFp(const WOLFSSL_EC_GROUP *group, return WOLFSSL_SUCCESS; } -#if !defined(WOLFSSL_ATECC508A) && !defined(HAVE_SELFTEST) +#if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) && \ + !defined(HAVE_SELFTEST) /* Calculate the value: generator * n + q * m * return code compliant with OpenSSL : * 1 if success, 0 if error diff --git a/tests/api.c b/tests/api.c index 81889c5f5..0e9a59e5e 100644 --- a/tests/api.c +++ b/tests/api.c @@ -17310,7 +17310,8 @@ static int test_wc_ecc_pointFns (void) int ret = 0; #if defined(HAVE_ECC) && defined(HAVE_ECC_KEY_EXPORT) && \ - !defined(WC_NO_RNG) && !defined(WOLFSSL_ATECC508A) + !defined(WC_NO_RNG) && !defined(WOLFSSL_ATECC508A) && \ + !defined(WOLFSSL_ATECC608A) ecc_key key; WC_RNG rng; ecc_point* point = NULL; @@ -17485,7 +17486,8 @@ static int test_wc_ecc_shared_secret_ssh (void) int ret = 0; #if defined(HAVE_ECC) && defined(HAVE_ECC_DHE) && \ - !defined(WC_NO_RNG) && !defined(WOLFSSL_ATECC508A) + !defined(WC_NO_RNG) && !defined(WOLFSSL_ATECC508A) && \ + !defined(WOLFSSL_ATECC608A) ecc_key key, key2; WC_RNG rng; int keySz = KEY32; @@ -17572,7 +17574,8 @@ static int test_wc_ecc_verify_hash_ex (void) int ret = 0; #if defined(HAVE_ECC) && defined(HAVE_ECC_SIGN) && defined(WOLFSSL_PUBLIC_MP) \ - && !defined(WC_NO_RNG) && !defined(WOLFSSL_ATECC508A) + && !defined(WC_NO_RNG) && !defined(WOLFSSL_ATECC508A) && \ + !defined(WOLFSSL_ATECC608A) ecc_key key; WC_RNG rng; mp_int r; @@ -17702,7 +17705,8 @@ static int test_wc_ecc_mulmod (void) int ret = 0; #if defined(HAVE_ECC) && !defined(WC_NO_RNG) && \ - !(defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_VALIDATE_ECC_IMPORT)) + !(defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A) || \ + defined(WOLFSSL_VALIDATE_ECC_IMPORT)) ecc_key key1, key2, key3; WC_RNG rng; diff --git a/wolfcrypt/src/ecc.c b/wolfcrypt/src/ecc.c index 598733980..1d1241300 100644 --- a/wolfcrypt/src/ecc.c +++ b/wolfcrypt/src/ecc.c @@ -1160,7 +1160,7 @@ static int wc_ecc_export_x963_compressed(ecc_key*, byte* out, word32* outLen); #if (defined(WOLFSSL_VALIDATE_ECC_KEYGEN) || !defined(WOLFSSL_SP_MATH)) && \ - !defined(WOLFSSL_ATECC508A) + !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) static int ecc_check_pubkey_order(ecc_key* key, ecc_point* pubkey, mp_int* a, mp_int* prime, mp_int* order); #endif @@ -1509,7 +1509,7 @@ static void alt_fp_init(mp_int* a) #endif /* ALT_ECC_SIZE */ -#ifndef WOLFSSL_ATECC508A +#if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) #if !defined(WOLFSSL_SP_MATH) || defined(WOLFSSL_PUBLIC_ECC_ADD_DBL) @@ -3534,7 +3534,8 @@ int wc_ecc_shared_secret(ecc_key* private_key, ecc_key* public_key, byte* out, word32* outlen) { int err; -#if defined(WOLFSSL_CRYPTOCELL) && !defined(WOLFSSL_ATECC508A) +#if defined(WOLFSSL_CRYPTOCELL) && !defined(WOLFSSL_ATECC508A) && \ + !defined(WOLFSSL_ATECC608A) CRYS_ECDH_TempData_t tempBuff; #endif if (private_key == NULL || public_key == NULL || out == NULL || @@ -3568,7 +3569,7 @@ int wc_ecc_shared_secret(ecc_key* private_key, ecc_key* public_key, byte* out, return ECC_BAD_ARG_E; } -#ifdef WOLFSSL_ATECC508A +#if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A) /* For SECP256R1 use hardware */ if (private_key->dp->id == ECC_SECP256R1) { err = atmel_ecc_create_pms(private_key->slot, public_key->pubkey_raw, out); @@ -3599,7 +3600,8 @@ int wc_ecc_shared_secret(ecc_key* private_key, ecc_key* public_key, byte* out, } -#if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_CRYPTOCELL) +#if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) && \ + !defined(WOLFSSL_CRYPTOCELL) static int wc_ecc_shared_secret_gen_sync(ecc_key* private_key, ecc_point* point, byte* out, word32* outlen, ecc_curve_spec* curve) @@ -3882,7 +3884,8 @@ int wc_ecc_shared_secret_ex(ecc_key* private_key, ecc_point* point, #endif /* HAVE_ECC_DHE */ -#if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_CRYPTOCELL) +#if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) && \ + !defined(WOLFSSL_CRYPTOCELL) /* return 1 if point is at infinity, 0 if not, < 0 on error */ int wc_ecc_point_is_at_infinity(ecc_point* p) { @@ -3963,7 +3966,7 @@ static int wc_ecc_make_pub_ex(ecc_key* key, ecc_curve_spec* curveIn, ecc_point* pubOut) { int err = MP_OKAY; -#ifndef WOLFSSL_ATECC508A +#if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) #ifndef WOLFSSL_SP_MATH ecc_point* base = NULL; #endif @@ -3975,7 +3978,7 @@ static int wc_ecc_make_pub_ex(ecc_key* key, ecc_curve_spec* curveIn, return BAD_FUNC_ARG; } -#ifndef WOLFSSL_ATECC508A +#if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) /* if ecc_point passed in then use it as output for public key point */ if (pubOut != NULL) { @@ -4126,12 +4129,14 @@ WOLFSSL_ABI int wc_ecc_make_key_ex(WC_RNG* rng, int keysize, ecc_key* key, int curve_id) { int err; -#if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_CRYPTOCELL) +#if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) && \ + !defined(WOLFSSL_CRYPTOCELL) #ifndef WOLFSSL_SP_MATH DECLARE_CURVE_SPECS(curve, ECC_CURVE_FIELD_COUNT); #endif #endif /* !WOLFSSL_ATECC508A */ -#if defined(WOLFSSL_CRYPTOCELL) && !defined(WOLFSSL_ATECC508A) +#if defined(WOLFSSL_CRYPTOCELL) && !defined(WOLFSSL_ATECC508A) && \ + !defined(WOLFSSL_ATECC608A) const CRYS_ECPKI_Domain_t* pDomain; CRYS_ECPKI_KG_TempData_t tempBuff; CRYS_ECPKI_KG_FipsContext_t fipsCtx; @@ -4178,7 +4183,7 @@ int wc_ecc_make_key_ex(WC_RNG* rng, int keysize, ecc_key* key, int curve_id) } #endif /* WOLFSSL_ASYNC_CRYPT && WC_ASYNC_ENABLE_ECC */ -#ifdef WOLFSSL_ATECC508A +#if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A) if (key->dp->id == ECC_SECP256R1) { key->type = ECC_PRIVATEKEY; key->slot = atmel_ecc_alloc(ATMEL_SLOT_ECDHE); @@ -4451,7 +4456,7 @@ int wc_ecc_init_ex(ecc_key* key, void* heap, int devId) (void)devId; #endif -#ifdef WOLFSSL_ATECC508A +#if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A) key->slot = ATECC_INVALID_SLOT; #else #ifdef ALT_ECC_SIZE @@ -4553,8 +4558,8 @@ static int wc_ecc_get_curve_order_bit_count(const ecc_set_type* dp) #ifndef NO_ASN -#if defined(WOLFSSL_ATECC508A) || defined(PLUTON_CRYPTO_ECC) || \ - defined(WOLFSSL_CRYPTOCELL) +#if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A) || \ + defined(PLUTON_CRYPTO_ECC) || defined(WOLFSSL_CRYPTOCELL) static int wc_ecc_sign_hash_hw(const byte* in, word32 inlen, mp_int* r, mp_int* s, byte* out, word32 *outlen, WC_RNG* rng, ecc_key* key) @@ -4564,26 +4569,24 @@ static int wc_ecc_sign_hash_hw(const byte* in, word32 inlen, if (key->devId != INVALID_DEVID) /* use hardware */ #endif { - #if defined(WOLFSSL_CRYPTOCELL) && !defined(WOLFSSL_ATECC508A) + #if defined(WOLFSSL_CRYPTOCELL) && !defined(WOLFSSL_ATECC508A) && \ + !defined(WOLFSSL_ATECC608A) CRYS_ECDSA_SignUserContext_t sigCtxTemp; word32 raw_sig_size = *outlen; word32 msgLenInBytes = inlen; CRYS_ECPKI_HASH_OpMode_t hash_mode; #endif word32 keysize = (word32)key->dp->size; + #ifdef PLUTON_CRYPTO_ECC word32 orderBits = wc_ecc_get_curve_order_bit_count(key->dp); + #endif /* Check args */ if (keysize > ECC_MAX_CRYPTO_HW_SIZE || *outlen < keysize*2) { return ECC_BAD_ARG_E; } - #if defined(WOLFSSL_ATECC508A) - key->slot = atmel_ecc_alloc(ATMEL_SLOT_DEVICE); - if (key->slot == ATECC_INVALID_SLOT) { - return ECC_BAD_ARG_E; - } - + #if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A) /* Sign: Result is 32-bytes of R then 32-bytes of S */ err = atmel_ecc_sign(key->slot, in, out); if (err != 0) { @@ -4799,7 +4802,8 @@ int wc_ecc_sign_hash(const byte* in, word32 inlen, byte* out, word32 *outlen, } /* hardware crypto */ -#if defined(WOLFSSL_ATECC508A) || defined(PLUTON_CRYPTO_ECC) || defined(WOLFSSL_CRYPTOCELL) +#if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A) || \ + defined(PLUTON_CRYPTO_ECC) || defined(WOLFSSL_CRYPTOCELL) err = wc_ecc_sign_hash_hw(in, inlen, r, s, out, outlen, rng, key); #else err = wc_ecc_sign_hash_ex(in, inlen, rng, key, r, s); @@ -4835,7 +4839,8 @@ int wc_ecc_sign_hash_ex(const byte* in, word32 inlen, WC_RNG* rng, { return stm32_ecc_sign_hash_ex(in, inlen, rng, key, r, s); } -#elif !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_CRYPTOCELL) +#elif !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) && \ + !defined(WOLFSSL_CRYPTOCELL) /** Sign a message digest in The message digest to sign @@ -5330,7 +5335,7 @@ int wc_ecc_free(ecc_key* key) wc_ecc_free_async(key); #endif -#ifdef WOLFSSL_ATECC508A +#if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A) atmel_ecc_free(key->slot); key->slot = ATECC_INVALID_SLOT; #endif /* WOLFSSL_ATECC508A */ @@ -5349,7 +5354,8 @@ int wc_ecc_free(ecc_key* key) return 0; } -#if !defined(WOLFSSL_SP_MATH) && !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_CRYPTOCELL) +#if !defined(WOLFSSL_SP_MATH) && !defined(WOLFSSL_ATECC508A) && \ + !defined(WOLFSSL_ATECC608A) && !defined(WOLFSSL_CRYPTOCELL) #ifdef ECC_SHAMIR /** Computes kA*A + kB*B = C using Shamir's Trick @@ -5842,7 +5848,7 @@ int wc_ecc_verify_hash_ex(mp_int *r, mp_int *s, const byte* hash, { int err; word32 keySz; -#ifdef WOLFSSL_ATECC508A +#if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A) byte sigRS[ATECC_KEY_SIZE*2]; #elif defined(WOLFSSL_CRYPTOCELL) byte sigRS[ECC_MAX_CRYPTO_HW_SIZE*2]; @@ -5902,7 +5908,7 @@ int wc_ecc_verify_hash_ex(mp_int *r, mp_int *s, const byte* hash, } #endif -#ifdef WOLFSSL_ATECC508A +#if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A) /* Extract R and S */ err = mp_to_unsigned_bin(r, &sigRS[0]); if (err != MP_OKAY) { @@ -6702,7 +6708,8 @@ int wc_ecc_export_x963_ex(ecc_key* key, byte* out, word32* outLen, #endif /* HAVE_ECC_KEY_EXPORT */ -#if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_CRYPTOCELL) +#if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) && \ + !defined(WOLFSSL_CRYPTOCELL) /* is ecc point on curve described by dp ? */ int wc_ecc_is_point(ecc_point* ecp, mp_int* a, mp_int* b, mp_int* prime) @@ -6910,14 +6917,14 @@ static int ecc_check_privkey_gen(ecc_key* key, mp_int* a, mp_int* prime) static int ecc_check_privkey_gen_helper(ecc_key* key) { int err; -#ifndef WOLFSSL_ATECC508A +#if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) DECLARE_CURVE_SPECS(curve, 2); #endif if (key == NULL) return BAD_FUNC_ARG; -#ifdef WOLFSSL_ATECC508A +#if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A) /* Hardware based private key, so this operation is not supported */ err = MP_OKAY; /* just report success */ @@ -7023,7 +7030,8 @@ int wc_ecc_check_key(ecc_key* key) { int err; #ifndef WOLFSSL_SP_MATH -#if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_CRYPTOCELL) +#if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) && \ + !defined(WOLFSSL_CRYPTOCELL) mp_int* b = NULL; #ifdef USE_ECC_B_PARAM DECLARE_CURVE_SPECS(curve, 4); @@ -7038,9 +7046,10 @@ int wc_ecc_check_key(ecc_key* key) if (key == NULL) return BAD_FUNC_ARG; -#if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_CRYPTOCELL) +#if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A) || \ + defined(WOLFSSL_CRYPTOCELL) - err = 0; /* consider key check success on ATECC508A */ + err = 0; /* consider key check success on ATECC508/608A */ #else #ifdef USE_ECC_B_PARAM @@ -7214,7 +7223,7 @@ int wc_ecc_import_x963_ex(const byte* in, word32 inLen, ecc_key* key, inLen -= 1; in += 1; -#ifdef WOLFSSL_ATECC508A +#if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A) /* For SECP256R1 only save raw public key for hardware */ if (curve_id == ECC_SECP256R1 && inLen <= sizeof(key->pubkey_raw)) { #ifdef HAVE_COMP_KEY @@ -7381,7 +7390,7 @@ int wc_ecc_export_ex(ecc_key* key, byte* qx, word32* qxLen, (key->type != ECC_PRIVATEKEY && key->type != ECC_PRIVATEKEY_ONLY)) return BAD_FUNC_ARG; - #ifdef WOLFSSL_ATECC508A + #if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A) /* Hardware cannot export private portion */ return NOT_COMPILED_IN; #else @@ -7459,7 +7468,8 @@ int wc_ecc_import_private_key_ex(const byte* priv, word32 privSz, int curve_id) { int ret; -#if defined(WOLFSSL_CRYPTOCELL) && !defined(WOLFSSL_ATECC508A) +#if defined(WOLFSSL_CRYPTOCELL) && !defined(WOLFSSL_ATECC508A) && \ + !defined(WOLFSSL_ATECC608A) const CRYS_ECPKI_Domain_t* pDomain; CRYS_ECPKI_BUILD_TempData_t tempBuff; #endif @@ -7490,7 +7500,7 @@ int wc_ecc_import_private_key_ex(const byte* priv, word32 privSz, if (ret != 0) return ret; -#ifdef WOLFSSL_ATECC508A +#if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A) /* Hardware does not support loading private keys */ return NOT_COMPILED_IN; #elif defined(WOLFSSL_CRYPTOCELL) @@ -7776,7 +7786,8 @@ static int wc_ecc_import_raw_private(ecc_key* key, const char* qx, const char* qy, const char* d, int curve_id, int encType) { int err = MP_OKAY; -#if defined(WOLFSSL_CRYPTOCELL) && !defined(WOLFSSL_ATECC508A) +#if defined(WOLFSSL_CRYPTOCELL) && !defined(WOLFSSL_ATECC508A) && \ + !defined(WOLFSSL_ATECC608A) const CRYS_ECPKI_Domain_t* pDomain; CRYS_ECPKI_BUILD_TempData_t tempBuff; byte key_raw[ECC_MAX_CRYPTO_HW_SIZE*2 + 1]; @@ -7834,7 +7845,7 @@ static int wc_ecc_import_raw_private(ecc_key* key, const char* qx, if (err == MP_OKAY) err = mp_set(key->pubkey.z, 1); -#ifdef WOLFSSL_ATECC508A +#if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A) /* For SECP256R1 only save raw public key for hardware */ if (err == MP_OKAY && curve_id == ECC_SECP256R1) { word32 keySz = key->dp->size; @@ -7877,7 +7888,7 @@ static int wc_ecc_import_raw_private(ecc_key* key, const char* qx, /* import private key */ if (err == MP_OKAY) { if (d != NULL && d[0] != '\0') { - #ifdef WOLFSSL_ATECC508A + #if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A) /* Hardware doesn't support loading private key */ err = NOT_COMPILED_IN; @@ -10255,7 +10266,8 @@ int wc_ecc_decrypt(ecc_key* privKey, ecc_key* pubKey, const byte* msg, #ifdef HAVE_COMP_KEY -#if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_CRYPTOCELL) +#if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) && \ + !defined(WOLFSSL_CRYPTOCELL) #ifndef WOLFSSL_SP_MATH int do_mp_jacobi(mp_int* a, mp_int* n, int* c); diff --git a/wolfcrypt/src/port/atmel/README.md b/wolfcrypt/src/port/atmel/README.md index 50352fcd2..e9a76d32d 100644 --- a/wolfcrypt/src/port/atmel/README.md +++ b/wolfcrypt/src/port/atmel/README.md @@ -1,13 +1,12 @@ # Microchip/Atmel ATECC508A/ATECC608A Support -Support for ATECC508A using these methods: -* TLS: Using the PK callbacks and reference ATECC508A callbacks. See Coding section below. Requires options `HAVE_PK_CALLBACKS` and `WOLFSSL_ATECC_PKCB or WOLFSSL_ATECC508A` -* wolfCrypt: Native wc_ecc_* API's using the `./configure CFLAGS="-DWOLFSSL_ATECC508A"` or `#define WOLFSSL_ATECC508A`. +wolfSSL includes support for ATECC508A and ATECC608A using these methods: +* TLS: Using the PK callbacks and reference ATECC508/608A callbacks. See Coding section below. Requires options `HAVE_PK_CALLBACKS` and `WOLFSSL_ATECC_PKCB or WOLFSSL_ATECC508A/WOLFSSL_ATECC608A` +* wolfCrypt: Native wc_ecc_* API's using the `./configure CFLAGS="-DWOLFSSL_ATECC608A"`, `#define WOLFSSL_ATECC508A`, or `#define WOLFSSL_ATECC608A`. ## Dependency -Requires the Microchip CryptoAuthLib. The examples in `wolfcrypt/src/port/atmel/atmel.c` make calls to the `atcatls_*` API's. - +Requires the Microchip CryptoAuthLib library. The examples in `wolfcrypt/src/port/atmel/atmel.c` make calls to the `atcatls_*` API's. ## Building @@ -15,7 +14,14 @@ Requires the Microchip CryptoAuthLib. The examples in `wolfcrypt/src/port/atmel/ * `HAVE_PK_CALLBACKS`: Option for enabling wolfSSL's PK callback support for TLS. * `WOLFSSL_ATECC508A`: Enables support for initializing the CryptoAuthLib and setting up the encryption key used for the I2C communication. +* `WOLFSSL_ATECC608A`: Same as above, but for the ATECC608A module. * `WOLFSSL_ATECC_PKCB`: Enables support for the reference PK callbacks without init. +* `WOLFSSL_ATECC_RNG`: Enables support for ATECC RNG. +* `WOLFSSL_ATECC_SHA256`: Enables support for ATECC SHA-256. +* `WOLFSSL_ATECC_ECDH_ENC`: Enable use of atcab_ecdh_enc() for encrypted ECDH. +* `WOLFSSL_ATECC_ECDH_IOENC`: Enable use of atcab_ecdh_ioenc() for encrypted ECDH. +* `WOLFSSL_ATECC_TNGTLS`: Enable support for Microchip Trust&GO module configuration. +* `WOLFSSL_ATECC_DEBUG`: Enable wolfSSL ATECC debug messages. * `WOLFSSL_ATMEL`: Enables ASF hooks seeding random data using the `atmel_get_random_number` function. * `WOLFSSL_ATMEL_TIME`: Enables the built-in `atmel_get_curr_time_and_date` function get getting time from ASF RTC. * `ATECC_GET_ENC_KEY`: Macro to define your own function for getting the encryption key. @@ -30,16 +36,15 @@ Requires the Microchip CryptoAuthLib. The examples in `wolfcrypt/src/port/atmel/ or -`./configure CFLAGS="-DWOLFSSL_ATECC508A"` -`#define WOLFSSL_ATECC508A` - +`./configure CFLAGS="-DWOLFSSL_ATECC608A"` +`#define WOLFSSL_ATECC608A` ## Coding Setup the PK callbacks for TLS using: ``` -/* Setup PK Callbacks for ATECC508A */ +/* Setup PK Callbacks for ATECC508/608A */ WOLFSSL_CTX* ctx; wolfSSL_CTX_SetEccKeyGenCb(ctx, atcatls_create_key_cb); wolfSSL_CTX_SetEccVerifyCb(ctx, atcatls_verify_signature_cb); @@ -47,7 +52,7 @@ wolfSSL_CTX_SetEccSignCb(ctx, atcatls_sign_certificate_cb); wolfSSL_CTX_SetEccSharedSecretCb(ctx, atcatls_create_pms_cb); ``` -The reference ATECC508A PK callback functions are located in the `wolfcrypt/src/port/atmel/atmel.c` file. +The reference ATECC508/608A PK callback functions are located in the `wolfcrypt/src/port/atmel/atmel.c` file. Adding a custom context to the callbacks: @@ -91,4 +96,4 @@ ATECC508A HW accelerated implementation: `EC-DSA verify time 208.400 milliseconds, avg over 5 iterations, 24.038 ops/sec` -For details see our [wolfSSL Atmel ATECC508A](https://wolfssl.com/wolfSSL/wolfssl-atmel.html) page. +For details see our [wolfSSL Atmel ATECC508/608A](https://wolfssl.com/wolfSSL/wolfssl-atmel.html) page. diff --git a/wolfcrypt/src/port/atmel/atmel.c b/wolfcrypt/src/port/atmel/atmel.c index 04d2aeb3d..27da811a1 100644 --- a/wolfcrypt/src/port/atmel/atmel.c +++ b/wolfcrypt/src/port/atmel/atmel.c @@ -25,7 +25,8 @@ #include -#if defined(WOLFSSL_ATMEL) || defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC_PKCB) +#if defined(WOLFSSL_ATMEL) || defined(WOLFSSL_ATECC508A) || \ + defined(WOLFSSL_ATECC608A) || defined(WOLFSSL_ATECC_PKCB) #include #include @@ -50,7 +51,7 @@ #include -#ifdef WOLFSSL_ATECC508A +#if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A) #ifdef WOLFSSL_ATECC508A_TLS extern ATCA_STATUS device_init_default(void); @@ -68,14 +69,23 @@ static wolfSSL_Mutex mSlotMutex; /* Raspberry Pi uses /dev/i2c-1 */ #ifndef ATECC_I2C_ADDR -#define ATECC_I2C_ADDR 0xC0 + #ifdef WOLFSSL_ATECC_TNGTLS + #define ATECC_I2C_ADDR 0x6A + #else + #define ATECC_I2C_ADDR 0xC0 + #endif #endif #ifndef ATECC_I2C_BUS #define ATECC_I2C_BUS 1 #endif #ifndef ATECC_DEV_TYPE -#define ATECC_DEV_TYPE ATECC508A + #ifdef WOLFSSL_ATECC508A + #define ATECC_DEV_TYPE ATECC508A + #else + #define ATECC_DEV_TYPE ATECC608A + #endif #endif +static int ateccx08a_cfg_initialized = 0; static ATCAIfaceCfg cfg_ateccx08a_i2c_pi; #endif /* WOLFSSL_ATECC508A */ @@ -86,7 +96,7 @@ static ATCAIfaceCfg cfg_ateccx08a_i2c_pi; int atmel_get_random_number(uint32_t count, uint8_t* rand_out) { int ret = 0; -#ifdef WOLFSSL_ATECC508A +#if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A) uint8_t i = 0; uint32_t copy_count = 0; uint8_t rng_buffer[RANDOM_NUM_SIZE]; @@ -161,7 +171,33 @@ long atmel_get_curr_time_and_date(long* tm) #endif -#ifdef WOLFSSL_ATECC508A +#if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A) + +/* Set the ATECC configuration for wolfSSL to use. + * + * Return 0 on success, negative upon error */ +int wolfCrypt_ATECC_SetConfig(ATCAIfaceCfg* cfg) +{ + WOLFSSL_MSG("Setting ATECC ATCAIfaceCfg configuration"); + if (cfg == NULL) { + return -1; + } + + /* copy configuration into our local struct */ + XMEMSET(&cfg_ateccx08a_i2c_pi, 0, sizeof(cfg_ateccx08a_i2c_pi)); + cfg_ateccx08a_i2c_pi.iface_type = cfg->iface_type; + cfg_ateccx08a_i2c_pi.devtype = cfg->devtype; + cfg_ateccx08a_i2c_pi.atcai2c.slave_address = cfg->atcai2c.slave_address; + cfg_ateccx08a_i2c_pi.atcai2c.bus = cfg->atcai2c.bus; + cfg_ateccx08a_i2c_pi.atcai2c.baud = cfg->atcai2c.baud; + cfg_ateccx08a_i2c_pi.wake_delay = cfg->wake_delay; + cfg_ateccx08a_i2c_pi.rx_retries = cfg->rx_retries; + cfg_ateccx08a_i2c_pi.cfg_data = cfg->cfg_data; + + ateccx08a_cfg_initialized = 1; + + return 0; +} int atmel_ecc_translate_err(int status) { @@ -173,7 +209,7 @@ int atmel_ecc_translate_err(int status) case ATCA_ALLOC_FAILURE: return MEMORY_E; default: - #ifdef WOLFSSL_ATECC508A_DEBUG + #ifdef WOLFSSL_ATECC_DEBUG printf("ATECC Failure: %x\n", (word32)status); #endif break; @@ -223,7 +259,12 @@ int atmel_ecc_alloc(int slotType) break; case ATMEL_SLOT_ECDHE_ENC: slotId = ATECC_SLOT_ENC_PARENT; + #ifdef WOLFSSL_ATECC_TNGTLS + /* not reserved in mSlotList, so return */ + goto exit; + #else break; + #endif case ATMEL_SLOT_ANY: for (i=0; i < ATECC_MAX_SLOT; i++) { /* Find free slotId */ @@ -263,7 +304,11 @@ void atmel_ecc_free(int slotId) mSlotDealloc(slotId); } else if (slotId >= 0 && slotId < ATECC_MAX_SLOT) { - if (slotId != ATECC_SLOT_AUTH_PRIV && slotId != ATECC_SLOT_I2C_ENC) { + if (slotId != ATECC_SLOT_AUTH_PRIV && slotId != ATECC_SLOT_I2C_ENC +#ifdef WOLFSSL_ATECC_TNGTLS + && slotId != ATMEL_SLOT_ECDHE_ENC +#endif + ) { /* Mark slotId free */ mSlotList[slotId] = ATECC_INVALID_SLOT; } @@ -298,6 +343,7 @@ static int atmel_init_enc_key(void) uint8_t writeBlock = 0; uint8_t writeOffset = 0; int slotId; + bool isLocked = false; slotId = atmel_ecc_alloc(ATMEL_SLOT_ENCKEY); @@ -305,6 +351,15 @@ static int atmel_init_enc_key(void) if (slotId == ATECC_INVALID_SLOT) return BAD_FUNC_ARG; + /* skip if slot has already been locked */ + ret = atcab_is_slot_locked(slotId, &isLocked); + if (ret != ATCA_SUCCESS) { + return atmel_ecc_translate_err(ret); + + } else if (isLocked) { + return 0; + } + /* get encryption key */ ATECC_GET_ENC_KEY(read_key, sizeof(read_key)); @@ -326,7 +381,7 @@ int atmel_get_rev_info(word32* revision) void atmel_show_rev_info(void) { -#ifdef WOLFSSL_ATECC508A_DEBUG +#ifdef WOLFSSL_ATECC_DEBUG word32 revision = 0; atmel_get_rev_info(&revision); printf("ATECC508A Revision: %x\n", (word32)revision); @@ -337,21 +392,33 @@ int atmel_ecc_create_pms(int slotId, const uint8_t* peerKey, uint8_t* pms) { int ret; uint8_t read_key[ATECC_KEY_SIZE]; +#ifdef WOLFSSL_ATECC_ECDH_ENC int slotIdEnc; slotIdEnc = atmel_ecc_alloc(ATMEL_SLOT_ECDHE_ENC); if (slotIdEnc == ATECC_INVALID_SLOT) return BAD_FUNC_ARG; +#endif /* get encryption key */ ATECC_GET_ENC_KEY(read_key, sizeof(read_key)); +#ifdef WOLFSSL_ATECC_ECDH_ENC /* send the encrypted version of the ECDH command */ ret = atcab_ecdh_enc(slotId, peerKey, pms, read_key, slotIdEnc); - ret = atmel_ecc_translate_err(ret); +#elif defined(WOLFSSL_ATECC_ECDH_IOENC) + /* encrypted ECDH command, using I/O protection key */ + ret = atcab_ecdh_ioenc(slotId, peerKey, pms, read_key); +#else + ret = atcab_ecdh(slotId, peerKey, pms); +#endif + ret = atmel_ecc_translate_err(ret); + ForceZero(read_key, sizeof(read_key)); +#ifdef WOLFSSL_ATECC_ECDH_ENC /* free the ECDHE slot */ atmel_ecc_free(slotIdEnc); +#endif return ret; } @@ -398,7 +465,7 @@ int atmel_init(void) { int ret = 0; -#ifdef WOLFSSL_ATECC508A +#if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A) if (!mAtcaInitDone) { ATCA_STATUS status; int i; @@ -409,7 +476,11 @@ int atmel_init(void) /* Init the free slotId list */ for (i=0; i + + int wc_GenerateSeed(OS_Seed* os, byte* output, word32 sz) + { + int ret = 0; + + (void)os; + if (output == NULL) { + return BUFFER_E; + } + + ret = atmel_get_random_number(sz, output); + + return ret; + } #elif defined(MICROCHIP_PIC32) @@ -2116,23 +2134,6 @@ int wc_GenerateSeed(OS_Seed* os, byte* output, word32 sz) return 0; } -#elif defined(WOLFSSL_ATMEL) - #include - - int wc_GenerateSeed(OS_Seed* os, byte* output, word32 sz) - { - int ret = 0; - - (void)os; - if (output == NULL) { - return BUFFER_E; - } - - ret = atmel_get_random_number(sz, output); - - return ret; - } - #elif defined(INTIME_RTOS) int wc_GenerateSeed(OS_Seed* os, byte* output, word32 sz) { diff --git a/wolfcrypt/src/wc_port.c b/wolfcrypt/src/wc_port.c index bb847fe94..cc2572953 100644 --- a/wolfcrypt/src/wc_port.c +++ b/wolfcrypt/src/wc_port.c @@ -46,7 +46,8 @@ #include #endif -#if defined(WOLFSSL_ATMEL) || defined(WOLFSSL_ATECC508A) +#if defined(WOLFSSL_ATMEL) || defined(WOLFSSL_ATECC508A) || \ + defined(WOLFSSL_ATECC608A) #include #endif #if defined(WOLFSSL_RENESAS_TSIP) @@ -180,7 +181,8 @@ int wolfCrypt_Init(void) } #endif - #if defined(WOLFSSL_ATMEL) || defined(WOLFSSL_ATECC508A) + #if defined(WOLFSSL_ATMEL) || defined(WOLFSSL_ATECC508A) || \ + defined(WOLFSSL_ATECC608A) ret = atmel_init(); if (ret != 0) { WOLFSSL_MSG("CryptoAuthLib init failed"); diff --git a/wolfcrypt/test/test.c b/wolfcrypt/test/test.c index 25d0cf24c..420a269f5 100644 --- a/wolfcrypt/test/test.c +++ b/wolfcrypt/test/test.c @@ -343,7 +343,9 @@ int scrypt_test(void); #ifdef HAVE_ECC_ENCRYPT int ecc_encrypt_test(void); #endif - #ifdef USE_CERT_BUFFERS_256 + #if defined(USE_CERT_BUFFERS_256) && !defined(WOLFSSL_ATECC508A) && \ + !defined(WOLFSSL_ATECC608A) + /* skip for ATECC508/608A, cannot import private key buffers */ int ecc_test_buffers(void); #endif #endif @@ -1013,7 +1015,9 @@ initDefaultName(); else test_pass("ECC Enc test passed!\n"); #endif - #ifdef USE_CERT_BUFFERS_256 + #if defined(USE_CERT_BUFFERS_256) && !defined(WOLFSSL_ATECC508A) && \ + !defined(WOLFSSL_ATECC608A) + /* skip for ATECC508/608A, cannot import private key buffers */ if ( (ret = ecc_test_buffers()) != 0) return err_sys("ECC buffer test failed!\n", ret); else @@ -18535,7 +18539,8 @@ done: static int ecc_test_curve_size(WC_RNG* rng, int keySize, int testVerifyCount, int curve_id, const ecc_set_type* dp) { -#if defined(HAVE_ECC_DHE) || defined(HAVE_ECC_CDH) +#if (defined(HAVE_ECC_DHE) || defined(HAVE_ECC_CDH)) && \ + !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) DECLARE_VAR(sharedA, byte, ECC_SHARED_SIZE, HEAP_HINT); DECLARE_VAR(sharedB, byte, ECC_SHARED_SIZE, HEAP_HINT); #endif @@ -18543,7 +18548,8 @@ static int ecc_test_curve_size(WC_RNG* rng, int keySize, int testVerifyCount, byte exportBuf[MAX_ECC_BYTES * 2 + 32]; #endif word32 x = 0; -#if defined(HAVE_ECC_DHE) || defined(HAVE_ECC_CDH) +#if (defined(HAVE_ECC_DHE) || defined(HAVE_ECC_CDH)) && \ + !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) word32 y; #endif #ifdef HAVE_ECC_SIGN @@ -18608,6 +18614,9 @@ static int ecc_test_curve_size(WC_RNG* rng, int keySize, int testVerifyCount, goto done; TEST_SLEEP(); +/* ATECC508/608 configuration may not support more than one ECDH key */ +#if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) + ret = wc_ecc_make_key_ex(rng, keySize, &userB, curve_id); #if defined(WOLFSSL_ASYNC_CRYPT) ret = wc_AsyncWait(ret, &userB.asyncDev, WC_ASYNC_FLAG_NONE); @@ -18695,6 +18704,7 @@ static int ecc_test_curve_size(WC_RNG* rng, int keySize, int testVerifyCount, wc_ecc_set_flags(&userA, 0); wc_ecc_set_flags(&userB, 0); #endif /* HAVE_ECC_CDH */ +#endif /* WOLFSSL_ATECC508A */ #ifdef HAVE_ECC_KEY_EXPORT x = sizeof(exportBuf); @@ -18713,6 +18723,7 @@ static int ecc_test_curve_size(WC_RNG* rng, int keySize, int testVerifyCount, if (ret != 0) goto done; +#if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) #ifdef HAVE_ECC_DHE y = ECC_SHARED_SIZE; do { @@ -18768,6 +18779,7 @@ static int ecc_test_curve_size(WC_RNG* rng, int keySize, int testVerifyCount, TEST_SLEEP(); #endif /* HAVE_ECC_DHE */ #endif /* HAVE_COMP_KEY */ +#endif /* WOLFSSL_ATECC508A */ #endif /* HAVE_ECC_KEY_IMPORT */ #endif /* HAVE_ECC_KEY_EXPORT */ @@ -18852,7 +18864,8 @@ static int ecc_test_curve_size(WC_RNG* rng, int keySize, int testVerifyCount, #endif /* HAVE_ECC_VERIFY */ #endif /* HAVE_ECC_SIGN */ -#ifdef HAVE_ECC_KEY_EXPORT +#if defined(HAVE_ECC_KEY_EXPORT) && !defined(WOLFSSL_ATECC508) && \ + !defined(WOLFSSL_ATECC608A) x = sizeof(exportBuf); ret = wc_ecc_export_private_only(&userA, exportBuf, &x); if (ret != 0) @@ -18931,8 +18944,8 @@ static int ecc_test_curve(WC_RNG* rng, int keySize) } #if !defined(NO_ECC256) || defined(HAVE_ALL_CURVES) -#if !defined(WOLFSSL_ATECC508A) && defined(HAVE_ECC_KEY_IMPORT) && \ - defined(HAVE_ECC_KEY_EXPORT) +#if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) && \ + defined(HAVE_ECC_KEY_IMPORT) && defined(HAVE_ECC_KEY_EXPORT) static int ecc_point_test(void) { int ret; @@ -19225,7 +19238,8 @@ static int ecc_sig_test(WC_RNG* rng, ecc_key* key) } #endif -#if defined(HAVE_ECC_KEY_IMPORT) && defined(HAVE_ECC_KEY_EXPORT) +#if defined(HAVE_ECC_KEY_IMPORT) && defined(HAVE_ECC_KEY_EXPORT) && \ + !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) static int ecc_exp_imp_test(ecc_key* key) { int ret; @@ -19336,7 +19350,8 @@ done: } #endif /* HAVE_ECC_KEY_IMPORT && HAVE_ECC_KEY_EXPORT */ -#if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_CRYPTOCELL) +#if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) && \ + !defined(WOLFSSL_CRYPTOCELL) #if defined(HAVE_ECC_KEY_IMPORT) && !defined(WOLFSSL_VALIDATE_ECC_IMPORT) static int ecc_mulmod_test(ecc_key* key1) { @@ -19450,12 +19465,14 @@ static int ecc_def_curve_test(WC_RNG *rng) if (ret < 0) goto done; #endif -#if defined(HAVE_ECC_KEY_IMPORT) && defined(HAVE_ECC_KEY_EXPORT) +#if defined(HAVE_ECC_KEY_IMPORT) && defined(HAVE_ECC_KEY_EXPORT) && \ + !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) ret = ecc_exp_imp_test(&key); if (ret < 0) goto done; #endif -#if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_CRYPTOCELL) +#if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) && \ + !defined(WOLFSSL_CRYPTOCELL) #if defined(HAVE_ECC_KEY_IMPORT) && !defined(WOLFSSL_VALIDATE_ECC_IMPORT) ret = ecc_mulmod_test(&key); if (ret < 0) @@ -20024,8 +20041,8 @@ int ecc_test(void) if (ret < 0) { goto done; } -#if !defined(WOLFSSL_ATECC508A) && defined(HAVE_ECC_KEY_IMPORT) && \ - defined(HAVE_ECC_KEY_EXPORT) +#if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) && \ + defined(HAVE_ECC_KEY_IMPORT) && defined(HAVE_ECC_KEY_EXPORT) ret = ecc_point_test(); if (ret < 0) { goto done; @@ -20082,13 +20099,14 @@ int ecc_test(void) goto done; } #endif -#if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_STM32_PKA) +#if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) && \ + !defined(WOLFSSL_STM32_PKA) ret = ecc_test_make_pub(&rng); if (ret != 0) { printf("ecc_test_make_pub failed!: %d\n", ret); goto done; } -#else +#elif defined(HAVE_ECC_KEY_IMPORT) (void) ecc_test_make_pub;/* for compiler warning */ #endif #ifdef WOLFSSL_CERT_GEN @@ -20275,7 +20293,8 @@ done: #endif /* HAVE_ECC_ENCRYPT */ -#ifdef USE_CERT_BUFFERS_256 +#if defined(USE_CERT_BUFFERS_256) && !defined(WOLFSSL_ATECC508A) && \ + !defined(WOLFSSL_ATECC608A) int ecc_test_buffers(void) { size_t bytes; ecc_key cliKey; diff --git a/wolfssl/wolfcrypt/ecc.h b/wolfssl/wolfcrypt/ecc.h index f67a3930b..4d9eb2c01 100644 --- a/wolfssl/wolfcrypt/ecc.h +++ b/wolfssl/wolfcrypt/ecc.h @@ -50,7 +50,7 @@ #endif #endif -#ifdef WOLFSSL_ATECC508A +#if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A) #include #endif /* WOLFSSL_ATECC508A */ @@ -127,7 +127,7 @@ enum { ECC_MAX_SIG_SIZE= ((MAX_ECC_BYTES * 2) + ECC_MAX_PAD_SZ + SIG_HEADER_SZ), /* max crypto hardware size */ -#ifdef WOLFSSL_ATECC508A +#if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A) ECC_MAX_CRYPTO_HW_SIZE = ATECC_KEY_SIZE, /* from port/atmel/atmel.h */ ECC_MAX_CRYPTO_HW_PUBKEY_SIZE = (ATECC_KEY_SIZE*2), #elif defined(PLUTON_CRYPTO_ECC) @@ -369,7 +369,7 @@ struct ecc_key { void* heap; /* heap hint */ ecc_point pubkey; /* public key */ mp_int k; /* private key */ -#ifdef WOLFSSL_ATECC508A +#if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A) int slot; /* Key Slot Number (-1 unknown) */ byte pubkey_raw[ECC_MAX_CRYPTO_HW_PUBKEY_SIZE]; #endif @@ -427,7 +427,7 @@ extern const size_t ecc_sets_count; WOLFSSL_API const char* wc_ecc_get_name(int curve_id); -#ifndef WOLFSSL_ATECC508A +#if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) #ifdef WOLFSSL_PUBLIC_ECC_ADD_DBL #define ECC_API WOLFSSL_API @@ -472,7 +472,8 @@ WOLFSSL_API int wc_ecc_shared_secret_ex(ecc_key* private_key, ecc_point* point, byte* out, word32 *outlen); -#if defined(WOLFSSL_ATECC508A) || defined(PLUTON_CRYPTO_ECC) || defined(WOLFSSL_CRYPTOCELL) +#if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A) || \ + defined(PLUTON_CRYPTO_ECC) || defined(WOLFSSL_CRYPTOCELL) #define wc_ecc_shared_secret_ssh wc_ecc_shared_secret #else #define wc_ecc_shared_secret_ssh wc_ecc_shared_secret_ex /* For backwards compat */ @@ -571,7 +572,7 @@ int wc_ecc_cmp_point(ecc_point* a, ecc_point *b); WOLFSSL_API int wc_ecc_point_is_at_infinity(ecc_point *p); -#ifndef WOLFSSL_ATECC508A +#if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) WOLFSSL_API int wc_ecc_mulmod(mp_int* k, ecc_point *G, ecc_point *R, mp_int* a, mp_int* modulus, int map); diff --git a/wolfssl/wolfcrypt/port/atmel/atmel.h b/wolfssl/wolfcrypt/port/atmel/atmel.h index 70035130c..9b891f025 100644 --- a/wolfssl/wolfcrypt/port/atmel/atmel.h +++ b/wolfssl/wolfcrypt/port/atmel/atmel.h @@ -27,14 +27,15 @@ #include #include -#if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC_PKCB) +#if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A) || \ + defined(WOLFSSL_ATECC_PKCB) #undef SHA_BLOCK_SIZE #define SHA_BLOCK_SIZE SHA_BLOCK_SIZE_REMAP #include #undef SHA_BLOCK_SIZE #endif -/* ATECC508A only supports ECC P-256 */ +/* ATECC508A/608A only supports ECC P-256 */ #define ATECC_KEY_SIZE (32) #define ATECC_PUBKEY_SIZE (ATECC_KEY_SIZE*2) /* X and Y */ #define ATECC_SIG_SIZE (ATECC_KEY_SIZE*2) /* R and S */ @@ -53,11 +54,19 @@ #endif /* Symmetric encryption key */ #ifndef ATECC_SLOT_I2C_ENC -#define ATECC_SLOT_I2C_ENC (0x04) + #ifdef WOLFSSL_ATECC_TNGTLS + #define ATECC_SLOT_I2C_ENC (0x06) + #else + #define ATECC_SLOT_I2C_ENC (0x04) + #endif #endif /* Parent encryption key */ #ifndef ATECC_SLOT_ENC_PARENT -#define ATECC_SLOT_ENC_PARENT (0x7) + #ifdef WOLFSSL_ATECC_TNGTLS + #define ATECC_SLOT_ENC_PARENT (0x6) + #else + #define ATECC_SLOT_ENC_PARENT (0x7) + #endif #endif /* ATECC_KEY_SIZE required for ecc.h */ @@ -78,7 +87,7 @@ int atmel_get_random_number(uint32_t count, uint8_t* rand_out); #endif long atmel_get_curr_time_and_date(long* tm); -#ifdef WOLFSSL_ATECC508A +#if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A) enum atmelSlotType { ATMEL_SLOT_ANY, @@ -100,6 +109,8 @@ int atmel_ecc_translate_err(int status); int atmel_get_rev_info(word32* revision); void atmel_show_rev_info(void); +WOLFSSL_API int wolfCrypt_ATECC_SetConfig(ATCAIfaceCfg* cfg); + /* The macro ATECC_GET_ENC_KEY can be set to override the default encryption key with your own at build-time */ #ifndef ATECC_GET_ENC_KEY diff --git a/wolfssl/wolfcrypt/settings.h b/wolfssl/wolfcrypt/settings.h index 917027971..32bf31eb3 100644 --- a/wolfssl/wolfcrypt/settings.h +++ b/wolfssl/wolfcrypt/settings.h @@ -383,6 +383,14 @@ #endif #endif +#ifdef WOLFSSL_ATECC508A + /* backwards compatibility */ + #define WOLFSSL_ATECC_ECDH_ENC + #ifdef WOLFSSL_ATECC508A_DEBUG + #define WOLFSSL_ATECC_DEBUG + #endif +#endif + #ifdef MBED #define WOLFSSL_USER_IO #define NO_FILESYSTEM From 8dee048b04ab3a52075d96a387d69d748f16c990 Mon Sep 17 00:00:00 2001 From: Sean Parkinson Date: Thu, 28 May 2020 08:50:21 +1000 Subject: [PATCH 133/298] Define to allow badly formed ASN integers Define: WOLFSSL_ASN_INT_LEAD_0_ANY Allows positive integers to have a leading 0 byte. DER/BER encoding specifies that leding 0 only on negative numbers (highest bit of first octet set). --- wolfcrypt/src/asn.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/wolfcrypt/src/asn.c b/wolfcrypt/src/asn.c index 226278441..67f25bff1 100644 --- a/wolfcrypt/src/asn.c +++ b/wolfcrypt/src/asn.c @@ -460,8 +460,10 @@ static int GetASNInt(const byte* input, word32* inOutIdx, int* len, (*inOutIdx)++; (*len)--; +#ifndef WOLFSSL_ASN_INT_LEAD_0_ANY if (*len > 0 && (input[*inOutIdx] & 0x80) == 0) return ASN_PARSE_E; +#endif } } From 3fec01c0aa4364df76e922cdb3f4d2a3cd09d266 Mon Sep 17 00:00:00 2001 From: Sean Parkinson Date: Thu, 21 May 2020 08:38:42 +1000 Subject: [PATCH 134/298] Actually make TLS 1.3 alerts encrypted when possible Pervious fix didn't work. This time, if TLS 1.3 and encryption is on then it will encrypt the alert. --- src/internal.c | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/src/internal.c b/src/internal.c index f837a4cd2..c89a02843 100644 --- a/src/internal.c +++ b/src/internal.c @@ -212,14 +212,7 @@ static WC_INLINE int IsEncryptionOn(WOLFSSL* ssl, int isSend) return 0; #endif /* WOLFSSL_DTLS */ -#ifdef WOLFSSL_TLS13 - if (isSend) - return ssl->encrypt.setup; - else - return ssl->decrypt.setup; -#else return ssl->keys.encryptionOn; -#endif } @@ -17519,10 +17512,11 @@ int SendAlert(WOLFSSL* ssl, int severity, int type) ssl->options.isClosed = 1; /* Don't send close_notify */ } - /* only send encrypted alert if handshake actually complete, otherwise - other side may not be able to handle it */ - if (IsEncryptionOn(ssl, 1) && (IsAtLeastTLSv1_3(ssl->version) || - ssl->encrypt.setup)) { + /* send encrypted alert if encryption is on - can be a rehandshake over + * an existing encrypted channel. + * TLS 1.3 encrypts handshake packets after the ServerHello + */ + if (IsEncryptionOn(ssl, 1)) { sendSz = BuildMessage(ssl, output, outputSz, input, ALERT_SIZE, alert, 0, 0, 0); } From 91fb6216a9f550f5a1ddf65d65c5ae3fb4bc07bd Mon Sep 17 00:00:00 2001 From: Eric Blankenhorn Date: Thu, 28 May 2020 09:39:44 -0500 Subject: [PATCH 135/298] Fix OOB access --- wolfcrypt/src/asn.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/wolfcrypt/src/asn.c b/wolfcrypt/src/asn.c index 226278441..598d3074c 100644 --- a/wolfcrypt/src/asn.c +++ b/wolfcrypt/src/asn.c @@ -17416,7 +17416,7 @@ static int ParseCRL_Extensions(DecodedCRL* dcrl, const byte* buf, } -/* prase crl buffer into decoded state, 0 on success */ +/* parse crl buffer into decoded state, 0 on success */ int ParseCRL(DecodedCRL* dcrl, const byte* buff, word32 sz, void* cm) { int len; @@ -17444,10 +17444,10 @@ int ParseCRL(DecodedCRL* dcrl, const byte* buff, word32 sz, void* cm) return ASN_PARSE_E; dcrl->sigIndex = len + idx; - if (ParseCRL_CertList(dcrl, buff, &idx, idx + len) < 0) + if (ParseCRL_CertList(dcrl, buff, &idx, sz) < 0) return ASN_PARSE_E; - if (ParseCRL_Extensions(dcrl, buff, &idx, idx + len) < 0) + if (ParseCRL_Extensions(dcrl, buff, &idx, sz) < 0) return ASN_PARSE_E; idx = dcrl->sigIndex; From 4e8f5fce66e43250621981e2ac8385045d734a03 Mon Sep 17 00:00:00 2001 From: Eric Blankenhorn Date: Thu, 28 May 2020 12:17:29 -0500 Subject: [PATCH 136/298] Fix NULL dereference error --- src/tls.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tls.c b/src/tls.c index d6b8815d2..61643f0c7 100644 --- a/src/tls.c +++ b/src/tls.c @@ -4852,7 +4852,7 @@ static int TLSX_SecureRenegotiation_Parse(WOLFSSL* ssl, byte* input, } #endif } - else { + else if (ssl->secure_renegotiation != NULL) { #ifndef NO_WOLFSSL_CLIENT if (!ssl->secure_renegotiation->enabled) { if (*input == 0) { From 233a5ca6b82a1c6714fd676198775015637478b7 Mon Sep 17 00:00:00 2001 From: Eric Blankenhorn Date: Thu, 28 May 2020 14:14:19 -0500 Subject: [PATCH 137/298] Fix OOB access --- wolfcrypt/src/rsa.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wolfcrypt/src/rsa.c b/wolfcrypt/src/rsa.c index 98251eddc..b36678325 100644 --- a/wolfcrypt/src/rsa.c +++ b/wolfcrypt/src/rsa.c @@ -1596,7 +1596,7 @@ static int RsaUnPad(const byte *pkcsBlock, unsigned int pkcsBlockLen, byte invalid = 0; #endif - if (output == NULL || pkcsBlockLen == 0 || pkcsBlockLen > 0xFFFF) { + if (output == NULL || pkcsBlockLen < 2 || pkcsBlockLen > 0xFFFF) { return BAD_FUNC_ARG; } From 7ce7d244f87425899ddf1abccd4bcdc23a8bb977 Mon Sep 17 00:00:00 2001 From: David Garske Date: Thu, 28 May 2020 15:09:00 -0700 Subject: [PATCH 138/298] Fix for using static memory AES GCM test. --- wolfcrypt/test/test.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wolfcrypt/test/test.c b/wolfcrypt/test/test.c index 25d0cf24c..d38ea00ee 100644 --- a/wolfcrypt/test/test.c +++ b/wolfcrypt/test/test.c @@ -8876,7 +8876,7 @@ int aesgcm_test(void) WC_RNG rng; byte randIV[12]; - result = wc_InitRng(&rng); + result = wc_InitRng_ex(&rng, HEAP_HINT, devId); if (result != 0) return -6135; From fd51eecb4f41e3bc4886c5a334f44492720edfaa Mon Sep 17 00:00:00 2001 From: David Garske Date: Thu, 28 May 2020 15:09:27 -0700 Subject: [PATCH 139/298] Fix for using signature wrapper with `WOLFSSL_NO_MALLOC`. Improve `wc_SignatureVerifyHash` to use RSA verify inline. --- wolfcrypt/src/signature.c | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/wolfcrypt/src/signature.c b/wolfcrypt/src/signature.c index 5d503338a..d731b5daf 100644 --- a/wolfcrypt/src/signature.c +++ b/wolfcrypt/src/signature.c @@ -195,14 +195,27 @@ int wc_SignatureVerifyHash( #else /* WOLFSSL_CRYPTOCELL */ word32 plain_len = hash_len; + #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) byte *plain_data; + #else + byte plain_data[MAX_ENCODED_SIG_SZ]; + #endif + /* Make sure the plain text output is at least key size */ if (plain_len < sig_len) { plain_len = sig_len; } + #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) plain_data = (byte*)XMALLOC(plain_len, NULL, DYNAMIC_TYPE_TMP_BUFFER); - if (plain_data) { + if (plain_data) + #else + if (plain_len <= sizeof(plain_data)) + #endif + { + byte* plain_ptr = NULL; + XMEMSET(plain_data, 0, plain_len); + XMEMCPY(plain_data, sig, sig_len); /* Perform verification of signature using provided RSA key */ do { #ifdef WOLFSSL_ASYNC_CRYPT @@ -210,12 +223,11 @@ int wc_SignatureVerifyHash( WC_ASYNC_FLAG_CALL_AGAIN); #endif if (ret >= 0) - ret = wc_RsaSSL_Verify(sig, sig_len, plain_data, - plain_len, (RsaKey*)key); + ret = wc_RsaSSL_VerifyInline(plain_data, sig_len, &plain_ptr, (RsaKey*)key); } while (ret == WC_PENDING_E); - if (ret >= 0) { + if (ret >= 0 && plain_ptr) { if ((word32)ret == hash_len && - XMEMCMP(plain_data, hash_data, hash_len) == 0) { + XMEMCMP(plain_ptr, hash_data, hash_len) == 0) { ret = 0; /* Success */ } else { @@ -223,7 +235,9 @@ int wc_SignatureVerifyHash( ret = SIG_VERIFY_E; } } + #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) XFREE(plain_data, NULL, DYNAMIC_TYPE_TMP_BUFFER); + #endif } else { ret = MEMORY_E; From 10a1cad2dccaeef4cf090fa4f8a0d916de69e042 Mon Sep 17 00:00:00 2001 From: David Garske Date: Thu, 28 May 2020 15:10:24 -0700 Subject: [PATCH 140/298] Fix for TFM `_fp_exptmod_nct` with `WOLFSSL_NO_MALLOC`. --- wolfcrypt/src/tfm.c | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/wolfcrypt/src/tfm.c b/wolfcrypt/src/tfm.c index b163a35ff..04e639ff3 100644 --- a/wolfcrypt/src/tfm.c +++ b/wolfcrypt/src/tfm.c @@ -1710,9 +1710,13 @@ static int _fp_exptmod_ct(fp_int * G, fp_int * X, int digits, fp_int * P, static int _fp_exptmod_nct(fp_int * G, fp_int * X, fp_int * P, fp_int * Y) { fp_int *res; - fp_int *M; fp_digit buf, mp; int err, bitbuf, bitcpy, bitcnt, mode, digidx, x, y, winsize; +#ifndef WOLFSSL_NO_MALLOC + fp_int *M; +#else + fp_int M[(1 << 6) + 1]; +#endif /* find window size */ x = fp_count_bits (X); @@ -1733,12 +1737,14 @@ static int _fp_exptmod_nct(fp_int * G, fp_int * X, fp_int * P, fp_int * Y) return err; } +#ifndef WOLFSSL_NO_MALLOC /* only allocate space for what's needed for window plus res */ M = (fp_int*)XMALLOC(sizeof(fp_int)*((1 << winsize) + 1), NULL, DYNAMIC_TYPE_BIGINT); if (M == NULL) { return FP_MEM; } +#endif res = &M[(word32)(1 << winsize)]; /* init M array */ @@ -1774,7 +1780,9 @@ static int _fp_exptmod_nct(fp_int * G, fp_int * X, fp_int * P, fp_int * Y) fp_sqr (&M[(word32)(1 << (winsize - 1))], &M[(word32)(1 << (winsize - 1))]); err = fp_montgomery_reduce (&M[(word32)(1 << (winsize - 1))], P, mp); if (err != FP_OKAY) { +#ifndef WOLFSSL_NO_MALLOC XFREE(M, NULL, DYNAMIC_TYPE_BIGINT); +#endif return err; } } @@ -1783,12 +1791,16 @@ static int _fp_exptmod_nct(fp_int * G, fp_int * X, fp_int * P, fp_int * Y) for (x = (1 << (winsize - 1)) + 1; x < (1 << winsize); x++) { err = fp_mul(&M[x - 1], &M[1], &M[x]); if (err != FP_OKAY) { +#ifndef WOLFSSL_NO_MALLOC XFREE(M, NULL, DYNAMIC_TYPE_BIGINT); +#endif return err; } err = fp_montgomery_reduce(&M[x], P, mp); if (err != FP_OKAY) { +#ifndef WOLFSSL_NO_MALLOC XFREE(M, NULL, DYNAMIC_TYPE_BIGINT); +#endif return err; } } @@ -1830,12 +1842,16 @@ static int _fp_exptmod_nct(fp_int * G, fp_int * X, fp_int * P, fp_int * Y) if (mode == 1 && y == 0) { err = fp_sqr(res, res); if (err != FP_OKAY) { +#ifndef WOLFSSL_NO_MALLOC XFREE(M, NULL, DYNAMIC_TYPE_BIGINT); +#endif return err; } fp_montgomery_reduce(res, P, mp); if (err != FP_OKAY) { +#ifndef WOLFSSL_NO_MALLOC XFREE(M, NULL, DYNAMIC_TYPE_BIGINT); +#endif return err; } continue; @@ -1851,12 +1867,16 @@ static int _fp_exptmod_nct(fp_int * G, fp_int * X, fp_int * P, fp_int * Y) for (x = 0; x < winsize; x++) { err = fp_sqr(res, res); if (err != FP_OKAY) { +#ifndef WOLFSSL_NO_MALLOC XFREE(M, NULL, DYNAMIC_TYPE_BIGINT); +#endif return err; } err = fp_montgomery_reduce(res, P, mp); if (err != FP_OKAY) { +#ifndef WOLFSSL_NO_MALLOC XFREE(M, NULL, DYNAMIC_TYPE_BIGINT); +#endif return err; } } @@ -1864,12 +1884,16 @@ static int _fp_exptmod_nct(fp_int * G, fp_int * X, fp_int * P, fp_int * Y) /* then multiply */ err = fp_mul(res, &M[bitbuf], res); if (err != FP_OKAY) { +#ifndef WOLFSSL_NO_MALLOC XFREE(M, NULL, DYNAMIC_TYPE_BIGINT); +#endif return err; } err = fp_montgomery_reduce(res, P, mp); if (err != FP_OKAY) { +#ifndef WOLFSSL_NO_MALLOC XFREE(M, NULL, DYNAMIC_TYPE_BIGINT); +#endif return err; } @@ -1886,12 +1910,16 @@ static int _fp_exptmod_nct(fp_int * G, fp_int * X, fp_int * P, fp_int * Y) for (x = 0; x < bitcpy; x++) { err = fp_sqr(res, res); if (err != FP_OKAY) { +#ifndef WOLFSSL_NO_MALLOC XFREE(M, NULL, DYNAMIC_TYPE_BIGINT); +#endif return err; } err = fp_montgomery_reduce(res, P, mp); if (err != FP_OKAY) { +#ifndef WOLFSSL_NO_MALLOC XFREE(M, NULL, DYNAMIC_TYPE_BIGINT); +#endif return err; } @@ -1901,12 +1929,16 @@ static int _fp_exptmod_nct(fp_int * G, fp_int * X, fp_int * P, fp_int * Y) /* then multiply */ err = fp_mul(res, &M[1], res); if (err != FP_OKAY) { +#ifndef WOLFSSL_NO_MALLOC XFREE(M, NULL, DYNAMIC_TYPE_BIGINT); +#endif return err; } err = fp_montgomery_reduce(res, P, mp); if (err != FP_OKAY) { +#ifndef WOLFSSL_NO_MALLOC XFREE(M, NULL, DYNAMIC_TYPE_BIGINT); +#endif return err; } } @@ -1924,7 +1956,9 @@ static int _fp_exptmod_nct(fp_int * G, fp_int * X, fp_int * P, fp_int * Y) /* swap res with Y */ fp_copy (res, Y); +#ifndef WOLFSSL_NO_MALLOC XFREE(M, NULL, DYNAMIC_TYPE_BIGINT); +#endif return err; } From 2eb9e0551825b6af7c319e9df71658c1bf4615ef Mon Sep 17 00:00:00 2001 From: Sean Parkinson Date: Fri, 29 May 2020 11:21:37 +1000 Subject: [PATCH 141/298] Fix ecc mulmod to only do one more bit than modulus len --- wolfcrypt/src/ecc.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/wolfcrypt/src/ecc.c b/wolfcrypt/src/ecc.c index 598733980..efbb61322 100644 --- a/wolfcrypt/src/ecc.c +++ b/wolfcrypt/src/ecc.c @@ -2836,11 +2836,13 @@ int wc_ecc_mulmod_ex(mp_int* k, ecc_point *G, ecc_point *R, /* setup sliding window */ mode = 0; - bitcnt = 1; - buf = 0; digidx = get_digit_count(modulus) - 1; /* The order MAY be 1 bit longer than the modulus. */ - digidx += (modulus->dp[digidx] >> (DIGIT_BIT-1)); + digidx += modulus->dp[digidx] >> (DIGIT_BIT-1); + bitcnt = (mp_count_bits(modulus) + 1) % DIGIT_BIT; + buf = get_digit(k, digidx) << (DIGIT_BIT - bitcnt); + bitcnt = (bitcnt + 1) % DIGIT_BIT; + digidx -= bitcnt != 1; /* perform ops */ if (err == MP_OKAY) { From 5f783f0198304fad0b5dbbdc7b09175de26ce523 Mon Sep 17 00:00:00 2001 From: Hideki Miyazaki Date: Sat, 30 May 2020 15:19:37 +0900 Subject: [PATCH 142/298] fix build failrue on esp-idf --- wolfcrypt/src/evp.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/wolfcrypt/src/evp.c b/wolfcrypt/src/evp.c index 4a0bb8103..0f5475cfd 100644 --- a/wolfcrypt/src/evp.c +++ b/wolfcrypt/src/evp.c @@ -33,12 +33,11 @@ #elif defined(WOLFCRYPT_ONLY) #else +#if defined(OPENSSL_EXTRA) #include #include -#if defined(OPENSSL_EXTRA) - #ifndef NO_AES #ifdef HAVE_AES_CBC #ifdef WOLFSSL_AES_128 From bfe1760c17a30dfeb0da897ccb9668cecd052c91 Mon Sep 17 00:00:00 2001 From: David Garske Date: Mon, 1 Jun 2020 10:48:52 -0700 Subject: [PATCH 143/298] Improvements to the ECC max bits calculation used with fast math (`USE_FAST_MATH` and `ALT_ECC_SIZE`). Updated example code comments to reflect accurate calculation. --- IDE/GCC-ARM/Header/user_settings.h | 7 +++- .../user_settings.h | 6 +-- .../user_settings_verbose_example.h | 8 ++-- .../custom_port_user_settings/user_settings.h | 6 +-- IDE/LPCXPRESSO/lib_wolfssl/user_settings.h | 4 +- IDE/WICED-STUDIO/user_settings.h | 2 +- wolfssl/wolfcrypt/ecc.h | 40 +++++++++---------- 7 files changed, 39 insertions(+), 34 deletions(-) diff --git a/IDE/GCC-ARM/Header/user_settings.h b/IDE/GCC-ARM/Header/user_settings.h index 135ddb086..80e3d0d62 100644 --- a/IDE/GCC-ARM/Header/user_settings.h +++ b/IDE/GCC-ARM/Header/user_settings.h @@ -189,14 +189,17 @@ extern "C" { /* Use alternate ECC size for ECC math */ #ifdef USE_FAST_MATH + /* MAX ECC BITS = ROUND8(MAX ECC) * 2 */ #ifdef NO_RSA /* Custom fastmath size if not using RSA */ - /* MAX = ROUND32(ECC BITS 256) + SIZE_OF_MP_DIGIT(32) */ #undef FP_MAX_BITS - #define FP_MAX_BITS (256 + 32) + #define FP_MAX_BITS (256 * 2) #else #undef ALT_ECC_SIZE #define ALT_ECC_SIZE + /* wolfSSL will compute the FP_MAX_BITS_ECC, but it can be overriden */ + //#undef FP_MAX_BITS_ECC + //#define FP_MAX_BITS_ECC (256 * 2) #endif /* Speedups specific to curve */ diff --git a/IDE/IAR-EWARM/embOS/SAMV71_XULT/embOS_SAMV71_XULT_user_settings/user_settings.h b/IDE/IAR-EWARM/embOS/SAMV71_XULT/embOS_SAMV71_XULT_user_settings/user_settings.h index 3a124c7bb..37714a3ec 100644 --- a/IDE/IAR-EWARM/embOS/SAMV71_XULT/embOS_SAMV71_XULT_user_settings/user_settings.h +++ b/IDE/IAR-EWARM/embOS/SAMV71_XULT/embOS_SAMV71_XULT_user_settings/user_settings.h @@ -34,11 +34,11 @@ #undef ECC_USER_CURVES #define ECC_USER_CURVES - #undef ECC_ALT_SIZE - #define ECC_ALT_SIZE + #undef ALT_ECC_SIZE + #define ALT_ECC_SIZE #undef FP_MAX_BITS_ECC - #define FP_MAX_BITS_ECC 528 + #define FP_MAX_BITS_ECC (256 * 2) #undef TFM_TIMING_RESISTANT #define TFM_TIMING_RESISTANT diff --git a/IDE/IAR-EWARM/embOS/SAMV71_XULT/embOS_SAMV71_XULT_user_settings/user_settings_verbose_example.h b/IDE/IAR-EWARM/embOS/SAMV71_XULT/embOS_SAMV71_XULT_user_settings/user_settings_verbose_example.h index 3819e6cfc..185497c6c 100644 --- a/IDE/IAR-EWARM/embOS/SAMV71_XULT/embOS_SAMV71_XULT_user_settings/user_settings_verbose_example.h +++ b/IDE/IAR-EWARM/embOS/SAMV71_XULT/embOS_SAMV71_XULT_user_settings/user_settings_verbose_example.h @@ -84,11 +84,13 @@ #define ECC_TIMING_RESISTANT #ifdef USE_FAST_MATH - /* Max ECC bits (curve size * 8). ECC521 is (66*8) = 528. */ #undef ALT_ECC_SIZE #define ALT_ECC_SIZE - #undef FP_MAX_BITS_ECC - #define FP_MAX_BITS_ECC 528 + + /* wolfSSL will compute the FP_MAX_BITS_ECC, but it can be overriden */ + /* MAX ECC BITS = ROUND8(MAX ECC) * 2 */ + //#undef FP_MAX_BITS_ECC + //#define FP_MAX_BITS_ECC (528 * 2) /* Enable TFM optimizations for ECC */ #define TFM_ECC192 diff --git a/IDE/IAR-EWARM/embOS/custom_port/custom_port_user_settings/user_settings.h b/IDE/IAR-EWARM/embOS/custom_port/custom_port_user_settings/user_settings.h index 1c4cadf38..358c2b48e 100644 --- a/IDE/IAR-EWARM/embOS/custom_port/custom_port_user_settings/user_settings.h +++ b/IDE/IAR-EWARM/embOS/custom_port/custom_port_user_settings/user_settings.h @@ -31,11 +31,11 @@ #undef ECC_USER_CURVES #define ECC_USER_CURVES - #undef ECC_ALT_SIZE - #define ECC_ALT_SIZE + #undef ALT_ECC_SIZE + #define ALT_ECC_SIZE #undef FP_MAX_BITS_ECC - #define FP_MAX_BITS_ECC 528 + #define FP_MAX_BITS_ECC (256 * 2) #undef TFM_TIMING_RESISTANT #define TFM_TIMING_RESISTANT diff --git a/IDE/LPCXPRESSO/lib_wolfssl/user_settings.h b/IDE/LPCXPRESSO/lib_wolfssl/user_settings.h index 1414154ba..9189410a5 100644 --- a/IDE/LPCXPRESSO/lib_wolfssl/user_settings.h +++ b/IDE/LPCXPRESSO/lib_wolfssl/user_settings.h @@ -22,7 +22,8 @@ #define FP_LUT 4 #define FP_MAX_BITS 2048 /* 4096 */ -#define FP_MAX_BITS_ECC 512 +#define ECC_USER_CURVES /* Disables P-112, P-128, P-160, P-192, P-224, P-384, P-521 but leaves P-256 enabled */ +#define FP_MAX_BITS_ECC (256 * 2) #define ALT_ECC_SIZE #define USE_FAST_MATH #define SMALL_SESSION_CACHE @@ -52,7 +53,6 @@ #define NO_64BIT #define NO_WOLFSSL_SERVER #define NO_OLD_TLS -#define ECC_USER_CURVES /* Disables P-112, P-128, P-160, P-192, P-224, P-384, P-521 but leaves P-256 enabled */ #define NO_DES3 #define NO_MD5 #define NO_RC4 diff --git a/IDE/WICED-STUDIO/user_settings.h b/IDE/WICED-STUDIO/user_settings.h index b548a55ac..70e13959f 100644 --- a/IDE/WICED-STUDIO/user_settings.h +++ b/IDE/WICED-STUDIO/user_settings.h @@ -595,7 +595,7 @@ extern unsigned int my_rng_seed_gen(void); #endif #if 1 - #define FP_MAX_BITS_ECC 512 + #define FP_MAX_BITS_ECC (256 + 32) #endif /* ------------------------------------------------------------------------- */ diff --git a/wolfssl/wolfcrypt/ecc.h b/wolfssl/wolfcrypt/ecc.h index 4d9eb2c01..3dc0f3253 100644 --- a/wolfssl/wolfcrypt/ecc.h +++ b/wolfssl/wolfcrypt/ecc.h @@ -278,14 +278,15 @@ typedef struct ecc_set_type { * mp_ints for the components of the point. With ALT_ECC_SIZE, the components * of the point are pointers that are set to each of a three item array of * alt_fp_ints. While an mp_int will have 4096 bits of digit inside the - * structure, the alt_fp_int will only have 528 bits. A size value was added - * in the ALT case, as well, and is set by mp_init() and alt_fp_init(). The - * functions fp_zero() and fp_copy() use the size parameter. An int needs to - * be initialized before using it instead of just fp_zeroing it, the init will - * call zero. FP_MAX_BITS_ECC defaults to 528, but can be set to change the - * number of bits used in the alternate FP_INT. + * structure, the alt_fp_int will only have 512 bits for ECC 256-bit and + * 1056-bits for ECC 521-bit. A size value was added in the ALT case, as well, + * and is set by mp_init() and alt_fp_init(). The functions fp_zero() and + * fp_copy() use the size parameter. An int needs to be initialized before + * using it instead of just fp_zeroing it, the init will call zero. The + * FP_MAX_BITS_ECC defaults to calculating based on MAX_ECC_BITS, but + * can be set to change the number of bits used in the alternate FP_INT. * - * Do not enable ALT_ECC_SIZE and disable fast math in the configuration. + * The ALT_ECC_SIZE option only applies to stack based fast math USE_FAST_MATH. */ #ifndef USE_FAST_MATH @@ -294,19 +295,18 @@ typedef struct ecc_set_type { /* determine max bits required for ECC math */ #ifndef FP_MAX_BITS_ECC - /* check alignment */ - #if ((MAX_ECC_BITS * 2) % DIGIT_BIT) == 0 - /* max bits is double */ - #define FP_MAX_BITS_ECC (MAX_ECC_BITS * 2) - #else - /* max bits is doubled, plus one digit of fudge */ - #define FP_MAX_BITS_ECC ((MAX_ECC_BITS * 2) + DIGIT_BIT) - #endif -#else - /* verify alignment */ - #if FP_MAX_BITS_ECC % CHAR_BIT - #error FP_MAX_BITS_ECC must be a multiple of CHAR_BIT - #endif + /* max bits rounded up by 8 then doubled */ + /* (ROUND8(MAX_ECC_BITS) * 2) */ + #define FP_MAX_BITS_ECC (2 * \ + ((MAX_ECC_BITS + DIGIT_BIT - 1) / DIGIT_BIT) * DIGIT_BIT) + + /* Note: For ECC verify only FP_MAX_BITS_ECC can be reduced to: + ROUND8(MAX_ECC_BITS) + ROUND8(DIGIT_BIT) */ +#endif + +/* verify alignment */ +#if FP_MAX_BITS_ECC % CHAR_BIT + #error FP_MAX_BITS_ECC must be a multiple of CHAR_BIT #endif /* determine buffer size */ From b947f69f60caec34df0049efca6d18652c02ed0c Mon Sep 17 00:00:00 2001 From: David Garske Date: Mon, 1 Jun 2020 10:49:08 -0700 Subject: [PATCH 144/298] Fix to correct SP 4096-bit enable. Correct nonexistent `WOLFSSL_SP_NO_4096`, which should be `WOLFSSL_SP_4096`. --- wolfcrypt/src/dh.c | 2 +- wolfcrypt/src/sp_int.c | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/wolfcrypt/src/dh.c b/wolfcrypt/src/dh.c index 6c53be8f3..78decc3f8 100644 --- a/wolfcrypt/src/dh.c +++ b/wolfcrypt/src/dh.c @@ -1485,7 +1485,7 @@ int wc_DhCheckPubKey_ex(DhKey* key, const byte* pub, word32 pubSz, } else #endif -#ifdef WOLFSSL_SP_NO_4096 +#ifdef WOLFSSL_SP_4096 if (mp_count_bits(&key->p) == 4096) { ret = sp_ModExp_4096(y, q, p, y); if (ret != 0) diff --git a/wolfcrypt/src/sp_int.c b/wolfcrypt/src/sp_int.c index e53bc93fc..4ec6e2339 100644 --- a/wolfcrypt/src/sp_int.c +++ b/wolfcrypt/src/sp_int.c @@ -43,7 +43,6 @@ * WOLFSSL_SP_NO_MALLOC: Always use stack, no heap XMALLOC/XFREE allowed * WOLFSSL_SP_NO_2048: Disable RSA/DH 2048-bit support * WOLFSSL_SP_NO_3072: Disable RSA/DH 3072-bit support - * WOLFSSL_SP_NO_4096: Disable RSA/DH 4096-bit support * WOLFSSL_SP_4096: Enable RSA/RH 4096-bit support * WOLFSSL_SP_384 Enable ECC 384-bit SECP384R1 support * WOLFSSL_SP_NO_256 Disable ECC 256-bit SECP256R1 support @@ -1659,7 +1658,7 @@ int sp_exptmod(sp_int* b, sp_int* e, sp_int* m, sp_int* r) } else #endif -#ifdef WOLFSSL_SP_NO_4096 +#ifdef WOLFSSL_SP_4096 if ((mBits == 4096) && sp_isodd(m) && (bBits <= 4096) && (eBits <= 4096)) { err = sp_ModExp_4096(b, e, m, r); From 5bcd121ab5dc1752d1eca50f07f780d2296d6980 Mon Sep 17 00:00:00 2001 From: Takashi Kojo Date: Tue, 2 Jun 2020 05:54:16 +0900 Subject: [PATCH 145/298] alertWhy: unknown_ca for ASN_NO_SIGNER_E --- src/internal.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/internal.c b/src/internal.c index c89a02843..7906c4c77 100644 --- a/src/internal.c +++ b/src/internal.c @@ -9870,6 +9870,8 @@ static void DoCertFatalAlert(WOLFSSL* ssl, int ret) alertWhy = bad_certificate; if (ret == ASN_AFTER_DATE_E || ret == ASN_BEFORE_DATE_E) { alertWhy = certificate_expired; + } else if (ret == ASN_NO_SIGNER_E) { + alertWhy = unknown_ca; } #if (defined(OPENSSL_ALL) || defined(WOLFSSL_APACHE_HTTPD)) else if (ret == CRL_CERT_REVOKED) { From 6217118ee4196f69a97fb633be50940f9bf50a7c Mon Sep 17 00:00:00 2001 From: kaleb-himes Date: Mon, 1 Jun 2020 15:12:16 -0600 Subject: [PATCH 146/298] Account for unmodifiable FIPS module files when adding new OpenSSL functionality --- src/ssl.c | 35 ++++++++++++++++++++++++++++++++++- tests/api.c | 21 +++++++++++++++++++-- wolfcrypt/src/asn.c | 9 +++++++++ wolfcrypt/src/evp.c | 15 +++++++++++++++ 4 files changed, 77 insertions(+), 3 deletions(-) diff --git a/src/ssl.c b/src/ssl.c index c65d0cb91..606540731 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -18553,6 +18553,8 @@ int wolfSSL_DH_check(const WOLFSSL_DH *dh, int *codes) return WOLFSSL_SUCCESS; } +#if !defined(HAVE_FIPS) || \ + ( defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2) ) /* Converts DER encoded DH parameters to a WOLFSSL_DH structure. * * dh : structure to copy DH parameters into. @@ -18601,6 +18603,7 @@ WOLFSSL_DH *wolfSSL_d2i_DHparams(WOLFSSL_DH **dh, const unsigned char **pp, return newDH; } +#endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */ /* Converts internal WOLFSSL_DH structure to DER encoded DH. * @@ -28576,6 +28579,8 @@ void wolfSSL_DH_free(WOLFSSL_DH* dh) } } +#if !defined(HAVE_FIPS) || \ + ( defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2) ) int SetDhInternal(WOLFSSL_DH* dh) { int ret = WOLFSSL_FATAL_ERROR; @@ -28715,6 +28720,7 @@ int SetDhExternal(WOLFSSL_DH *dh) return WOLFSSL_SUCCESS; } +#endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */ #endif /* !NO_DH && (WOLFSSL_QT || OPENSSL_ALL) */ /* return code compliant with OpenSSL : @@ -29117,6 +29123,8 @@ WOLFSSL_BIGNUM* wolfSSL_DH_8192_prime(WOLFSSL_BIGNUM* bn) return bn; } +#if !defined(HAVE_FIPS) || \ + ( defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2) ) /* return code compliant with OpenSSL : * 1 if success, 0 if error */ @@ -29331,6 +29339,7 @@ int wolfSSL_DH_set0_pqg(WOLFSSL_DH *dh, WOLFSSL_BIGNUM *p, return WOLFSSL_SUCCESS; } #endif /* v1.1.0 or later */ +#endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */ #endif /* NO_DH */ @@ -32620,6 +32629,8 @@ int wolfSSL_ECPoint_i2d(const WOLFSSL_EC_GROUP *group, return WOLFSSL_SUCCESS; } +#if !defined(HAVE_FIPS) || \ + ( defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2) ) /* return code compliant with OpenSSL : * 1 if success, 0 if error */ @@ -32723,6 +32734,7 @@ size_t wolfSSL_EC_POINT_point2oct(const WOLFSSL_EC_GROUP *group, return (size_t)min_len; } + int wolfSSL_EC_POINT_oct2point(const WOLFSSL_EC_GROUP *group, WOLFSSL_EC_POINT *p, const unsigned char *buf, size_t len, WOLFSSL_BN_CTX *ctx) @@ -32830,6 +32842,7 @@ WOLFSSL_BIGNUM *wolfSSL_EC_POINT_point2bn(const WOLFSSL_EC_GROUP *group, return ret; } +#endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */ WOLFSSL_EC_POINT *wolfSSL_EC_POINT_new(const WOLFSSL_EC_GROUP *group) { @@ -32963,6 +32976,8 @@ int wolfSSL_EC_POINT_set_affine_coordinates_GFp(const WOLFSSL_EC_GROUP *group, #if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) && \ !defined(HAVE_SELFTEST) +#if !defined(HAVE_FIPS) || \ + ( defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2) ) /* Calculate the value: generator * n + q * m * return code compliant with OpenSSL : * 1 if success, 0 if error @@ -33102,6 +33117,7 @@ cleanup: wc_ecc_del_point(tmp); return ret; } +#endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */ #endif /* !defined(WOLFSSL_ATECC508A) && defined(ECC_SHAMIR) && * !defined(HAVE_SELFTEST) */ @@ -33225,6 +33241,8 @@ int wolfSSL_EC_POINT_is_at_infinity(const WOLFSSL_EC_GROUP *group, /* End EC_POINT */ +#if !defined(HAVE_FIPS) || \ + ( defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2) ) size_t wolfSSL_EC_get_builtin_curves(WOLFSSL_EC_BUILTIN_CURVE *r, size_t nitems) { size_t i, min_nitems; @@ -33246,6 +33264,7 @@ size_t wolfSSL_EC_get_builtin_curves(WOLFSSL_EC_BUILTIN_CURVE *r, size_t nitems) return ecc_sets_count; } +#endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */ /* Start ECDSA_SIG */ void wolfSSL_ECDSA_SIG_free(WOLFSSL_ECDSA_SIG *sig) @@ -35002,6 +35021,8 @@ int wolfSSL_RSA_LoadDer_ex(WOLFSSL_RSA* rsa, const unsigned char* derBuf, #if defined(WC_RSA_PSS) && (defined(OPENSSL_ALL) || defined(WOLFSSL_ASIO) || \ defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_NGINX)) +#if !defined(HAVE_FIPS) || \ + ( defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2) ) static int hash2mgf(enum wc_HashType hType) { switch (hType) { @@ -35251,7 +35272,10 @@ int wolfSSL_RSA_verify_PKCS1_PSS(WOLFSSL_RSA *rsa, const unsigned char *mHash, XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER); return WOLFSSL_SUCCESS; } -#endif +#endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */ +#endif /* WC_RSA_PSS && (OPENSSL_ALL || WOLFSSL_ASIO || WOLFSSL_HAPROXY + * || WOLFSSL_NGINX) + */ #if defined(OPENSSL_EXTRA) WOLFSSL_RSA_METHOD *wolfSSL_RSA_meth_new(const char *name, int flags) @@ -35552,6 +35576,8 @@ int wolfSSL_EC_KEY_LoadDer_ex(WOLFSSL_EC_KEY* key, const unsigned char* derBuf, #if !defined(NO_DH) && (defined(WOLFSSL_QT) || defined(OPENSSL_ALL) || defined(WOLFSSL_OPENSSH)) /* return WOLFSSL_SUCCESS if success, WOLFSSL_FATAL_ERROR if error */ +#if !defined(HAVE_FIPS) || \ + ( defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2) ) int wolfSSL_DH_LoadDer(WOLFSSL_DH* dh, const unsigned char* derBuf, int derSz) { word32 idx = 0; @@ -35575,6 +35601,7 @@ int wolfSSL_DH_LoadDer(WOLFSSL_DH* dh, const unsigned char* derBuf, int derSz) return WOLFSSL_SUCCESS; } +#endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */ #endif /* ! NO_DH && WOLFSSL_QT || OPENSSL_ALL */ #endif /* OPENSSL_EXTRA */ @@ -39652,6 +39679,8 @@ WOLFSSL_BIO* wolfSSL_BIO_new_fp(XFILE fp, int close_flag) #ifndef NO_DH +#if !defined(HAVE_FIPS) || \ + ( defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2) ) WOLFSSL_DH *wolfSSL_PEM_read_bio_DHparams(WOLFSSL_BIO *bio, WOLFSSL_DH **x, pem_password_cb *cb, void *u) { @@ -39781,6 +39810,7 @@ end: return NULL; #endif } +#endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */ #ifndef NO_FILESYSTEM #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL) || defined(WOLFSSL_OPENSSH) @@ -39866,6 +39896,8 @@ int wc_DhParamsToDer(DhKey* key, byte* out, word32* outSz) return idx; } +#if !defined(HAVE_FIPS) || \ + ( defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2) ) int wc_DhPubKeyToDer(DhKey* key, byte* out, word32* outSz) { word32 sz = 0; @@ -40131,6 +40163,7 @@ int wolfSSL_PEM_write_DHparams(XFILE fp, WOLFSSL_DH* dh) WOLFSSL_LEAVE("wolfSSL_PEM_write_DHparams", WOLFSSL_SUCCESS); return WOLFSSL_SUCCESS; } +#endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */ #endif /* WOLFSSL_QT || OPENSSL_ALL */ #endif /* !NO_FILESYSTEM */ #endif /* !NO_DH */ diff --git a/tests/api.c b/tests/api.c index 0e9a59e5e..c9d05de87 100644 --- a/tests/api.c +++ b/tests/api.c @@ -1786,7 +1786,9 @@ static int test_wolfSSL_SetMinVersion(void) EC_GROUP_new_by_curve_name, EC_GROUP_order_bits */ -# if defined(OPENSSL_EXTRA) +# if defined(OPENSSL_EXTRA) && ( !defined(HAVE_FIPS) || \ + ( defined(HAVE_FIPS_VERSION) && \ + (HAVE_FIPS_VERSION > 2) ) ) static void test_wolfSSL_EC(void) { #if defined(HAVE_ECC) @@ -1978,7 +1980,7 @@ static void test_wolfSSL_EC(void) BN_CTX_free(ctx); #endif /* HAVE_ECC */ } -#endif +#endif /* OPENSSL_EXTRA && ( !HAVE_FIPS || HAVE_FIPS_VERSION > 2) */ static void test_wolfSSL_PEM_read_bio_ECPKParameters(void) { @@ -28046,6 +28048,8 @@ static void test_wolfSSL_OBJ_ln(void) AssertIntEQ(OBJ_ln2nid(NULL), NID_undef); #ifdef HAVE_ECC +#if !defined(HAVE_FIPS) || \ + ( defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2) ) { int nCurves = 27; EC_builtin_curve r[nCurves]; @@ -28056,6 +28060,7 @@ static void test_wolfSSL_OBJ_ln(void) AssertStrEQ(OBJ_nid2ln(r[i].nid), r[i].comment); } } +#endif #endif for (i = 0; i < maxIdx; i++) { @@ -28713,6 +28718,8 @@ static void test_wolfSSL_RSA_padding_add_PKCS1_PSS(void) static void test_wolfSSL_EC_get_builtin_curves(void) { #if defined(HAVE_ECC) && (defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)) +#if !defined(HAVE_FIPS) || \ + ( defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2) ) EC_builtin_curve* curves = NULL; size_t crv_len = 0; size_t i = 0; @@ -28733,6 +28740,7 @@ static void test_wolfSSL_EC_get_builtin_curves(void) XFREE(curves, NULL, DYNAMIC_TYPE_TMP_BUFFER); printf(resultFmt, passed); +#endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */ #endif /* defined(HAVE_ECC) || defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL) */ } @@ -29290,6 +29298,8 @@ static void test_wolfSSL_EVP_PKEY_sign(void) { #if defined(OPENSSL_EXTRA) && !defined(NO_RSA) && defined(WOLFSSL_KEY_GEN) && \ !defined(HAVE_FAST_RSA) && !defined(HAVE_SELFTEST) +#if !defined(HAVE_FIPS) || \ + (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2) ) WOLFSSL_RSA* rsa = NULL; WOLFSSL_EVP_PKEY* pkey = NULL; WOLFSSL_EVP_PKEY_CTX* ctx = NULL; @@ -29346,6 +29356,7 @@ static void test_wolfSSL_EVP_PKEY_sign(void) wolfSSL_RSA_free(rsa); XFREE(sig, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); XFREE(sigVerify, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); +#endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */ printf(resultFmt, passed); #endif } @@ -29372,6 +29383,8 @@ static void test_EVP_PKEY_rsa(void) static void test_EVP_PKEY_ec(void) { #if defined(OPENSSL_EXTRA) && defined(HAVE_ECC) +#if !defined(HAVE_FIPS) || \ + ( defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2) ) WOLFSSL_EC_KEY* ecKey; WOLFSSL_EVP_PKEY* pkey; @@ -29384,6 +29397,7 @@ static void test_EVP_PKEY_ec(void) printf(resultFmt, passed); #endif +#endif } static void test_EVP_PKEY_cmp(void) @@ -32415,7 +32429,10 @@ void ApiTest(void) /*wolfSSL_EVP_get_cipherbynid test*/ test_wolfSSL_EVP_get_cipherbynid(); test_wolfSSL_EVP_CIPHER_CTX(); +#if !defined(HAVE_FIPS) || \ + ( defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2) ) test_wolfSSL_EC(); +#endif test_wolfSSL_ECDSA_SIG(); test_ECDSA_size_sign(); #endif diff --git a/wolfcrypt/src/asn.c b/wolfcrypt/src/asn.c index 226278441..7e1d4c534 100644 --- a/wolfcrypt/src/asn.c +++ b/wolfcrypt/src/asn.c @@ -141,6 +141,15 @@ extern int wc_InitRsaHw(RsaKey* key); }; #endif #endif +#if defined(HAVE_FIPS) && \ + ( defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2) ) + /* aes.h is locked w/ FIPS, have to add new enums in non-boundary location + * when building in FIPS mode */ +enum { + GCM_NONCE_MID_SZ = 12 /* The usual default nonce size for AES-GCM. */ +}; +#endif + #ifdef WOLFSSL_RENESAS_TSIP_TLS void tsip_inform_key_position(const word32 key_n_start, const word32 key_n_len, const word32 key_e_start, diff --git a/wolfcrypt/src/evp.c b/wolfcrypt/src/evp.c index 0f5475cfd..566f2ec6b 100644 --- a/wolfcrypt/src/evp.c +++ b/wolfcrypt/src/evp.c @@ -33,6 +33,15 @@ #elif defined(WOLFCRYPT_ONLY) #else +#if defined(HAVE_FIPS) && \ + ( defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2) ) + /* aes.h is locked w/ FIPS, have to add new enums in non-boundary location + * when building in FIPS mode */ +enum { + GCM_NONCE_MID_SZ = 12 /* The usual default nonce size for AES-GCM. */ +}; +#endif + #if defined(OPENSSL_EXTRA) #include @@ -1343,6 +1352,8 @@ int wolfSSL_EVP_PKEY_derive_set_peer(WOLFSSL_EVP_PKEY_CTX *ctx, WOLFSSL_EVP_PKEY } #if !defined(NO_DH) && defined(HAVE_ECC) +#if !defined(HAVE_FIPS) || \ + ( defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2) ) int wolfSSL_EVP_PKEY_derive(WOLFSSL_EVP_PKEY_CTX *ctx, unsigned char *key, size_t *keylen) { int len; @@ -1420,6 +1431,7 @@ int wolfSSL_EVP_PKEY_derive(WOLFSSL_EVP_PKEY_CTX *ctx, unsigned char *key, size_ } return WOLFSSL_SUCCESS; } +#endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */ #endif /* Uses the WOLFSSL_EVP_PKEY_CTX to decrypt a buffer. @@ -5893,6 +5905,8 @@ WOLFSSL_EC_KEY* wolfSSL_EVP_PKEY_get1_EC_KEY(WOLFSSL_EVP_PKEY* key) #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT) #if !defined(NO_DH) && !defined(NO_FILESYSTEM) +#if !defined(HAVE_FIPS) || \ + ( defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2) ) /* with set1 functions the pkey struct does not own the DH structure * Build the following DH Key format from the passed in WOLFSSL_DH * then store in WOLFSSL_EVP_PKEY in DER format. @@ -5971,6 +5985,7 @@ int wolfSSL_EVP_PKEY_set1_DH(WOLFSSL_EVP_PKEY *pkey, WOLFSSL_DH *key) return WOLFSSL_SUCCESS; } +#endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */ WOLFSSL_DH* wolfSSL_EVP_PKEY_get0_DH(WOLFSSL_EVP_PKEY* key) { From bc02f2c74ea9e93b9f57374c5a89236062aafe23 Mon Sep 17 00:00:00 2001 From: kaleb-himes Date: Mon, 1 Jun 2020 17:13:23 -0600 Subject: [PATCH 147/298] Revert GCM_NONCE_MID_SZ changes --- wolfcrypt/src/asn.c | 8 -------- wolfcrypt/src/evp.c | 9 --------- 2 files changed, 17 deletions(-) diff --git a/wolfcrypt/src/asn.c b/wolfcrypt/src/asn.c index 7e1d4c534..71a1290e4 100644 --- a/wolfcrypt/src/asn.c +++ b/wolfcrypt/src/asn.c @@ -141,14 +141,6 @@ extern int wc_InitRsaHw(RsaKey* key); }; #endif #endif -#if defined(HAVE_FIPS) && \ - ( defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2) ) - /* aes.h is locked w/ FIPS, have to add new enums in non-boundary location - * when building in FIPS mode */ -enum { - GCM_NONCE_MID_SZ = 12 /* The usual default nonce size for AES-GCM. */ -}; -#endif #ifdef WOLFSSL_RENESAS_TSIP_TLS void tsip_inform_key_position(const word32 key_n_start, diff --git a/wolfcrypt/src/evp.c b/wolfcrypt/src/evp.c index 566f2ec6b..d8a54df03 100644 --- a/wolfcrypt/src/evp.c +++ b/wolfcrypt/src/evp.c @@ -33,15 +33,6 @@ #elif defined(WOLFCRYPT_ONLY) #else -#if defined(HAVE_FIPS) && \ - ( defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2) ) - /* aes.h is locked w/ FIPS, have to add new enums in non-boundary location - * when building in FIPS mode */ -enum { - GCM_NONCE_MID_SZ = 12 /* The usual default nonce size for AES-GCM. */ -}; -#endif - #if defined(OPENSSL_EXTRA) #include From 0604e7d208c1cab09aedf9b0f5a8d8d45f084b8b Mon Sep 17 00:00:00 2001 From: kaleb-himes Date: Mon, 1 Jun 2020 17:36:27 -0600 Subject: [PATCH 148/298] no priv or pub in dhKey struct in FIPS --- wolfcrypt/src/asn.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/wolfcrypt/src/asn.c b/wolfcrypt/src/asn.c index 71a1290e4..c32d88c10 100644 --- a/wolfcrypt/src/asn.c +++ b/wolfcrypt/src/asn.c @@ -4411,7 +4411,10 @@ int wc_DhKeyDecode(const byte* input, word32* inOutIdx, DhKey* key, word32 inSz) return ASN_PARSE_E; #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL) + #if !defined(HAVE_FIPS) || \ + ( defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2) ) temp = *inOutIdx; + #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */ #endif /* Assume input started after 1.2.840.113549.1.3.1 dhKeyAgreement */ @@ -4421,6 +4424,8 @@ int wc_DhKeyDecode(const byte* input, word32* inOutIdx, DhKey* key, word32 inSz) } #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL) + #if !defined(HAVE_FIPS) || \ + ( defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2) ) /* If ASN_DH_KEY_E: Check if input started at beginning of key */ if (ret == ASN_DH_KEY_E) { /* rewind back to after the first sequence */ @@ -4465,6 +4470,7 @@ int wc_DhKeyDecode(const byte* input, word32* inOutIdx, DhKey* key, word32 inSz) ret = 0; } } + #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */ #endif /* WOLFSSL_QT || OPENSSL_ALL */ WOLFSSL_MSG("wc_DhKeyDecode Success"); From 6ab5f2d9d7b0550fedeb26bfc25e717917eda12a Mon Sep 17 00:00:00 2001 From: kaleb-himes Date: Mon, 1 Jun 2020 17:56:03 -0600 Subject: [PATCH 149/298] remove unused variables --- wolfcrypt/src/asn.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/wolfcrypt/src/asn.c b/wolfcrypt/src/asn.c index c32d88c10..623bca885 100644 --- a/wolfcrypt/src/asn.c +++ b/wolfcrypt/src/asn.c @@ -4399,8 +4399,11 @@ int wc_DhKeyDecode(const byte* input, word32* inOutIdx, DhKey* key, word32 inSz) int ret = 0; int length; #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL) + #if !defined(HAVE_FIPS) || \ + ( defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2) ) word32 oid = 0, temp = 0; #endif + #endif WOLFSSL_ENTER("wc_DhKeyDecode"); @@ -4409,7 +4412,6 @@ int wc_DhKeyDecode(const byte* input, word32* inOutIdx, DhKey* key, word32 inSz) if (GetSequence(input, inOutIdx, &length, inSz) < 0) return ASN_PARSE_E; - #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL) #if !defined(HAVE_FIPS) || \ ( defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2) ) From 8cd92f68f22994abcc3868c1dab9a25ce6d7f282 Mon Sep 17 00:00:00 2001 From: kaleb-himes Date: Tue, 2 Jun 2020 14:28:50 -0600 Subject: [PATCH 150/298] init components as best practice --- doc/dox_comments/header_files/ecc.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/dox_comments/header_files/ecc.h b/doc/dox_comments/header_files/ecc.h index 70029a4f3..1128af9e4 100644 --- a/doc/dox_comments/header_files/ecc.h +++ b/doc/dox_comments/header_files/ecc.h @@ -395,6 +395,8 @@ int wc_ecc_sign_hash(const byte* in, word32 inlen, byte* out, word32 *outlen, byte digest[] = { initialize with message hash }; wc_InitRng(&rng); // initialize rng wc_ecc_init(&key); // initialize key + mp_init(&r); // initialize r component + mp_init(&s); // initialize s component wc_ecc_make_key(&rng, 32, &key); // make public/private key pair ret = wc_ecc_sign_hash_ex(digest, sizeof(digest), &rng, &key, &r, &s); From d5241bbcc6d01df92739407f2810c1c8db45bcb7 Mon Sep 17 00:00:00 2001 From: Tesfa Mael Date: Wed, 27 May 2020 13:17:31 -0700 Subject: [PATCH 151/298] Coverity fix --- src/internal.c | 6 ++- src/keys.c | 3 +- src/tls.c | 14 ++--- tests/api.c | 119 ++++++++++++++++++++++++++++++----------- tests/suites.c | 5 +- wolfcrypt/src/coding.c | 2 - wolfcrypt/src/evp.c | 2 - wolfcrypt/src/sha3.c | 10 ++++ wolfcrypt/test/test.c | 6 +-- 9 files changed, 117 insertions(+), 50 deletions(-) diff --git a/src/internal.c b/src/internal.c index c89a02843..1b9037edb 100644 --- a/src/internal.c +++ b/src/internal.c @@ -14809,7 +14809,9 @@ int ProcessReply(WOLFSSL* ssl) } if (IsEncryptionOn(ssl, 0)) { +#if defined(WOLFSSL_TLS13) || defined(WOLFSSL_EXTRA_ALERTS) int tooLong = 0; +#endif #ifdef WOLFSSL_TLS13 if (IsAtLeastTLSv1_3(ssl->version)) { @@ -14822,13 +14824,13 @@ int ProcessReply(WOLFSSL* ssl) if (!IsAtLeastTLSv1_3(ssl->version)) tooLong = ssl->curSize > MAX_TLS_CIPHER_SZ; #endif +#if defined(WOLFSSL_TLS13) || defined(WOLFSSL_EXTRA_ALERTS) if (tooLong) { WOLFSSL_MSG("Encrypted data too long"); -#if defined(WOLFSSL_TLS13) || defined(WOLFSSL_EXTRA_ALERTS) SendAlert(ssl, alert_fatal, record_overflow); -#endif return BUFFER_ERROR; } +#endif } ssl->keys.padSz = 0; diff --git a/src/keys.c b/src/keys.c index 4b4e6a43d..ca6dd4de3 100644 --- a/src/keys.c +++ b/src/keys.c @@ -3349,7 +3349,7 @@ int DeriveKeys(WOLFSSL* ssl) return MEMORY_E; } #endif - + XMEMSET(shaOutput, 0, WC_SHA_DIGEST_SIZE); ret = wc_InitMd5(md5); if (ret == 0) { ret = wc_InitSha(sha); @@ -3479,6 +3479,7 @@ static int MakeSslMasterSecret(WOLFSSL* ssl) return MEMORY_E; } #endif + XMEMSET(shaOutput, 0, WC_SHA_DIGEST_SIZE); ret = wc_InitMd5(md5); if (ret == 0) { diff --git a/src/tls.c b/src/tls.c index 61643f0c7..bb3285f06 100644 --- a/src/tls.c +++ b/src/tls.c @@ -1174,16 +1174,18 @@ int TLS_hmac(WOLFSSL* ssl, byte* digest, const byte* in, word32 sz, int padSz, Hmac hmac; byte myInner[WOLFSSL_TLS_HMAC_INNER_SZ]; int ret = 0; -#ifdef HAVE_TRUNCATED_HMAC - word32 hashSz = ssl->truncated_hmac ? (byte)TRUNCATED_HMAC_SZ - : ssl->specs.hash_size; -#else - word32 hashSz = ssl->specs.hash_size; -#endif + word32 hashSz = 0; if (ssl == NULL) return BAD_FUNC_ARG; +#ifdef HAVE_TRUNCATED_HMAC + hashSz = ssl->truncated_hmac ? (byte)TRUNCATED_HMAC_SZ + : ssl->specs.hash_size; +#else + hashSz = ssl->specs.hash_size; +#endif + #ifdef HAVE_FUZZER /* Fuzz "in" buffer with sz to be used in HMAC algorithm */ if (ssl->fuzzerCb) { diff --git a/tests/api.c b/tests/api.c index 0e9a59e5e..e3d4907b9 100644 --- a/tests/api.c +++ b/tests/api.c @@ -695,37 +695,43 @@ static void test_for_double_Free(void) if (skipTest != 1) { #ifndef NO_WOLFSSL_SERVER - AssertNotNull(ctx = wolfSSL_CTX_new(wolfSSLv23_server_method())); + ctx = wolfSSL_CTX_new(wolfSSLv23_server_method()); + AssertNotNull(ctx); #else - AssertNotNull(ctx = wolfSSL_CTX_new(wolfSSLv23_client_method())); + ctx = wolfSSL_CTX_new(wolfSSLv23_client_method()); + AssertNotNull(ctx); #endif AssertTrue(wolfSSL_CTX_use_certificate_file(ctx, testCertFile, WOLFSSL_FILETYPE_PEM)); AssertTrue(wolfSSL_CTX_use_PrivateKey_file(ctx, testKeyFile, WOLFSSL_FILETYPE_PEM)); - - AssertNotNull(ssl = wolfSSL_new(ctx)); + ssl = wolfSSL_new(ctx); + AssertNotNull(ssl); /* First test freeing SSL, then CTX */ wolfSSL_free(ssl); wolfSSL_CTX_free(ctx); #ifndef NO_WOLFSSL_CLIENT - AssertNotNull(ctx = wolfSSL_CTX_new(wolfSSLv23_client_method())); + ctx = wolfSSL_CTX_new(wolfSSLv23_client_method()); + AssertNotNull(ctx); #else - AssertNotNull(ctx = wolfSSL_CTX_new(wolfSSLv23_server_method())); + ctx = wolfSSL_CTX_new(wolfSSLv23_server_method()); + AssertNotNull(ctx); #endif AssertTrue(wolfSSL_CTX_use_certificate_file(ctx, testCertFile, WOLFSSL_FILETYPE_PEM)); AssertTrue(wolfSSL_CTX_use_PrivateKey_file(ctx, testKeyFile, WOLFSSL_FILETYPE_PEM)); - - AssertNotNull(ssl = wolfSSL_new(ctx)); + ssl = wolfSSL_new(ctx); + AssertNotNull(ssl); /* Next test freeing CTX then SSL */ wolfSSL_CTX_free(ctx); wolfSSL_free(ssl); #ifndef NO_WOLFSSL_SERVER - AssertNotNull(ctx = wolfSSL_CTX_new(wolfSSLv23_server_method())); + ctx = wolfSSL_CTX_new(wolfSSLv23_server_method()); + AssertNotNull(ctx); #else - AssertNotNull(ctx = wolfSSL_CTX_new(wolfSSLv23_client_method())); + ctx = wolfSSL_CTX_new(wolfSSLv23_client_method()); + AssertNotNull(ctx); #endif /* Test setting ciphers at ctx level */ AssertTrue(wolfSSL_CTX_use_certificate_file(ctx, testCertFile, WOLFSSL_FILETYPE_PEM)); @@ -736,13 +742,16 @@ static void test_for_double_Free(void) wolfSSL_free(ssl); #ifndef NO_WOLFSSL_CLIENT - AssertNotNull(ctx = wolfSSL_CTX_new(wolfSSLv23_client_method())); + ctx = wolfSSL_CTX_new(wolfSSLv23_client_method()); + AssertNotNull(ctx); #else - AssertNotNull(ctx = wolfSSL_CTX_new(wolfSSLv23_server_method())); + ctx = wolfSSL_CTX_new(wolfSSLv23_server_method()); + AssertNotNull(ctx); #endif AssertTrue(wolfSSL_CTX_use_certificate_file(ctx, testCertFile, WOLFSSL_FILETYPE_PEM)); AssertTrue(wolfSSL_CTX_use_PrivateKey_file(ctx, testKeyFile, WOLFSSL_FILETYPE_PEM)); - AssertNotNull(ssl = wolfSSL_new(ctx)); + ssl = wolfSSL_new(ctx); + AssertNotNull(ssl); /* test setting ciphers at SSL level */ AssertTrue(wolfSSL_set_cipher_list(ssl, optionsCiphers)); wolfSSL_CTX_free(ctx); @@ -1229,8 +1238,8 @@ static void test_wolfSSL_CTX_load_verify_locations_ex(void) WOLFSSL_CTX* ctx; const char* ca_cert = "./certs/ca-cert.pem"; const char* ca_expired_cert = "./certs/test/expired/expired-ca.pem"; - - AssertNotNull(ctx = wolfSSL_CTX_new(wolfSSLv23_client_method())); + ctx = wolfSSL_CTX_new(wolfSSLv23_client_method()); + AssertNotNull(ctx); /* test good CA */ AssertTrue(WOLFSSL_SUCCESS == @@ -1327,9 +1336,11 @@ static int test_wolfSSL_CTX_use_certificate_chain_file_format(void) WOLFSSL_CTX* ctx; #ifndef NO_WOLFSSL_CLIENT - AssertNotNull(ctx = wolfSSL_CTX_new(wolfSSLv23_client_method())); + ctx = wolfSSL_CTX_new(wolfSSLv23_client_method()); + AssertNotNull(ctx); #else - AssertNotNull(ctx = wolfSSL_CTX_new(wolfSSLv23_server_method())); + ctx = wolfSSL_CTX_new(wolfSSLv23_server_method()); + AssertNotNull(ctx); #endif AssertIntEQ(wolfSSL_CTX_use_certificate_chain_file_format(ctx, @@ -1404,9 +1415,11 @@ static void test_wolfSSL_CTX_SetMinMaxDhKey_Sz(void) WOLFSSL_CTX *ctx; #ifndef NO_WOLFSSL_CLIENT - AssertNotNull(ctx = wolfSSL_CTX_new(wolfSSLv23_client_method())); + ctx = wolfSSL_CTX_new(wolfSSLv23_client_method()); + AssertNotNull(ctx); #else - AssertNotNull(ctx = wolfSSL_CTX_new(wolfSSLv23_server_method())); + ctx = wolfSSL_CTX_new(wolfSSLv23_server_method()); + AssertNotNull(ctx); #endif AssertIntEQ(WOLFSSL_SUCCESS, wolfSSL_CTX_SetMinDhKey_Sz(ctx, 3072)); @@ -1500,8 +1513,8 @@ static void test_wolfSSL_CTX_enable_disable(void) #ifdef HAVE_EXTENDED_MASTER AssertIntEQ(wolfSSL_CTX_DisableExtendedMasterSecret(ctx), BAD_FUNC_ARG); #endif - - AssertNotNull(ctx = wolfSSL_CTX_new(wolfSSLv23_client_method())); + ctx = wolfSSL_CTX_new(wolfSSLv23_client_method()); + AssertNotNull(ctx); #ifdef HAVE_EXTENDED_MASTER AssertIntEQ(wolfSSL_CTX_DisableExtendedMasterSecret(ctx), WOLFSSL_SUCCESS); @@ -1686,21 +1699,24 @@ static void test_wolfSSL_SetMinMaxDhKey_Sz(void) #if !defined(NO_CERTS) && !defined(NO_DH) && !defined(NO_WOLFSSL_SERVER) WOLFSSL_CTX *ctx, *ctx2; WOLFSSL *ssl, *ssl2; - - AssertNotNull(ctx = wolfSSL_CTX_new(wolfSSLv23_server_method())); + ctx = wolfSSL_CTX_new(wolfSSLv23_server_method()); + AssertNotNull(ctx); AssertTrue(wolfSSL_CTX_use_certificate_buffer(ctx, server_cert_der_2048, sizeof_server_cert_der_2048, WOLFSSL_FILETYPE_ASN1)); AssertTrue(wolfSSL_CTX_use_PrivateKey_buffer(ctx, server_key_der_2048, sizeof_server_key_der_2048, WOLFSSL_FILETYPE_ASN1)); AssertIntEQ(WOLFSSL_SUCCESS, wolfSSL_CTX_SetMinDhKey_Sz(ctx, 3072)); - AssertNotNull(ssl = wolfSSL_new(ctx)); - AssertNotNull(ctx2 = wolfSSL_CTX_new(wolfSSLv23_server_method())); + ssl = wolfSSL_new(ctx); + AssertNotNull(ssl); + ctx2 = wolfSSL_CTX_new(wolfSSLv23_server_method()); + AssertNotNull(ctx2); AssertTrue(wolfSSL_CTX_use_certificate_buffer(ctx2, server_cert_der_2048, sizeof_server_cert_der_2048, WOLFSSL_FILETYPE_ASN1)); AssertTrue(wolfSSL_CTX_use_PrivateKey_buffer(ctx2, server_key_der_2048, sizeof_server_key_der_2048, WOLFSSL_FILETYPE_ASN1)); AssertIntEQ(WOLFSSL_SUCCESS, wolfSSL_CTX_SetMaxDhKey_Sz(ctx, 1024)); - AssertNotNull(ssl2 = wolfSSL_new(ctx2)); + ssl2 = wolfSSL_new(ctx2); + AssertNotNull(ssl2); AssertIntEQ(DH_KEY_SIZE_E, wolfSSL_SetTmpDH_buffer(ssl, dh_key_der_2048, sizeof_dh_key_der_2048, WOLFSSL_FILETYPE_ASN1)); @@ -2365,14 +2381,24 @@ static THREAD_RETURN WOLFSSL_THREAD test_server_nofail(void* args) /*err_sys("can't load ca file, Please run from wolfSSL home dir");*/ goto done; } +#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EITHER_SIDE) if (!sharedCtx && wolfSSL_CTX_use_certificate_file(ctx, svrCertFile, WOLFSSL_FILETYPE_PEM) != WOLFSSL_SUCCESS) { +#else + if (wolfSSL_CTX_use_certificate_file(ctx, svrCertFile, + WOLFSSL_FILETYPE_PEM) != WOLFSSL_SUCCESS) { +#endif /*err_sys("can't load server cert chain file, " "Please run from wolfSSL home dir");*/ goto done; } +#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EITHER_SIDE) if (!sharedCtx && wolfSSL_CTX_use_PrivateKey_file(ctx, svrKeyFile, WOLFSSL_FILETYPE_PEM) != WOLFSSL_SUCCESS) { +#else + if (wolfSSL_CTX_use_PrivateKey_file(ctx, svrKeyFile, + WOLFSSL_FILETYPE_PEM) != WOLFSSL_SUCCESS) { +#endif /*err_sys("can't load server key file, " "Please run from wolfSSL home dir");*/ goto done; @@ -2396,15 +2422,24 @@ static THREAD_RETURN WOLFSSL_THREAD test_server_nofail(void* args) wolfSSL_dtls_set_using_nonblock(ssl, 1); } #endif - +#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EITHER_SIDE) if (sharedCtx && wolfSSL_use_certificate_file(ssl, svrCertFile, WOLFSSL_FILETYPE_PEM) != WOLFSSL_SUCCESS) { +#else + if (wolfSSL_use_certificate_file(ssl, svrCertFile, + WOLFSSL_FILETYPE_PEM) != WOLFSSL_SUCCESS) { +#endif /*err_sys("can't load server cert chain file, " "Please run from wolfSSL home dir");*/ goto done; } +#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EITHER_SIDE) if (sharedCtx && wolfSSL_use_PrivateKey_file(ssl, svrKeyFile, WOLFSSL_FILETYPE_PEM) != WOLFSSL_SUCCESS) { +#else + if (wolfSSL_use_PrivateKey_file(ssl, svrKeyFile, + WOLFSSL_FILETYPE_PEM) != WOLFSSL_SUCCESS) { +#endif /*err_sys("can't load server key file, " "Please run from wolfSSL home dir");*/ goto done; @@ -2760,14 +2795,25 @@ static void test_client_nofail(void* args, void *cb) /* err_sys("can't load ca file, Please run from wolfSSL home dir");*/ goto done; } +#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EITHER_SIDE) if (!sharedCtx && wolfSSL_CTX_use_certificate_file(ctx, cliCertFile, WOLFSSL_FILETYPE_PEM) != WOLFSSL_SUCCESS) { +#else + if (wolfSSL_CTX_use_certificate_file(ctx, cliCertFile, + WOLFSSL_FILETYPE_PEM) != WOLFSSL_SUCCESS) { +#endif /*err_sys("can't load client cert file, " "Please run from wolfSSL home dir");*/ goto done; } +#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EITHER_SIDE) if (!sharedCtx && wolfSSL_CTX_use_PrivateKey_file(ctx, cliKeyFile, WOLFSSL_FILETYPE_PEM) != WOLFSSL_SUCCESS) { +#else + if (wolfSSL_CTX_use_PrivateKey_file(ctx, cliKeyFile, + WOLFSSL_FILETYPE_PEM) != WOLFSSL_SUCCESS) { +#endif + /*err_sys("can't load client key file, " "Please run from wolfSSL home dir");*/ goto done; @@ -2782,15 +2828,24 @@ static void test_client_nofail(void* args, void *cb) if (ssl == NULL) { goto done; } - +#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EITHER_SIDE) if (sharedCtx && wolfSSL_use_certificate_file(ssl, cliCertFile, WOLFSSL_FILETYPE_PEM) != WOLFSSL_SUCCESS) { +#else + if (wolfSSL_use_certificate_file(ssl, cliCertFile, + WOLFSSL_FILETYPE_PEM) != WOLFSSL_SUCCESS) { +#endif /*err_sys("can't load client cert file, " "Please run from wolfSSL home dir");*/ goto done; } +#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EITHER_SIDE) if (sharedCtx && wolfSSL_use_PrivateKey_file(ssl, cliKeyFile, WOLFSSL_FILETYPE_PEM) != WOLFSSL_SUCCESS) { +#else + if (wolfSSL_use_PrivateKey_file(ssl, cliKeyFile, + WOLFSSL_FILETYPE_PEM) != WOLFSSL_SUCCESS) { +#endif /*err_sys("can't load client key file, " "Please run from wolfSSL home dir");*/ goto done; @@ -16214,6 +16269,7 @@ static int test_wc_ecc_signVerify_hash (void) /* Init stack var */ XMEMSET(sig, 0, siglen); + XMEMSET(&key, 0, sizeof(ecc_key)); /* Init structs. */ ret = wc_InitRng(&rng); @@ -31645,10 +31701,11 @@ static void test_SetTmpEC_DHE_Sz(void) #if defined(HAVE_ECC) && !defined(NO_WOLFSSL_CLIENT) WOLFSSL_CTX *ctx; WOLFSSL *ssl; - - AssertNotNull(ctx = wolfSSL_CTX_new(wolfSSLv23_client_method())); + ctx = wolfSSL_CTX_new(wolfSSLv23_client_method()); + AssertNotNull(ctx); AssertIntEQ(WOLFSSL_SUCCESS, wolfSSL_CTX_SetTmpEC_DHE_Sz(ctx, 32)); - AssertNotNull(ssl = wolfSSL_new(ctx)); + ssl = wolfSSL_new(ctx); + AssertNotNull(ssl); AssertIntEQ(WOLFSSL_SUCCESS, wolfSSL_SetTmpEC_DHE_Sz(ssl, 32)); wolfSSL_free(ssl); diff --git a/tests/suites.c b/tests/suites.c index 43a023550..5e9bf81b7 100644 --- a/tests/suites.c +++ b/tests/suites.c @@ -673,6 +673,9 @@ int SuiteTest(int argc, char** argv) char argv0[3][80]; char* myArgv[3]; + (void)argc; + (void)argv; + printf(" Begin Cipher Suite Tests\n"); /* setup */ @@ -1026,6 +1029,4 @@ exit: #else return NOT_COMPILED_IN; #endif /* !NO_WOLFSSL_SERVER && !NO_WOLFSSL_CLIENT */ - (void)argc; - (void)argv; } diff --git a/wolfcrypt/src/coding.c b/wolfcrypt/src/coding.c index 2a8dcb418..5c4045b50 100644 --- a/wolfcrypt/src/coding.c +++ b/wolfcrypt/src/coding.c @@ -141,8 +141,6 @@ int Base64_Decode(const byte* in, word32 inLen, byte* out, word32* outLen) e4 = in[j++]; inLen--; - if (e1 == 0) /* end file 0's */ - break; if (e3 == PAD) pad3 = 1; if (e4 == PAD) diff --git a/wolfcrypt/src/evp.c b/wolfcrypt/src/evp.c index 0f5475cfd..44e4e71f6 100644 --- a/wolfcrypt/src/evp.c +++ b/wolfcrypt/src/evp.c @@ -4291,7 +4291,6 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) } #endif /* WOLFSSL_AES_256 */ #endif /* HAVE_AES_CBC */ -#if !defined(_WIN32) && !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) #ifdef HAVE_AESGCM #ifdef WOLFSSL_AES_128 if (ctx->cipherType == AES_128_GCM_TYPE || @@ -4366,7 +4365,6 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) } #endif /* WOLFSSL_AES_256 */ #endif /* HAVE_AESGCM */ -#endif /* !defined(_WIN32) && !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) */ #ifdef WOLFSSL_AES_COUNTER #ifdef WOLFSSL_AES_128 if (ctx->cipherType == AES_128_CTR_TYPE || diff --git a/wolfcrypt/src/sha3.c b/wolfcrypt/src/sha3.c index 3a0c8ddbb..78158b8f4 100644 --- a/wolfcrypt/src/sha3.c +++ b/wolfcrypt/src/sha3.c @@ -708,6 +708,11 @@ static int wc_Sha3Update(wc_Sha3* sha3, const byte* data, word32 len, byte p) return BAD_FUNC_ARG; } + if (data == NULL && len == 0) { + /* valid, but do nothing */ + return 0; + } + #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_SHA3) if (sha3->asyncDev.marker == WOLFSSL_ASYNC_MARKER_SHA3) { #if defined(HAVE_INTEL_QA) && defined(QAT_V2) @@ -1165,6 +1170,11 @@ int wc_Shake256_Update(wc_Shake* shake, const byte* data, word32 len) return BAD_FUNC_ARG; } + if (data == NULL && len == 0) { + /* valid, but do nothing */ + return 0; + } + return Sha3Update(shake, data, len, WC_SHA3_256_COUNT); } diff --git a/wolfcrypt/test/test.c b/wolfcrypt/test/test.c index 4e4bbbe48..e6eac70d9 100644 --- a/wolfcrypt/test/test.c +++ b/wolfcrypt/test/test.c @@ -3323,8 +3323,6 @@ int hash_test(void) } hashType = wc_OidGetHash(ret); - if (exp_ret < 0 && ret != exp_ret) - return -3338 - i; if (exp_ret == 0 && hashType != typesGood[i]) return -3348 - i; #endif /* !defined(NO_ASN) || !defined(NO_DH) || defined(HAVE_ECC) */ @@ -18312,7 +18310,7 @@ static int ecc_test_make_pub(WC_RNG* rng) ret = wc_AsyncWait(ret, &key.asyncDev, WC_ASYNC_FLAG_CALL_AGAIN); #endif if (ret == 0) - ret = wc_ecc_sign_hash(msg, sizeof(msg), tmp, &tmpSz, rng, &key); + ret = wc_ecc_sign_hash(msg, XSTRLEN((const char* )msg), tmp, &tmpSz, rng, &key); } while (ret == WC_PENDING_E); if (ret != 0) { ERROR_OUT(-9629, done); @@ -18327,7 +18325,7 @@ static int ecc_test_make_pub(WC_RNG* rng) ret = wc_AsyncWait(ret, &key.asyncDev, WC_ASYNC_FLAG_CALL_AGAIN); #endif if (ret == 0) - ret = wc_ecc_verify_hash(tmp, tmpSz, msg, sizeof(msg), &verify, &key); + ret = wc_ecc_verify_hash(tmp, tmpSz, msg, XSTRLEN((const char* )msg), &verify, &key); } while (ret == WC_PENDING_E); if (ret != 0) { ERROR_OUT(-9630, done); From 0d1ed9efc7b1cd266406076fbcc804c5535d5095 Mon Sep 17 00:00:00 2001 From: Sean Parkinson Date: Wed, 3 Jun 2020 12:48:31 +1000 Subject: [PATCH 152/298] TLS 1.3: Never send CertiifcateRequest when PSK Server must not send a CertificateRequest when authenticating with a PSK. Increase the max size of the signature algorithms as ED448 has been added. --- src/tls13.c | 2 ++ wolfssl/internal.h | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/tls13.c b/src/tls13.c index 9b9b1d1b9..0227b864b 100644 --- a/src/tls13.c +++ b/src/tls13.c @@ -3711,6 +3711,8 @@ static int DoPreSharedKeys(WOLFSSL* ssl, const byte* input, word32 helloSz, /* Default to ciphersuite if cb doesn't specify. */ ssl->options.resuming = 0; + /* Don't send certificate request when using PSK. */ + ssl->options.verifyPeer = 0; /* PSK age is always zero. */ if (current->ticketAge != ssl->session.ticketAdd) diff --git a/wolfssl/internal.h b/wolfssl/internal.h index 75586e475..a66dfc58e 100644 --- a/wolfssl/internal.h +++ b/wolfssl/internal.h @@ -1515,7 +1515,7 @@ enum Misc { /* number of items in the signature algo list */ #ifndef WOLFSSL_MAX_SIGALGO - #define WOLFSSL_MAX_SIGALGO 32 + #define WOLFSSL_MAX_SIGALGO 36 #endif From 6176f8537f1af6bcab71a931bf5b1c6905e7fc74 Mon Sep 17 00:00:00 2001 From: Tesfa Mael Date: Tue, 2 Jun 2020 22:06:14 -0700 Subject: [PATCH 153/298] Typecast to fix conversion loses --- wolfcrypt/test/test.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wolfcrypt/test/test.c b/wolfcrypt/test/test.c index e6eac70d9..59f828e70 100644 --- a/wolfcrypt/test/test.c +++ b/wolfcrypt/test/test.c @@ -18310,7 +18310,7 @@ static int ecc_test_make_pub(WC_RNG* rng) ret = wc_AsyncWait(ret, &key.asyncDev, WC_ASYNC_FLAG_CALL_AGAIN); #endif if (ret == 0) - ret = wc_ecc_sign_hash(msg, XSTRLEN((const char* )msg), tmp, &tmpSz, rng, &key); + ret = wc_ecc_sign_hash(msg, (word32)XSTRLEN((const char* )msg), tmp, &tmpSz, rng, &key); } while (ret == WC_PENDING_E); if (ret != 0) { ERROR_OUT(-9629, done); @@ -18325,7 +18325,7 @@ static int ecc_test_make_pub(WC_RNG* rng) ret = wc_AsyncWait(ret, &key.asyncDev, WC_ASYNC_FLAG_CALL_AGAIN); #endif if (ret == 0) - ret = wc_ecc_verify_hash(tmp, tmpSz, msg, XSTRLEN((const char* )msg), &verify, &key); + ret = wc_ecc_verify_hash(tmp, tmpSz, msg, (word32)XSTRLEN((const char* )msg), &verify, &key); } while (ret == WC_PENDING_E); if (ret != 0) { ERROR_OUT(-9630, done); From 1c1a01fffe4a63916894bb85a70a87953160f459 Mon Sep 17 00:00:00 2001 From: Chris Conlon Date: Wed, 3 Jun 2020 14:11:12 -0600 Subject: [PATCH 154/298] rename dup to resolve NetBSD global shadow warnings --- src/ssl.c | 86 +++++++++++++++++++++++++++---------------------------- 1 file changed, 43 insertions(+), 43 deletions(-) diff --git a/src/ssl.c b/src/ssl.c index c65d0cb91..149f164e8 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -22551,7 +22551,7 @@ WOLFSSL_STACK* wolfSSL_X509_STORE_CTX_get_chain(WOLFSSL_X509_STORE_CTX* ctx) WOLFSSL_STACK* wolfSSL_sk_X509_dup(WOLFSSL_STACK* sk) { unsigned long i; - WOLFSSL_STACK* dup = NULL; + WOLFSSL_STACK* copy = NULL; WOLFSSL_STACK* node = NULL; WOLFSSL_STACK *dIdx = NULL, *sIdx = sk; @@ -22565,7 +22565,7 @@ WOLFSSL_STACK* wolfSSL_sk_X509_dup(WOLFSSL_STACK* sk) DYNAMIC_TYPE_X509); if (node == NULL) { if (i != 0) { - wolfSSL_sk_free(dup); + wolfSSL_sk_free(copy); } WOLFSSL_MSG("Memory error"); return NULL; @@ -22578,7 +22578,7 @@ WOLFSSL_STACK* wolfSSL_sk_X509_dup(WOLFSSL_STACK* sk) /* insert node into list, progress idx */ if (i == 0) { - dup = node; + copy = node; } else { dIdx->next = node; } @@ -22587,7 +22587,7 @@ WOLFSSL_STACK* wolfSSL_sk_X509_dup(WOLFSSL_STACK* sk) sIdx = sIdx->next; } - return dup; + return copy; } @@ -22597,7 +22597,7 @@ WOLFSSL_STACK* wolfSSL_X509_STORE_CTX_get1_chain(WOLFSSL_X509_STORE_CTX* ctx) { unsigned long i; WOLFSSL_STACK* ref; - WOLFSSL_STACK* dup; + WOLFSSL_STACK* copy; if (ctx == NULL) { return NULL; @@ -22610,14 +22610,14 @@ WOLFSSL_STACK* wolfSSL_X509_STORE_CTX_get1_chain(WOLFSSL_X509_STORE_CTX* ctx) } /* create duplicate of ctx chain */ - dup = wolfSSL_sk_X509_dup(ref); - if (dup == NULL) { + copy = wolfSSL_sk_X509_dup(ref); + if (copy == NULL) { return NULL; } /* increase ref counts of inner data X509 */ - ref = dup; - for (i = 0; i < dup->num && ref != NULL; i++) { + ref = copy; + for (i = 0; i < copy->num && ref != NULL; i++) { if (wc_LockMutex(&ref->data.x509->refMutex) != 0) { WOLFSSL_MSG("Failed to lock x509 mutex"); } @@ -22626,7 +22626,7 @@ WOLFSSL_STACK* wolfSSL_X509_STORE_CTX_get1_chain(WOLFSSL_X509_STORE_CTX* ctx) ref = ref->next; } - return dup; + return copy; } @@ -23530,34 +23530,34 @@ void wolfSSL_ASN1_INTEGER_free(WOLFSSL_ASN1_INTEGER* in) */ WOLFSSL_ASN1_INTEGER* wolfSSL_ASN1_INTEGER_dup(const WOLFSSL_ASN1_INTEGER* src) { - WOLFSSL_ASN1_INTEGER* dup; + WOLFSSL_ASN1_INTEGER* copy; WOLFSSL_ENTER("wolfSSL_ASN1_INTEGER_dup"); if (!src) return NULL; - dup = wolfSSL_ASN1_INTEGER_new(); + copy = wolfSSL_ASN1_INTEGER_new(); - if (dup == NULL) + if (copy == NULL) return NULL; - dup->negative = src->negative; - dup->dataMax = src->dataMax; - dup->isDynamic = src->isDynamic; + copy->negative = src->negative; + copy->dataMax = src->dataMax; + copy->isDynamic = src->isDynamic; #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT) - dup->length = src->length; + copy->length = src->length; #endif - XSTRNCPY((char*)dup->intData,(const char*)src->intData,WOLFSSL_ASN1_INTEGER_MAX); + XSTRNCPY((char*)copy->intData,(const char*)src->intData,WOLFSSL_ASN1_INTEGER_MAX); - if (dup->isDynamic && src->data && dup->dataMax) { - dup->data = (unsigned char*) + if (copy->isDynamic && src->data && copy->dataMax) { + copy->data = (unsigned char*) XMALLOC(src->dataMax,NULL,DYNAMIC_TYPE_OPENSSL); - if (dup->data == NULL) { - wolfSSL_ASN1_INTEGER_free(dup); + if (copy->data == NULL) { + wolfSSL_ASN1_INTEGER_free(copy); return NULL; } - XMEMCPY(dup->data,src->data,dup->dataMax); + XMEMCPY(copy->data, src->data, copy->dataMax); } - return dup; + return copy; } @@ -36260,7 +36260,7 @@ void* wolfSSL_GetDhAgreeCtx(WOLFSSL* ssl) Returns a new WOLFSSL_X509_NAME structure or NULL on failure */ WOLFSSL_X509_NAME* wolfSSL_X509_NAME_dup(WOLFSSL_X509_NAME *name) { - WOLFSSL_X509_NAME* dup = NULL; + WOLFSSL_X509_NAME* copy = NULL; WOLFSSL_ENTER("wolfSSL_X509_NAME_dup"); @@ -36269,50 +36269,50 @@ void* wolfSSL_GetDhAgreeCtx(WOLFSSL* ssl) return NULL; } - if (!(dup = wolfSSL_X509_NAME_new())) { + if (!(copy = wolfSSL_X509_NAME_new())) { return NULL; } /* copy contents */ - XMEMCPY(dup, name, sizeof(WOLFSSL_X509_NAME)); - InitX509Name(dup, 1); - dup->sz = name->sz; + XMEMCPY(copy, name, sizeof(WOLFSSL_X509_NAME)); + InitX509Name(copy, 1); + copy->sz = name->sz; /* handle dynamic portions */ if (name->dynamicName) { - if (!(dup->name = (char*)XMALLOC(name->sz, 0, + if (!(copy->name = (char*)XMALLOC(name->sz, 0, DYNAMIC_TYPE_OPENSSL))) { goto err; } } - XMEMCPY(dup->name, name->name, name->sz); + XMEMCPY(copy->name, name->name, name->sz); #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) && \ !defined(NO_ASN) - if (!(dup->fullName.fullName = (char*)XMALLOC(name->fullName.fullNameLen, + if (!(copy->fullName.fullName = (char*)XMALLOC(name->fullName.fullNameLen, 0, DYNAMIC_TYPE_OPENSSL))) { goto err; } - XMEMCPY(dup->fullName.fullName, name->fullName.fullName, + XMEMCPY(copy->fullName.fullName, name->fullName.fullName, name->fullName.fullNameLen); #endif - return dup; + return copy; err: - if (dup) { - if (dup->dynamicName && dup->name) { - XFREE(dup->name, 0, DYNAMIC_TYPE_OPENSSL); - dup->name = NULL; + if (copy) { + if (copy->dynamicName && copy->name) { + XFREE(copy->name, 0, DYNAMIC_TYPE_OPENSSL); + copy->name = NULL; } #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) && \ !defined(NO_ASN) - if (dup->fullName.fullName && - dup->fullName.fullName != name->fullName.fullName) { - XFREE(dup->fullName.fullName, 0, DYNAMIC_TYPE_OPENSSL); - dup->fullName.fullName = NULL; + if (copy->fullName.fullName && + copy->fullName.fullName != name->fullName.fullName) { + XFREE(copy->fullName.fullName, 0, DYNAMIC_TYPE_OPENSSL); + copy->fullName.fullName = NULL; } #endif - wolfSSL_X509_NAME_free(dup); + wolfSSL_X509_NAME_free(copy); } return NULL; } From 504b88785196d5a0e2a3d7382ca2ec6dc7b2e51f Mon Sep 17 00:00:00 2001 From: Chris Conlon Date: Wed, 3 Jun 2020 14:14:43 -0600 Subject: [PATCH 155/298] fix NetBSD warnings in ASN1_INTEGER_set() tests around int max/min --- tests/api.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/api.c b/tests/api.c index 0e9a59e5e..bdf7c0104 100644 --- a/tests/api.c +++ b/tests/api.c @@ -31034,16 +31034,16 @@ static void test_wolfSSL_ASN1_INTEGER_set() wolfSSL_ASN1_INTEGER_free(a); #ifndef TIME_T_NOT_64BIT - /* 2147483648 */ + /* int max (2147483647) */ a = wolfSSL_ASN1_INTEGER_new(); - val = 2147483648; + val = 2147483647; ret = ASN1_INTEGER_set(a, val); AssertIntEQ(ret, 1); wolfSSL_ASN1_INTEGER_free(a); - /* -2147483648 */ + /* int min (-2147483648) */ a = wolfSSL_ASN1_INTEGER_new(); - val = -2147483648; + val = -2147483647 - 1; ret = ASN1_INTEGER_set(a, val); AssertIntEQ(a->negative, 1); AssertIntEQ(ret, 1); From cafcaa41819e97c38d3c5fd0a6e78f5808836557 Mon Sep 17 00:00:00 2001 From: Chris Conlon Date: Wed, 3 Jun 2020 14:24:10 -0600 Subject: [PATCH 156/298] enable SNI by default for JNI/JSSE build --- configure.ac | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/configure.ac b/configure.ac index 2b4effa89..dd3eb4f15 100644 --- a/configure.ac +++ b/configure.ac @@ -3515,6 +3515,11 @@ then ENABLED_CERTGEN="yes" AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_CERT_GEN" fi + if test "x$ENABLED_SNI" = "xno" + then + ENABLED_SNI="yes" + AM_CFLAGS="$AM_CFLAGS -DHAVE_TLS_EXTENSIONS -DHAVE_SNI" + fi fi # lighty Support From d000ceb4958622f4b4d4daab0d92d2239c5b275b Mon Sep 17 00:00:00 2001 From: Tesfa Mael Date: Wed, 3 Jun 2020 13:42:37 -0700 Subject: [PATCH 157/298] Resolve Warnings --- tests/suites.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/tests/suites.c b/tests/suites.c index 5e9bf81b7..cdec52a2d 100644 --- a/tests/suites.c +++ b/tests/suites.c @@ -673,9 +673,6 @@ int SuiteTest(int argc, char** argv) char argv0[3][80]; char* myArgv[3]; - (void)argc; - (void)argv; - printf(" Begin Cipher Suite Tests\n"); /* setup */ @@ -1028,5 +1025,7 @@ exit: return args.return_code; #else return NOT_COMPILED_IN; + (void)argc; + (void)argv; #endif /* !NO_WOLFSSL_SERVER && !NO_WOLFSSL_CLIENT */ } From 0b9d06e529beef666bfd07ae4129d50cdad80238 Mon Sep 17 00:00:00 2001 From: Chris Conlon Date: Wed, 3 Jun 2020 14:45:31 -0600 Subject: [PATCH 158/298] return value from FailTestCallBack to prevent NetBSD noreturn warning --- tests/api.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/tests/api.c b/tests/api.c index bdf7c0104..a50249bc8 100644 --- a/tests/api.c +++ b/tests/api.c @@ -4869,16 +4869,21 @@ static void test_wolfSSL_PKCS12(void) #if !defined(NO_FILESYSTEM) && !defined(NO_ASN) && defined(HAVE_PKCS8) \ && defined(HAVE_ECC) && defined(WOLFSSL_ENCRYPTED_KEYS) + +/* used to keep track if FailTestCallback was called */ +static int failTestCallbackCalled = 0; + static WC_INLINE int FailTestCallBack(char* passwd, int sz, int rw, void* userdata) { (void)passwd; (void)sz; (void)rw; (void)userdata; - Fail(("Password callback should not be called by default"), - ("Password callback was called without attempting " - "to first decipher private key without password.")); - return 0; + + /* mark called, test_wolfSSL_no_password_cb() will check and fail if set */ + failTestCallbackCalled = 1; + + return -1; } #endif @@ -4918,6 +4923,12 @@ static void test_wolfSSL_no_password_cb(void) wolfSSL_CTX_free(ctx); + if (failTestCallbackCalled != 0) { + Fail(("Password callback should not be called by default"), + ("Password callback was called without attempting " + "to first decipher private key without password.")); +} + printf(resultFmt, passed); #endif } From 4b10f6aa03cabe8593f87057b6e76ff38b2a20f9 Mon Sep 17 00:00:00 2001 From: Eric Blankenhorn Date: Wed, 3 Jun 2020 15:56:46 -0500 Subject: [PATCH 159/298] Update from review --- wolfcrypt/src/asn.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wolfcrypt/src/asn.c b/wolfcrypt/src/asn.c index 598d3074c..421fbeaf8 100644 --- a/wolfcrypt/src/asn.c +++ b/wolfcrypt/src/asn.c @@ -17444,10 +17444,10 @@ int ParseCRL(DecodedCRL* dcrl, const byte* buff, word32 sz, void* cm) return ASN_PARSE_E; dcrl->sigIndex = len + idx; - if (ParseCRL_CertList(dcrl, buff, &idx, sz) < 0) + if (ParseCRL_CertList(dcrl, buff, &idx, dcrl->sigIndex) < 0) return ASN_PARSE_E; - if (ParseCRL_Extensions(dcrl, buff, &idx, sz) < 0) + if (ParseCRL_Extensions(dcrl, buff, &idx, dcrl->sigIndex) < 0) return ASN_PARSE_E; idx = dcrl->sigIndex; From 5a4d84ecad5e562e9afe795fd829522f4f59e113 Mon Sep 17 00:00:00 2001 From: kaleb-himes Date: Wed, 3 Jun 2020 16:19:34 -0600 Subject: [PATCH 160/298] Consolidate to one-line where possible --- src/ssl.c | 30 ++++++++++-------------------- tests/api.c | 20 +++++++------------- wolfcrypt/src/asn.c | 13 ++++++------- wolfcrypt/src/evp.c | 6 ++---- 4 files changed, 25 insertions(+), 44 deletions(-) diff --git a/src/ssl.c b/src/ssl.c index 606540731..df73460bd 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -18553,8 +18553,7 @@ int wolfSSL_DH_check(const WOLFSSL_DH *dh, int *codes) return WOLFSSL_SUCCESS; } -#if !defined(HAVE_FIPS) || \ - ( defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2) ) +#if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2)) /* Converts DER encoded DH parameters to a WOLFSSL_DH structure. * * dh : structure to copy DH parameters into. @@ -28579,8 +28578,7 @@ void wolfSSL_DH_free(WOLFSSL_DH* dh) } } -#if !defined(HAVE_FIPS) || \ - ( defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2) ) +#if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2)) int SetDhInternal(WOLFSSL_DH* dh) { int ret = WOLFSSL_FATAL_ERROR; @@ -29123,8 +29121,7 @@ WOLFSSL_BIGNUM* wolfSSL_DH_8192_prime(WOLFSSL_BIGNUM* bn) return bn; } -#if !defined(HAVE_FIPS) || \ - ( defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2) ) +#if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2)) /* return code compliant with OpenSSL : * 1 if success, 0 if error */ @@ -32629,8 +32626,7 @@ int wolfSSL_ECPoint_i2d(const WOLFSSL_EC_GROUP *group, return WOLFSSL_SUCCESS; } -#if !defined(HAVE_FIPS) || \ - ( defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2) ) +#if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2)) /* return code compliant with OpenSSL : * 1 if success, 0 if error */ @@ -32976,8 +32972,7 @@ int wolfSSL_EC_POINT_set_affine_coordinates_GFp(const WOLFSSL_EC_GROUP *group, #if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) && \ !defined(HAVE_SELFTEST) -#if !defined(HAVE_FIPS) || \ - ( defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2) ) +#if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2)) /* Calculate the value: generator * n + q * m * return code compliant with OpenSSL : * 1 if success, 0 if error @@ -33241,8 +33236,7 @@ int wolfSSL_EC_POINT_is_at_infinity(const WOLFSSL_EC_GROUP *group, /* End EC_POINT */ -#if !defined(HAVE_FIPS) || \ - ( defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2) ) +#if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2)) size_t wolfSSL_EC_get_builtin_curves(WOLFSSL_EC_BUILTIN_CURVE *r, size_t nitems) { size_t i, min_nitems; @@ -35021,8 +35015,7 @@ int wolfSSL_RSA_LoadDer_ex(WOLFSSL_RSA* rsa, const unsigned char* derBuf, #if defined(WC_RSA_PSS) && (defined(OPENSSL_ALL) || defined(WOLFSSL_ASIO) || \ defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_NGINX)) -#if !defined(HAVE_FIPS) || \ - ( defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2) ) +#if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2)) static int hash2mgf(enum wc_HashType hType) { switch (hType) { @@ -35576,8 +35569,7 @@ int wolfSSL_EC_KEY_LoadDer_ex(WOLFSSL_EC_KEY* key, const unsigned char* derBuf, #if !defined(NO_DH) && (defined(WOLFSSL_QT) || defined(OPENSSL_ALL) || defined(WOLFSSL_OPENSSH)) /* return WOLFSSL_SUCCESS if success, WOLFSSL_FATAL_ERROR if error */ -#if !defined(HAVE_FIPS) || \ - ( defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2) ) +#if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2)) int wolfSSL_DH_LoadDer(WOLFSSL_DH* dh, const unsigned char* derBuf, int derSz) { word32 idx = 0; @@ -39679,8 +39671,7 @@ WOLFSSL_BIO* wolfSSL_BIO_new_fp(XFILE fp, int close_flag) #ifndef NO_DH -#if !defined(HAVE_FIPS) || \ - ( defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2) ) +#if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2)) WOLFSSL_DH *wolfSSL_PEM_read_bio_DHparams(WOLFSSL_BIO *bio, WOLFSSL_DH **x, pem_password_cb *cb, void *u) { @@ -39896,8 +39887,7 @@ int wc_DhParamsToDer(DhKey* key, byte* out, word32* outSz) return idx; } -#if !defined(HAVE_FIPS) || \ - ( defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2) ) +#if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2)) int wc_DhPubKeyToDer(DhKey* key, byte* out, word32* outSz) { word32 sz = 0; diff --git a/tests/api.c b/tests/api.c index c9d05de87..3e6f82487 100644 --- a/tests/api.c +++ b/tests/api.c @@ -1786,9 +1786,8 @@ static int test_wolfSSL_SetMinVersion(void) EC_GROUP_new_by_curve_name, EC_GROUP_order_bits */ -# if defined(OPENSSL_EXTRA) && ( !defined(HAVE_FIPS) || \ - ( defined(HAVE_FIPS_VERSION) && \ - (HAVE_FIPS_VERSION > 2) ) ) +# if defined(OPENSSL_EXTRA) && \ + (!defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2))) static void test_wolfSSL_EC(void) { #if defined(HAVE_ECC) @@ -28048,8 +28047,7 @@ static void test_wolfSSL_OBJ_ln(void) AssertIntEQ(OBJ_ln2nid(NULL), NID_undef); #ifdef HAVE_ECC -#if !defined(HAVE_FIPS) || \ - ( defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2) ) +#if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2)) { int nCurves = 27; EC_builtin_curve r[nCurves]; @@ -28718,8 +28716,7 @@ static void test_wolfSSL_RSA_padding_add_PKCS1_PSS(void) static void test_wolfSSL_EC_get_builtin_curves(void) { #if defined(HAVE_ECC) && (defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)) -#if !defined(HAVE_FIPS) || \ - ( defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2) ) +#if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2)) EC_builtin_curve* curves = NULL; size_t crv_len = 0; size_t i = 0; @@ -29298,8 +29295,7 @@ static void test_wolfSSL_EVP_PKEY_sign(void) { #if defined(OPENSSL_EXTRA) && !defined(NO_RSA) && defined(WOLFSSL_KEY_GEN) && \ !defined(HAVE_FAST_RSA) && !defined(HAVE_SELFTEST) -#if !defined(HAVE_FIPS) || \ - (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2) ) +#if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2)) WOLFSSL_RSA* rsa = NULL; WOLFSSL_EVP_PKEY* pkey = NULL; WOLFSSL_EVP_PKEY_CTX* ctx = NULL; @@ -29383,8 +29379,7 @@ static void test_EVP_PKEY_rsa(void) static void test_EVP_PKEY_ec(void) { #if defined(OPENSSL_EXTRA) && defined(HAVE_ECC) -#if !defined(HAVE_FIPS) || \ - ( defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2) ) +#if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2)) WOLFSSL_EC_KEY* ecKey; WOLFSSL_EVP_PKEY* pkey; @@ -32429,8 +32424,7 @@ void ApiTest(void) /*wolfSSL_EVP_get_cipherbynid test*/ test_wolfSSL_EVP_get_cipherbynid(); test_wolfSSL_EVP_CIPHER_CTX(); -#if !defined(HAVE_FIPS) || \ - ( defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2) ) +#if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2)) test_wolfSSL_EC(); #endif test_wolfSSL_ECDSA_SIG(); diff --git a/wolfcrypt/src/asn.c b/wolfcrypt/src/asn.c index 623bca885..dae711e18 100644 --- a/wolfcrypt/src/asn.c +++ b/wolfcrypt/src/asn.c @@ -141,7 +141,6 @@ extern int wc_InitRsaHw(RsaKey* key); }; #endif #endif - #ifdef WOLFSSL_RENESAS_TSIP_TLS void tsip_inform_key_position(const word32 key_n_start, const word32 key_n_len, const word32 key_e_start, @@ -4399,8 +4398,8 @@ int wc_DhKeyDecode(const byte* input, word32* inOutIdx, DhKey* key, word32 inSz) int ret = 0; int length; #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL) - #if !defined(HAVE_FIPS) || \ - ( defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2) ) + #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && \ + (HAVE_FIPS_VERSION>2)) word32 oid = 0, temp = 0; #endif #endif @@ -4413,8 +4412,8 @@ int wc_DhKeyDecode(const byte* input, word32* inOutIdx, DhKey* key, word32 inSz) if (GetSequence(input, inOutIdx, &length, inSz) < 0) return ASN_PARSE_E; #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL) - #if !defined(HAVE_FIPS) || \ - ( defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2) ) + #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && \ + (HAVE_FIPS_VERSION>2)) temp = *inOutIdx; #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */ #endif @@ -4426,8 +4425,8 @@ int wc_DhKeyDecode(const byte* input, word32* inOutIdx, DhKey* key, word32 inSz) } #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL) - #if !defined(HAVE_FIPS) || \ - ( defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2) ) + #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && \ + (HAVE_FIPS_VERSION>2)) /* If ASN_DH_KEY_E: Check if input started at beginning of key */ if (ret == ASN_DH_KEY_E) { /* rewind back to after the first sequence */ diff --git a/wolfcrypt/src/evp.c b/wolfcrypt/src/evp.c index d8a54df03..2fc0129bb 100644 --- a/wolfcrypt/src/evp.c +++ b/wolfcrypt/src/evp.c @@ -1343,8 +1343,7 @@ int wolfSSL_EVP_PKEY_derive_set_peer(WOLFSSL_EVP_PKEY_CTX *ctx, WOLFSSL_EVP_PKEY } #if !defined(NO_DH) && defined(HAVE_ECC) -#if !defined(HAVE_FIPS) || \ - ( defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2) ) +#if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2)) int wolfSSL_EVP_PKEY_derive(WOLFSSL_EVP_PKEY_CTX *ctx, unsigned char *key, size_t *keylen) { int len; @@ -5896,8 +5895,7 @@ WOLFSSL_EC_KEY* wolfSSL_EVP_PKEY_get1_EC_KEY(WOLFSSL_EVP_PKEY* key) #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT) #if !defined(NO_DH) && !defined(NO_FILESYSTEM) -#if !defined(HAVE_FIPS) || \ - ( defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2) ) +#if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2)) /* with set1 functions the pkey struct does not own the DH structure * Build the following DH Key format from the passed in WOLFSSL_DH * then store in WOLFSSL_EVP_PKEY in DER format. From 8c3f7a77cae651ff5c04ee6b1e6620586093dd63 Mon Sep 17 00:00:00 2001 From: kaleb-himes Date: Wed, 3 Jun 2020 15:47:02 -0600 Subject: [PATCH 161/298] cleanup GET messages --- examples/client/client.c | 26 +++++++++++++++----------- examples/server/server.c | 4 ++-- 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/examples/client/client.c b/examples/client/client.c index ab4f7ae5c..6b048698b 100644 --- a/examples/client/client.c +++ b/examples/client/client.c @@ -1371,6 +1371,9 @@ static void Usage(void) #endif } +#define MSG32 32 +#define GETMSGSZ 29 + THREAD_RETURN WOLFSSL_THREAD client_test(void* args) { SOCKET_T sockfd = WOLFSSL_SOCKET_INVALID; @@ -1385,11 +1388,11 @@ THREAD_RETURN WOLFSSL_THREAD client_test(void* args) int flatSessionSz = 0; #ifndef WOLFSSL_ALT_TEST_STRINGS - char msg[32] = "hello wolfssl!"; /* GET may make bigger */ - char resumeMsg[32] = "resuming wolfssl!"; + char msg[MSG32] = "hello wolfssl!"; /* GET may make bigger */ + char resumeMsg[MSG32] = "resuming wolfssl!"; #else - char msg[32] = "hello wolfssl!\n"; - char resumeMsg[32] = "resuming wolfssl!\n"; + char msg[MSG32] = "hello wolfssl!\n"; + char resumeMsg[MSG32] = "resuming wolfssl!\n"; #endif char reply[128]; @@ -2737,8 +2740,8 @@ THREAD_RETURN WOLFSSL_THREAD client_test(void* args) if (doMcast) { #ifdef WOLFSSL_MULTICAST byte pms[512]; /* pre master secret */ - byte cr[32]; /* client random */ - byte sr[32]; /* server random */ + byte cr[MSG32]; /* client random */ + byte sr[MSG32]; /* server random */ const byte suite[2] = {0, 0xfe}; /* WDM_WITH_NULL_SHA256 */ XMEMSET(pms, 0x23, sizeof(pms)); @@ -3075,13 +3078,14 @@ THREAD_RETURN WOLFSSL_THREAD client_test(void* args) if (sendGET) { printf("SSL connect ok, sending GET...\n"); - msgSz = sizeof("GET /index.html HTTP/1.0\r\n\r\n"); - XSTRNCPY(msg, "GET /index.html HTTP/1.0\r\n\r\n", msgSz); - msg[msgSz] = '\0'; + char msgGet[GETMSGSZ] = "GET /index.html HTTP/1.0\r\n\r\n"; + XMEMSET(msg, 0, MSG32); + XMEMSET(resumeMsg, 0, MSG32); + msgSz = GETMSGSZ-1; + XSTRNCPY(msg, msgGet, msgSz); resumeSz = msgSz; - XSTRNCPY(resumeMsg, "GET /index.html HTTP/1.0\r\n\r\n", resumeSz); - resumeMsg[resumeSz] = '\0'; + XSTRNCPY(resumeMsg, msgGet, resumeSz); } /* allow some time for exporting the session */ diff --git a/examples/server/server.c b/examples/server/server.c index 192c03a72..aea9ec29b 100644 --- a/examples/server/server.c +++ b/examples/server/server.c @@ -2404,11 +2404,11 @@ THREAD_RETURN WOLFSSL_THREAD server_test(void* args) /* Write data */ if (!useWebServerMsg) { write_msg = msg; - write_msg_sz = sizeof(msg); + write_msg_sz = XSTRLEN(msg); } else { write_msg = webServerMsg; - write_msg_sz = sizeof(webServerMsg); + write_msg_sz = XSTRLEN(webServerMsg); } ServerWrite(ssl, write_msg, write_msg_sz); From 923fc30043da7f83674a1d437d16829f58a7e9db Mon Sep 17 00:00:00 2001 From: kaleb-himes Date: Wed, 3 Jun 2020 17:10:07 -0600 Subject: [PATCH 162/298] Change to memcpy --- examples/client/client.c | 7 ++++--- examples/server/server.c | 4 ++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/examples/client/client.c b/examples/client/client.c index 6b048698b..0b2f22d6f 100644 --- a/examples/client/client.c +++ b/examples/client/client.c @@ -3077,15 +3077,16 @@ THREAD_RETURN WOLFSSL_THREAD client_test(void* args) #endif /* HAVE_SECURE_RENEGOTIATION */ if (sendGET) { - printf("SSL connect ok, sending GET...\n"); char msgGet[GETMSGSZ] = "GET /index.html HTTP/1.0\r\n\r\n"; + printf("SSL connect ok, sending GET...\n"); + XMEMSET(msg, 0, MSG32); XMEMSET(resumeMsg, 0, MSG32); msgSz = GETMSGSZ-1; - XSTRNCPY(msg, msgGet, msgSz); + XMEMCPY(msg, msgGet, msgSz); resumeSz = msgSz; - XSTRNCPY(resumeMsg, msgGet, resumeSz); + XMEMCPY(resumeMsg, msgGet, resumeSz); } /* allow some time for exporting the session */ diff --git a/examples/server/server.c b/examples/server/server.c index aea9ec29b..640858422 100644 --- a/examples/server/server.c +++ b/examples/server/server.c @@ -2404,11 +2404,11 @@ THREAD_RETURN WOLFSSL_THREAD server_test(void* args) /* Write data */ if (!useWebServerMsg) { write_msg = msg; - write_msg_sz = XSTRLEN(msg); + write_msg_sz = (int) XSTRLEN(msg); } else { write_msg = webServerMsg; - write_msg_sz = XSTRLEN(webServerMsg); + write_msg_sz = (int) XSTRLEN(webServerMsg); } ServerWrite(ssl, write_msg, write_msg_sz); From 2285071fbcd36bc6064f05d68ebe0da51a9f7557 Mon Sep 17 00:00:00 2001 From: kaleb-himes Date: Thu, 4 Jun 2020 09:10:00 -0600 Subject: [PATCH 163/298] Use old convention, consolidate assignments --- examples/client/client.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/examples/client/client.c b/examples/client/client.c index 0b2f22d6f..cf9704438 100644 --- a/examples/client/client.c +++ b/examples/client/client.c @@ -3082,10 +3082,8 @@ THREAD_RETURN WOLFSSL_THREAD client_test(void* args) XMEMSET(msg, 0, MSG32); XMEMSET(resumeMsg, 0, MSG32); - msgSz = GETMSGSZ-1; + msgSz = resumeSz = sizeof(msgGet) - 1; XMEMCPY(msg, msgGet, msgSz); - - resumeSz = msgSz; XMEMCPY(resumeMsg, msgGet, resumeSz); } From c8b87eab5f2fe2ae2c3527bbfb33db6ed8b55999 Mon Sep 17 00:00:00 2001 From: Jacob Barthelmeh Date: Thu, 4 Jun 2020 11:53:46 -0600 Subject: [PATCH 164/298] fix macro to match *_FLAGS_* --- tests/api.c | 2 +- wolfssl/openssl/bio.h | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/api.c b/tests/api.c index 0e9a59e5e..a62c91d93 100644 --- a/tests/api.c +++ b/tests/api.c @@ -25268,7 +25268,7 @@ static void test_wolfSSL_BIO_write(void) AssertIntEQ(XMEMCMP(out, msg, sizeof(msg)), 0); /* now try encoding with no line ending */ - BIO_set_flags(bio64, BIO_FLAG_BASE64_NO_NL); + BIO_set_flags(bio64, BIO_FLAGS_BASE64_NO_NL); #ifdef HAVE_EX_DATA BIO_set_ex_data(bio64, 0, (void*) "data"); AssertIntEQ(strcmp((const char*)BIO_get_ex_data(bio64, 0), "data"), 0); diff --git a/wolfssl/openssl/bio.h b/wolfssl/openssl/bio.h index 1eb55b149..62841a744 100644 --- a/wolfssl/openssl/bio.h +++ b/wolfssl/openssl/bio.h @@ -33,11 +33,11 @@ #endif -#define BIO_FLAG_BASE64_NO_NL WOLFSSL_BIO_FLAG_BASE64_NO_NL -#define BIO_FLAG_READ WOLFSSL_BIO_FLAG_READ -#define BIO_FLAG_WRITE WOLFSSL_BIO_FLAG_WRITE -#define BIO_FLAG_IO_SPECIAL WOLFSSL_BIO_FLAG_IO_SPECIAL -#define BIO_FLAG_RETRY WOLFSSL_BIO_FLAG_RETRY +#define BIO_FLAGS_BASE64_NO_NL WOLFSSL_BIO_FLAG_BASE64_NO_NL +#define BIO_FLAGS_READ WOLFSSL_BIO_FLAG_READ +#define BIO_FLAGS_WRITE WOLFSSL_BIO_FLAG_WRITE +#define BIO_FLAGS_IO_SPECIAL WOLFSSL_BIO_FLAG_IO_SPECIAL +#define BIO_FLAGS_SHOULD_RETRY WOLFSSL_BIO_FLAG_RETRY #define BIO_new_fp wolfSSL_BIO_new_fp #define BIO_new_file wolfSSL_BIO_new_file From ca9dc7d5098570742f5e360745385d33a2899385 Mon Sep 17 00:00:00 2001 From: David Garske Date: Fri, 15 May 2020 15:23:38 -0700 Subject: [PATCH 165/298] Fix for `wc_ecc_import_unsigned` failing if first private key byte is zero (Fixes #2950). Fix `wc_ecc_is_point` to return better code `IS_POINT_E` on failure (was returning -1). Improved ECC import API unit tests. Added `WOLFSSL_VALIDATE_ECC_IMPORT` and `WOLFSSL_VALIDATE_ECC_KEYGEN` to `--enable-all`. --- configure.ac | 3 ++ tests/api.c | 100 ++++++++++++++++++++++++++++++++++++++------ wolfcrypt/src/ecc.c | 4 +- 3 files changed, 92 insertions(+), 15 deletions(-) diff --git a/configure.ac b/configure.ac index d00b381a2..82152ee9a 100644 --- a/configure.ac +++ b/configure.ac @@ -201,6 +201,9 @@ then # Enable DH const table speedups (eliminates `-lm` math lib dependency) AM_CFLAGS="$AM_CFLAGS -DHAVE_FFDHE_2048 -DHAVE_FFDHE_3072 -DFP_MAX_BITS=8192" + # Enable ECC Key Gen / Import checks + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_VALIDATE_ECC_IMPORT -DWOLFSSL_VALIDATE_ECC_KEYGEN" + # Enable multiple attribute additions such as DC AM_CFLAGS="-DWOLFSSL_MULTI_ATTRIB $AM_CFLAGS" fi diff --git a/tests/api.c b/tests/api.c index 96972e6e0..8cb8c5f16 100644 --- a/tests/api.c +++ b/tests/api.c @@ -16833,25 +16833,21 @@ static int test_wc_ecc_rs_to_sig (void) } /* END test_wc_ecc_rs_to_sig */ -static int test_wc_ecc_import_raw (void) +static int test_wc_ecc_import_raw(void) { int ret = 0; -#ifdef HAVE_ECC +#if defined(HAVE_ECC) && !defined(NO_ECC256) ecc_key key; -#ifdef HAVE_ALL_CURVES - const char* qx = "07008ea40b08dbe76432096e80a2494c94982d2d5bcf98e6"; - const char* qy = "76fab681d00b414ea636ba215de26d98c41bd7f2e4d65477"; - const char* d = "e14f37b3d1374ff8b03f41b9b3fdd2f0ebccf275d660d7f3"; - const char* curveName = "SECP192R1"; -#else const char* qx = - "6c450448386596485678dcf46ccf75e80ff292443cddab1ff216d0c72cd9341"; + "bb33ac4c27504ac64aa504c33cde9f36db722dce94ea2bfacb2009392c16e861"; const char* qy = - "9cac72ff8a90e4939e37714bfa07ae4612588535c3fdeab63ceb29b1d80f0d1"; + "02e9af4dd302939a315b9792217ff0cf18da9111023486e82058330b803489d8"; const char* d = - "1e1dd938e15bdd036b0b0e2a6dc62fe7b46dbe042ac42310c6d5db0cda63e807"; + "45b66902739c6c85a1385b72e8e8c7acc4038d533504fa6c28dc348de1a8098c"; const char* curveName = "SECP256R1"; +#ifdef WOLFSSL_VALIDATE_ECC_IMPORT + const char* kNullStr = ""; #endif ret = wc_ecc_init(&key); @@ -16873,10 +16869,13 @@ static int test_wc_ecc_import_raw (void) if (ret == BAD_FUNC_ARG) { ret = wc_ecc_import_raw(&key, qx, qy, d, NULL); } + #ifdef WOLFSSL_VALIDATE_ECC_IMPORT if (ret == BAD_FUNC_ARG) { + ret = wc_ecc_import_raw(&key, kNullStr, kNullStr, kNullStr, curveName); + } + #endif + if (ret == BAD_FUNC_ARG || ret == ECC_INF_E) { ret = 0; - } else if (ret == 0) { - ret = WOLFSSL_FATAL_ERROR; } } @@ -16890,6 +16889,80 @@ static int test_wc_ecc_import_raw (void) } /* END test_wc_ecc_import_raw */ +static int test_wc_ecc_import_unsigned(void) +{ + int ret = 0; +#if defined(HAVE_ECC) && !defined(NO_ECC256) && !defined(HAVE_SELFTEST) && \ + (!defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && HAVE_FIPS_VERSION >= 2)) + ecc_key key; + const byte qx[] = { + 0xbb, 0x33, 0xac, 0x4c, 0x27, 0x50, 0x4a, 0xc6, + 0x4a, 0xa5, 0x04, 0xc3, 0x3c, 0xde, 0x9f, 0x36, + 0xdb, 0x72, 0x2d, 0xce, 0x94, 0xea, 0x2b, 0xfa, + 0xcb, 0x20, 0x09, 0x39, 0x2c, 0x16, 0xe8, 0x61 + }; + const byte qy[] = { + 0x02, 0xe9, 0xaf, 0x4d, 0xd3, 0x02, 0x93, 0x9a, + 0x31, 0x5b, 0x97, 0x92, 0x21, 0x7f, 0xf0, 0xcf, + 0x18, 0xda, 0x91, 0x11, 0x02, 0x34, 0x86, 0xe8, + 0x20, 0x58, 0x33, 0x0b, 0x80, 0x34, 0x89, 0xd8 + }; + const byte d[] = { + 0x45, 0xb6, 0x69, 0x02, 0x73, 0x9c, 0x6c, 0x85, + 0xa1, 0x38, 0x5b, 0x72, 0xe8, 0xe8, 0xc7, 0xac, + 0xc4, 0x03, 0x8d, 0x53, 0x35, 0x04, 0xfa, 0x6c, + 0x28, 0xdc, 0x34, 0x8d, 0xe1, 0xa8, 0x09, 0x8c + }; +#ifdef WOLFSSL_VALIDATE_ECC_IMPORT + const byte nullBytes[32] = {0}; +#endif + int curveId = ECC_SECP256R1; + + ret = wc_ecc_init(&key); + + printf(testingFmt, "wc_ecc_import_unsigned()"); + + if (ret == 0) { + ret = wc_ecc_import_unsigned(&key, (byte*)qx, (byte*)qy, (byte*)d, + curveId); + } + /* Test bad args. */ + if (ret == 0) { + ret = wc_ecc_import_unsigned(NULL, (byte*)qx, (byte*)qy, (byte*)d, + curveId); + if (ret == BAD_FUNC_ARG) { + ret = wc_ecc_import_unsigned(&key, NULL, (byte*)qy, (byte*)d, + curveId); + } + if (ret == BAD_FUNC_ARG) { + ret = wc_ecc_import_unsigned(&key, (byte*)qx, NULL, (byte*)d, + curveId); + } + if (ret == BAD_FUNC_ARG) { + ret = wc_ecc_import_unsigned(&key, (byte*)qx, (byte*)qy, (byte*)d, + ECC_CURVE_INVALID); + } + #ifdef WOLFSSL_VALIDATE_ECC_IMPORT + if (ret == BAD_FUNC_ARG) { + ret = wc_ecc_import_unsigned(&key, (byte*)nullBytes, + (byte*)nullBytes, (byte*)nullBytes, curveId); + } + #endif + if (ret == BAD_FUNC_ARG || ret == ECC_INF_E) { + ret = 0; + } + } + + printf(resultFmt, ret == 0 ? passed : failed); + + wc_ecc_free(&key); + +#endif + + return ret; + +} /* END test_wc_ecc_import_unsigned */ + /* * Testing wc_ecc_sig_size() @@ -32469,6 +32542,7 @@ void ApiTest(void) AssertIntEQ(test_wc_ecc_export_private_only(), 0); AssertIntEQ(test_wc_ecc_rs_to_sig(), 0); AssertIntEQ(test_wc_ecc_import_raw(), 0); + AssertIntEQ(test_wc_ecc_import_unsigned(), 0); AssertIntEQ(test_wc_ecc_sig_size(), 0); AssertIntEQ(test_wc_ecc_ctx_new(), 0); AssertIntEQ(test_wc_ecc_ctx_reset(), 0); diff --git a/wolfcrypt/src/ecc.c b/wolfcrypt/src/ecc.c index 00d9c7423..9dc0decc7 100644 --- a/wolfcrypt/src/ecc.c +++ b/wolfcrypt/src/ecc.c @@ -6803,7 +6803,7 @@ int wc_ecc_is_point(ecc_point* ecp, mp_int* a, mp_int* b, mp_int* prime) /* compare to b */ if (err == MP_OKAY) { if (mp_cmp(t1, b) != MP_EQ) { - err = MP_VAL; + err = IS_POINT_E; } else { err = MP_OKAY; } @@ -7889,7 +7889,7 @@ static int wc_ecc_import_raw_private(ecc_key* key, const char* qx, /* import private key */ if (err == MP_OKAY) { - if (d != NULL && d[0] != '\0') { + if (d != NULL) { #if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A) /* Hardware doesn't support loading private key */ err = NOT_COMPILED_IN; From cd1c2d5faeaed1c32c294e41fba48b8e8bb31d1e Mon Sep 17 00:00:00 2001 From: David Garske Date: Mon, 4 May 2020 07:42:50 -0700 Subject: [PATCH 166/298] Enable TLS v1.3 by default. Remove old TLS v1.3 draft build support. --- configure.ac | 72 +----- src/internal.c | 38 --- src/ssl.c | 24 -- src/tls.c | 49 +--- src/tls13.c | 632 +++------------------------------------------ wolfssl/internal.h | 27 -- 6 files changed, 32 insertions(+), 810 deletions(-) diff --git a/configure.ac b/configure.ac index d00b381a2..006212701 100644 --- a/configure.ac +++ b/configure.ac @@ -287,78 +287,13 @@ then fi -# TLS v1.3 Draft 18 -AC_ARG_ENABLE([tls13-draft18], - [AS_HELP_STRING([--enable-tls13-draft18],[Enable wolfSSL TLS v1.3 Draft 18 (default: disabled)])], - [ ENABLED_TLS13_DRAFT18=$enableval ], - [ ENABLED_TLS13_DRAFT18=no ] - ) -if test "$ENABLED_TLS13_DRAFT18" = "yes" -then - AM_CFLAGS="-DWOLFSSL_TLS13_DRAFT -DWOLFSSL_TLS13_DRAFT_18 $AM_CFLAGS" -fi - - -# TLS v1.3 Draft 22 -AC_ARG_ENABLE([tls13-draft22], - [AS_HELP_STRING([--enable-tls13-draft22],[Enable wolfSSL TLS v1.3 Draft 22 (default: disabled)])], - [ ENABLED_TLS13_DRAFT22=$enableval ], - [ ENABLED_TLS13_DRAFT22=no ] - ) -if test "$ENABLED_TLS13_DRAFT22" = "yes" -then - AM_CFLAGS="-DWOLFSSL_TLS13_DRAFT -DWOLFSSL_TLS13_DRAFT_22 $AM_CFLAGS" -fi - - -# TLS v1.3 Draft 23 -AC_ARG_ENABLE([tls13-draft23], - [AS_HELP_STRING([--enable-tls13-draft23],[Enable wolfSSL TLS v1.3 Draft 23 (default: disabled)])], - [ ENABLED_TLS13_DRAFT23=$enableval ], - [ ENABLED_TLS13_DRAFT23=no ] - ) -if test "$ENABLED_TLS13_DRAFT23" = "yes" -then - AM_CFLAGS="-DWOLFSSL_TLS13_DRAFT -DWOLFSSL_TLS13_DRAFT_23 $AM_CFLAGS" -fi - - -# TLS v1.3 Draft 26 -AC_ARG_ENABLE([tls13-draft26], - [AS_HELP_STRING([--enable-tls13-draft26],[Enable wolfSSL TLS v1.3 Draft 26 (default: disabled)])], - [ ENABLED_TLS13_DRAFT26=$enableval ], - [ ENABLED_TLS13_DRAFT26=no ] - ) -if test "$ENABLED_TLS13_DRAFT26" = "yes" -then - AM_CFLAGS="-DWOLFSSL_TLS13_DRAFT -DWOLFSSL_TLS13_DRAFT_26 $AM_CFLAGS" -fi - - -# TLS v1.3 Draft 28 -AC_ARG_ENABLE([tls13-draft28], - [AS_HELP_STRING([--enable-tls13-draft28],[Enable wolfSSL TLS v1.3 Draft 28 (default: disabled)])], - [ ENABLED_TLS13_DRAFT28=$enableval ], - [ ENABLED_TLS13_DRAFT28=no ] - ) -if test "$ENABLED_TLS13_DRAFT28" = "yes" -then - AM_CFLAGS="-DWOLFSSL_TLS13_DRAFT $AM_CFLAGS" -fi - - # TLS v1.3 AC_ARG_ENABLE([tls13], [AS_HELP_STRING([--enable-tls13],[Enable wolfSSL TLS v1.3 (default: disabled)])], [ ENABLED_TLS13=$enableval ], - [ ENABLED_TLS13=no ] + [ ENABLED_TLS13=yes ] ) -if test "$ENABLED_TLS13_DRAFT18" = "yes" || test "$ENABLED_TLS13_DRAFT22" = "yes" || test "$ENABLED_TLS13_DRAFT23" = "yes" || test "$ENABLED_TLS13_DRAFT26" = "yes" || test "$ENABLED_TLS13_DRAFT28" = "yes" -then - ENABLED_TLS13="yes" -fi - if test "$ENABLED_TLS13" = "yes" then AM_CFLAGS="-DWOLFSSL_TLS13 -DHAVE_TLS_EXTENSIONS -DHAVE_SUPPORTED_CURVES $AM_CFLAGS" @@ -5548,11 +5483,6 @@ echo " * Old TLS Versions: $ENABLED_OLD_TLS" echo " * SSL version 3.0: $ENABLED_SSLV3" echo " * TLS v1.0: $ENABLED_TLSV10" echo " * TLS v1.3: $ENABLED_TLS13" -echo " * TLS v1.3 Draft 18: $ENABLED_TLS13_DRAFT18" -echo " * TLS v1.3 Draft 22: $ENABLED_TLS13_DRAFT22" -echo " * TLS v1.3 Draft 23: $ENABLED_TLS13_DRAFT23" -echo " * TLS v1.3 Draft 26: $ENABLED_TLS13_DRAFT26" -echo " * TLS v1.3 Draft 28: $ENABLED_TLS13_DRAFT28" echo " * Post-handshake Auth: $ENABLED_TLS13_POST_AUTH" echo " * Early Data: $ENABLED_TLS13_EARLY_DATA" echo " * Send State in HRR Cookie: $ENABLED_SEND_HRR_COOKIE" diff --git a/src/internal.c b/src/internal.c index 7906c4c77..3edc42913 100644 --- a/src/internal.c +++ b/src/internal.c @@ -7772,11 +7772,7 @@ static void AddRecordHeader(byte* output, word32 length, byte type, WOLFSSL* ssl rl->pvMajor = ssl->version.major; /* type and version same in each */ #ifdef WOLFSSL_TLS13 if (IsAtLeastTLSv1_3(ssl->version)) { -#ifdef WOLFSSL_TLS13_DRAFT_18 - rl->pvMinor = TLSv1_MINOR; -#else rl->pvMinor = TLSv1_2_MINOR; -#endif } else #endif @@ -8303,11 +8299,7 @@ static int GetRecordHeader(WOLFSSL* ssl, const byte* input, word32* inOutIdx, #else if (rh->pvMajor != ssl->version.major || (rh->pvMinor != ssl->version.minor && -#ifdef WOLFSSL_TLS13_DRAFT_18 - (!IsAtLeastTLSv1_3(ssl->version) || rh->pvMinor != TLSv1_MINOR) -#else (!IsAtLeastTLSv1_3(ssl->version) || rh->pvMinor != TLSv1_2_MINOR) -#endif )) #endif { @@ -14880,13 +14872,9 @@ int ProcessReply(WOLFSSL* ssl) /* decrypt message */ case decryptMessage: -#if !defined(WOLFSSL_TLS13) || defined(WOLFSSL_TLS13_DRAFT_18) - if (IsEncryptionOn(ssl, 0) && ssl->keys.decryptedCur == 0) -#else if (IsEncryptionOn(ssl, 0) && ssl->keys.decryptedCur == 0 && (!IsAtLeastTLSv1_3(ssl->version) || ssl->curRL.type != change_cipher_spec)) -#endif { bufferStatic* in = &ssl->buffers.inputBuffer; @@ -14949,20 +14937,11 @@ int ProcessReply(WOLFSSL* ssl) else { #ifdef WOLFSSL_TLS13 - #if defined(WOLFSSL_TLS13_DRAFT_18) || \ - defined(WOLFSSL_TLS13_DRAFT_22) || \ - defined(WOLFSSL_TLS13_DRAFT_23) - ret = DecryptTls13(ssl, - in->buffer + in->idx, - in->buffer + in->idx, - ssl->curSize, NULL, 0); - #else ret = DecryptTls13(ssl, in->buffer + in->idx, in->buffer + in->idx, ssl->curSize, (byte*)&ssl->curRL, RECORD_HEADER_SZ); - #endif #else ret = DECRYPT_ERROR; #endif /* WOLFSSL_TLS13 */ @@ -15033,13 +15012,9 @@ int ProcessReply(WOLFSSL* ssl) /* verify digest of message */ case verifyMessage: -#if !defined(WOLFSSL_TLS13) || defined(WOLFSSL_TLS13_DRAFT_18) - if (IsEncryptionOn(ssl, 0) && ssl->keys.decryptedCur == 0) -#else if (IsEncryptionOn(ssl, 0) && ssl->keys.decryptedCur == 0 && (!IsAtLeastTLSv1_3(ssl->version) || ssl->curRL.type != change_cipher_spec)) -#endif { if (!atomicUser #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY) @@ -15200,12 +15175,6 @@ int ProcessReply(WOLFSSL* ssl) #endif #ifdef WOLFSSL_TLS13 - #ifdef WOLFSSL_TLS13_DRAFT_18 - if (IsAtLeastTLSv1_3(ssl->version)) { - SendAlert(ssl, alert_fatal, illegal_parameter); - return UNKNOWN_RECORD_TYPE; - } - #else if (IsAtLeastTLSv1_3(ssl->version)) { word32 i = ssl->buffers.inputBuffer.idx; if (ssl->options.handShakeState == HANDSHAKE_DONE) { @@ -15227,7 +15196,6 @@ int ProcessReply(WOLFSSL* ssl) } break; } - #endif #endif #ifndef WOLFSSL_NO_TLS12 @@ -27546,9 +27514,7 @@ static int DoSessionTicket(WOLFSSL* ssl, const byte* input, word32* inOutIdx, #ifdef WOLFSSL_TLS13 word32 ageAdd; /* Obfuscation of age */ word16 namedGroup; /* Named group used */ - #ifndef WOLFSSL_TLS13_DRAFT_18 TicketNonce ticketNonce; /* Ticket nonce */ - #endif #ifdef WOLFSSL_EARLY_DATA word32 maxEarlyDataSz; /* Max size of early data */ #endif @@ -27604,10 +27570,8 @@ static int DoSessionTicket(WOLFSSL* ssl, const byte* input, word32* inOutIdx, it.timestamp = TimeNowInMilliseconds(); /* Resumption master secret. */ XMEMCPY(it.msecret, ssl->session.masterSecret, SECRET_LEN); - #ifndef WOLFSSL_TLS13_DRAFT_18 XMEMCPY(&it.ticketNonce, &ssl->session.ticketNonce, sizeof(TicketNonce)); - #endif #endif } @@ -27756,10 +27720,8 @@ static int DoSessionTicket(WOLFSSL* ssl, const byte* input, word32* inOutIdx, #endif /* Resumption master secret. */ XMEMCPY(ssl->session.masterSecret, it->msecret, SECRET_LEN); - #ifndef WOLFSSL_TLS13_DRAFT_18 XMEMCPY(&ssl->session.ticketNonce, &it->ticketNonce, sizeof(TicketNonce)); - #endif ssl->session.namedGroup = it->namedGroup; #endif } diff --git a/src/ssl.c b/src/ssl.c index 52670d67f..278d4fb16 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -12517,10 +12517,8 @@ static int GetDeepCopySession(WOLFSSL* ssl, WOLFSSL_SESSION* copyFrom) copyInto->namedGroup = copyFrom->namedGroup; copyInto->ticketSeen = copyFrom->ticketSeen; copyInto->ticketAdd = copyFrom->ticketAdd; -#ifndef WOLFSSL_TLS13_DRAFT_18 XMEMCPY(©Into->ticketNonce, ©From->ticketNonce, sizeof(TicketNonce)); -#endif #ifdef WOLFSSL_EARLY_DATA copyInto->maxEarlyDataSz = copyFrom->maxEarlyDataSz; #endif @@ -12829,10 +12827,8 @@ int AddSession(WOLFSSL* ssl) if (error == 0) { session->ticketSeen = ssl->session.ticketSeen; session->ticketAdd = ssl->session.ticketAdd; -#ifndef WOLFSSL_TLS13_DRAFT_18 XMEMCPY(&session->ticketNonce, &ssl->session.ticketNonce, sizeof(TicketNonce)); -#endif #ifdef WOLFSSL_EARLY_DATA session->maxEarlyDataSz = ssl->session.maxEarlyDataSz; #endif @@ -19291,21 +19287,7 @@ static const char* wolfSSL_internal_get_version(const ProtocolVersion* version) case TLSv1_2_MINOR : return "TLSv1.2"; case TLSv1_3_MINOR : - #ifdef WOLFSSL_TLS13_DRAFT - #ifdef WOLFSSL_TLS13_DRAFT_18 - return "TLSv1.3 (Draft 18)"; - #elif defined(WOLFSSL_TLS13_DRAFT_22) - return "TLSv1.3 (Draft 22)"; - #elif defined(WOLFSSL_TLS13_DRAFT_23) - return "TLSv1.3 (Draft 23)"; - #elif defined(WOLFSSL_TLS13_DRAFT_26) - return "TLSv1.3 (Draft 26)"; - #else - return "TLSv1.3 (Draft 28)"; - #endif - #else return "TLSv1.3"; - #endif default: return "unknown"; } @@ -27041,11 +27023,9 @@ int wolfSSL_i2d_SSL_SESSION(WOLFSSL_SESSION* sess, unsigned char** p) #ifdef WOLFSSL_TLS13 /* ticketSeen | ticketAdd */ size += OPAQUE32_LEN + OPAQUE32_LEN; -#ifndef WOLFSSL_TLS13_DRAFT_18 /* ticketNonce */ size += OPAQUE8_LEN + sess->ticketNonce.len; #endif -#endif #ifdef WOLFSSL_EARLY_DATA size += OPAQUE32_LEN; #endif @@ -27109,12 +27089,10 @@ int wolfSSL_i2d_SSL_SESSION(WOLFSSL_SESSION* sess, unsigned char** p) idx += OPAQUE32_LEN; c32toa(sess->ticketAdd, data + idx); idx += OPAQUE32_LEN; -#ifndef WOLFSSL_TLS13_DRAFT_18 data[idx++] = sess->ticketNonce.len; XMEMCPY(data + idx, sess->ticketNonce.data, sess->ticketNonce.len); idx += sess->ticketNonce.len; #endif -#endif #ifdef WOLFSSL_EARLY_DATA c32toa(sess->maxEarlyDataSz, data + idx); idx += OPAQUE32_LEN; @@ -27294,7 +27272,6 @@ WOLFSSL_SESSION* wolfSSL_d2i_SSL_SESSION(WOLFSSL_SESSION** sess, idx += OPAQUE32_LEN; ato32(data + idx, &s->ticketAdd); idx += OPAQUE32_LEN; -#ifndef WOLFSSL_TLS13_DRAFT_18 if (i - idx < OPAQUE8_LEN) { ret = BUFFER_ERROR; goto end; @@ -27308,7 +27285,6 @@ WOLFSSL_SESSION* wolfSSL_d2i_SSL_SESSION(WOLFSSL_SESSION** sess, XMEMCPY(s->ticketNonce.data, data + idx, s->ticketNonce.len); idx += s->ticketNonce.len; #endif -#endif #ifdef WOLFSSL_EARLY_DATA if (i - idx < OPAQUE32_LEN) { ret = BUFFER_ERROR; diff --git a/src/tls.c b/src/tls.c index 61643f0c7..af9c7fc10 100644 --- a/src/tls.c +++ b/src/tls.c @@ -5912,10 +5912,8 @@ static int TLSX_SupportedVersions_GetSize(void* data, byte msgType, word16* pSz) *pSz += (word16)(OPAQUE8_LEN + cnt * OPAQUE16_LEN); } -#ifndef WOLFSSL_TLS13_DRAFT_18 else if (msgType == server_hello || msgType == hello_retry_request) *pSz += OPAQUE16_LEN; -#endif else return SANITY_MSG_E; @@ -5993,24 +5991,12 @@ static int TLSX_SupportedVersions_Write(void* data, byte* output, *pSz += (word16)(OPAQUE8_LEN + *cnt); } -#ifndef WOLFSSL_TLS13_DRAFT_18 else if (msgType == server_hello || msgType == hello_retry_request) { - #ifdef WOLFSSL_TLS13_DRAFT - if (ssl->version.major == SSLv3_MAJOR && - ssl->version.minor == TLSv1_3_MINOR) { - output[0] = TLS_DRAFT_MAJOR; - output[1] = TLS_DRAFT_MINOR; - } - else - #endif - { - output[0] = ssl->version.major; - output[1] = ssl->version.minor; - } + output[0] = ssl->version.major; + output[1] = ssl->version.minor; *pSz += OPAQUE16_LEN; } -#endif else return SANITY_MSG_E; @@ -6092,9 +6078,7 @@ static int TLSX_SupportedVersions_Parse(WOLFSSL* ssl, byte* input, if (ret != 0) { return ret; } -#ifndef WOLFSSL_TLS13_DRAFT_18 TLSX_SetResponse(ssl, TLSX_SUPPORTED_VERSIONS); -#endif } if (minor > newMinor) { ssl->version.minor = minor; @@ -6115,7 +6099,6 @@ static int TLSX_SupportedVersions_Parse(WOLFSSL* ssl, byte* input, return VERSION_ERROR; } } -#ifndef WOLFSSL_TLS13_DRAFT_18 else if (msgType == server_hello || msgType == hello_retry_request) { /* Must contain one version. */ if (length != OPAQUE16_LEN) @@ -6124,13 +6107,6 @@ static int TLSX_SupportedVersions_Parse(WOLFSSL* ssl, byte* input, major = input[0]; minor = input[OPAQUE8_LEN]; - #ifdef WOLFSSL_TLS13_DRAFT - if (major == TLS_DRAFT_MAJOR && minor == TLS_DRAFT_MINOR) { - major = SSLv3_MAJOR; - minor = TLSv1_3_MINOR; - } - #endif - if (major != pv.major) return VERSION_ERROR; @@ -6160,7 +6136,6 @@ static int TLSX_SupportedVersions_Parse(WOLFSSL* ssl, byte* input, ssl->version.minor = minor; } } -#endif else return SANITY_MSG_E; @@ -6494,7 +6469,6 @@ static int TLSX_SetSignatureAlgorithms(TLSX** extensions, const void* data, /******************************************************************************/ #ifdef WOLFSSL_TLS13 -#if !defined(WOLFSSL_TLS13_DRAFT_18) && !defined(WOLFSSL_TLS13_DRAFT_22) /* Return the size of the SignatureAlgorithms extension's data. * * data Unused @@ -6581,7 +6555,6 @@ static int TLSX_SetSignatureAlgorithmsCert(TLSX** extensions, const void* data, #define SAC_GET_SIZE TLSX_SignatureAlgorithmsCert_GetSize #define SAC_WRITE TLSX_SignatureAlgorithmsCert_Write #define SAC_PARSE TLSX_SignatureAlgorithmsCert_Parse -#endif /* !WOLFSSL_TLS13_DRAFT_18 && !WOLFSSL_TLS13_DRAFT_22 */ #endif /* WOLFSSL_TLS13 */ @@ -9233,10 +9206,8 @@ void TLSX_FreeAll(TLSX* list, void* heap) break; #endif - #if !defined(WOLFSSL_TLS13_DRAFT_18) && !defined(WOLFSSL_TLS13_DRAFT_22) case TLSX_SIGNATURE_ALGORITHMS_CERT: break; - #endif case TLSX_KEY_SHARE: KS_FREE_ALL((KeyShareEntry*)extension->data, heap); @@ -9380,11 +9351,9 @@ static int TLSX_GetSize(TLSX* list, byte* semaphore, byte msgType, break; #endif - #if !defined(WOLFSSL_TLS13_DRAFT_18) && !defined(WOLFSSL_TLS13_DRAFT_22) case TLSX_SIGNATURE_ALGORITHMS_CERT: length += SAC_GET_SIZE(extension->data); break; - #endif case TLSX_KEY_SHARE: length += KS_GET_SIZE((KeyShareEntry*)extension->data, msgType); @@ -9558,12 +9527,10 @@ static int TLSX_Write(TLSX* list, byte* output, byte* semaphore, break; #endif - #if !defined(WOLFSSL_TLS13_DRAFT_18) && !defined(WOLFSSL_TLS13_DRAFT_22) case TLSX_SIGNATURE_ALGORITHMS_CERT: WOLFSSL_MSG("Signature Algorithms extension to write"); offset += SAC_WRITE(extension->data, output + offset); break; - #endif case TLSX_KEY_SHARE: WOLFSSL_MSG("Key Share extension to write"); @@ -10125,7 +10092,6 @@ int TLSX_PopulateExtensions(WOLFSSL* ssl, byte isServer) } #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && HAVE_SUPPORTED_CURVES */ - #if !defined(WOLFSSL_TLS13_DRAFT_18) && !defined(WOLFSSL_TLS13_DRAFT_22) if (ssl->certHashSigAlgoSz > 0) { WOLFSSL_MSG("Adding signature algorithms cert extension"); if ((ret = TLSX_SetSignatureAlgorithmsCert(&ssl->extensions, @@ -10133,7 +10099,6 @@ int TLSX_PopulateExtensions(WOLFSSL* ssl, byte isServer) return ret; } } - #endif /* !WOLFSSL_TLS13_DRAFT_18 && !WOLFSSL_TLS13_DRAFT_22 */ if (TLSX_Find(ssl->extensions, TLSX_KEY_SHARE) == NULL) { word16 namedGroup; @@ -10511,10 +10476,8 @@ int TLSX_GetResponseSize(WOLFSSL* ssl, byte msgType, word16* pLength) #ifdef WOLFSSL_TLS13 if (IsAtLeastTLSv1_3(ssl->version)) { XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE); - #ifndef WOLFSSL_TLS13_DRAFT_18 TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS)); - #endif if (!ssl->options.noPskDheKe) TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE)); #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK) @@ -10533,9 +10496,7 @@ int TLSX_GetResponseSize(WOLFSSL* ssl, byte msgType, word16* pLength) #ifdef WOLFSSL_TLS13 case hello_retry_request: XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE); - #ifndef WOLFSSL_TLS13_DRAFT_18 TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS)); - #endif if (!ssl->options.noPskDheKe) TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE)); TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_COOKIE)); @@ -10631,10 +10592,8 @@ int TLSX_WriteResponse(WOLFSSL *ssl, byte* output, byte msgType, word16* pOffset #ifdef WOLFSSL_TLS13 if (IsAtLeastTLSv1_3(ssl->version)) { XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE); - #ifndef WOLFSSL_TLS13_DRAFT_18 TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS)); - #endif if (!ssl->options.noPskDheKe) TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE)); #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK) @@ -10653,9 +10612,7 @@ int TLSX_WriteResponse(WOLFSSL *ssl, byte* output, byte msgType, word16* pOffset #ifdef WOLFSSL_TLS13 case hello_retry_request: XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE); - #ifndef WOLFSSL_TLS13_DRAFT_18 TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS)); - #endif if (!ssl->options.noPskDheKe) TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE)); /* Cookie is written below as last extension. */ @@ -11182,7 +11139,6 @@ int TLSX_Parse(WOLFSSL* ssl, byte* input, word16 length, byte msgType, break; #endif - #if !defined(WOLFSSL_TLS13_DRAFT_18) && !defined(WOLFSSL_TLS13_DRAFT_22) case TLSX_SIGNATURE_ALGORITHMS_CERT: WOLFSSL_MSG("Signature Algorithms extension received"); #ifdef WOLFSSL_DEBUG_TLS @@ -11203,7 +11159,6 @@ int TLSX_Parse(WOLFSSL* ssl, byte* input, word16 length, byte msgType, ret = SAC_PARSE(ssl, input + offset, size, isRequest); break; - #endif case TLSX_KEY_SHARE: WOLFSSL_MSG("Key Share extension received"); diff --git a/src/tls13.c b/src/tls13.c index 0227b864b..06bdbecd2 100644 --- a/src/tls13.c +++ b/src/tls13.c @@ -55,12 +55,6 @@ * of ClientHello replies. * WOLFSSL_TLS13 * Enable TLS 1.3 protocol implementation. - * WOLFSSL_TLS13_DRAFT_18 - * Conform with Draft 18 of the TLS v1.3 specification. - * WOLFSSL_TLS13_DRAFT_22 - * Conform with Draft 22 of the TLS v1.3 specification. - * WOLFSSL_TLS13_DRAFT_23 - * Conform with Draft 23 of the TLS v1.3 specification. * WOLFSSL_TLS13_MIDDLEBOX_COMPAT * Enable middlebox compatibility in the TLS 1.3 handshake. * This includes sending ChangeCipherSpec before encrypted messages and @@ -263,20 +257,11 @@ static int HKDF_Expand_Label(byte* okm, word32 okmLen, return ret; } -#ifdef WOLFSSL_TLS13_DRAFT_18 -/* Size of the TLS v1.3 label use when deriving keys. */ -#define TLS13_PROTOCOL_LABEL_SZ 9 -/* The protocol label for TLS v1.3. */ -static const byte tls13ProtocolLabel[TLS13_PROTOCOL_LABEL_SZ + 1] = "TLS 1.3, "; -#else /* Size of the TLS v1.3 label use when deriving keys. */ #define TLS13_PROTOCOL_LABEL_SZ 6 /* The protocol label for TLS v1.3. */ static const byte tls13ProtocolLabel[TLS13_PROTOCOL_LABEL_SZ + 1] = "tls13 "; -#endif -#if !defined(WOLFSSL_TLS13_DRAFT_18) || defined(HAVE_SESSION_TICKET) || \ - !defined(NO_PSK) /* Derive a key from a message. * * ssl The SSL/TLS object. @@ -369,7 +354,6 @@ static int DeriveKeyMsg(WOLFSSL* ssl, byte* output, int outputLen, protocol, protocolLen, label, labelLen, hash, hashSz, digestAlg); } -#endif /* Derive a key. * @@ -441,19 +425,12 @@ static int DeriveKey(WOLFSSL* ssl, byte* output, int outputLen, } #ifndef NO_PSK -#ifdef WOLFSSL_TLS13_DRAFT_18 -/* The length of the binder key label. */ -#define BINDER_KEY_LABEL_SZ 23 -/* The binder key label. */ -static const byte binderKeyLabel[BINDER_KEY_LABEL_SZ + 1] = - "external psk binder key"; -#else /* The length of the binder key label. */ #define BINDER_KEY_LABEL_SZ 10 /* The binder key label. */ static const byte binderKeyLabel[BINDER_KEY_LABEL_SZ + 1] = "ext binder"; -#endif + /* Derive the binder key. * * ssl The SSL/TLS object. @@ -470,19 +447,13 @@ static int DeriveBinderKey(WOLFSSL* ssl, byte* key) #endif /* !NO_PSK */ #ifdef HAVE_SESSION_TICKET -#ifdef WOLFSSL_TLS13_DRAFT_18 -/* The length of the binder key resume label. */ -#define BINDER_KEY_RESUME_LABEL_SZ 25 -/* The binder key resume label. */ -static const byte binderKeyResumeLabel[BINDER_KEY_RESUME_LABEL_SZ + 1] = - "resumption psk binder key"; -#else + /* The length of the binder key resume label. */ #define BINDER_KEY_RESUME_LABEL_SZ 10 /* The binder key resume label. */ static const byte binderKeyResumeLabel[BINDER_KEY_RESUME_LABEL_SZ + 1] = "res binder"; -#endif + /* Derive the binder resumption key. * * ssl The SSL/TLS object. @@ -499,19 +470,13 @@ static int DeriveBinderKeyResume(WOLFSSL* ssl, byte* key) #endif /* HAVE_SESSION_TICKET */ #ifdef WOLFSSL_EARLY_DATA -#ifdef WOLFSSL_TLS13_DRAFT_18 -/* The length of the early traffic label. */ -#define EARLY_TRAFFIC_LABEL_SZ 27 -/* The early traffic label. */ -static const byte earlyTrafficLabel[EARLY_TRAFFIC_LABEL_SZ + 1] = - "client early traffic secret"; -#else + /* The length of the early traffic label. */ #define EARLY_TRAFFIC_LABEL_SZ 11 /* The early traffic label. */ static const byte earlyTrafficLabel[EARLY_TRAFFIC_LABEL_SZ + 1] = "c e traffic"; -#endif + /* Derive the early traffic key. * * ssl The SSL/TLS object. @@ -538,19 +503,12 @@ static int DeriveEarlyTrafficSecret(WOLFSSL* ssl, byte* key) } #ifdef TLS13_SUPPORTS_EXPORTERS -#ifdef WOLFSSL_TLS13_DRAFT_18 -/* The length of the early exporter label. */ -#define EARLY_EXPORTER_LABEL_SZ 28 -/* The early exporter label. */ -static const byte earlyExporterLabel[EARLY_EXPORTER_LABEL_SZ + 1] = - "early exporter master secret"; -#else /* The length of the early exporter label. */ #define EARLY_EXPORTER_LABEL_SZ 12 /* The early exporter label. */ static const byte earlyExporterLabel[EARLY_EXPORTER_LABEL_SZ + 1] = "e exp master"; -#endif + /* Derive the early exporter key. * * ssl The SSL/TLS object. @@ -578,19 +536,12 @@ static int DeriveEarlyExporterSecret(WOLFSSL* ssl, byte* key) #endif #endif -#ifdef WOLFSSL_TLS13_DRAFT_18 -/* The length of the client handshake label. */ -#define CLIENT_HANDSHAKE_LABEL_SZ 31 -/* The client handshake label. */ -static const byte clientHandshakeLabel[CLIENT_HANDSHAKE_LABEL_SZ + 1] = - "client handshake traffic secret"; -#else /* The length of the client handshake label. */ #define CLIENT_HANDSHAKE_LABEL_SZ 12 /* The client handshake label. */ static const byte clientHandshakeLabel[CLIENT_HANDSHAKE_LABEL_SZ + 1] = "c hs traffic"; -#endif + /* Derive the client handshake key. * * ssl The SSL/TLS object. @@ -616,19 +567,12 @@ static int DeriveClientHandshakeSecret(WOLFSSL* ssl, byte* key) return ret; } -#ifdef WOLFSSL_TLS13_DRAFT_18 -/* The length of the server handshake label. */ -#define SERVER_HANDSHAKE_LABEL_SZ 31 -/* The server handshake label. */ -static const byte serverHandshakeLabel[SERVER_HANDSHAKE_LABEL_SZ + 1] = - "server handshake traffic secret"; -#else /* The length of the server handshake label. */ #define SERVER_HANDSHAKE_LABEL_SZ 12 /* The server handshake label. */ static const byte serverHandshakeLabel[SERVER_HANDSHAKE_LABEL_SZ + 1] = "s hs traffic"; -#endif + /* Derive the server handshake key. * * ssl The SSL/TLS object. @@ -654,19 +598,12 @@ static int DeriveServerHandshakeSecret(WOLFSSL* ssl, byte* key) return ret; } -#ifdef WOLFSSL_TLS13_DRAFT_18 -/* The length of the client application traffic label. */ -#define CLIENT_APP_LABEL_SZ 33 -/* The client application traffic label. */ -static const byte clientAppLabel[CLIENT_APP_LABEL_SZ + 1] = - "client application traffic secret"; -#else /* The length of the client application traffic label. */ #define CLIENT_APP_LABEL_SZ 12 /* The client application traffic label. */ static const byte clientAppLabel[CLIENT_APP_LABEL_SZ + 1] = "c ap traffic"; -#endif + /* Derive the client application traffic key. * * ssl The SSL/TLS object. @@ -692,19 +629,12 @@ static int DeriveClientTrafficSecret(WOLFSSL* ssl, byte* key) return ret; } -#ifdef WOLFSSL_TLS13_DRAFT_18 -/* The length of the server application traffic label. */ -#define SERVER_APP_LABEL_SZ 33 -/* The server application traffic label. */ -static const byte serverAppLabel[SERVER_APP_LABEL_SZ + 1] = - "server application traffic secret"; -#else /* The length of the server application traffic label. */ #define SERVER_APP_LABEL_SZ 12 /* The server application traffic label. */ static const byte serverAppLabel[SERVER_APP_LABEL_SZ + 1] = "s ap traffic"; -#endif + /* Derive the server application traffic key. * * ssl The SSL/TLS object. @@ -731,19 +661,12 @@ static int DeriveServerTrafficSecret(WOLFSSL* ssl, byte* key) } #ifdef TLS13_SUPPORTS_EXPORTERS -#ifdef WOLFSSL_TLS13_DRAFT_18 -/* The length of the exporter master secret label. */ -#define EXPORTER_MASTER_LABEL_SZ 22 -/* The exporter master secret label. */ -static const byte exporterMasterLabel[EXPORTER_MASTER_LABEL_SZ + 1] = - "exporter master secret"; -#else /* The length of the exporter master secret label. */ #define EXPORTER_MASTER_LABEL_SZ 10 /* The exporter master secret label. */ static const byte exporterMasterLabel[EXPORTER_MASTER_LABEL_SZ + 1] = "exp master"; -#endif + /* Derive the exporter secret. * * ssl The SSL/TLS object. @@ -771,19 +694,12 @@ static int DeriveExporterSecret(WOLFSSL* ssl, byte* key) #endif #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK) -#ifdef WOLFSSL_TLS13_DRAFT_18 -/* The length of the resumption master secret label. */ -#define RESUME_MASTER_LABEL_SZ 24 -/* The resumption master secret label. */ -static const byte resumeMasterLabel[RESUME_MASTER_LABEL_SZ + 1] = - "resumption master secret"; -#else /* The length of the resumption master secret label. */ #define RESUME_MASTER_LABEL_SZ 10 /* The resumption master secret label. */ static const byte resumeMasterLabel[RESUME_MASTER_LABEL_SZ + 1] = "res master"; -#endif + /* Derive the resumption secret. * * ssl The SSL/TLS object. @@ -817,19 +733,12 @@ static int DeriveFinishedSecret(WOLFSSL* ssl, byte* key, byte* secret) ssl->specs.mac_algorithm, 0); } -#ifdef WOLFSSL_TLS13_DRAFT_18 -/* The length of the application traffic label. */ -#define APP_TRAFFIC_LABEL_SZ 26 -/* The application traffic label. */ -static const byte appTrafficLabel[APP_TRAFFIC_LABEL_SZ + 1] = - "application traffic secret"; -#else /* The length of the application traffic label. */ #define APP_TRAFFIC_LABEL_SZ 11 /* The application traffic label. */ static const byte appTrafficLabel[APP_TRAFFIC_LABEL_SZ + 1] = "traffic upd"; -#endif + /* Update the traffic secret. * * ssl The SSL/TLS object. @@ -861,26 +770,18 @@ static int DeriveEarlySecret(WOLFSSL* ssl) #endif } -#ifndef WOLFSSL_TLS13_DRAFT_18 /* The length of the derived label. */ #define DERIVED_LABEL_SZ 7 /* The derived label. */ static const byte derivedLabel[DERIVED_LABEL_SZ + 1] = "derived"; -#endif + /* Derive the handshake secret using HKDF Extract. * * ssl The SSL/TLS object. */ static int DeriveHandshakeSecret(WOLFSSL* ssl) { -#ifdef WOLFSSL_TLS13_DRAFT_18 - WOLFSSL_MSG("Derive Handshake Secret"); - return Tls13_HKDF_Extract(ssl->arrays->preMasterSecret, - ssl->arrays->secret, ssl->specs.hash_size, - ssl->arrays->preMasterSecret, ssl->arrays->preMasterSz, - ssl->specs.mac_algorithm); -#else byte key[WC_MAX_DIGEST_SIZE]; int ret; @@ -896,7 +797,6 @@ static int DeriveHandshakeSecret(WOLFSSL* ssl) key, ssl->specs.hash_size, ssl->arrays->preMasterSecret, ssl->arrays->preMasterSz, ssl->specs.mac_algorithm); -#endif } /* Derive the master secret using HKDF Extract. @@ -905,12 +805,6 @@ static int DeriveHandshakeSecret(WOLFSSL* ssl) */ static int DeriveMasterSecret(WOLFSSL* ssl) { -#ifdef WOLFSSL_TLS13_DRAFT_18 - WOLFSSL_MSG("Derive Master Secret"); - return Tls13_HKDF_Extract(ssl->arrays->masterSecret, - ssl->arrays->preMasterSecret, ssl->specs.hash_size, - ssl->arrays->masterSecret, 0, ssl->specs.mac_algorithm); -#else byte key[WC_MAX_DIGEST_SIZE]; int ret; @@ -925,10 +819,8 @@ static int DeriveMasterSecret(WOLFSSL* ssl) return Tls13_HKDF_Extract(ssl->arrays->masterSecret, key, ssl->specs.hash_size, ssl->arrays->masterSecret, 0, ssl->specs.mac_algorithm); -#endif } -#ifndef WOLFSSL_TLS13_DRAFT_18 #if defined(HAVE_SESSION_TICKET) /* Length of the resumption label. */ #define RESUMPTION_LABEL_SZ 10 @@ -981,7 +873,6 @@ static int DeriveResumptionPSK(WOLFSSL* ssl, byte* nonce, byte nonceLen, RESUMPTION_LABEL_SZ, nonce, nonceLen, digestAlg); } #endif /* HAVE_SESSION_TICKET */ -#endif /* WOLFSSL_TLS13_DRAFT_18 */ /* Calculate the HMAC of message data to this point. @@ -1501,12 +1392,8 @@ static void AddTls13RecordHeader(byte* output, word32 length, byte type, rl = (RecordLayerHeader*)output; rl->type = type; rl->pvMajor = ssl->version.major; -#ifdef WOLFSSL_TLS13_DRAFT_18 - rl->pvMinor = TLSv1_MINOR; -#else /* NOTE: May be TLSv1_MINOR when sending first ClientHello. */ rl->pvMinor = TLSv1_2_MINOR; -#endif c16toa((word16)length, rl->length); } @@ -1764,11 +1651,8 @@ static int EncryptTls13(WOLFSSL* ssl, byte* output, const byte* input, #ifdef WOLFSSL_DEBUG_TLS WOLFSSL_MSG("Data to encrypt"); WOLFSSL_BUFFER(input, dataSz); -#if !defined(WOLFSSL_TLS13_DRAFT_18) && !defined(WOLFSSL_TLS13_DRAFT_22) && \ - !defined(WOLFSSL_TLS13_DRAFT_23) WOLFSSL_MSG("Additional Authentication Data"); WOLFSSL_BUFFER(aad, aadSz); -#endif #endif #ifdef CIPHER_NONCE @@ -2067,11 +1951,8 @@ int DecryptTls13(WOLFSSL* ssl, byte* output, const byte* input, word16 sz, #ifdef WOLFSSL_DEBUG_TLS WOLFSSL_MSG("Data to decrypt"); WOLFSSL_BUFFER(input, dataSz); -#if !defined(WOLFSSL_TLS13_DRAFT_18) && !defined(WOLFSSL_TLS13_DRAFT_22) && \ - !defined(WOLFSSL_TLS13_DRAFT_23) WOLFSSL_MSG("Additional Authentication Data"); WOLFSSL_BUFFER(aad, aadSz); -#endif WOLFSSL_MSG("Authentication tag"); WOLFSSL_BUFFER(input + dataSz, macSz); #endif @@ -2350,17 +2231,10 @@ int BuildTls13Message(WOLFSSL* ssl, byte* output, int outSz, const byte* input, else #endif { -#if defined(WOLFSSL_TLS13_DRAFT_18) || defined(WOLFSSL_TLS13_DRAFT_22) || \ - defined(WOLFSSL_TLS13_DRAFT_23) - output += args->headerSz; - ret = EncryptTls13(ssl, output, output, args->size, NULL, 0, - asyncOkay); -#else const byte* aad = output; output += args->headerSz; ret = EncryptTls13(ssl, output, output, args->size, aad, RECORD_HEADER_SZ, asyncOkay); -#endif } break; } @@ -2414,7 +2288,6 @@ static int FindSuiteSSL(WOLFSSL* ssl, byte* suite) } #endif -#ifndef WOLFSSL_TLS13_DRAFT_18 #if defined(WOLFSSL_SEND_HRR_COOKIE) && !defined(NO_WOLFSSL_SERVER) /* Create Cookie extension using the hash of the first ClientHello. * @@ -2540,7 +2413,7 @@ static byte helloRetryRequestRandom[] = { 0xC2, 0xA2, 0x11, 0x16, 0x7A, 0xBB, 0x8C, 0x5E, 0x07, 0x9E, 0x09, 0xE2, 0xC8, 0xA8, 0x33, 0x9C }; -#endif /* WOLFSSL_TLS13_DRAFT_18 */ + #ifndef NO_WOLFSSL_CLIENT #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK) @@ -2577,15 +2450,10 @@ static int SetupPskKey(WOLFSSL* ssl, PreSharedKey* psk) #endif /* Resumption PSK is master secret. */ ssl->arrays->psk_keySz = ssl->specs.hash_size; -#ifdef WOLFSSL_TLS13_DRAFT_18 - XMEMCPY(ssl->arrays->psk_key, ssl->session.masterSecret, - ssl->arrays->psk_keySz); -#else if ((ret = DeriveResumptionPSK(ssl, ssl->session.ticketNonce.data, ssl->session.ticketNonce.len, ssl->arrays->psk_key)) != 0) { return ret; } -#endif } #endif #ifndef NO_PSK @@ -2777,14 +2645,12 @@ int SendTls13ClientHello(WOLFSSL* ssl) /* Version | Random | Session Id | Cipher Suites | Compression */ length = VERSION_SZ + RAN_LEN + ENUM_LEN + ssl->suites->suiteSz + SUITE_LEN + COMP_LEN + ENUM_LEN; -#ifndef WOLFSSL_TLS13_DRAFT_18 #if defined(WOLFSSL_TLS13_MIDDLEBOX_COMPAT) length += ID_LEN; #else if (ssl->session.sessionIDSz > 0) length += ssl->session.sessionIDSz; #endif -#endif /* Auto populate extensions supported unless user defined. */ if ((ret = TLSX_PopulateExtensions(ssl, 0)) != 0) @@ -2845,10 +2711,6 @@ int SendTls13ClientHello(WOLFSSL* ssl) XMEMCPY(output + idx, ssl->arrays->clientRandom, RAN_LEN); idx += RAN_LEN; -#ifdef WOLFSSL_TLS13_DRAFT_18 - /* TLS v1.3 does not use session id - 0 length. */ - output[idx++] = 0; -#else if (ssl->session.sessionIDSz > 0) { /* Session resumption for old versions of protocol. */ output[idx++] = ID_LEN; @@ -2865,7 +2727,6 @@ int SendTls13ClientHello(WOLFSSL* ssl) output[idx++] = 0; #endif /* WOLFSSL_TLS13_MIDDLEBOX_COMPAT */ } -#endif /* WOLFSSL_TLS13_DRAFT_18 */ /* Cipher suites */ c16toa(ssl->suites->suiteSz, output + idx); @@ -2920,75 +2781,6 @@ int SendTls13ClientHello(WOLFSSL* ssl) return ret; } -#ifdef WOLFSSL_TLS13_DRAFT_18 -/* handle rocessing of TLS 1.3 hello_retry_request (6) */ -/* Parse and handle a HelloRetryRequest message. - * Only a client will receive this message. - * - * ssl The SSL/TLS object. - * input The message buffer. - * inOutIdx On entry, the index into the message buffer of - * HelloRetryRequest. - * On exit, the index of byte after the HelloRetryRequest message. - * totalSz The length of the current handshake message. - * returns 0 on success and otherwise failure. - */ -static int DoTls13HelloRetryRequest(WOLFSSL* ssl, const byte* input, - word32* inOutIdx, word32 totalSz) -{ - int ret; - word32 begin = *inOutIdx; - word32 i = begin; - word16 totalExtSz; - ProtocolVersion pv; - - WOLFSSL_ENTER("DoTls13HelloRetryRequest"); - -#ifdef WOLFSSL_CALLBACKS - if (ssl->hsInfoOn) AddPacketName(ssl, "HelloRetryRequest"); - if (ssl->toInfoOn) AddLateName("HelloRetryRequest", &ssl->timeoutInfo); -#endif - - /* Version info and length field of extension data. */ - if (totalSz < i - begin + OPAQUE16_LEN + OPAQUE16_LEN + OPAQUE16_LEN) - return BUFFER_ERROR; - - /* Protocol version. */ - XMEMCPY(&pv, input + i, OPAQUE16_LEN); - i += OPAQUE16_LEN; - ret = CheckVersion(ssl, pv); - if (ret != 0) - return ret; - - /* Length of extension data. */ - ato16(&input[i], &totalExtSz); - i += OPAQUE16_LEN; - if (totalExtSz == 0) { - WOLFSSL_MSG("HelloRetryRequest must contain extensions"); - return MISSING_HANDSHAKE_DATA; - } - - /* Extension data. */ - if (i - begin + totalExtSz > totalSz) - return BUFFER_ERROR; - if ((ret = TLSX_Parse(ssl, (byte *)(input + i), totalExtSz, - hello_retry_request, NULL)) != 0) - return ret; - /* The KeyShare extension parsing fails when not valid. */ - - /* Move index to byte after message. */ - *inOutIdx = i + totalExtSz; - - ssl->options.tls1_3 = 1; - ssl->options.serverState = SERVER_HELLO_RETRY_REQUEST_COMPLETE; - - WOLFSSL_LEAVE("DoTls13HelloRetryRequest", ret); - - return ret; -} -#endif - - /* handle processing of TLS 1.3 server_hello (2) and hello_retry_request (6) */ /* Handle the ServerHello message from the server. * Only a client will receive this message. @@ -3007,12 +2799,10 @@ int DoTls13ServerHello(WOLFSSL* ssl, const byte* input, word32* inOutIdx, word32 i = *inOutIdx; word32 begin = i; int ret; -#ifndef WOLFSSL_TLS13_DRAFT_18 byte sessIdSz; const byte* sessId; byte b; int foundVersion; -#endif word16 totalExtSz; #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK) TLSX* ext; @@ -3034,22 +2824,7 @@ int DoTls13ServerHello(WOLFSSL* ssl, const byte* input, word32* inOutIdx, /* Protocol version */ XMEMCPY(&pv, input + i, OPAQUE16_LEN); i += OPAQUE16_LEN; -#ifdef WOLFSSL_TLS13_DRAFT_18 - ret = CheckVersion(ssl, pv); - if (ret != 0) - return ret; - if (!IsAtLeastTLSv1_3(pv) && pv.major != TLS_DRAFT_MAJOR) { -#ifndef WOLFSSL_NO_TLS12 - if (ssl->options.downgrade) { - ssl->version = pv; - return DoServerHello(ssl, input, inOutIdx, helloSz); - } -#endif - WOLFSSL_MSG("Client using higher version, fatal error"); - return VERSION_ERROR; - } -#else #ifndef WOLFSSL_NO_TLS12 if (pv.major == ssl->version.major && pv.minor < TLSv1_2_MINOR && ssl->options.downgrade) { @@ -3061,59 +2836,42 @@ int DoTls13ServerHello(WOLFSSL* ssl, const byte* input, word32* inOutIdx, #endif if (pv.major != ssl->version.major || pv.minor != TLSv1_2_MINOR) return VERSION_ERROR; -#endif -#ifdef WOLFSSL_TLS13_DRAFT_18 - /* Random length check */ - if ((i - begin) + RAN_LEN > helloSz) - return BUFFER_ERROR; -#else /* Random and session id length check */ if ((i - begin) + RAN_LEN + ENUM_LEN > helloSz) return BUFFER_ERROR; if (XMEMCMP(input + i, helloRetryRequestRandom, RAN_LEN) == 0) *extMsgType = hello_retry_request; -#endif /* Server random - keep for debugging. */ XMEMCPY(ssl->arrays->serverRandom, input + i, RAN_LEN); i += RAN_LEN; -#ifndef WOLFSSL_TLS13_DRAFT_18 /* Session id */ sessIdSz = input[i++]; if ((i - begin) + sessIdSz > helloSz) return BUFFER_ERROR; sessId = input + i; i += sessIdSz; -#endif /* WOLFSSL_TLS13_DRAFT_18 */ + ssl->options.haveSessionId = 1; -#ifdef WOLFSSL_TLS13_DRAFT_18 - /* Ciphersuite check */ - if ((i - begin) + OPAQUE16_LEN + OPAQUE16_LEN > helloSz) - return BUFFER_ERROR; -#else /* Ciphersuite and compression check */ if ((i - begin) + OPAQUE16_LEN + OPAQUE8_LEN > helloSz) return BUFFER_ERROR; -#endif /* Set the cipher suite from the message. */ ssl->options.cipherSuite0 = input[i++]; ssl->options.cipherSuite = input[i++]; -#ifndef WOLFSSL_TLS13_DRAFT_18 /* Compression */ b = input[i++]; if (b != 0) { WOLFSSL_MSG("Must be no compression types in list"); return INVALID_PARAMETER; } -#endif -#ifndef WOLFSSL_TLS13_DRAFT_18 if ((i - begin) + OPAQUE16_LEN > helloSz) { if (!ssl->options.downgrade) return BUFFER_ERROR; @@ -3122,9 +2880,7 @@ int DoTls13ServerHello(WOLFSSL* ssl, const byte* input, word32* inOutIdx, #endif ssl->options.haveEMS = 0; } - if ((i - begin) < helloSz) -#endif - { + if ((i - begin) < helloSz) { /* Get extension length and length check. */ if ((i - begin) + OPAQUE16_LEN > helloSz) return BUFFER_ERROR; @@ -3133,7 +2889,6 @@ int DoTls13ServerHello(WOLFSSL* ssl, const byte* input, word32* inOutIdx, if ((i - begin) + totalExtSz > helloSz) return BUFFER_ERROR; -#ifndef WOLFSSL_TLS13_DRAFT_18 /* Need to negotiate version first. */ if ((ret = TLSX_ParseVersion(ssl, (byte*)input + i, totalExtSz, *extMsgType, &foundVersion))) { @@ -3150,7 +2905,6 @@ int DoTls13ServerHello(WOLFSSL* ssl, const byte* input, word32* inOutIdx, return VERSION_ERROR; ssl->version.minor = pv.minor; } -#endif /* Parse and handle extensions. */ ret = TLSX_Parse(ssl, (byte *) input + i, totalExtSz, *extMsgType, @@ -3175,7 +2929,6 @@ int DoTls13ServerHello(WOLFSSL* ssl, const byte* input, word32* inOutIdx, } #endif /* HAVE_SECRET_CALLBACK */ -#ifndef WOLFSSL_TLS13_DRAFT_18 /* Version only negotiated in extensions for TLS v1.3. * Only now do we know how to deal with session id. */ @@ -3225,7 +2978,6 @@ int DoTls13ServerHello(WOLFSSL* ssl, const byte* input, word32* inOutIdx, return INVALID_PARAMETER; } #endif /* WOLFSSL_TLS13_MIDDLEBOX_COMPAT */ -#endif ret = SetCipherSpecs(ssl); if (ret != 0) @@ -3245,10 +2997,7 @@ int DoTls13ServerHello(WOLFSSL* ssl, const byte* input, word32* inOutIdx, } #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK) -#ifndef WOLFSSL_TLS13_DRAFT_18 - if (*extMsgType == server_hello) -#endif - { + if (*extMsgType == server_hello) { ext = TLSX_Find(ssl->extensions, TLSX_PRE_SHARED_KEY); if (ext != NULL) psk = (PreSharedKey*)ext->data; @@ -3264,9 +3013,6 @@ int DoTls13ServerHello(WOLFSSL* ssl, const byte* input, word32* inOutIdx, } #endif -#ifdef WOLFSSL_TLS13_DRAFT_18 - ssl->keys.encryptionOn = 1; -#else if (*extMsgType == server_hello) { ssl->keys.encryptionOn = 1; ssl->options.serverState = SERVER_HELLO_COMPLETE; @@ -3277,7 +3023,6 @@ int DoTls13ServerHello(WOLFSSL* ssl, const byte* input, word32* inOutIdx, ret = RestartHandshakeHash(ssl); } -#endif WOLFSSL_LEAVE("DoTls13ServerHello", ret); WOLFSSL_END(WC_FUNC_SERVER_HELLO_DO); @@ -3375,9 +3120,7 @@ static int DoTls13CertificateRequest(WOLFSSL* ssl, const byte* input, word16 len; word32 begin = *inOutIdx; int ret = 0; -#ifndef WOLFSSL_TLS13_DRAFT_18 Suites peerSuites; -#endif #ifdef WOLFSSL_POST_HANDSHAKE_AUTH CertReqCtx* certReqCtx; #endif @@ -3385,9 +3128,8 @@ static int DoTls13CertificateRequest(WOLFSSL* ssl, const byte* input, WOLFSSL_START(WC_FUNC_CERTIFICATE_REQUEST_DO); WOLFSSL_ENTER("DoTls13CertificateRequest"); -#ifndef WOLFSSL_TLS13_DRAFT_18 XMEMSET(&peerSuites, 0, sizeof(Suites)); -#endif + #ifdef WOLFSSL_CALLBACKS if (ssl->hsInfoOn) AddPacketName(ssl, "CertificateRequest"); if (ssl->toInfoOn) AddLateName("CertificateRequest", &ssl->timeoutInfo); @@ -3419,55 +3161,6 @@ static int DoTls13CertificateRequest(WOLFSSL* ssl, const byte* input, #endif *inOutIdx += len; -#ifdef WOLFSSL_TLS13_DRAFT_18 - /* Signature and hash algorithms. */ - if ((*inOutIdx - begin) + OPAQUE16_LEN > size) - return BUFFER_ERROR; - ato16(input + *inOutIdx, &len); - *inOutIdx += OPAQUE16_LEN; - if ((*inOutIdx - begin) + len > size) - return BUFFER_ERROR; - if (PickHashSigAlgo(ssl, input + *inOutIdx, len) != 0 && - ssl->buffers.certificate && ssl->buffers.certificate->buffer && - ssl->buffers.key && ssl->buffers.key->buffer) { - return INVALID_PARAMETER; - } - *inOutIdx += len; - - /* Length of certificate authority data. */ - if ((*inOutIdx - begin) + OPAQUE16_LEN > size) - return BUFFER_ERROR; - ato16(input + *inOutIdx, &len); - *inOutIdx += OPAQUE16_LEN; - if ((*inOutIdx - begin) + len > size) - return BUFFER_ERROR; - - /* Certificate authorities. */ - while (len) { - word16 dnSz; - - if ((*inOutIdx - begin) + OPAQUE16_LEN > size) - return BUFFER_ERROR; - - ato16(input + *inOutIdx, &dnSz); - *inOutIdx += OPAQUE16_LEN; - - if ((*inOutIdx - begin) + dnSz > size) - return BUFFER_ERROR; - - *inOutIdx += dnSz; - len -= OPAQUE16_LEN + dnSz; - } - - /* Certificate extensions */ - if ((*inOutIdx - begin) + OPAQUE16_LEN > size) - return BUFFER_ERROR; - ato16(input + *inOutIdx, &len); - *inOutIdx += OPAQUE16_LEN; - if ((*inOutIdx - begin) + len > size) - return BUFFER_ERROR; - *inOutIdx += len; -#else /* TODO: Add support for more extensions: * signed_certificate_timestamp, certificate_authorities, oid_filters. */ @@ -3485,7 +3178,6 @@ static int DoTls13CertificateRequest(WOLFSSL* ssl, const byte* input, return ret; } *inOutIdx += len; -#endif if (ssl->buffers.certificate && ssl->buffers.certificate->buffer && ((ssl->buffers.key && ssl->buffers.key->buffer) @@ -3493,12 +3185,10 @@ static int DoTls13CertificateRequest(WOLFSSL* ssl, const byte* input, || wolfSSL_CTX_IsPrivatePkSet(ssl->ctx) #endif )) { -#ifndef WOLFSSL_TLS13_DRAFT_18 if (PickHashSigAlgo(ssl, peerSuites.hashSigAlgo, peerSuites.hashSigAlgoSz) != 0) { return INVALID_PARAMETER; } -#endif ssl->options.sendVerify = SEND_CERT; } else { @@ -3666,15 +3356,10 @@ static int DoPreSharedKeys(WOLFSSL* ssl, const byte* input, word32 helloSz, /* Resumption PSK is resumption master secret. */ ssl->arrays->psk_keySz = ssl->specs.hash_size; - #ifdef WOLFSSL_TLS13_DRAFT_18 - XMEMCPY(ssl->arrays->psk_key, ssl->session.masterSecret, - ssl->arrays->psk_keySz); - #else if ((ret = DeriveResumptionPSK(ssl, ssl->session.ticketNonce.data, ssl->session.ticketNonce.len, ssl->arrays->psk_key)) != 0) { return ret; } - #endif /* Derive the early secret using the PSK. */ ret = DeriveEarlySecret(ssl); @@ -3842,7 +3527,7 @@ static int DoPreSharedKeys(WOLFSSL* ssl, const byte* input, word32 helloSz, } #endif -#if !defined(WOLFSSL_TLS13_DRAFT_18) && defined(WOLFSSL_SEND_HRR_COOKIE) +#if defined(WOLFSSL_SEND_HRR_COOKIE) /* Check that the Cookie data's integrity. * * ssl SSL/TLS object. @@ -3893,15 +3578,6 @@ static int CheckCookie(WOLFSSL* ssl, byte* cookie, byte cookieSz) #define HRR_VERSIONS_SZ (OPAQUE16_LEN + OPAQUE16_LEN + OPAQUE16_LEN) /* Length of the Cookie Extension excluding cookie data */ #define HRR_COOKIE_HDR_SZ (OPAQUE16_LEN + OPAQUE16_LEN + OPAQUE16_LEN) -#ifdef WOLFSSL_TLS13_DRAFT_18 -/* PV | CipherSuite | Ext Len */ -#define HRR_BODY_SZ (OPAQUE16_LEN + OPAQUE16_LEN + OPAQUE16_LEN) -/* HH | PV | CipherSuite | Ext Len | Key Share | Cookie */ -#define MAX_HRR_SZ (HANDSHAKE_HEADER_SZ + \ - HRR_BODY_SZ + \ - HRR_KEY_SHARE_SZ + \ - HRR_COOKIE_HDR_SZ) -#else /* PV | Random | Session Id | CipherSuite | Compression | Ext Len */ #define HRR_BODY_SZ (VERSION_SZ + RAN_LEN + ENUM_LEN + ID_LEN + \ SUITE_LEN + COMP_LEN + OPAQUE16_LEN) @@ -3911,7 +3587,7 @@ static int CheckCookie(WOLFSSL* ssl, byte* cookie, byte cookieSz) HRR_KEY_SHARE_SZ + \ HRR_VERSIONS_SZ + \ HRR_COOKIE_HDR_SZ) -#endif + /* Restart the handshake hash from the cookie value. * @@ -3949,34 +3625,14 @@ static int RestartHandshakeHashWithCookie(WOLFSSL* ssl, Cookie* cookie) return ret; /* Reconstruct the HelloRetryMessage for handshake hash. */ -#ifdef WOLFSSL_TLS13_DRAFT_18 - length = HRR_BODY_SZ + HRR_COOKIE_HDR_SZ + cookie->len; -#else length = HRR_BODY_SZ - ID_LEN + ssl->session.sessionIDSz + HRR_COOKIE_HDR_SZ + cookie->len; length += HRR_VERSIONS_SZ; -#endif if (cookieDataSz > hashSz + OPAQUE16_LEN) { keyShareExt = 1; length += HRR_KEY_SHARE_SZ; } -#ifdef WOLFSSL_TLS13_DRAFT_18 - AddTls13HandShakeHeader(hrr, length, 0, 0, hello_retry_request, ssl); - idx += hashSz; - hrrIdx = HANDSHAKE_HEADER_SZ; - /* The negotiated protocol version. */ - hrr[hrrIdx++] = TLS_DRAFT_MAJOR; - hrr[hrrIdx++] = TLS_DRAFT_MINOR; - /* Cipher Suite */ - hrr[hrrIdx++] = cookieData[idx++]; - hrr[hrrIdx++] = cookieData[idx++]; - - /* Extensions' length */ - length -= HRR_BODY_SZ; - c16toa(length, hrr + hrrIdx); - hrrIdx += 2; -#else AddTls13HandShakeHeader(hrr, length, 0, 0, server_hello, ssl); idx += hashSz; @@ -4008,7 +3664,6 @@ static int RestartHandshakeHashWithCookie(WOLFSSL* ssl, Cookie* cookie) c16toa(length, hrr + hrrIdx); hrrIdx += 2; -#endif /* Optional KeyShare Extension */ if (keyShareExt) { c16toa(TLSX_KEY_SHARE, hrr + hrrIdx); @@ -4018,7 +3673,6 @@ static int RestartHandshakeHashWithCookie(WOLFSSL* ssl, Cookie* cookie) hrr[hrrIdx++] = cookieData[idx++]; hrr[hrrIdx++] = cookieData[idx++]; } -#ifndef WOLFSSL_TLS13_DRAFT_18 c16toa(TLSX_SUPPORTED_VERSIONS, hrr + hrrIdx); hrrIdx += 2; c16toa(OPAQUE16_LEN, hrr + hrrIdx); @@ -4030,7 +3684,7 @@ static int RestartHandshakeHashWithCookie(WOLFSSL* ssl, Cookie* cookie) hrr[hrrIdx++] = ssl->version.major; hrr[hrrIdx++] = ssl->version.minor; #endif -#endif + /* Mandatory Cookie Extension */ c16toa(TLSX_COOKIE, hrr + hrrIdx); hrrIdx += 2; @@ -4215,18 +3869,9 @@ int DoTls13ClientHello(WOLFSSL* ssl, const byte* input, word32* inOutIdx, WOLFSSL_BUFFER(ssl->arrays->clientRandom, RAN_LEN); #endif -#ifdef WOLFSSL_TLS13_DRAFT_18 - /* Session id - empty in TLS v1.3 */ - sessIdSz = input[i++]; - if (sessIdSz > 0 && !ssl->options.downgrade) { - WOLFSSL_MSG("Client sent session id - not supported"); - return BUFFER_ERROR; - } -#else sessIdSz = input[i++]; if (sessIdSz != ID_LEN && sessIdSz != 0) return INVALID_PARAMETER; -#endif if (sessIdSz + i > helloSz) { return BUFFER_ERROR; @@ -4322,7 +3967,7 @@ int DoTls13ClientHello(WOLFSSL* ssl, const byte* input, word32* inOutIdx, ssl->options.clientState = CLIENT_HELLO_COMPLETE; ssl->options.haveSessionId = 1; -#if !defined(WOLFSSL_TLS13_DRAFT_18) && defined(WOLFSSL_SEND_HRR_COOKIE) +#if defined(WOLFSSL_SEND_HRR_COOKIE) if (ssl->options.sendCookie && ssl->options.serverState == SERVER_HELLO_RETRY_REQUEST_COMPLETE) { TLSX* ext; @@ -4414,88 +4059,12 @@ int DoTls13ClientHello(WOLFSSL* ssl, const byte* input, word32* inOutIdx, return ret; } -#ifdef WOLFSSL_TLS13_DRAFT_18 -/* handle generation of TLS 1.3 hello_retry_request (6) */ -/* Send the HelloRetryRequest message to indicate the negotiated protocol - * version and security parameters the server is willing to use. - * Only a server will send this message. - * - * ssl The SSL/TLS object. - * returns 0 on success, otherwise failure. - */ -int SendTls13HelloRetryRequest(WOLFSSL* ssl) -{ - int ret; - byte* output; - word32 length; - word16 len; - word32 idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ; - int sendSz; - - WOLFSSL_ENTER("SendTls13HelloRetryRequest"); - - /* Get the length of the extensions that will be written. */ - len = 0; - ret = TLSX_GetResponseSize(ssl, hello_retry_request, &len); - /* There must be extensions sent to indicate what client needs to do. */ - if (ret != 0) - return MISSING_HANDSHAKE_DATA; - - /* Protocol version + Extensions */ - length = OPAQUE16_LEN + len; - sendSz = idx + length; - - /* Check buffers are big enough and grow if needed. */ - if ((ret = CheckAvailableSize(ssl, sendSz)) != 0) - return ret; - - /* Get position in output buffer to write new message to. */ - output = ssl->buffers.outputBuffer.buffer + - ssl->buffers.outputBuffer.length; - /* Add record and handshake headers. */ - AddTls13Headers(output, length, hello_retry_request, ssl); - - /* The negotiated protocol version. */ - output[idx++] = TLS_DRAFT_MAJOR; - output[idx++] = TLS_DRAFT_MINOR; - - /* Add TLS extensions. */ - ret = TLSX_WriteResponse(ssl, output + idx, hello_retry_request, NULL); - if (ret != 0) - return ret; - idx += len; - -#ifdef WOLFSSL_CALLBACKS - if (ssl->hsInfoOn) - AddPacketName(ssl, "HelloRetryRequest"); - if (ssl->toInfoOn) { - AddPacketInfo(ssl, "HelloRetryRequest", handshake, output, sendSz, - WRITE_PROTO, ssl->heap); - } -#endif - if ((ret = HashOutput(ssl, output, idx, 0)) != 0) - return ret; - - ssl->buffers.outputBuffer.length += sendSz; - - if (!ssl->options.groupMessages) - ret = SendBuffered(ssl); - - WOLFSSL_LEAVE("SendTls13HelloRetryRequest", ret); - - return ret; -} -#endif /* WOLFSSL_TLS13_DRAFT_18 */ - /* Send TLS v1.3 ServerHello message to client. * Only a server will send this message. * * ssl The SSL/TLS object. * returns 0 on success, otherwise failure. */ -#ifdef WOLFSSL_TLS13_DRAFT_18 -static -#endif /* handle generation of TLS 1.3 server_hello (2) */ int SendTls13ServerHello(WOLFSSL* ssl, byte extMsgType) { @@ -4508,21 +4077,12 @@ int SendTls13ServerHello(WOLFSSL* ssl, byte extMsgType) WOLFSSL_START(WC_FUNC_SERVER_HELLO_SEND); WOLFSSL_ENTER("SendTls13ServerHello"); -#ifndef WOLFSSL_TLS13_DRAFT_18 if (extMsgType == hello_retry_request) { WOLFSSL_MSG("wolfSSL Doing HelloRetryRequest"); if ((ret = RestartHandshakeHash(ssl)) < 0) return ret; } -#endif -#ifdef WOLFSSL_TLS13_DRAFT_18 - /* Protocol version, server random, cipher suite and extensions. */ - length = VERSION_SZ + RAN_LEN + SUITE_LEN; - ret = TLSX_GetResponseSize(ssl, server_hello, &length); - if (ret != 0) - return ret; -#else /* Protocol version, server random, session id, cipher suite, compression * and extensions. */ @@ -4531,7 +4091,6 @@ int SendTls13ServerHello(WOLFSSL* ssl, byte extMsgType) ret = TLSX_GetResponseSize(ssl, extMsgType, &length); if (ret != 0) return ret; -#endif sendSz = idx + length; /* Check buffers are big enough and grow if needed. */ @@ -4545,27 +4104,20 @@ int SendTls13ServerHello(WOLFSSL* ssl, byte extMsgType) /* Put the record and handshake headers on. */ AddTls13Headers(output, length, server_hello, ssl); -#ifdef WOLFSSL_TLS13_DRAFT_18 - /* The negotiated protocol version. */ - output[idx++] = TLS_DRAFT_MAJOR; - output[idx++] = TLS_DRAFT_MINOR; -#else /* The protocol version must be TLS v1.2 for middleboxes. */ output[idx++] = ssl->version.major; output[idx++] = TLSv1_2_MINOR; -#endif if (extMsgType == server_hello) { /* Generate server random. */ if ((ret = wc_RNG_GenerateBlock(ssl->rng, output + idx, RAN_LEN)) != 0) return ret; } -#ifndef WOLFSSL_TLS13_DRAFT_18 else { /* HelloRetryRequest message has fixed value for random. */ XMEMCPY(output + idx, helloRetryRequestRandom, RAN_LEN); } -#endif + /* Store in SSL for debugging. */ XMEMCPY(ssl->arrays->serverRandom, output + idx, RAN_LEN); idx += RAN_LEN; @@ -4575,22 +4127,18 @@ int SendTls13ServerHello(WOLFSSL* ssl, byte extMsgType) WOLFSSL_BUFFER(ssl->arrays->serverRandom, RAN_LEN); #endif -#ifndef WOLFSSL_TLS13_DRAFT_18 output[idx++] = ssl->session.sessionIDSz; if (ssl->session.sessionIDSz > 0) { XMEMCPY(output + idx, ssl->session.sessionID, ssl->session.sessionIDSz); idx += ssl->session.sessionIDSz; } -#endif /* Chosen cipher suite */ output[idx++] = ssl->options.cipherSuite0; output[idx++] = ssl->options.cipherSuite; -#ifndef WOLFSSL_TLS13_DRAFT_18 /* Compression not supported in TLS v1.3. */ output[idx++] = 0; -#endif /* Extensions */ ret = TLSX_WriteResponse(ssl, output + idx, extMsgType, NULL); @@ -4611,18 +4159,11 @@ int SendTls13ServerHello(WOLFSSL* ssl, byte extMsgType) } #endif -#ifdef WOLFSSL_TLS13_DRAFT_18 - ssl->options.serverState = SERVER_HELLO_COMPLETE; -#else if (extMsgType == server_hello) ssl->options.serverState = SERVER_HELLO_COMPLETE; -#endif -#ifdef WOLFSSL_TLS13_DRAFT_18 - if (!ssl->options.groupMessages) -#else if (!ssl->options.groupMessages || extMsgType != server_hello) -#endif + ret = SendBuffered(ssl); WOLFSSL_LEAVE("SendTls13ServerHello", ret); @@ -4751,9 +4292,7 @@ static int SendTls13CertificateRequest(WOLFSSL* ssl, byte* reqCtx, int sendSz; word32 i; word16 reqSz; -#ifndef WOLFSSL_TLS13_DRAFT_18 TLSX* ext; -#endif WOLFSSL_START(WC_FUNC_CERTIFICATE_REQUEST_SEND); WOLFSSL_ENTER("SendTls13CertificateRequest"); @@ -4761,48 +4300,6 @@ static int SendTls13CertificateRequest(WOLFSSL* ssl, byte* reqCtx, if (ssl->options.side == WOLFSSL_SERVER_END) InitSuitesHashSigAlgo(ssl->suites, 1, 1, 0, 1, ssl->buffers.keySz); -#ifdef WOLFSSL_TLS13_DRAFT_18 - i = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ; - reqSz = OPAQUE8_LEN + reqCtxLen + REQ_HEADER_SZ + REQ_HEADER_SZ; - reqSz += LENGTH_SZ + ssl->suites->hashSigAlgoSz; - - sendSz = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ + reqSz; - /* Always encrypted and make room for padding. */ - sendSz += MAX_MSG_EXTRA; - - /* Check buffers are big enough and grow if needed. */ - if ((ret = CheckAvailableSize(ssl, sendSz)) != 0) - return ret; - - /* Get position in output buffer to write new message to. */ - output = ssl->buffers.outputBuffer.buffer + - ssl->buffers.outputBuffer.length; - - /* Put the record and handshake headers on. */ - AddTls13Headers(output, reqSz, certificate_request, ssl); - - /* Certificate request context. */ - output[i++] = reqCtxLen; - if (reqCtxLen != 0) { - XMEMCPY(output + i, reqCtx, reqCtxLen); - i += reqCtxLen; - } - - /* supported hash/sig */ - c16toa(ssl->suites->hashSigAlgoSz, &output[i]); - i += LENGTH_SZ; - - XMEMCPY(&output[i], ssl->suites->hashSigAlgo, ssl->suites->hashSigAlgoSz); - i += ssl->suites->hashSigAlgoSz; - - /* Certificate authorities not supported yet - empty buffer. */ - c16toa(0, &output[i]); - i += REQ_HEADER_SZ; - - /* Certificate extensions. */ - c16toa(0, &output[i]); /* auth's */ - i += REQ_HEADER_SZ; -#else ext = TLSX_Find(ssl->extensions, TLSX_SIGNATURE_ALGORITHMS); if (ext == NULL) return EXT_MISSING; @@ -4842,7 +4339,6 @@ static int SendTls13CertificateRequest(WOLFSSL* ssl, byte* reqCtx, if (ret != 0) return ret; i += reqSz; -#endif /* Always encrypted. */ sendSz = BuildTls13Message(ssl, output, sendSz, output + RECORD_HEADER_SZ, @@ -6840,10 +6336,8 @@ static int DoTls13NewSessionTicket(WOLFSSL* ssl, const byte* input, word32 ageAdd; word16 length; word32 now; -#ifndef WOLFSSL_TLS13_DRAFT_18 const byte* nonce; byte nonceLength; -#endif WOLFSSL_START(WC_FUNC_NEW_SESSION_TICKET_DO); WOLFSSL_ENTER("DoTls13NewSessionTicket"); @@ -6862,7 +6356,6 @@ static int DoTls13NewSessionTicket(WOLFSSL* ssl, const byte* input, ato32(input + *inOutIdx, &ageAdd); *inOutIdx += SESSION_ADD_SZ; -#ifndef WOLFSSL_TLS13_DRAFT_18 /* Ticket nonce. */ if ((*inOutIdx - begin) + 1 > size) return BUFFER_ERROR; @@ -6876,7 +6369,6 @@ static int DoTls13NewSessionTicket(WOLFSSL* ssl, const byte* input, return BUFFER_ERROR; nonce = input + *inOutIdx; *inOutIdx += nonceLength; -#endif /* Ticket length. */ if ((*inOutIdx - begin) + LENGTH_SZ > size) @@ -6903,11 +6395,9 @@ static int DoTls13NewSessionTicket(WOLFSSL* ssl, const byte* input, #ifdef WOLFSSL_EARLY_DATA ssl->session.maxEarlyDataSz = ssl->options.maxEarlyDataSz; #endif -#ifndef WOLFSSL_TLS13_DRAFT_18 ssl->session.ticketNonce.len = nonceLength; if (nonceLength > 0) XMEMCPY(&ssl->session.ticketNonce.data, nonce, nonceLength); -#endif ssl->session.namedGroup = ssl->namedGroup; if ((*inOutIdx - begin) + EXTS_SZ > size) @@ -7070,7 +6560,6 @@ static int SendTls13NewSessionTicket(WOLFSSL* ssl) } #endif -#ifndef WOLFSSL_TLS13_DRAFT_18 /* Start ticket nonce at 0 and go up to 255. */ if (ssl->session.ticketNonce.len == 0) { ssl->session.ticketNonce.len = DEF_TICKET_NONCE_SZ; @@ -7078,7 +6567,6 @@ static int SendTls13NewSessionTicket(WOLFSSL* ssl) } else ssl->session.ticketNonce.data[0]++; -#endif if (!ssl->options.noTicketTls13) { if ((ret = CreateTicket(ssl)) != 0) @@ -7100,10 +6588,8 @@ static int SendTls13NewSessionTicket(WOLFSSL* ssl) /* Lifetime | Age Add | Ticket | Extensions */ length = SESSION_HINT_SZ + SESSION_ADD_SZ + LENGTH_SZ + ssl->session.ticketLen + extSz; -#ifndef WOLFSSL_TLS13_DRAFT_18 /* Nonce */ length += TICKET_NONCE_LEN_SZ + DEF_TICKET_NONCE_SZ; -#endif sendSz = idx + length + MAX_MSG_EXTRA; /* Check buffers are big enough and grow if needed. */ @@ -7124,10 +6610,8 @@ static int SendTls13NewSessionTicket(WOLFSSL* ssl) c32toa(ssl->session.ticketAdd, output + idx); idx += SESSION_ADD_SZ; -#ifndef WOLFSSL_TLS13_DRAFT_18 output[idx++] = ssl->session.ticketNonce.len; output[idx++] = ssl->session.ticketNonce.data[0]; -#endif /* length */ c16toa(ssl->session.ticketLen, output + idx); @@ -7213,19 +6697,11 @@ static int SanityCheckTls13MsgReceived(WOLFSSL* ssl, byte type) return OUT_OF_ORDER_E; } #endif - #ifdef WOLFSSL_TLS13_DRAFT_18 - if (ssl->msgsReceived.got_server_hello) { - WOLFSSL_MSG("Duplicate ServerHello received"); - return DUPLICATE_MSG_E; - } - ssl->msgsReceived.got_server_hello = 1; - #else if (ssl->msgsReceived.got_server_hello == 2) { WOLFSSL_MSG("Duplicate ServerHello received"); return DUPLICATE_MSG_E; } ssl->msgsReceived.got_server_hello++; - #endif break; #endif @@ -7274,29 +6750,6 @@ static int SanityCheckTls13MsgReceived(WOLFSSL* ssl, byte type) #endif #endif -#ifdef WOLFSSL_TLS13_DRAFT_18 - #ifndef NO_WOLFSSL_CLIENT - case hello_retry_request: - #ifndef NO_WOLFSSL_SERVER - if (ssl->options.side == WOLFSSL_SERVER_END) { - WOLFSSL_MSG("HelloRetryRequest received by server"); - return OUT_OF_ORDER_E; - } - #endif - if (ssl->options.clientState > CLIENT_FINISHED_COMPLETE) { - WOLFSSL_MSG("HelloRetryRequest received out of order"); - return OUT_OF_ORDER_E; - } - if (ssl->msgsReceived.got_hello_retry_request) { - WOLFSSL_MSG("Duplicate HelloRetryRequest received"); - return DUPLICATE_MSG_E; - } - ssl->msgsReceived.got_hello_retry_request = 1; - - break; - #endif -#endif - #ifndef NO_WOLFSSL_CLIENT case encrypted_extensions: #ifndef NO_WOLFSSL_SERVER @@ -7557,13 +7010,6 @@ int DoTls13HandShakeMsgType(WOLFSSL* ssl, byte* input, word32* inOutIdx, switch (type) { #ifndef NO_WOLFSSL_CLIENT /* Messages only received by client. */ - #ifdef WOLFSSL_TLS13_DRAFT_18 - case hello_retry_request: - WOLFSSL_MSG("processing hello retry request"); - ret = DoTls13HelloRetryRequest(ssl, input, inOutIdx, size); - break; - #endif - case server_hello: WOLFSSL_MSG("processing server hello"); ret = DoTls13ServerHello(ssl, input, inOutIdx, size, &type); @@ -7918,8 +7364,7 @@ int wolfSSL_connect_TLSv13(WOLFSSL* ssl) WOLFSSL_MSG("connect state: CLIENT_HELLO_SENT"); #ifdef WOLFSSL_EARLY_DATA if (ssl->earlyData != no_early_data) { - #if !defined(WOLFSSL_TLS13_DRAFT_18) && \ - defined(WOLFSSL_TLS13_MIDDLEBOX_COMPAT) + #if defined(WOLFSSL_TLS13_MIDDLEBOX_COMPAT) if ((ssl->error = SendChangeCipher(ssl)) != 0) { WOLFSSL_ERROR(ssl->error); return WOLFSSL_FATAL_ERROR; @@ -7962,8 +7407,7 @@ int wolfSSL_connect_TLSv13(WOLFSSL* ssl) if (ssl->options.serverState == SERVER_HELLO_RETRY_REQUEST_COMPLETE) { - #if !defined(WOLFSSL_TLS13_DRAFT_18) && \ - defined(WOLFSSL_TLS13_MIDDLEBOX_COMPAT) + #if defined(WOLFSSL_TLS13_MIDDLEBOX_COMPAT) if (!ssl->options.sentChangeCipher) { if ((ssl->error = SendChangeCipher(ssl)) != 0) { WOLFSSL_ERROR(ssl->error); @@ -8012,8 +7456,7 @@ int wolfSSL_connect_TLSv13(WOLFSSL* ssl) FALL_THROUGH; case FIRST_REPLY_FIRST: - #if !defined(WOLFSSL_TLS13_DRAFT_18) && \ - defined(WOLFSSL_TLS13_MIDDLEBOX_COMPAT) + #if defined(WOLFSSL_TLS13_MIDDLEBOX_COMPAT) if (!ssl->options.sentChangeCipher) { if ((ssl->error = SendChangeCipher(ssl)) != 0) { WOLFSSL_ERROR(ssl->error); @@ -8654,21 +8097,6 @@ int wolfSSL_accept_TLSv13(WOLFSSL* ssl) FALL_THROUGH; case TLS13_ACCEPT_CLIENT_HELLO_DONE : -#ifdef WOLFSSL_TLS13_DRAFT_18 - if (ssl->options.serverState == - SERVER_HELLO_RETRY_REQUEST_COMPLETE) { - if ((ssl->error = SendTls13HelloRetryRequest(ssl)) != 0) { - WOLFSSL_ERROR(ssl->error); - return WOLFSSL_FATAL_ERROR; - } - } - - ssl->options.acceptState = TLS13_ACCEPT_FIRST_REPLY_DONE; - WOLFSSL_MSG("accept state ACCEPT_FIRST_REPLY_DONE"); - FALL_THROUGH; - - case TLS13_ACCEPT_HELLO_RETRY_REQUEST_DONE : -#else if (ssl->options.serverState == SERVER_HELLO_RETRY_REQUEST_COMPLETE) { if ((ssl->error = SendTls13ServerHello(ssl, @@ -8697,7 +8125,6 @@ int wolfSSL_accept_TLSv13(WOLFSSL* ssl) ssl->options.acceptState = TLS13_ACCEPT_FIRST_REPLY_DONE; WOLFSSL_MSG("accept state ACCEPT_FIRST_REPLY_DONE"); FALL_THROUGH; -#endif case TLS13_ACCEPT_FIRST_REPLY_DONE : if (ssl->options.serverState == @@ -8725,8 +8152,7 @@ int wolfSSL_accept_TLSv13(WOLFSSL* ssl) FALL_THROUGH; case TLS13_SERVER_HELLO_SENT : - #if !defined(WOLFSSL_TLS13_DRAFT_18) && \ - defined(WOLFSSL_TLS13_MIDDLEBOX_COMPAT) + #if defined(WOLFSSL_TLS13_MIDDLEBOX_COMPAT) if (!ssl->options.sentChangeCipher) { if ((ssl->error = SendChangeCipher(ssl)) != 0) { WOLFSSL_ERROR(ssl->error); diff --git a/wolfssl/internal.h b/wolfssl/internal.h index 5506224bf..18541a648 100644 --- a/wolfssl/internal.h +++ b/wolfssl/internal.h @@ -1210,19 +1210,6 @@ enum Misc { TLSv1_2_MINOR = 3, /* TLSv1_2 minor version number */ TLSv1_3_MINOR = 4, /* TLSv1_3 minor version number */ TLS_DRAFT_MAJOR = 0x7f, /* Draft TLS major version number */ -#ifdef WOLFSSL_TLS13_DRAFT -#ifdef WOLFSSL_TLS13_DRAFT_18 - TLS_DRAFT_MINOR = 0x12, /* Minor version number of TLS draft */ -#elif defined(WOLFSSL_TLS13_DRAFT_22) - TLS_DRAFT_MINOR = 0x16, /* Minor version number of TLS draft */ -#elif defined(WOLFSSL_TLS13_DRAFT_23) - TLS_DRAFT_MINOR = 0x17, /* Minor version number of TLS draft */ -#elif defined(WOLFSSL_TLS13_DRAFT_26) - TLS_DRAFT_MINOR = 0x1a, /* Minor version number of TLS draft */ -#else - TLS_DRAFT_MINOR = 0x1c, /* Minor version number of TLS draft */ -#endif -#endif OLD_HELLO_ID = 0x01, /* SSLv2 Client Hello Indicator */ INVALID_BYTE = 0xff, /* Used to initialize cipher specs values */ NO_COMPRESSION = 0, @@ -2187,12 +2174,8 @@ typedef enum { #ifdef WOLFSSL_POST_HANDSHAKE_AUTH TLSX_POST_HANDSHAKE_AUTH = 0x0031, #endif - #if defined(WOLFSSL_TLS13_DRAFT_18) || defined(WOLFSSL_TLS13_DRAFT_22) - TLSX_KEY_SHARE = 0x0028, - #else TLSX_SIGNATURE_ALGORITHMS_CERT = 0x0032, TLSX_KEY_SHARE = 0x0033, - #endif #endif TLSX_RENEGOTIATION_INFO = 0xff01 } TLSX_Type; @@ -2534,7 +2517,6 @@ WOLFSSL_LOCAL int TLSX_KeyShare_DeriveSecret(WOLFSSL* ssl); #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK) -#ifndef WOLFSSL_TLS13_DRAFT_18 /* Ticket nonce - for deriving PSK. * Length allowed to be: 1..255. Only support 4 bytes. */ @@ -2542,7 +2524,6 @@ typedef struct TicketNonce { byte len; byte data[MAX_TICKET_NONCE_SZ]; } TicketNonce; -#endif /* The PreSharedKey extension information - entry in a linked list. */ typedef struct PreSharedKey { @@ -3169,9 +3150,7 @@ struct WOLFSSL_SESSION { #ifdef WOLFSSL_TLS13 word32 ticketSeen; /* Time ticket seen (ms) */ word32 ticketAdd; /* Added by client */ - #ifndef WOLFSSL_TLS13_DRAFT_18 TicketNonce ticketNonce; /* Nonce used to derive PSK */ - #endif #endif #ifdef WOLFSSL_EARLY_DATA word32 maxEarlyDataSz; @@ -3983,11 +3962,9 @@ struct WOLFSSL { #endif word16 pssAlgo; #ifdef WOLFSSL_TLS13 - #if !defined(WOLFSSL_TLS13_DRAFT_18) && !defined(WOLFSSL_TLS13_DRAFT_22) word16 certHashSigAlgoSz; /* SigAlgoCert ext length in bytes */ byte certHashSigAlgo[WOLFSSL_MAX_SIGALGO]; /* cert sig/algo to * offer */ - #endif /* !WOLFSSL_TLS13_DRAFT_18 && !WOLFSSL_TLS13_DRAFT_22 */ #endif #ifdef HAVE_NTRU word16 peerNtruKeyLen; @@ -4345,12 +4322,8 @@ WOLFSSL_LOCAL int SendTicket(WOLFSSL*); WOLFSSL_LOCAL int DoClientTicket(WOLFSSL*, const byte*, word32); WOLFSSL_LOCAL int SendData(WOLFSSL*, const void*, int); #ifdef WOLFSSL_TLS13 -#ifdef WOLFSSL_TLS13_DRAFT_18 -WOLFSSL_LOCAL int SendTls13HelloRetryRequest(WOLFSSL*); -#else WOLFSSL_LOCAL int SendTls13ServerHello(WOLFSSL*, byte); #endif -#endif WOLFSSL_LOCAL int SendCertificate(WOLFSSL*); WOLFSSL_LOCAL int SendCertificateRequest(WOLFSSL*); #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \ From 093d9981fb5320096bde0cd54ee714547d678e80 Mon Sep 17 00:00:00 2001 From: David Garske Date: Mon, 4 May 2020 10:33:43 -0700 Subject: [PATCH 167/298] Disable `fast-rsa` if RSA PSS is enabled (not supported). --- configure.ac | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/configure.ac b/configure.ac index 006212701..cb86b6043 100644 --- a/configure.ac +++ b/configure.ac @@ -4487,6 +4487,11 @@ AC_ARG_ENABLE([fast-rsa], [ ENABLED_FAST_RSA=no ], ) +# Fast RSA does not support RSA-PSS +if test "$ENABLED_RSAPSS" = "yes"; then + ENABLED_FAST_RSA=no +fi + if test "$ENABLED_USER_RSA" = "no" && test "$ENABLED_FIPS" = "no"; then if test "$ac_cv_sizeof_long" = "4" && test "$ac_cv_sizeof_long_long" = "8"; then From b417a76613eeb73d9b0832ea2e93593c83511e6c Mon Sep 17 00:00:00 2001 From: David Garske Date: Tue, 12 May 2020 09:26:27 -0700 Subject: [PATCH 168/298] Fixes for build TLS v1.3 with NO_CERTS. --- src/internal.c | 8 -------- src/tls13.c | 5 +++-- 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/src/internal.c b/src/internal.c index 3edc42913..a1d34fd16 100644 --- a/src/internal.c +++ b/src/internal.c @@ -7584,7 +7584,6 @@ static int EdDSA_Update(WOLFSSL* ssl, const byte* data, int sz) } #endif /* (HAVE_ED25519 || HAVE_ED448) && !WOLFSSL_NO_CLIENT_AUTH */ -#ifndef NO_CERTS int HashOutputRaw(WOLFSSL* ssl, const byte* output, int sz) { int ret = 0; @@ -7635,8 +7634,6 @@ int HashOutputRaw(WOLFSSL* ssl, const byte* output, int sz) return ret; } -#endif /* NO_CERTS */ - /* add output to md5 and sha handshake hashes, exclude record header */ int HashOutput(WOLFSSL* ssl, const byte* output, int sz, int ivSz) @@ -15603,9 +15600,6 @@ static int SSL_hmac(WOLFSSL* ssl, byte* digest, const byte* in, word32 sz, } #endif /* !NO_OLD_TLS && !WOLFSSL_AEAD_ONLY */ - -#ifndef NO_CERTS - #if !defined(NO_MD5) && !defined(NO_OLD_TLS) static int BuildMD5_CertVerify(WOLFSSL* ssl, byte* digest) { @@ -15748,8 +15742,6 @@ int BuildCertHashes(WOLFSSL* ssl, Hashes* hashes) return ret; } -#endif /* !NO_CERTS */ - #ifndef WOLFSSL_NO_TLS12 /* Persistable BuildMessage arguments */ typedef struct BuildMsgArgs { diff --git a/src/tls13.c b/src/tls13.c index 06bdbecd2..9668463fa 100644 --- a/src/tls13.c +++ b/src/tls13.c @@ -3102,6 +3102,7 @@ static int DoTls13EncryptedExtensions(WOLFSSL* ssl, const byte* input, return ret; } +#ifndef NO_CERTS /* handle processing TLS v1.3 certificate_request (13) */ /* Handle a TLS v1.3 CertificateRequest message. * This message is always encrypted. @@ -3203,7 +3204,7 @@ static int DoTls13CertificateRequest(WOLFSSL* ssl, const byte* input, return ret; } - +#endif /* !NO_CERTS */ #endif /* !NO_WOLFSSL_CLIENT */ #ifndef NO_WOLFSSL_SERVER @@ -5823,6 +5824,7 @@ exit_dcv: return ret; } #endif /* !NO_RSA || HAVE_ECC */ +#endif /* !NO_CERTS */ /* Parse and handle a TLS v1.3 Finished message. * @@ -5930,7 +5932,6 @@ static int DoTls13Finished(WOLFSSL* ssl, const byte* input, word32* inOutIdx, return 0; } -#endif /* NO_CERTS */ /* Send the TLS v1.3 Finished message. * From ba8227bcf72a6dd858878cf3d727768cb2e779c3 Mon Sep 17 00:00:00 2001 From: David Garske Date: Tue, 12 May 2020 09:31:22 -0700 Subject: [PATCH 169/298] Fix for building TLS v1.3 with `NO_WOLFSSL_CLIENT`. --- src/internal.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/internal.c b/src/internal.c index a1d34fd16..6b390b64c 100644 --- a/src/internal.c +++ b/src/internal.c @@ -20252,7 +20252,7 @@ exit_dpk: return SetCipherSpecs(ssl); } -#endif /* WOLFSSL_NO_TLS12 */ +#endif /* !WOLFSSL_NO_TLS12 */ /* Make sure client setup is valid for this suite, true on success */ From 8300754ecd134ed9be4dc255128ea3b726da6e42 Mon Sep 17 00:00:00 2001 From: David Garske Date: Tue, 12 May 2020 09:51:20 -0700 Subject: [PATCH 170/298] Fix for "testsuite" with TLSv1.3 and `--enable-sniffer`. --- examples/echoclient/echoclient.c | 7 +++++-- examples/echoserver/echoserver.c | 7 +++++-- testsuite/testsuite.c | 2 +- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/examples/echoclient/echoclient.c b/examples/echoclient/echoclient.c index e27ecc2b5..a71fc48b2 100644 --- a/examples/echoclient/echoclient.c +++ b/examples/echoclient/echoclient.c @@ -150,8 +150,11 @@ void echoclient_test(void* args) #endif #if defined(CYASSL_SNIFFER) - /* don't use EDH, can't sniff tmp keys */ - SSL_CTX_set_cipher_list(ctx, "AES256-SHA"); + /* Only set if not running testsuite */ + if (XSTRNCMP(argv[0], "testsuite", XSTRLEN("testsuite")) != 0) { + /* don't use EDH, can't sniff tmp keys */ + SSL_CTX_set_cipher_list(ctx, "AES256-SHA"); + } #endif #ifndef NO_PSK if (doPSK) { diff --git a/examples/echoserver/echoserver.c b/examples/echoserver/echoserver.c index d268ab479..847667a27 100644 --- a/examples/echoserver/echoserver.c +++ b/examples/echoserver/echoserver.c @@ -227,8 +227,11 @@ THREAD_RETURN CYASSL_THREAD echoserver_test(void* args) #endif #if defined(CYASSL_SNIFFER) - /* don't use EDH, can't sniff tmp keys */ - CyaSSL_CTX_set_cipher_list(ctx, "AES256-SHA"); + /* Only set if not running testsuite */ + if (XSTRNCMP(argv[0], "testsuite", XSTRLEN("testsuite")) != 0) { + /* don't use EDH, can't sniff tmp keys */ + CyaSSL_CTX_set_cipher_list(ctx, "AES256-SHA"); + } #endif if (doPSK) { diff --git a/testsuite/testsuite.c b/testsuite/testsuite.c index 8cd2cd291..7a8115a43 100644 --- a/testsuite/testsuite.c +++ b/testsuite/testsuite.c @@ -152,7 +152,7 @@ int testsuite_test(int argc, char** argv) return EXIT_FAILURE; } - strcpy(arg[0], "echoclient"); + strcpy(arg[0], "testsuite"); strcpy(arg[1], "input"); strcpy(arg[2], outputName); From 4d8cf5b5711aba5e7d2b28e9d4a03b9bb876bc33 Mon Sep 17 00:00:00 2001 From: David Garske Date: Tue, 12 May 2020 11:53:19 -0700 Subject: [PATCH 171/298] Fixes for building TLSv1.3 with FIPS v1 (no RSA PSS or HKDF). --- configure.ac | 54 +++++++++++++++++++++++++----------- src/tls13.c | 8 +++--- wolfcrypt/test/test.c | 4 +-- wolfssl/wolfcrypt/settings.h | 6 ++++ 4 files changed, 50 insertions(+), 22 deletions(-) diff --git a/configure.ac b/configure.ac index cb86b6043..521a9d243 100644 --- a/configure.ac +++ b/configure.ac @@ -96,6 +96,32 @@ AS_IF([test "$ax_enable_debug" = "yes"], [AM_CFLAGS="$AM_CFLAGS -DNDEBUG"]) + +# FIPS +AC_ARG_ENABLE([fips], + [AS_HELP_STRING([--enable-fips],[Enable FIPS 140-2, Will NOT work w/o FIPS license (default: disabled)])], + [ENABLED_FIPS=$enableval], + [ENABLED_FIPS="no"]) + +AS_CASE([$ENABLED_FIPS], + ["v2"],[ + # FIPS v2 + ENABLED_FIPS="yes" + FIPS_VERSION="v2" + ], + ["rand"],[ + # FIPS Rand + ENABLED_FIPS="yes" + FIPS_VERSION="rand" + ], + ["no"],[FIPS_VERSION="none"], + [ + # FIPS v1 + ENABLED_FIPS="yes" + FIPS_VERSION="v1" + ]) + + # Distro build feature subset (Debian, Ubuntu, etc.) AC_ARG_ENABLE([distro], [AS_HELP_STRING([--enable-distro],[Enable wolfSSL distro build (default: disabled)])], @@ -119,7 +145,11 @@ AC_ARG_ENABLE([all], if test "$ENABLED_ALL" = "yes" then enable_dtls=yes - enable_tls13=yes + if test "x$FIPS_VERSION" != "xv1" + then + enable_tls13=yes + enable_rsapss=yes + fi enable_openssh=yes enable_opensslextra=yes enable_opensslall=yes @@ -293,7 +323,10 @@ AC_ARG_ENABLE([tls13], [ ENABLED_TLS13=$enableval ], [ ENABLED_TLS13=yes ] ) - +if test "x$FIPS_VERSION" = "xv1" +then + ENABLED_TLS13="no" +fi if test "$ENABLED_TLS13" = "yes" then AM_CFLAGS="-DWOLFSSL_TLS13 -DHAVE_TLS_EXTENSIONS -DHAVE_SUPPORTED_CURVES $AM_CFLAGS" @@ -2429,14 +2462,8 @@ fi # FIPS -AC_ARG_ENABLE([fips], - [AS_HELP_STRING([--enable-fips],[Enable FIPS 140-2, Will NOT work w/o FIPS license (default: disabled)])], - [ENABLED_FIPS=$enableval], - [ENABLED_FIPS="no"]) - -AS_CASE([$ENABLED_FIPS], - ["v2"],[FIPS_VERSION="v2" - ENABLED_FIPS=yes +AS_CASE([$FIPS_VERSION], + ["v2"],[ AM_CFLAGS="$AM_CFLAGS -DHAVE_FIPS -DHAVE_FIPS_VERSION=2 -DWOLFSSL_KEY_GEN -DWOLFSSL_SHA224 -DWOLFSSL_AES_DIRECT -DHAVE_AES_ECB -DHAVE_ECC_CDH -DWC_RSA_NO_PADDING -DWOLFSSL_VALIDATE_FFC_IMPORT -DHAVE_FFDHE_Q" ENABLED_KEYGEN="yes" ENABLED_SHA224="yes" @@ -2467,14 +2494,9 @@ AS_CASE([$ENABLED_FIPS], [AM_CFLAGS="$AM_CFLAGS -DFORCE_FAILURE_RDSEED"]) ], ["rand"],[ - ENABLED_FIPS="yes" - FIPS_VERSION="rand" AM_CFLAGS="$AM_CFLAGS -DWOLFCRYPT_FIPS_RAND -DHAVE_FIPS -DHAVE_FIPS_VERSION=2" ], - ["no"],[FIPS_VERSION="none"], - [ - ENABLED_FIPS="yes" - FIPS_VERSION="v1" + ["v1"],[ AM_CFLAGS="$AM_CFLAGS -DHAVE_FIPS" ]) diff --git a/src/tls13.c b/src/tls13.c index 9668463fa..5ab2b55b5 100644 --- a/src/tls13.c +++ b/src/tls13.c @@ -4679,7 +4679,7 @@ static int CreateECCEncodedSig(byte* sigData, int sigDataSz, int hashAlgo) } #endif /* HAVE_ECC */ -#ifndef NO_RSA +#if !defined(NO_RSA) && defined(WC_RSA_PSS) /* Check that the decrypted signature matches the encoded signature * based on the digest of the signature data. * @@ -4722,7 +4722,7 @@ static int CheckRSASignature(WOLFSSL* ssl, int sigAlgo, int hashAlgo, return ret; } -#endif /* !NO_RSA */ +#endif /* !NO_RSA && WC_RSA_PSS */ #endif /* !NO_RSA || HAVE_ECC */ /* Get the next certificate from the list for writing into the TLS v1.3 @@ -5759,7 +5759,7 @@ static int DoTls13CertificateVerify(WOLFSSL* ssl, byte* input, case TLS_ASYNC_VERIFY: { - #ifndef NO_RSA + #if !defined(NO_RSA) && defined(WC_RSA_PSS) if (ssl->peerRsaKey != NULL && ssl->peerRsaKeyPresent != 0) { ret = CheckRSASignature(ssl, args->sigAlgo, args->hashAlgo, args->output, args->sendSz); @@ -5769,7 +5769,7 @@ static int DoTls13CertificateVerify(WOLFSSL* ssl, byte* input, FreeKey(ssl, DYNAMIC_TYPE_RSA, (void**)&ssl->peerRsaKey); ssl->peerRsaKeyPresent = 0; } - #endif /* !NO_RSA */ + #endif /* !NO_RSA && WC_RSA_PSS */ /* Advance state and proceed */ ssl->options.asyncState = TLS_ASYNC_FINALIZE; diff --git a/wolfcrypt/test/test.c b/wolfcrypt/test/test.c index 4e4bbbe48..272edef98 100644 --- a/wolfcrypt/test/test.c +++ b/wolfcrypt/test/test.c @@ -11726,7 +11726,7 @@ done: } #endif -#ifdef WC_RSA_PSS +#if defined(WC_RSA_PSS) && !defined(HAVE_FIPS_VERSION) /* not supported with FIPSv1 */ static int rsa_pss_test(WC_RNG* rng, RsaKey* key) { byte digest[WC_MAX_DIGEST_SIZE]; @@ -13862,7 +13862,7 @@ int rsa_test(void) #endif /* WOLFSSL_CERT_REQ */ #endif /* WOLFSSL_CERT_GEN */ -#ifdef WC_RSA_PSS +#if defined(WC_RSA_PSS) && !defined(HAVE_FIPS_VERSION) /* not supported with FIPSv1 */ ret = rsa_pss_test(&rng, &key); #endif diff --git a/wolfssl/wolfcrypt/settings.h b/wolfssl/wolfcrypt/settings.h index 32bf31eb3..92c3dc068 100644 --- a/wolfssl/wolfcrypt/settings.h +++ b/wolfssl/wolfcrypt/settings.h @@ -2229,6 +2229,12 @@ extern void uITRON4_free(void *p) ; #define WOLFSSL_NO_CONSTCHARCONST #endif +/* FIPS v1 does not support TLS v1.3 (requires RSA PSS and HKDF) */ +#if defined(HAVE_FIPS) && !defined(HAVE_FIPS_VERSION) + #undef WC_RSA_PSS + #undef WOLFSSL_TLS13 +#endif + #ifdef __cplusplus } /* extern "C" */ From ab2afbd37ba133c8f8c1067bacf212a99ecd49ac Mon Sep 17 00:00:00 2001 From: David Garske Date: Tue, 12 May 2020 15:37:26 -0700 Subject: [PATCH 172/298] Allow the TLS 13 draft 18 build option and just use the final version. This allows the automated test scripts to pass. --- configure.ac | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 521a9d243..45db5abc1 100644 --- a/configure.ac +++ b/configure.ac @@ -317,6 +317,13 @@ then fi +# TLS v1.3 Draft 18 (Note: only final TLS v1.3 supported, here for backwards build compatibility) +AC_ARG_ENABLE([tls13-draft18], + [AS_HELP_STRING([--enable-tls13-draft18],[Enable wolfSSL TLS v1.3 Draft 18 (default: disabled)])], + [ ENABLED_TLS13_DRAFT18=$enableval ], + [ ENABLED_TLS13_DRAFT18=no ] + ) + # TLS v1.3 AC_ARG_ENABLE([tls13], [AS_HELP_STRING([--enable-tls13],[Enable wolfSSL TLS v1.3 (default: disabled)])], @@ -327,7 +334,7 @@ if test "x$FIPS_VERSION" = "xv1" then ENABLED_TLS13="no" fi -if test "$ENABLED_TLS13" = "yes" +if test "$ENABLED_TLS13" = "yes" || test "$ENABLED_TLS13_DRAFT18" = "yes" then AM_CFLAGS="-DWOLFSSL_TLS13 -DHAVE_TLS_EXTENSIONS -DHAVE_SUPPORTED_CURVES $AM_CFLAGS" fi From 0228d1eeeae62d0a5cdc520c912c226a19e07128 Mon Sep 17 00:00:00 2001 From: David Garske Date: Thu, 14 May 2020 16:39:49 -0700 Subject: [PATCH 173/298] Cleanups for the TLS v1.3 build requirements. Add check for TLS v1.3 call to `EncodeSigAlg`. --- src/tls13.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/tls13.c b/src/tls13.c index 5ab2b55b5..88d99023a 100644 --- a/src/tls13.c +++ b/src/tls13.c @@ -112,7 +112,11 @@ #endif #ifndef HAVE_HKDF - #error The build option HAVE_HKDF is required for TLS 1.3 + #ifndef _MSC_VER + #error "The build option HAVE_HKDF is required for TLS 1.3" + #else + #pragma message("error: The build option HAVE_HKDF is required for TLS 1.3") + #endif #endif #ifndef HAVE_TLS_EXTENSIONS @@ -5155,8 +5159,10 @@ static int SendTls13CertificateVerify(WOLFSSL* ssl) /* Add signature algorithm. */ if (ssl->hsType == DYNAMIC_TYPE_RSA) args->sigAlgo = rsa_pss_sa_algo; + #ifdef HAVE_ECC else if (ssl->hsType == DYNAMIC_TYPE_ECC) args->sigAlgo = ecc_dsa_sa_algo; + #endif #ifdef HAVE_ED25519 else if (ssl->hsType == DYNAMIC_TYPE_ED25519) args->sigAlgo = ed25519_sa_algo; @@ -5165,6 +5171,9 @@ static int SendTls13CertificateVerify(WOLFSSL* ssl) else if (ssl->hsType == DYNAMIC_TYPE_ED448) args->sigAlgo = ed448_sa_algo; #endif + else { + ERROR_OUT(ALGO_ID_E, exit_scv); + } EncodeSigAlg(ssl->suites->hashAlgo, args->sigAlgo, args->verify); if (ssl->hsType == DYNAMIC_TYPE_RSA) { From 8823a581d062e066f8d541b09faaba43a0118a57 Mon Sep 17 00:00:00 2001 From: David Garske Date: Fri, 15 May 2020 14:46:29 -0700 Subject: [PATCH 174/298] Add PSK user context support (Fixes #2952.). --- doc/dox_comments/header_files/ssl.h | 55 +++++++++++++++++++++++++++++ src/internal.c | 3 +- src/ssl.c | 28 +++++++++++---- wolfssl/internal.h | 2 ++ wolfssl/ssl.h | 5 +++ 5 files changed, 86 insertions(+), 7 deletions(-) diff --git a/doc/dox_comments/header_files/ssl.h b/doc/dox_comments/header_files/ssl.h index ca208ce56..114f3c5bc 100644 --- a/doc/dox_comments/header_files/ssl.h +++ b/doc/dox_comments/header_files/ssl.h @@ -5162,6 +5162,61 @@ WOLFSSL_API void wolfSSL_CTX_set_psk_server_callback(WOLFSSL_CTX*, WOLFSSL_API void wolfSSL_set_psk_server_callback(WOLFSSL*, wc_psk_server_callback); + +/*! + \brief Sets a PSK user context in the WOLFSSL structure options member. + + \return WOLFSSL_SUCCESS or WOLFSSL_FAILURE + + \param ssl a pointer to a WOLFSSL structure, created using wolfSSL_new(). + \param psk_ctx void pointer to user PSK context + + \sa wolfSSL_get_psk_callback_ctx + \sa wolfSSL_CTX_set_psk_callback_ctx + \sa wolfSSL_CTX_get_psk_callback_ctx +*/ +WOLFSSL_API int wolfSSL_set_psk_callback_ctx(WOLFSSL* ssl, void* psk_ctx); + +/*! + \brief Sets a PSK user context in the WOLFSSL_CTX structure. + + \return WOLFSSL_SUCCESS or WOLFSSL_FAILURE + + \param ctx a pointer to a WOLFSSL_CTX structure, created using wolfSSL_CTX_new(). + \param psk_ctx void pointer to user PSK context + + \sa wolfSSL_set_psk_callback_ctx + \sa wolfSSL_get_psk_callback_ctx + \sa wolfSSL_CTX_get_psk_callback_ctx +*/ +WOLFSSL_API int wolfSSL_CTX_set_psk_callback_ctx(WOLFSSL_CTX* ctx, void* psk_ctx); + +/*! + \brief Get a PSK user context in the WOLFSSL structure options member. + + \return void pointer to user PSK context + + \param ssl a pointer to a WOLFSSL structure, created using wolfSSL_new(). + + \sa wolfSSL_set_psk_callback_ctx + \sa wolfSSL_CTX_set_psk_callback_ctx + \sa wolfSSL_CTX_get_psk_callback_ctx +*/ +WOLFSSL_API void* wolfSSL_get_psk_callback_ctx(WOLFSSL* ssl); + +/*! + \brief Get a PSK user context in the WOLFSSL_CTX structure. + + \return void pointer to user PSK context + + \param ctx a pointer to a WOLFSSL_CTX structure, created using wolfSSL_CTX_new(). + + \sa wolfSSL_CTX_set_psk_callback_ctx + \sa wolfSSL_set_psk_callback_ctx + \sa wolfSSL_get_psk_callback_ctx +*/ +WOLFSSL_API void* wolfSSL_CTX_get_psk_callback_ctx(WOLFSSL_CTX* ctx); + /*! \ingroup Setup diff --git a/src/internal.c b/src/internal.c index 6b390b64c..ab5ba26e7 100644 --- a/src/internal.c +++ b/src/internal.c @@ -5279,9 +5279,10 @@ int SetSSL_CTX(WOLFSSL* ssl, WOLFSSL_CTX* ctx, int writeDup) ssl->options.haveStaticECC = ctx->haveStaticECC; #ifndef NO_PSK - ssl->options.havePSK = ctx->havePSK; + ssl->options.havePSK = ctx->havePSK; ssl->options.client_psk_cb = ctx->client_psk_cb; ssl->options.server_psk_cb = ctx->server_psk_cb; + ssl->options.psk_ctx = ctx->psk_ctx; #ifdef WOLFSSL_TLS13 ssl->options.client_psk_tls13_cb = ctx->client_psk_tls13_cb; ssl->options.server_psk_tls13_cb = ctx->server_psk_tls13_cb; diff --git a/src/ssl.c b/src/ssl.c index 278d4fb16..173b3d67c 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -13458,7 +13458,6 @@ int wolfSSL_set_compression(WOLFSSL* ssl) ctx->client_psk_cb = cb; } - void wolfSSL_set_psk_client_callback(WOLFSSL* ssl,wc_psk_client_callback cb) { byte haveRSA = 1; @@ -13484,7 +13483,6 @@ int wolfSSL_set_compression(WOLFSSL* ssl) ssl->options.haveStaticECC, ssl->options.side); } - void wolfSSL_CTX_set_psk_server_callback(WOLFSSL_CTX* ctx, wc_psk_server_callback cb) { @@ -13495,7 +13493,6 @@ int wolfSSL_set_compression(WOLFSSL* ssl) ctx->server_psk_cb = cb; } - void wolfSSL_set_psk_server_callback(WOLFSSL* ssl,wc_psk_server_callback cb) { byte haveRSA = 1; @@ -13520,7 +13517,6 @@ int wolfSSL_set_compression(WOLFSSL* ssl) ssl->options.haveStaticECC, ssl->options.side); } - const char* wolfSSL_get_psk_identity_hint(const WOLFSSL* ssl) { WOLFSSL_ENTER("SSL_get_psk_identity_hint"); @@ -13542,7 +13538,6 @@ int wolfSSL_set_compression(WOLFSSL* ssl) return ssl->arrays->client_identity; } - int wolfSSL_CTX_use_psk_identity_hint(WOLFSSL_CTX* ctx, const char* hint) { WOLFSSL_ENTER("SSL_CTX_use_psk_identity_hint"); @@ -13559,7 +13554,6 @@ int wolfSSL_set_compression(WOLFSSL* ssl) return WOLFSSL_SUCCESS; } - int wolfSSL_use_psk_identity_hint(WOLFSSL* ssl, const char* hint) { WOLFSSL_ENTER("SSL_use_psk_identity_hint"); @@ -13577,6 +13571,28 @@ int wolfSSL_set_compression(WOLFSSL* ssl) return WOLFSSL_SUCCESS; } + void* wolfSSL_get_psk_callback_ctx(WOLFSSL* ssl) + { + return ssl ? ssl->options.psk_ctx : NULL; + } + void* wolfSSL_CTX_get_psk_callback_ctx(WOLFSSL_CTX* ctx) + { + return ctx ? ctx->psk_ctx : NULL; + } + int wolfSSL_set_psk_callback_ctx(WOLFSSL* ssl, void* psk_ctx) + { + if (ssl == NULL) + return WOLFSSL_FAILURE; + ssl->options.psk_ctx = psk_ctx; + return WOLFSSL_SUCCESS; + } + int wolfSSL_CTX_set_psk_callback_ctx(WOLFSSL_CTX* ctx, void* psk_ctx) + { + if (ctx == NULL) + return WOLFSSL_FAILURE; + ctx->psk_ctx = psk_ctx; + return WOLFSSL_SUCCESS; + } #endif /* NO_PSK */ diff --git a/wolfssl/internal.h b/wolfssl/internal.h index 18541a648..a4af16aea 100644 --- a/wolfssl/internal.h +++ b/wolfssl/internal.h @@ -2748,6 +2748,7 @@ struct WOLFSSL_CTX { wc_psk_client_tls13_callback client_psk_tls13_cb; /* client callback */ wc_psk_server_tls13_callback server_psk_tls13_cb; /* server callback */ #endif + void* psk_ctx; char server_hint[MAX_PSK_ID_LEN + NULL_TERM_LEN]; #endif /* HAVE_SESSION_TICKET || !NO_PSK */ #ifdef WOLFSSL_TLS13 @@ -3337,6 +3338,7 @@ typedef struct Options { wc_psk_client_tls13_callback client_psk_tls13_cb; /* client callback */ wc_psk_server_tls13_callback server_psk_tls13_cb; /* server callback */ #endif + void* psk_ctx; #endif /* NO_PSK */ #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || defined(WOLFSSL_WPAS_SMALL) unsigned long mask; /* store SSL_OP_ flags */ diff --git a/wolfssl/ssl.h b/wolfssl/ssl.h index 96a3e1d0e..39d7a9911 100644 --- a/wolfssl/ssl.h +++ b/wolfssl/ssl.h @@ -1950,6 +1950,11 @@ enum { /* ssl Constants */ WOLFSSL_API void wolfSSL_set_psk_server_tls13_callback(WOLFSSL*, wc_psk_server_tls13_callback); #endif + WOLFSSL_API void* wolfSSL_get_psk_callback_ctx(WOLFSSL*); + WOLFSSL_API int wolfSSL_set_psk_callback_ctx(WOLFSSL*, void*); + + WOLFSSL_API void* wolfSSL_CTX_get_psk_callback_ctx(WOLFSSL_CTX*); + WOLFSSL_API int wolfSSL_CTX_set_psk_callback_ctx(WOLFSSL_CTX*, void*); #define PSK_TYPES_DEFINED #endif /* NO_PSK */ From 3b63e55a6852e06f4f6a1c5a99e7f2af0f134323 Mon Sep 17 00:00:00 2001 From: David Garske Date: Fri, 15 May 2020 15:08:17 -0700 Subject: [PATCH 175/298] Fix for TLS v1.3 PSK tests work with additional cipher suites (not just `TLS13-AES128-GCM-SHA256`) and the echo server/client. --- examples/client/client.c | 12 +++++++----- examples/echoclient/echoclient.c | 6 ++++++ examples/echoserver/echoserver.c | 6 ++++++ examples/server/server.c | 13 +++++++------ wolfssl/test.h | 16 +++++++++------- 5 files changed, 35 insertions(+), 18 deletions(-) diff --git a/examples/client/client.c b/examples/client/client.c index ab4f7ae5c..8fea2b0f9 100644 --- a/examples/client/client.c +++ b/examples/client/client.c @@ -2305,16 +2305,17 @@ THREAD_RETURN WOLFSSL_THREAD client_test(void* args) if (usePsk) { #ifndef NO_PSK + const char *defaultCipherList = cipherList; + wolfSSL_CTX_set_psk_client_callback(ctx, my_psk_client_cb); #ifdef WOLFSSL_TLS13 wolfSSL_CTX_set_psk_client_tls13_callback(ctx, my_psk_client_tls13_cb); #endif - if (cipherList == NULL) { - const char *defaultCipherList; + if (defaultCipherList == NULL) { #if defined(HAVE_AESGCM) && !defined(NO_DH) #ifdef WOLFSSL_TLS13 - defaultCipherList = "DHE-PSK-AES128-GCM-SHA256:" - "TLS13-AES128-GCM-SHA256"; + defaultCipherList = "TLS13-AES128-GCM-SHA256:" + "DHE-PSK-AES128-GCM-SHA256:"; #else defaultCipherList = "DHE-PSK-AES128-GCM-SHA256"; #endif @@ -2323,12 +2324,13 @@ THREAD_RETURN WOLFSSL_THREAD client_test(void* args) #else defaultCipherList = "PSK-AES128-CBC-SHA256"; #endif - if (wolfSSL_CTX_set_cipher_list(ctx,defaultCipherList) + if (wolfSSL_CTX_set_cipher_list(ctx, defaultCipherList) !=WOLFSSL_SUCCESS) { wolfSSL_CTX_free(ctx); ctx = NULL; err_sys("client can't set cipher list 2"); } } + wolfSSL_CTX_set_psk_callback_ctx(ctx, (void*)defaultCipherList); #endif if (useClientCert) { useClientCert = 0; diff --git a/examples/echoclient/echoclient.c b/examples/echoclient/echoclient.c index a71fc48b2..db5d74c97 100644 --- a/examples/echoclient/echoclient.c +++ b/examples/echoclient/echoclient.c @@ -164,12 +164,18 @@ void echoclient_test(void* args) #ifdef HAVE_NULL_CIPHER defaultCipherList = "PSK-NULL-SHA256"; #elif defined(HAVE_AESGCM) && !defined(NO_DH) + #ifdef WOLFSSL_TLS13 + defaultCipherList = "TLS13-AES128-GCM-SHA256:" + "DHE-PSK-AES128-GCM-SHA256:"; + #else defaultCipherList = "DHE-PSK-AES128-GCM-SHA256"; + #endif #else defaultCipherList = "PSK-AES128-CBC-SHA256"; #endif if (CyaSSL_CTX_set_cipher_list(ctx,defaultCipherList) !=WOLFSSL_SUCCESS) err_sys("client can't set cipher list 2"); + wolfSSL_CTX_set_psk_callback_ctx(ctx, (void*)defaultCipherList); } #endif diff --git a/examples/echoserver/echoserver.c b/examples/echoserver/echoserver.c index 847667a27..b7bb49282 100644 --- a/examples/echoserver/echoserver.c +++ b/examples/echoserver/echoserver.c @@ -243,12 +243,18 @@ THREAD_RETURN CYASSL_THREAD echoserver_test(void* args) #ifdef HAVE_NULL_CIPHER defaultCipherList = "PSK-NULL-SHA256"; #elif defined(HAVE_AESGCM) && !defined(NO_DH) + #ifdef WOLFSSL_TLS13 + defaultCipherList = "TLS13-AES128-GCM-SHA256:" + "DHE-PSK-AES128-GCM-SHA256"; + #else defaultCipherList = "DHE-PSK-AES128-GCM-SHA256"; + #endif #else defaultCipherList = "PSK-AES128-CBC-SHA256"; #endif if (CyaSSL_CTX_set_cipher_list(ctx, defaultCipherList) != WOLFSSL_SUCCESS) err_sys("server can't set cipher list 2"); + wolfSSL_CTX_set_psk_callback_ctx(ctx, (void*)defaultCipherList); #endif } diff --git a/examples/server/server.c b/examples/server/server.c index 192c03a72..a6aab7ac2 100644 --- a/examples/server/server.c +++ b/examples/server/server.c @@ -1731,20 +1731,20 @@ THREAD_RETURN WOLFSSL_THREAD server_test(void* args) if (usePsk || usePskPlus) { #ifndef NO_PSK + const char *defaultCipherList = cipherList; + SSL_CTX_set_psk_server_callback(ctx, my_psk_server_cb); #ifdef WOLFSSL_TLS13 wolfSSL_CTX_set_psk_server_tls13_callback(ctx, my_psk_server_tls13_cb); #endif - if (sendPskIdentityHint == 1) SSL_CTX_use_psk_identity_hint(ctx, "cyassl server"); - if (cipherList == NULL && !usePskPlus) { - const char *defaultCipherList; + if (defaultCipherList == NULL && !usePskPlus) { #if defined(HAVE_AESGCM) && !defined(NO_DH) #ifdef WOLFSSL_TLS13 - defaultCipherList = "DHE-PSK-AES128-GCM-SHA256:" - "TLS13-AES128-GCM-SHA256"; + defaultCipherList = "TLS13-AES128-GCM-SHA256:" + "DHE-PSK-AES128-GCM-SHA256"; #else defaultCipherList = "DHE-PSK-AES128-GCM-SHA256"; #endif @@ -1758,7 +1758,8 @@ THREAD_RETURN WOLFSSL_THREAD server_test(void* args) != WOLFSSL_SUCCESS) err_sys_ex(runWithErrors, "server can't set cipher list 2"); } -#endif + wolfSSL_CTX_set_psk_callback_ctx(ctx, (void*)defaultCipherList); +#endif /* !NO_PSK */ } #ifndef NO_CERTS if (mutualAuth) diff --git a/wolfssl/test.h b/wolfssl/test.h index 2f133f985..67e28842d 100644 --- a/wolfssl/test.h +++ b/wolfssl/test.h @@ -1302,7 +1302,7 @@ static WC_INLINE unsigned int my_psk_client_cb(WOLFSSL* ssl, const char* hint, (void)key_max_len; /* see internal.h MAX_PSK_ID_LEN for PSK identity limit */ - strncpy(identity, kIdentityStr, id_max_len); + XSTRNCPY(identity, kIdentityStr, id_max_len); if (wolfSSL_GetVersion(ssl) < WOLFSSL_TLSV1_3) { /* test key in hex is 0x1a2b3c4d , in decimal 439,041,101 , we're using @@ -1336,7 +1336,7 @@ static WC_INLINE unsigned int my_psk_server_cb(WOLFSSL* ssl, const char* identit (void)key_max_len; /* see internal.h MAX_PSK_ID_LEN for PSK identity limit */ - if (strncmp(identity, kIdentityStr, strlen(kIdentityStr)) != 0) + if (XSTRNCMP(identity, kIdentityStr, XSTRLEN(kIdentityStr)) != 0) return 0; if (wolfSSL_GetVersion(ssl) < WOLFSSL_TLSV1_3) { @@ -1370,13 +1370,14 @@ static WC_INLINE unsigned int my_psk_client_tls13_cb(WOLFSSL* ssl, { int i; int b = 0x01; + const char* userCipher = (const char*)wolfSSL_get_psk_callback_ctx(ssl); (void)ssl; (void)hint; (void)key_max_len; /* see internal.h MAX_PSK_ID_LEN for PSK identity limit */ - strncpy(identity, kIdentityStr, id_max_len); + XSTRNCPY(identity, kIdentityStr, id_max_len); for (i = 0; i < 32; i++, b += 0x22) { if (b >= 0x100) @@ -1384,7 +1385,7 @@ static WC_INLINE unsigned int my_psk_client_tls13_cb(WOLFSSL* ssl, key[i] = b; } - *ciphersuite = "TLS13-AES128-GCM-SHA256"; + *ciphersuite = userCipher ? userCipher : "TLS13-AES128-GCM-SHA256"; return 32; /* length of key in octets or 0 for error */ } @@ -1396,12 +1397,13 @@ static WC_INLINE unsigned int my_psk_server_tls13_cb(WOLFSSL* ssl, { int i; int b = 0x01; + const char* userCipher = (const char*)wolfSSL_get_psk_callback_ctx(ssl); (void)ssl; (void)key_max_len; /* see internal.h MAX_PSK_ID_LEN for PSK identity limit */ - if (strncmp(identity, kIdentityStr, strlen(kIdentityStr)) != 0) + if (XSTRNCMP(identity, kIdentityStr, XSTRLEN(kIdentityStr)) != 0) return 0; for (i = 0; i < 32; i++, b += 0x22) { @@ -1410,12 +1412,12 @@ static WC_INLINE unsigned int my_psk_server_tls13_cb(WOLFSSL* ssl, key[i] = b; } - *ciphersuite = "TLS13-AES128-GCM-SHA256"; + *ciphersuite = userCipher ? userCipher : "TLS13-AES128-GCM-SHA256"; return 32; /* length of key in octets or 0 for error */ } -#endif /* NO_PSK */ +#endif /* !NO_PSK */ #if defined(WOLFSSL_USER_CURRTIME) From d4fdd1e590775f0c2b7dbf8f51a91b1c15542441 Mon Sep 17 00:00:00 2001 From: David Garske Date: Mon, 18 May 2020 11:53:31 -0700 Subject: [PATCH 176/298] Fix for TLS v1.3 test PSK callback to support cipher list. Add support for `GetCipherSuiteFromName` to accept a name ending with colon. --- examples/client/client.c | 2 +- src/internal.c | 10 +++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/examples/client/client.c b/examples/client/client.c index 8fea2b0f9..96a126c86 100644 --- a/examples/client/client.c +++ b/examples/client/client.c @@ -2080,7 +2080,7 @@ THREAD_RETURN WOLFSSL_THREAD client_test(void* args) #ifndef NO_PSK if (usePsk) { - done += 1; /* don't perform exernal tests if PSK is enabled */ + done += 1; /* don't perform external tests if PSK is enabled */ } #endif diff --git a/src/internal.c b/src/internal.c index ab5ba26e7..10e62f2a9 100644 --- a/src/internal.c +++ b/src/internal.c @@ -18723,7 +18723,15 @@ int GetCipherSuiteFromName(const char* name, byte* cipherSuite0, { int ret = BAD_FUNC_ARG; int i; - unsigned long len = (unsigned long)XSTRLEN(name); + unsigned long len; + const char* nameDelim; + + /* Support trailing : */ + nameDelim = XSTRSTR(name, ":"); + if (nameDelim) + len = (unsigned long)(nameDelim - name); + else + len = (unsigned long)XSTRLEN(name); for (i = 0; i < GetCipherNamesSize(); i++) { if (XSTRNCMP(name, cipher_names[i].name, len) == 0) { From ad93813d7544251ff62e4de246ad2eb847d88708 Mon Sep 17 00:00:00 2001 From: David Garske Date: Fri, 22 May 2020 11:43:41 -0700 Subject: [PATCH 177/298] Fix for expected failure case on client write. Resolves test-fails.con `server TLSv1.3 fail on no client certificate` test. --- examples/client/client.c | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/examples/client/client.c b/examples/client/client.c index 96a126c86..6cc3b6328 100644 --- a/examples/client/client.c +++ b/examples/client/client.c @@ -802,7 +802,8 @@ static int SMTP_Shutdown(WOLFSSL* ssl, int wc_shutdown) return WOLFSSL_SUCCESS; } -static void ClientWrite(WOLFSSL* ssl, char* msg, int msgSz, const char* str) +static int ClientWrite(WOLFSSL* ssl, char* msg, int msgSz, const char* str, + int exitWithRet) { int ret, err; char buffer[WOLFSSL_MAX_ERROR_SZ]; @@ -827,8 +828,12 @@ static void ClientWrite(WOLFSSL* ssl, char* msg, int msgSz, const char* str) if (ret != msgSz) { printf("SSL_write%s msg error %d, %s\n", str, err, wolfSSL_ERR_error_string(err, buffer)); - err_sys("SSL_write failed"); + if (!exitWithRet) { + err_sys("SSL_write failed"); + } } + + return err; } static int ClientRead(WOLFSSL* ssl, char* reply, int replyLen, int mustRead, @@ -3102,7 +3107,11 @@ THREAD_RETURN WOLFSSL_THREAD client_test(void* args) wolfSSL_update_keys(ssl); #endif - ClientWrite(ssl, msg, msgSz, ""); + err = ClientWrite(ssl, msg, msgSz, "", exitWithRet); + if (exitWithRet && (err != 0)) { + ((func_args*)args)->return_code = err; + goto exit; + } err = ClientRead(ssl, reply, sizeof(reply)-1, 1, "", exitWithRet); if (exitWithRet && (err != 0)) { @@ -3112,7 +3121,7 @@ THREAD_RETURN WOLFSSL_THREAD client_test(void* args) #if defined(WOLFSSL_TLS13) if (updateKeysIVs || postHandAuth) - ClientWrite(ssl, msg, msgSz, ""); + (void)ClientWrite(ssl, msg, msgSz, "", 0); #endif if (sendGET) { /* get html */ (void)ClientRead(ssl, reply, sizeof(reply)-1, 0, "", 0); @@ -3364,12 +3373,12 @@ THREAD_RETURN WOLFSSL_THREAD client_test(void* args) } #endif /* HAVE_SECURE_RENEGOTIATION */ - ClientWrite(sslResume, resumeMsg, resumeSz, " resume"); + (void)ClientWrite(sslResume, resumeMsg, resumeSz, " resume", 0); (void)ClientRead(sslResume, reply, sizeof(reply)-1, sendGET, "Server resume: ", 0); /* try to send session break */ - ClientWrite(sslResume, msg, msgSz, " resume 2"); + (void)ClientWrite(sslResume, msg, msgSz, " resume 2", 0); ret = wolfSSL_shutdown(sslResume); if (wc_shutdown && ret == WOLFSSL_SHUTDOWN_NOT_DONE) From 93be04f38018f589453c2f4e8436a733b02aef47 Mon Sep 17 00:00:00 2001 From: David Garske Date: Mon, 1 Jun 2020 13:31:46 -0700 Subject: [PATCH 178/298] Can't send empty list for the client when sniffer is enabled or it will use `AES128-SHA`. --- tests/test-tls13.conf | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/test-tls13.conf b/tests/test-tls13.conf index 3f87cc091..f946cdcf4 100644 --- a/tests/test-tls13.conf +++ b/tests/test-tls13.conf @@ -164,6 +164,7 @@ # client TLSv1.3 -v 4 +-l TLS13-AES128-GCM-SHA256:TLS13-AES256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES128-CCM-SHA256:TLS13-AES128-CCM-8-SHA256 # server TLSv1.3 KeyUpdate -v 4 From 66fdc2c5368a148dd386bf0b36224b8ecd22924d Mon Sep 17 00:00:00 2001 From: David Garske Date: Tue, 2 Jun 2020 14:41:19 -0700 Subject: [PATCH 179/298] Disable TLS v1.3 if none of these are available "ECC, CURVE25519, CURVE448 or DH". --- configure.ac | 20 ++++++++++++++------ src/tls.c | 16 +++++++++------- src/tls13.c | 2 +- 3 files changed, 24 insertions(+), 14 deletions(-) diff --git a/configure.ac b/configure.ac index 45db5abc1..017f0b4cc 100644 --- a/configure.ac +++ b/configure.ac @@ -326,7 +326,7 @@ AC_ARG_ENABLE([tls13-draft18], # TLS v1.3 AC_ARG_ENABLE([tls13], - [AS_HELP_STRING([--enable-tls13],[Enable wolfSSL TLS v1.3 (default: disabled)])], + [AS_HELP_STRING([--enable-tls13],[Enable wolfSSL TLS v1.3 (default: enabled)])], [ ENABLED_TLS13=$enableval ], [ ENABLED_TLS13=yes ] ) @@ -334,11 +334,6 @@ if test "x$FIPS_VERSION" = "xv1" then ENABLED_TLS13="no" fi -if test "$ENABLED_TLS13" = "yes" || test "$ENABLED_TLS13_DRAFT18" = "yes" -then - AM_CFLAGS="-DWOLFSSL_TLS13 -DHAVE_TLS_EXTENSIONS -DHAVE_SUPPORTED_CURVES $AM_CFLAGS" -fi - # Post-handshake Authentication AC_ARG_ENABLE([postauth], @@ -3142,6 +3137,19 @@ then AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_REQUIRE_FFDHE" fi +# TLS 1.3 Requires either ECC, CURVE25519, CURVE448 or DH +if test "x$ENABLED_ECC" = "xno" && test "x$ENABLED_CURVE25519" = "xno" && test "x$ENABLED_CURVE448" = "xno" && test "x$ENABLED_DH" = "xno" +then + # disable TLS 1.3 + ENABLED_TLS13=no + ENABLED_TLS13_DRAFT18=no +fi +if test "$ENABLED_TLS13" = "yes" || test "$ENABLED_TLS13_DRAFT18" = "yes" +then + AM_CFLAGS="-DWOLFSSL_TLS13 -DHAVE_TLS_EXTENSIONS -DHAVE_SUPPORTED_CURVES $AM_CFLAGS" +fi + + # Session Ticket Extension AC_ARG_ENABLE([session-ticket], [AS_HELP_STRING([--enable-session-ticket],[Enable Session Ticket (default: disabled)])], diff --git a/src/tls.c b/src/tls.c index af9c7fc10..864474905 100644 --- a/src/tls.c +++ b/src/tls.c @@ -3744,7 +3744,7 @@ int TLSX_UseCertificateStatusRequestV2(TLSX** extensions, byte status_type, && !defined(HAVE_FFDHE) #error Elliptic Curves Extension requires Elliptic Curve Cryptography. \ Use --enable-ecc in the configure script or define HAVE_ECC. \ - Alternatively use FFDHE for DH ciperhsuites. + Alternatively use FFDHE for DH ciphersuites. #endif static int TLSX_SupportedCurve_New(SupportedCurve** curve, word16 name, @@ -3901,7 +3901,7 @@ static void TLSX_PointFormat_ValidateRequest(WOLFSSL* ssl, byte* semaphore) TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EC_POINT_FORMATS)); } -#endif +#endif /* WOLFSSL_TLS13 || !NO_WOLFSSL_CLIENT */ #ifndef NO_WOLFSSL_SERVER @@ -3933,7 +3933,8 @@ static void TLSX_PointFormat_ValidateResponse(WOLFSSL* ssl, byte* semaphore) #endif } -#endif +#endif /* !NO_WOLFSSL_SERVER */ + #ifndef NO_WOLFSSL_CLIENT static word16 TLSX_SupportedCurve_GetSize(SupportedCurve* list) @@ -4117,7 +4118,7 @@ int TLSX_SupportedCurve_CheckPriority(WOLFSSL* ssl) return 0; } -#endif +#endif /* WOLFSSL_TLS13 && !WOLFSSL_NO_SERVER_GROUPS_EXT */ #if defined(HAVE_FFDHE) && !defined(WOLFSSL_NO_TLS12) /* Set the highest priority common FFDHE group on the server as compared to @@ -4267,7 +4268,7 @@ int TLSX_SupportedCurve_Preferred(WOLFSSL* ssl, int checkSupported) return BAD_FUNC_ARG; } -#endif +#endif /* HAVE_SUPPORTED_CURVES */ #ifndef NO_WOLFSSL_SERVER @@ -9756,8 +9757,6 @@ static int TLSX_PopulateSupportedGroups(WOLFSSL* ssl, TLSX** extensions) { int ret = WOLFSSL_SUCCESS; #ifdef WOLFSSL_TLS13 - int i; - #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK) if (ssl->options.resuming && ssl->session.namedGroup != 0) { return TLSX_UseSupportedCurve(extensions, ssl->session.namedGroup, @@ -9765,7 +9764,9 @@ static int TLSX_PopulateSupportedGroups(WOLFSSL* ssl, TLSX** extensions) } #endif +#ifdef HAVE_SUPPORTED_CURVES if (ssl->numGroups != 0) { + int i; for (i = 0; i < ssl->numGroups; i++) { ret = TLSX_UseSupportedCurve(extensions, ssl->group[i], ssl->heap); if (ret != WOLFSSL_SUCCESS) @@ -9773,6 +9774,7 @@ static int TLSX_PopulateSupportedGroups(WOLFSSL* ssl, TLSX** extensions) } return WOLFSSL_SUCCESS; } +#endif /* HAVE_SUPPORTED_CURVES */ #endif /* WOLFSSL_TLS13 */ #if defined(HAVE_ECC) && defined(HAVE_SUPPORTED_CURVES) diff --git a/src/tls13.c b/src/tls13.c index 88d99023a..db3284254 100644 --- a/src/tls13.c +++ b/src/tls13.c @@ -4198,7 +4198,7 @@ static int SendTls13EncryptedExtensions(WOLFSSL* ssl) ssl->keys.encryptionOn = 1; -#ifndef WOLFSSL_NO_SERVER_GROUPS_EXT +#if defined(HAVE_SUPPORTED_CURVES) && !defined(WOLFSSL_NO_SERVER_GROUPS_EXT) if ((ret = TLSX_SupportedCurve_CheckPriority(ssl)) != 0) return ret; #endif From 1d01b877417bca55b579e649c765f9288a3b09c2 Mon Sep 17 00:00:00 2001 From: David Garske Date: Thu, 4 Jun 2020 16:08:08 -0700 Subject: [PATCH 180/298] Fix to detect if `NO_CERTS` / `--disable-asn` is used in `scripts/tls13.test`. --- examples/server/server.c | 8 +++++++- scripts/tls13.test | 32 +++++++++++++++++--------------- 2 files changed, 24 insertions(+), 16 deletions(-) diff --git a/examples/server/server.c b/examples/server/server.c index a6aab7ac2..3f7ae6d4e 100644 --- a/examples/server/server.c +++ b/examples/server/server.c @@ -995,7 +995,9 @@ THREAD_RETURN WOLFSSL_THREAD server_test(void* args) int noPskDheKe = 0; #endif int updateKeysIVs = 0; +#ifndef NO_CERTS int mutualAuth = 0; +#endif int postHandAuth = 0; #ifdef WOLFSSL_EARLY_DATA int earlyData = 0; @@ -1081,7 +1083,9 @@ THREAD_RETURN WOLFSSL_THREAD server_test(void* args) (void)crlFlags; (void)readySignal; (void)updateKeysIVs; +#ifndef NO_CERTS (void)mutualAuth; +#endif (void)postHandAuth; (void)mcastID; (void)loadCertKeyIntoSSLObj; @@ -1413,9 +1417,11 @@ THREAD_RETURN WOLFSSL_THREAD server_test(void* args) #endif break; + #ifndef NO_CERTS case 'F' : - mutualAuth = 1; + mutualAuth = 1; break; + #endif case 'Q' : #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH) diff --git a/scripts/tls13.test b/scripts/tls13.test index df67a3963..1b2b6cee9 100755 --- a/scripts/tls13.test +++ b/scripts/tls13.test @@ -111,22 +111,24 @@ if [ $RESULT -eq 0 ]; then fi echo "" -# TLS 1.3 mutual auth required but client doesn't send certificates. -echo -e "\n\nTLS v1.3 mutual auth fail" -port=0 -./examples/server/server -v 4 -F -R $ready_file -p $port & -server_pid=$! -create_port -./examples/client/client -v 4 -x -p $port -RESULT=$? -remove_ready_file -if [ $RESULT -eq 0 ]; then - echo -e "\n\nIssue with requiring mutual authentication" - do_cleanup - exit 1 +cat ./wolfssl/options.h | grep -- 'NO_CERTS' +if [ $? -ne 0 ]; then + # TLS 1.3 mutual auth required but client doesn't send certificates. + echo -e "\n\nTLS v1.3 mutual auth fail" + port=0 + ./examples/server/server -v 4 -F -R $ready_file -p $port & + server_pid=$! + create_port + ./examples/client/client -v 4 -x -p $port + RESULT=$? + remove_ready_file + if [ $RESULT -eq 0 ]; then + echo -e "\n\nIssue with requiring mutual authentication" + do_cleanup + exit 1 + fi + echo "" fi -echo "" - ./examples/client/client -v 3 2>&1 | grep -- 'Bad SSL version' if [ $? -ne 0 ]; then From 7879e83ae0eaf34bf24126e0e672f8b5e3eefe12 Mon Sep 17 00:00:00 2001 From: David Garske Date: Thu, 4 Jun 2020 16:31:19 -0700 Subject: [PATCH 181/298] Fixes for building with `./configure --enable-tls13 --disable-rsa --disable-ecc --enable-psk`. Fix to properly detect if missing a asymmetric key algorithm (required by TLS v1.3). --- configure.ac | 4 ++-- src/tls13.c | 9 +++++++-- tests/suites.c | 6 ++++-- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/configure.ac b/configure.ac index 017f0b4cc..f027c92ae 100644 --- a/configure.ac +++ b/configure.ac @@ -3137,8 +3137,8 @@ then AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_REQUIRE_FFDHE" fi -# TLS 1.3 Requires either ECC, CURVE25519, CURVE448 or DH -if test "x$ENABLED_ECC" = "xno" && test "x$ENABLED_CURVE25519" = "xno" && test "x$ENABLED_CURVE448" = "xno" && test "x$ENABLED_DH" = "xno" +# TLS 1.3 Requires either ECC, CURVE25519, CURVE448 or RSA +if test "x$ENABLED_ECC" = "xno" && test "x$ENABLED_CURVE25519" = "xno" && test "x$ENABLED_CURVE448" = "xno" && test "x$ENABLED_RSA" = "xno" then # disable TLS 1.3 ENABLED_TLS13=no diff --git a/src/tls13.c b/src/tls13.c index db3284254..c70e37241 100644 --- a/src/tls13.c +++ b/src/tls13.c @@ -5036,6 +5036,8 @@ static int SendTls13Certificate(WOLFSSL* ssl) return ret; } +#if !defined(NO_RSA) || defined(HAVE_ECC) || defined(HAVE_ED25519) || \ + defined(HAVE_ED448) typedef struct Scv13Args { byte* output; /* not allocated */ byte* verify; /* not allocated */ @@ -5420,6 +5422,7 @@ exit_scv: return ret; } +#endif /* handle processing TLS v1.3 certificate (11) */ /* Parse and handle a TLS v1.3 Certificate message. @@ -7497,7 +7500,8 @@ int wolfSSL_connect_TLSv13(WOLFSSL* ssl) FALL_THROUGH; case FIRST_REPLY_THIRD: - #ifndef NO_CERTS + #if !defined(NO_CERTS) && (!defined(NO_RSA) || defined(HAVE_ECC) || \ + defined(HAVE_ED25519) || defined(HAVE_ED448)) if (!ssl->options.resuming && ssl->options.sendVerify) { ssl->error = SendTls13CertificateVerify(ssl); if (ssl->error != 0) { @@ -8221,7 +8225,8 @@ int wolfSSL_accept_TLSv13(WOLFSSL* ssl) FALL_THROUGH; case TLS13_CERT_SENT : -#ifndef NO_CERTS +#if !defined(NO_CERTS) && (!defined(NO_RSA) || defined(HAVE_ECC) || \ + defined(HAVE_ED25519) || defined(HAVE_ED448)) if (!ssl->options.resuming && ssl->options.sendVerify) { if ((ssl->error = SendTls13CertificateVerify(ssl)) != 0) { WOLFSSL_ERROR(ssl->error); diff --git a/tests/suites.c b/tests/suites.c index 43a023550..efd21485a 100644 --- a/tests/suites.c +++ b/tests/suites.c @@ -467,14 +467,16 @@ static int execute_test_case(int svr_argc, char** svr_argv, /* verify results */ if ((cliArgs.return_code != 0 && cliTestShouldFail == 0) || (cliArgs.return_code == 0 && cliTestShouldFail != 0)) { - printf("client_test failed\n"); + printf("client_test failed %d %s\n", cliArgs.return_code, + cliTestShouldFail ? "(should fail)" : ""); XEXIT(EXIT_FAILURE); } join_thread(serverThread); if ((svrArgs.return_code != 0 && svrTestShouldFail == 0) || (svrArgs.return_code == 0 && svrTestShouldFail != 0)) { - printf("server_test failed\n"); + printf("server_test failed %d %s\n", svrArgs.return_code, + svrTestShouldFail ? "(should fail)" : ""); XEXIT(EXIT_FAILURE); } From dffc677561e59d77064587fb8c1676e2b6166ca2 Mon Sep 17 00:00:00 2001 From: David Garske Date: Thu, 4 Jun 2020 16:42:40 -0700 Subject: [PATCH 182/298] Fix for TLS v1.3 with `--enable-sniffer`. --- examples/client/client.c | 2 +- examples/echoclient/echoclient.c | 6 +++++- examples/echoserver/echoserver.c | 6 +++++- examples/server/server.c | 2 +- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/examples/client/client.c b/examples/client/client.c index 6cc3b6328..afe5beabe 100644 --- a/examples/client/client.c +++ b/examples/client/client.c @@ -2371,7 +2371,7 @@ THREAD_RETURN WOLFSSL_THREAD client_test(void* args) #endif #if defined(WOLFSSL_SNIFFER) - if (cipherList == NULL) { + if (cipherList == NULL && version < 4) { /* don't use EDH, can't sniff tmp keys */ if (wolfSSL_CTX_set_cipher_list(ctx, "AES128-SHA") != WOLFSSL_SUCCESS) { wolfSSL_CTX_free(ctx); ctx = NULL; diff --git a/examples/echoclient/echoclient.c b/examples/echoclient/echoclient.c index db5d74c97..2026cbbea 100644 --- a/examples/echoclient/echoclient.c +++ b/examples/echoclient/echoclient.c @@ -121,7 +121,11 @@ void echoclient_test(void* args) #if defined(CYASSL_DTLS) method = DTLSv1_2_client_method(); #elif !defined(NO_TLS) + #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_SNIFFER) + method = CyaTLSv1_2_client_method(); + #else method = CyaSSLv23_client_method(); + #endif #elif defined(WOLFSSL_ALLOW_SSLV3) method = SSLv3_client_method(); #else @@ -151,7 +155,7 @@ void echoclient_test(void* args) #if defined(CYASSL_SNIFFER) /* Only set if not running testsuite */ - if (XSTRNCMP(argv[0], "testsuite", XSTRLEN("testsuite")) != 0) { + if (XSTRSTR(argv[0], "testsuite") != 0) { /* don't use EDH, can't sniff tmp keys */ SSL_CTX_set_cipher_list(ctx, "AES256-SHA"); } diff --git a/examples/echoserver/echoserver.c b/examples/echoserver/echoserver.c index b7bb49282..1ed4d1fe9 100644 --- a/examples/echoserver/echoserver.c +++ b/examples/echoserver/echoserver.c @@ -138,7 +138,11 @@ THREAD_RETURN CYASSL_THREAD echoserver_test(void* args) #if defined(CYASSL_DTLS) method = CyaDTLSv1_2_server_method(); #elif !defined(NO_TLS) + #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_SNIFFER) + method = CyaTLSv1_2_server_method(); + #else method = CyaSSLv23_server_method(); + #endif #elif defined(WOLFSSL_ALLOW_SSLV3) method = CyaSSLv3_server_method(); #else @@ -228,7 +232,7 @@ THREAD_RETURN CYASSL_THREAD echoserver_test(void* args) #if defined(CYASSL_SNIFFER) /* Only set if not running testsuite */ - if (XSTRNCMP(argv[0], "testsuite", XSTRLEN("testsuite")) != 0) { + if (XSTRSTR(argv[0], "testsuite") != 0) { /* don't use EDH, can't sniff tmp keys */ CyaSSL_CTX_set_cipher_list(ctx, "AES256-SHA"); } diff --git a/examples/server/server.c b/examples/server/server.c index 3f7ae6d4e..0471e6434 100644 --- a/examples/server/server.c +++ b/examples/server/server.c @@ -1830,7 +1830,7 @@ THREAD_RETURN WOLFSSL_THREAD server_test(void* args) #if defined(WOLFSSL_SNIFFER) /* don't use EDH, can't sniff tmp keys */ - if (cipherList == NULL) { + if (cipherList == NULL && version < 4) { if (SSL_CTX_set_cipher_list(ctx, "AES128-SHA") != WOLFSSL_SUCCESS) err_sys_ex(runWithErrors, "server can't set cipher list 3"); } From 82520572b0aab2fdd6b881b64fd533829b2f4220 Mon Sep 17 00:00:00 2001 From: Daniele Lacamera Date: Mon, 1 Jun 2020 13:23:50 +0200 Subject: [PATCH 183/298] Initial support for psoc6_crypto (sha256 only) --- wolfcrypt/src/port/cypress/psoc6_crypto.c | 107 ++++++++++++++++++ wolfcrypt/src/sha256.c | 13 ++- wolfcrypt/src/wc_port.c | 12 ++ wolfssl/wolfcrypt/port/cypress/psoc6_crypto.h | 59 ++++++++++ wolfssl/wolfcrypt/sha.h | 2 + wolfssl/wolfcrypt/sha256.h | 2 + 6 files changed, 194 insertions(+), 1 deletion(-) create mode 100644 wolfcrypt/src/port/cypress/psoc6_crypto.c create mode 100644 wolfssl/wolfcrypt/port/cypress/psoc6_crypto.h diff --git a/wolfcrypt/src/port/cypress/psoc6_crypto.c b/wolfcrypt/src/port/cypress/psoc6_crypto.c new file mode 100644 index 000000000..d67d800ea --- /dev/null +++ b/wolfcrypt/src/port/cypress/psoc6_crypto.c @@ -0,0 +1,107 @@ +/* psoc6_crypto.c + * + * Copyright (C) 2006-2020 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * wolfSSL is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +#ifdef HAVE_CONFIG_H + #include +#endif + +#include +#ifdef NO_INLINE + #include +#else + #define WOLFSSL_MISC_INCLUDED + #include +#endif + +#if defined(WOLFSSL_PSOC6_CRYPTO) + +#include +#include +#include +#include +#include + +static CRYPTO_Type *crypto_base = PSOC6_CRYPTO_BASE; + +/* Hook for device specific initialization */ +int psoc6_crypto_port_init(void) +{ + Cy_Crypto_Core_Enable(crypto_base); + return 0; +} + +#ifndef NO_SHA256 + +int wc_InitSha256(wc_Sha256* sha) +{ + cy_en_crypto_status_t res; + if (!sha) + return BAD_FUNC_ARG; + Cy_Crypto_Core_MemSet(crypto_base, sha, 0, sizeof(sha)); + res = Cy_Crypto_Core_Sha_Init(crypto_base, &sha->hash_state, CY_CRYPTO_MODE_SHA256, &sha->sha_buffers); + if (res != CY_CRYPTO_SUCCESS) + return (int)res; + return (int) Cy_Crypto_Core_Sha_Start(crypto_base, &sha->hash_state); +} + +int wc_Sha256Update(wc_Sha256* sha, const byte* in, word32 sz) +{ + if ((!sha) || (!in)) + return BAD_FUNC_ARG; + if (sz == 0) + return 0; + + return (int)Cy_Crypto_Core_Sha_Update(crypto_base, &sha->hash_state, in, sz); +} + +int wc_Sha256Final(wc_Sha256* sha, byte* hash) +{ + if ((!sha) || (!hash)) + return BAD_FUNC_ARG; + return (int)Cy_Crypto_Core_Sha_Finish(crypto_base, &sha->hash_state, hash); +} + +int wc_Sha256GetHash(wc_Sha256* sha, byte* hash) +{ + if ((!sha) || (!hash)) + return BAD_FUNC_ARG; + Cy_Crypto_Core_MemCpy(crypto_base, hash, sha->hash_state.hash, WC_SHA256_DIGEST_SIZE); + return 0; +} + +int wc_Sha256Copy(wc_Sha256* src, wc_Sha256* dst) +{ + cy_en_crypto_status_t res; + if ((!dst) || (!src)) + return BAD_FUNC_ARG; + Cy_Crypto_Core_MemCpy(crypto_base, dst, src, sizeof(wc_Sha256)); + return (int)Cy_Crypto_Core_Sha_Init(crypto_base, &dst->hash_state, CY_CRYPTO_MODE_SHA256, &dst->sha_buffers); +} + +void wc_Sha256Free(wc_Sha256* sha) +{ + if (sha) + Cy_Crypto_Core_Sha_Free(crypto_base, &sha->hash_state); +} +#endif /* NO_SHA256 */ + +#endif /* defined(WOLFSSL_PSOC6_CRYPTO) */ + diff --git a/wolfcrypt/src/sha256.c b/wolfcrypt/src/sha256.c index eb0911b01..4d0a00ce0 100644 --- a/wolfcrypt/src/sha256.c +++ b/wolfcrypt/src/sha256.c @@ -119,6 +119,10 @@ /* #include included by wc_port.c */ #elif defined(WOLFSSL_CRYPTOCELL) /* wc_port.c includes wolfcrypt/src/port/arm/cryptoCellHash.c */ + +#elif defined(WOLFSSL_PSOC6_CRYPTO) + + #else #include @@ -164,7 +168,8 @@ (!defined(WOLFSSL_IMX6_CAAM) || defined(NO_IMX6_CAAM_HASH)) && \ !defined(WOLFSSL_AFALG_HASH) && !defined(WOLFSSL_DEVCRYPTO_HASH) && \ (!defined(WOLFSSL_ESP32WROOM32_CRYPT) || defined(NO_WOLFSSL_ESP32WROOM32_CRYPT_HASH)) && \ - (!defined(WOLFSSL_RENESAS_TSIP_CRYPT) || defined(NO_WOLFSSL_RENESAS_TSIP_HASH)) + (!defined(WOLFSSL_RENESAS_TSIP_CRYPT) || defined(NO_WOLFSSL_RENESAS_TSIP_HASH)) && \ + !defined(WOLFSSL_PSOC6_CRYPTO) static int InitSha256(wc_Sha256* sha256) { @@ -663,6 +668,10 @@ static int InitSha256(wc_Sha256* sha256) /* implemented in wolfcrypt/src/port/Renesas/renesas_tsip_sha.c */ +#elif defined(WOLFSSL_PSOC6_CRYPTO) + + /* implemented in wolfcrypt/src/port/cypress/psoc6_crypto.c */ + #else #define NEED_SOFT_SHA256 @@ -1559,6 +1568,8 @@ void wc_Sha256Free(wc_Sha256* sha256) !defined(NO_WOLFSSL_RENESAS_TSIP_CRYPT_HASH) /* implemented in wolfcrypt/src/port/Renesas/renesas_tsip_sha.c */ +#elif defined(WOLFSSL_PSOC6_CRYPTO) + /* implemented in wolfcrypt/src/port/cypress/psoc6_crypto.c */ #else int wc_Sha256GetHash(wc_Sha256* sha256, byte* hash) diff --git a/wolfcrypt/src/wc_port.c b/wolfcrypt/src/wc_port.c index cc2572953..6295cc09b 100644 --- a/wolfcrypt/src/wc_port.c +++ b/wolfcrypt/src/wc_port.c @@ -46,6 +46,10 @@ #include #endif +#ifdef WOLFSSL_PSOC6_CRYPTO + #include +#endif + #if defined(WOLFSSL_ATMEL) || defined(WOLFSSL_ATECC508A) || \ defined(WOLFSSL_ATECC608A) #include @@ -201,6 +205,14 @@ int wolfCrypt_Init(void) stsafe_interface_init(); #endif + #if defined(WOLFSSL_PSOC6_CRYPTO) + ret = psoc6_crypto_port_init(); + if (ret != 0) { + WOLFSSL_MSG("PSoC6 crypto engine init failed"); + return ret; + } + #endif + #ifdef WOLFSSL_ARMASM WOLFSSL_MSG("Using ARM hardware acceleration"); #endif diff --git a/wolfssl/wolfcrypt/port/cypress/psoc6_crypto.h b/wolfssl/wolfcrypt/port/cypress/psoc6_crypto.h new file mode 100644 index 000000000..2732efc9e --- /dev/null +++ b/wolfssl/wolfcrypt/port/cypress/psoc6_crypto.h @@ -0,0 +1,59 @@ +/* psoc6_crypto.h + * + * Copyright (C) 2006-2020 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * wolfSSL is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +#ifndef _PSOC6_CRYPTO_PORT_H_ +#define _PSOC6_CRYPTO_PORT_H_ + +#include +#ifdef USE_FAST_MATH + #include +#elif defined WOLFSSL_SP_MATH + #include +#else + #include +#endif +#include "cy_crypto_core_sha.h" +#include "cy_device_headers.h" +#include "psoc6_02_config.h" +#include "cy_crypto_common.h" +#include "cy_crypto_core.h" + +#ifndef NO_SHA256 + +#include "cy_crypto_core_sha.h" +typedef struct wc_Sha256 { + cy_stc_crypto_sha_state_t hash_state; + cy_en_crypto_sha_mode_t sha_mode; + cy_stc_crypto_v2_sha256_buffers_t sha_buffers; +} wc_Sha256; + + +#endif /* !def NO_SHA256 */ + +#include +#include + +#define PSOC6_CRYPTO_BASE ((CRYPTO_Type*) CRYPTO_BASE) + +/* Crypto HW engine initialization */ +int psoc6_crypto_port_init(void); + +#endif /* _PSOC6_CRYPTO_PORT_H_ */ diff --git a/wolfssl/wolfcrypt/sha.h b/wolfssl/wolfcrypt/sha.h index 0b7f65404..960d9a03c 100644 --- a/wolfssl/wolfcrypt/sha.h +++ b/wolfssl/wolfcrypt/sha.h @@ -101,6 +101,8 @@ enum { #elif defined(WOLFSSL_RENESAS_TSIP_CRYPT) && \ !defined(NO_WOLFSSL_RENESAS_TSIP_CRYPT_HASH) #include "wolfssl/wolfcrypt/port/Renesas/renesas-tsip-crypt.h" +#elif defined(WOLFSSL_PSOC6_CRYPTO) + #include "wolfssl/wolfcrypt/port/cypress/psoc6_crypto.h" #else /* Sha digest */ diff --git a/wolfssl/wolfcrypt/sha256.h b/wolfssl/wolfcrypt/sha256.h index 798f309d1..77f5fb759 100644 --- a/wolfssl/wolfcrypt/sha256.h +++ b/wolfssl/wolfcrypt/sha256.h @@ -126,6 +126,8 @@ enum { #elif defined(WOLFSSL_RENESAS_TSIP_CRYPT) && \ !defined(NO_WOLFSSL_RENESAS_TSIP_CRYPT_HASH) #include "wolfssl/wolfcrypt/port/Renesas/renesas-tsip-crypt.h" +#elif defined(WOLFSSL_PSOC6_CRYPTO) + #include "wolfssl/wolfcrypt/port/cypress/psoc6_crypto.h" #else /* wc_Sha256 digest */ From b1947478bb75a08342d488ad38a6d41c462eded5 Mon Sep 17 00:00:00 2001 From: Daniele Lacamera Date: Tue, 2 Jun 2020 10:57:39 +0200 Subject: [PATCH 184/298] Added support for SHA512 via psoc6 crypto --- wolfcrypt/src/port/cypress/psoc6_crypto.c | 56 +++++++++++++++++++ wolfcrypt/src/sha512.c | 2 +- wolfssl/wolfcrypt/port/cypress/psoc6_crypto.h | 12 +++- wolfssl/wolfcrypt/sha512.h | 4 ++ 4 files changed, 72 insertions(+), 2 deletions(-) diff --git a/wolfcrypt/src/port/cypress/psoc6_crypto.c b/wolfcrypt/src/port/cypress/psoc6_crypto.c index d67d800ea..90f2d674a 100644 --- a/wolfcrypt/src/port/cypress/psoc6_crypto.c +++ b/wolfcrypt/src/port/cypress/psoc6_crypto.c @@ -48,8 +48,64 @@ int psoc6_crypto_port_init(void) return 0; } +#ifdef WOLFSSL_SHA512 +int wc_InitSha512(wc_Sha512* sha) +{ + cy_en_crypto_status_t res; + if (!sha) + return BAD_FUNC_ARG; + Cy_Crypto_Core_MemSet(crypto_base, sha, 0, sizeof(sha)); + res = Cy_Crypto_Core_Sha_Init(crypto_base, &sha->hash_state, CY_CRYPTO_MODE_SHA512, &sha->sha_buffers); + if (res != CY_CRYPTO_SUCCESS) + return (int)res; + return (int) Cy_Crypto_Core_Sha_Start(crypto_base, &sha->hash_state); +} + +int wc_Sha512Update(wc_Sha512* sha, const byte* in, word32 sz) +{ + if ((!sha) || (!in)) + return BAD_FUNC_ARG; + if (sz == 0) + return 0; + + return (int)Cy_Crypto_Core_Sha_Update(crypto_base, &sha->hash_state, in, sz); +} + +int wc_Sha512Final(wc_Sha512* sha, byte* hash) +{ + if ((!sha) || (!hash)) + return BAD_FUNC_ARG; + return (int)Cy_Crypto_Core_Sha_Finish(crypto_base, &sha->hash_state, hash); +} + +int wc_Sha512GetHash(wc_Sha512* sha, byte* hash) +{ + if ((!sha) || (!hash)) + return BAD_FUNC_ARG; + Cy_Crypto_Core_MemCpy(crypto_base, hash, sha->hash_state.hash, WC_SHA512_DIGEST_SIZE); + return 0; +} + +int wc_Sha512Copy(wc_Sha512* src, wc_Sha512* dst) +{ + cy_en_crypto_status_t res; + if ((!dst) || (!src)) + return BAD_FUNC_ARG; + Cy_Crypto_Core_MemCpy(crypto_base, dst, src, sizeof(wc_Sha512)); + return (int)Cy_Crypto_Core_Sha_Init(crypto_base, &dst->hash_state, CY_CRYPTO_MODE_SHA512, &dst->sha_buffers); +} + +void wc_Sha512Free(wc_Sha512* sha) +{ + if (sha) + Cy_Crypto_Core_Sha_Free(crypto_base, &sha->hash_state); +} + +#endif + #ifndef NO_SHA256 + int wc_InitSha256(wc_Sha256* sha) { cy_en_crypto_status_t res; diff --git a/wolfcrypt/src/sha512.c b/wolfcrypt/src/sha512.c index 0a648bf4a..22c471884 100644 --- a/wolfcrypt/src/sha512.c +++ b/wolfcrypt/src/sha512.c @@ -26,7 +26,7 @@ #include -#if (defined(WOLFSSL_SHA512) || defined(WOLFSSL_SHA384)) && !defined(WOLFSSL_ARMASM) +#if (defined(WOLFSSL_SHA512) || defined(WOLFSSL_SHA384)) && !defined(WOLFSSL_ARMASM) && !defined(WOLFSSL_PSOC6_CRYPTO) #if defined(HAVE_FIPS) && \ defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2) diff --git a/wolfssl/wolfcrypt/port/cypress/psoc6_crypto.h b/wolfssl/wolfcrypt/port/cypress/psoc6_crypto.h index 2732efc9e..34d8ccd06 100644 --- a/wolfssl/wolfcrypt/port/cypress/psoc6_crypto.h +++ b/wolfssl/wolfcrypt/port/cypress/psoc6_crypto.h @@ -36,9 +36,19 @@ #include "cy_crypto_common.h" #include "cy_crypto_core.h" +#ifdef WOLFSSL_SHA512 +typedef struct wc_Sha512 { + cy_stc_crypto_sha_state_t hash_state; + cy_en_crypto_sha_mode_t sha_mode; + cy_stc_crypto_v2_sha512_buffers_t sha_buffers; +} wc_Sha512; + +#define WC_SHA512_TYPE_DEFINED +#include +#endif + #ifndef NO_SHA256 -#include "cy_crypto_core_sha.h" typedef struct wc_Sha256 { cy_stc_crypto_sha_state_t hash_state; cy_en_crypto_sha_mode_t sha_mode; diff --git a/wolfssl/wolfcrypt/sha512.h b/wolfssl/wolfcrypt/sha512.h index 3aac94852..5aaf8e3f0 100644 --- a/wolfssl/wolfcrypt/sha512.h +++ b/wolfssl/wolfcrypt/sha512.h @@ -31,6 +31,7 @@ #if defined(WOLFSSL_SHA512) || defined(WOLFSSL_SHA384) + #if defined(HAVE_FIPS) && \ defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2) #include @@ -111,6 +112,8 @@ enum { #ifdef WOLFSSL_IMX6_CAAM #include "wolfssl/wolfcrypt/port/caam/wolfcaam_sha.h" +#elif defined (WOLFSSL_PSOC6_CRYPTO) + #include "wolfssl/wolfcrypt/port/cypress/psoc6_crypto.h" #else /* wc_Sha512 digest */ struct wc_Sha512 { @@ -153,6 +156,7 @@ WOLFSSL_LOCAL void Transform_Sha512_Len(wc_Sha512* sha512, const byte* data, #ifdef WOLFSSL_SHA512 + WOLFSSL_API int wc_InitSha512(wc_Sha512*); WOLFSSL_API int wc_InitSha512_ex(wc_Sha512*, void*, int); WOLFSSL_API int wc_Sha512Update(wc_Sha512*, const byte*, word32); From 76ab8bfb6b65f0c78a8c1e0c452a1e56621b43d4 Mon Sep 17 00:00:00 2001 From: Daniele Lacamera Date: Fri, 5 Jun 2020 11:00:28 +0200 Subject: [PATCH 185/298] Added psoc6 ECDSA verification support --- wolfcrypt/src/ecc.c | 8 ++ wolfcrypt/src/port/cypress/psoc6_crypto.c | 92 ++++++++++++++++++- wolfssl/wolfcrypt/port/cypress/psoc6_crypto.h | 11 ++- 3 files changed, 106 insertions(+), 5 deletions(-) diff --git a/wolfcrypt/src/ecc.c b/wolfcrypt/src/ecc.c index 00d9c7423..fa3469a2a 100644 --- a/wolfcrypt/src/ecc.c +++ b/wolfcrypt/src/ecc.c @@ -141,6 +141,10 @@ ECC Curve Sizes: #include #endif +#if defined(WOLFSSL_PSOC6_CRYPTO) + #include +#endif + #ifdef WOLFSSL_SP_MATH #define GEN_MEM_ERR MP_MEM #elif defined(USE_FAST_MATH) @@ -5846,6 +5850,10 @@ int wc_ecc_verify_hash_ex(mp_int *r, mp_int *s, const byte* hash, { return stm32_ecc_verify_hash_ex(r, s, hash, hashlen, res, key); } +#elif defined(WOLFSSL_PSOC6_CRYPTO) +{ + return psoc6_ecc_verify_hash_ex(r, s, hash, hashlen, res, key); +} #else { int err; diff --git a/wolfcrypt/src/port/cypress/psoc6_crypto.c b/wolfcrypt/src/port/cypress/psoc6_crypto.c index 90f2d674a..b00be7714 100644 --- a/wolfcrypt/src/port/cypress/psoc6_crypto.c +++ b/wolfcrypt/src/port/cypress/psoc6_crypto.c @@ -32,6 +32,16 @@ #endif #if defined(WOLFSSL_PSOC6_CRYPTO) +#ifdef WOLFSSL_SP_MATH + struct sp_int; + #define MATH_INT_T struct sp_int +#elif defined(USE_FAST_MATH) + struct fp_int; + #define MATH_INT_T struct fp_int +#else + struct mp_int; + #define MATH_INT_T struct mp_int +#endif #include #include @@ -48,6 +58,8 @@ int psoc6_crypto_port_init(void) return 0; } +/* Sha-512 */ + #ifdef WOLFSSL_SHA512 int wc_InitSha512(wc_Sha512* sha) { @@ -103,9 +115,9 @@ void wc_Sha512Free(wc_Sha512* sha) #endif +/* Sha-256 */ + #ifndef NO_SHA256 - - int wc_InitSha256(wc_Sha256* sha) { cy_en_crypto_status_t res; @@ -159,5 +171,81 @@ void wc_Sha256Free(wc_Sha256* sha) } #endif /* NO_SHA256 */ +/* ECDSA */ +#ifdef HAVE_ECC + +#define MAX_ECC_KEYSIZE 66 /* Supports up to secp521r1 */ +static cy_en_crypto_ecc_curve_id_t psoc6_get_curve_id(int size) +{ + switch(size) { + case 24: + return CY_CRYPTO_ECC_ECP_SECP192R1; + case 28: + return CY_CRYPTO_ECC_ECP_SECP224R1; + case 32: + return CY_CRYPTO_ECC_ECP_SECP256R1; + case 48: + return CY_CRYPTO_ECC_ECP_SECP384R1; + case 66: + return CY_CRYPTO_ECC_ECP_SECP521R1; + default: + return CY_CRYPTO_ECC_ECP_NONE; + } +} + +#include +int psoc6_ecc_verify_hash_ex(MATH_INT_T *r, MATH_INT_T *s, const byte* hash, + word32 hashlen, int* verif_res, ecc_key* key) +{ + uint8_t signature_buf[MAX_ECC_KEYSIZE * 2]; + cy_stc_crypto_ecc_key ecc_key; + uint8_t stat = 0; + int res = -1; + int szModulus; + int szkbin; + uint8_t x[MAX_ECC_KEYSIZE], y[MAX_ECC_KEYSIZE]; + + if (!key || !verif_res || !r || !s || !hash) + return -BAD_FUNC_ARG; + + /* retrieve and check sizes */ + szModulus = mp_unsigned_bin_size(key->pubkey.x); + szkbin = mp_unsigned_bin_size(r); + if (szModulus > MAX_ECC_KEYSIZE) + return -BAD_FUNC_ARG; + + /* Prepare ECC key */ + ecc_key.type = PK_PUBLIC; + ecc_key.curveID = psoc6_get_curve_id(szModulus); + ecc_key.k = NULL; + ecc_key.pubkey.x = x; + ecc_key.pubkey.y = y; + + res = mp_to_unsigned_bin(key->pubkey.x, x); + if (res == MP_OKAY) + res = mp_to_unsigned_bin(key->pubkey.y, y); + Cy_Crypto_Core_InvertEndianness(x, szModulus); + Cy_Crypto_Core_InvertEndianness(y, szModulus); + + /* Prepare signature buffer */ + if (res == MP_OKAY) + res = mp_to_unsigned_bin(r, signature_buf); + if (res == MP_OKAY) + res = mp_to_unsigned_bin(s, signature_buf + szkbin); + Cy_Crypto_Core_InvertEndianness(signature_buf, szkbin); + Cy_Crypto_Core_InvertEndianness(signature_buf + szkbin, szkbin); + + /* perform HW ECDSA */ + if (res == MP_OKAY) + res = Cy_Crypto_Core_ECC_VerifyHash(crypto_base, signature_buf, hash, hashlen, &stat, &ecc_key); + if (res == 0) { + *verif_res = stat; + } + return res; +} +#endif /* HAVE_ECC */ + + + #endif /* defined(WOLFSSL_PSOC6_CRYPTO) */ diff --git a/wolfssl/wolfcrypt/port/cypress/psoc6_crypto.h b/wolfssl/wolfcrypt/port/cypress/psoc6_crypto.h index 34d8ccd06..964f22162 100644 --- a/wolfssl/wolfcrypt/port/cypress/psoc6_crypto.h +++ b/wolfssl/wolfcrypt/port/cypress/psoc6_crypto.h @@ -55,11 +55,16 @@ typedef struct wc_Sha256 { cy_stc_crypto_v2_sha256_buffers_t sha_buffers; } wc_Sha256; - -#endif /* !def NO_SHA256 */ - #include #include +#endif /* !def NO_SHA256 */ + + +#ifdef HAVE_ECC +#include +int psoc6_ecc_verify_hash_ex(mp_int *r, mp_int *s, const byte* hash, + word32 hashlen, int* verif_res, ecc_key* key); +#endif /* HAVE_ECC */ #define PSOC6_CRYPTO_BASE ((CRYPTO_Type*) CRYPTO_BASE) From 254dd9f823247d4bffd08443289b76f1519f4b52 Mon Sep 17 00:00:00 2001 From: Daniele Lacamera Date: Fri, 5 Jun 2020 15:28:49 +0200 Subject: [PATCH 186/298] Added new files to include.am --- wolfcrypt/src/include.am | 3 ++- wolfssl/wolfcrypt/include.am | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/wolfcrypt/src/include.am b/wolfcrypt/src/include.am index bba761bc1..3c62757c7 100644 --- a/wolfcrypt/src/include.am +++ b/wolfcrypt/src/include.am @@ -85,7 +85,8 @@ EXTRA_DIST += wolfcrypt/src/port/ti/ti-aes.c \ wolfcrypt/src/port/Renesas/renesas_tsip_aes.c \ wolfcrypt/src/port/Renesas/renesas_tsip_sha.c \ wolfcrypt/src/port/Renesas/renesas_tsip_util.c \ - wolfcrypt/src/port/Renesas/README.md + wolfcrypt/src/port/Renesas/README.md \ + wolfcrypt/src/port/cypress/psoc6_crypto.c if BUILD_CRYPTOCB diff --git a/wolfssl/wolfcrypt/include.am b/wolfssl/wolfcrypt/include.am index 0df704636..ecaba14f2 100644 --- a/wolfssl/wolfcrypt/include.am +++ b/wolfssl/wolfcrypt/include.am @@ -82,7 +82,8 @@ noinst_HEADERS+= \ wolfssl/wolfcrypt/port/st/stsafe.h \ wolfssl/wolfcrypt/port/Espressif/esp32-crypt.h \ wolfssl/wolfcrypt/port/arm/cryptoCell.h \ - wolfssl/wolfcrypt/port/Renesas/renesas-tsip-crypt.h + wolfssl/wolfcrypt/port/Renesas/renesas-tsip-crypt.h \ + wolfssl/wolfcrypt/port/cypress/psoc6_crypto.h if BUILD_CRYPTOAUTHLIB nobase_include_HEADERS+= wolfssl/wolfcrypt/port/atmel/atmel.h From a75f83c9f256f3c45b973dfc5e388548b0542ffe Mon Sep 17 00:00:00 2001 From: Juliusz Sosinowicz Date: Fri, 5 Jun 2020 16:44:12 +0200 Subject: [PATCH 187/298] Implement CRYPTO_memcmp --- src/ssl.c | 7 +++++++ tests/api.c | 16 ++++++++++++++++ wolfssl/openssl/ssl.h | 1 + wolfssl/ssl.h | 2 ++ 4 files changed, 26 insertions(+) diff --git a/src/ssl.c b/src/ssl.c index 62b7b0414..17088c596 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -41930,6 +41930,13 @@ void wolfSSL_X509_OBJECT_free(WOLFSSL_X509_OBJECT *a) #if defined(OPENSSL_EXTRA) +int wolfSSL_CRYPTO_memcmp(const void *a, const void *b, size_t size) +{ + if (!a || !b) + return 0; + return ConstantCompare(a, b, size); +} + int wolfSSL_sk_X509_num(const WOLF_STACK_OF(WOLFSSL_X509) *s) { WOLFSSL_ENTER("wolfSSL_sk_X509_num"); diff --git a/tests/api.c b/tests/api.c index 87e24162f..1895d48fa 100644 --- a/tests/api.c +++ b/tests/api.c @@ -28759,6 +28759,20 @@ static void test_no_op_functions(void) #endif } +static void test_wolfSSL_CRYPTO_memcmp(void) +{ +#ifdef OPENSSL_EXTRA + char a[] = "wolfSSL (formerly CyaSSL) is a small, fast, portable " + "implementation of TLS/SSL for embedded devices to the cloud."; + char b[] = "wolfSSL (formerly CyaSSL) is a small, fast, portable " + "implementation of TLS/SSL for embedded devices to the cloud."; + char c[] = "wolfSSL (formerly CyaSSL) is a small, fast, portable " + "implementation of TLS/SSL for embedded devices to the cloud!"; + + AssertIntEQ(CRYPTO_memcmp(a, b, sizeof(a)), 0); + AssertIntNE(CRYPTO_memcmp(a, c, sizeof(a)), 0); +#endif +} /*----------------------------------------------------------------------------* | wolfCrypt ASN @@ -32238,6 +32252,8 @@ void ApiTest(void) test_wolfSSL_EC_get_builtin_curves(); + test_wolfSSL_CRYPTO_memcmp(); + /* test the no op functions for compatibility */ test_no_op_functions(); diff --git a/wolfssl/openssl/ssl.h b/wolfssl/openssl/ssl.h index 485e8bb1c..46f9be1b3 100644 --- a/wolfssl/openssl/ssl.h +++ b/wolfssl/openssl/ssl.h @@ -151,6 +151,7 @@ typedef STACK_OF(ACCESS_DESCRIPTION) AUTHORITY_INFO_ACCESS; #define CRYPTO_cleanup_all_ex_data wolfSSL_cleanup_all_ex_data #define set_ex_data wolfSSL_CRYPTO_set_ex_data #define get_ex_data wolfSSL_CRYPTO_get_ex_data +#define CRYPTO_memcmp wolfSSL_CRYPTO_memcmp /* this function was used to set the default malloc, free, and realloc */ #define CRYPTO_malloc_init() 0 /* CRYPTO_malloc_init is not needed */ diff --git a/wolfssl/ssl.h b/wolfssl/ssl.h index 96a3e1d0e..5f7e1c4b1 100644 --- a/wolfssl/ssl.h +++ b/wolfssl/ssl.h @@ -3502,6 +3502,8 @@ WOLFSSL_API int wolfSSL_CRYPTO_set_mem_ex_functions(void *(*m) (size_t, const ch WOLFSSL_API void wolfSSL_CRYPTO_cleanup_all_ex_data(void); +WOLFSSL_API int wolfSSL_CRYPTO_memcmp(const void *a, const void *b, size_t size); + WOLFSSL_API WOLFSSL_BIGNUM* wolfSSL_DH_768_prime(WOLFSSL_BIGNUM* bn); WOLFSSL_API WOLFSSL_BIGNUM* wolfSSL_DH_1024_prime(WOLFSSL_BIGNUM* bn); WOLFSSL_API WOLFSSL_BIGNUM* wolfSSL_DH_1536_prime(WOLFSSL_BIGNUM* bn); From 3b8455fcd0f060efeaa9e832817e6e8456e86174 Mon Sep 17 00:00:00 2001 From: David Garske Date: Fri, 5 Jun 2020 10:26:32 -0700 Subject: [PATCH 188/298] Fix for building without ECC and DH (TLS v1.3 cannot be enabled). --- configure.ac | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/configure.ac b/configure.ac index f027c92ae..ec313fcff 100644 --- a/configure.ac +++ b/configure.ac @@ -3137,14 +3137,16 @@ then AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_REQUIRE_FFDHE" fi -# TLS 1.3 Requires either ECC, CURVE25519, CURVE448 or RSA -if test "x$ENABLED_ECC" = "xno" && test "x$ENABLED_CURVE25519" = "xno" && test "x$ENABLED_CURVE448" = "xno" && test "x$ENABLED_RSA" = "xno" +# TLS 1.3 Requires either ECC or (RSA/DH), or CURVE25519/ED25519 or CURVE448/ED448 +if test "x$ENABLED_ECC" = "xno" && \ + (test "x$ENABLED_RSA" = "xno" || test "x$ENABLED_DH" = "xno") && \ + (test "x$ENABLED_CURVE25519" = "xno" || test "x$ENABLED_ED25519" = "xno") && \ + (test "x$ENABLED_CURVE448" = "xno" || test "x$ENABLED_ED448" = "xno") then # disable TLS 1.3 ENABLED_TLS13=no - ENABLED_TLS13_DRAFT18=no fi -if test "$ENABLED_TLS13" = "yes" || test "$ENABLED_TLS13_DRAFT18" = "yes" +if test "$ENABLED_TLS13" = "yes" then AM_CFLAGS="-DWOLFSSL_TLS13 -DHAVE_TLS_EXTENSIONS -DHAVE_SUPPORTED_CURVES $AM_CFLAGS" fi @@ -3201,7 +3203,7 @@ then ENABLED_ENCRYPT_THEN_MAC=yes AM_CFLAGS="$AM_CFLAGS -DHAVE_TLS_EXTENSIONS -DHAVE_SNI -DHAVE_MAX_FRAGMENT -DHAVE_TRUNCATED_HMAC -DHAVE_ALPN -DHAVE_TRUSTED_CA" # Check the ECC supported curves prereq - AS_IF([test "x$ENABLED_ECC" = "xyes" || test "x$ENABLED_CURVE25519" = "xyes"], + AS_IF([test "x$ENABLED_ECC" = "xyes" || test "x$ENABLED_CURVE25519" = "xyes" || test "x$ENABLED_TLS13" = "xyes"], [ENABLED_SUPPORTED_CURVES=yes AM_CFLAGS="$AM_CFLAGS -DHAVE_SUPPORTED_CURVES"]) fi From fb5c9e52687bfa880ca4ca527cd8fef2a04c07ce Mon Sep 17 00:00:00 2001 From: David Garske Date: Fri, 5 Jun 2020 11:11:23 -0700 Subject: [PATCH 189/298] Adjust static memory case with TLS v1.3 enabled. --- examples/server/server.c | 2 +- wolfssl/wolfcrypt/memory.h | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/examples/server/server.c b/examples/server/server.c index 0471e6434..695ab6f9b 100644 --- a/examples/server/server.c +++ b/examples/server/server.c @@ -1019,7 +1019,7 @@ THREAD_RETURN WOLFSSL_THREAD server_test(void* args) #if (defined(HAVE_ECC) && !defined(ALT_ECC_SIZE)) \ || defined(SESSION_CERTS) /* big enough to handle most cases including session certs */ - byte memory[204000]; + byte memory[220000]; #else byte memory[80000]; #endif diff --git a/wolfssl/wolfcrypt/memory.h b/wolfssl/wolfcrypt/memory.h index 486fd39ab..f54f73a39 100644 --- a/wolfssl/wolfcrypt/memory.h +++ b/wolfssl/wolfcrypt/memory.h @@ -110,7 +110,11 @@ WOLFSSL_API int wolfSSL_GetAllocators(wolfSSL_Malloc_cb*, #elif defined (OPENSSL_EXTRA) /* extra storage in structs for multiple attributes and order */ #ifndef LARGEST_MEM_BUCKET - #define LARGEST_MEM_BUCKET 25600 + #ifdef WOLFSSL_TLS13 + #define LARGEST_MEM_BUCKET 25792 + #else + #define LARGEST_MEM_BUCKET 25600 + #endif #endif #define WOLFMEM_BUCKETS 64,128,256,512,1024,2432,3360,4480,\ LARGEST_MEM_BUCKET From 3af4316cfd4aff5e31fc7fbccc0ed4a974767e8d Mon Sep 17 00:00:00 2001 From: David Garske Date: Fri, 5 Jun 2020 13:33:03 -0700 Subject: [PATCH 190/298] Fix for session test with TLS v1.3 and session tickets not enabled. Cleanups in `AddSession`. --- src/ssl.c | 61 ++++++++++++++++++++++------------------------------- tests/api.c | 5 +++++ 2 files changed, 30 insertions(+), 36 deletions(-) diff --git a/src/ssl.c b/src/ssl.c index 173b3d67c..acee44974 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -12626,6 +12626,7 @@ int AddSession(WOLFSSL* ssl) word32 row = 0; word32 idx = 0; int error = 0; + const byte* id = NULL; #ifdef HAVE_SESSION_TICKET byte* tmpBuff = NULL; int ticLen = 0; @@ -12645,10 +12646,21 @@ int AddSession(WOLFSSL* ssl) return 0; #endif +#if defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET) + if (ssl->options.tls1_3) + id = ssl->session.sessionID; + else +#endif + if (ssl->arrays) + id = ssl->arrays->sessionID; + if (id == NULL) { + return BAD_FUNC_ARG; + } + #ifdef HAVE_SESSION_TICKET ticLen = ssl->session.ticketLen; /* Alloc Memory here so if Malloc fails can exit outside of lock */ - if(ticLen > SESSION_TICKET_LEN) { + if (ticLen > SESSION_TICKET_LEN) { tmpBuff = (byte*)XMALLOC(ticLen, ssl->heap, DYNAMIC_TYPE_SESSION_TICK); if(!tmpBuff) @@ -12675,17 +12687,7 @@ int AddSession(WOLFSSL* ssl) { /* Use the session object in the cache for external cache if required. */ -#if defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET) - if (ssl->options.tls1_3) { - row = HashSession(ssl->session.sessionID, ID_LEN, &error) % - SESSION_ROWS; - } - else -#endif - { - row = HashSession(ssl->arrays->sessionID, ID_LEN, &error) % - SESSION_ROWS; - } + row = HashSession(id, ID_LEN, &error) % SESSION_ROWS; if (error != 0) { WOLFSSL_MSG("Hash session failed"); #ifdef HAVE_SESSION_TICKET @@ -12702,21 +12704,11 @@ int AddSession(WOLFSSL* ssl) } for (i=0; ioptions.tls1_3) { - if (XMEMCMP(ssl->session.sessionID, SessionCache[row].Sessions[i].sessionID, ID_LEN) == 0) { - WOLFSSL_MSG("Session already exists. Overwriting."); - overwrite = 1; - idx = i; - break; - } - } - else { - if (XMEMCMP(ssl->arrays->sessionID, SessionCache[row].Sessions[i].sessionID, ID_LEN) == 0) { - WOLFSSL_MSG("Session already exists. Overwriting."); - overwrite = 1; - idx = i; - break; - } + if (XMEMCMP(id, SessionCache[row].Sessions[i].sessionID, ID_LEN) == 0) { + WOLFSSL_MSG("Session already exists. Overwriting."); + overwrite = 1; + idx = i; + break; } } @@ -12729,22 +12721,19 @@ int AddSession(WOLFSSL* ssl) session = &SessionCache[row].Sessions[idx]; } - if (!ssl->options.tls1_3) - XMEMCPY(session->masterSecret, ssl->arrays->masterSecret, SECRET_LEN); - else - XMEMCPY(session->masterSecret, ssl->session.masterSecret, SECRET_LEN); - session->haveEMS = ssl->options.haveEMS; -#if defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET) +#ifdef WOLFSSL_TLS13 if (ssl->options.tls1_3) { - XMEMCPY(session->sessionID, ssl->session.sessionID, ID_LEN); + XMEMCPY(session->masterSecret, ssl->session.masterSecret, SECRET_LEN); session->sessionIDSz = ID_LEN; } else #endif { - XMEMCPY(session->sessionID, ssl->arrays->sessionID, ID_LEN); + XMEMCPY(session->masterSecret, ssl->arrays->masterSecret, SECRET_LEN); session->sessionIDSz = ssl->arrays->sessionIDSz; } + XMEMCPY(session->sessionID, id, ID_LEN); + session->haveEMS = ssl->options.haveEMS; #ifdef OPENSSL_EXTRA /* If using compatibility layer then check for and copy over session context @@ -12765,7 +12754,7 @@ int AddSession(WOLFSSL* ssl) if (error == 0) { /* Cleanup cache row's old Dynamic buff if exists */ - if(session->isDynamic) { + if (session->isDynamic) { XFREE(session->ticket, ssl->heap, DYNAMIC_TYPE_SESSION_TICK); session->ticket = NULL; } diff --git a/tests/api.c b/tests/api.c index 96972e6e0..cb3ea04d3 100644 --- a/tests/api.c +++ b/tests/api.c @@ -25449,7 +25449,12 @@ static void test_wolfSSL_SESSION(void) char msg[80]; printf(testingFmt, "wolfSSL_SESSION()"); + /* TLS v1.3 requires session tickets */ +#if defined(WOLFSSL_TLS13) && !defined(HAVE_SESSION_TICKET) && !defined(WOLFSSL_NO_TLS12) + AssertNotNull(ctx = wolfSSL_CTX_new(wolfTLSv1_2_client_method())); +#else AssertNotNull(ctx = wolfSSL_CTX_new(wolfSSLv23_client_method())); +#endif AssertTrue(wolfSSL_CTX_use_certificate_file(ctx, cliCertFile, SSL_FILETYPE_PEM)); AssertTrue(wolfSSL_CTX_use_PrivateKey_file(ctx, cliKeyFile, SSL_FILETYPE_PEM)); From d543e305f1106cfa55241a595d0abfd50a529211 Mon Sep 17 00:00:00 2001 From: Sean Parkinson Date: Mon, 8 Jun 2020 10:48:19 +1000 Subject: [PATCH 191/298] Fix optimized AES-CCM - counter AES-NI optimized 4 block at a time was not incrementing counter poprerly. --- wolfcrypt/src/aes.c | 26 +++++++++----------- wolfcrypt/test/test.c | 57 ++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 67 insertions(+), 16 deletions(-) diff --git a/wolfcrypt/src/aes.c b/wolfcrypt/src/aes.c index 516884670..22f7c0cb0 100644 --- a/wolfcrypt/src/aes.c +++ b/wolfcrypt/src/aes.c @@ -7164,20 +7164,20 @@ static WC_INLINE void AesCcmCtrIncSet4(byte* B, word32 lenSz) XMEMCPY(B + AES_BLOCK_SIZE * 2, B, AES_BLOCK_SIZE * 2); for (i = 0; i < lenSz; i++) { - if (++B[AES_BLOCK_SIZE * 1 - 1 - i] != 0) break; + if (++B[AES_BLOCK_SIZE * 2 - 1 - i] != 0) break; } - B[AES_BLOCK_SIZE * 2 - 1] += 2; - if (B[AES_BLOCK_SIZE * 2 - 1] < 2) { - for (i = 1; i < lenSz; i++) { - if (++B[AES_BLOCK_SIZE * 2 - 1 - i] != 0) break; - } - } - B[AES_BLOCK_SIZE * 3 - 1] += 3; - if (B[AES_BLOCK_SIZE * 3 - 1] < 3) { + B[AES_BLOCK_SIZE * 3 - 1] += 2; + if (B[AES_BLOCK_SIZE * 3 - 1] < 2) { for (i = 1; i < lenSz; i++) { if (++B[AES_BLOCK_SIZE * 3 - 1 - i] != 0) break; } } + B[AES_BLOCK_SIZE * 4 - 1] += 3; + if (B[AES_BLOCK_SIZE * 4 - 1] < 3) { + for (i = 1; i < lenSz; i++) { + if (++B[AES_BLOCK_SIZE * 4 - 1 - i] != 0) break; + } + } } static WC_INLINE void AesCcmCtrInc4(byte* B, word32 lenSz) @@ -7264,9 +7264,7 @@ int wc_AesCcmEncrypt(Aes* aes, byte* out, const byte* in, word32 inSz, in += AES_BLOCK_SIZE * 4; out += AES_BLOCK_SIZE * 4; - if (inSz < AES_BLOCK_SIZE * 4) { - AesCcmCtrInc4(B, lenSz); - } + AesCcmCtrInc4(B, lenSz); } } #endif @@ -7348,9 +7346,7 @@ int wc_AesCcmDecrypt(Aes* aes, byte* out, const byte* in, word32 inSz, in += AES_BLOCK_SIZE * 4; o += AES_BLOCK_SIZE * 4; - if (oSz < AES_BLOCK_SIZE * 4) { - AesCcmCtrInc4(B, lenSz); - } + AesCcmCtrInc4(B, lenSz); } } #endif diff --git a/wolfcrypt/test/test.c b/wolfcrypt/test/test.c index 4e4bbbe48..bee2a809f 100644 --- a/wolfcrypt/test/test.c +++ b/wolfcrypt/test/test.c @@ -9089,28 +9089,66 @@ int aesccm_test(void) 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e }; + /* plaintext - long */ + const byte pl[] = + { + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, + 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, + 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, + 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, + 0x50 + }; + const byte a[] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 }; + /* ciphertext */ const byte c[] = { 0x58, 0x8c, 0x97, 0x9a, 0x61, 0xc6, 0x63, 0xd2, 0xf0, 0x66, 0xd0, 0xc2, 0xc0, 0xf9, 0x89, 0x80, 0x6d, 0x5f, 0x6b, 0x61, 0xda, 0xc3, 0x84 }; - + /* tag - authentication */ const byte t[] = { 0x17, 0xe8, 0xd1, 0x2c, 0xfd, 0xf9, 0x26, 0xe0 }; + /* ciphertext - long */ + const byte cl[] = + { + 0x58, 0x8c, 0x97, 0x9a, 0x61, 0xc6, 0x63, 0xd2, + 0xf0, 0x66, 0xd0, 0xc2, 0xc0, 0xf9, 0x89, 0x80, + 0x6d, 0x5f, 0x6b, 0x61, 0xda, 0xc3, 0x84, 0xe0, + 0x44, 0x2d, 0xbe, 0x25, 0xfa, 0x48, 0x2b, 0xa8, + 0x36, 0x0b, 0xbf, 0x01, 0xc0, 0x12, 0x45, 0xa4, + 0x82, 0x9f, 0x20, 0x6c, 0xc3, 0xd6, 0xae, 0x5b, + 0x54, 0x8d, 0xd0, 0xb1, 0x69, 0x2c, 0xec, 0x5e, + 0x95, 0xa5, 0x6b, 0x48, 0xc3, 0xc6, 0xc8, 0x9e, + 0xc7, 0x92, 0x98, 0x9d, 0x26, 0x7d, 0x2a, 0x10, + 0x0b + }; + /* tag - authentication - long */ + const byte tl[] = + { + 0x89, 0xd8, 0xd2, 0x02, 0xc5, 0xcf, 0xae, 0xf4 + }; byte t2[sizeof(t)]; byte p2[sizeof(p)]; byte c2[sizeof(c)]; byte iv2[sizeof(iv)]; + byte pl2[sizeof(pl)]; + byte cl2[sizeof(cl)]; + byte tl2[sizeof(tl)]; int result; @@ -9192,6 +9230,23 @@ int aesccm_test(void) } #endif + /* AES-CCM encrypt and decrypt both use AES encrypt internally */ + result = wc_AesCcmEncrypt(&enc, cl2, pl, sizeof(cl2), iv, sizeof(iv), + tl2, sizeof(tl2), a, sizeof(a)); + if (result != 0) + return -6301; + if (XMEMCMP(cl, cl2, sizeof(cl2))) + return -6302; + if (XMEMCMP(tl, tl2, sizeof(tl2))) + return -6303; + + result = wc_AesCcmDecrypt(&enc, pl2, cl2, sizeof(pl2), iv, sizeof(iv), + tl2, sizeof(tl2), a, sizeof(a)); + if (result != 0) + return -6304; + if (XMEMCMP(pl, pl2, sizeof(pl2))) + return -6305; + return 0; } #endif /* HAVE_AESCCM WOLFSSL_AES_128 */ From b883617c0d8160529f82d31d3aac489f7b65087b Mon Sep 17 00:00:00 2001 From: Tak Date: Mon, 8 Jun 2020 14:10:20 +0900 Subject: [PATCH 192/298] Moved wolfSSL_ASN1_TIME_new() to under #ifndef NO_ASN_TIME condition --- src/ssl.c | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/src/ssl.c b/src/ssl.c index 62b7b0414..61450e4e2 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -46281,22 +46281,7 @@ err_exit: } #if !defined(NO_ASN_TIME) && !defined(USER_TIME) && !defined(TIME_OVERRIDES) -WOLFSSL_ASN1_TIME* wolfSSL_ASN1_TIME_new(void) -{ - WOLFSSL_ASN1_TIME* ret = (WOLFSSL_ASN1_TIME*) - XMALLOC(sizeof(WOLFSSL_ASN1_TIME), NULL, DYNAMIC_TYPE_OPENSSL); - if (!ret) - return NULL; - XMEMSET(ret, 0, sizeof(WOLFSSL_ASN1_TIME)); - return ret; -} -void wolfSSL_ASN1_TIME_free(WOLFSSL_ASN1_TIME* t) -{ - if (t) { - XFREE(t, NULL, DYNAMIC_TYPE_OPENSSL); - } -} WOLFSSL_ASN1_TIME* wolfSSL_ASN1_TIME_adj(WOLFSSL_ASN1_TIME *s, time_t t, int offset_day, long offset_sec) @@ -46382,6 +46367,23 @@ WOLFSSL_ASN1_TIME* wolfSSL_ASN1_TIME_adj(WOLFSSL_ASN1_TIME *s, time_t t, #endif /* !NO_ASN_TIME && !USER_TIME && !TIME_OVERRIDES */ #ifndef NO_ASN_TIME + +WOLFSSL_ASN1_TIME* wolfSSL_ASN1_TIME_new(void) +{ + WOLFSSL_ASN1_TIME* ret = (WOLFSSL_ASN1_TIME*) + XMALLOC(sizeof(WOLFSSL_ASN1_TIME), NULL, DYNAMIC_TYPE_OPENSSL); + if (!ret) + return NULL; + XMEMSET(ret, 0, sizeof(WOLFSSL_ASN1_TIME)); + return ret; +} + +void wolfSSL_ASN1_TIME_free(WOLFSSL_ASN1_TIME* t) +{ + if (t) { + XFREE(t, NULL, DYNAMIC_TYPE_OPENSSL); + } +} /* not a compatibility function - length getter for opaque type */ int wolfSSL_ASN1_TIME_get_length(WOLFSSL_ASN1_TIME *t) { From 8791573dfebfad2446d4087a87318c75c771eba8 Mon Sep 17 00:00:00 2001 From: David Garske Date: Fri, 22 May 2020 08:24:57 -0700 Subject: [PATCH 193/298] Fix for building with `NO_PUBLIC_GCM_SET_IV` when ChaCha20/Poly1305 is enabled. Cleanup use of not used `STD_PERI_LIB`. --- src/internal.c | 8 +++---- wolfcrypt/src/aes.c | 35 +++++++++++-------------------- wolfcrypt/src/port/st/stm32.c | 2 +- wolfssl/wolfcrypt/port/st/stm32.h | 2 +- 4 files changed, 18 insertions(+), 29 deletions(-) diff --git a/src/internal.c b/src/internal.c index 7906c4c77..6286fd3bd 100644 --- a/src/internal.c +++ b/src/internal.c @@ -13103,10 +13103,10 @@ static int DoDtlsHandShakeMsg(WOLFSSL* ssl, byte* input, word32* inOutIdx, #ifdef HAVE_AEAD -#if !defined(NO_PUBLIC_GCM_SET_IV) && \ - (((defined(HAVE_FIPS) || defined(HAVE_SELFTEST)) && \ - (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2))) || \ - (defined(HAVE_POLY1305) && defined(HAVE_CHACHA))) +#if (!defined(NO_PUBLIC_GCM_SET_IV) && \ + ((defined(HAVE_FIPS) || defined(HAVE_SELFTEST)) && \ + (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)))) || \ + (defined(HAVE_POLY1305) && defined(HAVE_CHACHA)) static WC_INLINE void AeadIncrementExpIV(WOLFSSL* ssl) { int i; diff --git a/wolfcrypt/src/aes.c b/wolfcrypt/src/aes.c index 516884670..504aa6559 100644 --- a/wolfcrypt/src/aes.c +++ b/wolfcrypt/src/aes.c @@ -331,7 +331,7 @@ } HAL_CRYP_DeInit(&hcryp); - #else /* STD_PERI_LIB */ + #else /* Standard Peripheral Library */ ret = wc_Stm32_Aes_Init(aes, &cryptInit, &keyInit); if (ret != 0) return ret; @@ -415,7 +415,7 @@ } HAL_CRYP_DeInit(&hcryp); - #else /* STD_PERI_LIB */ + #else /* Standard Peripheral Library */ ret = wc_Stm32_Aes_Init(aes, &cryptInit, &keyInit); if (ret != 0) return ret; @@ -3065,7 +3065,7 @@ int wc_AesSetIV(Aes* aes, const byte* iv) } #endif /* HAVE_AES_DECRYPT */ -#else /* STD_PERI_LIB */ +#else /* Standard Peripheral Library */ int wc_AesCbcEncrypt(Aes* aes, byte* out, const byte* in, word32 sz) { int ret; @@ -3781,7 +3781,7 @@ int wc_AesSetIV(Aes* aes, const byte* iv) } HAL_CRYP_DeInit(&hcryp); - #else /* STD_PERI_LIB */ + #else /* Standard Peripheral Library */ ret = wc_Stm32_Aes_Init(aes, &cryptInit, &keyInit); if (ret != 0) { wolfSSL_CryptHwMutexUnLock(); @@ -6065,7 +6065,7 @@ static int wc_AesGcmEncrypt_STM32(Aes* aes, byte* out, const byte* in, word32 sz ret = AES_GCM_AUTH_E; HAL_CRYP_DeInit(&hcryp); -#else /* STD_PERI_LIB */ +#else /* Standard Peripheral Library */ ByteReverseWords(keyCopy, (word32*)aes->key, keySize); status = CRYP_AES_GCM(MODE_ENCRYPT, (uint8_t*)ctr, (uint8_t*)keyCopy, keySize * 8, @@ -6277,15 +6277,9 @@ int wc_AesGcmEncrypt(Aes* aes, byte* out, const byte* in, word32 sz, #endif /* WOLFSSL_ASYNC_CRYPT */ #ifdef STM32_CRYPTO_AES_GCM - /* The STM standard peripheral library API's doesn't support partial blocks */ - #ifdef STD_PERI_LIB - if (partial == 0) - #endif - { - return wc_AesGcmEncrypt_STM32( - aes, out, in, sz, iv, ivSz, - authTag, authTagSz, authIn, authInSz); - } + return wc_AesGcmEncrypt_STM32( + aes, out, in, sz, iv, ivSz, + authTag, authTagSz, authIn, authInSz); #endif /* STM32_CRYPTO_AES_GCM */ #ifdef WOLFSSL_AESNI @@ -6507,7 +6501,7 @@ static int wc_AesGcmDecrypt_STM32(Aes* aes, byte* out, HAL_CRYP_DeInit(&hcryp); -#else /* STD_PERI_LIB */ +#else /* Standard Peripheral Library */ ByteReverseWords(keyCopy, (word32*)aes->key, aes->keylen); /* Input size and auth size need to be the actual sizes, even though @@ -6732,14 +6726,9 @@ int wc_AesGcmDecrypt(Aes* aes, byte* out, const byte* in, word32 sz, #ifdef STM32_CRYPTO_AES_GCM /* The STM standard peripheral library API's doesn't support partial blocks */ - #ifdef STD_PERI_LIB - if (partial == 0) - #endif - { - return wc_AesGcmDecrypt_STM32( - aes, out, in, sz, iv, ivSz, - authTag, authTagSz, authIn, authInSz); - } + return wc_AesGcmDecrypt_STM32( + aes, out, in, sz, iv, ivSz, + authTag, authTagSz, authIn, authInSz); #endif /* STM32_CRYPTO_AES_GCM */ #ifdef WOLFSSL_AESNI diff --git a/wolfcrypt/src/port/st/stm32.c b/wolfcrypt/src/port/st/stm32.c index b37dbd845..bb20a14d7 100644 --- a/wolfcrypt/src/port/st/stm32.c +++ b/wolfcrypt/src/port/st/stm32.c @@ -299,7 +299,7 @@ int wc_Stm32_Aes_Init(Aes* aes, CRYP_HandleTypeDef* hcryp) return 0; } -#else /* STD_PERI_LIB */ +#else /* Standard Peripheral Library */ int wc_Stm32_Aes_Init(Aes* aes, CRYP_InitTypeDef* cryptInit, CRYP_KeyInitTypeDef* keyInit) diff --git a/wolfssl/wolfcrypt/port/st/stm32.h b/wolfssl/wolfcrypt/port/st/stm32.h index 4b461a113..0e9010756 100644 --- a/wolfssl/wolfcrypt/port/st/stm32.h +++ b/wolfssl/wolfcrypt/port/st/stm32.h @@ -122,7 +122,7 @@ int wc_Stm32_Hash_Final(STM32_HASH_Context* stmCtx, word32 algo, struct Aes; #ifdef WOLFSSL_STM32_CUBEMX int wc_Stm32_Aes_Init(struct Aes* aes, CRYP_HandleTypeDef* hcryp); - #else /* STD_PERI_LIB */ + #else /* Standard Peripheral Library */ int wc_Stm32_Aes_Init(struct Aes* aes, CRYP_InitTypeDef* cryptInit, CRYP_KeyInitTypeDef* keyInit); #endif /* WOLFSSL_STM32_CUBEMX */ From 42ee313286fdc42f486a91c19702761ae7045d77 Mon Sep 17 00:00:00 2001 From: David Garske Date: Fri, 22 May 2020 09:45:58 -0700 Subject: [PATCH 194/298] Fix for using `WOLFSSL_SMALL_STACK_CACHE` with STM32 SHA256 hardware acceleration. --- wolfssl/wolfcrypt/sha256.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wolfssl/wolfcrypt/sha256.h b/wolfssl/wolfcrypt/sha256.h index 798f309d1..7dda9add4 100644 --- a/wolfssl/wolfcrypt/sha256.h +++ b/wolfssl/wolfcrypt/sha256.h @@ -142,6 +142,7 @@ struct wc_Sha256 { word32 loLen; /* length in bytes */ word32 hiLen; /* length in bytes */ void* heap; +#endif #ifdef WOLFSSL_PIC32MZ_HASH hashUpdCache cache; /* cache for updates */ #endif @@ -150,7 +151,7 @@ struct wc_Sha256 { #endif /* WOLFSSL_ASYNC_CRYPT */ #ifdef WOLFSSL_SMALL_STACK_CACHE word32* W; -#endif +#endif /* !FREESCALE_LTC_SHA && !STM32_HASH_SHA2 */ #ifdef WOLFSSL_DEVCRYPTO_HASH WC_CRYPTODEV ctx; byte* msg; @@ -168,7 +169,6 @@ struct wc_Sha256 { int devId; void* devCtx; /* generic crypto callback context */ #endif -#endif #if defined(WOLFSSL_HASH_FLAGS) || defined(WOLF_CRYPTO_CB) word32 flags; /* enum wc_HashFlags in hash.h */ #endif From dff7c0fcfa430662caed15ed32f66e57a2c81f71 Mon Sep 17 00:00:00 2001 From: David Garske Date: Fri, 22 May 2020 10:04:58 -0700 Subject: [PATCH 195/298] Fix for hardware mutex protection in case where STM32 hardware acceleration is used for RNG or HASH only. --- wolfssl/wolfcrypt/wc_port.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wolfssl/wolfcrypt/wc_port.h b/wolfssl/wolfcrypt/wc_port.h index bfc514263..d3deb59db 100644 --- a/wolfssl/wolfcrypt/wc_port.h +++ b/wolfssl/wolfcrypt/wc_port.h @@ -245,7 +245,7 @@ /* Enable crypt HW mutex for Freescale MMCAU, PIC32MZ or STM32 */ #if defined(FREESCALE_MMCAU) || defined(WOLFSSL_MICROCHIP_PIC32MZ) || \ - defined(STM32_CRYPTO) + defined(STM32_CRYPTO) || defined(STM32_HASH) || defined(STM32_RNG) #ifndef WOLFSSL_CRYPT_HW_MUTEX #define WOLFSSL_CRYPT_HW_MUTEX 1 #endif From efe9da0994eb843c7d06055d4dd79b8624b0dff8 Mon Sep 17 00:00:00 2001 From: David Garske Date: Thu, 28 May 2020 07:57:56 -0700 Subject: [PATCH 196/298] Fix for STM32 crypto hash with `WOLFSSL_SMALL_STACK_CACHE` possible free of invalid pointer. --- wolfcrypt/src/sha256.c | 1 + 1 file changed, 1 insertion(+) diff --git a/wolfcrypt/src/sha256.c b/wolfcrypt/src/sha256.c index eb0911b01..9ff35a90e 100644 --- a/wolfcrypt/src/sha256.c +++ b/wolfcrypt/src/sha256.c @@ -494,6 +494,7 @@ static int InitSha256(wc_Sha256* sha256) (void)devId; (void)heap; + XMEMSET(sha256, 0, sizeof(wc_Sha256)); wc_Stm32_Hash_Init(&sha256->stmCtx); return 0; } From 6f82f15d1be66cce19d1aadf3601e66d077f3baa Mon Sep 17 00:00:00 2001 From: David Garske Date: Tue, 2 Jun 2020 10:44:17 -0700 Subject: [PATCH 197/298] Performance improvements for STM32 AES CBC and GCM crypto hardware. * AES CBC: - Do all blocks, not just one at a time. * AES GCM: - Use local stack for authentication header if < block size. - Use hardware GHASH for all authentication header sizes. Tested with STM32F437II (old/new Cube HAL/StdPeriLib), STM32F777ZI (CubeMX) and STM32L4A6ZG (CubeMX). --- wolfcrypt/src/aes.c | 139 ++++++++++++++++++++++---------------------- 1 file changed, 71 insertions(+), 68 deletions(-) diff --git a/wolfcrypt/src/aes.c b/wolfcrypt/src/aes.c index 504aa6559..58d382ee8 100644 --- a/wolfcrypt/src/aes.c +++ b/wolfcrypt/src/aes.c @@ -2974,29 +2974,22 @@ int wc_AesSetIV(Aes* aes, const byte* iv) hcryp.Init.pInitVect = (STM_CRYPT_TYPE*)aes->reg; HAL_CRYP_Init(&hcryp); - while (blocks--) { - #ifdef STM32_CRYPTO_AES_ONLY - ret = HAL_CRYPEx_AES(&hcryp, (uint8_t*)in, AES_BLOCK_SIZE, - out, STM32_HAL_TIMEOUT); - #elif defined(STM32_HAL_V2) - ret = HAL_CRYP_Encrypt(&hcryp, (uint32_t*)in, AES_BLOCK_SIZE, - (uint32_t*)out, STM32_HAL_TIMEOUT); - #else - ret = HAL_CRYP_AESCBC_Encrypt(&hcryp, (uint8_t*)in, AES_BLOCK_SIZE, - out, STM32_HAL_TIMEOUT); - #endif - if (ret != HAL_OK) { - ret = WC_TIMEOUT_E; - break; - } + #ifdef STM32_CRYPTO_AES_ONLY + ret = HAL_CRYPEx_AES(&hcryp, (uint8_t*)in, blocks * AES_BLOCK_SIZE, + out, STM32_HAL_TIMEOUT); + #elif defined(STM32_HAL_V2) + ret = HAL_CRYP_Encrypt(&hcryp, (uint32_t*)in, blocks * AES_BLOCK_SIZE, + (uint32_t*)out, STM32_HAL_TIMEOUT); + #else + ret = HAL_CRYP_AESCBC_Encrypt(&hcryp, (uint8_t*)in, blocks * AES_BLOCK_SIZE, + out, STM32_HAL_TIMEOUT); + #endif + if (ret != HAL_OK) { + ret = WC_TIMEOUT_E; + } - /* store iv for next call */ - XMEMCPY(aes->reg, out + sz - AES_BLOCK_SIZE, AES_BLOCK_SIZE); - - sz -= AES_BLOCK_SIZE; - in += AES_BLOCK_SIZE; - out += AES_BLOCK_SIZE; - } + /* store iv for next call */ + XMEMCPY(aes->reg, out + sz - AES_BLOCK_SIZE, AES_BLOCK_SIZE); HAL_CRYP_DeInit(&hcryp); @@ -3035,28 +3028,22 @@ int wc_AesSetIV(Aes* aes, const byte* iv) hcryp.Init.pInitVect = (STM_CRYPT_TYPE*)aes->reg; HAL_CRYP_Init(&hcryp); - while (blocks--) { - #ifdef STM32_CRYPTO_AES_ONLY - ret = HAL_CRYPEx_AES(&hcryp, (uint8_t*)in, AES_BLOCK_SIZE, - out, STM32_HAL_TIMEOUT); - #elif defined(STM32_HAL_V2) - ret = HAL_CRYP_Decrypt(&hcryp, (uint32_t*)in, AES_BLOCK_SIZE, - (uint32_t*)out, STM32_HAL_TIMEOUT); - #else - ret = HAL_CRYP_AESCBC_Decrypt(&hcryp, (uint8_t*)in, AES_BLOCK_SIZE, - out, STM32_HAL_TIMEOUT); - #endif - if (ret != HAL_OK) { - ret = WC_TIMEOUT_E; - break; - } + #ifdef STM32_CRYPTO_AES_ONLY + ret = HAL_CRYPEx_AES(&hcryp, (uint8_t*)in, blocks * AES_BLOCK_SIZE, + out, STM32_HAL_TIMEOUT); + #elif defined(STM32_HAL_V2) + ret = HAL_CRYP_Decrypt(&hcryp, (uint32_t*)in, blocks * AES_BLOCK_SIZE, + (uint32_t*)out, STM32_HAL_TIMEOUT); + #else + ret = HAL_CRYP_AESCBC_Decrypt(&hcryp, (uint8_t*)in, blocks * AES_BLOCK_SIZE, + out, STM32_HAL_TIMEOUT); + #endif + if (ret != HAL_OK) { + ret = WC_TIMEOUT_E; + } - /* store iv for next call */ - XMEMCPY(aes->reg, aes->tmp, AES_BLOCK_SIZE); - - in += AES_BLOCK_SIZE; - out += AES_BLOCK_SIZE; - } + /* store iv for next call */ + XMEMCPY(aes->reg, aes->tmp, AES_BLOCK_SIZE); HAL_CRYP_DeInit(&hcryp); wolfSSL_CryptHwMutexUnLock(); @@ -5937,8 +5924,9 @@ static int wc_AesGcmEncrypt_STM32(Aes* aes, byte* out, const byte* in, word32 sz word32 partial = sz % AES_BLOCK_SIZE; word32 tag[AES_BLOCK_SIZE/sizeof(word32)]; word32 ctr[AES_BLOCK_SIZE/sizeof(word32)]; + word32 authhdr[AES_BLOCK_SIZE/sizeof(word32)]; byte* authInPadded = NULL; - int authPadSz; + int authPadSz, wasAlloc = 0; ret = wc_AesGetKeySize(aes, &keySize); if (ret != 0) @@ -5969,13 +5957,19 @@ static int wc_AesGcmEncrypt_STM32(Aes* aes, byte* out, const byte* in, word32 sz /* Authentication buffer - must be 4-byte multiple zero padded */ authPadSz = authInSz % sizeof(word32); - if (authInSz == 0 || authPadSz != 0) { + if (authPadSz != 0) { authPadSz = authInSz + sizeof(word32) - authPadSz; - authInPadded = (byte*)XMALLOC(authPadSz, aes->heap, - DYNAMIC_TYPE_TMP_BUFFER); - if (authInPadded == NULL) { - wolfSSL_CryptHwMutexUnLock(); - return MEMORY_E; + if (authPadSz <= sizeof(authhdr)) { + authInPadded = (byte*)authhdr; + } + else { + authInPadded = (byte*)XMALLOC(authPadSz, aes->heap, + DYNAMIC_TYPE_TMP_BUFFER); + if (authInPadded == NULL) { + wolfSSL_CryptHwMutexUnLock(); + return MEMORY_E; + } + wasAlloc = 1; } XMEMSET(authInPadded, 0, authPadSz); XMEMCPY(authInPadded, authIn, authInSz); @@ -5991,6 +5985,8 @@ static int wc_AesGcmEncrypt_STM32(Aes* aes, byte* out, const byte* in, word32 sz #ifdef STM32_CRYPTO_AES_ONLY /* Set the CRYP parameters */ hcryp.Init.HeaderSize = authPadSz; + if (authPadSz == 0) + hcryp.Init.Header = NULL; /* cannot pass pointer here when authIn == 0 */ hcryp.Init.ChainingMode = CRYP_CHAINMODE_AES_GCM_GMAC; hcryp.Init.OperatingMode = CRYP_ALGOMODE_ENCRYPT; hcryp.Init.GCMCMACPhase = CRYP_INIT_PHASE; @@ -6079,9 +6075,8 @@ static int wc_AesGcmEncrypt_STM32(Aes* aes, byte* out, const byte* in, word32 sz if (ret == 0) { /* return authTag */ if (authTag) { - /* For STM32 GCM fallback to software if partial AES block or - * IV != 12 or when auth data is not 4 byte aligned */ - if (sz == 0 || partial != 0 || ivSz != GCM_NONCE_MID_SZ || authInPadded != authIn) { + /* For STM32 GCM fallback to software if partial AES block or IV != 12 */ + if (sz == 0 || partial != 0 || ivSz != GCM_NONCE_MID_SZ) { DecrementGcmCounter((byte*)ctr); /* hardware requires +1, so subtract it */ GHASH(aes, authIn, authInSz, out, sz, authTag, authTagSz); wc_AesEncrypt(aes, (byte*)ctr, (byte*)tag); @@ -6093,8 +6088,8 @@ static int wc_AesGcmEncrypt_STM32(Aes* aes, byte* out, const byte* in, word32 sz } } - /* Free memory if not a multiple of AES_BLOCK_SZ */ - if (authInPadded != authIn) { + /* Free memory */ + if (wasAlloc) { XFREE(authInPadded, aes->heap, DYNAMIC_TYPE_TMP_BUFFER); } @@ -6372,8 +6367,9 @@ static int wc_AesGcmDecrypt_STM32(Aes* aes, byte* out, word32 tag[AES_BLOCK_SIZE/sizeof(word32)]; word32 partialBlock[AES_BLOCK_SIZE/sizeof(word32)]; word32 ctr[AES_BLOCK_SIZE/sizeof(word32)]; + word32 authhdr[AES_BLOCK_SIZE/sizeof(word32)]; byte* authInPadded = NULL; - int authPadSz; + int authPadSz, wasAlloc = 0; ret = wc_AesGetKeySize(aes, &keySize); if (ret != 0) @@ -6404,14 +6400,20 @@ static int wc_AesGcmDecrypt_STM32(Aes* aes, byte* out, /* Authentication buffer - must be 4-byte multiple zero padded */ authPadSz = authInSz % sizeof(word32); - if (authInSz == 0 || authPadSz != 0) { + if (authPadSz != 0) { authPadSz = authInSz + sizeof(word32) - authPadSz; - authInPadded = (byte*)XMALLOC(authPadSz, aes->heap, - DYNAMIC_TYPE_TMP_BUFFER); - if (authInPadded == NULL) { - wolfSSL_CryptHwMutexUnLock(); - return MEMORY_E; - } + if (authPadSz <= sizeof(authhdr)) { + authInPadded = (byte*)authhdr; + } + else { + authInPadded = (byte*)XMALLOC(authPadSz, aes->heap, + DYNAMIC_TYPE_TMP_BUFFER); + if (authInPadded == NULL) { + wolfSSL_CryptHwMutexUnLock(); + return MEMORY_E; + } + wasAlloc = 1; + } XMEMSET(authInPadded, 0, authPadSz); XMEMCPY(authInPadded, authIn, authInSz); } else { @@ -6426,6 +6428,8 @@ static int wc_AesGcmDecrypt_STM32(Aes* aes, byte* out, #ifdef STM32_CRYPTO_AES_ONLY /* Set the CRYP parameters */ hcryp.Init.HeaderSize = authPadSz; + if (authPadSz == 0) + hcryp.Init.Header = NULL; /* cannot pass pointer when authIn == 0 */ hcryp.Init.ChainingMode = CRYP_CHAINMODE_AES_GCM_GMAC; hcryp.Init.OperatingMode = CRYP_ALGOMODE_DECRYPT; hcryp.Init.GCMCMACPhase = CRYP_INIT_PHASE; @@ -6516,9 +6520,8 @@ static int wc_AesGcmDecrypt_STM32(Aes* aes, byte* out, ret = AES_GCM_AUTH_E; #endif /* WOLFSSL_STM32_CUBEMX */ - /* For STM32 GCM fallback to software if partial AES block or - * IV != 12 or when auth data is not 4 byte aligned */ - if (sz == 0 || partial != 0 || ivSz != GCM_NONCE_MID_SZ || authInPadded != authIn) { + /* For STM32 GCM fallback to software if partial AES block or IV != 12 */ + if (sz == 0 || partial != 0 || ivSz != GCM_NONCE_MID_SZ) { DecrementGcmCounter((byte*)ctr); /* hardware requires +1, so subtract it */ GHASH(aes, authIn, authInSz, in, sz, (byte*)tag, sizeof(tag)); wc_AesEncrypt(aes, (byte*)ctr, (byte*)partialBlock); @@ -6530,8 +6533,8 @@ static int wc_AesGcmDecrypt_STM32(Aes* aes, byte* out, ret = AES_GCM_AUTH_E; } - /* Free memory if not a multiple of AES_BLOCK_SZ */ - if (authInPadded != authIn) { + /* Free memory */ + if (wasAlloc) { XFREE(authInPadded, aes->heap, DYNAMIC_TYPE_TMP_BUFFER); } From 21a34bde8c857896542eb76788fc05d6d8d6f8a4 Mon Sep 17 00:00:00 2001 From: David Garske Date: Tue, 2 Jun 2020 11:44:01 -0700 Subject: [PATCH 198/298] Fix whitespace. --- wolfcrypt/src/aes.c | 98 ++++++++++++++++++++++----------------------- 1 file changed, 49 insertions(+), 49 deletions(-) diff --git a/wolfcrypt/src/aes.c b/wolfcrypt/src/aes.c index 58d382ee8..88413eaa1 100644 --- a/wolfcrypt/src/aes.c +++ b/wolfcrypt/src/aes.c @@ -2974,22 +2974,22 @@ int wc_AesSetIV(Aes* aes, const byte* iv) hcryp.Init.pInitVect = (STM_CRYPT_TYPE*)aes->reg; HAL_CRYP_Init(&hcryp); - #ifdef STM32_CRYPTO_AES_ONLY - ret = HAL_CRYPEx_AES(&hcryp, (uint8_t*)in, blocks * AES_BLOCK_SIZE, - out, STM32_HAL_TIMEOUT); - #elif defined(STM32_HAL_V2) - ret = HAL_CRYP_Encrypt(&hcryp, (uint32_t*)in, blocks * AES_BLOCK_SIZE, - (uint32_t*)out, STM32_HAL_TIMEOUT); - #else - ret = HAL_CRYP_AESCBC_Encrypt(&hcryp, (uint8_t*)in, blocks * AES_BLOCK_SIZE, - out, STM32_HAL_TIMEOUT); - #endif - if (ret != HAL_OK) { - ret = WC_TIMEOUT_E; - } + #ifdef STM32_CRYPTO_AES_ONLY + ret = HAL_CRYPEx_AES(&hcryp, (uint8_t*)in, blocks * AES_BLOCK_SIZE, + out, STM32_HAL_TIMEOUT); + #elif defined(STM32_HAL_V2) + ret = HAL_CRYP_Encrypt(&hcryp, (uint32_t*)in, blocks * AES_BLOCK_SIZE, + (uint32_t*)out, STM32_HAL_TIMEOUT); + #else + ret = HAL_CRYP_AESCBC_Encrypt(&hcryp, (uint8_t*)in, blocks * AES_BLOCK_SIZE, + out, STM32_HAL_TIMEOUT); + #endif + if (ret != HAL_OK) { + ret = WC_TIMEOUT_E; + } - /* store iv for next call */ - XMEMCPY(aes->reg, out + sz - AES_BLOCK_SIZE, AES_BLOCK_SIZE); + /* store iv for next call */ + XMEMCPY(aes->reg, out + sz - AES_BLOCK_SIZE, AES_BLOCK_SIZE); HAL_CRYP_DeInit(&hcryp); @@ -3028,19 +3028,19 @@ int wc_AesSetIV(Aes* aes, const byte* iv) hcryp.Init.pInitVect = (STM_CRYPT_TYPE*)aes->reg; HAL_CRYP_Init(&hcryp); - #ifdef STM32_CRYPTO_AES_ONLY - ret = HAL_CRYPEx_AES(&hcryp, (uint8_t*)in, blocks * AES_BLOCK_SIZE, - out, STM32_HAL_TIMEOUT); - #elif defined(STM32_HAL_V2) - ret = HAL_CRYP_Decrypt(&hcryp, (uint32_t*)in, blocks * AES_BLOCK_SIZE, - (uint32_t*)out, STM32_HAL_TIMEOUT); - #else - ret = HAL_CRYP_AESCBC_Decrypt(&hcryp, (uint8_t*)in, blocks * AES_BLOCK_SIZE, - out, STM32_HAL_TIMEOUT); - #endif - if (ret != HAL_OK) { - ret = WC_TIMEOUT_E; - } + #ifdef STM32_CRYPTO_AES_ONLY + ret = HAL_CRYPEx_AES(&hcryp, (uint8_t*)in, blocks * AES_BLOCK_SIZE, + out, STM32_HAL_TIMEOUT); + #elif defined(STM32_HAL_V2) + ret = HAL_CRYP_Decrypt(&hcryp, (uint32_t*)in, blocks * AES_BLOCK_SIZE, + (uint32_t*)out, STM32_HAL_TIMEOUT); + #else + ret = HAL_CRYP_AESCBC_Decrypt(&hcryp, (uint8_t*)in, blocks * AES_BLOCK_SIZE, + out, STM32_HAL_TIMEOUT); + #endif + if (ret != HAL_OK) { + ret = WC_TIMEOUT_E; + } /* store iv for next call */ XMEMCPY(aes->reg, aes->tmp, AES_BLOCK_SIZE); @@ -5960,16 +5960,16 @@ static int wc_AesGcmEncrypt_STM32(Aes* aes, byte* out, const byte* in, word32 sz if (authPadSz != 0) { authPadSz = authInSz + sizeof(word32) - authPadSz; if (authPadSz <= sizeof(authhdr)) { - authInPadded = (byte*)authhdr; + authInPadded = (byte*)authhdr; } else { - authInPadded = (byte*)XMALLOC(authPadSz, aes->heap, - DYNAMIC_TYPE_TMP_BUFFER); - if (authInPadded == NULL) { - wolfSSL_CryptHwMutexUnLock(); - return MEMORY_E; - } - wasAlloc = 1; + authInPadded = (byte*)XMALLOC(authPadSz, aes->heap, + DYNAMIC_TYPE_TMP_BUFFER); + if (authInPadded == NULL) { + wolfSSL_CryptHwMutexUnLock(); + return MEMORY_E; + } + wasAlloc = 1; } XMEMSET(authInPadded, 0, authPadSz); XMEMCPY(authInPadded, authIn, authInSz); @@ -6012,7 +6012,7 @@ static int wc_AesGcmEncrypt_STM32(Aes* aes, byte* out, const byte* in, word32 sz XMEMSET(partialBlock, 0, sizeof(partialBlock)); XMEMCPY(partialBlock, in + (blocks * AES_BLOCK_SIZE), partial); status = HAL_CRYPEx_AES_Auth(&hcryp, (uint8_t*)partialBlock, partial, - (uint8_t*)partialBlock, STM32_HAL_TIMEOUT); + (uint8_t*)partialBlock, STM32_HAL_TIMEOUT); XMEMCPY(out + (blocks * AES_BLOCK_SIZE), partialBlock, partial); } if (status == HAL_OK) { @@ -6403,17 +6403,17 @@ static int wc_AesGcmDecrypt_STM32(Aes* aes, byte* out, if (authPadSz != 0) { authPadSz = authInSz + sizeof(word32) - authPadSz; if (authPadSz <= sizeof(authhdr)) { - authInPadded = (byte*)authhdr; - } - else { - authInPadded = (byte*)XMALLOC(authPadSz, aes->heap, - DYNAMIC_TYPE_TMP_BUFFER); - if (authInPadded == NULL) { - wolfSSL_CryptHwMutexUnLock(); - return MEMORY_E; - } - wasAlloc = 1; - } + authInPadded = (byte*)authhdr; + } + else { + authInPadded = (byte*)XMALLOC(authPadSz, aes->heap, + DYNAMIC_TYPE_TMP_BUFFER); + if (authInPadded == NULL) { + wolfSSL_CryptHwMutexUnLock(); + return MEMORY_E; + } + wasAlloc = 1; + } XMEMSET(authInPadded, 0, authPadSz); XMEMCPY(authInPadded, authIn, authInSz); } else { @@ -6429,7 +6429,7 @@ static int wc_AesGcmDecrypt_STM32(Aes* aes, byte* out, /* Set the CRYP parameters */ hcryp.Init.HeaderSize = authPadSz; if (authPadSz == 0) - hcryp.Init.Header = NULL; /* cannot pass pointer when authIn == 0 */ + hcryp.Init.Header = NULL; /* cannot pass pointer when authIn == 0 */ hcryp.Init.ChainingMode = CRYP_CHAINMODE_AES_GCM_GMAC; hcryp.Init.OperatingMode = CRYP_ALGOMODE_DECRYPT; hcryp.Init.GCMCMACPhase = CRYP_INIT_PHASE; From 16c0160e63a9b96ee85d5b7d91280b33fee94d64 Mon Sep 17 00:00:00 2001 From: David Garske Date: Wed, 3 Jun 2020 10:41:59 -0700 Subject: [PATCH 199/298] Added support for STM32L5. --- wolfssl/wolfcrypt/port/st/stm32.h | 16 ++++++++++++---- wolfssl/wolfcrypt/settings.h | 18 ++++++++++++++---- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/wolfssl/wolfcrypt/port/st/stm32.h b/wolfssl/wolfcrypt/port/st/stm32.h index 0e9010756..25e59e1da 100644 --- a/wolfssl/wolfcrypt/port/st/stm32.h +++ b/wolfssl/wolfcrypt/port/st/stm32.h @@ -54,6 +54,9 @@ #if !defined(HASH_DATATYPE_8B) && defined(HASH_DataType_8b) #define HASH_DATATYPE_8B HASH_DataType_8b #endif +#ifndef HASH_STR_NBW + #define HASH_STR_NBW HASH_STR_NBLW +#endif #ifndef STM32_HASH_TIMEOUT #define STM32_HASH_TIMEOUT 0xFFFF @@ -93,19 +96,24 @@ int wc_Stm32_Hash_Final(STM32_HASH_Context* stmCtx, word32 algo, #ifndef NO_AES #if !defined(STM32_CRYPTO_AES_GCM) && (defined(WOLFSSL_STM32F4) || \ - defined(WOLFSSL_STM32F7) || defined(WOLFSSL_STM32L4)) + defined(WOLFSSL_STM32F7) || defined(WOLFSSL_STM32L4) || defined(WOLFSSL_STM32L5)) /* Hardware supports AES GCM acceleration */ #define STM32_CRYPTO_AES_GCM #endif - #ifdef WOLFSSL_STM32L4 - #define STM32_CRYPTO_AES_ONLY /* crypto engine only supports AES */ + #if defined(WOLFSSL_STM32L4) || defined(WOLFSSL_STM32L5) + #ifdef WOLFSSL_STM32L4 + #define STM32_CRYPTO_AES_ONLY /* crypto engine only supports AES */ + #endif #define CRYP AES + #ifndef CRYP_AES_GCM + #define CRYP_AES_GCM CRYP_AES_GCM_GMAC + #endif #endif /* Detect newer CubeMX crypto HAL (HAL_CRYP_Encrypt / HAL_CRYP_Decrypt) */ #if !defined(STM32_HAL_V2) && \ - defined(WOLFSSL_STM32F7) && defined(CRYP_AES_GCM) + (defined(WOLFSSL_STM32F7) || defined(WOLFSSL_STM32L5)) && defined(CRYP_AES_GCM) #define STM32_HAL_V2 #endif diff --git a/wolfssl/wolfcrypt/settings.h b/wolfssl/wolfcrypt/settings.h index 32bf31eb3..fb4879c03 100644 --- a/wolfssl/wolfcrypt/settings.h +++ b/wolfssl/wolfcrypt/settings.h @@ -1203,7 +1203,7 @@ extern void uITRON4_free(void *p) ; #if defined(WOLFSSL_STM32F2) || defined(WOLFSSL_STM32F4) || \ defined(WOLFSSL_STM32F7) || defined(WOLFSSL_STM32F1) || \ - defined(WOLFSSL_STM32L4) + defined(WOLFSSL_STM32L4) || defined(WOLFSSL_STM32L5) #define SIZEOF_LONG_LONG 8 #ifndef CHAR_BIT @@ -1224,7 +1224,7 @@ extern void uITRON4_free(void *p) ; #undef STM32_CRYPTO #define STM32_CRYPTO - #ifdef WOLFSSL_STM32L4 + #if defined(WOLFSSL_STM32L4) || defined(WOLFSSL_STM32L5) #define NO_AES_192 /* hardware does not support 192-bit */ #endif #endif @@ -1239,6 +1239,8 @@ extern void uITRON4_free(void *p) ; #ifdef WOLFSSL_STM32_CUBEMX #if defined(WOLFSSL_STM32F2) #include "stm32f2xx_hal.h" + #elif defined(WOLFSSL_STM32L5) + #include "stm32l5xx_hal.h" #elif defined(WOLFSSL_STM32L4) #include "stm32l4xx_hal.h" #elif defined(WOLFSSL_STM32F4) @@ -1272,7 +1274,15 @@ extern void uITRON4_free(void *p) ; #ifdef STM32_HASH #include "stm32f4xx_hash.h" #endif - #elif defined(WOLFSSL_STM32L4) + #elif defined(WOLFSSL_STM32L5) + #include "stm32l5xx.h" + #ifdef STM32_CRYPTO + #include "stm32l5xx_cryp.h" + #endif + #ifdef STM32_HASH + #include "stm32l5xx_hash.h" + #endif + #elif defined(WOLFSSL_STM32L4) #include "stm32l4xx.h" #ifdef STM32_CRYPTO #include "stm32l4xx_cryp.h" @@ -1286,7 +1296,7 @@ extern void uITRON4_free(void *p) ; #include "stm32f1xx.h" #endif #endif /* WOLFSSL_STM32_CUBEMX */ -#endif /* WOLFSSL_STM32F2 || WOLFSSL_STM32F4 || WOLFSSL_STM32L4 || WOLFSSL_STM32F7 */ +#endif /* WOLFSSL_STM32F2 || WOLFSSL_STM32F4 || WOLFSSL_STM32L4 || WOLFSSL_STM32L5 || WOLFSSL_STM32F7 */ #ifdef WOLFSSL_DEOS #include #include From 5837c70e99c9992ccf73c7a5f520c4a9be03fb9f Mon Sep 17 00:00:00 2001 From: David Garske Date: Wed, 3 Jun 2020 11:38:56 -0700 Subject: [PATCH 200/298] Support for STM32L5 PKA ECC sign/verify acceleration. --- IDE/OPENSTM32/Inc/user_settings.h | 1 + wolfcrypt/src/port/st/stm32.c | 7 ++++++- wolfssl/wolfcrypt/port/st/stm32.h | 28 ++++++++++++++++++---------- 3 files changed, 25 insertions(+), 11 deletions(-) diff --git a/IDE/OPENSTM32/Inc/user_settings.h b/IDE/OPENSTM32/Inc/user_settings.h index 7ff0e7e43..1c4282fb0 100644 --- a/IDE/OPENSTM32/Inc/user_settings.h +++ b/IDE/OPENSTM32/Inc/user_settings.h @@ -64,6 +64,7 @@ extern "C" { //#define NO_STM32_HASH //#define NO_STM32_RNG //#define NO_STM32_CRYPTO +//#define WOLFSSL_STM32_PKA /* WB55 and L5 only */ /* ------------------------------------------------------------------------- */ diff --git a/wolfcrypt/src/port/st/stm32.c b/wolfcrypt/src/port/st/stm32.c index bb20a14d7..2c3aac27d 100644 --- a/wolfcrypt/src/port/st/stm32.c +++ b/wolfcrypt/src/port/st/stm32.c @@ -363,9 +363,14 @@ int wc_Stm32_Aes_Init(Aes* aes, CRYP_InitTypeDef* cryptInit, #ifdef WOLFSSL_STM32_PKA #include + +#if defined(WOLFSSL_STM32L5) +#include +#include +#else #include #include - +#endif extern PKA_HandleTypeDef hpka; /* Reverse array in memory (in place) */ diff --git a/wolfssl/wolfcrypt/port/st/stm32.h b/wolfssl/wolfcrypt/port/st/stm32.h index 25e59e1da..24de1c183 100644 --- a/wolfssl/wolfcrypt/port/st/stm32.h +++ b/wolfssl/wolfcrypt/port/st/stm32.h @@ -28,11 +28,6 @@ #include #include -#if defined(WOLFSSL_STM32_PKA) && defined(HAVE_ECC) - #include - #include -#endif - #ifdef STM32_HASH #define WOLFSSL_NO_HASH_RAW @@ -139,12 +134,25 @@ int wc_Stm32_Hash_Final(STM32_HASH_Context* stmCtx, word32 algo, #endif /* STM32_CRYPTO */ #if defined(WOLFSSL_STM32_PKA) && defined(HAVE_ECC) -int stm32_ecc_verify_hash_ex(mp_int *r, mp_int *s, const byte* hash, - word32 hashlen, int* res, ecc_key* key); - -int stm32_ecc_sign_hash_ex(const byte* hash, word32 hashlen, WC_RNG* rng, - ecc_key* key, mp_int *r, mp_int *s); +#ifdef WOLFSSL_SP_MATH + struct sp_int; + #define MATH_INT_T struct sp_int +#elif defined(USE_FAST_MATH) + struct fp_int; + #define MATH_INT_T struct fp_int +#else + struct mp_int; + #define MATH_INT_T struct mp_int #endif +struct ecc_key; +struct WC_RNG; + +int stm32_ecc_verify_hash_ex(MATH_INT_T *r, MATH_INT_T *s, const byte* hash, + word32 hashlen, int* res, struct ecc_key* key); + +int stm32_ecc_sign_hash_ex(const byte* hash, word32 hashlen, struct WC_RNG* rng, + struct ecc_key* key, MATH_INT_T *r, MATH_INT_T *s); +#endif /* WOLFSSL_STM32_PKA && HAVE_ECC */ #endif /* _WOLFPORT_STM32_H_ */ From 28913a276f5f2c0e43c1b0eab526acdc3989a2ac Mon Sep 17 00:00:00 2001 From: Tesfa Mael Date: Mon, 8 Jun 2020 08:38:59 -0700 Subject: [PATCH 201/298] Include GCM in latest FIPS and Windows build --- wolfcrypt/src/evp.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/wolfcrypt/src/evp.c b/wolfcrypt/src/evp.c index 44e4e71f6..09b914aa7 100644 --- a/wolfcrypt/src/evp.c +++ b/wolfcrypt/src/evp.c @@ -4291,6 +4291,8 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) } #endif /* WOLFSSL_AES_256 */ #endif /* HAVE_AES_CBC */ +#if (!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) || \ + (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2)) #ifdef HAVE_AESGCM #ifdef WOLFSSL_AES_128 if (ctx->cipherType == AES_128_GCM_TYPE || @@ -4365,6 +4367,7 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) } #endif /* WOLFSSL_AES_256 */ #endif /* HAVE_AESGCM */ +#endif /*!HAVE_FIPS && !HAVE_SELFTEST ||(HAVE_FIPS_VERSION && HAVE_FIPS_VERSION >= 2)*/ #ifdef WOLFSSL_AES_COUNTER #ifdef WOLFSSL_AES_128 if (ctx->cipherType == AES_128_CTR_TYPE || From 8b6b54603f5858fcf827d21bc1fd7e5b9fcc2fb6 Mon Sep 17 00:00:00 2001 From: David Garske Date: Wed, 3 Jun 2020 16:23:55 -0700 Subject: [PATCH 202/298] Add STM32WB55 crypto hardware support for AES. --- wolfcrypt/src/aes.c | 142 +++++++++++++++--------------- wolfssl/wolfcrypt/port/st/stm32.h | 8 +- wolfssl/wolfcrypt/settings.h | 11 ++- 3 files changed, 86 insertions(+), 75 deletions(-) diff --git a/wolfcrypt/src/aes.c b/wolfcrypt/src/aes.c index 88413eaa1..32645c98c 100644 --- a/wolfcrypt/src/aes.c +++ b/wolfcrypt/src/aes.c @@ -307,21 +307,21 @@ if (ret != 0) return ret; - #ifdef STM32_CRYPTO_AES_ONLY + #if defined(STM32_HAL_V2) + hcryp.Init.Algorithm = CRYP_AES_ECB; + #elif defined(STM32_CRYPTO_AES_ONLY) hcryp.Init.OperatingMode = CRYP_ALGOMODE_ENCRYPT; hcryp.Init.ChainingMode = CRYP_CHAINMODE_AES_ECB; hcryp.Init.KeyWriteFlag = CRYP_KEY_WRITE_ENABLE; - #elif defined(STM32_HAL_V2) - hcryp.Init.Algorithm = CRYP_AES_ECB; #endif HAL_CRYP_Init(&hcryp); - #ifdef STM32_CRYPTO_AES_ONLY - ret = HAL_CRYPEx_AES(&hcryp, (uint8_t*)inBlock, AES_BLOCK_SIZE, - outBlock, STM32_HAL_TIMEOUT); - #elif defined(STM32_HAL_V2) + #if defined(STM32_HAL_V2) ret = HAL_CRYP_Encrypt(&hcryp, (uint32_t*)inBlock, AES_BLOCK_SIZE, (uint32_t*)outBlock, STM32_HAL_TIMEOUT); + #elif defined(STM32_CRYPTO_AES_ONLY) + ret = HAL_CRYPEx_AES(&hcryp, (uint8_t*)inBlock, AES_BLOCK_SIZE, + outBlock, STM32_HAL_TIMEOUT); #else ret = HAL_CRYP_AESECB_Encrypt(&hcryp, (uint8_t*)inBlock, AES_BLOCK_SIZE, outBlock, STM32_HAL_TIMEOUT); @@ -391,21 +391,21 @@ if (ret != 0) return ret; - #ifdef STM32_CRYPTO_AES_ONLY + #if defined(STM32_HAL_V2) + hcryp.Init.Algorithm = CRYP_AES_ECB; + #elif defined(STM32_CRYPTO_AES_ONLY) hcryp.Init.OperatingMode = CRYP_ALGOMODE_KEYDERIVATION_DECRYPT; hcryp.Init.ChainingMode = CRYP_CHAINMODE_AES_ECB; hcryp.Init.KeyWriteFlag = CRYP_KEY_WRITE_ENABLE; - #elif defined(STM32_HAL_V2) - hcryp.Init.Algorithm = CRYP_AES_ECB; #endif HAL_CRYP_Init(&hcryp); - #ifdef STM32_CRYPTO_AES_ONLY - ret = HAL_CRYPEx_AES(&hcryp, (uint8_t*)inBlock, AES_BLOCK_SIZE, - outBlock, STM32_HAL_TIMEOUT); - #elif defined(STM32_HAL_V2) + #if defined(STM32_HAL_V2) ret = HAL_CRYP_Decrypt(&hcryp, (uint32_t*)inBlock, AES_BLOCK_SIZE, (uint32_t*)outBlock, STM32_HAL_TIMEOUT); + #elif defined(STM32_CRYPTO_AES_ONLY) + ret = HAL_CRYPEx_AES(&hcryp, (uint8_t*)inBlock, AES_BLOCK_SIZE, + outBlock, STM32_HAL_TIMEOUT); #else ret = HAL_CRYP_AESECB_Decrypt(&hcryp, (uint8_t*)inBlock, AES_BLOCK_SIZE, outBlock, STM32_HAL_TIMEOUT); @@ -2963,23 +2963,23 @@ int wc_AesSetIV(Aes* aes, const byte* iv) return ret; } - #ifdef STM32_CRYPTO_AES_ONLY + #if defined(STM32_HAL_V2) + hcryp.Init.Algorithm = CRYP_AES_CBC; + ByteReverseWords(aes->reg, aes->reg, AES_BLOCK_SIZE); + #elif defined(STM32_CRYPTO_AES_ONLY) hcryp.Init.OperatingMode = CRYP_ALGOMODE_ENCRYPT; hcryp.Init.ChainingMode = CRYP_CHAINMODE_AES_CBC; hcryp.Init.KeyWriteFlag = CRYP_KEY_WRITE_ENABLE; - #elif defined(STM32_HAL_V2) - hcryp.Init.Algorithm = CRYP_AES_CBC; - ByteReverseWords(aes->reg, aes->reg, AES_BLOCK_SIZE); #endif hcryp.Init.pInitVect = (STM_CRYPT_TYPE*)aes->reg; HAL_CRYP_Init(&hcryp); - #ifdef STM32_CRYPTO_AES_ONLY - ret = HAL_CRYPEx_AES(&hcryp, (uint8_t*)in, blocks * AES_BLOCK_SIZE, - out, STM32_HAL_TIMEOUT); - #elif defined(STM32_HAL_V2) + #if defined(STM32_HAL_V2) ret = HAL_CRYP_Encrypt(&hcryp, (uint32_t*)in, blocks * AES_BLOCK_SIZE, (uint32_t*)out, STM32_HAL_TIMEOUT); + #elif defined(STM32_CRYPTO_AES_ONLY) + ret = HAL_CRYPEx_AES(&hcryp, (uint8_t*)in, blocks * AES_BLOCK_SIZE, + out, STM32_HAL_TIMEOUT); #else ret = HAL_CRYP_AESCBC_Encrypt(&hcryp, (uint8_t*)in, blocks * AES_BLOCK_SIZE, out, STM32_HAL_TIMEOUT); @@ -3016,24 +3016,24 @@ int wc_AesSetIV(Aes* aes, const byte* iv) /* if input and output same will overwrite input iv */ XMEMCPY(aes->tmp, in + sz - AES_BLOCK_SIZE, AES_BLOCK_SIZE); - #ifdef STM32_CRYPTO_AES_ONLY + #if defined(STM32_HAL_V2) + hcryp.Init.Algorithm = CRYP_AES_CBC; + ByteReverseWords(aes->reg, aes->reg, AES_BLOCK_SIZE); + #elif defined(STM32_CRYPTO_AES_ONLY) hcryp.Init.OperatingMode = CRYP_ALGOMODE_KEYDERIVATION_DECRYPT; hcryp.Init.ChainingMode = CRYP_CHAINMODE_AES_CBC; hcryp.Init.KeyWriteFlag = CRYP_KEY_WRITE_ENABLE; - #elif defined(STM32_HAL_V2) - hcryp.Init.Algorithm = CRYP_AES_CBC; - ByteReverseWords(aes->reg, aes->reg, AES_BLOCK_SIZE); #endif hcryp.Init.pInitVect = (STM_CRYPT_TYPE*)aes->reg; HAL_CRYP_Init(&hcryp); - #ifdef STM32_CRYPTO_AES_ONLY - ret = HAL_CRYPEx_AES(&hcryp, (uint8_t*)in, blocks * AES_BLOCK_SIZE, - out, STM32_HAL_TIMEOUT); - #elif defined(STM32_HAL_V2) + #if defined(STM32_HAL_V2) ret = HAL_CRYP_Decrypt(&hcryp, (uint32_t*)in, blocks * AES_BLOCK_SIZE, (uint32_t*)out, STM32_HAL_TIMEOUT); + #elif defined(STM32_CRYPTO_AES_ONLY) + ret = HAL_CRYPEx_AES(&hcryp, (uint8_t*)in, blocks * AES_BLOCK_SIZE, + out, STM32_HAL_TIMEOUT); #else ret = HAL_CRYP_AESCBC_Decrypt(&hcryp, (uint8_t*)in, blocks * AES_BLOCK_SIZE, out, STM32_HAL_TIMEOUT); @@ -3739,26 +3739,26 @@ int wc_AesSetIV(Aes* aes, const byte* iv) return ret; } - #ifdef STM32_CRYPTO_AES_ONLY + #if defined(STM32_HAL_V2) + hcryp.Init.Algorithm = CRYP_AES_CTR; + ByteReverseWords(iv, aes->reg, AES_BLOCK_SIZE); + hcryp.Init.pInitVect = (STM_CRYPT_TYPE*)iv; + #elif defined(STM32_CRYPTO_AES_ONLY) hcryp.Init.OperatingMode = CRYP_ALGOMODE_ENCRYPT; hcryp.Init.ChainingMode = CRYP_CHAINMODE_AES_CTR; hcryp.Init.KeyWriteFlag = CRYP_KEY_WRITE_ENABLE; hcryp.Init.pInitVect = (STM_CRYPT_TYPE*)aes->reg; - #elif defined(STM32_HAL_V2) - hcryp.Init.Algorithm = CRYP_AES_CTR; - ByteReverseWords(iv, aes->reg, AES_BLOCK_SIZE); - hcryp.Init.pInitVect = (STM_CRYPT_TYPE*)iv; #else hcryp.Init.pInitVect = (STM_CRYPT_TYPE*)aes->reg; #endif HAL_CRYP_Init(&hcryp); - #ifdef STM32_CRYPTO_AES_ONLY - ret = HAL_CRYPEx_AES(&hcryp, (byte*)in, AES_BLOCK_SIZE, - out, STM32_HAL_TIMEOUT); - #elif defined(STM32_HAL_V2) + #if defined(STM32_HAL_V2) ret = HAL_CRYP_Encrypt(&hcryp, (uint32_t*)in, AES_BLOCK_SIZE, (uint32_t*)out, STM32_HAL_TIMEOUT); + #elif defined(STM32_CRYPTO_AES_ONLY) + ret = HAL_CRYPEx_AES(&hcryp, (byte*)in, AES_BLOCK_SIZE, + out, STM32_HAL_TIMEOUT); #else ret = HAL_CRYP_AESCTR_Encrypt(&hcryp, (byte*)in, AES_BLOCK_SIZE, out, STM32_HAL_TIMEOUT); @@ -5982,7 +5982,22 @@ static int wc_AesGcmEncrypt_STM32(Aes* aes, byte* out, const byte* in, word32 sz hcryp.Init.pInitVect = (STM_CRYPT_TYPE*)ctr; hcryp.Init.Header = (STM_CRYPT_TYPE*)authInPadded; -#ifdef STM32_CRYPTO_AES_ONLY +#if defined(STM32_HAL_V2) + hcryp.Init.Algorithm = CRYP_AES_GCM; + hcryp.Init.HeaderSize = authPadSz/sizeof(word32); + ByteReverseWords(partialBlock, ctr, AES_BLOCK_SIZE); + hcryp.Init.pInitVect = (STM_CRYPT_TYPE*)partialBlock; + HAL_CRYP_Init(&hcryp); + + /* GCM payload phase - can handle partial blocks */ + status = HAL_CRYP_Encrypt(&hcryp, (uint32_t*)in, + (blocks * AES_BLOCK_SIZE) + partial, (uint32_t*)out, STM32_HAL_TIMEOUT); + if (status == HAL_OK) { + /* Compute the authTag */ + status = HAL_CRYPEx_AESGCM_GenerateAuthTAG(&hcryp, (uint32_t*)tag, + STM32_HAL_TIMEOUT); + } +#elif defined(STM32_CRYPTO_AES_ONLY) /* Set the CRYP parameters */ hcryp.Init.HeaderSize = authPadSz; if (authPadSz == 0) @@ -6020,21 +6035,6 @@ static int wc_AesGcmEncrypt_STM32(Aes* aes, byte* out, const byte* in, word32 sz hcryp.Init.GCMCMACPhase = CRYP_FINAL_PHASE; status = HAL_CRYPEx_AES_Auth(&hcryp, NULL, sz, (uint8_t*)tag, STM32_HAL_TIMEOUT); } -#elif defined(STM32_HAL_V2) - hcryp.Init.Algorithm = CRYP_AES_GCM; - hcryp.Init.HeaderSize = authPadSz/sizeof(word32); - ByteReverseWords(partialBlock, ctr, AES_BLOCK_SIZE); - hcryp.Init.pInitVect = (STM_CRYPT_TYPE*)partialBlock; - HAL_CRYP_Init(&hcryp); - - /* GCM payload phase - can handle partial blocks */ - status = HAL_CRYP_Encrypt(&hcryp, (uint32_t*)in, - (blocks * AES_BLOCK_SIZE) + partial, (uint32_t*)out, STM32_HAL_TIMEOUT); - if (status == HAL_OK) { - /* Compute the authTag */ - status = HAL_CRYPEx_AESGCM_GenerateAuthTAG(&hcryp, (uint32_t*)tag, - STM32_HAL_TIMEOUT); - } #else hcryp.Init.HeaderSize = authPadSz; HAL_CRYP_Init(&hcryp); @@ -6425,7 +6425,22 @@ static int wc_AesGcmDecrypt_STM32(Aes* aes, byte* out, hcryp.Init.pInitVect = (STM_CRYPT_TYPE*)ctr; hcryp.Init.Header = (STM_CRYPT_TYPE*)authInPadded; -#ifdef STM32_CRYPTO_AES_ONLY +#if defined(STM32_HAL_V2) + hcryp.Init.HeaderSize = authPadSz/sizeof(word32); + hcryp.Init.Algorithm = CRYP_AES_GCM; + ByteReverseWords(partialBlock, ctr, AES_BLOCK_SIZE); + hcryp.Init.pInitVect = (STM_CRYPT_TYPE*)partialBlock; + HAL_CRYP_Init(&hcryp); + + /* GCM payload phase - can handle partial blocks */ + status = HAL_CRYP_Decrypt(&hcryp, (uint32_t*)in, + (blocks * AES_BLOCK_SIZE) + partial, (uint32_t*)out, STM32_HAL_TIMEOUT); + if (status == HAL_OK) { + /* Compute the authTag */ + status = HAL_CRYPEx_AESGCM_GenerateAuthTAG(&hcryp, (uint32_t*)tag, + STM32_HAL_TIMEOUT); + } +#elif defined(STM32_CRYPTO_AES_ONLY) /* Set the CRYP parameters */ hcryp.Init.HeaderSize = authPadSz; if (authPadSz == 0) @@ -6463,21 +6478,6 @@ static int wc_AesGcmDecrypt_STM32(Aes* aes, byte* out, hcryp.Init.GCMCMACPhase = CRYP_FINAL_PHASE; status = HAL_CRYPEx_AES_Auth(&hcryp, NULL, sz, (byte*)tag, STM32_HAL_TIMEOUT); } -#elif defined(STM32_HAL_V2) - hcryp.Init.HeaderSize = authPadSz/sizeof(word32); - hcryp.Init.Algorithm = CRYP_AES_GCM; - ByteReverseWords(partialBlock, ctr, AES_BLOCK_SIZE); - hcryp.Init.pInitVect = (STM_CRYPT_TYPE*)partialBlock; - HAL_CRYP_Init(&hcryp); - - /* GCM payload phase - can handle partial blocks */ - status = HAL_CRYP_Decrypt(&hcryp, (uint32_t*)in, - (blocks * AES_BLOCK_SIZE) + partial, (uint32_t*)out, STM32_HAL_TIMEOUT); - if (status == HAL_OK) { - /* Compute the authTag */ - status = HAL_CRYPEx_AESGCM_GenerateAuthTAG(&hcryp, (uint32_t*)tag, - STM32_HAL_TIMEOUT); - } #else hcryp.Init.HeaderSize = authPadSz; HAL_CRYP_Init(&hcryp); diff --git a/wolfssl/wolfcrypt/port/st/stm32.h b/wolfssl/wolfcrypt/port/st/stm32.h index 24de1c183..06a49160f 100644 --- a/wolfssl/wolfcrypt/port/st/stm32.h +++ b/wolfssl/wolfcrypt/port/st/stm32.h @@ -91,11 +91,17 @@ int wc_Stm32_Hash_Final(STM32_HASH_Context* stmCtx, word32 algo, #ifndef NO_AES #if !defined(STM32_CRYPTO_AES_GCM) && (defined(WOLFSSL_STM32F4) || \ - defined(WOLFSSL_STM32F7) || defined(WOLFSSL_STM32L4) || defined(WOLFSSL_STM32L5)) + defined(WOLFSSL_STM32F7) || defined(WOLFSSL_STM32L4) || \ + defined(WOLFSSL_STM32L5)) /* Hardware supports AES GCM acceleration */ #define STM32_CRYPTO_AES_GCM #endif + #if defined(WOLFSSL_STM32WB) + #define STM32_CRYPTO_AES_ONLY /* crypto engine only supports AES */ + #define CRYP AES1 + #define STM32_HAL_V2 + #endif #if defined(WOLFSSL_STM32L4) || defined(WOLFSSL_STM32L5) #ifdef WOLFSSL_STM32L4 #define STM32_CRYPTO_AES_ONLY /* crypto engine only supports AES */ diff --git a/wolfssl/wolfcrypt/settings.h b/wolfssl/wolfcrypt/settings.h index fb4879c03..b253519b5 100644 --- a/wolfssl/wolfcrypt/settings.h +++ b/wolfssl/wolfcrypt/settings.h @@ -1203,7 +1203,8 @@ extern void uITRON4_free(void *p) ; #if defined(WOLFSSL_STM32F2) || defined(WOLFSSL_STM32F4) || \ defined(WOLFSSL_STM32F7) || defined(WOLFSSL_STM32F1) || \ - defined(WOLFSSL_STM32L4) || defined(WOLFSSL_STM32L5) + defined(WOLFSSL_STM32L4) || defined(WOLFSSL_STM32L5) || \ + defined(WOLFSSL_STM32WB) #define SIZEOF_LONG_LONG 8 #ifndef CHAR_BIT @@ -1224,7 +1225,8 @@ extern void uITRON4_free(void *p) ; #undef STM32_CRYPTO #define STM32_CRYPTO - #if defined(WOLFSSL_STM32L4) || defined(WOLFSSL_STM32L5) + #if defined(WOLFSSL_STM32L4) || defined(WOLFSSL_STM32L5) || \ + defined(WOLFSSL_STM32WB) #define NO_AES_192 /* hardware does not support 192-bit */ #endif #endif @@ -1249,6 +1251,8 @@ extern void uITRON4_free(void *p) ; #include "stm32f7xx_hal.h" #elif defined(WOLFSSL_STM32F1) #include "stm32f1xx_hal.h" + #elif defined(WOLFSSL_STM32WB) + #include "stm32wbxx_hal.h" #endif #if defined(WOLFSSL_CUBEMX_USE_LL) && defined(WOLFSSL_STM32L4) #include "stm32l4xx_ll_rng.h" @@ -1296,7 +1300,8 @@ extern void uITRON4_free(void *p) ; #include "stm32f1xx.h" #endif #endif /* WOLFSSL_STM32_CUBEMX */ -#endif /* WOLFSSL_STM32F2 || WOLFSSL_STM32F4 || WOLFSSL_STM32L4 || WOLFSSL_STM32L5 || WOLFSSL_STM32F7 */ +#endif /* WOLFSSL_STM32F2 || WOLFSSL_STM32F4 || WOLFSSL_STM32L4 || + WOLFSSL_STM32L5 || WOLFSSL_STM32F7 || WOLFSSL_STMWB */ #ifdef WOLFSSL_DEOS #include #include From 3a430522dac3c164fbbd69960114a971134172ec Mon Sep 17 00:00:00 2001 From: Jacob Barthelmeh Date: Mon, 8 Jun 2020 14:23:40 -0600 Subject: [PATCH 203/298] fix error checking when parsing a PKCS12 DER into an internal structure --- wolfcrypt/src/pkcs12.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/wolfcrypt/src/pkcs12.c b/wolfcrypt/src/pkcs12.c index 8ae500417..21cbebaf2 100644 --- a/wolfcrypt/src/pkcs12.c +++ b/wolfcrypt/src/pkcs12.c @@ -190,6 +190,7 @@ void wc_PKCS12_free(WC_PKCS12* pkcs12) } +/* return 0 on success */ static int GetSafeContent(WC_PKCS12* pkcs12, const byte* input, word32* idx, int maxIdx) { @@ -228,7 +229,7 @@ static int GetSafeContent(WC_PKCS12* pkcs12, const byte* input, } if ((ret = GetLength(input, &localIdx, &size, maxIdx)) <= 0) { freeSafe(safe, pkcs12->heap); - return ret; + return ASN_PARSE_E; } switch (oid) { @@ -251,7 +252,7 @@ static int GetSafeContent(WC_PKCS12* pkcs12, const byte* input, } if ((ret = GetLength(input, &localIdx, &size, maxIdx)) <= 0) { freeSafe(safe, pkcs12->heap); - return ret; + return ASN_PARSE_E; } break; @@ -350,7 +351,8 @@ static int GetSafeContent(WC_PKCS12* pkcs12, const byte* input, } -/* optional mac data */ +/* parse optional mac data + * return 0 on success */ static int GetSignData(WC_PKCS12* pkcs12, const byte* mem, word32* idx, word32 totalSz) { @@ -366,7 +368,7 @@ static int GetSignData(WC_PKCS12* pkcs12, const byte* mem, word32* idx, */ if ((ret = GetSequence(mem, &curIdx, &size, totalSz)) <= 0) { WOLFSSL_MSG("Failed to get PKCS12 sequence"); - return ret; + return ASN_PARSE_E; } #ifdef WOLFSSL_DEBUG_PKCS12 @@ -405,7 +407,7 @@ static int GetSignData(WC_PKCS12* pkcs12, const byte* mem, word32* idx, if ((ret = GetLength(mem, &curIdx, &size, totalSz)) <= 0) { XFREE(mac, pkcs12->heap, DYNAMIC_TYPE_PKCS); - return ret; + return ASN_PARSE_E; } mac->digestSz = size; mac->digest = (byte*)XMALLOC(mac->digestSz, pkcs12->heap, @@ -637,7 +639,7 @@ int wc_d2i_PKCS12(const byte* der, word32 derSz, WC_PKCS12* pkcs12) totalSz = derSz; if ((ret = GetSequence(der, &idx, &size, totalSz)) <= 0) { WOLFSSL_MSG("Failed to get PKCS12 sequence"); - return ret; + return ASN_PARSE_E; } /* get version */ From 80e888c1c80d65590247d636e2bd22e8377c05e7 Mon Sep 17 00:00:00 2001 From: kaleb-himes Date: Tue, 9 Jun 2020 16:47:35 -0600 Subject: [PATCH 204/298] Seperate QT and DSA dependencies --- wolfcrypt/src/asn.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/wolfcrypt/src/asn.c b/wolfcrypt/src/asn.c index 226278441..36998c648 100644 --- a/wolfcrypt/src/asn.c +++ b/wolfcrypt/src/asn.c @@ -880,7 +880,7 @@ int GetInt(mp_int* mpi, const byte* input, word32* inOutIdx, word32 maxIdx) } #if (!defined(WOLFSSL_KEY_GEN) && !defined(OPENSSL_EXTRA) && defined(RSA_LOW_MEM)) \ - || defined(WOLFSSL_RSA_PUBLIC_ONLY) || (!defined(NO_DSA) && defined(WOLFSSL_QT)) + || defined(WOLFSSL_RSA_PUBLIC_ONLY) || (!defined(NO_DSA)) #if !defined(NO_RSA) && !defined(HAVE_USER_RSA) static int SkipInt(const byte* input, word32* inOutIdx, word32 maxIdx) { @@ -5103,7 +5103,7 @@ static int StoreRsaKey(DecodedCert* cert, word32 bitStringEnd) static int GetKey(DecodedCert* cert) { int length; -#if !defined(NO_DSA) && defined(WOLFSSL_QT) +#ifndef NO_DSA int tmpLen; #endif #if defined(HAVE_ECC) || defined(HAVE_NTRU) @@ -5113,7 +5113,7 @@ static int GetKey(DecodedCert* cert) if (GetSequence(cert->source, &cert->srcIdx, &length, cert->maxIdx) < 0) return ASN_PARSE_E; -#if !defined(NO_DSA) && defined(WOLFSSL_QT) +#ifndef NO_DSA tmpLen = length + 4; #endif @@ -5326,7 +5326,7 @@ static int GetKey(DecodedCert* cert) return 0; } #endif /* HAVE_ED448 */ - #if !defined(NO_DSA) && defined(WOLFSSL_QT) + #ifndef NO_DSA case DSAk: { int ret; From 2fe08e1951be54022de125b9d34f819563a34ac1 Mon Sep 17 00:00:00 2001 From: Kaleb Himes Date: Tue, 9 Jun 2020 17:10:57 -0600 Subject: [PATCH 205/298] Update comment Thanks @dgarske, great catch! --- wolfcrypt/src/asn.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wolfcrypt/src/asn.c b/wolfcrypt/src/asn.c index 36998c648..db0942a5c 100644 --- a/wolfcrypt/src/asn.c +++ b/wolfcrypt/src/asn.c @@ -5359,7 +5359,7 @@ static int GetKey(DecodedCert* cert) cert->srcIdx += length; return 0; } - #endif /* NO_DSA && QT */ + #endif /* NO_DSA */ default: return ASN_UNKNOWN_OID_E; } From d5577c9404a81976482df495242553a53acbc45e Mon Sep 17 00:00:00 2001 From: Juliusz Sosinowicz Date: Wed, 10 Jun 2020 18:30:02 +0200 Subject: [PATCH 206/298] Explicit convert --- src/ssl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ssl.c b/src/ssl.c index 17088c596..3fadd78e8 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -41934,7 +41934,7 @@ int wolfSSL_CRYPTO_memcmp(const void *a, const void *b, size_t size) { if (!a || !b) return 0; - return ConstantCompare(a, b, size); + return ConstantCompare((const byte*)a, (const byte*)b, (int)size); } int wolfSSL_sk_X509_num(const WOLF_STACK_OF(WOLFSSL_X509) *s) From f7c233af9c16f522b4739f6f695dd8df85b1ec1d Mon Sep 17 00:00:00 2001 From: John Safranek Date: Wed, 10 Jun 2020 15:15:11 -0700 Subject: [PATCH 207/298] Fix error in the changelog. AES-CTR with AES-NI wasn't actually added. --- ChangeLog.md | 1 - README | 1 - README.md | 1 - 3 files changed, 3 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index a3255c3ac..897809aca 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -128,7 +128,6 @@ Release 4.4.0 of wolfSSL embedded TLS has bug fixes and new features including: * Smaller table version of AES encrypt/decrypt. * Support IAR with position independent code (ROPI). * Improve speed of AArch64 assembly. -* Support AES-CTR with AES-NI. * Support AES-CTR on esp32. * Add a no malloc option for small SP math. diff --git a/README b/README index db1b54488..a5b36246a 100644 --- a/README +++ b/README @@ -173,7 +173,6 @@ Release 4.4.0 of wolfSSL embedded TLS has bug fixes and new features including: * Smaller table version of AES encrypt/decrypt. * Support IAR with position independent code (ROPI). * Improve speed of AArch64 assembly. -* Support AES-CTR with AES-NI. * Support AES-CTR on esp32. * Add a no malloc option for small SP math. diff --git a/README.md b/README.md index db1b54488..a5b36246a 100644 --- a/README.md +++ b/README.md @@ -173,7 +173,6 @@ Release 4.4.0 of wolfSSL embedded TLS has bug fixes and new features including: * Smaller table version of AES encrypt/decrypt. * Support IAR with position independent code (ROPI). * Improve speed of AArch64 assembly. -* Support AES-CTR with AES-NI. * Support AES-CTR on esp32. * Add a no malloc option for small SP math. From 6af052faae87219a88625f483720f178666d429e Mon Sep 17 00:00:00 2001 From: JacobBarthelmeh Date: Thu, 11 Jun 2020 10:57:26 -0700 Subject: [PATCH 208/298] add peer certificate print to callback --- wrapper/CSharp/include.am | 83 +++---- .../wolfSSL-Example-IOCallbacks.cs | 87 +++++--- wrapper/CSharp/wolfSSL_CSharp/X509.cs | 202 ++++++++++++++++++ wrapper/CSharp/wolfSSL_CSharp/wolfSSL.cs | 161 +++++++++++--- .../wolfSSL_CSharp/wolfSSL_CSharp.csproj | 1 + 5 files changed, 441 insertions(+), 93 deletions(-) create mode 100644 wrapper/CSharp/wolfSSL_CSharp/X509.cs diff --git a/wrapper/CSharp/include.am b/wrapper/CSharp/include.am index b0ec4f83d..8e49779d4 100644 --- a/wrapper/CSharp/include.am +++ b/wrapper/CSharp/include.am @@ -1,41 +1,42 @@ -# wolfSSL CSharp wrapper files -EXTRA_DIST+= wrapper/CSharp/wolfSSL-DTLS-PSK-Server/App.config -EXTRA_DIST+= wrapper/CSharp/wolfSSL-DTLS-PSK-Server/Properties/AssemblyInfo.cs -EXTRA_DIST+= wrapper/CSharp/wolfSSL-DTLS-PSK-Server/wolfSSL-DTLS-PSK-Server.cs -EXTRA_DIST+= wrapper/CSharp/wolfSSL-DTLS-PSK-Server/wolfSSL-DTLS-PSK-Server.csproj -EXTRA_DIST+= wrapper/CSharp/wolfSSL-DTLS-Server/App.config -EXTRA_DIST+= wrapper/CSharp/wolfSSL-DTLS-Server/Properties/AssemblyInfo.cs -EXTRA_DIST+= wrapper/CSharp/wolfSSL-DTLS-Server/wolfSSL-DTLS-Server.cs -EXTRA_DIST+= wrapper/CSharp/wolfSSL-DTLS-Server/wolfSSL-DTLS-Server.csproj -EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-PSK-Server/App.config -EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-PSK-Server/Properties/AssemblyInfo.cs -EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-PSK-Server/wolfSSL-TLS-PSK-Server.cs -EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-PSK-Server/wolfSSL-TLS-PSK-Server.csproj -EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-Server/App.config -EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-Server/Properties/AssemblyInfo.cs -EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-Server/Properties/Settings.Designer.cs -EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-Server/Properties/Settings.settings -EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-Server/wolfSSL-TLS-Server.cs -EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-Server/wolfSSL-TLS-Server.csproj -EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-ServerThreaded/App.config -EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-ServerThreaded/Properties/AssemblyInfo.cs -EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-ServerThreaded/Properties/Settings.Designer.cs -EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-ServerThreaded/Properties/Settings.settings -EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-ServerThreaded/wolfSSL-TLS-ServerThreaded.cs -EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-ServerThreaded/wolfSSL-TLS-ServerThreaded.csproj -EXTRA_DIST+= wrapper/CSharp/wolfSSL-Example-IOCallbacks/App.config -EXTRA_DIST+= wrapper/CSharp/wolfSSL-Example-IOCallbacks/Properties/AssemblyInfo.cs -EXTRA_DIST+= wrapper/CSharp/wolfSSL-Example-IOCallbacks/wolfSSL-Example-IOCallbacks.cs -EXTRA_DIST+= wrapper/CSharp/wolfSSL-Example-IOCallbacks/wolfSSL-Example-IOCallbacks.csproj -EXTRA_DIST+= wrapper/CSharp/wolfSSL_CSharp.sln -EXTRA_DIST+= wrapper/CSharp/wolfSSL_CSharp/Properties/AssemblyInfo.cs -EXTRA_DIST+= wrapper/CSharp/wolfSSL_CSharp/Properties/Resources.Designer.cs -EXTRA_DIST+= wrapper/CSharp/wolfSSL_CSharp/Properties/Resources.resx -EXTRA_DIST+= wrapper/CSharp/wolfSSL_CSharp/wolfSSL.cs -EXTRA_DIST+= wrapper/CSharp/wolfSSL_CSharp/wolfSSL_CSharp.csproj -EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-Client/App.config -EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-Client/Properties/AssemblyInfo.cs -EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-Client/Properties/Settings.Designer.cs -EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-Client/Properties/Settings.settings -EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-Client/wolfSSL-TLS-Client.cs -EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-Client/wolfSSL-TLS-Client.csproj +# wolfSSL CSharp wrapper files +EXTRA_DIST+= wrapper/CSharp/wolfSSL-DTLS-PSK-Server/App.config +EXTRA_DIST+= wrapper/CSharp/wolfSSL-DTLS-PSK-Server/Properties/AssemblyInfo.cs +EXTRA_DIST+= wrapper/CSharp/wolfSSL-DTLS-PSK-Server/wolfSSL-DTLS-PSK-Server.cs +EXTRA_DIST+= wrapper/CSharp/wolfSSL-DTLS-PSK-Server/wolfSSL-DTLS-PSK-Server.csproj +EXTRA_DIST+= wrapper/CSharp/wolfSSL-DTLS-Server/App.config +EXTRA_DIST+= wrapper/CSharp/wolfSSL-DTLS-Server/Properties/AssemblyInfo.cs +EXTRA_DIST+= wrapper/CSharp/wolfSSL-DTLS-Server/wolfSSL-DTLS-Server.cs +EXTRA_DIST+= wrapper/CSharp/wolfSSL-DTLS-Server/wolfSSL-DTLS-Server.csproj +EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-PSK-Server/App.config +EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-PSK-Server/Properties/AssemblyInfo.cs +EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-PSK-Server/wolfSSL-TLS-PSK-Server.cs +EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-PSK-Server/wolfSSL-TLS-PSK-Server.csproj +EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-Server/App.config +EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-Server/Properties/AssemblyInfo.cs +EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-Server/Properties/Settings.Designer.cs +EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-Server/Properties/Settings.settings +EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-Server/wolfSSL-TLS-Server.cs +EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-Server/wolfSSL-TLS-Server.csproj +EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-ServerThreaded/App.config +EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-ServerThreaded/Properties/AssemblyInfo.cs +EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-ServerThreaded/Properties/Settings.Designer.cs +EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-ServerThreaded/Properties/Settings.settings +EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-ServerThreaded/wolfSSL-TLS-ServerThreaded.cs +EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-ServerThreaded/wolfSSL-TLS-ServerThreaded.csproj +EXTRA_DIST+= wrapper/CSharp/wolfSSL-Example-IOCallbacks/App.config +EXTRA_DIST+= wrapper/CSharp/wolfSSL-Example-IOCallbacks/Properties/AssemblyInfo.cs +EXTRA_DIST+= wrapper/CSharp/wolfSSL-Example-IOCallbacks/wolfSSL-Example-IOCallbacks.cs +EXTRA_DIST+= wrapper/CSharp/wolfSSL-Example-IOCallbacks/wolfSSL-Example-IOCallbacks.csproj +EXTRA_DIST+= wrapper/CSharp/wolfSSL_CSharp.sln +EXTRA_DIST+= wrapper/CSharp/wolfSSL_CSharp/Properties/AssemblyInfo.cs +EXTRA_DIST+= wrapper/CSharp/wolfSSL_CSharp/Properties/Resources.Designer.cs +EXTRA_DIST+= wrapper/CSharp/wolfSSL_CSharp/Properties/Resources.resx +EXTRA_DIST+= wrapper/CSharp/wolfSSL_CSharp/wolfSSL.cs +EXTRA_DIST+= wrapper/CSharp/wolfSSL_CSharp/X509.cs +EXTRA_DIST+= wrapper/CSharp/wolfSSL_CSharp/wolfSSL_CSharp.csproj +EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-Client/App.config +EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-Client/Properties/AssemblyInfo.cs +EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-Client/Properties/Settings.Designer.cs +EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-Client/Properties/Settings.settings +EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-Client/wolfSSL-TLS-Client.cs +EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-Client/wolfSSL-TLS-Client.csproj diff --git a/wrapper/CSharp/wolfSSL-Example-IOCallbacks/wolfSSL-Example-IOCallbacks.cs b/wrapper/CSharp/wolfSSL-Example-IOCallbacks/wolfSSL-Example-IOCallbacks.cs index f57a63224..239f9321f 100644 --- a/wrapper/CSharp/wolfSSL-Example-IOCallbacks/wolfSSL-Example-IOCallbacks.cs +++ b/wrapper/CSharp/wolfSSL-Example-IOCallbacks/wolfSSL-Example-IOCallbacks.cs @@ -135,6 +135,67 @@ class wolfSSL_Example_IOCallbacks return (uint)4; } + /// + /// Example of a certificate verify function + /// + /// + /// pointer to a WOLFSSL_X509_STORE_CTX + /// size of key set + public static int my_verify_cb(int preverify, IntPtr store) + { + if (store == IntPtr.Zero) + { + Console.WriteLine("store is null"); + } + + Console.WriteLine("Status of certificate verify = " + preverify); + + /* look at the current cert in store */ + try + { + + X509 x509 = wolfssl.X509_STORE_CTX_get_current_cert(store); + + + Console.WriteLine("Issuer : " + x509.Issuer); + Console.WriteLine("Subject : " + x509.Subject); + + Console.WriteLine("PEM of certificate:"); + Console.WriteLine(System.Text.Encoding.UTF8.GetString(x509.Export())); + + Console.WriteLine("DER of certificate:"); + Console.WriteLine(BitConverter.ToString(x509.Export(wolfssl.SSL_FILETYPE_ASN1))); + + Console.WriteLine("Public key:"); + Console.WriteLine(BitConverter.ToString(x509.GetPublicKey())); + } + catch (Exception e) + { + Console.WriteLine("Unable to get X509's"); + } + + /* list all certs in store */ + try + { + int i; + X509[] x509 = wolfssl.X509_STORE_CTX_get_certs(store); + + for (i = 0; i < x509.Length; i++) + { + Console.WriteLine("CERT[" + i + "]"); + Console.WriteLine("Issuer : " + x509[i].Issuer); + Console.WriteLine("Subject : " + x509[i].Subject); + Console.WriteLine(""); + } + } + catch (Exception e) + { + Console.WriteLine("Unable to get X509's"); + } + + /* by returning 1 here we override any failure and report success */ + return 1; + } private static void clean(IntPtr ssl, IntPtr ctx) { @@ -151,6 +212,7 @@ class wolfSSL_Example_IOCallbacks Socket fd; wolfssl.psk_delegate psk_cb = new wolfssl.psk_delegate(my_psk_server_cb); + wolfssl.CallbackVerify_delegate verify_cb = new wolfssl.CallbackVerify_delegate(my_verify_cb); /* These paths should be changed according to use */ string fileCert = @"server-cert.pem"; @@ -191,30 +253,7 @@ class wolfSSL_Example_IOCallbacks return; } - StringBuilder ciphers = new StringBuilder(new String(' ', 4096)); - wolfssl.get_ciphers(ciphers, 4096); - Console.WriteLine("Ciphers : " + ciphers.ToString()); - - Console.Write("Setting cipher suite to "); - /* To use static PSK build wolfSSL with WOLFSSL_STATIC_PSK preprocessor flag */ - StringBuilder set_cipher = new StringBuilder("PSK-AES128-CBC-SHA256"); - Console.WriteLine(set_cipher); - if (wolfssl.CTX_set_cipher_list(ctx, set_cipher) != wolfssl.SUCCESS) - { - Console.WriteLine("Failed to set cipher suite"); - Console.WriteLine("If using static PSK make sure wolfSSL was built with preprocessor flag WOLFSSL_STATIC_PSK"); - wolfssl.CTX_free(ctx); - return; - } - - /* Test psk use */ - StringBuilder hint = new StringBuilder("cyassl server"); - if (wolfssl.CTX_use_psk_identity_hint(ctx, hint) != wolfssl.SUCCESS) - { - Console.WriteLine("Error setting hint"); - return; - } - wolfssl.CTX_set_psk_server_callback(ctx, psk_cb); + wolfssl.CTX_set_verify(ctx, wolfssl.SSL_VERIFY_PEER, verify_cb); /* Set using custom IO callbacks delegate memory is allocated when calling SetIO**** function and freed with ctx free diff --git a/wrapper/CSharp/wolfSSL_CSharp/X509.cs b/wrapper/CSharp/wolfSSL_CSharp/X509.cs new file mode 100644 index 000000000..72981a755 --- /dev/null +++ b/wrapper/CSharp/wolfSSL_CSharp/X509.cs @@ -0,0 +1,202 @@ +using System; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading; + +namespace wolfSSL.CSharp +{ + public class X509 + { + private const string wolfssl_dll = "wolfssl.dll"; + + [DllImport(wolfssl_dll, CallingConvention = CallingConvention.Cdecl)] + private extern static int wolfSSL_X509_get_pubkey_buffer(IntPtr x509, IntPtr buf, IntPtr bufSz); + [DllImport(wolfssl_dll, CallingConvention = CallingConvention.Cdecl)] + private extern static IntPtr wolfSSL_X509_get_der(IntPtr x509, IntPtr bufSz); + [DllImport(wolfssl_dll, CallingConvention = CallingConvention.Cdecl)] + private extern static void wolfSSL_X509_free(IntPtr x509); + [DllImport(wolfssl_dll, CallingConvention = CallingConvention.Cdecl)] + private extern static int wc_DerToPem(IntPtr der, int derSz, IntPtr pem, int pemSz, int type); + + + [DllImport(wolfssl_dll, CallingConvention = CallingConvention.Cdecl)] + private extern static IntPtr wolfSSL_X509_get_name_oneline(IntPtr x509Name, IntPtr buf, int bufSz); + [DllImport(wolfssl_dll, CallingConvention = CallingConvention.Cdecl)] + private extern static IntPtr wolfSSL_X509_get_subject_name(IntPtr x509); + [DllImport(wolfssl_dll, CallingConvention = CallingConvention.Cdecl)] + private extern static IntPtr wolfSSL_X509_get_issuer_name(IntPtr x509); + + private IntPtr x509; + private int type; + private bool isDynamic; + + /* public properties */ + public string Issuer; + public string Subject; + + + /* enum from wolfssl */ + private readonly int CERT_TYPE = 0; + + /// + /// Creates a new X509 class + /// + /// Pointer to wolfSSL structure + /// Should the lower level x509 be free'd? + public X509(IntPtr x509, bool isDynamic) + { + IntPtr ret; + + this.type = wolfssl.SSL_FILETYPE_PEM; + this.x509 = x509; + ret = wolfSSL_X509_get_name_oneline( + wolfSSL_X509_get_issuer_name(this.x509), IntPtr.Zero, 0); + this.Issuer = Marshal.PtrToStringAnsi(ret); + + ret = wolfSSL_X509_get_name_oneline( + wolfSSL_X509_get_subject_name(this.x509), IntPtr.Zero, 0); + this.Subject = Marshal.PtrToStringAnsi(ret); + } + + /// + /// Free up the C level WOLFSSL_X509 struct if needed + /// + ~X509() + { + if (this.isDynamic) + { + wolfSSL_X509_free(this.x509); + } + } + + + /// + /// Used for getting the public key buffer + /// + /// DER public key on success + public byte[] GetPublicKey() + { + if (this.x509 == IntPtr.Zero) + { + return null; + } + + try + { + IntPtr bufSz; + IntPtr buf; + + int keySz = 0; + int ret; + byte[] key = null; + + bufSz = Marshal.AllocHGlobal(4); /* pointer to 4 bytes */ + ret = wolfSSL_X509_get_pubkey_buffer(this.x509, IntPtr.Zero, bufSz); + if (ret == wolfssl.SUCCESS) + { + keySz = Marshal.ReadInt32(bufSz, 0); + buf = Marshal.AllocHGlobal(keySz); + ret = wolfSSL_X509_get_pubkey_buffer(this.x509, buf, bufSz); + if (ret == wolfssl.SUCCESS) + { + key = new byte[keySz]; + Marshal.Copy(buf, key, 0, keySz); + } + Marshal.FreeHGlobal(buf); + } + Marshal.FreeHGlobal(bufSz); + return key; + } + catch (Exception e) + { + wolfssl.log(wolfssl.ERROR_LOG, "error getting public key" + e.ToString()); + return null; + } + } + + /// + /// Gets the X509 buffer + /// + /// X509 buffer on success + public byte[] Export(int type) + { + if (this.x509 == IntPtr.Zero) + return null; + try + { + IntPtr bufSz; + IntPtr buf; + byte[] ret = null; + + bufSz = Marshal.AllocHGlobal(4); /* pointer to 4 bytes */ + buf = wolfSSL_X509_get_der(this.x509, bufSz); + if (buf != IntPtr.Zero) + { + int derSz = Marshal.ReadInt32(bufSz, 0); + if (type == wolfssl.SSL_FILETYPE_ASN1) + { + ret = new byte[derSz]; + Marshal.Copy(buf, ret, 0, derSz); + } + else if (type == wolfssl.SSL_FILETYPE_PEM) + { + int pemSz; + + pemSz = wc_DerToPem(buf, derSz, IntPtr.Zero, 0, CERT_TYPE); + if (pemSz > 0) + { + IntPtr pem = Marshal.AllocHGlobal(pemSz); + pemSz = wc_DerToPem(buf, derSz, pem, pemSz, CERT_TYPE); + ret = new byte[pemSz]; + Marshal.Copy(pem, ret, 0, pemSz); + Marshal.FreeHGlobal(pem); + } + + } + else + { + wolfssl.log(wolfssl.ERROR_LOG, "unsupported export type"); + } + Marshal.FreeHGlobal(bufSz); + return ret; + } + { + wolfssl.log(wolfssl.ERROR_LOG, "unable to get buffer"); + } + Marshal.FreeHGlobal(bufSz); + return ret; + } + catch (Exception e) + { + wolfssl.log(wolfssl.ERROR_LOG, "error getting x509 DER" + e.ToString()); + return null; + } + } + + /// + /// Gets the X509 buffer using this.type set (default PEM) + /// + /// X509 buffer on success + public byte[] Export() + { + return Export(this.type); + } + + /// + /// Gets the X509 format + /// + /// X509 format on success + public string GetFormat() + { + if (this.type == wolfssl.SSL_FILETYPE_PEM) + { + return "PEM"; + } + if (this.type == wolfssl.SSL_FILETYPE_ASN1) + { + return "DER"; + } + return "Unknown"; + } + } +} diff --git a/wrapper/CSharp/wolfSSL_CSharp/wolfSSL.cs b/wrapper/CSharp/wolfSSL_CSharp/wolfSSL.cs index 7acbe77ea..36e81b2b9 100644 --- a/wrapper/CSharp/wolfSSL_CSharp/wolfSSL.cs +++ b/wrapper/CSharp/wolfSSL_CSharp/wolfSSL.cs @@ -155,8 +155,8 @@ namespace wolfSSL.CSharp { } public void free() { - log(INFO_LOG, "freeing ssl handle"); - + log(INFO_LOG, "freeing ssl handle"); + if (!Object.Equals(this.fd_pin, default(GCHandle))) { this.fd_pin.Free(); @@ -298,13 +298,17 @@ namespace wolfSSL.CSharp { /******************************** * Error logging */ - [DllImport(wolfssl_dll, CallingConvention = CallingConvention.Cdecl, CharSet=CharSet.Ansi)] + [DllImport(wolfssl_dll, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] private extern static IntPtr wolfSSL_ERR_error_string(uint err, StringBuilder errOut); [DllImport(wolfssl_dll, CallingConvention = CallingConvention.Cdecl)] private extern static int wolfSSL_get_error(IntPtr ssl, int err); [UnmanagedFunctionPointer(CallingConvention.Cdecl)] public delegate void loggingCb(int lvl, StringBuilder msg); - private static loggingCb internal_log; + private static loggingCb internal_log; + [DllImport(wolfssl_dll, CallingConvention = CallingConvention.Cdecl)] + private extern static void wolfSSL_Debugging_ON(); + [DllImport(wolfssl_dll, CallingConvention = CallingConvention.Cdecl)] + private extern static void wolfSSL_Debugging_OFF(); /******************************** @@ -315,42 +319,58 @@ namespace wolfSSL.CSharp { [DllImport(wolfssl_dll, CallingConvention = CallingConvention.Cdecl)] private extern static int wolfSSL_SetTmpDH_file(IntPtr ssl, StringBuilder dhParam, int type); [DllImport(wolfssl_dll, CallingConvention = CallingConvention.Cdecl)] - private extern static int wolfSSL_CTX_SetTmpDH_file(IntPtr ctx, StringBuilder dhParam, int type); - - + private extern static int wolfSSL_CTX_SetTmpDH_file(IntPtr ctx, StringBuilder dhParam, int type); + + /******************************** * Verify Callback - */ + */ + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] public delegate int CallbackVerify_delegate(int ret, IntPtr x509_ctx); [DllImport(wolfssl_dll, CallingConvention = CallingConvention.Cdecl)] private extern static void wolfSSL_CTX_set_verify(IntPtr ctx, int mode, CallbackVerify_delegate vc); [DllImport(wolfssl_dll, CallingConvention = CallingConvention.Cdecl)] - private extern static void wolfSSL_set_verify(IntPtr ssl, int mode, CallbackVerify_delegate vc); + private extern static void wolfSSL_set_verify(IntPtr ssl, int mode, CallbackVerify_delegate vc); + + + /******************************** + * X509 Store + */ + [DllImport(wolfssl_dll, CallingConvention = CallingConvention.Cdecl)] + private extern static IntPtr wolfSSL_X509_STORE_CTX_get_current_cert(IntPtr x509Ctx); + [DllImport(wolfssl_dll, CallingConvention = CallingConvention.Cdecl)] + private extern static IntPtr wolfSSL_X509_STORE_GetCerts(IntPtr x509Ctx); + [DllImport(wolfssl_dll, CallingConvention = CallingConvention.Cdecl)] + private extern static int wolfSSL_sk_X509_num(IntPtr sk); + [DllImport(wolfssl_dll, CallingConvention = CallingConvention.Cdecl)] + private extern static void wolfSSL_sk_X509_free(IntPtr sk); + [DllImport(wolfssl_dll, CallingConvention = CallingConvention.Cdecl)] + private extern static IntPtr wolfSSL_sk_X509_pop(IntPtr sk); /******************************** * Enum types from wolfSSL library */ public static readonly int SSL_FILETYPE_PEM = 1; - public static readonly int SSL_FILETYPE_ASN1= 2; - public static readonly int SSL_FILETYPE_RAW = 3; - + public static readonly int SSL_FILETYPE_ASN1 = 2; + public static readonly int SSL_FILETYPE_RAW = 3; + public static readonly int SSL_VERIFY_NONE = 0; public static readonly int SSL_VERIFY_PEER = 1; public static readonly int SSL_VERIFY_FAIL_IF_NO_PEER_CERT = 2; public static readonly int SSL_VERIFY_CLIENT_ONCE = 4; public static readonly int SSL_VERIFY_FAIL_EXCEPT_PSK = 8; - public static readonly int CBIO_ERR_GENERAL = -1; - public static readonly int CBIO_ERR_WANT_READ = -2; + public static readonly int CBIO_ERR_GENERAL = -1; + public static readonly int CBIO_ERR_WANT_READ = -2; public static readonly int CBIO_ERR_WANT_WRITE = -2; - public static readonly int CBIO_ERR_CONN_RST = -3; - public static readonly int CBIO_ERR_ISR = -4; + public static readonly int CBIO_ERR_CONN_RST = -3; + public static readonly int CBIO_ERR_ISR = -4; public static readonly int CBIO_ERR_CONN_CLOSE = -5; - public static readonly int CBIO_ERR_TIMEOUT = -6; + public static readonly int CBIO_ERR_TIMEOUT = -6; public static readonly int ERROR_LOG = 0; - public static readonly int INFO_LOG = 1; + public static readonly int INFO_LOG = 1; public static readonly int ENTER_LOG = 2; public static readonly int LEAVE_LOG = 3; public static readonly int OTHER_LOG = 4; @@ -455,7 +475,7 @@ namespace wolfSSL.CSharp { Socket con = (System.Net.Sockets.Socket)gch.Target; Byte[] msg = new Byte[sz]; Marshal.Copy(buf, msg, 0, sz); - if (con.Send(msg, 0, msg.Length, SocketFlags.None) == 0 && sz !=0) + if (con.Send(msg, 0, msg.Length, SocketFlags.None) == 0 && sz != 0) { /* no data sent and msg size is larger then 0, check for lost connection */ if (con.Poll((con.SendTimeout > 0) ? con.SendTimeout : WC_WAIT, SelectMode.SelectWrite)) @@ -468,7 +488,7 @@ namespace wolfSSL.CSharp { } catch (Exception e) { - log(ERROR_LOG, "socket connection issue "+ e.ToString()); + log(ERROR_LOG, "socket connection issue " + e.ToString()); return wolfssl.CBIO_ERR_CONN_CLOSE; } } @@ -545,7 +565,7 @@ namespace wolfSSL.CSharp { catch (Exception e) { /* issue with receive or size of buffer */ - log(ERROR_LOG, "socket read issue "+ e.ToString()); + log(ERROR_LOG, "socket read issue " + e.ToString()); return wolfssl.CBIO_ERR_CONN_CLOSE; } } @@ -1130,16 +1150,16 @@ namespace wolfSSL.CSharp { if (ssl == IntPtr.Zero) { return FAILURE; - } - - try + } + + try { if (!fd.Equals(null)) { - GCHandle gch = GCHandle.FromIntPtr(ssl); + GCHandle gch = GCHandle.FromIntPtr(ssl); ssl_handle handles = (ssl_handle)gch.Target; - IntPtr sslCtx = handles.get_ssl(); - IntPtr ptr; + IntPtr sslCtx = handles.get_ssl(); + IntPtr ptr; GCHandle fd_pin = GCHandle.Alloc(fd); if (sslCtx == IntPtr.Zero) @@ -1857,7 +1877,92 @@ namespace wolfSSL.CSharp { log(ERROR_LOG, "wolfssl set verify error " + e.ToString()); return FAILURE; } - + } + + + /// + /// Set the certificate verification mode and optional callback function + /// + /// pointer to SSL object that the function is set in + /// See SSL_VERIFY options + /// Optional verify callback function to use + public static X509 X509_STORE_CTX_get_current_cert(IntPtr x509Ctx) + { + X509 ret = null; + try + { + if (x509Ctx == IntPtr.Zero) + { + log(ERROR_LOG, "pointer passed in was not set"); + return ret; + } + IntPtr x509 = wolfSSL_X509_STORE_CTX_get_current_cert(x509Ctx); + if (x509 != IntPtr.Zero) { + return new X509(x509, false); + } + return ret; + } + catch (Exception e) + { + log(ERROR_LOG, "wolfssl WOLFSSL_X509_STORE_CTX error " + e.ToString()); + return ret; + } + } + + + /// + /// Gets all of the certificates from store + /// + /// pointer to store to get certificates from + public static X509[] X509_STORE_CTX_get_certs(IntPtr x509Ctx) + { + X509[] ret = null; + try + { + if (x509Ctx == IntPtr.Zero) + { + log(ERROR_LOG, "pointer passed in was not set"); + return ret; + } + IntPtr sk = wolfSSL_X509_STORE_GetCerts(x509Ctx); + if (sk != IntPtr.Zero) { + int i; + int numCerts = wolfSSL_sk_X509_num(sk); + ret = new X509[numCerts]; + + for (i = 0; i < numCerts; i++) { + IntPtr current = wolfSSL_sk_X509_pop(sk); + if (current != IntPtr.Zero) + { + ret[i] = new X509(current, true); + } + } + wolfSSL_sk_X509_free(sk); + } + return ret; + + } + catch (Exception e) + { + log(ERROR_LOG, "wolfssl WOLFSSL_X509_STORE_CTX error " + e.ToString()); + return ret; + } + } + + /// + /// Print low level C library debug messages to stdout when compiled with macro DEBUG_WOLFSSL + /// + public static void Debugging_ON() + { + wolfSSL_Debugging_ON(); + } + + /// + /// Turn off low level C debug messages + /// + public static void Debugging_OFF() + { + wolfSSL_Debugging_OFF(); } /// diff --git a/wrapper/CSharp/wolfSSL_CSharp/wolfSSL_CSharp.csproj b/wrapper/CSharp/wolfSSL_CSharp/wolfSSL_CSharp.csproj index 128b84a37..6d5c854dc 100755 --- a/wrapper/CSharp/wolfSSL_CSharp/wolfSSL_CSharp.csproj +++ b/wrapper/CSharp/wolfSSL_CSharp/wolfSSL_CSharp.csproj @@ -59,6 +59,7 @@ + From d97c23edd821bfe9b9459f416fbf7d1813faf084 Mon Sep 17 00:00:00 2001 From: JacobBarthelmeh Date: Thu, 11 Jun 2020 12:46:21 -0700 Subject: [PATCH 209/298] set dynamic flag --- wrapper/CSharp/wolfSSL_CSharp/X509.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/wrapper/CSharp/wolfSSL_CSharp/X509.cs b/wrapper/CSharp/wolfSSL_CSharp/X509.cs index 72981a755..7f8c53b06 100644 --- a/wrapper/CSharp/wolfSSL_CSharp/X509.cs +++ b/wrapper/CSharp/wolfSSL_CSharp/X509.cs @@ -56,6 +56,7 @@ namespace wolfSSL.CSharp ret = wolfSSL_X509_get_name_oneline( wolfSSL_X509_get_subject_name(this.x509), IntPtr.Zero, 0); this.Subject = Marshal.PtrToStringAnsi(ret); + this.isDynamic = isDynamic; } /// From 3b86a4db203311e40388697399c6dbb60b5a2ffc Mon Sep 17 00:00:00 2001 From: David Garske Date: Mon, 8 Jun 2020 08:45:15 -0700 Subject: [PATCH 210/298] Adding STM32CubeIDE support (and deprecation of OpenSTM32). * Updated example to add support for CMSIS v2 and static memory. * Improved example to support more build options. * Added support for detecting Cube HAL and including `wolfSSL.wolfSSL_conf.h`. --- IDE/OPENSTM32/.cproject | 323 --------- IDE/OPENSTM32/.project | 27 - IDE/OPENSTM32/Inc/user_settings.h | 474 ------------- IDE/OPENSTM32/README.md | 58 -- IDE/OPENSTM32/Src/main.c | 353 ---------- IDE/OPENSTM32/include.am | 14 - IDE/OPENSTM32/wolfSTM32.cfg | 13 - IDE/OPENSTM32/wolfSTM32.ioc | 213 ------ IDE/OPENSTM32/wolfSTM32.xml | 9 - IDE/STM32Cube/Boards/STM32F407.ioc | 128 ++++ IDE/STM32Cube/Boards/STM32F437.ioc | 308 +++++++++ IDE/STM32Cube/Boards/STM32F777.ioc | 193 ++++++ IDE/STM32Cube/Boards/STM32L475.ioc | 636 +++++++++++++++++ IDE/STM32Cube/Boards/STM32L4A6.ioc | 170 +++++ IDE/STM32Cube/Boards/STM32L552.ioc | 267 +++++++ IDE/STM32Cube/Boards/STM32L562.ioc | 650 ++++++++++++++++++ IDE/STM32Cube/Boards/STM32WB55.ioc | 256 +++++++ IDE/STM32Cube/README.md | 63 ++ IDE/STM32Cube/include.am | 17 + IDE/STM32Cube/main.c | 366 ++++++++++ IDE/STM32Cube/wolfSSL.wolfSSL_conf.h | 538 +++++++++++++++ .../Src => STM32Cube}/wolfssl_example.c | 393 ++++++++--- .../Inc => STM32Cube}/wolfssl_example.h | 17 +- IDE/include.am | 2 +- sslSniffer/sslSnifferTest/snifftest.c | 4 +- wolfssl/wolfcrypt/settings.h | 3 + 26 files changed, 3919 insertions(+), 1576 deletions(-) delete mode 100644 IDE/OPENSTM32/.cproject delete mode 100644 IDE/OPENSTM32/.project delete mode 100644 IDE/OPENSTM32/Inc/user_settings.h delete mode 100644 IDE/OPENSTM32/README.md delete mode 100644 IDE/OPENSTM32/Src/main.c delete mode 100644 IDE/OPENSTM32/include.am delete mode 100644 IDE/OPENSTM32/wolfSTM32.cfg delete mode 100644 IDE/OPENSTM32/wolfSTM32.ioc delete mode 100644 IDE/OPENSTM32/wolfSTM32.xml create mode 100644 IDE/STM32Cube/Boards/STM32F407.ioc create mode 100644 IDE/STM32Cube/Boards/STM32F437.ioc create mode 100644 IDE/STM32Cube/Boards/STM32F777.ioc create mode 100644 IDE/STM32Cube/Boards/STM32L475.ioc create mode 100644 IDE/STM32Cube/Boards/STM32L4A6.ioc create mode 100644 IDE/STM32Cube/Boards/STM32L552.ioc create mode 100644 IDE/STM32Cube/Boards/STM32L562.ioc create mode 100644 IDE/STM32Cube/Boards/STM32WB55.ioc create mode 100644 IDE/STM32Cube/README.md create mode 100644 IDE/STM32Cube/include.am create mode 100644 IDE/STM32Cube/main.c create mode 100644 IDE/STM32Cube/wolfSSL.wolfSSL_conf.h rename IDE/{OPENSTM32/Src => STM32Cube}/wolfssl_example.c (85%) rename IDE/{OPENSTM32/Inc => STM32Cube}/wolfssl_example.h (90%) diff --git a/IDE/OPENSTM32/.cproject b/IDE/OPENSTM32/.cproject deleted file mode 100644 index 7b2bae139..000000000 --- a/IDE/OPENSTM32/.cproject +++ /dev/null @@ -1,323 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/IDE/OPENSTM32/.project b/IDE/OPENSTM32/.project deleted file mode 100644 index f4d367236..000000000 --- a/IDE/OPENSTM32/.project +++ /dev/null @@ -1,27 +0,0 @@ - - - wolfSTM32_CubeMX - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - fr.ac6.mcu.ide.core.MCUProjectNature - - diff --git a/IDE/OPENSTM32/Inc/user_settings.h b/IDE/OPENSTM32/Inc/user_settings.h deleted file mode 100644 index 1c4282fb0..000000000 --- a/IDE/OPENSTM32/Inc/user_settings.h +++ /dev/null @@ -1,474 +0,0 @@ -/* user_settings.h - * - * Copyright (C) 2006-2020 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * wolfSSL is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - -/* Example wolfSSL user settings for STM32F4 with CubeMX */ - -#ifndef WOLFSSL_USER_SETTINGS_H -#define WOLFSSL_USER_SETTINGS_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* ------------------------------------------------------------------------- */ -/* Platform */ -/* ------------------------------------------------------------------------- */ -#undef WOLFSSL_GENERAL_ALIGNMENT -#define WOLFSSL_GENERAL_ALIGNMENT 4 - -#undef SINGLE_THREADED -//#define SINGLE_THREADED - -#undef WOLFSSL_SMALL_STACK -#define WOLFSSL_SMALL_STACK - -#undef WOLFSSL_STM32F4 -#define WOLFSSL_STM32F4 - -#undef WOLFSSL_STM32_CUBEMX -#define WOLFSSL_STM32_CUBEMX - -#undef FREERTOS -#define FREERTOS - -#undef WOLFSSL_USER_IO -#define WOLFSSL_USER_IO - -#undef WOLFSSL_NO_SOCK -#define WOLFSSL_NO_SOCK - - -/* ------------------------------------------------------------------------- */ -/* HW Crypto Acceleration */ -/* ------------------------------------------------------------------------- */ -// See settings.h STM32F4 section -/* Optionally Disable Hardware Hashing Support */ -//#define NO_STM32_HASH -//#define NO_STM32_RNG -//#define NO_STM32_CRYPTO -//#define WOLFSSL_STM32_PKA /* WB55 and L5 only */ - - -/* ------------------------------------------------------------------------- */ -/* Math Configuration */ -/* ------------------------------------------------------------------------- */ -#undef USE_FAST_MATH -#define USE_FAST_MATH - -#ifdef USE_FAST_MATH - #undef TFM_TIMING_RESISTANT - #define TFM_TIMING_RESISTANT - - #undef TFM_NO_ASM - //#define TFM_NO_ASM - - /* Optimizations (TFM_ARM, TFM_ASM or none) */ - //#define TFM_ASM -#endif - -/* Wolf Single Precision Math */ -#undef WOLFSSL_SP -#if 0 - #define WOLFSSL_SP - #define WOLFSSL_SP_SMALL /* use smaller version of code */ - #define WOLFSSL_HAVE_SP_RSA - //#define WOLFSSL_HAVE_SP_DH - #define WOLFSSL_HAVE_SP_ECC - #define WOLFSSL_SP_CACHE_RESISTANT - #define WOLFSSL_SP_MATH /* only SP math - eliminates fast math code */ - - //#define WOLFSSL_SP_ASM /* required if using the ASM versions */ - //#define WOLFSSL_SP_ARM_CORTEX_M_ASM -#endif - - -/* ------------------------------------------------------------------------- */ -/* Crypto */ -/* ------------------------------------------------------------------------- */ -/* RSA */ -#undef NO_RSA -#if 1 - #ifdef USE_FAST_MATH - /* Maximum math bits (Max RSA key bits * 2) */ - #undef FP_MAX_BITS - #define FP_MAX_BITS 4096 - #endif - - /* half as much memory but twice as slow */ - #undef RSA_LOW_MEM - //#define RSA_LOW_MEM - - /* Enables blinding mode, to prevent timing attacks */ - #undef WC_RSA_BLINDING - #define WC_RSA_BLINDING - - /* RSA PSS Support (required for TLS v1.3)*/ - #if 0 - #define WC_RSA_PSS - #endif -#else - #define NO_RSA -#endif - -/* ECC */ -#if 1 - #undef HAVE_ECC - #define HAVE_ECC - - /* Manually define enabled curves */ - #undef ECC_USER_CURVES - #define ECC_USER_CURVES - - //#define HAVE_ECC192 - //#define HAVE_ECC224 - #undef NO_ECC256 - //#define HAVE_ECC384 - //#define HAVE_ECC521 - - /* Fixed point cache (speeds repeated operations against same private key) */ - #undef FP_ECC - //#define FP_ECC - #ifdef FP_ECC - /* Bits / Entries */ - #undef FP_ENTRIES - #define FP_ENTRIES 2 - #undef FP_LUT - #define FP_LUT 4 - #endif - - /* Optional ECC calculation method */ - /* Note: doubles heap usage, but slightly faster */ - #undef ECC_SHAMIR - #define ECC_SHAMIR - - /* Reduces heap usage, but slower */ - #undef ECC_TIMING_RESISTANT - #define ECC_TIMING_RESISTANT - - #ifdef USE_FAST_MATH - #ifdef NO_RSA - /* Custom fastmath size if not using RSA */ - /* MAX = ROUND32(ECC BITS 256) + SIZE_OF_MP_DIGIT(32) */ - #undef FP_MAX_BITS - #define FP_MAX_BITS (256 + 32) - #else - #undef ALT_ECC_SIZE - #define ALT_ECC_SIZE - #endif - - /* Enable TFM optimizations for ECC */ - //#define TFM_ECC192 - //#define TFM_ECC224 - #define TFM_ECC256 - //#define TFM_ECC384 - //#define TFM_ECC521 - #endif -#endif - -/* DH */ -#undef NO_DH -#if 0 - #define HAVE_DH /* freeRTOS settings.h requires this */ -#else - //#define NO_DH -#endif - -/* AES */ -#undef NO_AES -#if 1 - #undef HAVE_AESGCM - #define HAVE_AESGCM - - /* GCM Method: GCM_SMALL, GCM_WORD32 or GCM_TABLE */ - #undef GCM_SMALL - #define GCM_SMALL - - #undef WOLFSSL_AES_COUNTER - #define WOLFSSL_AES_COUNTER - - #undef WOLFSSL_AES_DIRECT - #define WOLFSSL_AES_DIRECT - - #undef HAVE_AES_ECB - #define HAVE_AES_ECB -#else - #define NO_AES -#endif - -/* DES */ -#undef NO_DES3 -#if 1 - -#else - #define NO_DES3 -#endif - -/* ChaCha20 / Poly1305 */ -#undef HAVE_CHACHA -#undef HAVE_POLY1305 -#if 1 - #define HAVE_CHACHA - #define HAVE_POLY1305 - - /* Needed for Poly1305 */ - #undef HAVE_ONE_TIME_AUTH - #define HAVE_ONE_TIME_AUTH -#endif - -/* Ed25519 / Curve25519 */ -#undef HAVE_CURVE25519 -#undef HAVE_ED25519 -#if 0 - #define HAVE_CURVE25519 - #define HAVE_ED25519 - - /* Optionally use small math (less flash usage, but much slower) */ - #if 0 - #define CURVED25519_SMALL - #endif -#endif - - -/* ------------------------------------------------------------------------- */ -/* Hashing */ -/* ------------------------------------------------------------------------- */ -/* Sha */ -#undef NO_SHA -#if 1 - /* 1k smaller, but 25% slower */ - //#define USE_SLOW_SHA -#else - #define NO_SHA -#endif - -/* Sha256 */ -#undef NO_SHA256 -#if 1 - /* not unrolled - ~2k smaller and ~25% slower */ - //#define USE_SLOW_SHA256 - - /* Sha224 */ - #if 0 - #define WOLFSSL_SHA224 - #endif -#else - #define NO_SHA256 -#endif - -/* Sha512 */ -#undef WOLFSSL_SHA512 -#if 1 - /* over twice as small, but 50% slower */ - //#define USE_SLOW_SHA512 - - #define WOLFSSL_SHA512 - #define HAVE_SHA512 /* freeRTOS settings.h requires this */ - - /* Sha384 */ - #undef WOLFSSL_SHA384 - #if 1 - #define WOLFSSL_SHA384 - #endif -#endif - -/* MD5 */ -#if 1 - /* enabled */ -#else - #define NO_MD5 -#endif - - -/* ------------------------------------------------------------------------- */ -/* Benchmark / Test */ -/* ------------------------------------------------------------------------- */ -/* Use reduced benchmark / test sizes */ -#undef BENCH_EMBEDDED -#define BENCH_EMBEDDED - -#undef USE_CERT_BUFFERS_2048 -#define USE_CERT_BUFFERS_2048 - -#undef USE_CERT_BUFFERS_256 -#define USE_CERT_BUFFERS_256 - - -/* ------------------------------------------------------------------------- */ -/* Debugging */ -/* ------------------------------------------------------------------------- */ -#undef DEBUG_WOLFSSL -//#define DEBUG_WOLFSSL - -#ifdef DEBUG_WOLFSSL - /* Use this to measure / print heap usage */ - #if 0 - #undef USE_WOLFSSL_MEMORY - #define USE_WOLFSSL_MEMORY - - #undef WOLFSSL_TRACK_MEMORY - #define WOLFSSL_TRACK_MEMORY - - #define WOLFSSL_DEBUG_MEMORY - #define WOLFSSL_DEBUG_MEMORY_PRINT - #endif -#else - #undef NO_WOLFSSL_MEMORY - //#define NO_WOLFSSL_MEMORY - - #undef NO_ERROR_STRINGS - //#define NO_ERROR_STRINGS -#endif - - -/* ------------------------------------------------------------------------- */ -/* Port */ -/* ------------------------------------------------------------------------- */ - -/* Override Current Time */ -/* Allows custom "custom_time()" function to be used for benchmark */ -#define WOLFSSL_USER_CURRTIME - - -/* ------------------------------------------------------------------------- */ -/* RNG */ -/* ------------------------------------------------------------------------- */ -/* Size of returned HW RNG value */ -#define NO_OLD_RNGNAME - -/* Choose RNG method */ -#if 1 - #ifndef STM32_RNG - #define WOLFSSL_GENSEED_FORTEST - #endif - - /* Use built-in P-RNG (SHA256 based) with HW RNG */ - /* P-RNG + HW RNG (P-RNG is ~8K) */ - #undef HAVE_HASHDRBG - #define HAVE_HASHDRBG -#else - /* Bypass P-RNG and use only HW RNG */ - extern int custom_rand_generate_block(unsigned char* output, unsigned int sz); - #undef CUSTOM_RAND_GENERATE_BLOCK - #define CUSTOM_RAND_GENERATE_BLOCK custom_rand_generate_block -#endif - - -/* ------------------------------------------------------------------------- */ -/* Enable Features */ -/* ------------------------------------------------------------------------- */ -#undef WOLFSSL_TLS13 -#if 0 - #define WOLFSSL_TLS13 -#endif - -#undef KEEP_PEER_CERT -//#define KEEP_PEER_CERT - -#undef HAVE_COMP_KEY -//#define HAVE_COMP_KEY - -#undef HAVE_TLS_EXTENSIONS -#define HAVE_TLS_EXTENSIONS - -#undef HAVE_SUPPORTED_CURVES -#define HAVE_SUPPORTED_CURVES - -#undef WOLFSSL_BASE64_ENCODE -//#define WOLFSSL_BASE64_ENCODE - -/* TLS Session Cache */ -#if 0 - #define SMALL_SESSION_CACHE -#else - #define NO_SESSION_CACHE -#endif - - -/* ------------------------------------------------------------------------- */ -/* Disable Features */ -/* ------------------------------------------------------------------------- */ -#undef NO_WOLFSSL_SERVER -//#define NO_WOLFSSL_SERVER - -#undef NO_WOLFSSL_CLIENT -//#define NO_WOLFSSL_CLIENT - -#undef NO_CRYPT_TEST -//#define NO_CRYPT_TEST - -#undef NO_CRYPT_BENCHMARK -//#define NO_CRYPT_BENCHMARK - -/* In-lining of misc.c functions */ -/* If defined, must include wolfcrypt/src/misc.c in build */ -/* Slower, but about 1k smaller */ -#undef NO_INLINE -//#define NO_INLINE - -#undef NO_FILESYSTEM -#define NO_FILESYSTEM - -#undef NO_WRITEV -#define NO_WRITEV - -#undef NO_MAIN_DRIVER -#define NO_MAIN_DRIVER - -#undef NO_DEV_RANDOM -#define NO_DEV_RANDOM - -#undef NO_DSA -#define NO_DSA - -#undef NO_RC4 -#define NO_RC4 - -#undef NO_OLD_TLS -#define NO_OLD_TLS - -#undef NO_HC128 -#define NO_HC128 - -#undef NO_RABBIT -#define NO_RABBIT - -#undef NO_PSK -#define NO_PSK - -#undef NO_MD4 -#define NO_MD4 - -#undef NO_PWDBASED -#define NO_PWDBASED - -#undef NO_CODING -//#define NO_CODING - -/* bypass certificate date checking, due to lack of properly configured RTC source */ -#undef NO_ASN_TIME -#define NO_ASN_TIME - - -#ifdef __cplusplus -} -#endif - -#endif /* WOLFSSL_USER_SETTINGS_H */ diff --git a/IDE/OPENSTM32/README.md b/IDE/OPENSTM32/README.md deleted file mode 100644 index 30adb473b..000000000 --- a/IDE/OPENSTM32/README.md +++ /dev/null @@ -1,58 +0,0 @@ -# wolfSSL STM32 Example for System Workbench for STM32 (Open STM32 Tools) - -This example includes: - -* wolfCrypt test -* wolfCrypt benchmark -* wolfSSL TLS client/server test using in-memory transfers - -These examples use the CubeMX Hal for STM32. If you'd like to use the older Standard Peripheral library undefine `WOLFSSL_STM32_CUBEMX` in `user_settings.h`. - -## Requirements - -* STM32CubeMX: STM32 CubeMX HAL code generation tool - [http://www.st.com/en/development-tools/stm32cubemx.html](http://www.st.com/en/development-tools/stm32cubemx.html) -* SystemWorkbench for STM32 - [http://www.st.com/en/development-tools/sw4stm32.html](http://www.st.com/en/development-tools/sw4stm32.html) - -## Setup - -1. Using the STM32CubeMX tool, load the `/IDE/OPENSTM32/wolfSTM32.ioc` file. -2. Adjust the HAL options based on your specific micro-controller. -3. Generate source code. -4. Run `SystemWorkbench` and choose a new workspace location for this project. -5. Import `wolfSTM32` project from `/IDE/OPENSTM32/`. -6. Adjust the micro-controller define in `Project Settings -> C/C++ General -> Paths and Symbols -> Symbols -> GNU C`. Example uses `STM32F437xx`, but should be changed to reflect your micro-controller type. -7. Build and Run - -If you hardware support crypto acceleration then: -1. Manually copy over the CubeMX HAL files for `stm32f4xx_hal_cryp.c`, `stm32f4xx_hal_cryp_ex.c`, `stm32f4xx_hal_cryp.h`, `stm32f4xx_hal_cryp_ex.h`. -2. Uncomment the `#define HAL_CRYP_MODULE_ENABLED` line in `stm32f4xx_hal_conf.h`. - -## Configuration - -The settings for the wolfSTM32 project are located in `/IDE/OPENSTM32/Inc/user_settings.h`. - -* To enable STM32F2 support define `WOLFSSL_STM32F2`. -* To enable STM32F4 support define `WOLFSSL_STM32F4`. -* To enable STM32F7 support define `WOLFSSL_STM32F7`. -* To enable STM32L4 support define `WOLFSSL_STM32L4`. - -If you are using FreeRTOS make sure your `FreeRTOSConfig.h` has its `configTOTAL_HEAP_SIZE` increased. - -The TLS client/server benchmark example requires about 76 KB for allocated tasks (with stack) and peak heap. - -## Example Output - -``` -....MENU - -.t. WolfCrypt Test -.b. WolfCrypt Benchmark -.l. WolfSSL TLS Bench -.e. Show Cipher List - -Please select one of the above options: -``` - -## Support - -For questions please email [support@wolfssl.com](mailto:support@wolfssl.com) diff --git a/IDE/OPENSTM32/Src/main.c b/IDE/OPENSTM32/Src/main.c deleted file mode 100644 index 70efb5a0a..000000000 --- a/IDE/OPENSTM32/Src/main.c +++ /dev/null @@ -1,353 +0,0 @@ -/* main.c - * - * Copyright (C) 2006-2020 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * wolfSSL is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - - -/* Includes ------------------------------------------------------------------*/ - -#include "wolfssl_example.h" - - -/* Private variables ---------------------------------------------------------*/ - -RNG_HandleTypeDef hrng; -RTC_HandleTypeDef hrtc; -SPI_HandleTypeDef hspi1; -UART_HandleTypeDef huart4; -CRYP_HandleTypeDef CrypHandle; -HASH_HandleTypeDef HashHandle; - -osThreadId defaultTaskHandle; - -int __errno; - -/* Private function prototypes -----------------------------------------------*/ -static void SystemClock_Config(void); -static void Error_Handler(void); - -static void MX_GPIO_Init(void); -static void MX_RNG_Init(void); -static void MX_RTC_Init(void); -static void MX_SPI1_Init(void); -static void MX_UART4_Init(void); - - -int main(void) -{ - /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ - HAL_Init(); - - /* Configure the system clock */ - SystemClock_Config(); - - /* Initialize all configured peripherals */ - MX_GPIO_Init(); - MX_RNG_Init(); - MX_RTC_Init(); - MX_SPI1_Init(); - MX_UART4_Init(); - -#ifndef FREERTOS - wolfCryptDemo(NULL); -#else - /* Create the thread(s) */ - /* definition and creation of defaultTask */ - osThreadDef(defaultTask, wolfCryptDemo, osPriorityNormal, 0, WOLF_EXAMPLES_STACK); - defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL); - - /* Start scheduler */ - osKernelStart(); - - /* We should never get here as control is now taken by the scheduler */ - - /* Infinite loop */ - while (1) {} -#endif -} - -/** System Clock Configuration -*/ -static void SystemClock_Config(void) -{ - - RCC_OscInitTypeDef RCC_OscInitStruct; - RCC_ClkInitTypeDef RCC_ClkInitStruct; - RCC_PeriphCLKInitTypeDef PeriphClkInitStruct; - - __HAL_RCC_PWR_CLK_ENABLE(); - - __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE3); - - RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE|RCC_OSCILLATORTYPE_LSE; - RCC_OscInitStruct.HSEState = RCC_HSE_ON; - RCC_OscInitStruct.LSEState = RCC_LSE_ON; - RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; - RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; - RCC_OscInitStruct.PLL.PLLM = 15; - RCC_OscInitStruct.PLL.PLLN = 144; - RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; - RCC_OscInitStruct.PLL.PLLQ = 5; - if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) - { - Error_Handler(); - } - - RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK - |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; - RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; - RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; - RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; - RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; - if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_3) != HAL_OK) - { - Error_Handler(); - } - - PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC; - PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE; - if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) - { - Error_Handler(); - } - - HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000); - - HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); - - /* SysTick_IRQn interrupt configuration */ - HAL_NVIC_SetPriority(SysTick_IRQn, 15, 0); -} - -/* RNG init function */ -static void MX_RNG_Init(void) -{ - - hrng.Instance = RNG; - if (HAL_RNG_Init(&hrng) != HAL_OK) - { - Error_Handler(); - } - -} - -/* RTC init function */ -#define RTC_ASYNCH_PREDIV 0x7F /* LSE as RTC clock */ -#define RTC_SYNCH_PREDIV 0x00FF /* LSE as RTC clock */ -static void MX_RTC_Init(void) -{ - - RTC_TimeTypeDef sTime; - RTC_DateTypeDef sDate; - - /**Initialize RTC and set the Time and Date - */ - hrtc.Instance = RTC; - hrtc.Init.HourFormat = RTC_HOURFORMAT_24; - hrtc.Init.AsynchPrediv = RTC_ASYNCH_PREDIV; - hrtc.Init.SynchPrediv = RTC_SYNCH_PREDIV; - hrtc.Init.OutPut = RTC_OUTPUT_DISABLE; - hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH; - hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN; - if (HAL_RTC_Init(&hrtc) != HAL_OK) - { - Error_Handler(); - } - - sTime.Hours = 0x0; - sTime.Minutes = 0x0; - sTime.Seconds = 0x0; - sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE; - sTime.StoreOperation = RTC_STOREOPERATION_RESET; - if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK) - { - Error_Handler(); - } - - sDate.WeekDay = RTC_WEEKDAY_MONDAY; - sDate.Month = RTC_MONTH_JANUARY; - sDate.Date = 0x1; - sDate.Year = 0x0; - - if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BCD) != HAL_OK) - { - Error_Handler(); - } - - /**Enable the TimeStamp - */ - if (HAL_RTCEx_SetTimeStamp(&hrtc, RTC_TIMESTAMPEDGE_RISING, RTC_TIMESTAMPPIN_DEFAULT) != HAL_OK) - { - Error_Handler(); - } - - /**Enable the reference Clock input - */ - if (HAL_RTCEx_SetRefClock(&hrtc) != HAL_OK) - { - Error_Handler(); - } -} - - -/* SPI1 init function */ -static void MX_SPI1_Init(void) -{ - - hspi1.Instance = SPI1; - hspi1.Init.Mode = SPI_MODE_MASTER; - hspi1.Init.Direction = SPI_DIRECTION_2LINES; - hspi1.Init.DataSize = SPI_DATASIZE_8BIT; - hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; - hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; - hspi1.Init.NSS = SPI_NSS_HARD_OUTPUT; - hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4; - hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; - hspi1.Init.TIMode = SPI_TIMODE_DISABLE; - hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; - hspi1.Init.CRCPolynomial = 10; - if (HAL_SPI_Init(&hspi1) != HAL_OK) - { - Error_Handler(); - } - -} - -/* UART4 init function */ -static void MX_UART4_Init(void) -{ - - huart4.Instance = UART4; - huart4.Init.BaudRate = 115200; - huart4.Init.WordLength = UART_WORDLENGTH_8B; - huart4.Init.StopBits = UART_STOPBITS_1; - huart4.Init.Parity = UART_PARITY_NONE; - huart4.Init.Mode = UART_MODE_TX_RX; - huart4.Init.HwFlowCtl = UART_HWCONTROL_NONE; - huart4.Init.OverSampling = UART_OVERSAMPLING_16; - if (HAL_UART_Init(&huart4) != HAL_OK) - { - Error_Handler(); - } - - // Turn off buffers, so I/O occurs immediately - setvbuf(stdin, NULL, _IONBF, 0); - setvbuf(stdout, NULL, _IONBF, 0); - setvbuf(stderr, NULL, _IONBF, 0); -} - -int _write (int fd, char *ptr, int len) -{ - (void)fd; - - /* Write "len" of char from "ptr" to file id "fd" - * Return number of char written. - * Need implementing with UART here. */ - HAL_UART_Transmit(&huart4, (uint8_t *)ptr, len, 0xFFFF); - - return len; -} - -int _read (int fd, char *ptr, int len) -{ - /* Read "len" of char to "ptr" from file id "fd" - * Return number of char read. - * Need implementing with UART here. */ - (void)fd; - - return HAL_UART_Receive(&huart4, (uint8_t*)ptr, len, 0xFFFF); -} - -void _ttywrch(int ch) { - /* Write one char "ch" to the default console - * Need implementing with UART here. */ - _write(0, (char*)&ch, 1); -} - - -/** Configure pins as - * Analog - * Input - * Output - * EVENT_OUT - * EXTI -*/ -static void MX_GPIO_Init(void) -{ - - /* GPIO Ports Clock Enable */ - __HAL_RCC_GPIOE_CLK_ENABLE(); - __HAL_RCC_GPIOG_CLK_ENABLE(); - __HAL_RCC_GPIOB_CLK_ENABLE(); - __HAL_RCC_GPIOA_CLK_ENABLE(); - __HAL_RCC_GPIOC_CLK_ENABLE(); - __HAL_RCC_GPIOH_CLK_ENABLE(); - -} - - -/** - * @brief Period elapsed callback in non blocking mode - * @note This function is called when TIM1 interrupt took place, inside - * HAL_TIM_IRQHandler(). It makes a direct call to HAL_IncTick() to increment - * a global variable "uwTick" used as application time base. - * @param htim : TIM handle - * @retval None - */ -void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) -{ - if (htim->Instance == TIM1) { - HAL_IncTick(); - } -} - -/** - * @brief This function is executed in case of error occurrence. - * @param None - * @retval None - */ -static void Error_Handler(void) -{ - /* USER CODE BEGIN Error_Handler */ - /* User can add his own implementation to report the HAL error return state */ - while(1) - { - } - /* USER CODE END Error_Handler */ -} - -#ifdef USE_FULL_ASSERT - -/** - * @brief Reports the name of the source file and the source line number - * where the assert_param error has occurred. - * @param file: pointer to the source file name - * @param line: assert_param error line source number - * @retval None - */ -void assert_failed(uint8_t* file, uint32_t line) -{ - /* USER CODE BEGIN 6 */ - /* User can add his own implementation to report the file name and line number, - ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ - /* USER CODE END 6 */ - -} - -#endif diff --git a/IDE/OPENSTM32/include.am b/IDE/OPENSTM32/include.am deleted file mode 100644 index 2c1835e0d..000000000 --- a/IDE/OPENSTM32/include.am +++ /dev/null @@ -1,14 +0,0 @@ -# vim:ft=automake -# included from Top Level Makefile.am -# All paths should be given relative to the root - -EXTRA_DIST+= IDE/OPENSTM32/README.md -EXTRA_DIST+= IDE/OPENSTM32/.cproject -EXTRA_DIST+= IDE/OPENSTM32/.project -EXTRA_DIST+= IDE/OPENSTM32/wolfSTM32.cfg -EXTRA_DIST+= IDE/OPENSTM32/wolfSTM32.ioc -EXTRA_DIST+= IDE/OPENSTM32/wolfSTM32.xml -EXTRA_DIST+= IDE/OPENSTM32/Src/main.c -EXTRA_DIST+= IDE/OPENSTM32/Src/wolfssl_example.c -EXTRA_DIST+= IDE/OPENSTM32/Inc/user_settings.h -EXTRA_DIST+= IDE/OPENSTM32/Inc/wolfssl_example.h diff --git a/IDE/OPENSTM32/wolfSTM32.cfg b/IDE/OPENSTM32/wolfSTM32.cfg deleted file mode 100644 index f9b02ce4c..000000000 --- a/IDE/OPENSTM32/wolfSTM32.cfg +++ /dev/null @@ -1,13 +0,0 @@ -# This is an wolfSTM32 board with a single STM32F437IIHx chip. -# Generated by System Workbench for STM32 - -source [find interface/stlink-v2-1.cfg] - -set WORKAREASIZE 0x30000 -transport select "hla_jtag" -set CPUTAPID 0x4ba00477 - -source [find target/stm32f4x_stlink.cfg] - -# use hardware reset, connect under reset -reset_config srst_only srst_nogate diff --git a/IDE/OPENSTM32/wolfSTM32.ioc b/IDE/OPENSTM32/wolfSTM32.ioc deleted file mode 100644 index d91e1d25c..000000000 --- a/IDE/OPENSTM32/wolfSTM32.ioc +++ /dev/null @@ -1,213 +0,0 @@ -#MicroXplorer Configuration settings - do not modify -FREERTOS.IPParameters=Tasks01 -FREERTOS.Tasks01=defaultTask,0,128,StartDefaultTask,Default -File.Version=6 -KeepUserPlacement=false -LWIP.Version=v1.5.0_RC0_20160211_Cube -Mcu.Family=STM32F4 -Mcu.IP0=CRC -Mcu.IP1=ETH -Mcu.IP2=FREERTOS -Mcu.IP3=LWIP -Mcu.IP4=NVIC -Mcu.IP5=RCC -Mcu.IP6=RNG -Mcu.IP7=RTC -Mcu.IP8=SYS -Mcu.IP9=UART4 -Mcu.IPNb=10 -Mcu.Name=STM32F437I(G-I)Hx -Mcu.Package=UFBGA176 -Mcu.Pin0=PE2 -Mcu.Pin1=PG14 -Mcu.Pin10=PC10 -Mcu.Pin11=PC13 -Mcu.Pin12=PC14/OSC32_IN -Mcu.Pin13=PC15/OSC32_OUT -Mcu.Pin14=PH2 -Mcu.Pin15=PH0/OSC_IN -Mcu.Pin16=PH3 -Mcu.Pin17=PH1/OSC_OUT -Mcu.Pin18=PC1 -Mcu.Pin19=PC2 -Mcu.Pin2=PG13 -Mcu.Pin20=PC3 -Mcu.Pin21=PH6 -Mcu.Pin22=PA1 -Mcu.Pin23=PC4 -Mcu.Pin24=PH7 -Mcu.Pin25=PA2 -Mcu.Pin26=PC5 -Mcu.Pin27=PA7 -Mcu.Pin28=PB15 -Mcu.Pin29=VP_CRC_VS_CRC -Mcu.Pin3=PB4 -Mcu.Pin30=VP_FREERTOS_VS_ENABLE -Mcu.Pin31=VP_LWIP_VS_Enabled -Mcu.Pin32=VP_RNG_VS_RNG -Mcu.Pin33=VP_SYS_VS_tim1 -Mcu.Pin4=PB3 -Mcu.Pin5=PA15 -Mcu.Pin6=PA14 -Mcu.Pin7=PA13 -Mcu.Pin8=PG11 -Mcu.Pin9=PC11 -Mcu.PinsNb=34 -Mcu.UserConstants= -Mcu.UserName=STM32F437IIHx -MxCube.Version=4.16.1 -MxDb.Version=DB.4.0.161 -NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false -NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false -NVIC.ETH_IRQn=true\:0\:0\:false\:false\:true\:false -NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false -NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:false -NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:false -NVIC.PendSV_IRQn=true\:15\:0\:false\:false\:false\:true -NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4 -NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:false\:false -NVIC.SysTick_IRQn=true\:15\:0\:false\:false\:true\:true -NVIC.TIM1_UP_TIM10_IRQn=true\:0\:0\:false\:false\:true\:false -NVIC.TimeBase=TIM1_UP_TIM10_IRQn -NVIC.TimeBaseIP=TIM1 -NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false -PA1.Mode=MII -PA1.Signal=ETH_RX_CLK -PA13.Mode=JTAG_5_pins -PA13.Signal=SYS_JTMS-SWDIO -PA14.Mode=JTAG_5_pins -PA14.Signal=SYS_JTCK-SWCLK -PA15.Mode=JTAG_5_pins -PA15.Signal=SYS_JTDI -PA2.Mode=MII -PA2.Signal=ETH_MDIO -PA7.Mode=MII -PA7.Signal=ETH_RX_DV -PB15.Mode=Reference_Clock_Detection_Activate -PB15.Signal=RTC_REFIN -PB3.Mode=JTAG_5_pins -PB3.Signal=SYS_JTDO-SWO -PB4.Mode=JTAG_5_pins -PB4.Signal=SYS_JTRST -PC1.Mode=MII -PC1.Signal=ETH_MDC -PC10.Mode=Asynchronous -PC10.Signal=UART4_TX -PC11.Mode=Asynchronous -PC11.Signal=UART4_RX -PC13.Mode=Timestamp enabled - Input Enabled to AF1 -PC13.Signal=RTC_AF1 -PC14/OSC32_IN.Mode=LSE-External-Oscillator -PC14/OSC32_IN.Signal=RCC_OSC32_IN -PC15/OSC32_OUT.Mode=LSE-External-Oscillator -PC15/OSC32_OUT.Signal=RCC_OSC32_OUT -PC2.Mode=MII -PC2.Signal=ETH_TXD2 -PC3.Mode=MII -PC3.Signal=ETH_TX_CLK -PC4.Mode=MII -PC4.Signal=ETH_RXD0 -PC5.Mode=MII -PC5.Signal=ETH_RXD1 -PCC.Checker=false -PCC.Line=STM32F427/437 -PCC.MCU=STM32F437I(G-I)Hx -PCC.MXVersion=4.16.1 -PCC.PartNumber=STM32F437IIHx -PCC.Seq0=0 -PCC.Series=STM32F4 -PCC.Temperature=25 -PCC.Vdd=null -PE2.Mode=MII -PE2.Signal=ETH_TXD3 -PG11.Mode=MII -PG11.Signal=ETH_TX_EN -PG13.Mode=MII -PG13.Signal=ETH_TXD0 -PG14.Mode=MII -PG14.Signal=ETH_TXD1 -PH0/OSC_IN.Mode=HSE-External-Oscillator -PH0/OSC_IN.Signal=RCC_OSC_IN -PH1/OSC_OUT.Mode=HSE-External-Oscillator -PH1/OSC_OUT.Signal=RCC_OSC_OUT -PH2.Mode=MII -PH2.Signal=ETH_CRS -PH3.Mode=MII -PH3.Signal=ETH_COL -PH6.Mode=MII -PH6.Signal=ETH_RXD2 -PH7.Mode=MII -PH7.Signal=ETH_RXD3 -ProjectManager.AskForMigrate=true -ProjectManager.BackupPrevious=false -ProjectManager.CompilerOptimize=2 -ProjectManager.ComputerToolchain=false -ProjectManager.CoupleFile=false -ProjectManager.DeletePrevious=true -ProjectManager.DeviceId=STM32F437IIHx -ProjectManager.FirmwarePackage=STM32Cube FW_F4 V1.13.0 -ProjectManager.FreePins=false -ProjectManager.HalAssertFull=false -ProjectManager.HeapSize=0x10000 -ProjectManager.KeepUserCode=true -ProjectManager.LastFirmware=true -ProjectManager.LibraryCopy=1 -ProjectManager.PreviousToolchain=SW4STM32 -ProjectManager.ProjectBuild=false -ProjectManager.ProjectFileName=wolfSTM32.ioc -ProjectManager.ProjectName=wolfSTM32 -ProjectManager.StackSize=0x4000 -ProjectManager.TargetToolchain=SW4STM32 -ProjectManager.ToolChainLocation= -ProjectManager.UnderRoot=true -ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false,2-MX_CRC_Init-CRC-false,3-MX_RNG_Init-RNG-false,4-MX_UART4_Init-UART4-false,5-MX_LWIP_Init-LWIP-false,6-MX_RTC_Init-RTC-false -RCC.48MHZClocksFreq_Value=48000000 -RCC.AHBFreq_Value=120000000 -RCC.APB1CLKDivider=RCC_HCLK_DIV4 -RCC.APB1Freq_Value=30000000 -RCC.APB1TimFreq_Value=60000000 -RCC.APB2CLKDivider=RCC_HCLK_DIV2 -RCC.APB2Freq_Value=60000000 -RCC.APB2TimFreq_Value=120000000 -RCC.CortexFreq_Value=120000000 -RCC.EthernetFreq_Value=120000000 -RCC.FCLKCortexFreq_Value=120000000 -RCC.FamilyName=M -RCC.HCLKFreq_Value=120000000 -RCC.HSE_VALUE=25000000 -RCC.HSI_VALUE=16000000 -RCC.I2SClocksFreq_Value=160000000 -RCC.IPParameters=48MHZClocksFreq_Value,AHBFreq_Value,APB1CLKDivider,APB1Freq_Value,APB1TimFreq_Value,APB2CLKDivider,APB2Freq_Value,APB2TimFreq_Value,CortexFreq_Value,EthernetFreq_Value,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI_VALUE,I2SClocksFreq_Value,LSI_VALUE,MCO2PinFreq_Value,PLLCLKFreq_Value,PLLM,PLLN,PLLQ,PLLQCLKFreq_Value,PLLSourceVirtual,RCC_RTC_Clock_Source,RTCFreq_Value,RTCHSEDivFreq_Value,SAI_AClocksFreq_Value,SAI_BClocksFreq_Value,SYSCLKFreq_VALUE,SYSCLKSource,VCOI2SOutputFreq_Value,VCOInputFreq_Value,VCOOutputFreq_Value,VCOSAIOutputFreq_Value,VCOSAIOutputFreq_ValueQ,VcooutputI2S,VcooutputI2SQ -RCC.LSI_VALUE=32000 -RCC.MCO2PinFreq_Value=120000000 -RCC.PLLCLKFreq_Value=120000000 -RCC.PLLM=15 -RCC.PLLN=144 -RCC.PLLQ=5 -RCC.PLLQCLKFreq_Value=48000000 -RCC.PLLSourceVirtual=RCC_PLLSOURCE_HSE -RCC.RCC_RTC_Clock_Source=RCC_RTCCLKSOURCE_LSE -RCC.RTCFreq_Value=32768 -RCC.RTCHSEDivFreq_Value=12500000 -RCC.SAI_AClocksFreq_Value=20416666.666666668 -RCC.SAI_BClocksFreq_Value=20416666.666666668 -RCC.SYSCLKFreq_VALUE=120000000 -RCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK -RCC.VCOI2SOutputFreq_Value=320000000 -RCC.VCOInputFreq_Value=1666666.6666666667 -RCC.VCOOutputFreq_Value=240000000 -RCC.VCOSAIOutputFreq_Value=81666666.66666667 -RCC.VCOSAIOutputFreq_ValueQ=20416666.666666668 -RCC.VcooutputI2S=160000000 -RCC.VcooutputI2SQ=160000000 -VP_CRC_VS_CRC.Mode=CRC_Activate -VP_CRC_VS_CRC.Signal=CRC_VS_CRC -VP_FREERTOS_VS_ENABLE.Mode=Enabled -VP_FREERTOS_VS_ENABLE.Signal=FREERTOS_VS_ENABLE -VP_LWIP_VS_Enabled.Mode=Enabled -VP_LWIP_VS_Enabled.Signal=LWIP_VS_Enabled -VP_RNG_VS_RNG.Mode=RNG_Activate -VP_RNG_VS_RNG.Signal=RNG_VS_RNG -VP_SYS_VS_tim1.Mode=TIM1 -VP_SYS_VS_tim1.Signal=SYS_VS_tim1 -board=wolfSTM32 diff --git a/IDE/OPENSTM32/wolfSTM32.xml b/IDE/OPENSTM32/wolfSTM32.xml deleted file mode 100644 index a45880924..000000000 --- a/IDE/OPENSTM32/wolfSTM32.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - wolfSTM32 - stm32f437iihx - JTAG - ST-LinkV2-1 - - diff --git a/IDE/STM32Cube/Boards/STM32F407.ioc b/IDE/STM32Cube/Boards/STM32F407.ioc new file mode 100644 index 000000000..64a41f67b --- /dev/null +++ b/IDE/STM32Cube/Boards/STM32F407.ioc @@ -0,0 +1,128 @@ +#MicroXplorer Configuration settings - do not modify +FREERTOS.FootprintOK=true +FREERTOS.IPParameters=Tasks01,configTOTAL_HEAP_SIZE,configUSE_MALLOC_FAILED_HOOK,configCHECK_FOR_STACK_OVERFLOW,FootprintOK +FREERTOS.Tasks01=defaultTask,24,128,StartDefaultTask,Default,NULL,Dynamic,NULL,NULL;wolfCrypt,8,8960,wolfCryptDemo,As external,NULL,Dynamic,NULL,NULL +FREERTOS.configCHECK_FOR_STACK_OVERFLOW=2 +FREERTOS.configTOTAL_HEAP_SIZE=122880 +FREERTOS.configUSE_MALLOC_FAILED_HOOK=1 +File.Version=6 +KeepUserPlacement=false +Mcu.Family=STM32F4 +Mcu.IP0=FREERTOS +Mcu.IP1=NVIC +Mcu.IP2=RCC +Mcu.IP3=RNG +Mcu.IP4=RTC +Mcu.IP5=SYS +Mcu.IP6=USART2 +Mcu.IPNb=7 +Mcu.Name=STM32F407V(E-G)Tx +Mcu.Package=LQFP100 +Mcu.Pin0=PA2 +Mcu.Pin1=PA3 +Mcu.Pin2=PC10 +Mcu.Pin3=PC11 +Mcu.Pin4=VP_FREERTOS_VS_CMSIS_V2 +Mcu.Pin5=VP_RNG_VS_RNG +Mcu.Pin6=VP_RTC_VS_RTC_Activate +Mcu.Pin7=VP_SYS_VS_tim1 +Mcu.Pin8=VP_wolfSSL.wolfSSL_VS_wolfSSLJjwolfSSL_4.4.1 +Mcu.PinsNb=9 +Mcu.ThirdParty0=wolfSSL.wolfSSL.4.4.1 +Mcu.ThirdPartyNb=1 +Mcu.UserConstants= +Mcu.UserName=STM32F407VGTx +MxCube.Version=5.6.1 +MxDb.Version=DB.5.0.60 +NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.ForceEnableDMAVector=true +NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.PendSV_IRQn=true\:15\:0\:false\:false\:false\:true\:false\:false +NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4 +NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:false\:false\:false\:false +NVIC.SysTick_IRQn=true\:15\:0\:false\:false\:false\:true\:false\:false +NVIC.TIM1_UP_TIM10_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:true +NVIC.TimeBase=TIM1_UP_TIM10_IRQn +NVIC.TimeBaseIP=TIM1 +NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +PA2.Mode=Asynchronous +PA2.Signal=USART2_TX +PA3.Mode=Asynchronous +PA3.Signal=USART2_RX +PC10.Locked=true +PC10.Signal=UART4_TX +PC11.Locked=true +PC11.Signal=UART4_RX +PinOutPanel.RotationAngle=0 +ProjectManager.AskForMigrate=true +ProjectManager.BackupPrevious=false +ProjectManager.CompilerOptimize=6 +ProjectManager.ComputerToolchain=false +ProjectManager.CoupleFile=false +ProjectManager.CustomerFirmwarePackage= +ProjectManager.DefaultFWLocation=true +ProjectManager.DeletePrevious=true +ProjectManager.DeviceId=STM32F407VGTx +ProjectManager.FirmwarePackage=STM32Cube FW_F4 V1.25.0 +ProjectManager.FreePins=false +ProjectManager.HalAssertFull=false +ProjectManager.HeapSize=0x200 +ProjectManager.KeepUserCode=true +ProjectManager.LastFirmware=true +ProjectManager.LibraryCopy=1 +ProjectManager.MainLocation=Core/Src +ProjectManager.NoMain=false +ProjectManager.PreviousToolchain= +ProjectManager.ProjectBuild=false +ProjectManager.ProjectFileName=STM32F407.ioc +ProjectManager.ProjectName=STM32F407 +ProjectManager.StackSize=0x400 +ProjectManager.TargetToolchain=STM32CubeIDE +ProjectManager.ToolChainLocation= +ProjectManager.UnderRoot=true +ProjectManager.functionlistsort=2-SystemClock_Config-RCC-false-HAL-false +RCC.AHBFreq_Value=16000000 +RCC.APB1Freq_Value=16000000 +RCC.APB2Freq_Value=16000000 +RCC.CortexFreq_Value=16000000 +RCC.FamilyName=M +RCC.HSE_VALUE=25000000 +RCC.HSI_VALUE=16000000 +RCC.I2SClocksFreq_Value=96000000 +RCC.IPParameters=AHBFreq_Value,APB1Freq_Value,APB2Freq_Value,CortexFreq_Value,FamilyName,HSE_VALUE,HSI_VALUE,I2SClocksFreq_Value,LSE_VALUE,LSI_VALUE,PLLCLKFreq_Value,PLLQCLKFreq_Value,RTCFreq_Value,RTCHSEDivFreq_Value,SYSCLKFreq_VALUE,VCOI2SOutputFreq_Value,VCOInputFreq_Value,VCOOutputFreq_Value,VcooutputI2S +RCC.LSE_VALUE=32768 +RCC.LSI_VALUE=32000 +RCC.PLLCLKFreq_Value=96000000 +RCC.PLLQCLKFreq_Value=48000000 +RCC.RTCFreq_Value=32000 +RCC.RTCHSEDivFreq_Value=12500000 +RCC.SYSCLKFreq_VALUE=16000000 +RCC.VCOI2SOutputFreq_Value=192000000 +RCC.VCOInputFreq_Value=1000000 +RCC.VCOOutputFreq_Value=192000000 +RCC.VcooutputI2S=96000000 +USART2.IPParameters=VirtualMode +USART2.VirtualMode=VM_ASYNC +VP_FREERTOS_VS_CMSIS_V2.Mode=CMSIS_V2 +VP_FREERTOS_VS_CMSIS_V2.Signal=FREERTOS_VS_CMSIS_V2 +VP_RNG_VS_RNG.Mode=RNG_Activate +VP_RNG_VS_RNG.Signal=RNG_VS_RNG +VP_RTC_VS_RTC_Activate.Mode=RTC_Enabled +VP_RTC_VS_RTC_Activate.Signal=RTC_VS_RTC_Activate +VP_SYS_VS_tim1.Mode=TIM1 +VP_SYS_VS_tim1.Signal=SYS_VS_tim1 +VP_wolfSSL.wolfSSL_VS_wolfSSLJjwolfSSL_4.4.1.Mode=wolfSSLJjwolfSSL +VP_wolfSSL.wolfSSL_VS_wolfSSLJjwolfSSL_4.4.1.Signal=wolfSSL.wolfSSL_VS_wolfSSLJjwolfSSL_4.4.1 +board=custom +wolfSSL.wolfSSL.4.4.1.IPParameters=wolfSSLCcwolfSSLJjwolfSSLJjCore,wolfSSLCcwolfSSLJjwolfCryptJjCore,wolfSSLCcwolfSSLJjwolfCryptJjTest,WOLF_CONF_MATH,WOLF_CONF_RTOS +wolfSSL.wolfSSL.4.4.1.WOLF_CONF_MATH=4 +wolfSSL.wolfSSL.4.4.1.WOLF_CONF_RTOS=2 +wolfSSL.wolfSSL.4.4.1.wolfSSLCcwolfSSLJjwolfCryptJjCore=true +wolfSSL.wolfSSL.4.4.1.wolfSSLCcwolfSSLJjwolfCryptJjTest=true +wolfSSL.wolfSSL.4.4.1.wolfSSLCcwolfSSLJjwolfSSLJjCore=true +wolfSSL.wolfSSL.4.4.1.wolfSSLJjwolfSSL_Checked=true +wolfSSL.wolfSSL.4.4.1_SwParameter=wolfSSLCcwolfSSLJjwolfCryptJjCore\:true;wolfSSLCcwolfSSLJjwolfCryptJjTest\:true;wolfSSLCcwolfSSLJjwolfSSLJjCore\:true; +isbadioc=false diff --git a/IDE/STM32Cube/Boards/STM32F437.ioc b/IDE/STM32Cube/Boards/STM32F437.ioc new file mode 100644 index 000000000..61da0ee11 --- /dev/null +++ b/IDE/STM32Cube/Boards/STM32F437.ioc @@ -0,0 +1,308 @@ +#MicroXplorer Configuration settings - do not modify +FREERTOS.FootprintOK=true +FREERTOS.IPParameters=Tasks01,configTOTAL_HEAP_SIZE,configUSE_MALLOC_FAILED_HOOK,configCHECK_FOR_STACK_OVERFLOW,FootprintOK +FREERTOS.Tasks01=defaultTask,24,128,StartDefaultTask,Default,NULL,Dynamic,NULL,NULL;wolfCrypt,8,8960,wolfCryptDemo,As external,NULL,Dynamic,NULL,NULL +FREERTOS.configCHECK_FOR_STACK_OVERFLOW=2 +FREERTOS.configTOTAL_HEAP_SIZE=131072 +FREERTOS.configUSE_MALLOC_FAILED_HOOK=1 +File.Version=6 +KeepUserPlacement=false +Mcu.Family=STM32F4 +Mcu.IP0=CRYP +Mcu.IP1=FMC +Mcu.IP2=FREERTOS +Mcu.IP3=HASH +Mcu.IP4=NVIC +Mcu.IP5=RCC +Mcu.IP6=RNG +Mcu.IP7=RTC +Mcu.IP8=SYS +Mcu.IP9=UART4 +Mcu.IPNb=10 +Mcu.Name=STM32F437I(G-I)Hx +Mcu.Package=UFBGA176 +Mcu.Pin0=PE3 +Mcu.Pin1=PD7 +Mcu.Pin10=PF1 +Mcu.Pin11=PF3 +Mcu.Pin12=PF4 +Mcu.Pin13=PF5 +Mcu.Pin14=PG5 +Mcu.Pin15=PG4 +Mcu.Pin16=PG3 +Mcu.Pin17=PD15 +Mcu.Pin18=PG2 +Mcu.Pin19=PG1 +Mcu.Pin2=PD0 +Mcu.Pin20=PD14 +Mcu.Pin21=PD13 +Mcu.Pin22=PF13 +Mcu.Pin23=PG0 +Mcu.Pin24=PE13 +Mcu.Pin25=PD12 +Mcu.Pin26=PD11 +Mcu.Pin27=PD10 +Mcu.Pin28=PF12 +Mcu.Pin29=PF15 +Mcu.Pin3=PC11 +Mcu.Pin30=PE8 +Mcu.Pin31=PE9 +Mcu.Pin32=PE11 +Mcu.Pin33=PE14 +Mcu.Pin34=PD9 +Mcu.Pin35=PD8 +Mcu.Pin36=PF14 +Mcu.Pin37=PE7 +Mcu.Pin38=PE10 +Mcu.Pin39=PE12 +Mcu.Pin4=PC10 +Mcu.Pin40=PE15 +Mcu.Pin41=VP_CRYP_VS_CRYP +Mcu.Pin42=VP_FREERTOS_VS_CMSIS_V2 +Mcu.Pin43=VP_HASH_VS_HASH +Mcu.Pin44=VP_RNG_VS_RNG +Mcu.Pin45=VP_RTC_VS_RTC_Activate +Mcu.Pin46=VP_RTC_VS_RTC_Calendar +Mcu.Pin47=VP_SYS_VS_tim1 +Mcu.Pin48=VP_wolfSSL.wolfSSL_VS_wolfSSLJjwolfSSL_4.4.1 +Mcu.Pin5=PD5 +Mcu.Pin6=PD1 +Mcu.Pin7=PD4 +Mcu.Pin8=PF0 +Mcu.Pin9=PF2 +Mcu.PinsNb=49 +Mcu.ThirdParty0=wolfSSL.wolfSSL.4.4.1 +Mcu.ThirdPartyNb=1 +Mcu.UserConstants= +Mcu.UserName=STM32F437IIHx +MxCube.Version=5.6.1 +MxDb.Version=DB.5.0.60 +NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.ForceEnableDMAVector=true +NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.PendSV_IRQn=true\:15\:0\:false\:false\:false\:true\:false\:false +NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4 +NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:false\:false\:false\:false +NVIC.SysTick_IRQn=true\:15\:0\:false\:false\:false\:true\:false\:false +NVIC.TIM1_UP_TIM10_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:true +NVIC.TimeBase=TIM1_UP_TIM10_IRQn +NVIC.TimeBaseIP=TIM1 +NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +PC10.Mode=Asynchronous +PC10.Signal=UART4_TX +PC11.Mode=Asynchronous +PC11.Signal=UART4_RX +PD0.Signal=FMC_D2_DA2 +PD1.Signal=FMC_D3_DA3 +PD10.Signal=FMC_D15_DA15 +PD11.Signal=FMC_A16_CLE +PD12.Signal=FMC_A17_ALE +PD13.Signal=FMC_A18 +PD14.Signal=FMC_D0_DA0 +PD15.Signal=FMC_D1_DA1 +PD4.Signal=FMC_NOE +PD5.Signal=FMC_NWE +PD7.Mode=NorPsramChipSelect1_1 +PD7.Signal=FMC_NE1 +PD8.Signal=FMC_D13_DA13 +PD9.Signal=FMC_D14_DA14 +PE10.Signal=FMC_D7_DA7 +PE11.Signal=FMC_D8_DA8 +PE12.Signal=FMC_D9_DA9 +PE13.Signal=FMC_D10_DA10 +PE14.Signal=FMC_D11_DA11 +PE15.Signal=FMC_D12_DA12 +PE3.Signal=FMC_A19 +PE7.Signal=FMC_D4_DA4 +PE8.Signal=FMC_D5_DA5 +PE9.Signal=FMC_D6_DA6 +PF0.Signal=FMC_A0 +PF1.Signal=FMC_A1 +PF12.Signal=FMC_A6 +PF13.Signal=FMC_A7 +PF14.Signal=FMC_A8 +PF15.Signal=FMC_A9 +PF2.Signal=FMC_A2 +PF3.Signal=FMC_A3 +PF4.Signal=FMC_A4 +PF5.Signal=FMC_A5 +PG0.Signal=FMC_A10 +PG1.Signal=FMC_A11 +PG2.Signal=FMC_A12 +PG3.Signal=FMC_A13 +PG4.Signal=FMC_A14_BA0 +PG5.Signal=FMC_A15_BA1 +PinOutPanel.CurrentBGAView=Top +PinOutPanel.RotationAngle=0 +ProjectManager.AskForMigrate=true +ProjectManager.BackupPrevious=false +ProjectManager.CompilerOptimize=6 +ProjectManager.ComputerToolchain=false +ProjectManager.CoupleFile=false +ProjectManager.CustomerFirmwarePackage= +ProjectManager.DefaultFWLocation=true +ProjectManager.DeletePrevious=true +ProjectManager.DeviceId=STM32F437IIHx +ProjectManager.FirmwarePackage=STM32Cube FW_F4 V1.25.0 +ProjectManager.FreePins=false +ProjectManager.HalAssertFull=false +ProjectManager.HeapSize=0x2000 +ProjectManager.KeepUserCode=true +ProjectManager.LastFirmware=true +ProjectManager.LibraryCopy=1 +ProjectManager.MainLocation=Core/Src +ProjectManager.NoMain=false +ProjectManager.PreviousToolchain= +ProjectManager.ProjectBuild=false +ProjectManager.ProjectFileName=STM32F437.ioc +ProjectManager.ProjectName=STM32F437 +ProjectManager.StackSize=0x4000 +ProjectManager.TargetToolchain=STM32CubeIDE +ProjectManager.ToolChainLocation= +ProjectManager.UnderRoot=true +ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-SystemClock_Config-RCC-false-HAL-false,3-MX_CRYP_Init-CRYP-false-HAL-true,4-MX_HASH_Init-HASH-false-HAL-true,5-MX_RNG_Init-RNG-false-HAL-true,6-MX_UART4_Init-UART4-false-HAL-true,7-MX_RTC_Init-RTC-false-HAL-true,8-MX_FMC_Init-FMC-false-HAL-true +RCC.48MHZClocksFreq_Value=45714285.71428572 +RCC.AHBFreq_Value=160000000 +RCC.APB1CLKDivider=RCC_HCLK_DIV4 +RCC.APB1Freq_Value=40000000 +RCC.APB1TimFreq_Value=80000000 +RCC.APB2CLKDivider=RCC_HCLK_DIV2 +RCC.APB2Freq_Value=80000000 +RCC.APB2TimFreq_Value=160000000 +RCC.CortexFreq_Value=160000000 +RCC.EthernetFreq_Value=160000000 +RCC.FCLKCortexFreq_Value=160000000 +RCC.FamilyName=M +RCC.HCLKFreq_Value=160000000 +RCC.HSE_VALUE=25000000 +RCC.HSI_VALUE=16000000 +RCC.I2SClocksFreq_Value=192000000 +RCC.IPParameters=48MHZClocksFreq_Value,AHBFreq_Value,APB1CLKDivider,APB1Freq_Value,APB1TimFreq_Value,APB2CLKDivider,APB2Freq_Value,APB2TimFreq_Value,CortexFreq_Value,EthernetFreq_Value,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI_VALUE,I2SClocksFreq_Value,LSE_VALUE,LSI_VALUE,MCO2PinFreq_Value,PLLCLKFreq_Value,PLLM,PLLN,PLLQ,PLLQCLKFreq_Value,RTCFreq_Value,RTCHSEDivFreq_Value,SAI_AClocksFreq_Value,SAI_BClocksFreq_Value,SYSCLKFreq_VALUE,SYSCLKSource,VCOI2SOutputFreq_Value,VCOInputFreq_Value,VCOOutputFreq_Value,VCOSAIOutputFreq_Value,VCOSAIOutputFreq_ValueQ,VcooutputI2S,VcooutputI2SQ +RCC.LSE_VALUE=32768 +RCC.LSI_VALUE=32000 +RCC.MCO2PinFreq_Value=160000000 +RCC.PLLCLKFreq_Value=160000000 +RCC.PLLM=8 +RCC.PLLN=160 +RCC.PLLQ=7 +RCC.PLLQCLKFreq_Value=45714285.71428572 +RCC.RTCFreq_Value=32000 +RCC.RTCHSEDivFreq_Value=12500000 +RCC.SAI_AClocksFreq_Value=24500000 +RCC.SAI_BClocksFreq_Value=24500000 +RCC.SYSCLKFreq_VALUE=160000000 +RCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK +RCC.VCOI2SOutputFreq_Value=384000000 +RCC.VCOInputFreq_Value=2000000 +RCC.VCOOutputFreq_Value=320000000 +RCC.VCOSAIOutputFreq_Value=98000000 +RCC.VCOSAIOutputFreq_ValueQ=24500000 +RCC.VcooutputI2S=192000000 +RCC.VcooutputI2SQ=192000000 +SH.FMC_A0.0=FMC_A0,20b-a1 +SH.FMC_A0.ConfNb=1 +SH.FMC_A1.0=FMC_A1,20b-a1 +SH.FMC_A1.ConfNb=1 +SH.FMC_A10.0=FMC_A10,20b-a1 +SH.FMC_A10.ConfNb=1 +SH.FMC_A11.0=FMC_A11,20b-a1 +SH.FMC_A11.ConfNb=1 +SH.FMC_A12.0=FMC_A12,20b-a1 +SH.FMC_A12.ConfNb=1 +SH.FMC_A13.0=FMC_A13,20b-a1 +SH.FMC_A13.ConfNb=1 +SH.FMC_A14_BA0.0=FMC_A14,20b-a1 +SH.FMC_A14_BA0.ConfNb=1 +SH.FMC_A15_BA1.0=FMC_A15,20b-a1 +SH.FMC_A15_BA1.ConfNb=1 +SH.FMC_A16_CLE.0=FMC_A16,20b-a1 +SH.FMC_A16_CLE.ConfNb=1 +SH.FMC_A17_ALE.0=FMC_A17,20b-a1 +SH.FMC_A17_ALE.ConfNb=1 +SH.FMC_A18.0=FMC_A18,20b-a1 +SH.FMC_A18.ConfNb=1 +SH.FMC_A19.0=FMC_A19,20b-a1 +SH.FMC_A19.ConfNb=1 +SH.FMC_A2.0=FMC_A2,20b-a1 +SH.FMC_A2.ConfNb=1 +SH.FMC_A3.0=FMC_A3,20b-a1 +SH.FMC_A3.ConfNb=1 +SH.FMC_A4.0=FMC_A4,20b-a1 +SH.FMC_A4.ConfNb=1 +SH.FMC_A5.0=FMC_A5,20b-a1 +SH.FMC_A5.ConfNb=1 +SH.FMC_A6.0=FMC_A6,20b-a1 +SH.FMC_A6.ConfNb=1 +SH.FMC_A7.0=FMC_A7,20b-a1 +SH.FMC_A7.ConfNb=1 +SH.FMC_A8.0=FMC_A8,20b-a1 +SH.FMC_A8.ConfNb=1 +SH.FMC_A9.0=FMC_A9,20b-a1 +SH.FMC_A9.ConfNb=1 +SH.FMC_D0_DA0.0=FMC_D0,16b-d1 +SH.FMC_D0_DA0.ConfNb=1 +SH.FMC_D10_DA10.0=FMC_D10,16b-d1 +SH.FMC_D10_DA10.ConfNb=1 +SH.FMC_D11_DA11.0=FMC_D11,16b-d1 +SH.FMC_D11_DA11.ConfNb=1 +SH.FMC_D12_DA12.0=FMC_D12,16b-d1 +SH.FMC_D12_DA12.ConfNb=1 +SH.FMC_D13_DA13.0=FMC_D13,16b-d1 +SH.FMC_D13_DA13.ConfNb=1 +SH.FMC_D14_DA14.0=FMC_D14,16b-d1 +SH.FMC_D14_DA14.ConfNb=1 +SH.FMC_D15_DA15.0=FMC_D15,16b-d1 +SH.FMC_D15_DA15.ConfNb=1 +SH.FMC_D1_DA1.0=FMC_D1,16b-d1 +SH.FMC_D1_DA1.ConfNb=1 +SH.FMC_D2_DA2.0=FMC_D2,16b-d1 +SH.FMC_D2_DA2.ConfNb=1 +SH.FMC_D3_DA3.0=FMC_D3,16b-d1 +SH.FMC_D3_DA3.ConfNb=1 +SH.FMC_D4_DA4.0=FMC_D4,16b-d1 +SH.FMC_D4_DA4.ConfNb=1 +SH.FMC_D5_DA5.0=FMC_D5,16b-d1 +SH.FMC_D5_DA5.ConfNb=1 +SH.FMC_D6_DA6.0=FMC_D6,16b-d1 +SH.FMC_D6_DA6.ConfNb=1 +SH.FMC_D7_DA7.0=FMC_D7,16b-d1 +SH.FMC_D7_DA7.ConfNb=1 +SH.FMC_D8_DA8.0=FMC_D8,16b-d1 +SH.FMC_D8_DA8.ConfNb=1 +SH.FMC_D9_DA9.0=FMC_D9,16b-d1 +SH.FMC_D9_DA9.ConfNb=1 +SH.FMC_NOE.0=FMC_NOE,Sram1 +SH.FMC_NOE.ConfNb=1 +SH.FMC_NWE.0=FMC_NWE,Sram1 +SH.FMC_NWE.ConfNb=1 +UART4.IPParameters=VirtualMode +UART4.VirtualMode=Asynchronous +VP_CRYP_VS_CRYP.Mode=CRYP_Activate +VP_CRYP_VS_CRYP.Signal=CRYP_VS_CRYP +VP_FREERTOS_VS_CMSIS_V2.Mode=CMSIS_V2 +VP_FREERTOS_VS_CMSIS_V2.Signal=FREERTOS_VS_CMSIS_V2 +VP_HASH_VS_HASH.Mode=HASH_Activate +VP_HASH_VS_HASH.Signal=HASH_VS_HASH +VP_RNG_VS_RNG.Mode=RNG_Activate +VP_RNG_VS_RNG.Signal=RNG_VS_RNG +VP_RTC_VS_RTC_Activate.Mode=RTC_Enabled +VP_RTC_VS_RTC_Activate.Signal=RTC_VS_RTC_Activate +VP_RTC_VS_RTC_Calendar.Mode=RTC_Calendar +VP_RTC_VS_RTC_Calendar.Signal=RTC_VS_RTC_Calendar +VP_SYS_VS_tim1.Mode=TIM1 +VP_SYS_VS_tim1.Signal=SYS_VS_tim1 +VP_wolfSSL.wolfSSL_VS_wolfSSLJjwolfSSL_4.4.1.Mode=wolfSSLJjwolfSSL +VP_wolfSSL.wolfSSL_VS_wolfSSLJjwolfSSL_4.4.1.Signal=wolfSSL.wolfSSL_VS_wolfSSLJjwolfSSL_4.4.1 +board=custom +wolfSSL.wolfSSL.4.4.1.IPParameters=wolfSSLCcwolfSSLJjwolfSSLJjCore,wolfSSLCcwolfSSLJjwolfCryptJjTest,WOLFCRYPT_ONLY,WOLF_CONF_MATH,WOLF_CONF_RTOS +wolfSSL.wolfSSL.4.4.1.WOLFCRYPT_ONLY=False +wolfSSL.wolfSSL.4.4.1.WOLF_CONF_MATH=4 +wolfSSL.wolfSSL.4.4.1.WOLF_CONF_RTOS=2 +wolfSSL.wolfSSL.4.4.1.wolfSSLCcwolfSSLJjwolfCryptJjTest=true +wolfSSL.wolfSSL.4.4.1.wolfSSLCcwolfSSLJjwolfSSLJjCore=true +wolfSSL.wolfSSL.4.4.1.wolfSSLJjwolfSSL_Checked=true +wolfSSL.wolfSSL.4.4.1_SwParameter=wolfSSLCcwolfSSLJjwolfCryptJjTest\:true;wolfSSLCcwolfSSLJjwolfSSLJjCore\:true; +isbadioc=false diff --git a/IDE/STM32Cube/Boards/STM32F777.ioc b/IDE/STM32Cube/Boards/STM32F777.ioc new file mode 100644 index 000000000..1b3eda7e9 --- /dev/null +++ b/IDE/STM32Cube/Boards/STM32F777.ioc @@ -0,0 +1,193 @@ +#MicroXplorer Configuration settings - do not modify +FREERTOS.FootprintOK=true +FREERTOS.IPParameters=Tasks01,configTOTAL_HEAP_SIZE,configUSE_MALLOC_FAILED_HOOK,configCHECK_FOR_STACK_OVERFLOW,FootprintOK +FREERTOS.Tasks01=defaultTask,24,128,StartDefaultTask,Default,NULL,Dynamic,NULL,NULL;wolfCrypt,8,8960,wolfCryptDemo,As external,NULL,Dynamic,NULL,NULL +FREERTOS.configCHECK_FOR_STACK_OVERFLOW=2 +FREERTOS.configTOTAL_HEAP_SIZE=131072 +FREERTOS.configUSE_MALLOC_FAILED_HOOK=1 +File.Version=6 +KeepUserPlacement=false +Mcu.Family=STM32F7 +Mcu.IP0=CORTEX_M7 +Mcu.IP1=CRYP +Mcu.IP10=USART3 +Mcu.IP2=FREERTOS +Mcu.IP3=HASH +Mcu.IP4=NVIC +Mcu.IP5=RCC +Mcu.IP6=RNG +Mcu.IP7=RTC +Mcu.IP8=SYS +Mcu.IP9=USART2 +Mcu.IPNb=11 +Mcu.Name=STM32F777NIHx +Mcu.Package=TFBGA216 +Mcu.Pin0=PD6 +Mcu.Pin1=PI8 +Mcu.Pin10=VP_RTC_VS_RTC_Calendar +Mcu.Pin11=VP_SYS_VS_tim1 +Mcu.Pin12=VP_wolfSSL.wolfSSL_VS_wolfSSLJjwolfSSL_4.4.1 +Mcu.Pin2=PD5 +Mcu.Pin3=PD9 +Mcu.Pin4=PD8 +Mcu.Pin5=VP_CRYP_VS_CRYP +Mcu.Pin6=VP_FREERTOS_VS_CMSIS_V2 +Mcu.Pin7=VP_HASH_VS_HASH +Mcu.Pin8=VP_RNG_VS_RNG +Mcu.Pin9=VP_RTC_VS_RTC_Activate +Mcu.PinsNb=13 +Mcu.ThirdParty0=wolfSSL.wolfSSL.4.4.1 +Mcu.ThirdPartyNb=1 +Mcu.UserConstants= +Mcu.UserName=STM32F777NIHx +MxCube.Version=5.6.1 +MxDb.Version=DB.5.0.60 +NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.ForceEnableDMAVector=true +NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.PendSV_IRQn=true\:15\:0\:false\:false\:false\:true\:false\:false +NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4 +NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:false\:false\:false\:false +NVIC.SysTick_IRQn=true\:15\:0\:false\:false\:false\:true\:false\:false +NVIC.TIM1_UP_TIM10_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:true +NVIC.TimeBase=TIM1_UP_TIM10_IRQn +NVIC.TimeBaseIP=TIM1 +NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +PD5.Mode=Asynchronous +PD5.Signal=USART2_TX +PD6.Mode=Asynchronous +PD6.Signal=USART2_RX +PD8.Locked=true +PD8.Mode=Asynchronous +PD8.Signal=USART3_TX +PD9.Locked=true +PD9.Mode=Asynchronous +PD9.Signal=USART3_RX +PI8.Mode=Timestamp enabled - Input Enabled to TS +PI8.Signal=RTC_TS +PinOutPanel.CurrentBGAView=Top +PinOutPanel.RotationAngle=0 +ProjectManager.AskForMigrate=true +ProjectManager.BackupPrevious=false +ProjectManager.CompilerOptimize=6 +ProjectManager.ComputerToolchain=false +ProjectManager.CoupleFile=false +ProjectManager.CustomerFirmwarePackage= +ProjectManager.DefaultFWLocation=true +ProjectManager.DeletePrevious=true +ProjectManager.DeviceId=STM32F777NIHx +ProjectManager.FirmwarePackage=STM32Cube FW_F7 V1.16.0 +ProjectManager.FreePins=false +ProjectManager.HalAssertFull=false +ProjectManager.HeapSize=0x200 +ProjectManager.KeepUserCode=true +ProjectManager.LastFirmware=true +ProjectManager.LibraryCopy=1 +ProjectManager.MainLocation=Core/Src +ProjectManager.NoMain=false +ProjectManager.PreviousToolchain= +ProjectManager.ProjectBuild=false +ProjectManager.ProjectFileName=STM32F777.ioc +ProjectManager.ProjectName=STM32F777 +ProjectManager.StackSize=0x400 +ProjectManager.TargetToolchain=STM32CubeIDE +ProjectManager.ToolChainLocation= +ProjectManager.UnderRoot=true +ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-SystemClock_Config-RCC-false-HAL-false,3-MX_CRYP_Init-CRYP-false-HAL-true,4-MX_HASH_Init-HASH-false-HAL-true,5-MX_RNG_Init-RNG-false-HAL-true,6-MX_USART3_UART_Init-USART3-false-HAL-true,0-MX_CORTEX_M7_Init-CORTEX_M7-false-HAL-true +RCC.AHBFreq_Value=216000000 +RCC.APB1CLKDivider=RCC_HCLK_DIV4 +RCC.APB1Freq_Value=54000000 +RCC.APB1TimFreq_Value=108000000 +RCC.APB2CLKDivider=RCC_HCLK_DIV2 +RCC.APB2Freq_Value=108000000 +RCC.APB2TimFreq_Value=216000000 +RCC.CECFreq_Value=32786.88524590164 +RCC.CortexFreq_Value=216000000 +RCC.DFSDMAudioFreq_Value=192000000 +RCC.DFSDMFreq_Value=108000000 +RCC.EthernetFreq_Value=216000000 +RCC.FCLKCortexFreq_Value=216000000 +RCC.FamilyName=M +RCC.HCLKFreq_Value=216000000 +RCC.HSE_VALUE=25000000 +RCC.HSI_VALUE=16000000 +RCC.I2C1Freq_Value=54000000 +RCC.I2C2Freq_Value=54000000 +RCC.I2C3Freq_Value=54000000 +RCC.I2C4Freq_Value=54000000 +RCC.I2SFreq_Value=192000000 +RCC.IPParameters=AHBFreq_Value,APB1CLKDivider,APB1Freq_Value,APB1TimFreq_Value,APB2CLKDivider,APB2Freq_Value,APB2TimFreq_Value,CECFreq_Value,CortexFreq_Value,DFSDMAudioFreq_Value,DFSDMFreq_Value,EthernetFreq_Value,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI_VALUE,I2C1Freq_Value,I2C2Freq_Value,I2C3Freq_Value,I2C4Freq_Value,I2SFreq_Value,LCDTFTFreq_Value,LPTIM1Freq_Value,LSE_VALUE,LSI_VALUE,MCO2PinFreq_Value,PLLCLKFreq_Value,PLLI2SPCLKFreq_Value,PLLI2SQCLKFreq_Value,PLLI2SRCLKFreq_Value,PLLI2SRoutputFreq_Value,PLLM,PLLN,PLLQ,PLLQCLKFreq_Value,PLLQoutputFreq_Value,PLLRFreq_Value,PLLSAIPCLKFreq_Value,PLLSAIQCLKFreq_Value,PLLSAIRCLKFreq_Value,PLLSAIoutputFreq_Value,RNGFreq_Value,SAI1Freq_Value,SAI2Freq_Value,SDMMC2Freq_Value,SDMMCFreq_Value,SPDIFRXFreq_Value,SYSCLKFreq_VALUE,SYSCLKSource,UART4Freq_Value,UART5Freq_Value,UART7Freq_Value,UART8Freq_Value,USART1Freq_Value,USART2Freq_Value,USART3Freq_Value,USART6Freq_Value,USBFreq_Value,VCOI2SOutputFreq_Value,VCOInputFreq_Value,VCOOutputFreq_Value,VCOSAIOutputFreq_Value +RCC.LCDTFTFreq_Value=96000000 +RCC.LPTIM1Freq_Value=54000000 +RCC.LSE_VALUE=32768 +RCC.LSI_VALUE=32000 +RCC.MCO2PinFreq_Value=216000000 +RCC.PLLCLKFreq_Value=216000000 +RCC.PLLI2SPCLKFreq_Value=192000000 +RCC.PLLI2SQCLKFreq_Value=192000000 +RCC.PLLI2SRCLKFreq_Value=192000000 +RCC.PLLI2SRoutputFreq_Value=192000000 +RCC.PLLM=8 +RCC.PLLN=216 +RCC.PLLQ=9 +RCC.PLLQCLKFreq_Value=48000000 +RCC.PLLQoutputFreq_Value=48000000 +RCC.PLLRFreq_Value=216000000 +RCC.PLLSAIPCLKFreq_Value=192000000 +RCC.PLLSAIQCLKFreq_Value=192000000 +RCC.PLLSAIRCLKFreq_Value=192000000 +RCC.PLLSAIoutputFreq_Value=192000000 +RCC.RNGFreq_Value=48000000 +RCC.SAI1Freq_Value=192000000 +RCC.SAI2Freq_Value=192000000 +RCC.SDMMC2Freq_Value=216000000 +RCC.SDMMCFreq_Value=216000000 +RCC.SPDIFRXFreq_Value=192000000 +RCC.SYSCLKFreq_VALUE=216000000 +RCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK +RCC.UART4Freq_Value=54000000 +RCC.UART5Freq_Value=54000000 +RCC.UART7Freq_Value=54000000 +RCC.UART8Freq_Value=54000000 +RCC.USART1Freq_Value=108000000 +RCC.USART2Freq_Value=54000000 +RCC.USART3Freq_Value=54000000 +RCC.USART6Freq_Value=108000000 +RCC.USBFreq_Value=48000000 +RCC.VCOI2SOutputFreq_Value=384000000 +RCC.VCOInputFreq_Value=2000000 +RCC.VCOOutputFreq_Value=432000000 +RCC.VCOSAIOutputFreq_Value=384000000 +USART2.IPParameters=VirtualMode-Asynchronous +USART2.VirtualMode-Asynchronous=VM_ASYNC +USART3.IPParameters=VirtualMode-Asynchronous +USART3.VirtualMode-Asynchronous=VM_ASYNC +VP_CRYP_VS_CRYP.Mode=CRYP_Activate +VP_CRYP_VS_CRYP.Signal=CRYP_VS_CRYP +VP_FREERTOS_VS_CMSIS_V2.Mode=CMSIS_V2 +VP_FREERTOS_VS_CMSIS_V2.Signal=FREERTOS_VS_CMSIS_V2 +VP_HASH_VS_HASH.Mode=HASH_Activate +VP_HASH_VS_HASH.Signal=HASH_VS_HASH +VP_RNG_VS_RNG.Mode=RNG_Activate +VP_RNG_VS_RNG.Signal=RNG_VS_RNG +VP_RTC_VS_RTC_Activate.Mode=RTC_Enabled +VP_RTC_VS_RTC_Activate.Signal=RTC_VS_RTC_Activate +VP_RTC_VS_RTC_Calendar.Mode=RTC_Calendar +VP_RTC_VS_RTC_Calendar.Signal=RTC_VS_RTC_Calendar +VP_SYS_VS_tim1.Mode=TIM1 +VP_SYS_VS_tim1.Signal=SYS_VS_tim1 +VP_wolfSSL.wolfSSL_VS_wolfSSLJjwolfSSL_4.4.1.Mode=wolfSSLJjwolfSSL +VP_wolfSSL.wolfSSL_VS_wolfSSLJjwolfSSL_4.4.1.Signal=wolfSSL.wolfSSL_VS_wolfSSLJjwolfSSL_4.4.1 +board=custom +wolfSSL.wolfSSL.4.4.1.IPParameters=wolfSSLCcwolfSSLJjwolfSSLJjCore,wolfSSLCcwolfSSLJjwolfCryptJjCore,wolfSSLCcwolfSSLJjwolfCryptJjTest,WOLF_CONF_MATH,WOLF_CONF_RTOS +wolfSSL.wolfSSL.4.4.1.WOLF_CONF_MATH=4 +wolfSSL.wolfSSL.4.4.1.WOLF_CONF_RTOS=2 +wolfSSL.wolfSSL.4.4.1.wolfSSLCcwolfSSLJjwolfCryptJjCore=true +wolfSSL.wolfSSL.4.4.1.wolfSSLCcwolfSSLJjwolfCryptJjTest=true +wolfSSL.wolfSSL.4.4.1.wolfSSLCcwolfSSLJjwolfSSLJjCore=true +wolfSSL.wolfSSL.4.4.1.wolfSSLJjwolfSSL_Checked=true +wolfSSL.wolfSSL.4.4.1_SwParameter=wolfSSLCcwolfSSLJjwolfCryptJjCore\:true;wolfSSLCcwolfSSLJjwolfCryptJjTest\:true;wolfSSLCcwolfSSLJjwolfSSLJjCore\:true; +isbadioc=false diff --git a/IDE/STM32Cube/Boards/STM32L475.ioc b/IDE/STM32Cube/Boards/STM32L475.ioc new file mode 100644 index 000000000..ef775ea14 --- /dev/null +++ b/IDE/STM32Cube/Boards/STM32L475.ioc @@ -0,0 +1,636 @@ +#MicroXplorer Configuration settings - do not modify +FREERTOS.FootprintOK=true +FREERTOS.IPParameters=Tasks01,FootprintOK,configTOTAL_HEAP_SIZE,configUSE_MALLOC_FAILED_HOOK,configCHECK_FOR_STACK_OVERFLOW +FREERTOS.Tasks01=defaultTask,24,128,StartDefaultTask,Default,NULL,Dynamic,NULL,NULL;wolfCrypt,8,8960,wolfCryptDemo,As external,NULL,Dynamic,NULL,NULL +FREERTOS.configCHECK_FOR_STACK_OVERFLOW=2 +FREERTOS.configTOTAL_HEAP_SIZE=88000 +FREERTOS.configUSE_MALLOC_FAILED_HOOK=1 +File.Version=6 +KeepUserPlacement=false +Mcu.Family=STM32L4 +Mcu.IP0=DFSDM1 +Mcu.IP1=FREERTOS +Mcu.IP10=USART1 +Mcu.IP11=USART3 +Mcu.IP12=USB_OTG_FS +Mcu.IP2=I2C2 +Mcu.IP3=NVIC +Mcu.IP4=QUADSPI +Mcu.IP5=RCC +Mcu.IP6=RNG +Mcu.IP7=RTC +Mcu.IP8=SPI3 +Mcu.IP9=SYS +Mcu.IPNb=13 +Mcu.Name=STM32L475V(C-E-G)Tx +Mcu.Package=LQFP100 +Mcu.Pin0=PE2 +Mcu.Pin1=PE3 +Mcu.Pin10=PC2 +Mcu.Pin11=PC3 +Mcu.Pin12=PA0 +Mcu.Pin13=PA1 +Mcu.Pin14=PA2 +Mcu.Pin15=PA3 +Mcu.Pin16=PA4 +Mcu.Pin17=PA5 +Mcu.Pin18=PA6 +Mcu.Pin19=PA7 +Mcu.Pin2=PE4 +Mcu.Pin20=PC4 +Mcu.Pin21=PC5 +Mcu.Pin22=PB0 +Mcu.Pin23=PB1 +Mcu.Pin24=PB2 +Mcu.Pin25=PE7 +Mcu.Pin26=PE8 +Mcu.Pin27=PE9 +Mcu.Pin28=PE10 +Mcu.Pin29=PE11 +Mcu.Pin3=PE5 +Mcu.Pin30=PE12 +Mcu.Pin31=PE13 +Mcu.Pin32=PE14 +Mcu.Pin33=PE15 +Mcu.Pin34=PB10 +Mcu.Pin35=PB11 +Mcu.Pin36=PB12 +Mcu.Pin37=PB13 +Mcu.Pin38=PB14 +Mcu.Pin39=PB15 +Mcu.Pin4=PE6 +Mcu.Pin40=PD8 +Mcu.Pin41=PD9 +Mcu.Pin42=PD10 +Mcu.Pin43=PD11 +Mcu.Pin44=PD12 +Mcu.Pin45=PD13 +Mcu.Pin46=PD14 +Mcu.Pin47=PD15 +Mcu.Pin48=PC6 +Mcu.Pin49=PC7 +Mcu.Pin5=PC13 +Mcu.Pin50=PC8 +Mcu.Pin51=PC9 +Mcu.Pin52=PA8 +Mcu.Pin53=PA9 +Mcu.Pin54=PA10 +Mcu.Pin55=PA11 +Mcu.Pin56=PA12 +Mcu.Pin57=PA13 (JTMS-SWDIO) +Mcu.Pin58=PA14 (JTCK-SWCLK) +Mcu.Pin59=PA15 (JTDI) +Mcu.Pin6=PC14-OSC32_IN (PC14) +Mcu.Pin60=PC10 +Mcu.Pin61=PC11 +Mcu.Pin62=PC12 +Mcu.Pin63=PD0 +Mcu.Pin64=PD1 +Mcu.Pin65=PD2 +Mcu.Pin66=PD3 +Mcu.Pin67=PD4 +Mcu.Pin68=PD5 +Mcu.Pin69=PD6 +Mcu.Pin7=PC15-OSC32_OUT (PC15) +Mcu.Pin70=PD7 +Mcu.Pin71=PB3 (JTDO-TRACESWO) +Mcu.Pin72=PB4 (NJTRST) +Mcu.Pin73=PB5 +Mcu.Pin74=PB6 +Mcu.Pin75=PB7 +Mcu.Pin76=PB8 +Mcu.Pin77=PB9 +Mcu.Pin78=PE0 +Mcu.Pin79=PE1 +Mcu.Pin8=PC0 +Mcu.Pin80=VP_FREERTOS_VS_CMSIS_V2 +Mcu.Pin81=VP_RNG_VS_RNG +Mcu.Pin82=VP_RTC_VS_RTC_Activate +Mcu.Pin83=VP_SYS_VS_tim1 +Mcu.Pin84=VP_wolfSSL.wolfSSL_VS_wolfSSLJjwolfSSL_4.4.1 +Mcu.Pin9=PC1 +Mcu.PinsNb=85 +Mcu.ThirdParty0=wolfSSL.wolfSSL.4.4.1 +Mcu.ThirdPartyNb=1 +Mcu.UserConstants= +Mcu.UserName=STM32L475VGTx +MxCube.Version=5.6.1 +MxDb.Version=DB.5.0.60 +NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:true\:false +NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:true\:false +NVIC.EXTI15_10_IRQn=true\:5\:0\:false\:false\:true\:true\:true\:true +NVIC.EXTI9_5_IRQn=true\:5\:0\:false\:false\:true\:true\:true\:true +NVIC.ForceEnableDMAVector=true +NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:true\:false +NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:false\:true\:false +NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:false\:true\:false +NVIC.PendSV_IRQn=true\:15\:0\:false\:false\:false\:true\:true\:false +NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4 +NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:false\:false\:true\:false +NVIC.SysTick_IRQn=true\:15\:0\:false\:false\:false\:true\:true\:false +NVIC.TIM1_UP_TIM16_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:true +NVIC.TimeBase=TIM1_UP_TIM16_IRQn +NVIC.TimeBaseIP=TIM1 +NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:true\:false +PA0.GPIOParameters=GPIO_Label +PA0.GPIO_Label=ARD_D1 [UART4_TX] +PA0.Locked=true +PA0.Signal=UART4_TX +PA1.GPIOParameters=GPIO_Label +PA1.GPIO_Label=ARD_D0 [UART4_RX] +PA1.Locked=true +PA1.Signal=UART4_RX +PA10.GPIOParameters=GPIO_Label +PA10.GPIO_Label=USB_OTG_FS_ID +PA10.Locked=true +PA10.Signal=USB_OTG_FS_ID +PA11.GPIOParameters=GPIO_Label +PA11.GPIO_Label=USB_OTG_FS_DM +PA11.Locked=true +PA11.Mode=Device_Only +PA11.Signal=USB_OTG_FS_DM +PA12.GPIOParameters=GPIO_Label +PA12.GPIO_Label=USB_OTG_FS_DP +PA12.Locked=true +PA12.Mode=Device_Only +PA12.Signal=USB_OTG_FS_DP +PA13\ (JTMS-SWDIO).GPIOParameters=GPIO_Label +PA13\ (JTMS-SWDIO).GPIO_Label=SYS_JTMS_SWDIO +PA13\ (JTMS-SWDIO).Locked=true +PA13\ (JTMS-SWDIO).Mode=Serial_Wire +PA13\ (JTMS-SWDIO).Signal=SYS_JTMS-SWDIO +PA14\ (JTCK-SWCLK).GPIOParameters=GPIO_Label +PA14\ (JTCK-SWCLK).GPIO_Label=SYS_JTCK_SWCLK +PA14\ (JTCK-SWCLK).Locked=true +PA14\ (JTCK-SWCLK).Mode=Serial_Wire +PA14\ (JTCK-SWCLK).Signal=SYS_JTCK-SWCLK +PA15\ (JTDI).GPIOParameters=GPIO_Label +PA15\ (JTDI).GPIO_Label=ARD_D9 +PA15\ (JTDI).Locked=true +PA15\ (JTDI).Signal=GPIO_Output +PA2.GPIOParameters=GPIO_Label +PA2.GPIO_Label=ARD_D10 [SPI_SSN] +PA2.Locked=true +PA2.Signal=GPIO_Output +PA3.GPIOParameters=GPIO_Label +PA3.GPIO_Label=ARD_D4 +PA3.Locked=true +PA3.Signal=S_TIM2_CH4 +PA4.GPIOParameters=GPIO_Label +PA4.GPIO_Label=ARD_D7 +PA4.Locked=true +PA4.Signal=ADCx_IN9 +PA5.GPIOParameters=GPIO_Label +PA5.GPIO_Label=ARD_D13 [SPI1_SCK] +PA5.Locked=true +PA5.Signal=SPI1_SCK +PA6.GPIOParameters=GPIO_Label +PA6.GPIO_Label=ARD_D12 [SPI1_MISO] +PA6.Locked=true +PA6.Signal=SPI1_MISO +PA7.GPIOParameters=GPIO_Label +PA7.GPIO_Label=ARD_D11 [SPI1_MOSI] +PA7.Locked=true +PA7.Signal=SPI1_MOSI +PA8.GPIOParameters=GPIO_Label +PA8.GPIO_Label=SPBTLE_RF_RST +PA8.Locked=true +PA8.Signal=GPIO_Output +PA9.GPIOParameters=GPIO_Label +PA9.GPIO_Label=USB_OTG_FS_VBUS [STMPS2141STR_OUT] +PA9.Locked=true +PA9.Signal=USB_OTG_FS_VBUS +PB0.GPIOParameters=GPIO_Label +PB0.GPIO_Label=ARD_D3 [INT_EXT10] +PB0.Locked=true +PB0.Signal=GPXTI0 +PB1.GPIOParameters=GPIO_Label +PB1.GPIO_Label=ARD_D6 [ADC1_IN6] +PB1.Locked=true +PB1.Signal=ADCx_IN16 +PB10.GPIOParameters=GPIO_Label +PB10.GPIO_Label=INTERNAL_I2C2_SCL [VL53L0X_SCL] +PB10.Locked=true +PB10.Mode=I2C +PB10.Signal=I2C2_SCL +PB11.GPIOParameters=GPIO_Label +PB11.GPIO_Label=INTERNAL_I2C2_SDA [VL53L0X_SDA] +PB11.Locked=true +PB11.Mode=I2C +PB11.Signal=I2C2_SDA +PB12.GPIOParameters=GPIO_Label +PB12.GPIO_Label=ISM43362_BOOT0 [ISM43362_BOOT] +PB12.Locked=true +PB12.Signal=GPIO_Output +PB13.GPIOParameters=GPIO_Label +PB13.GPIO_Label=ISM43362_WAKEUP [ISM43362_WKUP] +PB13.Locked=true +PB13.Signal=GPIO_Output +PB14.GPIOParameters=GPIO_Label +PB14.GPIO_Label=LED2 [LED_GREEN] +PB14.Locked=true +PB14.Signal=GPIO_Output +PB15.GPIOParameters=GPIO_Label +PB15.GPIO_Label=SPSGRF_915_SDN [SPSGRF_SDN] +PB15.Locked=true +PB15.Signal=GPIO_Output +PB2.GPIOParameters=GPIO_Label +PB2.GPIO_Label=ARD_D8 +PB2.Locked=true +PB2.Signal=GPIO_Output +PB3\ (JTDO-TRACESWO).GPIOParameters=GPIO_Label +PB3\ (JTDO-TRACESWO).GPIO_Label=SYS_JTD0_SWO +PB3\ (JTDO-TRACESWO).Locked=true +PB3\ (JTDO-TRACESWO).Signal=SYS_JTDO-SWO +PB4\ (NJTRST).GPIOParameters=GPIO_Label +PB4\ (NJTRST).GPIO_Label=ARD_D5 +PB4\ (NJTRST).Locked=true +PB4\ (NJTRST).Signal=GPIO_Output +PB5.GPIOParameters=PinState,GPIO_Label +PB5.GPIO_Label=SPSGRF_915_SPI3_CSN [SPSGRF_SPI_CS] +PB5.Locked=true +PB5.PinState=GPIO_PIN_SET +PB5.Signal=GPIO_Output +PB6.GPIOParameters=GPIO_Label +PB6.GPIO_Label=ST_LINK_UART1_TX +PB6.Locked=true +PB6.Mode=Asynchronous +PB6.Signal=USART1_TX +PB7.GPIOParameters=GPIO_Label +PB7.GPIO_Label=ST_LINK_UART1_RX +PB7.Locked=true +PB7.Mode=Asynchronous +PB7.Signal=USART1_RX +PB8.GPIOParameters=GPIO_Label +PB8.GPIO_Label=ARD_D15 [I2C1_SCL] +PB8.Locked=true +PB8.Signal=I2C1_SCL +PB9.GPIOParameters=GPIO_Label +PB9.GPIO_Label=ARD_D14 [I2C1_SDA] +PB9.Locked=true +PB9.Signal=I2C1_SDA +PC0.GPIOParameters=GPIO_Label +PC0.GPIO_Label=ARD_A5 [ADC] +PC0.Locked=true +PC0.Signal=ADCx_IN1 +PC1.GPIOParameters=GPIO_Label +PC1.GPIO_Label=ARD_A4 [ADC] +PC1.Locked=true +PC1.Signal=ADCx_IN2 +PC10.GPIOParameters=GPIO_Label +PC10.GPIO_Label=INTERNAL_SPI3_SCK [BT module_SPI_SCLK] [ISM43362_SCK] +PC10.Locked=true +PC10.Mode=Full_Duplex_Master +PC10.Signal=SPI3_SCK +PC11.GPIOParameters=GPIO_Label +PC11.GPIO_Label=INTERNAL_SPI3_MISO [BT module_SPI_MISO] [ISM43362_MISO] +PC11.Locked=true +PC11.Mode=Full_Duplex_Master +PC11.Signal=SPI3_MISO +PC12.GPIOParameters=GPIO_Label +PC12.GPIO_Label=INTERNAL_SPI3_MOSI [BT module_SPI_MOSI] [ISM43362_MOSI] +PC12.Locked=true +PC12.Mode=Full_Duplex_Master +PC12.Signal=SPI3_MOSI +PC13.GPIOParameters=GPIO_Label,GPIO_ModeDefaultEXTI +PC13.GPIO_Label=BUTTON_EXTI13 [B2] +PC13.GPIO_ModeDefaultEXTI=GPIO_MODE_IT_FALLING +PC13.Locked=true +PC13.Signal=GPXTI13 +PC14-OSC32_IN\ (PC14).Locked=true +PC14-OSC32_IN\ (PC14).Mode=LSE-External-Oscillator +PC14-OSC32_IN\ (PC14).Signal=RCC_OSC32_IN +PC15-OSC32_OUT\ (PC15).Locked=true +PC15-OSC32_OUT\ (PC15).Mode=LSE-External-Oscillator +PC15-OSC32_OUT\ (PC15).Signal=RCC_OSC32_OUT +PC2.GPIOParameters=GPIO_Label +PC2.GPIO_Label=ARD_A3 [ADC] +PC2.Locked=true +PC2.Signal=ADCx_IN3 +PC3.GPIOParameters=GPIO_Label +PC3.GPIO_Label=ARD_A2 [ADC] +PC3.Locked=true +PC3.Signal=ADCx_IN4 +PC4.GPIOParameters=GPIO_Label +PC4.GPIO_Label=ARD_A1 [ADC] +PC4.Locked=true +PC4.Signal=ADCx_IN13 +PC5.GPIOParameters=GPIO_Label +PC5.GPIO_Label=ARD_A0 [ADC] +PC5.Locked=true +PC5.Signal=ADCx_IN14 +PC6.GPIOParameters=GPIO_Label +PC6.GPIO_Label=VL53L0X_XSHUT [Read_XSHUT] +PC6.Locked=true +PC6.Signal=GPIO_Output +PC7.GPIOParameters=GPIO_Label +PC7.GPIO_Label=VL53L0X_GPIO1_EXTI7 [VL53L0X_GPIO1] +PC7.Locked=true +PC7.Signal=GPXTI7 +PC8.GPIOParameters=GPIO_Label +PC8.GPIO_Label=LSM3MDL_DRDY_EXTI8 [LIS3MDL_DRDY] +PC8.Locked=true +PC8.Signal=GPXTI8 +PC9.GPIOParameters=GPIO_Label +PC9.GPIO_Label=LED3_WIFI_ LED4_BLE +PC9.Locked=true +PC9.Signal=GPIO_Output +PD0.GPIOParameters=GPIO_Label +PD0.GPIO_Label=PMOD_RESET +PD0.Locked=true +PD0.Signal=GPIO_Output +PD1.GPIOParameters=GPIO_Label +PD1.GPIO_Label=PMOD_SPI2_SCK +PD1.Locked=true +PD1.Signal=SPI2_SCK +PD10.GPIOParameters=GPIO_Label +PD10.GPIO_Label=LPS22HB_INT_DRDY_EXTI0 [LPS22HB_INT_DRDY] +PD10.Locked=true +PD10.Signal=GPXTI10 +PD11.GPIOParameters=GPIO_Label +PD11.GPIO_Label=LSM6DSL_INT1_EXTI11 [LSM6DSL_INT1] +PD11.Locked=true +PD11.Signal=GPXTI11 +PD12.GPIOParameters=GPIO_Label +PD12.GPIO_Label=USB_OTG_FS_PWR_EN [STMPS2141STR_EN] +PD12.Locked=true +PD12.Signal=GPIO_Output +PD13.GPIOParameters=PinState,GPIO_Label +PD13.GPIO_Label=SPBTLE_RF_SPI3_CSN [BT module_SPI_CS] +PD13.Locked=true +PD13.PinState=GPIO_PIN_SET +PD13.Signal=GPIO_Output +PD14.GPIOParameters=GPIO_Label +PD14.GPIO_Label=ARD_D2 [INT0_EXTI14] +PD14.Locked=true +PD14.Signal=GPXTI14 +PD15.GPIOParameters=GPIO_Label +PD15.GPIO_Label=HTS221_DRDY_EXTI15 [HTS221_DRDY] +PD15.Locked=true +PD15.Signal=GPXTI15 +PD2.GPIOParameters=GPIO_Label +PD2.GPIO_Label=PMOD_IRQ_EXTI12 +PD2.Locked=true +PD2.Signal=GPXTI2 +PD3.GPIOParameters=GPIO_Label +PD3.GPIO_Label=PMOD_UART2_CTS +PD3.Locked=true +PD3.Signal=USART2_CTS +PD4.GPIOParameters=GPIO_Label +PD4.GPIO_Label=PMOD_UART2_RTS +PD4.Locked=true +PD4.Signal=USART2_RTS +PD5.GPIOParameters=GPIO_Label +PD5.GPIO_Label=PMOD_UART2_TX +PD5.Locked=true +PD5.Signal=USART2_TX +PD6.GPIOParameters=GPIO_Label +PD6.GPIO_Label=PMOD_UART2_RX +PD6.Locked=true +PD6.Signal=USART2_RX +PD7.GPIOParameters=GPIO_Label +PD7.GPIO_Label=STSAFE_A100_RESET [STSAFE-A100_RESET] +PD7.Locked=true +PD7.Signal=GPIO_Output +PD8.GPIOParameters=GPIO_Label +PD8.GPIO_Label=INTERNAL_UART3_TX [ISM43362_RX] +PD8.Locked=true +PD8.Mode=Asynchronous +PD8.Signal=USART3_TX +PD9.GPIOParameters=GPIO_Label +PD9.GPIO_Label=INTERNAL_UART3_RX [ISM43362_TX] +PD9.Locked=true +PD9.Mode=Asynchronous +PD9.Signal=USART3_RX +PE0.GPIOParameters=PinState,GPIO_Label +PE0.GPIO_Label=ISM43362_SPI3_CSN [ISM43362_SSN] +PE0.Locked=true +PE0.PinState=GPIO_PIN_SET +PE0.Signal=GPIO_Output +PE1.GPIOParameters=GPIO_Label +PE1.GPIO_Label=ISM43362_DRDY_EXTI1 [ISM43362_DATARDY] +PE1.Locked=true +PE1.Signal=GPXTI1 +PE10.GPIOParameters=GPIO_Label +PE10.GPIO_Label=QUADSPI_CLK [MX25R6435F_SCLK] +PE10.Locked=true +PE10.Mode=Single Bank +PE10.Signal=QUADSPI_CLK +PE11.GPIOParameters=GPIO_Label +PE11.GPIO_Label=QUADSPI_NCS [MX25R6435F_SCLK] +PE11.Locked=true +PE11.Mode=Single Bank +PE11.Signal=QUADSPI_NCS +PE12.GPIOParameters=GPIO_Label +PE12.GPIO_Label=OQUADSPI_BK1_IO0 [MX25R6435F_IO0] +PE12.Locked=true +PE12.Mode=Single Bank +PE12.Signal=QUADSPI_BK1_IO0 +PE13.GPIOParameters=GPIO_Label +PE13.GPIO_Label=QUADSPI_BK1_IO1 [MX25R6435F_IO1] +PE13.Locked=true +PE13.Mode=Single Bank +PE13.Signal=QUADSPI_BK1_IO1 +PE14.GPIOParameters=GPIO_Label +PE14.GPIO_Label=QUAD_SPI_BK1_IO2 [MX25R6435F_IO2] +PE14.Locked=true +PE14.Mode=Single Bank +PE14.Signal=QUADSPI_BK1_IO2 +PE15.GPIOParameters=GPIO_Label +PE15.GPIO_Label=QUAD_SPI_BK1_IO3 [MX25R6435F_IO3] +PE15.Locked=true +PE15.Mode=Single Bank +PE15.Signal=QUADSPI_BK1_IO3 +PE2.GPIOParameters=GPIO_Label +PE2.GPIO_Label=M24SR64_Y_RF_DISABLE [M24SR64_RFDIS] +PE2.Locked=true +PE2.Signal=GPIO_Output +PE3.GPIOParameters=GPIO_Label +PE3.GPIO_Label=USB_OTG_FS_OVRCR_EXTI3 [STMPS2141STR_FAULT] +PE3.Locked=true +PE3.Signal=GPXTI3 +PE4.GPIOParameters=GPIO_Label +PE4.GPIO_Label=M24SR64_Y_GPO [M24SR64_GPO] +PE4.Locked=true +PE4.Signal=GPIO_Output +PE5.GPIOParameters=GPIO_Label +PE5.GPIO_Label=SPSGRF_915_GPIO3_EXTI5 [SPSGRF_GPIO_3] +PE5.Locked=true +PE5.Signal=GPXTI5 +PE6.GPIOParameters=GPIO_Label +PE6.GPIO_Label=SPBTLE_RF_IRQ_EXTI6 [BT module_SPI_IRQ] +PE6.Locked=true +PE6.Signal=GPXTI6 +PE7.GPIOParameters=GPIO_Label +PE7.GPIO_Label=DFSDM1_DATIN2 [MP34DT01_DOUT] +PE7.Locked=true +PE7.Signal=S_DATAIN2DFSDM1 +PE8.GPIOParameters=GPIO_Label +PE8.GPIO_Label=ISM43362_RST [ISM43362_RSTN] +PE8.Locked=true +PE8.Signal=GPIO_Output +PE9.GPIOParameters=GPIO_Label +PE9.GPIO_Label=DFSDM1_CKOUT [MP34DT01_CLK] +PE9.Locked=true +PE9.Signal=S_CKOUTDFSDM1 +PinOutPanel.RotationAngle=0 +ProjectManager.AskForMigrate=true +ProjectManager.BackupPrevious=false +ProjectManager.CompilerOptimize=6 +ProjectManager.ComputerToolchain=false +ProjectManager.CoupleFile=false +ProjectManager.CustomerFirmwarePackage= +ProjectManager.DefaultFWLocation=true +ProjectManager.DeletePrevious=true +ProjectManager.DeviceId=STM32L475VGTx +ProjectManager.FirmwarePackage=STM32Cube FW_L4 V1.15.1 +ProjectManager.FreePins=false +ProjectManager.HalAssertFull=false +ProjectManager.HeapSize=0x200 +ProjectManager.KeepUserCode=true +ProjectManager.LastFirmware=true +ProjectManager.LibraryCopy=1 +ProjectManager.MainLocation=Core/Src +ProjectManager.NoMain=false +ProjectManager.PreviousToolchain= +ProjectManager.ProjectBuild=false +ProjectManager.ProjectFileName=STM32L475.ioc +ProjectManager.ProjectName=STM32L475 +ProjectManager.StackSize=0x400 +ProjectManager.TargetToolchain=STM32CubeIDE +ProjectManager.ToolChainLocation= +ProjectManager.UnderRoot=true +ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-SystemClock_Config-RCC-false-HAL-false,3-MX_DFSDM1_Init-DFSDM1-false-HAL-true,4-MX_I2C2_Init-I2C2-false-HAL-true,5-MX_QUADSPI_Init-QUADSPI-false-HAL-true,6-MX_SPI3_Init-SPI3-false-HAL-true,7-MX_USART1_UART_Init-USART1-false-HAL-true,8-MX_USART3_UART_Init-USART3-false-HAL-true,9-MX_USB_OTG_FS_PCD_Init-USB_OTG_FS-false-HAL-true +RCC.ADCFreq_Value=48000000 +RCC.AHBFreq_Value=80000000 +RCC.APB1Freq_Value=80000000 +RCC.APB1TimFreq_Value=80000000 +RCC.APB2Freq_Value=80000000 +RCC.APB2TimFreq_Value=80000000 +RCC.CortexFreq_Value=80000000 +RCC.DFSDMFreq_Value=80000000 +RCC.FCLKCortexFreq_Value=80000000 +RCC.FamilyName=M +RCC.HCLKFreq_Value=80000000 +RCC.HSE_VALUE=8000000 +RCC.HSI_VALUE=16000000 +RCC.I2C1Freq_Value=80000000 +RCC.I2C2Freq_Value=80000000 +RCC.I2C3Freq_Value=80000000 +RCC.IPParameters=ADCFreq_Value,AHBFreq_Value,APB1Freq_Value,APB1TimFreq_Value,APB2Freq_Value,APB2TimFreq_Value,CortexFreq_Value,DFSDMFreq_Value,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI_VALUE,I2C1Freq_Value,I2C2Freq_Value,I2C3Freq_Value,LPTIM1Freq_Value,LPTIM2Freq_Value,LPUART1Freq_Value,LSCOPinFreq_Value,LSI_VALUE,MCO1PinFreq_Value,MSI_VALUE,PLLN,PLLPoutputFreq_Value,PLLQoutputFreq_Value,PLLRCLKFreq_Value,PLLSAI1N,PLLSAI1PoutputFreq_Value,PLLSAI1QoutputFreq_Value,PLLSAI1RoutputFreq_Value,PLLSAI2PoutputFreq_Value,PLLSAI2RoutputFreq_Value,PWRFreq_Value,RNGFreq_Value,SAI1Freq_Value,SAI2Freq_Value,SDMMCFreq_Value,SWPMI1Freq_Value,SYSCLKFreq_VALUE,SYSCLKSource,UART4Freq_Value,UART5Freq_Value,USART1Freq_Value,USART2Freq_Value,USART3Freq_Value,USBFreq_Value,VCOInputFreq_Value,VCOOutputFreq_Value,VCOSAI1OutputFreq_Value,VCOSAI2OutputFreq_Value +RCC.LPTIM1Freq_Value=80000000 +RCC.LPTIM2Freq_Value=80000000 +RCC.LPUART1Freq_Value=80000000 +RCC.LSCOPinFreq_Value=32000 +RCC.LSI_VALUE=32000 +RCC.MCO1PinFreq_Value=80000000 +RCC.MSI_VALUE=4000000 +RCC.PLLN=40 +RCC.PLLPoutputFreq_Value=22857142.85714286 +RCC.PLLQoutputFreq_Value=80000000 +RCC.PLLRCLKFreq_Value=80000000 +RCC.PLLSAI1N=24 +RCC.PLLSAI1PoutputFreq_Value=13714285.714285715 +RCC.PLLSAI1QoutputFreq_Value=48000000 +RCC.PLLSAI1RoutputFreq_Value=48000000 +RCC.PLLSAI2PoutputFreq_Value=4571428.571428572 +RCC.PLLSAI2RoutputFreq_Value=16000000 +RCC.PWRFreq_Value=80000000 +RCC.RNGFreq_Value=48000000 +RCC.SAI1Freq_Value=13714285.714285715 +RCC.SAI2Freq_Value=13714285.714285715 +RCC.SDMMCFreq_Value=48000000 +RCC.SWPMI1Freq_Value=80000000 +RCC.SYSCLKFreq_VALUE=80000000 +RCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK +RCC.UART4Freq_Value=80000000 +RCC.UART5Freq_Value=80000000 +RCC.USART1Freq_Value=80000000 +RCC.USART2Freq_Value=80000000 +RCC.USART3Freq_Value=80000000 +RCC.USBFreq_Value=48000000 +RCC.VCOInputFreq_Value=4000000 +RCC.VCOOutputFreq_Value=160000000 +RCC.VCOSAI1OutputFreq_Value=96000000 +RCC.VCOSAI2OutputFreq_Value=32000000 +SH.ADCx_IN1.0=ADC1_IN1 +SH.ADCx_IN1.ConfNb=1 +SH.ADCx_IN13.0=ADC1_IN13 +SH.ADCx_IN13.ConfNb=1 +SH.ADCx_IN14.0=ADC1_IN14 +SH.ADCx_IN14.ConfNb=1 +SH.ADCx_IN16.0=ADC1_IN16 +SH.ADCx_IN16.ConfNb=1 +SH.ADCx_IN2.0=ADC1_IN2 +SH.ADCx_IN2.ConfNb=1 +SH.ADCx_IN3.0=ADC1_IN3 +SH.ADCx_IN3.ConfNb=1 +SH.ADCx_IN4.0=ADC1_IN4 +SH.ADCx_IN4.ConfNb=1 +SH.ADCx_IN9.0=ADC1_IN9 +SH.ADCx_IN9.ConfNb=1 +SH.GPXTI0.0=GPIO_EXTI0 +SH.GPXTI0.ConfNb=1 +SH.GPXTI1.0=GPIO_EXTI1 +SH.GPXTI1.ConfNb=1 +SH.GPXTI10.0=GPIO_EXTI10 +SH.GPXTI10.ConfNb=1 +SH.GPXTI11.0=GPIO_EXTI11 +SH.GPXTI11.ConfNb=1 +SH.GPXTI13.0=GPIO_EXTI13 +SH.GPXTI13.ConfNb=1 +SH.GPXTI14.0=GPIO_EXTI14 +SH.GPXTI14.ConfNb=1 +SH.GPXTI15.0=GPIO_EXTI15 +SH.GPXTI15.ConfNb=1 +SH.GPXTI2.0=GPIO_EXTI2 +SH.GPXTI2.ConfNb=1 +SH.GPXTI3.0=GPIO_EXTI3 +SH.GPXTI3.ConfNb=1 +SH.GPXTI5.0=GPIO_EXTI5 +SH.GPXTI5.ConfNb=1 +SH.GPXTI6.0=GPIO_EXTI6 +SH.GPXTI6.ConfNb=1 +SH.GPXTI7.0=GPIO_EXTI7 +SH.GPXTI7.ConfNb=1 +SH.GPXTI8.0=GPIO_EXTI8 +SH.GPXTI8.ConfNb=1 +SH.S_CKOUTDFSDM1.0=DFSDM1_CKOUT,CKOUT +SH.S_CKOUTDFSDM1.1=DFSDM1_CKOUT,PDM_SPI_Input_from_ch12_and_Internal_Clock +SH.S_CKOUTDFSDM1.ConfNb=2 +SH.S_DATAIN2DFSDM1.0=DFSDM1_DATIN2,PDM_SPI_Input_from_ch12_and_Internal_Clock +SH.S_DATAIN2DFSDM1.ConfNb=1 +SH.S_TIM2_CH4.0=TIM2_CH4 +SH.S_TIM2_CH4.ConfNb=1 +SPI3.CalculateBaudRate=40.0 MBits/s +SPI3.Direction=SPI_DIRECTION_2LINES +SPI3.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate +SPI3.Mode=SPI_MODE_MASTER +SPI3.VirtualType=VM_MASTER +USART1.IPParameters=VirtualMode-Asynchronous +USART1.VirtualMode-Asynchronous=VM_ASYNC +USART3.IPParameters=VirtualMode-Asynchronous +USART3.VirtualMode-Asynchronous=VM_ASYNC +USB_OTG_FS.IPParameters=VirtualMode +USB_OTG_FS.VirtualMode=Device_Only +VP_FREERTOS_VS_CMSIS_V2.Mode=CMSIS_V2 +VP_FREERTOS_VS_CMSIS_V2.Signal=FREERTOS_VS_CMSIS_V2 +VP_RNG_VS_RNG.Mode=RNG_Activate +VP_RNG_VS_RNG.Signal=RNG_VS_RNG +VP_RTC_VS_RTC_Activate.Mode=RTC_Enabled +VP_RTC_VS_RTC_Activate.Signal=RTC_VS_RTC_Activate +VP_SYS_VS_tim1.Mode=TIM1 +VP_SYS_VS_tim1.Signal=SYS_VS_tim1 +VP_wolfSSL.wolfSSL_VS_wolfSSLJjwolfSSL_4.4.1.Mode=wolfSSLJjwolfSSL +VP_wolfSSL.wolfSSL_VS_wolfSSLJjwolfSSL_4.4.1.Signal=wolfSSL.wolfSSL_VS_wolfSSLJjwolfSSL_4.4.1 +board=B-L475E-IOT01A1 +boardIOC=true +wolfSSL.wolfSSL.4.4.1.IPParameters=wolfSSLCcwolfSSLJjwolfSSLJjCore,wolfSSLCcwolfSSLJjwolfCryptJjCore,wolfSSLCcwolfSSLJjwolfCryptJjTest,WOLF_CONF_MATH,WOLF_CONF_RTOS +wolfSSL.wolfSSL.4.4.1.WOLF_CONF_MATH=4 +wolfSSL.wolfSSL.4.4.1.WOLF_CONF_RTOS=2 +wolfSSL.wolfSSL.4.4.1.wolfSSLCcwolfSSLJjwolfCryptJjCore=true +wolfSSL.wolfSSL.4.4.1.wolfSSLCcwolfSSLJjwolfCryptJjTest=true +wolfSSL.wolfSSL.4.4.1.wolfSSLCcwolfSSLJjwolfSSLJjCore=true +wolfSSL.wolfSSL.4.4.1.wolfSSLJjwolfSSL_Checked=true +wolfSSL.wolfSSL.4.4.1_SwParameter=wolfSSLCcwolfSSLJjwolfCryptJjCore\:true;wolfSSLCcwolfSSLJjwolfCryptJjTest\:true;wolfSSLCcwolfSSLJjwolfSSLJjCore\:true; +isbadioc=false diff --git a/IDE/STM32Cube/Boards/STM32L4A6.ioc b/IDE/STM32Cube/Boards/STM32L4A6.ioc new file mode 100644 index 000000000..b289b5339 --- /dev/null +++ b/IDE/STM32Cube/Boards/STM32L4A6.ioc @@ -0,0 +1,170 @@ +#MicroXplorer Configuration settings - do not modify +FREERTOS.FootprintOK=true +FREERTOS.IPParameters=Tasks01,configTOTAL_HEAP_SIZE,configUSE_MALLOC_FAILED_HOOK,configCHECK_FOR_STACK_OVERFLOW,FootprintOK +FREERTOS.Tasks01=defaultTask,24,128,StartDefaultTask,Default,NULL,Dynamic,NULL,NULL;wolfCrypt,8,8960,wolfCryptDemo,As external,NULL,Dynamic,NULL,NULL +FREERTOS.configCHECK_FOR_STACK_OVERFLOW=2 +FREERTOS.configTOTAL_HEAP_SIZE=131072 +FREERTOS.configUSE_MALLOC_FAILED_HOOK=1 +File.Version=6 +KeepUserPlacement=false +LPUART1.BaudRate=115200 +LPUART1.IPParameters=BaudRate,WordLength +LPUART1.WordLength=UART_WORDLENGTH_8B +Mcu.Family=STM32L4 +Mcu.IP0=AES +Mcu.IP1=FREERTOS +Mcu.IP2=HASH +Mcu.IP3=LPUART1 +Mcu.IP4=NVIC +Mcu.IP5=RCC +Mcu.IP6=RNG +Mcu.IP7=RTC +Mcu.IP8=SYS +Mcu.IPNb=9 +Mcu.Name=STM32L4A6ZGTx +Mcu.Package=LQFP144 +Mcu.Pin0=PG7 +Mcu.Pin1=PG8 +Mcu.Pin2=VP_AES_VS_AES +Mcu.Pin3=VP_FREERTOS_VS_CMSIS_V2 +Mcu.Pin4=VP_HASH_VS_HASH +Mcu.Pin5=VP_RNG_VS_RNG +Mcu.Pin6=VP_RTC_VS_RTC_Activate +Mcu.Pin7=VP_RTC_VS_RTC_Calendar +Mcu.Pin8=VP_SYS_VS_tim1 +Mcu.Pin9=VP_wolfSSL.wolfSSL_VS_wolfSSLJjwolfSSL_4.4.1 +Mcu.PinsNb=10 +Mcu.ThirdParty0=wolfSSL.wolfSSL.4.4.1 +Mcu.ThirdPartyNb=1 +Mcu.UserConstants= +Mcu.UserName=STM32L4A6ZGTx +MxCube.Version=5.6.1 +MxDb.Version=DB.5.0.60 +NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.ForceEnableDMAVector=true +NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.PendSV_IRQn=true\:15\:0\:false\:false\:false\:true\:false\:false +NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4 +NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:false\:false\:false\:false +NVIC.SysTick_IRQn=true\:15\:0\:false\:false\:false\:true\:false\:false +NVIC.TIM1_UP_TIM16_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:true +NVIC.TimeBase=TIM1_UP_TIM16_IRQn +NVIC.TimeBaseIP=TIM1 +NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +PG7.Locked=true +PG7.Mode=Asynchronous +PG7.Signal=LPUART1_TX +PG8.Locked=true +PG8.Mode=Asynchronous +PG8.Signal=LPUART1_RX +PinOutPanel.RotationAngle=0 +ProjectManager.AskForMigrate=true +ProjectManager.BackupPrevious=false +ProjectManager.CompilerOptimize=6 +ProjectManager.ComputerToolchain=false +ProjectManager.CoupleFile=false +ProjectManager.CustomerFirmwarePackage= +ProjectManager.DefaultFWLocation=true +ProjectManager.DeletePrevious=true +ProjectManager.DeviceId=STM32L4A6ZGTx +ProjectManager.FirmwarePackage=STM32Cube FW_L4 V1.15.1 +ProjectManager.FreePins=false +ProjectManager.HalAssertFull=false +ProjectManager.HeapSize=0x200 +ProjectManager.KeepUserCode=true +ProjectManager.LastFirmware=true +ProjectManager.LibraryCopy=1 +ProjectManager.MainLocation=Core/Src +ProjectManager.NoMain=false +ProjectManager.PreviousToolchain= +ProjectManager.ProjectBuild=false +ProjectManager.ProjectFileName=STM32L4A6.ioc +ProjectManager.ProjectName=STM32L4A6 +ProjectManager.StackSize=0x400 +ProjectManager.TargetToolchain=STM32CubeIDE +ProjectManager.ToolChainLocation= +ProjectManager.UnderRoot=true +ProjectManager.functionlistsort=2-SystemClock_Config-RCC-false-HAL-false +RCC.ADCFreq_Value=32000000 +RCC.AHBFreq_Value=80000000 +RCC.APB1Freq_Value=80000000 +RCC.APB1TimFreq_Value=80000000 +RCC.APB2Freq_Value=80000000 +RCC.APB2TimFreq_Value=80000000 +RCC.CortexFreq_Value=80000000 +RCC.DFSDMFreq_Value=80000000 +RCC.FCLKCortexFreq_Value=80000000 +RCC.FamilyName=M +RCC.HCLKFreq_Value=80000000 +RCC.HSE_VALUE=8000000 +RCC.HSI48_VALUE=48000000 +RCC.HSI_VALUE=16000000 +RCC.I2C1Freq_Value=80000000 +RCC.I2C2Freq_Value=80000000 +RCC.I2C3Freq_Value=80000000 +RCC.I2C4Freq_Value=80000000 +RCC.IPParameters=ADCFreq_Value,AHBFreq_Value,APB1Freq_Value,APB1TimFreq_Value,APB2Freq_Value,APB2TimFreq_Value,CortexFreq_Value,DFSDMFreq_Value,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI48_VALUE,HSI_VALUE,I2C1Freq_Value,I2C2Freq_Value,I2C3Freq_Value,I2C4Freq_Value,LPTIM1Freq_Value,LPTIM2Freq_Value,LPUART1Freq_Value,LSCOPinFreq_Value,LSE_VALUE,LSI_VALUE,MCO1PinFreq_Value,MSI_VALUE,PLLN,PLLPoutputFreq_Value,PLLQoutputFreq_Value,PLLRCLKFreq_Value,PLLSAI1N,PLLSAI1PoutputFreq_Value,PLLSAI1QoutputFreq_Value,PLLSAI1RoutputFreq_Value,PLLSAI2PoutputFreq_Value,PLLSAI2RoutputFreq_Value,PWRFreq_Value,RNGFreq_Value,SAI1Freq_Value,SAI2Freq_Value,SDMMCFreq_Value,SWPMI1Freq_Value,SYSCLKFreq_VALUE,SYSCLKSource,UART4Freq_Value,UART5Freq_Value,USART1Freq_Value,USART2Freq_Value,USART3Freq_Value,USBFreq_Value,VCOInputFreq_Value,VCOOutputFreq_Value,VCOSAI1OutputFreq_Value,VCOSAI2OutputFreq_Value +RCC.LPTIM1Freq_Value=80000000 +RCC.LPTIM2Freq_Value=80000000 +RCC.LPUART1Freq_Value=80000000 +RCC.LSCOPinFreq_Value=32000 +RCC.LSE_VALUE=32768 +RCC.LSI_VALUE=32000 +RCC.MCO1PinFreq_Value=80000000 +RCC.MSI_VALUE=4000000 +RCC.PLLN=40 +RCC.PLLPoutputFreq_Value=80000000 +RCC.PLLQoutputFreq_Value=80000000 +RCC.PLLRCLKFreq_Value=80000000 +RCC.PLLSAI1N=16 +RCC.PLLSAI1PoutputFreq_Value=32000000 +RCC.PLLSAI1QoutputFreq_Value=32000000 +RCC.PLLSAI1RoutputFreq_Value=32000000 +RCC.PLLSAI2PoutputFreq_Value=16000000 +RCC.PLLSAI2RoutputFreq_Value=16000000 +RCC.PWRFreq_Value=80000000 +RCC.RNGFreq_Value=32000000 +RCC.SAI1Freq_Value=32000000 +RCC.SAI2Freq_Value=32000000 +RCC.SDMMCFreq_Value=32000000 +RCC.SWPMI1Freq_Value=80000000 +RCC.SYSCLKFreq_VALUE=80000000 +RCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK +RCC.UART4Freq_Value=80000000 +RCC.UART5Freq_Value=80000000 +RCC.USART1Freq_Value=80000000 +RCC.USART2Freq_Value=80000000 +RCC.USART3Freq_Value=80000000 +RCC.USBFreq_Value=32000000 +RCC.VCOInputFreq_Value=4000000 +RCC.VCOOutputFreq_Value=160000000 +RCC.VCOSAI1OutputFreq_Value=64000000 +RCC.VCOSAI2OutputFreq_Value=32000000 +VP_AES_VS_AES.Mode=AES_Activate +VP_AES_VS_AES.Signal=AES_VS_AES +VP_FREERTOS_VS_CMSIS_V2.Mode=CMSIS_V2 +VP_FREERTOS_VS_CMSIS_V2.Signal=FREERTOS_VS_CMSIS_V2 +VP_HASH_VS_HASH.Mode=HASH_Activate +VP_HASH_VS_HASH.Signal=HASH_VS_HASH +VP_RNG_VS_RNG.Mode=RNG_Activate +VP_RNG_VS_RNG.Signal=RNG_VS_RNG +VP_RTC_VS_RTC_Activate.Mode=RTC_Enabled +VP_RTC_VS_RTC_Activate.Signal=RTC_VS_RTC_Activate +VP_RTC_VS_RTC_Calendar.Mode=RTC_Calendar +VP_RTC_VS_RTC_Calendar.Signal=RTC_VS_RTC_Calendar +VP_SYS_VS_tim1.Mode=TIM1 +VP_SYS_VS_tim1.Signal=SYS_VS_tim1 +VP_wolfSSL.wolfSSL_VS_wolfSSLJjwolfSSL_4.4.1.Mode=wolfSSLJjwolfSSL +VP_wolfSSL.wolfSSL_VS_wolfSSLJjwolfSSL_4.4.1.Signal=wolfSSL.wolfSSL_VS_wolfSSLJjwolfSSL_4.4.1 +board=custom +wolfSSL.wolfSSL.4.4.1.IPParameters=wolfSSLCcwolfSSLJjwolfSSLJjCore,WOLFCRYPT_ONLY,WOLF_CONF_MATH,WOLF_CONF_RTOS +wolfSSL.wolfSSL.4.4.1.WOLFCRYPT_ONLY=False +wolfSSL.wolfSSL.4.4.1.WOLF_CONF_MATH=4 +wolfSSL.wolfSSL.4.4.1.WOLF_CONF_RTOS=2 +wolfSSL.wolfSSL.4.4.1.wolfSSLCcwolfSSLJjwolfSSLJjCore=true +wolfSSL.wolfSSL.4.4.1.wolfSSLJjwolfSSL_Checked=true +wolfSSL.wolfSSL.4.4.1_SwParameter=wolfSSLCcwolfSSLJjwolfSSLJjCore\:true; +isbadioc=false diff --git a/IDE/STM32Cube/Boards/STM32L552.ioc b/IDE/STM32Cube/Boards/STM32L552.ioc new file mode 100644 index 000000000..5162ddad0 --- /dev/null +++ b/IDE/STM32Cube/Boards/STM32L552.ioc @@ -0,0 +1,267 @@ +#MicroXplorer Configuration settings - do not modify +ADC1.Channel-0\#ChannelRegularConversion=ADC_CHANNEL_3 +ADC1.IPParameters=Rank-0\#ChannelRegularConversion,Channel-0\#ChannelRegularConversion,SamplingTime-0\#ChannelRegularConversion,OffsetNumber-0\#ChannelRegularConversion,NbrOfConversionFlag,master +ADC1.NbrOfConversionFlag=1 +ADC1.OffsetNumber-0\#ChannelRegularConversion=ADC_OFFSET_NONE +ADC1.Rank-0\#ChannelRegularConversion=1 +ADC1.SamplingTime-0\#ChannelRegularConversion=ADC_SAMPLETIME_2CYCLES_5 +ADC1.master=1 +FREERTOS.FootprintOK=true +FREERTOS.IPParameters=Tasks01,configTOTAL_HEAP_SIZE,configUSE_MALLOC_FAILED_HOOK,configCHECK_FOR_STACK_OVERFLOW,FootprintOK +FREERTOS.Tasks01=defaultTask,24,128,StartDefaultTask,Default,NULL,Dynamic,NULL,NULL;wolfCrypt,8,35840,wolfCryptDemo,As external,NULL,Dynamic,NULL,NULL +FREERTOS.configCHECK_FOR_STACK_OVERFLOW=2 +FREERTOS.configTOTAL_HEAP_SIZE=180000 +FREERTOS.configUSE_MALLOC_FAILED_HOOK=1 +File.Version=6 +KeepUserPlacement=false +LPUART1.BaudRate=115200 +LPUART1.IPParameters=BaudRate +Mcu.Family=STM32L5 +Mcu.IP0=ADC1 +Mcu.IP1=DEBUG +Mcu.IP10=SYS +Mcu.IP11=UCPD1 +Mcu.IP12=USB +Mcu.IP2=FREERTOS +Mcu.IP3=HASH +Mcu.IP4=LPUART1 +Mcu.IP5=NVIC +Mcu.IP6=PWR +Mcu.IP7=RCC +Mcu.IP8=RNG +Mcu.IP9=RTC +Mcu.IPNb=13 +Mcu.Name=STM32L552Z(C-E)TxQ +Mcu.Package=LQFP144 +Mcu.Pin0=PC13 +Mcu.Pin1=PC14-OSC32_IN (PC14) +Mcu.Pin10=PA11 +Mcu.Pin11=PA12 +Mcu.Pin12=PA13 (JTMS/SWDIO) +Mcu.Pin13=PA14 (JTCK/SWCLK) +Mcu.Pin14=PA15 (JTDI) +Mcu.Pin15=PB3 (JTDO/TRACESWO) +Mcu.Pin16=PB5 +Mcu.Pin17=PB7 +Mcu.Pin18=VP_FREERTOS_VS_CMSIS_V2 +Mcu.Pin19=VP_HASH_VS_HASH +Mcu.Pin2=PC15-OSC32_OUT (PC15) +Mcu.Pin20=VP_PWR_VS_DBSignals +Mcu.Pin21=VP_RNG_VS_RNG +Mcu.Pin22=VP_RTC_VS_RTC_Activate +Mcu.Pin23=VP_SYS_VS_tim1 +Mcu.Pin24=VP_wolfSSL.wolfSSL_VS_wolfSSLJjwolfSSL_4.4.1 +Mcu.Pin3=PC2 +Mcu.Pin4=PB14 +Mcu.Pin5=PB15 +Mcu.Pin6=PG7 +Mcu.Pin7=PG8 +Mcu.Pin8=PC7 +Mcu.Pin9=PA9 +Mcu.PinsNb=25 +Mcu.ThirdParty0=wolfSSL.wolfSSL.4.4.1 +Mcu.ThirdPartyNb=1 +Mcu.TrustZone=disable +Mcu.UserConstants= +Mcu.UserName=STM32L552ZETxQ +MxCube.Version=5.6.1 +MxDb.Version=DB.5.0.60 +NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.ForceEnableDMAVector=true +NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.PendSV_IRQn=true\:7\:0\:false\:false\:false\:true\:false\:false +NVIC.PriorityGroup=NVIC_PRIORITYGROUP_3 +NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:false\:false\:false\:false +NVIC.SysTick_IRQn=true\:7\:0\:false\:false\:false\:true\:false\:false +NVIC.TIM1_UP_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:true +NVIC.TimeBase=TIM1_UP_IRQn +NVIC.TimeBaseIP=TIM1 +NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +PA11.Locked=true +PA11.Mode=Device +PA11.Signal=USB_DM +PA12.Mode=Device +PA12.Signal=USB_DP +PA13\ (JTMS/SWDIO).Locked=true +PA13\ (JTMS/SWDIO).Mode=Trace_Asynchronous_SW +PA13\ (JTMS/SWDIO).Signal=DEBUG_JTMS-SWDIO +PA14\ (JTCK/SWCLK).Locked=true +PA14\ (JTCK/SWCLK).Mode=Trace_Asynchronous_SW +PA14\ (JTCK/SWCLK).Signal=DEBUG_JTCK-SWCLK +PA15\ (JTDI).Locked=true +PA15\ (JTDI).Mode=Source_AllSignals +PA15\ (JTDI).Signal=UCPD1_CC1 +PA9.GPIOParameters=GPIO_Label +PA9.GPIO_Label=LED_RED +PA9.Locked=true +PA9.Signal=GPIO_Output +PB14.GPIOParameters=GPIO_Label +PB14.GPIO_Label=UCPD_FLT +PB14.Locked=true +PB14.Signal=GPXTI14 +PB15.Locked=true +PB15.Mode=Source_AllSignals +PB15.Signal=UCPD1_CC2 +PB3\ (JTDO/TRACESWO).Locked=true +PB3\ (JTDO/TRACESWO).Mode=Trace_Asynchronous_SW +PB3\ (JTDO/TRACESWO).Signal=DEBUG_JTDO-SWO +PB5.GPIOParameters=GPIO_Label +PB5.GPIO_Label=UCPD_DBN +PB5.Locked=true +PB5.Signal=GPIO_Output +PB7.GPIOParameters=GPIO_Label +PB7.GPIO_Label=LED_BLUE +PB7.Locked=true +PB7.Signal=GPIO_Output +PC13.GPIOParameters=GPIO_Label +PC13.GPIO_Label=USER_BUTTON +PC13.Locked=true +PC13.Mode=WakeUp1 +PC13.Signal=PWR_WKUP2 +PC14-OSC32_IN\ (PC14).Locked=true +PC14-OSC32_IN\ (PC14).Mode=LSE-External-Oscillator +PC14-OSC32_IN\ (PC14).Signal=RCC_OSC32_IN +PC15-OSC32_OUT\ (PC15).Locked=true +PC15-OSC32_OUT\ (PC15).Mode=LSE-External-Oscillator +PC15-OSC32_OUT\ (PC15).Signal=RCC_OSC32_OUT +PC2.GPIOParameters=GPIO_Label +PC2.GPIO_Label=VBUS_SENSE +PC2.Locked=true +PC2.Signal=ADCx_IN3 +PC7.GPIOParameters=GPIO_Label +PC7.GPIO_Label=LED_GREEN +PC7.Locked=true +PC7.Signal=GPIO_Output +PG7.GPIOParameters=GPIO_Label +PG7.GPIO_Label=ST-LINK_VCP_TX +PG7.Locked=true +PG7.Mode=Asynchronous +PG7.Signal=LPUART1_TX +PG8.GPIOParameters=GPIO_Label +PG8.GPIO_Label=ST-LINK_VCP_RX +PG8.Locked=true +PG8.Mode=Asynchronous +PG8.Signal=LPUART1_RX +PinOutPanel.RotationAngle=0 +ProjectManager.AskForMigrate=true +ProjectManager.BackupPrevious=false +ProjectManager.CompilerOptimize=6 +ProjectManager.ComputerToolchain=false +ProjectManager.CoupleFile=false +ProjectManager.CustomerFirmwarePackage= +ProjectManager.DefaultFWLocation=true +ProjectManager.DeletePrevious=true +ProjectManager.DeviceId=STM32L552ZETxQ +ProjectManager.FirmwarePackage=STM32Cube FW_L5 V1.2.0 +ProjectManager.FreePins=false +ProjectManager.HalAssertFull=false +ProjectManager.HeapSize=0x200 +ProjectManager.KeepUserCode=true +ProjectManager.LastFirmware=true +ProjectManager.LibraryCopy=1 +ProjectManager.MainLocation=Core/Src +ProjectManager.NoMain=false +ProjectManager.PreviousToolchain= +ProjectManager.ProjectBuild=false +ProjectManager.ProjectFileName=STM32L552.ioc +ProjectManager.ProjectName=STM32L552 +ProjectManager.StackSize=0x400 +ProjectManager.TargetToolchain=STM32CubeIDE +ProjectManager.ToolChainLocation= +ProjectManager.UnderRoot=true +ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-SystemClock_Config-RCC-false-HAL-false,3-MX_ADC1_Init-ADC1-false-HAL-true,4-MX_LPUART1_UART_Init-LPUART1-false-HAL-true,5-MX_RTC_Init-RTC-false-HAL-true,6-MX_UCPD1_Init-UCPD1-false-LL-true,7-MX_USB_PCD_Init-USB-false-HAL-true,0-MX_PWR_Init-PWR-false-HAL-true +RCC.ADCCLockSelection=RCC_ADCCLKSOURCE_SYSCLK +RCC.ADCFreq_Value=110000000 +RCC.AHBFreq_Value=110000000 +RCC.APB1Freq_Value=110000000 +RCC.APB1TimFreq_Value=110000000 +RCC.APB2Freq_Value=110000000 +RCC.APB2TimFreq_Value=110000000 +RCC.CK48CLockSelection=RCC_USBCLKSOURCE_HSI48 +RCC.CRSFreq_Value=48000000 +RCC.CortexFreq_Value=110000000 +RCC.DFSDMAudioFreq_Value=4000000 +RCC.DFSDMFreq_Value=110000000 +RCC.FCLKCortexFreq_Value=110000000 +RCC.FDCANFreq_Value=110000000 +RCC.FamilyName=M +RCC.HCLKFreq_Value=110000000 +RCC.HSE_VALUE=8000000 +RCC.HSI48_VALUE=48000000 +RCC.HSI_VALUE=16000000 +RCC.I2C1Freq_Value=110000000 +RCC.I2C2Freq_Value=110000000 +RCC.I2C3Freq_Value=110000000 +RCC.I2C4Freq_Value=110000000 +RCC.IPParameters=ADCCLockSelection,ADCFreq_Value,AHBFreq_Value,APB1Freq_Value,APB1TimFreq_Value,APB2Freq_Value,APB2TimFreq_Value,CK48CLockSelection,CRSFreq_Value,CortexFreq_Value,DFSDMAudioFreq_Value,DFSDMFreq_Value,FCLKCortexFreq_Value,FDCANFreq_Value,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI48_VALUE,HSI_VALUE,I2C1Freq_Value,I2C2Freq_Value,I2C3Freq_Value,I2C4Freq_Value,LPTIM1Freq_Value,LPTIM2Freq_Value,LPTIM3Freq_Value,LPUART1Freq_Value,LSCOPinFreq_Value,LSI_VALUE,MCO1PinFreq_Value,MSI_VALUE,OCTOSPIMFreq_Value,PLLN,PLLPoutputFreq_Value,PLLQoutputFreq_Value,PLLRCLKFreq_Value,PLLSAI1N,PLLSAI1PoutputFreq_Value,PLLSAI1QoutputFreq_Value,PLLSAI1RoutputFreq_Value,PLLSAI2PoutputFreq_Value,PWRFreq_Value,RNGFreq_Value,RTCClockSelection,RTCFreq_Value,SAI1Freq_Value,SAI2Freq_Value,SDMMCFreq_Value,SYSCLKFreq_VALUE,SYSCLKSource,UART4Freq_Value,UART5Freq_Value,USART1Freq_Value,USART2Freq_Value,USART3Freq_Value,USBFreq_Value,VCOInput2Freq_Value,VCOInput3Freq_Value,VCOInputFreq_Value,VCOOutputFreq_Value,VCOSAI1OutputFreq_Value,VCOSAI2OutputFreq_Value +RCC.LPTIM1Freq_Value=110000000 +RCC.LPTIM2Freq_Value=110000000 +RCC.LPTIM3Freq_Value=110000000 +RCC.LPUART1Freq_Value=110000000 +RCC.LSCOPinFreq_Value=32000 +RCC.LSI_VALUE=32000 +RCC.MCO1PinFreq_Value=110000000 +RCC.MSI_VALUE=4000000 +RCC.OCTOSPIMFreq_Value=110000000 +RCC.PLLN=55 +RCC.PLLPoutputFreq_Value=31428571.42857143 +RCC.PLLQoutputFreq_Value=110000000 +RCC.PLLRCLKFreq_Value=110000000 +RCC.PLLSAI1N=24 +RCC.PLLSAI1PoutputFreq_Value=13714285.714285715 +RCC.PLLSAI1QoutputFreq_Value=48000000 +RCC.PLLSAI1RoutputFreq_Value=48000000 +RCC.PLLSAI2PoutputFreq_Value=4571428.571428572 +RCC.PWRFreq_Value=110000000 +RCC.RNGFreq_Value=48000000 +RCC.RTCClockSelection=RCC_RTCCLKSOURCE_LSE +RCC.RTCFreq_Value=32768 +RCC.SAI1Freq_Value=13714285.714285715 +RCC.SAI2Freq_Value=13714285.714285715 +RCC.SDMMCFreq_Value=31428571.42857143 +RCC.SYSCLKFreq_VALUE=110000000 +RCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK +RCC.UART4Freq_Value=110000000 +RCC.UART5Freq_Value=110000000 +RCC.USART1Freq_Value=110000000 +RCC.USART2Freq_Value=110000000 +RCC.USART3Freq_Value=110000000 +RCC.USBFreq_Value=48000000 +RCC.VCOInput2Freq_Value=4000000 +RCC.VCOInput3Freq_Value=4000000 +RCC.VCOInputFreq_Value=4000000 +RCC.VCOOutputFreq_Value=220000000 +RCC.VCOSAI1OutputFreq_Value=96000000 +RCC.VCOSAI2OutputFreq_Value=32000000 +SH.ADCx_IN3.0=ADC1_IN3,IN3-Single-Ended +SH.ADCx_IN3.ConfNb=1 +SH.GPXTI14.0=GPIO_EXTI14 +SH.GPXTI14.ConfNb=1 +VP_FREERTOS_VS_CMSIS_V2.Mode=CMSIS_V2 +VP_FREERTOS_VS_CMSIS_V2.Signal=FREERTOS_VS_CMSIS_V2 +VP_HASH_VS_HASH.Mode=HASH_Activate +VP_HASH_VS_HASH.Signal=HASH_VS_HASH +VP_PWR_VS_DBSignals.Mode=DisableDeadBatterySignals +VP_PWR_VS_DBSignals.Signal=PWR_VS_DBSignals +VP_RNG_VS_RNG.Mode=RNG_Activate +VP_RNG_VS_RNG.Signal=RNG_VS_RNG +VP_RTC_VS_RTC_Activate.Mode=RTC_Enabled +VP_RTC_VS_RTC_Activate.Signal=RTC_VS_RTC_Activate +VP_SYS_VS_tim1.Mode=TIM1 +VP_SYS_VS_tim1.Signal=SYS_VS_tim1 +VP_wolfSSL.wolfSSL_VS_wolfSSLJjwolfSSL_4.4.1.Mode=wolfSSLJjwolfSSL +VP_wolfSSL.wolfSSL_VS_wolfSSLJjwolfSSL_4.4.1.Signal=wolfSSL.wolfSSL_VS_wolfSSLJjwolfSSL_4.4.1 +board=NUCLEO-L552ZE-Q +boardIOC=true +wolfSSL.wolfSSL.4.4.1.IPParameters=wolfSSLCcwolfSSLJjwolfSSLJjCore,wolfSSLCcwolfSSLJjwolfCryptJjCore,wolfSSLCcwolfSSLJjwolfCryptJjTest,WOLF_CONF_MATH,WOLF_CONF_RTOS +wolfSSL.wolfSSL.4.4.1.WOLF_CONF_MATH=4 +wolfSSL.wolfSSL.4.4.1.WOLF_CONF_RTOS=2 +wolfSSL.wolfSSL.4.4.1.wolfSSLCcwolfSSLJjwolfCryptJjCore=true +wolfSSL.wolfSSL.4.4.1.wolfSSLCcwolfSSLJjwolfCryptJjTest=true +wolfSSL.wolfSSL.4.4.1.wolfSSLCcwolfSSLJjwolfSSLJjCore=true +wolfSSL.wolfSSL.4.4.1.wolfSSLJjwolfSSL_Checked=true +wolfSSL.wolfSSL.4.4.1_SwParameter=wolfSSLCcwolfSSLJjwolfCryptJjCore\:true;wolfSSLCcwolfSSLJjwolfCryptJjTest\:true;wolfSSLCcwolfSSLJjwolfSSLJjCore\:true; +isbadioc=false diff --git a/IDE/STM32Cube/Boards/STM32L562.ioc b/IDE/STM32Cube/Boards/STM32L562.ioc new file mode 100644 index 000000000..bb06e0823 --- /dev/null +++ b/IDE/STM32Cube/Boards/STM32L562.ioc @@ -0,0 +1,650 @@ +#MicroXplorer Configuration settings - do not modify +ADC1.Channel-0\#ChannelRegularConversion=ADC_CHANNEL_9 +ADC1.IPParameters=Rank-0\#ChannelRegularConversion,master,Channel-0\#ChannelRegularConversion,SamplingTime-0\#ChannelRegularConversion,OffsetNumber-0\#ChannelRegularConversion,NbrOfConversionFlag +ADC1.NbrOfConversionFlag=1 +ADC1.OffsetNumber-0\#ChannelRegularConversion=ADC_OFFSET_NONE +ADC1.Rank-0\#ChannelRegularConversion=1 +ADC1.SamplingTime-0\#ChannelRegularConversion=ADC_SAMPLETIME_2CYCLES_5 +ADC1.master=1 +FREERTOS.FootprintOK=true +FREERTOS.IPParameters=Tasks01,configUSE_MALLOC_FAILED_HOOK,configCHECK_FOR_STACK_OVERFLOW,FootprintOK,configTOTAL_HEAP_SIZE +FREERTOS.Tasks01=defaultTask,24,128,StartDefaultTask,Default,NULL,Dynamic,NULL,NULL;wolfCrypt,8,35840,wolfCryptDemo,As external,NULL,Dynamic,NULL,NULL +FREERTOS.configCHECK_FOR_STACK_OVERFLOW=2 +FREERTOS.configTOTAL_HEAP_SIZE=180000 +FREERTOS.configUSE_MALLOC_FAILED_HOOK=1 +File.Version=6 +I2C1.IPParameters=Timing +I2C1.Timing=0x40505681 +KeepUserPlacement=false +Mcu.Family=STM32L5 +Mcu.IP0=ADC1 +Mcu.IP1=AES +Mcu.IP10=NVIC +Mcu.IP11=OCTOSPI1 +Mcu.IP12=PKA +Mcu.IP13=PWR +Mcu.IP14=RCC +Mcu.IP15=RNG +Mcu.IP16=RTC +Mcu.IP17=SAI1 +Mcu.IP18=SDMMC1 +Mcu.IP19=SPI1 +Mcu.IP2=DEBUG +Mcu.IP20=SYS +Mcu.IP21=TIM4 +Mcu.IP22=TIM16 +Mcu.IP23=TIM17 +Mcu.IP24=UCPD1 +Mcu.IP25=USART1 +Mcu.IP26=USB +Mcu.IP3=DFSDM1 +Mcu.IP4=FMC +Mcu.IP5=FREERTOS +Mcu.IP6=GTZC +Mcu.IP7=HASH +Mcu.IP8=I2C1 +Mcu.IP9=LPUART1 +Mcu.IPNb=27 +Mcu.Name=STM32L562QEIxQ +Mcu.Package=UFBGA132 +Mcu.Pin0=PE5 +Mcu.Pin1=PE3 +Mcu.Pin10=PE2 +Mcu.Pin11=PD4 +Mcu.Pin12=PD1 +Mcu.Pin13=PC12 +Mcu.Pin14=PC10 +Mcu.Pin15=PA12 +Mcu.Pin16=PC14-OSC32_IN (PC14) +Mcu.Pin17=PE6 +Mcu.Pin18=PC13 +Mcu.Pin19=PB3 (JTDO/TRACESWO) +Mcu.Pin2=PE1 +Mcu.Pin20=PD3 +Mcu.Pin21=PD0 +Mcu.Pin22=PA13 (JTMS/SWDIO) +Mcu.Pin23=PA14 (JTCK/SWCLK) +Mcu.Pin24=PA11 +Mcu.Pin25=PC15-OSC32_OUT (PC15) +Mcu.Pin26=PF0 +Mcu.Pin27=PF3 +Mcu.Pin28=PB7 +Mcu.Pin29=PB5 +Mcu.Pin3=PB6 +Mcu.Pin30=PD7 +Mcu.Pin31=PA9 +Mcu.Pin32=PA10 +Mcu.Pin33=PA8 +Mcu.Pin34=PF2 +Mcu.Pin35=PF1 +Mcu.Pin36=PC9 +Mcu.Pin37=PC8 +Mcu.Pin38=PH0-OSC_IN (PH0) +Mcu.Pin39=PC2 +Mcu.Pin4=PG12 +Mcu.Pin40=PC3 +Mcu.Pin41=PG6 +Mcu.Pin42=PG7 +Mcu.Pin43=PG8 +Mcu.Pin44=PC1 +Mcu.Pin45=PG4 +Mcu.Pin46=PG2 +Mcu.Pin47=PG3 +Mcu.Pin48=PG5 +Mcu.Pin49=PC0 +Mcu.Pin5=PD5 +Mcu.Pin50=PD14 +Mcu.Pin51=PD15 +Mcu.Pin52=PF14 +Mcu.Pin53=PE8 +Mcu.Pin54=PE10 +Mcu.Pin55=PE12 +Mcu.Pin56=PD9 +Mcu.Pin57=PA2 +Mcu.Pin58=PA7 +Mcu.Pin59=PB2 +Mcu.Pin6=PD2 +Mcu.Pin60=PF11 +Mcu.Pin61=PG1 +Mcu.Pin62=PE7 +Mcu.Pin63=PE14 +Mcu.Pin64=PB10 +Mcu.Pin65=PB14 +Mcu.Pin66=PB15 +Mcu.Pin67=PA3 +Mcu.Pin68=PA6 +Mcu.Pin69=PA4 +Mcu.Pin7=PC11 +Mcu.Pin70=PB1 +Mcu.Pin71=PF12 +Mcu.Pin72=PF15 +Mcu.Pin73=PE11 +Mcu.Pin74=PE15 +Mcu.Pin75=PB11 +Mcu.Pin76=PB12 +Mcu.Pin77=PD8 +Mcu.Pin78=PB0 +Mcu.Pin79=PE9 +Mcu.Pin8=PA15 (JTDI) +Mcu.Pin80=PE13 +Mcu.Pin81=PD10 +Mcu.Pin82=VP_AES_VS_AES +Mcu.Pin83=VP_DFSDM1_VS_IN0 +Mcu.Pin84=VP_DFSDM1_VS_IN2 +Mcu.Pin85=VP_FREERTOS_VS_CMSIS_V2 +Mcu.Pin86=VP_GTZC_VS_GTZC_Enable +Mcu.Pin87=VP_HASH_VS_HASH +Mcu.Pin88=VP_PKA_VS_PKA +Mcu.Pin89=VP_PWR_VS_DBSignals +Mcu.Pin9=PE4 +Mcu.Pin90=VP_RNG_VS_RNG +Mcu.Pin91=VP_RTC_VS_RTC_Activate +Mcu.Pin92=VP_SYS_VS_tim1 +Mcu.Pin93=VP_SYS_S_VS_Systick +Mcu.Pin94=VP_TIM4_VS_ControllerModeClock +Mcu.Pin95=VP_TIM4_VS_ClockSourceITR +Mcu.Pin96=VP_TIM16_VS_ClockSourceINT +Mcu.Pin97=VP_TIM17_VS_ClockSourceINT +Mcu.Pin98=VP_wolfSSL.wolfSSL_VS_wolfSSLJjwolfSSL_4.4.1 +Mcu.PinsNb=99 +Mcu.ThirdParty0=wolfSSL.wolfSSL.4.4.1 +Mcu.ThirdPartyNb=1 +Mcu.TrustZone=disable +Mcu.UserConstants= +Mcu.UserName=STM32L562QEIxQ +MxCube.Version=5.6.1 +MxDb.Version=DB.5.0.60 +NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.ForceEnableDMAVector=true +NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.PendSV_IRQn=true\:7\:0\:false\:false\:false\:true\:false\:false +NVIC.PriorityGroup=NVIC_PRIORITYGROUP_3 +NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:false\:false\:false\:false +NVIC.SysTick_IRQn=true\:7\:0\:false\:false\:false\:true\:false\:false +NVIC.TIM1_UP_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:true +NVIC.TimeBase=TIM1_UP_IRQn +NVIC.TimeBaseIP=TIM1 +NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +PA10.GPIOParameters=GPIO_Label +PA10.GPIO_Label=USART1_RX [ST-LINK_VCP_TX] +PA10.Locked=true +PA10.Mode=Asynchronous +PA10.Signal=USART1_RX +PA11.Locked=true +PA11.Mode=Device +PA11.Signal=USB_DM +PA12.Locked=true +PA12.Mode=Device +PA12.Signal=USB_DP +PA13\ (JTMS/SWDIO).Locked=true +PA13\ (JTMS/SWDIO).Mode=Trace_Asynchronous_SW +PA13\ (JTMS/SWDIO).Signal=DEBUG_JTMS-SWDIO +PA14\ (JTCK/SWCLK).Locked=true +PA14\ (JTCK/SWCLK).Mode=Trace_Asynchronous_SW +PA14\ (JTCK/SWCLK).Signal=DEBUG_JTCK-SWCLK +PA15\ (JTDI).Locked=true +PA15\ (JTDI).Mode=Source_AllSignals +PA15\ (JTDI).Signal=UCPD1_CC1 +PA2.Locked=true +PA2.Mode=octods_mode +PA2.Signal=OCTOSPI1_NCS +PA3.Locked=true +PA3.Mode=octods_mode +PA3.Signal=OCTOSPI1_CLK +PA4.GPIOParameters=GPIO_Label +PA4.GPIO_Label=VBUS_SENSE +PA4.Locked=true +PA4.Signal=ADCx_IN9 +PA6.Locked=true +PA6.Mode=octods_mode +PA6.Signal=OCTOSPI1_IO3 +PA7.Locked=true +PA7.Mode=octods_mode +PA7.Signal=OCTOSPI1_IO2 +PA8.GPIOParameters=GPIO_Label +PA8.GPIO_Label=LCD.TE +PA8.Locked=true +PA8.Signal=GPIO_Output +PA9.GPIOParameters=GPIO_Label +PA9.GPIO_Label=USART1_TX [ST-LINK_VCP_RX] +PA9.Locked=true +PA9.Mode=Asynchronous +PA9.Signal=USART1_TX +PB0.Locked=true +PB0.Mode=octods_mode +PB0.Signal=OCTOSPI1_IO1 +PB1.Locked=true +PB1.Mode=octods_mode +PB1.Signal=OCTOSPI1_IO0 +PB10.Locked=true +PB10.Mode=Asynchronous +PB10.Signal=LPUART1_RX +PB11.Locked=true +PB11.Mode=Asynchronous +PB11.Signal=LPUART1_TX +PB12.Locked=true +PB12.Signal=S_DATAIN1DFSDM1 +PB14.GPIOParameters=GPIO_Label +PB14.GPIO_Label=UCPD_FLT +PB14.Locked=true +PB14.Signal=GPIO_Input +PB15.Locked=true +PB15.Mode=Source_AllSignals +PB15.Signal=UCPD1_CC2 +PB2.Locked=true +PB2.Mode=octods_mode +PB2.Signal=OCTOSPI1_DQS +PB3\ (JTDO/TRACESWO).Locked=true +PB3\ (JTDO/TRACESWO).Mode=Trace_Asynchronous_SW +PB3\ (JTDO/TRACESWO).Signal=DEBUG_JTDO-SWO +PB5.GPIOParameters=GPIO_Label +PB5.GPIO_Label=UCPD_DBn +PB5.Locked=true +PB5.Signal=GPIO_Output +PB6.Locked=true +PB6.Mode=I2C +PB6.Signal=I2C1_SCL +PB7.Locked=true +PB7.Mode=I2C +PB7.Signal=I2C1_SDA +PC0.Locked=true +PC0.Mode=octods_mode +PC0.Signal=OCTOSPI1_IO7 +PC1.Locked=true +PC1.Mode=octods_mode +PC1.Signal=OCTOSPI1_IO4 +PC10.Locked=true +PC10.Mode=SD_4_bits_Wide_bus +PC10.Signal=SDMMC1_D2 +PC11.Locked=true +PC11.Mode=SD_4_bits_Wide_bus +PC11.Signal=SDMMC1_D3 +PC12.Locked=true +PC12.Mode=SD_4_bits_Wide_bus +PC12.Signal=SDMMC1_CK +PC13.GPIOParameters=GPIO_Label +PC13.GPIO_Label=USER_BUTTON +PC13.Locked=true +PC13.Signal=GPIO_Input +PC14-OSC32_IN\ (PC14).Locked=true +PC14-OSC32_IN\ (PC14).Mode=LSE-External-Oscillator +PC14-OSC32_IN\ (PC14).Signal=RCC_OSC32_IN +PC15-OSC32_OUT\ (PC15).Locked=true +PC15-OSC32_OUT\ (PC15).Mode=LSE-External-Oscillator +PC15-OSC32_OUT\ (PC15).Signal=RCC_OSC32_OUT +PC2.Locked=true +PC2.Mode=octods_mode +PC2.Signal=OCTOSPI1_IO5 +PC3.Locked=true +PC3.Mode=octods_mode +PC3.Signal=OCTOSPI1_IO6 +PC8.Locked=true +PC8.Mode=SD_4_bits_Wide_bus +PC8.Signal=SDMMC1_D0 +PC9.Locked=true +PC9.Mode=SD_4_bits_Wide_bus +PC9.Signal=SDMMC1_D1 +PD0.Locked=true +PD0.Signal=FMC_D2_DA2 +PD1.Locked=true +PD1.Signal=FMC_D3_DA3 +PD10.Locked=true +PD10.Signal=FMC_D15_DA15 +PD14.Locked=true +PD14.Signal=FMC_D0_DA0 +PD15.Locked=true +PD15.Signal=FMC_D1_DA1 +PD2.Locked=true +PD2.Mode=SD_4_bits_Wide_bus +PD2.Signal=SDMMC1_CMD +PD3.GPIOParameters=GPIO_Label +PD3.GPIO_Label=LED_RED +PD3.Locked=true +PD3.Signal=GPIO_Output +PD4.Locked=true +PD4.Signal=FMC_NOE +PD5.Locked=true +PD5.Signal=FMC_NWE +PD7.Locked=true +PD7.Mode=NorPsramChipSelect1_1 +PD7.Signal=FMC_NE1 +PD8.Locked=true +PD8.Signal=FMC_D13_DA13 +PD9.Locked=true +PD9.Signal=FMC_D14_DA14 +PE1.GPIOParameters=GPIO_Label +PE1.GPIO_Label=LCD_BL_PWM +PE1.Locked=true +PE1.Signal=S_TIM17_CH1 +PE10.Locked=true +PE10.Signal=FMC_D7_DA7 +PE11.Locked=true +PE11.Signal=FMC_D8_DA8 +PE12.Locked=true +PE12.Signal=FMC_D9_DA9 +PE13.Locked=true +PE13.Signal=FMC_D10_DA10 +PE14.Locked=true +PE14.Signal=FMC_D11_DA11 +PE15.Locked=true +PE15.Signal=FMC_D12_DA12 +PE2.Locked=true +PE2.Mode=SAI_A_MasterWithClock +PE2.Signal=SAI1_MCLK_A +PE3.Locked=true +PE3.Mode=SAI_B_SPDIF +PE3.Signal=SAI1_SD_B +PE4.Locked=true +PE4.Mode=SAI_A_MasterWithClock +PE4.Signal=SAI1_FS_A +PE5.Locked=true +PE5.Mode=SAI_A_MasterWithClock +PE5.Signal=SAI1_SCK_A +PE6.Locked=true +PE6.Mode=SAI_A_MasterWithClock +PE6.Signal=SAI1_SD_A +PE7.Locked=true +PE7.Signal=FMC_D4_DA4 +PE8.Locked=true +PE8.Signal=FMC_D5_DA5 +PE9.Locked=true +PE9.Signal=FMC_D6_DA6 +PF0.Locked=true +PF0.Signal=FMC_A0 +PF1.GPIOParameters=GPIO_Label +PF1.GPIO_Label=CTP_INT +PF1.Locked=true +PF1.Signal=GPXTI1 +PF11.GPIOParameters=GPIO_Label +PF11.GPIO_Label=STMOD_SEL_12 +PF11.Locked=true +PF11.Signal=GPIO_Output +PF12.GPIOParameters=GPIO_Label +PF12.GPIO_Label=STMOD_SEL_34 +PF12.Locked=true +PF12.Signal=GPIO_Output +PF14.GPIOParameters=GPIO_Label +PF14.GPIO_Label=LCD_RST +PF14.Locked=true +PF14.Signal=GPIO_Output +PF15.GPIOParameters=GPIO_Label +PF15.GPIO_Label=CTP_RST +PF15.Locked=true +PF15.Signal=GPIO_Output +PF2.GPIOParameters=GPIO_Label +PF2.GPIO_Label=SDIO_DETECT +PF2.Locked=true +PF2.Signal=GPXTI2 +PF3.GPIOParameters=GPIO_Label +PF3.GPIO_Label=GYRO_ACC_INT +PF3.Locked=true +PF3.Signal=GPXTI3 +PG1.GPIOParameters=GPIO_Label +PG1.GPIO_Label=AUDIO_RESETN +PG1.Locked=true +PG1.Signal=GPIO_Output +PG12.GPIOParameters=GPIO_Label +PG12.GPIO_Label=LED_GREEN +PG12.Locked=true +PG12.Signal=GPIO_Output +PG2.Locked=true +PG2.Mode=Full_Duplex_Master +PG2.Signal=SPI1_SCK +PG3.Locked=true +PG3.Mode=Full_Duplex_Master +PG3.Signal=SPI1_MISO +PG4.Locked=true +PG4.Mode=Full_Duplex_Master +PG4.Signal=SPI1_MOSI +PG5.GPIOParameters=GPIO_Label +PG5.GPIO_Label=BLE_CSN +PG5.Locked=true +PG5.Mode=NSS_Signal_Hard_Input +PG5.Signal=SPI1_NSS +PG6.GPIOParameters=GPIO_Label +PG6.GPIO_Label=BLE_INT +PG6.Locked=true +PG6.Signal=GPXTI6 +PG7.Locked=true +PG7.Signal=S_CKOUTDFSDM1 +PG8.GPIOParameters=GPIO_Label +PG8.GPIO_Label=BLE_RSTN +PG8.Locked=true +PG8.Signal=GPIO_Output +PH0-OSC_IN\ (PH0).GPIOParameters=GPIO_Label +PH0-OSC_IN\ (PH0).GPIO_Label=LCD_PWR_ON +PH0-OSC_IN\ (PH0).Locked=true +PH0-OSC_IN\ (PH0).Signal=GPIO_Output +PinOutPanel.CurrentBGAView=Top +PinOutPanel.RotationAngle=0 +ProjectManager.AskForMigrate=true +ProjectManager.BackupPrevious=false +ProjectManager.CompilerOptimize=6 +ProjectManager.ComputerToolchain=false +ProjectManager.CoupleFile=false +ProjectManager.CustomerFirmwarePackage= +ProjectManager.DefaultFWLocation=true +ProjectManager.DeletePrevious=true +ProjectManager.DeviceId=STM32L562QEIxQ +ProjectManager.FirmwarePackage=STM32Cube FW_L5 V1.2.0 +ProjectManager.FreePins=false +ProjectManager.HalAssertFull=false +ProjectManager.HeapSize=0x200 +ProjectManager.KeepUserCode=true +ProjectManager.LastFirmware=true +ProjectManager.LibraryCopy=1 +ProjectManager.MainLocation=Core/Src +ProjectManager.NoMain=false +ProjectManager.PreviousToolchain= +ProjectManager.ProjectBuild=false +ProjectManager.ProjectFileName=STM32L562.ioc +ProjectManager.ProjectName=STM32L562 +ProjectManager.StackSize=0x400 +ProjectManager.TargetToolchain=STM32CubeIDE +ProjectManager.ToolChainLocation= +ProjectManager.UnderRoot=true +ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-SystemClock_Config-RCC-false-HAL-false,3-MX_ADC1_Init-ADC1-false-HAL-true,4-MX_DFSDM1_Init-DFSDM1-false-HAL-true,5-MX_FMC_Init-FMC-false-HAL-true,6-MX_GTZC_Init-GTZC-false-HAL-true,7-MX_I2C1_Init-I2C1-false-HAL-true,8-MX_LPUART1_UART_Init-LPUART1-false-HAL-true,9-MX_USART1_UART_Init-USART1-false-HAL-true,10-MX_OCTOSPI1_Init-OCTOSPI1-false-HAL-true,11-MX_SAI1_Init-SAI1-false-HAL-true,12-MX_SDMMC1_SD_Init-SDMMC1-false-HAL-true,13-MX_SPI1_Init-SPI1-false-HAL-true,14-MX_TIM4_Init-TIM4-false-HAL-true,15-MX_TIM16_Init-TIM16-false-HAL-true,16-MX_TIM17_Init-TIM17-false-HAL-true,17-MX_UCPD1_Init-UCPD1-false-LL-true,18-MX_USB_PCD_Init-USB-false-HAL-true,19-MX_AES_Init-AES-false-HAL-true,20-MX_HASH_Init-HASH-false-HAL-true,21-MX_PKA_Init-PKA-false-HAL-true,22-MX_RNG_Init-RNG-false-HAL-true,0-MX_PWR_Init-PWR-false-HAL-true +RCC.ADCFreq_Value=96000000 +RCC.AHBFreq_Value=110000000 +RCC.APB1Freq_Value=110000000 +RCC.APB1TimFreq_Value=110000000 +RCC.APB2Freq_Value=110000000 +RCC.APB2TimFreq_Value=110000000 +RCC.CK48CLockSelection=RCC_USBCLKSOURCE_MSI +RCC.CRSFreq_Value=48000000 +RCC.CortexFreq_Value=110000000 +RCC.DFSDMAudioFreq_Value=48000000 +RCC.DFSDMFreq_Value=110000000 +RCC.FCLKCortexFreq_Value=110000000 +RCC.FDCANFreq_Value=110000000 +RCC.FamilyName=M +RCC.HCLKFreq_Value=110000000 +RCC.HSE_VALUE=8000000 +RCC.HSI48_VALUE=48000000 +RCC.HSI_VALUE=16000000 +RCC.I2C1Freq_Value=110000000 +RCC.I2C2Freq_Value=110000000 +RCC.I2C3Freq_Value=110000000 +RCC.I2C4Freq_Value=110000000 +RCC.IPParameters=ADCFreq_Value,AHBFreq_Value,APB1Freq_Value,APB1TimFreq_Value,APB2Freq_Value,APB2TimFreq_Value,CK48CLockSelection,CRSFreq_Value,CortexFreq_Value,DFSDMAudioFreq_Value,DFSDMFreq_Value,FCLKCortexFreq_Value,FDCANFreq_Value,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI48_VALUE,HSI_VALUE,I2C1Freq_Value,I2C2Freq_Value,I2C3Freq_Value,I2C4Freq_Value,LPTIM1Freq_Value,LPTIM2Freq_Value,LPTIM3Freq_Value,LPUART1Freq_Value,LSCOPinFreq_Value,LSI_VALUE,MCO1PinFreq_Value,MSIClockRange,MSI_VALUE,OCTOSPIMFreq_Value,PLLM,PLLN,PLLPoutputFreq_Value,PLLQoutputFreq_Value,PLLRCLKFreq_Value,PLLSAI1M,PLLSAI1N,PLLSAI1P,PLLSAI1PoutputFreq_Value,PLLSAI1QoutputFreq_Value,PLLSAI1RoutputFreq_Value,PLLSAI1Source,PLLSAI2PoutputFreq_Value,PWRFreq_Value,RNGFreq_Value,SAI1Freq_Value,SAI2Freq_Value,SDMMCClockSelection,SDMMCFreq_Value,SYSCLKFreq_VALUE,SYSCLKSource,UART4Freq_Value,UART5Freq_Value,USART1Freq_Value,USART2Freq_Value,USART3Freq_Value,USBFreq_Value,VCOInput2Freq_Value,VCOInput3Freq_Value,VCOInputFreq_Value,VCOOutputFreq_Value,VCOSAI1OutputFreq_Value,VCOSAI2OutputFreq_Value +RCC.LPTIM1Freq_Value=110000000 +RCC.LPTIM2Freq_Value=110000000 +RCC.LPTIM3Freq_Value=110000000 +RCC.LPUART1Freq_Value=110000000 +RCC.LSCOPinFreq_Value=32000 +RCC.LSI_VALUE=32000 +RCC.MCO1PinFreq_Value=110000000 +RCC.MSIClockRange=RCC_MSIRANGE_11 +RCC.MSI_VALUE=48000000 +RCC.OCTOSPIMFreq_Value=110000000 +RCC.PLLM=12 +RCC.PLLN=55 +RCC.PLLPoutputFreq_Value=31428571.42857143 +RCC.PLLQoutputFreq_Value=110000000 +RCC.PLLRCLKFreq_Value=110000000 +RCC.PLLSAI1M=4 +RCC.PLLSAI1N=48 +RCC.PLLSAI1P=RCC_PLLP_DIV17 +RCC.PLLSAI1PoutputFreq_Value=11294117.647058824 +RCC.PLLSAI1QoutputFreq_Value=96000000 +RCC.PLLSAI1RoutputFreq_Value=96000000 +RCC.PLLSAI1Source=RCC_PLLSAI1SOURCE_HSI +RCC.PLLSAI2PoutputFreq_Value=54857142.85714286 +RCC.PWRFreq_Value=110000000 +RCC.RNGFreq_Value=48000000 +RCC.SAI1Freq_Value=11294117.647058824 +RCC.SAI2Freq_Value=11294117.647058824 +RCC.SDMMCClockSelection=RCC_SDIOCLKSOURCE_CLK48 +RCC.SDMMCFreq_Value=48000000 +RCC.SYSCLKFreq_VALUE=110000000 +RCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK +RCC.UART4Freq_Value=110000000 +RCC.UART5Freq_Value=110000000 +RCC.USART1Freq_Value=110000000 +RCC.USART2Freq_Value=110000000 +RCC.USART3Freq_Value=110000000 +RCC.USBFreq_Value=48000000 +RCC.VCOInput2Freq_Value=4000000 +RCC.VCOInput3Freq_Value=48000000 +RCC.VCOInputFreq_Value=4000000 +RCC.VCOOutputFreq_Value=220000000 +RCC.VCOSAI1OutputFreq_Value=192000000 +RCC.VCOSAI2OutputFreq_Value=384000000 +SAI1.ErrorAudioFreq-SAI_A_MasterWithClock=-77.02 % +SAI1.IPParameters=Instance-SAI_B_SPDIF,VirtualMode-SAI_B_SPDIF,RealAudioFreq-SAI_B_SPDIF,Instance-SAI_A_MasterWithClock,VirtualMode-SAI_A_MasterWithClock,MckOutput-SAI_A_MasterWithClock,RealAudioFreq-SAI_A_MasterWithClock,ErrorAudioFreq-SAI_A_MasterWithClock +SAI1.Instance-SAI_A_MasterWithClock=SAI$Index_Block_A +SAI1.Instance-SAI_B_SPDIF=SAI$Index_Block_B +SAI1.MckOutput-SAI_A_MasterWithClock=SAI_MCK_OUTPUT_ENABLE +SAI1.RealAudioFreq-SAI_A_MasterWithClock=44.117 KHz +SAI1.RealAudioFreq-SAI_B_SPDIF=214.285 KHz +SAI1.VirtualMode-SAI_A_MasterWithClock=VM_MASTER +SAI1.VirtualMode-SAI_B_SPDIF=VM_SPDIF +SH.ADCx_IN9.0=ADC1_IN9,IN9-Single-Ended +SH.ADCx_IN9.ConfNb=1 +SH.FMC_A0.0=FMC_A0,A0_1 +SH.FMC_A0.ConfNb=1 +SH.FMC_D0_DA0.0=FMC_DA0 +SH.FMC_D0_DA0.1=FMC_D0,16b-d1 +SH.FMC_D0_DA0.ConfNb=2 +SH.FMC_D10_DA10.0=FMC_DA10 +SH.FMC_D10_DA10.1=FMC_D10,16b-d1 +SH.FMC_D10_DA10.ConfNb=2 +SH.FMC_D11_DA11.0=FMC_DA11 +SH.FMC_D11_DA11.1=FMC_D11,16b-d1 +SH.FMC_D11_DA11.ConfNb=2 +SH.FMC_D12_DA12.0=FMC_DA12 +SH.FMC_D12_DA12.1=FMC_D12,16b-d1 +SH.FMC_D12_DA12.ConfNb=2 +SH.FMC_D13_DA13.0=FMC_DA13 +SH.FMC_D13_DA13.1=FMC_D13,16b-d1 +SH.FMC_D13_DA13.ConfNb=2 +SH.FMC_D14_DA14.0=FMC_DA14 +SH.FMC_D14_DA14.1=FMC_D14,16b-d1 +SH.FMC_D14_DA14.ConfNb=2 +SH.FMC_D15_DA15.0=FMC_DA15 +SH.FMC_D15_DA15.1=FMC_D15,16b-d1 +SH.FMC_D15_DA15.ConfNb=2 +SH.FMC_D1_DA1.0=FMC_DA1 +SH.FMC_D1_DA1.1=FMC_D1,16b-d1 +SH.FMC_D1_DA1.ConfNb=2 +SH.FMC_D2_DA2.0=FMC_DA2 +SH.FMC_D2_DA2.1=FMC_D2,16b-d1 +SH.FMC_D2_DA2.ConfNb=2 +SH.FMC_D3_DA3.0=FMC_DA3 +SH.FMC_D3_DA3.1=FMC_D3,16b-d1 +SH.FMC_D3_DA3.ConfNb=2 +SH.FMC_D4_DA4.0=FMC_DA4 +SH.FMC_D4_DA4.1=FMC_D4,16b-d1 +SH.FMC_D4_DA4.ConfNb=2 +SH.FMC_D5_DA5.0=FMC_DA5 +SH.FMC_D5_DA5.1=FMC_D5,16b-d1 +SH.FMC_D5_DA5.ConfNb=2 +SH.FMC_D6_DA6.0=FMC_DA6 +SH.FMC_D6_DA6.1=FMC_D6,16b-d1 +SH.FMC_D6_DA6.ConfNb=2 +SH.FMC_D7_DA7.0=FMC_DA7 +SH.FMC_D7_DA7.1=FMC_D7,16b-d1 +SH.FMC_D7_DA7.ConfNb=2 +SH.FMC_D8_DA8.0=FMC_DA8 +SH.FMC_D8_DA8.1=FMC_D8,16b-d1 +SH.FMC_D8_DA8.ConfNb=2 +SH.FMC_D9_DA9.0=FMC_DA9 +SH.FMC_D9_DA9.1=FMC_D9,16b-d1 +SH.FMC_D9_DA9.ConfNb=2 +SH.FMC_NOE.0=FMC_NOE,Lcd1 +SH.FMC_NOE.ConfNb=1 +SH.FMC_NWE.0=FMC_NWE,Lcd1 +SH.FMC_NWE.ConfNb=1 +SH.GPXTI1.0=GPIO_EXTI1 +SH.GPXTI1.ConfNb=1 +SH.GPXTI2.0=GPIO_EXTI2 +SH.GPXTI2.ConfNb=1 +SH.GPXTI3.0=GPIO_EXTI3 +SH.GPXTI3.ConfNb=1 +SH.GPXTI6.0=GPIO_EXTI6 +SH.GPXTI6.ConfNb=1 +SH.S_CKOUTDFSDM1.0=DFSDM1_CKOUT,CKOUT +SH.S_CKOUTDFSDM1.ConfNb=1 +SH.S_DATAIN1DFSDM1.0=DFSDM1_DATIN1,Manchester_input_from_ch1 +SH.S_DATAIN1DFSDM1.ConfNb=1 +SH.S_TIM17_CH1.0=TIM17_CH1,PWM Generation1 CH1 +SH.S_TIM17_CH1.ConfNb=1 +SPI1.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_8 +SPI1.CalculateBaudRate=13.75 MBits/s +SPI1.Direction=SPI_DIRECTION_2LINES +SPI1.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate,VirtualNSS,BaudRatePrescaler +SPI1.Mode=SPI_MODE_MASTER +SPI1.VirtualNSS=VM_NSSHARD +SPI1.VirtualType=VM_MASTER +TIM17.Channel=TIM_CHANNEL_1 +TIM17.IPParameters=Channel +USART1.IPParameters=VirtualMode-Asynchronous +USART1.VirtualMode-Asynchronous=VM_ASYNC +VP_AES_VS_AES.Mode=AES_Activate +VP_AES_VS_AES.Signal=AES_VS_AES +VP_DFSDM1_VS_IN0.Mode=Parallel_Input_ch0 +VP_DFSDM1_VS_IN0.Signal=DFSDM1_VS_IN0 +VP_DFSDM1_VS_IN2.Mode=Parallel_Input_ch2 +VP_DFSDM1_VS_IN2.Signal=DFSDM1_VS_IN2 +VP_FREERTOS_VS_CMSIS_V2.Mode=CMSIS_V2 +VP_FREERTOS_VS_CMSIS_V2.Signal=FREERTOS_VS_CMSIS_V2 +VP_GTZC_VS_GTZC_Enable.Mode=GTZC_Enable +VP_GTZC_VS_GTZC_Enable.Signal=GTZC_VS_GTZC_Enable +VP_HASH_VS_HASH.Mode=HASH_Activate +VP_HASH_VS_HASH.Signal=HASH_VS_HASH +VP_PKA_VS_PKA.Mode=PKA_Activate +VP_PKA_VS_PKA.Signal=PKA_VS_PKA +VP_PWR_VS_DBSignals.Mode=DisableDeadBatterySignals +VP_PWR_VS_DBSignals.Signal=PWR_VS_DBSignals +VP_RNG_VS_RNG.Mode=RNG_Activate +VP_RNG_VS_RNG.Signal=RNG_VS_RNG +VP_RTC_VS_RTC_Activate.Mode=RTC_Enabled +VP_RTC_VS_RTC_Activate.Signal=RTC_VS_RTC_Activate +VP_SYS_S_VS_Systick.Mode=SysTick +VP_SYS_S_VS_Systick.Signal=SYS_S_VS_Systick +VP_SYS_VS_tim1.Mode=TIM1 +VP_SYS_VS_tim1.Signal=SYS_VS_tim1 +VP_TIM16_VS_ClockSourceINT.Mode=Enable_Timer +VP_TIM16_VS_ClockSourceINT.Signal=TIM16_VS_ClockSourceINT +VP_TIM17_VS_ClockSourceINT.Mode=Enable_Timer +VP_TIM17_VS_ClockSourceINT.Signal=TIM17_VS_ClockSourceINT +VP_TIM4_VS_ClockSourceITR.Mode=TriggerSource_ITR1 +VP_TIM4_VS_ClockSourceITR.Signal=TIM4_VS_ClockSourceITR +VP_TIM4_VS_ControllerModeClock.Mode=Clock Mode +VP_TIM4_VS_ControllerModeClock.Signal=TIM4_VS_ControllerModeClock +VP_wolfSSL.wolfSSL_VS_wolfSSLJjwolfSSL_4.4.1.Mode=wolfSSLJjwolfSSL +VP_wolfSSL.wolfSSL_VS_wolfSSLJjwolfSSL_4.4.1.Signal=wolfSSL.wolfSSL_VS_wolfSSLJjwolfSSL_4.4.1 +board=STM32L562E-DK +boardIOC=true +wolfSSL.wolfSSL.4.4.1.IPParameters=wolfSSLCcwolfSSLJjwolfSSLJjCore,wolfSSLCcwolfSSLJjwolfCryptJjCore,wolfSSLCcwolfSSLJjwolfCryptJjTest,WOLF_CONF_MATH,WOLF_CONF_RTOS +wolfSSL.wolfSSL.4.4.1.WOLF_CONF_MATH=4 +wolfSSL.wolfSSL.4.4.1.WOLF_CONF_RTOS=2 +wolfSSL.wolfSSL.4.4.1.wolfSSLCcwolfSSLJjwolfCryptJjCore=true +wolfSSL.wolfSSL.4.4.1.wolfSSLCcwolfSSLJjwolfCryptJjTest=true +wolfSSL.wolfSSL.4.4.1.wolfSSLCcwolfSSLJjwolfSSLJjCore=true +wolfSSL.wolfSSL.4.4.1.wolfSSLJjwolfSSL_Checked=true +wolfSSL.wolfSSL.4.4.1_SwParameter=wolfSSLCcwolfSSLJjwolfCryptJjCore\:true;wolfSSLCcwolfSSLJjwolfCryptJjTest\:true;wolfSSLCcwolfSSLJjwolfSSLJjCore\:true; +isbadioc=false diff --git a/IDE/STM32Cube/Boards/STM32WB55.ioc b/IDE/STM32Cube/Boards/STM32WB55.ioc new file mode 100644 index 000000000..dd05360ac --- /dev/null +++ b/IDE/STM32Cube/Boards/STM32WB55.ioc @@ -0,0 +1,256 @@ +#MicroXplorer Configuration settings - do not modify +FREERTOS.FootprintOK=true +FREERTOS.IPParameters=Tasks01,configTOTAL_HEAP_SIZE,configUSE_MALLOC_FAILED_HOOK,configCHECK_FOR_STACK_OVERFLOW,configUSE_DAEMON_TASK_STARTUP_HOOK,FootprintOK +FREERTOS.Tasks01=defaultTask,24,128,StartDefaultTask,Default,NULL,Dynamic,NULL,NULL;wolfCrypt,8,8960,wolfCryptDemo,As external,NULL,Dynamic,NULL,NULL +FREERTOS.configCHECK_FOR_STACK_OVERFLOW=2 +FREERTOS.configTOTAL_HEAP_SIZE=184320 +FREERTOS.configUSE_DAEMON_TASK_STARTUP_HOOK=1 +FREERTOS.configUSE_MALLOC_FAILED_HOOK=1 +File.Version=6 +KeepUserPlacement=false +Mcu.Family=STM32WB +Mcu.IP0=AES1 +Mcu.IP1=AES2 +Mcu.IP10=USB +Mcu.IP2=FREERTOS +Mcu.IP3=NVIC +Mcu.IP4=PKA +Mcu.IP5=RCC +Mcu.IP6=RNG +Mcu.IP7=RTC +Mcu.IP8=SYS +Mcu.IP9=USART1 +Mcu.IPNb=11 +Mcu.Name=STM32WB55RGVx +Mcu.Package=VFQFPN68 +Mcu.Pin0=PC13 +Mcu.Pin1=PC14-OSC32_IN +Mcu.Pin10=PA11 +Mcu.Pin11=PA12 +Mcu.Pin12=PA13 +Mcu.Pin13=PA14 +Mcu.Pin14=PD0 +Mcu.Pin15=PD1 +Mcu.Pin16=PB3 +Mcu.Pin17=PB5 +Mcu.Pin18=PB6 +Mcu.Pin19=PB7 +Mcu.Pin2=PC15-OSC32_OUT +Mcu.Pin20=VP_AES1_VS_AES +Mcu.Pin21=VP_AES2_VS_AES +Mcu.Pin22=VP_FREERTOS_VS_CMSIS_V2 +Mcu.Pin23=VP_PKA_VS_PKA +Mcu.Pin24=VP_RNG_VS_RNG +Mcu.Pin25=VP_RTC_VS_RTC_Activate +Mcu.Pin26=VP_SYS_VS_tim2 +Mcu.Pin27=VP_wolfSSL.wolfSSL_VS_wolfSSLJjwolfSSL_4.4.1 +Mcu.Pin3=PA2 +Mcu.Pin4=PA3 +Mcu.Pin5=PC4 +Mcu.Pin6=OSC_OUT +Mcu.Pin7=OSC_IN +Mcu.Pin8=PB0 +Mcu.Pin9=PB1 +Mcu.PinsNb=28 +Mcu.ThirdParty0=wolfSSL.wolfSSL.4.4.1 +Mcu.ThirdPartyNb=1 +Mcu.UserConstants= +Mcu.UserName=STM32WB55RGVx +MxCube.Version=5.6.1 +MxDb.Version=DB.5.0.60 +NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.ForceEnableDMAVector=true +NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.PendSV_IRQn=true\:15\:0\:false\:false\:false\:true\:false\:false +NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4 +NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:false\:false\:false\:false +NVIC.SysTick_IRQn=true\:15\:0\:false\:false\:false\:true\:false\:false +NVIC.TIM2_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:true +NVIC.TimeBase=TIM2_IRQn +NVIC.TimeBaseIP=TIM2 +NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +OSC_IN.Locked=true +OSC_IN.Mode=HSE-External-Oscillator +OSC_IN.Signal=RCC_OSC_IN +OSC_OUT.Locked=true +OSC_OUT.Mode=HSE-External-Oscillator +OSC_OUT.Signal=RCC_OSC_OUT +PA11.Locked=true +PA11.Mode=Device +PA11.Signal=USB_DM +PA12.Locked=true +PA12.Mode=Device +PA12.Signal=USB_DP +PA13.GPIOParameters=GPIO_Label +PA13.GPIO_Label=JTMS +PA13.Locked=true +PA13.Mode=Trace_Asynchronous_SW +PA13.Signal=SYS_JTMS-SWDIO +PA14.GPIOParameters=GPIO_Label +PA14.GPIO_Label=JTCK +PA14.Locked=true +PA14.Mode=Trace_Asynchronous_SW +PA14.Signal=SYS_JTCK-SWCLK +PA2.Locked=true +PA2.Signal=LPUART1_TX +PA3.Locked=true +PA3.Signal=LPUART1_RX +PB0.GPIOParameters=GPIO_Label +PB0.GPIO_Label=LD2 [Green Led] +PB0.Locked=true +PB0.Signal=GPIO_Output +PB1.GPIOParameters=GPIO_Label +PB1.GPIO_Label=LD3 [Red Led] +PB1.Locked=true +PB1.Signal=GPIO_Output +PB3.GPIOParameters=GPIO_Label +PB3.GPIO_Label=JTDO +PB3.Locked=true +PB3.Mode=Trace_Asynchronous_SW +PB3.Signal=SYS_JTDO-SWO +PB5.GPIOParameters=GPIO_Label +PB5.GPIO_Label=LD1 [Blue Led] +PB5.Locked=true +PB5.Signal=GPIO_Output +PB6.Locked=true +PB6.Mode=Asynchronous +PB6.Signal=USART1_TX +PB7.Locked=true +PB7.Mode=Asynchronous +PB7.Signal=USART1_RX +PC13.Locked=true +PC13.Mode=SYS_WakeUp1 +PC13.Signal=SYS_WKUP2 +PC14-OSC32_IN.Locked=true +PC14-OSC32_IN.Mode=LSE-External-Oscillator +PC14-OSC32_IN.Signal=RCC_OSC32_IN +PC15-OSC32_OUT.Locked=true +PC15-OSC32_OUT.Mode=LSE-External-Oscillator +PC15-OSC32_OUT.Signal=RCC_OSC32_OUT +PC4.GPIOParameters=GPIO_Label +PC4.GPIO_Label=B1 [Push Button] +PC4.Locked=true +PC4.Signal=GPIO_Input +PCC.Ble.ConnectionInterval=1000.0 +PCC.Ble.DataLength=6 +PCC.Ble.Mode=NOT_SELECTED +PCC.Ble.PowerLevel=Min +PD0.GPIOParameters=GPIO_Label +PD0.GPIO_Label=B2 [Push Button] +PD0.Locked=true +PD0.Signal=GPIO_Input +PD1.GPIOParameters=GPIO_Label +PD1.GPIO_Label=B3 [Push Button] +PD1.Locked=true +PD1.Signal=GPIO_Input +PinOutPanel.RotationAngle=0 +ProjectManager.AskForMigrate=true +ProjectManager.BackupPrevious=false +ProjectManager.CompilerOptimize=6 +ProjectManager.ComputerToolchain=false +ProjectManager.CoupleFile=false +ProjectManager.CustomerFirmwarePackage= +ProjectManager.DefaultFWLocation=true +ProjectManager.DeletePrevious=true +ProjectManager.DeviceId=STM32WB55RGVx +ProjectManager.FirmwarePackage=STM32Cube FW_WB V1.7.0 +ProjectManager.FreePins=false +ProjectManager.HalAssertFull=false +ProjectManager.HeapSize=0x200 +ProjectManager.KeepUserCode=true +ProjectManager.LastFirmware=true +ProjectManager.LibraryCopy=1 +ProjectManager.MainLocation=Core/Src +ProjectManager.NoMain=false +ProjectManager.PreviousToolchain= +ProjectManager.ProjectBuild=false +ProjectManager.ProjectFileName=STM32WB55.ioc +ProjectManager.ProjectName=STM32WB55 +ProjectManager.StackSize=0x400 +ProjectManager.TargetToolchain=STM32CubeIDE +ProjectManager.ToolChainLocation= +ProjectManager.UnderRoot=true +ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-SystemClock_Config-RCC-false-HAL-false,3-MX_USART1_UART_Init-USART1-false-HAL-true,4-MX_USB_PCD_Init-USB-false-HAL-true,5-MX_AES1_Init-AES1-false-HAL-true,6-MX_AES2_Init-AES2-false-HAL-true,7-MX_PKA_Init-PKA-false-HAL-true,8-MX_RNG_Init-RNG-false-HAL-true,9-MX_RTC_Init-RTC-false-HAL-true +RCC.ADCFreq_Value=48000000 +RCC.AHB2CLKDivider=RCC_SYSCLK_DIV2 +RCC.AHBFreq_Value=64000000 +RCC.APB1Freq_Value=64000000 +RCC.APB1TimFreq_Value=64000000 +RCC.APB2Freq_Value=64000000 +RCC.APB2TimFreq_Value=64000000 +RCC.APB3Freq_Value=16000000 +RCC.Cortex2Freq_Value=32000000 +RCC.CortexFreq_Value=64000000 +RCC.FCLK2Freq_Value=32000000 +RCC.FCLKCortexFreq_Value=64000000 +RCC.FamilyName=M +RCC.HCLK2Freq_Value=32000000 +RCC.HCLK3Freq_Value=64000000 +RCC.HCLKFreq_Value=64000000 +RCC.HCLKRFFreq_Value=16000000 +RCC.HSE_VALUE=32000000 +RCC.HSI48_VALUE=48000000 +RCC.HSI_VALUE=16000000 +RCC.I2C1Freq_Value=64000000 +RCC.I2C3Freq_Value=64000000 +RCC.IPParameters=ADCFreq_Value,AHB2CLKDivider,AHBFreq_Value,APB1Freq_Value,APB1TimFreq_Value,APB2Freq_Value,APB2TimFreq_Value,APB3Freq_Value,Cortex2Freq_Value,CortexFreq_Value,FCLK2Freq_Value,FCLKCortexFreq_Value,FamilyName,HCLK2Freq_Value,HCLK3Freq_Value,HCLKFreq_Value,HCLKRFFreq_Value,HSE_VALUE,HSI48_VALUE,HSI_VALUE,I2C1Freq_Value,I2C3Freq_Value,LPTIM1Freq_Value,LPTIM2Freq_Value,LPUART1Freq_Value,LSCOPinFreq_Value,LSI_VALUE,MCO1PinFreq_Value,PLLN,PLLPoutputFreq_Value,PLLQoutputFreq_Value,PLLRCLKFreq_Value,PLLSAI1N,PLLSAI1PoutputFreq_Value,PLLSAI1QoutputFreq_Value,PLLSAI1RoutputFreq_Value,PWRFreq_Value,RNGFreq_Value,SAI1Freq_Value,SMPS1Freq_Value,SMPSCLockSelectionVirtual,SMPSCLockSelectionVirtualVirtual,SMPSDivider,SYSCLKFreq_VALUE,SYSCLKSource,USART1Freq_Value,USBFreq_Value,VCOInputFreq_Value,VCOOutputFreq_Value,VCOSAI1OutputFreq_Value +RCC.LPTIM1Freq_Value=64000000 +RCC.LPTIM2Freq_Value=64000000 +RCC.LPUART1Freq_Value=64000000 +RCC.LSCOPinFreq_Value=32000 +RCC.LSI_VALUE=32000 +RCC.MCO1PinFreq_Value=64000000 +RCC.PLLN=32 +RCC.PLLPoutputFreq_Value=64000000 +RCC.PLLQoutputFreq_Value=64000000 +RCC.PLLRCLKFreq_Value=64000000 +RCC.PLLSAI1N=24 +RCC.PLLSAI1PoutputFreq_Value=48000000 +RCC.PLLSAI1QoutputFreq_Value=48000000 +RCC.PLLSAI1RoutputFreq_Value=48000000 +RCC.PWRFreq_Value=64000000 +RCC.RNGFreq_Value=32000 +RCC.SAI1Freq_Value=48000000 +RCC.SMPS1Freq_Value=16000000 +RCC.SMPSCLockSelectionVirtual=RCC_SMPSCLKSOURCE_HSI +RCC.SMPSCLockSelectionVirtualVirtual=RCC_SMPSCLKSOURCE_HSI +RCC.SMPSDivider=1 +RCC.SYSCLKFreq_VALUE=64000000 +RCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK +RCC.USART1Freq_Value=64000000 +RCC.USBFreq_Value=48000000 +RCC.VCOInputFreq_Value=4000000 +RCC.VCOOutputFreq_Value=128000000 +RCC.VCOSAI1OutputFreq_Value=96000000 +USART1.IPParameters=VirtualMode-Asynchronous +USART1.VirtualMode-Asynchronous=VM_ASYNC +VP_AES1_VS_AES.Mode=AES_Activate +VP_AES1_VS_AES.Signal=AES1_VS_AES +VP_AES2_VS_AES.Mode=AES_Activate +VP_AES2_VS_AES.Signal=AES2_VS_AES +VP_FREERTOS_VS_CMSIS_V2.Mode=CMSIS_V2 +VP_FREERTOS_VS_CMSIS_V2.Signal=FREERTOS_VS_CMSIS_V2 +VP_PKA_VS_PKA.Mode=PKA_Activate +VP_PKA_VS_PKA.Signal=PKA_VS_PKA +VP_RNG_VS_RNG.Mode=RNG_Activate +VP_RNG_VS_RNG.Signal=RNG_VS_RNG +VP_RTC_VS_RTC_Activate.Mode=RTC_Enabled +VP_RTC_VS_RTC_Activate.Signal=RTC_VS_RTC_Activate +VP_SYS_VS_tim2.Mode=TIM2 +VP_SYS_VS_tim2.Signal=SYS_VS_tim2 +VP_wolfSSL.wolfSSL_VS_wolfSSLJjwolfSSL_4.4.1.Mode=wolfSSLJjwolfSSL +VP_wolfSSL.wolfSSL_VS_wolfSSLJjwolfSSL_4.4.1.Signal=wolfSSL.wolfSSL_VS_wolfSSLJjwolfSSL_4.4.1 +board=P-NUCLEO-WB55-Nucleo +boardIOC=true +wolfSSL.wolfSSL.4.4.1.IPParameters=wolfSSLCcwolfSSLJjwolfSSLJjCore,wolfSSLCcwolfSSLJjwolfCryptJjCore,wolfSSLCcwolfSSLJjwolfCryptJjTest,WOLF_CONF_MATH,WOLF_CONF_RTOS +wolfSSL.wolfSSL.4.4.1.WOLF_CONF_MATH=4 +wolfSSL.wolfSSL.4.4.1.WOLF_CONF_RTOS=2 +wolfSSL.wolfSSL.4.4.1.wolfSSLCcwolfSSLJjwolfCryptJjCore=true +wolfSSL.wolfSSL.4.4.1.wolfSSLCcwolfSSLJjwolfCryptJjTest=true +wolfSSL.wolfSSL.4.4.1.wolfSSLCcwolfSSLJjwolfSSLJjCore=true +wolfSSL.wolfSSL.4.4.1.wolfSSLJjwolfSSL_Checked=true +wolfSSL.wolfSSL.4.4.1_SwParameter=wolfSSLCcwolfSSLJjwolfCryptJjCore\:true;wolfSSLCcwolfSSLJjwolfCryptJjTest\:true;wolfSSLCcwolfSSLJjwolfSSLJjCore\:true; +isbadioc=false diff --git a/IDE/STM32Cube/README.md b/IDE/STM32Cube/README.md new file mode 100644 index 000000000..b2908002e --- /dev/null +++ b/IDE/STM32Cube/README.md @@ -0,0 +1,63 @@ +# wolfSSL STM32 Example for STM32 Cube IDE + +This example includes: + +* wolfCrypt test +* wolfCrypt benchmark +* wolfSSL TLS client/server test using in-memory transfers + +These examples use the CubeMX Hal for STM32. If you'd like to use the older Standard Peripheral library undefine `WOLFSSL_STM32_CUBEMX` in `user_settings.h`. + +## Requirements + +* STM32CubeIDE: Integrated Development Environment for STM32 [https://www.st.com/en/development-tools/stm32cubeide.html](https://www.st.com/en/development-tools/stm32cubeide.html) + +## Setup + +1. Using the STM32CubeMX tool, load the `/IDE/STM32Cube/Boards/*.ioc` file for your target. +2. Adjust the HAL options based on your specific micro-controller. +3. Enable the security RNG/HASH/CRYPT if available. +4. Enable the RTC and UART if available. +5. Add wolfSSL via Additional Software and check/configure wolfSSL. +6. Generate source code. + +## Configuration + +The settings for the wolfSTM32 project are located in `/IDE/STM32Cube/wolfSSL.wolfSSL_conf.h`. The section for hardware platform may need to be adjusted depending on your processor and board: + +* To enable STM32F2 support define `WOLFSSL_STM32F2`. +* To enable STM32F4 support define `WOLFSSL_STM32F4`. +* To enable STM32F7 support define `WOLFSSL_STM32F7`. +* To enable STM32L4 support define `WOLFSSL_STM32L4`. +* To enable STM32L5 support define `WOLFSSL_STM32L5`. +* To enable STM32WB support define `WOLFSSL_STM32WB`. + +The L5 and WB55 support ECC PKA acceleration, which is enabled with `WOLFSSL_STM32_PKA`. + +To disable hardware crypto acceleration you can define: + +* `#define NO_STM32_HASH` +* `#define NO_STM32_CRYPTO` + +To enable the latest CubeMX HAL support please use: `#define STM32_HAL_V2` + +If you are using FreeRTOS make sure your `FreeRTOSConfig.h` has its `configTOTAL_HEAP_SIZE` increased. + +The TLS client/server benchmark example requires about 76 KB for allocated tasks (with stack) and peak heap. + +## Example Output + +``` +....MENU + +.t. WolfCrypt Test +.b. WolfCrypt Benchmark +.l. WolfSSL TLS Bench +.e. Show Cipher List + +Please select one of the above options: +``` + +## Support + +For questions please email [support@wolfssl.com](mailto:support@wolfssl.com) diff --git a/IDE/STM32Cube/include.am b/IDE/STM32Cube/include.am new file mode 100644 index 000000000..8d41e34c9 --- /dev/null +++ b/IDE/STM32Cube/include.am @@ -0,0 +1,17 @@ +# vim:ft=automake +# included from Top Level Makefile.am +# All paths should be given relative to the root + +EXTRA_DIST+= IDE/STM32Cube/README.md +EXTRA_DIST+= IDE/STM32Cube/main.c +EXTRA_DIST+= IDE/STM32Cube/wolfssl_example.c +EXTRA_DIST+= IDE/STM32Cube/wolfSSL.wolfSSL_conf.h +EXTRA_DIST+= IDE/STM32Cube/wolfssl_example.h +EXTRA_DIST+= IDE/STM32Cube/Boards/STM32F407.ioc +EXTRA_DIST+= IDE/STM32Cube/Boards/STM32F437.ioc +EXTRA_DIST+= IDE/STM32Cube/Boards/STM32F777.ioc +EXTRA_DIST+= IDE/STM32Cube/Boards/STM32L4A6.ioc +EXTRA_DIST+= IDE/STM32Cube/Boards/STM32L475.ioc +EXTRA_DIST+= IDE/STM32Cube/Boards/STM32L552.ioc +EXTRA_DIST+= IDE/STM32Cube/Boards/STM32L562.ioc +EXTRA_DIST+= IDE/STM32Cube/Boards/STM32WB55.ioc diff --git a/IDE/STM32Cube/main.c b/IDE/STM32Cube/main.c new file mode 100644 index 000000000..6c35e8f98 --- /dev/null +++ b/IDE/STM32Cube/main.c @@ -0,0 +1,366 @@ +/* main.c + * + * Copyright (C) 2006-2020 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * wolfSSL is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +/* Example for main.c with STM32Cube/wolfssl_example.c */ + +#if 0 /* EXAMPLE main.c */ + +/* Includes ------------------------------------------------------------------*/ +#include "wolfssl_example.h" + +/* Private variables ---------------------------------------------------------*/ +CRYP_HandleTypeDef hcryp; +__ALIGN_BEGIN static const uint32_t pKeyCRYP[6] __ALIGN_END = { + 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000}; +HASH_HandleTypeDef hhash; +RNG_HandleTypeDef hrng; +RTC_HandleTypeDef hrtc; +UART_HandleTypeDef huart4; + +/* Definitions for defaultTask */ +#ifndef SINGLE_THREADED + #ifdef CMSIS_OS2_H_ + osThreadId_t defaultTaskHandle; + const osThreadAttr_t wolfCryptDemo_attributes = { + .name = "wolfCryptDemo", + .priority = (osPriority_t) osPriorityNormal, + .stack_size = WOLF_EXAMPLES_STACK + }; + #else + osThreadId defaultTaskHandle; + #endif +#endif + +/* Private function prototypes -----------------------------------------------*/ +void SystemClock_Config(void); +static void MX_GPIO_Init(void); +static void MX_CRYP_Init(void); +static void MX_HASH_Init(void); +static void MX_RNG_Init(void); +static void MX_UART4_Init(void); +static void MX_RTC_Init(void); + +/* Retargets the C library printf function to the USART. */ +#include +#ifdef __GNUC__ +int __io_putchar(int ch) +#else +int fputc(int ch, FILE *f) +#endif +{ + HAL_UART_Transmit(&huart4, (uint8_t *)&ch, 1, 0xFFFF); + + return ch; +} +#ifdef __GNUC__ +int _write(int file,char *ptr, int len) +{ + int DataIdx; + for (DataIdx= 0; DataIdx< len; DataIdx++) { + __io_putchar(*ptr++); + } + return len; +} +#endif + +int main(void) +{ + /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ + HAL_Init(); + + /* Turn off buffers, so I/O occurs immediately */ + setvbuf(stdin, NULL, _IONBF, 0); + setvbuf(stdout, NULL, _IONBF, 0); + setvbuf(stderr, NULL, _IONBF, 0); + + /* Configure the system clock */ + SystemClock_Config(); + + /* Initialize all configured peripherals */ + MX_GPIO_Init(); + MX_CRYP_Init(); + MX_HASH_Init(); + MX_RNG_Init(); + MX_UART4_Init(); + MX_RTC_Init(); + MX_SPI1_Init(); + MX_UART4_Init(); + +#ifdef SINGLE_THREADED + wolfCryptDemo(NULL); +#else + /* Init scheduler */ + osKernelInitialize(); + + /* Create the thread(s) */ + /* definition and creation of defaultTask */ + #ifdef CMSIS_OS2_H_ + defaultTaskHandle = osThreadNew(wolfCryptDemo, NULL, &wolfCryptDemo_attributes); + #else + osThreadDef(defaultTask, wolfCryptDemo, osPriorityNormal, 0, WOLF_EXAMPLES_STACK); + defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL); + #endif + + /* Start scheduler */ + osKernelStart(); + + /* We should never get here as control is now taken by the scheduler */ + + /* Infinite loop */ + while (1) {} +#endif /* SINGLE_THREADED */ +} + +/** System Clock Configuration +*/ +static void SystemClock_Config(void) +{ + RCC_OscInitTypeDef RCC_OscInitStruct = {0}; + RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; + RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0}; + + /** Configure the main internal regulator output voltage + */ + __HAL_RCC_PWR_CLK_ENABLE(); + __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); + /** Initializes the CPU, AHB and APB busses clocks + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_LSI; + RCC_OscInitStruct.HSIState = RCC_HSI_ON; + RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; + RCC_OscInitStruct.LSIState = RCC_LSI_ON; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; + RCC_OscInitStruct.PLL.PLLM = 8; + RCC_OscInitStruct.PLL.PLLN = 160; + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; + RCC_OscInitStruct.PLL.PLLQ = 7; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { + Error_Handler(); + } + /** Initializes the CPU, AHB and APB busses clocks + */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) { + Error_Handler(); + } + PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC; + PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSI; + if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) { + Error_Handler(); + } +} + +/** + * @brief CRYP Initialization Function + * @param None + * @retval None + */ +static void MX_CRYP_Init(void) +{ + hcryp.Instance = CRYP; + hcryp.Init.DataType = CRYP_DATATYPE_32B; + hcryp.Init.pKey = (uint32_t *)pKeyCRYP; + hcryp.Init.Algorithm = CRYP_TDES_ECB; + hcryp.Init.DataWidthUnit = CRYP_DATAWIDTHUNIT_WORD; + if (HAL_CRYP_Init(&hcryp) != HAL_OK) { + Error_Handler(); + } +} + +/** + * @brief HASH Initialization Function + * @param None + * @retval None + */ +static void MX_HASH_Init(void) +{ + hhash.Init.DataType = HASH_DATATYPE_32B; + if (HAL_HASH_Init(&hhash) != HAL_OK) { + Error_Handler(); + } +} + +/** + * @brief RNG Initialization Function + * @param None + * @retval None + */ +static void MX_RNG_Init(void) +{ + hrng.Instance = RNG; + if (HAL_RNG_Init(&hrng) != HAL_OK) { + Error_Handler(); + } +} + +/** + * @brief RTC Initialization Function + * @param None + * @retval None + */ +static void MX_RTC_Init(void) +{ + RTC_TimeTypeDef sTime = {0}; + RTC_DateTypeDef sDate = {0}; + + /* Initialize RTC Only */ + hrtc.Instance = RTC; + hrtc.Init.HourFormat = RTC_HOURFORMAT_24; + hrtc.Init.AsynchPrediv = 127; + hrtc.Init.SynchPrediv = 255; + hrtc.Init.OutPut = RTC_OUTPUT_DISABLE; + hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH; + hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN; + if (HAL_RTC_Init(&hrtc) != HAL_OK) { + Error_Handler(); + } + /* Initialize RTC and set the Time and Date */ + sTime.Hours = 0x0; + sTime.Minutes = 0x0; + sTime.Seconds = 0x0; + sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE; + sTime.StoreOperation = RTC_STOREOPERATION_RESET; + if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK) { + Error_Handler(); + } + sDate.WeekDay = RTC_WEEKDAY_MONDAY; + sDate.Month = RTC_MONTH_JANUARY; + sDate.Date = 0x1; + sDate.Year = 0x0; + + if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BCD) != HAL_OK) { + Error_Handler(); + } +} + +/** + * @brief UART4 Initialization Function + * @param None + * @retval None + */ +static void MX_UART4_Init(void) +{ + huart4.Instance = UART4; + huart4.Init.BaudRate = 115200; + huart4.Init.WordLength = UART_WORDLENGTH_8B; + huart4.Init.StopBits = UART_STOPBITS_1; + huart4.Init.Parity = UART_PARITY_NONE; + huart4.Init.Mode = UART_MODE_TX_RX; + huart4.Init.HwFlowCtl = UART_HWCONTROL_NONE; + huart4.Init.OverSampling = UART_OVERSAMPLING_16; + if (HAL_UART_Init(&huart4) != HAL_OK) { + Error_Handler(); + } +} + +/** + * @brief GPIO Initialization Function + * @param None + * @retval None + */ +static void MX_GPIO_Init(void) +{ + /* GPIO Ports Clock Enable */ + __HAL_RCC_GPIOC_CLK_ENABLE(); +} + + /** + * @brief Period elapsed callback in non blocking mode + * @note This function is called when TIM1 interrupt took place, inside + * HAL_TIM_IRQHandler(). It makes a direct call to HAL_IncTick() to increment + * a global variable "uwTick" used as application time base. + * @param htim : TIM handle + * @retval None + */ +void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) +{ + if (htim->Instance == TIM1) { + HAL_IncTick(); + } +} + +/** + * @brief This function is executed in case of error occurrence. + * @retval None + */ +void Error_Handler(void) +{ + /* User can add his own implementation to report the HAL error return state */ + while(1) + { + } +} + +#ifdef USE_FULL_ASSERT +/** + * @brief Reports the name of the source file and the source line number + * where the assert_param error has occurred. + * @param file: pointer to the source file name + * @param line: assert_param error line source number + * @retval None + */ +void assert_failed(uint8_t *file, uint32_t line) +{ + /* User can add his own implementation to report the file name and line number, + tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ +} +#endif /* USE_FULL_ASSERT */ + + +#if 0 +/* Working _sbrk example for .ld based libC malloc/free */ +/* Replace this with one in Core/Src/sysmem.c */ +/* Symbols defined in the linker script */ +extern uint8_t _end; +extern uint8_t _estack; +extern uint32_t _Min_Stack_Size; +void* _sbrk(ptrdiff_t incr) +{ + static uint8_t* __sbrk_heap_end = NULL; + const uint32_t stack_limit = (uint32_t)&_estack - (uint32_t)&_Min_Stack_Size; + const uint8_t* max_heap = (uint8_t *)stack_limit; + uint8_t* prev_heap_end; + + /* Initialize heap end at first call */ + if (__sbrk_heap_end == NULL) { + __sbrk_heap_end = &_end; + } + + /* Protect heap from growing into the reserved MSP stack */ + if (__sbrk_heap_end + incr > max_heap) { + errno = ENOMEM; + return (void *)-1; + } + + prev_heap_end = __sbrk_heap_end; + __sbrk_heap_end += incr; + + return (void*)prev_heap_end; +} +#endif + +#endif /* EXAMPLE main.c */ diff --git a/IDE/STM32Cube/wolfSSL.wolfSSL_conf.h b/IDE/STM32Cube/wolfSSL.wolfSSL_conf.h new file mode 100644 index 000000000..b7b5181c2 --- /dev/null +++ b/IDE/STM32Cube/wolfSSL.wolfSSL_conf.h @@ -0,0 +1,538 @@ +/* wolfSSL.wolfSSL_conf.h + * + * Copyright (C) 2006-2020 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * wolfSSL is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +/* STM32 Cube Configuration File + * Included automatically when USE_HAL_DRIVER is defined + * (and not WOLFSSL_USER_SETTINGS or HAVE_CONF_H). + */ + +#ifndef __WOLFSSL_WOLFSSL_CONF_H__ +#define __WOLFSSL_WOLFSSL_CONF_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/*---------- Debug Support -----------*/ +#define WOLF_CONF_DEBUG 0 + +/*---------- wolfCrypt Only -----------*/ +#define WOLF_CONF_WOLFCRYPT_ONLY 0 + +/*---------- TLS v1.3 -----------*/ +#define WOLF_CONF_TLS13 1 + +/*---------- TLS v1.2 -----------*/ +#define WOLF_CONF_TLS12 1 + +/*---------- DTLS Support -----------*/ +#define WOLF_CONF_DTLS 0 + +/*---------- Math Configuration -----------*/ +#define WOLF_CONF_MATH 4 + +/*---------- RTOS -----------*/ +#define WOLF_CONF_RTOS 2 + +/*---------- RSA Support -----------*/ +#define WOLF_CONF_RSA 1 + +/*---------- ECC Support -----------*/ +#define WOLF_CONF_ECC 1 + +/*---------- DH (Diffie–Hellman) Support -----------*/ +#define WOLF_CONF_DH 1 + +/*---------- AES GCM Support -----------*/ +#define WOLF_CONF_AESGCM 1 + +/*---------- AES CBC Support -----------*/ +#define WOLF_CONF_AESCBC 0 + +/*---------- ChaCha20 / Poly1305 Support -----------*/ +#define WOLF_CONF_CHAPOLY 1 + +/*---------- Ed25519 / Curve25519 Support -----------*/ +#define WOLF_CONF_EDCURVE25519 0 + +/*---------- MD5 Support -----------*/ +#define WOLF_CONF_MD5 0 + +/*---------- SHA1 Support -----------*/ +#define WOLF_CONF_SHA1 0 + +/*---------- SHA2-224 Support -----------*/ +#define WOLF_CONF_SHA2_224 0 + +/*---------- SHA2-256 Support -----------*/ +#define WOLF_CONF_SHA2_256 1 + +/*---------- SHA2-384 Support -----------*/ +#define WOLF_CONF_SHA2_384 0 + +/*---------- SHA2-512 Support -----------*/ +#define WOLF_CONF_SHA2_512 0 + +/*---------- SHA3 Support -----------*/ +#define WOLF_CONF_SHA3 0 + +/*---------- Pre-Shared-Key Support -----------*/ +#define WOLF_CONF_PSK 0 + +/*---------- Pwd Based Key Derivation Support -----------*/ +#define WOLF_CONF_PWDBASED 0 + +/*---------- Keep Peer Cert Support -----------*/ +#define WOLF_CONF_KEEP_PEER_CERT 0 + +/*---------- Base64 Encode Support -----------*/ +#define WOLF_CONF_BASE64_ENCODE 0 + +/*---------- OpenSSL Extra Support -----------*/ +#define WOLF_CONF_OPENSSL_EXTRA 0 + +/*---------- wolfCrypt test/benchmark -----------*/ +#define WOLF_CONF_TEST 1 + + +/* ------------------------------------------------------------------------- */ +/* Hardware platform */ +/* ------------------------------------------------------------------------- */ +#define NO_STM32_HASH +#define NO_STM32_CRYPTO + +#if defined(STM32WB55xx) + #define WOLFSSL_STM32WB + #define WOLFSSL_STM32_PKA + #undef NO_STM32_CRYPTO + #define HAL_CONSOLE_UART huart1 +#elif defined(STM32F407xx) + #define WOLFSSL_STM32F4 + #define HAL_CONSOLE_UART huart2 +#elif defined(STM32F437xx) + #define WOLFSSL_STM32F4 + #undef NO_STM32_HASH + #undef NO_STM32_CRYPTO + #define STM32_HAL_V2 + #define HAL_CONSOLE_UART huart4 +#elif defined(STM32F777xx) + #define WOLFSSL_STM32F7 + #undef NO_STM32_HASH + #undef NO_STM32_CRYPTO + #define STM32_HAL_V2 + #define HAL_CONSOLE_UART huart2 +#elif defined(STM32L4A6xx) + #define WOLFSSL_STM32L4 + #undef NO_STM32_HASH + #undef NO_STM32_CRYPTO + #define HAL_CONSOLE_UART hlpuart1 +#elif defined(STM32L475xx) + #define WOLFSSL_STM32L4 + #define HAL_CONSOLE_UART huart1 +#elif defined(STM32L562xx) + #define WOLFSSL_STM32L5 + #define WOLFSSL_STM32_PKA + #define HAL_CONSOLE_UART huart1 +#elif defined(STM32L552xx) + #define WOLFSSL_STM32L5 + #undef NO_STM32_HASH + #define HAL_CONSOLE_UART hlpuart1 +#else + #warning Please define a hardware platform! + #define WOLFSSL_STM32F4 /* default */ + #define HAL_CONSOLE_UART huart4 +#endif + +/* ------------------------------------------------------------------------- */ +/* Platform */ +/* ------------------------------------------------------------------------- */ +#define SIZEOF_LONG_LONG 8 +#define WOLFSSL_GENERAL_ALIGNMENT 4 +#define WOLFSSL_STM32_CUBEMX +#define WOLFSSL_SMALL_STACK +#define WOLFSSL_USER_IO +#define WOLFSSL_NO_SOCK +#define WOLFSSL_IGNORE_FILE_WARN + +/* ------------------------------------------------------------------------- */ +/* Operating System */ +/* ------------------------------------------------------------------------- */ +#if defined(WOLF_CONF_RTOS) && WOLF_CONF_RTOS == 2 + #define FREERTOS +#else + #define SINGLE_THREADED +#endif + +/* ------------------------------------------------------------------------- */ +/* Math Configuration */ +/* ------------------------------------------------------------------------- */ +/* 1=Fast, 2=Normal, 3=SP C, 4=SP Cortex-M */ +#if defined(WOLF_CONF_MATH) && WOLF_CONF_MATH != 2 + /* fast (stack) math */ + #define USE_FAST_MATH + #define TFM_TIMING_RESISTANT + + /* Optimizations (TFM_ARM, TFM_ASM or none) */ + //#define TFM_NO_ASM + //#define TFM_ASM +#endif +#if defined(WOLF_CONF_MATH) && (WOLF_CONF_MATH == 3 || WOLF_CONF_MATH == 4) + /* single precision only */ + #define WOLFSSL_SP + #define WOLFSSL_SP_SMALL /* use smaller version of code */ + #define WOLFSSL_HAVE_SP_RSA + #define WOLFSSL_HAVE_SP_DH + #define WOLFSSL_HAVE_SP_ECC + #define WOLFSSL_SP_MATH + #define SP_WORD_SIZE 32 + + //#define WOLFSSL_SP_NO_MALLOC + //#define WOLFSSL_SP_CACHE_RESISTANT + + /* single precision Cortex-M only */ + #if WOLF_CONF_MATH == 4 + #define WOLFSSL_SP_ASM /* required if using the ASM versions */ + #define WOLFSSL_SP_ARM_CORTEX_M_ASM + #endif +#endif + +/* ------------------------------------------------------------------------- */ +/* Enable Features */ +/* ------------------------------------------------------------------------- */ +/* Required for TLS */ +#define HAVE_TLS_EXTENSIONS +#define HAVE_SUPPORTED_CURVES +#define HAVE_ENCRYPT_THEN_MAC +#define HAVE_EXTENDED_MASTER + +#if defined(WOLF_CONF_TLS13) && WOLF_CONF_TLS13 == 1 + #define WOLFSSL_TLS13 + #define HAVE_HKDF +#endif +#if defined(WOLF_CONF_DTLS) && WOLF_CONF_DTLS == 1 + #define WOLFSSL_DTLS +#endif +#if defined(WOLF_CONF_PSK) && WOLF_CONF_PSK == 0 + #define NO_PSK +#endif +#if defined(WOLF_CONF_PWDBASED) && WOLF_CONF_PWDBASED == 0 + #define NO_PWDBASED +#endif +#if defined(WOLF_CONF_KEEPPEERCERT) && WOLF_CONF_KEEPPEERCERT == 1 + #define KEEP_PEER_CERT +#endif +#if defined(WOLF_CONF_BASE64_ENCODE) && WOLF_CONF_BASE64_ENCODE == 1 + #define WOLFSSL_BASE64_ENCODE +#endif +#if defined(WOLF_CONF_OPENSSL_EXTRA) && WOLF_CONF_OPENSSL_EXTRA == 1 + #define OPENSSL_EXTRA +#endif + +/* TLS Session Cache */ +#if 0 + #define SMALL_SESSION_CACHE +#else + #define NO_SESSION_CACHE +#endif + +/* ------------------------------------------------------------------------- */ +/* Crypto */ +/* ------------------------------------------------------------------------- */ +/* RSA */ +#undef NO_RSA +#if defined(WOLF_CONF_RSA) && WOLF_CONF_RSA == 1 + #ifdef USE_FAST_MATH + /* Maximum math bits (Max RSA key bits * 2) */ + #undef FP_MAX_BITS + #define FP_MAX_BITS 4096 + #endif + + /* half as much memory but twice as slow */ + #undef RSA_LOW_MEM + //#define RSA_LOW_MEM + + /* Enables blinding mode, to prevent timing attacks */ + #undef WC_RSA_BLINDING + #define WC_RSA_BLINDING + + /* RSA PSS Support (required for TLS v1.3) */ + #ifdef WOLFSSL_TLS13 + #define WC_RSA_PSS + #endif +#else + #define NO_RSA +#endif + +/* ECC */ +#undef HAVE_ECC +#if defined(WOLF_CONF_ECC) && WOLF_CONF_ECC == 1 + #define HAVE_ECC + + /* Manually define enabled curves */ + #define ECC_USER_CURVES + + //#define HAVE_ECC192 + //#define HAVE_ECC224 + #undef NO_ECC256 + //#define HAVE_ECC384 + //#define HAVE_ECC521 + + /* Fixed point cache (speeds repeated operations against same private key) */ + #undef FP_ECC + //#define FP_ECC + #ifdef FP_ECC + /* Bits / Entries */ + #undef FP_ENTRIES + #define FP_ENTRIES 2 + #undef FP_LUT + #define FP_LUT 4 + #endif + + /* Optional ECC calculation method */ + /* Note: doubles heap usage, but slightly faster */ + #undef ECC_SHAMIR + #define ECC_SHAMIR + + /* Reduces heap usage, but slower */ + #define ECC_TIMING_RESISTANT + + /* Compressed ECC key support */ + //#define HAVE_COMP_KEY + + #ifdef USE_FAST_MATH + #ifdef NO_RSA + /* Custom fastmath size if not using RSA */ + /* MAX = ROUND32(ECC BITS 256) + SIZE_OF_MP_DIGIT(32) */ + #define FP_MAX_BITS (256 + 32) + #else + #define ALT_ECC_SIZE + #endif + + /* Enable TFM optimizations for ECC */ + //#define TFM_ECC192 + //#define TFM_ECC224 + #define TFM_ECC256 + //#define TFM_ECC384 + //#define TFM_ECC521 + #endif +#endif + +/* DH */ +#undef NO_DH +#if defined(WOLF_CONF_DH) && WOLF_CONF_DH == 1 + #define HAVE_DH /* freeRTOS settings.h requires this */ + #define HAVE_FFDHE_2048 + #define HAVE_DH_DEFAULT_PARAMS +#else + #define NO_DH +#endif + +/* AES */ +#if defined(WOLF_CONF_AESGCM) && WOLF_CONF_AESGCM == 1 + #define HAVE_AESGCM + /* GCM Method: GCM_SMALL, GCM_WORD32 or GCM_TABLE */ + /* GCM_TABLE is about 4K larger and 3x faster */ + #define GCM_SMALL + #define HAVE_AES_DECRYPT +#endif + +#if defined(WOLF_CONF_AESCBC) && WOLF_CONF_AESCBC == 1 + #define HAVE_AES_CBC + #define HAVE_AES_DECRYPT +#endif + +/* Other possible AES modes */ +//#define WOLFSSL_AES_COUNTER +//#define HAVE_AESCCM +//#define WOLFSSL_AES_XTS +//#define WOLFSSL_AES_DIRECT +//#define HAVE_AES_ECB + +/* ChaCha20 / Poly1305 */ +#undef HAVE_CHACHA +#undef HAVE_POLY1305 +#if defined(WOLF_CONF_CHAPOLY) && WOLF_CONF_CHAPOLY == 1 + #define HAVE_CHACHA + #define HAVE_POLY1305 + + /* Needed for Poly1305 */ + #undef HAVE_ONE_TIME_AUTH + #define HAVE_ONE_TIME_AUTH +#endif + +/* Ed25519 / Curve25519 */ +#undef HAVE_CURVE25519 +#undef HAVE_ED25519 +#if defined(WOLF_CONF_EDCURVE25519) && WOLF_CONF_EDCURVE25519 == 1 + #define HAVE_CURVE25519 + #define HAVE_ED25519 + + /* Optionally use small math (less flash usage, but much slower) */ + #define CURVED25519_SMALL +#endif + +/* ------------------------------------------------------------------------- */ +/* Hashing */ +/* ------------------------------------------------------------------------- */ +/* Sha1 */ +#undef NO_SHA +#if defined(WOLF_CONF_SHA1) && WOLF_CONF_SHA1 == 1 + /* 1k smaller, but 25% slower */ + //#define USE_SLOW_SHA +#else + #define NO_SHA +#endif + +/* Sha2-256 */ +#undef NO_SHA256 +#if defined(WOLF_CONF_SHA2_256) && WOLF_CONF_SHA2_256 == 1 + /* not unrolled - ~2k smaller and ~25% slower */ + //#define USE_SLOW_SHA256 + + //#define WOLFSSL_SHAKE256 + + /* Sha2-224 */ + #if defined(WOLF_CONF_SHA2_224) && WOLF_CONF_SHA2_224 == 1 + #define WOLFSSL_SHA224 + #endif +#else + #define NO_SHA256 +#endif + +/* Sha2-512 */ +#undef WOLFSSL_SHA512 +#if defined(WOLF_CONF_SHA2_512) && WOLF_CONF_SHA2_512 == 1 + /* over twice as small, but 50% slower */ + //#define USE_SLOW_SHA512 + + #define WOLFSSL_SHA512 + #define HAVE_SHA512 /* freeRTOS settings.h requires this */ +#endif + +/* Sha2-384 */ +#undef WOLFSSL_SHA384 +#if defined(WOLF_CONF_SHA2_384) && WOLF_CONF_SHA2_384 == 1 + #define WOLFSSL_SHA384 +#endif + +/* Sha3 */ +#undef WOLFSSL_SHA3 +#if defined(WOLF_CONF_SHA3) && WOLF_CONF_SHA3 == 1 + #define WOLFSSL_SHA3 +#endif + +/* MD5 */ +#if defined(WOLF_CONF_MD5) && WOLF_CONF_MD5 == 1 + /* enabled */ +#else + #define NO_MD5 +#endif + +/* ------------------------------------------------------------------------- */ +/* Benchmark / Test */ +/* ------------------------------------------------------------------------- */ +/* Use reduced benchmark / test sizes */ +#define BENCH_EMBEDDED +#define USE_CERT_BUFFERS_2048 +#define USE_CERT_BUFFERS_256 + +/* ------------------------------------------------------------------------- */ +/* Debugging */ +/* ------------------------------------------------------------------------- */ +#if defined(WOLF_CONF_DEBUG) && WOLF_CONF_DEBUG == 1 + #define DEBUG_WOLFSSL + + /* Use this to measure / print heap usage */ + #if 0 + #define USE_WOLFSSL_MEMORY + #define WOLFSSL_TRACK_MEMORY + #define WOLFSSL_DEBUG_MEMORY + #define WOLFSSL_DEBUG_MEMORY_PRINT + #endif +#else + //#define NO_WOLFSSL_MEMORY + //#define NO_ERROR_STRINGS +#endif + +/* ------------------------------------------------------------------------- */ +/* Port */ +/* ------------------------------------------------------------------------- */ + +/* Override Current Time */ +/* Allows custom "custom_time()" function to be used for benchmark */ +#define WOLFSSL_USER_CURRTIME + +/* ------------------------------------------------------------------------- */ +/* RNG */ +/* ------------------------------------------------------------------------- */ +#define NO_OLD_RNGNAME /* conflicts with STM RNG macro */ +#define HAVE_HASHDRBG + +/* ------------------------------------------------------------------------- */ +/* Disable Features */ +/* ------------------------------------------------------------------------- */ +#if defined(WOLF_CONF_TLS12) && WOLF_CONF_TLS12 == 0 + #define WOLFSSL_NO_TLS12 +#endif +#if defined(WOLF_CONF_WOLFCRYPT_ONLY) && WOLF_CONF_WOLFCRYPT_ONLY == 1 + #define WOLFCRYPT_ONLY +#endif +//#define NO_WOLFSSL_SERVER +//#define NO_WOLFSSL_CLIENT + +#if defined(WOLF_CONF_TEST) && WOLF_CONF_TEST == 0 + #define NO_CRYPT_TEST + #define NO_CRYPT_BENCHMARK +#endif + +#define NO_FILESYSTEM +#define NO_WRITEV +#define NO_MAIN_DRIVER +#define NO_DEV_RANDOM +#define NO_OLD_TLS +#define WOLFSSL_NO_CLIENT_AUTH /* disable client auth for Ed25519/Ed448 */ + +#define NO_DSA +#define NO_RC4 +#define NO_HC128 +#define NO_RABBIT +#define NO_MD4 +#define NO_DES3 + +/* In-lining of misc.c functions */ +/* If defined, must include wolfcrypt/src/misc.c in build */ +/* Slower, but about 1k smaller */ +//#define NO_INLINE + +/* Base16 / Base64 encoding */ +//#define NO_CODING + +/* bypass certificate date checking, due to lack of properly configured RTC source */ +#ifndef HAL_RTC_MODULE_ENABLED + #define NO_ASN_TIME +#endif + + +#ifdef __cplusplus +} +#endif + +#endif /*__WOLFSSL_WOLFSSL_CONF_H__ */ diff --git a/IDE/OPENSTM32/Src/wolfssl_example.c b/IDE/STM32Cube/wolfssl_example.c similarity index 85% rename from IDE/OPENSTM32/Src/wolfssl_example.c rename to IDE/STM32Cube/wolfssl_example.c index 72380803f..eead6fa24 100644 --- a/IDE/OPENSTM32/Src/wolfssl_example.c +++ b/IDE/STM32Cube/wolfssl_example.c @@ -30,12 +30,17 @@ #include /* WC_MAX_DIGEST_SIZE */ -#define WOLFSSL_DEBUG_MEMORY -#ifdef WOLFSSL_DEBUG_MEMORY -/* for memory debugging */ -#include +#ifndef SINGLE_THREADED + #include + + #ifdef WOLFSSL_DEBUG_MEMORY + /* for memory debugging */ + #include + #endif #endif +#include +#include /***************************************************************************** * Configuration @@ -47,9 +52,18 @@ #define BENCH_RUNTIME_SEC 20 #define BENCH_SHOW_PEER_INFO 1 #define TEST_PACKET_SIZE (2 * 1024) /* TLS packet size */ +#ifdef BENCH_EMBEDDED +#define TEST_MAX_SIZE (4 * 1024) +#else #define TEST_MAX_SIZE (32 * 1024) /* Total bytes to benchmark */ +#endif /* Must be large enough to handle max packet size - TLS header MAX_MSG_EXTRA + MAX DIGEST */ #define MEM_BUFFER_SZ (TEST_PACKET_SIZE + 38 + WC_MAX_DIGEST_SIZE) +/* make sure memory buffer size is large enough */ +#if MEM_BUFFER_SZ < 2048 + #undef MEM_BUFFER_SZ + #define MEM_BUFFER_SZ 2048 +#endif #define SHOW_VERBOSE 0 /* Default output is tab delimited format */ #ifndef WOLFSSL_CIPHER_LIST_MAX_SIZE #define WOLFSSL_CIPHER_LIST_MAX_SIZE 2048 @@ -58,15 +72,41 @@ /* define this to test only a specific cipher suite(s) (colon separated) */ #define TEST_CIPHER_SUITE "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256" #endif - +#if 0 + /* use non-blocking mode for read/write IO */ + #define BENCH_USE_NONBLOCK +#endif /***************************************************************************** * Private types/enumerations/variables ****************************************************************************/ +#ifdef WOLFSSL_STATIC_MEMORY + #if 1 /* on-chip RAM */ + #define RAM_STATIC + #else /* external RAM */ + /* requires .ld to be updated with ".extram" section */ + #define RAM_STATIC __attribute__ ((section (".extram"))) + #endif + #define WOLF_GEN_MEM (20*1024) + #define WOLF_TLS_GEN_MEM (90*1024) + #define WOLF_TLS_IO_POOL_MEM (35*1024) + + RAM_STATIC static byte gWolfMem[WOLF_GEN_MEM]; + RAM_STATIC static byte gWolfCTXCli[WOLF_TLS_GEN_MEM]; + RAM_STATIC static byte gWolfIOCli[WOLF_TLS_IO_POOL_MEM]; + RAM_STATIC static byte gWolfCTXSrv[WOLF_TLS_GEN_MEM]; + RAM_STATIC static byte gWolfIOSrv[WOLF_TLS_IO_POOL_MEM]; + + WOLFSSL_HEAP_HINT* HEAP_HINT = NULL; +#endif /* WOLFSSL_STATIC_MEMORY */ + + /* UART definitions */ -extern UART_HandleTypeDef huart4; -extern SPI_HandleTypeDef hspi1; +#ifndef HAL_CONSOLE_UART +#define HAL_CONSOLE_UART huart4 +#endif +extern UART_HandleTypeDef HAL_CONSOLE_UART; /***************************************************************************** * Public types/enumerations/variables @@ -77,16 +117,20 @@ typedef struct func_args { int return_code; } func_args; -const char menu1[] = "\r\n" - "\tt. WolfCrypt Test\r\n" - "\tb. WolfCrypt Benchmark\r\n" - "\tl. WolfSSL TLS Bench\r\n" - "\te. Show Cipher List\r\n"; +const char menu1[] = "\n" + "\tt. WolfCrypt Test\n" + "\tb. WolfCrypt Benchmark\n" + "\tl. WolfSSL TLS Bench\n" + "\te. Show Cipher List\n"; + +static void PrintMemStats(void); +double current_time(void); -static const char* kShutdown = "shutdown"; #if (!defined(NO_WOLFSSL_CLIENT) || !defined(NO_WOLFSSL_SERVER)) && \ - !defined(WOLFCRYPT_ONLY) + !defined(WOLFCRYPT_ONLY) && !defined(SINGLE_THREADED) + +static const char* kShutdown = "shutdown"; static const char* kTestStr = "Biodiesel cupidatat marfa, cliche aute put a bird on it incididunt elit\n" @@ -220,10 +264,14 @@ typedef struct { typedef struct { int ret; - osThreadDef_t threadDef; osThreadId threadId; +#ifdef CMSIS_OS2_H_ + osSemaphoreId_t mutex; +#else + osThreadDef_t threadDef; osSemaphoreDef_t mutexDef; osSemaphoreId mutex; +#endif byte shutdown:1; byte done:1; @@ -257,30 +305,14 @@ typedef struct { } info_t; -extern RTC_HandleTypeDef hrtc; -double current_time(void) -{ - RTC_TimeTypeDef time; - RTC_DateTypeDef date; - uint32_t subsec; - - /* must get time and date here due to STM32 HW bug */ - HAL_RTC_GetTime(&hrtc, &time, FORMAT_BIN); - HAL_RTC_GetDate(&hrtc, &date, FORMAT_BIN); - subsec = (255 - time.SubSeconds) * 1000 / 255; - - (void) date; - - /* return seconds.milliseconds */ - return ((double) time.Hours * 24) + ((double) time.Minutes * 60) - + (double) time.Seconds + ((double) subsec / 1000); -} +/***************************************************************************** + * Private functions + ****************************************************************************/ static double gettime_secs(int reset) { return current_time(); } - static void PrintTlsStats(stats_t* wcStat, const char* desc, const char* cipher, int verbose) { const char* formatStr; @@ -313,30 +345,6 @@ static void PrintTlsStats(stats_t* wcStat, const char* desc, const char* cipher, wcStat->connTime * 1000 / wcStat->connCount); } -static void ShowCiphers(void) -{ - int ret; - char* ciphers = (char*)XMALLOC(WOLFSSL_CIPHER_LIST_MAX_SIZE, NULL, - DYNAMIC_TYPE_TMP_BUFFER); - if (ciphers) { - ret = wolfSSL_get_ciphers(ciphers, WOLFSSL_CIPHER_LIST_MAX_SIZE); - if (ret == WOLFSSL_SUCCESS) - printf("%s\n", ciphers); - XFREE(ciphers, NULL, DYNAMIC_TYPE_TMP_BUFFER); - } -} - - -static void PrintMemStats(void) -{ -#ifdef WOLFSSL_DEBUG_MEMORY - printf("\nHeap MinEver %d, Free %d, Stack %lu\n", - xPortGetMinimumEverFreeHeapSize(), - xPortGetFreeHeapSize(), - uxTaskGetStackHighWaterMark(NULL)); -#endif -} - #if defined(KEEP_PEER_CERT) || defined(KEEP_OUR_CERT) static const char* client_showx509_msg[] = { @@ -481,7 +489,11 @@ static void ShowPeer(WOLFSSL* ssl) /* server send callback */ static int ServerMemSend(info_t* info, char* buf, int sz) { +#ifdef CMSIS_OS2_H_ + osSemaphoreAcquire(info->client.mutex, osWaitForever); +#else osSemaphoreWait(info->client.mutex, osWaitForever); +#endif #ifndef BENCH_USE_NONBLOCK /* check for overflow */ @@ -499,7 +511,11 @@ static int ServerMemSend(info_t* info, char* buf, int sz) info->to_client.write_idx += sz; info->to_client.write_bytes += sz; +#ifdef CMSIS_OS2_H_ + osThreadFlagsSet(info->client.threadId, 1); +#else osSignalSet(info->client.threadId, 1); +#endif osSemaphoreRelease(info->client.mutex); #ifdef BENCH_USE_NONBLOCK @@ -512,14 +528,23 @@ static int ServerMemSend(info_t* info, char* buf, int sz) /* server recv callback */ static int ServerMemRecv(info_t* info, char* buf, int sz) { +#ifdef CMSIS_OS2_H_ + osSemaphoreAcquire(info->server.mutex, osWaitForever); +#else osSemaphoreWait(info->server.mutex, osWaitForever); +#endif #ifndef BENCH_USE_NONBLOCK while (info->to_server.write_idx - info->to_server.read_idx < sz && !info->client.done) { osSemaphoreRelease(info->server.mutex); +#ifdef CMSIS_OS2_H_ + osThreadFlagsWait(1, osFlagsWaitAny, osWaitForever); + osSemaphoreAcquire(info->server.mutex, osWaitForever); +#else osSignalWait(1, osWaitForever); osSemaphoreWait(info->server.mutex, osWaitForever); +#endif } #else if (info->to_server.write_idx - info->to_server.read_idx < sz) @@ -548,7 +573,11 @@ static int ServerMemRecv(info_t* info, char* buf, int sz) /* client send callback */ static int ClientMemSend(info_t* info, char* buf, int sz) { +#ifdef CMSIS_OS2_H_ + osSemaphoreAcquire(info->server.mutex, osWaitForever); +#else osSemaphoreWait(info->server.mutex, osWaitForever); +#endif #ifndef BENCH_USE_NONBLOCK /* check for overflow */ @@ -567,7 +596,11 @@ static int ClientMemSend(info_t* info, char* buf, int sz) info->to_server.write_idx += sz; info->to_server.write_bytes += sz; +#ifdef CMSIS_OS2_H_ + osThreadFlagsSet(info->server.threadId, 1); +#else osSignalSet(info->server.threadId, 1); +#endif osSemaphoreRelease(info->server.mutex); #ifdef BENCH_USE_NONBLOCK @@ -580,14 +613,23 @@ static int ClientMemSend(info_t* info, char* buf, int sz) /* client recv callback */ static int ClientMemRecv(info_t* info, char* buf, int sz) { +#ifdef CMSIS_OS2_H_ + osSemaphoreAcquire(info->client.mutex, osWaitForever); +#else osSemaphoreWait(info->client.mutex, osWaitForever); +#endif #ifndef BENCH_USE_NONBLOCK while (info->to_client.write_idx - info->to_client.read_idx < sz && !info->server.done) { osSemaphoreRelease(info->client.mutex); +#ifdef CMSIS_OS2_H_ + osThreadFlagsWait(1, osFlagsWaitAny, osWaitForever); + osSemaphoreAcquire(info->client.mutex, osWaitForever); +#else osSignalWait(1, osWaitForever); osSemaphoreWait(info->client.mutex, osWaitForever); +#endif } #else if (info->to_client.write_idx - info->to_client.read_idx < sz) @@ -645,7 +687,7 @@ static int bench_tls_client(info_t* info) { byte *writeBuf = NULL, *readBuf = NULL; double start, total = 0; - int ret, readBufSz; + int ret = 0, readBufSz; WOLFSSL_CTX* cli_ctx = NULL; WOLFSSL* cli_ssl = NULL; int haveShownPeerInfo = 0; @@ -656,21 +698,43 @@ static int bench_tls_client(info_t* info) /* set up client */ #ifdef WOLFSSL_TLS13 - if (tls13) + if (tls13) { + #ifdef WOLFSSL_STATIC_MEMORY + ret = wolfSSL_CTX_load_static_memory(&cli_ctx, wolfTLSv1_3_client_method_ex, + gWolfCTXCli, sizeof(gWolfCTXCli), WOLFMEM_GENERAL , 10); + #else cli_ctx = wolfSSL_CTX_new(wolfTLSv1_3_client_method()); + #endif + } #endif - if (!tls13) + if (!tls13) { #if !defined(WOLFSSL_TLS13) + #ifdef WOLFSSL_STATIC_MEMORY + ret = wolfSSL_CTX_load_static_memory(&cli_ctx, wolfSSLv23_client_method_ex, + gWolfCTXCli, sizeof(gWolfCTXCli), WOLFMEM_GENERAL , 10); + #else cli_ctx = wolfSSL_CTX_new(wolfSSLv23_client_method()); + #endif #elif !defined(WOLFSSL_NO_TLS12) + #ifdef WOLFSSL_STATIC_MEMORY + ret = wolfSSL_CTX_load_static_memory(&cli_ctx, wolfTLSv1_2_client_method_ex, + gWolfCTXCli, sizeof(gWolfCTXCli), WOLFMEM_GENERAL , 10); + #else cli_ctx = wolfSSL_CTX_new(wolfTLSv1_2_client_method()); + #endif #endif + } - if (cli_ctx == NULL) { - printf("error creating ctx\n"); + if (cli_ctx == NULL || ret != 0) { + printf("error creating ctx: ret %d\n", ret); ret = MEMORY_E; goto exit; } +#ifdef WOLFSSL_STATIC_MEMORY + ret = wolfSSL_CTX_load_static_memory(&cli_ctx, 0, gWolfIOCli, sizeof(gWolfIOCli), + WOLFMEM_IO_POOL, 10 ); +#endif + #ifndef NO_CERTS #ifdef HAVE_ECC if (XSTRSTR(info->cipher, "ECDSA")) { @@ -733,7 +797,7 @@ static int bench_tls_client(info_t* info) cli_ssl = wolfSSL_new(cli_ctx); if (cli_ssl == NULL) { printf("error creating client object\n"); - goto exit; + ret = MEMORY_E; goto exit; } wolfSSL_SetIOReadCtx(cli_ssl, info); @@ -846,6 +910,7 @@ static int bench_tls_client(info_t* info) exit: if (ret != 0 && ret != WOLFSSL_SUCCESS) { + info->doShutdown = 1; printf("Client Error: %d (%s)\n", ret, wolfSSL_ERR_reason_error_string(ret)); } @@ -862,7 +927,11 @@ exit: return ret; } +#ifdef CMSIS_OS2_H_ +static void client_thread(void* args) +#else static void client_thread(const void* args) +#endif { int ret; info_t* info = (info_t*)args; @@ -871,8 +940,13 @@ static void client_thread(const void* args) ret = bench_tls_client(info); /* signal server */ - if (!info->server.done && info->server.threadId != 0) + if (!info->server.done && info->server.threadId != 0) { +#ifdef CMSIS_OS2_H_ + osThreadFlagsSet(info->server.threadId, 1); +#else osSignalSet(info->server.threadId, 1); +#endif + } info->client.ret = ret; info->client.done = 1; osThreadSuspend(NULL); @@ -888,7 +962,7 @@ static int bench_tls_server(info_t* info) { byte *readBuf = NULL; double start; - int ret, len = 0, readBufSz; + int ret = 0, len = 0, readBufSz; WOLFSSL_CTX* srv_ctx = NULL; WOLFSSL* srv_ssl = NULL; int tls13 = XSTRNCMP(info->cipher, "TLS13", 5) == 0; @@ -896,16 +970,43 @@ static int bench_tls_server(info_t* info) /* set up server */ #ifdef WOLFSSL_TLS13 - if (tls13) - srv_ctx = wolfSSL_CTX_new(wolfTLSv1_3_server_method()); + if (tls13) { + #ifdef WOLFSSL_STATIC_MEMORY + ret = wolfSSL_CTX_load_static_memory(&srv_ctx, wolfTLSv1_3_server_method_ex, + gWolfCTXSrv, sizeof(gWolfCTXSrv), WOLFMEM_GENERAL , 10); + #else + srv_ctx = wolfSSL_CTX_new(wolfTLSv1_3_server_method()); + #endif + } #endif - if (!tls13) - srv_ctx = wolfSSL_CTX_new(wolfSSLv23_server_method()); - if (srv_ctx == NULL) { - printf("error creating server ctx\n"); + if (!tls13) { +#if !defined(WOLFSSL_TLS13) + #ifdef WOLFSSL_STATIC_MEMORY + ret = wolfSSL_CTX_load_static_memory(&srv_ctx, wolfSSLv23_server_method_ex, + gWolfCTXSrv, sizeof(gWolfCTXSrv), WOLFMEM_GENERAL , 10); + #else + srv_ctx = wolfSSL_CTX_new(wolfSSLv23_server_method()); + #endif +#elif !defined(WOLFSSL_NO_TLS12) + #ifdef WOLFSSL_STATIC_MEMORY + ret = wolfSSL_CTX_load_static_memory(&srv_ctx, wolfTLSv1_2_server_method_ex, + gWolfCTXSrv, sizeof(gWolfCTXSrv), WOLFMEM_GENERAL , 10); + #else + srv_ctx = wolfSSL_CTX_new(wolfTLSv1_2_server_method()); + #endif +#endif + } + + if (srv_ctx == NULL || ret != 0) { + printf("error creating server ctx: ret %d\n", ret); ret = MEMORY_E; goto exit; } +#ifdef WOLFSSL_STATIC_MEMORY + ret = wolfSSL_CTX_load_static_memory(&srv_ctx, 0, gWolfIOSrv, sizeof(gWolfIOSrv), + WOLFMEM_IO_POOL, 10 ); +#endif + #ifndef NO_CERTS #ifdef HAVE_ECC if (XSTRSTR(info->cipher, "ECDSA")) { @@ -1081,6 +1182,7 @@ static int bench_tls_server(info_t* info) exit: if (ret != 0 && ret != WOLFSSL_SUCCESS) { + info->doShutdown = 1; printf("Server Error: %d (%s)\n", ret, wolfSSL_ERR_reason_error_string(ret)); } @@ -1096,7 +1198,11 @@ exit: return ret; } +#ifdef CMSIS_OS2_H_ +static void server_thread(void* args) +#else static void server_thread(const void* args) +#endif { int ret; info_t* info = (info_t*)args; @@ -1105,8 +1211,13 @@ static void server_thread(const void* args) ret = bench_tls_server(info); /* signal client */ - if (!info->client.done && info->client.threadId != 0) + if (!info->client.done && info->client.threadId != 0) { +#ifdef CMSIS_OS2_H_ + osThreadFlagsSet(info->client.threadId, 1); +#else osSignalSet(info->client.threadId, 1); +#endif + } info->server.ret = ret; info->server.done = 1; osThreadSuspend(NULL); @@ -1118,6 +1229,19 @@ static void server_thread(const void* args) osThreadTerminate(info->server.threadId); } +#ifdef CMSIS_OS2_H_ +static const osThreadAttr_t server_thread_attributes = { + .name = "server_thread", + .priority = (osPriority_t) osPriorityNormal, + .stack_size = WOLF_EXAMPLES_STACK +}; +static const osThreadAttr_t client_thread_attributes = { + .name = "client_thread", + .priority = (osPriority_t) osPriorityNormal, + .stack_size = WOLF_EXAMPLES_STACK +}; +#endif + int bench_tls(void* args) { int ret = 0; @@ -1170,6 +1294,10 @@ int bench_tls(void* args) info->showPeerInfo = argShowPeerInfo; info->showVerbose = argShowVerbose; +#ifdef CMSIS_OS2_H_ + info->server.mutex = osSemaphoreNew(1, 0, NULL); + info->client.mutex = osSemaphoreNew(1, 0, NULL); +#else info->server.mutex = osSemaphoreCreate(&info->server.mutexDef, 1); info->client.mutex = osSemaphoreCreate(&info->client.mutexDef, 1); @@ -1183,6 +1311,7 @@ int bench_tls(void* args) info->client.threadDef.pthread = client_thread; info->client.threadDef.tpriority = osPriorityNormal; info->client.threadDef.stacksize = WOLF_EXAMPLES_STACK; +#endif /* parse by : */ while ((cipher != NULL) && (cipher[0] != '\0')) { @@ -1213,13 +1342,21 @@ int bench_tls(void* args) /* start threads */ if (info->server.threadId == 0) { +#ifdef CMSIS_OS2_H_ + info->server.threadId = osThreadNew(server_thread, info, &server_thread_attributes); +#else info->server.threadId = osThreadCreate(&info->server.threadDef, info); +#endif } else { osThreadResume(info->server.threadId); } if (info->client.threadId == 0) { +#ifdef CMSIS_OS2_H_ + info->client.threadId = osThreadNew(client_thread, info, &client_thread_attributes); +#else info->client.threadId = osThreadCreate(&info->client.threadDef, info); +#endif } else { osThreadResume(info->client.threadId); @@ -1277,19 +1414,84 @@ exit: return ret; } -#endif /* (!NO_WOLFSSL_CLIENT || !NO_WOLFSSL_SERVER) && !WOLFCRYPT_ONLY */ +#endif /* (!NO_WOLFSSL_CLIENT || !NO_WOLFSSL_SERVER) && !WOLFCRYPT_ONLY && !SINGLE_THREADED */ -/***************************************************************************** - * Private functions - ****************************************************************************/ +#ifndef WOLFCRYPT_ONLY +static void ShowCiphers(void) +{ + int ret; + char* ciphers = (char*)XMALLOC(WOLFSSL_CIPHER_LIST_MAX_SIZE, NULL, + DYNAMIC_TYPE_TMP_BUFFER); + if (ciphers) { + ret = wolfSSL_get_ciphers(ciphers, WOLFSSL_CIPHER_LIST_MAX_SIZE); + if (ret == WOLFSSL_SUCCESS) + printf("%s\n", ciphers); + XFREE(ciphers, NULL, DYNAMIC_TYPE_TMP_BUFFER); + } +} +#endif + +static void PrintMemStats(void) +{ +#ifdef WOLFSSL_DEBUG_MEMORY + printf("\nHeap MinEver %d, Free %d, Stack %lu\n", + xPortGetMinimumEverFreeHeapSize(), + xPortGetFreeHeapSize(), + uxTaskGetStackHighWaterMark(NULL)); +#endif +} + +#if 0 +static void* wolfMallocCb(size_t size) +{ + void* ptr = malloc(size); + if (ptr == NULL) { + printf("BREAK!\n"); + } + return ptr; +} +static void wolfFreeCb(void *ptr) +{ + free(ptr); +} +static void* wolfReallocCb(void *ptr, size_t size) +{ + return realloc(ptr, size); +} +#endif /***************************************************************************** * Public functions ****************************************************************************/ +#ifdef HAL_RTC_MODULE_ENABLED +extern RTC_HandleTypeDef hrtc; +double current_time(void) +{ + RTC_TimeTypeDef time; + RTC_DateTypeDef date; + uint32_t subsec; + + /* must get time and date here due to STM32 HW bug */ + HAL_RTC_GetTime(&hrtc, &time, FORMAT_BIN); + HAL_RTC_GetDate(&hrtc, &date, FORMAT_BIN); + subsec = (255 - time.SubSeconds) * 1000 / 255; + + (void) date; + + /* return seconds.milliseconds */ + return ((double) time.Hours * 24) + ((double) time.Minutes * 60) + + (double) time.Seconds + ((double) subsec / 1000); +} +#endif /* HAL_RTC_MODULE_ENABLED */ + +#ifdef CMSIS_OS2_H_ +void wolfCryptDemo(void* argument) +#else void wolfCryptDemo(const void* argument) +#endif { HAL_StatusTypeDef halRet; - uint8_t buffer[1]; /* single char */ + uint8_t buffer[2]; func_args args; #ifdef DEBUG_WOLFSSL @@ -1297,18 +1499,31 @@ void wolfCryptDemo(const void* argument) #endif /* initialize wolfSSL */ +#ifdef WOLFCRYPT_ONLY + wolfCrypt_Init(); +#else wolfSSL_Init(); +#endif + +#ifdef WOLFSSL_STATIC_MEMORY + if (wc_LoadStaticMemory(&HEAP_HINT, gWolfMem, sizeof(gWolfMem), + WOLFMEM_GENERAL, 10) != 0) { + printf("unable to load static memory"); + } +#endif + + //wolfSSL_SetAllocators(wolfMallocCb, wolfFreeCb, wolfReallocCb); while (1) { memset(&args, 0, sizeof(args)); args.return_code = NOT_COMPILED_IN; /* default */ - printf("\r\n\t\t\t\tMENU\r\n"); + printf("\n\t\t\t\tMENU\n"); printf(menu1); printf("Please select one of the above options:\n"); do { - halRet = HAL_UART_Receive(&huart4, buffer, sizeof(buffer), 100); + halRet = HAL_UART_Receive(&HAL_CONSOLE_UART, buffer, sizeof(buffer), 100); } while (halRet != HAL_OK || buffer[0] == '\n' || buffer[0] == '\r'); switch (buffer[0]) { @@ -1317,6 +1532,8 @@ void wolfCryptDemo(const void* argument) #ifndef NO_CRYPT_TEST args.return_code = 0; wolfcrypt_test(&args); + #else + args.return_code = NOT_COMPILED_IN; #endif printf("Crypt Test: Return code %d\n", args.return_code); break; @@ -1326,30 +1543,42 @@ void wolfCryptDemo(const void* argument) #ifndef NO_CRYPT_BENCHMARK args.return_code = 0; benchmark_test(&args); + #else + args.return_code = NOT_COMPILED_IN; #endif printf("Benchmark Test: Return code %d\n", args.return_code); break; case 'l': printf("Running TLS Benchmarks...\n"); - #if (!defined(NO_WOLFSSL_CLIENT) || !defined(NO_WOLFSSL_SERVER)) && !defined(WOLFCRYPT_ONLY) + #if (!defined(NO_WOLFSSL_CLIENT) || !defined(NO_WOLFSSL_SERVER)) && !defined(WOLFCRYPT_ONLY) && !defined(SINGLE_THREADED) bench_tls(&args); + #else + args.return_code = NOT_COMPILED_IN; #endif printf("TLS Benchmarks: Return code %d\n", args.return_code); break; case 'e': + #ifndef WOLFCRYPT_ONLY ShowCiphers(); + #else + printf("Not compiled in\n"); + #endif break; // All other cases go here default: - printf("\r\nSelection out of range\r\n"); + printf("\nSelection out of range\n"); break; } PrintMemStats(); } +#ifdef WOLFCRYPT_ONLY + wolfCrypt_Cleanup(); +#else wolfSSL_Cleanup(); +#endif } diff --git a/IDE/OPENSTM32/Inc/wolfssl_example.h b/IDE/STM32Cube/wolfssl_example.h similarity index 90% rename from IDE/OPENSTM32/Inc/wolfssl_example.h rename to IDE/STM32Cube/wolfssl_example.h index c97e2dd84..f43884d87 100644 --- a/IDE/OPENSTM32/Inc/wolfssl_example.h +++ b/IDE/STM32Cube/wolfssl_example.h @@ -22,10 +22,6 @@ #ifndef WOLFSSL_EXAMPLE_H_ #define WOLFSSL_EXAMPLE_H_ -#include -#include -#include - #ifdef HAVE_CONFIG_H #include #endif @@ -39,11 +35,18 @@ #include #include -#ifndef WOLF_EXAMPLES_STACK -#define WOLF_EXAMPLES_STACK (30 * configMINIMAL_STACK_SIZE) +#ifndef SINGLE_THREADED +#include #endif -void wolfCryptDemo(void const * argument); +#ifndef WOLF_EXAMPLES_STACK +#define WOLF_EXAMPLES_STACK (30*1024) +#endif +#ifdef CMSIS_OS2_H_ +void wolfCryptDemo(void* argument); +#else +void wolfCryptDemo(void const * argument); +#endif #endif /* WOLFSSL_EXAMPLE_H_ */ diff --git a/IDE/include.am b/IDE/include.am index 828b173ad..ec75c5ffd 100644 --- a/IDE/include.am +++ b/IDE/include.am @@ -12,7 +12,7 @@ include IDE/ROWLEY-CROSSWORKS-ARM/include.am include IDE/TRUESTUDIO/include.am include IDE/ARDUINO/include.am include IDE/INTIME-RTOS/include.am -include IDE/OPENSTM32/include.am +include IDE/STM32Cube/include.am include IDE/VS-ARM/include.am include IDE/VS-AZURE-SPHERE/include.am include IDE/GCC-ARM/include.am diff --git a/sslSniffer/sslSnifferTest/snifftest.c b/sslSniffer/sslSnifferTest/snifftest.c index 1b4292af1..f8873962b 100644 --- a/sslSniffer/sslSnifferTest/snifftest.c +++ b/sslSniffer/sslSnifferTest/snifftest.c @@ -35,7 +35,7 @@ #endif #ifndef WOLFSSL_SNIFFER - +#ifndef NO_MAIN_DRIVER /* blank build */ #include #include @@ -44,7 +44,7 @@ int main(void) printf("do ./configure --enable-sniffer to enable build support\n"); return EXIT_SUCCESS; } - +#endif /* !NO_MAIN_DRIVER */ #else /* do a full build */ diff --git a/wolfssl/wolfcrypt/settings.h b/wolfssl/wolfcrypt/settings.h index f22357c29..4b5f90586 100644 --- a/wolfssl/wolfcrypt/settings.h +++ b/wolfssl/wolfcrypt/settings.h @@ -219,6 +219,9 @@ #ifdef WOLFSSL_USER_SETTINGS #include "user_settings.h" +#elif defined(USE_HAL_DRIVER) && !defined(HAVE_CONFIG_H) + /* STM Configuration File (generated by CubeMX) */ + #include "wolfSSL.wolfSSL_conf.h" #endif From ad7e636e34a03a9d8a17a51bbf3dc30e25fb01c7 Mon Sep 17 00:00:00 2001 From: David Garske Date: Thu, 11 Jun 2020 15:12:28 -0700 Subject: [PATCH 211/298] Adds STM32H7 support. Tested on NUCLEO-H753ZI board. STM32H753ZI at 480MHz ``` Running wolfCrypt Benchmarks... ------------------------------------------------------------------------------ wolfSSL version 4.4.1 ------------------------------------------------------------------------------ wolfCrypt Benchmark (block bytes 1024, min 1.0 sec each) RNG 250 KB took 1.047 seconds, 238.777 KB/s AES-128-CBC-enc 4 MB took 1.004 seconds, 3.623 MB/s AES-128-CBC-dec 4 MB took 1.004 seconds, 3.623 MB/s AES-192-CBC-enc 4 MB took 1.000 seconds, 3.613 MB/s AES-192-CBC-dec 4 MB took 1.000 seconds, 3.613 MB/s AES-256-CBC-enc 4 MB took 1.000 seconds, 3.613 MB/s AES-256-CBC-dec 4 MB took 1.000 seconds, 3.613 MB/s AES-128-GCM-enc 3 MB took 1.004 seconds, 3.380 MB/s AES-128-GCM-dec 3 MB took 1.004 seconds, 3.356 MB/s AES-192-GCM-enc 3 MB took 1.004 seconds, 3.380 MB/s AES-192-GCM-dec 3 MB took 1.003 seconds, 3.359 MB/s AES-256-GCM-enc 3 MB took 1.000 seconds, 3.369 MB/s AES-256-GCM-dec 3 MB took 1.004 seconds, 3.356 MB/s CHACHA 850 KB took 1.020 seconds, 833.333 KB/s CHA-POLY 650 KB took 1.015 seconds, 640.394 KB/s POLY1305 4 MB took 1.004 seconds, 4.037 MB/s SHA-256 3 MB took 1.004 seconds, 3.088 MB/s HMAC-SHA256 3 MB took 1.004 seconds, 3.015 MB/s RSA 2048 public 78 ops took 1.023 sec, avg 13.115 ms, 76.246 ops/sec RSA 2048 private 4 ops took 1.682 sec, avg 420.500 ms, 2.378 ops/sec DH 2048 key gen 6 ops took 1.165 sec, avg 194.167 ms, 5.150 ops/sec DH 2048 agree 6 ops took 1.165 sec, avg 194.167 ms, 5.150 ops/sec ECC 256 key gen 96 ops took 1.004 sec, avg 10.458 ms, 95.618 ops/sec ECDHE 256 agree 50 ops took 1.027 sec, avg 20.540 ms, 48.685 ops/sec ECDSA 256 sign 64 ops took 1.000 sec, avg 15.625 ms, 64.000 ops/sec ECDSA 256 verify 32 ops took 1.039 sec, avg 32.469 ms, 30.799 ops/sec Benchmark complete Benchmark Test: Return code 0 ``` --- IDE/STM32Cube/Boards/STM32H753.ioc | 338 +++++++++++++++++++++++++++ IDE/STM32Cube/include.am | 1 + IDE/STM32Cube/wolfSSL.wolfSSL_conf.h | 5 + wolfssl/wolfcrypt/port/st/stm32.h | 6 +- wolfssl/wolfcrypt/settings.h | 8 +- 5 files changed, 353 insertions(+), 5 deletions(-) create mode 100644 IDE/STM32Cube/Boards/STM32H753.ioc diff --git a/IDE/STM32Cube/Boards/STM32H753.ioc b/IDE/STM32Cube/Boards/STM32H753.ioc new file mode 100644 index 000000000..48ba80756 --- /dev/null +++ b/IDE/STM32Cube/Boards/STM32H753.ioc @@ -0,0 +1,338 @@ +#MicroXplorer Configuration settings - do not modify +CORTEX_M7.CPU_DCache=Disabled +CORTEX_M7.CPU_ICache=Disabled +CORTEX_M7.IPParameters=CPU_ICache,CPU_DCache,MPU_Control +CORTEX_M7.MPU_Control=__NULL +ETH.ETH_RX_DESC_CNT=4 +ETH.ETH_TX_DESC_CNT=4 +ETH.IPParameters=MACAddr,MediaInterface,ETH_TX_DESC_CNT,TxDescAddress,ETH_RX_DESC_CNT,RxDescAddress,RxBuffAddress,RxBuffLen +ETH.MACAddr=00\:80\:E1\:00\:00\:00 +ETH.MediaInterface=HAL_ETH_RMII_MODE +ETH.RxBuffAddress=0x30040200 +ETH.RxBuffLen=1524 +ETH.RxDescAddress=0x30040000 +ETH.TxDescAddress=0x30040060 +FREERTOS.FootprintOK=true +FREERTOS.IPParameters=Tasks01,configTOTAL_HEAP_SIZE,configUSE_MALLOC_FAILED_HOOK,configCHECK_FOR_STACK_OVERFLOW,FootprintOK +FREERTOS.Tasks01=defaultTask,24,128,StartDefaultTask,Default,NULL,Dynamic,NULL,NULL;wolfCrypt,8,8960,wolfCryptDemo,As external,NULL,Dynamic,NULL,NULL +FREERTOS.configCHECK_FOR_STACK_OVERFLOW=2 +FREERTOS.configTOTAL_HEAP_SIZE=180000 +FREERTOS.configUSE_MALLOC_FAILED_HOOK=1 +File.Version=6 +KeepUserPlacement=false +Mcu.Family=STM32H7 +Mcu.IP0=CORTEX_M7 +Mcu.IP1=CRYP +Mcu.IP10=USART3 +Mcu.IP11=USB_OTG_FS +Mcu.IP2=ETH +Mcu.IP3=FREERTOS +Mcu.IP4=HASH +Mcu.IP5=NVIC +Mcu.IP6=RCC +Mcu.IP7=RNG +Mcu.IP8=RTC +Mcu.IP9=SYS +Mcu.IPNb=12 +Mcu.Name=STM32H753ZITx +Mcu.Package=LQFP144 +Mcu.Pin0=PC13 +Mcu.Pin1=PC14-OSC32_IN (OSC32_IN) +Mcu.Pin10=PC5 +Mcu.Pin11=PB0 +Mcu.Pin12=PB13 +Mcu.Pin13=PB14 +Mcu.Pin14=PD8 +Mcu.Pin15=PD9 +Mcu.Pin16=PD10 +Mcu.Pin17=PG7 +Mcu.Pin18=PA8 +Mcu.Pin19=PA9 +Mcu.Pin2=PC15-OSC32_OUT (OSC32_OUT) +Mcu.Pin20=PA11 +Mcu.Pin21=PA12 +Mcu.Pin22=PG11 +Mcu.Pin23=PG13 +Mcu.Pin24=PE1 +Mcu.Pin25=VP_CRYP_VS_CRYP +Mcu.Pin26=VP_FREERTOS_VS_CMSIS_V2 +Mcu.Pin27=VP_HASH_VS_HASH +Mcu.Pin28=VP_RNG_VS_RNG +Mcu.Pin29=VP_RTC_VS_RTC_Activate +Mcu.Pin3=PH0-OSC_IN (PH0) +Mcu.Pin30=VP_SYS_VS_tim1 +Mcu.Pin31=VP_wolfSSL.wolfSSL_VS_wolfSSLJjwolfSSL_4.4.1 +Mcu.Pin4=PH1-OSC_OUT (PH1) +Mcu.Pin5=PC1 +Mcu.Pin6=PA1 +Mcu.Pin7=PA2 +Mcu.Pin8=PA7 +Mcu.Pin9=PC4 +Mcu.PinsNb=32 +Mcu.ThirdParty0=wolfSSL.wolfSSL.4.4.1 +Mcu.ThirdPartyNb=1 +Mcu.UserConstants= +Mcu.UserName=STM32H753ZITx +MxCube.Version=5.6.1 +MxDb.Version=DB.5.0.60 +NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.ForceEnableDMAVector=true +NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.PendSV_IRQn=true\:15\:0\:false\:false\:false\:true\:false\:false +NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4 +NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:false\:false\:false\:false +NVIC.SysTick_IRQn=true\:15\:0\:false\:false\:false\:true\:false\:false +NVIC.TIM1_UP_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:true +NVIC.TimeBase=TIM1_UP_IRQn +NVIC.TimeBaseIP=TIM1 +NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +PA1.Locked=true +PA1.Mode=RMII +PA1.Signal=ETH_REF_CLK +PA11.Locked=true +PA11.Mode=Device_Only +PA11.Signal=USB_OTG_FS_DM +PA12.Locked=true +PA12.Mode=Device_Only +PA12.Signal=USB_OTG_FS_DP +PA2.Locked=true +PA2.Mode=RMII +PA2.Signal=ETH_MDIO +PA7.Locked=true +PA7.Mode=RMII +PA7.Signal=ETH_CRS_DV +PA8.Locked=true +PA8.Mode=Activate_SOF_FS +PA8.Signal=USB_OTG_FS_SOF +PA9.Locked=true +PA9.Mode=Activate_VBUS +PA9.Signal=USB_OTG_FS_VBUS +PB0.GPIOParameters=GPIO_Label +PB0.GPIO_Label=LD1 [Green Led] +PB0.Locked=true +PB0.Signal=GPIO_Output +PB13.Locked=true +PB13.Mode=RMII +PB13.Signal=ETH_TXD1 +PB14.GPIOParameters=GPIO_Label +PB14.GPIO_Label=LD3 [Red Led] +PB14.Locked=true +PB14.Signal=GPIO_Output +PC1.Locked=true +PC1.Mode=RMII +PC1.Signal=ETH_MDC +PC13.GPIOParameters=GPIO_Label +PC13.GPIO_Label=B1 [Blue PushButton] +PC13.Locked=true +PC13.Signal=GPIO_Input +PC14-OSC32_IN\ (OSC32_IN).Locked=true +PC14-OSC32_IN\ (OSC32_IN).Mode=LSE-External-Oscillator +PC14-OSC32_IN\ (OSC32_IN).Signal=RCC_OSC32_IN +PC15-OSC32_OUT\ (OSC32_OUT).Locked=true +PC15-OSC32_OUT\ (OSC32_OUT).Mode=LSE-External-Oscillator +PC15-OSC32_OUT\ (OSC32_OUT).Signal=RCC_OSC32_OUT +PC4.Locked=true +PC4.Mode=RMII +PC4.Signal=ETH_RXD0 +PC5.Locked=true +PC5.Mode=RMII +PC5.Signal=ETH_RXD1 +PD10.GPIOParameters=GPIO_Label +PD10.GPIO_Label=USB_OTG_FS_PWR_EN +PD10.Locked=true +PD10.Signal=GPIO_Output +PD8.GPIOParameters=GPIO_Label +PD8.GPIO_Label=STLINK_RX +PD8.Locked=true +PD8.Mode=Asynchronous +PD8.Signal=USART3_TX +PD9.GPIOParameters=GPIO_Label +PD9.GPIO_Label=STLINK_TX +PD9.Locked=true +PD9.Mode=Asynchronous +PD9.Signal=USART3_RX +PE1.GPIOParameters=GPIO_Label +PE1.GPIO_Label=LD2 [Yellow Led] +PE1.Locked=true +PE1.Signal=GPIO_Output +PG11.Locked=true +PG11.Mode=RMII +PG11.Signal=ETH_TX_EN +PG13.Locked=true +PG13.Mode=RMII +PG13.Signal=ETH_TXD0 +PG7.GPIOParameters=GPIO_Label +PG7.GPIO_Label=USB_OTG_FS_OVCR +PG7.Locked=true +PG7.Signal=GPXTI7 +PH0-OSC_IN\ (PH0).Locked=true +PH0-OSC_IN\ (PH0).Mode=HSE-External-Clock-Source +PH0-OSC_IN\ (PH0).Signal=RCC_OSC_IN +PH1-OSC_OUT\ (PH1).Locked=true +PH1-OSC_OUT\ (PH1).Signal=RCC_OSC_OUT +PinOutPanel.RotationAngle=0 +ProjectManager.AskForMigrate=true +ProjectManager.BackupPrevious=false +ProjectManager.CompilerOptimize=6 +ProjectManager.ComputerToolchain=false +ProjectManager.CoupleFile=false +ProjectManager.CustomerFirmwarePackage= +ProjectManager.DefaultFWLocation=true +ProjectManager.DeletePrevious=true +ProjectManager.DeviceId=STM32H753ZITx +ProjectManager.FirmwarePackage=STM32Cube FW_H7 V1.7.0 +ProjectManager.FreePins=false +ProjectManager.HalAssertFull=false +ProjectManager.HeapSize=0x200 +ProjectManager.KeepUserCode=true +ProjectManager.LastFirmware=true +ProjectManager.LibraryCopy=1 +ProjectManager.MainLocation=Core/Src +ProjectManager.NoMain=false +ProjectManager.PreviousToolchain= +ProjectManager.ProjectBuild=false +ProjectManager.ProjectFileName=STM32H753.ioc +ProjectManager.ProjectName=STM32H753 +ProjectManager.StackSize=0x400 +ProjectManager.TargetToolchain=STM32CubeIDE +ProjectManager.ToolChainLocation= +ProjectManager.UnderRoot=true +ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-SystemClock_Config-RCC-false-HAL-false,3-MX_ETH_Init-ETH-false-HAL-true,4-MX_USART3_UART_Init-USART3-false-HAL-true,5-MX_USB_OTG_FS_PCD_Init-USB_OTG_FS-false-HAL-true,0-MX_CORTEX_M7_Init-CORTEX_M7-false-HAL-true +RCC.ADCFreq_Value=16125000 +RCC.AHB12Freq_Value=240000000 +RCC.AHB4Freq_Value=240000000 +RCC.APB1Freq_Value=120000000 +RCC.APB2Freq_Value=120000000 +RCC.APB3Freq_Value=120000000 +RCC.APB4Freq_Value=120000000 +RCC.AXIClockFreq_Value=240000000 +RCC.CECFreq_Value=32000 +RCC.CKPERFreq_Value=64000000 +RCC.CortexFreq_Value=480000000 +RCC.CpuClockFreq_Value=480000000 +RCC.D1CPREFreq_Value=480000000 +RCC.D1PPRE=RCC_APB3_DIV2 +RCC.D2PPRE1=RCC_APB1_DIV2 +RCC.D2PPRE2=RCC_APB2_DIV2 +RCC.D3PPRE=RCC_APB4_DIV2 +RCC.DFSDMACLkFreq_Value=48000000 +RCC.DFSDMFreq_Value=120000000 +RCC.DIVM1=1 +RCC.DIVN1=120 +RCC.DIVP1Freq_Value=480000000 +RCC.DIVP2Freq_Value=16125000 +RCC.DIVP3Freq_Value=16125000 +RCC.DIVQ1=20 +RCC.DIVQ1Freq_Value=48000000 +RCC.DIVQ2Freq_Value=16125000 +RCC.DIVQ3Freq_Value=16125000 +RCC.DIVR1Freq_Value=480000000 +RCC.DIVR2Freq_Value=16125000 +RCC.DIVR3Freq_Value=16125000 +RCC.FDCANFreq_Value=48000000 +RCC.FMCFreq_Value=240000000 +RCC.FamilyName=M +RCC.HCLK3ClockFreq_Value=240000000 +RCC.HCLKFreq_Value=240000000 +RCC.HPRE=RCC_HCLK_DIV2 +RCC.HRTIMFreq_Value=240000000 +RCC.HSE_VALUE=8000000 +RCC.I2C123Freq_Value=120000000 +RCC.I2C4Freq_Value=120000000 +RCC.IPParameters=ADCFreq_Value,AHB12Freq_Value,AHB4Freq_Value,APB1Freq_Value,APB2Freq_Value,APB3Freq_Value,APB4Freq_Value,AXIClockFreq_Value,CECFreq_Value,CKPERFreq_Value,CortexFreq_Value,CpuClockFreq_Value,D1CPREFreq_Value,D1PPRE,D2PPRE1,D2PPRE2,D3PPRE,DFSDMACLkFreq_Value,DFSDMFreq_Value,DIVM1,DIVN1,DIVP1Freq_Value,DIVP2Freq_Value,DIVP3Freq_Value,DIVQ1,DIVQ1Freq_Value,DIVQ2Freq_Value,DIVQ3Freq_Value,DIVR1Freq_Value,DIVR2Freq_Value,DIVR3Freq_Value,FDCANFreq_Value,FMCFreq_Value,FamilyName,HCLK3ClockFreq_Value,HCLKFreq_Value,HPRE,HRTIMFreq_Value,HSE_VALUE,I2C123Freq_Value,I2C4Freq_Value,LPTIM1Freq_Value,LPTIM2Freq_Value,LPTIM345Freq_Value,LPUART1Freq_Value,LTDCFreq_Value,MCO1PinFreq_Value,MCO2PinFreq_Value,PLL2FRACN,PLL3FRACN,PLLFRACN,QSPIFreq_Value,RNGFreq_Value,RTCFreq_Value,SAI1Freq_Value,SAI23Freq_Value,SAI4AFreq_Value,SAI4BFreq_Value,SDMMCFreq_Value,SPDIFRXFreq_Value,SPI123Freq_Value,SPI45Freq_Value,SPI6Freq_Value,SWPMI1Freq_Value,SYSCLKFreq_VALUE,SYSCLKSource,Tim1OutputFreq_Value,Tim2OutputFreq_Value,TraceFreq_Value,USART16Freq_Value,USART234578Freq_Value,USBFreq_Value,VCO1OutputFreq_Value,VCO2OutputFreq_Value,VCO3OutputFreq_Value,VCOInput1Freq_Value,VCOInput2Freq_Value,VCOInput3Freq_Value +RCC.LPTIM1Freq_Value=120000000 +RCC.LPTIM2Freq_Value=120000000 +RCC.LPTIM345Freq_Value=120000000 +RCC.LPUART1Freq_Value=120000000 +RCC.LTDCFreq_Value=16125000 +RCC.MCO1PinFreq_Value=64000000 +RCC.MCO2PinFreq_Value=480000000 +RCC.PLL2FRACN=0 +RCC.PLL3FRACN=0 +RCC.PLLFRACN=0 +RCC.QSPIFreq_Value=240000000 +RCC.RNGFreq_Value=48000000 +RCC.RTCFreq_Value=32000 +RCC.SAI1Freq_Value=48000000 +RCC.SAI23Freq_Value=48000000 +RCC.SAI4AFreq_Value=48000000 +RCC.SAI4BFreq_Value=48000000 +RCC.SDMMCFreq_Value=48000000 +RCC.SPDIFRXFreq_Value=48000000 +RCC.SPI123Freq_Value=48000000 +RCC.SPI45Freq_Value=120000000 +RCC.SPI6Freq_Value=120000000 +RCC.SWPMI1Freq_Value=120000000 +RCC.SYSCLKFreq_VALUE=480000000 +RCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK +RCC.Tim1OutputFreq_Value=240000000 +RCC.Tim2OutputFreq_Value=240000000 +RCC.TraceFreq_Value=64000000 +RCC.USART16Freq_Value=120000000 +RCC.USART234578Freq_Value=120000000 +RCC.USBFreq_Value=48000000 +RCC.VCO1OutputFreq_Value=960000000 +RCC.VCO2OutputFreq_Value=32250000 +RCC.VCO3OutputFreq_Value=32250000 +RCC.VCOInput1Freq_Value=8000000 +RCC.VCOInput2Freq_Value=250000 +RCC.VCOInput3Freq_Value=250000 +SH.GPXTI7.0=GPIO_EXTI7 +SH.GPXTI7.ConfNb=1 +USART3.AutoBaudRateEnableParam=UART_ADVFEATURE_AUTOBAUDRATE_DISABLE +USART3.BaudRate=115200 +USART3.ClockPrescaler=PRESCALER_DIV1 +USART3.DMADisableonRxErrorParam=ADVFEATURE_DMA_ENABLEONRXERROR +USART3.DataInvertParam=ADVFEATURE_DATAINV_DISABLE +USART3.FIFOMode=FIFOMODE_DISABLE +USART3.IPParameters=BaudRate,VirtualMode-Asynchronous,WordLength,Parity,StopBits,Mode,OverSampling,OneBitSampling,ClockPrescaler,FIFOMode,TXFIFOThreshold,RXFIFOThreshold,AutoBaudRateEnableParam,TxPinLevelInvertParam,RxPinLevelInvertParam,DataInvertParam,SwapParam,OverrunDisableParam,DMADisableonRxErrorParam,MSBFirstParam +USART3.MSBFirstParam=ADVFEATURE_MSBFIRST_DISABLE +USART3.Mode=MODE_TX_RX +USART3.OneBitSampling=UART_ONE_BIT_SAMPLE_DISABLE +USART3.OverSampling=UART_OVERSAMPLING_16 +USART3.OverrunDisableParam=ADVFEATURE_OVERRUN_ENABLE +USART3.Parity=PARITY_NONE +USART3.RXFIFOThreshold=RXFIFO_THRESHOLD_1EIGHTHFULL +USART3.RxPinLevelInvertParam=ADVFEATURE_RXINV_DISABLE +USART3.StopBits=STOPBITS_1 +USART3.SwapParam=ADVFEATURE_SWAP_DISABLE +USART3.TXFIFOThreshold=TXFIFO_THRESHOLD_1EIGHTHFULL +USART3.TxPinLevelInvertParam=ADVFEATURE_TXINV_DISABLE +USART3.VirtualMode-Asynchronous=VM_ASYNC +USART3.WordLength=WORDLENGTH_8B +USB_OTG_FS.IPParameters=low_power_enable,VirtualMode,battery_charging_enable,lpm_enable,use_dedicated_ep1,vbus_sensing_enable,Sof_enable +USB_OTG_FS.Sof_enable=ENABLE +USB_OTG_FS.VirtualMode=Device_Only +USB_OTG_FS.battery_charging_enable=ENABLE +USB_OTG_FS.low_power_enable=DISABLE +USB_OTG_FS.lpm_enable=DISABLE +USB_OTG_FS.use_dedicated_ep1=DISABLE +USB_OTG_FS.vbus_sensing_enable=ENABLE +VP_CRYP_VS_CRYP.Mode=CRYP_Activate +VP_CRYP_VS_CRYP.Signal=CRYP_VS_CRYP +VP_FREERTOS_VS_CMSIS_V2.Mode=CMSIS_V2 +VP_FREERTOS_VS_CMSIS_V2.Signal=FREERTOS_VS_CMSIS_V2 +VP_HASH_VS_HASH.Mode=HASH_Activate +VP_HASH_VS_HASH.Signal=HASH_VS_HASH +VP_RNG_VS_RNG.Mode=RNG_Activate +VP_RNG_VS_RNG.Signal=RNG_VS_RNG +VP_RTC_VS_RTC_Activate.Mode=RTC_Enabled +VP_RTC_VS_RTC_Activate.Signal=RTC_VS_RTC_Activate +VP_SYS_VS_tim1.Mode=TIM1 +VP_SYS_VS_tim1.Signal=SYS_VS_tim1 +VP_wolfSSL.wolfSSL_VS_wolfSSLJjwolfSSL_4.4.1.Mode=wolfSSLJjwolfSSL +VP_wolfSSL.wolfSSL_VS_wolfSSLJjwolfSSL_4.4.1.Signal=wolfSSL.wolfSSL_VS_wolfSSLJjwolfSSL_4.4.1 +board=NUCLEO-H753ZI +boardIOC=true +wolfSSL.wolfSSL.4.4.1.IPParameters=wolfSSLCcwolfSSLJjwolfSSLJjCore,wolfSSLCcwolfSSLJjwolfCryptJjCore,wolfSSLCcwolfSSLJjwolfCryptJjTest,WOLF_CONF_MATH,WOLF_CONF_RTOS +wolfSSL.wolfSSL.4.4.1.WOLF_CONF_MATH=4 +wolfSSL.wolfSSL.4.4.1.WOLF_CONF_RTOS=2 +wolfSSL.wolfSSL.4.4.1.wolfSSLCcwolfSSLJjwolfCryptJjCore=true +wolfSSL.wolfSSL.4.4.1.wolfSSLCcwolfSSLJjwolfCryptJjTest=true +wolfSSL.wolfSSL.4.4.1.wolfSSLCcwolfSSLJjwolfSSLJjCore=true +wolfSSL.wolfSSL.4.4.1.wolfSSLJjwolfSSL_Checked=true +wolfSSL.wolfSSL.4.4.1_SwParameter=wolfSSLCcwolfSSLJjwolfCryptJjCore\:true;wolfSSLCcwolfSSLJjwolfCryptJjTest\:true;wolfSSLCcwolfSSLJjwolfSSLJjCore\:true; +isbadioc=false diff --git a/IDE/STM32Cube/include.am b/IDE/STM32Cube/include.am index 8d41e34c9..c9a65f052 100644 --- a/IDE/STM32Cube/include.am +++ b/IDE/STM32Cube/include.am @@ -10,6 +10,7 @@ EXTRA_DIST+= IDE/STM32Cube/wolfssl_example.h EXTRA_DIST+= IDE/STM32Cube/Boards/STM32F407.ioc EXTRA_DIST+= IDE/STM32Cube/Boards/STM32F437.ioc EXTRA_DIST+= IDE/STM32Cube/Boards/STM32F777.ioc +EXTRA_DIST+= IDE/STM32Cube/Boards/STM32H753.ioc EXTRA_DIST+= IDE/STM32Cube/Boards/STM32L4A6.ioc EXTRA_DIST+= IDE/STM32Cube/Boards/STM32L475.ioc EXTRA_DIST+= IDE/STM32Cube/Boards/STM32L552.ioc diff --git a/IDE/STM32Cube/wolfSSL.wolfSSL_conf.h b/IDE/STM32Cube/wolfSSL.wolfSSL_conf.h index b7b5181c2..063db0b5d 100644 --- a/IDE/STM32Cube/wolfSSL.wolfSSL_conf.h +++ b/IDE/STM32Cube/wolfSSL.wolfSSL_conf.h @@ -139,6 +139,11 @@ extern "C" { #undef NO_STM32_CRYPTO #define STM32_HAL_V2 #define HAL_CONSOLE_UART huart2 +#elif defined(STM32H753xx) + #define WOLFSSL_STM32H7 + #undef NO_STM32_HASH + #undef NO_STM32_CRYPTO + #define HAL_CONSOLE_UART huart3 #elif defined(STM32L4A6xx) #define WOLFSSL_STM32L4 #undef NO_STM32_HASH diff --git a/wolfssl/wolfcrypt/port/st/stm32.h b/wolfssl/wolfcrypt/port/st/stm32.h index 06a49160f..3db84c7e9 100644 --- a/wolfssl/wolfcrypt/port/st/stm32.h +++ b/wolfssl/wolfcrypt/port/st/stm32.h @@ -92,7 +92,7 @@ int wc_Stm32_Hash_Final(STM32_HASH_Context* stmCtx, word32 algo, #ifndef NO_AES #if !defined(STM32_CRYPTO_AES_GCM) && (defined(WOLFSSL_STM32F4) || \ defined(WOLFSSL_STM32F7) || defined(WOLFSSL_STM32L4) || \ - defined(WOLFSSL_STM32L5)) + defined(WOLFSSL_STM32L5) || defined(WOLFSSL_STM32H7)) /* Hardware supports AES GCM acceleration */ #define STM32_CRYPTO_AES_GCM #endif @@ -113,8 +113,8 @@ int wc_Stm32_Hash_Final(STM32_HASH_Context* stmCtx, word32 algo, #endif /* Detect newer CubeMX crypto HAL (HAL_CRYP_Encrypt / HAL_CRYP_Decrypt) */ - #if !defined(STM32_HAL_V2) && \ - (defined(WOLFSSL_STM32F7) || defined(WOLFSSL_STM32L5)) && defined(CRYP_AES_GCM) + #if !defined(STM32_HAL_V2) && defined(CRYP_AES_GCM) && \ + (defined(WOLFSSL_STM32F7) || defined(WOLFSSL_STM32L5) || defined(WOLFSSL_STM32H7)) #define STM32_HAL_V2 #endif diff --git a/wolfssl/wolfcrypt/settings.h b/wolfssl/wolfcrypt/settings.h index 4b5f90586..37190676f 100644 --- a/wolfssl/wolfcrypt/settings.h +++ b/wolfssl/wolfcrypt/settings.h @@ -1207,7 +1207,7 @@ extern void uITRON4_free(void *p) ; #if defined(WOLFSSL_STM32F2) || defined(WOLFSSL_STM32F4) || \ defined(WOLFSSL_STM32F7) || defined(WOLFSSL_STM32F1) || \ defined(WOLFSSL_STM32L4) || defined(WOLFSSL_STM32L5) || \ - defined(WOLFSSL_STM32WB) + defined(WOLFSSL_STM32WB) || defined(WOLFSSL_STM32H7) #define SIZEOF_LONG_LONG 8 #ifndef CHAR_BIT @@ -1254,6 +1254,8 @@ extern void uITRON4_free(void *p) ; #include "stm32f7xx_hal.h" #elif defined(WOLFSSL_STM32F1) #include "stm32f1xx_hal.h" + #elif defined(WOLFSSL_STM32H7) + #include "stm32h7xx_hal.h" #elif defined(WOLFSSL_STM32WB) #include "stm32wbxx_hal.h" #endif @@ -1299,12 +1301,14 @@ extern void uITRON4_free(void *p) ; #endif #elif defined(WOLFSSL_STM32F7) #include "stm32f7xx.h" + #elif defined(WOLFSSL_STM32H7) + #include "stm32h7xx.h" #elif defined(WOLFSSL_STM32F1) #include "stm32f1xx.h" #endif #endif /* WOLFSSL_STM32_CUBEMX */ #endif /* WOLFSSL_STM32F2 || WOLFSSL_STM32F4 || WOLFSSL_STM32L4 || - WOLFSSL_STM32L5 || WOLFSSL_STM32F7 || WOLFSSL_STMWB */ + WOLFSSL_STM32L5 || WOLFSSL_STM32F7 || WOLFSSL_STMWB || WOLFSSL_STM32H7 */ #ifdef WOLFSSL_DEOS #include #include From 651a7a97b90462e998f565c7bcd3e431618e04d1 Mon Sep 17 00:00:00 2001 From: Juliusz Sosinowicz Date: Tue, 19 May 2020 14:11:05 +0200 Subject: [PATCH 212/298] Add secure renegotiation to DTLS 1.2 - Hash of fragmented certificate was not calculated as a single message and instead we were hashing individual fragments which produced the wrong digest, shared secret, etc... - Reset handshake number after server Finished packet is sent or received (depending on side) - Reserve space in buffer for cipher stuff - Take `DTLS_RECORD_EXTRA` and `DTLS_HANDSHAKE_EXTRA` into size and offset calculations for DTLS path - Fix renegotiation in DTLS with AES128-SHA - Fix renegotiation in DTLS with AES-GCM - Support HelloVerify request during secure renegotiation - Save renegotiation handshake messages for retransmission in timeout - Handle cipher parameters from different epochs. DTLS may need to resend and receive messages from previous epochs so handling different sets of encryption and decryption parameters is crucial. --- src/internal.c | 910 ++++++++++++++++++++++++++++++++++----------- src/keys.c | 102 ++++- src/ssl.c | 68 +++- src/tls.c | 25 +- src/wolfio.c | 4 +- wolfssl/internal.h | 31 +- wolfssl/ssl.h | 1 + 7 files changed, 898 insertions(+), 243 deletions(-) diff --git a/src/internal.c b/src/internal.c index 96e0d8f46..53d1c688e 100644 --- a/src/internal.c +++ b/src/internal.c @@ -161,7 +161,7 @@ static const byte tls13Downgrade[7] = { #if !defined(NO_OLD_TLS) && !defined(WOLFSSL_AEAD_ONLY) static int SSL_hmac(WOLFSSL* ssl, byte* digest, const byte* in, word32 sz, - int padSz, int content, int verify); + int padSz, int content, int verify, int epochOrder); #endif @@ -221,15 +221,25 @@ static WC_INLINE int IsEncryptionOn(WOLFSSL* ssl, int isSend) * If SCTP is enabled returns dtls && !sctp. */ static WC_INLINE int IsDtlsNotSctpMode(WOLFSSL* ssl) { - int result = ssl->options.dtls; - - if (result) { #ifdef WOLFSSL_SCTP - result = !ssl->options.dtlsSctp; + return ssl->options.dtls && !ssl->options.dtlsSctp; +#else + return ssl->options.dtls; #endif - } +} - return result; +int IsInitialRenegotiationState(WOLFSSL* ssl) +{ + if (ssl->options.acceptState == ACCEPT_FIRST_REPLY_DONE + #ifdef HAVE_SECURE_RENEGOTIATION + || ssl->options.acceptState == ACCEPT_BEGIN_RENEG + #endif + ) { + return 1; + } + else { + return 0; + } } #endif /* DTLS || !WOLFSSL_NO_TLS12 */ @@ -6725,6 +6735,14 @@ static WC_INLINE void GetSEQIncrement(WOLFSSL* ssl, int verify, word32 seq[2]) #ifdef WOLFSSL_DTLS static WC_INLINE void DtlsGetSEQ(WOLFSSL* ssl, int order, word32 seq[2]) { +#ifdef HAVE_SECURE_RENEGOTIATION + /* if ssl->secure_renegotiation->tmp_keys.dtls_epoch > ssl->keys.dtls_epoch then PREV_ORDER + * refers to the current epoch */ + if (order == PREV_ORDER && ssl->secure_renegotiation && + ssl->secure_renegotiation->tmp_keys.dtls_epoch > ssl->keys.dtls_epoch) { + order = CUR_ORDER; + } +#endif if (order == PREV_ORDER) { /* Previous epoch case */ if (ssl->options.haveMcast) { @@ -6770,6 +6788,14 @@ static WC_INLINE void DtlsGetSEQ(WOLFSSL* ssl, int order, word32 seq[2]) static WC_INLINE void DtlsSEQIncrement(WOLFSSL* ssl, int order) { word32 seq; +#ifdef HAVE_SECURE_RENEGOTIATION + /* if ssl->secure_renegotiation->tmp_keys.dtls_epoch > ssl->keys.dtls_epoch then PREV_ORDER + * refers to the current epoch */ + if (order == PREV_ORDER && ssl->secure_renegotiation && + ssl->secure_renegotiation->tmp_keys.dtls_epoch > ssl->keys.dtls_epoch) { + order = CUR_ORDER; + } +#endif if (order == PREV_ORDER) { seq = ssl->keys.dtls_prev_sequence_number_lo++; @@ -6878,6 +6904,25 @@ void DtlsMsgListDelete(DtlsMsg* head, void* heap) } } +void DtlsTxMsgListClean(WOLFSSL* ssl) +{ + DtlsMsg* head = ssl->dtls_tx_msg_list; + DtlsMsg* next; + while (head) { + next = head->next; + if (VerifyForTxDtlsMsgDelete(ssl, head)) + DtlsMsgDelete(head, ssl->heap); + else + /* Stored packets should be in order so break on first failed + * verify */ + break; + ssl->dtls_tx_msg_list_sz--; + /* Reset timer as deleting a node means that state has progressed */ + ssl->dtls_timeout = ssl->dtls_timeout_init; + head = next; + } + ssl->dtls_tx_msg_list = head; +} /* Create a DTLS Fragment from *begin - end, adjust new *begin and bytesLeft */ static DtlsFrag* CreateFragment(word32* begin, word32 end, const byte* data, @@ -6903,7 +6948,7 @@ static DtlsFrag* CreateFragment(word32* begin, word32 end, const byte* data, } -int DtlsMsgSet(DtlsMsg* msg, word32 seq, const byte* data, byte type, +int DtlsMsgSet(DtlsMsg* msg, word32 seq, word16 epoch, const byte* data, byte type, word32 fragOffset, word32 fragSz, void* heap) { if (msg != NULL && data != NULL && msg->fragSz <= msg->sz && @@ -6916,6 +6961,7 @@ int DtlsMsgSet(DtlsMsg* msg, word32 seq, const byte* data, byte type, word32 added; msg->seq = seq; + msg->epoch = epoch; msg->type = type; if (fragOffset == 0) { @@ -7004,16 +7050,16 @@ int DtlsMsgSet(DtlsMsg* msg, word32 seq, const byte* data, byte type, } -DtlsMsg* DtlsMsgFind(DtlsMsg* head, word32 seq) +DtlsMsg* DtlsMsgFind(DtlsMsg* head, word32 epoch, word32 seq) { - while (head != NULL && head->seq != seq) { + while (head != NULL && head->epoch == epoch && head->seq != seq) { head = head->next; } return head; } -void DtlsMsgStore(WOLFSSL* ssl, word32 seq, const byte* data, +void DtlsMsgStore(WOLFSSL* ssl, word32 epoch, word32 seq, const byte* data, word32 dataSz, byte type, word32 fragOffset, word32 fragSz, void* heap) { /* See if seq exists in the list. If it isn't in the list, make @@ -7036,12 +7082,12 @@ void DtlsMsgStore(WOLFSSL* ssl, word32 seq, const byte* data, DtlsMsg* head = ssl->dtls_rx_msg_list; if (head != NULL) { - DtlsMsg* cur = DtlsMsgFind(head, seq); + DtlsMsg* cur = DtlsMsgFind(head, epoch, seq); if (cur == NULL) { cur = DtlsMsgNew(dataSz, heap); if (cur != NULL) { - if (DtlsMsgSet(cur, seq, data, type, - fragOffset, fragSz, heap) < 0) { + if (DtlsMsgSet(cur, seq, epoch, data, type, + fragOffset, fragSz, heap) < 0) { DtlsMsgDelete(cur, heap); } else { @@ -7052,12 +7098,14 @@ void DtlsMsgStore(WOLFSSL* ssl, word32 seq, const byte* data, } else { /* If this fails, the data is just dropped. */ - DtlsMsgSet(cur, seq, data, type, fragOffset, fragSz, heap); + DtlsMsgSet(cur, seq, epoch, data, type, fragOffset, + fragSz, heap); } } else { head = DtlsMsgNew(dataSz, heap); - if (DtlsMsgSet(head, seq, data, type, fragOffset, fragSz, heap) < 0) { + if (DtlsMsgSet(head, seq, epoch, data, type, fragOffset, + fragSz, heap) < 0) { DtlsMsgDelete(head, heap); head = NULL; } @@ -7102,7 +7150,7 @@ DtlsMsg* DtlsMsgInsert(DtlsMsg* head, DtlsMsg* item) /* DtlsMsgPoolSave() adds the message to the end of the stored transmit list. */ -int DtlsMsgPoolSave(WOLFSSL* ssl, const byte* data, word32 dataSz) +int DtlsMsgPoolSave(WOLFSSL* ssl, const byte* data, word32 dataSz, enum HandShakeType type) { DtlsMsg* item; int ret = 0; @@ -7121,7 +7169,10 @@ int DtlsMsgPoolSave(WOLFSSL* ssl, const byte* data, word32 dataSz) XMEMCPY(item->buf, data, dataSz); item->sz = dataSz; - item->seq = ssl->keys.dtls_epoch; + item->epoch = ssl->keys.dtls_epoch; + /* save is called after something incremented this var */ + item->seq = ssl->keys.dtls_handshake_number - 1; + item->type = type; if (cur == NULL) ssl->dtls_tx_msg_list = item; @@ -7163,8 +7214,8 @@ void DtlsMsgPoolReset(WOLFSSL* ssl) ssl->dtls_tx_msg_list = NULL; ssl->dtls_tx_msg = NULL; ssl->dtls_tx_msg_list_sz = 0; - ssl->dtls_timeout = ssl->dtls_timeout_init; } + ssl->dtls_timeout = ssl->dtls_timeout_init; } @@ -7185,12 +7236,37 @@ int VerifyForDtlsMsgPoolSend(WOLFSSL* ssl, byte type, word32 fragOffset) } +int VerifyForTxDtlsMsgDelete(WOLFSSL* ssl, DtlsMsg* item) +{ + if (item->epoch < ssl->keys.dtls_epoch - 1) + return 1; + switch (ssl->options.side) { + case WOLFSSL_CLIENT_END: + if (item->type == client_hello && + ssl->options.serverState >= SERVER_HELLODONE_COMPLETE) + return 1; /* client can forget first client_hello if received full + * flight of packets from server */ + else + return 0; + case WOLFSSL_SERVER_END: + if (ssl->options.clientState >= CLIENT_FINISHED_COMPLETE && + item->type <= server_hello_done) + return 1; + else + return 0; + default: + return 0; + } +} + + /* DtlsMsgPoolSend() will send the stored transmit list. The stored list is * updated with new sequence numbers, and will be re-encrypted if needed. */ int DtlsMsgPoolSend(WOLFSSL* ssl, int sendOnlyFirstPacket) { int ret = 0; DtlsMsg* pool; + int epochOrder; WOLFSSL_ENTER("DtlsMsgPoolSend()"); @@ -7213,9 +7289,8 @@ int DtlsMsgPoolSend(WOLFSSL* ssl, int sendOnlyFirstPacket) } while (pool != NULL) { - if (pool->seq == 0) { + if (pool->epoch == 0) { DtlsRecordLayerHeader* dtls; - int epochOrder; dtls = (DtlsRecordLayerHeader*)pool->buf; /* If the stored record's epoch is 0, and the currently set @@ -7238,7 +7313,8 @@ int DtlsMsgPoolSend(WOLFSSL* ssl, int sendOnlyFirstPacket) ssl->buffers.outputBuffer.idx = 0; ssl->buffers.outputBuffer.length = pool->sz; } - else if (pool->seq == ssl->keys.dtls_epoch) { + else { + /* Handle sending packets from previous epoch */ byte* input; byte* output; int inputSz, sendSz; @@ -7247,6 +7323,28 @@ int DtlsMsgPoolSend(WOLFSSL* ssl, int sendOnlyFirstPacket) inputSz = pool->sz; sendSz = inputSz + MAX_MSG_EXTRA; +#ifdef HAVE_SECURE_RENEGOTIATION + + /* + * CUR_ORDER will use ssl->secure_renegotiation from epoch 2+. + * ssl->keys otherwise + * PREV_ORDER will always use ssl->keys + */ + if (ssl->secure_renegotiation && + ssl->secure_renegotiation->tmp_keys.dtls_epoch != 0) { + if (pool->epoch == ssl->secure_renegotiation->tmp_keys.dtls_epoch) + epochOrder = CUR_ORDER; + else + epochOrder = PREV_ORDER; + } + else { + epochOrder = CUR_ORDER; + } +#else + epochOrder = CUR_ORDER; +#endif + + if ((ret = CheckAvailableSize(ssl, sendSz)) != 0) { WOLFSSL_ERROR(ret); return ret; @@ -7254,8 +7352,15 @@ int DtlsMsgPoolSend(WOLFSSL* ssl, int sendOnlyFirstPacket) output = ssl->buffers.outputBuffer.buffer + ssl->buffers.outputBuffer.length; - sendSz = BuildMessage(ssl, output, sendSz, input, inputSz, - handshake, 0, 0, 0); + if (inputSz != ENUM_LEN) + sendSz = BuildMessage(ssl, output, sendSz, input, inputSz, + handshake, 0, 0, 0, epochOrder); + else + /* inputSz == ENUM_LEN must mean that this is a change cipher + * spec message */ + sendSz = BuildMessage(ssl, output, sendSz, input, inputSz, + change_cipher_spec, 0, 0, 0, epochOrder); + if (sendSz < 0) { WOLFSSL_ERROR(BUILD_MSG_ERROR); return BUILD_MSG_ERROR; @@ -7757,10 +7862,12 @@ int HashInput(WOLFSSL* ssl, const byte* input, int sz) /* add record layer header for message */ -static void AddRecordHeader(byte* output, word32 length, byte type, WOLFSSL* ssl) +static void AddRecordHeader(byte* output, word32 length, byte type, WOLFSSL* ssl, int epochOrder) { RecordLayerHeader* rl; + (void)epochOrder; + /* record layer header */ rl = (RecordLayerHeader*)output; if (rl == NULL) { @@ -7794,7 +7901,7 @@ static void AddRecordHeader(byte* output, word32 length, byte type, WOLFSSL* ssl /* dtls record layer header extensions */ dtls = (DtlsRecordLayerHeader*)output; - WriteSEQ(ssl, 0, dtls->sequence_number); + WriteSEQ(ssl, epochOrder, dtls->sequence_number); c16toa((word16)length, dtls->length); #endif } @@ -7846,7 +7953,7 @@ static void AddHeaders(byte* output, word32 length, byte type, WOLFSSL* ssl) } #endif - AddRecordHeader(output, length + lengthAdj, handshake, ssl); + AddRecordHeader(output, length + lengthAdj, handshake, ssl, CUR_ORDER); AddHandShakeHeader(output + outputAdj, length, 0, length, type, ssl); } #endif /* !WOLFSSL_NO_TLS12 || (HAVE_SESSION_TICKET && !NO_WOLFSSL_SERVER) */ @@ -7869,7 +7976,7 @@ static void AddFragHeaders(byte* output, word32 fragSz, word32 fragOffset, } #endif - AddRecordHeader(output, fragSz + lengthAdj, handshake, ssl); + AddRecordHeader(output, fragSz + lengthAdj, handshake, ssl, CUR_ORDER); AddHandShakeHeader(output + outputAdj, length, fragOffset, fragSz, type, ssl); } #endif /* NO_CERTS */ @@ -7941,7 +8048,7 @@ retry: case WOLFSSL_CBIO_ERR_TIMEOUT: #ifdef WOLFSSL_DTLS if (IsDtlsNotSctpMode(ssl) && - !ssl->options.handShakeDone && + ssl->options.handShakeState != HANDSHAKE_DONE && DtlsMsgPoolTimeout(ssl) == 0 && DtlsMsgPoolSend(ssl, 0) == 0) { @@ -11921,7 +12028,12 @@ int DoFinished(WOLFSSL* ssl, const byte* input, word32* inOutIdx, word32 size, } #ifdef WOLFSSL_DTLS if (ssl->options.dtls) { - DtlsMsgPoolReset(ssl); + if ((!ssl->options.resuming && ssl->options.side == WOLFSSL_CLIENT_END) || + (ssl->options.resuming && ssl->options.side == WOLFSSL_SERVER_END)){ + DtlsMsgPoolReset(ssl); + ssl->keys.dtls_handshake_number = 0; + ssl->keys.dtls_expected_peer_handshake_number = 0; + } } #endif @@ -12231,7 +12343,8 @@ static int SanityCheckMsgReceived(WOLFSSL* ssl, byte type) if (ssl->options.verifyPeer && ssl->options.havePeerCert) { - if (!ssl->options.havePeerVerify) { + if (!ssl->options.havePeerVerify || + !ssl->msgsReceived.got_certificate_verify) { WOLFSSL_MSG("client didn't send cert verify"); #ifdef WOLFSSL_DTLS if (ssl->options.dtls) @@ -12391,6 +12504,25 @@ static int DoHandShakeMsgType(WOLFSSL* ssl, byte* input, word32* inOutIdx, case hello_verify_request: WOLFSSL_MSG("processing hello verify request"); ret = DoHelloVerifyRequest(ssl, input,inOutIdx, size); + if (IsEncryptionOn(ssl, 0)) { + #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY) + if (ssl->options.startedETMRead) { + word32 digestSz = MacSize(ssl); + if (*inOutIdx + ssl->keys.padSz + digestSz > totalSz) + return BUFFER_E; + *inOutIdx += ssl->keys.padSz + digestSz; + } + else + #endif + { + /* access beyond input + size should be checked against totalSz + */ + if (*inOutIdx + ssl->keys.padSz > totalSz) + return BUFFER_E; + + *inOutIdx += ssl->keys.padSz; + } + } break; case server_hello: @@ -12930,9 +13062,13 @@ static int DtlsMsgDrain(WOLFSSL* ssl) item->fragSz == item->sz && ret == 0) { word32 idx = 0; - ssl->keys.dtls_expected_peer_handshake_number++; - ret = DoHandShakeMsgType(ssl, item->msg, - &idx, item->type, item->sz, item->sz); + /* If item is from the wrong epoch then just ignore it */ + if (ssl->keys.dtls_epoch == item->epoch && + (ret = DoHandShakeMsgType(ssl, item->msg, &idx, item->type, + item->sz, item->sz)) == 0) { + ssl->keys.dtls_expected_peer_handshake_number++; + DtlsTxMsgListClean(ssl); + } #ifdef WOLFSSL_ASYNC_CRYPT if (ret == WC_PENDING_E) { ssl->keys.dtls_expected_peer_handshake_number--; @@ -12957,6 +13093,7 @@ static int DoDtlsHandShakeMsg(WOLFSSL* ssl, byte* input, word32* inOutIdx, word32 size; word32 fragOffset, fragSz; int ret = 0; + int ignoreFinished = 0; WOLFSSL_ENTER("DoDtlsHandShakeMsg()"); @@ -12992,6 +13129,19 @@ static int DoDtlsHandShakeMsg(WOLFSSL* ssl, byte* input, word32* inOutIdx, return INCOMPLETE_DATA; } + if (type == finished && ssl->keys.dtls_peer_handshake_number >= + ssl->keys.dtls_expected_peer_handshake_number && + ssl->keys.curEpoch == ssl->keys.dtls_epoch) { + /* finished msg should be ignore if it is in the current epoch + * if it comes from a previous handshake */ + if (ssl->options.side == WOLFSSL_CLIENT_END) { + ignoreFinished = ssl->options.connectState < FINISHED_DONE; + } + else { + ignoreFinished = ssl->options.acceptState < ACCEPT_FINISHED_DONE; + } + } + /* Check the handshake sequence number first. If out of order, * add the current message to the list. If the message is in order, * but it is a fragment, add the current message to the list, then @@ -13002,7 +13152,9 @@ static int DoDtlsHandShakeMsg(WOLFSSL* ssl, byte* input, word32* inOutIdx, * head is out of order, return for more processing. */ if (ssl->keys.dtls_peer_handshake_number > - ssl->keys.dtls_expected_peer_handshake_number) { + ssl->keys.dtls_expected_peer_handshake_number && + (type == client_hello || ssl->options.handShakeState != HANDSHAKE_DONE) && + !ignoreFinished) { /* Current message is out of order. It will get stored in the list. * Storing also takes care of defragmentation. If the messages is a * client hello, we need to process this out of order; the server @@ -13012,13 +13164,31 @@ static int DoDtlsHandShakeMsg(WOLFSSL* ssl, byte* input, word32* inOutIdx, * number. (If the cookie changes multiple times in quick succession, * the client could be sending multiple new client hello messages * with newer and newer cookies.) */ + WOLFSSL_MSG("Current message is out of order"); if (type != client_hello) { if (ssl->dtls_rx_msg_list_sz < DTLS_POOL_SZ) { - DtlsMsgStore(ssl, ssl->keys.dtls_peer_handshake_number, + DtlsMsgStore(ssl, ssl->keys.curEpoch, + ssl->keys.dtls_peer_handshake_number, input + *inOutIdx, size, type, fragOffset, fragSz, ssl->heap); } *inOutIdx += fragSz; + #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY) + if (ssl->options.startedETMRead && ssl->keys.curEpoch != 0) { + word32 digestSz = MacSize(ssl); + if (*inOutIdx + ssl->keys.padSz + digestSz > totalSz) + return BUFFER_E; + *inOutIdx += digestSz; + } + else + #endif + { + if (*inOutIdx + ssl->keys.padSz > totalSz) { + WOLFSSL_ERROR(BUFFER_E); + return BUFFER_E; + } + } + *inOutIdx += ssl->keys.padSz; ret = 0; } else { @@ -13030,25 +13200,27 @@ static int DoDtlsHandShakeMsg(WOLFSSL* ssl, byte* input, word32* inOutIdx, } } else if (ssl->keys.dtls_peer_handshake_number < - ssl->keys.dtls_expected_peer_handshake_number) { + ssl->keys.dtls_expected_peer_handshake_number || + (ssl->keys.dtls_peer_handshake_number > + ssl->keys.dtls_expected_peer_handshake_number && + ssl->options.handShakeState == HANDSHAKE_DONE) || + ignoreFinished) { /* Already saw this message and processed it. It can be ignored. */ + WOLFSSL_MSG("Already saw this message and processed it"); *inOutIdx += fragSz; - if(type == finished ) { #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY) - if (ssl->options.startedETMRead) { - word32 digestSz = MacSize(ssl); - if (*inOutIdx + ssl->keys.padSz + digestSz > totalSz) - return BUFFER_E; - *inOutIdx += ssl->keys.padSz + digestSz; - } - else + if (ssl->options.startedETMRead && ssl->keys.curEpoch != 0) { + word32 digestSz = MacSize(ssl); + if (*inOutIdx + ssl->keys.padSz + digestSz > totalSz) + return BUFFER_E; + *inOutIdx += digestSz; + } + else #endif - { - if (*inOutIdx + ssl->keys.padSz > totalSz) { - WOLFSSL_ERROR(BUFFER_E); - return BUFFER_E; - } - *inOutIdx += ssl->keys.padSz; + { + if (*inOutIdx + ssl->keys.padSz > totalSz) { + WOLFSSL_ERROR(BUFFER_E); + return BUFFER_E; } } if (IsDtlsNotSctpMode(ssl) && @@ -13056,27 +13228,42 @@ static int DoDtlsHandShakeMsg(WOLFSSL* ssl, byte* input, word32* inOutIdx, ret = DtlsMsgPoolSend(ssl, 0); } + *inOutIdx += ssl->keys.padSz; } else if (fragSz < size) { /* Since this branch is in order, but fragmented, dtls_rx_msg_list will * be pointing to the message with this fragment in it. Check it to see * if it is completed. */ + WOLFSSL_MSG("Branch is in order, but fragmented"); if (ssl->dtls_rx_msg_list_sz < DTLS_POOL_SZ) { - DtlsMsgStore(ssl, ssl->keys.dtls_peer_handshake_number, + DtlsMsgStore(ssl, ssl->keys.curEpoch, + ssl->keys.dtls_peer_handshake_number, input + *inOutIdx, size, type, fragOffset, fragSz, ssl->heap); } *inOutIdx += fragSz; + *inOutIdx += ssl->keys.padSz; +#if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY) + if (ssl->options.startedETMRead && ssl->keys.curEpoch != 0) { + word32 digestSz = MacSize(ssl); + if (*inOutIdx + digestSz > totalSz) + return BUFFER_E; + *inOutIdx += digestSz; + } +#endif ret = 0; if (ssl->dtls_rx_msg_list != NULL && ssl->dtls_rx_msg_list->fragSz >= ssl->dtls_rx_msg_list->sz) ret = DtlsMsgDrain(ssl); } else { - /* This branch is in order next, and a complete message. */ + /* This branch is in order next, and a complete message. On success + * clean the tx list. */ + WOLFSSL_MSG("Branch is in order and a complete message"); ret = DoHandShakeMsgType(ssl, input, inOutIdx, type, size, totalSz); if (ret == 0) { - if (type != client_hello || !IsDtlsNotSctpMode(ssl)) + DtlsTxMsgListClean(ssl); + if (type != finished) ssl->keys.dtls_expected_peer_handshake_number++; if (ssl->dtls_rx_msg_list != NULL) { ret = DtlsMsgDrain(ssl); @@ -13869,8 +14056,21 @@ static WC_INLINE int DecryptDo(WOLFSSL* ssl, byte* plain, const byte* input, c16toa(sz - AESGCM_EXP_IV_SZ - ssl->specs.aead_mac_size, ssl->decrypt.additional + AEAD_LEN_OFFSET); - XMEMCPY(ssl->decrypt.nonce, ssl->keys.aead_dec_imp_IV, - AESGCM_IMP_IV_SZ); + + #if defined(WOLFSSL_DTLS) && defined(HAVE_SECURE_RENEGOTIATION) + if (ssl->options.dtls && ssl->secure_renegotiation && + ssl->secure_renegotiation->tmp_keys.dtls_epoch != 0) { + if (ssl->keys.curEpoch == ssl->secure_renegotiation->tmp_keys.dtls_epoch) + XMEMCPY(ssl->decrypt.nonce, ssl->secure_renegotiation->tmp_keys.aead_dec_imp_IV, + AESGCM_IMP_IV_SZ); + else + XMEMCPY(ssl->decrypt.nonce, ssl->keys.aead_dec_imp_IV, + AESGCM_IMP_IV_SZ); + } + else + #endif + XMEMCPY(ssl->decrypt.nonce, ssl->keys.aead_dec_imp_IV, + AESGCM_IMP_IV_SZ); XMEMCPY(ssl->decrypt.nonce + AESGCM_IMP_IV_SZ, input, AESGCM_EXP_IV_SZ); if ((ret = aes_auth_fn(ssl->decrypt.aes, @@ -13994,6 +14194,27 @@ static WC_INLINE int Decrypt(WOLFSSL* ssl, byte* plain, const byte* input, FALL_THROUGH; case CIPHER_STATE_DO: { + #if defined(WOLFSSL_DTLS) && defined(HAVE_SECURE_RENEGOTIATION) + if (ssl->options.dtls && ssl->secure_renegotiation && + ssl->secure_renegotiation->tmp_keys.dtls_epoch != 0) { + if (ssl->keys.curEpoch == ssl->secure_renegotiation->tmp_keys.dtls_epoch) { + if (ssl->decrypt.src != SCR) { + ssl->secure_renegotiation->cache_status = SCR_CACHE_NEEDED; + if ((ret = SetKeysSide(ssl, DECRYPT_SIDE_ONLY)) != 0) + break; + } + WOLFSSL_BUFFER(ssl->secure_renegotiation->tmp_keys.client_write_key, MAX_SYM_KEY_SIZE); + } + else { + if (ssl->decrypt.src != KEYS) { + ssl->secure_renegotiation->cache_status = SCR_CACHE_NULL; + if ((ret = SetKeysSide(ssl, DECRYPT_SIDE_ONLY)) != 0) + break; + } + } + } + #endif + ret = DecryptDo(ssl, plain, input, sz); /* Advance state */ @@ -14229,7 +14450,7 @@ int TimingPadVerify(WOLFSSL* ssl, const byte* input, int padLen, int macSz, * either increment the size by (macSz + padLen + 1) before use or check on * the size to make sure is valid. */ ret = ssl->hmac(ssl, verify, input, pLen - macSz - padLen - 1, padLen, - content, 1); + content, 1, PEER_ORDER); good |= MaskMac(input, pLen, ssl->specs.hash_size, verify); /* Non-zero on failure. */ @@ -14515,7 +14736,7 @@ static WC_INLINE int VerifyMacEnc(WOLFSSL* ssl, const byte* input, word32 msgSz, return VERIFY_MAC_ERROR; } - ret = ssl->hmac(ssl, verify, input, msgSz - digestSz, -1, content, 1); + ret = ssl->hmac(ssl, verify, input, msgSz - digestSz, -1, content, 1, PEER_ORDER); ret |= ConstantCompare(verify, input + msgSz - digestSz, digestSz); if (ret != 0) { return VERIFY_MAC_ERROR; @@ -14568,8 +14789,8 @@ static WC_INLINE int VerifyMac(WOLFSSL* ssl, const byte* input, word32 msgSz, badPadLen = 1; } PadCheck(dummy, (byte)pad, MAX_PAD_SIZE); /* timing only */ - ret = ssl->hmac(ssl, verify, input, msgSz - digestSz - pad - 1, pad, - content, 1); + ret = ssl->hmac(ssl, verify, input, msgSz - digestSz - pad - 1, + pad, content, 1, PEER_ORDER); if (ConstantCompare(verify, input + msgSz - digestSz - pad - 1, digestSz) != 0) return VERIFY_MAC_ERROR; @@ -14578,7 +14799,8 @@ static WC_INLINE int VerifyMac(WOLFSSL* ssl, const byte* input, word32 msgSz, } } else if (ssl->specs.cipher_type == stream) { - ret = ssl->hmac(ssl, verify, input, msgSz - digestSz, -1, content, 1); + ret = ssl->hmac(ssl, verify, input, msgSz - digestSz, -1, content, 1, + PEER_ORDER); if (ConstantCompare(verify, input + msgSz - digestSz, digestSz) != 0){ return VERIFY_MAC_ERROR; } @@ -14752,12 +14974,6 @@ int ProcessReply(WOLFSSL* ssl) ssl->replayDropCount++; #endif /* WOLFSSL_DTLS_DROP_STATS */ - if (IsDtlsNotSctpMode(ssl) && ssl->options.dtlsHsRetain) { - ret = DtlsMsgPoolSend(ssl, 0); - if (ret != 0) - return ret; - } - continue; } #endif @@ -15109,6 +15325,7 @@ int ProcessReply(WOLFSSL* ssl) switch (ssl->curRL.type) { case handshake : + WOLFSSL_MSG("got HANDSHAKE"); /* debugging in DoHandShakeMsg */ if (ssl->options.dtls) { #ifdef WOLFSSL_DTLS @@ -15166,7 +15383,8 @@ int ProcessReply(WOLFSSL* ssl) AddPacketInfo(ssl, "ChangeCipher", change_cipher_spec, ssl->buffers.inputBuffer.buffer + - ssl->buffers.inputBuffer.idx - RECORD_HEADER_SZ, + ssl->buffers.inputBuffer.idx - RECORD_HEADER_SZ - + (ssl->options.dtls ? DTLS_RECORD_EXTRA : 0), 1 + RECORD_HEADER_SZ, READ_PROTO, ssl->heap); #ifdef WOLFSSL_CALLBACKS AddLateRecordHeader(&ssl->curRL, &ssl->timeoutInfo); @@ -15199,39 +15417,23 @@ int ProcessReply(WOLFSSL* ssl) #endif #ifndef WOLFSSL_NO_TLS12 - ret = SanityCheckMsgReceived(ssl, change_cipher_hs); - if (ret != 0) { - if (!ssl->options.dtls) { - return ret; - } - else { - #ifdef WOLFSSL_DTLS - /* Check for duplicate CCS message in DTLS mode. - * DTLS allows for duplicate messages, and it should be - * skipped. Also skip if out of order. */ - if (ret != DUPLICATE_MSG_E && ret != OUT_OF_ORDER_E) - return ret; - - if (IsDtlsNotSctpMode(ssl)) { - ret = DtlsMsgPoolSend(ssl, 1); - if (ret != 0) - return ret; - } - - if (ssl->curSize != 1) { - WOLFSSL_MSG("Malicious or corrupted" - " duplicate ChangeCipher msg"); - return LENGTH_ERROR; - } - ssl->buffers.inputBuffer.idx++; - break; - #endif /* WOLFSSL_DTLS */ - } + if (ssl->buffers.inputBuffer.buffer[ + ssl->buffers.inputBuffer.idx] != 1) { + WOLFSSL_MSG("ChangeCipher msg wrong value"); + return LENGTH_ERROR; } if (IsEncryptionOn(ssl, 0) && ssl->options.handShakeDone) { ssl->buffers.inputBuffer.idx += ssl->keys.padSz; - ssl->curSize -= (word16) ssl->buffers.inputBuffer.idx; + ssl->curSize -= ssl->keys.padSz; +#ifdef HAVE_AEAD + if (ssl->specs.cipher_type == aead && + ssl->specs.bulk_cipher_algorithm != wolfssl_chacha) + ssl->curSize -= AESGCM_EXP_IV_SZ; + else +#endif + ssl->curSize -= ssl->specs.iv_size; + #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY) if (ssl->options.startedETMRead) { word32 digestSz = MacSize(ssl); @@ -15247,6 +15449,25 @@ int ProcessReply(WOLFSSL* ssl) } ssl->buffers.inputBuffer.idx++; + + ret = SanityCheckMsgReceived(ssl, change_cipher_hs); + if (ret != 0) { + if (!ssl->options.dtls) { + return ret; + } + else { + #ifdef WOLFSSL_DTLS + /* Check for duplicate CCS message in DTLS mode. + * DTLS allows for duplicate messages, and it should be + * skipped. Also skip if out of order. */ + if (ret != DUPLICATE_MSG_E && ret != OUT_OF_ORDER_E) + return ret; + + break; + #endif /* WOLFSSL_DTLS */ + } + } + ssl->keys.encryptionOn = 1; /* setup decrypt keys for following messages */ @@ -15387,7 +15608,6 @@ int ProcessReply(WOLFSSL* ssl) /* more records */ else { WOLFSSL_MSG("More records in input"); - ssl->options.processReply = doProcessInit; continue; } @@ -15441,7 +15661,7 @@ int SendChangeCipher(WOLFSSL* ssl) output = ssl->buffers.outputBuffer.buffer + ssl->buffers.outputBuffer.length; - AddRecordHeader(output, 1, change_cipher_spec, ssl); + AddRecordHeader(output, 1, change_cipher_spec, ssl, CUR_ORDER); output[idx] = 1; /* turn it on */ @@ -15450,19 +15670,26 @@ int SendChangeCipher(WOLFSSL* ssl) int inputSz = ENUM_LEN; input[0] = 1; /* turn it on */ + #ifdef WOLFSSL_DTLS + if (IsDtlsNotSctpMode(ssl) && + (ret = DtlsMsgPoolSave(ssl, input, inputSz, change_cipher_hs)) != 0) { + return ret; + } + #endif sendSz = BuildMessage(ssl, output, sendSz, input, inputSz, - change_cipher_spec, 0, 0, 0); + change_cipher_spec, 0, 0, 0, CUR_ORDER); if (sendSz < 0) { return sendSz; } } - #ifdef WOLFSSL_DTLS + else { if (IsDtlsNotSctpMode(ssl)) { DtlsSEQIncrement(ssl, CUR_ORDER); - if ((ret = DtlsMsgPoolSave(ssl, output, sendSz)) != 0) + if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, change_cipher_hs)) != 0) return ret; } + } #endif #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA) if (ssl->hsInfoOn) AddPacketName(ssl, "ChangeCipher"); @@ -15488,7 +15715,7 @@ int SendChangeCipher(WOLFSSL* ssl) #if !defined(NO_OLD_TLS) && !defined(WOLFSSL_AEAD_ONLY) static int SSL_hmac(WOLFSSL* ssl, byte* digest, const byte* in, word32 sz, - int padLen, int content, int verify) + int padLen, int content, int verify, int epochOrder) { byte result[WC_MAX_DIGEST_SIZE]; word32 digestSz = ssl->specs.hash_size; /* actual sizes */ @@ -15501,7 +15728,7 @@ static int SSL_hmac(WOLFSSL* ssl, byte* digest, const byte* in, word32 sz, /* data */ byte seq[SEQ_SZ]; byte conLen[ENUM_LEN + LENGTH_SZ]; /* content & length */ - const byte* macSecret = wolfSSL_GetMacSecret(ssl, verify); + const byte* macSecret = NULL; (void)padLen; @@ -15510,10 +15737,19 @@ static int SSL_hmac(WOLFSSL* ssl, byte* digest, const byte* in, word32 sz, ssl->fuzzerCb(ssl, in, sz, FUZZ_HMAC, ssl->fuzzerCtx); #endif +#ifdef WOLFSSL_DTLS + if (ssl->options.dtls) + macSecret = wolfSSL_GetDtlsMacSecret(ssl, verify, epochOrder); + else + macSecret = wolfSSL_GetMacSecret(ssl, verify); +#else + macSecret = wolfSSL_GetMacSecret(ssl, verify); +#endif + XMEMSET(seq, 0, SEQ_SZ); conLen[0] = (byte)content; c16toa((word16)sz, &conLen[ENUM_LEN]); - WriteSEQ(ssl, verify, seq); + WriteSEQ(ssl, epochOrder, seq); if (ssl->specs.mac_algorithm == md5_mac) { ret = wc_InitMd5_ex(&md5, ssl->heap, ssl->devId); @@ -15774,7 +16010,8 @@ static void FreeBuildMsgArgs(WOLFSSL* ssl, void* pArgs) /* Build SSL Message, encrypted */ int BuildMessage(WOLFSSL* ssl, byte* output, int outSz, const byte* input, - int inSz, int type, int hashOutput, int sizeOnly, int asyncOkay) + int inSz, int type, int hashOutput, int sizeOnly, int asyncOkay, + int epochOrder) { #ifndef WOLFSSL_NO_TLS12 int ret = 0; @@ -15793,6 +16030,8 @@ int BuildMessage(WOLFSSL* ssl, byte* output, int outSz, const byte* input, return BAD_FUNC_ARG; } + (void)epochOrder; + #ifdef WOLFSSL_NO_TLS12 return BuildTls13Message(ssl, output, outSz, input, inSz, type, hashOutput, sizeOnly, asyncOkay); @@ -15845,6 +16084,42 @@ int BuildMessage(WOLFSSL* ssl, byte* output, int outSz, const byte* input, WOLFSSL_MSG("BuildMessage w/sizeOnly doesn't need input/output"); ERROR_OUT(BAD_FUNC_ARG, exit_buildmsg); } + #if defined(WOLFSSL_DTLS) && defined(HAVE_SECURE_RENEGOTIATION) + if (ssl->options.dtls && ssl->secure_renegotiation && + ssl->secure_renegotiation->tmp_keys.dtls_epoch != 0) { + switch (epochOrder) { + case PREV_ORDER: + if (ssl->encrypt.src != KEYS) { + ssl->secure_renegotiation->cache_status = SCR_CACHE_NULL; + if ((ret = SetKeysSide(ssl, ENCRYPT_SIDE_ONLY)) != 0) + ERROR_OUT(ret, exit_buildmsg); + WOLFSSL_BUFFER(ssl->keys.client_write_key, MAX_SYM_KEY_SIZE); + } + break; + case CUR_ORDER: + if (ssl->keys.dtls_epoch == ssl->secure_renegotiation->tmp_keys.dtls_epoch) { + if (ssl->encrypt.src != SCR) { + ssl->secure_renegotiation->cache_status = SCR_CACHE_NEEDED; + if ((ret = SetKeysSide(ssl, ENCRYPT_SIDE_ONLY)) != 0) + ERROR_OUT(ret, exit_buildmsg); + WOLFSSL_BUFFER(ssl->secure_renegotiation->tmp_keys.client_write_key, MAX_SYM_KEY_SIZE); + } + } + else { + if (ssl->encrypt.src != KEYS) { + ssl->secure_renegotiation->cache_status = SCR_CACHE_NULL; + if ((ret = SetKeysSide(ssl, ENCRYPT_SIDE_ONLY)) != 0) + ERROR_OUT(ret, exit_buildmsg); + WOLFSSL_BUFFER(ssl->keys.client_write_key, MAX_SYM_KEY_SIZE); + } + } + break; + default: + WOLFSSL_MSG("BuildMessage only supports PREV_ORDER and CUR_ORDER"); + ERROR_OUT(BAD_FUNC_ARG, exit_buildmsg); + } + } + #endif ssl->options.buildMsgState = BUILD_MSG_SIZE; } @@ -15932,7 +16207,7 @@ int BuildMessage(WOLFSSL* ssl, byte* output, int outSz, const byte* input, #endif args->size = (word16)(args->sz - args->headerSz); /* include mac and digest */ - AddRecordHeader(output, args->size, (byte)type, ssl); + AddRecordHeader(output, args->size, (byte)type, ssl, epochOrder); /* write to output */ if (args->ivSz > 0) { @@ -16027,7 +16302,7 @@ int BuildMessage(WOLFSSL* ssl, byte* output, int outSz, const byte* input, ret = ssl->hmac(ssl, hmac, output + args->headerSz + args->ivSz, inSz, - -1, type, 0); + -1, type, 0, epochOrder); XMEMCPY(output + args->idx, hmac, args->digestSz); #ifdef WOLFSSL_SMALL_STACK @@ -16038,7 +16313,7 @@ int BuildMessage(WOLFSSL* ssl, byte* output, int outSz, const byte* input, #endif { ret = ssl->hmac(ssl, output + args->idx, output + - args->headerSz + args->ivSz, inSz, -1, type, 0); + args->headerSz + args->ivSz, inSz, -1, type, 0, epochOrder); } } #endif /* WOLFSSL_AEAD_ONLY */ @@ -16050,6 +16325,26 @@ int BuildMessage(WOLFSSL* ssl, byte* output, int outSz, const byte* input, FALL_THROUGH; case BUILD_MSG_ENCRYPT: { + #if defined(HAVE_SECURE_RENEGOTIATION) && defined(WOLFSSL_DTLS) + /* Modify CUR_ORDER sequence number for all encryption algos + * that use it for encryption parameters */ + word16 dtls_epoch; + word16 dtls_sequence_number_hi; + word32 dtls_sequence_number_lo; + int swap_seq = ssl->options.dtls && epochOrder == PREV_ORDER && + ssl->secure_renegotiation && + ssl->secure_renegotiation->tmp_keys.dtls_epoch != 0 && + ssl->secure_renegotiation->tmp_keys.dtls_epoch == + ssl->keys.dtls_epoch; + if (swap_seq) { + dtls_epoch = ssl->keys.dtls_epoch; + dtls_sequence_number_hi = ssl->keys.dtls_sequence_number_hi; + dtls_sequence_number_lo = ssl->keys.dtls_sequence_number_lo; + ssl->keys.dtls_epoch--; + ssl->keys.dtls_sequence_number_hi = ssl->keys.dtls_prev_sequence_number_hi; + ssl->keys.dtls_sequence_number_lo = ssl->keys.dtls_prev_sequence_number_lo; + } + #endif #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY) if (ssl->options.startedETMWrite) { ret = Encrypt(ssl, output + args->headerSz, @@ -16062,6 +16357,14 @@ int BuildMessage(WOLFSSL* ssl, byte* output, int outSz, const byte* input, ret = Encrypt(ssl, output + args->headerSz, output + args->headerSz, args->size, asyncOkay); } + #if defined(HAVE_SECURE_RENEGOTIATION) && defined(WOLFSSL_DTLS) + /* Restore sequence numbers */ + if (swap_seq) { + ssl->keys.dtls_epoch = dtls_epoch; + ssl->keys.dtls_sequence_number_hi = dtls_sequence_number_hi; + ssl->keys.dtls_sequence_number_lo = dtls_sequence_number_lo; + } + #endif if (ret != 0) goto exit_buildmsg; ssl->options.buildMsgState = BUILD_MSG_ENCRYPTED_VERIFY_MAC; @@ -16091,7 +16394,7 @@ int BuildMessage(WOLFSSL* ssl, byte* output, int outSz, const byte* input, ret = ssl->hmac(ssl, hmac, output + args->headerSz, args->ivSz + inSz + args->pad + 1, -1, type, - 0); + 0, epochOrder); XMEMCPY(output + args->idx + args->pad + 1, hmac, args->digestSz); @@ -16105,7 +16408,7 @@ int BuildMessage(WOLFSSL* ssl, byte* output, int outSz, const byte* input, ret = ssl->hmac(ssl, output + args->idx + args->pad + 1, output + args->headerSz, args->ivSz + inSz + args->pad + 1, -1, type, - 0); + 0, epochOrder); } } #endif /* HAVE_ENCRYPT_THEN_MAC && !WOLFSSL_AEAD_ONLY */ @@ -16127,7 +16430,7 @@ exit_buildmsg: #ifdef WOLFSSL_DTLS if (ret == 0 && ssl->options.dtls) - DtlsSEQIncrement(ssl, CUR_ORDER); + DtlsSEQIncrement(ssl, epochOrder); #endif /* return sz on success */ @@ -16212,13 +16515,13 @@ int SendFinished(WOLFSSL* ssl) #ifdef WOLFSSL_DTLS if (IsDtlsNotSctpMode(ssl)) { - if ((ret = DtlsMsgPoolSave(ssl, input, headerSz + finishedSz)) != 0) + if ((ret = DtlsMsgPoolSave(ssl, input, headerSz + finishedSz, finished)) != 0) return ret; } #endif sendSz = BuildMessage(ssl, output, outputSz, input, headerSz + finishedSz, - handshake, 1, 0, 0); + handshake, 1, 0, 0, CUR_ORDER); if (sendSz < 0) return BUILD_MSG_ERROR; @@ -16261,6 +16564,13 @@ int SendFinished(WOLFSSL* ssl) ret = SendBuffered(ssl); +#ifdef WOLFSSL_DTLS + if (ssl->options.side == WOLFSSL_SERVER_END) { + ssl->keys.dtls_handshake_number = 0; + ssl->keys.dtls_expected_peer_handshake_number = 0; + } +#endif + WOLFSSL_LEAVE("SendFinished", ret); WOLFSSL_END(WC_FUNC_FINISHED_SEND); @@ -16409,6 +16719,14 @@ int CreateOcspResponse(WOLFSSL* ssl, OcspRequest** ocspRequest, #ifndef NO_CERTS #if !defined(NO_WOLFSSL_SERVER) || !defined(WOLFSSL_NO_CLIENT_AUTH) +static int cipherExtraData(WOLFSSL* ssl) +{ + /* Cipher data that may be added by BuildMessage */ + return ssl->specs.hash_size + ssl->specs.block_size + + ssl->specs.aead_mac_size + ssl->specs.iv_size + + ssl->specs.pad_size; +} + /* handle generation of certificate (11) */ int SendCertificate(WOLFSSL* ssl) { @@ -16516,6 +16834,8 @@ int SendCertificate(WOLFSSL* ssl) #endif } + sendSz += cipherExtraData(ssl); + /* check for available size */ if ((ret = CheckAvailableSize(ssl, sendSz)) != 0) return ret; @@ -16534,10 +16854,9 @@ int SendCertificate(WOLFSSL* ssl) else { #ifdef WOLFSSL_DTLS AddHeaders(output, payloadSz, certificate, ssl); - if (!IsEncryptionOn(ssl, 1)) - HashOutputRaw(ssl, - output + RECORD_HEADER_SZ + DTLS_RECORD_EXTRA, - HANDSHAKE_HEADER_SZ + DTLS_HANDSHAKE_EXTRA); + HashOutputRaw(ssl, + output + RECORD_HEADER_SZ + DTLS_RECORD_EXTRA, + HANDSHAKE_HEADER_SZ + DTLS_HANDSHAKE_EXTRA); /* Adding the headers increments these, decrement them for * actual message header. */ ssl->keys.dtls_handshake_number--; @@ -16548,20 +16867,20 @@ int SendCertificate(WOLFSSL* ssl) /* list total */ c32to24(listSz, output + i); - if (!IsEncryptionOn(ssl, 1)) + if (ssl->options.dtls || !IsEncryptionOn(ssl, 1)) HashOutputRaw(ssl, output + i, CERT_HEADER_SZ); i += CERT_HEADER_SZ; length -= CERT_HEADER_SZ; fragSz -= CERT_HEADER_SZ; if (certSz) { c32to24(certSz, output + i); - if (!IsEncryptionOn(ssl, 1)) + if (ssl->options.dtls || !IsEncryptionOn(ssl, 1)) HashOutputRaw(ssl, output + i, CERT_HEADER_SZ); i += CERT_HEADER_SZ; length -= CERT_HEADER_SZ; fragSz -= CERT_HEADER_SZ; - if (!IsEncryptionOn(ssl, 1)) { + if (ssl->options.dtls || !IsEncryptionOn(ssl, 1)) { HashOutputRaw(ssl, ssl->buffers.certificate->buffer, certSz); if (certChainSz) HashOutputRaw(ssl, ssl->buffers.certChain->buffer, @@ -16571,7 +16890,7 @@ int SendCertificate(WOLFSSL* ssl) } else { if (!ssl->options.dtls) { - AddRecordHeader(output, fragSz, handshake, ssl); + AddRecordHeader(output, fragSz, handshake, ssl, CUR_ORDER); } else { #ifdef WOLFSSL_DTLS @@ -16604,7 +16923,12 @@ int SendCertificate(WOLFSSL* ssl) if (IsEncryptionOn(ssl, 1)) { byte* input = NULL; - int inputSz = i - RECORD_HEADER_SZ; /* build msg adds rec hdr */ + int inputSz = i; /* build msg adds rec hdr */ + int recordHeaderSz = RECORD_HEADER_SZ; + + if (ssl->options.dtls) + recordHeaderSz += DTLS_RECORD_EXTRA; + inputSz -= recordHeaderSz; if (inputSz < 0) { WOLFSSL_MSG("Send Cert bad inputSz"); @@ -16616,32 +16940,44 @@ int SendCertificate(WOLFSSL* ssl) DYNAMIC_TYPE_IN_BUFFER); if (input == NULL) return MEMORY_E; - XMEMCPY(input, output + RECORD_HEADER_SZ, inputSz); + XMEMCPY(input, output + recordHeaderSz, inputSz); } +#ifndef WOLFSSL_DTLS sendSz = BuildMessage(ssl, output, sendSz, input, inputSz, - handshake, 1, 0, 0); + handshake, 1, 0, 0, CUR_ORDER); +#else + if (!ssl->options.dtls) + sendSz = BuildMessage(ssl, output, sendSz, input, inputSz, + handshake, 1, 0, 0, CUR_ORDER); + else /* DTLS 1.2 has to ignore fragmentation in hashing so we need to + * calculate the hash ourselves above */ { + if ((ret = DtlsMsgPoolSave(ssl, input, inputSz, certificate)) != 0) { + XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER); + return ret; + } + sendSz = BuildMessage(ssl, output, sendSz, input, inputSz, + handshake, 0, 0, 0, CUR_ORDER); + } +#endif - if (inputSz > 0) - XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER); + XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER); if (sendSz < 0) return sendSz; } else { + sendSz = i; #ifdef WOLFSSL_DTLS + if (IsDtlsNotSctpMode(ssl)) { + if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, certificate)) != 0) + return ret; + } if (ssl->options.dtls) DtlsSEQIncrement(ssl, CUR_ORDER); #endif } - #ifdef WOLFSSL_DTLS - if (IsDtlsNotSctpMode(ssl)) { - if ((ret = DtlsMsgPoolSave(ssl, output, sendSz)) != 0) - return ret; - } - #endif - #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA) if (ssl->hsInfoOn) AddPacketName(ssl, "Certificate"); @@ -16724,6 +17060,9 @@ int SendCertificateRequest(WOLFSSL* ssl) i += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA; #endif } + + sendSz += cipherExtraData(ssl); + /* check for available size */ if ((ret = CheckAvailableSize(ssl, sendSz)) != 0) return ret; @@ -16778,25 +17117,38 @@ int SendCertificateRequest(WOLFSSL* ssl) if (IsEncryptionOn(ssl, 1)) { byte* input; - int inputSz = i - RECORD_HEADER_SZ; /* build msg adds rec hdr */ + int inputSz = i; /* build msg adds rec hdr */ + int recordHeaderSz = RECORD_HEADER_SZ; + + if (ssl->options.dtls) + recordHeaderSz += DTLS_RECORD_EXTRA; + inputSz -= recordHeaderSz; input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER); if (input == NULL) return MEMORY_E; - XMEMCPY(input, output + RECORD_HEADER_SZ, inputSz); + XMEMCPY(input, output + recordHeaderSz, inputSz); + #ifdef WOLFSSL_DTLS + if (IsDtlsNotSctpMode(ssl) && + (ret = DtlsMsgPoolSave(ssl, input, inputSz, certificate_request)) != 0) { + XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER); + return ret; + } + #endif sendSz = BuildMessage(ssl, output, sendSz, input, inputSz, - handshake, 1, 0, 0); + handshake, 1, 0, 0, CUR_ORDER); XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER); if (sendSz < 0) return sendSz; } else { + sendSz = i; #ifdef WOLFSSL_DTLS if (ssl->options.dtls) DtlsSEQIncrement(ssl, CUR_ORDER); if (IsDtlsNotSctpMode(ssl)) { - if ((ret = DtlsMsgPoolSave(ssl, output, sendSz)) != 0) + if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, certificate_request)) != 0) return ret; } #endif @@ -16881,15 +17233,19 @@ static int BuildCertificateStatus(WOLFSSL* ssl, byte type, buffer* status, if (IsEncryptionOn(ssl, 1)) { byte* input; - int inputSz = idx - RECORD_HEADER_SZ; + int inputSz = idx; /* build msg adds rec hdr */ + int recordHeaderSz = RECORD_HEADER_SZ; + if (ssl->options.dtls) + recordHeaderSz += DTLS_RECORD_EXTRA; + inputSz -= recordHeaderSz; input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER); if (input == NULL) return MEMORY_E; - XMEMCPY(input, output + RECORD_HEADER_SZ, inputSz); + XMEMCPY(input, output + recordHeaderSz, inputSz); sendSz = BuildMessage(ssl, output, sendSz, input, inputSz, - handshake, 1, 0, 0); + handshake, 1, 0, 0, CUR_ORDER); XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER); if (sendSz < 0) @@ -16905,7 +17261,7 @@ static int BuildCertificateStatus(WOLFSSL* ssl, byte type, buffer* status, #ifdef WOLFSSL_DTLS if (ret == 0 && IsDtlsNotSctpMode(ssl)) - ret = DtlsMsgPoolSave(ssl, output, sendSz); + ret = DtlsMsgPoolSave(ssl, output, sendSz, certificate_status); #endif #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA) @@ -17253,12 +17609,12 @@ int SendData(WOLFSSL* ssl, const void* data, int sz) #endif if (!ssl->options.tls1_3) { sendSz = BuildMessage(ssl, out, outputSz, sendBuffer, buffSz, - application_data, 0, 0, 1); + application_data, 0, 0, 1, CUR_ORDER); } else { #ifdef WOLFSSL_TLS13 sendSz = BuildTls13Message(ssl, out, outputSz, sendBuffer, buffSz, - application_data, 0, 0, 1); + application_data, 0, 0, 1, CUR_ORDER); #else sendSz = BUFFER_ERROR; #endif @@ -17483,11 +17839,11 @@ int SendAlert(WOLFSSL* ssl, int severity, int type) */ if (IsEncryptionOn(ssl, 1)) { sendSz = BuildMessage(ssl, output, outputSz, input, ALERT_SIZE, alert, - 0, 0, 0); + 0, 0, 0, CUR_ORDER); } else { - AddRecordHeader(output, ALERT_SIZE, alert, ssl); + AddRecordHeader(output, ALERT_SIZE, alert, ssl, CUR_ORDER); output += RECORD_HEADER_SZ; #ifdef WOLFSSL_DTLS if (ssl->options.dtls) @@ -19719,15 +20075,26 @@ exit_dpk: if (IsEncryptionOn(ssl, 1)) { byte* input; - int inputSz = idx - RECORD_HEADER_SZ; /* build msg adds rec hdr */ + int inputSz = idx; /* build msg adds rec hdr */ + int recordHeaderSz = RECORD_HEADER_SZ; + if (ssl->options.dtls) + recordHeaderSz += DTLS_RECORD_EXTRA; + inputSz -= recordHeaderSz; input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER); if (input == NULL) return MEMORY_E; - XMEMCPY(input, output + RECORD_HEADER_SZ, inputSz); + XMEMCPY(input, output + recordHeaderSz, inputSz); + #ifdef WOLFSSL_DTLS + if (IsDtlsNotSctpMode(ssl) && + (ret = DtlsMsgPoolSave(ssl, input, inputSz, client_hello)) != 0) { + XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER); + return ret; + } + #endif sendSz = BuildMessage(ssl, output, sendSz, input, inputSz, - handshake, 1, 0, 0); + handshake, 1, 0, 0, CUR_ORDER); XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER); if (sendSz < 0) @@ -19735,7 +20102,7 @@ exit_dpk: } else { #ifdef WOLFSSL_DTLS if (IsDtlsNotSctpMode(ssl)) { - if ((ret = DtlsMsgPoolSave(ssl, output, sendSz)) != 0) + if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, client_hello)) != 0) return ret; } if (ssl->options.dtls) @@ -20254,12 +20621,6 @@ exit_dpk: ssl->options.resuming = 0; /* server denied resumption try */ } } - #ifdef WOLFSSL_DTLS - if (ssl->options.dtls) { - DtlsMsgPoolReset(ssl); - } - #endif - return SetCipherSpecs(ssl); } @@ -23265,14 +23626,18 @@ int SendClientKeyExchange(WOLFSSL* ssl) idx += args->encSz; if (IsEncryptionOn(ssl, 1)) { - args->inputSz = idx - RECORD_HEADER_SZ; /* buildmsg adds rechdr */ + int recordHeaderSz = RECORD_HEADER_SZ; + + if (ssl->options.dtls) + recordHeaderSz += DTLS_RECORD_EXTRA; + args->inputSz = idx - recordHeaderSz; /* buildmsg adds rechdr */ args->input = (byte*)XMALLOC(args->inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER); if (args->input == NULL) { ERROR_OUT(MEMORY_E, exit_scke); } - XMEMCPY(args->input, args->output + RECORD_HEADER_SZ, + XMEMCPY(args->input, args->output + recordHeaderSz, args->inputSz); } @@ -23284,8 +23649,14 @@ int SendClientKeyExchange(WOLFSSL* ssl) case TLS_ASYNC_END: { if (IsEncryptionOn(ssl, 1)) { + #ifdef WOLFSSL_DTLS + if (IsDtlsNotSctpMode(ssl) && + (ret = DtlsMsgPoolSave(ssl, args->input, args->inputSz, client_key_exchange)) != 0) { + goto exit_scke; + } + #endif ret = BuildMessage(ssl, args->output, args->sendSz, - args->input, args->inputSz, handshake, 1, 0, 0); + args->input, args->inputSz, handshake, 1, 0, 0, CUR_ORDER); XFREE(args->input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER); args->input = NULL; /* make sure its not double free'd on cleanup */ @@ -23296,6 +23667,11 @@ int SendClientKeyExchange(WOLFSSL* ssl) } else { #ifdef WOLFSSL_DTLS + if (IsDtlsNotSctpMode(ssl)) { + if ((ret = DtlsMsgPoolSave(ssl, args->output, args->sendSz, client_key_exchange)) != 0) { + goto exit_scke; + } + } if (ssl->options.dtls) DtlsSEQIncrement(ssl, CUR_ORDER); #endif @@ -23306,14 +23682,6 @@ int SendClientKeyExchange(WOLFSSL* ssl) goto exit_scke; } - #ifdef WOLFSSL_DTLS - if (IsDtlsNotSctpMode(ssl)) { - if ((ret = DtlsMsgPoolSave(ssl, args->output, args->sendSz)) != 0) { - goto exit_scke; - } - } - #endif - #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA) if (ssl->hsInfoOn) AddPacketName(ssl, "ClientKeyExchange"); @@ -23802,7 +24170,11 @@ int SendCertificateVerify(WOLFSSL* ssl) #endif if (IsEncryptionOn(ssl, 1)) { - args->inputSz = args->sendSz - RECORD_HEADER_SZ; + int recordHeaderSz = RECORD_HEADER_SZ; + + if (ssl->options.dtls) + recordHeaderSz += DTLS_RECORD_EXTRA; + args->inputSz = args->sendSz - recordHeaderSz; /* build msg adds rec hdr */ args->input = (byte*)XMALLOC(args->inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER); @@ -23810,7 +24182,7 @@ int SendCertificateVerify(WOLFSSL* ssl) ERROR_OUT(MEMORY_E, exit_scv); } - XMEMCPY(args->input, args->output + RECORD_HEADER_SZ, + XMEMCPY(args->input, args->output + recordHeaderSz, args->inputSz); } @@ -23822,10 +24194,16 @@ int SendCertificateVerify(WOLFSSL* ssl) case TLS_ASYNC_END: { if (IsEncryptionOn(ssl, 1)) { + #ifdef WOLFSSL_DTLS + if (IsDtlsNotSctpMode(ssl) && + (ret = DtlsMsgPoolSave(ssl, args->input, args->inputSz, certificate_verify)) != 0) { + goto exit_scv; + } + #endif ret = BuildMessage(ssl, args->output, MAX_CERT_VERIFY_SZ + MAX_MSG_EXTRA, args->input, args->inputSz, handshake, - 1, 0, 1); + 1, 0, 1, CUR_ORDER); #ifdef WOLFSSL_ASYNC_CRYPT if (ret == WC_PENDING_E) goto exit_scv; @@ -23841,6 +24219,9 @@ int SendCertificateVerify(WOLFSSL* ssl) } else { #ifdef WOLFSSL_DTLS + if (IsDtlsNotSctpMode(ssl)) { + ret = DtlsMsgPoolSave(ssl, args->output, args->sendSz, certificate_verify); + } if (ssl->options.dtls) DtlsSEQIncrement(ssl, CUR_ORDER); #endif @@ -23851,13 +24232,6 @@ int SendCertificateVerify(WOLFSSL* ssl) goto exit_scv; } - #ifdef WOLFSSL_DTLS - if (IsDtlsNotSctpMode(ssl)) { - ret = DtlsMsgPoolSave(ssl, args->output, args->sendSz); - } - #endif - - #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA) if (ssl->hsInfoOn) AddPacketName(ssl, "CertificateVerify"); @@ -24277,21 +24651,36 @@ static int DoSessionTicket(WOLFSSL* ssl, const byte* input, word32* inOutIdx, if (IsEncryptionOn(ssl, 1)) { byte* input; - int inputSz = idx - RECORD_HEADER_SZ; /* build msg adds rec hdr */ + int inputSz = idx; /* build msg adds rec hdr */ + int recordHeaderSz = RECORD_HEADER_SZ; + if (ssl->options.dtls) + recordHeaderSz += DTLS_RECORD_EXTRA; + inputSz -= recordHeaderSz; input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER); if (input == NULL) return MEMORY_E; - XMEMCPY(input, output + RECORD_HEADER_SZ, inputSz); + XMEMCPY(input, output + recordHeaderSz, inputSz); + #ifdef WOLFSSL_DTLS + if (IsDtlsNotSctpMode(ssl) && + (ret = DtlsMsgPoolSave(ssl, input, inputSz, server_hello)) != 0) { + XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER); + return ret; + } + #endif sendSz = BuildMessage(ssl, output, sendSz, input, inputSz, - handshake, 1, 0, 0); + handshake, 1, 0, 0, CUR_ORDER); XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER); if (sendSz < 0) return sendSz; } else { #ifdef WOLFSSL_DTLS + if (IsDtlsNotSctpMode(ssl)) { + if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, server_hello)) != 0) + return ret; + } if (ssl->options.dtls) DtlsSEQIncrement(ssl, CUR_ORDER); #endif @@ -24311,13 +24700,6 @@ static int DoSessionTicket(WOLFSSL* ssl, const byte* input, word32* inOutIdx, ssl->options.serverState = SERVER_HELLO_COMPLETE; ssl->buffers.outputBuffer.length += sendSz; - #ifdef WOLFSSL_DTLS - if (IsDtlsNotSctpMode(ssl)) { - if ((ret = DtlsMsgPoolSave(ssl, output, sendSz)) != 0) - return ret; - } - #endif - if (ssl->options.groupMessages) ret = 0; else @@ -25830,7 +26212,8 @@ static int DoSessionTicket(WOLFSSL* ssl, const byte* input, word32* inOutIdx, if (IsEncryptionOn(ssl, 1)) { args->inputSz = args->length + HANDSHAKE_HEADER_SZ; - /* buildmsg adds rechdr */ + if (ssl->options.dtls) + args->inputSz += DTLS_HANDSHAKE_EXTRA; args->input = (byte*)XMALLOC(args->inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER); if (args->input == NULL) { @@ -25841,10 +26224,22 @@ static int DoSessionTicket(WOLFSSL* ssl, const byte* input, word32* inOutIdx, ERROR_OUT(BUFFER_ERROR, exit_sske); } - XMEMCPY(args->input, args->output + RECORD_HEADER_SZ, + if (!ssl->options.dtls) + XMEMCPY(args->input, args->output + RECORD_HEADER_SZ, args->inputSz); + else + XMEMCPY(args->input, args->output + DTLS_RECORD_HEADER_SZ, + args->inputSz); + + #ifdef WOLFSSL_DTLS + if (IsDtlsNotSctpMode(ssl) && + (ret = DtlsMsgPoolSave(ssl, args->input, args->inputSz, server_key_exchange)) + != 0) { + goto exit_sske; + } + #endif ret = BuildMessage(ssl, args->output, args->sendSz, - args->input, args->inputSz, handshake, 1, 0, 0); + args->input, args->inputSz, handshake, 1, 0, 0, CUR_ORDER); XFREE(args->input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER); args->input = NULL; /* make sure its not double free'd on cleanup */ @@ -25858,7 +26253,7 @@ static int DoSessionTicket(WOLFSSL* ssl, const byte* input, word32* inOutIdx, #ifdef WOLFSSL_DTLS if (IsDtlsNotSctpMode(ssl)) { if ((ret = DtlsMsgPoolSave(ssl, - args->output, args->sendSz)) != 0) { + args->output, args->sendSz, server_key_exchange)) != 0) { goto exit_sske; } } @@ -26490,7 +26885,7 @@ static int DoSessionTicket(WOLFSSL* ssl, const byte* input, word32* inOutIdx, XMEMCPY(&pv, input + i, OPAQUE16_LEN); ssl->chVersion = pv; /* store */ #ifdef WOLFSSL_DTLS - if (IsDtlsNotSctpMode(ssl)) { + if (IsDtlsNotSctpMode(ssl) && !IsInitialRenegotiationState(ssl)) { #if defined(NO_SHA) && defined(NO_SHA256) #error "DTLS needs either SHA or SHA-256" #endif /* NO_SHA && NO_SHA256 */ @@ -26640,7 +27035,7 @@ static int DoSessionTicket(WOLFSSL* ssl, const byte* input, word32* inOutIdx, /* random */ XMEMCPY(ssl->arrays->clientRandom, input + i, RAN_LEN); #ifdef WOLFSSL_DTLS - if (IsDtlsNotSctpMode(ssl)) { + if (IsDtlsNotSctpMode(ssl) && !IsInitialRenegotiationState(ssl)) { ret = wc_HmacUpdate(&cookieHmac, input + i, RAN_LEN); if (ret != 0) return ret; } @@ -26673,7 +27068,7 @@ static int DoSessionTicket(WOLFSSL* ssl, const byte* input, word32* inOutIdx, XMEMCPY(ssl->arrays->sessionID, input + i, b); #ifdef WOLFSSL_DTLS - if (IsDtlsNotSctpMode(ssl)) { + if (IsDtlsNotSctpMode(ssl) && !IsInitialRenegotiationState(ssl)) { ret = wc_HmacUpdate(&cookieHmac, input + i - 1, b + 1); if (ret != 0) return ret; } @@ -26758,7 +27153,7 @@ static int DoSessionTicket(WOLFSSL* ssl, const byte* input, word32* inOutIdx, #endif #ifdef WOLFSSL_DTLS - if (IsDtlsNotSctpMode(ssl)) { + if (IsDtlsNotSctpMode(ssl) && !IsInitialRenegotiationState(ssl)) { ret = wc_HmacUpdate(&cookieHmac, input + i - OPAQUE16_LEN, clSuites.suiteSz + OPAQUE16_LEN); @@ -26784,33 +27179,35 @@ static int DoSessionTicket(WOLFSSL* ssl, const byte* input, word32* inOutIdx, #ifdef WOLFSSL_DTLS if (IsDtlsNotSctpMode(ssl)) { - byte newCookie[MAX_COOKIE_LEN]; + if (!IsInitialRenegotiationState(ssl)) { + byte newCookie[MAX_COOKIE_LEN]; - ret = wc_HmacUpdate(&cookieHmac, input + i - 1, b + 1); - if (ret != 0) return ret; - ret = wc_HmacFinal(&cookieHmac, newCookie); - if (ret != 0) return ret; + ret = wc_HmacUpdate(&cookieHmac, input + i - 1, b + 1); + if (ret != 0) return ret; + ret = wc_HmacFinal(&cookieHmac, newCookie); + if (ret != 0) return ret; - /* If a cookie callback is set, call it to overwrite the cookie. - * This should be deprecated. The code now calculates the cookie - * using an HMAC as expected. */ - if (ssl->ctx->CBIOCookie != NULL && - ssl->ctx->CBIOCookie(ssl, newCookie, cookieSz, - ssl->IOCB_CookieCtx) != cookieSz) { - return COOKIE_ERROR; - } + /* If a cookie callback is set, call it to overwrite the cookie. + * This should be deprecated. The code now calculates the cookie + * using an HMAC as expected. */ + if (ssl->ctx->CBIOCookie != NULL && + ssl->ctx->CBIOCookie(ssl, newCookie, cookieSz, + ssl->IOCB_CookieCtx) != cookieSz) { + return COOKIE_ERROR; + } - /* Check the cookie, see if we progress the state machine. */ - if (peerCookieSz != cookieSz || - XMEMCMP(peerCookie, newCookie, cookieSz) != 0) { + /* Check the cookie, see if we progress the state machine. */ + if (peerCookieSz != cookieSz || + XMEMCMP(peerCookie, newCookie, cookieSz) != 0) { - /* Send newCookie to client in a HelloVerifyRequest message - * and let the state machine alone. */ - ssl->msgsReceived.got_client_hello = 0; - ssl->keys.dtls_handshake_number = 0; - ssl->keys.dtls_expected_peer_handshake_number = 0; - *inOutIdx += helloSz; - return SendHelloVerifyRequest(ssl, newCookie, cookieSz); + /* Send newCookie to client in a HelloVerifyRequest message + * and let the state machine alone. */ + ssl->msgsReceived.got_client_hello = 0; + ssl->keys.dtls_handshake_number = 0; + ssl->keys.dtls_expected_peer_handshake_number = 0; + *inOutIdx += helloSz; + return SendHelloVerifyRequest(ssl, newCookie, cookieSz); + } } /* This was skipped in the DTLS case so we could handle the hello @@ -27004,6 +27401,10 @@ static int DoSessionTicket(WOLFSSL* ssl, const byte* input, word32* inOutIdx, IsEncryptionOn(ssl, 0)) { ssl->secure_renegotiation->startScr = 1; } +#endif +#ifdef WOLFSSL_DTLS + if (ret == 0 && ssl->options.dtls) + DtlsMsgPoolReset(ssl); #endif WOLFSSL_LEAVE("DoClientHello", ret); WOLFSSL_END(WC_FUNC_CLIENT_HELLO_DO); @@ -27454,14 +27855,27 @@ static int DoSessionTicket(WOLFSSL* ssl, const byte* input, word32* inOutIdx, if (IsEncryptionOn(ssl, 1)) { byte* input; int inputSz = HANDSHAKE_HEADER_SZ; /* build msg adds rec hdr */ + int recordHeaderSz = RECORD_HEADER_SZ; + + if (ssl->options.dtls) { + recordHeaderSz += DTLS_RECORD_EXTRA; + inputSz += DTLS_HANDSHAKE_EXTRA; + } input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER); if (input == NULL) return MEMORY_E; - XMEMCPY(input, output + RECORD_HEADER_SZ, inputSz); + XMEMCPY(input, output + recordHeaderSz, inputSz); + #ifdef WOLFSSL_DTLS + if (IsDtlsNotSctpMode(ssl) && + (ret = DtlsMsgPoolSave(ssl, input, inputSz, server_hello_done)) != 0) { + XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER); + return ret; + } + #endif sendSz = BuildMessage(ssl, output, sendSz, input, inputSz, - handshake, 1, 0, 0); + handshake, 1, 0, 0, CUR_ORDER); XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER); if (sendSz < 0) @@ -27469,7 +27883,7 @@ static int DoSessionTicket(WOLFSSL* ssl, const byte* input, word32* inOutIdx, } else { #ifdef WOLFSSL_DTLS if (IsDtlsNotSctpMode(ssl)) { - if ((ret = DtlsMsgPoolSave(ssl, output, sendSz)) != 0) + if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, server_hello_done)) != 0) return ret; } if (ssl->options.dtls) @@ -27791,15 +28205,19 @@ static int DoSessionTicket(WOLFSSL* ssl, const byte* input, word32* inOutIdx, if (IsEncryptionOn(ssl, 1) && ssl->options.handShakeDone) { byte* input; - int inputSz = idx - RECORD_HEADER_SZ; /* build msg adds rec hdr */ + int inputSz = idx; /* build msg adds rec hdr */ + int recordHeaderSz = RECORD_HEADER_SZ; + if (ssl->options.dtls) + recordHeaderSz += DTLS_RECORD_EXTRA; + inputSz -= recordHeaderSz; input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER); if (input == NULL) return MEMORY_E; - XMEMCPY(input, output + RECORD_HEADER_SZ, inputSz); + XMEMCPY(input, output + recordHeaderSz, inputSz); sendSz = BuildMessage(ssl, output, sendSz, input, inputSz, - handshake, 1, 0, 0); + handshake, 1, 0, 0, CUR_ORDER); XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER); if (sendSz < 0) @@ -27808,7 +28226,7 @@ static int DoSessionTicket(WOLFSSL* ssl, const byte* input, word32* inOutIdx, else { #ifdef WOLFSSL_DTLS if (ssl->options.dtls) { - if ((ret = DtlsMsgPoolSave(ssl, output, sendSz)) != 0) + if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, session_ticket)) != 0) return ret; DtlsSEQIncrement(ssl, CUR_ORDER); @@ -27850,6 +28268,9 @@ static int DoSessionTicket(WOLFSSL* ssl, const byte* input, word32* inOutIdx, if (IsEncryptionOn(ssl, 1)) sendSz += MAX_MSG_EXTRA; + if (ssl->options.dtls) + sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA; + /* check for available size */ if ((ret = CheckAvailableSize(ssl, sendSz)) != 0) return ret; @@ -27863,14 +28284,20 @@ static int DoSessionTicket(WOLFSSL* ssl, const byte* input, word32* inOutIdx, if (IsEncryptionOn(ssl, 1)) { byte* input; int inputSz = HANDSHAKE_HEADER_SZ; /* build msg adds rec hdr */ + int recordHeaderSz = RECORD_HEADER_SZ; + + if (ssl->options.dtls) { + recordHeaderSz += DTLS_RECORD_EXTRA; + inputSz += DTLS_HANDSHAKE_EXTRA; + } input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER); if (input == NULL) return MEMORY_E; - XMEMCPY(input, output + RECORD_HEADER_SZ, inputSz); + XMEMCPY(input, output + recordHeaderSz, inputSz); sendSz = BuildMessage(ssl, output, sendSz, input, inputSz, - handshake, 0, 0, 0); + handshake, 0, 0, 0, CUR_ORDER); XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER); if (sendSz < 0) @@ -27900,6 +28327,11 @@ static int DoSessionTicket(WOLFSSL* ssl, const byte* input, word32* inOutIdx, int sendSz = length + idx; int ret; + /* are we in scr */ + if (IsEncryptionOn(ssl, 1)) { + sendSz += MAX_MSG_EXTRA; + } + /* check for available size */ if ((ret = CheckAvailableSize(ssl, sendSz)) != 0) return ret; @@ -27936,6 +28368,30 @@ static int DoSessionTicket(WOLFSSL* ssl, const byte* input, word32* inOutIdx, sendSz, WRITE_PROTO, ssl->heap); #endif + /* are we in scr */ + if (IsEncryptionOn(ssl, 1)) { + byte* input; + int inputSz = HANDSHAKE_HEADER_SZ + length; /* build msg adds rec hdr */ + int recordHeaderSz = RECORD_HEADER_SZ; + + if (ssl->options.dtls) { + recordHeaderSz += DTLS_RECORD_EXTRA; + inputSz += DTLS_HANDSHAKE_EXTRA; + } + + input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER); + if (input == NULL) + return MEMORY_E; + + XMEMCPY(input, output + recordHeaderSz, inputSz); + sendSz = BuildMessage(ssl, output, sendSz, input, inputSz, + handshake, 0, 0, 0, CUR_ORDER); + XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER); + + if (sendSz < 0) + return sendSz; + } + ssl->buffers.outputBuffer.length += sendSz; return SendBuffered(ssl); diff --git a/src/keys.c b/src/keys.c index ca6dd4de3..b620dc96d 100644 --- a/src/keys.c +++ b/src/keys.c @@ -3066,7 +3066,11 @@ int SetKeysSide(WOLFSSL* ssl, enum encrypt_side side) #ifdef HAVE_SECURE_RENEGOTIATION if (ssl->secure_renegotiation && ssl->secure_renegotiation->cache_status) { keys = &ssl->secure_renegotiation->tmp_keys; - copy = 1; +#ifdef WOLFSSL_DTLS + /* For DTLS, copy is done in StoreKeys */ + if (!ssl->options.dtls) +#endif + copy = 1; } #endif /* HAVE_SECURE_RENEGOTIATION */ @@ -3141,6 +3145,15 @@ int SetKeysSide(WOLFSSL* ssl, enum encrypt_side side) ssl->heap, ssl->devId, ssl->rng, ssl->options.tls1_3); #ifdef HAVE_SECURE_RENEGOTIATION +#ifdef WOLFSSL_DTLS + if (ret == 0 && ssl->options.dtls) { + if (wc_encrypt) + wc_encrypt->src = keys == &ssl->keys ? KEYS : SCR; + if (wc_decrypt) + wc_decrypt->src = keys == &ssl->keys ? KEYS : SCR; + } +#endif + if (copy) { int clientCopy = 0; @@ -3217,11 +3230,25 @@ int StoreKeys(WOLFSSL* ssl, const byte* keyData, int side) { int sz, i = 0; Keys* keys = &ssl->keys; +#ifdef WOLFSSL_DTLS + /* In case of DTLS, ssl->keys is updated here */ + int scr_copy = 0; +#endif #ifdef HAVE_SECURE_RENEGOTIATION - if (ssl->secure_renegotiation && ssl->secure_renegotiation->cache_status == - SCR_CACHE_NEEDED) { + if (ssl->options.dtls && + ssl->secure_renegotiation && + ssl->secure_renegotiation->cache_status == SCR_CACHE_NEEDED) { keys = &ssl->secure_renegotiation->tmp_keys; +#ifdef WOLFSSL_DTLS + /* epoch is incremented after StoreKeys call */ + ssl->secure_renegotiation->tmp_keys.dtls_epoch = ssl->keys.dtls_epoch + 1; + /* we only need to copy keys on second and future renegotiations */ + if (ssl->keys.dtls_epoch > 1) + scr_copy = 1; + ssl->encrypt.src = KEYS_NOT_SET; + ssl->decrypt.src = KEYS_NOT_SET; +#endif CacheStatusPP(ssl->secure_renegotiation); } #endif /* HAVE_SECURE_RENEGOTIATION */ @@ -3232,23 +3259,54 @@ int StoreKeys(WOLFSSL* ssl, const byte* keyData, int side) if (ssl->specs.cipher_type != aead) { sz = ssl->specs.hash_size; #ifndef WOLFSSL_AEAD_ONLY + + #ifdef WOLFSSL_DTLS + if (scr_copy) { + XMEMCPY(ssl->keys.client_write_MAC_secret, + keys->client_write_MAC_secret, sz); + XMEMCPY(ssl->keys.server_write_MAC_secret, + keys->server_write_MAC_secret, sz); + } + #endif XMEMCPY(keys->client_write_MAC_secret,&keyData[i], sz); XMEMCPY(keys->server_write_MAC_secret,&keyData[i], sz); #endif i += sz; } sz = ssl->specs.key_size; + #ifdef WOLFSSL_DTLS + if (scr_copy) { + XMEMCPY(ssl->keys.client_write_key, + keys->client_write_key, sz); + XMEMCPY(ssl->keys.server_write_key, + keys->server_write_key, sz); + } + #endif XMEMCPY(keys->client_write_key, &keyData[i], sz); XMEMCPY(keys->server_write_key, &keyData[i], sz); i += sz; sz = ssl->specs.iv_size; + #ifdef WOLFSSL_DTLS + if (scr_copy) { + XMEMCPY(ssl->keys.client_write_IV, + keys->client_write_IV, sz); + XMEMCPY(ssl->keys.server_write_IV, + keys->server_write_IV, sz); + } + #endif XMEMCPY(keys->client_write_IV, &keyData[i], sz); XMEMCPY(keys->server_write_IV, &keyData[i], sz); #ifdef HAVE_AEAD if (ssl->specs.cipher_type == aead) { /* Initialize the AES-GCM/CCM explicit IV to a zero. */ + #ifdef WOLFSSL_DTLS + if (scr_copy) { + XMEMCPY(ssl->keys.aead_exp_IV, + keys->aead_exp_IV, AEAD_MAX_EXP_SZ); + } + #endif XMEMSET(keys->aead_exp_IV, 0, AEAD_MAX_EXP_SZ); } #endif /* HAVE_AEAD */ @@ -3261,12 +3319,22 @@ int StoreKeys(WOLFSSL* ssl, const byte* keyData, int side) sz = ssl->specs.hash_size; if (side & PROVISION_CLIENT) { #ifndef WOLFSSL_AEAD_ONLY + #ifdef WOLFSSL_DTLS + if (scr_copy) + XMEMCPY(ssl->keys.client_write_MAC_secret, + keys->client_write_MAC_secret, sz); + #endif XMEMCPY(keys->client_write_MAC_secret,&keyData[i], sz); #endif i += sz; } if (side & PROVISION_SERVER) { #ifndef WOLFSSL_AEAD_ONLY + #ifdef WOLFSSL_DTLS + if (scr_copy) + XMEMCPY(ssl->keys.server_write_MAC_secret, + keys->server_write_MAC_secret, sz); + #endif XMEMCPY(keys->server_write_MAC_secret,&keyData[i], sz); #endif i += sz; @@ -3274,25 +3342,51 @@ int StoreKeys(WOLFSSL* ssl, const byte* keyData, int side) } sz = ssl->specs.key_size; if (side & PROVISION_CLIENT) { + #ifdef WOLFSSL_DTLS + if (scr_copy) + XMEMCPY(ssl->keys.client_write_key, + keys->client_write_key, sz); + #endif XMEMCPY(keys->client_write_key, &keyData[i], sz); i += sz; } if (side & PROVISION_SERVER) { + #ifdef WOLFSSL_DTLS + if (scr_copy) + XMEMCPY(ssl->keys.server_write_key, + keys->server_write_key, sz); + #endif XMEMCPY(keys->server_write_key, &keyData[i], sz); i += sz; } sz = ssl->specs.iv_size; if (side & PROVISION_CLIENT) { + #ifdef WOLFSSL_DTLS + if (scr_copy) + XMEMCPY(ssl->keys.client_write_IV, + keys->client_write_IV, sz); + #endif XMEMCPY(keys->client_write_IV, &keyData[i], sz); i += sz; } - if (side & PROVISION_SERVER) + if (side & PROVISION_SERVER) { + #ifdef WOLFSSL_DTLS + if (scr_copy) + XMEMCPY(ssl->keys.server_write_IV, + keys->server_write_IV, sz); + #endif XMEMCPY(keys->server_write_IV, &keyData[i], sz); + } #ifdef HAVE_AEAD if (ssl->specs.cipher_type == aead) { /* Initialize the AES-GCM/CCM explicit IV to a zero. */ + #ifdef WOLFSSL_DTLS + if (scr_copy) + XMEMCPY(ssl->keys.aead_exp_IV, + keys->aead_exp_IV, AEAD_MAX_EXP_SZ); + #endif XMEMSET(keys->aead_exp_IV, 0, AEAD_MAX_EXP_SZ); } #endif diff --git a/src/ssl.c b/src/ssl.c index 145be730a..b22c6efee 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -1647,7 +1647,7 @@ int wolfSSL_GetOutputSize(WOLFSSL* ssl, int inSz) if (inSz > maxSize) return INPUT_SIZE_E; - return BuildMessage(ssl, NULL, 0, NULL, inSz, application_data, 0, 1, 0); + return BuildMessage(ssl, NULL, 0, NULL, inSz, application_data, 0, 1, 0, CUR_ORDER); } @@ -3228,6 +3228,72 @@ int wolfSSL_UseClientSuites(WOLFSSL* ssl) return 0; } +#ifdef WOLFSSL_DTLS +const byte* wolfSSL_GetDtlsMacSecret(WOLFSSL* ssl, int verify, int epochOrder) +{ +#ifndef WOLFSSL_AEAD_ONLY + Keys* keys = NULL; + + (void)epochOrder; + + if (ssl == NULL) + return NULL; + +#ifdef HAVE_SECURE_RENEGOTIATION + switch (epochOrder) { + case PEER_ORDER: + if (ssl->secure_renegotiation && + ssl->secure_renegotiation->tmp_keys.dtls_epoch != 0 && + ssl->keys.curEpoch == + ssl->secure_renegotiation->tmp_keys.dtls_epoch) + keys = &ssl->secure_renegotiation->tmp_keys; + else + keys = &ssl->keys; + break; + case PREV_ORDER: + if (ssl->keys.dtls_epoch > 1 || + (ssl->secure_renegotiation && + ssl->secure_renegotiation->tmp_keys.dtls_epoch != 0)) + keys = &ssl->keys; + else { + WOLFSSL_MSG("No previous cipher epoch"); + return NULL; + } + break; + case CUR_ORDER: + if (ssl->secure_renegotiation && + ssl->secure_renegotiation->tmp_keys.dtls_epoch != 0 && + ssl->secure_renegotiation->tmp_keys.dtls_epoch == + ssl->keys.dtls_epoch) + /* new keys are in scr and are only current when the + * ssl->keys.dtls_epoch matches */ + keys = &ssl->secure_renegotiation->tmp_keys; + else + keys = &ssl->keys; + break; + default: + WOLFSSL_MSG("Unknown epoch order"); + return NULL; + } +#else + keys = &ssl->keys; +#endif + + if ( (ssl->options.side == WOLFSSL_CLIENT_END && !verify) || + (ssl->options.side == WOLFSSL_SERVER_END && verify) ) + return keys->client_write_MAC_secret; + else + return keys->server_write_MAC_secret; +#else + (void)ssl; + (void)verify; + (void)epochOrder; + + return NULL; +#endif +} +#endif /* WOLFSSL_DTLS */ + const byte* wolfSSL_GetMacSecret(WOLFSSL* ssl, int verify) { #ifndef WOLFSSL_AEAD_ONLY diff --git a/src/tls.c b/src/tls.c index ad2effa91..18c911bfb 100644 --- a/src/tls.c +++ b/src/tls.c @@ -667,6 +667,14 @@ static WC_INLINE void GetSEQIncrement(WOLFSSL* ssl, int verify, word32 seq[2]) #ifdef WOLFSSL_DTLS static WC_INLINE void DtlsGetSEQ(WOLFSSL* ssl, int order, word32 seq[2]) { +#ifdef HAVE_SECURE_RENEGOTIATION + /* if ssl->secure_renegotiation->tmp_keys.dtls_epoch > ssl->keys.dtls_epoch then PREV_ORDER + * refers to the current epoch */ + if (order == PREV_ORDER && ssl->secure_renegotiation && + ssl->secure_renegotiation->tmp_keys.dtls_epoch > ssl->keys.dtls_epoch) { + order = CUR_ORDER; + } +#endif if (order == PREV_ORDER) { /* Previous epoch case */ seq[0] = (((word32)ssl->keys.dtls_epoch - 1) << 16) | @@ -1169,11 +1177,12 @@ static int Hmac_UpdateFinal(Hmac* hmac, byte* digest, const byte* in, #endif int TLS_hmac(WOLFSSL* ssl, byte* digest, const byte* in, word32 sz, int padSz, - int content, int verify) + int content, int verify, int epochOrder) { Hmac hmac; byte myInner[WOLFSSL_TLS_HMAC_INNER_SZ]; int ret = 0; + const byte* macSecret = NULL; word32 hashSz = 0; if (ssl == NULL) @@ -1199,7 +1208,7 @@ int TLS_hmac(WOLFSSL* ssl, byte* digest, const byte* in, word32 sz, int padSz, } #endif - wolfSSL_SetTlsHmacInner(ssl, myInner, sz, content, verify); + wolfSSL_SetTlsHmacInner(ssl, myInner, sz, content, epochOrder); #if defined(WOLFSSL_RENESAS_TSIP_TLS) && \ !defined(NO_WOLFSSL_RENESAS_TSIP_TLS_SESSION) if (tsip_useable(ssl)) { @@ -1219,9 +1228,19 @@ int TLS_hmac(WOLFSSL* ssl, byte* digest, const byte* in, word32 sz, int padSz, if (ret != 0) return ret; + +#ifdef WOLFSSL_DTLS + if (ssl->options.dtls) + macSecret = wolfSSL_GetDtlsMacSecret(ssl, verify, epochOrder); + else + macSecret = wolfSSL_GetMacSecret(ssl, verify); +#else + macSecret = wolfSSL_GetMacSecret(ssl, verify); +#endif ret = wc_HmacSetKey(&hmac, wolfSSL_GetHmacType(ssl), - wolfSSL_GetMacSecret(ssl, verify), + macSecret, ssl->specs.hash_size); + if (ret == 0) { /* Constant time verification required. */ if (verify && padSz >= 0) { diff --git a/src/wolfio.c b/src/wolfio.c index 8c9932ff0..95bb6171f 100644 --- a/src/wolfio.c +++ b/src/wolfio.c @@ -318,7 +318,9 @@ int EmbedReceiveFrom(WOLFSSL *ssl, char *buf, int sz, void *ctx) WOLFSSL_ENTER("EmbedReceiveFrom()"); - if (ssl->options.handShakeDone) + /* Don't use ssl->options.handShakeDone since it is true even if + * we are in the process of renegotiation */ + if (ssl->options.handShakeState == HANDSHAKE_DONE) dtls_timeout = 0; if (!wolfSSL_get_using_nonblock(ssl)) { diff --git a/wolfssl/internal.h b/wolfssl/internal.h index a4af16aea..a8a1e0712 100644 --- a/wolfssl/internal.h +++ b/wolfssl/internal.h @@ -3003,6 +3003,13 @@ enum CipherType { aead }; #define CIPHER_NONCE #endif +#if defined(WOLFSSL_DTLS) && defined(HAVE_SECURE_RENEGOTIATION) +enum CipherSrc { + KEYS_NOT_SET = 0, + KEYS, /* keys from ssl->keys are loaded */ + SCR /* keys from ssl->secure_renegotiation->tmp_keys are loaded */ +}; +#endif /* cipher for now */ typedef struct Ciphers { @@ -3042,6 +3049,9 @@ typedef struct Ciphers { #endif byte state; byte setup; /* have we set it up flag for detection */ +#if defined(WOLFSSL_DTLS) && defined(HAVE_SECURE_RENEGOTIATION) + enum CipherSrc src; +#endif } Ciphers; @@ -3177,7 +3187,7 @@ WOLFSSL_SESSION* GetSession(WOLFSSL*, byte*, byte); WOLFSSL_LOCAL int SetSession(WOLFSSL*, WOLFSSL_SESSION*); -typedef int (*hmacfp) (WOLFSSL*, byte*, const byte*, word32, int, int, int); +typedef int (*hmacfp) (WOLFSSL*, byte*, const byte*, word32, int, int, int, int); #ifndef NO_CLIENT_CACHE WOLFSSL_SESSION* GetSessionClient(WOLFSSL*, const byte*, int); @@ -3734,6 +3744,7 @@ typedef struct DtlsMsg { byte* msg; DtlsFrag* fragList; word32 fragSz; /* Length of fragments received */ + word16 epoch; /* Epoch that this message belongs to */ word32 seq; /* Handshake sequence number */ word32 sz; /* Length of whole message */ byte type; @@ -4355,6 +4366,10 @@ WOLFSSL_LOCAL int IsTLS(const WOLFSSL* ssl); WOLFSSL_LOCAL int IsAtLeastTLSv1_2(const WOLFSSL* ssl); WOLFSSL_LOCAL int IsAtLeastTLSv1_3(const ProtocolVersion pv); +#if defined(WOLFSSL_DTLS) || !defined(WOLFSSL_NO_TLS12) +WOLFSSL_LOCAL int IsInitialRenegotiationState(WOLFSSL* ssl); +#endif /* DTLS || !WOLFSSL_NO_TLS12 */ + WOLFSSL_LOCAL void FreeHandshakeResources(WOLFSSL* ssl); WOLFSSL_LOCAL void ShrinkInputBuffer(WOLFSSL* ssl, int forcedFree); WOLFSSL_LOCAL void ShrinkOutputBuffer(WOLFSSL* ssl); @@ -4451,7 +4466,7 @@ WOLFSSL_LOCAL int GrowInputBuffer(WOLFSSL* ssl, int size, int usedLength); WOLFSSL_LOCAL int MakeTlsMasterSecret(WOLFSSL*); #ifndef WOLFSSL_AEAD_ONLY WOLFSSL_LOCAL int TLS_hmac(WOLFSSL* ssl, byte* digest, const byte* in, - word32 sz, int padSz, int content, int verify); + word32 sz, int padSz, int content, int verify, int epochOrder); #endif #endif @@ -4473,16 +4488,18 @@ WOLFSSL_LOCAL int GrowInputBuffer(WOLFSSL* ssl, int size, int usedLength); WOLFSSL_LOCAL DtlsMsg* DtlsMsgNew(word32, void*); WOLFSSL_LOCAL void DtlsMsgDelete(DtlsMsg*, void*); WOLFSSL_LOCAL void DtlsMsgListDelete(DtlsMsg*, void*); - WOLFSSL_LOCAL int DtlsMsgSet(DtlsMsg*, word32, const byte*, byte, + WOLFSSL_LOCAL void DtlsTxMsgListClean(WOLFSSL* ssl); + WOLFSSL_LOCAL int DtlsMsgSet(DtlsMsg*, word32, word16, const byte*, byte, word32, word32, void*); - WOLFSSL_LOCAL DtlsMsg* DtlsMsgFind(DtlsMsg*, word32); - WOLFSSL_LOCAL void DtlsMsgStore(WOLFSSL*, word32, const byte*, word32, + WOLFSSL_LOCAL DtlsMsg* DtlsMsgFind(DtlsMsg*, word32, word32); + WOLFSSL_LOCAL void DtlsMsgStore(WOLFSSL*, word32, word32, const byte*, word32, byte, word32, word32, void*); WOLFSSL_LOCAL DtlsMsg* DtlsMsgInsert(DtlsMsg*, DtlsMsg*); - WOLFSSL_LOCAL int DtlsMsgPoolSave(WOLFSSL*, const byte*, word32); + WOLFSSL_LOCAL int DtlsMsgPoolSave(WOLFSSL*, const byte*, word32, enum HandShakeType); WOLFSSL_LOCAL int DtlsMsgPoolTimeout(WOLFSSL*); WOLFSSL_LOCAL int VerifyForDtlsMsgPoolSend(WOLFSSL*, byte, word32); + WOLFSSL_LOCAL int VerifyForTxDtlsMsgDelete(WOLFSSL* ssl, DtlsMsg* head); WOLFSSL_LOCAL void DtlsMsgPoolReset(WOLFSSL*); WOLFSSL_LOCAL int DtlsMsgPoolSend(WOLFSSL*, int); #endif /* WOLFSSL_DTLS */ @@ -4587,7 +4604,7 @@ WOLFSSL_LOCAL void FreeHandshakeHashes(WOLFSSL* ssl); WOLFSSL_LOCAL int BuildMessage(WOLFSSL* ssl, byte* output, int outSz, const byte* input, int inSz, int type, int hashOutput, - int sizeOnly, int asyncOkay); + int sizeOnly, int asyncOkay, int epochOrder); #ifdef WOLFSSL_TLS13 int BuildTls13Message(WOLFSSL* ssl, byte* output, int outSz, const byte* input, diff --git a/wolfssl/ssl.h b/wolfssl/ssl.h index 39d7a9911..c7a15a15a 100644 --- a/wolfssl/ssl.h +++ b/wolfssl/ssl.h @@ -2431,6 +2431,7 @@ WOLFSSL_API void wolfSSL_SetVerifyDecryptCtx(WOLFSSL* ssl, void *ctx); WOLFSSL_API void* wolfSSL_GetVerifyDecryptCtx(WOLFSSL* ssl); WOLFSSL_API const unsigned char* wolfSSL_GetMacSecret(WOLFSSL*, int); +WOLFSSL_API const unsigned char* wolfSSL_GetDtlsMacSecret(WOLFSSL*, int, int); WOLFSSL_API const unsigned char* wolfSSL_GetClientWriteKey(WOLFSSL*); WOLFSSL_API const unsigned char* wolfSSL_GetClientWriteIV(WOLFSSL*); WOLFSSL_API const unsigned char* wolfSSL_GetServerWriteKey(WOLFSSL*); From eb910a64d001ad8f05658ec1886bbc2865a8fa12 Mon Sep 17 00:00:00 2001 From: Juliusz Sosinowicz Date: Tue, 19 May 2020 19:49:45 +0200 Subject: [PATCH 213/298] Comments and formatting --- src/internal.c | 114 ++++++++++++++++++++++++++++----------------- src/keys.c | 2 +- src/ssl.c | 3 ++ wolfssl/internal.h | 3 +- 4 files changed, 77 insertions(+), 45 deletions(-) diff --git a/src/internal.c b/src/internal.c index 53d1c688e..f255616a3 100644 --- a/src/internal.c +++ b/src/internal.c @@ -6904,6 +6904,9 @@ void DtlsMsgListDelete(DtlsMsg* head, void* heap) } } +/** + * Drop messages when they are no longer going to be retransmitted + */ void DtlsTxMsgListClean(WOLFSSL* ssl) { DtlsMsg* head = ssl->dtls_tx_msg_list; @@ -7149,8 +7152,13 @@ DtlsMsg* DtlsMsgInsert(DtlsMsg* head, DtlsMsg* item) } -/* DtlsMsgPoolSave() adds the message to the end of the stored transmit list. */ -int DtlsMsgPoolSave(WOLFSSL* ssl, const byte* data, word32 dataSz, enum HandShakeType type) +/** + * DtlsMsgPoolSave() adds the message to the end of the stored transmit + * list. Must be called BEFORE BuildMessage or DtlsSEQIncrement or + * anything else that increments ssl->keys.dtls_handshake_number. + */ +int DtlsMsgPoolSave(WOLFSSL* ssl, const byte* data, word32 dataSz, + enum HandShakeType type) { DtlsMsg* item; int ret = 0; @@ -7170,8 +7178,7 @@ int DtlsMsgPoolSave(WOLFSSL* ssl, const byte* data, word32 dataSz, enum HandShak XMEMCPY(item->buf, data, dataSz); item->sz = dataSz; item->epoch = ssl->keys.dtls_epoch; - /* save is called after something incremented this var */ - item->seq = ssl->keys.dtls_handshake_number - 1; + item->seq = ssl->keys.dtls_handshake_number; item->type = type; if (cur == NULL) @@ -7251,7 +7258,9 @@ int VerifyForTxDtlsMsgDelete(WOLFSSL* ssl, DtlsMsg* item) case WOLFSSL_SERVER_END: if (ssl->options.clientState >= CLIENT_FINISHED_COMPLETE && item->type <= server_hello_done) - return 1; + return 1; /* server can forget everything up to ServerHelloDone if + * a client finished message has been received and + * successfully processed */ else return 0; default: @@ -7324,7 +7333,6 @@ int DtlsMsgPoolSend(WOLFSSL* ssl, int sendOnlyFirstPacket) sendSz = inputSz + MAX_MSG_EXTRA; #ifdef HAVE_SECURE_RENEGOTIATION - /* * CUR_ORDER will use ssl->secure_renegotiation from epoch 2+. * ssl->keys otherwise @@ -13132,7 +13140,7 @@ static int DoDtlsHandShakeMsg(WOLFSSL* ssl, byte* input, word32* inOutIdx, if (type == finished && ssl->keys.dtls_peer_handshake_number >= ssl->keys.dtls_expected_peer_handshake_number && ssl->keys.curEpoch == ssl->keys.dtls_epoch) { - /* finished msg should be ignore if it is in the current epoch + /* finished msg should be ignore from the current epoch * if it comes from a previous handshake */ if (ssl->options.side == WOLFSSL_CLIENT_END) { ignoreFinished = ssl->options.connectState < FINISHED_DONE; @@ -13153,7 +13161,10 @@ static int DoDtlsHandShakeMsg(WOLFSSL* ssl, byte* input, word32* inOutIdx, */ if (ssl->keys.dtls_peer_handshake_number > ssl->keys.dtls_expected_peer_handshake_number && - (type == client_hello || ssl->options.handShakeState != HANDSHAKE_DONE) && + /* Only client_hello shouldn't be ignored if the handshake + * num is greater */ + (type == client_hello || + ssl->options.handShakeState != HANDSHAKE_DONE) && !ignoreFinished) { /* Current message is out of order. It will get stored in the list. * Storing also takes care of defragmentation. If the messages is a @@ -13201,6 +13212,8 @@ static int DoDtlsHandShakeMsg(WOLFSSL* ssl, byte* input, word32* inOutIdx, } else if (ssl->keys.dtls_peer_handshake_number < ssl->keys.dtls_expected_peer_handshake_number || + /* ignore all handshake messages if we are done with the + * handshake */ (ssl->keys.dtls_peer_handshake_number > ssl->keys.dtls_expected_peer_handshake_number && ssl->options.handShakeState == HANDSHAKE_DONE) || @@ -14060,17 +14073,19 @@ static WC_INLINE int DecryptDo(WOLFSSL* ssl, byte* plain, const byte* input, #if defined(WOLFSSL_DTLS) && defined(HAVE_SECURE_RENEGOTIATION) if (ssl->options.dtls && ssl->secure_renegotiation && ssl->secure_renegotiation->tmp_keys.dtls_epoch != 0) { - if (ssl->keys.curEpoch == ssl->secure_renegotiation->tmp_keys.dtls_epoch) - XMEMCPY(ssl->decrypt.nonce, ssl->secure_renegotiation->tmp_keys.aead_dec_imp_IV, - AESGCM_IMP_IV_SZ); + if (ssl->keys.curEpoch == + ssl->secure_renegotiation->tmp_keys.dtls_epoch) + XMEMCPY(ssl->decrypt.nonce, + ssl->secure_renegotiation->tmp_keys.aead_dec_imp_IV, + AESGCM_IMP_IV_SZ); else XMEMCPY(ssl->decrypt.nonce, ssl->keys.aead_dec_imp_IV, - AESGCM_IMP_IV_SZ); + AESGCM_IMP_IV_SZ); } else #endif XMEMCPY(ssl->decrypt.nonce, ssl->keys.aead_dec_imp_IV, - AESGCM_IMP_IV_SZ); + AESGCM_IMP_IV_SZ); XMEMCPY(ssl->decrypt.nonce + AESGCM_IMP_IV_SZ, input, AESGCM_EXP_IV_SZ); if ((ret = aes_auth_fn(ssl->decrypt.aes, @@ -14197,17 +14212,22 @@ static WC_INLINE int Decrypt(WOLFSSL* ssl, byte* plain, const byte* input, #if defined(WOLFSSL_DTLS) && defined(HAVE_SECURE_RENEGOTIATION) if (ssl->options.dtls && ssl->secure_renegotiation && ssl->secure_renegotiation->tmp_keys.dtls_epoch != 0) { - if (ssl->keys.curEpoch == ssl->secure_renegotiation->tmp_keys.dtls_epoch) { + /* For epochs >1 the current cipher parameters are located in + * ssl->secure_renegotiation->tmp_keys. Previous cipher + * parameters and for epoch 1 use ssl->keys */ + if (ssl->keys.curEpoch == + ssl->secure_renegotiation->tmp_keys.dtls_epoch) { if (ssl->decrypt.src != SCR) { - ssl->secure_renegotiation->cache_status = SCR_CACHE_NEEDED; + ssl->secure_renegotiation->cache_status = + SCR_CACHE_NEEDED; if ((ret = SetKeysSide(ssl, DECRYPT_SIDE_ONLY)) != 0) break; } - WOLFSSL_BUFFER(ssl->secure_renegotiation->tmp_keys.client_write_key, MAX_SYM_KEY_SIZE); } else { if (ssl->decrypt.src != KEYS) { - ssl->secure_renegotiation->cache_status = SCR_CACHE_NULL; + ssl->secure_renegotiation->cache_status = + SCR_CACHE_NULL; if ((ret = SetKeysSide(ssl, DECRYPT_SIDE_ONLY)) != 0) break; } @@ -15685,9 +15705,9 @@ int SendChangeCipher(WOLFSSL* ssl) #ifdef WOLFSSL_DTLS else { if (IsDtlsNotSctpMode(ssl)) { - DtlsSEQIncrement(ssl, CUR_ORDER); if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, change_cipher_hs)) != 0) return ret; + DtlsSEQIncrement(ssl, CUR_ORDER); } } #endif @@ -16087,35 +16107,42 @@ int BuildMessage(WOLFSSL* ssl, byte* output, int outSz, const byte* input, #if defined(WOLFSSL_DTLS) && defined(HAVE_SECURE_RENEGOTIATION) if (ssl->options.dtls && ssl->secure_renegotiation && ssl->secure_renegotiation->tmp_keys.dtls_epoch != 0) { + /* For epochs >1 the current cipher parameters are located in + * ssl->secure_renegotiation->tmp_keys. Previous cipher + * parameters and for epoch 1 use ssl->keys */ switch (epochOrder) { case PREV_ORDER: if (ssl->encrypt.src != KEYS) { - ssl->secure_renegotiation->cache_status = SCR_CACHE_NULL; + ssl->secure_renegotiation->cache_status = + SCR_CACHE_NULL; if ((ret = SetKeysSide(ssl, ENCRYPT_SIDE_ONLY)) != 0) ERROR_OUT(ret, exit_buildmsg); - WOLFSSL_BUFFER(ssl->keys.client_write_key, MAX_SYM_KEY_SIZE); } break; case CUR_ORDER: - if (ssl->keys.dtls_epoch == ssl->secure_renegotiation->tmp_keys.dtls_epoch) { + if (ssl->keys.dtls_epoch == + ssl->secure_renegotiation->tmp_keys.dtls_epoch) { if (ssl->encrypt.src != SCR) { - ssl->secure_renegotiation->cache_status = SCR_CACHE_NEEDED; - if ((ret = SetKeysSide(ssl, ENCRYPT_SIDE_ONLY)) != 0) + ssl->secure_renegotiation->cache_status = + SCR_CACHE_NEEDED; + if ((ret = SetKeysSide(ssl, ENCRYPT_SIDE_ONLY)) + != 0) ERROR_OUT(ret, exit_buildmsg); - WOLFSSL_BUFFER(ssl->secure_renegotiation->tmp_keys.client_write_key, MAX_SYM_KEY_SIZE); } } else { if (ssl->encrypt.src != KEYS) { - ssl->secure_renegotiation->cache_status = SCR_CACHE_NULL; - if ((ret = SetKeysSide(ssl, ENCRYPT_SIDE_ONLY)) != 0) + ssl->secure_renegotiation->cache_status = + SCR_CACHE_NULL; + if ((ret = SetKeysSide(ssl, ENCRYPT_SIDE_ONLY)) + != 0) ERROR_OUT(ret, exit_buildmsg); - WOLFSSL_BUFFER(ssl->keys.client_write_key, MAX_SYM_KEY_SIZE); } } break; default: - WOLFSSL_MSG("BuildMessage only supports PREV_ORDER and CUR_ORDER"); + WOLFSSL_MSG("BuildMessage only supports PREV_ORDER and " + "CUR_ORDER"); ERROR_OUT(BAD_FUNC_ARG, exit_buildmsg); } } @@ -16326,8 +16353,8 @@ int BuildMessage(WOLFSSL* ssl, byte* output, int outSz, const byte* input, case BUILD_MSG_ENCRYPT: { #if defined(HAVE_SECURE_RENEGOTIATION) && defined(WOLFSSL_DTLS) - /* Modify CUR_ORDER sequence number for all encryption algos - * that use it for encryption parameters */ + /* If we want the PREV_ORDER then modify CUR_ORDER sequence number + * for all encryption algos that use it for encryption parameters */ word16 dtls_epoch; word16 dtls_sequence_number_hi; word32 dtls_sequence_number_lo; @@ -16341,8 +16368,10 @@ int BuildMessage(WOLFSSL* ssl, byte* output, int outSz, const byte* input, dtls_sequence_number_hi = ssl->keys.dtls_sequence_number_hi; dtls_sequence_number_lo = ssl->keys.dtls_sequence_number_lo; ssl->keys.dtls_epoch--; - ssl->keys.dtls_sequence_number_hi = ssl->keys.dtls_prev_sequence_number_hi; - ssl->keys.dtls_sequence_number_lo = ssl->keys.dtls_prev_sequence_number_lo; + ssl->keys.dtls_sequence_number_hi = + ssl->keys.dtls_prev_sequence_number_hi; + ssl->keys.dtls_sequence_number_lo = + ssl->keys.dtls_prev_sequence_number_lo; } #endif #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY) @@ -17145,12 +17174,12 @@ int SendCertificateRequest(WOLFSSL* ssl) } else { sendSz = i; #ifdef WOLFSSL_DTLS - if (ssl->options.dtls) - DtlsSEQIncrement(ssl, CUR_ORDER); if (IsDtlsNotSctpMode(ssl)) { if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, certificate_request)) != 0) return ret; } + if (ssl->options.dtls) + DtlsSEQIncrement(ssl, CUR_ORDER); #endif ret = HashOutput(ssl, output, sendSz, 0); if (ret != 0) @@ -17244,8 +17273,10 @@ static int BuildCertificateStatus(WOLFSSL* ssl, byte type, buffer* status, return MEMORY_E; XMEMCPY(input, output + recordHeaderSz, inputSz); - sendSz = BuildMessage(ssl, output, sendSz, input, inputSz, - handshake, 1, 0, 0, CUR_ORDER); + ret = DtlsMsgPoolSave(ssl, input, inputSz, certificate_status); + if (ret == 0) + sendSz = BuildMessage(ssl, output, sendSz, input, inputSz, + handshake, 1, 0, 0, CUR_ORDER); XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER); if (sendSz < 0) @@ -17253,17 +17284,14 @@ static int BuildCertificateStatus(WOLFSSL* ssl, byte type, buffer* status, } else { #ifdef WOLFSSL_DTLS - if (ssl->options.dtls) + if (ret == 0 && IsDtlsNotSctpMode(ssl)) + ret = DtlsMsgPoolSave(ssl, output, sendSz, certificate_status); + if (ret == 0 && ssl->options.dtls) DtlsSEQIncrement(ssl, CUR_ORDER); #endif ret = HashOutput(ssl, output, sendSz, 0); } - #ifdef WOLFSSL_DTLS - if (ret == 0 && IsDtlsNotSctpMode(ssl)) - ret = DtlsMsgPoolSave(ssl, output, sendSz, certificate_status); - #endif - #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA) if (ret == 0 && ssl->hsInfoOn) AddPacketName(ssl, "CertificateStatus"); @@ -17614,7 +17642,7 @@ int SendData(WOLFSSL* ssl, const void* data, int sz) else { #ifdef WOLFSSL_TLS13 sendSz = BuildTls13Message(ssl, out, outputSz, sendBuffer, buffSz, - application_data, 0, 0, 1, CUR_ORDER); + application_data, 0, 0, 1); #else sendSz = BUFFER_ERROR; #endif diff --git a/src/keys.c b/src/keys.c index b620dc96d..0545d6507 100644 --- a/src/keys.c +++ b/src/keys.c @@ -3241,7 +3241,7 @@ int StoreKeys(WOLFSSL* ssl, const byte* keyData, int side) ssl->secure_renegotiation->cache_status == SCR_CACHE_NEEDED) { keys = &ssl->secure_renegotiation->tmp_keys; #ifdef WOLFSSL_DTLS - /* epoch is incremented after StoreKeys call */ + /* epoch is incremented after StoreKeys is called */ ssl->secure_renegotiation->tmp_keys.dtls_epoch = ssl->keys.dtls_epoch + 1; /* we only need to copy keys on second and future renegotiations */ if (ssl->keys.dtls_epoch > 1) diff --git a/src/ssl.c b/src/ssl.c index b22c6efee..371f19070 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -3240,6 +3240,9 @@ const byte* wolfSSL_GetDtlsMacSecret(WOLFSSL* ssl, int verify, int epochOrder) return NULL; #ifdef HAVE_SECURE_RENEGOTIATION + /* ssl->keys contains the current cipher parameters only for epoch 1. For + * epochs >1 ssl->secure_renegotiation->tmp_keys contains the current + * cipher parameters */ switch (epochOrder) { case PEER_ORDER: if (ssl->secure_renegotiation && diff --git a/wolfssl/internal.h b/wolfssl/internal.h index a8a1e0712..ad8250362 100644 --- a/wolfssl/internal.h +++ b/wolfssl/internal.h @@ -3050,7 +3050,8 @@ typedef struct Ciphers { byte state; byte setup; /* have we set it up flag for detection */ #if defined(WOLFSSL_DTLS) && defined(HAVE_SECURE_RENEGOTIATION) - enum CipherSrc src; + enum CipherSrc src; /* DTLS uses this to determine which keys + * are currently loaded */ #endif } Ciphers; From c2ca9f614ea4f905bcd7ba77138c9017d5b395b4 Mon Sep 17 00:00:00 2001 From: Juliusz Sosinowicz Date: Wed, 20 May 2020 10:13:53 +0200 Subject: [PATCH 214/298] Jenkins tests fixes --- src/internal.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/internal.c b/src/internal.c index f255616a3..f45320e81 100644 --- a/src/internal.c +++ b/src/internal.c @@ -15445,7 +15445,7 @@ int ProcessReply(WOLFSSL* ssl) if (IsEncryptionOn(ssl, 0) && ssl->options.handShakeDone) { ssl->buffers.inputBuffer.idx += ssl->keys.padSz; - ssl->curSize -= ssl->keys.padSz; + ssl->curSize -= (word16)ssl->keys.padSz; #ifdef HAVE_AEAD if (ssl->specs.cipher_type == aead && ssl->specs.bulk_cipher_algorithm != wolfssl_chacha) @@ -17273,7 +17273,9 @@ static int BuildCertificateStatus(WOLFSSL* ssl, byte type, buffer* status, return MEMORY_E; XMEMCPY(input, output + recordHeaderSz, inputSz); - ret = DtlsMsgPoolSave(ssl, input, inputSz, certificate_status); + #ifdef WOLFSSL_DTLS + ret = DtlsMsgPoolSave(ssl, input, inputSz, certificate_status); + #endif if (ret == 0) sendSz = BuildMessage(ssl, output, sendSz, input, inputSz, handshake, 1, 0, 0, CUR_ORDER); @@ -24250,10 +24252,11 @@ int SendCertificateVerify(WOLFSSL* ssl) if (IsDtlsNotSctpMode(ssl)) { ret = DtlsMsgPoolSave(ssl, args->output, args->sendSz, certificate_verify); } - if (ssl->options.dtls) + if (ret == 0 && ssl->options.dtls) DtlsSEQIncrement(ssl, CUR_ORDER); #endif - ret = HashOutput(ssl, args->output, args->sendSz, 0); + if (ret == 0) + ret = HashOutput(ssl, args->output, args->sendSz, 0); } if (ret != 0) { From d2542dcf386e79441f0475b274fb573ecf92559b Mon Sep 17 00:00:00 2001 From: Juliusz Sosinowicz Date: Thu, 21 May 2020 13:39:17 +0200 Subject: [PATCH 215/298] Restore StoreKeys functionality for TLS case --- src/keys.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/keys.c b/src/keys.c index 0545d6507..2c7bfae69 100644 --- a/src/keys.c +++ b/src/keys.c @@ -3236,18 +3236,19 @@ int StoreKeys(WOLFSSL* ssl, const byte* keyData, int side) #endif #ifdef HAVE_SECURE_RENEGOTIATION - if (ssl->options.dtls && - ssl->secure_renegotiation && + if (ssl->secure_renegotiation && ssl->secure_renegotiation->cache_status == SCR_CACHE_NEEDED) { keys = &ssl->secure_renegotiation->tmp_keys; #ifdef WOLFSSL_DTLS - /* epoch is incremented after StoreKeys is called */ - ssl->secure_renegotiation->tmp_keys.dtls_epoch = ssl->keys.dtls_epoch + 1; - /* we only need to copy keys on second and future renegotiations */ - if (ssl->keys.dtls_epoch > 1) - scr_copy = 1; - ssl->encrypt.src = KEYS_NOT_SET; - ssl->decrypt.src = KEYS_NOT_SET; + if (ssl->options.dtls) { + /* epoch is incremented after StoreKeys is called */ + ssl->secure_renegotiation->tmp_keys.dtls_epoch = ssl->keys.dtls_epoch + 1; + /* we only need to copy keys on second and future renegotiations */ + if (ssl->keys.dtls_epoch > 1) + scr_copy = 1; + ssl->encrypt.src = KEYS_NOT_SET; + ssl->decrypt.src = KEYS_NOT_SET; + } #endif CacheStatusPP(ssl->secure_renegotiation); } From 4e60e4b3b7e54fe3454e8bbd3a6cdc151282f881 Mon Sep 17 00:00:00 2001 From: Juliusz Sosinowicz Date: Mon, 25 May 2020 23:35:42 +0200 Subject: [PATCH 216/298] DTLS Message Grouping Flush output buffer when we suspect that the grouped messages may exceed MTU. --- src/internal.c | 39 +++++++++++++++++++++++++++------------ 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/src/internal.c b/src/internal.c index f45320e81..05255612f 100644 --- a/src/internal.c +++ b/src/internal.c @@ -7317,10 +7317,11 @@ int DtlsMsgPoolSend(WOLFSSL* ssl, int sendOnlyFirstPacket) return ret; } - XMEMCPY(ssl->buffers.outputBuffer.buffer, + XMEMCPY(ssl->buffers.outputBuffer.buffer + + ssl->buffers.outputBuffer.idx + + ssl->buffers.outputBuffer.length, pool->buf, pool->sz); - ssl->buffers.outputBuffer.idx = 0; - ssl->buffers.outputBuffer.length = pool->sz; + ssl->buffers.outputBuffer.length += pool->sz; } else { /* Handle sending packets from previous epoch */ @@ -7377,11 +7378,9 @@ int DtlsMsgPoolSend(WOLFSSL* ssl, int sendOnlyFirstPacket) ssl->buffers.outputBuffer.length += sendSz; } - ret = SendBuffered(ssl); - if (ret < 0) { - WOLFSSL_ERROR(ret); - return ret; - } + + if (!ssl->options.groupMessages) + ret = SendBuffered(ssl); /** * on server side, retransmission is being triggered only by sending @@ -7392,14 +7391,15 @@ int DtlsMsgPoolSend(WOLFSSL* ssl, int sendOnlyFirstPacket) * be enough to do the trick. */ if (sendOnlyFirstPacket && - ssl->options.side == WOLFSSL_SERVER_END) { - + ssl->options.side == WOLFSSL_SERVER_END) pool = NULL; - } else pool = pool->next; ssl->dtls_tx_msg = pool; } + + if (ret == 0 && ssl->options.groupMessages) + ret = SendBuffered(ssl); } WOLFSSL_LEAVE("DtlsMsgPoolSend()", ret); @@ -8339,7 +8339,10 @@ int GrowInputBuffer(WOLFSSL* ssl, int size, int usedLength) } -/* check available size into output buffer, make room if needed */ +/* Check available size into output buffer, make room if needed. + * This function needs to be called before anything gets put + * into the output buffers since it flushes pending data if it + * predicts that the msg will exceed MTU. */ int CheckAvailableSize(WOLFSSL *ssl, int size) { if (size < 0) { @@ -8347,6 +8350,18 @@ int CheckAvailableSize(WOLFSSL *ssl, int size) return BAD_FUNC_ARG; } +#ifdef WOLFSSL_DTLS + if (size + ssl->buffers.outputBuffer.length - ssl->buffers.outputBuffer.idx + > ssl->dtls_expected_rx) { + int ret; + WOLFSSL_MSG("CheckAvailableSize() flushing buffer " + "to make room for new message"); + if ((ret = SendBuffered(ssl)) != 0) { + return ret; + } + } +#endif + if (ssl->buffers.outputBuffer.bufferSize - ssl->buffers.outputBuffer.length < (word32)size) { if (GrowOutputBuffer(ssl, size) < 0) From d88f6f115680b1ab5456f93efd18d882bd21737c Mon Sep 17 00:00:00 2001 From: Juliusz Sosinowicz Date: Tue, 26 May 2020 14:38:31 +0200 Subject: [PATCH 217/298] DTLS test cases --- src/internal.c | 15 +- tests/suites.c | 28 + tests/test-dtls-group.conf | 1045 +++++++++++++++++++++++++++++ tests/test-dtls-reneg-client.conf | 1045 +++++++++++++++++++++++++++++ tests/test-dtls-reneg-server.conf | 1045 +++++++++++++++++++++++++++++ 5 files changed, 3173 insertions(+), 5 deletions(-) create mode 100644 tests/test-dtls-group.conf create mode 100644 tests/test-dtls-reneg-client.conf create mode 100644 tests/test-dtls-reneg-server.conf diff --git a/src/internal.c b/src/internal.c index 05255612f..e8aa7835f 100644 --- a/src/internal.c +++ b/src/internal.c @@ -15459,15 +15459,20 @@ int ProcessReply(WOLFSSL* ssl) } if (IsEncryptionOn(ssl, 0) && ssl->options.handShakeDone) { - ssl->buffers.inputBuffer.idx += ssl->keys.padSz; - ssl->curSize -= (word16)ssl->keys.padSz; #ifdef HAVE_AEAD - if (ssl->specs.cipher_type == aead && - ssl->specs.bulk_cipher_algorithm != wolfssl_chacha) - ssl->curSize -= AESGCM_EXP_IV_SZ; + if (ssl->specs.cipher_type == aead) { + if (ssl->specs.bulk_cipher_algorithm != wolfssl_chacha) + ssl->curSize -= AESGCM_EXP_IV_SZ; + ssl->buffers.inputBuffer.idx += ssl->specs.aead_mac_size; + ssl->curSize -= ssl->specs.aead_mac_size; + } else #endif + { + ssl->buffers.inputBuffer.idx += ssl->keys.padSz; + ssl->curSize -= (word16)ssl->keys.padSz; ssl->curSize -= ssl->specs.iv_size; + } #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY) if (ssl->options.startedETMRead) { diff --git a/tests/suites.c b/tests/suites.c index 1e5bcd8d3..75c277b6e 100644 --- a/tests/suites.c +++ b/tests/suites.c @@ -822,6 +822,34 @@ int SuiteTest(int argc, char** argv) args.return_code = EXIT_FAILURE; goto exit; } + /* add dtls grouping suites */ + strcpy(argv0[1], "tests/test-dtls-group.conf"); + printf("starting dtls message grouping tests\n"); + test_harness(&args); + if (args.return_code != 0) { + printf("error from script %d\n", args.return_code); + args.return_code = EXIT_FAILURE; + goto exit; + } +#ifdef HAVE_SECURE_RENEGOTIATION + /* add dtls renegotiation tests */ + strcpy(argv0[1], "tests/test-dtls-reneg-client.conf"); + printf("starting dtls secure renegotiation client tests\n"); + test_harness(&args); + if (args.return_code != 0) { + printf("error from script %d\n", args.return_code); + args.return_code = EXIT_FAILURE; + goto exit; + } + strcpy(argv0[1], "tests/test-dtls-reneg-server.conf"); + printf("starting dtls secure renegotiation server tests\n"); + test_harness(&args); + if (args.return_code != 0) { + printf("error from script %d\n", args.return_code); + args.return_code = EXIT_FAILURE; + goto exit; + } +#endif #ifdef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES /* add dtls extra suites */ strcpy(argv0[1], "tests/test-dtls-sha2.conf"); diff --git a/tests/test-dtls-group.conf b/tests/test-dtls-group.conf new file mode 100644 index 000000000..8722f7b1e --- /dev/null +++ b/tests/test-dtls-group.conf @@ -0,0 +1,1045 @@ +# server DTLSv1.2 DHE-RSA-CHACHA20-POLY1305 +-u +-f +-v 3 +-l DHE-RSA-CHACHA20-POLY1305 + +# client DTLSv1.2 DHE-RSA-CHACHA20-POLY1305 +-u +-f +-v 3 +-l DHE-RSA-CHACHA20-POLY1305 + +# server DTLSv1.2 ECDHE-RSA-CHACHA20-POLY1305 +-u +-f +-v 3 +-l ECDHE-RSA-CHACHA20-POLY1305 + +# client DTLSv1.2 ECDHE-RSA-CHACHA20-POLY1305 +-u +-f +-v 3 +-l ECDHE-RSA-CHACHA20-POLY1305 + +# server DTLSv1.2 ECDHE-EDCSA-CHACHA20-POLY1305 +-u +-f +-v 3 +-l ECDHE-ECDSA-CHACHA20-POLY1305 +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.2 ECDHE-ECDSA-CHACHA20-POLY1305 +-u +-f +-v 3 +-l ECDHE-ECDSA-CHACHA20-POLY1305 +-A ./certs/ca-ecc-cert.pem + +# server TLSv1.2 DHE-PSK-CHACHA20-POLY1305 +-u +-f +-v 3 +-s +-l DHE-PSK-CHACHA20-POLY1305 + +# client TLSv1.2 DHE-PSK-CHACHA20-POLY1305 +-u +-f +-v 3 +-s +-l DHE-PSK-CHACHA20-POLY1305 + +# server TLSv1.2 ECDHE-PSK-CHACHA20-POLY1305 +-u +-f +-v 3 +-s +-l ECDHE-PSK-CHACHA20-POLY1305 + +# client TLSv1.2 ECDHE-PSK-CHACHA20-POLY1305 +-u +-f +-v 3 +-s +-l ECDHE-PSK-CHACHA20-POLY1305 + +# server TLSv1.2 PSK-CHACHA20-POLY1305 +-u +-f +-v 3 +-s +-l PSK-CHACHA20-POLY1305 + +# client TLSv1.2 PSK-CHACHA20-POLY1305 +-u +-f +-v 3 +-s +-l PSK-CHACHA20-POLY1305 + +# server DTLSv1.2 DHE-RSA-CHACHA20-POLY1305-OLD +-u +-f +-v 3 +-l DHE-RSA-CHACHA20-POLY1305-OLD + +# client DTLSv1.2 DHE-RSA-CHACHA20-POLY1305-OLD +-u +-f +-v 3 +-l DHE-RSA-CHACHA20-POLY1305-OLD + +# server DTLSv1.2 ECDHE-RSA-CHACHA20-POLY1305-OLD +-u +-f +-v 3 +-l ECDHE-RSA-CHACHA20-POLY1305-OLD + +# client DTLSv1.2 ECDHE-RSA-CHACHA20-POLY1305-OLD +-u +-f +-v 3 +-l ECDHE-RSA-CHACHA20-POLY1305-OLD + +# server DTLSv1.2 ECDHE-EDCSA-CHACHA20-POLY1305-OLD +-u +-f +-v 3 +-l ECDHE-ECDSA-CHACHA20-POLY1305-OLD +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.2 ECDHE-ECDSA-CHACHA20-POLY1305-OLD +-u +-f +-v 3 +-l ECDHE-ECDSA-CHACHA20-POLY1305-OLD +-A ./certs/ca-ecc-cert.pem + +# server DTLSv1 IDEA-CBC-SHA +-u +-f +-v 2 +-l IDEA-CBC-SHA + +# client DTLSv1 IDEA-CBC-SHA +-u +-f +-v 2 +-l IDEA-CBC-SHA + +# server DTLSv1 DES-CBC3-SHA +-u +-f +-v 2 +-l DES-CBC3-SHA + +# client DTLSv1 DES-CBC3-SHA +-u +-f +-v 2 +-l DES-CBC3-SHA + +# server DTLSv1.2 DES-CBC3-SHA +-u +-f +-v 3 +-l DES-CBC3-SHA + +# client DTLSv1.2 DES-CBC3-SHA +-u +-f +-v 3 +-l DES-CBC3-SHA + +# server DTLSv1 AES128-SHA +-u +-f +-v 2 +-l AES128-SHA + +# client DTLSv1 AES128-SHA +-u +-f +-v 2 +-l AES128-SHA + +# server DTLSv1.2 AES128-SHA +-u +-f +-v 3 +-l AES128-SHA + +# client DTLSv1.2 AES128-SHA +-u +-f +-v 3 +-l AES128-SHA + +# server DTLSv1 AES256-SHA +-u +-f +-v 2 +-l AES256-SHA + +# client DTLSv1 AES256-SHA +-u +-f +-v 2 +-l AES256-SHA + +# server DTLSv1.2 AES256-SHA +-u +-f +-v 3 +-l AES256-SHA + +# client DTLSv1.2 AES256-SHA +-u +-f +-v 3 +-l AES256-SHA + +# server DTLSv1.2 AES128-SHA256 +-u +-f +-v 3 +-l AES128-SHA256 + +# client DTLSv1.2 AES128-SHA256 +-u +-f +-v 3 +-l AES128-SHA256 + +# server DTLSv1.2 AES256-SHA256 +-u +-f +-v 3 +-l AES256-SHA256 + +# client DTLSv1.2 AES256-SHA256 +-u +-f +-v 3 +-l AES256-SHA256 + +# server DTLSv1.1 ECDHE-RSA-DES3 +-u +-f +-v 2 +-l ECDHE-RSA-DES-CBC3-SHA + +# client DTLSv1.1 ECDHE-RSA-DES3 +-u +-f +-v 2 +-l ECDHE-RSA-DES-CBC3-SHA + +# server DTLSv1.1 ECDHE-RSA-AES128 +-u +-f +-v 2 +-l ECDHE-RSA-AES128-SHA + +# client DTLSv1.1 ECDHE-RSA-AES128 +-u +-f +-v 2 +-l ECDHE-RSA-AES128-SHA + +# server DTLSv1.1 ECDHE-RSA-AES256 +-u +-f +-v 2 +-l ECDHE-RSA-AES256-SHA + +# client DTLSv1.1 ECDHE-RSA-AES256 +-u +-f +-v 2 +-l ECDHE-RSA-AES256-SHA + +# server DTLSv1.2 ECDHE-RSA-DES3 +-u +-f +-v 3 +-l ECDHE-RSA-DES-CBC3-SHA + +# client DTLSv1.2 ECDHE-RSA-DES3 +-u +-f +-v 3 +-l ECDHE-RSA-DES-CBC3-SHA + +# server DTLSv1.2 ECDHE-RSA-AES128 +-u +-f +-v 3 +-l ECDHE-RSA-AES128-SHA + +# client DTLSv1.2 ECDHE-RSA-AES128 +-u +-f +-v 3 +-l ECDHE-RSA-AES128-SHA + +# server DTLSv1.2 ECDHE-RSA-AES128-SHA256 +-u +-f +-v 3 +-l ECDHE-RSA-AES128-SHA256 + +# client DTLSv1.2 ECDHE-RSA-AES128-SHA256 +-u +-f +-v 3 +-l ECDHE-RSA-AES128-SHA256 + +# server DTLSv1.2 ECDHE-RSA-AES256 +-u +-f +-v 3 +-l ECDHE-RSA-AES256-SHA + +# client DTLSv1.2 ECDHE-RSA-AES256 +-u +-f +-v 3 +-l ECDHE-RSA-AES256-SHA + +# server TLSv1 ECDHE-ECDSA-NULL-SHA +-u +-f +-v 1 +-l ECDHE-ECDSA-NULL-SHA +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client TLSv1 ECDHE-ECDSA-NULL-SHA +-u +-f +-v 1 +-l ECDHE-ECDSA-NULL-SHA +-A ./certs/ca-ecc-cert.pem + +# server TLSv1.1 ECDHE-ECDSA-NULL-SHA +-u +-f +-v 2 +-l ECDHE-ECDSA-NULL-SHA +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client TLSv1 ECDHE-ECDSA-NULL-SHA +-u +-f +-v 2 +-l ECDHE-ECDSA-NULL-SHA +-A ./certs/ca-ecc-cert.pem + +# server TLSv1.2 ECDHE-ECDSA-NULL-SHA +-u +-f +-v 3 +-l ECDHE-ECDSA-NULL-SHA +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client TLSv1.2 ECDHE-ECDSA-NULL-SHA +-u +-f +-v 3 +-l ECDHE-ECDSA-NULL-SHA +-A ./certs/ca-ecc-cert.pem + +# server DTLSv1.1 ECDHE-ECDSA-DES3 +-u +-f +-v 2 +-l ECDHE-ECDSA-DES-CBC3-SHA +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.1 ECDHE-ECDSA-DES3 +-u +-f +-v 2 +-l ECDHE-ECDSA-DES-CBC3-SHA +-A ./certs/ca-ecc-cert.pem + +# server DTLSv1.1 ECDHE-ECDSA-AES128 +-u +-f +-v 2 +-l ECDHE-ECDSA-AES128-SHA +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.1 ECDHE-ECDSA-AES128 +-u +-f +-v 2 +-l ECDHE-ECDSA-AES128-SHA +-A ./certs/ca-ecc-cert.pem + +# server DTLSv1.1 ECDHE-ECDSA-AES256 +-u +-f +-v 2 +-l ECDHE-ECDSA-AES256-SHA +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.1 ECDHE-ECDSA-AES256 +-u +-f +-v 2 +-l ECDHE-ECDSA-AES256-SHA +-A ./certs/ca-ecc-cert.pem + +# server DTLSv1.2 ECDHE-ECDSA-DES3 +-u +-f +-v 3 +-l ECDHE-ECDSA-DES-CBC3-SHA +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.2 ECDHE-ECDSA-DES3 +-u +-f +-v 3 +-l ECDHE-ECDSA-DES-CBC3-SHA +-A ./certs/ca-ecc-cert.pem + +# server DTLSv1.2 ECDHE-ECDSA-AES128 +-u +-f +-v 3 +-l ECDHE-ECDSA-AES128-SHA +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.2 ECDHE-ECDSA-AES128 +-u +-f +-v 3 +-l ECDHE-ECDSA-AES128-SHA +-A ./certs/ca-ecc-cert.pem + +# server DTLSv1.2 ECDHE-ECDSA-AES128-SHA256 +-u +-f +-v 3 +-l ECDHE-ECDSA-AES128-SHA256 +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.2 ECDHE-ECDSA-AES128-SHA256 +-u +-f +-v 3 +-l ECDHE-ECDSA-AES128-SHA256 +-A ./certs/ca-ecc-cert.pem + +# server DTLSv1.2 ECDHE-ECDSA-AES256 +-u +-f +-v 3 +-l ECDHE-ECDSA-AES256-SHA +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.2 ECDHE-ECDSA-AES256 +-u +-f +-v 3 +-l ECDHE-ECDSA-AES256-SHA +-A ./certs/ca-ecc-cert.pem + +# server DTLSv1.1 ECDH-RSA-DES3 +-u +-f +-v 2 +-l ECDH-RSA-DES-CBC3-SHA +-c ./certs/server-ecc-rsa.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.1 ECDH-RSA-DES3 +-u +-f +-v 2 +-l ECDH-RSA-DES-CBC3-SHA + +# server DTLSv1.1 ECDH-RSA-AES128 +-u +-f +-v 2 +-l ECDH-RSA-AES128-SHA +-c ./certs/server-ecc-rsa.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.1 ECDH-RSA-AES128 +-u +-f +-v 2 +-l ECDH-RSA-AES128-SHA + +# server DTLSv1.1 ECDH-RSA-AES256 +-u +-f +-v 2 +-l ECDH-RSA-AES256-SHA +-c ./certs/server-ecc-rsa.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.1 ECDH-RSA-AES256 +-u +-f +-v 2 +-l ECDH-RSA-AES256-SHA + +# server DTLSv1.2 ECDH-RSA-DES3 +-u +-f +-v 3 +-l ECDH-RSA-DES-CBC3-SHA +-c ./certs/server-ecc-rsa.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.2 ECDH-RSA-DES3 +-u +-f +-v 3 +-l ECDH-RSA-DES-CBC3-SHA + +# server DTLSv1.2 ECDH-RSA-AES128 +-u +-f +-v 3 +-l ECDH-RSA-AES128-SHA +-c ./certs/server-ecc-rsa.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.2 ECDH-RSA-AES128 +-u +-f +-v 3 +-l ECDH-RSA-AES128-SHA + +# server DTLSv1.2 ECDH-RSA-AES128-SHA256 +-u +-f +-v 3 +-l ECDH-RSA-AES128-SHA256 +-c ./certs/server-ecc-rsa.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.2 ECDH-RSA-AES128-SHA256 +-u +-f +-v 3 +-l ECDH-RSA-AES128-SHA256 + +# server DTLSv1.2 ECDH-RSA-AES256 +-u +-f +-v 3 +-l ECDH-RSA-AES256-SHA +-c ./certs/server-ecc-rsa.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.2 ECDH-RSA-AES256 +-u +-f +-v 3 +-l ECDH-RSA-AES256-SHA + +# server DTLSv1.1 ECDH-ECDSA-DES3 +-u +-f +-v 2 +-l ECDH-ECDSA-DES-CBC3-SHA +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.1 ECDH-ECDSA-DES3 +-u +-f +-v 2 +-l ECDH-ECDSA-DES-CBC3-SHA +-A ./certs/ca-ecc-cert.pem + +# server DTLSv1.1 ECDH-ECDSA-AES128 +-u +-f +-v 2 +-l ECDH-ECDSA-AES128-SHA +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.1 ECDH-ECDSA-AES128 +-u +-f +-v 2 +-l ECDH-ECDSA-AES128-SHA +-A ./certs/ca-ecc-cert.pem + +# server DTLSv1.1 ECDH-ECDSA-AES256 +-u +-f +-v 2 +-l ECDH-ECDSA-AES256-SHA +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.1 ECDH-ECDSA-AES256 +-u +-f +-v 2 +-l ECDH-ECDSA-AES256-SHA +-A ./certs/ca-ecc-cert.pem + +# server DTLSv1.2 ECDH-ECDSA-DES3 +-u +-f +-v 3 +-l ECDH-ECDSA-DES-CBC3-SHA +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.2 ECDH-ECDSA-DES3 +-u +-f +-v 3 +-l ECDH-ECDSA-DES-CBC3-SHA +-A ./certs/ca-ecc-cert.pem + +# server DTLSv1.2 ECDH-ECDSA-AES128 +-u +-f +-v 3 +-l ECDH-ECDSA-AES128-SHA +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.2 ECDH-ECDSA-AES128 +-u +-f +-v 3 +-l ECDH-ECDSA-AES128-SHA +-A ./certs/ca-ecc-cert.pem + +# server DTLSv1.2 ECDH-ECDSA-AES128-SHA256 +-u +-f +-v 3 +-l ECDH-ECDSA-AES128-SHA256 +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.2 ECDH-ECDSA-AES128-SHA256 +-u +-f +-v 3 +-l ECDH-ECDSA-AES128-SHA256 +-A ./certs/ca-ecc-cert.pem + +# server DTLSv1.2 ECDH-ECDSA-AES256 +-u +-f +-v 3 +-l ECDH-ECDSA-AES256-SHA +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.2 ECDH-ECDSA-AES256 +-u +-f +-v 3 +-l ECDH-ECDSA-AES256-SHA +-A ./certs/ca-ecc-cert.pem + +# server DTLSv1.2 ECDHE-RSA-AES256-SHA384 +-u +-f +-v 3 +-l ECDHE-RSA-AES256-SHA384 + +# client DTLSv1.2 ECDHE-RSA-AES256-SHA384 +-u +-f +-v 3 +-l ECDHE-RSA-AES256-SHA384 + +# server DTLSv1.2 ECDHE-ECDSA-AES256-SHA384 +-u +-f +-v 3 +-l ECDHE-ECDSA-AES256-SHA384 +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.2 ECDHE-ECDSA-AES256-SHA384 +-u +-f +-v 3 +-l ECDHE-ECDSA-AES256-SHA384 +-A ./certs/ca-ecc-cert.pem + +# server DTLSv1.2 ECDH-RSA-AES256-SHA384 +-u +-f +-v 3 +-l ECDH-RSA-AES256-SHA384 +-c ./certs/server-ecc-rsa.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.2 ECDH-RSA-AES256-SHA384 +-u +-f +-v 3 +-l ECDH-RSA-AES256-SHA384 + +# server DTLSv1.2 ECDH-ECDSA-AES256-SHA384 +-u +-f +-v 3 +-l ECDH-ECDSA-AES256-SHA384 +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.2 ECDH-ECDSA-AES256-SHA384 +-u +-f +-v 3 +-l ECDH-ECDSA-AES256-SHA384 +-A ./certs/ca-ecc-cert.pem + +# server TLSv1.2 ECDHE-PSK-AES128-SHA256 +-s +-u +-f +-v 3 +-l ECDHE-PSK-AES128-SHA256 + +# client TLSv1.2 ECDHE-PSK-AES128-SHA256 +-s +-u +-f +-v 3 +-l ECDHE-PSK-AES128-SHA256 + +# server TLSv1.2 ECDHE-PSK-NULL-SHA256 +-s +-u +-f +-v 3 +-l ECDHE-PSK-NULL-SHA256 + +# client TLSv1.2 ECDHE-PSK-NULL-SHA256 +-s +-u +-f +-v 3 +-l ECDHE-PSK-NULL-SHA256 + +# server DTLSv1 PSK-AES128 +-s +-u +-f +-v 2 +-l PSK-AES128-CBC-SHA + +# client DTLSv1 PSK-AES128 +-s +-u +-f +-v 2 +-l PSK-AES128-CBC-SHA + +# server DTLSv1 PSK-AES256 +-s +-u +-f +-v 2 +-l PSK-AES256-CBC-SHA + +# client DTLSv1 PSK-AES256 +-s +-u +-f +-v 2 +-l PSK-AES256-CBC-SHA + +# server DTLSv1.2 PSK-AES128 +-s +-u +-f +-v 3 +-l PSK-AES128-CBC-SHA + +# client DTLSv1.2 PSK-AES128 +-s +-u +-f +-v 3 +-l PSK-AES128-CBC-SHA + +# server DTLSv1.2 PSK-AES256 +-s +-u +-f +-v 3 +-l PSK-AES256-CBC-SHA + +# client DTLSv1.2 PSK-AES256 +-s +-u +-f +-v 3 +-l PSK-AES256-CBC-SHA + +# server DTLSv1.2 PSK-AES128-SHA256 +-s +-u +-f +-v 3 +-l PSK-AES128-CBC-SHA256 + +# client DTLSv1.2 PSK-AES128-SHA256 +-s +-u +-f +-v 3 +-l PSK-AES128-CBC-SHA256 + +# server DTLSv1.2 PSK-AES256-SHA384 +-s +-u +-f +-v 3 +-l PSK-AES256-CBC-SHA384 + +# client DTLSv1.2 PSK-AES256-SHA384 +-s +-u +-f +-v 3 +-l PSK-AES256-CBC-SHA384 + +# server DTLSv1.2 ECDHE-ECDSA-AES128-GCM-SHA256 +-u +-f +-v 3 +-l ECDHE-ECDSA-AES128-GCM-SHA256 +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.2 ECDHE-ECDSA-AES128-GCM-SHA256 +-u +-f +-v 3 +-l ECDHE-ECDSA-AES128-GCM-SHA256 +-A ./certs/ca-ecc-cert.pem + +# server DTLSv1.2 ECDHE-ECDSA-AES256-GCM-SHA384 +-u +-f +-v 3 +-l ECDHE-ECDSA-AES256-GCM-SHA384 +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.2 ECDHE-ECDSA-AES256-GCM-SHA384 +-u +-f +-v 3 +-l ECDHE-ECDSA-AES256-GCM-SHA384 +-A ./certs/ca-ecc-cert.pem + +# server DTLSv1.2 ECDH-ECDSA-AES128-GCM-SHA256 +-u +-f +-v 3 +-l ECDH-ECDSA-AES128-GCM-SHA256 +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.2 ECDH-ECDSA-AES128-GCM-SHA256 +-u +-f +-v 3 +-l ECDH-ECDSA-AES128-GCM-SHA256 +-A ./certs/ca-ecc-cert.pem + +# server DTLSv1.2 ECDH-ECDSA-AES256-GCM-SHA384 +-u +-f +-v 3 +-l ECDH-ECDSA-AES256-GCM-SHA384 +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.2 ECDH-ECDSA-AES256-GCM-SHA384 +-u +-f +-v 3 +-l ECDH-ECDSA-AES256-GCM-SHA384 +-A ./certs/ca-ecc-cert.pem + +# server DTLSv1.2 ECDHE-RSA-AES128-GCM-SHA256 +-u +-f +-v 3 +-l ECDHE-RSA-AES128-GCM-SHA256 + +# client DTLSv1.2 ECDHE-RSA-AES128-GCM-SHA256 +-u +-f +-v 3 +-l ECDHE-RSA-AES128-GCM-SHA256 + +# server DTLSv1.2 ECDHE-RSA-AES256-GCM-SHA384 +-u +-f +-v 3 +-l ECDHE-RSA-AES256-GCM-SHA384 + +# client DTLSv1.2 ECDHE-RSA-AES256-GCM-SHA384 +-u +-f +-v 3 +-l ECDHE-RSA-AES256-GCM-SHA384 + +# server DTLSv1.2 ECDH-RSA-AES128-GCM-SHA256 +-u +-f +-v 3 +-l ECDH-RSA-AES128-GCM-SHA256 +-c ./certs/server-ecc-rsa.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.2 ECDH-RSA-AES128-GCM-SHA256 +-u +-f +-v 3 +-l ECDH-RSA-AES128-GCM-SHA256 + +# server DTLSv1.2 ECDH-RSA-AES256-GCM-SHA384 +-u +-f +-v 3 +-l ECDH-RSA-AES256-GCM-SHA384 +-c ./certs/server-ecc-rsa.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.2 ECDH-RSA-AES256-GCM-SHA384 +-u +-f +-v 3 +-l ECDH-RSA-AES256-GCM-SHA384 + +# server DTLSv1.2 PSK-AES128-GCM-SHA256 +-u +-f +-s +-v 3 +-l PSK-AES128-GCM-SHA256 + +# client DTLSv1.2 PSK-AES128-GCM-SHA256 +-u +-f +-s +-v 3 +-l PSK-AES128-GCM-SHA256 + +# server DTLSv1.2 PSK-AES256-GCM-SHA384 +-u +-f +-s +-v 3 +-l PSK-AES256-GCM-SHA384 + +# client DTLSv1.2 PSK-AES256-GCM-SHA384 +-u +-f +-s +-v 3 +-l PSK-AES256-GCM-SHA384 + +# server DTLSv1.2 ECDHE-ECDSA-AES128-CCM +-u +-f +-v 3 +-l ECDHE-ECDSA-AES128-CCM +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.2 ECDHE-ECDSA-AES128-CCM +-u +-f +-v 3 +-l ECDHE-ECDSA-AES128-CCM +-A ./certs/ca-ecc-cert.pem + +# server DTLSv1.2 ECDHE-ECDSA-AES128-CCM-8 +-u +-f +-v 3 +-l ECDHE-ECDSA-AES128-CCM-8 +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.2 ECDHE-ECDSA-AES128-CCM-8 +-u +-f +-v 3 +-l ECDHE-ECDSA-AES128-CCM-8 +-A ./certs/ca-ecc-cert.pem + +# server DTLSv1.2 ECDHE-ECDSA-AES256-CCM-8 +-u +-f +-v 3 +-l ECDHE-ECDSA-AES256-CCM-8 +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.2 ECDHE-ECDSA-AES256-CCM-8 +-u +-f +-v 3 +-l ECDHE-ECDSA-AES256-CCM-8 +-A ./certs/ca-ecc-cert.pem + +# server DTLSv1.2 ADH-AES128-SHA +-u +-f +-a +-v 3 +-l ADH-AES128-SHA + +# client DTLSv1.2 ADH-AES128-SHA +-u +-f +-a +-v 3 +-l ADH-AES128-SHA + +# server DTLSv1.0 ADH-AES128-SHA +-u +-f +-a +-v 2 +-l ADH-AES128-SHA + +# client DTLSv1.0 ADH-AES128-SHA +-u +-f +-a +-v 2 +-l ADH-AES128-SHA diff --git a/tests/test-dtls-reneg-client.conf b/tests/test-dtls-reneg-client.conf new file mode 100644 index 000000000..bb405c16d --- /dev/null +++ b/tests/test-dtls-reneg-client.conf @@ -0,0 +1,1045 @@ +# server DTLSv1.2 DHE-RSA-CHACHA20-POLY1305 +-M +-u +-v 3 +-l DHE-RSA-CHACHA20-POLY1305 + +# client DTLSv1.2 DHE-RSA-CHACHA20-POLY1305 +-i +-u +-v 3 +-l DHE-RSA-CHACHA20-POLY1305 + +# server DTLSv1.2 ECDHE-RSA-CHACHA20-POLY1305 +-M +-u +-v 3 +-l ECDHE-RSA-CHACHA20-POLY1305 + +# client DTLSv1.2 ECDHE-RSA-CHACHA20-POLY1305 +-i +-u +-v 3 +-l ECDHE-RSA-CHACHA20-POLY1305 + +# server DTLSv1.2 ECDHE-EDCSA-CHACHA20-POLY1305 +-M +-u +-v 3 +-l ECDHE-ECDSA-CHACHA20-POLY1305 +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.2 ECDHE-ECDSA-CHACHA20-POLY1305 +-i +-u +-v 3 +-l ECDHE-ECDSA-CHACHA20-POLY1305 +-A ./certs/ca-ecc-cert.pem + +# server TLSv1.2 DHE-PSK-CHACHA20-POLY1305 +-M +-u +-v 3 +-s +-l DHE-PSK-CHACHA20-POLY1305 + +# client TLSv1.2 DHE-PSK-CHACHA20-POLY1305 +-i +-u +-v 3 +-s +-l DHE-PSK-CHACHA20-POLY1305 + +# server TLSv1.2 ECDHE-PSK-CHACHA20-POLY1305 +-M +-u +-v 3 +-s +-l ECDHE-PSK-CHACHA20-POLY1305 + +# client TLSv1.2 ECDHE-PSK-CHACHA20-POLY1305 +-i +-u +-v 3 +-s +-l ECDHE-PSK-CHACHA20-POLY1305 + +# server TLSv1.2 PSK-CHACHA20-POLY1305 +-M +-u +-v 3 +-s +-l PSK-CHACHA20-POLY1305 + +# client TLSv1.2 PSK-CHACHA20-POLY1305 +-i +-u +-v 3 +-s +-l PSK-CHACHA20-POLY1305 + +# server DTLSv1.2 DHE-RSA-CHACHA20-POLY1305-OLD +-M +-u +-v 3 +-l DHE-RSA-CHACHA20-POLY1305-OLD + +# client DTLSv1.2 DHE-RSA-CHACHA20-POLY1305-OLD +-i +-u +-v 3 +-l DHE-RSA-CHACHA20-POLY1305-OLD + +# server DTLSv1.2 ECDHE-RSA-CHACHA20-POLY1305-OLD +-M +-u +-v 3 +-l ECDHE-RSA-CHACHA20-POLY1305-OLD + +# client DTLSv1.2 ECDHE-RSA-CHACHA20-POLY1305-OLD +-i +-u +-v 3 +-l ECDHE-RSA-CHACHA20-POLY1305-OLD + +# server DTLSv1.2 ECDHE-EDCSA-CHACHA20-POLY1305-OLD +-M +-u +-v 3 +-l ECDHE-ECDSA-CHACHA20-POLY1305-OLD +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.2 ECDHE-ECDSA-CHACHA20-POLY1305-OLD +-i +-u +-v 3 +-l ECDHE-ECDSA-CHACHA20-POLY1305-OLD +-A ./certs/ca-ecc-cert.pem + +# server DTLSv1 IDEA-CBC-SHA +-M +-u +-v 2 +-l IDEA-CBC-SHA + +# client DTLSv1 IDEA-CBC-SHA +-i +-u +-v 2 +-l IDEA-CBC-SHA + +# server DTLSv1 DES-CBC3-SHA +-M +-u +-v 2 +-l DES-CBC3-SHA + +# client DTLSv1 DES-CBC3-SHA +-i +-u +-v 2 +-l DES-CBC3-SHA + +# server DTLSv1.2 DES-CBC3-SHA +-M +-u +-v 3 +-l DES-CBC3-SHA + +# client DTLSv1.2 DES-CBC3-SHA +-i +-u +-v 3 +-l DES-CBC3-SHA + +# server DTLSv1 AES128-SHA +-M +-u +-v 2 +-l AES128-SHA + +# client DTLSv1 AES128-SHA +-i +-u +-v 2 +-l AES128-SHA + +# server DTLSv1.2 AES128-SHA +-M +-u +-v 3 +-l AES128-SHA + +# client DTLSv1.2 AES128-SHA +-i +-u +-v 3 +-l AES128-SHA + +# server DTLSv1 AES256-SHA +-M +-u +-v 2 +-l AES256-SHA + +# client DTLSv1 AES256-SHA +-i +-u +-v 2 +-l AES256-SHA + +# server DTLSv1.2 AES256-SHA +-M +-u +-v 3 +-l AES256-SHA + +# client DTLSv1.2 AES256-SHA +-i +-u +-v 3 +-l AES256-SHA + +# server DTLSv1.2 AES128-SHA256 +-M +-u +-v 3 +-l AES128-SHA256 + +# client DTLSv1.2 AES128-SHA256 +-i +-u +-v 3 +-l AES128-SHA256 + +# server DTLSv1.2 AES256-SHA256 +-M +-u +-v 3 +-l AES256-SHA256 + +# client DTLSv1.2 AES256-SHA256 +-i +-u +-v 3 +-l AES256-SHA256 + +# server DTLSv1.1 ECDHE-RSA-DES3 +-M +-u +-v 2 +-l ECDHE-RSA-DES-CBC3-SHA + +# client DTLSv1.1 ECDHE-RSA-DES3 +-i +-u +-v 2 +-l ECDHE-RSA-DES-CBC3-SHA + +# server DTLSv1.1 ECDHE-RSA-AES128 +-M +-u +-v 2 +-l ECDHE-RSA-AES128-SHA + +# client DTLSv1.1 ECDHE-RSA-AES128 +-i +-u +-v 2 +-l ECDHE-RSA-AES128-SHA + +# server DTLSv1.1 ECDHE-RSA-AES256 +-M +-u +-v 2 +-l ECDHE-RSA-AES256-SHA + +# client DTLSv1.1 ECDHE-RSA-AES256 +-i +-u +-v 2 +-l ECDHE-RSA-AES256-SHA + +# server DTLSv1.2 ECDHE-RSA-DES3 +-M +-u +-v 3 +-l ECDHE-RSA-DES-CBC3-SHA + +# client DTLSv1.2 ECDHE-RSA-DES3 +-i +-u +-v 3 +-l ECDHE-RSA-DES-CBC3-SHA + +# server DTLSv1.2 ECDHE-RSA-AES128 +-M +-u +-v 3 +-l ECDHE-RSA-AES128-SHA + +# client DTLSv1.2 ECDHE-RSA-AES128 +-i +-u +-v 3 +-l ECDHE-RSA-AES128-SHA + +# server DTLSv1.2 ECDHE-RSA-AES128-SHA256 +-M +-u +-v 3 +-l ECDHE-RSA-AES128-SHA256 + +# client DTLSv1.2 ECDHE-RSA-AES128-SHA256 +-i +-u +-v 3 +-l ECDHE-RSA-AES128-SHA256 + +# server DTLSv1.2 ECDHE-RSA-AES256 +-M +-u +-v 3 +-l ECDHE-RSA-AES256-SHA + +# client DTLSv1.2 ECDHE-RSA-AES256 +-i +-u +-v 3 +-l ECDHE-RSA-AES256-SHA + +# server TLSv1 ECDHE-ECDSA-NULL-SHA +-M +-u +-v 1 +-l ECDHE-ECDSA-NULL-SHA +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client TLSv1 ECDHE-ECDSA-NULL-SHA +-i +-u +-v 1 +-l ECDHE-ECDSA-NULL-SHA +-A ./certs/ca-ecc-cert.pem + +# server TLSv1.1 ECDHE-ECDSA-NULL-SHA +-M +-u +-v 2 +-l ECDHE-ECDSA-NULL-SHA +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client TLSv1 ECDHE-ECDSA-NULL-SHA +-i +-u +-v 2 +-l ECDHE-ECDSA-NULL-SHA +-A ./certs/ca-ecc-cert.pem + +# server TLSv1.2 ECDHE-ECDSA-NULL-SHA +-M +-u +-v 3 +-l ECDHE-ECDSA-NULL-SHA +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client TLSv1.2 ECDHE-ECDSA-NULL-SHA +-i +-u +-v 3 +-l ECDHE-ECDSA-NULL-SHA +-A ./certs/ca-ecc-cert.pem + +# server DTLSv1.1 ECDHE-ECDSA-DES3 +-M +-u +-v 2 +-l ECDHE-ECDSA-DES-CBC3-SHA +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.1 ECDHE-ECDSA-DES3 +-i +-u +-v 2 +-l ECDHE-ECDSA-DES-CBC3-SHA +-A ./certs/ca-ecc-cert.pem + +# server DTLSv1.1 ECDHE-ECDSA-AES128 +-M +-u +-v 2 +-l ECDHE-ECDSA-AES128-SHA +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.1 ECDHE-ECDSA-AES128 +-i +-u +-v 2 +-l ECDHE-ECDSA-AES128-SHA +-A ./certs/ca-ecc-cert.pem + +# server DTLSv1.1 ECDHE-ECDSA-AES256 +-M +-u +-v 2 +-l ECDHE-ECDSA-AES256-SHA +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.1 ECDHE-ECDSA-AES256 +-i +-u +-v 2 +-l ECDHE-ECDSA-AES256-SHA +-A ./certs/ca-ecc-cert.pem + +# server DTLSv1.2 ECDHE-ECDSA-DES3 +-M +-u +-v 3 +-l ECDHE-ECDSA-DES-CBC3-SHA +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.2 ECDHE-ECDSA-DES3 +-i +-u +-v 3 +-l ECDHE-ECDSA-DES-CBC3-SHA +-A ./certs/ca-ecc-cert.pem + +# server DTLSv1.2 ECDHE-ECDSA-AES128 +-M +-u +-v 3 +-l ECDHE-ECDSA-AES128-SHA +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.2 ECDHE-ECDSA-AES128 +-i +-u +-v 3 +-l ECDHE-ECDSA-AES128-SHA +-A ./certs/ca-ecc-cert.pem + +# server DTLSv1.2 ECDHE-ECDSA-AES128-SHA256 +-M +-u +-v 3 +-l ECDHE-ECDSA-AES128-SHA256 +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.2 ECDHE-ECDSA-AES128-SHA256 +-i +-u +-v 3 +-l ECDHE-ECDSA-AES128-SHA256 +-A ./certs/ca-ecc-cert.pem + +# server DTLSv1.2 ECDHE-ECDSA-AES256 +-M +-u +-v 3 +-l ECDHE-ECDSA-AES256-SHA +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.2 ECDHE-ECDSA-AES256 +-i +-u +-v 3 +-l ECDHE-ECDSA-AES256-SHA +-A ./certs/ca-ecc-cert.pem + +# server DTLSv1.1 ECDH-RSA-DES3 +-M +-u +-v 2 +-l ECDH-RSA-DES-CBC3-SHA +-c ./certs/server-ecc-rsa.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.1 ECDH-RSA-DES3 +-i +-u +-v 2 +-l ECDH-RSA-DES-CBC3-SHA + +# server DTLSv1.1 ECDH-RSA-AES128 +-M +-u +-v 2 +-l ECDH-RSA-AES128-SHA +-c ./certs/server-ecc-rsa.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.1 ECDH-RSA-AES128 +-i +-u +-v 2 +-l ECDH-RSA-AES128-SHA + +# server DTLSv1.1 ECDH-RSA-AES256 +-M +-u +-v 2 +-l ECDH-RSA-AES256-SHA +-c ./certs/server-ecc-rsa.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.1 ECDH-RSA-AES256 +-i +-u +-v 2 +-l ECDH-RSA-AES256-SHA + +# server DTLSv1.2 ECDH-RSA-DES3 +-M +-u +-v 3 +-l ECDH-RSA-DES-CBC3-SHA +-c ./certs/server-ecc-rsa.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.2 ECDH-RSA-DES3 +-i +-u +-v 3 +-l ECDH-RSA-DES-CBC3-SHA + +# server DTLSv1.2 ECDH-RSA-AES128 +-M +-u +-v 3 +-l ECDH-RSA-AES128-SHA +-c ./certs/server-ecc-rsa.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.2 ECDH-RSA-AES128 +-i +-u +-v 3 +-l ECDH-RSA-AES128-SHA + +# server DTLSv1.2 ECDH-RSA-AES128-SHA256 +-M +-u +-v 3 +-l ECDH-RSA-AES128-SHA256 +-c ./certs/server-ecc-rsa.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.2 ECDH-RSA-AES128-SHA256 +-i +-u +-v 3 +-l ECDH-RSA-AES128-SHA256 + +# server DTLSv1.2 ECDH-RSA-AES256 +-M +-u +-v 3 +-l ECDH-RSA-AES256-SHA +-c ./certs/server-ecc-rsa.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.2 ECDH-RSA-AES256 +-i +-u +-v 3 +-l ECDH-RSA-AES256-SHA + +# server DTLSv1.1 ECDH-ECDSA-DES3 +-M +-u +-v 2 +-l ECDH-ECDSA-DES-CBC3-SHA +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.1 ECDH-ECDSA-DES3 +-i +-u +-v 2 +-l ECDH-ECDSA-DES-CBC3-SHA +-A ./certs/ca-ecc-cert.pem + +# server DTLSv1.1 ECDH-ECDSA-AES128 +-M +-u +-v 2 +-l ECDH-ECDSA-AES128-SHA +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.1 ECDH-ECDSA-AES128 +-i +-u +-v 2 +-l ECDH-ECDSA-AES128-SHA +-A ./certs/ca-ecc-cert.pem + +# server DTLSv1.1 ECDH-ECDSA-AES256 +-M +-u +-v 2 +-l ECDH-ECDSA-AES256-SHA +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.1 ECDH-ECDSA-AES256 +-i +-u +-v 2 +-l ECDH-ECDSA-AES256-SHA +-A ./certs/ca-ecc-cert.pem + +# server DTLSv1.2 ECDH-ECDSA-DES3 +-M +-u +-v 3 +-l ECDH-ECDSA-DES-CBC3-SHA +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.2 ECDH-ECDSA-DES3 +-i +-u +-v 3 +-l ECDH-ECDSA-DES-CBC3-SHA +-A ./certs/ca-ecc-cert.pem + +# server DTLSv1.2 ECDH-ECDSA-AES128 +-M +-u +-v 3 +-l ECDH-ECDSA-AES128-SHA +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.2 ECDH-ECDSA-AES128 +-i +-u +-v 3 +-l ECDH-ECDSA-AES128-SHA +-A ./certs/ca-ecc-cert.pem + +# server DTLSv1.2 ECDH-ECDSA-AES128-SHA256 +-M +-u +-v 3 +-l ECDH-ECDSA-AES128-SHA256 +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.2 ECDH-ECDSA-AES128-SHA256 +-i +-u +-v 3 +-l ECDH-ECDSA-AES128-SHA256 +-A ./certs/ca-ecc-cert.pem + +# server DTLSv1.2 ECDH-ECDSA-AES256 +-M +-u +-v 3 +-l ECDH-ECDSA-AES256-SHA +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.2 ECDH-ECDSA-AES256 +-i +-u +-v 3 +-l ECDH-ECDSA-AES256-SHA +-A ./certs/ca-ecc-cert.pem + +# server DTLSv1.2 ECDHE-RSA-AES256-SHA384 +-M +-u +-v 3 +-l ECDHE-RSA-AES256-SHA384 + +# client DTLSv1.2 ECDHE-RSA-AES256-SHA384 +-i +-u +-v 3 +-l ECDHE-RSA-AES256-SHA384 + +# server DTLSv1.2 ECDHE-ECDSA-AES256-SHA384 +-M +-u +-v 3 +-l ECDHE-ECDSA-AES256-SHA384 +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.2 ECDHE-ECDSA-AES256-SHA384 +-i +-u +-v 3 +-l ECDHE-ECDSA-AES256-SHA384 +-A ./certs/ca-ecc-cert.pem + +# server DTLSv1.2 ECDH-RSA-AES256-SHA384 +-M +-u +-v 3 +-l ECDH-RSA-AES256-SHA384 +-c ./certs/server-ecc-rsa.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.2 ECDH-RSA-AES256-SHA384 +-i +-u +-v 3 +-l ECDH-RSA-AES256-SHA384 + +# server DTLSv1.2 ECDH-ECDSA-AES256-SHA384 +-M +-u +-v 3 +-l ECDH-ECDSA-AES256-SHA384 +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.2 ECDH-ECDSA-AES256-SHA384 +-i +-u +-v 3 +-l ECDH-ECDSA-AES256-SHA384 +-A ./certs/ca-ecc-cert.pem + +# server TLSv1.2 ECDHE-PSK-AES128-SHA256 +-M +-s +-u +-v 3 +-l ECDHE-PSK-AES128-SHA256 + +# client TLSv1.2 ECDHE-PSK-AES128-SHA256 +-i +-s +-u +-v 3 +-l ECDHE-PSK-AES128-SHA256 + +# server TLSv1.2 ECDHE-PSK-NULL-SHA256 +-M +-s +-u +-v 3 +-l ECDHE-PSK-NULL-SHA256 + +# client TLSv1.2 ECDHE-PSK-NULL-SHA256 +-i +-s +-u +-v 3 +-l ECDHE-PSK-NULL-SHA256 + +# server DTLSv1 PSK-AES128 +-M +-s +-u +-v 2 +-l PSK-AES128-CBC-SHA + +# client DTLSv1 PSK-AES128 +-i +-s +-u +-v 2 +-l PSK-AES128-CBC-SHA + +# server DTLSv1 PSK-AES256 +-M +-s +-u +-v 2 +-l PSK-AES256-CBC-SHA + +# client DTLSv1 PSK-AES256 +-i +-s +-u +-v 2 +-l PSK-AES256-CBC-SHA + +# server DTLSv1.2 PSK-AES128 +-M +-s +-u +-v 3 +-l PSK-AES128-CBC-SHA + +# client DTLSv1.2 PSK-AES128 +-i +-s +-u +-v 3 +-l PSK-AES128-CBC-SHA + +# server DTLSv1.2 PSK-AES256 +-M +-s +-u +-v 3 +-l PSK-AES256-CBC-SHA + +# client DTLSv1.2 PSK-AES256 +-i +-s +-u +-v 3 +-l PSK-AES256-CBC-SHA + +# server DTLSv1.2 PSK-AES128-SHA256 +-M +-s +-u +-v 3 +-l PSK-AES128-CBC-SHA256 + +# client DTLSv1.2 PSK-AES128-SHA256 +-i +-s +-u +-v 3 +-l PSK-AES128-CBC-SHA256 + +# server DTLSv1.2 PSK-AES256-SHA384 +-M +-s +-u +-v 3 +-l PSK-AES256-CBC-SHA384 + +# client DTLSv1.2 PSK-AES256-SHA384 +-i +-s +-u +-v 3 +-l PSK-AES256-CBC-SHA384 + +# server DTLSv1.2 ECDHE-ECDSA-AES128-GCM-SHA256 +-M +-u +-v 3 +-l ECDHE-ECDSA-AES128-GCM-SHA256 +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.2 ECDHE-ECDSA-AES128-GCM-SHA256 +-i +-u +-v 3 +-l ECDHE-ECDSA-AES128-GCM-SHA256 +-A ./certs/ca-ecc-cert.pem + +# server DTLSv1.2 ECDHE-ECDSA-AES256-GCM-SHA384 +-M +-u +-v 3 +-l ECDHE-ECDSA-AES256-GCM-SHA384 +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.2 ECDHE-ECDSA-AES256-GCM-SHA384 +-i +-u +-v 3 +-l ECDHE-ECDSA-AES256-GCM-SHA384 +-A ./certs/ca-ecc-cert.pem + +# server DTLSv1.2 ECDH-ECDSA-AES128-GCM-SHA256 +-M +-u +-v 3 +-l ECDH-ECDSA-AES128-GCM-SHA256 +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.2 ECDH-ECDSA-AES128-GCM-SHA256 +-i +-u +-v 3 +-l ECDH-ECDSA-AES128-GCM-SHA256 +-A ./certs/ca-ecc-cert.pem + +# server DTLSv1.2 ECDH-ECDSA-AES256-GCM-SHA384 +-M +-u +-v 3 +-l ECDH-ECDSA-AES256-GCM-SHA384 +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.2 ECDH-ECDSA-AES256-GCM-SHA384 +-i +-u +-v 3 +-l ECDH-ECDSA-AES256-GCM-SHA384 +-A ./certs/ca-ecc-cert.pem + +# server DTLSv1.2 ECDHE-RSA-AES128-GCM-SHA256 +-M +-u +-v 3 +-l ECDHE-RSA-AES128-GCM-SHA256 + +# client DTLSv1.2 ECDHE-RSA-AES128-GCM-SHA256 +-i +-u +-v 3 +-l ECDHE-RSA-AES128-GCM-SHA256 + +# server DTLSv1.2 ECDHE-RSA-AES256-GCM-SHA384 +-M +-u +-v 3 +-l ECDHE-RSA-AES256-GCM-SHA384 + +# client DTLSv1.2 ECDHE-RSA-AES256-GCM-SHA384 +-i +-u +-v 3 +-l ECDHE-RSA-AES256-GCM-SHA384 + +# server DTLSv1.2 ECDH-RSA-AES128-GCM-SHA256 +-M +-u +-v 3 +-l ECDH-RSA-AES128-GCM-SHA256 +-c ./certs/server-ecc-rsa.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.2 ECDH-RSA-AES128-GCM-SHA256 +-i +-u +-v 3 +-l ECDH-RSA-AES128-GCM-SHA256 + +# server DTLSv1.2 ECDH-RSA-AES256-GCM-SHA384 +-M +-u +-v 3 +-l ECDH-RSA-AES256-GCM-SHA384 +-c ./certs/server-ecc-rsa.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.2 ECDH-RSA-AES256-GCM-SHA384 +-i +-u +-v 3 +-l ECDH-RSA-AES256-GCM-SHA384 + +# server DTLSv1.2 PSK-AES128-GCM-SHA256 +-M +-u +-s +-v 3 +-l PSK-AES128-GCM-SHA256 + +# client DTLSv1.2 PSK-AES128-GCM-SHA256 +-i +-u +-s +-v 3 +-l PSK-AES128-GCM-SHA256 + +# server DTLSv1.2 PSK-AES256-GCM-SHA384 +-M +-u +-s +-v 3 +-l PSK-AES256-GCM-SHA384 + +# client DTLSv1.2 PSK-AES256-GCM-SHA384 +-i +-u +-s +-v 3 +-l PSK-AES256-GCM-SHA384 + +# server DTLSv1.2 ECDHE-ECDSA-AES128-CCM +-M +-u +-v 3 +-l ECDHE-ECDSA-AES128-CCM +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.2 ECDHE-ECDSA-AES128-CCM +-i +-u +-v 3 +-l ECDHE-ECDSA-AES128-CCM +-A ./certs/ca-ecc-cert.pem + +# server DTLSv1.2 ECDHE-ECDSA-AES128-CCM-8 +-M +-u +-v 3 +-l ECDHE-ECDSA-AES128-CCM-8 +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.2 ECDHE-ECDSA-AES128-CCM-8 +-i +-u +-v 3 +-l ECDHE-ECDSA-AES128-CCM-8 +-A ./certs/ca-ecc-cert.pem + +# server DTLSv1.2 ECDHE-ECDSA-AES256-CCM-8 +-M +-u +-v 3 +-l ECDHE-ECDSA-AES256-CCM-8 +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.2 ECDHE-ECDSA-AES256-CCM-8 +-i +-u +-v 3 +-l ECDHE-ECDSA-AES256-CCM-8 +-A ./certs/ca-ecc-cert.pem + +# server DTLSv1.2 ADH-AES128-SHA +-M +-u +-a +-v 3 +-l ADH-AES128-SHA + +# client DTLSv1.2 ADH-AES128-SHA +-i +-u +-a +-v 3 +-l ADH-AES128-SHA + +# server DTLSv1.0 ADH-AES128-SHA +-M +-u +-a +-v 2 +-l ADH-AES128-SHA + +# client DTLSv1.0 ADH-AES128-SHA +-i +-u +-a +-v 2 +-l ADH-AES128-SHA diff --git a/tests/test-dtls-reneg-server.conf b/tests/test-dtls-reneg-server.conf new file mode 100644 index 000000000..eba8e7917 --- /dev/null +++ b/tests/test-dtls-reneg-server.conf @@ -0,0 +1,1045 @@ +# server DTLSv1.2 DHE-RSA-CHACHA20-POLY1305 +-m +-u +-v 3 +-l DHE-RSA-CHACHA20-POLY1305 + +# client DTLSv1.2 DHE-RSA-CHACHA20-POLY1305 +-R +-u +-v 3 +-l DHE-RSA-CHACHA20-POLY1305 + +# server DTLSv1.2 ECDHE-RSA-CHACHA20-POLY1305 +-m +-u +-v 3 +-l ECDHE-RSA-CHACHA20-POLY1305 + +# client DTLSv1.2 ECDHE-RSA-CHACHA20-POLY1305 +-R +-u +-v 3 +-l ECDHE-RSA-CHACHA20-POLY1305 + +# server DTLSv1.2 ECDHE-EDCSA-CHACHA20-POLY1305 +-m +-u +-v 3 +-l ECDHE-ECDSA-CHACHA20-POLY1305 +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.2 ECDHE-ECDSA-CHACHA20-POLY1305 +-R +-u +-v 3 +-l ECDHE-ECDSA-CHACHA20-POLY1305 +-A ./certs/ca-ecc-cert.pem + +# server TLSv1.2 DHE-PSK-CHACHA20-POLY1305 +-m +-u +-v 3 +-s +-l DHE-PSK-CHACHA20-POLY1305 + +# client TLSv1.2 DHE-PSK-CHACHA20-POLY1305 +-R +-u +-v 3 +-s +-l DHE-PSK-CHACHA20-POLY1305 + +# server TLSv1.2 ECDHE-PSK-CHACHA20-POLY1305 +-m +-u +-v 3 +-s +-l ECDHE-PSK-CHACHA20-POLY1305 + +# client TLSv1.2 ECDHE-PSK-CHACHA20-POLY1305 +-R +-u +-v 3 +-s +-l ECDHE-PSK-CHACHA20-POLY1305 + +# server TLSv1.2 PSK-CHACHA20-POLY1305 +-m +-u +-v 3 +-s +-l PSK-CHACHA20-POLY1305 + +# client TLSv1.2 PSK-CHACHA20-POLY1305 +-R +-u +-v 3 +-s +-l PSK-CHACHA20-POLY1305 + +# server DTLSv1.2 DHE-RSA-CHACHA20-POLY1305-OLD +-m +-u +-v 3 +-l DHE-RSA-CHACHA20-POLY1305-OLD + +# client DTLSv1.2 DHE-RSA-CHACHA20-POLY1305-OLD +-R +-u +-v 3 +-l DHE-RSA-CHACHA20-POLY1305-OLD + +# server DTLSv1.2 ECDHE-RSA-CHACHA20-POLY1305-OLD +-m +-u +-v 3 +-l ECDHE-RSA-CHACHA20-POLY1305-OLD + +# client DTLSv1.2 ECDHE-RSA-CHACHA20-POLY1305-OLD +-R +-u +-v 3 +-l ECDHE-RSA-CHACHA20-POLY1305-OLD + +# server DTLSv1.2 ECDHE-EDCSA-CHACHA20-POLY1305-OLD +-m +-u +-v 3 +-l ECDHE-ECDSA-CHACHA20-POLY1305-OLD +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.2 ECDHE-ECDSA-CHACHA20-POLY1305-OLD +-R +-u +-v 3 +-l ECDHE-ECDSA-CHACHA20-POLY1305-OLD +-A ./certs/ca-ecc-cert.pem + +# server DTLSv1 IDEA-CBC-SHA +-m +-u +-v 2 +-l IDEA-CBC-SHA + +# client DTLSv1 IDEA-CBC-SHA +-R +-u +-v 2 +-l IDEA-CBC-SHA + +# server DTLSv1 DES-CBC3-SHA +-m +-u +-v 2 +-l DES-CBC3-SHA + +# client DTLSv1 DES-CBC3-SHA +-R +-u +-v 2 +-l DES-CBC3-SHA + +# server DTLSv1.2 DES-CBC3-SHA +-m +-u +-v 3 +-l DES-CBC3-SHA + +# client DTLSv1.2 DES-CBC3-SHA +-R +-u +-v 3 +-l DES-CBC3-SHA + +# server DTLSv1 AES128-SHA +-m +-u +-v 2 +-l AES128-SHA + +# client DTLSv1 AES128-SHA +-R +-u +-v 2 +-l AES128-SHA + +# server DTLSv1.2 AES128-SHA +-m +-u +-v 3 +-l AES128-SHA + +# client DTLSv1.2 AES128-SHA +-R +-u +-v 3 +-l AES128-SHA + +# server DTLSv1 AES256-SHA +-m +-u +-v 2 +-l AES256-SHA + +# client DTLSv1 AES256-SHA +-R +-u +-v 2 +-l AES256-SHA + +# server DTLSv1.2 AES256-SHA +-m +-u +-v 3 +-l AES256-SHA + +# client DTLSv1.2 AES256-SHA +-R +-u +-v 3 +-l AES256-SHA + +# server DTLSv1.2 AES128-SHA256 +-m +-u +-v 3 +-l AES128-SHA256 + +# client DTLSv1.2 AES128-SHA256 +-R +-u +-v 3 +-l AES128-SHA256 + +# server DTLSv1.2 AES256-SHA256 +-m +-u +-v 3 +-l AES256-SHA256 + +# client DTLSv1.2 AES256-SHA256 +-R +-u +-v 3 +-l AES256-SHA256 + +# server DTLSv1.1 ECDHE-RSA-DES3 +-m +-u +-v 2 +-l ECDHE-RSA-DES-CBC3-SHA + +# client DTLSv1.1 ECDHE-RSA-DES3 +-R +-u +-v 2 +-l ECDHE-RSA-DES-CBC3-SHA + +# server DTLSv1.1 ECDHE-RSA-AES128 +-m +-u +-v 2 +-l ECDHE-RSA-AES128-SHA + +# client DTLSv1.1 ECDHE-RSA-AES128 +-R +-u +-v 2 +-l ECDHE-RSA-AES128-SHA + +# server DTLSv1.1 ECDHE-RSA-AES256 +-m +-u +-v 2 +-l ECDHE-RSA-AES256-SHA + +# client DTLSv1.1 ECDHE-RSA-AES256 +-R +-u +-v 2 +-l ECDHE-RSA-AES256-SHA + +# server DTLSv1.2 ECDHE-RSA-DES3 +-m +-u +-v 3 +-l ECDHE-RSA-DES-CBC3-SHA + +# client DTLSv1.2 ECDHE-RSA-DES3 +-R +-u +-v 3 +-l ECDHE-RSA-DES-CBC3-SHA + +# server DTLSv1.2 ECDHE-RSA-AES128 +-m +-u +-v 3 +-l ECDHE-RSA-AES128-SHA + +# client DTLSv1.2 ECDHE-RSA-AES128 +-R +-u +-v 3 +-l ECDHE-RSA-AES128-SHA + +# server DTLSv1.2 ECDHE-RSA-AES128-SHA256 +-m +-u +-v 3 +-l ECDHE-RSA-AES128-SHA256 + +# client DTLSv1.2 ECDHE-RSA-AES128-SHA256 +-R +-u +-v 3 +-l ECDHE-RSA-AES128-SHA256 + +# server DTLSv1.2 ECDHE-RSA-AES256 +-m +-u +-v 3 +-l ECDHE-RSA-AES256-SHA + +# client DTLSv1.2 ECDHE-RSA-AES256 +-R +-u +-v 3 +-l ECDHE-RSA-AES256-SHA + +# server TLSv1 ECDHE-ECDSA-NULL-SHA +-m +-u +-v 1 +-l ECDHE-ECDSA-NULL-SHA +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client TLSv1 ECDHE-ECDSA-NULL-SHA +-R +-u +-v 1 +-l ECDHE-ECDSA-NULL-SHA +-A ./certs/ca-ecc-cert.pem + +# server TLSv1.1 ECDHE-ECDSA-NULL-SHA +-m +-u +-v 2 +-l ECDHE-ECDSA-NULL-SHA +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client TLSv1 ECDHE-ECDSA-NULL-SHA +-R +-u +-v 2 +-l ECDHE-ECDSA-NULL-SHA +-A ./certs/ca-ecc-cert.pem + +# server TLSv1.2 ECDHE-ECDSA-NULL-SHA +-m +-u +-v 3 +-l ECDHE-ECDSA-NULL-SHA +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client TLSv1.2 ECDHE-ECDSA-NULL-SHA +-R +-u +-v 3 +-l ECDHE-ECDSA-NULL-SHA +-A ./certs/ca-ecc-cert.pem + +# server DTLSv1.1 ECDHE-ECDSA-DES3 +-m +-u +-v 2 +-l ECDHE-ECDSA-DES-CBC3-SHA +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.1 ECDHE-ECDSA-DES3 +-R +-u +-v 2 +-l ECDHE-ECDSA-DES-CBC3-SHA +-A ./certs/ca-ecc-cert.pem + +# server DTLSv1.1 ECDHE-ECDSA-AES128 +-m +-u +-v 2 +-l ECDHE-ECDSA-AES128-SHA +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.1 ECDHE-ECDSA-AES128 +-R +-u +-v 2 +-l ECDHE-ECDSA-AES128-SHA +-A ./certs/ca-ecc-cert.pem + +# server DTLSv1.1 ECDHE-ECDSA-AES256 +-m +-u +-v 2 +-l ECDHE-ECDSA-AES256-SHA +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.1 ECDHE-ECDSA-AES256 +-R +-u +-v 2 +-l ECDHE-ECDSA-AES256-SHA +-A ./certs/ca-ecc-cert.pem + +# server DTLSv1.2 ECDHE-ECDSA-DES3 +-m +-u +-v 3 +-l ECDHE-ECDSA-DES-CBC3-SHA +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.2 ECDHE-ECDSA-DES3 +-R +-u +-v 3 +-l ECDHE-ECDSA-DES-CBC3-SHA +-A ./certs/ca-ecc-cert.pem + +# server DTLSv1.2 ECDHE-ECDSA-AES128 +-m +-u +-v 3 +-l ECDHE-ECDSA-AES128-SHA +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.2 ECDHE-ECDSA-AES128 +-R +-u +-v 3 +-l ECDHE-ECDSA-AES128-SHA +-A ./certs/ca-ecc-cert.pem + +# server DTLSv1.2 ECDHE-ECDSA-AES128-SHA256 +-m +-u +-v 3 +-l ECDHE-ECDSA-AES128-SHA256 +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.2 ECDHE-ECDSA-AES128-SHA256 +-R +-u +-v 3 +-l ECDHE-ECDSA-AES128-SHA256 +-A ./certs/ca-ecc-cert.pem + +# server DTLSv1.2 ECDHE-ECDSA-AES256 +-m +-u +-v 3 +-l ECDHE-ECDSA-AES256-SHA +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.2 ECDHE-ECDSA-AES256 +-R +-u +-v 3 +-l ECDHE-ECDSA-AES256-SHA +-A ./certs/ca-ecc-cert.pem + +# server DTLSv1.1 ECDH-RSA-DES3 +-m +-u +-v 2 +-l ECDH-RSA-DES-CBC3-SHA +-c ./certs/server-ecc-rsa.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.1 ECDH-RSA-DES3 +-R +-u +-v 2 +-l ECDH-RSA-DES-CBC3-SHA + +# server DTLSv1.1 ECDH-RSA-AES128 +-m +-u +-v 2 +-l ECDH-RSA-AES128-SHA +-c ./certs/server-ecc-rsa.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.1 ECDH-RSA-AES128 +-R +-u +-v 2 +-l ECDH-RSA-AES128-SHA + +# server DTLSv1.1 ECDH-RSA-AES256 +-m +-u +-v 2 +-l ECDH-RSA-AES256-SHA +-c ./certs/server-ecc-rsa.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.1 ECDH-RSA-AES256 +-R +-u +-v 2 +-l ECDH-RSA-AES256-SHA + +# server DTLSv1.2 ECDH-RSA-DES3 +-m +-u +-v 3 +-l ECDH-RSA-DES-CBC3-SHA +-c ./certs/server-ecc-rsa.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.2 ECDH-RSA-DES3 +-R +-u +-v 3 +-l ECDH-RSA-DES-CBC3-SHA + +# server DTLSv1.2 ECDH-RSA-AES128 +-m +-u +-v 3 +-l ECDH-RSA-AES128-SHA +-c ./certs/server-ecc-rsa.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.2 ECDH-RSA-AES128 +-R +-u +-v 3 +-l ECDH-RSA-AES128-SHA + +# server DTLSv1.2 ECDH-RSA-AES128-SHA256 +-m +-u +-v 3 +-l ECDH-RSA-AES128-SHA256 +-c ./certs/server-ecc-rsa.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.2 ECDH-RSA-AES128-SHA256 +-R +-u +-v 3 +-l ECDH-RSA-AES128-SHA256 + +# server DTLSv1.2 ECDH-RSA-AES256 +-m +-u +-v 3 +-l ECDH-RSA-AES256-SHA +-c ./certs/server-ecc-rsa.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.2 ECDH-RSA-AES256 +-R +-u +-v 3 +-l ECDH-RSA-AES256-SHA + +# server DTLSv1.1 ECDH-ECDSA-DES3 +-m +-u +-v 2 +-l ECDH-ECDSA-DES-CBC3-SHA +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.1 ECDH-ECDSA-DES3 +-R +-u +-v 2 +-l ECDH-ECDSA-DES-CBC3-SHA +-A ./certs/ca-ecc-cert.pem + +# server DTLSv1.1 ECDH-ECDSA-AES128 +-m +-u +-v 2 +-l ECDH-ECDSA-AES128-SHA +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.1 ECDH-ECDSA-AES128 +-R +-u +-v 2 +-l ECDH-ECDSA-AES128-SHA +-A ./certs/ca-ecc-cert.pem + +# server DTLSv1.1 ECDH-ECDSA-AES256 +-m +-u +-v 2 +-l ECDH-ECDSA-AES256-SHA +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.1 ECDH-ECDSA-AES256 +-R +-u +-v 2 +-l ECDH-ECDSA-AES256-SHA +-A ./certs/ca-ecc-cert.pem + +# server DTLSv1.2 ECDH-ECDSA-DES3 +-m +-u +-v 3 +-l ECDH-ECDSA-DES-CBC3-SHA +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.2 ECDH-ECDSA-DES3 +-R +-u +-v 3 +-l ECDH-ECDSA-DES-CBC3-SHA +-A ./certs/ca-ecc-cert.pem + +# server DTLSv1.2 ECDH-ECDSA-AES128 +-m +-u +-v 3 +-l ECDH-ECDSA-AES128-SHA +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.2 ECDH-ECDSA-AES128 +-R +-u +-v 3 +-l ECDH-ECDSA-AES128-SHA +-A ./certs/ca-ecc-cert.pem + +# server DTLSv1.2 ECDH-ECDSA-AES128-SHA256 +-m +-u +-v 3 +-l ECDH-ECDSA-AES128-SHA256 +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.2 ECDH-ECDSA-AES128-SHA256 +-R +-u +-v 3 +-l ECDH-ECDSA-AES128-SHA256 +-A ./certs/ca-ecc-cert.pem + +# server DTLSv1.2 ECDH-ECDSA-AES256 +-m +-u +-v 3 +-l ECDH-ECDSA-AES256-SHA +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.2 ECDH-ECDSA-AES256 +-R +-u +-v 3 +-l ECDH-ECDSA-AES256-SHA +-A ./certs/ca-ecc-cert.pem + +# server DTLSv1.2 ECDHE-RSA-AES256-SHA384 +-m +-u +-v 3 +-l ECDHE-RSA-AES256-SHA384 + +# client DTLSv1.2 ECDHE-RSA-AES256-SHA384 +-R +-u +-v 3 +-l ECDHE-RSA-AES256-SHA384 + +# server DTLSv1.2 ECDHE-ECDSA-AES256-SHA384 +-m +-u +-v 3 +-l ECDHE-ECDSA-AES256-SHA384 +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.2 ECDHE-ECDSA-AES256-SHA384 +-R +-u +-v 3 +-l ECDHE-ECDSA-AES256-SHA384 +-A ./certs/ca-ecc-cert.pem + +# server DTLSv1.2 ECDH-RSA-AES256-SHA384 +-m +-u +-v 3 +-l ECDH-RSA-AES256-SHA384 +-c ./certs/server-ecc-rsa.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.2 ECDH-RSA-AES256-SHA384 +-R +-u +-v 3 +-l ECDH-RSA-AES256-SHA384 + +# server DTLSv1.2 ECDH-ECDSA-AES256-SHA384 +-m +-u +-v 3 +-l ECDH-ECDSA-AES256-SHA384 +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.2 ECDH-ECDSA-AES256-SHA384 +-R +-u +-v 3 +-l ECDH-ECDSA-AES256-SHA384 +-A ./certs/ca-ecc-cert.pem + +# server TLSv1.2 ECDHE-PSK-AES128-SHA256 +-m +-s +-u +-v 3 +-l ECDHE-PSK-AES128-SHA256 + +# client TLSv1.2 ECDHE-PSK-AES128-SHA256 +-R +-s +-u +-v 3 +-l ECDHE-PSK-AES128-SHA256 + +# server TLSv1.2 ECDHE-PSK-NULL-SHA256 +-m +-s +-u +-v 3 +-l ECDHE-PSK-NULL-SHA256 + +# client TLSv1.2 ECDHE-PSK-NULL-SHA256 +-R +-s +-u +-v 3 +-l ECDHE-PSK-NULL-SHA256 + +# server DTLSv1 PSK-AES128 +-m +-s +-u +-v 2 +-l PSK-AES128-CBC-SHA + +# client DTLSv1 PSK-AES128 +-R +-s +-u +-v 2 +-l PSK-AES128-CBC-SHA + +# server DTLSv1 PSK-AES256 +-m +-s +-u +-v 2 +-l PSK-AES256-CBC-SHA + +# client DTLSv1 PSK-AES256 +-R +-s +-u +-v 2 +-l PSK-AES256-CBC-SHA + +# server DTLSv1.2 PSK-AES128 +-m +-s +-u +-v 3 +-l PSK-AES128-CBC-SHA + +# client DTLSv1.2 PSK-AES128 +-R +-s +-u +-v 3 +-l PSK-AES128-CBC-SHA + +# server DTLSv1.2 PSK-AES256 +-m +-s +-u +-v 3 +-l PSK-AES256-CBC-SHA + +# client DTLSv1.2 PSK-AES256 +-R +-s +-u +-v 3 +-l PSK-AES256-CBC-SHA + +# server DTLSv1.2 PSK-AES128-SHA256 +-m +-s +-u +-v 3 +-l PSK-AES128-CBC-SHA256 + +# client DTLSv1.2 PSK-AES128-SHA256 +-R +-s +-u +-v 3 +-l PSK-AES128-CBC-SHA256 + +# server DTLSv1.2 PSK-AES256-SHA384 +-m +-s +-u +-v 3 +-l PSK-AES256-CBC-SHA384 + +# client DTLSv1.2 PSK-AES256-SHA384 +-R +-s +-u +-v 3 +-l PSK-AES256-CBC-SHA384 + +# server DTLSv1.2 ECDHE-ECDSA-AES128-GCM-SHA256 +-m +-u +-v 3 +-l ECDHE-ECDSA-AES128-GCM-SHA256 +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.2 ECDHE-ECDSA-AES128-GCM-SHA256 +-R +-u +-v 3 +-l ECDHE-ECDSA-AES128-GCM-SHA256 +-A ./certs/ca-ecc-cert.pem + +# server DTLSv1.2 ECDHE-ECDSA-AES256-GCM-SHA384 +-m +-u +-v 3 +-l ECDHE-ECDSA-AES256-GCM-SHA384 +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.2 ECDHE-ECDSA-AES256-GCM-SHA384 +-R +-u +-v 3 +-l ECDHE-ECDSA-AES256-GCM-SHA384 +-A ./certs/ca-ecc-cert.pem + +# server DTLSv1.2 ECDH-ECDSA-AES128-GCM-SHA256 +-m +-u +-v 3 +-l ECDH-ECDSA-AES128-GCM-SHA256 +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.2 ECDH-ECDSA-AES128-GCM-SHA256 +-R +-u +-v 3 +-l ECDH-ECDSA-AES128-GCM-SHA256 +-A ./certs/ca-ecc-cert.pem + +# server DTLSv1.2 ECDH-ECDSA-AES256-GCM-SHA384 +-m +-u +-v 3 +-l ECDH-ECDSA-AES256-GCM-SHA384 +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.2 ECDH-ECDSA-AES256-GCM-SHA384 +-R +-u +-v 3 +-l ECDH-ECDSA-AES256-GCM-SHA384 +-A ./certs/ca-ecc-cert.pem + +# server DTLSv1.2 ECDHE-RSA-AES128-GCM-SHA256 +-m +-u +-v 3 +-l ECDHE-RSA-AES128-GCM-SHA256 + +# client DTLSv1.2 ECDHE-RSA-AES128-GCM-SHA256 +-R +-u +-v 3 +-l ECDHE-RSA-AES128-GCM-SHA256 + +# server DTLSv1.2 ECDHE-RSA-AES256-GCM-SHA384 +-m +-u +-v 3 +-l ECDHE-RSA-AES256-GCM-SHA384 + +# client DTLSv1.2 ECDHE-RSA-AES256-GCM-SHA384 +-R +-u +-v 3 +-l ECDHE-RSA-AES256-GCM-SHA384 + +# server DTLSv1.2 ECDH-RSA-AES128-GCM-SHA256 +-m +-u +-v 3 +-l ECDH-RSA-AES128-GCM-SHA256 +-c ./certs/server-ecc-rsa.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.2 ECDH-RSA-AES128-GCM-SHA256 +-R +-u +-v 3 +-l ECDH-RSA-AES128-GCM-SHA256 + +# server DTLSv1.2 ECDH-RSA-AES256-GCM-SHA384 +-m +-u +-v 3 +-l ECDH-RSA-AES256-GCM-SHA384 +-c ./certs/server-ecc-rsa.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.2 ECDH-RSA-AES256-GCM-SHA384 +-R +-u +-v 3 +-l ECDH-RSA-AES256-GCM-SHA384 + +# server DTLSv1.2 PSK-AES128-GCM-SHA256 +-m +-u +-s +-v 3 +-l PSK-AES128-GCM-SHA256 + +# client DTLSv1.2 PSK-AES128-GCM-SHA256 +-R +-u +-s +-v 3 +-l PSK-AES128-GCM-SHA256 + +# server DTLSv1.2 PSK-AES256-GCM-SHA384 +-m +-u +-s +-v 3 +-l PSK-AES256-GCM-SHA384 + +# client DTLSv1.2 PSK-AES256-GCM-SHA384 +-R +-u +-s +-v 3 +-l PSK-AES256-GCM-SHA384 + +# server DTLSv1.2 ECDHE-ECDSA-AES128-CCM +-m +-u +-v 3 +-l ECDHE-ECDSA-AES128-CCM +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.2 ECDHE-ECDSA-AES128-CCM +-R +-u +-v 3 +-l ECDHE-ECDSA-AES128-CCM +-A ./certs/ca-ecc-cert.pem + +# server DTLSv1.2 ECDHE-ECDSA-AES128-CCM-8 +-m +-u +-v 3 +-l ECDHE-ECDSA-AES128-CCM-8 +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.2 ECDHE-ECDSA-AES128-CCM-8 +-R +-u +-v 3 +-l ECDHE-ECDSA-AES128-CCM-8 +-A ./certs/ca-ecc-cert.pem + +# server DTLSv1.2 ECDHE-ECDSA-AES256-CCM-8 +-m +-u +-v 3 +-l ECDHE-ECDSA-AES256-CCM-8 +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client DTLSv1.2 ECDHE-ECDSA-AES256-CCM-8 +-R +-u +-v 3 +-l ECDHE-ECDSA-AES256-CCM-8 +-A ./certs/ca-ecc-cert.pem + +# server DTLSv1.2 ADH-AES128-SHA +-m +-u +-a +-v 3 +-l ADH-AES128-SHA + +# client DTLSv1.2 ADH-AES128-SHA +-R +-u +-a +-v 3 +-l ADH-AES128-SHA + +# server DTLSv1.0 ADH-AES128-SHA +-m +-u +-a +-v 2 +-l ADH-AES128-SHA + +# client DTLSv1.0 ADH-AES128-SHA +-R +-u +-a +-v 2 +-l ADH-AES128-SHA From a107688891ae78cbd8d269252193c0a183b5dada Mon Sep 17 00:00:00 2001 From: Juliusz Sosinowicz Date: Tue, 26 May 2020 19:35:01 +0200 Subject: [PATCH 218/298] Fix asynchronous DTLS issue --- src/internal.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/internal.c b/src/internal.c index e8aa7835f..e68dc7dc2 100644 --- a/src/internal.c +++ b/src/internal.c @@ -13094,7 +13094,6 @@ static int DtlsMsgDrain(WOLFSSL* ssl) } #ifdef WOLFSSL_ASYNC_CRYPT if (ret == WC_PENDING_E) { - ssl->keys.dtls_expected_peer_handshake_number--; break; } #endif From 73105305cf03079e056ffa756e499d43cae93f97 Mon Sep 17 00:00:00 2001 From: Juliusz Sosinowicz Date: Wed, 27 May 2020 18:08:25 +0200 Subject: [PATCH 219/298] WIP --- src/internal.c | 55 ++++++++++++++++------------------------------ src/ssl.c | 18 +++++++++++++-- tests/include.am | 3 +++ wolfssl/internal.h | 19 ++++++++++++++++ 4 files changed, 57 insertions(+), 38 deletions(-) diff --git a/src/internal.c b/src/internal.c index e68dc7dc2..08158e8f3 100644 --- a/src/internal.c +++ b/src/internal.c @@ -6197,6 +6197,7 @@ void FreeKeyExchange(WOLFSSL* ssl) ssl->async.freeArgs(ssl, ssl->async.args); ssl->async.freeArgs = NULL; } + FreeBuildMsgArgs(&ssl->async.buildArgs); #endif } @@ -8351,8 +8352,9 @@ int CheckAvailableSize(WOLFSSL *ssl, int size) } #ifdef WOLFSSL_DTLS - if (size + ssl->buffers.outputBuffer.length - ssl->buffers.outputBuffer.idx - > ssl->dtls_expected_rx) { + if (ssl->options.dtls && + size + ssl->buffers.outputBuffer.length - + ssl->buffers.outputBuffer.idx > ssl->dtls_expected_rx) { int ret; WOLFSSL_MSG("CheckAvailableSize() flushing buffer " "to make room for new message"); @@ -15340,8 +15342,8 @@ int ProcessReply(WOLFSSL* ssl) } else #endif - if (ssl->buffers.inputBuffer.length - ssl->keys.padSz - - ssl->buffers.inputBuffer.idx > MAX_PLAINTEXT_SZ) { + if (ssl->buffers.inputBuffer.length - + ssl->buffers.inputBuffer.idx > MAX_PLAINTEXT_SZ) { WOLFSSL_MSG("Plaintext too long"); #if defined(WOLFSSL_TLS13) || defined(WOLFSSL_EXTRA_ALERTS) SendAlert(ssl, alert_fatal, record_overflow); @@ -16021,28 +16023,12 @@ int BuildCertHashes(WOLFSSL* ssl, Hashes* hashes) } #ifndef WOLFSSL_NO_TLS12 -/* Persistable BuildMessage arguments */ -typedef struct BuildMsgArgs { - word32 digestSz; - word32 sz; - word32 pad; - word32 idx; - word32 headerSz; - word16 size; - word32 ivSz; /* TLSv1.1 IV */ - byte* iv; -} BuildMsgArgs; - -static void FreeBuildMsgArgs(WOLFSSL* ssl, void* pArgs) +void FreeBuildMsgArgs(BuildMsgArgs* args) { - BuildMsgArgs* args = (BuildMsgArgs*)pArgs; - - (void)ssl; - (void)args; - - if (args->iv) { - XFREE(args->iv, ssl->heap, DYNAMIC_TYPE_SALT); - args->iv = NULL; + if (args) { + if (args->iv) + XFREE(args->iv, ssl->heap, DYNAMIC_TYPE_SALT); + XMEMSET(args, 0, sizeof(BuildMsgArgs)); } } #endif @@ -16057,9 +16043,7 @@ int BuildMessage(WOLFSSL* ssl, byte* output, int outSz, const byte* input, BuildMsgArgs* args; BuildMsgArgs lcl_args; #ifdef WOLFSSL_ASYNC_CRYPT - args = (BuildMsgArgs*)ssl->async.args; - typedef char args_test[sizeof(ssl->async.args) >= sizeof(*args) ? 1 : -1]; - (void)sizeof(args_test); + args = &ssl->async.buildArgs; #endif #endif @@ -16107,9 +16091,6 @@ int BuildMessage(WOLFSSL* ssl, byte* output, int outSz, const byte* input, args->sz = RECORD_HEADER_SZ + inSz; args->idx = RECORD_HEADER_SZ; args->headerSz = RECORD_HEADER_SZ; - #ifdef WOLFSSL_ASYNC_CRYPT - ssl->async.freeArgs = FreeBuildMsgArgs; - #endif } switch (ssl->options.buildMsgState) { @@ -16486,10 +16467,7 @@ exit_buildmsg: ret = args->sz; /* Final cleanup */ - FreeBuildMsgArgs(ssl, args); -#ifdef WOLFSSL_ASYNC_CRYPT - ssl->async.freeArgs = NULL; -#endif + FreeBuildMsgArgs(args); return ret; #endif /* !WOLFSSL_NO_TLS12 */ @@ -16882,7 +16860,8 @@ int SendCertificate(WOLFSSL* ssl) #endif } - sendSz += cipherExtraData(ssl); + if (IsEncryptionOn(ssl, 1)) + sendSz += cipherExtraData(ssl); /* check for available size */ if ((ret = CheckAvailableSize(ssl, sendSz)) != 0) @@ -28231,6 +28210,10 @@ static int DoSessionTicket(WOLFSSL* ssl, const byte* input, word32* inOutIdx, idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA; #endif } + + if (IsEncryptionOn(ssl, 1)) + sendSz += cipherExtraData(ssl); + /* check for available size */ if ((ret = CheckAvailableSize(ssl, sendSz)) != 0) return ret; diff --git a/src/ssl.c b/src/ssl.c index 371f19070..31aa0f033 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -2642,7 +2642,7 @@ int wolfSSL_CTX_UseSecureRenegotiation(WOLFSSL_CTX* ctx) /* do a secure renegotiation handshake, user forced, we discourage */ static int _Rehandshake(WOLFSSL* ssl) { - int ret; + int ret, err; if (ssl == NULL) return BAD_FUNC_ARG; @@ -2705,7 +2705,21 @@ static int _Rehandshake(WOLFSSL* ssl) return WOLFSSL_FATAL_ERROR; } } - ret = wolfSSL_negotiate(ssl); + + do { + err = 0; /* reset error */ + ret = wolfSSL_negotiate(ssl); + if (ret != WOLFSSL_SUCCESS) { + err = wolfSSL_get_error(ssl, 0); +#ifdef WOLFSSL_ASYNC_CRYPT + if (err == WC_PENDING_E) { + ret = wolfSSL_AsyncPoll(ssl, WOLF_POLL_FLAG_CHECK_HW); + if (ret < 0) break; + } +#endif + } + } while (err == WC_PENDING_E); + ssl->secure_rene_count++; return ret; } diff --git a/tests/include.am b/tests/include.am index ee4952667..df925983c 100644 --- a/tests/include.am +++ b/tests/include.am @@ -31,6 +31,9 @@ EXTRA_DIST += tests/test.conf \ tests/test-psk-no-id.conf \ tests/test-psk-no-id-sha2.conf \ tests/test-dtls.conf \ + tests/test-dtls-group.conf \ + tests/test-dtls-reneg-client.conf \ + tests/test-dtls-reneg-server.conf \ tests/test-dtls-sha2.conf \ tests/test-sctp.conf \ tests/test-sctp-sha2.conf \ diff --git a/wolfssl/internal.h b/wolfssl/internal.h index ad8250362..d5ccca491 100644 --- a/wolfssl/internal.h +++ b/wolfssl/internal.h @@ -3815,6 +3815,20 @@ typedef struct HS_Hashes { } HS_Hashes; +#ifndef WOLFSSL_NO_TLS12 +/* Persistable BuildMessage arguments */ +typedef struct BuildMsgArgs { + word32 digestSz; + word32 sz; + word32 pad; + word32 idx; + word32 headerSz; + word16 size; + word32 ivSz; /* TLSv1.1 IV */ + byte* iv; +} BuildMsgArgs; +#endif + #ifdef WOLFSSL_ASYNC_CRYPT #define MAX_ASYNC_ARGS 18 typedef void (*FreeArgsCb)(struct WOLFSSL* ssl, void* pArgs); @@ -3823,6 +3837,7 @@ typedef struct HS_Hashes { WC_ASYNC_DEV* dev; FreeArgsCb freeArgs; /* function pointer to cleanup args */ word32 args[MAX_ASYNC_ARGS]; /* holder for current args */ + BuildMsgArgs buildArgs; /* holder for current BuildMessage args */ }; #endif @@ -4603,6 +4618,10 @@ WOLFSSL_LOCAL int SetDhExternal(WOLFSSL_DH *dh); WOLFSSL_LOCAL int InitHandshakeHashes(WOLFSSL* ssl); WOLFSSL_LOCAL void FreeHandshakeHashes(WOLFSSL* ssl); + +#ifndef WOLFSSL_NO_TLS12 +WOLFSSL_LOCAL void FreeBuildMsgArgs(BuildMsgArgs* args); +#endif WOLFSSL_LOCAL int BuildMessage(WOLFSSL* ssl, byte* output, int outSz, const byte* input, int inSz, int type, int hashOutput, int sizeOnly, int asyncOkay, int epochOrder); From 7b604ad7142586a7de50e7ec033947859b2a9345 Mon Sep 17 00:00:00 2001 From: Juliusz Sosinowicz Date: Thu, 28 May 2020 23:26:37 +0200 Subject: [PATCH 220/298] WIP --- examples/client/client.c | 27 +++++++++++++++++++++------ examples/server/server.c | 19 +++++++++++++++++-- src/internal.c | 38 +++++++++++++------------------------- src/ssl.c | 29 ++++++++++++----------------- wolfssl/internal.h | 4 ---- 5 files changed, 63 insertions(+), 54 deletions(-) diff --git a/examples/client/client.c b/examples/client/client.c index afe5beabe..c667a274f 100644 --- a/examples/client/client.c +++ b/examples/client/client.c @@ -3050,13 +3050,28 @@ THREAD_RETURN WOLFSSL_THREAD client_test(void* args) } else { if (!resumeScr) { printf("Beginning secure rengotiation.\n"); - if (wolfSSL_Rehandshake(ssl) != WOLFSSL_SUCCESS) { + if ((ret = wolfSSL_Rehandshake(ssl)) != WOLFSSL_SUCCESS) { err = wolfSSL_get_error(ssl, 0); - printf("err = %d, %s\n", err, - wolfSSL_ERR_error_string(err, buffer)); - wolfSSL_free(ssl); ssl = NULL; - wolfSSL_CTX_free(ctx); ctx = NULL; - err_sys("wolfSSL_Rehandshake failed"); +#ifdef WOLFSSL_ASYNC_CRYPT + while (err == WC_PENDING_E) { + err = 0; + ret = wolfSSL_negotiate(ssl); + if (ret != WOLFSSL_SUCCESS) { + err = wolfSSL_get_error(ssl, 0); + if (err == WC_PENDING_E) { + ret = wolfSSL_AsyncPoll(ssl, WOLF_POLL_FLAG_CHECK_HW); + if (ret < 0) break; + } + } + } +#endif + if (ret != WOLFSSL_SUCCESS) { + printf("err = %d, %s\n", err, + wolfSSL_ERR_error_string(err, buffer)); + wolfSSL_free(ssl); ssl = NULL; + wolfSSL_CTX_free(ctx); ctx = NULL; + err_sys("wolfSSL_Rehandshake failed"); + } } else { printf("RENEGOTIATION SUCCESSFUL\n"); diff --git a/examples/server/server.c b/examples/server/server.c index 695ab6f9b..9c4c2925b 100644 --- a/examples/server/server.c +++ b/examples/server/server.c @@ -2385,8 +2385,23 @@ THREAD_RETURN WOLFSSL_THREAD server_test(void* args) printf("not doing secure renegotiation on example with" " nonblocking yet\n"); } else { - if (wolfSSL_Rehandshake(ssl) != WOLFSSL_SUCCESS) { - printf("not doing secure renegotiation\n"); + if ((ret = wolfSSL_Rehandshake(ssl)) != WOLFSSL_SUCCESS) { +#ifdef WOLFSSL_ASYNC_CRYPT + err = wolfSSL_get_error(ssl, 0); + while (err == WC_PENDING_E) { + err = 0; + ret = wolfSSL_negotiate(ssl); + if (ret != WOLFSSL_SUCCESS) { + err = wolfSSL_get_error(ssl, 0); + if (err == WC_PENDING_E) { + ret = wolfSSL_AsyncPoll(ssl, WOLF_POLL_FLAG_CHECK_HW); + if (ret < 0) break; + } + } + } + if (ret != WOLFSSL_SUCCESS) +#endif + printf("not doing secure renegotiation\n"); } else { printf("RENEGOTIATION SUCCESSFUL\n"); diff --git a/src/internal.c b/src/internal.c index 08158e8f3..ac605d0a6 100644 --- a/src/internal.c +++ b/src/internal.c @@ -227,20 +227,6 @@ static WC_INLINE int IsDtlsNotSctpMode(WOLFSSL* ssl) return ssl->options.dtls; #endif } - -int IsInitialRenegotiationState(WOLFSSL* ssl) -{ - if (ssl->options.acceptState == ACCEPT_FIRST_REPLY_DONE - #ifdef HAVE_SECURE_RENEGOTIATION - || ssl->options.acceptState == ACCEPT_BEGIN_RENEG - #endif - ) { - return 1; - } - else { - return 0; - } -} #endif /* DTLS || !WOLFSSL_NO_TLS12 */ @@ -17692,11 +17678,7 @@ int ReceiveData(WOLFSSL* ssl, byte* output, int sz, int peek) WOLFSSL_ENTER("ReceiveData()"); /* reset error state */ - if (ssl->error == WANT_READ - #ifdef WOLFSSL_ASYNC_CRYPT - || ssl->error == WC_PENDING_E - #endif - ) { + if (ssl->error == WANT_READ) { ssl->error = 0; } @@ -17709,11 +17691,17 @@ int ReceiveData(WOLFSSL* ssl, byte* output, int sz, int peek) } #endif /* WOLFSSL_DTLS */ - if (ssl->error != 0 && ssl->error != WANT_WRITE) { + if (ssl->error != 0 && ssl->error != WANT_WRITE +#ifdef WOLFSSL_ASYNC_CRYPT + && ssl->error != WC_PENDING_E +#endif + ) { WOLFSSL_MSG("User calling wolfSSL_read in error state, not allowed"); return ssl->error; } + if (ssl->error != 0) fprintf(stderr, "ignoring err %d\n", ssl->error); + #ifdef WOLFSSL_EARLY_DATA if (ssl->earlyData != no_early_data) { } @@ -26914,7 +26902,7 @@ static int DoSessionTicket(WOLFSSL* ssl, const byte* input, word32* inOutIdx, XMEMCPY(&pv, input + i, OPAQUE16_LEN); ssl->chVersion = pv; /* store */ #ifdef WOLFSSL_DTLS - if (IsDtlsNotSctpMode(ssl) && !IsInitialRenegotiationState(ssl)) { + if (IsDtlsNotSctpMode(ssl) && !IsSCR(ssl)) { #if defined(NO_SHA) && defined(NO_SHA256) #error "DTLS needs either SHA or SHA-256" #endif /* NO_SHA && NO_SHA256 */ @@ -27064,7 +27052,7 @@ static int DoSessionTicket(WOLFSSL* ssl, const byte* input, word32* inOutIdx, /* random */ XMEMCPY(ssl->arrays->clientRandom, input + i, RAN_LEN); #ifdef WOLFSSL_DTLS - if (IsDtlsNotSctpMode(ssl) && !IsInitialRenegotiationState(ssl)) { + if (IsDtlsNotSctpMode(ssl) && !IsSCR(ssl)) { ret = wc_HmacUpdate(&cookieHmac, input + i, RAN_LEN); if (ret != 0) return ret; } @@ -27097,7 +27085,7 @@ static int DoSessionTicket(WOLFSSL* ssl, const byte* input, word32* inOutIdx, XMEMCPY(ssl->arrays->sessionID, input + i, b); #ifdef WOLFSSL_DTLS - if (IsDtlsNotSctpMode(ssl) && !IsInitialRenegotiationState(ssl)) { + if (IsDtlsNotSctpMode(ssl) && !IsSCR(ssl)) { ret = wc_HmacUpdate(&cookieHmac, input + i - 1, b + 1); if (ret != 0) return ret; } @@ -27182,7 +27170,7 @@ static int DoSessionTicket(WOLFSSL* ssl, const byte* input, word32* inOutIdx, #endif #ifdef WOLFSSL_DTLS - if (IsDtlsNotSctpMode(ssl) && !IsInitialRenegotiationState(ssl)) { + if (IsDtlsNotSctpMode(ssl) && !IsSCR(ssl)) { ret = wc_HmacUpdate(&cookieHmac, input + i - OPAQUE16_LEN, clSuites.suiteSz + OPAQUE16_LEN); @@ -27208,7 +27196,7 @@ static int DoSessionTicket(WOLFSSL* ssl, const byte* input, word32* inOutIdx, #ifdef WOLFSSL_DTLS if (IsDtlsNotSctpMode(ssl)) { - if (!IsInitialRenegotiationState(ssl)) { + if (!IsSCR(ssl)) { byte newCookie[MAX_COOKIE_LEN]; ret = wc_HmacUpdate(&cookieHmac, input + i - 1, b + 1); diff --git a/src/ssl.c b/src/ssl.c index 31aa0f033..8bae5976f 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -2642,7 +2642,7 @@ int wolfSSL_CTX_UseSecureRenegotiation(WOLFSSL_CTX* ctx) /* do a secure renegotiation handshake, user forced, we discourage */ static int _Rehandshake(WOLFSSL* ssl) { - int ret, err; + int ret; if (ssl == NULL) return BAD_FUNC_ARG; @@ -2705,22 +2705,9 @@ static int _Rehandshake(WOLFSSL* ssl) return WOLFSSL_FATAL_ERROR; } } - - do { - err = 0; /* reset error */ - ret = wolfSSL_negotiate(ssl); - if (ret != WOLFSSL_SUCCESS) { - err = wolfSSL_get_error(ssl, 0); -#ifdef WOLFSSL_ASYNC_CRYPT - if (err == WC_PENDING_E) { - ret = wolfSSL_AsyncPoll(ssl, WOLF_POLL_FLAG_CHECK_HW); - if (ret < 0) break; - } -#endif - } - } while (err == WC_PENDING_E); - - ssl->secure_rene_count++; + ret = wolfSSL_negotiate(ssl); + if (ret == WOLFSSL_SUCCESS) + ssl->secure_rene_count++; return ret; } @@ -12177,6 +12164,14 @@ int wolfSSL_DTLS_SetCookieSecret(WOLFSSL* ssl, } #endif /* WOLFSSL_DTLS */ +#if defined(WOLFSSL_ASYNC_CRYPT) && defined(HAVE_SECURE_RENEGOTIATION) + /* This may be necessary in async so that we don't try to + * renegotiate again */ + if (ssl->secure_renegotiation && ssl->secure_renegotiation->startScr) { + ssl->secure_renegotiation->startScr = 0; + } +#endif /* WOLFSSL_ASYNC_CRYPT && HAVE_SECURE_RENEGOTIATION */ + #ifdef WOLFSSL_SESSION_EXPORT if (ssl->dtls_export) { if ((ssl->error = wolfSSL_send_session(ssl)) != 0) { diff --git a/wolfssl/internal.h b/wolfssl/internal.h index d5ccca491..1fdcc69d4 100644 --- a/wolfssl/internal.h +++ b/wolfssl/internal.h @@ -4382,10 +4382,6 @@ WOLFSSL_LOCAL int IsTLS(const WOLFSSL* ssl); WOLFSSL_LOCAL int IsAtLeastTLSv1_2(const WOLFSSL* ssl); WOLFSSL_LOCAL int IsAtLeastTLSv1_3(const ProtocolVersion pv); -#if defined(WOLFSSL_DTLS) || !defined(WOLFSSL_NO_TLS12) -WOLFSSL_LOCAL int IsInitialRenegotiationState(WOLFSSL* ssl); -#endif /* DTLS || !WOLFSSL_NO_TLS12 */ - WOLFSSL_LOCAL void FreeHandshakeResources(WOLFSSL* ssl); WOLFSSL_LOCAL void ShrinkInputBuffer(WOLFSSL* ssl, int forcedFree); WOLFSSL_LOCAL void ShrinkOutputBuffer(WOLFSSL* ssl); From a7c4d88876110b35eed6a7c9e63d8d08a4477849 Mon Sep 17 00:00:00 2001 From: Juliusz Sosinowicz Date: Fri, 29 May 2020 12:03:36 +0200 Subject: [PATCH 221/298] ASYNC: Working AES128-SHA --- src/internal.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/internal.c b/src/internal.c index ac605d0a6..9700782c4 100644 --- a/src/internal.c +++ b/src/internal.c @@ -15155,10 +15155,17 @@ int ProcessReply(WOLFSSL* ssl) in->buffer + in->idx, in->buffer + in->idx, ssl->curSize - digestSz); - ssl->keys.padSz = - in->buffer[in->idx + ssl->curSize - digestSz - 1]; - ssl->keys.padSz += 1; - ssl->keys.decryptedCur = 1; + if (ret == 0) { + ssl->keys.padSz = + in->buffer[in->idx + ssl->curSize - + digestSz - 1]; + ssl->keys.padSz += 1; + ssl->keys.decryptedCur = 1; + } + else { + ssl->keys.padSz += 1; + ssl->keys.padSz -= 1; + } } else #endif From eb7a49a1d765f3b2834697ee533d0a2f5ad898d2 Mon Sep 17 00:00:00 2001 From: Juliusz Sosinowicz Date: Fri, 29 May 2020 21:40:00 +0200 Subject: [PATCH 222/298] ASYNC: Working TLS SCR --- src/internal.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/internal.c b/src/internal.c index 9700782c4..78685209e 100644 --- a/src/internal.c +++ b/src/internal.c @@ -15162,10 +15162,6 @@ int ProcessReply(WOLFSSL* ssl) ssl->keys.padSz += 1; ssl->keys.decryptedCur = 1; } - else { - ssl->keys.padSz += 1; - ssl->keys.padSz -= 1; - } } else #endif @@ -23855,7 +23851,10 @@ int SendCertificateVerify(WOLFSSL* ssl) WOLFSSL_ENTER("SendCertificateVerify"); #ifdef WOLFSSL_ASYNC_CRYPT - ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState); + /* BuildMessage does its own Pop */ + if (ssl->error != WC_PENDING_E || + ssl->options.asyncState != TLS_ASYNC_END) + ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState); if (ret != WC_NOT_PENDING_E) { /* Check for error */ if (ret < 0) From f2d2dadc89f69bba4651d48ecdf34a0dd3fa465e Mon Sep 17 00:00:00 2001 From: Juliusz Sosinowicz Date: Wed, 3 Jun 2020 13:32:24 +0200 Subject: [PATCH 223/298] ASYNC: Fix issues with TLS and DTLS --- examples/client/client.c | 27 ++++++-- src/internal.c | 140 ++++++++++++++++++++++++++++----------- src/ssl.c | 8 +++ 3 files changed, 129 insertions(+), 46 deletions(-) diff --git a/examples/client/client.c b/examples/client/client.c index c667a274f..af82da6f1 100644 --- a/examples/client/client.c +++ b/examples/client/client.c @@ -3079,13 +3079,28 @@ THREAD_RETURN WOLFSSL_THREAD client_test(void* args) } else { printf("Beginning secure resumption.\n"); - if (wolfSSL_SecureResume(ssl) != WOLFSSL_SUCCESS) { + if ((ret = wolfSSL_SecureResume(ssl)) != WOLFSSL_SUCCESS) { err = wolfSSL_get_error(ssl, 0); - printf("err = %d, %s\n", err, - wolfSSL_ERR_error_string(err, buffer)); - wolfSSL_free(ssl); ssl = NULL; - wolfSSL_CTX_free(ctx); ctx = NULL; - err_sys("wolfSSL_SecureResume failed"); +#ifdef WOLFSSL_ASYNC_CRYPT + while (err == WC_PENDING_E) { + err = 0; + ret = wolfSSL_negotiate(ssl); + if (ret != WOLFSSL_SUCCESS) { + err = wolfSSL_get_error(ssl, 0); + if (err == WC_PENDING_E) { + ret = wolfSSL_AsyncPoll(ssl, WOLF_POLL_FLAG_CHECK_HW); + if (ret < 0) break; + } + } + } +#endif + if (ret != WOLFSSL_SUCCESS) { + printf("err = %d, %s\n", err, + wolfSSL_ERR_error_string(err, buffer)); + wolfSSL_free(ssl); ssl = NULL; + wolfSSL_CTX_free(ctx); ctx = NULL; + err_sys("wolfSSL_SecureResume failed"); + } } else { printf("SECURE RESUMPTION SUCCESSFUL\n"); diff --git a/src/internal.c b/src/internal.c index 78685209e..69faa7c01 100644 --- a/src/internal.c +++ b/src/internal.c @@ -7042,7 +7042,7 @@ int DtlsMsgSet(DtlsMsg* msg, word32 seq, word16 epoch, const byte* data, byte ty DtlsMsg* DtlsMsgFind(DtlsMsg* head, word32 epoch, word32 seq) { - while (head != NULL && head->epoch == epoch && head->seq != seq) { + while (head != NULL && !(head->epoch == epoch && head->seq == seq)) { head = head->next; } return head; @@ -7111,7 +7111,8 @@ void DtlsMsgStore(WOLFSSL* ssl, word32 epoch, word32 seq, const byte* data, /* DtlsMsgInsert() is an in-order insert. */ DtlsMsg* DtlsMsgInsert(DtlsMsg* head, DtlsMsg* item) { - if (head == NULL || item->seq < head->seq) { + if (head == NULL || (item->epoch <= head->epoch && + item->seq < head->seq)) { item->next = head; head = item; } @@ -7122,7 +7123,8 @@ DtlsMsg* DtlsMsgInsert(DtlsMsg* head, DtlsMsg* item) DtlsMsg* cur = head->next; DtlsMsg* prev = head; while (cur) { - if (item->seq < cur->seq) { + if (item->epoch <= head->epoch && + item->seq < head->seq) { item->next = cur; prev->next = item; break; @@ -11910,10 +11912,13 @@ static int DoHelloRequest(WOLFSSL* ssl, const byte* input, word32* inOutIdx, return BUFFER_ERROR; if (IsEncryptionOn(ssl, 0)) { + /* If size == totalSz then we are in DtlsMsgDrain so no need to worry + * about padding */ #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY) if (ssl->options.startedETMRead) { word32 digestSz = MacSize(ssl); - if (*inOutIdx + ssl->keys.padSz + digestSz > totalSz) + if (size != totalSz && + *inOutIdx + ssl->keys.padSz + digestSz > totalSz) return BUFFER_E; *inOutIdx += ssl->keys.padSz + digestSz; } @@ -11921,7 +11926,8 @@ static int DoHelloRequest(WOLFSSL* ssl, const byte* input, word32* inOutIdx, #endif { /* access beyond input + size should be checked against totalSz */ - if (*inOutIdx + ssl->keys.padSz > totalSz) + if (size != totalSz && + *inOutIdx + ssl->keys.padSz > totalSz) return BUFFER_E; *inOutIdx += ssl->keys.padSz; @@ -11957,7 +11963,10 @@ int DoFinished(WOLFSSL* ssl, const byte* input, word32* inOutIdx, word32 size, if (finishedSz != size) return BUFFER_ERROR; - /* check against totalSz */ + /* check against totalSz + * If size == totalSz then we are in DtlsMsgDrain so no need to worry about + * padding */ + if (size != totalSz) { #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY) if (ssl->options.startedETMRead) { if (*inOutIdx + size + ssl->keys.padSz + MacSize(ssl) > totalSz) @@ -11969,6 +11978,7 @@ int DoFinished(WOLFSSL* ssl, const byte* input, word32* inOutIdx, word32 size, if (*inOutIdx + size + ssl->keys.padSz > totalSz) return BUFFER_E; } + } #ifdef WOLFSSL_CALLBACKS if (ssl->hsInfoOn) AddPacketName(ssl, "Finished"); @@ -12304,9 +12314,6 @@ static int SanityCheckMsgReceived(WOLFSSL* ssl, byte type) case change_cipher_hs: if (ssl->msgsReceived.got_change_cipher) { WOLFSSL_MSG("Duplicate ChangeCipher received"); - #ifdef WOLFSSL_EXTRA_ALERTS - SendAlert(ssl, alert_fatal, unexpected_message); - #endif return DUPLICATE_MSG_E; } /* DTLS is going to ignore the CCS message if the client key @@ -12641,11 +12648,14 @@ static int DoHandShakeMsgType(WOLFSSL* ssl, byte* input, word32* inOutIdx, } } #endif + /* If size == totalSz then we are in DtlsMsgDrain so no need to worry + * about padding */ if (IsEncryptionOn(ssl, 0)) { #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY) if (ssl->options.startedETMRead) { word32 digestSz = MacSize(ssl); - if (*inOutIdx + ssl->keys.padSz + digestSz > totalSz) + if (size != totalSz && + *inOutIdx + ssl->keys.padSz + digestSz > totalSz) return BUFFER_E; *inOutIdx += ssl->keys.padSz + digestSz; } @@ -12654,9 +12664,9 @@ static int DoHandShakeMsgType(WOLFSSL* ssl, byte* input, word32* inOutIdx, { /* access beyond input + size should be checked against totalSz */ - if (*inOutIdx + ssl->keys.padSz > totalSz) + if (size != totalSz && + *inOutIdx + ssl->keys.padSz > totalSz) return BUFFER_E; - *inOutIdx += ssl->keys.padSz; } } @@ -13073,11 +13083,10 @@ static int DtlsMsgDrain(WOLFSSL* ssl) item->fragSz == item->sz && ret == 0) { word32 idx = 0; - /* If item is from the wrong epoch then just ignore it */ - if (ssl->keys.dtls_epoch == item->epoch && - (ret = DoHandShakeMsgType(ssl, item->msg, &idx, item->type, - item->sz, item->sz)) == 0) { - ssl->keys.dtls_expected_peer_handshake_number++; + if ((ret = DoHandShakeMsgType(ssl, item->msg, &idx, item->type, + item->sz, item->sz)) == 0) { + if (item->type != finished) + ssl->keys.dtls_expected_peer_handshake_number++; DtlsTxMsgListClean(ssl); } #ifdef WOLFSSL_ASYNC_CRYPT @@ -13107,17 +13116,6 @@ static int DoDtlsHandShakeMsg(WOLFSSL* ssl, byte* input, word32* inOutIdx, WOLFSSL_ENTER("DoDtlsHandShakeMsg()"); - /* process any pending DTLS messages - this flow can happen with async */ - if (ssl->dtls_rx_msg_list != NULL) { - ret = DtlsMsgDrain(ssl); - if (ret != 0) - return ret; - - /* if done processing fragment exit with success */ - if (totalSz == *inOutIdx) - return ret; - } - /* parse header */ if (GetDtlsHandShakeHeader(ssl, input, inOutIdx, &type, &size, &fragOffset, &fragSz, totalSz) != 0) { @@ -13274,7 +13272,33 @@ static int DoDtlsHandShakeMsg(WOLFSSL* ssl, byte* input, word32* inOutIdx, else { /* This branch is in order next, and a complete message. On success * clean the tx list. */ +#ifdef WOLFSSL_ASYNC_CRYPT + word32 idx = *inOutIdx; +#endif WOLFSSL_MSG("Branch is in order and a complete message"); +#ifdef WOLFSSL_ASYNC_CRYPT + /* In async mode always store the message and process it with + * DtlsMsgDrain because in case of a WC_PENDING_E it will be + * easier this way. */ + if (ssl->dtls_rx_msg_list_sz < DTLS_POOL_SZ) { + DtlsMsgStore(ssl, ssl->keys.curEpoch, + ssl->keys.dtls_peer_handshake_number, + input + idx, size, type, + fragOffset, fragSz, ssl->heap); + } + if (idx + fragSz + ssl->keys.padSz > totalSz) + return BUFFER_E; + *inOutIdx = idx + fragSz + ssl->keys.padSz; +#if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY) + if (ssl->options.startedETMRead && ssl->keys.curEpoch != 0) { + word32 digestSz = MacSize(ssl); + if (*inOutIdx + digestSz > totalSz) + return BUFFER_E; + *inOutIdx += digestSz; + } +#endif + ret = DtlsMsgDrain(ssl); +#else ret = DoHandShakeMsgType(ssl, input, inOutIdx, type, size, totalSz); if (ret == 0) { DtlsTxMsgListClean(ssl); @@ -13284,6 +13308,7 @@ static int DoDtlsHandShakeMsg(WOLFSSL* ssl, byte* input, word32* inOutIdx, ret = DtlsMsgDrain(ssl); } } +#endif } WOLFSSL_LEAVE("DoDtlsHandShakeMsg()", ret); @@ -14876,6 +14901,17 @@ int ProcessReply(WOLFSSL* ssl) return ssl->error; } +#ifdef WOLFSSL_ASYNC_CRYPT + /* process any pending DTLS messages - this flow can happen with async */ + if (ssl->dtls_rx_msg_list != NULL) { + ret = DtlsMsgDrain(ssl); + if (ret != 0) { + WOLFSSL_ERROR(ret); + return ret; + } + } +#endif + for (;;) { switch (ssl->options.processReply) { @@ -15319,9 +15355,15 @@ int ProcessReply(WOLFSSL* ssl) #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY) if (IsEncryptionOn(ssl, 0) && ssl->options.startedETMRead) { - if (ssl->buffers.inputBuffer.length - ssl->keys.padSz - - ssl->buffers.inputBuffer.idx - - MacSize(ssl) > MAX_PLAINTEXT_SZ) { + if ((ssl->buffers.inputBuffer.length - + ssl->keys.padSz - + MacSize(ssl) - + ssl->buffers.inputBuffer.idx > MAX_PLAINTEXT_SZ) +#ifdef WOLFSSL_ASYNC_CRYPT + && ssl->buffers.inputBuffer.length != + ssl->buffers.inputBuffer.idx +#endif + ) { WOLFSSL_MSG("Plaintext too long - Encrypt-Then-MAC"); #if defined(WOLFSSL_EXTRA_ALERTS) SendAlert(ssl, alert_fatal, record_overflow); @@ -15332,7 +15374,13 @@ int ProcessReply(WOLFSSL* ssl) else #endif if (ssl->buffers.inputBuffer.length - - ssl->buffers.inputBuffer.idx > MAX_PLAINTEXT_SZ) { + ssl->keys.padSz - + ssl->buffers.inputBuffer.idx > MAX_PLAINTEXT_SZ +#ifdef WOLFSSL_ASYNC_CRYPT + && ssl->buffers.inputBuffer.length != + ssl->buffers.inputBuffer.idx +#endif + ) { WOLFSSL_MSG("Plaintext too long"); #if defined(WOLFSSL_TLS13) || defined(WOLFSSL_EXTRA_ALERTS) SendAlert(ssl, alert_fatal, record_overflow); @@ -15340,11 +15388,11 @@ int ProcessReply(WOLFSSL* ssl) return BUFFER_ERROR; } - #ifdef WOLFSSL_DTLS +#ifdef WOLFSSL_DTLS if (IsDtlsNotSctpMode(ssl)) { DtlsUpdateWindow(ssl); } - #endif /* WOLFSSL_DTLS */ +#endif /* WOLFSSL_DTLS */ WOLFSSL_MSG("received record layer msg"); @@ -15392,7 +15440,15 @@ int ProcessReply(WOLFSSL* ssl) ret = BUFFER_ERROR; #endif } - if (ret != 0) { + if (ret != 0 +#ifdef WOLFSSL_ASYNC_CRYPT + /* In async case, on pending, move onto next message. + * Current message should have been DtlsMsgStore'ed and + * should be processed with DtlsMsgDrain */ + && (!ssl->options.dtls + || ret != WC_PENDING_E) +#endif + ) { WOLFSSL_ERROR(ret); return ret; } @@ -15597,7 +15653,7 @@ int ProcessReply(WOLFSSL* ssl) /* input exhausted? */ if (ssl->buffers.inputBuffer.idx >= ssl->buffers.inputBuffer.length) - return 0; + return ret; /* more messages per record */ else if ((ssl->buffers.inputBuffer.idx - startIdx) < ssl->curSize) { @@ -15632,15 +15688,19 @@ int ProcessReply(WOLFSSL* ssl) } } } - - continue; } /* more records */ else { WOLFSSL_MSG("More records in input"); - continue; } - +#ifdef WOLFSSL_ASYNC_CRYPT + /* We are setup to read next message/record but we had an error + * (probably WC_PENDING_E) so return that so it can be handled + * by higher layers. */ + if (ret != 0) + return ret; +#endif + continue; default: WOLFSSL_MSG("Bad process input state, programming error"); return INPUT_CASE_ERROR; diff --git a/src/ssl.c b/src/ssl.c index 8bae5976f..3b74066e7 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -11783,6 +11783,14 @@ int wolfSSL_DTLS_SetCookieSecret(WOLFSSL* ssl, } #endif /* WOLFSSL_DTLS */ +#if defined(WOLFSSL_ASYNC_CRYPT) && defined(HAVE_SECURE_RENEGOTIATION) + /* This may be necessary in async so that we don't try to + * renegotiate again */ + if (ssl->secure_renegotiation && ssl->secure_renegotiation->startScr) { + ssl->secure_renegotiation->startScr = 0; + } +#endif /* WOLFSSL_ASYNC_CRYPT && HAVE_SECURE_RENEGOTIATION */ + WOLFSSL_LEAVE("SSL_connect()", WOLFSSL_SUCCESS); return WOLFSSL_SUCCESS; From 01b446f469759acfe9aa6ac37c82e0f199b15663 Mon Sep 17 00:00:00 2001 From: Juliusz Sosinowicz Date: Fri, 5 Jun 2020 18:04:09 +0200 Subject: [PATCH 224/298] Fix SessionTicket length in unencrypted case --- src/internal.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/internal.c b/src/internal.c index 69faa7c01..2d3d16c7a 100644 --- a/src/internal.c +++ b/src/internal.c @@ -28265,7 +28265,7 @@ static int DoSessionTicket(WOLFSSL* ssl, const byte* input, word32* inOutIdx, #endif } - if (IsEncryptionOn(ssl, 1)) + if (IsEncryptionOn(ssl, 1) && ssl->options.handShakeDone) sendSz += cipherExtraData(ssl); /* check for available size */ @@ -28326,7 +28326,8 @@ static int DoSessionTicket(WOLFSSL* ssl, const byte* input, word32* inOutIdx, ssl->buffers.outputBuffer.length += sendSz; - ret = SendBuffered(ssl); + if (!ssl->options.groupMessages) + ret = SendBuffered(ssl); WOLFSSL_LEAVE("SendTicket", ret); WOLFSSL_END(WC_FUNC_TICKET_SEND); From 3980d6117d5734546a9402a76033404e0c28873b Mon Sep 17 00:00:00 2001 From: Juliusz Sosinowicz Date: Tue, 9 Jun 2020 13:28:19 +0200 Subject: [PATCH 225/298] Fix Jenkins --- src/internal.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/internal.c b/src/internal.c index 2d3d16c7a..0c749d9f7 100644 --- a/src/internal.c +++ b/src/internal.c @@ -16076,7 +16076,7 @@ void FreeBuildMsgArgs(BuildMsgArgs* args) { if (args) { if (args->iv) - XFREE(args->iv, ssl->heap, DYNAMIC_TYPE_SALT); + XFREE(args->iv, NULL, DYNAMIC_TYPE_SALT); XMEMSET(args, 0, sizeof(BuildMsgArgs)); } } @@ -17763,8 +17763,6 @@ int ReceiveData(WOLFSSL* ssl, byte* output, int sz, int peek) return ssl->error; } - if (ssl->error != 0) fprintf(stderr, "ignoring err %d\n", ssl->error); - #ifdef WOLFSSL_EARLY_DATA if (ssl->earlyData != no_early_data) { } From 69802ed1a97b33bf483e9ee809a0360f9f231c84 Mon Sep 17 00:00:00 2001 From: Juliusz Sosinowicz Date: Tue, 9 Jun 2020 15:33:17 +0200 Subject: [PATCH 226/298] Missing ssl->heap in FreeBuildMsgArgs --- src/internal.c | 10 +++++----- wolfssl/internal.h | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/internal.c b/src/internal.c index 0c749d9f7..2789ad57b 100644 --- a/src/internal.c +++ b/src/internal.c @@ -6183,7 +6183,7 @@ void FreeKeyExchange(WOLFSSL* ssl) ssl->async.freeArgs(ssl, ssl->async.args); ssl->async.freeArgs = NULL; } - FreeBuildMsgArgs(&ssl->async.buildArgs); + FreeBuildMsgArgs(ssl, &ssl->async.buildArgs); #endif } @@ -16072,11 +16072,11 @@ int BuildCertHashes(WOLFSSL* ssl, Hashes* hashes) } #ifndef WOLFSSL_NO_TLS12 -void FreeBuildMsgArgs(BuildMsgArgs* args) +void FreeBuildMsgArgs(WOLFSSL* ssl, BuildMsgArgs* args) { if (args) { - if (args->iv) - XFREE(args->iv, NULL, DYNAMIC_TYPE_SALT); + if (ssl && args->iv) + XFREE(args->iv, ssl->heap, DYNAMIC_TYPE_SALT); XMEMSET(args, 0, sizeof(BuildMsgArgs)); } } @@ -16516,7 +16516,7 @@ exit_buildmsg: ret = args->sz; /* Final cleanup */ - FreeBuildMsgArgs(args); + FreeBuildMsgArgs(ssl, args); return ret; #endif /* !WOLFSSL_NO_TLS12 */ diff --git a/wolfssl/internal.h b/wolfssl/internal.h index 1fdcc69d4..304ed443b 100644 --- a/wolfssl/internal.h +++ b/wolfssl/internal.h @@ -4616,7 +4616,7 @@ WOLFSSL_LOCAL void FreeHandshakeHashes(WOLFSSL* ssl); #ifndef WOLFSSL_NO_TLS12 -WOLFSSL_LOCAL void FreeBuildMsgArgs(BuildMsgArgs* args); +WOLFSSL_LOCAL void FreeBuildMsgArgs(WOLFSSL* ssl, BuildMsgArgs* args); #endif WOLFSSL_LOCAL int BuildMessage(WOLFSSL* ssl, byte* output, int outSz, const byte* input, int inSz, int type, int hashOutput, From ac028e551d3fda94f2584cf86a006cc78bd0d38d Mon Sep 17 00:00:00 2001 From: Juliusz Sosinowicz Date: Wed, 10 Jun 2020 18:14:39 +0200 Subject: [PATCH 227/298] Code Review --- src/internal.c | 106 ++++++++++++++++++++++++++++++--------------- src/ssl.c | 24 ++-------- src/tls.c | 78 ++------------------------------- src/tls13.c | 4 +- wolfssl/internal.h | 10 +++-- 5 files changed, 87 insertions(+), 135 deletions(-) diff --git a/src/internal.c b/src/internal.c index 2789ad57b..3f58fe9c3 100644 --- a/src/internal.c +++ b/src/internal.c @@ -6723,12 +6723,7 @@ static WC_INLINE void GetSEQIncrement(WOLFSSL* ssl, int verify, word32 seq[2]) static WC_INLINE void DtlsGetSEQ(WOLFSSL* ssl, int order, word32 seq[2]) { #ifdef HAVE_SECURE_RENEGOTIATION - /* if ssl->secure_renegotiation->tmp_keys.dtls_epoch > ssl->keys.dtls_epoch then PREV_ORDER - * refers to the current epoch */ - if (order == PREV_ORDER && ssl->secure_renegotiation && - ssl->secure_renegotiation->tmp_keys.dtls_epoch > ssl->keys.dtls_epoch) { - order = CUR_ORDER; - } + order = DtlsCheckOrder(ssl, order); #endif if (order == PREV_ORDER) { /* Previous epoch case */ @@ -6776,12 +6771,7 @@ static WC_INLINE void DtlsSEQIncrement(WOLFSSL* ssl, int order) { word32 seq; #ifdef HAVE_SECURE_RENEGOTIATION - /* if ssl->secure_renegotiation->tmp_keys.dtls_epoch > ssl->keys.dtls_epoch then PREV_ORDER - * refers to the current epoch */ - if (order == PREV_ORDER && ssl->secure_renegotiation && - ssl->secure_renegotiation->tmp_keys.dtls_epoch > ssl->keys.dtls_epoch) { - order = CUR_ORDER; - } + order = DtlsCheckOrder(ssl, order); #endif if (order == PREV_ORDER) { @@ -6809,7 +6799,7 @@ static WC_INLINE void DtlsSEQIncrement(WOLFSSL* ssl, int order) #endif /* WOLFSSL_DTLS */ #if defined(WOLFSSL_DTLS) || !defined(WOLFSSL_NO_TLS12) -static WC_INLINE void WriteSEQ(WOLFSSL* ssl, int verifyOrder, byte* out) +void WriteSEQ(WOLFSSL* ssl, int verifyOrder, byte* out) { word32 seq[2] = {0, 0}; @@ -7232,9 +7222,14 @@ int VerifyForDtlsMsgPoolSend(WOLFSSL* ssl, byte type, word32 fragOffset) } +/** + * Verify if message `item` from `ssl->dtls_tx_msg_list` should be deleted + * depending on the current state of the handshake negotiation. + */ int VerifyForTxDtlsMsgDelete(WOLFSSL* ssl, DtlsMsg* item) { if (item->epoch < ssl->keys.dtls_epoch - 1) + /* Messages not from current or previous epoch can be deleted */ return 1; switch (ssl->options.side) { case WOLFSSL_CLIENT_END: @@ -7328,8 +7323,7 @@ int DtlsMsgPoolSend(WOLFSSL* ssl, int sendOnlyFirstPacket) * ssl->keys otherwise * PREV_ORDER will always use ssl->keys */ - if (ssl->secure_renegotiation && - ssl->secure_renegotiation->tmp_keys.dtls_epoch != 0) { + if (DtlsSCRKeysSet(ssl)) { if (pool->epoch == ssl->secure_renegotiation->tmp_keys.dtls_epoch) epochOrder = CUR_ORDER; else @@ -14098,17 +14092,10 @@ static WC_INLINE int DecryptDo(WOLFSSL* ssl, byte* plain, const byte* input, ssl->decrypt.additional + AEAD_LEN_OFFSET); #if defined(WOLFSSL_DTLS) && defined(HAVE_SECURE_RENEGOTIATION) - if (ssl->options.dtls && ssl->secure_renegotiation && - ssl->secure_renegotiation->tmp_keys.dtls_epoch != 0) { - if (ssl->keys.curEpoch == - ssl->secure_renegotiation->tmp_keys.dtls_epoch) - XMEMCPY(ssl->decrypt.nonce, - ssl->secure_renegotiation->tmp_keys.aead_dec_imp_IV, - AESGCM_IMP_IV_SZ); - else - XMEMCPY(ssl->decrypt.nonce, ssl->keys.aead_dec_imp_IV, - AESGCM_IMP_IV_SZ); - } + if (ssl->options.dtls && IsDtlsMsgSCRKeys(ssl)) + XMEMCPY(ssl->decrypt.nonce, + ssl->secure_renegotiation->tmp_keys.aead_dec_imp_IV, + AESGCM_IMP_IV_SZ); else #endif XMEMCPY(ssl->decrypt.nonce, ssl->keys.aead_dec_imp_IV, @@ -14237,8 +14224,7 @@ static WC_INLINE int Decrypt(WOLFSSL* ssl, byte* plain, const byte* input, case CIPHER_STATE_DO: { #if defined(WOLFSSL_DTLS) && defined(HAVE_SECURE_RENEGOTIATION) - if (ssl->options.dtls && ssl->secure_renegotiation && - ssl->secure_renegotiation->tmp_keys.dtls_epoch != 0) { + if (ssl->options.dtls && DtlsSCRKeysSet(ssl)) { /* For epochs >1 the current cipher parameters are located in * ssl->secure_renegotiation->tmp_keys. Previous cipher * parameters and for epoch 1 use ssl->keys */ @@ -16154,8 +16140,7 @@ int BuildMessage(WOLFSSL* ssl, byte* output, int outSz, const byte* input, ERROR_OUT(BAD_FUNC_ARG, exit_buildmsg); } #if defined(WOLFSSL_DTLS) && defined(HAVE_SECURE_RENEGOTIATION) - if (ssl->options.dtls && ssl->secure_renegotiation && - ssl->secure_renegotiation->tmp_keys.dtls_epoch != 0) { + if (ssl->options.dtls && DtlsSCRKeysSet(ssl)) { /* For epochs >1 the current cipher parameters are located in * ssl->secure_renegotiation->tmp_keys. Previous cipher * parameters and for epoch 1 use ssl->keys */ @@ -16408,10 +16393,7 @@ int BuildMessage(WOLFSSL* ssl, byte* output, int outSz, const byte* input, word16 dtls_sequence_number_hi; word32 dtls_sequence_number_lo; int swap_seq = ssl->options.dtls && epochOrder == PREV_ORDER && - ssl->secure_renegotiation && - ssl->secure_renegotiation->tmp_keys.dtls_epoch != 0 && - ssl->secure_renegotiation->tmp_keys.dtls_epoch == - ssl->keys.dtls_epoch; + DtlsUseSCRKeys(ssl); if (swap_seq) { dtls_epoch = ssl->keys.dtls_epoch; dtls_sequence_number_hi = ssl->keys.dtls_sequence_number_hi; @@ -17137,7 +17119,8 @@ int SendCertificateRequest(WOLFSSL* ssl) #endif } - sendSz += cipherExtraData(ssl); + if (IsEncryptionOn(ssl, 1)) + sendSz += cipherExtraData(ssl); /* check for available size */ if ((ret = CheckAvailableSize(ssl, sendSz)) != 0) @@ -17543,6 +17526,59 @@ int SendCertificateStatus(WOLFSSL* ssl) #endif /* WOLFSSL_NO_TLS12 */ + +#if defined(HAVE_SECURE_RENEGOTIATION) && defined(WOLFSSL_DTLS) +/** + * Check if the SCR keys are set in ssl->secure_renegotiation->tmp_keys. + */ +int DtlsSCRKeysSet(WOLFSSL* ssl) +{ + return ssl->secure_renegotiation && + ssl->secure_renegotiation->tmp_keys.dtls_epoch != 0; +} + +/** + * ssl->keys contains the current cipher parameters only for epoch 1. For + * epochs >1 ssl->secure_renegotiation->tmp_keys contains the current + * cipher parameters. This function checks if the message currently being + * processed should use ssl->keys or ssl->secure_renegotiation->tmp_keys. + */ +int IsDtlsMsgSCRKeys(WOLFSSL* ssl) +{ + return DtlsSCRKeysSet(ssl) && + ssl->keys.curEpoch == + ssl->secure_renegotiation->tmp_keys.dtls_epoch; +} + +/** + * ssl->keys contains the current cipher parameters only for epoch 1. For + * epochs >1 ssl->secure_renegotiation->tmp_keys contains the current + * cipher parameters. This function checks if the message currently being + * built should use ssl->keys or ssl->secure_renegotiation->tmp_keys. + */ +int DtlsUseSCRKeys(WOLFSSL* ssl) +{ + return DtlsSCRKeysSet(ssl) && + ssl->secure_renegotiation->tmp_keys.dtls_epoch == + ssl->keys.dtls_epoch; +} + +/** + * If ssl->secure_renegotiation->tmp_keys.dtls_epoch > ssl->keys.dtls_epoch + * then PREV_ORDER refers to the current epoch. + * */ +int DtlsCheckOrder(WOLFSSL* ssl, int order) +{ + if (order == PREV_ORDER && ssl->secure_renegotiation && + ssl->secure_renegotiation->tmp_keys.dtls_epoch > ssl->keys.dtls_epoch) { + return CUR_ORDER; + } + else { + return order; + } +} +#endif /* HAVE_SECURE_RENEGOTIATION && WOLFSSL_DTLS */ + /* If secure renegotiation is disabled, this will always return false. * Otherwise it checks to see if we are currently renegotiating. */ static WC_INLINE int IsSCR(WOLFSSL* ssl) diff --git a/src/ssl.c b/src/ssl.c index 3b74066e7..eeb024bed 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -3241,36 +3241,18 @@ const byte* wolfSSL_GetDtlsMacSecret(WOLFSSL* ssl, int verify, int epochOrder) return NULL; #ifdef HAVE_SECURE_RENEGOTIATION - /* ssl->keys contains the current cipher parameters only for epoch 1. For - * epochs >1 ssl->secure_renegotiation->tmp_keys contains the current - * cipher parameters */ switch (epochOrder) { case PEER_ORDER: - if (ssl->secure_renegotiation && - ssl->secure_renegotiation->tmp_keys.dtls_epoch != 0 && - ssl->keys.curEpoch == - ssl->secure_renegotiation->tmp_keys.dtls_epoch) + if (IsDtlsMsgSCRKeys(ssl)) keys = &ssl->secure_renegotiation->tmp_keys; else keys = &ssl->keys; break; case PREV_ORDER: - if (ssl->keys.dtls_epoch > 1 || - (ssl->secure_renegotiation && - ssl->secure_renegotiation->tmp_keys.dtls_epoch != 0)) - keys = &ssl->keys; - else { - WOLFSSL_MSG("No previous cipher epoch"); - return NULL; - } + keys = &ssl->keys; break; case CUR_ORDER: - if (ssl->secure_renegotiation && - ssl->secure_renegotiation->tmp_keys.dtls_epoch != 0 && - ssl->secure_renegotiation->tmp_keys.dtls_epoch == - ssl->keys.dtls_epoch) - /* new keys are in scr and are only current when the - * ssl->keys.dtls_epoch matches */ + if (DtlsUseSCRKeys(ssl)) keys = &ssl->secure_renegotiation->tmp_keys; else keys = &ssl->keys; diff --git a/src/tls.c b/src/tls.c index 18c911bfb..51ffe1757 100644 --- a/src/tls.c +++ b/src/tls.c @@ -643,79 +643,6 @@ int wolfSSL_make_eap_keys(WOLFSSL* ssl, void* msk, unsigned int len, } -static WC_INLINE void GetSEQIncrement(WOLFSSL* ssl, int verify, word32 seq[2]) -{ - if (verify) { - seq[0] = ssl->keys.peer_sequence_number_hi; - seq[1] = ssl->keys.peer_sequence_number_lo++; - if (seq[1] > ssl->keys.peer_sequence_number_lo) { - /* handle rollover */ - ssl->keys.peer_sequence_number_hi++; - } - } - else { - seq[0] = ssl->keys.sequence_number_hi; - seq[1] = ssl->keys.sequence_number_lo++; - if (seq[1] > ssl->keys.sequence_number_lo) { - /* handle rollover */ - ssl->keys.sequence_number_hi++; - } - } -} - - -#ifdef WOLFSSL_DTLS -static WC_INLINE void DtlsGetSEQ(WOLFSSL* ssl, int order, word32 seq[2]) -{ -#ifdef HAVE_SECURE_RENEGOTIATION - /* if ssl->secure_renegotiation->tmp_keys.dtls_epoch > ssl->keys.dtls_epoch then PREV_ORDER - * refers to the current epoch */ - if (order == PREV_ORDER && ssl->secure_renegotiation && - ssl->secure_renegotiation->tmp_keys.dtls_epoch > ssl->keys.dtls_epoch) { - order = CUR_ORDER; - } -#endif - if (order == PREV_ORDER) { - /* Previous epoch case */ - seq[0] = (((word32)ssl->keys.dtls_epoch - 1) << 16) | - (ssl->keys.dtls_prev_sequence_number_hi & 0xFFFF); - seq[1] = ssl->keys.dtls_prev_sequence_number_lo; - } - else if (order == PEER_ORDER) { - seq[0] = ((word32)ssl->keys.curEpoch << 16) | - (ssl->keys.curSeq_hi & 0xFFFF); - seq[1] = ssl->keys.curSeq_lo; /* explicit from peer */ - } - else { - seq[0] = ((word32)ssl->keys.dtls_epoch << 16) | - (ssl->keys.dtls_sequence_number_hi & 0xFFFF); - seq[1] = ssl->keys.dtls_sequence_number_lo; - } -} -#endif /* WOLFSSL_DTLS */ - - -static WC_INLINE void WriteSEQ(WOLFSSL* ssl, int verifyOrder, byte* out) -{ - word32 seq[2] = {0, 0}; - - if (!ssl->options.dtls) { - GetSEQIncrement(ssl, verifyOrder, seq); - } - else { -#ifdef WOLFSSL_DTLS - DtlsGetSEQ(ssl, verifyOrder, seq); -#endif - } - - c32toa(seq[0], out); - c32toa(seq[1], out + OPAQUE32_LEN); -} - - -/*** end copy ***/ - - /* return HMAC digest type in wolfSSL format */ int wolfSSL_GetHmacType(WOLFSSL* ssl) { @@ -1208,7 +1135,10 @@ int TLS_hmac(WOLFSSL* ssl, byte* digest, const byte* in, word32 sz, int padSz, } #endif - wolfSSL_SetTlsHmacInner(ssl, myInner, sz, content, epochOrder); + if (!ssl->options.dtls) + wolfSSL_SetTlsHmacInner(ssl, myInner, sz, content, verify); + else + wolfSSL_SetTlsHmacInner(ssl, myInner, sz, content, epochOrder); #if defined(WOLFSSL_RENESAS_TSIP_TLS) && \ !defined(NO_WOLFSSL_RENESAS_TSIP_TLS_SESSION) if (tsip_useable(ssl)) { diff --git a/src/tls13.c b/src/tls13.c index c70e37241..7507e417a 100644 --- a/src/tls13.c +++ b/src/tls13.c @@ -1474,7 +1474,7 @@ static void AddTls13FragHeaders(byte* output, word32 fragSz, word32 fragOffset, * verifyOrder Which set of sequence numbers to use. * out The buffer to write into. */ -static WC_INLINE void WriteSEQ(WOLFSSL* ssl, int verifyOrder, byte* out) +static WC_INLINE void WriteSEQTls13(WOLFSSL* ssl, int verifyOrder, byte* out) { word32 seq[2] = {0, 0}; @@ -1510,7 +1510,7 @@ static WC_INLINE void BuildTls13Nonce(WOLFSSL* ssl, byte* nonce, const byte* iv, int i; /* The nonce is the IV with the sequence XORed into the last bytes. */ - WriteSEQ(ssl, order, nonce + AEAD_NONCE_SZ - SEQ_SZ); + WriteSEQTls13(ssl, order, nonce + AEAD_NONCE_SZ - SEQ_SZ); for (i = 0; i < AEAD_NONCE_SZ - SEQ_SZ; i++) nonce[i] = iv[i]; for (; i < AEAD_NONCE_SZ; i++) diff --git a/wolfssl/internal.h b/wolfssl/internal.h index 304ed443b..1aeec5125 100644 --- a/wolfssl/internal.h +++ b/wolfssl/internal.h @@ -4516,10 +4516,14 @@ WOLFSSL_LOCAL int GrowInputBuffer(WOLFSSL* ssl, int size, int usedLength); WOLFSSL_LOCAL int DtlsMsgPoolSend(WOLFSSL*, int); #endif /* WOLFSSL_DTLS */ -#ifndef NO_TLS +#if defined(HAVE_SECURE_RENEGOTIATION) && defined(WOLFSSL_DTLS) + WOLFSSL_LOCAL int DtlsSCRKeysSet(WOLFSSL* ssl); + WOLFSSL_LOCAL int IsDtlsMsgSCRKeys(WOLFSSL* ssl); + WOLFSSL_LOCAL int DtlsUseSCRKeys(WOLFSSL* ssl); + WOLFSSL_LOCAL int DtlsCheckOrder(WOLFSSL* ssl, int order); +#endif - -#endif /* NO_TLS */ + WOLFSSL_LOCAL void WriteSEQ(WOLFSSL* ssl, int verifyOrder, byte* out); #if defined(WOLFSSL_TLS13) && (defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)) WOLFSSL_LOCAL word32 TimeNowInMilliseconds(void); From cab8dd37311056485e38c23c608220366d763d27 Mon Sep 17 00:00:00 2001 From: Unknown Date: Fri, 12 Jun 2020 12:27:48 +0200 Subject: [PATCH 228/298] Ignore duplicate or out of order CCS message Init variables since compiler complains they might be used without initialization. --- src/internal.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/internal.c b/src/internal.c index 3f58fe9c3..6d4b4b91a 100644 --- a/src/internal.c +++ b/src/internal.c @@ -15534,7 +15534,8 @@ int ProcessReply(WOLFSSL* ssl) * skipped. Also skip if out of order. */ if (ret != DUPLICATE_MSG_E && ret != OUT_OF_ORDER_E) return ret; - + /* Reset error */ + ret = 0; break; #endif /* WOLFSSL_DTLS */ } @@ -16389,9 +16390,9 @@ int BuildMessage(WOLFSSL* ssl, byte* output, int outSz, const byte* input, #if defined(HAVE_SECURE_RENEGOTIATION) && defined(WOLFSSL_DTLS) /* If we want the PREV_ORDER then modify CUR_ORDER sequence number * for all encryption algos that use it for encryption parameters */ - word16 dtls_epoch; - word16 dtls_sequence_number_hi; - word32 dtls_sequence_number_lo; + word16 dtls_epoch = 0; + word16 dtls_sequence_number_hi = 0; + word32 dtls_sequence_number_lo = 0; int swap_seq = ssl->options.dtls && epochOrder == PREV_ORDER && DtlsUseSCRKeys(ssl); if (swap_seq) { From 0f36cdf066cd1553cfa2153180e072efc00c7487 Mon Sep 17 00:00:00 2001 From: Eric Blankenhorn Date: Fri, 12 Jun 2020 10:43:01 -0500 Subject: [PATCH 229/298] Unused var error --- src/ssl.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/ssl.c b/src/ssl.c index 62b7b0414..97f523056 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -42972,8 +42972,10 @@ WOLF_STACK_OF(WOLFSSL_CIPHER) *wolfSSL_get_ciphers_compat(const WOLFSSL *ssl) { WOLF_STACK_OF(WOLFSSL_CIPHER)* ret = NULL; Suites* suites; +#if defined(OPENSSL_ALL) || defined(WOLFSSL_QT) const CipherSuiteInfo* cipher_names = GetCipherNames(); int cipherSz = GetCipherNamesSize(); +#endif WOLFSSL_ENTER("wolfSSL_get_ciphers_compat"); if (ssl == NULL || (ssl->suites == NULL && ssl->ctx->suites == NULL)) { From 2b5ed1564ccb9618519dce7d9c18d6f1245d6862 Mon Sep 17 00:00:00 2001 From: JacobBarthelmeh Date: Fri, 12 Jun 2020 09:45:23 -0700 Subject: [PATCH 230/298] add error function and print out --- wrapper/CSharp/include.am | 84 +++++++++---------- .../wolfSSL-Example-IOCallbacks.cs | 7 +- wrapper/CSharp/wolfSSL_CSharp/wolfSSL.cs | 25 ++++++ 3 files changed, 71 insertions(+), 45 deletions(-) diff --git a/wrapper/CSharp/include.am b/wrapper/CSharp/include.am index 8e49779d4..549d7efb8 100644 --- a/wrapper/CSharp/include.am +++ b/wrapper/CSharp/include.am @@ -1,42 +1,42 @@ -# wolfSSL CSharp wrapper files -EXTRA_DIST+= wrapper/CSharp/wolfSSL-DTLS-PSK-Server/App.config -EXTRA_DIST+= wrapper/CSharp/wolfSSL-DTLS-PSK-Server/Properties/AssemblyInfo.cs -EXTRA_DIST+= wrapper/CSharp/wolfSSL-DTLS-PSK-Server/wolfSSL-DTLS-PSK-Server.cs -EXTRA_DIST+= wrapper/CSharp/wolfSSL-DTLS-PSK-Server/wolfSSL-DTLS-PSK-Server.csproj -EXTRA_DIST+= wrapper/CSharp/wolfSSL-DTLS-Server/App.config -EXTRA_DIST+= wrapper/CSharp/wolfSSL-DTLS-Server/Properties/AssemblyInfo.cs -EXTRA_DIST+= wrapper/CSharp/wolfSSL-DTLS-Server/wolfSSL-DTLS-Server.cs -EXTRA_DIST+= wrapper/CSharp/wolfSSL-DTLS-Server/wolfSSL-DTLS-Server.csproj -EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-PSK-Server/App.config -EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-PSK-Server/Properties/AssemblyInfo.cs -EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-PSK-Server/wolfSSL-TLS-PSK-Server.cs -EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-PSK-Server/wolfSSL-TLS-PSK-Server.csproj -EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-Server/App.config -EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-Server/Properties/AssemblyInfo.cs -EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-Server/Properties/Settings.Designer.cs -EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-Server/Properties/Settings.settings -EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-Server/wolfSSL-TLS-Server.cs -EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-Server/wolfSSL-TLS-Server.csproj -EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-ServerThreaded/App.config -EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-ServerThreaded/Properties/AssemblyInfo.cs -EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-ServerThreaded/Properties/Settings.Designer.cs -EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-ServerThreaded/Properties/Settings.settings -EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-ServerThreaded/wolfSSL-TLS-ServerThreaded.cs -EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-ServerThreaded/wolfSSL-TLS-ServerThreaded.csproj -EXTRA_DIST+= wrapper/CSharp/wolfSSL-Example-IOCallbacks/App.config -EXTRA_DIST+= wrapper/CSharp/wolfSSL-Example-IOCallbacks/Properties/AssemblyInfo.cs -EXTRA_DIST+= wrapper/CSharp/wolfSSL-Example-IOCallbacks/wolfSSL-Example-IOCallbacks.cs -EXTRA_DIST+= wrapper/CSharp/wolfSSL-Example-IOCallbacks/wolfSSL-Example-IOCallbacks.csproj -EXTRA_DIST+= wrapper/CSharp/wolfSSL_CSharp.sln -EXTRA_DIST+= wrapper/CSharp/wolfSSL_CSharp/Properties/AssemblyInfo.cs -EXTRA_DIST+= wrapper/CSharp/wolfSSL_CSharp/Properties/Resources.Designer.cs -EXTRA_DIST+= wrapper/CSharp/wolfSSL_CSharp/Properties/Resources.resx -EXTRA_DIST+= wrapper/CSharp/wolfSSL_CSharp/wolfSSL.cs -EXTRA_DIST+= wrapper/CSharp/wolfSSL_CSharp/X509.cs -EXTRA_DIST+= wrapper/CSharp/wolfSSL_CSharp/wolfSSL_CSharp.csproj -EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-Client/App.config -EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-Client/Properties/AssemblyInfo.cs -EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-Client/Properties/Settings.Designer.cs -EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-Client/Properties/Settings.settings -EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-Client/wolfSSL-TLS-Client.cs -EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-Client/wolfSSL-TLS-Client.csproj +# wolfSSL CSharp wrapper files +EXTRA_DIST+= wrapper/CSharp/wolfSSL-DTLS-PSK-Server/App.config +EXTRA_DIST+= wrapper/CSharp/wolfSSL-DTLS-PSK-Server/Properties/AssemblyInfo.cs +EXTRA_DIST+= wrapper/CSharp/wolfSSL-DTLS-PSK-Server/wolfSSL-DTLS-PSK-Server.cs +EXTRA_DIST+= wrapper/CSharp/wolfSSL-DTLS-PSK-Server/wolfSSL-DTLS-PSK-Server.csproj +EXTRA_DIST+= wrapper/CSharp/wolfSSL-DTLS-Server/App.config +EXTRA_DIST+= wrapper/CSharp/wolfSSL-DTLS-Server/Properties/AssemblyInfo.cs +EXTRA_DIST+= wrapper/CSharp/wolfSSL-DTLS-Server/wolfSSL-DTLS-Server.cs +EXTRA_DIST+= wrapper/CSharp/wolfSSL-DTLS-Server/wolfSSL-DTLS-Server.csproj +EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-PSK-Server/App.config +EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-PSK-Server/Properties/AssemblyInfo.cs +EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-PSK-Server/wolfSSL-TLS-PSK-Server.cs +EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-PSK-Server/wolfSSL-TLS-PSK-Server.csproj +EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-Server/App.config +EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-Server/Properties/AssemblyInfo.cs +EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-Server/Properties/Settings.Designer.cs +EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-Server/Properties/Settings.settings +EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-Server/wolfSSL-TLS-Server.cs +EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-Server/wolfSSL-TLS-Server.csproj +EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-ServerThreaded/App.config +EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-ServerThreaded/Properties/AssemblyInfo.cs +EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-ServerThreaded/Properties/Settings.Designer.cs +EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-ServerThreaded/Properties/Settings.settings +EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-ServerThreaded/wolfSSL-TLS-ServerThreaded.cs +EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-ServerThreaded/wolfSSL-TLS-ServerThreaded.csproj +EXTRA_DIST+= wrapper/CSharp/wolfSSL-Example-IOCallbacks/App.config +EXTRA_DIST+= wrapper/CSharp/wolfSSL-Example-IOCallbacks/Properties/AssemblyInfo.cs +EXTRA_DIST+= wrapper/CSharp/wolfSSL-Example-IOCallbacks/wolfSSL-Example-IOCallbacks.cs +EXTRA_DIST+= wrapper/CSharp/wolfSSL-Example-IOCallbacks/wolfSSL-Example-IOCallbacks.csproj +EXTRA_DIST+= wrapper/CSharp/wolfSSL_CSharp.sln +EXTRA_DIST+= wrapper/CSharp/wolfSSL_CSharp/Properties/AssemblyInfo.cs +EXTRA_DIST+= wrapper/CSharp/wolfSSL_CSharp/Properties/Resources.Designer.cs +EXTRA_DIST+= wrapper/CSharp/wolfSSL_CSharp/Properties/Resources.resx +EXTRA_DIST+= wrapper/CSharp/wolfSSL_CSharp/wolfSSL.cs +EXTRA_DIST+= wrapper/CSharp/wolfSSL_CSharp/X509.cs +EXTRA_DIST+= wrapper/CSharp/wolfSSL_CSharp/wolfSSL_CSharp.csproj +EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-Client/App.config +EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-Client/Properties/AssemblyInfo.cs +EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-Client/Properties/Settings.Designer.cs +EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-Client/Properties/Settings.settings +EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-Client/wolfSSL-TLS-Client.cs +EXTRA_DIST+= wrapper/CSharp/wolfSSL-TLS-Client/wolfSSL-TLS-Client.csproj diff --git a/wrapper/CSharp/wolfSSL-Example-IOCallbacks/wolfSSL-Example-IOCallbacks.cs b/wrapper/CSharp/wolfSSL-Example-IOCallbacks/wolfSSL-Example-IOCallbacks.cs index 239f9321f..8f0e0e27f 100644 --- a/wrapper/CSharp/wolfSSL-Example-IOCallbacks/wolfSSL-Example-IOCallbacks.cs +++ b/wrapper/CSharp/wolfSSL-Example-IOCallbacks/wolfSSL-Example-IOCallbacks.cs @@ -149,6 +149,7 @@ class wolfSSL_Example_IOCallbacks } Console.WriteLine("Status of certificate verify = " + preverify); + Console.WriteLine("Error value for cert store is " + wolfssl.X509_STORE_CTX_get_error(store)); /* look at the current cert in store */ try @@ -171,7 +172,7 @@ class wolfSSL_Example_IOCallbacks } catch (Exception e) { - Console.WriteLine("Unable to get X509's"); + Console.WriteLine("Unable to get X509's" + e); } /* list all certs in store */ @@ -190,11 +191,11 @@ class wolfSSL_Example_IOCallbacks } catch (Exception e) { - Console.WriteLine("Unable to get X509's"); + Console.WriteLine("Unable to get X509's" + e); } /* by returning 1 here we override any failure and report success */ - return 1; + return preverify; } private static void clean(IntPtr ssl, IntPtr ctx) diff --git a/wrapper/CSharp/wolfSSL_CSharp/wolfSSL.cs b/wrapper/CSharp/wolfSSL_CSharp/wolfSSL.cs index 36e81b2b9..6d9ac13da 100644 --- a/wrapper/CSharp/wolfSSL_CSharp/wolfSSL.cs +++ b/wrapper/CSharp/wolfSSL_CSharp/wolfSSL.cs @@ -339,6 +339,8 @@ namespace wolfSSL.CSharp { [DllImport(wolfssl_dll, CallingConvention = CallingConvention.Cdecl)] private extern static IntPtr wolfSSL_X509_STORE_CTX_get_current_cert(IntPtr x509Ctx); [DllImport(wolfssl_dll, CallingConvention = CallingConvention.Cdecl)] + private extern static int wolfSSL_X509_STORE_CTX_get_error(IntPtr sk); + [DllImport(wolfssl_dll, CallingConvention = CallingConvention.Cdecl)] private extern static IntPtr wolfSSL_X509_STORE_GetCerts(IntPtr x509Ctx); [DllImport(wolfssl_dll, CallingConvention = CallingConvention.Cdecl)] private extern static int wolfSSL_sk_X509_num(IntPtr sk); @@ -1949,6 +1951,29 @@ namespace wolfSSL.CSharp { } } + + /// + /// Get the current WOLFSSL_X509_STORE_CTX error value + /// + /// pointer to store to get error from + public static int X509_STORE_CTX_get_error(IntPtr x509Ctx) + { + try + { + if (x509Ctx == IntPtr.Zero) + { + log(ERROR_LOG, "pointer passed in was not set"); + return -1; + } + return wolfSSL_X509_STORE_CTX_get_error(x509Ctx); + } + catch (Exception e) + { + log(ERROR_LOG, "wolfssl WOLFSSL_X509_STORE_CTX error " + e.ToString()); + return -1; + } + } + /// /// Print low level C library debug messages to stdout when compiled with macro DEBUG_WOLFSSL /// From d43d75bf81fa2c426ae2cb034302349da655c28f Mon Sep 17 00:00:00 2001 From: David Garske Date: Fri, 12 Jun 2020 10:39:26 -0700 Subject: [PATCH 231/298] Updates to xcode projects to add new files. Ran updated iPhone X benchmarks: ``` RNG 330 MB took 1.010 seconds, 326.879 MB/s AES-128-CBC-enc 920 MB took 1.005 seconds, 915.507 MB/s AES-128-CBC-dec 6095 MB took 1.000 seconds, 6092.130 MB/s AES-192-CBC-enc 820 MB took 1.000 seconds, 819.644 MB/s AES-192-CBC-dec 4860 MB took 1.001 seconds, 4855.794 MB/s AES-256-CBC-enc 710 MB took 1.005 seconds, 706.419 MB/s AES-256-CBC-dec 3935 MB took 1.001 seconds, 3930.830 MB/s AES-128-GCM-enc 1245 MB took 1.003 seconds, 1241.589 MB/s AES-128-GCM-dec 575 MB took 1.001 seconds, 574.547 MB/s AES-192-GCM-enc 1235 MB took 1.001 seconds, 1234.343 MB/s AES-192-GCM-dec 570 MB took 1.003 seconds, 568.521 MB/s AES-256-GCM-enc 1230 MB took 1.003 seconds, 1226.034 MB/s AES-256-GCM-dec 570 MB took 1.001 seconds, 569.199 MB/s 3DES 10 MB took 1.386 seconds, 7.213 MB/s MD5 95 MB took 1.037 seconds, 91.629 MB/s SHA 80 MB took 1.013 seconds, 78.943 MB/s SHA-256 1625 MB took 1.000 seconds, 1624.565 MB/s SHA3-224 60 MB took 1.010 seconds, 59.399 MB/s SHA3-256 60 MB took 1.073 seconds, 55.921 MB/s SHA3-384 45 MB took 1.042 seconds, 43.195 MB/s SHA3-512 35 MB took 1.164 seconds, 30.063 MB/s HMAC-MD5 95 MB took 1.044 seconds, 91.014 MB/s HMAC-SHA 80 MB took 1.007 seconds, 79.480 MB/s HMAC-SHA256 1705 MB took 1.001 seconds, 1703.126 MB/s RSA 2048 public 32800 ops took 1.003 sec, avg 0.031 ms, 32716.405 ops/sec RSA 2048 private 1200 ops took 1.041 sec, avg 0.868 ms, /33 ops/sec DH 2048 key gen 2354 ops took 1.000 sec, avg 0.425 ms, 2353.254 ops/sec DH 2048 agree 2500 ops took 1.013 sec, avg 0.405 ms, 2467.525 ops/sec ECC 256 key gen 46503 ops took 1.000 sec, avg 0.022 ms, 46502.069 ops/sec ECDHE 256 agree 14100 ops took 1.005 sec, avg 0.071 ms, 14034.697 ops/sec ECDSA 256 sign 29600 ops took 1.003 sec, avg 0.034 ms, 29500.554 ops/sec ECDSA 256 verify 11000 ops took 1.007 sec, avg 0.092 ms, 10921.516 ops/sec ``` --- .../wolfBench.xcodeproj/project.pbxproj | 76 ++++++- IDE/XCODE/user_settings.h | 2 + IDE/XCODE/wolfssl.xcodeproj/project.pbxproj | 191 +++++++++++++++++- wolfcrypt/benchmark/benchmark.c | 13 +- wolfcrypt/src/ecc.c | 2 +- 5 files changed, 269 insertions(+), 15 deletions(-) diff --git a/IDE/XCODE/Benchmark/wolfBench.xcodeproj/project.pbxproj b/IDE/XCODE/Benchmark/wolfBench.xcodeproj/project.pbxproj index 2a4bdc93b..9850627f9 100644 --- a/IDE/XCODE/Benchmark/wolfBench.xcodeproj/project.pbxproj +++ b/IDE/XCODE/Benchmark/wolfBench.xcodeproj/project.pbxproj @@ -8,6 +8,24 @@ /* Begin PBXBuildFile section */ 52114C8721B5A7320022ADA1 /* sp_c64.c in Sources */ = {isa = PBXBuildFile; fileRef = 52114C8621B5A7320022ADA1 /* sp_c64.c */; }; + A46FE16F2493E8F800A25BE7 /* armv8-chacha.c in Sources */ = {isa = PBXBuildFile; fileRef = A46FE14C2493E8F500A25BE7 /* armv8-chacha.c */; }; + A46FE1702493E8F800A25BE7 /* sp_int.c in Sources */ = {isa = PBXBuildFile; fileRef = A46FE14D2493E8F600A25BE7 /* sp_int.c */; }; + A46FE1732493E8F800A25BE7 /* armv8-poly1305.c in Sources */ = {isa = PBXBuildFile; fileRef = A46FE1502493E8F600A25BE7 /* armv8-poly1305.c */; }; + A46FE1742493E8F800A25BE7 /* sp_cortexm.c in Sources */ = {isa = PBXBuildFile; fileRef = A46FE1512493E8F600A25BE7 /* sp_cortexm.c */; }; + A46FE1752493E8F800A25BE7 /* blake2s.c in Sources */ = {isa = PBXBuildFile; fileRef = A46FE1522493E8F600A25BE7 /* blake2s.c */; }; + A46FE1772493E8F800A25BE7 /* wc_pkcs11.c in Sources */ = {isa = PBXBuildFile; fileRef = A46FE1542493E8F600A25BE7 /* wc_pkcs11.c */; }; + A46FE1792493E8F800A25BE7 /* sp_arm64.c in Sources */ = {isa = PBXBuildFile; fileRef = A46FE1562493E8F600A25BE7 /* sp_arm64.c */; }; + A46FE17A2493E8F800A25BE7 /* cryptocb.c in Sources */ = {isa = PBXBuildFile; fileRef = A46FE1572493E8F600A25BE7 /* cryptocb.c */; }; + A46FE1802493E8F800A25BE7 /* ed448.c in Sources */ = {isa = PBXBuildFile; fileRef = A46FE15D2493E8F700A25BE7 /* ed448.c */; }; + A46FE1812493E8F800A25BE7 /* wc_dsp.c in Sources */ = {isa = PBXBuildFile; fileRef = A46FE15E2493E8F700A25BE7 /* wc_dsp.c */; }; + A46FE1842493E8F800A25BE7 /* sp_x86_64.c in Sources */ = {isa = PBXBuildFile; fileRef = A46FE1612493E8F700A25BE7 /* sp_x86_64.c */; }; + A46FE1852493E8F800A25BE7 /* sp_armthumb.c in Sources */ = {isa = PBXBuildFile; fileRef = A46FE1622493E8F700A25BE7 /* sp_armthumb.c */; }; + A46FE1882493E8F800A25BE7 /* sp_arm32.c in Sources */ = {isa = PBXBuildFile; fileRef = A46FE1652493E8F700A25BE7 /* sp_arm32.c */; }; + A46FE1892493E8F800A25BE7 /* sp_dsp32.c in Sources */ = {isa = PBXBuildFile; fileRef = A46FE1662493E8F800A25BE7 /* sp_dsp32.c */; }; + A46FE18A2493E8F800A25BE7 /* ge_448.c in Sources */ = {isa = PBXBuildFile; fileRef = A46FE1672493E8F800A25BE7 /* ge_448.c */; }; + A46FE18B2493E8F800A25BE7 /* curve448.c in Sources */ = {isa = PBXBuildFile; fileRef = A46FE1682493E8F800A25BE7 /* curve448.c */; }; + A46FE18D2493E8F800A25BE7 /* fe_448.c in Sources */ = {isa = PBXBuildFile; fileRef = A46FE16A2493E8F800A25BE7 /* fe_448.c */; }; + A46FE1912493E8F800A25BE7 /* sp_c32.c in Sources */ = {isa = PBXBuildFile; fileRef = A46FE16E2493E8F800A25BE7 /* sp_c32.c */; }; A47546261FD90492005176B9 /* tls_bench.c in Sources */ = {isa = PBXBuildFile; fileRef = A47546251FD90492005176B9 /* tls_bench.c */; }; A4ADF82F1FCE0BD300A06E90 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = A4ADF82E1FCE0BD300A06E90 /* AppDelegate.m */; }; A4ADF8321FCE0BD300A06E90 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = A4ADF8311FCE0BD300A06E90 /* ViewController.m */; }; @@ -85,6 +103,24 @@ /* Begin PBXFileReference section */ 52114C8621B5A7320022ADA1 /* sp_c64.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = sp_c64.c; path = ../../../wolfcrypt/src/sp_c64.c; sourceTree = ""; }; + A46FE14C2493E8F500A25BE7 /* armv8-chacha.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "armv8-chacha.c"; path = "../../../wolfcrypt/src/port/arm/armv8-chacha.c"; sourceTree = ""; }; + A46FE14D2493E8F600A25BE7 /* sp_int.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = sp_int.c; path = ../../../wolfcrypt/src/sp_int.c; sourceTree = ""; }; + A46FE1502493E8F600A25BE7 /* armv8-poly1305.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "armv8-poly1305.c"; path = "../../../wolfcrypt/src/port/arm/armv8-poly1305.c"; sourceTree = ""; }; + A46FE1512493E8F600A25BE7 /* sp_cortexm.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = sp_cortexm.c; path = ../../../wolfcrypt/src/sp_cortexm.c; sourceTree = ""; }; + A46FE1522493E8F600A25BE7 /* blake2s.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = blake2s.c; path = ../../../wolfcrypt/src/blake2s.c; sourceTree = ""; }; + A46FE1542493E8F600A25BE7 /* wc_pkcs11.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = wc_pkcs11.c; path = ../../../wolfcrypt/src/wc_pkcs11.c; sourceTree = ""; }; + A46FE1562493E8F600A25BE7 /* sp_arm64.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = sp_arm64.c; path = ../../../wolfcrypt/src/sp_arm64.c; sourceTree = ""; }; + A46FE1572493E8F600A25BE7 /* cryptocb.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cryptocb.c; path = ../../../wolfcrypt/src/cryptocb.c; sourceTree = ""; }; + A46FE15D2493E8F700A25BE7 /* ed448.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ed448.c; path = ../../../wolfcrypt/src/ed448.c; sourceTree = ""; }; + A46FE15E2493E8F700A25BE7 /* wc_dsp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = wc_dsp.c; path = ../../../wolfcrypt/src/wc_dsp.c; sourceTree = ""; }; + A46FE1612493E8F700A25BE7 /* sp_x86_64.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = sp_x86_64.c; path = ../../../wolfcrypt/src/sp_x86_64.c; sourceTree = ""; }; + A46FE1622493E8F700A25BE7 /* sp_armthumb.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = sp_armthumb.c; path = ../../../wolfcrypt/src/sp_armthumb.c; sourceTree = ""; }; + A46FE1652493E8F700A25BE7 /* sp_arm32.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = sp_arm32.c; path = ../../../wolfcrypt/src/sp_arm32.c; sourceTree = ""; }; + A46FE1662493E8F800A25BE7 /* sp_dsp32.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = sp_dsp32.c; path = ../../../wolfcrypt/src/sp_dsp32.c; sourceTree = ""; }; + A46FE1672493E8F800A25BE7 /* ge_448.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ge_448.c; path = ../../../wolfcrypt/src/ge_448.c; sourceTree = ""; }; + A46FE1682493E8F800A25BE7 /* curve448.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = curve448.c; path = ../../../wolfcrypt/src/curve448.c; sourceTree = ""; }; + A46FE16A2493E8F800A25BE7 /* fe_448.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = fe_448.c; path = ../../../wolfcrypt/src/fe_448.c; sourceTree = ""; }; + A46FE16E2493E8F800A25BE7 /* sp_c32.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = sp_c32.c; path = ../../../wolfcrypt/src/sp_c32.c; sourceTree = ""; }; A47546241FD9042D005176B9 /* user_settings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = user_settings.h; path = ../user_settings.h; sourceTree = ""; }; A47546251FD90492005176B9 /* tls_bench.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = tls_bench.c; path = ../../../examples/benchmark/tls_bench.c; sourceTree = ""; }; A4ADF82A1FCE0BD300A06E90 /* wolfBench.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = wolfBench.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -233,13 +269,16 @@ A4ADF8601FCE0BFB00A06E90 /* wolfCrypt */ = { isa = PBXGroup; children = ( - A4DFEC0F1FD4CB8500A7BB33 /* armv8-aes.c */, - A4DFEC0E1FD4CB8500A7BB33 /* armv8-sha256.c */, A4ADF8821FCE0C4D00A06E90 /* aes.c */, A4ADF8921FCE0C4E00A06E90 /* arc4.c */, + A4DFEC0F1FD4CB8500A7BB33 /* armv8-aes.c */, + A46FE14C2493E8F500A25BE7 /* armv8-chacha.c */, + A46FE1502493E8F600A25BE7 /* armv8-poly1305.c */, + A4DFEC0E1FD4CB8500A7BB33 /* armv8-sha256.c */, A4ADF8A01FCE0C4F00A06E90 /* asm.c */, A4ADF8C21FCE0C5300A06E90 /* asn.c */, A4ADF8B11FCE0C5100A06E90 /* blake2b.c */, + A46FE1522493E8F600A25BE7 /* blake2s.c */, A4ADF8C71FCE0C5400A06E90 /* camellia.c */, A4ADF8CA1FCE0C5500A06E90 /* chacha.c */, A4ADF88F1FCE0C4E00A06E90 /* chacha20_poly1305.c */, @@ -247,16 +286,21 @@ A4ADF8CE1FCE0C5500A06E90 /* coding.c */, A4ADF8871FCE0C4D00A06E90 /* compress.c */, A4ADF8C11FCE0C5300A06E90 /* cpuid.c */, + A46FE1572493E8F600A25BE7 /* cryptocb.c */, + A46FE1682493E8F800A25BE7 /* curve448.c */, A4ADF8801FCE0C4D00A06E90 /* curve25519.c */, A4ADF8A81FCE0C5000A06E90 /* des3.c */, A4ADF8AB1FCE0C5000A06E90 /* dh.c */, A4ADF87D1FCE0C4D00A06E90 /* dsa.c */, A4ADF8841FCE0C4D00A06E90 /* ecc_fp.c */, A4ADF8CC1FCE0C5500A06E90 /* ecc.c */, + A46FE15D2493E8F700A25BE7 /* ed448.c */, A4ADF8CB1FCE0C5500A06E90 /* ed25519.c */, A4ADF8811FCE0C4D00A06E90 /* error.c */, + A46FE16A2493E8F800A25BE7 /* fe_448.c */, A4ADF89C1FCE0C4F00A06E90 /* fe_low_mem.c */, A4ADF8BA1FCE0C5300A06E90 /* fe_operations.c */, + A46FE1672493E8F800A25BE7 /* ge_448.c */, A4ADF8D01FCE0C5500A06E90 /* ge_low_mem.c */, A4ADF88E1FCE0C4E00A06E90 /* ge_operations.c */, A4ADF89A1FCE0C4F00A06E90 /* hash.c */, @@ -282,10 +326,20 @@ A4ADF8831FCE0C4D00A06E90 /* sha256.c */, A4ADF8AE1FCE0C5100A06E90 /* sha512.c */, A4ADF8B71FCE0C5200A06E90 /* signature.c */, + A46FE1652493E8F700A25BE7 /* sp_arm32.c */, + A46FE1562493E8F600A25BE7 /* sp_arm64.c */, + A46FE1622493E8F700A25BE7 /* sp_armthumb.c */, + A46FE16E2493E8F800A25BE7 /* sp_c32.c */, 52114C8621B5A7320022ADA1 /* sp_c64.c */, + A46FE1512493E8F600A25BE7 /* sp_cortexm.c */, + A46FE1662493E8F800A25BE7 /* sp_dsp32.c */, + A46FE14D2493E8F600A25BE7 /* sp_int.c */, + A46FE1612493E8F700A25BE7 /* sp_x86_64.c */, A4ADF8BF1FCE0C5300A06E90 /* srp.c */, A4ADF8881FCE0C4D00A06E90 /* tfm.c */, + A46FE15E2493E8F700A25BE7 /* wc_dsp.c */, A4ADF8AA1FCE0C5000A06E90 /* wc_encrypt.c */, + A46FE1542493E8F600A25BE7 /* wc_pkcs11.c */, A4ADF8B61FCE0C5200A06E90 /* wc_port.c */, A4ADF87B1FCE0C4D00A06E90 /* wolfevent.c */, A4ADF8B81FCE0C5200A06E90 /* wolfmath.c */, @@ -381,33 +435,46 @@ buildActionMask = 2147483647; files = ( A4ADF9041FCE0C5600A06E90 /* des3.c in Sources */, + A46FE18A2493E8F800A25BE7 /* ge_448.c in Sources */, A4ADF9121FCE0C5600A06E90 /* wc_port.c in Sources */, A4ADF8E41FCE0C5600A06E90 /* tfm.c in Sources */, A4ADF8D91FCE0C5600A06E90 /* dsa.c in Sources */, A4ADF9141FCE0C5600A06E90 /* wolfmath.c in Sources */, A4ADF8FC1FCE0C5600A06E90 /* asm.c in Sources */, + A46FE18D2493E8F800A25BE7 /* fe_448.c in Sources */, A4ADF8721FCE0C1C00A06E90 /* crl.c in Sources */, A4ADF91B1FCE0C5600A06E90 /* srp.c in Sources */, A4ADF9101FCE0C5600A06E90 /* rabbit.c in Sources */, A4ADF9091FCE0C5600A06E90 /* idea.c in Sources */, + A46FE16F2493E8F800A25BE7 /* armv8-chacha.c in Sources */, A4ADF8FE1FCE0C5600A06E90 /* integer.c in Sources */, A4ADF9231FCE0C5600A06E90 /* camellia.c in Sources */, A4ADF8321FCE0BD300A06E90 /* ViewController.m in Sources */, + A46FE17A2493E8F800A25BE7 /* cryptocb.c in Sources */, + A46FE18B2493E8F800A25BE7 /* curve448.c in Sources */, A4ADF8DB1FCE0C5600A06E90 /* hc128.c in Sources */, A4ADF8E31FCE0C5600A06E90 /* compress.c in Sources */, A4ADF8731FCE0C1C00A06E90 /* tls13.c in Sources */, A4ADF90D1FCE0C5600A06E90 /* blake2b.c in Sources */, A4ADF9071FCE0C5600A06E90 /* dh.c in Sources */, + A46FE1912493E8F800A25BE7 /* sp_c32.c in Sources */, A4ADF8F31FCE0C5600A06E90 /* rsa.c in Sources */, + A46FE1752493E8F800A25BE7 /* blake2s.c in Sources */, A4ADF8FA1FCE0C5600A06E90 /* pkcs12.c in Sources */, A4ADF86E1FCE0C1C00A06E90 /* ocsp.c in Sources */, + A46FE1842493E8F800A25BE7 /* sp_x86_64.c in Sources */, + A46FE1792493E8F800A25BE7 /* sp_arm64.c in Sources */, + A46FE1742493E8F800A25BE7 /* sp_cortexm.c in Sources */, A4ADF9281FCE0C5600A06E90 /* ecc.c in Sources */, + A46FE1852493E8F800A25BE7 /* sp_armthumb.c in Sources */, A4ADF91C1FCE0C5600A06E90 /* pwdbased.c in Sources */, A4ADF92C1FCE0C5600A06E90 /* ge_low_mem.c in Sources */, A4ADF90C1FCE0C5600A06E90 /* ripemd.c in Sources */, A4ADF8D51FCE0C5600A06E90 /* md5.c in Sources */, + A46FE1892493E8F800A25BE7 /* sp_dsp32.c in Sources */, A4ADF8DF1FCE0C5600A06E90 /* sha256.c in Sources */, A4ADF8711FCE0C1C00A06E90 /* sniffer.c in Sources */, + A46FE1882493E8F800A25BE7 /* sp_arm32.c in Sources */, A4ADF8701FCE0C1C00A06E90 /* tls.c in Sources */, A4ADF8E51FCE0C5600A06E90 /* sha.c in Sources */, A4DFEC101FD4CB8500A7BB33 /* armv8-sha256.c in Sources */, @@ -416,6 +483,7 @@ A4ADF8D11FCE0C5600A06E90 /* hmac.c in Sources */, A4ADF8F01FCE0C5600A06E90 /* memory.c in Sources */, A4ADF82F1FCE0BD300A06E90 /* AppDelegate.m in Sources */, + A46FE1772493E8F800A25BE7 /* wc_pkcs11.c in Sources */, A4ADF8D31FCE0C5600A06E90 /* random.c in Sources */, A4ADF9131FCE0C5600A06E90 /* signature.c in Sources */, A4DFEC3C1FD6B9CC00A7BB33 /* test.c in Sources */, @@ -425,16 +493,19 @@ A4ADF91E1FCE0C5600A06E90 /* asn.c in Sources */, A4ADF8F61FCE0C5600A06E90 /* hash.c in Sources */, A4ADF92A1FCE0C5600A06E90 /* coding.c in Sources */, + A46FE1702493E8F800A25BE7 /* sp_int.c in Sources */, A4ADF8741FCE0C1C00A06E90 /* ssl.c in Sources */, A4ADF9051FCE0C5600A06E90 /* cmac.c in Sources */, 52114C8721B5A7320022ADA1 /* sp_c64.c in Sources */, A4ADF8F41FCE0C5600A06E90 /* pkcs7.c in Sources */, + A46FE1732493E8F800A25BE7 /* armv8-poly1305.c in Sources */, A4ADF90B1FCE0C5600A06E90 /* logging.c in Sources */, A4ADF8E01FCE0C5600A06E90 /* ecc_fp.c in Sources */, A4ADF8EB1FCE0C5600A06E90 /* chacha20_poly1305.c in Sources */, A4ADF86B1FCE0C1C00A06E90 /* keys.c in Sources */, A4ADF8EE1FCE0C5600A06E90 /* arc4.c in Sources */, A4DFEC111FD4CB8500A7BB33 /* armv8-aes.c in Sources */, + A46FE1812493E8F800A25BE7 /* wc_dsp.c in Sources */, A4ADF9061FCE0C5600A06E90 /* wc_encrypt.c in Sources */, A4ADF8DC1FCE0C5600A06E90 /* curve25519.c in Sources */, A4ADF8D81FCE0C5600A06E90 /* md4.c in Sources */, @@ -449,6 +520,7 @@ A4ADF8F81FCE0C5600A06E90 /* fe_low_mem.c in Sources */, A4ADF86D1FCE0C1C00A06E90 /* wolfio.c in Sources */, A4ADF8D71FCE0C5600A06E90 /* wolfevent.c in Sources */, + A46FE1802493E8F800A25BE7 /* ed448.c in Sources */, A4DFEC0D1FD4CAA300A7BB33 /* benchmark.c in Sources */, A4ADF91D1FCE0C5600A06E90 /* cpuid.c in Sources */, ); diff --git a/IDE/XCODE/user_settings.h b/IDE/XCODE/user_settings.h index de9700fa9..62da56ba3 100644 --- a/IDE/XCODE/user_settings.h +++ b/IDE/XCODE/user_settings.h @@ -46,6 +46,7 @@ /* ARMv8 - iPhone 8/8Plus and iPhone X */ #ifdef __ARM_FEATURE_CRYPTO #define WOLFSSL_ARMASM + #define WOLFSSL_SP_ARM64_ASM #endif /* newer algorithms */ @@ -75,6 +76,7 @@ /* test certificate buffers */ #define USE_CERT_BUFFERS_2048 #define USE_CERT_BUFFERS_256 + #define NO_WRITE_TEMP_FILES #define WOLFSSL_DTLS diff --git a/IDE/XCODE/wolfssl.xcodeproj/project.pbxproj b/IDE/XCODE/wolfssl.xcodeproj/project.pbxproj index 6c05ce95d..e23fc7c67 100644 --- a/IDE/XCODE/wolfssl.xcodeproj/project.pbxproj +++ b/IDE/XCODE/wolfssl.xcodeproj/project.pbxproj @@ -356,6 +356,75 @@ 522DBE0F1B7927A50031F454 /* wc_encrypt.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 522DBE0E1B7927290031F454 /* wc_encrypt.h */; }; 525BE5341B3869110054BBCD /* hash.c in Sources */ = {isa = PBXBuildFile; fileRef = 525BE5331B3869110054BBCD /* hash.c */; }; 525BE5361B3869780054BBCD /* hash.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 525BE5351B3869430054BBCD /* hash.h */; }; + A4DAE3062493F1C700CEF51F /* tls13.c in Sources */ = {isa = PBXBuildFile; fileRef = A4DAE3052493F1C700CEF51F /* tls13.c */; }; + A4DAE3072493F1C700CEF51F /* tls13.c in Sources */ = {isa = PBXBuildFile; fileRef = A4DAE3052493F1C700CEF51F /* tls13.c */; }; + A4DAE3082493F1C700CEF51F /* tls13.c in Sources */ = {isa = PBXBuildFile; fileRef = A4DAE3052493F1C700CEF51F /* tls13.c */; }; + A4DAE31A2493F21900CEF51F /* srp.c in Sources */ = {isa = PBXBuildFile; fileRef = A4DAE3092493F21700CEF51F /* srp.c */; }; + A4DAE31B2493F21900CEF51F /* srp.c in Sources */ = {isa = PBXBuildFile; fileRef = A4DAE3092493F21700CEF51F /* srp.c */; }; + A4DAE31C2493F21900CEF51F /* srp.c in Sources */ = {isa = PBXBuildFile; fileRef = A4DAE3092493F21700CEF51F /* srp.c */; }; + A4DAE31D2493F21900CEF51F /* ed448.c in Sources */ = {isa = PBXBuildFile; fileRef = A4DAE30A2493F21800CEF51F /* ed448.c */; }; + A4DAE31E2493F21900CEF51F /* ed448.c in Sources */ = {isa = PBXBuildFile; fileRef = A4DAE30A2493F21800CEF51F /* ed448.c */; }; + A4DAE31F2493F21900CEF51F /* ed448.c in Sources */ = {isa = PBXBuildFile; fileRef = A4DAE30A2493F21800CEF51F /* ed448.c */; }; + A4DAE3202493F21900CEF51F /* cpuid.c in Sources */ = {isa = PBXBuildFile; fileRef = A4DAE30B2493F21800CEF51F /* cpuid.c */; }; + A4DAE3212493F21900CEF51F /* cpuid.c in Sources */ = {isa = PBXBuildFile; fileRef = A4DAE30B2493F21800CEF51F /* cpuid.c */; }; + A4DAE3222493F21900CEF51F /* cpuid.c in Sources */ = {isa = PBXBuildFile; fileRef = A4DAE30B2493F21800CEF51F /* cpuid.c */; }; + A4DAE3232493F21900CEF51F /* asm.c in Sources */ = {isa = PBXBuildFile; fileRef = A4DAE30C2493F21800CEF51F /* asm.c */; }; + A4DAE3242493F21900CEF51F /* asm.c in Sources */ = {isa = PBXBuildFile; fileRef = A4DAE30C2493F21800CEF51F /* asm.c */; }; + A4DAE3252493F21900CEF51F /* asm.c in Sources */ = {isa = PBXBuildFile; fileRef = A4DAE30C2493F21800CEF51F /* asm.c */; }; + A4DAE3262493F21900CEF51F /* fe_448.c in Sources */ = {isa = PBXBuildFile; fileRef = A4DAE30D2493F21800CEF51F /* fe_448.c */; }; + A4DAE3272493F21900CEF51F /* fe_448.c in Sources */ = {isa = PBXBuildFile; fileRef = A4DAE30D2493F21800CEF51F /* fe_448.c */; }; + A4DAE3282493F21900CEF51F /* fe_448.c in Sources */ = {isa = PBXBuildFile; fileRef = A4DAE30D2493F21800CEF51F /* fe_448.c */; }; + A4DAE3292493F21900CEF51F /* compress.c in Sources */ = {isa = PBXBuildFile; fileRef = A4DAE30E2493F21800CEF51F /* compress.c */; }; + A4DAE32A2493F21900CEF51F /* compress.c in Sources */ = {isa = PBXBuildFile; fileRef = A4DAE30E2493F21800CEF51F /* compress.c */; }; + A4DAE32B2493F21900CEF51F /* compress.c in Sources */ = {isa = PBXBuildFile; fileRef = A4DAE30E2493F21800CEF51F /* compress.c */; }; + A4DAE32C2493F21900CEF51F /* cmac.c in Sources */ = {isa = PBXBuildFile; fileRef = A4DAE30F2493F21800CEF51F /* cmac.c */; }; + A4DAE32D2493F21900CEF51F /* cmac.c in Sources */ = {isa = PBXBuildFile; fileRef = A4DAE30F2493F21800CEF51F /* cmac.c */; }; + A4DAE32E2493F21900CEF51F /* cmac.c in Sources */ = {isa = PBXBuildFile; fileRef = A4DAE30F2493F21800CEF51F /* cmac.c */; }; + A4DAE32F2493F21900CEF51F /* ecc_fp.c in Sources */ = {isa = PBXBuildFile; fileRef = A4DAE3102493F21800CEF51F /* ecc_fp.c */; }; + A4DAE3302493F21900CEF51F /* ecc_fp.c in Sources */ = {isa = PBXBuildFile; fileRef = A4DAE3102493F21800CEF51F /* ecc_fp.c */; }; + A4DAE3312493F21900CEF51F /* ecc_fp.c in Sources */ = {isa = PBXBuildFile; fileRef = A4DAE3102493F21800CEF51F /* ecc_fp.c */; }; + A4DAE3322493F21900CEF51F /* cryptocb.c in Sources */ = {isa = PBXBuildFile; fileRef = A4DAE3112493F21800CEF51F /* cryptocb.c */; }; + A4DAE3332493F21900CEF51F /* cryptocb.c in Sources */ = {isa = PBXBuildFile; fileRef = A4DAE3112493F21800CEF51F /* cryptocb.c */; }; + A4DAE3342493F21900CEF51F /* cryptocb.c in Sources */ = {isa = PBXBuildFile; fileRef = A4DAE3112493F21800CEF51F /* cryptocb.c */; }; + A4DAE3352493F21900CEF51F /* wolfevent.c in Sources */ = {isa = PBXBuildFile; fileRef = A4DAE3122493F21800CEF51F /* wolfevent.c */; }; + A4DAE3362493F21900CEF51F /* wolfevent.c in Sources */ = {isa = PBXBuildFile; fileRef = A4DAE3122493F21800CEF51F /* wolfevent.c */; }; + A4DAE3372493F21900CEF51F /* wolfevent.c in Sources */ = {isa = PBXBuildFile; fileRef = A4DAE3122493F21800CEF51F /* wolfevent.c */; }; + A4DAE3382493F21900CEF51F /* pkcs12.c in Sources */ = {isa = PBXBuildFile; fileRef = A4DAE3132493F21800CEF51F /* pkcs12.c */; }; + A4DAE3392493F21900CEF51F /* pkcs12.c in Sources */ = {isa = PBXBuildFile; fileRef = A4DAE3132493F21800CEF51F /* pkcs12.c */; }; + A4DAE33A2493F21900CEF51F /* pkcs12.c in Sources */ = {isa = PBXBuildFile; fileRef = A4DAE3132493F21800CEF51F /* pkcs12.c */; }; + A4DAE33B2493F21900CEF51F /* curve448.c in Sources */ = {isa = PBXBuildFile; fileRef = A4DAE3142493F21800CEF51F /* curve448.c */; }; + A4DAE33C2493F21900CEF51F /* curve448.c in Sources */ = {isa = PBXBuildFile; fileRef = A4DAE3142493F21800CEF51F /* curve448.c */; }; + A4DAE33D2493F21900CEF51F /* curve448.c in Sources */ = {isa = PBXBuildFile; fileRef = A4DAE3142493F21800CEF51F /* curve448.c */; }; + A4DAE33E2493F21900CEF51F /* ge_448.c in Sources */ = {isa = PBXBuildFile; fileRef = A4DAE3152493F21800CEF51F /* ge_448.c */; }; + A4DAE33F2493F21900CEF51F /* ge_448.c in Sources */ = {isa = PBXBuildFile; fileRef = A4DAE3152493F21800CEF51F /* ge_448.c */; }; + A4DAE3402493F21900CEF51F /* ge_448.c in Sources */ = {isa = PBXBuildFile; fileRef = A4DAE3152493F21800CEF51F /* ge_448.c */; }; + A4DAE3412493F21900CEF51F /* wc_dsp.c in Sources */ = {isa = PBXBuildFile; fileRef = A4DAE3162493F21900CEF51F /* wc_dsp.c */; }; + A4DAE3422493F21900CEF51F /* wc_dsp.c in Sources */ = {isa = PBXBuildFile; fileRef = A4DAE3162493F21900CEF51F /* wc_dsp.c */; }; + A4DAE3432493F21900CEF51F /* wc_dsp.c in Sources */ = {isa = PBXBuildFile; fileRef = A4DAE3162493F21900CEF51F /* wc_dsp.c */; }; + A4DAE3442493F21900CEF51F /* wc_pkcs11.c in Sources */ = {isa = PBXBuildFile; fileRef = A4DAE3172493F21900CEF51F /* wc_pkcs11.c */; }; + A4DAE3452493F21900CEF51F /* wc_pkcs11.c in Sources */ = {isa = PBXBuildFile; fileRef = A4DAE3172493F21900CEF51F /* wc_pkcs11.c */; }; + A4DAE3462493F21900CEF51F /* wc_pkcs11.c in Sources */ = {isa = PBXBuildFile; fileRef = A4DAE3172493F21900CEF51F /* wc_pkcs11.c */; }; + A4DAE3472493F21900CEF51F /* blake2s.c in Sources */ = {isa = PBXBuildFile; fileRef = A4DAE3182493F21900CEF51F /* blake2s.c */; }; + A4DAE3482493F21900CEF51F /* blake2s.c in Sources */ = {isa = PBXBuildFile; fileRef = A4DAE3182493F21900CEF51F /* blake2s.c */; }; + A4DAE3492493F21900CEF51F /* blake2s.c in Sources */ = {isa = PBXBuildFile; fileRef = A4DAE3182493F21900CEF51F /* blake2s.c */; }; + A4DAE34A2493F21900CEF51F /* idea.c in Sources */ = {isa = PBXBuildFile; fileRef = A4DAE3192493F21900CEF51F /* idea.c */; }; + A4DAE34B2493F21900CEF51F /* idea.c in Sources */ = {isa = PBXBuildFile; fileRef = A4DAE3192493F21900CEF51F /* idea.c */; }; + A4DAE34C2493F21900CEF51F /* idea.c in Sources */ = {isa = PBXBuildFile; fileRef = A4DAE3192493F21900CEF51F /* idea.c */; }; + A4DAE34D2493F28B00CEF51F /* sp_arm32.c in Sources */ = {isa = PBXBuildFile; fileRef = A4E7E5912493E20500725359 /* sp_arm32.c */; }; + A4DAE34E2493F28C00CEF51F /* sp_arm32.c in Sources */ = {isa = PBXBuildFile; fileRef = A4E7E5912493E20500725359 /* sp_arm32.c */; }; + A4DAE3502493F29100CEF51F /* sp_arm64.c in Sources */ = {isa = PBXBuildFile; fileRef = A4E7E5902493E20500725359 /* sp_arm64.c */; }; + A4DAE3512493F29100CEF51F /* sp_arm64.c in Sources */ = {isa = PBXBuildFile; fileRef = A4E7E5902493E20500725359 /* sp_arm64.c */; }; + A4DAE3522493F29500CEF51F /* sp_armthumb.c in Sources */ = {isa = PBXBuildFile; fileRef = A4E7E5942493E20500725359 /* sp_armthumb.c */; }; + A4DAE3532493F29500CEF51F /* sp_armthumb.c in Sources */ = {isa = PBXBuildFile; fileRef = A4E7E5942493E20500725359 /* sp_armthumb.c */; }; + A4DAE3542493F29B00CEF51F /* sp_cortexm.c in Sources */ = {isa = PBXBuildFile; fileRef = A4E7E5932493E20500725359 /* sp_cortexm.c */; }; + A4DAE3552493F29B00CEF51F /* sp_cortexm.c in Sources */ = {isa = PBXBuildFile; fileRef = A4E7E5932493E20500725359 /* sp_cortexm.c */; }; + A4DAE3562493F29E00CEF51F /* sp_dsp32.c in Sources */ = {isa = PBXBuildFile; fileRef = A4E7E5922493E20500725359 /* sp_dsp32.c */; }; + A4DAE3572493F29E00CEF51F /* sp_dsp32.c in Sources */ = {isa = PBXBuildFile; fileRef = A4E7E5922493E20500725359 /* sp_dsp32.c */; }; + A4E7E5952493E20500725359 /* sp_arm64.c in Sources */ = {isa = PBXBuildFile; fileRef = A4E7E5902493E20500725359 /* sp_arm64.c */; }; + A4E7E5962493E20500725359 /* sp_arm32.c in Sources */ = {isa = PBXBuildFile; fileRef = A4E7E5912493E20500725359 /* sp_arm32.c */; }; + A4E7E5972493E20500725359 /* sp_dsp32.c in Sources */ = {isa = PBXBuildFile; fileRef = A4E7E5922493E20500725359 /* sp_dsp32.c */; }; + A4E7E5982493E20500725359 /* sp_cortexm.c in Sources */ = {isa = PBXBuildFile; fileRef = A4E7E5932493E20500725359 /* sp_cortexm.c */; }; + A4E7E5992493E20500725359 /* sp_armthumb.c in Sources */ = {isa = PBXBuildFile; fileRef = A4E7E5942493E20500725359 /* sp_armthumb.c */; }; A4F318501BC58B1700FDF2BB /* dsa.c in Sources */ = {isa = PBXBuildFile; fileRef = 5216461A1A8992CC0062516A /* dsa.c */; }; A4F318511BC58B1700FDF2BB /* logging.c in Sources */ = {isa = PBXBuildFile; fileRef = 521646201A8992CC0062516A /* logging.c */; }; A4F318521BC58B1700FDF2BB /* sha.c in Sources */ = {isa = PBXBuildFile; fileRef = 5216462D1A8992CC0062516A /* sha.c */; }; @@ -1119,6 +1188,29 @@ 525BE5351B3869430054BBCD /* hash.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = hash.h; path = ../../wolfssl/wolfcrypt/hash.h; sourceTree = ""; }; 52B1344D16F3C9E800C07B32 /* libwolfssl_ios.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libwolfssl_ios.a; sourceTree = BUILT_PRODUCTS_DIR; }; A45EA7091BC5995E00A8614A /* user_settings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = user_settings.h; sourceTree = ""; }; + A4DAE3052493F1C700CEF51F /* tls13.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = tls13.c; path = ../../src/tls13.c; sourceTree = ""; }; + A4DAE3092493F21700CEF51F /* srp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = srp.c; path = ../../wolfcrypt/src/srp.c; sourceTree = ""; }; + A4DAE30A2493F21800CEF51F /* ed448.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ed448.c; path = ../../wolfcrypt/src/ed448.c; sourceTree = ""; }; + A4DAE30B2493F21800CEF51F /* cpuid.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cpuid.c; path = ../../wolfcrypt/src/cpuid.c; sourceTree = ""; }; + A4DAE30C2493F21800CEF51F /* asm.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = asm.c; path = ../../wolfcrypt/src/asm.c; sourceTree = ""; }; + A4DAE30D2493F21800CEF51F /* fe_448.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = fe_448.c; path = ../../wolfcrypt/src/fe_448.c; sourceTree = ""; }; + A4DAE30E2493F21800CEF51F /* compress.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = compress.c; path = ../../wolfcrypt/src/compress.c; sourceTree = ""; }; + A4DAE30F2493F21800CEF51F /* cmac.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cmac.c; path = ../../wolfcrypt/src/cmac.c; sourceTree = ""; }; + A4DAE3102493F21800CEF51F /* ecc_fp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ecc_fp.c; path = ../../wolfcrypt/src/ecc_fp.c; sourceTree = ""; }; + A4DAE3112493F21800CEF51F /* cryptocb.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cryptocb.c; path = ../../wolfcrypt/src/cryptocb.c; sourceTree = ""; }; + A4DAE3122493F21800CEF51F /* wolfevent.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = wolfevent.c; path = ../../wolfcrypt/src/wolfevent.c; sourceTree = ""; }; + A4DAE3132493F21800CEF51F /* pkcs12.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = pkcs12.c; path = ../../wolfcrypt/src/pkcs12.c; sourceTree = ""; }; + A4DAE3142493F21800CEF51F /* curve448.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = curve448.c; path = ../../wolfcrypt/src/curve448.c; sourceTree = ""; }; + A4DAE3152493F21800CEF51F /* ge_448.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ge_448.c; path = ../../wolfcrypt/src/ge_448.c; sourceTree = ""; }; + A4DAE3162493F21900CEF51F /* wc_dsp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = wc_dsp.c; path = ../../wolfcrypt/src/wc_dsp.c; sourceTree = ""; }; + A4DAE3172493F21900CEF51F /* wc_pkcs11.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = wc_pkcs11.c; path = ../../wolfcrypt/src/wc_pkcs11.c; sourceTree = ""; }; + A4DAE3182493F21900CEF51F /* blake2s.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = blake2s.c; path = ../../wolfcrypt/src/blake2s.c; sourceTree = ""; }; + A4DAE3192493F21900CEF51F /* idea.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = idea.c; path = ../../wolfcrypt/src/idea.c; sourceTree = ""; }; + A4E7E5902493E20500725359 /* sp_arm64.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = sp_arm64.c; path = ../../wolfcrypt/src/sp_arm64.c; sourceTree = ""; }; + A4E7E5912493E20500725359 /* sp_arm32.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = sp_arm32.c; path = ../../wolfcrypt/src/sp_arm32.c; sourceTree = ""; }; + A4E7E5922493E20500725359 /* sp_dsp32.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = sp_dsp32.c; path = ../../wolfcrypt/src/sp_dsp32.c; sourceTree = ""; }; + A4E7E5932493E20500725359 /* sp_cortexm.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = sp_cortexm.c; path = ../../wolfcrypt/src/sp_cortexm.c; sourceTree = ""; }; + A4E7E5942493E20500725359 /* sp_armthumb.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = sp_armthumb.c; path = ../../wolfcrypt/src/sp_armthumb.c; sourceTree = ""; }; A4F318EE1BC58B1700FDF2BB /* libwolfssl_osx.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libwolfssl_osx.a; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ @@ -1311,26 +1403,38 @@ children = ( 521646111A8992CC0062516A /* aes.c */, 521646121A8992CC0062516A /* arc4.c */, + A4DAE30C2493F21800CEF51F /* asm.c */, 521646131A8992CC0062516A /* asn.c */, 521646141A8992CC0062516A /* blake2b.c */, + A4DAE3182493F21900CEF51F /* blake2s.c */, 521646151A8992CC0062516A /* camellia.c */, 521646161A8992CC0062516A /* chacha.c */, 1E8BEB77212F4CF80063DCC1 /* chacha20_poly1305.c */, + A4DAE30F2493F21800CEF51F /* cmac.c */, 521646171A8992CC0062516A /* coding.c */, + A4DAE30E2493F21800CEF51F /* compress.c */, + A4DAE30B2493F21800CEF51F /* cpuid.c */, + A4DAE3112493F21800CEF51F /* cryptocb.c */, + A4DAE3142493F21800CEF51F /* curve448.c */, 1E8BEB75212F4CF80063DCC1 /* curve25519.c */, + 521646181A8992CC0062516A /* des3.c */, 521646191A8992CC0062516A /* dh.c */, 5216461A1A8992CC0062516A /* dsa.c */, - 521646181A8992CC0062516A /* des3.c */, + A4DAE3102493F21800CEF51F /* ecc_fp.c */, 5216461B1A8992CC0062516A /* ecc.c */, + A4DAE30A2493F21800CEF51F /* ed448.c */, 1E8BEB76212F4CF80063DCC1 /* ed25519.c */, 5216461C1A8992CC0062516A /* error.c */, + A4DAE30D2493F21800CEF51F /* fe_448.c */, 1E8BEB85212F4F010063DCC1 /* fe_low_mem.c */, 1E8BEB84212F4F010063DCC1 /* fe_operations.c */, + A4DAE3152493F21800CEF51F /* ge_448.c */, 1E8BEB81212F4E330063DCC1 /* ge_low_mem.c */, 1E8BEB80212F4E330063DCC1 /* ge_operations.c */, 525BE5331B3869110054BBCD /* hash.c */, 5216461D1A8992CC0062516A /* hc128.c */, 5216461E1A8992CC0062516A /* hmac.c */, + A4DAE3192493F21900CEF51F /* idea.c */, 5216461F1A8992CC0062516A /* integer.c */, 521646201A8992CC0062516A /* logging.c */, 521646211A8992CC0062516A /* md2.c */, @@ -1339,6 +1443,7 @@ 521646241A8992CC0062516A /* memory.c */, 521646251A8992CC0062516A /* misc.c */, 521646261A8992CC0062516A /* pkcs7.c */, + A4DAE3132493F21800CEF51F /* pkcs12.c */, 521646271A8992CC0062516A /* poly1305.c */, 521646281A8992CC0062516A /* pwdbased.c */, 521646291A8992CC0062516A /* rabbit.c */, @@ -1346,17 +1451,26 @@ 5216462B1A8992CC0062516A /* ripemd.c */, 5216462C1A8992CC0062516A /* rsa.c */, 5216462D1A8992CC0062516A /* sha.c */, - 5216462E1A8992CC0062516A /* sha256.c */, 1E8BEB6A212F49EC0063DCC1 /* sha3.c */, + 5216462E1A8992CC0062516A /* sha256.c */, 5216462F1A8992CC0062516A /* sha512.c */, 1E8BEB7C212F4D960063DCC1 /* signature.c */, + A4E7E5912493E20500725359 /* sp_arm32.c */, + A4E7E5902493E20500725359 /* sp_arm64.c */, + A4E7E5942493E20500725359 /* sp_armthumb.c */, 1E8BEB70212F4C340063DCC1 /* sp_c32.c */, 1E8BEB6F212F4C340063DCC1 /* sp_c64.c */, + A4E7E5932493E20500725359 /* sp_cortexm.c */, + A4E7E5922493E20500725359 /* sp_dsp32.c */, 1E8BEB6E212F4C340063DCC1 /* sp_int.c */, 1E8BEB6C212F4AA10063DCC1 /* sp_x86_64.c */, + A4DAE3092493F21700CEF51F /* srp.c */, 521646301A8992CC0062516A /* tfm.c */, + A4DAE3162493F21900CEF51F /* wc_dsp.c */, 522DBE0C1B7926FB0031F454 /* wc_encrypt.c */, + A4DAE3172493F21900CEF51F /* wc_pkcs11.c */, 521646311A8992CC0062516A /* wc_port.c */, + A4DAE3122493F21800CEF51F /* wolfevent.c */, 1E8BEB7E212F4DCF0063DCC1 /* wolfmath.c */, ); name = wolfCrypt; @@ -1367,12 +1481,13 @@ children = ( 521646011A89928E0062516A /* crl.c */, 521646021A89928E0062516A /* internal.c */, - 521646031A89928E0062516A /* wolfio.c */, 521646041A89928E0062516A /* keys.c */, 521646051A89928E0062516A /* ocsp.c */, 521646061A89928E0062516A /* sniffer.c */, 521646071A89928E0062516A /* ssl.c */, 521646081A89928E0062516A /* tls.c */, + A4DAE3052493F1C700CEF51F /* tls13.c */, + 521646031A89928E0062516A /* wolfio.c */, ); name = wolfSSL; sourceTree = SOURCE_ROOT; @@ -1478,6 +1593,7 @@ developmentRegion = English; hasScannedForEncodings = 0; knownRegions = ( + English, en, ); mainGroup = 52B1344416F3C9E800C07B32; @@ -1497,10 +1613,12 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + A4DAE34E2493F28C00CEF51F /* sp_arm32.c in Sources */, 520775B42239AC3700087711 /* curve25519.c in Sources */, 30B060541C6DDB2B00D46008 /* crl.c in Sources */, 520775BA2239AC4600087711 /* ge_operations.c in Sources */, 30B060551C6DDB2B00D46008 /* internal.c in Sources */, + A4DAE3432493F21900CEF51F /* wc_dsp.c in Sources */, 30B060561C6DDB2B00D46008 /* wolfio.c in Sources */, 30B060571C6DDB2B00D46008 /* keys.c in Sources */, 520775C62239B25A00087711 /* sha3.c in Sources */, @@ -1508,35 +1626,51 @@ 520775B82239AC4600087711 /* fe_operations.c in Sources */, 30B060591C6DDB2B00D46008 /* sniffer.c in Sources */, 30B0605A1C6DDB2B00D46008 /* ssl.c in Sources */, + A4DAE3342493F21900CEF51F /* cryptocb.c in Sources */, 520775A82239ABBE00087711 /* sp_x86_64.c in Sources */, 30B0605B1C6DDB2B00D46008 /* tls.c in Sources */, 30B0605C1C6DDB2B00D46008 /* aes.c in Sources */, 30B0605D1C6DDB2B00D46008 /* arc4.c in Sources */, 30B0605E1C6DDB2B00D46008 /* asn.c in Sources */, + A4DAE3512493F29100CEF51F /* sp_arm64.c in Sources */, 30B0605F1C6DDB2B00D46008 /* blake2b.c in Sources */, 520775AE2239AC2100087711 /* signature.c in Sources */, 30B060601C6DDB2B00D46008 /* camellia.c in Sources */, + A4DAE31F2493F21900CEF51F /* ed448.c in Sources */, 30B060611C6DDB2B00D46008 /* chacha.c in Sources */, 30B060621C6DDB2B00D46008 /* coding.c in Sources */, + A4DAE31C2493F21900CEF51F /* srp.c in Sources */, 30B060631C6DDB2B00D46008 /* des3.c in Sources */, + A4DAE33D2493F21900CEF51F /* curve448.c in Sources */, 30B060641C6DDB2B00D46008 /* dh.c in Sources */, 30B060651C6DDB2B00D46008 /* dsa.c in Sources */, 520775BC2239AC4600087711 /* fe_low_mem.c in Sources */, 30B060661C6DDB2B00D46008 /* ecc.c in Sources */, + A4DAE3402493F21900CEF51F /* ge_448.c in Sources */, + A4DAE3532493F29500CEF51F /* sp_armthumb.c in Sources */, + A4DAE3462493F21900CEF51F /* wc_pkcs11.c in Sources */, + A4DAE3312493F21900CEF51F /* ecc_fp.c in Sources */, + A4DAE3372493F21900CEF51F /* wolfevent.c in Sources */, 30B060671C6DDB2B00D46008 /* error.c in Sources */, 520775AA2239ABBE00087711 /* sp_int.c in Sources */, 30B060681C6DDB2B00D46008 /* hash.c in Sources */, + A4DAE34C2493F21900CEF51F /* idea.c in Sources */, 30B060691C6DDB2B00D46008 /* hc128.c in Sources */, 30B0606A1C6DDB2B00D46008 /* hmac.c in Sources */, + A4DAE3572493F29E00CEF51F /* sp_dsp32.c in Sources */, + A4DAE3282493F21900CEF51F /* fe_448.c in Sources */, 30B0606B1C6DDB2B00D46008 /* integer.c in Sources */, 520775AC2239ABCD00087711 /* chacha20_poly1305.c in Sources */, + A4DAE3082493F1C700CEF51F /* tls13.c in Sources */, 30B0606C1C6DDB2B00D46008 /* logging.c in Sources */, 520775B22239AC3200087711 /* ed25519.c in Sources */, 520775B02239AC2500087711 /* wolfmath.c in Sources */, 30B0606D1C6DDB2B00D46008 /* md2.c in Sources */, 30B0606E1C6DDB2B00D46008 /* md4.c in Sources */, 520775B62239AC4600087711 /* ge_low_mem.c in Sources */, + A4DAE32E2493F21900CEF51F /* cmac.c in Sources */, 30B0606F1C6DDB2B00D46008 /* md5.c in Sources */, + A4DAE3252493F21900CEF51F /* asm.c in Sources */, 30B060701C6DDB2B00D46008 /* memory.c in Sources */, 30B060721C6DDB2B00D46008 /* pkcs7.c in Sources */, 30B060731C6DDB2B00D46008 /* poly1305.c in Sources */, @@ -1547,10 +1681,15 @@ 30B060781C6DDB2B00D46008 /* rsa.c in Sources */, 30B060791C6DDB2B00D46008 /* sha.c in Sources */, 30B0607A1C6DDB2B00D46008 /* sha256.c in Sources */, + A4DAE3492493F21900CEF51F /* blake2s.c in Sources */, + A4DAE32B2493F21900CEF51F /* compress.c in Sources */, 30B0607B1C6DDB2B00D46008 /* sha512.c in Sources */, + A4DAE33A2493F21900CEF51F /* pkcs12.c in Sources */, 520775A42239ABBE00087711 /* sp_c32.c in Sources */, 520775A62239ABBE00087711 /* sp_c64.c in Sources */, + A4DAE3552493F29B00CEF51F /* sp_cortexm.c in Sources */, 30B0607C1C6DDB2B00D46008 /* tfm.c in Sources */, + A4DAE3222493F21900CEF51F /* cpuid.c in Sources */, 30B0607D1C6DDB2B00D46008 /* wc_encrypt.c in Sources */, 30B0607E1C6DDB2B00D46008 /* wc_port.c in Sources */, ); @@ -1560,12 +1699,19 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + A4E7E5952493E20500725359 /* sp_arm64.c in Sources */, + A4DAE31D2493F21900CEF51F /* ed448.c in Sources */, 520775B52239AC3700087711 /* curve25519.c in Sources */, + A4DAE3442493F21900CEF51F /* wc_pkcs11.c in Sources */, 5216463B1A8992CC0062516A /* dsa.c in Sources */, 520775BB2239AC4600087711 /* ge_operations.c in Sources */, 521646411A8992CC0062516A /* logging.c in Sources */, + A4E7E5962493E20500725359 /* sp_arm32.c in Sources */, + A4DAE3202493F21900CEF51F /* cpuid.c in Sources */, 5216464E1A8992CC0062516A /* sha.c in Sources */, + A4DAE3412493F21900CEF51F /* wc_dsp.c in Sources */, 521646481A8992CC0062516A /* poly1305.c in Sources */, + A4DAE32C2493F21900CEF51F /* cmac.c in Sources */, 520775C42239B25800087711 /* sha3.c in Sources */, 5216463A1A8992CC0062516A /* dh.c in Sources */, 520775B92239AC4600087711 /* fe_operations.c in Sources */, @@ -1573,42 +1719,58 @@ 521646521A8992CC0062516A /* wc_port.c in Sources */, 520775A92239ABBE00087711 /* sp_x86_64.c in Sources */, 521646491A8992CC0062516A /* pwdbased.c in Sources */, + A4DAE3472493F21900CEF51F /* blake2s.c in Sources */, + A4DAE31A2493F21900CEF51F /* srp.c in Sources */, 5216463E1A8992CC0062516A /* hc128.c in Sources */, 521646341A8992CC0062516A /* asn.c in Sources */, 521646501A8992CC0062516A /* sha512.c in Sources */, 5216464A1A8992CC0062516A /* rabbit.c in Sources */, 520775AF2239AC2100087711 /* signature.c in Sources */, 525BE5341B3869110054BBCD /* hash.c in Sources */, + A4DAE33E2493F21900CEF51F /* ge_448.c in Sources */, 521646441A8992CC0062516A /* md5.c in Sources */, 5216460F1A89928E0062516A /* ssl.c in Sources */, 5216464D1A8992CC0062516A /* rsa.c in Sources */, 5216464B1A8992CC0062516A /* random.c in Sources */, + A4DAE3062493F1C700CEF51F /* tls13.c in Sources */, 522DBE0D1B7926FB0031F454 /* wc_encrypt.c in Sources */, 520775BD2239AC4600087711 /* fe_low_mem.c in Sources */, 521646101A89928E0062516A /* tls.c in Sources */, 5216460D1A89928E0062516A /* ocsp.c in Sources */, + A4DAE3232493F21900CEF51F /* asm.c in Sources */, + A4DAE3262493F21900CEF51F /* fe_448.c in Sources */, 520775AB2239ABBE00087711 /* sp_int.c in Sources */, 521646431A8992CC0062516A /* md4.c in Sources */, 521646321A8992CC0062516A /* aes.c in Sources */, 521646391A8992CC0062516A /* des3.c in Sources */, 521646351A8992CC0062516A /* blake2b.c in Sources */, 520775AD2239ABCD00087711 /* chacha20_poly1305.c in Sources */, + A4E7E5992493E20500725359 /* sp_armthumb.c in Sources */, + A4DAE32F2493F21900CEF51F /* ecc_fp.c in Sources */, 5216464C1A8992CC0062516A /* ripemd.c in Sources */, + A4DAE3322493F21900CEF51F /* cryptocb.c in Sources */, 520775B32239AC3200087711 /* ed25519.c in Sources */, 520775B12239AC2500087711 /* wolfmath.c in Sources */, 521646451A8992CC0062516A /* memory.c in Sources */, + A4DAE34A2493F21900CEF51F /* idea.c in Sources */, + A4DAE3382493F21900CEF51F /* pkcs12.c in Sources */, 5216463C1A8992CC0062516A /* ecc.c in Sources */, + A4DAE3292493F21900CEF51F /* compress.c in Sources */, 520775B72239AC4600087711 /* ge_low_mem.c in Sources */, 5216464F1A8992CC0062516A /* sha256.c in Sources */, + A4E7E5982493E20500725359 /* sp_cortexm.c in Sources */, 521646371A8992CC0062516A /* chacha.c in Sources */, + A4E7E5972493E20500725359 /* sp_dsp32.c in Sources */, 521646471A8992CC0062516A /* pkcs7.c in Sources */, 5216460E1A89928E0062516A /* sniffer.c in Sources */, 521646421A8992CC0062516A /* md2.c in Sources */, 521646381A8992CC0062516A /* coding.c in Sources */, 5216463D1A8992CC0062516A /* error.c in Sources */, 5216463F1A8992CC0062516A /* hmac.c in Sources */, + A4DAE3352493F21900CEF51F /* wolfevent.c in Sources */, 521646331A8992CC0062516A /* arc4.c in Sources */, 521646401A8992CC0062516A /* integer.c in Sources */, + A4DAE33B2493F21900CEF51F /* curve448.c in Sources */, 5216460A1A89928E0062516A /* internal.c in Sources */, 5216460B1A89928E0062516A /* wolfio.c in Sources */, 520775A52239ABBE00087711 /* sp_c32.c in Sources */, @@ -1623,10 +1785,12 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + A4DAE34D2493F28B00CEF51F /* sp_arm32.c in Sources */, A4F318661BC58B1700FDF2BB /* aes.c in Sources */, A4F318741BC58B1700FDF2BB /* arc4.c in Sources */, A4F3185A1BC58B1700FDF2BB /* asn.c in Sources */, A4F318681BC58B1700FDF2BB /* blake2b.c in Sources */, + A4DAE3422493F21900CEF51F /* wc_dsp.c in Sources */, A4F318551BC58B1700FDF2BB /* camellia.c in Sources */, A4F3186D1BC58B1700FDF2BB /* chacha.c in Sources */, 520775C52239B25900087711 /* sha3.c in Sources */, @@ -1634,35 +1798,51 @@ A4F318711BC58B1700FDF2BB /* coding.c in Sources */, A4F318791BC58B1700FDF2BB /* crl.c in Sources */, 1E8BEB79212F4CF90063DCC1 /* curve25519.c in Sources */, + A4DAE3332493F21900CEF51F /* cryptocb.c in Sources */, A4F318671BC58B1700FDF2BB /* des3.c in Sources */, A4F318541BC58B1700FDF2BB /* dh.c in Sources */, A4F318501BC58B1700FDF2BB /* dsa.c in Sources */, A4F3186B1BC58B1700FDF2BB /* ecc.c in Sources */, 1E8BEB7A212F4CF90063DCC1 /* ed25519.c in Sources */, + A4DAE3502493F29100CEF51F /* sp_arm64.c in Sources */, A4F318721BC58B1700FDF2BB /* error.c in Sources */, 1E8BEB87212F4F010063DCC1 /* fe_low_mem.c in Sources */, 1E8BEB86212F4F010063DCC1 /* fe_operations.c in Sources */, + A4DAE31E2493F21900CEF51F /* ed448.c in Sources */, 1E8BEB83212F4E330063DCC1 /* ge_low_mem.c in Sources */, 1E8BEB82212F4E330063DCC1 /* ge_operations.c in Sources */, + A4DAE31B2493F21900CEF51F /* srp.c in Sources */, A4F3185D1BC58B1700FDF2BB /* hash.c in Sources */, + A4DAE33C2493F21900CEF51F /* curve448.c in Sources */, A4F318591BC58B1700FDF2BB /* hc128.c in Sources */, A4F318731BC58B1700FDF2BB /* hmac.c in Sources */, A4F318751BC58B1700FDF2BB /* integer.c in Sources */, A4F318761BC58B1700FDF2BB /* internal.c in Sources */, + A4DAE33F2493F21900CEF51F /* ge_448.c in Sources */, + A4DAE3522493F29500CEF51F /* sp_armthumb.c in Sources */, + A4DAE3452493F21900CEF51F /* wc_pkcs11.c in Sources */, + A4DAE3302493F21900CEF51F /* ecc_fp.c in Sources */, + A4DAE3362493F21900CEF51F /* wolfevent.c in Sources */, A4F3187A1BC58B1700FDF2BB /* keys.c in Sources */, A4F318511BC58B1700FDF2BB /* logging.c in Sources */, A4F318701BC58B1700FDF2BB /* md2.c in Sources */, + A4DAE34B2493F21900CEF51F /* idea.c in Sources */, A4F318651BC58B1700FDF2BB /* md4.c in Sources */, A4F3185E1BC58B1700FDF2BB /* md5.c in Sources */, + A4DAE3562493F29E00CEF51F /* sp_dsp32.c in Sources */, + A4DAE3272493F21900CEF51F /* fe_448.c in Sources */, A4F3186A1BC58B1700FDF2BB /* memory.c in Sources */, A4F318641BC58B1700FDF2BB /* ocsp.c in Sources */, + A4DAE3072493F1C700CEF51F /* tls13.c in Sources */, A4F318531BC58B1700FDF2BB /* poly1305.c in Sources */, A4F318571BC58B1700FDF2BB /* pwdbased.c in Sources */, A4F3186E1BC58B1700FDF2BB /* pkcs7.c in Sources */, 520775A32239ABBE00087711 /* sp_c32.c in Sources */, A4F3185C1BC58B1700FDF2BB /* rabbit.c in Sources */, A4F318611BC58B1700FDF2BB /* random.c in Sources */, + A4DAE32D2493F21900CEF51F /* cmac.c in Sources */, A4F318691BC58B1700FDF2BB /* ripemd.c in Sources */, + A4DAE3242493F21900CEF51F /* asm.c in Sources */, A4F318601BC58B1700FDF2BB /* rsa.c in Sources */, A4F318521BC58B1700FDF2BB /* sha.c in Sources */, A4F3186C1BC58B1700FDF2BB /* sha256.c in Sources */, @@ -1673,10 +1853,15 @@ 1E8BEB71212F4C340063DCC1 /* sp_int.c in Sources */, 1E8BEB6D212F4AA10063DCC1 /* sp_x86_64.c in Sources */, A4F3185F1BC58B1700FDF2BB /* ssl.c in Sources */, + A4DAE3482493F21900CEF51F /* blake2s.c in Sources */, + A4DAE32A2493F21900CEF51F /* compress.c in Sources */, A4F318781BC58B1700FDF2BB /* tfm.c in Sources */, + A4DAE3392493F21900CEF51F /* pkcs12.c in Sources */, A4F318631BC58B1700FDF2BB /* tls.c in Sources */, A4F318621BC58B1700FDF2BB /* wc_encrypt.c in Sources */, + A4DAE3542493F29B00CEF51F /* sp_cortexm.c in Sources */, A4F318561BC58B1700FDF2BB /* wc_port.c in Sources */, + A4DAE3212493F21900CEF51F /* cpuid.c in Sources */, A4F318771BC58B1700FDF2BB /* wolfio.c in Sources */, 1E8BEB7F212F4DD00063DCC1 /* wolfmath.c in Sources */, ); diff --git a/wolfcrypt/benchmark/benchmark.c b/wolfcrypt/benchmark/benchmark.c index 07cc21415..5619fe35a 100644 --- a/wolfcrypt/benchmark/benchmark.c +++ b/wolfcrypt/benchmark/benchmark.c @@ -5195,16 +5195,11 @@ void bench_ntruKeyGen(void) #ifdef HAVE_ECC -#ifndef BENCH_ECC_SIZE - #ifdef HAVE_ECC384 - #define BENCH_ECC_SIZE 48 - #else - #define BENCH_ECC_SIZE 32 - #endif -#endif - /* Default to testing P-256 */ -static int bench_ecc_size = 32; +#ifndef BENCH_ECC_SIZE + #define BENCH_ECC_SIZE 32 +#endif +static int bench_ecc_size = BENCH_ECC_SIZE; void bench_eccMakeKey(int doAsync) { diff --git a/wolfcrypt/src/ecc.c b/wolfcrypt/src/ecc.c index fa3469a2a..5d9d40c20 100644 --- a/wolfcrypt/src/ecc.c +++ b/wolfcrypt/src/ecc.c @@ -4044,7 +4044,7 @@ static int wc_ecc_make_pub_ex(ecc_key* key, ecc_curve_spec* curveIn, err = WC_KEY_SIZE_E; #else { - mp_digit mp; + mp_digit mp = 0; base = wc_ecc_new_point_h(key->heap); if (base == NULL) From eea22eb65d94006ab0fa2f225113f408ea1bfaf6 Mon Sep 17 00:00:00 2001 From: David Garske Date: Fri, 12 Jun 2020 10:57:04 -0700 Subject: [PATCH 232/298] Renesas requested name change to "RA6M3". --- IDE/Renesas/e2studio/RA6M3/README.md | 175 +++ .../benchmark-wolfcrypt/.cproject | 618 ++++----- .../benchmark-wolfcrypt/.project | 118 +- .../benchmark-wolfcrypt/common/.gitkeep | 0 .../benchmark-wolfcrypt/script/.gitkeep | 0 .../src/wolfssl_thread_entry.c | 0 .../client-wolfssl/.cproject | 650 +++++----- .../{RA6M3G => RA6M3}/client-wolfssl/.project | 108 +- .../client-wolfssl/common/src/.gitkeep | 0 .../client-wolfssl/script/.gitkeep | 0 .../client-wolfssl/src/wolfssl_thread_entry.c | 0 .../client-wolfssl/wolfssl_thread_entry.h | 0 .../{RA6M3G => RA6M3}/common/ra6m3g/README.md | 0 .../common/src/freertos_tcp_port.c | 0 .../{RA6M3G => RA6M3}/common/user_settings.h | 0 .../e2studio/{RA6M3G => RA6M3}/common/util.h | 0 IDE/Renesas/e2studio/RA6M3/include.am | 33 + .../server-wolfssl/.cproject | 640 +++++----- .../{RA6M3G => RA6M3}/server-wolfssl/.project | 120 +- .../server-wolfssl/common/src/.gitkeep | 0 .../server-wolfssl/script/.gitkeep | 0 .../server-wolfssl/src/wolfssl_thread_entry.c | 0 .../server-wolfssl/wolfssl_thread_entry.h | 0 .../test-wolfcrypt/.cproject | 610 ++++----- .../{RA6M3G => RA6M3}/test-wolfcrypt/.project | 108 +- .../test-wolfcrypt/common/.gitkeep | 0 .../test-wolfcrypt/script/.gitkeep | 0 .../test-wolfcrypt/src/wolfssl_thread_entry.c | 64 +- .../{RA6M3G => RA6M3}/wolfssl/.cproject | 668 +++++----- .../{RA6M3G => RA6M3}/wolfssl/.project | 1108 ++++++++--------- .../wolfssl/configuration.xml | 736 +++++------ .../{RA6M3G => RA6M3}/wolfssl/src/.gitkeep | 0 .../wolfssl/wolfcrypt/.gitkeep | 0 IDE/Renesas/e2studio/RA6M3G/README.md | 176 +-- IDE/Renesas/e2studio/RA6M3G/include.am | 32 - IDE/include.am | 2 +- wolfssl/wolfcrypt/settings.h | 2 +- wolfssl/wolfio.h | 2 +- 38 files changed, 2986 insertions(+), 2984 deletions(-) create mode 100644 IDE/Renesas/e2studio/RA6M3/README.md rename IDE/Renesas/e2studio/{RA6M3G => RA6M3}/benchmark-wolfcrypt/.cproject (99%) rename IDE/Renesas/e2studio/{RA6M3G => RA6M3}/benchmark-wolfcrypt/.project (96%) rename IDE/Renesas/e2studio/{RA6M3G => RA6M3}/benchmark-wolfcrypt/common/.gitkeep (100%) rename IDE/Renesas/e2studio/{RA6M3G => RA6M3}/benchmark-wolfcrypt/script/.gitkeep (100%) rename IDE/Renesas/e2studio/{RA6M3G => RA6M3}/benchmark-wolfcrypt/src/wolfssl_thread_entry.c (100%) rename IDE/Renesas/e2studio/{RA6M3G => RA6M3}/client-wolfssl/.cproject (99%) rename IDE/Renesas/e2studio/{RA6M3G => RA6M3}/client-wolfssl/.project (96%) rename IDE/Renesas/e2studio/{RA6M3G => RA6M3}/client-wolfssl/common/src/.gitkeep (100%) rename IDE/Renesas/e2studio/{RA6M3G => RA6M3}/client-wolfssl/script/.gitkeep (100%) rename IDE/Renesas/e2studio/{RA6M3G => RA6M3}/client-wolfssl/src/wolfssl_thread_entry.c (100%) rename IDE/Renesas/e2studio/{RA6M3G => RA6M3}/client-wolfssl/wolfssl_thread_entry.h (100%) rename IDE/Renesas/e2studio/{RA6M3G => RA6M3}/common/ra6m3g/README.md (100%) rename IDE/Renesas/e2studio/{RA6M3G => RA6M3}/common/src/freertos_tcp_port.c (100%) rename IDE/Renesas/e2studio/{RA6M3G => RA6M3}/common/user_settings.h (100%) rename IDE/Renesas/e2studio/{RA6M3G => RA6M3}/common/util.h (100%) create mode 100644 IDE/Renesas/e2studio/RA6M3/include.am rename IDE/Renesas/e2studio/{RA6M3G => RA6M3}/server-wolfssl/.cproject (99%) rename IDE/Renesas/e2studio/{RA6M3G => RA6M3}/server-wolfssl/.project (96%) rename IDE/Renesas/e2studio/{RA6M3G => RA6M3}/server-wolfssl/common/src/.gitkeep (100%) rename IDE/Renesas/e2studio/{RA6M3G => RA6M3}/server-wolfssl/script/.gitkeep (100%) rename IDE/Renesas/e2studio/{RA6M3G => RA6M3}/server-wolfssl/src/wolfssl_thread_entry.c (100%) rename IDE/Renesas/e2studio/{RA6M3G => RA6M3}/server-wolfssl/wolfssl_thread_entry.h (100%) rename IDE/Renesas/e2studio/{RA6M3G => RA6M3}/test-wolfcrypt/.cproject (99%) rename IDE/Renesas/e2studio/{RA6M3G => RA6M3}/test-wolfcrypt/.project (96%) rename IDE/Renesas/e2studio/{RA6M3G => RA6M3}/test-wolfcrypt/common/.gitkeep (100%) rename IDE/Renesas/e2studio/{RA6M3G => RA6M3}/test-wolfcrypt/script/.gitkeep (100%) rename IDE/Renesas/e2studio/{RA6M3G => RA6M3}/test-wolfcrypt/src/wolfssl_thread_entry.c (97%) rename IDE/Renesas/e2studio/{RA6M3G => RA6M3}/wolfssl/.cproject (99%) rename IDE/Renesas/e2studio/{RA6M3G => RA6M3}/wolfssl/.project (96%) rename IDE/Renesas/e2studio/{RA6M3G => RA6M3}/wolfssl/configuration.xml (98%) rename IDE/Renesas/e2studio/{RA6M3G => RA6M3}/wolfssl/src/.gitkeep (100%) rename IDE/Renesas/e2studio/{RA6M3G => RA6M3}/wolfssl/wolfcrypt/.gitkeep (100%) delete mode 100644 IDE/Renesas/e2studio/RA6M3G/include.am diff --git a/IDE/Renesas/e2studio/RA6M3/README.md b/IDE/Renesas/e2studio/RA6M3/README.md new file mode 100644 index 000000000..4e0aa7cc9 --- /dev/null +++ b/IDE/Renesas/e2studio/RA6M3/README.md @@ -0,0 +1,175 @@ +wolfSSL for Renesas RA Evaluation Kit (EK-RA6M3G) +================================================= + +## Description + +This directory contains e2studio projects targeted at the Renesas RA 32-bit MCUs.\ +The example projects include a wolfSSL TLS 1.2 client and server.\ +They also include benchmark and cryptography tests for the wolfCrypt library. + +The wolfssl project contains both the wolfSSL and wolfCrypt libraries.\ +It is built as a `Renesas RA C Library Project` and contains the Renesas RA\ +configuration. + +The other projects (benchmark, client, server and test) are built as a\ +`Renesas RA C Project Using RA Library`, where the RA library is the wolfssl project.\ +The wolfssl Project Summary is listed below and is relevant for every project. + +#### Project Summary + +`Board: EK-RA6M3G`\ +`Device: R7FA6M3AH3CFC`\ +`Toolchain: GCC ARM Embedded`\ +`FSP Version: 0.8.0` + +##### Selected software components + +`Board Support Package Common Files v0.8.0`\ +`Arm CMSIS Version 5 - Core (M) v5.5.1`\ +`Amazon FreeRTOS v0.8.0`\ +`RA6M3G-EK Board Support Files v0.8.0`\ +`Board support package for R7FA6M3AH3CFC v0.8.0`\ +`Board support package for RA6M3 v0.8.0`\ +`Board support package for RA6M3 v0.8.0`\ +`Amazon FreeRTOS - Memory Management - Heap 4 v0.8.0`\ +`r_ether to FreeRTOS+TCP Wrapper v0.8.0`\ +`Ethernet v0.8.0`\ +`Ethernet PHY v0.8.0`\ +`FreeRTOS+TCP v0.8.0`\ +`Amazon FreeRTOS - Buffer Allocation 2 v0.8.0` + + +## Setup Steps + +The project directories are missing files necessary to build the project.\ +These files can be generated when creating a new Renesas RA Project.\ +The following steps explain how to generate the missing files and where to place them. + +1.) Create a 'dummy' Renesas RA C Library Project. + + Click File->New->`RA C/C++ Project` + + Click `Renesas RA C Library Project`. Click Next + + Enter `dummy_library` as the project name. Click Next. + + Under `Board: Custom User Board`, select `EK-RA6M3G`. + + Under `RTOS: No RTOS`, select `Amazon FreeRTOS`. + + Click Next. Select `Amazon FreeRTOS - Minimal - Static Allocation` + + Click Finish. + +2.) Create a 'dummy' Renesas RA C Project Using RA Library. + + Click File->New->`RA C/C++ Project` + + Click `Renesas RA C Project Using RA Library`. Click Next + + Enter `dummy_app` as the project name. Click Next. + + Under `RA library project`, select `dummy_library`. + + Click Finish. + +3.) Import all the wolfSSL Projects into e2studio workspace. + + Click File->`Open Projects from File System` + + Click `Directory...` to the right of Import source + + Select the RA6M3G folder location that contains the projects\ + example path: wolfssl/IDE/Renesas/e2studio/RA6M3 + + Deselect the Non-Eclipse project, RA6M3G, by clicking the checkbox\ + Only the folders with 'Eclipse project' under 'Import as' need to be selected. + + Click Finish. + +4.) Copy files from `dummy_library` into `wolfSSL_RA6M3G` + + Expand the dummy_library and wolfSSL_RA6M3G projects\ + (Click the drop-down arrow to the left of the project name.) + + Select and Copy the following folders/files inside dummy_library\ +` ra/`\ +` ra_gen/`\ +` ra_cfg/`\ +` script/`\ +` R7FA6M3AH3CFC.pincfg`\ +` RA6M3G-EK.pingcfg` + + Paste the copied folders/files into wolfSSL_RA6M3G + + The `dummy_library` project can now be deleted. + + Generate Project Content. + + Click `Open RA Configuration` in the top bar (Grey Settings Cog) + + Click `Generate Project Content` at top right (Green Icon) + + Build wolfSSL_RA6M3G. + +5.) Copy files from `dummy_app` into `./IDE/Renesas/e2studio/RA6M3/common/ra6m3g/`\ + **NOTE:** This may need to be done outside of the e2studio environment (e.g. File Explorer). + + Select and Copy the followng folder inside dummy_app\ +` src/`\ +` script/` + + Paste the copied folders into `./IDE/Renesas/e2studio/RA6M3/common/ra6m3g/`\ +` (The test, benchmark, client and server projects link to this folder.)` + + The `dummy_app` project can now be deleted. + +6.) Setup Network Environment + + The client and server projects have defines inside their wolfssl_thread_entry.h. + These defines (ucIPAddress ... ucDNSServerAddress) may need to be changed + based on your internal network environment. The g_ether0_mac_address is the default + mac address found inside the RA configuration inside the wolfssl project. + The client wolfssl_thread_entry.h has defines (SERVER_IP and DEFAULT_PORT) that + will need to be changed based on the server you're trying to connect to over + the ethernet connection. + +## Build and Run + +### Build Each Project +Right-Click each Project and select Build. + +### Run wolfCrypt Test and Benchmark +1.) Right-Click the Project name.\ +2.) Select `Debug As` -> `Renesas GDB Hardware Debugging`\ +3.) Select J-Link ARM. Click OK.\ +4.) Select R7Fa6M3AH. Click OK. + +### Run the wolfSSL TLS Server Example. +1.) Right-Click the Project name.\ +2.) Select `Debug As` -> `Renesas GDB Hardware Debugging`\ +3.) Select J-Link ARM. Click OK.\ +4.) Select R7Fa6M3AH. Click OK.\ +5.) Run the following wolfSSL example client command inside the base of the wolfssl directory. + +``` +./examples/client/client -h "ucIPAddress" -p 11111 -A ./certs/1024/ca-cert.pem +``` +**NOTE:** "ucIPAddress" is "192.168.1.241" by default. (See wolfssl_thread_entry.h) + +### Run the wolfSSL TLS Client Example. + 1.) Run the following wolfSSL example server command inside the base of the wolfssl directory. + +``` +./examples/server/server -b -d -p 11111 -c ./certs/1024/server-cert.pem -k ./certs/1024/server-key.pem +``` +**NOTE:** The port 11111 is the DEFAULT_PORT inside wolfssl_thread_entry.h.\ +If DEFAULT_PORT was changed then the above command will need to match it. + + 2.) Right-Click the Project name.\ + 3.) Select `Debug As` -> `Renesas GDB Hardware Debugging`\ + 4.) Select J-Link ARM. Click OK.\ + 5.) Select R7Fa6M3AH. Click OK. + + +## Troubleshooting + +* The commands for the example client/server assumes it is being run from the + base directory of wolfssl. + +* Enter "#define DEBUG_WOLFSSL" inside user_settings.h or wolfssl_thread_entry.c\ + to enable wolfssl debug messages to the Renesas Virtual Debug Console. + +* Some linking errors can be caused by the e2studio project files needing to be rebuilt and freshened. +Right-Click a project, select Index, click Rebuild and then click Freshen Files. Repeat for each project. + +[Support Forum](https://www.wolfssl.com/forums/) + +Support Email: support@wolfssl.com + + +## Resources + +[wolfSSL Website](https://www.wolfssl.com/) + +[wolfSSL Wiki](https://github.com/wolfSSL/wolfssl/wiki) + +[wolfSSL Manual](https://wolfssl.com/wolfSSL/Docs-wolfssl-manual-toc.html) + +[wolfSSL API Reference](https://wolfssl.com/wolfSSL/Docs-wolfssl-manual-17-wolfssl-api-reference.html) + +[wolfCrypt API Reference](https://wolfssl.com/wolfSSL/Docs-wolfssl-manual-18-wolfcrypt-api-reference.html) + +[TLS 1.3](https://www.wolfssl.com/docs/tls13/) diff --git a/IDE/Renesas/e2studio/RA6M3G/benchmark-wolfcrypt/.cproject b/IDE/Renesas/e2studio/RA6M3/benchmark-wolfcrypt/.cproject similarity index 99% rename from IDE/Renesas/e2studio/RA6M3G/benchmark-wolfcrypt/.cproject rename to IDE/Renesas/e2studio/RA6M3/benchmark-wolfcrypt/.cproject index f8e135a28..b7f446987 100644 --- a/IDE/Renesas/e2studio/RA6M3G/benchmark-wolfcrypt/.cproject +++ b/IDE/Renesas/e2studio/RA6M3/benchmark-wolfcrypt/.cproject @@ -1,309 +1,309 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/IDE/Renesas/e2studio/RA6M3G/benchmark-wolfcrypt/.project b/IDE/Renesas/e2studio/RA6M3/benchmark-wolfcrypt/.project similarity index 96% rename from IDE/Renesas/e2studio/RA6M3G/benchmark-wolfcrypt/.project rename to IDE/Renesas/e2studio/RA6M3/benchmark-wolfcrypt/.project index 9b1353df6..c8a4418e5 100644 --- a/IDE/Renesas/e2studio/RA6M3G/benchmark-wolfcrypt/.project +++ b/IDE/Renesas/e2studio/RA6M3/benchmark-wolfcrypt/.project @@ -1,59 +1,59 @@ - - - benchmark_wolfCrypt_RA6M3G - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - com.renesas.cdt.ra.contentgen.raExecutableNature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - common/src - 2 - virtual:/virtual - - - common/user_settings.h - 1 - PARENT-1-PROJECT_LOC/common/user_settings.h - - - common/util.h - 1 - PARENT-1-PROJECT_LOC/common/util.h - - - script/ra6m3.ld - 1 - PARENT-1-PROJECT_LOC/common/ra6m3g/script/ra6m3.ld - - - src/benchmark.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/benchmark/benchmark.c - - - common/src/freertos_tcp_port.c - 1 - PARENT-1-PROJECT_LOC/common/src/freertos_tcp_port.c - - - + + + benchmark_wolfCrypt_RA6M3G + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + clean,full,incremental, + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + org.eclipse.cdt.core.cnature + com.renesas.cdt.ra.contentgen.raExecutableNature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + common/src + 2 + virtual:/virtual + + + common/user_settings.h + 1 + PARENT-1-PROJECT_LOC/common/user_settings.h + + + common/util.h + 1 + PARENT-1-PROJECT_LOC/common/util.h + + + script/ra6m3.ld + 1 + PARENT-1-PROJECT_LOC/common/ra6m3g/script/ra6m3.ld + + + src/benchmark.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/benchmark/benchmark.c + + + common/src/freertos_tcp_port.c + 1 + PARENT-1-PROJECT_LOC/common/src/freertos_tcp_port.c + + + diff --git a/IDE/Renesas/e2studio/RA6M3G/benchmark-wolfcrypt/common/.gitkeep b/IDE/Renesas/e2studio/RA6M3/benchmark-wolfcrypt/common/.gitkeep similarity index 100% rename from IDE/Renesas/e2studio/RA6M3G/benchmark-wolfcrypt/common/.gitkeep rename to IDE/Renesas/e2studio/RA6M3/benchmark-wolfcrypt/common/.gitkeep diff --git a/IDE/Renesas/e2studio/RA6M3G/benchmark-wolfcrypt/script/.gitkeep b/IDE/Renesas/e2studio/RA6M3/benchmark-wolfcrypt/script/.gitkeep similarity index 100% rename from IDE/Renesas/e2studio/RA6M3G/benchmark-wolfcrypt/script/.gitkeep rename to IDE/Renesas/e2studio/RA6M3/benchmark-wolfcrypt/script/.gitkeep diff --git a/IDE/Renesas/e2studio/RA6M3G/benchmark-wolfcrypt/src/wolfssl_thread_entry.c b/IDE/Renesas/e2studio/RA6M3/benchmark-wolfcrypt/src/wolfssl_thread_entry.c similarity index 100% rename from IDE/Renesas/e2studio/RA6M3G/benchmark-wolfcrypt/src/wolfssl_thread_entry.c rename to IDE/Renesas/e2studio/RA6M3/benchmark-wolfcrypt/src/wolfssl_thread_entry.c diff --git a/IDE/Renesas/e2studio/RA6M3G/client-wolfssl/.cproject b/IDE/Renesas/e2studio/RA6M3/client-wolfssl/.cproject similarity index 99% rename from IDE/Renesas/e2studio/RA6M3G/client-wolfssl/.cproject rename to IDE/Renesas/e2studio/RA6M3/client-wolfssl/.cproject index b4d519106..26ffe07df 100644 --- a/IDE/Renesas/e2studio/RA6M3G/client-wolfssl/.cproject +++ b/IDE/Renesas/e2studio/RA6M3/client-wolfssl/.cproject @@ -1,325 +1,325 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/IDE/Renesas/e2studio/RA6M3G/client-wolfssl/.project b/IDE/Renesas/e2studio/RA6M3/client-wolfssl/.project similarity index 96% rename from IDE/Renesas/e2studio/RA6M3G/client-wolfssl/.project rename to IDE/Renesas/e2studio/RA6M3/client-wolfssl/.project index 0f84e0838..d23b77045 100644 --- a/IDE/Renesas/e2studio/RA6M3G/client-wolfssl/.project +++ b/IDE/Renesas/e2studio/RA6M3/client-wolfssl/.project @@ -1,54 +1,54 @@ - - - client_wolfSSL_RA6M3G - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - com.renesas.cdt.ra.contentgen.raExecutableNature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - common/user_settings.h - 1 - PARENT-1-PROJECT_LOC/common/user_settings.h - - - common/util.h - 1 - PARENT-1-PROJECT_LOC/common/util.h - - - script/ra6m3.ld - 1 - PARENT-1-PROJECT_LOC/common/ra6m3g/script/ra6m3.ld - - - src/hal_entry.c - 1 - PARENT-1-PROJECT_LOC/common/ra6m3g/src/hal_entry.c - - - common/src/freertos_tcp_port.c - 1 - PARENT-1-PROJECT_LOC/common/src/freertos_tcp_port.c - - - + + + client_wolfSSL_RA6M3G + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + clean,full,incremental, + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + org.eclipse.cdt.core.cnature + com.renesas.cdt.ra.contentgen.raExecutableNature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + common/user_settings.h + 1 + PARENT-1-PROJECT_LOC/common/user_settings.h + + + common/util.h + 1 + PARENT-1-PROJECT_LOC/common/util.h + + + script/ra6m3.ld + 1 + PARENT-1-PROJECT_LOC/common/ra6m3g/script/ra6m3.ld + + + src/hal_entry.c + 1 + PARENT-1-PROJECT_LOC/common/ra6m3g/src/hal_entry.c + + + common/src/freertos_tcp_port.c + 1 + PARENT-1-PROJECT_LOC/common/src/freertos_tcp_port.c + + + diff --git a/IDE/Renesas/e2studio/RA6M3G/client-wolfssl/common/src/.gitkeep b/IDE/Renesas/e2studio/RA6M3/client-wolfssl/common/src/.gitkeep similarity index 100% rename from IDE/Renesas/e2studio/RA6M3G/client-wolfssl/common/src/.gitkeep rename to IDE/Renesas/e2studio/RA6M3/client-wolfssl/common/src/.gitkeep diff --git a/IDE/Renesas/e2studio/RA6M3G/client-wolfssl/script/.gitkeep b/IDE/Renesas/e2studio/RA6M3/client-wolfssl/script/.gitkeep similarity index 100% rename from IDE/Renesas/e2studio/RA6M3G/client-wolfssl/script/.gitkeep rename to IDE/Renesas/e2studio/RA6M3/client-wolfssl/script/.gitkeep diff --git a/IDE/Renesas/e2studio/RA6M3G/client-wolfssl/src/wolfssl_thread_entry.c b/IDE/Renesas/e2studio/RA6M3/client-wolfssl/src/wolfssl_thread_entry.c similarity index 100% rename from IDE/Renesas/e2studio/RA6M3G/client-wolfssl/src/wolfssl_thread_entry.c rename to IDE/Renesas/e2studio/RA6M3/client-wolfssl/src/wolfssl_thread_entry.c diff --git a/IDE/Renesas/e2studio/RA6M3G/client-wolfssl/wolfssl_thread_entry.h b/IDE/Renesas/e2studio/RA6M3/client-wolfssl/wolfssl_thread_entry.h similarity index 100% rename from IDE/Renesas/e2studio/RA6M3G/client-wolfssl/wolfssl_thread_entry.h rename to IDE/Renesas/e2studio/RA6M3/client-wolfssl/wolfssl_thread_entry.h diff --git a/IDE/Renesas/e2studio/RA6M3G/common/ra6m3g/README.md b/IDE/Renesas/e2studio/RA6M3/common/ra6m3g/README.md similarity index 100% rename from IDE/Renesas/e2studio/RA6M3G/common/ra6m3g/README.md rename to IDE/Renesas/e2studio/RA6M3/common/ra6m3g/README.md diff --git a/IDE/Renesas/e2studio/RA6M3G/common/src/freertos_tcp_port.c b/IDE/Renesas/e2studio/RA6M3/common/src/freertos_tcp_port.c similarity index 100% rename from IDE/Renesas/e2studio/RA6M3G/common/src/freertos_tcp_port.c rename to IDE/Renesas/e2studio/RA6M3/common/src/freertos_tcp_port.c diff --git a/IDE/Renesas/e2studio/RA6M3G/common/user_settings.h b/IDE/Renesas/e2studio/RA6M3/common/user_settings.h similarity index 100% rename from IDE/Renesas/e2studio/RA6M3G/common/user_settings.h rename to IDE/Renesas/e2studio/RA6M3/common/user_settings.h diff --git a/IDE/Renesas/e2studio/RA6M3G/common/util.h b/IDE/Renesas/e2studio/RA6M3/common/util.h similarity index 100% rename from IDE/Renesas/e2studio/RA6M3G/common/util.h rename to IDE/Renesas/e2studio/RA6M3/common/util.h diff --git a/IDE/Renesas/e2studio/RA6M3/include.am b/IDE/Renesas/e2studio/RA6M3/include.am new file mode 100644 index 000000000..fde3c0464 --- /dev/null +++ b/IDE/Renesas/e2studio/RA6M3/include.am @@ -0,0 +1,33 @@ +# vim:ft=automake +# included from Top Level Makefile.am +# All paths should be given relative to the root + +EXTRA_DIST+= IDE/Renesas/e2studio/RA6M3/benchmark-wolfcrypt/src/wolfssl_thread_entry.c +EXTRA_DIST+= IDE/Renesas/e2studio/RA6M3/benchmark-wolfcrypt/.cproject +EXTRA_DIST+= IDE/Renesas/e2studio/RA6M3/benchmark-wolfcrypt/.project + +EXTRA_DIST+= IDE/Renesas/e2studio/RA6M3/client-wolfssl/src/wolfssl_thread_entry.c +EXTRA_DIST+= IDE/Renesas/e2studio/RA6M3/client-wolfssl/.cproject +EXTRA_DIST+= IDE/Renesas/e2studio/RA6M3/client-wolfssl/.project +EXTRA_DIST+= IDE/Renesas/e2studio/RA6M3/client-wolfssl/wolfssl_thread_entry.h + +EXTRA_DIST+= IDE/Renesas/e2studio/RA6M3/common/ra6m3g/README.md +EXTRA_DIST+= IDE/Renesas/e2studio/RA6M3/common/src/freertos_tcp_port.c +EXTRA_DIST+= IDE/Renesas/e2studio/RA6M3/common/user_settings.h +EXTRA_DIST+= IDE/Renesas/e2studio/RA6M3/common/util.h + +EXTRA_DIST+= IDE/Renesas/e2studio/RA6M3/server-wolfssl/src/wolfssl_thread_entry.c +EXTRA_DIST+= IDE/Renesas/e2studio/RA6M3/server-wolfssl/.cproject +EXTRA_DIST+= IDE/Renesas/e2studio/RA6M3/server-wolfssl/.project +EXTRA_DIST+= IDE/Renesas/e2studio/RA6M3/server-wolfssl/wolfssl_thread_entry.h + +EXTRA_DIST+= IDE/Renesas/e2studio/RA6M3/test-wolfcrypt/src/wolfssl_thread_entry.c +EXTRA_DIST+= IDE/Renesas/e2studio/RA6M3/test-wolfcrypt/.cproject +EXTRA_DIST+= IDE/Renesas/e2studio/RA6M3/test-wolfcrypt/.project + +EXTRA_DIST+= IDE/Renesas/e2studio/RA6M3/wolfssl/.cproject +EXTRA_DIST+= IDE/Renesas/e2studio/RA6M3/wolfssl/.project +EXTRA_DIST+= IDE/Renesas/e2studio/RA6M3/wolfssl/configuration.xml + +EXTRA_DIST+= IDE/Renesas/e2studio/RA6M3/README.md +EXTRA_DIST+= IDE/Renesas/e2studio/RA6M3G/README.md diff --git a/IDE/Renesas/e2studio/RA6M3G/server-wolfssl/.cproject b/IDE/Renesas/e2studio/RA6M3/server-wolfssl/.cproject similarity index 99% rename from IDE/Renesas/e2studio/RA6M3G/server-wolfssl/.cproject rename to IDE/Renesas/e2studio/RA6M3/server-wolfssl/.cproject index 402e450b8..d3facb3e4 100644 --- a/IDE/Renesas/e2studio/RA6M3G/server-wolfssl/.cproject +++ b/IDE/Renesas/e2studio/RA6M3/server-wolfssl/.cproject @@ -1,320 +1,320 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/IDE/Renesas/e2studio/RA6M3G/server-wolfssl/.project b/IDE/Renesas/e2studio/RA6M3/server-wolfssl/.project similarity index 96% rename from IDE/Renesas/e2studio/RA6M3G/server-wolfssl/.project rename to IDE/Renesas/e2studio/RA6M3/server-wolfssl/.project index 70c1bd5f9..6f46aaf5a 100644 --- a/IDE/Renesas/e2studio/RA6M3G/server-wolfssl/.project +++ b/IDE/Renesas/e2studio/RA6M3/server-wolfssl/.project @@ -1,60 +1,60 @@ - - - server_wolfSSL_RA6M3G - - - - - - org.eclipse.xtext.ui.shared.xtextBuilder - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - com.renesas.cdt.ra.contentgen.raExecutableNature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - org.eclipse.xtext.ui.shared.xtextNature - - - - common/user_settings.h - 1 - PARENT-1-PROJECT_LOC/common/user_settings.h - - - common/util.h - 1 - PARENT-1-PROJECT_LOC/common/util.h - - - script/ra6m3.ld - 1 - PARENT-1-PROJECT_LOC/common/ra6m3g/script/ra6m3.ld - - - src/hal_entry.c - 1 - PARENT-1-PROJECT_LOC/common/ra6m3g/src/hal_entry.c - - - common/src/freertos_tcp_port.c - 1 - PARENT-1-PROJECT_LOC/common/src/freertos_tcp_port.c - - - + + + server_wolfSSL_RA6M3G + + + + + + org.eclipse.xtext.ui.shared.xtextBuilder + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + clean,full,incremental, + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + org.eclipse.cdt.core.cnature + com.renesas.cdt.ra.contentgen.raExecutableNature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + org.eclipse.xtext.ui.shared.xtextNature + + + + common/user_settings.h + 1 + PARENT-1-PROJECT_LOC/common/user_settings.h + + + common/util.h + 1 + PARENT-1-PROJECT_LOC/common/util.h + + + script/ra6m3.ld + 1 + PARENT-1-PROJECT_LOC/common/ra6m3g/script/ra6m3.ld + + + src/hal_entry.c + 1 + PARENT-1-PROJECT_LOC/common/ra6m3g/src/hal_entry.c + + + common/src/freertos_tcp_port.c + 1 + PARENT-1-PROJECT_LOC/common/src/freertos_tcp_port.c + + + diff --git a/IDE/Renesas/e2studio/RA6M3G/server-wolfssl/common/src/.gitkeep b/IDE/Renesas/e2studio/RA6M3/server-wolfssl/common/src/.gitkeep similarity index 100% rename from IDE/Renesas/e2studio/RA6M3G/server-wolfssl/common/src/.gitkeep rename to IDE/Renesas/e2studio/RA6M3/server-wolfssl/common/src/.gitkeep diff --git a/IDE/Renesas/e2studio/RA6M3G/server-wolfssl/script/.gitkeep b/IDE/Renesas/e2studio/RA6M3/server-wolfssl/script/.gitkeep similarity index 100% rename from IDE/Renesas/e2studio/RA6M3G/server-wolfssl/script/.gitkeep rename to IDE/Renesas/e2studio/RA6M3/server-wolfssl/script/.gitkeep diff --git a/IDE/Renesas/e2studio/RA6M3G/server-wolfssl/src/wolfssl_thread_entry.c b/IDE/Renesas/e2studio/RA6M3/server-wolfssl/src/wolfssl_thread_entry.c similarity index 100% rename from IDE/Renesas/e2studio/RA6M3G/server-wolfssl/src/wolfssl_thread_entry.c rename to IDE/Renesas/e2studio/RA6M3/server-wolfssl/src/wolfssl_thread_entry.c diff --git a/IDE/Renesas/e2studio/RA6M3G/server-wolfssl/wolfssl_thread_entry.h b/IDE/Renesas/e2studio/RA6M3/server-wolfssl/wolfssl_thread_entry.h similarity index 100% rename from IDE/Renesas/e2studio/RA6M3G/server-wolfssl/wolfssl_thread_entry.h rename to IDE/Renesas/e2studio/RA6M3/server-wolfssl/wolfssl_thread_entry.h diff --git a/IDE/Renesas/e2studio/RA6M3G/test-wolfcrypt/.cproject b/IDE/Renesas/e2studio/RA6M3/test-wolfcrypt/.cproject similarity index 99% rename from IDE/Renesas/e2studio/RA6M3G/test-wolfcrypt/.cproject rename to IDE/Renesas/e2studio/RA6M3/test-wolfcrypt/.cproject index bfcbafd28..a9a4031bb 100644 --- a/IDE/Renesas/e2studio/RA6M3G/test-wolfcrypt/.cproject +++ b/IDE/Renesas/e2studio/RA6M3/test-wolfcrypt/.cproject @@ -1,305 +1,305 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/IDE/Renesas/e2studio/RA6M3G/test-wolfcrypt/.project b/IDE/Renesas/e2studio/RA6M3/test-wolfcrypt/.project similarity index 96% rename from IDE/Renesas/e2studio/RA6M3G/test-wolfcrypt/.project rename to IDE/Renesas/e2studio/RA6M3/test-wolfcrypt/.project index 507e93cab..b584e42ee 100644 --- a/IDE/Renesas/e2studio/RA6M3G/test-wolfcrypt/.project +++ b/IDE/Renesas/e2studio/RA6M3/test-wolfcrypt/.project @@ -1,54 +1,54 @@ - - - test_wolfCrypt_RA6M3G - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - com.renesas.cdt.ra.contentgen.raExecutableNature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - common/user_settings.h - 1 - PARENT-1-PROJECT_LOC/common/user_settings.h - - - common/util.h - 1 - PARENT-1-PROJECT_LOC/common/util.h - - - script/ra6m3.ld - 1 - PARENT-1-PROJECT_LOC/common/ra6m3g/script/ra6m3.ld - - - src/hal_entry.c - 1 - PARENT-1-PROJECT_LOC/common/ra6m3g/src/hal_entry.c - - - src/test.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/test/test.c - - - + + + test_wolfCrypt_RA6M3G + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + clean,full,incremental, + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + org.eclipse.cdt.core.cnature + com.renesas.cdt.ra.contentgen.raExecutableNature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + common/user_settings.h + 1 + PARENT-1-PROJECT_LOC/common/user_settings.h + + + common/util.h + 1 + PARENT-1-PROJECT_LOC/common/util.h + + + script/ra6m3.ld + 1 + PARENT-1-PROJECT_LOC/common/ra6m3g/script/ra6m3.ld + + + src/hal_entry.c + 1 + PARENT-1-PROJECT_LOC/common/ra6m3g/src/hal_entry.c + + + src/test.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/test/test.c + + + diff --git a/IDE/Renesas/e2studio/RA6M3G/test-wolfcrypt/common/.gitkeep b/IDE/Renesas/e2studio/RA6M3/test-wolfcrypt/common/.gitkeep similarity index 100% rename from IDE/Renesas/e2studio/RA6M3G/test-wolfcrypt/common/.gitkeep rename to IDE/Renesas/e2studio/RA6M3/test-wolfcrypt/common/.gitkeep diff --git a/IDE/Renesas/e2studio/RA6M3G/test-wolfcrypt/script/.gitkeep b/IDE/Renesas/e2studio/RA6M3/test-wolfcrypt/script/.gitkeep similarity index 100% rename from IDE/Renesas/e2studio/RA6M3G/test-wolfcrypt/script/.gitkeep rename to IDE/Renesas/e2studio/RA6M3/test-wolfcrypt/script/.gitkeep diff --git a/IDE/Renesas/e2studio/RA6M3G/test-wolfcrypt/src/wolfssl_thread_entry.c b/IDE/Renesas/e2studio/RA6M3/test-wolfcrypt/src/wolfssl_thread_entry.c similarity index 97% rename from IDE/Renesas/e2studio/RA6M3G/test-wolfcrypt/src/wolfssl_thread_entry.c rename to IDE/Renesas/e2studio/RA6M3/test-wolfcrypt/src/wolfssl_thread_entry.c index 257a1d479..96629a8ba 100644 --- a/IDE/Renesas/e2studio/RA6M3G/test-wolfcrypt/src/wolfssl_thread_entry.c +++ b/IDE/Renesas/e2studio/RA6M3/test-wolfcrypt/src/wolfssl_thread_entry.c @@ -1,32 +1,32 @@ -/* wolfssl_thread_entry.c - * - * Copyright (C) 2006-2020 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * wolfSSL is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - -#include -#include "wolfcrypt/test/test.h" - -void wolfssl_thread_entry(void* pvParameters) -{ - FSP_PARAMETER_NOT_USED (pvParameters); - /* Benchmark output is displayed to Renesas Debug Virtual Console */ - initialise_monitor_handles(); - wolfcrypt_test(0); - while(1); -} +/* wolfssl_thread_entry.c + * + * Copyright (C) 2006-2020 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * wolfSSL is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +#include +#include "wolfcrypt/test/test.h" + +void wolfssl_thread_entry(void* pvParameters) +{ + FSP_PARAMETER_NOT_USED (pvParameters); + /* Benchmark output is displayed to Renesas Debug Virtual Console */ + initialise_monitor_handles(); + wolfcrypt_test(0); + while(1); +} diff --git a/IDE/Renesas/e2studio/RA6M3G/wolfssl/.cproject b/IDE/Renesas/e2studio/RA6M3/wolfssl/.cproject similarity index 99% rename from IDE/Renesas/e2studio/RA6M3G/wolfssl/.cproject rename to IDE/Renesas/e2studio/RA6M3/wolfssl/.cproject index a28b9e11d..742c3af04 100644 --- a/IDE/Renesas/e2studio/RA6M3G/wolfssl/.cproject +++ b/IDE/Renesas/e2studio/RA6M3/wolfssl/.cproject @@ -1,334 +1,334 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/IDE/Renesas/e2studio/RA6M3G/wolfssl/.project b/IDE/Renesas/e2studio/RA6M3/wolfssl/.project similarity index 96% rename from IDE/Renesas/e2studio/RA6M3G/wolfssl/.project rename to IDE/Renesas/e2studio/RA6M3/wolfssl/.project index c3fda822f..a72156181 100644 --- a/IDE/Renesas/e2studio/RA6M3G/wolfssl/.project +++ b/IDE/Renesas/e2studio/RA6M3/wolfssl/.project @@ -1,554 +1,554 @@ - - - wolfSSL_RA6M3G - - - - - - com.renesas.cdt.ra.contentgen.raBuilder - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - com.renesas.cdt.ra.contentgen.raNature - - - - src/bio.c - 1 - PARENT-5-PROJECT_LOC/src/bio.c - - - src/crl.c - 1 - PARENT-5-PROJECT_LOC/src/crl.c - - - src/include.am - 1 - PARENT-5-PROJECT_LOC/src/include.am - - - src/internal.c - 1 - PARENT-5-PROJECT_LOC/src/internal.c - - - src/keys.c - 1 - PARENT-5-PROJECT_LOC/src/keys.c - - - src/ocsp.c - 1 - PARENT-5-PROJECT_LOC/src/ocsp.c - - - src/sniffer.c - 1 - PARENT-5-PROJECT_LOC/src/sniffer.c - - - src/ssl.c - 1 - PARENT-5-PROJECT_LOC/src/ssl.c - - - src/tls.c - 1 - PARENT-5-PROJECT_LOC/src/tls.c - - - src/tls13.c - 1 - PARENT-5-PROJECT_LOC/src/tls13.c - - - src/wolfio.c - 1 - PARENT-5-PROJECT_LOC/src/wolfio.c - - - wolfcrypt/aes.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/aes.c - - - wolfcrypt/arc4.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/arc4.c - - - wolfcrypt/asm.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/asm.c - - - wolfcrypt/asn.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/asn.c - - - wolfcrypt/blake2b.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/blake2b.c - - - wolfcrypt/blake2s.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/blake2s.c - - - wolfcrypt/camellia.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/camellia.c - - - wolfcrypt/chacha.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/chacha.c - - - wolfcrypt/chacha20_poly1305.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/chacha20_poly1305.c - - - wolfcrypt/cmac.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/cmac.c - - - wolfcrypt/coding.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/coding.c - - - wolfcrypt/compress.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/compress.c - - - wolfcrypt/cpuid.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/cpuid.c - - - wolfcrypt/cryptocb.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/cryptocb.c - - - wolfcrypt/curve25519.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/curve25519.c - - - wolfcrypt/des3.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/des3.c - - - wolfcrypt/dh.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/dh.c - - - wolfcrypt/dsa.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/dsa.c - - - wolfcrypt/ecc.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/ecc.c - - - wolfcrypt/ecc_fp.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/ecc_fp.c - - - wolfcrypt/ed25519.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/ed25519.c - - - wolfcrypt/error.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/error.c - - - wolfcrypt/evp.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/evp.c - - - wolfcrypt/fe_low_mem.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/fe_low_mem.c - - - wolfcrypt/fe_operations.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/fe_operations.c - - - wolfcrypt/ge_low_mem.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/ge_low_mem.c - - - wolfcrypt/ge_operations.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/ge_operations.c - - - wolfcrypt/hash.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/hash.c - - - wolfcrypt/hc128.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/hc128.c - - - wolfcrypt/hmac.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/hmac.c - - - wolfcrypt/idea.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/idea.c - - - wolfcrypt/include.am - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/include.am - - - wolfcrypt/integer.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/integer.c - - - wolfcrypt/logging.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/logging.c - - - wolfcrypt/md2.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/md2.c - - - wolfcrypt/md4.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/md4.c - - - wolfcrypt/md5.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/md5.c - - - wolfcrypt/memory.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/memory.c - - - wolfcrypt/misc.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/misc.c - - - wolfcrypt/pkcs12.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/pkcs12.c - - - wolfcrypt/pkcs7.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/pkcs7.c - - - wolfcrypt/poly1305.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/poly1305.c - - - wolfcrypt/port - 2 - virtual:/virtual - - - wolfcrypt/pwdbased.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/pwdbased.c - - - wolfcrypt/rabbit.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/rabbit.c - - - wolfcrypt/random.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/random.c - - - wolfcrypt/ripemd.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/ripemd.c - - - wolfcrypt/rsa.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/rsa.c - - - wolfcrypt/sha.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/sha.c - - - wolfcrypt/sha256.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/sha256.c - - - wolfcrypt/sha3.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/sha3.c - - - wolfcrypt/sha512.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/sha512.c - - - wolfcrypt/signature.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/signature.c - - - wolfcrypt/sp_arm32.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/sp_arm32.c - - - wolfcrypt/sp_arm64.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/sp_arm64.c - - - wolfcrypt/sp_armthumb.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/sp_armthumb.c - - - wolfcrypt/sp_c32.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/sp_c32.c - - - wolfcrypt/sp_c64.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/sp_c64.c - - - wolfcrypt/sp_cortexm.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/sp_cortexm.c - - - wolfcrypt/sp_int.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/sp_int.c - - - wolfcrypt/sp_x86_64.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/sp_x86_64.c - - - wolfcrypt/srp.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/srp.c - - - wolfcrypt/tfm.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/tfm.c - - - wolfcrypt/wc_encrypt.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/wc_encrypt.c - - - wolfcrypt/wc_pkcs11.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/wc_pkcs11.c - - - wolfcrypt/wc_port.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/wc_port.c - - - wolfcrypt/wolfevent.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/wolfevent.c - - - wolfcrypt/wolfmath.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/wolfmath.c - - - wolfcrypt/port/Renesas - 2 - virtual:/virtual - - - wolfcrypt/port/af_alg - 2 - virtual:/virtual - - - wolfcrypt/port/arm - 2 - virtual:/virtual - - - wolfcrypt/port/Renesas/README.md - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/port/Renesas/README.md - - - wolfcrypt/port/Renesas/renesas_tsip_aes.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/port/Renesas/renesas_tsip_aes.c - - - wolfcrypt/port/Renesas/renesas_tsip_sha.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/port/Renesas/renesas_tsip_sha.c - - - wolfcrypt/port/Renesas/renesas_tsip_util.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/port/Renesas/renesas_tsip_util.c - - - wolfcrypt/port/af_alg/afalg_aes.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/port/af_alg/afalg_aes.c - - - wolfcrypt/port/af_alg/afalg_hash.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/port/af_alg/afalg_hash.c - - - wolfcrypt/port/af_alg/wc_afalg.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/port/af_alg/wc_afalg.c - - - wolfcrypt/port/arm/armv8-32-curve25519.S - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/port/arm/armv8-32-curve25519.S - - - wolfcrypt/port/arm/armv8-32-curve25519.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/port/arm/armv8-32-curve25519.c - - - wolfcrypt/port/arm/armv8-32-sha512-asm.S - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/port/arm/armv8-32-sha512-asm.S - - - wolfcrypt/port/arm/armv8-32-sha512-asm.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/port/arm/armv8-32-sha512-asm.c - - - wolfcrypt/port/arm/armv8-aes.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/port/arm/armv8-aes.c - - - wolfcrypt/port/arm/armv8-chacha.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/port/arm/armv8-chacha.c - - - wolfcrypt/port/arm/armv8-curve25519.S - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/port/arm/armv8-curve25519.S - - - wolfcrypt/port/arm/armv8-curve25519.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/port/arm/armv8-curve25519.c - - - wolfcrypt/port/arm/armv8-poly1305.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/port/arm/armv8-poly1305.c - - - wolfcrypt/port/arm/armv8-sha256.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/port/arm/armv8-sha256.c - - - wolfcrypt/port/arm/armv8-sha512-asm.S - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/port/arm/armv8-sha512-asm.S - - - wolfcrypt/port/arm/armv8-sha512-asm.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/port/arm/armv8-sha512-asm.c - - - wolfcrypt/port/arm/armv8-sha512.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/port/arm/armv8-sha512.c - - - wolfcrypt/port/arm/cryptoCell.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/port/arm/cryptoCell.c - - - wolfcrypt/port/arm/cryptoCellHash.c - 1 - PARENT-5-PROJECT_LOC/wolfcrypt/src/port/arm/cryptoCellHash.c - - - + + + wolfSSL_RA6M3G + + + + + + com.renesas.cdt.ra.contentgen.raBuilder + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + clean,full,incremental, + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + com.renesas.cdt.ra.contentgen.raNature + + + + src/bio.c + 1 + PARENT-5-PROJECT_LOC/src/bio.c + + + src/crl.c + 1 + PARENT-5-PROJECT_LOC/src/crl.c + + + src/include.am + 1 + PARENT-5-PROJECT_LOC/src/include.am + + + src/internal.c + 1 + PARENT-5-PROJECT_LOC/src/internal.c + + + src/keys.c + 1 + PARENT-5-PROJECT_LOC/src/keys.c + + + src/ocsp.c + 1 + PARENT-5-PROJECT_LOC/src/ocsp.c + + + src/sniffer.c + 1 + PARENT-5-PROJECT_LOC/src/sniffer.c + + + src/ssl.c + 1 + PARENT-5-PROJECT_LOC/src/ssl.c + + + src/tls.c + 1 + PARENT-5-PROJECT_LOC/src/tls.c + + + src/tls13.c + 1 + PARENT-5-PROJECT_LOC/src/tls13.c + + + src/wolfio.c + 1 + PARENT-5-PROJECT_LOC/src/wolfio.c + + + wolfcrypt/aes.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/aes.c + + + wolfcrypt/arc4.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/arc4.c + + + wolfcrypt/asm.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/asm.c + + + wolfcrypt/asn.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/asn.c + + + wolfcrypt/blake2b.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/blake2b.c + + + wolfcrypt/blake2s.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/blake2s.c + + + wolfcrypt/camellia.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/camellia.c + + + wolfcrypt/chacha.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/chacha.c + + + wolfcrypt/chacha20_poly1305.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/chacha20_poly1305.c + + + wolfcrypt/cmac.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/cmac.c + + + wolfcrypt/coding.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/coding.c + + + wolfcrypt/compress.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/compress.c + + + wolfcrypt/cpuid.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/cpuid.c + + + wolfcrypt/cryptocb.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/cryptocb.c + + + wolfcrypt/curve25519.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/curve25519.c + + + wolfcrypt/des3.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/des3.c + + + wolfcrypt/dh.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/dh.c + + + wolfcrypt/dsa.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/dsa.c + + + wolfcrypt/ecc.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/ecc.c + + + wolfcrypt/ecc_fp.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/ecc_fp.c + + + wolfcrypt/ed25519.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/ed25519.c + + + wolfcrypt/error.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/error.c + + + wolfcrypt/evp.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/evp.c + + + wolfcrypt/fe_low_mem.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/fe_low_mem.c + + + wolfcrypt/fe_operations.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/fe_operations.c + + + wolfcrypt/ge_low_mem.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/ge_low_mem.c + + + wolfcrypt/ge_operations.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/ge_operations.c + + + wolfcrypt/hash.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/hash.c + + + wolfcrypt/hc128.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/hc128.c + + + wolfcrypt/hmac.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/hmac.c + + + wolfcrypt/idea.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/idea.c + + + wolfcrypt/include.am + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/include.am + + + wolfcrypt/integer.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/integer.c + + + wolfcrypt/logging.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/logging.c + + + wolfcrypt/md2.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/md2.c + + + wolfcrypt/md4.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/md4.c + + + wolfcrypt/md5.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/md5.c + + + wolfcrypt/memory.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/memory.c + + + wolfcrypt/misc.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/misc.c + + + wolfcrypt/pkcs12.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/pkcs12.c + + + wolfcrypt/pkcs7.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/pkcs7.c + + + wolfcrypt/poly1305.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/poly1305.c + + + wolfcrypt/port + 2 + virtual:/virtual + + + wolfcrypt/pwdbased.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/pwdbased.c + + + wolfcrypt/rabbit.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/rabbit.c + + + wolfcrypt/random.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/random.c + + + wolfcrypt/ripemd.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/ripemd.c + + + wolfcrypt/rsa.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/rsa.c + + + wolfcrypt/sha.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/sha.c + + + wolfcrypt/sha256.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/sha256.c + + + wolfcrypt/sha3.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/sha3.c + + + wolfcrypt/sha512.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/sha512.c + + + wolfcrypt/signature.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/signature.c + + + wolfcrypt/sp_arm32.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/sp_arm32.c + + + wolfcrypt/sp_arm64.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/sp_arm64.c + + + wolfcrypt/sp_armthumb.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/sp_armthumb.c + + + wolfcrypt/sp_c32.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/sp_c32.c + + + wolfcrypt/sp_c64.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/sp_c64.c + + + wolfcrypt/sp_cortexm.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/sp_cortexm.c + + + wolfcrypt/sp_int.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/sp_int.c + + + wolfcrypt/sp_x86_64.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/sp_x86_64.c + + + wolfcrypt/srp.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/srp.c + + + wolfcrypt/tfm.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/tfm.c + + + wolfcrypt/wc_encrypt.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/wc_encrypt.c + + + wolfcrypt/wc_pkcs11.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/wc_pkcs11.c + + + wolfcrypt/wc_port.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/wc_port.c + + + wolfcrypt/wolfevent.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/wolfevent.c + + + wolfcrypt/wolfmath.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/wolfmath.c + + + wolfcrypt/port/Renesas + 2 + virtual:/virtual + + + wolfcrypt/port/af_alg + 2 + virtual:/virtual + + + wolfcrypt/port/arm + 2 + virtual:/virtual + + + wolfcrypt/port/Renesas/README.md + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/port/Renesas/README.md + + + wolfcrypt/port/Renesas/renesas_tsip_aes.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/port/Renesas/renesas_tsip_aes.c + + + wolfcrypt/port/Renesas/renesas_tsip_sha.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/port/Renesas/renesas_tsip_sha.c + + + wolfcrypt/port/Renesas/renesas_tsip_util.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/port/Renesas/renesas_tsip_util.c + + + wolfcrypt/port/af_alg/afalg_aes.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/port/af_alg/afalg_aes.c + + + wolfcrypt/port/af_alg/afalg_hash.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/port/af_alg/afalg_hash.c + + + wolfcrypt/port/af_alg/wc_afalg.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/port/af_alg/wc_afalg.c + + + wolfcrypt/port/arm/armv8-32-curve25519.S + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/port/arm/armv8-32-curve25519.S + + + wolfcrypt/port/arm/armv8-32-curve25519.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/port/arm/armv8-32-curve25519.c + + + wolfcrypt/port/arm/armv8-32-sha512-asm.S + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/port/arm/armv8-32-sha512-asm.S + + + wolfcrypt/port/arm/armv8-32-sha512-asm.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/port/arm/armv8-32-sha512-asm.c + + + wolfcrypt/port/arm/armv8-aes.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/port/arm/armv8-aes.c + + + wolfcrypt/port/arm/armv8-chacha.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/port/arm/armv8-chacha.c + + + wolfcrypt/port/arm/armv8-curve25519.S + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/port/arm/armv8-curve25519.S + + + wolfcrypt/port/arm/armv8-curve25519.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/port/arm/armv8-curve25519.c + + + wolfcrypt/port/arm/armv8-poly1305.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/port/arm/armv8-poly1305.c + + + wolfcrypt/port/arm/armv8-sha256.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/port/arm/armv8-sha256.c + + + wolfcrypt/port/arm/armv8-sha512-asm.S + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/port/arm/armv8-sha512-asm.S + + + wolfcrypt/port/arm/armv8-sha512-asm.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/port/arm/armv8-sha512-asm.c + + + wolfcrypt/port/arm/armv8-sha512.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/port/arm/armv8-sha512.c + + + wolfcrypt/port/arm/cryptoCell.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/port/arm/cryptoCell.c + + + wolfcrypt/port/arm/cryptoCellHash.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/port/arm/cryptoCellHash.c + + + diff --git a/IDE/Renesas/e2studio/RA6M3G/wolfssl/configuration.xml b/IDE/Renesas/e2studio/RA6M3/wolfssl/configuration.xml similarity index 98% rename from IDE/Renesas/e2studio/RA6M3G/wolfssl/configuration.xml rename to IDE/Renesas/e2studio/RA6M3/wolfssl/configuration.xml index 8a0c408b9..51a1efe71 100644 --- a/IDE/Renesas/e2studio/RA6M3G/wolfssl/configuration.xml +++ b/IDE/Renesas/e2studio/RA6M3/wolfssl/configuration.xml @@ -1,368 +1,368 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - I/O Port - Renesas.RA.0.8.0.pack - - - Board Support Package Common Files - Renesas.RA.0.8.0.pack - - - Arm CMSIS Version 5 - Core (M) - Arm.CMSIS5.5.5.1.pack - - - Amazon FreeRTOS - Amazon.AWS.0.8.0.pack - - - RA6M3G-EK Board Support Files - Renesas.RA_board_ra6m3g_ek.0.8.0.pack - - - Board support package for R7FA6M3AH3CFC - Renesas.RA_mcu_ra6m3.0.8.0.pack - - - Board support package for RA6M3 - Renesas.RA_mcu_ra6m3.0.8.0.pack - - - Board support package for RA6M3 - Renesas.RA_mcu_ra6m3.0.8.0.pack - - - Amazon FreeRTOS - Memory Management - Heap 4 - Amazon.AWS.0.8.0.pack - - - r_ether to FreeRTOS+TCP Wrapper - Renesas.RA.0.8.0.pack - - - Ethernet - Renesas.RA.0.8.0.pack - - - Ethernet PHY - Renesas.RA.0.8.0.pack - - - FreeRTOS+TCP - Amazon.AWS.0.8.0.pack - - - Amazon FreeRTOS - Buffer Allocation 2 - Amazon.AWS.0.8.0.pack - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + I/O Port + Renesas.RA.0.8.0.pack + + + Board Support Package Common Files + Renesas.RA.0.8.0.pack + + + Arm CMSIS Version 5 - Core (M) + Arm.CMSIS5.5.5.1.pack + + + Amazon FreeRTOS + Amazon.AWS.0.8.0.pack + + + RA6M3G-EK Board Support Files + Renesas.RA_board_ra6m3g_ek.0.8.0.pack + + + Board support package for R7FA6M3AH3CFC + Renesas.RA_mcu_ra6m3.0.8.0.pack + + + Board support package for RA6M3 + Renesas.RA_mcu_ra6m3.0.8.0.pack + + + Board support package for RA6M3 + Renesas.RA_mcu_ra6m3.0.8.0.pack + + + Amazon FreeRTOS - Memory Management - Heap 4 + Amazon.AWS.0.8.0.pack + + + r_ether to FreeRTOS+TCP Wrapper + Renesas.RA.0.8.0.pack + + + Ethernet + Renesas.RA.0.8.0.pack + + + Ethernet PHY + Renesas.RA.0.8.0.pack + + + FreeRTOS+TCP + Amazon.AWS.0.8.0.pack + + + Amazon FreeRTOS - Buffer Allocation 2 + Amazon.AWS.0.8.0.pack + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/IDE/Renesas/e2studio/RA6M3G/wolfssl/src/.gitkeep b/IDE/Renesas/e2studio/RA6M3/wolfssl/src/.gitkeep similarity index 100% rename from IDE/Renesas/e2studio/RA6M3G/wolfssl/src/.gitkeep rename to IDE/Renesas/e2studio/RA6M3/wolfssl/src/.gitkeep diff --git a/IDE/Renesas/e2studio/RA6M3G/wolfssl/wolfcrypt/.gitkeep b/IDE/Renesas/e2studio/RA6M3/wolfssl/wolfcrypt/.gitkeep similarity index 100% rename from IDE/Renesas/e2studio/RA6M3G/wolfssl/wolfcrypt/.gitkeep rename to IDE/Renesas/e2studio/RA6M3/wolfssl/wolfcrypt/.gitkeep diff --git a/IDE/Renesas/e2studio/RA6M3G/README.md b/IDE/Renesas/e2studio/RA6M3G/README.md index 03170ffb9..7aab27b8f 100644 --- a/IDE/Renesas/e2studio/RA6M3G/README.md +++ b/IDE/Renesas/e2studio/RA6M3G/README.md @@ -1,175 +1 @@ -wolfSSL for Renesas RA Evaluation Kit (EK-RA6M3G) -================================================= - -## Description - -This directory contains e2studio projects targeted at the Renesas RA 32-bit MCUs.\ -The example projects include a wolfSSL TLS 1.2 client and server.\ -They also include benchmark and cryptography tests for the wolfCrypt library. - -The wolfssl project contains both the wolfSSL and wolfCrypt libraries.\ -It is built as a `Renesas RA C Library Project` and contains the Renesas RA\ -configuration. - -The other projects (benchmark, client, server and test) are built as a\ -`Renesas RA C Project Using RA Library`, where the RA library is the wolfssl project.\ -The wolfssl Project Summary is listed below and is relevant for every project. - -#### Project Summary - -`Board: EK-RA6M3G`\ -`Device: R7FA6M3AH3CFC`\ -`Toolchain: GCC ARM Embedded`\ -`FSP Version: 0.8.0` - -##### Selected software components - -`Board Support Package Common Files v0.8.0`\ -`Arm CMSIS Version 5 - Core (M) v5.5.1`\ -`Amazon FreeRTOS v0.8.0`\ -`RA6M3G-EK Board Support Files v0.8.0`\ -`Board support package for R7FA6M3AH3CFC v0.8.0`\ -`Board support package for RA6M3 v0.8.0`\ -`Board support package for RA6M3 v0.8.0`\ -`Amazon FreeRTOS - Memory Management - Heap 4 v0.8.0`\ -`r_ether to FreeRTOS+TCP Wrapper v0.8.0`\ -`Ethernet v0.8.0`\ -`Ethernet PHY v0.8.0`\ -`FreeRTOS+TCP v0.8.0`\ -`Amazon FreeRTOS - Buffer Allocation 2 v0.8.0` - - -## Setup Steps - -The project directories are missing files necessary to build the project.\ -These files can be generated when creating a new Renesas RA Project.\ -The following steps explain how to generate the missing files and where to place them. - -1.) Create a 'dummy' Renesas RA C Library Project. - + Click File->New->`RA C/C++ Project` - + Click `Renesas RA C Library Project`. Click Next - + Enter `dummy_library` as the project name. Click Next. - + Under `Board: Custom User Board`, select `EK-RA6M3G`. - + Under `RTOS: No RTOS`, select `Amazon FreeRTOS`. - + Click Next. Select `Amazon FreeRTOS - Minimal - Static Allocation` - + Click Finish. - -2.) Create a 'dummy' Renesas RA C Project Using RA Library. - + Click File->New->`RA C/C++ Project` - + Click `Renesas RA C Project Using RA Library`. Click Next - + Enter `dummy_app` as the project name. Click Next. - + Under `RA library project`, select `dummy_library`. - + Click Finish. - -3.) Import all the wolfSSL Projects into e2studio workspace. - + Click File->`Open Projects from File System` - + Click `Directory...` to the right of Import source - + Select the RA6M3G folder location that contains the projects\ - example path: wolfssl/IDE/Renesas/e2studio/RA6M3G - + Deselect the Non-Eclipse project, RA6M3G, by clicking the checkbox\ - Only the folders with 'Eclipse project' under 'Import as' need to be selected. - + Click Finish. - -4.) Copy files from `dummy_library` into `wolfSSL_RA6M3G` - + Expand the dummy_library and wolfSSL_RA6M3G projects\ - (Click the drop-down arrow to the left of the project name.) - + Select and Copy the following folders/files inside dummy_library\ -` ra/`\ -` ra_gen/`\ -` ra_cfg/`\ -` script/`\ -` R7FA6M3AH3CFC.pincfg`\ -` RA6M3G-EK.pingcfg` - + Paste the copied folders/files into wolfSSL_RA6M3G - + The `dummy_library` project can now be deleted. - + Generate Project Content. - + Click `Open RA Configuration` in the top bar (Grey Settings Cog) - + Click `Generate Project Content` at top right (Green Icon) - + Build wolfSSL_RA6M3G. - -5.) Copy files from `dummy_app` into `./IDE/Renesas/e2studio/RA6M3G/common/ra6m3g/`\ - **NOTE:** This may need to be done outside of the e2studio environment (e.g. File Explorer). - + Select and Copy the followng folder inside dummy_app\ -` src/`\ -` script/` - + Paste the copied folders into `./IDE/Renesas/e2studio/RA6M3G/common/ra6m3g/`\ -` (The test, benchmark, client and server projects link to this folder.)` - + The `dummy_app` project can now be deleted. - -6.) Setup Network Environment - - The client and server projects have defines inside their wolfssl_thread_entry.h. - These defines (ucIPAddress ... ucDNSServerAddress) may need to be changed - based on your internal network environment. The g_ether0_mac_address is the default - mac address found inside the RA configuration inside the wolfssl project. - The client wolfssl_thread_entry.h has defines (SERVER_IP and DEFAULT_PORT) that - will need to be changed based on the server you're trying to connect to over - the ethernet connection. - -## Build and Run - -### Build Each Project -Right-Click each Project and select Build. - -### Run wolfCrypt Test and Benchmark -1.) Right-Click the Project name.\ -2.) Select `Debug As` -> `Renesas GDB Hardware Debugging`\ -3.) Select J-Link ARM. Click OK.\ -4.) Select R7Fa6M3AH. Click OK. - -### Run the wolfSSL TLS Server Example. -1.) Right-Click the Project name.\ -2.) Select `Debug As` -> `Renesas GDB Hardware Debugging`\ -3.) Select J-Link ARM. Click OK.\ -4.) Select R7Fa6M3AH. Click OK.\ -5.) Run the following wolfSSL example client command inside the base of the wolfssl directory. - -``` -./examples/client/client -h "ucIPAddress" -p 11111 -A ./certs/1024/ca-cert.pem -``` -**NOTE:** "ucIPAddress" is "192.168.1.241" by default. (See wolfssl_thread_entry.h) - -### Run the wolfSSL TLS Client Example. - 1.) Run the following wolfSSL example server command inside the base of the wolfssl directory. - -``` -./examples/server/server -b -d -p 11111 -c ./certs/1024/server-cert.pem -k ./certs/1024/server-key.pem -``` -**NOTE:** The port 11111 is the DEFAULT_PORT inside wolfssl_thread_entry.h.\ -If DEFAULT_PORT was changed then the above command will need to match it. - - 2.) Right-Click the Project name.\ - 3.) Select `Debug As` -> `Renesas GDB Hardware Debugging`\ - 4.) Select J-Link ARM. Click OK.\ - 5.) Select R7Fa6M3AH. Click OK. - - -## Troubleshooting - -* The commands for the example client/server assumes it is being run from the - base directory of wolfssl. - -* Enter "#define DEBUG_WOLFSSL" inside user_settings.h or wolfssl_thread_entry.c\ - to enable wolfssl debug messages to the Renesas Virtual Debug Console. - -* Some linking errors can be caused by the e2studio project files needing to be rebuilt and freshened. -Right-Click a project, select Index, click Rebuild and then click Freshen Files. Repeat for each project. - -[Support Forum](https://www.wolfssl.com/forums/) - -Support Email: support@wolfssl.com - - -## Resources - -[wolfSSL Website](https://www.wolfssl.com/) - -[wolfSSL Wiki](https://github.com/wolfSSL/wolfssl/wiki) - -[wolfSSL Manual](https://wolfssl.com/wolfSSL/Docs-wolfssl-manual-toc.html) - -[wolfSSL API Reference](https://wolfssl.com/wolfSSL/Docs-wolfssl-manual-17-wolfssl-api-reference.html) - -[wolfCrypt API Reference](https://wolfssl.com/wolfSSL/Docs-wolfssl-manual-18-wolfcrypt-api-reference.html) - -[TLS 1.3](https://www.wolfssl.com/docs/tls13/) +[Moved to ../RA6M3/README.md](../RA6M3/README.md) diff --git a/IDE/Renesas/e2studio/RA6M3G/include.am b/IDE/Renesas/e2studio/RA6M3G/include.am deleted file mode 100644 index c0bab82b8..000000000 --- a/IDE/Renesas/e2studio/RA6M3G/include.am +++ /dev/null @@ -1,32 +0,0 @@ -# vim:ft=automake -# included from Top Level Makefile.am -# All paths should be given relative to the root - -EXTRA_DIST+= IDE/Renesas/e2studio/RA6M3G/benchmark-wolfcrypt/src/wolfssl_thread_entry.c -EXTRA_DIST+= IDE/Renesas/e2studio/RA6M3G/benchmark-wolfcrypt/.cproject -EXTRA_DIST+= IDE/Renesas/e2studio/RA6M3G/benchmark-wolfcrypt/.project - -EXTRA_DIST+= IDE/Renesas/e2studio/RA6M3G/client-wolfssl/src/wolfssl_thread_entry.c -EXTRA_DIST+= IDE/Renesas/e2studio/RA6M3G/client-wolfssl/.cproject -EXTRA_DIST+= IDE/Renesas/e2studio/RA6M3G/client-wolfssl/.project -EXTRA_DIST+= IDE/Renesas/e2studio/RA6M3G/client-wolfssl/wolfssl_thread_entry.h - -EXTRA_DIST+= IDE/Renesas/e2studio/RA6M3G/common/ra6m3g/README.md -EXTRA_DIST+= IDE/Renesas/e2studio/RA6M3G/common/src/freertos_tcp_port.c -EXTRA_DIST+= IDE/Renesas/e2studio/RA6M3G/common/user_settings.h -EXTRA_DIST+= IDE/Renesas/e2studio/RA6M3G/common/util.h - -EXTRA_DIST+= IDE/Renesas/e2studio/RA6M3G/server-wolfssl/src/wolfssl_thread_entry.c -EXTRA_DIST+= IDE/Renesas/e2studio/RA6M3G/server-wolfssl/.cproject -EXTRA_DIST+= IDE/Renesas/e2studio/RA6M3G/server-wolfssl/.project -EXTRA_DIST+= IDE/Renesas/e2studio/RA6M3G/server-wolfssl/wolfssl_thread_entry.h - -EXTRA_DIST+= IDE/Renesas/e2studio/RA6M3G/test-wolfcrypt/src/wolfssl_thread_entry.c -EXTRA_DIST+= IDE/Renesas/e2studio/RA6M3G/test-wolfcrypt/.cproject -EXTRA_DIST+= IDE/Renesas/e2studio/RA6M3G/test-wolfcrypt/.project - -EXTRA_DIST+= IDE/Renesas/e2studio/RA6M3G/wolfssl/.cproject -EXTRA_DIST+= IDE/Renesas/e2studio/RA6M3G/wolfssl/.project -EXTRA_DIST+= IDE/Renesas/e2studio/RA6M3G/wolfssl/configuration.xml - -EXTRA_DIST+= IDE/Renesas/e2studio/RA6M3G/README.md diff --git a/IDE/include.am b/IDE/include.am index 828b173ad..e56ef8062 100644 --- a/IDE/include.am +++ b/IDE/include.am @@ -24,7 +24,7 @@ include IDE/mynewt/include.am include IDE/Renesas/e2studio/DK-S7G2/include.am include IDE/Renesas/cs+/Projects/include.am include IDE/Renesas/e2studio/Projects/include.am -include IDE/Renesas/e2studio/RA6M3G/include.am +include IDE/Renesas/e2studio/RA6M3/include.am include IDE/WICED-STUDIO/include.am include IDE/CRYPTOCELL/include.am include IDE/M68K/include.am diff --git a/wolfssl/wolfcrypt/settings.h b/wolfssl/wolfcrypt/settings.h index f22357c29..50d445b79 100644 --- a/wolfssl/wolfcrypt/settings.h +++ b/wolfssl/wolfcrypt/settings.h @@ -298,7 +298,7 @@ #endif #endif -#if defined(WOLFSSL_RENESAS_RA6M3G) +#if defined(WOLFSSL_RENESAS_RA6M3G) || defined(WOLFSSL_RENESAS_RA6M3) /* settings in user_settings.h */ #endif diff --git a/wolfssl/wolfio.h b/wolfssl/wolfio.h index a4f892a46..ccbe6a2ad 100644 --- a/wolfssl/wolfio.h +++ b/wolfssl/wolfio.h @@ -160,7 +160,7 @@ #endif #endif - #if defined(WOLFSSL_RENESAS_RA6M3G) /* Uses FREERTOS_TCP */ + #if defined(WOLFSSL_RENESAS_RA6M3G) || defined(WOLFSSL_RENESAS_RA6M3) /* Uses FREERTOS_TCP */ #include #endif From 8ff1b474bc2f1ed17fcb2cce2927a7bfb09e9c7e Mon Sep 17 00:00:00 2001 From: Takashi Kojo Date: Sun, 14 Jun 2020 07:12:13 +0900 Subject: [PATCH 233/298] Tentative: User defined mutex --- user-mutex.c | 27 +++++++++++++++++++++++++++ user_settings.h | 2 ++ wolfcrypt/src/wc_port.c | 7 ++++++- wolfssl/wolfcrypt/wc_port.h | 8 ++++++-- 4 files changed, 41 insertions(+), 3 deletions(-) create mode 100644 user-mutex.c create mode 100644 user_settings.h diff --git a/user-mutex.c b/user-mutex.c new file mode 100644 index 000000000..fca7da3cc --- /dev/null +++ b/user-mutex.c @@ -0,0 +1,27 @@ +#include + + int wc_InitMutex(wolfSSL_Mutex* m) + { + (void)m; + return 0; + } + + int wc_FreeMutex(wolfSSL_Mutex *m) + { + (void)m; + return 0; + } + + + int wc_LockMutex(wolfSSL_Mutex *m) + { + (void)m; + return 0; + } + + + int wc_UnLockMutex(wolfSSL_Mutex *m) + { + (void)m; + return 0; + } \ No newline at end of file diff --git a/user_settings.h b/user_settings.h new file mode 100644 index 000000000..23554d6e4 --- /dev/null +++ b/user_settings.h @@ -0,0 +1,2 @@ + +typedef int wolfSSL_Mutex; diff --git a/wolfcrypt/src/wc_port.c b/wolfcrypt/src/wc_port.c index 087807b71..5b67c2633 100644 --- a/wolfcrypt/src/wc_port.c +++ b/wolfcrypt/src/wc_port.c @@ -647,7 +647,7 @@ int z_fs_close(XFILE file) #endif /* !NO_FILESYSTEM && !WOLFSSL_ZEPHYR */ - +#if !defined(WOLFSSL_USER_MUTEX) wolfSSL_Mutex* wc_InitAndAllocMutex(void) { wolfSSL_Mutex* m = (wolfSSL_Mutex*) XMALLOC(sizeof(wolfSSL_Mutex), NULL, @@ -665,6 +665,7 @@ wolfSSL_Mutex* wc_InitAndAllocMutex(void) return m; } +#endif #ifdef USE_WOLF_STRTOK /* String token (delim) search. If str is null use nextp. */ @@ -1845,6 +1846,10 @@ int wolfSSL_CryptHwMutexUnLock(void) { return 0; } +#elif defined(WOLFSSL_USER_MUTEX) + + /* Use user own mutex */ + #else #warning No mutex handling defined diff --git a/wolfssl/wolfcrypt/wc_port.h b/wolfssl/wolfcrypt/wc_port.h index 88c7bfe34..cf54e5de1 100644 --- a/wolfssl/wolfcrypt/wc_port.h +++ b/wolfssl/wolfcrypt/wc_port.h @@ -156,8 +156,10 @@ #else #ifndef SINGLE_THREADED - #define WOLFSSL_PTHREADS - #include + #ifndef WOLFSSL_USER_MUTEX + #define WOLFSSL_PTHREADS + #include + #endif #endif #if (defined(OPENSSL_EXTRA) || defined(GOAHEAD_WS)) && \ !defined(NO_FILESYSTEM) @@ -238,6 +240,8 @@ typedef struct k_mutex wolfSSL_Mutex; #elif defined(WOLFSSL_TELIT_M2MB) typedef M2MB_OS_MTX_HANDLE wolfSSL_Mutex; + #elif defined(WOLFSSL_USER_MUTEX) + /* typedef User_Mutex wolfSSL_Mutex; */ #else #error Need a mutex type in multithreaded mode #endif /* USE_WINDOWS_API */ From 3f344b7d89df98e2d10c160be34a30f411ead2dd Mon Sep 17 00:00:00 2001 From: Sean Parkinson Date: Mon, 15 Jun 2020 14:46:39 +1000 Subject: [PATCH 234/298] AES small table fix Symbol not needed when only compiling AES algorithms (AES-GCM, AES-CCM, AES-CTR) not using AES decrypt. Allow AES-CCM to be compiled without AES-GCM. --- wolfcrypt/src/aes.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/wolfcrypt/src/aes.c b/wolfcrypt/src/aes.c index 8afb4635f..b0001f198 100644 --- a/wolfcrypt/src/aes.c +++ b/wolfcrypt/src/aes.c @@ -1561,6 +1561,7 @@ static word32 col_mul(word32 t, int i2, int i3, int ia, int ib) return GETBYTE(t, ia) ^ GETBYTE(t, ib) ^ t3 ^ tm; } +#if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_DIRECT) static word32 inv_col_mul(word32 t, int i9, int ib, int id, int ie) { byte t9 = GETBYTE(t, i9); @@ -1571,8 +1572,10 @@ static word32 inv_col_mul(word32 t, int i9, int ib, int id, int ie) return t0 ^ AES_XTIME(AES_XTIME(AES_XTIME(t0 ^ te) ^ td ^ te) ^ tb ^ te); } #endif +#endif -#if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_DIRECT) || defined(HAVE_AESGCM) +#if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_DIRECT) || \ + defined(HAVE_AESCCM) || defined(HAVE_AESGCM) #ifndef WC_CACHE_LINE_SZ #if defined(__x86_64__) || defined(_M_X64) || \ From f020b0f24a3cadd604e05c79f899bedc4bfc660a Mon Sep 17 00:00:00 2001 From: Jacob Barthelmeh Date: Mon, 15 Jun 2020 14:41:05 -0600 Subject: [PATCH 235/298] add check on decode subtree return value --- wolfcrypt/src/asn.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/wolfcrypt/src/asn.c b/wolfcrypt/src/asn.c index 91cbab76e..38c853b4f 100644 --- a/wolfcrypt/src/asn.c +++ b/wolfcrypt/src/asn.c @@ -8408,7 +8408,10 @@ static int DecodeNameConstraints(const byte* input, int sz, DecodedCert* cert) return ASN_PARSE_E; } - DecodeSubtree(input + idx, length, subtree, cert->heap); + if (DecodeSubtree(input + idx, length, subtree, cert->heap) < 0) { + WOLFSSL_MSG("\terror parsing subtree"); + return ASN_PARSE_E; + } idx += length; } From 7a15639927197e5ca8d81535f9102e9fda68c22e Mon Sep 17 00:00:00 2001 From: Sean Parkinson Date: Tue, 16 Jun 2020 22:16:13 +1000 Subject: [PATCH 236/298] Add Doxygen documentation for Curve448/Ed448 Update Curve25519/Ed25519 Doxygen documentation too. Make public key is a public API - check pubKey pointer is not NULL. --- doc/dox_comments/header_files/curve25519.h | 422 +++++---- doc/dox_comments/header_files/curve448.h | 768 +++++++++++++++ .../header_files/doxygen_groups.h | 2 + doc/dox_comments/header_files/doxygen_pages.h | 2 + doc/dox_comments/header_files/ed25519.h | 794 ++++++++++++---- doc/dox_comments/header_files/ed448.h | 872 ++++++++++++++++++ wolfcrypt/src/ed25519.c | 2 +- wolfcrypt/src/ed448.c | 2 +- 8 files changed, 2532 insertions(+), 332 deletions(-) create mode 100644 doc/dox_comments/header_files/curve448.h create mode 100644 doc/dox_comments/header_files/ed448.h diff --git a/doc/dox_comments/header_files/curve25519.h b/doc/dox_comments/header_files/curve25519.h index dd9bf70b6..28fb6b2bd 100644 --- a/doc/dox_comments/header_files/curve25519.h +++ b/doc/dox_comments/header_files/curve25519.h @@ -1,33 +1,38 @@ /*! \ingroup Curve25519 - \brief This function generates a curve25519 key using the given random + \brief This function generates a Curve25519 key using the given random number generator, rng, of the size given (keysize), and stores it in the given curve25519_key structure. It should be called after the key - structure has been initialized through wc_curve25519_init. + structure has been initialized through wc_curve25519_init(). \return 0 Returned on successfully generating the key and and storing - it in the given curve25519_key structure - \return ECC_BAD_ARG_E Returned if rng or key evaluate to NULL, or - the input keysize does not correspond to the keysize for a - curve25519 key ( 32 bytes) + it in the given curve25519_key structure. + \return ECC_BAD_ARG_E Returned if the input keysize does not correspond to + the keysize for a curve25519 key (32 bytes). \return RNG_FAILURE_E Returned if the rng internal status is not - DRBG_OK or if there is in generating the next random block with rng + DRBG_OK or if there is in generating the next random block with rng. + \return BAD_FUNC_ARG Returned if any of the input parameters passed in + are NULL. - \param rng pointer to the RNG object used to generate the ecc key - \param keysize size of the key to generate. Must be 32 bytes for curve25519 - \param key pointer to the curve25519_key structure in which to - store the generated key + \param [in] rng Pointer to the RNG object used to generate the ecc key. + \param [in] keysize Size of the key to generate. Must be 32 bytes for + curve25519. + \param [in,out] key Pointer to the curve25519_key structure in which to + store the generated key. _Example_ \code + int ret; + curve25519_key key; wc_curve25519_init(&key); // initialize key WC_RNG rng; wc_InitRng(&rng); // initialize random number generator - if( wc_curve25519_make_key(&rng, 32, &key) != 0) { - // making 25519 key + ret = wc_curve25519_make_key(&rng, 32, &key); + if (ret != 0) { + // error making Curve25519 key } \endcode @@ -44,31 +49,33 @@ int wc_curve25519_make_key(WC_RNG* rng, int keysize, curve25519_key* key); buffer out and assigns the variable of the secret key to outlen. Only supports big endian. - \return 0 Returned on successfully computing a shared secret key + \return 0 Returned on successfully computing a shared secret key. \return BAD_FUNC_ARG Returned if any of the input parameters passed in - are NULL + are NULL. \return ECC_BAD_ARG_E Returned if the first bit of the public key is - set, to avoid implementation fingerprinting + set, to avoid implementation fingerprinting. - \param private_key pointer to the curve25519_key structure initialized - with the user’s private key - \param public_key pointer to the curve25519_key structure containing - the received public key - \param out pointer to a buffer in which to store the 32 byte computed - secret key - \param outlen pointer in which to store the length written to the - output buffer + \param [in] private_key Pointer to the curve25519_key structure initialized + with the user’s private key. + \param [in] public_key Pointer to the curve25519_key structure containing + the received public key. + \param [out] out Pointer to a buffer in which to store the 32 byte computed + secret key. + \param [in,out] outlen Pointer in which to store the length written to the + output buffer. _Example_ \code + int ret; + byte sharedKey[32]; word32 keySz; curve25519_key privKey, pubKey; // initialize both keys - if ( wc_curve25519_shared_secret(&privKey, &pubKey, sharedKey, - &keySz) != 0 ) { - // error generating shared key + ret = wc_curve25519_shared_secret(&privKey, &pubKey, sharedKey, &keySz); + if (ret != 0) { + // error generating shared key } \endcode @@ -89,34 +96,37 @@ int wc_curve25519_shared_secret(curve25519_key* private_key, buffer out and assigns the variable of the secret key to outlen. Supports both big and little endian. - \return 0 Returned on successfully computing a shared secret key + \return 0 Returned on successfully computing a shared secret key. \return BAD_FUNC_ARG Returned if any of the input parameters passed in - are NULL + are NULL. \return ECC_BAD_ARG_E Returned if the first bit of the public key is set, - to avoid implementation fingerprinting + to avoid implementation fingerprinting. - \param private_key pointer to the curve25519_key structure initialized - with the user’s private key - \param public_key pointer to the curve25519_key structure containing - the received public key - \param out pointer to a buffer in which to store the 32 byte computed - secret key - \param outlen pointer in which to store the length written to the output - buffer - \param endian EC25519_BIG_ENDIAN or EC25519_LITTLE_ENDIAN to set which + \param [in] private_key Pointer to the curve25519_key structure initialized + with the user’s private key. + \param [in] public_key Pointer to the curve25519_key structure containing + the received public key. + \param [out] out Pointer to a buffer in which to store the 32 byte computed + secret key. + \param pin,out] outlen Pointer in which to store the length written to the + output buffer. + \param [in] endian EC25519_BIG_ENDIAN or EC25519_LITTLE_ENDIAN to set which form to use. _Example_ \code + int ret; + byte sharedKey[32]; word32 keySz; curve25519_key privKey, pubKey; // initialize both keys - if ( wc_curve25519_shared_secret_ex(&privKey, &pubKey, sharedKey, &keySz, - EC25519_BIG_ENDIAN) != 0 ) { - // error generating shared key + ret = wc_curve25519_shared_secret_ex(&privKey, &pubKey, sharedKey, &keySz, + EC25519_BIG_ENDIAN); + if (ret != 0) { + // error generating shared key } \endcode @@ -132,14 +142,14 @@ int wc_curve25519_shared_secret_ex(curve25519_key* private_key, /*! \ingroup Curve25519 - \brief This function initializes a curve25519 key. It should be called - before generating a key for the structure with wc_curve25519_init and - before using the key to encrypt data. + \brief This function initializes a Curve25519 key. It should be called + before generating a key for the structure. \return 0 Returned on successfully initializing the curve25519_key - structure + structure. + \return BAD_FUNC_ARG Returned when key is NULL. - \param key pointer to the curve25519_key structure to initialize + \param [in,out] key Pointer to the curve25519_key structure to initialize. _Example_ \code @@ -156,11 +166,9 @@ int wc_curve25519_init(curve25519_key* key); /*! \ingroup Curve25519 - \brief This function frees a curve 25519 object. + \brief This function frees a Curve25519 object. - \return none No returns. - - \param key pointer to the key object to free + \param [in,out] key Pointer to the key object to free. _Example_ \code @@ -180,24 +188,26 @@ void wc_curve25519_free(curve25519_key* key); \brief This function imports a curve25519 private key only. (Big endian). - \return 0 Success + \return 0 Returned on successfully importing private key. \return BAD_FUNC_ARG Returns if key or priv is null. - \return ECC_BAD_ARG_E Returns if privSz is not equal to - wc_curve25519_size(key). + \return ECC_BAD_ARG_E Returns if privSz is not equal to CURVE25519_KEY_SIZE. - \param priv Private key buffer - \param privSz Size of private key buffer. - \param key The curve25519_key structure to store the private key. + \param [in] priv Pointer to a buffer containing the private key to import. + \param [in] privSz Length of the private key to import. + \param [in,out] key Pointer to the structure in which to store the imported + key. _Example_ \code + int ret; + byte priv[] = { Contents of private key }; curve25519_key key; wc_curve25519_init(&key); - if(wc_curve25519_import_private(priv, sizeof(priv), &key) != 0) - { - // Some error was thrown + ret = wc_curve25519_import_private(priv, sizeof(priv), &key); + if (ret != 0) { + // error importing keys } \endcode @@ -213,33 +223,35 @@ int wc_curve25519_import_private(const byte* priv, word32 privSz, \brief curve25519 private key import only. (Big or Little endian). - \return 0 Success - \return Returns if key or priv is null. - \return ECC_BAD_ARG_E Returns if privSz is not equal to - wc_curve25519_size(key). + \return 0 Returned on successfully importing private key. + \return BAD_FUNC_ARG Returns if key or priv is null. + \return ECC_BAD_ARG_E Returns if privSz is not equal to CURVE25519_KEY_SIZE. - \param priv Buffer for private key. - \param privSz Size of private key buffer. - \param key The curve25519_key structure to store the private key. - \param endian EC25519_BIG_ENDIAN or EC25519_LITTLE_ENDIAN to + \param [in] priv Pointer to a buffer containing the private key to import. + \param [in] privSz Length of the private key to import. + \param [in,out] key Pointer to the structure in which to store the imported + key. + \param [in] endian EC25519_BIG_ENDIAN or EC25519_LITTLE_ENDIAN to set which form to use. _Example_ \code + int ret; + byte priv[] = { // Contents of private key }; curve25519_key key; wc_curve25519_init(&key); - if(wc_curve25519_import_private_ex(priv, sizeof(priv), &key, - EC25519_BIG_ENDIAN) != 0) - { - // Some error was thrown + ret = wc_curve25519_import_private_ex(priv, sizeof(priv), &key, + EC25519_BIG_ENDIAN); + if (ret != 0) { + // error importing keys } \endcode \sa wc_curve25519_import_private - \sa wc_curbe25519_size + \sa wc_curve25519_size */ WOLFSSL_API int wc_curve25519_import_private_ex(const byte* priv, word32 privSz, @@ -252,15 +264,16 @@ int wc_curve25519_import_private_ex(const byte* priv, word32 privSz, curve25519_key structure. Big endian only. \return 0 Returned on importing into the curve25519_key structure - \return ECC_BAD_ARG_E Returned if any of the input parameters - are NULL, or the input key’s key size does not match the public - or private key sizes + \return BAD_FUNC_ARG Returns if any of the input parameters are null. + \return ECC_BAD_ARG_E Returned if the input key’s key size does not match + the public or private key sizes. - \param priv pointer to a buffer containing the private key to import - \param privSz length of the private key to import - \param pub pointer to a buffer containing the public key to import - \param pubSz length of the public key to import - \param key pointer to the structure in which to store the imported keys + \param [in] priv Pointer to a buffer containing the private key to import. + \param [in] privSz Length of the private key to import. + \param [in] pub Pointer to a buffer containing the public key to import. + \param [in] pubSz Length of the public key to import. + \param [in,out] key Pointer to the structure in which to store the imported + keys. _Example_ \code @@ -275,9 +288,9 @@ int wc_curve25519_import_private_ex(const byte* priv, word32 privSz, // initialize key ret = wc_curve25519_import_private_raw(&priv, sizeof(priv), pub, - sizeof(pub),&key); + sizeof(pub), &key); if (ret != 0) { - // error importing keys + // error importing keys } \endcode @@ -296,15 +309,17 @@ int wc_curve25519_import_private_raw(const byte* priv, word32 privSz, \brief This function imports a public-private key pair into a curve25519_key structure. Supports both big and little endian. \return 0 Returned on importing into the curve25519_key structure - \return ECC_BAD_ARG_E Returned if any of the input parameters are NULL, - or the input key’s key size does not match the public or private key sizes + \return BAD_FUNC_ARG Returns if any of the input parameters are null. + \return ECC_BAD_ARG_E Returned if or the input key’s key size does not match + the public or private key sizes - \param priv pointer to a buffer containing the private key to import - \param privSz length of the private key to import - \param pub pointer to a buffer containing the public key to import - \param pubSz length of the public key to import - \param key pointer to the structure in which to store the imported keys - \param endian EC25519_BIG_ENDIAN or EC25519_LITTLE_ENDIAN to set + \param [in] priv Pointer to a buffer containing the private key to import. + \param [in] privSz Length of the private key to import. + \param [in] pub Pointer to a buffer containing the public key to import. + \param [in] pubSz Length of the public key to import. + \param [in,out] key Pointer to the structure in which to store the imported + keys. + \param [in] endian EC25519_BIG_ENDIAN or EC25519_LITTLE_ENDIAN to set which form to use. _Example_ @@ -319,16 +334,16 @@ int wc_curve25519_import_private_raw(const byte* priv, word32 privSz, // initialize key ret = wc_curve25519_import_private_raw_ex(&priv, sizeof(priv), pub, - sizeof(pub),&key, EC25519_BIG_ENDIAN); + sizeof(pub), &key, EC25519_BIG_ENDIAN); if (ret != 0) { - // error importing keys + // error importing keys } \endcode \sa wc_curve25519_init \sa wc_curve25519_make_key \sa wc_curve25519_import_public - \sa wc_curve25519_export_private_rawm + \sa wc_curve25519_export_private_raw \sa wc_curve25519_import_private_raw */ WOLFSSL_API @@ -344,13 +359,14 @@ int wc_curve25519_import_private_raw_ex(const byte* priv, word32 privSz, of the exported key. Big Endian only. \return 0 Returned on successfully exporting the private key from the - curve25519_key structure + curve25519_key structure. \return BAD_FUNC_ARG Returned if any input parameters are NULL. \return ECC_BAD_ARG_E Returned if wc_curve25519_size() is not equal to key. - \param key pointer to the structure from which to export the key - \param out pointer to the buffer in which to store the exported key - \param outLen will store the bytes written to the output buffer + \param [in] key Pointer to the structure from which to export the key. + \param [out] out Pointer to the buffer in which to store the exported key. + \param [in,out] outLen On in, is the size of the out in bytes. + On out, will store the bytes written to the output buffer. _Example_ \code @@ -363,7 +379,7 @@ int wc_curve25519_import_private_raw_ex(const byte* priv, word32 privSz, ret = wc_curve25519_export_private_raw(&key, priv, &privSz); if (ret != 0) { - // error exporting key + // error exporting key } \endcode @@ -384,14 +400,15 @@ int wc_curve25519_export_private_raw(curve25519_key* key, byte* out, of the exported key. Can specify whether it's big or little endian. \return 0 Returned on successfully exporting the private key from the - curve25519_key structure + curve25519_key structure. \return BAD_FUNC_ARG Returned if any input parameters are NULL. \return ECC_BAD_ARG_E Returned if wc_curve25519_size() is not equal to key. - \param key pointer to the structure from which to export the key - \param out pointer to the buffer in which to store the exported key - \param outLen will store the bytes written to the output buffer - \param endian EC25519_BIG_ENDIAN or EC25519_LITTLE_ENDIAN to set which + \param [in] key Pointer to the structure from which to export the key. + \param [out] out Pointer to the buffer in which to store the exported key. + \param [in,out] outLen On in, is the size of the out in bytes. + On out, will store the bytes written to the output buffer. + \param [in] endian EC25519_BIG_ENDIAN or EC25519_LITTLE_ENDIAN to set which form to use. _Example_ @@ -403,9 +420,9 @@ int wc_curve25519_export_private_raw(curve25519_key* key, byte* out, curve25519_key key; // initialize and make key ret = wc_curve25519_export_private_raw_ex(&key, priv, &privSz, - EC25519_BIG_ENDIAN); + EC25519_BIG_ENDIAN); if (ret != 0) { - // error exporting key + // error exporting key } \endcode @@ -426,16 +443,15 @@ int wc_curve25519_export_private_raw_ex(curve25519_key* key, byte* out, stores it in the curve25519_key structure. \return 0 Returned on successfully importing the public key into the - curve25519_key structure - \return ECC_BAD_ARG_E Returned if any of the input parameters are NULL, - or if the inLen -parameter does not match the key size of the key structure. + curve25519_key structure. + \return ECC_BAD_ARG_E Returned if the inLen parameter does not match the key + size of the key structure. \return BAD_FUNC_ARG Returned if any of the input parameters are NULL. - \param in pointer to the buffer containing the public key to import - \param inLen length of the public key to import - \param key pointer to the curve25519_key structure in which to store - the key + \param [in] in Pointer to the buffer containing the public key to import. + \param [in] inLen Length of the public key to import. + \param [in,out] key Pointer to the curve25519_key structure in which to + store the key. _Example_ \code @@ -449,14 +465,16 @@ parameter does not match the key size of the key structure. ret = wc_curve25519_import_public(pub,sizeof(pub), &key); if (ret != 0) { - // error exporting key + // error importing key } \endcode \sa wc_curve25519_init \sa wc_curve25519_export_public \sa wc_curve25519_import_private_raw - \sa wc_curve25519_public_ex + \sa wc_curve25519_import_public_ex + \sa wc_curve25519_check_public + \sa wc_curve25519_size */ WOLFSSL_API int wc_curve25519_import_public(const byte* in, word32 inLen, @@ -468,31 +486,32 @@ int wc_curve25519_import_public(const byte* in, word32 inLen, \brief This function imports a public key from the given in buffer and stores it in the curve25519_key structure. - \brief 0 Returned on successfully importing the public key into the - curve25519_key structure - \brief ECC_BAD_ARG_E Returned if the inLen parameter does not match the - key size of the key structure - \brief BAD_FUNC_ARG Returned if any of the input parameters are NULL. + \return 0 Returned on successfully importing the public key into the + curve25519_key structure. + \return ECC_BAD_ARG_E Returned if the inLen parameter does not match the + key size of the key structure. + \return BAD_FUNC_ARG Returned if any of the input parameters are NULL. - \param in pointer to the buffer containing the public key to import - \param inLen length of the public key to import - \param key pointer to the curve25519_key structure in which to store - the key - \param endian EC25519_BIG_ENDIAN or EC25519_LITTLE_ENDIAN to set which + \param [in] in Pointer to the buffer containing the public key to import. + \param [in] inLen Length of the public key to import. + \param [in,out] key Pointer to the curve25519_key structure in which to + store the key. + \param [in] endian EC25519_BIG_ENDIAN or EC25519_LITTLE_ENDIAN to set which form to use. _Example_ \code int ret; + byte pub[32]; // initialize pub with public key curve25519_key key; // initialize key - ret = wc_curve25519_import_public_ex(pub,sizeof(pub), &key, - EC25519_BIG_ENDIAN); + ret = wc_curve25519_import_public_ex(pub, sizeof(pub), &key, + EC25519_BIG_ENDIAN); if (ret != 0) { - // error exporting key + // error importing key } \endcode @@ -500,7 +519,8 @@ int wc_curve25519_import_public(const byte* in, word32 inLen, \sa wc_curve25519_export_public \sa wc_curve25519_import_private_raw \sa wc_curve25519_import_public - \sa wc_25519_size + \sa wc_curve25519_check_public + \sa wc_curve25519_size */ WOLFSSL_API int wc_curve25519_import_public_ex(const byte* in, word32 inLen, @@ -509,28 +529,68 @@ int wc_curve25519_import_public_ex(const byte* in, word32 inLen, /*! \ingroup Curve25519 - \brief This function exports a public key from the given key structure and - stores the result in the out buffer. Big endian only. + \brief This function checks that a public key buffer holds a valid + Curve25519 key value given the endian ordering. - \return 0 Returned on successfully exporting the public key from the - curve25519_key structure - \return ECC_BAD_ARG_E Returned if any of the input parameters are NULL + \return 0 Returned when the public key value is valid. + \return ECC_BAD_ARG_E Returned if the public key value is not valid. + \return BAD_FUNC_ARG Returned if any of the input parameters are NULL. - \param key pointer to the curve25519_key structure in from which to - export the key - \param out pointer to the buffer in which to store the public key - \param outLen will store the bytes written to the output buffer + \param [in] pub Pointer to the buffer containing the public key to check. + \param [in] pubLen Length of the public key to check. + \param [in] endian EC25519_BIG_ENDIAN or EC25519_LITTLE_ENDIAN to set which + form to use. _Example_ \code int ret; + + byte pub[] = { Contents of public key }; + + ret = wc_curve25519_check_public_ex(pub, sizeof(pub), EC25519_BIG_ENDIAN); + if (ret != 0) { + // error importing key + } + \endcode + + \sa wc_curve25519_init + \sa wc_curve25519_import_public + \sa wc_curve25519_import_public_ex + \sa wc_curve25519_size +*/ +WOLFSSL_API +int wc_curve25519_check_public(const byte* pub, word32 pubSz, int endian); + +/*! + \ingroup Curve25519 + + \brief This function exports a public key from the given key structure and + stores the result in the out buffer. Big endian only. + + \return 0 Returned on successfully exporting the public key from the + curve25519_key structure. + \return ECC_BAD_ARG_E Returned if outLen is less than + CURVE25519_PUB_KEY_SIZE. + \return BAD_FUNC_ARG Returned if any of the input parameters are NULL. + + \param [in] key Pointer to the curve25519_key structure in from which to + export the key. + \param [out] out Pointer to the buffer in which to store the public key. + \param [in,out] outLen On in, is the size of the out in bytes. + On out, will store the bytes written to the output buffer. + + _Example_ + \code + int ret; + byte pub[32]; int pubSz; + curve25519_key key; // initialize and make key - ret = wc_curve25519_export_public(&key,pub, &pubSz); + ret = wc_curve25519_export_public(&key, pub, &pubSz); if (ret != 0) { - // error exporting key + // error exporting key } \endcode @@ -548,14 +608,17 @@ int wc_curve25519_export_public(curve25519_key* key, byte* out, word32* outLen); stores the result in the out buffer. Supports both big and little endian. \return 0 Returned on successfully exporting the public key from the - curve25519_key structure - \return ECC_BAD_ARG_E Returned if any of the input parameters are NULL + curve25519_key structure. + \return ECC_BAD_ARG_E Returned if outLen is less than + CURVE25519_PUB_KEY_SIZE. + \return BAD_FUNC_ARG Returned if any of the input parameters are NULL. - \param key pointer to the curve25519_key structure in from which to - export the key - \param out pointer to the buffer in which to store the public key - \param outLen will store the bytes written to the output buffer - \param endian EC25519_BIG_ENDIAN or EC25519_LITTLE_ENDIAN to set which + \param [in] key Pointer to the curve25519_key structure in from which to + export the key. + \param [out] out Pointer to the buffer in which to store the public key. + \param [in,out] outLen On in, is the size of the out in bytes. + On out, will store the bytes written to the output buffer. + \param [in] endian EC25519_BIG_ENDIAN or EC25519_LITTLE_ENDIAN to set which form to use. _Example_ @@ -564,12 +627,13 @@ int wc_curve25519_export_public(curve25519_key* key, byte* out, word32* outLen); byte pub[32]; int pubSz; + curve25519_key key; // initialize and make key - ret = wc_curve25519_export_public_ex(&key,pub, &pubSz, EC25519_BIG_ENDIAN); + ret = wc_curve25519_export_public_ex(&key, pub, &pubSz, EC25519_BIG_ENDIAN); if (ret != 0) { - // error exporting key + // error exporting key } \endcode @@ -584,21 +648,27 @@ int wc_curve25519_export_public_ex(curve25519_key* key, byte* out, /*! \ingroup Curve25519 - \brief Export curve25519 key pair. Big endian only. + \brief Export Curve25519 key pair. Big endian only. - \return 0 Success + \return 0 Returned on successfully exporting the key pair from the + curve25519_key structure. \return BAD_FUNC_ARG Returned if any input parameters are NULL. - \return ECC_BAD_ARG_E Returned if wc_curve25519_size() is not equal to key. + \return ECC_BAD_ARG_E Returned if privSz is less than CURVE25519_KEY_SIZE or + pubSz is less than CURVE25519_PUB_KEY_SIZE. - \param key Description - \param priv Private key buffer. - \param privSz Size of private key buffer. - \param pub Public key buffer. - \param pubSz Size of public key buffer. + \param [in] key Pointer to the curve448_key structure in from which to + export the key pair. + \param [out] priv Pointer to the buffer in which to store the private key. + \param [in,out] privSz On in, is the size of the priv buffer in bytes. + On out, will store the bytes written to the priv buffer. + \param [out] pub Pointer to the buffer in which to store the public key. + \param [in,out] pubSz On in, is the size of the pub buffer in bytes. + On out, will store the bytes written to the pub buffer. _Example_ \code int ret; + byte pub[32]; byte priv[32]; int pubSz; @@ -609,13 +679,12 @@ int wc_curve25519_export_public_ex(curve25519_key* key, byte* out, ret = wc_curve25519_export_key_raw(&key, priv, &privSz, pub, &pubSz); if (ret != 0) { - // error exporting key + // error exporting key } \endcode \sa wc_curve25519_export_key_raw_ex \sa wc_curve25519_export_private_raw - \sa wc_curve25519_export_public_raw */ WOLFSSL_API int wc_curve25519_export_key_raw(curve25519_key* key, @@ -627,16 +696,21 @@ int wc_curve25519_export_key_raw(curve25519_key* key, \brief Export curve25519 key pair. Big or little endian. - \return 0 Success + \return 0 Returned on successfully exporting the key pair from the + curve25519_key structure. \return BAD_FUNC_ARG Returned if any input parameters are NULL. - \return ECC_BAD_ARG_E Returned if wc_curve25519_size() is not equal to key. + \return ECC_BAD_ARG_E Returned if privSz is less than CURVE25519_KEY_SIZE or + pubSz is less than CURVE25519_PUB_KEY_SIZE. - \param key Description - \param priv Private key buffer. - \param privSz Size of private key buffer. - \param pub Public key buffer. - \param pubSz Size of public key buffer. - \param endian EC25519_BIG_ENDIAN or EC25519_LITTLE_ENDIAN to set which + \param [in] key Pointer to the curve448_key structure in from which to + export the key pair. + \param [out] priv Pointer to the buffer in which to store the private key. + \param [in,out] privSz On in, is the size of the priv buffer in bytes. + On out, will store the bytes written to the priv buffer. + \param [out] pub Pointer to the buffer in which to store the public key. + \param [in,out] pubSz On in, is the size of the pub buffer in bytes. + On out, will store the bytes written to the pub buffer. + \param [in] endian EC25519_BIG_ENDIAN or EC25519_LITTLE_ENDIAN to set which form to use. _Example_ @@ -652,9 +726,9 @@ int wc_curve25519_export_key_raw(curve25519_key* key, // initialize and make key ret = wc_curve25519_export_key_raw_ex(&key,priv, &privSz, pub, &pubSz, - EC25519_BIG_ENDIAN); + EC25519_BIG_ENDIAN); if (ret != 0) { - // error exporting key + // error exporting key } \endcode @@ -677,14 +751,16 @@ int wc_curve25519_export_key_raw_ex(curve25519_key* key, returns the size of the key. \return 0 Returned if key is NULL - \param key pointer to the curve25519_key structure in for which to - determine the key size + \param [in] key Pointer to the curve25519_key structure in for which to + determine the key size. _Example_ \code + int keySz; + curve25519_key key; // initialize and make key - int keySz; + keySz = wc_curve25519_size(&key); \endcode diff --git a/doc/dox_comments/header_files/curve448.h b/doc/dox_comments/header_files/curve448.h new file mode 100644 index 000000000..7c1b73b60 --- /dev/null +++ b/doc/dox_comments/header_files/curve448.h @@ -0,0 +1,768 @@ +/*! + \ingroup Curve448 + + \brief This function generates a Curve448 key using the given random + number generator, rng, of the size given (keysize), and stores it in + the given curve448_key structure. It should be called after the key + structure has been initialized through wc_curve448_init(). + + \return 0 Returned on successfully generating the key and and storing + it in the given curve448_key structure. + \return ECC_BAD_ARG_E Returned if the input keysize does not correspond to + the keysize for a curve448 key (56 bytes). + \return RNG_FAILURE_E Returned if the rng internal status is not + DRBG_OK or if there is in generating the next random block with rng. + \return BAD_FUNC_ARG Returned if any of the input parameters passed in + are NULL. + + \param [in] rng Pointer to the RNG object used to generate the ecc key. + \param [in] keysize Size of the key to generate. Must be 56 bytes for + curve448. + \param [in,out] key Pointer to the curve448_key structure in which to + store the generated key. + + _Example_ + \code + int ret; + + curve448_key key; + wc_curve448_init(&key); // initialize key + WC_RNG rng; + wc_InitRng(&rng); // initialize random number generator + + ret = wc_curve448_make_key(&rng, 56, &key); + if (ret != 0) { + // error making Curve448 key + } + \endcode + + \sa wc_curve448_init +*/ +WOLFSSL_API +int wc_curve448_make_key(WC_RNG* rng, int keysize, curve448_key* key); + +/*! + \ingroup Curve448 + + \brief This function computes a shared secret key given a secret private + key and a received public key. It stores the generated secret key in the + buffer out and assigns the variable of the secret key to outlen. Only + supports big endian. + + \return 0 Returned on successfully computing a shared secret key + \return BAD_FUNC_ARG Returned if any of the input parameters passed in + are NULL + + \param [in] private_key Pointer to the curve448_key structure initialized + with the user’s private key. + \param [in] public_key Pointer to the curve448_key structure containing + the received public key. + \param [out] out Pointer to a buffer in which to store the 56 byte computed + secret key. + \param [in,out] outlen Pointer in which to store the length written to the + output buffer. + + _Example_ + \code + int ret; + + byte sharedKey[56]; + word32 keySz; + curve448_key privKey, pubKey; + // initialize both keys + + ret = wc_curve448_shared_secret(&privKey, &pubKey, sharedKey, &keySz); + if (ret != 0) { + // error generating shared key + } + \endcode + + \sa wc_curve448_init + \sa wc_curve448_make_key + \sa wc_curve448_shared_secret_ex +*/ +WOLFSSL_API +int wc_curve448_shared_secret(curve448_key* private_key, + curve448_key* public_key, + byte* out, word32* outlen); + +/*! + \ingroup Curve448 + + \brief This function computes a shared secret key given a secret private + key and a received public key. It stores the generated secret key in the + buffer out and assigns the variable of the secret key to outlen. Supports + both big and little endian. + + \return 0 Returned on successfully computing a shared secret key. + \return BAD_FUNC_ARG Returned if any of the input parameters passed in + are NULL. + + \param [in] private_key Pointer to the curve448_key structure initialized + with the user’s private key. + \param [in] public_key Pointer to the curve448_key structure containing + the received public key. + \param [out] out Pointer to a buffer in which to store the 56 byte computed + secret key. + \param [in,out] outlen Pointer in which to store the length written to the + output buffer. + \param [in] endian EC448_BIG_ENDIAN or EC448_LITTLE_ENDIAN to set which + form to use. + + _Example_ + \code + int ret; + + byte sharedKey[56]; + word32 keySz; + + curve448_key privKey, pubKey; + // initialize both keys + + ret = wc_curve448_shared_secret_ex(&privKey, &pubKey, sharedKey, &keySz, + EC448_BIG_ENDIAN); + if (ret != 0) { + // error generating shared key + } + \endcode + + \sa wc_curve448_init + \sa wc_curve448_make_key + \sa wc_curve448_shared_secret +*/ +WOLFSSL_API +int wc_curve448_shared_secret_ex(curve448_key* private_key, + curve448_key* public_key, + byte* out, word32* outlen, int endian); + +/*! + \ingroup Curve448 + + \brief This function initializes a Curve448 key. It should be called + before generating a key for the structure. + + \return 0 Returned on successfully initializing the curve448_key structure. + \return BAD_FUNC_ARG Returned when key is NULL. + + \param [in,out] key Pointer to the curve448_key structure to initialize. + + _Example_ + \code + curve448_key key; + wc_curve448_init(&key); // initialize key + // make key and proceed to encryption + \endcode + + \sa wc_curve448_make_key +*/ +WOLFSSL_API +int wc_curve448_init(curve448_key* key); + +/*! + \ingroup Curve448 + + \brief This function frees a Curve448 object. + + \param [in,out] key Pointer to the key object to free. + + _Example_ + \code + curve448_key privKey; + // initialize key, use it to generate shared secret key + wc_curve448_free(&privKey); + \endcode + + \sa wc_curve448_init + \sa wc_curve448_make_key +*/ +WOLFSSL_API +void wc_curve448_free(curve448_key* key); + +/*! + \ingroup Curve448 + + \brief This function imports a curve448 private key only. (Big endian). + + \return 0 Returned on successfully importing private key. + \return BAD_FUNC_ARG Returns if key or priv is null. + \return ECC_BAD_ARG_E Returns if privSz is not equal to CURVE448_KEY_SIZE. + + \param [in] priv Pointer to a buffer containing the private key to import. + \param [in] privSz Length of the private key to import. + \param [in,out] key Pointer to the structure in which to store the imported + key. + + _Example_ + \code + int ret; + + byte priv[] = { Contents of private key }; + curve448_key key; + wc_curve448_init(&key); + + ret = wc_curve448_import_private(priv, sizeof(priv), &key); + if (ret != 0) { + // error importing key + } + \endcode + + \sa wc_curve448_import_private_ex + \sa wc_curve448_size +*/ +WOLFSSL_API +int wc_curve448_import_private(const byte* priv, word32 privSz, + curve448_key* key); + +/*! + \ingroup Curve448 + + \brief curve448 private key import only. (Big or Little endian). + + \return 0 Returned on successfully importing private key. + \return BAD_FUNC_ARG Returns if key or priv is null. + \return ECC_BAD_ARG_E Returns if privSz is not equal to CURVE448_KEY_SIZE. + + \param [in] priv Pointer to a buffer containing the private key to import. + \param [in] privSz Length of the private key to import. + \param [in,out] key Pointer to the structure in which to store the imported + key. + \param [in] endian EC448_BIG_ENDIAN or EC448_LITTLE_ENDIAN to + set which form to use. + + _Example_ + \code + int ret; + + byte priv[] = { // Contents of private key }; + curve448_key key; + wc_curve448_init(&key); + + ret = wc_curve448_import_private_ex(priv, sizeof(priv), &key, + EC448_BIG_ENDIAN); + if (ret != 0) { + // error importing key + } + + \endcode + + \sa wc_curve448_import_private + \sa wc_curve448_size +*/ +WOLFSSL_API +int wc_curve448_import_private_ex(const byte* priv, word32 privSz, + curve448_key* key, int endian); + +/*! + \ingroup Curve448 + + \brief This function imports a public-private key pair into a + curve448_key structure. Big endian only. + + \return 0 Returned on importing into the curve448_key structure. + \return BAD_FUNC_ARG Returns if any of the input parameters are null. + \return ECC_BAD_ARG_E Returned if the input key’s key size does not match + the public or private key sizes. + + \param [in] priv Pointer to a buffer containing the private key to import. + \param [in] privSz Length of the private key to import. + \param [in] pub Pointer to a buffer containing the public key to import. + \param [in] pubSz Length of the public key to import. + \param [in,out] key Pointer to the structure in which to store the imported + keys + + _Example_ + \code + int ret; + + byte priv[56]; + byte pub[56]; + // initialize with public and private keys + curve448_key key; + + wc_curve448_init(&key); + // initialize key + + ret = wc_curve448_import_private_raw(&priv, sizeof(priv), pub, sizeof(pub), + &key); + if (ret != 0) { + // error importing keys + } + \endcode + + \sa wc_curve448_init + \sa wc_curve448_make_key + \sa wc_curve448_import_public + \sa wc_curve448_export_private_raw +*/ +WOLFSSL_API +int wc_curve448_import_private_raw(const byte* priv, word32 privSz, + const byte* pub, word32 pubSz, curve448_key* key); + +/*! + \ingroup Curve448 + + \brief This function imports a public-private key pair into a curve448_key structure. Supports both big and little endian. + + \return 0 Returned on importing into the curve448_key structure. + \return BAD_FUNC_ARG Returns if any of the input parameters are null. + \return ECC_BAD_ARG_E Returned if the input key’s key size does not match + the public or private key sizes. + + \param [in] priv Pointer to a buffer containing the private key to import. + \param [in] privSz Length of the private key to import. + \param [in] pub Pointer to a buffer containing the public key to import. + \param [in] pubSz Length of the public key to import. + \param [in,out] key Pointer to the structure in which to store the imported + keys. + \param [in] endian EC448_BIG_ENDIAN or EC448_LITTLE_ENDIAN to set + which form to use. + + _Example_ + \code + int ret; + + byte priv[56]; + byte pub[56]; + // initialize with public and private keys + curve448_key key; + + wc_curve448_init(&key); + // initialize key + + ret = wc_curve448_import_private_raw_ex(&priv, sizeof(priv), pub, + sizeof(pub), &key, EC448_BIG_ENDIAN); + if (ret != 0) { + // error importing keys + } + \endcode + + \sa wc_curve448_init + \sa wc_curve448_make_key + \sa wc_curve448_import_public + \sa wc_curve448_export_private_raw + \sa wc_curve448_import_private_raw +*/ +WOLFSSL_API +int wc_curve448_import_private_raw_ex(const byte* priv, word32 privSz, + const byte* pub, word32 pubSz, + curve448_key* key, int endian); + +/*! + \ingroup Curve448 + + \brief This function exports a private key from a curve448_key structure + and stores it in the given out buffer. It also sets outLen to be the size + of the exported key. Big Endian only. + + \return 0 Returned on successfully exporting the private key from the + curve448_key structure. + \return BAD_FUNC_ARG Returned if any input parameters are NULL. + \return ECC_BAD_ARG_E Returned if wc_curve448_size() is not equal to key. + + \param [in] key Pointer to the structure from which to export the key. + \param [out] out Pointer to the buffer in which to store the exported key. + \param [in,out] outLen On in, is the size of the out in bytes. + On out, will store the bytes written to the output buffer. + + _Example_ + \code + int ret; + byte priv[56]; + int privSz; + + curve448_key key; + // initialize and make key + + ret = wc_curve448_export_private_raw(&key, priv, &privSz); + if (ret != 0) { + // error exporting key + } + \endcode + + \sa wc_curve448_init + \sa wc_curve448_make_key + \sa wc_curve448_import_private_raw + \sa wc_curve448_export_private_raw_ex +*/ +WOLFSSL_API +int wc_curve448_export_private_raw(curve448_key* key, byte* out, + word32* outLen); + +/*! + \ingroup Curve448 + + \brief This function exports a private key from a curve448_key structure + and stores it in the given out buffer. It also sets outLen to be the size + of the exported key. Can specify whether it's big or little endian. + + \return 0 Returned on successfully exporting the private key from the + curve448_key structure. + \return BAD_FUNC_ARG Returned if any input parameters are NULL. + \return ECC_BAD_ARG_E Returned if wc_curve448_size() is not equal to key. + + \param [in] key Pointer to the structure from which to export the key. + \param [out] out Pointer to the buffer in which to store the exported key. + \param [in,out] outLen On in, is the size of the out in bytes. + On out, will store the bytes written to the output buffer. + \param [in] endian EC448_BIG_ENDIAN or EC448_LITTLE_ENDIAN to set which + form to use. + + _Example_ + \code + int ret; + + byte priv[56]; + int privSz; + curve448_key key; + // initialize and make key + ret = wc_curve448_export_private_raw_ex(&key, priv, &privSz, + EC448_BIG_ENDIAN); + if (ret != 0) { + // error exporting key + } + \endcode + + \sa wc_curve448_init + \sa wc_curve448_make_key + \sa wc_curve448_import_private_raw + \sa wc_curve448_export_private_raw + \sa wc_curve448_size +*/ +WOLFSSL_API +int wc_curve448_export_private_raw_ex(curve448_key* key, byte* out, + word32* outLen, int endian); + +/*! + \ingroup Curve448 + + \brief This function imports a public key from the given in buffer and + stores it in the curve448_key structure. + + \return 0 Returned on successfully importing the public key into the + curve448_key structure. + \return ECC_BAD_ARG_E Returned if the inLen parameter does not match the key + size of the key structure. + \return BAD_FUNC_ARG Returned if any of the input parameters are NULL. + + \param [in] in Pointer to the buffer containing the public key to import. + \param [in] inLen Length of the public key to import. + \param [in,out] key Pointer to the curve448_key structure in which to store + the key. + + _Example_ + \code + int ret; + + byte pub[56]; + // initialize pub with public key + + curve448_key key; + // initialize key + + ret = wc_curve448_import_public(pub,sizeof(pub), &key); + if (ret != 0) { + // error importing key + } + \endcode + + \sa wc_curve448_init + \sa wc_curve448_export_public + \sa wc_curve448_import_private_raw + \sa wc_curve448_import_public_ex + \sa wc_curve448_check_public + \sa wc_curve448_size +*/ +WOLFSSL_API +int wc_curve448_import_public(const byte* in, word32 inLen, + curve448_key* key); + +/*! + \ingroup Curve448 + + \brief This function imports a public key from the given in buffer and + stores it in the curve448_key structure. + + \return 0 Returned on successfully importing the public key into the + curve448_key structure. + \return ECC_BAD_ARG_E Returned if the inLen parameter does not match the + key size of the key structure. + \return BAD_FUNC_ARG Returned if any of the input parameters are NULL. + + \param [in] in Pointer to the buffer containing the public key to import. + \param [in] inLen Length of the public key to import. + \param [in,out] key Pointer to the curve448_key structure in which to store + the key. + \param [in] endian EC448_BIG_ENDIAN or EC448_LITTLE_ENDIAN to set which + form to use. + + _Example_ + \code + int ret; + + byte pub[56]; + // initialize pub with public key + curve448_key key; + // initialize key + + ret = wc_curve448_import_public_ex(pub, sizeof(pub), &key, + EC448_BIG_ENDIAN); + if (ret != 0) { + // error importing key + } + \endcode + + \sa wc_curve448_init + \sa wc_curve448_export_public + \sa wc_curve448_import_private_raw + \sa wc_curve448_import_public + \sa wc_curve448_check_public + \sa wc_curve448_size +*/ +WOLFSSL_API +int wc_curve448_import_public_ex(const byte* in, word32 inLen, + curve448_key* key, int endian); + +/*! + \ingroup Curve448 + + \brief This function checks that a public key buffer holds a valid + Curve448 key value given the endian ordering. + + \return 0 Returned when the public key value is valid. + \return ECC_BAD_ARG_E Returned if the public key value is not valid. + \return BAD_FUNC_ARG Returned if any of the input parameters are NULL. + + \param [in] pub Pointer to the buffer containing the public key to check. + \param [in] pubLen Length of the public key to check. + \param [in] endian EC448_BIG_ENDIAN or EC448_LITTLE_ENDIAN to set which + form to use. + + _Example_ + \code + int ret; + + byte pub[] = { Contents of public key }; + + ret = wc_curve448_check_public_ex(pub, sizeof(pub), EC448_BIG_ENDIAN); + if (ret != 0) { + // error importing key + } + \endcode + + \sa wc_curve448_init + \sa wc_curve448_import_public + \sa wc_curve448_import_public_ex + \sa wc_curve448_size +*/ +WOLFSSL_API +int wc_curve448_check_public(const byte* pub, word32 pubSz, int endian); + +/*! + \ingroup Curve448 + + \brief This function exports a public key from the given key structure and + stores the result in the out buffer. Big endian only. + + \return 0 Returned on successfully exporting the public key from the + curve448_key structure. + \return ECC_BAD_ARG_E Returned if outLen is less than CURVE448_PUB_KEY_SIZE. + \return BAD_FUNC_ARG Returned if any of the input parameters are NULL. + + \param [in] key Pointer to the curve448_key structure in from which to + export the key. + \param [out] out Pointer to the buffer in which to store the public key. + \param [in,out] outLen On in, is the size of the out in bytes. + On out, will store the bytes written to the output buffer. + + _Example_ + \code + int ret; + + byte pub[56]; + int pubSz; + + curve448_key key; + // initialize and make key + + ret = wc_curve448_export_public(&key, pub, &pubSz); + if (ret != 0) { + // error exporting key + } + \endcode + + \sa wc_curve448_init + \sa wc_curve448_export_private_raw + \sa wc_curve448_import_public +*/ +WOLFSSL_API +int wc_curve448_export_public(curve448_key* key, byte* out, word32* outLen); + +/*! + \ingroup Curve448 + + \brief This function exports a public key from the given key structure and + stores the result in the out buffer. Supports both big and little endian. + + \return 0 Returned on successfully exporting the public key from the + curve448_key structure. + \return ECC_BAD_ARG_E Returned if outLen is less than CURVE448_PUB_KEY_SIZE. + \return BAD_FUNC_ARG Returned if any of the input parameters are NULL. + + \param [in] key Pointer to the curve448_key structure in from which to + export the key. + \param [out] out Pointer to the buffer in which to store the public key. + \param [in,out] outLen On in, is the size of the out in bytes. + On out, will store the bytes written to the output buffer. + \param [in] endian EC448_BIG_ENDIAN or EC448_LITTLE_ENDIAN to set which + form to use. + + _Example_ + \code + int ret; + + byte pub[56]; + int pubSz; + + curve448_key key; + // initialize and make key + + ret = wc_curve448_export_public_ex(&key, pub, &pubSz, EC448_BIG_ENDIAN); + if (ret != 0) { + // error exporting key + } + \endcode + + \sa wc_curve448_init + \sa wc_curve448_export_private_raw + \sa wc_curve448_import_public +*/ +WOLFSSL_API +int wc_curve448_export_public_ex(curve448_key* key, byte* out, + word32* outLen, int endian); + +/*! + \ingroup Curve448 + + \brief This function exports a key pair from the given key structure and + stores the result in the out buffer. Big endian only. + + \return 0 Returned on successfully exporting the key pair from the + curve448_key structure. + \return BAD_FUNC_ARG Returned if any input parameters are NULL. + \return ECC_BAD_ARG_E Returned if privSz is less than CURVE448_KEY_SIZE or + pubSz is less than CURVE448_PUB_KEY_SIZE. + + \param [in] key Pointer to the curve448_key structure in from which to + export the key pair. + \param [out] priv Pointer to the buffer in which to store the private key. + \param [in,out] privSz On in, is the size of the priv buffer in bytes. + On out, will store the bytes written to the priv buffer. + \param [out] pub Pointer to the buffer in which to store the public key. + \param [in,out] pubSz On in, is the size of the pub buffer in bytes. + On out, will store the bytes written to the pub buffer. + + _Example_ + \code + int ret; + + byte pub[56]; + byte priv[56]; + int pubSz; + int privSz; + + curve448_key key; + // initialize and make key + + ret = wc_curve448_export_key_raw(&key, priv, &privSz, pub, &pubSz); + if (ret != 0) { + // error exporting key + } + \endcode + + \sa wc_curve448_export_key_raw_ex + \sa wc_curve448_export_private_raw +*/ +WOLFSSL_API +int wc_curve448_export_key_raw(curve448_key* key, + byte* priv, word32 *privSz, + byte* pub, word32 *pubSz); + +/*! + \ingroup Curve448 + + \brief Export curve448 key pair. Big or little endian. + \brief This function exports a key pair from the given key structure and + stores the result in the out buffer. Big or little endian. + + \return 0 Success + \return BAD_FUNC_ARG Returned if any input parameters are NULL. + \return ECC_BAD_ARG_E Returned if privSz is less than CURVE448_KEY_SIZE or + pubSz is less than CURVE448_PUB_KEY_SIZE. + + \param [in] key Pointer to the curve448_key structure in from which to + export the key pair. + \param [out] priv Pointer to the buffer in which to store the private key. + \param [in,out] privSz On in, is the size of the priv buffer in bytes. + On out, will store the bytes written to the priv buffer. + \param [out] pub Pointer to the buffer in which to store the public key. + \param [in,out] pubSz On in, is the size of the pub buffer in bytes. + On out, will store the bytes written to the pub buffer. + \param [in] endian EC448_BIG_ENDIAN or EC448_LITTLE_ENDIAN to set which + form to use. + + _Example_ + \code + int ret; + + byte pub[56]; + byte priv[56]; + int pubSz; + int privSz; + + curve448_key key; + // initialize and make key + + ret = wc_curve448_export_key_raw_ex(&key,priv, &privSz, pub, &pubSz, + EC448_BIG_ENDIAN); + if (ret != 0) { + // error exporting key + } + \endcode + + \sa wc_curve448_export_key_raw + \sa wc_curve448_export_private_raw_ex + \sa wc_curve448_export_public_ex +*/ +WOLFSSL_API +int wc_curve448_export_key_raw_ex(curve448_key* key, + byte* priv, word32 *privSz, + byte* pub, word32 *pubSz, + int endian); + +/*! + \ingroup Curve448 + + \brief This function returns the key size of the given key structure. + + \return Success Given a valid, initialized curve448_key structure, + returns the size of the key. + \return 0 Returned if key is NULL. + + \param [in] key Pointer to the curve448_key structure in for which to + determine the key size. + + _Example_ + \code + int keySz; + + curve448_key key; + // initialize and make key + + keySz = wc_curve448_size(&key); + \endcode + + \sa wc_curve448_init + \sa wc_curve448_make_key +*/ +WOLFSSL_API +int wc_curve448_size(curve448_key* key); diff --git a/doc/dox_comments/header_files/doxygen_groups.h b/doc/dox_comments/header_files/doxygen_groups.h index 86e225298..cdb5a2a11 100644 --- a/doc/dox_comments/header_files/doxygen_groups.h +++ b/doc/dox_comments/header_files/doxygen_groups.h @@ -7,10 +7,12 @@ \defgroup ChaCha Algorithms - ChaCha \defgroup ChaCha20Poly1305 Algorithms - ChaCha20_Poly1305 \defgroup Curve25519 Algorithms - Curve25519 + \defgroup Curve448 Algorithms - Curve448 \defgroup DSA Algorithms - DSA \defgroup Diffie-Hellman Algorithms - Diffie-Hellman \defgroup ECC Algorithms - ECC \defgroup ED25519 Algorithms - ED25519 + \defgroup ED448 Algorithms - ED448 \defgroup HC128 Algorithms - HC-128 \defgroup HMAC Algorithms - HMAC \defgroup IDEA Algorithms - IDEA diff --git a/doc/dox_comments/header_files/doxygen_pages.h b/doc/dox_comments/header_files/doxygen_pages.h index 741b396bf..015c73a3f 100644 --- a/doc/dox_comments/header_files/doxygen_pages.h +++ b/doc/dox_comments/header_files/doxygen_pages.h @@ -33,10 +33,12 @@
  • \ref ChaCha
  • \ref ChaCha20Poly1305
  • \ref Curve25519
  • +
  • \ref Curve448
  • \ref DSA
  • \ref Diffie-Hellman
  • \ref ECC
  • \ref ED25519
  • +
  • \ref ED448
  • \ref HC128
  • \ref HMAC
  • \ref IDEA
  • diff --git a/doc/dox_comments/header_files/ed25519.h b/doc/dox_comments/header_files/ed25519.h index 73f036232..d6476433f 100644 --- a/doc/dox_comments/header_files/ed25519.h +++ b/doc/dox_comments/header_files/ed25519.h @@ -1,26 +1,77 @@ /*! \ingroup ED25519 - \brief This function generates a new ed25519_key and stores it in key. + \brief This function generates the Ed25519 public key from the private key. + It stores the public key in the buffer pubKey, and sets the bytes + written to this buffer in pubKeySz. - \return 0 Returned upon successfully making an ed25519_key - \return BAD_FUNC_ARG Returned if rng or key evaluate to NULL, or if the - specified key size is not 32 bytes (ed25519 has 32 byte keys) + \return 0 Returned upon successfully making the public key. + \return BAD_FUNC_ARG Returned ifi key or pubKey evaluate to NULL, or if the + specified key size is not 32 bytes (Ed25519 has 32 byte keys). \return MEMORY_E Returned if there is an error allocating memory - during function execution + during function execution. - \param rng pointer to an initialized RNG object with which to - generate the key - \param keysize length of key to generate. Should always be 32 for ed25519 - \param key pointer to the ed25519_key for which to generate a key + \param [in] key Pointer to the ed25519_key for which to generate a key. + \param [out] out Pointer to the buffer in which to store the public key. + \param [in,out] outLen Pointer to a word32 object with the size available + in out. Set with the number of bytes written to out after successfully + exporting the public key. _Example_ \code + int ret; + ed25519_key key; + byte priv[] = { initialize with 32 byte private key }; + byte pub[32]; + word32 pubSz = sizeof(pub); + wc_ed25519_init(&key); + wc_ed25519_import_private_only(priv, sizeof(priv), &key); + ret = wc_ed25519_make_public(&key, pub, &pubSz); + if (ret != 0) { + // error making public key + } + \endcode + + \sa wc_ed25519_init + \sa wc_ed25519_import_private_only + \sa wc_ed25519_make_key +*/ +WOLFSSL_API +int wc_ed25519_make_public(ed25519_key* key, unsigned char* pubKey, + word32 pubKeySz); + +/*! + \ingroup ED25519 + + \brief This function generates a new Ed25519 key and stores it in key. + + \return 0 Returned upon successfully making an ed25519_key. + \return BAD_FUNC_ARG Returned if rng or key evaluate to NULL, or if the + specified key size is not 32 bytes (Ed25519 has 32 byte keys). + \return MEMORY_E Returned if there is an error allocating memory + during function execution. + + \param [in] rng Pointer to an initialized RNG object with which to + generate the key. + \param [in] keysize Length of key to generate. Should always be 32 for + Ed25519. + \param [in,out] key Pointer to the ed25519_key for which to generate a key. + + _Example_ + \code + int ret; + WC_RNG rng; + ed25519_key key; + wc_InitRng(&rng); - wc_ed25519_make_key(&rng, 32, &key); // initialize 32 byte ed25519 key + wc_ed25519_init(&key); + wc_ed25519_make_key(&rng, 32, &key); + if (ret != 0) { + // error making key + } \endcode \sa wc_ed25519_init @@ -31,23 +82,23 @@ int wc_ed25519_make_key(WC_RNG* rng, int keysize, ed25519_key* key); /*! \ingroup ED25519 - \brief This function signs a message digest using an ed25519_key object + \brief This function signs a message using an ed25519_key object to guarantee authenticity. \return 0 Returned upon successfully generating a signature for the - message digest - \return BAD_FUNC_ARG Returned any of the input parameters evaluate to - NULL, or if the output buffer is too small to store the generated signature + message. + \return BAD_FUNC_ARG Returned if any of the input parameters evaluate to + NULL, or if the output buffer is too small to store the generated signature. \return MEMORY_E Returned if there is an error allocating memory during - function execution + function execution. - \param in pointer to the buffer containing the message to sign - \param inlen length of the message to sign - \param out buffer in which to store the generated signature - \param outlen max length of the output buffer. Will store the bytes - written to out upon successfully generating a message signature - \param key pointer to a private ed25519_key with which to generate the - signature + \param [in] in Pointer to the buffer containing the message to sign. + \param [in] inlen Length of the message to sign. + \param [out] out Buffer in which to store the generated signature. + \param [in,out] outlen Maximum length of the output buffer. Will store the + bytes written to out upon successfully generating a message signature. + \param [in] key Pointer to a private ed25519_key with which to generate the + signature. _Example_ \code @@ -57,17 +108,20 @@ int wc_ed25519_make_key(WC_RNG* rng, int keysize, ed25519_key* key); byte sig[64]; // will hold generated signature sigSz = sizeof(sig); - byte message[] = { // initialize with message }; + byte message[] = { initialize with message }; wc_InitRng(&rng); // initialize rng wc_ed25519_init(&key); // initialize key wc_ed25519_make_key(&rng, 32, &key); // make public/private key pair ret = wc_ed25519_sign_msg(message, sizeof(message), sig, &sigSz, &key); - if ( ret != 0 ) { - // error generating message signature + if (ret != 0) { + // error generating message signature } \endcode + \sa wc_ed25519ctx_sign_msg + \sa wc_ed25519ph_sign_hash + \sa wc_ed25519ph_sign_msg \sa wc_ed25519_verify_msg */ WOLFSSL_API @@ -77,50 +131,390 @@ int wc_ed25519_sign_msg(const byte* in, word32 inlen, byte* out, /*! \ingroup ED25519 - \brief This function verifies the ed25519 signature of a message to ensure - authenticity. It returns the answer through stat, with 1 corresponding to + \brief This function signs a message using an ed25519_key object + to guarantee authenticity. The context is part of the data signed. + + \return 0 Returned upon successfully generating a signature for the + message. + \return BAD_FUNC_ARG Returned any of the input parameters evaluate to + NULL, or if the output buffer is too small to store the generated signature. + \return MEMORY_E Returned if there is an error allocating memory during + function execution. + + \param [in] in Pointer to the buffer containing the message to sign. + \param [in] inlen Length of the message to sign. + \param [out] out Buffer in which to store the generated signature. + \param [in,out] outlen Maximum length of the output buffer. Will store the + bytes written to out upon successfully generating a message signature. + \param [in] key Pointer to a private ed25519_key with which to generate the + signature. + \param [in] context Pointer to the buffer containing the context for which + message is being signed. + \param [in] contextLen Length of the context buffer. + + _Example_ + \code + ed25519_key key; + WC_RNG rng; + int ret, sigSz; + + byte sig[64]; // will hold generated signature + sigSz = sizeof(sig); + byte message[] = { initialize with message }; + byte context[] = { initialize with context of signing }; + + wc_InitRng(&rng); // initialize rng + wc_ed25519_init(&key); // initialize key + wc_ed25519_make_key(&rng, 32, &key); // make public/private key pair + ret = wc_ed25519ctx_sign_msg(message, sizeof(message), sig, &sigSz, &key, + context, sizeof(context)); + if (ret != 0) { + // error generating message signature + } + \endcode + + \sa wc_ed25519_sign_msg + \sa wc_ed25519ph_sign_hash + \sa wc_ed25519ph_sign_msg + \sa wc_ed25519_verify_msg +*/ +WOLFSSL_API +int wc_ed25519ctx_sign_msg(const byte* in, word32 inlen, byte* out, + word32 *outlen, ed25519_key* key, + const byte* context, byte contextLen); + +/*! + \ingroup ED25519 + + \brief This function signs a message digest using an ed25519_key object + to guarantee authenticity. The context is included as part of the data + signed. The message is pre-hashed before signature calculation. The hash + algorithm used to create message digest must be SHAKE-256. + + \return 0 Returned upon successfully generating a signature for the + message digest. + \return BAD_FUNC_ARG Returned any of the input parameters evaluate to + NULL, or if the output buffer is too small to store the generated signature. + \return MEMORY_E Returned if there is an error allocating memory during + function execution. + + \param [in] hash Pointer to the buffer containing the hash of the message + to sign. + \param [in] hashLen Length of the hash of the message to sign. + \param [out] out Buffer in which to store the generated signature. + \param [in,out] outlen Maximum length of the output buffer. Will store the + bytes written to out upon successfully generating a message signature. + \param [in] key Pointer to a private ed25519_key with which to generate the + signature. + \param [in] context Pointer to the buffer containing the context for which + message is being signed. + \param [in] contextLen Length of the context buffer. + + _Example_ + \code + ed25519_key key; + WC_RNG rng; + int ret, sigSz; + + byte sig[64]; // will hold generated signature + sigSz = sizeof(sig); + byte hash[] = { initialize with SHA-512 hash of message }; + byte context[] = { initialize with context of signing }; + + wc_InitRng(&rng); // initialize rng + wc_ed25519_init(&key); // initialize key + wc_ed25519_make_key(&rng, 32, &key); // make public/private key pair + ret = wc_ed25519ph_sign_hash(hash, sizeof(hash), sig, &sigSz, &key, + context, sizeof(context)); + if (ret != 0) { + // error generating message signature + } + \endcode + + \sa wc_ed25519_sign_msg + \sa wc_ed25519ctx_sign_msg + \sa wc_ed25519ph_sign_msg + \sa wc_ed25519_verify_msg +*/ +WOLFSSL_API +int wc_ed25519ph_sign_hash(const byte* hash, word32 hashLen, byte* out, + word32 *outLen, ed25519_key* key, + const byte* context, byte contextLen); + +/*! + \ingroup ED25519 + + \brief This function signs a message using an ed25519_key object + to guarantee authenticity. The context is included as part of the data + signed. The message is pre-hashed before signature calculation. + + \return 0 Returned upon successfully generating a signature for the + message. + \return BAD_FUNC_ARG Returned any of the input parameters evaluate to + NULL, or if the output buffer is too small to store the generated signature. + \return MEMORY_E Returned if there is an error allocating memory during + function execution. + + \param [in] in Pointer to the buffer containing the message to sign. + \param [in] inlen Length of the message to sign. + \param [out] out Buffer in which to store the generated signature. + \param [in,out] outlen Maximum length of the output buffer. Will store the + bytes written to out upon successfully generating a message signature. + \param [in] key Pointer to a private ed25519_key with which to generate the + signature. + \param [in] context Pointer to the buffer containing the context for which + message is being signed. + \param [in] contextLen Length of the context buffer. + + _Example_ + \code + ed25519_key key; + WC_RNG rng; + int ret, sigSz; + + byte sig[64]; // will hold generated signature + sigSz = sizeof(sig); + byte message[] = { initialize with message }; + byte context[] = { initialize with context of signing }; + + wc_InitRng(&rng); // initialize rng + wc_ed25519_init(&key); // initialize key + wc_ed25519_make_key(&rng, 32, &key); // make public/private key pair + ret = wc_ed25519ph_sign_msg(message, sizeof(message), sig, &sigSz, &key, + context, sizeof(context)); + if (ret != 0) { + // error generating message signature + } + \endcode + + \sa wc_ed25519_sign_msg + \sa wc_ed25519ctx_sign_msg + \sa wc_ed25519ph_sign_hash + \sa wc_ed25519_verify_msg +*/ +WOLFSSL_API +int wc_ed25519ph_sign_msg(const byte* in, word32 inlen, byte* out, + word32 *outlen, ed25519_key* key, + const byte* context, byte contextLen); + +/*! + \ingroup ED25519 + + \brief This function verifies the Ed25519 signature of a message to ensure + authenticity. It returns the answer through res, with 1 corresponding to a valid signature, and 0 corresponding to an invalid signature. \return 0 Returned upon successfully performing the signature - verification. Note: This does not mean that the signature is verified. - The authenticity information is stored instead in stat + verification and authentication. \return BAD_FUNC_ARG Returned if any of the input parameters evaluate to - NULL, or if the siglen does not match the actual length of a signature - \return 1 Returned if verification completes, but the signature generated - does not match the signature provided + NULL, or if the siglen does not match the actual length of a signature. + \return SIG_VERIFY_E Returned if verification completes, but the signature + generated does not match the signature provided. - \param sig pointer to the buffer containing the signature to verify - \param siglen length of the signature to verify - \param msg pointer to the buffer containing the message to verify - \param msglen length of the message to verify - \param stat pointer to the result of the verification. 1 indicates the - message was successfully verified - \param key pointer to a public ed25519 key with which to verify the - signature + \param [in] sig Pointer to the buffer containing the signature to verify. + \param [in] siglen Length of the signature to verify. + \param [in] msg Pointer to the buffer containing the message to verify. + \param [in] msgLen Length of the message to verify. + \param [out] res Pointer to the result of the verification. 1 indicates the + message was successfully verified. + \param [in] key Pointer to a public Ed25519 key with which to verify the + signature. _Example_ \code ed25519_key key; int ret, verified = 0; - byte sig[] { // initialize with received signature }; - byte msg[] = { // initialize with message }; + byte sig[] { initialize with received signature }; + byte msg[] = { initialize with message }; // initialize key with received public key - ret = wc_ed25519_verify_msg(sig, sizeof(sig), msg, sizeof(msg), - &verified, &key); - - if ( return < 0 ) { - // error performing verification - } else if ( verified == 0 ) - // the signature is invalid + ret = wc_ed25519_verify_msg(sig, sizeof(sig), msg, sizeof(msg), &verified, + &key); + if (ret < 0) { + // error performing verification + } else if (verified == 0) + // the signature is invalid } \endcode + \sa wc_ed25519ctx_verify_msg + \sa wc_ed25519ph_verify_hash + \sa wc_ed25519ph_verify_msg \sa wc_ed25519_sign_msg */ WOLFSSL_API int wc_ed25519_verify_msg(const byte* sig, word32 siglen, const byte* msg, - word32 msglen, int* stat, ed25519_key* key); + word32 msgLen, int* ret, ed25519_key* key); + +/*! + \ingroup ED25519 + + \brief This function verifies the Ed25519 signature of a message to ensure + authenticity. The context is included as part of the data + verified. It returns the answer through res, with 1 corresponding to + a valid signature, and 0 corresponding to an invalid signature. + + \return 0 Returned upon successfully performing the signature + verification and authentication. + \return BAD_FUNC_ARG Returned if any of the input parameters evaluate to + NULL, or if the siglen does not match the actual length of a signature. + \return SIG_VERIFY_E Returned if verification completes, but the signature + generated does not match the signature provided. + + \param [in] sig Pointer to the buffer containing the signature to verify. + \param [in] siglen Length of the signature to verify. + \param [in] msg Pointer to the buffer containing the message to verify. + \param [in] msgLen Length of the message to verify. + \param [out] res Pointer to the result of the verification. 1 indicates the + message was successfully verified. + \param [in] key Pointer to a public Ed25519 key with which to verify the + signature. + \param [in] context Pointer to the buffer containing the context for which + the message was signed. + \param [in] contextLen Length of the context buffer. + + _Example_ + \code + ed25519_key key; + int ret, verified = 0; + + byte sig[] { initialize with received signature }; + byte msg[] = { initialize with message }; + byte context[] = { initialize with context of signature }; + // initialize key with received public key + ret = wc_ed25519ctx_verify_msg(sig, sizeof(sig), msg, sizeof(msg), + &verified, &key, ); + if (ret < 0) { + // error performing verification + } else if (verified == 0) + // the signature is invalid + } + \endcode + + \sa wc_ed25519_verify_msg + \sa wc_ed25519ph_verify_hash + \sa wc_ed25519ph_verify_msg + \sa wc_ed25519_sign_msg +*/ +WOLFSSL_API +int wc_ed25519ctx_verify_msg(const byte* sig, word32 siglen, const byte* msg, + word32 msgLen, int* ret, ed25519_key* key, + const byte* context, byte contextLen); + +/*! + \ingroup ED25519 + + \brief This function verifies the Ed25519 signature of the digest of a + message to ensure authenticity. The context is included as part of the data + verified. The hash is the pre-hashed message before signature calculation. + The hash algorithm used to create message digest must be SHA-512. + The answer is returned through res, with 1 corresponding to a valid + signature, and 0 corresponding to an invalid signature. + + + \return 0 Returned upon successfully performing the signature + verification and authentication. + \return BAD_FUNC_ARG Returned if any of the input parameters evaluate to + NULL, or if the siglen does not match the actual length of a signature. + \return SIG_VERIFY_E Returned if verification completes, but the signature + generated does not match the signature provided. + + \param [in] sig Pointer to the buffer containing the signature to verify. + \param [in] siglen Length of the signature to verify. + \param [in] hash Pointer to the buffer containing the hash of the message + to verify. + \param [in] hashLen Length of the hash to verify. + \param [out] res Pointer to the result of the verification. 1 indicates the + message was successfully verified. + \param [in] key Pointer to a public Ed25519 key with which to verify the + signature. + \param [in] context Pointer to the buffer containing the context for which + the message was signed. + \param [in] contextLen Length of the context buffer. + + _Example_ + \code + ed25519_key key; + int ret, verified = 0; + + byte sig[] { initialize with received signature }; + byte hash[] = { initialize with SHA-512 hash of message }; + byte context[] = { initialize with context of signature }; + // initialize key with received public key + ret = wc_ed25519ph_verify_hash(sig, sizeof(sig), msg, sizeof(msg), + &verified, &key, ); + if (ret < 0) { + // error performing verification + } else if (verified == 0) + // the signature is invalid + } + \endcode + + \sa wc_ed25519_verify_msg + \sa wc_ed25519ctx_verify_msg + \sa wc_ed25519ph_verify_msg + \sa wc_ed25519_sign_msg +*/ +WOLFSSL_API +int wc_ed25519ph_verify_hash(const byte* sig, word32 siglen, const byte* hash, + word32 hashLen, int* ret, ed25519_key* key, + const byte* context, byte contextLen); + +/*! + \ingroup ED25519 + + \brief This function verifies the Ed25519 signature of a message to ensure + authenticity. The context is included as part of the data + verified. The message is pre-hashed before verification. It returns the + answer through res, with 1 corresponding to a valid signature, and 0 + corresponding to an invalid signature. + + \return 0 Returned upon successfully performing the signature + verification and authentication. + \return BAD_FUNC_ARG Returned if any of the input parameters evaluate to + NULL, or if the siglen does not match the actual length of a signature. + \return SIG_VERIFY_E Returned if verification completes, but the signature + generated does not match the signature provided. + + \param [in] sig Pointer to the buffer containing the signature to verify. + \param [in] siglen Length of the signature to verify. + \param [in] msg Pointer to the buffer containing the message to verify. + \param [in] msgLen Length of the message to verify. + \param [out] res Pointer to the result of the verification. 1 indicates the + message was successfully verified. + \param [in] key Pointer to a public Ed25519 key with which to verify the + signature. + \param [in] context Pointer to the buffer containing the context for which + the message was signed. + \param [in] contextLen Length of the context buffer. + + _Example_ + \code + ed25519_key key; + int ret, verified = 0; + + byte sig[] { initialize with received signature }; + byte msg[] = { initialize with message }; + byte context[] = { initialize with context of signature }; + // initialize key with received public key + ret = wc_ed25519ctx_verify_msg(sig, sizeof(sig), msg, sizeof(msg), + &verified, &key, ); + if (ret < 0) { + // error performing verification + } else if (verified == 0) + // the signature is invalid + } + \endcode + + \sa wc_ed25519_verify_msg + \sa wc_ed25519ph_verify_hash + \sa wc_ed25519ph_verify_msg + \sa wc_ed25519_sign_msg +*/ +WOLFSSL_API +int wc_ed25519ph_verify_msg(const byte* sig, word32 siglen, const byte* msg, + word32 msgLen, int* ret, ed25519_key* key, + const byte* context, byte contextLen); /*! \ingroup ED25519 @@ -128,10 +522,10 @@ int wc_ed25519_verify_msg(const byte* sig, word32 siglen, const byte* msg, \brief This function initializes an ed25519_key object for future use with message verification. - \return 0 Returned upon successfully initializing the ed25519_key object - \return BAD_FUNC_ARG Returned if key is NULL + \return 0 Returned upon successfully initializing the ed25519_key object. + \return BAD_FUNC_ARG Returned if key is NULL. - \param key pointer to the ed25519_key object to initialize + \param [in,out] key Pointer to the ed25519_key object to initialize. _Example_ \code @@ -148,11 +542,9 @@ int wc_ed25519_init(ed25519_key* key); /*! \ingroup ED25519 - \brief This function frees an ed25519 object after it has been used. + \brief This function frees an Ed25519 object after it has been used. - \return none No returns. - - \param key pointer to the ed25519_key object to free + \param [in,out] key Pointer to the ed25519_key object to free _Example_ \code @@ -174,25 +566,25 @@ void wc_ed25519_free(ed25519_key* key); containing the public key. This function will handle both compressed and uncompressed keys. - \return 0 Returned on successfully importing the ed25519_key + \return 0 Returned on successfully importing the ed25519_key. \return BAD_FUNC_ARG Returned if in or key evaluate to NULL, or inLen is - less than the size of an ed25519 key + less than the size of an Ed25519 key. - \param in pointer to the buffer containing the public key - \param inLen length of the buffer containing the public key - \param key pointer to the ed25519_key object in which to store the - public key + \param [in] in Pointer to the buffer containing the public key. + \param [in] inLen Length of the buffer containing the public key. + \param [in,out] key Pointer to the ed25519_key object in which to store the + public key. _Example_ \code int ret; - byte pub[] = { // initialize ed25519 public key }; + byte pub[] = { initialize Ed25519 public key }; ed_25519 key; wc_ed25519_init_key(&key); ret = wc_ed25519_import_public(pub, sizeof(pub), &key); - if ( ret != 0) { - // error importing key + if (ret != 0) { + // error importing key } \endcode @@ -205,40 +597,80 @@ int wc_ed25519_import_public(const byte* in, word32 inLen, ed25519_key* key); /*! \ingroup ED25519 - \brief This function imports a public/private ed25519 key pair from a - pair of buffers. This function will handle both compressed and - uncompressed keys. + \brief This function imports an Ed25519 private key only from a + buffer. - \return 0 Returned on successfully importing the ed25519_key + \return 0 Returned on successfully importing the Ed25519 key. \return BAD_FUNC_ARG Returned if in or key evaluate to NULL, or if - either privSz or pubSz are less than the size of an ed25519 key + privSz is less than ED25519_KEY_SIZE. - \param priv pointer to the buffer containing the private key - \param privSz size of the private key - \param pub pointer to the buffer containing the public key - \param pubSz length of the public key - \param key pointer to the ed25519_key object in which to store the - imported private/public key pair + \param [in] priv Pointer to the buffer containing the private key. + \param [in] privSz Length of the private key. + \param [in] pub Pointer to the buffer containing the public key. + \param [in] pubSz Length of the public key. + \param [in,out] key Pointer to the ed25519_key object in which to store the + imported private key. _Example_ \code int ret; - byte priv[] = { // initialize with 32 byte private key }; - byte pub[] = { // initialize with the corresponding public key }; + byte priv[] = { initialize with 32 byte private key }; ed25519_key key; wc_ed25519_init_key(&key); - ret = wc_ed25519_import_private_key(priv, sizeof(priv), pub, - sizeof(pub), &key); - if ( ret != 0) { - // error importing key + ret = wc_ed25519_import_private_key(priv, sizeof(priv), &key); + if (ret != 0) { + // error importing private key } \endcode - \sa wc_ed25519_import_public_key + \sa wc_ed25519_import_public + \sa wc_ed25519_import_private_key \sa wc_ed25519_export_private_only */ WOLFSSL_API +int wc_ed25519_import_private_only(const byte* priv, word32 privSz, + ed25519_key* key); + +/*! + \ingroup ED25519 + + \brief This function imports a public/private Ed25519 key pair from a + pair of buffers. This function will handle both compressed and + uncompressed keys. + + \return 0 Returned on successfully importing the ed25519_key. + \return BAD_FUNC_ARG Returned if in or key evaluate to NULL, or if + either privSz is less than ED25519_KEY_SIZE or pubSz is less than + ED25519_PUB_KEY_SIZE. + + \param [in] priv Pointer to the buffer containing the private key. + \param [in] privSz Length of the private key. + \param [in] pub Pointer to the buffer containing the public key. + \param [in] pubSz Length of the public key. + \param [in,out] key Pointer to the ed25519_key object in which to store the + imported private/public key pair. + + _Example_ + \code + int ret; + byte priv[] = { initialize with 32 byte private key }; + byte pub[] = { initialize with the corresponding public key }; + + ed25519_key key; + wc_ed25519_init_key(&key); + ret = wc_ed25519_import_private_key(priv, sizeof(priv), pub, sizeof(pub), + &key); + if (ret != 0) { + // error importing key + } + \endcode + + \sa wc_ed25519_import_public + \sa wc_ed25519_import_private_only + \sa wc_ed25519_export_private +*/ +WOLFSSL_API int wc_ed25519_import_private_key(const byte* priv, word32 privSz, const byte* pub, word32 pubSz, ed25519_key* key); @@ -249,18 +681,18 @@ int wc_ed25519_import_private_key(const byte* priv, word32 privSz, structure. It stores the public key in the buffer out, and sets the bytes written to this buffer in outLen. - \return 0 Returned upon successfully exporting the public key - \return BAD_FUNC_ARG Returned if any of the input values evaluate to NULL + \return 0 Returned upon successfully exporting the public key. + \return BAD_FUNC_ARG Returned if any of the input values evaluate to NULL. \return BUFFER_E Returned if the buffer provided is not large enough to store the private key. Upon returning this error, the function sets the - size required in outLen + size required in outLen. - \param key pointer to an ed25519_key structure from which to export the - public key - \param out pointer to the buffer in which to store the public key - \param outLen pointer to a word32 object with the size available in out. - Set with the number of bytes written to out after successfully exporting - the private key + \param [in] key Pointer to an ed25519_key structure from which to export the + public key. + \param [out] out Pointer to the buffer in which to store the public key. + \param [in,out] outLen Pointer to a word32 object with the size available + in out. Set with the number of bytes written to out after successfully + exporting the public key. _Example_ \code @@ -272,12 +704,12 @@ int wc_ed25519_import_private_key(const byte* priv, word32 privSz, word32 pubSz = sizeof(pub); ret = wc_ed25519_export_public(&key, pub, &pubSz); - if ( ret != 0) { - // error exporting public key + if (ret != 0) { + // error exporting public key } \endcode - \sa wc_ed25519_import_public_key + \sa wc_ed25519_import_public \sa wc_ed25519_export_private_only */ WOLFSSL_API @@ -290,17 +722,17 @@ int wc_ed25519_export_public(ed25519_key*, byte* out, word32* outLen); structure. It stores the private key in the buffer out, and sets the bytes written to this buffer in outLen. - \return 0 Returned upon successfully exporting the private key - \return ECC_BAD_ARG_E Returned if any of the input values evaluate to NULL + \return 0 Returned upon successfully exporting the private key. + \return ECC_BAD_ARG_E Returned if any of the input values evaluate to NULL. \return BUFFER_E Returned if the buffer provided is not large enough - to store the private key + to store the private key. - \param key pointer to an ed25519_key structure from which to export - the private key - \param out pointer to the buffer in which to store the private key - \param outLen pointer to a word32 object with the size available in + \param [in] key Pointer to an ed25519_key structure from which to export + the private key. + \param [out] out Pointer to the buffer in which to store the private key. + \param [in,out] outLen Pointer to a word32 object with the size available in out. Set with the number of bytes written to out after successfully - exporting the private key + exporting the private key. _Example_ \code @@ -311,8 +743,8 @@ int wc_ed25519_export_public(ed25519_key*, byte* out, word32* outLen); char priv[32]; // 32 bytes because only private key word32 privSz = sizeof(priv); ret = wc_ed25519_export_private_only(&key, priv, &privSz); - if ( ret != 0) { - // error exporting private key + if (ret != 0) { + // error exporting private key } \endcode @@ -325,16 +757,21 @@ int wc_ed25519_export_private_only(ed25519_key* key, byte* out, word32* outLen); /*! \ingroup ED25519 - \brief Export the private key, including public part. + \brief This function exports the key pair from an ed25519_key + structure. It stores the key pair in the buffer out, and sets + the bytes written to this buffer in outLen. - \return 0 Success - \return BAD_FUNC_ARG Returns if any argument is null. - \return BUFFER_E Returns if outLen is less than ED25519_PRV_KEY_SIZE + \return 0 Returned upon successfully exporting the key pair. + \return ECC_BAD_ARG_E Returned if any of the input values evaluate to NULL. + \return BUFFER_E Returned if the buffer provided is not large enough + to store the key pair. - \param key ed25519_key struct to export from. - \param out Destination for private key. - \param outLen Max length of output, set to the length of the exported - private key. + \param [in] key Pointer to an ed25519_key structure from which to export + the key pair. + \param [out] out Pointer to the buffer in which to store the key pair. + \param [in,out] outLen Pointer to a word32 object with the size available in + out. Set with the number of bytes written to out after successfully + exporting the key pair. _Example_ \code @@ -344,18 +781,18 @@ int wc_ed25519_export_private_only(ed25519_key* key, byte* out, word32* outLen); WC_RNG rng; wc_InitRng(&rng); - wc_ed25519_make_key(&rng, 32, &key); // initialize 32 byte ed25519 key + wc_ed25519_make_key(&rng, 32, &key); // initialize 32 byte Ed25519 key - byte out[32]; // out needs to be a sufficient buffer size + byte out[64]; // out needs to be a sufficient buffer size word32 outLen = sizeof(out); int key_size = wc_ed25519_export_private(&key, out, &outLen); - if(key_size == BUFFER_E) - { + if (key_size == BUFFER_E) { // Check size of out compared to outLen to see if function reset outLen } \endcode - \sa none + \sa wc_ed25519_import_private_key + \sa wc_ed25519_export_private_only */ WOLFSSL_API int wc_ed25519_export_private(ed25519_key* key, byte* out, word32* outLen); @@ -363,18 +800,26 @@ int wc_ed25519_export_private(ed25519_key* key, byte* out, word32* outLen); /*! \ingroup ED25519 - \brief Export full private key and public key. + \brief This function exports the private and public key separately from an + ed25519_key structure. It stores the private key in the buffer priv, and + sets the bytes written to this buffer in privSz. It stores the public key + in the buffer pub, and sets the bytes written to this buffer in pubSz. - \return 0 Success - \return BAD_FUNC_ARG: Returns if any argument is null. - \return BUFFER_E: Returns if outLen is less than ED25519_PRV_KEY_SIZE - or ED25519_PUB_KEY_SIZE + \return 0 Returned upon successfully exporting the key pair. + \return ECC_BAD_ARG_E Returned if any of the input values evaluate to NULL. + \return BUFFER_E Returned if the buffer provided is not large enough + to store the key pair. - \param key The ed25519_key structure to export to. - \param priv Byte array to store private key. - \param privSz Size of priv buffer. - \param pub Byte array to store public key. - \param pubSz Size of pub buffer. + \param [in] key Pointer to an ed25519_key structure from which to export + the key pair. + \param [out] priv Pointer to the buffer in which to store the private key. + \param [in,out] privSz Pointer to a word32 object with the size available in + out. Set with the number of bytes written to out after successfully + exporting the private key. + \param [out] pub Pointer to the buffer in which to store the public key. + \param [in,out] pubSz Pointer to a word32 object with the size available in + out. Set with the number of bytes written to out after successfully + exporting the public key. _Example_ \code @@ -388,8 +833,8 @@ int wc_ed25519_export_private(ed25519_key* key, byte* out, word32* outLen); word32 privSz = sizeof(priv); ret = wc_ed25519_export_key(&key, priv, &pubSz, pub, &pubSz); - if ( ret != 0) { - // error exporting public key + if (ret != 0) { + // error exporting public key } \endcode @@ -404,14 +849,45 @@ int wc_ed25519_export_key(ed25519_key* key, /*! \ingroup ED25519 - \brief This function returns the key size of an ed25519_key structure, - or 32 bytes. + \brief This function checks the public key in ed25519_key structure matches + the private key. - \return Success Given a valid key, returns ED25519_KEY_SIZE (32 bytes) - \return BAD_FUNC_ARGS Returned if the given key is NULL + \return 0 Returned if the private and public key matched. + \return BAD_FUNC_ARGS Returned if the given key is NULL. - \param key pointer to an ed25519_key structure for which to get the - key size + \param [in] key Pointer to an ed25519_key structure holding a private and + public key. + + _Example_ + \code + int ret; + byte priv[] = { initialize with 57 byte private key }; + byte pub[] = { initialize with the corresponding public key }; + + ed25519_key key; + wc_ed25519_init_key(&key); + wc_ed25519_import_private_key(priv, sizeof(priv), pub, sizeof(pub), &key); + ret = wc_ed25519_check_key(&key); + if (ret != 0) { + // error checking key + } + \endcode + + \sa wc_ed25519_import_private_key +*/ +WOLFSSL_API +int wc_ed25519_check_key(ed25519_key* key); + +/*! + \ingroup ED25519 + + \brief This function returns the size of an Ed25519 - 32 bytes. + + \return ED25519_KEY_SIZE The size of a valid private key (32 bytes). + \return BAD_FUNC_ARGS Returned if the given key is NULL. + + \param [in] key Pointer to an ed25519_key structure for which to get the + key size. _Example_ \code @@ -419,8 +895,8 @@ int wc_ed25519_export_key(ed25519_key* key, ed25519_key key; // initialize key, make key keySz = wc_ed25519_size(&key); - if ( keySz == 0) { - // error determining key size + if (keySz == 0) { + // error determining key size } \endcode @@ -432,12 +908,14 @@ int wc_ed25519_size(ed25519_key* key); /*! \ingroup ED25519 - \brief Returns the private key size (secret + public) in bytes. + \brief This function returns the private key size (secret + public) in + bytes. - \return BAD_FUNC_ARG Returns if key argument is null. - \return ED25519_PRV_KEY_SIZE The size of the private key. + \return ED25519_PRV_KEY_SIZE The size of the private key (64 bytes). + \return BAD_FUNC_ARG Returned if key argument is NULL. - \param key The ed25119_key struct + \param [in] key Pointer to an ed25519_key structure for which to get the + key size. _Example_ \code @@ -447,11 +925,11 @@ int wc_ed25519_size(ed25519_key* key); WC_RNG rng; wc_InitRng(&rng); - wc_ed25519_make_key(&rng, 32, &key); // initialize 32 byte ed25519 key + wc_ed25519_make_key(&rng, 32, &key); // initialize 32 byte Ed25519 key int key_size = wc_ed25519_priv_size(&key); \endcode - \sa wc_ed25119_pub_size + \sa wc_ed25519_pub_size */ WOLFSSL_API int wc_ed25519_priv_size(ed25519_key* key); @@ -459,12 +937,14 @@ int wc_ed25519_priv_size(ed25519_key* key); /*! \ingroup ED25519 - \brief Returns the compressed key size in bytes (public key). + \brief This function returns the compressed key size in bytes (public key). - \return BAD_FUNC_ARG returns if key is null. - \return ED25519_PUB_KEY_SIZE Size of key. + \return ED25519_PUB_KEY_SIZE The size of the compressed public key + (32 bytes). + \return BAD_FUNC_ARG Returns if key argument is NULL. - \param key Pointer to the ed25519_key struct. + \param [in] key Pointer to an ed25519_key structure for which to get the + key size. _Example_ \code @@ -473,7 +953,7 @@ int wc_ed25519_priv_size(ed25519_key* key); WC_RNG rng; wc_InitRng(&rng); - wc_ed25519_make_key(&rng, 32, &key); // initialize 32 byte ed25519 key + wc_ed25519_make_key(&rng, 32, &key); // initialize 32 byte Ed25519 key int key_size = wc_ed25519_pub_size(&key); \endcode @@ -485,13 +965,13 @@ int wc_ed25519_pub_size(ed25519_key* key); /*! \ingroup ED25519 - \brief This function returns the size of an ed25519 signature (64 in bytes). + \brief This function returns the size of an Ed25519 signature (64 in bytes). - \return Success Given a valid key, returns ED25519_SIG_SIZE (64 in bytes) - \return 0 Returned if the given key is NULL + \return ED25519_SIG_SIZE The size of an Ed25519 signature (64 bytes). + \return BAD_FUNC_ARG Returns if key argument is NULL. - \param key pointer to an ed25519_key structure for which to get the - signature size + \param [in] key Pointer to an ed25519_key structure for which to get the + signature size. _Example_ \code @@ -500,8 +980,8 @@ int wc_ed25519_pub_size(ed25519_key* key); // initialize key, make key sigSz = wc_ed25519_sig_size(&key); - if ( sigSz == 0) { - // error determining sig size + if (sigSz == 0) { + // error determining sig size } \endcode diff --git a/doc/dox_comments/header_files/ed448.h b/doc/dox_comments/header_files/ed448.h new file mode 100644 index 000000000..8771a7340 --- /dev/null +++ b/doc/dox_comments/header_files/ed448.h @@ -0,0 +1,872 @@ +/*! + \ingroup ED448 + + \brief This function generates the Ed448 public key from the private key. + It stores the public key in the buffer pubKey, and sets the bytes + written to this buffer in pubKeySz. + + \return 0 Returned upon successfully making the public key. + \return BAD_FUNC_ARG Returned ifi key or pubKey evaluate to NULL, or if the + specified key size is not 57 bytes (Ed448 has 57 byte keys). + \return MEMORY_E Returned if there is an error allocating memory + during function execution. + + \param [in] key Pointer to the ed448_key for which to generate a key. + \param [out] out Pointer to the buffer in which to store the public key. + \param [in,out] outLen Pointer to a word32 object with the size available + in out. Set with the number of bytes written to out after successfully + exporting the public key. + + _Example_ + \code + int ret; + + ed448_key key; + byte priv[] = { initialize with 57 byte private key }; + byte pub[57]; + word32 pubSz = sizeof(pub); + + wc_ed448_init(&key); + wc_ed448_import_private_only(priv, sizeof(priv), &key); + ret = wc_ed448_make_public(&key, pub, &pubSz); + if (ret != 0) { + // error making public key + } + \endcode + + \sa wc_ed448_init + \sa wc_ed448_import_private_only + \sa wc_ed448_make_key +*/ +WOLFSSL_API +int wc_ed448_make_public(ed448_key* key, unsigned char* pubKey, + word32 pubKeySz); + +/*! + \ingroup ED448 + + \brief This function generates a new Ed448 key and stores it in key. + + \return 0 Returned upon successfully making an ed448_key. + \return BAD_FUNC_ARG Returned if rng or key evaluate to NULL, or if the + specified key size is not 57 bytes (Ed448 has 57 byte keys). + \return MEMORY_E Returned if there is an error allocating memory + during function execution. + + \param [in] rng Pointer to an initialized RNG object with which to + generate the key. + \param [in] keysize Length of key to generate. Should always be 57 for + Ed448. + \param [in,out] key Pointer to the ed448_key for which to generate a key. + + _Example_ + \code + int ret; + + WC_RNG rng; + ed448_key key; + + wc_InitRng(&rng); + wc_ed448_init(&key); + ret = wc_ed448_make_key(&rng, 57, &key); + if (ret != 0) { + // error making key + } + \endcode + + \sa wc_ed448_init +*/ +WOLFSSL_API +int wc_ed448_make_key(WC_RNG* rng, int keysize, ed448_key* key); + +/*! + \ingroup ED448 + + \brief This function signs a message using an ed448_key object + to guarantee authenticity. + + \return 0 Returned upon successfully generating a signature for the + message. + \return BAD_FUNC_ARG Returned if any of the input parameters evaluate to + NULL, or if the output buffer is too small to store the generated signature. + \return MEMORY_E Returned if there is an error allocating memory during + function execution. + + \param [in] in Pointer to the buffer containing the message to sign. + \param [in] inlen Length of the message to sign. + \param [out] out Buffer in which to store the generated signature. + \param [in,out] outlen Maximum length of the output buffer. Will store the + bytes written to out upon successfully generating a message signature. + \param [in] key Pointer to a private ed448_key with which to generate the + signature. + + _Example_ + \code + ed448_key key; + WC_RNG rng; + int ret, sigSz; + + byte sig[114]; // will hold generated signature + sigSz = sizeof(sig); + byte message[] = { initialize with message }; + + wc_InitRng(&rng); // initialize rng + wc_ed448_init(&key); // initialize key + wc_ed448_make_key(&rng, 57, &key); // make public/private key pair + ret = wc_ed448_sign_msg(message, sizeof(message), sig, &sigSz, &key); + if (ret != 0 ) { + // error generating message signature + } + \endcode + + \sa wc_ed448ph_sign_hash + \sa wc_ed448ph_sign_msg + \sa wc_ed448_verify_msg +*/ +WOLFSSL_API +int wc_ed448_sign_msg(const byte* in, word32 inlen, byte* out, + word32 *outlen, ed448_key* key); + +/*! + \ingroup ED448 + + \brief This function signs a message digest using an ed448_key object + to guarantee authenticity. The context is included as part of the data + signed. The hash is the pre-hashed message before signature calculation. + The hash algorithm used to create message digest must be SHAKE-256. + + \return 0 Returned upon successfully generating a signature for the + message digest. + \return BAD_FUNC_ARG Returned any of the input parameters evaluate to + NULL, or if the output buffer is too small to store the generated signature. + \return MEMORY_E Returned if there is an error allocating memory during + function execution. + + \param [in] hash Pointer to the buffer containing the hash of the message + to sign. + \param [in] hashLen Length of the hash of the message to sign. + \param [out] out Buffer in which to store the generated signature. + \param [in,out] outlen Maximum length of the output buffer. Will store the + bytes written to out upon successfully generating a message signature. + \param [in] key Pointer to a private ed448_key with which to generate the + signature. + \param [in] context Pointer to the buffer containing the context for which + message is being signed. + \param [in] contextLen Length of the context buffer. + + _Example_ + \code + ed448_key key; + WC_RNG rng; + int ret, sigSz; + + byte sig[114]; // will hold generated signature + sigSz = sizeof(sig); + byte hash[] = { initialize with SHAKE-256 hash of message }; + byte context[] = { initialize with context of signing }; + + wc_InitRng(&rng); // initialize rng + wc_ed448_init(&key); // initialize key + wc_ed448_make_key(&rng, 57, &key); // make public/private key pair + ret = wc_ed448ph_sign_hash(hash, sizeof(hash), sig, &sigSz, &key, + context, sizeof(context)); + if (ret != 0) { + // error generating message signature + } + \endcode + + \sa wc_ed448_sign_msg + \sa wc_ed448ph_sign_msg + \sa wc_ed448ph_verify_hash +*/ +WOLFSSL_API +int wc_ed448ph_sign_hash(const byte* hash, word32 hashLen, byte* out, + word32 *outLen, ed448_key* key, + const byte* context, byte contextLen); + +/*! + \ingroup ED448 + + \brief This function signs a message using an ed448_key object + to guarantee authenticity. The context is included as part of the data + signed. The message is pre-hashed before signature calculation. + + \return 0 Returned upon successfully generating a signature for the + message. + \return BAD_FUNC_ARG Returned any of the input parameters evaluate to + NULL, or if the output buffer is too small to store the generated signature. + \return MEMORY_E Returned if there is an error allocating memory during + function execution. + + \param [in] in Pointer to the buffer containing the message to sign. + \param [in] inlen Length of the message to sign. + \param [out] out Buffer in which to store the generated signature. + \param [in,out] outlen Maximum length of the output buffer. Will store the + bytes written to out upon successfully generating a message signature. + \param [in] key Pointer to a private ed448_key with which to generate the + signature. + \param [in] context Pointer to the buffer containing the context for which + message is being signed. + \param [in] contextLen Length of the context buffer. + + _Example_ + \code + ed448_key key; + WC_RNG rng; + int ret, sigSz; + + byte sig[114]; // will hold generated signature + sigSz = sizeof(sig); + byte message[] = { initialize with message }; + byte context[] = { initialize with context of signing }; + + wc_InitRng(&rng); // initialize rng + wc_ed448_init(&key); // initialize key + wc_ed448_make_key(&rng, 57, &key); // make public/private key pair + ret = wc_ed448ph_sign_msg(message, sizeof(message), sig, &sigSz, &key, + context, sizeof(context)); + if (ret != 0) { + // error generating message signature + } + \endcode + + \sa wc_ed448_sign_msg + \sa wc_ed448ph_sign_hash + \sa wc_ed448ph_verify_msg +*/ +WOLFSSL_API +int wc_ed448ph_sign_msg(const byte* in, word32 inLen, byte* out, + word32 *outLen, ed448_key* key, const byte* context, + byte contextLen); + +/*! + \ingroup ED448 + + \brief This function verifies the Ed448 signature of a message to ensure + authenticity. The context is included as part of the data + verified. The answer is returned through res, with 1 corresponding to + a valid signature, and 0 corresponding to an invalid signature. + + \return 0 Returned upon successfully performing the signature + verification and authentication. + \return BAD_FUNC_ARG Returned if any of the input parameters evaluate to + NULL, or if the siglen does not match the actual length of a signature. + \return SIG_VERIFY_E Returned if verification completes, but the signature + generated does not match the signature provided. + + \param [in] sig Pointer to the buffer containing the signature to verify. + \param [in] siglen Length of the signature to verify. + \param [in] msg Pointer to the buffer containing the message to verify. + \param [in] msgLen Length of the message to verify. + \param [in] key Pointer to a public Ed448 key with which to verify the + signature. + \param [in] context Pointer to the buffer containing the context for which + the message was signed. + \param [in] contextLen Length of the context buffer. + + _Example_ + \code + ed448_key key; + int ret, verified = 0; + + byte sig[] { initialize with received signature }; + byte msg[] = { initialize with message }; + byte context[] = { initialize with context of signature }; + // initialize key with received public key + ret = wc_ed448_verify_msg(sig, sizeof(sig), msg, sizeof(msg), &verified, + &key, context, sizeof(context)); + if (ret < 0) { + // error performing verification + } else if (verified == 0) + // the signature is invalid + } + \endcode + + \sa wc_ed448ph_verify_hash + \sa wc_ed448ph_verify_msg + \sa wc_ed448_sign_msg +*/ +WOLFSSL_API +int wc_ed448_verify_msg(const byte* sig, word32 siglen, const byte* msg, + word32 msgLen, int* res, ed448_key* key, + const byte* context, byte contextLen); + +/*! + \ingroup ED448 + + \brief This function verifies the Ed448 signature of the digest of a message + to ensure authenticity. The context is included as part of the data + verified. The hash is the pre-hashed message before signature calculation. + The hash algorithm used to create message digest must be SHAKE-256. + The answer is returned through res, with 1 corresponding to a valid + signature, and 0 corresponding to an invalid signature. + + \return 0 Returned upon successfully performing the signature + verification and authentication. + \return BAD_FUNC_ARG Returned if any of the input parameters evaluate to + NULL, or if the siglen does not match the actual length of a signature. + \return SIG_VERIFY_E Returned if verification completes, but the signature + generated does not match the signature provided. + + \param [in] sig Pointer to the buffer containing the signature to verify. + \param [in] siglen Length of the signature to verify. + \param [in] hash Pointer to the buffer containing the hash of the message + to verify. + \param [in] hashLen Length of the hash to verify. + \param [in] key Pointer to a public Ed448 key with which to verify the + signature. + \param [in] context Pointer to the buffer containing the context for which + the message was signed. + \param [in] contextLen Length of the context buffer. + + _Example_ + \code + ed448_key key; + int ret, verified = 0; + + byte sig[] { initialize with received signature }; + byte hash[] = { initialize with SHAKE-256 hash of message }; + byte context[] = { initialize with context of signature }; + // initialize key with received public key + ret = wc_ed448ph_verify_hash(sig, sizeof(sig), hash, sizeof(hash), + &verified, &key, context, sizeof(context)); + if (ret < 0) { + // error performing verification + } else if (verified == 0) + // the signature is invalid + } + \endcode + + \sa wc_ed448_verify_msg + \sa wc_ed448ph_verify_msg + \sa wc_ed448ph_sign_hash +*/ +WOLFSSL_API +int wc_ed448ph_verify_hash(const byte* sig, word32 siglen, const byte* hash, + word32 hashlen, int* res, ed448_key* key, + const byte* context, byte contextLen); + +/*! + \ingroup ED448 + + \brief This function verifies the Ed448 signature of a message to ensure + authenticity. The context is included as part of the data + verified. The message is pre-hashed before verification. The answer is + returned through res, with 1 corresponding to a valid signature, and 0 + corresponding to an invalid signature. + + \return 0 Returned upon successfully performing the signature + verification and authentication. + \return BAD_FUNC_ARG Returned if any of the input parameters evaluate to + NULL, or if the siglen does not match the actual length of a signature. + \return SIG_VERIFY_E Returned if verification completes, but the signature + generated does not match the signature provided. + + \param [in] sig Pointer to the buffer containing the signature to verify. + \param [in] siglen Length of the signature to verify. + \param [in] msg Pointer to the buffer containing the message to verify. + \param [in] msgLen Length of the message to verify. + \param [in] key Pointer to a public Ed448 key with which to verify the + signature. + \param [in] context Pointer to the buffer containing the context for which + the message was signed. + \param [in] contextLen Length of the context buffer. + + _Example_ + \code + ed448_key key; + int ret, verified = 0; + + byte sig[] { initialize with received signature }; + byte msg[] = { initialize with message }; + byte context[] = { initialize with context of signature }; + // initialize key with received public key + ret = wc_ed448ph_verify_msg(sig, sizeof(sig), msg, sizeof(msg), &verified, + &key, context, sizeof(context)); + if (ret < 0) { + // error performing verification + } else if (verified == 0) + // the signature is invalid + } + \endcode + + \sa wc_ed448_verify_msg + \sa wc_ed448ph_verify_hash + \sa wc_ed448ph_sign_msg +*/ +WOLFSSL_API +int wc_ed448ph_verify_msg(const byte* sig, word32 siglen, const byte* msg, + word32 msgLen, int* res, ed448_key* key, + const byte* context, byte contextLen); + +/*! + \ingroup ED448 + + \brief This function initializes an ed448_key object for future use + with message verification. + + \return 0 Returned upon successfully initializing the ed448_key object. + \return BAD_FUNC_ARG Returned if key is NULL. + + \param [in,out] key Pointer to the ed448_key object to initialize. + + _Example_ + \code + ed448_key key; + wc_ed448_init(&key); + \endcode + + \sa wc_ed448_make_key + \sa wc_ed448_free +*/ +WOLFSSL_API +int wc_ed448_init(ed448_key* key); + +/*! + \ingroup ED448 + + \brief This function frees an Ed448 object after it has been used. + + \param [in,out] key Pointer to the ed448_key object to free + + _Example_ + \code + ed448_key key; + // initialize key and perform secure exchanges + ... + wc_ed448_free(&key); + \endcode + + \sa wc_ed448_init +*/ +WOLFSSL_API +void wc_ed448_free(ed448_key* key); + +/*! + \ingroup ED448 + + \brief This function imports a public ed448_key pair from a buffer + containing the public key. This function will handle both compressed and + uncompressed keys. + + \return 0 Returned on successfully importing the ed448_key. + \return BAD_FUNC_ARG Returned if in or key evaluate to NULL, or inLen is + less than the size of an Ed448 key. + + \param [in] in Pointer to the buffer containing the public key. + \param [in] inLen Length of the buffer containing the public key. + \param [in,out] key Pointer to the ed448_key object in which to store the + public key. + + _Example_ + \code + int ret; + byte pub[] = { initialize Ed448 public key }; + + ed_448 key; + wc_ed448_init_key(&key); + ret = wc_ed448_import_public(pub, sizeof(pub), &key); + if (ret != 0) { + // error importing key + } + \endcode + + \sa wc_ed448_import_private_key + \sa wc_ed448_export_public +*/ +WOLFSSL_API +int wc_ed448_import_public(const byte* in, word32 inLen, ed448_key* key); + +/*! + \ingroup ED448 + + \brief This function imports an Ed448 private key only from a + buffer. + + \return 0 Returned on successfully importing the Ed448 private key. + \return BAD_FUNC_ARG Returned if in or key evaluate to NULL, or if + privSz is less than ED448_KEY_SIZE. + + \param [in] priv Pointer to the buffer containing the private key. + \param [in] privSz Length of the private key. + \param [in,out] key Pointer to the ed448_key object in which to store the + imported private key. + + _Example_ + \code + int ret; + byte priv[] = { initialize with 57 byte private key }; + + ed448_key key; + wc_ed448_init_key(&key); + ret = wc_ed448_import_private_only(priv, sizeof(priv), &key); + if (ret != 0) { + // error importing private key + } + \endcode + + \sa wc_ed448_import_public + \sa wc_ed448_import_private_key + \sa wc_ed448_export_private_only +*/ +WOLFSSL_API +int wc_ed448_import_private_only(const byte* priv, word32 privSz, + ed448_key* key); + +/*! + \ingroup ED448 + + \brief This function imports a public/private Ed448 key pair from a + pair of buffers. This function will handle both compressed and + uncompressed keys. + + \return 0 Returned on successfully importing the Ed448 key. + \return BAD_FUNC_ARG Returned if in or key evaluate to NULL, or if + either privSz is less than ED448_KEY_SIZE or pubSz is less than + ED448_PUB_KEY_SIZE. + + \param [in] priv Pointer to the buffer containing the private key. + \param [in] privSz Length of the private key. + \param [in] pub Pointer to the buffer containing the public key. + \param [in] pubSz Length of the public key. + \param [in,out] key Pointer to the ed448_key object in which to store the + imported private/public key pair. + + _Example_ + \code + int ret; + byte priv[] = { initialize with 57 byte private key }; + byte pub[] = { initialize with the corresponding public key }; + + ed448_key key; + wc_ed448_init_key(&key); + ret = wc_ed448_import_private_key(priv, sizeof(priv), pub, sizeof(pub), + &key); + if (ret != 0) { + // error importing key + } + \endcode + + \sa wc_ed448_import_public + \sa wc_ed448_import_private_only + \sa wc_ed448_export_private +*/ +WOLFSSL_API +int wc_ed448_import_private_key(const byte* priv, word32 privSz, + const byte* pub, word32 pubSz, ed448_key* key); + +/*! + \ingroup ED448 + + \brief This function exports the private key from an ed448_key + structure. It stores the public key in the buffer out, and sets the bytes + written to this buffer in outLen. + + \return 0 Returned upon successfully exporting the public key. + \return BAD_FUNC_ARG Returned if any of the input values evaluate to NULL. + \return BUFFER_E Returned if the buffer provided is not large enough to + store the private key. Upon returning this error, the function sets the + size required in outLen. + + \param [in] key Pointer to an ed448_key structure from which to export the + public key. + \param [out] out Pointer to the buffer in which to store the public key. + \param [in,out] outLen Pointer to a word32 object with the size available + in out. Set with the number of bytes written to out after successfully + exporting the public key. + + _Example_ + \code + int ret; + ed448_key key; + // initialize key, make key + + char pub[57]; + word32 pubSz = sizeof(pub); + + ret = wc_ed448_export_public(&key, pub, &pubSz); + if (ret != 0) { + // error exporting public key + } + \endcode + + \sa wc_ed448_import_public + \sa wc_ed448_export_private_only +*/ +WOLFSSL_API +int wc_ed448_export_public(ed448_key*, byte* out, word32* outLen); + +/*! + \ingroup ED448 + + \brief This function exports only the private key from an ed448_key + structure. It stores the private key in the buffer out, and sets + the bytes written to this buffer in outLen. + + \return 0 Returned upon successfully exporting the private key. + \return ECC_BAD_ARG_E Returned if any of the input values evaluate to NULL. + \return BUFFER_E Returned if the buffer provided is not large enough + to store the private key. + + \param [in] key Pointer to an ed448_key structure from which to export + the private key. + \param [out] out Pointer to the buffer in which to store the private key. + \param [in,out] outLen Pointer to a word32 object with the size available in + out. Set with the number of bytes written to out after successfully + exporting the private key. + + _Example_ + \code + int ret; + ed448_key key; + // initialize key, make key + + char priv[57]; // 57 bytes because only private key + word32 privSz = sizeof(priv); + ret = wc_ed448_export_private_only(&key, priv, &privSz); + if (ret != 0) { + // error exporting private key + } + \endcode + + \sa wc_ed448_export_public + \sa wc_ed448_import_private_key +*/ +WOLFSSL_API +int wc_ed448_export_private_only(ed448_key* key, byte* out, word32* outLen); + +/*! + \ingroup ED448 + + \brief This function exports the key pair from an ed448_key + structure. It stores the key pair in the buffer out, and sets + the bytes written to this buffer in outLen. + + \return 0 Returned upon successfully exporting the key pair. + \return ECC_BAD_ARG_E Returned if any of the input values evaluate to NULL. + \return BUFFER_E Returned if the buffer provided is not large enough + to store the key pair. + + \param [in] key Pointer to an ed448_key structure from which to export + the key pair. + \param [out] out Pointer to the buffer in which to store the key pair. + \param [in,out] outLen Pointer to a word32 object with the size available in + out. Set with the number of bytes written to out after successfully + exporting the key pair. + + _Example_ + \code + ed448_key key; + wc_ed448_init(&key); + + WC_RNG rng; + wc_InitRng(&rng); + + wc_ed448_make_key(&rng, 57, &key); // initialize 57 byte Ed448 key + + byte out[114]; // out needs to be a sufficient buffer size + word32 outLen = sizeof(out); + int key_size = wc_ed448_export_private(&key, out, &outLen); + if (key_size == BUFFER_E) { + // Check size of out compared to outLen to see if function reset outLen + } + \endcode + + \sa wc_ed448_import_private + \sa wc_ed448_export_private_only +*/ +WOLFSSL_API +int wc_ed448_export_private(ed448_key* key, byte* out, word32* outLen); + +/*! + \ingroup ED448 + + \brief This function exports the private and public key separately from an + ed448_key structure. It stores the private key in the buffer priv, and sets + the bytes written to this buffer in privSz. It stores the public key in the + buffer pub, and sets the bytes written to this buffer in pubSz. + + \return 0 Returned upon successfully exporting the key pair. + \return ECC_BAD_ARG_E Returned if any of the input values evaluate to NULL. + \return BUFFER_E Returned if the buffer provided is not large enough + to store the key pair. + + \param [in] key Pointer to an ed448_key structure from which to export + the key pair. + \param [out] priv Pointer to the buffer in which to store the private key. + \param [in,out] privSz Pointer to a word32 object with the size available in + out. Set with the number of bytes written to out after successfully + exporting the private key. + \param [out] pub Pointer to the buffer in which to store the public key. + \param [in,out] pubSz Pointer to a word32 object with the size available in + out. Set with the number of bytes written to out after successfully + exporting the public key. + + _Example_ + \code + int ret; + ed448_key key; + // initialize key, make key + + char pub[57]; + word32 pubSz = sizeof(pub); + char priv[57]; + word32 privSz = sizeof(priv); + + ret = wc_ed448_export_key(&key, priv, &pubSz, pub, &pubSz); + if (ret != 0) { + // error exporting private and public key + } + \endcode + + \sa wc_ed448_export_private + \sa wc_ed448_export_public +*/ +WOLFSSL_API +int wc_ed448_export_key(ed448_key* key, + byte* priv, word32 *privSz, + byte* pub, word32 *pubSz); + +/*! + \ingroup ED448 + + \brief This function checks the public key in ed448_key structure matches + the private key. + + \return 0 Returned if the private and public key matched. + \return BAD_FUNC_ARGS Returned if the given key is NULL. + + \param [in] key Pointer to an ed448_key structure holding a private and + public key. + + _Example_ + \code + int ret; + byte priv[] = { initialize with 57 byte private key }; + byte pub[] = { initialize with the corresponding public key }; + + ed448_key key; + wc_ed448_init_key(&key); + wc_ed448_import_private_key(priv, sizeof(priv), pub, sizeof(pub), &key); + ret = wc_ed448_check_key(&key); + if (ret != 0) { + // error checking key + } + \endcode + + \sa wc_ed448_import_private_key +*/ +WOLFSSL_API +int wc_ed448_check_key(ed448_key* key); + + +/*! + \ingroup ED448 + + \brief This function returns the size of an Ed448 private key - 57 bytes. + + \return ED448_KEY_SIZE The size of a valid private key (57 bytes). + \return BAD_FUNC_ARGS Returned if the given key is NULL. + + \param [in] key Pointer to an ed448_key structure for which to get the + key size. + + _Example_ + \code + int keySz; + ed448_key key; + // initialize key, make key + keySz = wc_ed448_size(&key); + if (keySz == 0) { + // error determining key size + } + \endcode + + \sa wc_ed448_make_key +*/ +WOLFSSL_API +int wc_ed448_size(ed448_key* key); + +/*! + \ingroup ED448 + + \brief This function returns the private key size (secret + public) in + bytes. + + \return ED448_PRV_KEY_SIZE The size of the private key (114 bytes). + \return BAD_FUNC_ARG Returns if key argument is NULL. + + \param [in] key Pointer to an ed448_key structure for which to get the + key size. + + _Example_ + \code + ed448_key key; + wc_ed448_init(&key); + + WC_RNG rng; + wc_InitRng(&rng); + + wc_ed448_make_key(&rng, 57, &key); // initialize 57 byte Ed448 key + int key_size = wc_ed448_priv_size(&key); + \endcode + + \sa wc_ed448_pub_size +*/ +WOLFSSL_API +int wc_ed448_priv_size(ed448_key* key); + +/*! + \ingroup ED448 + + \brief This function returns the compressed key size in bytes (public key). + + \return ED448_PUB_KEY_SIZE The size of the compressed public key (57 bytes). + \return BAD_FUNC_ARG Returns if key argument is NULL. + + \param [in] key Pointer to an ed448_key structure for which to get the + key size. + + _Example_ + \code + ed448_key key; + wc_ed448_init(&key); + WC_RNG rng; + wc_InitRng(&rng); + + wc_ed448_make_key(&rng, 57, &key); // initialize 57 byte Ed448 key + int key_size = wc_ed448_pub_size(&key); + \endcode + + \sa wc_ed448_priv_size +*/ +WOLFSSL_API +int wc_ed448_pub_size(ed448_key* key); + +/*! + \ingroup ED448 + + \brief This function returns the size of an Ed448 signature (114 in bytes). + + \return ED448_SIG_SIZE The size of an Ed448 signature (114 bytes). + \return BAD_FUNC_ARG Returns if key argument is NULL. + + \param [in] key Pointer to an ed448_key structure for which to get the + signature size. + + _Example_ + \code + int sigSz; + ed448_key key; + // initialize key, make key + + sigSz = wc_ed448_sig_size(&key); + if (sigSz == 0) { + // error determining sig size + } + \endcode + + \sa wc_ed448_sign_msg +*/ +WOLFSSL_API +int wc_ed448_sig_size(ed448_key* key); diff --git a/wolfcrypt/src/ed25519.c b/wolfcrypt/src/ed25519.c index 8057caa7c..b78732d5e 100644 --- a/wolfcrypt/src/ed25519.c +++ b/wolfcrypt/src/ed25519.c @@ -61,7 +61,7 @@ int wc_ed25519_make_public(ed25519_key* key, unsigned char* pubKey, ge_p3 A; #endif - if (key == NULL || pubKeySz != ED25519_PUB_KEY_SIZE) + if (key == NULL || pubKey == NULL || pubKeySz != ED25519_PUB_KEY_SIZE) ret = BAD_FUNC_ARG; if (ret == 0) diff --git a/wolfcrypt/src/ed448.c b/wolfcrypt/src/ed448.c index 125ee3852..edeec0707 100644 --- a/wolfcrypt/src/ed448.c +++ b/wolfcrypt/src/ed448.c @@ -67,7 +67,7 @@ int wc_ed448_make_public(ed448_key* key, unsigned char* pubKey, word32 pubKeySz) byte az[ED448_PRV_KEY_SIZE]; ge448_p2 A; - if ((key == NULL) || (pubKeySz != ED448_PUB_KEY_SIZE)) { + if ((key == NULL) || (pubKey == NULL) || (pubKeySz != ED448_PUB_KEY_SIZE)) { ret = BAD_FUNC_ARG; } From 90caeaf925ef6a3f46f89f869abdf81ddfe4f9d0 Mon Sep 17 00:00:00 2001 From: Juliusz Sosinowicz Date: Tue, 16 Jun 2020 23:21:54 +0200 Subject: [PATCH 237/298] Alert level must be cleared or ProcessReply will loop indefinitely --- src/internal.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/internal.c b/src/internal.c index 6d4b4b91a..42e8ac540 100644 --- a/src/internal.c +++ b/src/internal.c @@ -15629,6 +15629,10 @@ int ProcessReply(WOLFSSL* ssl) if (type == decrypt_error) return FATAL_ERROR; + + /* Reset error if we got an alert level in ret */ + if (ret > 0) + ret = 0; break; default: From 6bb73fb25dd125d0a962b86e82fbdbd90d81ded1 Mon Sep 17 00:00:00 2001 From: Sean Parkinson Date: Wed, 17 Jun 2020 09:44:12 +1000 Subject: [PATCH 238/298] Fix ED448 calls to use context and correct variable name Added basic test of OpenSSL compatability APIs: - wolfSSL_ED25519_generate_key - wolfSSL_ED25519_sign - wolfSSL_ED25519_verify - wolfSSL_ED2448_generate_key - wolfSSL_ED448_sign - wolfSSL_ED448_verify --- src/ssl.c | 4 +-- tests/api.c | 60 +++++++++++++++++++++++++++++++++++++++++++ wolfcrypt/src/asn.c | 2 +- wolfcrypt/test/test.c | 2 +- 4 files changed, 64 insertions(+), 4 deletions(-) diff --git a/src/ssl.c b/src/ssl.c index 0bdcbe418..fb467f351 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -42845,7 +42845,7 @@ int wolfSSL_ED448_sign(const unsigned char *msg, unsigned int msgSz, return ret; } - if (wc_ed448_sign_msg(msg, msgSz, sig, sigSz, &key) != MP_OKAY) + if (wc_ed448_sign_msg(msg, msgSz, sig, sigSz, &key, NULL, 0) != MP_OKAY) WOLFSSL_MSG("wc_curve448_shared_secret_ex failed"); else ret = WOLFSSL_SUCCESS; @@ -42897,7 +42897,7 @@ int wolfSSL_ED448_verify(const unsigned char *msg, unsigned int msgSz, } if ((ret = wc_ed448_verify_msg((byte*)sig, sigSz, msg, msgSz, &check, - &key)) != MP_OKAY) { + &key, NULL, 0)) != MP_OKAY) { WOLFSSL_MSG("wc_ed448_verify_msg failed"); } else if (!check) diff --git a/tests/api.c b/tests/api.c index f289dd513..afe36b837 100644 --- a/tests/api.c +++ b/tests/api.c @@ -333,6 +333,12 @@ #ifdef HAVE_PKCS7 #include #endif +#ifdef HAVE_ED25519 + #include +#endif +#ifdef HAVE_ED448 + #include +#endif #endif /* OPENSSL_EXTRA */ #if defined(OPENSSL_EXTRA) && defined(WOLFCRYPT_HAVE_SRP) \ @@ -2069,6 +2075,58 @@ static void test_ECDSA_size_sign(void) #endif /* HAVE_ECC && !NO_ECC256 && !NO_ECC_SECP */ } + +static void test_ED25519(void) +{ +#if defined(HAVE_ED25519) && defined(WOLFSSL_KEY_GEN) + byte priv[ED25519_PRV_KEY_SIZE]; + unsigned int privSz = (unsigned int)sizeof(priv); + byte pub[ED25519_PUB_KEY_SIZE]; + unsigned int pubSz = (unsigned int)sizeof(pub); + const char* msg = "Everyone gets Friday off."; + unsigned int msglen = (unsigned int)XSTRLEN(msg); + byte sig[ED25519_SIG_SIZE]; + unsigned int sigSz = (unsigned int)sizeof(sig); + + AssertIntEQ(wolfSSL_ED25519_generate_key(priv, &privSz, pub, &pubSz), + WOLFSSL_SUCCESS); + AssertIntEQ(privSz, ED25519_PRV_KEY_SIZE); + AssertIntEQ(pubSz, ED25519_PUB_KEY_SIZE); + + AssertIntEQ(wolfSSL_ED25519_sign((byte*)msg, msglen, priv, privSz, sig, + &sigSz), WOLFSSL_SUCCESS); + AssertIntEQ(sigSz, ED25519_SIG_SIZE); + + AssertIntEQ(wolfSSL_ED25519_verify((byte*)msg, msglen, pub, pubSz, sig, + sigSz), WOLFSSL_SUCCESS); +#endif /* HAVE_ED25519 && WOLFSSL_KEY_GEN */ +} + +static void test_ED448(void) +{ +#if defined(HAVE_ED448) && defined(WOLFSSL_KEY_GEN) + byte priv[ED448_PRV_KEY_SIZE]; + unsigned int privSz = (unsigned int)sizeof(priv); + byte pub[ED448_PUB_KEY_SIZE]; + unsigned int pubSz = (unsigned int)sizeof(pub); + const char* msg = "Everyone gets Friday off."; + unsigned int msglen = (unsigned int)XSTRLEN(msg); + byte sig[ED448_SIG_SIZE]; + unsigned int sigSz = (unsigned int)sizeof(sig); + + AssertIntEQ(wolfSSL_ED448_generate_key(priv, &privSz, pub, &pubSz), + WOLFSSL_SUCCESS); + AssertIntEQ(privSz, ED448_PRV_KEY_SIZE); + AssertIntEQ(pubSz, ED448_PUB_KEY_SIZE); + + AssertIntEQ(wolfSSL_ED448_sign((byte*)msg, msglen, priv, privSz, sig, + &sigSz), WOLFSSL_SUCCESS); + AssertIntEQ(sigSz, ED448_SIG_SIZE); + + AssertIntEQ(wolfSSL_ED448_verify((byte*)msg, msglen, pub, pubSz, sig, + sigSz), WOLFSSL_SUCCESS); +#endif /* HAVE_ED448 && WOLFSSL_KEY_GEN */ +} #endif /* OPENSSL_EXTRA */ #include @@ -32518,6 +32576,8 @@ void ApiTest(void) #endif test_wolfSSL_ECDSA_SIG(); test_ECDSA_size_sign(); + test_ED25519(); + test_ED448(); #endif #if defined(OPENSSL_EXTRA) && defined(HAVE_ECC) && \ !defined(HAVE_SELFTEST) && \ diff --git a/wolfcrypt/src/asn.c b/wolfcrypt/src/asn.c index 91cbab76e..549f42ac8 100644 --- a/wolfcrypt/src/asn.c +++ b/wolfcrypt/src/asn.c @@ -14031,7 +14031,7 @@ static int SetKeyIdFromPublicKey(Cert *cert, RsaKey *rsakey, ecc_key *eckey, #ifdef HAVE_ED448 /* ED448 public key */ if (ed448Key != NULL) - bufferSz = SetEd448PublicKey(buffer, ed448Key, 0); + bufferSz = SetEd448PublicKey(buf, ed448Key, 0); #endif if (bufferSz <= 0) { diff --git a/wolfcrypt/test/test.c b/wolfcrypt/test/test.c index 5660de8cf..12beafc4c 100644 --- a/wolfcrypt/test/test.c +++ b/wolfcrypt/test/test.c @@ -22282,7 +22282,7 @@ static int ed448_test_cert(void) if (wc_ed448_verify_msg(serverCert->signature, serverCert->sigLength, serverCert->source + serverCert->certBegin, serverCert->sigIndex - serverCert->certBegin, - &verify, pubKey) < 0 || verify != 1) { + &verify, pubKey, NULL, 0) < 0 || verify != 1) { ERROR_OUT(-11032, done); } #endif /* HAVE_ED448_VERIFY */ From 82921f8650be0637fcd0985e9238947526c16ffb Mon Sep 17 00:00:00 2001 From: Jacob Barthelmeh Date: Wed, 17 Jun 2020 11:30:18 -0600 Subject: [PATCH 239/298] fix for x509 store add crl --- src/crl.c | 203 ++++++++++++++++++++++++++++++++++++++++++++++---- src/ssl.c | 18 ++--- wolfssl/ssl.h | 2 +- 3 files changed, 196 insertions(+), 27 deletions(-) diff --git a/src/crl.c b/src/crl.c index a48cf9d83..f3f52c855 100644 --- a/src/crl.c +++ b/src/crl.c @@ -490,27 +490,204 @@ int BufferLoadCRL(WOLFSSL_CRL* crl, const byte* buff, long sz, int type, } #if defined(OPENSSL_EXTRA) && defined(HAVE_CRL) +/* helper function to create a new dynamic WOLFSSL_X509_CRL structure */ +static WOLFSSL_X509_CRL* wolfSSL_X509_crl_new(WOLFSSL_CERT_MANAGER* cm) +{ + WOLFSSL_X509_CRL* ret; + + ret = (WOLFSSL_X509_CRL*)XMALLOC(sizeof(WOLFSSL_X509_CRL), cm->heap, + DYNAMIC_TYPE_CRL); + if (ret != NULL) { + if (InitCRL(ret, cm) < 0) { + WOLFSSL_MSG("Unable to initialize new CRL structure"); + XFREE(ret, cm->heap, DYNAMIC_TYPE_CRL); + ret = NULL; + } + } + return ret; +} + + +/* returns head of copied list that was alloc'd */ +static RevokedCert *DupRevokedCertList(RevokedCert* in, void* heap) +{ + RevokedCert* head = NULL; + RevokedCert* current = in; + RevokedCert* prev = NULL; + while (current) { + RevokedCert* tmp = (RevokedCert*)XMALLOC(sizeof(RevokedCert), heap, + DYNAMIC_TYPE_REVOKED); + if (tmp != NULL) { + XMEMCPY(tmp->serialNumber, current->serialNumber, + EXTERNAL_SERIAL_SIZE); + tmp->serialSz = current->serialSz; + tmp->next = NULL; + if (prev != NULL) + prev->next = tmp; + if (head == NULL) + head = tmp; + } + current = current->next; + } + return head; +} + + +/* returns a deep copy of ent on success and null on fail */ +static CRL_Entry* DupCRL_Entry(CRL_Entry* ent, void* heap) +{ + CRL_Entry *dup; + + dup = (CRL_Entry*)XMALLOC(sizeof(CRL_Entry), heap, DYNAMIC_TYPE_CRL_ENTRY); + if (dup == NULL) { + WOLFSSL_MSG("alloc CRL Entry failed"); + return NULL; + } + + XMEMCPY(dup->issuerHash, ent->issuerHash, CRL_DIGEST_SIZE); + XMEMCPY(dup->lastDate, ent->lastDate, MAX_DATE_SIZE); + XMEMCPY(dup->nextDate, ent->nextDate, MAX_DATE_SIZE); + dup->lastDateFormat = ent->lastDateFormat; + dup->nextDateFormat = ent->nextDateFormat; + dup->certs = DupRevokedCertList(ent->certs, heap); + + dup->totalCerts = ent->totalCerts; + dup->verified = ent->verified; + + if (!ent->verified) { + dup->tbsSz = ent->tbsSz; + dup->signatureSz = ent->signatureSz; + dup->signatureOID = ent->signatureOID; + dup->toBeSigned = (byte*)XMALLOC(dup->tbsSz, heap, + DYNAMIC_TYPE_CRL_ENTRY); + if (dup->toBeSigned == NULL) { + XFREE(dup, heap, DYNAMIC_TYPE_CRL_ENTRY); + return NULL; + } + + dup->signature = (byte*)XMALLOC(dup->signatureSz, heap, + DYNAMIC_TYPE_CRL_ENTRY); + if (dup->signature == NULL) { + XFREE(dup, heap, DYNAMIC_TYPE_CRL_ENTRY); + XFREE(dup->toBeSigned, heap, DYNAMIC_TYPE_CRL_ENTRY); + return NULL; + } + XMEMCPY(dup->toBeSigned, ent->toBeSigned, dup->tbsSz); + XMEMCPY(dup->signature, ent->signature, dup->signatureSz); + #ifndef NO_SKID + dup->extAuthKeyIdSet = ent->extAuthKeyIdSet; + if (dup->extAuthKeyIdSet) + XMEMCPY(dup->extAuthKeyId, ent->extAuthKeyId, KEYID_SIZE); + #endif + } + else { + dup->toBeSigned = NULL; + dup->tbsSz = 0; + dup->signature = NULL; + dup->signatureSz = 0; + } + + return dup; +} + + +/* returns the head of a deep copy of the list on success and null on fail */ +static CRL_Entry* DupCRL_list(CRL_Entry* crl, void* heap) +{ + CRL_Entry* current; + CRL_Entry* head = NULL; + CRL_Entry* prev = NULL; + + current = crl; + while (current != NULL) { + CRL_Entry* tmp = DupCRL_Entry(current, heap); + if (tmp != NULL) { + tmp->next = NULL; + if (head == NULL) + head = tmp; + if (prev != NULL) + prev->next = tmp; + } + current = current->next; + } + return head; +} + + +/* Duplicates everything except the parent cm pointed to. + * Expects that Init has already been done to 'dup' + * return 0 on success */ +static int DupX509_CRL(WOLFSSL_X509_CRL *dup, WOLFSSL_X509_CRL* crl) +{ + if (dup == NULL || crl == NULL) { + return BAD_FUNC_ARG; + } + + dup->crlList = DupCRL_list(crl->crlList, dup->heap); +#ifdef HAVE_CRL_IO + dup->crlIOCb = crl->crlIOCb; +#endif + if (crl->monitors[0].path) { + int pathSz = (int)XSTRLEN(crl->monitors[0].path) + 1; + dup->monitors[0].path = (char*)XMALLOC(pathSz, dup->heap, + DYNAMIC_TYPE_CRL_MONITOR); + if (dup->monitors[0].path != NULL) { + XSTRNCPY(dup->monitors[0].path, crl->monitors[0].path, pathSz); + } + } + + if (crl->monitors[1].path) { + int pathSz = (int)XSTRLEN(crl->monitors[1].path) + 1; + dup->monitors[1].path = (char*)XMALLOC(pathSz, dup->heap, + DYNAMIC_TYPE_CRL_MONITOR); + if (dup->monitors[1].path != NULL) { + XSTRNCPY(dup->monitors[1].path, crl->monitors[1].path, pathSz); + } + } + + return 0; +} + +/* returns WOLFSSL_SUCCESS on success. Does not take ownership of newcrl */ int wolfSSL_X509_STORE_add_crl(WOLFSSL_X509_STORE *store, WOLFSSL_X509_CRL *newcrl) { CRL_Entry *crle; - WOLFSSL_CRL *crl; + WOLFSSL_X509_CRL *crl; WOLFSSL_ENTER("wolfSSL_X509_STORE_add_crl"); - if (store == NULL || newcrl == NULL) + if (store == NULL || newcrl == NULL || store->cm == NULL) return BAD_FUNC_ARG; - crl = store->crl; - crle = newcrl->crlList; - - if (wc_LockMutex(&crl->crlLock) != 0) - { - WOLFSSL_MSG("wc_LockMutex failed"); - return BAD_MUTEX_E; + if (store->cm->crl == NULL) { + crl = wolfSSL_X509_crl_new(store->cm); + DupX509_CRL(crl, newcrl); + store->crl = store->cm->crl = crl; + return WOLFSSL_SUCCESS; + } + + /* find tail of current list and add new list */ + crl = store->cm->crl; + crle = crl->crlList; + if (newcrl->crlList != NULL) { + CRL_Entry *tail = crle; + CRL_Entry *toAdd; + + if (wc_LockMutex(&crl->crlLock) != 0) + { + WOLFSSL_MSG("wc_LockMutex failed"); + return BAD_MUTEX_E; + } + + toAdd = DupCRL_list(newcrl->crlList, crl->heap); + if (tail == NULL) { + crl->crlList = toAdd; + } + else { + while (tail->next != NULL) tail = tail->next; + tail->next = toAdd; + } + wc_UnLockMutex(&crl->crlLock); } - crle->next = crl->crlList; - crl->crlList = crle; - newcrl->crlList = NULL; - wc_UnLockMutex(&crl->crlLock); WOLFSSL_LEAVE("wolfSSL_X509_STORE_add_crl", WOLFSSL_SUCCESS); diff --git a/src/ssl.c b/src/ssl.c index 0bdcbe418..1106300e8 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -22738,12 +22738,7 @@ WOLFSSL_X509_STORE* wolfSSL_X509_STORE_new(void) goto err_exit; #ifdef HAVE_CRL - store->crl = NULL; - if ((store->crl = (WOLFSSL_X509_CRL *)XMALLOC(sizeof(WOLFSSL_X509_CRL), - NULL, DYNAMIC_TYPE_TMP_BUFFER)) == NULL) - goto err_exit; - if (InitCRL(store->crl, NULL) < 0) - goto err_exit; + store->crl = store->cm->crl; #endif #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) @@ -22771,10 +22766,6 @@ void wolfSSL_X509_STORE_free(WOLFSSL_X509_STORE* store) if (store != NULL && store->isDynamic) { if (store->cm != NULL) wolfSSL_CertManagerFree(store->cm); -#ifdef HAVE_CRL - if (store->crl != NULL) - wolfSSL_X509_CRL_free(store->crl); -#endif #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) if (store->param != NULL) XFREE(store->param, NULL, DYNAMIC_TYPE_OPENSSL); @@ -22989,7 +22980,8 @@ int wolfSSL_X509_verify_cert(WOLFSSL_X509_STORE_CTX* ctx) wolfSSL_X509_STORE_CTX_set_error(ctx, error); wolfSSL_X509_STORE_CTX_set_error_depth(ctx, depth); - ctx->store->verify_cb(0, ctx); + if (ctx->store && ctx->store->verify_cb) + ctx->store->verify_cb(0, ctx); } error = 0; @@ -23184,8 +23176,8 @@ WOLFSSL_X509_CRL* wolfSSL_d2i_X509_CRL(WOLFSSL_X509_CRL** crl, if (in == NULL) { WOLFSSL_MSG("Bad argument value"); } else { - newcrl = (WOLFSSL_X509_CRL*)XMALLOC(sizeof(WOLFSSL_X509_CRL), NULL, - DYNAMIC_TYPE_TMP_BUFFER); + newcrl =(WOLFSSL_X509_CRL*)XMALLOC(sizeof(WOLFSSL_X509_CRL), NULL, + DYNAMIC_TYPE_CRL); if (newcrl == NULL){ WOLFSSL_MSG("New CRL allocation failed"); } else { diff --git a/wolfssl/ssl.h b/wolfssl/ssl.h index 606e2c12d..551b68aa1 100644 --- a/wolfssl/ssl.h +++ b/wolfssl/ssl.h @@ -517,7 +517,7 @@ struct WOLFSSL_X509_STORE { WOLFSSL_CRYPTO_EX_DATA ex_data; #endif #if (defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)) && defined(HAVE_CRL) - WOLFSSL_X509_CRL *crl; + WOLFSSL_X509_CRL *crl; /* points to cm->crl */ #endif }; From 0a38ab8ac27628bb9231b53a4cff92ac4b7c8740 Mon Sep 17 00:00:00 2001 From: David Garske Date: Wed, 17 Jun 2020 11:00:05 -0700 Subject: [PATCH 240/298] Fix for possible use of NULL is the OCSP response nonce. This is optional and may not be provided in the OCSP response and should be skipped if not set in the response. ZD 10475. --- wolfcrypt/src/asn.c | 28 ++++++++++------------------ 1 file changed, 10 insertions(+), 18 deletions(-) diff --git a/wolfcrypt/src/asn.c b/wolfcrypt/src/asn.c index 91cbab76e..3a5a759cb 100644 --- a/wolfcrypt/src/asn.c +++ b/wolfcrypt/src/asn.c @@ -16995,64 +16995,56 @@ int CompareOcspReqResp(OcspRequest* req, OcspResponse* resp) WOLFSSL_ENTER("CompareOcspReqResp"); - if (req == NULL) - { + if (req == NULL) { WOLFSSL_MSG("\tReq missing"); return -1; } - - if (resp == NULL) - { + if (resp == NULL || resp->issuerHash == NULL || + resp->issuerKeyHash == NULL || resp->status == NULL) { WOLFSSL_MSG("\tResp missing"); return 1; } /* Nonces are not critical. The responder may not necessarily add * the nonce to the response. */ - if (req->nonceSz + if (req->nonceSz && resp->nonce != NULL #ifndef WOLFSSL_FORCE_OCSP_NONCE_CHECK && resp->nonceSz != 0 #endif ) { cmp = req->nonceSz - resp->nonceSz; - if (cmp != 0) - { + if (cmp != 0) { WOLFSSL_MSG("\tnonceSz mismatch"); return cmp; } cmp = XMEMCMP(req->nonce, resp->nonce, req->nonceSz); - if (cmp != 0) - { + if (cmp != 0) { WOLFSSL_MSG("\tnonce mismatch"); return cmp; } } cmp = XMEMCMP(req->issuerHash, resp->issuerHash, KEYID_SIZE); - if (cmp != 0) - { + if (cmp != 0) { WOLFSSL_MSG("\tissuerHash mismatch"); return cmp; } cmp = XMEMCMP(req->issuerKeyHash, resp->issuerKeyHash, KEYID_SIZE); - if (cmp != 0) - { + if (cmp != 0) { WOLFSSL_MSG("\tissuerKeyHash mismatch"); return cmp; } cmp = req->serialSz - resp->status->serialSz; - if (cmp != 0) - { + if (cmp != 0) { WOLFSSL_MSG("\tserialSz mismatch"); return cmp; } cmp = XMEMCMP(req->serial, resp->status->serial, req->serialSz); - if (cmp != 0) - { + if (cmp != 0) { WOLFSSL_MSG("\tserial mismatch"); return cmp; } From 81892f45940160ef3a1d05544b3818bc11ce2556 Mon Sep 17 00:00:00 2001 From: David Garske Date: Wed, 17 Jun 2020 11:16:33 -0700 Subject: [PATCH 241/298] Fix for use of `WC_MAX_SYM_KEY_SIZE` in macro. Fixes build case with `--enable-nullcipher --disable-aes`. --- wolfssl/wolfcrypt/wc_encrypt.h | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/wolfssl/wolfcrypt/wc_encrypt.h b/wolfssl/wolfcrypt/wc_encrypt.h index 6d26e2cba..a5c33807d 100644 --- a/wolfssl/wolfcrypt/wc_encrypt.h +++ b/wolfssl/wolfcrypt/wc_encrypt.h @@ -28,24 +28,33 @@ #define WOLF_CRYPT_ENCRYPT_H #include -#include -#include -#include -#include +#ifndef NO_AES + #include +#endif +#ifdef HAVE_CHACHA + #include +#endif +#ifndef NO_DES3 + #include +#endif +#ifndef NO_RC4 + #include +#endif #ifdef __cplusplus extern "C" { #endif -/* determine max cipher key size */ +/* determine max cipher key size - cannot use enum values here, must be define, + * since WC_MAX_SYM_KEY_SIZE is used in if macro logic. */ #ifndef NO_AES #define WC_MAX_SYM_KEY_SIZE (AES_MAX_KEY_SIZE/8) #elif defined(HAVE_CHACHA) - #define WC_MAX_SYM_KEY_SIZE CHACHA_MAX_KEY_SZ + #define WC_MAX_SYM_KEY_SIZE 32 /* CHACHA_MAX_KEY_SZ */ #elif !defined(NO_DES3) - #define WC_MAX_SYM_KEY_SIZE DES3_KEY_SIZE + #define WC_MAX_SYM_KEY_SIZE 24 /* DES3_KEY_SIZE */ #elif !defined(NO_RC4) - #define WC_MAX_SYM_KEY_SIZE RC4_KEY_SIZE + #define WC_MAX_SYM_KEY_SIZE 16 /* RC4_KEY_SIZE */ #else #define WC_MAX_SYM_KEY_SIZE 32 #endif From 3fb432cef80404daacf894308cb9a726a7cf6c9b Mon Sep 17 00:00:00 2001 From: David Garske Date: Wed, 17 Jun 2020 11:20:08 -0700 Subject: [PATCH 242/298] Fix for building async without DTLS. --- src/internal.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/internal.c b/src/internal.c index 42e8ac540..cbea8d139 100644 --- a/src/internal.c +++ b/src/internal.c @@ -14887,7 +14887,7 @@ int ProcessReply(WOLFSSL* ssl) return ssl->error; } -#ifdef WOLFSSL_ASYNC_CRYPT +#if defined(WOLFSSL_DTLS) && defined(WOLFSSL_ASYNC_CRYPT) /* process any pending DTLS messages - this flow can happen with async */ if (ssl->dtls_rx_msg_list != NULL) { ret = DtlsMsgDrain(ssl); From e2fb4c55b8f7e5ffddec9d5c008e8dbbcbed9043 Mon Sep 17 00:00:00 2001 From: kaleb-himes Date: Wed, 17 Jun 2020 13:26:03 -0600 Subject: [PATCH 243/298] Resolve issues with FIPSv2 when opensslall set --- src/ssl.c | 5 +++++ tests/api.c | 23 ++++++++++++++++++----- wolfcrypt/src/asn.c | 4 ++-- wolfcrypt/src/evp.c | 15 +++++++++++++++ wolfcrypt/test/test.c | 10 +++++++++- 5 files changed, 49 insertions(+), 8 deletions(-) diff --git a/src/ssl.c b/src/ssl.c index eebf19b75..e79535476 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -7562,6 +7562,8 @@ WOLFSSL_EVP_PKEY* wolfSSL_d2i_PUBKEY(WOLFSSL_EVP_PKEY** out, #endif /* NO_DSA */ #if !defined(NO_DH) && (defined(WOLFSSL_QT) || defined(OPENSSL_ALL)) + #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && \ + (HAVE_FIPS_VERSION > 2)) { DhKey dh; word32 keyIdx = 0; @@ -7605,6 +7607,7 @@ WOLFSSL_EVP_PKEY* wolfSSL_d2i_PUBKEY(WOLFSSL_EVP_PKEY** out, } wc_FreeDhKey(&dh); } + #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */ #endif /* !NO_DH && (WOLFSSL_QT || OPENSSL_ALL) */ return pkey; @@ -7729,6 +7732,7 @@ WOLFSSL_EVP_PKEY* wolfSSL_d2i_PrivateKey(int type, WOLFSSL_EVP_PKEY** out, break; #endif /* NO_DSA */ #ifndef NO_DH +#if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2)) case EVP_PKEY_DH: local->ownDh = 1; local->dh = wolfSSL_DH_new(); @@ -7743,6 +7747,7 @@ WOLFSSL_EVP_PKEY* wolfSSL_d2i_PrivateKey(int type, WOLFSSL_EVP_PKEY** out, return NULL; } break; +#endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */ #endif /* HAVE_DH */ #endif /* WOLFSSL_QT || OPENSSL_ALL */ default: diff --git a/tests/api.c b/tests/api.c index f289dd513..8b705c149 100644 --- a/tests/api.c +++ b/tests/api.c @@ -26499,6 +26499,7 @@ static void test_wolfSSL_PEM_write_DHparams(void) { #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT) #if defined(OPENSSL_EXTRA) && !defined(NO_DH) && !defined(NO_FILESYSTEM) +#if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2)) DH* dh; BIO* bio; XFILE fp; @@ -26538,6 +26539,7 @@ tgZl96bcAGdru8OpQYP7x/rI4h5+rwA/kwIBAg==\n\ XFCLOSE(fp); printf(resultFmt, passed); +#endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */ #endif /* OPENSSL_ALL || OPENSSL_QT */ #endif } @@ -27444,6 +27446,7 @@ static void test_wolfSSL_X509_PUBKEY_get(void) static void test_wolfSSL_d2i_DHparams() { #if !defined(NO_DH) +#if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2)) FILE* f = NULL; unsigned char buf[4096]; const unsigned char* pt = buf; @@ -27498,13 +27501,14 @@ static void test_wolfSSL_d2i_DHparams() DH_free(dh); printf(resultFmt, passed); - -#endif +#endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */ +#endif /* !NO_DH */ } static void test_wolfSSL_i2d_DHparams() { #if !defined(NO_DH) +#if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2)) FILE* f; unsigned char buf[4096]; const unsigned char* pt = buf; @@ -27557,6 +27561,7 @@ static void test_wolfSSL_i2d_DHparams() DH_free(dh); printf(resultFmt, passed); +#endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */ #endif } @@ -27772,6 +27777,7 @@ static void test_wolfSSL_EVP_PKEY_set1_get1_EC_KEY (void) static void test_wolfSSL_EVP_PKEY_set1_get1_DH (void) { #if !defined(NO_DH) +#if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2)) DH *dh = NULL; DH *setDh = NULL; EVP_PKEY *pkey = NULL; @@ -27814,6 +27820,7 @@ static void test_wolfSSL_EVP_PKEY_set1_get1_DH (void) DH_free(setDh); DH_free(dh); printf(resultFmt, passed); +#endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */ #endif /* NO_DH */ } /* END test_EVP_PKEY_set1_get1_DH */ @@ -28717,6 +28724,7 @@ static void test_wolfSSL_OCSP_get0_info() static void test_wolfSSL_EVP_PKEY_derive(void) { #ifdef OPENSSL_ALL +#if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2)) EVP_PKEY_CTX *ctx; unsigned char *skey; size_t skeylen; @@ -28763,13 +28771,15 @@ static void test_wolfSSL_EVP_PKEY_derive(void) EVP_PKEY_free(peerkey); EVP_PKEY_free(pkey); XFREE(skey, NULL, DYNAMIC_TYPE_OPENSSL); -#endif -#endif +#endif /* HAVE_ECC */ +#endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */ +#endif /* OPENSSL_ALL */ } static void test_wolfSSL_RSA_padding_add_PKCS1_PSS(void) { #if defined(OPENSSL_ALL) && defined(WC_RSA_PSS) && !defined(WC_NO_RNG) +#if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2)) RSA *rsa; const unsigned char *derBuf = client_key_der_2048; unsigned char em[256] = {0}; /* len = 2048/8 */ @@ -28785,7 +28795,8 @@ static void test_wolfSSL_RSA_padding_add_PKCS1_PSS(void) AssertIntEQ(RSA_verify_PKCS1_PSS(rsa, mHash, EVP_sha256(), em, -1), 1); RSA_free(rsa); -#endif +#endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */ +#endif /* OPENSSL_ALL && WC_RSA_PSS && !WC_NO_RNG*/ } static void test_wolfSSL_EC_get_builtin_curves(void) @@ -31174,6 +31185,7 @@ static void test_wolfSSL_IMPLEMENT_ASN1_FUNCTIONS() { /* Testing code used in dpp.c in hostap */ #if defined(OPENSSL_ALL) && defined(HAVE_ECC) && defined(USE_CERT_BUFFERS_256) +#if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2)) EC_KEY *eckey; EVP_PKEY *key; size_t len; @@ -31223,6 +31235,7 @@ static void test_wolfSSL_IMPLEMENT_ASN1_FUNCTIONS() EVP_PKEY_free(key); EC_KEY_free(eckey); DPP_BOOTSTRAPPING_KEY_free(bootstrap); +#endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */ #endif /* WOLFSSL_WPAS && HAVE_ECC && USE_CERT_BUFFERS_256 */ } diff --git a/wolfcrypt/src/asn.c b/wolfcrypt/src/asn.c index 91cbab76e..9e528fdc4 100644 --- a/wolfcrypt/src/asn.c +++ b/wolfcrypt/src/asn.c @@ -11505,7 +11505,7 @@ static int SetEccPublicKey(byte* output, ecc_key* key, int with_header) return MEMORY_E; #endif -#ifdef HAVE_SELFTEST +#if defined(HAVE_SELFTEST) || defined(HAVE_FIPS) /* older version of ecc.c can not handle dp being NULL */ if (key != NULL && key->dp == NULL) { ret = BAD_FUNC_ARG; @@ -11612,7 +11612,7 @@ int wc_EccPublicKeyToDer(ecc_key* key, byte* output, word32 inLen, infoSz += TRAILING_ZERO; } -#ifdef HAVE_SELFTEST +#if defined(HAVE_SELFTEST) || defined(HAVE_FIPS) /* older version of ecc.c can not handle dp being NULL */ if (key != NULL && key->dp == NULL) { keySz = 1 + 2 * MAX_ECC_BYTES; diff --git a/wolfcrypt/src/evp.c b/wolfcrypt/src/evp.c index 6b73d87e1..9682adb4d 100644 --- a/wolfcrypt/src/evp.c +++ b/wolfcrypt/src/evp.c @@ -35,6 +35,19 @@ #if defined(OPENSSL_EXTRA) +#if !defined(HAVE_PKCS7) && \ + ((defined(HAVE_FIPS) && defined(HAVE_FIPS_VERSION) && \ + (HAVE_FIPS_VERSION >= 2)) || defined(HAVE_SELFTEST)) +enum { + /* In the event of fips cert 3389 or CAVP selftest build, these enums are + * not in aes.h for use with evp so enumerate it here outside the fips + * boundary */ + GCM_NONCE_MID_SZ = 12, /* The usual default nonce size for AES-GCM. */ + CCM_NONCE_MIN_SZ = 7, +}; +#endif + + #include #include @@ -5993,6 +6006,7 @@ WOLFSSL_DH* wolfSSL_EVP_PKEY_get0_DH(WOLFSSL_EVP_PKEY* key) return key->dh; } +#if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2)) WOLFSSL_DH* wolfSSL_EVP_PKEY_get1_DH(WOLFSSL_EVP_PKEY* key) { WOLFSSL_DH* local = NULL; @@ -6026,6 +6040,7 @@ WOLFSSL_DH* wolfSSL_EVP_PKEY_get1_DH(WOLFSSL_EVP_PKEY* key) return local; } +#endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */ #endif /* NO_DH && NO_FILESYSTEM */ int wolfSSL_EVP_PKEY_assign(WOLFSSL_EVP_PKEY *pkey, int type, void *key) diff --git a/wolfcrypt/test/test.c b/wolfcrypt/test/test.c index 5660de8cf..c76bab627 100644 --- a/wolfcrypt/test/test.c +++ b/wolfcrypt/test/test.c @@ -24359,7 +24359,11 @@ static int pkcs7enveloped_run_vectors(byte* rsaCert, word32 rsaCertSz, #if !defined(NO_PWDBASED) && !defined(NO_AES) && \ !defined(NO_SHA) && defined(WOLFSSL_AES_128) - char password[] = "password"; + #ifndef HAVE_FIPS + char password[] = "password"; /* NOTE: Password is too short for FIPS */ + #else + char password[] = "passwordFIPS_MODE"; + #endif byte salt[] = { 0x12, 0x34, 0x56, 0x78, 0x78, 0x56, 0x34, 0x12 @@ -24914,7 +24918,11 @@ static int pkcs7authenveloped_run_vectors(byte* rsaCert, word32 rsaCertSz, #if !defined(NO_PWDBASED) && !defined(NO_AES) && defined(HAVE_AESGCM) && \ !defined(NO_SHA) && defined(WOLFSSL_AES_128) + #ifndef HAVE_FIPS char password[] = "password"; + #else + char password[] = "passwordFIPS_MODE"; + #endif byte salt[] = { 0x12, 0x34, 0x56, 0x78, 0x78, 0x56, 0x34, 0x12 From f75659641aadcf89e4adf53d9c0d1f3f182f2b47 Mon Sep 17 00:00:00 2001 From: Jacob Barthelmeh Date: Wed, 17 Jun 2020 14:33:10 -0600 Subject: [PATCH 244/298] test on malformed name constraint --- tests/api.c | 72 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/tests/api.c b/tests/api.c index f289dd513..79744d36a 100644 --- a/tests/api.c +++ b/tests/api.c @@ -1202,6 +1202,77 @@ static int test_wolfSSL_CertManagerSetVerify(void) return ret; } +static void test_wolfSSL_CertManagerNameConstraint(void) +{ +#if !defined(NO_FILESYSTEM) && !defined(NO_CERTS) && \ + !defined(NO_WOLFSSL_CM_VERIFY) && !defined(NO_RSA) && \ + defined(OPENSSL_EXTRA) && defined(WOLFSSL_CERT_GEN) && \ + defined(WOLFSSL_CERT_EXT) && defined(WOLFSSL_ALT_NAMES) + WOLFSSL_CERT_MANAGER* cm; + const char* ca_cert = "./certs/test/cert-ext-nc.der"; + const char* client_cert = "./certs/test/server-goodcn.der"; + int i = 0; + static const byte extNameConsOid[] = {85, 29, 30}; + + RsaKey key; + WC_RNG rng; + byte *der; + int derSz; + word32 idx = 0; + byte *pt; + WOLFSSL_X509 *x509; + + wc_InitRng(&rng); + + /* load in CA private key for signing */ + AssertIntEQ(wc_InitRsaKey_ex(&key, HEAP_HINT, devId), 0); + AssertIntEQ(wc_RsaPrivateKeyDecode(server_key_der_2048, &idx, &key, + sizeof_server_key_der_2048), 0); + + /* get ca certificate then alter it */ + AssertNotNull(der = + (byte*)XMALLOC(FOURK_BUF, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER)); + AssertNotNull(x509 = wolfSSL_X509_load_certificate_file(ca_cert, + WOLFSSL_FILETYPE_ASN1)); + AssertNotNull(pt = (byte*)wolfSSL_X509_get_tbs(x509, &derSz)); + XMEMCPY(der, pt, derSz); + + /* find the name constraint extension and alter it */ + pt = der; + for (i = 0; i < derSz - 3; i++) { + if (XMEMCMP(pt, extNameConsOid, 3) == 0) { + pt += 3; + break; + } + pt++; + } + AssertIntNE(i, derSz - 3); /* did not find OID if this case is hit */ + + /* go to the length value and set it to 0 */ + while (i < derSz && *pt != 0x81) { + pt++; + i++; + } + AssertIntNE(i, derSz); /* did not place to alter */ + pt++; + *pt = 0x00; + + /* resign the altered certificate */ + AssertIntGT((derSz = wc_SignCert(derSz, CTC_SHA256wRSA, der, + FOURK_BUF, &key, NULL, &rng)), 0); + + AssertNotNull(cm = wolfSSL_CertManagerNew()); + AssertIntEQ(wolfSSL_CertManagerLoadCABuffer(cm, der, derSz, + WOLFSSL_FILETYPE_ASN1), ASN_PARSE_E); + wolfSSL_CertManagerFree(cm); + + XFREE(der, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + wolfSSL_X509_free(x509); + wc_FreeRng(&rng); + wolfSSL_CertManagerFree(cm); +#endif +} + static void test_wolfSSL_CertManagerCRL(void) { #if !defined(NO_FILESYSTEM) && !defined(NO_CERTS) && defined(HAVE_CRL) && \ @@ -32081,6 +32152,7 @@ void ApiTest(void) test_wolfSSL_CertManagerLoadCABuffer(); test_wolfSSL_CertManagerGetCerts(); test_wolfSSL_CertManagerSetVerify(); + test_wolfSSL_CertManagerNameConstraint(); test_wolfSSL_CertManagerCRL(); test_wolfSSL_CTX_load_verify_locations_ex(); test_wolfSSL_CTX_load_verify_buffer_ex(); From dafd35e4c117488a848d488899bd291491266c3e Mon Sep 17 00:00:00 2001 From: Jacob Barthelmeh Date: Wed, 17 Jun 2020 15:55:08 -0600 Subject: [PATCH 245/298] remove unused variable --- tests/api.c | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/api.c b/tests/api.c index 79744d36a..8416860ee 100644 --- a/tests/api.c +++ b/tests/api.c @@ -1210,7 +1210,6 @@ static void test_wolfSSL_CertManagerNameConstraint(void) defined(WOLFSSL_CERT_EXT) && defined(WOLFSSL_ALT_NAMES) WOLFSSL_CERT_MANAGER* cm; const char* ca_cert = "./certs/test/cert-ext-nc.der"; - const char* client_cert = "./certs/test/server-goodcn.der"; int i = 0; static const byte extNameConsOid[] = {85, 29, 30}; From 0fd5eda5af2b6a784116ea83de8e5754e9d07558 Mon Sep 17 00:00:00 2001 From: David Garske Date: Wed, 17 Jun 2020 17:08:09 -0700 Subject: [PATCH 246/298] Fix for `test_wolfSSL_DTLS_either_side`, which was not properly free'ing in error case. Improves the test shared context logic to make it explicit. --- tests/api.c | 116 +++++++++++++++++++++++++++---------------------- wolfssl/test.h | 1 + 2 files changed, 64 insertions(+), 53 deletions(-) diff --git a/tests/api.c b/tests/api.c index 8cb8c5f16..0c2468fb0 100644 --- a/tests/api.c +++ b/tests/api.c @@ -2732,7 +2732,7 @@ static void test_client_nofail(void* args, void *cb) #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EITHER_SIDE) if (cbf != NULL && cbf->ctx) { ctx = cbf->ctx; - sharedCtx = 1; + sharedCtx = cbf->isSharedCtx; } else #endif @@ -3865,44 +3865,44 @@ static void test_wolfSSL_UseSNI_connection(void) unsigned long i; callback_functions callbacks[] = { /* success case at ctx */ - {0, use_SNI_at_ctx, 0, 0, 0}, - {0, use_SNI_at_ctx, 0, verify_SNI_real_matching, 0}, + {0, use_SNI_at_ctx, 0, 0, 0, 0}, + {0, use_SNI_at_ctx, 0, verify_SNI_real_matching, 0, 0}, /* success case at ssl */ - {0, 0, use_SNI_at_ssl, verify_SNI_real_matching, 0}, - {0, 0, use_SNI_at_ssl, verify_SNI_real_matching, 0}, + {0, 0, use_SNI_at_ssl, verify_SNI_real_matching, 0, 0}, + {0, 0, use_SNI_at_ssl, verify_SNI_real_matching, 0, 0}, /* default mismatch behavior */ - {0, 0, different_SNI_at_ssl, verify_FATAL_ERROR_on_client, 0}, - {0, 0, use_SNI_at_ssl, verify_UNKNOWN_SNI_on_server, 0}, + {0, 0, different_SNI_at_ssl, verify_FATAL_ERROR_on_client, 0, 0}, + {0, 0, use_SNI_at_ssl, verify_UNKNOWN_SNI_on_server, 0, 0}, /* continue on mismatch */ - {0, 0, different_SNI_at_ssl, 0, 0}, - {0, 0, use_SNI_WITH_CONTINUE_at_ssl, verify_SNI_no_matching, 0}, + {0, 0, different_SNI_at_ssl, 0, 0, 0}, + {0, 0, use_SNI_WITH_CONTINUE_at_ssl, verify_SNI_no_matching, 0, 0}, /* fake answer on mismatch */ - {0, 0, different_SNI_at_ssl, 0, 0}, - {0, 0, use_SNI_WITH_FAKE_ANSWER_at_ssl, verify_SNI_fake_matching, 0}, + {0, 0, different_SNI_at_ssl, 0, 0, 0}, + {0, 0, use_SNI_WITH_FAKE_ANSWER_at_ssl, verify_SNI_fake_matching, 0, 0}, /* sni abort - success */ - {0, use_SNI_at_ctx, 0, 0, 0}, - {0, use_MANDATORY_SNI_at_ctx, 0, verify_SNI_real_matching, 0}, + {0, use_SNI_at_ctx, 0, 0, 0, 0}, + {0, use_MANDATORY_SNI_at_ctx, 0, verify_SNI_real_matching, 0, 0}, /* sni abort - abort when absent (ctx) */ - {0, 0, 0, verify_FATAL_ERROR_on_client, 0}, - {0, use_MANDATORY_SNI_at_ctx, 0, verify_SNI_ABSENT_on_server, 0}, + {0, 0, 0, verify_FATAL_ERROR_on_client, 0, 0}, + {0, use_MANDATORY_SNI_at_ctx, 0, verify_SNI_ABSENT_on_server, 0, 0}, /* sni abort - abort when absent (ssl) */ - {0, 0, 0, verify_FATAL_ERROR_on_client, 0}, - {0, 0, use_MANDATORY_SNI_at_ssl, verify_SNI_ABSENT_on_server, 0}, + {0, 0, 0, verify_FATAL_ERROR_on_client, 0, 0}, + {0, 0, use_MANDATORY_SNI_at_ssl, verify_SNI_ABSENT_on_server, 0, 0}, /* sni abort - success when overwritten */ - {0, 0, 0, 0, 0}, - {0, use_MANDATORY_SNI_at_ctx, use_SNI_at_ssl, verify_SNI_no_matching, 0}, + {0, 0, 0, 0, 0, 0}, + {0, use_MANDATORY_SNI_at_ctx, use_SNI_at_ssl, verify_SNI_no_matching, 0, 0}, /* sni abort - success when allowing mismatches */ - {0, 0, different_SNI_at_ssl, 0, 0}, - {0, use_PSEUDO_MANDATORY_SNI_at_ctx, 0, verify_SNI_fake_matching, 0}, + {0, 0, different_SNI_at_ssl, 0, 0, 0}, + {0, use_PSEUDO_MANDATORY_SNI_at_ctx, 0, verify_SNI_fake_matching, 0, 0}, }; for (i = 0; i < sizeof(callbacks) / sizeof(callback_functions); i += 2) { @@ -4341,37 +4341,37 @@ static void test_wolfSSL_UseALPN_connection(void) unsigned long i; callback_functions callbacks[] = { /* success case same list */ - {0, 0, use_ALPN_all, 0, 0}, - {0, 0, use_ALPN_all, verify_ALPN_matching_http1, 0}, + {0, 0, use_ALPN_all, 0, 0, 0}, + {0, 0, use_ALPN_all, verify_ALPN_matching_http1, 0, 0}, /* success case only one for server */ - {0, 0, use_ALPN_all, 0, 0}, - {0, 0, use_ALPN_one, verify_ALPN_matching_spdy2, 0}, + {0, 0, use_ALPN_all, 0, 0, 0}, + {0, 0, use_ALPN_one, verify_ALPN_matching_spdy2, 0, 0}, /* success case only one for client */ - {0, 0, use_ALPN_one, 0, 0}, - {0, 0, use_ALPN_all, verify_ALPN_matching_spdy2, 0}, + {0, 0, use_ALPN_one, 0, 0, 0}, + {0, 0, use_ALPN_all, verify_ALPN_matching_spdy2, 0, 0}, /* success case none for client */ - {0, 0, 0, 0, 0}, - {0, 0, use_ALPN_all, 0, 0}, + {0, 0, 0, 0, 0, 0}, + {0, 0, use_ALPN_all, 0, 0, 0}, /* success case mismatch behavior but option 'continue' set */ - {0, 0, use_ALPN_all_continue, verify_ALPN_not_matching_continue, 0}, - {0, 0, use_ALPN_unknown_continue, 0, 0}, + {0, 0, use_ALPN_all_continue, verify_ALPN_not_matching_continue, 0, 0}, + {0, 0, use_ALPN_unknown_continue, 0, 0, 0}, /* success case read protocol send by client */ - {0, 0, use_ALPN_all, 0, 0}, - {0, 0, use_ALPN_one, verify_ALPN_client_list, 0}, + {0, 0, use_ALPN_all, 0, 0, 0}, + {0, 0, use_ALPN_one, verify_ALPN_client_list, 0, 0}, /* mismatch behavior with same list * the first and only this one must be taken */ - {0, 0, use_ALPN_all, 0, 0}, - {0, 0, use_ALPN_all, verify_ALPN_not_matching_spdy3, 0}, + {0, 0, use_ALPN_all, 0, 0, 0}, + {0, 0, use_ALPN_all, verify_ALPN_not_matching_spdy3, 0, 0}, /* default mismatch behavior */ - {0, 0, use_ALPN_all, 0, 0}, - {0, 0, use_ALPN_unknown, verify_ALPN_FATAL_ERROR_on_client, 0}, + {0, 0, use_ALPN_all, 0, 0, 0}, + {0, 0, use_ALPN_unknown, verify_ALPN_FATAL_ERROR_on_client, 0, 0}, }; for (i = 0; i < sizeof(callbacks) / sizeof(callback_functions); i += 2) { @@ -22932,17 +22932,20 @@ static void test_wolfSSL_msgCb(void) client_args.callbacks = &client_cb; client_args.return_code = TEST_FAIL; - #ifndef SINGLE_THREADED +#ifndef SINGLE_THREADED start_thread(test_server_nofail, &server_args, &serverThread); wait_tcp_ready(&server_args); test_client_nofail(&client_args, (void *)msgCb); join_thread(serverThread); - AssertTrue(client_args.return_code); - AssertTrue(server_args.return_code); - #endif +#endif FreeTcpReady(&ready); +#ifndef SINGLE_THREADED + AssertTrue(client_args.return_code); + AssertTrue(server_args.return_code); +#endif + #ifdef WOLFSSL_TIRTOS fdOpenSession(Task_self()); #endif @@ -22986,6 +22989,8 @@ static void test_wolfSSL_either_side(void) client_cb.ctx = wolfSSL_CTX_new(wolfSSLv23_method()); AssertNotNull(client_cb.ctx); server_cb.ctx = client_cb.ctx; + /* we are responsible for free'ing WOLFSSL_CTX */ + server_cb.isSharedCtx = client_cb.isSharedCtx = 1; server_args.signal = &ready; server_args.callbacks = &server_cb; @@ -22993,18 +22998,20 @@ static void test_wolfSSL_either_side(void) client_args.callbacks = &client_cb; client_args.return_code = TEST_FAIL; - #ifndef SINGLE_THREADED +#ifndef SINGLE_THREADED start_thread(test_server_nofail, &server_args, &serverThread); wait_tcp_ready(&server_args); test_client_nofail(&client_args, NULL); join_thread(serverThread); +#endif + + wolfSSL_CTX_free(client_cb.ctx); + FreeTcpReady(&ready); + +#ifndef SINGLE_THREADED AssertTrue(client_args.return_code); AssertTrue(server_args.return_code); - #endif - - wolfSSL_CTX_free(client_cb.ctx); - - FreeTcpReady(&ready); +#endif #ifdef WOLFSSL_TIRTOS fdOpenSession(Task_self()); @@ -23050,6 +23057,8 @@ static void test_wolfSSL_DTLS_either_side(void) client_cb.ctx = wolfSSL_CTX_new(wolfDTLS_method()); AssertNotNull(client_cb.ctx); server_cb.ctx = client_cb.ctx; + /* we are responsible for free'ing WOLFSSL_CTX */ + server_cb.isSharedCtx = client_cb.isSharedCtx = 1; server_args.signal = &ready; server_args.callbacks = &server_cb; @@ -23057,25 +23066,26 @@ static void test_wolfSSL_DTLS_either_side(void) client_args.callbacks = &client_cb; client_args.return_code = TEST_FAIL; - #ifndef SINGLE_THREADED +#ifndef SINGLE_THREADED start_thread(test_server_nofail, &server_args, &serverThread); wait_tcp_ready(&server_args); test_client_nofail(&client_args, NULL); join_thread(serverThread); - AssertTrue(client_args.return_code); - AssertTrue(server_args.return_code); - #endif +#endif wolfSSL_CTX_free(client_cb.ctx); - FreeTcpReady(&ready); +#ifndef SINGLE_THREADED + AssertTrue(client_args.return_code); + AssertTrue(server_args.return_code); +#endif + #ifdef WOLFSSL_TIRTOS fdOpenSession(Task_self()); #endif printf(resultFmt, passed); - #endif } diff --git a/wolfssl/test.h b/wolfssl/test.h index 2f133f985..e114b99f2 100644 --- a/wolfssl/test.h +++ b/wolfssl/test.h @@ -409,6 +409,7 @@ typedef struct callback_functions { ssl_callback ssl_ready; ssl_callback on_result; WOLFSSL_CTX* ctx; + unsigned char isSharedCtx:1; } callback_functions; typedef struct func_args { From 13753d56bbc443b80892bca325156f01b911c189 Mon Sep 17 00:00:00 2001 From: David Garske Date: Wed, 17 Jun 2020 17:11:54 -0700 Subject: [PATCH 247/298] Cleanup in `wc_ecc_sign_hash_ex` for blinding value to not call free twice (mp_clear already does mp_free). --- wolfcrypt/src/ecc.c | 1 - 1 file changed, 1 deletion(-) diff --git a/wolfcrypt/src/ecc.c b/wolfcrypt/src/ecc.c index 9dc0decc7..d6c480d17 100644 --- a/wolfcrypt/src/ecc.c +++ b/wolfcrypt/src/ecc.c @@ -5232,7 +5232,6 @@ int wc_ecc_sign_hash_ex(const byte* in, word32 inlen, WC_RNG* rng, } } mp_clear(b); - mp_free(b); #ifdef WOLFSSL_SMALL_STACK XFREE(b, key->heap, DYNAMIC_TYPE_ECC); #endif From 1d98c960cf71663f610a6507def453e9782291dc Mon Sep 17 00:00:00 2001 From: TakayukiMatsuo Date: Fri, 24 Apr 2020 18:55:03 +0900 Subject: [PATCH 248/298] Added resetting size info output-buffer before calling export APIs Added resetting size into output-buffer before calling export APIs --- tests/api.c | 632 +++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 472 insertions(+), 160 deletions(-) diff --git a/tests/api.c b/tests/api.c index f6b0ae435..dfcf53f1d 100644 --- a/tests/api.c +++ b/tests/api.c @@ -15189,215 +15189,527 @@ static int test_wc_curve25519_size (void) */ static int test_wc_curve25519_export_key_raw (void) { - int ret = 0; #if defined(HAVE_CURVE25519) && defined(HAVE_CURVE25519_KEY_EXPORT) - int rs; + curve25519_key key; WC_RNG rng; - int initdone = 0; - int keymade = 0; - int crvinit = 0; + byte privateKey[CURVE25519_KEYSIZE]; + byte publicKey[CURVE25519_KEYSIZE]; + word32 prvkSz; + word32 pubkSz; - byte privateKey[32]; - byte publicKey[32]; - word32 prvkSz = sizeof(privateKey); - word32 pubkSz = sizeof(publicKey); - - byte prik[32]; - byte pubk[32]; + byte prik[CURVE25519_KEYSIZE]; + byte pubk[CURVE25519_KEYSIZE]; word32 prksz; word32 pbksz; printf(testingFmt, "wc_curve25519_export_key_raw()"); - /* preparation for key export */ - if(0 == wc_InitRng(&rng)){initdone = 1;} - if(0 == wc_curve25519_init(&key)){crvinit = 1;} - if(0 == wc_curve25519_make_key(&rng, CURVE25519_KEYSIZE, &key)){keymade= 1;} - if( initdone !=1 || crvinit != 1 || keymade != 1 ){ - ret = SSL_FATAL_ERROR; + if(0 != wc_InitRng(&rng)){ + printf(testingFmt, "failed due to wc_InitRng"); + fflush( stdout ); + return 1; + } + + if(0 != wc_curve25519_init(&key)){ + printf(testingFmt, "failed due to wc_curve25519_init"); + fflush( stdout ); + wc_FreeRng(&rng); + return 1; + } + + if(0 != wc_curve25519_make_key(&rng, CURVE25519_KEYSIZE, &key)){ + printf(testingFmt, "failed due to wc_curve25519_make_key"); + fflush( stdout ); + wc_curve25519_free(&key); + wc_FreeRng(&rng); + return 1; + } + + /* + bad-argument-test cases + target function sould return BAD_FUNC_ARG + */ + prvkSz = CURVE25519_KEYSIZE; + pubkSz = CURVE25519_KEYSIZE; + + if(BAD_FUNC_ARG != wc_curve25519_export_key_raw( + NULL , privateKey, &prvkSz, publicKey, &pubkSz)){ + + printf(testingFmt,"failed at bad-arg-case-1."); + fflush( stdout ); + wc_curve25519_free(&key); + wc_FreeRng(&rng); + return 1; + + } + + prvkSz = CURVE25519_KEYSIZE; + pubkSz = CURVE25519_KEYSIZE; + + if(BAD_FUNC_ARG != wc_curve25519_export_key_raw( + &key , NULL, &prvkSz, publicKey, &pubkSz)){ + + printf(testingFmt,"failed at bad-arg-case-2."); + fflush( stdout ); + wc_curve25519_free(&key); + wc_FreeRng(&rng); + return 1; + + } + + prvkSz = CURVE25519_KEYSIZE; + pubkSz = CURVE25519_KEYSIZE; + + if(BAD_FUNC_ARG != wc_curve25519_export_key_raw( + &key , privateKey, NULL, publicKey, &pubkSz)){ + + printf(testingFmt,"failed at bad-arg-case-3."); + fflush( stdout ); + wc_curve25519_free(&key); + wc_FreeRng(&rng); + return 1; + + } + + prvkSz = CURVE25519_KEYSIZE; + pubkSz = CURVE25519_KEYSIZE; + + if(BAD_FUNC_ARG != wc_curve25519_export_key_raw( + &key , privateKey, &prvkSz, NULL, &pubkSz)){ + + printf(testingFmt,"failed at bad-arg-case-4."); + fflush( stdout ); + wc_curve25519_free(&key); + wc_FreeRng(&rng); + return 1; + + } + + prvkSz = CURVE25519_KEYSIZE; + pubkSz = CURVE25519_KEYSIZE; + + if(BAD_FUNC_ARG != wc_curve25519_export_key_raw( + &key , privateKey, &prvkSz, publicKey, NULL )){ + + printf(testingFmt,"failed at bad-arg-case-5."); + fflush( stdout ); + wc_curve25519_free(&key); + wc_FreeRng(&rng); + return 1; + + } + + /* + cross-testing + */ + prksz = CURVE25519_KEYSIZE; + + if( 0 != wc_curve25519_export_private_raw(&key, prik, &prksz)){ + + printf(testingFmt,"failed due to wc_curve25519_export_private_raw"); + fflush( stdout ); + wc_curve25519_free(&key); + wc_FreeRng(&rng); + return 1; + + } + + pbksz = CURVE25519_KEYSIZE; + + if(0 != wc_curve25519_export_public(&key, pubk, &pbksz)){ + + printf(testingFmt,"failed due to wc_curve25519_export_public"); + fflush( stdout ); + wc_curve25519_free(&key); + wc_FreeRng(&rng); + return 1; + + } + + prvkSz = CURVE25519_KEYSIZE; + pubkSz = CURVE25519_KEYSIZE; + + if(0 != wc_curve25519_export_key_raw(&key, privateKey, &prvkSz, + publicKey, &pubkSz)){ + + printf(testingFmt,"failed due to wc_curve25519_export_key_raw"); + fflush( stdout ); + wc_curve25519_free(&key); + wc_FreeRng(&rng); + return 1; + + } + + if((prksz == CURVE25519_KEYSIZE) && + (pbksz == CURVE25519_KEYSIZE) && + (prvkSz == CURVE25519_KEYSIZE) && + (pubkSz == CURVE25519_KEYSIZE)){ + + if( 0 == XMEMCMP(privateKey, prik, CURVE25519_KEYSIZE) && + 0 == XMEMCMP(publicKey, pubk, CURVE25519_KEYSIZE)){ + + printf(testingFmt,"passed"); + fflush( stdout ); + wc_curve25519_free(&key); + wc_FreeRng(&rng); + return 0; + + } + else{ + + printf(testingFmt,"failed due to key-contents-inconsistency."); + fflush( stdout ); + wc_curve25519_free(&key); + wc_FreeRng(&rng); + return 1; + } } else{ - ret = SSL_FATAL_ERROR; - - /* tests with BAD args */ - rs = wc_curve25519_export_key_raw( NULL , privateKey, &prvkSz, - publicKey, &pubkSz); - if(rs == BAD_FUNC_ARG){ - rs = wc_curve25519_export_key_raw( &key , NULL, &prvkSz, - publicKey, &pubkSz); - } - if(rs == BAD_FUNC_ARG){ - rs = wc_curve25519_export_key_raw( &key , privateKey, NULL, - publicKey, &pubkSz); - } - if(rs == BAD_FUNC_ARG){ - rs = wc_curve25519_export_key_raw( &key , privateKey, &prvkSz, - NULL, &pubkSz); - } - if(rs == BAD_FUNC_ARG){ - rs = wc_curve25519_export_key_raw( &key , privateKey, &prvkSz, - publicKey, NULL); - } - if(rs == BAD_FUNC_ARG){ - ret = SSL_FATAL_ERROR; - - if((0 == wc_curve25519_export_private_raw(&key, prik, &prksz)) && - (0 == wc_curve25519_export_public(&key, pubk, &pbksz)) && - (0 == wc_curve25519_export_key_raw(&key, privateKey, &prvkSz, - publicKey, &pubkSz))){ - - if((prksz == CURVE25519_KEYSIZE) && - (pbksz == CURVE25519_KEYSIZE) && - (prvkSz == CURVE25519_KEYSIZE) && - (pubkSz == CURVE25519_KEYSIZE)){ - if( 0 == XMEMCMP(privateKey, prik, CURVE25519_KEYSIZE) && - 0 == XMEMCMP(publicKey, pubk, CURVE25519_KEYSIZE )){ - ret = WOLFSSL_ERROR_NONE; /* DO not return "SSL_SUCCESS"*/ - } - } - } - } - else{ - ret = SSL_FATAL_ERROR; - } - } - - /*cleanup*/ - if(keymade != 0){wc_curve25519_free(&key);} - if(initdone != 0){wc_FreeRng(&rng);} - - printf(resultFmt, ret == 0 ? passed : failed); - fflush( stdout ); + + printf(testingFmt,"failed due to bad-key-size."); + fflush( stdout ); + wc_curve25519_free(&key); + wc_FreeRng(&rng); + return 1; + } #endif + printf(resultFmt, passed ); + fflush( stdout ); - return ret; + return 0; } /* end of test_wc_curve25519_export_key_raw */ + /* * Testing test_wc_curve25519_export_key_raw_ex(). */ static int test_wc_curve25519_export_key_raw_ex (void) { - int ret = 0; #if defined(HAVE_CURVE25519) && defined(HAVE_CURVE25519_KEY_EXPORT) - int rs; + curve25519_key key; WC_RNG rng; - int initdone = 0; - int keymade = 0; - int crvinit = 0; + byte privateKey[CURVE25519_KEYSIZE]; + byte publicKey[CURVE25519_KEYSIZE]; + word32 prvkSz; + word32 pubkSz; - - byte privateKey[32]; - byte publicKey[32]; - word32 prvkSz = sizeof(privateKey); - word32 pubkSz = sizeof(publicKey); - - byte prik[32]; - byte pubk[32]; + byte prik[CURVE25519_KEYSIZE]; + byte pubk[CURVE25519_KEYSIZE]; word32 prksz; word32 pbksz; printf(testingFmt, "wc_curve25519_export_key_raw_ex()"); - /* preparation for key export */ - if(0 == wc_InitRng(&rng)){initdone = 1;} - if(0 == wc_curve25519_init(&key)){crvinit = 1;} - if(0 == wc_curve25519_make_key(&rng, CURVE25519_KEYSIZE, &key)){keymade= 1;} - - if( initdone !=1 || crvinit != 1 || keymade != 1 ){ - ret = SSL_FATAL_ERROR; + if(0 != wc_InitRng(&rng)){ + printf(testingFmt, "failed due to wc_InitRng"); + fflush( stdout ); + return 1; + } + + if(0 != wc_curve25519_init(&key)){ + printf(testingFmt, "failed due to wc_curve25519_init"); + fflush( stdout ); + wc_FreeRng(&rng); + return 1; + } + + if(0 != wc_curve25519_make_key(&rng, CURVE25519_KEYSIZE, &key)){ + printf(testingFmt, "failed due to wc_curve25519_make_key"); + fflush( stdout ); + wc_curve25519_free(&key); + wc_FreeRng(&rng); + return 1; } - else{ - ret = SSL_FATAL_ERROR; - rs = wc_curve25519_export_key_raw_ex( NULL , privateKey, &prvkSz, - publicKey, &pubkSz, EC25519_LITTLE_ENDIAN); - if( rs == BAD_FUNC_ARG){ - rs = wc_curve25519_export_key_raw_ex( &key , NULL, &prvkSz, - publicKey, &pubkSz, EC25519_LITTLE_ENDIAN); - } - if( rs == BAD_FUNC_ARG){ - rs = wc_curve25519_export_key_raw_ex( &key , privateKey, NULL, - publicKey, &pubkSz, EC25519_LITTLE_ENDIAN); - } - if( rs == BAD_FUNC_ARG){ - rs = wc_curve25519_export_key_raw_ex( &key , privateKey, &prvkSz, - NULL, &pubkSz, EC25519_LITTLE_ENDIAN); - } - if( rs == BAD_FUNC_ARG){ - rs = wc_curve25519_export_key_raw_ex( &key , privateKey, &prvkSz, - publicKey, NULL, EC25519_LITTLE_ENDIAN); - } - if( rs == BAD_FUNC_ARG){ - rs = wc_curve25519_export_key_raw_ex( NULL , privateKey, &prvkSz, - publicKey, &pubkSz, EC25519_BIG_ENDIAN); - } - if( rs == BAD_FUNC_ARG){ - rs = wc_curve25519_export_key_raw_ex( &key , NULL, &prvkSz, - publicKey, &pubkSz, EC25519_BIG_ENDIAN); - } - if( rs == BAD_FUNC_ARG){ - rs = wc_curve25519_export_key_raw_ex( &key , privateKey, NULL, - publicKey, &pubkSz, EC25519_BIG_ENDIAN); - } - if( rs == BAD_FUNC_ARG){ - rs = wc_curve25519_export_key_raw_ex( &key , privateKey, &prvkSz, - NULL, &pubkSz, EC25519_BIG_ENDIAN); - } - if( rs == BAD_FUNC_ARG){ - rs = wc_curve25519_export_key_raw_ex( &key , privateKey, &prvkSz, - publicKey, NULL, EC25519_BIG_ENDIAN); - } - if( rs == BAD_FUNC_ARG){ - rs = wc_curve25519_export_key_raw_ex( &key , privateKey, &prvkSz, - publicKey, NULL, EC25519_BIG_ENDIAN + 10 ); /* illegal value for endien */ - } - if(rs == BAD_FUNC_ARG){ - ret = SSL_FATAL_ERROR; + /* + bad-argument-test cases + target function sould return BAD_FUNC_ARG + */ + prvkSz = CURVE25519_KEYSIZE; + pubkSz = CURVE25519_KEYSIZE; - if( 0 == wc_curve25519_export_private_raw( &key, prik, &prksz ) && - 0 == wc_curve25519_export_public( &key, pubk, &pbksz ) && - 0 == wc_curve25519_export_key_raw_ex( &key, privateKey, &prvkSz, - publicKey, &pubkSz, EC25519_BIG_ENDIAN)) { + if(BAD_FUNC_ARG != wc_curve25519_export_key_raw_ex( NULL , privateKey, + &prvkSz, publicKey, &pubkSz, EC25519_LITTLE_ENDIAN)){ + + printf(testingFmt,"failed at bad-arg-case-1."); + fflush( stdout ); + wc_curve25519_free(&key); + wc_FreeRng(&rng); + return 1; - if( prksz == CURVE25519_KEYSIZE && pbksz == CURVE25519_KEYSIZE && - prvkSz == CURVE25519_KEYSIZE && pubkSz == CURVE25519_KEYSIZE ){ - if( 0 == XMEMCMP( privateKey, prik , CURVE25519_KEYSIZE ) && - 0 == XMEMCMP( publicKey, pubk, CURVE25519_KEYSIZE )){ + } - if( 0 == wc_curve25519_export_key_raw_ex( &key, privateKey, - &prvkSz, publicKey, &pubkSz, EC25519_LITTLE_ENDIAN)){ + prvkSz = CURVE25519_KEYSIZE; + pubkSz = CURVE25519_KEYSIZE; - if( prvkSz == CURVE25519_KEYSIZE && - pubkSz == CURVE25519_KEYSIZE ){ - ret = 0; - } - } - } + if(BAD_FUNC_ARG != wc_curve25519_export_key_raw_ex( &key , NULL, + &prvkSz, publicKey, &pubkSz, EC25519_LITTLE_ENDIAN)){ + + printf(testingFmt,"failed at bad-arg-case-2."); + fflush( stdout ); + wc_curve25519_free(&key); + wc_FreeRng(&rng); + return 1; + } + + prvkSz = CURVE25519_KEYSIZE; + pubkSz = CURVE25519_KEYSIZE; + + if(BAD_FUNC_ARG != wc_curve25519_export_key_raw_ex( &key,privateKey, NULL,publicKey, &pubkSz,EC25519_LITTLE_ENDIAN)){ + + printf(testingFmt,"failed at bad-arg-case-3."); + fflush( stdout ); + wc_curve25519_free(&key); + wc_FreeRng(&rng); + return 1; + } + + prvkSz = CURVE25519_KEYSIZE; + pubkSz = CURVE25519_KEYSIZE; + + if(BAD_FUNC_ARG != wc_curve25519_export_key_raw_ex( &key, privateKey, + &prvkSz, NULL, &pubkSz, EC25519_LITTLE_ENDIAN)){ + + printf(testingFmt,"failed at bad-arg-case-4."); + fflush( stdout ); + wc_curve25519_free(&key); + wc_FreeRng(&rng); + return 1; + } + + prvkSz = CURVE25519_KEYSIZE; + pubkSz = CURVE25519_KEYSIZE; + + if(BAD_FUNC_ARG != wc_curve25519_export_key_raw_ex( &key, privateKey, + &prvkSz, publicKey, NULL, EC25519_LITTLE_ENDIAN)){ + + printf(testingFmt,"failed at bad-arg-case-5."); + fflush( stdout ); + wc_curve25519_free(&key); + wc_FreeRng(&rng); + return 1; + } + + prvkSz = CURVE25519_KEYSIZE; + pubkSz = CURVE25519_KEYSIZE; + + if(BAD_FUNC_ARG != wc_curve25519_export_key_raw_ex( NULL, privateKey, + &prvkSz, publicKey, &pubkSz, EC25519_BIG_ENDIAN)){ + + printf(testingFmt,"failed at bad-arg-case-6."); + fflush( stdout ); + wc_curve25519_free(&key); + wc_FreeRng(&rng); + return 1; + } + + prvkSz = CURVE25519_KEYSIZE; + pubkSz = CURVE25519_KEYSIZE; + + if(BAD_FUNC_ARG != wc_curve25519_export_key_raw_ex( &key, NULL, &prvkSz, + publicKey, &pubkSz, EC25519_BIG_ENDIAN)){ + + printf(testingFmt,"failed at bad-arg-case-7."); + fflush( stdout ); + wc_curve25519_free(&key); + wc_FreeRng(&rng); + return 1; + } + + prvkSz = CURVE25519_KEYSIZE; + pubkSz = CURVE25519_KEYSIZE; + + if(BAD_FUNC_ARG != wc_curve25519_export_key_raw_ex( &key, privateKey, NULL, publicKey, &pubkSz, EC25519_BIG_ENDIAN)){ + + printf(testingFmt,"failed at bad-arg-case-8."); + fflush( stdout ); + wc_curve25519_free(&key); + wc_FreeRng(&rng); + return 1; + } + + prvkSz = CURVE25519_KEYSIZE; + pubkSz = CURVE25519_KEYSIZE; + + if(BAD_FUNC_ARG != wc_curve25519_export_key_raw_ex( &key, privateKey, + &prvkSz, NULL, &pubkSz, EC25519_BIG_ENDIAN)){ + + printf(testingFmt,"failed at bad-arg-case-9."); + fflush( stdout ); + wc_curve25519_free(&key); + wc_FreeRng(&rng); + return 1; + } + + prvkSz = CURVE25519_KEYSIZE; + pubkSz = CURVE25519_KEYSIZE; + + if(BAD_FUNC_ARG != wc_curve25519_export_key_raw_ex( &key, privateKey, + &prvkSz, publicKey, NULL, EC25519_BIG_ENDIAN)){ + + printf(testingFmt,"failed at bad-arg-case-10."); + fflush( stdout ); + wc_curve25519_free(&key); + wc_FreeRng(&rng); + return 1; + } + + /* illegal value for endien */ + + prvkSz = CURVE25519_KEYSIZE; + pubkSz = CURVE25519_KEYSIZE; + + if(BAD_FUNC_ARG != wc_curve25519_export_key_raw_ex( &key, privateKey, + &prvkSz, publicKey, NULL, EC25519_BIG_ENDIAN + 10 )){ + + printf(testingFmt,"failed at bad-arg-case-11."); + fflush( stdout ); + wc_curve25519_free(&key); + wc_FreeRng(&rng); + return 1; + } + + /* + cross-testing + */ + prksz = CURVE25519_KEYSIZE; + + if(0 != wc_curve25519_export_private_raw( &key, prik, &prksz )){ + + printf(testingFmt,"failed due to wc_curve25519_export_private_raw"); + fflush( stdout ); + wc_curve25519_free(&key); + wc_FreeRng(&rng); + return 1; + } + + pbksz = CURVE25519_KEYSIZE; + + if(0 != wc_curve25519_export_public( &key, pubk, &pbksz )){ + + printf(testingFmt,"failed due to wc_curve25519_export_public"); + fflush( stdout ); + wc_curve25519_free(&key); + wc_FreeRng(&rng); + return 1; + + } + + prvkSz = CURVE25519_KEYSIZE; + pubkSz = CURVE25519_KEYSIZE; + + if(0 != wc_curve25519_export_key_raw_ex( &key, privateKey, &prvkSz, + publicKey, &pubkSz, EC25519_BIG_ENDIAN)) { + + printf(testingFmt,"failed due to wc_curve25519_export_key_raw_ex"); + fflush( stdout ); + wc_curve25519_free(&key); + wc_FreeRng(&rng); + return 1; + } + + if( prksz == CURVE25519_KEYSIZE && + pbksz == CURVE25519_KEYSIZE && + prvkSz == CURVE25519_KEYSIZE && + pubkSz == CURVE25519_KEYSIZE ){ + + if( 0 == XMEMCMP( privateKey, prik, CURVE25519_KEYSIZE ) && + 0 == XMEMCMP( publicKey, pubk, CURVE25519_KEYSIZE )){ + + if( 0 == wc_curve25519_export_key_raw_ex( &key, privateKey, + &prvkSz, publicKey, &pubkSz, EC25519_LITTLE_ENDIAN)){ + + if( prvkSz == CURVE25519_KEYSIZE && + pubkSz == CURVE25519_KEYSIZE ){ + + ; /* proceed to the next test */ } - } + else{ + + printf(testingFmt,"failed due to key-size-inconsistency"); + fflush( stdout ); + wc_curve25519_free(&key); + wc_FreeRng(&rng); + return 1; + } + } + else{ + + printf(testingFmt, + "failed due to wc_curve25519_export_key_raw_ex"); + fflush( stdout ); + wc_curve25519_free(&key); + wc_FreeRng(&rng); + return 1; + + } } else{ - ret = SSL_FATAL_ERROR; + + printf(testingFmt,"failed due to key-contents-inconsistency"); + fflush( stdout ); + wc_curve25519_free(&key); + wc_FreeRng(&rng); + return 1; + + } + } + else{ + + printf(testingFmt,"failed due to bad-key-size"); + fflush( stdout ); + wc_curve25519_free(&key); + wc_FreeRng(&rng); + return 1; + } + + /* + try once with another endian + */ + + prvkSz = CURVE25519_KEYSIZE; + pubkSz = CURVE25519_KEYSIZE; + + if( 0 == wc_curve25519_export_key_raw_ex( &key, privateKey, + &prvkSz, publicKey, &pubkSz, EC25519_BIG_ENDIAN)){ + + if( prvkSz == CURVE25519_KEYSIZE && + pubkSz == CURVE25519_KEYSIZE ){ + + /* no more test*/ + printf(resultFmt, passed ); + fflush( stdout ); + return 0; + } + else{ + + printf(testingFmt,"failed due to key-size-inconsistency"); + fflush( stdout ); + wc_curve25519_free(&key); + wc_FreeRng(&rng); + return 1; } } + else{ - /*cleanup*/ - if(keymade != 0){wc_curve25519_free(&key);} - if(initdone != 0){wc_FreeRng(&rng);} + printf(testingFmt, + "failed due to wc_curve25519_export_key_raw_ex(BIGENDIAN)"); + fflush( stdout ); + wc_curve25519_free(&key); + wc_FreeRng(&rng); + return 1; - printf(resultFmt, ret == 0 ? passed : failed); - fflush( stdout ); + } #endif - return ret; + return 0; } /* end of test_wc_curve25519_export_key_raw_ex */ /* * Testing wc_ed448_make_key(). From a855d6355e61d8ff07e3a38876de74884b37c331 Mon Sep 17 00:00:00 2001 From: TakayukiMatsuo Date: Thu, 11 Jun 2020 09:05:09 +0900 Subject: [PATCH 249/298] Added cleanup to test_wc_curve25519_export_key_raw_ex --- tests/api.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/api.c b/tests/api.c index dfcf53f1d..60b091aad 100644 --- a/tests/api.c +++ b/tests/api.c @@ -15686,6 +15686,8 @@ static int test_wc_curve25519_export_key_raw_ex (void) /* no more test*/ printf(resultFmt, passed ); fflush( stdout ); + wc_curve25519_free(&key); + wc_FreeRng(&rng); return 0; } else{ From 28819bd45ee22029c56a2be3dbb6048215109377 Mon Sep 17 00:00:00 2001 From: TakayukiMatsuo Date: Wed, 17 Jun 2020 12:07:25 +0900 Subject: [PATCH 250/298] Made two lines wrap around in test_wc_curve25519_export_key_raw_ex() --- tests/api.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/tests/api.c b/tests/api.c index 60b091aad..6b3e4086a 100644 --- a/tests/api.c +++ b/tests/api.c @@ -15462,7 +15462,8 @@ static int test_wc_curve25519_export_key_raw_ex (void) prvkSz = CURVE25519_KEYSIZE; pubkSz = CURVE25519_KEYSIZE; - if(BAD_FUNC_ARG != wc_curve25519_export_key_raw_ex( &key,privateKey, NULL,publicKey, &pubkSz,EC25519_LITTLE_ENDIAN)){ + if(BAD_FUNC_ARG != wc_curve25519_export_key_raw_ex( &key,privateKey, + NULL,publicKey, &pubkSz,EC25519_LITTLE_ENDIAN)){ printf(testingFmt,"failed at bad-arg-case-3."); fflush( stdout ); @@ -15526,7 +15527,8 @@ static int test_wc_curve25519_export_key_raw_ex (void) prvkSz = CURVE25519_KEYSIZE; pubkSz = CURVE25519_KEYSIZE; - if(BAD_FUNC_ARG != wc_curve25519_export_key_raw_ex( &key, privateKey, NULL, publicKey, &pubkSz, EC25519_BIG_ENDIAN)){ + if(BAD_FUNC_ARG != wc_curve25519_export_key_raw_ex( &key, privateKey, + NULL, publicKey, &pubkSz, EC25519_BIG_ENDIAN)){ printf(testingFmt,"failed at bad-arg-case-8."); fflush( stdout ); @@ -15702,7 +15704,7 @@ static int test_wc_curve25519_export_key_raw_ex (void) else{ printf(testingFmt, - "failed due to wc_curve25519_export_key_raw_ex(BIGENDIAN)"); + "failed due to wc_curve25519_export_key_raw_ex(BIGENDIAN)"); fflush( stdout ); wc_curve25519_free(&key); wc_FreeRng(&rng); From 21e0f863b9fda2b7303c96856a6c30aabd9fd84d Mon Sep 17 00:00:00 2001 From: David Garske Date: Thu, 14 May 2020 16:24:18 -0700 Subject: [PATCH 251/298] Fix for `NO_WOLFSSL_SERVER` typo. --- src/internal.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/internal.c b/src/internal.c index cbea8d139..08c99c62e 100644 --- a/src/internal.c +++ b/src/internal.c @@ -12409,7 +12409,7 @@ static int DoHandShakeMsgType(WOLFSSL* ssl, byte* input, word32* inOutIdx, expectedIdx += MacSize(ssl); #endif -#if !defined(WOLFSSL_NO_SERVER) && \ +#if !defined(NO_WOLFSSL_SERVER) && \ defined(HAVE_SECURE_RENEGOTIATION) && \ defined(HAVE_SERVER_RENEGOTIATION_INFO) if (ssl->options.handShakeDone && type == client_hello && From 0ef5a3d00eda88b8714d728200a2c865b5396591 Mon Sep 17 00:00:00 2001 From: David Garske Date: Mon, 18 May 2020 11:27:16 -0700 Subject: [PATCH 252/298] Fix for `WOLFSSL_ALT_CERT_CHAINS` incorrectly failing on success case. --- src/internal.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/internal.c b/src/internal.c index 08c99c62e..9682da667 100644 --- a/src/internal.c +++ b/src/internal.c @@ -10954,7 +10954,8 @@ int ProcessPeerCerts(WOLFSSL* ssl, byte* input, word32* inOutIdx, ssl->options.usingAltCertChain = 1; } - ret = 0; /* clear error and continue */ + ret = 0; /* clear errors and continue */ + args->verifyErr = 0; } /* do not add to certificate manager */ From 5a5bc34aa562ef5b2d7ca6c22d7575add247d404 Mon Sep 17 00:00:00 2001 From: David Garske Date: Tue, 16 Jun 2020 11:29:27 -0700 Subject: [PATCH 253/298] Added second intermediate CA to testing certs. This creates a chain that looks like: `ROOT (www.wolfssl.com) -> INT (wolfSSL Intermediate CA) -> INT2 (wolfSSL Intermediate2 CA) -> PEER (wolfSSL Client Chain / wolfSSL Server Chain).` --- certs/crl/ca-int-ecc.pem | 10 +- certs/crl/ca-int.pem | 18 ++-- certs/crl/ca-int2-ecc.pem | 10 ++ certs/crl/ca-int2.pem | 14 +++ certs/crl/client-int-ecc.pem | 12 +-- certs/crl/client-int.pem | 18 ++-- certs/crl/include.am | 2 + certs/crl/server-int-ecc.pem | 10 +- certs/crl/server-int.pem | 18 ++-- certs/intermediate/ca-int-cert.der | Bin 1051 -> 1051 bytes certs/intermediate/ca-int-cert.pem | 114 ++++++++++---------- certs/intermediate/ca-int-ecc-cert.der | Bin 661 -> 663 bytes certs/intermediate/ca-int-ecc-cert.pem | 54 +++++----- certs/intermediate/ca-int2-cert.der | Bin 0 -> 1063 bytes certs/intermediate/ca-int2-cert.pem | 84 +++++++++++++++ certs/intermediate/ca-int2-ecc-cert.der | Bin 0 -> 675 bytes certs/intermediate/ca-int2-ecc-cert.pem | 53 +++++++++ certs/intermediate/ca-int2-ecc-key.der | Bin 0 -> 121 bytes certs/intermediate/ca-int2-ecc-key.pem | 5 + certs/intermediate/ca-int2-key.der | Bin 0 -> 1191 bytes certs/intermediate/ca-int2-key.pem | 27 +++++ certs/intermediate/client-chain-alt-ecc.pem | 57 ++++++---- certs/intermediate/client-chain-alt.pem | 95 ++++++++++------ certs/intermediate/client-chain-ecc.der | Bin 1375 -> 2054 bytes certs/intermediate/client-chain-ecc.pem | 57 ++++++---- certs/intermediate/client-chain.der | Bin 2153 -> 3217 bytes certs/intermediate/client-chain.pem | 95 ++++++++++------ certs/intermediate/client-int-cert.der | Bin 1102 -> 1103 bytes certs/intermediate/client-int-cert.pem | 90 ++++++++-------- certs/intermediate/client-int-ecc-cert.der | Bin 714 -> 716 bytes certs/intermediate/client-int-ecc-cert.pem | 52 ++++----- certs/intermediate/genintcerts.sh | 98 ++++++++++++----- certs/intermediate/include.am | 18 +++- certs/intermediate/server-chain-alt-ecc.pem | 65 ++++++----- certs/intermediate/server-chain-alt.pem | 103 +++++++++++------- certs/intermediate/server-chain-ecc.der | Bin 1533 -> 2225 bytes certs/intermediate/server-chain-ecc.pem | 65 ++++++----- certs/intermediate/server-chain.der | Bin 2309 -> 3384 bytes certs/intermediate/server-chain.pem | 103 +++++++++++------- certs/intermediate/server-int-cert.der | Bin 1258 -> 1270 bytes certs/intermediate/server-int-cert.pem | 102 +++++++++--------- certs/intermediate/server-int-ecc-cert.der | Bin 872 -> 887 bytes certs/intermediate/server-int-ecc-cert.pem | 64 +++++------ 43 files changed, 968 insertions(+), 545 deletions(-) create mode 100644 certs/crl/ca-int2-ecc.pem create mode 100644 certs/crl/ca-int2.pem create mode 100644 certs/intermediate/ca-int2-cert.der create mode 100644 certs/intermediate/ca-int2-cert.pem create mode 100644 certs/intermediate/ca-int2-ecc-cert.der create mode 100644 certs/intermediate/ca-int2-ecc-cert.pem create mode 100644 certs/intermediate/ca-int2-ecc-key.der create mode 100644 certs/intermediate/ca-int2-ecc-key.pem create mode 100644 certs/intermediate/ca-int2-key.der create mode 100644 certs/intermediate/ca-int2-key.pem diff --git a/certs/crl/ca-int-ecc.pem b/certs/crl/ca-int-ecc.pem index 654cd30cb..778b4dca1 100644 --- a/certs/crl/ca-int-ecc.pem +++ b/certs/crl/ca-int-ecc.pem @@ -2,9 +2,9 @@ MIIBYDCCAQUCAQEwCgYIKoZIzj0EAwIwgaMxCzAJBgNVBAYTAlVTMRMwEQYDVQQI DApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3b2xmU1NM MRQwEgYDVQQLDAtEZXZlbG9wbWVudDEkMCIGA1UEAwwbd29sZlNTTCBJbnRlcm1l -ZGlhdGUgQ0EgRUNDMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tFw0x -ODEyMjExNzU0MDFaFw0yMTA5MTYxNzU0MDFaoDAwLjAfBgNVHSMEGDAWgBSXHWDD -hyJZm2AfhLSZHIhNv9oebjALBgNVHRQEBAICIAMwCgYIKoZIzj0EAwIDSQAwRgIh -AMrFN7PEk0mtpHWZXJQSaXrc2K2BY/iZ6GlKnbM9G44MAiEA5K9dEKgOX/2VvGlR -YN8aMaQ+Ly9fyMNEnXLR2OOMrBA= +ZGlhdGUgQ0EgRUNDMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tFw0y +MDA2MTYxOTE3NThaFw0yMzAzMTMxOTE3NThaoDAwLjAfBgNVHSMEGDAWgBQTtXlZ +MrO7tEezNA6AwIMeqoLIWzALBgNVHRQEBAICIAQwCgYIKoZIzj0EAwIDSQAwRgIh +AI0Fl7b1oh6x96i14akYhMMcVHPi7VdLh7fXSf9bMoeqAiEAzxqdobdrD2e53V5b +0o4HUOCgRB1dzH1m+LcRe+LPUnI= -----END X509 CRL----- diff --git a/certs/crl/ca-int.pem b/certs/crl/ca-int.pem index d0dd6ce4a..0dcb10dd9 100644 --- a/certs/crl/ca-int.pem +++ b/certs/crl/ca-int.pem @@ -2,13 +2,13 @@ MIICHDCCAQQCAQEwDQYJKoZIhvcNAQELBQAwgZ8xCzAJBgNVBAYTAlVTMRMwEQYD VQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3b2xm U1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEgMB4GA1UEAwwXd29sZlNTTCBJbnRl -cm1lZGlhdGUgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20XDTE4 -MTIyMTE3NTQwMFoXDTIxMDkxNjE3NTQwMFqgMDAuMB8GA1UdIwQYMBaAFO9p4PfV -HeaZ7Nxt0PfiuVxkcYM1MAsGA1UdFAQEAgIgADANBgkqhkiG9w0BAQsFAAOCAQEA -d++OmLaoou17s32sU/onSY1+Y9PoqYcKqkjK14srsvnrMe8AS3QDsuF721cg3Ekp -pghG2pmyrvsCB8uaZ5yGE0B7YZ2ZfKjq6IQAQmcMkZ9tVtchmJNGyuB0T8uL8fJE -JsCvI+eAyYTSjgePQC4x9GMunWwRfQ4DWjXIal8f9WNLnRRZl8MKaTk6fuMM+GBt -6QJ1qEEeWWwbTnCqAia4dJ/IJGn7bbxwMAs305zrBE8G17gzh4Q4aj/nt71+oM5e -Jf4XHs2GahUUz29OqiXwsfNfpF9/DHxjTf0UyHjRVV95hdq2QBQNuozVQ/wDiXSH -12py+paDtyfh1Vw3RapYMQ== +cm1lZGlhdGUgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20XDTIw +MDYxNjE5MTc1OFoXDTIzMDMxMzE5MTc1OFqgMDAuMB8GA1UdIwQYMBaAFIMc8ZiF +7G4GRTTeUcC6tytnMmZNMAsGA1UdFAQEAgIgADANBgkqhkiG9w0BAQsFAAOCAQEA +VQ6Am+DuDpBbUs2yEIe0MDwgVZacmOwEB6wZM/c62qW+tGitjUnj1UD6wNQZwYpP +OGNYOdbiIskilSC97WJgXW4dJVrRHiV8nAzzi/8tZO96oUbLx1hmfx1/hCxqtm50 +bbYUuS25qoiVFKYkx1tocY+ESLfam09T8ZP3m5m38h5YTe+s6dmHdonEM+JlNEdT +itvZtSfUU29xCQIXVSWFJHsRGjqdvCpndtY1Kmb8aYdB60zpk2JgOGljg2uF7Iq0 +lquWWfhDl77r0qdlRYHTQ+0FetU4gCZ+ZVGH07+FD/p+GxPh4P0D3i2gFq2Z/0en +396xKNy+NiBbFw/CUFbLDw== -----END X509 CRL----- diff --git a/certs/crl/ca-int2-ecc.pem b/certs/crl/ca-int2-ecc.pem new file mode 100644 index 000000000..ae048dee9 --- /dev/null +++ b/certs/crl/ca-int2-ecc.pem @@ -0,0 +1,10 @@ +-----BEGIN X509 CRL----- +MIIBYTCCAQYCAQEwCgYIKoZIzj0EAwIwgaQxCzAJBgNVBAYTAlVTMRMwEQYDVQQI +DApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3b2xmU1NM +MRQwEgYDVQQLDAtEZXZlbG9wbWVudDElMCMGA1UEAwwcd29sZlNTTCBJbnRlcm1l +ZGlhdGUyIENBIEVDQzEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbRcN +MjAwNjE2MTkxNzU4WhcNMjMwMzEzMTkxNzU4WqAwMC4wHwYDVR0jBBgwFoAUG/S9 +kCh0ZOMzXotkp/yvuvK5VeUwCwYDVR0UBAQCAiAFMAoGCCqGSM49BAMCA0kAMEYC +IQDBYNHurBS8JV1DkJLVaVXD5lrvjdCA13poIGJxVvx0NwIhALJQRBbMvQCLZ4ci +sE1dD+cpe4NdK/x2iH4QJ8XJX8uc +-----END X509 CRL----- diff --git a/certs/crl/ca-int2.pem b/certs/crl/ca-int2.pem new file mode 100644 index 000000000..c0d265226 --- /dev/null +++ b/certs/crl/ca-int2.pem @@ -0,0 +1,14 @@ +-----BEGIN X509 CRL----- +MIICHTCCAQUCAQEwDQYJKoZIhvcNAQELBQAwgaAxCzAJBgNVBAYTAlVTMRMwEQYD +VQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3b2xm +U1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEhMB8GA1UEAwwYd29sZlNTTCBJbnRl +cm1lZGlhdGUyIENBMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tFw0y +MDA2MTYxOTE3NThaFw0yMzAzMTMxOTE3NThaoDAwLjAfBgNVHSMEGDAWgBR6ix1O +o0DIzlhfjfz/Rix1QdkDXjALBgNVHRQEBAICIAEwDQYJKoZIhvcNAQELBQADggEB +AJeG0+IjjS5Rf2gAJu/ldHzCwMJccTKt17mHjyQhQnzOQN8Df+zAUDWIVF99d0vO +cQFx5SYWpFYkT6kSRYHdYmZp8s6Yl0oQJ+isQ1wsFnkF2z+I/g1f/uDX9LWnKxnj +UE2UttU6fKGQl2F8SDnloDsQjjGnxssyGVeNCTBGjkCHHH9QSpZv5xjTN7INYCso +3GkWnXwGkghwleXGtgMwW2IMsNVMIFJlHQQzk9P6gqTtvhkCNp6rjAHieU8GqBkh +1zCMDTgk2LjFaRF/OnbOk1/j+LZZxox9KUIhUF4d33+PhoUd9YegvJJfdVXAKnVc +HwoO9FjX3jBcnfvs6qPBKLc= +-----END X509 CRL----- diff --git a/certs/crl/client-int-ecc.pem b/certs/crl/client-int-ecc.pem index 91315dcbe..e3ead6240 100644 --- a/certs/crl/client-int-ecc.pem +++ b/certs/crl/client-int-ecc.pem @@ -1,10 +1,10 @@ -----BEGIN X509 CRL----- -MIIBXTCCAQICAQEwCgYIKoZIzj0EAwIwgaAxCzAJBgNVBAYTAlVTMRMwEQYDVQQI +MIIBXDCCAQICAQEwCgYIKoZIzj0EAwIwgaAxCzAJBgNVBAYTAlVTMRMwEQYDVQQI DApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3b2xmU1NM MRQwEgYDVQQLDAtEZXZlbG9wbWVudDEhMB8GA1UEAwwYd29sZlNTTCBDbGllbnQg -Q2hhaW4gRUNDMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tFw0xODEy -MjExNzU0MDFaFw0yMTA5MTYxNzU0MDFaoDAwLjAfBgNVHSMEGDAWgBTr1EtZa5Vh -P1FXtgRNiUGIRFyr8jALBgNVHRQEBAICIAUwCgYIKoZIzj0EAwIDSQAwRgIhAJn0 -klExhxOHZtOQi45DuNnraKRzWV+V0moXQOvQmP4+AiEAk7Oqvn3Ij3ZhB/V+7VT0 -iPE8ipSUmQbQcZzI7BhT86E= +Q2hhaW4gRUNDMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tFw0yMDA2 +MTYxOTE3NThaFw0yMzAzMTMxOTE3NThaoDAwLjAfBgNVHSMEGDAWgBTr1EtZa5Vh +P1FXtgRNiUGIRFyr8jALBgNVHRQEBAICIAcwCgYIKoZIzj0EAwIDSAAwRQIhAJiz +His7baFwO9NAwNTMMpNJbYd1XClf1q9lOdO9S/sqAiBfh8Qy7Lri1brEaafDCxe3 +3PgVHR+m9QkJssAuOEIK2A== -----END X509 CRL----- diff --git a/certs/crl/client-int.pem b/certs/crl/client-int.pem index 0acea6861..e11c30bb0 100644 --- a/certs/crl/client-int.pem +++ b/certs/crl/client-int.pem @@ -2,13 +2,13 @@ MIICGTCCAQECAQEwDQYJKoZIhvcNAQELBQAwgZwxCzAJBgNVBAYTAlVTMRMwEQYD VQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3b2xm U1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEdMBsGA1UEAwwUd29sZlNTTCBDbGll -bnQgQ2hhaW4xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20XDTE4MTIy -MTE3NTQwMFoXDTIxMDkxNjE3NTQwMFqgMDAuMB8GA1UdIwQYMBaAFDPYRWbXaIcY -flQNcCeRxybXhWXAMAsGA1UdFAQEAgIgAjANBgkqhkiG9w0BAQsFAAOCAQEAefil -VL8oAVmbbtUyF7v7cwZ+3Olt6VuCcevIPYMc8yP7huO21UpkjwrVhr0tru6SA5xO -2I1lUwcyuH49c2H/RVEmS7q75TErYyXl/D209+LidOqPAnVibNWBsNaqQUn11dEM -T+VBC6aiUuLxnslpzWUkmromjh0BI2f1AbYEtRDHlaqZakxiZ4FdXPpnopcO44+T -ZLS2Kj52L6ykB1j70I2HOpZ7C07+MTBLvCV8J0Au1+GNBN1TZSO0dOX8AXLSpS+6 -q3vxJ1nsNYk/P7KdJO8eGYth9pXffKYPzMz0urrnavNd9nO9bR4u89SLepzuedBK -vX+Acp5M8IcAnw4sEA== +bnQgQ2hhaW4xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20XDTIwMDYx +NjE5MTc1OFoXDTIzMDMxMzE5MTc1OFqgMDAuMB8GA1UdIwQYMBaAFDPYRWbXaIcY +flQNcCeRxybXhWXAMAsGA1UdFAQEAgIgAzANBgkqhkiG9w0BAQsFAAOCAQEARom6 +mppTxCF+GWAEHFbn9EJee2uCCrQ9dd4JLA1Hc4XYGHOoN54jPKZEvTTYB5XKImCg +NvbOb98l88Gpr0fUDTuAdBQZrM7Vs3IBPoOJdjMNuwQzxvQ+WdY2Jft/4CaR4/mq +oMJrmhlz1PmWNTqqfFS/GQv/NYDdCXhP4bNuWRMZoSYROyby+bqr2SgNbZ+0GA3/ +jeSCXmdngwEB7z5SoqqRscVOS7Sw1S3e6X/QNQ6rNNR6MWKH95Ra8ke9A12r+3zu +ZqbIYtbaF49tvOJsvzKQeC8J2oTzpEbRvNudJ4mXLpNEw5I/RL1sum0bJIn0wL+/ +7q1EaGe14zTsPsx06g== -----END X509 CRL----- diff --git a/certs/crl/include.am b/certs/crl/include.am index 4b1034ac3..c5da8de99 100644 --- a/certs/crl/include.am +++ b/certs/crl/include.am @@ -18,8 +18,10 @@ EXTRA_DIST += \ # Intermediate cert CRL's EXTRA_DIST += \ certs/crl/ca-int.pem \ + certs/crl/ca-int2.pem \ certs/crl/client-int.pem \ certs/crl/server-int.pem \ certs/crl/ca-int-ecc.pem \ + certs/crl/ca-int2-ecc.pem \ certs/crl/client-int-ecc.pem \ certs/crl/server-int-ecc.pem diff --git a/certs/crl/server-int-ecc.pem b/certs/crl/server-int-ecc.pem index c4bedeaa8..8acdb994e 100644 --- a/certs/crl/server-int-ecc.pem +++ b/certs/crl/server-int-ecc.pem @@ -2,9 +2,9 @@ MIIBXDCCAQICAQEwCgYIKoZIzj0EAwIwgaAxCzAJBgNVBAYTAlVTMRMwEQYDVQQI DApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3b2xmU1NM MRQwEgYDVQQLDAtEZXZlbG9wbWVudDEhMB8GA1UEAwwYd29sZlNTTCBTZXJ2ZXIg -Q2hhaW4gRUNDMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tFw0xODEy -MjExNzU0MDFaFw0yMTA5MTYxNzU0MDFaoDAwLjAfBgNVHSMEGDAWgBRdXSbvrH42 -+Zt2FStKJQIj77KJMDALBgNVHRQEBAICIAQwCgYIKoZIzj0EAwIDSAAwRQIgTKmg -a595JJuQ5U4Alhi7p8424/02UoN4WLg9tZiGtfICIQDKtdI2JZuVpTmCtRRo8gZH -H/s5EUrqsIpXoNMdsGO1+w== +Q2hhaW4gRUNDMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tFw0yMDA2 +MTYxOTE3NThaFw0yMzAzMTMxOTE3NThaoDAwLjAfBgNVHSMEGDAWgBRdXSbvrH42 ++Zt2FStKJQIj77KJMDALBgNVHRQEBAICIAYwCgYIKoZIzj0EAwIDSAAwRQIgeQwr +cMQD2CE83QHYP6QoAqN3FlxOmPC9f4QQVlpOozUCIQDTDxH4UsFLCy8QgtjtfkFC +TmVI1ubZPFDiRHGDWI2LaA== -----END X509 CRL----- diff --git a/certs/crl/server-int.pem b/certs/crl/server-int.pem index ccddf4b4f..d8b6986ef 100644 --- a/certs/crl/server-int.pem +++ b/certs/crl/server-int.pem @@ -2,13 +2,13 @@ MIICGTCCAQECAQEwDQYJKoZIhvcNAQELBQAwgZwxCzAJBgNVBAYTAlVTMRMwEQYD VQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3b2xm U1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEdMBsGA1UEAwwUd29sZlNTTCBTZXJ2 -ZXIgQ2hhaW4xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20XDTE4MTIy -MTE3NTQwMFoXDTIxMDkxNjE3NTQwMFqgMDAuMB8GA1UdIwQYMBaAFLMRMsmSmITi -yfjQO24DQsofDo48MAsGA1UdFAQEAgIgATANBgkqhkiG9w0BAQsFAAOCAQEAEhz6 -qLMqvX2s8/nsg2BjT+07Di3f3kkCZqxWtdvoSHg44lQof2F6UuTeKzlBWfTmFLE9 -qZJ8dj6xSMPEnZnRB1z9HvHRKZGDotuSNWCt4BElXP6ZZpQcIFaYUsWUZJ0Zb7LW -/06fuepQTeHrxvwNPD6SF5+dVX7doQ2l2ytkQvGHznrWsQNdB2H9K2tAZTIbkiQA -KcRP1pm1Dt2pZWPbwHws/AcXM4nCIJRUTlo1drHBClDbJB1n/AU8LjX1shX4AUds -+HthMwVmDUjofoXuqzRVyCtfdMH5tgwY//opif+FRXwXjZajx9K+vu68Qa8hI5+9 -sXu6NDs92L2KLfGNmg== +ZXIgQ2hhaW4xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20XDTIwMDYx +NjE5MTc1OFoXDTIzMDMxMzE5MTc1OFqgMDAuMB8GA1UdIwQYMBaAFLMRMsmSmITi +yfjQO24DQsofDo48MAsGA1UdFAQEAgIgAjANBgkqhkiG9w0BAQsFAAOCAQEAtEEG +Z05j/ygGi+DNPkjevKDcZlkPYRcYMQpM1RTkVyzbO6YG1i0ZoCH1MKBxB0MPS3xa +qb96jYIfpDZOUb/o2ZXOefXcirm53eJTSoa72dFoxawH74J1f/HgRT8UYISvJ+1a +L4NtAcn3lNxZWtg0gvT0pdy1zCpEsxonz4mJEaN5796qIUj1z47r/D0P9w8TFshC +9Kow+FNEjZT7A8E9EAdfePTlws8FXNcJEUbyxEJUOe6QTssXr4Ib20opQKREvhfY +5S6MsQibpO/EEv+Tg5JYeqjWOpqfO/gKBo4Xa9ImbC8N1OdCkd0ZHqvcC8IC6S00 +V0/Td56mV5BZJXG0pw== -----END X509 CRL----- diff --git a/certs/intermediate/ca-int-cert.der b/certs/intermediate/ca-int-cert.der index d7c9a71d676c3a0867c558771533eff16b1ae6fc..860e92d5216f3cac12dbc76bbcf2af9338d59c4f 100644 GIT binary patch delta 605 zcmV-j0;2t!2%89yyBjhvFg7tZF*z|eH8)xp4Ky$?HZd_VIWadiH<8xFfAS+J_klz3 zW4ZEoelQw9YvJ8%K{oDvSR>q4>AUDV5m>{+x9gZ%>2?y$?{^6$(`@ECNoY`z*D~N3 z)&<}9p3;wdwUJ!EJ_&){dF@2Pll7gX%L;2_wD9iH-E8N^xA8F4w^S$?5&R{rTk*3Q z6Gwf1*+rK;ySYMe29#AJe-#Ua$_y33ZWH< zFdYU1RUHll76cT79PyZi>~01{G~Q9by0fp#@eBB1eJi4U4 zpqq`M8htv~$@4W%#dd3LP|=km=)iwHKSc--cWWtV%-yyi_`wxSZ{n++VH4fF#pjsJ rBPqHZwjsc5 delta 605 zcmV-j0;2t!2%89yyBje$F)}hSF*h|dFfdvd4Kp|~GBGwWH#IacFp<{8f5W14T_Iv1 z&N^{8r?Bak9$D_CPnC~8Qk=W`#TRoG1eJL1c0;)BUi zk9YmtEnOqGBbt7;DQM^_PO1Jfa50|n@9y}GX#{ot$!+Dw*D!xeq0|5X5qh>H< zFdYU1RUHll76cUUY2f$O9p;(r+-=bJ;<;R8af3CJ!U8k_0F(CuB!6DbFwPSOsG}uq zg=oKsJ7^MWUSA@DQA+)>uCl^Dq2zOyZ+9PF3Z_1aAd^f#Xk=-q*RDRLSme+}5j6h7EonWyc@}Udm9fy>ZJ1+5!^)uM`$4 diff --git a/certs/intermediate/ca-int-cert.pem b/certs/intermediate/ca-int-cert.pem index e2ccd52d7..5e9afd58d 100644 --- a/certs/intermediate/ca-int-cert.pem +++ b/certs/intermediate/ca-int-cert.pem @@ -2,82 +2,82 @@ Certificate: Data: Version: 3 (0x2) Serial Number: 4096 (0x1000) - Signature Algorithm: sha256WithRSAEncryption - Issuer: C=US, ST=Montana, L=Bozeman, O=Sawtooth, OU=Consulting, CN=www.wolfssl.com/emailAddress=info@wolfssl.com + Signature Algorithm: sha256WithRSAEncryption + Issuer: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Dec 21 17:54:00 2018 GMT - Not After : Dec 16 17:54:00 2038 GMT - Subject: C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Development, CN=wolfSSL Intermediate CA/emailAddress=info@wolfssl.com + Not Before: Jun 16 19:17:57 2020 GMT + Not After : Jun 11 19:17:57 2040 GMT + Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Development, CN = wolfSSL Intermediate CA, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption - Public-Key: (2048 bit) + RSA Public-Key: (2048 bit) Modulus: - 00:c3:a2:73:5d:21:62:20:ce:3a:71:38:a7:94:bb: - db:87:04:1c:5a:1b:9e:4b:0d:3e:ca:f8:a5:f7:0d: - 6a:dc:23:90:22:6a:2b:58:63:4a:28:6a:48:a8:e7: - 73:1f:a2:55:d8:4d:02:3b:e2:cb:6b:e2:83:c9:51: - 8f:77:fd:dc:2d:5d:23:b7:23:9a:7e:b6:29:68:e8: - 2a:4e:a9:fe:32:70:31:9e:f0:ef:ee:f8:8d:e3:fc: - f3:d7:28:dd:7a:1d:9e:ad:23:2b:f1:a6:7f:34:52: - 29:66:d2:e5:64:55:64:d6:dd:4b:41:3b:55:83:6e: - c0:11:0e:6e:20:c2:16:73:eb:30:ff:09:46:bb:e7: - cc:c6:03:44:41:11:c6:c1:6c:36:2f:4a:f9:91:55: - ca:58:5e:37:b8:28:10:30:89:40:96:77:cf:70:66: - a4:55:fb:69:0b:e7:d9:b2:33:65:db:72:3a:77:b7: - 2b:49:fc:b6:cd:58:10:8d:ab:aa:cb:40:45:77:02: - 39:18:b3:8f:33:01:48:77:50:be:8e:73:a7:de:36: - a0:49:8e:2c:16:af:b9:fb:42:2d:35:6a:db:34:37: - d5:14:59:7d:65:72:e5:8b:65:55:4b:20:5e:47:f9: - f8:3a:d3:6c:d9:3a:f5:c7:01:46:31:c3:79:9a:18: - be:49 + 00:f2:23:28:f7:81:43:f0:63:b9:f2:77:7e:30:1a: + 40:6b:e1:dd:6b:41:36:ee:7d:58:23:dc:56:e9:bb: + e8:3b:11:58:c3:c3:b7:eb:98:5a:e9:76:12:cd:ef: + 77:09:25:d3:6c:e6:3a:49:68:50:90:d7:32:e0:18: + d6:05:df:f7:9e:d2:8f:7b:b5:91:5c:bf:3e:09:81: + dd:79:ed:44:c2:93:f5:9d:a4:cb:0a:6b:63:b4:f0: + ee:d1:dd:6c:e7:c6:b7:f1:30:d4:b7:54:28:18:11: + fc:25:ac:5b:f1:b3:19:13:47:7d:7e:d9:45:97:3c: + bb:b9:42:70:06:94:55:23:15:0b:84:ca:0c:15:c1: + 6e:1a:1c:f9:54:c9:e6:e3:b8:c1:45:e5:5a:89:e1: + f1:1b:1d:81:b7:34:07:17:28:5b:10:c7:a6:21:eb: + 5d:89:11:a3:d0:39:60:34:ea:e1:75:fa:b8:7c:ee: + c5:3f:64:6a:1d:b8:d8:a4:b2:82:98:31:11:e8:b5: + 20:2d:03:e5:d1:61:35:a4:4b:b5:ad:a6:b7:72:71: + 3e:86:38:0e:38:b6:5d:b5:ab:bf:3a:ba:1e:32:76: + ba:54:4d:05:ca:4e:e2:83:df:30:64:11:9e:99:93: + 3b:a6:fb:3b:df:7d:90:02:f4:b4:f1:e8:41:31:78: + 02:3f Exponent: 65537 (0x10001) X509v3 extensions: X509v3 Subject Key Identifier: - EF:69:E0:F7:D5:1D:E6:99:EC:DC:6D:D0:F7:E2:B9:5C:64:71:83:35 + 83:1C:F1:98:85:EC:6E:06:45:34:DE:51:C0:BA:B7:2B:67:32:66:4D X509v3 Authority Key Identifier: keyid:27:8E:67:11:74:C3:26:1D:3F:ED:33:63:B3:A4:D8:1D:30:E5:E8:D5 X509v3 Basic Constraints: critical - CA:TRUE, pathlen:0 + CA:TRUE, pathlen:1 X509v3 Key Usage: critical Digital Signature, Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 5e:cd:30:ce:13:06:a8:a3:25:6d:85:68:bf:88:3b:68:12:6a: - 5e:5f:22:82:51:4a:fd:b1:ae:b2:c2:3e:a1:e4:73:97:6f:77: - 1f:5e:0a:a6:3e:8a:20:93:4c:3f:68:64:69:a8:d7:ae:3e:a5: - 58:e4:d0:45:e4:7a:5f:cc:68:23:3d:7b:df:8d:33:8d:ba:0b: - 73:dd:97:41:99:1a:26:7f:17:87:c4:76:bb:3b:b5:15:24:b0: - 82:4f:2e:0a:c3:fe:ab:75:c9:4d:59:74:1a:c7:33:e7:4f:14: - 45:5b:f4:d3:c3:a9:9d:34:a8:e1:2a:33:ea:10:07:db:9e:33: - 83:60:f0:dd:7c:27:0d:6b:92:ef:90:cc:35:b3:4e:e3:fa:ca: - 87:55:31:e8:7b:8c:c2:35:19:41:6a:76:6c:6c:7a:d0:6a:d1: - 2d:a8:a6:97:40:73:52:9c:3c:43:a7:4b:f1:b7:04:af:e0:d1: - 32:3c:ac:df:a7:4a:15:fb:2e:56:d8:5c:4c:99:9d:3c:f0:6d: - a0:20:25:96:c9:24:fc:84:4c:dc:de:1d:29:e8:d4:e1:ff:ca: - 06:2f:39:ed:24:dc:79:f9:2a:18:00:ae:d2:8b:44:eb:2a:94: - fb:c8:02:86:0d:7e:1f:65:c7:20:06:5e:ca:50:af:bd:71:cb: - 06:da:12:ff + 7d:0d:5c:2a:19:e7:ee:5f:ca:2d:d4:59:54:b9:ca:33:18:3a: + e3:22:2c:18:70:bb:c5:58:45:d9:82:bc:80:5d:90:d9:02:34: + 6c:1a:4f:f1:6b:59:4e:cd:e1:ea:27:80:e6:e2:d8:7e:af:2b: + ac:c1:62:e0:4d:e9:e6:74:99:fe:c0:50:cb:d3:7d:e5:2b:82: + 0d:67:0d:14:b5:2c:6a:a2:7a:c2:dd:08:a7:40:2a:8f:a1:bf: + 4d:53:75:5d:dd:c3:82:e5:e4:1f:04:b0:b6:a7:cc:55:6c:b4: + d4:74:9e:9a:36:37:f0:32:69:97:44:fb:d2:22:1a:8b:95:34: + 44:32:cc:2a:a9:76:f7:12:c7:b9:9b:f1:e5:a7:c7:d5:6d:12: + ec:00:1d:21:b2:13:f2:33:e0:ea:e0:c8:63:7c:dd:06:c7:3c: + ba:a4:bd:a0:9b:8d:a1:1a:7d:3a:d7:c9:f3:35:4e:c5:76:6b: + 6d:50:d1:95:23:e8:c0:7f:3d:3f:45:08:10:77:6b:29:68:cc: + dd:b6:20:f8:c1:15:4c:6f:e2:ab:9d:61:13:dd:bc:c5:e7:98: + cc:23:29:ba:1c:b6:21:c0:b0:b6:e9:de:2b:43:d7:ca:7b:28: + 6a:fa:4c:c9:39:4d:e1:40:ed:e6:c0:16:9d:69:b2:f9:bf:db: + 50:27:3c:b3 -----BEGIN CERTIFICATE----- MIIEFzCCAv+gAwIBAgICEAAwDQYJKoZIhvcNAQELBQAwgZQxCzAJBgNVBAYTAlVT MRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMREwDwYDVQQKDAhT YXd0b290aDETMBEGA1UECwwKQ29uc3VsdGluZzEYMBYGA1UEAwwPd3d3LndvbGZz -c2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMB4XDTE4MTIy -MTE3NTQwMFoXDTM4MTIxNjE3NTQwMFowgZ8xCzAJBgNVBAYTAlVTMRMwEQYDVQQI +c2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMB4XDTIwMDYx +NjE5MTc1N1oXDTQwMDYxMTE5MTc1N1owgZ8xCzAJBgNVBAYTAlVTMRMwEQYDVQQI DApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3b2xmU1NM MRQwEgYDVQQLDAtEZXZlbG9wbWVudDEgMB4GA1UEAwwXd29sZlNTTCBJbnRlcm1l ZGlhdGUgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDDonNdIWIgzjpxOKeUu9uHBBxaG55L -DT7K+KX3DWrcI5AiaitYY0ooakio53MfolXYTQI74str4oPJUY93/dwtXSO3I5p+ -tilo6CpOqf4ycDGe8O/u+I3j/PPXKN16HZ6tIyvxpn80Uilm0uVkVWTW3UtBO1WD -bsARDm4gwhZz6zD/CUa758zGA0RBEcbBbDYvSvmRVcpYXje4KBAwiUCWd89wZqRV -+2kL59myM2Xbcjp3tytJ/LbNWBCNq6rLQEV3AjkYs48zAUh3UL6Oc6feNqBJjiwW -r7n7Qi01ats0N9UUWX1lcuWLZVVLIF5H+fg602zZOvXHAUYxw3maGL5JAgMBAAGj -ZjBkMB0GA1UdDgQWBBTvaeD31R3mmezcbdD34rlcZHGDNTAfBgNVHSMEGDAWgBQn -jmcRdMMmHT/tM2OzpNgdMOXo1TASBgNVHRMBAf8ECDAGAQH/AgEAMA4GA1UdDwEB -/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEAXs0wzhMGqKMlbYVov4g7aBJqXl8i -glFK/bGussI+oeRzl293H14Kpj6KIJNMP2hkaajXrj6lWOTQReR6X8xoIz17340z -jboLc92XQZkaJn8Xh8R2uzu1FSSwgk8uCsP+q3XJTVl0Gscz508URVv008OpnTSo -4Soz6hAH254zg2Dw3XwnDWuS75DMNbNO4/rKh1Ux6HuMwjUZQWp2bGx60GrRLaim -l0BzUpw8Q6dL8bcEr+DRMjys36dKFfsuVthcTJmdPPBtoCAllskk/IRM3N4dKejU -4f/KBi857STcefkqGACu0otE6yqU+8gChg1+H2XHIAZeylCvvXHLBtoS/w== +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDyIyj3gUPwY7nyd34wGkBr4d1rQTbu +fVgj3Fbpu+g7EVjDw7frmFrpdhLN73cJJdNs5jpJaFCQ1zLgGNYF3/ee0o97tZFc +vz4Jgd157UTCk/WdpMsKa2O08O7R3WznxrfxMNS3VCgYEfwlrFvxsxkTR31+2UWX +PLu5QnAGlFUjFQuEygwVwW4aHPlUyebjuMFF5VqJ4fEbHYG3NAcXKFsQx6Yh612J +EaPQOWA06uF1+rh87sU/ZGoduNiksoKYMRHotSAtA+XRYTWkS7WtprdycT6GOA44 +tl21q786uh4ydrpUTQXKTuKD3zBkEZ6Zkzum+zvffZAC9LTx6EExeAI/AgMBAAGj +ZjBkMB0GA1UdDgQWBBSDHPGYhexuBkU03lHAurcrZzJmTTAfBgNVHSMEGDAWgBQn +jmcRdMMmHT/tM2OzpNgdMOXo1TASBgNVHRMBAf8ECDAGAQH/AgEBMA4GA1UdDwEB +/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEAfQ1cKhnn7l/KLdRZVLnKMxg64yIs +GHC7xVhF2YK8gF2Q2QI0bBpP8WtZTs3h6ieA5uLYfq8rrMFi4E3p5nSZ/sBQy9N9 +5SuCDWcNFLUsaqJ6wt0Ip0Aqj6G/TVN1Xd3DguXkHwSwtqfMVWy01HSemjY38DJp +l0T70iIai5U0RDLMKql29xLHuZvx5afH1W0S7AAdIbIT8jPg6uDIY3zdBsc8uqS9 +oJuNoRp9OtfJ8zVOxXZrbVDRlSPowH89P0UIEHdrKWjM3bYg+MEVTG/iq51hE928 +xeeYzCMpuhy2IcCwtuneK0PXynsoavpMyTlN4UDt5sAWnWmy+b/bUCc8sw== -----END CERTIFICATE----- diff --git a/certs/intermediate/ca-int-ecc-cert.der b/certs/intermediate/ca-int-ecc-cert.der index 171c86b1d5b5b84d6b3df34ba163663c1baefd27..4daec9a04aac99c718c27a5563742b9b46f4c822 100644 GIT binary patch delta 249 zcmbQrI-OO}powWR5L+x@W@2PwViI7PD7Z@A$iTqN(9F=%(A?A_N}SgO#5II+4H_3u zREV8y&X|~dY|h#Kr*EQfZ1^)#;SslWU~q_cr*j{}y@~5CPx#z==Zvi&hiF;Tqe-S- zS6us=&6<*S__DWhFAaGh@?!G6`bjSqrx~Oe$g(kq%JQ*@v4{w7t&B9^B@$T-=6N!H7g!N844k)bPa;powWB5L+x@W@2PwViI7UD7Z@A(8AEj$k5Q-)WpCrN}Sgi$Tc*Bat#_6 zPgIDVY|faNJoUcJrg;i0Wfw)Sj+wn8jZO2}rW=n%mK{F0Wv#D^go0db`d?AmT-Ar- z8w*dhGJm+V-Z9P1Eccb;Y5x;m7ZxP;EKV~>F_2|r4wdC&5n~aVE}L+;T`6*Qf_%%C znKB)|`)|qRP5#Yj!pJb$fJxTFox#9`NkO4^?;eh>AcfU?K1|`Uv6wUOfJE?=DfQvD vqJ5?DJx!HN3J!Ms>a$+#n*C+w`9iadi*F4>%wOo4Uzq2)QoZsZvq=B|RAXBC diff --git a/certs/intermediate/ca-int-ecc-cert.pem b/certs/intermediate/ca-int-ecc-cert.pem index 885ebf484..279ecc60c 100644 --- a/certs/intermediate/ca-int-ecc-cert.pem +++ b/certs/intermediate/ca-int-ecc-cert.pem @@ -1,52 +1,52 @@ Certificate: Data: Version: 3 (0x2) - Serial Number: 4099 (0x1003) - Signature Algorithm: ecdsa-with-SHA256 - Issuer: C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Development, CN=www.wolfssl.com/emailAddress=info@wolfssl.com + Serial Number: 4100 (0x1004) + Signature Algorithm: ecdsa-with-SHA256 + Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Development, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Dec 21 17:54:01 2018 GMT - Not After : Dec 16 17:54:01 2038 GMT - Subject: C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Development, CN=wolfSSL Intermediate CA ECC/emailAddress=info@wolfssl.com + Not Before: Jun 16 19:17:58 2020 GMT + Not After : Jun 11 19:17:58 2040 GMT + Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Development, CN = wolfSSL Intermediate CA ECC, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: id-ecPublicKey Public-Key: (256 bit) - pub: - 04:95:df:1c:b2:9e:20:a9:1d:a2:5b:ab:5c:9b:a8: - 66:06:29:e6:b2:d8:e3:14:a6:c3:c1:b4:ad:4d:44: - 18:20:1e:5d:67:fd:15:1d:6d:25:e1:17:b1:71:ca: - 85:03:f0:d2:af:41:66:46:36:6d:ea:41:cb:4f:c8: - 4a:d0:a0:61:8c + pub: + 04:c6:9c:cd:8f:e5:ec:5b:d8:b0:fc:91:20:e2:0b: + 3b:51:53:54:4b:89:43:8e:00:de:91:ae:d3:90:f3: + 85:dc:cc:3d:11:08:15:76:82:e2:92:35:4a:d4:45: + 8e:83:36:82:62:b8:4d:07:85:0b:a5:54:e0:14:e8: + 93:de:7f:92:e8 ASN1 OID: prime256v1 NIST CURVE: P-256 X509v3 extensions: X509v3 Subject Key Identifier: - 97:1D:60:C3:87:22:59:9B:60:1F:84:B4:99:1C:88:4D:BF:DA:1E:6E + 13:B5:79:59:32:B3:BB:B4:47:B3:34:0E:80:C0:83:1E:AA:82:C8:5B X509v3 Authority Key Identifier: keyid:56:8E:9A:C3:F0:42:DE:18:B9:45:55:6E:F9:93:CF:EA:C3:F3:A5:21 X509v3 Basic Constraints: critical - CA:TRUE, pathlen:0 + CA:TRUE, pathlen:1 X509v3 Key Usage: critical Digital Signature, Certificate Sign, CRL Sign Signature Algorithm: ecdsa-with-SHA256 - 30:44:02:20:20:8d:bd:bc:08:8a:52:20:ab:bc:f0:94:0c:3c: - 38:9c:9e:c0:18:53:94:94:7f:57:3d:15:8e:75:5f:8c:82:79: - 02:20:40:3e:0f:27:9a:e8:ba:9b:f4:99:cf:71:36:68:d1:ed: - 31:54:37:e8:2e:37:d0:9e:49:a9:27:79:c1:03:34:50 + 30:46:02:21:00:8a:51:91:f6:92:c5:4a:69:65:db:5b:90:c3: + 90:6a:c0:96:e7:26:7a:af:18:91:2c:6b:67:55:40:18:6c:c1: + a6:02:21:00:96:cc:9d:37:ad:ea:79:52:6e:4d:41:93:db:64: + 7f:e7:42:b9:f1:12:90:f4:84:5c:73:b1:21:d8:fb:55:fe:6f -----BEGIN CERTIFICATE----- -MIICkTCCAjigAwIBAgICEAMwCgYIKoZIzj0EAwIwgZcxCzAJBgNVBAYTAlVTMRMw +MIICkzCCAjigAwIBAgICEAQwCgYIKoZIzj0EAwIwgZcxCzAJBgNVBAYTAlVTMRMw EQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3 b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEYMBYGA1UEAwwPd3d3LndvbGZz -c2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMB4XDTE4MTIy -MTE3NTQwMVoXDTM4MTIxNjE3NTQwMVowgaMxCzAJBgNVBAYTAlVTMRMwEQYDVQQI +c2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMB4XDTIwMDYx +NjE5MTc1OFoXDTQwMDYxMTE5MTc1OFowgaMxCzAJBgNVBAYTAlVTMRMwEQYDVQQI DApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3b2xmU1NM MRQwEgYDVQQLDAtEZXZlbG9wbWVudDEkMCIGA1UEAwwbd29sZlNTTCBJbnRlcm1l ZGlhdGUgQ0EgRUNDMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMFkw -EwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEld8csp4gqR2iW6tcm6hmBinmstjjFKbD -wbStTUQYIB5dZ/0VHW0l4RexccqFA/DSr0FmRjZt6kHLT8hK0KBhjKNmMGQwHQYD -VR0OBBYEFJcdYMOHIlmbYB+EtJkciE2/2h5uMB8GA1UdIwQYMBaAFFaOmsPwQt4Y -uUVVbvmTz+rD86UhMBIGA1UdEwEB/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgGG -MAoGCCqGSM49BAMCA0cAMEQCICCNvbwIilIgq7zwlAw8OJyewBhTlJR/Vz0VjnVf -jIJ5AiBAPg8nmui6m/SZz3E2aNHtMVQ36C430J5JqSd5wQM0UA== +EwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAExpzNj+XsW9iw/JEg4gs7UVNUS4lDjgDe +ka7TkPOF3Mw9EQgVdoLikjVK1EWOgzaCYrhNB4ULpVTgFOiT3n+S6KNmMGQwHQYD +VR0OBBYEFBO1eVkys7u0R7M0DoDAgx6qgshbMB8GA1UdIwQYMBaAFFaOmsPwQt4Y +uUVVbvmTz+rD86UhMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgGG +MAoGCCqGSM49BAMCA0kAMEYCIQCKUZH2ksVKaWXbW5DDkGrAlucmeq8YkSxrZ1VA +GGzBpgIhAJbMnTet6nlSbk1Bk9tkf+dCufESkPSEXHOxIdj7Vf5v -----END CERTIFICATE----- diff --git a/certs/intermediate/ca-int2-cert.der b/certs/intermediate/ca-int2-cert.der new file mode 100644 index 0000000000000000000000000000000000000000..564f83a27b9ef804d347679076b4b1b4d03fafec GIT binary patch literal 1063 zcmXqLVo^3|V&-1J%*4pV#3aCIz{|#|)#lOmotKf3o0Y+!alRq90Vf-CC<~h~Q)sZE zuz?_m!@-ibnU`LYpJymwzy}g!=V1>{O)M$NNrj1U@vxWY=cEM(`xuHC2!Yga z^KiSQmZj$87v!eql^7}*$bm$edBmaW6g=}vQj2m^Q!*1vQWcyX4do4F;V$B26cfnI zOUrivDK0L~(M!(HHINhMH8LZl`kzs-ULMDS)$%TC`ZC56L{}{Z>{*uc5|EJgY zFMIy8eU?1KnSO`13M=VZ6?~8LZhd~96JBO`o>_6$iAv3c+wX3y6y1^@T|TSr=WXXR zi})u#EAW@g6WQ4NVc}ED@`aP8cX+9N?3kgF^VjWBA$#olD|=S-#J+RpxV8KZXW-kl zXG^;yjxU@M_FS@JvUhO#_FI*;1ueT}UoNm=+OvGxuiY~ytTUCo@H|CsF6TnFPlx`V zUaYBepz_Ddmy^?bO!XFeE-=Zlkj?g4y6bpL!&Gsh(|4DD)6+T5e=tOTdJd!YExqG+ zf={YFo0YbrKJ?ewB8kj)zn&*dcfT7-EzUdJ;asrABzIX`DHAgz1LNW}gA`y|U=Ee# zV-aH!sp^*XTkLS+Tts~DpZ{(;rH(h5zh0_SCe~z2X<}O zPB%*P1*bt-VMfOPEF1=GK#GZx5uA2q`9WeVz+BLV923AC0E`Jn2A-msZ=W+q9MbN% zw947AMMD4H(bxwHH$rUUwA;1jPuuu@-}U3_g&AuK6L;iYT;;9*{)+kY-R%>SJuGG` zi0<99zH7_+;E8=Lf+DZ-Tfg}2;_{rhS#qY<#h=TUXaB9Q=%~J2tFv)_fvD8&w%O;l zv#Y+b?1@}_>Eam)QIQ3$zW%>wx$ECaJ6>BO)aem%<+PNv(5^XeV|w-%@x}K!nRw^e zvE<(jc&srwTljDGHC^emzyEPB?zw;B+1h!TU6ZF>Z!z3`>eKB<5+^@S>^jai{}9*9 zE%A@575+$x$uI>AolSEM&D(fjs;>4m$sIHO=1>+kVW!YvLtz6! z5Ql?@D?G6{BQr0(BtOqkz<>`V$j-waoSIltl9LJ(;o@O0&(BE<4)!q=F%SZ&;pX9X zNi9pw$uG!F%_}ifF;D`DGV@47)hT%9m82Hsrlw>jmZT~;J1V$3I~&Ry$g*()oz(W7 zmywfEOdvBaE#Cp8p}06lFF8NgKu(<3$iTqN(9F=%(A?A_N}SgO#5II+4H}ow)EBA- z$`D`3VDp6$(cXwO5N2Zs2R#!bG!B><*_oXfSYC-~=%~jz&Scf-p84zOq7oZX-=Htv zy3Hm{eOI^HCthfO{lkYX?roY}Kfw95Rit8x0sb?%htyR(#1_&yK zNX|V20SBQ(13~}<$F!-RGW(*BYV$6^UCIdT#-9_d^*)_-_vG>xnK$=|bI(+PUlt4m bc!e|XlA`y9KgXfE3Un93MS6D=sT2Lv&Nwx& literal 0 HcmV?d00001 diff --git a/certs/intermediate/ca-int2-ecc-key.pem b/certs/intermediate/ca-int2-ecc-key.pem new file mode 100644 index 000000000..f990291d6 --- /dev/null +++ b/certs/intermediate/ca-int2-ecc-key.pem @@ -0,0 +1,5 @@ +-----BEGIN EC PRIVATE KEY----- +MHcCAQEEII+zslkuKviaewVavBNMdG7LrE5+ZjXgww20JPQUFLyCoAoGCCqGSM49 +AwEHoUQDQgAEx7SpnzL7oo9q8y7BXcoI7MafE631Pp119+TyFpk394lzz1SBXxYM +BHiFM++SoveGP8ehugp0F8JFencTqRP90w== +-----END EC PRIVATE KEY----- diff --git a/certs/intermediate/ca-int2-key.der b/certs/intermediate/ca-int2-key.der new file mode 100644 index 0000000000000000000000000000000000000000..508b5050b5fbf99a3eb7037dc9b3f44bebbb9a0f GIT binary patch literal 1191 zcmV;Y1X%kpf&`-i0RRGm0RaHd$vs&CpB;CRR?Djfg290?n&SD!`J+HBhCAX!9s!lmk*8+CB4{>KDpCXMwVQ$gB>B;<`%_F>2IX#A)~s778dK=krOs}gG{XoB z%P)@K?~FC|u)JLlt_n)eQ~}aFw0Q1F5LSRsgNIIMA5Rx9J}vca$p@l7GLjD-qzhH1 zAB69nb?;_;b@%5$I-J2XLOm~knO%DX)v0Vj=!q6s{W_ooy?54QUTPCrH(&8t0Yylh zi}x1vQ1@E2S~K?bLBTx&0|5X50)hbmWLyZFg5v#hkm_ML+s-faT&FnI_qzX-vFKGq zeJ9bfwsV3$5UsBC+IpUVt*G!>US>sDaVX0lR9+YgUFNnX5bWon_Xrl01WXzhtVwbc zT&x~6SzpJ1rJzKYy~BJRZ%e)Ax_T(0$>Mrd_HH%wVA_ePwchbG|Fu@bP zOPL|QW+5hNh_9V?JNmx1nsNq7h*Gi05jL?48(Qfj=(JuWCoLz}#c~OmJ(sNK9hy-A zpnfjtH1e4e#r#D23<Y6RZCe}qN$;uXXdkVVw&)pB#iob6qZ2sI z72^@t_wj;pmYcBk=FND9AsXTX(Hir20)c@5o?Qi(1o?li-oEfK&N6?|DR?$`gHUhT z7kf)J`a*NJv82xfK{2xn#GGt6G-HX2(n@(L!8y?${XR>QbX*iuYP*kbckEL>tAhCq z3^71R$&u|&LhlHB*;pv2II!f&#x_E2LwczbmHJ)ab#$ekoT_6QhDG3J|7!q7BbBTK`Orjfq(`|Fw#<>YEaRG?W)hNJlofHl-Xhw7g$9k9sG$ Fxj?41IpzQW literal 0 HcmV?d00001 diff --git a/certs/intermediate/ca-int2-key.pem b/certs/intermediate/ca-int2-key.pem new file mode 100644 index 000000000..470b587d3 --- /dev/null +++ b/certs/intermediate/ca-int2-key.pem @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEowIBAAKCAQEAz8k9WQGfHXeRVsurBoLBgTGa4vnG+aNALYZC119BpQVCD18r +a70pkuVSxlz5fp37jtZpjAORhxwfvyRZRMzvr5IqBuGhAVsEV4oatgTiwjwQPEIx +AarD8jIeAZXQkadmwSJoNlMqUgPrtZuCAST50a77U0xaBuVuWtasWygaU+jXpc5u +nDTDCAvLL47f74w19bC8XQ+uCkrPVAHSPLR47kgQVoBPg4dOZx9PFy4+LfVtyQei +PjKSDx6kC1WmH4TvnXXvZnx19+dAOpzBM0I9L3+ZXXsE1alsQeiJFlj9OqAEvXfW +Y15qE1k3X/FZAUVInIv3FvRQ91q0WjP29UHBPQIDAQABAoIBAGRcCJuC4v1ykOph +ONvOL/RcpzjV97r/lLHoVUR9J9GytnOCPhCtrvTaep6ArajwWV5mRVhxKMsfVF4Y +Cl3mtiYQ7Oeh9wgWlARMGhasSXITXKweNFlfx4CloESXvcN8HW9PVRJYHOq8Jg7z +a1luKJOUdqOHDzyheCm74ketGPpJb3oDd8TQBVIvZUZCl4ibMLbTbCxV5GVgL9E1 ++aHzeXZKRAt6JlSlEYsCQSkqHl5RUr44E51oGg7LXpESTEdoS2ymi0qfY9jNu7mR +Ihed4aXAp0rTkMk9Q4SSnmoimKG3neC2sl8x+TpOiSzAkWGSYLVsCt9YyOxIp0gp +iX7V7KkCgYEA6tk3lPbkFqPqLu1INYtbWCIF63x30r30MMETvkuZIb5mISZpiK+d +djv6vraacgZJiFKxyBE2sQsbWukj6LReJCctJ9fFcgmZPZes5x2aUQGgfi7pNPKZ +EsX8RPoMCb2MlzEKHgGKWh0h1dbgR9wmIqR2bRVL4cEJoeEHsZCwlesCgYEA4oAO +5ugq641rhJDB9+ySW6rXOV57Wb5FAvGrAo3t+YlMr5ca84uA2gcr5+/Hi3OuBdkb +2bX4qhxgeXHEjGk42vt39k9FfwUt7mQjmR7DO1NtWxv6Se+p6GgfrZS26BlSxaaH +vKMTOM0V4xHX9/GCcZabsPXmzXiGIRriA9Ea83cCgYEAnl0FlwT5f67evvAwzjJ/ +0Sl4NniDUG/ZF3tLNfpCc7expM8DQTGzC8ScbDg0Y4mL0kp5KcE50R79PkuSdFwU +U2q7j2937FM+q4L5DAwxQEjJke1OQu8Ie9lYKKc4sOTJxjZCbUN6qROV+l3gdXSl +npyqYxqGReBm/2sARiOcgCsCgYBMr8jb2y109Tu69XwG4f0nti8KiHfBCc+50HLy ++XTiMN9a8BE69jeZGiZ+b8ui5na8Gib4zkiz58muNJu0YofSdKPILEy+VdWYSiVX +WXgGZRe4aj+SuudO/boD/j7zVGeW7ew1LQ18BMvtRoRVuVpN9Q0fnBIZ7T2UhdKS +MkEqvwKBgAZKMNJSoGpQ0YPtqs+u44IAGG3O84PQYmH11OTOoZvFLMm0Z3tw5uy3 +3HKA9QAULscEVHpeXR5I+fXK2bogIppVfjZykiJydUU4D3v0g5m+tQNBkNNTgacf +M7r5VO6vKKEArDZpLznW+/z1tXK46hIqrDalHDO0vF84j3onublA +-----END RSA PRIVATE KEY----- diff --git a/certs/intermediate/client-chain-alt-ecc.pem b/certs/intermediate/client-chain-alt-ecc.pem index 58bb755f0..f3da8682a 100644 --- a/certs/intermediate/client-chain-alt-ecc.pem +++ b/certs/intermediate/client-chain-alt-ecc.pem @@ -1,35 +1,52 @@ -----BEGIN CERTIFICATE----- -MIICxjCCAmygAwIBAgICEAUwCgYIKoZIzj0EAwIwgaMxCzAJBgNVBAYTAlVTMRMw +MIICyDCCAm2gAwIBAgICEAcwCgYIKoZIzj0EAwIwgaQxCzAJBgNVBAYTAlVTMRMw +EQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3 +b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDElMCMGA1UEAwwcd29sZlNTTCBJ +bnRlcm1lZGlhdGUyIENBIEVDQzEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3Ns +LmNvbTAeFw0yMDA2MTYxOTE3NThaFw0zMDA2MTQxOTE3NThaMIGgMQswCQYDVQQG +EwJVUzETMBEGA1UECAwKV2FzaGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEQMA4G +A1UECgwHd29sZlNTTDEUMBIGA1UECwwLRGV2ZWxvcG1lbnQxITAfBgNVBAMMGHdv +bGZTU0wgQ2xpZW50IENoYWluIEVDQzEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xm +c3NsLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABFW/9A9EUJo9zpu38MVN +9XB71OwkjhmA7FpMoiQDYiyb2u+iNRJDhHYWxlaVBswBqb32dRpC972psjYiX8dd +f7SjgZAwgY0wCQYDVR0TBAIwADARBglghkgBhvhCAQEEBAMCBaAwHQYDVR0OBBYE +FOvUS1lrlWE/UVe2BE2JQYhEXKvyMB8GA1UdIwQYMBaAFBv0vZAodGTjM16LZKf8 +r7ryuVXlMA4GA1UdDwEB/wQEAwIF4DAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYB +BQUHAwQwCgYIKoZIzj0EAwIDSQAwRgIhAK6CPTUWc9Ue5ac0zydwQpncWVqKNiU3 +gYnFhKaVgJ2tAiEA2Y4dfm0koH4xgiUJ6OHYtrpOmV+5TeNmPhFhuuIqeuM= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICnzCCAkWgAwIBAgICEAUwCgYIKoZIzj0EAwIwgaMxCzAJBgNVBAYTAlVTMRMw EQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3 b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEkMCIGA1UEAwwbd29sZlNTTCBJ bnRlcm1lZGlhdGUgQ0EgRUNDMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTE4MTIyMTE3NTQwMVoXDTI4MTIxODE3NTQwMVowgaAxCzAJBgNVBAYT +Y29tMB4XDTIwMDYxNjE5MTc1OFoXDTQwMDYxMTE5MTc1OFowgaQxCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYD -VQQKDAd3b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEhMB8GA1UEAwwYd29s -ZlNTTCBDbGllbnQgQ2hhaW4gRUNDMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZz -c2wuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEVb/0D0RQmj3Om7fwxU31 -cHvU7CSOGYDsWkyiJANiLJva76I1EkOEdhbGVpUGzAGpvfZ1GkL3vamyNiJfx11/ -tKOBkDCBjTAJBgNVHRMEAjAAMBEGCWCGSAGG+EIBAQQEAwIFoDAdBgNVHQ4EFgQU -69RLWWuVYT9RV7YETYlBiERcq/IwHwYDVR0jBBgwFoAUlx1gw4ciWZtgH4S0mRyI -Tb/aHm4wDgYDVR0PAQH/BAQDAgXgMB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEF -BQcDBDAKBggqhkjOPQQDAgNIADBFAiBe6My62YzVR/EAn/a2IjlFpCektOZbCnJ0 -wFB0KiilZQIhAKofLu9dYlzn5JMB77wMijSohui3fABOA7QX43L+ZYHf +VQQKDAd3b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDElMCMGA1UEAwwcd29s +ZlNTTCBJbnRlcm1lZGlhdGUyIENBIEVDQzEfMB0GCSqGSIb3DQEJARYQaW5mb0B3 +b2xmc3NsLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABOoWKCwnXkGZBSiL +mfrFonQ8FU1S9EstgzSCjtW2P2HQh+v4TAZe7WYejMqk9ip2T9cmCUweibkYjtKj +ZjwbPcujZjBkMB0GA1UdDgQWBBQb9L2QKHRk4zNei2Sn/K+68rlV5TAfBgNVHSME +GDAWgBQTtXlZMrO7tEezNA6AwIMeqoLIWzASBgNVHRMBAf8ECDAGAQH/AgEBMA4G +A1UdDwEB/wQEAwIBhjAKBggqhkjOPQQDAgNIADBFAiBPG9Hh145ztYv3TQs9/BK8 +b3ytuRJwMDdBJ+xrNQaORwIhAKFVkbdoHjJmN2gQCp827sOXK4W4PEc8Su0TxVtZ +vLUp -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIICkTCCAjigAwIBAgICEAMwCgYIKoZIzj0EAwIwgZcxCzAJBgNVBAYTAlVTMRMw +MIICkzCCAjigAwIBAgICEAQwCgYIKoZIzj0EAwIwgZcxCzAJBgNVBAYTAlVTMRMw EQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3 b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEYMBYGA1UEAwwPd3d3LndvbGZz -c2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMB4XDTE4MTIy -MTE3NTQwMVoXDTM4MTIxNjE3NTQwMVowgaMxCzAJBgNVBAYTAlVTMRMwEQYDVQQI +c2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMB4XDTIwMDYx +NjE5MTc1OFoXDTQwMDYxMTE5MTc1OFowgaMxCzAJBgNVBAYTAlVTMRMwEQYDVQQI DApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3b2xmU1NM MRQwEgYDVQQLDAtEZXZlbG9wbWVudDEkMCIGA1UEAwwbd29sZlNTTCBJbnRlcm1l ZGlhdGUgQ0EgRUNDMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMFkw -EwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEld8csp4gqR2iW6tcm6hmBinmstjjFKbD -wbStTUQYIB5dZ/0VHW0l4RexccqFA/DSr0FmRjZt6kHLT8hK0KBhjKNmMGQwHQYD -VR0OBBYEFJcdYMOHIlmbYB+EtJkciE2/2h5uMB8GA1UdIwQYMBaAFFaOmsPwQt4Y -uUVVbvmTz+rD86UhMBIGA1UdEwEB/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgGG -MAoGCCqGSM49BAMCA0cAMEQCICCNvbwIilIgq7zwlAw8OJyewBhTlJR/Vz0VjnVf -jIJ5AiBAPg8nmui6m/SZz3E2aNHtMVQ36C430J5JqSd5wQM0UA== +EwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAExpzNj+XsW9iw/JEg4gs7UVNUS4lDjgDe +ka7TkPOF3Mw9EQgVdoLikjVK1EWOgzaCYrhNB4ULpVTgFOiT3n+S6KNmMGQwHQYD +VR0OBBYEFBO1eVkys7u0R7M0DoDAgx6qgshbMB8GA1UdIwQYMBaAFFaOmsPwQt4Y +uUVVbvmTz+rD86UhMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgGG +MAoGCCqGSM49BAMCA0kAMEYCIQCKUZH2ksVKaWXbW5DDkGrAlucmeq8YkSxrZ1VA +GGzBpgIhAJbMnTet6nlSbk1Bk9tkf+dCufESkPSEXHOxIdj7Vf5v -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G diff --git a/certs/intermediate/client-chain-alt.pem b/certs/intermediate/client-chain-alt.pem index 6ace19174..d1e4672c6 100644 --- a/certs/intermediate/client-chain-alt.pem +++ b/certs/intermediate/client-chain-alt.pem @@ -1,51 +1,76 @@ -----BEGIN CERTIFICATE----- -MIIESjCCAzKgAwIBAgICEAIwDQYJKoZIhvcNAQELBQAwgZ8xCzAJBgNVBAYTAlVT +MIIESzCCAzOgAwIBAgICEAMwDQYJKoZIhvcNAQELBQAwgaAxCzAJBgNVBAYTAlVT +MRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQK +DAd3b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEhMB8GA1UEAwwYd29sZlNT +TCBJbnRlcm1lZGlhdGUyIENBMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu +Y29tMB4XDTIwMDYxNjE5MTc1OFoXDTMwMDYxNDE5MTc1OFowgZwxCzAJBgNVBAYT +AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYD +VQQKDAd3b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEdMBsGA1UEAwwUd29s +ZlNTTCBDbGllbnQgQ2hhaW4xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5j +b20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDDA9Er/jmkMkU7U8iE +Kyp8dJq9qipSB0fWpjayBzKO0Lppe8bDRJ7UgUj9LWiii2e7oXXINixK0hv3i7rP +Dfnv7PGBHnubA0eav2XMf2UkaaboFIlb5DT3xbAUk/Vnezp6eOEBVlaRphNCjdI8 +QJxM79GG3zdRGwyhO/Xxo0o15OHOlt8bfr9Ol9AQ6KgIMIGvIAtDFMV0Z7Qygm+N +hsKIQJk2g7oeQHIiF9dSZSRzsM7vGc2u/3hse8ASA9ROcg1QbTujO6OZXp3I2QyF +s9mK2VQm2236rLv/JUzE0Xn0cdOGQBgTsGO1ck4wxJeEhi1WL9cV93/ArvX8W+X7 +obrTAgMBAAGjgZAwgY0wCQYDVR0TBAIwADARBglghkgBhvhCAQEEBAMCBaAwHQYD +VR0OBBYEFDPYRWbXaIcYflQNcCeRxybXhWXAMB8GA1UdIwQYMBaAFHqLHU6jQMjO +WF+N/P9GLHVB2QNeMA4GA1UdDwEB/wQEAwIF4DAdBgNVHSUEFjAUBggrBgEFBQcD +AgYIKwYBBQUHAwQwDQYJKoZIhvcNAQELBQADggEBAD37nA7EM00jkoUtSldJc0AV +Kv/Ce+VmdWoG3r0Ji/3yQeW4r5Zc1Z5voFL6EBKwcY0gQ5kWKjlG7fU6swM1nYUe +5+75YUudIKIWdmlndwaD9cCXDNmxtdZ9d8CTJ6kn8DG0rI1zPPFzGXSv92cHaL3F +KJOI3ZCxEp9kprrEwEZ84wrbrsc5bJwBCrpk23TlAnI4zY6yLu8YwqbnbT+PxJLK +reAMivJIyuEcySCm3tPFI1R9EMfb9Yw5snlRP/PXFfIiR5t7ANhU48BzIWh81vLM ++rMnhagqZcdthdF3YnnPZD0kbMzSW7z++qmj6YWFH4eNbW/b8KS2WajxN6WNP50= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEIzCCAwugAwIBAgICEAEwDQYJKoZIhvcNAQELBQAwgZ8xCzAJBgNVBAYTAlVT MRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQK DAd3b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEgMB4GA1UEAwwXd29sZlNT TCBJbnRlcm1lZGlhdGUgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5j -b20wHhcNMTgxMjIxMTc1NDAwWhcNMjgxMjE4MTc1NDAwWjCBnDELMAkGA1UEBhMC +b20wHhcNMjAwNjE2MTkxNzU3WhcNNDAwNjExMTkxNzU3WjCBoDELMAkGA1UEBhMC VVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNV -BAoMB3dvbGZTU0wxFDASBgNVBAsMC0RldmVsb3BtZW50MR0wGwYDVQQDDBR3b2xm -U1NMIENsaWVudCBDaGFpbjEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNv -bTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMMD0Sv+OaQyRTtTyIQr -Knx0mr2qKlIHR9amNrIHMo7Quml7xsNEntSBSP0taKKLZ7uhdcg2LErSG/eLus8N -+e/s8YEee5sDR5q/Zcx/ZSRppugUiVvkNPfFsBST9Wd7Onp44QFWVpGmE0KN0jxA -nEzv0YbfN1EbDKE79fGjSjXk4c6W3xt+v06X0BDoqAgwga8gC0MUxXRntDKCb42G -wohAmTaDuh5AciIX11JlJHOwzu8Zza7/eGx7wBID1E5yDVBtO6M7o5lencjZDIWz -2YrZVCbbbfqsu/8lTMTRefRx04ZAGBOwY7VyTjDEl4SGLVYv1xX3f8Cu9fxb5fuh -utMCAwEAAaOBkDCBjTAJBgNVHRMEAjAAMBEGCWCGSAGG+EIBAQQEAwIFoDAdBgNV -HQ4EFgQUM9hFZtdohxh+VA1wJ5HHJteFZcAwHwYDVR0jBBgwFoAU72ng99Ud5pns -3G3Q9+K5XGRxgzUwDgYDVR0PAQH/BAQDAgXgMB0GA1UdJQQWMBQGCCsGAQUFBwMC -BggrBgEFBQcDBDANBgkqhkiG9w0BAQsFAAOCAQEAiIEheKwEinl+zaW6O/5SYeic -XSiRymhyMZnVFXiZ0QP/thNZI0iekpTMkQGT3Bk2aNdIU6uZ2CP8KJhD8+uf4i/E -TLMcSDWSbVNGXcEgIQdxJaE3iRqb7PXj0RWg/hAuzWfVPW7WufU4jToSyS754anI -b9YEBWbfPDpp16prXnEN41M4PYdKHseIeByHWiG9D4b0fIa9UX2cy/KypkF6+LsI -EWdqMZ9I9tEHojaHg3NoO8kRXquj0GGa341SuYp50vNdsD0Vae6jtcK+tD8RsAbT -uLQyRZX/dkjrYwsdeQ9VldZ8htRhIPkPooKkH7EQU9joyCezvZh7CsRbgtBszw== +BAoMB3dvbGZTU0wxFDASBgNVBAsMC0RldmVsb3BtZW50MSEwHwYDVQQDDBh3b2xm +U1NMIEludGVybWVkaWF0ZTIgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNz +bC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCgL6ECMF0ZoY5E +htST9/FTuj/SJN//y6+Ppuf5h5ofAMyPQIZ4OhuaeA7jbtrz52xXdjHPAyGayHkp +YNvu2KkVtGdbd5qG+dtDzKIPkeZwTx5uFLGN8KHlOXehkpeISibxiJgkbP1G4nEH +Xa/UvKiMXe5DCNqn7AlR7a3NdYtYx6GYVucZeJNLU3e32nl9cIS7HemgPAK8p5b6 +u5iQrjUZ0OdkHp0JoQbywv3LoykswHn46emTZ4w1LqFJoDRsOB1rTKW6x4SAlRcS +y92n9i4sxw/BVB+XbAE72i7H3FPJJuaaZqh/VfrNchhph06M5ALd9zEao27NiENw +tDRtpoZ1AgMBAAGjZjBkMB0GA1UdDgQWBBR6ix1Oo0DIzlhfjfz/Rix1QdkDXjAf +BgNVHSMEGDAWgBSDHPGYhexuBkU03lHAurcrZzJmTTASBgNVHRMBAf8ECDAGAQH/ +AgEBMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEADHKZ7ecDWMIr +iNKqQzGEGC/exV3gINhUPF4rhyqflrHvvtfHJ3ForHFhuG7Rqksv79Q357uHkGNI +OJsgFb28r4q0r1ORjoQRFOpvhfROugpJkbMZmSrR+aena/1/eIh7030ssZ9wFRrb +hpvOtwcl7DmMWaPS0cwYFRSghU1P+5pHL9xmx318EolIWNTLGhsSupztXIy/cg5f +jkI0S2w+BG/ZUOMok2sT/WvWLRvN+/4Lo4zfyOatnmmKk5bXhDG7yvLb4hjJ8ZGK +xwafwgrptF/jeyD8GhYcAlMSzWZFVW6xwJUtK9YZuJlOHxuc+7n+jH4yV/OA6fi+ +JS8DRjyzCg== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEFzCCAv+gAwIBAgICEAAwDQYJKoZIhvcNAQELBQAwgZQxCzAJBgNVBAYTAlVT MRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMREwDwYDVQQKDAhT YXd0b290aDETMBEGA1UECwwKQ29uc3VsdGluZzEYMBYGA1UEAwwPd3d3LndvbGZz -c2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMB4XDTE4MTIy -MTE3NTQwMFoXDTM4MTIxNjE3NTQwMFowgZ8xCzAJBgNVBAYTAlVTMRMwEQYDVQQI +c2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMB4XDTIwMDYx +NjE5MTc1N1oXDTQwMDYxMTE5MTc1N1owgZ8xCzAJBgNVBAYTAlVTMRMwEQYDVQQI DApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3b2xmU1NM MRQwEgYDVQQLDAtEZXZlbG9wbWVudDEgMB4GA1UEAwwXd29sZlNTTCBJbnRlcm1l ZGlhdGUgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDDonNdIWIgzjpxOKeUu9uHBBxaG55L -DT7K+KX3DWrcI5AiaitYY0ooakio53MfolXYTQI74str4oPJUY93/dwtXSO3I5p+ -tilo6CpOqf4ycDGe8O/u+I3j/PPXKN16HZ6tIyvxpn80Uilm0uVkVWTW3UtBO1WD -bsARDm4gwhZz6zD/CUa758zGA0RBEcbBbDYvSvmRVcpYXje4KBAwiUCWd89wZqRV -+2kL59myM2Xbcjp3tytJ/LbNWBCNq6rLQEV3AjkYs48zAUh3UL6Oc6feNqBJjiwW -r7n7Qi01ats0N9UUWX1lcuWLZVVLIF5H+fg602zZOvXHAUYxw3maGL5JAgMBAAGj -ZjBkMB0GA1UdDgQWBBTvaeD31R3mmezcbdD34rlcZHGDNTAfBgNVHSMEGDAWgBQn -jmcRdMMmHT/tM2OzpNgdMOXo1TASBgNVHRMBAf8ECDAGAQH/AgEAMA4GA1UdDwEB -/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEAXs0wzhMGqKMlbYVov4g7aBJqXl8i -glFK/bGussI+oeRzl293H14Kpj6KIJNMP2hkaajXrj6lWOTQReR6X8xoIz17340z -jboLc92XQZkaJn8Xh8R2uzu1FSSwgk8uCsP+q3XJTVl0Gscz508URVv008OpnTSo -4Soz6hAH254zg2Dw3XwnDWuS75DMNbNO4/rKh1Ux6HuMwjUZQWp2bGx60GrRLaim -l0BzUpw8Q6dL8bcEr+DRMjys36dKFfsuVthcTJmdPPBtoCAllskk/IRM3N4dKejU -4f/KBi857STcefkqGACu0otE6yqU+8gChg1+H2XHIAZeylCvvXHLBtoS/w== +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDyIyj3gUPwY7nyd34wGkBr4d1rQTbu +fVgj3Fbpu+g7EVjDw7frmFrpdhLN73cJJdNs5jpJaFCQ1zLgGNYF3/ee0o97tZFc +vz4Jgd157UTCk/WdpMsKa2O08O7R3WznxrfxMNS3VCgYEfwlrFvxsxkTR31+2UWX +PLu5QnAGlFUjFQuEygwVwW4aHPlUyebjuMFF5VqJ4fEbHYG3NAcXKFsQx6Yh612J +EaPQOWA06uF1+rh87sU/ZGoduNiksoKYMRHotSAtA+XRYTWkS7WtprdycT6GOA44 +tl21q786uh4ydrpUTQXKTuKD3zBkEZ6Zkzum+zvffZAC9LTx6EExeAI/AgMBAAGj +ZjBkMB0GA1UdDgQWBBSDHPGYhexuBkU03lHAurcrZzJmTTAfBgNVHSMEGDAWgBQn +jmcRdMMmHT/tM2OzpNgdMOXo1TASBgNVHRMBAf8ECDAGAQH/AgEBMA4GA1UdDwEB +/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEAfQ1cKhnn7l/KLdRZVLnKMxg64yIs +GHC7xVhF2YK8gF2Q2QI0bBpP8WtZTs3h6ieA5uLYfq8rrMFi4E3p5nSZ/sBQy9N9 +5SuCDWcNFLUsaqJ6wt0Ip0Aqj6G/TVN1Xd3DguXkHwSwtqfMVWy01HSemjY38DJp +l0T70iIai5U0RDLMKql29xLHuZvx5afH1W0S7AAdIbIT8jPg6uDIY3zdBsc8uqS9 +oJuNoRp9OtfJ8zVOxXZrbVDRlSPowH89P0UIEHdrKWjM3bYg+MEVTG/iq51hE928 +xeeYzCMpuhy2IcCwtuneK0PXynsoavpMyTlN4UDt5sAWnWmy+b/bUCc8sw== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G diff --git a/certs/intermediate/client-chain-ecc.der b/certs/intermediate/client-chain-ecc.der index b067fe290fe67213e5b538a7b3cf025e458a0905..5607711ff90618c4a54b407dc505c42955883f25 100644 GIT binary patch delta 770 zcmcc5)h3`|(8P2Ch;tV(GchtTF$u66aItY{wRxPgWnpGAXk0Q;Ay!`1K$(p>l!ci` zraV68vCIIod`ftjJ1p{1d@sYR4HuQ7;g0_7Ss zE&!S|*_rX3i1e4e6EsRv9vjDXr!4=oe%Gg+p-(5fGT8)qG8niqDKe~UvNaVezAE>0 zxygC;0;idGBBQ#@RLvVZkG3qE+Aw!5P|3|c*}7bn1$Bl^s+=z#-q^OwZ)W^X-^Xco zf{D8xX;nQ2dT2fnyH4cTFOTLb6OgM6;jSXmf6n!<#58o&;~ZzQYIM*1b#zgQji_(X z7jNBWlcv6_+w2oBw7>r0!xr~8O|IwEl5bjN{@2wwedIcKO7vY?oMt0!dwOx2L5hJa zFc@X|Sj1Sc27-Y+NLrai!a%G+M0jguq|xTxTiiFB@HHH0mXur7bRyb72&6)ok?}tZ zhXEUqVq#>R{EJ04%7ekcl}W*0`r^aueZ^b5zx#6A{t?=fU$b_nP=SHDqxzd{Q?@>L zV8|^Dowz+i&M3`1Lx5|(*}KEjwOe=CxZ8NW6+Rjrxo4{;Fw`aku>~wSuuQ(qv`QLJ z7*1Zmd?@+YoU{E;-$dWo@MogJBW~-!;1KUl=RSse6W3jy@VWKQ8CyXP(XysTlT5v? zxb`)hH6`uvWpCwP8uCEo#pHYSlU|?&4w~P=UY~rF#RTG6FK9aH3Y_?D(owI>)Z5V$ z4o}EBFzvZo)q07EI@#%=4iY&BmjQh{?aW;BwXZ6J@_Zd9-%hE2?zHox(1b57F~u7d KZ~PAZmk$7Z1RDGR delta 402 zcmZn@xX;C5(8P2Mh;t@iVcIWmXkln%WN2t^YGPm*CC+OEAFOH z$(Co)Tty`Z0!p+rmZmZ(GOUugPiBd>^}J|n^f}D`!bv6DXf%T6umlT z_KGw%&1ai#JQi7Y_~4eczAh39aAk}aA8tV=-s=Aqbo>Z^_~w?cx)`@ z%sU_vJY`CKxUFbkX?#ypC6j`K9l!dl7rSPEnR&j@EaT!^!w~Zqdgd4Ad9GBiJjiSk F002Ytm+1fi diff --git a/certs/intermediate/client-chain-ecc.pem b/certs/intermediate/client-chain-ecc.pem index 5138cf271..bc3a2a338 100644 --- a/certs/intermediate/client-chain-ecc.pem +++ b/certs/intermediate/client-chain-ecc.pem @@ -1,33 +1,50 @@ -----BEGIN CERTIFICATE----- -MIICxjCCAmygAwIBAgICEAUwCgYIKoZIzj0EAwIwgaMxCzAJBgNVBAYTAlVTMRMw +MIICyDCCAm2gAwIBAgICEAcwCgYIKoZIzj0EAwIwgaQxCzAJBgNVBAYTAlVTMRMw +EQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3 +b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDElMCMGA1UEAwwcd29sZlNTTCBJ +bnRlcm1lZGlhdGUyIENBIEVDQzEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3Ns +LmNvbTAeFw0yMDA2MTYxOTE3NThaFw0zMDA2MTQxOTE3NThaMIGgMQswCQYDVQQG +EwJVUzETMBEGA1UECAwKV2FzaGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEQMA4G +A1UECgwHd29sZlNTTDEUMBIGA1UECwwLRGV2ZWxvcG1lbnQxITAfBgNVBAMMGHdv +bGZTU0wgQ2xpZW50IENoYWluIEVDQzEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xm +c3NsLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABFW/9A9EUJo9zpu38MVN +9XB71OwkjhmA7FpMoiQDYiyb2u+iNRJDhHYWxlaVBswBqb32dRpC972psjYiX8dd +f7SjgZAwgY0wCQYDVR0TBAIwADARBglghkgBhvhCAQEEBAMCBaAwHQYDVR0OBBYE +FOvUS1lrlWE/UVe2BE2JQYhEXKvyMB8GA1UdIwQYMBaAFBv0vZAodGTjM16LZKf8 +r7ryuVXlMA4GA1UdDwEB/wQEAwIF4DAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYB +BQUHAwQwCgYIKoZIzj0EAwIDSQAwRgIhAK6CPTUWc9Ue5ac0zydwQpncWVqKNiU3 +gYnFhKaVgJ2tAiEA2Y4dfm0koH4xgiUJ6OHYtrpOmV+5TeNmPhFhuuIqeuM= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICnzCCAkWgAwIBAgICEAUwCgYIKoZIzj0EAwIwgaMxCzAJBgNVBAYTAlVTMRMw EQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3 b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEkMCIGA1UEAwwbd29sZlNTTCBJ bnRlcm1lZGlhdGUgQ0EgRUNDMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTE4MTIyMTE3NTQwMVoXDTI4MTIxODE3NTQwMVowgaAxCzAJBgNVBAYT +Y29tMB4XDTIwMDYxNjE5MTc1OFoXDTQwMDYxMTE5MTc1OFowgaQxCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYD -VQQKDAd3b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEhMB8GA1UEAwwYd29s -ZlNTTCBDbGllbnQgQ2hhaW4gRUNDMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZz -c2wuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEVb/0D0RQmj3Om7fwxU31 -cHvU7CSOGYDsWkyiJANiLJva76I1EkOEdhbGVpUGzAGpvfZ1GkL3vamyNiJfx11/ -tKOBkDCBjTAJBgNVHRMEAjAAMBEGCWCGSAGG+EIBAQQEAwIFoDAdBgNVHQ4EFgQU -69RLWWuVYT9RV7YETYlBiERcq/IwHwYDVR0jBBgwFoAUlx1gw4ciWZtgH4S0mRyI -Tb/aHm4wDgYDVR0PAQH/BAQDAgXgMB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEF -BQcDBDAKBggqhkjOPQQDAgNIADBFAiBe6My62YzVR/EAn/a2IjlFpCektOZbCnJ0 -wFB0KiilZQIhAKofLu9dYlzn5JMB77wMijSohui3fABOA7QX43L+ZYHf +VQQKDAd3b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDElMCMGA1UEAwwcd29s +ZlNTTCBJbnRlcm1lZGlhdGUyIENBIEVDQzEfMB0GCSqGSIb3DQEJARYQaW5mb0B3 +b2xmc3NsLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABOoWKCwnXkGZBSiL +mfrFonQ8FU1S9EstgzSCjtW2P2HQh+v4TAZe7WYejMqk9ip2T9cmCUweibkYjtKj +ZjwbPcujZjBkMB0GA1UdDgQWBBQb9L2QKHRk4zNei2Sn/K+68rlV5TAfBgNVHSME +GDAWgBQTtXlZMrO7tEezNA6AwIMeqoLIWzASBgNVHRMBAf8ECDAGAQH/AgEBMA4G +A1UdDwEB/wQEAwIBhjAKBggqhkjOPQQDAgNIADBFAiBPG9Hh145ztYv3TQs9/BK8 +b3ytuRJwMDdBJ+xrNQaORwIhAKFVkbdoHjJmN2gQCp827sOXK4W4PEc8Su0TxVtZ +vLUp -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIICkTCCAjigAwIBAgICEAMwCgYIKoZIzj0EAwIwgZcxCzAJBgNVBAYTAlVTMRMw +MIICkzCCAjigAwIBAgICEAQwCgYIKoZIzj0EAwIwgZcxCzAJBgNVBAYTAlVTMRMw EQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3 b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEYMBYGA1UEAwwPd3d3LndvbGZz -c2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMB4XDTE4MTIy -MTE3NTQwMVoXDTM4MTIxNjE3NTQwMVowgaMxCzAJBgNVBAYTAlVTMRMwEQYDVQQI +c2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMB4XDTIwMDYx +NjE5MTc1OFoXDTQwMDYxMTE5MTc1OFowgaMxCzAJBgNVBAYTAlVTMRMwEQYDVQQI DApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3b2xmU1NM MRQwEgYDVQQLDAtEZXZlbG9wbWVudDEkMCIGA1UEAwwbd29sZlNTTCBJbnRlcm1l ZGlhdGUgQ0EgRUNDMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMFkw -EwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEld8csp4gqR2iW6tcm6hmBinmstjjFKbD -wbStTUQYIB5dZ/0VHW0l4RexccqFA/DSr0FmRjZt6kHLT8hK0KBhjKNmMGQwHQYD -VR0OBBYEFJcdYMOHIlmbYB+EtJkciE2/2h5uMB8GA1UdIwQYMBaAFFaOmsPwQt4Y -uUVVbvmTz+rD86UhMBIGA1UdEwEB/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgGG -MAoGCCqGSM49BAMCA0cAMEQCICCNvbwIilIgq7zwlAw8OJyewBhTlJR/Vz0VjnVf -jIJ5AiBAPg8nmui6m/SZz3E2aNHtMVQ36C430J5JqSd5wQM0UA== +EwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAExpzNj+XsW9iw/JEg4gs7UVNUS4lDjgDe +ka7TkPOF3Mw9EQgVdoLikjVK1EWOgzaCYrhNB4ULpVTgFOiT3n+S6KNmMGQwHQYD +VR0OBBYEFBO1eVkys7u0R7M0DoDAgx6qgshbMB8GA1UdIwQYMBaAFFaOmsPwQt4Y +uUVVbvmTz+rD86UhMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgGG +MAoGCCqGSM49BAMCA0kAMEYCIQCKUZH2ksVKaWXbW5DDkGrAlucmeq8YkSxrZ1VA +GGzBpgIhAJbMnTet6nlSbk1Bk9tkf+dCufESkPSEXHOxIdj7Vf5v -----END CERTIFICATE----- diff --git a/certs/intermediate/client-chain.der b/certs/intermediate/client-chain.der index 0097d2b2ca424f9a709f04a5b5e0e50807a6c6dd..3e38c93680ed56d9ef65300cb7c513caf935c7ec 100644 GIT binary patch delta 1699 zcma*leK->c0LO9Ln7qcAwy{hj8nQ93DM~~l9ZD~&l)SWg4dYmo3>C3<-Xm+GcX?-& zQEpzQB6(@eYcs3JR-KT#>h7NB{^+^q{`~#>{e8r0bT}HDEbER<23eGXfB+y6s0PBS zfE6&QuBi(u0DzL54E9VZ!$^*xtB2JEgM4K{$}n;`DbU+{7s@Rx`b1RdiGUFQ=o9Aj z5+iMMEY=EVg|o$3TiP60qhj%W;{Tde6IwvcUoRj%S&p5L{f=aQ{_0{9vvmY?n4tu6 zqHbQktoq2p1AU2Rx^th~DMu*gYkPt)Fyrswl1?D?P@@l#k94exkZ2XV$@Zw*pMJH`0Phcp7Kal-5`a`VHn;poX6GP&OBu= zIR%fdTnLg6zTaWQNEc*RL9PUpvmbF>sEJdG{JUIR(q(`mJAfZ81V-8PUaa2u4%S{S z3U$bObgBE!xbk_aYxjgs7pi>pSqIvOqQ>Qa%&@JF-{bIp2r6B-qbNaU*k_7!N-sEZ zP|91XF{E9`oZyDi`pC!Pp9E~yC-M3ZwtQK-!4lJGx@noA;r#is`u*1>*4HvM9E!ia z@a+kZ(myW%=<0R4|LSS|ttb9_Pu!25)(8IgEe4EEITW?jj0waN;LMBLQwJCe5^uIc zzy8?Qp31Cp(PCPmt_&~BF*VLkyD(05D(uC35oup6?g>b*urq$cQU2WU4QOr9L2_a0 zBHxL3bv1oDV)xoG&8p0KrqGtmyp)%|bG;-zU!Sz%G8rjPs2pgyo$-iAZTiic9T*Efu*-&H34PE#Xf^0c(pDm|$u9N)Ky; z2`B!OSj-5@u-wRWE5(y+ki=cr*xZz)oHdXhLB$^%O}MMue01|jfK4wpa$kCPt)DIo zyiWC9>WzYhqH0gKD69DH3kR*$N*S@*Z?f@n`5M^td{IgLH=Nl zM9adkT1lE`btL(;w_#vs{OBGIyTLffJkW!Ilh*(M7|!zgROP6GSrN#u-8jAfrV}m& zW;WVE7)K5J*dI1d!(7R&diP+6YZw`PJJP=~tna3~*}DO2QFB`MaaWrn6!d;e<@wr5 zZ~Da)b^~l9-cz4nk+3*psDI*3^V}&?q zs@=Q%MTwO$);WErB;-6JcPItd+%4r#!n!2%^IY(ic13aRk*NgKXM~mx&>PYl=9)vd*cg` z$D5?&(^!NfaY8`cYBfjkL%-ZBZl2ks?)UIv!<+mA;#f%UJFe8a9!28u+WEOY0ZH_Gg9JO!;9~?+|7>vkpri(_ zv4e7Y#5vEtxoKMj_%~lP6{?idtqg4oL+C8}bWKk+wmAzAoSTqnBhNJ8<<}S;RO6QG zy&;@aXFat&ihn&3v(%V4*WnOw64^LhR-K%WQ=h3rnSz9U{+4C#b$7}eq9V7X+Nj#p z6Y6fY+OgM~$FhAq{ph9G#DEPSOad#}EN z=S!*`h%PC#vYs~&$=kl%zYcLB2fv+a&cob@U4U?#iX_4c?(2j^94Wa5Tko}eD}sSUa-eDYSY zzlNZtLzK@$Z(!@x>v8VYi${%}hPo4sPA={0vh|p7oSo)q6^B$Ww(`9Uf%Y|j0+b*K AP5=M^ delta 945 zcmbOz`BFg8pozuHpo!UN0W%XL6BCmF)8qt}t@4HzhDJt)hUTUw1_n{$yhcDSPzb^` zXq+=SfHQWpGvii9k@uMozF(DnHuKG$+za0y?Tkq&Y&M*tjTz3L zU(bJ}f5d0AjECu@++erZg9?i5g{lk9JEdm7`TF>x=z@O&dS}zG+U8x``PHJ=O6a8C z&xb2dZ9O}lSnm3e(tc3gcS@8e(#+jcLx;~f<;?NN$*`P;tKwCxS7opburre%&* zKX!8nre_(>_xN^^eUVvvb8&|CNx`_)i!UV3y5AeLv#avb=hzLlqM7d&Z#}eci@o3m zw#z%V7`aaUU*_>TnOnA!KXmG~nzk#63P1T5H7$|fC=h((#R>JzduLR09f@wbz?5@- zav8^N8MJ^j1_h)UG$1GEvn-zcfm5OW@S@^a#UzDuR)rSJr|iDn&LR^fJ>(#Y~y@w`}mQRod{ChJG1vmZ5|4D2uedq+1`dAstgx^0>nFSPtt z{xd2tocH1VyC1!e|9rl#akol#-dbhtkIU*!f;7`EJxvKsxpvpv(K@s_?|>j*p28uq z;`-MH|2f@uKR3}+t~<#-qov4JGhoJSxRi~H)ixG57^gNy!@Wo0?$4jvGqHDJL#Hc-8M15 zDiT?nTJ*F#HPl-n&i&^PtIIhzt-c;-bTd3$IZJ|RpXX!&ZV~Kh$%5O2kzsN!w@Q87 zS%Y)JY%3P4=C)?+@377g%8H9uY6|rFyK&v7Lv{g8vW(+;gxeuRy@=)ekH(ud!BJ~eZq&kHR`s2EpgA_q%e_BtXIcN?qLIy-`^&vVf9r+ai1C>@*XBd+ z0tMA+CsqEm_}sZCtNG%}!~dt)^ex}2+^PJjCBd-nQn$-%ttr1xFtzd4$)_GyV2e8y OuzqjhX|`KTLjM6pTCzs~ diff --git a/certs/intermediate/client-chain.pem b/certs/intermediate/client-chain.pem index 9404a453e..328737b23 100644 --- a/certs/intermediate/client-chain.pem +++ b/certs/intermediate/client-chain.pem @@ -1,49 +1,74 @@ -----BEGIN CERTIFICATE----- -MIIESjCCAzKgAwIBAgICEAIwDQYJKoZIhvcNAQELBQAwgZ8xCzAJBgNVBAYTAlVT +MIIESzCCAzOgAwIBAgICEAMwDQYJKoZIhvcNAQELBQAwgaAxCzAJBgNVBAYTAlVT +MRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQK +DAd3b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEhMB8GA1UEAwwYd29sZlNT +TCBJbnRlcm1lZGlhdGUyIENBMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu +Y29tMB4XDTIwMDYxNjE5MTc1OFoXDTMwMDYxNDE5MTc1OFowgZwxCzAJBgNVBAYT +AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYD +VQQKDAd3b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEdMBsGA1UEAwwUd29s +ZlNTTCBDbGllbnQgQ2hhaW4xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5j +b20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDDA9Er/jmkMkU7U8iE +Kyp8dJq9qipSB0fWpjayBzKO0Lppe8bDRJ7UgUj9LWiii2e7oXXINixK0hv3i7rP +Dfnv7PGBHnubA0eav2XMf2UkaaboFIlb5DT3xbAUk/Vnezp6eOEBVlaRphNCjdI8 +QJxM79GG3zdRGwyhO/Xxo0o15OHOlt8bfr9Ol9AQ6KgIMIGvIAtDFMV0Z7Qygm+N +hsKIQJk2g7oeQHIiF9dSZSRzsM7vGc2u/3hse8ASA9ROcg1QbTujO6OZXp3I2QyF +s9mK2VQm2236rLv/JUzE0Xn0cdOGQBgTsGO1ck4wxJeEhi1WL9cV93/ArvX8W+X7 +obrTAgMBAAGjgZAwgY0wCQYDVR0TBAIwADARBglghkgBhvhCAQEEBAMCBaAwHQYD +VR0OBBYEFDPYRWbXaIcYflQNcCeRxybXhWXAMB8GA1UdIwQYMBaAFHqLHU6jQMjO +WF+N/P9GLHVB2QNeMA4GA1UdDwEB/wQEAwIF4DAdBgNVHSUEFjAUBggrBgEFBQcD +AgYIKwYBBQUHAwQwDQYJKoZIhvcNAQELBQADggEBAD37nA7EM00jkoUtSldJc0AV +Kv/Ce+VmdWoG3r0Ji/3yQeW4r5Zc1Z5voFL6EBKwcY0gQ5kWKjlG7fU6swM1nYUe +5+75YUudIKIWdmlndwaD9cCXDNmxtdZ9d8CTJ6kn8DG0rI1zPPFzGXSv92cHaL3F +KJOI3ZCxEp9kprrEwEZ84wrbrsc5bJwBCrpk23TlAnI4zY6yLu8YwqbnbT+PxJLK +reAMivJIyuEcySCm3tPFI1R9EMfb9Yw5snlRP/PXFfIiR5t7ANhU48BzIWh81vLM ++rMnhagqZcdthdF3YnnPZD0kbMzSW7z++qmj6YWFH4eNbW/b8KS2WajxN6WNP50= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEIzCCAwugAwIBAgICEAEwDQYJKoZIhvcNAQELBQAwgZ8xCzAJBgNVBAYTAlVT MRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQK DAd3b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEgMB4GA1UEAwwXd29sZlNT TCBJbnRlcm1lZGlhdGUgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5j -b20wHhcNMTgxMjIxMTc1NDAwWhcNMjgxMjE4MTc1NDAwWjCBnDELMAkGA1UEBhMC +b20wHhcNMjAwNjE2MTkxNzU3WhcNNDAwNjExMTkxNzU3WjCBoDELMAkGA1UEBhMC VVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNV -BAoMB3dvbGZTU0wxFDASBgNVBAsMC0RldmVsb3BtZW50MR0wGwYDVQQDDBR3b2xm -U1NMIENsaWVudCBDaGFpbjEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNv -bTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMMD0Sv+OaQyRTtTyIQr -Knx0mr2qKlIHR9amNrIHMo7Quml7xsNEntSBSP0taKKLZ7uhdcg2LErSG/eLus8N -+e/s8YEee5sDR5q/Zcx/ZSRppugUiVvkNPfFsBST9Wd7Onp44QFWVpGmE0KN0jxA -nEzv0YbfN1EbDKE79fGjSjXk4c6W3xt+v06X0BDoqAgwga8gC0MUxXRntDKCb42G -wohAmTaDuh5AciIX11JlJHOwzu8Zza7/eGx7wBID1E5yDVBtO6M7o5lencjZDIWz -2YrZVCbbbfqsu/8lTMTRefRx04ZAGBOwY7VyTjDEl4SGLVYv1xX3f8Cu9fxb5fuh -utMCAwEAAaOBkDCBjTAJBgNVHRMEAjAAMBEGCWCGSAGG+EIBAQQEAwIFoDAdBgNV -HQ4EFgQUM9hFZtdohxh+VA1wJ5HHJteFZcAwHwYDVR0jBBgwFoAU72ng99Ud5pns -3G3Q9+K5XGRxgzUwDgYDVR0PAQH/BAQDAgXgMB0GA1UdJQQWMBQGCCsGAQUFBwMC -BggrBgEFBQcDBDANBgkqhkiG9w0BAQsFAAOCAQEAiIEheKwEinl+zaW6O/5SYeic -XSiRymhyMZnVFXiZ0QP/thNZI0iekpTMkQGT3Bk2aNdIU6uZ2CP8KJhD8+uf4i/E -TLMcSDWSbVNGXcEgIQdxJaE3iRqb7PXj0RWg/hAuzWfVPW7WufU4jToSyS754anI -b9YEBWbfPDpp16prXnEN41M4PYdKHseIeByHWiG9D4b0fIa9UX2cy/KypkF6+LsI -EWdqMZ9I9tEHojaHg3NoO8kRXquj0GGa341SuYp50vNdsD0Vae6jtcK+tD8RsAbT -uLQyRZX/dkjrYwsdeQ9VldZ8htRhIPkPooKkH7EQU9joyCezvZh7CsRbgtBszw== +BAoMB3dvbGZTU0wxFDASBgNVBAsMC0RldmVsb3BtZW50MSEwHwYDVQQDDBh3b2xm +U1NMIEludGVybWVkaWF0ZTIgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNz +bC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCgL6ECMF0ZoY5E +htST9/FTuj/SJN//y6+Ppuf5h5ofAMyPQIZ4OhuaeA7jbtrz52xXdjHPAyGayHkp +YNvu2KkVtGdbd5qG+dtDzKIPkeZwTx5uFLGN8KHlOXehkpeISibxiJgkbP1G4nEH +Xa/UvKiMXe5DCNqn7AlR7a3NdYtYx6GYVucZeJNLU3e32nl9cIS7HemgPAK8p5b6 +u5iQrjUZ0OdkHp0JoQbywv3LoykswHn46emTZ4w1LqFJoDRsOB1rTKW6x4SAlRcS +y92n9i4sxw/BVB+XbAE72i7H3FPJJuaaZqh/VfrNchhph06M5ALd9zEao27NiENw +tDRtpoZ1AgMBAAGjZjBkMB0GA1UdDgQWBBR6ix1Oo0DIzlhfjfz/Rix1QdkDXjAf +BgNVHSMEGDAWgBSDHPGYhexuBkU03lHAurcrZzJmTTASBgNVHRMBAf8ECDAGAQH/ +AgEBMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEADHKZ7ecDWMIr +iNKqQzGEGC/exV3gINhUPF4rhyqflrHvvtfHJ3ForHFhuG7Rqksv79Q357uHkGNI +OJsgFb28r4q0r1ORjoQRFOpvhfROugpJkbMZmSrR+aena/1/eIh7030ssZ9wFRrb +hpvOtwcl7DmMWaPS0cwYFRSghU1P+5pHL9xmx318EolIWNTLGhsSupztXIy/cg5f +jkI0S2w+BG/ZUOMok2sT/WvWLRvN+/4Lo4zfyOatnmmKk5bXhDG7yvLb4hjJ8ZGK +xwafwgrptF/jeyD8GhYcAlMSzWZFVW6xwJUtK9YZuJlOHxuc+7n+jH4yV/OA6fi+ +JS8DRjyzCg== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEFzCCAv+gAwIBAgICEAAwDQYJKoZIhvcNAQELBQAwgZQxCzAJBgNVBAYTAlVT MRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMREwDwYDVQQKDAhT YXd0b290aDETMBEGA1UECwwKQ29uc3VsdGluZzEYMBYGA1UEAwwPd3d3LndvbGZz -c2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMB4XDTE4MTIy -MTE3NTQwMFoXDTM4MTIxNjE3NTQwMFowgZ8xCzAJBgNVBAYTAlVTMRMwEQYDVQQI +c2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMB4XDTIwMDYx +NjE5MTc1N1oXDTQwMDYxMTE5MTc1N1owgZ8xCzAJBgNVBAYTAlVTMRMwEQYDVQQI DApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3b2xmU1NM MRQwEgYDVQQLDAtEZXZlbG9wbWVudDEgMB4GA1UEAwwXd29sZlNTTCBJbnRlcm1l ZGlhdGUgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDDonNdIWIgzjpxOKeUu9uHBBxaG55L -DT7K+KX3DWrcI5AiaitYY0ooakio53MfolXYTQI74str4oPJUY93/dwtXSO3I5p+ -tilo6CpOqf4ycDGe8O/u+I3j/PPXKN16HZ6tIyvxpn80Uilm0uVkVWTW3UtBO1WD -bsARDm4gwhZz6zD/CUa758zGA0RBEcbBbDYvSvmRVcpYXje4KBAwiUCWd89wZqRV -+2kL59myM2Xbcjp3tytJ/LbNWBCNq6rLQEV3AjkYs48zAUh3UL6Oc6feNqBJjiwW -r7n7Qi01ats0N9UUWX1lcuWLZVVLIF5H+fg602zZOvXHAUYxw3maGL5JAgMBAAGj -ZjBkMB0GA1UdDgQWBBTvaeD31R3mmezcbdD34rlcZHGDNTAfBgNVHSMEGDAWgBQn -jmcRdMMmHT/tM2OzpNgdMOXo1TASBgNVHRMBAf8ECDAGAQH/AgEAMA4GA1UdDwEB -/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEAXs0wzhMGqKMlbYVov4g7aBJqXl8i -glFK/bGussI+oeRzl293H14Kpj6KIJNMP2hkaajXrj6lWOTQReR6X8xoIz17340z -jboLc92XQZkaJn8Xh8R2uzu1FSSwgk8uCsP+q3XJTVl0Gscz508URVv008OpnTSo -4Soz6hAH254zg2Dw3XwnDWuS75DMNbNO4/rKh1Ux6HuMwjUZQWp2bGx60GrRLaim -l0BzUpw8Q6dL8bcEr+DRMjys36dKFfsuVthcTJmdPPBtoCAllskk/IRM3N4dKejU -4f/KBi857STcefkqGACu0otE6yqU+8gChg1+H2XHIAZeylCvvXHLBtoS/w== +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDyIyj3gUPwY7nyd34wGkBr4d1rQTbu +fVgj3Fbpu+g7EVjDw7frmFrpdhLN73cJJdNs5jpJaFCQ1zLgGNYF3/ee0o97tZFc +vz4Jgd157UTCk/WdpMsKa2O08O7R3WznxrfxMNS3VCgYEfwlrFvxsxkTR31+2UWX +PLu5QnAGlFUjFQuEygwVwW4aHPlUyebjuMFF5VqJ4fEbHYG3NAcXKFsQx6Yh612J +EaPQOWA06uF1+rh87sU/ZGoduNiksoKYMRHotSAtA+XRYTWkS7WtprdycT6GOA44 +tl21q786uh4ydrpUTQXKTuKD3zBkEZ6Zkzum+zvffZAC9LTx6EExeAI/AgMBAAGj +ZjBkMB0GA1UdDgQWBBSDHPGYhexuBkU03lHAurcrZzJmTTAfBgNVHSMEGDAWgBQn +jmcRdMMmHT/tM2OzpNgdMOXo1TASBgNVHRMBAf8ECDAGAQH/AgEBMA4GA1UdDwEB +/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEAfQ1cKhnn7l/KLdRZVLnKMxg64yIs +GHC7xVhF2YK8gF2Q2QI0bBpP8WtZTs3h6ieA5uLYfq8rrMFi4E3p5nSZ/sBQy9N9 +5SuCDWcNFLUsaqJ6wt0Ip0Aqj6G/TVN1Xd3DguXkHwSwtqfMVWy01HSemjY38DJp +l0T70iIai5U0RDLMKql29xLHuZvx5afH1W0S7AAdIbIT8jPg6uDIY3zdBsc8uqS9 +oJuNoRp9OtfJ8zVOxXZrbVDRlSPowH89P0UIEHdrKWjM3bYg+MEVTG/iq51hE928 +xeeYzCMpuhy2IcCwtuneK0PXynsoavpMyTlN4UDt5sAWnWmy+b/bUCc8sw== -----END CERTIFICATE----- diff --git a/certs/intermediate/client-int-cert.der b/certs/intermediate/client-int-cert.der index e61086695d9a0913bd6993d349190f07ab4fab77..e9f26c9e19279b7c266fd6cfedbbdd4fff50300e 100644 GIT binary patch delta 394 zcmV;50d@Y)2+s&3FoFb2FoFX!paTK{0s;aM127E+2`Yw2hW8Bt0Sg5HFoB?vZs4AW3d?WpZt0WNBe^WipYTC>t^`Fg7tZF*z|eH8@%q4Kpw> zHZe3YIWadiII-at0u*|S9ZsV_$j(?_jr{*cEOkNI174F014Dm3`4k+KhmCD-+wi2eS*YZs4AW3d?WpZt0WNBe^Ws#pK8!ns*dzQXm_zgHpW-jX zOtTzFHIi*pMqR-mAqR0Kp*M*do9y-D(G{Tn5H8JU)je+3x%D`WIugk)`QfR^Z`K3_ zX5TzIY1gW2UVm{7<5M_2he{sDh09HwZgu%KM}A7)3~%UMV0?{Nb6$@ n9eEE`mDYTQ)L|g`52AvkAF&Wq*yzY7v%Q#m3dCE2&;o4F5 zOnH7zT5zzBf@fYyYEf=#N@ik7s*!@Tlk@5YPBZUBMs=B~nm2YHZCN(8VeVR>lAC?9b-5}F>I|DyIbS@yv2B;%%=n$Y PkJIb~6L&q*s(K6n=qpSn delta 212 zcmX@ZdWu!Spo!@i5a%plW@2PwViI6A;9}#@YV$Z}%fifL(71S_LadyMff5^YC<`-> zba{SGT5zzBf@fYyYEf=#N@ik7>clxZ@`e_MMn;B)=B6eFhEd|YMnEo52*NdJTmUp= zvJ2xok?FDthuf7RXD7(FY?&$3;k*BqT;60iCL2!=1_M_ng}4`IcHQi`>i&^o{> "$1" echo "subjectKeyIdentifier = hash" >> "$1" echo "authorityKeyIdentifier = keyid:always,issuer" >> "$1" - echo "basicConstraints = critical, CA:true, pathlen:0" >> "$1" + echo "basicConstraints = critical, CA:true, pathlen:1" >> "$1" + echo "keyUsage = critical, digitalSignature, cRLSign, keyCertSign">> "$1" + echo "" >> "$1" + echo "[ v3_intermediate2_ca ]" >> "$1" + echo "subjectKeyIdentifier = hash" >> "$1" + echo "authorityKeyIdentifier = keyid:always,issuer" >> "$1" + echo "basicConstraints = critical, CA:true, pathlen:1" >> "$1" echo "keyUsage = critical, digitalSignature, cRLSign, keyCertSign">> "$1" echo "" >> "$1" echo "[ usr_cert ]" >> "$1" @@ -205,6 +219,7 @@ fi echo "Creating RSA CA configuration cnf files" create_ca_config ./certs/intermediate/wolfssl_root.cnf certs/ca-key.pem certs/ca-cert.pem create_ca_config ./certs/intermediate/wolfssl_int.cnf certs/intermediate/ca-int-key.pem certs/intermediate/ca-int-cert.pem +create_ca_config ./certs/intermediate/wolfssl_int2.cnf certs/intermediate/ca-int2-key.pem certs/intermediate/ca-int2-cert.pem if [ ! -f ./certs/intermediate/ca-int-key.pem ]; then echo "Make Intermediate RSA CA Key" @@ -213,32 +228,46 @@ if [ ! -f ./certs/intermediate/ca-int-key.pem ]; then openssl rsa -in ./certs/intermediate/ca-int-key.pem -inform PEM -out ./certs/intermediate/ca-int-key.der -outform DER check_result $? fi +if [ ! -f ./certs/intermediate/ca-int2-key.pem ]; then + echo "Make Intermediate2 RSA CA Key" + openssl genrsa -out ./certs/intermediate/ca-int2-key.pem 2048 + check_result $? + openssl rsa -in ./certs/intermediate/ca-int2-key.pem -inform PEM -out ./certs/intermediate/ca-int2-key.der -outform DER + check_result $? +fi echo "Create RSA Intermediate CA signed by root" create_cert wolfssl_int wolfssl_root ./certs/intermediate/ca-int-key.pem ca-int-cert v3_intermediate_ca "wolfSSL Intermediate CA" 7300 -echo "Create RSA Server Certificate signed by intermediate" -create_cert wolfssl_int wolfssl_int ./certs/server-key.pem server-int-cert server_cert "wolfSSL Server Chain" 3650 +echo "Create RSA Intermediate2 CA signed by RSA Intermediate" +create_cert wolfssl_int2 wolfssl_int ./certs/intermediate/ca-int2-key.pem ca-int2-cert v3_intermediate2_ca "wolfSSL Intermediate2 CA" 7300 -echo "Create RSA Client Certificate signed by intermediate" -create_cert wolfssl_int wolfssl_int ./certs/client-key.pem client-int-cert usr_cert "wolfSSL Client Chain" 3650 +echo "Create RSA Server Certificate signed by intermediate2" +create_cert wolfssl_int2 wolfssl_int2 ./certs/server-key.pem server-int-cert server_cert "wolfSSL Server Chain" 3650 + +echo "Create RSA Client Certificate signed by intermediate2" +create_cert wolfssl_int2 wolfssl_int2 ./certs/client-key.pem client-int-cert usr_cert "wolfSSL Client Chain" 3650 echo "Generate CRLs for new certificates" openssl ca -config ./certs/intermediate/wolfssl_root.cnf -gencrl -crldays 1000 -out ./certs/crl/ca-int.pem -keyfile ./certs/intermediate/ca-int-key.pem -cert ./certs/intermediate/ca-int-cert.pem check_result $? -openssl ca -config ./certs/intermediate/wolfssl_int.cnf -gencrl -crldays 1000 -out ./certs/crl/server-int.pem -keyfile ./certs/server-key.pem -cert ./certs/intermediate/server-int-cert.pem +openssl ca -config ./certs/intermediate/wolfssl_int.cnf -gencrl -crldays 1000 -out ./certs/crl/ca-int2.pem -keyfile ./certs/intermediate/ca-int2-key.pem -cert ./certs/intermediate/ca-int2-cert.pem check_result $? -openssl ca -config ./certs/intermediate/wolfssl_int.cnf -gencrl -crldays 1000 -out ./certs/crl/client-int.pem -keyfile ./certs/client-key.pem -cert ./certs/intermediate/client-int-cert.pem +openssl ca -config ./certs/intermediate/wolfssl_int2.cnf -gencrl -crldays 1000 -out ./certs/crl/server-int.pem -keyfile ./certs/server-key.pem -cert ./certs/intermediate/server-int-cert.pem +check_result $? +openssl ca -config ./certs/intermediate/wolfssl_int2.cnf -gencrl -crldays 1000 -out ./certs/crl/client-int.pem -keyfile ./certs/client-key.pem -cert ./certs/intermediate/client-int-cert.pem check_result $? -echo "Assemble test chains - peer first, then intermediate" +echo "Assemble test chains - peer first, then intermediate2, then intermediate" openssl x509 -in ./certs/intermediate/server-int-cert.pem > ./certs/intermediate/server-chain.pem +openssl x509 -in ./certs/intermediate/ca-int2-cert.pem >> ./certs/intermediate/server-chain.pem openssl x509 -in ./certs/intermediate/ca-int-cert.pem >> ./certs/intermediate/server-chain.pem -cat ./certs/intermediate/server-int-cert.der ./certs/intermediate/ca-int-cert.der > ./certs/intermediate/server-chain.der +cat ./certs/intermediate/server-int-cert.der ./certs/intermediate/ca-int2-cert.der ./certs/intermediate/ca-int-cert.der > ./certs/intermediate/server-chain.der openssl x509 -in ./certs/intermediate/client-int-cert.pem > ./certs/intermediate/client-chain.pem +openssl x509 -in ./certs/intermediate/ca-int2-cert.pem >> ./certs/intermediate/client-chain.pem openssl x509 -in ./certs/intermediate/ca-int-cert.pem >> ./certs/intermediate/client-chain.pem -cat ./certs/intermediate/client-int-cert.der ./certs/intermediate/ca-int-cert.der > ./certs/intermediate/client-chain.der +cat ./certs/intermediate/client-int-cert.der ./certs/intermediate/ca-int2-cert.der ./certs/intermediate/ca-int-cert.der > ./certs/intermediate/client-chain.der echo "Assemble cert chain with extra cert for testing alternate chains" cp ./certs/intermediate/server-chain.pem ./certs/intermediate/server-chain-alt.pem @@ -251,6 +280,7 @@ openssl x509 -in ./certs/external/ca-google-root.pem >> ./certs/intermediat echo "Creating ECC CA configuration cnf files" create_ca_config ./certs/intermediate/wolfssl_root_ecc.cnf certs/ca-ecc-key.pem certs/ca-ecc-cert.pem create_ca_config ./certs/intermediate/wolfssl_int_ecc.cnf certs/intermediate/ca-int-ecc-key.pem certs/intermediate/ca-int-ecc-cert.pem +create_ca_config ./certs/intermediate/wolfssl_int2_ecc.cnf certs/intermediate/ca-int2-ecc-key.pem certs/intermediate/ca-int2-ecc-cert.pem if [ ! -f ./certs/intermediate/ca-int-ecc-key.pem ]; then echo "Make Intermediate ECC CA Key" @@ -259,32 +289,46 @@ if [ ! -f ./certs/intermediate/ca-int-ecc-key.pem ]; then openssl ec -in ./certs/intermediate/ca-int-ecc-key.pem -inform PEM -out ./certs/intermediate/ca-int-ecc-key.der -outform DER check_result $? fi +if [ ! -f ./certs/intermediate/ca-int2-ecc-key.pem ]; then + echo "Make Intermediate2 ECC CA Key" + openssl ecparam -name prime256v1 -genkey -noout -out ./certs/intermediate/ca-int2-ecc-key.pem + check_result $? + openssl ec -in ./certs/intermediate/ca-int2-ecc-key.pem -inform PEM -out ./certs/intermediate/ca-int2-ecc-key.der -outform DER + check_result $? +fi echo "Create ECC Intermediate CA signed by root" create_cert wolfssl_int_ecc wolfssl_root_ecc ./certs/intermediate/ca-int-ecc-key.pem ca-int-ecc-cert v3_intermediate_ca "wolfSSL Intermediate CA ECC" 7300 -echo "Create ECC Server Certificate signed by intermediate" -create_cert wolfssl_int_ecc wolfssl_int_ecc ./certs/ecc-key.pem server-int-ecc-cert server_cert "wolfSSL Server Chain ECC" 3650 +echo "Create ECC Intermediate2 CA signed by Intermediate" +create_cert wolfssl_int2_ecc wolfssl_int_ecc ./certs/intermediate/ca-int2-ecc-key.pem ca-int2-ecc-cert v3_intermediate2_ca "wolfSSL Intermediate2 CA ECC" 7300 -echo "Create ECC Client Certificate signed by intermediate" -create_cert wolfssl_int_ecc wolfssl_int_ecc ./certs/ecc-client-key.pem client-int-ecc-cert usr_cert "wolfSSL Client Chain ECC" 3650 +echo "Create ECC Server Certificate signed by intermediate2" +create_cert wolfssl_int2_ecc wolfssl_int2_ecc ./certs/ecc-key.pem server-int-ecc-cert server_cert "wolfSSL Server Chain ECC" 3650 + +echo "Create ECC Client Certificate signed by intermediate2" +create_cert wolfssl_int2_ecc wolfssl_int2_ecc ./certs/ecc-client-key.pem client-int-ecc-cert usr_cert "wolfSSL Client Chain ECC" 3650 echo "Generate CRLs for new certificates" openssl ca -config ./certs/intermediate/wolfssl_root_ecc.cnf -gencrl -crldays 1000 -out ./certs/crl/ca-int-ecc.pem -keyfile ./certs/intermediate/ca-int-ecc-key.pem -cert ./certs/intermediate/ca-int-ecc-cert.pem check_result $? -openssl ca -config ./certs/intermediate/wolfssl_int_ecc.cnf -gencrl -crldays 1000 -out ./certs/crl/server-int-ecc.pem -keyfile ./certs/ecc-key.pem -cert ./certs/intermediate/server-int-ecc-cert.pem +openssl ca -config ./certs/intermediate/wolfssl_int_ecc.cnf -gencrl -crldays 1000 -out ./certs/crl/ca-int2-ecc.pem -keyfile ./certs/intermediate/ca-int2-ecc-key.pem -cert ./certs/intermediate/ca-int2-ecc-cert.pem check_result $? -openssl ca -config ./certs/intermediate/wolfssl_int_ecc.cnf -gencrl -crldays 1000 -out ./certs/crl/client-int-ecc.pem -keyfile ./certs/ecc-client-key.pem -cert ./certs/intermediate/client-int-ecc-cert.pem +openssl ca -config ./certs/intermediate/wolfssl_int2_ecc.cnf -gencrl -crldays 1000 -out ./certs/crl/server-int-ecc.pem -keyfile ./certs/ecc-key.pem -cert ./certs/intermediate/server-int-ecc-cert.pem +check_result $? +openssl ca -config ./certs/intermediate/wolfssl_int2_ecc.cnf -gencrl -crldays 1000 -out ./certs/crl/client-int-ecc.pem -keyfile ./certs/ecc-client-key.pem -cert ./certs/intermediate/client-int-ecc-cert.pem check_result $? -echo "Assemble test chains - peer first, then intermediate" +echo "Assemble test chains - peer first, then intermediate2, then intermediate" openssl x509 -in ./certs/intermediate/server-int-ecc-cert.pem > ./certs/intermediate/server-chain-ecc.pem +openssl x509 -in ./certs/intermediate/ca-int2-ecc-cert.pem >> ./certs/intermediate/server-chain-ecc.pem openssl x509 -in ./certs/intermediate/ca-int-ecc-cert.pem >> ./certs/intermediate/server-chain-ecc.pem -cat ./certs/intermediate/server-int-ecc-cert.der ./certs/intermediate/ca-int-ecc-cert.der > ./certs/intermediate/server-chain-ecc.der +cat ./certs/intermediate/server-int-ecc-cert.der ./certs/intermediate/ca-int2-ecc-cert.der ./certs/intermediate/ca-int-ecc-cert.der > ./certs/intermediate/server-chain-ecc.der openssl x509 -in ./certs/intermediate/client-int-ecc-cert.pem > ./certs/intermediate/client-chain-ecc.pem +openssl x509 -in ./certs/intermediate/ca-int2-ecc-cert.pem >> ./certs/intermediate/client-chain-ecc.pem openssl x509 -in ./certs/intermediate/ca-int-ecc-cert.pem >> ./certs/intermediate/client-chain-ecc.pem -cat ./certs/intermediate/client-int-ecc-cert.der ./certs/intermediate/ca-int-ecc-cert.der > ./certs/intermediate/client-chain-ecc.der +cat ./certs/intermediate/client-int-ecc-cert.der ./certs/intermediate/ca-int2-ecc-cert.der ./certs/intermediate/ca-int-ecc-cert.der > ./certs/intermediate/client-chain-ecc.der echo "Assemble cert chain with extra untrusted cert for testing alternate chains" cp ./certs/intermediate/server-chain-ecc.pem ./certs/intermediate/server-chain-alt-ecc.pem diff --git a/certs/intermediate/include.am b/certs/intermediate/include.am index 183f96c33..ec5531ec8 100644 --- a/certs/intermediate/include.am +++ b/certs/intermediate/include.am @@ -14,6 +14,14 @@ EXTRA_DIST += \ certs/intermediate/ca-int-key.pem \ certs/intermediate/client-chain-alt-ecc.pem \ certs/intermediate/client-chain-alt.pem \ + certs/intermediate/ca-int2-cert.der \ + certs/intermediate/ca-int2-cert.pem \ + certs/intermediate/ca-int2-ecc-cert.der \ + certs/intermediate/ca-int2-ecc-cert.pem \ + certs/intermediate/ca-int2-ecc-key.der \ + certs/intermediate/ca-int2-ecc-key.pem \ + certs/intermediate/ca-int2-key.der \ + certs/intermediate/ca-int2-key.pem \ certs/intermediate/client-chain-ecc.der \ certs/intermediate/client-chain-ecc.pem \ certs/intermediate/client-chain.der \ @@ -24,6 +32,10 @@ EXTRA_DIST += \ certs/intermediate/client-int-ecc-cert.pem \ certs/intermediate/server-chain-alt-ecc.pem \ certs/intermediate/server-chain-alt.pem \ + certs/intermediate/client-int2-cert.der \ + certs/intermediate/client-int2-cert.pem \ + certs/intermediate/client-int2-ecc-cert.der \ + certs/intermediate/client-int2-ecc-cert.pem \ certs/intermediate/server-chain-ecc.der \ certs/intermediate/server-chain-ecc.pem \ certs/intermediate/server-chain.der \ @@ -31,4 +43,8 @@ EXTRA_DIST += \ certs/intermediate/server-int-cert.der \ certs/intermediate/server-int-cert.pem \ certs/intermediate/server-int-ecc-cert.der \ - certs/intermediate/server-int-ecc-cert.pem + certs/intermediate/server-int-ecc-cert.pem \ + certs/intermediate/server-int2-cert.der \ + certs/intermediate/server-int2-cert.pem \ + certs/intermediate/server-int2-ecc-cert.der \ + certs/intermediate/server-int2-ecc-cert.pem diff --git a/certs/intermediate/server-chain-alt-ecc.pem b/certs/intermediate/server-chain-alt-ecc.pem index 6655c17f3..0121960e3 100644 --- a/certs/intermediate/server-chain-alt-ecc.pem +++ b/certs/intermediate/server-chain-alt-ecc.pem @@ -1,39 +1,56 @@ -----BEGIN CERTIFICATE----- -MIIDZDCCAwugAwIBAgICEAQwCgYIKoZIzj0EAwIwgaMxCzAJBgNVBAYTAlVTMRMw +MIIDczCCAxigAwIBAgICEAYwCgYIKoZIzj0EAwIwgaQxCzAJBgNVBAYTAlVTMRMw +EQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3 +b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDElMCMGA1UEAwwcd29sZlNTTCBJ +bnRlcm1lZGlhdGUyIENBIEVDQzEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3Ns +LmNvbTAeFw0yMDA2MTYxOTE3NThaFw0zMDA2MTQxOTE3NThaMIGgMQswCQYDVQQG +EwJVUzETMBEGA1UECAwKV2FzaGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEQMA4G +A1UECgwHd29sZlNTTDEUMBIGA1UECwwLRGV2ZWxvcG1lbnQxITAfBgNVBAMMGHdv +bGZTU0wgU2VydmVyIENoYWluIEVDQzEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xm +c3NsLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABLszrEwnUErGSqUEwzze +nzbbci3OlOor+ssgCTksFuhhAumvTdMCk5oxW5eSIX/wzxjakRECNIboIFgzC4A0 +idijggE6MIIBNjAJBgNVHRMEAjAAMBEGCWCGSAGG+EIBAQQEAwIGQDAdBgNVHQ4E +FgQUXV0m76x+NvmbdhUrSiUCI++yiTAwgdEGA1UdIwSByTCBxoAUG/S9kCh0ZOMz +Xotkp/yvuvK5VeWhgamkgaYwgaMxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApXYXNo +aW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3b2xmU1NMMRQwEgYD +VQQLDAtEZXZlbG9wbWVudDEkMCIGA1UEAwwbd29sZlNTTCBJbnRlcm1lZGlhdGUg +Q0EgRUNDMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tggIQBTAOBgNV +HQ8BAf8EBAMCA6gwEwYDVR0lBAwwCgYIKwYBBQUHAwEwCgYIKoZIzj0EAwIDSQAw +RgIhAJjQ4vmJyrJ0NqczC/4UkBBFei1tQETbCOxFeYtOkeDVAiEA6hEbwbWVvL/Z +9Zk30dLmuKoZvZdCCbsKUWxOomFy6EQ= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICnzCCAkWgAwIBAgICEAUwCgYIKoZIzj0EAwIwgaMxCzAJBgNVBAYTAlVTMRMw EQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3 b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEkMCIGA1UEAwwbd29sZlNTTCBJ bnRlcm1lZGlhdGUgQ0EgRUNDMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTE4MTIyMTE3NTQwMVoXDTI4MTIxODE3NTQwMVowgaAxCzAJBgNVBAYT +Y29tMB4XDTIwMDYxNjE5MTc1OFoXDTQwMDYxMTE5MTc1OFowgaQxCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYD -VQQKDAd3b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEhMB8GA1UEAwwYd29s -ZlNTTCBTZXJ2ZXIgQ2hhaW4gRUNDMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZz -c2wuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuzOsTCdQSsZKpQTDPN6f -NttyLc6U6iv6yyAJOSwW6GEC6a9N0wKTmjFbl5Ihf/DPGNqREQI0huggWDMLgDSJ -2KOCAS4wggEqMAkGA1UdEwQCMAAwEQYJYIZIAYb4QgEBBAQDAgZAMB0GA1UdDgQW -BBRdXSbvrH42+Zt2FStKJQIj77KJMDCBxQYDVR0jBIG9MIG6gBSXHWDDhyJZm2Af -hLSZHIhNv9oebqGBnaSBmjCBlzELMAkGA1UEBhMCVVMxEzARBgNVBAgMCldhc2hp -bmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoMB3dvbGZTU0wxFDASBgNV -BAsMC0RldmVsb3BtZW50MRgwFgYDVQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkq -hkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb22CAhADMA4GA1UdDwEB/wQEAwIDqDAT -BgNVHSUEDDAKBggrBgEFBQcDATAKBggqhkjOPQQDAgNHADBEAiB0XGkL2vHYzyG8 -gayx5cWzOHL5nPFQLTEmSVjD3svlfQIgeJ0/W+ISuxstPSXbK6j0dgKQeySoHUmW -RVZXi7tZVPo= +VQQKDAd3b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDElMCMGA1UEAwwcd29s +ZlNTTCBJbnRlcm1lZGlhdGUyIENBIEVDQzEfMB0GCSqGSIb3DQEJARYQaW5mb0B3 +b2xmc3NsLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABOoWKCwnXkGZBSiL +mfrFonQ8FU1S9EstgzSCjtW2P2HQh+v4TAZe7WYejMqk9ip2T9cmCUweibkYjtKj +ZjwbPcujZjBkMB0GA1UdDgQWBBQb9L2QKHRk4zNei2Sn/K+68rlV5TAfBgNVHSME +GDAWgBQTtXlZMrO7tEezNA6AwIMeqoLIWzASBgNVHRMBAf8ECDAGAQH/AgEBMA4G +A1UdDwEB/wQEAwIBhjAKBggqhkjOPQQDAgNIADBFAiBPG9Hh145ztYv3TQs9/BK8 +b3ytuRJwMDdBJ+xrNQaORwIhAKFVkbdoHjJmN2gQCp827sOXK4W4PEc8Su0TxVtZ +vLUp -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIICkTCCAjigAwIBAgICEAMwCgYIKoZIzj0EAwIwgZcxCzAJBgNVBAYTAlVTMRMw +MIICkzCCAjigAwIBAgICEAQwCgYIKoZIzj0EAwIwgZcxCzAJBgNVBAYTAlVTMRMw EQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3 b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEYMBYGA1UEAwwPd3d3LndvbGZz -c2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMB4XDTE4MTIy -MTE3NTQwMVoXDTM4MTIxNjE3NTQwMVowgaMxCzAJBgNVBAYTAlVTMRMwEQYDVQQI +c2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMB4XDTIwMDYx +NjE5MTc1OFoXDTQwMDYxMTE5MTc1OFowgaMxCzAJBgNVBAYTAlVTMRMwEQYDVQQI DApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3b2xmU1NM MRQwEgYDVQQLDAtEZXZlbG9wbWVudDEkMCIGA1UEAwwbd29sZlNTTCBJbnRlcm1l ZGlhdGUgQ0EgRUNDMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMFkw -EwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEld8csp4gqR2iW6tcm6hmBinmstjjFKbD -wbStTUQYIB5dZ/0VHW0l4RexccqFA/DSr0FmRjZt6kHLT8hK0KBhjKNmMGQwHQYD -VR0OBBYEFJcdYMOHIlmbYB+EtJkciE2/2h5uMB8GA1UdIwQYMBaAFFaOmsPwQt4Y -uUVVbvmTz+rD86UhMBIGA1UdEwEB/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgGG -MAoGCCqGSM49BAMCA0cAMEQCICCNvbwIilIgq7zwlAw8OJyewBhTlJR/Vz0VjnVf -jIJ5AiBAPg8nmui6m/SZz3E2aNHtMVQ36C430J5JqSd5wQM0UA== +EwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAExpzNj+XsW9iw/JEg4gs7UVNUS4lDjgDe +ka7TkPOF3Mw9EQgVdoLikjVK1EWOgzaCYrhNB4ULpVTgFOiT3n+S6KNmMGQwHQYD +VR0OBBYEFBO1eVkys7u0R7M0DoDAgx6qgshbMB8GA1UdIwQYMBaAFFaOmsPwQt4Y +uUVVbvmTz+rD86UhMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgGG +MAoGCCqGSM49BAMCA0kAMEYCIQCKUZH2ksVKaWXbW5DDkGrAlucmeq8YkSxrZ1VA +GGzBpgIhAJbMnTet6nlSbk1Bk9tkf+dCufESkPSEXHOxIdj7Vf5v -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G diff --git a/certs/intermediate/server-chain-alt.pem b/certs/intermediate/server-chain-alt.pem index 73118091b..4adc63488 100644 --- a/certs/intermediate/server-chain-alt.pem +++ b/certs/intermediate/server-chain-alt.pem @@ -1,55 +1,80 @@ -----BEGIN CERTIFICATE----- -MIIE5jCCA86gAwIBAgICEAEwDQYJKoZIhvcNAQELBQAwgZ8xCzAJBgNVBAYTAlVT +MIIE8jCCA9qgAwIBAgICEAIwDQYJKoZIhvcNAQELBQAwgaAxCzAJBgNVBAYTAlVT +MRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQK +DAd3b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEhMB8GA1UEAwwYd29sZlNT +TCBJbnRlcm1lZGlhdGUyIENBMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu +Y29tMB4XDTIwMDYxNjE5MTc1OFoXDTMwMDYxNDE5MTc1OFowgZwxCzAJBgNVBAYT +AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYD +VQQKDAd3b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEdMBsGA1UEAwwUd29s +ZlNTTCBTZXJ2ZXIgQ2hhaW4xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5j +b20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDAlQjhV0HycW230kVB +JwFlxkWu8rwkMLiVzi9O1vYciLx8n/uoZ3/+XJxRdfeKygfnNS+P4b17wC98q2So +F/zKXXu64CHlci5vLobYlXParBtTuV8/1xkNJU/hY2NRiwtkP61DuKUcXDSzrgCg +Y8X2fwtZaHhzpowYqQJtr8MZAS64EOPGzEC0aaNGM2mHbsS7F6bz6N2tc7x7LyG1 +/WZRDL1Us+FtXxy8I3PRCQOJFNIQuWTDKtChlkq84dQaW8egwMFjeA9ENzAyloAy +I5Whd7oT0pdz4l0lyWoNwzlgpLSwaUJCCenYCLwzILNYIqeq68Th5mGDxdKW39nQ +T63XAgMBAAGjggE2MIIBMjAJBgNVHRMEAjAAMBEGCWCGSAGG+EIBAQQEAwIGQDAd +BgNVHQ4EFgQUsxEyyZKYhOLJ+NA7bgNCyh8Ojjwwgc0GA1UdIwSBxTCBwoAUeosd +TqNAyM5YX438/0YsdUHZA16hgaWkgaIwgZ8xCzAJBgNVBAYTAlVTMRMwEQYDVQQI +DApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3b2xmU1NM +MRQwEgYDVQQLDAtEZXZlbG9wbWVudDEgMB4GA1UEAwwXd29sZlNTTCBJbnRlcm1l +ZGlhdGUgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb22CAhABMA4G +A1UdDwEB/wQEAwIDqDATBgNVHSUEDDAKBggrBgEFBQcDATANBgkqhkiG9w0BAQsF +AAOCAQEAkpC/Vl2YIc7WCo18r7qbWdgzwSEPbzEcE8Wf3qh97+XFC4t+GMud2N7J +PTLu/9CJmDszaNvNZl6d7tpTNGUh40P2p7J5tXksLiM/PmFZgIj9w8UE6a1SqVh9 +78WnhRpVYOENfhHIulnYxh02BGOOfa8o/RN6MvUp1wrvBjyFkLbGTzmxGO6+F6VE +F4ezlKE0Ykx3yAaTyAP18qpb/9CarfOyyluBVO8bOfjGd/GAUA8MbpQUYqP8mY7S +4za4JRttVdIbIZfThOaW7p+zAERwOp/8YuJCGpMe/J7sjRx6GrETRk7rDSi5TQjm +CTHAuy4H4MupWgaHxI66ay91VIU29Q== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEIzCCAwugAwIBAgICEAEwDQYJKoZIhvcNAQELBQAwgZ8xCzAJBgNVBAYTAlVT MRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQK DAd3b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEgMB4GA1UEAwwXd29sZlNT TCBJbnRlcm1lZGlhdGUgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5j -b20wHhcNMTgxMjIxMTc1NDAwWhcNMjgxMjE4MTc1NDAwWjCBnDELMAkGA1UEBhMC +b20wHhcNMjAwNjE2MTkxNzU3WhcNNDAwNjExMTkxNzU3WjCBoDELMAkGA1UEBhMC VVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNV -BAoMB3dvbGZTU0wxFDASBgNVBAsMC0RldmVsb3BtZW50MR0wGwYDVQQDDBR3b2xm -U1NMIFNlcnZlciBDaGFpbjEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNv -bTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMCVCOFXQfJxbbfSRUEn -AWXGRa7yvCQwuJXOL07W9hyIvHyf+6hnf/5cnFF194rKB+c1L4/hvXvAL3yrZKgX -/Mpde7rgIeVyLm8uhtiVc9qsG1O5Xz/XGQ0lT+FjY1GLC2Q/rUO4pRxcNLOuAKBj -xfZ/C1loeHOmjBipAm2vwxkBLrgQ48bMQLRpo0YzaYduxLsXpvPo3a1zvHsvIbX9 -ZlEMvVSz4W1fHLwjc9EJA4kU0hC5ZMMq0KGWSrzh1Bpbx6DAwWN4D0Q3MDKWgDIj -laF3uhPSl3PiXSXJag3DOWCktLBpQkIJ6dgIvDMgs1gip6rrxOHmYYPF0pbf2dBP -rdcCAwEAAaOCASswggEnMAkGA1UdEwQCMAAwEQYJYIZIAYb4QgEBBAQDAgZAMB0G -A1UdDgQWBBSzETLJkpiE4sn40DtuA0LKHw6OPDCBwgYDVR0jBIG6MIG3gBTvaeD3 -1R3mmezcbdD34rlcZHGDNaGBmqSBlzCBlDELMAkGA1UEBhMCVVMxEDAOBgNVBAgM -B01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNhd3Rvb3RoMRMw -EQYDVQQLDApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cud29sZnNzbC5jb20xHzAd -BgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb22CAhAAMA4GA1UdDwEB/wQEAwID -qDATBgNVHSUEDDAKBggrBgEFBQcDATANBgkqhkiG9w0BAQsFAAOCAQEAPbWNZn6F -oIfMU6THyWNr1MREx0XQce8vWJJgfcg37WTqsasAG1b+93d4dv1kY314/9SuWBvw -FOnnvUvsNm80y5GwQyVmi8BZ0ertJQ1ccoop3orId1G51cTlJlAMvdeh6/qT7D02 -j8/utmtcqE8bccZNLK/S2iDIifP824TCqfaXYqyqp2v7OyFRhXpzVTSCm/iZy5aJ -otM5X7MNX46eRkpVV6veEc+AHyXJ7G9I/c5b0gUHa078DRCgioL75Hc6J+AODPtD -ZF+QjiYSlNuXGOwZlBtWXLm7JpscFVwH39EtnUGWwCpaSp5fnmaajGz/bMqhfbYS -o9QzCwAeul09eg== +BAoMB3dvbGZTU0wxFDASBgNVBAsMC0RldmVsb3BtZW50MSEwHwYDVQQDDBh3b2xm +U1NMIEludGVybWVkaWF0ZTIgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNz +bC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCgL6ECMF0ZoY5E +htST9/FTuj/SJN//y6+Ppuf5h5ofAMyPQIZ4OhuaeA7jbtrz52xXdjHPAyGayHkp +YNvu2KkVtGdbd5qG+dtDzKIPkeZwTx5uFLGN8KHlOXehkpeISibxiJgkbP1G4nEH +Xa/UvKiMXe5DCNqn7AlR7a3NdYtYx6GYVucZeJNLU3e32nl9cIS7HemgPAK8p5b6 +u5iQrjUZ0OdkHp0JoQbywv3LoykswHn46emTZ4w1LqFJoDRsOB1rTKW6x4SAlRcS +y92n9i4sxw/BVB+XbAE72i7H3FPJJuaaZqh/VfrNchhph06M5ALd9zEao27NiENw +tDRtpoZ1AgMBAAGjZjBkMB0GA1UdDgQWBBR6ix1Oo0DIzlhfjfz/Rix1QdkDXjAf +BgNVHSMEGDAWgBSDHPGYhexuBkU03lHAurcrZzJmTTASBgNVHRMBAf8ECDAGAQH/ +AgEBMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEADHKZ7ecDWMIr +iNKqQzGEGC/exV3gINhUPF4rhyqflrHvvtfHJ3ForHFhuG7Rqksv79Q357uHkGNI +OJsgFb28r4q0r1ORjoQRFOpvhfROugpJkbMZmSrR+aena/1/eIh7030ssZ9wFRrb +hpvOtwcl7DmMWaPS0cwYFRSghU1P+5pHL9xmx318EolIWNTLGhsSupztXIy/cg5f +jkI0S2w+BG/ZUOMok2sT/WvWLRvN+/4Lo4zfyOatnmmKk5bXhDG7yvLb4hjJ8ZGK +xwafwgrptF/jeyD8GhYcAlMSzWZFVW6xwJUtK9YZuJlOHxuc+7n+jH4yV/OA6fi+ +JS8DRjyzCg== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEFzCCAv+gAwIBAgICEAAwDQYJKoZIhvcNAQELBQAwgZQxCzAJBgNVBAYTAlVT MRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMREwDwYDVQQKDAhT YXd0b290aDETMBEGA1UECwwKQ29uc3VsdGluZzEYMBYGA1UEAwwPd3d3LndvbGZz -c2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMB4XDTE4MTIy -MTE3NTQwMFoXDTM4MTIxNjE3NTQwMFowgZ8xCzAJBgNVBAYTAlVTMRMwEQYDVQQI +c2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMB4XDTIwMDYx +NjE5MTc1N1oXDTQwMDYxMTE5MTc1N1owgZ8xCzAJBgNVBAYTAlVTMRMwEQYDVQQI DApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3b2xmU1NM MRQwEgYDVQQLDAtEZXZlbG9wbWVudDEgMB4GA1UEAwwXd29sZlNTTCBJbnRlcm1l ZGlhdGUgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDDonNdIWIgzjpxOKeUu9uHBBxaG55L -DT7K+KX3DWrcI5AiaitYY0ooakio53MfolXYTQI74str4oPJUY93/dwtXSO3I5p+ -tilo6CpOqf4ycDGe8O/u+I3j/PPXKN16HZ6tIyvxpn80Uilm0uVkVWTW3UtBO1WD -bsARDm4gwhZz6zD/CUa758zGA0RBEcbBbDYvSvmRVcpYXje4KBAwiUCWd89wZqRV -+2kL59myM2Xbcjp3tytJ/LbNWBCNq6rLQEV3AjkYs48zAUh3UL6Oc6feNqBJjiwW -r7n7Qi01ats0N9UUWX1lcuWLZVVLIF5H+fg602zZOvXHAUYxw3maGL5JAgMBAAGj -ZjBkMB0GA1UdDgQWBBTvaeD31R3mmezcbdD34rlcZHGDNTAfBgNVHSMEGDAWgBQn -jmcRdMMmHT/tM2OzpNgdMOXo1TASBgNVHRMBAf8ECDAGAQH/AgEAMA4GA1UdDwEB -/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEAXs0wzhMGqKMlbYVov4g7aBJqXl8i -glFK/bGussI+oeRzl293H14Kpj6KIJNMP2hkaajXrj6lWOTQReR6X8xoIz17340z -jboLc92XQZkaJn8Xh8R2uzu1FSSwgk8uCsP+q3XJTVl0Gscz508URVv008OpnTSo -4Soz6hAH254zg2Dw3XwnDWuS75DMNbNO4/rKh1Ux6HuMwjUZQWp2bGx60GrRLaim -l0BzUpw8Q6dL8bcEr+DRMjys36dKFfsuVthcTJmdPPBtoCAllskk/IRM3N4dKejU -4f/KBi857STcefkqGACu0otE6yqU+8gChg1+H2XHIAZeylCvvXHLBtoS/w== +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDyIyj3gUPwY7nyd34wGkBr4d1rQTbu +fVgj3Fbpu+g7EVjDw7frmFrpdhLN73cJJdNs5jpJaFCQ1zLgGNYF3/ee0o97tZFc +vz4Jgd157UTCk/WdpMsKa2O08O7R3WznxrfxMNS3VCgYEfwlrFvxsxkTR31+2UWX +PLu5QnAGlFUjFQuEygwVwW4aHPlUyebjuMFF5VqJ4fEbHYG3NAcXKFsQx6Yh612J +EaPQOWA06uF1+rh87sU/ZGoduNiksoKYMRHotSAtA+XRYTWkS7WtprdycT6GOA44 +tl21q786uh4ydrpUTQXKTuKD3zBkEZ6Zkzum+zvffZAC9LTx6EExeAI/AgMBAAGj +ZjBkMB0GA1UdDgQWBBSDHPGYhexuBkU03lHAurcrZzJmTTAfBgNVHSMEGDAWgBQn +jmcRdMMmHT/tM2OzpNgdMOXo1TASBgNVHRMBAf8ECDAGAQH/AgEBMA4GA1UdDwEB +/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEAfQ1cKhnn7l/KLdRZVLnKMxg64yIs +GHC7xVhF2YK8gF2Q2QI0bBpP8WtZTs3h6ieA5uLYfq8rrMFi4E3p5nSZ/sBQy9N9 +5SuCDWcNFLUsaqJ6wt0Ip0Aqj6G/TVN1Xd3DguXkHwSwtqfMVWy01HSemjY38DJp +l0T70iIai5U0RDLMKql29xLHuZvx5afH1W0S7AAdIbIT8jPg6uDIY3zdBsc8uqS9 +oJuNoRp9OtfJ8zVOxXZrbVDRlSPowH89P0UIEHdrKWjM3bYg+MEVTG/iq51hE928 +xeeYzCMpuhy2IcCwtuneK0PXynsoavpMyTlN4UDt5sAWnWmy+b/bUCc8sw== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G diff --git a/certs/intermediate/server-chain-ecc.der b/certs/intermediate/server-chain-ecc.der index 2e1c7742d58e0ac50fa5d5faae35f634498662bc..38a81511416a0708bdad39415243bcf91be5dd1d 100644 GIT binary patch delta 852 zcmey%y-`rXpozH{h$R*l!ci` zraV6uosl;r#G50@_2?DNF zy15Q6w>jRpR(AVMd~g-0F%2E{ILDc+8r?I09bHsnBkCLU#ap-8 zq^a-fHv7a2?XQ3Mu*JPilj}LPwiR zY|h#Kr*EQfZ1^)#;SslWU~q_cr*j{}y@~5CPx#z==Zvi&hiF;Tqe-S-S6us=&6<*S z__DWhFAaGh@?!G6`bjU)0te0S5U(Q#PFUZp!ylaPN$hkD&HFj|{N#F82}nSALDN%L z;KXl}j(TOL-j1GdctX~JY0uTF)=Ny($xaV-kjOc>3>XsA&dfDm`>HZ1&)0GC?UefG VPCGveP59ChQ@l~}#_!O7`2b0(HNgM? delta 444 zcmdle_?KJIpouvJh`ARqGchtTF$u6t?qJ>~Z)jm?WMpV)Zfas+7$weY1mpsRAY6mS z1rrrwC%Z5%WYsfhV$_=aiqT&CC>wLAtTIdEUW3M64Io8~F3lwB0PI%f8YG&ap=n{GT7 zS$6o~mbJbv5(;v$>3>CKb5$RTZ!A33%KYKdddD<3v)osXr~OZOU09IVvpCHl#XuJ1 zeLfa37OY;MEXrZR$S~Q9L)HW0SB2iadpNp+6jtx~Fonm)V$Qq+62ViZ)Q8)O_Lau> qG*vPwIN0&4&w8to^~!_HCIJA1pQ6$L diff --git a/certs/intermediate/server-chain-ecc.pem b/certs/intermediate/server-chain-ecc.pem index 379f945fa..b70b27d19 100644 --- a/certs/intermediate/server-chain-ecc.pem +++ b/certs/intermediate/server-chain-ecc.pem @@ -1,37 +1,54 @@ -----BEGIN CERTIFICATE----- -MIIDZDCCAwugAwIBAgICEAQwCgYIKoZIzj0EAwIwgaMxCzAJBgNVBAYTAlVTMRMw +MIIDczCCAxigAwIBAgICEAYwCgYIKoZIzj0EAwIwgaQxCzAJBgNVBAYTAlVTMRMw +EQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3 +b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDElMCMGA1UEAwwcd29sZlNTTCBJ +bnRlcm1lZGlhdGUyIENBIEVDQzEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3Ns +LmNvbTAeFw0yMDA2MTYxOTE3NThaFw0zMDA2MTQxOTE3NThaMIGgMQswCQYDVQQG +EwJVUzETMBEGA1UECAwKV2FzaGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEQMA4G +A1UECgwHd29sZlNTTDEUMBIGA1UECwwLRGV2ZWxvcG1lbnQxITAfBgNVBAMMGHdv +bGZTU0wgU2VydmVyIENoYWluIEVDQzEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xm +c3NsLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABLszrEwnUErGSqUEwzze +nzbbci3OlOor+ssgCTksFuhhAumvTdMCk5oxW5eSIX/wzxjakRECNIboIFgzC4A0 +idijggE6MIIBNjAJBgNVHRMEAjAAMBEGCWCGSAGG+EIBAQQEAwIGQDAdBgNVHQ4E +FgQUXV0m76x+NvmbdhUrSiUCI++yiTAwgdEGA1UdIwSByTCBxoAUG/S9kCh0ZOMz +Xotkp/yvuvK5VeWhgamkgaYwgaMxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApXYXNo +aW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3b2xmU1NMMRQwEgYD +VQQLDAtEZXZlbG9wbWVudDEkMCIGA1UEAwwbd29sZlNTTCBJbnRlcm1lZGlhdGUg +Q0EgRUNDMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tggIQBTAOBgNV +HQ8BAf8EBAMCA6gwEwYDVR0lBAwwCgYIKwYBBQUHAwEwCgYIKoZIzj0EAwIDSQAw +RgIhAJjQ4vmJyrJ0NqczC/4UkBBFei1tQETbCOxFeYtOkeDVAiEA6hEbwbWVvL/Z +9Zk30dLmuKoZvZdCCbsKUWxOomFy6EQ= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICnzCCAkWgAwIBAgICEAUwCgYIKoZIzj0EAwIwgaMxCzAJBgNVBAYTAlVTMRMw EQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3 b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEkMCIGA1UEAwwbd29sZlNTTCBJ bnRlcm1lZGlhdGUgQ0EgRUNDMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTE4MTIyMTE3NTQwMVoXDTI4MTIxODE3NTQwMVowgaAxCzAJBgNVBAYT +Y29tMB4XDTIwMDYxNjE5MTc1OFoXDTQwMDYxMTE5MTc1OFowgaQxCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYD -VQQKDAd3b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEhMB8GA1UEAwwYd29s -ZlNTTCBTZXJ2ZXIgQ2hhaW4gRUNDMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZz -c2wuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuzOsTCdQSsZKpQTDPN6f -NttyLc6U6iv6yyAJOSwW6GEC6a9N0wKTmjFbl5Ihf/DPGNqREQI0huggWDMLgDSJ -2KOCAS4wggEqMAkGA1UdEwQCMAAwEQYJYIZIAYb4QgEBBAQDAgZAMB0GA1UdDgQW -BBRdXSbvrH42+Zt2FStKJQIj77KJMDCBxQYDVR0jBIG9MIG6gBSXHWDDhyJZm2Af -hLSZHIhNv9oebqGBnaSBmjCBlzELMAkGA1UEBhMCVVMxEzARBgNVBAgMCldhc2hp -bmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoMB3dvbGZTU0wxFDASBgNV -BAsMC0RldmVsb3BtZW50MRgwFgYDVQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkq -hkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb22CAhADMA4GA1UdDwEB/wQEAwIDqDAT -BgNVHSUEDDAKBggrBgEFBQcDATAKBggqhkjOPQQDAgNHADBEAiB0XGkL2vHYzyG8 -gayx5cWzOHL5nPFQLTEmSVjD3svlfQIgeJ0/W+ISuxstPSXbK6j0dgKQeySoHUmW -RVZXi7tZVPo= +VQQKDAd3b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDElMCMGA1UEAwwcd29s +ZlNTTCBJbnRlcm1lZGlhdGUyIENBIEVDQzEfMB0GCSqGSIb3DQEJARYQaW5mb0B3 +b2xmc3NsLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABOoWKCwnXkGZBSiL +mfrFonQ8FU1S9EstgzSCjtW2P2HQh+v4TAZe7WYejMqk9ip2T9cmCUweibkYjtKj +ZjwbPcujZjBkMB0GA1UdDgQWBBQb9L2QKHRk4zNei2Sn/K+68rlV5TAfBgNVHSME +GDAWgBQTtXlZMrO7tEezNA6AwIMeqoLIWzASBgNVHRMBAf8ECDAGAQH/AgEBMA4G +A1UdDwEB/wQEAwIBhjAKBggqhkjOPQQDAgNIADBFAiBPG9Hh145ztYv3TQs9/BK8 +b3ytuRJwMDdBJ+xrNQaORwIhAKFVkbdoHjJmN2gQCp827sOXK4W4PEc8Su0TxVtZ +vLUp -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIICkTCCAjigAwIBAgICEAMwCgYIKoZIzj0EAwIwgZcxCzAJBgNVBAYTAlVTMRMw +MIICkzCCAjigAwIBAgICEAQwCgYIKoZIzj0EAwIwgZcxCzAJBgNVBAYTAlVTMRMw EQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3 b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEYMBYGA1UEAwwPd3d3LndvbGZz -c2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMB4XDTE4MTIy -MTE3NTQwMVoXDTM4MTIxNjE3NTQwMVowgaMxCzAJBgNVBAYTAlVTMRMwEQYDVQQI +c2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMB4XDTIwMDYx +NjE5MTc1OFoXDTQwMDYxMTE5MTc1OFowgaMxCzAJBgNVBAYTAlVTMRMwEQYDVQQI DApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3b2xmU1NM MRQwEgYDVQQLDAtEZXZlbG9wbWVudDEkMCIGA1UEAwwbd29sZlNTTCBJbnRlcm1l ZGlhdGUgQ0EgRUNDMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMFkw -EwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEld8csp4gqR2iW6tcm6hmBinmstjjFKbD -wbStTUQYIB5dZ/0VHW0l4RexccqFA/DSr0FmRjZt6kHLT8hK0KBhjKNmMGQwHQYD -VR0OBBYEFJcdYMOHIlmbYB+EtJkciE2/2h5uMB8GA1UdIwQYMBaAFFaOmsPwQt4Y -uUVVbvmTz+rD86UhMBIGA1UdEwEB/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgGG -MAoGCCqGSM49BAMCA0cAMEQCICCNvbwIilIgq7zwlAw8OJyewBhTlJR/Vz0VjnVf -jIJ5AiBAPg8nmui6m/SZz3E2aNHtMVQ36C430J5JqSd5wQM0UA== +EwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAExpzNj+XsW9iw/JEg4gs7UVNUS4lDjgDe +ka7TkPOF3Mw9EQgVdoLikjVK1EWOgzaCYrhNB4ULpVTgFOiT3n+S6KNmMGQwHQYD +VR0OBBYEFBO1eVkys7u0R7M0DoDAgx6qgshbMB8GA1UdIwQYMBaAFFaOmsPwQt4Y +uUVVbvmTz+rD86UhMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgGG +MAoGCCqGSM49BAMCA0kAMEYCIQCKUZH2ksVKaWXbW5DDkGrAlucmeq8YkSxrZ1VA +GGzBpgIhAJbMnTet6nlSbk1Bk9tkf+dCufESkPSEXHOxIdj7Vf5v -----END CERTIFICATE----- diff --git a/certs/intermediate/server-chain.der b/certs/intermediate/server-chain.der index 04c47848f78c52911ed11c5034c56cd5c040c19e..7bf08926fc1773abd5651810ef973b38b90c7fbf 100644 GIT binary patch delta 1738 zcma)*Ygp0;8;9i&;wdUo6G2pFE>9^So?TjMt2Z?_w0VfkG|NCVuN18iah@tQ9hIo_ zK$=v`InN3%(MEWprMWzX#|dGIVQXe;&bEDcKXkp<`{}uUAD-vK{kxwGcq`Hrn+93N zrh&&QzyJsUfSmvq2Gy|4Je0Wt1A(+uRj|y8f;o~g25Srj2SUKx5VTlI6p`p-a+rGI zbbQR|$msA3r|~RzsF{(GJ`9h=I^Y~|&NxSVrx1OZ-N#7yC)Q2(fK(l@X&^kS7H~Hg zZ=FM%LYP7=&efL73S-<4*$hHXq8JZ4nxBA-Z z46Ie4{?PcpXghAvCVZrg`1Lq17Jx8oIJ10A=ZkL$a5duJ-OLed%aq= znpJG9(tq6}Gsy*2oV0zGI`&3J`6dzfD;QJUoosP(TrqM_uklPMtvGXa+_V4ojsj`i zQ6s8uUG8hnoHLE{U19crK38V5cT+YF&YV{x)eg1a%^@i~)yKFC8ec8eh!d^_F+?2p zF_}RU>j;t7GL}q_OXs8I6>dN~_ttwpJO4*}gQv1cqf!kHbh&GzuhPO=ko-mmp zov}cLdJ`tT67X8A&fuebvG9-kIv~&{L>&v=8UP5ynpWG**cM;3C<6y|S!EC2_r#?m zY$t@IDU*=^w-Z)bmgTqVmL3j^_MAWa;Cy&1b>RLH+od5#89ysO;*e8`iQdocwO1Q! zi3NG-+Pd?x8GrckG!GXv7!+9!ta7>J4MtM-rDt^Oy7D+ZB%kV3Qf`ie~}4>>9LZ{DQJ-#s+51s`++8Z=q+5I*XE7|Rl<{=!%`HD6(R zzK&>Hrlnw!9^`2WdB1~#9%TCBn4JI8RXga>qn20f5P2e8yhPJ5dq$DE96sxxKa8J3 zJXf7uDI2_gsj1+2$36|FBze)Ri}kj&s!x*~(fC?1Afd<}wMlK3_Y#%-feoFRHWf*K#z2`wbOep+Ao_-_JZdI!tJY$G}TnM#Gl`n>9pOc znbh<{hYQaLpU4aFRqgeg`F0W;sa;mYa;;u-ouuaje>5sz?#Crr0`8wu@l&R;9;gxi zb&C!=ZfPJ>g!S$n3Jz%NwL`eferAn`;|qhlN7LFzSt#E=XzLP=XCfI6G)OrX>-3DLw;)J z_6JfLhc1*AJ2<|^M;Cgn4St5ac9Y=6!1r6;OI(4A+DepjT+wea@C6k#re0^+Zfbt2 zJL0kgDstmh{ajI!%R$mzhI`)F`w0`tG5!NLOf?cK2^{XA@{(AtohQ9#7 C#}yI) delta 997 zcmdlX)hfhc(8Ti0po#h1XSDx*=rnPV-A&7W@+4I(73%pi)SM_i7(UMPI8A2BJR_JsM{ zlvf*9Gf0R1`(9pA_BSQDw&MSlbrI4ZL|#7M>;1+o-{kbf4bG}*-3KBszIv<58&lM! zd9Uk4dEm~gN1mz$@a(<5@b$0BZ*0x_&%fK29kaq;y6~8<&iYHY6i#%0{&TzK(8~I6 z)05V$TAuyeS~0M-syNi7Y4(qqr>Au;x@;N0nK!;~o|{)_`09It=NsfzPrk|b_>=YP(rg|*v+7GE*uW{}$z%Vb+MS(bA*dUzXy!rKfU-t$4>J-M9O zX>v82V*TMo#j%P>3g@f}EtXH&eY>4SCQ5pqH?Q5PA4|XUX5CSqpp>N@k?f_B<+0*< zvHYUY8@^1|k4|SlYCaj*U;g)wZmjZlHs{DF(8jM90S>#)37$O}@`+S859M`nz%6rbBiMpA=8eFPD$wT4vX!FxkgGBPDai^>ubj zBc5DveNq*FCPUe_`hKr*?=J4*yVD(KN~zV0w;w6nZM{`gWkZv{9@pW2t4mM%MwUn& zH-7Ff;u`(s^5K(*^}N+IAglm@A0ow?V*M*s(TKZ zN;+nh<>XXd$hxSzV%cZs4AW3d?WpZt0WNBe^WipYTC>t^`Fg7tZF*z|eH8@%q4Kpw> zHZe3YIWadiII-c$0R=WNf&ns a2{FLCE(hStsaghy#E!aaFLhLf0yg#9bGO<6 delta 528 zcmeyy`HEA)po!&~K@;=21*CW|vKQZ|qi=QXr2 zG%_+YG&eOdFo+W8H3D*hLJ+P&=F(oB8HW?uGAHk&SNoVBEJxy_u{q!kzE=q2apPEKT0WNBg&V3@p@*|OetYj0Xz z>w@+(!Ap*xOwPV?#O1i_g~Ipx5t9;XPnf?=d9`shgLK%x@8uO`e^ZicEB;?u7a{#Y zKet;Bt*rkxJ!#FV<=MZj6$4wVibGABX8)LZdRphA z%a-w*dE@)$xp{?#uf8XEzCm8~l!ci` zraV6^!xp#B8}S_dk&d0^Eab9sx Date: Tue, 16 Jun 2020 14:10:05 -0700 Subject: [PATCH 254/298] Add alternate chain test case where peer presents chain (INT -> INT2 -> PEER) and only INT2 is loaded as trusted. Update existing alternate chain partial test cases to use INT2. Fix for test suite to allow extra newlines in .test files. --- tests/suites.c | 25 ++++++--- tests/test-altchains.conf | 107 ++++++++++++++++++++++++++++++++++---- wolfssl/test.h | 2 +- 3 files changed, 115 insertions(+), 19 deletions(-) diff --git a/tests/suites.c b/tests/suites.c index 75c277b6e..0d7a283cb 100644 --- a/tests/suites.c +++ b/tests/suites.c @@ -509,6 +509,8 @@ static void test_harness(void* vargs) int cliArgsSz; char* cursor; char* comment; + char lastChar = '\0'; + int do_it = 0; const char* fname = "tests/test.conf"; const char* addArgs = NULL; @@ -571,20 +573,27 @@ static void test_harness(void* vargs) cliArgs[0] = args->argv[0]; while (*cursor != 0) { - int do_it = 0; - switch (*cursor) { case '\n': /* A blank line triggers test case execution or switches to client mode if we don't have the client command yet */ - if (cliMode == 0) - cliMode = 1; /* switch to client mode processing */ - /* skip extra newlines */ - else - do_it = 1; /* Do It, we have server and client */ + if (lastChar != '\n' && (cliArgsSz > 1 || svrArgsSz > 1)) { + if (cliMode == 0) + cliMode = 1; /* switch to client mode processing */ + else + do_it = 1; /* Do It, we have server and client */ + } + #ifdef DEBUG_SUITE_TESTS + else { + /* skip extra new-lines */ + printf("skipping extra new line\n"); + } + #endif + lastChar = *cursor; cursor++; break; case '#': + lastChar = *cursor; /* Ignore lines that start with a # */ comment = XSTRSEP(&cursor, "\n"); #ifdef DEBUG_SUITE_TESTS @@ -597,6 +606,7 @@ static void test_harness(void* vargs) default: /* Parameters start with a -. They end in either a newline * or a space. Capture until either, save in Args list. */ + lastChar = *cursor; if (cliMode) cliArgs[cliArgsSz++] = XSTRSEP(&cursor, " \n"); else @@ -659,6 +669,7 @@ static void test_harness(void* vargs) svrArgsSz = 1; cliArgsSz = 1; cliMode = 0; + do_it = 0; } } diff --git a/tests/test-altchains.conf b/tests/test-altchains.conf index 9bd52741d..ee4106add 100644 --- a/tests/test-altchains.conf +++ b/tests/test-altchains.conf @@ -1,6 +1,7 @@ -# Tests will use complete chain with intermediate CA for testing +# Tests using a longer certificate chain (with intermediate CA's) # The tests with chains have the CRL checking disabled # CRL's only load for trusted CA's, for a chain you must load the root and intermediate as trusted + # For these tests we are loading root and sending intermediate and peer certs # server TLSv1.2 DHE-RSA-AES128-GCM-SHA256 RSA Chain -v 3 @@ -82,11 +83,12 @@ -c ./certs/intermediate/client-chain-ecc.pem -C + # Test will load intermediate CA as trusted and only present the peer cert (partial chain) # server TLSv1.2 DHE-RSA-AES128-GCM-SHA256 RSA Partial Chain -v 3 -l DHE-RSA-AES128-GCM-SHA256 --A ./certs/intermediate/ca-int-cert.pem +-A ./certs/intermediate/ca-int2-cert.pem -k ./certs/server-key.pem -c ./certs/intermediate/server-int-cert.pem -V @@ -94,7 +96,7 @@ # client TLSv1.2 DHE-RSA-AES128-GCM-SHA256 RSA Partial Chain -v 3 -l DHE-RSA-AES128-GCM-SHA256 --A ./certs/intermediate/ca-int-cert.pem +-A ./certs/intermediate/ca-int2-cert.pem -k ./certs/client-key.pem -c ./certs/intermediate/client-int-cert.pem -C @@ -102,7 +104,7 @@ # server TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256 RSA Partial Chain -v 3 -l ECDHE-RSA-AES128-GCM-SHA256 --A ./certs/intermediate/ca-int-cert.pem +-A ./certs/intermediate/ca-int2-cert.pem -k ./certs/server-key.pem -c ./certs/intermediate/server-int-cert.pem -V @@ -110,7 +112,7 @@ # client TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256 RSA Partial Chain -v 3 -l ECDHE-RSA-AES128-GCM-SHA256 --A ./certs/intermediate/ca-int-cert.pem +-A ./certs/intermediate/ca-int2-cert.pem -k ./certs/client-key.pem -c ./certs/intermediate/client-int-cert.pem -C @@ -118,7 +120,7 @@ # server TLSv1.2 ECDHE-ECDSA-AES128-GCM-SHA256 ECC Partial Chain -v 3 -l ECDHE-ECDSA-AES128-GCM-SHA256 --A ./certs/intermediate/ca-int-ecc-cert.pem +-A ./certs/intermediate/ca-int2-ecc-cert.pem -k ./certs/ecc-key.pem -c ./certs/intermediate/server-int-ecc-cert.pem -V @@ -126,7 +128,7 @@ # client TLSv1.2 ECDHE-ECDSA-AES128-GCM-SHA256 ECC Partial Chain -v 3 -l ECDHE-ECDSA-AES128-GCM-SHA256 --A ./certs/intermediate/ca-int-ecc-cert.pem +-A ./certs/intermediate/ca-int2-ecc-cert.pem -k ./certs/ecc-client-key.pem -c ./certs/intermediate/client-int-ecc-cert.pem -C @@ -134,7 +136,7 @@ # server TLSv1.3 TLS13-AES128-GCM-SHA256 RSA Partial Chain -v 4 -l TLS13-AES128-GCM-SHA256 --A ./certs/intermediate/ca-int-cert.pem +-A ./certs/intermediate/ca-int2-cert.pem -k ./certs/server-key.pem -c ./certs/intermediate/server-int-cert.pem -V @@ -142,7 +144,7 @@ # client TLSv1.3 TLS13-AES128-GCM-SHA256 RSA Partial Chain -v 4 -l TLS13-AES128-GCM-SHA256 --A ./certs/intermediate/ca-int-cert.pem +-A ./certs/intermediate/ca-int2-cert.pem -k ./certs/client-key.pem -c ./certs/intermediate/client-int-cert.pem -C @@ -150,7 +152,7 @@ # server TLSv1.3 TLS13-AES128-GCM-SHA256 ECC Partial Chain -v 4 -l TLS13-AES128-GCM-SHA256 --A ./certs/intermediate/ca-int-ecc-cert.pem +-A ./certs/intermediate/ca-int2-ecc-cert.pem -k ./certs/ecc-key.pem -c ./certs/intermediate/server-int-ecc-cert.pem -V @@ -158,11 +160,94 @@ # client TLSv1.3 TLS13-AES128-GCM-SHA256 ECC Partial Chain -v 4 -l TLS13-AES128-GCM-SHA256 --A ./certs/intermediate/ca-int-ecc-cert.pem +-A ./certs/intermediate/ca-int2-ecc-cert.pem -k ./certs/ecc-client-key.pem -c ./certs/intermediate/client-int-ecc-cert.pem -C + +# Test will load intermediate2 CA as trusted and present full chain (where intermediate CA is not trusted) +# server TLSv1.2 DHE-RSA-AES128-GCM-SHA256 RSA Partial Trusted Chain +-v 3 +-l DHE-RSA-AES128-GCM-SHA256 +-A ./certs/intermediate/ca-int2-cert.pem +-k ./certs/server-key.pem +-c ./certs/intermediate/server-chain.pem +-V + +# client TLSv1.2 DHE-RSA-AES128-GCM-SHA256 RSA Partial Trusted Chain +-v 3 +-l DHE-RSA-AES128-GCM-SHA256 +-A ./certs/intermediate/ca-int2-cert.pem +-k ./certs/client-key.pem +-c ./certs/intermediate/client-chain.pem +-C + +# server TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256 RSA Partial Trusted Chain +-v 3 +-l ECDHE-RSA-AES128-GCM-SHA256 +-A ./certs/intermediate/ca-int2-cert.pem +-k ./certs/server-key.pem +-c ./certs/intermediate/server-chain.pem +-V + +# client TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256 RSA Partial Trusted Chain +-v 3 +-l ECDHE-RSA-AES128-GCM-SHA256 +-A ./certs/intermediate/ca-int2-cert.pem +-k ./certs/client-key.pem +-c ./certs/intermediate/client-chain.pem +-C + +# server TLSv1.2 ECDHE-ECDSA-AES128-GCM-SHA256 ECC Partial Trusted Chain +-v 3 +-l ECDHE-ECDSA-AES128-GCM-SHA256 +-A ./certs/intermediate/ca-int2-ecc-cert.pem +-k ./certs/ecc-key.pem +-c ./certs/intermediate/server-chain-ecc.pem +-V + +# client TLSv1.2 ECDHE-ECDSA-AES128-GCM-SHA256 ECC Partial Trusted Chain +-v 3 +-l ECDHE-ECDSA-AES128-GCM-SHA256 +-A ./certs/intermediate/ca-int2-ecc-cert.pem +-k ./certs/ecc-client-key.pem +-c ./certs/intermediate/client-chain-ecc.pem +-C + +# server TLSv1.3 TLS13-AES128-GCM-SHA256 RSA Partial Trusted Chain +-v 4 +-l TLS13-AES128-GCM-SHA256 +-A ./certs/intermediate/ca-int2-cert.pem +-k ./certs/server-key.pem +-c ./certs/intermediate/server-chain.pem +-V + +# client TLSv1.3 TLS13-AES128-GCM-SHA256 RSA Partial Trusted Chain +-v 4 +-l TLS13-AES128-GCM-SHA256 +-A ./certs/intermediate/ca-int2-cert.pem +-k ./certs/client-key.pem +-c ./certs/intermediate/client-chain.pem +-C + +# server TLSv1.3 TLS13-AES128-GCM-SHA256 ECC Partial Trusted Chain +-v 4 +-l TLS13-AES128-GCM-SHA256 +-A ./certs/intermediate/ca-int2-ecc-cert.pem +-k ./certs/ecc-key.pem +-c ./certs/intermediate/server-chain-ecc.pem +-V + +# client TLSv1.3 TLS13-AES128-GCM-SHA256 ECC Partial Trusted Chain +-v 4 +-l TLS13-AES128-GCM-SHA256 +-A ./certs/intermediate/ca-int2-ecc-cert.pem +-k ./certs/ecc-client-key.pem +-c ./certs/intermediate/client-chain-ecc.pem +-C + + # Test will use alternate chain where chain contains extra cert # server TLSv1.2 DHE-RSA-AES128-GCM-SHA256 RSA Alt Chain -v 3 diff --git a/wolfssl/test.h b/wolfssl/test.h index 67e28842d..a321d918b 100644 --- a/wolfssl/test.h +++ b/wolfssl/test.h @@ -1729,7 +1729,7 @@ static WC_INLINE int myVerify(int preverify, WOLFSSL_X509_STORE_CTX* store) XFREE(subject, 0, DYNAMIC_TYPE_OPENSSL); XFREE(issuer, 0, DYNAMIC_TYPE_OPENSSL); #if defined(SHOW_CERTS) && !defined(NO_FILESYSTEM) -/* avoid printing duplicate certs */ + /* avoid printing duplicate certs */ if (store->depth == 1) { /* retrieve x509 certs and display them on stdout */ sk = wolfSSL_X509_STORE_GetCerts(store); From d70f6b7ede118e1e6f93b5286880427894d940d6 Mon Sep 17 00:00:00 2001 From: David Garske Date: Wed, 17 Jun 2020 16:25:41 -0700 Subject: [PATCH 255/298] Fix for tests/test-chains.conf with new intermediate CA. --- tests/test-chains.conf | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/tests/test-chains.conf b/tests/test-chains.conf index 879d9288d..cf99d214d 100644 --- a/tests/test-chains.conf +++ b/tests/test-chains.conf @@ -214,7 +214,7 @@ # server TLSv1.2 DHE-RSA-AES128-GCM-SHA256 RSA Partial Chain -v 3 -l DHE-RSA-AES128-GCM-SHA256 --A ./certs/intermediate/ca-int-cert.pem +-A ./certs/intermediate/ca-int2-cert.pem -k ./certs/server-key.pem -c ./certs/intermediate/server-int-cert.pem -V @@ -222,7 +222,7 @@ # client TLSv1.2 DHE-RSA-AES128-GCM-SHA256 RSA Partial Chain -v 3 -l DHE-RSA-AES128-GCM-SHA256 --A ./certs/intermediate/ca-int-cert.pem +-A ./certs/intermediate/ca-int2-cert.pem -k ./certs/client-key.pem -c ./certs/intermediate/client-int-cert.pem -C @@ -230,7 +230,7 @@ # server TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256 RSA Partial Chain -v 3 -l ECDHE-RSA-AES128-GCM-SHA256 --A ./certs/intermediate/ca-int-cert.pem +-A ./certs/intermediate/ca-int2-cert.pem -k ./certs/server-key.pem -c ./certs/intermediate/server-int-cert.pem -V @@ -238,7 +238,7 @@ # client TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256 RSA Partial Chain -v 3 -l ECDHE-RSA-AES128-GCM-SHA256 --A ./certs/intermediate/ca-int-cert.pem +-A ./certs/intermediate/ca-int2-cert.pem -k ./certs/client-key.pem -c ./certs/intermediate/client-int-cert.pem -C @@ -246,7 +246,7 @@ # server TLSv1.2 ECDHE-ECDSA-AES128-GCM-SHA256 ECC Partial Chain -v 3 -l ECDHE-ECDSA-AES128-GCM-SHA256 --A ./certs/intermediate/ca-int-ecc-cert.pem +-A ./certs/intermediate/ca-int2-ecc-cert.pem -k ./certs/ecc-key.pem -c ./certs/intermediate/server-int-ecc-cert.pem -V @@ -254,7 +254,7 @@ # client TLSv1.2 ECDHE-ECDSA-AES128-GCM-SHA256 ECC Partial Chain -v 3 -l ECDHE-ECDSA-AES128-GCM-SHA256 --A ./certs/intermediate/ca-int-ecc-cert.pem +-A ./certs/intermediate/ca-int2-ecc-cert.pem -k ./certs/ecc-client-key.pem -c ./certs/intermediate/client-int-ecc-cert.pem -C @@ -262,7 +262,7 @@ # server TLSv1.3 TLS13-AES128-GCM-SHA256 RSA Partial Chain -v 4 -l TLS13-AES128-GCM-SHA256 --A ./certs/intermediate/ca-int-cert.pem +-A ./certs/intermediate/ca-int2-cert.pem -k ./certs/server-key.pem -c ./certs/intermediate/server-int-cert.pem -V @@ -270,7 +270,7 @@ # client TLSv1.3 TLS13-AES128-GCM-SHA256 RSA Partial Chain -v 4 -l TLS13-AES128-GCM-SHA256 --A ./certs/intermediate/ca-int-cert.pem +-A ./certs/intermediate/ca-int2-cert.pem -k ./certs/client-key.pem -c ./certs/intermediate/client-int-cert.pem -C @@ -278,7 +278,7 @@ # server TLSv1.3 TLS13-AES128-GCM-SHA256 ECC Partial Chain -v 4 -l TLS13-AES128-GCM-SHA256 --A ./certs/intermediate/ca-int-ecc-cert.pem +-A ./certs/intermediate/ca-int2-ecc-cert.pem -k ./certs/ecc-key.pem -c ./certs/intermediate/server-int-ecc-cert.pem -V @@ -286,7 +286,7 @@ # client TLSv1.3 TLS13-AES128-GCM-SHA256 ECC Partial Chain -v 4 -l TLS13-AES128-GCM-SHA256 --A ./certs/intermediate/ca-int-ecc-cert.pem +-A ./certs/intermediate/ca-int2-ecc-cert.pem -k ./certs/ecc-client-key.pem -c ./certs/intermediate/client-int-ecc-cert.pem -C From efa169e595de8109c987a053933bedfc4063253a Mon Sep 17 00:00:00 2001 From: David Garske Date: Thu, 18 Jun 2020 08:33:22 -0700 Subject: [PATCH 256/298] Fix for invalid files in include.am. Improvement to new alt-chain tests to catch case this PR fixes. --- certs/intermediate/include.am | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/certs/intermediate/include.am b/certs/intermediate/include.am index ec5531ec8..d3c469e9d 100644 --- a/certs/intermediate/include.am +++ b/certs/intermediate/include.am @@ -32,10 +32,6 @@ EXTRA_DIST += \ certs/intermediate/client-int-ecc-cert.pem \ certs/intermediate/server-chain-alt-ecc.pem \ certs/intermediate/server-chain-alt.pem \ - certs/intermediate/client-int2-cert.der \ - certs/intermediate/client-int2-cert.pem \ - certs/intermediate/client-int2-ecc-cert.der \ - certs/intermediate/client-int2-ecc-cert.pem \ certs/intermediate/server-chain-ecc.der \ certs/intermediate/server-chain-ecc.pem \ certs/intermediate/server-chain.der \ @@ -43,8 +39,4 @@ EXTRA_DIST += \ certs/intermediate/server-int-cert.der \ certs/intermediate/server-int-cert.pem \ certs/intermediate/server-int-ecc-cert.der \ - certs/intermediate/server-int-ecc-cert.pem \ - certs/intermediate/server-int2-cert.der \ - certs/intermediate/server-int2-cert.pem \ - certs/intermediate/server-int2-ecc-cert.der \ - certs/intermediate/server-int2-ecc-cert.pem + certs/intermediate/server-int-ecc-cert.pem From 667d9ca896054fe10dacf671d057a9bcba4aa99d Mon Sep 17 00:00:00 2001 From: David Garske Date: Thu, 18 Jun 2020 09:26:50 -0700 Subject: [PATCH 257/298] Fix to catch the issue in this PR with alt cert chains, which only happens if the verify callback is used and the chain is long enough. Cleanup of the myVerify callback to allow specific actions. Fix the suites.c to not crash if no newline at end of file. Added helpful debug message to show that a CA was found. --- examples/client/client.c | 25 ++++--- examples/server/server.c | 12 +-- tests/api.c | 8 +- tests/suites.c | 4 +- tests/test-altchains.conf | 150 ++++++++++++++++++++++++++++++-------- wolfcrypt/src/asn.c | 3 + wolfssl/test.h | 39 ++++------ 7 files changed, 166 insertions(+), 75 deletions(-) diff --git a/examples/client/client.c b/examples/client/client.c index af82da6f1..c78037d83 100644 --- a/examples/client/client.c +++ b/examples/client/client.c @@ -1444,7 +1444,6 @@ THREAD_RETURN WOLFSSL_THREAD client_test(void* args) int pkCallbacks = 0; PkCbInfo pkCbInfo; #endif - int overrideDateErrors = 0; int minDhKeyBits = DEFAULT_MIN_DHKEY_BITS; char* alpnList = NULL; unsigned char alpn_opt = 0; @@ -1575,7 +1574,6 @@ THREAD_RETURN WOLFSSL_THREAD client_test(void* args) (void)ourCert; (void)verifyCert; (void)useClientCert; - (void)overrideDateErrors; (void)disableCRL; (void)minDhKeyBits; (void)alpnList; @@ -1621,7 +1619,7 @@ THREAD_RETURN WOLFSSL_THREAD client_test(void* args) XEXIT_T(EXIT_SUCCESS); case 'D' : - overrideDateErrors = 1; + myVerifyAction = VERIFY_OVERRIDE_DATE_ERR; break; case 'C' : @@ -1733,7 +1731,11 @@ THREAD_RETURN WOLFSSL_THREAD client_test(void* args) } else if (XSTRNCMP(myoptarg, "verifyFail", 10) == 0) { printf("Verify should fail\n"); - myVerifyFail = 1; + myVerifyAction = VERIFY_FORCE_FAIL; + } + else if (XSTRNCMP(myoptarg, "verifyInfo", 10) == 0) { + printf("Verify should not override error\n"); + myVerifyAction = VERIFY_USE_PREVERFIY; } else if (XSTRNCMP(myoptarg, "useSupCurve", 11) == 0) { printf("Attempting to test use supported curve\n"); @@ -2445,7 +2447,7 @@ THREAD_RETURN WOLFSSL_THREAD client_test(void* args) #endif } - if (!usePsk && !useAnon && !useVerifyCb && !myVerifyFail) { + if (!usePsk && !useAnon && !useVerifyCb && myVerifyAction != VERIFY_FORCE_FAIL) { #ifndef TEST_LOAD_BUFFER unsigned int verify_flags = 0; #ifdef TEST_BEFORE_DATE @@ -2482,12 +2484,16 @@ THREAD_RETURN WOLFSSL_THREAD client_test(void* args) } #endif /* WOLFSSL_TRUST_PEER_CERT && !NO_FILESYSTEM */ } - if (useVerifyCb || myVerifyFail) + if (useVerifyCb || myVerifyAction == VERIFY_OVERRIDE_ERROR || + myVerifyAction == VERIFY_USE_PREVERFIY) { wolfSSL_CTX_set_verify(ctx, WOLFSSL_VERIFY_PEER, myVerify); - else if (!usePsk && !useAnon && doPeerCheck == 0) + } + else if (!usePsk && !useAnon && doPeerCheck == 0) { wolfSSL_CTX_set_verify(ctx, WOLFSSL_VERIFY_NONE, 0); - else if (!usePsk && !useAnon && overrideDateErrors == 1) - wolfSSL_CTX_set_verify(ctx, WOLFSSL_VERIFY_PEER, myDateCb); + } + else if (!usePsk && !useAnon && myVerifyAction == VERIFY_OVERRIDE_DATE_ERR) { + wolfSSL_CTX_set_verify(ctx, WOLFSSL_VERIFY_PEER, myVerify); + } #endif /* !NO_CERTS */ #ifdef WOLFSSL_ASYNC_CRYPT @@ -3452,7 +3458,6 @@ exit: /* There are use cases when these assignments are not read. To avoid * potential confusion those warnings have been handled here. */ - (void) overrideDateErrors; (void) useClientCert; (void) verifyCert; (void) ourCert; diff --git a/examples/server/server.c b/examples/server/server.c index 9c4c2925b..b58612449 100644 --- a/examples/server/server.c +++ b/examples/server/server.c @@ -957,7 +957,6 @@ THREAD_RETURN WOLFSSL_THREAD server_test(void* args) unsigned char alpn_opt = 0; char* cipherList = NULL; int useDefCipherList = 0; - int overrideDateErrors = 0; const char* verifyCert; const char* ourCert; const char* ourKey; @@ -1089,7 +1088,6 @@ THREAD_RETURN WOLFSSL_THREAD server_test(void* args) (void)postHandAuth; (void)mcastID; (void)loadCertKeyIntoSSLObj; - (void)overrideDateErrors; (void)nonBlocking; #ifdef WOLFSSL_TIRTOS @@ -1221,7 +1219,11 @@ THREAD_RETURN WOLFSSL_THREAD server_test(void* args) } else if (XSTRNCMP(myoptarg, "verifyFail", 10) == 0) { printf("Verify should fail\n"); - myVerifyFail = 1; + myVerifyAction = VERIFY_FORCE_FAIL; + } + else if (XSTRNCMP(myoptarg, "verifyInfo", 10) == 0) { + printf("Verify should use preverify (just show info)\n"); + myVerifyAction = VERIFY_USE_PREVERFIY; } else if (XSTRNCMP(myoptarg, "loadSSL", 7) == 0) { printf("Also load cert/key into wolfSSL object\n"); @@ -1243,7 +1245,7 @@ THREAD_RETURN WOLFSSL_THREAD server_test(void* args) } else if (XSTRNCMP(myoptarg, "overrideDateErr", 15) == 0) { #if !defined(NO_FILESYSTEM) && !defined(NO_CERTS) - overrideDateErrors = 1; + myVerifyAction = VERIFY_OVERRIDE_DATE_ERR; #endif } else { @@ -1805,7 +1807,7 @@ THREAD_RETURN WOLFSSL_THREAD server_test(void* args) SSL_CTX_set_verify(ctx, WOLFSSL_VERIFY_PEER | (usePskPlus ? WOLFSSL_VERIFY_FAIL_EXCEPT_PSK : WOLFSSL_VERIFY_FAIL_IF_NO_PEER_CERT), - overrideDateErrors == 1 ? myDateCb : NULL); + myVerifyAction == VERIFY_OVERRIDE_DATE_ERR ? myVerify : NULL); #ifdef TEST_BEFORE_DATE verify_flags |= WOLFSSL_LOAD_FLAG_DATE_ERR_OKAY; diff --git a/tests/api.c b/tests/api.c index afe36b837..f2c47b5a7 100644 --- a/tests/api.c +++ b/tests/api.c @@ -1172,7 +1172,7 @@ static int test_wolfSSL_CertManagerSetVerify(void) #if !defined(NO_FILESYSTEM) && !defined(NO_CERTS) && \ !defined(NO_WOLFSSL_CM_VERIFY) && !defined(NO_RSA) WOLFSSL_CERT_MANAGER* cm; - int tmp = myVerifyFail; + int tmp = myVerifyAction; const char* ca_cert = "./certs/ca-cert.pem"; const char* expiredCert = "./certs/test/expired/expired-cert.pem"; @@ -1185,7 +1185,7 @@ static int test_wolfSSL_CertManagerSetVerify(void) AssertIntEQ(ret, WOLFSSL_SUCCESS); /* Use the test CB that always accepts certs */ - myVerifyFail = 0; + myVerifyAction = VERIFY_OVERRIDE_ERROR; ret = wolfSSL_CertManagerVerify(cm, expiredCert, WOLFSSL_FILETYPE_PEM); AssertIntEQ(ret, WOLFSSL_SUCCESS); @@ -1194,7 +1194,7 @@ static int test_wolfSSL_CertManagerSetVerify(void) { const char* verifyCert = "./certs/server-cert.pem"; /* Use the test CB that always fails certs */ - myVerifyFail = 1; + myVerifyAction = VERIFY_FORCE_FAIL; ret = wolfSSL_CertManagerVerify(cm, verifyCert, WOLFSSL_FILETYPE_PEM); AssertIntEQ(ret, VERIFY_CERT_ERROR); @@ -1202,7 +1202,7 @@ static int test_wolfSSL_CertManagerSetVerify(void) #endif wolfSSL_CertManagerFree(cm); - myVerifyFail = tmp; + myVerifyAction = tmp; #endif return ret; diff --git a/tests/suites.c b/tests/suites.c index 0d7a283cb..3aca423ba 100644 --- a/tests/suites.c +++ b/tests/suites.c @@ -572,7 +572,7 @@ static void test_harness(void* vargs) cliArgsSz = 1; cliArgs[0] = args->argv[0]; - while (*cursor != 0) { + while (cursor && *cursor != 0) { switch (*cursor) { case '\n': /* A blank line triggers test case execution or switches @@ -611,7 +611,7 @@ static void test_harness(void* vargs) cliArgs[cliArgsSz++] = XSTRSEP(&cursor, " \n"); else svrArgs[svrArgsSz++] = XSTRSEP(&cursor, " \n"); - if (*cursor == '\0') /* eof */ + if (cursor == NULL || *cursor == '\0') /* eof */ do_it = 1; break; } diff --git a/tests/test-altchains.conf b/tests/test-altchains.conf index ee4106add..bcd38c01d 100644 --- a/tests/test-altchains.conf +++ b/tests/test-altchains.conf @@ -166,6 +166,88 @@ -C +# Test will use alternate chain where chain contains extra cert +# server TLSv1.2 DHE-RSA-AES128-GCM-SHA256 RSA Alt Chain +-v 3 +-l DHE-RSA-AES128-GCM-SHA256 +-A ./certs/ca-cert.pem +-k ./certs/server-key.pem +-c ./certs/intermediate/server-chain-alt.pem +-V + +# client TLSv1.2 DHE-RSA-AES128-GCM-SHA256 RSA Alt Chain +-v 3 +-l DHE-RSA-AES128-GCM-SHA256 +-A ./certs/ca-cert.pem +-k ./certs/client-key.pem +-c ./certs/intermediate/client-chain-alt.pem +-C + +# server TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256 RSA Alt Chain +-v 3 +-l ECDHE-RSA-AES128-GCM-SHA256 +-A ./certs/ca-cert.pem +-k ./certs/server-key.pem +-c ./certs/intermediate/server-chain-alt.pem +-V + +# client TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256 RSA Alt Chain +-v 3 +-l ECDHE-RSA-AES128-GCM-SHA256 +-A ./certs/ca-cert.pem +-k ./certs/client-key.pem +-c ./certs/intermediate/client-chain-alt.pem +-C + +# server TLSv1.2 ECDHE-ECDSA-AES128-GCM-SHA256 ECC Alt Chain +-v 3 +-l ECDHE-ECDSA-AES128-GCM-SHA256 +-A ./certs/ca-ecc-cert.pem +-k ./certs/ecc-key.pem +-c ./certs/intermediate/server-chain-alt-ecc.pem +-V + +# client TLSv1.2 ECDHE-ECDSA-AES128-GCM-SHA256 ECC Alt Chain +-v 3 +-l ECDHE-ECDSA-AES128-GCM-SHA256 +-A ./certs/ca-ecc-cert.pem +-k ./certs/ecc-client-key.pem +-c ./certs/intermediate/client-chain-alt-ecc.pem +-C + +# server TLSv1.3 TLS13-AES128-GCM-SHA256 RSA Alt Chain +-v 4 +-l TLS13-AES128-GCM-SHA256 +-A ./certs/ca-cert.pem +-k ./certs/server-key.pem +-c ./certs/intermediate/server-chain-alt.pem +-V + +# client TLSv1.3 TLS13-AES128-GCM-SHA256 RSA Alt Chain +-v 4 +-l TLS13-AES128-GCM-SHA256 +-A ./certs/ca-cert.pem +-k ./certs/client-key.pem +-c ./certs/intermediate/client-chain-alt.pem +-C + +# server TLSv1.3 TLS13-AES128-GCM-SHA256 ECC Alt Chain +-v 4 +-l TLS13-AES128-GCM-SHA256 +-A ./certs/ca-ecc-cert.pem +-k ./certs/ecc-key.pem +-c ./certs/intermediate/server-chain-alt-ecc.pem +-V + +# client TLSv1.3 TLS13-AES128-GCM-SHA256 ECC Alt Chain +-v 4 +-l TLS13-AES128-GCM-SHA256 +-A ./certs/ca-ecc-cert.pem +-k ./certs/ecc-client-key.pem +-c ./certs/intermediate/client-chain-alt-ecc.pem +-C + + # Test will load intermediate2 CA as trusted and present full chain (where intermediate CA is not trusted) # server TLSv1.2 DHE-RSA-AES128-GCM-SHA256 RSA Partial Trusted Chain -v 3 @@ -248,83 +330,89 @@ -C -# Test will use alternate chain where chain contains extra cert -# server TLSv1.2 DHE-RSA-AES128-GCM-SHA256 RSA Alt Chain +# Test will load intermediate2 CA as trusted and present full chain (where intermediate CA is not trusted) +# These tests use the verify callback, but pass the preverify as result in myVerify callback +# server TLSv1.2 DHE-RSA-AES128-GCM-SHA256 RSA Partial Trusted Chain -v 3 -l DHE-RSA-AES128-GCM-SHA256 --A ./certs/ca-cert.pem +-A ./certs/intermediate/ca-int2-cert.pem -k ./certs/server-key.pem --c ./certs/intermediate/server-chain-alt.pem +-c ./certs/intermediate/server-chain.pem -V -# client TLSv1.2 DHE-RSA-AES128-GCM-SHA256 RSA Alt Chain +# client TLSv1.2 DHE-RSA-AES128-GCM-SHA256 RSA Partial Trusted Chain -v 3 -l DHE-RSA-AES128-GCM-SHA256 --A ./certs/ca-cert.pem +-A ./certs/intermediate/ca-int2-cert.pem -k ./certs/client-key.pem --c ./certs/intermediate/client-chain-alt.pem +-c ./certs/intermediate/client-chain.pem -C +-H verifyInfo -# server TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256 RSA Alt Chain +# server TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256 RSA Partial Trusted Chain -v 3 -l ECDHE-RSA-AES128-GCM-SHA256 --A ./certs/ca-cert.pem +-A ./certs/intermediate/ca-int2-cert.pem -k ./certs/server-key.pem --c ./certs/intermediate/server-chain-alt.pem +-c ./certs/intermediate/server-chain.pem -V -# client TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256 RSA Alt Chain +# client TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256 RSA Partial Trusted Chain -v 3 -l ECDHE-RSA-AES128-GCM-SHA256 --A ./certs/ca-cert.pem +-A ./certs/intermediate/ca-int2-cert.pem -k ./certs/client-key.pem --c ./certs/intermediate/client-chain-alt.pem +-c ./certs/intermediate/client-chain.pem -C +-H verifyInfo -# server TLSv1.2 ECDHE-ECDSA-AES128-GCM-SHA256 ECC Alt Chain +# server TLSv1.2 ECDHE-ECDSA-AES128-GCM-SHA256 ECC Partial Trusted Chain -v 3 -l ECDHE-ECDSA-AES128-GCM-SHA256 --A ./certs/ca-ecc-cert.pem +-A ./certs/intermediate/ca-int2-ecc-cert.pem -k ./certs/ecc-key.pem --c ./certs/intermediate/server-chain-alt-ecc.pem +-c ./certs/intermediate/server-chain-ecc.pem -V -# client TLSv1.2 ECDHE-ECDSA-AES128-GCM-SHA256 ECC Alt Chain +# client TLSv1.2 ECDHE-ECDSA-AES128-GCM-SHA256 ECC Partial Trusted Chain -v 3 -l ECDHE-ECDSA-AES128-GCM-SHA256 --A ./certs/ca-ecc-cert.pem +-A ./certs/intermediate/ca-int2-ecc-cert.pem -k ./certs/ecc-client-key.pem --c ./certs/intermediate/client-chain-alt-ecc.pem +-c ./certs/intermediate/client-chain-ecc.pem -C +-H verifyInfo -# server TLSv1.3 TLS13-AES128-GCM-SHA256 RSA Alt Chain +# server TLSv1.3 TLS13-AES128-GCM-SHA256 RSA Partial Trusted Chain -v 4 -l TLS13-AES128-GCM-SHA256 --A ./certs/ca-cert.pem +-A ./certs/intermediate/ca-int2-cert.pem -k ./certs/server-key.pem --c ./certs/intermediate/server-chain-alt.pem +-c ./certs/intermediate/server-chain.pem -V -# client TLSv1.3 TLS13-AES128-GCM-SHA256 RSA Alt Chain +# client TLSv1.3 TLS13-AES128-GCM-SHA256 RSA Partial Trusted Chain -v 4 -l TLS13-AES128-GCM-SHA256 --A ./certs/ca-cert.pem +-A ./certs/intermediate/ca-int2-cert.pem -k ./certs/client-key.pem --c ./certs/intermediate/client-chain-alt.pem +-c ./certs/intermediate/client-chain.pem -C +-H verifyInfo -# server TLSv1.3 TLS13-AES128-GCM-SHA256 ECC Alt Chain +# server TLSv1.3 TLS13-AES128-GCM-SHA256 ECC Partial Trusted Chain -v 4 -l TLS13-AES128-GCM-SHA256 --A ./certs/ca-ecc-cert.pem +-A ./certs/intermediate/ca-int2-ecc-cert.pem -k ./certs/ecc-key.pem --c ./certs/intermediate/server-chain-alt-ecc.pem +-c ./certs/intermediate/server-chain-ecc.pem -V -# client TLSv1.3 TLS13-AES128-GCM-SHA256 ECC Alt Chain +# client TLSv1.3 TLS13-AES128-GCM-SHA256 ECC Partial Trusted Chain -v 4 -l TLS13-AES128-GCM-SHA256 --A ./certs/ca-ecc-cert.pem +-A ./certs/intermediate/ca-int2-ecc-cert.pem -k ./certs/ecc-client-key.pem --c ./certs/intermediate/client-chain-alt-ecc.pem +-c ./certs/intermediate/client-chain-ecc.pem -C +-H verifyInfo diff --git a/wolfcrypt/src/asn.c b/wolfcrypt/src/asn.c index 76a29144c..1156d570b 100644 --- a/wolfcrypt/src/asn.c +++ b/wolfcrypt/src/asn.c @@ -9353,6 +9353,9 @@ int ParseCertRelative(DecodedCert* cert, int type, int verify, void* cm) #else cert->ca = GetCA(cm, cert->issuerHash); #endif /* !NO_SKID */ + + if (cert->ca) + WOLFSSL_MSG("CA found"); } if (cert->selfSigned) { diff --git a/wolfssl/test.h b/wolfssl/test.h index a321d918b..fadb1a50e 100644 --- a/wolfssl/test.h +++ b/wolfssl/test.h @@ -1677,7 +1677,13 @@ static WC_INLINE void OCSPRespFreeCb(void* ioCtx, unsigned char* response) #endif /* !NO_FILESYSTEM || (NO_FILESYSTEM && FORCE_BUFFER_TEST) */ #endif /* !NO_CERTS */ -static int myVerifyFail = 0; +enum { + VERIFY_OVERRIDE_ERROR, + VERIFY_FORCE_FAIL, + VERIFY_USE_PREVERFIY, + VERIFY_OVERRIDE_DATE_ERR, +}; +static int myVerifyAction = VERIFY_OVERRIDE_ERROR; /* The verify callback is called for every certificate only when * --enable-opensslextra is defined because it sets WOLFSSL_ALWAYS_VERIFY_CB and @@ -1764,37 +1770,24 @@ static WC_INLINE int myVerify(int preverify, WOLFSSL_X509_STORE_CTX* store) printf("\tSubject's domain name at %d is %s\n", store->error_depth, store->domain); /* Testing forced fail case by return zero */ - if (myVerifyFail) { + if (myVerifyAction == VERIFY_FORCE_FAIL) { return 0; /* test failure case */ } + if (myVerifyAction == VERIFY_OVERRIDE_DATE_ERR && + (store->error == ASN_BEFORE_DATE_E || store->error == ASN_AFTER_DATE_E)) { + printf("Overriding cert date error as example for bad clock testing\n"); + return 1; + } + /* If error indicate we are overriding it for testing purposes */ - if (store->error != 0) { + if (store->error != 0 && myVerifyAction == VERIFY_OVERRIDE_ERROR) { printf("\tAllowing failed certificate check, testing only " "(shouldn't do this in production)\n"); } /* A non-zero return code indicates failure override */ - return 1; -} - - -static WC_INLINE int myDateCb(int preverify, WOLFSSL_X509_STORE_CTX* store) -{ - char buffer[WOLFSSL_MAX_ERROR_SZ]; - (void)preverify; - - printf("In verification callback, error = %d, %s\n", store->error, - wolfSSL_ERR_error_string(store->error, buffer)); - printf("Subject's domain name is %s\n", store->domain); - - if (store->error == ASN_BEFORE_DATE_E || store->error == ASN_AFTER_DATE_E) { - printf("Overriding cert date error as example for bad clock testing\n"); - return 1; - } - printf("Cert error is not date error, not overriding\n"); - - return 0; + return (myVerifyAction == VERIFY_OVERRIDE_ERROR) ? 1 : preverify; } From 1e431e1ade7aa2fe395feafe1f22f2f92220ad06 Mon Sep 17 00:00:00 2001 From: Jacob Barthelmeh Date: Thu, 18 Jun 2020 10:57:25 -0600 Subject: [PATCH 258/298] add test case and fixes from review --- src/crl.c | 23 +++++++++++++++++++---- src/ssl.c | 11 +++++------ tests/api.c | 36 +++++++++++++++++++++++++++++------- 3 files changed, 53 insertions(+), 17 deletions(-) diff --git a/src/crl.c b/src/crl.c index f3f52c855..628acda78 100644 --- a/src/crl.c +++ b/src/crl.c @@ -527,6 +527,16 @@ static RevokedCert *DupRevokedCertList(RevokedCert* in, void* heap) if (head == NULL) head = tmp; } + else { + WOLFSSL_MSG("Failed to allocate new RevokedCert structure"); + /* free up any existing list */ + while (head != NULL) { + current = head; + head = head->next; + XFREE(current, heap, DYNAMIC_TYPE_REVOKED); + } + return NULL; + } current = current->next; } return head; @@ -534,7 +544,7 @@ static RevokedCert *DupRevokedCertList(RevokedCert* in, void* heap) /* returns a deep copy of ent on success and null on fail */ -static CRL_Entry* DupCRL_Entry(CRL_Entry* ent, void* heap) +static CRL_Entry* DupCRL_Entry(const CRL_Entry* ent, void* heap) { CRL_Entry *dup; @@ -543,6 +553,7 @@ static CRL_Entry* DupCRL_Entry(CRL_Entry* ent, void* heap) WOLFSSL_MSG("alloc CRL Entry failed"); return NULL; } + XMEMSET(dup, 0, sizeof(CRL_Entry)); XMEMCPY(dup->issuerHash, ent->issuerHash, CRL_DIGEST_SIZE); XMEMCPY(dup->lastDate, ent->lastDate, MAX_DATE_SIZE); @@ -561,6 +572,7 @@ static CRL_Entry* DupCRL_Entry(CRL_Entry* ent, void* heap) dup->toBeSigned = (byte*)XMALLOC(dup->tbsSz, heap, DYNAMIC_TYPE_CRL_ENTRY); if (dup->toBeSigned == NULL) { + FreeCRL_Entry(dup, heap); XFREE(dup, heap, DYNAMIC_TYPE_CRL_ENTRY); return NULL; } @@ -568,8 +580,8 @@ static CRL_Entry* DupCRL_Entry(CRL_Entry* ent, void* heap) dup->signature = (byte*)XMALLOC(dup->signatureSz, heap, DYNAMIC_TYPE_CRL_ENTRY); if (dup->signature == NULL) { + FreeCRL_Entry(dup, heap); XFREE(dup, heap, DYNAMIC_TYPE_CRL_ENTRY); - XFREE(dup->toBeSigned, heap, DYNAMIC_TYPE_CRL_ENTRY); return NULL; } XMEMCPY(dup->toBeSigned, ent->toBeSigned, dup->tbsSz); @@ -617,7 +629,7 @@ static CRL_Entry* DupCRL_list(CRL_Entry* crl, void* heap) /* Duplicates everything except the parent cm pointed to. * Expects that Init has already been done to 'dup' * return 0 on success */ -static int DupX509_CRL(WOLFSSL_X509_CRL *dup, WOLFSSL_X509_CRL* crl) +static int DupX509_CRL(WOLFSSL_X509_CRL *dup, const WOLFSSL_X509_CRL* crl) { if (dup == NULL || crl == NULL) { return BAD_FUNC_ARG; @@ -660,7 +672,10 @@ int wolfSSL_X509_STORE_add_crl(WOLFSSL_X509_STORE *store, WOLFSSL_X509_CRL *newc if (store->cm->crl == NULL) { crl = wolfSSL_X509_crl_new(store->cm); - DupX509_CRL(crl, newcrl); + if (DupX509_CRL(crl, newcrl) != 0) { + FreeCRL(crl, 1); + return WOLFSSL_FAILURE; + } store->crl = store->cm->crl = crl; return WOLFSSL_SUCCESS; } diff --git a/src/ssl.c b/src/ssl.c index 1106300e8..ae2da8636 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -22921,7 +22921,6 @@ void wolfSSL_X509_STORE_CTX_cleanup(WOLFSSL_X509_STORE_CTX* ctx) /* Do nothing */ } -#if defined(OPENSSL_ALL) || defined(WOLFSSL_QT) /* Returns corresponding X509 error from internal ASN error */ static int GetX509Error(int e) { @@ -22947,7 +22946,6 @@ static int GetX509Error(int e) return e; } } -#endif /* OPENSSL_ALL || WOLFSSL_QT */ /* Verifies certificate chain using WOLFSSL_X509_STORE_CTX * returns 0 on success or < 0 on failure. @@ -22955,11 +22953,10 @@ static int GetX509Error(int e) int wolfSSL_X509_verify_cert(WOLFSSL_X509_STORE_CTX* ctx) { int ret = 0; -#if defined(OPENSSL_ALL) || defined(WOLFSSL_QT) int depth = 0; int error; byte *afterDate, *beforeDate; -#endif + WOLFSSL_ENTER("wolfSSL_X509_verify_cert"); if (ctx != NULL && ctx->store != NULL && ctx->store->cm != NULL @@ -22969,7 +22966,6 @@ int wolfSSL_X509_verify_cert(WOLFSSL_X509_STORE_CTX* ctx) ctx->current_cert->derCert->length, WOLFSSL_FILETYPE_ASN1); -#if defined(OPENSSL_ALL) || defined(WOLFSSL_QT) /* If there was an error, process it and add it to CTX */ if (ret < 0) { /* Get corresponding X509 error */ @@ -22980,8 +22976,10 @@ int wolfSSL_X509_verify_cert(WOLFSSL_X509_STORE_CTX* ctx) wolfSSL_X509_STORE_CTX_set_error(ctx, error); wolfSSL_X509_STORE_CTX_set_error_depth(ctx, depth); + #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT) if (ctx->store && ctx->store->verify_cb) ctx->store->verify_cb(0, ctx); + #endif } error = 0; @@ -23004,10 +23002,11 @@ int wolfSSL_X509_verify_cert(WOLFSSL_X509_STORE_CTX* ctx) if (error != 0 ) { wolfSSL_X509_STORE_CTX_set_error(ctx, error); wolfSSL_X509_STORE_CTX_set_error_depth(ctx, depth); + #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT) if (ctx->store && ctx->store->verify_cb) ctx->store->verify_cb(0, ctx); + #endif } -#endif /* OPENSSL_ALL || WOLFSSL_QT */ return ret; } return WOLFSSL_FATAL_ERROR; diff --git a/tests/api.c b/tests/api.c index f289dd513..7a24b1662 100644 --- a/tests/api.c +++ b/tests/api.c @@ -22561,26 +22561,48 @@ static void test_wolfSSL_X509_STORE(void) X509_STORE *store; #ifdef HAVE_CRL + X509_STORE_CTX *storeCtx; X509_CRL *crl; X509 *x509; - const char crl_pem[] = "./certs/crl/crl.pem"; - const char svrCert[] = "./certs/server-cert.pem"; + const char crlPem[] = "./certs/crl/crl.revoked"; + const char srvCert[] = "./certs/server-revoked-cert.pem"; + const char caCert[] = "./certs/ca-cert.pem"; XFILE fp; printf(testingFmt, "test_wolfSSL_X509_STORE"); AssertNotNull(store = (X509_STORE *)X509_STORE_new()); - AssertNotNull((x509 = - wolfSSL_X509_load_certificate_file(svrCert, SSL_FILETYPE_PEM))); + AssertNotNull((x509 = wolfSSL_X509_load_certificate_file(caCert, + SSL_FILETYPE_PEM))); AssertIntEQ(X509_STORE_add_cert(store, x509), SSL_SUCCESS); + AssertNotNull((x509 = wolfSSL_X509_load_certificate_file(srvCert, + SSL_FILETYPE_PEM))); + AssertNotNull((storeCtx = X509_STORE_CTX_new())); + AssertIntEQ(X509_STORE_CTX_init(storeCtx, store, x509, NULL), SSL_SUCCESS); + AssertIntEQ(X509_verify_cert(storeCtx), SSL_SUCCESS); + X509_STORE_CTX_free(storeCtx); X509_free(x509); - fp = XFOPEN(crl_pem, "rb"); + /* should fail to verify now after adding in CRL */ + AssertNotNull(store = (X509_STORE *)X509_STORE_new()); + AssertNotNull((x509 = wolfSSL_X509_load_certificate_file(caCert, + SSL_FILETYPE_PEM))); + AssertIntEQ(X509_STORE_add_cert(store, x509), SSL_SUCCESS); + fp = XFOPEN(crlPem, "rb"); AssertTrue((fp != XBADFILE)); - AssertNotNull(crl = (X509_CRL *)PEM_read_X509_CRL(fp, (X509_CRL **)NULL, NULL, NULL)); + AssertNotNull(crl = (X509_CRL *)PEM_read_X509_CRL(fp, (X509_CRL **)NULL, + NULL, NULL)); XFCLOSE(fp); AssertIntEQ(X509_STORE_add_crl(store, crl), SSL_SUCCESS); + AssertIntEQ(X509_STORE_set_flags(store, X509_V_FLAG_CRL_CHECK),SSL_SUCCESS); + AssertNotNull((storeCtx = X509_STORE_CTX_new())); + AssertNotNull((x509 = wolfSSL_X509_load_certificate_file(srvCert, + SSL_FILETYPE_PEM))); + AssertIntEQ(X509_STORE_CTX_init(storeCtx, store, x509, NULL), SSL_SUCCESS); + AssertIntNE(X509_verify_cert(storeCtx), SSL_SUCCESS); + AssertIntEQ(X509_STORE_CTX_get_error(storeCtx), CRL_CERT_REVOKED); + X509_free(x509); + X509_STORE_CTX_free(storeCtx); X509_CRL_free(crl); - X509_STORE_free(store); #endif /* HAVE_CRL */ From 823b3d90d8344289992d02803e1af6ac35b5ae0c Mon Sep 17 00:00:00 2001 From: David Garske Date: Thu, 18 Jun 2020 12:12:28 -0700 Subject: [PATCH 259/298] Add braces around new debug message to avoid compiler warning. --- wolfcrypt/src/asn.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/wolfcrypt/src/asn.c b/wolfcrypt/src/asn.c index 1156d570b..bda0c1fcd 100644 --- a/wolfcrypt/src/asn.c +++ b/wolfcrypt/src/asn.c @@ -9354,8 +9354,9 @@ int ParseCertRelative(DecodedCert* cert, int type, int verify, void* cm) cert->ca = GetCA(cm, cert->issuerHash); #endif /* !NO_SKID */ - if (cert->ca) + if (cert->ca) { WOLFSSL_MSG("CA found"); + } } if (cert->selfSigned) { From 352328348ac5a7326bcfca336084fe94bdad99ef Mon Sep 17 00:00:00 2001 From: David Garske Date: Thu, 18 Jun 2020 12:54:47 -0700 Subject: [PATCH 260/298] For example client "-H verifyFail", which was not setting the verify callback. --- examples/client/client.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/client/client.c b/examples/client/client.c index c78037d83..ab471f060 100644 --- a/examples/client/client.c +++ b/examples/client/client.c @@ -2484,7 +2484,7 @@ THREAD_RETURN WOLFSSL_THREAD client_test(void* args) } #endif /* WOLFSSL_TRUST_PEER_CERT && !NO_FILESYSTEM */ } - if (useVerifyCb || myVerifyAction == VERIFY_OVERRIDE_ERROR || + if (useVerifyCb || myVerifyAction == VERIFY_FORCE_FAIL || myVerifyAction == VERIFY_USE_PREVERFIY) { wolfSSL_CTX_set_verify(ctx, WOLFSSL_VERIFY_PEER, myVerify); } From a5664b5ba97abb7815744ebd20219b87ff6f61aa Mon Sep 17 00:00:00 2001 From: Eric Blankenhorn Date: Thu, 18 Jun 2020 15:40:22 -0500 Subject: [PATCH 261/298] Remove multiple defines of GEN_IPADD --- wolfssl/openssl/ssl.h | 9 --------- 1 file changed, 9 deletions(-) diff --git a/wolfssl/openssl/ssl.h b/wolfssl/openssl/ssl.h index 46f9be1b3..1e97d4550 100644 --- a/wolfssl/openssl/ssl.h +++ b/wolfssl/openssl/ssl.h @@ -890,14 +890,6 @@ wolfSSL_X509_STORE_set_verify_cb((WOLFSSL_X509_STORE *)(s), (WOLFSSL_X509_STORE_ #define sk_X509_NAME_find wolfSSL_sk_X509_NAME_find -enum { - GEN_DNS = 0x02, /* ASN_DNS_TYPE */ - GEN_EMAIL = 0x01, /* ASN_RFC822_TYPE */ - GEN_URI = 0x06, /* ASN_URI_TYPE */ - GEN_IPADD = 0x07, - GEN_RID = 0x08, /* Registered ID, not supported */ -}; - #define PEM_read_bio_DHparams wolfSSL_PEM_read_bio_DHparams #define PEM_read_bio_DSAparams wolfSSL_PEM_read_bio_DSAparams @@ -922,7 +914,6 @@ enum { #include #define SSL_CTRL_CHAIN 88 -#define GEN_IPADD 7 #define ERR_LIB_SSL 20 #define SSL_R_SHORT_READ 10 #define ERR_R_PEM_LIB 9 From 6b1a6309ce068a2db2cbd8e34402508cab137751 Mon Sep 17 00:00:00 2001 From: David Garske Date: Thu, 18 Jun 2020 13:38:39 -0700 Subject: [PATCH 262/298] Fixes for CryptoCell. Fix for signature wrapper signing to allow larger signing input buffer. Cleanup of some duplicate code. Fix for bad cryptocell ECC make key result check (-9628). Fixes #3059. Thanks Sylwester. --- wolfcrypt/src/signature.c | 81 +++++++++++---------------------------- wolfcrypt/test/test.c | 2 +- 2 files changed, 23 insertions(+), 60 deletions(-) diff --git a/wolfcrypt/src/signature.c b/wolfcrypt/src/signature.c index d731b5daf..b5c0a533d 100644 --- a/wolfcrypt/src/signature.c +++ b/wolfcrypt/src/signature.c @@ -176,23 +176,16 @@ int wc_SignatureVerifyHash( case WC_SIGNATURE_TYPE_RSA: { #ifndef NO_RSA -#if defined(WOLFSSL_CRYPTOCELL) - /* the signature must propagate to the cryptocell to get verfied */ + #ifdef WOLFSSL_CRYPTOCELL if (sig_type == WC_SIGNATURE_TYPE_RSA_W_ENC) { - ret = cc310_RsaSSL_Verify(hash_data, hash_len,(byte*)sig, key, - CRYS_RSA_HASH_SHA256_mode); + ret = cc310_RsaSSL_Verify(hash_data, hash_len, (byte*)sig, key, + cc310_hashModeRSA(hash_type, 0)); } else { - ret = cc310_RsaSSL_Verify(hash_data, hash_len,(byte*)sig, key, - CRYS_RSA_After_SHA256_mode); + ret = cc310_RsaSSL_Verify(hash_data, hash_len, (byte*)sig, key, + cc310_hashModeRSA(hash_type, 1)); } - - if (ret != 0) { - WOLFSSL_MSG("RSA Signature Verify difference!"); - ret = SIG_VERIFY_E; - } - -#else /* WOLFSSL_CRYPTOCELL */ + #else word32 plain_len = hash_len; #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) @@ -200,7 +193,6 @@ int wc_SignatureVerifyHash( #else byte plain_data[MAX_ENCODED_SIG_SZ]; #endif - /* Make sure the plain text output is at least key size */ if (plain_len < sig_len) { @@ -231,7 +223,6 @@ int wc_SignatureVerifyHash( ret = 0; /* Success */ } else { - WOLFSSL_MSG("RSA Signature Verify difference!"); ret = SIG_VERIFY_E; } } @@ -242,7 +233,11 @@ int wc_SignatureVerifyHash( else { ret = MEMORY_E; } -#endif /* !WOLFSSL_CRYPTOCELL */ + #endif /* WOLFSSL_CRYPTOCELL */ + if (ret != 0) { + WOLFSSL_MSG("RSA Signature Verify difference!"); + ret = SIG_VERIFY_E; + } #else ret = SIG_TYPE_E; #endif @@ -322,23 +317,9 @@ int wc_SignatureVerify( } if (ret == 0) { -#if defined(WOLFSSL_CRYPTOCELL) - if ((sig_type == WC_SIGNATURE_TYPE_RSA) - || (sig_type == WC_SIGNATURE_TYPE_RSA_W_ENC)) { - if (sig_type == WC_SIGNATURE_TYPE_RSA_W_ENC) { - ret = cc310_RsaSSL_Verify(hash_data, hash_len, sig, key, - cc310_hashModeRSA(hash_type, 0)); - } - else { - ret = cc310_RsaSSL_Verify(hash_data, hash_len, sig, key, - cc310_hashModeRSA(hash_type, 1)); - } - } -#else /* Verify signature using hash */ ret = wc_SignatureVerifyHash(hash_type, sig_type, hash_data, hash_enc_len, sig, sig_len, key, key_len); -#endif /* WOLFSSL_CRYPTOCELL */ } } @@ -414,15 +395,17 @@ int wc_SignatureGenerateHash_ex( case WC_SIGNATURE_TYPE_RSA_W_ENC: case WC_SIGNATURE_TYPE_RSA: #if !defined(NO_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY) - #if defined(WOLFSSL_CRYPTOCELL) - if (sig_type == WC_SIGNATURE_TYPE_RSA_W_ENC) { - ret = cc310_RsaSSL_Sign(hash_data, hash_len, sig, *sig_len, key, - cc310_hashModeRSA(hash_type, 0)); + #ifdef WOLFSSL_CRYPTOCELL + /* use expected signature size (incoming sig_len could be larger buffer */ + *sig_len = wc_SignatureGetSize(sig_type, key, key_len); + if (sig_type == WC_SIGNATURE_TYPE_RSA_W_ENC) { + ret = cc310_RsaSSL_Sign(hash_data, hash_len, sig, *sig_len, key, + cc310_hashModeRSA(hash_type, 0)); } - else { - ret = cc310_RsaSSL_Sign(hash_data, hash_len, sig, *sig_len, key, - cc310_hashModeRSA(hash_type, 1)); - } + else { + ret = cc310_RsaSSL_Sign(hash_data, hash_len, sig, *sig_len, key, + cc310_hashModeRSA(hash_type, 1)); + } #else /* Create signature using provided RSA key */ do { @@ -434,7 +417,7 @@ int wc_SignatureGenerateHash_ex( ret = wc_RsaSSL_Sign(hash_data, hash_len, sig, *sig_len, (RsaKey*)key, rng); } while (ret == WC_PENDING_E); - #endif /* WOLFSSL_CRYPTOCELL */ + #endif /* WOLFSSL_CRYPTOCELL */ if (ret >= 0) { *sig_len = ret; ret = 0; /* Success */ @@ -532,25 +515,6 @@ int wc_SignatureGenerate_ex( #endif } if (ret == 0) { -#if defined(WOLFSSL_CRYPTOCELL) - if ((sig_type == WC_SIGNATURE_TYPE_RSA) - || (sig_type == WC_SIGNATURE_TYPE_RSA_W_ENC)) { - if (sig_type == WC_SIGNATURE_TYPE_RSA_W_ENC) { - ret = cc310_RsaSSL_Sign(hash_data, hash_len, sig, *sig_len, - key, cc310_hashModeRSA(hash_type, 0)); - } - else { - ret = cc310_RsaSSL_Sign(hash_data, hash_len, sig, *sig_len, - key, cc310_hashModeRSA(hash_type, 1)); - } - - if (ret == *sig_len) { - ret = 0; - } - } - } - } -#else /* Generate signature using hash */ ret = wc_SignatureGenerateHash(hash_type, sig_type, hash_data, hash_enc_len, sig, sig_len, key, key_len, rng); @@ -561,7 +525,6 @@ int wc_SignatureGenerate_ex( ret = wc_SignatureVerifyHash(hash_type, sig_type, hash_data, hash_enc_len, sig, *sig_len, key, key_len); } -#endif /* WOLFSSL_CRYPTOCELL */ #if defined(WOLFSSL_SMALL_STACK) || defined(NO_ASN) XFREE(hash_data, NULL, DYNAMIC_TYPE_TMP_BUFFER); diff --git a/wolfcrypt/test/test.c b/wolfcrypt/test/test.c index f567f2b8c..8fdea3067 100644 --- a/wolfcrypt/test/test.c +++ b/wolfcrypt/test/test.c @@ -18353,7 +18353,7 @@ static int ecc_test_make_pub(WC_RNG* rng) #if defined(WOLFSSL_CRYPTOCELL) /* create a new key since building private key from public key is unsupported */ ret = wc_ecc_make_key(rng, ECC_KEYGEN_SIZE, &key); - if (ret == 0) { + if (ret != 0) { ERROR_OUT(-9628, done); } #endif From 771d60c085a877b170bb549081de8b186b3e288a Mon Sep 17 00:00:00 2001 From: TakayukiMatsuo Date: Fri, 19 Jun 2020 13:40:16 +0900 Subject: [PATCH 263/298] Replaced some hard-tabs with spaces in wc_curve25519_export_key_raw_ex() --- tests/api.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/api.c b/tests/api.c index 6b3e4086a..f151e6bc1 100644 --- a/tests/api.c +++ b/tests/api.c @@ -15436,7 +15436,7 @@ static int test_wc_curve25519_export_key_raw_ex (void) pubkSz = CURVE25519_KEYSIZE; if(BAD_FUNC_ARG != wc_curve25519_export_key_raw_ex( NULL , privateKey, - &prvkSz, publicKey, &pubkSz, EC25519_LITTLE_ENDIAN)){ + &prvkSz, publicKey, &pubkSz, EC25519_LITTLE_ENDIAN)){ printf(testingFmt,"failed at bad-arg-case-1."); fflush( stdout ); @@ -15463,7 +15463,7 @@ static int test_wc_curve25519_export_key_raw_ex (void) pubkSz = CURVE25519_KEYSIZE; if(BAD_FUNC_ARG != wc_curve25519_export_key_raw_ex( &key,privateKey, - NULL,publicKey, &pubkSz,EC25519_LITTLE_ENDIAN)){ + NULL,publicKey, &pubkSz,EC25519_LITTLE_ENDIAN)){ printf(testingFmt,"failed at bad-arg-case-3."); fflush( stdout ); @@ -15528,7 +15528,7 @@ static int test_wc_curve25519_export_key_raw_ex (void) pubkSz = CURVE25519_KEYSIZE; if(BAD_FUNC_ARG != wc_curve25519_export_key_raw_ex( &key, privateKey, - NULL, publicKey, &pubkSz, EC25519_BIG_ENDIAN)){ + NULL, publicKey, &pubkSz, EC25519_BIG_ENDIAN)){ printf(testingFmt,"failed at bad-arg-case-8."); fflush( stdout ); From b88342eeaf70488ddd352207f744468a56838c7f Mon Sep 17 00:00:00 2001 From: JacobBarthelmeh Date: Fri, 19 Jun 2020 10:08:42 -0700 Subject: [PATCH 264/298] memory handling fixes --- src/crl.c | 31 +++++++++++++++++++++++++++---- src/ssl.c | 23 +++++++++++------------ tests/api.c | 42 ++++++++++++++++++------------------------ 3 files changed, 56 insertions(+), 40 deletions(-) diff --git a/src/crl.c b/src/crl.c index 628acda78..9053c79a0 100644 --- a/src/crl.c +++ b/src/crl.c @@ -526,6 +526,7 @@ static RevokedCert *DupRevokedCertList(RevokedCert* in, void* heap) prev->next = tmp; if (head == NULL) head = tmp; + prev = tmp; } else { WOLFSSL_MSG("Failed to allocate new RevokedCert structure"); @@ -619,6 +620,17 @@ static CRL_Entry* DupCRL_list(CRL_Entry* crl, void* heap) head = tmp; if (prev != NULL) prev->next = tmp; + prev = tmp; + } + else { + WOLFSSL_MSG("Failed to allocate new CRL_Entry structure"); + /* free up any existing list */ + while (head != NULL) { + current = head; + head = head->next; + FreeCRL_Entry(current, heap); + } + return NULL; } current = current->next; } @@ -635,10 +647,6 @@ static int DupX509_CRL(WOLFSSL_X509_CRL *dup, const WOLFSSL_X509_CRL* crl) return BAD_FUNC_ARG; } - dup->crlList = DupCRL_list(crl->crlList, dup->heap); -#ifdef HAVE_CRL_IO - dup->crlIOCb = crl->crlIOCb; -#endif if (crl->monitors[0].path) { int pathSz = (int)XSTRLEN(crl->monitors[0].path) + 1; dup->monitors[0].path = (char*)XMALLOC(pathSz, dup->heap, @@ -646,6 +654,9 @@ static int DupX509_CRL(WOLFSSL_X509_CRL *dup, const WOLFSSL_X509_CRL* crl) if (dup->monitors[0].path != NULL) { XSTRNCPY(dup->monitors[0].path, crl->monitors[0].path, pathSz); } + else { + return MEMORY_E; + } } if (crl->monitors[1].path) { @@ -655,8 +666,20 @@ static int DupX509_CRL(WOLFSSL_X509_CRL *dup, const WOLFSSL_X509_CRL* crl) if (dup->monitors[1].path != NULL) { XSTRNCPY(dup->monitors[1].path, crl->monitors[1].path, pathSz); } + else { + if (dup->monitors[0].path != NULL) { + XFREE(dup->monitors[0].path, dup->heap, + DYNAMIC_TYPE_CRL_MONITOR); + } + return MEMORY_E; + } } + dup->crlList = DupCRL_list(crl->crlList, dup->heap); +#ifdef HAVE_CRL_IO + dup->crlIOCb = crl->crlIOCb; +#endif + return 0; } diff --git a/src/ssl.c b/src/ssl.c index ae2da8636..d165a398c 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -22764,11 +22764,15 @@ err_exit: void wolfSSL_X509_STORE_free(WOLFSSL_X509_STORE* store) { if (store != NULL && store->isDynamic) { - if (store->cm != NULL) + if (store->cm != NULL) { wolfSSL_CertManagerFree(store->cm); + store->cm = NULL; + } #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) - if (store->param != NULL) + if (store->param != NULL) { XFREE(store->param, NULL, DYNAMIC_TYPE_OPENSSL); + store->param = NULL; + } #endif XFREE(store, NULL, DYNAMIC_TYPE_X509_STORE); } @@ -22893,23 +22897,18 @@ int wolfSSL_X509_STORE_CTX_init(WOLFSSL_X509_STORE_CTX* ctx, } +/* free's own cert chain holding and extra data */ void wolfSSL_X509_STORE_CTX_free(WOLFSSL_X509_STORE_CTX* ctx) { WOLFSSL_ENTER("X509_STORE_CTX_free"); if (ctx != NULL) { - #if !defined(OPENSSL_ALL) && !defined(WOLFSSL_QT) - if (ctx->store != NULL) - wolfSSL_X509_STORE_free(ctx->store); - #ifndef WOLFSSL_KEEP_STORE_CERTS - if (ctx->current_cert != NULL) - wolfSSL_FreeX509(ctx->current_cert); - #endif - #endif /* !OPENSSL_ALL && !WOLFSSL_QT */ -#ifdef OPENSSL_EXTRA + #ifdef OPENSSL_EXTRA + wolfSSL_sk_free(ctx->chain); if (ctx->param != NULL){ XFREE(ctx->param,NULL,DYNAMIC_TYPE_OPENSSL); + ctx->param = NULL; } -#endif + #endif XFREE(ctx, NULL, DYNAMIC_TYPE_X509_CTX); } } diff --git a/tests/api.c b/tests/api.c index 7a24b1662..40850d289 100644 --- a/tests/api.c +++ b/tests/api.c @@ -22085,10 +22085,8 @@ static void test_wolfSSL_X509_STORE_CTX_get0_current_issuer(void) X509_free(issuer); X509_STORE_CTX_free(ctx); - #if defined(WOLFSSL_KEEP_STORE_CERTS) || defined(OPENSSL_ALL) || defined(WOLFSSL_QT) - X509_free(x509Svr); - X509_STORE_free(str); - #endif + X509_free(x509Svr); + X509_STORE_free(str); X509_free(x509Ca); printf(resultFmt, passed); @@ -22130,10 +22128,8 @@ static void test_wolfSSL_X509_STORE_CTX(void) #ifdef OPENSSL_ALL sk_X509_free(sk); #endif - #if defined(WOLFSSL_KEEP_STORE_CERTS) || defined(OPENSSL_ALL) || defined(WOLFSSL_QT) X509_STORE_free(str); X509_free(x509); - #endif AssertNotNull(ctx = X509_STORE_CTX_new()); X509_STORE_CTX_set_verify_cb(ctx, verify_cb); @@ -22158,11 +22154,9 @@ static void test_wolfSSL_X509_STORE_CTX(void) AssertIntEQ(sk_num(sk3), 1); /* sanity, make sure chain has 1 cert */ X509_STORE_CTX_free(ctx); sk_X509_free(sk); - #if defined(WOLFSSL_KEEP_STORE_CERTS) || defined(WOLFSSL_QT) X509_STORE_free(str); /* CTX certs not freed yet */ X509_free(x5092); - #endif /* sk2 freed as part of X509_STORE_CTX_free(), sk3 is dup so free here */ sk_X509_free(sk3); #endif @@ -22354,9 +22348,7 @@ static void test_wolfSSL_X509_STORE_CTX_get0_store(void) wolfSSL_X509_STORE_CTX_free(ctx); wolfSSL_X509_STORE_CTX_free(ctx_no_init); -#if defined(OPENSSL_ALL) || defined(WOLFSSL_QT) X509_STORE_free(store); -#endif printf(resultFmt, passed); #endif /* OPENSSL_EXTRA */ @@ -22563,7 +22555,7 @@ static void test_wolfSSL_X509_STORE(void) #ifdef HAVE_CRL X509_STORE_CTX *storeCtx; X509_CRL *crl; - X509 *x509; + X509 *ca, *cert; const char crlPem[] = "./certs/crl/crl.revoked"; const char srvCert[] = "./certs/server-revoked-cert.pem"; const char caCert[] = "./certs/ca-cert.pem"; @@ -22571,22 +22563,24 @@ static void test_wolfSSL_X509_STORE(void) printf(testingFmt, "test_wolfSSL_X509_STORE"); AssertNotNull(store = (X509_STORE *)X509_STORE_new()); - AssertNotNull((x509 = wolfSSL_X509_load_certificate_file(caCert, + AssertNotNull((ca = wolfSSL_X509_load_certificate_file(caCert, SSL_FILETYPE_PEM))); - AssertIntEQ(X509_STORE_add_cert(store, x509), SSL_SUCCESS); - AssertNotNull((x509 = wolfSSL_X509_load_certificate_file(srvCert, + AssertIntEQ(X509_STORE_add_cert(store, ca), SSL_SUCCESS); + AssertNotNull((cert = wolfSSL_X509_load_certificate_file(srvCert, SSL_FILETYPE_PEM))); AssertNotNull((storeCtx = X509_STORE_CTX_new())); - AssertIntEQ(X509_STORE_CTX_init(storeCtx, store, x509, NULL), SSL_SUCCESS); + AssertIntEQ(X509_STORE_CTX_init(storeCtx, store, cert, NULL), SSL_SUCCESS); AssertIntEQ(X509_verify_cert(storeCtx), SSL_SUCCESS); + X509_STORE_free(store); X509_STORE_CTX_free(storeCtx); - X509_free(x509); + X509_free(cert); + X509_free(ca); /* should fail to verify now after adding in CRL */ AssertNotNull(store = (X509_STORE *)X509_STORE_new()); - AssertNotNull((x509 = wolfSSL_X509_load_certificate_file(caCert, + AssertNotNull((ca = wolfSSL_X509_load_certificate_file(caCert, SSL_FILETYPE_PEM))); - AssertIntEQ(X509_STORE_add_cert(store, x509), SSL_SUCCESS); + AssertIntEQ(X509_STORE_add_cert(store, ca), SSL_SUCCESS); fp = XFOPEN(crlPem, "rb"); AssertTrue((fp != XBADFILE)); AssertNotNull(crl = (X509_CRL *)PEM_read_X509_CRL(fp, (X509_CRL **)NULL, @@ -22595,14 +22589,16 @@ static void test_wolfSSL_X509_STORE(void) AssertIntEQ(X509_STORE_add_crl(store, crl), SSL_SUCCESS); AssertIntEQ(X509_STORE_set_flags(store, X509_V_FLAG_CRL_CHECK),SSL_SUCCESS); AssertNotNull((storeCtx = X509_STORE_CTX_new())); - AssertNotNull((x509 = wolfSSL_X509_load_certificate_file(srvCert, + AssertNotNull((cert = wolfSSL_X509_load_certificate_file(srvCert, SSL_FILETYPE_PEM))); - AssertIntEQ(X509_STORE_CTX_init(storeCtx, store, x509, NULL), SSL_SUCCESS); + AssertIntEQ(X509_STORE_CTX_init(storeCtx, store, cert, NULL), SSL_SUCCESS); AssertIntNE(X509_verify_cert(storeCtx), SSL_SUCCESS); AssertIntEQ(X509_STORE_CTX_get_error(storeCtx), CRL_CERT_REVOKED); - X509_free(x509); - X509_STORE_CTX_free(storeCtx); X509_CRL_free(crl); + X509_STORE_free(store); + X509_STORE_CTX_free(storeCtx); + X509_free(cert); + X509_free(ca); #endif /* HAVE_CRL */ @@ -23797,10 +23793,8 @@ static void test_wolfSSL_X509(void) X509_STORE_CTX_free(ctx); - #if defined(WOLFSSL_KEEP_STORE_CERTS) || defined(WOLFSSL_QT) X509_STORE_free(store); X509_free(x509); - #endif BIO_free(bio); /** d2i_X509_fp test **/ From 6ecb88da471ce3fa55a997664252d6b6fc048d8b Mon Sep 17 00:00:00 2001 From: David Garske Date: Mon, 22 Jun 2020 07:37:04 -0700 Subject: [PATCH 265/298] Fixes for dox SNI documentation / examples. --- doc/dox_comments/header_files/ssl.h | 30 ++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/doc/dox_comments/header_files/ssl.h b/doc/dox_comments/header_files/ssl.h index 114f3c5bc..5faacd4d6 100644 --- a/doc/dox_comments/header_files/ssl.h +++ b/doc/dox_comments/header_files/ssl.h @@ -9973,7 +9973,7 @@ WOLFSSL_API void wolfSSL_FreeArrays(WOLFSSL*); ClientHello + SNI with either ServerHello + blank SNI or alert fatal in case of SNI mismatch. - \return SSL_SUCCESS upon success. + \return WOLFSSL_SUCCESS upon success. \return BAD_FUNC_ARG is the error that will be returned in one of these cases: ssl is NULL, data is NULL, type is a unknown value. (see below) \return MEMORY_E is the error returned when there is not enough memory. @@ -9998,8 +9998,8 @@ WOLFSSL_API void wolfSSL_FreeArrays(WOLFSSL*); // ssl creation failed } ret = wolfSSL_UseSNI(ssl, WOLFSSL_SNI_HOST_NAME, "www.yassl.com", - strlen("www.yassl.com")); - if (ret != 0) { + strlen("www.yassl.com")); + if (ret != WOLFSSL_SUCCESS) { // sni usage failed } \endcode @@ -10017,7 +10017,7 @@ WOLFSSL_API int wolfSSL_UseSNI(WOLFSSL* ssl, unsigned char type, clients and wolfSSL servers will respond ClientHello + SNI with either ServerHello + blank SNI or alert fatal in case of SNI mismatch. - \return SSL_SUCCESS upon success. + \return WOLFSSL_SUCCESS upon success. \return BAD_FUNC_ARG is the error that will be returned in one of these cases: ctx is NULL, data is NULL, type is a unknown value. (see below) \return MEMORY_E is the error returned when there is not enough memory. @@ -10037,8 +10037,8 @@ WOLFSSL_API int wolfSSL_UseSNI(WOLFSSL* ssl, unsigned char type, // context creation failed } ret = wolfSSL_CTX_UseSNI(ctx, WOLFSSL_SNI_HOST_NAME, "www.yassl.com", - strlen("www.yassl.com")); - if (ret != 0) { + strlen("www.yassl.com")); + if (ret != WOLFSSL_SUCCESS) { // sni usage failed } \endcode @@ -10084,11 +10084,11 @@ WOLFSSL_API int wolfSSL_CTX_UseSNI(WOLFSSL_CTX* ctx, unsigned char type, // ssl creation failed } ret = wolfSSL_UseSNI(ssl, 0, "www.yassl.com", strlen("www.yassl.com")); - if (ret != 0) { + if (ret != WOLFSSL_SUCCESS) { // sni usage failed } wolfSSL_SNI_SetOptions(ssl, WOLFSSL_SNI_HOST_NAME, - WOLFSSL_SNI_CONTINUE_ON_MISMATCH); + WOLFSSL_SNI_CONTINUE_ON_MISMATCH); \endcode \sa wolfSSL_new @@ -10129,7 +10129,7 @@ WOLFSSL_API void wolfSSL_SNI_SetOptions(WOLFSSL* ssl, unsigned char type, // context creation failed } ret = wolfSSL_CTX_UseSNI(ctx, 0, "www.yassl.com", strlen("www.yassl.com")); - if (ret != 0) { + if (ret != WOLFSSL_SUCCESS) { // sni usage failed } wolfSSL_CTX_SNI_SetOptions(ctx, WOLFSSL_SNI_HOST_NAME, @@ -10149,7 +10149,7 @@ WOLFSSL_API void wolfSSL_CTX_SNI_SetOptions(WOLFSSL_CTX* ctx, by the client to start a session. It does not requires context or session setup to retrieve the SNI. - \return SSL_SUCCESS upon success. + \return WOLFSSL_SUCCESS upon success. \return BAD_FUNC_ARG is the error that will be returned in one of this cases: buffer is NULL, bufferSz <= 0, sni is NULL, inOutSz is NULL or <= 0 \return BUFFER_ERROR is the error returned when there is a malformed @@ -10172,7 +10172,7 @@ WOLFSSL_API void wolfSSL_CTX_SNI_SetOptions(WOLFSSL_CTX* ctx, int length = 32; // read Client Hello to buffer... ret = wolfSSL_SNI_GetFromBuffer(buffer, sizeof(buffer), 0, result, &length)); - if (ret != SSL_SUCCESS) { + if (ret != WOLFSSL_SUCCESS) { // sni retrieve failed } \endcode @@ -10241,7 +10241,7 @@ WOLFSSL_API unsigned char wolfSSL_SNI_Status(WOLFSSL* ssl, unsigned char type); // ssl creation failed } ret = wolfSSL_UseSNI(ssl, 0, "www.yassl.com", strlen("www.yassl.com")); - if (ret != 0) { + if (ret != WOLFSSL_SUCCESS) { // sni usage failed } if (wolfSSL_accept(ssl) == SSL_SUCCESS) { @@ -10261,7 +10261,7 @@ WOLFSSL_API unsigned short wolfSSL_SNI_GetRequest(WOLFSSL *ssl, \brief Setup ALPN use for a wolfSSL session. - \return SSL_SUCCESS: upon success. + \return WOLFSSL_SUCCESS: upon success. \return BAD_FUNC_ARG Returned if ssl or protocol_name_list is null or protocol_name_listSz is too large or options contain something not supported. @@ -10286,8 +10286,8 @@ WOLFSSL_API unsigned short wolfSSL_SNI_GetRequest(WOLFSSL *ssl, char alpn_list[] = {}; - if(wolfSSL_UseALPN(ssl, alpn_list, sizeof(alpn_list), - WOLFSSL_APN_FAILED_ON_MISMATCH) != SSL_SUCCESS) + if (wolfSSL_UseALPN(ssl, alpn_list, sizeof(alpn_list), + WOLFSSL_APN_FAILED_ON_MISMATCH) != WOLFSSL_SUCCESS) { // Error setting session ticket } From a29250e87d5a0c6114ae7e6a7a34c640d293b37b Mon Sep 17 00:00:00 2001 From: David Garske Date: Mon, 22 Jun 2020 07:56:54 -0700 Subject: [PATCH 266/298] Revert SP changes in https://github.com/wolfSSL/wolfssl/pull/2970 that broke `--enable-sp CFLAGS="-DWOLFSSL_SP_CACHE_RESISTANT"`. This was generated with latest scripts. --- wolfcrypt/src/sp_c32.c | 24 ++++++++++++------------ wolfcrypt/src/sp_c64.c | 24 ++++++++++++------------ 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/wolfcrypt/src/sp_c32.c b/wolfcrypt/src/sp_c32.c index a607adf15..44fbc7774 100644 --- a/wolfcrypt/src/sp_c32.c +++ b/wolfcrypt/src/sp_c32.c @@ -1990,7 +1990,7 @@ static int sp_2048_mod_exp_45(sp_digit* r, const sp_digit* a, const sp_digit* e, #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; #else - sp_digit td[90]; + sp_digit td[3 * 90]; #endif sp_digit* t[3]; sp_digit* norm; @@ -2014,7 +2014,7 @@ static int sp_2048_mod_exp_45(sp_digit* r, const sp_digit* a, const sp_digit* e, #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) t[i] = td + (i * 45 * 2); #else - t[i] = &td[i * 45 * 2)]; + t[i] = &td[i * 45 * 2]; #endif } @@ -2943,7 +2943,7 @@ static int sp_2048_mod_exp_90(sp_digit* r, const sp_digit* a, const sp_digit* e, #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; #else - sp_digit td[180]; + sp_digit td[3 * 180]; #endif sp_digit* t[3]; sp_digit* norm; @@ -2967,7 +2967,7 @@ static int sp_2048_mod_exp_90(sp_digit* r, const sp_digit* a, const sp_digit* e, #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) t[i] = td + (i * 90 * 2); #else - t[i] = &td[i * 90 * 2)]; + t[i] = &td[i * 90 * 2]; #endif } @@ -5831,7 +5831,7 @@ static int sp_3072_mod_exp_67(sp_digit* r, const sp_digit* a, const sp_digit* e, #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; #else - sp_digit td[134]; + sp_digit td[3 * 134]; #endif sp_digit* t[3]; sp_digit* norm; @@ -5855,7 +5855,7 @@ static int sp_3072_mod_exp_67(sp_digit* r, const sp_digit* a, const sp_digit* e, #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) t[i] = td + (i * 67 * 2); #else - t[i] = &td[i * 67 * 2)]; + t[i] = &td[i * 67 * 2]; #endif } @@ -6820,7 +6820,7 @@ static int sp_3072_mod_exp_134(sp_digit* r, const sp_digit* a, const sp_digit* e #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; #else - sp_digit td[268]; + sp_digit td[3 * 268]; #endif sp_digit* t[3]; sp_digit* norm; @@ -6844,7 +6844,7 @@ static int sp_3072_mod_exp_134(sp_digit* r, const sp_digit* a, const sp_digit* e #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) t[i] = td + (i * 134 * 2); #else - t[i] = &td[i * 134 * 2)]; + t[i] = &td[i * 134 * 2]; #endif } @@ -9895,7 +9895,7 @@ static int sp_4096_mod_exp_98(sp_digit* r, const sp_digit* a, const sp_digit* e, #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; #else - sp_digit td[196]; + sp_digit td[3 * 196]; #endif sp_digit* t[3]; sp_digit* norm; @@ -9919,7 +9919,7 @@ static int sp_4096_mod_exp_98(sp_digit* r, const sp_digit* a, const sp_digit* e, #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) t[i] = td + (i * 98 * 2); #else - t[i] = &td[i * 98 * 2)]; + t[i] = &td[i * 98 * 2]; #endif } @@ -10861,7 +10861,7 @@ static int sp_4096_mod_exp_196(sp_digit* r, const sp_digit* a, const sp_digit* e #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; #else - sp_digit td[392]; + sp_digit td[3 * 392]; #endif sp_digit* t[3]; sp_digit* norm; @@ -10885,7 +10885,7 @@ static int sp_4096_mod_exp_196(sp_digit* r, const sp_digit* a, const sp_digit* e #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) t[i] = td + (i * 196 * 2); #else - t[i] = &td[i * 196 * 2)]; + t[i] = &td[i * 196 * 2]; #endif } diff --git a/wolfcrypt/src/sp_c64.c b/wolfcrypt/src/sp_c64.c index f956f86ed..86f8dc334 100644 --- a/wolfcrypt/src/sp_c64.c +++ b/wolfcrypt/src/sp_c64.c @@ -1638,7 +1638,7 @@ static int sp_2048_mod_exp_18(sp_digit* r, const sp_digit* a, const sp_digit* e, #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; #else - sp_digit td[36]; + sp_digit td[3 * 36]; #endif sp_digit* t[3]; sp_digit* norm; @@ -1662,7 +1662,7 @@ static int sp_2048_mod_exp_18(sp_digit* r, const sp_digit* a, const sp_digit* e, #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) t[i] = td + (i * 18 * 2); #else - t[i] = &td[i * 18 * 2)]; + t[i] = &td[i * 18 * 2]; #endif } @@ -2583,7 +2583,7 @@ static int sp_2048_mod_exp_36(sp_digit* r, const sp_digit* a, const sp_digit* e, #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; #else - sp_digit td[72]; + sp_digit td[3 * 72]; #endif sp_digit* t[3]; sp_digit* norm; @@ -2607,7 +2607,7 @@ static int sp_2048_mod_exp_36(sp_digit* r, const sp_digit* a, const sp_digit* e, #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) t[i] = td + (i * 36 * 2); #else - t[i] = &td[i * 36 * 2)]; + t[i] = &td[i * 36 * 2]; #endif } @@ -5819,7 +5819,7 @@ static int sp_3072_mod_exp_27(sp_digit* r, const sp_digit* a, const sp_digit* e, #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; #else - sp_digit td[54]; + sp_digit td[3 * 54]; #endif sp_digit* t[3]; sp_digit* norm; @@ -5843,7 +5843,7 @@ static int sp_3072_mod_exp_27(sp_digit* r, const sp_digit* a, const sp_digit* e, #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) t[i] = td + (i * 27 * 2); #else - t[i] = &td[i * 27 * 2)]; + t[i] = &td[i * 27 * 2]; #endif } @@ -6734,7 +6734,7 @@ static int sp_3072_mod_exp_54(sp_digit* r, const sp_digit* a, const sp_digit* e, #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; #else - sp_digit td[108]; + sp_digit td[3 * 108]; #endif sp_digit* t[3]; sp_digit* norm; @@ -6758,7 +6758,7 @@ static int sp_3072_mod_exp_54(sp_digit* r, const sp_digit* a, const sp_digit* e, #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) t[i] = td + (i * 54 * 2); #else - t[i] = &td[i * 54 * 2)]; + t[i] = &td[i * 54 * 2]; #endif } @@ -10116,7 +10116,7 @@ static int sp_4096_mod_exp_39(sp_digit* r, const sp_digit* a, const sp_digit* e, #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; #else - sp_digit td[78]; + sp_digit td[3 * 78]; #endif sp_digit* t[3]; sp_digit* norm; @@ -10140,7 +10140,7 @@ static int sp_4096_mod_exp_39(sp_digit* r, const sp_digit* a, const sp_digit* e, #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) t[i] = td + (i * 39 * 2); #else - t[i] = &td[i * 39 * 2)]; + t[i] = &td[i * 39 * 2]; #endif } @@ -11130,7 +11130,7 @@ static int sp_4096_mod_exp_78(sp_digit* r, const sp_digit* a, const sp_digit* e, #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) sp_digit* td; #else - sp_digit td[156]; + sp_digit td[3 * 156]; #endif sp_digit* t[3]; sp_digit* norm; @@ -11154,7 +11154,7 @@ static int sp_4096_mod_exp_78(sp_digit* r, const sp_digit* a, const sp_digit* e, #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC) t[i] = td + (i * 78 * 2); #else - t[i] = &td[i * 78 * 2)]; + t[i] = &td[i * 78 * 2]; #endif } From 646ecb54c23154c0be6a0bd4bc591d90412da75e Mon Sep 17 00:00:00 2001 From: kaleb-himes Date: Mon, 22 Jun 2020 12:04:16 -0600 Subject: [PATCH 267/298] Update v23 methods to reflect TLSv1.3 --- doc/dox_comments/header_files/ssl.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/dox_comments/header_files/ssl.h b/doc/dox_comments/header_files/ssl.h index 114f3c5bc..d184dc4f1 100644 --- a/doc/dox_comments/header_files/ssl.h +++ b/doc/dox_comments/header_files/ssl.h @@ -3773,7 +3773,7 @@ WOLFSSL_API WOLFSSL_SESSION* wolfSSL_get1_session(WOLFSSL* ssl); \brief The wolfSSLv23_client_method() function is used to indicate that the application is a client and will support the highest protocol - version supported by the server between SSL 3.0 - TLS 1.2. This function + version supported by the server between SSL 3.0 - TLS 1.3. This function allocates memory for and initializes a new WOLFSSL_METHOD structure to be used when creating the SSL/TLS context with wolfSSL_CTX_new(). Both wolfSSL clients and servers have robust version downgrade capability. @@ -3784,7 +3784,7 @@ WOLFSSL_API WOLFSSL_SESSION* wolfSSL_get1_session(WOLFSSL* ssl); To resolve this issue, a client that uses the wolfSSLv23_client_method() function will use the highest protocol version supported by the server and downgrade to SSLv3 if needed. In this case, the client will be able to - connect to a server running SSLv3 - TLSv1.2. + connect to a server running SSLv3 - TLSv1.3. \return pointer upon success a pointer to a WOLFSSL_METHOD. \return Failure If memory allocation fails when calling XMALLOC, @@ -5254,7 +5254,7 @@ WOLFSSL_API int wolfSSL_CTX_allow_anon_cipher(WOLFSSL_CTX*); \brief The wolfSSLv23_server_method() function is used to indicate that the application is a server and will support clients connecting - with protocol version from SSL 3.0 - TLS 1.2. This function allocates + with protocol version from SSL 3.0 - TLS 1.3. This function allocates memory for and initializes a new WOLFSSL_METHOD structure to be used when creating the SSL/TLS context with wolfSSL_CTX_new(). From 392e09c47409a2aca8bbb3862a7f4f6486a1668d Mon Sep 17 00:00:00 2001 From: Sean Parkinson Date: Tue, 23 Jun 2020 09:14:51 +1000 Subject: [PATCH 268/298] Cleanup after TLS 1.3 tests Make sure the server is dead after each test. Client may not connect to server if cipher suite not supported and return error as expected. --- scripts/tls13.test | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/scripts/tls13.test b/scripts/tls13.test index 1b2b6cee9..66942b9c2 100755 --- a/scripts/tls13.test +++ b/scripts/tls13.test @@ -106,9 +106,9 @@ RESULT=$? remove_ready_file if [ $RESULT -eq 0 ]; then echo -e "\n\nIssue with mismatched TLS v1.3 cipher suites" - do_cleanup exit 1 fi +do_cleanup echo "" cat ./wolfssl/options.h | grep -- 'NO_CERTS' @@ -124,9 +124,9 @@ if [ $? -ne 0 ]; then remove_ready_file if [ $RESULT -eq 0 ]; then echo -e "\n\nIssue with requiring mutual authentication" - do_cleanup exit 1 fi + do_cleanup echo "" fi @@ -143,9 +143,9 @@ if [ $? -ne 0 ]; then remove_ready_file if [ $RESULT -eq 0 ]; then echo -e "\n\nIssue with TLS v1.3 server downgrading to TLS v1.2" - do_cleanup exit 1 fi + do_cleanup echo "" # TLS 1.2 server / TLS 1.3 client. @@ -159,9 +159,9 @@ if [ $? -ne 0 ]; then remove_ready_file if [ $RESULT -eq 0 ]; then echo -e "\n\nIssue with TLS v1.3 client upgrading server to TLS v1.3" - do_cleanup exit 1 fi + do_cleanup echo "" echo "Find usable TLS 1.2 cipher suite" @@ -173,6 +173,7 @@ if [ $? -ne 0 ]; then TLS12_CS=$CS break fi + do_cleanup done if [ "$TLS12_CS" != "" ]; then # TLS 1.3 downgrade server and client - no common TLS 1.3 ciphers @@ -188,9 +189,9 @@ if [ $? -ne 0 ]; then remove_ready_file if [ $RESULT -eq 0 ]; then echo -e "\n\nTLS v1.3 downgrading to TLS v1.2 due to ciphers" - do_cleanup exit 1 fi + do_cleanup echo "" else echo "No usable TLS 1.2 cipher suite found" From 7c615967a90ed64529a5a64a654f8a5d82f0c9eb Mon Sep 17 00:00:00 2001 From: Sean Parkinson Date: Tue, 23 Jun 2020 10:45:31 +1000 Subject: [PATCH 269/298] Use temp with mont mul in constant time exptmod For cache attack resistance. --- wolfcrypt/src/tfm.c | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/wolfcrypt/src/tfm.c b/wolfcrypt/src/tfm.c index 04e639ff3..82569d3af 100644 --- a/wolfcrypt/src/tfm.c +++ b/wolfcrypt/src/tfm.c @@ -1636,6 +1636,7 @@ static int _fp_exptmod_ct(fp_int * G, fp_int * X, int digits, fp_int * P, y = (int)(buf >> (DIGIT_BIT - 1)) & 1; buf <<= (fp_digit)1; +#ifdef WC_NO_CACHE_RESISTANT /* do ops */ err = fp_mul(&R[0], &R[1], &R[y^1]); if (err != FP_OKAY) { @@ -1652,7 +1653,6 @@ static int _fp_exptmod_ct(fp_int * G, fp_int * X, int digits, fp_int * P, return err; } -#ifdef WC_NO_CACHE_RESISTANT err = fp_sqr(&R[y], &R[y]); if (err != FP_OKAY) { #ifdef WOLFSSL_SMALL_STACK @@ -1668,6 +1668,28 @@ static int _fp_exptmod_ct(fp_int * G, fp_int * X, int digits, fp_int * P, return err; } #else + /* do ops */ + err = fp_mul(&R[0], &R[1], &R[2]); + if (err != FP_OKAY) { + #ifdef WOLFSSL_SMALL_STACK + XFREE(R, NULL, DYNAMIC_TYPE_BIGINT); + #endif + return err; + } + err = fp_montgomery_reduce(&R[2], P, mp); + if (err != FP_OKAY) { + #ifdef WOLFSSL_SMALL_STACK + XFREE(R, NULL, DYNAMIC_TYPE_BIGINT); + #endif + return err; + } + /* instead of using R[y^1] for mul, which leaks key bit to cache monitor, + * use R[2] as temp, make sure address calc is constant, keep + * &R[0] and &R[1] in cache */ + fp_copy(&R[2], + (fp_int*) ( ((wolfssl_word)&R[0] & wc_off_on_addr[y]) + + ((wolfssl_word)&R[1] & wc_off_on_addr[y^1]) ) ); + /* instead of using R[y] for sqr, which leaks key bit to cache monitor, * use R[2] as temp, make sure address calc is constant, keep * &R[0] and &R[1] in cache */ From 1253be01423209481929fa6b6b2160de030904b8 Mon Sep 17 00:00:00 2001 From: Takashi Kojo Date: Tue, 23 Jun 2020 17:30:03 +0900 Subject: [PATCH 270/298] Remove user_setting.h and user-mutex.c example files --- user-mutex.c | 27 --------------------------- user_settings.h | 2 -- 2 files changed, 29 deletions(-) delete mode 100644 user-mutex.c delete mode 100644 user_settings.h diff --git a/user-mutex.c b/user-mutex.c deleted file mode 100644 index fca7da3cc..000000000 --- a/user-mutex.c +++ /dev/null @@ -1,27 +0,0 @@ -#include - - int wc_InitMutex(wolfSSL_Mutex* m) - { - (void)m; - return 0; - } - - int wc_FreeMutex(wolfSSL_Mutex *m) - { - (void)m; - return 0; - } - - - int wc_LockMutex(wolfSSL_Mutex *m) - { - (void)m; - return 0; - } - - - int wc_UnLockMutex(wolfSSL_Mutex *m) - { - (void)m; - return 0; - } \ No newline at end of file diff --git a/user_settings.h b/user_settings.h deleted file mode 100644 index 23554d6e4..000000000 --- a/user_settings.h +++ /dev/null @@ -1,2 +0,0 @@ - -typedef int wolfSSL_Mutex; From 7cc64377d0516985605559f018f2f5b107ae3c40 Mon Sep 17 00:00:00 2001 From: Eric Blankenhorn Date: Tue, 16 Jun 2020 14:48:03 -0500 Subject: [PATCH 271/298] Sanity check wc_ecc_import_raw x, y, and key --- tests/api.c | 12 +++++++++++- wolfcrypt/src/ecc.c | 14 ++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/tests/api.c b/tests/api.c index 42e740894..2e524cecf 100644 --- a/tests/api.c +++ b/tests/api.c @@ -16998,9 +16998,19 @@ static int test_wc_ecc_import_raw(void) #ifdef WOLFSSL_VALIDATE_ECC_IMPORT if (ret == BAD_FUNC_ARG) { ret = wc_ecc_import_raw(&key, kNullStr, kNullStr, kNullStr, curveName); + if (ret == ECC_INF_E) + ret = BAD_FUNC_ARG; /* This is expected by other tests */ } #endif - if (ret == BAD_FUNC_ARG || ret == ECC_INF_E) { + #if !defined(HAVE_SELFTEST) && !defined(HAVE_FIPS) + if (ret == BAD_FUNC_ARG) { + ret = wc_ecc_import_raw(&key, "0", qy, d, curveName); + } + if (ret == BAD_FUNC_ARG) { + ret = wc_ecc_import_raw(&key, qx, "0", d, curveName); + } + #endif + if (ret == BAD_FUNC_ARG) { ret = 0; } } diff --git a/wolfcrypt/src/ecc.c b/wolfcrypt/src/ecc.c index c7ea83fc5..f3f21c258 100644 --- a/wolfcrypt/src/ecc.c +++ b/wolfcrypt/src/ecc.c @@ -7802,6 +7802,7 @@ static int wc_ecc_import_raw_private(ecc_key* key, const char* qx, byte key_raw[ECC_MAX_CRYPTO_HW_SIZE*2 + 1]; word32 keySz = 0; #endif + /* if d is NULL, only import as public key using Qx,Qy */ if (key == NULL || qx == NULL || qy == NULL) { return BAD_FUNC_ARG; @@ -7839,6 +7840,11 @@ static int wc_ecc_import_raw_private(ecc_key* key, const char* qx, else err = mp_read_unsigned_bin(key->pubkey.x, (const byte*)qx, key->dp->size); + + if (mp_iszero(key->pubkey.x)) { + WOLFSSL_MSG("Invalid Qx"); + err = BAD_FUNC_ARG; + } } /* read Qy */ @@ -7849,6 +7855,10 @@ static int wc_ecc_import_raw_private(ecc_key* key, const char* qx, err = mp_read_unsigned_bin(key->pubkey.y, (const byte*)qy, key->dp->size); + if (mp_iszero(key->pubkey.y)) { + WOLFSSL_MSG("Invalid Qy"); + err = BAD_FUNC_ARG; + } } if (err == MP_OKAY) @@ -7937,6 +7947,10 @@ static int wc_ecc_import_raw_private(ecc_key* key, const char* qx, err = mp_read_unsigned_bin(&key->k, (const byte*)d, key->dp->size); #endif /* WOLFSSL_ATECC508A */ + if (mp_iszero(&key->k)) { + WOLFSSL_MSG("Invalid private key"); + return BAD_FUNC_ARG; + } } else { key->type = ECC_PUBLICKEY; } From ae90119af4cd766459d2d1b39c57f60b1c67d6ab Mon Sep 17 00:00:00 2001 From: Jacob Barthelmeh Date: Tue, 23 Jun 2020 14:45:31 -0600 Subject: [PATCH 272/298] remove double free in test case --- tests/api.c | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/api.c b/tests/api.c index 8416860ee..2d30d26c9 100644 --- a/tests/api.c +++ b/tests/api.c @@ -1268,7 +1268,6 @@ static void test_wolfSSL_CertManagerNameConstraint(void) XFREE(der, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); wolfSSL_X509_free(x509); wc_FreeRng(&rng); - wolfSSL_CertManagerFree(cm); #endif } From 8511d0769875d7767c42e198c9562016863b3804 Mon Sep 17 00:00:00 2001 From: Jacob Barthelmeh Date: Tue, 23 Jun 2020 15:42:32 -0600 Subject: [PATCH 273/298] store chain is free'd when store is free'd --- tests/api.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/tests/api.c b/tests/api.c index 40850d289..e6106a417 100644 --- a/tests/api.c +++ b/tests/api.c @@ -22125,9 +22125,6 @@ static void test_wolfSSL_X509_STORE_CTX(void) X509_STORE_CTX_set_error(NULL, -5); X509_STORE_CTX_free(ctx); -#ifdef OPENSSL_ALL - sk_X509_free(sk); -#endif X509_STORE_free(str); X509_free(x509); @@ -22153,7 +22150,6 @@ static void test_wolfSSL_X509_STORE_CTX(void) AssertNotNull((sk3 = X509_STORE_CTX_get1_chain(ctx))); AssertIntEQ(sk_num(sk3), 1); /* sanity, make sure chain has 1 cert */ X509_STORE_CTX_free(ctx); - sk_X509_free(sk); X509_STORE_free(str); /* CTX certs not freed yet */ X509_free(x5092); From 55bb95823c4e7bde7e656df3587afcd16b2b44b1 Mon Sep 17 00:00:00 2001 From: Takashi Kojo Date: Wed, 24 Jun 2020 07:31:20 +0900 Subject: [PATCH 274/298] coding template --- wolfcrypt/src/wc_port.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/wolfcrypt/src/wc_port.c b/wolfcrypt/src/wc_port.c index 5b67c2633..3b07e3d84 100644 --- a/wolfcrypt/src/wc_port.c +++ b/wolfcrypt/src/wc_port.c @@ -1849,6 +1849,13 @@ int wolfSSL_CryptHwMutexUnLock(void) { #elif defined(WOLFSSL_USER_MUTEX) /* Use user own mutex */ + + /* + int wc_InitMutex(wolfSSL_Mutex* m) { ... } + int wc_FreeMutex(wolfSSL_Mutex *m) { ... } + int wc_LockMutex(wolfSSL_Mutex *m) { ... } + int wc_UnLockMutex(wolfSSL_Mutex *m) { ... } + */ #else #warning No mutex handling defined From ec755f8dd9c346135e314a9d57dcb7f33df9d984 Mon Sep 17 00:00:00 2001 From: Eric Blankenhorn Date: Fri, 24 Apr 2020 15:31:18 -0500 Subject: [PATCH 275/298] Override CRL error for NO_VERIFY --- src/internal.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/internal.c b/src/internal.c index 7906c4c77..bb5067f1d 100644 --- a/src/internal.c +++ b/src/internal.c @@ -10837,6 +10837,11 @@ int ProcessPeerCerts(WOLFSSL* ssl, byte* input, word32* inOutIdx, /* Do verify callback */ ret = DoVerifyCallback(ssl->ctx->cm, ssl, ret, args); + if (ssl->options.verifyNone && + (ret == CRL_MISSING || ret == CRL_CERT_REVOKED)) { + WOLFSSL_MSG("Ignoring CRL problem based on verify setting"); + ret = ssl->error = 0; + } #ifdef WOLFSSL_ALT_CERT_CHAINS /* For alternate cert chain, its okay for a CA cert to fail From 722961f55c68859c9f3a2a67e22105a2fa8e9964 Mon Sep 17 00:00:00 2001 From: kaleb-himes Date: Tue, 23 Jun 2020 17:32:00 -0600 Subject: [PATCH 276/298] ed25519 and ed448 check sigLen against expected --- tests/api.c | 41 +++++++++++++++++++++++++++++++++++++++++ wolfcrypt/src/ed25519.c | 2 +- wolfcrypt/src/ed448.c | 2 +- 3 files changed, 43 insertions(+), 2 deletions(-) diff --git a/tests/api.c b/tests/api.c index d3a29182c..15b0faee0 100644 --- a/tests/api.c +++ b/tests/api.c @@ -14669,6 +14669,8 @@ static int test_wc_ed25519_sign_msg (void) ed25519_key key; byte msg[] = "Everybody gets Friday off.\n"; byte sig[ED25519_SIG_SIZE]; + byte sigTooShort[ED25519_SIG_SIZE - 1]; + byte sigTooLong[ED25519_SIG_SIZE + 1]; word32 msglen = sizeof(msg); word32 siglen = sizeof(sig); word32 badSigLen = sizeof(sig) - 1; @@ -14676,6 +14678,8 @@ static int test_wc_ed25519_sign_msg (void) /* Initialize stack variables. */ XMEMSET(sig, 0, siglen); + XMEMSET(sigTooShort, 0, siglen-1); + XMEMSET(sigTooLong, 0, siglen+1); /* Initialize key. */ ret = wc_InitRng(&rng); @@ -14690,6 +14694,9 @@ static int test_wc_ed25519_sign_msg (void) if (ret == 0) { ret = wc_ed25519_sign_msg(msg, msglen, sig, &siglen, &key); + XMEMCPY(sigTooShort, sig, siglen-1); + XMEMCPY(sigTooLong, sig, siglen); + sigTooLong[ED25519_SIG_SIZE] = 0x01; /* add byte to end of sig */ } /* Test bad args. */ if (ret == 0 && siglen == ED25519_SIG_SIZE) { @@ -14729,6 +14736,18 @@ static int test_wc_ed25519_sign_msg (void) /* Test bad args. */ if (ret == 0) { + AssertIntEQ(wc_ed25519_verify_msg(sigTooShort, siglen - 1, msg, + msglen, &verify_ok, &key), + BAD_FUNC_ARG); + /* This should verify even though sig is modified, only siglen + * bytes are checked */ + AssertIntEQ(wc_ed25519_verify_msg(sigTooLong, siglen, msg, + msglen, &verify_ok, &key), + 0); + AssertIntEQ(wc_ed25519_verify_msg(sigTooLong, siglen + 1, msg, + msglen, &verify_ok, &key), + BAD_FUNC_ARG); + ret = wc_ed25519_verify_msg(NULL, siglen, msg, msglen, &verify_ok, &key); if (ret == BAD_FUNC_ARG) { @@ -15416,6 +15435,8 @@ static int test_wc_ed448_sign_msg (void) ed448_key key; byte msg[] = "Everybody gets Friday off.\n"; byte sig[ED448_SIG_SIZE]; + byte sigTooShort[ED448_SIG_SIZE - 1]; + byte sigTooLong[ED448_SIG_SIZE + 1]; word32 msglen = sizeof(msg); word32 siglen = sizeof(sig); word32 badSigLen = sizeof(sig) - 1; @@ -15423,6 +15444,8 @@ static int test_wc_ed448_sign_msg (void) /* Initialize stack variables. */ XMEMSET(sig, 0, siglen); + XMEMSET(sigTooShort, 0, siglen - 1); + XMEMSET(sigTooLong, 0, siglen + 1); /* Initialize key. */ ret = wc_InitRng(&rng); @@ -15437,6 +15460,9 @@ static int test_wc_ed448_sign_msg (void) if (ret == 0) { ret = wc_ed448_sign_msg(msg, msglen, sig, &siglen, &key, NULL, 0); + XMEMCPY(sigTooShort, sig, siglen - 1); + XMEMCPY(sigTooLong, sig, siglen); + sigTooLong[ED448_SIG_SIZE] = 0x01; /* add byte to end of sig */ } /* Test bad args. */ if (ret == 0 && siglen == ED448_SIG_SIZE) { @@ -15478,6 +15504,21 @@ static int test_wc_ed448_sign_msg (void) /* Test bad args. */ if (ret == 0) { + AssertIntEQ(wc_ed448_verify_msg(sigTooShort, siglen - 1, msg, + msglen, &verify_ok, &key, + NULL, 0), + BAD_FUNC_ARG); + /* This should verify even though sig is modified, only siglen + * bytes are checked */ + AssertIntEQ(wc_ed448_verify_msg(sigTooLong, siglen, msg, + msglen, &verify_ok, &key, + NULL, 0), + 0); + AssertIntEQ(wc_ed448_verify_msg(sigTooLong, siglen + 1, msg, + msglen, &verify_ok, &key, + NULL, 0), + BAD_FUNC_ARG); + ret = wc_ed448_verify_msg(NULL, siglen, msg, msglen, &verify_ok, &key, NULL, 0); if (ret == BAD_FUNC_ARG) { diff --git a/wolfcrypt/src/ed25519.c b/wolfcrypt/src/ed25519.c index b78732d5e..64aee3389 100644 --- a/wolfcrypt/src/ed25519.c +++ b/wolfcrypt/src/ed25519.c @@ -365,7 +365,7 @@ static int ed25519_verify_msg(const byte* sig, word32 sigLen, const byte* msg, *res = 0; /* check on basics needed to verify signature */ - if (sigLen < ED25519_SIG_SIZE || (sig[ED25519_SIG_SIZE-1] & 224)) + if (sigLen != ED25519_SIG_SIZE || (sig[ED25519_SIG_SIZE-1] & 224)) return BAD_FUNC_ARG; /* uncompress A (public key), test if valid, and negate it */ diff --git a/wolfcrypt/src/ed448.c b/wolfcrypt/src/ed448.c index edeec0707..a25fc5bcc 100644 --- a/wolfcrypt/src/ed448.c +++ b/wolfcrypt/src/ed448.c @@ -379,7 +379,7 @@ static int ed448_verify_msg(const byte* sig, word32 sigLen, const byte* msg, *res = 0; /* check on basics needed to verify signature */ - if (sigLen < ED448_SIG_SIZE) { + if (sigLen != ED448_SIG_SIZE) { ret = BAD_FUNC_ARG; } } From b8b2f7ef7d2d56c63749ba26fc61c3f4628a1576 Mon Sep 17 00:00:00 2001 From: Jacob Barthelmeh Date: Wed, 24 Jun 2020 10:57:31 -0600 Subject: [PATCH 277/298] vs build warning fixes --- src/ssl.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/ssl.c b/src/ssl.c index d165a398c..cdab65701 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -22989,12 +22989,12 @@ int wolfSSL_X509_verify_cert(WOLFSSL_X509_STORE_CTX* ctx) afterDate = ctx->current_cert->notAfter.data; beforeDate = ctx->current_cert->notBefore.data; - if (ValidateDate(afterDate, ctx->current_cert->notAfter.type, + if (ValidateDate(afterDate, (byte)ctx->current_cert->notAfter.type, AFTER) < 1) { error = X509_V_ERR_CERT_HAS_EXPIRED; } - else if (ValidateDate(beforeDate, ctx->current_cert->notBefore.type, - BEFORE) < 1) { + else if (ValidateDate(beforeDate, + (byte)ctx->current_cert->notBefore.type, BEFORE) < 1) { error = X509_V_ERR_CERT_NOT_YET_VALID; } From fdce5152c5492e6c338b09b86599207536b6e91d Mon Sep 17 00:00:00 2001 From: kaleb-himes Date: Wed, 24 Jun 2020 11:25:12 -0600 Subject: [PATCH 278/298] Address peer feedback --- examples/client/client.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/client/client.c b/examples/client/client.c index cf9704438..ee8bf225b 100644 --- a/examples/client/client.c +++ b/examples/client/client.c @@ -3082,7 +3082,7 @@ THREAD_RETURN WOLFSSL_THREAD client_test(void* args) XMEMSET(msg, 0, MSG32); XMEMSET(resumeMsg, 0, MSG32); - msgSz = resumeSz = sizeof(msgGet) - 1; + msgSz = resumeSz = (int) XSTRLEN(msgGet); XMEMCPY(msg, msgGet, msgSz); XMEMCPY(resumeMsg, msgGet, resumeSz); } From 308562e853b64e5db5c64eb2905fc09ffdc64ded Mon Sep 17 00:00:00 2001 From: kaleb-himes Date: Wed, 24 Jun 2020 13:41:03 -0600 Subject: [PATCH 279/298] configure.ac change == to = when not C code --- configure.ac | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index c44aa8be5..6e1dce91c 100644 --- a/configure.ac +++ b/configure.ac @@ -3695,7 +3695,7 @@ then ENABLED_ENCRYPT_THEN_MAC=yes fi -AS_IF([test "x$ENABLED_SNIFFER" == "xyes"],[ENABLED_ENCRYPT_THEN_MAC="no"]) +AS_IF([test "x$ENABLED_SNIFFER" = "xyes"],[ENABLED_ENCRYPT_THEN_MAC="no"]) if test "x$ENABLED_ENCRYPT_THEN_MAC" = "xyes" then @@ -4228,7 +4228,7 @@ AS_IF([test "x$ENABLED_INTEL_QA" = "xyes" || test "x$ENABLED_INTEL_QA_SYNC" = "x AC_MSG_RESULT([yes]) - AS_IF([test "x$BUILD_INTEL_QAT_VERSION" == "x1"], + AS_IF([test "x$BUILD_INTEL_QAT_VERSION" = "x1"], [LIB_ADD="-ladf_proxy -losal -lrt $LIB_ADD"], [LIB_ADD="-losal -lrt $LIB_ADD"]) CPPFLAGS="$OLD_CPPFLAGS" From a10ee78980975f28978490c2be3a568b39ff3e8e Mon Sep 17 00:00:00 2001 From: David Garske Date: Wed, 24 Jun 2020 15:08:49 -0700 Subject: [PATCH 280/298] Remove duplicate macros in VS user_settings.h files. --- IDE/WIN/user_settings.h | 2 -- IDE/WIN10/user_settings.h | 2 -- 2 files changed, 4 deletions(-) mode change 100644 => 100755 IDE/WIN/user_settings.h diff --git a/IDE/WIN/user_settings.h b/IDE/WIN/user_settings.h old mode 100644 new mode 100755 index d5fc044d4..43c7f3ab3 --- a/IDE/WIN/user_settings.h +++ b/IDE/WIN/user_settings.h @@ -33,11 +33,9 @@ /* The lib */ #define OPENSSL_EXTRA #define WOLFSSL_RIPEMD - #define WOLFSSL_SHA512 #define NO_PSK #define HAVE_EXTENDED_MASTER #define WOLFSSL_SNIFFER - #define HAVE_TLS_EXTENSIONS #define HAVE_SECURE_RENEGOTIATION #define HAVE_AESGCM diff --git a/IDE/WIN10/user_settings.h b/IDE/WIN10/user_settings.h index 4b106cf1c..0ae91aeec 100644 --- a/IDE/WIN10/user_settings.h +++ b/IDE/WIN10/user_settings.h @@ -54,11 +54,9 @@ /* The lib */ #define OPENSSL_EXTRA #define WOLFSSL_RIPEMD - #define WOLFSSL_SHA512 #define NO_PSK #define HAVE_EXTENDED_MASTER #define WOLFSSL_SNIFFER - #define HAVE_TLS_EXTENSIONS #define HAVE_SECURE_RENEGOTIATION #define HAVE_AESGCM From 86b7f1850281e042fd59676c5d16a9f866dc443a Mon Sep 17 00:00:00 2001 From: Ethan Looney Date: Wed, 24 Jun 2020 08:26:36 -0700 Subject: [PATCH 281/298] Added additional tests to curve448.c through api.c --- tests/api.c | 150 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 150 insertions(+) diff --git a/tests/api.c b/tests/api.c index be1c91acf..3b11c06fa 100644 --- a/tests/api.c +++ b/tests/api.c @@ -16107,6 +16107,154 @@ static int test_wc_curve448_init (void) return ret; } /* END test_wc_curve448_init and wc_curve_448_free*/ + +/* + * Testing wc_curve448_make_key + */ +static int test_wc_curve448_make_key (void) +{ + int ret = 0; +#if defined(HAVE_CURVE448) + RNG rng; + curve448_key key; + int keysize; + + + printf(testingFmt, "wc_curve448_make_key()"); + + ret = wc_curve448_init(&key); + + ret = wc_InitRng(&rng); + if (ret == 0) { + + + ret = wc_curve448_make_key(&rng, CURVE448_KEY_SIZE, &key); + if (ret == 0) { + keysize = wc_curve448_size(&key); + if (keysize != CURVE448_KEY_SIZE) { + ret = SSL_FATAL_ERROR; + } + } + if (ret == 0) { + ret = wc_curve448_make_key(&rng, keysize, &key); + } + } + /*test bad cases*/ + if (ret == 0) { + ret = wc_curve448_make_key(NULL, 0, NULL); + if (ret == BAD_FUNC_ARG) { + ret = 0; + } + } + if (ret == 0) { + ret = wc_curve448_make_key(&rng, keysize, NULL); + if (ret == BAD_FUNC_ARG) { + ret = 0; + } + } + if (ret == 0) { + ret = wc_curve448_make_key(NULL, keysize, &key); + if (ret == BAD_FUNC_ARG) { + ret = 0; + } + } + if (ret == 0) { + ret = wc_curve448_make_key(&rng, 0, &key); + if (ret == ECC_BAD_ARG_E) { + ret = 0; + } + } + + printf(resultFmt, ret == 0 ? passed : failed); + wc_curve448_free(&key); +#endif + return ret; +} /*END test_wc_curve448_make_key*/ +/* + * Testing test_wc_curve448_import_private_raw_ex + */ +static int test_wc_curve448_import_private_raw_ex(void) +{ + int ret = 0; +#if defined(HAVE_CURVE448) + RNG rng; + curve448_key key; + byte priv[CURVE448_KEY_SIZE]; + byte pub[CURVE448_KEY_SIZE]; + word32 privSz = sizeof(priv); + word32 pubSz = sizeof(pub); + int endian = EC448_BIG_ENDIAN; + + printf(testingFmt, "wc_curve448_import_private_raw_ex()"); + + + ret = wc_curve448_init(&key); + + ret = wc_InitRng(&rng); + if (ret == 0) { + + + ret = wc_curve448_make_key(&rng, CURVE448_KEY_SIZE, &key); + if (ret == 0){ + ret = wc_curve448_export_private_raw(&key, priv, &privSz); + } + if (ret == 0){ + ret = wc_curve448_export_public(&key, pub, &pubSz); + } + if (ret == 0) { + ret = wc_curve448_import_private_raw_ex(priv, privSz, pub, pubSz, + &key, endian); + } + } + /*test bad cases*/ + if (ret == 0) { + ret = wc_curve448_import_private_raw_ex(NULL, 0, NULL, 0, NULL, 0); + if (ret == BAD_FUNC_ARG) { + ret = 0; + } + } + if (ret == 0) { + ret = wc_curve448_import_private_raw_ex(NULL, privSz, pub, pubSz, + &key, endian); + if (ret == BAD_FUNC_ARG) { + ret = 0; + } + } + if (ret == 0) { + ret = wc_curve448_import_private_raw_ex(priv, privSz, NULL, pubSz, + &key, endian); + if (ret == BAD_FUNC_ARG) { + ret = 0; + } + } + if (ret == 0) { + ret = wc_curve448_import_private_raw_ex(priv, privSz, pub, pubSz, + NULL, endian); + if (ret == BAD_FUNC_ARG) { + ret = 0; + } + } + if (ret == 0) { + ret = wc_curve448_import_private_raw_ex(priv, 0, pub, pubSz, + &key, endian); + if (ret == ECC_BAD_ARG_E) { + ret = 0; + } + } + if (ret == 0) { + ret = wc_curve448_import_private_raw_ex(priv, privSz, pub, 0, + &key, endian); + if (ret == ECC_BAD_ARG_E) { + ret = 0; + } + } + + printf(resultFmt, ret == 0 ? passed : failed); + wc_curve448_free(&key); + +#endif + return ret; +} /*END test_wc_curve448_import_private_raw_ex*/ /* * Testing test_wc_curve448_size. */ @@ -32790,6 +32938,8 @@ void ApiTest(void) AssertIntEQ(test_wc_Ed448PublicKeyToDer(), 0); AssertIntEQ(test_wc_curve448_init(), 0); AssertIntEQ(test_wc_curve448_size (), 0); + AssertIntEQ(test_wc_curve448_import_private_raw_ex (), 0); + AssertIntEQ(test_wc_curve448_make_key (), 0); AssertIntEQ(test_wc_ecc_make_key(), 0); AssertIntEQ(test_wc_ecc_init(), 0); AssertIntEQ(test_wc_ecc_check_key(), 0); From 79981e3cf7d81bdd1a2a0d283270c1d528f1259e Mon Sep 17 00:00:00 2001 From: Ethan Looney Date: Wed, 24 Jun 2020 08:57:40 -0700 Subject: [PATCH 282/298] Added additonal tests to curve448.c --- tests/api.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/tests/api.c b/tests/api.c index 3b11c06fa..bd22d45ce 100644 --- a/tests/api.c +++ b/tests/api.c @@ -16107,7 +16107,6 @@ static int test_wc_curve448_init (void) return ret; } /* END test_wc_curve448_init and wc_curve_448_free*/ - /* * Testing wc_curve448_make_key */ @@ -16123,11 +16122,9 @@ static int test_wc_curve448_make_key (void) printf(testingFmt, "wc_curve448_make_key()"); ret = wc_curve448_init(&key); - ret = wc_InitRng(&rng); if (ret == 0) { - ret = wc_curve448_make_key(&rng, CURVE448_KEY_SIZE, &key); if (ret == 0) { keysize = wc_curve448_size(&key); @@ -16187,13 +16184,11 @@ static int test_wc_curve448_import_private_raw_ex(void) printf(testingFmt, "wc_curve448_import_private_raw_ex()"); - ret = wc_curve448_init(&key); ret = wc_InitRng(&rng); if (ret == 0) { - ret = wc_curve448_make_key(&rng, CURVE448_KEY_SIZE, &key); if (ret == 0){ ret = wc_curve448_export_private_raw(&key, priv, &privSz); From fe7d9ea7c1865bdc5a1320f48b28eb342449fcdc Mon Sep 17 00:00:00 2001 From: Ethan Looney Date: Wed, 24 Jun 2020 12:12:12 -0700 Subject: [PATCH 283/298] changed RNG to WC_RNG --- tests/api.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/api.c b/tests/api.c index bd22d45ce..4350a88cd 100644 --- a/tests/api.c +++ b/tests/api.c @@ -16114,7 +16114,7 @@ static int test_wc_curve448_make_key (void) { int ret = 0; #if defined(HAVE_CURVE448) - RNG rng; + WC_RNG rng; curve448_key key; int keysize; @@ -16174,7 +16174,7 @@ static int test_wc_curve448_import_private_raw_ex(void) { int ret = 0; #if defined(HAVE_CURVE448) - RNG rng; + WC_RNG rng; curve448_key key; byte priv[CURVE448_KEY_SIZE]; byte pub[CURVE448_KEY_SIZE]; From a8f5602e1033ef1ca5c734b9cdc58590aa4322fa Mon Sep 17 00:00:00 2001 From: Tesfa Mael Date: Thu, 25 Jun 2020 08:01:05 -0700 Subject: [PATCH 284/298] Correct mod calculation --- wolfcrypt/src/sp_c32.c | 10 +++++----- wolfcrypt/src/sp_c64.c | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/wolfcrypt/src/sp_c32.c b/wolfcrypt/src/sp_c32.c index 44fbc7774..2081726a0 100644 --- a/wolfcrypt/src/sp_c32.c +++ b/wolfcrypt/src/sp_c32.c @@ -1851,7 +1851,7 @@ static int sp_2048_div_45(const sp_digit* a, const sp_digit* d, sp_digit* m, sp_2048_mul_d_45(t2, sd, r1); sp_2048_sub_45(t1, t1, t2); XMEMCPY(r, t1, sizeof(*r) * 2U * 45U); - for (i=0; i<43; i++) { + for (i=0; i<44; i++) { r[i+1] += r[i] >> 23; r[i] &= 0x7fffff; } @@ -2802,7 +2802,7 @@ static int sp_2048_div_90(const sp_digit* a, const sp_digit* d, sp_digit* m, sp_2048_mul_d_90(t2, sd, r1); sp_2048_sub_90(t1, t1, t2); XMEMCPY(r, t1, sizeof(*r) * 2U * 90U); - for (i=0; i<88; i++) { + for (i=0; i<89; i++) { r[i+1] += r[i] >> 23; r[i] &= 0x7fffff; } @@ -6679,7 +6679,7 @@ static int sp_3072_div_134(const sp_digit* a, const sp_digit* d, sp_digit* m, sp_3072_mul_d_134(t2, sd, r1); sp_3072_sub_134(t1, t1, t2); XMEMCPY(r, t1, sizeof(*r) * 2U * 134U); - for (i=0; i<132; i++) { + for (i=0; i<133; i++) { r[i+1] += r[i] >> 23; r[i] &= 0x7fffff; } @@ -9756,7 +9756,7 @@ static int sp_4096_div_98(const sp_digit* a, const sp_digit* d, sp_digit* m, sp_4096_mul_d_98(t2, sd, r1); sp_4096_sub_98(t1, t1, t2); XMEMCPY(r, t1, sizeof(*r) * 2U * 98U); - for (i=0; i<96; i++) { + for (i=0; i<97; i++) { r[i+1] += r[i] >> 21; r[i] &= 0x1fffff; } @@ -10720,7 +10720,7 @@ static int sp_4096_div_196(const sp_digit* a, const sp_digit* d, sp_digit* m, sp_4096_mul_d_196(t2, sd, r1); sp_4096_sub_196(t1, t1, t2); XMEMCPY(r, t1, sizeof(*r) * 2U * 196U); - for (i=0; i<194; i++) { + for (i=0; i<195; i++) { r[i+1] += r[i] >> 21; r[i] &= 0x1fffff; } diff --git a/wolfcrypt/src/sp_c64.c b/wolfcrypt/src/sp_c64.c index 86f8dc334..c9131f003 100644 --- a/wolfcrypt/src/sp_c64.c +++ b/wolfcrypt/src/sp_c64.c @@ -9977,7 +9977,7 @@ static int sp_4096_div_39(const sp_digit* a, const sp_digit* d, sp_digit* m, sp_4096_mul_d_39(t2, sd, r1); sp_4096_sub_39(t1, t1, t2); XMEMCPY(r, t1, sizeof(*r) * 2U * 39U); - for (i=0; i<37; i++) { + for (i=0; i<38; i++) { r[i+1] += r[i] >> 53; r[i] &= 0x1fffffffffffffL; } @@ -10989,7 +10989,7 @@ static int sp_4096_div_78(const sp_digit* a, const sp_digit* d, sp_digit* m, sp_4096_mul_d_78(t2, sd, r1); sp_4096_sub_78(t1, t1, t2); XMEMCPY(r, t1, sizeof(*r) * 2U * 78U); - for (i=0; i<76; i++) { + for (i=0; i<77; i++) { r[i+1] += r[i] >> 53; r[i] &= 0x1fffffffffffffL; } From 60d6f616c236d410af98739470e90b0ee1bc0e62 Mon Sep 17 00:00:00 2001 From: Tesfa Mael Date: Thu, 25 Jun 2020 08:06:14 -0700 Subject: [PATCH 285/298] Fix typo --- wolfcrypt/src/sp_x86_64.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/wolfcrypt/src/sp_x86_64.c b/wolfcrypt/src/sp_x86_64.c index b3af97702..435aa2234 100644 --- a/wolfcrypt/src/sp_x86_64.c +++ b/wolfcrypt/src/sp_x86_64.c @@ -320,7 +320,7 @@ extern int64_t sp_2048_cmp_16(const sp_digit* a, const sp_digit* b); /* Divide d in a and put remainder into r (m*d + r = a) * m is not calculated as it is not needed at this time. * - * a Nmber to be divided. + * a Number to be divided. * d Number to divide with. * m Multiplier result. * r Remainder from the division. @@ -850,7 +850,7 @@ extern int64_t sp_2048_cmp_32(const sp_digit* a, const sp_digit* b); /* Divide d in a and put remainder into r (m*d + r = a) * m is not calculated as it is not needed at this time. * - * a Nmber to be divided. + * a Number to be divided. * d Number to divide with. * m Multiplier result. * r Remainder from the division. @@ -922,7 +922,7 @@ extern sp_digit sp_2048_sub_32(sp_digit* r, const sp_digit* a, const sp_digit* b /* Divide d in a and put remainder into r (m*d + r = a) * m is not calculated as it is not needed at this time. * - * a Nmber to be divided. + * a Number to be divided. * d Number to divide with. * m Multiplier result. * r Remainder from the division. @@ -2516,7 +2516,7 @@ extern int64_t sp_3072_cmp_24(const sp_digit* a, const sp_digit* b); /* Divide d in a and put remainder into r (m*d + r = a) * m is not calculated as it is not needed at this time. * - * a Nmber to be divided. + * a Number to be divided. * d Number to divide with. * m Multiplier result. * r Remainder from the division. @@ -3046,7 +3046,7 @@ extern int64_t sp_3072_cmp_48(const sp_digit* a, const sp_digit* b); /* Divide d in a and put remainder into r (m*d + r = a) * m is not calculated as it is not needed at this time. * - * a Nmber to be divided. + * a Number to be divided. * d Number to divide with. * m Multiplier result. * r Remainder from the division. @@ -3118,7 +3118,7 @@ extern sp_digit sp_3072_sub_48(sp_digit* r, const sp_digit* a, const sp_digit* b /* Divide d in a and put remainder into r (m*d + r = a) * m is not calculated as it is not needed at this time. * - * a Nmber to be divided. + * a Number to be divided. * d Number to divide with. * m Multiplier result. * r Remainder from the division. @@ -4690,7 +4690,7 @@ extern int64_t sp_4096_cmp_64(const sp_digit* a, const sp_digit* b); /* Divide d in a and put remainder into r (m*d + r = a) * m is not calculated as it is not needed at this time. * - * a Nmber to be divided. + * a Number to be divided. * d Number to divide with. * m Multiplier result. * r Remainder from the division. @@ -4762,7 +4762,7 @@ extern sp_digit sp_4096_sub_64(sp_digit* r, const sp_digit* a, const sp_digit* b /* Divide d in a and put remainder into r (m*d + r = a) * m is not calculated as it is not needed at this time. * - * a Nmber to be divided. + * a Number to be divided. * d Number to divide with. * m Multiplier result. * r Remainder from the division. @@ -22495,7 +22495,7 @@ static void sp_256_mask_4(sp_digit* r, const sp_digit* a, sp_digit m) /* Divide d in a and put remainder into r (m*d + r = a) * m is not calculated as it is not needed at this time. * - * a Nmber to be divided. + * a Number to be divided. * d Number to divide with. * m Multiplier result. * r Remainder from the division. @@ -28352,7 +28352,7 @@ static void sp_384_mask_6(sp_digit* r, const sp_digit* a, sp_digit m) /* Divide d in a and put remainder into r (m*d + r = a) * m is not calculated as it is not needed at this time. * - * a Nmber to be divided. + * a Number to be divided. * d Number to divide with. * m Multiplier result. * r Remainder from the division. From 17466727b256716044b4250dd04e72feb315c6b4 Mon Sep 17 00:00:00 2001 From: kaleb-himes Date: Thu, 25 Jun 2020 09:43:22 -0600 Subject: [PATCH 286/298] Implement peer review feedback --- tests/api.c | 33 ++++----------------------------- 1 file changed, 4 insertions(+), 29 deletions(-) diff --git a/tests/api.c b/tests/api.c index 15b0faee0..5878bfafd 100644 --- a/tests/api.c +++ b/tests/api.c @@ -14669,8 +14669,6 @@ static int test_wc_ed25519_sign_msg (void) ed25519_key key; byte msg[] = "Everybody gets Friday off.\n"; byte sig[ED25519_SIG_SIZE]; - byte sigTooShort[ED25519_SIG_SIZE - 1]; - byte sigTooLong[ED25519_SIG_SIZE + 1]; word32 msglen = sizeof(msg); word32 siglen = sizeof(sig); word32 badSigLen = sizeof(sig) - 1; @@ -14678,8 +14676,6 @@ static int test_wc_ed25519_sign_msg (void) /* Initialize stack variables. */ XMEMSET(sig, 0, siglen); - XMEMSET(sigTooShort, 0, siglen-1); - XMEMSET(sigTooLong, 0, siglen+1); /* Initialize key. */ ret = wc_InitRng(&rng); @@ -14694,9 +14690,6 @@ static int test_wc_ed25519_sign_msg (void) if (ret == 0) { ret = wc_ed25519_sign_msg(msg, msglen, sig, &siglen, &key); - XMEMCPY(sigTooShort, sig, siglen-1); - XMEMCPY(sigTooLong, sig, siglen); - sigTooLong[ED25519_SIG_SIZE] = 0x01; /* add byte to end of sig */ } /* Test bad args. */ if (ret == 0 && siglen == ED25519_SIG_SIZE) { @@ -14736,15 +14729,10 @@ static int test_wc_ed25519_sign_msg (void) /* Test bad args. */ if (ret == 0) { - AssertIntEQ(wc_ed25519_verify_msg(sigTooShort, siglen - 1, msg, + AssertIntEQ(wc_ed25519_verify_msg(sig, siglen - 1, msg, msglen, &verify_ok, &key), BAD_FUNC_ARG); - /* This should verify even though sig is modified, only siglen - * bytes are checked */ - AssertIntEQ(wc_ed25519_verify_msg(sigTooLong, siglen, msg, - msglen, &verify_ok, &key), - 0); - AssertIntEQ(wc_ed25519_verify_msg(sigTooLong, siglen + 1, msg, + AssertIntEQ(wc_ed25519_verify_msg(sig, siglen + 1, msg, msglen, &verify_ok, &key), BAD_FUNC_ARG); @@ -15435,8 +15423,6 @@ static int test_wc_ed448_sign_msg (void) ed448_key key; byte msg[] = "Everybody gets Friday off.\n"; byte sig[ED448_SIG_SIZE]; - byte sigTooShort[ED448_SIG_SIZE - 1]; - byte sigTooLong[ED448_SIG_SIZE + 1]; word32 msglen = sizeof(msg); word32 siglen = sizeof(sig); word32 badSigLen = sizeof(sig) - 1; @@ -15444,8 +15430,6 @@ static int test_wc_ed448_sign_msg (void) /* Initialize stack variables. */ XMEMSET(sig, 0, siglen); - XMEMSET(sigTooShort, 0, siglen - 1); - XMEMSET(sigTooLong, 0, siglen + 1); /* Initialize key. */ ret = wc_InitRng(&rng); @@ -15460,9 +15444,6 @@ static int test_wc_ed448_sign_msg (void) if (ret == 0) { ret = wc_ed448_sign_msg(msg, msglen, sig, &siglen, &key, NULL, 0); - XMEMCPY(sigTooShort, sig, siglen - 1); - XMEMCPY(sigTooLong, sig, siglen); - sigTooLong[ED448_SIG_SIZE] = 0x01; /* add byte to end of sig */ } /* Test bad args. */ if (ret == 0 && siglen == ED448_SIG_SIZE) { @@ -15504,17 +15485,11 @@ static int test_wc_ed448_sign_msg (void) /* Test bad args. */ if (ret == 0) { - AssertIntEQ(wc_ed448_verify_msg(sigTooShort, siglen - 1, msg, + AssertIntEQ(wc_ed448_verify_msg(sig, siglen - 1, msg, msglen, &verify_ok, &key, NULL, 0), BAD_FUNC_ARG); - /* This should verify even though sig is modified, only siglen - * bytes are checked */ - AssertIntEQ(wc_ed448_verify_msg(sigTooLong, siglen, msg, - msglen, &verify_ok, &key, - NULL, 0), - 0); - AssertIntEQ(wc_ed448_verify_msg(sigTooLong, siglen + 1, msg, + AssertIntEQ(wc_ed448_verify_msg(sig, siglen + 1, msg, msglen, &verify_ok, &key, NULL, 0), BAD_FUNC_ARG); From 1c1ddaa6c22e2b121ab9b9022d968bd244c8122c Mon Sep 17 00:00:00 2001 From: Ethan Looney Date: Thu, 25 Jun 2020 16:40:38 -0700 Subject: [PATCH 287/298] Added checks to initial returns and free rng --- tests/api.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/tests/api.c b/tests/api.c index 4350a88cd..84da8368b 100644 --- a/tests/api.c +++ b/tests/api.c @@ -16122,7 +16122,9 @@ static int test_wc_curve448_make_key (void) printf(testingFmt, "wc_curve448_make_key()"); ret = wc_curve448_init(&key); - ret = wc_InitRng(&rng); + if (ret == 0) { + ret = wc_InitRng(&rng); + } if (ret == 0) { ret = wc_curve448_make_key(&rng, CURVE448_KEY_SIZE, &key); @@ -16161,6 +16163,10 @@ static int test_wc_curve448_make_key (void) ret = 0; } } + + if (wc_FreeRng(&rng) != 0 && ret == 0) { + ret = WOLFSSL_FATAL_ERROR; + } printf(resultFmt, ret == 0 ? passed : failed); wc_curve448_free(&key); @@ -16185,8 +16191,9 @@ static int test_wc_curve448_import_private_raw_ex(void) printf(testingFmt, "wc_curve448_import_private_raw_ex()"); ret = wc_curve448_init(&key); - - ret = wc_InitRng(&rng); + if (ret == 0) { + ret = wc_InitRng(&rng); + } if (ret == 0) { ret = wc_curve448_make_key(&rng, CURVE448_KEY_SIZE, &key); @@ -16244,6 +16251,10 @@ static int test_wc_curve448_import_private_raw_ex(void) } } + if (wc_FreeRng(&rng) != 0 && ret == 0) { + ret = WOLFSSL_FATAL_ERROR; + } + printf(resultFmt, ret == 0 ? passed : failed); wc_curve448_free(&key); From 6745733e2e0030f062158cf4d73d2c49f8e9c59f Mon Sep 17 00:00:00 2001 From: Ethan Looney Date: Mon, 29 Jun 2020 09:30:17 -0700 Subject: [PATCH 288/298] Added more tests to api.c for curve448 --- tests/api.c | 316 +++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 313 insertions(+), 3 deletions(-) diff --git a/tests/api.c b/tests/api.c index 048bea8d1..f9273a619 100644 --- a/tests/api.c +++ b/tests/api.c @@ -16123,6 +16123,7 @@ static int test_wc_curve448_init (void) return ret; } /* END test_wc_curve448_init and wc_curve_448_free*/ + /* * Testing wc_curve448_make_key */ @@ -16189,10 +16190,235 @@ static int test_wc_curve448_make_key (void) #endif return ret; } /*END test_wc_curve448_make_key*/ +/* + * Testing test_wc_curve448_shared_secret_ex + */ +static int test_wc_curve448_shared_secret_ex (void) //ethan-3 +{ + int ret = 0; +#if defined(HAVE_CURVE448) + WC_RNG rng; + curve448_key private_key, public_key; + byte out[CURVE448_KEY_SIZE]; + word32 outLen = sizeof(out); + int endian = EC448_BIG_ENDIAN; + + printf(testingFmt, "wc_curve448_shared_secret_ex()"); + + ret = wc_curve448_init(&private_key); + if (ret == 0) { + ret = wc_InitRng(&rng); + if (ret == 0){ + ret = wc_curve448_make_key(&rng, CURVE448_KEY_SIZE, &private_key); + } + if (wc_FreeRng(&rng) && ret == 0) { + ret = WOLFSSL_FATAL_ERROR; + } + } + ret = wc_curve448_init(&public_key); + if (ret == 0) { + ret = wc_InitRng(&rng); + if (ret == 0){ + ret = wc_curve448_make_key(&rng, CURVE448_KEY_SIZE, &public_key); + } + } + + if (ret == 0) { + ret = wc_curve448_shared_secret_ex(&private_key, &public_key, out, + &outLen, endian); + } + /*test bad cases*/ + if (ret == 0) { + ret = wc_curve448_shared_secret_ex(NULL, NULL, NULL, + 0, endian); + if (ret == BAD_FUNC_ARG) { + ret = 0; + } + } + if (ret == 0) { + ret = wc_curve448_shared_secret_ex(NULL, &public_key, out, + &outLen, endian); + if (ret == BAD_FUNC_ARG) { + ret = 0; + } + } + if (ret == 0) { + ret = wc_curve448_shared_secret_ex(&private_key, NULL, out, + &outLen, endian); + if (ret == BAD_FUNC_ARG) { + ret = 0; + } + } + if (ret == 0) { + ret = wc_curve448_shared_secret_ex(&private_key, &public_key, NULL, + &outLen, endian); + if (ret == BAD_FUNC_ARG) { + ret = 0; + } + } + if (ret == 0) { + ret = wc_curve448_shared_secret_ex(&private_key, &public_key, out, + NULL, endian); + if (ret == BAD_FUNC_ARG) { + ret = 0; + } + } + outLen = outLen - 2; + if (ret == 0) { + ret = wc_curve448_shared_secret_ex(&private_key, &public_key, out, + &outLen, endian); + if (ret == BAD_FUNC_ARG) { + ret = 0; + } + } + + printf(resultFmt, ret == 0 ? passed : failed); + wc_curve448_free(&private_key); + wc_curve448_free(&public_key); + wc_FreeRng(&rng); +#endif + return ret; +} /*END test_wc_curve448_shared_secret_ex*/ + + +/* + * Testing test_wc_curve448_export_public_ex + */ +static int test_wc_curve448_export_public_ex (void) +{ + int ret = 0; +#if defined(HAVE_CURVE448) + + WC_RNG rng; + curve448_key key; + byte out[CURVE448_KEY_SIZE]; + word32 outLen = sizeof(out); + int endian = EC448_BIG_ENDIAN; + + printf(testingFmt, "wc_curve448_export_public_ex()"); + + ret = wc_curve448_init(&key); + if (ret == 0) { + ret = wc_InitRng(&rng); + } + if (ret == 0) { + + ret = wc_curve448_make_key(&rng, CURVE448_KEY_SIZE, &key); + if (ret == 0){ + ret = wc_curve448_export_public(&key, out, &outLen); + } + if (ret == 0) { + ret = wc_curve448_export_public_ex(&key, out, &outLen, endian); + } + } + /*test bad cases*/ + if (ret == 0) { + ret = wc_curve448_export_public_ex(NULL, NULL, NULL, endian); + if (ret == BAD_FUNC_ARG) { + ret = 0; + } + } + if (ret == 0) { + ret = wc_curve448_export_public_ex(NULL, out, &outLen, endian); + if (ret == BAD_FUNC_ARG) { + ret = 0; + } + } + if (ret == 0) { + ret = wc_curve448_export_public_ex(&key, NULL, &outLen, endian); + if (ret == BAD_FUNC_ARG) { + ret = 0; + } + } + if (ret == 0) { + ret = wc_curve448_export_public_ex(&key, out, NULL, endian); + if (ret == BAD_FUNC_ARG) { + ret = 0; + } + } + outLen = outLen - 2; + if (ret == 0) { + ret = wc_curve448_export_public_ex(&key, out, &outLen, endian); + if (ret == ECC_BAD_ARG_E) { + ret = 0; + } + } + + printf(resultFmt, ret == 0 ? passed : failed); + wc_curve448_free(&key); + wc_FreeRng(&rng); +#endif + return ret; + +} /*END test_wc_curve448_export_public_ex*/ +/* + * Testing test_wc_curve448_export_private_raw_ex + */ +static int test_wc_curve448_export_private_raw_ex (void) +{ + + int ret = 0; +#if defined(HAVE_CURVE448) + + WC_RNG rng; + curve448_key key; + byte out[CURVE448_KEY_SIZE]; + word32 outLen = sizeof(out); + int endian = EC448_BIG_ENDIAN; + + printf(testingFmt, "wc_curve448_export_private_raw_ex()"); + + ret = wc_curve448_init(&key); + if (ret == 0) { + ret = wc_InitRng(&rng); + } + if (ret == 0) { + ret = wc_curve448_export_private_raw_ex(&key, out, &outLen, endian); + } + /*test bad cases*/ + if (ret == 0) { + ret = wc_curve448_export_private_raw_ex(NULL, NULL, NULL, endian); + if (ret == BAD_FUNC_ARG) { + ret = 0; + } + } + if (ret == 0) { + ret = wc_curve448_export_private_raw_ex(NULL, out, &outLen, endian); + if (ret == BAD_FUNC_ARG) { + ret = 0; + } + } + if (ret == 0) { + ret = wc_curve448_export_private_raw_ex(&key, NULL, &outLen, endian); + if (ret == BAD_FUNC_ARG) { + ret = 0; + } + } + if (ret == 0) { + ret = wc_curve448_export_private_raw_ex(&key, out, NULL, endian); + if (ret == BAD_FUNC_ARG) { + ret = 0; + } + } + outLen = outLen - 2; + if (ret == 0) { + ret = wc_curve448_export_private_raw_ex(&key, out, &outLen, endian); + if (ret == ECC_BAD_ARG_E) { + ret = 0; + } + } + + printf(resultFmt, ret == 0 ? passed : failed); + wc_curve448_free(&key); + wc_FreeRng(&rng); +#endif + return ret; + +}/*END test_wc_curve448_export_private_raw_ex*/ /* * Testing test_wc_curve448_import_private_raw_ex */ -static int test_wc_curve448_import_private_raw_ex(void) +static int test_wc_curve448_import_private_raw_ex (void) { int ret = 0; #if defined(HAVE_CURVE448) @@ -16277,6 +16503,85 @@ static int test_wc_curve448_import_private_raw_ex(void) #endif return ret; } /*END test_wc_curve448_import_private_raw_ex*/ +/* + * Testing test_curve448_export_key_raw + */ +static int test_wc_curve448_export_key_raw (void) +{ + int ret = 0; +#if defined(HAVE_CURVE448) + WC_RNG rng; + curve448_key key; + byte priv[CURVE448_KEY_SIZE]; + byte pub[CURVE448_KEY_SIZE]; + word32 privSz = sizeof(priv); + word32 pubSz = sizeof(pub); + + printf(testingFmt, "wc_curve448_export_key_raw()"); + + ret = wc_curve448_init(&key); + if (ret == 0) { + ret = wc_InitRng(&rng); + } + if (ret == 0) { + + ret = wc_curve448_make_key(&rng, CURVE448_KEY_SIZE, &key); + if (ret == 0){ + ret = wc_curve448_export_private_raw(&key, priv, &privSz); + } + if (ret == 0){ + ret = wc_curve448_export_public(&key, pub, &pubSz); + } + if (ret == 0) { + ret = wc_curve448_export_key_raw(&key, priv, &privSz, pub, &pubSz); + } + } + + printf(resultFmt, ret == 0 ? passed : failed); + wc_curve448_free(&key); + wc_FreeRng(&rng); +#endif + return ret; + +}/*END test_wc_curve448_import_private_raw_ex*/ + + +/* + * Testing test_wc_curve448_import_private + */ +static int test_wc_curve448_import_private (void) +{ + int ret = 0; +#if defined(HAVE_CURVE448) + + curve448_key key; + WC_RNG rng; + byte priv[CURVE448_KEY_SIZE]; + word32 privSz = sizeof(priv); + + printf(testingFmt, "wc_curve448_import_private()"); + + ret = wc_curve448_init(&key); + if (ret == 0) { + ret = wc_InitRng(&rng); + } + if (ret == 0) { + + ret = wc_curve448_make_key(&rng, CURVE448_KEY_SIZE, &key); + if (ret == 0){ + ret = wc_curve448_export_private_raw(&key, priv, &privSz); + } + } + if (ret == 0){ + ret = wc_curve448_import_private(priv, privSz, &key); + } + printf(resultFmt, ret == 0 ? passed : failed); + wc_curve448_free(&key); + wc_FreeRng(&rng); +#endif + return ret; + +} /*END test_wc_curve448_import*/ /* * Testing test_wc_curve448_size. */ @@ -32970,10 +33275,15 @@ void ApiTest(void) AssertIntEQ(test_wc_ed448_size(), 0); AssertIntEQ(test_wc_ed448_exportKey(), 0); AssertIntEQ(test_wc_Ed448PublicKeyToDer(), 0); + AssertIntEQ(test_wc_curve448_make_key (), 0); + AssertIntEQ(test_wc_curve448_shared_secret_ex (), 0); + AssertIntEQ(test_wc_curve448_export_public_ex (), 0); + AssertIntEQ(test_wc_curve448_export_private_raw_ex (), 0); + AssertIntEQ(test_wc_curve448_export_key_raw (), 0); + AssertIntEQ(test_wc_curve448_import_private_raw_ex (), 0); + AssertIntEQ(test_wc_curve448_import_private (), 0); AssertIntEQ(test_wc_curve448_init(), 0); AssertIntEQ(test_wc_curve448_size (), 0); - AssertIntEQ(test_wc_curve448_import_private_raw_ex (), 0); - AssertIntEQ(test_wc_curve448_make_key (), 0); AssertIntEQ(test_wc_ecc_make_key(), 0); AssertIntEQ(test_wc_ecc_init(), 0); AssertIntEQ(test_wc_ecc_check_key(), 0); From 7fb4a98009dbf7445b2d936a5bf8376ea3872df2 Mon Sep 17 00:00:00 2001 From: Ethan Looney Date: Mon, 29 Jun 2020 09:48:22 -0700 Subject: [PATCH 289/298] Added two more tests to hit xmemset lines --- tests/api.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/tests/api.c b/tests/api.c index f9273a619..6b0f78219 100644 --- a/tests/api.c +++ b/tests/api.c @@ -16400,6 +16400,10 @@ static int test_wc_curve448_export_private_raw_ex (void) ret = 0; } } + if (ret == 0) { + ret = wc_curve448_export_private_raw_ex(&key, out, &outLen, + EC448_LITTLE_ENDIAN); + } outLen = outLen - 2; if (ret == 0) { ret = wc_curve448_export_private_raw_ex(&key, out, &outLen, endian); @@ -16447,7 +16451,7 @@ static int test_wc_curve448_import_private_raw_ex (void) } if (ret == 0) { ret = wc_curve448_import_private_raw_ex(priv, privSz, pub, pubSz, - &key, endian); + &key, endian); } } /*test bad cases*/ @@ -16473,25 +16477,30 @@ static int test_wc_curve448_import_private_raw_ex (void) } if (ret == 0) { ret = wc_curve448_import_private_raw_ex(priv, privSz, pub, pubSz, - NULL, endian); + NULL, endian); if (ret == BAD_FUNC_ARG) { ret = 0; } } if (ret == 0) { ret = wc_curve448_import_private_raw_ex(priv, 0, pub, pubSz, - &key, endian); + &key, endian); if (ret == ECC_BAD_ARG_E) { ret = 0; } } if (ret == 0) { ret = wc_curve448_import_private_raw_ex(priv, privSz, pub, 0, - &key, endian); + &key, endian); if (ret == ECC_BAD_ARG_E) { ret = 0; } } + if (ret == 0) { + ret = wc_curve448_import_private_raw_ex(priv, privSz, pub, pubSz, + &key, EC448_LITTLE_ENDIAN); + + } if (wc_FreeRng(&rng) != 0 && ret == 0) { ret = WOLFSSL_FATAL_ERROR; From e32e206d7cd63621418919210c70db188c250dae Mon Sep 17 00:00:00 2001 From: Ethan Looney Date: Mon, 29 Jun 2020 12:55:42 -0700 Subject: [PATCH 290/298] Added a return check --- tests/api.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/api.c b/tests/api.c index 6b0f78219..642bf9162 100644 --- a/tests/api.c +++ b/tests/api.c @@ -16215,7 +16215,9 @@ static int test_wc_curve448_shared_secret_ex (void) //ethan-3 ret = WOLFSSL_FATAL_ERROR; } } - ret = wc_curve448_init(&public_key); + if (ret == 0){ + ret = wc_curve448_init(&public_key); + } if (ret == 0) { ret = wc_InitRng(&rng); if (ret == 0){ From 4e584595f0307678f11f14ee49c1c015939b750a Mon Sep 17 00:00:00 2001 From: Sean Parkinson Date: Tue, 30 Jun 2020 08:32:42 +1000 Subject: [PATCH 291/298] Fix normalization in all SP C divs --- wolfcrypt/src/sp_c32.c | 6 +++--- wolfcrypt/src/sp_c64.c | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/wolfcrypt/src/sp_c32.c b/wolfcrypt/src/sp_c32.c index 2081726a0..3662ceae2 100644 --- a/wolfcrypt/src/sp_c32.c +++ b/wolfcrypt/src/sp_c32.c @@ -5695,7 +5695,7 @@ static int sp_3072_div_67(const sp_digit* a, const sp_digit* d, sp_digit* m, sp_3072_mul_d_67(t2, d, r1); (void)sp_3072_sub_67(t1, t1, t2); XMEMCPY(r, t1, sizeof(*r) * 2U * 67U); - for (i=0; i<65; i++) { + for (i=0; i<66; i++) { r[i+1] += r[i] >> 23; r[i] &= 0x7fffff; } @@ -16734,7 +16734,7 @@ static int sp_256_div_10(const sp_digit* a, const sp_digit* d, sp_digit* m, sp_256_mul_d_10(t2, d, r1); (void)sp_256_sub_10(t1, t1, t2); XMEMCPY(r, t1, sizeof(*r) * 2U * 10U); - for (i=0; i<8; i++) { + for (i=0; i<9; i++) { r[i+1] += r[i] >> 26; r[i] &= 0x3ffffff; } @@ -22880,7 +22880,7 @@ static int sp_384_div_15(const sp_digit* a, const sp_digit* d, sp_digit* m, sp_384_mul_d_15(t2, d, r1); (void)sp_384_sub_15(t1, t1, t2); XMEMCPY(r, t1, sizeof(*r) * 2U * 15U); - for (i=0; i<13; i++) { + for (i=0; i<14; i++) { r[i+1] += r[i] >> 26; r[i] &= 0x3ffffff; } diff --git a/wolfcrypt/src/sp_c64.c b/wolfcrypt/src/sp_c64.c index c9131f003..74e54f226 100644 --- a/wolfcrypt/src/sp_c64.c +++ b/wolfcrypt/src/sp_c64.c @@ -1502,7 +1502,7 @@ static int sp_2048_div_18(const sp_digit* a, const sp_digit* d, sp_digit* m, sp_2048_mul_d_18(t2, d, r1); (void)sp_2048_sub_18(t1, t1, t2); XMEMCPY(r, t1, sizeof(*r) * 2U * 18U); - for (i=0; i<16; i++) { + for (i=0; i<17; i++) { r[i+1] += r[i] >> 57; r[i] &= 0x1ffffffffffffffL; } @@ -2445,7 +2445,7 @@ static int sp_2048_div_36(const sp_digit* a, const sp_digit* d, sp_digit* m, sp_2048_mul_d_36(t2, d, r1); (void)sp_2048_sub_36(t1, t1, t2); XMEMCPY(r, t1, sizeof(*r) * 2U * 36U); - for (i=0; i<34; i++) { + for (i=0; i<35; i++) { r[i+1] += r[i] >> 57; r[i] &= 0x1ffffffffffffffL; } @@ -5683,7 +5683,7 @@ static int sp_3072_div_27(const sp_digit* a, const sp_digit* d, sp_digit* m, sp_3072_mul_d_27(t2, d, r1); (void)sp_3072_sub_27(t1, t1, t2); XMEMCPY(r, t1, sizeof(*r) * 2U * 27U); - for (i=0; i<25; i++) { + for (i=0; i<26; i++) { r[i+1] += r[i] >> 57; r[i] &= 0x1ffffffffffffffL; } @@ -6596,7 +6596,7 @@ static int sp_3072_div_54(const sp_digit* a, const sp_digit* d, sp_digit* m, sp_3072_mul_d_54(t2, d, r1); (void)sp_3072_sub_54(t1, t1, t2); XMEMCPY(r, t1, sizeof(*r) * 2U * 54U); - for (i=0; i<52; i++) { + for (i=0; i<53; i++) { r[i+1] += r[i] >> 57; r[i] &= 0x1ffffffffffffffL; } @@ -16535,7 +16535,7 @@ static int sp_256_div_5(const sp_digit* a, const sp_digit* d, sp_digit* m, sp_256_mul_d_5(t2, d, r1); (void)sp_256_sub_5(t1, t1, t2); XMEMCPY(r, t1, sizeof(*r) * 2U * 5U); - for (i=0; i<3; i++) { + for (i=0; i<4; i++) { r[i+1] += r[i] >> 52; r[i] &= 0xfffffffffffffL; } @@ -22251,7 +22251,7 @@ static int sp_384_div_7(const sp_digit* a, const sp_digit* d, sp_digit* m, sp_384_mul_d_7(t2, d, r1); (void)sp_384_sub_7(t1, t1, t2); XMEMCPY(r, t1, sizeof(*r) * 2U * 7U); - for (i=0; i<5; i++) { + for (i=0; i<6; i++) { r[i+1] += r[i] >> 55; r[i] &= 0x7fffffffffffffL; } From c39bd55acadd3c1b9cc66e84a9ac1bac3b895f48 Mon Sep 17 00:00:00 2001 From: Ethan Looney Date: Tue, 30 Jun 2020 09:32:10 -0700 Subject: [PATCH 292/298] Removed comment, deleted redundent WC_RNG initialization and fixed indentation --- tests/api.c | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/tests/api.c b/tests/api.c index 642bf9162..74ae6f4b8 100644 --- a/tests/api.c +++ b/tests/api.c @@ -16193,7 +16193,7 @@ static int test_wc_curve448_make_key (void) /* * Testing test_wc_curve448_shared_secret_ex */ -static int test_wc_curve448_shared_secret_ex (void) //ethan-3 +static int test_wc_curve448_shared_secret_ex (void) { int ret = 0; #if defined(HAVE_CURVE448) @@ -16210,16 +16210,12 @@ static int test_wc_curve448_shared_secret_ex (void) //ethan-3 ret = wc_InitRng(&rng); if (ret == 0){ ret = wc_curve448_make_key(&rng, CURVE448_KEY_SIZE, &private_key); - } - if (wc_FreeRng(&rng) && ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } + } } if (ret == 0){ ret = wc_curve448_init(&public_key); } if (ret == 0) { - ret = wc_InitRng(&rng); if (ret == 0){ ret = wc_curve448_make_key(&rng, CURVE448_KEY_SIZE, &public_key); } @@ -16281,8 +16277,6 @@ static int test_wc_curve448_shared_secret_ex (void) //ethan-3 #endif return ret; } /*END test_wc_curve448_shared_secret_ex*/ - - /* * Testing test_wc_curve448_export_public_ex */ @@ -16530,7 +16524,7 @@ static int test_wc_curve448_export_key_raw (void) printf(testingFmt, "wc_curve448_export_key_raw()"); - ret = wc_curve448_init(&key); + ret = wc_curve448_init(&key); if (ret == 0) { ret = wc_InitRng(&rng); } From b7e682e677f5764e2f0d8c1111956d3cae6a62aa Mon Sep 17 00:00:00 2001 From: Ethan Looney Date: Mon, 29 Jun 2020 09:30:17 -0700 Subject: [PATCH 293/298] Added more tests to api.c for curve448 --- tests/api.c | 316 +++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 313 insertions(+), 3 deletions(-) diff --git a/tests/api.c b/tests/api.c index 04c279ec6..e0b1b56e3 100644 --- a/tests/api.c +++ b/tests/api.c @@ -16654,6 +16654,7 @@ static int test_wc_curve448_init (void) return ret; } /* END test_wc_curve448_init and wc_curve_448_free*/ + /* * Testing wc_curve448_make_key */ @@ -16720,10 +16721,235 @@ static int test_wc_curve448_make_key (void) #endif return ret; } /*END test_wc_curve448_make_key*/ +/* + * Testing test_wc_curve448_shared_secret_ex + */ +static int test_wc_curve448_shared_secret_ex (void) //ethan-3 +{ + int ret = 0; +#if defined(HAVE_CURVE448) + WC_RNG rng; + curve448_key private_key, public_key; + byte out[CURVE448_KEY_SIZE]; + word32 outLen = sizeof(out); + int endian = EC448_BIG_ENDIAN; + + printf(testingFmt, "wc_curve448_shared_secret_ex()"); + + ret = wc_curve448_init(&private_key); + if (ret == 0) { + ret = wc_InitRng(&rng); + if (ret == 0){ + ret = wc_curve448_make_key(&rng, CURVE448_KEY_SIZE, &private_key); + } + if (wc_FreeRng(&rng) && ret == 0) { + ret = WOLFSSL_FATAL_ERROR; + } + } + ret = wc_curve448_init(&public_key); + if (ret == 0) { + ret = wc_InitRng(&rng); + if (ret == 0){ + ret = wc_curve448_make_key(&rng, CURVE448_KEY_SIZE, &public_key); + } + } + + if (ret == 0) { + ret = wc_curve448_shared_secret_ex(&private_key, &public_key, out, + &outLen, endian); + } + /*test bad cases*/ + if (ret == 0) { + ret = wc_curve448_shared_secret_ex(NULL, NULL, NULL, + 0, endian); + if (ret == BAD_FUNC_ARG) { + ret = 0; + } + } + if (ret == 0) { + ret = wc_curve448_shared_secret_ex(NULL, &public_key, out, + &outLen, endian); + if (ret == BAD_FUNC_ARG) { + ret = 0; + } + } + if (ret == 0) { + ret = wc_curve448_shared_secret_ex(&private_key, NULL, out, + &outLen, endian); + if (ret == BAD_FUNC_ARG) { + ret = 0; + } + } + if (ret == 0) { + ret = wc_curve448_shared_secret_ex(&private_key, &public_key, NULL, + &outLen, endian); + if (ret == BAD_FUNC_ARG) { + ret = 0; + } + } + if (ret == 0) { + ret = wc_curve448_shared_secret_ex(&private_key, &public_key, out, + NULL, endian); + if (ret == BAD_FUNC_ARG) { + ret = 0; + } + } + outLen = outLen - 2; + if (ret == 0) { + ret = wc_curve448_shared_secret_ex(&private_key, &public_key, out, + &outLen, endian); + if (ret == BAD_FUNC_ARG) { + ret = 0; + } + } + + printf(resultFmt, ret == 0 ? passed : failed); + wc_curve448_free(&private_key); + wc_curve448_free(&public_key); + wc_FreeRng(&rng); +#endif + return ret; +} /*END test_wc_curve448_shared_secret_ex*/ + + +/* + * Testing test_wc_curve448_export_public_ex + */ +static int test_wc_curve448_export_public_ex (void) +{ + int ret = 0; +#if defined(HAVE_CURVE448) + + WC_RNG rng; + curve448_key key; + byte out[CURVE448_KEY_SIZE]; + word32 outLen = sizeof(out); + int endian = EC448_BIG_ENDIAN; + + printf(testingFmt, "wc_curve448_export_public_ex()"); + + ret = wc_curve448_init(&key); + if (ret == 0) { + ret = wc_InitRng(&rng); + } + if (ret == 0) { + + ret = wc_curve448_make_key(&rng, CURVE448_KEY_SIZE, &key); + if (ret == 0){ + ret = wc_curve448_export_public(&key, out, &outLen); + } + if (ret == 0) { + ret = wc_curve448_export_public_ex(&key, out, &outLen, endian); + } + } + /*test bad cases*/ + if (ret == 0) { + ret = wc_curve448_export_public_ex(NULL, NULL, NULL, endian); + if (ret == BAD_FUNC_ARG) { + ret = 0; + } + } + if (ret == 0) { + ret = wc_curve448_export_public_ex(NULL, out, &outLen, endian); + if (ret == BAD_FUNC_ARG) { + ret = 0; + } + } + if (ret == 0) { + ret = wc_curve448_export_public_ex(&key, NULL, &outLen, endian); + if (ret == BAD_FUNC_ARG) { + ret = 0; + } + } + if (ret == 0) { + ret = wc_curve448_export_public_ex(&key, out, NULL, endian); + if (ret == BAD_FUNC_ARG) { + ret = 0; + } + } + outLen = outLen - 2; + if (ret == 0) { + ret = wc_curve448_export_public_ex(&key, out, &outLen, endian); + if (ret == ECC_BAD_ARG_E) { + ret = 0; + } + } + + printf(resultFmt, ret == 0 ? passed : failed); + wc_curve448_free(&key); + wc_FreeRng(&rng); +#endif + return ret; + +} /*END test_wc_curve448_export_public_ex*/ +/* + * Testing test_wc_curve448_export_private_raw_ex + */ +static int test_wc_curve448_export_private_raw_ex (void) +{ + + int ret = 0; +#if defined(HAVE_CURVE448) + + WC_RNG rng; + curve448_key key; + byte out[CURVE448_KEY_SIZE]; + word32 outLen = sizeof(out); + int endian = EC448_BIG_ENDIAN; + + printf(testingFmt, "wc_curve448_export_private_raw_ex()"); + + ret = wc_curve448_init(&key); + if (ret == 0) { + ret = wc_InitRng(&rng); + } + if (ret == 0) { + ret = wc_curve448_export_private_raw_ex(&key, out, &outLen, endian); + } + /*test bad cases*/ + if (ret == 0) { + ret = wc_curve448_export_private_raw_ex(NULL, NULL, NULL, endian); + if (ret == BAD_FUNC_ARG) { + ret = 0; + } + } + if (ret == 0) { + ret = wc_curve448_export_private_raw_ex(NULL, out, &outLen, endian); + if (ret == BAD_FUNC_ARG) { + ret = 0; + } + } + if (ret == 0) { + ret = wc_curve448_export_private_raw_ex(&key, NULL, &outLen, endian); + if (ret == BAD_FUNC_ARG) { + ret = 0; + } + } + if (ret == 0) { + ret = wc_curve448_export_private_raw_ex(&key, out, NULL, endian); + if (ret == BAD_FUNC_ARG) { + ret = 0; + } + } + outLen = outLen - 2; + if (ret == 0) { + ret = wc_curve448_export_private_raw_ex(&key, out, &outLen, endian); + if (ret == ECC_BAD_ARG_E) { + ret = 0; + } + } + + printf(resultFmt, ret == 0 ? passed : failed); + wc_curve448_free(&key); + wc_FreeRng(&rng); +#endif + return ret; + +}/*END test_wc_curve448_export_private_raw_ex*/ /* * Testing test_wc_curve448_import_private_raw_ex */ -static int test_wc_curve448_import_private_raw_ex(void) +static int test_wc_curve448_import_private_raw_ex (void) { int ret = 0; #if defined(HAVE_CURVE448) @@ -16808,6 +17034,85 @@ static int test_wc_curve448_import_private_raw_ex(void) #endif return ret; } /*END test_wc_curve448_import_private_raw_ex*/ +/* + * Testing test_curve448_export_key_raw + */ +static int test_wc_curve448_export_key_raw (void) +{ + int ret = 0; +#if defined(HAVE_CURVE448) + WC_RNG rng; + curve448_key key; + byte priv[CURVE448_KEY_SIZE]; + byte pub[CURVE448_KEY_SIZE]; + word32 privSz = sizeof(priv); + word32 pubSz = sizeof(pub); + + printf(testingFmt, "wc_curve448_export_key_raw()"); + + ret = wc_curve448_init(&key); + if (ret == 0) { + ret = wc_InitRng(&rng); + } + if (ret == 0) { + + ret = wc_curve448_make_key(&rng, CURVE448_KEY_SIZE, &key); + if (ret == 0){ + ret = wc_curve448_export_private_raw(&key, priv, &privSz); + } + if (ret == 0){ + ret = wc_curve448_export_public(&key, pub, &pubSz); + } + if (ret == 0) { + ret = wc_curve448_export_key_raw(&key, priv, &privSz, pub, &pubSz); + } + } + + printf(resultFmt, ret == 0 ? passed : failed); + wc_curve448_free(&key); + wc_FreeRng(&rng); +#endif + return ret; + +}/*END test_wc_curve448_import_private_raw_ex*/ + + +/* + * Testing test_wc_curve448_import_private + */ +static int test_wc_curve448_import_private (void) +{ + int ret = 0; +#if defined(HAVE_CURVE448) + + curve448_key key; + WC_RNG rng; + byte priv[CURVE448_KEY_SIZE]; + word32 privSz = sizeof(priv); + + printf(testingFmt, "wc_curve448_import_private()"); + + ret = wc_curve448_init(&key); + if (ret == 0) { + ret = wc_InitRng(&rng); + } + if (ret == 0) { + + ret = wc_curve448_make_key(&rng, CURVE448_KEY_SIZE, &key); + if (ret == 0){ + ret = wc_curve448_export_private_raw(&key, priv, &privSz); + } + } + if (ret == 0){ + ret = wc_curve448_import_private(priv, privSz, &key); + } + printf(resultFmt, ret == 0 ? passed : failed); + wc_curve448_free(&key); + wc_FreeRng(&rng); +#endif + return ret; + +} /*END test_wc_curve448_import*/ /* * Testing test_wc_curve448_size. */ @@ -33503,10 +33808,15 @@ void ApiTest(void) AssertIntEQ(test_wc_ed448_size(), 0); AssertIntEQ(test_wc_ed448_exportKey(), 0); AssertIntEQ(test_wc_Ed448PublicKeyToDer(), 0); + AssertIntEQ(test_wc_curve448_make_key (), 0); + AssertIntEQ(test_wc_curve448_shared_secret_ex (), 0); + AssertIntEQ(test_wc_curve448_export_public_ex (), 0); + AssertIntEQ(test_wc_curve448_export_private_raw_ex (), 0); + AssertIntEQ(test_wc_curve448_export_key_raw (), 0); + AssertIntEQ(test_wc_curve448_import_private_raw_ex (), 0); + AssertIntEQ(test_wc_curve448_import_private (), 0); AssertIntEQ(test_wc_curve448_init(), 0); AssertIntEQ(test_wc_curve448_size (), 0); - AssertIntEQ(test_wc_curve448_import_private_raw_ex (), 0); - AssertIntEQ(test_wc_curve448_make_key (), 0); AssertIntEQ(test_wc_ecc_make_key(), 0); AssertIntEQ(test_wc_ecc_init(), 0); AssertIntEQ(test_wc_ecc_check_key(), 0); From 78efb48acfa65072f26c26674c27f782f80084c3 Mon Sep 17 00:00:00 2001 From: Ethan Looney Date: Mon, 29 Jun 2020 09:48:22 -0700 Subject: [PATCH 294/298] Added two more tests to hit xmemset lines --- tests/api.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/tests/api.c b/tests/api.c index e0b1b56e3..16d8c954d 100644 --- a/tests/api.c +++ b/tests/api.c @@ -16931,6 +16931,10 @@ static int test_wc_curve448_export_private_raw_ex (void) ret = 0; } } + if (ret == 0) { + ret = wc_curve448_export_private_raw_ex(&key, out, &outLen, + EC448_LITTLE_ENDIAN); + } outLen = outLen - 2; if (ret == 0) { ret = wc_curve448_export_private_raw_ex(&key, out, &outLen, endian); @@ -16978,7 +16982,7 @@ static int test_wc_curve448_import_private_raw_ex (void) } if (ret == 0) { ret = wc_curve448_import_private_raw_ex(priv, privSz, pub, pubSz, - &key, endian); + &key, endian); } } /*test bad cases*/ @@ -17004,25 +17008,30 @@ static int test_wc_curve448_import_private_raw_ex (void) } if (ret == 0) { ret = wc_curve448_import_private_raw_ex(priv, privSz, pub, pubSz, - NULL, endian); + NULL, endian); if (ret == BAD_FUNC_ARG) { ret = 0; } } if (ret == 0) { ret = wc_curve448_import_private_raw_ex(priv, 0, pub, pubSz, - &key, endian); + &key, endian); if (ret == ECC_BAD_ARG_E) { ret = 0; } } if (ret == 0) { ret = wc_curve448_import_private_raw_ex(priv, privSz, pub, 0, - &key, endian); + &key, endian); if (ret == ECC_BAD_ARG_E) { ret = 0; } } + if (ret == 0) { + ret = wc_curve448_import_private_raw_ex(priv, privSz, pub, pubSz, + &key, EC448_LITTLE_ENDIAN); + + } if (wc_FreeRng(&rng) != 0 && ret == 0) { ret = WOLFSSL_FATAL_ERROR; From 4ad904909c436909a87567107d7365e4a0e0c2a1 Mon Sep 17 00:00:00 2001 From: Ethan Looney Date: Mon, 29 Jun 2020 12:55:42 -0700 Subject: [PATCH 295/298] Added a return check --- tests/api.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/api.c b/tests/api.c index 16d8c954d..e65490740 100644 --- a/tests/api.c +++ b/tests/api.c @@ -16746,7 +16746,9 @@ static int test_wc_curve448_shared_secret_ex (void) //ethan-3 ret = WOLFSSL_FATAL_ERROR; } } - ret = wc_curve448_init(&public_key); + if (ret == 0){ + ret = wc_curve448_init(&public_key); + } if (ret == 0) { ret = wc_InitRng(&rng); if (ret == 0){ From a59560a1d5555f50a1d91dd9f153ecb2bc1c7ae6 Mon Sep 17 00:00:00 2001 From: Ethan Looney Date: Wed, 1 Jul 2020 09:32:03 -0700 Subject: [PATCH 296/298] Added tests to curve25519.c and fixed a print error from previous curve25519 tests --- tests/api.c | 450 ++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 436 insertions(+), 14 deletions(-) diff --git a/tests/api.c b/tests/api.c index e65490740..1eb34dcba 100644 --- a/tests/api.c +++ b/tests/api.c @@ -15362,6 +15362,429 @@ static int test_wc_curve25519_init (void) return ret; } /* END test_wc_curve25519_init and wc_curve_25519_free*/ +/* + * Testing wc_curve25519_make_key + */ +static int test_wc_curve25519_make_key (void) +{ + int ret = 0; +#if defined(HAVE_CURVE25519) + WC_RNG rng; + curve25519_key key; + int keysize; + + + printf(testingFmt, "wc_curve25519_make_key()"); + + ret = wc_curve25519_init(&key); + if (ret == 0) { + ret = wc_InitRng(&rng); + } + if (ret == 0) { + + ret = wc_curve25519_make_key(&rng, CURVE25519_KEYSIZE, &key); + if (ret == 0) { + keysize = wc_curve25519_size(&key); + if (keysize != CURVE25519_KEYSIZE) { + ret = SSL_FATAL_ERROR; + } + } + if (ret == 0) { + ret = wc_curve25519_make_key(&rng, keysize, &key); + } + } + /*test bad cases*/ + if (ret == 0) { + ret = wc_curve25519_make_key(NULL, 0, NULL); + if (ret == BAD_FUNC_ARG) { + ret = 0; + } + } + if (ret == 0) { + ret = wc_curve25519_make_key(&rng, keysize, NULL); + if (ret == BAD_FUNC_ARG) { + ret = 0; + } + } + if (ret == 0) { + ret = wc_curve25519_make_key(NULL, keysize, &key); + if (ret == BAD_FUNC_ARG) { + ret = 0; + } + } + if (ret == 0) { + ret = wc_curve25519_make_key(&rng, 0, &key); + if (ret == ECC_BAD_ARG_E) { + ret = 0; + } + } + printf(resultFmt, ret == 0 ? passed : failed); + wc_curve25519_free(&key); + wc_FreeRng(&rng); +#endif + return ret; +} /*END test_wc_curve25519_make_key*/ +/* + * Testing wc_curve25519_shared_secret_ex + */ +static int test_wc_curve25519_shared_secret_ex (void) +{ + int ret = 0; +#if defined(HAVE_CURVE25519) + WC_RNG rng; + curve25519_key private_key, public_key; + byte out[CURVE25519_KEYSIZE]; + word32 outLen = sizeof(out); + int endian = EC25519_BIG_ENDIAN; + + + printf(testingFmt, "wc_curve25519_shared_secret_ex()"); + + ret = wc_curve25519_init(&private_key); + if (ret == 0) { + ret = wc_InitRng(&rng); + if (ret == 0) { + ret = wc_curve25519_make_key(&rng, CURVE25519_KEYSIZE, &private_key); + } + } + if (ret == 0) { + if (ret == 0) { + ret = wc_curve25519_make_key(&rng, CURVE25519_KEYSIZE, &public_key); + } + } + if (ret == 0) { + ret = wc_curve25519_shared_secret_ex(&private_key, &public_key, out, + &outLen, endian); + } + /*test bad cases*/ + if (ret == 0) { + ret = wc_curve25519_shared_secret_ex(NULL, NULL, NULL, + 0, endian); + if (ret == BAD_FUNC_ARG) { + ret = 0; + } + } + if (ret == 0) { + ret = wc_curve25519_shared_secret_ex(NULL, &public_key, out, + &outLen, endian); + if (ret == BAD_FUNC_ARG) { + ret = 0; + } + } + if (ret == 0) { + ret = wc_curve25519_shared_secret_ex(&private_key, NULL, out, + &outLen, endian); + if (ret == BAD_FUNC_ARG) { + ret = 0; + } + } + if (ret == 0) { + ret = wc_curve25519_shared_secret_ex(&private_key, &public_key, NULL, + &outLen, endian); + if (ret == BAD_FUNC_ARG) { + ret = 0; + } + } + if (ret == 0) { + ret = wc_curve25519_shared_secret_ex(&private_key, &public_key, out, + NULL, endian); + if (ret == BAD_FUNC_ARG) { + ret = 0; + } + } + + if (ret == 0) { + public_key.p.point[CURVE25519_KEYSIZE-1] = 0x8F; + ret = wc_curve25519_shared_secret_ex(&private_key, &public_key, out, + &outLen, endian); + if (ret == ECC_BAD_ARG_E) { + ret = 0; + } + } + + outLen = outLen - 2; + if (ret == 0) { + ret = wc_curve25519_shared_secret_ex(&private_key, &public_key, out, + &outLen, endian); + if (ret == BAD_FUNC_ARG) { + ret = 0; + } + } + + + printf(resultFmt, ret == 0 ? passed : failed); + wc_curve25519_free(&private_key); + wc_curve25519_free(&public_key); + wc_FreeRng(&rng); +#endif + return ret; +} /*END test_wc_curve25519_shared_secret_ex*/ +/* + * Testing test_wc_curve25519_export_public_ex + */ +static int test_wc_curve25519_export_public_ex (void) +{ + int ret = 0; +#if defined(HAVE_CURVE25519) + + WC_RNG rng; + curve25519_key key; + byte out[CURVE25519_KEYSIZE]; + word32 outLen = sizeof(out); + int endian = EC25519_BIG_ENDIAN; + + printf(testingFmt, "wc_curve25519_export_public_ex()"); + + ret = wc_curve25519_init(&key); + if (ret == 0) { + ret = wc_InitRng(&rng); + } + if (ret == 0) { + + ret = wc_curve25519_make_key(&rng, CURVE25519_KEYSIZE, &key); + if (ret == 0){ + ret = wc_curve25519_export_public(&key, out, &outLen); + } + if (ret == 0) { + ret = wc_curve25519_export_public_ex(&key, out, &outLen, endian); + } + } + /*test bad cases*/ + if (ret == 0) { + ret = wc_curve25519_export_public_ex(NULL, NULL, NULL, endian); + if (ret == BAD_FUNC_ARG) { + ret = 0; + } + } + if (ret == 0) { + ret = wc_curve25519_export_public_ex(NULL, out, &outLen, endian); + if (ret == BAD_FUNC_ARG) { + ret = 0; + } + } + if (ret == 0) { + ret = wc_curve25519_export_public_ex(&key, NULL, &outLen, endian); + if (ret == BAD_FUNC_ARG) { + ret = 0; + } + } + if (ret == 0) { + ret = wc_curve25519_export_public_ex(&key, out, NULL, endian); + if (ret == BAD_FUNC_ARG) { + ret = 0; + } + } + outLen = outLen - 2; + if (ret == 0) { + ret = wc_curve25519_export_public_ex(&key, out, &outLen, endian); + if (ret == ECC_BAD_ARG_E) { + ret = 0; + } + } + + printf(resultFmt, ret == 0 ? passed : failed); + wc_curve25519_free(&key); + wc_FreeRng(&rng); +#endif + return ret; + +} /*END test_wc_curve25519_export_public_ex*/ +/* + * Testing test_wc_curve25519_import_private_raw_ex + */ +static int test_wc_curve25519_import_private_raw_ex (void) +{ + int ret = 0; +#if defined(HAVE_CURVE25519) + WC_RNG rng; + curve25519_key key; + byte priv[CURVE25519_KEYSIZE]; + byte pub[CURVE25519_KEYSIZE]; + word32 privSz = sizeof(priv); + word32 pubSz = sizeof(pub); + int endian = EC25519_BIG_ENDIAN; + + + printf(testingFmt, "wc_curve25519_import_private_raw_ex()"); + + ret = wc_curve25519_init(&key); + if (ret == 0) { + ret = wc_InitRng(&rng); + } + if (ret == 0) { + + ret = wc_curve25519_make_key(&rng, CURVE25519_KEYSIZE, &key); + if (ret == 0){ + ret = wc_curve25519_export_private_raw_ex(&key, priv, &privSz, endian); + } + if (ret == 0){ + ret = wc_curve25519_export_public(&key, pub, &pubSz); + } + if (ret == 0) { + ret = wc_curve25519_import_private_raw_ex(priv, privSz, pub, pubSz, + &key, endian); + } + } + /*test bad cases*/ + if (ret == 0) { + ret = wc_curve25519_import_private_raw_ex(NULL, 0, NULL, 0, NULL, + endian); + if (ret == BAD_FUNC_ARG) { + ret = 0; + } + } + if (ret == 0) { + ret = wc_curve25519_import_private_raw_ex(NULL, privSz, pub, pubSz, + &key, endian); + if (ret == BAD_FUNC_ARG) { + ret = 0; + } + } + if (ret == 0) { + ret = wc_curve25519_import_private_raw_ex(priv, privSz, NULL, pubSz, + &key, endian); + if (ret == BAD_FUNC_ARG) { + ret = 0; + } + } + if (ret == 0) { + ret = wc_curve25519_import_private_raw_ex(priv, privSz, pub, pubSz, + NULL, endian); + if (ret == BAD_FUNC_ARG) { + ret = 0; + } + } + if (ret == 0) { + ret = wc_curve25519_import_private_raw_ex(priv, 0, pub, pubSz, + &key, endian); + if (ret == ECC_BAD_ARG_E) { + ret = 0; + } + } + if (ret == 0) { + ret = wc_curve25519_import_private_raw_ex(priv, privSz, pub, 0, + &key, endian); + if (ret == ECC_BAD_ARG_E) { + ret = 0; + } + } + if (ret == 0) { + ret = wc_curve25519_import_private_raw_ex(priv, privSz, pub, pubSz, + &key, EC25519_LITTLE_ENDIAN); + + } + + printf(resultFmt, ret == 0 ? passed : failed); + wc_curve25519_free(&key); + wc_FreeRng(&rng); + +#endif + return ret; +} /*END test_wc_curve25519_import_private_raw_ex*/ +/* + * Testing test_wc_curve25519_import_private + */ +static int test_wc_curve25519_import_private (void) +{ + int ret = 0; +#if defined(HAVE_CURVE25519) + + curve25519_key key; + WC_RNG rng; + byte priv[CURVE25519_KEYSIZE]; + word32 privSz = sizeof(priv); + + printf(testingFmt, "wc_curve25519_import_private()"); + + ret = wc_curve25519_init(&key); + if (ret == 0) { + ret = wc_InitRng(&rng); + } + if (ret == 0) { + + ret = wc_curve25519_make_key(&rng, CURVE25519_KEYSIZE, &key); + if (ret == 0){ + ret = wc_curve25519_export_private_raw(&key, priv, &privSz); + } + } + if (ret == 0){ + ret = wc_curve25519_import_private(priv, privSz, &key); + } + printf(resultFmt, ret == 0 ? passed : failed); + wc_curve25519_free(&key); + wc_FreeRng(&rng); +#endif + return ret; + +} /*END test_wc_curve25519_import*/ +/* + * Testing test_wc_curve25519_export_private_raw_ex + */ +static int test_wc_curve25519_export_private_raw_ex (void) +{ + + int ret = 0; +#if defined(HAVE_CURVE25519) + + WC_RNG rng; + curve25519_key key; + byte out[CURVE25519_KEYSIZE]; + word32 outLen = sizeof(out); + int endian = EC25519_BIG_ENDIAN; + + printf(testingFmt, "wc_curve25519_export_private_raw_ex()"); + + ret = wc_curve25519_init(&key); + if (ret == 0) { + ret = wc_InitRng(&rng); + } + if (ret == 0) { + ret = wc_curve25519_export_private_raw_ex(&key, out, &outLen, endian); + } + /*test bad cases*/ + if (ret == 0) { + ret = wc_curve25519_export_private_raw_ex(NULL, NULL, NULL, endian); + if (ret == BAD_FUNC_ARG) { + ret = 0; + } + } + if (ret == 0) { + ret = wc_curve25519_export_private_raw_ex(NULL, out, &outLen, endian); + if (ret == BAD_FUNC_ARG) { + ret = 0; + } + } + if (ret == 0) { + ret = wc_curve25519_export_private_raw_ex(&key, NULL, &outLen, endian); + if (ret == BAD_FUNC_ARG) { + ret = 0; + } + } + if (ret == 0) { + ret = wc_curve25519_export_private_raw_ex(&key, out, NULL, endian); + if (ret == BAD_FUNC_ARG) { + ret = 0; + } + } + if (ret == 0) { + ret = wc_curve25519_export_private_raw_ex(&key, out, &outLen, + EC25519_LITTLE_ENDIAN); + } + outLen = outLen - 2; + if (ret == 0) { + ret = wc_curve25519_export_private_raw_ex(&key, out, &outLen, endian); + if (ret == ECC_BAD_ARG_E) { + ret = 0; + } + } + + printf(resultFmt, ret == 0 ? passed : failed); + wc_curve25519_free(&key); + wc_FreeRng(&rng); +#endif + return ret; + +}/*END test_wc_curve25519_export_private_raw_ex*/ /* * Testing test_wc_curve25519_size. */ @@ -15386,7 +15809,6 @@ static int test_wc_curve25519_size (void) if (ret != 0) { ret = wc_curve25519_size(NULL); } - printf(resultFmt, ret == 0 ? passed : failed); wc_curve25519_free(&key); #endif @@ -15562,7 +15984,7 @@ static int test_wc_curve25519_export_key_raw (void) if( 0 == XMEMCMP(privateKey, prik, CURVE25519_KEYSIZE) && 0 == XMEMCMP(publicKey, pubk, CURVE25519_KEYSIZE)){ - printf(testingFmt,"passed"); + printf(resultFmt, passed ); fflush( stdout ); wc_curve25519_free(&key); wc_FreeRng(&rng); @@ -15587,8 +16009,7 @@ static int test_wc_curve25519_export_key_raw (void) return 1; } -#endif - printf(resultFmt, passed ); +#endif fflush( stdout ); return 0; @@ -16724,7 +17145,7 @@ static int test_wc_curve448_make_key (void) /* * Testing test_wc_curve448_shared_secret_ex */ -static int test_wc_curve448_shared_secret_ex (void) //ethan-3 +static int test_wc_curve448_shared_secret_ex (void) { int ret = 0; #if defined(HAVE_CURVE448) @@ -16741,16 +17162,12 @@ static int test_wc_curve448_shared_secret_ex (void) //ethan-3 ret = wc_InitRng(&rng); if (ret == 0){ ret = wc_curve448_make_key(&rng, CURVE448_KEY_SIZE, &private_key); - } - if (wc_FreeRng(&rng) && ret == 0) { - ret = WOLFSSL_FATAL_ERROR; } } if (ret == 0){ ret = wc_curve448_init(&public_key); } if (ret == 0) { - ret = wc_InitRng(&rng); if (ret == 0){ ret = wc_curve448_make_key(&rng, CURVE448_KEY_SIZE, &public_key); } @@ -16789,7 +17206,7 @@ static int test_wc_curve448_shared_secret_ex (void) //ethan-3 ret = 0; } } - if (ret == 0) { + if (ret == 0) { ret = wc_curve448_shared_secret_ex(&private_key, &public_key, out, NULL, endian); if (ret == BAD_FUNC_ARG) { @@ -17061,7 +17478,7 @@ static int test_wc_curve448_export_key_raw (void) printf(testingFmt, "wc_curve448_export_key_raw()"); - ret = wc_curve448_init(&key); + ret = wc_curve448_init(&key); if (ret == 0) { ret = wc_InitRng(&rng); } @@ -17085,9 +17502,7 @@ static int test_wc_curve448_export_key_raw (void) #endif return ret; -}/*END test_wc_curve448_import_private_raw_ex*/ - - +}/*END test_wc_curve448_export_key_raw*/ /* * Testing test_wc_curve448_import_private */ @@ -33810,6 +34225,13 @@ void ApiTest(void) AssertIntEQ(test_wc_curve25519_size(), 0); AssertIntEQ(test_wc_curve25519_export_key_raw(), 0); AssertIntEQ(test_wc_curve25519_export_key_raw_ex(), 0); + AssertIntEQ(test_wc_curve25519_size (), 0); + AssertIntEQ(test_wc_curve25519_make_key (), 0); + AssertIntEQ(test_wc_curve25519_shared_secret_ex (), 0); + AssertIntEQ(test_wc_curve25519_export_public_ex (), 0); + AssertIntEQ(test_wc_curve25519_export_private_raw_ex (), 0); + AssertIntEQ(test_wc_curve25519_import_private_raw_ex (), 0); + AssertIntEQ(test_wc_curve25519_import_private (), 0); AssertIntEQ(test_wc_ed448_make_key(), 0); AssertIntEQ(test_wc_ed448_init(), 0); AssertIntEQ(test_wc_ed448_sign_msg(), 0); From f526a1112642dafcc9b3094da84d2a773bf84e0f Mon Sep 17 00:00:00 2001 From: Ethan Looney Date: Wed, 1 Jul 2020 10:19:40 -0700 Subject: [PATCH 297/298] Added additional tests for curve25519 and fixed a print format error from previous tests --- tests/api.c | 1133 ++++++++++++++++++++++++++------------------------- 1 file changed, 567 insertions(+), 566 deletions(-) diff --git a/tests/api.c b/tests/api.c index 1eb34dcba..2714b371d 100644 --- a/tests/api.c +++ b/tests/api.c @@ -15362,6 +15362,568 @@ static int test_wc_curve25519_init (void) return ret; } /* END test_wc_curve25519_init and wc_curve_25519_free*/ +/* + * Testing test_wc_curve25519_size. + */ +static int test_wc_curve25519_size (void) +{ + int ret = 0; + +#if defined(HAVE_CURVE25519) + + curve25519_key key; + + printf(testingFmt, "wc_curve25519_size()"); + + ret = wc_curve25519_init(&key); + + /* Test good args for wc_curve25519_size */ + if (ret == 0) { + ret = wc_curve25519_size(&key); + } + + /* Test bad args for wc_curve25519_size */ + if (ret != 0) { + ret = wc_curve25519_size(NULL); + } + + printf(resultFmt, ret == 0 ? passed : failed); + wc_curve25519_free(&key); +#endif + return ret; + +} /* END test_wc_curve25519_size*/ + +/* + * Testing test_wc_curve25519_export_key_raw(). + */ +static int test_wc_curve25519_export_key_raw (void) +{ + +#if defined(HAVE_CURVE25519) && defined(HAVE_CURVE25519_KEY_EXPORT) + + curve25519_key key; + WC_RNG rng; + + byte privateKey[CURVE25519_KEYSIZE]; + byte publicKey[CURVE25519_KEYSIZE]; + word32 prvkSz; + word32 pubkSz; + + byte prik[CURVE25519_KEYSIZE]; + byte pubk[CURVE25519_KEYSIZE]; + word32 prksz; + word32 pbksz; + + printf(testingFmt, "wc_curve25519_export_key_raw()"); + + + if(0 != wc_InitRng(&rng)){ + printf(testingFmt, "failed due to wc_InitRng"); + fflush( stdout ); + return 1; + } + + if(0 != wc_curve25519_init(&key)){ + printf(testingFmt, "failed due to wc_curve25519_init"); + fflush( stdout ); + wc_FreeRng(&rng); + return 1; + } + + if(0 != wc_curve25519_make_key(&rng, CURVE25519_KEYSIZE, &key)){ + printf(testingFmt, "failed due to wc_curve25519_make_key"); + fflush( stdout ); + wc_curve25519_free(&key); + wc_FreeRng(&rng); + return 1; + } + + /* + bad-argument-test cases + target function sould return BAD_FUNC_ARG + */ + prvkSz = CURVE25519_KEYSIZE; + pubkSz = CURVE25519_KEYSIZE; + + if(BAD_FUNC_ARG != wc_curve25519_export_key_raw( + NULL , privateKey, &prvkSz, publicKey, &pubkSz)){ + + printf(testingFmt,"failed at bad-arg-case-1."); + fflush( stdout ); + wc_curve25519_free(&key); + wc_FreeRng(&rng); + return 1; + + } + + prvkSz = CURVE25519_KEYSIZE; + pubkSz = CURVE25519_KEYSIZE; + + if(BAD_FUNC_ARG != wc_curve25519_export_key_raw( + &key , NULL, &prvkSz, publicKey, &pubkSz)){ + + printf(testingFmt,"failed at bad-arg-case-2."); + fflush( stdout ); + wc_curve25519_free(&key); + wc_FreeRng(&rng); + return 1; + + } + + prvkSz = CURVE25519_KEYSIZE; + pubkSz = CURVE25519_KEYSIZE; + + if(BAD_FUNC_ARG != wc_curve25519_export_key_raw( + &key , privateKey, NULL, publicKey, &pubkSz)){ + + printf(testingFmt,"failed at bad-arg-case-3."); + fflush( stdout ); + wc_curve25519_free(&key); + wc_FreeRng(&rng); + return 1; + + } + + prvkSz = CURVE25519_KEYSIZE; + pubkSz = CURVE25519_KEYSIZE; + + if(BAD_FUNC_ARG != wc_curve25519_export_key_raw( + &key , privateKey, &prvkSz, NULL, &pubkSz)){ + + printf(testingFmt,"failed at bad-arg-case-4."); + fflush( stdout ); + wc_curve25519_free(&key); + wc_FreeRng(&rng); + return 1; + + } + + prvkSz = CURVE25519_KEYSIZE; + pubkSz = CURVE25519_KEYSIZE; + + if(BAD_FUNC_ARG != wc_curve25519_export_key_raw( + &key , privateKey, &prvkSz, publicKey, NULL )){ + + printf(testingFmt,"failed at bad-arg-case-5."); + fflush( stdout ); + wc_curve25519_free(&key); + wc_FreeRng(&rng); + return 1; + + } + + /* + cross-testing + */ + prksz = CURVE25519_KEYSIZE; + + if( 0 != wc_curve25519_export_private_raw(&key, prik, &prksz)){ + + printf(testingFmt,"failed due to wc_curve25519_export_private_raw"); + fflush( stdout ); + wc_curve25519_free(&key); + wc_FreeRng(&rng); + return 1; + + } + + pbksz = CURVE25519_KEYSIZE; + + if(0 != wc_curve25519_export_public(&key, pubk, &pbksz)){ + + printf(testingFmt,"failed due to wc_curve25519_export_public"); + fflush( stdout ); + wc_curve25519_free(&key); + wc_FreeRng(&rng); + return 1; + + } + + prvkSz = CURVE25519_KEYSIZE; + pubkSz = CURVE25519_KEYSIZE; + + if(0 != wc_curve25519_export_key_raw(&key, privateKey, &prvkSz, + publicKey, &pubkSz)){ + + printf(testingFmt,"failed due to wc_curve25519_export_key_raw"); + fflush( stdout ); + wc_curve25519_free(&key); + wc_FreeRng(&rng); + return 1; + + } + + if((prksz == CURVE25519_KEYSIZE) && + (pbksz == CURVE25519_KEYSIZE) && + (prvkSz == CURVE25519_KEYSIZE) && + (pubkSz == CURVE25519_KEYSIZE)){ + + if( 0 == XMEMCMP(privateKey, prik, CURVE25519_KEYSIZE) && + 0 == XMEMCMP(publicKey, pubk, CURVE25519_KEYSIZE)){ + + printf(resultFmt,passed); + fflush( stdout ); + wc_curve25519_free(&key); + wc_FreeRng(&rng); + return 0; + + } + else{ + + printf(testingFmt,"failed due to key-contents-inconsistency."); + fflush( stdout ); + wc_curve25519_free(&key); + wc_FreeRng(&rng); + return 1; + } + } + else{ + + printf(testingFmt,"failed due to bad-key-size."); + fflush( stdout ); + wc_curve25519_free(&key); + wc_FreeRng(&rng); + return 1; + } + +#endif + fflush( stdout ); + + return 0; +} /* end of test_wc_curve25519_export_key_raw */ + +/* + * Testing test_wc_curve25519_export_key_raw_ex(). + */ +static int test_wc_curve25519_export_key_raw_ex (void) +{ + +#if defined(HAVE_CURVE25519) && defined(HAVE_CURVE25519_KEY_EXPORT) + + curve25519_key key; + WC_RNG rng; + + byte privateKey[CURVE25519_KEYSIZE]; + byte publicKey[CURVE25519_KEYSIZE]; + word32 prvkSz; + word32 pubkSz; + + byte prik[CURVE25519_KEYSIZE]; + byte pubk[CURVE25519_KEYSIZE]; + word32 prksz; + word32 pbksz; + + printf(testingFmt, "wc_curve25519_export_key_raw_ex()"); + + if(0 != wc_InitRng(&rng)){ + printf(testingFmt, "failed due to wc_InitRng"); + fflush( stdout ); + return 1; + } + + if(0 != wc_curve25519_init(&key)){ + printf(testingFmt, "failed due to wc_curve25519_init"); + fflush( stdout ); + wc_FreeRng(&rng); + return 1; + } + + if(0 != wc_curve25519_make_key(&rng, CURVE25519_KEYSIZE, &key)){ + printf(testingFmt, "failed due to wc_curve25519_make_key"); + fflush( stdout ); + wc_curve25519_free(&key); + wc_FreeRng(&rng); + return 1; + } + + /* + bad-argument-test cases + target function sould return BAD_FUNC_ARG + */ + prvkSz = CURVE25519_KEYSIZE; + pubkSz = CURVE25519_KEYSIZE; + + if(BAD_FUNC_ARG != wc_curve25519_export_key_raw_ex( NULL , privateKey, + &prvkSz, publicKey, &pubkSz, EC25519_LITTLE_ENDIAN)){ + + printf(testingFmt,"failed at bad-arg-case-1."); + fflush( stdout ); + wc_curve25519_free(&key); + wc_FreeRng(&rng); + return 1; + + } + + prvkSz = CURVE25519_KEYSIZE; + pubkSz = CURVE25519_KEYSIZE; + + if(BAD_FUNC_ARG != wc_curve25519_export_key_raw_ex( &key , NULL, + &prvkSz, publicKey, &pubkSz, EC25519_LITTLE_ENDIAN)){ + + printf(testingFmt,"failed at bad-arg-case-2."); + fflush( stdout ); + wc_curve25519_free(&key); + wc_FreeRng(&rng); + return 1; + } + + prvkSz = CURVE25519_KEYSIZE; + pubkSz = CURVE25519_KEYSIZE; + + if(BAD_FUNC_ARG != wc_curve25519_export_key_raw_ex( &key,privateKey, + NULL,publicKey, &pubkSz,EC25519_LITTLE_ENDIAN)){ + + printf(testingFmt,"failed at bad-arg-case-3."); + fflush( stdout ); + wc_curve25519_free(&key); + wc_FreeRng(&rng); + return 1; + } + + prvkSz = CURVE25519_KEYSIZE; + pubkSz = CURVE25519_KEYSIZE; + + if(BAD_FUNC_ARG != wc_curve25519_export_key_raw_ex( &key, privateKey, + &prvkSz, NULL, &pubkSz, EC25519_LITTLE_ENDIAN)){ + + printf(testingFmt,"failed at bad-arg-case-4."); + fflush( stdout ); + wc_curve25519_free(&key); + wc_FreeRng(&rng); + return 1; + } + + prvkSz = CURVE25519_KEYSIZE; + pubkSz = CURVE25519_KEYSIZE; + + if(BAD_FUNC_ARG != wc_curve25519_export_key_raw_ex( &key, privateKey, + &prvkSz, publicKey, NULL, EC25519_LITTLE_ENDIAN)){ + + printf(testingFmt,"failed at bad-arg-case-5."); + fflush( stdout ); + wc_curve25519_free(&key); + wc_FreeRng(&rng); + return 1; + } + + prvkSz = CURVE25519_KEYSIZE; + pubkSz = CURVE25519_KEYSIZE; + + if(BAD_FUNC_ARG != wc_curve25519_export_key_raw_ex( NULL, privateKey, + &prvkSz, publicKey, &pubkSz, EC25519_BIG_ENDIAN)){ + + printf(testingFmt,"failed at bad-arg-case-6."); + fflush( stdout ); + wc_curve25519_free(&key); + wc_FreeRng(&rng); + return 1; + } + + prvkSz = CURVE25519_KEYSIZE; + pubkSz = CURVE25519_KEYSIZE; + + if(BAD_FUNC_ARG != wc_curve25519_export_key_raw_ex( &key, NULL, &prvkSz, + publicKey, &pubkSz, EC25519_BIG_ENDIAN)){ + + printf(testingFmt,"failed at bad-arg-case-7."); + fflush( stdout ); + wc_curve25519_free(&key); + wc_FreeRng(&rng); + return 1; + } + + prvkSz = CURVE25519_KEYSIZE; + pubkSz = CURVE25519_KEYSIZE; + + if(BAD_FUNC_ARG != wc_curve25519_export_key_raw_ex( &key, privateKey, + NULL, publicKey, &pubkSz, EC25519_BIG_ENDIAN)){ + + printf(testingFmt,"failed at bad-arg-case-8."); + fflush( stdout ); + wc_curve25519_free(&key); + wc_FreeRng(&rng); + return 1; + } + + prvkSz = CURVE25519_KEYSIZE; + pubkSz = CURVE25519_KEYSIZE; + + if(BAD_FUNC_ARG != wc_curve25519_export_key_raw_ex( &key, privateKey, + &prvkSz, NULL, &pubkSz, EC25519_BIG_ENDIAN)){ + + printf(testingFmt,"failed at bad-arg-case-9."); + fflush( stdout ); + wc_curve25519_free(&key); + wc_FreeRng(&rng); + return 1; + } + + prvkSz = CURVE25519_KEYSIZE; + pubkSz = CURVE25519_KEYSIZE; + + if(BAD_FUNC_ARG != wc_curve25519_export_key_raw_ex( &key, privateKey, + &prvkSz, publicKey, NULL, EC25519_BIG_ENDIAN)){ + + printf(testingFmt,"failed at bad-arg-case-10."); + fflush( stdout ); + wc_curve25519_free(&key); + wc_FreeRng(&rng); + return 1; + } + + /* illegal value for endien */ + + prvkSz = CURVE25519_KEYSIZE; + pubkSz = CURVE25519_KEYSIZE; + + if(BAD_FUNC_ARG != wc_curve25519_export_key_raw_ex( &key, privateKey, + &prvkSz, publicKey, NULL, EC25519_BIG_ENDIAN + 10 )){ + + printf(testingFmt,"failed at bad-arg-case-11."); + fflush( stdout ); + wc_curve25519_free(&key); + wc_FreeRng(&rng); + return 1; + } + + /* + cross-testing + */ + prksz = CURVE25519_KEYSIZE; + + if(0 != wc_curve25519_export_private_raw( &key, prik, &prksz )){ + + printf(testingFmt,"failed due to wc_curve25519_export_private_raw"); + fflush( stdout ); + wc_curve25519_free(&key); + wc_FreeRng(&rng); + return 1; + } + + pbksz = CURVE25519_KEYSIZE; + + if(0 != wc_curve25519_export_public( &key, pubk, &pbksz )){ + + printf(testingFmt,"failed due to wc_curve25519_export_public"); + fflush( stdout ); + wc_curve25519_free(&key); + wc_FreeRng(&rng); + return 1; + + } + + prvkSz = CURVE25519_KEYSIZE; + pubkSz = CURVE25519_KEYSIZE; + + if(0 != wc_curve25519_export_key_raw_ex( &key, privateKey, &prvkSz, + publicKey, &pubkSz, EC25519_BIG_ENDIAN)) { + + printf(testingFmt,"failed due to wc_curve25519_export_key_raw_ex"); + fflush( stdout ); + wc_curve25519_free(&key); + wc_FreeRng(&rng); + return 1; + } + + if( prksz == CURVE25519_KEYSIZE && + pbksz == CURVE25519_KEYSIZE && + prvkSz == CURVE25519_KEYSIZE && + pubkSz == CURVE25519_KEYSIZE ){ + + if( 0 == XMEMCMP( privateKey, prik, CURVE25519_KEYSIZE ) && + 0 == XMEMCMP( publicKey, pubk, CURVE25519_KEYSIZE )){ + + if( 0 == wc_curve25519_export_key_raw_ex( &key, privateKey, + &prvkSz, publicKey, &pubkSz, EC25519_LITTLE_ENDIAN)){ + + if( prvkSz == CURVE25519_KEYSIZE && + pubkSz == CURVE25519_KEYSIZE ){ + + ; /* proceed to the next test */ + } + else{ + + printf(testingFmt,"failed due to key-size-inconsistency"); + fflush( stdout ); + wc_curve25519_free(&key); + wc_FreeRng(&rng); + return 1; + } + } + else{ + + printf(testingFmt, + "failed due to wc_curve25519_export_key_raw_ex"); + fflush( stdout ); + wc_curve25519_free(&key); + wc_FreeRng(&rng); + return 1; + + } + } + else{ + + printf(testingFmt,"failed due to key-contents-inconsistency"); + fflush( stdout ); + wc_curve25519_free(&key); + wc_FreeRng(&rng); + return 1; + + } + } + else{ + + printf(testingFmt,"failed due to bad-key-size"); + fflush( stdout ); + wc_curve25519_free(&key); + wc_FreeRng(&rng); + return 1; + } + + /* + try once with another endian + */ + + prvkSz = CURVE25519_KEYSIZE; + pubkSz = CURVE25519_KEYSIZE; + + if( 0 == wc_curve25519_export_key_raw_ex( &key, privateKey, + &prvkSz, publicKey, &pubkSz, EC25519_BIG_ENDIAN)){ + + if( prvkSz == CURVE25519_KEYSIZE && + pubkSz == CURVE25519_KEYSIZE ){ + + /* no more test*/ + printf(resultFmt, passed ); + fflush( stdout ); + wc_curve25519_free(&key); + wc_FreeRng(&rng); + return 0; + } + else{ + + printf(testingFmt,"failed due to key-size-inconsistency"); + fflush( stdout ); + wc_curve25519_free(&key); + wc_FreeRng(&rng); + return 1; + } + } + else{ + + printf(testingFmt, + "failed due to wc_curve25519_export_key_raw_ex(BIGENDIAN)"); + fflush( stdout ); + wc_curve25519_free(&key); + wc_FreeRng(&rng); + return 1; + + } + +#endif + return 0; +} /* end of test_wc_curve25519_export_key_raw_ex */ /* * Testing wc_curve25519_make_key */ @@ -15785,567 +16347,6 @@ static int test_wc_curve25519_export_private_raw_ex (void) return ret; }/*END test_wc_curve25519_export_private_raw_ex*/ -/* - * Testing test_wc_curve25519_size. - */ -static int test_wc_curve25519_size (void) -{ - int ret = 0; - -#if defined(HAVE_CURVE25519) - - curve25519_key key; - - printf(testingFmt, "wc_curve25519_size()"); - - ret = wc_curve25519_init(&key); - - /* Test good args for wc_curve25519_size */ - if (ret == 0) { - ret = wc_curve25519_size(&key); - } - - /* Test bad args for wc_curve25519_size */ - if (ret != 0) { - ret = wc_curve25519_size(NULL); - } - printf(resultFmt, ret == 0 ? passed : failed); - wc_curve25519_free(&key); -#endif - return ret; - -} /* END test_wc_curve25519_size*/ - -/* - * Testing test_wc_curve25519_export_key_raw(). - */ -static int test_wc_curve25519_export_key_raw (void) -{ - -#if defined(HAVE_CURVE25519) && defined(HAVE_CURVE25519_KEY_EXPORT) - - curve25519_key key; - WC_RNG rng; - - byte privateKey[CURVE25519_KEYSIZE]; - byte publicKey[CURVE25519_KEYSIZE]; - word32 prvkSz; - word32 pubkSz; - - byte prik[CURVE25519_KEYSIZE]; - byte pubk[CURVE25519_KEYSIZE]; - word32 prksz; - word32 pbksz; - - printf(testingFmt, "wc_curve25519_export_key_raw()"); - - - if(0 != wc_InitRng(&rng)){ - printf(testingFmt, "failed due to wc_InitRng"); - fflush( stdout ); - return 1; - } - - if(0 != wc_curve25519_init(&key)){ - printf(testingFmt, "failed due to wc_curve25519_init"); - fflush( stdout ); - wc_FreeRng(&rng); - return 1; - } - - if(0 != wc_curve25519_make_key(&rng, CURVE25519_KEYSIZE, &key)){ - printf(testingFmt, "failed due to wc_curve25519_make_key"); - fflush( stdout ); - wc_curve25519_free(&key); - wc_FreeRng(&rng); - return 1; - } - - /* - bad-argument-test cases - target function sould return BAD_FUNC_ARG - */ - prvkSz = CURVE25519_KEYSIZE; - pubkSz = CURVE25519_KEYSIZE; - - if(BAD_FUNC_ARG != wc_curve25519_export_key_raw( - NULL , privateKey, &prvkSz, publicKey, &pubkSz)){ - - printf(testingFmt,"failed at bad-arg-case-1."); - fflush( stdout ); - wc_curve25519_free(&key); - wc_FreeRng(&rng); - return 1; - - } - - prvkSz = CURVE25519_KEYSIZE; - pubkSz = CURVE25519_KEYSIZE; - - if(BAD_FUNC_ARG != wc_curve25519_export_key_raw( - &key , NULL, &prvkSz, publicKey, &pubkSz)){ - - printf(testingFmt,"failed at bad-arg-case-2."); - fflush( stdout ); - wc_curve25519_free(&key); - wc_FreeRng(&rng); - return 1; - - } - - prvkSz = CURVE25519_KEYSIZE; - pubkSz = CURVE25519_KEYSIZE; - - if(BAD_FUNC_ARG != wc_curve25519_export_key_raw( - &key , privateKey, NULL, publicKey, &pubkSz)){ - - printf(testingFmt,"failed at bad-arg-case-3."); - fflush( stdout ); - wc_curve25519_free(&key); - wc_FreeRng(&rng); - return 1; - - } - - prvkSz = CURVE25519_KEYSIZE; - pubkSz = CURVE25519_KEYSIZE; - - if(BAD_FUNC_ARG != wc_curve25519_export_key_raw( - &key , privateKey, &prvkSz, NULL, &pubkSz)){ - - printf(testingFmt,"failed at bad-arg-case-4."); - fflush( stdout ); - wc_curve25519_free(&key); - wc_FreeRng(&rng); - return 1; - - } - - prvkSz = CURVE25519_KEYSIZE; - pubkSz = CURVE25519_KEYSIZE; - - if(BAD_FUNC_ARG != wc_curve25519_export_key_raw( - &key , privateKey, &prvkSz, publicKey, NULL )){ - - printf(testingFmt,"failed at bad-arg-case-5."); - fflush( stdout ); - wc_curve25519_free(&key); - wc_FreeRng(&rng); - return 1; - - } - - /* - cross-testing - */ - prksz = CURVE25519_KEYSIZE; - - if( 0 != wc_curve25519_export_private_raw(&key, prik, &prksz)){ - - printf(testingFmt,"failed due to wc_curve25519_export_private_raw"); - fflush( stdout ); - wc_curve25519_free(&key); - wc_FreeRng(&rng); - return 1; - - } - - pbksz = CURVE25519_KEYSIZE; - - if(0 != wc_curve25519_export_public(&key, pubk, &pbksz)){ - - printf(testingFmt,"failed due to wc_curve25519_export_public"); - fflush( stdout ); - wc_curve25519_free(&key); - wc_FreeRng(&rng); - return 1; - - } - - prvkSz = CURVE25519_KEYSIZE; - pubkSz = CURVE25519_KEYSIZE; - - if(0 != wc_curve25519_export_key_raw(&key, privateKey, &prvkSz, - publicKey, &pubkSz)){ - - printf(testingFmt,"failed due to wc_curve25519_export_key_raw"); - fflush( stdout ); - wc_curve25519_free(&key); - wc_FreeRng(&rng); - return 1; - - } - - if((prksz == CURVE25519_KEYSIZE) && - (pbksz == CURVE25519_KEYSIZE) && - (prvkSz == CURVE25519_KEYSIZE) && - (pubkSz == CURVE25519_KEYSIZE)){ - - if( 0 == XMEMCMP(privateKey, prik, CURVE25519_KEYSIZE) && - 0 == XMEMCMP(publicKey, pubk, CURVE25519_KEYSIZE)){ - - printf(resultFmt, passed ); - fflush( stdout ); - wc_curve25519_free(&key); - wc_FreeRng(&rng); - return 0; - - } - else{ - - printf(testingFmt,"failed due to key-contents-inconsistency."); - fflush( stdout ); - wc_curve25519_free(&key); - wc_FreeRng(&rng); - return 1; - } - } - else{ - - printf(testingFmt,"failed due to bad-key-size."); - fflush( stdout ); - wc_curve25519_free(&key); - wc_FreeRng(&rng); - return 1; - } - -#endif - fflush( stdout ); - - return 0; -} /* end of test_wc_curve25519_export_key_raw */ - -/* - * Testing test_wc_curve25519_export_key_raw_ex(). - */ -static int test_wc_curve25519_export_key_raw_ex (void) -{ - -#if defined(HAVE_CURVE25519) && defined(HAVE_CURVE25519_KEY_EXPORT) - - curve25519_key key; - WC_RNG rng; - - byte privateKey[CURVE25519_KEYSIZE]; - byte publicKey[CURVE25519_KEYSIZE]; - word32 prvkSz; - word32 pubkSz; - - byte prik[CURVE25519_KEYSIZE]; - byte pubk[CURVE25519_KEYSIZE]; - word32 prksz; - word32 pbksz; - - printf(testingFmt, "wc_curve25519_export_key_raw_ex()"); - - if(0 != wc_InitRng(&rng)){ - printf(testingFmt, "failed due to wc_InitRng"); - fflush( stdout ); - return 1; - } - - if(0 != wc_curve25519_init(&key)){ - printf(testingFmt, "failed due to wc_curve25519_init"); - fflush( stdout ); - wc_FreeRng(&rng); - return 1; - } - - if(0 != wc_curve25519_make_key(&rng, CURVE25519_KEYSIZE, &key)){ - printf(testingFmt, "failed due to wc_curve25519_make_key"); - fflush( stdout ); - wc_curve25519_free(&key); - wc_FreeRng(&rng); - return 1; - } - - /* - bad-argument-test cases - target function sould return BAD_FUNC_ARG - */ - prvkSz = CURVE25519_KEYSIZE; - pubkSz = CURVE25519_KEYSIZE; - - if(BAD_FUNC_ARG != wc_curve25519_export_key_raw_ex( NULL , privateKey, - &prvkSz, publicKey, &pubkSz, EC25519_LITTLE_ENDIAN)){ - - printf(testingFmt,"failed at bad-arg-case-1."); - fflush( stdout ); - wc_curve25519_free(&key); - wc_FreeRng(&rng); - return 1; - - } - - prvkSz = CURVE25519_KEYSIZE; - pubkSz = CURVE25519_KEYSIZE; - - if(BAD_FUNC_ARG != wc_curve25519_export_key_raw_ex( &key , NULL, - &prvkSz, publicKey, &pubkSz, EC25519_LITTLE_ENDIAN)){ - - printf(testingFmt,"failed at bad-arg-case-2."); - fflush( stdout ); - wc_curve25519_free(&key); - wc_FreeRng(&rng); - return 1; - } - - prvkSz = CURVE25519_KEYSIZE; - pubkSz = CURVE25519_KEYSIZE; - - if(BAD_FUNC_ARG != wc_curve25519_export_key_raw_ex( &key,privateKey, - NULL,publicKey, &pubkSz,EC25519_LITTLE_ENDIAN)){ - - printf(testingFmt,"failed at bad-arg-case-3."); - fflush( stdout ); - wc_curve25519_free(&key); - wc_FreeRng(&rng); - return 1; - } - - prvkSz = CURVE25519_KEYSIZE; - pubkSz = CURVE25519_KEYSIZE; - - if(BAD_FUNC_ARG != wc_curve25519_export_key_raw_ex( &key, privateKey, - &prvkSz, NULL, &pubkSz, EC25519_LITTLE_ENDIAN)){ - - printf(testingFmt,"failed at bad-arg-case-4."); - fflush( stdout ); - wc_curve25519_free(&key); - wc_FreeRng(&rng); - return 1; - } - - prvkSz = CURVE25519_KEYSIZE; - pubkSz = CURVE25519_KEYSIZE; - - if(BAD_FUNC_ARG != wc_curve25519_export_key_raw_ex( &key, privateKey, - &prvkSz, publicKey, NULL, EC25519_LITTLE_ENDIAN)){ - - printf(testingFmt,"failed at bad-arg-case-5."); - fflush( stdout ); - wc_curve25519_free(&key); - wc_FreeRng(&rng); - return 1; - } - - prvkSz = CURVE25519_KEYSIZE; - pubkSz = CURVE25519_KEYSIZE; - - if(BAD_FUNC_ARG != wc_curve25519_export_key_raw_ex( NULL, privateKey, - &prvkSz, publicKey, &pubkSz, EC25519_BIG_ENDIAN)){ - - printf(testingFmt,"failed at bad-arg-case-6."); - fflush( stdout ); - wc_curve25519_free(&key); - wc_FreeRng(&rng); - return 1; - } - - prvkSz = CURVE25519_KEYSIZE; - pubkSz = CURVE25519_KEYSIZE; - - if(BAD_FUNC_ARG != wc_curve25519_export_key_raw_ex( &key, NULL, &prvkSz, - publicKey, &pubkSz, EC25519_BIG_ENDIAN)){ - - printf(testingFmt,"failed at bad-arg-case-7."); - fflush( stdout ); - wc_curve25519_free(&key); - wc_FreeRng(&rng); - return 1; - } - - prvkSz = CURVE25519_KEYSIZE; - pubkSz = CURVE25519_KEYSIZE; - - if(BAD_FUNC_ARG != wc_curve25519_export_key_raw_ex( &key, privateKey, - NULL, publicKey, &pubkSz, EC25519_BIG_ENDIAN)){ - - printf(testingFmt,"failed at bad-arg-case-8."); - fflush( stdout ); - wc_curve25519_free(&key); - wc_FreeRng(&rng); - return 1; - } - - prvkSz = CURVE25519_KEYSIZE; - pubkSz = CURVE25519_KEYSIZE; - - if(BAD_FUNC_ARG != wc_curve25519_export_key_raw_ex( &key, privateKey, - &prvkSz, NULL, &pubkSz, EC25519_BIG_ENDIAN)){ - - printf(testingFmt,"failed at bad-arg-case-9."); - fflush( stdout ); - wc_curve25519_free(&key); - wc_FreeRng(&rng); - return 1; - } - - prvkSz = CURVE25519_KEYSIZE; - pubkSz = CURVE25519_KEYSIZE; - - if(BAD_FUNC_ARG != wc_curve25519_export_key_raw_ex( &key, privateKey, - &prvkSz, publicKey, NULL, EC25519_BIG_ENDIAN)){ - - printf(testingFmt,"failed at bad-arg-case-10."); - fflush( stdout ); - wc_curve25519_free(&key); - wc_FreeRng(&rng); - return 1; - } - - /* illegal value for endien */ - - prvkSz = CURVE25519_KEYSIZE; - pubkSz = CURVE25519_KEYSIZE; - - if(BAD_FUNC_ARG != wc_curve25519_export_key_raw_ex( &key, privateKey, - &prvkSz, publicKey, NULL, EC25519_BIG_ENDIAN + 10 )){ - - printf(testingFmt,"failed at bad-arg-case-11."); - fflush( stdout ); - wc_curve25519_free(&key); - wc_FreeRng(&rng); - return 1; - } - - /* - cross-testing - */ - prksz = CURVE25519_KEYSIZE; - - if(0 != wc_curve25519_export_private_raw( &key, prik, &prksz )){ - - printf(testingFmt,"failed due to wc_curve25519_export_private_raw"); - fflush( stdout ); - wc_curve25519_free(&key); - wc_FreeRng(&rng); - return 1; - } - - pbksz = CURVE25519_KEYSIZE; - - if(0 != wc_curve25519_export_public( &key, pubk, &pbksz )){ - - printf(testingFmt,"failed due to wc_curve25519_export_public"); - fflush( stdout ); - wc_curve25519_free(&key); - wc_FreeRng(&rng); - return 1; - - } - - prvkSz = CURVE25519_KEYSIZE; - pubkSz = CURVE25519_KEYSIZE; - - if(0 != wc_curve25519_export_key_raw_ex( &key, privateKey, &prvkSz, - publicKey, &pubkSz, EC25519_BIG_ENDIAN)) { - - printf(testingFmt,"failed due to wc_curve25519_export_key_raw_ex"); - fflush( stdout ); - wc_curve25519_free(&key); - wc_FreeRng(&rng); - return 1; - } - - if( prksz == CURVE25519_KEYSIZE && - pbksz == CURVE25519_KEYSIZE && - prvkSz == CURVE25519_KEYSIZE && - pubkSz == CURVE25519_KEYSIZE ){ - - if( 0 == XMEMCMP( privateKey, prik, CURVE25519_KEYSIZE ) && - 0 == XMEMCMP( publicKey, pubk, CURVE25519_KEYSIZE )){ - - if( 0 == wc_curve25519_export_key_raw_ex( &key, privateKey, - &prvkSz, publicKey, &pubkSz, EC25519_LITTLE_ENDIAN)){ - - if( prvkSz == CURVE25519_KEYSIZE && - pubkSz == CURVE25519_KEYSIZE ){ - - ; /* proceed to the next test */ - } - else{ - - printf(testingFmt,"failed due to key-size-inconsistency"); - fflush( stdout ); - wc_curve25519_free(&key); - wc_FreeRng(&rng); - return 1; - } - } - else{ - - printf(testingFmt, - "failed due to wc_curve25519_export_key_raw_ex"); - fflush( stdout ); - wc_curve25519_free(&key); - wc_FreeRng(&rng); - return 1; - - } - } - else{ - - printf(testingFmt,"failed due to key-contents-inconsistency"); - fflush( stdout ); - wc_curve25519_free(&key); - wc_FreeRng(&rng); - return 1; - - } - } - else{ - - printf(testingFmt,"failed due to bad-key-size"); - fflush( stdout ); - wc_curve25519_free(&key); - wc_FreeRng(&rng); - return 1; - } - - /* - try once with another endian - */ - - prvkSz = CURVE25519_KEYSIZE; - pubkSz = CURVE25519_KEYSIZE; - - if( 0 == wc_curve25519_export_key_raw_ex( &key, privateKey, - &prvkSz, publicKey, &pubkSz, EC25519_BIG_ENDIAN)){ - - if( prvkSz == CURVE25519_KEYSIZE && - pubkSz == CURVE25519_KEYSIZE ){ - - /* no more test*/ - printf(resultFmt, passed ); - fflush( stdout ); - wc_curve25519_free(&key); - wc_FreeRng(&rng); - return 0; - } - else{ - - printf(testingFmt,"failed due to key-size-inconsistency"); - fflush( stdout ); - wc_curve25519_free(&key); - wc_FreeRng(&rng); - return 1; - } - } - else{ - - printf(testingFmt, - "failed due to wc_curve25519_export_key_raw_ex(BIGENDIAN)"); - fflush( stdout ); - wc_curve25519_free(&key); - wc_FreeRng(&rng); - return 1; - - } - -#endif - return 0; -} /* end of test_wc_curve25519_export_key_raw_ex */ /* * Testing wc_ed448_make_key(). */ @@ -17162,7 +17163,7 @@ static int test_wc_curve448_shared_secret_ex (void) ret = wc_InitRng(&rng); if (ret == 0){ ret = wc_curve448_make_key(&rng, CURVE448_KEY_SIZE, &private_key); - } + } } if (ret == 0){ ret = wc_curve448_init(&public_key); @@ -17206,7 +17207,7 @@ static int test_wc_curve448_shared_secret_ex (void) ret = 0; } } - if (ret == 0) { + if (ret == 0) { ret = wc_curve448_shared_secret_ex(&private_key, &public_key, out, NULL, endian); if (ret == BAD_FUNC_ARG) { @@ -17229,8 +17230,6 @@ static int test_wc_curve448_shared_secret_ex (void) #endif return ret; } /*END test_wc_curve448_shared_secret_ex*/ - - /* * Testing test_wc_curve448_export_public_ex */ @@ -17502,7 +17501,9 @@ static int test_wc_curve448_export_key_raw (void) #endif return ret; -}/*END test_wc_curve448_export_key_raw*/ +}/*END test_wc_curve448_import_private_raw_ex*/ + + /* * Testing test_wc_curve448_import_private */ From 3242fa36690842cae079fc6b080d4ceb886581a8 Mon Sep 17 00:00:00 2001 From: Ethan Looney Date: Wed, 1 Jul 2020 16:01:50 -0700 Subject: [PATCH 298/298] Fixed formatting, redundant if's and added a comment explaining why a value was chosen. --- tests/api.c | 37 +++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/tests/api.c b/tests/api.c index 2714b371d..d17faec91 100644 --- a/tests/api.c +++ b/tests/api.c @@ -15931,9 +15931,9 @@ static int test_wc_curve25519_make_key (void) { int ret = 0; #if defined(HAVE_CURVE25519) - WC_RNG rng; + WC_RNG rng; curve25519_key key; - int keysize; + int keysize; printf(testingFmt, "wc_curve25519_make_key()"); @@ -16006,13 +16006,12 @@ static int test_wc_curve25519_shared_secret_ex (void) if (ret == 0) { ret = wc_InitRng(&rng); if (ret == 0) { - ret = wc_curve25519_make_key(&rng, CURVE25519_KEYSIZE, &private_key); + ret = wc_curve25519_make_key(&rng, CURVE25519_KEYSIZE, &private_key); } } if (ret == 0) { - if (ret == 0) { - ret = wc_curve25519_make_key(&rng, CURVE25519_KEYSIZE, &public_key); - } + ret = wc_curve25519_make_key(&rng, CURVE25519_KEYSIZE, &public_key); + } if (ret == 0) { ret = wc_curve25519_shared_secret_ex(&private_key, &public_key, out, @@ -16056,6 +16055,8 @@ static int test_wc_curve25519_shared_secret_ex (void) } if (ret == 0) { + /*curve25519.c is checking for public_key size less than or equal to 0x7f, + *increasing to 0x8f checks for error being returned*/ public_key.p.point[CURVE25519_KEYSIZE-1] = 0x8F; ret = wc_curve25519_shared_secret_ex(&private_key, &public_key, out, &outLen, endian); @@ -16089,11 +16090,11 @@ static int test_wc_curve25519_export_public_ex (void) int ret = 0; #if defined(HAVE_CURVE25519) - WC_RNG rng; + WC_RNG rng; curve25519_key key; - byte out[CURVE25519_KEYSIZE]; - word32 outLen = sizeof(out); - int endian = EC25519_BIG_ENDIAN; + byte out[CURVE25519_KEYSIZE]; + word32 outLen = sizeof(out); + int endian = EC25519_BIG_ENDIAN; printf(testingFmt, "wc_curve25519_export_public_ex()"); @@ -16158,8 +16159,8 @@ static int test_wc_curve25519_import_private_raw_ex (void) { int ret = 0; #if defined(HAVE_CURVE25519) - WC_RNG rng; - curve25519_key key; + WC_RNG rng; + curve25519_key key; byte priv[CURVE25519_KEYSIZE]; byte pub[CURVE25519_KEYSIZE]; word32 privSz = sizeof(priv); @@ -16181,7 +16182,7 @@ static int test_wc_curve25519_import_private_raw_ex (void) } if (ret == 0){ ret = wc_curve25519_export_public(&key, pub, &pubSz); - } + } if (ret == 0) { ret = wc_curve25519_import_private_raw_ex(priv, privSz, pub, pubSz, &key, endian); @@ -16251,7 +16252,7 @@ static int test_wc_curve25519_import_private (void) int ret = 0; #if defined(HAVE_CURVE25519) - curve25519_key key; + curve25519_key key; WC_RNG rng; byte priv[CURVE25519_KEYSIZE]; word32 privSz = sizeof(priv); @@ -16288,11 +16289,11 @@ static int test_wc_curve25519_export_private_raw_ex (void) int ret = 0; #if defined(HAVE_CURVE25519) - WC_RNG rng; + WC_RNG rng; curve25519_key key; - byte out[CURVE25519_KEYSIZE]; - word32 outLen = sizeof(out); - int endian = EC25519_BIG_ENDIAN; + byte out[CURVE25519_KEYSIZE]; + word32 outLen = sizeof(out); + int endian = EC25519_BIG_ENDIAN; printf(testingFmt, "wc_curve25519_export_private_raw_ex()");