wolfSSL SSL/TLS library, support up to TLS1.3
Dependents: CyaSSL-Twitter-OAuth4Tw Example-client-tls-cert TwitterReader TweetTest ... more
wolfcrypt/src/wc_dsp.c@17:a5f916481144, 2020-06-05 (annotated)
- 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?
User | Revision | Line number | New contents of line |
---|---|---|---|
wolfSSL | 16:8e0d178b1d1e | 1 | /* wc_dsp.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 | #ifdef HAVE_CONFIG_H |
wolfSSL | 16:8e0d178b1d1e | 23 | #include <config.h> |
wolfSSL | 16:8e0d178b1d1e | 24 | #endif |
wolfSSL | 16:8e0d178b1d1e | 25 | |
wolfSSL | 16:8e0d178b1d1e | 26 | #include <wolfssl/wolfcrypt/settings.h> |
wolfSSL | 16:8e0d178b1d1e | 27 | #include <wolfssl/wolfcrypt/error-crypt.h> |
wolfSSL | 16:8e0d178b1d1e | 28 | #include <wolfssl/wolfcrypt/cpuid.h> |
wolfSSL | 16:8e0d178b1d1e | 29 | #include <wolfssl/wolfcrypt/logging.h> |
wolfSSL | 16:8e0d178b1d1e | 30 | #ifdef NO_INLINE |
wolfSSL | 16:8e0d178b1d1e | 31 | #include <wolfssl/wolfcrypt/misc.h> |
wolfSSL | 16:8e0d178b1d1e | 32 | #else |
wolfSSL | 16:8e0d178b1d1e | 33 | #define WOLFSSL_MISC_INCLUDED |
wolfSSL | 16:8e0d178b1d1e | 34 | #include <wolfcrypt/src/misc.c> |
wolfSSL | 16:8e0d178b1d1e | 35 | #endif |
wolfSSL | 16:8e0d178b1d1e | 36 | |
wolfSSL | 16:8e0d178b1d1e | 37 | #if defined(WOLFSSL_DSP) |
wolfSSL | 16:8e0d178b1d1e | 38 | #include "remote.h" |
wolfSSL | 16:8e0d178b1d1e | 39 | #include "rpcmem.h" |
wolfSSL | 16:8e0d178b1d1e | 40 | static wolfSSL_DSP_Handle_cb handle_function = NULL; |
wolfSSL | 16:8e0d178b1d1e | 41 | static remote_handle64 defaultHandle; |
wolfSSL | 16:8e0d178b1d1e | 42 | static wolfSSL_Mutex handle_mutex; /* mutex for access to single default handle */ |
wolfSSL | 16:8e0d178b1d1e | 43 | |
wolfSSL | 16:8e0d178b1d1e | 44 | #define WOLFSSL_HANDLE_DONE 1 |
wolfSSL | 16:8e0d178b1d1e | 45 | #define WOLFSSL_HANDLE_GET 0 |
wolfSSL | 16:8e0d178b1d1e | 46 | |
wolfSSL | 16:8e0d178b1d1e | 47 | /* callback function for setting the default handle in single threaded |
wolfSSL | 16:8e0d178b1d1e | 48 | * use cases */ |
wolfSSL | 16:8e0d178b1d1e | 49 | static int default_handle_cb(remote_handle64 *handle, int finished, void *ctx) |
wolfSSL | 16:8e0d178b1d1e | 50 | { |
wolfSSL | 16:8e0d178b1d1e | 51 | (void)ctx; |
wolfSSL | 16:8e0d178b1d1e | 52 | if (finished == WOLFSSL_HANDLE_DONE) { |
wolfSSL | 16:8e0d178b1d1e | 53 | if (wc_UnLockMutex(&handle_mutex) != 0) { |
wolfSSL | 16:8e0d178b1d1e | 54 | WOLFSSL_MSG("Unlock handle mutex failed"); |
wolfSSL | 16:8e0d178b1d1e | 55 | return -1; |
wolfSSL | 16:8e0d178b1d1e | 56 | } |
wolfSSL | 16:8e0d178b1d1e | 57 | } |
wolfSSL | 16:8e0d178b1d1e | 58 | else { |
wolfSSL | 16:8e0d178b1d1e | 59 | if (wc_LockMutex(&handle_mutex) != 0) { |
wolfSSL | 16:8e0d178b1d1e | 60 | WOLFSSL_MSG("Lock handle mutex failed"); |
wolfSSL | 16:8e0d178b1d1e | 61 | return -1; |
wolfSSL | 16:8e0d178b1d1e | 62 | } |
wolfSSL | 16:8e0d178b1d1e | 63 | *handle = defaultHandle; |
wolfSSL | 16:8e0d178b1d1e | 64 | } |
wolfSSL | 16:8e0d178b1d1e | 65 | return 0; |
wolfSSL | 16:8e0d178b1d1e | 66 | } |
wolfSSL | 16:8e0d178b1d1e | 67 | |
wolfSSL | 16:8e0d178b1d1e | 68 | |
wolfSSL | 16:8e0d178b1d1e | 69 | /* Set global callback for getting handle to use |
wolfSSL | 16:8e0d178b1d1e | 70 | * return 0 on success */ |
wolfSSL | 16:8e0d178b1d1e | 71 | int wolfSSL_SetHandleCb(wolfSSL_DSP_Handle_cb in) |
wolfSSL | 16:8e0d178b1d1e | 72 | { |
wolfSSL | 16:8e0d178b1d1e | 73 | handle_function = in; |
wolfSSL | 16:8e0d178b1d1e | 74 | return 0; |
wolfSSL | 16:8e0d178b1d1e | 75 | } |
wolfSSL | 16:8e0d178b1d1e | 76 | |
wolfSSL | 16:8e0d178b1d1e | 77 | |
wolfSSL | 16:8e0d178b1d1e | 78 | /* returns 1 if global handle callback is set and 0 if not */ |
wolfSSL | 16:8e0d178b1d1e | 79 | int wolfSSL_GetHandleCbSet() |
wolfSSL | 16:8e0d178b1d1e | 80 | { |
wolfSSL | 16:8e0d178b1d1e | 81 | return (handle_function != NULL)? 1: 0; |
wolfSSL | 16:8e0d178b1d1e | 82 | } |
wolfSSL | 16:8e0d178b1d1e | 83 | |
wolfSSL | 16:8e0d178b1d1e | 84 | |
wolfSSL | 16:8e0d178b1d1e | 85 | /* Local function for setting up default handle |
wolfSSL | 16:8e0d178b1d1e | 86 | * returns 0 on success */ |
wolfSSL | 16:8e0d178b1d1e | 87 | int wolfSSL_InitHandle() |
wolfSSL | 16:8e0d178b1d1e | 88 | { |
wolfSSL | 16:8e0d178b1d1e | 89 | char *sp_URI_value; |
wolfSSL | 16:8e0d178b1d1e | 90 | int ret; |
wolfSSL | 16:8e0d178b1d1e | 91 | |
wolfSSL | 16:8e0d178b1d1e | 92 | sp_URI_value = wolfSSL_URI "&_dom=adsp"; |
wolfSSL | 16:8e0d178b1d1e | 93 | ret = wolfSSL_open(sp_URI_value, &defaultHandle); |
wolfSSL | 16:8e0d178b1d1e | 94 | if (ret != 0) { |
wolfSSL | 16:8e0d178b1d1e | 95 | WOLFSSL_MSG("Unable to open aDSP?"); |
wolfSSL | 16:8e0d178b1d1e | 96 | return -1; |
wolfSSL | 16:8e0d178b1d1e | 97 | } |
wolfSSL | 16:8e0d178b1d1e | 98 | wolfSSL_SetHandleCb(default_handle_cb); |
wolfSSL | 16:8e0d178b1d1e | 99 | ret = wc_InitMutex(&handle_mutex); |
wolfSSL | 16:8e0d178b1d1e | 100 | if (ret != 0) { |
wolfSSL | 16:8e0d178b1d1e | 101 | WOLFSSL_MSG("Unable to init handle mutex"); |
wolfSSL | 16:8e0d178b1d1e | 102 | return -1; |
wolfSSL | 16:8e0d178b1d1e | 103 | } |
wolfSSL | 16:8e0d178b1d1e | 104 | return 0; |
wolfSSL | 16:8e0d178b1d1e | 105 | } |
wolfSSL | 16:8e0d178b1d1e | 106 | |
wolfSSL | 16:8e0d178b1d1e | 107 | |
wolfSSL | 16:8e0d178b1d1e | 108 | /* internal function that closes default handle and frees mutex */ |
wolfSSL | 16:8e0d178b1d1e | 109 | void wolfSSL_CleanupHandle() |
wolfSSL | 16:8e0d178b1d1e | 110 | { |
wolfSSL | 16:8e0d178b1d1e | 111 | wolfSSL_close(defaultHandle); |
wolfSSL | 16:8e0d178b1d1e | 112 | wc_FreeMutex(&handle_mutex); |
wolfSSL | 16:8e0d178b1d1e | 113 | } |
wolfSSL | 16:8e0d178b1d1e | 114 | #if defined(WOLFSSL_HAVE_SP_ECC) |
wolfSSL | 16:8e0d178b1d1e | 115 | |
wolfSSL | 16:8e0d178b1d1e | 116 | /* ecc conversion from sp_c32.c */ |
wolfSSL | 16:8e0d178b1d1e | 117 | #include <wolfssl/wolfcrypt/sp.h> |
wolfSSL | 16:8e0d178b1d1e | 118 | |
wolfSSL | 16:8e0d178b1d1e | 119 | |
wolfSSL | 16:8e0d178b1d1e | 120 | #ifndef WOLFSSL_SP_NO_256 |
wolfSSL | 16:8e0d178b1d1e | 121 | |
wolfSSL | 16:8e0d178b1d1e | 122 | #ifdef HAVE_ECC_VERIFY |
wolfSSL | 16:8e0d178b1d1e | 123 | /* Read big endian unsigned byte array into r. |
wolfSSL | 16:8e0d178b1d1e | 124 | * |
wolfSSL | 16:8e0d178b1d1e | 125 | * r A single precision integer. |
wolfSSL | 16:8e0d178b1d1e | 126 | * size Maximum number of bytes to convert |
wolfSSL | 16:8e0d178b1d1e | 127 | * a Byte array. |
wolfSSL | 16:8e0d178b1d1e | 128 | * n Number of bytes in array to read. |
wolfSSL | 16:8e0d178b1d1e | 129 | */ |
wolfSSL | 16:8e0d178b1d1e | 130 | static void int_256_from_bin(int32* r, int size, const byte* a, int n) |
wolfSSL | 16:8e0d178b1d1e | 131 | { |
wolfSSL | 16:8e0d178b1d1e | 132 | int i, j = 0; |
wolfSSL | 16:8e0d178b1d1e | 133 | word32 s = 0; |
wolfSSL | 16:8e0d178b1d1e | 134 | |
wolfSSL | 16:8e0d178b1d1e | 135 | r[0] = 0; |
wolfSSL | 16:8e0d178b1d1e | 136 | for (i = n-1; i >= 0; i--) { |
wolfSSL | 16:8e0d178b1d1e | 137 | r[j] |= (((int32)a[i]) << s); |
wolfSSL | 16:8e0d178b1d1e | 138 | if (s >= 18U) { |
wolfSSL | 16:8e0d178b1d1e | 139 | r[j] &= 0x3ffffff; |
wolfSSL | 16:8e0d178b1d1e | 140 | s = 26U - s; |
wolfSSL | 16:8e0d178b1d1e | 141 | if (j + 1 >= size) { |
wolfSSL | 16:8e0d178b1d1e | 142 | break; |
wolfSSL | 16:8e0d178b1d1e | 143 | } |
wolfSSL | 16:8e0d178b1d1e | 144 | r[++j] = (int32)a[i] >> s; |
wolfSSL | 16:8e0d178b1d1e | 145 | s = 8U - s; |
wolfSSL | 16:8e0d178b1d1e | 146 | } |
wolfSSL | 16:8e0d178b1d1e | 147 | else { |
wolfSSL | 16:8e0d178b1d1e | 148 | s += 8U; |
wolfSSL | 16:8e0d178b1d1e | 149 | } |
wolfSSL | 16:8e0d178b1d1e | 150 | } |
wolfSSL | 16:8e0d178b1d1e | 151 | |
wolfSSL | 16:8e0d178b1d1e | 152 | for (j++; j < size; j++) { |
wolfSSL | 16:8e0d178b1d1e | 153 | r[j] = 0; |
wolfSSL | 16:8e0d178b1d1e | 154 | } |
wolfSSL | 16:8e0d178b1d1e | 155 | } |
wolfSSL | 16:8e0d178b1d1e | 156 | |
wolfSSL | 16:8e0d178b1d1e | 157 | /* Convert an mp_int to an array of sp_digit. |
wolfSSL | 16:8e0d178b1d1e | 158 | * |
wolfSSL | 16:8e0d178b1d1e | 159 | * r A single precision integer. |
wolfSSL | 16:8e0d178b1d1e | 160 | * size Maximum number of bytes to convert |
wolfSSL | 16:8e0d178b1d1e | 161 | * a A multi-precision integer. |
wolfSSL | 16:8e0d178b1d1e | 162 | */ |
wolfSSL | 16:8e0d178b1d1e | 163 | static void int_256_from_mp(int32* r, int size, const mp_int* a) |
wolfSSL | 16:8e0d178b1d1e | 164 | { |
wolfSSL | 16:8e0d178b1d1e | 165 | #if DIGIT_BIT == 26 |
wolfSSL | 16:8e0d178b1d1e | 166 | int j; |
wolfSSL | 16:8e0d178b1d1e | 167 | |
wolfSSL | 16:8e0d178b1d1e | 168 | XMEMCPY(r, a->dp, sizeof(int32) * a->used); |
wolfSSL | 16:8e0d178b1d1e | 169 | |
wolfSSL | 16:8e0d178b1d1e | 170 | for (j = a->used; j < size; j++) { |
wolfSSL | 16:8e0d178b1d1e | 171 | r[j] = 0; |
wolfSSL | 16:8e0d178b1d1e | 172 | } |
wolfSSL | 16:8e0d178b1d1e | 173 | #elif DIGIT_BIT > 26 |
wolfSSL | 16:8e0d178b1d1e | 174 | int i, j = 0; |
wolfSSL | 16:8e0d178b1d1e | 175 | word32 s = 0; |
wolfSSL | 16:8e0d178b1d1e | 176 | |
wolfSSL | 16:8e0d178b1d1e | 177 | r[0] = 0; |
wolfSSL | 16:8e0d178b1d1e | 178 | for (i = 0; i < a->used && j < size; i++) { |
wolfSSL | 16:8e0d178b1d1e | 179 | r[j] |= ((int32)a->dp[i] << s); |
wolfSSL | 16:8e0d178b1d1e | 180 | r[j] &= 0x3ffffff; |
wolfSSL | 16:8e0d178b1d1e | 181 | s = 26U - s; |
wolfSSL | 16:8e0d178b1d1e | 182 | if (j + 1 >= size) { |
wolfSSL | 16:8e0d178b1d1e | 183 | break; |
wolfSSL | 16:8e0d178b1d1e | 184 | } |
wolfSSL | 16:8e0d178b1d1e | 185 | /* lint allow cast of mismatch word32 and mp_digit */ |
wolfSSL | 16:8e0d178b1d1e | 186 | r[++j] = (int32)(a->dp[i] >> s); /*lint !e9033*/ |
wolfSSL | 16:8e0d178b1d1e | 187 | while ((s + 26U) <= (word32)DIGIT_BIT) { |
wolfSSL | 16:8e0d178b1d1e | 188 | s += 26U; |
wolfSSL | 16:8e0d178b1d1e | 189 | r[j] &= 0x3ffffff; |
wolfSSL | 16:8e0d178b1d1e | 190 | if (j + 1 >= size) { |
wolfSSL | 16:8e0d178b1d1e | 191 | break; |
wolfSSL | 16:8e0d178b1d1e | 192 | } |
wolfSSL | 16:8e0d178b1d1e | 193 | if (s < (word32)DIGIT_BIT) { |
wolfSSL | 16:8e0d178b1d1e | 194 | /* lint allow cast of mismatch word32 and mp_digit */ |
wolfSSL | 16:8e0d178b1d1e | 195 | r[++j] = (int32)(a->dp[i] >> s); /*lint !e9033*/ |
wolfSSL | 16:8e0d178b1d1e | 196 | } |
wolfSSL | 16:8e0d178b1d1e | 197 | else { |
wolfSSL | 16:8e0d178b1d1e | 198 | r[++j] = 0L; |
wolfSSL | 16:8e0d178b1d1e | 199 | } |
wolfSSL | 16:8e0d178b1d1e | 200 | } |
wolfSSL | 16:8e0d178b1d1e | 201 | s = (word32)DIGIT_BIT - s; |
wolfSSL | 16:8e0d178b1d1e | 202 | } |
wolfSSL | 16:8e0d178b1d1e | 203 | |
wolfSSL | 16:8e0d178b1d1e | 204 | for (j++; j < size; j++) { |
wolfSSL | 16:8e0d178b1d1e | 205 | r[j] = 0; |
wolfSSL | 16:8e0d178b1d1e | 206 | } |
wolfSSL | 16:8e0d178b1d1e | 207 | #else |
wolfSSL | 16:8e0d178b1d1e | 208 | int i, j = 0, s = 0; |
wolfSSL | 16:8e0d178b1d1e | 209 | |
wolfSSL | 16:8e0d178b1d1e | 210 | r[0] = 0; |
wolfSSL | 16:8e0d178b1d1e | 211 | for (i = 0; i < a->used && j < size; i++) { |
wolfSSL | 16:8e0d178b1d1e | 212 | r[j] |= ((int32)a->dp[i]) << s; |
wolfSSL | 16:8e0d178b1d1e | 213 | if (s + DIGIT_BIT >= 26) { |
wolfSSL | 16:8e0d178b1d1e | 214 | r[j] &= 0x3ffffff; |
wolfSSL | 16:8e0d178b1d1e | 215 | if (j + 1 >= size) { |
wolfSSL | 16:8e0d178b1d1e | 216 | break; |
wolfSSL | 16:8e0d178b1d1e | 217 | } |
wolfSSL | 16:8e0d178b1d1e | 218 | s = 26 - s; |
wolfSSL | 16:8e0d178b1d1e | 219 | if (s == DIGIT_BIT) { |
wolfSSL | 16:8e0d178b1d1e | 220 | r[++j] = 0; |
wolfSSL | 16:8e0d178b1d1e | 221 | s = 0; |
wolfSSL | 16:8e0d178b1d1e | 222 | } |
wolfSSL | 16:8e0d178b1d1e | 223 | else { |
wolfSSL | 16:8e0d178b1d1e | 224 | r[++j] = a->dp[i] >> s; |
wolfSSL | 16:8e0d178b1d1e | 225 | s = DIGIT_BIT - s; |
wolfSSL | 16:8e0d178b1d1e | 226 | } |
wolfSSL | 16:8e0d178b1d1e | 227 | } |
wolfSSL | 16:8e0d178b1d1e | 228 | else { |
wolfSSL | 16:8e0d178b1d1e | 229 | s += DIGIT_BIT; |
wolfSSL | 16:8e0d178b1d1e | 230 | } |
wolfSSL | 16:8e0d178b1d1e | 231 | } |
wolfSSL | 16:8e0d178b1d1e | 232 | |
wolfSSL | 16:8e0d178b1d1e | 233 | for (j++; j < size; j++) { |
wolfSSL | 16:8e0d178b1d1e | 234 | r[j] = 0; |
wolfSSL | 16:8e0d178b1d1e | 235 | } |
wolfSSL | 16:8e0d178b1d1e | 236 | #endif |
wolfSSL | 16:8e0d178b1d1e | 237 | } |
wolfSSL | 16:8e0d178b1d1e | 238 | |
wolfSSL | 16:8e0d178b1d1e | 239 | /* Verify the signature values with the hash and public key. |
wolfSSL | 16:8e0d178b1d1e | 240 | * e = Truncate(hash, 256) |
wolfSSL | 16:8e0d178b1d1e | 241 | * u1 = e/s mod order |
wolfSSL | 16:8e0d178b1d1e | 242 | * u2 = r/s mod order |
wolfSSL | 16:8e0d178b1d1e | 243 | * r == (u1.G + u2.Q)->x mod order |
wolfSSL | 16:8e0d178b1d1e | 244 | * Optimization: Leave point in projective form. |
wolfSSL | 16:8e0d178b1d1e | 245 | * (x, y, 1) == (x' / z'*z', y' / z'*z'*z', z' / z') |
wolfSSL | 16:8e0d178b1d1e | 246 | * (r + n*order).z'.z' mod prime == (u1.G + u2.Q)->x' |
wolfSSL | 16:8e0d178b1d1e | 247 | * The hash is truncated to the first 256 bits. |
wolfSSL | 16:8e0d178b1d1e | 248 | * |
wolfSSL | 16:8e0d178b1d1e | 249 | * hash Hash to sign. |
wolfSSL | 16:8e0d178b1d1e | 250 | * hashLen Length of the hash data. |
wolfSSL | 16:8e0d178b1d1e | 251 | * rng Random number generator. |
wolfSSL | 16:8e0d178b1d1e | 252 | * priv Private part of key - scalar. |
wolfSSL | 16:8e0d178b1d1e | 253 | * rm First part of result as an mp_int. |
wolfSSL | 16:8e0d178b1d1e | 254 | * sm Sirst part of result as an mp_int. |
wolfSSL | 16:8e0d178b1d1e | 255 | * heap Heap to use for allocation. |
wolfSSL | 16:8e0d178b1d1e | 256 | * returns RNG failures, MEMORY_E when memory allocation fails and |
wolfSSL | 16:8e0d178b1d1e | 257 | * MP_OKAY on success. |
wolfSSL | 16:8e0d178b1d1e | 258 | */ |
wolfSSL | 16:8e0d178b1d1e | 259 | int sp_dsp_ecc_verify_256(remote_handle64 handleIn, const byte* hash, word32 hashLen, mp_int* pX, |
wolfSSL | 16:8e0d178b1d1e | 260 | mp_int* pY, mp_int* pZ, mp_int* r, mp_int* sm, int* res, void* heap) |
wolfSSL | 16:8e0d178b1d1e | 261 | { |
wolfSSL | 16:8e0d178b1d1e | 262 | int ret; |
wolfSSL | 16:8e0d178b1d1e | 263 | remote_handle64 handle = handleIn; |
wolfSSL | 16:8e0d178b1d1e | 264 | |
wolfSSL | 16:8e0d178b1d1e | 265 | #if 0 |
wolfSSL | 16:8e0d178b1d1e | 266 | /* calling to alloc memory on the ION using these settings slowed the performance down slightly */ |
wolfSSL | 16:8e0d178b1d1e | 267 | int32 *x = (int32*)rpcmem_alloc(RPCMEM_HEAP_ID_SYSTEM, RPCMEM_DEFAULT_FLAGS, 10*sizeof(int)); |
wolfSSL | 16:8e0d178b1d1e | 268 | int32 *y = (int32*)rpcmem_alloc(RPCMEM_HEAP_ID_SYSTEM, RPCMEM_DEFAULT_FLAGS, 10*sizeof(int)); |
wolfSSL | 16:8e0d178b1d1e | 269 | int32 *z = (int32*)rpcmem_alloc(RPCMEM_HEAP_ID_SYSTEM, RPCMEM_DEFAULT_FLAGS, 10*sizeof(int)); |
wolfSSL | 16:8e0d178b1d1e | 270 | int32 *s = (int32*)rpcmem_alloc(RPCMEM_HEAP_ID_SYSTEM, RPCMEM_DEFAULT_FLAGS, 10*sizeof(int)); |
wolfSSL | 16:8e0d178b1d1e | 271 | int32 *u1 = (int32*)rpcmem_alloc(RPCMEM_HEAP_ID_SYSTEM, RPCMEM_DEFAULT_FLAGS, 10*sizeof(int)); |
wolfSSL | 16:8e0d178b1d1e | 272 | int32 *u2 = (int32*)rpcmem_alloc(RPCMEM_HEAP_ID_SYSTEM, RPCMEM_DEFAULT_FLAGS, 10*sizeof(int)); |
wolfSSL | 16:8e0d178b1d1e | 273 | #endif |
wolfSSL | 16:8e0d178b1d1e | 274 | int32 x[10] __attribute__((aligned(128))); |
wolfSSL | 16:8e0d178b1d1e | 275 | int32 y[10] __attribute__((aligned(128))); |
wolfSSL | 16:8e0d178b1d1e | 276 | int32 z[10] __attribute__((aligned(128))); |
wolfSSL | 16:8e0d178b1d1e | 277 | int32 s[10] __attribute__((aligned(128))); |
wolfSSL | 16:8e0d178b1d1e | 278 | int32 u1[10] __attribute__((aligned(128))); |
wolfSSL | 16:8e0d178b1d1e | 279 | int32 u2[10] __attribute__((aligned(128))); |
wolfSSL | 16:8e0d178b1d1e | 280 | |
wolfSSL | 16:8e0d178b1d1e | 281 | if (hashLen > 32U) { |
wolfSSL | 16:8e0d178b1d1e | 282 | hashLen = 32U; |
wolfSSL | 16:8e0d178b1d1e | 283 | } |
wolfSSL | 16:8e0d178b1d1e | 284 | |
wolfSSL | 16:8e0d178b1d1e | 285 | int_256_from_bin(u1, 10, hash, (int)hashLen); |
wolfSSL | 16:8e0d178b1d1e | 286 | int_256_from_mp(u2, 10, r); |
wolfSSL | 16:8e0d178b1d1e | 287 | int_256_from_mp(s, 10, sm); |
wolfSSL | 16:8e0d178b1d1e | 288 | int_256_from_mp(x, 10, pX); |
wolfSSL | 16:8e0d178b1d1e | 289 | int_256_from_mp(y, 10, pY); |
wolfSSL | 16:8e0d178b1d1e | 290 | int_256_from_mp(z, 10, pZ); |
wolfSSL | 16:8e0d178b1d1e | 291 | |
wolfSSL | 16:8e0d178b1d1e | 292 | if (handle_function != NULL) { |
wolfSSL | 16:8e0d178b1d1e | 293 | handle_function(&handle, WOLFSSL_HANDLE_GET, NULL); |
wolfSSL | 16:8e0d178b1d1e | 294 | } |
wolfSSL | 16:8e0d178b1d1e | 295 | |
wolfSSL | 16:8e0d178b1d1e | 296 | *res = 0; |
wolfSSL | 16:8e0d178b1d1e | 297 | ret = wolfSSL_DSP_ECC_Verify_256(handle, u1, 10, u2, 10, s, 10, x, 10, y, 10, z, 10, res); |
wolfSSL | 16:8e0d178b1d1e | 298 | |
wolfSSL | 16:8e0d178b1d1e | 299 | if (handle_function != NULL) { |
wolfSSL | 16:8e0d178b1d1e | 300 | handle_function(&handle, WOLFSSL_HANDLE_DONE, NULL); |
wolfSSL | 16:8e0d178b1d1e | 301 | } |
wolfSSL | 16:8e0d178b1d1e | 302 | #if 0 |
wolfSSL | 16:8e0d178b1d1e | 303 | rpcmem_free(x); |
wolfSSL | 16:8e0d178b1d1e | 304 | rpcmem_free(y); |
wolfSSL | 16:8e0d178b1d1e | 305 | rpcmem_free(z); |
wolfSSL | 16:8e0d178b1d1e | 306 | rpcmem_free(s); |
wolfSSL | 16:8e0d178b1d1e | 307 | rpcmem_free(u1); |
wolfSSL | 16:8e0d178b1d1e | 308 | rpcmem_free(u2); |
wolfSSL | 16:8e0d178b1d1e | 309 | #endif |
wolfSSL | 16:8e0d178b1d1e | 310 | return ret; |
wolfSSL | 16:8e0d178b1d1e | 311 | } |
wolfSSL | 16:8e0d178b1d1e | 312 | |
wolfSSL | 16:8e0d178b1d1e | 313 | |
wolfSSL | 16:8e0d178b1d1e | 314 | /* Used to assign a handle to an ecc_key structure. |
wolfSSL | 16:8e0d178b1d1e | 315 | * returns 0 on success */ |
wolfSSL | 16:8e0d178b1d1e | 316 | int wc_ecc_set_handle(ecc_key* key, remote_handle64 handle) |
wolfSSL | 16:8e0d178b1d1e | 317 | { |
wolfSSL | 16:8e0d178b1d1e | 318 | if (key == NULL) { |
wolfSSL | 16:8e0d178b1d1e | 319 | return BAD_FUNC_ARG; |
wolfSSL | 16:8e0d178b1d1e | 320 | } |
wolfSSL | 16:8e0d178b1d1e | 321 | key->handle = handle; |
wolfSSL | 16:8e0d178b1d1e | 322 | return 0; |
wolfSSL | 16:8e0d178b1d1e | 323 | } |
wolfSSL | 16:8e0d178b1d1e | 324 | #endif /* HAVE_ECC_VERIFY */ |
wolfSSL | 16:8e0d178b1d1e | 325 | #endif /* !WOLFSSL_SP_NO_256 */ |
wolfSSL | 16:8e0d178b1d1e | 326 | #endif /* WOLFSSL_HAVE_SP_ECC */ |
wolfSSL | 16:8e0d178b1d1e | 327 | #endif /* WOLFSSL_DSP */ |
wolfSSL | 16:8e0d178b1d1e | 328 |