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 /* 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