wolfSSL SSL/TLS library, support up to TLS1.3

Dependents:   CyaSSL-Twitter-OAuth4Tw Example-client-tls-cert TwitterReader TweetTest ... more

Committer:
wolfSSL
Date:
Fri Jun 05 00:11:07 2020 +0000
Revision:
17:a5f916481144
Parent:
16:8e0d178b1d1e
wolfSSL 4.4.0

Who changed what in which revision?

UserRevisionLine numberNew contents of line
wolfSSL 16:8e0d178b1d1e 1 /* sp_cdsp_signed.c
wolfSSL 16:8e0d178b1d1e 2 *
wolfSSL 16:8e0d178b1d1e 3 * Copyright (C) 2006-2020 wolfSSL Inc.
wolfSSL 16:8e0d178b1d1e 4 *
wolfSSL 16:8e0d178b1d1e 5 * This file is part of wolfSSL.
wolfSSL 16:8e0d178b1d1e 6 *
wolfSSL 16:8e0d178b1d1e 7 * wolfSSL is free software; you can redistribute it and/or modify
wolfSSL 16:8e0d178b1d1e 8 * it under the terms of the GNU General Public License as published by
wolfSSL 16:8e0d178b1d1e 9 * the Free Software Foundation; either version 2 of the License, or
wolfSSL 16:8e0d178b1d1e 10 * (at your option) any later version.
wolfSSL 16:8e0d178b1d1e 11 *
wolfSSL 16:8e0d178b1d1e 12 * wolfSSL is distributed in the hope that it will be useful,
wolfSSL 16:8e0d178b1d1e 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
wolfSSL 16:8e0d178b1d1e 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
wolfSSL 16:8e0d178b1d1e 15 * GNU General Public License for more details.
wolfSSL 16:8e0d178b1d1e 16 *
wolfSSL 16:8e0d178b1d1e 17 * You should have received a copy of the GNU General Public License
wolfSSL 16:8e0d178b1d1e 18 * along with this program; if not, write to the Free Software
wolfSSL 16:8e0d178b1d1e 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
wolfSSL 16:8e0d178b1d1e 20 */
wolfSSL 16:8e0d178b1d1e 21
wolfSSL 16:8e0d178b1d1e 22 /* from wolfcrypt/src/sp_c32.c */
wolfSSL 16:8e0d178b1d1e 23
wolfSSL 16:8e0d178b1d1e 24 #ifdef HAVE_CONFIG_H
wolfSSL 16:8e0d178b1d1e 25 #include <config.h>
wolfSSL 16:8e0d178b1d1e 26 #endif
wolfSSL 16:8e0d178b1d1e 27
wolfSSL 16:8e0d178b1d1e 28 #include <wolfssl/wolfcrypt/settings.h>
wolfSSL 16:8e0d178b1d1e 29 #include <wolfssl/wolfcrypt/error-crypt.h>
wolfSSL 16:8e0d178b1d1e 30 #include <wolfssl/wolfcrypt/cpuid.h>
wolfSSL 16:8e0d178b1d1e 31 #ifdef NO_INLINE
wolfSSL 16:8e0d178b1d1e 32 #include <wolfssl/wolfcrypt/misc.h>
wolfSSL 16:8e0d178b1d1e 33 #else
wolfSSL 16:8e0d178b1d1e 34 #define WOLFSSL_MISC_INCLUDED
wolfSSL 16:8e0d178b1d1e 35 #include <wolfcrypt/src/misc.c>
wolfSSL 16:8e0d178b1d1e 36 #endif
wolfSSL 16:8e0d178b1d1e 37
wolfSSL 16:8e0d178b1d1e 38 #if defined(WOLFSSL_HAVE_SP_ECC)
wolfSSL 16:8e0d178b1d1e 39 #ifdef WOLFSSL_DSP
wolfSSL 16:8e0d178b1d1e 40
wolfSSL 16:8e0d178b1d1e 41 #include <wolfssl/wolfcrypt/sp.h>
wolfSSL 16:8e0d178b1d1e 42 #include "remote.h"
wolfSSL 16:8e0d178b1d1e 43 #include "hexagon_protos.h"
wolfSSL 16:8e0d178b1d1e 44 #include "hexagon_types.h"
wolfSSL 16:8e0d178b1d1e 45
wolfSSL 16:8e0d178b1d1e 46 #if (defined(WOLFSSL_SP_CACHE_RESISTANT) || defined(WOLFSSL_SP_SMALL)) && (defined(WOLFSSL_HAVE_SP_ECC) || !defined(WOLFSSL_RSA_PUBLIC_ONLY))
wolfSSL 16:8e0d178b1d1e 47 /* Mask for address to obfuscate which of the two address will be used. */
wolfSSL 16:8e0d178b1d1e 48 static const size_t addr_mask[2] = { 0, (size_t)-1 };
wolfSSL 16:8e0d178b1d1e 49 #endif
wolfSSL 16:8e0d178b1d1e 50
wolfSSL 16:8e0d178b1d1e 51 #ifdef WOLFSSL_HAVE_SP_ECC
wolfSSL 16:8e0d178b1d1e 52 #ifndef WOLFSSL_SP_NO_256
wolfSSL 16:8e0d178b1d1e 53
wolfSSL 16:8e0d178b1d1e 54 /* Point structure to use. */
wolfSSL 16:8e0d178b1d1e 55 typedef struct sp_point {
wolfSSL 16:8e0d178b1d1e 56 sp_digit x[2 * 10] __attribute__((aligned(128)));
wolfSSL 16:8e0d178b1d1e 57 sp_digit y[2 * 10] __attribute__((aligned(128)));
wolfSSL 16:8e0d178b1d1e 58 sp_digit z[2 * 10] __attribute__((aligned(128)));
wolfSSL 16:8e0d178b1d1e 59 int infinity;
wolfSSL 16:8e0d178b1d1e 60 } sp_point;
wolfSSL 16:8e0d178b1d1e 61
wolfSSL 16:8e0d178b1d1e 62 /* The modulus (prime) of the curve P256. */
wolfSSL 16:8e0d178b1d1e 63 static const sp_digit p256_mod[10] __attribute__((aligned(128))) = {
wolfSSL 16:8e0d178b1d1e 64 0x3ffffff,0x3ffffff,0x3ffffff,0x003ffff,0x0000000,0x0000000,0x0000000,
wolfSSL 16:8e0d178b1d1e 65 0x0000400,0x3ff0000,0x03fffff
wolfSSL 16:8e0d178b1d1e 66 };
wolfSSL 16:8e0d178b1d1e 67 #ifndef WOLFSSL_SP_SMALL
wolfSSL 16:8e0d178b1d1e 68 /* The Montogmery normalizer for modulus of the curve P256. */
wolfSSL 16:8e0d178b1d1e 69 static const sp_digit p256_norm_mod[10] __attribute__((aligned(128))) = {
wolfSSL 16:8e0d178b1d1e 70 0x0000001,0x0000000,0x0000000,0x3fc0000,0x3ffffff,0x3ffffff,0x3ffffff,
wolfSSL 16:8e0d178b1d1e 71 0x3fffbff,0x000ffff,0x0000000
wolfSSL 16:8e0d178b1d1e 72 };
wolfSSL 16:8e0d178b1d1e 73 #endif /* WOLFSSL_SP_SMALL */
wolfSSL 16:8e0d178b1d1e 74 /* The Montogmery multiplier for modulus of the curve P256. */
wolfSSL 16:8e0d178b1d1e 75 static const sp_digit p256_mp_mod __attribute__((aligned(128))) = 0x000001;
wolfSSL 16:8e0d178b1d1e 76 #if defined(WOLFSSL_VALIDATE_ECC_KEYGEN) || defined(HAVE_ECC_SIGN) || \
wolfSSL 16:8e0d178b1d1e 77 defined(HAVE_ECC_VERIFY)
wolfSSL 16:8e0d178b1d1e 78 /* The order of the curve P256. */
wolfSSL 16:8e0d178b1d1e 79 static const sp_digit p256_order[10] __attribute__((aligned(128))) = {
wolfSSL 16:8e0d178b1d1e 80 0x0632551,0x272b0bf,0x1e84f3b,0x2b69c5e,0x3bce6fa,0x3ffffff,0x3ffffff,
wolfSSL 16:8e0d178b1d1e 81 0x00003ff,0x3ff0000,0x03fffff
wolfSSL 16:8e0d178b1d1e 82 };
wolfSSL 16:8e0d178b1d1e 83 #endif
wolfSSL 16:8e0d178b1d1e 84 #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
wolfSSL 16:8e0d178b1d1e 85 /* The Montogmery normalizer for order of the curve P256. */
wolfSSL 16:8e0d178b1d1e 86 static const sp_digit p256_norm_order[10] __attribute__((aligned(128))) = {
wolfSSL 16:8e0d178b1d1e 87 0x39cdaaf,0x18d4f40,0x217b0c4,0x14963a1,0x0431905,0x0000000,0x0000000,
wolfSSL 16:8e0d178b1d1e 88 0x3fffc00,0x000ffff,0x0000000
wolfSSL 16:8e0d178b1d1e 89 };
wolfSSL 16:8e0d178b1d1e 90 #endif
wolfSSL 16:8e0d178b1d1e 91 #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
wolfSSL 16:8e0d178b1d1e 92 /* The Montogmery multiplier for order of the curve P256. */
wolfSSL 16:8e0d178b1d1e 93 static const sp_digit p256_mp_order __attribute__((aligned(128))) = 0x200bc4f;
wolfSSL 16:8e0d178b1d1e 94 #endif
wolfSSL 16:8e0d178b1d1e 95 /* The base point of curve P256. */
wolfSSL 16:8e0d178b1d1e 96 static const sp_point p256_base __attribute__((aligned(128))) = {
wolfSSL 16:8e0d178b1d1e 97 /* X ordinate */
wolfSSL 16:8e0d178b1d1e 98 {
wolfSSL 16:8e0d178b1d1e 99 0x098c296,0x04e5176,0x33a0f4a,0x204b7ac,0x277037d,0x0e9103c,0x3ce6e56,
wolfSSL 16:8e0d178b1d1e 100 0x1091fe2,0x1f2e12c,0x01ac5f4, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L
wolfSSL 16:8e0d178b1d1e 101 },
wolfSSL 16:8e0d178b1d1e 102 /* Y ordinate */
wolfSSL 16:8e0d178b1d1e 103 {
wolfSSL 16:8e0d178b1d1e 104 0x3bf51f5,0x1901a0d,0x1ececbb,0x15dacc5,0x22bce33,0x303e785,0x27eb4a7,
wolfSSL 16:8e0d178b1d1e 105 0x1fe6e3b,0x2e2fe1a,0x013f8d0, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L
wolfSSL 16:8e0d178b1d1e 106 },
wolfSSL 16:8e0d178b1d1e 107 /* Z ordinate */
wolfSSL 16:8e0d178b1d1e 108 {
wolfSSL 16:8e0d178b1d1e 109 0x0000001,0x0000000,0x0000000,0x0000000,0x0000000,0x0000000,0x0000000,
wolfSSL 16:8e0d178b1d1e 110 0x0000000,0x0000000,0x0000000, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L
wolfSSL 16:8e0d178b1d1e 111 },
wolfSSL 16:8e0d178b1d1e 112 /* infinity */
wolfSSL 16:8e0d178b1d1e 113 0
wolfSSL 16:8e0d178b1d1e 114 };
wolfSSL 16:8e0d178b1d1e 115
wolfSSL 16:8e0d178b1d1e 116 static int sp_ecc_point_new_ex(void* heap, sp_point* sp, sp_point** p)
wolfSSL 16:8e0d178b1d1e 117 {
wolfSSL 16:8e0d178b1d1e 118 int ret = MP_OKAY;
wolfSSL 16:8e0d178b1d1e 119 (void)heap;
wolfSSL 16:8e0d178b1d1e 120 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)
wolfSSL 16:8e0d178b1d1e 121 (void)sp;
wolfSSL 16:8e0d178b1d1e 122 *p = (sp_point*)XMALLOC(sizeof(sp_point), heap, DYNAMIC_TYPE_ECC);
wolfSSL 16:8e0d178b1d1e 123 #else
wolfSSL 16:8e0d178b1d1e 124 *p = sp;
wolfSSL 16:8e0d178b1d1e 125 #endif
wolfSSL 16:8e0d178b1d1e 126 if (p == NULL) {
wolfSSL 16:8e0d178b1d1e 127 ret = MEMORY_E;
wolfSSL 16:8e0d178b1d1e 128 }
wolfSSL 16:8e0d178b1d1e 129 return ret;
wolfSSL 16:8e0d178b1d1e 130 }
wolfSSL 16:8e0d178b1d1e 131
wolfSSL 16:8e0d178b1d1e 132 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)
wolfSSL 16:8e0d178b1d1e 133 /* Allocate memory for point and return error. */
wolfSSL 16:8e0d178b1d1e 134 #define sp_ecc_point_new(heap, sp, p) sp_ecc_point_new_ex((heap), NULL, &(p))
wolfSSL 16:8e0d178b1d1e 135 #else
wolfSSL 16:8e0d178b1d1e 136 /* Set pointer to data and return no error. */
wolfSSL 16:8e0d178b1d1e 137 #define sp_ecc_point_new(heap, sp, p) sp_ecc_point_new_ex((heap), &(sp), &(p))
wolfSSL 16:8e0d178b1d1e 138 #endif
wolfSSL 16:8e0d178b1d1e 139
wolfSSL 16:8e0d178b1d1e 140
wolfSSL 16:8e0d178b1d1e 141 static void sp_ecc_point_free(sp_point* p, int clear, void* heap)
wolfSSL 16:8e0d178b1d1e 142 {
wolfSSL 16:8e0d178b1d1e 143 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)
wolfSSL 16:8e0d178b1d1e 144 /* If valid pointer then clear point data if requested and free data. */
wolfSSL 16:8e0d178b1d1e 145 if (p != NULL) {
wolfSSL 16:8e0d178b1d1e 146 if (clear != 0) {
wolfSSL 16:8e0d178b1d1e 147 XMEMSET(p, 0, sizeof(*p));
wolfSSL 16:8e0d178b1d1e 148 }
wolfSSL 16:8e0d178b1d1e 149 XFREE(p, heap, DYNAMIC_TYPE_ECC);
wolfSSL 16:8e0d178b1d1e 150 }
wolfSSL 16:8e0d178b1d1e 151 #else
wolfSSL 16:8e0d178b1d1e 152 /* Clear point data if requested. */
wolfSSL 16:8e0d178b1d1e 153 if (clear != 0) {
wolfSSL 16:8e0d178b1d1e 154 XMEMSET(p, 0, sizeof(*p));
wolfSSL 16:8e0d178b1d1e 155 }
wolfSSL 16:8e0d178b1d1e 156 #endif
wolfSSL 16:8e0d178b1d1e 157 (void)heap;
wolfSSL 16:8e0d178b1d1e 158 }
wolfSSL 16:8e0d178b1d1e 159
wolfSSL 16:8e0d178b1d1e 160 /* Multiply a number by Montogmery normalizer mod modulus (prime).
wolfSSL 16:8e0d178b1d1e 161 *
wolfSSL 16:8e0d178b1d1e 162 * r The resulting Montgomery form number.
wolfSSL 16:8e0d178b1d1e 163 * a The number to convert.
wolfSSL 16:8e0d178b1d1e 164 * m The modulus (prime).
wolfSSL 16:8e0d178b1d1e 165 * returns MEMORY_E when memory allocation fails and MP_OKAY otherwise.
wolfSSL 16:8e0d178b1d1e 166 */
wolfSSL 16:8e0d178b1d1e 167 static int sp_256_mod_mul_norm_10(sp_digit* r, const sp_digit* a, const sp_digit* m)
wolfSSL 16:8e0d178b1d1e 168 {
wolfSSL 16:8e0d178b1d1e 169 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)
wolfSSL 16:8e0d178b1d1e 170 int64_t* td;
wolfSSL 16:8e0d178b1d1e 171 #else
wolfSSL 16:8e0d178b1d1e 172 int64_t td[8];
wolfSSL 16:8e0d178b1d1e 173 int64_t a32d[8];
wolfSSL 16:8e0d178b1d1e 174 #endif
wolfSSL 16:8e0d178b1d1e 175 int64_t* t;
wolfSSL 16:8e0d178b1d1e 176 int64_t* a32;
wolfSSL 16:8e0d178b1d1e 177 int64_t o;
wolfSSL 16:8e0d178b1d1e 178 int err = MP_OKAY;
wolfSSL 16:8e0d178b1d1e 179
wolfSSL 16:8e0d178b1d1e 180 (void)m;
wolfSSL 16:8e0d178b1d1e 181
wolfSSL 16:8e0d178b1d1e 182 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)
wolfSSL 16:8e0d178b1d1e 183 td = (int64_t*)XMALLOC(sizeof(int64_t) * 2 * 8, NULL, DYNAMIC_TYPE_ECC);
wolfSSL 16:8e0d178b1d1e 184 if (td == NULL) {
wolfSSL 16:8e0d178b1d1e 185 err = MEMORY_E;
wolfSSL 16:8e0d178b1d1e 186 }
wolfSSL 16:8e0d178b1d1e 187 #endif
wolfSSL 16:8e0d178b1d1e 188
wolfSSL 16:8e0d178b1d1e 189 if (err == MP_OKAY) {
wolfSSL 16:8e0d178b1d1e 190 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)
wolfSSL 16:8e0d178b1d1e 191 t = td;
wolfSSL 16:8e0d178b1d1e 192 a32 = td + 8;
wolfSSL 16:8e0d178b1d1e 193 #else
wolfSSL 16:8e0d178b1d1e 194 t = td;
wolfSSL 16:8e0d178b1d1e 195 a32 = a32d;
wolfSSL 16:8e0d178b1d1e 196 #endif
wolfSSL 16:8e0d178b1d1e 197
wolfSSL 16:8e0d178b1d1e 198 a32[0] = a[0];
wolfSSL 16:8e0d178b1d1e 199 a32[0] |= a[1] << 26U;
wolfSSL 16:8e0d178b1d1e 200 a32[0] &= 0xffffffffL;
wolfSSL 16:8e0d178b1d1e 201 a32[1] = (sp_digit)(a[1] >> 6);
wolfSSL 16:8e0d178b1d1e 202 a32[1] |= a[2] << 20U;
wolfSSL 16:8e0d178b1d1e 203 a32[1] &= 0xffffffffL;
wolfSSL 16:8e0d178b1d1e 204 a32[2] = (sp_digit)(a[2] >> 12);
wolfSSL 16:8e0d178b1d1e 205 a32[2] |= a[3] << 14U;
wolfSSL 16:8e0d178b1d1e 206 a32[2] &= 0xffffffffL;
wolfSSL 16:8e0d178b1d1e 207 a32[3] = (sp_digit)(a[3] >> 18);
wolfSSL 16:8e0d178b1d1e 208 a32[3] |= a[4] << 8U;
wolfSSL 16:8e0d178b1d1e 209 a32[3] &= 0xffffffffL;
wolfSSL 16:8e0d178b1d1e 210 a32[4] = (sp_digit)(a[4] >> 24);
wolfSSL 16:8e0d178b1d1e 211 a32[4] |= a[5] << 2U;
wolfSSL 16:8e0d178b1d1e 212 a32[4] |= a[6] << 28U;
wolfSSL 16:8e0d178b1d1e 213 a32[4] &= 0xffffffffL;
wolfSSL 16:8e0d178b1d1e 214 a32[5] = (sp_digit)(a[6] >> 4);
wolfSSL 16:8e0d178b1d1e 215 a32[5] |= a[7] << 22U;
wolfSSL 16:8e0d178b1d1e 216 a32[5] &= 0xffffffffL;
wolfSSL 16:8e0d178b1d1e 217 a32[6] = (sp_digit)(a[7] >> 10);
wolfSSL 16:8e0d178b1d1e 218 a32[6] |= a[8] << 16U;
wolfSSL 16:8e0d178b1d1e 219 a32[6] &= 0xffffffffL;
wolfSSL 16:8e0d178b1d1e 220 a32[7] = (sp_digit)(a[8] >> 16);
wolfSSL 16:8e0d178b1d1e 221 a32[7] |= a[9] << 10U;
wolfSSL 16:8e0d178b1d1e 222 a32[7] &= 0xffffffffL;
wolfSSL 16:8e0d178b1d1e 223
wolfSSL 16:8e0d178b1d1e 224 /* 1 1 0 -1 -1 -1 -1 0 */
wolfSSL 16:8e0d178b1d1e 225 t[0] = 0 + a32[0] + a32[1] - a32[3] - a32[4] - a32[5] - a32[6];
wolfSSL 16:8e0d178b1d1e 226 /* 0 1 1 0 -1 -1 -1 -1 */
wolfSSL 16:8e0d178b1d1e 227 t[1] = 0 + a32[1] + a32[2] - a32[4] - a32[5] - a32[6] - a32[7];
wolfSSL 16:8e0d178b1d1e 228 /* 0 0 1 1 0 -1 -1 -1 */
wolfSSL 16:8e0d178b1d1e 229 t[2] = 0 + a32[2] + a32[3] - a32[5] - a32[6] - a32[7];
wolfSSL 16:8e0d178b1d1e 230 /* -1 -1 0 2 2 1 0 -1 */
wolfSSL 16:8e0d178b1d1e 231 t[3] = 0 - a32[0] - a32[1] + 2 * a32[3] + 2 * a32[4] + a32[5] - a32[7];
wolfSSL 16:8e0d178b1d1e 232 /* 0 -1 -1 0 2 2 1 0 */
wolfSSL 16:8e0d178b1d1e 233 t[4] = 0 - a32[1] - a32[2] + 2 * a32[4] + 2 * a32[5] + a32[6];
wolfSSL 16:8e0d178b1d1e 234 /* 0 0 -1 -1 0 2 2 1 */
wolfSSL 16:8e0d178b1d1e 235 t[5] = 0 - a32[2] - a32[3] + 2 * a32[5] + 2 * a32[6] + a32[7];
wolfSSL 16:8e0d178b1d1e 236 /* -1 -1 0 0 0 1 3 2 */
wolfSSL 16:8e0d178b1d1e 237 t[6] = 0 - a32[0] - a32[1] + a32[5] + 3 * a32[6] + 2 * a32[7];
wolfSSL 16:8e0d178b1d1e 238 /* 1 0 -1 -1 -1 -1 0 3 */
wolfSSL 16:8e0d178b1d1e 239 t[7] = 0 + a32[0] - a32[2] - a32[3] - a32[4] - a32[5] + 3 * a32[7];
wolfSSL 16:8e0d178b1d1e 240
wolfSSL 16:8e0d178b1d1e 241 t[1] += t[0] >> 32U; t[0] &= 0xffffffffL;
wolfSSL 16:8e0d178b1d1e 242 t[2] += t[1] >> 32U; t[1] &= 0xffffffffL;
wolfSSL 16:8e0d178b1d1e 243 t[3] += t[2] >> 32U; t[2] &= 0xffffffffL;
wolfSSL 16:8e0d178b1d1e 244 t[4] += t[3] >> 32U; t[3] &= 0xffffffffL;
wolfSSL 16:8e0d178b1d1e 245 t[5] += t[4] >> 32U; t[4] &= 0xffffffffL;
wolfSSL 16:8e0d178b1d1e 246 t[6] += t[5] >> 32U; t[5] &= 0xffffffffL;
wolfSSL 16:8e0d178b1d1e 247 t[7] += t[6] >> 32U; t[6] &= 0xffffffffL;
wolfSSL 16:8e0d178b1d1e 248 o = t[7] >> 32U; t[7] &= 0xffffffffL;
wolfSSL 16:8e0d178b1d1e 249 t[0] += o;
wolfSSL 16:8e0d178b1d1e 250 t[3] -= o;
wolfSSL 16:8e0d178b1d1e 251 t[6] -= o;
wolfSSL 16:8e0d178b1d1e 252 t[7] += o;
wolfSSL 16:8e0d178b1d1e 253 t[1] += t[0] >> 32U; t[0] &= 0xffffffffL;
wolfSSL 16:8e0d178b1d1e 254 t[2] += t[1] >> 32U; t[1] &= 0xffffffffL;
wolfSSL 16:8e0d178b1d1e 255 t[3] += t[2] >> 32U; t[2] &= 0xffffffffL;
wolfSSL 16:8e0d178b1d1e 256 t[4] += t[3] >> 32U; t[3] &= 0xffffffffL;
wolfSSL 16:8e0d178b1d1e 257 t[5] += t[4] >> 32U; t[4] &= 0xffffffffL;
wolfSSL 16:8e0d178b1d1e 258 t[6] += t[5] >> 32U; t[5] &= 0xffffffffL;
wolfSSL 16:8e0d178b1d1e 259 t[7] += t[6] >> 32U; t[6] &= 0xffffffffL;
wolfSSL 16:8e0d178b1d1e 260
wolfSSL 16:8e0d178b1d1e 261 r[0] = (sp_digit)(t[0]) & 0x3ffffffL;
wolfSSL 16:8e0d178b1d1e 262 r[1] = (sp_digit)(t[0] >> 26U);
wolfSSL 16:8e0d178b1d1e 263 r[1] |= t[1] << 6U;
wolfSSL 16:8e0d178b1d1e 264 r[1] &= 0x3ffffffL;
wolfSSL 16:8e0d178b1d1e 265 r[2] = (sp_digit)(t[1] >> 20U);
wolfSSL 16:8e0d178b1d1e 266 r[2] |= t[2] << 12U;
wolfSSL 16:8e0d178b1d1e 267 r[2] &= 0x3ffffffL;
wolfSSL 16:8e0d178b1d1e 268 r[3] = (sp_digit)(t[2] >> 14U);
wolfSSL 16:8e0d178b1d1e 269 r[3] |= t[3] << 18U;
wolfSSL 16:8e0d178b1d1e 270 r[3] &= 0x3ffffffL;
wolfSSL 16:8e0d178b1d1e 271 r[4] = (sp_digit)(t[3] >> 8U);
wolfSSL 16:8e0d178b1d1e 272 r[4] |= t[4] << 24U;
wolfSSL 16:8e0d178b1d1e 273 r[4] &= 0x3ffffffL;
wolfSSL 16:8e0d178b1d1e 274 r[5] = (sp_digit)(t[4] >> 2U) & 0x3ffffffL;
wolfSSL 16:8e0d178b1d1e 275 r[6] = (sp_digit)(t[4] >> 28U);
wolfSSL 16:8e0d178b1d1e 276 r[6] |= t[5] << 4U;
wolfSSL 16:8e0d178b1d1e 277 r[6] &= 0x3ffffffL;
wolfSSL 16:8e0d178b1d1e 278 r[7] = (sp_digit)(t[5] >> 22U);
wolfSSL 16:8e0d178b1d1e 279 r[7] |= t[6] << 10U;
wolfSSL 16:8e0d178b1d1e 280 r[7] &= 0x3ffffffL;
wolfSSL 16:8e0d178b1d1e 281 r[8] = (sp_digit)(t[6] >> 16U);
wolfSSL 16:8e0d178b1d1e 282 r[8] |= t[7] << 16U;
wolfSSL 16:8e0d178b1d1e 283 r[8] &= 0x3ffffffL;
wolfSSL 16:8e0d178b1d1e 284 r[9] = (sp_digit)(t[7] >> 10U);
wolfSSL 16:8e0d178b1d1e 285 }
wolfSSL 16:8e0d178b1d1e 286
wolfSSL 16:8e0d178b1d1e 287 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)
wolfSSL 16:8e0d178b1d1e 288 if (td != NULL) {
wolfSSL 16:8e0d178b1d1e 289 XFREE(td, NULL, DYNAMIC_TYPE_ECC);
wolfSSL 16:8e0d178b1d1e 290 }
wolfSSL 16:8e0d178b1d1e 291 #endif
wolfSSL 16:8e0d178b1d1e 292
wolfSSL 16:8e0d178b1d1e 293 return err;
wolfSSL 16:8e0d178b1d1e 294 }
wolfSSL 16:8e0d178b1d1e 295
wolfSSL 16:8e0d178b1d1e 296
wolfSSL 16:8e0d178b1d1e 297 /* Compare a with b in constant time.
wolfSSL 16:8e0d178b1d1e 298 *
wolfSSL 16:8e0d178b1d1e 299 * a A single precision integer.
wolfSSL 16:8e0d178b1d1e 300 * b A single precision integer.
wolfSSL 16:8e0d178b1d1e 301 * return -ve, 0 or +ve if a is less than, equal to or greater than b
wolfSSL 16:8e0d178b1d1e 302 * respectively.
wolfSSL 16:8e0d178b1d1e 303 */
wolfSSL 16:8e0d178b1d1e 304 static sp_digit sp_256_cmp_10(const sp_digit* a, const sp_digit* b)
wolfSSL 16:8e0d178b1d1e 305 {
wolfSSL 16:8e0d178b1d1e 306 sp_digit r = 0;
wolfSSL 16:8e0d178b1d1e 307 #ifdef WOLFSSL_SP_SMALL
wolfSSL 16:8e0d178b1d1e 308 int i;
wolfSSL 16:8e0d178b1d1e 309
wolfSSL 16:8e0d178b1d1e 310 for (i=9; i>=0; i--) {
wolfSSL 16:8e0d178b1d1e 311 r |= (a[i] - b[i]) & (0 - ((r == 0) ? (sp_digit)1 : (sp_digit)0));
wolfSSL 16:8e0d178b1d1e 312 }
wolfSSL 16:8e0d178b1d1e 313 #else
wolfSSL 16:8e0d178b1d1e 314 r |= (a[ 9] - b[ 9]) & (0 - ((r == 0) ? (sp_digit)1 : (sp_digit)0));
wolfSSL 16:8e0d178b1d1e 315 r |= (a[ 8] - b[ 8]) & (0 - ((r == 0) ? (sp_digit)1 : (sp_digit)0));
wolfSSL 16:8e0d178b1d1e 316 r |= (a[ 7] - b[ 7]) & (0 - ((r == 0) ? (sp_digit)1 : (sp_digit)0));
wolfSSL 16:8e0d178b1d1e 317 r |= (a[ 6] - b[ 6]) & (0 - ((r == 0) ? (sp_digit)1 : (sp_digit)0));
wolfSSL 16:8e0d178b1d1e 318 r |= (a[ 5] - b[ 5]) & (0 - ((r == 0) ? (sp_digit)1 : (sp_digit)0));
wolfSSL 16:8e0d178b1d1e 319 r |= (a[ 4] - b[ 4]) & (0 - ((r == 0) ? (sp_digit)1 : (sp_digit)0));
wolfSSL 16:8e0d178b1d1e 320 r |= (a[ 3] - b[ 3]) & (0 - ((r == 0) ? (sp_digit)1 : (sp_digit)0));
wolfSSL 16:8e0d178b1d1e 321 r |= (a[ 2] - b[ 2]) & (0 - ((r == 0) ? (sp_digit)1 : (sp_digit)0));
wolfSSL 16:8e0d178b1d1e 322 r |= (a[ 1] - b[ 1]) & (0 - ((r == 0) ? (sp_digit)1 : (sp_digit)0));
wolfSSL 16:8e0d178b1d1e 323 r |= (a[ 0] - b[ 0]) & (0 - ((r == 0) ? (sp_digit)1 : (sp_digit)0));
wolfSSL 16:8e0d178b1d1e 324 #endif /* WOLFSSL_SP_SMALL */
wolfSSL 16:8e0d178b1d1e 325
wolfSSL 16:8e0d178b1d1e 326 return r;
wolfSSL 16:8e0d178b1d1e 327 }
wolfSSL 16:8e0d178b1d1e 328
wolfSSL 16:8e0d178b1d1e 329 /* Normalize the values in each word to 26.
wolfSSL 16:8e0d178b1d1e 330 *
wolfSSL 16:8e0d178b1d1e 331 * a Array of sp_digit to normalize.
wolfSSL 16:8e0d178b1d1e 332 */
wolfSSL 16:8e0d178b1d1e 333 static void sp_256_norm_10(sp_digit* a)
wolfSSL 16:8e0d178b1d1e 334 {
wolfSSL 16:8e0d178b1d1e 335 #ifdef WOLFSSL_SP_SMALL
wolfSSL 16:8e0d178b1d1e 336 int i;
wolfSSL 16:8e0d178b1d1e 337 for (i = 0; i < 9; i++) {
wolfSSL 16:8e0d178b1d1e 338 a[i+1] += a[i] >> 26;
wolfSSL 16:8e0d178b1d1e 339 a[i] &= 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 340 }
wolfSSL 16:8e0d178b1d1e 341 #else
wolfSSL 16:8e0d178b1d1e 342 a[1] += a[0] >> 26; a[0] = Q6_R_and_RR(a[0], 0x3ffffff);
wolfSSL 16:8e0d178b1d1e 343 a[2] += a[1] >> 26; a[1] = Q6_R_and_RR(a[1], 0x3ffffff);
wolfSSL 16:8e0d178b1d1e 344 a[3] += a[2] >> 26; a[2] = Q6_R_and_RR(a[2], 0x3ffffff);
wolfSSL 16:8e0d178b1d1e 345 a[4] += a[3] >> 26; a[3] = Q6_R_and_RR(a[3], 0x3ffffff);
wolfSSL 16:8e0d178b1d1e 346 a[5] += a[4] >> 26; a[4] = Q6_R_and_RR(a[4], 0x3ffffff);
wolfSSL 16:8e0d178b1d1e 347 a[6] += a[5] >> 26; a[5] = Q6_R_and_RR(a[5], 0x3ffffff);
wolfSSL 16:8e0d178b1d1e 348 a[7] += a[6] >> 26; a[6] = Q6_R_and_RR(a[6], 0x3ffffff);
wolfSSL 16:8e0d178b1d1e 349 a[8] += a[7] >> 26; a[7] = Q6_R_and_RR(a[7], 0x3ffffff);
wolfSSL 16:8e0d178b1d1e 350 a[9] += a[8] >> 26; a[8] = Q6_R_and_RR(a[8], 0x3ffffff);
wolfSSL 16:8e0d178b1d1e 351 #endif
wolfSSL 16:8e0d178b1d1e 352 }
wolfSSL 16:8e0d178b1d1e 353
wolfSSL 16:8e0d178b1d1e 354 /* Conditionally subtract b from a using the mask m.
wolfSSL 16:8e0d178b1d1e 355 * m is -1 to subtract and 0 when not.
wolfSSL 16:8e0d178b1d1e 356 *
wolfSSL 16:8e0d178b1d1e 357 * r A single precision number representing condition subtract result.
wolfSSL 16:8e0d178b1d1e 358 * a A single precision number to subtract from.
wolfSSL 16:8e0d178b1d1e 359 * b A single precision number to subtract.
wolfSSL 16:8e0d178b1d1e 360 * m Mask value to apply.
wolfSSL 16:8e0d178b1d1e 361 */
wolfSSL 16:8e0d178b1d1e 362 static void sp_256_cond_sub_10(sp_digit* r, const sp_digit* a,
wolfSSL 16:8e0d178b1d1e 363 const sp_digit* b, const sp_digit m)
wolfSSL 16:8e0d178b1d1e 364 {
wolfSSL 16:8e0d178b1d1e 365 #ifdef WOLFSSL_SP_SMALL
wolfSSL 16:8e0d178b1d1e 366 int i;
wolfSSL 16:8e0d178b1d1e 367
wolfSSL 16:8e0d178b1d1e 368 for (i = 0; i < 10; i++) {
wolfSSL 16:8e0d178b1d1e 369 r[i] = a[i] - (b[i] & m);
wolfSSL 16:8e0d178b1d1e 370 }
wolfSSL 16:8e0d178b1d1e 371 #else
wolfSSL 16:8e0d178b1d1e 372 r[ 0] = Q6_R_sub_RR(a[ 0], Q6_R_and_RR(b[ 0], m));
wolfSSL 16:8e0d178b1d1e 373 r[ 1] = Q6_R_sub_RR(a[ 1], Q6_R_and_RR(b[ 1], m));
wolfSSL 16:8e0d178b1d1e 374 r[ 2] = Q6_R_sub_RR(a[ 2], Q6_R_and_RR(b[ 2], m));
wolfSSL 16:8e0d178b1d1e 375 r[ 3] = Q6_R_sub_RR(a[ 3], Q6_R_and_RR(b[ 3], m));
wolfSSL 16:8e0d178b1d1e 376 r[ 4] = Q6_R_sub_RR(a[ 4], Q6_R_and_RR(b[ 4], m));
wolfSSL 16:8e0d178b1d1e 377 r[ 5] = Q6_R_sub_RR(a[ 5], Q6_R_and_RR(b[ 5], m));
wolfSSL 16:8e0d178b1d1e 378 r[ 6] = Q6_R_sub_RR(a[ 6], Q6_R_and_RR(b[ 6], m));
wolfSSL 16:8e0d178b1d1e 379 r[ 7] = Q6_R_sub_RR(a[ 7], Q6_R_and_RR(b[ 7], m));
wolfSSL 16:8e0d178b1d1e 380 r[ 8] = Q6_R_sub_RR(a[ 8], Q6_R_and_RR(b[ 8], m));
wolfSSL 16:8e0d178b1d1e 381 r[ 9] = Q6_R_sub_RR(a[ 9], Q6_R_and_RR(b[ 9], m));
wolfSSL 16:8e0d178b1d1e 382 #endif /* WOLFSSL_SP_SMALL */
wolfSSL 16:8e0d178b1d1e 383 }
wolfSSL 16:8e0d178b1d1e 384
wolfSSL 16:8e0d178b1d1e 385 #define sp_256_mont_reduce_order_10 sp_256_mont_reduce_10
wolfSSL 16:8e0d178b1d1e 386
wolfSSL 16:8e0d178b1d1e 387 /* Mul a by scalar b and add into r. (r += a * b)
wolfSSL 16:8e0d178b1d1e 388 *
wolfSSL 16:8e0d178b1d1e 389 * r A single precision integer.
wolfSSL 16:8e0d178b1d1e 390 * a A single precision integer.
wolfSSL 16:8e0d178b1d1e 391 * b A scalar.
wolfSSL 16:8e0d178b1d1e 392 */
wolfSSL 16:8e0d178b1d1e 393 SP_NOINLINE static void sp_256_mul_add_10(sp_digit* r, const sp_digit* a,
wolfSSL 16:8e0d178b1d1e 394 const sp_digit b)
wolfSSL 16:8e0d178b1d1e 395 {
wolfSSL 16:8e0d178b1d1e 396 #ifdef WOLFSSL_SP_SMALL
wolfSSL 16:8e0d178b1d1e 397 int64_t tb = b;
wolfSSL 16:8e0d178b1d1e 398 int64_t t = 0;
wolfSSL 16:8e0d178b1d1e 399 int i;
wolfSSL 16:8e0d178b1d1e 400
wolfSSL 16:8e0d178b1d1e 401 for (i = 0; i < 10; i++) {
wolfSSL 16:8e0d178b1d1e 402 t += (tb * a[i]) + r[i];
wolfSSL 16:8e0d178b1d1e 403 r[i] = t & 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 404 t >>= 26;
wolfSSL 16:8e0d178b1d1e 405 }
wolfSSL 16:8e0d178b1d1e 406 r[10] += t;
wolfSSL 16:8e0d178b1d1e 407 #else
wolfSSL 16:8e0d178b1d1e 408 int64_t tb = b;
wolfSSL 16:8e0d178b1d1e 409 int64_t t[10];
wolfSSL 16:8e0d178b1d1e 410
wolfSSL 16:8e0d178b1d1e 411 t[ 0] = Q6_P_mpy_RR(tb, a[ 0]);
wolfSSL 16:8e0d178b1d1e 412 t[ 1] = Q6_P_mpy_RR(tb, a[ 1]);
wolfSSL 16:8e0d178b1d1e 413 t[ 2] = Q6_P_mpy_RR(tb, a[ 2]);
wolfSSL 16:8e0d178b1d1e 414 t[ 3] = Q6_P_mpy_RR(tb, a[ 3]);
wolfSSL 16:8e0d178b1d1e 415 t[ 4] = Q6_P_mpy_RR(tb, a[ 4]);
wolfSSL 16:8e0d178b1d1e 416 t[ 5] = Q6_P_mpy_RR(tb, a[ 5]);
wolfSSL 16:8e0d178b1d1e 417 t[ 6] = Q6_P_mpy_RR(tb, a[ 6]);
wolfSSL 16:8e0d178b1d1e 418 t[ 7] = Q6_P_mpy_RR(tb, a[ 7]);
wolfSSL 16:8e0d178b1d1e 419 t[ 8] = Q6_P_mpy_RR(tb, a[ 8]);
wolfSSL 16:8e0d178b1d1e 420 t[ 9] = Q6_P_mpy_RR(tb, a[ 9]);
wolfSSL 16:8e0d178b1d1e 421 r[ 0] += (t[ 0] & 0x3ffffff);
wolfSSL 16:8e0d178b1d1e 422 r[ 1] += (t[ 0] >> 26) + (t[ 1] & 0x3ffffff);
wolfSSL 16:8e0d178b1d1e 423 r[ 2] += (t[ 1] >> 26) + (t[ 2] & 0x3ffffff);
wolfSSL 16:8e0d178b1d1e 424 r[ 3] += (t[ 2] >> 26) + (t[ 3] & 0x3ffffff);
wolfSSL 16:8e0d178b1d1e 425 r[ 4] += (t[ 3] >> 26) + (t[ 4] & 0x3ffffff);
wolfSSL 16:8e0d178b1d1e 426 r[ 5] += (t[ 4] >> 26) + (t[ 5] & 0x3ffffff);
wolfSSL 16:8e0d178b1d1e 427 r[ 6] += (t[ 5] >> 26) + (t[ 6] & 0x3ffffff);
wolfSSL 16:8e0d178b1d1e 428 r[ 7] += (t[ 6] >> 26) + (t[ 7] & 0x3ffffff);
wolfSSL 16:8e0d178b1d1e 429 r[ 8] += (t[ 7] >> 26) + (t[ 8] & 0x3ffffff);
wolfSSL 16:8e0d178b1d1e 430 r[ 9] += (t[ 8] >> 26) + (t[ 9] & 0x3ffffff);
wolfSSL 16:8e0d178b1d1e 431 r[10] += t[ 9] >> 26;
wolfSSL 16:8e0d178b1d1e 432 #endif /* WOLFSSL_SP_SMALL */
wolfSSL 16:8e0d178b1d1e 433 }
wolfSSL 16:8e0d178b1d1e 434
wolfSSL 16:8e0d178b1d1e 435 /* Shift the result in the high 256 bits down to the bottom.
wolfSSL 16:8e0d178b1d1e 436 *
wolfSSL 16:8e0d178b1d1e 437 * r A single precision number.
wolfSSL 16:8e0d178b1d1e 438 * a A single precision number.
wolfSSL 16:8e0d178b1d1e 439 */
wolfSSL 16:8e0d178b1d1e 440 static void sp_256_mont_shift_10(sp_digit* r, const sp_digit* a)
wolfSSL 16:8e0d178b1d1e 441 {
wolfSSL 16:8e0d178b1d1e 442 #ifdef WOLFSSL_SP_SMALL
wolfSSL 16:8e0d178b1d1e 443 int i;
wolfSSL 16:8e0d178b1d1e 444 sp_digit n, s;
wolfSSL 16:8e0d178b1d1e 445
wolfSSL 16:8e0d178b1d1e 446 s = a[10];
wolfSSL 16:8e0d178b1d1e 447 n = a[9] >> 22;
wolfSSL 16:8e0d178b1d1e 448 for (i = 0; i < 9; i++) {
wolfSSL 16:8e0d178b1d1e 449 n += (s & 0x3ffffff) << 4;
wolfSSL 16:8e0d178b1d1e 450 r[i] = n & 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 451 n >>= 26;
wolfSSL 16:8e0d178b1d1e 452 s = a[11 + i] + (s >> 26);
wolfSSL 16:8e0d178b1d1e 453 }
wolfSSL 16:8e0d178b1d1e 454 n += s << 4;
wolfSSL 16:8e0d178b1d1e 455 r[9] = n;
wolfSSL 16:8e0d178b1d1e 456 #else
wolfSSL 16:8e0d178b1d1e 457 sp_digit n, s;
wolfSSL 16:8e0d178b1d1e 458
wolfSSL 16:8e0d178b1d1e 459 s = a[10]; n = a[9] >> 22;
wolfSSL 16:8e0d178b1d1e 460 n += (s & 0x3ffffff) << 4; r[ 0] = Q6_R_and_RR(n, 0x3ffffff);
wolfSSL 16:8e0d178b1d1e 461 n >>= 26; s = a[11] + (s >> 26);
wolfSSL 16:8e0d178b1d1e 462 n += (s & 0x3ffffff) << 4; r[ 1] = Q6_R_and_RR(n, 0x3ffffff);
wolfSSL 16:8e0d178b1d1e 463 n >>= 26; s = a[12] + (s >> 26);
wolfSSL 16:8e0d178b1d1e 464 n += (s & 0x3ffffff) << 4; r[ 2] = Q6_R_and_RR(n, 0x3ffffff);
wolfSSL 16:8e0d178b1d1e 465 n >>= 26; s = a[13] + (s >> 26);
wolfSSL 16:8e0d178b1d1e 466 n += (s & 0x3ffffff) << 4; r[ 3] = Q6_R_and_RR(n, 0x3ffffff);
wolfSSL 16:8e0d178b1d1e 467 n >>= 26; s = a[14] + (s >> 26);
wolfSSL 16:8e0d178b1d1e 468 n += (s & 0x3ffffff) << 4; r[ 4] = Q6_R_and_RR(n, 0x3ffffff);
wolfSSL 16:8e0d178b1d1e 469 n >>= 26; s = a[15] + (s >> 26);
wolfSSL 16:8e0d178b1d1e 470 n += (s & 0x3ffffff) << 4; r[ 5] = Q6_R_and_RR(n, 0x3ffffff);
wolfSSL 16:8e0d178b1d1e 471 n >>= 26; s = a[16] + (s >> 26);
wolfSSL 16:8e0d178b1d1e 472 n += (s & 0x3ffffff) << 4; r[ 6] = Q6_R_and_RR(n, 0x3ffffff);
wolfSSL 16:8e0d178b1d1e 473 n >>= 26; s = a[17] + (s >> 26);
wolfSSL 16:8e0d178b1d1e 474 n += (s & 0x3ffffff) << 4; r[ 7] = Q6_R_and_RR(n, 0x3ffffff);
wolfSSL 16:8e0d178b1d1e 475 n >>= 26; s = a[18] + (s >> 26);
wolfSSL 16:8e0d178b1d1e 476 n += (s & 0x3ffffff) << 4; r[ 8] = Q6_R_and_RR(n, 0x3ffffff);
wolfSSL 16:8e0d178b1d1e 477 n >>= 26; s = a[19] + (s >> 26);
wolfSSL 16:8e0d178b1d1e 478 n += s << 4; r[ 9] = n;
wolfSSL 16:8e0d178b1d1e 479 #endif /* WOLFSSL_SP_SMALL */
wolfSSL 16:8e0d178b1d1e 480 XMEMSET(&r[10], 0, sizeof(*r) * 10U);
wolfSSL 16:8e0d178b1d1e 481 }
wolfSSL 16:8e0d178b1d1e 482
wolfSSL 16:8e0d178b1d1e 483
wolfSSL 16:8e0d178b1d1e 484 /* Reduce the number back to 256 bits using Montgomery reduction.
wolfSSL 16:8e0d178b1d1e 485 *
wolfSSL 16:8e0d178b1d1e 486 * a A single precision number to reduce in place.
wolfSSL 16:8e0d178b1d1e 487 * m The single precision number representing the modulus.
wolfSSL 16:8e0d178b1d1e 488 * mp The digit representing the negative inverse of m mod 2^n.
wolfSSL 16:8e0d178b1d1e 489 */
wolfSSL 16:8e0d178b1d1e 490 static void sp_256_mont_reduce_10(sp_digit* a, const sp_digit* m, sp_digit mp)
wolfSSL 16:8e0d178b1d1e 491 {
wolfSSL 16:8e0d178b1d1e 492 sp_digit mu;
wolfSSL 16:8e0d178b1d1e 493
wolfSSL 16:8e0d178b1d1e 494
wolfSSL 16:8e0d178b1d1e 495 /* unrolled for loops due to unexpected behavior with -O optimizations */
wolfSSL 16:8e0d178b1d1e 496 if (mp != 1) {
wolfSSL 16:8e0d178b1d1e 497 mu = Q6_P_mpy_RR(a[0], mp) & 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 498 sp_256_mul_add_10(a+0, m, mu);
wolfSSL 16:8e0d178b1d1e 499 a[0+1] += a[0] >> 26;
wolfSSL 16:8e0d178b1d1e 500
wolfSSL 16:8e0d178b1d1e 501 mu = Q6_P_mpy_RR(a[1], mp) & 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 502 sp_256_mul_add_10(a+1, m, mu);
wolfSSL 16:8e0d178b1d1e 503 a[1+1] += a[1] >> 26;
wolfSSL 16:8e0d178b1d1e 504
wolfSSL 16:8e0d178b1d1e 505 mu = Q6_P_mpy_RR(a[2], mp) & 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 506 sp_256_mul_add_10(a+2, m, mu);
wolfSSL 16:8e0d178b1d1e 507 a[2+1] += a[2] >> 26;
wolfSSL 16:8e0d178b1d1e 508
wolfSSL 16:8e0d178b1d1e 509 mu = Q6_P_mpy_RR(a[3], mp) & 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 510 sp_256_mul_add_10(a+3, m, mu);
wolfSSL 16:8e0d178b1d1e 511 a[3+1] += a[3] >> 26;
wolfSSL 16:8e0d178b1d1e 512
wolfSSL 16:8e0d178b1d1e 513 mu = Q6_P_mpy_RR(a[4], mp) & 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 514 sp_256_mul_add_10(a+4, m, mu);
wolfSSL 16:8e0d178b1d1e 515 a[4+1] += a[4] >> 26;
wolfSSL 16:8e0d178b1d1e 516
wolfSSL 16:8e0d178b1d1e 517 mu = Q6_P_mpy_RR(a[5], mp) & 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 518 sp_256_mul_add_10(a+5, m, mu);
wolfSSL 16:8e0d178b1d1e 519 a[5+1] += a[5] >> 26;
wolfSSL 16:8e0d178b1d1e 520
wolfSSL 16:8e0d178b1d1e 521 mu = Q6_P_mpy_RR(a[6], mp) & 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 522 sp_256_mul_add_10(a+6, m, mu);
wolfSSL 16:8e0d178b1d1e 523 a[6+1] += a[6] >> 26;
wolfSSL 16:8e0d178b1d1e 524
wolfSSL 16:8e0d178b1d1e 525 mu = Q6_P_mpy_RR(a[7], mp) & 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 526 sp_256_mul_add_10(a+7, m, mu);
wolfSSL 16:8e0d178b1d1e 527 a[7+1] += a[7] >> 26;
wolfSSL 16:8e0d178b1d1e 528
wolfSSL 16:8e0d178b1d1e 529 mu = Q6_P_mpy_RR(a[8], mp) & 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 530 sp_256_mul_add_10(a+8, m, mu);
wolfSSL 16:8e0d178b1d1e 531 a[8+1] += a[8] >> 26;
wolfSSL 16:8e0d178b1d1e 532
wolfSSL 16:8e0d178b1d1e 533 mu = Q6_P_mpy_RR(a[9], mp) & 0x3fffffL;
wolfSSL 16:8e0d178b1d1e 534 sp_256_mul_add_10(a+9, m, mu);
wolfSSL 16:8e0d178b1d1e 535 a[9+1] += a[9] >> 26;
wolfSSL 16:8e0d178b1d1e 536 a[9] &= 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 537 }
wolfSSL 16:8e0d178b1d1e 538 else {
wolfSSL 16:8e0d178b1d1e 539 mu = Q6_P_mpy_RR(a[0], mp) & 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 540 sp_256_mul_add_10(a+0, p256_mod, mu);
wolfSSL 16:8e0d178b1d1e 541 a[0+1] += a[0] >> 26;
wolfSSL 16:8e0d178b1d1e 542
wolfSSL 16:8e0d178b1d1e 543 mu = Q6_P_mpy_RR(a[1], mp) & 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 544 sp_256_mul_add_10(a+1, p256_mod, mu);
wolfSSL 16:8e0d178b1d1e 545 a[1+1] += a[1] >> 26;
wolfSSL 16:8e0d178b1d1e 546
wolfSSL 16:8e0d178b1d1e 547 mu = Q6_P_mpy_RR(a[2], mp) & 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 548 sp_256_mul_add_10(a+2, p256_mod, mu);
wolfSSL 16:8e0d178b1d1e 549 a[2+1] += a[2] >> 26;
wolfSSL 16:8e0d178b1d1e 550
wolfSSL 16:8e0d178b1d1e 551 mu = Q6_P_mpy_RR(a[3], mp) & 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 552 sp_256_mul_add_10(a+3, p256_mod, mu);
wolfSSL 16:8e0d178b1d1e 553 a[3+1] += a[3] >> 26;
wolfSSL 16:8e0d178b1d1e 554
wolfSSL 16:8e0d178b1d1e 555 mu = Q6_P_mpy_RR(a[4], mp) & 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 556 sp_256_mul_add_10(a+4, p256_mod, mu);
wolfSSL 16:8e0d178b1d1e 557 a[4+1] += a[4] >> 26;
wolfSSL 16:8e0d178b1d1e 558
wolfSSL 16:8e0d178b1d1e 559 mu = Q6_P_mpy_RR(a[5], mp) & 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 560 sp_256_mul_add_10(a+5, p256_mod, mu);
wolfSSL 16:8e0d178b1d1e 561 a[5+1] += a[5] >> 26;
wolfSSL 16:8e0d178b1d1e 562
wolfSSL 16:8e0d178b1d1e 563 mu = Q6_P_mpy_RR(a[6], mp) & 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 564 sp_256_mul_add_10(a+6, p256_mod, mu);
wolfSSL 16:8e0d178b1d1e 565 a[6+1] += a[6] >> 26;
wolfSSL 16:8e0d178b1d1e 566
wolfSSL 16:8e0d178b1d1e 567 mu = Q6_P_mpy_RR(a[7], mp) & 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 568 sp_256_mul_add_10(a+7, p256_mod, mu);
wolfSSL 16:8e0d178b1d1e 569 a[7+1] += a[7] >> 26;
wolfSSL 16:8e0d178b1d1e 570
wolfSSL 16:8e0d178b1d1e 571 mu = Q6_P_mpy_RR(a[8], mp) & 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 572 sp_256_mul_add_10(a+8, p256_mod, mu);
wolfSSL 16:8e0d178b1d1e 573 a[8+1] += a[8] >> 26;
wolfSSL 16:8e0d178b1d1e 574
wolfSSL 16:8e0d178b1d1e 575 mu = Q6_P_mpy_RR(a[9], mp) & 0x3fffffL;
wolfSSL 16:8e0d178b1d1e 576 sp_256_mul_add_10(a+9, p256_mod, mu);
wolfSSL 16:8e0d178b1d1e 577 a[9+1] += a[9] >> 26;
wolfSSL 16:8e0d178b1d1e 578 a[9] &= 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 579 }
wolfSSL 16:8e0d178b1d1e 580
wolfSSL 16:8e0d178b1d1e 581
wolfSSL 16:8e0d178b1d1e 582 sp_256_mont_shift_10(a, a);
wolfSSL 16:8e0d178b1d1e 583 sp_256_cond_sub_10(a, a, m, 0 - (((a[9] >> 22) > 0) ?
wolfSSL 16:8e0d178b1d1e 584 (sp_digit)1 : (sp_digit)0));
wolfSSL 16:8e0d178b1d1e 585 sp_256_norm_10(a);
wolfSSL 16:8e0d178b1d1e 586 }
wolfSSL 16:8e0d178b1d1e 587
wolfSSL 16:8e0d178b1d1e 588 /* Multiply a and b into r. (r = a * b)
wolfSSL 16:8e0d178b1d1e 589 *
wolfSSL 16:8e0d178b1d1e 590 * r A single precision integer.
wolfSSL 16:8e0d178b1d1e 591 * a A single precision integer.
wolfSSL 16:8e0d178b1d1e 592 * b A single precision integer.
wolfSSL 16:8e0d178b1d1e 593 */
wolfSSL 16:8e0d178b1d1e 594 SP_NOINLINE static void sp_256_mul_10(sp_digit* r, const sp_digit* a,
wolfSSL 16:8e0d178b1d1e 595 const sp_digit* b)
wolfSSL 16:8e0d178b1d1e 596 {
wolfSSL 16:8e0d178b1d1e 597 #if 1
wolfSSL 16:8e0d178b1d1e 598 int64_t t0 = Q6_P_mpy_RR(a[0], b[0]);
wolfSSL 16:8e0d178b1d1e 599 int64_t t1 = Q6_P_mpy_RR(a[0], b[1])
wolfSSL 16:8e0d178b1d1e 600 + Q6_P_mpy_RR(a[1], b[0]);
wolfSSL 16:8e0d178b1d1e 601 int64_t t2 = Q6_P_mpy_RR(a[0], b[2])
wolfSSL 16:8e0d178b1d1e 602 + Q6_P_mpy_RR(a[1], b[1])
wolfSSL 16:8e0d178b1d1e 603 + Q6_P_mpy_RR(a[2], b[0]);
wolfSSL 16:8e0d178b1d1e 604 int64_t t3 = Q6_P_mpy_RR(a[0], b[3])
wolfSSL 16:8e0d178b1d1e 605 + Q6_P_mpy_RR(a[1], b[2])
wolfSSL 16:8e0d178b1d1e 606 + Q6_P_mpy_RR(a[2], b[1])
wolfSSL 16:8e0d178b1d1e 607 + Q6_P_mpy_RR(a[3], b[0]);
wolfSSL 16:8e0d178b1d1e 608 int64_t t4 = Q6_P_mpy_RR(a[0], b[4])
wolfSSL 16:8e0d178b1d1e 609 + Q6_P_mpy_RR(a[1], b[3])
wolfSSL 16:8e0d178b1d1e 610 + Q6_P_mpy_RR(a[2], b[2])
wolfSSL 16:8e0d178b1d1e 611 + Q6_P_mpy_RR(a[3], b[1])
wolfSSL 16:8e0d178b1d1e 612 + Q6_P_mpy_RR(a[4], b[0]);
wolfSSL 16:8e0d178b1d1e 613 int64_t t5 = Q6_P_mpy_RR(a[0], b[5])
wolfSSL 16:8e0d178b1d1e 614 + Q6_P_mpy_RR(a[1], b[4])
wolfSSL 16:8e0d178b1d1e 615 + Q6_P_mpy_RR(a[2], b[3])
wolfSSL 16:8e0d178b1d1e 616 + Q6_P_mpy_RR(a[3], b[2])
wolfSSL 16:8e0d178b1d1e 617 + Q6_P_mpy_RR(a[4], b[1])
wolfSSL 16:8e0d178b1d1e 618 + Q6_P_mpy_RR(a[5], b[0]);
wolfSSL 16:8e0d178b1d1e 619 int64_t t6 = Q6_P_mpy_RR(a[0], b[6])
wolfSSL 16:8e0d178b1d1e 620 + Q6_P_mpy_RR(a[1], b[5])
wolfSSL 16:8e0d178b1d1e 621 + Q6_P_mpy_RR(a[2], b[4])
wolfSSL 16:8e0d178b1d1e 622 + Q6_P_mpy_RR(a[3], b[3])
wolfSSL 16:8e0d178b1d1e 623 + Q6_P_mpy_RR(a[4], b[2])
wolfSSL 16:8e0d178b1d1e 624 + Q6_P_mpy_RR(a[5], b[1])
wolfSSL 16:8e0d178b1d1e 625 + Q6_P_mpy_RR(a[6], b[0]);
wolfSSL 16:8e0d178b1d1e 626 int64_t t7 = Q6_P_mpy_RR(a[0], b[7])
wolfSSL 16:8e0d178b1d1e 627 + Q6_P_mpy_RR(a[1], b[6])
wolfSSL 16:8e0d178b1d1e 628 + Q6_P_mpy_RR(a[2], b[5])
wolfSSL 16:8e0d178b1d1e 629 + Q6_P_mpy_RR(a[3], b[4])
wolfSSL 16:8e0d178b1d1e 630 + Q6_P_mpy_RR(a[4], b[3])
wolfSSL 16:8e0d178b1d1e 631 + Q6_P_mpy_RR(a[5], b[2])
wolfSSL 16:8e0d178b1d1e 632 + Q6_P_mpy_RR(a[6], b[1])
wolfSSL 16:8e0d178b1d1e 633 + Q6_P_mpy_RR(a[7], b[0]);
wolfSSL 16:8e0d178b1d1e 634 int64_t t8 = Q6_P_mpy_RR(a[0], b[8])
wolfSSL 16:8e0d178b1d1e 635 + Q6_P_mpy_RR(a[1], b[7])
wolfSSL 16:8e0d178b1d1e 636 + Q6_P_mpy_RR(a[2], b[6])
wolfSSL 16:8e0d178b1d1e 637 + Q6_P_mpy_RR(a[3], b[5])
wolfSSL 16:8e0d178b1d1e 638 + Q6_P_mpy_RR(a[4], b[4])
wolfSSL 16:8e0d178b1d1e 639 + Q6_P_mpy_RR(a[5], b[3])
wolfSSL 16:8e0d178b1d1e 640 + Q6_P_mpy_RR(a[6], b[2])
wolfSSL 16:8e0d178b1d1e 641 + Q6_P_mpy_RR(a[7], b[1])
wolfSSL 16:8e0d178b1d1e 642 + Q6_P_mpy_RR(a[8], b[0]);
wolfSSL 16:8e0d178b1d1e 643 int64_t t9 = Q6_P_mpy_RR(a[0], b[9])
wolfSSL 16:8e0d178b1d1e 644 + Q6_P_mpy_RR(a[1], b[8])
wolfSSL 16:8e0d178b1d1e 645 + Q6_P_mpy_RR(a[2], b[7])
wolfSSL 16:8e0d178b1d1e 646 + Q6_P_mpy_RR(a[3], b[6])
wolfSSL 16:8e0d178b1d1e 647 + Q6_P_mpy_RR(a[4], b[5])
wolfSSL 16:8e0d178b1d1e 648 + Q6_P_mpy_RR(a[5], b[4])
wolfSSL 16:8e0d178b1d1e 649 + Q6_P_mpy_RR(a[6], b[3])
wolfSSL 16:8e0d178b1d1e 650 + Q6_P_mpy_RR(a[7], b[2])
wolfSSL 16:8e0d178b1d1e 651 + Q6_P_mpy_RR(a[8], b[1])
wolfSSL 16:8e0d178b1d1e 652 + Q6_P_mpy_RR(a[9], b[0]);
wolfSSL 16:8e0d178b1d1e 653 int64_t t10 = Q6_P_mpy_RR(a[1], b[9])
wolfSSL 16:8e0d178b1d1e 654 + Q6_P_mpy_RR(a[2], b[8])
wolfSSL 16:8e0d178b1d1e 655 + Q6_P_mpy_RR(a[3], b[7])
wolfSSL 16:8e0d178b1d1e 656 + Q6_P_mpy_RR(a[4], b[6])
wolfSSL 16:8e0d178b1d1e 657 + Q6_P_mpy_RR(a[5], b[5])
wolfSSL 16:8e0d178b1d1e 658 + Q6_P_mpy_RR(a[6], b[4])
wolfSSL 16:8e0d178b1d1e 659 + Q6_P_mpy_RR(a[7], b[3])
wolfSSL 16:8e0d178b1d1e 660 + Q6_P_mpy_RR(a[8], b[2])
wolfSSL 16:8e0d178b1d1e 661 + Q6_P_mpy_RR(a[9], b[1]);
wolfSSL 16:8e0d178b1d1e 662 int64_t t11 = Q6_P_mpy_RR(a[2], b[9])
wolfSSL 16:8e0d178b1d1e 663 + Q6_P_mpy_RR(a[3], b[8])
wolfSSL 16:8e0d178b1d1e 664 + Q6_P_mpy_RR(a[4], b[7])
wolfSSL 16:8e0d178b1d1e 665 + Q6_P_mpy_RR(a[5], b[6])
wolfSSL 16:8e0d178b1d1e 666 + Q6_P_mpy_RR(a[6], b[5])
wolfSSL 16:8e0d178b1d1e 667 + Q6_P_mpy_RR(a[7], b[4])
wolfSSL 16:8e0d178b1d1e 668 + Q6_P_mpy_RR(a[8], b[3])
wolfSSL 16:8e0d178b1d1e 669 + Q6_P_mpy_RR(a[9], b[2]);
wolfSSL 16:8e0d178b1d1e 670 int64_t t12 = Q6_P_mpy_RR(a[3], b[9])
wolfSSL 16:8e0d178b1d1e 671 + Q6_P_mpy_RR(a[4], b[8])
wolfSSL 16:8e0d178b1d1e 672 + Q6_P_mpy_RR(a[5], b[7])
wolfSSL 16:8e0d178b1d1e 673 + Q6_P_mpy_RR(a[6], b[6])
wolfSSL 16:8e0d178b1d1e 674 + Q6_P_mpy_RR(a[7], b[5])
wolfSSL 16:8e0d178b1d1e 675 + Q6_P_mpy_RR(a[8], b[4])
wolfSSL 16:8e0d178b1d1e 676 + Q6_P_mpy_RR(a[9], b[3]);
wolfSSL 16:8e0d178b1d1e 677 int64_t t13 = Q6_P_mpy_RR(a[4], b[9])
wolfSSL 16:8e0d178b1d1e 678 + Q6_P_mpy_RR(a[5], b[8])
wolfSSL 16:8e0d178b1d1e 679 + Q6_P_mpy_RR(a[6], b[7])
wolfSSL 16:8e0d178b1d1e 680 + Q6_P_mpy_RR(a[7], b[6])
wolfSSL 16:8e0d178b1d1e 681 + Q6_P_mpy_RR(a[8], b[5])
wolfSSL 16:8e0d178b1d1e 682 + Q6_P_mpy_RR(a[9], b[4]);
wolfSSL 16:8e0d178b1d1e 683 int64_t t14 = Q6_P_mpy_RR(a[5], b[9])
wolfSSL 16:8e0d178b1d1e 684 + Q6_P_mpy_RR(a[6], b[8])
wolfSSL 16:8e0d178b1d1e 685 + Q6_P_mpy_RR(a[7], b[7])
wolfSSL 16:8e0d178b1d1e 686 + Q6_P_mpy_RR(a[8], b[6])
wolfSSL 16:8e0d178b1d1e 687 + Q6_P_mpy_RR(a[9], b[5]);
wolfSSL 16:8e0d178b1d1e 688 int64_t t15 = Q6_P_mpy_RR(a[6], b[9])
wolfSSL 16:8e0d178b1d1e 689 + Q6_P_mpy_RR(a[7], b[8])
wolfSSL 16:8e0d178b1d1e 690 + Q6_P_mpy_RR(a[8], b[7])
wolfSSL 16:8e0d178b1d1e 691 + Q6_P_mpy_RR(a[9], b[6]);
wolfSSL 16:8e0d178b1d1e 692 int64_t t16 = Q6_P_mpy_RR(a[7], b[9])
wolfSSL 16:8e0d178b1d1e 693 + Q6_P_mpy_RR(a[8], b[8])
wolfSSL 16:8e0d178b1d1e 694 + Q6_P_mpy_RR(a[9], b[7]);
wolfSSL 16:8e0d178b1d1e 695 int64_t t17 = Q6_P_mpy_RR(a[8], b[9])
wolfSSL 16:8e0d178b1d1e 696 + Q6_P_mpy_RR(a[9], b[8]);
wolfSSL 16:8e0d178b1d1e 697 int64_t t18 = Q6_P_mpy_RR(a[9], b[9]);
wolfSSL 16:8e0d178b1d1e 698
wolfSSL 16:8e0d178b1d1e 699
wolfSSL 16:8e0d178b1d1e 700 t1 += t0 >> 26; r[ 0] = t0 & 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 701 t2 += t1 >> 26; r[ 1] = t1 & 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 702 t3 += t2 >> 26; r[ 2] = t2 & 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 703 t4 += t3 >> 26; r[ 3] = t3 & 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 704 t5 += t4 >> 26; r[ 4] = t4 & 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 705 t6 += t5 >> 26; r[ 5] = t5 & 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 706 t7 += t6 >> 26; r[ 6] = t6 & 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 707 t8 += t7 >> 26; r[ 7] = t7 & 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 708 t9 += t8 >> 26; r[ 8] = t8 & 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 709 t10 += t9 >> 26; r[ 9] = t9 & 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 710 t11 += t10 >> 26; r[10] = t10 & 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 711 t12 += t11 >> 26; r[11] = t11 & 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 712 t13 += t12 >> 26; r[12] = t12 & 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 713 t14 += t13 >> 26; r[13] = t13 & 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 714 t15 += t14 >> 26; r[14] = t14 & 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 715 t16 += t15 >> 26; r[15] = t15 & 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 716 t17 += t16 >> 26; r[16] = t16 & 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 717 t18 += t17 >> 26; r[17] = t17 & 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 718 r[19] = (sp_digit)(t18 >> 26);
wolfSSL 16:8e0d178b1d1e 719 r[18] = t18 & 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 720 #endif
wolfSSL 16:8e0d178b1d1e 721 #if 0
wolfSSL 16:8e0d178b1d1e 722 /* Testing speeds with using HVX_Vectors */
wolfSSL 16:8e0d178b1d1e 723 {
wolfSSL 16:8e0d178b1d1e 724 int64_t t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15, t16, t17, t18;
wolfSSL 16:8e0d178b1d1e 725 HVX_Vector av, splat;
wolfSSL 16:8e0d178b1d1e 726 HVX_Vector vlow, vhi;
wolfSSL 16:8e0d178b1d1e 727
wolfSSL 16:8e0d178b1d1e 728 av = Q6_V_vzero();
wolfSSL 16:8e0d178b1d1e 729 vlow = Q6_V_vzero();
wolfSSL 16:8e0d178b1d1e 730 vhi = Q6_V_vzero();
wolfSSL 16:8e0d178b1d1e 731
wolfSSL 16:8e0d178b1d1e 732 XMEMCPY((byte*)&av, (byte*)a, 40);
wolfSSL 16:8e0d178b1d1e 733
wolfSSL 16:8e0d178b1d1e 734 splat = Q6_V_vsplat_R(b[0]);
wolfSSL 16:8e0d178b1d1e 735 vlow = Q6_Vw_vmpyieo_VhVh(av, splat);
wolfSSL 16:8e0d178b1d1e 736 vlow = Q6_Vw_vmpyieacc_VwVwVuh(vlow, av, splat);
wolfSSL 16:8e0d178b1d1e 737
wolfSSL 16:8e0d178b1d1e 738 vhi = Q6_Vw_vmpye_VwVuh(av, splat);
wolfSSL 16:8e0d178b1d1e 739 vhi = Q6_Vw_vmpyoacc_VwVwVh_s1_sat_shift(vhi, av, splat);
wolfSSL 16:8e0d178b1d1e 740 unsigned int* loi = (unsigned int*)&vlow;
wolfSSL 16:8e0d178b1d1e 741 int* hii = (int*)&vhi;
wolfSSL 16:8e0d178b1d1e 742
wolfSSL 16:8e0d178b1d1e 743 /* a[0] * b[0] */
wolfSSL 16:8e0d178b1d1e 744 t0 = loi[0] | ((int64_t)hii[0] << 31);
wolfSSL 16:8e0d178b1d1e 745
wolfSSL 16:8e0d178b1d1e 746 /* a[1] * b[0] */
wolfSSL 16:8e0d178b1d1e 747 t1 = loi[1] | ((int64_t)hii[1] << 31);
wolfSSL 16:8e0d178b1d1e 748
wolfSSL 16:8e0d178b1d1e 749 /* a[2] * b[0] */
wolfSSL 16:8e0d178b1d1e 750 t2 = loi[2] | ((int64_t)hii[2] << 31);
wolfSSL 16:8e0d178b1d1e 751
wolfSSL 16:8e0d178b1d1e 752 /* a[3] * b[0] */
wolfSSL 16:8e0d178b1d1e 753 t3 = loi[3] | ((int64_t)hii[3] << 31);
wolfSSL 16:8e0d178b1d1e 754
wolfSSL 16:8e0d178b1d1e 755 /* a[4] * b[0] */
wolfSSL 16:8e0d178b1d1e 756 t4 = loi[4] | ((int64_t)hii[4] << 31);
wolfSSL 16:8e0d178b1d1e 757
wolfSSL 16:8e0d178b1d1e 758 /* a[5] * b[0] */
wolfSSL 16:8e0d178b1d1e 759 t5 = loi[5] | ((int64_t)hii[5] << 31);
wolfSSL 16:8e0d178b1d1e 760
wolfSSL 16:8e0d178b1d1e 761 /* a[6] * b[0] */
wolfSSL 16:8e0d178b1d1e 762 t6 = loi[6] | ((int64_t)hii[6] << 31);
wolfSSL 16:8e0d178b1d1e 763
wolfSSL 16:8e0d178b1d1e 764 /* a[7] * b[0] */
wolfSSL 16:8e0d178b1d1e 765 t7 = loi[7] | ((int64_t)hii[7] << 31);
wolfSSL 16:8e0d178b1d1e 766
wolfSSL 16:8e0d178b1d1e 767 /* a[8] * b[0] */
wolfSSL 16:8e0d178b1d1e 768 t8 = loi[8] | ((int64_t)hii[8] << 31);
wolfSSL 16:8e0d178b1d1e 769
wolfSSL 16:8e0d178b1d1e 770 /* a[9] * b[0] */
wolfSSL 16:8e0d178b1d1e 771 t9 = loi[9] | ((int64_t)hii[9] << 31);
wolfSSL 16:8e0d178b1d1e 772
wolfSSL 16:8e0d178b1d1e 773 /* a[*] * b[1] */
wolfSSL 16:8e0d178b1d1e 774 splat = Q6_V_vsplat_R(b[1]);
wolfSSL 16:8e0d178b1d1e 775 vlow = Q6_Vw_vmpyieo_VhVh(av, splat);
wolfSSL 16:8e0d178b1d1e 776 vlow = Q6_Vw_vmpyieacc_VwVwVuh(vlow, av, splat);
wolfSSL 16:8e0d178b1d1e 777 vhi = Q6_Vw_vmpye_VwVuh(av, splat);
wolfSSL 16:8e0d178b1d1e 778 vhi = Q6_Vw_vmpyoacc_VwVwVh_s1_sat_shift(vhi, av, splat);
wolfSSL 16:8e0d178b1d1e 779 loi = (unsigned int*)&vlow;
wolfSSL 16:8e0d178b1d1e 780 hii = (int*)&vhi;
wolfSSL 16:8e0d178b1d1e 781
wolfSSL 16:8e0d178b1d1e 782 /* a[0] * b[1] */
wolfSSL 16:8e0d178b1d1e 783 t1 += (loi[0] | ((int64_t)hii[0] << 31));
wolfSSL 16:8e0d178b1d1e 784
wolfSSL 16:8e0d178b1d1e 785 /* a[1] * b[1] */
wolfSSL 16:8e0d178b1d1e 786 t2 += (loi[1] | ((int64_t)hii[1] << 31));
wolfSSL 16:8e0d178b1d1e 787
wolfSSL 16:8e0d178b1d1e 788 /* a[2] * b[1] */
wolfSSL 16:8e0d178b1d1e 789 t3 += (loi[2] | ((int64_t)hii[2] << 31));
wolfSSL 16:8e0d178b1d1e 790
wolfSSL 16:8e0d178b1d1e 791 /* a[3] * b[1] */
wolfSSL 16:8e0d178b1d1e 792 t4 += (loi[3] | ((int64_t)hii[3] << 31));
wolfSSL 16:8e0d178b1d1e 793
wolfSSL 16:8e0d178b1d1e 794 /* a[4] * b[1] */
wolfSSL 16:8e0d178b1d1e 795 t5 += (loi[4] | ((int64_t)hii[4] << 31));
wolfSSL 16:8e0d178b1d1e 796
wolfSSL 16:8e0d178b1d1e 797 /* a[5] * b[1] */
wolfSSL 16:8e0d178b1d1e 798 t6 += (loi[5] | ((int64_t)hii[5] << 31));
wolfSSL 16:8e0d178b1d1e 799
wolfSSL 16:8e0d178b1d1e 800 /* a[6] * b[1] */
wolfSSL 16:8e0d178b1d1e 801 t7 += (loi[6] | ((int64_t)hii[6] << 31));
wolfSSL 16:8e0d178b1d1e 802
wolfSSL 16:8e0d178b1d1e 803 /* a[7] * b[1] */
wolfSSL 16:8e0d178b1d1e 804 t8 += (loi[7] | ((int64_t)hii[7] << 31));
wolfSSL 16:8e0d178b1d1e 805
wolfSSL 16:8e0d178b1d1e 806 /* a[8] * b[1] */
wolfSSL 16:8e0d178b1d1e 807 t9 += (loi[8] | ((int64_t)hii[8] << 31));
wolfSSL 16:8e0d178b1d1e 808
wolfSSL 16:8e0d178b1d1e 809 /* a[9] * b[1] */
wolfSSL 16:8e0d178b1d1e 810 t10 = (loi[9] | ((int64_t)hii[9] << 31));
wolfSSL 16:8e0d178b1d1e 811
wolfSSL 16:8e0d178b1d1e 812 /* a[*] * b[2] */
wolfSSL 16:8e0d178b1d1e 813 splat = Q6_V_vsplat_R(b[2]);
wolfSSL 16:8e0d178b1d1e 814 vlow = Q6_Vw_vmpyieo_VhVh(av, splat);
wolfSSL 16:8e0d178b1d1e 815 vlow = Q6_Vw_vmpyieacc_VwVwVuh(vlow, av, splat);
wolfSSL 16:8e0d178b1d1e 816 vhi = Q6_Vw_vmpye_VwVuh(av, splat);
wolfSSL 16:8e0d178b1d1e 817 vhi = Q6_Vw_vmpyoacc_VwVwVh_s1_sat_shift(vhi, av, splat);
wolfSSL 16:8e0d178b1d1e 818 loi = (unsigned int*)&vlow;
wolfSSL 16:8e0d178b1d1e 819 hii = (int*)&vhi;
wolfSSL 16:8e0d178b1d1e 820
wolfSSL 16:8e0d178b1d1e 821
wolfSSL 16:8e0d178b1d1e 822 /* a[0] * b[2] */
wolfSSL 16:8e0d178b1d1e 823 t2 += (loi[0] | ((int64_t)hii[0] << 31));
wolfSSL 16:8e0d178b1d1e 824
wolfSSL 16:8e0d178b1d1e 825 /* a[1] * b[2] */
wolfSSL 16:8e0d178b1d1e 826 t3 += (loi[1] | ((int64_t)hii[1] << 31));
wolfSSL 16:8e0d178b1d1e 827
wolfSSL 16:8e0d178b1d1e 828 /* a[2] * b[2] */
wolfSSL 16:8e0d178b1d1e 829 t4 += (loi[2] | ((int64_t)hii[2] << 31));
wolfSSL 16:8e0d178b1d1e 830
wolfSSL 16:8e0d178b1d1e 831 /* a[3] * b[2] */
wolfSSL 16:8e0d178b1d1e 832 t5 += (loi[3] | ((int64_t)hii[3] << 31));
wolfSSL 16:8e0d178b1d1e 833
wolfSSL 16:8e0d178b1d1e 834 /* a[4] * b[2] */
wolfSSL 16:8e0d178b1d1e 835 t6 += (loi[4] | ((int64_t)hii[4] << 31));
wolfSSL 16:8e0d178b1d1e 836
wolfSSL 16:8e0d178b1d1e 837 /* a[5] * b[2] */
wolfSSL 16:8e0d178b1d1e 838 t7 += (loi[5] | ((int64_t)hii[5] << 31));
wolfSSL 16:8e0d178b1d1e 839
wolfSSL 16:8e0d178b1d1e 840 /* a[6] * b[2] */
wolfSSL 16:8e0d178b1d1e 841 t8 += (loi[6] | ((int64_t)hii[6] << 31));
wolfSSL 16:8e0d178b1d1e 842
wolfSSL 16:8e0d178b1d1e 843 /* a[7] * b[2] */
wolfSSL 16:8e0d178b1d1e 844 t9 += (loi[7] | ((int64_t)hii[7] << 31));
wolfSSL 16:8e0d178b1d1e 845
wolfSSL 16:8e0d178b1d1e 846 /* a[8] * b[2] */
wolfSSL 16:8e0d178b1d1e 847 t10 += (loi[8] | ((int64_t)hii[8] << 31));
wolfSSL 16:8e0d178b1d1e 848
wolfSSL 16:8e0d178b1d1e 849 /* a[9] * b[2] */
wolfSSL 16:8e0d178b1d1e 850 t11 = (loi[9] | ((int64_t)hii[9] << 31));
wolfSSL 16:8e0d178b1d1e 851
wolfSSL 16:8e0d178b1d1e 852
wolfSSL 16:8e0d178b1d1e 853 /* a[*] * b[3] */
wolfSSL 16:8e0d178b1d1e 854 splat = Q6_V_vsplat_R(b[3]);
wolfSSL 16:8e0d178b1d1e 855 vlow = Q6_Vw_vmpyieo_VhVh(av, splat);
wolfSSL 16:8e0d178b1d1e 856 vlow = Q6_Vw_vmpyieacc_VwVwVuh(vlow, av, splat);
wolfSSL 16:8e0d178b1d1e 857 vhi = Q6_Vw_vmpye_VwVuh(av, splat);
wolfSSL 16:8e0d178b1d1e 858 vhi = Q6_Vw_vmpyoacc_VwVwVh_s1_sat_shift(vhi, av, splat);
wolfSSL 16:8e0d178b1d1e 859 loi = (unsigned int*)&vlow;
wolfSSL 16:8e0d178b1d1e 860 hii = (int*)&vhi;
wolfSSL 16:8e0d178b1d1e 861
wolfSSL 16:8e0d178b1d1e 862
wolfSSL 16:8e0d178b1d1e 863 /* a[0] * b[3] */
wolfSSL 16:8e0d178b1d1e 864 t3 += (loi[0] | ((int64_t)hii[0] << 31));
wolfSSL 16:8e0d178b1d1e 865
wolfSSL 16:8e0d178b1d1e 866 /* a[1] * b[3] */
wolfSSL 16:8e0d178b1d1e 867 t4 += (loi[1] | ((int64_t)hii[1] << 31));
wolfSSL 16:8e0d178b1d1e 868
wolfSSL 16:8e0d178b1d1e 869 /* a[2] * b[3] */
wolfSSL 16:8e0d178b1d1e 870 t5 += (loi[2] | ((int64_t)hii[2] << 31));
wolfSSL 16:8e0d178b1d1e 871
wolfSSL 16:8e0d178b1d1e 872 /* a[3] * b[3] */
wolfSSL 16:8e0d178b1d1e 873 t6 += (loi[3] | ((int64_t)hii[3] << 31));
wolfSSL 16:8e0d178b1d1e 874
wolfSSL 16:8e0d178b1d1e 875 /* a[4] * b[3] */
wolfSSL 16:8e0d178b1d1e 876 t7 += (loi[4] | ((int64_t)hii[4] << 31));
wolfSSL 16:8e0d178b1d1e 877
wolfSSL 16:8e0d178b1d1e 878 /* a[5] * b[3] */
wolfSSL 16:8e0d178b1d1e 879 t8 += (loi[5] | ((int64_t)hii[5] << 31));
wolfSSL 16:8e0d178b1d1e 880
wolfSSL 16:8e0d178b1d1e 881 /* a[6] * b[3] */
wolfSSL 16:8e0d178b1d1e 882 t9 += (loi[6] | ((int64_t)hii[6] << 31));
wolfSSL 16:8e0d178b1d1e 883
wolfSSL 16:8e0d178b1d1e 884 /* a[7] * b[3] */
wolfSSL 16:8e0d178b1d1e 885 t10 += (loi[7] | ((int64_t)hii[7] << 31));
wolfSSL 16:8e0d178b1d1e 886
wolfSSL 16:8e0d178b1d1e 887 /* a[8] * b[3] */
wolfSSL 16:8e0d178b1d1e 888 t11 += (loi[8] | ((int64_t)hii[8] << 31));
wolfSSL 16:8e0d178b1d1e 889
wolfSSL 16:8e0d178b1d1e 890 /* a[9] * b[3] */
wolfSSL 16:8e0d178b1d1e 891 t12 = (loi[9] | ((int64_t)hii[9] << 31));
wolfSSL 16:8e0d178b1d1e 892
wolfSSL 16:8e0d178b1d1e 893
wolfSSL 16:8e0d178b1d1e 894 /* a[*] * b[4] */
wolfSSL 16:8e0d178b1d1e 895 splat = Q6_V_vsplat_R(b[4]);
wolfSSL 16:8e0d178b1d1e 896 vlow = Q6_Vw_vmpyieo_VhVh(av, splat);
wolfSSL 16:8e0d178b1d1e 897 vlow = Q6_Vw_vmpyieacc_VwVwVuh(vlow, av, splat);
wolfSSL 16:8e0d178b1d1e 898 vhi = Q6_Vw_vmpye_VwVuh(av, splat);
wolfSSL 16:8e0d178b1d1e 899 vhi = Q6_Vw_vmpyoacc_VwVwVh_s1_sat_shift(vhi, av, splat);
wolfSSL 16:8e0d178b1d1e 900 loi = (unsigned int*)&vlow;
wolfSSL 16:8e0d178b1d1e 901 hii = (int*)&vhi;
wolfSSL 16:8e0d178b1d1e 902
wolfSSL 16:8e0d178b1d1e 903
wolfSSL 16:8e0d178b1d1e 904 /* a[0] * b[4] */
wolfSSL 16:8e0d178b1d1e 905 t4 += (loi[0] | ((int64_t)hii[0] << 31));
wolfSSL 16:8e0d178b1d1e 906
wolfSSL 16:8e0d178b1d1e 907 /* a[1] * b[4] */
wolfSSL 16:8e0d178b1d1e 908 t5 += (loi[1] | ((int64_t)hii[1] << 31));
wolfSSL 16:8e0d178b1d1e 909
wolfSSL 16:8e0d178b1d1e 910 /* a[2] * b[4] */
wolfSSL 16:8e0d178b1d1e 911 t6 += (loi[2] | ((int64_t)hii[2] << 31));
wolfSSL 16:8e0d178b1d1e 912
wolfSSL 16:8e0d178b1d1e 913 /* a[3] * b[4] */
wolfSSL 16:8e0d178b1d1e 914 t7 += (loi[3] | ((int64_t)hii[3] << 31));
wolfSSL 16:8e0d178b1d1e 915
wolfSSL 16:8e0d178b1d1e 916 /* a[4] * b[4] */
wolfSSL 16:8e0d178b1d1e 917 t8 += (loi[4] | ((int64_t)hii[4] << 31));
wolfSSL 16:8e0d178b1d1e 918
wolfSSL 16:8e0d178b1d1e 919 /* a[5] * b[4] */
wolfSSL 16:8e0d178b1d1e 920 t9 += (loi[5] | ((int64_t)hii[5] << 31));
wolfSSL 16:8e0d178b1d1e 921
wolfSSL 16:8e0d178b1d1e 922 /* a[6] * b[4] */
wolfSSL 16:8e0d178b1d1e 923 t10 += (loi[6] | ((int64_t)hii[6] << 31));
wolfSSL 16:8e0d178b1d1e 924
wolfSSL 16:8e0d178b1d1e 925 /* a[7] * b[4] */
wolfSSL 16:8e0d178b1d1e 926 t11 += (loi[7] | ((int64_t)hii[7] << 31));
wolfSSL 16:8e0d178b1d1e 927
wolfSSL 16:8e0d178b1d1e 928 /* a[8] * b[4] */
wolfSSL 16:8e0d178b1d1e 929 t12 += (loi[8] | ((int64_t)hii[8] << 31));
wolfSSL 16:8e0d178b1d1e 930
wolfSSL 16:8e0d178b1d1e 931 /* a[9] * b[4] */
wolfSSL 16:8e0d178b1d1e 932 t13 = (loi[9] | ((int64_t)hii[9] << 31));
wolfSSL 16:8e0d178b1d1e 933
wolfSSL 16:8e0d178b1d1e 934
wolfSSL 16:8e0d178b1d1e 935 /* a[*] * b[5] */
wolfSSL 16:8e0d178b1d1e 936 splat = Q6_V_vsplat_R(b[5]);
wolfSSL 16:8e0d178b1d1e 937 vlow = Q6_Vw_vmpyieo_VhVh(av, splat);
wolfSSL 16:8e0d178b1d1e 938 vlow = Q6_Vw_vmpyieacc_VwVwVuh(vlow, av, splat);
wolfSSL 16:8e0d178b1d1e 939 vhi = Q6_Vw_vmpye_VwVuh(av, splat);
wolfSSL 16:8e0d178b1d1e 940 vhi = Q6_Vw_vmpyoacc_VwVwVh_s1_sat_shift(vhi, av, splat);
wolfSSL 16:8e0d178b1d1e 941 loi = (unsigned int*)&vlow;
wolfSSL 16:8e0d178b1d1e 942 hii = (int*)&vhi;
wolfSSL 16:8e0d178b1d1e 943
wolfSSL 16:8e0d178b1d1e 944
wolfSSL 16:8e0d178b1d1e 945 /* a[0] * b[5] */
wolfSSL 16:8e0d178b1d1e 946 t5 += (loi[0] | ((int64_t)hii[0] << 31));
wolfSSL 16:8e0d178b1d1e 947
wolfSSL 16:8e0d178b1d1e 948 /* a[1] * b[5] */
wolfSSL 16:8e0d178b1d1e 949 t6 += (loi[1] | ((int64_t)hii[1] << 31));
wolfSSL 16:8e0d178b1d1e 950
wolfSSL 16:8e0d178b1d1e 951 /* a[2] * b[5] */
wolfSSL 16:8e0d178b1d1e 952 t7 += (loi[2] | ((int64_t)hii[2] << 31));
wolfSSL 16:8e0d178b1d1e 953
wolfSSL 16:8e0d178b1d1e 954 /* a[3] * b[5] */
wolfSSL 16:8e0d178b1d1e 955 t8 += (loi[3] | ((int64_t)hii[3] << 31));
wolfSSL 16:8e0d178b1d1e 956
wolfSSL 16:8e0d178b1d1e 957 /* a[4] * b[5] */
wolfSSL 16:8e0d178b1d1e 958 t9 += (loi[4] | ((int64_t)hii[4] << 31));
wolfSSL 16:8e0d178b1d1e 959
wolfSSL 16:8e0d178b1d1e 960 /* a[5] * b[5] */
wolfSSL 16:8e0d178b1d1e 961 t10 += (loi[5] | ((int64_t)hii[5] << 31));
wolfSSL 16:8e0d178b1d1e 962
wolfSSL 16:8e0d178b1d1e 963 /* a[6] * b[5] */
wolfSSL 16:8e0d178b1d1e 964 t11 += (loi[6] | ((int64_t)hii[6] << 31));
wolfSSL 16:8e0d178b1d1e 965
wolfSSL 16:8e0d178b1d1e 966 /* a[7] * b[5] */
wolfSSL 16:8e0d178b1d1e 967 t12 += (loi[7] | ((int64_t)hii[7] << 31));
wolfSSL 16:8e0d178b1d1e 968
wolfSSL 16:8e0d178b1d1e 969 /* a[8] * b[5] */
wolfSSL 16:8e0d178b1d1e 970 t13 += (loi[8] | ((int64_t)hii[8] << 31));
wolfSSL 16:8e0d178b1d1e 971
wolfSSL 16:8e0d178b1d1e 972 /* a[9] * b[5] */
wolfSSL 16:8e0d178b1d1e 973 t14 = (loi[9] | ((int64_t)hii[9] << 31));
wolfSSL 16:8e0d178b1d1e 974
wolfSSL 16:8e0d178b1d1e 975
wolfSSL 16:8e0d178b1d1e 976 /* a[*] * b[6] */
wolfSSL 16:8e0d178b1d1e 977 splat = Q6_V_vsplat_R(b[6]);
wolfSSL 16:8e0d178b1d1e 978 vlow = Q6_Vw_vmpyieo_VhVh(av, splat);
wolfSSL 16:8e0d178b1d1e 979 vlow = Q6_Vw_vmpyieacc_VwVwVuh(vlow, av, splat);
wolfSSL 16:8e0d178b1d1e 980 vhi = Q6_Vw_vmpye_VwVuh(av, splat);
wolfSSL 16:8e0d178b1d1e 981 vhi = Q6_Vw_vmpyoacc_VwVwVh_s1_sat_shift(vhi, av, splat);
wolfSSL 16:8e0d178b1d1e 982 loi = (unsigned int*)&vlow;
wolfSSL 16:8e0d178b1d1e 983 hii = (int*)&vhi;
wolfSSL 16:8e0d178b1d1e 984
wolfSSL 16:8e0d178b1d1e 985
wolfSSL 16:8e0d178b1d1e 986 /* a[0] * b[6] */
wolfSSL 16:8e0d178b1d1e 987 t6 += (loi[0] | ((int64_t)hii[0] << 31));
wolfSSL 16:8e0d178b1d1e 988
wolfSSL 16:8e0d178b1d1e 989 /* a[1] * b[6] */
wolfSSL 16:8e0d178b1d1e 990 t7 += (loi[1] | ((int64_t)hii[1] << 31));
wolfSSL 16:8e0d178b1d1e 991
wolfSSL 16:8e0d178b1d1e 992 /* a[2] * b[6] */
wolfSSL 16:8e0d178b1d1e 993 t8 += (loi[2] | ((int64_t)hii[2] << 31));
wolfSSL 16:8e0d178b1d1e 994
wolfSSL 16:8e0d178b1d1e 995 /* a[3] * b[6] */
wolfSSL 16:8e0d178b1d1e 996 t9 += (loi[3] | ((int64_t)hii[3] << 31));
wolfSSL 16:8e0d178b1d1e 997
wolfSSL 16:8e0d178b1d1e 998 /* a[4] * b[6] */
wolfSSL 16:8e0d178b1d1e 999 t10 += (loi[4] | ((int64_t)hii[4] << 31));
wolfSSL 16:8e0d178b1d1e 1000
wolfSSL 16:8e0d178b1d1e 1001 /* a[5] * b[6] */
wolfSSL 16:8e0d178b1d1e 1002 t11 += (loi[5] | ((int64_t)hii[5] << 31));
wolfSSL 16:8e0d178b1d1e 1003
wolfSSL 16:8e0d178b1d1e 1004 /* a[6] * b[6] */
wolfSSL 16:8e0d178b1d1e 1005 t12 += (loi[6] | ((int64_t)hii[6] << 31));
wolfSSL 16:8e0d178b1d1e 1006
wolfSSL 16:8e0d178b1d1e 1007 /* a[7] * b[6] */
wolfSSL 16:8e0d178b1d1e 1008 t13 += (loi[7] | ((int64_t)hii[7] << 31));
wolfSSL 16:8e0d178b1d1e 1009
wolfSSL 16:8e0d178b1d1e 1010 /* a[8] * b[6] */
wolfSSL 16:8e0d178b1d1e 1011 t14 += (loi[8] | ((int64_t)hii[8] << 31));
wolfSSL 16:8e0d178b1d1e 1012
wolfSSL 16:8e0d178b1d1e 1013 /* a[9] * b[6] */
wolfSSL 16:8e0d178b1d1e 1014 t15 = (loi[9] | ((int64_t)hii[9] << 31));
wolfSSL 16:8e0d178b1d1e 1015
wolfSSL 16:8e0d178b1d1e 1016
wolfSSL 16:8e0d178b1d1e 1017
wolfSSL 16:8e0d178b1d1e 1018 /* a[*] * b[7] */
wolfSSL 16:8e0d178b1d1e 1019 splat = Q6_V_vsplat_R(b[7]);
wolfSSL 16:8e0d178b1d1e 1020 vlow = Q6_Vw_vmpyieo_VhVh(av, splat);
wolfSSL 16:8e0d178b1d1e 1021 vlow = Q6_Vw_vmpyieacc_VwVwVuh(vlow, av, splat);
wolfSSL 16:8e0d178b1d1e 1022 vhi = Q6_Vw_vmpye_VwVuh(av, splat);
wolfSSL 16:8e0d178b1d1e 1023 vhi = Q6_Vw_vmpyoacc_VwVwVh_s1_sat_shift(vhi, av, splat);
wolfSSL 16:8e0d178b1d1e 1024 loi = (unsigned int*)&vlow;
wolfSSL 16:8e0d178b1d1e 1025 hii = (int*)&vhi;
wolfSSL 16:8e0d178b1d1e 1026
wolfSSL 16:8e0d178b1d1e 1027
wolfSSL 16:8e0d178b1d1e 1028 /* a[0] * b[7] */
wolfSSL 16:8e0d178b1d1e 1029 t7 += (loi[0] | ((int64_t)hii[0] << 31));
wolfSSL 16:8e0d178b1d1e 1030
wolfSSL 16:8e0d178b1d1e 1031 /* a[1] * b[7] */
wolfSSL 16:8e0d178b1d1e 1032 t8 += (loi[1] | ((int64_t)hii[1] << 31));
wolfSSL 16:8e0d178b1d1e 1033
wolfSSL 16:8e0d178b1d1e 1034 /* a[2] * b[7] */
wolfSSL 16:8e0d178b1d1e 1035 t9 += (loi[2] | ((int64_t)hii[2] << 31));
wolfSSL 16:8e0d178b1d1e 1036
wolfSSL 16:8e0d178b1d1e 1037 /* a[3] * b[7] */
wolfSSL 16:8e0d178b1d1e 1038 t10 += (loi[3] | ((int64_t)hii[3] << 31));
wolfSSL 16:8e0d178b1d1e 1039
wolfSSL 16:8e0d178b1d1e 1040 /* a[4] * b[7] */
wolfSSL 16:8e0d178b1d1e 1041 t11 += (loi[4] | ((int64_t)hii[4] << 31));
wolfSSL 16:8e0d178b1d1e 1042
wolfSSL 16:8e0d178b1d1e 1043 /* a[5] * b[7] */
wolfSSL 16:8e0d178b1d1e 1044 t12 += (loi[5] | ((int64_t)hii[5] << 31));
wolfSSL 16:8e0d178b1d1e 1045
wolfSSL 16:8e0d178b1d1e 1046 /* a[6] * b[7] */
wolfSSL 16:8e0d178b1d1e 1047 t13 += (loi[6] | ((int64_t)hii[6] << 31));
wolfSSL 16:8e0d178b1d1e 1048
wolfSSL 16:8e0d178b1d1e 1049 /* a[7] * b[7] */
wolfSSL 16:8e0d178b1d1e 1050 t14 += (loi[7] | ((int64_t)hii[7] << 31));
wolfSSL 16:8e0d178b1d1e 1051
wolfSSL 16:8e0d178b1d1e 1052 /* a[8] * b[7] */
wolfSSL 16:8e0d178b1d1e 1053 t15 += (loi[8] | ((int64_t)hii[8] << 31));
wolfSSL 16:8e0d178b1d1e 1054
wolfSSL 16:8e0d178b1d1e 1055 /* a[9] * b[7] */
wolfSSL 16:8e0d178b1d1e 1056 t16 = (loi[9] | ((int64_t)hii[9] << 31));
wolfSSL 16:8e0d178b1d1e 1057
wolfSSL 16:8e0d178b1d1e 1058
wolfSSL 16:8e0d178b1d1e 1059 /* a[*] * b[8] */
wolfSSL 16:8e0d178b1d1e 1060 splat = Q6_V_vsplat_R(b[8]);
wolfSSL 16:8e0d178b1d1e 1061 vlow = Q6_Vw_vmpyieo_VhVh(av, splat);
wolfSSL 16:8e0d178b1d1e 1062 vlow = Q6_Vw_vmpyieacc_VwVwVuh(vlow, av, splat);
wolfSSL 16:8e0d178b1d1e 1063 vhi = Q6_Vw_vmpye_VwVuh(av, splat);
wolfSSL 16:8e0d178b1d1e 1064 vhi = Q6_Vw_vmpyoacc_VwVwVh_s1_sat_shift(vhi, av, splat);
wolfSSL 16:8e0d178b1d1e 1065 loi = (unsigned int*)&vlow;
wolfSSL 16:8e0d178b1d1e 1066 hii = (int*)&vhi;
wolfSSL 16:8e0d178b1d1e 1067
wolfSSL 16:8e0d178b1d1e 1068
wolfSSL 16:8e0d178b1d1e 1069 /* a[0] * b[8] */
wolfSSL 16:8e0d178b1d1e 1070 t8 += (loi[0] | ((int64_t)hii[0] << 31));
wolfSSL 16:8e0d178b1d1e 1071
wolfSSL 16:8e0d178b1d1e 1072 /* a[1] * b[8] */
wolfSSL 16:8e0d178b1d1e 1073 t9 += (loi[1] | ((int64_t)hii[1] << 31));
wolfSSL 16:8e0d178b1d1e 1074
wolfSSL 16:8e0d178b1d1e 1075 /* a[2] * b[8] */
wolfSSL 16:8e0d178b1d1e 1076 t10 += (loi[2] | ((int64_t)hii[2] << 31));
wolfSSL 16:8e0d178b1d1e 1077
wolfSSL 16:8e0d178b1d1e 1078 /* a[3] * b[8] */
wolfSSL 16:8e0d178b1d1e 1079 t11 += (loi[3] | ((int64_t)hii[3] << 31));
wolfSSL 16:8e0d178b1d1e 1080
wolfSSL 16:8e0d178b1d1e 1081 /* a[4] * b[8] */
wolfSSL 16:8e0d178b1d1e 1082 t12 += (loi[4] | ((int64_t)hii[4] << 31));
wolfSSL 16:8e0d178b1d1e 1083
wolfSSL 16:8e0d178b1d1e 1084 /* a[5] * b[8] */
wolfSSL 16:8e0d178b1d1e 1085 t13 += (loi[5] | ((int64_t)hii[5] << 31));
wolfSSL 16:8e0d178b1d1e 1086
wolfSSL 16:8e0d178b1d1e 1087 /* a[6] * b[8] */
wolfSSL 16:8e0d178b1d1e 1088 t14 += (loi[6] | ((int64_t)hii[6] << 31));
wolfSSL 16:8e0d178b1d1e 1089
wolfSSL 16:8e0d178b1d1e 1090 /* a[7] * b[8] */
wolfSSL 16:8e0d178b1d1e 1091 t15 += (loi[7] | ((int64_t)hii[7] << 31));
wolfSSL 16:8e0d178b1d1e 1092
wolfSSL 16:8e0d178b1d1e 1093 /* a[8] * b[8] */
wolfSSL 16:8e0d178b1d1e 1094 t16 += (loi[8] | ((int64_t)hii[8] << 31));
wolfSSL 16:8e0d178b1d1e 1095
wolfSSL 16:8e0d178b1d1e 1096 /* a[9] * b[8] */
wolfSSL 16:8e0d178b1d1e 1097 t17 = (loi[9] | ((int64_t)hii[9] << 31));
wolfSSL 16:8e0d178b1d1e 1098
wolfSSL 16:8e0d178b1d1e 1099
wolfSSL 16:8e0d178b1d1e 1100 /* a[*] * b[9] */
wolfSSL 16:8e0d178b1d1e 1101 splat = Q6_V_vsplat_R(b[9]);
wolfSSL 16:8e0d178b1d1e 1102 vlow = Q6_Vw_vmpyieo_VhVh(av, splat);
wolfSSL 16:8e0d178b1d1e 1103 vlow = Q6_Vw_vmpyieacc_VwVwVuh(vlow, av, splat);
wolfSSL 16:8e0d178b1d1e 1104 vhi = Q6_Vw_vmpye_VwVuh(av, splat);
wolfSSL 16:8e0d178b1d1e 1105 vhi = Q6_Vw_vmpyoacc_VwVwVh_s1_sat_shift(vhi, av, splat);
wolfSSL 16:8e0d178b1d1e 1106 loi = (unsigned int*)&vlow;
wolfSSL 16:8e0d178b1d1e 1107 hii = (int*)&vhi;
wolfSSL 16:8e0d178b1d1e 1108
wolfSSL 16:8e0d178b1d1e 1109
wolfSSL 16:8e0d178b1d1e 1110 /* a[0] * b[9] */
wolfSSL 16:8e0d178b1d1e 1111 t9 += (loi[0] | ((int64_t)hii[0] << 31));
wolfSSL 16:8e0d178b1d1e 1112
wolfSSL 16:8e0d178b1d1e 1113 /* a[1] * b[9] */
wolfSSL 16:8e0d178b1d1e 1114 t10 += (loi[1] | ((int64_t)hii[1] << 31));
wolfSSL 16:8e0d178b1d1e 1115
wolfSSL 16:8e0d178b1d1e 1116 /* a[2] * b[9] */
wolfSSL 16:8e0d178b1d1e 1117 t11 += (loi[2] | ((int64_t)hii[2] << 31));
wolfSSL 16:8e0d178b1d1e 1118
wolfSSL 16:8e0d178b1d1e 1119 /* a[3] * b[9] */
wolfSSL 16:8e0d178b1d1e 1120 t12 += (loi[3] | ((int64_t)hii[3] << 31));
wolfSSL 16:8e0d178b1d1e 1121
wolfSSL 16:8e0d178b1d1e 1122 /* a[4] * b[9] */
wolfSSL 16:8e0d178b1d1e 1123 t13 += (loi[4] | ((int64_t)hii[4] << 31));
wolfSSL 16:8e0d178b1d1e 1124
wolfSSL 16:8e0d178b1d1e 1125 /* a[5] * b[9] */
wolfSSL 16:8e0d178b1d1e 1126 t14 += (loi[5] | ((int64_t)hii[5] << 31));
wolfSSL 16:8e0d178b1d1e 1127
wolfSSL 16:8e0d178b1d1e 1128 /* a[6] * b[9] */
wolfSSL 16:8e0d178b1d1e 1129 t15 += (loi[6] | ((int64_t)hii[6] << 31));
wolfSSL 16:8e0d178b1d1e 1130
wolfSSL 16:8e0d178b1d1e 1131 /* a[7] * b[9] */
wolfSSL 16:8e0d178b1d1e 1132 t16 += (loi[7] | ((int64_t)hii[7] << 31));
wolfSSL 16:8e0d178b1d1e 1133
wolfSSL 16:8e0d178b1d1e 1134 /* a[8] * b[9] */
wolfSSL 16:8e0d178b1d1e 1135 t17 += (loi[8] | ((int64_t)hii[8] << 31));
wolfSSL 16:8e0d178b1d1e 1136
wolfSSL 16:8e0d178b1d1e 1137 /* a[9] * b[9] */
wolfSSL 16:8e0d178b1d1e 1138 t18 = (loi[9] | ((int64_t)hii[9] << 31));
wolfSSL 16:8e0d178b1d1e 1139
wolfSSL 16:8e0d178b1d1e 1140 t1 += t0 >> 26; r[ 0] = t0 & 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 1141 t2 += t1 >> 26; r[ 1] = t1 & 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 1142 t3 += t2 >> 26; r[ 2] = t2 & 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 1143 t4 += t3 >> 26; r[ 3] = t3 & 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 1144 t5 += t4 >> 26; r[ 4] = t4 & 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 1145 t6 += t5 >> 26; r[ 5] = t5 & 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 1146 t7 += t6 >> 26; r[ 6] = t6 & 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 1147 t8 += t7 >> 26; r[ 7] = t7 & 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 1148 t9 += t8 >> 26; r[ 8] = t8 & 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 1149 t10 += t9 >> 26; r[ 9] = t9 & 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 1150 t11 += t10 >> 26; r[10] = t10 & 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 1151 t12 += t11 >> 26; r[11] = t11 & 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 1152 t13 += t12 >> 26; r[12] = t12 & 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 1153 t14 += t13 >> 26; r[13] = t13 & 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 1154 t15 += t14 >> 26; r[14] = t14 & 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 1155 t16 += t15 >> 26; r[15] = t15 & 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 1156 t17 += t16 >> 26; r[16] = t16 & 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 1157 t18 += t17 >> 26; r[17] = t17 & 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 1158 r[19] = (sp_digit)(t18 >> 26);
wolfSSL 16:8e0d178b1d1e 1159 r[18] = t18 & 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 1160 }
wolfSSL 16:8e0d178b1d1e 1161 #endif
wolfSSL 16:8e0d178b1d1e 1162 }
wolfSSL 16:8e0d178b1d1e 1163
wolfSSL 16:8e0d178b1d1e 1164
wolfSSL 16:8e0d178b1d1e 1165 /* Multiply two Montogmery form numbers mod the modulus (prime).
wolfSSL 16:8e0d178b1d1e 1166 * (r = a * b mod m)
wolfSSL 16:8e0d178b1d1e 1167 *
wolfSSL 16:8e0d178b1d1e 1168 * r Result of multiplication.
wolfSSL 16:8e0d178b1d1e 1169 * a First number to multiply in Montogmery form.
wolfSSL 16:8e0d178b1d1e 1170 * b Second number to multiply in Montogmery form.
wolfSSL 16:8e0d178b1d1e 1171 * m Modulus (prime).
wolfSSL 16:8e0d178b1d1e 1172 * mp Montogmery mulitplier.
wolfSSL 16:8e0d178b1d1e 1173 */
wolfSSL 16:8e0d178b1d1e 1174 static void sp_256_mont_mul_10(sp_digit* r, const sp_digit* a, const sp_digit* b,
wolfSSL 16:8e0d178b1d1e 1175 const sp_digit* m, sp_digit mp)
wolfSSL 16:8e0d178b1d1e 1176 {
wolfSSL 16:8e0d178b1d1e 1177 sp_256_mul_10(r, a, b);
wolfSSL 16:8e0d178b1d1e 1178 sp_256_mont_reduce_10(r, m, mp);
wolfSSL 16:8e0d178b1d1e 1179 }
wolfSSL 16:8e0d178b1d1e 1180
wolfSSL 16:8e0d178b1d1e 1181
wolfSSL 16:8e0d178b1d1e 1182 /* Square a and put result in r. (r = a * a)
wolfSSL 16:8e0d178b1d1e 1183 *
wolfSSL 16:8e0d178b1d1e 1184 * r A single precision integer.
wolfSSL 16:8e0d178b1d1e 1185 * a A single precision integer.
wolfSSL 16:8e0d178b1d1e 1186 */
wolfSSL 16:8e0d178b1d1e 1187 SP_NOINLINE static void sp_256_sqr_10(sp_digit* r, const sp_digit* a)
wolfSSL 16:8e0d178b1d1e 1188 {
wolfSSL 16:8e0d178b1d1e 1189 int64_t t0 = Q6_P_mpy_RR(a[0], a[0]);
wolfSSL 16:8e0d178b1d1e 1190 int64_t t1 = Q6_P_mpy_RR(a[0], a[1]) * 2;
wolfSSL 16:8e0d178b1d1e 1191 int64_t t2 = Q6_P_mpy_RR(a[0], a[2]) * 2
wolfSSL 16:8e0d178b1d1e 1192 + Q6_P_mpy_RR(a[1], a[1]);
wolfSSL 16:8e0d178b1d1e 1193 int64_t t3 = (Q6_P_mpy_RR(a[0], a[3])
wolfSSL 16:8e0d178b1d1e 1194 + Q6_P_mpy_RR(a[1], a[2])) * 2;
wolfSSL 16:8e0d178b1d1e 1195 int64_t t4 = (Q6_P_mpy_RR(a[ 0], a[ 4])
wolfSSL 16:8e0d178b1d1e 1196 + Q6_P_mpy_RR(a[ 1], a[ 3])) * 2
wolfSSL 16:8e0d178b1d1e 1197 + Q6_P_mpy_RR(a[ 2], a[ 2]);
wolfSSL 16:8e0d178b1d1e 1198 int64_t t5 = (Q6_P_mpy_RR(a[ 0], a[ 5])
wolfSSL 16:8e0d178b1d1e 1199 + Q6_P_mpy_RR(a[ 1], a[ 4])
wolfSSL 16:8e0d178b1d1e 1200 + Q6_P_mpy_RR(a[ 2], a[ 3])) * 2;
wolfSSL 16:8e0d178b1d1e 1201 int64_t t6 = (Q6_P_mpy_RR(a[ 0], a[ 6])
wolfSSL 16:8e0d178b1d1e 1202 + Q6_P_mpy_RR(a[ 1], a[ 5])
wolfSSL 16:8e0d178b1d1e 1203 + Q6_P_mpy_RR(a[ 2], a[ 4])) * 2
wolfSSL 16:8e0d178b1d1e 1204 + Q6_P_mpy_RR(a[ 3], a[ 3]);
wolfSSL 16:8e0d178b1d1e 1205 int64_t t7 = (Q6_P_mpy_RR(a[ 0], a[ 7])
wolfSSL 16:8e0d178b1d1e 1206 + Q6_P_mpy_RR(a[ 1], a[ 6])
wolfSSL 16:8e0d178b1d1e 1207 + Q6_P_mpy_RR(a[ 2], a[ 5])
wolfSSL 16:8e0d178b1d1e 1208 + Q6_P_mpy_RR(a[ 3], a[ 4])) * 2;
wolfSSL 16:8e0d178b1d1e 1209 int64_t t8 = (Q6_P_mpy_RR(a[ 0], a[ 8])
wolfSSL 16:8e0d178b1d1e 1210 + Q6_P_mpy_RR(a[ 1], a[ 7])
wolfSSL 16:8e0d178b1d1e 1211 + Q6_P_mpy_RR(a[ 2], a[ 6])
wolfSSL 16:8e0d178b1d1e 1212 + Q6_P_mpy_RR(a[ 3], a[ 5])) * 2
wolfSSL 16:8e0d178b1d1e 1213 + Q6_P_mpy_RR(a[ 4], a[ 4]);
wolfSSL 16:8e0d178b1d1e 1214 int64_t t9 = (Q6_P_mpy_RR(a[ 0], a[ 9])
wolfSSL 16:8e0d178b1d1e 1215 + Q6_P_mpy_RR(a[ 1], a[ 8])
wolfSSL 16:8e0d178b1d1e 1216 + Q6_P_mpy_RR(a[ 2], a[ 7])
wolfSSL 16:8e0d178b1d1e 1217 + Q6_P_mpy_RR(a[ 3], a[ 6])
wolfSSL 16:8e0d178b1d1e 1218 + Q6_P_mpy_RR(a[ 4], a[ 5])) * 2;
wolfSSL 16:8e0d178b1d1e 1219 int64_t t10 = (Q6_P_mpy_RR(a[ 1], a[ 9])
wolfSSL 16:8e0d178b1d1e 1220 + Q6_P_mpy_RR(a[ 2], a[ 8])
wolfSSL 16:8e0d178b1d1e 1221 + Q6_P_mpy_RR(a[ 3], a[ 7])
wolfSSL 16:8e0d178b1d1e 1222 + Q6_P_mpy_RR(a[ 4], a[ 6])) * 2
wolfSSL 16:8e0d178b1d1e 1223 + Q6_P_mpy_RR(a[ 5], a[ 5]);
wolfSSL 16:8e0d178b1d1e 1224 int64_t t11 = (Q6_P_mpy_RR(a[ 2], a[ 9])
wolfSSL 16:8e0d178b1d1e 1225 + Q6_P_mpy_RR(a[ 3], a[ 8])
wolfSSL 16:8e0d178b1d1e 1226 + Q6_P_mpy_RR(a[ 4], a[ 7])
wolfSSL 16:8e0d178b1d1e 1227 + Q6_P_mpy_RR(a[ 5], a[ 6])) * 2;
wolfSSL 16:8e0d178b1d1e 1228 int64_t t12 = (Q6_P_mpy_RR(a[ 3], a[ 9])
wolfSSL 16:8e0d178b1d1e 1229 + Q6_P_mpy_RR(a[ 4], a[ 8])
wolfSSL 16:8e0d178b1d1e 1230 + Q6_P_mpy_RR(a[ 5], a[ 7])) * 2
wolfSSL 16:8e0d178b1d1e 1231 + Q6_P_mpy_RR(a[ 6], a[ 6]);
wolfSSL 16:8e0d178b1d1e 1232 int64_t t13 = (Q6_P_mpy_RR(a[ 4], a[ 9])
wolfSSL 16:8e0d178b1d1e 1233 + Q6_P_mpy_RR(a[ 5], a[ 8])
wolfSSL 16:8e0d178b1d1e 1234 + Q6_P_mpy_RR(a[ 6], a[ 7])) * 2;
wolfSSL 16:8e0d178b1d1e 1235 int64_t t14 = (Q6_P_mpy_RR(a[ 5], a[ 9])
wolfSSL 16:8e0d178b1d1e 1236 + Q6_P_mpy_RR(a[ 6], a[ 8])) * 2
wolfSSL 16:8e0d178b1d1e 1237 + Q6_P_mpy_RR(a[ 7], a[ 7]);
wolfSSL 16:8e0d178b1d1e 1238 int64_t t15 =( Q6_P_mpy_RR(a[ 6], a[ 9])
wolfSSL 16:8e0d178b1d1e 1239 + Q6_P_mpy_RR(a[ 7], a[ 8])) * 2;
wolfSSL 16:8e0d178b1d1e 1240 int64_t t16 = Q6_P_mpy_RR(a[ 7], a[ 9]) * 2
wolfSSL 16:8e0d178b1d1e 1241 + Q6_P_mpy_RR(a[ 8], a[ 8]);
wolfSSL 16:8e0d178b1d1e 1242 int64_t t17 = Q6_P_mpy_RR(a[ 8], a[ 9]) * 2;
wolfSSL 16:8e0d178b1d1e 1243 int64_t t18 = Q6_P_mpy_RR(a[ 9], a[ 9]);
wolfSSL 16:8e0d178b1d1e 1244
wolfSSL 16:8e0d178b1d1e 1245 t1 += t0 >> 26; r[ 0] = t0 & 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 1246 t2 += t1 >> 26; r[ 1] = t1 & 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 1247 t3 += t2 >> 26; r[ 2] = t2 & 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 1248 t4 += t3 >> 26; r[ 3] = t3 & 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 1249 t5 += t4 >> 26; r[ 4] = t4 & 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 1250 t6 += t5 >> 26; r[ 5] = t5 & 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 1251 t7 += t6 >> 26; r[ 6] = t6 & 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 1252 t8 += t7 >> 26; r[ 7] = t7 & 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 1253 t9 += t8 >> 26; r[ 8] = t8 & 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 1254 t10 += t9 >> 26; r[ 9] = t9 & 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 1255 t11 += t10 >> 26; r[10] = t10 & 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 1256 t12 += t11 >> 26; r[11] = t11 & 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 1257 t13 += t12 >> 26; r[12] = t12 & 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 1258 t14 += t13 >> 26; r[13] = t13 & 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 1259 t15 += t14 >> 26; r[14] = t14 & 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 1260 t16 += t15 >> 26; r[15] = t15 & 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 1261 t17 += t16 >> 26; r[16] = t16 & 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 1262 t18 += t17 >> 26; r[17] = t17 & 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 1263 r[19] = (sp_digit)(t18 >> 26);
wolfSSL 16:8e0d178b1d1e 1264 r[18] = t18 & 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 1265 }
wolfSSL 16:8e0d178b1d1e 1266
wolfSSL 16:8e0d178b1d1e 1267
wolfSSL 16:8e0d178b1d1e 1268 /* Square the Montgomery form number. (r = a * a mod m)
wolfSSL 16:8e0d178b1d1e 1269 *
wolfSSL 16:8e0d178b1d1e 1270 * r Result of squaring.
wolfSSL 16:8e0d178b1d1e 1271 * a Number to square in Montogmery form.
wolfSSL 16:8e0d178b1d1e 1272 * m Modulus (prime).
wolfSSL 16:8e0d178b1d1e 1273 * mp Montogmery mulitplier.
wolfSSL 16:8e0d178b1d1e 1274 */
wolfSSL 16:8e0d178b1d1e 1275 static void sp_256_mont_sqr_10(sp_digit* r, const sp_digit* a, const sp_digit* m,
wolfSSL 16:8e0d178b1d1e 1276 sp_digit mp)
wolfSSL 16:8e0d178b1d1e 1277 {
wolfSSL 16:8e0d178b1d1e 1278 sp_256_sqr_10(r, a);
wolfSSL 16:8e0d178b1d1e 1279 sp_256_mont_reduce_10(r, m, mp);
wolfSSL 16:8e0d178b1d1e 1280 }
wolfSSL 16:8e0d178b1d1e 1281
wolfSSL 16:8e0d178b1d1e 1282 #if !defined(WOLFSSL_SP_SMALL) || defined(HAVE_COMP_KEY)
wolfSSL 16:8e0d178b1d1e 1283 /* Square the Montgomery form number a number of times. (r = a ^ n mod m)
wolfSSL 16:8e0d178b1d1e 1284 *
wolfSSL 16:8e0d178b1d1e 1285 * r Result of squaring.
wolfSSL 16:8e0d178b1d1e 1286 * a Number to square in Montogmery form.
wolfSSL 16:8e0d178b1d1e 1287 * n Number of times to square.
wolfSSL 16:8e0d178b1d1e 1288 * m Modulus (prime).
wolfSSL 16:8e0d178b1d1e 1289 * mp Montogmery mulitplier.
wolfSSL 16:8e0d178b1d1e 1290 */
wolfSSL 16:8e0d178b1d1e 1291 static void sp_256_mont_sqr_n_10(sp_digit* r, const sp_digit* a, int n,
wolfSSL 16:8e0d178b1d1e 1292 const sp_digit* m, sp_digit mp)
wolfSSL 16:8e0d178b1d1e 1293 {
wolfSSL 16:8e0d178b1d1e 1294 sp_256_mont_sqr_10(r, a, m, mp);
wolfSSL 16:8e0d178b1d1e 1295 for (; n > 1; n--) {
wolfSSL 16:8e0d178b1d1e 1296 sp_256_mont_sqr_10(r, r, m, mp);
wolfSSL 16:8e0d178b1d1e 1297 }
wolfSSL 16:8e0d178b1d1e 1298 }
wolfSSL 16:8e0d178b1d1e 1299
wolfSSL 16:8e0d178b1d1e 1300 #endif /* !WOLFSSL_SP_SMALL || HAVE_COMP_KEY */
wolfSSL 16:8e0d178b1d1e 1301 #ifdef WOLFSSL_SP_SMALL
wolfSSL 16:8e0d178b1d1e 1302 /* Mod-2 for the P256 curve. */
wolfSSL 16:8e0d178b1d1e 1303 static const uint32_t p256_mod_2[8] = {
wolfSSL 16:8e0d178b1d1e 1304 0xfffffffdU,0xffffffffU,0xffffffffU,0x00000000U,0x00000000U,0x00000000U,
wolfSSL 16:8e0d178b1d1e 1305 0x00000001U,0xffffffffU
wolfSSL 16:8e0d178b1d1e 1306 };
wolfSSL 16:8e0d178b1d1e 1307 #endif /* !WOLFSSL_SP_SMALL */
wolfSSL 16:8e0d178b1d1e 1308
wolfSSL 16:8e0d178b1d1e 1309 /* Invert the number, in Montgomery form, modulo the modulus (prime) of the
wolfSSL 16:8e0d178b1d1e 1310 * P256 curve. (r = 1 / a mod m)
wolfSSL 16:8e0d178b1d1e 1311 *
wolfSSL 16:8e0d178b1d1e 1312 * r Inverse result.
wolfSSL 16:8e0d178b1d1e 1313 * a Number to invert.
wolfSSL 16:8e0d178b1d1e 1314 * td Temporary data.
wolfSSL 16:8e0d178b1d1e 1315 */
wolfSSL 16:8e0d178b1d1e 1316 static void sp_256_mont_inv_10(sp_digit* r, const sp_digit* a, sp_digit* td)
wolfSSL 16:8e0d178b1d1e 1317 {
wolfSSL 16:8e0d178b1d1e 1318 #ifdef WOLFSSL_SP_SMALL
wolfSSL 16:8e0d178b1d1e 1319 sp_digit* t = td;
wolfSSL 16:8e0d178b1d1e 1320 int i;
wolfSSL 16:8e0d178b1d1e 1321
wolfSSL 16:8e0d178b1d1e 1322 XMEMCPY(t, a, sizeof(sp_digit) * 10);
wolfSSL 16:8e0d178b1d1e 1323 for (i=254; i>=0; i--) {
wolfSSL 16:8e0d178b1d1e 1324 sp_256_mont_sqr_10(t, t, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 1325 if (p256_mod_2[i / 32] & ((sp_digit)1 << (i % 32)))
wolfSSL 16:8e0d178b1d1e 1326 sp_256_mont_mul_10(t, t, a, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 1327 }
wolfSSL 16:8e0d178b1d1e 1328 XMEMCPY(r, t, sizeof(sp_digit) * 10);
wolfSSL 16:8e0d178b1d1e 1329 #else
wolfSSL 16:8e0d178b1d1e 1330 sp_digit* t = td;
wolfSSL 16:8e0d178b1d1e 1331 sp_digit* t2 = td + Q6_P_mpy_RR(2, 10);
wolfSSL 16:8e0d178b1d1e 1332 sp_digit* t3 = td + Q6_P_mpy_RR(4, 10);
wolfSSL 16:8e0d178b1d1e 1333
wolfSSL 16:8e0d178b1d1e 1334 /* t = a^2 */
wolfSSL 16:8e0d178b1d1e 1335 sp_256_mont_sqr_10(t, a, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 1336 /* t = a^3 = t * a */
wolfSSL 16:8e0d178b1d1e 1337 sp_256_mont_mul_10(t, t, a, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 1338 /* t2= a^c = t ^ 2 ^ 2 */
wolfSSL 16:8e0d178b1d1e 1339 sp_256_mont_sqr_n_10(t2, t, 2, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 1340 /* t3= a^d = t2 * a */
wolfSSL 16:8e0d178b1d1e 1341 sp_256_mont_mul_10(t3, t2, a, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 1342 /* t = a^f = t2 * t */
wolfSSL 16:8e0d178b1d1e 1343 sp_256_mont_mul_10(t, t2, t, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 1344 /* t2= a^f0 = t ^ 2 ^ 4 */
wolfSSL 16:8e0d178b1d1e 1345 sp_256_mont_sqr_n_10(t2, t, 4, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 1346 /* t3= a^fd = t2 * t3 */
wolfSSL 16:8e0d178b1d1e 1347 sp_256_mont_mul_10(t3, t2, t3, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 1348 /* t = a^ff = t2 * t */
wolfSSL 16:8e0d178b1d1e 1349 sp_256_mont_mul_10(t, t2, t, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 1350 /* t2= a^ff00 = t ^ 2 ^ 8 */
wolfSSL 16:8e0d178b1d1e 1351 sp_256_mont_sqr_n_10(t2, t, 8, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 1352 /* t3= a^fffd = t2 * t3 */
wolfSSL 16:8e0d178b1d1e 1353 sp_256_mont_mul_10(t3, t2, t3, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 1354 /* t = a^ffff = t2 * t */
wolfSSL 16:8e0d178b1d1e 1355 sp_256_mont_mul_10(t, t2, t, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 1356 /* t2= a^ffff0000 = t ^ 2 ^ 16 */
wolfSSL 16:8e0d178b1d1e 1357 sp_256_mont_sqr_n_10(t2, t, 16, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 1358 /* t3= a^fffffffd = t2 * t3 */
wolfSSL 16:8e0d178b1d1e 1359 sp_256_mont_mul_10(t3, t2, t3, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 1360 /* t = a^ffffffff = t2 * t */
wolfSSL 16:8e0d178b1d1e 1361 sp_256_mont_mul_10(t, t2, t, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 1362 /* t = a^ffffffff00000000 = t ^ 2 ^ 32 */
wolfSSL 16:8e0d178b1d1e 1363 sp_256_mont_sqr_n_10(t2, t, 32, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 1364 /* t2= a^ffffffffffffffff = t2 * t */
wolfSSL 16:8e0d178b1d1e 1365 sp_256_mont_mul_10(t, t2, t, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 1366 /* t2= a^ffffffff00000001 = t2 * a */
wolfSSL 16:8e0d178b1d1e 1367 sp_256_mont_mul_10(t2, t2, a, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 1368 /* t2= a^ffffffff000000010000000000000000000000000000000000000000
wolfSSL 16:8e0d178b1d1e 1369 * = t2 ^ 2 ^ 160 */
wolfSSL 16:8e0d178b1d1e 1370 sp_256_mont_sqr_n_10(t2, t2, 160, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 1371 /* t2= a^ffffffff00000001000000000000000000000000ffffffffffffffff
wolfSSL 16:8e0d178b1d1e 1372 * = t2 * t */
wolfSSL 16:8e0d178b1d1e 1373 sp_256_mont_mul_10(t2, t2, t, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 1374 /* t2= a^ffffffff00000001000000000000000000000000ffffffffffffffff00000000
wolfSSL 16:8e0d178b1d1e 1375 * = t2 ^ 2 ^ 32 */
wolfSSL 16:8e0d178b1d1e 1376 sp_256_mont_sqr_n_10(t2, t2, 32, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 1377 /* r = a^ffffffff00000001000000000000000000000000fffffffffffffffffffffffd
wolfSSL 16:8e0d178b1d1e 1378 * = t2 * t3 */
wolfSSL 16:8e0d178b1d1e 1379 sp_256_mont_mul_10(r, t2, t3, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 1380 #endif /* WOLFSSL_SP_SMALL */
wolfSSL 16:8e0d178b1d1e 1381 }
wolfSSL 16:8e0d178b1d1e 1382
wolfSSL 16:8e0d178b1d1e 1383
wolfSSL 16:8e0d178b1d1e 1384 /* Map the Montgomery form projective co-ordinate point to an affine point.
wolfSSL 16:8e0d178b1d1e 1385 *
wolfSSL 16:8e0d178b1d1e 1386 * r Resulting affine co-ordinate point.
wolfSSL 16:8e0d178b1d1e 1387 * p Montgomery form projective co-ordinate point.
wolfSSL 16:8e0d178b1d1e 1388 * t Temporary ordinate data.
wolfSSL 16:8e0d178b1d1e 1389 */
wolfSSL 16:8e0d178b1d1e 1390 static void sp_256_map_10(sp_point* r, const sp_point* p, sp_digit* t)
wolfSSL 16:8e0d178b1d1e 1391 {
wolfSSL 16:8e0d178b1d1e 1392 sp_digit* t1 = t;
wolfSSL 16:8e0d178b1d1e 1393 sp_digit* t2 = t + Q6_P_mpy_RR(2, 10);
wolfSSL 16:8e0d178b1d1e 1394 int32_t n;
wolfSSL 16:8e0d178b1d1e 1395
wolfSSL 16:8e0d178b1d1e 1396 sp_256_mont_inv_10(t1, p->z, t + 2*10);
wolfSSL 16:8e0d178b1d1e 1397
wolfSSL 16:8e0d178b1d1e 1398 sp_256_mont_sqr_10(t2, t1, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 1399 sp_256_mont_mul_10(t1, t2, t1, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 1400
wolfSSL 16:8e0d178b1d1e 1401 /* x /= z^2 */
wolfSSL 16:8e0d178b1d1e 1402 sp_256_mont_mul_10(r->x, p->x, t2, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 1403 XMEMSET(r->x + 10, 0, sizeof(r->x) / 2U);
wolfSSL 16:8e0d178b1d1e 1404 sp_256_mont_reduce_10(r->x, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 1405 /* Reduce x to less than modulus */
wolfSSL 16:8e0d178b1d1e 1406 n = sp_256_cmp_10(r->x, p256_mod);
wolfSSL 16:8e0d178b1d1e 1407 sp_256_cond_sub_10(r->x, r->x, p256_mod, 0 - ((n >= 0) ?
wolfSSL 16:8e0d178b1d1e 1408 (sp_digit)1 : (sp_digit)0));
wolfSSL 16:8e0d178b1d1e 1409 sp_256_norm_10(r->x);
wolfSSL 16:8e0d178b1d1e 1410
wolfSSL 16:8e0d178b1d1e 1411 /* y /= z^3 */
wolfSSL 16:8e0d178b1d1e 1412 sp_256_mont_mul_10(r->y, p->y, t1, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 1413 XMEMSET(r->y + 10, 0, sizeof(r->y) / 2U);
wolfSSL 16:8e0d178b1d1e 1414 sp_256_mont_reduce_10(r->y, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 1415 /* Reduce y to less than modulus */
wolfSSL 16:8e0d178b1d1e 1416 n = sp_256_cmp_10(r->y, p256_mod);
wolfSSL 16:8e0d178b1d1e 1417 sp_256_cond_sub_10(r->y, r->y, p256_mod, 0 - ((n >= 0) ?
wolfSSL 16:8e0d178b1d1e 1418 (sp_digit)1 : (sp_digit)0));
wolfSSL 16:8e0d178b1d1e 1419 sp_256_norm_10(r->y);
wolfSSL 16:8e0d178b1d1e 1420
wolfSSL 16:8e0d178b1d1e 1421 XMEMSET(r->z, 0, sizeof(r->z));
wolfSSL 16:8e0d178b1d1e 1422 r->z[0] = 1;
wolfSSL 16:8e0d178b1d1e 1423
wolfSSL 16:8e0d178b1d1e 1424 }
wolfSSL 16:8e0d178b1d1e 1425
wolfSSL 16:8e0d178b1d1e 1426
wolfSSL 16:8e0d178b1d1e 1427 /* Add b to a into r. (r = a + b)
wolfSSL 16:8e0d178b1d1e 1428 *
wolfSSL 16:8e0d178b1d1e 1429 * r A single precision integer.
wolfSSL 16:8e0d178b1d1e 1430 * a A single precision integer.
wolfSSL 16:8e0d178b1d1e 1431 * b A single precision integer.
wolfSSL 16:8e0d178b1d1e 1432 */
wolfSSL 16:8e0d178b1d1e 1433 SP_NOINLINE static int sp_256_add_10(sp_digit* r, const sp_digit* a,
wolfSSL 16:8e0d178b1d1e 1434 const sp_digit* b)
wolfSSL 16:8e0d178b1d1e 1435 {
wolfSSL 16:8e0d178b1d1e 1436 #if 0
wolfSSL 16:8e0d178b1d1e 1437 r[ 0] = Q6_R_add_RR(a[0], b[0]);
wolfSSL 16:8e0d178b1d1e 1438 r[ 1] = Q6_R_add_RR(a[1], b[1]);
wolfSSL 16:8e0d178b1d1e 1439 r[ 2] = Q6_R_add_RR(a[2], b[2]);
wolfSSL 16:8e0d178b1d1e 1440 r[ 3] = Q6_R_add_RR(a[3], b[3]);
wolfSSL 16:8e0d178b1d1e 1441 r[ 4] = Q6_R_add_RR(a[4], b[4]);
wolfSSL 16:8e0d178b1d1e 1442 r[ 5] = Q6_R_add_RR(a[5], b[5]);
wolfSSL 16:8e0d178b1d1e 1443 r[ 6] = Q6_R_add_RR(a[6], b[6]);
wolfSSL 16:8e0d178b1d1e 1444 r[ 7] = Q6_R_add_RR(a[7], b[7]);
wolfSSL 16:8e0d178b1d1e 1445 r[ 8] = Q6_R_add_RR(a[8], b[8]);
wolfSSL 16:8e0d178b1d1e 1446 r[ 9] = Q6_R_add_RR(a[9], b[9]);
wolfSSL 16:8e0d178b1d1e 1447 #endif
wolfSSL 16:8e0d178b1d1e 1448 #if 1
wolfSSL 16:8e0d178b1d1e 1449 __asm__ __volatile__ (
wolfSSL 16:8e0d178b1d1e 1450 "{ r1 = memw(%[a]+#0) \n"
wolfSSL 16:8e0d178b1d1e 1451 " r2 = memw(%[b]+#0) }\n"
wolfSSL 16:8e0d178b1d1e 1452 "{ r3 = memw(%[a]+#4) \n"
wolfSSL 16:8e0d178b1d1e 1453 " r19 = add(r1,r2) \n"
wolfSSL 16:8e0d178b1d1e 1454 " r4 = memw(%[b]+#4) }\n"
wolfSSL 16:8e0d178b1d1e 1455 "{ r5 = memw(%[a]+#8) \n"
wolfSSL 16:8e0d178b1d1e 1456 " r20 = add(r3,r4) \n"
wolfSSL 16:8e0d178b1d1e 1457 " r6 = memw(%[b]+#8) }\n"
wolfSSL 16:8e0d178b1d1e 1458 "{ memw(%[r]+#0) = r19 }\n"
wolfSSL 16:8e0d178b1d1e 1459 "{ r7 = memw(%[a]+#12) \n"
wolfSSL 16:8e0d178b1d1e 1460 " r21 = add(r5,r6) \n"
wolfSSL 16:8e0d178b1d1e 1461 " r8 = memw(%[b]+#12) }\n"
wolfSSL 16:8e0d178b1d1e 1462 "{ memw(%[r]+#4) = r20 }\n"
wolfSSL 16:8e0d178b1d1e 1463 "{ r9 = memw(%[a]+#16) \n"
wolfSSL 16:8e0d178b1d1e 1464 " r22 = add(r7,r8) \n"
wolfSSL 16:8e0d178b1d1e 1465 " r10 = memw(%[b]+#16) }\n"
wolfSSL 16:8e0d178b1d1e 1466 "{ memw(%[r]+#8) = r21 }\n"
wolfSSL 16:8e0d178b1d1e 1467 "{ r11 = memw(%[a]+#20) \n"
wolfSSL 16:8e0d178b1d1e 1468 " r23 = add(r9,r10) \n"
wolfSSL 16:8e0d178b1d1e 1469 " r12 = memw(%[b]+#20) }\n"
wolfSSL 16:8e0d178b1d1e 1470 "{ memw(%[r]+#12) = r22 }\n"
wolfSSL 16:8e0d178b1d1e 1471 "{ r13 = memw(%[a]+#24) \n"
wolfSSL 16:8e0d178b1d1e 1472 " r24 = add(r11,r12) \n"
wolfSSL 16:8e0d178b1d1e 1473 " r14 = memw(%[b]+#24) }\n"
wolfSSL 16:8e0d178b1d1e 1474 "{ memw(%[r]+#16) = r23 }\n"
wolfSSL 16:8e0d178b1d1e 1475 "{ r15 = memw(%[a]+#28) \n"
wolfSSL 16:8e0d178b1d1e 1476 " r25 = add(r13,r14) \n"
wolfSSL 16:8e0d178b1d1e 1477 " r16 = memw(%[b]+#28) }\n"
wolfSSL 16:8e0d178b1d1e 1478 "{ memw(%[r]+#20) = r24 }\n"
wolfSSL 16:8e0d178b1d1e 1479 "{ r17 = memw(%[a]+#32) \n"
wolfSSL 16:8e0d178b1d1e 1480 " r26 = add(r15,r16) \n"
wolfSSL 16:8e0d178b1d1e 1481 " r18 = memw(%[b]+#32) }\n"
wolfSSL 16:8e0d178b1d1e 1482 "{ memw(%[r]+#24) = r25 }\n"
wolfSSL 16:8e0d178b1d1e 1483 "{ r5 = memw(%[a]+#36) \n"
wolfSSL 16:8e0d178b1d1e 1484 " r19 = add(r17,r18) \n"
wolfSSL 16:8e0d178b1d1e 1485 " r6 = memw(%[b]+#36) }\n"
wolfSSL 16:8e0d178b1d1e 1486 "{ memw(%[r]+#28) = r26 }\n"
wolfSSL 16:8e0d178b1d1e 1487 "{ r20 = add(r5,r6) \n"
wolfSSL 16:8e0d178b1d1e 1488 " memw(%[r]+#32) = r19 }\n"
wolfSSL 16:8e0d178b1d1e 1489 "{ memw(%[r]+#36) = r20 }\n"
wolfSSL 16:8e0d178b1d1e 1490 : [r] "+r" (r)
wolfSSL 16:8e0d178b1d1e 1491 : [a] "r"(a), [b] "r"(b)
wolfSSL 16:8e0d178b1d1e 1492 : "memory", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23", "r24", "r25", "r26"
wolfSSL 16:8e0d178b1d1e 1493 );
wolfSSL 16:8e0d178b1d1e 1494 #endif
wolfSSL 16:8e0d178b1d1e 1495 return 0;
wolfSSL 16:8e0d178b1d1e 1496 }
wolfSSL 16:8e0d178b1d1e 1497
wolfSSL 16:8e0d178b1d1e 1498
wolfSSL 16:8e0d178b1d1e 1499 /* Add two Montgomery form numbers (r = a + b % m).
wolfSSL 16:8e0d178b1d1e 1500 *
wolfSSL 16:8e0d178b1d1e 1501 * r Result of addition.
wolfSSL 16:8e0d178b1d1e 1502 * a First number to add in Montogmery form.
wolfSSL 16:8e0d178b1d1e 1503 * b Second number to add in Montogmery form.
wolfSSL 16:8e0d178b1d1e 1504 * m Modulus (prime).
wolfSSL 16:8e0d178b1d1e 1505 */
wolfSSL 16:8e0d178b1d1e 1506 static void sp_256_mont_add_10(sp_digit* r, const sp_digit* a, const sp_digit* b,
wolfSSL 16:8e0d178b1d1e 1507 const sp_digit* m)
wolfSSL 16:8e0d178b1d1e 1508 {
wolfSSL 16:8e0d178b1d1e 1509 (void)sp_256_add_10(r, a, b);
wolfSSL 16:8e0d178b1d1e 1510 sp_256_norm_10(r);
wolfSSL 16:8e0d178b1d1e 1511 sp_256_cond_sub_10(r, r, m, 0 - (((r[9] >> 22) > 0) ?
wolfSSL 16:8e0d178b1d1e 1512 (sp_digit)1 : (sp_digit)0));
wolfSSL 16:8e0d178b1d1e 1513 sp_256_norm_10(r);
wolfSSL 16:8e0d178b1d1e 1514 }
wolfSSL 16:8e0d178b1d1e 1515
wolfSSL 16:8e0d178b1d1e 1516
wolfSSL 16:8e0d178b1d1e 1517 /* Double a Montgomery form number (r = a + a % m).
wolfSSL 16:8e0d178b1d1e 1518 *
wolfSSL 16:8e0d178b1d1e 1519 * r Result of doubling.
wolfSSL 16:8e0d178b1d1e 1520 * a Number to double in Montogmery form.
wolfSSL 16:8e0d178b1d1e 1521 * m Modulus (prime).
wolfSSL 16:8e0d178b1d1e 1522 */
wolfSSL 16:8e0d178b1d1e 1523 static void sp_256_mont_dbl_10(sp_digit* r, const sp_digit* a, const sp_digit* m)
wolfSSL 16:8e0d178b1d1e 1524 {
wolfSSL 16:8e0d178b1d1e 1525 (void)sp_256_add_10(r, a, a);
wolfSSL 16:8e0d178b1d1e 1526 sp_256_norm_10(r);
wolfSSL 16:8e0d178b1d1e 1527 sp_256_cond_sub_10(r, r, m, 0 - (((r[9] >> 22) > 0) ?
wolfSSL 16:8e0d178b1d1e 1528 (sp_digit)1 : (sp_digit)0));
wolfSSL 16:8e0d178b1d1e 1529 sp_256_norm_10(r);
wolfSSL 16:8e0d178b1d1e 1530 }
wolfSSL 16:8e0d178b1d1e 1531
wolfSSL 16:8e0d178b1d1e 1532
wolfSSL 16:8e0d178b1d1e 1533 /* Triple a Montgomery form number (r = a + a + a % m).
wolfSSL 16:8e0d178b1d1e 1534 *
wolfSSL 16:8e0d178b1d1e 1535 * r Result of Tripling.
wolfSSL 16:8e0d178b1d1e 1536 * a Number to triple in Montogmery form.
wolfSSL 16:8e0d178b1d1e 1537 * m Modulus (prime).
wolfSSL 16:8e0d178b1d1e 1538 */
wolfSSL 16:8e0d178b1d1e 1539 static void sp_256_mont_tpl_10(sp_digit* r, const sp_digit* a, const sp_digit* m)
wolfSSL 16:8e0d178b1d1e 1540 {
wolfSSL 16:8e0d178b1d1e 1541 (void)sp_256_add_10(r, a, a);
wolfSSL 16:8e0d178b1d1e 1542 sp_256_norm_10(r);
wolfSSL 16:8e0d178b1d1e 1543 sp_256_cond_sub_10(r, r, m, 0 - (((r[9] >> 22) > 0) ?
wolfSSL 16:8e0d178b1d1e 1544 (sp_digit)1 : (sp_digit)0));
wolfSSL 16:8e0d178b1d1e 1545 sp_256_norm_10(r);
wolfSSL 16:8e0d178b1d1e 1546 (void)sp_256_add_10(r, r, a);
wolfSSL 16:8e0d178b1d1e 1547 sp_256_norm_10(r);
wolfSSL 16:8e0d178b1d1e 1548 sp_256_cond_sub_10(r, r, m, 0 - (((r[9] >> 22) > 0) ?
wolfSSL 16:8e0d178b1d1e 1549 (sp_digit)1 : (sp_digit)0));
wolfSSL 16:8e0d178b1d1e 1550 sp_256_norm_10(r);
wolfSSL 16:8e0d178b1d1e 1551 }
wolfSSL 16:8e0d178b1d1e 1552
wolfSSL 16:8e0d178b1d1e 1553 /* Sub b from a into r. (r = a - b)
wolfSSL 16:8e0d178b1d1e 1554 *
wolfSSL 16:8e0d178b1d1e 1555 * r A single precision integer.
wolfSSL 16:8e0d178b1d1e 1556 * a A single precision integer.
wolfSSL 16:8e0d178b1d1e 1557 * b A single precision integer.
wolfSSL 16:8e0d178b1d1e 1558 */
wolfSSL 16:8e0d178b1d1e 1559 SP_NOINLINE static int sp_256_sub_10(sp_digit* r, const sp_digit* a,
wolfSSL 16:8e0d178b1d1e 1560 const sp_digit* b)
wolfSSL 16:8e0d178b1d1e 1561 {
wolfSSL 16:8e0d178b1d1e 1562 #if 0
wolfSSL 16:8e0d178b1d1e 1563 r[ 0] = Q6_R_sub_RR(a[0], b[0]);
wolfSSL 16:8e0d178b1d1e 1564 r[ 1] = Q6_R_sub_RR(a[1], b[1]);
wolfSSL 16:8e0d178b1d1e 1565 r[ 2] = Q6_R_sub_RR(a[2], b[2]);
wolfSSL 16:8e0d178b1d1e 1566 r[ 3] = Q6_R_sub_RR(a[3], b[3]);
wolfSSL 16:8e0d178b1d1e 1567 r[ 4] = Q6_R_sub_RR(a[4], b[4]);
wolfSSL 16:8e0d178b1d1e 1568 r[ 5] = Q6_R_sub_RR(a[5], b[5]);
wolfSSL 16:8e0d178b1d1e 1569 r[ 6] = Q6_R_sub_RR(a[6], b[6]);
wolfSSL 16:8e0d178b1d1e 1570 r[ 7] = Q6_R_sub_RR(a[7], b[7]);
wolfSSL 16:8e0d178b1d1e 1571 r[ 8] = Q6_R_sub_RR(a[8], b[8]);
wolfSSL 16:8e0d178b1d1e 1572 r[ 9] = Q6_R_sub_RR(a[9], b[9]);
wolfSSL 16:8e0d178b1d1e 1573 #endif
wolfSSL 16:8e0d178b1d1e 1574 #if 1
wolfSSL 16:8e0d178b1d1e 1575 __asm__ __volatile__ (
wolfSSL 16:8e0d178b1d1e 1576 "{ r1 = memw(%[a]+#0) \n"
wolfSSL 16:8e0d178b1d1e 1577 " r2 = memw(%[b]+#0) }\n"
wolfSSL 16:8e0d178b1d1e 1578 "{ r3 = memw(%[a]+#4) \n"
wolfSSL 16:8e0d178b1d1e 1579 " r19 = sub(r1,r2) \n"
wolfSSL 16:8e0d178b1d1e 1580 " r4 = memw(%[b]+#4) }\n"
wolfSSL 16:8e0d178b1d1e 1581 "{ r5 = memw(%[a]+#8) \n"
wolfSSL 16:8e0d178b1d1e 1582 " r20 = sub(r3,r4) \n"
wolfSSL 16:8e0d178b1d1e 1583 " r6 = memw(%[b]+#8) }\n"
wolfSSL 16:8e0d178b1d1e 1584 "{ memw(%[r]+#0) = r19 }\n"
wolfSSL 16:8e0d178b1d1e 1585 "{ r7 = memw(%[a]+#12) \n"
wolfSSL 16:8e0d178b1d1e 1586 " r21 = sub(r5,r6) \n"
wolfSSL 16:8e0d178b1d1e 1587 " r8 = memw(%[b]+#12) }\n"
wolfSSL 16:8e0d178b1d1e 1588 "{ memw(%[r]+#4) = r20 }\n"
wolfSSL 16:8e0d178b1d1e 1589 "{ r9 = memw(%[a]+#16) \n"
wolfSSL 16:8e0d178b1d1e 1590 " r22 = sub(r7,r8) \n"
wolfSSL 16:8e0d178b1d1e 1591 " r10 = memw(%[b]+#16) }\n"
wolfSSL 16:8e0d178b1d1e 1592 "{ memw(%[r]+#8) = r21 }\n"
wolfSSL 16:8e0d178b1d1e 1593 "{ r11 = memw(%[a]+#20) \n"
wolfSSL 16:8e0d178b1d1e 1594 " r23 = sub(r9,r10) \n"
wolfSSL 16:8e0d178b1d1e 1595 " r12 = memw(%[b]+#20) }\n"
wolfSSL 16:8e0d178b1d1e 1596 "{ memw(%[r]+#12) = r22 }\n"
wolfSSL 16:8e0d178b1d1e 1597 "{ r13 = memw(%[a]+#24) \n"
wolfSSL 16:8e0d178b1d1e 1598 " r24 = sub(r11,r12) \n"
wolfSSL 16:8e0d178b1d1e 1599 " r14 = memw(%[b]+#24) }\n"
wolfSSL 16:8e0d178b1d1e 1600 "{ memw(%[r]+#16) = r23 }\n"
wolfSSL 16:8e0d178b1d1e 1601 "{ r15 = memw(%[a]+#28) \n"
wolfSSL 16:8e0d178b1d1e 1602 " r25 = sub(r13,r14) \n"
wolfSSL 16:8e0d178b1d1e 1603 " r16 = memw(%[b]+#28) }\n"
wolfSSL 16:8e0d178b1d1e 1604 "{ memw(%[r]+#20) = r24 }\n"
wolfSSL 16:8e0d178b1d1e 1605 "{ r17 = memw(%[a]+#32) \n"
wolfSSL 16:8e0d178b1d1e 1606 " r26 = sub(r15,r16) \n"
wolfSSL 16:8e0d178b1d1e 1607 " r18 = memw(%[b]+#32) }\n"
wolfSSL 16:8e0d178b1d1e 1608 "{ memw(%[r]+#24) = r25 }\n"
wolfSSL 16:8e0d178b1d1e 1609 "{ r5 = memw(%[a]+#36) \n"
wolfSSL 16:8e0d178b1d1e 1610 " r19 = sub(r17,r18) \n"
wolfSSL 16:8e0d178b1d1e 1611 " r6 = memw(%[b]+#36) }\n"
wolfSSL 16:8e0d178b1d1e 1612 "{ memw(%[r]+#28) = r26 }\n"
wolfSSL 16:8e0d178b1d1e 1613 "{ r20 = sub(r5,r6) \n"
wolfSSL 16:8e0d178b1d1e 1614 " memw(%[r]+#32) = r19 }\n"
wolfSSL 16:8e0d178b1d1e 1615 "{ memw(%[r]+#36) = r20 }\n"
wolfSSL 16:8e0d178b1d1e 1616 : [r] "+r" (r)
wolfSSL 16:8e0d178b1d1e 1617 : [a] "r"(a), [b] "r"(b)
wolfSSL 16:8e0d178b1d1e 1618 : "memory", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23", "r24", "r25", "r26"
wolfSSL 16:8e0d178b1d1e 1619 );
wolfSSL 16:8e0d178b1d1e 1620 #endif
wolfSSL 16:8e0d178b1d1e 1621 return 0;
wolfSSL 16:8e0d178b1d1e 1622 }
wolfSSL 16:8e0d178b1d1e 1623
wolfSSL 16:8e0d178b1d1e 1624 /* Conditionally add a and b using the mask m.
wolfSSL 16:8e0d178b1d1e 1625 * m is -1 to add and 0 when not.
wolfSSL 16:8e0d178b1d1e 1626 *
wolfSSL 16:8e0d178b1d1e 1627 * r A single precision number representing conditional add result.
wolfSSL 16:8e0d178b1d1e 1628 * a A single precision number to add with.
wolfSSL 16:8e0d178b1d1e 1629 * b A single precision number to add.
wolfSSL 16:8e0d178b1d1e 1630 * m Mask value to apply.
wolfSSL 16:8e0d178b1d1e 1631 */
wolfSSL 16:8e0d178b1d1e 1632 static void sp_256_cond_add_10(sp_digit* r, const sp_digit* a,
wolfSSL 16:8e0d178b1d1e 1633 const sp_digit* b, const sp_digit m)
wolfSSL 16:8e0d178b1d1e 1634 {
wolfSSL 16:8e0d178b1d1e 1635 #ifdef WOLFSSL_SP_SMALL
wolfSSL 16:8e0d178b1d1e 1636 int i;
wolfSSL 16:8e0d178b1d1e 1637
wolfSSL 16:8e0d178b1d1e 1638 for (i = 0; i < 10; i++) {
wolfSSL 16:8e0d178b1d1e 1639 r[i] = a[i] + (b[i] & m);
wolfSSL 16:8e0d178b1d1e 1640 }
wolfSSL 16:8e0d178b1d1e 1641 #else
wolfSSL 16:8e0d178b1d1e 1642 r[ 0] = Q6_R_add_RR(a[ 0], Q6_R_and_RR(b[ 0], m));
wolfSSL 16:8e0d178b1d1e 1643 r[ 1] = Q6_R_add_RR(a[ 1], Q6_R_and_RR(b[ 1], m));
wolfSSL 16:8e0d178b1d1e 1644 r[ 2] = Q6_R_add_RR(a[ 2], Q6_R_and_RR(b[ 2], m));
wolfSSL 16:8e0d178b1d1e 1645 r[ 3] = Q6_R_add_RR(a[ 3], Q6_R_and_RR(b[ 3], m));
wolfSSL 16:8e0d178b1d1e 1646 r[ 4] = Q6_R_add_RR(a[ 4], Q6_R_and_RR(b[ 4], m));
wolfSSL 16:8e0d178b1d1e 1647 r[ 5] = Q6_R_add_RR(a[ 5], Q6_R_and_RR(b[ 5], m));
wolfSSL 16:8e0d178b1d1e 1648 r[ 6] = Q6_R_add_RR(a[ 6], Q6_R_and_RR(b[ 6], m));
wolfSSL 16:8e0d178b1d1e 1649 r[ 7] = Q6_R_add_RR(a[ 7], Q6_R_and_RR(b[ 7], m));
wolfSSL 16:8e0d178b1d1e 1650 r[ 8] = Q6_R_add_RR(a[ 8], Q6_R_and_RR(b[ 8], m));
wolfSSL 16:8e0d178b1d1e 1651 r[ 9] = Q6_R_add_RR(a[ 9], Q6_R_and_RR(b[ 9], m));
wolfSSL 16:8e0d178b1d1e 1652 #endif /* WOLFSSL_SP_SMALL */
wolfSSL 16:8e0d178b1d1e 1653 }
wolfSSL 16:8e0d178b1d1e 1654
wolfSSL 16:8e0d178b1d1e 1655
wolfSSL 16:8e0d178b1d1e 1656 /* Subtract two Montgomery form numbers (r = a - b % m).
wolfSSL 16:8e0d178b1d1e 1657 *
wolfSSL 16:8e0d178b1d1e 1658 * r Result of subtration.
wolfSSL 16:8e0d178b1d1e 1659 * a Number to subtract from in Montogmery form.
wolfSSL 16:8e0d178b1d1e 1660 * b Number to subtract with in Montogmery form.
wolfSSL 16:8e0d178b1d1e 1661 * m Modulus (prime).
wolfSSL 16:8e0d178b1d1e 1662 */
wolfSSL 16:8e0d178b1d1e 1663 static void sp_256_mont_sub_10(sp_digit* r, const sp_digit* a, const sp_digit* b,
wolfSSL 16:8e0d178b1d1e 1664 const sp_digit* m)
wolfSSL 16:8e0d178b1d1e 1665 {
wolfSSL 16:8e0d178b1d1e 1666 (void)sp_256_sub_10(r, a, b);
wolfSSL 16:8e0d178b1d1e 1667 sp_256_cond_add_10(r, r, m, r[9] >> 22);
wolfSSL 16:8e0d178b1d1e 1668 sp_256_norm_10(r);
wolfSSL 16:8e0d178b1d1e 1669 }
wolfSSL 16:8e0d178b1d1e 1670
wolfSSL 16:8e0d178b1d1e 1671
wolfSSL 16:8e0d178b1d1e 1672 /* Shift number left one bit.
wolfSSL 16:8e0d178b1d1e 1673 * Bottom bit is lost.
wolfSSL 16:8e0d178b1d1e 1674 *
wolfSSL 16:8e0d178b1d1e 1675 * r Result of shift.
wolfSSL 16:8e0d178b1d1e 1676 * a Number to shift.
wolfSSL 16:8e0d178b1d1e 1677 */
wolfSSL 16:8e0d178b1d1e 1678 SP_NOINLINE static void sp_256_rshift1_10(sp_digit* r, sp_digit* a)
wolfSSL 16:8e0d178b1d1e 1679 {
wolfSSL 16:8e0d178b1d1e 1680 #ifdef WOLFSSL_SP_SMALL
wolfSSL 16:8e0d178b1d1e 1681 int i;
wolfSSL 16:8e0d178b1d1e 1682
wolfSSL 16:8e0d178b1d1e 1683 for (i=0; i<9; i++) {
wolfSSL 16:8e0d178b1d1e 1684 r[i] = ((a[i] >> 1) | (a[i + 1] << 25)) & 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 1685 }
wolfSSL 16:8e0d178b1d1e 1686 #else
wolfSSL 16:8e0d178b1d1e 1687 r[0] = ((a[0] >> 1) | Q6_R_and_RR((a[1] << 25), 0x3ffffff));
wolfSSL 16:8e0d178b1d1e 1688 r[1] = ((a[1] >> 1) | Q6_R_and_RR((a[2] << 25), 0x3ffffff));
wolfSSL 16:8e0d178b1d1e 1689 r[2] = ((a[2] >> 1) | Q6_R_and_RR((a[3] << 25), 0x3ffffff));
wolfSSL 16:8e0d178b1d1e 1690 r[3] = ((a[3] >> 1) | Q6_R_and_RR((a[4] << 25), 0x3ffffff));
wolfSSL 16:8e0d178b1d1e 1691 r[4] = ((a[4] >> 1) | Q6_R_and_RR((a[5] << 25), 0x3ffffff));
wolfSSL 16:8e0d178b1d1e 1692 r[5] = ((a[5] >> 1) | Q6_R_and_RR((a[6] << 25), 0x3ffffff));
wolfSSL 16:8e0d178b1d1e 1693 r[6] = ((a[6] >> 1) | Q6_R_and_RR((a[7] << 25), 0x3ffffff));
wolfSSL 16:8e0d178b1d1e 1694 r[7] = ((a[7] >> 1) | Q6_R_and_RR((a[8] << 25), 0x3ffffff));
wolfSSL 16:8e0d178b1d1e 1695 r[8] = ((a[8] >> 1) | Q6_R_and_RR((a[9] << 25), 0x3ffffff));
wolfSSL 16:8e0d178b1d1e 1696 #endif
wolfSSL 16:8e0d178b1d1e 1697 r[9] = a[9] >> 1;
wolfSSL 16:8e0d178b1d1e 1698 }
wolfSSL 16:8e0d178b1d1e 1699
wolfSSL 16:8e0d178b1d1e 1700
wolfSSL 16:8e0d178b1d1e 1701 /* Divide the number by 2 mod the modulus (prime). (r = a / 2 % m)
wolfSSL 16:8e0d178b1d1e 1702 *
wolfSSL 16:8e0d178b1d1e 1703 * r Result of division by 2.
wolfSSL 16:8e0d178b1d1e 1704 * a Number to divide.
wolfSSL 16:8e0d178b1d1e 1705 * m Modulus (prime).
wolfSSL 16:8e0d178b1d1e 1706 */
wolfSSL 16:8e0d178b1d1e 1707 static void sp_256_div2_10(sp_digit* r, const sp_digit* a, const sp_digit* m)
wolfSSL 16:8e0d178b1d1e 1708 {
wolfSSL 16:8e0d178b1d1e 1709 sp_256_cond_add_10(r, a, m, 0 - (a[0] & 1));
wolfSSL 16:8e0d178b1d1e 1710 sp_256_norm_10(r);
wolfSSL 16:8e0d178b1d1e 1711 sp_256_rshift1_10(r, r);
wolfSSL 16:8e0d178b1d1e 1712 }
wolfSSL 16:8e0d178b1d1e 1713
wolfSSL 16:8e0d178b1d1e 1714
wolfSSL 16:8e0d178b1d1e 1715 /* Double the Montgomery form projective point p.
wolfSSL 16:8e0d178b1d1e 1716 *
wolfSSL 16:8e0d178b1d1e 1717 * r Result of doubling point.
wolfSSL 16:8e0d178b1d1e 1718 * p Point to double.
wolfSSL 16:8e0d178b1d1e 1719 * t Temporary ordinate data.
wolfSSL 16:8e0d178b1d1e 1720 */
wolfSSL 16:8e0d178b1d1e 1721 static void sp_256_proj_point_dbl_10(sp_point* r, const sp_point* p, sp_digit* t)
wolfSSL 16:8e0d178b1d1e 1722 {
wolfSSL 16:8e0d178b1d1e 1723 sp_point* rp[2];
wolfSSL 16:8e0d178b1d1e 1724 sp_digit* t1 = t;
wolfSSL 16:8e0d178b1d1e 1725 sp_digit* t2 = t + 2*10;
wolfSSL 16:8e0d178b1d1e 1726 sp_digit* x;
wolfSSL 16:8e0d178b1d1e 1727 sp_digit* y;
wolfSSL 16:8e0d178b1d1e 1728 sp_digit* z;
wolfSSL 16:8e0d178b1d1e 1729 int i;
wolfSSL 16:8e0d178b1d1e 1730
wolfSSL 16:8e0d178b1d1e 1731 /* When infinity don't double point passed in - constant time. */
wolfSSL 16:8e0d178b1d1e 1732 rp[0] = r;
wolfSSL 16:8e0d178b1d1e 1733
wolfSSL 16:8e0d178b1d1e 1734 /*lint allow cast to different type of pointer*/
wolfSSL 16:8e0d178b1d1e 1735 rp[1] = (sp_point*)t; /*lint !e9087 !e740*/
wolfSSL 16:8e0d178b1d1e 1736 XMEMSET(rp[1], 0, sizeof(sp_point));
wolfSSL 16:8e0d178b1d1e 1737 x = rp[p->infinity]->x;
wolfSSL 16:8e0d178b1d1e 1738 y = rp[p->infinity]->y;
wolfSSL 16:8e0d178b1d1e 1739 z = rp[p->infinity]->z;
wolfSSL 16:8e0d178b1d1e 1740 /* Put point to double into result - good for infinity. */
wolfSSL 16:8e0d178b1d1e 1741 if (r != p) {
wolfSSL 16:8e0d178b1d1e 1742 for (i=0; i<10; i++) {
wolfSSL 16:8e0d178b1d1e 1743 r->x[i] = p->x[i];
wolfSSL 16:8e0d178b1d1e 1744 }
wolfSSL 16:8e0d178b1d1e 1745 for (i=0; i<10; i++) {
wolfSSL 16:8e0d178b1d1e 1746 r->y[i] = p->y[i];
wolfSSL 16:8e0d178b1d1e 1747 }
wolfSSL 16:8e0d178b1d1e 1748 for (i=0; i<10; i++) {
wolfSSL 16:8e0d178b1d1e 1749 r->z[i] = p->z[i];
wolfSSL 16:8e0d178b1d1e 1750 }
wolfSSL 16:8e0d178b1d1e 1751 r->infinity = p->infinity;
wolfSSL 16:8e0d178b1d1e 1752 }
wolfSSL 16:8e0d178b1d1e 1753
wolfSSL 16:8e0d178b1d1e 1754 /* T1 = Z * Z */
wolfSSL 16:8e0d178b1d1e 1755 sp_256_mont_sqr_10(t1, z, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 1756 /* Z = Y * Z */
wolfSSL 16:8e0d178b1d1e 1757 sp_256_mont_mul_10(z, y, z, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 1758 /* Z = 2Z */
wolfSSL 16:8e0d178b1d1e 1759 sp_256_mont_dbl_10(z, z, p256_mod);
wolfSSL 16:8e0d178b1d1e 1760 /* T2 = X - T1 */
wolfSSL 16:8e0d178b1d1e 1761 sp_256_mont_sub_10(t2, x, t1, p256_mod);
wolfSSL 16:8e0d178b1d1e 1762 /* T1 = X + T1 */
wolfSSL 16:8e0d178b1d1e 1763 sp_256_mont_add_10(t1, x, t1, p256_mod);
wolfSSL 16:8e0d178b1d1e 1764 /* T2 = T1 * T2 */
wolfSSL 16:8e0d178b1d1e 1765 sp_256_mont_mul_10(t2, t1, t2, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 1766 /* T1 = 3T2 */
wolfSSL 16:8e0d178b1d1e 1767 sp_256_mont_tpl_10(t1, t2, p256_mod);
wolfSSL 16:8e0d178b1d1e 1768 /* Y = 2Y */
wolfSSL 16:8e0d178b1d1e 1769 sp_256_mont_dbl_10(y, y, p256_mod);
wolfSSL 16:8e0d178b1d1e 1770 /* Y = Y * Y */
wolfSSL 16:8e0d178b1d1e 1771 sp_256_mont_sqr_10(y, y, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 1772 /* T2 = Y * Y */
wolfSSL 16:8e0d178b1d1e 1773 sp_256_mont_sqr_10(t2, y, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 1774 /* T2 = T2/2 */
wolfSSL 16:8e0d178b1d1e 1775 sp_256_div2_10(t2, t2, p256_mod);
wolfSSL 16:8e0d178b1d1e 1776 /* Y = Y * X */
wolfSSL 16:8e0d178b1d1e 1777 sp_256_mont_mul_10(y, y, x, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 1778 /* X = T1 * T1 */
wolfSSL 16:8e0d178b1d1e 1779 sp_256_mont_mul_10(x, t1, t1, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 1780 /* X = X - Y */
wolfSSL 16:8e0d178b1d1e 1781 sp_256_mont_sub_10(x, x, y, p256_mod);
wolfSSL 16:8e0d178b1d1e 1782 /* X = X - Y */
wolfSSL 16:8e0d178b1d1e 1783 sp_256_mont_sub_10(x, x, y, p256_mod);
wolfSSL 16:8e0d178b1d1e 1784 /* Y = Y - X */
wolfSSL 16:8e0d178b1d1e 1785 sp_256_mont_sub_10(y, y, x, p256_mod);
wolfSSL 16:8e0d178b1d1e 1786 /* Y = Y * T1 */
wolfSSL 16:8e0d178b1d1e 1787 sp_256_mont_mul_10(y, y, t1, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 1788 /* Y = Y - T2 */
wolfSSL 16:8e0d178b1d1e 1789 sp_256_mont_sub_10(y, y, t2, p256_mod);
wolfSSL 16:8e0d178b1d1e 1790
wolfSSL 16:8e0d178b1d1e 1791 }
wolfSSL 16:8e0d178b1d1e 1792
wolfSSL 16:8e0d178b1d1e 1793
wolfSSL 16:8e0d178b1d1e 1794 /* Compare two numbers to determine if they are equal.
wolfSSL 16:8e0d178b1d1e 1795 * Constant time implementation.
wolfSSL 16:8e0d178b1d1e 1796 *
wolfSSL 16:8e0d178b1d1e 1797 * a First number to compare.
wolfSSL 16:8e0d178b1d1e 1798 * b Second number to compare.
wolfSSL 16:8e0d178b1d1e 1799 * returns 1 when equal and 0 otherwise.
wolfSSL 16:8e0d178b1d1e 1800 */
wolfSSL 16:8e0d178b1d1e 1801 static int sp_256_cmp_equal_10(const sp_digit* a, const sp_digit* b)
wolfSSL 16:8e0d178b1d1e 1802 {
wolfSSL 16:8e0d178b1d1e 1803 return ((a[0] ^ b[0]) | (a[1] ^ b[1]) | (a[2] ^ b[2]) | (a[3] ^ b[3]) |
wolfSSL 16:8e0d178b1d1e 1804 (a[4] ^ b[4]) | (a[5] ^ b[5]) | (a[6] ^ b[6]) | (a[7] ^ b[7]) |
wolfSSL 16:8e0d178b1d1e 1805 (a[8] ^ b[8]) | (a[9] ^ b[9])) == 0;
wolfSSL 16:8e0d178b1d1e 1806 }
wolfSSL 16:8e0d178b1d1e 1807
wolfSSL 16:8e0d178b1d1e 1808 /* Add two Montgomery form projective points.
wolfSSL 16:8e0d178b1d1e 1809 *
wolfSSL 16:8e0d178b1d1e 1810 * r Result of addition.
wolfSSL 16:8e0d178b1d1e 1811 * p First point to add.
wolfSSL 16:8e0d178b1d1e 1812 * q Second point to add.
wolfSSL 16:8e0d178b1d1e 1813 * t Temporary ordinate data.
wolfSSL 16:8e0d178b1d1e 1814 */
wolfSSL 16:8e0d178b1d1e 1815 static void sp_256_proj_point_add_10(sp_point* r, const sp_point* p, const sp_point* q,
wolfSSL 16:8e0d178b1d1e 1816 sp_digit* t)
wolfSSL 16:8e0d178b1d1e 1817 {
wolfSSL 16:8e0d178b1d1e 1818 const sp_point* ap[2];
wolfSSL 16:8e0d178b1d1e 1819 sp_point* rp[2];
wolfSSL 16:8e0d178b1d1e 1820 sp_digit* t1 = t;
wolfSSL 16:8e0d178b1d1e 1821 sp_digit* t2 = t + 2*10;
wolfSSL 16:8e0d178b1d1e 1822 sp_digit* t3 = t + 4*10;
wolfSSL 16:8e0d178b1d1e 1823 sp_digit* t4 = t + 6*10;
wolfSSL 16:8e0d178b1d1e 1824 sp_digit* t5 = t + 8*10;
wolfSSL 16:8e0d178b1d1e 1825 sp_digit* x;
wolfSSL 16:8e0d178b1d1e 1826 sp_digit* y;
wolfSSL 16:8e0d178b1d1e 1827 sp_digit* z;
wolfSSL 16:8e0d178b1d1e 1828 int i;
wolfSSL 16:8e0d178b1d1e 1829
wolfSSL 16:8e0d178b1d1e 1830 /* Ensure only the first point is the same as the result. */
wolfSSL 16:8e0d178b1d1e 1831 if (q == r) {
wolfSSL 16:8e0d178b1d1e 1832 const sp_point* a = p;
wolfSSL 16:8e0d178b1d1e 1833 p = q;
wolfSSL 16:8e0d178b1d1e 1834 q = a;
wolfSSL 16:8e0d178b1d1e 1835 }
wolfSSL 16:8e0d178b1d1e 1836
wolfSSL 16:8e0d178b1d1e 1837 /* Check double */
wolfSSL 16:8e0d178b1d1e 1838 (void)sp_256_sub_10(t1, p256_mod, q->y);
wolfSSL 16:8e0d178b1d1e 1839 sp_256_norm_10(t1);
wolfSSL 16:8e0d178b1d1e 1840 if ((sp_256_cmp_equal_10(p->x, q->x) & sp_256_cmp_equal_10(p->z, q->z) &
wolfSSL 16:8e0d178b1d1e 1841 (sp_256_cmp_equal_10(p->y, q->y) | sp_256_cmp_equal_10(p->y, t1))) != 0) {
wolfSSL 16:8e0d178b1d1e 1842 sp_256_proj_point_dbl_10(r, p, t);
wolfSSL 16:8e0d178b1d1e 1843 }
wolfSSL 16:8e0d178b1d1e 1844 else {
wolfSSL 16:8e0d178b1d1e 1845 rp[0] = r;
wolfSSL 16:8e0d178b1d1e 1846
wolfSSL 16:8e0d178b1d1e 1847 /*lint allow cast to different type of pointer*/
wolfSSL 16:8e0d178b1d1e 1848 rp[1] = (sp_point*)t; /*lint !e9087 !e740*/
wolfSSL 16:8e0d178b1d1e 1849 XMEMSET(rp[1], 0, sizeof(sp_point));
wolfSSL 16:8e0d178b1d1e 1850 x = rp[p->infinity | q->infinity]->x;
wolfSSL 16:8e0d178b1d1e 1851 y = rp[p->infinity | q->infinity]->y;
wolfSSL 16:8e0d178b1d1e 1852 z = rp[p->infinity | q->infinity]->z;
wolfSSL 16:8e0d178b1d1e 1853
wolfSSL 16:8e0d178b1d1e 1854 ap[0] = p;
wolfSSL 16:8e0d178b1d1e 1855 ap[1] = q;
wolfSSL 16:8e0d178b1d1e 1856 for (i=0; i<10; i++) {
wolfSSL 16:8e0d178b1d1e 1857 r->x[i] = ap[p->infinity]->x[i];
wolfSSL 16:8e0d178b1d1e 1858 }
wolfSSL 16:8e0d178b1d1e 1859 for (i=0; i<10; i++) {
wolfSSL 16:8e0d178b1d1e 1860 r->y[i] = ap[p->infinity]->y[i];
wolfSSL 16:8e0d178b1d1e 1861 }
wolfSSL 16:8e0d178b1d1e 1862 for (i=0; i<10; i++) {
wolfSSL 16:8e0d178b1d1e 1863 r->z[i] = ap[p->infinity]->z[i];
wolfSSL 16:8e0d178b1d1e 1864 }
wolfSSL 16:8e0d178b1d1e 1865 r->infinity = ap[p->infinity]->infinity;
wolfSSL 16:8e0d178b1d1e 1866
wolfSSL 16:8e0d178b1d1e 1867 /* U1 = X1*Z2^2 */
wolfSSL 16:8e0d178b1d1e 1868 sp_256_mont_sqr_10(t1, q->z, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 1869 sp_256_mont_mul_10(t3, t1, q->z, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 1870 sp_256_mont_mul_10(t1, t1, x, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 1871 /* U2 = X2*Z1^2 */
wolfSSL 16:8e0d178b1d1e 1872 sp_256_mont_sqr_10(t2, z, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 1873 sp_256_mont_mul_10(t4, t2, z, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 1874 sp_256_mont_mul_10(t2, t2, q->x, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 1875 /* S1 = Y1*Z2^3 */
wolfSSL 16:8e0d178b1d1e 1876 sp_256_mont_mul_10(t3, t3, y, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 1877 /* S2 = Y2*Z1^3 */
wolfSSL 16:8e0d178b1d1e 1878 sp_256_mont_mul_10(t4, t4, q->y, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 1879 /* H = U2 - U1 */
wolfSSL 16:8e0d178b1d1e 1880 sp_256_mont_sub_10(t2, t2, t1, p256_mod);
wolfSSL 16:8e0d178b1d1e 1881 /* R = S2 - S1 */
wolfSSL 16:8e0d178b1d1e 1882 sp_256_mont_sub_10(t4, t4, t3, p256_mod);
wolfSSL 16:8e0d178b1d1e 1883 /* Z3 = H*Z1*Z2 */
wolfSSL 16:8e0d178b1d1e 1884 sp_256_mont_mul_10(z, z, q->z, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 1885 sp_256_mont_mul_10(z, z, t2, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 1886 /* X3 = R^2 - H^3 - 2*U1*H^2 */
wolfSSL 16:8e0d178b1d1e 1887 sp_256_mont_sqr_10(x, t4, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 1888 sp_256_mont_sqr_10(t5, t2, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 1889 sp_256_mont_mul_10(y, t1, t5, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 1890 sp_256_mont_mul_10(t5, t5, t2, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 1891 sp_256_mont_sub_10(x, x, t5, p256_mod);
wolfSSL 16:8e0d178b1d1e 1892 sp_256_mont_dbl_10(t1, y, p256_mod);
wolfSSL 16:8e0d178b1d1e 1893 sp_256_mont_sub_10(x, x, t1, p256_mod);
wolfSSL 16:8e0d178b1d1e 1894 /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */
wolfSSL 16:8e0d178b1d1e 1895 sp_256_mont_sub_10(y, y, x, p256_mod);
wolfSSL 16:8e0d178b1d1e 1896 sp_256_mont_mul_10(y, y, t4, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 1897 sp_256_mont_mul_10(t5, t5, t3, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 1898 sp_256_mont_sub_10(y, y, t5, p256_mod);
wolfSSL 16:8e0d178b1d1e 1899 }
wolfSSL 16:8e0d178b1d1e 1900 }
wolfSSL 16:8e0d178b1d1e 1901
wolfSSL 16:8e0d178b1d1e 1902 #ifdef WOLFSSL_SP_SMALL
wolfSSL 16:8e0d178b1d1e 1903 /* Multiply the point by the scalar and return the result.
wolfSSL 16:8e0d178b1d1e 1904 * If map is true then convert result to affine co-ordinates.
wolfSSL 16:8e0d178b1d1e 1905 *
wolfSSL 16:8e0d178b1d1e 1906 * r Resulting point.
wolfSSL 16:8e0d178b1d1e 1907 * g Point to multiply.
wolfSSL 16:8e0d178b1d1e 1908 * k Scalar to multiply by.
wolfSSL 16:8e0d178b1d1e 1909 * map Indicates whether to convert result to affine.
wolfSSL 16:8e0d178b1d1e 1910 * heap Heap to use for allocation.
wolfSSL 16:8e0d178b1d1e 1911 * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
wolfSSL 16:8e0d178b1d1e 1912 */
wolfSSL 16:8e0d178b1d1e 1913 static int sp_256_ecc_mulmod_10(sp_point* r, const sp_point* g, const sp_digit* k,
wolfSSL 16:8e0d178b1d1e 1914 int map, void* heap)
wolfSSL 16:8e0d178b1d1e 1915 {
wolfSSL 16:8e0d178b1d1e 1916 sp_point* td;
wolfSSL 16:8e0d178b1d1e 1917 sp_point* t[3];
wolfSSL 16:8e0d178b1d1e 1918 sp_digit* tmp;
wolfSSL 16:8e0d178b1d1e 1919 sp_digit n;
wolfSSL 16:8e0d178b1d1e 1920 int i;
wolfSSL 16:8e0d178b1d1e 1921 int c, y;
wolfSSL 16:8e0d178b1d1e 1922 int err = MP_OKAY;
wolfSSL 16:8e0d178b1d1e 1923
wolfSSL 16:8e0d178b1d1e 1924 (void)heap;
wolfSSL 16:8e0d178b1d1e 1925
wolfSSL 16:8e0d178b1d1e 1926 td = (sp_point*)XMALLOC(sizeof(sp_point) * 3, heap, DYNAMIC_TYPE_ECC);
wolfSSL 16:8e0d178b1d1e 1927 if (td == NULL)
wolfSSL 16:8e0d178b1d1e 1928 err = MEMORY_E;
wolfSSL 16:8e0d178b1d1e 1929 tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 10 * 5, heap,
wolfSSL 16:8e0d178b1d1e 1930 DYNAMIC_TYPE_ECC);
wolfSSL 16:8e0d178b1d1e 1931 if (tmp == NULL)
wolfSSL 16:8e0d178b1d1e 1932 err = MEMORY_E;
wolfSSL 16:8e0d178b1d1e 1933
wolfSSL 16:8e0d178b1d1e 1934 if (err == MP_OKAY) {
wolfSSL 16:8e0d178b1d1e 1935 XMEMSET(td, 0, sizeof(*td) * 3);
wolfSSL 16:8e0d178b1d1e 1936
wolfSSL 16:8e0d178b1d1e 1937 t[0] = &td[0];
wolfSSL 16:8e0d178b1d1e 1938 t[1] = &td[1];
wolfSSL 16:8e0d178b1d1e 1939 t[2] = &td[2];
wolfSSL 16:8e0d178b1d1e 1940
wolfSSL 16:8e0d178b1d1e 1941 /* t[0] = {0, 0, 1} * norm */
wolfSSL 16:8e0d178b1d1e 1942 t[0]->infinity = 1;
wolfSSL 16:8e0d178b1d1e 1943 /* t[1] = {g->x, g->y, g->z} * norm */
wolfSSL 16:8e0d178b1d1e 1944 err = sp_256_mod_mul_norm_10(t[1]->x, g->x, p256_mod);
wolfSSL 16:8e0d178b1d1e 1945 }
wolfSSL 16:8e0d178b1d1e 1946 if (err == MP_OKAY)
wolfSSL 16:8e0d178b1d1e 1947 err = sp_256_mod_mul_norm_10(t[1]->y, g->y, p256_mod);
wolfSSL 16:8e0d178b1d1e 1948 if (err == MP_OKAY)
wolfSSL 16:8e0d178b1d1e 1949 err = sp_256_mod_mul_norm_10(t[1]->z, g->z, p256_mod);
wolfSSL 16:8e0d178b1d1e 1950
wolfSSL 16:8e0d178b1d1e 1951 if (err == MP_OKAY) {
wolfSSL 16:8e0d178b1d1e 1952 i = 9;
wolfSSL 16:8e0d178b1d1e 1953 c = 22;
wolfSSL 16:8e0d178b1d1e 1954 n = k[i--] << (26 - c);
wolfSSL 16:8e0d178b1d1e 1955 for (; ; c--) {
wolfSSL 16:8e0d178b1d1e 1956 if (c == 0) {
wolfSSL 16:8e0d178b1d1e 1957 if (i == -1)
wolfSSL 16:8e0d178b1d1e 1958 break;
wolfSSL 16:8e0d178b1d1e 1959
wolfSSL 16:8e0d178b1d1e 1960 n = k[i--];
wolfSSL 16:8e0d178b1d1e 1961 c = 26;
wolfSSL 16:8e0d178b1d1e 1962 }
wolfSSL 16:8e0d178b1d1e 1963
wolfSSL 16:8e0d178b1d1e 1964 y = (n >> 25) & 1;
wolfSSL 16:8e0d178b1d1e 1965 n <<= 1;
wolfSSL 16:8e0d178b1d1e 1966
wolfSSL 16:8e0d178b1d1e 1967 sp_256_proj_point_add_10(t[y^1], t[0], t[1], tmp);
wolfSSL 16:8e0d178b1d1e 1968
wolfSSL 16:8e0d178b1d1e 1969 XMEMCPY(t[2], (void*)(((size_t)t[0] & addr_mask[y^1]) +
wolfSSL 16:8e0d178b1d1e 1970 ((size_t)t[1] & addr_mask[y])),
wolfSSL 16:8e0d178b1d1e 1971 sizeof(sp_point));
wolfSSL 16:8e0d178b1d1e 1972 sp_256_proj_point_dbl_10(t[2], t[2], tmp);
wolfSSL 16:8e0d178b1d1e 1973 XMEMCPY((void*)(((size_t)t[0] & addr_mask[y^1]) +
wolfSSL 16:8e0d178b1d1e 1974 ((size_t)t[1] & addr_mask[y])), t[2],
wolfSSL 16:8e0d178b1d1e 1975 sizeof(sp_point));
wolfSSL 16:8e0d178b1d1e 1976 }
wolfSSL 16:8e0d178b1d1e 1977
wolfSSL 16:8e0d178b1d1e 1978 if (map != 0) {
wolfSSL 16:8e0d178b1d1e 1979 sp_256_map_10(r, t[0], tmp);
wolfSSL 16:8e0d178b1d1e 1980 }
wolfSSL 16:8e0d178b1d1e 1981 else {
wolfSSL 16:8e0d178b1d1e 1982 XMEMCPY(r, t[0], sizeof(sp_point));
wolfSSL 16:8e0d178b1d1e 1983 }
wolfSSL 16:8e0d178b1d1e 1984 }
wolfSSL 16:8e0d178b1d1e 1985
wolfSSL 16:8e0d178b1d1e 1986 if (tmp != NULL) {
wolfSSL 16:8e0d178b1d1e 1987 XMEMSET(tmp, 0, sizeof(sp_digit) * 2 * 10 * 5);
wolfSSL 16:8e0d178b1d1e 1988 XFREE(tmp, NULL, DYNAMIC_TYPE_ECC);
wolfSSL 16:8e0d178b1d1e 1989 }
wolfSSL 16:8e0d178b1d1e 1990 if (td != NULL) {
wolfSSL 16:8e0d178b1d1e 1991 XMEMSET(td, 0, sizeof(sp_point) * 3);
wolfSSL 16:8e0d178b1d1e 1992 XFREE(td, NULL, DYNAMIC_TYPE_ECC);
wolfSSL 16:8e0d178b1d1e 1993 }
wolfSSL 16:8e0d178b1d1e 1994
wolfSSL 16:8e0d178b1d1e 1995 return err;
wolfSSL 16:8e0d178b1d1e 1996 }
wolfSSL 16:8e0d178b1d1e 1997
wolfSSL 16:8e0d178b1d1e 1998 #elif defined(WOLFSSL_SP_CACHE_RESISTANT)
wolfSSL 16:8e0d178b1d1e 1999 /* Multiply the point by the scalar and return the result.
wolfSSL 16:8e0d178b1d1e 2000 * If map is true then convert result to affine co-ordinates.
wolfSSL 16:8e0d178b1d1e 2001 *
wolfSSL 16:8e0d178b1d1e 2002 * r Resulting point.
wolfSSL 16:8e0d178b1d1e 2003 * g Point to multiply.
wolfSSL 16:8e0d178b1d1e 2004 * k Scalar to multiply by.
wolfSSL 16:8e0d178b1d1e 2005 * map Indicates whether to convert result to affine.
wolfSSL 16:8e0d178b1d1e 2006 * heap Heap to use for allocation.
wolfSSL 16:8e0d178b1d1e 2007 * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
wolfSSL 16:8e0d178b1d1e 2008 */
wolfSSL 16:8e0d178b1d1e 2009 static int sp_256_ecc_mulmod_10(sp_point* r, const sp_point* g, const sp_digit* k,
wolfSSL 16:8e0d178b1d1e 2010 int map, void* heap)
wolfSSL 16:8e0d178b1d1e 2011 {
wolfSSL 16:8e0d178b1d1e 2012 #if !defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SMALL_STACK)
wolfSSL 16:8e0d178b1d1e 2013 sp_point td[3];
wolfSSL 16:8e0d178b1d1e 2014 sp_digit tmpd[2 * 10 * 5];
wolfSSL 16:8e0d178b1d1e 2015 #endif
wolfSSL 16:8e0d178b1d1e 2016 sp_point* t;
wolfSSL 16:8e0d178b1d1e 2017 sp_digit* tmp;
wolfSSL 16:8e0d178b1d1e 2018 sp_digit n;
wolfSSL 16:8e0d178b1d1e 2019 int i;
wolfSSL 16:8e0d178b1d1e 2020 int c, y;
wolfSSL 16:8e0d178b1d1e 2021 int err = MP_OKAY;
wolfSSL 16:8e0d178b1d1e 2022
wolfSSL 16:8e0d178b1d1e 2023 (void)heap;
wolfSSL 16:8e0d178b1d1e 2024
wolfSSL 16:8e0d178b1d1e 2025 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)
wolfSSL 16:8e0d178b1d1e 2026 sp_point td[3];
wolfSSL 16:8e0d178b1d1e 2027 t = (sp_point*)XMALLOC(sizeof(*td) * 3, heap, DYNAMIC_TYPE_ECC);
wolfSSL 16:8e0d178b1d1e 2028 if (t == NULL)
wolfSSL 16:8e0d178b1d1e 2029 err = MEMORY_E;
wolfSSL 16:8e0d178b1d1e 2030 tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 10 * 5, heap,
wolfSSL 16:8e0d178b1d1e 2031 DYNAMIC_TYPE_ECC);
wolfSSL 16:8e0d178b1d1e 2032 if (tmp == NULL)
wolfSSL 16:8e0d178b1d1e 2033 err = MEMORY_E;
wolfSSL 16:8e0d178b1d1e 2034 #else
wolfSSL 16:8e0d178b1d1e 2035 t = td;
wolfSSL 16:8e0d178b1d1e 2036 tmp = tmpd;
wolfSSL 16:8e0d178b1d1e 2037 #endif
wolfSSL 16:8e0d178b1d1e 2038
wolfSSL 16:8e0d178b1d1e 2039 if (err == MP_OKAY) {
wolfSSL 16:8e0d178b1d1e 2040 t[0] = &td[0];
wolfSSL 16:8e0d178b1d1e 2041 t[1] = &td[1];
wolfSSL 16:8e0d178b1d1e 2042 t[2] = &td[2];
wolfSSL 16:8e0d178b1d1e 2043
wolfSSL 16:8e0d178b1d1e 2044 /* t[0] = {0, 0, 1} * norm */
wolfSSL 16:8e0d178b1d1e 2045 XMEMSET(&t[0], 0, sizeof(t[0]));
wolfSSL 16:8e0d178b1d1e 2046 t[0].infinity = 1;
wolfSSL 16:8e0d178b1d1e 2047 /* t[1] = {g->x, g->y, g->z} * norm */
wolfSSL 16:8e0d178b1d1e 2048 err = sp_256_mod_mul_norm_10(t[1].x, g->x, p256_mod);
wolfSSL 16:8e0d178b1d1e 2049 }
wolfSSL 16:8e0d178b1d1e 2050 if (err == MP_OKAY)
wolfSSL 16:8e0d178b1d1e 2051 err = sp_256_mod_mul_norm_10(t[1].y, g->y, p256_mod);
wolfSSL 16:8e0d178b1d1e 2052 if (err == MP_OKAY)
wolfSSL 16:8e0d178b1d1e 2053 err = sp_256_mod_mul_norm_10(t[1].z, g->z, p256_mod);
wolfSSL 16:8e0d178b1d1e 2054
wolfSSL 16:8e0d178b1d1e 2055 if (err == MP_OKAY) {
wolfSSL 16:8e0d178b1d1e 2056 i = 9;
wolfSSL 16:8e0d178b1d1e 2057 c = 22;
wolfSSL 16:8e0d178b1d1e 2058 n = k[i--] << (26 - c);
wolfSSL 16:8e0d178b1d1e 2059 for (; ; c--) {
wolfSSL 16:8e0d178b1d1e 2060 if (c == 0) {
wolfSSL 16:8e0d178b1d1e 2061 if (i == -1)
wolfSSL 16:8e0d178b1d1e 2062 break;
wolfSSL 16:8e0d178b1d1e 2063
wolfSSL 16:8e0d178b1d1e 2064 n = k[i--];
wolfSSL 16:8e0d178b1d1e 2065 c = 26;
wolfSSL 16:8e0d178b1d1e 2066 }
wolfSSL 16:8e0d178b1d1e 2067
wolfSSL 16:8e0d178b1d1e 2068 y = (n >> 25) & 1;
wolfSSL 16:8e0d178b1d1e 2069 n <<= 1;
wolfSSL 16:8e0d178b1d1e 2070
wolfSSL 16:8e0d178b1d1e 2071 sp_256_proj_point_add_10(&t[y^1], &t[0], &t[1], tmp);
wolfSSL 16:8e0d178b1d1e 2072
wolfSSL 16:8e0d178b1d1e 2073 XMEMCPY(&t[2], (void*)(((size_t)&t[0] & addr_mask[y^1]) +
wolfSSL 16:8e0d178b1d1e 2074 ((size_t)&t[1] & addr_mask[y])), sizeof(t[2]));
wolfSSL 16:8e0d178b1d1e 2075 sp_256_proj_point_dbl_10(&t[2], &t[2], tmp);
wolfSSL 16:8e0d178b1d1e 2076 XMEMCPY((void*)(((size_t)&t[0] & addr_mask[y^1]) +
wolfSSL 16:8e0d178b1d1e 2077 ((size_t)&t[1] & addr_mask[y])), &t[2], sizeof(t[2]));
wolfSSL 16:8e0d178b1d1e 2078 }
wolfSSL 16:8e0d178b1d1e 2079
wolfSSL 16:8e0d178b1d1e 2080 if (map != 0) {
wolfSSL 16:8e0d178b1d1e 2081 sp_256_map_10(r, &t[0], tmp);
wolfSSL 16:8e0d178b1d1e 2082 }
wolfSSL 16:8e0d178b1d1e 2083 else {
wolfSSL 16:8e0d178b1d1e 2084 XMEMCPY(r, &t[0], sizeof(sp_point));
wolfSSL 16:8e0d178b1d1e 2085 }
wolfSSL 16:8e0d178b1d1e 2086 }
wolfSSL 16:8e0d178b1d1e 2087
wolfSSL 16:8e0d178b1d1e 2088 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)
wolfSSL 16:8e0d178b1d1e 2089 if (tmp != NULL) {
wolfSSL 16:8e0d178b1d1e 2090 XMEMSET(tmp, 0, sizeof(sp_digit) * 2 * 10 * 5);
wolfSSL 16:8e0d178b1d1e 2091 XFREE(tmp, heap, DYNAMIC_TYPE_ECC);
wolfSSL 16:8e0d178b1d1e 2092 }
wolfSSL 16:8e0d178b1d1e 2093 if (t != NULL) {
wolfSSL 16:8e0d178b1d1e 2094 XMEMSET(t, 0, sizeof(sp_point) * 3);
wolfSSL 16:8e0d178b1d1e 2095 XFREE(t, heap, DYNAMIC_TYPE_ECC);
wolfSSL 16:8e0d178b1d1e 2096 }
wolfSSL 16:8e0d178b1d1e 2097 #else
wolfSSL 16:8e0d178b1d1e 2098 ForceZero(tmpd, sizeof(tmpd));
wolfSSL 16:8e0d178b1d1e 2099 ForceZero(td, sizeof(td));
wolfSSL 16:8e0d178b1d1e 2100 #endif
wolfSSL 16:8e0d178b1d1e 2101
wolfSSL 16:8e0d178b1d1e 2102 return err;
wolfSSL 16:8e0d178b1d1e 2103 }
wolfSSL 16:8e0d178b1d1e 2104
wolfSSL 16:8e0d178b1d1e 2105 #else
wolfSSL 16:8e0d178b1d1e 2106 /* A table entry for pre-computed points. */
wolfSSL 16:8e0d178b1d1e 2107 typedef struct sp_table_entry {
wolfSSL 16:8e0d178b1d1e 2108 sp_digit x[10] __attribute__((aligned(128)));
wolfSSL 16:8e0d178b1d1e 2109 sp_digit y[10] __attribute__((aligned(128)));
wolfSSL 16:8e0d178b1d1e 2110 } sp_table_entry;
wolfSSL 16:8e0d178b1d1e 2111
wolfSSL 16:8e0d178b1d1e 2112 /* Multiply the point by the scalar and return the result.
wolfSSL 16:8e0d178b1d1e 2113 * If map is true then convert result to affine co-ordinates.
wolfSSL 16:8e0d178b1d1e 2114 *
wolfSSL 16:8e0d178b1d1e 2115 * r Resulting point.
wolfSSL 16:8e0d178b1d1e 2116 * g Point to multiply.
wolfSSL 16:8e0d178b1d1e 2117 * k Scalar to multiply by.
wolfSSL 16:8e0d178b1d1e 2118 * map Indicates whether to convert result to affine.
wolfSSL 16:8e0d178b1d1e 2119 * heap Heap to use for allocation.
wolfSSL 16:8e0d178b1d1e 2120 * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
wolfSSL 16:8e0d178b1d1e 2121 */
wolfSSL 16:8e0d178b1d1e 2122 static int sp_256_ecc_mulmod_fast_10(sp_point* r, const sp_point* g, const sp_digit* k,
wolfSSL 16:8e0d178b1d1e 2123 int map, void* heap)
wolfSSL 16:8e0d178b1d1e 2124 {
wolfSSL 16:8e0d178b1d1e 2125 #if !defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SMALL_STACK)
wolfSSL 16:8e0d178b1d1e 2126 sp_point td[16];
wolfSSL 16:8e0d178b1d1e 2127 sp_point rtd;
wolfSSL 16:8e0d178b1d1e 2128 sp_digit tmpd[2 * 10 * 5];
wolfSSL 16:8e0d178b1d1e 2129 #endif
wolfSSL 16:8e0d178b1d1e 2130 sp_point* t;
wolfSSL 16:8e0d178b1d1e 2131 sp_point* rt;
wolfSSL 16:8e0d178b1d1e 2132 sp_digit* tmp;
wolfSSL 16:8e0d178b1d1e 2133 sp_digit n;
wolfSSL 16:8e0d178b1d1e 2134 int i;
wolfSSL 16:8e0d178b1d1e 2135 int c, y;
wolfSSL 16:8e0d178b1d1e 2136 int err;
wolfSSL 16:8e0d178b1d1e 2137
wolfSSL 16:8e0d178b1d1e 2138 (void)heap;
wolfSSL 16:8e0d178b1d1e 2139
wolfSSL 16:8e0d178b1d1e 2140 err = sp_ecc_point_new(heap, rtd, rt);
wolfSSL 16:8e0d178b1d1e 2141 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)
wolfSSL 16:8e0d178b1d1e 2142 t = (sp_point*)XMALLOC(sizeof(sp_point) * 16, heap, DYNAMIC_TYPE_ECC);
wolfSSL 16:8e0d178b1d1e 2143 if (t == NULL)
wolfSSL 16:8e0d178b1d1e 2144 err = MEMORY_E;
wolfSSL 16:8e0d178b1d1e 2145 tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 10 * 5, heap,
wolfSSL 16:8e0d178b1d1e 2146 DYNAMIC_TYPE_ECC);
wolfSSL 16:8e0d178b1d1e 2147 if (tmp == NULL)
wolfSSL 16:8e0d178b1d1e 2148 err = MEMORY_E;
wolfSSL 16:8e0d178b1d1e 2149 #else
wolfSSL 16:8e0d178b1d1e 2150 t = td;
wolfSSL 16:8e0d178b1d1e 2151 tmp = tmpd;
wolfSSL 16:8e0d178b1d1e 2152 #endif
wolfSSL 16:8e0d178b1d1e 2153
wolfSSL 16:8e0d178b1d1e 2154 if (err == MP_OKAY) {
wolfSSL 16:8e0d178b1d1e 2155 /* t[0] = {0, 0, 1} * norm */
wolfSSL 16:8e0d178b1d1e 2156 XMEMSET(&t[0], 0, sizeof(t[0]));
wolfSSL 16:8e0d178b1d1e 2157 t[0].infinity = 1;
wolfSSL 16:8e0d178b1d1e 2158 /* t[1] = {g->x, g->y, g->z} * norm */
wolfSSL 16:8e0d178b1d1e 2159 (void)sp_256_mod_mul_norm_10(t[1].x, g->x, p256_mod);
wolfSSL 16:8e0d178b1d1e 2160 (void)sp_256_mod_mul_norm_10(t[1].y, g->y, p256_mod);
wolfSSL 16:8e0d178b1d1e 2161 (void)sp_256_mod_mul_norm_10(t[1].z, g->z, p256_mod);
wolfSSL 16:8e0d178b1d1e 2162 t[1].infinity = 0;
wolfSSL 16:8e0d178b1d1e 2163 sp_256_proj_point_dbl_10(&t[ 2], &t[ 1], tmp);
wolfSSL 16:8e0d178b1d1e 2164 t[ 2].infinity = 0;
wolfSSL 16:8e0d178b1d1e 2165 sp_256_proj_point_add_10(&t[ 3], &t[ 2], &t[ 1], tmp);
wolfSSL 16:8e0d178b1d1e 2166 t[ 3].infinity = 0;
wolfSSL 16:8e0d178b1d1e 2167 sp_256_proj_point_dbl_10(&t[ 4], &t[ 2], tmp);
wolfSSL 16:8e0d178b1d1e 2168 t[ 4].infinity = 0;
wolfSSL 16:8e0d178b1d1e 2169 sp_256_proj_point_add_10(&t[ 5], &t[ 3], &t[ 2], tmp);
wolfSSL 16:8e0d178b1d1e 2170 t[ 5].infinity = 0;
wolfSSL 16:8e0d178b1d1e 2171 sp_256_proj_point_dbl_10(&t[ 6], &t[ 3], tmp);
wolfSSL 16:8e0d178b1d1e 2172 t[ 6].infinity = 0;
wolfSSL 16:8e0d178b1d1e 2173 sp_256_proj_point_add_10(&t[ 7], &t[ 4], &t[ 3], tmp);
wolfSSL 16:8e0d178b1d1e 2174 t[ 7].infinity = 0;
wolfSSL 16:8e0d178b1d1e 2175 sp_256_proj_point_dbl_10(&t[ 8], &t[ 4], tmp);
wolfSSL 16:8e0d178b1d1e 2176 t[ 8].infinity = 0;
wolfSSL 16:8e0d178b1d1e 2177 sp_256_proj_point_add_10(&t[ 9], &t[ 5], &t[ 4], tmp);
wolfSSL 16:8e0d178b1d1e 2178 t[ 9].infinity = 0;
wolfSSL 16:8e0d178b1d1e 2179 sp_256_proj_point_dbl_10(&t[10], &t[ 5], tmp);
wolfSSL 16:8e0d178b1d1e 2180 t[10].infinity = 0;
wolfSSL 16:8e0d178b1d1e 2181 sp_256_proj_point_add_10(&t[11], &t[ 6], &t[ 5], tmp);
wolfSSL 16:8e0d178b1d1e 2182 t[11].infinity = 0;
wolfSSL 16:8e0d178b1d1e 2183 sp_256_proj_point_dbl_10(&t[12], &t[ 6], tmp);
wolfSSL 16:8e0d178b1d1e 2184 t[12].infinity = 0;
wolfSSL 16:8e0d178b1d1e 2185 sp_256_proj_point_add_10(&t[13], &t[ 7], &t[ 6], tmp);
wolfSSL 16:8e0d178b1d1e 2186 t[13].infinity = 0;
wolfSSL 16:8e0d178b1d1e 2187 sp_256_proj_point_dbl_10(&t[14], &t[ 7], tmp);
wolfSSL 16:8e0d178b1d1e 2188 t[14].infinity = 0;
wolfSSL 16:8e0d178b1d1e 2189 sp_256_proj_point_add_10(&t[15], &t[ 8], &t[ 7], tmp);
wolfSSL 16:8e0d178b1d1e 2190 t[15].infinity = 0;
wolfSSL 16:8e0d178b1d1e 2191
wolfSSL 16:8e0d178b1d1e 2192 i = 8;
wolfSSL 16:8e0d178b1d1e 2193 n = k[i+1] << 6;
wolfSSL 16:8e0d178b1d1e 2194 c = 18;
wolfSSL 16:8e0d178b1d1e 2195 y = n >> 24;
wolfSSL 16:8e0d178b1d1e 2196 XMEMCPY(rt, &t[y], sizeof(sp_point));
wolfSSL 16:8e0d178b1d1e 2197 n <<= 8;
wolfSSL 16:8e0d178b1d1e 2198 for (; i>=0 || c>=4; ) {
wolfSSL 16:8e0d178b1d1e 2199 if (c < 4) {
wolfSSL 16:8e0d178b1d1e 2200 n |= k[i--] << (6 - c);
wolfSSL 16:8e0d178b1d1e 2201 c += 26;
wolfSSL 16:8e0d178b1d1e 2202 }
wolfSSL 16:8e0d178b1d1e 2203 y = (n >> 28) & 0xf;
wolfSSL 16:8e0d178b1d1e 2204 n <<= 4;
wolfSSL 16:8e0d178b1d1e 2205 c -= 4;
wolfSSL 16:8e0d178b1d1e 2206
wolfSSL 16:8e0d178b1d1e 2207 sp_256_proj_point_dbl_10(rt, rt, tmp);
wolfSSL 16:8e0d178b1d1e 2208 sp_256_proj_point_dbl_10(rt, rt, tmp);
wolfSSL 16:8e0d178b1d1e 2209 sp_256_proj_point_dbl_10(rt, rt, tmp);
wolfSSL 16:8e0d178b1d1e 2210 sp_256_proj_point_dbl_10(rt, rt, tmp);
wolfSSL 16:8e0d178b1d1e 2211
wolfSSL 16:8e0d178b1d1e 2212 sp_256_proj_point_add_10(rt, rt, &t[y], tmp);
wolfSSL 16:8e0d178b1d1e 2213 }
wolfSSL 16:8e0d178b1d1e 2214
wolfSSL 16:8e0d178b1d1e 2215 if (map != 0) {
wolfSSL 16:8e0d178b1d1e 2216 sp_256_map_10(r, rt, tmp);
wolfSSL 16:8e0d178b1d1e 2217 }
wolfSSL 16:8e0d178b1d1e 2218 else {
wolfSSL 16:8e0d178b1d1e 2219 XMEMCPY(r, rt, sizeof(sp_point));
wolfSSL 16:8e0d178b1d1e 2220 }
wolfSSL 16:8e0d178b1d1e 2221 }
wolfSSL 16:8e0d178b1d1e 2222
wolfSSL 16:8e0d178b1d1e 2223 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)
wolfSSL 16:8e0d178b1d1e 2224 if (tmp != NULL) {
wolfSSL 16:8e0d178b1d1e 2225 XMEMSET(tmp, 0, sizeof(sp_digit) * 2 * 10 * 5);
wolfSSL 16:8e0d178b1d1e 2226 XFREE(tmp, heap, DYNAMIC_TYPE_ECC);
wolfSSL 16:8e0d178b1d1e 2227 }
wolfSSL 16:8e0d178b1d1e 2228 if (t != NULL) {
wolfSSL 16:8e0d178b1d1e 2229 XMEMSET(t, 0, sizeof(sp_point) * 16);
wolfSSL 16:8e0d178b1d1e 2230 XFREE(t, heap, DYNAMIC_TYPE_ECC);
wolfSSL 16:8e0d178b1d1e 2231 }
wolfSSL 16:8e0d178b1d1e 2232 #else
wolfSSL 16:8e0d178b1d1e 2233 ForceZero(tmpd, sizeof(tmpd));
wolfSSL 16:8e0d178b1d1e 2234 ForceZero(td, sizeof(td));
wolfSSL 16:8e0d178b1d1e 2235 #endif
wolfSSL 16:8e0d178b1d1e 2236 sp_ecc_point_free(rt, 1, heap);
wolfSSL 16:8e0d178b1d1e 2237
wolfSSL 16:8e0d178b1d1e 2238 return err;
wolfSSL 16:8e0d178b1d1e 2239 }
wolfSSL 16:8e0d178b1d1e 2240
wolfSSL 16:8e0d178b1d1e 2241 #ifdef FP_ECC
wolfSSL 16:8e0d178b1d1e 2242 /* Double the Montgomery form projective point p a number of times.
wolfSSL 16:8e0d178b1d1e 2243 *
wolfSSL 16:8e0d178b1d1e 2244 * r Result of repeated doubling of point.
wolfSSL 16:8e0d178b1d1e 2245 * p Point to double.
wolfSSL 16:8e0d178b1d1e 2246 * n Number of times to double
wolfSSL 16:8e0d178b1d1e 2247 * t Temporary ordinate data.
wolfSSL 16:8e0d178b1d1e 2248 */
wolfSSL 16:8e0d178b1d1e 2249 static void sp_256_proj_point_dbl_n_10(sp_point* r, const sp_point* p, int n,
wolfSSL 16:8e0d178b1d1e 2250 sp_digit* t)
wolfSSL 16:8e0d178b1d1e 2251 {
wolfSSL 16:8e0d178b1d1e 2252 sp_point* rp[2];
wolfSSL 16:8e0d178b1d1e 2253 sp_digit* w = t;
wolfSSL 16:8e0d178b1d1e 2254 sp_digit* a = t + 2*10;
wolfSSL 16:8e0d178b1d1e 2255 sp_digit* b = t + 4*10;
wolfSSL 16:8e0d178b1d1e 2256 sp_digit* t1 = t + 6*10;
wolfSSL 16:8e0d178b1d1e 2257 sp_digit* t2 = t + 8*10;
wolfSSL 16:8e0d178b1d1e 2258 sp_digit* x;
wolfSSL 16:8e0d178b1d1e 2259 sp_digit* y;
wolfSSL 16:8e0d178b1d1e 2260 sp_digit* z;
wolfSSL 16:8e0d178b1d1e 2261 int i;
wolfSSL 16:8e0d178b1d1e 2262
wolfSSL 16:8e0d178b1d1e 2263 rp[0] = r;
wolfSSL 16:8e0d178b1d1e 2264
wolfSSL 16:8e0d178b1d1e 2265 /*lint allow cast to different type of pointer*/
wolfSSL 16:8e0d178b1d1e 2266 rp[1] = (sp_point*)t; /*lint !e9087 !e740*/
wolfSSL 16:8e0d178b1d1e 2267 XMEMSET(rp[1], 0, sizeof(sp_point));
wolfSSL 16:8e0d178b1d1e 2268 x = rp[p->infinity]->x;
wolfSSL 16:8e0d178b1d1e 2269 y = rp[p->infinity]->y;
wolfSSL 16:8e0d178b1d1e 2270 z = rp[p->infinity]->z;
wolfSSL 16:8e0d178b1d1e 2271 if (r != p) {
wolfSSL 16:8e0d178b1d1e 2272 for (i=0; i<10; i++) {
wolfSSL 16:8e0d178b1d1e 2273 r->x[i] = p->x[i];
wolfSSL 16:8e0d178b1d1e 2274 }
wolfSSL 16:8e0d178b1d1e 2275 for (i=0; i<10; i++) {
wolfSSL 16:8e0d178b1d1e 2276 r->y[i] = p->y[i];
wolfSSL 16:8e0d178b1d1e 2277 }
wolfSSL 16:8e0d178b1d1e 2278 for (i=0; i<10; i++) {
wolfSSL 16:8e0d178b1d1e 2279 r->z[i] = p->z[i];
wolfSSL 16:8e0d178b1d1e 2280 }
wolfSSL 16:8e0d178b1d1e 2281 r->infinity = p->infinity;
wolfSSL 16:8e0d178b1d1e 2282 }
wolfSSL 16:8e0d178b1d1e 2283
wolfSSL 16:8e0d178b1d1e 2284 /* Y = 2*Y */
wolfSSL 16:8e0d178b1d1e 2285 sp_256_mont_dbl_10(y, y, p256_mod);
wolfSSL 16:8e0d178b1d1e 2286 /* W = Z^4 */
wolfSSL 16:8e0d178b1d1e 2287 sp_256_mont_sqr_10(w, z, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 2288 sp_256_mont_sqr_10(w, w, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 2289 while (n-- > 0) {
wolfSSL 16:8e0d178b1d1e 2290 /* A = 3*(X^2 - W) */
wolfSSL 16:8e0d178b1d1e 2291 sp_256_mont_sqr_10(t1, x, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 2292 sp_256_mont_sub_10(t1, t1, w, p256_mod);
wolfSSL 16:8e0d178b1d1e 2293 sp_256_mont_tpl_10(a, t1, p256_mod);
wolfSSL 16:8e0d178b1d1e 2294 /* B = X*Y^2 */
wolfSSL 16:8e0d178b1d1e 2295 sp_256_mont_sqr_10(t2, y, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 2296 sp_256_mont_mul_10(b, t2, x, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 2297 /* X = A^2 - 2B */
wolfSSL 16:8e0d178b1d1e 2298 sp_256_mont_sqr_10(x, a, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 2299 sp_256_mont_dbl_10(t1, b, p256_mod);
wolfSSL 16:8e0d178b1d1e 2300 sp_256_mont_sub_10(x, x, t1, p256_mod);
wolfSSL 16:8e0d178b1d1e 2301 /* Z = Z*Y */
wolfSSL 16:8e0d178b1d1e 2302 sp_256_mont_mul_10(z, z, y, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 2303 /* t2 = Y^4 */
wolfSSL 16:8e0d178b1d1e 2304 sp_256_mont_sqr_10(t2, t2, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 2305 if (n != 0) {
wolfSSL 16:8e0d178b1d1e 2306 /* W = W*Y^4 */
wolfSSL 16:8e0d178b1d1e 2307 sp_256_mont_mul_10(w, w, t2, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 2308 }
wolfSSL 16:8e0d178b1d1e 2309 /* y = 2*A*(B - X) - Y^4 */
wolfSSL 16:8e0d178b1d1e 2310 sp_256_mont_sub_10(y, b, x, p256_mod);
wolfSSL 16:8e0d178b1d1e 2311 sp_256_mont_mul_10(y, y, a, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 2312 sp_256_mont_dbl_10(y, y, p256_mod);
wolfSSL 16:8e0d178b1d1e 2313 sp_256_mont_sub_10(y, y, t2, p256_mod);
wolfSSL 16:8e0d178b1d1e 2314 }
wolfSSL 16:8e0d178b1d1e 2315 /* Y = Y/2 */
wolfSSL 16:8e0d178b1d1e 2316 sp_256_div2_10(y, y, p256_mod);
wolfSSL 16:8e0d178b1d1e 2317 }
wolfSSL 16:8e0d178b1d1e 2318
wolfSSL 16:8e0d178b1d1e 2319 #endif /* FP_ECC */
wolfSSL 16:8e0d178b1d1e 2320
wolfSSL 16:8e0d178b1d1e 2321
wolfSSL 16:8e0d178b1d1e 2322 /* Add two Montgomery form projective points. The second point has a q value of
wolfSSL 16:8e0d178b1d1e 2323 * one.
wolfSSL 16:8e0d178b1d1e 2324 * Only the first point can be the same pointer as the result point.
wolfSSL 16:8e0d178b1d1e 2325 *
wolfSSL 16:8e0d178b1d1e 2326 * r Result of addition.
wolfSSL 16:8e0d178b1d1e 2327 * p First point to add.
wolfSSL 16:8e0d178b1d1e 2328 * q Second point to add.
wolfSSL 16:8e0d178b1d1e 2329 * t Temporary ordinate data.
wolfSSL 16:8e0d178b1d1e 2330 */
wolfSSL 16:8e0d178b1d1e 2331 static void sp_256_proj_point_add_qz1_10(sp_point* r, const sp_point* p,
wolfSSL 16:8e0d178b1d1e 2332 const sp_point* q, sp_digit* t)
wolfSSL 16:8e0d178b1d1e 2333 {
wolfSSL 16:8e0d178b1d1e 2334 const sp_point* ap[2];
wolfSSL 16:8e0d178b1d1e 2335 sp_point* rp[2];
wolfSSL 16:8e0d178b1d1e 2336 sp_digit* t1 = t;
wolfSSL 16:8e0d178b1d1e 2337 sp_digit* t2 = t + 2*10;
wolfSSL 16:8e0d178b1d1e 2338 sp_digit* t3 = t + 4*10;
wolfSSL 16:8e0d178b1d1e 2339 sp_digit* t4 = t + 6*10;
wolfSSL 16:8e0d178b1d1e 2340 sp_digit* t5 = t + 8*10;
wolfSSL 16:8e0d178b1d1e 2341 sp_digit* x;
wolfSSL 16:8e0d178b1d1e 2342 sp_digit* y;
wolfSSL 16:8e0d178b1d1e 2343 sp_digit* z;
wolfSSL 16:8e0d178b1d1e 2344 int i;
wolfSSL 16:8e0d178b1d1e 2345
wolfSSL 16:8e0d178b1d1e 2346 /* Check double */
wolfSSL 16:8e0d178b1d1e 2347 (void)sp_256_sub_10(t1, p256_mod, q->y);
wolfSSL 16:8e0d178b1d1e 2348 sp_256_norm_10(t1);
wolfSSL 16:8e0d178b1d1e 2349 if ((sp_256_cmp_equal_10(p->x, q->x) & sp_256_cmp_equal_10(p->z, q->z) &
wolfSSL 16:8e0d178b1d1e 2350 (sp_256_cmp_equal_10(p->y, q->y) | sp_256_cmp_equal_10(p->y, t1))) != 0) {
wolfSSL 16:8e0d178b1d1e 2351 sp_256_proj_point_dbl_10(r, p, t);
wolfSSL 16:8e0d178b1d1e 2352 }
wolfSSL 16:8e0d178b1d1e 2353 else {
wolfSSL 16:8e0d178b1d1e 2354 rp[0] = r;
wolfSSL 16:8e0d178b1d1e 2355
wolfSSL 16:8e0d178b1d1e 2356 /*lint allow cast to different type of pointer*/
wolfSSL 16:8e0d178b1d1e 2357 rp[1] = (sp_point*)t; /*lint !e9087 !e740*/
wolfSSL 16:8e0d178b1d1e 2358 XMEMSET(rp[1], 0, sizeof(sp_point));
wolfSSL 16:8e0d178b1d1e 2359 x = rp[p->infinity | q->infinity]->x;
wolfSSL 16:8e0d178b1d1e 2360 y = rp[p->infinity | q->infinity]->y;
wolfSSL 16:8e0d178b1d1e 2361 z = rp[p->infinity | q->infinity]->z;
wolfSSL 16:8e0d178b1d1e 2362
wolfSSL 16:8e0d178b1d1e 2363 ap[0] = p;
wolfSSL 16:8e0d178b1d1e 2364 ap[1] = q;
wolfSSL 16:8e0d178b1d1e 2365 for (i=0; i<10; i++) {
wolfSSL 16:8e0d178b1d1e 2366 r->x[i] = ap[p->infinity]->x[i];
wolfSSL 16:8e0d178b1d1e 2367 }
wolfSSL 16:8e0d178b1d1e 2368 for (i=0; i<10; i++) {
wolfSSL 16:8e0d178b1d1e 2369 r->y[i] = ap[p->infinity]->y[i];
wolfSSL 16:8e0d178b1d1e 2370 }
wolfSSL 16:8e0d178b1d1e 2371 for (i=0; i<10; i++) {
wolfSSL 16:8e0d178b1d1e 2372 r->z[i] = ap[p->infinity]->z[i];
wolfSSL 16:8e0d178b1d1e 2373 }
wolfSSL 16:8e0d178b1d1e 2374 r->infinity = ap[p->infinity]->infinity;
wolfSSL 16:8e0d178b1d1e 2375
wolfSSL 16:8e0d178b1d1e 2376 /* U2 = X2*Z1^2 */
wolfSSL 16:8e0d178b1d1e 2377 sp_256_mont_sqr_10(t2, z, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 2378 sp_256_mont_mul_10(t4, t2, z, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 2379 sp_256_mont_mul_10(t2, t2, q->x, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 2380 /* S2 = Y2*Z1^3 */
wolfSSL 16:8e0d178b1d1e 2381 sp_256_mont_mul_10(t4, t4, q->y, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 2382 /* H = U2 - X1 */
wolfSSL 16:8e0d178b1d1e 2383 sp_256_mont_sub_10(t2, t2, x, p256_mod);
wolfSSL 16:8e0d178b1d1e 2384 /* R = S2 - Y1 */
wolfSSL 16:8e0d178b1d1e 2385 sp_256_mont_sub_10(t4, t4, y, p256_mod);
wolfSSL 16:8e0d178b1d1e 2386 /* Z3 = H*Z1 */
wolfSSL 16:8e0d178b1d1e 2387 sp_256_mont_mul_10(z, z, t2, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 2388 /* X3 = R^2 - H^3 - 2*X1*H^2 */
wolfSSL 16:8e0d178b1d1e 2389 sp_256_mont_sqr_10(t1, t4, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 2390 sp_256_mont_sqr_10(t5, t2, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 2391 sp_256_mont_mul_10(t3, x, t5, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 2392 sp_256_mont_mul_10(t5, t5, t2, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 2393 sp_256_mont_sub_10(x, t1, t5, p256_mod);
wolfSSL 16:8e0d178b1d1e 2394 sp_256_mont_dbl_10(t1, t3, p256_mod);
wolfSSL 16:8e0d178b1d1e 2395 sp_256_mont_sub_10(x, x, t1, p256_mod);
wolfSSL 16:8e0d178b1d1e 2396 /* Y3 = R*(X1*H^2 - X3) - Y1*H^3 */
wolfSSL 16:8e0d178b1d1e 2397 sp_256_mont_sub_10(t3, t3, x, p256_mod);
wolfSSL 16:8e0d178b1d1e 2398 sp_256_mont_mul_10(t3, t3, t4, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 2399 sp_256_mont_mul_10(t5, t5, y, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 2400 sp_256_mont_sub_10(y, t3, t5, p256_mod);
wolfSSL 16:8e0d178b1d1e 2401 }
wolfSSL 16:8e0d178b1d1e 2402 }
wolfSSL 16:8e0d178b1d1e 2403
wolfSSL 16:8e0d178b1d1e 2404 #ifdef FP_ECC
wolfSSL 16:8e0d178b1d1e 2405 /* Convert the projective point to affine.
wolfSSL 16:8e0d178b1d1e 2406 * Ordinates are in Montgomery form.
wolfSSL 16:8e0d178b1d1e 2407 *
wolfSSL 16:8e0d178b1d1e 2408 * a Point to convert.
wolfSSL 16:8e0d178b1d1e 2409 * t Temporary data.
wolfSSL 16:8e0d178b1d1e 2410 */
wolfSSL 16:8e0d178b1d1e 2411 static void sp_256_proj_to_affine_10(sp_point* a, sp_digit* t)
wolfSSL 16:8e0d178b1d1e 2412 {
wolfSSL 16:8e0d178b1d1e 2413 sp_digit* t1 = t;
wolfSSL 16:8e0d178b1d1e 2414 sp_digit* t2 = t + 2 * 10;
wolfSSL 16:8e0d178b1d1e 2415 sp_digit* tmp = t + 4 * 10;
wolfSSL 16:8e0d178b1d1e 2416
wolfSSL 16:8e0d178b1d1e 2417 sp_256_mont_inv_10(t1, a->z, tmp);
wolfSSL 16:8e0d178b1d1e 2418
wolfSSL 16:8e0d178b1d1e 2419 sp_256_mont_sqr_10(t2, t1, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 2420 sp_256_mont_mul_10(t1, t2, t1, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 2421
wolfSSL 16:8e0d178b1d1e 2422 sp_256_mont_mul_10(a->x, a->x, t2, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 2423 sp_256_mont_mul_10(a->y, a->y, t1, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 2424 XMEMCPY(a->z, p256_norm_mod, sizeof(p256_norm_mod));
wolfSSL 16:8e0d178b1d1e 2425 }
wolfSSL 16:8e0d178b1d1e 2426
wolfSSL 16:8e0d178b1d1e 2427
wolfSSL 16:8e0d178b1d1e 2428 /* Generate the pre-computed table of points for the base point.
wolfSSL 16:8e0d178b1d1e 2429 *
wolfSSL 16:8e0d178b1d1e 2430 * a The base point.
wolfSSL 16:8e0d178b1d1e 2431 * table Place to store generated point data.
wolfSSL 16:8e0d178b1d1e 2432 * tmp Temporary data.
wolfSSL 16:8e0d178b1d1e 2433 * heap Heap to use for allocation.
wolfSSL 16:8e0d178b1d1e 2434 */
wolfSSL 16:8e0d178b1d1e 2435 static int sp_256_gen_stripe_table_10(const sp_point* a,
wolfSSL 16:8e0d178b1d1e 2436 sp_table_entry* table, sp_digit* tmp, void* heap)
wolfSSL 16:8e0d178b1d1e 2437 {
wolfSSL 16:8e0d178b1d1e 2438 #if !defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SMALL_STACK)
wolfSSL 16:8e0d178b1d1e 2439 sp_point td, s1d, s2d;
wolfSSL 16:8e0d178b1d1e 2440 #endif
wolfSSL 16:8e0d178b1d1e 2441 sp_point* t;
wolfSSL 16:8e0d178b1d1e 2442 sp_point* s1 = NULL;
wolfSSL 16:8e0d178b1d1e 2443 sp_point* s2 = NULL;
wolfSSL 16:8e0d178b1d1e 2444 int i, j;
wolfSSL 16:8e0d178b1d1e 2445 int err;
wolfSSL 16:8e0d178b1d1e 2446
wolfSSL 16:8e0d178b1d1e 2447 (void)heap;
wolfSSL 16:8e0d178b1d1e 2448
wolfSSL 16:8e0d178b1d1e 2449 err = sp_ecc_point_new(heap, td, t);
wolfSSL 16:8e0d178b1d1e 2450 if (err == MP_OKAY) {
wolfSSL 16:8e0d178b1d1e 2451 err = sp_ecc_point_new(heap, s1d, s1);
wolfSSL 16:8e0d178b1d1e 2452 }
wolfSSL 16:8e0d178b1d1e 2453 if (err == MP_OKAY) {
wolfSSL 16:8e0d178b1d1e 2454 err = sp_ecc_point_new(heap, s2d, s2);
wolfSSL 16:8e0d178b1d1e 2455 }
wolfSSL 16:8e0d178b1d1e 2456
wolfSSL 16:8e0d178b1d1e 2457 if (err == MP_OKAY) {
wolfSSL 16:8e0d178b1d1e 2458 err = sp_256_mod_mul_norm_10(t->x, a->x, p256_mod);
wolfSSL 16:8e0d178b1d1e 2459 }
wolfSSL 16:8e0d178b1d1e 2460 if (err == MP_OKAY) {
wolfSSL 16:8e0d178b1d1e 2461 err = sp_256_mod_mul_norm_10(t->y, a->y, p256_mod);
wolfSSL 16:8e0d178b1d1e 2462 }
wolfSSL 16:8e0d178b1d1e 2463 if (err == MP_OKAY) {
wolfSSL 16:8e0d178b1d1e 2464 err = sp_256_mod_mul_norm_10(t->z, a->z, p256_mod);
wolfSSL 16:8e0d178b1d1e 2465 }
wolfSSL 16:8e0d178b1d1e 2466 if (err == MP_OKAY) {
wolfSSL 16:8e0d178b1d1e 2467 t->infinity = 0;
wolfSSL 16:8e0d178b1d1e 2468 sp_256_proj_to_affine_10(t, tmp);
wolfSSL 16:8e0d178b1d1e 2469
wolfSSL 16:8e0d178b1d1e 2470 XMEMCPY(s1->z, p256_norm_mod, sizeof(p256_norm_mod));
wolfSSL 16:8e0d178b1d1e 2471 s1->infinity = 0;
wolfSSL 16:8e0d178b1d1e 2472 XMEMCPY(s2->z, p256_norm_mod, sizeof(p256_norm_mod));
wolfSSL 16:8e0d178b1d1e 2473 s2->infinity = 0;
wolfSSL 16:8e0d178b1d1e 2474
wolfSSL 16:8e0d178b1d1e 2475 /* table[0] = {0, 0, infinity} */
wolfSSL 16:8e0d178b1d1e 2476 XMEMSET(&table[0], 0, sizeof(sp_table_entry));
wolfSSL 16:8e0d178b1d1e 2477 /* table[1] = Affine version of 'a' in Montgomery form */
wolfSSL 16:8e0d178b1d1e 2478 XMEMCPY(table[1].x, t->x, sizeof(table->x));
wolfSSL 16:8e0d178b1d1e 2479 XMEMCPY(table[1].y, t->y, sizeof(table->y));
wolfSSL 16:8e0d178b1d1e 2480
wolfSSL 16:8e0d178b1d1e 2481 for (i=1; i<8; i++) {
wolfSSL 16:8e0d178b1d1e 2482 sp_256_proj_point_dbl_n_10(t, t, 32, tmp);
wolfSSL 16:8e0d178b1d1e 2483 sp_256_proj_to_affine_10(t, tmp);
wolfSSL 16:8e0d178b1d1e 2484 XMEMCPY(table[1<<i].x, t->x, sizeof(table->x));
wolfSSL 16:8e0d178b1d1e 2485 XMEMCPY(table[1<<i].y, t->y, sizeof(table->y));
wolfSSL 16:8e0d178b1d1e 2486 }
wolfSSL 16:8e0d178b1d1e 2487
wolfSSL 16:8e0d178b1d1e 2488 for (i=1; i<8; i++) {
wolfSSL 16:8e0d178b1d1e 2489 XMEMCPY(s1->x, table[1<<i].x, sizeof(table->x));
wolfSSL 16:8e0d178b1d1e 2490 XMEMCPY(s1->y, table[1<<i].y, sizeof(table->y));
wolfSSL 16:8e0d178b1d1e 2491 for (j=(1<<i)+1; j<(1<<(i+1)); j++) {
wolfSSL 16:8e0d178b1d1e 2492 XMEMCPY(s2->x, table[j-(1<<i)].x, sizeof(table->x));
wolfSSL 16:8e0d178b1d1e 2493 XMEMCPY(s2->y, table[j-(1<<i)].y, sizeof(table->y));
wolfSSL 16:8e0d178b1d1e 2494 sp_256_proj_point_add_qz1_10(t, s1, s2, tmp);
wolfSSL 16:8e0d178b1d1e 2495 sp_256_proj_to_affine_10(t, tmp);
wolfSSL 16:8e0d178b1d1e 2496 XMEMCPY(table[j].x, t->x, sizeof(table->x));
wolfSSL 16:8e0d178b1d1e 2497 XMEMCPY(table[j].y, t->y, sizeof(table->y));
wolfSSL 16:8e0d178b1d1e 2498 }
wolfSSL 16:8e0d178b1d1e 2499 }
wolfSSL 16:8e0d178b1d1e 2500 }
wolfSSL 16:8e0d178b1d1e 2501
wolfSSL 16:8e0d178b1d1e 2502 sp_ecc_point_free(s2, 0, heap);
wolfSSL 16:8e0d178b1d1e 2503 sp_ecc_point_free(s1, 0, heap);
wolfSSL 16:8e0d178b1d1e 2504 sp_ecc_point_free( t, 0, heap);
wolfSSL 16:8e0d178b1d1e 2505
wolfSSL 16:8e0d178b1d1e 2506 return err;
wolfSSL 16:8e0d178b1d1e 2507 }
wolfSSL 16:8e0d178b1d1e 2508
wolfSSL 16:8e0d178b1d1e 2509 #endif /* FP_ECC */
wolfSSL 16:8e0d178b1d1e 2510 /* Multiply the point by the scalar and return the result.
wolfSSL 16:8e0d178b1d1e 2511 * If map is true then convert result to affine co-ordinates.
wolfSSL 16:8e0d178b1d1e 2512 *
wolfSSL 16:8e0d178b1d1e 2513 * r Resulting point.
wolfSSL 16:8e0d178b1d1e 2514 * k Scalar to multiply by.
wolfSSL 16:8e0d178b1d1e 2515 * map Indicates whether to convert result to affine.
wolfSSL 16:8e0d178b1d1e 2516 * heap Heap to use for allocation.
wolfSSL 16:8e0d178b1d1e 2517 * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
wolfSSL 16:8e0d178b1d1e 2518 */
wolfSSL 16:8e0d178b1d1e 2519 static int sp_256_ecc_mulmod_stripe_10(sp_point* r, const sp_point* g,
wolfSSL 16:8e0d178b1d1e 2520 const sp_table_entry* table, const sp_digit* k, int map, void* heap)
wolfSSL 16:8e0d178b1d1e 2521 {
wolfSSL 16:8e0d178b1d1e 2522 #if !defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SMALL_STACK)
wolfSSL 16:8e0d178b1d1e 2523 sp_point rtd;
wolfSSL 16:8e0d178b1d1e 2524 sp_point pd;
wolfSSL 16:8e0d178b1d1e 2525 sp_digit td[2 * 10 * 5];
wolfSSL 16:8e0d178b1d1e 2526 #endif
wolfSSL 16:8e0d178b1d1e 2527 sp_point* rt;
wolfSSL 16:8e0d178b1d1e 2528 sp_point* p = NULL;
wolfSSL 16:8e0d178b1d1e 2529 sp_digit* t;
wolfSSL 16:8e0d178b1d1e 2530 int i, j;
wolfSSL 16:8e0d178b1d1e 2531 int y, x;
wolfSSL 16:8e0d178b1d1e 2532 int err;
wolfSSL 16:8e0d178b1d1e 2533
wolfSSL 16:8e0d178b1d1e 2534 (void)g;
wolfSSL 16:8e0d178b1d1e 2535 (void)heap;
wolfSSL 16:8e0d178b1d1e 2536
wolfSSL 16:8e0d178b1d1e 2537 err = sp_ecc_point_new(heap, rtd, rt);
wolfSSL 16:8e0d178b1d1e 2538 if (err == MP_OKAY) {
wolfSSL 16:8e0d178b1d1e 2539 err = sp_ecc_point_new(heap, pd, p);
wolfSSL 16:8e0d178b1d1e 2540 }
wolfSSL 16:8e0d178b1d1e 2541 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)
wolfSSL 16:8e0d178b1d1e 2542 t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 10 * 5, heap,
wolfSSL 16:8e0d178b1d1e 2543 DYNAMIC_TYPE_ECC);
wolfSSL 16:8e0d178b1d1e 2544 if (t == NULL) {
wolfSSL 16:8e0d178b1d1e 2545 err = MEMORY_E;
wolfSSL 16:8e0d178b1d1e 2546 }
wolfSSL 16:8e0d178b1d1e 2547 #else
wolfSSL 16:8e0d178b1d1e 2548 t = td;
wolfSSL 16:8e0d178b1d1e 2549 #endif
wolfSSL 16:8e0d178b1d1e 2550
wolfSSL 16:8e0d178b1d1e 2551 if (err == MP_OKAY) {
wolfSSL 16:8e0d178b1d1e 2552 XMEMCPY(p->z, p256_norm_mod, sizeof(p256_norm_mod));
wolfSSL 16:8e0d178b1d1e 2553 XMEMCPY(rt->z, p256_norm_mod, sizeof(p256_norm_mod));
wolfSSL 16:8e0d178b1d1e 2554
wolfSSL 16:8e0d178b1d1e 2555 y = 0;
wolfSSL 16:8e0d178b1d1e 2556 for (j=0,x=31; j<8; j++,x+=32) {
wolfSSL 16:8e0d178b1d1e 2557 y |= ((k[x / 26] >> (x % 26)) & 1) << j;
wolfSSL 16:8e0d178b1d1e 2558 }
wolfSSL 16:8e0d178b1d1e 2559 XMEMCPY(rt->x, table[y].x, sizeof(table[y].x));
wolfSSL 16:8e0d178b1d1e 2560 XMEMCPY(rt->y, table[y].y, sizeof(table[y].y));
wolfSSL 16:8e0d178b1d1e 2561 rt->infinity = !y;
wolfSSL 16:8e0d178b1d1e 2562 for (i=30; i>=0; i--) {
wolfSSL 16:8e0d178b1d1e 2563 y = 0;
wolfSSL 16:8e0d178b1d1e 2564 for (j=0,x=i; j<8; j++,x+=32) {
wolfSSL 16:8e0d178b1d1e 2565 y |= ((k[x / 26] >> (x % 26)) & 1) << j;
wolfSSL 16:8e0d178b1d1e 2566 }
wolfSSL 16:8e0d178b1d1e 2567
wolfSSL 16:8e0d178b1d1e 2568 sp_256_proj_point_dbl_10(rt, rt, t);
wolfSSL 16:8e0d178b1d1e 2569 XMEMCPY(p->x, table[y].x, sizeof(table[y].x));
wolfSSL 16:8e0d178b1d1e 2570 XMEMCPY(p->y, table[y].y, sizeof(table[y].y));
wolfSSL 16:8e0d178b1d1e 2571 p->infinity = !y;
wolfSSL 16:8e0d178b1d1e 2572 sp_256_proj_point_add_qz1_10(rt, rt, p, t);
wolfSSL 16:8e0d178b1d1e 2573 }
wolfSSL 16:8e0d178b1d1e 2574
wolfSSL 16:8e0d178b1d1e 2575 if (map != 0) {
wolfSSL 16:8e0d178b1d1e 2576 sp_256_map_10(r, rt, t);
wolfSSL 16:8e0d178b1d1e 2577 }
wolfSSL 16:8e0d178b1d1e 2578 else {
wolfSSL 16:8e0d178b1d1e 2579 XMEMCPY(r, rt, sizeof(sp_point));
wolfSSL 16:8e0d178b1d1e 2580 }
wolfSSL 16:8e0d178b1d1e 2581 }
wolfSSL 16:8e0d178b1d1e 2582
wolfSSL 16:8e0d178b1d1e 2583 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)
wolfSSL 16:8e0d178b1d1e 2584 if (t != NULL) {
wolfSSL 16:8e0d178b1d1e 2585 XFREE(t, heap, DYNAMIC_TYPE_ECC);
wolfSSL 16:8e0d178b1d1e 2586 }
wolfSSL 16:8e0d178b1d1e 2587 #endif
wolfSSL 16:8e0d178b1d1e 2588 sp_ecc_point_free(p, 0, heap);
wolfSSL 16:8e0d178b1d1e 2589 sp_ecc_point_free(rt, 0, heap);
wolfSSL 16:8e0d178b1d1e 2590
wolfSSL 16:8e0d178b1d1e 2591 return err;
wolfSSL 16:8e0d178b1d1e 2592 }
wolfSSL 16:8e0d178b1d1e 2593
wolfSSL 16:8e0d178b1d1e 2594 #ifdef FP_ECC
wolfSSL 16:8e0d178b1d1e 2595 #ifndef FP_ENTRIES
wolfSSL 16:8e0d178b1d1e 2596 #define FP_ENTRIES 16
wolfSSL 16:8e0d178b1d1e 2597 #endif
wolfSSL 16:8e0d178b1d1e 2598
wolfSSL 16:8e0d178b1d1e 2599 typedef struct sp_cache_t {
wolfSSL 16:8e0d178b1d1e 2600 sp_digit x[10] __attribute__((aligned(128)));
wolfSSL 16:8e0d178b1d1e 2601 sp_digit y[10] __attribute__((aligned(128)));
wolfSSL 16:8e0d178b1d1e 2602 sp_table_entry table[256] __attribute__((aligned(128)));
wolfSSL 16:8e0d178b1d1e 2603 uint32_t cnt;
wolfSSL 16:8e0d178b1d1e 2604 int set;
wolfSSL 16:8e0d178b1d1e 2605 } sp_cache_t;
wolfSSL 16:8e0d178b1d1e 2606
wolfSSL 16:8e0d178b1d1e 2607 static THREAD_LS_T sp_cache_t sp_cache[FP_ENTRIES];
wolfSSL 16:8e0d178b1d1e 2608 static THREAD_LS_T int sp_cache_last = -1;
wolfSSL 16:8e0d178b1d1e 2609 static THREAD_LS_T int sp_cache_inited = 0;
wolfSSL 16:8e0d178b1d1e 2610
wolfSSL 16:8e0d178b1d1e 2611 #ifndef HAVE_THREAD_LS
wolfSSL 16:8e0d178b1d1e 2612 static volatile int initCacheMutex = 0;
wolfSSL 16:8e0d178b1d1e 2613 static wolfSSL_Mutex sp_cache_lock;
wolfSSL 16:8e0d178b1d1e 2614 #endif
wolfSSL 16:8e0d178b1d1e 2615
wolfSSL 16:8e0d178b1d1e 2616 static void sp_ecc_get_cache(const sp_point* g, sp_cache_t** cache)
wolfSSL 16:8e0d178b1d1e 2617 {
wolfSSL 16:8e0d178b1d1e 2618 int i, j;
wolfSSL 16:8e0d178b1d1e 2619 uint32_t least;
wolfSSL 16:8e0d178b1d1e 2620
wolfSSL 16:8e0d178b1d1e 2621 if (sp_cache_inited == 0) {
wolfSSL 16:8e0d178b1d1e 2622 for (i=0; i<FP_ENTRIES; i++) {
wolfSSL 16:8e0d178b1d1e 2623 sp_cache[i].set = 0;
wolfSSL 16:8e0d178b1d1e 2624 }
wolfSSL 16:8e0d178b1d1e 2625 sp_cache_inited = 1;
wolfSSL 16:8e0d178b1d1e 2626 }
wolfSSL 16:8e0d178b1d1e 2627
wolfSSL 16:8e0d178b1d1e 2628 /* Compare point with those in cache. */
wolfSSL 16:8e0d178b1d1e 2629 for (i=0; i<FP_ENTRIES; i++) {
wolfSSL 16:8e0d178b1d1e 2630 if (!sp_cache[i].set)
wolfSSL 16:8e0d178b1d1e 2631 continue;
wolfSSL 16:8e0d178b1d1e 2632
wolfSSL 16:8e0d178b1d1e 2633 if (sp_256_cmp_equal_10(g->x, sp_cache[i].x) &
wolfSSL 16:8e0d178b1d1e 2634 sp_256_cmp_equal_10(g->y, sp_cache[i].y)) {
wolfSSL 16:8e0d178b1d1e 2635 sp_cache[i].cnt++;
wolfSSL 16:8e0d178b1d1e 2636 break;
wolfSSL 16:8e0d178b1d1e 2637 }
wolfSSL 16:8e0d178b1d1e 2638 }
wolfSSL 16:8e0d178b1d1e 2639
wolfSSL 16:8e0d178b1d1e 2640 /* No match. */
wolfSSL 16:8e0d178b1d1e 2641 if (i == FP_ENTRIES) {
wolfSSL 16:8e0d178b1d1e 2642 /* Find empty entry. */
wolfSSL 16:8e0d178b1d1e 2643 i = (sp_cache_last + 1) % FP_ENTRIES;
wolfSSL 16:8e0d178b1d1e 2644 for (; i != sp_cache_last; i=(i+1)%FP_ENTRIES) {
wolfSSL 16:8e0d178b1d1e 2645 if (!sp_cache[i].set) {
wolfSSL 16:8e0d178b1d1e 2646 break;
wolfSSL 16:8e0d178b1d1e 2647 }
wolfSSL 16:8e0d178b1d1e 2648 }
wolfSSL 16:8e0d178b1d1e 2649
wolfSSL 16:8e0d178b1d1e 2650 /* Evict least used. */
wolfSSL 16:8e0d178b1d1e 2651 if (i == sp_cache_last) {
wolfSSL 16:8e0d178b1d1e 2652 least = sp_cache[0].cnt;
wolfSSL 16:8e0d178b1d1e 2653 for (j=1; j<FP_ENTRIES; j++) {
wolfSSL 16:8e0d178b1d1e 2654 if (sp_cache[j].cnt < least) {
wolfSSL 16:8e0d178b1d1e 2655 i = j;
wolfSSL 16:8e0d178b1d1e 2656 least = sp_cache[i].cnt;
wolfSSL 16:8e0d178b1d1e 2657 }
wolfSSL 16:8e0d178b1d1e 2658 }
wolfSSL 16:8e0d178b1d1e 2659 }
wolfSSL 16:8e0d178b1d1e 2660
wolfSSL 16:8e0d178b1d1e 2661 XMEMCPY(sp_cache[i].x, g->x, sizeof(sp_cache[i].x));
wolfSSL 16:8e0d178b1d1e 2662 XMEMCPY(sp_cache[i].y, g->y, sizeof(sp_cache[i].y));
wolfSSL 16:8e0d178b1d1e 2663 sp_cache[i].set = 1;
wolfSSL 16:8e0d178b1d1e 2664 sp_cache[i].cnt = 1;
wolfSSL 16:8e0d178b1d1e 2665 }
wolfSSL 16:8e0d178b1d1e 2666
wolfSSL 16:8e0d178b1d1e 2667 *cache = &sp_cache[i];
wolfSSL 16:8e0d178b1d1e 2668 sp_cache_last = i;
wolfSSL 16:8e0d178b1d1e 2669 }
wolfSSL 16:8e0d178b1d1e 2670 #endif /* FP_ECC */
wolfSSL 16:8e0d178b1d1e 2671
wolfSSL 16:8e0d178b1d1e 2672 /* Multiply the base point of P256 by the scalar and return the result.
wolfSSL 16:8e0d178b1d1e 2673 * If map is true then convert result to affine co-ordinates.
wolfSSL 16:8e0d178b1d1e 2674 *
wolfSSL 16:8e0d178b1d1e 2675 * r Resulting point.
wolfSSL 16:8e0d178b1d1e 2676 * g Point to multiply.
wolfSSL 16:8e0d178b1d1e 2677 * k Scalar to multiply by.
wolfSSL 16:8e0d178b1d1e 2678 * map Indicates whether to convert result to affine.
wolfSSL 16:8e0d178b1d1e 2679 * heap Heap to use for allocation.
wolfSSL 16:8e0d178b1d1e 2680 * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
wolfSSL 16:8e0d178b1d1e 2681 */
wolfSSL 16:8e0d178b1d1e 2682 static int sp_256_ecc_mulmod_10(sp_point* r, const sp_point* g, const sp_digit* k,
wolfSSL 16:8e0d178b1d1e 2683 int map, void* heap)
wolfSSL 16:8e0d178b1d1e 2684 {
wolfSSL 16:8e0d178b1d1e 2685 #ifndef FP_ECC
wolfSSL 16:8e0d178b1d1e 2686 return sp_256_ecc_mulmod_fast_10(r, g, k, map, heap);
wolfSSL 16:8e0d178b1d1e 2687 #else
wolfSSL 16:8e0d178b1d1e 2688 sp_digit tmp[2 * 10 * 5];
wolfSSL 16:8e0d178b1d1e 2689 sp_cache_t* cache;
wolfSSL 16:8e0d178b1d1e 2690 int err = MP_OKAY;
wolfSSL 16:8e0d178b1d1e 2691
wolfSSL 16:8e0d178b1d1e 2692 #ifndef HAVE_THREAD_LS
wolfSSL 16:8e0d178b1d1e 2693 if (initCacheMutex == 0) {
wolfSSL 16:8e0d178b1d1e 2694 wc_InitMutex(&sp_cache_lock);
wolfSSL 16:8e0d178b1d1e 2695 initCacheMutex = 1;
wolfSSL 16:8e0d178b1d1e 2696 }
wolfSSL 16:8e0d178b1d1e 2697 if (wc_LockMutex(&sp_cache_lock) != 0)
wolfSSL 16:8e0d178b1d1e 2698 err = BAD_MUTEX_E;
wolfSSL 16:8e0d178b1d1e 2699 #endif /* HAVE_THREAD_LS */
wolfSSL 16:8e0d178b1d1e 2700
wolfSSL 16:8e0d178b1d1e 2701 if (err == MP_OKAY) {
wolfSSL 16:8e0d178b1d1e 2702 sp_ecc_get_cache(g, &cache);
wolfSSL 16:8e0d178b1d1e 2703 if (cache->cnt == 2)
wolfSSL 16:8e0d178b1d1e 2704 sp_256_gen_stripe_table_10(g, cache->table, tmp, heap);
wolfSSL 16:8e0d178b1d1e 2705
wolfSSL 16:8e0d178b1d1e 2706 #ifndef HAVE_THREAD_LS
wolfSSL 16:8e0d178b1d1e 2707 wc_UnLockMutex(&sp_cache_lock);
wolfSSL 16:8e0d178b1d1e 2708 #endif /* HAVE_THREAD_LS */
wolfSSL 16:8e0d178b1d1e 2709
wolfSSL 16:8e0d178b1d1e 2710 if (cache->cnt < 2) {
wolfSSL 16:8e0d178b1d1e 2711 err = sp_256_ecc_mulmod_fast_10(r, g, k, map, heap);
wolfSSL 16:8e0d178b1d1e 2712 }
wolfSSL 16:8e0d178b1d1e 2713 else {
wolfSSL 16:8e0d178b1d1e 2714 err = sp_256_ecc_mulmod_stripe_10(r, g, cache->table, k,
wolfSSL 16:8e0d178b1d1e 2715 map, heap);
wolfSSL 16:8e0d178b1d1e 2716 }
wolfSSL 16:8e0d178b1d1e 2717 }
wolfSSL 16:8e0d178b1d1e 2718
wolfSSL 16:8e0d178b1d1e 2719 return err;
wolfSSL 16:8e0d178b1d1e 2720 #endif
wolfSSL 16:8e0d178b1d1e 2721 }
wolfSSL 16:8e0d178b1d1e 2722
wolfSSL 16:8e0d178b1d1e 2723 #endif
wolfSSL 16:8e0d178b1d1e 2724
wolfSSL 16:8e0d178b1d1e 2725 #ifdef WOLFSSL_SP_SMALL
wolfSSL 16:8e0d178b1d1e 2726 /* Multiply the base point of P256 by the scalar and return the result.
wolfSSL 16:8e0d178b1d1e 2727 * If map is true then convert result to affine co-ordinates.
wolfSSL 16:8e0d178b1d1e 2728 *
wolfSSL 16:8e0d178b1d1e 2729 * r Resulting point.
wolfSSL 16:8e0d178b1d1e 2730 * k Scalar to multiply by.
wolfSSL 16:8e0d178b1d1e 2731 * map Indicates whether to convert result to affine.
wolfSSL 16:8e0d178b1d1e 2732 * heap Heap to use for allocation.
wolfSSL 16:8e0d178b1d1e 2733 * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
wolfSSL 16:8e0d178b1d1e 2734 */
wolfSSL 16:8e0d178b1d1e 2735 static int sp_256_ecc_mulmod_base_10(sp_point* r, const sp_digit* k,
wolfSSL 16:8e0d178b1d1e 2736 int map, void* heap)
wolfSSL 16:8e0d178b1d1e 2737 {
wolfSSL 16:8e0d178b1d1e 2738 /* No pre-computed values. */
wolfSSL 16:8e0d178b1d1e 2739 return sp_256_ecc_mulmod_10(r, &p256_base, k, map, heap);
wolfSSL 16:8e0d178b1d1e 2740 }
wolfSSL 16:8e0d178b1d1e 2741
wolfSSL 16:8e0d178b1d1e 2742 #else
wolfSSL 16:8e0d178b1d1e 2743 static const sp_table_entry p256_table[256] = {
wolfSSL 16:8e0d178b1d1e 2744 /* 0 */
wolfSSL 16:8e0d178b1d1e 2745 { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
wolfSSL 16:8e0d178b1d1e 2746 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
wolfSSL 16:8e0d178b1d1e 2747 /* 1 */
wolfSSL 16:8e0d178b1d1e 2748 { { 0x0a9143c,0x1cc3506,0x360179e,0x3f17fb6,0x075ba95,0x1d88944,
wolfSSL 16:8e0d178b1d1e 2749 0x3b732b7,0x15719e7,0x376a537,0x0062417 },
wolfSSL 16:8e0d178b1d1e 2750 { 0x295560a,0x094d5f3,0x245cddf,0x392e867,0x18b4ab8,0x3487cc9,
wolfSSL 16:8e0d178b1d1e 2751 0x288688d,0x176174b,0x3182588,0x0215c7f } },
wolfSSL 16:8e0d178b1d1e 2752 /* 2 */
wolfSSL 16:8e0d178b1d1e 2753 { { 0x147519a,0x2218090,0x32f0202,0x2b09acd,0x0d0981e,0x1e17af2,
wolfSSL 16:8e0d178b1d1e 2754 0x14a7caa,0x163a6a7,0x10ddbdf,0x03654f1 },
wolfSSL 16:8e0d178b1d1e 2755 { 0x1590f8f,0x0d8733f,0x09179d6,0x1ad139b,0x372e962,0x0bad933,
wolfSSL 16:8e0d178b1d1e 2756 0x1961102,0x223cdff,0x37e9eb2,0x0218fae } },
wolfSSL 16:8e0d178b1d1e 2757 /* 3 */
wolfSSL 16:8e0d178b1d1e 2758 { { 0x0db6485,0x1ad88d7,0x2f97785,0x288bc28,0x3808f0e,0x3df8c02,
wolfSSL 16:8e0d178b1d1e 2759 0x28d9544,0x20280f9,0x055b5ff,0x00001d8 },
wolfSSL 16:8e0d178b1d1e 2760 { 0x38d2010,0x13ae6e0,0x308a763,0x2ecc90d,0x254014f,0x10a9981,
wolfSSL 16:8e0d178b1d1e 2761 0x247d398,0x0fb8383,0x3613437,0x020c21d } },
wolfSSL 16:8e0d178b1d1e 2762 /* 4 */
wolfSSL 16:8e0d178b1d1e 2763 { { 0x2a0d2bb,0x08bf145,0x34994f9,0x1b06988,0x30d5cc1,0x1f18b22,
wolfSSL 16:8e0d178b1d1e 2764 0x01cf3a5,0x199fe49,0x161fd1b,0x00bd79a },
wolfSSL 16:8e0d178b1d1e 2765 { 0x1a01797,0x171c2fd,0x21925c1,0x1358255,0x23d20b4,0x1c7f6d4,
wolfSSL 16:8e0d178b1d1e 2766 0x111b370,0x03dec12,0x1168d6f,0x03d923e } },
wolfSSL 16:8e0d178b1d1e 2767 /* 5 */
wolfSSL 16:8e0d178b1d1e 2768 { { 0x137bbbc,0x19a11f8,0x0bec9e5,0x27a29a8,0x3e43446,0x275cd18,
wolfSSL 16:8e0d178b1d1e 2769 0x0427617,0x00056c7,0x285133d,0x016af80 },
wolfSSL 16:8e0d178b1d1e 2770 { 0x04c7dab,0x2a0df30,0x0c0792a,0x1310c98,0x3573d9f,0x239b30d,
wolfSSL 16:8e0d178b1d1e 2771 0x1315627,0x1ce0c32,0x25b6b6f,0x0252edc } },
wolfSSL 16:8e0d178b1d1e 2772 /* 6 */
wolfSSL 16:8e0d178b1d1e 2773 { { 0x20f141c,0x26d23dc,0x3c74bbf,0x334b7d6,0x06199b3,0x0441171,
wolfSSL 16:8e0d178b1d1e 2774 0x3f61294,0x313bf70,0x3cb2f7d,0x03375ae },
wolfSSL 16:8e0d178b1d1e 2775 { 0x2f436fd,0x19c02fa,0x26becca,0x1b6e64c,0x26f647f,0x053c948,
wolfSSL 16:8e0d178b1d1e 2776 0x0fa7920,0x397d830,0x2bd4bda,0x028d86f } },
wolfSSL 16:8e0d178b1d1e 2777 /* 7 */
wolfSSL 16:8e0d178b1d1e 2778 { { 0x17c13c7,0x2895616,0x03e128a,0x17d42df,0x1c38d63,0x0f02747,
wolfSSL 16:8e0d178b1d1e 2779 0x039aecf,0x0a4b01c,0x209c4b5,0x02e84b2 },
wolfSSL 16:8e0d178b1d1e 2780 { 0x1f91dfd,0x023e916,0x07fb9e4,0x19b3ba8,0x13af43b,0x35e02ca,
wolfSSL 16:8e0d178b1d1e 2781 0x0eb0899,0x3bd2c7b,0x19d701f,0x014faee } },
wolfSSL 16:8e0d178b1d1e 2782 /* 8 */
wolfSSL 16:8e0d178b1d1e 2783 { { 0x0e63d34,0x1fb8c6c,0x0fab4fe,0x1caa795,0x0f46005,0x179ed69,
wolfSSL 16:8e0d178b1d1e 2784 0x093334d,0x120c701,0x39206d5,0x021627e },
wolfSSL 16:8e0d178b1d1e 2785 { 0x183553a,0x03d7319,0x09e5aa7,0x12b8959,0x2087909,0x0011194,
wolfSSL 16:8e0d178b1d1e 2786 0x1045071,0x0713f32,0x16d0254,0x03aec1a } },
wolfSSL 16:8e0d178b1d1e 2787 /* 9 */
wolfSSL 16:8e0d178b1d1e 2788 { { 0x01647c5,0x1b2856b,0x1799461,0x11f133d,0x0b8127d,0x1937eeb,
wolfSSL 16:8e0d178b1d1e 2789 0x266aa37,0x1f68f71,0x0cbd1b2,0x03aca08 },
wolfSSL 16:8e0d178b1d1e 2790 { 0x287e008,0x1be361a,0x38f3940,0x276488d,0x2d87dfa,0x0333b2c,
wolfSSL 16:8e0d178b1d1e 2791 0x2d2e428,0x368755b,0x09b55a7,0x007ca0a } },
wolfSSL 16:8e0d178b1d1e 2792 /* 10 */
wolfSSL 16:8e0d178b1d1e 2793 { { 0x389da99,0x2a8300e,0x0022abb,0x27ae0a1,0x0a6f2d7,0x207017a,
wolfSSL 16:8e0d178b1d1e 2794 0x047862b,0x1358c9e,0x35905e5,0x00cde92 },
wolfSSL 16:8e0d178b1d1e 2795 { 0x1f7794a,0x1d40348,0x3f613c6,0x2ddf5b5,0x0207005,0x133f5ba,
wolfSSL 16:8e0d178b1d1e 2796 0x1a37810,0x3ef5829,0x0d5f4c2,0x0035978 } },
wolfSSL 16:8e0d178b1d1e 2797 /* 11 */
wolfSSL 16:8e0d178b1d1e 2798 { { 0x1275d38,0x026efad,0x2358d9d,0x1142f82,0x14268a7,0x1cfac99,
wolfSSL 16:8e0d178b1d1e 2799 0x362ff49,0x288cbc1,0x24252f4,0x0308f68 },
wolfSSL 16:8e0d178b1d1e 2800 { 0x394520c,0x06e13c2,0x178e5da,0x18ec16f,0x1096667,0x134a7a8,
wolfSSL 16:8e0d178b1d1e 2801 0x0dcb869,0x33fc4e9,0x38cc790,0x006778e } },
wolfSSL 16:8e0d178b1d1e 2802 /* 12 */
wolfSSL 16:8e0d178b1d1e 2803 { { 0x2c5fe04,0x29c5b09,0x1bdb183,0x02ceee8,0x03b28de,0x132dc4b,
wolfSSL 16:8e0d178b1d1e 2804 0x32c586a,0x32ff5d0,0x3d491fc,0x038d372 },
wolfSSL 16:8e0d178b1d1e 2805 { 0x2a58403,0x2351aea,0x3a53b40,0x21a0ba5,0x39a6974,0x1aaaa2b,
wolfSSL 16:8e0d178b1d1e 2806 0x3901273,0x03dfe78,0x3447b4e,0x039d907 } },
wolfSSL 16:8e0d178b1d1e 2807 /* 13 */
wolfSSL 16:8e0d178b1d1e 2808 { { 0x364ba59,0x14e5077,0x02fc7d7,0x3b02c09,0x1d33f10,0x0560616,
wolfSSL 16:8e0d178b1d1e 2809 0x06dfc6a,0x15efd3c,0x357052a,0x01284b7 },
wolfSSL 16:8e0d178b1d1e 2810 { 0x039dbd0,0x18ce3e5,0x3e1fbfa,0x352f794,0x0d3c24b,0x07c6cc5,
wolfSSL 16:8e0d178b1d1e 2811 0x1e4ffa2,0x3a91bf5,0x293bb5b,0x01abd6a } },
wolfSSL 16:8e0d178b1d1e 2812 /* 14 */
wolfSSL 16:8e0d178b1d1e 2813 { { 0x0c91999,0x02da644,0x0491da1,0x100a960,0x00a24b4,0x2330824,
wolfSSL 16:8e0d178b1d1e 2814 0x0094b4b,0x1004cf8,0x35a66a4,0x017f8d1 },
wolfSSL 16:8e0d178b1d1e 2815 { 0x13e7b4b,0x232af7e,0x391ab0f,0x069f08f,0x3292b50,0x3479898,
wolfSSL 16:8e0d178b1d1e 2816 0x2889aec,0x2a4590b,0x308ecfe,0x02d5138 } },
wolfSSL 16:8e0d178b1d1e 2817 /* 15 */
wolfSSL 16:8e0d178b1d1e 2818 { { 0x2ddfdce,0x231ba45,0x39e6647,0x19be245,0x12c3291,0x35399f8,
wolfSSL 16:8e0d178b1d1e 2819 0x0d6e764,0x3082d3a,0x2bda6b0,0x0382dac },
wolfSSL 16:8e0d178b1d1e 2820 { 0x37efb57,0x04b7cae,0x00070d3,0x379e431,0x01aac0d,0x1e6f251,
wolfSSL 16:8e0d178b1d1e 2821 0x0336ad6,0x0ddd3e4,0x3de25a6,0x01c7008 } },
wolfSSL 16:8e0d178b1d1e 2822 /* 16 */
wolfSSL 16:8e0d178b1d1e 2823 { { 0x3e20925,0x230912f,0x286762a,0x30e3f73,0x391c19a,0x34e1c18,
wolfSSL 16:8e0d178b1d1e 2824 0x16a5d5d,0x093d96a,0x3d421d3,0x0187561 },
wolfSSL 16:8e0d178b1d1e 2825 { 0x37173ea,0x19ce8a8,0x0b65e87,0x0214dde,0x2238480,0x16ead0f,
wolfSSL 16:8e0d178b1d1e 2826 0x38441e0,0x3bef843,0x2124621,0x03e847f } },
wolfSSL 16:8e0d178b1d1e 2827 /* 17 */
wolfSSL 16:8e0d178b1d1e 2828 { { 0x0b19ffd,0x247cacb,0x3c231c8,0x16ec648,0x201ba8d,0x2b172a3,
wolfSSL 16:8e0d178b1d1e 2829 0x103d678,0x2fb72db,0x04c1f13,0x0161bac },
wolfSSL 16:8e0d178b1d1e 2830 { 0x3e8ed09,0x171b949,0x2de20c3,0x0f06067,0x21e81a3,0x1b194be,
wolfSSL 16:8e0d178b1d1e 2831 0x0fd6c05,0x13c449e,0x0087086,0x006756b } },
wolfSSL 16:8e0d178b1d1e 2832 /* 18 */
wolfSSL 16:8e0d178b1d1e 2833 { { 0x09a4e1f,0x27d604c,0x00741e9,0x06fa49c,0x0ab7de7,0x3f4a348,
wolfSSL 16:8e0d178b1d1e 2834 0x25ef0be,0x158fc9a,0x33f7f9c,0x039f001 },
wolfSSL 16:8e0d178b1d1e 2835 { 0x2f59f76,0x3598e83,0x30501f6,0x15083f2,0x0669b3b,0x29980b5,
wolfSSL 16:8e0d178b1d1e 2836 0x0c1f7a7,0x0f02b02,0x0fec65b,0x0382141 } },
wolfSSL 16:8e0d178b1d1e 2837 /* 19 */
wolfSSL 16:8e0d178b1d1e 2838 { { 0x031b3ca,0x23da368,0x2d66f09,0x27b9b69,0x06d1cab,0x13c91ba,
wolfSSL 16:8e0d178b1d1e 2839 0x3d81fa9,0x25ad16f,0x0825b09,0x01e3c06 },
wolfSSL 16:8e0d178b1d1e 2840 { 0x225787f,0x3bf790e,0x2c9bb7e,0x0347732,0x28016f8,0x0d6ff0d,
wolfSSL 16:8e0d178b1d1e 2841 0x2a4877b,0x1d1e833,0x3b87e94,0x010e9dc } },
wolfSSL 16:8e0d178b1d1e 2842 /* 20 */
wolfSSL 16:8e0d178b1d1e 2843 { { 0x2b533d5,0x1ddcd34,0x1dc0625,0x3da86f7,0x3673b8a,0x1e7b0a4,
wolfSSL 16:8e0d178b1d1e 2844 0x3e7c9aa,0x19ac55d,0x251c3b2,0x02edb79 },
wolfSSL 16:8e0d178b1d1e 2845 { 0x25259b3,0x24c0ead,0x3480e7e,0x34f40e9,0x3d6a0af,0x2cf3f09,
wolfSSL 16:8e0d178b1d1e 2846 0x2c83d19,0x2e66f16,0x19a5d18,0x0182d18 } },
wolfSSL 16:8e0d178b1d1e 2847 /* 21 */
wolfSSL 16:8e0d178b1d1e 2848 { { 0x2e5aa1c,0x28e3846,0x3658bd6,0x0ad279c,0x1b8b765,0x397e1fb,
wolfSSL 16:8e0d178b1d1e 2849 0x130014e,0x3ff342c,0x3b2aeeb,0x02743c9 },
wolfSSL 16:8e0d178b1d1e 2850 { 0x2730a55,0x0918c5e,0x083aca9,0x0bf76ef,0x19c955b,0x300669c,
wolfSSL 16:8e0d178b1d1e 2851 0x01dfe0a,0x312341f,0x26d356e,0x0091295 } },
wolfSSL 16:8e0d178b1d1e 2852 /* 22 */
wolfSSL 16:8e0d178b1d1e 2853 { { 0x2cf1f96,0x00e52ba,0x271c6db,0x2a40930,0x19f2122,0x0b2f4ee,
wolfSSL 16:8e0d178b1d1e 2854 0x26ac1b8,0x3bda498,0x0873581,0x0117963 },
wolfSSL 16:8e0d178b1d1e 2855 { 0x38f9dbc,0x3d1e768,0x2040d3f,0x11ba222,0x3a8aaf1,0x1b82fb5,
wolfSSL 16:8e0d178b1d1e 2856 0x1adfb24,0x2de9251,0x21cc1e4,0x0301038 } },
wolfSSL 16:8e0d178b1d1e 2857 /* 23 */
wolfSSL 16:8e0d178b1d1e 2858 { { 0x38117b6,0x2bc001b,0x1433847,0x3fdce8d,0x3651969,0x3651d7a,
wolfSSL 16:8e0d178b1d1e 2859 0x2b35761,0x1bb1d20,0x097682c,0x00737d7 },
wolfSSL 16:8e0d178b1d1e 2860 { 0x1f04839,0x1dd6d04,0x16987db,0x3d12378,0x17dbeac,0x1c2cc86,
wolfSSL 16:8e0d178b1d1e 2861 0x121dd1b,0x3fcf6ca,0x1f8a92d,0x00119d5 } },
wolfSSL 16:8e0d178b1d1e 2862 /* 24 */
wolfSSL 16:8e0d178b1d1e 2863 { { 0x0e8ffcd,0x2b174af,0x1a82cc8,0x22cbf98,0x30d53c4,0x080b5b1,
wolfSSL 16:8e0d178b1d1e 2864 0x3161727,0x297cfdb,0x2113b83,0x0011b97 },
wolfSSL 16:8e0d178b1d1e 2865 { 0x0007f01,0x23fd936,0x3183e7b,0x0496bd0,0x07fb1ef,0x178680f,
wolfSSL 16:8e0d178b1d1e 2866 0x1c5ea63,0x0016c11,0x2c3303d,0x01b8041 } },
wolfSSL 16:8e0d178b1d1e 2867 /* 25 */
wolfSSL 16:8e0d178b1d1e 2868 { { 0x0dd73b1,0x1cd6122,0x10d948c,0x23e657b,0x3767070,0x15a8aad,
wolfSSL 16:8e0d178b1d1e 2869 0x385ea8c,0x33c7ce0,0x0ede901,0x0110965 },
wolfSSL 16:8e0d178b1d1e 2870 { 0x2d4b65b,0x2a8b244,0x0c37f8f,0x0ee5b24,0x394c234,0x3a5e347,
wolfSSL 16:8e0d178b1d1e 2871 0x26e4a15,0x39a3b4c,0x2514c2e,0x029e5be } },
wolfSSL 16:8e0d178b1d1e 2872 /* 26 */
wolfSSL 16:8e0d178b1d1e 2873 { { 0x23addd7,0x3ed8120,0x13b3359,0x20f959a,0x09e2a61,0x32fcf20,
wolfSSL 16:8e0d178b1d1e 2874 0x05b78e3,0x19ba7e2,0x1a9c697,0x0392b4b },
wolfSSL 16:8e0d178b1d1e 2875 { 0x2048a61,0x3dfd0a3,0x19a0357,0x233024b,0x3082d19,0x00fb63b,
wolfSSL 16:8e0d178b1d1e 2876 0x3a1af4c,0x1450ff0,0x046c37b,0x0317a50 } },
wolfSSL 16:8e0d178b1d1e 2877 /* 27 */
wolfSSL 16:8e0d178b1d1e 2878 { { 0x3e75f9e,0x294e30a,0x3a78476,0x3a32c48,0x36fd1a9,0x0427012,
wolfSSL 16:8e0d178b1d1e 2879 0x1e4df0b,0x11d1f61,0x1afdb46,0x018ca0f },
wolfSSL 16:8e0d178b1d1e 2880 { 0x2f2df15,0x0a33dee,0x27f4ce7,0x1542b66,0x3e592c4,0x20d2f30,
wolfSSL 16:8e0d178b1d1e 2881 0x3226ade,0x2a4e3ea,0x1ab1981,0x01a2f46 } },
wolfSSL 16:8e0d178b1d1e 2882 /* 28 */
wolfSSL 16:8e0d178b1d1e 2883 { { 0x087d659,0x3ab5446,0x305ac08,0x3d2cd64,0x33374d5,0x3f9d3f8,
wolfSSL 16:8e0d178b1d1e 2884 0x186981c,0x37f5a5a,0x2f53c6f,0x01254a4 },
wolfSSL 16:8e0d178b1d1e 2885 { 0x2cec896,0x1e32786,0x04844a8,0x043b16d,0x3d964b2,0x1935829,
wolfSSL 16:8e0d178b1d1e 2886 0x16f7e26,0x1a0dd9a,0x30d2603,0x003b1d4 } },
wolfSSL 16:8e0d178b1d1e 2887 /* 29 */
wolfSSL 16:8e0d178b1d1e 2888 { { 0x12687bb,0x04e816b,0x21fa2da,0x1abccb8,0x3a1f83b,0x375181e,
wolfSSL 16:8e0d178b1d1e 2889 0x0f5ef51,0x0fc2ce4,0x3a66486,0x003d881 },
wolfSSL 16:8e0d178b1d1e 2890 { 0x3138233,0x1f8eec3,0x2718bd6,0x1b09caa,0x2dd66b9,0x1bb222b,
wolfSSL 16:8e0d178b1d1e 2891 0x1004072,0x1b73e3b,0x07208ed,0x03fc36c } },
wolfSSL 16:8e0d178b1d1e 2892 /* 30 */
wolfSSL 16:8e0d178b1d1e 2893 { { 0x095d553,0x3e84053,0x0a8a749,0x3f575a0,0x3a44052,0x3ced59b,
wolfSSL 16:8e0d178b1d1e 2894 0x3b4317f,0x03a8c60,0x13c8874,0x00c4ed4 },
wolfSSL 16:8e0d178b1d1e 2895 { 0x0d11549,0x0b8ab02,0x221cb40,0x02ed37b,0x2071ee1,0x1fc8c83,
wolfSSL 16:8e0d178b1d1e 2896 0x3987dd4,0x27e049a,0x0f986f1,0x00b4eaf } },
wolfSSL 16:8e0d178b1d1e 2897 /* 31 */
wolfSSL 16:8e0d178b1d1e 2898 { { 0x15581a2,0x2214060,0x11af4c2,0x1598c88,0x19a0a6d,0x32acba6,
wolfSSL 16:8e0d178b1d1e 2899 0x3a7a0f0,0x2337c66,0x210ded9,0x0300dbe },
wolfSSL 16:8e0d178b1d1e 2900 { 0x1fbd009,0x3822eb0,0x181629a,0x2401b45,0x30b68b1,0x2e78363,
wolfSSL 16:8e0d178b1d1e 2901 0x2b32779,0x006530b,0x2c4b6d4,0x029aca8 } },
wolfSSL 16:8e0d178b1d1e 2902 /* 32 */
wolfSSL 16:8e0d178b1d1e 2903 { { 0x13549cf,0x0f943db,0x265ed43,0x1bfeb35,0x06f3369,0x3847f2d,
wolfSSL 16:8e0d178b1d1e 2904 0x1bfdacc,0x26181a5,0x252af7c,0x02043b8 },
wolfSSL 16:8e0d178b1d1e 2905 { 0x159bb2c,0x143f85c,0x357b654,0x2f9d62c,0x2f7dfbe,0x1a7fa9c,
wolfSSL 16:8e0d178b1d1e 2906 0x057e74d,0x05d14ac,0x17a9273,0x035215c } },
wolfSSL 16:8e0d178b1d1e 2907 /* 33 */
wolfSSL 16:8e0d178b1d1e 2908 { { 0x0cb5a98,0x106a2bc,0x10bf117,0x24c7cc4,0x3d3da8f,0x2ce0ab7,
wolfSSL 16:8e0d178b1d1e 2909 0x14e2cba,0x1813866,0x1a72f9a,0x01a9811 },
wolfSSL 16:8e0d178b1d1e 2910 { 0x2b2411d,0x3034fe8,0x16e0170,0x0f9443a,0x0be0eb8,0x2196cf3,
wolfSSL 16:8e0d178b1d1e 2911 0x0c9f738,0x15e40ef,0x0faf9e1,0x034f917 } },
wolfSSL 16:8e0d178b1d1e 2912 /* 34 */
wolfSSL 16:8e0d178b1d1e 2913 { { 0x03f7669,0x3da6efa,0x3d6bce1,0x209ca1d,0x109f8ae,0x09109e3,
wolfSSL 16:8e0d178b1d1e 2914 0x08ae543,0x3067255,0x1dee3c2,0x0081dd5 },
wolfSSL 16:8e0d178b1d1e 2915 { 0x3ef1945,0x358765b,0x28c387b,0x3bec4b4,0x218813c,0x0b7d92a,
wolfSSL 16:8e0d178b1d1e 2916 0x3cd1d67,0x2c0367e,0x2e57154,0x0123717 } },
wolfSSL 16:8e0d178b1d1e 2917 /* 35 */
wolfSSL 16:8e0d178b1d1e 2918 { { 0x3e5a199,0x1e42ffd,0x0bb7123,0x33e6273,0x1e0efb8,0x294671e,
wolfSSL 16:8e0d178b1d1e 2919 0x3a2bfe0,0x3d11709,0x2eddff6,0x03cbec2 },
wolfSSL 16:8e0d178b1d1e 2920 { 0x0b5025f,0x0255d7c,0x1f2241c,0x35d03ea,0x0550543,0x202fef4,
wolfSSL 16:8e0d178b1d1e 2921 0x23c8ad3,0x354963e,0x015db28,0x0284fa4 } },
wolfSSL 16:8e0d178b1d1e 2922 /* 36 */
wolfSSL 16:8e0d178b1d1e 2923 { { 0x2b65cbc,0x1e8d428,0x0226f9f,0x1c8a919,0x10b04b9,0x08fc1e8,
wolfSSL 16:8e0d178b1d1e 2924 0x1ce241e,0x149bc99,0x2b01497,0x00afc35 },
wolfSSL 16:8e0d178b1d1e 2925 { 0x3216fb7,0x1374fd2,0x226ad3d,0x19fef76,0x0f7d7b8,0x1c21417,
wolfSSL 16:8e0d178b1d1e 2926 0x37b83f6,0x3a27eba,0x25a162f,0x010aa52 } },
wolfSSL 16:8e0d178b1d1e 2927 /* 37 */
wolfSSL 16:8e0d178b1d1e 2928 { { 0x2adf191,0x1ab42fa,0x28d7584,0x2409689,0x20f8a48,0x253707d,
wolfSSL 16:8e0d178b1d1e 2929 0x2030504,0x378f7a1,0x169c65e,0x00b0b76 },
wolfSSL 16:8e0d178b1d1e 2930 { 0x3849c17,0x085c764,0x10dd6d0,0x2e87689,0x1460488,0x30e9521,
wolfSSL 16:8e0d178b1d1e 2931 0x10c7063,0x1b6f120,0x21f42c5,0x03d0dfe } },
wolfSSL 16:8e0d178b1d1e 2932 /* 38 */
wolfSSL 16:8e0d178b1d1e 2933 { { 0x20f7dab,0x035c512,0x29ac6aa,0x24c5ddb,0x20f0497,0x17ce5e1,
wolfSSL 16:8e0d178b1d1e 2934 0x00a050f,0x1eaa14b,0x3335470,0x02abd16 },
wolfSSL 16:8e0d178b1d1e 2935 { 0x18d364a,0x0df0cf0,0x316585e,0x018f925,0x0d40b9b,0x17b1511,
wolfSSL 16:8e0d178b1d1e 2936 0x1716811,0x1caf3d0,0x10df4f2,0x0337d8c } },
wolfSSL 16:8e0d178b1d1e 2937 /* 39 */
wolfSSL 16:8e0d178b1d1e 2938 { { 0x2a8b7ef,0x0f188e3,0x2287747,0x06216f0,0x008e935,0x2f6a38d,
wolfSSL 16:8e0d178b1d1e 2939 0x1567722,0x0bfc906,0x0bada9e,0x03c3402 },
wolfSSL 16:8e0d178b1d1e 2940 { 0x014d3b1,0x099c749,0x2a76291,0x216c067,0x3b37549,0x14ef2f6,
wolfSSL 16:8e0d178b1d1e 2941 0x21b96d4,0x1ee2d71,0x2f5ca88,0x016f570 } },
wolfSSL 16:8e0d178b1d1e 2942 /* 40 */
wolfSSL 16:8e0d178b1d1e 2943 { { 0x09a3154,0x3d1a7bd,0x2e9aef0,0x255b8ac,0x03e85a5,0x2a492a7,
wolfSSL 16:8e0d178b1d1e 2944 0x2aec1ea,0x11c6516,0x3c8a09e,0x02a84b7 },
wolfSSL 16:8e0d178b1d1e 2945 { 0x1f69f1d,0x09c89d3,0x1e7326f,0x0b28bfd,0x0e0e4c8,0x1ea7751,
wolfSSL 16:8e0d178b1d1e 2946 0x18ce73b,0x2a406e7,0x273e48c,0x01b00db } },
wolfSSL 16:8e0d178b1d1e 2947 /* 41 */
wolfSSL 16:8e0d178b1d1e 2948 { { 0x36e3138,0x2b84a83,0x345a5cf,0x00096b4,0x16966ef,0x159caf1,
wolfSSL 16:8e0d178b1d1e 2949 0x13c64b4,0x2f89226,0x25896af,0x00a4bfd },
wolfSSL 16:8e0d178b1d1e 2950 { 0x2213402,0x1435117,0x09fed52,0x09d0e4b,0x0f6580e,0x2871cba,
wolfSSL 16:8e0d178b1d1e 2951 0x3b397fd,0x1c9d825,0x090311b,0x0191383 } },
wolfSSL 16:8e0d178b1d1e 2952 /* 42 */
wolfSSL 16:8e0d178b1d1e 2953 { { 0x07153f0,0x1087869,0x18c9e1e,0x1e64810,0x2b86c3b,0x0175d9c,
wolfSSL 16:8e0d178b1d1e 2954 0x3dce877,0x269de4e,0x393cab7,0x03c96b9 },
wolfSSL 16:8e0d178b1d1e 2955 { 0x1869d0c,0x06528db,0x02641f3,0x209261b,0x29d55c8,0x25ba517,
wolfSSL 16:8e0d178b1d1e 2956 0x3b5ea30,0x028f927,0x25313db,0x00e6e39 } },
wolfSSL 16:8e0d178b1d1e 2957 /* 43 */
wolfSSL 16:8e0d178b1d1e 2958 { { 0x2fd2e59,0x150802d,0x098f377,0x19a4957,0x135e2c0,0x38a95ce,
wolfSSL 16:8e0d178b1d1e 2959 0x1ab21a0,0x36c1b67,0x32f0f19,0x00e448b },
wolfSSL 16:8e0d178b1d1e 2960 { 0x3cad53c,0x3387800,0x17e3cfb,0x03f9970,0x3225b2c,0x2a84e1d,
wolfSSL 16:8e0d178b1d1e 2961 0x3af1d29,0x3fe35ca,0x2f8ce80,0x0237a02 } },
wolfSSL 16:8e0d178b1d1e 2962 /* 44 */
wolfSSL 16:8e0d178b1d1e 2963 { { 0x07bbb76,0x3aa3648,0x2758afb,0x1f085e0,0x1921c7e,0x3010dac,
wolfSSL 16:8e0d178b1d1e 2964 0x22b74b1,0x230137e,0x1062e36,0x021c652 },
wolfSSL 16:8e0d178b1d1e 2965 { 0x3993df5,0x24a2ee8,0x126ab5f,0x2d7cecf,0x0639d75,0x16d5414,
wolfSSL 16:8e0d178b1d1e 2966 0x1aa78a8,0x3f78404,0x26a5b74,0x03f0c57 } },
wolfSSL 16:8e0d178b1d1e 2967 /* 45 */
wolfSSL 16:8e0d178b1d1e 2968 { { 0x0d6ecfa,0x3f506ba,0x3f86561,0x3d86bb1,0x15f8c44,0x2491d07,
wolfSSL 16:8e0d178b1d1e 2969 0x052a7b4,0x2422261,0x3adee38,0x039b529 },
wolfSSL 16:8e0d178b1d1e 2970 { 0x193c75d,0x14bb451,0x1162605,0x293749c,0x370a70d,0x2e8b1f6,
wolfSSL 16:8e0d178b1d1e 2971 0x2ede937,0x2b95f4a,0x39a9be2,0x00d77eb } },
wolfSSL 16:8e0d178b1d1e 2972 /* 46 */
wolfSSL 16:8e0d178b1d1e 2973 { { 0x2736636,0x15bf36a,0x2b7e6b9,0x25eb8b2,0x209f51d,0x3cd2659,
wolfSSL 16:8e0d178b1d1e 2974 0x10bf410,0x034afec,0x3d71c83,0x0076971 },
wolfSSL 16:8e0d178b1d1e 2975 { 0x0ce6825,0x07920cf,0x3c3b5c4,0x23fe55c,0x015ad11,0x08c0dae,
wolfSSL 16:8e0d178b1d1e 2976 0x0552c7f,0x2e75a8a,0x0fddbf4,0x01c1df0 } },
wolfSSL 16:8e0d178b1d1e 2977 /* 47 */
wolfSSL 16:8e0d178b1d1e 2978 { { 0x2b9661c,0x0ffe351,0x3d71bf6,0x1ac34b3,0x3a1dfd3,0x211fe3d,
wolfSSL 16:8e0d178b1d1e 2979 0x33e140a,0x3f9100d,0x32ee50e,0x014ea18 },
wolfSSL 16:8e0d178b1d1e 2980 { 0x16d8051,0x1bfda1a,0x068a097,0x2571d3d,0x1daec0c,0x39389af,
wolfSSL 16:8e0d178b1d1e 2981 0x194dc35,0x3f3058a,0x36d34e1,0x000a329 } },
wolfSSL 16:8e0d178b1d1e 2982 /* 48 */
wolfSSL 16:8e0d178b1d1e 2983 { { 0x09877ee,0x351f73f,0x0002d11,0x0420074,0x2c8b362,0x130982d,
wolfSSL 16:8e0d178b1d1e 2984 0x02c1175,0x3c11b40,0x0d86962,0x001305f },
wolfSSL 16:8e0d178b1d1e 2985 { 0x0daddf5,0x2f4252c,0x15c06d9,0x1d49339,0x1bea235,0x0b680ed,
wolfSSL 16:8e0d178b1d1e 2986 0x3356e67,0x1d1d198,0x1e9fed9,0x03dee93 } },
wolfSSL 16:8e0d178b1d1e 2987 /* 49 */
wolfSSL 16:8e0d178b1d1e 2988 { { 0x3e1263f,0x2fe8d3a,0x3ce6d0d,0x0d5c6b9,0x3557637,0x0a9bd48,
wolfSSL 16:8e0d178b1d1e 2989 0x0405538,0x0710749,0x2005213,0x038c7e5 },
wolfSSL 16:8e0d178b1d1e 2990 { 0x26b6ec6,0x2e485ba,0x3c44d1b,0x0b9cf0b,0x037a1d1,0x27428a5,
wolfSSL 16:8e0d178b1d1e 2991 0x0e7eac8,0x351ef04,0x259ce34,0x02a8e98 } },
wolfSSL 16:8e0d178b1d1e 2992 /* 50 */
wolfSSL 16:8e0d178b1d1e 2993 { { 0x2f3dcd3,0x3e77d4d,0x3360fbc,0x1434afd,0x36ceded,0x3d413d6,
wolfSSL 16:8e0d178b1d1e 2994 0x1710fad,0x36bb924,0x1627e79,0x008e637 },
wolfSSL 16:8e0d178b1d1e 2995 { 0x109569e,0x1c168db,0x3769cf4,0x2ed4527,0x0ea0619,0x17d80d3,
wolfSSL 16:8e0d178b1d1e 2996 0x1c03773,0x18843fe,0x1b21c04,0x015c5fd } },
wolfSSL 16:8e0d178b1d1e 2997 /* 51 */
wolfSSL 16:8e0d178b1d1e 2998 { { 0x1dd895e,0x08a7248,0x04519fe,0x001030a,0x18e5185,0x358dfb3,
wolfSSL 16:8e0d178b1d1e 2999 0x13d2391,0x0a37be8,0x0560e3c,0x019828b },
wolfSSL 16:8e0d178b1d1e 3000 { 0x27fcbd0,0x2a22bb5,0x30969cc,0x1e03aa7,0x1c84724,0x0ba4ad3,
wolfSSL 16:8e0d178b1d1e 3001 0x32f4817,0x0914cca,0x14c4f52,0x01893b9 } },
wolfSSL 16:8e0d178b1d1e 3002 /* 52 */
wolfSSL 16:8e0d178b1d1e 3003 { { 0x097eccc,0x1273936,0x00aa095,0x364fe62,0x04d49d1,0x10e9f08,
wolfSSL 16:8e0d178b1d1e 3004 0x3c24230,0x3ef01c8,0x2fb92bd,0x013ce4a },
wolfSSL 16:8e0d178b1d1e 3005 { 0x1e44fd9,0x27e3e9f,0x2156696,0x3915ecc,0x0b66cfb,0x1a3af0f,
wolfSSL 16:8e0d178b1d1e 3006 0x2fa8033,0x0e6736c,0x177ccdb,0x0228f9e } },
wolfSSL 16:8e0d178b1d1e 3007 /* 53 */
wolfSSL 16:8e0d178b1d1e 3008 { { 0x2c4b125,0x06207c1,0x0a8cdde,0x003db8f,0x1ae34e3,0x31e84fa,
wolfSSL 16:8e0d178b1d1e 3009 0x2999de5,0x11013bd,0x02370c2,0x00e2234 },
wolfSSL 16:8e0d178b1d1e 3010 { 0x0f91081,0x200d591,0x1504762,0x1857c05,0x23d9fcf,0x0cb34db,
wolfSSL 16:8e0d178b1d1e 3011 0x27edc86,0x08cd860,0x2471810,0x029798b } },
wolfSSL 16:8e0d178b1d1e 3012 /* 54 */
wolfSSL 16:8e0d178b1d1e 3013 { { 0x3acd6c8,0x097b8cb,0x3c661a8,0x15152f2,0x1699c63,0x237e64c,
wolfSSL 16:8e0d178b1d1e 3014 0x23edf79,0x16b7033,0x0e6466a,0x00b11da },
wolfSSL 16:8e0d178b1d1e 3015 { 0x0a64bc9,0x1bfe324,0x1f5cb34,0x08391de,0x0630a60,0x3017a21,
wolfSSL 16:8e0d178b1d1e 3016 0x09d064b,0x14a8365,0x041f9e6,0x01ed799 } },
wolfSSL 16:8e0d178b1d1e 3017 /* 55 */
wolfSSL 16:8e0d178b1d1e 3018 { { 0x128444a,0x2508b07,0x2a39216,0x362f84d,0x2e996c5,0x2c31ff3,
wolfSSL 16:8e0d178b1d1e 3019 0x07afe5f,0x1d1288e,0x3cb0c8d,0x02e2bdc },
wolfSSL 16:8e0d178b1d1e 3020 { 0x38b86fd,0x3a0ea8c,0x1cff5fd,0x1629629,0x3fee3f1,0x02b250c,
wolfSSL 16:8e0d178b1d1e 3021 0x2e8f6f2,0x0225727,0x15f7f3f,0x0280d8e } },
wolfSSL 16:8e0d178b1d1e 3022 /* 56 */
wolfSSL 16:8e0d178b1d1e 3023 { { 0x10f7770,0x0f1aee8,0x0e248c7,0x20684a8,0x3a6f16d,0x06f0ae7,
wolfSSL 16:8e0d178b1d1e 3024 0x0df6825,0x2d4cc40,0x301875f,0x012f8da },
wolfSSL 16:8e0d178b1d1e 3025 { 0x3b56dbb,0x1821ba7,0x24f8922,0x22c1f9e,0x0306fef,0x1b54bc8,
wolfSSL 16:8e0d178b1d1e 3026 0x2ccc056,0x00303ba,0x2871bdc,0x0232f26 } },
wolfSSL 16:8e0d178b1d1e 3027 /* 57 */
wolfSSL 16:8e0d178b1d1e 3028 { { 0x0dac4ab,0x0625730,0x3112e13,0x101c4bf,0x3a874a4,0x2873b95,
wolfSSL 16:8e0d178b1d1e 3029 0x32ae7c6,0x0d7e18c,0x13e0c08,0x01139d5 },
wolfSSL 16:8e0d178b1d1e 3030 { 0x334002d,0x00fffdd,0x025c6d5,0x22c2cd1,0x19d35cb,0x3a1ce2d,
wolfSSL 16:8e0d178b1d1e 3031 0x3702760,0x3f06257,0x03a5eb8,0x011c29a } },
wolfSSL 16:8e0d178b1d1e 3032 /* 58 */
wolfSSL 16:8e0d178b1d1e 3033 { { 0x0513482,0x1d87724,0x276a81b,0x0a807a4,0x3028720,0x339cc20,
wolfSSL 16:8e0d178b1d1e 3034 0x2441ee0,0x31bbf36,0x290c63d,0x0059041 },
wolfSSL 16:8e0d178b1d1e 3035 { 0x106a2ed,0x0d2819b,0x100bf50,0x114626c,0x1dd4d77,0x2e08632,
wolfSSL 16:8e0d178b1d1e 3036 0x14ae72a,0x2ed3f64,0x1fd7abc,0x035cd1e } },
wolfSSL 16:8e0d178b1d1e 3037 /* 59 */
wolfSSL 16:8e0d178b1d1e 3038 { { 0x2d4c6e5,0x3bec596,0x104d7ed,0x23d6c1b,0x0262cf0,0x15d72c5,
wolfSSL 16:8e0d178b1d1e 3039 0x2d5bb18,0x199ac4b,0x1e30771,0x020591a },
wolfSSL 16:8e0d178b1d1e 3040 { 0x21e291e,0x2e75e55,0x1661d7a,0x08b0778,0x3eb9daf,0x0d78144,
wolfSSL 16:8e0d178b1d1e 3041 0x1827eb1,0x0fe73d2,0x123f0dd,0x0028db7 } },
wolfSSL 16:8e0d178b1d1e 3042 /* 60 */
wolfSSL 16:8e0d178b1d1e 3043 { { 0x1d5533c,0x34cb1d0,0x228f098,0x27a1a11,0x17c5f5a,0x0d26f44,
wolfSSL 16:8e0d178b1d1e 3044 0x2228ade,0x2c460e6,0x3d6fdba,0x038cc77 },
wolfSSL 16:8e0d178b1d1e 3045 { 0x3cc6ed8,0x02ada1a,0x260e510,0x2f7bde8,0x37160c3,0x33a1435,
wolfSSL 16:8e0d178b1d1e 3046 0x23d9a7b,0x0ce2641,0x02a492e,0x034ed1e } },
wolfSSL 16:8e0d178b1d1e 3047 /* 61 */
wolfSSL 16:8e0d178b1d1e 3048 { { 0x3821f90,0x26dba3c,0x3aada14,0x3b59bad,0x292edd9,0x2804c45,
wolfSSL 16:8e0d178b1d1e 3049 0x3669531,0x296f42e,0x35a4c86,0x01ca049 },
wolfSSL 16:8e0d178b1d1e 3050 { 0x3ff47e5,0x2163df4,0x2441503,0x2f18405,0x15e1616,0x37f66ec,
wolfSSL 16:8e0d178b1d1e 3051 0x30f11a7,0x141658a,0x27ece14,0x00b018b } },
wolfSSL 16:8e0d178b1d1e 3052 /* 62 */
wolfSSL 16:8e0d178b1d1e 3053 { { 0x159ac2e,0x3e65bc0,0x2713a76,0x0db2f6c,0x3281e77,0x2391811,
wolfSSL 16:8e0d178b1d1e 3054 0x16d2880,0x1fbc4ab,0x1f92c4e,0x00a0a8d },
wolfSSL 16:8e0d178b1d1e 3055 { 0x0ce5cd2,0x152c7b0,0x02299c3,0x3244de7,0x2cf99ef,0x3a0b047,
wolfSSL 16:8e0d178b1d1e 3056 0x2caf383,0x0aaf664,0x113554d,0x031c735 } },
wolfSSL 16:8e0d178b1d1e 3057 /* 63 */
wolfSSL 16:8e0d178b1d1e 3058 { { 0x1b578f4,0x177a702,0x3a7a488,0x1638ebf,0x31884e2,0x2460bc7,
wolfSSL 16:8e0d178b1d1e 3059 0x36b1b75,0x3ce8e3d,0x340cf47,0x03143d9 },
wolfSSL 16:8e0d178b1d1e 3060 { 0x34b68ea,0x12b7ccd,0x1fe2a9c,0x08da659,0x0a406f3,0x1694c14,
wolfSSL 16:8e0d178b1d1e 3061 0x06a2228,0x16370be,0x3a72129,0x02e7b2c } },
wolfSSL 16:8e0d178b1d1e 3062 /* 64 */
wolfSSL 16:8e0d178b1d1e 3063 { { 0x0f8b16a,0x21043bd,0x266a56f,0x3fb11ec,0x197241a,0x36721f0,
wolfSSL 16:8e0d178b1d1e 3064 0x006b8e6,0x2ac6c29,0x202cd42,0x0200fcf },
wolfSSL 16:8e0d178b1d1e 3065 { 0x0dbec69,0x0c26a01,0x105f7f0,0x3dceeeb,0x3a83b85,0x363865f,
wolfSSL 16:8e0d178b1d1e 3066 0x097273a,0x2b70718,0x00e5067,0x03025d1 } },
wolfSSL 16:8e0d178b1d1e 3067 /* 65 */
wolfSSL 16:8e0d178b1d1e 3068 { { 0x379ab34,0x295bcb0,0x38d1846,0x22e1077,0x3a8ee06,0x1db1a3b,
wolfSSL 16:8e0d178b1d1e 3069 0x3144591,0x07cc080,0x2d5915f,0x03c6bcc },
wolfSSL 16:8e0d178b1d1e 3070 { 0x175bd50,0x0dd4c57,0x27bc99c,0x2ebdcbd,0x3837cff,0x235dc8f,
wolfSSL 16:8e0d178b1d1e 3071 0x13a4184,0x0722c18,0x130e2d4,0x008f43c } },
wolfSSL 16:8e0d178b1d1e 3072 /* 66 */
wolfSSL 16:8e0d178b1d1e 3073 { { 0x01500d9,0x2adbb7d,0x2da8857,0x397f2fa,0x10d890a,0x25c9654,
wolfSSL 16:8e0d178b1d1e 3074 0x3e86488,0x3eb754b,0x1d6c0a3,0x02c0a23 },
wolfSSL 16:8e0d178b1d1e 3075 { 0x10bcb08,0x083cc19,0x2e16853,0x04da575,0x271af63,0x2626a9d,
wolfSSL 16:8e0d178b1d1e 3076 0x3520a7b,0x32348c7,0x24ff408,0x03ff4dc } },
wolfSSL 16:8e0d178b1d1e 3077 /* 67 */
wolfSSL 16:8e0d178b1d1e 3078 { { 0x058e6cb,0x1a3992d,0x1d28539,0x080c5e9,0x2992dad,0x2a9d7d5,
wolfSSL 16:8e0d178b1d1e 3079 0x14ae0b7,0x09b7ce0,0x34ad78c,0x03d5643 },
wolfSSL 16:8e0d178b1d1e 3080 { 0x30ba55a,0x092f4f3,0x0bae0fc,0x12831de,0x20fc472,0x20ed9d2,
wolfSSL 16:8e0d178b1d1e 3081 0x29864f6,0x1288073,0x254f6f7,0x00635b6 } },
wolfSSL 16:8e0d178b1d1e 3082 /* 68 */
wolfSSL 16:8e0d178b1d1e 3083 { { 0x1be5a2b,0x0f88975,0x33c6ed9,0x20d64d3,0x06fe799,0x0989bff,
wolfSSL 16:8e0d178b1d1e 3084 0x1409262,0x085a90c,0x0d97990,0x0142eed },
wolfSSL 16:8e0d178b1d1e 3085 { 0x17ec63e,0x06471b9,0x0db2378,0x1006077,0x265422c,0x08db83d,
wolfSSL 16:8e0d178b1d1e 3086 0x28099b0,0x1270d06,0x11801fe,0x00ac400 } },
wolfSSL 16:8e0d178b1d1e 3087 /* 69 */
wolfSSL 16:8e0d178b1d1e 3088 { { 0x3391593,0x22d7166,0x30fcfc6,0x2896609,0x3c385f5,0x066b72e,
wolfSSL 16:8e0d178b1d1e 3089 0x04f3aad,0x2b831c5,0x19983fb,0x0375562 },
wolfSSL 16:8e0d178b1d1e 3090 { 0x0b82ff4,0x222e39d,0x34c993b,0x101c79c,0x2d2e03c,0x0f00c8a,
wolfSSL 16:8e0d178b1d1e 3091 0x3a9eaf4,0x1810669,0x151149d,0x039b931 } },
wolfSSL 16:8e0d178b1d1e 3092 /* 70 */
wolfSSL 16:8e0d178b1d1e 3093 { { 0x29af288,0x1956ec7,0x293155f,0x193deb6,0x1647e1a,0x2ca0839,
wolfSSL 16:8e0d178b1d1e 3094 0x297e4bc,0x15bfd0d,0x1b107ed,0x0147803 },
wolfSSL 16:8e0d178b1d1e 3095 { 0x31c327e,0x05a6e1d,0x02ad43d,0x02d2a5b,0x129cdb2,0x37ad1de,
wolfSSL 16:8e0d178b1d1e 3096 0x3d51f53,0x245df01,0x2414982,0x0388bd0 } },
wolfSSL 16:8e0d178b1d1e 3097 /* 71 */
wolfSSL 16:8e0d178b1d1e 3098 { { 0x35f1abb,0x17a3d18,0x0874cd4,0x2d5a14e,0x17edc0c,0x16a00d3,
wolfSSL 16:8e0d178b1d1e 3099 0x072c1fb,0x1232725,0x33d52dc,0x03dc24d },
wolfSSL 16:8e0d178b1d1e 3100 { 0x0af30d6,0x259aeea,0x369c401,0x12bc4de,0x295bf5f,0x0d8711f,
wolfSSL 16:8e0d178b1d1e 3101 0x26162a9,0x16c44e5,0x288e727,0x02f54b4 } },
wolfSSL 16:8e0d178b1d1e 3102 /* 72 */
wolfSSL 16:8e0d178b1d1e 3103 { { 0x05fa877,0x1571ea7,0x3d48ab1,0x1c9f4e8,0x017dad6,0x0f46276,
wolfSSL 16:8e0d178b1d1e 3104 0x343f9e7,0x1de990f,0x0e4c8aa,0x028343e },
wolfSSL 16:8e0d178b1d1e 3105 { 0x094f92d,0x3abf633,0x1b3a0bb,0x2f83137,0x0d818c8,0x20bae85,
wolfSSL 16:8e0d178b1d1e 3106 0x0c65f8b,0x1a8008b,0x0c7946d,0x0295b1e } },
wolfSSL 16:8e0d178b1d1e 3107 /* 73 */
wolfSSL 16:8e0d178b1d1e 3108 { { 0x1d09529,0x08e46c3,0x1fcf296,0x298f6b7,0x1803e0e,0x2d6fd20,
wolfSSL 16:8e0d178b1d1e 3109 0x37351f5,0x0d9e8b1,0x1f8731a,0x0362fbf },
wolfSSL 16:8e0d178b1d1e 3110 { 0x00157f4,0x06750bf,0x2650ab9,0x35ffb23,0x2f51cae,0x0b522c2,
wolfSSL 16:8e0d178b1d1e 3111 0x39cb400,0x191e337,0x0a5ce9f,0x021529a } },
wolfSSL 16:8e0d178b1d1e 3112 /* 74 */
wolfSSL 16:8e0d178b1d1e 3113 { { 0x3506ea5,0x17d9ed8,0x0d66dc3,0x22693f8,0x19286c4,0x3a57353,
wolfSSL 16:8e0d178b1d1e 3114 0x101d3bf,0x1aa54fc,0x20b9884,0x0172b3a },
wolfSSL 16:8e0d178b1d1e 3115 { 0x0eac44d,0x37d8327,0x1c3aa90,0x3d0d534,0x23db29a,0x3576eaf,
wolfSSL 16:8e0d178b1d1e 3116 0x1d3de8a,0x3bea423,0x11235e4,0x039260b } },
wolfSSL 16:8e0d178b1d1e 3117 /* 75 */
wolfSSL 16:8e0d178b1d1e 3118 { { 0x34cd55e,0x01288b0,0x1132231,0x2cc9a03,0x358695b,0x3e87650,
wolfSSL 16:8e0d178b1d1e 3119 0x345afa1,0x01267ec,0x3f616b2,0x02011ad },
wolfSSL 16:8e0d178b1d1e 3120 { 0x0e7d098,0x0d6078e,0x0b70b53,0x237d1bc,0x0d7f61e,0x132de31,
wolfSSL 16:8e0d178b1d1e 3121 0x1ea9ea4,0x2bd54c3,0x27b9082,0x03ac5f2 } },
wolfSSL 16:8e0d178b1d1e 3122 /* 76 */
wolfSSL 16:8e0d178b1d1e 3123 { { 0x2a145b9,0x06d661d,0x31ec175,0x03f06f1,0x3a5cf6b,0x249c56e,
wolfSSL 16:8e0d178b1d1e 3124 0x2035653,0x384c74f,0x0bafab5,0x0025ec0 },
wolfSSL 16:8e0d178b1d1e 3125 { 0x25f69e1,0x1b23a55,0x1199aa6,0x16ad6f9,0x077e8f7,0x293f661,
wolfSSL 16:8e0d178b1d1e 3126 0x33ba11d,0x3327980,0x07bafdb,0x03e571d } },
wolfSSL 16:8e0d178b1d1e 3127 /* 77 */
wolfSSL 16:8e0d178b1d1e 3128 { { 0x2bae45e,0x3c074ef,0x2955558,0x3c312f1,0x2a8ebe9,0x2f193f1,
wolfSSL 16:8e0d178b1d1e 3129 0x3705b1d,0x360deba,0x01e566e,0x00d4498 },
wolfSSL 16:8e0d178b1d1e 3130 { 0x21161cd,0x1bc787e,0x2f87933,0x3553197,0x1328ab8,0x093c879,
wolfSSL 16:8e0d178b1d1e 3131 0x17eee27,0x2adad1d,0x1236068,0x003be5c } },
wolfSSL 16:8e0d178b1d1e 3132 /* 78 */
wolfSSL 16:8e0d178b1d1e 3133 { { 0x0ca4226,0x2633dd5,0x2c8e025,0x0e3e190,0x05eede1,0x1a385e4,
wolfSSL 16:8e0d178b1d1e 3134 0x163f744,0x2f25522,0x1333b4f,0x03f05b6 },
wolfSSL 16:8e0d178b1d1e 3135 { 0x3c800ca,0x1becc79,0x2daabe9,0x0c499e2,0x1138063,0x3fcfa2d,
wolfSSL 16:8e0d178b1d1e 3136 0x2244976,0x1e85cf5,0x2f1b95d,0x0053292 } },
wolfSSL 16:8e0d178b1d1e 3137 /* 79 */
wolfSSL 16:8e0d178b1d1e 3138 { { 0x12f81d5,0x1dc6eaf,0x11967a4,0x1a407df,0x31a5f9d,0x2b67241,
wolfSSL 16:8e0d178b1d1e 3139 0x18bef7c,0x08c7762,0x063f59c,0x01015ec },
wolfSSL 16:8e0d178b1d1e 3140 { 0x1c05c0a,0x360bfa2,0x1f85bff,0x1bc7703,0x3e4911c,0x0d685b6,
wolfSSL 16:8e0d178b1d1e 3141 0x2fccaea,0x02c4cef,0x164f133,0x0070ed7 } },
wolfSSL 16:8e0d178b1d1e 3142 /* 80 */
wolfSSL 16:8e0d178b1d1e 3143 { { 0x0ec21fe,0x052ffa0,0x3e825fe,0x1ab0956,0x3f6ce11,0x3d29759,
wolfSSL 16:8e0d178b1d1e 3144 0x3c5a072,0x18ebe62,0x148db7e,0x03eb49c },
wolfSSL 16:8e0d178b1d1e 3145 { 0x1ab05b3,0x02dab0a,0x1ae690c,0x0f13894,0x137a9a8,0x0aab79f,
wolfSSL 16:8e0d178b1d1e 3146 0x3dc875c,0x06a1029,0x1e39f0e,0x01dce1f } },
wolfSSL 16:8e0d178b1d1e 3147 /* 81 */
wolfSSL 16:8e0d178b1d1e 3148 { { 0x16c0dd7,0x3b31269,0x2c741e9,0x3611821,0x2a5cffc,0x1416bb3,
wolfSSL 16:8e0d178b1d1e 3149 0x3a1408f,0x311fa3d,0x1c0bef0,0x02cdee1 },
wolfSSL 16:8e0d178b1d1e 3150 { 0x00e6a8f,0x1adb933,0x0f23359,0x2fdace2,0x2fd6d4b,0x0e73bd3,
wolfSSL 16:8e0d178b1d1e 3151 0x2453fac,0x0a356ae,0x2c8f9f6,0x02704d6 } },
wolfSSL 16:8e0d178b1d1e 3152 /* 82 */
wolfSSL 16:8e0d178b1d1e 3153 { { 0x0e35743,0x28c80a1,0x0def32a,0x2c6168f,0x1320d6a,0x37c6606,
wolfSSL 16:8e0d178b1d1e 3154 0x21b1761,0x2147ee0,0x21fc433,0x015c84d },
wolfSSL 16:8e0d178b1d1e 3155 { 0x1fc9168,0x36cda9c,0x003c1f0,0x1cd7971,0x15f98ba,0x1ef363d,
wolfSSL 16:8e0d178b1d1e 3156 0x0ca87e3,0x046f7d9,0x3c9e6bb,0x0372eb0 } },
wolfSSL 16:8e0d178b1d1e 3157 /* 83 */
wolfSSL 16:8e0d178b1d1e 3158 { { 0x118cbe2,0x3665a11,0x304ef01,0x062727a,0x3d242fc,0x11ffbaf,
wolfSSL 16:8e0d178b1d1e 3159 0x3663c7e,0x1a189c9,0x09e2d62,0x02e3072 },
wolfSSL 16:8e0d178b1d1e 3160 { 0x0e1d569,0x162f772,0x0cd051a,0x322df62,0x3563809,0x047cc7a,
wolfSSL 16:8e0d178b1d1e 3161 0x027fd9f,0x08b509b,0x3da2f94,0x01748ee } },
wolfSSL 16:8e0d178b1d1e 3162 /* 84 */
wolfSSL 16:8e0d178b1d1e 3163 { { 0x1c8f8be,0x31ca525,0x22bf0a1,0x200efcd,0x02961c4,0x3d8f52b,
wolfSSL 16:8e0d178b1d1e 3164 0x018403d,0x3a40279,0x1cb91ec,0x030427e },
wolfSSL 16:8e0d178b1d1e 3165 { 0x0945705,0x0257416,0x05c0c2d,0x25b77ae,0x3b9083d,0x2901126,
wolfSSL 16:8e0d178b1d1e 3166 0x292b8d7,0x07b8611,0x04f2eee,0x026f0cd } },
wolfSSL 16:8e0d178b1d1e 3167 /* 85 */
wolfSSL 16:8e0d178b1d1e 3168 { { 0x2913074,0x2b8d590,0x02b10d5,0x09d2295,0x255491b,0x0c41cca,
wolfSSL 16:8e0d178b1d1e 3169 0x1ca665b,0x133051a,0x1525f1a,0x00a5647 },
wolfSSL 16:8e0d178b1d1e 3170 { 0x04f983f,0x3d6daee,0x04e1e76,0x1067d7e,0x1be7eef,0x02ea862,
wolfSSL 16:8e0d178b1d1e 3171 0x00d4968,0x0ccb048,0x11f18ef,0x018dd95 } },
wolfSSL 16:8e0d178b1d1e 3172 /* 86 */
wolfSSL 16:8e0d178b1d1e 3173 { { 0x22976cc,0x17c5395,0x2c38bda,0x3983bc4,0x222bca3,0x332a614,
wolfSSL 16:8e0d178b1d1e 3174 0x3a30646,0x261eaef,0x1c808e2,0x02f6de7 },
wolfSSL 16:8e0d178b1d1e 3175 { 0x306a772,0x32d7272,0x2dcefd2,0x2abf94d,0x038f475,0x30ad76e,
wolfSSL 16:8e0d178b1d1e 3176 0x23e0227,0x3052b0a,0x001add3,0x023ba18 } },
wolfSSL 16:8e0d178b1d1e 3177 /* 87 */
wolfSSL 16:8e0d178b1d1e 3178 { { 0x0ade873,0x25a6069,0x248ccbe,0x13713ee,0x17ee9aa,0x28152e9,
wolfSSL 16:8e0d178b1d1e 3179 0x2e28995,0x2a92cb3,0x17a6f77,0x024b947 },
wolfSSL 16:8e0d178b1d1e 3180 { 0x190a34d,0x2ebea1c,0x1ed1948,0x16fdaf4,0x0d698f7,0x32bc451,
wolfSSL 16:8e0d178b1d1e 3181 0x0ee6e30,0x2aaab40,0x06f0a56,0x01460be } },
wolfSSL 16:8e0d178b1d1e 3182 /* 88 */
wolfSSL 16:8e0d178b1d1e 3183 { { 0x24cc99c,0x1884b1e,0x1ca1fba,0x1a0f9b6,0x2ff609b,0x2b26316,
wolfSSL 16:8e0d178b1d1e 3184 0x3b27cb5,0x29bc976,0x35d4073,0x024772a },
wolfSSL 16:8e0d178b1d1e 3185 { 0x3575a70,0x1b30f57,0x07fa01b,0x0e5be36,0x20cb361,0x26605cd,
wolfSSL 16:8e0d178b1d1e 3186 0x1d4e8c8,0x13cac59,0x2db9797,0x005e833 } },
wolfSSL 16:8e0d178b1d1e 3187 /* 89 */
wolfSSL 16:8e0d178b1d1e 3188 { { 0x36c8d3a,0x1878a81,0x124b388,0x0e4843e,0x1701aad,0x0ea0d76,
wolfSSL 16:8e0d178b1d1e 3189 0x10eae41,0x37d0653,0x36c7f4c,0x00ba338 },
wolfSSL 16:8e0d178b1d1e 3190 { 0x37a862b,0x1cf6ac0,0x08fa912,0x2dd8393,0x101ba9b,0x0eebcb7,
wolfSSL 16:8e0d178b1d1e 3191 0x2453883,0x1a3cfe5,0x2cb34f6,0x03d3331 } },
wolfSSL 16:8e0d178b1d1e 3192 /* 90 */
wolfSSL 16:8e0d178b1d1e 3193 { { 0x1f79687,0x3d4973c,0x281544e,0x2564bbe,0x17c5954,0x171e34a,
wolfSSL 16:8e0d178b1d1e 3194 0x231741a,0x3cf2784,0x0889a0d,0x02b036d },
wolfSSL 16:8e0d178b1d1e 3195 { 0x301747f,0x3f1c477,0x1f1386b,0x163bc5f,0x1592b93,0x332daed,
wolfSSL 16:8e0d178b1d1e 3196 0x080e4f5,0x1d28b96,0x26194c9,0x0256992 } },
wolfSSL 16:8e0d178b1d1e 3197 /* 91 */
wolfSSL 16:8e0d178b1d1e 3198 { { 0x15a4c93,0x07bf6b0,0x114172c,0x1ce0961,0x140269b,0x1b2c2eb,
wolfSSL 16:8e0d178b1d1e 3199 0x0dfb1c1,0x019ddaa,0x0ba2921,0x008c795 },
wolfSSL 16:8e0d178b1d1e 3200 { 0x2e6d2dc,0x37e45e2,0x2918a70,0x0fce444,0x34d6aa6,0x396dc88,
wolfSSL 16:8e0d178b1d1e 3201 0x27726b5,0x0c787d8,0x032d8a7,0x02ac2f8 } },
wolfSSL 16:8e0d178b1d1e 3202 /* 92 */
wolfSSL 16:8e0d178b1d1e 3203 { { 0x1131f2d,0x2b43a63,0x3101097,0x38cec13,0x0637f09,0x17a69d2,
wolfSSL 16:8e0d178b1d1e 3204 0x086196d,0x299e46b,0x0802cf6,0x03c6f32 },
wolfSSL 16:8e0d178b1d1e 3205 { 0x0daacb4,0x1a4503a,0x100925c,0x15583d9,0x23c4e40,0x1de4de9,
wolfSSL 16:8e0d178b1d1e 3206 0x1cc8fc4,0x2c9c564,0x0695aeb,0x02145a5 } },
wolfSSL 16:8e0d178b1d1e 3207 /* 93 */
wolfSSL 16:8e0d178b1d1e 3208 { { 0x1dcf593,0x17050fc,0x3e3bde3,0x0a6c062,0x178202b,0x2f7674f,
wolfSSL 16:8e0d178b1d1e 3209 0x0dadc29,0x15763a7,0x1d2daad,0x023d9f6 },
wolfSSL 16:8e0d178b1d1e 3210 { 0x081ea5f,0x045959d,0x190c841,0x3a78d31,0x0e7d2dd,0x1414fea,
wolfSSL 16:8e0d178b1d1e 3211 0x1d43f40,0x22d77ff,0x2b9c072,0x03e115c } },
wolfSSL 16:8e0d178b1d1e 3212 /* 94 */
wolfSSL 16:8e0d178b1d1e 3213 { { 0x3af71c9,0x29e9c65,0x25655e1,0x111e9cd,0x3a14494,0x3875418,
wolfSSL 16:8e0d178b1d1e 3214 0x34ae070,0x0b06686,0x310616b,0x03b7b89 },
wolfSSL 16:8e0d178b1d1e 3215 { 0x1734121,0x00d3d44,0x29f0b2f,0x1552897,0x31cac6e,0x1030bb3,
wolfSSL 16:8e0d178b1d1e 3216 0x0148f3a,0x35fd237,0x29b44eb,0x027f49f } },
wolfSSL 16:8e0d178b1d1e 3217 /* 95 */
wolfSSL 16:8e0d178b1d1e 3218 { { 0x2e2cb16,0x1d962bd,0x19b63cc,0x0b3f964,0x3e3eb7d,0x1a35560,
wolfSSL 16:8e0d178b1d1e 3219 0x0c58161,0x3ce1d6a,0x3b6958f,0x029030b },
wolfSSL 16:8e0d178b1d1e 3220 { 0x2dcc158,0x3b1583f,0x30568c9,0x31957c8,0x27ad804,0x28c1f84,
wolfSSL 16:8e0d178b1d1e 3221 0x3967049,0x37b3f64,0x3b87dc6,0x0266f26 } },
wolfSSL 16:8e0d178b1d1e 3222 /* 96 */
wolfSSL 16:8e0d178b1d1e 3223 { { 0x27dafc6,0x2548764,0x0d1984a,0x1a57027,0x252c1fb,0x24d9b77,
wolfSSL 16:8e0d178b1d1e 3224 0x1581a0f,0x1f99276,0x10ba16d,0x026af88 },
wolfSSL 16:8e0d178b1d1e 3225 { 0x0915220,0x2be1292,0x16c6480,0x1a93760,0x2fa7317,0x1a07296,
wolfSSL 16:8e0d178b1d1e 3226 0x1539871,0x112c31f,0x25787f3,0x01e2070 } },
wolfSSL 16:8e0d178b1d1e 3227 /* 97 */
wolfSSL 16:8e0d178b1d1e 3228 { { 0x0bcf3ff,0x266d478,0x34f6933,0x31449fd,0x00d02cb,0x340765a,
wolfSSL 16:8e0d178b1d1e 3229 0x3465a2d,0x225023e,0x319a30e,0x00579b8 },
wolfSSL 16:8e0d178b1d1e 3230 { 0x20e05f4,0x35b834f,0x0404646,0x3710d62,0x3fad7bd,0x13e1434,
wolfSSL 16:8e0d178b1d1e 3231 0x21c7d1c,0x1cb3af9,0x2cf1911,0x003957e } },
wolfSSL 16:8e0d178b1d1e 3232 /* 98 */
wolfSSL 16:8e0d178b1d1e 3233 { { 0x0787564,0x36601be,0x1ce67e9,0x084c7a1,0x21a3317,0x2067a35,
wolfSSL 16:8e0d178b1d1e 3234 0x0158cab,0x195ddac,0x1766fe9,0x035cf42 },
wolfSSL 16:8e0d178b1d1e 3235 { 0x2b7206e,0x20d0947,0x3b42424,0x03f1862,0x0a51929,0x38c2948,
wolfSSL 16:8e0d178b1d1e 3236 0x0bb8595,0x2942d77,0x3748f15,0x0249428 } },
wolfSSL 16:8e0d178b1d1e 3237 /* 99 */
wolfSSL 16:8e0d178b1d1e 3238 { { 0x2577410,0x3c23e2f,0x28c6caf,0x00d41de,0x0fd408a,0x30298e9,
wolfSSL 16:8e0d178b1d1e 3239 0x363289e,0x2302fc7,0x082c1cc,0x01dd050 },
wolfSSL 16:8e0d178b1d1e 3240 { 0x30991cd,0x103e9ba,0x029605a,0x19927f7,0x0c1ca08,0x0c93f50,
wolfSSL 16:8e0d178b1d1e 3241 0x28a3c7b,0x082e4e9,0x34d12eb,0x0232c13 } },
wolfSSL 16:8e0d178b1d1e 3242 /* 100 */
wolfSSL 16:8e0d178b1d1e 3243 { { 0x106171c,0x0b4155a,0x0c3fb1c,0x336c090,0x19073e9,0x2241a10,
wolfSSL 16:8e0d178b1d1e 3244 0x0e6b4fd,0x0ed476e,0x1ef4712,0x039390a },
wolfSSL 16:8e0d178b1d1e 3245 { 0x0ec36f4,0x3754f0e,0x2a270b8,0x007fd2d,0x0f9d2dc,0x1e6a692,
wolfSSL 16:8e0d178b1d1e 3246 0x066e078,0x1954974,0x2ff3c6e,0x00def28 } },
wolfSSL 16:8e0d178b1d1e 3247 /* 101 */
wolfSSL 16:8e0d178b1d1e 3248 { { 0x3562470,0x0b8f1f7,0x0ac94cd,0x28b0259,0x244f272,0x031e4ef,
wolfSSL 16:8e0d178b1d1e 3249 0x2d5df98,0x2c8a9f1,0x2dc3002,0x016644f },
wolfSSL 16:8e0d178b1d1e 3250 { 0x350592a,0x0e6a0d5,0x1e027a1,0x2039e0f,0x399e01d,0x2817593,
wolfSSL 16:8e0d178b1d1e 3251 0x0c0375e,0x3889b3e,0x24ab013,0x010de1b } },
wolfSSL 16:8e0d178b1d1e 3252 /* 102 */
wolfSSL 16:8e0d178b1d1e 3253 { { 0x256b5a6,0x0ac3b67,0x28f9ff3,0x29b67f1,0x30750d9,0x25e11a9,
wolfSSL 16:8e0d178b1d1e 3254 0x15e8455,0x279ebb0,0x298b7e7,0x0218e32 },
wolfSSL 16:8e0d178b1d1e 3255 { 0x2fc24b2,0x2b82582,0x28f22f5,0x2bd36b3,0x305398e,0x3b2e9e3,
wolfSSL 16:8e0d178b1d1e 3256 0x365dd0a,0x29bc0ed,0x36a7b3a,0x007b374 } },
wolfSSL 16:8e0d178b1d1e 3257 /* 103 */
wolfSSL 16:8e0d178b1d1e 3258 { { 0x05ff2f3,0x2b3589b,0x29785d3,0x300a1ce,0x0a2d516,0x0844355,
wolfSSL 16:8e0d178b1d1e 3259 0x14c9fad,0x3ccb6b6,0x385d459,0x0361743 },
wolfSSL 16:8e0d178b1d1e 3260 { 0x0b11da3,0x002e344,0x18c49f7,0x0c29e0c,0x1d2c22c,0x08237b3,
wolfSSL 16:8e0d178b1d1e 3261 0x2988f49,0x0f18955,0x1c3b4ed,0x02813c6 } },
wolfSSL 16:8e0d178b1d1e 3262 /* 104 */
wolfSSL 16:8e0d178b1d1e 3263 { { 0x17f93bd,0x249323b,0x11f6087,0x174e4bd,0x3cb64ac,0x086dc6b,
wolfSSL 16:8e0d178b1d1e 3264 0x2e330a8,0x142c1f2,0x2ea5c09,0x024acbb },
wolfSSL 16:8e0d178b1d1e 3265 { 0x1b6e235,0x3132521,0x00f085a,0x2a4a4db,0x1ab2ca4,0x0142224,
wolfSSL 16:8e0d178b1d1e 3266 0x3aa6b3e,0x09db203,0x2215834,0x007b9e0 } },
wolfSSL 16:8e0d178b1d1e 3267 /* 105 */
wolfSSL 16:8e0d178b1d1e 3268 { { 0x23e79f7,0x28b8039,0x1906a60,0x2cbce67,0x1f590e7,0x181f027,
wolfSSL 16:8e0d178b1d1e 3269 0x21054a6,0x3854240,0x2d857a6,0x03cfcb3 },
wolfSSL 16:8e0d178b1d1e 3270 { 0x10d9b55,0x1443cfc,0x2648200,0x2b36190,0x09d2fcf,0x22f439f,
wolfSSL 16:8e0d178b1d1e 3271 0x231aa7e,0x3884395,0x0543da3,0x003d5a9 } },
wolfSSL 16:8e0d178b1d1e 3272 /* 106 */
wolfSSL 16:8e0d178b1d1e 3273 { { 0x043e0df,0x06ffe84,0x3e6d5b2,0x3327001,0x26c74b6,0x12a145e,
wolfSSL 16:8e0d178b1d1e 3274 0x256ec0d,0x3898c69,0x3411969,0x02f63c5 },
wolfSSL 16:8e0d178b1d1e 3275 { 0x2b7494a,0x2eee1af,0x38388a9,0x1bd17ce,0x21567d4,0x13969e6,
wolfSSL 16:8e0d178b1d1e 3276 0x3a12a7a,0x3e8277d,0x03530cc,0x00b4687 } },
wolfSSL 16:8e0d178b1d1e 3277 /* 107 */
wolfSSL 16:8e0d178b1d1e 3278 { { 0x06508da,0x38e04d4,0x15a7192,0x312875e,0x3336180,0x2a6512c,
wolfSSL 16:8e0d178b1d1e 3279 0x1b59497,0x2e91b37,0x25eb91f,0x02841e9 },
wolfSSL 16:8e0d178b1d1e 3280 { 0x394d639,0x0747143,0x37d7e6d,0x1d62962,0x08b4af3,0x34df287,
wolfSSL 16:8e0d178b1d1e 3281 0x3c5584b,0x26bc869,0x20af87a,0x0060f5d } },
wolfSSL 16:8e0d178b1d1e 3282 /* 108 */
wolfSSL 16:8e0d178b1d1e 3283 { { 0x1de59a4,0x1a5c443,0x2f8729d,0x01c3a2f,0x0f1ad8d,0x3cbaf9e,
wolfSSL 16:8e0d178b1d1e 3284 0x1b49634,0x35d508a,0x39dc269,0x0075105 },
wolfSSL 16:8e0d178b1d1e 3285 { 0x390d30e,0x37033e0,0x110cb32,0x14c37a0,0x20a3b27,0x2f00ce6,
wolfSSL 16:8e0d178b1d1e 3286 0x2f1dc52,0x34988c6,0x0c29606,0x01dc7e7 } },
wolfSSL 16:8e0d178b1d1e 3287 /* 109 */
wolfSSL 16:8e0d178b1d1e 3288 { { 0x1040739,0x24f9de1,0x2939999,0x2e6009a,0x244539d,0x17e3f09,
wolfSSL 16:8e0d178b1d1e 3289 0x00f6f2f,0x1c63b3d,0x2310362,0x019109e },
wolfSSL 16:8e0d178b1d1e 3290 { 0x1428aa8,0x3cb61e1,0x09a84f4,0x0ffafed,0x07b7adc,0x08f406b,
wolfSSL 16:8e0d178b1d1e 3291 0x1b2c6df,0x035b480,0x3496ae9,0x012766d } },
wolfSSL 16:8e0d178b1d1e 3292 /* 110 */
wolfSSL 16:8e0d178b1d1e 3293 { { 0x35d1099,0x2362f10,0x1a08cc7,0x13a3a34,0x12adbcd,0x32da290,
wolfSSL 16:8e0d178b1d1e 3294 0x02e2a02,0x151140b,0x01b3f60,0x0240df6 },
wolfSSL 16:8e0d178b1d1e 3295 { 0x34c7b61,0x2eb09c1,0x172e7cd,0x2ad5eff,0x2fe2031,0x25b54d4,
wolfSSL 16:8e0d178b1d1e 3296 0x0cec965,0x18e7187,0x26a7cc0,0x00230f7 } },
wolfSSL 16:8e0d178b1d1e 3297 /* 111 */
wolfSSL 16:8e0d178b1d1e 3298 { { 0x2d552ab,0x374083d,0x01f120f,0x2601736,0x156baff,0x04d44a4,
wolfSSL 16:8e0d178b1d1e 3299 0x3b7c3e9,0x1acbc1b,0x0424579,0x031a425 },
wolfSSL 16:8e0d178b1d1e 3300 { 0x1231bd1,0x0eba710,0x020517b,0x21d7316,0x21eac6e,0x275a848,
wolfSSL 16:8e0d178b1d1e 3301 0x0837abf,0x0eb0082,0x302cafe,0x00fe8f6 } },
wolfSSL 16:8e0d178b1d1e 3302 /* 112 */
wolfSSL 16:8e0d178b1d1e 3303 { { 0x1058880,0x28f9941,0x03f2d75,0x3bd90e5,0x17da365,0x2ac9249,
wolfSSL 16:8e0d178b1d1e 3304 0x07861cf,0x023fd05,0x1b0fdb8,0x031712f },
wolfSSL 16:8e0d178b1d1e 3305 { 0x272b56b,0x04f8d2c,0x043a735,0x25446e4,0x1c8327e,0x221125a,
wolfSSL 16:8e0d178b1d1e 3306 0x0ce37df,0x2dad7f6,0x39446c2,0x00b55b6 } },
wolfSSL 16:8e0d178b1d1e 3307 /* 113 */
wolfSSL 16:8e0d178b1d1e 3308 { { 0x346ac6b,0x05e0bff,0x2425246,0x0981e8b,0x1d19f79,0x2692378,
wolfSSL 16:8e0d178b1d1e 3309 0x3ea3c40,0x2e90beb,0x19de503,0x003d5af },
wolfSSL 16:8e0d178b1d1e 3310 { 0x05cda49,0x353b44d,0x299d137,0x3f205bc,0x2821158,0x3ad0d00,
wolfSSL 16:8e0d178b1d1e 3311 0x06a54aa,0x2d7c79f,0x39d1173,0x01000ee } },
wolfSSL 16:8e0d178b1d1e 3312 /* 114 */
wolfSSL 16:8e0d178b1d1e 3313 { { 0x0803387,0x3a06268,0x14043b8,0x3d4e72f,0x1ece115,0x0a1dfc8,
wolfSSL 16:8e0d178b1d1e 3314 0x17208dd,0x0be790a,0x122a07f,0x014dd95 },
wolfSSL 16:8e0d178b1d1e 3315 { 0x0a4182d,0x202886a,0x1f79a49,0x1e8c867,0x0a2bbd0,0x28668b5,
wolfSSL 16:8e0d178b1d1e 3316 0x0d0a2e1,0x115259d,0x3586c5d,0x01e815b } },
wolfSSL 16:8e0d178b1d1e 3317 /* 115 */
wolfSSL 16:8e0d178b1d1e 3318 { { 0x18a2a47,0x2c95627,0x2773646,0x1230f7c,0x15b5829,0x2fc354e,
wolfSSL 16:8e0d178b1d1e 3319 0x2c000ea,0x099d547,0x2f17a1a,0x01df520 },
wolfSSL 16:8e0d178b1d1e 3320 { 0x3853948,0x06f6561,0x3feeb8a,0x2f5b3ef,0x3a6f817,0x01a0791,
wolfSSL 16:8e0d178b1d1e 3321 0x2ec0578,0x2c392ad,0x12b2b38,0x0104540 } },
wolfSSL 16:8e0d178b1d1e 3322 /* 116 */
wolfSSL 16:8e0d178b1d1e 3323 { { 0x1e28ced,0x0fc3d1b,0x2c473c7,0x1826c4f,0x21d5da7,0x39718e4,
wolfSSL 16:8e0d178b1d1e 3324 0x38ce9e6,0x0251986,0x172fbea,0x0337c11 },
wolfSSL 16:8e0d178b1d1e 3325 { 0x053c3b0,0x0f162db,0x043c1cb,0x04111ee,0x297fe3c,0x32e5e03,
wolfSSL 16:8e0d178b1d1e 3326 0x2b8ae12,0x0c427ec,0x1da9738,0x03b9c0f } },
wolfSSL 16:8e0d178b1d1e 3327 /* 117 */
wolfSSL 16:8e0d178b1d1e 3328 { { 0x357e43a,0x054503f,0x11b8345,0x34ec6e0,0x2d44660,0x3d0ae61,
wolfSSL 16:8e0d178b1d1e 3329 0x3b5dff8,0x33884ac,0x09da162,0x00a82b6 },
wolfSSL 16:8e0d178b1d1e 3330 { 0x3c277ba,0x129a51a,0x027664e,0x1530507,0x0c788c9,0x2afd89d,
wolfSSL 16:8e0d178b1d1e 3331 0x1aa64cc,0x1196450,0x367ac2b,0x0358b42 } },
wolfSSL 16:8e0d178b1d1e 3332 /* 118 */
wolfSSL 16:8e0d178b1d1e 3333 { { 0x0054ac4,0x1761ecb,0x378839c,0x167c9f7,0x2570058,0x0604a35,
wolfSSL 16:8e0d178b1d1e 3334 0x37cbf3b,0x0909bb7,0x3f2991c,0x02ce688 },
wolfSSL 16:8e0d178b1d1e 3335 { 0x0b16ae5,0x212857c,0x351b952,0x2c684db,0x30c6a05,0x09c01e0,
wolfSSL 16:8e0d178b1d1e 3336 0x23c137f,0x1331475,0x092c067,0x0013b40 } },
wolfSSL 16:8e0d178b1d1e 3337 /* 119 */
wolfSSL 16:8e0d178b1d1e 3338 { { 0x2e90393,0x0617466,0x24e61f4,0x0a528f5,0x03047b4,0x2153f05,
wolfSSL 16:8e0d178b1d1e 3339 0x0001a69,0x30e1eb8,0x3c10177,0x0282a47 },
wolfSSL 16:8e0d178b1d1e 3340 { 0x22c831e,0x28fc06b,0x3e16ff0,0x208adc9,0x0bb76ae,0x28c1d6d,
wolfSSL 16:8e0d178b1d1e 3341 0x12c8a15,0x031063c,0x1889ed2,0x002133e } },
wolfSSL 16:8e0d178b1d1e 3342 /* 120 */
wolfSSL 16:8e0d178b1d1e 3343 { { 0x0a6becf,0x14277bf,0x3328d98,0x201f7fe,0x12fceae,0x1de3a2e,
wolfSSL 16:8e0d178b1d1e 3344 0x0a15c44,0x3ddf976,0x1b273ab,0x0355e55 },
wolfSSL 16:8e0d178b1d1e 3345 { 0x1b5d4f1,0x369e78c,0x3a1c210,0x12cf3e9,0x3aa52f0,0x309f082,
wolfSSL 16:8e0d178b1d1e 3346 0x112089d,0x107c753,0x24202d1,0x023853a } },
wolfSSL 16:8e0d178b1d1e 3347 /* 121 */
wolfSSL 16:8e0d178b1d1e 3348 { { 0x2897042,0x140d17c,0x2c4aeed,0x07d0d00,0x18d0533,0x22f7ec8,
wolfSSL 16:8e0d178b1d1e 3349 0x19c194c,0x3456323,0x2372aa4,0x0165f86 },
wolfSSL 16:8e0d178b1d1e 3350 { 0x30bd68c,0x1fb06b3,0x0945032,0x372ac09,0x06d4be0,0x27f8fa1,
wolfSSL 16:8e0d178b1d1e 3351 0x1c8d7ac,0x137a96e,0x236199b,0x0328fc0 } },
wolfSSL 16:8e0d178b1d1e 3352 /* 122 */
wolfSSL 16:8e0d178b1d1e 3353 { { 0x170bd20,0x2842d58,0x1de7592,0x3c5b4fd,0x20ea897,0x12cab78,
wolfSSL 16:8e0d178b1d1e 3354 0x363ff14,0x01f928c,0x17e309c,0x02f79ff },
wolfSSL 16:8e0d178b1d1e 3355 { 0x0f5432c,0x2edb4ae,0x044b516,0x32f810d,0x2210dc1,0x23e56d6,
wolfSSL 16:8e0d178b1d1e 3356 0x301e6ff,0x34660f6,0x10e0a7d,0x02d88eb } },
wolfSSL 16:8e0d178b1d1e 3357 /* 123 */
wolfSSL 16:8e0d178b1d1e 3358 { { 0x0c7b65b,0x2f59d58,0x2289a75,0x2408e92,0x1ab8c55,0x1ec99e5,
wolfSSL 16:8e0d178b1d1e 3359 0x220fd0d,0x04defe0,0x24658ec,0x035aa8b },
wolfSSL 16:8e0d178b1d1e 3360 { 0x138bb85,0x2f002d4,0x295c10a,0x08760ce,0x28c31d1,0x1c0a8cb,
wolfSSL 16:8e0d178b1d1e 3361 0x0ff00b1,0x144eac9,0x2e02dcc,0x0044598 } },
wolfSSL 16:8e0d178b1d1e 3362 /* 124 */
wolfSSL 16:8e0d178b1d1e 3363 { { 0x3b42b87,0x050057b,0x0dff781,0x1c06db1,0x1bd9f5d,0x1f5f04a,
wolfSSL 16:8e0d178b1d1e 3364 0x2cccd7a,0x143e19b,0x1cb94b7,0x036cfb8 },
wolfSSL 16:8e0d178b1d1e 3365 { 0x34837cf,0x3cf6c3c,0x0d4fb26,0x22ee55e,0x1e7eed1,0x315995f,
wolfSSL 16:8e0d178b1d1e 3366 0x2cdf937,0x1a96574,0x0425220,0x0221a99 } },
wolfSSL 16:8e0d178b1d1e 3367 /* 125 */
wolfSSL 16:8e0d178b1d1e 3368 { { 0x1b569ea,0x0d33ed9,0x19c13c2,0x107dc84,0x2200111,0x0569867,
wolfSSL 16:8e0d178b1d1e 3369 0x2dc85da,0x05ef22e,0x0eb018a,0x029c33d },
wolfSSL 16:8e0d178b1d1e 3370 { 0x04a6a65,0x3e5eba3,0x378f224,0x09c04d0,0x036e5cf,0x3df8258,
wolfSSL 16:8e0d178b1d1e 3371 0x3a609e4,0x1eddef8,0x2abd174,0x02a91dc } },
wolfSSL 16:8e0d178b1d1e 3372 /* 126 */
wolfSSL 16:8e0d178b1d1e 3373 { { 0x2a60cc0,0x1d84c5e,0x115f676,0x1840da0,0x2c79163,0x2f06ed6,
wolfSSL 16:8e0d178b1d1e 3374 0x198bb4b,0x3e5d37b,0x1dc30fa,0x018469b },
wolfSSL 16:8e0d178b1d1e 3375 { 0x15ee47a,0x1e32f30,0x16a530e,0x2093836,0x02e8962,0x3767b62,
wolfSSL 16:8e0d178b1d1e 3376 0x335adf3,0x27220db,0x2f81642,0x0173ffe } },
wolfSSL 16:8e0d178b1d1e 3377 /* 127 */
wolfSSL 16:8e0d178b1d1e 3378 { { 0x37a99cd,0x1533fe6,0x05a1c0d,0x27610f1,0x17bf3b9,0x0b1ce78,
wolfSSL 16:8e0d178b1d1e 3379 0x0a908f6,0x265300e,0x3237dc1,0x01b969a },
wolfSSL 16:8e0d178b1d1e 3380 { 0x3a5db77,0x2d15382,0x0d63ef8,0x1feb3d8,0x0b7b880,0x19820de,
wolfSSL 16:8e0d178b1d1e 3381 0x11c0c67,0x2af3396,0x38d242d,0x0120688 } },
wolfSSL 16:8e0d178b1d1e 3382 /* 128 */
wolfSSL 16:8e0d178b1d1e 3383 { { 0x1d0b34a,0x05ef00d,0x00a7e34,0x1ae0c9f,0x1440b38,0x300d8b4,
wolfSSL 16:8e0d178b1d1e 3384 0x37262da,0x3e50e3e,0x14ce0cd,0x00b1044 },
wolfSSL 16:8e0d178b1d1e 3385 { 0x195a0b1,0x173bc6b,0x03622ba,0x2a19f55,0x1c09b37,0x07921b2,
wolfSSL 16:8e0d178b1d1e 3386 0x16cdd20,0x24a5c9b,0x2bf42ff,0x00811de } },
wolfSSL 16:8e0d178b1d1e 3387 /* 129 */
wolfSSL 16:8e0d178b1d1e 3388 { { 0x0d65dbf,0x145cf06,0x1ad82f7,0x038ce7b,0x077bf94,0x33c4007,
wolfSSL 16:8e0d178b1d1e 3389 0x22d26bd,0x25ad9c0,0x09ac773,0x02b1990 },
wolfSSL 16:8e0d178b1d1e 3390 { 0x2261cc3,0x2ecdbf1,0x3e908b0,0x3246439,0x0213f7b,0x1179b04,
wolfSSL 16:8e0d178b1d1e 3391 0x01cebaa,0x0be1595,0x175cc12,0x033a39a } },
wolfSSL 16:8e0d178b1d1e 3392 /* 130 */
wolfSSL 16:8e0d178b1d1e 3393 { { 0x00a67d2,0x086d06f,0x248a0f1,0x0291134,0x362d476,0x166d1cd,
wolfSSL 16:8e0d178b1d1e 3394 0x044f1d6,0x2d2a038,0x365250b,0x0023f78 },
wolfSSL 16:8e0d178b1d1e 3395 { 0x08bf287,0x3b0f6a1,0x1d6eace,0x20b4cda,0x2c2a621,0x0912520,
wolfSSL 16:8e0d178b1d1e 3396 0x02dfdc9,0x1b35cd6,0x3d2565d,0x00bdf8b } },
wolfSSL 16:8e0d178b1d1e 3397 /* 131 */
wolfSSL 16:8e0d178b1d1e 3398 { { 0x3770fa7,0x2e4b6f0,0x03f9ae4,0x170de41,0x1095e8d,0x1dd845c,
wolfSSL 16:8e0d178b1d1e 3399 0x334e9d1,0x00ab953,0x12e9077,0x03196fa },
wolfSSL 16:8e0d178b1d1e 3400 { 0x2fd0a40,0x228c0fd,0x384b275,0x38ef339,0x3e7d822,0x3e5d9ef,
wolfSSL 16:8e0d178b1d1e 3401 0x24f5854,0x0ece9eb,0x247d119,0x012ffe3 } },
wolfSSL 16:8e0d178b1d1e 3402 /* 132 */
wolfSSL 16:8e0d178b1d1e 3403 { { 0x0ff1480,0x07487c0,0x1b16cd4,0x1f41d53,0x22ab8fb,0x2f83cfa,
wolfSSL 16:8e0d178b1d1e 3404 0x01d2efb,0x259f6b2,0x2e65772,0x00f9392 },
wolfSSL 16:8e0d178b1d1e 3405 { 0x05303e6,0x23cdb4f,0x23977e1,0x12e4898,0x03bd999,0x0c930f0,
wolfSSL 16:8e0d178b1d1e 3406 0x170e261,0x180a27b,0x2fd58ec,0x014e22b } },
wolfSSL 16:8e0d178b1d1e 3407 /* 133 */
wolfSSL 16:8e0d178b1d1e 3408 { { 0x25d7713,0x0c5fad7,0x09daad1,0x3b9d779,0x109b985,0x1d3ec98,
wolfSSL 16:8e0d178b1d1e 3409 0x35bc4fc,0x2f838cb,0x0d14f75,0x0173e42 },
wolfSSL 16:8e0d178b1d1e 3410 { 0x2657b12,0x10d4423,0x19e6760,0x296e5bb,0x2bfd421,0x25c3330,
wolfSSL 16:8e0d178b1d1e 3411 0x29f51f8,0x0338838,0x24060f0,0x029a62e } },
wolfSSL 16:8e0d178b1d1e 3412 /* 134 */
wolfSSL 16:8e0d178b1d1e 3413 { { 0x3748fec,0x2c5a1bb,0x2cf973d,0x289fa74,0x3e6e755,0x38997bf,
wolfSSL 16:8e0d178b1d1e 3414 0x0b6544c,0x2b6358c,0x38a7aeb,0x02c50bb },
wolfSSL 16:8e0d178b1d1e 3415 { 0x3d5770a,0x06be7c5,0x012fad3,0x19cb2cd,0x266af3b,0x3ccd677,
wolfSSL 16:8e0d178b1d1e 3416 0x160d1bd,0x141d5af,0x2965851,0x034625a } },
wolfSSL 16:8e0d178b1d1e 3417 /* 135 */
wolfSSL 16:8e0d178b1d1e 3418 { { 0x3c41c08,0x255eacc,0x22e1ec5,0x2b151a3,0x087de94,0x311cbdb,
wolfSSL 16:8e0d178b1d1e 3419 0x016b73a,0x368e462,0x20b7981,0x0099ec3 },
wolfSSL 16:8e0d178b1d1e 3420 { 0x262b988,0x1539763,0x21e76e5,0x15445b4,0x1d8ddc7,0x34a9be6,
wolfSSL 16:8e0d178b1d1e 3421 0x10faf03,0x24e4d18,0x07aa111,0x02d538a } },
wolfSSL 16:8e0d178b1d1e 3422 /* 136 */
wolfSSL 16:8e0d178b1d1e 3423 { { 0x38a876b,0x048ad45,0x04b40a0,0x3fc2144,0x251ff96,0x13ca7dd,
wolfSSL 16:8e0d178b1d1e 3424 0x0b31ab1,0x3539814,0x28b5f87,0x0212aec },
wolfSSL 16:8e0d178b1d1e 3425 { 0x270790a,0x350e7e0,0x346bd5e,0x276178f,0x22d6cb5,0x3078884,
wolfSSL 16:8e0d178b1d1e 3426 0x355c1b6,0x15901d7,0x3671765,0x03950db } },
wolfSSL 16:8e0d178b1d1e 3427 /* 137 */
wolfSSL 16:8e0d178b1d1e 3428 { { 0x286e8d5,0x2409788,0x13be53f,0x2d21911,0x0353c95,0x10238e8,
wolfSSL 16:8e0d178b1d1e 3429 0x32f5bde,0x3a67b60,0x28b5b9c,0x001013d },
wolfSSL 16:8e0d178b1d1e 3430 { 0x381e8e5,0x0cef7a9,0x2f5bcad,0x06058f0,0x33cdf50,0x04672a8,
wolfSSL 16:8e0d178b1d1e 3431 0x1769600,0x31c055d,0x3df0ac1,0x00e9098 } },
wolfSSL 16:8e0d178b1d1e 3432 /* 138 */
wolfSSL 16:8e0d178b1d1e 3433 { { 0x2eb596d,0x197b326,0x12b4c29,0x39c08f2,0x101ea03,0x3804e58,
wolfSSL 16:8e0d178b1d1e 3434 0x04b4b62,0x28d9d1c,0x13f905e,0x0032a3f },
wolfSSL 16:8e0d178b1d1e 3435 { 0x11b2b61,0x08e9095,0x0d06925,0x270e43f,0x21eb7a8,0x0e4a98f,
wolfSSL 16:8e0d178b1d1e 3436 0x31d2be0,0x030cf9f,0x2644ddb,0x025b728 } },
wolfSSL 16:8e0d178b1d1e 3437 /* 139 */
wolfSSL 16:8e0d178b1d1e 3438 { { 0x07510af,0x2ed0e8e,0x2a01203,0x2a2a68d,0x0846fea,0x3e540de,
wolfSSL 16:8e0d178b1d1e 3439 0x3a57702,0x1677348,0x2123aad,0x010d8f8 },
wolfSSL 16:8e0d178b1d1e 3440 { 0x0246a47,0x0e871d0,0x124dca4,0x34b9577,0x2b362b8,0x363ebe5,
wolfSSL 16:8e0d178b1d1e 3441 0x3086045,0x26313e6,0x15cd8bb,0x0210384 } },
wolfSSL 16:8e0d178b1d1e 3442 /* 140 */
wolfSSL 16:8e0d178b1d1e 3443 { { 0x023e8a7,0x0817884,0x3a0bf12,0x3376371,0x3c808a8,0x18e9777,
wolfSSL 16:8e0d178b1d1e 3444 0x12a2721,0x35b538a,0x2bd30de,0x017835a },
wolfSSL 16:8e0d178b1d1e 3445 { 0x0fc0f64,0x1c8709f,0x2d8807a,0x0743957,0x242eec0,0x347e76c,
wolfSSL 16:8e0d178b1d1e 3446 0x27bef91,0x289689a,0x0f42945,0x01f7a92 } },
wolfSSL 16:8e0d178b1d1e 3447 /* 141 */
wolfSSL 16:8e0d178b1d1e 3448 { { 0x1060a81,0x3dbc739,0x1615abd,0x1cbe3e5,0x3e79f9c,0x1ab09a2,
wolfSSL 16:8e0d178b1d1e 3449 0x136c540,0x05b473f,0x2beebfd,0x02af0a8 },
wolfSSL 16:8e0d178b1d1e 3450 { 0x3e2eac7,0x19be474,0x04668ac,0x18f4b74,0x36f10ba,0x0a0b4c6,
wolfSSL 16:8e0d178b1d1e 3451 0x10e3770,0x3bf059e,0x3946c7e,0x013a8d4 } },
wolfSSL 16:8e0d178b1d1e 3452 /* 142 */
wolfSSL 16:8e0d178b1d1e 3453 { { 0x266309d,0x28be354,0x1a3eed8,0x3020651,0x10a51c6,0x1e31770,
wolfSSL 16:8e0d178b1d1e 3454 0x0af45a5,0x3ff0f3b,0x2891c94,0x00e9db9 },
wolfSSL 16:8e0d178b1d1e 3455 { 0x17b0d0f,0x33a291f,0x0a5f9aa,0x25a3d61,0x2963ace,0x39a5fef,
wolfSSL 16:8e0d178b1d1e 3456 0x230c724,0x1919146,0x10a465e,0x02084a8 } },
wolfSSL 16:8e0d178b1d1e 3457 /* 143 */
wolfSSL 16:8e0d178b1d1e 3458 { { 0x3ab8caa,0x31870f3,0x2390ef7,0x2103850,0x218eb8e,0x3a5ccf2,
wolfSSL 16:8e0d178b1d1e 3459 0x1dff677,0x2c59334,0x371599c,0x02a9f2a },
wolfSSL 16:8e0d178b1d1e 3460 { 0x0837bd1,0x3249cef,0x35d702f,0x3430dab,0x1c06407,0x108f692,
wolfSSL 16:8e0d178b1d1e 3461 0x221292f,0x05f0c5d,0x073fe06,0x01038e0 } },
wolfSSL 16:8e0d178b1d1e 3462 /* 144 */
wolfSSL 16:8e0d178b1d1e 3463 { { 0x3bf9b7c,0x2020929,0x30d0f4f,0x080fef8,0x3365d23,0x1f3e738,
wolfSSL 16:8e0d178b1d1e 3464 0x3e53209,0x1549afe,0x300b305,0x038d811 },
wolfSSL 16:8e0d178b1d1e 3465 { 0x0c6c2c7,0x2e6445b,0x3ee64dc,0x022e932,0x0726837,0x0deb67b,
wolfSSL 16:8e0d178b1d1e 3466 0x1ed4346,0x3857f73,0x277a3de,0x01950b5 } },
wolfSSL 16:8e0d178b1d1e 3467 /* 145 */
wolfSSL 16:8e0d178b1d1e 3468 { { 0x36c377a,0x0adb41e,0x08be3f3,0x11e40d1,0x36cb038,0x036a2bd,
wolfSSL 16:8e0d178b1d1e 3469 0x3dd3a82,0x1bc875b,0x2ee09bb,0x02994d2 },
wolfSSL 16:8e0d178b1d1e 3470 { 0x035facf,0x05e0344,0x07e630a,0x0ce772d,0x335e55a,0x111fce4,
wolfSSL 16:8e0d178b1d1e 3471 0x250fe1c,0x3bc89ba,0x32fdc9a,0x03cf2d9 } },
wolfSSL 16:8e0d178b1d1e 3472 /* 146 */
wolfSSL 16:8e0d178b1d1e 3473 { { 0x355fd83,0x1c67f8e,0x1d10eb3,0x1b21d77,0x0e0d7a4,0x173a9e1,
wolfSSL 16:8e0d178b1d1e 3474 0x2c9fa90,0x1c39cce,0x22eaae8,0x01f2bea },
wolfSSL 16:8e0d178b1d1e 3475 { 0x153b338,0x0534107,0x26c69b8,0x283be1f,0x3e0acc0,0x059cac3,
wolfSSL 16:8e0d178b1d1e 3476 0x13d1081,0x148bbee,0x3c1b9bd,0x002aac4 } },
wolfSSL 16:8e0d178b1d1e 3477 /* 147 */
wolfSSL 16:8e0d178b1d1e 3478 { { 0x2681297,0x3389e34,0x146addc,0x2c6d425,0x2cb350e,0x1986abc,
wolfSSL 16:8e0d178b1d1e 3479 0x0431737,0x04ba4b7,0x2028470,0x012e469 },
wolfSSL 16:8e0d178b1d1e 3480 { 0x2f8ddcf,0x3c4255c,0x1af4dcf,0x07a6a44,0x208ebf6,0x0dc90c3,
wolfSSL 16:8e0d178b1d1e 3481 0x34360ac,0x072ad23,0x0537232,0x01254d3 } },
wolfSSL 16:8e0d178b1d1e 3482 /* 148 */
wolfSSL 16:8e0d178b1d1e 3483 { { 0x07b7e9d,0x3df5c7c,0x116f83d,0x28c4f35,0x3a478ef,0x3011fb8,
wolfSSL 16:8e0d178b1d1e 3484 0x2f264b6,0x317b9e3,0x04fd65a,0x032bd1b },
wolfSSL 16:8e0d178b1d1e 3485 { 0x2aa8266,0x3431de4,0x04bba04,0x19a44da,0x0edf454,0x392c5ac,
wolfSSL 16:8e0d178b1d1e 3486 0x265168a,0x1dc3d5b,0x25704c6,0x00533a7 } },
wolfSSL 16:8e0d178b1d1e 3487 /* 149 */
wolfSSL 16:8e0d178b1d1e 3488 { { 0x25e8f91,0x1178fa5,0x2492994,0x2eb2c3c,0x0d3aca1,0x0322828,
wolfSSL 16:8e0d178b1d1e 3489 0x1cc70f9,0x269c74c,0x0a53e4c,0x006edc2 },
wolfSSL 16:8e0d178b1d1e 3490 { 0x18bdd7a,0x2a79a55,0x26b1d5c,0x0200628,0x0734a05,0x3273c7b,
wolfSSL 16:8e0d178b1d1e 3491 0x13aa714,0x0040ac2,0x2f2da30,0x03e7449 } },
wolfSSL 16:8e0d178b1d1e 3492 /* 150 */
wolfSSL 16:8e0d178b1d1e 3493 { { 0x3f9563e,0x2f29eab,0x14a0749,0x3fad264,0x1dd077a,0x3d7c59c,
wolfSSL 16:8e0d178b1d1e 3494 0x3a0311b,0x331a789,0x0b9729e,0x0201ebf },
wolfSSL 16:8e0d178b1d1e 3495 { 0x1b08b77,0x2a4cdf2,0x3e387f8,0x21510f1,0x286c3a7,0x1dbf62e,
wolfSSL 16:8e0d178b1d1e 3496 0x3afa594,0x3363217,0x0d16568,0x01d46b7 } },
wolfSSL 16:8e0d178b1d1e 3497 /* 151 */
wolfSSL 16:8e0d178b1d1e 3498 { { 0x0715c0d,0x28e2d04,0x17f78ae,0x1c63dda,0x1d113ea,0x0fefc1b,
wolfSSL 16:8e0d178b1d1e 3499 0x1eab149,0x1d0fd99,0x0682537,0x00a7b11 },
wolfSSL 16:8e0d178b1d1e 3500 { 0x10bebbc,0x11c672d,0x14223d9,0x2ff9141,0x1399ee5,0x34b7b6c,
wolfSSL 16:8e0d178b1d1e 3501 0x0d5b3a8,0x01df643,0x0e392a4,0x03fe4dc } },
wolfSSL 16:8e0d178b1d1e 3502 /* 152 */
wolfSSL 16:8e0d178b1d1e 3503 { { 0x2b75b65,0x0b5a6f1,0x11c559a,0x3549999,0x24188f8,0x37a75f4,
wolfSSL 16:8e0d178b1d1e 3504 0x29f33e3,0x34068a2,0x38ba2a9,0x025dd91 },
wolfSSL 16:8e0d178b1d1e 3505 { 0x29af2c7,0x0988b64,0x0923885,0x1b539a4,0x1334f5d,0x226947a,
wolfSSL 16:8e0d178b1d1e 3506 0x2cc7e5a,0x20beb39,0x13fac2f,0x01d298c } },
wolfSSL 16:8e0d178b1d1e 3507 /* 153 */
wolfSSL 16:8e0d178b1d1e 3508 { { 0x35f079c,0x137f76d,0x2fbbb2f,0x254638d,0x185b07c,0x1f34db7,
wolfSSL 16:8e0d178b1d1e 3509 0x2cfcf0e,0x218f46d,0x2150ff4,0x02add6f },
wolfSSL 16:8e0d178b1d1e 3510 { 0x33fc9b7,0x0d9f005,0x0fd081b,0x0834965,0x2b90a74,0x102448d,
wolfSSL 16:8e0d178b1d1e 3511 0x3dbf03c,0x167d857,0x02e0b44,0x013afab } },
wolfSSL 16:8e0d178b1d1e 3512 /* 154 */
wolfSSL 16:8e0d178b1d1e 3513 { { 0x09f2c53,0x317f9d7,0x1411eb6,0x0463aba,0x0d25220,0x256b176,
wolfSSL 16:8e0d178b1d1e 3514 0x087633f,0x2bff322,0x07b2c1b,0x037e662 },
wolfSSL 16:8e0d178b1d1e 3515 { 0x10aaecb,0x23bb4a1,0x2272bb7,0x06c075a,0x09d4918,0x0736f2b,
wolfSSL 16:8e0d178b1d1e 3516 0x0dd511b,0x101625e,0x0a7779f,0x009ec10 } },
wolfSSL 16:8e0d178b1d1e 3517 /* 155 */
wolfSSL 16:8e0d178b1d1e 3518 { { 0x33b2eb2,0x0176dfd,0x2118904,0x022386c,0x2e0df85,0x2588c9f,
wolfSSL 16:8e0d178b1d1e 3519 0x1b71525,0x28fd540,0x137e4cf,0x02ce4f7 },
wolfSSL 16:8e0d178b1d1e 3520 { 0x3d75165,0x0c39ecf,0x3554a12,0x30af34c,0x2d66344,0x3ded408,
wolfSSL 16:8e0d178b1d1e 3521 0x36f1be0,0x0d065b0,0x012d046,0x0025623 } },
wolfSSL 16:8e0d178b1d1e 3522 /* 156 */
wolfSSL 16:8e0d178b1d1e 3523 { { 0x2601c3b,0x1824fc0,0x335fe08,0x3e33d70,0x0fb0252,0x252bfca,
wolfSSL 16:8e0d178b1d1e 3524 0x1cf2808,0x1922e55,0x1a9db9f,0x020721e },
wolfSSL 16:8e0d178b1d1e 3525 { 0x2f56c51,0x39a1f31,0x218c040,0x1a4fc5d,0x3fed471,0x0164d4e,
wolfSSL 16:8e0d178b1d1e 3526 0x388a419,0x06f1113,0x0f55fc1,0x03e8352 } },
wolfSSL 16:8e0d178b1d1e 3527 /* 157 */
wolfSSL 16:8e0d178b1d1e 3528 { { 0x1608e4d,0x3872778,0x022cbc6,0x044d60a,0x3010dda,0x15fb0b5,
wolfSSL 16:8e0d178b1d1e 3529 0x37ddc11,0x19f5bda,0x156b6a3,0x023a838 },
wolfSSL 16:8e0d178b1d1e 3530 { 0x383b3b4,0x1380bc8,0x353ca35,0x250fc07,0x169966b,0x3780f29,
wolfSSL 16:8e0d178b1d1e 3531 0x36632b2,0x2d6b13f,0x124fa00,0x00fd6ae } },
wolfSSL 16:8e0d178b1d1e 3532 /* 158 */
wolfSSL 16:8e0d178b1d1e 3533 { { 0x1739efb,0x2ec3656,0x2c0d337,0x3d39faf,0x1c751b0,0x04699f4,
wolfSSL 16:8e0d178b1d1e 3534 0x252dd64,0x095b8b6,0x0872b74,0x022f1da },
wolfSSL 16:8e0d178b1d1e 3535 { 0x2d3d253,0x38edca0,0x379fa5b,0x287d635,0x3a9f679,0x059d9ee,
wolfSSL 16:8e0d178b1d1e 3536 0x0ac168e,0x3cd3e87,0x19060fc,0x02ce1bc } },
wolfSSL 16:8e0d178b1d1e 3537 /* 159 */
wolfSSL 16:8e0d178b1d1e 3538 { { 0x3edcfc2,0x0f04d4b,0x2f0d31f,0x1898be2,0x25396bf,0x15ca230,
wolfSSL 16:8e0d178b1d1e 3539 0x02b4eae,0x2713668,0x0f71b06,0x0132d18 },
wolfSSL 16:8e0d178b1d1e 3540 { 0x38095ea,0x1ed34d6,0x3603ae6,0x165bf01,0x192bbf8,0x1852859,
wolfSSL 16:8e0d178b1d1e 3541 0x075f66b,0x1488f85,0x10895ef,0x014b035 } },
wolfSSL 16:8e0d178b1d1e 3542 /* 160 */
wolfSSL 16:8e0d178b1d1e 3543 { { 0x1339848,0x3084385,0x0c8d231,0x3a1c1de,0x0e87a28,0x255b85c,
wolfSSL 16:8e0d178b1d1e 3544 0x1de6616,0x2702e74,0x1382bb0,0x012b0f2 },
wolfSSL 16:8e0d178b1d1e 3545 { 0x198987d,0x381545a,0x34d619b,0x312b827,0x18b2376,0x28fe4cf,
wolfSSL 16:8e0d178b1d1e 3546 0x20b7651,0x017d077,0x0c7e397,0x00e0365 } },
wolfSSL 16:8e0d178b1d1e 3547 /* 161 */
wolfSSL 16:8e0d178b1d1e 3548 { { 0x1542e75,0x0d56aa0,0x39b701a,0x287b806,0x396c724,0x0935c21,
wolfSSL 16:8e0d178b1d1e 3549 0x3a29776,0x0debdac,0x171de26,0x00b38f8 },
wolfSSL 16:8e0d178b1d1e 3550 { 0x1d5bc1a,0x3fad27d,0x22b5cfe,0x1f89ddf,0x0a65560,0x144dd5b,
wolfSSL 16:8e0d178b1d1e 3551 0x2aac2f9,0x139353f,0x0520b62,0x00b9b36 } },
wolfSSL 16:8e0d178b1d1e 3552 /* 162 */
wolfSSL 16:8e0d178b1d1e 3553 { { 0x031c31d,0x16552e3,0x1a0c368,0x0016fc8,0x168533d,0x171e7b2,
wolfSSL 16:8e0d178b1d1e 3554 0x17626e7,0x275502f,0x14742c6,0x03285dd },
wolfSSL 16:8e0d178b1d1e 3555 { 0x2d2dbb2,0x3b6bffd,0x1d18cc6,0x2f45d2a,0x0fd0d8c,0x2915e3a,
wolfSSL 16:8e0d178b1d1e 3556 0x1e8793a,0x0b39a1d,0x3139cab,0x02a5da9 } },
wolfSSL 16:8e0d178b1d1e 3557 /* 163 */
wolfSSL 16:8e0d178b1d1e 3558 { { 0x3fb353d,0x147c6e4,0x3a720a6,0x22d5ff3,0x1d75cab,0x06c54a0,
wolfSSL 16:8e0d178b1d1e 3559 0x08cfa73,0x12666aa,0x3170a1f,0x021c829 },
wolfSSL 16:8e0d178b1d1e 3560 { 0x13e1b90,0x3a34dda,0x1fc38c3,0x02c5bdb,0x2d345dc,0x14aa1d0,
wolfSSL 16:8e0d178b1d1e 3561 0x28d00ab,0x224f23a,0x329c769,0x025c67b } },
wolfSSL 16:8e0d178b1d1e 3562 /* 164 */
wolfSSL 16:8e0d178b1d1e 3563 { { 0x0e35909,0x3bb6356,0x0116820,0x370cf77,0x29366d8,0x3881409,
wolfSSL 16:8e0d178b1d1e 3564 0x3999d06,0x013075f,0x176e157,0x02941ca },
wolfSSL 16:8e0d178b1d1e 3565 { 0x0e70b2e,0x28dfab1,0x2a8a002,0x15da242,0x084dcf6,0x116ca97,
wolfSSL 16:8e0d178b1d1e 3566 0x31bf186,0x1dc9735,0x09df7b7,0x0264e27 } },
wolfSSL 16:8e0d178b1d1e 3567 /* 165 */
wolfSSL 16:8e0d178b1d1e 3568 { { 0x2da7a4b,0x3023c9e,0x1366238,0x00ff4e2,0x03abe9d,0x19bd44b,
wolfSSL 16:8e0d178b1d1e 3569 0x272e897,0x20b91ad,0x2aa202c,0x02a2201 },
wolfSSL 16:8e0d178b1d1e 3570 { 0x380184e,0x08112b4,0x0b85660,0x31049aa,0x3a8cb78,0x36113c5,
wolfSSL 16:8e0d178b1d1e 3571 0x1670c0a,0x373f9e7,0x3fb4738,0x00010ef } },
wolfSSL 16:8e0d178b1d1e 3572 /* 166 */
wolfSSL 16:8e0d178b1d1e 3573 { { 0x2d5192e,0x26d770d,0x32af8d5,0x34d1642,0x1acf885,0x05805e0,
wolfSSL 16:8e0d178b1d1e 3574 0x166d0a1,0x1219a0d,0x301ba6c,0x014bcfb },
wolfSSL 16:8e0d178b1d1e 3575 { 0x2dcb64d,0x19cca83,0x379f398,0x08e01a0,0x10a482c,0x0103cc2,
wolfSSL 16:8e0d178b1d1e 3576 0x0be5fa7,0x1f9d45b,0x1899ef2,0x00ca5af } },
wolfSSL 16:8e0d178b1d1e 3577 /* 167 */
wolfSSL 16:8e0d178b1d1e 3578 { { 0x14d81d7,0x2aea251,0x1b3c476,0x3bd47ae,0x29eade7,0x0715e61,
wolfSSL 16:8e0d178b1d1e 3579 0x1a21cd8,0x1c7a586,0x2bfaee5,0x00ee43f },
wolfSSL 16:8e0d178b1d1e 3580 { 0x096f7cb,0x0c08f95,0x1bc4939,0x361fed4,0x255be41,0x26fad73,
wolfSSL 16:8e0d178b1d1e 3581 0x31dd489,0x02c600f,0x29d9f81,0x01ba201 } },
wolfSSL 16:8e0d178b1d1e 3582 /* 168 */
wolfSSL 16:8e0d178b1d1e 3583 { { 0x03ea1db,0x1eac46d,0x1292ce3,0x2a54967,0x20a7ff1,0x3e13c61,
wolfSSL 16:8e0d178b1d1e 3584 0x1b02218,0x2b44e14,0x3eadefa,0x029c88a },
wolfSSL 16:8e0d178b1d1e 3585 { 0x30a9144,0x31e3b0a,0x19c5a2a,0x147cbe9,0x05a0240,0x051f38e,
wolfSSL 16:8e0d178b1d1e 3586 0x11eca56,0x31a4247,0x123bc2a,0x02fa535 } },
wolfSSL 16:8e0d178b1d1e 3587 /* 169 */
wolfSSL 16:8e0d178b1d1e 3588 { { 0x3226ce7,0x1251782,0x0b7072f,0x11e59fa,0x2b8afd7,0x169b18f,
wolfSSL 16:8e0d178b1d1e 3589 0x2a46f18,0x31d9bb7,0x2fe9be8,0x01de0b7 },
wolfSSL 16:8e0d178b1d1e 3590 { 0x1b38626,0x34aa90f,0x3ad1760,0x21ddbd9,0x3460ae7,0x1126736,
wolfSSL 16:8e0d178b1d1e 3591 0x1b86fc5,0x0b92cd0,0x167a289,0x000e0e1 } },
wolfSSL 16:8e0d178b1d1e 3592 /* 170 */
wolfSSL 16:8e0d178b1d1e 3593 { { 0x1ec1a0f,0x36bbf5e,0x1c972d8,0x3f73ace,0x13bbcd6,0x23d86a5,
wolfSSL 16:8e0d178b1d1e 3594 0x175ffc5,0x2d083d5,0x2c4adf7,0x036f661 },
wolfSSL 16:8e0d178b1d1e 3595 { 0x1f39eb7,0x2a20505,0x176c81a,0x3d6e636,0x16ee2fc,0x3cbdc5f,
wolfSSL 16:8e0d178b1d1e 3596 0x25475dc,0x2ef4151,0x3c46860,0x0238934 } },
wolfSSL 16:8e0d178b1d1e 3597 /* 171 */
wolfSSL 16:8e0d178b1d1e 3598 { { 0x2587390,0x3639526,0x0588749,0x13c32fb,0x212bb19,0x09660f1,
wolfSSL 16:8e0d178b1d1e 3599 0x207da4b,0x2bf211b,0x1c4407b,0x01506a6 },
wolfSSL 16:8e0d178b1d1e 3600 { 0x24c8842,0x105a498,0x05ffdb2,0x0ab61b0,0x26044c1,0x3dff3d8,
wolfSSL 16:8e0d178b1d1e 3601 0x1d14b44,0x0d74716,0x049f57d,0x030024b } },
wolfSSL 16:8e0d178b1d1e 3602 /* 172 */
wolfSSL 16:8e0d178b1d1e 3603 { { 0x32e61ef,0x31d70f7,0x35cad3c,0x320b86c,0x07e8841,0x027ca7d,
wolfSSL 16:8e0d178b1d1e 3604 0x2d30d19,0x2513718,0x2347286,0x01d7901 },
wolfSSL 16:8e0d178b1d1e 3605 { 0x3c237d0,0x107f16e,0x01c9e7d,0x3c3b13c,0x0c9537b,0x20af54d,
wolfSSL 16:8e0d178b1d1e 3606 0x051a162,0x2161a47,0x258c784,0x016df2d } },
wolfSSL 16:8e0d178b1d1e 3607 /* 173 */
wolfSSL 16:8e0d178b1d1e 3608 { { 0x228ead1,0x29c2122,0x07f6964,0x023f4ed,0x1802dc5,0x19f96ce,
wolfSSL 16:8e0d178b1d1e 3609 0x24bfd17,0x25e866b,0x2ba8df0,0x01eb84f },
wolfSSL 16:8e0d178b1d1e 3610 { 0x2dd384e,0x05bbe3a,0x3f06fd2,0x366dacb,0x30361a2,0x2f36d7c,
wolfSSL 16:8e0d178b1d1e 3611 0x0b98784,0x38ff481,0x074e2a8,0x01e1f60 } },
wolfSSL 16:8e0d178b1d1e 3612 /* 174 */
wolfSSL 16:8e0d178b1d1e 3613 { { 0x17fbb1c,0x0975add,0x1debc5e,0x2cb2880,0x3e47bdd,0x3488cff,
wolfSSL 16:8e0d178b1d1e 3614 0x15e9a36,0x2121129,0x0199ef2,0x017088a },
wolfSSL 16:8e0d178b1d1e 3615 { 0x0315250,0x352a162,0x17c1773,0x0ae09c2,0x321b21a,0x3bd74cf,
wolfSSL 16:8e0d178b1d1e 3616 0x3c4ea1d,0x3cac2ad,0x3abbaf0,0x039174d } },
wolfSSL 16:8e0d178b1d1e 3617 /* 175 */
wolfSSL 16:8e0d178b1d1e 3618 { { 0x0511c8a,0x3c78d0a,0x2cd3d2d,0x322f729,0x3ebb229,0x09f0e69,
wolfSSL 16:8e0d178b1d1e 3619 0x0a71a76,0x2e74d5e,0x12284df,0x03b5ef0 },
wolfSSL 16:8e0d178b1d1e 3620 { 0x3dea561,0x0a9b7e4,0x0ed1cf2,0x237523c,0x05443f1,0x2eb48fa,
wolfSSL 16:8e0d178b1d1e 3621 0x3861405,0x1b49f62,0x0c945ca,0x02ab25f } },
wolfSSL 16:8e0d178b1d1e 3622 /* 176 */
wolfSSL 16:8e0d178b1d1e 3623 { { 0x16bd00a,0x13a9d28,0x3cc1eb5,0x2b7d702,0x2d839e9,0x3e6ff01,
wolfSSL 16:8e0d178b1d1e 3624 0x2bb7f11,0x3713824,0x3b31163,0x00c63e5 },
wolfSSL 16:8e0d178b1d1e 3625 { 0x30d7138,0x0316fb0,0x0220ecc,0x08eaf0c,0x244e8df,0x0088d81,
wolfSSL 16:8e0d178b1d1e 3626 0x37972fb,0x3fd34ae,0x2a19a84,0x03e907e } },
wolfSSL 16:8e0d178b1d1e 3627 /* 177 */
wolfSSL 16:8e0d178b1d1e 3628 { { 0x2642269,0x0b65d29,0x03bd440,0x33a6ede,0x3c81814,0x2507982,
wolfSSL 16:8e0d178b1d1e 3629 0x0d38e47,0x3a788e6,0x32c1d26,0x00e2eda },
wolfSSL 16:8e0d178b1d1e 3630 { 0x2577f87,0x392895a,0x3e1cc64,0x14f7047,0x08b52d2,0x08a01ca,
wolfSSL 16:8e0d178b1d1e 3631 0x336abf6,0x00697fc,0x105ce76,0x0253742 } },
wolfSSL 16:8e0d178b1d1e 3632 /* 178 */
wolfSSL 16:8e0d178b1d1e 3633 { { 0x293f92a,0x33df737,0x3315156,0x32e26d7,0x0a01333,0x26579d4,
wolfSSL 16:8e0d178b1d1e 3634 0x004df9c,0x0aba409,0x067d25c,0x02481de },
wolfSSL 16:8e0d178b1d1e 3635 { 0x3f39d44,0x1c78042,0x13d7e24,0x0825aed,0x35f2c90,0x3270f63,
wolfSSL 16:8e0d178b1d1e 3636 0x04b7b35,0x3ad4531,0x28bd29b,0x0207a10 } },
wolfSSL 16:8e0d178b1d1e 3637 /* 179 */
wolfSSL 16:8e0d178b1d1e 3638 { { 0x077199f,0x270aeb1,0x0dd96dd,0x3b9ad7b,0x28cb8ee,0x3903f43,
wolfSSL 16:8e0d178b1d1e 3639 0x37db3fe,0x292c62b,0x362dbbf,0x006e52a },
wolfSSL 16:8e0d178b1d1e 3640 { 0x247f143,0x0362cf3,0x216344f,0x3f18fd1,0x351e623,0x31664e0,
wolfSSL 16:8e0d178b1d1e 3641 0x0f270fc,0x243bbc6,0x2280555,0x001a8e3 } },
wolfSSL 16:8e0d178b1d1e 3642 /* 180 */
wolfSSL 16:8e0d178b1d1e 3643 { { 0x3355b49,0x2c04e6c,0x399b2e5,0x182d3af,0x020e265,0x09a7cf7,
wolfSSL 16:8e0d178b1d1e 3644 0x0ffa6bd,0x353e302,0x02083d9,0x029ecdb },
wolfSSL 16:8e0d178b1d1e 3645 { 0x33e8830,0x0570e86,0x1c0b64d,0x386a27e,0x0d5fcea,0x0b45a4c,
wolfSSL 16:8e0d178b1d1e 3646 0x2ee4a2e,0x0a8833f,0x2b4a282,0x02f9531 } },
wolfSSL 16:8e0d178b1d1e 3647 /* 181 */
wolfSSL 16:8e0d178b1d1e 3648 { { 0x191167c,0x36cf7e3,0x225ed6c,0x1e79e99,0x0517c3f,0x11ab1fd,
wolfSSL 16:8e0d178b1d1e 3649 0x05648f3,0x08aedc4,0x1abeae0,0x02fcc29 },
wolfSSL 16:8e0d178b1d1e 3650 { 0x3828a68,0x1e16fa4,0x30368e7,0x0c9fcfb,0x25161c3,0x24851ac,
wolfSSL 16:8e0d178b1d1e 3651 0x1b5feb5,0x344eb84,0x0de2732,0x0347208 } },
wolfSSL 16:8e0d178b1d1e 3652 /* 182 */
wolfSSL 16:8e0d178b1d1e 3653 { { 0x038b363,0x384d1e4,0x2519043,0x151ac17,0x158c11f,0x009b2b4,
wolfSSL 16:8e0d178b1d1e 3654 0x257abe6,0x2368d3f,0x3ed68a1,0x02df45e },
wolfSSL 16:8e0d178b1d1e 3655 { 0x29c2559,0x2962478,0x3d8444c,0x1d96fff,0x04f7a03,0x1391a52,
wolfSSL 16:8e0d178b1d1e 3656 0x0de4af7,0x3319126,0x15e6412,0x00e65ff } },
wolfSSL 16:8e0d178b1d1e 3657 /* 183 */
wolfSSL 16:8e0d178b1d1e 3658 { { 0x3d61507,0x1d1a0a2,0x0d2af20,0x354d299,0x329e132,0x2a28578,
wolfSSL 16:8e0d178b1d1e 3659 0x2ddfb08,0x04fa3ff,0x1293c6c,0x003bae2 },
wolfSSL 16:8e0d178b1d1e 3660 { 0x3e259f8,0x1a68fa9,0x3e67e9b,0x39b44f9,0x1ce1db7,0x347e9a1,
wolfSSL 16:8e0d178b1d1e 3661 0x3318f6a,0x2dbbc9d,0x2f8c922,0x008a245 } },
wolfSSL 16:8e0d178b1d1e 3662 /* 184 */
wolfSSL 16:8e0d178b1d1e 3663 { { 0x212ab5b,0x2b896c2,0x0136959,0x07e55ef,0x0cc1117,0x05b8ac3,
wolfSSL 16:8e0d178b1d1e 3664 0x18429ed,0x025fa01,0x11d6e93,0x03b016b },
wolfSSL 16:8e0d178b1d1e 3665 { 0x03f3708,0x2e96fab,0x1d77157,0x0d4c2d6,0x131baf9,0x0608d39,
wolfSSL 16:8e0d178b1d1e 3666 0x3552371,0x06cdd1e,0x1567ff1,0x01f4c50 } },
wolfSSL 16:8e0d178b1d1e 3667 /* 185 */
wolfSSL 16:8e0d178b1d1e 3668 { { 0x2dfefab,0x270173d,0x37077bd,0x1a372cd,0x1be2f22,0x28e2ee5,
wolfSSL 16:8e0d178b1d1e 3669 0x3ead973,0x35e8f94,0x2fc9bc1,0x03a7399 },
wolfSSL 16:8e0d178b1d1e 3670 { 0x36a02a1,0x2855d9b,0x00ed75a,0x37d8398,0x138c087,0x233706e,
wolfSSL 16:8e0d178b1d1e 3671 0x147f346,0x01947e2,0x3017228,0x0365942 } },
wolfSSL 16:8e0d178b1d1e 3672 /* 186 */
wolfSSL 16:8e0d178b1d1e 3673 { { 0x2057e60,0x2d31296,0x25e4504,0x2fa37bc,0x1cbccc3,0x1f0732f,
wolfSSL 16:8e0d178b1d1e 3674 0x3532081,0x2de8a98,0x19a804e,0x005359a },
wolfSSL 16:8e0d178b1d1e 3675 { 0x31f411a,0x2a10576,0x369c2c8,0x02fe035,0x109fbaf,0x30bddeb,
wolfSSL 16:8e0d178b1d1e 3676 0x1eef901,0x1662ad3,0x0410d43,0x01bd31a } },
wolfSSL 16:8e0d178b1d1e 3677 /* 187 */
wolfSSL 16:8e0d178b1d1e 3678 { { 0x2c24a96,0x1b7d3a5,0x19a3872,0x217f2f6,0x2534dbc,0x2cab8c2,
wolfSSL 16:8e0d178b1d1e 3679 0x066ef28,0x26aecf1,0x0fd6118,0x01310d4 },
wolfSSL 16:8e0d178b1d1e 3680 { 0x055b8da,0x1fdc5be,0x38a1296,0x25118f0,0x341a423,0x2ba4cd0,
wolfSSL 16:8e0d178b1d1e 3681 0x3e1413e,0x062d70d,0x2425a31,0x029c9b4 } },
wolfSSL 16:8e0d178b1d1e 3682 /* 188 */
wolfSSL 16:8e0d178b1d1e 3683 { { 0x08c1086,0x1acfba5,0x22e1dae,0x0f72f4e,0x3f1de50,0x0f408bc,
wolfSSL 16:8e0d178b1d1e 3684 0x35ed3f0,0x3ce48fc,0x282cc6c,0x004d8e7 },
wolfSSL 16:8e0d178b1d1e 3685 { 0x1afaa86,0x24e3ef3,0x22589ac,0x3ec9952,0x1f45bc5,0x14144ca,
wolfSSL 16:8e0d178b1d1e 3686 0x23b26e4,0x0d68c65,0x1e1c1a3,0x032a4d9 } },
wolfSSL 16:8e0d178b1d1e 3687 /* 189 */
wolfSSL 16:8e0d178b1d1e 3688 { { 0x03b2d20,0x16b1d53,0x241b361,0x05e4138,0x1742a54,0x32741c7,
wolfSSL 16:8e0d178b1d1e 3689 0x0521c4c,0x1ca96c2,0x034970b,0x02738a7 },
wolfSSL 16:8e0d178b1d1e 3690 { 0x13e0ad6,0x207dcdb,0x034c8cc,0x27bcbe1,0x18060da,0x33a18b6,
wolfSSL 16:8e0d178b1d1e 3691 0x2d1d1a6,0x2be60d7,0x3d7ab42,0x012312a } },
wolfSSL 16:8e0d178b1d1e 3692 /* 190 */
wolfSSL 16:8e0d178b1d1e 3693 { { 0x0c7485a,0x06c3310,0x0dbfd22,0x2ef949d,0x0ead455,0x098f4ba,
wolfSSL 16:8e0d178b1d1e 3694 0x3c76989,0x0cf2d24,0x032f67b,0x01e005f },
wolfSSL 16:8e0d178b1d1e 3695 { 0x30cb5ee,0x0d5da64,0x0ed2b9d,0x2503102,0x1c0d14e,0x1cbc693,
wolfSSL 16:8e0d178b1d1e 3696 0x37bf552,0x07013e2,0x054de5c,0x014f341 } },
wolfSSL 16:8e0d178b1d1e 3697 /* 191 */
wolfSSL 16:8e0d178b1d1e 3698 { { 0x128ccac,0x1617e97,0x346ebcd,0x158016d,0x25f823e,0x34048ea,
wolfSSL 16:8e0d178b1d1e 3699 0x39f0a1c,0x3ea3df1,0x1c1d3d7,0x03ba919 },
wolfSSL 16:8e0d178b1d1e 3700 { 0x151803b,0x01967c1,0x2f70781,0x27df39a,0x06c0b59,0x24a239c,
wolfSSL 16:8e0d178b1d1e 3701 0x15a7702,0x2464d06,0x2a47ae6,0x006db90 } },
wolfSSL 16:8e0d178b1d1e 3702 /* 192 */
wolfSSL 16:8e0d178b1d1e 3703 { { 0x27d04c3,0x024df3d,0x38112e8,0x38a27ba,0x01e312b,0x0965358,
wolfSSL 16:8e0d178b1d1e 3704 0x35d8879,0x2f4f55a,0x214187f,0x0008936 },
wolfSSL 16:8e0d178b1d1e 3705 { 0x05fe36f,0x2ee18c3,0x1f5f87a,0x1813bd4,0x0580f3c,0x0ed0a7b,
wolfSSL 16:8e0d178b1d1e 3706 0x0fb1bfb,0x3fcce59,0x2f042bf,0x01820e3 } },
wolfSSL 16:8e0d178b1d1e 3707 /* 193 */
wolfSSL 16:8e0d178b1d1e 3708 { { 0x20bbe99,0x32cbc9f,0x39ee432,0x3cc12a8,0x37bda44,0x3ea4e40,
wolfSSL 16:8e0d178b1d1e 3709 0x097c7a9,0x0590d7d,0x2022d33,0x018dbac },
wolfSSL 16:8e0d178b1d1e 3710 { 0x3ae00aa,0x3439864,0x2d2ffcf,0x3f8c6b9,0x0875a00,0x3e4e407,
wolfSSL 16:8e0d178b1d1e 3711 0x3658a29,0x22eb3d0,0x2b63921,0x022113b } },
wolfSSL 16:8e0d178b1d1e 3712 /* 194 */
wolfSSL 16:8e0d178b1d1e 3713 { { 0x33bae58,0x05c749a,0x1f3e114,0x1c45f8e,0x27db3df,0x06a3ab6,
wolfSSL 16:8e0d178b1d1e 3714 0x37bc7f8,0x1e27b34,0x3dc51fb,0x009eea0 },
wolfSSL 16:8e0d178b1d1e 3715 { 0x3f54de5,0x3d0e7fe,0x1a71a7d,0x02ed7f8,0x0727703,0x2ca5e92,
wolfSSL 16:8e0d178b1d1e 3716 0x2e8e35d,0x292ad0b,0x13487f3,0x02b6d8b } },
wolfSSL 16:8e0d178b1d1e 3717 /* 195 */
wolfSSL 16:8e0d178b1d1e 3718 { { 0x175df2a,0x05a28a8,0x32e99b1,0x13d8630,0x2082aa0,0x11ac245,
wolfSSL 16:8e0d178b1d1e 3719 0x24f2e71,0x322cb27,0x17675e7,0x02e643f },
wolfSSL 16:8e0d178b1d1e 3720 { 0x1f37313,0x2765ad3,0x0789082,0x1e742d0,0x11c2055,0x2021dc4,
wolfSSL 16:8e0d178b1d1e 3721 0x09ae4a7,0x346359b,0x2f94d10,0x0205c1f } },
wolfSSL 16:8e0d178b1d1e 3722 /* 196 */
wolfSSL 16:8e0d178b1d1e 3723 { { 0x3d6ff96,0x1f2ac80,0x336097d,0x3f03610,0x35b851b,0x010b6d2,
wolfSSL 16:8e0d178b1d1e 3724 0x0823c4d,0x2a9709a,0x2ead5a8,0x00de4b6 },
wolfSSL 16:8e0d178b1d1e 3725 { 0x01afa0b,0x0621965,0x3671528,0x1050b60,0x3f3e9e7,0x2f93829,
wolfSSL 16:8e0d178b1d1e 3726 0x0825275,0x006e85f,0x35e94b0,0x016af58 } },
wolfSSL 16:8e0d178b1d1e 3727 /* 197 */
wolfSSL 16:8e0d178b1d1e 3728 { { 0x2c4927c,0x3ea1382,0x0f23727,0x0d69f23,0x3e38860,0x2b72837,
wolfSSL 16:8e0d178b1d1e 3729 0x3cd5ea4,0x2d84292,0x321846a,0x016656f },
wolfSSL 16:8e0d178b1d1e 3730 { 0x29dfa33,0x3e182e0,0x018be90,0x2ba563f,0x2caafe2,0x218c0d9,
wolfSSL 16:8e0d178b1d1e 3731 0x3baf447,0x1047a6c,0x0a2d483,0x01130cb } },
wolfSSL 16:8e0d178b1d1e 3732 /* 198 */
wolfSSL 16:8e0d178b1d1e 3733 { { 0x00ed80c,0x2a5fc79,0x0a82a74,0x2c4c74b,0x15f938c,0x30b5ab6,
wolfSSL 16:8e0d178b1d1e 3734 0x32124b7,0x295314f,0x2fb8082,0x007c858 },
wolfSSL 16:8e0d178b1d1e 3735 { 0x20b173e,0x19f315c,0x12f97e4,0x198217c,0x040e8a6,0x3275977,
wolfSSL 16:8e0d178b1d1e 3736 0x2bc20e4,0x01f2633,0x02bc3e9,0x023c750 } },
wolfSSL 16:8e0d178b1d1e 3737 /* 199 */
wolfSSL 16:8e0d178b1d1e 3738 { { 0x3c4058a,0x24be73e,0x16704f5,0x2d8a4bd,0x3b15e14,0x3076315,
wolfSSL 16:8e0d178b1d1e 3739 0x1cfe37b,0x36fe715,0x343926e,0x02c6603 },
wolfSSL 16:8e0d178b1d1e 3740 { 0x2c76b09,0x0cf824c,0x3f7898c,0x274cec1,0x11df527,0x18eed18,
wolfSSL 16:8e0d178b1d1e 3741 0x08ead48,0x23915bc,0x19b3744,0x00a0a2b } },
wolfSSL 16:8e0d178b1d1e 3742 /* 200 */
wolfSSL 16:8e0d178b1d1e 3743 { { 0x0cf4ac5,0x1c8b131,0x0afb696,0x0ff7799,0x2f5ac1a,0x022420c,
wolfSSL 16:8e0d178b1d1e 3744 0x11baa2e,0x2ce4015,0x1275a14,0x0125cfc },
wolfSSL 16:8e0d178b1d1e 3745 { 0x22eac5d,0x360cd4c,0x3568e59,0x3d42f66,0x35e07ee,0x09620e4,
wolfSSL 16:8e0d178b1d1e 3746 0x36720fa,0x22b1eac,0x2d0db16,0x01b6b23 } },
wolfSSL 16:8e0d178b1d1e 3747 /* 201 */
wolfSSL 16:8e0d178b1d1e 3748 { { 0x1a835ef,0x1516bbb,0x2d51f7b,0x3487443,0x14aa113,0x0dd06c2,
wolfSSL 16:8e0d178b1d1e 3749 0x1a65e01,0x379300d,0x35920b9,0x012c8fb },
wolfSSL 16:8e0d178b1d1e 3750 { 0x04c7341,0x2eda00f,0x3c37e82,0x1b4fd62,0x0d45770,0x1478fba,
wolfSSL 16:8e0d178b1d1e 3751 0x127863a,0x26939cd,0x134ddf4,0x01375c5 } },
wolfSSL 16:8e0d178b1d1e 3752 /* 202 */
wolfSSL 16:8e0d178b1d1e 3753 { { 0x1476cd9,0x1119ca5,0x325bbf9,0x0bf8c69,0x0648d07,0x312d9f8,
wolfSSL 16:8e0d178b1d1e 3754 0x01c8b8f,0x136ec51,0x0002f4a,0x03f4c5c },
wolfSSL 16:8e0d178b1d1e 3755 { 0x195d0e1,0x10ffd22,0x29aa1cb,0x3443bdc,0x276e695,0x05e6260,
wolfSSL 16:8e0d178b1d1e 3756 0x15f9764,0x3cd9783,0x18c9569,0x0053eb1 } },
wolfSSL 16:8e0d178b1d1e 3757 /* 203 */
wolfSSL 16:8e0d178b1d1e 3758 { { 0x312ae18,0x280197c,0x3fc9ad9,0x303f324,0x251958d,0x29f4a11,
wolfSSL 16:8e0d178b1d1e 3759 0x2142408,0x3694366,0x25136ab,0x03b5f1d },
wolfSSL 16:8e0d178b1d1e 3760 { 0x1d4abbc,0x1c3c689,0x13ea462,0x3cfc684,0x39b5dd8,0x2d4654b,
wolfSSL 16:8e0d178b1d1e 3761 0x09b0755,0x27d4f18,0x3f74d2e,0x03fbf2d } },
wolfSSL 16:8e0d178b1d1e 3762 /* 204 */
wolfSSL 16:8e0d178b1d1e 3763 { { 0x2119185,0x2525eae,0x1ba4bd0,0x0c2ab11,0x1d54e8c,0x294845e,
wolfSSL 16:8e0d178b1d1e 3764 0x2479dea,0x3602d24,0x17e87e0,0x0060069 },
wolfSSL 16:8e0d178b1d1e 3765 { 0x0afffb0,0x34fe37f,0x1240073,0x02eb895,0x06cf33c,0x2d7f7ef,
wolfSSL 16:8e0d178b1d1e 3766 0x1d763b5,0x04191e0,0x11e1ead,0x027e3f0 } },
wolfSSL 16:8e0d178b1d1e 3767 /* 205 */
wolfSSL 16:8e0d178b1d1e 3768 { { 0x269544c,0x0e85c57,0x3813158,0x19fc12d,0x20eaf85,0x1e2930c,
wolfSSL 16:8e0d178b1d1e 3769 0x22a8fd2,0x1a6a478,0x09d3d3a,0x02a74e0 },
wolfSSL 16:8e0d178b1d1e 3770 { 0x1a2da3b,0x30b0b16,0x0847936,0x3d86257,0x138ccbc,0x0f5421a,
wolfSSL 16:8e0d178b1d1e 3771 0x25244e6,0x23bdd79,0x1aee117,0x00c01ae } },
wolfSSL 16:8e0d178b1d1e 3772 /* 206 */
wolfSSL 16:8e0d178b1d1e 3773 { { 0x1eead28,0x07cac32,0x1fbc0bb,0x17627d3,0x17eef63,0x0b3a24e,
wolfSSL 16:8e0d178b1d1e 3774 0x0757fdb,0x3dd841d,0x3d745f8,0x002ae17 },
wolfSSL 16:8e0d178b1d1e 3775 { 0x25b4549,0x29f24cf,0x2f21ecd,0x1725e48,0x04be2bb,0x10ee010,
wolfSSL 16:8e0d178b1d1e 3776 0x1a1274b,0x10b0898,0x27511e9,0x02c48b5 } },
wolfSSL 16:8e0d178b1d1e 3777 /* 207 */
wolfSSL 16:8e0d178b1d1e 3778 { { 0x2a5ae7a,0x181ef99,0x0be33be,0x3e9dab7,0x101e703,0x3adb971,
wolfSSL 16:8e0d178b1d1e 3779 0x1043014,0x2ebb2be,0x1c1097d,0x027d667 },
wolfSSL 16:8e0d178b1d1e 3780 { 0x3f250ed,0x16dc603,0x20dc6d7,0x1d0d268,0x38eb915,0x02c89e8,
wolfSSL 16:8e0d178b1d1e 3781 0x1605a41,0x12de109,0x0e08a29,0x01f554a } },
wolfSSL 16:8e0d178b1d1e 3782 /* 208 */
wolfSSL 16:8e0d178b1d1e 3783 { { 0x0c26def,0x163d988,0x2d1ef0f,0x3a960ac,0x1025585,0x0738e20,
wolfSSL 16:8e0d178b1d1e 3784 0x27d79b0,0x05cc3ef,0x201303f,0x00a333a },
wolfSSL 16:8e0d178b1d1e 3785 { 0x1644ba5,0x2af345e,0x30b8d1d,0x3a01bff,0x31fc643,0x1acf85e,
wolfSSL 16:8e0d178b1d1e 3786 0x0a76fc6,0x04efe98,0x348a1d0,0x03062eb } },
wolfSSL 16:8e0d178b1d1e 3787 /* 209 */
wolfSSL 16:8e0d178b1d1e 3788 { { 0x1c4216d,0x18e3217,0x02ac34e,0x19c8185,0x200c010,0x17d4192,
wolfSSL 16:8e0d178b1d1e 3789 0x13a1719,0x165af51,0x09db7a9,0x0277be0 },
wolfSSL 16:8e0d178b1d1e 3790 { 0x3ab8d2c,0x2190b99,0x22b641e,0x0cd88de,0x3b42404,0x1310862,
wolfSSL 16:8e0d178b1d1e 3791 0x106a6d6,0x23395f5,0x0b06880,0x000d5fe } },
wolfSSL 16:8e0d178b1d1e 3792 /* 210 */
wolfSSL 16:8e0d178b1d1e 3793 { { 0x0d2cc88,0x36f9913,0x339d8e9,0x237c2e3,0x0cc61c2,0x34c2832,
wolfSSL 16:8e0d178b1d1e 3794 0x309874c,0x2621d28,0x2dd1b48,0x0392806 },
wolfSSL 16:8e0d178b1d1e 3795 { 0x17cd8f9,0x07bab3d,0x0c482ed,0x0faf565,0x31b767d,0x2f4bde1,
wolfSSL 16:8e0d178b1d1e 3796 0x295c717,0x330c29c,0x179ce10,0x0119b5f } },
wolfSSL 16:8e0d178b1d1e 3797 /* 211 */
wolfSSL 16:8e0d178b1d1e 3798 { { 0x1ada2c7,0x0c624a7,0x227d47d,0x30e3e6a,0x14fa0a6,0x0829678,
wolfSSL 16:8e0d178b1d1e 3799 0x24fd288,0x2b46a43,0x122451e,0x0319ca9 },
wolfSSL 16:8e0d178b1d1e 3800 { 0x186b655,0x01f3217,0x0af1306,0x0efe6b5,0x2f0235d,0x1c45ca9,
wolfSSL 16:8e0d178b1d1e 3801 0x2086805,0x1d44e66,0x0faf2a6,0x0178f59 } },
wolfSSL 16:8e0d178b1d1e 3802 /* 212 */
wolfSSL 16:8e0d178b1d1e 3803 { { 0x33b4416,0x10431e6,0x2d99aa6,0x217aac9,0x0cd8fcf,0x2d95a9d,
wolfSSL 16:8e0d178b1d1e 3804 0x3ff74ad,0x10bf17a,0x295eb8e,0x01b229e },
wolfSSL 16:8e0d178b1d1e 3805 { 0x02a63bd,0x182e9ec,0x004710c,0x00e2e3c,0x06b2f23,0x04b642c,
wolfSSL 16:8e0d178b1d1e 3806 0x2c37383,0x32a4631,0x022ad82,0x00d22b9 } },
wolfSSL 16:8e0d178b1d1e 3807 /* 213 */
wolfSSL 16:8e0d178b1d1e 3808 { { 0x0cda2fb,0x1d198d7,0x26d27f4,0x286381c,0x022acca,0x24ac7c8,
wolfSSL 16:8e0d178b1d1e 3809 0x2df7824,0x0b4ba16,0x1e0d9ef,0x03041d3 },
wolfSSL 16:8e0d178b1d1e 3810 { 0x29a65b3,0x0f3912b,0x151bfcf,0x2b0175c,0x0fd71e4,0x39aa5e2,
wolfSSL 16:8e0d178b1d1e 3811 0x311f50c,0x13ff351,0x3dbc9e5,0x03eeb7e } },
wolfSSL 16:8e0d178b1d1e 3812 /* 214 */
wolfSSL 16:8e0d178b1d1e 3813 { { 0x0a99363,0x0fc7348,0x2775171,0x23db3c8,0x2b91565,0x134d66c,
wolfSSL 16:8e0d178b1d1e 3814 0x0175cd2,0x1bf365a,0x2b48371,0x02dfe5d },
wolfSSL 16:8e0d178b1d1e 3815 { 0x16dbf74,0x2389357,0x2f36575,0x3f5c70e,0x38d23ba,0x090f7f8,
wolfSSL 16:8e0d178b1d1e 3816 0x3477600,0x3201523,0x32ecafc,0x03d3506 } },
wolfSSL 16:8e0d178b1d1e 3817 /* 215 */
wolfSSL 16:8e0d178b1d1e 3818 { { 0x1abd48d,0x073ca3f,0x38a451f,0x0d8cb01,0x1ce81be,0x05c51ba,
wolfSSL 16:8e0d178b1d1e 3819 0x0e29741,0x03c41ab,0x0eae016,0x0060209 },
wolfSSL 16:8e0d178b1d1e 3820 { 0x2e58358,0x1da62d9,0x2358038,0x14b39b2,0x1635687,0x39079b1,
wolfSSL 16:8e0d178b1d1e 3821 0x380e345,0x1b49608,0x23983cf,0x019f97d } },
wolfSSL 16:8e0d178b1d1e 3822 /* 216 */
wolfSSL 16:8e0d178b1d1e 3823 { { 0x34899ef,0x332e373,0x04c0f89,0x3c27aed,0x1949015,0x09663b2,
wolfSSL 16:8e0d178b1d1e 3824 0x2f9276b,0x07f1951,0x09a04c1,0x027fbde },
wolfSSL 16:8e0d178b1d1e 3825 { 0x3d2a071,0x19fb3d4,0x1b096d3,0x1fe9146,0x3b10e1a,0x0478bbb,
wolfSSL 16:8e0d178b1d1e 3826 0x2b3fb06,0x1388329,0x181a99c,0x02f2030 } },
wolfSSL 16:8e0d178b1d1e 3827 /* 217 */
wolfSSL 16:8e0d178b1d1e 3828 { { 0x1eb82e6,0x14dbe39,0x3920972,0x31fd5b2,0x21a484f,0x02d7697,
wolfSSL 16:8e0d178b1d1e 3829 0x0e21715,0x37c431e,0x2629f8c,0x01249c3 },
wolfSSL 16:8e0d178b1d1e 3830 { 0x26b50ad,0x26deefa,0x0ffc1a3,0x30688e2,0x39a0284,0x041c65e,
wolfSSL 16:8e0d178b1d1e 3831 0x03eb178,0x0bdfd50,0x2f96137,0x034bb94 } },
wolfSSL 16:8e0d178b1d1e 3832 /* 218 */
wolfSSL 16:8e0d178b1d1e 3833 { { 0x0e0362a,0x334a162,0x194dd37,0x29e3e97,0x2442fa8,0x10d2949,
wolfSSL 16:8e0d178b1d1e 3834 0x3836e5a,0x2dccebf,0x0bee5ab,0x037ed1e },
wolfSSL 16:8e0d178b1d1e 3835 { 0x33eede6,0x3c739d9,0x2f04a91,0x350ad6c,0x3a5390a,0x14c368b,
wolfSSL 16:8e0d178b1d1e 3836 0x26f7bf5,0x11ce979,0x0b408df,0x0366850 } },
wolfSSL 16:8e0d178b1d1e 3837 /* 219 */
wolfSSL 16:8e0d178b1d1e 3838 { { 0x28ea498,0x0886d5b,0x2e090e0,0x0a4d58f,0x2623478,0x0d74ab7,
wolfSSL 16:8e0d178b1d1e 3839 0x2b83913,0x12c6b81,0x18d623f,0x01d8301 },
wolfSSL 16:8e0d178b1d1e 3840 { 0x198aa79,0x26d6330,0x3a7f0b8,0x34bc1ea,0x2f74890,0x378955a,
wolfSSL 16:8e0d178b1d1e 3841 0x204110f,0x0102538,0x02d8f19,0x01c5066 } },
wolfSSL 16:8e0d178b1d1e 3842 /* 220 */
wolfSSL 16:8e0d178b1d1e 3843 { { 0x14b0f45,0x2838cd3,0x14e16f0,0x0e0e4aa,0x2d9280b,0x0f18757,
wolfSSL 16:8e0d178b1d1e 3844 0x3324c6b,0x1391ceb,0x1ce89d5,0x00ebe74 },
wolfSSL 16:8e0d178b1d1e 3845 { 0x0930371,0x3de6048,0x3097fd8,0x1308705,0x3eda266,0x3108c26,
wolfSSL 16:8e0d178b1d1e 3846 0x1545dcd,0x1f7583a,0x1c37395,0x02c7e05 } },
wolfSSL 16:8e0d178b1d1e 3847 /* 221 */
wolfSSL 16:8e0d178b1d1e 3848 { { 0x1fec44a,0x2a9e3a2,0x0caf84f,0x11cf2a9,0x0c8c2ae,0x06da989,
wolfSSL 16:8e0d178b1d1e 3849 0x1c807dc,0x3c149a4,0x1141543,0x02906bb },
wolfSSL 16:8e0d178b1d1e 3850 { 0x15ffe04,0x0d4e65f,0x2e20424,0x37d896d,0x18bacb2,0x1e05ddd,
wolfSSL 16:8e0d178b1d1e 3851 0x1660be8,0x183be17,0x1dd86fb,0x035ba70 } },
wolfSSL 16:8e0d178b1d1e 3852 /* 222 */
wolfSSL 16:8e0d178b1d1e 3853 { { 0x2853264,0x0ba5fb1,0x0a0b3aa,0x2df88c1,0x2771533,0x23aba6f,
wolfSSL 16:8e0d178b1d1e 3854 0x112bb7b,0x3e3086e,0x210ae9b,0x027271b },
wolfSSL 16:8e0d178b1d1e 3855 { 0x030b74c,0x0269678,0x1e90a23,0x135a98c,0x24ed749,0x126de7c,
wolfSSL 16:8e0d178b1d1e 3856 0x344b23a,0x186da27,0x19640fa,0x0159af5 } },
wolfSSL 16:8e0d178b1d1e 3857 /* 223 */
wolfSSL 16:8e0d178b1d1e 3858 { { 0x18061f3,0x3004630,0x3c70066,0x34df20f,0x1190b25,0x1c9cc91,
wolfSSL 16:8e0d178b1d1e 3859 0x1fc8e02,0x0d17bc1,0x390f525,0x033cb1c },
wolfSSL 16:8e0d178b1d1e 3860 { 0x0eb30cf,0x2f3ad04,0x303aa09,0x2e835dd,0x1cfd2eb,0x143fc95,
wolfSSL 16:8e0d178b1d1e 3861 0x02c43a1,0x025e7a1,0x3558aa2,0x000bd45 } },
wolfSSL 16:8e0d178b1d1e 3862 /* 224 */
wolfSSL 16:8e0d178b1d1e 3863 { { 0x1db7d07,0x3bde52b,0x1500396,0x1089115,0x20b4fc7,0x1e2a8f3,
wolfSSL 16:8e0d178b1d1e 3864 0x3f8eacc,0x365f7eb,0x1a5e8d4,0x0053a6b },
wolfSSL 16:8e0d178b1d1e 3865 { 0x37079e2,0x120284b,0x000edaa,0x33792c2,0x145baa3,0x20e055f,
wolfSSL 16:8e0d178b1d1e 3866 0x365e2d7,0x26ba005,0x3ab8e9d,0x0282b53 } },
wolfSSL 16:8e0d178b1d1e 3867 /* 225 */
wolfSSL 16:8e0d178b1d1e 3868 { { 0x2653618,0x2dd8852,0x2a5f0bf,0x0f0c7aa,0x2187281,0x1252757,
wolfSSL 16:8e0d178b1d1e 3869 0x13e7374,0x3b47855,0x0b86e56,0x02f354c },
wolfSSL 16:8e0d178b1d1e 3870 { 0x2e9c47b,0x2fa14cc,0x19ab169,0x3fad401,0x0dc2776,0x24afeed,
wolfSSL 16:8e0d178b1d1e 3871 0x3a97611,0x0d07736,0x3cf6979,0x02424a0 } },
wolfSSL 16:8e0d178b1d1e 3872 /* 226 */
wolfSSL 16:8e0d178b1d1e 3873 { { 0x2e81a13,0x000c91d,0x123967b,0x265885c,0x29bee1a,0x0cb8675,
wolfSSL 16:8e0d178b1d1e 3874 0x2d361bd,0x1526823,0x3c9ace1,0x00d7bad },
wolfSSL 16:8e0d178b1d1e 3875 { 0x24e5bdc,0x02b969f,0x2c6e128,0x34edb3b,0x12dcd2c,0x3899af0,
wolfSSL 16:8e0d178b1d1e 3876 0x24224c6,0x3a1914b,0x0f4448a,0x026a2cb } },
wolfSSL 16:8e0d178b1d1e 3877 /* 227 */
wolfSSL 16:8e0d178b1d1e 3878 { { 0x1d03b59,0x1c6fc82,0x32abf64,0x28ed96b,0x1c90e62,0x2f57bb2,
wolfSSL 16:8e0d178b1d1e 3879 0x3ff168e,0x04de7fd,0x0f4d449,0x01af6d8 },
wolfSSL 16:8e0d178b1d1e 3880 { 0x255bc30,0x2bfaf22,0x3fe0dad,0x0584025,0x1c79ead,0x3078ef7,
wolfSSL 16:8e0d178b1d1e 3881 0x2197414,0x022a50b,0x0fd94ba,0x0007b0f } },
wolfSSL 16:8e0d178b1d1e 3882 /* 228 */
wolfSSL 16:8e0d178b1d1e 3883 { { 0x09485c2,0x09dfaf7,0x10c7ba6,0x1e48bec,0x248cc9a,0x028a362,
wolfSSL 16:8e0d178b1d1e 3884 0x21d60f7,0x193d93d,0x1c04754,0x0346b2c },
wolfSSL 16:8e0d178b1d1e 3885 { 0x2f36612,0x240ac49,0x0d8bd26,0x13b8186,0x259c3a4,0x020d5fb,
wolfSSL 16:8e0d178b1d1e 3886 0x38a8133,0x09b0937,0x39d4056,0x01f7341 } },
wolfSSL 16:8e0d178b1d1e 3887 /* 229 */
wolfSSL 16:8e0d178b1d1e 3888 { { 0x05a4b48,0x1f534fc,0x07725ce,0x148dc8c,0x2adcd29,0x04aa456,
wolfSSL 16:8e0d178b1d1e 3889 0x0f79718,0x066e346,0x189377d,0x002fd4d },
wolfSSL 16:8e0d178b1d1e 3890 { 0x068ea73,0x336569b,0x184d35e,0x32a08e9,0x3c7f3bb,0x11ce9c8,
wolfSSL 16:8e0d178b1d1e 3891 0x3674c6f,0x21bf27e,0x0d9e166,0x034a2f9 } },
wolfSSL 16:8e0d178b1d1e 3892 /* 230 */
wolfSSL 16:8e0d178b1d1e 3893 { { 0x0fa8e4b,0x2e6418e,0x18fc5d2,0x1ba24ff,0x0559f18,0x0dbedbf,
wolfSSL 16:8e0d178b1d1e 3894 0x2de2aa4,0x22338e9,0x3aa510f,0x035d801 },
wolfSSL 16:8e0d178b1d1e 3895 { 0x23a4988,0x02aad94,0x02732d1,0x111d374,0x0b455cf,0x0d01c9e,
wolfSSL 16:8e0d178b1d1e 3896 0x067082a,0x2ec05fd,0x368b303,0x03cad4b } },
wolfSSL 16:8e0d178b1d1e 3897 /* 231 */
wolfSSL 16:8e0d178b1d1e 3898 { { 0x035b4ca,0x1fabea6,0x1cbc0d5,0x3f2ed9a,0x02d2232,0x1990c66,
wolfSSL 16:8e0d178b1d1e 3899 0x2eb680c,0x3b4ea3b,0x18ecc5a,0x03636fa },
wolfSSL 16:8e0d178b1d1e 3900 { 0x1a02709,0x26f8ff1,0x1fa8cba,0x397d6e8,0x230be68,0x043aa14,
wolfSSL 16:8e0d178b1d1e 3901 0x3d43cdf,0x25c17fa,0x3a3ee55,0x0380564 } },
wolfSSL 16:8e0d178b1d1e 3902 /* 232 */
wolfSSL 16:8e0d178b1d1e 3903 { { 0x275a0a6,0x16bd43a,0x0033d3e,0x2b15e16,0x2512226,0x005d901,
wolfSSL 16:8e0d178b1d1e 3904 0x26d50fd,0x3bc19bf,0x3b1aeb8,0x02bfb01 },
wolfSSL 16:8e0d178b1d1e 3905 { 0x0bb0a31,0x26559e0,0x1aae7fb,0x330dcc2,0x16f1af3,0x06afce2,
wolfSSL 16:8e0d178b1d1e 3906 0x13a15a0,0x2ff7645,0x3546e2d,0x029c6e4 } },
wolfSSL 16:8e0d178b1d1e 3907 /* 233 */
wolfSSL 16:8e0d178b1d1e 3908 { { 0x0f593d2,0x384b806,0x122bbf8,0x0a281e0,0x1d1a904,0x2e93cab,
wolfSSL 16:8e0d178b1d1e 3909 0x0505db0,0x08f6454,0x05c6285,0x014e880 },
wolfSSL 16:8e0d178b1d1e 3910 { 0x3f2b935,0x22d8e79,0x161a07c,0x16b060a,0x02bff97,0x146328b,
wolfSSL 16:8e0d178b1d1e 3911 0x3ceea77,0x238f61a,0x19b3d58,0x02fd1f4 } },
wolfSSL 16:8e0d178b1d1e 3912 /* 234 */
wolfSSL 16:8e0d178b1d1e 3913 { { 0x17665d5,0x259e9f7,0x0de5672,0x15cbcbd,0x34e3030,0x035240f,
wolfSSL 16:8e0d178b1d1e 3914 0x0005ae8,0x286d851,0x07f39c9,0x000070b },
wolfSSL 16:8e0d178b1d1e 3915 { 0x1efc6d6,0x2a0051a,0x2724143,0x2a9ef1e,0x0c810bd,0x1e05429,
wolfSSL 16:8e0d178b1d1e 3916 0x25670ba,0x2e66d7d,0x0e786ff,0x03f6b7e } },
wolfSSL 16:8e0d178b1d1e 3917 /* 235 */
wolfSSL 16:8e0d178b1d1e 3918 { { 0x3c00785,0x232e23f,0x2b67fd3,0x244ed23,0x077fa75,0x3cda3ef,
wolfSSL 16:8e0d178b1d1e 3919 0x14d055b,0x0f25011,0x24d5aa4,0x00ea0e3 },
wolfSSL 16:8e0d178b1d1e 3920 { 0x297bb9a,0x198ca4f,0x14d9561,0x18d1076,0x39eb933,0x2b6caa0,
wolfSSL 16:8e0d178b1d1e 3921 0x1591a60,0x0768d45,0x257873e,0x00f36e0 } },
wolfSSL 16:8e0d178b1d1e 3922 /* 236 */
wolfSSL 16:8e0d178b1d1e 3923 { { 0x1e77eab,0x0502a5f,0x0109137,0x0350592,0x3f7e1c5,0x3ac7437,
wolfSSL 16:8e0d178b1d1e 3924 0x2dcad2c,0x1fee9d8,0x089f1f5,0x0169833 },
wolfSSL 16:8e0d178b1d1e 3925 { 0x0d45673,0x0d8e090,0x065580b,0x065644f,0x11b82be,0x3592dd0,
wolfSSL 16:8e0d178b1d1e 3926 0x3284b8d,0x23f0015,0x16fdbfd,0x0248bfd } },
wolfSSL 16:8e0d178b1d1e 3927 /* 237 */
wolfSSL 16:8e0d178b1d1e 3928 { { 0x1a129a1,0x1977bb2,0x0e041b2,0x15f30a1,0x0a5b1ce,0x3afef8f,
wolfSSL 16:8e0d178b1d1e 3929 0x380c46c,0x3358810,0x27df6c5,0x01ca466 },
wolfSSL 16:8e0d178b1d1e 3930 { 0x3b90f9a,0x3d14ea3,0x031b298,0x02e2390,0x2d719c0,0x25bc615,
wolfSSL 16:8e0d178b1d1e 3931 0x2c0e777,0x0226b8c,0x3803624,0x0179e45 } },
wolfSSL 16:8e0d178b1d1e 3932 /* 238 */
wolfSSL 16:8e0d178b1d1e 3933 { { 0x363cdfb,0x1bb155f,0x24fd5c1,0x1c7c72b,0x28e6a35,0x18165f2,
wolfSSL 16:8e0d178b1d1e 3934 0x226bea5,0x0beaff3,0x371e24c,0x0138294 },
wolfSSL 16:8e0d178b1d1e 3935 { 0x1765357,0x29034e9,0x22b4276,0x11035ce,0x23c89af,0x074468c,
wolfSSL 16:8e0d178b1d1e 3936 0x3370ae4,0x013bae3,0x018d566,0x03d7fde } },
wolfSSL 16:8e0d178b1d1e 3937 /* 239 */
wolfSSL 16:8e0d178b1d1e 3938 { { 0x209df21,0x0f8ff86,0x0e47fbf,0x23b99ba,0x126d5d2,0x2722405,
wolfSSL 16:8e0d178b1d1e 3939 0x16bd0a2,0x1799082,0x0e9533f,0x039077c },
wolfSSL 16:8e0d178b1d1e 3940 { 0x3ba9e3f,0x3f6902c,0x1895305,0x3ac9813,0x3f2340c,0x3c0d9f1,
wolfSSL 16:8e0d178b1d1e 3941 0x26e1927,0x0557c21,0x16eac4f,0x023b75f } },
wolfSSL 16:8e0d178b1d1e 3942 /* 240 */
wolfSSL 16:8e0d178b1d1e 3943 { { 0x3fc8ff3,0x0770382,0x342fc9a,0x0afa4db,0x314efd8,0x328e07b,
wolfSSL 16:8e0d178b1d1e 3944 0x016f7cc,0x3ba599c,0x1caed8a,0x0050cb0 },
wolfSSL 16:8e0d178b1d1e 3945 { 0x0b23c26,0x2120a5c,0x3273ec6,0x1cc1cd6,0x2a64fe8,0x2bbc3d6,
wolfSSL 16:8e0d178b1d1e 3946 0x09f6e5e,0x34b1b8e,0x00b5ac8,0x032bbd2 } },
wolfSSL 16:8e0d178b1d1e 3947 /* 241 */
wolfSSL 16:8e0d178b1d1e 3948 { { 0x1315922,0x1725e1d,0x0ca5524,0x1c4c18f,0x3d82951,0x193bcb2,
wolfSSL 16:8e0d178b1d1e 3949 0x0e60d0b,0x388dbcf,0x37e8efa,0x0342e85 },
wolfSSL 16:8e0d178b1d1e 3950 { 0x1b3af60,0x26ba3ec,0x220e53a,0x394f4b6,0x01a796a,0x3e7bbca,
wolfSSL 16:8e0d178b1d1e 3951 0x163605d,0x2b85807,0x17c1c54,0x03cc725 } },
wolfSSL 16:8e0d178b1d1e 3952 /* 242 */
wolfSSL 16:8e0d178b1d1e 3953 { { 0x1cc4597,0x1635492,0x2028c0f,0x2c2eb82,0x2dc5015,0x0d2a052,
wolfSSL 16:8e0d178b1d1e 3954 0x05fc557,0x1f0ebbf,0x0cb96e1,0x0004d01 },
wolfSSL 16:8e0d178b1d1e 3955 { 0x1a824bf,0x3896172,0x2ed7b29,0x178007a,0x0d59318,0x07bda2b,
wolfSSL 16:8e0d178b1d1e 3956 0x2ee6826,0x0f9b235,0x04b9193,0x01bcddf } },
wolfSSL 16:8e0d178b1d1e 3957 /* 243 */
wolfSSL 16:8e0d178b1d1e 3958 { { 0x0333fd2,0x0eeb46a,0x15b89f9,0x00968aa,0x2a89302,0x2bdd6b3,
wolfSSL 16:8e0d178b1d1e 3959 0x1e5037e,0x2541884,0x24ed2d0,0x01b6e8f },
wolfSSL 16:8e0d178b1d1e 3960 { 0x04399cd,0x3be6334,0x3adea48,0x1bb9adc,0x31811c6,0x05fb2bc,
wolfSSL 16:8e0d178b1d1e 3961 0x360752c,0x3d29dcb,0x3423bec,0x03c4f3c } },
wolfSSL 16:8e0d178b1d1e 3962 /* 244 */
wolfSSL 16:8e0d178b1d1e 3963 { { 0x119e2eb,0x2e7b02a,0x0f68cee,0x257d8b0,0x183a9a1,0x2ae88a6,
wolfSSL 16:8e0d178b1d1e 3964 0x3a3bb67,0x2eb4f3e,0x1a9274b,0x0320fea },
wolfSSL 16:8e0d178b1d1e 3965 { 0x2fa1ce0,0x346c2d8,0x2fbf0d7,0x3d4d063,0x0e58b60,0x09c1bc1,
wolfSSL 16:8e0d178b1d1e 3966 0x28ef9e5,0x09a0efe,0x0f45d70,0x02d275c } },
wolfSSL 16:8e0d178b1d1e 3967 /* 245 */
wolfSSL 16:8e0d178b1d1e 3968 { { 0x2d5513b,0x31d443e,0x1e2d914,0x3b2c5d4,0x105f32e,0x27ee756,
wolfSSL 16:8e0d178b1d1e 3969 0x050418d,0x3c73db6,0x1bb0c30,0x01673eb },
wolfSSL 16:8e0d178b1d1e 3970 { 0x1cb7fd6,0x1eb08d5,0x26a3e16,0x2e20810,0x0249367,0x029e219,
wolfSSL 16:8e0d178b1d1e 3971 0x2ec58c9,0x12d9fab,0x362354a,0x016eafc } },
wolfSSL 16:8e0d178b1d1e 3972 /* 246 */
wolfSSL 16:8e0d178b1d1e 3973 { { 0x2424865,0x260747b,0x177f37c,0x1e3cb95,0x08b0028,0x2783016,
wolfSSL 16:8e0d178b1d1e 3974 0x2970f1b,0x323c1c0,0x2a79026,0x0186231 },
wolfSSL 16:8e0d178b1d1e 3975 { 0x0f244da,0x26866f4,0x087306f,0x173ec20,0x31ecced,0x3c84d8d,
wolfSSL 16:8e0d178b1d1e 3976 0x070f9b9,0x2e764d5,0x075df50,0x0264ff9 } },
wolfSSL 16:8e0d178b1d1e 3977 /* 247 */
wolfSSL 16:8e0d178b1d1e 3978 { { 0x32c3609,0x0c737e6,0x14ea68e,0x300b11b,0x184eb19,0x29dd440,
wolfSSL 16:8e0d178b1d1e 3979 0x09ec1a9,0x185adeb,0x0664c80,0x0207dd9 },
wolfSSL 16:8e0d178b1d1e 3980 { 0x1fbe978,0x30a969d,0x33561d7,0x34fc60e,0x36743fe,0x00774af,
wolfSSL 16:8e0d178b1d1e 3981 0x0d1f045,0x018360e,0x12a5fe9,0x01592a0 } },
wolfSSL 16:8e0d178b1d1e 3982 /* 248 */
wolfSSL 16:8e0d178b1d1e 3983 { { 0x2817d1d,0x2993d3e,0x2e0f7a5,0x112faa0,0x255f968,0x355fe6a,
wolfSSL 16:8e0d178b1d1e 3984 0x3f5a0fc,0x075b2d7,0x3cf00e5,0x0089afc },
wolfSSL 16:8e0d178b1d1e 3985 { 0x32833cf,0x06a7e4b,0x09a8d6d,0x1693d3e,0x320a0a3,0x3cfdfdd,
wolfSSL 16:8e0d178b1d1e 3986 0x136c498,0x1e0d845,0x347ff25,0x01a1de7 } },
wolfSSL 16:8e0d178b1d1e 3987 /* 249 */
wolfSSL 16:8e0d178b1d1e 3988 { { 0x3043d08,0x030705c,0x20fa79b,0x1d07f00,0x0a54467,0x29b49b4,
wolfSSL 16:8e0d178b1d1e 3989 0x367e289,0x0b82f4d,0x0d1eb09,0x025ef2c },
wolfSSL 16:8e0d178b1d1e 3990 { 0x32ed3c3,0x1baaa3c,0x3c482ab,0x146ca06,0x3c8a4f1,0x3e85e3c,
wolfSSL 16:8e0d178b1d1e 3991 0x1bf4f3b,0x1195534,0x3e80a78,0x02a1cbf } },
wolfSSL 16:8e0d178b1d1e 3992 /* 250 */
wolfSSL 16:8e0d178b1d1e 3993 { { 0x32b2086,0x2de4d68,0x3486b1a,0x03a0583,0x2e1eb71,0x2dab9af,
wolfSSL 16:8e0d178b1d1e 3994 0x10cd913,0x28daa6f,0x3fcb732,0x000a04a },
wolfSSL 16:8e0d178b1d1e 3995 { 0x3605318,0x3f5f2b3,0x2d1da63,0x143f7f5,0x1646e5d,0x040b586,
wolfSSL 16:8e0d178b1d1e 3996 0x1683982,0x25abe87,0x0c9fe53,0x001ce47 } },
wolfSSL 16:8e0d178b1d1e 3997 /* 251 */
wolfSSL 16:8e0d178b1d1e 3998 { { 0x380d02b,0x055fc22,0x3f7fc50,0x3458a1d,0x26b8333,0x23550ab,
wolfSSL 16:8e0d178b1d1e 3999 0x0a1af87,0x0a821eb,0x2dc7e6d,0x00d574a },
wolfSSL 16:8e0d178b1d1e 4000 { 0x07386e1,0x3ccd68a,0x3275b41,0x253e390,0x2fd272a,0x1e6627a,
wolfSSL 16:8e0d178b1d1e 4001 0x2ca2cde,0x0e9e4a1,0x1e37c2a,0x00f70ac } },
wolfSSL 16:8e0d178b1d1e 4002 /* 252 */
wolfSSL 16:8e0d178b1d1e 4003 { { 0x0581352,0x2748701,0x02bed68,0x094dd9e,0x30a00c8,0x3fb5c07,
wolfSSL 16:8e0d178b1d1e 4004 0x3bd5909,0x211ac80,0x1103ccd,0x0311e1a },
wolfSSL 16:8e0d178b1d1e 4005 { 0x0c768ed,0x29dc209,0x36575db,0x009a107,0x272feea,0x2b33383,
wolfSSL 16:8e0d178b1d1e 4006 0x313ed56,0x134c9cc,0x168d5bb,0x033310a } },
wolfSSL 16:8e0d178b1d1e 4007 /* 253 */
wolfSSL 16:8e0d178b1d1e 4008 { { 0x17620b9,0x143784f,0x256a94e,0x229664a,0x1d89a5c,0x1d521f2,
wolfSSL 16:8e0d178b1d1e 4009 0x0076406,0x1c73f70,0x342aa48,0x03851fa },
wolfSSL 16:8e0d178b1d1e 4010 { 0x0f3ae46,0x2ad3bab,0x0fbe274,0x3ed40d4,0x2fd4936,0x232103a,
wolfSSL 16:8e0d178b1d1e 4011 0x2afe474,0x25b8f7c,0x047080e,0x008e6b0 } },
wolfSSL 16:8e0d178b1d1e 4012 /* 254 */
wolfSSL 16:8e0d178b1d1e 4013 { { 0x3fee8d4,0x347cd4a,0x0fec481,0x33fe9ec,0x0ce80b5,0x33a6bcf,
wolfSSL 16:8e0d178b1d1e 4014 0x1c4c9e2,0x3967441,0x1a3f5f7,0x03157e8 },
wolfSSL 16:8e0d178b1d1e 4015 { 0x257c227,0x1bc53a0,0x200b318,0x0fcd0af,0x2c5b165,0x2a413ec,
wolfSSL 16:8e0d178b1d1e 4016 0x2fc998a,0x2da6426,0x19cd4f4,0x0025336 } },
wolfSSL 16:8e0d178b1d1e 4017 /* 255 */
wolfSSL 16:8e0d178b1d1e 4018 { { 0x303beba,0x2072135,0x32918a9,0x140cb3a,0x08631d1,0x0ef527b,
wolfSSL 16:8e0d178b1d1e 4019 0x05f2c9e,0x2b4ce91,0x0b642ab,0x02e428c },
wolfSSL 16:8e0d178b1d1e 4020 { 0x0a5abf9,0x15013ed,0x3603b46,0x30dd76d,0x3004750,0x28d7627,
wolfSSL 16:8e0d178b1d1e 4021 0x1a42ccc,0x093ddbe,0x39a1b79,0x00067e2 } },
wolfSSL 16:8e0d178b1d1e 4022 };
wolfSSL 16:8e0d178b1d1e 4023
wolfSSL 16:8e0d178b1d1e 4024 /* Multiply the base point of P256 by the scalar and return the result.
wolfSSL 16:8e0d178b1d1e 4025 * If map is true then convert result to affine co-ordinates.
wolfSSL 16:8e0d178b1d1e 4026 *
wolfSSL 16:8e0d178b1d1e 4027 * r Resulting point.
wolfSSL 16:8e0d178b1d1e 4028 * k Scalar to multiply by.
wolfSSL 16:8e0d178b1d1e 4029 * map Indicates whether to convert result to affine.
wolfSSL 16:8e0d178b1d1e 4030 * heap Heap to use for allocation.
wolfSSL 16:8e0d178b1d1e 4031 * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
wolfSSL 16:8e0d178b1d1e 4032 */
wolfSSL 16:8e0d178b1d1e 4033 static int sp_256_ecc_mulmod_base_10(sp_point* r, const sp_digit* k,
wolfSSL 16:8e0d178b1d1e 4034 int map, void* heap)
wolfSSL 16:8e0d178b1d1e 4035 {
wolfSSL 16:8e0d178b1d1e 4036 return sp_256_ecc_mulmod_stripe_10(r, &p256_base, p256_table,
wolfSSL 16:8e0d178b1d1e 4037 k, map, heap);
wolfSSL 16:8e0d178b1d1e 4038 }
wolfSSL 16:8e0d178b1d1e 4039
wolfSSL 16:8e0d178b1d1e 4040 #endif
wolfSSL 16:8e0d178b1d1e 4041
wolfSSL 16:8e0d178b1d1e 4042
wolfSSL 16:8e0d178b1d1e 4043 #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
wolfSSL 16:8e0d178b1d1e 4044 #endif
wolfSSL 16:8e0d178b1d1e 4045 #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
wolfSSL 16:8e0d178b1d1e 4046 /* Multiply a by scalar b into r. (r = a * b)
wolfSSL 16:8e0d178b1d1e 4047 *
wolfSSL 16:8e0d178b1d1e 4048 * r A single precision integer.
wolfSSL 16:8e0d178b1d1e 4049 * a A single precision integer.
wolfSSL 16:8e0d178b1d1e 4050 * b A scalar.
wolfSSL 16:8e0d178b1d1e 4051 */
wolfSSL 16:8e0d178b1d1e 4052 SP_NOINLINE static void sp_256_mul_d_10(sp_digit* r, const sp_digit* a,
wolfSSL 16:8e0d178b1d1e 4053 sp_digit b)
wolfSSL 16:8e0d178b1d1e 4054 {
wolfSSL 16:8e0d178b1d1e 4055 #ifdef WOLFSSL_SP_SMALL
wolfSSL 16:8e0d178b1d1e 4056 int64_t tb = b;
wolfSSL 16:8e0d178b1d1e 4057 int64_t t = 0;
wolfSSL 16:8e0d178b1d1e 4058 int i;
wolfSSL 16:8e0d178b1d1e 4059
wolfSSL 16:8e0d178b1d1e 4060 for (i = 0; i < 10; i++) {
wolfSSL 16:8e0d178b1d1e 4061 t += tb * a[i];
wolfSSL 16:8e0d178b1d1e 4062 r[i] = t & 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 4063 t >>= 26;
wolfSSL 16:8e0d178b1d1e 4064 }
wolfSSL 16:8e0d178b1d1e 4065 r[10] = (sp_digit)t;
wolfSSL 16:8e0d178b1d1e 4066 #else
wolfSSL 16:8e0d178b1d1e 4067 int64_t tb = b;
wolfSSL 16:8e0d178b1d1e 4068 int64_t t[10];
wolfSSL 16:8e0d178b1d1e 4069
wolfSSL 16:8e0d178b1d1e 4070 t[ 0] = Q6_P_mpy_RR(tb, a[0]);
wolfSSL 16:8e0d178b1d1e 4071 t[ 1] = Q6_P_mpy_RR(tb, a[1]);
wolfSSL 16:8e0d178b1d1e 4072 t[ 2] = Q6_P_mpy_RR(tb, a[2]);
wolfSSL 16:8e0d178b1d1e 4073 t[ 3] = Q6_P_mpy_RR(tb, a[3]);
wolfSSL 16:8e0d178b1d1e 4074 t[ 4] = Q6_P_mpy_RR(tb, a[4]);
wolfSSL 16:8e0d178b1d1e 4075 t[ 5] = Q6_P_mpy_RR(tb, a[5]);
wolfSSL 16:8e0d178b1d1e 4076 t[ 6] = Q6_P_mpy_RR(tb, a[6]);
wolfSSL 16:8e0d178b1d1e 4077 t[ 7] = Q6_P_mpy_RR(tb, a[7]);
wolfSSL 16:8e0d178b1d1e 4078 t[ 8] = Q6_P_mpy_RR(tb, a[8]);
wolfSSL 16:8e0d178b1d1e 4079 t[ 9] = Q6_P_mpy_RR(tb, a[9]);
wolfSSL 16:8e0d178b1d1e 4080 r[ 0] = Q6_R_and_RR(t[ 0], 0x3ffffff);
wolfSSL 16:8e0d178b1d1e 4081 r[ 1] = (sp_digit)(t[ 0] >> 26) + Q6_R_and_RR(t[ 1], 0x3ffffff);
wolfSSL 16:8e0d178b1d1e 4082 r[ 2] = (sp_digit)(t[ 1] >> 26) + Q6_R_and_RR(t[ 2], 0x3ffffff);
wolfSSL 16:8e0d178b1d1e 4083 r[ 3] = (sp_digit)(t[ 2] >> 26) + Q6_R_and_RR(t[ 3], 0x3ffffff);
wolfSSL 16:8e0d178b1d1e 4084 r[ 4] = (sp_digit)(t[ 3] >> 26) + Q6_R_and_RR(t[ 4], 0x3ffffff);
wolfSSL 16:8e0d178b1d1e 4085 r[ 5] = (sp_digit)(t[ 4] >> 26) + Q6_R_and_RR(t[ 5], 0x3ffffff);
wolfSSL 16:8e0d178b1d1e 4086 r[ 6] = (sp_digit)(t[ 5] >> 26) + Q6_R_and_RR(t[ 6], 0x3ffffff);
wolfSSL 16:8e0d178b1d1e 4087 r[ 7] = (sp_digit)(t[ 6] >> 26) + Q6_R_and_RR(t[ 7], 0x3ffffff);
wolfSSL 16:8e0d178b1d1e 4088 r[ 8] = (sp_digit)(t[ 7] >> 26) + Q6_R_and_RR(t[ 8], 0x3ffffff);
wolfSSL 16:8e0d178b1d1e 4089 r[ 9] = (sp_digit)(t[ 8] >> 26) + Q6_R_and_RR(t[ 9], 0x3ffffff);
wolfSSL 16:8e0d178b1d1e 4090 r[10] = (sp_digit)(t[ 9] >> 26);
wolfSSL 16:8e0d178b1d1e 4091 #endif /* WOLFSSL_SP_SMALL */
wolfSSL 16:8e0d178b1d1e 4092 }
wolfSSL 16:8e0d178b1d1e 4093
wolfSSL 16:8e0d178b1d1e 4094 #ifdef WOLFSSL_SP_DIV_32
wolfSSL 16:8e0d178b1d1e 4095 static WC_INLINE sp_digit sp_256_div_word_10(sp_digit d1, sp_digit d0,
wolfSSL 16:8e0d178b1d1e 4096 sp_digit dv)
wolfSSL 16:8e0d178b1d1e 4097 {
wolfSSL 16:8e0d178b1d1e 4098 sp_digit d, r, t, dv;
wolfSSL 16:8e0d178b1d1e 4099 int64_t t0, t1;
wolfSSL 16:8e0d178b1d1e 4100
wolfSSL 16:8e0d178b1d1e 4101 /* dv has 14 bits. */
wolfSSL 16:8e0d178b1d1e 4102 dv = (div >> 12) + 1;
wolfSSL 16:8e0d178b1d1e 4103 /* All 26 bits from d1 and top 5 bits from d0. */
wolfSSL 16:8e0d178b1d1e 4104 d = (d1 << 5) | (d0 >> 21);
wolfSSL 16:8e0d178b1d1e 4105 r = d / dv;
wolfSSL 16:8e0d178b1d1e 4106 d -= r * dv;
wolfSSL 16:8e0d178b1d1e 4107 /* Up to 17 bits in r */
wolfSSL 16:8e0d178b1d1e 4108 /* Next 9 bits from d0. */
wolfSSL 16:8e0d178b1d1e 4109 d <<= 9;
wolfSSL 16:8e0d178b1d1e 4110 r <<= 9;
wolfSSL 16:8e0d178b1d1e 4111 d |= (d0 >> 12) & ((1 << 9) - 1);
wolfSSL 16:8e0d178b1d1e 4112 t = d / dv;
wolfSSL 16:8e0d178b1d1e 4113 d -= t * dv;
wolfSSL 16:8e0d178b1d1e 4114 r += t;
wolfSSL 16:8e0d178b1d1e 4115 /* Up to 26 bits in r */
wolfSSL 16:8e0d178b1d1e 4116
wolfSSL 16:8e0d178b1d1e 4117 /* Handle rounding error with dv - top part */
wolfSSL 16:8e0d178b1d1e 4118 t0 = ((int64_t)d1 << 26) + d0;
wolfSSL 16:8e0d178b1d1e 4119 t1 = (int64_t)r * dv;
wolfSSL 16:8e0d178b1d1e 4120 t1 = t0 - t1;
wolfSSL 16:8e0d178b1d1e 4121 t = (sp_digit)(t1 >> 12) / dv;
wolfSSL 16:8e0d178b1d1e 4122 r += t;
wolfSSL 16:8e0d178b1d1e 4123
wolfSSL 16:8e0d178b1d1e 4124 /* Handle rounding error with dv - bottom 32 bits */
wolfSSL 16:8e0d178b1d1e 4125 t1 = (sp_digit)t0 - (r * dv);
wolfSSL 16:8e0d178b1d1e 4126 t = (sp_digit)t1 / dv;
wolfSSL 16:8e0d178b1d1e 4127 r += t;
wolfSSL 16:8e0d178b1d1e 4128
wolfSSL 16:8e0d178b1d1e 4129 return r;
wolfSSL 16:8e0d178b1d1e 4130 }
wolfSSL 16:8e0d178b1d1e 4131 #endif /* WOLFSSL_SP_DIV_32 */
wolfSSL 16:8e0d178b1d1e 4132
wolfSSL 16:8e0d178b1d1e 4133 /* Divide d in a and put remainder into r (m*d + r = a)
wolfSSL 16:8e0d178b1d1e 4134 * m is not calculated as it is not needed at this time.
wolfSSL 16:8e0d178b1d1e 4135 *
wolfSSL 16:8e0d178b1d1e 4136 * a Number to be divided.
wolfSSL 16:8e0d178b1d1e 4137 * d Number to divide with.
wolfSSL 16:8e0d178b1d1e 4138 * m Multiplier result.
wolfSSL 16:8e0d178b1d1e 4139 * r Remainder from the division.
wolfSSL 16:8e0d178b1d1e 4140 * returns MEMORY_E when unable to allocate memory and MP_OKAY otherwise.
wolfSSL 16:8e0d178b1d1e 4141 */
wolfSSL 16:8e0d178b1d1e 4142 static int sp_256_div_10(const sp_digit* a, const sp_digit* d, sp_digit* m,
wolfSSL 16:8e0d178b1d1e 4143 sp_digit* r)
wolfSSL 16:8e0d178b1d1e 4144 {
wolfSSL 16:8e0d178b1d1e 4145 int i;
wolfSSL 16:8e0d178b1d1e 4146 #ifndef WOLFSSL_SP_DIV_32
wolfSSL 16:8e0d178b1d1e 4147 int64_t d1;
wolfSSL 16:8e0d178b1d1e 4148 #endif
wolfSSL 16:8e0d178b1d1e 4149 sp_digit dv, r1;
wolfSSL 16:8e0d178b1d1e 4150 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)
wolfSSL 16:8e0d178b1d1e 4151 sp_digit* td;
wolfSSL 16:8e0d178b1d1e 4152 #else
wolfSSL 16:8e0d178b1d1e 4153 sp_digit t1d[20], t2d[10 + 1];
wolfSSL 16:8e0d178b1d1e 4154 #endif
wolfSSL 16:8e0d178b1d1e 4155 sp_digit* t1;
wolfSSL 16:8e0d178b1d1e 4156 sp_digit* t2;
wolfSSL 16:8e0d178b1d1e 4157 int err = MP_OKAY;
wolfSSL 16:8e0d178b1d1e 4158
wolfSSL 16:8e0d178b1d1e 4159 (void)m;
wolfSSL 16:8e0d178b1d1e 4160
wolfSSL 16:8e0d178b1d1e 4161 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)
wolfSSL 16:8e0d178b1d1e 4162 td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (3 * 10 + 1), NULL,
wolfSSL 16:8e0d178b1d1e 4163 DYNAMIC_TYPE_TMP_BUFFER);
wolfSSL 16:8e0d178b1d1e 4164 if (td == NULL) {
wolfSSL 16:8e0d178b1d1e 4165 err = MEMORY_E;
wolfSSL 16:8e0d178b1d1e 4166 }
wolfSSL 16:8e0d178b1d1e 4167 #endif
wolfSSL 16:8e0d178b1d1e 4168
wolfSSL 16:8e0d178b1d1e 4169 if (err == MP_OKAY) {
wolfSSL 16:8e0d178b1d1e 4170 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)
wolfSSL 16:8e0d178b1d1e 4171 t1 = td;
wolfSSL 16:8e0d178b1d1e 4172 t2 = td + 2 * 10;
wolfSSL 16:8e0d178b1d1e 4173 #else
wolfSSL 16:8e0d178b1d1e 4174 t1 = t1d;
wolfSSL 16:8e0d178b1d1e 4175 t2 = t2d;
wolfSSL 16:8e0d178b1d1e 4176 #endif
wolfSSL 16:8e0d178b1d1e 4177
wolfSSL 16:8e0d178b1d1e 4178 dv = d[9];
wolfSSL 16:8e0d178b1d1e 4179 XMEMCPY(t1, a, sizeof(*t1) * 2U * 10U);
wolfSSL 16:8e0d178b1d1e 4180 for (i=9; i>=0; i--) {
wolfSSL 16:8e0d178b1d1e 4181 t1[10 + i] += t1[10 + i - 1] >> 26;
wolfSSL 16:8e0d178b1d1e 4182 t1[10 + i - 1] = Q6_R_and_RR(t1[10 + i - 1], 0x3ffffff);
wolfSSL 16:8e0d178b1d1e 4183 #ifndef WOLFSSL_SP_DIV_32
wolfSSL 16:8e0d178b1d1e 4184 d1 = t1[10 + i];
wolfSSL 16:8e0d178b1d1e 4185 d1 <<= 26;
wolfSSL 16:8e0d178b1d1e 4186 d1 += t1[10 + i - 1];
wolfSSL 16:8e0d178b1d1e 4187 r1 = (sp_digit)(d1 / dv);
wolfSSL 16:8e0d178b1d1e 4188 #else
wolfSSL 16:8e0d178b1d1e 4189 r1 = sp_256_div_word_10(t1[10 + i], t1[10 + i - 1], dv);
wolfSSL 16:8e0d178b1d1e 4190 #endif
wolfSSL 16:8e0d178b1d1e 4191
wolfSSL 16:8e0d178b1d1e 4192 sp_256_mul_d_10(t2, d, r1);
wolfSSL 16:8e0d178b1d1e 4193 (void)sp_256_sub_10(&t1[i], &t1[i], t2);
wolfSSL 16:8e0d178b1d1e 4194 t1[10 + i] -= t2[10];
wolfSSL 16:8e0d178b1d1e 4195 t1[10 + i] += t1[10 + i - 1] >> 26;
wolfSSL 16:8e0d178b1d1e 4196 t1[10 + i - 1] = Q6_R_and_RR(t1[10 + i - 1], 0x3ffffff);
wolfSSL 16:8e0d178b1d1e 4197 r1 = (((-t1[10 + i]) << 26) - t1[10 + i - 1]) / dv;
wolfSSL 16:8e0d178b1d1e 4198 r1++;
wolfSSL 16:8e0d178b1d1e 4199 sp_256_mul_d_10(t2, d, r1);
wolfSSL 16:8e0d178b1d1e 4200 (void)sp_256_add_10(&t1[i], &t1[i], t2);
wolfSSL 16:8e0d178b1d1e 4201 t1[10 + i] += t1[10 + i - 1] >> 26;
wolfSSL 16:8e0d178b1d1e 4202 t1[10 + i - 1] = Q6_R_and_RR(t1[10 + i - 1], 0x3ffffff);
wolfSSL 16:8e0d178b1d1e 4203 }
wolfSSL 16:8e0d178b1d1e 4204 t1[10 - 1] += t1[10 - 2] >> 26;
wolfSSL 16:8e0d178b1d1e 4205 t1[10 - 2] &= 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 4206 d1 = t1[10 - 1];
wolfSSL 16:8e0d178b1d1e 4207 r1 = (sp_digit)(d1 / dv);
wolfSSL 16:8e0d178b1d1e 4208
wolfSSL 16:8e0d178b1d1e 4209 sp_256_mul_d_10(t2, d, r1);
wolfSSL 16:8e0d178b1d1e 4210 (void)sp_256_sub_10(t1, t1, t2);
wolfSSL 16:8e0d178b1d1e 4211 XMEMCPY(r, t1, sizeof(*r) * 2U * 10U);
wolfSSL 16:8e0d178b1d1e 4212 for (i=0; i<8; i++) {
wolfSSL 16:8e0d178b1d1e 4213 r[i+1] += r[i] >> 26;
wolfSSL 16:8e0d178b1d1e 4214 r[i] &= 0x3ffffff;
wolfSSL 16:8e0d178b1d1e 4215 }
wolfSSL 16:8e0d178b1d1e 4216 sp_256_cond_add_10(r, r, d, 0 - ((r[9] < 0) ?
wolfSSL 16:8e0d178b1d1e 4217 (sp_digit)1 : (sp_digit)0));
wolfSSL 16:8e0d178b1d1e 4218 }
wolfSSL 16:8e0d178b1d1e 4219
wolfSSL 16:8e0d178b1d1e 4220 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)
wolfSSL 16:8e0d178b1d1e 4221 if (td != NULL) {
wolfSSL 16:8e0d178b1d1e 4222 XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
wolfSSL 16:8e0d178b1d1e 4223 }
wolfSSL 16:8e0d178b1d1e 4224 #endif
wolfSSL 16:8e0d178b1d1e 4225
wolfSSL 16:8e0d178b1d1e 4226 return err;
wolfSSL 16:8e0d178b1d1e 4227 }
wolfSSL 16:8e0d178b1d1e 4228
wolfSSL 16:8e0d178b1d1e 4229 /* Reduce a modulo m into r. (r = a mod m)
wolfSSL 16:8e0d178b1d1e 4230 *
wolfSSL 16:8e0d178b1d1e 4231 * r A single precision number that is the reduced result.
wolfSSL 16:8e0d178b1d1e 4232 * a A single precision number that is to be reduced.
wolfSSL 16:8e0d178b1d1e 4233 * m A single precision number that is the modulus to reduce with.
wolfSSL 16:8e0d178b1d1e 4234 * returns MEMORY_E when unable to allocate memory and MP_OKAY otherwise.
wolfSSL 16:8e0d178b1d1e 4235 */
wolfSSL 16:8e0d178b1d1e 4236 static int sp_256_mod_10(sp_digit* r, const sp_digit* a, const sp_digit* m)
wolfSSL 16:8e0d178b1d1e 4237 {
wolfSSL 16:8e0d178b1d1e 4238 return sp_256_div_10(a, m, NULL, r);
wolfSSL 16:8e0d178b1d1e 4239 }
wolfSSL 16:8e0d178b1d1e 4240
wolfSSL 16:8e0d178b1d1e 4241 #endif
wolfSSL 16:8e0d178b1d1e 4242 #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
wolfSSL 16:8e0d178b1d1e 4243 #ifdef WOLFSSL_SP_SMALL
wolfSSL 16:8e0d178b1d1e 4244 /* Order-2 for the P256 curve. */
wolfSSL 16:8e0d178b1d1e 4245 static const uint32_t p256_order_2[8] = {
wolfSSL 16:8e0d178b1d1e 4246 0xfc63254fU,0xf3b9cac2U,0xa7179e84U,0xbce6faadU,0xffffffffU,0xffffffffU,
wolfSSL 16:8e0d178b1d1e 4247 0x00000000U,0xffffffffU
wolfSSL 16:8e0d178b1d1e 4248 };
wolfSSL 16:8e0d178b1d1e 4249 #else
wolfSSL 16:8e0d178b1d1e 4250 /* The low half of the order-2 of the P256 curve. */
wolfSSL 16:8e0d178b1d1e 4251 static const uint32_t p256_order_low[4] = {
wolfSSL 16:8e0d178b1d1e 4252 0xfc63254fU,0xf3b9cac2U,0xa7179e84U,0xbce6faadU
wolfSSL 16:8e0d178b1d1e 4253 };
wolfSSL 16:8e0d178b1d1e 4254 #endif /* WOLFSSL_SP_SMALL */
wolfSSL 16:8e0d178b1d1e 4255
wolfSSL 16:8e0d178b1d1e 4256 /* Multiply two number mod the order of P256 curve. (r = a * b mod order)
wolfSSL 16:8e0d178b1d1e 4257 *
wolfSSL 16:8e0d178b1d1e 4258 * r Result of the multiplication.
wolfSSL 16:8e0d178b1d1e 4259 * a First operand of the multiplication.
wolfSSL 16:8e0d178b1d1e 4260 * b Second operand of the multiplication.
wolfSSL 16:8e0d178b1d1e 4261 */
wolfSSL 16:8e0d178b1d1e 4262 static void sp_256_mont_mul_order_10(sp_digit* r, const sp_digit* a, const sp_digit* b)
wolfSSL 16:8e0d178b1d1e 4263 {
wolfSSL 16:8e0d178b1d1e 4264 sp_256_mul_10(r, a, b);
wolfSSL 16:8e0d178b1d1e 4265 sp_256_mont_reduce_order_10(r, p256_order, p256_mp_order);
wolfSSL 16:8e0d178b1d1e 4266 }
wolfSSL 16:8e0d178b1d1e 4267
wolfSSL 16:8e0d178b1d1e 4268 /* Square number mod the order of P256 curve. (r = a * a mod order)
wolfSSL 16:8e0d178b1d1e 4269 *
wolfSSL 16:8e0d178b1d1e 4270 * r Result of the squaring.
wolfSSL 16:8e0d178b1d1e 4271 * a Number to square.
wolfSSL 16:8e0d178b1d1e 4272 */
wolfSSL 16:8e0d178b1d1e 4273 static void sp_256_mont_sqr_order_10(sp_digit* r, const sp_digit* a)
wolfSSL 16:8e0d178b1d1e 4274 {
wolfSSL 16:8e0d178b1d1e 4275 sp_256_sqr_10(r, a);
wolfSSL 16:8e0d178b1d1e 4276 sp_256_mont_reduce_order_10(r, p256_order, p256_mp_order);
wolfSSL 16:8e0d178b1d1e 4277 }
wolfSSL 16:8e0d178b1d1e 4278
wolfSSL 16:8e0d178b1d1e 4279 #ifndef WOLFSSL_SP_SMALL
wolfSSL 16:8e0d178b1d1e 4280 /* Square number mod the order of P256 curve a number of times.
wolfSSL 16:8e0d178b1d1e 4281 * (r = a ^ n mod order)
wolfSSL 16:8e0d178b1d1e 4282 *
wolfSSL 16:8e0d178b1d1e 4283 * r Result of the squaring.
wolfSSL 16:8e0d178b1d1e 4284 * a Number to square.
wolfSSL 16:8e0d178b1d1e 4285 */
wolfSSL 16:8e0d178b1d1e 4286 static void sp_256_mont_sqr_n_order_10(sp_digit* r, const sp_digit* a, int n)
wolfSSL 16:8e0d178b1d1e 4287 {
wolfSSL 16:8e0d178b1d1e 4288 int i;
wolfSSL 16:8e0d178b1d1e 4289
wolfSSL 16:8e0d178b1d1e 4290 sp_256_mont_sqr_order_10(r, a);
wolfSSL 16:8e0d178b1d1e 4291 for (i=1; i<n; i++) {
wolfSSL 16:8e0d178b1d1e 4292 sp_256_mont_sqr_order_10(r, r);
wolfSSL 16:8e0d178b1d1e 4293 }
wolfSSL 16:8e0d178b1d1e 4294 }
wolfSSL 16:8e0d178b1d1e 4295 #endif /* !WOLFSSL_SP_SMALL */
wolfSSL 16:8e0d178b1d1e 4296
wolfSSL 16:8e0d178b1d1e 4297 /* Invert the number, in Montgomery form, modulo the order of the P256 curve.
wolfSSL 16:8e0d178b1d1e 4298 * (r = 1 / a mod order)
wolfSSL 16:8e0d178b1d1e 4299 *
wolfSSL 16:8e0d178b1d1e 4300 * r Inverse result.
wolfSSL 16:8e0d178b1d1e 4301 * a Number to invert.
wolfSSL 16:8e0d178b1d1e 4302 * td Temporary data.
wolfSSL 16:8e0d178b1d1e 4303 */
wolfSSL 16:8e0d178b1d1e 4304 static void sp_256_mont_inv_order_10(sp_digit* r, const sp_digit* a,
wolfSSL 16:8e0d178b1d1e 4305 sp_digit* td)
wolfSSL 16:8e0d178b1d1e 4306 {
wolfSSL 16:8e0d178b1d1e 4307 #ifdef WOLFSSL_SP_SMALL
wolfSSL 16:8e0d178b1d1e 4308 sp_digit* t = td;
wolfSSL 16:8e0d178b1d1e 4309 int i;
wolfSSL 16:8e0d178b1d1e 4310
wolfSSL 16:8e0d178b1d1e 4311 XMEMCPY(t, a, sizeof(sp_digit) * 10);
wolfSSL 16:8e0d178b1d1e 4312 for (i=254; i>=0; i--) {
wolfSSL 16:8e0d178b1d1e 4313 sp_256_mont_sqr_order_10(t, t);
wolfSSL 16:8e0d178b1d1e 4314 if ((p256_order_2[i / 32] & ((sp_int_digit)1 << (i % 32))) != 0) {
wolfSSL 16:8e0d178b1d1e 4315 sp_256_mont_mul_order_10(t, t, a);
wolfSSL 16:8e0d178b1d1e 4316 }
wolfSSL 16:8e0d178b1d1e 4317 }
wolfSSL 16:8e0d178b1d1e 4318 XMEMCPY(r, t, sizeof(sp_digit) * 10U);
wolfSSL 16:8e0d178b1d1e 4319 #else
wolfSSL 16:8e0d178b1d1e 4320 sp_digit* t = td;
wolfSSL 16:8e0d178b1d1e 4321 sp_digit* t2 = td + 2 * 10;
wolfSSL 16:8e0d178b1d1e 4322 sp_digit* t3 = td + 4 * 10;
wolfSSL 16:8e0d178b1d1e 4323 int i;
wolfSSL 16:8e0d178b1d1e 4324
wolfSSL 16:8e0d178b1d1e 4325
wolfSSL 16:8e0d178b1d1e 4326 /* t = a^2 */
wolfSSL 16:8e0d178b1d1e 4327 sp_256_mont_sqr_order_10(t, a);
wolfSSL 16:8e0d178b1d1e 4328 /* t = a^3 = t * a */
wolfSSL 16:8e0d178b1d1e 4329 sp_256_mont_mul_order_10(t, t, a);
wolfSSL 16:8e0d178b1d1e 4330 /* t2= a^c = t ^ 2 ^ 2 */
wolfSSL 16:8e0d178b1d1e 4331 sp_256_mont_sqr_n_order_10(t2, t, 2);
wolfSSL 16:8e0d178b1d1e 4332 /* t3= a^f = t2 * t */
wolfSSL 16:8e0d178b1d1e 4333 sp_256_mont_mul_order_10(t3, t2, t);
wolfSSL 16:8e0d178b1d1e 4334 /* t2= a^f0 = t3 ^ 2 ^ 4 */
wolfSSL 16:8e0d178b1d1e 4335 sp_256_mont_sqr_n_order_10(t2, t3, 4);
wolfSSL 16:8e0d178b1d1e 4336 /* t = a^ff = t2 * t3 */
wolfSSL 16:8e0d178b1d1e 4337 sp_256_mont_mul_order_10(t, t2, t3);
wolfSSL 16:8e0d178b1d1e 4338 /* t3= a^ff00 = t ^ 2 ^ 8 */
wolfSSL 16:8e0d178b1d1e 4339 sp_256_mont_sqr_n_order_10(t2, t, 8);
wolfSSL 16:8e0d178b1d1e 4340 /* t = a^ffff = t2 * t */
wolfSSL 16:8e0d178b1d1e 4341 sp_256_mont_mul_order_10(t, t2, t);
wolfSSL 16:8e0d178b1d1e 4342 /* t2= a^ffff0000 = t ^ 2 ^ 16 */
wolfSSL 16:8e0d178b1d1e 4343 sp_256_mont_sqr_n_order_10(t2, t, 16);
wolfSSL 16:8e0d178b1d1e 4344 /* t = a^ffffffff = t2 * t */
wolfSSL 16:8e0d178b1d1e 4345 sp_256_mont_mul_order_10(t, t2, t);
wolfSSL 16:8e0d178b1d1e 4346 /* t2= a^ffffffff0000000000000000 = t ^ 2 ^ 64 */
wolfSSL 16:8e0d178b1d1e 4347 sp_256_mont_sqr_n_order_10(t2, t, 64);
wolfSSL 16:8e0d178b1d1e 4348 /* t2= a^ffffffff00000000ffffffff = t2 * t */
wolfSSL 16:8e0d178b1d1e 4349 sp_256_mont_mul_order_10(t2, t2, t);
wolfSSL 16:8e0d178b1d1e 4350 /* t2= a^ffffffff00000000ffffffff00000000 = t2 ^ 2 ^ 32 */
wolfSSL 16:8e0d178b1d1e 4351 sp_256_mont_sqr_n_order_10(t2, t2, 32);
wolfSSL 16:8e0d178b1d1e 4352 /* t2= a^ffffffff00000000ffffffffffffffff = t2 * t */
wolfSSL 16:8e0d178b1d1e 4353 sp_256_mont_mul_order_10(t2, t2, t);
wolfSSL 16:8e0d178b1d1e 4354 /* t2= a^ffffffff00000000ffffffffffffffffbce6 */
wolfSSL 16:8e0d178b1d1e 4355
wolfSSL 16:8e0d178b1d1e 4356 for (i=127; i>=112; i--) {
wolfSSL 16:8e0d178b1d1e 4357 sp_256_mont_sqr_order_10(t2, t2);
wolfSSL 16:8e0d178b1d1e 4358 if (((sp_digit)p256_order_low[i / 32] & ((sp_int_digit)1 << (i % 32))) != 0) {
wolfSSL 16:8e0d178b1d1e 4359 sp_256_mont_mul_order_10(t2, t2, a);
wolfSSL 16:8e0d178b1d1e 4360 }
wolfSSL 16:8e0d178b1d1e 4361 }
wolfSSL 16:8e0d178b1d1e 4362 /* t2= a^ffffffff00000000ffffffffffffffffbce6f */
wolfSSL 16:8e0d178b1d1e 4363 sp_256_mont_sqr_n_order_10(t2, t2, 4);
wolfSSL 16:8e0d178b1d1e 4364 sp_256_mont_mul_order_10(t2, t2, t3);
wolfSSL 16:8e0d178b1d1e 4365 /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84 */
wolfSSL 16:8e0d178b1d1e 4366 for (i=107; i>=64; i--) {
wolfSSL 16:8e0d178b1d1e 4367 sp_256_mont_sqr_order_10(t2, t2);
wolfSSL 16:8e0d178b1d1e 4368 if (((sp_digit)p256_order_low[i / 32] & ((sp_int_digit)1 << (i % 32))) != 0) {
wolfSSL 16:8e0d178b1d1e 4369 sp_256_mont_mul_order_10(t2, t2, a);
wolfSSL 16:8e0d178b1d1e 4370 }
wolfSSL 16:8e0d178b1d1e 4371 }
wolfSSL 16:8e0d178b1d1e 4372 /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84f */
wolfSSL 16:8e0d178b1d1e 4373 sp_256_mont_sqr_n_order_10(t2, t2, 4);
wolfSSL 16:8e0d178b1d1e 4374 sp_256_mont_mul_order_10(t2, t2, t3);
wolfSSL 16:8e0d178b1d1e 4375 /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2 */
wolfSSL 16:8e0d178b1d1e 4376 for (i=59; i>=32; i--) {
wolfSSL 16:8e0d178b1d1e 4377 sp_256_mont_sqr_order_10(t2, t2);
wolfSSL 16:8e0d178b1d1e 4378 if (((sp_digit)p256_order_low[i / 32] & ((sp_int_digit)1 << (i % 32))) != 0) {
wolfSSL 16:8e0d178b1d1e 4379 sp_256_mont_mul_order_10(t2, t2, a);
wolfSSL 16:8e0d178b1d1e 4380 }
wolfSSL 16:8e0d178b1d1e 4381 }
wolfSSL 16:8e0d178b1d1e 4382 /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2f */
wolfSSL 16:8e0d178b1d1e 4383 sp_256_mont_sqr_n_order_10(t2, t2, 4);
wolfSSL 16:8e0d178b1d1e 4384 sp_256_mont_mul_order_10(t2, t2, t3);
wolfSSL 16:8e0d178b1d1e 4385 /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254 */
wolfSSL 16:8e0d178b1d1e 4386 for (i=27; i>=0; i--) {
wolfSSL 16:8e0d178b1d1e 4387 sp_256_mont_sqr_order_10(t2, t2);
wolfSSL 16:8e0d178b1d1e 4388 if (((sp_digit)p256_order_low[i / 32] & ((sp_int_digit)1 << (i % 32))) != 0) {
wolfSSL 16:8e0d178b1d1e 4389 sp_256_mont_mul_order_10(t2, t2, a);
wolfSSL 16:8e0d178b1d1e 4390 }
wolfSSL 16:8e0d178b1d1e 4391 }
wolfSSL 16:8e0d178b1d1e 4392 /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632540 */
wolfSSL 16:8e0d178b1d1e 4393 sp_256_mont_sqr_n_order_10(t2, t2, 4);
wolfSSL 16:8e0d178b1d1e 4394 /* r = a^ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f */
wolfSSL 16:8e0d178b1d1e 4395 sp_256_mont_mul_order_10(r, t2, t3);
wolfSSL 16:8e0d178b1d1e 4396 #endif /* WOLFSSL_SP_SMALL */
wolfSSL 16:8e0d178b1d1e 4397 }
wolfSSL 16:8e0d178b1d1e 4398
wolfSSL 16:8e0d178b1d1e 4399 #endif /* HAVE_ECC_SIGN || HAVE_ECC_VERIFY */
wolfSSL 16:8e0d178b1d1e 4400
wolfSSL 16:8e0d178b1d1e 4401 #ifdef HAVE_ECC_VERIFY
wolfSSL 16:8e0d178b1d1e 4402
wolfSSL 16:8e0d178b1d1e 4403
wolfSSL 16:8e0d178b1d1e 4404 /* Verify the signature values with the hash and public key.
wolfSSL 16:8e0d178b1d1e 4405 * e = Truncate(hash, 256)
wolfSSL 16:8e0d178b1d1e 4406 * u1 = e/s mod order
wolfSSL 16:8e0d178b1d1e 4407 * u2 = r/s mod order
wolfSSL 16:8e0d178b1d1e 4408 * r == (u1.G + u2.Q)->x mod order
wolfSSL 16:8e0d178b1d1e 4409 * Optimization: Leave point in projective form.
wolfSSL 16:8e0d178b1d1e 4410 * (x, y, 1) == (x' / z'*z', y' / z'*z'*z', z' / z')
wolfSSL 16:8e0d178b1d1e 4411 * (r + n*order).z'.z' mod prime == (u1.G + u2.Q)->x'
wolfSSL 16:8e0d178b1d1e 4412 * The hash is truncated to the first 256 bits.
wolfSSL 16:8e0d178b1d1e 4413 *
wolfSSL 16:8e0d178b1d1e 4414 * hash Hash to sign.
wolfSSL 16:8e0d178b1d1e 4415 * hashLen Length of the hash data.
wolfSSL 16:8e0d178b1d1e 4416 * rng Random number generator.
wolfSSL 16:8e0d178b1d1e 4417 * priv Private part of key - scalar.
wolfSSL 16:8e0d178b1d1e 4418 * rm First part of result as an mp_int.
wolfSSL 16:8e0d178b1d1e 4419 * sm Sirst part of result as an mp_int.
wolfSSL 16:8e0d178b1d1e 4420 * heap Heap to use for allocation.
wolfSSL 16:8e0d178b1d1e 4421 * returns RNG failures, MEMORY_E when memory allocation fails and
wolfSSL 16:8e0d178b1d1e 4422 * MP_OKAY on success.
wolfSSL 16:8e0d178b1d1e 4423 */
wolfSSL 16:8e0d178b1d1e 4424 int wolfSSL_DSP_ECC_Verify_256(remote_handle64 h, int32 *u1, int hashLen, int32* r, int rSz, int32* s, int sSz,
wolfSSL 16:8e0d178b1d1e 4425 int32* x, int xSz, int32* y, int ySz, int32* z, int zSz, int* res)
wolfSSL 16:8e0d178b1d1e 4426 {
wolfSSL 16:8e0d178b1d1e 4427 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)
wolfSSL 16:8e0d178b1d1e 4428 sp_digit* d = NULL;
wolfSSL 16:8e0d178b1d1e 4429 #else
wolfSSL 16:8e0d178b1d1e 4430 sp_digit u2d[2*10] __attribute__((aligned(128)));
wolfSSL 16:8e0d178b1d1e 4431 sp_digit tmpd[2*10 * 5] __attribute__((aligned(128)));
wolfSSL 16:8e0d178b1d1e 4432 sp_point p1d;
wolfSSL 16:8e0d178b1d1e 4433 sp_point p2d;
wolfSSL 16:8e0d178b1d1e 4434 #endif
wolfSSL 16:8e0d178b1d1e 4435 sp_digit* u2 = NULL;
wolfSSL 16:8e0d178b1d1e 4436 sp_digit* tmp = NULL;
wolfSSL 16:8e0d178b1d1e 4437 sp_point* p1;
wolfSSL 16:8e0d178b1d1e 4438 sp_point* p2 = NULL;
wolfSSL 16:8e0d178b1d1e 4439 sp_digit carry;
wolfSSL 16:8e0d178b1d1e 4440 int32_t c;
wolfSSL 16:8e0d178b1d1e 4441 int err;
wolfSSL 16:8e0d178b1d1e 4442 void* heap = NULL;
wolfSSL 16:8e0d178b1d1e 4443
wolfSSL 16:8e0d178b1d1e 4444 (void)h;
wolfSSL 16:8e0d178b1d1e 4445 (void)hashLen;
wolfSSL 16:8e0d178b1d1e 4446
wolfSSL 16:8e0d178b1d1e 4447 err = sp_ecc_point_new(heap, p1d, p1);
wolfSSL 16:8e0d178b1d1e 4448 if (err == MP_OKAY) {
wolfSSL 16:8e0d178b1d1e 4449 err = sp_ecc_point_new(heap, p2d, p2);
wolfSSL 16:8e0d178b1d1e 4450 }
wolfSSL 16:8e0d178b1d1e 4451
wolfSSL 16:8e0d178b1d1e 4452 if (err == MP_OKAY) {
wolfSSL 16:8e0d178b1d1e 4453 u2 = u2d;
wolfSSL 16:8e0d178b1d1e 4454 tmp = tmpd;
wolfSSL 16:8e0d178b1d1e 4455
wolfSSL 16:8e0d178b1d1e 4456 XMEMCPY(u2, r, 40);
wolfSSL 16:8e0d178b1d1e 4457 XMEMCPY(p2->x, x, 40);
wolfSSL 16:8e0d178b1d1e 4458 XMEMCPY(p2->y, y, 40);
wolfSSL 16:8e0d178b1d1e 4459 XMEMCPY(p2->z, z, 40);
wolfSSL 16:8e0d178b1d1e 4460
wolfSSL 16:8e0d178b1d1e 4461 sp_256_mul_10(s, s, p256_norm_order);
wolfSSL 16:8e0d178b1d1e 4462 err = sp_256_mod_10(s, s, p256_order);
wolfSSL 16:8e0d178b1d1e 4463 }
wolfSSL 16:8e0d178b1d1e 4464 if (err == MP_OKAY) {
wolfSSL 16:8e0d178b1d1e 4465 sp_256_norm_10(s);
wolfSSL 16:8e0d178b1d1e 4466 {
wolfSSL 16:8e0d178b1d1e 4467
wolfSSL 16:8e0d178b1d1e 4468 sp_256_mont_inv_order_10(s, s, tmp);
wolfSSL 16:8e0d178b1d1e 4469 sp_256_mont_mul_order_10(u1, u1, s);
wolfSSL 16:8e0d178b1d1e 4470 sp_256_mont_mul_order_10(u2, u2, s);
wolfSSL 16:8e0d178b1d1e 4471 }
wolfSSL 16:8e0d178b1d1e 4472
wolfSSL 16:8e0d178b1d1e 4473 err = sp_256_ecc_mulmod_base_10(p1, u1, 0, heap);
wolfSSL 16:8e0d178b1d1e 4474 }
wolfSSL 16:8e0d178b1d1e 4475 if (err == MP_OKAY) {
wolfSSL 16:8e0d178b1d1e 4476 err = sp_256_ecc_mulmod_10(p2, p2, u2, 0, heap);
wolfSSL 16:8e0d178b1d1e 4477 }
wolfSSL 16:8e0d178b1d1e 4478
wolfSSL 16:8e0d178b1d1e 4479 if (err == MP_OKAY) {
wolfSSL 16:8e0d178b1d1e 4480 sp_256_proj_point_add_10(p1, p1, p2, tmp);
wolfSSL 16:8e0d178b1d1e 4481
wolfSSL 16:8e0d178b1d1e 4482 /* (r + n*order).z'.z' mod prime == (u1.G + u2.Q)->x' */
wolfSSL 16:8e0d178b1d1e 4483 /* Reload r and convert to Montgomery form. */
wolfSSL 16:8e0d178b1d1e 4484 XMEMCPY(u2, r, 40);
wolfSSL 16:8e0d178b1d1e 4485 err = sp_256_mod_mul_norm_10(u2, u2, p256_mod);
wolfSSL 16:8e0d178b1d1e 4486 }
wolfSSL 16:8e0d178b1d1e 4487
wolfSSL 16:8e0d178b1d1e 4488 if (err == MP_OKAY) {
wolfSSL 16:8e0d178b1d1e 4489 /* u1 = r.z'.z' mod prime */
wolfSSL 16:8e0d178b1d1e 4490 sp_256_mont_sqr_10(p1->z, p1->z, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 4491 sp_256_mont_mul_10(u1, u2, p1->z, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 4492 *res = (int)(sp_256_cmp_10(p1->x, u1) == 0);
wolfSSL 16:8e0d178b1d1e 4493 if (*res == 0) {
wolfSSL 16:8e0d178b1d1e 4494 /* Reload r and add order. */
wolfSSL 16:8e0d178b1d1e 4495 XMEMCPY(u2, r, 40);
wolfSSL 16:8e0d178b1d1e 4496 carry = sp_256_add_10(u2, u2, p256_order);
wolfSSL 16:8e0d178b1d1e 4497 /* Carry means result is greater than mod and is not valid. */
wolfSSL 16:8e0d178b1d1e 4498 if (carry == 0) {
wolfSSL 16:8e0d178b1d1e 4499 sp_256_norm_10(u2);
wolfSSL 16:8e0d178b1d1e 4500
wolfSSL 16:8e0d178b1d1e 4501 /* Compare with mod and if greater or equal then not valid. */
wolfSSL 16:8e0d178b1d1e 4502 c = sp_256_cmp_10(u2, p256_mod);
wolfSSL 16:8e0d178b1d1e 4503 if (c < 0) {
wolfSSL 16:8e0d178b1d1e 4504 /* Convert to Montogomery form */
wolfSSL 16:8e0d178b1d1e 4505 err = sp_256_mod_mul_norm_10(u2, u2, p256_mod);
wolfSSL 16:8e0d178b1d1e 4506 if (err == MP_OKAY) {
wolfSSL 16:8e0d178b1d1e 4507 /* u1 = (r + 1*order).z'.z' mod prime */
wolfSSL 16:8e0d178b1d1e 4508 sp_256_mont_mul_10(u1, u2, p1->z, p256_mod,
wolfSSL 16:8e0d178b1d1e 4509 p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 4510 *res = (int)(sp_256_cmp_10(p1->x, u2) == 0);
wolfSSL 16:8e0d178b1d1e 4511 }
wolfSSL 16:8e0d178b1d1e 4512 }
wolfSSL 16:8e0d178b1d1e 4513 }
wolfSSL 16:8e0d178b1d1e 4514 }
wolfSSL 16:8e0d178b1d1e 4515 }
wolfSSL 16:8e0d178b1d1e 4516
wolfSSL 16:8e0d178b1d1e 4517 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)
wolfSSL 16:8e0d178b1d1e 4518 if (d != NULL)
wolfSSL 16:8e0d178b1d1e 4519 XFREE(d, heap, DYNAMIC_TYPE_ECC);
wolfSSL 16:8e0d178b1d1e 4520 #endif
wolfSSL 16:8e0d178b1d1e 4521 sp_ecc_point_free(p1, 0, heap);
wolfSSL 16:8e0d178b1d1e 4522 sp_ecc_point_free(p2, 0, heap);
wolfSSL 16:8e0d178b1d1e 4523
wolfSSL 16:8e0d178b1d1e 4524 return err;
wolfSSL 16:8e0d178b1d1e 4525 }
wolfSSL 16:8e0d178b1d1e 4526
wolfSSL 16:8e0d178b1d1e 4527 /** Free the Fixed Point cache */
wolfSSL 16:8e0d178b1d1e 4528 void wc_ecc_fp_free(void)
wolfSSL 16:8e0d178b1d1e 4529 {
wolfSSL 16:8e0d178b1d1e 4530 }
wolfSSL 16:8e0d178b1d1e 4531
wolfSSL 16:8e0d178b1d1e 4532
wolfSSL 16:8e0d178b1d1e 4533 AEEResult wolfSSL_open(const char *uri, remote_handle64 *handle)
wolfSSL 16:8e0d178b1d1e 4534 {
wolfSSL 16:8e0d178b1d1e 4535 void *tptr;
wolfSSL 16:8e0d178b1d1e 4536 /* can be any value or ignored, rpc layer doesn't care
wolfSSL 16:8e0d178b1d1e 4537 * also ok
wolfSSL 16:8e0d178b1d1e 4538 * *handle = 0;
wolfSSL 16:8e0d178b1d1e 4539 * *handle = 0xdeadc0de;
wolfSSL 16:8e0d178b1d1e 4540 */
wolfSSL 16:8e0d178b1d1e 4541 tptr = (void *)malloc(1);
wolfSSL 16:8e0d178b1d1e 4542 *handle = (remote_handle64)tptr;
wolfSSL 16:8e0d178b1d1e 4543 return 0;
wolfSSL 16:8e0d178b1d1e 4544 }
wolfSSL 16:8e0d178b1d1e 4545
wolfSSL 16:8e0d178b1d1e 4546 AEEResult wolfSSL_close(remote_handle64 handle)
wolfSSL 16:8e0d178b1d1e 4547 {
wolfSSL 16:8e0d178b1d1e 4548 if (handle)
wolfSSL 16:8e0d178b1d1e 4549 free((void*)handle);
wolfSSL 16:8e0d178b1d1e 4550 return 0;
wolfSSL 16:8e0d178b1d1e 4551 }
wolfSSL 16:8e0d178b1d1e 4552 #endif /* HAVE_ECC_VERIFY */
wolfSSL 16:8e0d178b1d1e 4553
wolfSSL 16:8e0d178b1d1e 4554 #ifdef WOLFSSL_PUBLIC_ECC_ADD_DBL
wolfSSL 16:8e0d178b1d1e 4555 /* Add two projective EC points together.
wolfSSL 16:8e0d178b1d1e 4556 * (pX, pY, pZ) + (qX, qY, qZ) = (rX, rY, rZ)
wolfSSL 16:8e0d178b1d1e 4557 *
wolfSSL 16:8e0d178b1d1e 4558 * pX First EC point's X ordinate.
wolfSSL 16:8e0d178b1d1e 4559 * pY First EC point's Y ordinate.
wolfSSL 16:8e0d178b1d1e 4560 * pZ First EC point's Z ordinate.
wolfSSL 16:8e0d178b1d1e 4561 * qX Second EC point's X ordinate.
wolfSSL 16:8e0d178b1d1e 4562 * qY Second EC point's Y ordinate.
wolfSSL 16:8e0d178b1d1e 4563 * qZ Second EC point's Z ordinate.
wolfSSL 16:8e0d178b1d1e 4564 * rX Resultant EC point's X ordinate.
wolfSSL 16:8e0d178b1d1e 4565 * rY Resultant EC point's Y ordinate.
wolfSSL 16:8e0d178b1d1e 4566 * rZ Resultant EC point's Z ordinate.
wolfSSL 16:8e0d178b1d1e 4567 * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
wolfSSL 16:8e0d178b1d1e 4568 */
wolfSSL 16:8e0d178b1d1e 4569 int sp_ecc_proj_add_point_256(mp_int* pX, mp_int* pY, mp_int* pZ,
wolfSSL 16:8e0d178b1d1e 4570 mp_int* qX, mp_int* qY, mp_int* qZ,
wolfSSL 16:8e0d178b1d1e 4571 mp_int* rX, mp_int* rY, mp_int* rZ)
wolfSSL 16:8e0d178b1d1e 4572 {
wolfSSL 16:8e0d178b1d1e 4573 #if !defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SMALL_STACK)
wolfSSL 16:8e0d178b1d1e 4574 sp_digit tmpd[2 * 10 * 5];
wolfSSL 16:8e0d178b1d1e 4575 sp_point pd;
wolfSSL 16:8e0d178b1d1e 4576 sp_point qd;
wolfSSL 16:8e0d178b1d1e 4577 #endif
wolfSSL 16:8e0d178b1d1e 4578 sp_digit* tmp;
wolfSSL 16:8e0d178b1d1e 4579 sp_point* p;
wolfSSL 16:8e0d178b1d1e 4580 sp_point* q = NULL;
wolfSSL 16:8e0d178b1d1e 4581 int err;
wolfSSL 16:8e0d178b1d1e 4582
wolfSSL 16:8e0d178b1d1e 4583 err = sp_ecc_point_new(NULL, pd, p);
wolfSSL 16:8e0d178b1d1e 4584 if (err == MP_OKAY) {
wolfSSL 16:8e0d178b1d1e 4585 err = sp_ecc_point_new(NULL, qd, q);
wolfSSL 16:8e0d178b1d1e 4586 }
wolfSSL 16:8e0d178b1d1e 4587 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)
wolfSSL 16:8e0d178b1d1e 4588 if (err == MP_OKAY) {
wolfSSL 16:8e0d178b1d1e 4589 tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 10 * 5, NULL,
wolfSSL 16:8e0d178b1d1e 4590 DYNAMIC_TYPE_ECC);
wolfSSL 16:8e0d178b1d1e 4591 if (tmp == NULL) {
wolfSSL 16:8e0d178b1d1e 4592 err = MEMORY_E;
wolfSSL 16:8e0d178b1d1e 4593 }
wolfSSL 16:8e0d178b1d1e 4594 }
wolfSSL 16:8e0d178b1d1e 4595 #else
wolfSSL 16:8e0d178b1d1e 4596 tmp = tmpd;
wolfSSL 16:8e0d178b1d1e 4597 #endif
wolfSSL 16:8e0d178b1d1e 4598
wolfSSL 16:8e0d178b1d1e 4599 if (err == MP_OKAY) {
wolfSSL 16:8e0d178b1d1e 4600 sp_256_from_mp(p->x, 10, pX);
wolfSSL 16:8e0d178b1d1e 4601 sp_256_from_mp(p->y, 10, pY);
wolfSSL 16:8e0d178b1d1e 4602 sp_256_from_mp(p->z, 10, pZ);
wolfSSL 16:8e0d178b1d1e 4603 sp_256_from_mp(q->x, 10, qX);
wolfSSL 16:8e0d178b1d1e 4604 sp_256_from_mp(q->y, 10, qY);
wolfSSL 16:8e0d178b1d1e 4605 sp_256_from_mp(q->z, 10, qZ);
wolfSSL 16:8e0d178b1d1e 4606
wolfSSL 16:8e0d178b1d1e 4607 sp_256_proj_point_add_10(p, p, q, tmp);
wolfSSL 16:8e0d178b1d1e 4608 }
wolfSSL 16:8e0d178b1d1e 4609
wolfSSL 16:8e0d178b1d1e 4610 if (err == MP_OKAY) {
wolfSSL 16:8e0d178b1d1e 4611 err = sp_256_to_mp(p->x, rX);
wolfSSL 16:8e0d178b1d1e 4612 }
wolfSSL 16:8e0d178b1d1e 4613 if (err == MP_OKAY) {
wolfSSL 16:8e0d178b1d1e 4614 err = sp_256_to_mp(p->y, rY);
wolfSSL 16:8e0d178b1d1e 4615 }
wolfSSL 16:8e0d178b1d1e 4616 if (err == MP_OKAY) {
wolfSSL 16:8e0d178b1d1e 4617 err = sp_256_to_mp(p->z, rZ);
wolfSSL 16:8e0d178b1d1e 4618 }
wolfSSL 16:8e0d178b1d1e 4619
wolfSSL 16:8e0d178b1d1e 4620 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)
wolfSSL 16:8e0d178b1d1e 4621 if (tmp != NULL) {
wolfSSL 16:8e0d178b1d1e 4622 XFREE(tmp, NULL, DYNAMIC_TYPE_ECC);
wolfSSL 16:8e0d178b1d1e 4623 }
wolfSSL 16:8e0d178b1d1e 4624 #endif
wolfSSL 16:8e0d178b1d1e 4625 sp_ecc_point_free(q, 0, NULL);
wolfSSL 16:8e0d178b1d1e 4626 sp_ecc_point_free(p, 0, NULL);
wolfSSL 16:8e0d178b1d1e 4627
wolfSSL 16:8e0d178b1d1e 4628 return err;
wolfSSL 16:8e0d178b1d1e 4629 }
wolfSSL 16:8e0d178b1d1e 4630
wolfSSL 16:8e0d178b1d1e 4631
wolfSSL 16:8e0d178b1d1e 4632 /* Double a projective EC point.
wolfSSL 16:8e0d178b1d1e 4633 * (pX, pY, pZ) + (pX, pY, pZ) = (rX, rY, rZ)
wolfSSL 16:8e0d178b1d1e 4634 *
wolfSSL 16:8e0d178b1d1e 4635 * pX EC point's X ordinate.
wolfSSL 16:8e0d178b1d1e 4636 * pY EC point's Y ordinate.
wolfSSL 16:8e0d178b1d1e 4637 * pZ EC point's Z ordinate.
wolfSSL 16:8e0d178b1d1e 4638 * rX Resultant EC point's X ordinate.
wolfSSL 16:8e0d178b1d1e 4639 * rY Resultant EC point's Y ordinate.
wolfSSL 16:8e0d178b1d1e 4640 * rZ Resultant EC point's Z ordinate.
wolfSSL 16:8e0d178b1d1e 4641 * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
wolfSSL 16:8e0d178b1d1e 4642 */
wolfSSL 16:8e0d178b1d1e 4643 int sp_ecc_proj_dbl_point_256(mp_int* pX, mp_int* pY, mp_int* pZ,
wolfSSL 16:8e0d178b1d1e 4644 mp_int* rX, mp_int* rY, mp_int* rZ)
wolfSSL 16:8e0d178b1d1e 4645 {
wolfSSL 16:8e0d178b1d1e 4646 #if !defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SMALL_STACK)
wolfSSL 16:8e0d178b1d1e 4647 sp_digit tmpd[2 * 10 * 2];
wolfSSL 16:8e0d178b1d1e 4648 sp_point pd;
wolfSSL 16:8e0d178b1d1e 4649 #endif
wolfSSL 16:8e0d178b1d1e 4650 sp_digit* tmp;
wolfSSL 16:8e0d178b1d1e 4651 sp_point* p;
wolfSSL 16:8e0d178b1d1e 4652 int err;
wolfSSL 16:8e0d178b1d1e 4653
wolfSSL 16:8e0d178b1d1e 4654 err = sp_ecc_point_new(NULL, pd, p);
wolfSSL 16:8e0d178b1d1e 4655 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)
wolfSSL 16:8e0d178b1d1e 4656 if (err == MP_OKAY) {
wolfSSL 16:8e0d178b1d1e 4657 tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 10 * 2, NULL,
wolfSSL 16:8e0d178b1d1e 4658 DYNAMIC_TYPE_ECC);
wolfSSL 16:8e0d178b1d1e 4659 if (tmp == NULL) {
wolfSSL 16:8e0d178b1d1e 4660 err = MEMORY_E;
wolfSSL 16:8e0d178b1d1e 4661 }
wolfSSL 16:8e0d178b1d1e 4662 }
wolfSSL 16:8e0d178b1d1e 4663 #else
wolfSSL 16:8e0d178b1d1e 4664 tmp = tmpd;
wolfSSL 16:8e0d178b1d1e 4665 #endif
wolfSSL 16:8e0d178b1d1e 4666
wolfSSL 16:8e0d178b1d1e 4667 if (err == MP_OKAY) {
wolfSSL 16:8e0d178b1d1e 4668 sp_256_from_mp(p->x, 10, pX);
wolfSSL 16:8e0d178b1d1e 4669 sp_256_from_mp(p->y, 10, pY);
wolfSSL 16:8e0d178b1d1e 4670 sp_256_from_mp(p->z, 10, pZ);
wolfSSL 16:8e0d178b1d1e 4671
wolfSSL 16:8e0d178b1d1e 4672 sp_256_proj_point_dbl_10(p, p, tmp);
wolfSSL 16:8e0d178b1d1e 4673 }
wolfSSL 16:8e0d178b1d1e 4674
wolfSSL 16:8e0d178b1d1e 4675 if (err == MP_OKAY) {
wolfSSL 16:8e0d178b1d1e 4676 err = sp_256_to_mp(p->x, rX);
wolfSSL 16:8e0d178b1d1e 4677 }
wolfSSL 16:8e0d178b1d1e 4678 if (err == MP_OKAY) {
wolfSSL 16:8e0d178b1d1e 4679 err = sp_256_to_mp(p->y, rY);
wolfSSL 16:8e0d178b1d1e 4680 }
wolfSSL 16:8e0d178b1d1e 4681 if (err == MP_OKAY) {
wolfSSL 16:8e0d178b1d1e 4682 err = sp_256_to_mp(p->z, rZ);
wolfSSL 16:8e0d178b1d1e 4683 }
wolfSSL 16:8e0d178b1d1e 4684
wolfSSL 16:8e0d178b1d1e 4685 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)
wolfSSL 16:8e0d178b1d1e 4686 if (tmp != NULL) {
wolfSSL 16:8e0d178b1d1e 4687 XFREE(tmp, NULL, DYNAMIC_TYPE_ECC);
wolfSSL 16:8e0d178b1d1e 4688 }
wolfSSL 16:8e0d178b1d1e 4689 #endif
wolfSSL 16:8e0d178b1d1e 4690 sp_ecc_point_free(p, 0, NULL);
wolfSSL 16:8e0d178b1d1e 4691
wolfSSL 16:8e0d178b1d1e 4692 return err;
wolfSSL 16:8e0d178b1d1e 4693 }
wolfSSL 16:8e0d178b1d1e 4694
wolfSSL 16:8e0d178b1d1e 4695 /* Map a projective EC point to affine in place.
wolfSSL 16:8e0d178b1d1e 4696 * pZ will be one.
wolfSSL 16:8e0d178b1d1e 4697 *
wolfSSL 16:8e0d178b1d1e 4698 * pX EC point's X ordinate.
wolfSSL 16:8e0d178b1d1e 4699 * pY EC point's Y ordinate.
wolfSSL 16:8e0d178b1d1e 4700 * pZ EC point's Z ordinate.
wolfSSL 16:8e0d178b1d1e 4701 * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
wolfSSL 16:8e0d178b1d1e 4702 */
wolfSSL 16:8e0d178b1d1e 4703 int sp_ecc_map_256(mp_int* pX, mp_int* pY, mp_int* pZ)
wolfSSL 16:8e0d178b1d1e 4704 {
wolfSSL 16:8e0d178b1d1e 4705 #if !defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SMALL_STACK)
wolfSSL 16:8e0d178b1d1e 4706 sp_digit tmpd[2 * 10 * 4];
wolfSSL 16:8e0d178b1d1e 4707 sp_point pd;
wolfSSL 16:8e0d178b1d1e 4708 #endif
wolfSSL 16:8e0d178b1d1e 4709 sp_digit* tmp;
wolfSSL 16:8e0d178b1d1e 4710 sp_point* p;
wolfSSL 16:8e0d178b1d1e 4711 int err;
wolfSSL 16:8e0d178b1d1e 4712
wolfSSL 16:8e0d178b1d1e 4713 err = sp_ecc_point_new(NULL, pd, p);
wolfSSL 16:8e0d178b1d1e 4714 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)
wolfSSL 16:8e0d178b1d1e 4715 if (err == MP_OKAY) {
wolfSSL 16:8e0d178b1d1e 4716 tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 10 * 4, NULL,
wolfSSL 16:8e0d178b1d1e 4717 DYNAMIC_TYPE_ECC);
wolfSSL 16:8e0d178b1d1e 4718 if (tmp == NULL) {
wolfSSL 16:8e0d178b1d1e 4719 err = MEMORY_E;
wolfSSL 16:8e0d178b1d1e 4720 }
wolfSSL 16:8e0d178b1d1e 4721 }
wolfSSL 16:8e0d178b1d1e 4722 #else
wolfSSL 16:8e0d178b1d1e 4723 tmp = tmpd;
wolfSSL 16:8e0d178b1d1e 4724 #endif
wolfSSL 16:8e0d178b1d1e 4725 if (err == MP_OKAY) {
wolfSSL 16:8e0d178b1d1e 4726 sp_256_from_mp(p->x, 10, pX);
wolfSSL 16:8e0d178b1d1e 4727 sp_256_from_mp(p->y, 10, pY);
wolfSSL 16:8e0d178b1d1e 4728 sp_256_from_mp(p->z, 10, pZ);
wolfSSL 16:8e0d178b1d1e 4729
wolfSSL 16:8e0d178b1d1e 4730 sp_256_map_10(p, p, tmp);
wolfSSL 16:8e0d178b1d1e 4731 }
wolfSSL 16:8e0d178b1d1e 4732
wolfSSL 16:8e0d178b1d1e 4733 if (err == MP_OKAY) {
wolfSSL 16:8e0d178b1d1e 4734 err = sp_256_to_mp(p->x, pX);
wolfSSL 16:8e0d178b1d1e 4735 }
wolfSSL 16:8e0d178b1d1e 4736 if (err == MP_OKAY) {
wolfSSL 16:8e0d178b1d1e 4737 err = sp_256_to_mp(p->y, pY);
wolfSSL 16:8e0d178b1d1e 4738 }
wolfSSL 16:8e0d178b1d1e 4739 if (err == MP_OKAY) {
wolfSSL 16:8e0d178b1d1e 4740 err = sp_256_to_mp(p->z, pZ);
wolfSSL 16:8e0d178b1d1e 4741 }
wolfSSL 16:8e0d178b1d1e 4742
wolfSSL 16:8e0d178b1d1e 4743 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)
wolfSSL 16:8e0d178b1d1e 4744 if (tmp != NULL) {
wolfSSL 16:8e0d178b1d1e 4745 XFREE(tmp, NULL, DYNAMIC_TYPE_ECC);
wolfSSL 16:8e0d178b1d1e 4746 }
wolfSSL 16:8e0d178b1d1e 4747 #endif
wolfSSL 16:8e0d178b1d1e 4748 sp_ecc_point_free(p, 0, NULL);
wolfSSL 16:8e0d178b1d1e 4749
wolfSSL 16:8e0d178b1d1e 4750 return err;
wolfSSL 16:8e0d178b1d1e 4751 }
wolfSSL 16:8e0d178b1d1e 4752 #endif /* WOLFSSL_PUBLIC_ECC_ADD_DBL */
wolfSSL 16:8e0d178b1d1e 4753 #ifdef HAVE_COMP_KEY
wolfSSL 16:8e0d178b1d1e 4754 /* Find the square root of a number mod the prime of the curve.
wolfSSL 16:8e0d178b1d1e 4755 *
wolfSSL 16:8e0d178b1d1e 4756 * y The number to operate on and the result.
wolfSSL 16:8e0d178b1d1e 4757 * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
wolfSSL 16:8e0d178b1d1e 4758 */
wolfSSL 16:8e0d178b1d1e 4759 static int sp_256_mont_sqrt_10(sp_digit* y)
wolfSSL 16:8e0d178b1d1e 4760 {
wolfSSL 16:8e0d178b1d1e 4761 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)
wolfSSL 16:8e0d178b1d1e 4762 sp_digit* d;
wolfSSL 16:8e0d178b1d1e 4763 #else
wolfSSL 16:8e0d178b1d1e 4764 sp_digit t1d[2 * 10];
wolfSSL 16:8e0d178b1d1e 4765 sp_digit t2d[2 * 10];
wolfSSL 16:8e0d178b1d1e 4766 #endif
wolfSSL 16:8e0d178b1d1e 4767 sp_digit* t1;
wolfSSL 16:8e0d178b1d1e 4768 sp_digit* t2;
wolfSSL 16:8e0d178b1d1e 4769 int err = MP_OKAY;
wolfSSL 16:8e0d178b1d1e 4770
wolfSSL 16:8e0d178b1d1e 4771 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)
wolfSSL 16:8e0d178b1d1e 4772 d = (sp_digit*)XMALLOC(sizeof(sp_digit) * 4 * 10, NULL, DYNAMIC_TYPE_ECC);
wolfSSL 16:8e0d178b1d1e 4773 if (d == NULL) {
wolfSSL 16:8e0d178b1d1e 4774 err = MEMORY_E;
wolfSSL 16:8e0d178b1d1e 4775 }
wolfSSL 16:8e0d178b1d1e 4776 #endif
wolfSSL 16:8e0d178b1d1e 4777
wolfSSL 16:8e0d178b1d1e 4778 if (err == MP_OKAY) {
wolfSSL 16:8e0d178b1d1e 4779 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)
wolfSSL 16:8e0d178b1d1e 4780 t1 = d + 0 * 10;
wolfSSL 16:8e0d178b1d1e 4781 t2 = d + 2 * 10;
wolfSSL 16:8e0d178b1d1e 4782 #else
wolfSSL 16:8e0d178b1d1e 4783 t1 = t1d;
wolfSSL 16:8e0d178b1d1e 4784 t2 = t2d;
wolfSSL 16:8e0d178b1d1e 4785 #endif
wolfSSL 16:8e0d178b1d1e 4786
wolfSSL 16:8e0d178b1d1e 4787 {
wolfSSL 16:8e0d178b1d1e 4788 /* t2 = y ^ 0x2 */
wolfSSL 16:8e0d178b1d1e 4789 sp_256_mont_sqr_10(t2, y, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 4790 /* t1 = y ^ 0x3 */
wolfSSL 16:8e0d178b1d1e 4791 sp_256_mont_mul_10(t1, t2, y, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 4792 /* t2 = y ^ 0xc */
wolfSSL 16:8e0d178b1d1e 4793 sp_256_mont_sqr_n_10(t2, t1, 2, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 4794 /* t1 = y ^ 0xf */
wolfSSL 16:8e0d178b1d1e 4795 sp_256_mont_mul_10(t1, t1, t2, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 4796 /* t2 = y ^ 0xf0 */
wolfSSL 16:8e0d178b1d1e 4797 sp_256_mont_sqr_n_10(t2, t1, 4, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 4798 /* t1 = y ^ 0xff */
wolfSSL 16:8e0d178b1d1e 4799 sp_256_mont_mul_10(t1, t1, t2, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 4800 /* t2 = y ^ 0xff00 */
wolfSSL 16:8e0d178b1d1e 4801 sp_256_mont_sqr_n_10(t2, t1, 8, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 4802 /* t1 = y ^ 0xffff */
wolfSSL 16:8e0d178b1d1e 4803 sp_256_mont_mul_10(t1, t1, t2, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 4804 /* t2 = y ^ 0xffff0000 */
wolfSSL 16:8e0d178b1d1e 4805 sp_256_mont_sqr_n_10(t2, t1, 16, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 4806 /* t1 = y ^ 0xffffffff */
wolfSSL 16:8e0d178b1d1e 4807 sp_256_mont_mul_10(t1, t1, t2, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 4808 /* t1 = y ^ 0xffffffff00000000 */
wolfSSL 16:8e0d178b1d1e 4809 sp_256_mont_sqr_n_10(t1, t1, 32, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 4810 /* t1 = y ^ 0xffffffff00000001 */
wolfSSL 16:8e0d178b1d1e 4811 sp_256_mont_mul_10(t1, t1, y, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 4812 /* t1 = y ^ 0xffffffff00000001000000000000000000000000 */
wolfSSL 16:8e0d178b1d1e 4813 sp_256_mont_sqr_n_10(t1, t1, 96, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 4814 /* t1 = y ^ 0xffffffff00000001000000000000000000000001 */
wolfSSL 16:8e0d178b1d1e 4815 sp_256_mont_mul_10(t1, t1, y, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 4816 sp_256_mont_sqr_n_10(y, t1, 94, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 4817 }
wolfSSL 16:8e0d178b1d1e 4818 }
wolfSSL 16:8e0d178b1d1e 4819
wolfSSL 16:8e0d178b1d1e 4820 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)
wolfSSL 16:8e0d178b1d1e 4821 if (d != NULL) {
wolfSSL 16:8e0d178b1d1e 4822 XFREE(d, NULL, DYNAMIC_TYPE_ECC);
wolfSSL 16:8e0d178b1d1e 4823 }
wolfSSL 16:8e0d178b1d1e 4824 #endif
wolfSSL 16:8e0d178b1d1e 4825
wolfSSL 16:8e0d178b1d1e 4826 return err;
wolfSSL 16:8e0d178b1d1e 4827 }
wolfSSL 16:8e0d178b1d1e 4828
wolfSSL 16:8e0d178b1d1e 4829 /* Uncompress the point given the X ordinate.
wolfSSL 16:8e0d178b1d1e 4830 *
wolfSSL 16:8e0d178b1d1e 4831 * xm X ordinate.
wolfSSL 16:8e0d178b1d1e 4832 * odd Whether the Y ordinate is odd.
wolfSSL 16:8e0d178b1d1e 4833 * ym Calculated Y ordinate.
wolfSSL 16:8e0d178b1d1e 4834 * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
wolfSSL 16:8e0d178b1d1e 4835 */
wolfSSL 16:8e0d178b1d1e 4836 int sp_ecc_uncompress_256(mp_int* xm, int odd, mp_int* ym)
wolfSSL 16:8e0d178b1d1e 4837 {
wolfSSL 16:8e0d178b1d1e 4838 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)
wolfSSL 16:8e0d178b1d1e 4839 sp_digit* d;
wolfSSL 16:8e0d178b1d1e 4840 #else
wolfSSL 16:8e0d178b1d1e 4841 sp_digit xd[2 * 10];
wolfSSL 16:8e0d178b1d1e 4842 sp_digit yd[2 * 10];
wolfSSL 16:8e0d178b1d1e 4843 #endif
wolfSSL 16:8e0d178b1d1e 4844 sp_digit* x = NULL;
wolfSSL 16:8e0d178b1d1e 4845 sp_digit* y = NULL;
wolfSSL 16:8e0d178b1d1e 4846 int err = MP_OKAY;
wolfSSL 16:8e0d178b1d1e 4847
wolfSSL 16:8e0d178b1d1e 4848 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)
wolfSSL 16:8e0d178b1d1e 4849 d = (sp_digit*)XMALLOC(sizeof(sp_digit) * 4 * 10, NULL, DYNAMIC_TYPE_ECC);
wolfSSL 16:8e0d178b1d1e 4850 if (d == NULL) {
wolfSSL 16:8e0d178b1d1e 4851 err = MEMORY_E;
wolfSSL 16:8e0d178b1d1e 4852 }
wolfSSL 16:8e0d178b1d1e 4853 #endif
wolfSSL 16:8e0d178b1d1e 4854
wolfSSL 16:8e0d178b1d1e 4855 if (err == MP_OKAY) {
wolfSSL 16:8e0d178b1d1e 4856 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)
wolfSSL 16:8e0d178b1d1e 4857 x = d + 0 * 10;
wolfSSL 16:8e0d178b1d1e 4858 y = d + 2 * 10;
wolfSSL 16:8e0d178b1d1e 4859 #else
wolfSSL 16:8e0d178b1d1e 4860 x = xd;
wolfSSL 16:8e0d178b1d1e 4861 y = yd;
wolfSSL 16:8e0d178b1d1e 4862 #endif
wolfSSL 16:8e0d178b1d1e 4863
wolfSSL 16:8e0d178b1d1e 4864 sp_256_from_mp(x, 10, xm);
wolfSSL 16:8e0d178b1d1e 4865 err = sp_256_mod_mul_norm_10(x, x, p256_mod);
wolfSSL 16:8e0d178b1d1e 4866 }
wolfSSL 16:8e0d178b1d1e 4867 if (err == MP_OKAY) {
wolfSSL 16:8e0d178b1d1e 4868 /* y = x^3 */
wolfSSL 16:8e0d178b1d1e 4869 {
wolfSSL 16:8e0d178b1d1e 4870 sp_256_mont_sqr_10(y, x, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 4871 sp_256_mont_mul_10(y, y, x, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 4872 }
wolfSSL 16:8e0d178b1d1e 4873 /* y = x^3 - 3x */
wolfSSL 16:8e0d178b1d1e 4874 sp_256_mont_sub_10(y, y, x, p256_mod);
wolfSSL 16:8e0d178b1d1e 4875 sp_256_mont_sub_10(y, y, x, p256_mod);
wolfSSL 16:8e0d178b1d1e 4876 sp_256_mont_sub_10(y, y, x, p256_mod);
wolfSSL 16:8e0d178b1d1e 4877 /* y = x^3 - 3x + b */
wolfSSL 16:8e0d178b1d1e 4878 err = sp_256_mod_mul_norm_10(x, p256_b, p256_mod);
wolfSSL 16:8e0d178b1d1e 4879 }
wolfSSL 16:8e0d178b1d1e 4880 if (err == MP_OKAY) {
wolfSSL 16:8e0d178b1d1e 4881 sp_256_mont_add_10(y, y, x, p256_mod);
wolfSSL 16:8e0d178b1d1e 4882 /* y = sqrt(x^3 - 3x + b) */
wolfSSL 16:8e0d178b1d1e 4883 err = sp_256_mont_sqrt_10(y);
wolfSSL 16:8e0d178b1d1e 4884 }
wolfSSL 16:8e0d178b1d1e 4885 if (err == MP_OKAY) {
wolfSSL 16:8e0d178b1d1e 4886 XMEMSET(y + 10, 0, 10U * sizeof(sp_digit));
wolfSSL 16:8e0d178b1d1e 4887 sp_256_mont_reduce_10(y, p256_mod, p256_mp_mod);
wolfSSL 16:8e0d178b1d1e 4888 if ((((word32)y[0] ^ (word32)odd) & 1U) != 0U) {
wolfSSL 16:8e0d178b1d1e 4889 sp_256_mont_sub_10(y, p256_mod, y, p256_mod);
wolfSSL 16:8e0d178b1d1e 4890 }
wolfSSL 16:8e0d178b1d1e 4891
wolfSSL 16:8e0d178b1d1e 4892 err = sp_256_to_mp(y, ym);
wolfSSL 16:8e0d178b1d1e 4893 }
wolfSSL 16:8e0d178b1d1e 4894
wolfSSL 16:8e0d178b1d1e 4895 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)
wolfSSL 16:8e0d178b1d1e 4896 if (d != NULL) {
wolfSSL 16:8e0d178b1d1e 4897 XFREE(d, NULL, DYNAMIC_TYPE_ECC);
wolfSSL 16:8e0d178b1d1e 4898 }
wolfSSL 16:8e0d178b1d1e 4899 #endif
wolfSSL 16:8e0d178b1d1e 4900
wolfSSL 16:8e0d178b1d1e 4901 return err;
wolfSSL 16:8e0d178b1d1e 4902 }
wolfSSL 16:8e0d178b1d1e 4903 #endif
wolfSSL 16:8e0d178b1d1e 4904 #endif /* !WOLFSSL_SP_NO_256 */
wolfSSL 16:8e0d178b1d1e 4905 #endif /* WOLFSSL_HAVE_SP_ECC */
wolfSSL 16:8e0d178b1d1e 4906 #endif /* WOLFSSL_DSP */
wolfSSL 16:8e0d178b1d1e 4907 #endif /* WOLFSSL_HAVE_SP_ECC */
wolfSSL 16:8e0d178b1d1e 4908
wolfSSL 16:8e0d178b1d1e 4909