diff --git a/ChangeLog.md b/ChangeLog.md
index 48a5fc079..897809aca 100644
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,15 +1,153 @@
-# wolfSSL Release X.X.X (To Be Determined / Work in Progress)
+# 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.
+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.1 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
+ * Place holder.
-##### Improvements/Optimizations
+## 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
+info@ address.
+
+Release 4.4.0 of wolfSSL embedded TLS has bug fixes and new features including:
+
+## New Feature Additions
+
+* Hexagon support.
+* 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.
+* 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.
+* Add Renesas Synergy S7G2 build and hardware acceleration.
+
+## Fixes
+
+* Fix for RSA public encrypt / private sign with RSA key sizes over 2048-bit.
+* Correct misspellings.
+* 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.
+* 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 of AES encrypt/decrypt.
+* Support IAR with position independent code (ROPI).
+* Improve speed of AArch64 assembly.
+* Support AES-CTR on esp32.
+* Add a no malloc option for small SP math.
+
+## 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 - keygen, calc shared secret, sign.
+ 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
+ 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/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/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/Inc/user_settings.h b/IDE/OPENSTM32/Inc/user_settings.h
deleted file mode 100644
index 7ff0e7e43..000000000
--- a/IDE/OPENSTM32/Inc/user_settings.h
+++ /dev/null
@@ -1,473 +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
-
-
-/* ------------------------------------------------------------------------- */
-/* 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/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
old mode 100755
new mode 100644
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
old mode 100755
new mode 100644
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
old mode 100755
new mode 100644
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/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/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/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..c9a65f052
--- /dev/null
+++ b/IDE/STM32Cube/include.am
@@ -0,0 +1,18 @@
+# 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/STM32H753.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..063db0b5d
--- /dev/null
+++ b/IDE/STM32Cube/wolfSSL.wolfSSL_conf.h
@@ -0,0 +1,543 @@
+/* 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(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
+ #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/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
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/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
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/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/OPENSTM32/.project b/IDE/XilinxSDK/2019_2/wolfCrypt_example_system/.project
similarity index 76%
rename from IDE/OPENSTM32/.project
rename to IDE/XilinxSDK/2019_2/wolfCrypt_example_system/.project
index f4d367236..004363c50 100644
--- a/IDE/OPENSTM32/.project
+++ b/IDE/XilinxSDK/2019_2/wolfCrypt_example_system/.project
@@ -1,27 +1,28 @@
-
-
- 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
-
-
+
+
+ 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/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/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..32d47e4c2 100644
--- a/IDE/XilinxSDK/include.am
+++ b/IDE/XilinxSDK/include.am
@@ -5,6 +5,12 @@
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
+EXTRA_DIST+= IDE/XilinxSDK/2019_2/wolfCrypt_example_system/wolfCrypt_example_system.sprj
diff --git a/IDE/include.am b/IDE/include.am
index 41ee002a9..1372979ff 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
@@ -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/Renesas/e2studio/GR-ROSE/include.am
include IDE/WICED-STUDIO/include.am
include IDE/CRYPTOCELL/include.am
diff --git a/README b/README
index dcaf84dba..a5b36246a 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,126 @@ should be used for the enum name.
*** end Notes ***
-********* wolfSSL Release 4.3.0 (12/20/2019)
+# 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.
+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 to offload ECC verify operations.
+* 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.
+* Add Renesas Synergy S7G2 build and hardware acceleration.
-***** 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.
+* Correct misspellings.
+* 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.
+* 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 of AES encrypt/decrypt.
+* Support IAR with position independent code (ROPI).
+* Improve speed of AArch64 assembly.
+* Support AES-CTR on esp32.
+* Add a no malloc option for small SP math.
+## This release of wolfSSL includes fixes for 2 security vulnerabilities.
-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 - keygen, calc shared secret, sign.
+ 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.
-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.
+* 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 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 +203,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 +216,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..a5b36246a 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,126 @@ should be used for the enum name.
*** end Notes ***
-# wolfSSL Release 4.3.0 (12/20/2019)
+# 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.
+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 to offload ECC verify operations.
+* 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.
+* Add Renesas Synergy S7G2 build and hardware acceleration.
-##### 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.
+* Correct misspellings.
+* 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.
+* 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 of AES encrypt/decrypt.
+* Support IAR with position independent code (ROPI).
+* Improve speed of AArch64 assembly.
+* Support AES-CTR on esp32.
+* Add a no malloc option for small SP math.
+## This release of wolfSSL includes fixes for 2 security vulnerabilities.
-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 - keygen, calc shared secret, sign.
+ 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.
-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.
+* 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 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 +203,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 +216,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/certs/1024/ca-cert.der b/certs/1024/ca-cert.der
index 6a2b06e40..5b350c07a 100644
Binary files a/certs/1024/ca-cert.der and b/certs/1024/ca-cert.der differ
diff --git a/certs/1024/ca-cert.pem b/certs/1024/ca-cert.pem
index 6f8a188f3..20862103a 100644
--- a/certs/1024/ca-cert.pem
+++ b/certs/1024/ca-cert.pem
@@ -1,16 +1,17 @@
Certificate:
Data:
Version: 3 (0x2)
- Serial Number: 15779322327764802375 (0xdafb6a0dfecf9b47)
- Signature Algorithm: sha256WithRSAEncryption
- Issuer: C=US, ST=Montana, L=Bozeman, O=Sawtooth, OU=Consulting_1024, CN=www.wolfssl.com/emailAddress=info@wolfssl.com
+ Serial Number:
+ 51:08:0e:66:59:26:e1:9b:ec:b2:c8:61:15:35:41:9d:4d:e9:8a:ea
+ Signature Algorithm: sha256WithRSAEncryption
+ Issuer: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting_1024, 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=Sawtooth, OU=Consulting_1024, 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_1024, CN = www.wolfssl.com, emailAddress = info@wolfssl.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
- Public-Key: (1024 bit)
+ RSA Public-Key: (1024 bit)
Modulus:
00:cd:ac:dd:47:ec:be:b7:24:c3:63:1b:54:98:79:
e1:c7:31:16:59:d6:9d:77:9d:8d:e2:8b:ed:04:17:
@@ -28,38 +29,41 @@ Certificate:
X509v3 Authority Key Identifier:
keyid:D3:22:8F:28:2C:E0:05:EE:D3:ED:C3:71:3D:C9:B2:36:3A:1D:BF:A8
DirName:/C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting_1024/CN=www.wolfssl.com/emailAddress=info@wolfssl.com
- serial:DA:FB:6A:0D:FE:CF:9B:47
+ serial:51:08:0E:66:59:26:E1:9B:EC:B2:C8:61:15:35:41:9D:4D:E9:8A:EA
X509v3 Basic Constraints:
CA:TRUE
+ X509v3 Subject Alternative Name:
+ DNS:example.com, IP Address:127.0.0.1
Signature Algorithm: sha256WithRSAEncryption
- 1d:48:f6:40:41:04:06:f2:e4:72:2f:ea:ff:c1:67:6b:15:bb:
- 0a:28:23:28:07:c6:d7:13:2c:be:00:00:ac:1d:f7:f4:92:d3:
- 2b:af:23:eb:9f:1a:e2:11:3c:2d:97:f2:0f:ac:ae:97:86:0a:
- fb:a8:4f:74:1b:de:19:51:db:cd:e2:11:38:c1:a4:9d:56:ab:
- 47:5c:de:ba:eb:27:df:6d:c8:7e:3a:bd:2e:9b:2a:ad:22:3b:
- 95:a9:f2:28:03:bc:e5:ec:cc:f2:08:d4:c8:2f:db:ea:fb:2e:
- 52:16:8c:42:02:a4:59:6d:4c:33:b4:9a:d2:73:4a:1e:9f:d9:
- c8:83
+ bb:85:81:52:e4:7e:d9:40:36:97:7f:e1:db:fe:8e:1f:e5:f4:
+ d8:05:8e:25:43:6a:f2:6f:5f:d2:5c:b8:f0:a2:71:16:b7:87:
+ 0c:53:d5:50:94:4a:89:ca:d7:a3:f1:db:bc:03:44:34:84:f9:
+ cb:98:a8:3c:cd:a1:1c:95:19:d0:48:ae:b3:59:70:52:2b:19:
+ 02:05:35:b5:5c:7a:a9:1e:5e:53:74:1d:70:ee:fc:eb:0e:64:
+ 6a:5c:50:7e:87:9e:85:8f:21:c3:39:83:e2:ce:62:88:7b:72:
+ 74:50:09:7b:c6:1d:8f:33:82:ae:3f:6f:11:11:42:dc:c5:bd:
+ b8:3f
-----BEGIN CERTIFICATE-----
-MIIDtTCCAx6gAwIBAgIJANr7ag3+z5tHMA0GCSqGSIb3DQEBCwUAMIGZMQswCQYD
-VQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjERMA8G
-A1UECgwIU2F3dG9vdGgxGDAWBgNVBAsMD0NvbnN1bHRpbmdfMTAyNDEYMBYGA1UE
-AwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu
-Y29tMB4XDTE4MDQxMzE1MjMxMFoXDTIxMDEwNzE1MjMxMFowgZkxCzAJBgNVBAYT
-AlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMREwDwYDVQQK
-DAhTYXd0b290aDEYMBYGA1UECwwPQ29uc3VsdGluZ18xMDI0MRgwFgYDVQQDDA93
-d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20w
-gZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM2s3Ufsvrckw2MbVJh54ccxFlnW
-nXedjeKL7QQXssbr5JuRvjFQYpdYtX8p3rNxJAu/lwl/Jtwt7KgusmQreis1GS2i
-gMuZ/ZRxGyONVNsuYo2BCC30JHInbPnJjttMdbqbAfg/GPTmf/tXlJLMiMS0AMKq
-1OWIGLMRL3PA1ikJAgMBAAGjggEBMIH+MB0GA1UdDgQWBBTTIo8oLOAF7tPtw3E9
-ybI2Oh2/qDCBzgYDVR0jBIHGMIHDgBTTIo8oLOAF7tPtw3E9ybI2Oh2/qKGBn6SB
-nDCBmTELMAkGA1UEBhMCVVMxEDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0Jv
-emVtYW4xETAPBgNVBAoMCFNhd3Rvb3RoMRgwFgYDVQQLDA9Db25zdWx0aW5nXzEw
-MjQxGDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5m
-b0B3b2xmc3NsLmNvbYIJANr7ag3+z5tHMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcN
-AQELBQADgYEAHUj2QEEEBvLkci/q/8FnaxW7CigjKAfG1xMsvgAArB339JLTK68j
-658a4hE8LZfyD6yul4YK+6hPdBveGVHbzeIROMGknVarR1zeuusn323Ifjq9Lpsq
-rSI7lanyKAO85ezM8gjUyC/b6vsuUhaMQgKkWW1MM7Sa0nNKHp/ZyIM=
+MIID6jCCA1OgAwIBAgIUUQgOZlkm4ZvssshhFTVBnU3piuowDQYJKoZIhvcNAQEL
+BQAwgZkxCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdC
+b3plbWFuMREwDwYDVQQKDAhTYXd0b290aDEYMBYGA1UECwwPQ29uc3VsdGluZ18x
+MDI0MRgwFgYDVQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGlu
+Zm9Ad29sZnNzbC5jb20wHhcNMjAwNTA3MDczOTA0WhcNMjMwMjAxMDczOTA0WjCB
+mTELMAkGA1UEBhMCVVMxEDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVt
+YW4xETAPBgNVBAoMCFNhd3Rvb3RoMRgwFgYDVQQLDA9Db25zdWx0aW5nXzEwMjQx
+GDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3
+b2xmc3NsLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAzazdR+y+tyTD
+YxtUmHnhxzEWWdadd52N4ovtBBeyxuvkm5G+MVBil1i1fynes3EkC7+XCX8m3C3s
+qC6yZCt6KzUZLaKAy5n9lHEbI41U2y5ijYEILfQkcids+cmO20x1upsB+D8Y9OZ/
++1eUksyIxLQAwqrU5YgYsxEvc8DWKQkCAwEAAaOCASswggEnMB0GA1UdDgQWBBTT
+Io8oLOAF7tPtw3E9ybI2Oh2/qDCB2QYDVR0jBIHRMIHOgBTTIo8oLOAF7tPtw3E9
+ybI2Oh2/qKGBn6SBnDCBmTELMAkGA1UEBhMCVVMxEDAOBgNVBAgMB01vbnRhbmEx
+EDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNhd3Rvb3RoMRgwFgYDVQQLDA9D
+b25zdWx0aW5nXzEwMjQxGDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEfMB0GCSqG
+SIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIUUQgOZlkm4ZvssshhFTVBnU3piuow
+DAYDVR0TBAUwAwEB/zAcBgNVHREEFTATggtleGFtcGxlLmNvbYcEfwAAATANBgkq
+hkiG9w0BAQsFAAOBgQC7hYFS5H7ZQDaXf+Hb/o4f5fTYBY4lQ2ryb1/SXLjwonEW
+t4cMU9VQlEqJytej8du8A0Q0hPnLmKg8zaEclRnQSK6zWXBSKxkCBTW1XHqpHl5T
+dB1w7vzrDmRqXFB+h56FjyHDOYPizmKIe3J0UAl7xh2PM4KuP28REULcxb24Pw==
-----END CERTIFICATE-----
diff --git a/certs/1024/client-cert.der b/certs/1024/client-cert.der
index 0195f9de9..3ca8870c5 100644
Binary files a/certs/1024/client-cert.der and b/certs/1024/client-cert.der differ
diff --git a/certs/1024/client-cert.pem b/certs/1024/client-cert.pem
index d36383d25..6cf40defa 100644
--- a/certs/1024/client-cert.pem
+++ b/certs/1024/client-cert.pem
@@ -1,16 +1,17 @@
Certificate:
Data:
Version: 3 (0x2)
- Serial Number: 13534178914118477827 (0xbbd31003e69d2803)
- Signature Algorithm: sha256WithRSAEncryption
- Issuer: C=US, ST=Montana, L=Bozeman, O=wolfSSL_1024, OU=Programming-1024, CN=www.wolfssl.com/emailAddress=info@wolfssl.com
+ Serial Number:
+ 0a:60:f5:96:2d:a5:e2:63:56:3e:98:93:65:56:0a:0a:11:23:98:5d
+ Signature Algorithm: sha256WithRSAEncryption
+ Issuer: C = US, ST = Montana, L = Bozeman, O = wolfSSL_1024, OU = Programming-1024, 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_1024, OU=Programming-1024, 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_1024, OU = Programming-1024, CN = www.wolfssl.com, emailAddress = info@wolfssl.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
- Public-Key: (1024 bit)
+ RSA Public-Key: (1024 bit)
Modulus:
00:bc:73:0e:a8:49:f3:74:a2:a9:ef:18:a5:da:55:
99:21:f9:c8:ec:b3:6d:48:e5:35:35:75:77:37:ec:
@@ -28,39 +29,42 @@ Certificate:
X509v3 Authority Key Identifier:
keyid:81:69:0F:F8:DF:DD:CF:34:29:D5:67:75:71:85:C7:75:10:69:59:EC
DirName:/C=US/ST=Montana/L=Bozeman/O=wolfSSL_1024/OU=Programming-1024/CN=www.wolfssl.com/emailAddress=info@wolfssl.com
- serial:BB:D3:10:03:E6:9D:28:03
+ serial:0A:60:F5:96:2D:A5:E2:63:56:3E:98:93:65:56:0A:0A:11:23:98:5D
X509v3 Basic Constraints:
CA:TRUE
+ X509v3 Subject Alternative Name:
+ DNS:example.com, IP Address:127.0.0.1
Signature Algorithm: sha256WithRSAEncryption
- 84:99:d9:e5:37:c4:44:7d:ce:29:b8:b6:80:0e:ea:a3:e2:fa:
- a2:2f:5c:d2:4a:85:67:b9:8b:fa:9f:7d:da:6d:85:2a:c2:20:
- f3:18:c8:d4:6b:26:b2:7a:68:e7:82:52:87:e7:0c:5b:08:47:
- 7a:55:a5:0d:fa:72:ce:6b:a1:b2:ae:5a:a1:63:ff:68:db:e5:
- 49:ef:f1:0e:98:96:09:b5:04:5f:d4:0a:9b:8a:af:d2:31:1f:
- 95:e5:0f:a8:cd:bb:a1:2d:64:b0:b7:ee:47:a7:58:d9:c7:db:
- b0:92:bb:aa:cf:b8:8a:04:5b:0f:9f:3e:e0:d2:42:52:bd:5d:
- a7:48
+ 3d:88:55:62:85:d5:b6:f5:cf:c8:1e:c6:6f:40:00:4c:72:2a:
+ c1:ea:a5:a3:1d:fc:a8:fb:9b:01:56:1e:36:cf:6d:06:bb:2d:
+ 4d:1d:f2:bd:95:e0:21:74:7c:dd:8c:64:f9:6d:8f:96:99:22:
+ 71:4f:c6:e5:c0:5d:ca:f8:1a:b7:23:f7:40:13:7d:92:0d:5a:
+ 80:28:b9:7c:e2:87:68:da:3c:a5:c7:1b:0a:60:32:71:38:da:
+ f4:fe:56:7e:ff:f4:a3:1f:d9:30:96:48:2a:56:90:0e:7d:86:
+ 97:d2:c7:bf:b6:4b:7a:6d:28:49:42:54:d4:50:5c:13:c8:f1:
+ 24:4f
-----BEGIN CERTIFICATE-----
-MIIDxTCCAy6gAwIBAgIJALvTEAPmnSgDMA0GCSqGSIb3DQEBCwUAMIGeMQswCQYD
-VQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjEVMBMG
-A1UECgwMd29sZlNTTF8xMDI0MRkwFwYDVQQLDBBQcm9ncmFtbWluZy0xMDI0MRgw
-FgYDVQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29s
-ZnNzbC5jb20wHhcNMTgwNDEzMTUyMzA5WhcNMjEwMTA3MTUyMzA5WjCBnjELMAkG
-A1UEBhMCVVMxEDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xFTAT
-BgNVBAoMDHdvbGZTU0xfMTAyNDEZMBcGA1UECwwQUHJvZ3JhbW1pbmctMTAyNDEY
-MBYGA1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdv
-bGZzc2wuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC8cw6oSfN0oqnv
-GKXaVZkh+cjss21I5TU1dXc37NFhkF8+2eTV35TKwanXGdqGyehNxGE2gv6rrX53
-JbuNEaW8YjqoOMw5ogRmtPf386raTQIOu16NaUjcd8koDiLpa6Qmukzowf1Kbysf
-74qu9pBi5WQe6ys8Z8jcJwD2kWhlqQIDAQABo4IBBzCCAQMwHQYDVR0OBBYEFIFp
-D/jf3c80KdVndXGFx3UQaVnsMIHTBgNVHSMEgcswgciAFIFpD/jf3c80KdVndXGF
-x3UQaVnsoYGkpIGhMIGeMQswCQYDVQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQ
-MA4GA1UEBwwHQm96ZW1hbjEVMBMGA1UECgwMd29sZlNTTF8xMDI0MRkwFwYDVQQL
-DBBQcm9ncmFtbWluZy0xMDI0MRgwFgYDVQQDDA93d3cud29sZnNzbC5jb20xHzAd
-BgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb22CCQC70xAD5p0oAzAMBgNVHRME
-BTADAQH/MA0GCSqGSIb3DQEBCwUAA4GBAISZ2eU3xER9zim4toAO6qPi+qIvXNJK
-hWe5i/qffdpthSrCIPMYyNRrJrJ6aOeCUofnDFsIR3pVpQ36cs5robKuWqFj/2jb
-5Unv8Q6Ylgm1BF/UCpuKr9IxH5XlD6jNu6EtZLC37kenWNnH27CSu6rPuIoEWw+f
-PuDSQlK9XadI
+MIID+TCCA2KgAwIBAgIUCmD1li2l4mNWPpiTZVYKChEjmF0wDQYJKoZIhvcNAQEL
+BQAwgZ4xCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdC
+b3plbWFuMRUwEwYDVQQKDAx3b2xmU1NMXzEwMjQxGTAXBgNVBAsMEFByb2dyYW1t
+aW5nLTEwMjQxGDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJ
+ARYQaW5mb0B3b2xmc3NsLmNvbTAeFw0yMDA1MDcwNzM5MDRaFw0yMzAyMDEwNzM5
+MDRaMIGeMQswCQYDVQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwH
+Qm96ZW1hbjEVMBMGA1UECgwMd29sZlNTTF8xMDI0MRkwFwYDVQQLDBBQcm9ncmFt
+bWluZy0xMDI0MRgwFgYDVQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0B
+CQEWEGluZm9Ad29sZnNzbC5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGB
+ALxzDqhJ83Siqe8YpdpVmSH5yOyzbUjlNTV1dzfs0WGQXz7Z5NXflMrBqdcZ2obJ
+6E3EYTaC/qutfnclu40RpbxiOqg4zDmiBGa09/fzqtpNAg67Xo1pSNx3ySgOIulr
+pCa6TOjB/UpvKx/viq72kGLlZB7rKzxnyNwnAPaRaGWpAgMBAAGjggEwMIIBLDAd
+BgNVHQ4EFgQUgWkP+N/dzzQp1Wd1cYXHdRBpWewwgd4GA1UdIwSB1jCB04AUgWkP
++N/dzzQp1Wd1cYXHdRBpWeyhgaSkgaEwgZ4xCzAJBgNVBAYTAlVTMRAwDgYDVQQI
+DAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMRUwEwYDVQQKDAx3b2xmU1NMXzEw
+MjQxGTAXBgNVBAsMEFByb2dyYW1taW5nLTEwMjQxGDAWBgNVBAMMD3d3dy53b2xm
+c3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIUCmD1li2l
+4mNWPpiTZVYKChEjmF0wDAYDVR0TBAUwAwEB/zAcBgNVHREEFTATggtleGFtcGxl
+LmNvbYcEfwAAATANBgkqhkiG9w0BAQsFAAOBgQA9iFVihdW29c/IHsZvQABMcirB
+6qWjHfyo+5sBVh42z20Guy1NHfK9leAhdHzdjGT5bY+WmSJxT8blwF3K+Bq3I/dA
+E32SDVqAKLl84odo2jylxxsKYDJxONr0/lZ+//SjH9kwlkgqVpAOfYaX0se/tkt6
+bShJQlTUUFwTyPEkTw==
-----END CERTIFICATE-----
diff --git a/certs/1024/server-cert.der b/certs/1024/server-cert.der
index 3e9b678a6..08c82b939 100644
Binary files a/certs/1024/server-cert.der and b/certs/1024/server-cert.der differ
diff --git a/certs/1024/server-cert.pem b/certs/1024/server-cert.pem
index 4b432fbbf..fe885b29c 100644
--- a/certs/1024/server-cert.pem
+++ b/certs/1024/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_1024, CN=www.wolfssl.com/emailAddress=info@wolfssl.com
+ Signature Algorithm: sha256WithRSAEncryption
+ Issuer: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting_1024, 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_1024, 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_1024, CN = www.wolfssl.com, emailAddress = info@wolfssl.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
- Public-Key: (1024 bit)
+ RSA Public-Key: (1024 bit)
Modulus:
00:aa:3e:a5:9c:d3:17:49:65:43:de:d0:f3:4b:1c:
db:49:0c:fc:7a:65:05:6d:de:6a:c4:e4:73:2c:8a:
@@ -28,54 +28,58 @@ Certificate:
X509v3 Authority Key Identifier:
keyid:D3:22:8F:28:2C:E0:05:EE:D3:ED:C3:71:3D:C9:B2:36:3A:1D:BF:A8
DirName:/C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting_1024/CN=www.wolfssl.com/emailAddress=info@wolfssl.com
- serial:DA:FB:6A:0D:FE:CF:9B:47
+ serial:51:08:0E:66:59:26:E1:9B:EC:B2:C8:61:15:35:41:9D:4D:E9:8A:EA
X509v3 Basic Constraints:
CA:TRUE
+ X509v3 Subject Alternative Name:
+ DNS:example.com, IP Address:127.0.0.1
Signature Algorithm: sha256WithRSAEncryption
- 0b:c3:af:43:85:64:61:e7:ab:5a:2a:1b:b2:29:d5:66:68:44:
- 1a:6d:66:fc:3d:b1:88:ec:a5:41:18:67:62:34:a4:5e:c9:69:
- cd:40:c8:56:7e:bf:eb:bc:61:1f:33:34:58:be:57:fd:e6:98:
- dd:51:27:7c:b7:2c:bc:c9:39:e5:e5:95:82:e1:3f:d9:b9:97:
- 30:4e:33:2c:ef:f8:db:b4:ee:35:75:9e:7a:3f:22:8f:a5:71:
- d4:01:64:6c:f2:85:f7:72:99:2c:80:0f:a4:31:1d:d4:0b:1e:
- a5:0f:e7:53:0a:de:15:0d:b2:d0:6b:f4:d6:2f:e2:0b:a3:8a:
- 5a:6e
+ 89:cd:fc:5f:7b:99:2c:cd:83:9d:c9:a5:dd:c8:7c:66:1d:05:
+ 9d:a6:fa:01:d7:20:25:6a:a8:22:6b:16:74:21:c4:8f:32:36:
+ df:e3:08:be:8f:a4:1d:45:fe:1b:80:7f:39:b3:ce:7f:df:d9:
+ 04:2e:83:b7:18:9d:5d:d9:6c:23:fa:cd:0d:0f:98:7b:53:8a:
+ c1:a7:a4:90:d5:2a:b7:44:29:83:74:ca:b5:b9:41:a5:43:d7:
+ 22:a6:02:6a:a8:28:5c:be:9a:6e:83:38:08:b6:5a:2f:48:5f:
+ 4e:67:bf:da:f3:5f:ef:0e:f6:53:0b:80:43:48:bc:4a:4a:89:
+ a6:37
-----BEGIN CERTIFICATE-----
-MIIDqTCCAxKgAwIBAgIBATANBgkqhkiG9w0BAQsFADCBmTELMAkGA1UEBhMCVVMx
+MIID0zCCAzygAwIBAgIBATANBgkqhkiG9w0BAQsFADCBmTELMAkGA1UEBhMCVVMx
EDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNh
d3Rvb3RoMRgwFgYDVQQLDA9Db25zdWx0aW5nXzEwMjQxGDAWBgNVBAMMD3d3dy53
-b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbTAeFw0x
-ODA0MTMxNTIzMTBaFw0yMTAxMDcxNTIzMTBaMIGVMQswCQYDVQQGEwJVUzEQMA4G
+b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbTAeFw0y
+MDA1MDcwNzM5MDRaFw0yMzAyMDEwNzM5MDRaMIGVMQswCQYDVQQGEwJVUzEQMA4G
A1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjEQMA4GA1UECgwHd29sZlNT
TDEVMBMGA1UECwwMU3VwcG9ydF8xMDI0MRgwFgYDVQQDDA93d3cud29sZnNzbC5j
b20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wgZ8wDQYJKoZIhvcN
AQEBBQADgY0AMIGJAoGBAKo+pZzTF0llQ97Q80sc20kM/HplBW3easTkcyyKloKP
I6UGcRwGPi+SjQspNEVZ6am8YdckN121xDeNumey7wMn+sG0zWsAZrTWc3AfCDrM
d63p+TTU86AtqedYqcBhhLbsPQqt/VyGc6prR9iLLlhLaRKCJlXmFL9VcIj++XXh
-AgMBAAGjggEBMIH+MB0GA1UdDgQWBBTZPDXqdA4jvpz8+imQCcHnhBaffDCBzgYD
-VR0jBIHGMIHDgBTTIo8oLOAF7tPtw3E9ybI2Oh2/qKGBn6SBnDCBmTELMAkGA1UE
-BhMCVVMxEDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNV
-BAoMCFNhd3Rvb3RoMRgwFgYDVQQLDA9Db25zdWx0aW5nXzEwMjQxGDAWBgNVBAMM
-D3d3dy53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNv
-bYIJANr7ag3+z5tHMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQELBQADgYEAC8Ov
-Q4VkYeerWiobsinVZmhEGm1m/D2xiOylQRhnYjSkXslpzUDIVn6/67xhHzM0WL5X
-/eaY3VEnfLcsvMk55eWVguE/2bmXME4zLO/427TuNXWeej8ij6Vx1AFkbPKF93KZ
-LIAPpDEd1AsepQ/nUwreFQ2y0Gv01i/iC6OKWm4=
+AgMBAAGjggErMIIBJzAdBgNVHQ4EFgQU2Tw16nQOI76c/PopkAnB54QWn3wwgdkG
+A1UdIwSB0TCBzoAU0yKPKCzgBe7T7cNxPcmyNjodv6ihgZ+kgZwwgZkxCzAJBgNV
+BAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMREwDwYD
+VQQKDAhTYXd0b290aDEYMBYGA1UECwwPQ29uc3VsdGluZ18xMDI0MRgwFgYDVQQD
+DA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5j
+b22CFFEIDmZZJuGb7LLIYRU1QZ1N6YrqMAwGA1UdEwQFMAMBAf8wHAYDVR0RBBUw
+E4ILZXhhbXBsZS5jb22HBH8AAAEwDQYJKoZIhvcNAQELBQADgYEAic38X3uZLM2D
+ncml3ch8Zh0Fnab6AdcgJWqoImsWdCHEjzI23+MIvo+kHUX+G4B/ObPOf9/ZBC6D
+txidXdlsI/rNDQ+Ye1OKwaekkNUqt0Qpg3TKtblBpUPXIqYCaqgoXL6aboM4CLZa
+L0hfTme/2vNf7w72UwuAQ0i8SkqJpjc=
-----END CERTIFICATE-----
Certificate:
Data:
Version: 3 (0x2)
- Serial Number: 15779322327764802375 (0xdafb6a0dfecf9b47)
- Signature Algorithm: sha256WithRSAEncryption
- Issuer: C=US, ST=Montana, L=Bozeman, O=Sawtooth, OU=Consulting_1024, CN=www.wolfssl.com/emailAddress=info@wolfssl.com
+ Serial Number:
+ 51:08:0e:66:59:26:e1:9b:ec:b2:c8:61:15:35:41:9d:4d:e9:8a:ea
+ Signature Algorithm: sha256WithRSAEncryption
+ Issuer: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting_1024, 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=Sawtooth, OU=Consulting_1024, 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_1024, CN = www.wolfssl.com, emailAddress = info@wolfssl.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
- Public-Key: (1024 bit)
+ RSA Public-Key: (1024 bit)
Modulus:
00:cd:ac:dd:47:ec:be:b7:24:c3:63:1b:54:98:79:
e1:c7:31:16:59:d6:9d:77:9d:8d:e2:8b:ed:04:17:
@@ -93,38 +97,41 @@ Certificate:
X509v3 Authority Key Identifier:
keyid:D3:22:8F:28:2C:E0:05:EE:D3:ED:C3:71:3D:C9:B2:36:3A:1D:BF:A8
DirName:/C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting_1024/CN=www.wolfssl.com/emailAddress=info@wolfssl.com
- serial:DA:FB:6A:0D:FE:CF:9B:47
+ serial:51:08:0E:66:59:26:E1:9B:EC:B2:C8:61:15:35:41:9D:4D:E9:8A:EA
X509v3 Basic Constraints:
CA:TRUE
+ X509v3 Subject Alternative Name:
+ DNS:example.com, IP Address:127.0.0.1
Signature Algorithm: sha256WithRSAEncryption
- 1d:48:f6:40:41:04:06:f2:e4:72:2f:ea:ff:c1:67:6b:15:bb:
- 0a:28:23:28:07:c6:d7:13:2c:be:00:00:ac:1d:f7:f4:92:d3:
- 2b:af:23:eb:9f:1a:e2:11:3c:2d:97:f2:0f:ac:ae:97:86:0a:
- fb:a8:4f:74:1b:de:19:51:db:cd:e2:11:38:c1:a4:9d:56:ab:
- 47:5c:de:ba:eb:27:df:6d:c8:7e:3a:bd:2e:9b:2a:ad:22:3b:
- 95:a9:f2:28:03:bc:e5:ec:cc:f2:08:d4:c8:2f:db:ea:fb:2e:
- 52:16:8c:42:02:a4:59:6d:4c:33:b4:9a:d2:73:4a:1e:9f:d9:
- c8:83
+ bb:85:81:52:e4:7e:d9:40:36:97:7f:e1:db:fe:8e:1f:e5:f4:
+ d8:05:8e:25:43:6a:f2:6f:5f:d2:5c:b8:f0:a2:71:16:b7:87:
+ 0c:53:d5:50:94:4a:89:ca:d7:a3:f1:db:bc:03:44:34:84:f9:
+ cb:98:a8:3c:cd:a1:1c:95:19:d0:48:ae:b3:59:70:52:2b:19:
+ 02:05:35:b5:5c:7a:a9:1e:5e:53:74:1d:70:ee:fc:eb:0e:64:
+ 6a:5c:50:7e:87:9e:85:8f:21:c3:39:83:e2:ce:62:88:7b:72:
+ 74:50:09:7b:c6:1d:8f:33:82:ae:3f:6f:11:11:42:dc:c5:bd:
+ b8:3f
-----BEGIN CERTIFICATE-----
-MIIDtTCCAx6gAwIBAgIJANr7ag3+z5tHMA0GCSqGSIb3DQEBCwUAMIGZMQswCQYD
-VQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjERMA8G
-A1UECgwIU2F3dG9vdGgxGDAWBgNVBAsMD0NvbnN1bHRpbmdfMTAyNDEYMBYGA1UE
-AwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu
-Y29tMB4XDTE4MDQxMzE1MjMxMFoXDTIxMDEwNzE1MjMxMFowgZkxCzAJBgNVBAYT
-AlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMREwDwYDVQQK
-DAhTYXd0b290aDEYMBYGA1UECwwPQ29uc3VsdGluZ18xMDI0MRgwFgYDVQQDDA93
-d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20w
-gZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM2s3Ufsvrckw2MbVJh54ccxFlnW
-nXedjeKL7QQXssbr5JuRvjFQYpdYtX8p3rNxJAu/lwl/Jtwt7KgusmQreis1GS2i
-gMuZ/ZRxGyONVNsuYo2BCC30JHInbPnJjttMdbqbAfg/GPTmf/tXlJLMiMS0AMKq
-1OWIGLMRL3PA1ikJAgMBAAGjggEBMIH+MB0GA1UdDgQWBBTTIo8oLOAF7tPtw3E9
-ybI2Oh2/qDCBzgYDVR0jBIHGMIHDgBTTIo8oLOAF7tPtw3E9ybI2Oh2/qKGBn6SB
-nDCBmTELMAkGA1UEBhMCVVMxEDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0Jv
-emVtYW4xETAPBgNVBAoMCFNhd3Rvb3RoMRgwFgYDVQQLDA9Db25zdWx0aW5nXzEw
-MjQxGDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5m
-b0B3b2xmc3NsLmNvbYIJANr7ag3+z5tHMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcN
-AQELBQADgYEAHUj2QEEEBvLkci/q/8FnaxW7CigjKAfG1xMsvgAArB339JLTK68j
-658a4hE8LZfyD6yul4YK+6hPdBveGVHbzeIROMGknVarR1zeuusn323Ifjq9Lpsq
-rSI7lanyKAO85ezM8gjUyC/b6vsuUhaMQgKkWW1MM7Sa0nNKHp/ZyIM=
+MIID6jCCA1OgAwIBAgIUUQgOZlkm4ZvssshhFTVBnU3piuowDQYJKoZIhvcNAQEL
+BQAwgZkxCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdC
+b3plbWFuMREwDwYDVQQKDAhTYXd0b290aDEYMBYGA1UECwwPQ29uc3VsdGluZ18x
+MDI0MRgwFgYDVQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGlu
+Zm9Ad29sZnNzbC5jb20wHhcNMjAwNTA3MDczOTA0WhcNMjMwMjAxMDczOTA0WjCB
+mTELMAkGA1UEBhMCVVMxEDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVt
+YW4xETAPBgNVBAoMCFNhd3Rvb3RoMRgwFgYDVQQLDA9Db25zdWx0aW5nXzEwMjQx
+GDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3
+b2xmc3NsLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAzazdR+y+tyTD
+YxtUmHnhxzEWWdadd52N4ovtBBeyxuvkm5G+MVBil1i1fynes3EkC7+XCX8m3C3s
+qC6yZCt6KzUZLaKAy5n9lHEbI41U2y5ijYEILfQkcids+cmO20x1upsB+D8Y9OZ/
++1eUksyIxLQAwqrU5YgYsxEvc8DWKQkCAwEAAaOCASswggEnMB0GA1UdDgQWBBTT
+Io8oLOAF7tPtw3E9ybI2Oh2/qDCB2QYDVR0jBIHRMIHOgBTTIo8oLOAF7tPtw3E9
+ybI2Oh2/qKGBn6SBnDCBmTELMAkGA1UEBhMCVVMxEDAOBgNVBAgMB01vbnRhbmEx
+EDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNhd3Rvb3RoMRgwFgYDVQQLDA9D
+b25zdWx0aW5nXzEwMjQxGDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEfMB0GCSqG
+SIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIUUQgOZlkm4ZvssshhFTVBnU3piuow
+DAYDVR0TBAUwAwEB/zAcBgNVHREEFTATggtleGFtcGxlLmNvbYcEfwAAATANBgkq
+hkiG9w0BAQsFAAOBgQC7hYFS5H7ZQDaXf+Hb/o4f5fTYBY4lQ2ryb1/SXLjwonEW
+t4cMU9VQlEqJytej8du8A0Q0hPnLmKg8zaEclRnQSK6zWXBSKxkCBTW1XHqpHl5T
+dB1w7vzrDmRqXFB+h56FjyHDOYPizmKIe3J0UAl7xh2PM4KuP28REULcxb24Pw==
-----END CERTIFICATE-----
diff --git a/certs/3072/client-cert.der b/certs/3072/client-cert.der
index 1d3e14212..ff1dc6f31 100644
Binary files a/certs/3072/client-cert.der and b/certs/3072/client-cert.der differ
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 c31698f65..47218b4b0 100644
Binary files a/certs/4096/client-cert.der and b/certs/4096/client-cert.der differ
diff --git a/certs/4096/client-cert.pem b/certs/4096/client-cert.pem
index 57e303920..84ede5480 100644
--- a/certs/4096/client-cert.pem
+++ b/certs/4096/client-cert.pem
@@ -2,12 +2,12 @@ Certificate:
Data:
Version: 3 (0x2)
Serial Number:
- 2f:0f:ab:23:bc:a3:14:07:91:06:55:35:01:63:7f:42:bd:fb:f2:43
+ 08:23:7f:d2:d2:23:3e:0f:cc:55:94:25:1f:51:7b:e7:cc:3f:4c:af
Signature Algorithm: sha256WithRSAEncryption
Issuer: C = US, ST = Montana, L = Bozeman, O = wolfSSL_4096, OU = Programming-4096, CN = www.wolfssl.com, emailAddress = info@wolfssl.com
Validity
- Not Before: Jul 9 03:06:02 2019 GMT
- Not After : Apr 4 03:06:02 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_4096, OU = Programming-4096, CN = www.wolfssl.com, emailAddress = info@wolfssl.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
@@ -55,47 +55,49 @@ Certificate:
X509v3 Authority Key Identifier:
keyid:FA:54:89:67:E5:5F:B7:31:40:EA:FD:E7:F6:A3:C6:5A:56:16:A5:6E
DirName:/C=US/ST=Montana/L=Bozeman/O=wolfSSL_4096/OU=Programming-4096/CN=www.wolfssl.com/emailAddress=info@wolfssl.com
- serial:2F:0F:AB:23:BC:A3:14:07:91:06:55:35:01:63:7F:42:BD:FB:F2:43
+ serial:08:23:7F:D2:D2:23:3E:0F:CC:55:94:25:1F:51:7B:E7:CC:3F:4C:AF
X509v3 Basic Constraints:
CA:TRUE
+ X509v3 Subject Alternative Name:
+ DNS:example.com, IP Address:127.0.0.1
Signature Algorithm: sha256WithRSAEncryption
- 57:0d:97:98:78:bf:2a:31:9a:39:41:38:33:46:d5:50:47:e8:
- 19:62:a8:36:1e:b7:fd:d1:bc:50:5c:3a:eb:96:1a:9b:43:b0:
- 67:5d:f4:51:77:87:33:0b:90:6f:e8:d3:82:4d:1a:aa:93:5f:
- 7d:78:b1:e0:7b:ee:88:01:e7:b3:fa:7e:0b:76:9c:9e:81:36:
- e4:a3:c1:41:62:a4:0a:7e:24:d0:ab:9f:ba:d8:1e:38:ad:f1:
- 12:52:0d:f2:96:8a:0b:25:a2:49:3f:88:5b:ea:23:87:26:22:
- 7a:b9:60:6b:d6:7a:88:37:ac:64:9b:18:51:07:ea:df:00:96:
- 70:95:88:9d:8f:af:be:3c:4e:c7:5e:55:15:3d:1f:e4:2d:dc:
- c9:a3:ae:af:fa:44:a8:e2:f4:df:8e:cd:f9:10:7f:8b:86:cc:
- 6d:45:91:91:4f:e3:d0:a7:d2:d9:8e:09:c6:f8:eb:e7:bd:17:
- 19:d6:e7:1a:b8:ca:4d:ec:34:07:7d:2d:e8:23:9d:82:e9:f7:
- 47:03:ab:5f:7c:f5:41:6f:70:11:cb:24:d8:23:c2:65:31:b7:
- 0b:8f:0a:26:5b:0f:f6:9b:11:7f:9a:8d:94:6d:5a:9c:5e:73:
- 35:15:7b:e3:09:e8:08:d0:3f:b4:e5:29:2c:f6:3e:71:6e:f4:
- 1b:20:55:34:40:2f:b0:9b:dd:f1:dc:bf:17:1d:a7:2d:85:01:
- d6:d2:b2:56:56:98:33:85:ed:f6:a3:f6:3e:7b:f4:03:a4:58:
- 8e:c5:5b:ab:66:e8:0f:34:17:2d:33:36:71:0c:b8:d9:78:e7:
- 06:fc:da:4f:a1:fa:db:74:ce:ea:85:27:f9:75:a9:ad:50:86:
- 6e:ea:01:01:19:0d:28:4a:ed:06:be:65:70:b2:06:46:2e:16:
- 57:df:55:c7:8e:cd:5b:ad:66:28:b8:74:87:bf:c4:c7:08:3f:
- 37:a3:23:84:9f:4e:e8:48:6c:8d:54:9f:fb:e0:fb:53:a3:41:
- e1:68:8a:94:c9:f5:ee:3e:15:46:d2:62:33:86:86:06:34:b4:
- e4:2f:da:28:2e:2f:c0:bd:75:e8:2c:3f:e2:a5:43:7d:02:eb:
- 25:b9:ef:87:8a:d7:57:61:16:e8:9e:83:65:f9:10:f4:5e:5f:
- 1c:7a:25:d6:47:bd:29:c5:4f:8b:b9:6a:48:7a:9b:1e:6d:77:
- 8e:72:6c:0c:07:fe:4c:c5:cf:55:0e:cb:4b:ad:16:e1:e2:54:
- b8:9d:34:03:d1:8d:b7:37:9b:e3:5a:32:60:03:7f:61:0f:50:
- 0b:72:54:8b:0d:c7:97:7e:bb:9b:b2:f7:73:47:71:7b:78:65:
- 36:df:57:72:9e:42:9c:8a
+ 99:e7:e8:6b:6a:c9:27:93:e8:d0:fd:cc:82:54:17:a8:0b:6d:
+ 10:58:63:07:35:ba:1c:42:b2:fd:4d:f3:98:3f:86:ad:45:ec:
+ 5c:eb:de:90:00:7a:3e:93:b0:8f:a8:06:62:25:91:79:a0:14:
+ 47:c8:1e:87:35:98:1f:41:95:e7:68:61:e7:fc:ad:1a:dc:34:
+ 0a:12:d2:8d:58:22:f6:bb:6f:cf:1a:55:ff:76:28:3c:a1:e9:
+ 6a:ea:3e:d0:1b:88:f9:7f:4e:59:a5:86:6f:18:a1:ac:e0:87:
+ f4:ee:12:f3:cd:79:2a:dd:b1:9f:4d:01:74:59:9f:0e:b0:f8:
+ eb:22:2a:1f:6c:10:1c:0a:32:d6:d4:c1:f5:a2:fe:50:0a:4c:
+ 4a:34:1c:5f:66:ab:58:ec:e4:df:ab:e8:57:32:b7:a2:7a:a1:
+ 89:f4:18:6a:47:fd:09:4a:d2:7a:77:26:1b:89:b7:51:44:7b:
+ 1f:ee:41:45:c1:7b:c0:d0:ab:c5:56:90:97:d3:8c:ed:e6:a7:
+ e6:e6:7b:58:79:65:a3:13:2c:f0:90:de:77:09:a2:37:f0:d1:
+ c7:b8:60:69:b0:bd:76:de:7f:d1:7a:a3:fc:5e:da:06:b3:0a:
+ cf:de:9a:63:7e:67:79:e3:d9:c5:98:ab:9b:23:2d:d5:0d:e4:
+ d4:1a:e3:16:75:27:ea:ca:46:9d:fa:2d:27:f6:25:b4:5f:a3:
+ 4f:10:9a:80:25:9b:e3:03:a9:e3:ca:a5:e0:86:61:9e:bf:b8:
+ 69:03:3b:1d:ba:bf:05:8f:96:78:71:fa:1f:dd:ea:be:53:a9:
+ 6a:1c:f9:f3:6c:38:7c:59:42:a6:3a:fa:47:d5:d2:33:c7:f3:
+ 60:ce:b3:2a:ab:b8:d4:38:17:8c:b4:cc:b5:5a:77:22:e4:0b:
+ b6:09:48:e9:fc:0e:96:b5:2b:28:6d:90:9a:51:a8:09:cf:74:
+ 35:3a:f7:f5:85:72:1e:a6:d3:4a:2c:a0:4c:30:3b:43:63:e6:
+ e6:11:af:48:b5:0b:17:e4:f7:1a:23:82:19:5e:b3:cd:fa:49:
+ 2f:fc:ab:4a:13:12:5b:91:0a:a5:12:a2:df:61:a1:d0:a7:5a:
+ 46:1f:b9:16:90:96:f4:86:7f:de:b4:6a:e4:cc:63:06:31:f2:
+ 1c:c2:ba:5a:80:c7:ff:a9:01:ec:0f:26:44:69:4b:c3:a6:90:
+ 25:e4:78:6d:91:3c:22:ac:48:25:1f:92:97:1d:aa:d2:24:60:
+ bf:3b:e2:35:9d:04:8f:f9:81:36:f5:ef:0e:57:8c:92:bc:0f:
+ 3a:2a:3f:8b:81:1c:55:13:26:e1:1e:85:7f:34:c9:1e:7f:71:
+ 62:17:6d:8d:83:4e:6e:61
-----BEGIN CERTIFICATE-----
-MIIG4DCCBMigAwIBAgIULw+rI7yjFAeRBlU1AWN/Qr378kMwDQYJKoZIhvcNAQEL
+MIIG/jCCBOagAwIBAgIUCCN/0tIjPg/MVZQlH1F758w/TK8wDQYJKoZIhvcNAQEL
BQAwgZ4xCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdC
b3plbWFuMRUwEwYDVQQKDAx3b2xmU1NMXzQwOTYxGTAXBgNVBAsMEFByb2dyYW1t
aW5nLTQwOTYxGDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJ
-ARYQaW5mb0B3b2xmc3NsLmNvbTAeFw0xOTA3MDkwMzA2MDJaFw0yMjA0MDQwMzA2
-MDJaMIGeMQswCQYDVQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwH
+ARYQaW5mb0B3b2xmc3NsLmNvbTAeFw0yMDA1MDcwNzM5MDRaFw0yMzAyMDEwNzM5
+MDRaMIGeMQswCQYDVQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwH
Qm96ZW1hbjEVMBMGA1UECgwMd29sZlNTTF80MDk2MRkwFwYDVQQLDBBQcm9ncmFt
bWluZy00MDk2MRgwFgYDVQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0B
CQEWEGluZm9Ad29sZnNzbC5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK
@@ -109,22 +111,23 @@ nHc/9YAjfUO01YgKyXXXRBlNd2wLCkmqHC/WWkSmR03lNpZAmSxWJrHykjFZ1yzU
tCHWZRMLPvv/BOu5hbnY2ChPXBeWo1G+/n0LG0hAJXaU3EH7v3N22uuzYufByFRq
k+GNMeg+Pt+8hwIwIlfE4Bh6067kApuqvU5JR3LpjRMtVJsAp5FhccnMSE/u314b
Gt9n0yDmREWYfucOYxaDySZdkMHlKlxFVBOygRgGIC4uZlq1e27WDE6JAVZwu67e
-6Zle0bk6t2wXtgOpCN2c9BTJyVk5ctR+AjcxzQ6nPfjyz2sVqwIDAQABo4IBEjCC
-AQ4wHQYDVR0OBBYEFPpUiWflX7cxQOr95/ajxlpWFqVuMIHeBgNVHSMEgdYwgdOA
+6Zle0bk6t2wXtgOpCN2c9BTJyVk5ctR+AjcxzQ6nPfjyz2sVqwIDAQABo4IBMDCC
+ASwwHQYDVR0OBBYEFPpUiWflX7cxQOr95/ajxlpWFqVuMIHeBgNVHSMEgdYwgdOA
FPpUiWflX7cxQOr95/ajxlpWFqVuoYGkpIGhMIGeMQswCQYDVQQGEwJVUzEQMA4G
A1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjEVMBMGA1UECgwMd29sZlNT
TF80MDk2MRkwFwYDVQQLDBBQcm9ncmFtbWluZy00MDk2MRgwFgYDVQQDDA93d3cu
-d29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb22CFC8P
-qyO8oxQHkQZVNQFjf0K9+/JDMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQELBQAD
-ggIBAFcNl5h4vyoxmjlBODNG1VBH6BliqDYet/3RvFBcOuuWGptDsGdd9FF3hzML
-kG/o04JNGqqTX314seB77ogB57P6fgt2nJ6BNuSjwUFipAp+JNCrn7rYHjit8RJS
-DfKWigslokk/iFvqI4cmInq5YGvWeog3rGSbGFEH6t8AlnCViJ2Pr748TsdeVRU9
-H+Qt3Mmjrq/6RKji9N+OzfkQf4uGzG1FkZFP49Cn0tmOCcb46+e9FxnW5xq4yk3s
-NAd9LegjnYLp90cDq1989UFvcBHLJNgjwmUxtwuPCiZbD/abEX+ajZRtWpxeczUV
-e+MJ6AjQP7TlKSz2PnFu9BsgVTRAL7Cb3fHcvxcdpy2FAdbSslZWmDOF7faj9j57
-9AOkWI7FW6tm6A80Fy0zNnEMuNl45wb82k+h+tt0zuqFJ/l1qa1Qhm7qAQEZDShK
-7Qa+ZXCyBkYuFlffVceOzVutZii4dIe/xMcIPzejI4SfTuhIbI1Un/vg+1OjQeFo
-ipTJ9e4+FUbSYjOGhgY0tOQv2iguL8C9degsP+KlQ30C6yW574eK11dhFuieg2X5
-EPReXxx6JdZHvSnFT4u5akh6mx5td45ybAwH/kzFz1UOy0utFuHiVLidNAPRjbc3
-m+NaMmADf2EPUAtyVIsNx5d+u5uy93NHcXt4ZTbfV3KeQpyK
+d29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb22CFAgj
+f9LSIz4PzFWUJR9Re+fMP0yvMAwGA1UdEwQFMAMBAf8wHAYDVR0RBBUwE4ILZXhh
+bXBsZS5jb22HBH8AAAEwDQYJKoZIhvcNAQELBQADggIBAJnn6GtqySeT6ND9zIJU
+F6gLbRBYYwc1uhxCsv1N85g/hq1F7Fzr3pAAej6TsI+oBmIlkXmgFEfIHoc1mB9B
+ledoYef8rRrcNAoS0o1YIva7b88aVf92KDyh6WrqPtAbiPl/Tlmlhm8Yoazgh/Tu
+EvPNeSrdsZ9NAXRZnw6w+OsiKh9sEBwKMtbUwfWi/lAKTEo0HF9mq1js5N+r6Fcy
+t6J6oYn0GGpH/QlK0np3JhuJt1FEex/uQUXBe8DQq8VWkJfTjO3mp+bme1h5ZaMT
+LPCQ3ncJojfw0ce4YGmwvXbef9F6o/xe2gazCs/emmN+Z3nj2cWYq5sjLdUN5NQa
+4xZ1J+rKRp36LSf2JbRfo08QmoAlm+MDqePKpeCGYZ6/uGkDOx26vwWPlnhx+h/d
+6r5TqWoc+fNsOHxZQqY6+kfV0jPH82DOsyqruNQ4F4y0zLVadyLkC7YJSOn8Dpa1
+KyhtkJpRqAnPdDU69/WFch6m00osoEwwO0Nj5uYRr0i1Cxfk9xojghles836SS/8
+q0oTEluRCqUSot9hodCnWkYfuRaQlvSGf960auTMYwYx8hzCulqAx/+pAewPJkRp
+S8OmkCXkeG2RPCKsSCUfkpcdqtIkYL874jWdBI/5gTb17w5XjJK8DzoqP4uBHFUT
+JuEehX80yR5/cWIXbY2DTm5h
-----END CERTIFICATE-----
diff --git a/certs/ca-cert.der b/certs/ca-cert.der
index 8c0c64445..1c5f0c57c 100644
Binary files a/certs/ca-cert.der and b/certs/ca-cert.der differ
diff --git a/certs/ca-cert.pem b/certs/ca-cert.pem
index 7a8a56385..b4a2f77a0 100644
--- a/certs/ca-cert.pem
+++ b/certs/ca-cert.pem
@@ -1,16 +1,17 @@
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:
@@ -37,50 +38,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/ca-ecc-cert.der b/certs/ca-ecc-cert.der
index b3f2f1ef5..bef80b440 100644
Binary files a/certs/ca-ecc-cert.der and b/certs/ca-ecc-cert.der differ
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 756876f9e..d39d55c83 100644
Binary files a/certs/ca-ecc384-cert.der and b/certs/ca-ecc384-cert.der differ
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 5241ec374..65d8a18f9 100644
Binary files a/certs/client-cert.der and b/certs/client-cert.der differ
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 d6c5dbba9..18381e39b 100644
Binary files a/certs/client-ecc-cert.der and b/certs/client-ecc-cert.der differ
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/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/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/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/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/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/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 84cb0a4b6..ff54cfca7 100644
Binary files a/certs/ecc-rsa-server.p12 and b/certs/ecc-rsa-server.p12 differ
diff --git a/certs/ed448/ca-ed448.der b/certs/ed448/ca-ed448.der
index e63ce3e3c..3e41b8bdc 100644
Binary files a/certs/ed448/ca-ed448.der and b/certs/ed448/ca-ed448.der differ
diff --git a/certs/ed448/ca-ed448.pem b/certs/ed448/ca-ed448.pem
index 2e8926ffd..0db7cfeb9 100644
--- a/certs/ed448/ca-ed448.pem
+++ b/certs/ed448/ca-ed448.pem
@@ -5,8 +5,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
@@ -27,26 +27,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/ed448/client-ed448.der b/certs/ed448/client-ed448.der
index 667cabab0..46389fa21 100644
Binary files a/certs/ed448/client-ed448.der and b/certs/ed448/client-ed448.der differ
diff --git a/certs/ed448/client-ed448.pem b/certs/ed448/client-ed448.pem
index 7cd3d70d1..138d64085 100644
--- a/certs/ed448/client-ed448.pem
+++ b/certs/ed448/client-ed448.pem
@@ -2,12 +2,12 @@ Certificate:
Data:
Version: 3 (0x2)
Serial Number:
- 1a:76:b6:ab:cd:57:de:dd:57:71:9e:7a:af:d0:6e:20:18:de:ef:f9
+ 12:21:df:72:ca:f4:72:49:14:09:c8:5c:66:30:97:0a:bb:c7:cd:72
Signature Algorithm: ED448
Issuer: C = US, ST = Montana, L = Bozeman, O = wolfSSL_ed448, OU = Client-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 = Client-ed448, CN = www.wolfssl.com, emailAddress = info@wolfssl.com
Subject Public Key Info:
Public Key Algorithm: ED448
@@ -23,38 +23,38 @@ Certificate:
X509v3 Authority Key Identifier:
keyid:F3:C7:66:93:0D:CB:0E:1B:80:08:00:CF:E3:4E:11:4D:58:2B:4B:D4
DirName:/C=US/ST=Montana/L=Bozeman/O=wolfSSL_ed448/OU=Client-ed448/CN=www.wolfssl.com/emailAddress=info@wolfssl.com
- serial:1A:76:B6:AB:CD:57:DE:DD:57:71:9E:7A:AF:D0:6E:20:18:DE:EF:F9
+ serial:12:21:DF:72:CA:F4:72:49:14:09:C8:5C:66:30:97:0A:BB:C7:CD:72
X509v3 Basic Constraints:
CA:TRUE
X509v3 Subject Alternative Name:
- DNS:example.com
+ DNS:example.com, IP Address:127.0.0.1
Signature Algorithm: ED448
- 8b:89:9a:40:37:a5:3a:8a:e0:aa:d2:a7:de:2a:9d:84:be:8e:
- 42:af:d7:fb:16:7b:7b:e4:02:49:07:b2:31:6d:9b:a5:37:cb:
- 5d:8b:5f:b5:a1:6d:ed:95:5d:a7:06:5b:c5:31:f6:f3:a8:65:
- 19:2a:00:2c:46:7d:bd:7c:56:82:01:8f:3b:25:38:d0:97:be:
- 65:f0:68:c5:fc:45:b3:2a:56:05:bc:2f:30:a6:48:37:bf:0a:
- b3:d7:38:ca:f0:84:d8:2b:f4:8b:56:32:27:a9:f8:e2:6a:da:
- 9a:26:cb:47:2d:00
+ 2e:f6:1e:5d:ee:4d:ea:0f:12:5c:af:5a:87:87:88:c8:a6:bd:
+ 31:3d:9f:8f:07:03:d2:e6:02:36:df:0e:ea:b7:be:b8:2c:48:
+ f9:c9:1b:99:2e:90:48:bc:af:f6:24:06:e9:94:47:07:31:8e:
+ b0:e4:80:6e:78:06:a8:68:20:38:1c:cb:e1:65:a8:fe:c1:e9:
+ 70:5b:58:d7:3a:3b:34:c1:55:9e:86:7f:61:5a:69:84:18:7f:
+ 75:56:0a:df:1a:d5:0e:35:3f:1d:5f:34:ce:1a:c3:ed:2d:8d:
+ cd:bd:22:f0:01:00
-----BEGIN CERTIFICATE-----
-MIIDbjCCAu6gAwIBAgIUGna2q81X3t1XcZ56r9BuIBje7/kwBQYDK2VxMIGbMQsw
+MIIDdDCCAvSgAwIBAgIUEiHfcsr0ckkUCchcZjCXCrvHzXIwBQYDK2VxMIGbMQsw
CQYDVQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjEW
MBQGA1UECgwNd29sZlNTTF9lZDQ0ODEVMBMGA1UECwwMQ2xpZW50LWVkNDQ4MRgw
FgYDVQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29s
-ZnNzbC5jb20wHhcNMjAwMjEzMDEzNTQ0WhcNMjIxMTA5MDEzNTQ0WjCBmzELMAkG
+ZnNzbC5jb20wHhcNMjAwNTA3MDczOTA0WhcNMjMwMjAxMDczOTA0WjCBmzELMAkG
A1UEBhMCVVMxEDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xFjAU
BgNVBAoMDXdvbGZTU0xfZWQ0NDgxFTATBgNVBAsMDENsaWVudC1lZDQ0ODEYMBYG
A1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZz
c2wuY29tMEMwBQYDK2VxAzoAEMCCL40K7GUSUkA5qnpgaI4xIkmtm8H8ceU+eFc1
-yHazszCPh3jmJlon2Aw4nns8Ey/MpClsgO+Ao4IBJzCCASMwHQYDVR0OBBYEFPPH
+yHazszCPh3jmJlon2Aw4nns8Ey/MpClsgO+Ao4IBLTCCASkwHQYDVR0OBBYEFPPH
ZpMNyw4bgAgAz+NOEU1YK0vUMIHbBgNVHSMEgdMwgdCAFPPHZpMNyw4bgAgAz+NO
EU1YK0vUoYGhpIGeMIGbMQswCQYDVQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQ
MA4GA1UEBwwHQm96ZW1hbjEWMBQGA1UECgwNd29sZlNTTF9lZDQ0ODEVMBMGA1UE
CwwMQ2xpZW50LWVkNDQ4MRgwFgYDVQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkq
-hkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb22CFBp2tqvNV97dV3Geeq/QbiAY3u/5
-MAwGA1UdEwQFMAMBAf8wFgYDVR0RBA8wDYILZXhhbXBsZS5jb20wBQYDK2VxA3MA
-i4maQDelOorgqtKn3iqdhL6OQq/X+xZ7e+QCSQeyMW2bpTfLXYtftaFt7ZVdpwZb
-xTH286hlGSoALEZ9vXxWggGPOyU40Je+ZfBoxfxFsypWBbwvMKZIN78Ks9c4yvCE
-2Cv0i1YyJ6n44mramibLRy0A
+hkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb22CFBIh33LK9HJJFAnIXGYwlwq7x81y
+MAwGA1UdEwQFMAMBAf8wHAYDVR0RBBUwE4ILZXhhbXBsZS5jb22HBH8AAAEwBQYD
+K2VxA3MALvYeXe5N6g8SXK9ah4eIyKa9MT2fjwcD0uYCNt8O6re+uCxI+ckbmS6Q
+SLyv9iQG6ZRHBzGOsOSAbngGqGggOBzL4WWo/sHpcFtY1zo7NMFVnoZ/YVpphBh/
+dVYK3xrVDjU/HV80zhrD7S2Nzb0i8AEA
-----END CERTIFICATE-----
diff --git a/certs/ed448/root-ed448.der b/certs/ed448/root-ed448.der
index 181a58397..ae44ed732 100644
Binary files a/certs/ed448/root-ed448.der and b/certs/ed448/root-ed448.der differ
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 c9971b413..d6581895f 100644
Binary files a/certs/ed448/server-ed448.der and b/certs/ed448/server-ed448.der differ
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/intermediate/ca-int-cert.der b/certs/intermediate/ca-int-cert.der
index d7c9a71d6..860e92d52 100644
Binary files a/certs/intermediate/ca-int-cert.der and b/certs/intermediate/ca-int-cert.der differ
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 171c86b1d..4daec9a04 100644
Binary files a/certs/intermediate/ca-int-ecc-cert.der and b/certs/intermediate/ca-int-ecc-cert.der differ
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 000000000..564f83a27
Binary files /dev/null and b/certs/intermediate/ca-int2-cert.der differ
diff --git a/certs/intermediate/ca-int2-cert.pem b/certs/intermediate/ca-int2-cert.pem
new file mode 100644
index 000000000..4411ea1d6
--- /dev/null
+++ b/certs/intermediate/ca-int2-cert.pem
@@ -0,0 +1,84 @@
+Certificate:
+ Data:
+ Version: 3 (0x2)
+ Serial Number: 4097 (0x1001)
+ Signature Algorithm: sha256WithRSAEncryption
+ Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Development, CN = wolfSSL Intermediate CA, emailAddress = info@wolfssl.com
+ Validity
+ 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 Intermediate2 CA, emailAddress = info@wolfssl.com
+ Subject Public Key Info:
+ Public Key Algorithm: rsaEncryption
+ RSA Public-Key: (2048 bit)
+ Modulus:
+ 00:a0:2f:a1:02:30:5d:19:a1:8e:44:86:d4:93:f7:
+ f1:53:ba:3f:d2:24:df:ff:cb:af:8f:a6:e7:f9:87:
+ 9a:1f:00:cc:8f:40:86:78:3a:1b:9a:78:0e:e3:6e:
+ da:f3:e7:6c:57:76:31:cf:03:21:9a:c8:79:29:60:
+ db:ee:d8:a9:15:b4:67:5b:77:9a:86:f9:db:43:cc:
+ a2:0f:91:e6:70:4f:1e:6e:14:b1:8d:f0:a1:e5:39:
+ 77:a1:92:97:88:4a:26:f1:88:98:24:6c:fd:46:e2:
+ 71:07:5d:af:d4:bc:a8:8c:5d:ee:43:08:da:a7:ec:
+ 09:51:ed:ad:cd:75:8b:58:c7:a1:98:56:e7:19:78:
+ 93:4b:53:77:b7:da:79:7d:70:84:bb:1d:e9:a0:3c:
+ 02:bc:a7:96:fa:bb:98:90:ae:35:19:d0:e7:64:1e:
+ 9d:09:a1:06:f2:c2:fd:cb:a3:29:2c:c0:79:f8:e9:
+ e9:93:67:8c:35:2e:a1:49:a0:34:6c:38:1d:6b:4c:
+ a5:ba:c7:84:80:95:17:12:cb:dd:a7:f6:2e:2c:c7:
+ 0f:c1:54:1f:97:6c:01:3b:da:2e:c7:dc:53:c9:26:
+ e6:9a:66:a8:7f:55:fa:cd:72:18:69:87:4e:8c:e4:
+ 02:dd:f7:31:1a:a3:6e:cd:88:43:70:b4:34:6d:a6:
+ 86:75
+ Exponent: 65537 (0x10001)
+ X509v3 extensions:
+ X509v3 Subject Key Identifier:
+ 7A:8B:1D:4E:A3:40:C8:CE:58:5F:8D:FC:FF:46:2C:75:41:D9:03:5E
+ X509v3 Authority Key Identifier:
+ keyid:83:1C:F1:98:85:EC:6E:06:45:34:DE:51:C0:BA:B7:2B:67:32:66:4D
+
+ X509v3 Basic Constraints: critical
+ CA:TRUE, pathlen:1
+ X509v3 Key Usage: critical
+ Digital Signature, Certificate Sign, CRL Sign
+ Signature Algorithm: sha256WithRSAEncryption
+ 0c:72:99:ed:e7:03:58:c2:2b:88:d2:aa:43:31:84:18:2f:de:
+ c5:5d:e0:20:d8:54:3c:5e:2b:87:2a:9f:96:b1:ef:be:d7:c7:
+ 27:71:68:ac:71:61:b8:6e:d1:aa:4b:2f:ef:d4:37:e7:bb:87:
+ 90:63:48:38:9b:20:15:bd:bc:af:8a:b4:af:53:91:8e:84:11:
+ 14:ea:6f:85:f4:4e:ba:0a:49:91:b3:19:99:2a:d1:f9:a7:a7:
+ 6b:fd:7f:78:88:7b:d3:7d:2c:b1:9f:70:15:1a:db:86:9b:ce:
+ b7:07:25:ec:39:8c:59:a3:d2:d1:cc:18:15:14:a0:85:4d:4f:
+ fb:9a:47:2f:dc:66:c7:7d:7c:12:89:48:58:d4:cb:1a:1b:12:
+ ba:9c:ed:5c:8c:bf:72:0e:5f:8e:42:34:4b:6c:3e:04:6f:d9:
+ 50:e3:28:93:6b:13:fd:6b:d6:2d:1b:cd:fb:fe:0b:a3:8c:df:
+ c8:e6:ad:9e:69:8a:93:96:d7:84:31:bb:ca:f2:db:e2:18:c9:
+ f1:91:8a:c7:06:9f:c2:0a:e9:b4:5f:e3:7b:20:fc:1a:16:1c:
+ 02:53:12:cd:66:45:55:6e:b1:c0:95:2d:2b:d6:19:b8:99:4e:
+ 1f:1b:9c:fb:b9:fe:8c:7e:32:57:f3:80:e9:f8:be:25:2f:03:
+ 46:3c:b3:0a
+-----BEGIN CERTIFICATE-----
+MIIEIzCCAwugAwIBAgICEAEwDQYJKoZIhvcNAQELBQAwgZ8xCzAJBgNVBAYTAlVT
+MRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQK
+DAd3b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEgMB4GA1UEAwwXd29sZlNT
+TCBJbnRlcm1lZGlhdGUgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5j
+b20wHhcNMjAwNjE2MTkxNzU3WhcNNDAwNjExMTkxNzU3WjCBoDELMAkGA1UEBhMC
+VVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNV
+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-----
diff --git a/certs/intermediate/ca-int2-ecc-cert.der b/certs/intermediate/ca-int2-ecc-cert.der
new file mode 100644
index 000000000..aecf95922
Binary files /dev/null and b/certs/intermediate/ca-int2-ecc-cert.der differ
diff --git a/certs/intermediate/ca-int2-ecc-cert.pem b/certs/intermediate/ca-int2-ecc-cert.pem
new file mode 100644
index 000000000..f2022a4e1
--- /dev/null
+++ b/certs/intermediate/ca-int2-ecc-cert.pem
@@ -0,0 +1,53 @@
+Certificate:
+ Data:
+ Version: 3 (0x2)
+ Serial Number: 4101 (0x1005)
+ Signature Algorithm: ecdsa-with-SHA256
+ Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Development, CN = wolfSSL Intermediate CA ECC, emailAddress = info@wolfssl.com
+ Validity
+ 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 Intermediate2 CA ECC, emailAddress = info@wolfssl.com
+ Subject Public Key Info:
+ Public Key Algorithm: id-ecPublicKey
+ Public-Key: (256 bit)
+ pub:
+ 04:ea:16:28:2c:27:5e:41:99:05:28:8b:99:fa:c5:
+ a2:74:3c:15:4d:52:f4:4b:2d:83:34:82:8e:d5:b6:
+ 3f:61:d0:87:eb:f8:4c:06:5e:ed:66:1e:8c:ca:a4:
+ f6:2a:76:4f:d7:26:09:4c:1e:89:b9:18:8e:d2:a3:
+ 66:3c:1b:3d:cb
+ ASN1 OID: prime256v1
+ NIST CURVE: P-256
+ X509v3 extensions:
+ X509v3 Subject Key Identifier:
+ 1B:F4:BD:90:28:74:64:E3:33:5E:8B:64:A7:FC:AF:BA:F2:B9:55:E5
+ X509v3 Authority Key Identifier:
+ keyid:13:B5:79:59:32:B3:BB:B4:47:B3:34:0E:80:C0:83:1E:AA:82:C8:5B
+
+ X509v3 Basic Constraints: critical
+ CA:TRUE, pathlen:1
+ X509v3 Key Usage: critical
+ Digital Signature, Certificate Sign, CRL Sign
+ Signature Algorithm: ecdsa-with-SHA256
+ 30:45:02:20:4f:1b:d1:e1:d7:8e:73:b5:8b:f7:4d:0b:3d:fc:
+ 12:bc:6f:7c:ad:b9:12:70:30:37:41:27:ec:6b:35:06:8e:47:
+ 02:21:00:a1:55:91:b7:68:1e:32:66:37:68:10:0a:9f:36:ee:
+ c3:97:2b:85:b8:3c:47:3c:4a:ed:13:c5:5b:59:bc:b5:29
+-----BEGIN CERTIFICATE-----
+MIICnzCCAkWgAwIBAgICEAUwCgYIKoZIzj0EAwIwgaMxCzAJBgNVBAYTAlVTMRMw
+EQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3
+b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEkMCIGA1UEAwwbd29sZlNTTCBJ
+bnRlcm1lZGlhdGUgQ0EgRUNDMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu
+Y29tMB4XDTIwMDYxNjE5MTc1OFoXDTQwMDYxMTE5MTc1OFowgaQxCzAJBgNVBAYT
+AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYD
+VQQKDAd3b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDElMCMGA1UEAwwcd29s
+ZlNTTCBJbnRlcm1lZGlhdGUyIENBIEVDQzEfMB0GCSqGSIb3DQEJARYQaW5mb0B3
+b2xmc3NsLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABOoWKCwnXkGZBSiL
+mfrFonQ8FU1S9EstgzSCjtW2P2HQh+v4TAZe7WYejMqk9ip2T9cmCUweibkYjtKj
+ZjwbPcujZjBkMB0GA1UdDgQWBBQb9L2QKHRk4zNei2Sn/K+68rlV5TAfBgNVHSME
+GDAWgBQTtXlZMrO7tEezNA6AwIMeqoLIWzASBgNVHRMBAf8ECDAGAQH/AgEBMA4G
+A1UdDwEB/wQEAwIBhjAKBggqhkjOPQQDAgNIADBFAiBPG9Hh145ztYv3TQs9/BK8
+b3ytuRJwMDdBJ+xrNQaORwIhAKFVkbdoHjJmN2gQCp827sOXK4W4PEc8Su0TxVtZ
+vLUp
+-----END CERTIFICATE-----
diff --git a/certs/intermediate/ca-int2-ecc-key.der b/certs/intermediate/ca-int2-ecc-key.der
new file mode 100644
index 000000000..c5655a947
Binary files /dev/null and b/certs/intermediate/ca-int2-ecc-key.der differ
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 000000000..508b5050b
Binary files /dev/null and b/certs/intermediate/ca-int2-key.der differ
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 b067fe290..5607711ff 100644
Binary files a/certs/intermediate/client-chain-ecc.der and b/certs/intermediate/client-chain-ecc.der differ
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 0097d2b2c..3e38c9368 100644
Binary files a/certs/intermediate/client-chain.der and b/certs/intermediate/client-chain.der differ
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 e61086695..e9f26c9e1 100644
Binary files a/certs/intermediate/client-int-cert.der and b/certs/intermediate/client-int-cert.der differ
diff --git a/certs/intermediate/client-int-cert.pem b/certs/intermediate/client-int-cert.pem
index 105ba85bb..0a999e3ae 100644
--- a/certs/intermediate/client-int-cert.pem
+++ b/certs/intermediate/client-int-cert.pem
@@ -1,16 +1,16 @@
Certificate:
Data:
Version: 3 (0x2)
- Serial Number: 4098 (0x1002)
- Signature Algorithm: sha256WithRSAEncryption
- Issuer: C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Development, CN=wolfSSL Intermediate CA/emailAddress=info@wolfssl.com
+ Serial Number: 4099 (0x1003)
+ Signature Algorithm: sha256WithRSAEncryption
+ Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Development, CN = wolfSSL Intermediate2 CA, emailAddress = info@wolfssl.com
Validity
- Not Before: Dec 21 17:54:00 2018 GMT
- Not After : Dec 18 17:54:00 2028 GMT
- Subject: C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Development, CN=wolfSSL Client Chain/emailAddress=info@wolfssl.com
+ Not Before: Jun 16 19:17:58 2020 GMT
+ Not After : Jun 14 19:17:58 2030 GMT
+ Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Development, CN = wolfSSL Client Chain, 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:
@@ -39,50 +39,50 @@ Certificate:
X509v3 Subject Key Identifier:
33:D8:45:66:D7:68:87:18:7E:54:0D:70:27:91:C7:26:D7:85:65:C0
X509v3 Authority Key Identifier:
- keyid:EF:69:E0:F7:D5:1D:E6:99:EC:DC:6D:D0:F7:E2:B9:5C:64:71:83:35
+ keyid:7A:8B:1D:4E:A3:40:C8:CE:58:5F:8D:FC:FF:46:2C:75:41:D9:03:5E
X509v3 Key Usage: critical
Digital Signature, Non Repudiation, Key Encipherment
X509v3 Extended Key Usage:
TLS Web Client Authentication, E-mail Protection
Signature Algorithm: sha256WithRSAEncryption
- 88:81:21:78:ac:04:8a:79:7e:cd:a5:ba:3b:fe:52:61:e8:9c:
- 5d:28:91:ca:68:72:31:99:d5:15:78:99:d1:03:ff:b6:13:59:
- 23:48:9e:92:94:cc:91:01:93:dc:19:36:68:d7:48:53:ab:99:
- d8:23:fc:28:98:43:f3:eb:9f:e2:2f:c4:4c:b3:1c:48:35:92:
- 6d:53:46:5d:c1:20:21:07:71:25:a1:37:89:1a:9b:ec:f5:e3:
- d1:15:a0:fe:10:2e:cd:67:d5:3d:6e:d6:b9:f5:38:8d:3a:12:
- c9:2e:f9:e1:a9:c8:6f:d6:04:05:66:df:3c:3a:69:d7:aa:6b:
- 5e:71:0d:e3:53:38:3d:87:4a:1e:c7:88:78:1c:87:5a:21:bd:
- 0f:86:f4:7c:86:bd:51:7d:9c:cb:f2:b2:a6:41:7a:f8:bb:08:
- 11:67:6a:31:9f:48:f6:d1:07:a2:36:87:83:73:68:3b:c9:11:
- 5e:ab:a3:d0:61:9a:df:8d:52:b9:8a:79:d2:f3:5d:b0:3d:15:
- 69:ee:a3:b5:c2:be:b4:3f:11:b0:06:d3:b8:b4:32:45:95:ff:
- 76:48:eb:63:0b:1d:79:0f:55:95:d6:7c:86:d4:61:20:f9:0f:
- a2:82:a4:1f:b1:10:53:d8:e8:c8:27:b3:bd:98:7b:0a:c4:5b:
- 82:d0:6c:cf
+ 3d:fb:9c:0e:c4:33:4d:23:92:85:2d:4a:57:49:73:40:15:2a:
+ ff:c2:7b:e5:66:75:6a:06:de:bd:09:8b:fd:f2:41:e5:b8:af:
+ 96:5c:d5:9e:6f:a0:52:fa:10:12:b0:71:8d:20:43:99:16:2a:
+ 39:46:ed:f5:3a:b3:03:35:9d:85:1e:e7:ee:f9:61:4b:9d:20:
+ a2:16:76:69:67:77:06:83:f5:c0:97:0c:d9:b1:b5:d6:7d:77:
+ c0:93:27:a9:27:f0:31:b4:ac:8d:73:3c:f1:73:19:74:af:f7:
+ 67:07:68:bd:c5:28:93:88:dd:90:b1:12:9f:64:a6:ba:c4:c0:
+ 46:7c:e3:0a:db:ae:c7:39:6c:9c:01:0a:ba:64:db:74:e5:02:
+ 72:38:cd:8e:b2:2e:ef:18:c2:a6:e7:6d:3f:8f:c4:92:ca:ad:
+ e0:0c:8a:f2:48:ca:e1:1c:c9:20:a6:de:d3:c5:23:54:7d:10:
+ c7:db:f5:8c:39:b2:79:51:3f:f3:d7:15:f2:22:47:9b:7b:00:
+ d8:54:e3:c0:73:21:68:7c:d6:f2:cc:fa:b3:27:85:a8:2a:65:
+ c7:6d:85:d1:77:62:79:cf:64:3d:24:6c:cc:d2:5b:bc:fe:fa:
+ a9:a3:e9:85:85:1f:87:8d:6d:6f:db:f0:a4:b6:59:a8:f1:37:
+ a5:8d:3f:9d
-----BEGIN CERTIFICATE-----
-MIIESjCCAzKgAwIBAgICEAIwDQYJKoZIhvcNAQELBQAwgZ8xCzAJBgNVBAYTAlVT
+MIIESzCCAzOgAwIBAgICEAMwDQYJKoZIhvcNAQELBQAwgaAxCzAJBgNVBAYTAlVT
MRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQK
-DAd3b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEgMB4GA1UEAwwXd29sZlNT
-TCBJbnRlcm1lZGlhdGUgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5j
-b20wHhcNMTgxMjIxMTc1NDAwWhcNMjgxMjE4MTc1NDAwWjCBnDELMAkGA1UEBhMC
-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==
+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-----
diff --git a/certs/intermediate/client-int-ecc-cert.der b/certs/intermediate/client-int-ecc-cert.der
index 6b806bbc5..794f5eead 100644
Binary files a/certs/intermediate/client-int-ecc-cert.der and b/certs/intermediate/client-int-ecc-cert.der differ
diff --git a/certs/intermediate/client-int-ecc-cert.pem b/certs/intermediate/client-int-ecc-cert.pem
index 4b9fbddd2..e69590f1f 100644
--- a/certs/intermediate/client-int-ecc-cert.pem
+++ b/certs/intermediate/client-int-ecc-cert.pem
@@ -1,17 +1,17 @@
Certificate:
Data:
Version: 3 (0x2)
- Serial Number: 4101 (0x1005)
- Signature Algorithm: ecdsa-with-SHA256
- Issuer: C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Development, CN=wolfSSL Intermediate CA ECC/emailAddress=info@wolfssl.com
+ Serial Number: 4103 (0x1007)
+ Signature Algorithm: ecdsa-with-SHA256
+ Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Development, CN = wolfSSL Intermediate2 CA ECC, emailAddress = info@wolfssl.com
Validity
- Not Before: Dec 21 17:54:01 2018 GMT
- Not After : Dec 18 17:54:01 2028 GMT
- Subject: C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Development, CN=wolfSSL Client Chain ECC/emailAddress=info@wolfssl.com
+ Not Before: Jun 16 19:17:58 2020 GMT
+ Not After : Jun 14 19:17:58 2030 GMT
+ Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Development, CN = wolfSSL Client Chain ECC, 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:
@@ -27,31 +27,31 @@ Certificate:
X509v3 Subject Key Identifier:
EB:D4:4B:59:6B:95:61:3F:51:57:B6:04:4D:89:41:88:44:5C:AB:F2
X509v3 Authority Key Identifier:
- keyid:97:1D:60:C3:87:22:59:9B:60:1F:84:B4:99:1C:88:4D:BF:DA:1E:6E
+ keyid:1B:F4:BD:90:28:74:64:E3:33:5E:8B:64:A7:FC:AF:BA:F2:B9:55:E5
X509v3 Key Usage: critical
Digital Signature, Non Repudiation, Key Encipherment
X509v3 Extended Key Usage:
TLS Web Client Authentication, E-mail Protection
Signature Algorithm: ecdsa-with-SHA256
- 30:45:02:20:5e:e8:cc:ba:d9:8c:d5:47:f1:00:9f:f6:b6:22:
- 39:45:a4:27:a4:b4:e6:5b:0a:72:74:c0:50:74:2a:28:a5:65:
- 02:21:00:aa:1f:2e:ef:5d:62:5c:e7:e4:93:01:ef:bc:0c:8a:
- 34:a8:86:e8:b7:7c:00:4e:03:b4:17:e3:72:fe:65:81:df
+ 30:46:02:21:00:ae:82:3d:35:16:73:d5:1e:e5:a7:34:cf:27:
+ 70:42:99:dc:59:5a:8a:36:25:37:81:89:c5:84:a6:95:80:9d:
+ ad:02:21:00:d9:8e:1d:7e:6d:24:a0:7e:31:82:25:09:e8:e1:
+ d8:b6:ba:4e:99:5f:b9:4d:e3:66:3e:11:61:ba:e2:2a:7a:e3
-----BEGIN CERTIFICATE-----
-MIICxjCCAmygAwIBAgICEAUwCgYIKoZIzj0EAwIwgaMxCzAJBgNVBAYTAlVTMRMw
+MIICyDCCAm2gAwIBAgICEAcwCgYIKoZIzj0EAwIwgaQxCzAJBgNVBAYTAlVTMRMw
EQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3
-b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEkMCIGA1UEAwwbd29sZlNTTCBJ
-bnRlcm1lZGlhdGUgQ0EgRUNDMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu
-Y29tMB4XDTE4MTIyMTE3NTQwMVoXDTI4MTIxODE3NTQwMVowgaAxCzAJBgNVBAYT
-AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYD
-VQQKDAd3b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEhMB8GA1UEAwwYd29s
-ZlNTTCBDbGllbnQgQ2hhaW4gRUNDMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZz
-c2wuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEVb/0D0RQmj3Om7fwxU31
-cHvU7CSOGYDsWkyiJANiLJva76I1EkOEdhbGVpUGzAGpvfZ1GkL3vamyNiJfx11/
-tKOBkDCBjTAJBgNVHRMEAjAAMBEGCWCGSAGG+EIBAQQEAwIFoDAdBgNVHQ4EFgQU
-69RLWWuVYT9RV7YETYlBiERcq/IwHwYDVR0jBBgwFoAUlx1gw4ciWZtgH4S0mRyI
-Tb/aHm4wDgYDVR0PAQH/BAQDAgXgMB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEF
-BQcDBDAKBggqhkjOPQQDAgNIADBFAiBe6My62YzVR/EAn/a2IjlFpCektOZbCnJ0
-wFB0KiilZQIhAKofLu9dYlzn5JMB77wMijSohui3fABOA7QX43L+ZYHf
+b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDElMCMGA1UEAwwcd29sZlNTTCBJ
+bnRlcm1lZGlhdGUyIENBIEVDQzEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3Ns
+LmNvbTAeFw0yMDA2MTYxOTE3NThaFw0zMDA2MTQxOTE3NThaMIGgMQswCQYDVQQG
+EwJVUzETMBEGA1UECAwKV2FzaGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEQMA4G
+A1UECgwHd29sZlNTTDEUMBIGA1UECwwLRGV2ZWxvcG1lbnQxITAfBgNVBAMMGHdv
+bGZTU0wgQ2xpZW50IENoYWluIEVDQzEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xm
+c3NsLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABFW/9A9EUJo9zpu38MVN
+9XB71OwkjhmA7FpMoiQDYiyb2u+iNRJDhHYWxlaVBswBqb32dRpC972psjYiX8dd
+f7SjgZAwgY0wCQYDVR0TBAIwADARBglghkgBhvhCAQEEBAMCBaAwHQYDVR0OBBYE
+FOvUS1lrlWE/UVe2BE2JQYhEXKvyMB8GA1UdIwQYMBaAFBv0vZAodGTjM16LZKf8
+r7ryuVXlMA4GA1UdDwEB/wQEAwIF4DAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYB
+BQUHAwQwCgYIKoZIzj0EAwIDSQAwRgIhAK6CPTUWc9Ue5ac0zydwQpncWVqKNiU3
+gYnFhKaVgJ2tAiEA2Y4dfm0koH4xgiUJ6OHYtrpOmV+5TeNmPhFhuuIqeuM=
-----END CERTIFICATE-----
diff --git a/certs/intermediate/genintcerts.sh b/certs/intermediate/genintcerts.sh
index 920b6f94d..5eb299a5b 100755
--- a/certs/intermediate/genintcerts.sh
+++ b/certs/intermediate/genintcerts.sh
@@ -8,32 +8,40 @@
# C=US, ST=Montana, L=Bozeman, O=Sawtooth, OU=Consulting, CN=www.wolfssl.com/emailAddress=info@wolfssl.com)
# INTERMEDIATE: ./certs/intermediate/ca-int-cert.pem
# C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Development, CN=wolfSSL Intermediate CA/emailAddress=info@wolfssl.com
-# SERVER: ./certs/intermediate/server-int-cert.pem
-# C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Development, CN=wolfSSL Server Chain/emailAddress=info@wolfssl.com
+# INTERMEDIATE2: ./certs/intermediate/ca-int2-cert.pem
+# C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Development, CN=wolfSSL Intermediate2 CA/emailAddress=info@wolfssl.com
+# SERVER: ./certs/intermediate/server-int-cert.pem
+# C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Development, CN=wolfSSL Server Chain/emailAddress=info@wolfssl.com
# RSA Client
# ROOT: ./certs/ca-cert.pem
# C=US, ST=Montana, L=Bozeman, O=Sawtooth, OU=Consulting, CN=www.wolfssl.com/emailAddress=info@wolfssl.com)
# INTERMEDIATE: ./certs/intermediate/ca-int-cert.pem
# C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Development, CN=wolfSSL Intermediate CA/emailAddress=info@wolfssl.com
-# CLIENT: ./certs/intermediate/client-int-cert.pem
-# C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Development, CN=wolfSSL Client Chain/emailAddress=info@wolfssl.com
+# INTERMEDIATE: ./certs/intermediate/ca-int2-cert.pem
+# C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Development, CN=wolfSSL Intermediate2 CA/emailAddress=info@wolfssl.com
+# CLIENT: ./certs/intermediate/client-int-cert.pem
+# C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Development, CN=wolfSSL Client Chain/emailAddress=info@wolfssl.com
# ECC Server
# ROOT: ./certs/ca-ecc-cert.pem
# C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Development, CN=www.wolfssl.com/emailAddress=info@wolfssl.com
# INTERMEDIATE: ./certs/intermediate/ca-int-ecc-cert.pem
# C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Development, CN=wolfSSL Intermediate CA ECC/emailAddress=info@wolfssl.com
-# SERVER: ./certs/intermediate/server-int-ecc-cert.pem
-# C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Development, CN=wolfSSL Server Chain ECC/emailAddress=info@wolfssl.com
+# INTERMEDIATE2: ./certs/intermediate/ca-int-ecc-cert.pem
+# C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Development, CN=wolfSSL Intermediate2 CA ECC/emailAddress=info@wolfssl.com
+# SERVER: ./certs/intermediate/server-int-ecc-cert.pem
+# C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Development, CN=wolfSSL Server Chain ECC/emailAddress=info@wolfssl.com
# ECC Client
# ROOT: ./certs/ca-ecc-cert.pem
# C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Development, CN=www.wolfssl.com/emailAddress=info@wolfssl.com
# INTERMEDIATE: ./certs/intermediate/ca-int-ecc-cert.pem
# C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Development, CN=wolfSSL Intermediate CA ECC/emailAddress=info@wolfssl.com
-# CLIENT: ./certs/intermediate/client-int-ecc-cert.pem
-# C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Development, CN=wolfSSL Client Chain ECC/emailAddress=info@wolfssl.com
+# INTERMEDIATE2: ./certs/intermediate/ca-int2-ecc-cert.pem
+# C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Development, CN=wolfSSL Intermediate2 CA ECC/emailAddress=info@wolfssl.com
+# CLIENT: ./certs/intermediate/client-int-ecc-cert.pem
+# C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Development, CN=wolfSSL Client Chain ECC/emailAddress=info@wolfssl.com
# Run from wolfssl-root as `./certs/intermediate/genintcerts.sh`
@@ -130,7 +138,13 @@ create_ca_config() {
echo "[ v3_intermediate_ca ]" >> "$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..d3c469e9d 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 \
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 2e1c7742d..38a815114 100644
Binary files a/certs/intermediate/server-chain-ecc.der and b/certs/intermediate/server-chain-ecc.der differ
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 04c47848f..7bf08926f 100644
Binary files a/certs/intermediate/server-chain.der and b/certs/intermediate/server-chain.der differ
diff --git a/certs/intermediate/server-chain.pem b/certs/intermediate/server-chain.pem
index bf66d2bf8..3a583b93f 100644
--- a/certs/intermediate/server-chain.pem
+++ b/certs/intermediate/server-chain.pem
@@ -1,53 +1,78 @@
-----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-----
diff --git a/certs/intermediate/server-int-cert.der b/certs/intermediate/server-int-cert.der
index 3af5f5a1e..b070160db 100644
Binary files a/certs/intermediate/server-int-cert.der and b/certs/intermediate/server-int-cert.der differ
diff --git a/certs/intermediate/server-int-cert.pem b/certs/intermediate/server-int-cert.pem
index 66edf0b5b..507c5d530 100644
--- a/certs/intermediate/server-int-cert.pem
+++ b/certs/intermediate/server-int-cert.pem
@@ -1,16 +1,16 @@
Certificate:
Data:
Version: 3 (0x2)
- Serial Number: 4097 (0x1001)
- Signature Algorithm: sha256WithRSAEncryption
- Issuer: C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Development, CN=wolfSSL Intermediate CA/emailAddress=info@wolfssl.com
+ Serial Number: 4098 (0x1002)
+ Signature Algorithm: sha256WithRSAEncryption
+ Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Development, CN = wolfSSL Intermediate2 CA, emailAddress = info@wolfssl.com
Validity
- Not Before: Dec 21 17:54:00 2018 GMT
- Not After : Dec 18 17:54:00 2028 GMT
- Subject: C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Development, CN=wolfSSL Server Chain/emailAddress=info@wolfssl.com
+ Not Before: Jun 16 19:17:58 2020 GMT
+ Not After : Jun 14 19:17:58 2030 GMT
+ Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Development, CN = wolfSSL Server Chain, 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:
@@ -39,56 +39,56 @@ Certificate:
X509v3 Subject Key Identifier:
B3:11:32:C9:92:98:84:E2:C9:F8:D0:3B:6E:03:42:CA:1F:0E:8E:3C
X509v3 Authority Key Identifier:
- keyid:EF:69:E0:F7:D5:1D:E6:99:EC:DC:6D:D0:F7:E2:B9:5C:64:71:83:35
- DirName:/C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting/CN=www.wolfssl.com/emailAddress=info@wolfssl.com
- serial:10:00
+ keyid:7A:8B:1D:4E:A3:40:C8:CE:58:5F:8D:FC:FF:46:2C:75:41:D9:03:5E
+ DirName:/C=US/ST=Washington/L=Seattle/O=wolfSSL/OU=Development/CN=wolfSSL Intermediate CA/emailAddress=info@wolfssl.com
+ serial:10:01
X509v3 Key Usage: critical
Digital Signature, Key Encipherment, Key Agreement
X509v3 Extended Key Usage:
TLS Web Server Authentication
Signature Algorithm: sha256WithRSAEncryption
- 3d:b5:8d:66:7e:85:a0:87:cc:53:a4:c7:c9:63:6b:d4:c4:44:
- c7:45:d0:71:ef:2f:58:92:60:7d:c8:37:ed:64:ea:b1:ab:00:
- 1b:56:fe:f7:77:78:76:fd:64:63:7d:78:ff:d4:ae:58:1b:f0:
- 14:e9:e7:bd:4b:ec:36:6f:34:cb:91:b0:43:25:66:8b:c0:59:
- d1:ea:ed:25:0d:5c:72:8a:29:de:8a:c8:77:51:b9:d5:c4:e5:
- 26:50:0c:bd:d7:a1:eb:fa:93:ec:3d:36:8f:cf:ee:b6:6b:5c:
- a8:4f:1b:71:c6:4d:2c:af:d2:da:20:c8:89:f3:fc:db:84:c2:
- a9:f6:97:62:ac:aa:a7:6b:fb:3b:21:51:85:7a:73:55:34:82:
- 9b:f8:99:cb:96:89:a2:d3:39:5f:b3:0d:5f:8e:9e:46:4a:55:
- 57:ab:de:11:cf:80:1f:25:c9:ec:6f:48:fd:ce:5b:d2:05:07:
- 6b:4e:fc:0d:10:a0:8a:82:fb:e4:77:3a:27:e0:0e:0c:fb:43:
- 64:5f:90:8e:26:12:94:db:97:18:ec:19:94:1b:56:5c:b9:bb:
- 26:9b:1c:15:5c:07:df:d1:2d:9d:41:96:c0:2a:5a:4a:9e:5f:
- 9e:66:9a:8c:6c:ff:6c:ca:a1:7d:b6:12:a3:d4:33:0b:00:1e:
- ba:5d:3d:7a
+ 92:90:bf:56:5d:98:21:ce:d6:0a:8d:7c:af:ba:9b:59:d8:33:
+ c1:21:0f:6f:31:1c:13:c5:9f:de:a8:7d:ef:e5:c5:0b:8b:7e:
+ 18:cb:9d:d8:de:c9:3d:32:ee:ff:d0:89:98:3b:33:68:db:cd:
+ 66:5e:9d:ee:da:53:34:65:21:e3:43:f6:a7:b2:79:b5:79:2c:
+ 2e:23:3f:3e:61:59:80:88:fd:c3:c5:04:e9:ad:52:a9:58:7d:
+ ef:c5:a7:85:1a:55:60:e1:0d:7e:11:c8:ba:59:d8:c6:1d:36:
+ 04:63:8e:7d:af:28:fd:13:7a:32:f5:29:d7:0a:ef:06:3c:85:
+ 90:b6:c6:4f:39:b1:18:ee:be:17:a5:44:17:87:b3:94:a1:34:
+ 62:4c:77:c8:06:93:c8:03:f5:f2:aa:5b:ff:d0:9a:ad:f3:b2:
+ ca:5b:81:54:ef:1b:39:f8:c6:77:f1:80:50:0f:0c:6e:94:14:
+ 62:a3:fc:99:8e:d2:e3:36:b8:25:1b:6d:55:d2:1b:21:97:d3:
+ 84:e6:96:ee:9f:b3:00:44:70:3a:9f:fc:62:e2:42:1a:93:1e:
+ fc:9e:ec:8d:1c:7a:1a:b1:13:46:4e:eb:0d:28:b9:4d:08:e6:
+ 09:31:c0:bb:2e:07:e0:cb:a9:5a:06:87:c4:8e:ba:6b:2f:75:
+ 54:85:36:f5
-----BEGIN CERTIFICATE-----
-MIIE5jCCA86gAwIBAgICEAEwDQYJKoZIhvcNAQELBQAwgZ8xCzAJBgNVBAYTAlVT
+MIIE8jCCA9qgAwIBAgICEAIwDQYJKoZIhvcNAQELBQAwgaAxCzAJBgNVBAYTAlVT
MRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQK
-DAd3b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEgMB4GA1UEAwwXd29sZlNT
-TCBJbnRlcm1lZGlhdGUgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5j
-b20wHhcNMTgxMjIxMTc1NDAwWhcNMjgxMjE4MTc1NDAwWjCBnDELMAkGA1UEBhMC
-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==
+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-----
diff --git a/certs/intermediate/server-int-ecc-cert.der b/certs/intermediate/server-int-ecc-cert.der
index e51fff2a6..3ea016149 100644
Binary files a/certs/intermediate/server-int-ecc-cert.der and b/certs/intermediate/server-int-ecc-cert.der differ
diff --git a/certs/intermediate/server-int-ecc-cert.pem b/certs/intermediate/server-int-ecc-cert.pem
index 8b19fcd0e..35039829e 100644
--- a/certs/intermediate/server-int-ecc-cert.pem
+++ b/certs/intermediate/server-int-ecc-cert.pem
@@ -1,17 +1,17 @@
Certificate:
Data:
Version: 3 (0x2)
- Serial Number: 4100 (0x1004)
- Signature Algorithm: ecdsa-with-SHA256
- Issuer: C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Development, CN=wolfSSL Intermediate CA ECC/emailAddress=info@wolfssl.com
+ Serial Number: 4102 (0x1006)
+ Signature Algorithm: ecdsa-with-SHA256
+ Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Development, CN = wolfSSL Intermediate2 CA ECC, emailAddress = info@wolfssl.com
Validity
- Not Before: Dec 21 17:54:01 2018 GMT
- Not After : Dec 18 17:54:01 2028 GMT
- Subject: C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Development, CN=wolfSSL Server Chain ECC/emailAddress=info@wolfssl.com
+ Not Before: Jun 16 19:17:58 2020 GMT
+ Not After : Jun 14 19:17:58 2030 GMT
+ Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Development, CN = wolfSSL Server Chain ECC, 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:
@@ -27,37 +27,37 @@ Certificate:
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:97:1D:60:C3:87:22:59:9B:60:1F:84:B4:99:1C:88:4D:BF:DA:1E:6E
- DirName:/C=US/ST=Washington/L=Seattle/O=wolfSSL/OU=Development/CN=www.wolfssl.com/emailAddress=info@wolfssl.com
- serial:10:03
+ keyid:1B:F4:BD:90:28:74:64:E3:33:5E:8B:64:A7:FC:AF:BA:F2:B9:55:E5
+ DirName:/C=US/ST=Washington/L=Seattle/O=wolfSSL/OU=Development/CN=wolfSSL Intermediate CA ECC/emailAddress=info@wolfssl.com
+ serial:10:05
X509v3 Key Usage: critical
Digital Signature, Key Encipherment, Key Agreement
X509v3 Extended Key Usage:
TLS Web Server Authentication
Signature Algorithm: ecdsa-with-SHA256
- 30:44:02:20:74:5c:69:0b:da:f1:d8:cf:21:bc:81:ac:b1:e5:
- c5:b3:38:72:f9:9c:f1:50:2d:31:26:49:58:c3:de:cb:e5:7d:
- 02:20:78:9d:3f:5b:e2:12:bb:1b:2d:3d:25:db:2b:a8:f4:76:
- 02:90:7b:24:a8:1d:49:96:45:56:57:8b:bb:59:54:fa
+ 30:46:02:21:00:98:d0:e2:f9:89:ca:b2:74:36:a7:33:0b:fe:
+ 14:90:10:45:7a:2d:6d:40:44:db:08:ec:45:79:8b:4e:91:e0:
+ d5:02:21:00:ea:11:1b:c1:b5:95:bc:bf:d9:f5:99:37:d1:d2:
+ e6:b8:aa:19:bd:97:42:09:bb:0a:51:6c:4e:a2:61:72:e8:44
-----BEGIN CERTIFICATE-----
-MIIDZDCCAwugAwIBAgICEAQwCgYIKoZIzj0EAwIwgaMxCzAJBgNVBAYTAlVTMRMw
+MIIDczCCAxigAwIBAgICEAYwCgYIKoZIzj0EAwIwgaQxCzAJBgNVBAYTAlVTMRMw
EQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3
-b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEkMCIGA1UEAwwbd29sZlNTTCBJ
-bnRlcm1lZGlhdGUgQ0EgRUNDMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu
-Y29tMB4XDTE4MTIyMTE3NTQwMVoXDTI4MTIxODE3NTQwMVowgaAxCzAJBgNVBAYT
-AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYD
-VQQKDAd3b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEhMB8GA1UEAwwYd29s
-ZlNTTCBTZXJ2ZXIgQ2hhaW4gRUNDMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZz
-c2wuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuzOsTCdQSsZKpQTDPN6f
-NttyLc6U6iv6yyAJOSwW6GEC6a9N0wKTmjFbl5Ihf/DPGNqREQI0huggWDMLgDSJ
-2KOCAS4wggEqMAkGA1UdEwQCMAAwEQYJYIZIAYb4QgEBBAQDAgZAMB0GA1UdDgQW
-BBRdXSbvrH42+Zt2FStKJQIj77KJMDCBxQYDVR0jBIG9MIG6gBSXHWDDhyJZm2Af
-hLSZHIhNv9oebqGBnaSBmjCBlzELMAkGA1UEBhMCVVMxEzARBgNVBAgMCldhc2hp
-bmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoMB3dvbGZTU0wxFDASBgNV
-BAsMC0RldmVsb3BtZW50MRgwFgYDVQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkq
-hkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb22CAhADMA4GA1UdDwEB/wQEAwIDqDAT
-BgNVHSUEDDAKBggrBgEFBQcDATAKBggqhkjOPQQDAgNHADBEAiB0XGkL2vHYzyG8
-gayx5cWzOHL5nPFQLTEmSVjD3svlfQIgeJ0/W+ISuxstPSXbK6j0dgKQeySoHUmW
-RVZXi7tZVPo=
+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-----
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 0dc446b09..a13ba302f 100644
Binary files a/certs/server-cert.der and b/certs/server-cert.der differ
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 b53fe8c81..da32ddbd6 100644
Binary files a/certs/server-ecc-comp.der and b/certs/server-ecc-comp.der differ
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 82aba2a5d..ad7914106 100644
Binary files a/certs/server-ecc-rsa.der and b/certs/server-ecc-rsa.der differ
diff --git a/certs/server-ecc-rsa.pem b/certs/server-ecc-rsa.pem
index ab51f6dd6..c72a77cb5 100644
--- a/certs/server-ecc-rsa.pem
+++ b/certs/server-ecc-rsa.pem
@@ -2,16 +2,16 @@ 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=Elliptic - RSAsig, OU=ECC-RSAsig, 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 - RSAsig, OU = ECC-RSAsig, 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:
@@ -25,46 +25,49 @@ 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
- 0c:bb:67:bd:fc:cd:53:6c:fb:4e:58:c8:ea:52:92:eb:e4:c8:
- bc:57:0f:08:20:c8:83:b0:d5:ea:57:27:bd:68:91:fb:99:84:
- 8d:15:9e:4f:8f:c4:cb:34:61:c0:59:12:9b:c8:82:17:38:4f:
- 9e:53:08:a3:69:2e:2f:c0:b4:2f:a2:4e:10:64:b0:07:a1:51:
- 08:1d:91:53:a2:79:55:20:41:65:35:3e:0b:38:01:57:02:8c:
- 25:e7:ab:4f:8b:59:f0:ed:8e:4a:15:0b:32:fb:7a:8b:02:ea:
- 9d:e1:ab:c4:07:cc:da:0f:a3:16:db:8e:5b:bc:96:ab:10:b8:
- de:09:8b:f7:cb:a7:78:66:17:e3:25:6e:57:9d:13:61:7b:55:
- 1a:df:8f:39:15:4e:42:22:00:85:c4:51:0b:6b:a6:67:c0:fb:
- ea:22:77:7d:48:76:ab:39:20:09:d5:52:89:3e:6b:30:7b:50:
- 18:e8:62:05:be:bb:7f:16:77:9c:bb:5a:22:96:99:b0:96:83:
- b7:43:31:97:cf:fd:85:52:d8:52:c8:67:5c:f8:22:72:35:93:
- 92:6c:ec:3c:6a:c6:81:20:a5:cd:50:f9:21:7a:a6:7a:1e:e7:
- 59:22:5d:8a:93:51:8e:fb:29:56:fb:be:9b:87:48:5f:a5:72:
- e7:4e:fe:5e
+ 76:70:55:ea:cd:57:d3:a6:32:44:f8:77:90:0f:da:5c:86:ce:
+ bd:6e:a2:52:22:51:e9:91:e6:0b:76:8e:51:8a:09:26:2a:c9:
+ 18:d1:3b:c1:37:14:6c:00:0a:d0:49:03:d8:ed:91:d6:e9:c7:
+ e4:62:c3:10:8f:e5:34:a2:bf:a2:eb:5a:18:a2:56:37:94:a4:
+ 1e:94:67:86:55:11:08:5b:c1:b1:da:3f:a3:21:af:94:a6:64:
+ 90:48:07:a8:7b:73:5b:b1:81:38:7e:36:9e:4e:7d:64:60:c1:
+ 19:63:db:96:97:3b:63:86:d1:0c:2b:6c:ef:c6:44:ec:df:3f:
+ a1:8c:c5:d7:e6:4a:a3:bc:dd:85:d5:b1:d1:8b:55:a1:a4:c5:
+ fd:46:f1:f8:19:1e:92:f5:19:ea:ec:3c:9b:93:ae:59:20:89:
+ b6:c4:39:9d:cc:89:f5:e1:d5:69:00:ce:62:0b:0f:32:41:54:
+ 58:ac:d5:20:51:92:50:27:43:64:da:ec:2e:5a:7d:23:b2:25:
+ 43:73:72:81:1e:87:57:0f:29:09:d3:ca:a0:0e:cd:8e:93:95:
+ 50:f7:2d:21:56:8f:45:02:ae:8b:3e:3f:7d:be:c8:d6:85:b5:
+ d6:65:89:dd:d9:a9:63:60:9a:b1:b6:3b:ab:62:90:16:8b:95:
+ 49:b9:e5:96
-----BEGIN CERTIFICATE-----
-MIID4DCCAsigAwIBAgIBATANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx
+MIIECzCCAvOgAwIBAgIBATANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx
EDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNh
d3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cud29sZnNz
-bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMTgwNDEz
-MTUyMzEwWhcNMjEwMTA3MTUyMzEwWjCBnTELMAkGA1UEBhMCVVMxEDAOBgNVBAgM
+bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjAwNTA3
+MDczOTA0WhcNMjMwMjAxMDczOTA0WjCBnTELMAkGA1UEBhMCVVMxEDAOBgNVBAgM
B01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xGjAYBgNVBAoMEUVsbGlwdGljIC0g
UlNBc2lnMRMwEQYDVQQLDApFQ0MtUlNBc2lnMRgwFgYDVQQDDA93d3cud29sZnNz
bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wWTATBgcqhkjO
PQIBBggqhkjOPQMBBwNCAAS7M6xMJ1BKxkqlBMM83p8223ItzpTqK/rLIAk5LBbo
-YQLpr03TApOaMVuXkiF/8M8Y2pERAjSG6CBYMwuANInYo4H8MIH5MB0GA1UdDgQW
-BBRdXSbvrH42+Zt2FStKJQIj77KJMDCByQYDVR0jBIHBMIG+gBQnjmcRdMMmHT/t
-M2OzpNgdMOXo1aGBmqSBlzCBlDELMAkGA1UEBhMCVVMxEDAOBgNVBAgMB01vbnRh
-bmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNhd3Rvb3RoMRMwEQYDVQQL
-DApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG
-9w0BCQEWEGluZm9Ad29sZnNzbC5jb22CCQCG//WOEN64+zAMBgNVHRMEBTADAQH/
-MA0GCSqGSIb3DQEBCwUAA4IBAQAMu2e9/M1TbPtOWMjqUpLr5Mi8Vw8IIMiDsNXq
-Vye9aJH7mYSNFZ5Pj8TLNGHAWRKbyIIXOE+eUwijaS4vwLQvok4QZLAHoVEIHZFT
-onlVIEFlNT4LOAFXAowl56tPi1nw7Y5KFQsy+3qLAuqd4avEB8zaD6MW245bvJar
-ELjeCYv3y6d4ZhfjJW5XnRNhe1Ua3485FU5CIgCFxFELa6ZnwPvqInd9SHarOSAJ
-1VKJPmswe1AY6GIFvrt/Fnecu1oilpmwloO3QzGXz/2FUthSyGdc+CJyNZOSbOw8
-asaBIKXNUPkheqZ6HudZIl2Kk1GO+ylW+76bh0hfpXLnTv5e
+YQLpr03TApOaMVuXkiF/8M8Y2pERAjSG6CBYMwuANInYo4IBJjCCASIwHQYDVR0O
+BBYEFF1dJu+sfjb5m3YVK0olAiPvsokwMIHUBgNVHSMEgcwwgcmAFCeOZxF0wyYd
+P+0zY7Ok2B0w5ejVoYGapIGXMIGUMQswCQYDVQQGEwJVUzEQMA4GA1UECAwHTW9u
+dGFuYTEQMA4GA1UEBwwHQm96ZW1hbjERMA8GA1UECgwIU2F3dG9vdGgxEzARBgNV
+BAsMCkNvbnN1bHRpbmcxGDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEfMB0GCSqG
+SIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIUPzITUpLG30rVQgVssLIuRsL4uGcw
+DAYDVR0TBAUwAwEB/zAcBgNVHREEFTATggtleGFtcGxlLmNvbYcEfwAAATANBgkq
+hkiG9w0BAQsFAAOCAQEAdnBV6s1X06YyRPh3kA/aXIbOvW6iUiJR6ZHmC3aOUYoJ
+JirJGNE7wTcUbAAK0EkD2O2R1unH5GLDEI/lNKK/outaGKJWN5SkHpRnhlURCFvB
+sdo/oyGvlKZkkEgHqHtzW7GBOH42nk59ZGDBGWPblpc7Y4bRDCts78ZE7N8/oYzF
+1+ZKo7zdhdWx0YtVoaTF/Ubx+BkekvUZ6uw8m5OuWSCJtsQ5ncyJ9eHVaQDOYgsP
+MkFUWKzVIFGSUCdDZNrsLlp9I7IlQ3NygR6HVw8pCdPKoA7NjpOVUPctIVaPRQKu
+iz4/fb7I1oW11mWJ3dmpY2CasbY7q2KQFouVSbnllg==
-----END CERTIFICATE-----
diff --git a/certs/server-ecc.der b/certs/server-ecc.der
index 837396770..70575357d 100644
Binary files a/certs/server-ecc.der and b/certs/server-ecc.der differ
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 f52482f9b..641c8aa01 100644
Binary files a/certs/test-degenerate.p7b and b/certs/test-degenerate.p7b differ
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 c85fdd279..cdf471842 100644
Binary files a/certs/test-servercert.p12 and b/certs/test-servercert.p12 differ
diff --git a/certs/test/cert-ext-ia.der b/certs/test/cert-ext-ia.der
index a6fb6508c..75508bcc4 100644
Binary files a/certs/test/cert-ext-ia.der and b/certs/test/cert-ext-ia.der differ
diff --git a/certs/test/cert-ext-nc.der b/certs/test/cert-ext-nc.der
index 10438666b..2f933347d 100644
Binary files a/certs/test/cert-ext-nc.der and b/certs/test/cert-ext-nc.der differ
diff --git a/certs/test/cert-ext-nct.der b/certs/test/cert-ext-nct.der
index febf458ba..2329427b5 100644
Binary files a/certs/test/cert-ext-nct.der and b/certs/test/cert-ext-nct.der differ
diff --git a/certs/test/digsigku.pem b/certs/test/digsigku.pem
index 5086b7d7c..4285da038 100644
--- a/certs/test/digsigku.pem
+++ b/certs/test/digsigku.pem
@@ -1,17 +1,18 @@
Certificate:
Data:
Version: 3 (0x2)
- Serial Number: 16393466893990650224 (0xe3814b48a5706170)
- Signature Algorithm: ecdsa-with-SHA1
- Issuer: C=US, ST=Washington, L=Seattle, O=Foofarah, OU=Arglebargle, CN=foobarbaz/emailAddress=info@worlss.com
+ Serial Number:
+ e3:81:4b:48:a5:70:61:70
+ Signature Algorithm: ecdsa-with-SHA1
+ Issuer: C = US, ST = Washington, L = Seattle, O = Foofarah, OU = Arglebargle, CN = foobarbaz, emailAddress = info@worlss.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=Foofarah, OU=Arglebargle, CN=foobarbaz/emailAddress=info@worlss.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 = Foofarah, OU = Arglebargle, CN = foobarbaz, emailAddress = info@worlss.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:
@@ -32,16 +33,16 @@ Certificate:
X509v3 Key Usage: critical
Non Repudiation, Key Encipherment
Signature Algorithm: ecdsa-with-SHA1
- 30:45:02:21:00:fb:11:b6:9b:9a:26:b0:36:ad:ad:5a:5e:34:
- 75:58:3a:93:01:af:f7:b7:00:25:85:8b:0d:4b:35:6e:43:13:
- ec:02:20:14:8b:f5:04:a0:99:75:91:cd:76:1b:6a:3e:14:fc:
- 96:13:fe:dd:d1:82:4a:3a:83:2b:2f:f0:a6:a6:c5:a5:bb
+ 30:45:02:21:00:8f:ed:d3:66:f1:2e:4c:53:26:3c:7f:3c:fe:
+ b0:e8:da:1f:ec:ee:58:cf:02:e9:b1:f7:9a:00:d1:a6:19:41:
+ bf:02:20:5d:c4:b3:c6:cd:59:f6:ae:66:4c:89:e5:e9:32:72:
+ 4d:f3:42:93:c2:14:95:e6:2b:ee:53:45:90:ff:2e:91:9a
-----BEGIN CERTIFICATE-----
MIIDKDCCAs+gAwIBAgIJAOOBS0ilcGFwMAkGByqGSM49BAEwgZExCzAJBgNVBAYT
AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMREwDwYD
VQQKDAhGb29mYXJhaDEUMBIGA1UECwwLQXJnbGViYXJnbGUxEjAQBgNVBAMMCWZv
-b2JhcmJhejEeMBwGCSqGSIb3DQEJARYPaW5mb0B3b3Jsc3MuY29tMB4XDTE4MDQx
-MzE1MjMxMFoXDTIxMDEwNzE1MjMxMFowgZExCzAJBgNVBAYTAlVTMRMwEQYDVQQI
+b2JhcmJhejEeMBwGCSqGSIb3DQEJARYPaW5mb0B3b3Jsc3MuY29tMB4XDTIwMDUw
+NzA3MzkwNFoXDTIzMDIwMTA3MzkwNFowgZExCzAJBgNVBAYTAlVTMRMwEQYDVQQI
DApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMREwDwYDVQQKDAhGb29mYXJh
aDEUMBIGA1UECwwLQXJnbGViYXJnbGUxEjAQBgNVBAMMCWZvb2JhcmJhejEeMBwG
CSqGSIb3DQEJARYPaW5mb0B3b3Jsc3MuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0D
@@ -52,6 +53,6 @@ MKGBl6SBlDCBkTELMAkGA1UEBhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAO
BgNVBAcMB1NlYXR0bGUxETAPBgNVBAoMCEZvb2ZhcmFoMRQwEgYDVQQLDAtBcmds
ZWJhcmdsZTESMBAGA1UEAwwJZm9vYmFyYmF6MR4wHAYJKoZIhvcNAQkBFg9pbmZv
QHdvcmxzcy5jb22CCQDjgUtIpXBhcDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB
-/wQEAwIFYDAJBgcqhkjOPQQBA0gAMEUCIQD7EbabmiawNq2tWl40dVg6kwGv97cA
-JYWLDUs1bkMT7AIgFIv1BKCZdZHNdhtqPhT8lhP+3dGCSjqDKy/wpqbFpbs=
+/wQEAwIFYDAJBgcqhkjOPQQBA0gAMEUCIQCP7dNm8S5MUyY8fzz+sOjaH+zuWM8C
+6bH3mgDRphlBvwIgXcSzxs1Z9q5mTInl6TJyTfNCk8IUleYr7lNFkP8ukZo=
-----END CERTIFICATE-----
diff --git a/certs/test/server-cert-ecc-badsig.der b/certs/test/server-cert-ecc-badsig.der
index 8defd0079..e9551488f 100644
Binary files a/certs/test/server-cert-ecc-badsig.der and b/certs/test/server-cert-ecc-badsig.der differ
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 0dc446b09..a13ba302f 100644
Binary files a/certs/test/server-cert-rsa-badsig.der and b/certs/test/server-cert-rsa-badsig.der differ
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/configure.ac b/configure.ac
index d6307c369..6e1dce91c 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.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
@@ -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
# | | |
# +------+ | +---+
# | | |
@@ -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
@@ -201,6 +231,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
@@ -287,84 +320,24 @@ then
fi
-# TLS v1.3 Draft 18
+# 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 ]
)
-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)])],
+ [AS_HELP_STRING([--enable-tls13],[Enable wolfSSL TLS v1.3 (default: enabled)])],
[ 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"
+if test "x$FIPS_VERSION" = "xv1"
then
- ENABLED_TLS13="yes"
+ ENABLED_TLS13="no"
fi
-if test "$ENABLED_TLS13" = "yes"
-then
- AM_CFLAGS="-DWOLFSSL_TLS13 -DHAVE_TLS_EXTENSIONS -DHAVE_SUPPORTED_CURVES $AM_CFLAGS"
-fi
-
-
# Post-handshake Authentication
AC_ARG_ENABLE([postauth],
[AS_HELP_STRING([--enable-postauth],[Enable wolfSSL Post-handshake Authentication (default: disabled)])],
@@ -440,7 +413,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
@@ -491,6 +464,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)])],
@@ -516,6 +501,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)])],
@@ -565,14 +562,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_DPP" = "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
@@ -654,6 +651,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
@@ -1504,7 +1509,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
@@ -2462,14 +2467,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"
@@ -2500,14 +2499,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"
])
@@ -3146,6 +3140,21 @@ then
AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_REQUIRE_FFDHE"
fi
+# 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
+fi
+if test "$ENABLED_TLS13" = "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)])],
@@ -3153,7 +3162,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
@@ -3197,7 +3206,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
@@ -3483,6 +3492,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
@@ -3531,7 +3545,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
@@ -3681,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
@@ -3824,7 +3838,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
@@ -4214,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"
@@ -4515,6 +4529,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
@@ -5511,11 +5530,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/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/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);
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/doc/dox_comments/header_files/ssl.h b/doc/dox_comments/header_files/ssl.h
index ca208ce56..eb25908f0 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,
@@ -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
@@ -5199,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().
@@ -9918,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.
@@ -9943,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
@@ -9962,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.
@@ -9982,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
@@ -10029,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
@@ -10074,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,
@@ -10094,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
@@ -10117,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
@@ -10186,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) {
@@ -10206,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.
@@ -10231,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
}
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/examples/client/client.c b/examples/client/client.c
index 6c8cf5013..badd47ccb 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,12 +828,16 @@ 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 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 +858,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 +884,8 @@ static void ClientRead(WOLFSSL* ssl, char* reply, int replyLen, int mustRead,
reply[ret] = 0;
printf("%s%s\n", str, reply);
}
+
+ return err;
}
@@ -1364,6 +1376,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;
@@ -1378,11 +1393,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];
@@ -1432,7 +1447,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;
@@ -1563,7 +1577,6 @@ THREAD_RETURN WOLFSSL_THREAD client_test(void* args)
(void)ourCert;
(void)verifyCert;
(void)useClientCert;
- (void)overrideDateErrors;
(void)disableCRL;
(void)minDhKeyBits;
(void)alpnList;
@@ -1609,7 +1622,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' :
@@ -1721,7 +1734,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");
@@ -2073,7 +2090,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
@@ -2298,16 +2315,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
@@ -2316,12 +2334,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;
@@ -2357,7 +2376,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;
@@ -2431,7 +2450,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
@@ -2468,12 +2487,16 @@ THREAD_RETURN WOLFSSL_THREAD client_test(void* args)
}
#endif /* WOLFSSL_TRUST_PEER_CERT && !NO_FILESYSTEM */
}
- if (useVerifyCb || myVerifyFail)
+ if (useVerifyCb || myVerifyAction == VERIFY_FORCE_FAIL ||
+ 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
@@ -2730,8 +2753,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));
@@ -3036,13 +3059,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");
@@ -3050,13 +3088,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");
@@ -3067,14 +3120,14 @@ THREAD_RETURN WOLFSSL_THREAD client_test(void* args)
#endif /* HAVE_SECURE_RENEGOTIATION */
if (sendGET) {
+ char msgGet[GETMSGSZ] = "GET /index.html HTTP/1.0\r\n\r\n";
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';
- resumeSz = msgSz;
- XSTRNCPY(resumeMsg, "GET /index.html HTTP/1.0\r\n\r\n", resumeSz);
- resumeMsg[resumeSz] = '\0';
+ XMEMSET(msg, 0, MSG32);
+ XMEMSET(resumeMsg, 0, MSG32);
+ msgSz = resumeSz = (int) XSTRLEN(msgGet);
+ XMEMCPY(msg, msgGet, msgSz);
+ XMEMCPY(resumeMsg, msgGet, resumeSz);
}
/* allow some time for exporting the session */
@@ -3093,16 +3146,24 @@ 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;
+ }
- 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, "");
+ (void)ClientWrite(ssl, msg, msgSz, "", 0);
#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
@@ -3351,12 +3412,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);
- 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");
+ (void)ClientWrite(sslResume, msg, msgSz, " resume 2", 0);
ret = wolfSSL_shutdown(sslResume);
if (wc_shutdown && ret == WOLFSSL_SHUTDOWN_NOT_DONE)
@@ -3400,7 +3461,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/echoclient/echoclient.c b/examples/echoclient/echoclient.c
index e27ecc2b5..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
@@ -150,8 +154,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 (XSTRSTR(argv[0], "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) {
@@ -161,12 +168,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 d268ab479..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
@@ -227,8 +231,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 (XSTRSTR(argv[0], "testsuite") != 0) {
+ /* don't use EDH, can't sniff tmp keys */
+ CyaSSL_CTX_set_cipher_list(ctx, "AES256-SHA");
+ }
#endif
if (doPSK) {
@@ -240,12 +247,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..2d253d80f 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;
@@ -995,7 +994,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;
@@ -1017,7 +1018,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
@@ -1081,11 +1082,12 @@ 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;
- (void)overrideDateErrors;
(void)nonBlocking;
#ifdef WOLFSSL_TIRTOS
@@ -1217,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");
@@ -1239,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 {
@@ -1413,9 +1419,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)
@@ -1731,20 +1739,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 +1766,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)
@@ -1798,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;
@@ -1823,7 +1832,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");
}
@@ -2378,8 +2387,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");
@@ -2404,11 +2428,11 @@ THREAD_RETURN WOLFSSL_THREAD server_test(void* args)
/* Write data */
if (!useWebServerMsg) {
write_msg = msg;
- write_msg_sz = sizeof(msg);
+ write_msg_sz = (int) XSTRLEN(msg);
}
else {
write_msg = webServerMsg;
- write_msg_sz = sizeof(webServerMsg);
+ write_msg_sz = (int) XSTRLEN(webServerMsg);
}
ServerWrite(ssl, write_msg, write_msg_sz);
diff --git a/fips-check.sh b/fips-check.sh
index adccd4ee8..1e7de07aa 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
@@ -330,12 +346,13 @@ 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
+ 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
-if ! make test; then
+if ! $MAKE test; then
echo "fips-check: Test failed. Debris left for analysis."
exit 3
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/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
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; }
diff --git a/scripts/tls13.test b/scripts/tls13.test
index df67a3963..66942b9c2 100755
--- a/scripts/tls13.test
+++ b/scripts/tls13.test
@@ -106,27 +106,29 @@ 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 ""
-# 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"
+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"
+ exit 1
+ fi
do_cleanup
- exit 1
+ echo ""
fi
-echo ""
-
./examples/client/client -v 3 2>&1 | grep -- 'Bad SSL version'
if [ $? -ne 0 ]; then
@@ -141,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.
@@ -157,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"
@@ -171,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
@@ -186,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"
diff --git a/src/crl.c b/src/crl.c
index a48cf9d83..9053c79a0 100644
--- a/src/crl.c
+++ b/src/crl.c
@@ -490,27 +490,242 @@ 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;
+ prev = 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;
+}
+
+
+/* returns a deep copy of ent on success and null on fail */
+static CRL_Entry* DupCRL_Entry(const 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;
+ }
+ XMEMSET(dup, 0, sizeof(CRL_Entry));
+
+ 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) {
+ FreeCRL_Entry(dup, heap);
+ XFREE(dup, heap, DYNAMIC_TYPE_CRL_ENTRY);
+ return NULL;
+ }
+
+ 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);
+ 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;
+ 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;
+ }
+ 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, const WOLFSSL_X509_CRL* crl)
+{
+ if (dup == NULL || crl == NULL) {
+ return BAD_FUNC_ARG;
+ }
+
+ 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);
+ }
+ else {
+ return MEMORY_E;
+ }
+ }
+
+ 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);
+ }
+ 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;
+}
+
+/* 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);
+ if (DupX509_CRL(crl, newcrl) != 0) {
+ FreeCRL(crl, 1);
+ return WOLFSSL_FAILURE;
+ }
+ 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/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
diff --git a/src/internal.c b/src/internal.c
index 7c234fc83..8ff822793 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
@@ -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
}
@@ -228,15 +221,11 @@ 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;
}
#endif /* DTLS || !WOLFSSL_NO_TLS12 */
@@ -3451,11 +3440,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);
@@ -5265,8 +5256,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;
@@ -5282,9 +5275,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;
@@ -6189,6 +6183,7 @@ void FreeKeyExchange(WOLFSSL* ssl)
ssl->async.freeArgs(ssl, ssl->async.args);
ssl->async.freeArgs = NULL;
}
+ FreeBuildMsgArgs(ssl, &ssl->async.buildArgs);
#endif
}
@@ -6727,6 +6722,9 @@ 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
+ order = DtlsCheckOrder(ssl, order);
+#endif
if (order == PREV_ORDER) {
/* Previous epoch case */
if (ssl->options.haveMcast) {
@@ -6772,6 +6770,9 @@ 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
+ order = DtlsCheckOrder(ssl, order);
+#endif
if (order == PREV_ORDER) {
seq = ssl->keys.dtls_prev_sequence_number_lo++;
@@ -6798,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};
@@ -6880,6 +6881,28 @@ 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;
+ 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,
@@ -6905,7 +6928,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 &&
@@ -6918,6 +6941,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) {
@@ -7006,16 +7030,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
@@ -7038,12 +7062,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 {
@@ -7054,12 +7078,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;
}
@@ -7075,7 +7101,8 @@ void DtlsMsgStore(WOLFSSL* ssl, 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;
}
@@ -7086,7 +7113,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;
@@ -7103,8 +7131,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)
+/**
+ * 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;
@@ -7123,7 +7156,9 @@ 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;
+ item->seq = ssl->keys.dtls_handshake_number;
+ item->type = type;
if (cur == NULL)
ssl->dtls_tx_msg_list = item;
@@ -7165,8 +7200,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;
}
@@ -7187,12 +7222,44 @@ 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:
+ 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; /* server can forget everything up to ServerHelloDone if
+ * a client finished message has been received and
+ * successfully processed */
+ 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()");
@@ -7215,9 +7282,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
@@ -7235,12 +7301,14 @@ 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 if (pool->seq == ssl->keys.dtls_epoch) {
+ else {
+ /* Handle sending packets from previous epoch */
byte* input;
byte* output;
int inputSz, sendSz;
@@ -7249,6 +7317,26 @@ 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 (DtlsSCRKeysSet(ssl)) {
+ 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;
@@ -7256,8 +7344,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;
@@ -7266,11 +7361,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
@@ -7281,14 +7374,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);
@@ -7587,7 +7681,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;
@@ -7638,8 +7731,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)
@@ -7762,10 +7853,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) {
@@ -7775,11 +7868,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
@@ -7803,7 +7892,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
}
@@ -7855,7 +7944,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) */
@@ -7878,7 +7967,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 */
@@ -7950,7 +8039,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) {
@@ -8233,7 +8322,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) {
@@ -8241,6 +8333,19 @@ int CheckAvailableSize(WOLFSSL *ssl, int size)
return BAD_FUNC_ARG;
}
+#ifdef WOLFSSL_DTLS
+ 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");
+ if ((ret = SendBuffered(ssl)) != 0) {
+ return ret;
+ }
+ }
+#endif
+
if (ssl->buffers.outputBuffer.bufferSize - ssl->buffers.outputBuffer.length
< (word32)size) {
if (GrowOutputBuffer(ssl, size) < 0)
@@ -8306,11 +8411,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
{
@@ -9520,7 +9621,26 @@ int CopyDecodedToX509(WOLFSSL_X509* x509, DecodedCert* dCert)
else
ret = MEMORY_E;
#if defined(OPENSSL_ALL)
- x509->key.pubKeyOID = dCert->keyOID;
+ if (ret == 0) {
+ 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);
+ }
+ if (!(x509->key.algor->algorithm =
+ wolfSSL_OBJ_nid2obj(dCert->keyOID))) {
+ ret = PUBLIC_KEY_E;
+ }
+
+ wolfSSL_EVP_PKEY_free(x509->key.pkey);
+ if (!(x509->key.pkey = wolfSSL_d2i_PUBKEY(NULL,
+ &dCert->publicKey,
+ dCert->pubKeySize))) {
+ ret = PUBLIC_KEY_E;
+ }
+ }
#endif
}
@@ -9537,8 +9657,10 @@ 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);
+ if (!(x509->algor.algorithm =
+ wolfSSL_OBJ_nid2obj(dCert->signatureOID))) {
+ ret = PUBLIC_KEY_E;
}
#endif
}
@@ -9852,6 +9974,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) {
@@ -10538,7 +10662,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) {
@@ -10640,7 +10764,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);
@@ -10816,6 +10941,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
@@ -10829,7 +10959,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 */
@@ -11549,7 +11680,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)
@@ -11781,10 +11920,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;
}
@@ -11792,7 +11934,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;
@@ -11828,7 +11971,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)
@@ -11840,6 +11986,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");
@@ -11910,7 +12057,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
@@ -12170,9 +12322,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
@@ -12220,7 +12369,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)
@@ -12273,7 +12423,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 &&
@@ -12380,6 +12530,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:
@@ -12487,11 +12656,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;
}
@@ -12500,9 +12672,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;
}
}
@@ -12919,12 +13091,14 @@ 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 ((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
if (ret == WC_PENDING_E) {
- ssl->keys.dtls_expected_peer_handshake_number--;
break;
}
#endif
@@ -12946,20 +13120,10 @@ static int DoDtlsHandShakeMsg(WOLFSSL* ssl, byte* input, word32* inOutIdx,
word32 size;
word32 fragOffset, fragSz;
int ret = 0;
+ int ignoreFinished = 0;
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) {
@@ -12981,6 +13145,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 from 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
@@ -12991,7 +13168,12 @@ 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 &&
+ /* 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
* client hello, we need to process this out of order; the server
@@ -13001,13 +13183,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 {
@@ -13019,25 +13219,29 @@ 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 ||
+ /* 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) ||
+ 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) &&
@@ -13045,32 +13249,74 @@ 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. */
+#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) {
- 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);
}
}
+#endif
}
WOLFSSL_LEAVE("DoDtlsHandShakeMsg()", ret);
@@ -13082,10 +13328,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;
@@ -13858,8 +14104,16 @@ 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 && 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,
+ 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,
@@ -13983,6 +14237,31 @@ 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 && 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 */
+ 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;
+ }
+ }
+ 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 */
@@ -14218,7 +14497,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. */
@@ -14504,7 +14783,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;
@@ -14557,8 +14836,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;
@@ -14567,7 +14846,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;
}
@@ -14621,6 +14901,17 @@ int ProcessReply(WOLFSSL* ssl)
return ssl->error;
}
+#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);
+ if (ret != 0) {
+ WOLFSSL_ERROR(ret);
+ return ret;
+ }
+ }
+#endif
+
for (;;) {
switch (ssl->options.processReply) {
@@ -14741,12 +15032,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
@@ -14790,7 +15075,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)) {
@@ -14803,13 +15090,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;
@@ -14859,13 +15146,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;
@@ -14908,10 +15191,13 @@ 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
#endif
@@ -14928,20 +15214,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 */
@@ -15012,13 +15289,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)
@@ -15082,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);
@@ -15094,8 +15373,14 @@ 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->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);
@@ -15103,16 +15388,17 @@ 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");
switch (ssl->curRL.type) {
case handshake :
+ WOLFSSL_MSG("got HANDSHAKE");
/* debugging in DoHandShakeMsg */
if (ssl->options.dtls) {
#ifdef WOLFSSL_DTLS
@@ -15134,6 +15420,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,
@@ -15153,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;
}
@@ -15169,7 +15464,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);
@@ -15178,12 +15474,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) {
@@ -15196,45 +15486,40 @@ 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
#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;
+#ifdef HAVE_AEAD
+ 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) {
word32 digestSz = MacSize(ssl);
@@ -15250,6 +15535,26 @@ 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;
+ /* Reset error */
+ ret = 0;
+ break;
+ #endif /* WOLFSSL_DTLS */
+ }
+ }
+
ssl->keys.encryptionOn = 1;
/* setup decrypt keys for following messages */
@@ -15338,6 +15643,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:
@@ -15349,7 +15658,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) {
@@ -15384,16 +15693,19 @@ int ProcessReply(WOLFSSL* ssl)
}
}
}
-
- continue;
}
/* more records */
else {
WOLFSSL_MSG("More records in input");
- ssl->options.processReply = doProcessInit;
- 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;
@@ -15444,7 +15756,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 */
@@ -15453,19 +15765,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;
+ DtlsSEQIncrement(ssl, CUR_ORDER);
}
+ }
#endif
#if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
if (ssl->hsInfoOn) AddPacketName(ssl, "ChangeCipher");
@@ -15491,7 +15810,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 */
@@ -15504,7 +15823,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;
@@ -15513,10 +15832,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);
@@ -15606,9 +15934,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)
{
@@ -15751,47 +16076,28 @@ int BuildCertHashes(WOLFSSL* ssl, Hashes* hashes)
return ret;
}
-#endif /* !NO_CERTS */
-
#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(WOLFSSL* ssl, 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 (ssl && args->iv)
+ XFREE(args->iv, ssl->heap, DYNAMIC_TYPE_SALT);
+ XMEMSET(args, 0, sizeof(BuildMsgArgs));
}
}
#endif
/* 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;
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
@@ -15801,6 +16107,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);
@@ -15837,9 +16145,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) {
@@ -15853,6 +16158,48 @@ 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 && 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 */
+ 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);
+ }
+ 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);
+ }
+ }
+ 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);
+ }
+ }
+ 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;
}
@@ -15940,7 +16287,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) {
@@ -16035,7 +16382,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
@@ -16046,7 +16393,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 */
@@ -16058,6 +16405,25 @@ 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)
+ /* 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 = 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) {
+ 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,
@@ -16070,6 +16436,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;
@@ -16099,7 +16473,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);
@@ -16113,7 +16487,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 */
@@ -16135,7 +16509,7 @@ exit_buildmsg:
#ifdef WOLFSSL_DTLS
if (ret == 0 && ssl->options.dtls)
- DtlsSEQIncrement(ssl, CUR_ORDER);
+ DtlsSEQIncrement(ssl, epochOrder);
#endif
/* return sz on success */
@@ -16144,9 +16518,6 @@ exit_buildmsg:
/* Final cleanup */
FreeBuildMsgArgs(ssl, args);
-#ifdef WOLFSSL_ASYNC_CRYPT
- ssl->async.freeArgs = NULL;
-#endif
return ret;
#endif /* !WOLFSSL_NO_TLS12 */
@@ -16220,13 +16591,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;
@@ -16269,6 +16640,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);
@@ -16417,6 +16795,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)
{
@@ -16524,6 +16910,9 @@ int SendCertificate(WOLFSSL* ssl)
#endif
}
+ if (IsEncryptionOn(ssl, 1))
+ sendSz += cipherExtraData(ssl);
+
/* check for available size */
if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
return ret;
@@ -16542,10 +16931,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--;
@@ -16556,20 +16944,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,
@@ -16579,7 +16967,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
@@ -16612,7 +17000,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");
@@ -16624,32 +17017,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");
@@ -16732,6 +17137,10 @@ int SendCertificateRequest(WOLFSSL* ssl)
i += 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;
@@ -16786,27 +17195,40 @@ 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;
}
+ if (ssl->options.dtls)
+ DtlsSEQIncrement(ssl, CUR_ORDER);
#endif
ret = HashOutput(ssl, output, sendSz, 0);
if (ret != 0)
@@ -16889,15 +17311,23 @@ 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);
- sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
- handshake, 1, 0, 0);
+ XMEMCPY(input, output + recordHeaderSz, inputSz);
+ #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);
XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
if (sendSz < 0)
@@ -16905,17 +17335,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);
- #endif
-
#if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
if (ret == 0 && ssl->hsInfoOn)
AddPacketName(ssl, "CertificateStatus");
@@ -17118,6 +17545,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)
@@ -17261,7 +17741,7 @@ 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
@@ -17316,11 +17796,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;
}
@@ -17333,7 +17809,11 @@ 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;
}
@@ -17485,16 +17965,17 @@ 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->options.handShakeDone)) {
+ /* 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);
+ 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)
@@ -18732,7 +19213,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) {
@@ -19496,6 +19985,30 @@ exit_dpk:
#endif /* WOLFSSL_TLS13 || !NO_WOLFSSL_CLIENT */
+#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)
+ {
+ #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
@@ -19694,15 +20207,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)
@@ -19710,7 +20234,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)
@@ -20160,30 +20684,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;
@@ -20207,7 +20707,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.
*/
@@ -20249,16 +20753,10 @@ exit_dpk:
ssl->options.resuming = 0; /* server denied resumption try */
}
}
- #ifdef WOLFSSL_DTLS
- if (ssl->options.dtls) {
- DtlsMsgPoolReset(ssl);
- }
- #endif
-
return SetCipherSpecs(ssl);
}
-#endif /* WOLFSSL_NO_TLS12 */
+#endif /* !WOLFSSL_NO_TLS12 */
/* Make sure client setup is valid for this suite, true on success */
@@ -23260,14 +23758,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);
}
@@ -23279,8 +23781,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 */
@@ -23291,6 +23799,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
@@ -23301,14 +23814,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");
@@ -23363,49 +23868,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
@@ -23459,7 +23921,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)
@@ -23797,7 +24262,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);
@@ -23805,7 +24274,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);
}
@@ -23817,10 +24286,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;
@@ -23836,23 +24311,20 @@ int SendCertificateVerify(WOLFSSL* ssl)
}
else {
#ifdef WOLFSSL_DTLS
- if (ssl->options.dtls)
+ if (IsDtlsNotSctpMode(ssl)) {
+ ret = DtlsMsgPoolSave(ssl, args->output, args->sendSz, certificate_verify);
+ }
+ 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) {
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");
@@ -24005,6 +24477,53 @@ 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)
+ {
+ 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 */
+
+#endif /* NO_CERTS */
+
#ifdef HAVE_ECC
/* returns the WOLFSSL_* version of the curve from the OID sum */
word16 GetCurveByOID(int oidSum) {
@@ -24199,6 +24718,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),
@@ -24269,21 +24791,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
@@ -24303,13 +24840,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
@@ -25822,7 +26352,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) {
@@ -25833,10 +26364,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 */
@@ -25850,7 +26393,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;
}
}
@@ -26482,7 +27025,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) && !IsSCR(ssl)) {
#if defined(NO_SHA) && defined(NO_SHA256)
#error "DTLS needs either SHA or SHA-256"
#endif /* NO_SHA && NO_SHA256 */
@@ -26632,7 +27175,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) && !IsSCR(ssl)) {
ret = wc_HmacUpdate(&cookieHmac, input + i, RAN_LEN);
if (ret != 0) return ret;
}
@@ -26665,7 +27208,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) && !IsSCR(ssl)) {
ret = wc_HmacUpdate(&cookieHmac, input + i - 1, b + 1);
if (ret != 0) return ret;
}
@@ -26750,7 +27293,7 @@ static int DoSessionTicket(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
#endif
#ifdef WOLFSSL_DTLS
- if (IsDtlsNotSctpMode(ssl)) {
+ if (IsDtlsNotSctpMode(ssl) && !IsSCR(ssl)) {
ret = wc_HmacUpdate(&cookieHmac,
input + i - OPAQUE16_LEN,
clSuites.suiteSz + OPAQUE16_LEN);
@@ -26776,33 +27319,35 @@ static int DoSessionTicket(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
#ifdef WOLFSSL_DTLS
if (IsDtlsNotSctpMode(ssl)) {
- byte newCookie[MAX_COOKIE_LEN];
+ if (!IsSCR(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
@@ -26996,6 +27541,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);
@@ -27446,14 +27995,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)
@@ -27461,7 +28023,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)
@@ -27509,9 +28071,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
@@ -27567,10 +28127,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
}
@@ -27719,10 +28277,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
}
@@ -27765,6 +28321,10 @@ static int DoSessionTicket(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
#endif
}
+
+ if (IsEncryptionOn(ssl, 1) && ssl->options.handShakeDone)
+ sendSz += cipherExtraData(ssl);
+
/* check for available size */
if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
return ret;
@@ -27789,15 +28349,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)
@@ -27806,7 +28370,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);
@@ -27819,7 +28383,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);
@@ -27848,6 +28413,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;
@@ -27861,14 +28429,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)
@@ -27898,6 +28472,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;
@@ -27934,6 +28513,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 55b2d9bed..2c7bfae69 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;
@@ -3058,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 */
@@ -3133,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;
@@ -3209,11 +3230,26 @@ 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->secure_renegotiation &&
+ ssl->secure_renegotiation->cache_status == SCR_CACHE_NEEDED) {
keys = &ssl->secure_renegotiation->tmp_keys;
+#ifdef WOLFSSL_DTLS
+ 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);
}
#endif /* HAVE_SECURE_RENEGOTIATION */
@@ -3224,23 +3260,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 */
@@ -3253,12 +3320,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;
@@ -3266,25 +3343,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
@@ -3341,7 +3444,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);
@@ -3471,6 +3574,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/ssl.c b/src/ssl.c
old mode 100755
new mode 100644
index e7d6efdb1..f95ec4f1b
--- 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);
}
@@ -2706,7 +2706,8 @@ static int _Rehandshake(WOLFSSL* ssl)
}
}
ret = wolfSSL_negotiate(ssl);
- ssl->secure_rene_count++;
+ if (ret == WOLFSSL_SUCCESS)
+ ssl->secure_rene_count++;
return ret;
}
@@ -3022,7 +3023,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) {
@@ -3228,6 +3229,57 @@ 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 (IsDtlsMsgSCRKeys(ssl))
+ keys = &ssl->secure_renegotiation->tmp_keys;
+ else
+ keys = &ssl->keys;
+ break;
+ case PREV_ORDER:
+ keys = &ssl->keys;
+ break;
+ case CUR_ORDER:
+ if (DtlsUseSCRKeys(ssl))
+ 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
@@ -6798,7 +6850,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;
}
@@ -7337,7 +7389,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;
}
@@ -7358,8 +7410,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;
@@ -7510,6 +7562,8 @@ WOLFSSL_EVP_PKEY* wolfSSL_d2i_PUBKEY(WOLFSSL_EVP_PKEY** out, unsigned char** in,
#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;
@@ -7553,6 +7607,7 @@ WOLFSSL_EVP_PKEY* wolfSSL_d2i_PUBKEY(WOLFSSL_EVP_PKEY** out, unsigned char** in,
}
wc_FreeDhKey(&dh);
}
+ #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
#endif /* !NO_DH && (WOLFSSL_QT || OPENSSL_ALL) */
return pkey;
@@ -7677,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();
@@ -7691,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:
@@ -7941,7 +7998,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;
@@ -7951,7 +8008,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;
}
@@ -8588,6 +8645,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;
@@ -9003,6 +9063,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;
@@ -9342,7 +9407,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;
@@ -9455,8 +9520,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;
@@ -11703,6 +11770,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;
@@ -12084,6 +12159,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) {
@@ -12507,10 +12590,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
@@ -12618,6 +12699,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;
@@ -12637,10 +12719,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)
@@ -12667,17 +12760,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
@@ -12694,21 +12777,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;
}
}
@@ -12721,22 +12794,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
@@ -12757,7 +12827,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;
}
@@ -12819,10 +12889,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
@@ -13452,7 +13520,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;
@@ -13478,7 +13545,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)
{
@@ -13489,7 +13555,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;
@@ -13514,7 +13579,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");
@@ -13536,7 +13600,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");
@@ -13553,7 +13616,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");
@@ -13571,6 +13633,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 */
@@ -13600,6 +13684,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 +13693,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 +13745,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
@@ -13998,7 +14093,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 +14108,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 +14551,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 +14574,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 +14609,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 +14706,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 +14768,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 +14790,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)
@@ -14902,7 +14998,7 @@ int wolfSSL_set_compression(WOLFSSL* ssl)
{
WOLFSSL_BIO* bio = NULL;
- if (buf == NULL || len < 0) {
+ if (buf == NULL) {
return bio;
}
@@ -14911,6 +15007,9 @@ int wolfSSL_set_compression(WOLFSSL* ssl)
return bio;
}
+ if (len < 0) {
+ len = (int)XSTRLEN((const char*)buf);
+ }
bio->num = bio->wrSz = len;
bio->ptr = (byte*)XMALLOC(len, 0, DYNAMIC_TYPE_OPENSSL);
if (bio->ptr == NULL) {
@@ -15171,8 +15270,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 +15301,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.
@@ -15223,7 +15324,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;
@@ -15323,7 +15424,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 +15465,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;
@@ -15774,7 +15878,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)
@@ -16508,6 +16612,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 +16709,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)
@@ -17417,7 +17524,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 */
@@ -17753,7 +17859,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.
*
@@ -17804,7 +17912,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 */
@@ -18001,7 +18109,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)
{
@@ -18062,6 +18172,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
@@ -18101,6 +18215,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
@@ -18146,8 +18264,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)
@@ -18203,7 +18322,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)
@@ -18233,7 +18354,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;
@@ -18507,6 +18630,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))
/* Converts DER encoded DH parameters to a WOLFSSL_DH structure.
*
* dh : structure to copy DH parameters into.
@@ -18540,6 +18664,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");
@@ -18554,6 +18679,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.
*
@@ -18855,7 +18981,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 +19140,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 +19220,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 +19249,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)
@@ -19214,7 +19348,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");
@@ -19224,38 +19358,16 @@ 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
- 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
- #endif
default:
return "unknown";
}
@@ -19276,7 +19388,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");
@@ -19293,6 +19405,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)
@@ -19630,7 +19749,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)
@@ -19747,9 +19866,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
@@ -19805,7 +19921,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;
@@ -19863,7 +19979,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
@@ -19934,10 +20050,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;
@@ -20108,8 +20223,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)
@@ -20184,7 +20300,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.
*
@@ -20226,6 +20344,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 */
@@ -20278,7 +20399,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)
{
@@ -21007,7 +21131,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
@@ -21041,6 +21165,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);
@@ -21128,7 +21254,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)
@@ -21528,15 +21654,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;
}
@@ -21550,14 +21676,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;
}
@@ -21634,12 +21760,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,
@@ -21982,8 +22112,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;
}
@@ -22391,7 +22523,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
@@ -22485,7 +22617,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;
@@ -22499,7 +22631,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;
@@ -22512,7 +22644,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;
}
@@ -22521,7 +22653,7 @@ WOLFSSL_STACK* wolfSSL_sk_X509_dup(WOLFSSL_STACK* sk)
sIdx = sIdx->next;
}
- return dup;
+ return copy;
}
@@ -22531,7 +22663,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;
@@ -22544,14 +22676,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");
}
@@ -22560,7 +22692,7 @@ WOLFSSL_STACK* wolfSSL_X509_STORE_CTX_get1_chain(WOLFSSL_X509_STORE_CTX* ctx)
ref = ref->next;
}
- return dup;
+ return copy;
}
@@ -22591,7 +22723,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;
@@ -22608,19 +22743,15 @@ 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
-#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
@@ -22635,25 +22766,27 @@ err_exit:
return NULL;
}
-
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);
-#ifdef HAVE_CRL
- if (store->crl != NULL)
- wolfSSL_X509_CRL_free(store->crl);
-#endif
-#ifdef OPENSSL_EXTRA
- if (store->param != NULL)
+ store->cm = NULL;
+ }
+#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
+ if (store->param != NULL) {
XFREE(store->param, NULL, DYNAMIC_TYPE_OPENSSL);
+ store->param = NULL;
+ }
#endif
XFREE(store, NULL, DYNAMIC_TYPE_X509_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;
@@ -22769,23 +22902,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);
}
}
@@ -22797,7 +22925,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)
{
@@ -22823,7 +22950,6 @@ static int GetX509Error(int e)
return e;
}
}
-#endif
/* Verifies certificate chain using WOLFSSL_X509_STORE_CTX
* returns 0 on success or < 0 on failure.
@@ -22831,11 +22957,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
@@ -22845,7 +22970,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 */
@@ -22856,7 +22980,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);
- ctx->store->verify_cb(0, ctx);
+ #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
+ if (ctx->store && ctx->store->verify_cb)
+ ctx->store->verify_cb(0, ctx);
+ #endif
}
error = 0;
@@ -22867,22 +22994,23 @@ 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;
}
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;
@@ -22934,7 +23062,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)
@@ -23051,8 +23179,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 {
@@ -23080,7 +23208,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");
@@ -23088,8 +23219,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)
{
@@ -23454,34 +23586,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;
}
@@ -23648,102 +23780,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)
@@ -23764,21 +23800,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. */
@@ -23786,16 +23827,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;
}
@@ -23829,7 +23870,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
@@ -23841,8 +23884,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
*
*/
@@ -24619,7 +24663,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 */
@@ -24672,9 +24716,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;
@@ -24745,6 +24789,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");
@@ -24957,7 +25005,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) {
+ wolfSSL_ASN1_OBJECT_free(alg->algorithm);
+ wolfSSL_ASN1_TYPE_free(alg->parameter);
+ XFREE(alg, NULL, DYNAMIC_TYPE_OPENSSL);
+ }
+}
+
/* Returns X509_ALGOR struct with signature algorithm */
const WOLFSSL_X509_ALGOR* wolfSSL_X509_get0_tbs_sigalg(const WOLFSSL_X509 *x509)
{
@@ -24975,15 +25043,166 @@ 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) {
+ if (algor->parameter) {
+ *pptype = algor->parameter->type;
+ }
+ else {
+ /* Default to V_ASN1_OBJECT */
+ *pptype = V_ASN1_OBJECT;
+ }
+ }
+}
+
+/**
+ * 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)
+{
+ if (!algor) {
+ return WOLFSSL_FAILURE;
+ }
+ if (aobj) {
+ algor->algorithm = aobj;
+ }
+ 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;
+}
+
+/**
+ * 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) {
+ return;
+ }
+ switch (type) {
+ case V_ASN1_OBJECT:
+ a->value.object = (WOLFSSL_ASN1_OBJECT*)value;
+ break;
+ case V_ASN1_UTCTIME:
+ a->value.utctime = (WOLFSSL_ASN1_TIME*)value;
+ break;
+ case V_ASN1_GENERALIZEDTIME:
+ a->value.generalizedtime = (WOLFSSL_ASN1_TIME*)value;
+ break;
+ default:
+ WOLFSSL_MSG("Unknown or unsupported ASN1_TYPE");
+ return;
+ }
+ 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),
+ NULL, DYNAMIC_TYPE_OPENSSL);
+ if (!ret)
+ return NULL;
+ XMEMSET(ret, 0, sizeof(WOLFSSL_ASN1_TYPE));
+ 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) {
+ 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);
+ }
+}
+
+/**
+ * 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;
+ 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;
+}
+
+/**
+ * Free WOLFSSL_X509_PUBKEY and all its members.
+ *
+ * @param at Object to free
+ */
+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);
}
}
@@ -25003,36 +25222,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 */
@@ -25047,6 +25267,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
@@ -25243,6 +25519,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
@@ -26195,7 +26472,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;
@@ -26245,7 +26522,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
@@ -26404,6 +26681,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");
@@ -26414,9 +26694,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--)
@@ -26428,9 +26705,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;
@@ -26494,6 +26768,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.
*/
@@ -26562,7 +26837,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,
@@ -26641,8 +26918,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)
{
@@ -26661,6 +26940,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)
@@ -26737,6 +27019,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*))
{
@@ -26749,7 +27034,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
@@ -26809,11 +27094,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
@@ -26877,12 +27160,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;
@@ -27062,7 +27343,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;
@@ -27076,7 +27356,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;
@@ -27236,11 +27515,366 @@ 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)
+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"},
+ { 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
+ { 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(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)
+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
@@ -27662,6 +28296,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();
@@ -27714,6 +28349,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 *tpl)
+{
+ void *ret = NULL;
+ const WOLFSSL_ASN1_TEMPLATE *member = NULL;
+ size_t i;
+ WOLFSSL_ENTER("wolfSSL_ASN1_item_new");
+ if (!tpl) {
+ return NULL;
+ }
+ if (!(ret = XMALLOC(tpl->size, NULL, DYNAMIC_TYPE_OPENSSL))) {
+ return NULL;
+ }
+ XMEMSET(ret, 0, tpl->size);
+ for (member = tpl->members, i = 0; i < tpl->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;
+ }
+ }
+ return ret;
+error:
+ wolfSSL_ASN1_item_free(ret, tpl);
+ return NULL;
+}
+
+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 = tpl->members, i = 0; i < tpl->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 *tpl)
+{
+ int len = 0;
+ byte *buf = NULL;
+
+ WOLFSSL_ENTER("wolfSSL_ASN1_item_i2d");
+
+ if (!src || !tpl) {
+ WOLFSSL_LEAVE("wolfSSL_ASN1_item_i2d", WOLFSSL_FAILURE);
+ return WOLFSSL_FAILURE;
+ }
+
+ if (dest && !*dest) {
+ len = wolfSSL_ASN1_item_i2d(src, NULL, tpl);
+ if (!len) {
+ goto error;
+ }
+ buf = (byte*)XMALLOC(len, NULL, DYNAMIC_TYPE_ASN1);
+ if (!buf) {
+ goto error;
+ }
+ len = 0;
+ }
+
+ switch (tpl->type) {
+ case ASN_SEQUENCE:
+ {
+ 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), tpl->members,
+ tpl->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 && buf) {
+ /* *dest length is not checked because the user is responsible
+ * for providing a long enough buffer */
+ 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
@@ -27780,7 +28621,7 @@ 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;
@@ -27920,6 +28761,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 :
@@ -28322,6 +29164,7 @@ 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
*/
@@ -28536,6 +29379,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 */
@@ -29170,6 +30014,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)
@@ -30714,10 +31568,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)
@@ -30755,7 +31605,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;
@@ -30800,12 +31650,9 @@ static 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 */
-static int SetECKeyInternal(WOLFSSL_EC_KEY* eckey)
+int SetECKeyInternal(WOLFSSL_EC_KEY* eckey)
{
ecc_key* key;
@@ -30867,7 +31714,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;
}
@@ -31060,10 +31907,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) {
@@ -31079,8 +31922,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,
@@ -31097,55 +31938,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)
@@ -31166,10 +31992,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)
@@ -31262,6 +32084,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
*/
@@ -31285,11 +32122,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;
@@ -31594,13 +32428,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;
}
@@ -31825,13 +32661,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) {
@@ -31848,6 +32679,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))
/* return code compliant with OpenSSL :
* 1 if success, 0 if error
*/
@@ -31861,20 +32693,32 @@ 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;
}
-
- if (p->exSet == 0) {
- WOLFSSL_MSG("No ECPoint external set, do it");
-
- if (SetECPointExternal(p) != WOLFSSL_SUCCESS) {
- WOLFSSL_MSG("SetECPointExternal failed");
+#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) {
+ WOLFSSL_MSG("SetECPointExternal failed");
+ return WOLFSSL_FAILURE;
+ }
wolfSSL_EC_POINT_dump("d2i p", p);
@@ -31886,7 +32730,10 @@ 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 = (word32)len;
+#ifndef HAVE_SELFTEST
+ int compressed = form == POINT_CONVERSION_COMPRESSED ? 1 : 0;
+#endif /* !HAVE_SELFTEST */
WOLFSSL_ENTER("EC_POINT_point2oct");
@@ -31894,6 +32741,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) {
@@ -31906,26 +32757,33 @@ 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
+#ifndef HAVE_SELFTEST
+ && form != POINT_CONVERSION_COMPRESSED
+#endif /* !HAVE_SELFTEST */
+ ) {
+ WOLFSSL_MSG("Unsupported curve form");
return WOLFSSL_FAILURE;
}
- if (wolfSSL_ECPoint_i2d(group, p, NULL, &min_len) != WOLFSSL_SUCCESS) {
+#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;
}
-
- if (buf &&
- ((min_len > len) ||
- wolfSSL_ECPoint_i2d(group, p, buf, &min_len) != WOLFSSL_SUCCESS)) {
+#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;
- return min_len;
+ 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)
@@ -31941,6 +32799,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 (int)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,
@@ -31976,6 +32891,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)
{
@@ -32027,13 +32943,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)) {
@@ -32112,8 +33023,11 @@ int wolfSSL_EC_POINT_set_affine_coordinates_GFp(const WOLFSSL_EC_GROUP *group,
return WOLFSSL_SUCCESS;
}
-#ifndef WOLFSSL_ATECC508A
-/* return code compliant with OpenSSL :
+#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
*/
int wolfSSL_EC_POINT_mul(const WOLFSSL_EC_GROUP *group, WOLFSSL_EC_POINT *r,
@@ -32121,63 +33035,139 @@ int wolfSSL_EC_POINT_mul(const WOLFSSL_EC_GROUP *group, WOLFSSL_EC_POINT *r,
const WOLFSSL_BIGNUM *m, WOLFSSL_BN_CTX *ctx)
{
mp_int a, prime;
- int ret;
+ int ret = WOLFSSL_FAILURE;
+ ecc_point* result = NULL;
+ ecc_point* tmp = 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 */
+#ifdef ECC_SHAMIR
+ 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
+ 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 */
+ 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(&a);
+ mp_clear(&prime);
+ wc_ecc_del_point(result);
+ wc_ecc_del_point(tmp);
return ret;
}
-#endif
+#endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
+#endif /* !defined(WOLFSSL_ATECC508A) && defined(ECC_SHAMIR) &&
+ * !defined(HAVE_SELFTEST) */
void wolfSSL_EC_POINT_clear_free(WOLFSSL_EC_POINT *p)
{
@@ -32213,6 +33203,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 */
@@ -32257,13 +33273,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);
@@ -32277,13 +33289,15 @@ 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 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;
@@ -32292,11 +33306,12 @@ 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;
+ return min_nitems;
}
+#endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
/* Start ECDSA_SIG */
void wolfSSL_ECDSA_SIG_free(WOLFSSL_ECDSA_SIG *sig)
@@ -33497,7 +34512,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)
@@ -33691,7 +34706,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:",
@@ -34050,6 +35066,263 @@ int wolfSSL_RSA_LoadDer_ex(WOLFSSL_RSA* rsa, const unsigned char* derBuf,
return WOLFSSL_SUCCESS;
}
+#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) {
+#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 or unsupported 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 hashLen, 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];
+ WC_RNG* tmpRNG = _tmpRNG;
+#endif
+ enum wc_HashType hashType;
+
+ WOLFSSL_ENTER("wolfSSL_RSA_padding_add_PKCS1_PSS");
+
+ if (!rsa || !EM || !mHash || !hashAlg) {
+ return WOLFSSL_FAILURE;
+ }
+
+ 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;
+ }
+
+ hashType = wolfSSL_EVP_md2macType(hashAlg);
+ if (hashType < WC_HASH_TYPE_NONE || hashType > WC_HASH_TYPE_MAX) {
+ WOLFSSL_MSG("wolfSSL_EVP_md2macType error");
+ goto cleanup;
+ }
+
+ if ((mgf = hash2mgf(hashType)) == WC_MGF1NONE) {
+ WOLFSSL_MSG("hash2mgf error");
+ goto cleanup;
+ }
+
+ if ((hashLen = wolfSSL_EVP_MD_size(hashAlg)) < 0) {
+ WOLFSSL_MSG("wolfSSL_EVP_MD_size error");
+ goto cleanup;
+ }
+
+ if ((emLen = wolfSSL_RSA_size(rsa)) <= 0) {
+ WOLFSSL_MSG("wolfSSL_RSA_size error");
+ goto cleanup;
+ }
+
+ 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, hashLen, EM, emLen,
+ RSA_BLOCK_TYPE_1, rng, WC_RSA_PSS_PAD,
+ hashType, 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 hashLen, mgf, emLen, mPrimeLen;
+ enum wc_HashType hashType;
+ byte *mPrime = NULL;
+ byte *buf = NULL;
+
+ WOLFSSL_ENTER("wolfSSL_RSA_verify_PKCS1_PSS");
+
+ if (!rsa || !mHash || !hashAlg || !EM) {
+ return WOLFSSL_FAILURE;
+ }
+
+ if ((hashLen = wolfSSL_EVP_MD_size(hashAlg)) < 0) {
+ return WOLFSSL_FAILURE;
+ }
+
+ 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;
+ }
+
+ 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;
+ }
+
+ if ((mgf = hash2mgf(hashType)) == WC_MGF1NONE) {
+ WOLFSSL_MSG("hash2mgf error");
+ return WOLFSSL_FAILURE;
+ }
+
+ if ((hashLen = wolfSSL_EVP_MD_size(hashAlg)) < 0) {
+ WOLFSSL_MSG("wolfSSL_EVP_MD_size error");
+ return WOLFSSL_FAILURE;
+ }
+
+ if (!(buf = (byte*)XMALLOC(emLen, NULL, DYNAMIC_TYPE_TMP_BUFFER))) {
+ WOLFSSL_MSG("malloc error");
+ return WOLFSSL_FAILURE;
+ }
+ XMEMCPY(buf, EM, emLen);
+
+ /* Remove and verify the PSS padding */
+ 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");
+ XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
+ return WOLFSSL_FAILURE;
+ }
+
+ /* Verify the hash is correct */
+ 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");
+ XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
+ return WOLFSSL_FAILURE;
+ }
+ XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
+ return WOLFSSL_SUCCESS;
+}
+#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)
{
@@ -34349,6 +35622,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))
int wolfSSL_DH_LoadDer(WOLFSSL_DH* dh, const unsigned char* derBuf, int derSz)
{
word32 idx = 0;
@@ -34372,6 +35646,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 */
@@ -35025,7 +36300,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)
@@ -35058,7 +36332,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");
@@ -35067,50 +36341,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;
}
@@ -36960,264 +38234,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, "sha", "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, "shaWithDSA", "dsaWithSHA1"},
- #endif
- #endif /* NO_DSA */
- #ifndef NO_RSA
- #ifdef WOLFSSL_MD2
- { CTC_MD2wRSA, CTC_MD2wRSA, oidSigType, "md2WithRSA",
- "md2WithRSAEncryption"},
- #endif
- #ifndef NO_MD5
- { CTC_MD5wRSA, CTC_MD5wRSA, oidSigType, "md5WithRSA",
- "md5WithRSAEncryption"},
- #endif
- #ifndef NO_SHA
- { CTC_SHAwRSA, CTC_SHAwRSA, oidSigType, "shaWithRSA",
- "sha1WithRSAEncryption"},
- #endif
- #ifdef WOLFSSL_SHA224
- { CTC_SHA224wRSA, CTC_SHA224wRSA, oidSigType, "sha224WithRSA",
- "sha224WithRSAEncryption"},
- #endif
- #ifndef NO_SHA256
- { CTC_SHA256wRSA, CTC_SHA256wRSA, oidSigType, "sha256WithRSA",
- "sha256WithRSAEncryption"},
- #endif
- #ifdef WOLFSSL_SHA384
- { CTC_SHA384wRSA, CTC_SHA384wRSA, oidSigType, "sha384WithRSA",
- "sha384WithRSAEncryption"},
- #endif
- #ifdef WOLFSSL_SHA512
- { CTC_SHA512wRSA, CTC_SHA512wRSA, oidSigType, "sha512WithRSA",
- "sha512WithRSAEncryption"},
- #endif
- #endif /* NO_RSA */
- #ifdef HAVE_ECC
- #ifndef NO_SHA
- { CTC_SHAwECDSA, CTC_SHAwECDSA, oidSigType, "shaWithECDSA", ""},
- #endif
- #ifdef WOLFSSL_SHA224
- { CTC_SHA224wECDSA, CTC_SHA224wECDSA, oidSigType, "sha224WithECDSA",""},
- #endif
- #ifndef NO_SHA256
- { CTC_SHA256wECDSA, CTC_SHA256wECDSA, oidSigType, "sha256WithECDSA",""},
- #endif
- #ifdef WOLFSSL_SHA384
- { CTC_SHA384wECDSA, CTC_SHA384wECDSA, oidSigType, "sha384WithECDSA",""},
- #endif
- #ifdef WOLFSSL_SHA512
- { CTC_SHA512wECDSA, CTC_SHA512wECDSA, oidSigType, "sha512WithECDSA",""},
- #endif
- #endif /* HAVE_ECC */
-
- /* oidKeyType */
- #ifndef NO_DSA
- { DSAk, DSAk, oidKeyType, "DSA key", "dsaEncryption"},
- #endif /* NO_DSA */
- #ifndef NO_RSA
- { RSAk, RSAk, oidKeyType, "RSA key", "rsaEncryption"},
- #endif /* NO_RSA */
- #ifdef HAVE_NTRU
- { NTRUk, NTRUk, oidKeyType, "NTRU key", "ntruEncryption"},
- #endif /* HAVE_NTRU */
- #ifdef HAVE_ECC
- { ECDSAk, ECDSAk, oidKeyType, "ECDSA key", "ecdsaEncryption"},
- #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, "DES3-CBC", "des3-cbc"},
- #endif /* !NO_DES3 */
-
- /* oidOcspType */
- #ifdef HAVE_OCSP
- { NID_id_pkix_OCSP_basic, OCSP_BASIC_OID, oidOcspType, "OCSP_basic",
- "Basic OCSP Response"},
- { OCSP_NONCE_OID, OCSP_NONCE_OID, oidOcspType, "OCSP_nonce",
- "OCSP Nonce"},
- #endif /* HAVE_OCSP */
-
- #ifndef NO_CERTS
- /* oidCertExtType */
- { NID_basic_constraints, BASIC_CA_OID, oidCertExtType, "X509 basic ca",
- "X509v3 Basic Constraints"},
- { NID_subject_alt_name, ALT_NAMES_OID, oidCertExtType, "X509 alt names",
- "X509v3 Subject Alternative Name"},
- { CRL_DIST_OID, CRL_DIST_OID, oidCertExtType, "X509 crl",
- "X509v3 CRL Distribution Points"},
- { NID_info_access, AUTH_INFO_OID, oidCertExtType, "X509 auth info",
- "Authority Information Access"},
- { NID_authority_key_identifier, AUTH_KEY_OID, oidCertExtType,
- "X509 auth key", "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",
- "X509v3 Key Usage"},
- { NID_inhibit_any_policy, INHIBIT_ANY_OID, oidCertExtType,
- "X509 inhibit any", "X509v3 Inhibit Any Policy"},
- { NID_ext_key_usage, KEY_USAGE_OID, oidCertExtType,
- "X509 ext key usage", "X509v3 Extended Key Usage"},
- { NID_name_constraints, NAME_CONS_OID, oidCertExtType,
- "X509 name constraints", "X509v3 Name Constraints"},
- { NID_certificate_policies, CERT_POLICY_OID, oidCertExtType,
- "X509 certificate policies", "X509v3 Certificate Policies"},
-
- /* oidCertAuthInfoType */
- { AIA_OCSP_OID, AIA_OCSP_OID, oidCertAuthInfoType, "Cert Auth OCSP",
- "Authority Information Access"},
- { AIA_CA_ISSUER_OID, AIA_CA_ISSUER_OID, oidCertAuthInfoType,
- "Cert Auth CA Issuer", "CA Issuers"},
-
- /* oidCertPolicyType */
- { NID_any_policy, CP_ANY_OID, oidCertPolicyType, "Cert any policy",
- "X509v3 Any Policy"},
-
- /* oidCertAltNameType */
- { NID_hw_name_oid, HW_NAME_OID, oidCertAltNameType, "Hardware name",""},
-
- /* oidCertKeyUseType */
- { NID_anyExtendedKeyUsage, EKU_ANY_OID, oidCertKeyUseType,
- "Cert any extended key", "Any Extended Key Usage"},
- { EKU_SERVER_AUTH_OID, EKU_SERVER_AUTH_OID, oidCertKeyUseType,
- "Cert server auth key", "TLS Web Server Authentication"},
- { EKU_CLIENT_AUTH_OID, EKU_CLIENT_AUTH_OID, oidCertKeyUseType,
- "Cert client auth key", "TLS Web Client Authentication"},
- { EKU_OCSP_SIGN_OID, EKU_OCSP_SIGN_OID, oidCertKeyUseType,
- "Cert OCSP sign key", "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 shaWithRC4-128", "pbeWithSHA1And128BitRC4"},
- { PBE_SHA1_DES, PBE_SHA1_DES, oidPBEType, "PBE shaWithDES",
- "pbeWithSHA1AndDES-CBC"},
- { PBE_SHA1_DES3, PBE_SHA1_DES3, oidPBEType, "PBE shaWithDES3",
- "pbeWithSHA1And3-KeyTripleDES-CBC"},
- #endif
-
- /* oidKeyWrapType */
- #ifdef WOLFSSL_AES_128
- { AES128_WRAP, AES128_WRAP, oidKeyWrapType, "AES-128 wrap", ""},
- #endif
- #ifdef WOLFSSL_AES_192
- { AES192_WRAP, AES192_WRAP, oidKeyWrapType, "AES-192 wrap", ""},
- #endif
- #ifdef WOLFSSL_AES_256
- { AES256_WRAP, AES256_WRAP, oidKeyWrapType, "AES-256 wrap", ""},
- #endif
-
- #ifndef NO_PKCS7
- #ifndef NO_DH
- /* oidCmsKeyAgreeType */
- #ifndef NO_SHA
- { dhSinglePass_stdDH_sha1kdf_scheme, dhSinglePass_stdDH_sha1kdf_scheme,
- oidCmsKeyAgreeType, "DH-SHA kdf", ""},
- #endif
- #ifdef WOLFSSL_SHA224
- { dhSinglePass_stdDH_sha224kdf_scheme,
- dhSinglePass_stdDH_sha224kdf_scheme, oidCmsKeyAgreeType,
- "DH-SHA224 kdf", ""},
- #endif
- #ifndef NO_SHA256
- { dhSinglePass_stdDH_sha256kdf_scheme,
- dhSinglePass_stdDH_sha256kdf_scheme, oidCmsKeyAgreeType,
- "DH-SHA256 kdf", ""},
- #endif
- #ifdef WOLFSSL_SHA384
- { dhSinglePass_stdDH_sha384kdf_scheme,
- dhSinglePass_stdDH_sha384kdf_scheme, oidCmsKeyAgreeType,
- "DH-SHA384 kdf", ""},
- #endif
- #ifdef WOLFSSL_SHA512
- { dhSinglePass_stdDH_sha512kdf_scheme,
- dhSinglePass_stdDH_sha512kdf_scheme, oidCmsKeyAgreeType,
- "DH-SHA512 kdf", ""},
- #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,
@@ -37721,7 +38737,7 @@ err:
return (unsigned char*)dig;
}
}
-#endif /* defined(WOLFSSL_SHA512) */
+#endif /* WOLFSSL_SHA512 */
#endif /* OPENSSL_EXTRA */
#ifndef WOLFCRYPT_ONLY
@@ -37829,71 +38845,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;
@@ -37941,49 +38906,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;
}
@@ -37993,51 +38923,27 @@ 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 (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;
+ }
}
}
}
- #endif /* HAVE_ECC */
-
return NID_undef;
}
@@ -38186,11 +39092,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
@@ -38208,6 +39110,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.
*
@@ -38366,8 +39273,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;
@@ -38387,16 +39297,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.
@@ -38449,19 +39350,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;
}
@@ -38517,8 +39420,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].
*
@@ -38546,6 +39451,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)
{
@@ -38564,8 +39472,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");
@@ -38581,6 +39487,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)
@@ -38814,6 +39724,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))
WOLFSSL_DH *wolfSSL_PEM_read_bio_DHparams(WOLFSSL_BIO *bio, WOLFSSL_DH **x,
pem_password_cb *cb, void *u)
{
@@ -38943,6 +39854,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)
@@ -39028,6 +39940,7 @@ 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;
@@ -39293,6 +40206,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 */
@@ -40085,8 +40999,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");
@@ -40102,6 +41021,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)
@@ -40120,21 +41058,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 *,
@@ -41052,6 +41975,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((const byte*)a, (const byte*)b, (int)size);
+}
+
int wolfSSL_sk_X509_num(const WOLF_STACK_OF(WOLFSSL_X509) *s)
{
WOLFSSL_ENTER("wolfSSL_sk_X509_num");
@@ -41911,7 +42841,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;
@@ -41963,7 +42893,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)
@@ -42094,6 +43024,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)) {
@@ -42110,15 +43044,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;
@@ -42147,6 +43096,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;
@@ -42160,7 +43110,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)
{
@@ -42191,37 +43143,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)
@@ -43328,6 +44284,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) {
@@ -43515,7 +44533,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;
}
@@ -43720,7 +44738,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;
@@ -43765,29 +44784,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");
@@ -43812,9 +44809,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)
@@ -43905,23 +44902,36 @@ int wolfSSL_RSA_private_decrypt(int len, const unsigned char* fr,
return ret;
}
-
-
+#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)
{
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)
@@ -43930,13 +44940,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 {
@@ -43944,8 +44954,7 @@ int wolfSSL_RSA_public_decrypt(int flen, const unsigned char* from,
}
return tlen;
}
-
-
+#endif /* !defined(_WIN32) && !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) */
/* RSA private encrypt calls wc_RsaSSL_Sign. Similar function set up as RSA
* public decrypt.
@@ -44874,6 +45883,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 :
@@ -45300,9 +46334,110 @@ err_exit:
return WOLFSSL_FAILURE;
}
+#if !defined(NO_ASN_TIME) && !defined(USER_TIME) && !defined(TIME_OVERRIDES)
+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
+
+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)
{
@@ -45335,14 +46470,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/src/tls.c b/src/tls.c
index 493953ccb..b46dc6cce 100644
--- a/src/tls.c
+++ b/src/tls.c
@@ -679,71 +679,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])
-{
- 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)
{
@@ -1205,21 +1140,24 @@ 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;
-#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
+ const byte* macSecret = NULL;
+ 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) {
@@ -1233,7 +1171,10 @@ int TLS_hmac(WOLFSSL* ssl, byte* digest, const byte* in, word32 sz, int padSz,
}
#endif
- wolfSSL_SetTlsHmacInner(ssl, myInner, sz, content, verify);
+ 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)) {
@@ -1253,9 +1194,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) {
@@ -1410,6 +1361,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);
@@ -3743,7 +3731,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,
@@ -3900,7 +3888,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
@@ -3932,7 +3920,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)
@@ -4116,7 +4105,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
@@ -4266,7 +4255,7 @@ int TLSX_SupportedCurve_Preferred(WOLFSSL* ssl, int checkSupported)
return BAD_FUNC_ARG;
}
-#endif
+#endif /* HAVE_SUPPORTED_CURVES */
#ifndef NO_WOLFSSL_SERVER
@@ -4851,7 +4840,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) {
@@ -5911,10 +5900,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;
@@ -5992,24 +5979,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;
@@ -6033,6 +6008,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. */
@@ -6085,11 +6061,12 @@ 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);
-#ifndef WOLFSSL_TLS13_DRAFT_18
+ ret = TLSX_Prepend(&ssl->extensions,
+ TLSX_SUPPORTED_VERSIONS, ssl, ssl->heap);
+ if (ret != 0) {
+ return ret;
+ }
TLSX_SetResponse(ssl, TLSX_SUPPORTED_VERSIONS);
-#endif
}
if (minor > newMinor) {
ssl->version.minor = minor;
@@ -6110,7 +6087,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)
@@ -6119,13 +6095,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;
@@ -6155,7 +6124,6 @@ static int TLSX_SupportedVersions_Parse(WOLFSSL* ssl, byte* input,
ssl->version.minor = minor;
}
}
-#endif
else
return SANITY_MSG_E;
@@ -6489,7 +6457,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
@@ -6576,7 +6543,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 */
@@ -8126,13 +8092,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;
@@ -9224,10 +9194,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);
@@ -9371,11 +9339,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);
@@ -9549,12 +9515,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");
@@ -9780,8 +9744,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,
@@ -9789,7 +9751,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)
@@ -9797,6 +9761,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)
@@ -10116,7 +10081,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,
@@ -10124,7 +10088,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;
@@ -10502,10 +10465,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)
@@ -10524,9 +10485,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));
@@ -10622,10 +10581,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)
@@ -10644,9 +10601,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. */
@@ -11173,7 +11128,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
@@ -11194,7 +11148,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 9b9b1d1b9..7507e417a 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
@@ -118,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
@@ -263,20 +261,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 +358,6 @@ static int DeriveKeyMsg(WOLFSSL* ssl, byte* output, int outputLen,
protocol, protocolLen, label, labelLen,
hash, hashSz, digestAlg);
}
-#endif
/* Derive a key.
*
@@ -441,19 +429,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 +451,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 +474,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 +507,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 +540,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 +571,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 +602,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 +633,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 +665,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 +698,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 +737,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 +774,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 +801,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 +809,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 +823,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 +877,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 +1396,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);
}
@@ -1583,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};
@@ -1619,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++)
@@ -1764,11 +1655,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 +1955,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 +2235,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 +2292,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 +2417,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 +2454,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 +2649,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 +2715,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 +2731,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 +2785,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 +2803,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 +2828,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 +2840,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 +2884,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 +2893,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 +2909,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 +2933,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 +2982,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 +3001,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 +3017,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 +3027,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);
@@ -3357,6 +3106,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.
@@ -3375,9 +3125,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 +3133,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 +3166,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 +3183,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 +3190,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 {
@@ -3513,7 +3208,7 @@ static int DoTls13CertificateRequest(WOLFSSL* ssl, const byte* input,
return ret;
}
-
+#endif /* !NO_CERTS */
#endif /* !NO_WOLFSSL_CLIENT */
#ifndef NO_WOLFSSL_SERVER
@@ -3666,15 +3361,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);
@@ -3711,6 +3401,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)
@@ -3840,7 +3532,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.
@@ -3891,15 +3583,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)
@@ -3909,7 +3592,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.
*
@@ -3947,34 +3630,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;
@@ -4006,7 +3669,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);
@@ -4016,7 +3678,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);
@@ -4028,7 +3689,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;
@@ -4213,18 +3874,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;
@@ -4320,7 +3972,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;
@@ -4412,88 +4064,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)
{
@@ -4506,21 +4082,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.
*/
@@ -4529,7 +4096,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. */
@@ -4543,27 +4109,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;
@@ -4573,22 +4132,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);
@@ -4609,18 +4164,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);
@@ -4650,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
@@ -4749,9 +4297,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");
@@ -4759,48 +4305,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;
@@ -4840,7 +4344,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,
@@ -5180,7 +4683,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.
*
@@ -5223,7 +4726,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
@@ -5533,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 */
@@ -5656,8 +5161,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;
@@ -5666,6 +5173,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) {
@@ -5912,6 +5422,7 @@ exit_scv:
return ret;
}
+#endif
/* handle processing TLS v1.3 certificate (11) */
/* Parse and handle a TLS v1.3 Certificate message.
@@ -6260,7 +5771,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);
@@ -6270,7 +5781,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;
@@ -6325,6 +5836,7 @@ exit_dcv:
return ret;
}
#endif /* !NO_RSA || HAVE_ECC */
+#endif /* !NO_CERTS */
/* Parse and handle a TLS v1.3 Finished message.
*
@@ -6432,7 +5944,6 @@ static int DoTls13Finished(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
return 0;
}
-#endif /* NO_CERTS */
/* Send the TLS v1.3 Finished message.
*
@@ -6838,10 +6349,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");
@@ -6860,7 +6369,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;
@@ -6874,7 +6382,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)
@@ -6901,11 +6408,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)
@@ -7068,7 +6573,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;
@@ -7076,7 +6580,6 @@ static int SendTls13NewSessionTicket(WOLFSSL* ssl)
}
else
ssl->session.ticketNonce.data[0]++;
-#endif
if (!ssl->options.noTicketTls13) {
if ((ret = CreateTicket(ssl)) != 0)
@@ -7098,10 +6601,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. */
@@ -7122,10 +6623,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);
@@ -7211,19 +6710,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
@@ -7272,29 +6763,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
@@ -7555,13 +7023,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);
@@ -7916,8 +7377,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;
@@ -7960,8 +7420,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);
@@ -8010,8 +7469,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);
@@ -8042,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) {
@@ -8652,21 +8111,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,
@@ -8695,7 +8139,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 ==
@@ -8723,8 +8166,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);
@@ -8783,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/src/wolfio.c b/src/wolfio.c
index b7032caee..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)) {
@@ -779,6 +781,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 +827,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 +860,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 +1343,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 +1390,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 +1405,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 +1464,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 +1496,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 +1507,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/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/tests/api.c b/tests/api.c
index a9f2fdff6..d17faec91 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) \
@@ -695,37 +701,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 +748,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);
@@ -1157,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";
@@ -1170,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);
@@ -1179,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);
@@ -1187,12 +1202,81 @@ static int test_wolfSSL_CertManagerSetVerify(void)
#endif
wolfSSL_CertManagerFree(cm);
- myVerifyFail = tmp;
+ myVerifyAction = tmp;
#endif
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";
+ 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);
+#endif
+}
+
static void test_wolfSSL_CertManagerCRL(void)
{
#if !defined(NO_FILESYSTEM) && !defined(NO_CERTS) && defined(HAVE_CRL) && \
@@ -1229,8 +1313,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 +1411,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 +1490,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 +1588,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 +1774,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));
@@ -1786,10 +1877,11 @@ 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)
{
-#ifdef HAVE_ECC
+#if defined(HAVE_ECC)
BN_CTX *ctx;
EC_GROUP *group;
EC_POINT *Gxy, *new_point, *set_point;
@@ -1805,8 +1897,28 @@ static void test_wolfSSL_EC(void)
const char* kGy = "4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5";
#ifndef HAVE_SELFTEST
+ EC_POINT *tmp;
+ size_t bin_len;
+ unsigned char* buf = NULL;
+
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());
@@ -1830,15 +1942,31 @@ 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, 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);
-
- /* check if point X coordinate is zero */
- AssertIntEQ(BN_is_zero(new_point->X), WOLFSSL_FAILURE);
+ 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);
+ 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(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 +1980,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 +2016,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);
@@ -1902,7 +2070,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)
{
@@ -1976,6 +2144,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
@@ -2289,14 +2509,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;
@@ -2320,15 +2550,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;
@@ -2656,7 +2895,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
@@ -2684,14 +2923,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;
@@ -2706,15 +2956,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;
@@ -3789,44 +4048,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) {
@@ -4265,37 +4524,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) {
@@ -4510,7 +4769,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";
@@ -4793,16 +5052,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
@@ -4842,6 +5106,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
}
@@ -5202,7 +5472,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);
@@ -5218,7 +5488,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");
@@ -14528,6 +14798,13 @@ static int test_wc_ed25519_sign_msg (void)
/* Test bad args. */
if (ret == 0) {
+ AssertIntEQ(wc_ed25519_verify_msg(sig, siglen - 1, msg,
+ msglen, &verify_ok, &key),
+ BAD_FUNC_ARG);
+ AssertIntEQ(wc_ed25519_verify_msg(sig, 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) {
@@ -15117,6 +15394,960 @@ 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)
+{
+
+#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
+ */
+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) {
+ 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) {
+ /*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);
+ 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 wc_ed448_make_key().
*/
@@ -15277,6 +16508,15 @@ static int test_wc_ed448_sign_msg (void)
/* Test bad args. */
if (ret == 0) {
+ AssertIntEQ(wc_ed448_verify_msg(sig, siglen - 1, msg,
+ msglen, &verify_ok, &key,
+ NULL, 0),
+ BAD_FUNC_ARG);
+ AssertIntEQ(wc_ed448_verify_msg(sig, 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) {
@@ -15837,6 +17077,470 @@ 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)
+ WC_RNG rng;
+ curve448_key key;
+ int keysize;
+
+
+ printf(testingFmt, "wc_curve448_make_key()");
+
+ 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) {
+ 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;
+ }
+ }
+
+ if (wc_FreeRng(&rng) != 0 && ret == 0) {
+ ret = WOLFSSL_FATAL_ERROR;
+ }
+
+ printf(resultFmt, ret == 0 ? passed : failed);
+ wc_curve448_free(&key);
+#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)
+{
+ 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 (ret == 0){
+ ret = wc_curve448_init(&public_key);
+ }
+ if (ret == 0) {
+ 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;
+ }
+ }
+ 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);
+ 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)
+{
+ 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);
+ int endian = EC448_BIG_ENDIAN;
+
+ printf(testingFmt, "wc_curve448_import_private_raw_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_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;
+ }
+ }
+ 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;
+ }
+
+ printf(resultFmt, ret == 0 ? passed : failed);
+ wc_curve448_free(&key);
+
+#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.
*/
@@ -16004,6 +17708,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) && !defined(HAVE_SELFTEST) && \
+ !defined(HAVE_FIPS) && defined(OPENSSL_EXTRA)
+ 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()
*/
@@ -16094,6 +17842,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);
@@ -16713,25 +18462,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);
@@ -16753,10 +18498,23 @@ 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);
+ if (ret == ECC_INF_E)
+ ret = BAD_FUNC_ARG; /* This is expected by other tests */
+ }
+ #endif
+ #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;
- } else if (ret == 0) {
- ret = WOLFSSL_FATAL_ERROR;
}
}
@@ -16770,6 +18528,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()
@@ -17190,7 +19022,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;
@@ -17365,7 +19198,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;
@@ -17452,7 +19286,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;
@@ -17582,7 +19417,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;
@@ -20084,6 +21920,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
}
@@ -20388,7 +22246,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));
@@ -20495,8 +22353,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);
@@ -21181,7 +23043,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;
@@ -21236,7 +23098,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;
@@ -21500,7 +23362,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()");
@@ -21508,7 +23370,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)));
@@ -21573,7 +23435,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()");
@@ -21581,7 +23443,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)));
@@ -21867,10 +23729,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);
@@ -21909,13 +23769,8 @@ 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
- #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);
@@ -21939,12 +23794,9 @@ 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);
- #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
@@ -22136,9 +23988,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 */
@@ -22343,26 +24193,52 @@ 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";
+ 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";
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)));
- AssertIntEQ(X509_STORE_add_cert(store, x509), SSL_SUCCESS);
- X509_free(x509);
+ AssertNotNull((ca = wolfSSL_X509_load_certificate_file(caCert,
+ SSL_FILETYPE_PEM)));
+ 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, cert, NULL), SSL_SUCCESS);
+ AssertIntEQ(X509_verify_cert(storeCtx), SSL_SUCCESS);
+ X509_STORE_free(store);
+ X509_STORE_CTX_free(storeCtx);
+ X509_free(cert);
+ X509_free(ca);
- fp = XFOPEN(crl_pem, "rb");
+ /* should fail to verify now after adding in CRL */
+ AssertNotNull(store = (X509_STORE *)X509_STORE_new());
+ AssertNotNull((ca = wolfSSL_X509_load_certificate_file(caCert,
+ SSL_FILETYPE_PEM)));
+ 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, 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((cert = wolfSSL_X509_load_certificate_file(srvCert,
+ SSL_FILETYPE_PEM)));
+ 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_CRL_free(crl);
X509_STORE_free(store);
+ X509_STORE_CTX_free(storeCtx);
+ X509_free(cert);
+ X509_free(ca);
#endif /* HAVE_CRL */
@@ -22709,17 +24585,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
@@ -22763,6 +24642,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;
@@ -22770,18 +24651,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());
@@ -22827,6 +24710,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;
@@ -22834,25 +24719,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
}
@@ -23038,7 +24924,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;
@@ -23405,8 +25291,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;
@@ -23558,10 +25443,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 **/
@@ -23606,7 +25489,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,
@@ -23619,8 +25502,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);
@@ -23642,13 +25525,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
@@ -23749,6 +25632,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,
@@ -23760,8 +25645,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);
@@ -23835,23 +25722,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);
@@ -24490,9 +26392,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 }
};
@@ -24528,9 +26430,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 }
};
@@ -24823,10 +26725,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));
@@ -25100,7 +27001,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);
@@ -25282,7 +27183,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));
@@ -26259,6 +28165,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;
@@ -26298,6 +28205,7 @@ tgZl96bcAGdru8OpQYP7x/rI4h5+rwA/kwIBAg==\n\
XFCLOSE(fp);
printf(resultFmt, passed);
+#endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
#endif /* OPENSSL_ALL || OPENSSL_QT */
#endif
}
@@ -26528,11 +28436,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);
@@ -27027,7 +28933,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)
{
@@ -27095,7 +29001,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);
@@ -27153,7 +29059,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);
@@ -27206,6 +29112,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;
@@ -27260,13 +29167,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;
@@ -27319,6 +29227,7 @@ static void test_wolfSSL_i2d_DHparams()
DH_free(dh);
printf(resultFmt, passed);
+#endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
#endif
}
@@ -27460,14 +29369,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);
@@ -27477,17 +29390,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);
@@ -27530,6 +29443,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;
@@ -27572,6 +29486,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 */
@@ -27584,7 +29499,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;
@@ -27727,7 +29642,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;
@@ -27845,30 +29760,53 @@ 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",
+ };
+ size_t 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
+#if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2))
{
- int nCurves = 27;
+ size_t 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);
AssertStrEQ(OBJ_nid2ln(r[i].nid), r[i].comment);
}
}
+#endif
#endif
for (i = 0; i < maxIdx; i++) {
@@ -27894,19 +29832,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]);
@@ -27914,7 +29839,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) {
@@ -27932,7 +29857,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);
@@ -28083,7 +30008,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));
@@ -28462,9 +30387,88 @@ static void test_wolfSSL_OCSP_get0_info()
#endif /* OPENSSL_EXTRA & HAVE_OCSP */
}
+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;
+ 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 = (unsigned char*)XMALLOC(skeylen, NULL, DYNAMIC_TYPE_OPENSSL));
+ 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);
+
+#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 = (unsigned char*)XMALLOC(skeylen, NULL, DYNAMIC_TYPE_OPENSSL));
+ 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 /* 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 */
+ /* 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 /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
+#endif /* OPENSSL_ALL && WC_RSA_PSS && !WC_NO_RNG*/
+}
+
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;
@@ -28479,11 +30483,13 @@ 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);
printf(resultFmt, passed);
+#endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
#endif /* defined(HAVE_ECC) || defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL) */
}
@@ -28502,6 +30508,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
@@ -29040,7 +31060,8 @@ 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)
+#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;
@@ -29070,26 +31091,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 */
@@ -29107,6 +31118,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
}
@@ -29133,6 +31145,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))
WOLFSSL_EC_KEY* ecKey;
WOLFSSL_EVP_PKEY* pkey;
@@ -29145,6 +31158,7 @@ static void test_EVP_PKEY_ec(void)
printf(resultFmt, passed);
#endif
+#endif
}
static void test_EVP_PKEY_cmp(void)
@@ -29289,15 +31303,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
@@ -29310,10 +31324,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);
@@ -30644,10 +32658,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));
@@ -30657,7 +32671,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);
@@ -30794,16 +32809,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);
@@ -30814,6 +32829,82 @@ static void test_wolfSSL_ASN1_INTEGER_set()
#endif
}
+/* Testing code used in dpp.c in hostap */
+#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 */
+ 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
+
+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;
+ 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);
+#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 = (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);
+#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 */
+ 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 /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
+#endif /* WOLFSSL_WPAS && HAVE_ECC && USE_CERT_BUFFERS_256 */
+}
+
static void test_wolfSSL_i2c_ASN1_INTEGER()
{
#if defined(OPENSSL_EXTRA) && !defined(NO_ASN)
@@ -31331,10 +33422,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);
@@ -31668,6 +33760,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();
@@ -31792,7 +33885,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();
@@ -31853,6 +33946,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();
@@ -31862,9 +33956,10 @@ 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");
+#if defined(OPENSSL_ALL)
test_wolfSSL_X509_PUBKEY_get();
test_wolfSSL_sk_CIPHER_description();
test_wolfSSL_get_ciphers_compat();
@@ -31881,9 +33976,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);
@@ -31912,6 +34005,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();
@@ -32098,9 +34193,13 @@ 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();
+ test_ED25519();
+ test_ED448();
#endif
#if defined(OPENSSL_EXTRA) && defined(HAVE_ECC) && \
!defined(HAVE_SELFTEST) && \
@@ -32125,7 +34224,16 @@ 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_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);
@@ -32135,11 +34243,19 @@ 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_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);
@@ -32151,6 +34267,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/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/tests/suites.c b/tests/suites.c
index 43a023550..3aca423ba 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);
}
@@ -507,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;
@@ -568,21 +572,28 @@ static void test_harness(void* vargs)
cliArgsSz = 1;
cliArgs[0] = args->argv[0];
- while (*cursor != 0) {
- int do_it = 0;
-
+ while (cursor && *cursor != 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
@@ -595,11 +606,12 @@ 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
svrArgs[svrArgsSz++] = XSTRSEP(&cursor, " \n");
- if (*cursor == '\0') /* eof */
+ if (cursor == NULL || *cursor == '\0') /* eof */
do_it = 1;
break;
}
@@ -657,6 +669,7 @@ static void test_harness(void* vargs)
svrArgsSz = 1;
cliArgsSz = 1;
cliMode = 0;
+ do_it = 0;
}
}
@@ -820,6 +833,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");
@@ -1025,7 +1066,7 @@ exit:
return args.return_code;
#else
return NOT_COMPILED_IN;
-#endif /* !NO_WOLFSSL_SERVER && !NO_WOLFSSL_CLIENT */
(void)argc;
(void)argv;
+#endif /* !NO_WOLFSSL_SERVER && !NO_WOLFSSL_CLIENT */
}
diff --git a/tests/test-altchains.conf b/tests/test-altchains.conf
index 9bd52741d..bcd38c01d 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,12 @@
# 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 use alternate chain where chain contains extra cert
# server TLSv1.2 DHE-RSA-AES128-GCM-SHA256 RSA Alt Chain
-v 3
@@ -243,3 +246,173 @@
-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
+-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 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/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
+-H verifyInfo
+
+# 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
+-H verifyInfo
+
+# 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
+-H verifyInfo
+
+# 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
+-H verifyInfo
+
+# 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
+-H verifyInfo
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
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
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..f946cdcf4 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
@@ -173,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
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);
diff --git a/wolfcrypt/benchmark/benchmark.c b/wolfcrypt/benchmark/benchmark.c
old mode 100755
new mode 100644
index f79f7c86f..5619fe35a
--- 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
@@ -5193,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/aes.c b/wolfcrypt/src/aes.c
index 4b5b437ca..b0001f198 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);
@@ -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;
@@ -391,21 +391,21 @@
if (ret != 0)
return ret;
- #ifdef STM32_CRYPTO_AES_ONLY
- hcryp.Init.OperatingMode = CRYP_ALGOMODE_DECRYPT;
+ #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);
@@ -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;
@@ -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,
@@ -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) || \
@@ -2963,41 +2966,34 @@ 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);
- 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;
- }
-
- /* 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;
+ #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);
+ #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);
+
HAL_CRYP_DeInit(&hcryp);
wolfSSL_CryptHwMutexUnLock();
@@ -3023,41 +3019,35 @@ 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);
- 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;
- }
-
- /* store iv for next call */
- XMEMCPY(aes->reg, aes->tmp, AES_BLOCK_SIZE);
-
- in += AES_BLOCK_SIZE;
- out += AES_BLOCK_SIZE;
+ #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);
+ #endif
+ if (ret != HAL_OK) {
+ ret = WC_TIMEOUT_E;
}
+ /* store iv for next call */
+ XMEMCPY(aes->reg, aes->tmp, AES_BLOCK_SIZE);
+
HAL_CRYP_DeInit(&hcryp);
wolfSSL_CryptHwMutexUnLock();
@@ -3065,7 +3055,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;
@@ -3752,26 +3742,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);
@@ -3781,7 +3771,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();
@@ -5927,14 +5917,19 @@ 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;
- byte tag[AES_BLOCK_SIZE];
- byte partialBlock[AES_BLOCK_SIZE];
- byte ctr[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)
@@ -5953,23 +5948,31 @@ 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;
- authInPadded = (byte*)XMALLOC(authPadSz, aes->heap,
- DYNAMIC_TYPE_TMP_BUFFER);
- if (authInPadded == NULL) {
- wolfSSL_CryptHwMutexUnLock();
- return MEMORY_E;
+ /* Authentication buffer - must be 4-byte multiple zero padded */
+ authPadSz = authInSz % sizeof(word32);
+ 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;
}
XMEMSET(authInPadded, 0, authPadSz);
XMEMCPY(authInPadded, authIn, authInSz);
@@ -5981,46 +5984,11 @@ 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;
-#ifdef STM32_CRYPTO_AES_ONLY
- /* Set the CRYP parameters */
- hcryp.Init.ChainingMode = CRYP_CHAINMODE_AES_GCM_GMAC;
- hcryp.Init.OperatingMode = CRYP_ALGOMODE_ENCRYPT;
- hcryp.Init.GCMCMACPhase = CRYP_INIT_PHASE;
- HAL_CRYP_Init(&hcryp);
-
- /* GCM init phase */
- 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;
- 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;
- if (blocks) {
- status = HAL_CRYPEx_AES_Auth(&hcryp, (byte*)in,
- (blocks * AES_BLOCK_SIZE), out, STM32_HAL_TIMEOUT);
- }
- }
- if (status == HAL_OK && (partial != 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);
- 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);
- }
-#elif defined(STM32_HAL_V2)
+#if defined(STM32_HAL_V2)
hcryp.Init.Algorithm = CRYP_AES_GCM;
- ByteReverseWords((word32*)partialBlock, (word32*)ctr, AES_BLOCK_SIZE);
+ hcryp.Init.HeaderSize = authPadSz/sizeof(word32);
+ ByteReverseWords(partialBlock, ctr, AES_BLOCK_SIZE);
hcryp.Init.pInitVect = (STM_CRYPT_TYPE*)partialBlock;
HAL_CRYP_Init(&hcryp);
@@ -6032,7 +6000,46 @@ static int wc_AesGcmEncrypt_STM32(Aes* aes, byte* out, const byte* in, word32 sz
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)
+ 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;
+ HAL_CRYP_Init(&hcryp);
+
+ /* GCM init phase */
+ 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;
+ 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;
+ if (blocks) {
+ status = HAL_CRYPEx_AES_Auth(&hcryp, (byte*)in,
+ (blocks * AES_BLOCK_SIZE), out, STM32_HAL_TIMEOUT);
+ }
+ }
+ 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, (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, (uint8_t*)tag, STM32_HAL_TIMEOUT);
+ }
#else
+ hcryp.Init.HeaderSize = authPadSz;
HAL_CRYP_Init(&hcryp);
if (blocks) {
/* GCM payload phase - blocks */
@@ -6043,13 +6050,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
@@ -6057,13 +6064,13 @@ 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,
(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 */
@@ -6071,12 +6078,11 @@ 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 */
+ /* For STM32 GCM fallback to software if partial AES block or IV != 12 */
if (sz == 0 || partial != 0 || ivSz != GCM_NONCE_MID_SZ) {
- DecrementGcmCounter(ctr); /* hardware requires +1, so subtract it */
+ 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 {
@@ -6085,8 +6091,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);
}
@@ -6269,15 +6275,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
@@ -6358,19 +6358,21 @@ 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;
- 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)];
+ word32 authhdr[AES_BLOCK_SIZE/sizeof(word32)];
byte* authInPadded = NULL;
- int authPadSz;
+ int authPadSz, wasAlloc = 0;
ret = wc_AesGetKeySize(aes, &keySize);
if (ret != 0)
@@ -6389,23 +6391,31 @@ 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;
- authInPadded = (byte*)XMALLOC(authPadSz, aes->heap,
- DYNAMIC_TYPE_TMP_BUFFER);
- if (authInPadded == NULL) {
- wolfSSL_CryptHwMutexUnLock();
- return MEMORY_E;
+ /* Authentication buffer - must be 4-byte multiple zero padded */
+ authPadSz = authInSz % sizeof(word32);
+ 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;
}
XMEMSET(authInPadded, 0, authPadSz);
XMEMCPY(authInPadded, authIn, authInSz);
@@ -6417,10 +6427,27 @@ 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;
-#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)
+ 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;
@@ -6435,40 +6462,27 @@ 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);
}
}
- 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, (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);
- }
-#elif defined(STM32_HAL_V2)
- hcryp.Init.Algorithm = CRYP_AES_GCM;
- ByteReverseWords((word32*)partialBlock, (word32*)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);
+ status = HAL_CRYPEx_AES_Auth(&hcryp, NULL, sz, (byte*)tag, STM32_HAL_TIMEOUT);
}
#else
+ hcryp.Init.HeaderSize = authPadSz;
HAL_CRYP_Init(&hcryp);
if (blocks) {
/* GCM payload phase - blocks */
@@ -6479,13 +6493,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
@@ -6494,7 +6508,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
@@ -6504,25 +6518,26 @@ 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 */
- /* 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 */
+ 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);
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;
}
- /* 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);
}
@@ -6717,14 +6732,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
@@ -6970,6 +6980,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,6 +7021,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;
+ }
+
key = (byte*)aes->key;
status = wc_AesGetKeySize(aes, &keySize);
@@ -7130,20 +7159,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)
@@ -7184,6 +7213,11 @@ 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 (wc_AesCcmCheckTagSize(authTagSz) != 0) {
+ return BAD_FUNC_ARG;
+ }
+
XMEMSET(A, 0, sizeof(A));
XMEMCPY(B+1, nonce, nonceSz);
lenSz = AES_BLOCK_SIZE - 1 - (byte)nonceSz;
@@ -7225,9 +7259,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
@@ -7280,6 +7312,11 @@ 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 (wc_AesCcmCheckTagSize(authTagSz) != 0) {
+ return BAD_FUNC_ARG;
+ }
+
o = out;
oSz = inSz;
XMEMCPY(B+1, nonce, nonceSz);
@@ -7304,9 +7341,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/src/asn.c b/wolfcrypt/src/asn.c
index a224f2ce6..9f04abb88 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
}
}
@@ -880,7 +882,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)
{
@@ -2683,6 +2685,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;
@@ -3404,6 +3409,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 +3436,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 +3466,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 +3503,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
@@ -4395,8 +4412,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");
@@ -4405,9 +4425,11 @@ 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))
temp = *inOutIdx;
+ #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
#endif
/* Assume input started after 1.2.840.113549.1.3.1 dhKeyAgreement */
@@ -4417,6 +4439,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 */
@@ -4461,6 +4485,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");
@@ -5100,7 +5125,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)
@@ -5110,7 +5135,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
@@ -5323,7 +5348,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;
@@ -5356,7 +5381,7 @@ static int GetKey(DecodedCert* cert)
cert->srcIdx += length;
return 0;
}
- #endif /* NO_DSA && QT */
+ #endif /* NO_DSA */
default:
return ASN_UNKNOWN_OID_E;
}
@@ -5466,7 +5491,7 @@ int wc_OBJ_sn2nid(const char *sn)
if (XSTRNCMP(sn, "secp384r1", 10) == 0)
sn = "SECP384R1";
/* find based on name and return NID */
- for (i = 0; ecc_sets[i].size != 0; i++) {
+ 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 */
@@ -7795,7 +7820,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;
@@ -8395,7 +8420,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;
}
@@ -9340,6 +9368,10 @@ 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) {
@@ -9798,9 +9830,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
@@ -10109,10 +10140,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;
}
@@ -10383,48 +10415,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;
}
@@ -11475,7 +11524,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;
@@ -11582,7 +11631,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;
@@ -13563,6 +13612,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
@@ -14001,7 +14052,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) {
@@ -15155,6 +15206,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;
}
@@ -15368,11 +15420,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;
@@ -15380,12 +15432,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;
@@ -15540,9 +15624,23 @@ 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)
+ if ((ret = CheckCurve(oidSum)) < 0)
return ECC_CURVE_OID_E;
+ else {
+ curve_id = ret;
+ }
+ }
+
+ 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 */
@@ -16919,64 +17017,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;
}
@@ -17350,7 +17440,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;
@@ -17378,10 +17468,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;
diff --git a/wolfcrypt/src/coding.c b/wolfcrypt/src/coding.c
index f6c814e01..5c4045b50 100644
--- a/wolfcrypt/src/coding.c
+++ b/wolfcrypt/src/coding.c
@@ -31,17 +31,26 @@
#include
#include
#include
-
+#ifndef NO_ASN
+ #include /* For PEM_LINE_SZ */
+#endif
enum {
BAD = 0xFF, /* invalid encoding */
PAD = '=',
- PEM_LINE_SZ = 64,
BASE64_MIN = 0x2B,
BASE16_MIN = 0x30,
};
+#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;
@@ -132,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)
@@ -291,7 +298,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 +335,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;
}
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/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/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/ecc.c b/wolfcrypt/src/ecc.c
index a3701db88..f3f21c258 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)
@@ -987,7 +991,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 */
@@ -1141,6 +1145,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
@@ -1159,7 +1164,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
@@ -1508,7 +1513,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)
@@ -2835,11 +2840,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) {
@@ -3533,7 +3540,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 ||
@@ -3567,7 +3575,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);
@@ -3598,7 +3606,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)
@@ -3881,7 +3890,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)
{
@@ -3962,7 +3972,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
@@ -3974,7 +3984,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) {
@@ -4034,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)
@@ -4125,12 +4135,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;
@@ -4177,7 +4189,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);
@@ -4450,7 +4462,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
@@ -4552,8 +4564,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)
@@ -4563,26 +4575,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) {
@@ -4798,7 +4808,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);
@@ -4834,7 +4845,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
@@ -5224,7 +5236,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
@@ -5329,7 +5340,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 */
@@ -5348,7 +5359,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
@@ -5837,11 +5849,15 @@ 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;
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];
@@ -5901,7 +5917,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) {
@@ -6283,9 +6299,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, int shortKeySize)
{
int err = 0;
#ifdef HAVE_COMP_KEY
@@ -6294,6 +6311,10 @@ int wc_ecc_import_point_der(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;
@@ -6336,8 +6357,13 @@ 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 */
+ /* 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)
@@ -6440,10 +6466,31 @@ 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
/* 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 +6505,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 +6516,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 +6557,70 @@ 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)
+{
+ 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;
+}
+#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)
{
@@ -6607,7 +6717,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)
@@ -6699,7 +6810,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;
}
@@ -6815,14 +6926,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 */
@@ -6846,7 +6957,6 @@ static int ecc_check_privkey_gen_helper(ecc_key* key)
#endif /* WOLFSSL_VALIDATE_ECC_IMPORT */
-
#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,
@@ -6897,13 +7007,40 @@ 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;
+ 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;
+}
+#endif /* OPENSSLALL */
/* perform sanity checks on ecc key validity, 0 on success */
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);
@@ -6918,9 +7055,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
@@ -7094,7 +7232,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
@@ -7261,7 +7399,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
@@ -7339,7 +7477,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
@@ -7370,7 +7509,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)
@@ -7656,12 +7795,14 @@ 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];
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;
@@ -7699,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 */
@@ -7709,12 +7855,16 @@ 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)
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;
@@ -7756,8 +7906,8 @@ 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 (d != NULL) {
+ #if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A)
/* Hardware doesn't support loading private key */
err = NOT_COMPILED_IN;
@@ -7797,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;
}
@@ -7972,6 +8126,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 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);
@@ -9323,8 +9484,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 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 */
err = mp_montgomery_setup(modulus, &mp);
@@ -9342,8 +9503,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);
@@ -9392,7 +9553,7 @@ 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) {
+ if (initMutex == 0) { /* extra sanity check if wolfCrypt_Init not called */
wc_InitMutex(&ecc_fp_lock);
initMutex = 1;
}
@@ -9420,7 +9581,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);
@@ -9437,7 +9598,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);
@@ -9489,6 +9650,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;
}
@@ -9496,12 +9658,27 @@ static void wc_ecc_fp_free_cache(void)
}
#endif
+
+/** Init the Fixed Point cache */
+void wc_ecc_fp_init(void)
+{
+#ifndef WOLFSSL_SP_MATH
+#ifndef HAVE_THREAD_LS
+ if (initMutex == 0) {
+ 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 (initMutex == 0) {
+ if (initMutex == 0) { /* extra sanity check if wolfCrypt_Init not called */
wc_InitMutex(&ecc_fp_lock);
initMutex = 1;
}
@@ -10112,7 +10289,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/ed25519.c b/wolfcrypt/src/ed25519.c
index 8057caa7c..64aee3389 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)
@@ -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 125ee3852..a25fc5bcc 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;
}
@@ -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;
}
}
diff --git a/wolfcrypt/src/evp.c b/wolfcrypt/src/evp.c
index 180e98514..9682adb4d 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
@@ -28,11 +35,18 @@
#if defined(OPENSSL_EXTRA)
-#ifdef HAVE_CONFIG_H
- #include
+#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
#include
@@ -417,47 +431,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 +548,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
@@ -735,77 +758,102 @@ 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");
-
+ 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 (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);
@@ -1188,6 +1236,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;
}
@@ -1219,9 +1269,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");
}
@@ -1276,6 +1324,119 @@ 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;
+ if (!wolfSSL_EVP_PKEY_up_ref(peer)) {
+ ctx->peerKey = NULL;
+ return WOLFSSL_FAILURE;
+ }
+ return WOLFSSL_SUCCESS;
+}
+
+#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;
+
+ 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;
+}
+#endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
+#endif
+
/* Uses the WOLFSSL_EVP_PKEY_CTX to decrypt a buffer.
*
* ctx structure to decrypt with
@@ -1709,7 +1870,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[] = {
@@ -1748,10 +1909,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 ;
@@ -1987,7 +2148,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;
@@ -2014,7 +2175,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)
@@ -2038,7 +2199,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)
@@ -2153,7 +2314,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);
@@ -2271,7 +2432,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);
@@ -3185,11 +3346,27 @@ 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)
+ {
+ const struct s_ent *ent;
- /* 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;
+
+ if (ctx) {
+ if (ctx->isHMAC) {
+ return NID_hmac;
+ }
+
+ 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;
}
@@ -3213,84 +3390,104 @@ 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 {
- int macType = wolfSSL_EVP_md2macType(EVP_MD_CTX_md(src));
- switch (macType) {
- #ifndef NO_MD5
+ switch (src->macType) {
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;
+ #else
+ ret = NOT_COMPILED_IN;
#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;
+ #else
+ ret = NOT_COMPILED_IN;
#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;
+ #else
+ ret = NOT_COMPILED_IN;
#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;
+ #else
+ ret = NOT_COMPILED_IN;
#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;
+ #else
+ ret = NOT_COMPILED_IN;
#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;
+ #else
+ ret = NOT_COMPILED_IN;
#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;
+ #else
+ ret = NOT_COMPILED_IN;
#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;
+ #else
+ ret = NOT_COMPILED_IN;
#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;
+ #else
+ ret = NOT_COMPILED_IN;
#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);
+ #else
+ ret = NOT_COMPILED_IN;
+ #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
@@ -3321,8 +3518,11 @@ 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->nid) {
+ if(ctx->macType == ent->macType) {
return (const WOLFSSL_EVP_MD *)ent->name;
}
}
@@ -3672,80 +3872,80 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md)
int wolfSSL_EVP_MD_CTX_cleanup(WOLFSSL_EVP_MD_CTX* ctx)
{
+ int ret = WOLFSSL_SUCCESS;
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) {
wc_HmacFree(&ctx->hash.hmac);
}
else {
- int macType = wolfSSL_EVP_md2macType(EVP_MD_CTX_md(ctx));
- switch (macType) {
- #ifndef NO_MD5
+ switch (ctx->macType) {
case WC_HASH_TYPE_MD5:
+ #ifndef NO_MD5
wc_Md5Free((wc_Md5*)&ctx->hash.digest);
- break;
#endif /* !NO_MD5 */
-
- #ifndef NO_SHA
+ break;
case WC_HASH_TYPE_SHA:
+ #ifndef NO_SHA
wc_ShaFree((wc_Sha*)&ctx->hash.digest);
- break;
#endif /* !NO_SHA */
-
- #ifdef WOLFSSL_SHA224
+ break;
case WC_HASH_TYPE_SHA224:
+ #ifdef WOLFSSL_SHA224
wc_Sha224Free((wc_Sha224*)&ctx->hash.digest);
- break;
#endif /* WOLFSSL_SHA224 */
-
- #ifndef NO_SHA256
+ break;
case WC_HASH_TYPE_SHA256:
+ #ifndef NO_SHA256
wc_Sha256Free((wc_Sha256*)&ctx->hash.digest);
- break;
#endif /* !NO_SHA256 */
-
- #ifdef WOLFSSL_SHA384
+ break;
case WC_HASH_TYPE_SHA384:
+ #ifdef WOLFSSL_SHA384
wc_Sha384Free((wc_Sha384*)&ctx->hash.digest);
- break;
#endif /* WOLFSSL_SHA384 */
- #ifdef WOLFSSL_SHA512
+ break;
case WC_HASH_TYPE_SHA512:
+ #ifdef WOLFSSL_SHA512
wc_Sha512Free((wc_Sha512*)&ctx->hash.digest);
- break;
#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;
#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;
#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;
#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);
+ #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 = WOLFSSL_FAILURE;
+ break;
}
}
ForceZero(ctx, sizeof(*ctx));
ctx->macType = WC_HASH_TYPE_NONE;
- return 1;
+ return ret;
}
void wolfSSL_EVP_CIPHER_CTX_init(WOLFSSL_EVP_CIPHER_CTX* ctx)
@@ -3833,7 +4033,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)
@@ -3882,6 +4087,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;
@@ -3990,12 +4202,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 */
@@ -4030,12 +4242,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 */
@@ -4055,12 +4267,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 */
@@ -4081,19 +4293,21 @@ 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(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 ||
@@ -4107,18 +4321,16 @@ 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 (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
@@ -4133,18 +4345,16 @@ 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 (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
@@ -4159,23 +4369,20 @@ 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 (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 /*!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 ||
@@ -4196,12 +4403,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 */
@@ -4224,12 +4431,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 */
@@ -4252,12 +4459,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 */
@@ -4278,7 +4485,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
@@ -4297,7 +4504,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
@@ -4316,7 +4523,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
@@ -4335,12 +4542,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 */
@@ -4359,12 +4566,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 */
@@ -4384,14 +4591,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;
}
}
}
@@ -4411,12 +4618,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 */
@@ -4435,12 +4642,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 */
@@ -4460,14 +4667,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;
}
}
}
@@ -4487,12 +4694,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 */
@@ -4511,12 +4718,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 */
@@ -4536,14 +4743,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;
}
}
}
@@ -4565,12 +4772,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 */
@@ -4589,12 +4796,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 */
@@ -4614,14 +4821,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;
}
}
}
@@ -4653,7 +4860,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;
}
}
}
@@ -4683,7 +4890,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;
}
}
}
@@ -4707,7 +4914,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)
@@ -4729,7 +4936,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
@@ -4749,13 +4956,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 ||
@@ -4773,7 +4980,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 */
@@ -4808,7 +5015,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)
@@ -4833,7 +5040,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)
{
@@ -4844,7 +5050,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)
@@ -5135,7 +5340,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));
}
@@ -5202,165 +5407,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 */
@@ -5596,6 +5815,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;
@@ -5690,6 +5917,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))
/* 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.
@@ -5703,8 +5931,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");
@@ -5726,11 +5952,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) {
@@ -5768,19 +5991,22 @@ 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;
}
+#endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
+WOLFSSL_DH* wolfSSL_EVP_PKEY_get0_DH(WOLFSSL_EVP_PKEY* key)
+{
+ if (!key) {
+ return NULL;
+ }
+ 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;
@@ -5793,7 +6019,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");
@@ -5815,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)
@@ -6255,6 +6481,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;
}
@@ -6358,18 +6586,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) {
@@ -6430,14 +6659,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:
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)
diff --git a/wolfcrypt/src/hmac.c b/wolfcrypt/src/hmac.c
index bcebc1ce2..8667be102 100644
--- a/wolfcrypt/src/hmac.c
+++ b/wolfcrypt/src/hmac.c
@@ -1216,10 +1216,17 @@ int wolfSSL_GetHmacMaxSize(void)
word32 hashSz = wc_HmacSizeByType(type);
byte n = 0x1;
+ /* 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 || ((outSz/hashSz) + ((outSz % hashSz) != 0)) > 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;
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/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)
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 */
diff --git a/wolfcrypt/src/port/arm/armv8-aes.c b/wolfcrypt/src/port/arm/armv8-aes.c
index d0f8a9c5c..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;
}
@@ -4438,6 +4432,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)
@@ -4506,6 +4504,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/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 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;
}
@@ -576,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;
}
diff --git a/wolfcrypt/src/port/cypress/psoc6_crypto.c b/wolfcrypt/src/port/cypress/psoc6_crypto.c
new file mode 100644
index 000000000..b00be7714
--- /dev/null
+++ b/wolfcrypt/src/port/cypress/psoc6_crypto.c
@@ -0,0 +1,251 @@
+/* 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)
+#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
+#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;
+}
+
+/* Sha-512 */
+
+#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
+
+/* Sha-256 */
+
+#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 */
+
+/* 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/wolfcrypt/src/port/pic32/pic32mz-crypt.c b/wolfcrypt/src/port/pic32/pic32mz-crypt.c
index 1e618c194..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;
}
@@ -560,9 +554,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
diff --git a/wolfcrypt/src/port/st/stm32.c b/wolfcrypt/src/port/st/stm32.c
index b37dbd845..2c3aac27d 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)
@@ -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/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/src/random.c b/wolfcrypt/src/random.c
index 53041d164..afed0a4bb 100644
--- a/wolfcrypt/src/random.c
+++ b/wolfcrypt/src/random.c
@@ -1607,6 +1607,24 @@ int wc_GenerateSeed(OS_Seed* os, byte* output, word32 sz)
return 0;
}
+#elif (defined(WOLFSSL_ATMEL) || defined(WOLFSSL_ATECC_RNG)) && \
+ !defined(WOLFSSL_PIC32MZ_RNG)
+ /* enable ATECC RNG unless using PIC32MZ one instead */
+ #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(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/rsa.c b/wolfcrypt/src/rsa.c
index f46407c72..b36678325 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;
}
@@ -1284,7 +1284,7 @@ static int RsaPad(const byte* input, word32 inputLen, byte* pkcsBlock,
}
/* 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)
@@ -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;
}
@@ -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;
@@ -1718,54 +1718,6 @@ static 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,92 @@ 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;
+ }
+ }
+
+ if (d != NULL) {
+ XFREE(d, key->heap, DYNAMIC_TYPE_PRIVATE_KEY);
+ }
+ }
+ #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
@@ -2038,12 +2075,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 +2104,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 +2133,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:
@@ -2253,12 +2302,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;
@@ -2271,11 +2316,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;
@@ -3130,6 +3178,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 +3198,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/wolfcrypt/src/sha256.c b/wolfcrypt/src/sha256.c
index eb0911b01..48b0ffe8a 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)
{
@@ -494,6 +499,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;
}
@@ -663,6 +669,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 +1569,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/sha3.c b/wolfcrypt/src/sha3.c
index 66e7c3150..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)
@@ -1161,7 +1166,16 @@ 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;
+ }
+
+ if (data == NULL && len == 0) {
+ /* valid, but do nothing */
+ return 0;
+ }
+
+ return Sha3Update(shake, data, len, WC_SHA3_256_COUNT);
}
/* Calculate the SHAKE256 hash based on all the message data seen.
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/wolfcrypt/src/signature.c b/wolfcrypt/src/signature.c
index 5d503338a..b5c0a533d 100644
--- a/wolfcrypt/src/signature.c
+++ b/wolfcrypt/src/signature.c
@@ -176,33 +176,38 @@ 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)
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,25 +215,29 @@ 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 {
- WOLFSSL_MSG("RSA Signature Verify difference!");
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;
}
-#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
@@ -308,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 */
}
}
@@ -400,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 {
@@ -420,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 */
@@ -518,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);
@@ -547,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/src/sp_arm32.c b/wolfcrypt/src/sp_arm32.c
index 4540dde65..c0743d619 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"
@@ -4830,12 +4834,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 +4848,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 +4857,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 +4947,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 +4968,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 +4982,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 +4991,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 +5098,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);
}
@@ -6173,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"
@@ -7087,12 +7099,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 +7113,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 +7122,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 +7212,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 +7233,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 +7247,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 +7256,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 +7363,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);
}
@@ -7489,63 +7505,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 +7733,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 +7885,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))
@@ -8399,11 +8414,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;
@@ -8414,7 +8428,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) {
@@ -8423,12 +8437,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);
@@ -8488,7 +8501,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);
}
@@ -14923,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"
@@ -15576,12 +15593,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;
@@ -15590,8 +15607,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;
@@ -15599,12 +15616,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);
@@ -15687,7 +15706,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);
}
@@ -15708,12 +15727,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;
@@ -15722,8 +15741,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;
@@ -15731,12 +15750,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);
@@ -15836,7 +15857,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);
}
@@ -17367,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"
@@ -18633,12 +18658,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;
@@ -18647,8 +18672,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;
@@ -18656,12 +18681,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);
@@ -18744,7 +18771,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);
}
@@ -18765,12 +18792,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;
@@ -18779,8 +18806,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;
@@ -18788,12 +18815,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);
@@ -18893,7 +18922,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);
}
@@ -19035,63 +19064,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 +19372,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 +19524,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))
@@ -20217,11 +20245,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;
@@ -20232,7 +20259,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) {
@@ -20241,12 +20268,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);
@@ -20306,7 +20332,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);
}
@@ -20593,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.
@@ -21936,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.
@@ -50942,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.
@@ -69635,6 +25023,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"
@@ -71253,12 +26645,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;
@@ -71267,8 +26659,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;
@@ -71276,12 +26668,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);
@@ -71364,7 +26758,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);
}
@@ -71385,12 +26779,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;
@@ -71399,8 +26793,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;
@@ -71408,12 +26802,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);
@@ -71513,7 +26909,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);
}
@@ -71655,63 +27051,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 +27439,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 +27591,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))
@@ -73109,11 +28504,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;
@@ -73124,7 +28518,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) {
@@ -73133,12 +28527,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);
@@ -73198,7 +28591,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);
}
@@ -79730,6 +35123,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"
@@ -87902,6 +43299,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"
diff --git a/wolfcrypt/src/sp_arm64.c b/wolfcrypt/src/sp_arm64.c
index ebebe2a55..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);
}
@@ -4991,63 +4999,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 +5123,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 +5275,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))
@@ -5605,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;
@@ -5620,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) {
@@ -5629,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);
@@ -5695,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);
}
@@ -10488,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;
@@ -10502,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;
@@ -10511,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);
@@ -10599,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);
}
@@ -10620,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;
@@ -10634,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;
@@ -10643,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);
@@ -10748,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);
}
@@ -12293,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;
@@ -12307,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;
@@ -12316,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);
@@ -12404,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);
}
@@ -12425,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;
@@ -12439,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;
@@ -12448,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);
@@ -12553,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);
}
@@ -12695,63 +12708,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 +12860,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 +13012,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))
@@ -13433,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;
@@ -13448,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) {
@@ -13457,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);
@@ -13523,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);
}
@@ -17223,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;
@@ -17237,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;
@@ -17246,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);
@@ -17334,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);
}
@@ -17355,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;
@@ -17369,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;
@@ -17378,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);
@@ -17483,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);
}
@@ -17625,63 +17639,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 +17819,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 +17971,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))
@@ -18487,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;
@@ -18502,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) {
@@ -18511,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);
@@ -18577,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 40cb431a3..b1c23b8d2 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);
}
@@ -4362,63 +4370,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 +4431,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 +4583,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))
@@ -5113,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;
@@ -5128,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) {
@@ -5137,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);
@@ -5202,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);
}
@@ -8923,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;
@@ -8937,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;
@@ -8946,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);
@@ -9034,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);
}
@@ -9055,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;
@@ -9069,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;
@@ -9078,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);
@@ -9183,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);
}
@@ -9761,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;
@@ -9775,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;
@@ -9784,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);
@@ -9872,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);
}
@@ -9893,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;
@@ -9907,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;
@@ -9916,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);
@@ -10021,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);
}
@@ -10163,63 +10176,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 +10237,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 +10389,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))
@@ -11112,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;
@@ -11127,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) {
@@ -11136,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);
@@ -11201,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);
}
@@ -11488,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.
@@ -12876,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.
@@ -13042,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.
@@ -14221,12 +13657,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;
@@ -14235,8 +13671,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;
@@ -14244,12 +13680,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);
@@ -14332,7 +13770,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);
}
@@ -14353,12 +13791,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;
@@ -14367,8 +13805,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;
@@ -14376,12 +13814,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);
@@ -14481,7 +13921,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);
}
@@ -14623,63 +14063,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 +14125,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 +14277,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))
@@ -15769,11 +15208,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;
@@ -15784,7 +15222,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) {
@@ -15793,12 +15231,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);
@@ -15858,7 +15295,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 4b9596dc7..3662ceae2 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;
}
@@ -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,18 +1979,20 @@ 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 t[3][90];
-#else
+#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
sp_digit* td;
- sp_digit* t[3];
+#else
+ sp_digit td[3 * 90];
#endif
+ sp_digit* t[3];
sp_digit* norm;
sp_digit mp = 1;
sp_digit n;
@@ -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,12 +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) {
-#ifdef WOLFSSL_SMALL_STACK
- 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_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
+ t[i] = td + (i * 45 * 2);
+#else
+ t[i] = &td[i * 45 * 2];
#endif
- norm = t[0];
+ }
sp_2048_mont_setup(m, &mp);
sp_2048_mont_norm_45(norm, m);
@@ -2040,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
@@ -2061,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 t[32][90];
-#else
- sp_digit* t[32];
+#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;
@@ -2084,11 +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) {
-#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 * 90;
+ rt = td + 2880;
+#else
+ for (i=0; i<32; i++)
+ t[i] = &td[i * 90];
+ rt = &td[2880];
#endif
- norm = t[0];
sp_2048_mont_setup(m, &mp);
sp_2048_mont_norm_45(norm, m);
@@ -2158,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);
@@ -2181,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);
}
@@ -2781,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;
}
@@ -2828,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;
@@ -2837,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);
@@ -2886,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);
@@ -2901,18 +2932,20 @@ 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 t[3][180];
-#else
+#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
sp_digit* td;
- sp_digit* t[3];
+#else
+ sp_digit td[3 * 180];
#endif
+ sp_digit* t[3];
sp_digit* norm;
sp_digit mp = 1;
sp_digit n;
@@ -2921,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;
@@ -2929,12 +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) {
-#ifdef WOLFSSL_SMALL_STACK
- 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_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
+ t[i] = td + (i * 90 * 2);
+#else
+ t[i] = &td[i * 90 * 2];
#endif
- norm = t[0];
+ }
sp_2048_mont_setup(m, &mp);
sp_2048_mont_norm_90(norm, m);
@@ -2972,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
@@ -2993,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 t[32][180];
-#else
- sp_digit* t[32];
+#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;
@@ -3016,11 +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) {
-#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 * 180;
+ rt = td + 5760;
+#else
+ for (i=0; i<32; i++)
+ t[i] = &td[i * 180];
+ rt = &td[5760];
#endif
- norm = t[0];
sp_2048_mont_setup(m, &mp);
sp_2048_mont_norm_90(norm, m);
@@ -3090,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);
@@ -3113,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);
}
@@ -4044,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;
@@ -4058,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) {
@@ -4067,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
@@ -4132,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);
}
@@ -5655,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;
}
@@ -5697,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;
@@ -5706,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);
@@ -5755,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);
@@ -5770,18 +5820,20 @@ 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 t[3][134];
-#else
+#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
sp_digit* td;
- sp_digit* t[3];
+#else
+ sp_digit td[3 * 134];
#endif
+ sp_digit* t[3];
sp_digit* norm;
sp_digit mp = 1;
sp_digit n;
@@ -5790,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;
@@ -5798,12 +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) {
-#ifdef WOLFSSL_SMALL_STACK
- 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_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
+ t[i] = td + (i * 67 * 2);
+#else
+ t[i] = &td[i * 67 * 2];
#endif
- norm = t[0];
+ }
sp_3072_mont_setup(m, &mp);
sp_3072_mont_norm_67(norm, m);
@@ -5841,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
@@ -5862,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 t[32][134];
-#else
- sp_digit* t[32];
+#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;
@@ -5885,11 +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) {
-#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 * 134;
+ rt = td + 4288;
+#else
+ for (i=0; i<32; i++)
+ t[i] = &td[i * 134];
+ rt = &td[4288];
#endif
- norm = t[0];
sp_3072_mont_setup(m, &mp);
sp_3072_mont_norm_67(norm, m);
@@ -5959,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);
@@ -5982,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);
}
@@ -6618,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;
}
@@ -6665,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;
@@ -6674,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);
@@ -6723,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);
@@ -6738,18 +6809,20 @@ 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 t[3][268];
-#else
+#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
sp_digit* td;
- sp_digit* t[3];
+#else
+ sp_digit td[3 * 268];
#endif
+ sp_digit* t[3];
sp_digit* norm;
sp_digit mp = 1;
sp_digit n;
@@ -6758,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;
@@ -6766,12 +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) {
-#ifdef WOLFSSL_SMALL_STACK
- 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_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
+ t[i] = td + (i * 134 * 2);
+#else
+ t[i] = &td[i * 134 * 2];
#endif
- norm = t[0];
+ }
sp_3072_mont_setup(m, &mp);
sp_3072_mont_norm_134(norm, m);
@@ -6809,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
@@ -6830,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 t[32][268];
-#else
- sp_digit* t[32];
+#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;
@@ -6853,11 +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) {
-#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 * 268;
+ rt = td + 8576;
+#else
+ for (i=0; i<32; i++)
+ t[i] = &td[i * 268];
+ rt = &td[8576];
#endif
- norm = t[0];
sp_3072_mont_setup(m, &mp);
sp_3072_mont_norm_134(norm, m);
@@ -6927,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);
@@ -6950,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);
}
@@ -7969,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;
@@ -7983,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) {
@@ -7992,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
@@ -8057,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);
}
@@ -9676,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;
}
@@ -9721,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;
@@ -9730,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);
@@ -9779,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);
@@ -9794,18 +9884,20 @@ 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 t[3][196];
-#else
+#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
sp_digit* td;
- sp_digit* t[3];
+#else
+ sp_digit td[3 * 196];
#endif
+ sp_digit* t[3];
sp_digit* norm;
sp_digit mp = 1;
sp_digit n;
@@ -9814,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;
@@ -9822,12 +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) {
-#ifdef WOLFSSL_SMALL_STACK
- 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_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
+ t[i] = td + (i * 98 * 2);
+#else
+ t[i] = &td[i * 98 * 2];
#endif
- norm = t[0];
+ }
sp_4096_mont_setup(m, &mp);
sp_4096_mont_norm_98(norm, m);
@@ -9865,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
@@ -9886,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 t[32][196];
-#else
- sp_digit* t[32];
+#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;
@@ -9909,11 +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) {
-#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 * 196;
+ rt = td + 6272;
+#else
+ for (i=0; i<32; i++)
+ t[i] = &td[i * 196];
+ rt = &td[6272];
#endif
- norm = t[0];
sp_4096_mont_setup(m, &mp);
sp_4096_mont_norm_98(norm, m);
@@ -9983,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);
@@ -10006,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);
}
@@ -10619,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;
}
@@ -10666,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;
@@ -10675,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);
@@ -10724,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);
@@ -10739,18 +10850,20 @@ 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 t[3][392];
-#else
+#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
sp_digit* td;
- sp_digit* t[3];
+#else
+ sp_digit td[3 * 392];
#endif
+ sp_digit* t[3];
sp_digit* norm;
sp_digit mp = 1;
sp_digit n;
@@ -10759,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;
@@ -10767,12 +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) {
-#ifdef WOLFSSL_SMALL_STACK
- 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_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
+ t[i] = td + (i * 196 * 2);
+#else
+ t[i] = &td[i * 196 * 2];
#endif
- norm = t[0];
+ }
sp_4096_mont_setup(m, &mp);
sp_4096_mont_norm_196(norm, m);
@@ -10810,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
@@ -10831,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 t[32][392];
-#else
- sp_digit* t[32];
+#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;
@@ -10854,11 +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) {
-#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 * 392;
+ rt = td + 12544;
+#else
+ for (i=0; i<32; i++)
+ t[i] = &td[i * 392];
+ rt = &td[12544];
#endif
- norm = t[0];
sp_4096_mont_setup(m, &mp);
sp_4096_mont_norm_196(norm, m);
@@ -10928,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);
@@ -10951,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);
}
@@ -12094,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;
@@ -12108,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) {
@@ -12117,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
@@ -12182,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);
}
@@ -14021,7 +14141,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,
@@ -16614,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;
}
@@ -19647,7 +19767,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,
@@ -22760,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 9038173ed..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;
}
@@ -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,18 +1627,20 @@ 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 t[3][36];
-#else
+#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
sp_digit* td;
- sp_digit* t[3];
+#else
+ sp_digit td[3 * 36];
#endif
+ sp_digit* t[3];
sp_digit* norm;
sp_digit mp = 1;
sp_digit n;
@@ -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,12 +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) {
-#ifdef WOLFSSL_SMALL_STACK
- 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_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
+ t[i] = td + (i * 18 * 2);
+#else
+ t[i] = &td[i * 18 * 2];
#endif
- norm = t[0];
+ }
sp_2048_mont_setup(m, &mp);
sp_2048_mont_norm_18(norm, m);
@@ -1688,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
@@ -1709,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 t[32][36];
-#else
- sp_digit* t[32];
+#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;
@@ -1732,11 +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) {
-#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 * 36;
+ rt = td + 1152;
+#else
+ for (i=0; i<32; i++)
+ t[i] = &td[i * 36];
+ rt = &td[1152];
#endif
- norm = t[0];
sp_2048_mont_setup(m, &mp);
sp_2048_mont_norm_18(norm, m);
@@ -1806,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);
@@ -1829,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);
}
@@ -2424,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;
}
@@ -2468,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;
@@ -2477,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);
@@ -2526,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);
@@ -2541,18 +2572,20 @@ 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 t[3][72];
-#else
+#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
sp_digit* td;
- sp_digit* t[3];
+#else
+ sp_digit td[3 * 72];
#endif
+ sp_digit* t[3];
sp_digit* norm;
sp_digit mp = 1;
sp_digit n;
@@ -2561,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;
@@ -2569,12 +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) {
-#ifdef WOLFSSL_SMALL_STACK
- 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_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
+ t[i] = td + (i * 36 * 2);
+#else
+ t[i] = &td[i * 36 * 2];
#endif
- norm = t[0];
+ }
sp_2048_mont_setup(m, &mp);
sp_2048_mont_norm_36(norm, m);
@@ -2612,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
@@ -2633,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 t[32][72];
-#else
- sp_digit* t[32];
+#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;
@@ -2656,11 +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) {
-#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 * 72;
+ rt = td + 2304;
+#else
+ for (i=0; i<32; i++)
+ t[i] = &td[i * 72];
+ rt = &td[2304];
#endif
- norm = t[0];
sp_2048_mont_setup(m, &mp);
sp_2048_mont_norm_36(norm, m);
@@ -2730,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);
@@ -2753,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);
}
@@ -3576,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;
@@ -3590,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) {
@@ -3599,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
@@ -3665,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);
}
@@ -5643,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;
}
@@ -5685,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;
@@ -5694,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);
@@ -5743,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);
@@ -5758,18 +5808,20 @@ 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 t[3][54];
-#else
+#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
sp_digit* td;
- sp_digit* t[3];
+#else
+ sp_digit td[3 * 54];
#endif
+ sp_digit* t[3];
sp_digit* norm;
sp_digit mp = 1;
sp_digit n;
@@ -5778,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;
@@ -5786,12 +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) {
-#ifdef WOLFSSL_SMALL_STACK
- 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_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
+ t[i] = td + (i * 27 * 2);
+#else
+ t[i] = &td[i * 27 * 2];
#endif
- norm = t[0];
+ }
sp_3072_mont_setup(m, &mp);
sp_3072_mont_norm_27(norm, m);
@@ -5829,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
@@ -5850,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 t[32][54];
-#else
- sp_digit* t[32];
+#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;
@@ -5873,11 +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) {
-#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 * 54;
+ rt = td + 1728;
+#else
+ for (i=0; i<32; i++)
+ t[i] = &td[i * 54];
+ rt = &td[1728];
#endif
- norm = t[0];
sp_3072_mont_setup(m, &mp);
sp_3072_mont_norm_27(norm, m);
@@ -5947,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);
@@ -5970,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);
}
@@ -6535,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;
}
@@ -6579,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;
@@ -6588,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);
@@ -6637,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);
@@ -6652,18 +6723,20 @@ 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 t[3][108];
-#else
+#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
sp_digit* td;
- sp_digit* t[3];
+#else
+ sp_digit td[3 * 108];
#endif
+ sp_digit* t[3];
sp_digit* norm;
sp_digit mp = 1;
sp_digit n;
@@ -6672,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;
@@ -6680,12 +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) {
-#ifdef WOLFSSL_SMALL_STACK
- 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_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
+ t[i] = td + (i * 54 * 2);
+#else
+ t[i] = &td[i * 54 * 2];
#endif
- norm = t[0];
+ }
sp_3072_mont_setup(m, &mp);
sp_3072_mont_norm_54(norm, m);
@@ -6723,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
@@ -6744,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 t[32][108];
-#else
- sp_digit* t[32];
+#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;
@@ -6767,11 +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) {
-#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 * 108;
+ rt = td + 3456;
+#else
+ for (i=0; i<32; i++)
+ t[i] = &td[i * 108];
+ rt = &td[3456];
#endif
- norm = t[0];
sp_3072_mont_setup(m, &mp);
sp_3072_mont_norm_54(norm, m);
@@ -6841,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);
@@ -6864,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);
}
@@ -7723,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;
@@ -7737,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) {
@@ -7746,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
@@ -7812,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);
}
@@ -9897,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;
}
@@ -9942,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;
@@ -9951,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);
@@ -10000,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);
@@ -10015,18 +10105,20 @@ 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 t[3][78];
-#else
+#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
sp_digit* td;
- sp_digit* t[3];
+#else
+ sp_digit td[3 * 78];
#endif
+ sp_digit* t[3];
sp_digit* norm;
sp_digit mp = 1;
sp_digit n;
@@ -10035,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;
@@ -10043,12 +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) {
-#ifdef WOLFSSL_SMALL_STACK
- 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_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
+ t[i] = td + (i * 39 * 2);
+#else
+ t[i] = &td[i * 39 * 2];
#endif
- norm = t[0];
+ }
sp_4096_mont_setup(m, &mp);
sp_4096_mont_norm_39(norm, m);
@@ -10086,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
@@ -10107,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 t[32][78];
-#else
- sp_digit* t[32];
+#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;
@@ -10130,11 +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) {
-#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 * 78;
+ rt = td + 2496;
+#else
+ for (i=0; i<32; i++)
+ t[i] = &td[i * 78];
+ rt = &td[2496];
#endif
- norm = t[0];
sp_4096_mont_setup(m, &mp);
sp_4096_mont_norm_39(norm, m);
@@ -10204,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);
@@ -10227,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);
}
@@ -10888,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;
}
@@ -10935,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;
@@ -10944,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);
@@ -10993,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);
@@ -11008,18 +11119,20 @@ 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 t[3][156];
-#else
+#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
sp_digit* td;
- sp_digit* t[3];
+#else
+ sp_digit td[3 * 156];
#endif
+ sp_digit* t[3];
sp_digit* norm;
sp_digit mp = 1;
sp_digit n;
@@ -11028,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;
@@ -11036,12 +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) {
-#ifdef WOLFSSL_SMALL_STACK
- 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_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
+ t[i] = td + (i * 78 * 2);
+#else
+ t[i] = &td[i * 78 * 2];
#endif
- norm = t[0];
+ }
sp_4096_mont_setup(m, &mp);
sp_4096_mont_norm_78(norm, m);
@@ -11079,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
@@ -11100,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 t[32][156];
-#else
- sp_digit* t[32];
+#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;
@@ -11123,11 +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) {
-#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 * 156;
+ rt = td + 4992;
+#else
+ for (i=0; i<32; i++)
+ t[i] = &td[i * 156];
+ rt = &td[4992];
#endif
- norm = t[0];
sp_4096_mont_setup(m, &mp);
sp_4096_mont_norm_78(norm, m);
@@ -11197,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);
@@ -11220,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);
}
@@ -12127,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;
@@ -12141,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) {
@@ -12150,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
@@ -12216,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);
}
@@ -13841,7 +13961,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,
@@ -16415,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;
}
@@ -19027,7 +19147,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,
@@ -22131,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;
}
diff --git a/wolfcrypt/src/sp_cortexm.c b/wolfcrypt/src/sp_cortexm.c
index b03de8ab4..be01f9757 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);
}
@@ -4116,63 +4124,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 +4183,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 +4335,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))
@@ -4865,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;
@@ -4880,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) {
@@ -4889,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);
@@ -4954,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);
}
@@ -7670,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;
@@ -7684,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;
@@ -7693,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);
@@ -7781,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);
}
@@ -7802,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;
@@ -7816,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;
@@ -7825,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);
@@ -7930,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);
}
@@ -8364,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;
@@ -8378,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;
@@ -8387,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);
@@ -8475,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);
}
@@ -8496,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;
@@ -8510,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;
@@ -8519,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);
@@ -8624,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);
}
@@ -8766,63 +8779,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 +8838,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 +8990,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))
@@ -9711,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;
@@ -9726,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) {
@@ -9735,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);
@@ -9800,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);
}
@@ -10087,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.
@@ -10952,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.
@@ -11090,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.
@@ -11960,12 +11580,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;
@@ -11974,8 +11594,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;
@@ -11983,12 +11603,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);
@@ -12071,7 +11693,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);
}
@@ -12092,12 +11714,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;
@@ -12106,8 +11728,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;
@@ -12115,12 +11737,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);
@@ -12220,7 +11844,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);
}
@@ -12362,63 +11986,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 +12046,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 +12198,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))
@@ -13504,11 +13127,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;
@@ -13519,7 +13141,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) {
@@ -13528,12 +13150,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);
@@ -13593,7 +13214,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);
}
@@ -13803,65 +13424,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 */
+ "mov r14, #0\n\t"
+ "mov r12, #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"
+ "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] */
+ "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 */
+ "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] */
+ "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 */
+ "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] */
+ "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 */
+ "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] */
+ "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 */
+ "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] */
+ "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 */
+ "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] */
+ "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 */
+ "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] */
+ "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 */
+ "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] */
+ /* Load intermediate */
+ "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 */
+ /* Subtract underflow - add neg underflow */
+ "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 */
+ /* Add underflow - subtract neg underflow */
+ "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 */
+ "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 +13835,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 +13844,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] */
"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] */
"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] */
"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] */
+ "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] */
+ "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] */
"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] */
"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] */
"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] */
"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] */
"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] */
"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] */
"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] */
"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] */
"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] */
"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] */
+ "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] */
+ "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] */
"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] */
"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] */
"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] */
"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] */
+ "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] */
+ "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] */
+ "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] */
+ "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] */
"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] */
"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] */
"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] */
+ "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] */
+ "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] */
+ "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] */
+ "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] */
+ "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] */
+ "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] */
"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] */
"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] */
+ "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] */
+ "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] */
+ "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] */
+ "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] */
+ "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] */
+ "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] */
+ "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] */
+ "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] */
+ "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] */
+ "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] */
+ "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] */
+ "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] */
+ "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] */
+ "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] */
+ "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] */
+ "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] */
+ "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] */
+ "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] */
+ "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] */
+ "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] */
+ "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] */
+ "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] */
+ "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] */
+ "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] */
+ "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] */
+ "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] */
+ "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] */
+ "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 */
+ "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 */
+ /* - 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) */
+ "sub r14, r14, r4\n\t"
+ /* + a[0]-a[4] << (3 * 32) */
+ "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 */
+ /* += mu * ((1 << 256) - (1 << 224) + (1 << 192) + (1 << 96) - 1) */
+ "mov %[a], #0\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] */
+ "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] */
+ "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] */
+ /* 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"
+ "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] */
+ /* 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"
+ "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] */
+ "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 */
+ "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] */
+ "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] */
+ "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] */
+ "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] */
+ "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] */
+ "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] */
+ "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] */
+ "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] */
+ "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] */
+ "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] */
+ "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] */
+ "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] */
+ "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] */
+ "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] */
+ "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] */
+ "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] */
+ "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] */
+ "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] */
+ "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] */
+ "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] */
+ "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] */
+ "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] */
+ "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] */
+ "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] */
+ "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] */
+ "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] */
+ "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] */
+ "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] */
+ "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 */
+ "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] */
+ "ldr r6, [%[a], #0]\n\t"
+ "umull r9, r10, r6, r6\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"
+ "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] */
+ "ldr r6, [%[a], #8]\n\t"
+ "umull r9, r10, r6, r6\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"
+ "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] */
+ "ldr r6, [%[a], #16]\n\t"
+ "umull r9, r10, r6, r6\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"
+ "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] */
+ "ldr r6, [%[a], #24]\n\t"
+ "umull r9, r10, r6, r6\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"
+ "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 */
+ "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 */
+ /* - 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) */
+ "sub r14, r14, r4\n\t"
+ /* + a[0]-a[4] << (3 * 32) */
+ "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 */
+ /* += mu * ((1 << 256) - (1 << 224) + (1 << 192) + (1 << 96) - 1) */
+ "mov %[a], #0\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] */
+ "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] */
+ "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] */
+ /* 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"
+ "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] */
+ /* 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"
+ "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] */
+ "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 */
+ "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 +15155,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 +15543,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 +15612,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 +15752,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 +18878,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 +19636,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] = {
diff --git a/wolfcrypt/src/sp_int.c b/wolfcrypt/src/sp_int.c
index 0db891b98..4ec6e2339 100644
--- a/wolfcrypt/src/sp_int.c
+++ b/wolfcrypt/src/sp_int.c
@@ -41,8 +41,8 @@
* 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_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
@@ -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
@@ -496,7 +497,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.
*
@@ -514,7 +515,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.
@@ -1655,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);
diff --git a/wolfcrypt/src/sp_x86_64.c b/wolfcrypt/src/sp_x86_64.c
index 3e49d2022..435aa2234 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);
@@ -281,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.
@@ -360,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;
@@ -376,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;
@@ -385,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);
@@ -497,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
@@ -553,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;
@@ -569,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;
@@ -578,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);
@@ -690,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
@@ -805,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.
@@ -877,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.
@@ -961,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;
@@ -977,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;
@@ -986,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);
@@ -1098,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
@@ -1156,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;
@@ -1172,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;
@@ -1181,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);
@@ -1293,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
@@ -1850,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;
@@ -1865,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;
@@ -1874,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);
@@ -1942,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
@@ -1962,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;
@@ -1977,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;
@@ -1986,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);
@@ -2054,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
@@ -2184,7 +2231,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 +2334,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);
@@ -2430,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.
@@ -2509,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;
@@ -2525,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;
@@ -2534,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);
@@ -2646,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
@@ -2702,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;
@@ -2718,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;
@@ -2727,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);
@@ -2839,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
@@ -2954,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.
@@ -3026,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.
@@ -3110,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;
@@ -3126,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;
@@ -3135,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);
@@ -3247,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
@@ -3305,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;
@@ -3321,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;
@@ -3330,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);
@@ -3442,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
@@ -3999,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;
@@ -4014,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;
@@ -4023,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);
@@ -4091,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
@@ -4111,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;
@@ -4126,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;
@@ -4135,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);
@@ -4203,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
@@ -4333,7 +4427,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 +4530,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);
@@ -4557,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.
@@ -4629,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.
@@ -4713,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;
@@ -4729,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;
@@ -4738,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);
@@ -4850,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
@@ -4908,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;
@@ -4924,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;
@@ -4933,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);
@@ -5045,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
@@ -5602,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;
@@ -5617,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;
@@ -5626,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);
@@ -5694,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
@@ -5714,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;
@@ -5729,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;
@@ -5738,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);
@@ -5806,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
@@ -22065,7 +22200,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 +22347,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.
*
@@ -22321,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.
@@ -27886,7 +28060,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 +28207,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.
*
@@ -28139,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.
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/wolfcrypt/src/tfm.c b/wolfcrypt/src/tfm.c
index 61b31f0e1..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 */
@@ -1710,9 +1732,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,13 +1759,15 @@ 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;
}
- res = &M[1 << winsize];
+#endif
+ res = &M[(word32)(1 << winsize)];
/* init M array */
for(x = 0; x < (1 << winsize); x++)
@@ -1769,12 +1797,14 @@ 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) {
+#ifndef WOLFSSL_NO_MALLOC
XFREE(M, NULL, DYNAMIC_TYPE_BIGINT);
+#endif
return err;
}
}
@@ -1783,12 +1813,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 +1864,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 +1889,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 +1906,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 +1932,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 +1951,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 +1978,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;
}
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
diff --git a/wolfcrypt/src/wc_port.c b/wolfcrypt/src/wc_port.c
index 087807b71..d660f2292 100644
--- a/wolfcrypt/src/wc_port.c
+++ b/wolfcrypt/src/wc_port.c
@@ -46,7 +46,12 @@
#include
#endif
-#if defined(WOLFSSL_ATMEL) || defined(WOLFSSL_ATECC508A)
+#ifdef WOLFSSL_PSOC6_CRYPTO
+ #include
+#endif
+
+#if defined(WOLFSSL_ATMEL) || defined(WOLFSSL_ATECC508A) || \
+ defined(WOLFSSL_ATECC608A)
#include
#endif
#if defined(WOLFSSL_RENESAS_TSIP)
@@ -180,7 +185,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");
@@ -199,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
@@ -219,6 +233,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");
@@ -647,7 +664,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 +682,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 +1863,17 @@ int wolfSSL_CryptHwMutexUnLock(void) {
return 0;
}
+#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
diff --git a/wolfcrypt/test/test.c b/wolfcrypt/test/test.c
index ac4d91d4e..8fdea3067 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
@@ -347,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
@@ -1017,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
@@ -1286,18 +1286,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(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, 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 +1313,53 @@ 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 = (byte*)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)der;
+ (void)derSz;
(void)filePem;
(void)fileDer;
+ (void)pemType;
+ (void)errBase;
return 0;
}
@@ -3303,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) */
@@ -5747,7 +5765,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 */
@@ -7496,10 +7515,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
@@ -8556,7 +8575,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)
@@ -8859,7 +8878,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;
@@ -9068,28 +9087,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;
@@ -9157,6 +9214,37 @@ 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)
+ 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;
+ }
+#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 */
@@ -10311,7 +10399,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";
@@ -10356,12 +10444,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";
@@ -10395,8 +10481,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)
@@ -11222,7 +11308,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)
@@ -11693,7 +11779,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];
@@ -12228,7 +12314,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;
@@ -12254,10 +12339,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);
@@ -12336,8 +12417,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;
}
@@ -12499,8 +12580,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;
}
@@ -12509,7 +12590,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;
@@ -12524,7 +12604,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;
@@ -12546,10 +12625,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);
@@ -12696,8 +12771,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;
}
@@ -12709,8 +12784,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;
@@ -12726,7 +12799,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)
@@ -12765,17 +12837,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;
@@ -12797,10 +12865,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;
@@ -12815,7 +12879,6 @@ int rsa_test(void)
int ret;
byte* tmp;
byte* der = NULL;
- byte* pem = NULL;
size_t bytes;
WC_RNG rng;
RsaKey key;
@@ -13697,10 +13760,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);
@@ -13734,8 +13793,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;
}
@@ -13752,8 +13811,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;
}
@@ -13767,10 +13824,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);
@@ -13845,8 +13898,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;
}
@@ -13856,15 +13909,13 @@ 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;
}
#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
@@ -13877,7 +13928,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);
@@ -14605,7 +14655,6 @@ int dsa_test(void)
#ifdef WOLFSSL_KEY_GEN
{
byte* der;
- byte* pem;
int derSz = 0;
DsaKey derIn;
DsaKey genKey;
@@ -14630,25 +14679,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;
}
@@ -14656,7 +14697,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;
}
@@ -14665,7 +14705,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;
@@ -14673,7 +14712,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 */
@@ -15614,16 +15652,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
@@ -17717,6 +17751,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
@@ -18215,9 +18253,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;
@@ -18234,33 +18272,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 */
@@ -18282,7 +18302,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);
@@ -18296,7 +18316,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);
@@ -18324,7 +18344,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);
@@ -18332,20 +18352,20 @@ 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);
- if (ret == 0) {
+ 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)
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, (word32)XSTRLEN((const char* )msg), tmp, &tmpSz, rng, &key);
} while (ret == WC_PENDING_E);
if (ret != 0) {
ERROR_OUT(-9629, done);
@@ -18360,7 +18380,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, (word32)XSTRLEN((const char* )msg), &verify, &key);
} while (ret == WC_PENDING_E);
if (ret != 0) {
ERROR_OUT(-9630, done);
@@ -18372,7 +18392,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);
@@ -18384,7 +18404,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);
@@ -18399,7 +18419,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);
@@ -18407,7 +18427,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
@@ -18416,7 +18436,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);
@@ -18436,18 +18456,62 @@ 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);
return ret;
}
+
+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)
{
int ret = 0;
@@ -18455,20 +18519,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;
@@ -18486,19 +18539,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);
}
@@ -18506,8 +18559,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;
}
@@ -18524,8 +18576,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;
}
@@ -18533,26 +18584,25 @@ 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)
{
-#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
#ifdef HAVE_ECC_KEY_EXPORT
byte exportBuf[MAX_ECC_BYTES * 2 + 32];
#endif
- word32 x;
-#if defined(HAVE_ECC_DHE) || defined(HAVE_ECC_CDH)
+ word32 x = 0;
+#if (defined(HAVE_ECC_DHE) || defined(HAVE_ECC_CDH)) && \
+ !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A)
word32 y;
#endif
#ifdef HAVE_ECC_SIGN
@@ -18617,6 +18667,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);
@@ -18704,6 +18757,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);
@@ -18722,6 +18776,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 {
@@ -18777,6 +18832,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 */
@@ -18861,7 +18917,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)
@@ -18914,7 +18971,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) {
@@ -18925,14 +18992,13 @@ static int ecc_test_curve(WC_RNG* rng, int keySize)
return ret;
}
}
-#endif
return 0;
}
#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;
@@ -19124,17 +19190,41 @@ 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)*2-1, 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_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:
@@ -19201,7 +19291,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;
@@ -19312,7 +19403,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)
{
@@ -19411,7 +19503,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
@@ -19426,12 +19518,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)
@@ -19733,22 +19827,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
@@ -19799,7 +19894,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
@@ -19899,19 +19994,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 */
@@ -19928,7 +20023,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);
}
@@ -19999,8 +20094,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;
@@ -20057,13 +20152,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
@@ -20128,7 +20224,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
@@ -20136,7 +20232,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
@@ -20250,7 +20346,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;
@@ -20639,7 +20736,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) && \
@@ -22185,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 */
@@ -22809,6 +22906,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 };
@@ -23087,7 +23185,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 */
}
@@ -23119,7 +23217,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)
@@ -23140,7 +23238,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);
@@ -24261,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
@@ -24779,17 +24881,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)
@@ -24814,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
@@ -25697,8 +25805,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,
@@ -25713,7 +25821,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) {
@@ -25726,7 +25834,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) {
@@ -27893,13 +28001,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.rc b/wolfssl.rc
index f28dab0ce..1f5bcd15c 100644
Binary files a/wolfssl.rc and b/wolfssl.rc differ
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);
diff --git a/wolfssl/internal.h b/wolfssl/internal.h
index 127d9bb53..03d85e208 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
@@ -1149,7 +1152,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 +1179,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 */
@@ -1196,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,
@@ -1218,9 +1219,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
@@ -1344,7 +1345,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
@@ -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)
@@ -1491,7 +1502,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
@@ -1829,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;
@@ -2166,12 +2176,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;
@@ -2513,7 +2519,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.
*/
@@ -2521,7 +2526,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 {
@@ -2701,7 +2705,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
@@ -2746,6 +2750,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
@@ -2762,7 +2767,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;
@@ -3000,6 +3005,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 {
@@ -3039,6 +3051,10 @@ 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; /* DTLS uses this to determine which keys
+ * are currently loaded */
+#endif
} Ciphers;
@@ -3148,9 +3164,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;
@@ -3176,7 +3190,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);
@@ -3337,8 +3351,9 @@ 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)
+#if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || defined(WOLFSSL_WPAS_SMALL)
unsigned long mask; /* store SSL_OP_ flags */
#endif
@@ -3692,7 +3707,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
@@ -3732,6 +3747,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;
@@ -3801,6 +3817,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);
@@ -3809,6 +3839,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
@@ -3962,11 +3993,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;
@@ -4300,8 +4329,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";
@@ -4324,12 +4353,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) \
@@ -4368,6 +4393,14 @@ 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
+
+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
@@ -4447,7 +4480,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
@@ -4469,24 +4502,30 @@ 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 */
-#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);
@@ -4581,9 +4620,13 @@ 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(WOLFSSL* ssl, 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 sizeOnly, int asyncOkay, int epochOrder);
#ifdef WOLFSSL_TLS13
int BuildTls13Message(WOLFSSL* ssl, byte* output, int outSz, const byte* input,
diff --git a/wolfssl/openssl/asn1.h b/wolfssl/openssl/asn1.h
index 841860121..993e1daea 100644
--- a/wolfssl/openssl/asn1.h
+++ b/wolfssl/openssl/asn1.h
@@ -66,6 +66,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
@@ -78,7 +79,74 @@
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 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
+ * 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 type __##type##_dummy_struct;\
+ static const WOLFSSL_ASN1_TEMPLATE type##_member_data[]
+
+#define ASN1_SIMPLE(type, member, member_type) \
+ { (char*)&__##type##_dummy_struct.member - (char*)&__##type##_dummy_struct, \
+ 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 *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 *tpl);
+
+/* 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);\
+ }
+
+#endif /* OPENSSL_ALL */
+
+#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/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/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
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 0a23b8f36..ff021ed8b 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/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/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 fa2c0ce89..e8846609c 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
};
@@ -319,6 +322,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 */
@@ -345,13 +353,18 @@ 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;
ALIGN16 unsigned char authTag[AES_BLOCK_SIZE];
int authTagSz;
#endif
+#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;
@@ -364,6 +377,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);
@@ -507,10 +521,12 @@ 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);
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);
@@ -535,6 +551,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);
@@ -775,6 +795,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
@@ -791,6 +812,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
@@ -861,6 +885,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/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
diff --git a/wolfssl/openssl/rsa.h b/wolfssl/openssl/rsa.h
index a3fd4edbb..5445db196 100644
--- a/wolfssl/openssl/rsa.h
+++ b/wolfssl/openssl/rsa.h
@@ -49,6 +49,13 @@
#define RSA_FLAG_NO_BLINDING (1 << 7)
#define RSA_FLAG_NO_CONSTTIME (1 << 8)
+/* 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;
char *name;
diff --git a/wolfssl/openssl/ssl.h b/wolfssl/openssl/ssl.h
index 00eefa5c0..1e97d4550 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
@@ -160,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 */
@@ -349,8 +341,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
@@ -390,7 +382,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
@@ -564,7 +558,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 +709,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
@@ -887,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
@@ -919,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
@@ -1227,7 +1221,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/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/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 7ab1a15e5..551b68aa1 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 {
@@ -505,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
@@ -515,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)
- WOLFSSL_X509_CRL *crl;
+#if (defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)) && defined(HAVE_CRL)
+ WOLFSSL_X509_CRL *crl; /* points to cm->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
@@ -533,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;
@@ -892,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*);
@@ -917,6 +918,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*);
@@ -1150,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);
@@ -1413,7 +1420,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,
@@ -1463,6 +1470,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
@@ -1942,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 */
@@ -2037,7 +2050,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,
@@ -2079,6 +2093,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);
@@ -2416,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*);
@@ -3023,6 +3039,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,
@@ -3238,6 +3255,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);
@@ -3285,8 +3303,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);
@@ -3326,7 +3352,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);
@@ -3334,8 +3360,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,
@@ -3344,20 +3368,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,
@@ -3376,16 +3407,22 @@ 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;
- char* data;
+ byte* data;
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) \
@@ -3405,7 +3442,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);
@@ -3459,12 +3495,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
@@ -3476,6 +3508,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);
@@ -3541,7 +3575,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(
@@ -3550,6 +3586,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*);
@@ -3562,17 +3602,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*);
@@ -3615,10 +3660,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);
@@ -3679,14 +3727,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);
@@ -3736,13 +3787,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);
@@ -3784,11 +3835,19 @@ 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_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);
-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/test.h b/wolfssl/test.h
index 2f133f985..385a3be21 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 {
@@ -1302,7 +1303,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 +1337,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 +1371,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 +1386,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 +1398,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 +1413,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)
@@ -1675,7 +1678,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
@@ -1727,7 +1736,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);
@@ -1762,37 +1771,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;
}
diff --git a/wolfssl/version.h b/wolfssl/version.h
index 4fd4c4f34..eda79bd86 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.1"
+#define LIBWOLFSSL_VERSION_HEX 0x04004001
#ifdef __cplusplus
}
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,
diff --git a/wolfssl/wolfcrypt/asn.h b/wolfssl/wolfcrypt/asn.h
index 393da3cdb..686d09c29 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="
@@ -162,10 +174,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"
@@ -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 */
@@ -311,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 */
@@ -362,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 */
};
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);
diff --git a/wolfssl/wolfcrypt/ecc.h b/wolfssl/wolfcrypt/ecc.h
index cebba65c6..3dc0f3253 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)
@@ -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 */
@@ -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
@@ -422,11 +422,12 @@ 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);
-#ifndef WOLFSSL_ATECC508A
+#if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A)
#ifdef WOLFSSL_PUBLIC_ECC_ADD_DBL
#define ECC_API WOLFSSL_API
@@ -457,6 +458,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
@@ -469,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 */
@@ -518,6 +522,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);
@@ -566,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);
@@ -632,15 +638,23 @@ 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_LOCAL
+int wc_ecc_export_point_der_compressed(const int curve_idx, ecc_point* point,
+ byte* out, word32* outLen);
#endif /* HAVE_ECC_KEY_EXPORT */
#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, int 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 */
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
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
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/port/cypress/psoc6_crypto.h b/wolfssl/wolfcrypt/port/cypress/psoc6_crypto.h
new file mode 100644
index 000000000..964f22162
--- /dev/null
+++ b/wolfssl/wolfcrypt/port/cypress/psoc6_crypto.h
@@ -0,0 +1,74 @@
+/* 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"
+
+#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
+
+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;
+
+#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)
+
+/* Crypto HW engine initialization */
+int psoc6_crypto_port_init(void);
+
+#endif /* _PSOC6_CRYPTO_PORT_H_ */
diff --git a/wolfssl/wolfcrypt/port/st/stm32.h b/wolfssl/wolfcrypt/port/st/stm32.h
index 4b461a113..3db84c7e9 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
@@ -54,6 +49,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 +91,30 @@ 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) || defined(WOLFSSL_STM32H7))
/* Hardware supports AES GCM acceleration */
#define STM32_CRYPTO_AES_GCM
#endif
- #ifdef WOLFSSL_STM32L4
+ #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 */
+ #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)
+ #if !defined(STM32_HAL_V2) && defined(CRYP_AES_GCM) && \
+ (defined(WOLFSSL_STM32F7) || defined(WOLFSSL_STM32L5) || defined(WOLFSSL_STM32H7))
#define STM32_HAL_V2
#endif
@@ -122,7 +131,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 */
@@ -131,12 +140,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_ */
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
diff --git a/wolfssl/wolfcrypt/settings.h b/wolfssl/wolfcrypt/settings.h
index e0620a9f9..87f1ab396 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 */
@@ -209,10 +212,16 @@
/* 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
#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
@@ -292,7 +301,7 @@
#endif
#endif
-#if defined(WOLFSSL_RENESAS_RA6M3G)
+#if defined(WOLFSSL_RENESAS_RA6M3G) || defined(WOLFSSL_RENESAS_RA6M3)
/* settings in user_settings.h */
#endif
@@ -337,7 +346,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
@@ -375,6 +386,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
@@ -703,7 +722,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
@@ -933,6 +952,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
@@ -1178,7 +1206,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_STM32L4) || defined(WOLFSSL_STM32L5) || \
+ defined(WOLFSSL_STM32WB) || defined(WOLFSSL_STM32H7)
#define SIZEOF_LONG_LONG 8
#ifndef CHAR_BIT
@@ -1199,7 +1228,8 @@ extern void uITRON4_free(void *p) ;
#undef STM32_CRYPTO
#define STM32_CRYPTO
- #ifdef WOLFSSL_STM32L4
+ #if defined(WOLFSSL_STM32L4) || defined(WOLFSSL_STM32L5) || \
+ defined(WOLFSSL_STM32WB)
#define NO_AES_192 /* hardware does not support 192-bit */
#endif
#endif
@@ -1214,6 +1244,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)
@@ -1222,6 +1254,10 @@ 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
#if defined(WOLFSSL_CUBEMX_USE_LL) && defined(WOLFSSL_STM32L4)
#include "stm32l4xx_ll_rng.h"
@@ -1247,7 +1283,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"
@@ -1257,11 +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_STM32F7 */
+#endif /* WOLFSSL_STM32F2 || WOLFSSL_STM32F4 || WOLFSSL_STM32L4 ||
+ WOLFSSL_STM32L5 || WOLFSSL_STM32F7 || WOLFSSL_STMWB || WOLFSSL_STM32H7 */
#ifdef WOLFSSL_DEOS
#include
#include
@@ -1391,6 +1438,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
@@ -2187,6 +2251,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" */
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..2948ac6ea 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 */
@@ -142,6 +144,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 +153,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 +171,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
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);
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
diff --git a/wolfssl/wolfcrypt/wc_port.h b/wolfssl/wolfcrypt/wc_port.h
index 88c7bfe34..da451d799 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 */
@@ -245,7 +249,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
@@ -553,6 +557,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))
diff --git a/wolfssl/wolfio.h b/wolfssl/wolfio.h
index 7e97accce..ccbe6a2ad 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"
@@ -158,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
@@ -303,8 +305,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
diff --git a/wrapper/CSharp/include.am b/wrapper/CSharp/include.am
index b0ec4f83d..549d7efb8 100644
--- a/wrapper/CSharp/include.am
+++ b/wrapper/CSharp/include.am
@@ -32,6 +32,7 @@ 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
diff --git a/wrapper/CSharp/wolfSSL-Example-IOCallbacks/wolfSSL-Example-IOCallbacks.cs b/wrapper/CSharp/wolfSSL-Example-IOCallbacks/wolfSSL-Example-IOCallbacks.cs
index f57a63224..8f0e0e27f 100644
--- a/wrapper/CSharp/wolfSSL-Example-IOCallbacks/wolfSSL-Example-IOCallbacks.cs
+++ b/wrapper/CSharp/wolfSSL-Example-IOCallbacks/wolfSSL-Example-IOCallbacks.cs
@@ -135,6 +135,68 @@ 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);
+ Console.WriteLine("Error value for cert store is " + wolfssl.X509_STORE_CTX_get_error(store));
+
+ /* 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" + e);
+ }
+
+ /* 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" + e);
+ }
+
+ /* by returning 1 here we override any failure and report success */
+ return preverify;
+ }
private static void clean(IntPtr ssl, IntPtr ctx)
{
@@ -151,6 +213,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 +254,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-TLS-Server/wolfSSL-TLS-Server.cs b/wrapper/CSharp/wolfSSL-TLS-Server/wolfSSL-TLS-Server.cs
old mode 100755
new mode 100644
diff --git a/wrapper/CSharp/wolfSSL_CSharp/X509.cs b/wrapper/CSharp/wolfSSL_CSharp/X509.cs
new file mode 100644
index 000000000..7f8c53b06
--- /dev/null
+++ b/wrapper/CSharp/wolfSSL_CSharp/X509.cs
@@ -0,0 +1,203 @@
+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);
+ this.isDynamic = isDynamic;
+ }
+
+ ///
+ /// 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..6d9ac13da 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,60 @@ 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 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);
+ [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 +477,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 +490,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 +567,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 +1152,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 +1879,115 @@ 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;
+ }
+ }
+
+
+ ///
+ /// 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
+ ///
+ 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 @@
+