Fork of CyaSSL for my specific settings

Dependents:   CyaSSL_Example

Fork of CyaSSL by wolf SSL

Committer:
d0773d
Date:
Tue Mar 03 22:52:52 2015 +0000
Revision:
4:28ac50e1d49c
Parent:
0:1239e9b70ca2
CyaSSL example

Who changed what in which revision?

UserRevisionLine numberNew contents of line
wolfSSL 0:1239e9b70ca2 1 /* ssl.c
wolfSSL 0:1239e9b70ca2 2 *
wolfSSL 0:1239e9b70ca2 3 * Copyright (C) 2006-2014 wolfSSL Inc.
wolfSSL 0:1239e9b70ca2 4 *
wolfSSL 0:1239e9b70ca2 5 * This file is part of CyaSSL.
wolfSSL 0:1239e9b70ca2 6 *
wolfSSL 0:1239e9b70ca2 7 * CyaSSL is free software; you can redistribute it and/or modify
wolfSSL 0:1239e9b70ca2 8 * it under the terms of the GNU General Public License as published by
wolfSSL 0:1239e9b70ca2 9 * the Free Software Foundation; either version 2 of the License, or
wolfSSL 0:1239e9b70ca2 10 * (at your option) any later version.
wolfSSL 0:1239e9b70ca2 11 *
wolfSSL 0:1239e9b70ca2 12 * CyaSSL is distributed in the hope that it will be useful,
wolfSSL 0:1239e9b70ca2 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
wolfSSL 0:1239e9b70ca2 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
wolfSSL 0:1239e9b70ca2 15 * GNU General Public License for more details.
wolfSSL 0:1239e9b70ca2 16 *
wolfSSL 0:1239e9b70ca2 17 * You should have received a copy of the GNU General Public License
wolfSSL 0:1239e9b70ca2 18 * along with this program; if not, write to the Free Software
wolfSSL 0:1239e9b70ca2 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
wolfSSL 0:1239e9b70ca2 20 */
wolfSSL 0:1239e9b70ca2 21
wolfSSL 0:1239e9b70ca2 22 #ifdef HAVE_CONFIG_H
wolfSSL 0:1239e9b70ca2 23 #include <config.h>
wolfSSL 0:1239e9b70ca2 24 #endif
wolfSSL 0:1239e9b70ca2 25
wolfSSL 0:1239e9b70ca2 26 #include <cyassl/ctaocrypt/settings.h>
wolfSSL 0:1239e9b70ca2 27
wolfSSL 0:1239e9b70ca2 28 #ifdef HAVE_ERRNO_H
wolfSSL 0:1239e9b70ca2 29 #include <errno.h>
wolfSSL 0:1239e9b70ca2 30 #endif
wolfSSL 0:1239e9b70ca2 31
wolfSSL 0:1239e9b70ca2 32
wolfSSL 0:1239e9b70ca2 33 #include <cyassl/ssl.h>
wolfSSL 0:1239e9b70ca2 34 #include <cyassl/internal.h>
wolfSSL 0:1239e9b70ca2 35 #include <cyassl/error-ssl.h>
wolfSSL 0:1239e9b70ca2 36 #include <cyassl/ctaocrypt/coding.h>
wolfSSL 0:1239e9b70ca2 37
wolfSSL 0:1239e9b70ca2 38 #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
wolfSSL 0:1239e9b70ca2 39 #include <cyassl/openssl/evp.h>
wolfSSL 0:1239e9b70ca2 40 #endif
wolfSSL 0:1239e9b70ca2 41
wolfSSL 0:1239e9b70ca2 42 #ifdef OPENSSL_EXTRA
wolfSSL 0:1239e9b70ca2 43 /* openssl headers begin */
wolfSSL 0:1239e9b70ca2 44 #include <cyassl/openssl/hmac.h>
wolfSSL 0:1239e9b70ca2 45 #include <cyassl/openssl/crypto.h>
wolfSSL 0:1239e9b70ca2 46 #include <cyassl/openssl/des.h>
wolfSSL 0:1239e9b70ca2 47 #include <cyassl/openssl/bn.h>
wolfSSL 0:1239e9b70ca2 48 #include <cyassl/openssl/dh.h>
wolfSSL 0:1239e9b70ca2 49 #include <cyassl/openssl/rsa.h>
wolfSSL 0:1239e9b70ca2 50 #include <cyassl/openssl/pem.h>
wolfSSL 0:1239e9b70ca2 51 /* openssl headers end, cyassl internal headers next */
wolfSSL 0:1239e9b70ca2 52 #include <cyassl/ctaocrypt/hmac.h>
wolfSSL 0:1239e9b70ca2 53 #include <cyassl/ctaocrypt/random.h>
wolfSSL 0:1239e9b70ca2 54 #include <cyassl/ctaocrypt/des3.h>
wolfSSL 0:1239e9b70ca2 55 #include <cyassl/ctaocrypt/md4.h>
wolfSSL 0:1239e9b70ca2 56 #include <cyassl/ctaocrypt/md5.h>
wolfSSL 0:1239e9b70ca2 57 #include <cyassl/ctaocrypt/arc4.h>
wolfSSL 0:1239e9b70ca2 58 #ifdef CYASSL_SHA512
wolfSSL 0:1239e9b70ca2 59 #include <cyassl/ctaocrypt/sha512.h>
wolfSSL 0:1239e9b70ca2 60 #endif
wolfSSL 0:1239e9b70ca2 61 #endif
wolfSSL 0:1239e9b70ca2 62
wolfSSL 0:1239e9b70ca2 63 #ifndef NO_FILESYSTEM
wolfSSL 0:1239e9b70ca2 64 #if !defined(USE_WINDOWS_API) && !defined(NO_CYASSL_DIR) \
wolfSSL 0:1239e9b70ca2 65 && !defined(EBSNET)
wolfSSL 0:1239e9b70ca2 66 #include <dirent.h>
wolfSSL 0:1239e9b70ca2 67 #include <sys/stat.h>
wolfSSL 0:1239e9b70ca2 68 #endif
wolfSSL 0:1239e9b70ca2 69 #ifdef EBSNET
wolfSSL 0:1239e9b70ca2 70 #include "vfapi.h"
wolfSSL 0:1239e9b70ca2 71 #include "vfile.h"
wolfSSL 0:1239e9b70ca2 72 #endif
wolfSSL 0:1239e9b70ca2 73 #endif /* NO_FILESYSTEM */
wolfSSL 0:1239e9b70ca2 74
wolfSSL 0:1239e9b70ca2 75 #ifndef TRUE
wolfSSL 0:1239e9b70ca2 76 #define TRUE 1
wolfSSL 0:1239e9b70ca2 77 #endif
wolfSSL 0:1239e9b70ca2 78 #ifndef FALSE
wolfSSL 0:1239e9b70ca2 79 #define FALSE 0
wolfSSL 0:1239e9b70ca2 80 #endif
wolfSSL 0:1239e9b70ca2 81
wolfSSL 0:1239e9b70ca2 82 #ifndef min
wolfSSL 0:1239e9b70ca2 83
wolfSSL 0:1239e9b70ca2 84 static INLINE word32 min(word32 a, word32 b)
wolfSSL 0:1239e9b70ca2 85 {
wolfSSL 0:1239e9b70ca2 86 return a > b ? b : a;
wolfSSL 0:1239e9b70ca2 87 }
wolfSSL 0:1239e9b70ca2 88
wolfSSL 0:1239e9b70ca2 89 #endif /* min */
wolfSSL 0:1239e9b70ca2 90
wolfSSL 0:1239e9b70ca2 91 #ifndef max
wolfSSL 0:1239e9b70ca2 92 #ifdef CYASSL_DTLS
wolfSSL 0:1239e9b70ca2 93 static INLINE word32 max(word32 a, word32 b)
wolfSSL 0:1239e9b70ca2 94 {
wolfSSL 0:1239e9b70ca2 95 return a > b ? a : b;
wolfSSL 0:1239e9b70ca2 96 }
wolfSSL 0:1239e9b70ca2 97 #endif
wolfSSL 0:1239e9b70ca2 98 #endif /* min */
wolfSSL 0:1239e9b70ca2 99
wolfSSL 0:1239e9b70ca2 100
wolfSSL 0:1239e9b70ca2 101 #ifndef CYASSL_LEANPSK
wolfSSL 0:1239e9b70ca2 102 char* mystrnstr(const char* s1, const char* s2, unsigned int n)
wolfSSL 0:1239e9b70ca2 103 {
wolfSSL 0:1239e9b70ca2 104 unsigned int s2_len = (unsigned int)XSTRLEN(s2);
wolfSSL 0:1239e9b70ca2 105
wolfSSL 0:1239e9b70ca2 106 if (s2_len == 0)
wolfSSL 0:1239e9b70ca2 107 return (char*)s1;
wolfSSL 0:1239e9b70ca2 108
wolfSSL 0:1239e9b70ca2 109 while (n >= s2_len && s1[0]) {
wolfSSL 0:1239e9b70ca2 110 if (s1[0] == s2[0])
wolfSSL 0:1239e9b70ca2 111 if (XMEMCMP(s1, s2, s2_len) == 0)
wolfSSL 0:1239e9b70ca2 112 return (char*)s1;
wolfSSL 0:1239e9b70ca2 113 s1++;
wolfSSL 0:1239e9b70ca2 114 n--;
wolfSSL 0:1239e9b70ca2 115 }
wolfSSL 0:1239e9b70ca2 116
wolfSSL 0:1239e9b70ca2 117 return NULL;
wolfSSL 0:1239e9b70ca2 118 }
wolfSSL 0:1239e9b70ca2 119 #endif
wolfSSL 0:1239e9b70ca2 120
wolfSSL 0:1239e9b70ca2 121
wolfSSL 0:1239e9b70ca2 122 /* prevent multiple mutex initializations */
wolfSSL 0:1239e9b70ca2 123 static volatile int initRefCount = 0;
wolfSSL 0:1239e9b70ca2 124 static CyaSSL_Mutex count_mutex; /* init ref count mutex */
wolfSSL 0:1239e9b70ca2 125
wolfSSL 0:1239e9b70ca2 126
wolfSSL 0:1239e9b70ca2 127 CYASSL_CTX* CyaSSL_CTX_new(CYASSL_METHOD* method)
wolfSSL 0:1239e9b70ca2 128 {
wolfSSL 0:1239e9b70ca2 129 CYASSL_CTX* ctx = NULL;
wolfSSL 0:1239e9b70ca2 130
wolfSSL 0:1239e9b70ca2 131 CYASSL_ENTER("CYASSL_CTX_new");
wolfSSL 0:1239e9b70ca2 132
wolfSSL 0:1239e9b70ca2 133 if (initRefCount == 0)
wolfSSL 0:1239e9b70ca2 134 CyaSSL_Init(); /* user no longer forced to call Init themselves */
wolfSSL 0:1239e9b70ca2 135
wolfSSL 0:1239e9b70ca2 136 if (method == NULL)
wolfSSL 0:1239e9b70ca2 137 return ctx;
wolfSSL 0:1239e9b70ca2 138
wolfSSL 0:1239e9b70ca2 139 ctx = (CYASSL_CTX*) XMALLOC(sizeof(CYASSL_CTX), 0, DYNAMIC_TYPE_CTX);
wolfSSL 0:1239e9b70ca2 140 if (ctx) {
wolfSSL 0:1239e9b70ca2 141 if (InitSSL_Ctx(ctx, method) < 0) {
wolfSSL 0:1239e9b70ca2 142 CYASSL_MSG("Init CTX failed");
wolfSSL 0:1239e9b70ca2 143 CyaSSL_CTX_free(ctx);
wolfSSL 0:1239e9b70ca2 144 ctx = NULL;
wolfSSL 0:1239e9b70ca2 145 }
wolfSSL 0:1239e9b70ca2 146 }
wolfSSL 0:1239e9b70ca2 147 else {
wolfSSL 0:1239e9b70ca2 148 CYASSL_MSG("Alloc CTX failed, method freed");
wolfSSL 0:1239e9b70ca2 149 XFREE(method, NULL, DYNAMIC_TYPE_METHOD);
wolfSSL 0:1239e9b70ca2 150 }
wolfSSL 0:1239e9b70ca2 151
wolfSSL 0:1239e9b70ca2 152 CYASSL_LEAVE("CYASSL_CTX_new", 0);
wolfSSL 0:1239e9b70ca2 153 return ctx;
wolfSSL 0:1239e9b70ca2 154 }
wolfSSL 0:1239e9b70ca2 155
wolfSSL 0:1239e9b70ca2 156
wolfSSL 0:1239e9b70ca2 157 void CyaSSL_CTX_free(CYASSL_CTX* ctx)
wolfSSL 0:1239e9b70ca2 158 {
wolfSSL 0:1239e9b70ca2 159 CYASSL_ENTER("SSL_CTX_free");
wolfSSL 0:1239e9b70ca2 160 if (ctx)
wolfSSL 0:1239e9b70ca2 161 FreeSSL_Ctx(ctx);
wolfSSL 0:1239e9b70ca2 162 CYASSL_LEAVE("SSL_CTX_free", 0);
wolfSSL 0:1239e9b70ca2 163 }
wolfSSL 0:1239e9b70ca2 164
wolfSSL 0:1239e9b70ca2 165
wolfSSL 0:1239e9b70ca2 166 CYASSL* CyaSSL_new(CYASSL_CTX* ctx)
wolfSSL 0:1239e9b70ca2 167 {
wolfSSL 0:1239e9b70ca2 168 CYASSL* ssl = NULL;
wolfSSL 0:1239e9b70ca2 169 int ret = 0;
wolfSSL 0:1239e9b70ca2 170
wolfSSL 0:1239e9b70ca2 171 (void)ret;
wolfSSL 0:1239e9b70ca2 172 CYASSL_ENTER("SSL_new");
wolfSSL 0:1239e9b70ca2 173
wolfSSL 0:1239e9b70ca2 174 if (ctx == NULL)
wolfSSL 0:1239e9b70ca2 175 return ssl;
wolfSSL 0:1239e9b70ca2 176
wolfSSL 0:1239e9b70ca2 177 ssl = (CYASSL*) XMALLOC(sizeof(CYASSL), ctx->heap,DYNAMIC_TYPE_SSL);
wolfSSL 0:1239e9b70ca2 178 if (ssl)
wolfSSL 0:1239e9b70ca2 179 if ( (ret = InitSSL(ssl, ctx)) < 0) {
wolfSSL 0:1239e9b70ca2 180 FreeSSL(ssl);
wolfSSL 0:1239e9b70ca2 181 ssl = 0;
wolfSSL 0:1239e9b70ca2 182 }
wolfSSL 0:1239e9b70ca2 183
wolfSSL 0:1239e9b70ca2 184 CYASSL_LEAVE("SSL_new", ret);
wolfSSL 0:1239e9b70ca2 185 return ssl;
wolfSSL 0:1239e9b70ca2 186 }
wolfSSL 0:1239e9b70ca2 187
wolfSSL 0:1239e9b70ca2 188
wolfSSL 0:1239e9b70ca2 189 void CyaSSL_free(CYASSL* ssl)
wolfSSL 0:1239e9b70ca2 190 {
wolfSSL 0:1239e9b70ca2 191 CYASSL_ENTER("SSL_free");
wolfSSL 0:1239e9b70ca2 192 if (ssl)
wolfSSL 0:1239e9b70ca2 193 FreeSSL(ssl);
wolfSSL 0:1239e9b70ca2 194 CYASSL_LEAVE("SSL_free", 0);
wolfSSL 0:1239e9b70ca2 195 }
wolfSSL 0:1239e9b70ca2 196
wolfSSL 0:1239e9b70ca2 197
wolfSSL 0:1239e9b70ca2 198 int CyaSSL_set_fd(CYASSL* ssl, int fd)
wolfSSL 0:1239e9b70ca2 199 {
wolfSSL 0:1239e9b70ca2 200 CYASSL_ENTER("SSL_set_fd");
wolfSSL 0:1239e9b70ca2 201 ssl->rfd = fd; /* not used directly to allow IO callbacks */
wolfSSL 0:1239e9b70ca2 202 ssl->wfd = fd;
wolfSSL 0:1239e9b70ca2 203
wolfSSL 0:1239e9b70ca2 204 ssl->IOCB_ReadCtx = &ssl->rfd;
wolfSSL 0:1239e9b70ca2 205 ssl->IOCB_WriteCtx = &ssl->wfd;
wolfSSL 0:1239e9b70ca2 206
wolfSSL 0:1239e9b70ca2 207 #ifdef CYASSL_DTLS
wolfSSL 0:1239e9b70ca2 208 if (ssl->options.dtls) {
wolfSSL 0:1239e9b70ca2 209 ssl->IOCB_ReadCtx = &ssl->buffers.dtlsCtx;
wolfSSL 0:1239e9b70ca2 210 ssl->IOCB_WriteCtx = &ssl->buffers.dtlsCtx;
wolfSSL 0:1239e9b70ca2 211 ssl->buffers.dtlsCtx.fd = fd;
wolfSSL 0:1239e9b70ca2 212 }
wolfSSL 0:1239e9b70ca2 213 #endif
wolfSSL 0:1239e9b70ca2 214
wolfSSL 0:1239e9b70ca2 215 CYASSL_LEAVE("SSL_set_fd", SSL_SUCCESS);
wolfSSL 0:1239e9b70ca2 216 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 217 }
wolfSSL 0:1239e9b70ca2 218
wolfSSL 0:1239e9b70ca2 219
wolfSSL 0:1239e9b70ca2 220 int CyaSSL_get_fd(const CYASSL* ssl)
wolfSSL 0:1239e9b70ca2 221 {
wolfSSL 0:1239e9b70ca2 222 CYASSL_ENTER("SSL_get_fd");
wolfSSL 0:1239e9b70ca2 223 CYASSL_LEAVE("SSL_get_fd", ssl->rfd);
wolfSSL 0:1239e9b70ca2 224 return ssl->rfd;
wolfSSL 0:1239e9b70ca2 225 }
wolfSSL 0:1239e9b70ca2 226
wolfSSL 0:1239e9b70ca2 227
wolfSSL 0:1239e9b70ca2 228 int CyaSSL_get_using_nonblock(CYASSL* ssl)
wolfSSL 0:1239e9b70ca2 229 {
wolfSSL 0:1239e9b70ca2 230 CYASSL_ENTER("CyaSSL_get_using_nonblock");
wolfSSL 0:1239e9b70ca2 231 CYASSL_LEAVE("CyaSSL_get_using_nonblock", ssl->options.usingNonblock);
wolfSSL 0:1239e9b70ca2 232 return ssl->options.usingNonblock;
wolfSSL 0:1239e9b70ca2 233 }
wolfSSL 0:1239e9b70ca2 234
wolfSSL 0:1239e9b70ca2 235
wolfSSL 0:1239e9b70ca2 236 int CyaSSL_dtls(CYASSL* ssl)
wolfSSL 0:1239e9b70ca2 237 {
wolfSSL 0:1239e9b70ca2 238 return ssl->options.dtls;
wolfSSL 0:1239e9b70ca2 239 }
wolfSSL 0:1239e9b70ca2 240
wolfSSL 0:1239e9b70ca2 241
wolfSSL 0:1239e9b70ca2 242 #ifndef CYASSL_LEANPSK
wolfSSL 0:1239e9b70ca2 243 void CyaSSL_set_using_nonblock(CYASSL* ssl, int nonblock)
wolfSSL 0:1239e9b70ca2 244 {
wolfSSL 0:1239e9b70ca2 245 CYASSL_ENTER("CyaSSL_set_using_nonblock");
wolfSSL 0:1239e9b70ca2 246 ssl->options.usingNonblock = (nonblock != 0);
wolfSSL 0:1239e9b70ca2 247 }
wolfSSL 0:1239e9b70ca2 248
wolfSSL 0:1239e9b70ca2 249
wolfSSL 0:1239e9b70ca2 250 int CyaSSL_dtls_set_peer(CYASSL* ssl, void* peer, unsigned int peerSz)
wolfSSL 0:1239e9b70ca2 251 {
wolfSSL 0:1239e9b70ca2 252 #ifdef CYASSL_DTLS
wolfSSL 0:1239e9b70ca2 253 void* sa = (void*)XMALLOC(peerSz, ssl->heap, DYNAMIC_TYPE_SOCKADDR);
wolfSSL 0:1239e9b70ca2 254 if (sa != NULL) {
wolfSSL 0:1239e9b70ca2 255 XMEMCPY(sa, peer, peerSz);
wolfSSL 0:1239e9b70ca2 256 ssl->buffers.dtlsCtx.peer.sa = sa;
wolfSSL 0:1239e9b70ca2 257 ssl->buffers.dtlsCtx.peer.sz = peerSz;
wolfSSL 0:1239e9b70ca2 258 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 259 }
wolfSSL 0:1239e9b70ca2 260 return SSL_FAILURE;
wolfSSL 0:1239e9b70ca2 261 #else
wolfSSL 0:1239e9b70ca2 262 (void)ssl;
wolfSSL 0:1239e9b70ca2 263 (void)peer;
wolfSSL 0:1239e9b70ca2 264 (void)peerSz;
wolfSSL 0:1239e9b70ca2 265 return SSL_NOT_IMPLEMENTED;
wolfSSL 0:1239e9b70ca2 266 #endif
wolfSSL 0:1239e9b70ca2 267 }
wolfSSL 0:1239e9b70ca2 268
wolfSSL 0:1239e9b70ca2 269 int CyaSSL_dtls_get_peer(CYASSL* ssl, void* peer, unsigned int* peerSz)
wolfSSL 0:1239e9b70ca2 270 {
wolfSSL 0:1239e9b70ca2 271 #ifdef CYASSL_DTLS
wolfSSL 0:1239e9b70ca2 272 if (peer != NULL && peerSz != NULL
wolfSSL 0:1239e9b70ca2 273 && *peerSz >= ssl->buffers.dtlsCtx.peer.sz) {
wolfSSL 0:1239e9b70ca2 274 *peerSz = ssl->buffers.dtlsCtx.peer.sz;
wolfSSL 0:1239e9b70ca2 275 XMEMCPY(peer, ssl->buffers.dtlsCtx.peer.sa, *peerSz);
wolfSSL 0:1239e9b70ca2 276 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 277 }
wolfSSL 0:1239e9b70ca2 278 return SSL_FAILURE;
wolfSSL 0:1239e9b70ca2 279 #else
wolfSSL 0:1239e9b70ca2 280 (void)ssl;
wolfSSL 0:1239e9b70ca2 281 (void)peer;
wolfSSL 0:1239e9b70ca2 282 (void)peerSz;
wolfSSL 0:1239e9b70ca2 283 return SSL_NOT_IMPLEMENTED;
wolfSSL 0:1239e9b70ca2 284 #endif
wolfSSL 0:1239e9b70ca2 285 }
wolfSSL 0:1239e9b70ca2 286 #endif /* CYASSL_LEANPSK */
wolfSSL 0:1239e9b70ca2 287
wolfSSL 0:1239e9b70ca2 288
wolfSSL 0:1239e9b70ca2 289 /* return underlyig connect or accept, SSL_SUCCESS on ok */
wolfSSL 0:1239e9b70ca2 290 int CyaSSL_negotiate(CYASSL* ssl)
wolfSSL 0:1239e9b70ca2 291 {
wolfSSL 0:1239e9b70ca2 292 int err = SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 293
wolfSSL 0:1239e9b70ca2 294 CYASSL_ENTER("CyaSSL_negotiate");
wolfSSL 0:1239e9b70ca2 295 #ifndef NO_CYASSL_SERVER
wolfSSL 0:1239e9b70ca2 296 if (ssl->options.side == CYASSL_SERVER_END)
wolfSSL 0:1239e9b70ca2 297 err = CyaSSL_accept(ssl);
wolfSSL 0:1239e9b70ca2 298 #endif
wolfSSL 0:1239e9b70ca2 299
wolfSSL 0:1239e9b70ca2 300 #ifndef NO_CYASSL_CLIENT
wolfSSL 0:1239e9b70ca2 301 if (ssl->options.side == CYASSL_CLIENT_END)
wolfSSL 0:1239e9b70ca2 302 err = CyaSSL_connect(ssl);
wolfSSL 0:1239e9b70ca2 303 #endif
wolfSSL 0:1239e9b70ca2 304
wolfSSL 0:1239e9b70ca2 305 CYASSL_LEAVE("CyaSSL_negotiate", err);
wolfSSL 0:1239e9b70ca2 306
wolfSSL 0:1239e9b70ca2 307 return err;
wolfSSL 0:1239e9b70ca2 308 }
wolfSSL 0:1239e9b70ca2 309
wolfSSL 0:1239e9b70ca2 310
wolfSSL 0:1239e9b70ca2 311 #ifndef CYASSL_LEANPSK
wolfSSL 0:1239e9b70ca2 312 /* object size based on build */
wolfSSL 0:1239e9b70ca2 313 int CyaSSL_GetObjectSize(void)
wolfSSL 0:1239e9b70ca2 314 {
wolfSSL 0:1239e9b70ca2 315 #ifdef SHOW_SIZES
wolfSSL 0:1239e9b70ca2 316 printf("sizeof suites = %lu\n", sizeof(Suites));
wolfSSL 0:1239e9b70ca2 317 printf("sizeof ciphers(2) = %lu\n", sizeof(Ciphers));
wolfSSL 0:1239e9b70ca2 318 #ifndef NO_RC4
wolfSSL 0:1239e9b70ca2 319 printf(" sizeof arc4 = %lu\n", sizeof(Arc4));
wolfSSL 0:1239e9b70ca2 320 #endif
wolfSSL 0:1239e9b70ca2 321 printf(" sizeof aes = %lu\n", sizeof(Aes));
wolfSSL 0:1239e9b70ca2 322 #ifndef NO_DES3
wolfSSL 0:1239e9b70ca2 323 printf(" sizeof des3 = %lu\n", sizeof(Des3));
wolfSSL 0:1239e9b70ca2 324 #endif
wolfSSL 0:1239e9b70ca2 325 #ifndef NO_RABBIT
wolfSSL 0:1239e9b70ca2 326 printf(" sizeof rabbit = %lu\n", sizeof(Rabbit));
wolfSSL 0:1239e9b70ca2 327 #endif
wolfSSL 0:1239e9b70ca2 328 printf("sizeof cipher specs = %lu\n", sizeof(CipherSpecs));
wolfSSL 0:1239e9b70ca2 329 printf("sizeof keys = %lu\n", sizeof(Keys));
wolfSSL 0:1239e9b70ca2 330 printf("sizeof Hashes(2) = %lu\n", sizeof(Hashes));
wolfSSL 0:1239e9b70ca2 331 #ifndef NO_MD5
wolfSSL 0:1239e9b70ca2 332 printf(" sizeof MD5 = %lu\n", sizeof(Md5));
wolfSSL 0:1239e9b70ca2 333 #endif
wolfSSL 0:1239e9b70ca2 334 #ifndef NO_SHA
wolfSSL 0:1239e9b70ca2 335 printf(" sizeof SHA = %lu\n", sizeof(Sha));
wolfSSL 0:1239e9b70ca2 336 #endif
wolfSSL 0:1239e9b70ca2 337 #ifndef NO_SHA256
wolfSSL 0:1239e9b70ca2 338 printf(" sizeof SHA256 = %lu\n", sizeof(Sha256));
wolfSSL 0:1239e9b70ca2 339 #endif
wolfSSL 0:1239e9b70ca2 340 #ifdef CYASSL_SHA384
wolfSSL 0:1239e9b70ca2 341 printf(" sizeof SHA384 = %lu\n", sizeof(Sha384));
wolfSSL 0:1239e9b70ca2 342 #endif
wolfSSL 0:1239e9b70ca2 343 #ifdef CYASSL_SHA384
wolfSSL 0:1239e9b70ca2 344 printf(" sizeof SHA512 = %lu\n", sizeof(Sha512));
wolfSSL 0:1239e9b70ca2 345 #endif
wolfSSL 0:1239e9b70ca2 346 printf("sizeof Buffers = %lu\n", sizeof(Buffers));
wolfSSL 0:1239e9b70ca2 347 printf("sizeof Options = %lu\n", sizeof(Options));
wolfSSL 0:1239e9b70ca2 348 printf("sizeof Arrays = %lu\n", sizeof(Arrays));
wolfSSL 0:1239e9b70ca2 349 #ifndef NO_RSA
wolfSSL 0:1239e9b70ca2 350 printf("sizeof RsaKey = %lu\n", sizeof(RsaKey));
wolfSSL 0:1239e9b70ca2 351 #endif
wolfSSL 0:1239e9b70ca2 352 #ifdef HAVE_ECC
wolfSSL 0:1239e9b70ca2 353 printf("sizeof ecc_key = %lu\n", sizeof(ecc_key));
wolfSSL 0:1239e9b70ca2 354 #endif
wolfSSL 0:1239e9b70ca2 355 printf("sizeof CYASSL_CIPHER = %lu\n", sizeof(CYASSL_CIPHER));
wolfSSL 0:1239e9b70ca2 356 printf("sizeof CYASSL_SESSION = %lu\n", sizeof(CYASSL_SESSION));
wolfSSL 0:1239e9b70ca2 357 printf("sizeof CYASSL = %lu\n", sizeof(CYASSL));
wolfSSL 0:1239e9b70ca2 358 printf("sizeof CYASSL_CTX = %lu\n", sizeof(CYASSL_CTX));
wolfSSL 0:1239e9b70ca2 359 #endif
wolfSSL 0:1239e9b70ca2 360
wolfSSL 0:1239e9b70ca2 361 return sizeof(CYASSL);
wolfSSL 0:1239e9b70ca2 362 }
wolfSSL 0:1239e9b70ca2 363 #endif
wolfSSL 0:1239e9b70ca2 364
wolfSSL 0:1239e9b70ca2 365 /* XXX should be NO_DH */
wolfSSL 0:1239e9b70ca2 366 #ifndef NO_CERTS
wolfSSL 0:1239e9b70ca2 367 /* server Diffie-Hellman parameters, SSL_SUCCESS on ok */
wolfSSL 0:1239e9b70ca2 368 int CyaSSL_SetTmpDH(CYASSL* ssl, const unsigned char* p, int pSz,
wolfSSL 0:1239e9b70ca2 369 const unsigned char* g, int gSz)
wolfSSL 0:1239e9b70ca2 370 {
wolfSSL 0:1239e9b70ca2 371 byte havePSK = 0;
wolfSSL 0:1239e9b70ca2 372 byte haveRSA = 1;
wolfSSL 0:1239e9b70ca2 373
wolfSSL 0:1239e9b70ca2 374 CYASSL_ENTER("CyaSSL_SetTmpDH");
wolfSSL 0:1239e9b70ca2 375 if (ssl == NULL || p == NULL || g == NULL) return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 376
wolfSSL 0:1239e9b70ca2 377 if (ssl->options.side != CYASSL_SERVER_END)
wolfSSL 0:1239e9b70ca2 378 return SIDE_ERROR;
wolfSSL 0:1239e9b70ca2 379
wolfSSL 0:1239e9b70ca2 380 if (ssl->buffers.serverDH_P.buffer && ssl->buffers.weOwnDH)
wolfSSL 0:1239e9b70ca2 381 XFREE(ssl->buffers.serverDH_P.buffer, ssl->ctx->heap, DYNAMIC_TYPE_DH);
wolfSSL 0:1239e9b70ca2 382 if (ssl->buffers.serverDH_G.buffer && ssl->buffers.weOwnDH)
wolfSSL 0:1239e9b70ca2 383 XFREE(ssl->buffers.serverDH_G.buffer, ssl->ctx->heap, DYNAMIC_TYPE_DH);
wolfSSL 0:1239e9b70ca2 384
wolfSSL 0:1239e9b70ca2 385 ssl->buffers.weOwnDH = 1; /* SSL owns now */
wolfSSL 0:1239e9b70ca2 386 ssl->buffers.serverDH_P.buffer = (byte*)XMALLOC(pSz, ssl->ctx->heap,
wolfSSL 0:1239e9b70ca2 387 DYNAMIC_TYPE_DH);
wolfSSL 0:1239e9b70ca2 388 if (ssl->buffers.serverDH_P.buffer == NULL)
wolfSSL 0:1239e9b70ca2 389 return MEMORY_E;
wolfSSL 0:1239e9b70ca2 390
wolfSSL 0:1239e9b70ca2 391 ssl->buffers.serverDH_G.buffer = (byte*)XMALLOC(gSz, ssl->ctx->heap,
wolfSSL 0:1239e9b70ca2 392 DYNAMIC_TYPE_DH);
wolfSSL 0:1239e9b70ca2 393 if (ssl->buffers.serverDH_G.buffer == NULL) {
wolfSSL 0:1239e9b70ca2 394 XFREE(ssl->buffers.serverDH_P.buffer, ssl->ctx->heap, DYNAMIC_TYPE_DH);
wolfSSL 0:1239e9b70ca2 395 return MEMORY_E;
wolfSSL 0:1239e9b70ca2 396 }
wolfSSL 0:1239e9b70ca2 397
wolfSSL 0:1239e9b70ca2 398 ssl->buffers.serverDH_P.length = pSz;
wolfSSL 0:1239e9b70ca2 399 ssl->buffers.serverDH_G.length = gSz;
wolfSSL 0:1239e9b70ca2 400
wolfSSL 0:1239e9b70ca2 401 XMEMCPY(ssl->buffers.serverDH_P.buffer, p, pSz);
wolfSSL 0:1239e9b70ca2 402 XMEMCPY(ssl->buffers.serverDH_G.buffer, g, gSz);
wolfSSL 0:1239e9b70ca2 403
wolfSSL 0:1239e9b70ca2 404 ssl->options.haveDH = 1;
wolfSSL 0:1239e9b70ca2 405 #ifndef NO_PSK
wolfSSL 0:1239e9b70ca2 406 havePSK = ssl->options.havePSK;
wolfSSL 0:1239e9b70ca2 407 #endif
wolfSSL 0:1239e9b70ca2 408 #ifdef NO_RSA
wolfSSL 0:1239e9b70ca2 409 haveRSA = 0;
wolfSSL 0:1239e9b70ca2 410 #endif
wolfSSL 0:1239e9b70ca2 411 InitSuites(ssl->suites, ssl->version, haveRSA, havePSK, ssl->options.haveDH,
wolfSSL 0:1239e9b70ca2 412 ssl->options.haveNTRU, ssl->options.haveECDSAsig,
wolfSSL 0:1239e9b70ca2 413 ssl->options.haveStaticECC, ssl->options.side);
wolfSSL 0:1239e9b70ca2 414
wolfSSL 0:1239e9b70ca2 415 CYASSL_LEAVE("CyaSSL_SetTmpDH", 0);
wolfSSL 0:1239e9b70ca2 416 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 417 }
wolfSSL 0:1239e9b70ca2 418 #endif /* !NO_CERTS */
wolfSSL 0:1239e9b70ca2 419
wolfSSL 0:1239e9b70ca2 420
wolfSSL 0:1239e9b70ca2 421 int CyaSSL_write(CYASSL* ssl, const void* data, int sz)
wolfSSL 0:1239e9b70ca2 422 {
wolfSSL 0:1239e9b70ca2 423 int ret;
wolfSSL 0:1239e9b70ca2 424
wolfSSL 0:1239e9b70ca2 425 CYASSL_ENTER("SSL_write()");
wolfSSL 0:1239e9b70ca2 426
wolfSSL 0:1239e9b70ca2 427 if (ssl == NULL || data == NULL || sz < 0)
wolfSSL 0:1239e9b70ca2 428 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 429
wolfSSL 0:1239e9b70ca2 430 #ifdef HAVE_ERRNO_H
wolfSSL 0:1239e9b70ca2 431 errno = 0;
wolfSSL 0:1239e9b70ca2 432 #endif
wolfSSL 0:1239e9b70ca2 433
wolfSSL 0:1239e9b70ca2 434 ret = SendData(ssl, data, sz);
wolfSSL 0:1239e9b70ca2 435
wolfSSL 0:1239e9b70ca2 436 CYASSL_LEAVE("SSL_write()", ret);
wolfSSL 0:1239e9b70ca2 437
wolfSSL 0:1239e9b70ca2 438 if (ret < 0)
wolfSSL 0:1239e9b70ca2 439 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 440 else
wolfSSL 0:1239e9b70ca2 441 return ret;
wolfSSL 0:1239e9b70ca2 442 }
wolfSSL 0:1239e9b70ca2 443
wolfSSL 0:1239e9b70ca2 444
wolfSSL 0:1239e9b70ca2 445 static int CyaSSL_read_internal(CYASSL* ssl, void* data, int sz, int peek)
wolfSSL 0:1239e9b70ca2 446 {
wolfSSL 0:1239e9b70ca2 447 int ret;
wolfSSL 0:1239e9b70ca2 448
wolfSSL 0:1239e9b70ca2 449 CYASSL_ENTER("CyaSSL_read_internal()");
wolfSSL 0:1239e9b70ca2 450
wolfSSL 0:1239e9b70ca2 451 if (ssl == NULL || data == NULL || sz < 0)
wolfSSL 0:1239e9b70ca2 452 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 453
wolfSSL 0:1239e9b70ca2 454 #ifdef HAVE_ERRNO_H
wolfSSL 0:1239e9b70ca2 455 errno = 0;
wolfSSL 0:1239e9b70ca2 456 #endif
wolfSSL 0:1239e9b70ca2 457 #ifdef CYASSL_DTLS
wolfSSL 0:1239e9b70ca2 458 if (ssl->options.dtls)
wolfSSL 0:1239e9b70ca2 459 ssl->dtls_expected_rx = max(sz + 100, MAX_MTU);
wolfSSL 0:1239e9b70ca2 460 #endif
wolfSSL 0:1239e9b70ca2 461
wolfSSL 0:1239e9b70ca2 462 #ifdef HAVE_MAX_FRAGMENT
wolfSSL 0:1239e9b70ca2 463 ret = ReceiveData(ssl, (byte*)data,
wolfSSL 0:1239e9b70ca2 464 min(sz, min(ssl->max_fragment, OUTPUT_RECORD_SIZE)), peek);
wolfSSL 0:1239e9b70ca2 465 #else
wolfSSL 0:1239e9b70ca2 466 ret = ReceiveData(ssl, (byte*)data, min(sz, OUTPUT_RECORD_SIZE), peek);
wolfSSL 0:1239e9b70ca2 467 #endif
wolfSSL 0:1239e9b70ca2 468
wolfSSL 0:1239e9b70ca2 469 CYASSL_LEAVE("CyaSSL_read_internal()", ret);
wolfSSL 0:1239e9b70ca2 470
wolfSSL 0:1239e9b70ca2 471 if (ret < 0)
wolfSSL 0:1239e9b70ca2 472 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 473 else
wolfSSL 0:1239e9b70ca2 474 return ret;
wolfSSL 0:1239e9b70ca2 475 }
wolfSSL 0:1239e9b70ca2 476
wolfSSL 0:1239e9b70ca2 477
wolfSSL 0:1239e9b70ca2 478 int CyaSSL_peek(CYASSL* ssl, void* data, int sz)
wolfSSL 0:1239e9b70ca2 479 {
wolfSSL 0:1239e9b70ca2 480 CYASSL_ENTER("CyaSSL_peek()");
wolfSSL 0:1239e9b70ca2 481
wolfSSL 0:1239e9b70ca2 482 return CyaSSL_read_internal(ssl, data, sz, TRUE);
wolfSSL 0:1239e9b70ca2 483 }
wolfSSL 0:1239e9b70ca2 484
wolfSSL 0:1239e9b70ca2 485
wolfSSL 0:1239e9b70ca2 486 int CyaSSL_read(CYASSL* ssl, void* data, int sz)
wolfSSL 0:1239e9b70ca2 487 {
wolfSSL 0:1239e9b70ca2 488 CYASSL_ENTER("CyaSSL_read()");
wolfSSL 0:1239e9b70ca2 489
wolfSSL 0:1239e9b70ca2 490 return CyaSSL_read_internal(ssl, data, sz, FALSE);
wolfSSL 0:1239e9b70ca2 491 }
wolfSSL 0:1239e9b70ca2 492
wolfSSL 0:1239e9b70ca2 493
wolfSSL 0:1239e9b70ca2 494 #ifdef HAVE_CAVIUM
wolfSSL 0:1239e9b70ca2 495
wolfSSL 0:1239e9b70ca2 496 /* let's use cavium, SSL_SUCCESS on ok */
wolfSSL 0:1239e9b70ca2 497 int CyaSSL_UseCavium(CYASSL* ssl, int devId)
wolfSSL 0:1239e9b70ca2 498 {
wolfSSL 0:1239e9b70ca2 499 if (ssl == NULL)
wolfSSL 0:1239e9b70ca2 500 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 501
wolfSSL 0:1239e9b70ca2 502 ssl->devId = devId;
wolfSSL 0:1239e9b70ca2 503
wolfSSL 0:1239e9b70ca2 504 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 505 }
wolfSSL 0:1239e9b70ca2 506
wolfSSL 0:1239e9b70ca2 507
wolfSSL 0:1239e9b70ca2 508 /* let's use cavium, SSL_SUCCESS on ok */
wolfSSL 0:1239e9b70ca2 509 int CyaSSL_CTX_UseCavium(CYASSL_CTX* ctx, int devId)
wolfSSL 0:1239e9b70ca2 510 {
wolfSSL 0:1239e9b70ca2 511 if (ctx == NULL)
wolfSSL 0:1239e9b70ca2 512 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 513
wolfSSL 0:1239e9b70ca2 514 ctx->devId = devId;
wolfSSL 0:1239e9b70ca2 515
wolfSSL 0:1239e9b70ca2 516 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 517 }
wolfSSL 0:1239e9b70ca2 518
wolfSSL 0:1239e9b70ca2 519
wolfSSL 0:1239e9b70ca2 520 #endif /* HAVE_CAVIUM */
wolfSSL 0:1239e9b70ca2 521
wolfSSL 0:1239e9b70ca2 522 #ifdef HAVE_SNI
wolfSSL 0:1239e9b70ca2 523
wolfSSL 0:1239e9b70ca2 524 int CyaSSL_UseSNI(CYASSL* ssl, byte type, const void* data, word16 size)
wolfSSL 0:1239e9b70ca2 525 {
wolfSSL 0:1239e9b70ca2 526 if (ssl == NULL)
wolfSSL 0:1239e9b70ca2 527 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 528
wolfSSL 0:1239e9b70ca2 529 return TLSX_UseSNI(&ssl->extensions, type, data, size);
wolfSSL 0:1239e9b70ca2 530 }
wolfSSL 0:1239e9b70ca2 531
wolfSSL 0:1239e9b70ca2 532 int CyaSSL_CTX_UseSNI(CYASSL_CTX* ctx, byte type, const void* data, word16 size)
wolfSSL 0:1239e9b70ca2 533 {
wolfSSL 0:1239e9b70ca2 534 if (ctx == NULL)
wolfSSL 0:1239e9b70ca2 535 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 536
wolfSSL 0:1239e9b70ca2 537 return TLSX_UseSNI(&ctx->extensions, type, data, size);
wolfSSL 0:1239e9b70ca2 538 }
wolfSSL 0:1239e9b70ca2 539
wolfSSL 0:1239e9b70ca2 540 #ifndef NO_CYASSL_SERVER
wolfSSL 0:1239e9b70ca2 541
wolfSSL 0:1239e9b70ca2 542 void CyaSSL_SNI_SetOptions(CYASSL* ssl, byte type, byte options)
wolfSSL 0:1239e9b70ca2 543 {
wolfSSL 0:1239e9b70ca2 544 if (ssl && ssl->extensions)
wolfSSL 0:1239e9b70ca2 545 TLSX_SNI_SetOptions(ssl->extensions, type, options);
wolfSSL 0:1239e9b70ca2 546 }
wolfSSL 0:1239e9b70ca2 547
wolfSSL 0:1239e9b70ca2 548 void CyaSSL_CTX_SNI_SetOptions(CYASSL_CTX* ctx, byte type, byte options)
wolfSSL 0:1239e9b70ca2 549 {
wolfSSL 0:1239e9b70ca2 550 if (ctx && ctx->extensions)
wolfSSL 0:1239e9b70ca2 551 TLSX_SNI_SetOptions(ctx->extensions, type, options);
wolfSSL 0:1239e9b70ca2 552 }
wolfSSL 0:1239e9b70ca2 553
wolfSSL 0:1239e9b70ca2 554 byte CyaSSL_SNI_Status(CYASSL* ssl, byte type)
wolfSSL 0:1239e9b70ca2 555 {
wolfSSL 0:1239e9b70ca2 556 return TLSX_SNI_Status(ssl ? ssl->extensions : NULL, type);
wolfSSL 0:1239e9b70ca2 557 }
wolfSSL 0:1239e9b70ca2 558
wolfSSL 0:1239e9b70ca2 559 word16 CyaSSL_SNI_GetRequest(CYASSL* ssl, byte type, void** data)
wolfSSL 0:1239e9b70ca2 560 {
wolfSSL 0:1239e9b70ca2 561 if (data)
wolfSSL 0:1239e9b70ca2 562 *data = NULL;
wolfSSL 0:1239e9b70ca2 563
wolfSSL 0:1239e9b70ca2 564 if (ssl && ssl->extensions)
wolfSSL 0:1239e9b70ca2 565 return TLSX_SNI_GetRequest(ssl->extensions, type, data);
wolfSSL 0:1239e9b70ca2 566
wolfSSL 0:1239e9b70ca2 567 return 0;
wolfSSL 0:1239e9b70ca2 568 }
wolfSSL 0:1239e9b70ca2 569
wolfSSL 0:1239e9b70ca2 570 int CyaSSL_SNI_GetFromBuffer(const byte* clientHello, word32 helloSz, byte type,
wolfSSL 0:1239e9b70ca2 571 byte* sni, word32* inOutSz)
wolfSSL 0:1239e9b70ca2 572 {
wolfSSL 0:1239e9b70ca2 573 if (clientHello && helloSz > 0 && sni && inOutSz && *inOutSz > 0)
wolfSSL 0:1239e9b70ca2 574 return TLSX_SNI_GetFromBuffer(clientHello, helloSz, type, sni, inOutSz);
wolfSSL 0:1239e9b70ca2 575
wolfSSL 0:1239e9b70ca2 576 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 577 }
wolfSSL 0:1239e9b70ca2 578
wolfSSL 0:1239e9b70ca2 579 #endif /* NO_CYASSL_SERVER */
wolfSSL 0:1239e9b70ca2 580
wolfSSL 0:1239e9b70ca2 581 #endif /* HAVE_SNI */
wolfSSL 0:1239e9b70ca2 582
wolfSSL 0:1239e9b70ca2 583
wolfSSL 0:1239e9b70ca2 584 #ifdef HAVE_MAX_FRAGMENT
wolfSSL 0:1239e9b70ca2 585 #ifndef NO_CYASSL_CLIENT
wolfSSL 0:1239e9b70ca2 586 int CyaSSL_UseMaxFragment(CYASSL* ssl, byte mfl)
wolfSSL 0:1239e9b70ca2 587 {
wolfSSL 0:1239e9b70ca2 588 if (ssl == NULL)
wolfSSL 0:1239e9b70ca2 589 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 590
wolfSSL 0:1239e9b70ca2 591 return TLSX_UseMaxFragment(&ssl->extensions, mfl);
wolfSSL 0:1239e9b70ca2 592 }
wolfSSL 0:1239e9b70ca2 593
wolfSSL 0:1239e9b70ca2 594 int CyaSSL_CTX_UseMaxFragment(CYASSL_CTX* ctx, byte mfl)
wolfSSL 0:1239e9b70ca2 595 {
wolfSSL 0:1239e9b70ca2 596 if (ctx == NULL)
wolfSSL 0:1239e9b70ca2 597 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 598
wolfSSL 0:1239e9b70ca2 599 return TLSX_UseMaxFragment(&ctx->extensions, mfl);
wolfSSL 0:1239e9b70ca2 600 }
wolfSSL 0:1239e9b70ca2 601 #endif /* NO_CYASSL_CLIENT */
wolfSSL 0:1239e9b70ca2 602 #endif /* HAVE_MAX_FRAGMENT */
wolfSSL 0:1239e9b70ca2 603
wolfSSL 0:1239e9b70ca2 604 #ifdef HAVE_TRUNCATED_HMAC
wolfSSL 0:1239e9b70ca2 605 #ifndef NO_CYASSL_CLIENT
wolfSSL 0:1239e9b70ca2 606 int CyaSSL_UseTruncatedHMAC(CYASSL* ssl)
wolfSSL 0:1239e9b70ca2 607 {
wolfSSL 0:1239e9b70ca2 608 if (ssl == NULL)
wolfSSL 0:1239e9b70ca2 609 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 610
wolfSSL 0:1239e9b70ca2 611 return TLSX_UseTruncatedHMAC(&ssl->extensions);
wolfSSL 0:1239e9b70ca2 612 }
wolfSSL 0:1239e9b70ca2 613
wolfSSL 0:1239e9b70ca2 614 int CyaSSL_CTX_UseTruncatedHMAC(CYASSL_CTX* ctx)
wolfSSL 0:1239e9b70ca2 615 {
wolfSSL 0:1239e9b70ca2 616 if (ctx == NULL)
wolfSSL 0:1239e9b70ca2 617 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 618
wolfSSL 0:1239e9b70ca2 619 return TLSX_UseTruncatedHMAC(&ctx->extensions);
wolfSSL 0:1239e9b70ca2 620 }
wolfSSL 0:1239e9b70ca2 621 #endif /* NO_CYASSL_CLIENT */
wolfSSL 0:1239e9b70ca2 622 #endif /* HAVE_TRUNCATED_HMAC */
wolfSSL 0:1239e9b70ca2 623
wolfSSL 0:1239e9b70ca2 624 /* Elliptic Curves */
wolfSSL 0:1239e9b70ca2 625 #ifdef HAVE_SUPPORTED_CURVES
wolfSSL 0:1239e9b70ca2 626 #ifndef NO_CYASSL_CLIENT
wolfSSL 0:1239e9b70ca2 627
wolfSSL 0:1239e9b70ca2 628 int CyaSSL_UseSupportedCurve(CYASSL* ssl, word16 name)
wolfSSL 0:1239e9b70ca2 629 {
wolfSSL 0:1239e9b70ca2 630 if (ssl == NULL)
wolfSSL 0:1239e9b70ca2 631 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 632
wolfSSL 0:1239e9b70ca2 633 switch (name) {
wolfSSL 0:1239e9b70ca2 634 case CYASSL_ECC_SECP160R1:
wolfSSL 0:1239e9b70ca2 635 case CYASSL_ECC_SECP192R1:
wolfSSL 0:1239e9b70ca2 636 case CYASSL_ECC_SECP224R1:
wolfSSL 0:1239e9b70ca2 637 case CYASSL_ECC_SECP256R1:
wolfSSL 0:1239e9b70ca2 638 case CYASSL_ECC_SECP384R1:
wolfSSL 0:1239e9b70ca2 639 case CYASSL_ECC_SECP521R1:
wolfSSL 0:1239e9b70ca2 640 break;
wolfSSL 0:1239e9b70ca2 641
wolfSSL 0:1239e9b70ca2 642 default:
wolfSSL 0:1239e9b70ca2 643 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 644 }
wolfSSL 0:1239e9b70ca2 645
wolfSSL 0:1239e9b70ca2 646 return TLSX_UseSupportedCurve(&ssl->extensions, name);
wolfSSL 0:1239e9b70ca2 647 }
wolfSSL 0:1239e9b70ca2 648
wolfSSL 0:1239e9b70ca2 649 int CyaSSL_CTX_UseSupportedCurve(CYASSL_CTX* ctx, word16 name)
wolfSSL 0:1239e9b70ca2 650 {
wolfSSL 0:1239e9b70ca2 651 if (ctx == NULL)
wolfSSL 0:1239e9b70ca2 652 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 653
wolfSSL 0:1239e9b70ca2 654 switch (name) {
wolfSSL 0:1239e9b70ca2 655 case CYASSL_ECC_SECP160R1:
wolfSSL 0:1239e9b70ca2 656 case CYASSL_ECC_SECP192R1:
wolfSSL 0:1239e9b70ca2 657 case CYASSL_ECC_SECP224R1:
wolfSSL 0:1239e9b70ca2 658 case CYASSL_ECC_SECP256R1:
wolfSSL 0:1239e9b70ca2 659 case CYASSL_ECC_SECP384R1:
wolfSSL 0:1239e9b70ca2 660 case CYASSL_ECC_SECP521R1:
wolfSSL 0:1239e9b70ca2 661 break;
wolfSSL 0:1239e9b70ca2 662
wolfSSL 0:1239e9b70ca2 663 default:
wolfSSL 0:1239e9b70ca2 664 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 665 }
wolfSSL 0:1239e9b70ca2 666
wolfSSL 0:1239e9b70ca2 667 return TLSX_UseSupportedCurve(&ctx->extensions, name);
wolfSSL 0:1239e9b70ca2 668 }
wolfSSL 0:1239e9b70ca2 669
wolfSSL 0:1239e9b70ca2 670 #endif /* NO_CYASSL_CLIENT */
wolfSSL 0:1239e9b70ca2 671 #endif /* HAVE_SUPPORTED_CURVES */
wolfSSL 0:1239e9b70ca2 672
wolfSSL 0:1239e9b70ca2 673
wolfSSL 0:1239e9b70ca2 674 #ifndef CYASSL_LEANPSK
wolfSSL 0:1239e9b70ca2 675 int CyaSSL_send(CYASSL* ssl, const void* data, int sz, int flags)
wolfSSL 0:1239e9b70ca2 676 {
wolfSSL 0:1239e9b70ca2 677 int ret;
wolfSSL 0:1239e9b70ca2 678 int oldFlags;
wolfSSL 0:1239e9b70ca2 679
wolfSSL 0:1239e9b70ca2 680 CYASSL_ENTER("CyaSSL_send()");
wolfSSL 0:1239e9b70ca2 681
wolfSSL 0:1239e9b70ca2 682 if (ssl == NULL || data == NULL || sz < 0)
wolfSSL 0:1239e9b70ca2 683 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 684
wolfSSL 0:1239e9b70ca2 685 oldFlags = ssl->wflags;
wolfSSL 0:1239e9b70ca2 686
wolfSSL 0:1239e9b70ca2 687 ssl->wflags = flags;
wolfSSL 0:1239e9b70ca2 688 ret = CyaSSL_write(ssl, data, sz);
wolfSSL 0:1239e9b70ca2 689 ssl->wflags = oldFlags;
wolfSSL 0:1239e9b70ca2 690
wolfSSL 0:1239e9b70ca2 691 CYASSL_LEAVE("CyaSSL_send()", ret);
wolfSSL 0:1239e9b70ca2 692
wolfSSL 0:1239e9b70ca2 693 return ret;
wolfSSL 0:1239e9b70ca2 694 }
wolfSSL 0:1239e9b70ca2 695
wolfSSL 0:1239e9b70ca2 696
wolfSSL 0:1239e9b70ca2 697 int CyaSSL_recv(CYASSL* ssl, void* data, int sz, int flags)
wolfSSL 0:1239e9b70ca2 698 {
wolfSSL 0:1239e9b70ca2 699 int ret;
wolfSSL 0:1239e9b70ca2 700 int oldFlags;
wolfSSL 0:1239e9b70ca2 701
wolfSSL 0:1239e9b70ca2 702 CYASSL_ENTER("CyaSSL_recv()");
wolfSSL 0:1239e9b70ca2 703
wolfSSL 0:1239e9b70ca2 704 if (ssl == NULL || data == NULL || sz < 0)
wolfSSL 0:1239e9b70ca2 705 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 706
wolfSSL 0:1239e9b70ca2 707 oldFlags = ssl->rflags;
wolfSSL 0:1239e9b70ca2 708
wolfSSL 0:1239e9b70ca2 709 ssl->rflags = flags;
wolfSSL 0:1239e9b70ca2 710 ret = CyaSSL_read(ssl, data, sz);
wolfSSL 0:1239e9b70ca2 711 ssl->rflags = oldFlags;
wolfSSL 0:1239e9b70ca2 712
wolfSSL 0:1239e9b70ca2 713 CYASSL_LEAVE("CyaSSL_recv()", ret);
wolfSSL 0:1239e9b70ca2 714
wolfSSL 0:1239e9b70ca2 715 return ret;
wolfSSL 0:1239e9b70ca2 716 }
wolfSSL 0:1239e9b70ca2 717 #endif
wolfSSL 0:1239e9b70ca2 718
wolfSSL 0:1239e9b70ca2 719
wolfSSL 0:1239e9b70ca2 720 /* SSL_SUCCESS on ok */
wolfSSL 0:1239e9b70ca2 721 int CyaSSL_shutdown(CYASSL* ssl)
wolfSSL 0:1239e9b70ca2 722 {
wolfSSL 0:1239e9b70ca2 723 CYASSL_ENTER("SSL_shutdown()");
wolfSSL 0:1239e9b70ca2 724
wolfSSL 0:1239e9b70ca2 725 if (ssl == NULL)
wolfSSL 0:1239e9b70ca2 726 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 727
wolfSSL 0:1239e9b70ca2 728 if (ssl->options.quietShutdown) {
wolfSSL 0:1239e9b70ca2 729 CYASSL_MSG("quiet shutdown, no close notify sent");
wolfSSL 0:1239e9b70ca2 730 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 731 }
wolfSSL 0:1239e9b70ca2 732
wolfSSL 0:1239e9b70ca2 733 /* try to send close notify, not an error if can't */
wolfSSL 0:1239e9b70ca2 734 if (!ssl->options.isClosed && !ssl->options.connReset &&
wolfSSL 0:1239e9b70ca2 735 !ssl->options.sentNotify) {
wolfSSL 0:1239e9b70ca2 736 ssl->error = SendAlert(ssl, alert_warning, close_notify);
wolfSSL 0:1239e9b70ca2 737 if (ssl->error < 0) {
wolfSSL 0:1239e9b70ca2 738 CYASSL_ERROR(ssl->error);
wolfSSL 0:1239e9b70ca2 739 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 740 }
wolfSSL 0:1239e9b70ca2 741 ssl->options.sentNotify = 1; /* don't send close_notify twice */
wolfSSL 0:1239e9b70ca2 742 }
wolfSSL 0:1239e9b70ca2 743
wolfSSL 0:1239e9b70ca2 744 CYASSL_LEAVE("SSL_shutdown()", ssl->error);
wolfSSL 0:1239e9b70ca2 745
wolfSSL 0:1239e9b70ca2 746 ssl->error = SSL_ERROR_SYSCALL; /* simulate OpenSSL behavior */
wolfSSL 0:1239e9b70ca2 747
wolfSSL 0:1239e9b70ca2 748 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 749 }
wolfSSL 0:1239e9b70ca2 750
wolfSSL 0:1239e9b70ca2 751
wolfSSL 0:1239e9b70ca2 752 int CyaSSL_get_error(CYASSL* ssl, int ret)
wolfSSL 0:1239e9b70ca2 753 {
wolfSSL 0:1239e9b70ca2 754 CYASSL_ENTER("SSL_get_error");
wolfSSL 0:1239e9b70ca2 755
wolfSSL 0:1239e9b70ca2 756 if (ret > 0)
wolfSSL 0:1239e9b70ca2 757 return SSL_ERROR_NONE;
wolfSSL 0:1239e9b70ca2 758 if (ssl == NULL)
wolfSSL 0:1239e9b70ca2 759 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 760
wolfSSL 0:1239e9b70ca2 761 CYASSL_LEAVE("SSL_get_error", ssl->error);
wolfSSL 0:1239e9b70ca2 762
wolfSSL 0:1239e9b70ca2 763 /* make sure converted types are handled in SetErrorString() too */
wolfSSL 0:1239e9b70ca2 764 if (ssl->error == WANT_READ)
wolfSSL 0:1239e9b70ca2 765 return SSL_ERROR_WANT_READ; /* convert to OpenSSL type */
wolfSSL 0:1239e9b70ca2 766 else if (ssl->error == WANT_WRITE)
wolfSSL 0:1239e9b70ca2 767 return SSL_ERROR_WANT_WRITE; /* convert to OpenSSL type */
wolfSSL 0:1239e9b70ca2 768 else if (ssl->error == ZERO_RETURN)
wolfSSL 0:1239e9b70ca2 769 return SSL_ERROR_ZERO_RETURN; /* convert to OpenSSL type */
wolfSSL 0:1239e9b70ca2 770 return ssl->error;
wolfSSL 0:1239e9b70ca2 771 }
wolfSSL 0:1239e9b70ca2 772
wolfSSL 0:1239e9b70ca2 773
wolfSSL 0:1239e9b70ca2 774 /* retrive alert history, SSL_SUCCESS on ok */
wolfSSL 0:1239e9b70ca2 775 int CyaSSL_get_alert_history(CYASSL* ssl, CYASSL_ALERT_HISTORY *h)
wolfSSL 0:1239e9b70ca2 776 {
wolfSSL 0:1239e9b70ca2 777 if (ssl && h) {
wolfSSL 0:1239e9b70ca2 778 *h = ssl->alert_history;
wolfSSL 0:1239e9b70ca2 779 }
wolfSSL 0:1239e9b70ca2 780 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 781 }
wolfSSL 0:1239e9b70ca2 782
wolfSSL 0:1239e9b70ca2 783
wolfSSL 0:1239e9b70ca2 784 /* return TRUE if current error is want read */
wolfSSL 0:1239e9b70ca2 785 int CyaSSL_want_read(CYASSL* ssl)
wolfSSL 0:1239e9b70ca2 786 {
wolfSSL 0:1239e9b70ca2 787 CYASSL_ENTER("SSL_want_read");
wolfSSL 0:1239e9b70ca2 788 if (ssl->error == WANT_READ)
wolfSSL 0:1239e9b70ca2 789 return 1;
wolfSSL 0:1239e9b70ca2 790
wolfSSL 0:1239e9b70ca2 791 return 0;
wolfSSL 0:1239e9b70ca2 792 }
wolfSSL 0:1239e9b70ca2 793
wolfSSL 0:1239e9b70ca2 794
wolfSSL 0:1239e9b70ca2 795 /* return TRUE if current error is want write */
wolfSSL 0:1239e9b70ca2 796 int CyaSSL_want_write(CYASSL* ssl)
wolfSSL 0:1239e9b70ca2 797 {
wolfSSL 0:1239e9b70ca2 798 CYASSL_ENTER("SSL_want_write");
wolfSSL 0:1239e9b70ca2 799 if (ssl->error == WANT_WRITE)
wolfSSL 0:1239e9b70ca2 800 return 1;
wolfSSL 0:1239e9b70ca2 801
wolfSSL 0:1239e9b70ca2 802 return 0;
wolfSSL 0:1239e9b70ca2 803 }
wolfSSL 0:1239e9b70ca2 804
wolfSSL 0:1239e9b70ca2 805
wolfSSL 0:1239e9b70ca2 806 char* CyaSSL_ERR_error_string(unsigned long errNumber, char* data)
wolfSSL 0:1239e9b70ca2 807 {
wolfSSL 0:1239e9b70ca2 808 static const char* msg = "Please supply a buffer for error string";
wolfSSL 0:1239e9b70ca2 809
wolfSSL 0:1239e9b70ca2 810 CYASSL_ENTER("ERR_error_string");
wolfSSL 0:1239e9b70ca2 811 if (data) {
wolfSSL 0:1239e9b70ca2 812 SetErrorString((int)errNumber, data);
wolfSSL 0:1239e9b70ca2 813 return data;
wolfSSL 0:1239e9b70ca2 814 }
wolfSSL 0:1239e9b70ca2 815
wolfSSL 0:1239e9b70ca2 816 return (char*)msg;
wolfSSL 0:1239e9b70ca2 817 }
wolfSSL 0:1239e9b70ca2 818
wolfSSL 0:1239e9b70ca2 819
wolfSSL 0:1239e9b70ca2 820 void CyaSSL_ERR_error_string_n(unsigned long e, char* buf, unsigned long len)
wolfSSL 0:1239e9b70ca2 821 {
wolfSSL 0:1239e9b70ca2 822 CYASSL_ENTER("CyaSSL_ERR_error_string_n");
wolfSSL 0:1239e9b70ca2 823 if (len >= CYASSL_MAX_ERROR_SZ)
wolfSSL 0:1239e9b70ca2 824 CyaSSL_ERR_error_string(e, buf);
wolfSSL 0:1239e9b70ca2 825 else {
wolfSSL 0:1239e9b70ca2 826 char tmp[CYASSL_MAX_ERROR_SZ];
wolfSSL 0:1239e9b70ca2 827
wolfSSL 0:1239e9b70ca2 828 CYASSL_MSG("Error buffer too short, truncating");
wolfSSL 0:1239e9b70ca2 829 if (len) {
wolfSSL 0:1239e9b70ca2 830 CyaSSL_ERR_error_string(e, tmp);
wolfSSL 0:1239e9b70ca2 831 XMEMCPY(buf, tmp, len-1);
wolfSSL 0:1239e9b70ca2 832 buf[len-1] = '\0';
wolfSSL 0:1239e9b70ca2 833 }
wolfSSL 0:1239e9b70ca2 834 }
wolfSSL 0:1239e9b70ca2 835 }
wolfSSL 0:1239e9b70ca2 836
wolfSSL 0:1239e9b70ca2 837
wolfSSL 0:1239e9b70ca2 838 /* don't free temporary arrays at end of handshake */
wolfSSL 0:1239e9b70ca2 839 void CyaSSL_KeepArrays(CYASSL* ssl)
wolfSSL 0:1239e9b70ca2 840 {
wolfSSL 0:1239e9b70ca2 841 if (ssl)
wolfSSL 0:1239e9b70ca2 842 ssl->options.saveArrays = 1;
wolfSSL 0:1239e9b70ca2 843 }
wolfSSL 0:1239e9b70ca2 844
wolfSSL 0:1239e9b70ca2 845
wolfSSL 0:1239e9b70ca2 846 /* user doesn't need temporary arrays anymore, Free */
wolfSSL 0:1239e9b70ca2 847 void CyaSSL_FreeArrays(CYASSL* ssl)
wolfSSL 0:1239e9b70ca2 848 {
wolfSSL 0:1239e9b70ca2 849 if (ssl && ssl->options.handShakeState == HANDSHAKE_DONE) {
wolfSSL 0:1239e9b70ca2 850 ssl->options.saveArrays = 0;
wolfSSL 0:1239e9b70ca2 851 FreeArrays(ssl, 1);
wolfSSL 0:1239e9b70ca2 852 }
wolfSSL 0:1239e9b70ca2 853 }
wolfSSL 0:1239e9b70ca2 854
wolfSSL 0:1239e9b70ca2 855
wolfSSL 0:1239e9b70ca2 856 const byte* CyaSSL_GetMacSecret(CYASSL* ssl, int verify)
wolfSSL 0:1239e9b70ca2 857 {
wolfSSL 0:1239e9b70ca2 858 if (ssl == NULL)
wolfSSL 0:1239e9b70ca2 859 return NULL;
wolfSSL 0:1239e9b70ca2 860
wolfSSL 0:1239e9b70ca2 861 if ( (ssl->options.side == CYASSL_CLIENT_END && !verify) ||
wolfSSL 0:1239e9b70ca2 862 (ssl->options.side == CYASSL_SERVER_END && verify) )
wolfSSL 0:1239e9b70ca2 863 return ssl->keys.client_write_MAC_secret;
wolfSSL 0:1239e9b70ca2 864 else
wolfSSL 0:1239e9b70ca2 865 return ssl->keys.server_write_MAC_secret;
wolfSSL 0:1239e9b70ca2 866 }
wolfSSL 0:1239e9b70ca2 867
wolfSSL 0:1239e9b70ca2 868
wolfSSL 0:1239e9b70ca2 869 #ifdef ATOMIC_USER
wolfSSL 0:1239e9b70ca2 870
wolfSSL 0:1239e9b70ca2 871 void CyaSSL_CTX_SetMacEncryptCb(CYASSL_CTX* ctx, CallbackMacEncrypt cb)
wolfSSL 0:1239e9b70ca2 872 {
wolfSSL 0:1239e9b70ca2 873 if (ctx)
wolfSSL 0:1239e9b70ca2 874 ctx->MacEncryptCb = cb;
wolfSSL 0:1239e9b70ca2 875 }
wolfSSL 0:1239e9b70ca2 876
wolfSSL 0:1239e9b70ca2 877
wolfSSL 0:1239e9b70ca2 878 void CyaSSL_SetMacEncryptCtx(CYASSL* ssl, void *ctx)
wolfSSL 0:1239e9b70ca2 879 {
wolfSSL 0:1239e9b70ca2 880 if (ssl)
wolfSSL 0:1239e9b70ca2 881 ssl->MacEncryptCtx = ctx;
wolfSSL 0:1239e9b70ca2 882 }
wolfSSL 0:1239e9b70ca2 883
wolfSSL 0:1239e9b70ca2 884
wolfSSL 0:1239e9b70ca2 885 void* CyaSSL_GetMacEncryptCtx(CYASSL* ssl)
wolfSSL 0:1239e9b70ca2 886 {
wolfSSL 0:1239e9b70ca2 887 if (ssl)
wolfSSL 0:1239e9b70ca2 888 return ssl->MacEncryptCtx;
wolfSSL 0:1239e9b70ca2 889
wolfSSL 0:1239e9b70ca2 890 return NULL;
wolfSSL 0:1239e9b70ca2 891 }
wolfSSL 0:1239e9b70ca2 892
wolfSSL 0:1239e9b70ca2 893
wolfSSL 0:1239e9b70ca2 894 void CyaSSL_CTX_SetDecryptVerifyCb(CYASSL_CTX* ctx, CallbackDecryptVerify cb)
wolfSSL 0:1239e9b70ca2 895 {
wolfSSL 0:1239e9b70ca2 896 if (ctx)
wolfSSL 0:1239e9b70ca2 897 ctx->DecryptVerifyCb = cb;
wolfSSL 0:1239e9b70ca2 898 }
wolfSSL 0:1239e9b70ca2 899
wolfSSL 0:1239e9b70ca2 900
wolfSSL 0:1239e9b70ca2 901 void CyaSSL_SetDecryptVerifyCtx(CYASSL* ssl, void *ctx)
wolfSSL 0:1239e9b70ca2 902 {
wolfSSL 0:1239e9b70ca2 903 if (ssl)
wolfSSL 0:1239e9b70ca2 904 ssl->DecryptVerifyCtx = ctx;
wolfSSL 0:1239e9b70ca2 905 }
wolfSSL 0:1239e9b70ca2 906
wolfSSL 0:1239e9b70ca2 907
wolfSSL 0:1239e9b70ca2 908 void* CyaSSL_GetDecryptVerifyCtx(CYASSL* ssl)
wolfSSL 0:1239e9b70ca2 909 {
wolfSSL 0:1239e9b70ca2 910 if (ssl)
wolfSSL 0:1239e9b70ca2 911 return ssl->DecryptVerifyCtx;
wolfSSL 0:1239e9b70ca2 912
wolfSSL 0:1239e9b70ca2 913 return NULL;
wolfSSL 0:1239e9b70ca2 914 }
wolfSSL 0:1239e9b70ca2 915
wolfSSL 0:1239e9b70ca2 916
wolfSSL 0:1239e9b70ca2 917 const byte* CyaSSL_GetClientWriteKey(CYASSL* ssl)
wolfSSL 0:1239e9b70ca2 918 {
wolfSSL 0:1239e9b70ca2 919 if (ssl)
wolfSSL 0:1239e9b70ca2 920 return ssl->keys.client_write_key;
wolfSSL 0:1239e9b70ca2 921
wolfSSL 0:1239e9b70ca2 922 return NULL;
wolfSSL 0:1239e9b70ca2 923 }
wolfSSL 0:1239e9b70ca2 924
wolfSSL 0:1239e9b70ca2 925
wolfSSL 0:1239e9b70ca2 926 const byte* CyaSSL_GetClientWriteIV(CYASSL* ssl)
wolfSSL 0:1239e9b70ca2 927 {
wolfSSL 0:1239e9b70ca2 928 if (ssl)
wolfSSL 0:1239e9b70ca2 929 return ssl->keys.client_write_IV;
wolfSSL 0:1239e9b70ca2 930
wolfSSL 0:1239e9b70ca2 931 return NULL;
wolfSSL 0:1239e9b70ca2 932 }
wolfSSL 0:1239e9b70ca2 933
wolfSSL 0:1239e9b70ca2 934
wolfSSL 0:1239e9b70ca2 935 const byte* CyaSSL_GetServerWriteKey(CYASSL* ssl)
wolfSSL 0:1239e9b70ca2 936 {
wolfSSL 0:1239e9b70ca2 937 if (ssl)
wolfSSL 0:1239e9b70ca2 938 return ssl->keys.server_write_key;
wolfSSL 0:1239e9b70ca2 939
wolfSSL 0:1239e9b70ca2 940 return NULL;
wolfSSL 0:1239e9b70ca2 941 }
wolfSSL 0:1239e9b70ca2 942
wolfSSL 0:1239e9b70ca2 943
wolfSSL 0:1239e9b70ca2 944 const byte* CyaSSL_GetServerWriteIV(CYASSL* ssl)
wolfSSL 0:1239e9b70ca2 945 {
wolfSSL 0:1239e9b70ca2 946 if (ssl)
wolfSSL 0:1239e9b70ca2 947 return ssl->keys.server_write_IV;
wolfSSL 0:1239e9b70ca2 948
wolfSSL 0:1239e9b70ca2 949 return NULL;
wolfSSL 0:1239e9b70ca2 950 }
wolfSSL 0:1239e9b70ca2 951
wolfSSL 0:1239e9b70ca2 952
wolfSSL 0:1239e9b70ca2 953 int CyaSSL_GetKeySize(CYASSL* ssl)
wolfSSL 0:1239e9b70ca2 954 {
wolfSSL 0:1239e9b70ca2 955 if (ssl)
wolfSSL 0:1239e9b70ca2 956 return ssl->specs.key_size;
wolfSSL 0:1239e9b70ca2 957
wolfSSL 0:1239e9b70ca2 958 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 959 }
wolfSSL 0:1239e9b70ca2 960
wolfSSL 0:1239e9b70ca2 961
wolfSSL 0:1239e9b70ca2 962 int CyaSSL_GetIVSize(CYASSL* ssl)
wolfSSL 0:1239e9b70ca2 963 {
wolfSSL 0:1239e9b70ca2 964 if (ssl)
wolfSSL 0:1239e9b70ca2 965 return ssl->specs.iv_size;
wolfSSL 0:1239e9b70ca2 966
wolfSSL 0:1239e9b70ca2 967 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 968 }
wolfSSL 0:1239e9b70ca2 969
wolfSSL 0:1239e9b70ca2 970
wolfSSL 0:1239e9b70ca2 971 int CyaSSL_GetBulkCipher(CYASSL* ssl)
wolfSSL 0:1239e9b70ca2 972 {
wolfSSL 0:1239e9b70ca2 973 if (ssl)
wolfSSL 0:1239e9b70ca2 974 return ssl->specs.bulk_cipher_algorithm;
wolfSSL 0:1239e9b70ca2 975
wolfSSL 0:1239e9b70ca2 976 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 977 }
wolfSSL 0:1239e9b70ca2 978
wolfSSL 0:1239e9b70ca2 979
wolfSSL 0:1239e9b70ca2 980 int CyaSSL_GetCipherType(CYASSL* ssl)
wolfSSL 0:1239e9b70ca2 981 {
wolfSSL 0:1239e9b70ca2 982 if (ssl == NULL)
wolfSSL 0:1239e9b70ca2 983 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 984
wolfSSL 0:1239e9b70ca2 985 if (ssl->specs.cipher_type == block)
wolfSSL 0:1239e9b70ca2 986 return CYASSL_BLOCK_TYPE;
wolfSSL 0:1239e9b70ca2 987 if (ssl->specs.cipher_type == stream)
wolfSSL 0:1239e9b70ca2 988 return CYASSL_STREAM_TYPE;
wolfSSL 0:1239e9b70ca2 989 if (ssl->specs.cipher_type == aead)
wolfSSL 0:1239e9b70ca2 990 return CYASSL_AEAD_TYPE;
wolfSSL 0:1239e9b70ca2 991
wolfSSL 0:1239e9b70ca2 992 return -1;
wolfSSL 0:1239e9b70ca2 993 }
wolfSSL 0:1239e9b70ca2 994
wolfSSL 0:1239e9b70ca2 995
wolfSSL 0:1239e9b70ca2 996 int CyaSSL_GetCipherBlockSize(CYASSL* ssl)
wolfSSL 0:1239e9b70ca2 997 {
wolfSSL 0:1239e9b70ca2 998 if (ssl == NULL)
wolfSSL 0:1239e9b70ca2 999 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 1000
wolfSSL 0:1239e9b70ca2 1001 return ssl->specs.block_size;
wolfSSL 0:1239e9b70ca2 1002 }
wolfSSL 0:1239e9b70ca2 1003
wolfSSL 0:1239e9b70ca2 1004
wolfSSL 0:1239e9b70ca2 1005 int CyaSSL_GetAeadMacSize(CYASSL* ssl)
wolfSSL 0:1239e9b70ca2 1006 {
wolfSSL 0:1239e9b70ca2 1007 if (ssl == NULL)
wolfSSL 0:1239e9b70ca2 1008 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 1009
wolfSSL 0:1239e9b70ca2 1010 return ssl->specs.aead_mac_size;
wolfSSL 0:1239e9b70ca2 1011 }
wolfSSL 0:1239e9b70ca2 1012
wolfSSL 0:1239e9b70ca2 1013
wolfSSL 0:1239e9b70ca2 1014 int CyaSSL_IsTLSv1_1(CYASSL* ssl)
wolfSSL 0:1239e9b70ca2 1015 {
wolfSSL 0:1239e9b70ca2 1016 if (ssl == NULL)
wolfSSL 0:1239e9b70ca2 1017 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 1018
wolfSSL 0:1239e9b70ca2 1019 if (ssl->options.tls1_1)
wolfSSL 0:1239e9b70ca2 1020 return 1;
wolfSSL 0:1239e9b70ca2 1021
wolfSSL 0:1239e9b70ca2 1022 return 0;
wolfSSL 0:1239e9b70ca2 1023 }
wolfSSL 0:1239e9b70ca2 1024
wolfSSL 0:1239e9b70ca2 1025
wolfSSL 0:1239e9b70ca2 1026 int CyaSSL_GetSide(CYASSL* ssl)
wolfSSL 0:1239e9b70ca2 1027 {
wolfSSL 0:1239e9b70ca2 1028 if (ssl)
wolfSSL 0:1239e9b70ca2 1029 return ssl->options.side;
wolfSSL 0:1239e9b70ca2 1030
wolfSSL 0:1239e9b70ca2 1031 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 1032 }
wolfSSL 0:1239e9b70ca2 1033
wolfSSL 0:1239e9b70ca2 1034
wolfSSL 0:1239e9b70ca2 1035 int CyaSSL_GetHmacSize(CYASSL* ssl)
wolfSSL 0:1239e9b70ca2 1036 {
wolfSSL 0:1239e9b70ca2 1037 /* AEAD ciphers don't have HMAC keys */
wolfSSL 0:1239e9b70ca2 1038 if (ssl)
wolfSSL 0:1239e9b70ca2 1039 return (ssl->specs.cipher_type != aead) ? ssl->specs.hash_size : 0;
wolfSSL 0:1239e9b70ca2 1040
wolfSSL 0:1239e9b70ca2 1041 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 1042 }
wolfSSL 0:1239e9b70ca2 1043
wolfSSL 0:1239e9b70ca2 1044 #endif /* ATOMIC_USER */
wolfSSL 0:1239e9b70ca2 1045
wolfSSL 0:1239e9b70ca2 1046 #ifndef NO_CERTS
wolfSSL 0:1239e9b70ca2 1047
wolfSSL 0:1239e9b70ca2 1048 CYASSL_CERT_MANAGER* CyaSSL_CertManagerNew(void)
wolfSSL 0:1239e9b70ca2 1049 {
wolfSSL 0:1239e9b70ca2 1050 CYASSL_CERT_MANAGER* cm = NULL;
wolfSSL 0:1239e9b70ca2 1051
wolfSSL 0:1239e9b70ca2 1052 CYASSL_ENTER("CyaSSL_CertManagerNew");
wolfSSL 0:1239e9b70ca2 1053
wolfSSL 0:1239e9b70ca2 1054 cm = (CYASSL_CERT_MANAGER*) XMALLOC(sizeof(CYASSL_CERT_MANAGER), 0,
wolfSSL 0:1239e9b70ca2 1055 DYNAMIC_TYPE_CERT_MANAGER);
wolfSSL 0:1239e9b70ca2 1056 if (cm) {
wolfSSL 0:1239e9b70ca2 1057 XMEMSET(cm, 0, sizeof(CYASSL_CERT_MANAGER));
wolfSSL 0:1239e9b70ca2 1058
wolfSSL 0:1239e9b70ca2 1059 if (InitMutex(&cm->caLock) != 0) {
wolfSSL 0:1239e9b70ca2 1060 CYASSL_MSG("Bad mutex init");
wolfSSL 0:1239e9b70ca2 1061 CyaSSL_CertManagerFree(cm);
wolfSSL 0:1239e9b70ca2 1062 return NULL;
wolfSSL 0:1239e9b70ca2 1063 }
wolfSSL 0:1239e9b70ca2 1064 }
wolfSSL 0:1239e9b70ca2 1065
wolfSSL 0:1239e9b70ca2 1066 return cm;
wolfSSL 0:1239e9b70ca2 1067 }
wolfSSL 0:1239e9b70ca2 1068
wolfSSL 0:1239e9b70ca2 1069
wolfSSL 0:1239e9b70ca2 1070 void CyaSSL_CertManagerFree(CYASSL_CERT_MANAGER* cm)
wolfSSL 0:1239e9b70ca2 1071 {
wolfSSL 0:1239e9b70ca2 1072 CYASSL_ENTER("CyaSSL_CertManagerFree");
wolfSSL 0:1239e9b70ca2 1073
wolfSSL 0:1239e9b70ca2 1074 if (cm) {
wolfSSL 0:1239e9b70ca2 1075 #ifdef HAVE_CRL
wolfSSL 0:1239e9b70ca2 1076 if (cm->crl)
wolfSSL 0:1239e9b70ca2 1077 FreeCRL(cm->crl, 1);
wolfSSL 0:1239e9b70ca2 1078 #endif
wolfSSL 0:1239e9b70ca2 1079 #ifdef HAVE_OCSP
wolfSSL 0:1239e9b70ca2 1080 if (cm->ocsp)
wolfSSL 0:1239e9b70ca2 1081 FreeOCSP(cm->ocsp, 1);
wolfSSL 0:1239e9b70ca2 1082 #endif
wolfSSL 0:1239e9b70ca2 1083 FreeSignerTable(cm->caTable, CA_TABLE_SIZE, NULL);
wolfSSL 0:1239e9b70ca2 1084 FreeMutex(&cm->caLock);
wolfSSL 0:1239e9b70ca2 1085 XFREE(cm, NULL, DYNAMIC_TYPE_CERT_MANAGER);
wolfSSL 0:1239e9b70ca2 1086 }
wolfSSL 0:1239e9b70ca2 1087
wolfSSL 0:1239e9b70ca2 1088 }
wolfSSL 0:1239e9b70ca2 1089
wolfSSL 0:1239e9b70ca2 1090
wolfSSL 0:1239e9b70ca2 1091 /* Unload the CA signer list */
wolfSSL 0:1239e9b70ca2 1092 int CyaSSL_CertManagerUnloadCAs(CYASSL_CERT_MANAGER* cm)
wolfSSL 0:1239e9b70ca2 1093 {
wolfSSL 0:1239e9b70ca2 1094 CYASSL_ENTER("CyaSSL_CertManagerUnloadCAs");
wolfSSL 0:1239e9b70ca2 1095
wolfSSL 0:1239e9b70ca2 1096 if (cm == NULL)
wolfSSL 0:1239e9b70ca2 1097 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 1098
wolfSSL 0:1239e9b70ca2 1099 if (LockMutex(&cm->caLock) != 0)
wolfSSL 0:1239e9b70ca2 1100 return BAD_MUTEX_E;
wolfSSL 0:1239e9b70ca2 1101
wolfSSL 0:1239e9b70ca2 1102 FreeSignerTable(cm->caTable, CA_TABLE_SIZE, NULL);
wolfSSL 0:1239e9b70ca2 1103
wolfSSL 0:1239e9b70ca2 1104 UnLockMutex(&cm->caLock);
wolfSSL 0:1239e9b70ca2 1105
wolfSSL 0:1239e9b70ca2 1106
wolfSSL 0:1239e9b70ca2 1107 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 1108 }
wolfSSL 0:1239e9b70ca2 1109
wolfSSL 0:1239e9b70ca2 1110
wolfSSL 0:1239e9b70ca2 1111 /* Return bytes written to buff or < 0 for error */
wolfSSL 0:1239e9b70ca2 1112 int CyaSSL_CertPemToDer(const unsigned char* pem, int pemSz,
wolfSSL 0:1239e9b70ca2 1113 unsigned char* buff, int buffSz,
wolfSSL 0:1239e9b70ca2 1114 int type)
wolfSSL 0:1239e9b70ca2 1115 {
wolfSSL 0:1239e9b70ca2 1116 EncryptedInfo info;
wolfSSL 0:1239e9b70ca2 1117 int eccKey = 0;
wolfSSL 0:1239e9b70ca2 1118 int ret;
wolfSSL 0:1239e9b70ca2 1119 buffer der;
wolfSSL 0:1239e9b70ca2 1120
wolfSSL 0:1239e9b70ca2 1121 CYASSL_ENTER("CyaSSL_CertPemToDer");
wolfSSL 0:1239e9b70ca2 1122
wolfSSL 0:1239e9b70ca2 1123 if (pem == NULL || buff == NULL || buffSz <= 0) {
wolfSSL 0:1239e9b70ca2 1124 CYASSL_MSG("Bad pem der args");
wolfSSL 0:1239e9b70ca2 1125 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 1126 }
wolfSSL 0:1239e9b70ca2 1127
wolfSSL 0:1239e9b70ca2 1128 if (type != CERT_TYPE && type != CA_TYPE && type != CERTREQ_TYPE) {
wolfSSL 0:1239e9b70ca2 1129 CYASSL_MSG("Bad cert type");
wolfSSL 0:1239e9b70ca2 1130 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 1131 }
wolfSSL 0:1239e9b70ca2 1132
wolfSSL 0:1239e9b70ca2 1133 info.set = 0;
wolfSSL 0:1239e9b70ca2 1134 info.ctx = NULL;
wolfSSL 0:1239e9b70ca2 1135 info.consumed = 0;
wolfSSL 0:1239e9b70ca2 1136 der.buffer = NULL;
wolfSSL 0:1239e9b70ca2 1137
wolfSSL 0:1239e9b70ca2 1138 ret = PemToDer(pem, pemSz, type, &der, NULL, &info, &eccKey);
wolfSSL 0:1239e9b70ca2 1139 if (ret < 0) {
wolfSSL 0:1239e9b70ca2 1140 CYASSL_MSG("Bad Pem To Der");
wolfSSL 0:1239e9b70ca2 1141 }
wolfSSL 0:1239e9b70ca2 1142 else {
wolfSSL 0:1239e9b70ca2 1143 if (der.length <= (word32)buffSz) {
wolfSSL 0:1239e9b70ca2 1144 XMEMCPY(buff, der.buffer, der.length);
wolfSSL 0:1239e9b70ca2 1145 ret = der.length;
wolfSSL 0:1239e9b70ca2 1146 }
wolfSSL 0:1239e9b70ca2 1147 else {
wolfSSL 0:1239e9b70ca2 1148 CYASSL_MSG("Bad der length");
wolfSSL 0:1239e9b70ca2 1149 ret = BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 1150 }
wolfSSL 0:1239e9b70ca2 1151 }
wolfSSL 0:1239e9b70ca2 1152
wolfSSL 0:1239e9b70ca2 1153 XFREE(der.buffer, NULL, DYNAMIC_TYPE_KEY);
wolfSSL 0:1239e9b70ca2 1154
wolfSSL 0:1239e9b70ca2 1155 return ret;
wolfSSL 0:1239e9b70ca2 1156 }
wolfSSL 0:1239e9b70ca2 1157
wolfSSL 0:1239e9b70ca2 1158
wolfSSL 0:1239e9b70ca2 1159 #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
wolfSSL 0:1239e9b70ca2 1160
wolfSSL 0:1239e9b70ca2 1161 /* our KeyPemToDer password callback, password in userData */
wolfSSL 0:1239e9b70ca2 1162 static INLINE int OurPasswordCb(char* passwd, int sz, int rw, void* userdata)
wolfSSL 0:1239e9b70ca2 1163 {
wolfSSL 0:1239e9b70ca2 1164 (void)rw;
wolfSSL 0:1239e9b70ca2 1165
wolfSSL 0:1239e9b70ca2 1166 if (userdata == NULL)
wolfSSL 0:1239e9b70ca2 1167 return 0;
wolfSSL 0:1239e9b70ca2 1168
wolfSSL 0:1239e9b70ca2 1169 XSTRNCPY(passwd, (char*)userdata, sz);
wolfSSL 0:1239e9b70ca2 1170 return min((word32)sz, (word32)XSTRLEN((char*)userdata));
wolfSSL 0:1239e9b70ca2 1171 }
wolfSSL 0:1239e9b70ca2 1172
wolfSSL 0:1239e9b70ca2 1173 #endif /* OPENSSL_EXTRA || HAVE_WEBSERVER */
wolfSSL 0:1239e9b70ca2 1174
wolfSSL 0:1239e9b70ca2 1175
wolfSSL 0:1239e9b70ca2 1176 /* Return bytes written to buff or < 0 for error */
wolfSSL 0:1239e9b70ca2 1177 int CyaSSL_KeyPemToDer(const unsigned char* pem, int pemSz, unsigned char* buff,
wolfSSL 0:1239e9b70ca2 1178 int buffSz, const char* pass)
wolfSSL 0:1239e9b70ca2 1179 {
wolfSSL 0:1239e9b70ca2 1180 EncryptedInfo info;
wolfSSL 0:1239e9b70ca2 1181 int eccKey = 0;
wolfSSL 0:1239e9b70ca2 1182 int ret;
wolfSSL 0:1239e9b70ca2 1183 buffer der;
wolfSSL 0:1239e9b70ca2 1184
wolfSSL 0:1239e9b70ca2 1185 (void)pass;
wolfSSL 0:1239e9b70ca2 1186
wolfSSL 0:1239e9b70ca2 1187 CYASSL_ENTER("CyaSSL_KeyPemToDer");
wolfSSL 0:1239e9b70ca2 1188
wolfSSL 0:1239e9b70ca2 1189 if (pem == NULL || buff == NULL || buffSz <= 0) {
wolfSSL 0:1239e9b70ca2 1190 CYASSL_MSG("Bad pem der args");
wolfSSL 0:1239e9b70ca2 1191 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 1192 }
wolfSSL 0:1239e9b70ca2 1193
wolfSSL 0:1239e9b70ca2 1194 info.set = 0;
wolfSSL 0:1239e9b70ca2 1195 info.ctx = NULL;
wolfSSL 0:1239e9b70ca2 1196 info.consumed = 0;
wolfSSL 0:1239e9b70ca2 1197 der.buffer = NULL;
wolfSSL 0:1239e9b70ca2 1198
wolfSSL 0:1239e9b70ca2 1199 #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
wolfSSL 0:1239e9b70ca2 1200 if (pass) {
wolfSSL 0:1239e9b70ca2 1201 info.ctx = CyaSSL_CTX_new(CyaSSLv23_client_method());
wolfSSL 0:1239e9b70ca2 1202 if (info.ctx == NULL)
wolfSSL 0:1239e9b70ca2 1203 return MEMORY_E;
wolfSSL 0:1239e9b70ca2 1204 CyaSSL_CTX_set_default_passwd_cb(info.ctx, OurPasswordCb);
wolfSSL 0:1239e9b70ca2 1205 CyaSSL_CTX_set_default_passwd_cb_userdata(info.ctx, (void*)pass);
wolfSSL 0:1239e9b70ca2 1206 }
wolfSSL 0:1239e9b70ca2 1207 #endif
wolfSSL 0:1239e9b70ca2 1208
wolfSSL 0:1239e9b70ca2 1209 ret = PemToDer(pem, pemSz, PRIVATEKEY_TYPE, &der, NULL, &info, &eccKey);
wolfSSL 0:1239e9b70ca2 1210 if (ret < 0) {
wolfSSL 0:1239e9b70ca2 1211 CYASSL_MSG("Bad Pem To Der");
wolfSSL 0:1239e9b70ca2 1212 }
wolfSSL 0:1239e9b70ca2 1213 else {
wolfSSL 0:1239e9b70ca2 1214 if (der.length <= (word32)buffSz) {
wolfSSL 0:1239e9b70ca2 1215 XMEMCPY(buff, der.buffer, der.length);
wolfSSL 0:1239e9b70ca2 1216 ret = der.length;
wolfSSL 0:1239e9b70ca2 1217 }
wolfSSL 0:1239e9b70ca2 1218 else {
wolfSSL 0:1239e9b70ca2 1219 CYASSL_MSG("Bad der length");
wolfSSL 0:1239e9b70ca2 1220 ret = BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 1221 }
wolfSSL 0:1239e9b70ca2 1222 }
wolfSSL 0:1239e9b70ca2 1223
wolfSSL 0:1239e9b70ca2 1224 XFREE(der.buffer, NULL, DYNAMIC_TYPE_KEY);
wolfSSL 0:1239e9b70ca2 1225
wolfSSL 0:1239e9b70ca2 1226 if (info.ctx)
wolfSSL 0:1239e9b70ca2 1227 CyaSSL_CTX_free(info.ctx);
wolfSSL 0:1239e9b70ca2 1228
wolfSSL 0:1239e9b70ca2 1229 return ret;
wolfSSL 0:1239e9b70ca2 1230 }
wolfSSL 0:1239e9b70ca2 1231
wolfSSL 0:1239e9b70ca2 1232
wolfSSL 0:1239e9b70ca2 1233 #endif /* !NO_CERTS */
wolfSSL 0:1239e9b70ca2 1234
wolfSSL 0:1239e9b70ca2 1235
wolfSSL 0:1239e9b70ca2 1236
wolfSSL 0:1239e9b70ca2 1237 #if !defined(NO_FILESYSTEM) && !defined(NO_STDIO_FILESYSTEM)
wolfSSL 0:1239e9b70ca2 1238
wolfSSL 0:1239e9b70ca2 1239 void CyaSSL_ERR_print_errors_fp(FILE* fp, int err)
wolfSSL 0:1239e9b70ca2 1240 {
wolfSSL 0:1239e9b70ca2 1241 char data[CYASSL_MAX_ERROR_SZ + 1];
wolfSSL 0:1239e9b70ca2 1242
wolfSSL 0:1239e9b70ca2 1243 CYASSL_ENTER("CyaSSL_ERR_print_errors_fp");
wolfSSL 0:1239e9b70ca2 1244 SetErrorString(err, data);
wolfSSL 0:1239e9b70ca2 1245 fprintf(fp, "%s", data);
wolfSSL 0:1239e9b70ca2 1246 }
wolfSSL 0:1239e9b70ca2 1247
wolfSSL 0:1239e9b70ca2 1248 #endif
wolfSSL 0:1239e9b70ca2 1249
wolfSSL 0:1239e9b70ca2 1250
wolfSSL 0:1239e9b70ca2 1251 int CyaSSL_pending(CYASSL* ssl)
wolfSSL 0:1239e9b70ca2 1252 {
wolfSSL 0:1239e9b70ca2 1253 CYASSL_ENTER("SSL_pending");
wolfSSL 0:1239e9b70ca2 1254 return ssl->buffers.clearOutputBuffer.length;
wolfSSL 0:1239e9b70ca2 1255 }
wolfSSL 0:1239e9b70ca2 1256
wolfSSL 0:1239e9b70ca2 1257
wolfSSL 0:1239e9b70ca2 1258 #ifndef CYASSL_LEANPSK
wolfSSL 0:1239e9b70ca2 1259 /* trun on handshake group messages for context */
wolfSSL 0:1239e9b70ca2 1260 int CyaSSL_CTX_set_group_messages(CYASSL_CTX* ctx)
wolfSSL 0:1239e9b70ca2 1261 {
wolfSSL 0:1239e9b70ca2 1262 if (ctx == NULL)
wolfSSL 0:1239e9b70ca2 1263 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 1264
wolfSSL 0:1239e9b70ca2 1265 ctx->groupMessages = 1;
wolfSSL 0:1239e9b70ca2 1266
wolfSSL 0:1239e9b70ca2 1267 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 1268 }
wolfSSL 0:1239e9b70ca2 1269 #endif
wolfSSL 0:1239e9b70ca2 1270
wolfSSL 0:1239e9b70ca2 1271
wolfSSL 0:1239e9b70ca2 1272 #ifndef NO_CYASSL_CLIENT
wolfSSL 0:1239e9b70ca2 1273 /* connect enough to get peer cert chain */
wolfSSL 0:1239e9b70ca2 1274 int CyaSSL_connect_cert(CYASSL* ssl)
wolfSSL 0:1239e9b70ca2 1275 {
wolfSSL 0:1239e9b70ca2 1276 int ret;
wolfSSL 0:1239e9b70ca2 1277
wolfSSL 0:1239e9b70ca2 1278 if (ssl == NULL)
wolfSSL 0:1239e9b70ca2 1279 return SSL_FAILURE;
wolfSSL 0:1239e9b70ca2 1280
wolfSSL 0:1239e9b70ca2 1281 ssl->options.certOnly = 1;
wolfSSL 0:1239e9b70ca2 1282 ret = CyaSSL_connect(ssl);
wolfSSL 0:1239e9b70ca2 1283 ssl->options.certOnly = 0;
wolfSSL 0:1239e9b70ca2 1284
wolfSSL 0:1239e9b70ca2 1285 return ret;
wolfSSL 0:1239e9b70ca2 1286 }
wolfSSL 0:1239e9b70ca2 1287 #endif
wolfSSL 0:1239e9b70ca2 1288
wolfSSL 0:1239e9b70ca2 1289
wolfSSL 0:1239e9b70ca2 1290 #ifndef CYASSL_LEANPSK
wolfSSL 0:1239e9b70ca2 1291 /* trun on handshake group messages for ssl object */
wolfSSL 0:1239e9b70ca2 1292 int CyaSSL_set_group_messages(CYASSL* ssl)
wolfSSL 0:1239e9b70ca2 1293 {
wolfSSL 0:1239e9b70ca2 1294 if (ssl == NULL)
wolfSSL 0:1239e9b70ca2 1295 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 1296
wolfSSL 0:1239e9b70ca2 1297 ssl->options.groupMessages = 1;
wolfSSL 0:1239e9b70ca2 1298
wolfSSL 0:1239e9b70ca2 1299 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 1300 }
wolfSSL 0:1239e9b70ca2 1301
wolfSSL 0:1239e9b70ca2 1302
wolfSSL 0:1239e9b70ca2 1303 int CyaSSL_SetVersion(CYASSL* ssl, int version)
wolfSSL 0:1239e9b70ca2 1304 {
wolfSSL 0:1239e9b70ca2 1305 byte haveRSA = 1;
wolfSSL 0:1239e9b70ca2 1306 byte havePSK = 0;
wolfSSL 0:1239e9b70ca2 1307
wolfSSL 0:1239e9b70ca2 1308 CYASSL_ENTER("CyaSSL_SetVersion");
wolfSSL 0:1239e9b70ca2 1309
wolfSSL 0:1239e9b70ca2 1310 if (ssl == NULL) {
wolfSSL 0:1239e9b70ca2 1311 CYASSL_MSG("Bad function argument");
wolfSSL 0:1239e9b70ca2 1312 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 1313 }
wolfSSL 0:1239e9b70ca2 1314
wolfSSL 0:1239e9b70ca2 1315 switch (version) {
wolfSSL 0:1239e9b70ca2 1316 #ifndef NO_OLD_TLS
wolfSSL 0:1239e9b70ca2 1317 case CYASSL_SSLV3:
wolfSSL 0:1239e9b70ca2 1318 ssl->version = MakeSSLv3();
wolfSSL 0:1239e9b70ca2 1319 break;
wolfSSL 0:1239e9b70ca2 1320 #endif
wolfSSL 0:1239e9b70ca2 1321
wolfSSL 0:1239e9b70ca2 1322 #ifndef NO_TLS
wolfSSL 0:1239e9b70ca2 1323 #ifndef NO_OLD_TLS
wolfSSL 0:1239e9b70ca2 1324 case CYASSL_TLSV1:
wolfSSL 0:1239e9b70ca2 1325 ssl->version = MakeTLSv1();
wolfSSL 0:1239e9b70ca2 1326 break;
wolfSSL 0:1239e9b70ca2 1327
wolfSSL 0:1239e9b70ca2 1328 case CYASSL_TLSV1_1:
wolfSSL 0:1239e9b70ca2 1329 ssl->version = MakeTLSv1_1();
wolfSSL 0:1239e9b70ca2 1330 break;
wolfSSL 0:1239e9b70ca2 1331 #endif
wolfSSL 0:1239e9b70ca2 1332 case CYASSL_TLSV1_2:
wolfSSL 0:1239e9b70ca2 1333 ssl->version = MakeTLSv1_2();
wolfSSL 0:1239e9b70ca2 1334 break;
wolfSSL 0:1239e9b70ca2 1335 #endif
wolfSSL 0:1239e9b70ca2 1336
wolfSSL 0:1239e9b70ca2 1337 default:
wolfSSL 0:1239e9b70ca2 1338 CYASSL_MSG("Bad function argument");
wolfSSL 0:1239e9b70ca2 1339 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 1340 }
wolfSSL 0:1239e9b70ca2 1341
wolfSSL 0:1239e9b70ca2 1342 #ifdef NO_RSA
wolfSSL 0:1239e9b70ca2 1343 haveRSA = 0;
wolfSSL 0:1239e9b70ca2 1344 #endif
wolfSSL 0:1239e9b70ca2 1345 #ifndef NO_PSK
wolfSSL 0:1239e9b70ca2 1346 havePSK = ssl->options.havePSK;
wolfSSL 0:1239e9b70ca2 1347 #endif
wolfSSL 0:1239e9b70ca2 1348
wolfSSL 0:1239e9b70ca2 1349 InitSuites(ssl->suites, ssl->version, haveRSA, havePSK, ssl->options.haveDH,
wolfSSL 0:1239e9b70ca2 1350 ssl->options.haveNTRU, ssl->options.haveECDSAsig,
wolfSSL 0:1239e9b70ca2 1351 ssl->options.haveStaticECC, ssl->options.side);
wolfSSL 0:1239e9b70ca2 1352
wolfSSL 0:1239e9b70ca2 1353 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 1354 }
wolfSSL 0:1239e9b70ca2 1355 #endif /* !leanpsk */
wolfSSL 0:1239e9b70ca2 1356
wolfSSL 0:1239e9b70ca2 1357
wolfSSL 0:1239e9b70ca2 1358 #if !defined(NO_CERTS) || !defined(NO_SESSION_CACHE)
wolfSSL 0:1239e9b70ca2 1359
wolfSSL 0:1239e9b70ca2 1360 /* Make a work from the front of random hash */
wolfSSL 0:1239e9b70ca2 1361 static INLINE word32 MakeWordFromHash(const byte* hashID)
wolfSSL 0:1239e9b70ca2 1362 {
wolfSSL 0:1239e9b70ca2 1363 return (hashID[0] << 24) | (hashID[1] << 16) | (hashID[2] << 8) |
wolfSSL 0:1239e9b70ca2 1364 hashID[3];
wolfSSL 0:1239e9b70ca2 1365 }
wolfSSL 0:1239e9b70ca2 1366
wolfSSL 0:1239e9b70ca2 1367 #endif /* !NO_CERTS || !NO_SESSION_CACHE */
wolfSSL 0:1239e9b70ca2 1368
wolfSSL 0:1239e9b70ca2 1369
wolfSSL 0:1239e9b70ca2 1370 #ifndef NO_CERTS
wolfSSL 0:1239e9b70ca2 1371
wolfSSL 0:1239e9b70ca2 1372 /* hash is the SHA digest of name, just use first 32 bits as hash */
wolfSSL 0:1239e9b70ca2 1373 static INLINE word32 HashSigner(const byte* hash)
wolfSSL 0:1239e9b70ca2 1374 {
wolfSSL 0:1239e9b70ca2 1375 return MakeWordFromHash(hash) % CA_TABLE_SIZE;
wolfSSL 0:1239e9b70ca2 1376 }
wolfSSL 0:1239e9b70ca2 1377
wolfSSL 0:1239e9b70ca2 1378
wolfSSL 0:1239e9b70ca2 1379 /* does CA already exist on signer list */
wolfSSL 0:1239e9b70ca2 1380 int AlreadySigner(CYASSL_CERT_MANAGER* cm, byte* hash)
wolfSSL 0:1239e9b70ca2 1381 {
wolfSSL 0:1239e9b70ca2 1382 Signer* signers;
wolfSSL 0:1239e9b70ca2 1383 int ret = 0;
wolfSSL 0:1239e9b70ca2 1384 word32 row = HashSigner(hash);
wolfSSL 0:1239e9b70ca2 1385
wolfSSL 0:1239e9b70ca2 1386 if (LockMutex(&cm->caLock) != 0)
wolfSSL 0:1239e9b70ca2 1387 return ret;
wolfSSL 0:1239e9b70ca2 1388 signers = cm->caTable[row];
wolfSSL 0:1239e9b70ca2 1389 while (signers) {
wolfSSL 0:1239e9b70ca2 1390 byte* subjectHash;
wolfSSL 0:1239e9b70ca2 1391 #ifndef NO_SKID
wolfSSL 0:1239e9b70ca2 1392 subjectHash = signers->subjectKeyIdHash;
wolfSSL 0:1239e9b70ca2 1393 #else
wolfSSL 0:1239e9b70ca2 1394 subjectHash = signers->subjectNameHash;
wolfSSL 0:1239e9b70ca2 1395 #endif
wolfSSL 0:1239e9b70ca2 1396 if (XMEMCMP(hash, subjectHash, SHA_DIGEST_SIZE) == 0) {
wolfSSL 0:1239e9b70ca2 1397 ret = 1;
wolfSSL 0:1239e9b70ca2 1398 break;
wolfSSL 0:1239e9b70ca2 1399 }
wolfSSL 0:1239e9b70ca2 1400 signers = signers->next;
wolfSSL 0:1239e9b70ca2 1401 }
wolfSSL 0:1239e9b70ca2 1402 UnLockMutex(&cm->caLock);
wolfSSL 0:1239e9b70ca2 1403
wolfSSL 0:1239e9b70ca2 1404 return ret;
wolfSSL 0:1239e9b70ca2 1405 }
wolfSSL 0:1239e9b70ca2 1406
wolfSSL 0:1239e9b70ca2 1407
wolfSSL 0:1239e9b70ca2 1408 /* return CA if found, otherwise NULL */
wolfSSL 0:1239e9b70ca2 1409 Signer* GetCA(void* vp, byte* hash)
wolfSSL 0:1239e9b70ca2 1410 {
wolfSSL 0:1239e9b70ca2 1411 CYASSL_CERT_MANAGER* cm = (CYASSL_CERT_MANAGER*)vp;
wolfSSL 0:1239e9b70ca2 1412 Signer* ret = NULL;
wolfSSL 0:1239e9b70ca2 1413 Signer* signers;
wolfSSL 0:1239e9b70ca2 1414 word32 row = HashSigner(hash);
wolfSSL 0:1239e9b70ca2 1415
wolfSSL 0:1239e9b70ca2 1416 if (cm == NULL)
wolfSSL 0:1239e9b70ca2 1417 return NULL;
wolfSSL 0:1239e9b70ca2 1418
wolfSSL 0:1239e9b70ca2 1419 if (LockMutex(&cm->caLock) != 0)
wolfSSL 0:1239e9b70ca2 1420 return ret;
wolfSSL 0:1239e9b70ca2 1421
wolfSSL 0:1239e9b70ca2 1422 signers = cm->caTable[row];
wolfSSL 0:1239e9b70ca2 1423 while (signers) {
wolfSSL 0:1239e9b70ca2 1424 byte* subjectHash;
wolfSSL 0:1239e9b70ca2 1425 #ifndef NO_SKID
wolfSSL 0:1239e9b70ca2 1426 subjectHash = signers->subjectKeyIdHash;
wolfSSL 0:1239e9b70ca2 1427 #else
wolfSSL 0:1239e9b70ca2 1428 subjectHash = signers->subjectNameHash;
wolfSSL 0:1239e9b70ca2 1429 #endif
wolfSSL 0:1239e9b70ca2 1430 if (XMEMCMP(hash, subjectHash, SHA_DIGEST_SIZE) == 0) {
wolfSSL 0:1239e9b70ca2 1431 ret = signers;
wolfSSL 0:1239e9b70ca2 1432 break;
wolfSSL 0:1239e9b70ca2 1433 }
wolfSSL 0:1239e9b70ca2 1434 signers = signers->next;
wolfSSL 0:1239e9b70ca2 1435 }
wolfSSL 0:1239e9b70ca2 1436 UnLockMutex(&cm->caLock);
wolfSSL 0:1239e9b70ca2 1437
wolfSSL 0:1239e9b70ca2 1438 return ret;
wolfSSL 0:1239e9b70ca2 1439 }
wolfSSL 0:1239e9b70ca2 1440
wolfSSL 0:1239e9b70ca2 1441
wolfSSL 0:1239e9b70ca2 1442 #ifndef NO_SKID
wolfSSL 0:1239e9b70ca2 1443 /* return CA if found, otherwise NULL. Walk through hash table. */
wolfSSL 0:1239e9b70ca2 1444 Signer* GetCAByName(void* vp, byte* hash)
wolfSSL 0:1239e9b70ca2 1445 {
wolfSSL 0:1239e9b70ca2 1446 CYASSL_CERT_MANAGER* cm = (CYASSL_CERT_MANAGER*)vp;
wolfSSL 0:1239e9b70ca2 1447 Signer* ret = NULL;
wolfSSL 0:1239e9b70ca2 1448 Signer* signers;
wolfSSL 0:1239e9b70ca2 1449 word32 row;
wolfSSL 0:1239e9b70ca2 1450
wolfSSL 0:1239e9b70ca2 1451 if (cm == NULL)
wolfSSL 0:1239e9b70ca2 1452 return NULL;
wolfSSL 0:1239e9b70ca2 1453
wolfSSL 0:1239e9b70ca2 1454 if (LockMutex(&cm->caLock) != 0)
wolfSSL 0:1239e9b70ca2 1455 return ret;
wolfSSL 0:1239e9b70ca2 1456
wolfSSL 0:1239e9b70ca2 1457 for (row = 0; row < CA_TABLE_SIZE && ret == NULL; row++) {
wolfSSL 0:1239e9b70ca2 1458 signers = cm->caTable[row];
wolfSSL 0:1239e9b70ca2 1459 while (signers && ret == NULL) {
wolfSSL 0:1239e9b70ca2 1460 if (XMEMCMP(hash, signers->subjectNameHash, SHA_DIGEST_SIZE) == 0) {
wolfSSL 0:1239e9b70ca2 1461 ret = signers;
wolfSSL 0:1239e9b70ca2 1462 }
wolfSSL 0:1239e9b70ca2 1463 signers = signers->next;
wolfSSL 0:1239e9b70ca2 1464 }
wolfSSL 0:1239e9b70ca2 1465 }
wolfSSL 0:1239e9b70ca2 1466 UnLockMutex(&cm->caLock);
wolfSSL 0:1239e9b70ca2 1467
wolfSSL 0:1239e9b70ca2 1468 return ret;
wolfSSL 0:1239e9b70ca2 1469 }
wolfSSL 0:1239e9b70ca2 1470 #endif
wolfSSL 0:1239e9b70ca2 1471
wolfSSL 0:1239e9b70ca2 1472
wolfSSL 0:1239e9b70ca2 1473 /* owns der, internal now uses too */
wolfSSL 0:1239e9b70ca2 1474 /* type flag ids from user or from chain received during verify
wolfSSL 0:1239e9b70ca2 1475 don't allow chain ones to be added w/o isCA extension */
wolfSSL 0:1239e9b70ca2 1476 int AddCA(CYASSL_CERT_MANAGER* cm, buffer der, int type, int verify)
wolfSSL 0:1239e9b70ca2 1477 {
wolfSSL 0:1239e9b70ca2 1478 int ret;
wolfSSL 0:1239e9b70ca2 1479 DecodedCert cert;
wolfSSL 0:1239e9b70ca2 1480 Signer* signer = 0;
wolfSSL 0:1239e9b70ca2 1481 word32 row;
wolfSSL 0:1239e9b70ca2 1482 byte* subjectHash;
wolfSSL 0:1239e9b70ca2 1483
wolfSSL 0:1239e9b70ca2 1484 CYASSL_MSG("Adding a CA");
wolfSSL 0:1239e9b70ca2 1485 InitDecodedCert(&cert, der.buffer, der.length, cm->heap);
wolfSSL 0:1239e9b70ca2 1486 ret = ParseCert(&cert, CA_TYPE, verify, cm);
wolfSSL 0:1239e9b70ca2 1487 CYASSL_MSG(" Parsed new CA");
wolfSSL 0:1239e9b70ca2 1488
wolfSSL 0:1239e9b70ca2 1489 #ifndef NO_SKID
wolfSSL 0:1239e9b70ca2 1490 subjectHash = cert.extSubjKeyId;
wolfSSL 0:1239e9b70ca2 1491 #else
wolfSSL 0:1239e9b70ca2 1492 subjectHash = cert.subjectHash;
wolfSSL 0:1239e9b70ca2 1493 #endif
wolfSSL 0:1239e9b70ca2 1494
wolfSSL 0:1239e9b70ca2 1495 if (ret == 0 && cert.isCA == 0 && type != CYASSL_USER_CA) {
wolfSSL 0:1239e9b70ca2 1496 CYASSL_MSG(" Can't add as CA if not actually one");
wolfSSL 0:1239e9b70ca2 1497 ret = NOT_CA_ERROR;
wolfSSL 0:1239e9b70ca2 1498 }
wolfSSL 0:1239e9b70ca2 1499 #ifndef ALLOW_INVALID_CERTSIGN
wolfSSL 0:1239e9b70ca2 1500 else if (ret == 0 && cert.isCA == 1 && type != CYASSL_USER_CA &&
wolfSSL 0:1239e9b70ca2 1501 (cert.extKeyUsage & KEYUSE_KEY_CERT_SIGN) == 0) {
wolfSSL 0:1239e9b70ca2 1502 /* Intermediate CA certs are required to have the keyCertSign
wolfSSL 0:1239e9b70ca2 1503 * extension set. User loaded root certs are not. */
wolfSSL 0:1239e9b70ca2 1504 CYASSL_MSG(" Doesn't have key usage certificate signing");
wolfSSL 0:1239e9b70ca2 1505 ret = NOT_CA_ERROR;
wolfSSL 0:1239e9b70ca2 1506 }
wolfSSL 0:1239e9b70ca2 1507 #endif
wolfSSL 0:1239e9b70ca2 1508 else if (ret == 0 && AlreadySigner(cm, subjectHash)) {
wolfSSL 0:1239e9b70ca2 1509 CYASSL_MSG(" Already have this CA, not adding again");
wolfSSL 0:1239e9b70ca2 1510 (void)ret;
wolfSSL 0:1239e9b70ca2 1511 }
wolfSSL 0:1239e9b70ca2 1512 else if (ret == 0) {
wolfSSL 0:1239e9b70ca2 1513 /* take over signer parts */
wolfSSL 0:1239e9b70ca2 1514 signer = MakeSigner(cm->heap);
wolfSSL 0:1239e9b70ca2 1515 if (!signer)
wolfSSL 0:1239e9b70ca2 1516 ret = MEMORY_ERROR;
wolfSSL 0:1239e9b70ca2 1517 else {
wolfSSL 0:1239e9b70ca2 1518 signer->keyOID = cert.keyOID;
wolfSSL 0:1239e9b70ca2 1519 signer->publicKey = cert.publicKey;
wolfSSL 0:1239e9b70ca2 1520 signer->pubKeySize = cert.pubKeySize;
wolfSSL 0:1239e9b70ca2 1521 signer->nameLen = cert.subjectCNLen;
wolfSSL 0:1239e9b70ca2 1522 signer->name = cert.subjectCN;
wolfSSL 0:1239e9b70ca2 1523 #ifndef IGNORE_NAME_CONSTRAINTS
wolfSSL 0:1239e9b70ca2 1524 signer->permittedNames = cert.permittedNames;
wolfSSL 0:1239e9b70ca2 1525 signer->excludedNames = cert.excludedNames;
wolfSSL 0:1239e9b70ca2 1526 #endif
wolfSSL 0:1239e9b70ca2 1527 #ifndef NO_SKID
wolfSSL 0:1239e9b70ca2 1528 XMEMCPY(signer->subjectKeyIdHash,
wolfSSL 0:1239e9b70ca2 1529 cert.extSubjKeyId, SHA_DIGEST_SIZE);
wolfSSL 0:1239e9b70ca2 1530 #endif
wolfSSL 0:1239e9b70ca2 1531 XMEMCPY(signer->subjectNameHash, cert.subjectHash, SHA_DIGEST_SIZE);
wolfSSL 0:1239e9b70ca2 1532 signer->keyUsage = cert.extKeyUsageSet ? cert.extKeyUsage : 0xFFFF;
wolfSSL 0:1239e9b70ca2 1533 /* If Key Usage not set, all uses valid. */
wolfSSL 0:1239e9b70ca2 1534 signer->next = NULL; /* in case lock fails */
wolfSSL 0:1239e9b70ca2 1535
wolfSSL 0:1239e9b70ca2 1536 cert.publicKey = 0; /* don't free here */
wolfSSL 0:1239e9b70ca2 1537 cert.subjectCN = 0;
wolfSSL 0:1239e9b70ca2 1538 #ifndef IGNORE_NAME_CONSTRAINTS
wolfSSL 0:1239e9b70ca2 1539 cert.permittedNames = NULL;
wolfSSL 0:1239e9b70ca2 1540 cert.excludedNames = NULL;
wolfSSL 0:1239e9b70ca2 1541 #endif
wolfSSL 0:1239e9b70ca2 1542
wolfSSL 0:1239e9b70ca2 1543 #ifndef NO_SKID
wolfSSL 0:1239e9b70ca2 1544 row = HashSigner(signer->subjectKeyIdHash);
wolfSSL 0:1239e9b70ca2 1545 #else
wolfSSL 0:1239e9b70ca2 1546 row = HashSigner(signer->subjectNameHash);
wolfSSL 0:1239e9b70ca2 1547 #endif
wolfSSL 0:1239e9b70ca2 1548
wolfSSL 0:1239e9b70ca2 1549 if (LockMutex(&cm->caLock) == 0) {
wolfSSL 0:1239e9b70ca2 1550 signer->next = cm->caTable[row];
wolfSSL 0:1239e9b70ca2 1551 cm->caTable[row] = signer; /* takes ownership */
wolfSSL 0:1239e9b70ca2 1552 UnLockMutex(&cm->caLock);
wolfSSL 0:1239e9b70ca2 1553 if (cm->caCacheCallback)
wolfSSL 0:1239e9b70ca2 1554 cm->caCacheCallback(der.buffer, (int)der.length, type);
wolfSSL 0:1239e9b70ca2 1555 }
wolfSSL 0:1239e9b70ca2 1556 else {
wolfSSL 0:1239e9b70ca2 1557 CYASSL_MSG(" CA Mutex Lock failed");
wolfSSL 0:1239e9b70ca2 1558 ret = BAD_MUTEX_E;
wolfSSL 0:1239e9b70ca2 1559 FreeSigner(signer, cm->heap);
wolfSSL 0:1239e9b70ca2 1560 }
wolfSSL 0:1239e9b70ca2 1561 }
wolfSSL 0:1239e9b70ca2 1562 }
wolfSSL 0:1239e9b70ca2 1563
wolfSSL 0:1239e9b70ca2 1564 CYASSL_MSG(" Freeing Parsed CA");
wolfSSL 0:1239e9b70ca2 1565 FreeDecodedCert(&cert);
wolfSSL 0:1239e9b70ca2 1566 CYASSL_MSG(" Freeing der CA");
wolfSSL 0:1239e9b70ca2 1567 XFREE(der.buffer, cm->heap, DYNAMIC_TYPE_CA);
wolfSSL 0:1239e9b70ca2 1568 CYASSL_MSG(" OK Freeing der CA");
wolfSSL 0:1239e9b70ca2 1569
wolfSSL 0:1239e9b70ca2 1570 CYASSL_LEAVE("AddCA", ret);
wolfSSL 0:1239e9b70ca2 1571 if (ret == 0) return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 1572 return ret;
wolfSSL 0:1239e9b70ca2 1573 }
wolfSSL 0:1239e9b70ca2 1574
wolfSSL 0:1239e9b70ca2 1575 #endif /* !NO_CERTS */
wolfSSL 0:1239e9b70ca2 1576
wolfSSL 0:1239e9b70ca2 1577
wolfSSL 0:1239e9b70ca2 1578 #ifndef NO_SESSION_CACHE
wolfSSL 0:1239e9b70ca2 1579
wolfSSL 0:1239e9b70ca2 1580 /* basic config gives a cache with 33 sessions, adequate for clients and
wolfSSL 0:1239e9b70ca2 1581 embedded servers
wolfSSL 0:1239e9b70ca2 1582
wolfSSL 0:1239e9b70ca2 1583 MEDIUM_SESSION_CACHE allows 1055 sessions, adequate for servers that
wolfSSL 0:1239e9b70ca2 1584 aren't under heavy load, basically allows 200 new sessions per minute
wolfSSL 0:1239e9b70ca2 1585
wolfSSL 0:1239e9b70ca2 1586 BIG_SESSION_CACHE yields 20,027 sessions
wolfSSL 0:1239e9b70ca2 1587
wolfSSL 0:1239e9b70ca2 1588 HUGE_SESSION_CACHE yields 65,791 sessions, for servers under heavy load,
wolfSSL 0:1239e9b70ca2 1589 allows over 13,000 new sessions per minute or over 200 new sessions per
wolfSSL 0:1239e9b70ca2 1590 second
wolfSSL 0:1239e9b70ca2 1591
wolfSSL 0:1239e9b70ca2 1592 SMALL_SESSION_CACHE only stores 6 sessions, good for embedded clients
wolfSSL 0:1239e9b70ca2 1593 or systems where the default of nearly 3kB is too much RAM, this define
wolfSSL 0:1239e9b70ca2 1594 uses less than 500 bytes RAM
wolfSSL 0:1239e9b70ca2 1595
wolfSSL 0:1239e9b70ca2 1596 default SESSION_CACHE stores 33 sessions (no XXX_SESSION_CACHE defined)
wolfSSL 0:1239e9b70ca2 1597 */
wolfSSL 0:1239e9b70ca2 1598 #ifdef HUGE_SESSION_CACHE
wolfSSL 0:1239e9b70ca2 1599 #define SESSIONS_PER_ROW 11
wolfSSL 0:1239e9b70ca2 1600 #define SESSION_ROWS 5981
wolfSSL 0:1239e9b70ca2 1601 #elif defined(BIG_SESSION_CACHE)
wolfSSL 0:1239e9b70ca2 1602 #define SESSIONS_PER_ROW 7
wolfSSL 0:1239e9b70ca2 1603 #define SESSION_ROWS 2861
wolfSSL 0:1239e9b70ca2 1604 #elif defined(MEDIUM_SESSION_CACHE)
wolfSSL 0:1239e9b70ca2 1605 #define SESSIONS_PER_ROW 5
wolfSSL 0:1239e9b70ca2 1606 #define SESSION_ROWS 211
wolfSSL 0:1239e9b70ca2 1607 #elif defined(SMALL_SESSION_CACHE)
wolfSSL 0:1239e9b70ca2 1608 #define SESSIONS_PER_ROW 2
wolfSSL 0:1239e9b70ca2 1609 #define SESSION_ROWS 3
wolfSSL 0:1239e9b70ca2 1610 #else
wolfSSL 0:1239e9b70ca2 1611 #define SESSIONS_PER_ROW 3
wolfSSL 0:1239e9b70ca2 1612 #define SESSION_ROWS 11
wolfSSL 0:1239e9b70ca2 1613 #endif
wolfSSL 0:1239e9b70ca2 1614
wolfSSL 0:1239e9b70ca2 1615 typedef struct SessionRow {
wolfSSL 0:1239e9b70ca2 1616 int nextIdx; /* where to place next one */
wolfSSL 0:1239e9b70ca2 1617 int totalCount; /* sessions ever on this row */
wolfSSL 0:1239e9b70ca2 1618 CYASSL_SESSION Sessions[SESSIONS_PER_ROW];
wolfSSL 0:1239e9b70ca2 1619 } SessionRow;
wolfSSL 0:1239e9b70ca2 1620
wolfSSL 0:1239e9b70ca2 1621 static SessionRow SessionCache[SESSION_ROWS];
wolfSSL 0:1239e9b70ca2 1622
wolfSSL 0:1239e9b70ca2 1623 static CyaSSL_Mutex session_mutex; /* SessionCache mutex */
wolfSSL 0:1239e9b70ca2 1624
wolfSSL 0:1239e9b70ca2 1625 #ifndef NO_CLIENT_CACHE
wolfSSL 0:1239e9b70ca2 1626
wolfSSL 0:1239e9b70ca2 1627 typedef struct ClientSession {
wolfSSL 0:1239e9b70ca2 1628 word16 serverRow; /* SessionCache Row id */
wolfSSL 0:1239e9b70ca2 1629 word16 serverIdx; /* SessionCache Idx (column) */
wolfSSL 0:1239e9b70ca2 1630 } ClientSession;
wolfSSL 0:1239e9b70ca2 1631
wolfSSL 0:1239e9b70ca2 1632 typedef struct ClientRow {
wolfSSL 0:1239e9b70ca2 1633 int nextIdx; /* where to place next one */
wolfSSL 0:1239e9b70ca2 1634 int totalCount; /* sessions ever on this row */
wolfSSL 0:1239e9b70ca2 1635 ClientSession Clients[SESSIONS_PER_ROW];
wolfSSL 0:1239e9b70ca2 1636 } ClientRow;
wolfSSL 0:1239e9b70ca2 1637
wolfSSL 0:1239e9b70ca2 1638 static ClientRow ClientCache[SESSION_ROWS]; /* Client Cache */
wolfSSL 0:1239e9b70ca2 1639 /* uses session mutex */
wolfSSL 0:1239e9b70ca2 1640 #endif /* NO_CLIENT_CACHE */
wolfSSL 0:1239e9b70ca2 1641
wolfSSL 0:1239e9b70ca2 1642 #endif /* NO_SESSION_CACHE */
wolfSSL 0:1239e9b70ca2 1643
wolfSSL 0:1239e9b70ca2 1644
wolfSSL 0:1239e9b70ca2 1645 int CyaSSL_Init(void)
wolfSSL 0:1239e9b70ca2 1646 {
wolfSSL 0:1239e9b70ca2 1647 int ret = SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 1648
wolfSSL 0:1239e9b70ca2 1649 CYASSL_ENTER("CyaSSL_Init");
wolfSSL 0:1239e9b70ca2 1650
wolfSSL 0:1239e9b70ca2 1651 if (initRefCount == 0) {
wolfSSL 0:1239e9b70ca2 1652 #ifndef NO_SESSION_CACHE
wolfSSL 0:1239e9b70ca2 1653 if (InitMutex(&session_mutex) != 0)
wolfSSL 0:1239e9b70ca2 1654 ret = BAD_MUTEX_E;
wolfSSL 0:1239e9b70ca2 1655 #endif
wolfSSL 0:1239e9b70ca2 1656 if (InitMutex(&count_mutex) != 0)
wolfSSL 0:1239e9b70ca2 1657 ret = BAD_MUTEX_E;
wolfSSL 0:1239e9b70ca2 1658 }
wolfSSL 0:1239e9b70ca2 1659 if (ret == SSL_SUCCESS) {
wolfSSL 0:1239e9b70ca2 1660 if (LockMutex(&count_mutex) != 0) {
wolfSSL 0:1239e9b70ca2 1661 CYASSL_MSG("Bad Lock Mutex count");
wolfSSL 0:1239e9b70ca2 1662 return BAD_MUTEX_E;
wolfSSL 0:1239e9b70ca2 1663 }
wolfSSL 0:1239e9b70ca2 1664 initRefCount++;
wolfSSL 0:1239e9b70ca2 1665 UnLockMutex(&count_mutex);
wolfSSL 0:1239e9b70ca2 1666 }
wolfSSL 0:1239e9b70ca2 1667
wolfSSL 0:1239e9b70ca2 1668 return ret;
wolfSSL 0:1239e9b70ca2 1669 }
wolfSSL 0:1239e9b70ca2 1670
wolfSSL 0:1239e9b70ca2 1671
wolfSSL 0:1239e9b70ca2 1672 #ifndef NO_CERTS
wolfSSL 0:1239e9b70ca2 1673
wolfSSL 0:1239e9b70ca2 1674 /* Remove PEM header/footer, convert to ASN1, store any encrypted data
wolfSSL 0:1239e9b70ca2 1675 info->consumed tracks of PEM bytes consumed in case multiple parts */
wolfSSL 0:1239e9b70ca2 1676 int PemToDer(const unsigned char* buff, long longSz, int type,
wolfSSL 0:1239e9b70ca2 1677 buffer* der, void* heap, EncryptedInfo* info, int* eccKey)
wolfSSL 0:1239e9b70ca2 1678 {
wolfSSL 0:1239e9b70ca2 1679 char header[PEM_LINE_LEN];
wolfSSL 0:1239e9b70ca2 1680 char footer[PEM_LINE_LEN];
wolfSSL 0:1239e9b70ca2 1681 char* headerEnd;
wolfSSL 0:1239e9b70ca2 1682 char* footerEnd;
wolfSSL 0:1239e9b70ca2 1683 char* consumedEnd;
wolfSSL 0:1239e9b70ca2 1684 char* bufferEnd = (char*)(buff + longSz);
wolfSSL 0:1239e9b70ca2 1685 long neededSz;
wolfSSL 0:1239e9b70ca2 1686 int ret = 0;
wolfSSL 0:1239e9b70ca2 1687 int pkcs8 = 0;
wolfSSL 0:1239e9b70ca2 1688 int pkcs8Enc = 0;
wolfSSL 0:1239e9b70ca2 1689 int dynamicType = 0;
wolfSSL 0:1239e9b70ca2 1690 int sz = (int)longSz;
wolfSSL 0:1239e9b70ca2 1691
wolfSSL 0:1239e9b70ca2 1692 (void)heap;
wolfSSL 0:1239e9b70ca2 1693 (void)dynamicType;
wolfSSL 0:1239e9b70ca2 1694
wolfSSL 0:1239e9b70ca2 1695 if (type == CERT_TYPE || type == CA_TYPE) {
wolfSSL 0:1239e9b70ca2 1696 XSTRNCPY(header, "-----BEGIN CERTIFICATE-----", sizeof(header));
wolfSSL 0:1239e9b70ca2 1697 XSTRNCPY(footer, "-----END CERTIFICATE-----", sizeof(footer));
wolfSSL 0:1239e9b70ca2 1698 dynamicType = (type == CA_TYPE) ? DYNAMIC_TYPE_CA :
wolfSSL 0:1239e9b70ca2 1699 DYNAMIC_TYPE_CERT;
wolfSSL 0:1239e9b70ca2 1700 } else if (type == CERTREQ_TYPE) {
wolfSSL 0:1239e9b70ca2 1701 XSTRNCPY(header, "-----BEGIN CERTIFICATE REQUEST-----",
wolfSSL 0:1239e9b70ca2 1702 sizeof(header));
wolfSSL 0:1239e9b70ca2 1703 XSTRNCPY(footer, "-----END CERTIFICATE REQUEST-----",
wolfSSL 0:1239e9b70ca2 1704 sizeof(footer));
wolfSSL 0:1239e9b70ca2 1705 dynamicType = DYNAMIC_TYPE_KEY;
wolfSSL 0:1239e9b70ca2 1706 } else if (type == DH_PARAM_TYPE) {
wolfSSL 0:1239e9b70ca2 1707 XSTRNCPY(header, "-----BEGIN DH PARAMETERS-----", sizeof(header));
wolfSSL 0:1239e9b70ca2 1708 XSTRNCPY(footer, "-----END DH PARAMETERS-----", sizeof(footer));
wolfSSL 0:1239e9b70ca2 1709 dynamicType = DYNAMIC_TYPE_KEY;
wolfSSL 0:1239e9b70ca2 1710 } else if (type == CRL_TYPE) {
wolfSSL 0:1239e9b70ca2 1711 XSTRNCPY(header, "-----BEGIN X509 CRL-----", sizeof(header));
wolfSSL 0:1239e9b70ca2 1712 XSTRNCPY(footer, "-----END X509 CRL-----", sizeof(footer));
wolfSSL 0:1239e9b70ca2 1713 dynamicType = DYNAMIC_TYPE_CRL;
wolfSSL 0:1239e9b70ca2 1714 } else {
wolfSSL 0:1239e9b70ca2 1715 XSTRNCPY(header, "-----BEGIN RSA PRIVATE KEY-----", sizeof(header));
wolfSSL 0:1239e9b70ca2 1716 XSTRNCPY(footer, "-----END RSA PRIVATE KEY-----", sizeof(footer));
wolfSSL 0:1239e9b70ca2 1717 dynamicType = DYNAMIC_TYPE_KEY;
wolfSSL 0:1239e9b70ca2 1718 }
wolfSSL 0:1239e9b70ca2 1719
wolfSSL 0:1239e9b70ca2 1720 /* find header */
wolfSSL 0:1239e9b70ca2 1721 headerEnd = XSTRNSTR((char*)buff, header, sz);
wolfSSL 0:1239e9b70ca2 1722 if (!headerEnd && type == PRIVATEKEY_TYPE) { /* may be pkcs8 */
wolfSSL 0:1239e9b70ca2 1723 XSTRNCPY(header, "-----BEGIN PRIVATE KEY-----", sizeof(header));
wolfSSL 0:1239e9b70ca2 1724 XSTRNCPY(footer, "-----END PRIVATE KEY-----", sizeof(footer));
wolfSSL 0:1239e9b70ca2 1725
wolfSSL 0:1239e9b70ca2 1726 headerEnd = XSTRNSTR((char*)buff, header, sz);
wolfSSL 0:1239e9b70ca2 1727 if (headerEnd)
wolfSSL 0:1239e9b70ca2 1728 pkcs8 = 1;
wolfSSL 0:1239e9b70ca2 1729 else {
wolfSSL 0:1239e9b70ca2 1730 XSTRNCPY(header, "-----BEGIN ENCRYPTED PRIVATE KEY-----",
wolfSSL 0:1239e9b70ca2 1731 sizeof(header));
wolfSSL 0:1239e9b70ca2 1732 XSTRNCPY(footer, "-----END ENCRYPTED PRIVATE KEY-----",
wolfSSL 0:1239e9b70ca2 1733 sizeof(footer));
wolfSSL 0:1239e9b70ca2 1734
wolfSSL 0:1239e9b70ca2 1735 headerEnd = XSTRNSTR((char*)buff, header, sz);
wolfSSL 0:1239e9b70ca2 1736 if (headerEnd) {
wolfSSL 0:1239e9b70ca2 1737 pkcs8Enc = 1;
wolfSSL 0:1239e9b70ca2 1738 (void)pkcs8Enc; /* only opensslextra will read */
wolfSSL 0:1239e9b70ca2 1739 }
wolfSSL 0:1239e9b70ca2 1740 }
wolfSSL 0:1239e9b70ca2 1741 }
wolfSSL 0:1239e9b70ca2 1742 if (!headerEnd && type == PRIVATEKEY_TYPE) { /* may be ecc */
wolfSSL 0:1239e9b70ca2 1743 XSTRNCPY(header, "-----BEGIN EC PRIVATE KEY-----", sizeof(header));
wolfSSL 0:1239e9b70ca2 1744 XSTRNCPY(footer, "-----END EC PRIVATE KEY-----", sizeof(footer));
wolfSSL 0:1239e9b70ca2 1745
wolfSSL 0:1239e9b70ca2 1746 headerEnd = XSTRNSTR((char*)buff, header, sz);
wolfSSL 0:1239e9b70ca2 1747 if (headerEnd)
wolfSSL 0:1239e9b70ca2 1748 *eccKey = 1;
wolfSSL 0:1239e9b70ca2 1749 }
wolfSSL 0:1239e9b70ca2 1750 if (!headerEnd && type == PRIVATEKEY_TYPE) { /* may be dsa */
wolfSSL 0:1239e9b70ca2 1751 XSTRNCPY(header, "-----BEGIN DSA PRIVATE KEY-----", sizeof(header));
wolfSSL 0:1239e9b70ca2 1752 XSTRNCPY(footer, "-----END DSA PRIVATE KEY-----", sizeof(footer));
wolfSSL 0:1239e9b70ca2 1753
wolfSSL 0:1239e9b70ca2 1754 headerEnd = XSTRNSTR((char*)buff, header, sz);
wolfSSL 0:1239e9b70ca2 1755 }
wolfSSL 0:1239e9b70ca2 1756 if (!headerEnd) {
wolfSSL 0:1239e9b70ca2 1757 CYASSL_MSG("Couldn't find PEM header");
wolfSSL 0:1239e9b70ca2 1758 return SSL_NO_PEM_HEADER;
wolfSSL 0:1239e9b70ca2 1759 }
wolfSSL 0:1239e9b70ca2 1760 headerEnd += XSTRLEN(header);
wolfSSL 0:1239e9b70ca2 1761
wolfSSL 0:1239e9b70ca2 1762 /* eat end of line */
wolfSSL 0:1239e9b70ca2 1763 if (headerEnd[0] == '\n')
wolfSSL 0:1239e9b70ca2 1764 headerEnd++;
wolfSSL 0:1239e9b70ca2 1765 else if (headerEnd[1] == '\n')
wolfSSL 0:1239e9b70ca2 1766 headerEnd += 2;
wolfSSL 0:1239e9b70ca2 1767 else
wolfSSL 0:1239e9b70ca2 1768 return SSL_BAD_FILE;
wolfSSL 0:1239e9b70ca2 1769
wolfSSL 0:1239e9b70ca2 1770 #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
wolfSSL 0:1239e9b70ca2 1771 {
wolfSSL 0:1239e9b70ca2 1772 /* remove encrypted header if there */
wolfSSL 0:1239e9b70ca2 1773 char encHeader[] = "Proc-Type";
wolfSSL 0:1239e9b70ca2 1774 char* line = XSTRNSTR((char*)buff, encHeader, PEM_LINE_LEN);
wolfSSL 0:1239e9b70ca2 1775 if (line) {
wolfSSL 0:1239e9b70ca2 1776 char* newline;
wolfSSL 0:1239e9b70ca2 1777 char* finish;
wolfSSL 0:1239e9b70ca2 1778 char* start = XSTRNSTR(line, "DES", PEM_LINE_LEN);
wolfSSL 0:1239e9b70ca2 1779
wolfSSL 0:1239e9b70ca2 1780 if (!start)
wolfSSL 0:1239e9b70ca2 1781 start = XSTRNSTR(line, "AES", PEM_LINE_LEN);
wolfSSL 0:1239e9b70ca2 1782
wolfSSL 0:1239e9b70ca2 1783 if (!start) return SSL_BAD_FILE;
wolfSSL 0:1239e9b70ca2 1784 if (!info) return SSL_BAD_FILE;
wolfSSL 0:1239e9b70ca2 1785
wolfSSL 0:1239e9b70ca2 1786 finish = XSTRNSTR(start, ",", PEM_LINE_LEN);
wolfSSL 0:1239e9b70ca2 1787
wolfSSL 0:1239e9b70ca2 1788 if (start && finish && (start < finish)) {
wolfSSL 0:1239e9b70ca2 1789 newline = XSTRNSTR(finish, "\r", PEM_LINE_LEN);
wolfSSL 0:1239e9b70ca2 1790
wolfSSL 0:1239e9b70ca2 1791 XMEMCPY(info->name, start, finish - start);
wolfSSL 0:1239e9b70ca2 1792 info->name[finish - start] = 0;
wolfSSL 0:1239e9b70ca2 1793 XMEMCPY(info->iv, finish + 1, sizeof(info->iv));
wolfSSL 0:1239e9b70ca2 1794
wolfSSL 0:1239e9b70ca2 1795 if (!newline) newline = XSTRNSTR(finish, "\n", PEM_LINE_LEN);
wolfSSL 0:1239e9b70ca2 1796 if (newline && (newline > finish)) {
wolfSSL 0:1239e9b70ca2 1797 info->ivSz = (word32)(newline - (finish + 1));
wolfSSL 0:1239e9b70ca2 1798 info->set = 1;
wolfSSL 0:1239e9b70ca2 1799 }
wolfSSL 0:1239e9b70ca2 1800 else
wolfSSL 0:1239e9b70ca2 1801 return SSL_BAD_FILE;
wolfSSL 0:1239e9b70ca2 1802 }
wolfSSL 0:1239e9b70ca2 1803 else
wolfSSL 0:1239e9b70ca2 1804 return SSL_BAD_FILE;
wolfSSL 0:1239e9b70ca2 1805
wolfSSL 0:1239e9b70ca2 1806 /* eat blank line */
wolfSSL 0:1239e9b70ca2 1807 while (*newline == '\r' || *newline == '\n')
wolfSSL 0:1239e9b70ca2 1808 newline++;
wolfSSL 0:1239e9b70ca2 1809 headerEnd = newline;
wolfSSL 0:1239e9b70ca2 1810 }
wolfSSL 0:1239e9b70ca2 1811 }
wolfSSL 0:1239e9b70ca2 1812 #endif /* OPENSSL_EXTRA || HAVE_WEBSERVER */
wolfSSL 0:1239e9b70ca2 1813
wolfSSL 0:1239e9b70ca2 1814 /* find footer */
wolfSSL 0:1239e9b70ca2 1815 footerEnd = XSTRNSTR((char*)buff, footer, sz);
wolfSSL 0:1239e9b70ca2 1816 if (!footerEnd) return SSL_BAD_FILE;
wolfSSL 0:1239e9b70ca2 1817
wolfSSL 0:1239e9b70ca2 1818 consumedEnd = footerEnd + XSTRLEN(footer);
wolfSSL 0:1239e9b70ca2 1819
wolfSSL 0:1239e9b70ca2 1820 if (consumedEnd < bufferEnd) { /* handle no end of line on last line */
wolfSSL 0:1239e9b70ca2 1821 /* eat end of line */
wolfSSL 0:1239e9b70ca2 1822 if (consumedEnd[0] == '\n')
wolfSSL 0:1239e9b70ca2 1823 consumedEnd++;
wolfSSL 0:1239e9b70ca2 1824 else if (consumedEnd[1] == '\n')
wolfSSL 0:1239e9b70ca2 1825 consumedEnd += 2;
wolfSSL 0:1239e9b70ca2 1826 else
wolfSSL 0:1239e9b70ca2 1827 return SSL_BAD_FILE;
wolfSSL 0:1239e9b70ca2 1828 }
wolfSSL 0:1239e9b70ca2 1829
wolfSSL 0:1239e9b70ca2 1830 if (info)
wolfSSL 0:1239e9b70ca2 1831 info->consumed = (long)(consumedEnd - (char*)buff);
wolfSSL 0:1239e9b70ca2 1832
wolfSSL 0:1239e9b70ca2 1833 /* set up der buffer */
wolfSSL 0:1239e9b70ca2 1834 neededSz = (long)(footerEnd - headerEnd);
wolfSSL 0:1239e9b70ca2 1835 if (neededSz > sz || neededSz < 0) return SSL_BAD_FILE;
wolfSSL 0:1239e9b70ca2 1836 der->buffer = (byte*) XMALLOC(neededSz, heap, dynamicType);
wolfSSL 0:1239e9b70ca2 1837 if (!der->buffer) return MEMORY_ERROR;
wolfSSL 0:1239e9b70ca2 1838 der->length = (word32)neededSz;
wolfSSL 0:1239e9b70ca2 1839
wolfSSL 0:1239e9b70ca2 1840 if (Base64_Decode((byte*)headerEnd, (word32)neededSz, der->buffer,
wolfSSL 0:1239e9b70ca2 1841 &der->length) < 0)
wolfSSL 0:1239e9b70ca2 1842 return SSL_BAD_FILE;
wolfSSL 0:1239e9b70ca2 1843
wolfSSL 0:1239e9b70ca2 1844 if (pkcs8) {
wolfSSL 0:1239e9b70ca2 1845 /* convert and adjust length */
wolfSSL 0:1239e9b70ca2 1846 if ( (ret = ToTraditional(der->buffer, der->length)) < 0 ) {
wolfSSL 0:1239e9b70ca2 1847 return ret;
wolfSSL 0:1239e9b70ca2 1848 } else {
wolfSSL 0:1239e9b70ca2 1849 der->length = ret;
wolfSSL 0:1239e9b70ca2 1850 return 0;
wolfSSL 0:1239e9b70ca2 1851 }
wolfSSL 0:1239e9b70ca2 1852 }
wolfSSL 0:1239e9b70ca2 1853
wolfSSL 0:1239e9b70ca2 1854 #if (defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)) && !defined(NO_PWDBASED)
wolfSSL 0:1239e9b70ca2 1855 if (pkcs8Enc) {
wolfSSL 0:1239e9b70ca2 1856 int passwordSz;
wolfSSL 0:1239e9b70ca2 1857 char password[80];
wolfSSL 0:1239e9b70ca2 1858
wolfSSL 0:1239e9b70ca2 1859 if (!info || !info->ctx || !info->ctx->passwd_cb)
wolfSSL 0:1239e9b70ca2 1860 return SSL_BAD_FILE; /* no callback error */
wolfSSL 0:1239e9b70ca2 1861 passwordSz = info->ctx->passwd_cb(password, sizeof(password), 0,
wolfSSL 0:1239e9b70ca2 1862 info->ctx->userdata);
wolfSSL 0:1239e9b70ca2 1863 /* convert and adjust length */
wolfSSL 0:1239e9b70ca2 1864 if ( (ret = ToTraditionalEnc(der->buffer, der->length, password,
wolfSSL 0:1239e9b70ca2 1865 passwordSz)) < 0 ) {
wolfSSL 0:1239e9b70ca2 1866 return ret;
wolfSSL 0:1239e9b70ca2 1867 } else {
wolfSSL 0:1239e9b70ca2 1868 der->length = ret;
wolfSSL 0:1239e9b70ca2 1869 return 0;
wolfSSL 0:1239e9b70ca2 1870 }
wolfSSL 0:1239e9b70ca2 1871 }
wolfSSL 0:1239e9b70ca2 1872 #endif
wolfSSL 0:1239e9b70ca2 1873
wolfSSL 0:1239e9b70ca2 1874 return 0;
wolfSSL 0:1239e9b70ca2 1875 }
wolfSSL 0:1239e9b70ca2 1876
wolfSSL 0:1239e9b70ca2 1877
wolfSSL 0:1239e9b70ca2 1878 /* process the buffer buff, legnth sz, into ctx of format and type
wolfSSL 0:1239e9b70ca2 1879 used tracks bytes consumed, userChain specifies a user cert chain
wolfSSL 0:1239e9b70ca2 1880 to pass during the handshake */
wolfSSL 0:1239e9b70ca2 1881 static int ProcessBuffer(CYASSL_CTX* ctx, const unsigned char* buff,
wolfSSL 0:1239e9b70ca2 1882 long sz, int format, int type, CYASSL* ssl,
wolfSSL 0:1239e9b70ca2 1883 long* used, int userChain)
wolfSSL 0:1239e9b70ca2 1884 {
wolfSSL 0:1239e9b70ca2 1885 EncryptedInfo info;
wolfSSL 0:1239e9b70ca2 1886 buffer der; /* holds DER or RAW (for NTRU) */
wolfSSL 0:1239e9b70ca2 1887 int ret;
wolfSSL 0:1239e9b70ca2 1888 int dynamicType = 0;
wolfSSL 0:1239e9b70ca2 1889 int eccKey = 0;
wolfSSL 0:1239e9b70ca2 1890 int rsaKey = 0;
wolfSSL 0:1239e9b70ca2 1891 void* heap = ctx ? ctx->heap : NULL;
wolfSSL 0:1239e9b70ca2 1892
wolfSSL 0:1239e9b70ca2 1893 info.set = 0;
wolfSSL 0:1239e9b70ca2 1894 info.ctx = ctx;
wolfSSL 0:1239e9b70ca2 1895 info.consumed = 0;
wolfSSL 0:1239e9b70ca2 1896 der.buffer = 0;
wolfSSL 0:1239e9b70ca2 1897
wolfSSL 0:1239e9b70ca2 1898 (void)dynamicType;
wolfSSL 0:1239e9b70ca2 1899 (void)rsaKey;
wolfSSL 0:1239e9b70ca2 1900
wolfSSL 0:1239e9b70ca2 1901 if (used)
wolfSSL 0:1239e9b70ca2 1902 *used = sz; /* used bytes default to sz, PEM chain may shorten*/
wolfSSL 0:1239e9b70ca2 1903
wolfSSL 0:1239e9b70ca2 1904 if (format != SSL_FILETYPE_ASN1 && format != SSL_FILETYPE_PEM
wolfSSL 0:1239e9b70ca2 1905 && format != SSL_FILETYPE_RAW)
wolfSSL 0:1239e9b70ca2 1906 return SSL_BAD_FILETYPE;
wolfSSL 0:1239e9b70ca2 1907
wolfSSL 0:1239e9b70ca2 1908 if (type == CA_TYPE)
wolfSSL 0:1239e9b70ca2 1909 dynamicType = DYNAMIC_TYPE_CA;
wolfSSL 0:1239e9b70ca2 1910 else if (type == CERT_TYPE)
wolfSSL 0:1239e9b70ca2 1911 dynamicType = DYNAMIC_TYPE_CERT;
wolfSSL 0:1239e9b70ca2 1912 else
wolfSSL 0:1239e9b70ca2 1913 dynamicType = DYNAMIC_TYPE_KEY;
wolfSSL 0:1239e9b70ca2 1914
wolfSSL 0:1239e9b70ca2 1915 if (format == SSL_FILETYPE_PEM) {
wolfSSL 0:1239e9b70ca2 1916 ret = PemToDer(buff, sz, type, &der, heap, &info, &eccKey);
wolfSSL 0:1239e9b70ca2 1917 if (ret < 0) {
wolfSSL 0:1239e9b70ca2 1918 XFREE(der.buffer, heap, dynamicType);
wolfSSL 0:1239e9b70ca2 1919 return ret;
wolfSSL 0:1239e9b70ca2 1920 }
wolfSSL 0:1239e9b70ca2 1921 if (used)
wolfSSL 0:1239e9b70ca2 1922 *used = info.consumed;
wolfSSL 0:1239e9b70ca2 1923 /* we may have a user cert chain, try to consume */
wolfSSL 0:1239e9b70ca2 1924 if (userChain && type == CERT_TYPE && info.consumed < sz) {
wolfSSL 0:1239e9b70ca2 1925 byte staticBuffer[FILE_BUFFER_SIZE]; /* tmp chain buffer */
wolfSSL 0:1239e9b70ca2 1926 byte* chainBuffer = staticBuffer;
wolfSSL 0:1239e9b70ca2 1927 int dynamicBuffer = 0;
wolfSSL 0:1239e9b70ca2 1928 word32 bufferSz = sizeof(staticBuffer);
wolfSSL 0:1239e9b70ca2 1929 long consumed = info.consumed;
wolfSSL 0:1239e9b70ca2 1930 word32 idx = 0;
wolfSSL 0:1239e9b70ca2 1931 int gotOne = 0;
wolfSSL 0:1239e9b70ca2 1932
wolfSSL 0:1239e9b70ca2 1933 if ( (sz - consumed) > (int)bufferSz) {
wolfSSL 0:1239e9b70ca2 1934 CYASSL_MSG("Growing Tmp Chain Buffer");
wolfSSL 0:1239e9b70ca2 1935 bufferSz = (word32)(sz - consumed);
wolfSSL 0:1239e9b70ca2 1936 /* will shrink to actual size */
wolfSSL 0:1239e9b70ca2 1937 chainBuffer = (byte*)XMALLOC(bufferSz, heap,
wolfSSL 0:1239e9b70ca2 1938 DYNAMIC_TYPE_FILE);
wolfSSL 0:1239e9b70ca2 1939 if (chainBuffer == NULL) {
wolfSSL 0:1239e9b70ca2 1940 XFREE(der.buffer, heap, dynamicType);
wolfSSL 0:1239e9b70ca2 1941 return MEMORY_E;
wolfSSL 0:1239e9b70ca2 1942 }
wolfSSL 0:1239e9b70ca2 1943 dynamicBuffer = 1;
wolfSSL 0:1239e9b70ca2 1944 }
wolfSSL 0:1239e9b70ca2 1945
wolfSSL 0:1239e9b70ca2 1946 CYASSL_MSG("Processing Cert Chain");
wolfSSL 0:1239e9b70ca2 1947 while (consumed < sz) {
wolfSSL 0:1239e9b70ca2 1948 buffer part;
wolfSSL 0:1239e9b70ca2 1949 info.consumed = 0;
wolfSSL 0:1239e9b70ca2 1950 part.buffer = 0;
wolfSSL 0:1239e9b70ca2 1951
wolfSSL 0:1239e9b70ca2 1952 ret = PemToDer(buff + consumed, sz - consumed, type, &part,
wolfSSL 0:1239e9b70ca2 1953 heap, &info, &eccKey);
wolfSSL 0:1239e9b70ca2 1954 if (ret == 0) {
wolfSSL 0:1239e9b70ca2 1955 gotOne = 1;
wolfSSL 0:1239e9b70ca2 1956 if ( (idx + part.length) > bufferSz) {
wolfSSL 0:1239e9b70ca2 1957 CYASSL_MSG(" Cert Chain bigger than buffer");
wolfSSL 0:1239e9b70ca2 1958 ret = BUFFER_E;
wolfSSL 0:1239e9b70ca2 1959 }
wolfSSL 0:1239e9b70ca2 1960 else {
wolfSSL 0:1239e9b70ca2 1961 c32to24(part.length, &chainBuffer[idx]);
wolfSSL 0:1239e9b70ca2 1962 idx += CERT_HEADER_SZ;
wolfSSL 0:1239e9b70ca2 1963 XMEMCPY(&chainBuffer[idx], part.buffer,part.length);
wolfSSL 0:1239e9b70ca2 1964 idx += part.length;
wolfSSL 0:1239e9b70ca2 1965 consumed += info.consumed;
wolfSSL 0:1239e9b70ca2 1966 if (used)
wolfSSL 0:1239e9b70ca2 1967 *used += info.consumed;
wolfSSL 0:1239e9b70ca2 1968 }
wolfSSL 0:1239e9b70ca2 1969 }
wolfSSL 0:1239e9b70ca2 1970
wolfSSL 0:1239e9b70ca2 1971 XFREE(part.buffer, heap, dynamicType);
wolfSSL 0:1239e9b70ca2 1972
wolfSSL 0:1239e9b70ca2 1973 if (ret == SSL_NO_PEM_HEADER && gotOne) {
wolfSSL 0:1239e9b70ca2 1974 CYASSL_MSG("We got one good PEM so stuff at end ok");
wolfSSL 0:1239e9b70ca2 1975 break;
wolfSSL 0:1239e9b70ca2 1976 }
wolfSSL 0:1239e9b70ca2 1977
wolfSSL 0:1239e9b70ca2 1978 if (ret < 0) {
wolfSSL 0:1239e9b70ca2 1979 CYASSL_MSG(" Error in Cert in Chain");
wolfSSL 0:1239e9b70ca2 1980 XFREE(der.buffer, heap, dynamicType);
wolfSSL 0:1239e9b70ca2 1981 return ret;
wolfSSL 0:1239e9b70ca2 1982 }
wolfSSL 0:1239e9b70ca2 1983 CYASSL_MSG(" Consumed another Cert in Chain");
wolfSSL 0:1239e9b70ca2 1984 }
wolfSSL 0:1239e9b70ca2 1985 CYASSL_MSG("Finished Processing Cert Chain");
wolfSSL 0:1239e9b70ca2 1986
wolfSSL 0:1239e9b70ca2 1987 if (ctx == NULL) {
wolfSSL 0:1239e9b70ca2 1988 CYASSL_MSG("certChain needs context");
wolfSSL 0:1239e9b70ca2 1989 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 1990 }
wolfSSL 0:1239e9b70ca2 1991 ctx->certChain.buffer = (byte*)XMALLOC(idx, heap,
wolfSSL 0:1239e9b70ca2 1992 dynamicType);
wolfSSL 0:1239e9b70ca2 1993 if (ctx->certChain.buffer) {
wolfSSL 0:1239e9b70ca2 1994 ctx->certChain.length = idx;
wolfSSL 0:1239e9b70ca2 1995 XMEMCPY(ctx->certChain.buffer, chainBuffer, idx);
wolfSSL 0:1239e9b70ca2 1996 }
wolfSSL 0:1239e9b70ca2 1997 if (dynamicBuffer)
wolfSSL 0:1239e9b70ca2 1998 XFREE(chainBuffer, heap, DYNAMIC_TYPE_FILE);
wolfSSL 0:1239e9b70ca2 1999 if (ctx->certChain.buffer == NULL) {
wolfSSL 0:1239e9b70ca2 2000 XFREE(der.buffer, heap, dynamicType);
wolfSSL 0:1239e9b70ca2 2001 return MEMORY_E;
wolfSSL 0:1239e9b70ca2 2002 }
wolfSSL 0:1239e9b70ca2 2003 }
wolfSSL 0:1239e9b70ca2 2004 }
wolfSSL 0:1239e9b70ca2 2005 else { /* ASN1 (DER) or RAW (NTRU) */
wolfSSL 0:1239e9b70ca2 2006 der.buffer = (byte*) XMALLOC(sz, heap, dynamicType);
wolfSSL 0:1239e9b70ca2 2007 if (!der.buffer) return MEMORY_ERROR;
wolfSSL 0:1239e9b70ca2 2008 XMEMCPY(der.buffer, buff, sz);
wolfSSL 0:1239e9b70ca2 2009 der.length = (word32)sz;
wolfSSL 0:1239e9b70ca2 2010 }
wolfSSL 0:1239e9b70ca2 2011
wolfSSL 0:1239e9b70ca2 2012 #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
wolfSSL 0:1239e9b70ca2 2013 if (info.set) {
wolfSSL 0:1239e9b70ca2 2014 /* decrypt */
wolfSSL 0:1239e9b70ca2 2015 char password[80];
wolfSSL 0:1239e9b70ca2 2016 int passwordSz;
wolfSSL 0:1239e9b70ca2 2017
wolfSSL 0:1239e9b70ca2 2018 byte key[AES_256_KEY_SIZE];
wolfSSL 0:1239e9b70ca2 2019 byte iv[AES_IV_SIZE];
wolfSSL 0:1239e9b70ca2 2020
wolfSSL 0:1239e9b70ca2 2021 if (!ctx || !ctx->passwd_cb) {
wolfSSL 0:1239e9b70ca2 2022 XFREE(der.buffer, heap, dynamicType);
wolfSSL 0:1239e9b70ca2 2023 return NO_PASSWORD;
wolfSSL 0:1239e9b70ca2 2024 }
wolfSSL 0:1239e9b70ca2 2025
wolfSSL 0:1239e9b70ca2 2026 /* use file's salt for key derivation, hex decode first */
wolfSSL 0:1239e9b70ca2 2027 if (Base16_Decode(info.iv, info.ivSz, info.iv, &info.ivSz) != 0) {
wolfSSL 0:1239e9b70ca2 2028 XFREE(der.buffer, heap, dynamicType);
wolfSSL 0:1239e9b70ca2 2029 return ASN_INPUT_E;
wolfSSL 0:1239e9b70ca2 2030 }
wolfSSL 0:1239e9b70ca2 2031
wolfSSL 0:1239e9b70ca2 2032 passwordSz = ctx->passwd_cb(password, sizeof(password), 0,
wolfSSL 0:1239e9b70ca2 2033 ctx->userdata);
wolfSSL 0:1239e9b70ca2 2034 if ( (ret = EVP_BytesToKey(info.name, "MD5", info.iv,
wolfSSL 0:1239e9b70ca2 2035 (byte*)password, passwordSz, 1, key, iv)) <= 0) {
wolfSSL 0:1239e9b70ca2 2036 XFREE(der.buffer, heap, dynamicType);
wolfSSL 0:1239e9b70ca2 2037 return ret;
wolfSSL 0:1239e9b70ca2 2038 }
wolfSSL 0:1239e9b70ca2 2039
wolfSSL 0:1239e9b70ca2 2040 if (XSTRNCMP(info.name, "DES-CBC", 7) == 0) {
wolfSSL 0:1239e9b70ca2 2041 Des enc;
wolfSSL 0:1239e9b70ca2 2042
wolfSSL 0:1239e9b70ca2 2043 ret = Des_SetKey(&enc, key, info.iv, DES_DECRYPTION);
wolfSSL 0:1239e9b70ca2 2044 if (ret != 0)
wolfSSL 0:1239e9b70ca2 2045 return ret;
wolfSSL 0:1239e9b70ca2 2046
wolfSSL 0:1239e9b70ca2 2047 Des_CbcDecrypt(&enc, der.buffer, der.buffer, der.length);
wolfSSL 0:1239e9b70ca2 2048 }
wolfSSL 0:1239e9b70ca2 2049 else if (XSTRNCMP(info.name, "DES-EDE3-CBC", 13) == 0) {
wolfSSL 0:1239e9b70ca2 2050 Des3 enc;
wolfSSL 0:1239e9b70ca2 2051
wolfSSL 0:1239e9b70ca2 2052 ret = Des3_SetKey(&enc, key, info.iv, DES_DECRYPTION);
wolfSSL 0:1239e9b70ca2 2053 if (ret != 0)
wolfSSL 0:1239e9b70ca2 2054 return ret;
wolfSSL 0:1239e9b70ca2 2055
wolfSSL 0:1239e9b70ca2 2056 ret = Des3_CbcDecrypt(&enc, der.buffer, der.buffer, der.length);
wolfSSL 0:1239e9b70ca2 2057 if (ret != 0)
wolfSSL 0:1239e9b70ca2 2058 return ret;
wolfSSL 0:1239e9b70ca2 2059 }
wolfSSL 0:1239e9b70ca2 2060 else if (XSTRNCMP(info.name, "AES-128-CBC", 13) == 0) {
wolfSSL 0:1239e9b70ca2 2061 Aes enc;
wolfSSL 0:1239e9b70ca2 2062 ret = AesSetKey(&enc, key, AES_128_KEY_SIZE, info.iv,
wolfSSL 0:1239e9b70ca2 2063 AES_DECRYPTION);
wolfSSL 0:1239e9b70ca2 2064 if (ret == 0)
wolfSSL 0:1239e9b70ca2 2065 ret = AesCbcDecrypt(&enc, der.buffer,der.buffer,der.length);
wolfSSL 0:1239e9b70ca2 2066 }
wolfSSL 0:1239e9b70ca2 2067 else if (XSTRNCMP(info.name, "AES-192-CBC", 13) == 0) {
wolfSSL 0:1239e9b70ca2 2068 Aes enc;
wolfSSL 0:1239e9b70ca2 2069 ret = AesSetKey(&enc, key, AES_192_KEY_SIZE, info.iv,
wolfSSL 0:1239e9b70ca2 2070 AES_DECRYPTION);
wolfSSL 0:1239e9b70ca2 2071 if (ret == 0)
wolfSSL 0:1239e9b70ca2 2072 ret = AesCbcDecrypt(&enc, der.buffer,der.buffer,der.length);
wolfSSL 0:1239e9b70ca2 2073 }
wolfSSL 0:1239e9b70ca2 2074 else if (XSTRNCMP(info.name, "AES-256-CBC", 13) == 0) {
wolfSSL 0:1239e9b70ca2 2075 Aes enc;
wolfSSL 0:1239e9b70ca2 2076 ret = AesSetKey(&enc, key, AES_256_KEY_SIZE, info.iv,
wolfSSL 0:1239e9b70ca2 2077 AES_DECRYPTION);
wolfSSL 0:1239e9b70ca2 2078 if (ret == 0)
wolfSSL 0:1239e9b70ca2 2079 ret = AesCbcDecrypt(&enc, der.buffer,der.buffer,der.length);
wolfSSL 0:1239e9b70ca2 2080 }
wolfSSL 0:1239e9b70ca2 2081 else {
wolfSSL 0:1239e9b70ca2 2082 XFREE(der.buffer, heap, dynamicType);
wolfSSL 0:1239e9b70ca2 2083 return SSL_BAD_FILE;
wolfSSL 0:1239e9b70ca2 2084 }
wolfSSL 0:1239e9b70ca2 2085
wolfSSL 0:1239e9b70ca2 2086 if (ret != 0) {
wolfSSL 0:1239e9b70ca2 2087 XFREE(der.buffer, heap, dynamicType);
wolfSSL 0:1239e9b70ca2 2088 return ret;
wolfSSL 0:1239e9b70ca2 2089 }
wolfSSL 0:1239e9b70ca2 2090 }
wolfSSL 0:1239e9b70ca2 2091 #endif /* OPENSSL_EXTRA || HAVE_WEBSERVER */
wolfSSL 0:1239e9b70ca2 2092
wolfSSL 0:1239e9b70ca2 2093 if (type == CA_TYPE) {
wolfSSL 0:1239e9b70ca2 2094 if (ctx == NULL) {
wolfSSL 0:1239e9b70ca2 2095 CYASSL_MSG("Need context for CA load");
wolfSSL 0:1239e9b70ca2 2096 XFREE(der.buffer, heap, dynamicType);
wolfSSL 0:1239e9b70ca2 2097 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 2098 }
wolfSSL 0:1239e9b70ca2 2099 return AddCA(ctx->cm, der, CYASSL_USER_CA, ctx->verifyPeer);
wolfSSL 0:1239e9b70ca2 2100 /* takes der over */
wolfSSL 0:1239e9b70ca2 2101 }
wolfSSL 0:1239e9b70ca2 2102 else if (type == CERT_TYPE) {
wolfSSL 0:1239e9b70ca2 2103 if (ssl) {
wolfSSL 0:1239e9b70ca2 2104 if (ssl->buffers.weOwnCert && ssl->buffers.certificate.buffer)
wolfSSL 0:1239e9b70ca2 2105 XFREE(ssl->buffers.certificate.buffer, heap,
wolfSSL 0:1239e9b70ca2 2106 dynamicType);
wolfSSL 0:1239e9b70ca2 2107 ssl->buffers.certificate = der;
wolfSSL 0:1239e9b70ca2 2108 ssl->buffers.weOwnCert = 1;
wolfSSL 0:1239e9b70ca2 2109 }
wolfSSL 0:1239e9b70ca2 2110 else if (ctx) {
wolfSSL 0:1239e9b70ca2 2111 if (ctx->certificate.buffer)
wolfSSL 0:1239e9b70ca2 2112 XFREE(ctx->certificate.buffer, heap, dynamicType);
wolfSSL 0:1239e9b70ca2 2113 ctx->certificate = der; /* takes der over */
wolfSSL 0:1239e9b70ca2 2114 }
wolfSSL 0:1239e9b70ca2 2115 }
wolfSSL 0:1239e9b70ca2 2116 else if (type == PRIVATEKEY_TYPE) {
wolfSSL 0:1239e9b70ca2 2117 if (ssl) {
wolfSSL 0:1239e9b70ca2 2118 if (ssl->buffers.weOwnKey && ssl->buffers.key.buffer)
wolfSSL 0:1239e9b70ca2 2119 XFREE(ssl->buffers.key.buffer, heap, dynamicType);
wolfSSL 0:1239e9b70ca2 2120 ssl->buffers.key = der;
wolfSSL 0:1239e9b70ca2 2121 ssl->buffers.weOwnKey = 1;
wolfSSL 0:1239e9b70ca2 2122 }
wolfSSL 0:1239e9b70ca2 2123 else if (ctx) {
wolfSSL 0:1239e9b70ca2 2124 if (ctx->privateKey.buffer)
wolfSSL 0:1239e9b70ca2 2125 XFREE(ctx->privateKey.buffer, heap, dynamicType);
wolfSSL 0:1239e9b70ca2 2126 ctx->privateKey = der; /* takes der over */
wolfSSL 0:1239e9b70ca2 2127 }
wolfSSL 0:1239e9b70ca2 2128 }
wolfSSL 0:1239e9b70ca2 2129 else {
wolfSSL 0:1239e9b70ca2 2130 XFREE(der.buffer, heap, dynamicType);
wolfSSL 0:1239e9b70ca2 2131 return SSL_BAD_CERTTYPE;
wolfSSL 0:1239e9b70ca2 2132 }
wolfSSL 0:1239e9b70ca2 2133
wolfSSL 0:1239e9b70ca2 2134 if (type == PRIVATEKEY_TYPE && format != SSL_FILETYPE_RAW) {
wolfSSL 0:1239e9b70ca2 2135 #ifndef NO_RSA
wolfSSL 0:1239e9b70ca2 2136 if (!eccKey) {
wolfSSL 0:1239e9b70ca2 2137 /* make sure RSA key can be used */
wolfSSL 0:1239e9b70ca2 2138 RsaKey key;
wolfSSL 0:1239e9b70ca2 2139 word32 idx = 0;
wolfSSL 0:1239e9b70ca2 2140
wolfSSL 0:1239e9b70ca2 2141 ret = InitRsaKey(&key, 0);
wolfSSL 0:1239e9b70ca2 2142 if (ret != 0) return ret;
wolfSSL 0:1239e9b70ca2 2143 if (RsaPrivateKeyDecode(der.buffer,&idx,&key,der.length) != 0) {
wolfSSL 0:1239e9b70ca2 2144 #ifdef HAVE_ECC
wolfSSL 0:1239e9b70ca2 2145 /* could have DER ECC (or pkcs8 ecc), no easy way to tell */
wolfSSL 0:1239e9b70ca2 2146 eccKey = 1; /* so try it out */
wolfSSL 0:1239e9b70ca2 2147 #endif
wolfSSL 0:1239e9b70ca2 2148 if (!eccKey) {
wolfSSL 0:1239e9b70ca2 2149 FreeRsaKey(&key);
wolfSSL 0:1239e9b70ca2 2150 return SSL_BAD_FILE;
wolfSSL 0:1239e9b70ca2 2151 }
wolfSSL 0:1239e9b70ca2 2152 } else {
wolfSSL 0:1239e9b70ca2 2153 rsaKey = 1;
wolfSSL 0:1239e9b70ca2 2154 (void)rsaKey; /* for no ecc builds */
wolfSSL 0:1239e9b70ca2 2155 }
wolfSSL 0:1239e9b70ca2 2156 FreeRsaKey(&key);
wolfSSL 0:1239e9b70ca2 2157 }
wolfSSL 0:1239e9b70ca2 2158 #endif
wolfSSL 0:1239e9b70ca2 2159 #ifdef HAVE_ECC
wolfSSL 0:1239e9b70ca2 2160 if (!rsaKey) {
wolfSSL 0:1239e9b70ca2 2161 /* make sure ECC key can be used */
wolfSSL 0:1239e9b70ca2 2162 word32 idx = 0;
wolfSSL 0:1239e9b70ca2 2163 ecc_key key;
wolfSSL 0:1239e9b70ca2 2164
wolfSSL 0:1239e9b70ca2 2165 ecc_init(&key);
wolfSSL 0:1239e9b70ca2 2166 if (EccPrivateKeyDecode(der.buffer,&idx,&key,der.length) != 0) {
wolfSSL 0:1239e9b70ca2 2167 ecc_free(&key);
wolfSSL 0:1239e9b70ca2 2168 return SSL_BAD_FILE;
wolfSSL 0:1239e9b70ca2 2169 }
wolfSSL 0:1239e9b70ca2 2170 ecc_free(&key);
wolfSSL 0:1239e9b70ca2 2171 eccKey = 1;
wolfSSL 0:1239e9b70ca2 2172 if (ctx)
wolfSSL 0:1239e9b70ca2 2173 ctx->haveStaticECC = 1;
wolfSSL 0:1239e9b70ca2 2174 if (ssl)
wolfSSL 0:1239e9b70ca2 2175 ssl->options.haveStaticECC = 1;
wolfSSL 0:1239e9b70ca2 2176 }
wolfSSL 0:1239e9b70ca2 2177 #endif /* HAVE_ECC */
wolfSSL 0:1239e9b70ca2 2178 }
wolfSSL 0:1239e9b70ca2 2179 else if (type == CERT_TYPE) {
wolfSSL 0:1239e9b70ca2 2180 DecodedCert cert;
wolfSSL 0:1239e9b70ca2 2181
wolfSSL 0:1239e9b70ca2 2182 CYASSL_MSG("Checking cert signature type");
wolfSSL 0:1239e9b70ca2 2183 InitDecodedCert(&cert, der.buffer, der.length, heap);
wolfSSL 0:1239e9b70ca2 2184
wolfSSL 0:1239e9b70ca2 2185 if (DecodeToKey(&cert, 0) < 0) {
wolfSSL 0:1239e9b70ca2 2186 CYASSL_MSG("Decode to key failed");
wolfSSL 0:1239e9b70ca2 2187 return SSL_BAD_FILE;
wolfSSL 0:1239e9b70ca2 2188 }
wolfSSL 0:1239e9b70ca2 2189 switch (cert.signatureOID) {
wolfSSL 0:1239e9b70ca2 2190 case CTC_SHAwECDSA:
wolfSSL 0:1239e9b70ca2 2191 case CTC_SHA256wECDSA:
wolfSSL 0:1239e9b70ca2 2192 case CTC_SHA384wECDSA:
wolfSSL 0:1239e9b70ca2 2193 case CTC_SHA512wECDSA:
wolfSSL 0:1239e9b70ca2 2194 CYASSL_MSG("ECDSA cert signature");
wolfSSL 0:1239e9b70ca2 2195 if (ctx)
wolfSSL 0:1239e9b70ca2 2196 ctx->haveECDSAsig = 1;
wolfSSL 0:1239e9b70ca2 2197 if (ssl)
wolfSSL 0:1239e9b70ca2 2198 ssl->options.haveECDSAsig = 1;
wolfSSL 0:1239e9b70ca2 2199 break;
wolfSSL 0:1239e9b70ca2 2200 default:
wolfSSL 0:1239e9b70ca2 2201 CYASSL_MSG("Not ECDSA cert signature");
wolfSSL 0:1239e9b70ca2 2202 break;
wolfSSL 0:1239e9b70ca2 2203 }
wolfSSL 0:1239e9b70ca2 2204
wolfSSL 0:1239e9b70ca2 2205 #ifdef HAVE_ECC
wolfSSL 0:1239e9b70ca2 2206 if (ctx)
wolfSSL 0:1239e9b70ca2 2207 ctx->pkCurveOID = cert.pkCurveOID;
wolfSSL 0:1239e9b70ca2 2208 if (ssl)
wolfSSL 0:1239e9b70ca2 2209 ssl->pkCurveOID = cert.pkCurveOID;
wolfSSL 0:1239e9b70ca2 2210 #endif
wolfSSL 0:1239e9b70ca2 2211
wolfSSL 0:1239e9b70ca2 2212 FreeDecodedCert(&cert);
wolfSSL 0:1239e9b70ca2 2213 }
wolfSSL 0:1239e9b70ca2 2214
wolfSSL 0:1239e9b70ca2 2215 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 2216 }
wolfSSL 0:1239e9b70ca2 2217
wolfSSL 0:1239e9b70ca2 2218
wolfSSL 0:1239e9b70ca2 2219
wolfSSL 0:1239e9b70ca2 2220
wolfSSL 0:1239e9b70ca2 2221 /* CA PEM file for verification, may have multiple/chain certs to process */
wolfSSL 0:1239e9b70ca2 2222 static int ProcessChainBuffer(CYASSL_CTX* ctx, const unsigned char* buff,
wolfSSL 0:1239e9b70ca2 2223 long sz, int format, int type, CYASSL* ssl)
wolfSSL 0:1239e9b70ca2 2224 {
wolfSSL 0:1239e9b70ca2 2225 long used = 0;
wolfSSL 0:1239e9b70ca2 2226 int ret = 0;
wolfSSL 0:1239e9b70ca2 2227 int gotOne = 0;
wolfSSL 0:1239e9b70ca2 2228
wolfSSL 0:1239e9b70ca2 2229 CYASSL_MSG("Processing CA PEM file");
wolfSSL 0:1239e9b70ca2 2230 while (used < sz) {
wolfSSL 0:1239e9b70ca2 2231 long consumed = 0;
wolfSSL 0:1239e9b70ca2 2232
wolfSSL 0:1239e9b70ca2 2233 ret = ProcessBuffer(ctx, buff + used, sz - used, format, type, ssl,
wolfSSL 0:1239e9b70ca2 2234 &consumed, 0);
wolfSSL 0:1239e9b70ca2 2235
wolfSSL 0:1239e9b70ca2 2236 if (ret == SSL_NO_PEM_HEADER && gotOne) {
wolfSSL 0:1239e9b70ca2 2237 CYASSL_MSG("We got one good PEM file so stuff at end ok");
wolfSSL 0:1239e9b70ca2 2238 ret = SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 2239 break;
wolfSSL 0:1239e9b70ca2 2240 }
wolfSSL 0:1239e9b70ca2 2241
wolfSSL 0:1239e9b70ca2 2242 if (ret < 0)
wolfSSL 0:1239e9b70ca2 2243 break;
wolfSSL 0:1239e9b70ca2 2244
wolfSSL 0:1239e9b70ca2 2245 CYASSL_MSG(" Processed a CA");
wolfSSL 0:1239e9b70ca2 2246 gotOne = 1;
wolfSSL 0:1239e9b70ca2 2247 used += consumed;
wolfSSL 0:1239e9b70ca2 2248 }
wolfSSL 0:1239e9b70ca2 2249
wolfSSL 0:1239e9b70ca2 2250 return ret;
wolfSSL 0:1239e9b70ca2 2251 }
wolfSSL 0:1239e9b70ca2 2252
wolfSSL 0:1239e9b70ca2 2253
wolfSSL 0:1239e9b70ca2 2254 /* Verify the ceritficate, SSL_SUCCESS for ok, < 0 for error */
wolfSSL 0:1239e9b70ca2 2255 int CyaSSL_CertManagerVerifyBuffer(CYASSL_CERT_MANAGER* cm, const byte* buff,
wolfSSL 0:1239e9b70ca2 2256 long sz, int format)
wolfSSL 0:1239e9b70ca2 2257 {
wolfSSL 0:1239e9b70ca2 2258 int ret = 0;
wolfSSL 0:1239e9b70ca2 2259 int eccKey = 0; /* not used */
wolfSSL 0:1239e9b70ca2 2260
wolfSSL 0:1239e9b70ca2 2261 DecodedCert cert;
wolfSSL 0:1239e9b70ca2 2262 buffer der;
wolfSSL 0:1239e9b70ca2 2263
wolfSSL 0:1239e9b70ca2 2264 CYASSL_ENTER("CyaSSL_CertManagerVerifyBuffer");
wolfSSL 0:1239e9b70ca2 2265
wolfSSL 0:1239e9b70ca2 2266 der.buffer = NULL;
wolfSSL 0:1239e9b70ca2 2267 der.length = 0;
wolfSSL 0:1239e9b70ca2 2268
wolfSSL 0:1239e9b70ca2 2269 if (format == SSL_FILETYPE_PEM) {
wolfSSL 0:1239e9b70ca2 2270 EncryptedInfo info;
wolfSSL 0:1239e9b70ca2 2271
wolfSSL 0:1239e9b70ca2 2272 info.set = 0;
wolfSSL 0:1239e9b70ca2 2273 info.ctx = NULL;
wolfSSL 0:1239e9b70ca2 2274 info.consumed = 0;
wolfSSL 0:1239e9b70ca2 2275 ret = PemToDer(buff, sz, CERT_TYPE, &der, cm->heap, &info, &eccKey);
wolfSSL 0:1239e9b70ca2 2276 InitDecodedCert(&cert, der.buffer, der.length, cm->heap);
wolfSSL 0:1239e9b70ca2 2277 }
wolfSSL 0:1239e9b70ca2 2278 else
wolfSSL 0:1239e9b70ca2 2279 InitDecodedCert(&cert, (byte*)buff, (word32)sz, cm->heap);
wolfSSL 0:1239e9b70ca2 2280
wolfSSL 0:1239e9b70ca2 2281 if (ret == 0)
wolfSSL 0:1239e9b70ca2 2282 ret = ParseCertRelative(&cert, CERT_TYPE, 1, cm);
wolfSSL 0:1239e9b70ca2 2283 #ifdef HAVE_CRL
wolfSSL 0:1239e9b70ca2 2284 if (ret == 0 && cm->crlEnabled)
wolfSSL 0:1239e9b70ca2 2285 ret = CheckCertCRL(cm->crl, &cert);
wolfSSL 0:1239e9b70ca2 2286 #endif
wolfSSL 0:1239e9b70ca2 2287
wolfSSL 0:1239e9b70ca2 2288 FreeDecodedCert(&cert);
wolfSSL 0:1239e9b70ca2 2289 XFREE(der.buffer, cm->heap, DYNAMIC_TYPE_CERT);
wolfSSL 0:1239e9b70ca2 2290
wolfSSL 0:1239e9b70ca2 2291 if (ret == 0)
wolfSSL 0:1239e9b70ca2 2292 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 2293 return ret;
wolfSSL 0:1239e9b70ca2 2294 }
wolfSSL 0:1239e9b70ca2 2295
wolfSSL 0:1239e9b70ca2 2296
wolfSSL 0:1239e9b70ca2 2297 #ifndef NO_FILESYSTEM
wolfSSL 0:1239e9b70ca2 2298
wolfSSL 0:1239e9b70ca2 2299 #if defined(CYASSL_MDK_ARM)
wolfSSL 0:1239e9b70ca2 2300 extern FILE * CyaSSL_fopen(const char *name, const char *mode) ;
wolfSSL 0:1239e9b70ca2 2301 #define XFOPEN CyaSSL_fopen
wolfSSL 0:1239e9b70ca2 2302 #else
wolfSSL 0:1239e9b70ca2 2303 #define XFOPEN fopen
wolfSSL 0:1239e9b70ca2 2304 #endif
wolfSSL 0:1239e9b70ca2 2305
wolfSSL 0:1239e9b70ca2 2306 /* process a file with name fname into ctx of format and type
wolfSSL 0:1239e9b70ca2 2307 userChain specifies a user certificate chain to pass during handshake */
wolfSSL 0:1239e9b70ca2 2308 int ProcessFile(CYASSL_CTX* ctx, const char* fname, int format, int type,
wolfSSL 0:1239e9b70ca2 2309 CYASSL* ssl, int userChain, CYASSL_CRL* crl)
wolfSSL 0:1239e9b70ca2 2310 {
wolfSSL 0:1239e9b70ca2 2311 byte staticBuffer[FILE_BUFFER_SIZE];
wolfSSL 0:1239e9b70ca2 2312 byte* myBuffer = staticBuffer;
wolfSSL 0:1239e9b70ca2 2313 int dynamic = 0;
wolfSSL 0:1239e9b70ca2 2314 int ret;
wolfSSL 0:1239e9b70ca2 2315 long sz = 0;
wolfSSL 0:1239e9b70ca2 2316 XFILE file;
wolfSSL 0:1239e9b70ca2 2317 void* heapHint = ctx ? ctx->heap : NULL;
wolfSSL 0:1239e9b70ca2 2318
wolfSSL 0:1239e9b70ca2 2319 (void)crl;
wolfSSL 0:1239e9b70ca2 2320 (void)heapHint;
wolfSSL 0:1239e9b70ca2 2321
wolfSSL 0:1239e9b70ca2 2322 if (fname == NULL) return SSL_BAD_FILE;
wolfSSL 0:1239e9b70ca2 2323
wolfSSL 0:1239e9b70ca2 2324 file = XFOPEN(fname, "rb");
wolfSSL 0:1239e9b70ca2 2325 if (file == XBADFILE) return SSL_BAD_FILE;
wolfSSL 0:1239e9b70ca2 2326 XFSEEK(file, 0, XSEEK_END);
wolfSSL 0:1239e9b70ca2 2327 sz = XFTELL(file);
wolfSSL 0:1239e9b70ca2 2328 XREWIND(file);
wolfSSL 0:1239e9b70ca2 2329
wolfSSL 0:1239e9b70ca2 2330 if (sz > (long)sizeof(staticBuffer)) {
wolfSSL 0:1239e9b70ca2 2331 CYASSL_MSG("Getting dynamic buffer");
wolfSSL 0:1239e9b70ca2 2332 myBuffer = (byte*)XMALLOC(sz, heapHint, DYNAMIC_TYPE_FILE);
wolfSSL 0:1239e9b70ca2 2333 if (myBuffer == NULL) {
wolfSSL 0:1239e9b70ca2 2334 XFCLOSE(file);
wolfSSL 0:1239e9b70ca2 2335 return SSL_BAD_FILE;
wolfSSL 0:1239e9b70ca2 2336 }
wolfSSL 0:1239e9b70ca2 2337 dynamic = 1;
wolfSSL 0:1239e9b70ca2 2338 }
wolfSSL 0:1239e9b70ca2 2339 else if (sz < 0) {
wolfSSL 0:1239e9b70ca2 2340 XFCLOSE(file);
wolfSSL 0:1239e9b70ca2 2341 return SSL_BAD_FILE;
wolfSSL 0:1239e9b70ca2 2342 }
wolfSSL 0:1239e9b70ca2 2343
wolfSSL 0:1239e9b70ca2 2344 if ( (ret = (int)XFREAD(myBuffer, sz, 1, file)) < 0)
wolfSSL 0:1239e9b70ca2 2345 ret = SSL_BAD_FILE;
wolfSSL 0:1239e9b70ca2 2346 else {
wolfSSL 0:1239e9b70ca2 2347 if (type == CA_TYPE && format == SSL_FILETYPE_PEM)
wolfSSL 0:1239e9b70ca2 2348 ret = ProcessChainBuffer(ctx, myBuffer, sz, format, type, ssl);
wolfSSL 0:1239e9b70ca2 2349 #ifdef HAVE_CRL
wolfSSL 0:1239e9b70ca2 2350 else if (type == CRL_TYPE)
wolfSSL 0:1239e9b70ca2 2351 ret = BufferLoadCRL(crl, myBuffer, sz, format);
wolfSSL 0:1239e9b70ca2 2352 #endif
wolfSSL 0:1239e9b70ca2 2353 else
wolfSSL 0:1239e9b70ca2 2354 ret = ProcessBuffer(ctx, myBuffer, sz, format, type, ssl, NULL,
wolfSSL 0:1239e9b70ca2 2355 userChain);
wolfSSL 0:1239e9b70ca2 2356 }
wolfSSL 0:1239e9b70ca2 2357
wolfSSL 0:1239e9b70ca2 2358 XFCLOSE(file);
wolfSSL 0:1239e9b70ca2 2359 if (dynamic) XFREE(myBuffer, heapHint, DYNAMIC_TYPE_FILE);
wolfSSL 0:1239e9b70ca2 2360
wolfSSL 0:1239e9b70ca2 2361 return ret;
wolfSSL 0:1239e9b70ca2 2362 }
wolfSSL 0:1239e9b70ca2 2363
wolfSSL 0:1239e9b70ca2 2364
wolfSSL 0:1239e9b70ca2 2365 /* loads file then loads each file in path, no c_rehash */
wolfSSL 0:1239e9b70ca2 2366 int CyaSSL_CTX_load_verify_locations(CYASSL_CTX* ctx, const char* file,
wolfSSL 0:1239e9b70ca2 2367 const char* path)
wolfSSL 0:1239e9b70ca2 2368 {
wolfSSL 0:1239e9b70ca2 2369 int ret = SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 2370
wolfSSL 0:1239e9b70ca2 2371 CYASSL_ENTER("CyaSSL_CTX_load_verify_locations");
wolfSSL 0:1239e9b70ca2 2372 (void)path;
wolfSSL 0:1239e9b70ca2 2373
wolfSSL 0:1239e9b70ca2 2374 if (ctx == NULL || (file == NULL && path == NULL) )
wolfSSL 0:1239e9b70ca2 2375 return SSL_FAILURE;
wolfSSL 0:1239e9b70ca2 2376
wolfSSL 0:1239e9b70ca2 2377 if (file)
wolfSSL 0:1239e9b70ca2 2378 ret = ProcessFile(ctx, file, SSL_FILETYPE_PEM, CA_TYPE, NULL, 0, NULL);
wolfSSL 0:1239e9b70ca2 2379
wolfSSL 0:1239e9b70ca2 2380 if (ret == SSL_SUCCESS && path) {
wolfSSL 0:1239e9b70ca2 2381 /* try to load each regular file in path */
wolfSSL 0:1239e9b70ca2 2382 #ifdef USE_WINDOWS_API
wolfSSL 0:1239e9b70ca2 2383 WIN32_FIND_DATAA FindFileData;
wolfSSL 0:1239e9b70ca2 2384 HANDLE hFind;
wolfSSL 0:1239e9b70ca2 2385 char name[MAX_FILENAME_SZ];
wolfSSL 0:1239e9b70ca2 2386
wolfSSL 0:1239e9b70ca2 2387 XMEMSET(name, 0, sizeof(name));
wolfSSL 0:1239e9b70ca2 2388 XSTRNCPY(name, path, MAX_FILENAME_SZ - 4);
wolfSSL 0:1239e9b70ca2 2389 XSTRNCAT(name, "\\*", 3);
wolfSSL 0:1239e9b70ca2 2390
wolfSSL 0:1239e9b70ca2 2391 hFind = FindFirstFileA(name, &FindFileData);
wolfSSL 0:1239e9b70ca2 2392 if (hFind == INVALID_HANDLE_VALUE) {
wolfSSL 0:1239e9b70ca2 2393 CYASSL_MSG("FindFirstFile for path verify locations failed");
wolfSSL 0:1239e9b70ca2 2394 return BAD_PATH_ERROR;
wolfSSL 0:1239e9b70ca2 2395 }
wolfSSL 0:1239e9b70ca2 2396
wolfSSL 0:1239e9b70ca2 2397 do {
wolfSSL 0:1239e9b70ca2 2398 if (FindFileData.dwFileAttributes != FILE_ATTRIBUTE_DIRECTORY) {
wolfSSL 0:1239e9b70ca2 2399 XSTRNCPY(name, path, MAX_FILENAME_SZ/2 - 3);
wolfSSL 0:1239e9b70ca2 2400 XSTRNCAT(name, "\\", 2);
wolfSSL 0:1239e9b70ca2 2401 XSTRNCAT(name, FindFileData.cFileName, MAX_FILENAME_SZ/2);
wolfSSL 0:1239e9b70ca2 2402
wolfSSL 0:1239e9b70ca2 2403 ret = ProcessFile(ctx, name, SSL_FILETYPE_PEM, CA_TYPE, NULL,0,
wolfSSL 0:1239e9b70ca2 2404 NULL);
wolfSSL 0:1239e9b70ca2 2405 }
wolfSSL 0:1239e9b70ca2 2406 } while (ret == SSL_SUCCESS && FindNextFileA(hFind, &FindFileData));
wolfSSL 0:1239e9b70ca2 2407
wolfSSL 0:1239e9b70ca2 2408 FindClose(hFind);
wolfSSL 0:1239e9b70ca2 2409 #elif !defined(NO_CYASSL_DIR)
wolfSSL 0:1239e9b70ca2 2410 struct dirent* entry;
wolfSSL 0:1239e9b70ca2 2411 DIR* dir = opendir(path);
wolfSSL 0:1239e9b70ca2 2412
wolfSSL 0:1239e9b70ca2 2413 if (dir == NULL) {
wolfSSL 0:1239e9b70ca2 2414 CYASSL_MSG("opendir path verify locations failed");
wolfSSL 0:1239e9b70ca2 2415 return BAD_PATH_ERROR;
wolfSSL 0:1239e9b70ca2 2416 }
wolfSSL 0:1239e9b70ca2 2417 while ( ret == SSL_SUCCESS && (entry = readdir(dir)) != NULL) {
wolfSSL 0:1239e9b70ca2 2418 char name[MAX_FILENAME_SZ];
wolfSSL 0:1239e9b70ca2 2419 struct stat s;
wolfSSL 0:1239e9b70ca2 2420
wolfSSL 0:1239e9b70ca2 2421 XMEMSET(name, 0, sizeof(name));
wolfSSL 0:1239e9b70ca2 2422 XSTRNCPY(name, path, MAX_FILENAME_SZ/2 - 2);
wolfSSL 0:1239e9b70ca2 2423 XSTRNCAT(name, "/", 1);
wolfSSL 0:1239e9b70ca2 2424 XSTRNCAT(name, entry->d_name, MAX_FILENAME_SZ/2);
wolfSSL 0:1239e9b70ca2 2425
wolfSSL 0:1239e9b70ca2 2426 if (stat(name, &s) != 0) {
wolfSSL 0:1239e9b70ca2 2427 CYASSL_MSG("stat on name failed");
wolfSSL 0:1239e9b70ca2 2428 closedir(dir);
wolfSSL 0:1239e9b70ca2 2429 return BAD_PATH_ERROR;
wolfSSL 0:1239e9b70ca2 2430 }
wolfSSL 0:1239e9b70ca2 2431 if (s.st_mode & S_IFREG) {
wolfSSL 0:1239e9b70ca2 2432 ret = ProcessFile(ctx, name, SSL_FILETYPE_PEM, CA_TYPE, NULL,0,
wolfSSL 0:1239e9b70ca2 2433 NULL);
wolfSSL 0:1239e9b70ca2 2434 }
wolfSSL 0:1239e9b70ca2 2435 }
wolfSSL 0:1239e9b70ca2 2436 closedir(dir);
wolfSSL 0:1239e9b70ca2 2437 #endif
wolfSSL 0:1239e9b70ca2 2438 }
wolfSSL 0:1239e9b70ca2 2439
wolfSSL 0:1239e9b70ca2 2440 return ret;
wolfSSL 0:1239e9b70ca2 2441 }
wolfSSL 0:1239e9b70ca2 2442
wolfSSL 0:1239e9b70ca2 2443
wolfSSL 0:1239e9b70ca2 2444 /* Verify the ceritficate, SSL_SUCCESS for ok, < 0 for error */
wolfSSL 0:1239e9b70ca2 2445 int CyaSSL_CertManagerVerify(CYASSL_CERT_MANAGER* cm, const char* fname,
wolfSSL 0:1239e9b70ca2 2446 int format)
wolfSSL 0:1239e9b70ca2 2447 {
wolfSSL 0:1239e9b70ca2 2448 int ret = SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 2449 byte staticBuffer[FILE_BUFFER_SIZE];
wolfSSL 0:1239e9b70ca2 2450 byte* myBuffer = staticBuffer;
wolfSSL 0:1239e9b70ca2 2451 int dynamic = 0;
wolfSSL 0:1239e9b70ca2 2452 long sz = 0;
wolfSSL 0:1239e9b70ca2 2453 XFILE file = XFOPEN(fname, "rb");
wolfSSL 0:1239e9b70ca2 2454
wolfSSL 0:1239e9b70ca2 2455 CYASSL_ENTER("CyaSSL_CertManagerVerify");
wolfSSL 0:1239e9b70ca2 2456
wolfSSL 0:1239e9b70ca2 2457 if (file == XBADFILE) return SSL_BAD_FILE;
wolfSSL 0:1239e9b70ca2 2458 XFSEEK(file, 0, XSEEK_END);
wolfSSL 0:1239e9b70ca2 2459 sz = XFTELL(file);
wolfSSL 0:1239e9b70ca2 2460 XREWIND(file);
wolfSSL 0:1239e9b70ca2 2461
wolfSSL 0:1239e9b70ca2 2462 if (sz > MAX_CYASSL_FILE_SIZE || sz < 0) {
wolfSSL 0:1239e9b70ca2 2463 CYASSL_MSG("CertManagerVerify file bad size");
wolfSSL 0:1239e9b70ca2 2464 XFCLOSE(file);
wolfSSL 0:1239e9b70ca2 2465 return SSL_BAD_FILE;
wolfSSL 0:1239e9b70ca2 2466 }
wolfSSL 0:1239e9b70ca2 2467
wolfSSL 0:1239e9b70ca2 2468 if (sz > (long)sizeof(staticBuffer)) {
wolfSSL 0:1239e9b70ca2 2469 CYASSL_MSG("Getting dynamic buffer");
wolfSSL 0:1239e9b70ca2 2470 myBuffer = (byte*) XMALLOC(sz, cm->heap, DYNAMIC_TYPE_FILE);
wolfSSL 0:1239e9b70ca2 2471 if (myBuffer == NULL) {
wolfSSL 0:1239e9b70ca2 2472 XFCLOSE(file);
wolfSSL 0:1239e9b70ca2 2473 return SSL_BAD_FILE;
wolfSSL 0:1239e9b70ca2 2474 }
wolfSSL 0:1239e9b70ca2 2475 dynamic = 1;
wolfSSL 0:1239e9b70ca2 2476 }
wolfSSL 0:1239e9b70ca2 2477
wolfSSL 0:1239e9b70ca2 2478 if ( (ret = (int)XFREAD(myBuffer, sz, 1, file)) < 0)
wolfSSL 0:1239e9b70ca2 2479 ret = SSL_BAD_FILE;
wolfSSL 0:1239e9b70ca2 2480 else
wolfSSL 0:1239e9b70ca2 2481 ret = CyaSSL_CertManagerVerifyBuffer(cm, myBuffer, sz, format);
wolfSSL 0:1239e9b70ca2 2482
wolfSSL 0:1239e9b70ca2 2483 XFCLOSE(file);
wolfSSL 0:1239e9b70ca2 2484 if (dynamic) XFREE(myBuffer, cm->heap, DYNAMIC_TYPE_FILE);
wolfSSL 0:1239e9b70ca2 2485
wolfSSL 0:1239e9b70ca2 2486 return ret;
wolfSSL 0:1239e9b70ca2 2487 }
wolfSSL 0:1239e9b70ca2 2488
wolfSSL 0:1239e9b70ca2 2489
wolfSSL 0:1239e9b70ca2 2490 static INLINE CYASSL_METHOD* cm_pick_method(void)
wolfSSL 0:1239e9b70ca2 2491 {
wolfSSL 0:1239e9b70ca2 2492 #ifndef NO_CYASSL_CLIENT
wolfSSL 0:1239e9b70ca2 2493 #ifdef NO_OLD_TLS
wolfSSL 0:1239e9b70ca2 2494 return CyaTLSv1_2_client_method();
wolfSSL 0:1239e9b70ca2 2495 #else
wolfSSL 0:1239e9b70ca2 2496 return CyaSSLv3_client_method();
wolfSSL 0:1239e9b70ca2 2497 #endif
wolfSSL 0:1239e9b70ca2 2498 #elif !defined(NO_CYASSL_SERVER)
wolfSSL 0:1239e9b70ca2 2499 #ifdef NO_OLD_TLS
wolfSSL 0:1239e9b70ca2 2500 return CyaTLSv1_2_server_method();
wolfSSL 0:1239e9b70ca2 2501 #else
wolfSSL 0:1239e9b70ca2 2502 return CyaSSLv3_server_method();
wolfSSL 0:1239e9b70ca2 2503 #endif
wolfSSL 0:1239e9b70ca2 2504 #else
wolfSSL 0:1239e9b70ca2 2505 return NULL;
wolfSSL 0:1239e9b70ca2 2506 #endif
wolfSSL 0:1239e9b70ca2 2507 }
wolfSSL 0:1239e9b70ca2 2508
wolfSSL 0:1239e9b70ca2 2509
wolfSSL 0:1239e9b70ca2 2510 /* like load verify locations, 1 for success, < 0 for error */
wolfSSL 0:1239e9b70ca2 2511 int CyaSSL_CertManagerLoadCA(CYASSL_CERT_MANAGER* cm, const char* file,
wolfSSL 0:1239e9b70ca2 2512 const char* path)
wolfSSL 0:1239e9b70ca2 2513 {
wolfSSL 0:1239e9b70ca2 2514 int ret = SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 2515 CYASSL_CTX* tmp;
wolfSSL 0:1239e9b70ca2 2516
wolfSSL 0:1239e9b70ca2 2517 CYASSL_ENTER("CyaSSL_CertManagerLoadCA");
wolfSSL 0:1239e9b70ca2 2518
wolfSSL 0:1239e9b70ca2 2519 if (cm == NULL) {
wolfSSL 0:1239e9b70ca2 2520 CYASSL_MSG("No CertManager error");
wolfSSL 0:1239e9b70ca2 2521 return ret;
wolfSSL 0:1239e9b70ca2 2522 }
wolfSSL 0:1239e9b70ca2 2523 tmp = CyaSSL_CTX_new(cm_pick_method());
wolfSSL 0:1239e9b70ca2 2524
wolfSSL 0:1239e9b70ca2 2525 if (tmp == NULL) {
wolfSSL 0:1239e9b70ca2 2526 CYASSL_MSG("CTX new failed");
wolfSSL 0:1239e9b70ca2 2527 return ret;
wolfSSL 0:1239e9b70ca2 2528 }
wolfSSL 0:1239e9b70ca2 2529
wolfSSL 0:1239e9b70ca2 2530 /* for tmp use */
wolfSSL 0:1239e9b70ca2 2531 CyaSSL_CertManagerFree(tmp->cm);
wolfSSL 0:1239e9b70ca2 2532 tmp->cm = cm;
wolfSSL 0:1239e9b70ca2 2533
wolfSSL 0:1239e9b70ca2 2534 ret = CyaSSL_CTX_load_verify_locations(tmp, file, path);
wolfSSL 0:1239e9b70ca2 2535
wolfSSL 0:1239e9b70ca2 2536 /* don't loose our good one */
wolfSSL 0:1239e9b70ca2 2537 tmp->cm = NULL;
wolfSSL 0:1239e9b70ca2 2538 CyaSSL_CTX_free(tmp);
wolfSSL 0:1239e9b70ca2 2539
wolfSSL 0:1239e9b70ca2 2540 return ret;
wolfSSL 0:1239e9b70ca2 2541 }
wolfSSL 0:1239e9b70ca2 2542
wolfSSL 0:1239e9b70ca2 2543
wolfSSL 0:1239e9b70ca2 2544
wolfSSL 0:1239e9b70ca2 2545 /* turn on CRL if off and compiled in, set options */
wolfSSL 0:1239e9b70ca2 2546 int CyaSSL_CertManagerEnableCRL(CYASSL_CERT_MANAGER* cm, int options)
wolfSSL 0:1239e9b70ca2 2547 {
wolfSSL 0:1239e9b70ca2 2548 int ret = SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 2549
wolfSSL 0:1239e9b70ca2 2550 (void)options;
wolfSSL 0:1239e9b70ca2 2551
wolfSSL 0:1239e9b70ca2 2552 CYASSL_ENTER("CyaSSL_CertManagerEnableCRL");
wolfSSL 0:1239e9b70ca2 2553 if (cm == NULL)
wolfSSL 0:1239e9b70ca2 2554 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 2555
wolfSSL 0:1239e9b70ca2 2556 #ifdef HAVE_CRL
wolfSSL 0:1239e9b70ca2 2557 if (cm->crl == NULL) {
wolfSSL 0:1239e9b70ca2 2558 cm->crl = (CYASSL_CRL*)XMALLOC(sizeof(CYASSL_CRL), cm->heap,
wolfSSL 0:1239e9b70ca2 2559 DYNAMIC_TYPE_CRL);
wolfSSL 0:1239e9b70ca2 2560 if (cm->crl == NULL)
wolfSSL 0:1239e9b70ca2 2561 return MEMORY_E;
wolfSSL 0:1239e9b70ca2 2562
wolfSSL 0:1239e9b70ca2 2563 if (InitCRL(cm->crl, cm) != 0) {
wolfSSL 0:1239e9b70ca2 2564 CYASSL_MSG("Init CRL failed");
wolfSSL 0:1239e9b70ca2 2565 FreeCRL(cm->crl, 1);
wolfSSL 0:1239e9b70ca2 2566 cm->crl = NULL;
wolfSSL 0:1239e9b70ca2 2567 return SSL_FAILURE;
wolfSSL 0:1239e9b70ca2 2568 }
wolfSSL 0:1239e9b70ca2 2569 }
wolfSSL 0:1239e9b70ca2 2570 cm->crlEnabled = 1;
wolfSSL 0:1239e9b70ca2 2571 if (options & CYASSL_CRL_CHECKALL)
wolfSSL 0:1239e9b70ca2 2572 cm->crlCheckAll = 1;
wolfSSL 0:1239e9b70ca2 2573 #else
wolfSSL 0:1239e9b70ca2 2574 ret = NOT_COMPILED_IN;
wolfSSL 0:1239e9b70ca2 2575 #endif
wolfSSL 0:1239e9b70ca2 2576
wolfSSL 0:1239e9b70ca2 2577 return ret;
wolfSSL 0:1239e9b70ca2 2578 }
wolfSSL 0:1239e9b70ca2 2579
wolfSSL 0:1239e9b70ca2 2580
wolfSSL 0:1239e9b70ca2 2581 int CyaSSL_CertManagerDisableCRL(CYASSL_CERT_MANAGER* cm)
wolfSSL 0:1239e9b70ca2 2582 {
wolfSSL 0:1239e9b70ca2 2583 CYASSL_ENTER("CyaSSL_CertManagerDisableCRL");
wolfSSL 0:1239e9b70ca2 2584 if (cm == NULL)
wolfSSL 0:1239e9b70ca2 2585 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 2586
wolfSSL 0:1239e9b70ca2 2587 cm->crlEnabled = 0;
wolfSSL 0:1239e9b70ca2 2588
wolfSSL 0:1239e9b70ca2 2589 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 2590 }
wolfSSL 0:1239e9b70ca2 2591
wolfSSL 0:1239e9b70ca2 2592
wolfSSL 0:1239e9b70ca2 2593 /* turn on OCSP if off and compiled in, set options */
wolfSSL 0:1239e9b70ca2 2594 int CyaSSL_CertManagerEnableOCSP(CYASSL_CERT_MANAGER* cm, int options)
wolfSSL 0:1239e9b70ca2 2595 {
wolfSSL 0:1239e9b70ca2 2596 int ret = SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 2597
wolfSSL 0:1239e9b70ca2 2598 (void)options;
wolfSSL 0:1239e9b70ca2 2599
wolfSSL 0:1239e9b70ca2 2600 CYASSL_ENTER("CyaSSL_CertManagerEnableOCSP");
wolfSSL 0:1239e9b70ca2 2601 if (cm == NULL)
wolfSSL 0:1239e9b70ca2 2602 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 2603
wolfSSL 0:1239e9b70ca2 2604 #ifdef HAVE_OCSP
wolfSSL 0:1239e9b70ca2 2605 if (cm->ocsp == NULL) {
wolfSSL 0:1239e9b70ca2 2606 cm->ocsp = (CYASSL_OCSP*)XMALLOC(sizeof(CYASSL_OCSP), cm->heap,
wolfSSL 0:1239e9b70ca2 2607 DYNAMIC_TYPE_OCSP);
wolfSSL 0:1239e9b70ca2 2608 if (cm->ocsp == NULL)
wolfSSL 0:1239e9b70ca2 2609 return MEMORY_E;
wolfSSL 0:1239e9b70ca2 2610
wolfSSL 0:1239e9b70ca2 2611 if (InitOCSP(cm->ocsp, cm) != 0) {
wolfSSL 0:1239e9b70ca2 2612 CYASSL_MSG("Init OCSP failed");
wolfSSL 0:1239e9b70ca2 2613 FreeOCSP(cm->ocsp, 1);
wolfSSL 0:1239e9b70ca2 2614 cm->ocsp = NULL;
wolfSSL 0:1239e9b70ca2 2615 return SSL_FAILURE;
wolfSSL 0:1239e9b70ca2 2616 }
wolfSSL 0:1239e9b70ca2 2617 }
wolfSSL 0:1239e9b70ca2 2618 cm->ocspEnabled = 1;
wolfSSL 0:1239e9b70ca2 2619 if (options & CYASSL_OCSP_URL_OVERRIDE)
wolfSSL 0:1239e9b70ca2 2620 cm->ocspUseOverrideURL = 1;
wolfSSL 0:1239e9b70ca2 2621 if (options & CYASSL_OCSP_NO_NONCE)
wolfSSL 0:1239e9b70ca2 2622 cm->ocspSendNonce = 0;
wolfSSL 0:1239e9b70ca2 2623 else
wolfSSL 0:1239e9b70ca2 2624 cm->ocspSendNonce = 1;
wolfSSL 0:1239e9b70ca2 2625 #ifndef CYASSL_USER_IO
wolfSSL 0:1239e9b70ca2 2626 cm->ocspIOCb = EmbedOcspLookup;
wolfSSL 0:1239e9b70ca2 2627 cm->ocspRespFreeCb = EmbedOcspRespFree;
wolfSSL 0:1239e9b70ca2 2628 #endif /* CYASSL_USER_IO */
wolfSSL 0:1239e9b70ca2 2629 #else
wolfSSL 0:1239e9b70ca2 2630 ret = NOT_COMPILED_IN;
wolfSSL 0:1239e9b70ca2 2631 #endif
wolfSSL 0:1239e9b70ca2 2632
wolfSSL 0:1239e9b70ca2 2633 return ret;
wolfSSL 0:1239e9b70ca2 2634 }
wolfSSL 0:1239e9b70ca2 2635
wolfSSL 0:1239e9b70ca2 2636
wolfSSL 0:1239e9b70ca2 2637 int CyaSSL_CertManagerDisableOCSP(CYASSL_CERT_MANAGER* cm)
wolfSSL 0:1239e9b70ca2 2638 {
wolfSSL 0:1239e9b70ca2 2639 CYASSL_ENTER("CyaSSL_CertManagerDisableOCSP");
wolfSSL 0:1239e9b70ca2 2640 if (cm == NULL)
wolfSSL 0:1239e9b70ca2 2641 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 2642
wolfSSL 0:1239e9b70ca2 2643 cm->ocspEnabled = 0;
wolfSSL 0:1239e9b70ca2 2644
wolfSSL 0:1239e9b70ca2 2645 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 2646 }
wolfSSL 0:1239e9b70ca2 2647
wolfSSL 0:1239e9b70ca2 2648
wolfSSL 0:1239e9b70ca2 2649 int CyaSSL_CTX_check_private_key(CYASSL_CTX* ctx)
wolfSSL 0:1239e9b70ca2 2650 {
wolfSSL 0:1239e9b70ca2 2651 /* TODO: check private against public for RSA match */
wolfSSL 0:1239e9b70ca2 2652 (void)ctx;
wolfSSL 0:1239e9b70ca2 2653 CYASSL_ENTER("SSL_CTX_check_private_key");
wolfSSL 0:1239e9b70ca2 2654 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 2655 }
wolfSSL 0:1239e9b70ca2 2656
wolfSSL 0:1239e9b70ca2 2657
wolfSSL 0:1239e9b70ca2 2658 #ifdef HAVE_CRL
wolfSSL 0:1239e9b70ca2 2659
wolfSSL 0:1239e9b70ca2 2660
wolfSSL 0:1239e9b70ca2 2661 /* check CRL if enabled, SSL_SUCCESS */
wolfSSL 0:1239e9b70ca2 2662 int CyaSSL_CertManagerCheckCRL(CYASSL_CERT_MANAGER* cm, byte* der, int sz)
wolfSSL 0:1239e9b70ca2 2663 {
wolfSSL 0:1239e9b70ca2 2664 int ret;
wolfSSL 0:1239e9b70ca2 2665 DecodedCert cert;
wolfSSL 0:1239e9b70ca2 2666
wolfSSL 0:1239e9b70ca2 2667 CYASSL_ENTER("CyaSSL_CertManagerCheckCRL");
wolfSSL 0:1239e9b70ca2 2668
wolfSSL 0:1239e9b70ca2 2669 if (cm == NULL)
wolfSSL 0:1239e9b70ca2 2670 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 2671
wolfSSL 0:1239e9b70ca2 2672 if (cm->crlEnabled == 0)
wolfSSL 0:1239e9b70ca2 2673 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 2674
wolfSSL 0:1239e9b70ca2 2675 InitDecodedCert(&cert, der, sz, NULL);
wolfSSL 0:1239e9b70ca2 2676
wolfSSL 0:1239e9b70ca2 2677 ret = ParseCertRelative(&cert, CERT_TYPE, NO_VERIFY, cm);
wolfSSL 0:1239e9b70ca2 2678 if (ret != 0) {
wolfSSL 0:1239e9b70ca2 2679 CYASSL_MSG("ParseCert failed");
wolfSSL 0:1239e9b70ca2 2680 return ret;
wolfSSL 0:1239e9b70ca2 2681 }
wolfSSL 0:1239e9b70ca2 2682 else {
wolfSSL 0:1239e9b70ca2 2683 ret = CheckCertCRL(cm->crl, &cert);
wolfSSL 0:1239e9b70ca2 2684 if (ret != 0) {
wolfSSL 0:1239e9b70ca2 2685 CYASSL_MSG("CheckCertCRL failed");
wolfSSL 0:1239e9b70ca2 2686 }
wolfSSL 0:1239e9b70ca2 2687 }
wolfSSL 0:1239e9b70ca2 2688
wolfSSL 0:1239e9b70ca2 2689 FreeDecodedCert(&cert);
wolfSSL 0:1239e9b70ca2 2690
wolfSSL 0:1239e9b70ca2 2691 if (ret == 0)
wolfSSL 0:1239e9b70ca2 2692 return SSL_SUCCESS; /* convert */
wolfSSL 0:1239e9b70ca2 2693
wolfSSL 0:1239e9b70ca2 2694 return ret;
wolfSSL 0:1239e9b70ca2 2695 }
wolfSSL 0:1239e9b70ca2 2696
wolfSSL 0:1239e9b70ca2 2697
wolfSSL 0:1239e9b70ca2 2698 int CyaSSL_CertManagerSetCRL_Cb(CYASSL_CERT_MANAGER* cm, CbMissingCRL cb)
wolfSSL 0:1239e9b70ca2 2699 {
wolfSSL 0:1239e9b70ca2 2700 CYASSL_ENTER("CyaSSL_CertManagerSetCRL_Cb");
wolfSSL 0:1239e9b70ca2 2701 if (cm == NULL)
wolfSSL 0:1239e9b70ca2 2702 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 2703
wolfSSL 0:1239e9b70ca2 2704 cm->cbMissingCRL = cb;
wolfSSL 0:1239e9b70ca2 2705
wolfSSL 0:1239e9b70ca2 2706 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 2707 }
wolfSSL 0:1239e9b70ca2 2708
wolfSSL 0:1239e9b70ca2 2709
wolfSSL 0:1239e9b70ca2 2710 int CyaSSL_CertManagerLoadCRL(CYASSL_CERT_MANAGER* cm, const char* path,
wolfSSL 0:1239e9b70ca2 2711 int type, int monitor)
wolfSSL 0:1239e9b70ca2 2712 {
wolfSSL 0:1239e9b70ca2 2713 CYASSL_ENTER("CyaSSL_CertManagerLoadCRL");
wolfSSL 0:1239e9b70ca2 2714 if (cm == NULL)
wolfSSL 0:1239e9b70ca2 2715 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 2716
wolfSSL 0:1239e9b70ca2 2717 if (cm->crl == NULL) {
wolfSSL 0:1239e9b70ca2 2718 if (CyaSSL_CertManagerEnableCRL(cm, 0) != SSL_SUCCESS) {
wolfSSL 0:1239e9b70ca2 2719 CYASSL_MSG("Enable CRL failed");
wolfSSL 0:1239e9b70ca2 2720 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 2721 }
wolfSSL 0:1239e9b70ca2 2722 }
wolfSSL 0:1239e9b70ca2 2723
wolfSSL 0:1239e9b70ca2 2724 return LoadCRL(cm->crl, path, type, monitor);
wolfSSL 0:1239e9b70ca2 2725 }
wolfSSL 0:1239e9b70ca2 2726
wolfSSL 0:1239e9b70ca2 2727
wolfSSL 0:1239e9b70ca2 2728 int CyaSSL_EnableCRL(CYASSL* ssl, int options)
wolfSSL 0:1239e9b70ca2 2729 {
wolfSSL 0:1239e9b70ca2 2730 CYASSL_ENTER("CyaSSL_EnableCRL");
wolfSSL 0:1239e9b70ca2 2731 if (ssl)
wolfSSL 0:1239e9b70ca2 2732 return CyaSSL_CertManagerEnableCRL(ssl->ctx->cm, options);
wolfSSL 0:1239e9b70ca2 2733 else
wolfSSL 0:1239e9b70ca2 2734 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 2735 }
wolfSSL 0:1239e9b70ca2 2736
wolfSSL 0:1239e9b70ca2 2737
wolfSSL 0:1239e9b70ca2 2738 int CyaSSL_DisableCRL(CYASSL* ssl)
wolfSSL 0:1239e9b70ca2 2739 {
wolfSSL 0:1239e9b70ca2 2740 CYASSL_ENTER("CyaSSL_DisableCRL");
wolfSSL 0:1239e9b70ca2 2741 if (ssl)
wolfSSL 0:1239e9b70ca2 2742 return CyaSSL_CertManagerDisableCRL(ssl->ctx->cm);
wolfSSL 0:1239e9b70ca2 2743 else
wolfSSL 0:1239e9b70ca2 2744 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 2745 }
wolfSSL 0:1239e9b70ca2 2746
wolfSSL 0:1239e9b70ca2 2747
wolfSSL 0:1239e9b70ca2 2748 int CyaSSL_LoadCRL(CYASSL* ssl, const char* path, int type, int monitor)
wolfSSL 0:1239e9b70ca2 2749 {
wolfSSL 0:1239e9b70ca2 2750 CYASSL_ENTER("CyaSSL_LoadCRL");
wolfSSL 0:1239e9b70ca2 2751 if (ssl)
wolfSSL 0:1239e9b70ca2 2752 return CyaSSL_CertManagerLoadCRL(ssl->ctx->cm, path, type, monitor);
wolfSSL 0:1239e9b70ca2 2753 else
wolfSSL 0:1239e9b70ca2 2754 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 2755 }
wolfSSL 0:1239e9b70ca2 2756
wolfSSL 0:1239e9b70ca2 2757
wolfSSL 0:1239e9b70ca2 2758 int CyaSSL_SetCRL_Cb(CYASSL* ssl, CbMissingCRL cb)
wolfSSL 0:1239e9b70ca2 2759 {
wolfSSL 0:1239e9b70ca2 2760 CYASSL_ENTER("CyaSSL_SetCRL_Cb");
wolfSSL 0:1239e9b70ca2 2761 if (ssl)
wolfSSL 0:1239e9b70ca2 2762 return CyaSSL_CertManagerSetCRL_Cb(ssl->ctx->cm, cb);
wolfSSL 0:1239e9b70ca2 2763 else
wolfSSL 0:1239e9b70ca2 2764 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 2765 }
wolfSSL 0:1239e9b70ca2 2766
wolfSSL 0:1239e9b70ca2 2767
wolfSSL 0:1239e9b70ca2 2768 int CyaSSL_CTX_EnableCRL(CYASSL_CTX* ctx, int options)
wolfSSL 0:1239e9b70ca2 2769 {
wolfSSL 0:1239e9b70ca2 2770 CYASSL_ENTER("CyaSSL_CTX_EnableCRL");
wolfSSL 0:1239e9b70ca2 2771 if (ctx)
wolfSSL 0:1239e9b70ca2 2772 return CyaSSL_CertManagerEnableCRL(ctx->cm, options);
wolfSSL 0:1239e9b70ca2 2773 else
wolfSSL 0:1239e9b70ca2 2774 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 2775 }
wolfSSL 0:1239e9b70ca2 2776
wolfSSL 0:1239e9b70ca2 2777
wolfSSL 0:1239e9b70ca2 2778 int CyaSSL_CTX_DisableCRL(CYASSL_CTX* ctx)
wolfSSL 0:1239e9b70ca2 2779 {
wolfSSL 0:1239e9b70ca2 2780 CYASSL_ENTER("CyaSSL_CTX_DisableCRL");
wolfSSL 0:1239e9b70ca2 2781 if (ctx)
wolfSSL 0:1239e9b70ca2 2782 return CyaSSL_CertManagerDisableCRL(ctx->cm);
wolfSSL 0:1239e9b70ca2 2783 else
wolfSSL 0:1239e9b70ca2 2784 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 2785 }
wolfSSL 0:1239e9b70ca2 2786
wolfSSL 0:1239e9b70ca2 2787
wolfSSL 0:1239e9b70ca2 2788 int CyaSSL_CTX_LoadCRL(CYASSL_CTX* ctx, const char* path, int type, int monitor)
wolfSSL 0:1239e9b70ca2 2789 {
wolfSSL 0:1239e9b70ca2 2790 CYASSL_ENTER("CyaSSL_CTX_LoadCRL");
wolfSSL 0:1239e9b70ca2 2791 if (ctx)
wolfSSL 0:1239e9b70ca2 2792 return CyaSSL_CertManagerLoadCRL(ctx->cm, path, type, monitor);
wolfSSL 0:1239e9b70ca2 2793 else
wolfSSL 0:1239e9b70ca2 2794 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 2795 }
wolfSSL 0:1239e9b70ca2 2796
wolfSSL 0:1239e9b70ca2 2797
wolfSSL 0:1239e9b70ca2 2798 int CyaSSL_CTX_SetCRL_Cb(CYASSL_CTX* ctx, CbMissingCRL cb)
wolfSSL 0:1239e9b70ca2 2799 {
wolfSSL 0:1239e9b70ca2 2800 CYASSL_ENTER("CyaSSL_CTX_SetCRL_Cb");
wolfSSL 0:1239e9b70ca2 2801 if (ctx)
wolfSSL 0:1239e9b70ca2 2802 return CyaSSL_CertManagerSetCRL_Cb(ctx->cm, cb);
wolfSSL 0:1239e9b70ca2 2803 else
wolfSSL 0:1239e9b70ca2 2804 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 2805 }
wolfSSL 0:1239e9b70ca2 2806
wolfSSL 0:1239e9b70ca2 2807
wolfSSL 0:1239e9b70ca2 2808 #endif /* HAVE_CRL */
wolfSSL 0:1239e9b70ca2 2809
wolfSSL 0:1239e9b70ca2 2810
wolfSSL 0:1239e9b70ca2 2811 #ifdef HAVE_OCSP
wolfSSL 0:1239e9b70ca2 2812
wolfSSL 0:1239e9b70ca2 2813
wolfSSL 0:1239e9b70ca2 2814 /* check CRL if enabled, SSL_SUCCESS */
wolfSSL 0:1239e9b70ca2 2815 int CyaSSL_CertManagerCheckOCSP(CYASSL_CERT_MANAGER* cm, byte* der, int sz)
wolfSSL 0:1239e9b70ca2 2816 {
wolfSSL 0:1239e9b70ca2 2817 int ret;
wolfSSL 0:1239e9b70ca2 2818 DecodedCert cert;
wolfSSL 0:1239e9b70ca2 2819
wolfSSL 0:1239e9b70ca2 2820 CYASSL_ENTER("CyaSSL_CertManagerCheckOCSP");
wolfSSL 0:1239e9b70ca2 2821
wolfSSL 0:1239e9b70ca2 2822 if (cm == NULL)
wolfSSL 0:1239e9b70ca2 2823 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 2824
wolfSSL 0:1239e9b70ca2 2825 if (cm->ocspEnabled == 0)
wolfSSL 0:1239e9b70ca2 2826 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 2827
wolfSSL 0:1239e9b70ca2 2828 InitDecodedCert(&cert, der, sz, NULL);
wolfSSL 0:1239e9b70ca2 2829
wolfSSL 0:1239e9b70ca2 2830 ret = ParseCertRelative(&cert, CERT_TYPE, NO_VERIFY, cm);
wolfSSL 0:1239e9b70ca2 2831 if (ret != 0) {
wolfSSL 0:1239e9b70ca2 2832 CYASSL_MSG("ParseCert failed");
wolfSSL 0:1239e9b70ca2 2833 return ret;
wolfSSL 0:1239e9b70ca2 2834 }
wolfSSL 0:1239e9b70ca2 2835 else {
wolfSSL 0:1239e9b70ca2 2836 ret = CheckCertOCSP(cm->ocsp, &cert);
wolfSSL 0:1239e9b70ca2 2837 if (ret != 0) {
wolfSSL 0:1239e9b70ca2 2838 CYASSL_MSG("CheckCertOCSP failed");
wolfSSL 0:1239e9b70ca2 2839 }
wolfSSL 0:1239e9b70ca2 2840 }
wolfSSL 0:1239e9b70ca2 2841
wolfSSL 0:1239e9b70ca2 2842 FreeDecodedCert(&cert);
wolfSSL 0:1239e9b70ca2 2843
wolfSSL 0:1239e9b70ca2 2844 if (ret == 0)
wolfSSL 0:1239e9b70ca2 2845 return SSL_SUCCESS; /* convert */
wolfSSL 0:1239e9b70ca2 2846
wolfSSL 0:1239e9b70ca2 2847 return ret;
wolfSSL 0:1239e9b70ca2 2848 }
wolfSSL 0:1239e9b70ca2 2849
wolfSSL 0:1239e9b70ca2 2850
wolfSSL 0:1239e9b70ca2 2851 int CyaSSL_CertManagerSetOCSPOverrideURL(CYASSL_CERT_MANAGER* cm,
wolfSSL 0:1239e9b70ca2 2852 const char* url)
wolfSSL 0:1239e9b70ca2 2853 {
wolfSSL 0:1239e9b70ca2 2854 CYASSL_ENTER("CyaSSL_CertManagerSetOCSPOverrideURL");
wolfSSL 0:1239e9b70ca2 2855 if (cm == NULL)
wolfSSL 0:1239e9b70ca2 2856 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 2857
wolfSSL 0:1239e9b70ca2 2858 XFREE(cm->ocspOverrideURL, cm->heap, 0);
wolfSSL 0:1239e9b70ca2 2859 if (url != NULL) {
wolfSSL 0:1239e9b70ca2 2860 int urlSz = (int)XSTRLEN(url) + 1;
wolfSSL 0:1239e9b70ca2 2861 cm->ocspOverrideURL = (char*)XMALLOC(urlSz, cm->heap, 0);
wolfSSL 0:1239e9b70ca2 2862 if (cm->ocspOverrideURL != NULL) {
wolfSSL 0:1239e9b70ca2 2863 XMEMCPY(cm->ocspOverrideURL, url, urlSz);
wolfSSL 0:1239e9b70ca2 2864 }
wolfSSL 0:1239e9b70ca2 2865 else
wolfSSL 0:1239e9b70ca2 2866 return MEMORY_E;
wolfSSL 0:1239e9b70ca2 2867 }
wolfSSL 0:1239e9b70ca2 2868 else
wolfSSL 0:1239e9b70ca2 2869 cm->ocspOverrideURL = NULL;
wolfSSL 0:1239e9b70ca2 2870
wolfSSL 0:1239e9b70ca2 2871 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 2872 }
wolfSSL 0:1239e9b70ca2 2873
wolfSSL 0:1239e9b70ca2 2874
wolfSSL 0:1239e9b70ca2 2875 int CyaSSL_CertManagerSetOCSP_Cb(CYASSL_CERT_MANAGER* cm,
wolfSSL 0:1239e9b70ca2 2876 CbOCSPIO ioCb, CbOCSPRespFree respFreeCb, void* ioCbCtx)
wolfSSL 0:1239e9b70ca2 2877 {
wolfSSL 0:1239e9b70ca2 2878 CYASSL_ENTER("CyaSSL_CertManagerSetOCSP_Cb");
wolfSSL 0:1239e9b70ca2 2879 if (cm == NULL)
wolfSSL 0:1239e9b70ca2 2880 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 2881
wolfSSL 0:1239e9b70ca2 2882 cm->ocspIOCb = ioCb;
wolfSSL 0:1239e9b70ca2 2883 cm->ocspRespFreeCb = respFreeCb;
wolfSSL 0:1239e9b70ca2 2884 cm->ocspIOCtx = ioCbCtx;
wolfSSL 0:1239e9b70ca2 2885
wolfSSL 0:1239e9b70ca2 2886 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 2887 }
wolfSSL 0:1239e9b70ca2 2888
wolfSSL 0:1239e9b70ca2 2889
wolfSSL 0:1239e9b70ca2 2890 int CyaSSL_EnableOCSP(CYASSL* ssl, int options)
wolfSSL 0:1239e9b70ca2 2891 {
wolfSSL 0:1239e9b70ca2 2892 CYASSL_ENTER("CyaSSL_EnableOCSP");
wolfSSL 0:1239e9b70ca2 2893 if (ssl)
wolfSSL 0:1239e9b70ca2 2894 return CyaSSL_CertManagerEnableOCSP(ssl->ctx->cm, options);
wolfSSL 0:1239e9b70ca2 2895 else
wolfSSL 0:1239e9b70ca2 2896 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 2897 }
wolfSSL 0:1239e9b70ca2 2898
wolfSSL 0:1239e9b70ca2 2899
wolfSSL 0:1239e9b70ca2 2900 int CyaSSL_DisableOCSP(CYASSL* ssl)
wolfSSL 0:1239e9b70ca2 2901 {
wolfSSL 0:1239e9b70ca2 2902 CYASSL_ENTER("CyaSSL_DisableOCSP");
wolfSSL 0:1239e9b70ca2 2903 if (ssl)
wolfSSL 0:1239e9b70ca2 2904 return CyaSSL_CertManagerDisableOCSP(ssl->ctx->cm);
wolfSSL 0:1239e9b70ca2 2905 else
wolfSSL 0:1239e9b70ca2 2906 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 2907 }
wolfSSL 0:1239e9b70ca2 2908
wolfSSL 0:1239e9b70ca2 2909
wolfSSL 0:1239e9b70ca2 2910 int CyaSSL_SetOCSP_OverrideURL(CYASSL* ssl, const char* url)
wolfSSL 0:1239e9b70ca2 2911 {
wolfSSL 0:1239e9b70ca2 2912 CYASSL_ENTER("CyaSSL_SetOCSP_OverrideURL");
wolfSSL 0:1239e9b70ca2 2913 if (ssl)
wolfSSL 0:1239e9b70ca2 2914 return CyaSSL_CertManagerSetOCSPOverrideURL(ssl->ctx->cm, url);
wolfSSL 0:1239e9b70ca2 2915 else
wolfSSL 0:1239e9b70ca2 2916 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 2917 }
wolfSSL 0:1239e9b70ca2 2918
wolfSSL 0:1239e9b70ca2 2919
wolfSSL 0:1239e9b70ca2 2920 int CyaSSL_SetOCSP_Cb(CYASSL* ssl,
wolfSSL 0:1239e9b70ca2 2921 CbOCSPIO ioCb, CbOCSPRespFree respFreeCb, void* ioCbCtx)
wolfSSL 0:1239e9b70ca2 2922 {
wolfSSL 0:1239e9b70ca2 2923 CYASSL_ENTER("CyaSSL_SetOCSP_Cb");
wolfSSL 0:1239e9b70ca2 2924 if (ssl)
wolfSSL 0:1239e9b70ca2 2925 return CyaSSL_CertManagerSetOCSP_Cb(ssl->ctx->cm,
wolfSSL 0:1239e9b70ca2 2926 ioCb, respFreeCb, ioCbCtx);
wolfSSL 0:1239e9b70ca2 2927 else
wolfSSL 0:1239e9b70ca2 2928 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 2929 }
wolfSSL 0:1239e9b70ca2 2930
wolfSSL 0:1239e9b70ca2 2931
wolfSSL 0:1239e9b70ca2 2932 int CyaSSL_CTX_EnableOCSP(CYASSL_CTX* ctx, int options)
wolfSSL 0:1239e9b70ca2 2933 {
wolfSSL 0:1239e9b70ca2 2934 CYASSL_ENTER("CyaSSL_CTX_EnableOCSP");
wolfSSL 0:1239e9b70ca2 2935 if (ctx)
wolfSSL 0:1239e9b70ca2 2936 return CyaSSL_CertManagerEnableOCSP(ctx->cm, options);
wolfSSL 0:1239e9b70ca2 2937 else
wolfSSL 0:1239e9b70ca2 2938 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 2939 }
wolfSSL 0:1239e9b70ca2 2940
wolfSSL 0:1239e9b70ca2 2941
wolfSSL 0:1239e9b70ca2 2942 int CyaSSL_CTX_DisableOCSP(CYASSL_CTX* ctx)
wolfSSL 0:1239e9b70ca2 2943 {
wolfSSL 0:1239e9b70ca2 2944 CYASSL_ENTER("CyaSSL_CTX_DisableOCSP");
wolfSSL 0:1239e9b70ca2 2945 if (ctx)
wolfSSL 0:1239e9b70ca2 2946 return CyaSSL_CertManagerDisableOCSP(ctx->cm);
wolfSSL 0:1239e9b70ca2 2947 else
wolfSSL 0:1239e9b70ca2 2948 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 2949 }
wolfSSL 0:1239e9b70ca2 2950
wolfSSL 0:1239e9b70ca2 2951
wolfSSL 0:1239e9b70ca2 2952 int CyaSSL_CTX_SetOCSP_OverrideURL(CYASSL_CTX* ctx, const char* url)
wolfSSL 0:1239e9b70ca2 2953 {
wolfSSL 0:1239e9b70ca2 2954 CYASSL_ENTER("CyaSSL_SetOCSP_OverrideURL");
wolfSSL 0:1239e9b70ca2 2955 if (ctx)
wolfSSL 0:1239e9b70ca2 2956 return CyaSSL_CertManagerSetOCSPOverrideURL(ctx->cm, url);
wolfSSL 0:1239e9b70ca2 2957 else
wolfSSL 0:1239e9b70ca2 2958 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 2959 }
wolfSSL 0:1239e9b70ca2 2960
wolfSSL 0:1239e9b70ca2 2961
wolfSSL 0:1239e9b70ca2 2962 int CyaSSL_CTX_SetOCSP_Cb(CYASSL_CTX* ctx,
wolfSSL 0:1239e9b70ca2 2963 CbOCSPIO ioCb, CbOCSPRespFree respFreeCb, void* ioCbCtx)
wolfSSL 0:1239e9b70ca2 2964 {
wolfSSL 0:1239e9b70ca2 2965 CYASSL_ENTER("CyaSSL_CTX_SetOCSP_Cb");
wolfSSL 0:1239e9b70ca2 2966 if (ctx)
wolfSSL 0:1239e9b70ca2 2967 return CyaSSL_CertManagerSetOCSP_Cb(ctx->cm, ioCb, respFreeCb, ioCbCtx);
wolfSSL 0:1239e9b70ca2 2968 else
wolfSSL 0:1239e9b70ca2 2969 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 2970 }
wolfSSL 0:1239e9b70ca2 2971
wolfSSL 0:1239e9b70ca2 2972
wolfSSL 0:1239e9b70ca2 2973 #endif /* HAVE_OCSP */
wolfSSL 0:1239e9b70ca2 2974
wolfSSL 0:1239e9b70ca2 2975
wolfSSL 0:1239e9b70ca2 2976 #ifdef CYASSL_DER_LOAD
wolfSSL 0:1239e9b70ca2 2977
wolfSSL 0:1239e9b70ca2 2978 /* Add format parameter to allow DER load of CA files */
wolfSSL 0:1239e9b70ca2 2979 int CyaSSL_CTX_der_load_verify_locations(CYASSL_CTX* ctx, const char* file,
wolfSSL 0:1239e9b70ca2 2980 int format)
wolfSSL 0:1239e9b70ca2 2981 {
wolfSSL 0:1239e9b70ca2 2982 CYASSL_ENTER("CyaSSL_CTX_der_load_verify_locations");
wolfSSL 0:1239e9b70ca2 2983 if (ctx == NULL || file == NULL)
wolfSSL 0:1239e9b70ca2 2984 return SSL_FAILURE;
wolfSSL 0:1239e9b70ca2 2985
wolfSSL 0:1239e9b70ca2 2986 if (ProcessFile(ctx, file, format, CA_TYPE, NULL, 0, NULL) == SSL_SUCCESS)
wolfSSL 0:1239e9b70ca2 2987 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 2988
wolfSSL 0:1239e9b70ca2 2989 return SSL_FAILURE;
wolfSSL 0:1239e9b70ca2 2990 }
wolfSSL 0:1239e9b70ca2 2991
wolfSSL 0:1239e9b70ca2 2992 #endif /* CYASSL_DER_LOAD */
wolfSSL 0:1239e9b70ca2 2993
wolfSSL 0:1239e9b70ca2 2994
wolfSSL 0:1239e9b70ca2 2995 #ifdef CYASSL_CERT_GEN
wolfSSL 0:1239e9b70ca2 2996
wolfSSL 0:1239e9b70ca2 2997 /* load pem cert from file into der buffer, return der size or error */
wolfSSL 0:1239e9b70ca2 2998 int CyaSSL_PemCertToDer(const char* fileName, unsigned char* derBuf, int derSz)
wolfSSL 0:1239e9b70ca2 2999 {
wolfSSL 0:1239e9b70ca2 3000 byte staticBuffer[FILE_BUFFER_SIZE];
wolfSSL 0:1239e9b70ca2 3001 byte* fileBuf = staticBuffer;
wolfSSL 0:1239e9b70ca2 3002 int dynamic = 0;
wolfSSL 0:1239e9b70ca2 3003 int ret;
wolfSSL 0:1239e9b70ca2 3004 int ecc = 0;
wolfSSL 0:1239e9b70ca2 3005 long sz = 0;
wolfSSL 0:1239e9b70ca2 3006 XFILE file = XFOPEN(fileName, "rb");
wolfSSL 0:1239e9b70ca2 3007 EncryptedInfo info;
wolfSSL 0:1239e9b70ca2 3008 buffer converted;
wolfSSL 0:1239e9b70ca2 3009
wolfSSL 0:1239e9b70ca2 3010 CYASSL_ENTER("CyaSSL_PemCertToDer");
wolfSSL 0:1239e9b70ca2 3011 converted.buffer = 0;
wolfSSL 0:1239e9b70ca2 3012
wolfSSL 0:1239e9b70ca2 3013 if (file == XBADFILE) return SSL_BAD_FILE;
wolfSSL 0:1239e9b70ca2 3014 XFSEEK(file, 0, XSEEK_END);
wolfSSL 0:1239e9b70ca2 3015 sz = XFTELL(file);
wolfSSL 0:1239e9b70ca2 3016 XREWIND(file);
wolfSSL 0:1239e9b70ca2 3017
wolfSSL 0:1239e9b70ca2 3018 if (sz > (long)sizeof(staticBuffer)) {
wolfSSL 0:1239e9b70ca2 3019 fileBuf = (byte*) XMALLOC(sz, 0, DYNAMIC_TYPE_FILE);
wolfSSL 0:1239e9b70ca2 3020 if (fileBuf == NULL) {
wolfSSL 0:1239e9b70ca2 3021 XFCLOSE(file);
wolfSSL 0:1239e9b70ca2 3022 return SSL_BAD_FILE;
wolfSSL 0:1239e9b70ca2 3023 }
wolfSSL 0:1239e9b70ca2 3024 dynamic = 1;
wolfSSL 0:1239e9b70ca2 3025 }
wolfSSL 0:1239e9b70ca2 3026 else if (sz < 0) {
wolfSSL 0:1239e9b70ca2 3027 XFCLOSE(file);
wolfSSL 0:1239e9b70ca2 3028 return SSL_BAD_FILE;
wolfSSL 0:1239e9b70ca2 3029 }
wolfSSL 0:1239e9b70ca2 3030
wolfSSL 0:1239e9b70ca2 3031 if ( (ret = (int)XFREAD(fileBuf, sz, 1, file)) < 0)
wolfSSL 0:1239e9b70ca2 3032 ret = SSL_BAD_FILE;
wolfSSL 0:1239e9b70ca2 3033 else
wolfSSL 0:1239e9b70ca2 3034 ret = PemToDer(fileBuf, sz, CA_TYPE, &converted, 0, &info, &ecc);
wolfSSL 0:1239e9b70ca2 3035
wolfSSL 0:1239e9b70ca2 3036 if (ret == 0) {
wolfSSL 0:1239e9b70ca2 3037 if (converted.length < (word32)derSz) {
wolfSSL 0:1239e9b70ca2 3038 XMEMCPY(derBuf, converted.buffer, converted.length);
wolfSSL 0:1239e9b70ca2 3039 ret = converted.length;
wolfSSL 0:1239e9b70ca2 3040 }
wolfSSL 0:1239e9b70ca2 3041 else
wolfSSL 0:1239e9b70ca2 3042 ret = BUFFER_E;
wolfSSL 0:1239e9b70ca2 3043 }
wolfSSL 0:1239e9b70ca2 3044
wolfSSL 0:1239e9b70ca2 3045 XFREE(converted.buffer, 0, DYNAMIC_TYPE_CA);
wolfSSL 0:1239e9b70ca2 3046 if (dynamic)
wolfSSL 0:1239e9b70ca2 3047 XFREE(fileBuf, 0, DYNAMIC_TYPE_FILE);
wolfSSL 0:1239e9b70ca2 3048 XFCLOSE(file);
wolfSSL 0:1239e9b70ca2 3049
wolfSSL 0:1239e9b70ca2 3050 return ret;
wolfSSL 0:1239e9b70ca2 3051 }
wolfSSL 0:1239e9b70ca2 3052
wolfSSL 0:1239e9b70ca2 3053 #endif /* CYASSL_CERT_GEN */
wolfSSL 0:1239e9b70ca2 3054
wolfSSL 0:1239e9b70ca2 3055
wolfSSL 0:1239e9b70ca2 3056 int CyaSSL_CTX_use_certificate_file(CYASSL_CTX* ctx, const char* file,
wolfSSL 0:1239e9b70ca2 3057 int format)
wolfSSL 0:1239e9b70ca2 3058 {
wolfSSL 0:1239e9b70ca2 3059 CYASSL_ENTER("CyaSSL_CTX_use_certificate_file");
wolfSSL 0:1239e9b70ca2 3060 if (ProcessFile(ctx, file, format, CERT_TYPE, NULL, 0, NULL) == SSL_SUCCESS)
wolfSSL 0:1239e9b70ca2 3061 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 3062
wolfSSL 0:1239e9b70ca2 3063 return SSL_FAILURE;
wolfSSL 0:1239e9b70ca2 3064 }
wolfSSL 0:1239e9b70ca2 3065
wolfSSL 0:1239e9b70ca2 3066
wolfSSL 0:1239e9b70ca2 3067 int CyaSSL_CTX_use_PrivateKey_file(CYASSL_CTX* ctx, const char* file,int format)
wolfSSL 0:1239e9b70ca2 3068 {
wolfSSL 0:1239e9b70ca2 3069 CYASSL_ENTER("CyaSSL_CTX_use_PrivateKey_file");
wolfSSL 0:1239e9b70ca2 3070 if (ProcessFile(ctx, file, format, PRIVATEKEY_TYPE, NULL, 0, NULL)
wolfSSL 0:1239e9b70ca2 3071 == SSL_SUCCESS)
wolfSSL 0:1239e9b70ca2 3072 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 3073
wolfSSL 0:1239e9b70ca2 3074 return SSL_FAILURE;
wolfSSL 0:1239e9b70ca2 3075 }
wolfSSL 0:1239e9b70ca2 3076
wolfSSL 0:1239e9b70ca2 3077
wolfSSL 0:1239e9b70ca2 3078 int CyaSSL_CTX_use_certificate_chain_file(CYASSL_CTX* ctx, const char* file)
wolfSSL 0:1239e9b70ca2 3079 {
wolfSSL 0:1239e9b70ca2 3080 /* procces up to MAX_CHAIN_DEPTH plus subject cert */
wolfSSL 0:1239e9b70ca2 3081 CYASSL_ENTER("CyaSSL_CTX_use_certificate_chain_file");
wolfSSL 0:1239e9b70ca2 3082 if (ProcessFile(ctx, file, SSL_FILETYPE_PEM,CERT_TYPE,NULL,1, NULL)
wolfSSL 0:1239e9b70ca2 3083 == SSL_SUCCESS)
wolfSSL 0:1239e9b70ca2 3084 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 3085
wolfSSL 0:1239e9b70ca2 3086 return SSL_FAILURE;
wolfSSL 0:1239e9b70ca2 3087 }
wolfSSL 0:1239e9b70ca2 3088
wolfSSL 0:1239e9b70ca2 3089
wolfSSL 0:1239e9b70ca2 3090 #ifdef OPENSSL_EXTRA
wolfSSL 0:1239e9b70ca2 3091 /* put SSL type in extra for now, not very common */
wolfSSL 0:1239e9b70ca2 3092
wolfSSL 0:1239e9b70ca2 3093 int CyaSSL_use_certificate_file(CYASSL* ssl, const char* file, int format)
wolfSSL 0:1239e9b70ca2 3094 {
wolfSSL 0:1239e9b70ca2 3095 CYASSL_ENTER("CyaSSL_use_certificate_file");
wolfSSL 0:1239e9b70ca2 3096 if (ProcessFile(ssl->ctx, file, format, CERT_TYPE, ssl, 0, NULL)
wolfSSL 0:1239e9b70ca2 3097 == SSL_SUCCESS)
wolfSSL 0:1239e9b70ca2 3098 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 3099
wolfSSL 0:1239e9b70ca2 3100 return SSL_FAILURE;
wolfSSL 0:1239e9b70ca2 3101 }
wolfSSL 0:1239e9b70ca2 3102
wolfSSL 0:1239e9b70ca2 3103
wolfSSL 0:1239e9b70ca2 3104 int CyaSSL_use_PrivateKey_file(CYASSL* ssl, const char* file, int format)
wolfSSL 0:1239e9b70ca2 3105 {
wolfSSL 0:1239e9b70ca2 3106 CYASSL_ENTER("CyaSSL_use_PrivateKey_file");
wolfSSL 0:1239e9b70ca2 3107 if (ProcessFile(ssl->ctx, file, format, PRIVATEKEY_TYPE, ssl, 0, NULL)
wolfSSL 0:1239e9b70ca2 3108 == SSL_SUCCESS)
wolfSSL 0:1239e9b70ca2 3109 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 3110
wolfSSL 0:1239e9b70ca2 3111 return SSL_FAILURE;
wolfSSL 0:1239e9b70ca2 3112 }
wolfSSL 0:1239e9b70ca2 3113
wolfSSL 0:1239e9b70ca2 3114
wolfSSL 0:1239e9b70ca2 3115 int CyaSSL_use_certificate_chain_file(CYASSL* ssl, const char* file)
wolfSSL 0:1239e9b70ca2 3116 {
wolfSSL 0:1239e9b70ca2 3117 /* procces up to MAX_CHAIN_DEPTH plus subject cert */
wolfSSL 0:1239e9b70ca2 3118 CYASSL_ENTER("CyaSSL_use_certificate_chain_file");
wolfSSL 0:1239e9b70ca2 3119 if (ProcessFile(ssl->ctx, file, SSL_FILETYPE_PEM, CERT_TYPE, ssl, 1, NULL)
wolfSSL 0:1239e9b70ca2 3120 == SSL_SUCCESS)
wolfSSL 0:1239e9b70ca2 3121 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 3122
wolfSSL 0:1239e9b70ca2 3123 return SSL_FAILURE;
wolfSSL 0:1239e9b70ca2 3124 }
wolfSSL 0:1239e9b70ca2 3125
wolfSSL 0:1239e9b70ca2 3126
wolfSSL 0:1239e9b70ca2 3127 /* server wrapper for ctx or ssl Diffie-Hellman parameters */
wolfSSL 0:1239e9b70ca2 3128 static int CyaSSL_SetTmpDH_buffer_wrapper(CYASSL_CTX* ctx, CYASSL* ssl,
wolfSSL 0:1239e9b70ca2 3129 const unsigned char* buf, long sz, int format)
wolfSSL 0:1239e9b70ca2 3130 {
wolfSSL 0:1239e9b70ca2 3131 buffer der;
wolfSSL 0:1239e9b70ca2 3132 int ret;
wolfSSL 0:1239e9b70ca2 3133 int weOwnDer = 0;
wolfSSL 0:1239e9b70ca2 3134 byte p[MAX_DH_SIZE];
wolfSSL 0:1239e9b70ca2 3135 byte g[MAX_DH_SIZE];
wolfSSL 0:1239e9b70ca2 3136 word32 pSz = sizeof(p);
wolfSSL 0:1239e9b70ca2 3137 word32 gSz = sizeof(g);
wolfSSL 0:1239e9b70ca2 3138
wolfSSL 0:1239e9b70ca2 3139 der.buffer = (byte*)buf;
wolfSSL 0:1239e9b70ca2 3140 der.length = (word32)sz;
wolfSSL 0:1239e9b70ca2 3141
wolfSSL 0:1239e9b70ca2 3142 if (format != SSL_FILETYPE_ASN1 && format != SSL_FILETYPE_PEM)
wolfSSL 0:1239e9b70ca2 3143 return SSL_BAD_FILETYPE;
wolfSSL 0:1239e9b70ca2 3144
wolfSSL 0:1239e9b70ca2 3145 if (format == SSL_FILETYPE_PEM) {
wolfSSL 0:1239e9b70ca2 3146 der.buffer = NULL;
wolfSSL 0:1239e9b70ca2 3147 ret = PemToDer(buf, sz, DH_PARAM_TYPE, &der, ctx->heap, NULL,NULL);
wolfSSL 0:1239e9b70ca2 3148 if (ret < 0) {
wolfSSL 0:1239e9b70ca2 3149 XFREE(der.buffer, ctx->heap, DYNAMIC_TYPE_KEY);
wolfSSL 0:1239e9b70ca2 3150 return ret;
wolfSSL 0:1239e9b70ca2 3151 }
wolfSSL 0:1239e9b70ca2 3152 weOwnDer = 1;
wolfSSL 0:1239e9b70ca2 3153 }
wolfSSL 0:1239e9b70ca2 3154
wolfSSL 0:1239e9b70ca2 3155 if (DhParamsLoad(der.buffer, der.length, p, &pSz, g, &gSz) < 0)
wolfSSL 0:1239e9b70ca2 3156 ret = SSL_BAD_FILETYPE;
wolfSSL 0:1239e9b70ca2 3157 else {
wolfSSL 0:1239e9b70ca2 3158 if (ssl)
wolfSSL 0:1239e9b70ca2 3159 ret = CyaSSL_SetTmpDH(ssl, p, pSz, g, gSz);
wolfSSL 0:1239e9b70ca2 3160 else
wolfSSL 0:1239e9b70ca2 3161 ret = CyaSSL_CTX_SetTmpDH(ctx, p, pSz, g, gSz);
wolfSSL 0:1239e9b70ca2 3162 }
wolfSSL 0:1239e9b70ca2 3163
wolfSSL 0:1239e9b70ca2 3164 if (weOwnDer)
wolfSSL 0:1239e9b70ca2 3165 XFREE(der.buffer, ctx->heap, DYNAMIC_TYPE_KEY);
wolfSSL 0:1239e9b70ca2 3166
wolfSSL 0:1239e9b70ca2 3167 return ret;
wolfSSL 0:1239e9b70ca2 3168 }
wolfSSL 0:1239e9b70ca2 3169
wolfSSL 0:1239e9b70ca2 3170 /* server Diffie-Hellman parameters, SSL_SUCCESS on ok */
wolfSSL 0:1239e9b70ca2 3171 int CyaSSL_SetTmpDH_buffer(CYASSL* ssl, const unsigned char* buf, long sz,
wolfSSL 0:1239e9b70ca2 3172 int format)
wolfSSL 0:1239e9b70ca2 3173 {
wolfSSL 0:1239e9b70ca2 3174 return CyaSSL_SetTmpDH_buffer_wrapper(ssl->ctx, ssl, buf, sz, format);
wolfSSL 0:1239e9b70ca2 3175 }
wolfSSL 0:1239e9b70ca2 3176
wolfSSL 0:1239e9b70ca2 3177
wolfSSL 0:1239e9b70ca2 3178 /* server ctx Diffie-Hellman parameters, SSL_SUCCESS on ok */
wolfSSL 0:1239e9b70ca2 3179 int CyaSSL_CTX_SetTmpDH_buffer(CYASSL_CTX* ctx, const unsigned char* buf,
wolfSSL 0:1239e9b70ca2 3180 long sz, int format)
wolfSSL 0:1239e9b70ca2 3181 {
wolfSSL 0:1239e9b70ca2 3182 return CyaSSL_SetTmpDH_buffer_wrapper(ctx, NULL, buf, sz, format);
wolfSSL 0:1239e9b70ca2 3183 }
wolfSSL 0:1239e9b70ca2 3184
wolfSSL 0:1239e9b70ca2 3185
wolfSSL 0:1239e9b70ca2 3186 #ifdef HAVE_ECC
wolfSSL 0:1239e9b70ca2 3187
wolfSSL 0:1239e9b70ca2 3188 /* Set Temp CTX EC-DHE size in octets, should be 20 - 66 for 160 - 521 bit */
wolfSSL 0:1239e9b70ca2 3189 int CyaSSL_CTX_SetTmpEC_DHE_Sz(CYASSL_CTX* ctx, word16 sz)
wolfSSL 0:1239e9b70ca2 3190 {
wolfSSL 0:1239e9b70ca2 3191 if (ctx == NULL || sz < ECC_MINSIZE || sz > ECC_MAXSIZE)
wolfSSL 0:1239e9b70ca2 3192 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 3193
wolfSSL 0:1239e9b70ca2 3194 ctx->eccTempKeySz = sz;
wolfSSL 0:1239e9b70ca2 3195
wolfSSL 0:1239e9b70ca2 3196 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 3197 }
wolfSSL 0:1239e9b70ca2 3198
wolfSSL 0:1239e9b70ca2 3199
wolfSSL 0:1239e9b70ca2 3200 /* Set Temp SSL EC-DHE size in octets, should be 20 - 66 for 160 - 521 bit */
wolfSSL 0:1239e9b70ca2 3201 int CyaSSL_SetTmpEC_DHE_Sz(CYASSL* ssl, word16 sz)
wolfSSL 0:1239e9b70ca2 3202 {
wolfSSL 0:1239e9b70ca2 3203 if (ssl == NULL || sz < ECC_MINSIZE || sz > ECC_MAXSIZE)
wolfSSL 0:1239e9b70ca2 3204 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 3205
wolfSSL 0:1239e9b70ca2 3206 ssl->eccTempKeySz = sz;
wolfSSL 0:1239e9b70ca2 3207
wolfSSL 0:1239e9b70ca2 3208 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 3209 }
wolfSSL 0:1239e9b70ca2 3210
wolfSSL 0:1239e9b70ca2 3211 #endif /* HAVE_ECC */
wolfSSL 0:1239e9b70ca2 3212
wolfSSL 0:1239e9b70ca2 3213
wolfSSL 0:1239e9b70ca2 3214 #if !defined(NO_FILESYSTEM)
wolfSSL 0:1239e9b70ca2 3215
wolfSSL 0:1239e9b70ca2 3216 /* server Diffie-Hellman parameters */
wolfSSL 0:1239e9b70ca2 3217 static int CyaSSL_SetTmpDH_file_wrapper(CYASSL_CTX* ctx, CYASSL* ssl,
wolfSSL 0:1239e9b70ca2 3218 const char* fname, int format)
wolfSSL 0:1239e9b70ca2 3219 {
wolfSSL 0:1239e9b70ca2 3220 byte staticBuffer[FILE_BUFFER_SIZE];
wolfSSL 0:1239e9b70ca2 3221 byte* myBuffer = staticBuffer;
wolfSSL 0:1239e9b70ca2 3222 int dynamic = 0;
wolfSSL 0:1239e9b70ca2 3223 int ret;
wolfSSL 0:1239e9b70ca2 3224 long sz = 0;
wolfSSL 0:1239e9b70ca2 3225 XFILE file = XFOPEN(fname, "rb");
wolfSSL 0:1239e9b70ca2 3226
wolfSSL 0:1239e9b70ca2 3227 if (file == XBADFILE) return SSL_BAD_FILE;
wolfSSL 0:1239e9b70ca2 3228 XFSEEK(file, 0, XSEEK_END);
wolfSSL 0:1239e9b70ca2 3229 sz = XFTELL(file);
wolfSSL 0:1239e9b70ca2 3230 XREWIND(file);
wolfSSL 0:1239e9b70ca2 3231
wolfSSL 0:1239e9b70ca2 3232 if (sz > (long)sizeof(staticBuffer)) {
wolfSSL 0:1239e9b70ca2 3233 CYASSL_MSG("Getting dynamic buffer");
wolfSSL 0:1239e9b70ca2 3234 myBuffer = (byte*) XMALLOC(sz, ctx->heap, DYNAMIC_TYPE_FILE);
wolfSSL 0:1239e9b70ca2 3235 if (myBuffer == NULL) {
wolfSSL 0:1239e9b70ca2 3236 XFCLOSE(file);
wolfSSL 0:1239e9b70ca2 3237 return SSL_BAD_FILE;
wolfSSL 0:1239e9b70ca2 3238 }
wolfSSL 0:1239e9b70ca2 3239 dynamic = 1;
wolfSSL 0:1239e9b70ca2 3240 }
wolfSSL 0:1239e9b70ca2 3241 else if (sz < 0) {
wolfSSL 0:1239e9b70ca2 3242 XFCLOSE(file);
wolfSSL 0:1239e9b70ca2 3243 return SSL_BAD_FILE;
wolfSSL 0:1239e9b70ca2 3244 }
wolfSSL 0:1239e9b70ca2 3245
wolfSSL 0:1239e9b70ca2 3246 if ( (ret = (int)XFREAD(myBuffer, sz, 1, file)) < 0)
wolfSSL 0:1239e9b70ca2 3247 ret = SSL_BAD_FILE;
wolfSSL 0:1239e9b70ca2 3248 else {
wolfSSL 0:1239e9b70ca2 3249 if (ssl)
wolfSSL 0:1239e9b70ca2 3250 ret = CyaSSL_SetTmpDH_buffer(ssl, myBuffer, sz, format);
wolfSSL 0:1239e9b70ca2 3251 else
wolfSSL 0:1239e9b70ca2 3252 ret = CyaSSL_CTX_SetTmpDH_buffer(ctx, myBuffer, sz, format);
wolfSSL 0:1239e9b70ca2 3253 }
wolfSSL 0:1239e9b70ca2 3254
wolfSSL 0:1239e9b70ca2 3255 XFCLOSE(file);
wolfSSL 0:1239e9b70ca2 3256 if (dynamic) XFREE(myBuffer, ctx->heap, DYNAMIC_TYPE_FILE);
wolfSSL 0:1239e9b70ca2 3257
wolfSSL 0:1239e9b70ca2 3258 return ret;
wolfSSL 0:1239e9b70ca2 3259 }
wolfSSL 0:1239e9b70ca2 3260
wolfSSL 0:1239e9b70ca2 3261 /* server Diffie-Hellman parameters */
wolfSSL 0:1239e9b70ca2 3262 int CyaSSL_SetTmpDH_file(CYASSL* ssl, const char* fname, int format)
wolfSSL 0:1239e9b70ca2 3263 {
wolfSSL 0:1239e9b70ca2 3264 return CyaSSL_SetTmpDH_file_wrapper(ssl->ctx, ssl, fname, format);
wolfSSL 0:1239e9b70ca2 3265 }
wolfSSL 0:1239e9b70ca2 3266
wolfSSL 0:1239e9b70ca2 3267
wolfSSL 0:1239e9b70ca2 3268 /* server Diffie-Hellman parameters */
wolfSSL 0:1239e9b70ca2 3269 int CyaSSL_CTX_SetTmpDH_file(CYASSL_CTX* ctx, const char* fname, int format)
wolfSSL 0:1239e9b70ca2 3270 {
wolfSSL 0:1239e9b70ca2 3271 return CyaSSL_SetTmpDH_file_wrapper(ctx, NULL, fname, format);
wolfSSL 0:1239e9b70ca2 3272 }
wolfSSL 0:1239e9b70ca2 3273
wolfSSL 0:1239e9b70ca2 3274
wolfSSL 0:1239e9b70ca2 3275 #endif /* !NO_FILESYSTEM */
wolfSSL 0:1239e9b70ca2 3276 #endif /* OPENSSL_EXTRA */
wolfSSL 0:1239e9b70ca2 3277
wolfSSL 0:1239e9b70ca2 3278 #ifdef HAVE_NTRU
wolfSSL 0:1239e9b70ca2 3279
wolfSSL 0:1239e9b70ca2 3280 int CyaSSL_CTX_use_NTRUPrivateKey_file(CYASSL_CTX* ctx, const char* file)
wolfSSL 0:1239e9b70ca2 3281 {
wolfSSL 0:1239e9b70ca2 3282 CYASSL_ENTER("CyaSSL_CTX_use_NTRUPrivateKey_file");
wolfSSL 0:1239e9b70ca2 3283 if (ctx == NULL)
wolfSSL 0:1239e9b70ca2 3284 return SSL_FAILURE;
wolfSSL 0:1239e9b70ca2 3285
wolfSSL 0:1239e9b70ca2 3286 if (ProcessFile(ctx, file, SSL_FILETYPE_RAW, PRIVATEKEY_TYPE, NULL, 0, NULL)
wolfSSL 0:1239e9b70ca2 3287 == SSL_SUCCESS) {
wolfSSL 0:1239e9b70ca2 3288 ctx->haveNTRU = 1;
wolfSSL 0:1239e9b70ca2 3289 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 3290 }
wolfSSL 0:1239e9b70ca2 3291
wolfSSL 0:1239e9b70ca2 3292 return SSL_FAILURE;
wolfSSL 0:1239e9b70ca2 3293 }
wolfSSL 0:1239e9b70ca2 3294
wolfSSL 0:1239e9b70ca2 3295 #endif /* HAVE_NTRU */
wolfSSL 0:1239e9b70ca2 3296
wolfSSL 0:1239e9b70ca2 3297
wolfSSL 0:1239e9b70ca2 3298
wolfSSL 0:1239e9b70ca2 3299 #if defined(OPENSSL_EXTRA)
wolfSSL 0:1239e9b70ca2 3300
wolfSSL 0:1239e9b70ca2 3301 int CyaSSL_CTX_use_RSAPrivateKey_file(CYASSL_CTX* ctx,const char* file,
wolfSSL 0:1239e9b70ca2 3302 int format)
wolfSSL 0:1239e9b70ca2 3303 {
wolfSSL 0:1239e9b70ca2 3304 CYASSL_ENTER("SSL_CTX_use_RSAPrivateKey_file");
wolfSSL 0:1239e9b70ca2 3305
wolfSSL 0:1239e9b70ca2 3306 return CyaSSL_CTX_use_PrivateKey_file(ctx, file, format);
wolfSSL 0:1239e9b70ca2 3307 }
wolfSSL 0:1239e9b70ca2 3308
wolfSSL 0:1239e9b70ca2 3309 int CyaSSL_use_RSAPrivateKey_file(CYASSL* ssl, const char* file, int format)
wolfSSL 0:1239e9b70ca2 3310 {
wolfSSL 0:1239e9b70ca2 3311 CYASSL_ENTER("CyaSSL_use_RSAPrivateKey_file");
wolfSSL 0:1239e9b70ca2 3312
wolfSSL 0:1239e9b70ca2 3313 return CyaSSL_use_PrivateKey_file(ssl, file, format);
wolfSSL 0:1239e9b70ca2 3314 }
wolfSSL 0:1239e9b70ca2 3315
wolfSSL 0:1239e9b70ca2 3316 #endif /* OPENSSL_EXTRA */
wolfSSL 0:1239e9b70ca2 3317
wolfSSL 0:1239e9b70ca2 3318 #endif /* NO_FILESYSTEM */
wolfSSL 0:1239e9b70ca2 3319
wolfSSL 0:1239e9b70ca2 3320
wolfSSL 0:1239e9b70ca2 3321 void CyaSSL_CTX_set_verify(CYASSL_CTX* ctx, int mode, VerifyCallback vc)
wolfSSL 0:1239e9b70ca2 3322 {
wolfSSL 0:1239e9b70ca2 3323 CYASSL_ENTER("CyaSSL_CTX_set_verify");
wolfSSL 0:1239e9b70ca2 3324 if (mode & SSL_VERIFY_PEER) {
wolfSSL 0:1239e9b70ca2 3325 ctx->verifyPeer = 1;
wolfSSL 0:1239e9b70ca2 3326 ctx->verifyNone = 0; /* in case perviously set */
wolfSSL 0:1239e9b70ca2 3327 }
wolfSSL 0:1239e9b70ca2 3328
wolfSSL 0:1239e9b70ca2 3329 if (mode == SSL_VERIFY_NONE) {
wolfSSL 0:1239e9b70ca2 3330 ctx->verifyNone = 1;
wolfSSL 0:1239e9b70ca2 3331 ctx->verifyPeer = 0; /* in case previously set */
wolfSSL 0:1239e9b70ca2 3332 }
wolfSSL 0:1239e9b70ca2 3333
wolfSSL 0:1239e9b70ca2 3334 if (mode & SSL_VERIFY_FAIL_IF_NO_PEER_CERT)
wolfSSL 0:1239e9b70ca2 3335 ctx->failNoCert = 1;
wolfSSL 0:1239e9b70ca2 3336
wolfSSL 0:1239e9b70ca2 3337 ctx->verifyCallback = vc;
wolfSSL 0:1239e9b70ca2 3338 }
wolfSSL 0:1239e9b70ca2 3339
wolfSSL 0:1239e9b70ca2 3340
wolfSSL 0:1239e9b70ca2 3341 void CyaSSL_set_verify(CYASSL* ssl, int mode, VerifyCallback vc)
wolfSSL 0:1239e9b70ca2 3342 {
wolfSSL 0:1239e9b70ca2 3343 CYASSL_ENTER("CyaSSL_set_verify");
wolfSSL 0:1239e9b70ca2 3344 if (mode & SSL_VERIFY_PEER) {
wolfSSL 0:1239e9b70ca2 3345 ssl->options.verifyPeer = 1;
wolfSSL 0:1239e9b70ca2 3346 ssl->options.verifyNone = 0; /* in case perviously set */
wolfSSL 0:1239e9b70ca2 3347 }
wolfSSL 0:1239e9b70ca2 3348
wolfSSL 0:1239e9b70ca2 3349 if (mode == SSL_VERIFY_NONE) {
wolfSSL 0:1239e9b70ca2 3350 ssl->options.verifyNone = 1;
wolfSSL 0:1239e9b70ca2 3351 ssl->options.verifyPeer = 0; /* in case previously set */
wolfSSL 0:1239e9b70ca2 3352 }
wolfSSL 0:1239e9b70ca2 3353
wolfSSL 0:1239e9b70ca2 3354 if (mode & SSL_VERIFY_FAIL_IF_NO_PEER_CERT)
wolfSSL 0:1239e9b70ca2 3355 ssl->options.failNoCert = 1;
wolfSSL 0:1239e9b70ca2 3356
wolfSSL 0:1239e9b70ca2 3357 ssl->verifyCallback = vc;
wolfSSL 0:1239e9b70ca2 3358 }
wolfSSL 0:1239e9b70ca2 3359
wolfSSL 0:1239e9b70ca2 3360
wolfSSL 0:1239e9b70ca2 3361 /* store user ctx for verify callback */
wolfSSL 0:1239e9b70ca2 3362 void CyaSSL_SetCertCbCtx(CYASSL* ssl, void* ctx)
wolfSSL 0:1239e9b70ca2 3363 {
wolfSSL 0:1239e9b70ca2 3364 CYASSL_ENTER("CyaSSL_SetCertCbCtx");
wolfSSL 0:1239e9b70ca2 3365 if (ssl)
wolfSSL 0:1239e9b70ca2 3366 ssl->verifyCbCtx = ctx;
wolfSSL 0:1239e9b70ca2 3367 }
wolfSSL 0:1239e9b70ca2 3368
wolfSSL 0:1239e9b70ca2 3369
wolfSSL 0:1239e9b70ca2 3370 /* store context CA Cache addition callback */
wolfSSL 0:1239e9b70ca2 3371 void CyaSSL_CTX_SetCACb(CYASSL_CTX* ctx, CallbackCACache cb)
wolfSSL 0:1239e9b70ca2 3372 {
wolfSSL 0:1239e9b70ca2 3373 if (ctx && ctx->cm)
wolfSSL 0:1239e9b70ca2 3374 ctx->cm->caCacheCallback = cb;
wolfSSL 0:1239e9b70ca2 3375 }
wolfSSL 0:1239e9b70ca2 3376
wolfSSL 0:1239e9b70ca2 3377
wolfSSL 0:1239e9b70ca2 3378 #if defined(PERSIST_CERT_CACHE)
wolfSSL 0:1239e9b70ca2 3379
wolfSSL 0:1239e9b70ca2 3380 #if !defined(NO_FILESYSTEM)
wolfSSL 0:1239e9b70ca2 3381
wolfSSL 0:1239e9b70ca2 3382 /* Persist cert cache to file */
wolfSSL 0:1239e9b70ca2 3383 int CyaSSL_CTX_save_cert_cache(CYASSL_CTX* ctx, const char* fname)
wolfSSL 0:1239e9b70ca2 3384 {
wolfSSL 0:1239e9b70ca2 3385 CYASSL_ENTER("CyaSSL_CTX_save_cert_cache");
wolfSSL 0:1239e9b70ca2 3386
wolfSSL 0:1239e9b70ca2 3387 if (ctx == NULL || fname == NULL)
wolfSSL 0:1239e9b70ca2 3388 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 3389
wolfSSL 0:1239e9b70ca2 3390 return CM_SaveCertCache(ctx->cm, fname);
wolfSSL 0:1239e9b70ca2 3391 }
wolfSSL 0:1239e9b70ca2 3392
wolfSSL 0:1239e9b70ca2 3393
wolfSSL 0:1239e9b70ca2 3394 /* Persist cert cache from file */
wolfSSL 0:1239e9b70ca2 3395 int CyaSSL_CTX_restore_cert_cache(CYASSL_CTX* ctx, const char* fname)
wolfSSL 0:1239e9b70ca2 3396 {
wolfSSL 0:1239e9b70ca2 3397 CYASSL_ENTER("CyaSSL_CTX_restore_cert_cache");
wolfSSL 0:1239e9b70ca2 3398
wolfSSL 0:1239e9b70ca2 3399 if (ctx == NULL || fname == NULL)
wolfSSL 0:1239e9b70ca2 3400 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 3401
wolfSSL 0:1239e9b70ca2 3402 return CM_RestoreCertCache(ctx->cm, fname);
wolfSSL 0:1239e9b70ca2 3403 }
wolfSSL 0:1239e9b70ca2 3404
wolfSSL 0:1239e9b70ca2 3405 #endif /* NO_FILESYSTEM */
wolfSSL 0:1239e9b70ca2 3406
wolfSSL 0:1239e9b70ca2 3407 /* Persist cert cache to memory */
wolfSSL 0:1239e9b70ca2 3408 int CyaSSL_CTX_memsave_cert_cache(CYASSL_CTX* ctx, void* mem, int sz, int* used)
wolfSSL 0:1239e9b70ca2 3409 {
wolfSSL 0:1239e9b70ca2 3410 CYASSL_ENTER("CyaSSL_CTX_memsave_cert_cache");
wolfSSL 0:1239e9b70ca2 3411
wolfSSL 0:1239e9b70ca2 3412 if (ctx == NULL || mem == NULL || used == NULL || sz <= 0)
wolfSSL 0:1239e9b70ca2 3413 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 3414
wolfSSL 0:1239e9b70ca2 3415 return CM_MemSaveCertCache(ctx->cm, mem, sz, used);
wolfSSL 0:1239e9b70ca2 3416 }
wolfSSL 0:1239e9b70ca2 3417
wolfSSL 0:1239e9b70ca2 3418
wolfSSL 0:1239e9b70ca2 3419 /* Restore cert cache from memory */
wolfSSL 0:1239e9b70ca2 3420 int CyaSSL_CTX_memrestore_cert_cache(CYASSL_CTX* ctx, const void* mem, int sz)
wolfSSL 0:1239e9b70ca2 3421 {
wolfSSL 0:1239e9b70ca2 3422 CYASSL_ENTER("CyaSSL_CTX_memrestore_cert_cache");
wolfSSL 0:1239e9b70ca2 3423
wolfSSL 0:1239e9b70ca2 3424 if (ctx == NULL || mem == NULL || sz <= 0)
wolfSSL 0:1239e9b70ca2 3425 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 3426
wolfSSL 0:1239e9b70ca2 3427 return CM_MemRestoreCertCache(ctx->cm, mem, sz);
wolfSSL 0:1239e9b70ca2 3428 }
wolfSSL 0:1239e9b70ca2 3429
wolfSSL 0:1239e9b70ca2 3430
wolfSSL 0:1239e9b70ca2 3431 /* get how big the the cert cache save buffer needs to be */
wolfSSL 0:1239e9b70ca2 3432 int CyaSSL_CTX_get_cert_cache_memsize(CYASSL_CTX* ctx)
wolfSSL 0:1239e9b70ca2 3433 {
wolfSSL 0:1239e9b70ca2 3434 CYASSL_ENTER("CyaSSL_CTX_get_cert_cache_memsize");
wolfSSL 0:1239e9b70ca2 3435
wolfSSL 0:1239e9b70ca2 3436 if (ctx == NULL)
wolfSSL 0:1239e9b70ca2 3437 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 3438
wolfSSL 0:1239e9b70ca2 3439 return CM_GetCertCacheMemSize(ctx->cm);
wolfSSL 0:1239e9b70ca2 3440 }
wolfSSL 0:1239e9b70ca2 3441
wolfSSL 0:1239e9b70ca2 3442 #endif /* PERSISTE_CERT_CACHE */
wolfSSL 0:1239e9b70ca2 3443 #endif /* !NO_CERTS */
wolfSSL 0:1239e9b70ca2 3444
wolfSSL 0:1239e9b70ca2 3445
wolfSSL 0:1239e9b70ca2 3446 #ifndef NO_SESSION_CACHE
wolfSSL 0:1239e9b70ca2 3447
wolfSSL 0:1239e9b70ca2 3448 CYASSL_SESSION* CyaSSL_get_session(CYASSL* ssl)
wolfSSL 0:1239e9b70ca2 3449 {
wolfSSL 0:1239e9b70ca2 3450 CYASSL_ENTER("SSL_get_session");
wolfSSL 0:1239e9b70ca2 3451 if (ssl)
wolfSSL 0:1239e9b70ca2 3452 return GetSession(ssl, 0);
wolfSSL 0:1239e9b70ca2 3453
wolfSSL 0:1239e9b70ca2 3454 return NULL;
wolfSSL 0:1239e9b70ca2 3455 }
wolfSSL 0:1239e9b70ca2 3456
wolfSSL 0:1239e9b70ca2 3457
wolfSSL 0:1239e9b70ca2 3458 int CyaSSL_set_session(CYASSL* ssl, CYASSL_SESSION* session)
wolfSSL 0:1239e9b70ca2 3459 {
wolfSSL 0:1239e9b70ca2 3460 CYASSL_ENTER("SSL_set_session");
wolfSSL 0:1239e9b70ca2 3461 if (session)
wolfSSL 0:1239e9b70ca2 3462 return SetSession(ssl, session);
wolfSSL 0:1239e9b70ca2 3463
wolfSSL 0:1239e9b70ca2 3464 return SSL_FAILURE;
wolfSSL 0:1239e9b70ca2 3465 }
wolfSSL 0:1239e9b70ca2 3466
wolfSSL 0:1239e9b70ca2 3467
wolfSSL 0:1239e9b70ca2 3468 #ifndef NO_CLIENT_CACHE
wolfSSL 0:1239e9b70ca2 3469
wolfSSL 0:1239e9b70ca2 3470 /* Associate client session with serverID, find existing or store for saving
wolfSSL 0:1239e9b70ca2 3471 if newSession flag on, don't reuse existing session
wolfSSL 0:1239e9b70ca2 3472 SSL_SUCCESS on ok */
wolfSSL 0:1239e9b70ca2 3473 int CyaSSL_SetServerID(CYASSL* ssl, const byte* id, int len, int newSession)
wolfSSL 0:1239e9b70ca2 3474 {
wolfSSL 0:1239e9b70ca2 3475 CYASSL_SESSION* session = NULL;
wolfSSL 0:1239e9b70ca2 3476
wolfSSL 0:1239e9b70ca2 3477 CYASSL_ENTER("CyaSSL_SetServerID");
wolfSSL 0:1239e9b70ca2 3478
wolfSSL 0:1239e9b70ca2 3479 if (ssl == NULL || id == NULL || len <= 0)
wolfSSL 0:1239e9b70ca2 3480 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 3481
wolfSSL 0:1239e9b70ca2 3482 if (newSession == 0) {
wolfSSL 0:1239e9b70ca2 3483 session = GetSessionClient(ssl, id, len);
wolfSSL 0:1239e9b70ca2 3484 if (session) {
wolfSSL 0:1239e9b70ca2 3485 if (SetSession(ssl, session) != SSL_SUCCESS) {
wolfSSL 0:1239e9b70ca2 3486 CYASSL_MSG("SetSession failed");
wolfSSL 0:1239e9b70ca2 3487 session = NULL;
wolfSSL 0:1239e9b70ca2 3488 }
wolfSSL 0:1239e9b70ca2 3489 }
wolfSSL 0:1239e9b70ca2 3490 }
wolfSSL 0:1239e9b70ca2 3491
wolfSSL 0:1239e9b70ca2 3492 if (session == NULL) {
wolfSSL 0:1239e9b70ca2 3493 CYASSL_MSG("Valid ServerID not cached already");
wolfSSL 0:1239e9b70ca2 3494
wolfSSL 0:1239e9b70ca2 3495 ssl->session.idLen = (word16)min(SERVER_ID_LEN, (word32)len);
wolfSSL 0:1239e9b70ca2 3496 XMEMCPY(ssl->session.serverID, id, ssl->session.idLen);
wolfSSL 0:1239e9b70ca2 3497 }
wolfSSL 0:1239e9b70ca2 3498
wolfSSL 0:1239e9b70ca2 3499 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 3500 }
wolfSSL 0:1239e9b70ca2 3501
wolfSSL 0:1239e9b70ca2 3502 #endif /* NO_CLIENT_CACHE */
wolfSSL 0:1239e9b70ca2 3503
wolfSSL 0:1239e9b70ca2 3504 #if defined(PERSIST_SESSION_CACHE)
wolfSSL 0:1239e9b70ca2 3505
wolfSSL 0:1239e9b70ca2 3506 /* for persistance, if changes to layout need to increment and modify
wolfSSL 0:1239e9b70ca2 3507 save_session_cache() and restore_session_cache and memory versions too */
wolfSSL 0:1239e9b70ca2 3508 #define CYASSL_CACHE_VERSION 2
wolfSSL 0:1239e9b70ca2 3509
wolfSSL 0:1239e9b70ca2 3510 /* Session Cache Header information */
wolfSSL 0:1239e9b70ca2 3511 typedef struct {
wolfSSL 0:1239e9b70ca2 3512 int version; /* cache layout version id */
wolfSSL 0:1239e9b70ca2 3513 int rows; /* session rows */
wolfSSL 0:1239e9b70ca2 3514 int columns; /* session columns */
wolfSSL 0:1239e9b70ca2 3515 int sessionSz; /* sizeof CYASSL_SESSION */
wolfSSL 0:1239e9b70ca2 3516 } cache_header_t;
wolfSSL 0:1239e9b70ca2 3517
wolfSSL 0:1239e9b70ca2 3518 /* current persistence layout is:
wolfSSL 0:1239e9b70ca2 3519
wolfSSL 0:1239e9b70ca2 3520 1) cache_header_t
wolfSSL 0:1239e9b70ca2 3521 2) SessionCache
wolfSSL 0:1239e9b70ca2 3522 3) ClientCache
wolfSSL 0:1239e9b70ca2 3523
wolfSSL 0:1239e9b70ca2 3524 update CYASSL_CACHE_VERSION if change layout for the following
wolfSSL 0:1239e9b70ca2 3525 PERSISTENT_SESSION_CACHE functions
wolfSSL 0:1239e9b70ca2 3526 */
wolfSSL 0:1239e9b70ca2 3527
wolfSSL 0:1239e9b70ca2 3528
wolfSSL 0:1239e9b70ca2 3529 /* get how big the the session cache save buffer needs to be */
wolfSSL 0:1239e9b70ca2 3530 int CyaSSL_get_session_cache_memsize(void)
wolfSSL 0:1239e9b70ca2 3531 {
wolfSSL 0:1239e9b70ca2 3532 int sz = (int)(sizeof(SessionCache) + sizeof(cache_header_t));
wolfSSL 0:1239e9b70ca2 3533
wolfSSL 0:1239e9b70ca2 3534 #ifndef NO_CLIENT_CACHE
wolfSSL 0:1239e9b70ca2 3535 sz += (int)(sizeof(ClientCache));
wolfSSL 0:1239e9b70ca2 3536 #endif
wolfSSL 0:1239e9b70ca2 3537
wolfSSL 0:1239e9b70ca2 3538 return sz;
wolfSSL 0:1239e9b70ca2 3539 }
wolfSSL 0:1239e9b70ca2 3540
wolfSSL 0:1239e9b70ca2 3541
wolfSSL 0:1239e9b70ca2 3542 /* Persist session cache to memory */
wolfSSL 0:1239e9b70ca2 3543 int CyaSSL_memsave_session_cache(void* mem, int sz)
wolfSSL 0:1239e9b70ca2 3544 {
wolfSSL 0:1239e9b70ca2 3545 int i;
wolfSSL 0:1239e9b70ca2 3546 cache_header_t cache_header;
wolfSSL 0:1239e9b70ca2 3547 SessionRow* row = (SessionRow*)((byte*)mem + sizeof(cache_header));
wolfSSL 0:1239e9b70ca2 3548 #ifndef NO_CLIENT_CACHE
wolfSSL 0:1239e9b70ca2 3549 ClientRow* clRow;
wolfSSL 0:1239e9b70ca2 3550 #endif
wolfSSL 0:1239e9b70ca2 3551
wolfSSL 0:1239e9b70ca2 3552 CYASSL_ENTER("CyaSSL_memsave_session_cache");
wolfSSL 0:1239e9b70ca2 3553
wolfSSL 0:1239e9b70ca2 3554 if (sz < CyaSSL_get_session_cache_memsize()) {
wolfSSL 0:1239e9b70ca2 3555 CYASSL_MSG("Memory buffer too small");
wolfSSL 0:1239e9b70ca2 3556 return BUFFER_E;
wolfSSL 0:1239e9b70ca2 3557 }
wolfSSL 0:1239e9b70ca2 3558
wolfSSL 0:1239e9b70ca2 3559 cache_header.version = CYASSL_CACHE_VERSION;
wolfSSL 0:1239e9b70ca2 3560 cache_header.rows = SESSION_ROWS;
wolfSSL 0:1239e9b70ca2 3561 cache_header.columns = SESSIONS_PER_ROW;
wolfSSL 0:1239e9b70ca2 3562 cache_header.sessionSz = (int)sizeof(CYASSL_SESSION);
wolfSSL 0:1239e9b70ca2 3563 XMEMCPY(mem, &cache_header, sizeof(cache_header));
wolfSSL 0:1239e9b70ca2 3564
wolfSSL 0:1239e9b70ca2 3565 if (LockMutex(&session_mutex) != 0) {
wolfSSL 0:1239e9b70ca2 3566 CYASSL_MSG("Session cache mutex lock failed");
wolfSSL 0:1239e9b70ca2 3567 return BAD_MUTEX_E;
wolfSSL 0:1239e9b70ca2 3568 }
wolfSSL 0:1239e9b70ca2 3569
wolfSSL 0:1239e9b70ca2 3570 for (i = 0; i < cache_header.rows; ++i)
wolfSSL 0:1239e9b70ca2 3571 XMEMCPY(row++, SessionCache + i, sizeof(SessionRow));
wolfSSL 0:1239e9b70ca2 3572
wolfSSL 0:1239e9b70ca2 3573 #ifndef NO_CLIENT_CACHE
wolfSSL 0:1239e9b70ca2 3574 clRow = (ClientRow*)row;
wolfSSL 0:1239e9b70ca2 3575 for (i = 0; i < cache_header.rows; ++i)
wolfSSL 0:1239e9b70ca2 3576 XMEMCPY(clRow++, ClientCache + i, sizeof(ClientRow));
wolfSSL 0:1239e9b70ca2 3577 #endif
wolfSSL 0:1239e9b70ca2 3578
wolfSSL 0:1239e9b70ca2 3579 UnLockMutex(&session_mutex);
wolfSSL 0:1239e9b70ca2 3580
wolfSSL 0:1239e9b70ca2 3581 CYASSL_LEAVE("CyaSSL_memsave_session_cache", SSL_SUCCESS);
wolfSSL 0:1239e9b70ca2 3582
wolfSSL 0:1239e9b70ca2 3583 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 3584 }
wolfSSL 0:1239e9b70ca2 3585
wolfSSL 0:1239e9b70ca2 3586
wolfSSL 0:1239e9b70ca2 3587 /* Restore the persistant session cache from memory */
wolfSSL 0:1239e9b70ca2 3588 int CyaSSL_memrestore_session_cache(const void* mem, int sz)
wolfSSL 0:1239e9b70ca2 3589 {
wolfSSL 0:1239e9b70ca2 3590 int i;
wolfSSL 0:1239e9b70ca2 3591 cache_header_t cache_header;
wolfSSL 0:1239e9b70ca2 3592 SessionRow* row = (SessionRow*)((byte*)mem + sizeof(cache_header));
wolfSSL 0:1239e9b70ca2 3593 #ifndef NO_CLIENT_CACHE
wolfSSL 0:1239e9b70ca2 3594 ClientRow* clRow;
wolfSSL 0:1239e9b70ca2 3595 #endif
wolfSSL 0:1239e9b70ca2 3596
wolfSSL 0:1239e9b70ca2 3597 CYASSL_ENTER("CyaSSL_memrestore_session_cache");
wolfSSL 0:1239e9b70ca2 3598
wolfSSL 0:1239e9b70ca2 3599 if (sz < CyaSSL_get_session_cache_memsize()) {
wolfSSL 0:1239e9b70ca2 3600 CYASSL_MSG("Memory buffer too small");
wolfSSL 0:1239e9b70ca2 3601 return BUFFER_E;
wolfSSL 0:1239e9b70ca2 3602 }
wolfSSL 0:1239e9b70ca2 3603
wolfSSL 0:1239e9b70ca2 3604 XMEMCPY(&cache_header, mem, sizeof(cache_header));
wolfSSL 0:1239e9b70ca2 3605 if (cache_header.version != CYASSL_CACHE_VERSION ||
wolfSSL 0:1239e9b70ca2 3606 cache_header.rows != SESSION_ROWS ||
wolfSSL 0:1239e9b70ca2 3607 cache_header.columns != SESSIONS_PER_ROW ||
wolfSSL 0:1239e9b70ca2 3608 cache_header.sessionSz != (int)sizeof(CYASSL_SESSION)) {
wolfSSL 0:1239e9b70ca2 3609
wolfSSL 0:1239e9b70ca2 3610 CYASSL_MSG("Session cache header match failed");
wolfSSL 0:1239e9b70ca2 3611 return CACHE_MATCH_ERROR;
wolfSSL 0:1239e9b70ca2 3612 }
wolfSSL 0:1239e9b70ca2 3613
wolfSSL 0:1239e9b70ca2 3614 if (LockMutex(&session_mutex) != 0) {
wolfSSL 0:1239e9b70ca2 3615 CYASSL_MSG("Session cache mutex lock failed");
wolfSSL 0:1239e9b70ca2 3616 return BAD_MUTEX_E;
wolfSSL 0:1239e9b70ca2 3617 }
wolfSSL 0:1239e9b70ca2 3618
wolfSSL 0:1239e9b70ca2 3619 for (i = 0; i < cache_header.rows; ++i)
wolfSSL 0:1239e9b70ca2 3620 XMEMCPY(SessionCache + i, row++, sizeof(SessionRow));
wolfSSL 0:1239e9b70ca2 3621
wolfSSL 0:1239e9b70ca2 3622 #ifndef NO_CLIENT_CACHE
wolfSSL 0:1239e9b70ca2 3623 clRow = (ClientRow*)row;
wolfSSL 0:1239e9b70ca2 3624 for (i = 0; i < cache_header.rows; ++i)
wolfSSL 0:1239e9b70ca2 3625 XMEMCPY(ClientCache + i, clRow++, sizeof(ClientRow));
wolfSSL 0:1239e9b70ca2 3626 #endif
wolfSSL 0:1239e9b70ca2 3627
wolfSSL 0:1239e9b70ca2 3628 UnLockMutex(&session_mutex);
wolfSSL 0:1239e9b70ca2 3629
wolfSSL 0:1239e9b70ca2 3630 CYASSL_LEAVE("CyaSSL_memrestore_session_cache", SSL_SUCCESS);
wolfSSL 0:1239e9b70ca2 3631
wolfSSL 0:1239e9b70ca2 3632 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 3633 }
wolfSSL 0:1239e9b70ca2 3634
wolfSSL 0:1239e9b70ca2 3635 #if !defined(NO_FILESYSTEM)
wolfSSL 0:1239e9b70ca2 3636
wolfSSL 0:1239e9b70ca2 3637 /* Persist session cache to file */
wolfSSL 0:1239e9b70ca2 3638 /* doesn't use memsave because of additional memory use */
wolfSSL 0:1239e9b70ca2 3639 int CyaSSL_save_session_cache(const char *fname)
wolfSSL 0:1239e9b70ca2 3640 {
wolfSSL 0:1239e9b70ca2 3641 XFILE file;
wolfSSL 0:1239e9b70ca2 3642 int ret;
wolfSSL 0:1239e9b70ca2 3643 int rc = SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 3644 int i;
wolfSSL 0:1239e9b70ca2 3645 cache_header_t cache_header;
wolfSSL 0:1239e9b70ca2 3646
wolfSSL 0:1239e9b70ca2 3647 CYASSL_ENTER("CyaSSL_save_session_cache");
wolfSSL 0:1239e9b70ca2 3648
wolfSSL 0:1239e9b70ca2 3649 file = XFOPEN(fname, "w+b");
wolfSSL 0:1239e9b70ca2 3650 if (file == XBADFILE) {
wolfSSL 0:1239e9b70ca2 3651 CYASSL_MSG("Couldn't open session cache save file");
wolfSSL 0:1239e9b70ca2 3652 return SSL_BAD_FILE;
wolfSSL 0:1239e9b70ca2 3653 }
wolfSSL 0:1239e9b70ca2 3654 cache_header.version = CYASSL_CACHE_VERSION;
wolfSSL 0:1239e9b70ca2 3655 cache_header.rows = SESSION_ROWS;
wolfSSL 0:1239e9b70ca2 3656 cache_header.columns = SESSIONS_PER_ROW;
wolfSSL 0:1239e9b70ca2 3657 cache_header.sessionSz = (int)sizeof(CYASSL_SESSION);
wolfSSL 0:1239e9b70ca2 3658
wolfSSL 0:1239e9b70ca2 3659 /* cache header */
wolfSSL 0:1239e9b70ca2 3660 ret = (int)XFWRITE(&cache_header, sizeof cache_header, 1, file);
wolfSSL 0:1239e9b70ca2 3661 if (ret != 1) {
wolfSSL 0:1239e9b70ca2 3662 CYASSL_MSG("Session cache header file write failed");
wolfSSL 0:1239e9b70ca2 3663 XFCLOSE(file);
wolfSSL 0:1239e9b70ca2 3664 return FWRITE_ERROR;
wolfSSL 0:1239e9b70ca2 3665 }
wolfSSL 0:1239e9b70ca2 3666
wolfSSL 0:1239e9b70ca2 3667 if (LockMutex(&session_mutex) != 0) {
wolfSSL 0:1239e9b70ca2 3668 CYASSL_MSG("Session cache mutex lock failed");
wolfSSL 0:1239e9b70ca2 3669 XFCLOSE(file);
wolfSSL 0:1239e9b70ca2 3670 return BAD_MUTEX_E;
wolfSSL 0:1239e9b70ca2 3671 }
wolfSSL 0:1239e9b70ca2 3672
wolfSSL 0:1239e9b70ca2 3673 /* session cache */
wolfSSL 0:1239e9b70ca2 3674 for (i = 0; i < cache_header.rows; ++i) {
wolfSSL 0:1239e9b70ca2 3675 ret = (int)XFWRITE(SessionCache + i, sizeof(SessionRow), 1, file);
wolfSSL 0:1239e9b70ca2 3676 if (ret != 1) {
wolfSSL 0:1239e9b70ca2 3677 CYASSL_MSG("Session cache member file write failed");
wolfSSL 0:1239e9b70ca2 3678 rc = FWRITE_ERROR;
wolfSSL 0:1239e9b70ca2 3679 break;
wolfSSL 0:1239e9b70ca2 3680 }
wolfSSL 0:1239e9b70ca2 3681 }
wolfSSL 0:1239e9b70ca2 3682
wolfSSL 0:1239e9b70ca2 3683 #ifndef NO_CLIENT_CACHE
wolfSSL 0:1239e9b70ca2 3684 /* client cache */
wolfSSL 0:1239e9b70ca2 3685 for (i = 0; i < cache_header.rows; ++i) {
wolfSSL 0:1239e9b70ca2 3686 ret = (int)XFWRITE(ClientCache + i, sizeof(ClientRow), 1, file);
wolfSSL 0:1239e9b70ca2 3687 if (ret != 1) {
wolfSSL 0:1239e9b70ca2 3688 CYASSL_MSG("Client cache member file write failed");
wolfSSL 0:1239e9b70ca2 3689 rc = FWRITE_ERROR;
wolfSSL 0:1239e9b70ca2 3690 break;
wolfSSL 0:1239e9b70ca2 3691 }
wolfSSL 0:1239e9b70ca2 3692 }
wolfSSL 0:1239e9b70ca2 3693 #endif /* NO_CLIENT_CACHE */
wolfSSL 0:1239e9b70ca2 3694
wolfSSL 0:1239e9b70ca2 3695 UnLockMutex(&session_mutex);
wolfSSL 0:1239e9b70ca2 3696
wolfSSL 0:1239e9b70ca2 3697 XFCLOSE(file);
wolfSSL 0:1239e9b70ca2 3698 CYASSL_LEAVE("CyaSSL_save_session_cache", rc);
wolfSSL 0:1239e9b70ca2 3699
wolfSSL 0:1239e9b70ca2 3700 return rc;
wolfSSL 0:1239e9b70ca2 3701 }
wolfSSL 0:1239e9b70ca2 3702
wolfSSL 0:1239e9b70ca2 3703
wolfSSL 0:1239e9b70ca2 3704 /* Restore the persistant session cache from file */
wolfSSL 0:1239e9b70ca2 3705 /* doesn't use memstore because of additional memory use */
wolfSSL 0:1239e9b70ca2 3706 int CyaSSL_restore_session_cache(const char *fname)
wolfSSL 0:1239e9b70ca2 3707 {
wolfSSL 0:1239e9b70ca2 3708 XFILE file;
wolfSSL 0:1239e9b70ca2 3709 int rc = SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 3710 int ret;
wolfSSL 0:1239e9b70ca2 3711 int i;
wolfSSL 0:1239e9b70ca2 3712 cache_header_t cache_header;
wolfSSL 0:1239e9b70ca2 3713
wolfSSL 0:1239e9b70ca2 3714 CYASSL_ENTER("CyaSSL_restore_session_cache");
wolfSSL 0:1239e9b70ca2 3715
wolfSSL 0:1239e9b70ca2 3716 file = XFOPEN(fname, "rb");
wolfSSL 0:1239e9b70ca2 3717 if (file == XBADFILE) {
wolfSSL 0:1239e9b70ca2 3718 CYASSL_MSG("Couldn't open session cache save file");
wolfSSL 0:1239e9b70ca2 3719 return SSL_BAD_FILE;
wolfSSL 0:1239e9b70ca2 3720 }
wolfSSL 0:1239e9b70ca2 3721 /* cache header */
wolfSSL 0:1239e9b70ca2 3722 ret = (int)XFREAD(&cache_header, sizeof cache_header, 1, file);
wolfSSL 0:1239e9b70ca2 3723 if (ret != 1) {
wolfSSL 0:1239e9b70ca2 3724 CYASSL_MSG("Session cache header file read failed");
wolfSSL 0:1239e9b70ca2 3725 XFCLOSE(file);
wolfSSL 0:1239e9b70ca2 3726 return FREAD_ERROR;
wolfSSL 0:1239e9b70ca2 3727 }
wolfSSL 0:1239e9b70ca2 3728 if (cache_header.version != CYASSL_CACHE_VERSION ||
wolfSSL 0:1239e9b70ca2 3729 cache_header.rows != SESSION_ROWS ||
wolfSSL 0:1239e9b70ca2 3730 cache_header.columns != SESSIONS_PER_ROW ||
wolfSSL 0:1239e9b70ca2 3731 cache_header.sessionSz != (int)sizeof(CYASSL_SESSION)) {
wolfSSL 0:1239e9b70ca2 3732
wolfSSL 0:1239e9b70ca2 3733 CYASSL_MSG("Session cache header match failed");
wolfSSL 0:1239e9b70ca2 3734 XFCLOSE(file);
wolfSSL 0:1239e9b70ca2 3735 return CACHE_MATCH_ERROR;
wolfSSL 0:1239e9b70ca2 3736 }
wolfSSL 0:1239e9b70ca2 3737
wolfSSL 0:1239e9b70ca2 3738 if (LockMutex(&session_mutex) != 0) {
wolfSSL 0:1239e9b70ca2 3739 CYASSL_MSG("Session cache mutex lock failed");
wolfSSL 0:1239e9b70ca2 3740 XFCLOSE(file);
wolfSSL 0:1239e9b70ca2 3741 return BAD_MUTEX_E;
wolfSSL 0:1239e9b70ca2 3742 }
wolfSSL 0:1239e9b70ca2 3743
wolfSSL 0:1239e9b70ca2 3744 /* session cache */
wolfSSL 0:1239e9b70ca2 3745 for (i = 0; i < cache_header.rows; ++i) {
wolfSSL 0:1239e9b70ca2 3746 ret = (int)XFREAD(SessionCache + i, sizeof(SessionRow), 1, file);
wolfSSL 0:1239e9b70ca2 3747 if (ret != 1) {
wolfSSL 0:1239e9b70ca2 3748 CYASSL_MSG("Session cache member file read failed");
wolfSSL 0:1239e9b70ca2 3749 XMEMSET(SessionCache, 0, sizeof SessionCache);
wolfSSL 0:1239e9b70ca2 3750 rc = FREAD_ERROR;
wolfSSL 0:1239e9b70ca2 3751 break;
wolfSSL 0:1239e9b70ca2 3752 }
wolfSSL 0:1239e9b70ca2 3753 }
wolfSSL 0:1239e9b70ca2 3754
wolfSSL 0:1239e9b70ca2 3755 #ifndef NO_CLIENT_CACHE
wolfSSL 0:1239e9b70ca2 3756 /* client cache */
wolfSSL 0:1239e9b70ca2 3757 for (i = 0; i < cache_header.rows; ++i) {
wolfSSL 0:1239e9b70ca2 3758 ret = (int)XFREAD(ClientCache + i, sizeof(ClientRow), 1, file);
wolfSSL 0:1239e9b70ca2 3759 if (ret != 1) {
wolfSSL 0:1239e9b70ca2 3760 CYASSL_MSG("Client cache member file read failed");
wolfSSL 0:1239e9b70ca2 3761 XMEMSET(ClientCache, 0, sizeof ClientCache);
wolfSSL 0:1239e9b70ca2 3762 rc = FREAD_ERROR;
wolfSSL 0:1239e9b70ca2 3763 break;
wolfSSL 0:1239e9b70ca2 3764 }
wolfSSL 0:1239e9b70ca2 3765 }
wolfSSL 0:1239e9b70ca2 3766
wolfSSL 0:1239e9b70ca2 3767 #endif /* NO_CLIENT_CACHE */
wolfSSL 0:1239e9b70ca2 3768
wolfSSL 0:1239e9b70ca2 3769 UnLockMutex(&session_mutex);
wolfSSL 0:1239e9b70ca2 3770
wolfSSL 0:1239e9b70ca2 3771 XFCLOSE(file);
wolfSSL 0:1239e9b70ca2 3772 CYASSL_LEAVE("CyaSSL_restore_session_cache", rc);
wolfSSL 0:1239e9b70ca2 3773
wolfSSL 0:1239e9b70ca2 3774 return rc;
wolfSSL 0:1239e9b70ca2 3775 }
wolfSSL 0:1239e9b70ca2 3776
wolfSSL 0:1239e9b70ca2 3777 #endif /* !NO_FILESYSTEM */
wolfSSL 0:1239e9b70ca2 3778 #endif /* PERSIST_SESSION_CACHE */
wolfSSL 0:1239e9b70ca2 3779 #endif /* NO_SESSION_CACHE */
wolfSSL 0:1239e9b70ca2 3780
wolfSSL 0:1239e9b70ca2 3781
wolfSSL 0:1239e9b70ca2 3782 void CyaSSL_load_error_strings(void) /* compatibility only */
wolfSSL 0:1239e9b70ca2 3783 {}
wolfSSL 0:1239e9b70ca2 3784
wolfSSL 0:1239e9b70ca2 3785
wolfSSL 0:1239e9b70ca2 3786 int CyaSSL_library_init(void)
wolfSSL 0:1239e9b70ca2 3787 {
wolfSSL 0:1239e9b70ca2 3788 CYASSL_ENTER("SSL_library_init");
wolfSSL 0:1239e9b70ca2 3789 if (CyaSSL_Init() == SSL_SUCCESS)
wolfSSL 0:1239e9b70ca2 3790 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 3791 else
wolfSSL 0:1239e9b70ca2 3792 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 3793 }
wolfSSL 0:1239e9b70ca2 3794
wolfSSL 0:1239e9b70ca2 3795
wolfSSL 0:1239e9b70ca2 3796 #ifndef NO_SESSION_CACHE
wolfSSL 0:1239e9b70ca2 3797
wolfSSL 0:1239e9b70ca2 3798 /* on by default if built in but allow user to turn off */
wolfSSL 0:1239e9b70ca2 3799 long CyaSSL_CTX_set_session_cache_mode(CYASSL_CTX* ctx, long mode)
wolfSSL 0:1239e9b70ca2 3800 {
wolfSSL 0:1239e9b70ca2 3801 CYASSL_ENTER("SSL_CTX_set_session_cache_mode");
wolfSSL 0:1239e9b70ca2 3802 if (mode == SSL_SESS_CACHE_OFF)
wolfSSL 0:1239e9b70ca2 3803 ctx->sessionCacheOff = 1;
wolfSSL 0:1239e9b70ca2 3804
wolfSSL 0:1239e9b70ca2 3805 if (mode == SSL_SESS_CACHE_NO_AUTO_CLEAR)
wolfSSL 0:1239e9b70ca2 3806 ctx->sessionCacheFlushOff = 1;
wolfSSL 0:1239e9b70ca2 3807
wolfSSL 0:1239e9b70ca2 3808 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 3809 }
wolfSSL 0:1239e9b70ca2 3810
wolfSSL 0:1239e9b70ca2 3811 #endif /* NO_SESSION_CACHE */
wolfSSL 0:1239e9b70ca2 3812
wolfSSL 0:1239e9b70ca2 3813
wolfSSL 0:1239e9b70ca2 3814 #if !defined(NO_CERTS)
wolfSSL 0:1239e9b70ca2 3815 #if defined(PERSIST_CERT_CACHE)
wolfSSL 0:1239e9b70ca2 3816
wolfSSL 0:1239e9b70ca2 3817
wolfSSL 0:1239e9b70ca2 3818 #define CYASSL_CACHE_CERT_VERSION 1
wolfSSL 0:1239e9b70ca2 3819
wolfSSL 0:1239e9b70ca2 3820 typedef struct {
wolfSSL 0:1239e9b70ca2 3821 int version; /* cache cert layout version id */
wolfSSL 0:1239e9b70ca2 3822 int rows; /* hash table rows, CA_TABLE_SIZE */
wolfSSL 0:1239e9b70ca2 3823 int columns[CA_TABLE_SIZE]; /* columns per row on list */
wolfSSL 0:1239e9b70ca2 3824 int signerSz; /* sizeof Signer object */
wolfSSL 0:1239e9b70ca2 3825 } CertCacheHeader;
wolfSSL 0:1239e9b70ca2 3826
wolfSSL 0:1239e9b70ca2 3827 /* current cert persistance layout is:
wolfSSL 0:1239e9b70ca2 3828
wolfSSL 0:1239e9b70ca2 3829 1) CertCacheHeader
wolfSSL 0:1239e9b70ca2 3830 2) caTable
wolfSSL 0:1239e9b70ca2 3831
wolfSSL 0:1239e9b70ca2 3832 update CYASSL_CERT_CACHE_VERSION if change layout for the following
wolfSSL 0:1239e9b70ca2 3833 PERSIST_CERT_CACHE functions
wolfSSL 0:1239e9b70ca2 3834 */
wolfSSL 0:1239e9b70ca2 3835
wolfSSL 0:1239e9b70ca2 3836
wolfSSL 0:1239e9b70ca2 3837 /* Return memory needed to persist this signer, have lock */
wolfSSL 0:1239e9b70ca2 3838 static INLINE int GetSignerMemory(Signer* signer)
wolfSSL 0:1239e9b70ca2 3839 {
wolfSSL 0:1239e9b70ca2 3840 int sz = sizeof(signer->pubKeySize) + sizeof(signer->keyOID)
wolfSSL 0:1239e9b70ca2 3841 + sizeof(signer->nameLen) + sizeof(signer->subjectNameHash);
wolfSSL 0:1239e9b70ca2 3842
wolfSSL 0:1239e9b70ca2 3843 #if !defined(NO_SKID)
wolfSSL 0:1239e9b70ca2 3844 sz += (int)sizeof(signer->subjectKeyIdHash);
wolfSSL 0:1239e9b70ca2 3845 #endif
wolfSSL 0:1239e9b70ca2 3846
wolfSSL 0:1239e9b70ca2 3847 /* add dynamic bytes needed */
wolfSSL 0:1239e9b70ca2 3848 sz += signer->pubKeySize;
wolfSSL 0:1239e9b70ca2 3849 sz += signer->nameLen;
wolfSSL 0:1239e9b70ca2 3850
wolfSSL 0:1239e9b70ca2 3851 return sz;
wolfSSL 0:1239e9b70ca2 3852 }
wolfSSL 0:1239e9b70ca2 3853
wolfSSL 0:1239e9b70ca2 3854
wolfSSL 0:1239e9b70ca2 3855 /* Return memory needed to persist this row, have lock */
wolfSSL 0:1239e9b70ca2 3856 static INLINE int GetCertCacheRowMemory(Signer* row)
wolfSSL 0:1239e9b70ca2 3857 {
wolfSSL 0:1239e9b70ca2 3858 int sz = 0;
wolfSSL 0:1239e9b70ca2 3859
wolfSSL 0:1239e9b70ca2 3860 while (row) {
wolfSSL 0:1239e9b70ca2 3861 sz += GetSignerMemory(row);
wolfSSL 0:1239e9b70ca2 3862 row = row->next;
wolfSSL 0:1239e9b70ca2 3863 }
wolfSSL 0:1239e9b70ca2 3864
wolfSSL 0:1239e9b70ca2 3865 return sz;
wolfSSL 0:1239e9b70ca2 3866 }
wolfSSL 0:1239e9b70ca2 3867
wolfSSL 0:1239e9b70ca2 3868
wolfSSL 0:1239e9b70ca2 3869 /* get the size of persist cert cache, have lock */
wolfSSL 0:1239e9b70ca2 3870 static INLINE int GetCertCacheMemSize(CYASSL_CERT_MANAGER* cm)
wolfSSL 0:1239e9b70ca2 3871 {
wolfSSL 0:1239e9b70ca2 3872 int sz;
wolfSSL 0:1239e9b70ca2 3873 int i;
wolfSSL 0:1239e9b70ca2 3874
wolfSSL 0:1239e9b70ca2 3875 sz = sizeof(CertCacheHeader);
wolfSSL 0:1239e9b70ca2 3876
wolfSSL 0:1239e9b70ca2 3877 for (i = 0; i < CA_TABLE_SIZE; i++)
wolfSSL 0:1239e9b70ca2 3878 sz += GetCertCacheRowMemory(cm->caTable[i]);
wolfSSL 0:1239e9b70ca2 3879
wolfSSL 0:1239e9b70ca2 3880 return sz;
wolfSSL 0:1239e9b70ca2 3881 }
wolfSSL 0:1239e9b70ca2 3882
wolfSSL 0:1239e9b70ca2 3883
wolfSSL 0:1239e9b70ca2 3884 /* Store cert cache header columns with number of items per list, have lock */
wolfSSL 0:1239e9b70ca2 3885 static INLINE void SetCertHeaderColumns(CYASSL_CERT_MANAGER* cm, int* columns)
wolfSSL 0:1239e9b70ca2 3886 {
wolfSSL 0:1239e9b70ca2 3887 int i;
wolfSSL 0:1239e9b70ca2 3888 Signer* row;
wolfSSL 0:1239e9b70ca2 3889
wolfSSL 0:1239e9b70ca2 3890 for (i = 0; i < CA_TABLE_SIZE; i++) {
wolfSSL 0:1239e9b70ca2 3891 int count = 0;
wolfSSL 0:1239e9b70ca2 3892 row = cm->caTable[i];
wolfSSL 0:1239e9b70ca2 3893
wolfSSL 0:1239e9b70ca2 3894 while (row) {
wolfSSL 0:1239e9b70ca2 3895 ++count;
wolfSSL 0:1239e9b70ca2 3896 row = row->next;
wolfSSL 0:1239e9b70ca2 3897 }
wolfSSL 0:1239e9b70ca2 3898 columns[i] = count;
wolfSSL 0:1239e9b70ca2 3899 }
wolfSSL 0:1239e9b70ca2 3900 }
wolfSSL 0:1239e9b70ca2 3901
wolfSSL 0:1239e9b70ca2 3902
wolfSSL 0:1239e9b70ca2 3903 /* Restore whole cert row from memory, have lock, return bytes consumed,
wolfSSL 0:1239e9b70ca2 3904 < 0 on error, have lock */
wolfSSL 0:1239e9b70ca2 3905 static INLINE int RestoreCertRow(CYASSL_CERT_MANAGER* cm, byte* current,
wolfSSL 0:1239e9b70ca2 3906 int row, int listSz, const byte* end)
wolfSSL 0:1239e9b70ca2 3907 {
wolfSSL 0:1239e9b70ca2 3908 int idx = 0;
wolfSSL 0:1239e9b70ca2 3909
wolfSSL 0:1239e9b70ca2 3910 if (listSz < 0) {
wolfSSL 0:1239e9b70ca2 3911 CYASSL_MSG("Row header corrupted, negative value");
wolfSSL 0:1239e9b70ca2 3912 return PARSE_ERROR;
wolfSSL 0:1239e9b70ca2 3913 }
wolfSSL 0:1239e9b70ca2 3914
wolfSSL 0:1239e9b70ca2 3915 while (listSz) {
wolfSSL 0:1239e9b70ca2 3916 Signer* signer;
wolfSSL 0:1239e9b70ca2 3917 byte* start = current + idx; /* for end checks on this signer */
wolfSSL 0:1239e9b70ca2 3918 int minSz = sizeof(signer->pubKeySize) + sizeof(signer->keyOID) +
wolfSSL 0:1239e9b70ca2 3919 sizeof(signer->nameLen) + sizeof(signer->subjectNameHash);
wolfSSL 0:1239e9b70ca2 3920 #ifndef NO_SKID
wolfSSL 0:1239e9b70ca2 3921 minSz += (int)sizeof(signer->subjectKeyIdHash);
wolfSSL 0:1239e9b70ca2 3922 #endif
wolfSSL 0:1239e9b70ca2 3923
wolfSSL 0:1239e9b70ca2 3924 if (start + minSz > end) {
wolfSSL 0:1239e9b70ca2 3925 CYASSL_MSG("Would overread restore buffer");
wolfSSL 0:1239e9b70ca2 3926 return BUFFER_E;
wolfSSL 0:1239e9b70ca2 3927 }
wolfSSL 0:1239e9b70ca2 3928 signer = MakeSigner(cm->heap);
wolfSSL 0:1239e9b70ca2 3929 if (signer == NULL)
wolfSSL 0:1239e9b70ca2 3930 return MEMORY_E;
wolfSSL 0:1239e9b70ca2 3931
wolfSSL 0:1239e9b70ca2 3932 /* pubKeySize */
wolfSSL 0:1239e9b70ca2 3933 XMEMCPY(&signer->pubKeySize, current + idx, sizeof(signer->pubKeySize));
wolfSSL 0:1239e9b70ca2 3934 idx += (int)sizeof(signer->pubKeySize);
wolfSSL 0:1239e9b70ca2 3935
wolfSSL 0:1239e9b70ca2 3936 /* keyOID */
wolfSSL 0:1239e9b70ca2 3937 XMEMCPY(&signer->keyOID, current + idx, sizeof(signer->keyOID));
wolfSSL 0:1239e9b70ca2 3938 idx += (int)sizeof(signer->keyOID);
wolfSSL 0:1239e9b70ca2 3939
wolfSSL 0:1239e9b70ca2 3940 /* pulicKey */
wolfSSL 0:1239e9b70ca2 3941 if (start + minSz + signer->pubKeySize > end) {
wolfSSL 0:1239e9b70ca2 3942 CYASSL_MSG("Would overread restore buffer");
wolfSSL 0:1239e9b70ca2 3943 FreeSigner(signer, cm->heap);
wolfSSL 0:1239e9b70ca2 3944 return BUFFER_E;
wolfSSL 0:1239e9b70ca2 3945 }
wolfSSL 0:1239e9b70ca2 3946 signer->publicKey = (byte*)XMALLOC(signer->pubKeySize, cm->heap,
wolfSSL 0:1239e9b70ca2 3947 DYNAMIC_TYPE_KEY);
wolfSSL 0:1239e9b70ca2 3948 if (signer->publicKey == NULL) {
wolfSSL 0:1239e9b70ca2 3949 FreeSigner(signer, cm->heap);
wolfSSL 0:1239e9b70ca2 3950 return MEMORY_E;
wolfSSL 0:1239e9b70ca2 3951 }
wolfSSL 0:1239e9b70ca2 3952
wolfSSL 0:1239e9b70ca2 3953 XMEMCPY(signer->publicKey, current + idx, signer->pubKeySize);
wolfSSL 0:1239e9b70ca2 3954 idx += signer->pubKeySize;
wolfSSL 0:1239e9b70ca2 3955
wolfSSL 0:1239e9b70ca2 3956 /* nameLen */
wolfSSL 0:1239e9b70ca2 3957 XMEMCPY(&signer->nameLen, current + idx, sizeof(signer->nameLen));
wolfSSL 0:1239e9b70ca2 3958 idx += (int)sizeof(signer->nameLen);
wolfSSL 0:1239e9b70ca2 3959
wolfSSL 0:1239e9b70ca2 3960 /* name */
wolfSSL 0:1239e9b70ca2 3961 if (start + minSz + signer->pubKeySize + signer->nameLen > end) {
wolfSSL 0:1239e9b70ca2 3962 CYASSL_MSG("Would overread restore buffer");
wolfSSL 0:1239e9b70ca2 3963 FreeSigner(signer, cm->heap);
wolfSSL 0:1239e9b70ca2 3964 return BUFFER_E;
wolfSSL 0:1239e9b70ca2 3965 }
wolfSSL 0:1239e9b70ca2 3966 signer->name = (char*)XMALLOC(signer->nameLen, cm->heap,
wolfSSL 0:1239e9b70ca2 3967 DYNAMIC_TYPE_SUBJECT_CN);
wolfSSL 0:1239e9b70ca2 3968 if (signer->name == NULL) {
wolfSSL 0:1239e9b70ca2 3969 FreeSigner(signer, cm->heap);
wolfSSL 0:1239e9b70ca2 3970 return MEMORY_E;
wolfSSL 0:1239e9b70ca2 3971 }
wolfSSL 0:1239e9b70ca2 3972
wolfSSL 0:1239e9b70ca2 3973 XMEMCPY(signer->name, current + idx, signer->nameLen);
wolfSSL 0:1239e9b70ca2 3974 idx += signer->nameLen;
wolfSSL 0:1239e9b70ca2 3975
wolfSSL 0:1239e9b70ca2 3976 /* subjectNameHash */
wolfSSL 0:1239e9b70ca2 3977 XMEMCPY(signer->subjectNameHash, current + idx, SIGNER_DIGEST_SIZE);
wolfSSL 0:1239e9b70ca2 3978 idx += SIGNER_DIGEST_SIZE;
wolfSSL 0:1239e9b70ca2 3979
wolfSSL 0:1239e9b70ca2 3980 #ifndef NO_SKID
wolfSSL 0:1239e9b70ca2 3981 /* subjectKeyIdHash */
wolfSSL 0:1239e9b70ca2 3982 XMEMCPY(signer->subjectKeyIdHash, current + idx,SIGNER_DIGEST_SIZE);
wolfSSL 0:1239e9b70ca2 3983 idx += SIGNER_DIGEST_SIZE;
wolfSSL 0:1239e9b70ca2 3984 #endif
wolfSSL 0:1239e9b70ca2 3985
wolfSSL 0:1239e9b70ca2 3986 signer->next = cm->caTable[row];
wolfSSL 0:1239e9b70ca2 3987 cm->caTable[row] = signer;
wolfSSL 0:1239e9b70ca2 3988
wolfSSL 0:1239e9b70ca2 3989 --listSz;
wolfSSL 0:1239e9b70ca2 3990 }
wolfSSL 0:1239e9b70ca2 3991
wolfSSL 0:1239e9b70ca2 3992 return idx;
wolfSSL 0:1239e9b70ca2 3993 }
wolfSSL 0:1239e9b70ca2 3994
wolfSSL 0:1239e9b70ca2 3995
wolfSSL 0:1239e9b70ca2 3996 /* Store whole cert row into memory, have lock, return bytes added */
wolfSSL 0:1239e9b70ca2 3997 static INLINE int StoreCertRow(CYASSL_CERT_MANAGER* cm, byte* current, int row)
wolfSSL 0:1239e9b70ca2 3998 {
wolfSSL 0:1239e9b70ca2 3999 int added = 0;
wolfSSL 0:1239e9b70ca2 4000 Signer* list = cm->caTable[row];
wolfSSL 0:1239e9b70ca2 4001
wolfSSL 0:1239e9b70ca2 4002 while (list) {
wolfSSL 0:1239e9b70ca2 4003 XMEMCPY(current + added, &list->pubKeySize, sizeof(list->pubKeySize));
wolfSSL 0:1239e9b70ca2 4004 added += (int)sizeof(list->pubKeySize);
wolfSSL 0:1239e9b70ca2 4005
wolfSSL 0:1239e9b70ca2 4006 XMEMCPY(current + added, &list->keyOID, sizeof(list->keyOID));
wolfSSL 0:1239e9b70ca2 4007 added += (int)sizeof(list->keyOID);
wolfSSL 0:1239e9b70ca2 4008
wolfSSL 0:1239e9b70ca2 4009 XMEMCPY(current + added, list->publicKey, list->pubKeySize);
wolfSSL 0:1239e9b70ca2 4010 added += list->pubKeySize;
wolfSSL 0:1239e9b70ca2 4011
wolfSSL 0:1239e9b70ca2 4012 XMEMCPY(current + added, &list->nameLen, sizeof(list->nameLen));
wolfSSL 0:1239e9b70ca2 4013 added += (int)sizeof(list->nameLen);
wolfSSL 0:1239e9b70ca2 4014
wolfSSL 0:1239e9b70ca2 4015 XMEMCPY(current + added, list->name, list->nameLen);
wolfSSL 0:1239e9b70ca2 4016 added += list->nameLen;
wolfSSL 0:1239e9b70ca2 4017
wolfSSL 0:1239e9b70ca2 4018 XMEMCPY(current + added, list->subjectNameHash, SIGNER_DIGEST_SIZE);
wolfSSL 0:1239e9b70ca2 4019 added += SIGNER_DIGEST_SIZE;
wolfSSL 0:1239e9b70ca2 4020
wolfSSL 0:1239e9b70ca2 4021 #ifndef NO_SKID
wolfSSL 0:1239e9b70ca2 4022 XMEMCPY(current + added, list->subjectKeyIdHash,SIGNER_DIGEST_SIZE);
wolfSSL 0:1239e9b70ca2 4023 added += SIGNER_DIGEST_SIZE;
wolfSSL 0:1239e9b70ca2 4024 #endif
wolfSSL 0:1239e9b70ca2 4025
wolfSSL 0:1239e9b70ca2 4026 list = list->next;
wolfSSL 0:1239e9b70ca2 4027 }
wolfSSL 0:1239e9b70ca2 4028
wolfSSL 0:1239e9b70ca2 4029 return added;
wolfSSL 0:1239e9b70ca2 4030 }
wolfSSL 0:1239e9b70ca2 4031
wolfSSL 0:1239e9b70ca2 4032
wolfSSL 0:1239e9b70ca2 4033 /* Persist cert cache to memory, have lock */
wolfSSL 0:1239e9b70ca2 4034 static INLINE int DoMemSaveCertCache(CYASSL_CERT_MANAGER* cm, void* mem, int sz)
wolfSSL 0:1239e9b70ca2 4035 {
wolfSSL 0:1239e9b70ca2 4036 int realSz;
wolfSSL 0:1239e9b70ca2 4037 int ret = SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 4038 int i;
wolfSSL 0:1239e9b70ca2 4039
wolfSSL 0:1239e9b70ca2 4040 CYASSL_ENTER("DoMemSaveCertCache");
wolfSSL 0:1239e9b70ca2 4041
wolfSSL 0:1239e9b70ca2 4042 realSz = GetCertCacheMemSize(cm);
wolfSSL 0:1239e9b70ca2 4043 if (realSz > sz) {
wolfSSL 0:1239e9b70ca2 4044 CYASSL_MSG("Mem output buffer too small");
wolfSSL 0:1239e9b70ca2 4045 ret = BUFFER_E;
wolfSSL 0:1239e9b70ca2 4046 }
wolfSSL 0:1239e9b70ca2 4047 else {
wolfSSL 0:1239e9b70ca2 4048 byte* current;
wolfSSL 0:1239e9b70ca2 4049 CertCacheHeader hdr;
wolfSSL 0:1239e9b70ca2 4050
wolfSSL 0:1239e9b70ca2 4051 hdr.version = CYASSL_CACHE_CERT_VERSION;
wolfSSL 0:1239e9b70ca2 4052 hdr.rows = CA_TABLE_SIZE;
wolfSSL 0:1239e9b70ca2 4053 SetCertHeaderColumns(cm, hdr.columns);
wolfSSL 0:1239e9b70ca2 4054 hdr.signerSz = (int)sizeof(Signer);
wolfSSL 0:1239e9b70ca2 4055
wolfSSL 0:1239e9b70ca2 4056 XMEMCPY(mem, &hdr, sizeof(CertCacheHeader));
wolfSSL 0:1239e9b70ca2 4057 current = (byte*)mem + sizeof(CertCacheHeader);
wolfSSL 0:1239e9b70ca2 4058
wolfSSL 0:1239e9b70ca2 4059 for (i = 0; i < CA_TABLE_SIZE; ++i)
wolfSSL 0:1239e9b70ca2 4060 current += StoreCertRow(cm, current, i);
wolfSSL 0:1239e9b70ca2 4061 }
wolfSSL 0:1239e9b70ca2 4062
wolfSSL 0:1239e9b70ca2 4063 return ret;
wolfSSL 0:1239e9b70ca2 4064 }
wolfSSL 0:1239e9b70ca2 4065
wolfSSL 0:1239e9b70ca2 4066
wolfSSL 0:1239e9b70ca2 4067 #if !defined(NO_FILESYSTEM)
wolfSSL 0:1239e9b70ca2 4068
wolfSSL 0:1239e9b70ca2 4069 /* Persist cert cache to file */
wolfSSL 0:1239e9b70ca2 4070 int CM_SaveCertCache(CYASSL_CERT_MANAGER* cm, const char* fname)
wolfSSL 0:1239e9b70ca2 4071 {
wolfSSL 0:1239e9b70ca2 4072 XFILE file;
wolfSSL 0:1239e9b70ca2 4073 int rc = SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 4074 int memSz;
wolfSSL 0:1239e9b70ca2 4075 byte* mem;
wolfSSL 0:1239e9b70ca2 4076
wolfSSL 0:1239e9b70ca2 4077 CYASSL_ENTER("CM_SaveCertCache");
wolfSSL 0:1239e9b70ca2 4078
wolfSSL 0:1239e9b70ca2 4079 file = XFOPEN(fname, "w+b");
wolfSSL 0:1239e9b70ca2 4080 if (file == XBADFILE) {
wolfSSL 0:1239e9b70ca2 4081 CYASSL_MSG("Couldn't open cert cache save file");
wolfSSL 0:1239e9b70ca2 4082 return SSL_BAD_FILE;
wolfSSL 0:1239e9b70ca2 4083 }
wolfSSL 0:1239e9b70ca2 4084
wolfSSL 0:1239e9b70ca2 4085 if (LockMutex(&cm->caLock) != 0) {
wolfSSL 0:1239e9b70ca2 4086 CYASSL_MSG("LockMutex on caLock failed");
wolfSSL 0:1239e9b70ca2 4087 XFCLOSE(file);
wolfSSL 0:1239e9b70ca2 4088 return BAD_MUTEX_E;
wolfSSL 0:1239e9b70ca2 4089 }
wolfSSL 0:1239e9b70ca2 4090
wolfSSL 0:1239e9b70ca2 4091 memSz = GetCertCacheMemSize(cm);
wolfSSL 0:1239e9b70ca2 4092 mem = (byte*)XMALLOC(memSz, cm->heap, DYNAMIC_TYPE_TMP_BUFFER);
wolfSSL 0:1239e9b70ca2 4093 if (mem == NULL) {
wolfSSL 0:1239e9b70ca2 4094 CYASSL_MSG("Alloc for tmp buffer failed");
wolfSSL 0:1239e9b70ca2 4095 rc = MEMORY_E;
wolfSSL 0:1239e9b70ca2 4096 } else {
wolfSSL 0:1239e9b70ca2 4097 rc = DoMemSaveCertCache(cm, mem, memSz);
wolfSSL 0:1239e9b70ca2 4098 if (rc == SSL_SUCCESS) {
wolfSSL 0:1239e9b70ca2 4099 int ret = (int)XFWRITE(mem, memSz, 1, file);
wolfSSL 0:1239e9b70ca2 4100 if (ret != 1) {
wolfSSL 0:1239e9b70ca2 4101 CYASSL_MSG("Cert cache file write failed");
wolfSSL 0:1239e9b70ca2 4102 rc = FWRITE_ERROR;
wolfSSL 0:1239e9b70ca2 4103 }
wolfSSL 0:1239e9b70ca2 4104 }
wolfSSL 0:1239e9b70ca2 4105 XFREE(mem, cm->heap, DYNAMIC_TYPE_TMP_BUFFER);
wolfSSL 0:1239e9b70ca2 4106 }
wolfSSL 0:1239e9b70ca2 4107
wolfSSL 0:1239e9b70ca2 4108 UnLockMutex(&cm->caLock);
wolfSSL 0:1239e9b70ca2 4109 XFCLOSE(file);
wolfSSL 0:1239e9b70ca2 4110
wolfSSL 0:1239e9b70ca2 4111 return rc;
wolfSSL 0:1239e9b70ca2 4112 }
wolfSSL 0:1239e9b70ca2 4113
wolfSSL 0:1239e9b70ca2 4114
wolfSSL 0:1239e9b70ca2 4115 /* Restore cert cache from file */
wolfSSL 0:1239e9b70ca2 4116 int CM_RestoreCertCache(CYASSL_CERT_MANAGER* cm, const char* fname)
wolfSSL 0:1239e9b70ca2 4117 {
wolfSSL 0:1239e9b70ca2 4118 XFILE file;
wolfSSL 0:1239e9b70ca2 4119 int rc = SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 4120 int ret;
wolfSSL 0:1239e9b70ca2 4121 int memSz;
wolfSSL 0:1239e9b70ca2 4122 byte* mem;
wolfSSL 0:1239e9b70ca2 4123
wolfSSL 0:1239e9b70ca2 4124 CYASSL_ENTER("CM_RestoreCertCache");
wolfSSL 0:1239e9b70ca2 4125
wolfSSL 0:1239e9b70ca2 4126 file = XFOPEN(fname, "rb");
wolfSSL 0:1239e9b70ca2 4127 if (file == XBADFILE) {
wolfSSL 0:1239e9b70ca2 4128 CYASSL_MSG("Couldn't open cert cache save file");
wolfSSL 0:1239e9b70ca2 4129 return SSL_BAD_FILE;
wolfSSL 0:1239e9b70ca2 4130 }
wolfSSL 0:1239e9b70ca2 4131
wolfSSL 0:1239e9b70ca2 4132 XFSEEK(file, 0, XSEEK_END);
wolfSSL 0:1239e9b70ca2 4133 memSz = (int)XFTELL(file);
wolfSSL 0:1239e9b70ca2 4134 XREWIND(file);
wolfSSL 0:1239e9b70ca2 4135
wolfSSL 0:1239e9b70ca2 4136 if (memSz <= 0) {
wolfSSL 0:1239e9b70ca2 4137 CYASSL_MSG("Bad file size");
wolfSSL 0:1239e9b70ca2 4138 XFCLOSE(file);
wolfSSL 0:1239e9b70ca2 4139 return SSL_BAD_FILE;
wolfSSL 0:1239e9b70ca2 4140 }
wolfSSL 0:1239e9b70ca2 4141
wolfSSL 0:1239e9b70ca2 4142 mem = (byte*)XMALLOC(memSz, cm->heap, DYNAMIC_TYPE_TMP_BUFFER);
wolfSSL 0:1239e9b70ca2 4143 if (mem == NULL) {
wolfSSL 0:1239e9b70ca2 4144 CYASSL_MSG("Alloc for tmp buffer failed");
wolfSSL 0:1239e9b70ca2 4145 XFCLOSE(file);
wolfSSL 0:1239e9b70ca2 4146 return MEMORY_E;
wolfSSL 0:1239e9b70ca2 4147 }
wolfSSL 0:1239e9b70ca2 4148
wolfSSL 0:1239e9b70ca2 4149 ret = (int)XFREAD(mem, memSz, 1, file);
wolfSSL 0:1239e9b70ca2 4150 if (ret != 1) {
wolfSSL 0:1239e9b70ca2 4151 CYASSL_MSG("Cert file read error");
wolfSSL 0:1239e9b70ca2 4152 rc = FREAD_ERROR;
wolfSSL 0:1239e9b70ca2 4153 } else {
wolfSSL 0:1239e9b70ca2 4154 rc = CM_MemRestoreCertCache(cm, mem, memSz);
wolfSSL 0:1239e9b70ca2 4155 if (rc != SSL_SUCCESS) {
wolfSSL 0:1239e9b70ca2 4156 CYASSL_MSG("Mem restore cert cache failed");
wolfSSL 0:1239e9b70ca2 4157 }
wolfSSL 0:1239e9b70ca2 4158 }
wolfSSL 0:1239e9b70ca2 4159
wolfSSL 0:1239e9b70ca2 4160 XFREE(mem, cm->heap, DYNAMIC_TYPE_TMP_BUFFER);
wolfSSL 0:1239e9b70ca2 4161 XFCLOSE(file);
wolfSSL 0:1239e9b70ca2 4162
wolfSSL 0:1239e9b70ca2 4163 return rc;
wolfSSL 0:1239e9b70ca2 4164 }
wolfSSL 0:1239e9b70ca2 4165
wolfSSL 0:1239e9b70ca2 4166 #endif /* NO_FILESYSTEM */
wolfSSL 0:1239e9b70ca2 4167
wolfSSL 0:1239e9b70ca2 4168
wolfSSL 0:1239e9b70ca2 4169 /* Persist cert cache to memory */
wolfSSL 0:1239e9b70ca2 4170 int CM_MemSaveCertCache(CYASSL_CERT_MANAGER* cm, void* mem, int sz, int* used)
wolfSSL 0:1239e9b70ca2 4171 {
wolfSSL 0:1239e9b70ca2 4172 int ret = SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 4173
wolfSSL 0:1239e9b70ca2 4174 CYASSL_ENTER("CM_MemSaveCertCache");
wolfSSL 0:1239e9b70ca2 4175
wolfSSL 0:1239e9b70ca2 4176 if (LockMutex(&cm->caLock) != 0) {
wolfSSL 0:1239e9b70ca2 4177 CYASSL_MSG("LockMutex on caLock failed");
wolfSSL 0:1239e9b70ca2 4178 return BAD_MUTEX_E;
wolfSSL 0:1239e9b70ca2 4179 }
wolfSSL 0:1239e9b70ca2 4180
wolfSSL 0:1239e9b70ca2 4181 ret = DoMemSaveCertCache(cm, mem, sz);
wolfSSL 0:1239e9b70ca2 4182 if (ret == SSL_SUCCESS)
wolfSSL 0:1239e9b70ca2 4183 *used = GetCertCacheMemSize(cm);
wolfSSL 0:1239e9b70ca2 4184
wolfSSL 0:1239e9b70ca2 4185 UnLockMutex(&cm->caLock);
wolfSSL 0:1239e9b70ca2 4186
wolfSSL 0:1239e9b70ca2 4187 return ret;
wolfSSL 0:1239e9b70ca2 4188 }
wolfSSL 0:1239e9b70ca2 4189
wolfSSL 0:1239e9b70ca2 4190
wolfSSL 0:1239e9b70ca2 4191 /* Restore cert cache from memory */
wolfSSL 0:1239e9b70ca2 4192 int CM_MemRestoreCertCache(CYASSL_CERT_MANAGER* cm, const void* mem, int sz)
wolfSSL 0:1239e9b70ca2 4193 {
wolfSSL 0:1239e9b70ca2 4194 int ret = SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 4195 int i;
wolfSSL 0:1239e9b70ca2 4196 CertCacheHeader* hdr = (CertCacheHeader*)mem;
wolfSSL 0:1239e9b70ca2 4197 byte* current = (byte*)mem + sizeof(CertCacheHeader);
wolfSSL 0:1239e9b70ca2 4198 byte* end = (byte*)mem + sz; /* don't go over */
wolfSSL 0:1239e9b70ca2 4199
wolfSSL 0:1239e9b70ca2 4200 CYASSL_ENTER("CM_MemRestoreCertCache");
wolfSSL 0:1239e9b70ca2 4201
wolfSSL 0:1239e9b70ca2 4202 if (current > end) {
wolfSSL 0:1239e9b70ca2 4203 CYASSL_MSG("Cert Cache Memory buffer too small");
wolfSSL 0:1239e9b70ca2 4204 return BUFFER_E;
wolfSSL 0:1239e9b70ca2 4205 }
wolfSSL 0:1239e9b70ca2 4206
wolfSSL 0:1239e9b70ca2 4207 if (hdr->version != CYASSL_CACHE_CERT_VERSION ||
wolfSSL 0:1239e9b70ca2 4208 hdr->rows != CA_TABLE_SIZE ||
wolfSSL 0:1239e9b70ca2 4209 hdr->signerSz != (int)sizeof(Signer)) {
wolfSSL 0:1239e9b70ca2 4210
wolfSSL 0:1239e9b70ca2 4211 CYASSL_MSG("Cert Cache Memory header mismatch");
wolfSSL 0:1239e9b70ca2 4212 return CACHE_MATCH_ERROR;
wolfSSL 0:1239e9b70ca2 4213 }
wolfSSL 0:1239e9b70ca2 4214
wolfSSL 0:1239e9b70ca2 4215 if (LockMutex(&cm->caLock) != 0) {
wolfSSL 0:1239e9b70ca2 4216 CYASSL_MSG("LockMutex on caLock failed");
wolfSSL 0:1239e9b70ca2 4217 return BAD_MUTEX_E;
wolfSSL 0:1239e9b70ca2 4218 }
wolfSSL 0:1239e9b70ca2 4219
wolfSSL 0:1239e9b70ca2 4220 FreeSignerTable(cm->caTable, CA_TABLE_SIZE, cm->heap);
wolfSSL 0:1239e9b70ca2 4221
wolfSSL 0:1239e9b70ca2 4222 for (i = 0; i < CA_TABLE_SIZE; ++i) {
wolfSSL 0:1239e9b70ca2 4223 int added = RestoreCertRow(cm, current, i, hdr->columns[i], end);
wolfSSL 0:1239e9b70ca2 4224 if (added < 0) {
wolfSSL 0:1239e9b70ca2 4225 CYASSL_MSG("RestoreCertRow error");
wolfSSL 0:1239e9b70ca2 4226 ret = added;
wolfSSL 0:1239e9b70ca2 4227 break;
wolfSSL 0:1239e9b70ca2 4228 }
wolfSSL 0:1239e9b70ca2 4229 current += added;
wolfSSL 0:1239e9b70ca2 4230 }
wolfSSL 0:1239e9b70ca2 4231
wolfSSL 0:1239e9b70ca2 4232 UnLockMutex(&cm->caLock);
wolfSSL 0:1239e9b70ca2 4233
wolfSSL 0:1239e9b70ca2 4234 return ret;
wolfSSL 0:1239e9b70ca2 4235 }
wolfSSL 0:1239e9b70ca2 4236
wolfSSL 0:1239e9b70ca2 4237
wolfSSL 0:1239e9b70ca2 4238 /* get how big the the cert cache save buffer needs to be */
wolfSSL 0:1239e9b70ca2 4239 int CM_GetCertCacheMemSize(CYASSL_CERT_MANAGER* cm)
wolfSSL 0:1239e9b70ca2 4240 {
wolfSSL 0:1239e9b70ca2 4241 int sz;
wolfSSL 0:1239e9b70ca2 4242
wolfSSL 0:1239e9b70ca2 4243 CYASSL_ENTER("CM_GetCertCacheMemSize");
wolfSSL 0:1239e9b70ca2 4244
wolfSSL 0:1239e9b70ca2 4245 if (LockMutex(&cm->caLock) != 0) {
wolfSSL 0:1239e9b70ca2 4246 CYASSL_MSG("LockMutex on caLock failed");
wolfSSL 0:1239e9b70ca2 4247 return BAD_MUTEX_E;
wolfSSL 0:1239e9b70ca2 4248 }
wolfSSL 0:1239e9b70ca2 4249
wolfSSL 0:1239e9b70ca2 4250 sz = GetCertCacheMemSize(cm);
wolfSSL 0:1239e9b70ca2 4251
wolfSSL 0:1239e9b70ca2 4252 UnLockMutex(&cm->caLock);
wolfSSL 0:1239e9b70ca2 4253
wolfSSL 0:1239e9b70ca2 4254 return sz;
wolfSSL 0:1239e9b70ca2 4255 }
wolfSSL 0:1239e9b70ca2 4256
wolfSSL 0:1239e9b70ca2 4257 #endif /* PERSIST_CERT_CACHE */
wolfSSL 0:1239e9b70ca2 4258 #endif /* NO_CERTS */
wolfSSL 0:1239e9b70ca2 4259
wolfSSL 0:1239e9b70ca2 4260
wolfSSL 0:1239e9b70ca2 4261 int CyaSSL_CTX_set_cipher_list(CYASSL_CTX* ctx, const char* list)
wolfSSL 0:1239e9b70ca2 4262 {
wolfSSL 0:1239e9b70ca2 4263 CYASSL_ENTER("CyaSSL_CTX_set_cipher_list");
wolfSSL 0:1239e9b70ca2 4264 if (SetCipherList(&ctx->suites, list))
wolfSSL 0:1239e9b70ca2 4265 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 4266 else
wolfSSL 0:1239e9b70ca2 4267 return SSL_FAILURE;
wolfSSL 0:1239e9b70ca2 4268 }
wolfSSL 0:1239e9b70ca2 4269
wolfSSL 0:1239e9b70ca2 4270
wolfSSL 0:1239e9b70ca2 4271 int CyaSSL_set_cipher_list(CYASSL* ssl, const char* list)
wolfSSL 0:1239e9b70ca2 4272 {
wolfSSL 0:1239e9b70ca2 4273 CYASSL_ENTER("CyaSSL_set_cipher_list");
wolfSSL 0:1239e9b70ca2 4274 if (SetCipherList(ssl->suites, list)) {
wolfSSL 0:1239e9b70ca2 4275 byte haveRSA = 1;
wolfSSL 0:1239e9b70ca2 4276 byte havePSK = 0;
wolfSSL 0:1239e9b70ca2 4277
wolfSSL 0:1239e9b70ca2 4278 #ifdef NO_RSA
wolfSSL 0:1239e9b70ca2 4279 haveRSA = 0;
wolfSSL 0:1239e9b70ca2 4280 #endif
wolfSSL 0:1239e9b70ca2 4281 #ifndef NO_PSK
wolfSSL 0:1239e9b70ca2 4282 havePSK = ssl->options.havePSK;
wolfSSL 0:1239e9b70ca2 4283 #endif
wolfSSL 0:1239e9b70ca2 4284
wolfSSL 0:1239e9b70ca2 4285 InitSuites(ssl->suites, ssl->version, haveRSA, havePSK,
wolfSSL 0:1239e9b70ca2 4286 ssl->options.haveDH, ssl->options.haveNTRU,
wolfSSL 0:1239e9b70ca2 4287 ssl->options.haveECDSAsig, ssl->options.haveStaticECC,
wolfSSL 0:1239e9b70ca2 4288 ssl->options.side);
wolfSSL 0:1239e9b70ca2 4289
wolfSSL 0:1239e9b70ca2 4290 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 4291 }
wolfSSL 0:1239e9b70ca2 4292 else
wolfSSL 0:1239e9b70ca2 4293 return SSL_FAILURE;
wolfSSL 0:1239e9b70ca2 4294 }
wolfSSL 0:1239e9b70ca2 4295
wolfSSL 0:1239e9b70ca2 4296
wolfSSL 0:1239e9b70ca2 4297 #ifndef CYASSL_LEANPSK
wolfSSL 0:1239e9b70ca2 4298 #ifdef CYASSL_DTLS
wolfSSL 0:1239e9b70ca2 4299
wolfSSL 0:1239e9b70ca2 4300 int CyaSSL_dtls_get_current_timeout(CYASSL* ssl)
wolfSSL 0:1239e9b70ca2 4301 {
wolfSSL 0:1239e9b70ca2 4302 (void)ssl;
wolfSSL 0:1239e9b70ca2 4303
wolfSSL 0:1239e9b70ca2 4304 return ssl->dtls_timeout;
wolfSSL 0:1239e9b70ca2 4305 }
wolfSSL 0:1239e9b70ca2 4306
wolfSSL 0:1239e9b70ca2 4307
wolfSSL 0:1239e9b70ca2 4308 /* user may need to alter init dtls recv timeout, SSL_SUCCESS on ok */
wolfSSL 0:1239e9b70ca2 4309 int CyaSSL_dtls_set_timeout_init(CYASSL* ssl, int timeout)
wolfSSL 0:1239e9b70ca2 4310 {
wolfSSL 0:1239e9b70ca2 4311 if (ssl == NULL || timeout < 0)
wolfSSL 0:1239e9b70ca2 4312 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 4313
wolfSSL 0:1239e9b70ca2 4314 if (timeout > ssl->dtls_timeout_max) {
wolfSSL 0:1239e9b70ca2 4315 CYASSL_MSG("Can't set dtls timeout init greater than dtls timeout max");
wolfSSL 0:1239e9b70ca2 4316 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 4317 }
wolfSSL 0:1239e9b70ca2 4318
wolfSSL 0:1239e9b70ca2 4319 ssl->dtls_timeout_init = timeout;
wolfSSL 0:1239e9b70ca2 4320 ssl->dtls_timeout = timeout;
wolfSSL 0:1239e9b70ca2 4321
wolfSSL 0:1239e9b70ca2 4322 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 4323 }
wolfSSL 0:1239e9b70ca2 4324
wolfSSL 0:1239e9b70ca2 4325
wolfSSL 0:1239e9b70ca2 4326 /* user may need to alter max dtls recv timeout, SSL_SUCCESS on ok */
wolfSSL 0:1239e9b70ca2 4327 int CyaSSL_dtls_set_timeout_max(CYASSL* ssl, int timeout)
wolfSSL 0:1239e9b70ca2 4328 {
wolfSSL 0:1239e9b70ca2 4329 if (ssl == NULL || timeout < 0)
wolfSSL 0:1239e9b70ca2 4330 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 4331
wolfSSL 0:1239e9b70ca2 4332 if (timeout < ssl->dtls_timeout_init) {
wolfSSL 0:1239e9b70ca2 4333 CYASSL_MSG("Can't set dtls timeout max less than dtls timeout init");
wolfSSL 0:1239e9b70ca2 4334 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 4335 }
wolfSSL 0:1239e9b70ca2 4336
wolfSSL 0:1239e9b70ca2 4337 ssl->dtls_timeout_max = timeout;
wolfSSL 0:1239e9b70ca2 4338
wolfSSL 0:1239e9b70ca2 4339 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 4340 }
wolfSSL 0:1239e9b70ca2 4341
wolfSSL 0:1239e9b70ca2 4342
wolfSSL 0:1239e9b70ca2 4343 int CyaSSL_dtls_got_timeout(CYASSL* ssl)
wolfSSL 0:1239e9b70ca2 4344 {
wolfSSL 0:1239e9b70ca2 4345 int result = SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 4346
wolfSSL 0:1239e9b70ca2 4347 DtlsMsgListDelete(ssl->dtls_msg_list, ssl->heap);
wolfSSL 0:1239e9b70ca2 4348 ssl->dtls_msg_list = NULL;
wolfSSL 0:1239e9b70ca2 4349 if (DtlsPoolTimeout(ssl) < 0 || DtlsPoolSend(ssl) < 0) {
wolfSSL 0:1239e9b70ca2 4350 result = SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 4351 }
wolfSSL 0:1239e9b70ca2 4352 return result;
wolfSSL 0:1239e9b70ca2 4353 }
wolfSSL 0:1239e9b70ca2 4354
wolfSSL 0:1239e9b70ca2 4355 #endif /* DTLS */
wolfSSL 0:1239e9b70ca2 4356 #endif /* LEANPSK */
wolfSSL 0:1239e9b70ca2 4357
wolfSSL 0:1239e9b70ca2 4358
wolfSSL 0:1239e9b70ca2 4359 /* client only parts */
wolfSSL 0:1239e9b70ca2 4360 #ifndef NO_CYASSL_CLIENT
wolfSSL 0:1239e9b70ca2 4361
wolfSSL 0:1239e9b70ca2 4362 #ifndef NO_OLD_TLS
wolfSSL 0:1239e9b70ca2 4363 CYASSL_METHOD* CyaSSLv3_client_method(void)
wolfSSL 0:1239e9b70ca2 4364 {
wolfSSL 0:1239e9b70ca2 4365 CYASSL_METHOD* method =
wolfSSL 0:1239e9b70ca2 4366 (CYASSL_METHOD*) XMALLOC(sizeof(CYASSL_METHOD), 0,
wolfSSL 0:1239e9b70ca2 4367 DYNAMIC_TYPE_METHOD);
wolfSSL 0:1239e9b70ca2 4368 CYASSL_ENTER("SSLv3_client_method");
wolfSSL 0:1239e9b70ca2 4369 if (method)
wolfSSL 0:1239e9b70ca2 4370 InitSSL_Method(method, MakeSSLv3());
wolfSSL 0:1239e9b70ca2 4371 return method;
wolfSSL 0:1239e9b70ca2 4372 }
wolfSSL 0:1239e9b70ca2 4373 #endif
wolfSSL 0:1239e9b70ca2 4374
wolfSSL 0:1239e9b70ca2 4375 #ifdef CYASSL_DTLS
wolfSSL 0:1239e9b70ca2 4376 CYASSL_METHOD* CyaDTLSv1_client_method(void)
wolfSSL 0:1239e9b70ca2 4377 {
wolfSSL 0:1239e9b70ca2 4378 CYASSL_METHOD* method =
wolfSSL 0:1239e9b70ca2 4379 (CYASSL_METHOD*) XMALLOC(sizeof(CYASSL_METHOD), 0,
wolfSSL 0:1239e9b70ca2 4380 DYNAMIC_TYPE_METHOD);
wolfSSL 0:1239e9b70ca2 4381 CYASSL_ENTER("DTLSv1_client_method");
wolfSSL 0:1239e9b70ca2 4382 if (method)
wolfSSL 0:1239e9b70ca2 4383 InitSSL_Method(method, MakeDTLSv1());
wolfSSL 0:1239e9b70ca2 4384 return method;
wolfSSL 0:1239e9b70ca2 4385 }
wolfSSL 0:1239e9b70ca2 4386
wolfSSL 0:1239e9b70ca2 4387 CYASSL_METHOD* CyaDTLSv1_2_client_method(void)
wolfSSL 0:1239e9b70ca2 4388 {
wolfSSL 0:1239e9b70ca2 4389 CYASSL_METHOD* method =
wolfSSL 0:1239e9b70ca2 4390 (CYASSL_METHOD*) XMALLOC(sizeof(CYASSL_METHOD), 0,
wolfSSL 0:1239e9b70ca2 4391 DYNAMIC_TYPE_METHOD);
wolfSSL 0:1239e9b70ca2 4392 CYASSL_ENTER("DTLSv1_2_client_method");
wolfSSL 0:1239e9b70ca2 4393 if (method)
wolfSSL 0:1239e9b70ca2 4394 InitSSL_Method(method, MakeDTLSv1_2());
wolfSSL 0:1239e9b70ca2 4395 return method;
wolfSSL 0:1239e9b70ca2 4396 }
wolfSSL 0:1239e9b70ca2 4397 #endif
wolfSSL 0:1239e9b70ca2 4398
wolfSSL 0:1239e9b70ca2 4399
wolfSSL 0:1239e9b70ca2 4400 /* please see note at top of README if you get an error from connect */
wolfSSL 0:1239e9b70ca2 4401 int CyaSSL_connect(CYASSL* ssl)
wolfSSL 0:1239e9b70ca2 4402 {
wolfSSL 0:1239e9b70ca2 4403 int neededState;
wolfSSL 0:1239e9b70ca2 4404
wolfSSL 0:1239e9b70ca2 4405 CYASSL_ENTER("SSL_connect()");
wolfSSL 0:1239e9b70ca2 4406
wolfSSL 0:1239e9b70ca2 4407 #ifdef HAVE_ERRNO_H
wolfSSL 0:1239e9b70ca2 4408 errno = 0;
wolfSSL 0:1239e9b70ca2 4409 #endif
wolfSSL 0:1239e9b70ca2 4410
wolfSSL 0:1239e9b70ca2 4411 if (ssl->options.side != CYASSL_CLIENT_END) {
wolfSSL 0:1239e9b70ca2 4412 CYASSL_ERROR(ssl->error = SIDE_ERROR);
wolfSSL 0:1239e9b70ca2 4413 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 4414 }
wolfSSL 0:1239e9b70ca2 4415
wolfSSL 0:1239e9b70ca2 4416 #ifdef CYASSL_DTLS
wolfSSL 0:1239e9b70ca2 4417 if (ssl->version.major == DTLS_MAJOR) {
wolfSSL 0:1239e9b70ca2 4418 ssl->options.dtls = 1;
wolfSSL 0:1239e9b70ca2 4419 ssl->options.tls = 1;
wolfSSL 0:1239e9b70ca2 4420 ssl->options.tls1_1 = 1;
wolfSSL 0:1239e9b70ca2 4421
wolfSSL 0:1239e9b70ca2 4422 if (DtlsPoolInit(ssl) != 0) {
wolfSSL 0:1239e9b70ca2 4423 ssl->error = MEMORY_ERROR;
wolfSSL 0:1239e9b70ca2 4424 CYASSL_ERROR(ssl->error);
wolfSSL 0:1239e9b70ca2 4425 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 4426 }
wolfSSL 0:1239e9b70ca2 4427 }
wolfSSL 0:1239e9b70ca2 4428 #endif
wolfSSL 0:1239e9b70ca2 4429
wolfSSL 0:1239e9b70ca2 4430 if (ssl->buffers.outputBuffer.length > 0) {
wolfSSL 0:1239e9b70ca2 4431 if ( (ssl->error = SendBuffered(ssl)) == 0) {
wolfSSL 0:1239e9b70ca2 4432 ssl->options.connectState++;
wolfSSL 0:1239e9b70ca2 4433 CYASSL_MSG("connect state: Advanced from buffered send");
wolfSSL 0:1239e9b70ca2 4434 }
wolfSSL 0:1239e9b70ca2 4435 else {
wolfSSL 0:1239e9b70ca2 4436 CYASSL_ERROR(ssl->error);
wolfSSL 0:1239e9b70ca2 4437 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 4438 }
wolfSSL 0:1239e9b70ca2 4439 }
wolfSSL 0:1239e9b70ca2 4440
wolfSSL 0:1239e9b70ca2 4441 switch (ssl->options.connectState) {
wolfSSL 0:1239e9b70ca2 4442
wolfSSL 0:1239e9b70ca2 4443 case CONNECT_BEGIN :
wolfSSL 0:1239e9b70ca2 4444 /* always send client hello first */
wolfSSL 0:1239e9b70ca2 4445 if ( (ssl->error = SendClientHello(ssl)) != 0) {
wolfSSL 0:1239e9b70ca2 4446 CYASSL_ERROR(ssl->error);
wolfSSL 0:1239e9b70ca2 4447 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 4448 }
wolfSSL 0:1239e9b70ca2 4449 ssl->options.connectState = CLIENT_HELLO_SENT;
wolfSSL 0:1239e9b70ca2 4450 CYASSL_MSG("connect state: CLIENT_HELLO_SENT");
wolfSSL 0:1239e9b70ca2 4451
wolfSSL 0:1239e9b70ca2 4452 case CLIENT_HELLO_SENT :
wolfSSL 0:1239e9b70ca2 4453 neededState = ssl->options.resuming ? SERVER_FINISHED_COMPLETE :
wolfSSL 0:1239e9b70ca2 4454 SERVER_HELLODONE_COMPLETE;
wolfSSL 0:1239e9b70ca2 4455 #ifdef CYASSL_DTLS
wolfSSL 0:1239e9b70ca2 4456 /* In DTLS, when resuming, we can go straight to FINISHED,
wolfSSL 0:1239e9b70ca2 4457 * or do a cookie exchange and then skip to FINISHED, assume
wolfSSL 0:1239e9b70ca2 4458 * we need the cookie exchange first. */
wolfSSL 0:1239e9b70ca2 4459 if (ssl->options.dtls)
wolfSSL 0:1239e9b70ca2 4460 neededState = SERVER_HELLOVERIFYREQUEST_COMPLETE;
wolfSSL 0:1239e9b70ca2 4461 #endif
wolfSSL 0:1239e9b70ca2 4462 /* get response */
wolfSSL 0:1239e9b70ca2 4463 while (ssl->options.serverState < neededState) {
wolfSSL 0:1239e9b70ca2 4464 if ( (ssl->error = ProcessReply(ssl)) < 0) {
wolfSSL 0:1239e9b70ca2 4465 CYASSL_ERROR(ssl->error);
wolfSSL 0:1239e9b70ca2 4466 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 4467 }
wolfSSL 0:1239e9b70ca2 4468 /* if resumption failed, reset needed state */
wolfSSL 0:1239e9b70ca2 4469 else if (neededState == SERVER_FINISHED_COMPLETE)
wolfSSL 0:1239e9b70ca2 4470 if (!ssl->options.resuming) {
wolfSSL 0:1239e9b70ca2 4471 if (!ssl->options.dtls)
wolfSSL 0:1239e9b70ca2 4472 neededState = SERVER_HELLODONE_COMPLETE;
wolfSSL 0:1239e9b70ca2 4473 else
wolfSSL 0:1239e9b70ca2 4474 neededState = SERVER_HELLOVERIFYREQUEST_COMPLETE;
wolfSSL 0:1239e9b70ca2 4475 }
wolfSSL 0:1239e9b70ca2 4476 }
wolfSSL 0:1239e9b70ca2 4477
wolfSSL 0:1239e9b70ca2 4478 ssl->options.connectState = HELLO_AGAIN;
wolfSSL 0:1239e9b70ca2 4479 CYASSL_MSG("connect state: HELLO_AGAIN");
wolfSSL 0:1239e9b70ca2 4480
wolfSSL 0:1239e9b70ca2 4481 case HELLO_AGAIN :
wolfSSL 0:1239e9b70ca2 4482 if (ssl->options.certOnly)
wolfSSL 0:1239e9b70ca2 4483 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 4484
wolfSSL 0:1239e9b70ca2 4485 #ifdef CYASSL_DTLS
wolfSSL 0:1239e9b70ca2 4486 if (ssl->options.dtls) {
wolfSSL 0:1239e9b70ca2 4487 /* re-init hashes, exclude first hello and verify request */
wolfSSL 0:1239e9b70ca2 4488 #ifndef NO_OLD_TLS
wolfSSL 0:1239e9b70ca2 4489 InitMd5(&ssl->hashMd5);
wolfSSL 0:1239e9b70ca2 4490 if ( (ssl->error = InitSha(&ssl->hashSha)) != 0) {
wolfSSL 0:1239e9b70ca2 4491 CYASSL_ERROR(ssl->error);
wolfSSL 0:1239e9b70ca2 4492 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 4493 }
wolfSSL 0:1239e9b70ca2 4494 #endif
wolfSSL 0:1239e9b70ca2 4495 if (IsAtLeastTLSv1_2(ssl)) {
wolfSSL 0:1239e9b70ca2 4496 #ifndef NO_SHA256
wolfSSL 0:1239e9b70ca2 4497 if ( (ssl->error =
wolfSSL 0:1239e9b70ca2 4498 InitSha256(&ssl->hashSha256)) != 0) {
wolfSSL 0:1239e9b70ca2 4499 CYASSL_ERROR(ssl->error);
wolfSSL 0:1239e9b70ca2 4500 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 4501 }
wolfSSL 0:1239e9b70ca2 4502 #endif
wolfSSL 0:1239e9b70ca2 4503 #ifdef CYASSL_SHA384
wolfSSL 0:1239e9b70ca2 4504 if ( (ssl->error =
wolfSSL 0:1239e9b70ca2 4505 InitSha384(&ssl->hashSha384)) != 0) {
wolfSSL 0:1239e9b70ca2 4506 CYASSL_ERROR(ssl->error);
wolfSSL 0:1239e9b70ca2 4507 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 4508 }
wolfSSL 0:1239e9b70ca2 4509 #endif
wolfSSL 0:1239e9b70ca2 4510 }
wolfSSL 0:1239e9b70ca2 4511 if ( (ssl->error = SendClientHello(ssl)) != 0) {
wolfSSL 0:1239e9b70ca2 4512 CYASSL_ERROR(ssl->error);
wolfSSL 0:1239e9b70ca2 4513 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 4514 }
wolfSSL 0:1239e9b70ca2 4515 }
wolfSSL 0:1239e9b70ca2 4516 #endif
wolfSSL 0:1239e9b70ca2 4517
wolfSSL 0:1239e9b70ca2 4518 ssl->options.connectState = HELLO_AGAIN_REPLY;
wolfSSL 0:1239e9b70ca2 4519 CYASSL_MSG("connect state: HELLO_AGAIN_REPLY");
wolfSSL 0:1239e9b70ca2 4520
wolfSSL 0:1239e9b70ca2 4521 case HELLO_AGAIN_REPLY :
wolfSSL 0:1239e9b70ca2 4522 #ifdef CYASSL_DTLS
wolfSSL 0:1239e9b70ca2 4523 if (ssl->options.dtls) {
wolfSSL 0:1239e9b70ca2 4524 neededState = ssl->options.resuming ?
wolfSSL 0:1239e9b70ca2 4525 SERVER_FINISHED_COMPLETE : SERVER_HELLODONE_COMPLETE;
wolfSSL 0:1239e9b70ca2 4526
wolfSSL 0:1239e9b70ca2 4527 /* get response */
wolfSSL 0:1239e9b70ca2 4528 while (ssl->options.serverState < neededState) {
wolfSSL 0:1239e9b70ca2 4529 if ( (ssl->error = ProcessReply(ssl)) < 0) {
wolfSSL 0:1239e9b70ca2 4530 CYASSL_ERROR(ssl->error);
wolfSSL 0:1239e9b70ca2 4531 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 4532 }
wolfSSL 0:1239e9b70ca2 4533 /* if resumption failed, reset needed state */
wolfSSL 0:1239e9b70ca2 4534 else if (neededState == SERVER_FINISHED_COMPLETE)
wolfSSL 0:1239e9b70ca2 4535 if (!ssl->options.resuming)
wolfSSL 0:1239e9b70ca2 4536 neededState = SERVER_HELLODONE_COMPLETE;
wolfSSL 0:1239e9b70ca2 4537 }
wolfSSL 0:1239e9b70ca2 4538 }
wolfSSL 0:1239e9b70ca2 4539 #endif
wolfSSL 0:1239e9b70ca2 4540
wolfSSL 0:1239e9b70ca2 4541 ssl->options.connectState = FIRST_REPLY_DONE;
wolfSSL 0:1239e9b70ca2 4542 CYASSL_MSG("connect state: FIRST_REPLY_DONE");
wolfSSL 0:1239e9b70ca2 4543
wolfSSL 0:1239e9b70ca2 4544 case FIRST_REPLY_DONE :
wolfSSL 0:1239e9b70ca2 4545 #ifndef NO_CERTS
wolfSSL 0:1239e9b70ca2 4546 if (ssl->options.sendVerify) {
wolfSSL 0:1239e9b70ca2 4547 if ( (ssl->error = SendCertificate(ssl)) != 0) {
wolfSSL 0:1239e9b70ca2 4548 CYASSL_ERROR(ssl->error);
wolfSSL 0:1239e9b70ca2 4549 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 4550 }
wolfSSL 0:1239e9b70ca2 4551 CYASSL_MSG("sent: certificate");
wolfSSL 0:1239e9b70ca2 4552 }
wolfSSL 0:1239e9b70ca2 4553
wolfSSL 0:1239e9b70ca2 4554 #endif
wolfSSL 0:1239e9b70ca2 4555 ssl->options.connectState = FIRST_REPLY_FIRST;
wolfSSL 0:1239e9b70ca2 4556 CYASSL_MSG("connect state: FIRST_REPLY_FIRST");
wolfSSL 0:1239e9b70ca2 4557
wolfSSL 0:1239e9b70ca2 4558 case FIRST_REPLY_FIRST :
wolfSSL 0:1239e9b70ca2 4559 if (!ssl->options.resuming) {
wolfSSL 0:1239e9b70ca2 4560 if ( (ssl->error = SendClientKeyExchange(ssl)) != 0) {
wolfSSL 0:1239e9b70ca2 4561 CYASSL_ERROR(ssl->error);
wolfSSL 0:1239e9b70ca2 4562 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 4563 }
wolfSSL 0:1239e9b70ca2 4564 CYASSL_MSG("sent: client key exchange");
wolfSSL 0:1239e9b70ca2 4565 }
wolfSSL 0:1239e9b70ca2 4566
wolfSSL 0:1239e9b70ca2 4567 ssl->options.connectState = FIRST_REPLY_SECOND;
wolfSSL 0:1239e9b70ca2 4568 CYASSL_MSG("connect state: FIRST_REPLY_SECOND");
wolfSSL 0:1239e9b70ca2 4569
wolfSSL 0:1239e9b70ca2 4570 case FIRST_REPLY_SECOND :
wolfSSL 0:1239e9b70ca2 4571 #ifndef NO_CERTS
wolfSSL 0:1239e9b70ca2 4572 if (ssl->options.sendVerify) {
wolfSSL 0:1239e9b70ca2 4573 if ( (ssl->error = SendCertificateVerify(ssl)) != 0) {
wolfSSL 0:1239e9b70ca2 4574 CYASSL_ERROR(ssl->error);
wolfSSL 0:1239e9b70ca2 4575 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 4576 }
wolfSSL 0:1239e9b70ca2 4577 CYASSL_MSG("sent: certificate verify");
wolfSSL 0:1239e9b70ca2 4578 }
wolfSSL 0:1239e9b70ca2 4579 #endif
wolfSSL 0:1239e9b70ca2 4580 ssl->options.connectState = FIRST_REPLY_THIRD;
wolfSSL 0:1239e9b70ca2 4581 CYASSL_MSG("connect state: FIRST_REPLY_THIRD");
wolfSSL 0:1239e9b70ca2 4582
wolfSSL 0:1239e9b70ca2 4583 case FIRST_REPLY_THIRD :
wolfSSL 0:1239e9b70ca2 4584 if ( (ssl->error = SendChangeCipher(ssl)) != 0) {
wolfSSL 0:1239e9b70ca2 4585 CYASSL_ERROR(ssl->error);
wolfSSL 0:1239e9b70ca2 4586 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 4587 }
wolfSSL 0:1239e9b70ca2 4588 CYASSL_MSG("sent: change cipher spec");
wolfSSL 0:1239e9b70ca2 4589 ssl->options.connectState = FIRST_REPLY_FOURTH;
wolfSSL 0:1239e9b70ca2 4590 CYASSL_MSG("connect state: FIRST_REPLY_FOURTH");
wolfSSL 0:1239e9b70ca2 4591
wolfSSL 0:1239e9b70ca2 4592 case FIRST_REPLY_FOURTH :
wolfSSL 0:1239e9b70ca2 4593 if ( (ssl->error = SendFinished(ssl)) != 0) {
wolfSSL 0:1239e9b70ca2 4594 CYASSL_ERROR(ssl->error);
wolfSSL 0:1239e9b70ca2 4595 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 4596 }
wolfSSL 0:1239e9b70ca2 4597 CYASSL_MSG("sent: finished");
wolfSSL 0:1239e9b70ca2 4598 ssl->options.connectState = FINISHED_DONE;
wolfSSL 0:1239e9b70ca2 4599 CYASSL_MSG("connect state: FINISHED_DONE");
wolfSSL 0:1239e9b70ca2 4600
wolfSSL 0:1239e9b70ca2 4601 case FINISHED_DONE :
wolfSSL 0:1239e9b70ca2 4602 /* get response */
wolfSSL 0:1239e9b70ca2 4603 while (ssl->options.serverState < SERVER_FINISHED_COMPLETE)
wolfSSL 0:1239e9b70ca2 4604 if ( (ssl->error = ProcessReply(ssl)) < 0) {
wolfSSL 0:1239e9b70ca2 4605 CYASSL_ERROR(ssl->error);
wolfSSL 0:1239e9b70ca2 4606 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 4607 }
wolfSSL 0:1239e9b70ca2 4608
wolfSSL 0:1239e9b70ca2 4609 ssl->options.connectState = SECOND_REPLY_DONE;
wolfSSL 0:1239e9b70ca2 4610 CYASSL_MSG("connect state: SECOND_REPLY_DONE");
wolfSSL 0:1239e9b70ca2 4611
wolfSSL 0:1239e9b70ca2 4612 case SECOND_REPLY_DONE:
wolfSSL 0:1239e9b70ca2 4613 FreeHandshakeResources(ssl);
wolfSSL 0:1239e9b70ca2 4614 CYASSL_LEAVE("SSL_connect()", SSL_SUCCESS);
wolfSSL 0:1239e9b70ca2 4615 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 4616
wolfSSL 0:1239e9b70ca2 4617 default:
wolfSSL 0:1239e9b70ca2 4618 CYASSL_MSG("Unknown connect state ERROR");
wolfSSL 0:1239e9b70ca2 4619 return SSL_FATAL_ERROR; /* unknown connect state */
wolfSSL 0:1239e9b70ca2 4620 }
wolfSSL 0:1239e9b70ca2 4621 }
wolfSSL 0:1239e9b70ca2 4622
wolfSSL 0:1239e9b70ca2 4623 #endif /* NO_CYASSL_CLIENT */
wolfSSL 0:1239e9b70ca2 4624
wolfSSL 0:1239e9b70ca2 4625
wolfSSL 0:1239e9b70ca2 4626 /* server only parts */
wolfSSL 0:1239e9b70ca2 4627 #ifndef NO_CYASSL_SERVER
wolfSSL 0:1239e9b70ca2 4628
wolfSSL 0:1239e9b70ca2 4629 #ifndef NO_OLD_TLS
wolfSSL 0:1239e9b70ca2 4630 CYASSL_METHOD* CyaSSLv3_server_method(void)
wolfSSL 0:1239e9b70ca2 4631 {
wolfSSL 0:1239e9b70ca2 4632 CYASSL_METHOD* method =
wolfSSL 0:1239e9b70ca2 4633 (CYASSL_METHOD*) XMALLOC(sizeof(CYASSL_METHOD), 0,
wolfSSL 0:1239e9b70ca2 4634 DYNAMIC_TYPE_METHOD);
wolfSSL 0:1239e9b70ca2 4635 CYASSL_ENTER("SSLv3_server_method");
wolfSSL 0:1239e9b70ca2 4636 if (method) {
wolfSSL 0:1239e9b70ca2 4637 InitSSL_Method(method, MakeSSLv3());
wolfSSL 0:1239e9b70ca2 4638 method->side = CYASSL_SERVER_END;
wolfSSL 0:1239e9b70ca2 4639 }
wolfSSL 0:1239e9b70ca2 4640 return method;
wolfSSL 0:1239e9b70ca2 4641 }
wolfSSL 0:1239e9b70ca2 4642 #endif
wolfSSL 0:1239e9b70ca2 4643
wolfSSL 0:1239e9b70ca2 4644
wolfSSL 0:1239e9b70ca2 4645 #ifdef CYASSL_DTLS
wolfSSL 0:1239e9b70ca2 4646 CYASSL_METHOD* CyaDTLSv1_server_method(void)
wolfSSL 0:1239e9b70ca2 4647 {
wolfSSL 0:1239e9b70ca2 4648 CYASSL_METHOD* method =
wolfSSL 0:1239e9b70ca2 4649 (CYASSL_METHOD*) XMALLOC(sizeof(CYASSL_METHOD), 0,
wolfSSL 0:1239e9b70ca2 4650 DYNAMIC_TYPE_METHOD);
wolfSSL 0:1239e9b70ca2 4651 CYASSL_ENTER("DTLSv1_server_method");
wolfSSL 0:1239e9b70ca2 4652 if (method) {
wolfSSL 0:1239e9b70ca2 4653 InitSSL_Method(method, MakeDTLSv1());
wolfSSL 0:1239e9b70ca2 4654 method->side = CYASSL_SERVER_END;
wolfSSL 0:1239e9b70ca2 4655 }
wolfSSL 0:1239e9b70ca2 4656 return method;
wolfSSL 0:1239e9b70ca2 4657 }
wolfSSL 0:1239e9b70ca2 4658
wolfSSL 0:1239e9b70ca2 4659 CYASSL_METHOD* CyaDTLSv1_2_server_method(void)
wolfSSL 0:1239e9b70ca2 4660 {
wolfSSL 0:1239e9b70ca2 4661 CYASSL_METHOD* method =
wolfSSL 0:1239e9b70ca2 4662 (CYASSL_METHOD*) XMALLOC(sizeof(CYASSL_METHOD), 0,
wolfSSL 0:1239e9b70ca2 4663 DYNAMIC_TYPE_METHOD);
wolfSSL 0:1239e9b70ca2 4664 CYASSL_ENTER("DTLSv1_2_server_method");
wolfSSL 0:1239e9b70ca2 4665 if (method) {
wolfSSL 0:1239e9b70ca2 4666 InitSSL_Method(method, MakeDTLSv1_2());
wolfSSL 0:1239e9b70ca2 4667 method->side = CYASSL_SERVER_END;
wolfSSL 0:1239e9b70ca2 4668 }
wolfSSL 0:1239e9b70ca2 4669 return method;
wolfSSL 0:1239e9b70ca2 4670 }
wolfSSL 0:1239e9b70ca2 4671 #endif
wolfSSL 0:1239e9b70ca2 4672
wolfSSL 0:1239e9b70ca2 4673
wolfSSL 0:1239e9b70ca2 4674 int CyaSSL_accept(CYASSL* ssl)
wolfSSL 0:1239e9b70ca2 4675 {
wolfSSL 0:1239e9b70ca2 4676 byte havePSK = 0;
wolfSSL 0:1239e9b70ca2 4677 CYASSL_ENTER("SSL_accept()");
wolfSSL 0:1239e9b70ca2 4678
wolfSSL 0:1239e9b70ca2 4679 #ifdef HAVE_ERRNO_H
wolfSSL 0:1239e9b70ca2 4680 errno = 0;
wolfSSL 0:1239e9b70ca2 4681 #endif
wolfSSL 0:1239e9b70ca2 4682
wolfSSL 0:1239e9b70ca2 4683 #ifndef NO_PSK
wolfSSL 0:1239e9b70ca2 4684 havePSK = ssl->options.havePSK;
wolfSSL 0:1239e9b70ca2 4685 #endif
wolfSSL 0:1239e9b70ca2 4686 (void)havePSK;
wolfSSL 0:1239e9b70ca2 4687
wolfSSL 0:1239e9b70ca2 4688 if (ssl->options.side != CYASSL_SERVER_END) {
wolfSSL 0:1239e9b70ca2 4689 CYASSL_ERROR(ssl->error = SIDE_ERROR);
wolfSSL 0:1239e9b70ca2 4690 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 4691 }
wolfSSL 0:1239e9b70ca2 4692
wolfSSL 0:1239e9b70ca2 4693 #ifndef NO_CERTS
wolfSSL 0:1239e9b70ca2 4694 /* in case used set_accept_state after init */
wolfSSL 0:1239e9b70ca2 4695 if (!havePSK && (ssl->buffers.certificate.buffer == NULL ||
wolfSSL 0:1239e9b70ca2 4696 ssl->buffers.key.buffer == NULL)) {
wolfSSL 0:1239e9b70ca2 4697 CYASSL_MSG("accept error: don't have server cert and key");
wolfSSL 0:1239e9b70ca2 4698 ssl->error = NO_PRIVATE_KEY;
wolfSSL 0:1239e9b70ca2 4699 CYASSL_ERROR(ssl->error);
wolfSSL 0:1239e9b70ca2 4700 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 4701 }
wolfSSL 0:1239e9b70ca2 4702 #endif
wolfSSL 0:1239e9b70ca2 4703
wolfSSL 0:1239e9b70ca2 4704 #ifdef HAVE_ECC
wolfSSL 0:1239e9b70ca2 4705 /* in case used set_accept_state after init */
wolfSSL 0:1239e9b70ca2 4706 if (ssl->eccTempKeyPresent == 0) {
wolfSSL 0:1239e9b70ca2 4707 if (ecc_make_key(ssl->rng, ssl->eccTempKeySz,
wolfSSL 0:1239e9b70ca2 4708 ssl->eccTempKey) != 0) {
wolfSSL 0:1239e9b70ca2 4709 ssl->error = ECC_MAKEKEY_ERROR;
wolfSSL 0:1239e9b70ca2 4710 CYASSL_ERROR(ssl->error);
wolfSSL 0:1239e9b70ca2 4711 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 4712 }
wolfSSL 0:1239e9b70ca2 4713 ssl->eccTempKeyPresent = 1;
wolfSSL 0:1239e9b70ca2 4714 }
wolfSSL 0:1239e9b70ca2 4715 #endif
wolfSSL 0:1239e9b70ca2 4716
wolfSSL 0:1239e9b70ca2 4717 #ifdef CYASSL_DTLS
wolfSSL 0:1239e9b70ca2 4718 if (ssl->version.major == DTLS_MAJOR) {
wolfSSL 0:1239e9b70ca2 4719 ssl->options.dtls = 1;
wolfSSL 0:1239e9b70ca2 4720 ssl->options.tls = 1;
wolfSSL 0:1239e9b70ca2 4721 ssl->options.tls1_1 = 1;
wolfSSL 0:1239e9b70ca2 4722
wolfSSL 0:1239e9b70ca2 4723 if (DtlsPoolInit(ssl) != 0) {
wolfSSL 0:1239e9b70ca2 4724 ssl->error = MEMORY_ERROR;
wolfSSL 0:1239e9b70ca2 4725 CYASSL_ERROR(ssl->error);
wolfSSL 0:1239e9b70ca2 4726 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 4727 }
wolfSSL 0:1239e9b70ca2 4728 }
wolfSSL 0:1239e9b70ca2 4729 #endif
wolfSSL 0:1239e9b70ca2 4730
wolfSSL 0:1239e9b70ca2 4731 if (ssl->buffers.outputBuffer.length > 0) {
wolfSSL 0:1239e9b70ca2 4732 if ( (ssl->error = SendBuffered(ssl)) == 0) {
wolfSSL 0:1239e9b70ca2 4733 ssl->options.acceptState++;
wolfSSL 0:1239e9b70ca2 4734 CYASSL_MSG("accept state: Advanced from buffered send");
wolfSSL 0:1239e9b70ca2 4735 }
wolfSSL 0:1239e9b70ca2 4736 else {
wolfSSL 0:1239e9b70ca2 4737 CYASSL_ERROR(ssl->error);
wolfSSL 0:1239e9b70ca2 4738 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 4739 }
wolfSSL 0:1239e9b70ca2 4740 }
wolfSSL 0:1239e9b70ca2 4741
wolfSSL 0:1239e9b70ca2 4742 switch (ssl->options.acceptState) {
wolfSSL 0:1239e9b70ca2 4743
wolfSSL 0:1239e9b70ca2 4744 case ACCEPT_BEGIN :
wolfSSL 0:1239e9b70ca2 4745 /* get response */
wolfSSL 0:1239e9b70ca2 4746 while (ssl->options.clientState < CLIENT_HELLO_COMPLETE)
wolfSSL 0:1239e9b70ca2 4747 if ( (ssl->error = ProcessReply(ssl)) < 0) {
wolfSSL 0:1239e9b70ca2 4748 CYASSL_ERROR(ssl->error);
wolfSSL 0:1239e9b70ca2 4749 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 4750 }
wolfSSL 0:1239e9b70ca2 4751 ssl->options.acceptState = ACCEPT_CLIENT_HELLO_DONE;
wolfSSL 0:1239e9b70ca2 4752 CYASSL_MSG("accept state ACCEPT_CLIENT_HELLO_DONE");
wolfSSL 0:1239e9b70ca2 4753
wolfSSL 0:1239e9b70ca2 4754 case ACCEPT_CLIENT_HELLO_DONE :
wolfSSL 0:1239e9b70ca2 4755 #ifdef CYASSL_DTLS
wolfSSL 0:1239e9b70ca2 4756 if (ssl->options.dtls)
wolfSSL 0:1239e9b70ca2 4757 if ( (ssl->error = SendHelloVerifyRequest(ssl)) != 0) {
wolfSSL 0:1239e9b70ca2 4758 CYASSL_ERROR(ssl->error);
wolfSSL 0:1239e9b70ca2 4759 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 4760 }
wolfSSL 0:1239e9b70ca2 4761 #endif
wolfSSL 0:1239e9b70ca2 4762 ssl->options.acceptState = HELLO_VERIFY_SENT;
wolfSSL 0:1239e9b70ca2 4763 CYASSL_MSG("accept state HELLO_VERIFY_SENT");
wolfSSL 0:1239e9b70ca2 4764
wolfSSL 0:1239e9b70ca2 4765 case HELLO_VERIFY_SENT:
wolfSSL 0:1239e9b70ca2 4766 #ifdef CYASSL_DTLS
wolfSSL 0:1239e9b70ca2 4767 if (ssl->options.dtls) {
wolfSSL 0:1239e9b70ca2 4768 ssl->options.clientState = NULL_STATE; /* get again */
wolfSSL 0:1239e9b70ca2 4769 /* re-init hashes, exclude first hello and verify request */
wolfSSL 0:1239e9b70ca2 4770 #ifndef NO_OLD_TLS
wolfSSL 0:1239e9b70ca2 4771 InitMd5(&ssl->hashMd5);
wolfSSL 0:1239e9b70ca2 4772 if ( (ssl->error = InitSha(&ssl->hashSha)) != 0) {
wolfSSL 0:1239e9b70ca2 4773 CYASSL_ERROR(ssl->error);
wolfSSL 0:1239e9b70ca2 4774 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 4775 }
wolfSSL 0:1239e9b70ca2 4776 #endif
wolfSSL 0:1239e9b70ca2 4777 if (IsAtLeastTLSv1_2(ssl)) {
wolfSSL 0:1239e9b70ca2 4778 #ifndef NO_SHA256
wolfSSL 0:1239e9b70ca2 4779 if ( (ssl->error =
wolfSSL 0:1239e9b70ca2 4780 InitSha256(&ssl->hashSha256)) != 0) {
wolfSSL 0:1239e9b70ca2 4781 CYASSL_ERROR(ssl->error);
wolfSSL 0:1239e9b70ca2 4782 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 4783 }
wolfSSL 0:1239e9b70ca2 4784 #endif
wolfSSL 0:1239e9b70ca2 4785 #ifdef CYASSL_SHA384
wolfSSL 0:1239e9b70ca2 4786 if ( (ssl->error =
wolfSSL 0:1239e9b70ca2 4787 InitSha384(&ssl->hashSha384)) != 0) {
wolfSSL 0:1239e9b70ca2 4788 CYASSL_ERROR(ssl->error);
wolfSSL 0:1239e9b70ca2 4789 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 4790 }
wolfSSL 0:1239e9b70ca2 4791 #endif
wolfSSL 0:1239e9b70ca2 4792 }
wolfSSL 0:1239e9b70ca2 4793
wolfSSL 0:1239e9b70ca2 4794 while (ssl->options.clientState < CLIENT_HELLO_COMPLETE)
wolfSSL 0:1239e9b70ca2 4795 if ( (ssl->error = ProcessReply(ssl)) < 0) {
wolfSSL 0:1239e9b70ca2 4796 CYASSL_ERROR(ssl->error);
wolfSSL 0:1239e9b70ca2 4797 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 4798 }
wolfSSL 0:1239e9b70ca2 4799 }
wolfSSL 0:1239e9b70ca2 4800 #endif
wolfSSL 0:1239e9b70ca2 4801 ssl->options.acceptState = ACCEPT_FIRST_REPLY_DONE;
wolfSSL 0:1239e9b70ca2 4802 CYASSL_MSG("accept state ACCEPT_FIRST_REPLY_DONE");
wolfSSL 0:1239e9b70ca2 4803
wolfSSL 0:1239e9b70ca2 4804 case ACCEPT_FIRST_REPLY_DONE :
wolfSSL 0:1239e9b70ca2 4805 if ( (ssl->error = SendServerHello(ssl)) != 0) {
wolfSSL 0:1239e9b70ca2 4806 CYASSL_ERROR(ssl->error);
wolfSSL 0:1239e9b70ca2 4807 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 4808 }
wolfSSL 0:1239e9b70ca2 4809 ssl->options.acceptState = SERVER_HELLO_SENT;
wolfSSL 0:1239e9b70ca2 4810 CYASSL_MSG("accept state SERVER_HELLO_SENT");
wolfSSL 0:1239e9b70ca2 4811
wolfSSL 0:1239e9b70ca2 4812 case SERVER_HELLO_SENT :
wolfSSL 0:1239e9b70ca2 4813 #ifndef NO_CERTS
wolfSSL 0:1239e9b70ca2 4814 if (!ssl->options.resuming)
wolfSSL 0:1239e9b70ca2 4815 if ( (ssl->error = SendCertificate(ssl)) != 0) {
wolfSSL 0:1239e9b70ca2 4816 CYASSL_ERROR(ssl->error);
wolfSSL 0:1239e9b70ca2 4817 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 4818 }
wolfSSL 0:1239e9b70ca2 4819 #endif
wolfSSL 0:1239e9b70ca2 4820 ssl->options.acceptState = CERT_SENT;
wolfSSL 0:1239e9b70ca2 4821 CYASSL_MSG("accept state CERT_SENT");
wolfSSL 0:1239e9b70ca2 4822
wolfSSL 0:1239e9b70ca2 4823 case CERT_SENT :
wolfSSL 0:1239e9b70ca2 4824 if (!ssl->options.resuming)
wolfSSL 0:1239e9b70ca2 4825 if ( (ssl->error = SendServerKeyExchange(ssl)) != 0) {
wolfSSL 0:1239e9b70ca2 4826 CYASSL_ERROR(ssl->error);
wolfSSL 0:1239e9b70ca2 4827 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 4828 }
wolfSSL 0:1239e9b70ca2 4829 ssl->options.acceptState = KEY_EXCHANGE_SENT;
wolfSSL 0:1239e9b70ca2 4830 CYASSL_MSG("accept state KEY_EXCHANGE_SENT");
wolfSSL 0:1239e9b70ca2 4831
wolfSSL 0:1239e9b70ca2 4832 case KEY_EXCHANGE_SENT :
wolfSSL 0:1239e9b70ca2 4833 #ifndef NO_CERTS
wolfSSL 0:1239e9b70ca2 4834 if (!ssl->options.resuming)
wolfSSL 0:1239e9b70ca2 4835 if (ssl->options.verifyPeer)
wolfSSL 0:1239e9b70ca2 4836 if ( (ssl->error = SendCertificateRequest(ssl)) != 0) {
wolfSSL 0:1239e9b70ca2 4837 CYASSL_ERROR(ssl->error);
wolfSSL 0:1239e9b70ca2 4838 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 4839 }
wolfSSL 0:1239e9b70ca2 4840 #endif
wolfSSL 0:1239e9b70ca2 4841 ssl->options.acceptState = CERT_REQ_SENT;
wolfSSL 0:1239e9b70ca2 4842 CYASSL_MSG("accept state CERT_REQ_SENT");
wolfSSL 0:1239e9b70ca2 4843
wolfSSL 0:1239e9b70ca2 4844 case CERT_REQ_SENT :
wolfSSL 0:1239e9b70ca2 4845 if (!ssl->options.resuming)
wolfSSL 0:1239e9b70ca2 4846 if ( (ssl->error = SendServerHelloDone(ssl)) != 0) {
wolfSSL 0:1239e9b70ca2 4847 CYASSL_ERROR(ssl->error);
wolfSSL 0:1239e9b70ca2 4848 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 4849 }
wolfSSL 0:1239e9b70ca2 4850 ssl->options.acceptState = SERVER_HELLO_DONE;
wolfSSL 0:1239e9b70ca2 4851 CYASSL_MSG("accept state SERVER_HELLO_DONE");
wolfSSL 0:1239e9b70ca2 4852
wolfSSL 0:1239e9b70ca2 4853 case SERVER_HELLO_DONE :
wolfSSL 0:1239e9b70ca2 4854 if (!ssl->options.resuming) {
wolfSSL 0:1239e9b70ca2 4855 while (ssl->options.clientState < CLIENT_FINISHED_COMPLETE)
wolfSSL 0:1239e9b70ca2 4856 if ( (ssl->error = ProcessReply(ssl)) < 0) {
wolfSSL 0:1239e9b70ca2 4857 CYASSL_ERROR(ssl->error);
wolfSSL 0:1239e9b70ca2 4858 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 4859 }
wolfSSL 0:1239e9b70ca2 4860 }
wolfSSL 0:1239e9b70ca2 4861 ssl->options.acceptState = ACCEPT_SECOND_REPLY_DONE;
wolfSSL 0:1239e9b70ca2 4862 CYASSL_MSG("accept state ACCEPT_SECOND_REPLY_DONE");
wolfSSL 0:1239e9b70ca2 4863
wolfSSL 0:1239e9b70ca2 4864 case ACCEPT_SECOND_REPLY_DONE :
wolfSSL 0:1239e9b70ca2 4865 if ( (ssl->error = SendChangeCipher(ssl)) != 0) {
wolfSSL 0:1239e9b70ca2 4866 CYASSL_ERROR(ssl->error);
wolfSSL 0:1239e9b70ca2 4867 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 4868 }
wolfSSL 0:1239e9b70ca2 4869 ssl->options.acceptState = CHANGE_CIPHER_SENT;
wolfSSL 0:1239e9b70ca2 4870 CYASSL_MSG("accept state CHANGE_CIPHER_SENT");
wolfSSL 0:1239e9b70ca2 4871
wolfSSL 0:1239e9b70ca2 4872 case CHANGE_CIPHER_SENT :
wolfSSL 0:1239e9b70ca2 4873 if ( (ssl->error = SendFinished(ssl)) != 0) {
wolfSSL 0:1239e9b70ca2 4874 CYASSL_ERROR(ssl->error);
wolfSSL 0:1239e9b70ca2 4875 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 4876 }
wolfSSL 0:1239e9b70ca2 4877
wolfSSL 0:1239e9b70ca2 4878 ssl->options.acceptState = ACCEPT_FINISHED_DONE;
wolfSSL 0:1239e9b70ca2 4879 CYASSL_MSG("accept state ACCEPT_FINISHED_DONE");
wolfSSL 0:1239e9b70ca2 4880
wolfSSL 0:1239e9b70ca2 4881 case ACCEPT_FINISHED_DONE :
wolfSSL 0:1239e9b70ca2 4882 if (ssl->options.resuming)
wolfSSL 0:1239e9b70ca2 4883 while (ssl->options.clientState < CLIENT_FINISHED_COMPLETE)
wolfSSL 0:1239e9b70ca2 4884 if ( (ssl->error = ProcessReply(ssl)) < 0) {
wolfSSL 0:1239e9b70ca2 4885 CYASSL_ERROR(ssl->error);
wolfSSL 0:1239e9b70ca2 4886 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 4887 }
wolfSSL 0:1239e9b70ca2 4888
wolfSSL 0:1239e9b70ca2 4889 ssl->options.acceptState = ACCEPT_THIRD_REPLY_DONE;
wolfSSL 0:1239e9b70ca2 4890 CYASSL_MSG("accept state ACCEPT_THIRD_REPLY_DONE");
wolfSSL 0:1239e9b70ca2 4891
wolfSSL 0:1239e9b70ca2 4892 case ACCEPT_THIRD_REPLY_DONE :
wolfSSL 0:1239e9b70ca2 4893 FreeHandshakeResources(ssl);
wolfSSL 0:1239e9b70ca2 4894 CYASSL_LEAVE("SSL_accept()", SSL_SUCCESS);
wolfSSL 0:1239e9b70ca2 4895 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 4896
wolfSSL 0:1239e9b70ca2 4897 default :
wolfSSL 0:1239e9b70ca2 4898 CYASSL_MSG("Unknown accept state ERROR");
wolfSSL 0:1239e9b70ca2 4899 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 4900 }
wolfSSL 0:1239e9b70ca2 4901 }
wolfSSL 0:1239e9b70ca2 4902
wolfSSL 0:1239e9b70ca2 4903 #endif /* NO_CYASSL_SERVER */
wolfSSL 0:1239e9b70ca2 4904
wolfSSL 0:1239e9b70ca2 4905
wolfSSL 0:1239e9b70ca2 4906 int CyaSSL_Cleanup(void)
wolfSSL 0:1239e9b70ca2 4907 {
wolfSSL 0:1239e9b70ca2 4908 int ret = SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 4909 int release = 0;
wolfSSL 0:1239e9b70ca2 4910
wolfSSL 0:1239e9b70ca2 4911 CYASSL_ENTER("CyaSSL_Cleanup");
wolfSSL 0:1239e9b70ca2 4912
wolfSSL 0:1239e9b70ca2 4913 if (initRefCount == 0)
wolfSSL 0:1239e9b70ca2 4914 return ret; /* possibly no init yet, but not failure either way */
wolfSSL 0:1239e9b70ca2 4915
wolfSSL 0:1239e9b70ca2 4916 if (LockMutex(&count_mutex) != 0) {
wolfSSL 0:1239e9b70ca2 4917 CYASSL_MSG("Bad Lock Mutex count");
wolfSSL 0:1239e9b70ca2 4918 return BAD_MUTEX_E;
wolfSSL 0:1239e9b70ca2 4919 }
wolfSSL 0:1239e9b70ca2 4920
wolfSSL 0:1239e9b70ca2 4921 release = initRefCount-- == 1;
wolfSSL 0:1239e9b70ca2 4922 if (initRefCount < 0)
wolfSSL 0:1239e9b70ca2 4923 initRefCount = 0;
wolfSSL 0:1239e9b70ca2 4924
wolfSSL 0:1239e9b70ca2 4925 UnLockMutex(&count_mutex);
wolfSSL 0:1239e9b70ca2 4926
wolfSSL 0:1239e9b70ca2 4927 if (!release)
wolfSSL 0:1239e9b70ca2 4928 return ret;
wolfSSL 0:1239e9b70ca2 4929
wolfSSL 0:1239e9b70ca2 4930 #ifndef NO_SESSION_CACHE
wolfSSL 0:1239e9b70ca2 4931 if (FreeMutex(&session_mutex) != 0)
wolfSSL 0:1239e9b70ca2 4932 ret = BAD_MUTEX_E;
wolfSSL 0:1239e9b70ca2 4933 #endif
wolfSSL 0:1239e9b70ca2 4934 if (FreeMutex(&count_mutex) != 0)
wolfSSL 0:1239e9b70ca2 4935 ret = BAD_MUTEX_E;
wolfSSL 0:1239e9b70ca2 4936
wolfSSL 0:1239e9b70ca2 4937 #if defined(HAVE_ECC) && defined(FP_ECC)
wolfSSL 0:1239e9b70ca2 4938 ecc_fp_free();
wolfSSL 0:1239e9b70ca2 4939 #endif
wolfSSL 0:1239e9b70ca2 4940
wolfSSL 0:1239e9b70ca2 4941 return ret;
wolfSSL 0:1239e9b70ca2 4942 }
wolfSSL 0:1239e9b70ca2 4943
wolfSSL 0:1239e9b70ca2 4944
wolfSSL 0:1239e9b70ca2 4945 #ifndef NO_SESSION_CACHE
wolfSSL 0:1239e9b70ca2 4946
wolfSSL 0:1239e9b70ca2 4947 #ifndef NO_MD5
wolfSSL 0:1239e9b70ca2 4948
wolfSSL 0:1239e9b70ca2 4949 /* some session IDs aren't random afterall, let's make them random */
wolfSSL 0:1239e9b70ca2 4950
wolfSSL 0:1239e9b70ca2 4951 static INLINE word32 HashSession(const byte* sessionID, word32 len, int* error)
wolfSSL 0:1239e9b70ca2 4952 {
wolfSSL 0:1239e9b70ca2 4953 byte digest[MD5_DIGEST_SIZE];
wolfSSL 0:1239e9b70ca2 4954 Md5 md5;
wolfSSL 0:1239e9b70ca2 4955
wolfSSL 0:1239e9b70ca2 4956 (void)error;
wolfSSL 0:1239e9b70ca2 4957
wolfSSL 0:1239e9b70ca2 4958 InitMd5(&md5);
wolfSSL 0:1239e9b70ca2 4959 Md5Update(&md5, sessionID, len);
wolfSSL 0:1239e9b70ca2 4960 Md5Final(&md5, digest);
wolfSSL 0:1239e9b70ca2 4961
wolfSSL 0:1239e9b70ca2 4962 return MakeWordFromHash(digest);
wolfSSL 0:1239e9b70ca2 4963 }
wolfSSL 0:1239e9b70ca2 4964
wolfSSL 0:1239e9b70ca2 4965 #elif !defined(NO_SHA)
wolfSSL 0:1239e9b70ca2 4966
wolfSSL 0:1239e9b70ca2 4967 /* 0 on failure */
wolfSSL 0:1239e9b70ca2 4968 static INLINE word32 HashSession(const byte* sessionID, word32 len, int* error)
wolfSSL 0:1239e9b70ca2 4969 {
wolfSSL 0:1239e9b70ca2 4970 byte digest[SHA_DIGEST_SIZE];
wolfSSL 0:1239e9b70ca2 4971 Sha sha;
wolfSSL 0:1239e9b70ca2 4972 int ret = 0;
wolfSSL 0:1239e9b70ca2 4973
wolfSSL 0:1239e9b70ca2 4974 ret = InitSha(&sha);
wolfSSL 0:1239e9b70ca2 4975 if (ret != 0) {
wolfSSL 0:1239e9b70ca2 4976 *error = ret;
wolfSSL 0:1239e9b70ca2 4977 return 0;
wolfSSL 0:1239e9b70ca2 4978 }
wolfSSL 0:1239e9b70ca2 4979 ShaUpdate(&sha, sessionID, len);
wolfSSL 0:1239e9b70ca2 4980 ShaFinal(&sha, digest);
wolfSSL 0:1239e9b70ca2 4981
wolfSSL 0:1239e9b70ca2 4982 return MakeWordFromHash(digest);
wolfSSL 0:1239e9b70ca2 4983 }
wolfSSL 0:1239e9b70ca2 4984
wolfSSL 0:1239e9b70ca2 4985 #elif !defined(NO_SHA256)
wolfSSL 0:1239e9b70ca2 4986
wolfSSL 0:1239e9b70ca2 4987 static INLINE word32 HashSession(const byte* sessionID, word32 len, int* error)
wolfSSL 0:1239e9b70ca2 4988 {
wolfSSL 0:1239e9b70ca2 4989 byte digest[SHA256_DIGEST_SIZE];
wolfSSL 0:1239e9b70ca2 4990 Sha256 sha256;
wolfSSL 0:1239e9b70ca2 4991 int ret;
wolfSSL 0:1239e9b70ca2 4992
wolfSSL 0:1239e9b70ca2 4993 ret = InitSha256(&sha256);
wolfSSL 0:1239e9b70ca2 4994 if (ret != 0) {
wolfSSL 0:1239e9b70ca2 4995 *error = ret;
wolfSSL 0:1239e9b70ca2 4996 return 0;
wolfSSL 0:1239e9b70ca2 4997 }
wolfSSL 0:1239e9b70ca2 4998
wolfSSL 0:1239e9b70ca2 4999 ret = Sha256Update(&sha256, sessionID, len);
wolfSSL 0:1239e9b70ca2 5000 if (ret != 0) {
wolfSSL 0:1239e9b70ca2 5001 *error = ret;
wolfSSL 0:1239e9b70ca2 5002 return 0;
wolfSSL 0:1239e9b70ca2 5003 }
wolfSSL 0:1239e9b70ca2 5004
wolfSSL 0:1239e9b70ca2 5005 ret = Sha256Final(&sha256, digest);
wolfSSL 0:1239e9b70ca2 5006 if (ret != 0) {
wolfSSL 0:1239e9b70ca2 5007 *error = ret;
wolfSSL 0:1239e9b70ca2 5008 return 0;
wolfSSL 0:1239e9b70ca2 5009 }
wolfSSL 0:1239e9b70ca2 5010
wolfSSL 0:1239e9b70ca2 5011 return MakeWordFromHash(digest);
wolfSSL 0:1239e9b70ca2 5012 }
wolfSSL 0:1239e9b70ca2 5013
wolfSSL 0:1239e9b70ca2 5014 #else
wolfSSL 0:1239e9b70ca2 5015
wolfSSL 0:1239e9b70ca2 5016 #error "We need a digest to hash the session IDs"
wolfSSL 0:1239e9b70ca2 5017
wolfSSL 0:1239e9b70ca2 5018 #endif /* NO_MD5 */
wolfSSL 0:1239e9b70ca2 5019
wolfSSL 0:1239e9b70ca2 5020
wolfSSL 0:1239e9b70ca2 5021 void CyaSSL_flush_sessions(CYASSL_CTX* ctx, long tm)
wolfSSL 0:1239e9b70ca2 5022 {
wolfSSL 0:1239e9b70ca2 5023 /* static table now, no flusing needed */
wolfSSL 0:1239e9b70ca2 5024 (void)ctx;
wolfSSL 0:1239e9b70ca2 5025 (void)tm;
wolfSSL 0:1239e9b70ca2 5026 }
wolfSSL 0:1239e9b70ca2 5027
wolfSSL 0:1239e9b70ca2 5028
wolfSSL 0:1239e9b70ca2 5029 /* set ssl session timeout in seconds */
wolfSSL 0:1239e9b70ca2 5030 int CyaSSL_set_timeout(CYASSL* ssl, unsigned int to)
wolfSSL 0:1239e9b70ca2 5031 {
wolfSSL 0:1239e9b70ca2 5032 if (ssl == NULL)
wolfSSL 0:1239e9b70ca2 5033 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 5034
wolfSSL 0:1239e9b70ca2 5035 ssl->timeout = to;
wolfSSL 0:1239e9b70ca2 5036
wolfSSL 0:1239e9b70ca2 5037 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 5038 }
wolfSSL 0:1239e9b70ca2 5039
wolfSSL 0:1239e9b70ca2 5040
wolfSSL 0:1239e9b70ca2 5041 /* set ctx session timeout in seconds */
wolfSSL 0:1239e9b70ca2 5042 int CyaSSL_CTX_set_timeout(CYASSL_CTX* ctx, unsigned int to)
wolfSSL 0:1239e9b70ca2 5043 {
wolfSSL 0:1239e9b70ca2 5044 if (ctx == NULL)
wolfSSL 0:1239e9b70ca2 5045 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 5046
wolfSSL 0:1239e9b70ca2 5047 ctx->timeout = to;
wolfSSL 0:1239e9b70ca2 5048
wolfSSL 0:1239e9b70ca2 5049 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 5050 }
wolfSSL 0:1239e9b70ca2 5051
wolfSSL 0:1239e9b70ca2 5052
wolfSSL 0:1239e9b70ca2 5053 #ifndef NO_CLIENT_CACHE
wolfSSL 0:1239e9b70ca2 5054
wolfSSL 0:1239e9b70ca2 5055 /* Get Session from Client cache based on id/len, return NULL on failure */
wolfSSL 0:1239e9b70ca2 5056 CYASSL_SESSION* GetSessionClient(CYASSL* ssl, const byte* id, int len)
wolfSSL 0:1239e9b70ca2 5057 {
wolfSSL 0:1239e9b70ca2 5058 CYASSL_SESSION* ret = NULL;
wolfSSL 0:1239e9b70ca2 5059 word32 row;
wolfSSL 0:1239e9b70ca2 5060 int idx;
wolfSSL 0:1239e9b70ca2 5061 int count;
wolfSSL 0:1239e9b70ca2 5062 int error = 0;
wolfSSL 0:1239e9b70ca2 5063
wolfSSL 0:1239e9b70ca2 5064 CYASSL_ENTER("GetSessionClient");
wolfSSL 0:1239e9b70ca2 5065
wolfSSL 0:1239e9b70ca2 5066 if (ssl->options.side == CYASSL_SERVER_END)
wolfSSL 0:1239e9b70ca2 5067 return NULL;
wolfSSL 0:1239e9b70ca2 5068
wolfSSL 0:1239e9b70ca2 5069 len = min(SERVER_ID_LEN, (word32)len);
wolfSSL 0:1239e9b70ca2 5070 row = HashSession(id, len, &error) % SESSION_ROWS;
wolfSSL 0:1239e9b70ca2 5071 if (error != 0) {
wolfSSL 0:1239e9b70ca2 5072 CYASSL_MSG("Hash session failed");
wolfSSL 0:1239e9b70ca2 5073 return NULL;
wolfSSL 0:1239e9b70ca2 5074 }
wolfSSL 0:1239e9b70ca2 5075
wolfSSL 0:1239e9b70ca2 5076 if (LockMutex(&session_mutex) != 0) {
wolfSSL 0:1239e9b70ca2 5077 CYASSL_MSG("Lock session mutex failed");
wolfSSL 0:1239e9b70ca2 5078 return NULL;
wolfSSL 0:1239e9b70ca2 5079 }
wolfSSL 0:1239e9b70ca2 5080
wolfSSL 0:1239e9b70ca2 5081 /* start from most recently used */
wolfSSL 0:1239e9b70ca2 5082 count = min((word32)ClientCache[row].totalCount, SESSIONS_PER_ROW);
wolfSSL 0:1239e9b70ca2 5083 idx = ClientCache[row].nextIdx - 1;
wolfSSL 0:1239e9b70ca2 5084 if (idx < 0)
wolfSSL 0:1239e9b70ca2 5085 idx = SESSIONS_PER_ROW - 1; /* if back to front, the previous was end */
wolfSSL 0:1239e9b70ca2 5086
wolfSSL 0:1239e9b70ca2 5087 for (; count > 0; --count, idx = idx ? idx - 1 : SESSIONS_PER_ROW - 1) {
wolfSSL 0:1239e9b70ca2 5088 CYASSL_SESSION* current;
wolfSSL 0:1239e9b70ca2 5089 ClientSession clSess;
wolfSSL 0:1239e9b70ca2 5090
wolfSSL 0:1239e9b70ca2 5091 if (idx >= SESSIONS_PER_ROW || idx < 0) { /* sanity check */
wolfSSL 0:1239e9b70ca2 5092 CYASSL_MSG("Bad idx");
wolfSSL 0:1239e9b70ca2 5093 break;
wolfSSL 0:1239e9b70ca2 5094 }
wolfSSL 0:1239e9b70ca2 5095
wolfSSL 0:1239e9b70ca2 5096 clSess = ClientCache[row].Clients[idx];
wolfSSL 0:1239e9b70ca2 5097
wolfSSL 0:1239e9b70ca2 5098 current = &SessionCache[clSess.serverRow].Sessions[clSess.serverIdx];
wolfSSL 0:1239e9b70ca2 5099 if (XMEMCMP(current->serverID, id, len) == 0) {
wolfSSL 0:1239e9b70ca2 5100 CYASSL_MSG("Found a serverid match for client");
wolfSSL 0:1239e9b70ca2 5101 if (LowResTimer() < (current->bornOn + current->timeout)) {
wolfSSL 0:1239e9b70ca2 5102 CYASSL_MSG("Session valid");
wolfSSL 0:1239e9b70ca2 5103 ret = current;
wolfSSL 0:1239e9b70ca2 5104 break;
wolfSSL 0:1239e9b70ca2 5105 } else {
wolfSSL 0:1239e9b70ca2 5106 CYASSL_MSG("Session timed out"); /* could have more for id */
wolfSSL 0:1239e9b70ca2 5107 }
wolfSSL 0:1239e9b70ca2 5108 } else {
wolfSSL 0:1239e9b70ca2 5109 CYASSL_MSG("ServerID not a match from client table");
wolfSSL 0:1239e9b70ca2 5110 }
wolfSSL 0:1239e9b70ca2 5111 }
wolfSSL 0:1239e9b70ca2 5112
wolfSSL 0:1239e9b70ca2 5113 UnLockMutex(&session_mutex);
wolfSSL 0:1239e9b70ca2 5114
wolfSSL 0:1239e9b70ca2 5115 return ret;
wolfSSL 0:1239e9b70ca2 5116 }
wolfSSL 0:1239e9b70ca2 5117
wolfSSL 0:1239e9b70ca2 5118 #endif /* NO_CLIENT_CACHE */
wolfSSL 0:1239e9b70ca2 5119
wolfSSL 0:1239e9b70ca2 5120
wolfSSL 0:1239e9b70ca2 5121 CYASSL_SESSION* GetSession(CYASSL* ssl, byte* masterSecret)
wolfSSL 0:1239e9b70ca2 5122 {
wolfSSL 0:1239e9b70ca2 5123 CYASSL_SESSION* ret = 0;
wolfSSL 0:1239e9b70ca2 5124 const byte* id = NULL;
wolfSSL 0:1239e9b70ca2 5125 word32 row;
wolfSSL 0:1239e9b70ca2 5126 int idx;
wolfSSL 0:1239e9b70ca2 5127 int count;
wolfSSL 0:1239e9b70ca2 5128 int error = 0;
wolfSSL 0:1239e9b70ca2 5129
wolfSSL 0:1239e9b70ca2 5130 if (ssl->options.sessionCacheOff)
wolfSSL 0:1239e9b70ca2 5131 return NULL;
wolfSSL 0:1239e9b70ca2 5132
wolfSSL 0:1239e9b70ca2 5133 if (ssl->options.haveSessionId == 0)
wolfSSL 0:1239e9b70ca2 5134 return NULL;
wolfSSL 0:1239e9b70ca2 5135
wolfSSL 0:1239e9b70ca2 5136 if (ssl->arrays)
wolfSSL 0:1239e9b70ca2 5137 id = ssl->arrays->sessionID;
wolfSSL 0:1239e9b70ca2 5138 else
wolfSSL 0:1239e9b70ca2 5139 id = ssl->session.sessionID;
wolfSSL 0:1239e9b70ca2 5140
wolfSSL 0:1239e9b70ca2 5141 row = HashSession(id, ID_LEN, &error) % SESSION_ROWS;
wolfSSL 0:1239e9b70ca2 5142 if (error != 0) {
wolfSSL 0:1239e9b70ca2 5143 CYASSL_MSG("Hash session failed");
wolfSSL 0:1239e9b70ca2 5144 return NULL;
wolfSSL 0:1239e9b70ca2 5145 }
wolfSSL 0:1239e9b70ca2 5146
wolfSSL 0:1239e9b70ca2 5147 if (LockMutex(&session_mutex) != 0)
wolfSSL 0:1239e9b70ca2 5148 return 0;
wolfSSL 0:1239e9b70ca2 5149
wolfSSL 0:1239e9b70ca2 5150 /* start from most recently used */
wolfSSL 0:1239e9b70ca2 5151 count = min((word32)SessionCache[row].totalCount, SESSIONS_PER_ROW);
wolfSSL 0:1239e9b70ca2 5152 idx = SessionCache[row].nextIdx - 1;
wolfSSL 0:1239e9b70ca2 5153 if (idx < 0)
wolfSSL 0:1239e9b70ca2 5154 idx = SESSIONS_PER_ROW - 1; /* if back to front, the previous was end */
wolfSSL 0:1239e9b70ca2 5155
wolfSSL 0:1239e9b70ca2 5156 for (; count > 0; --count, idx = idx ? idx - 1 : SESSIONS_PER_ROW - 1) {
wolfSSL 0:1239e9b70ca2 5157 CYASSL_SESSION* current;
wolfSSL 0:1239e9b70ca2 5158
wolfSSL 0:1239e9b70ca2 5159 if (idx >= SESSIONS_PER_ROW || idx < 0) { /* sanity check */
wolfSSL 0:1239e9b70ca2 5160 CYASSL_MSG("Bad idx");
wolfSSL 0:1239e9b70ca2 5161 break;
wolfSSL 0:1239e9b70ca2 5162 }
wolfSSL 0:1239e9b70ca2 5163
wolfSSL 0:1239e9b70ca2 5164 current = &SessionCache[row].Sessions[idx];
wolfSSL 0:1239e9b70ca2 5165 if (XMEMCMP(current->sessionID, id, ID_LEN) == 0) {
wolfSSL 0:1239e9b70ca2 5166 CYASSL_MSG("Found a session match");
wolfSSL 0:1239e9b70ca2 5167 if (LowResTimer() < (current->bornOn + current->timeout)) {
wolfSSL 0:1239e9b70ca2 5168 CYASSL_MSG("Session valid");
wolfSSL 0:1239e9b70ca2 5169 ret = current;
wolfSSL 0:1239e9b70ca2 5170 if (masterSecret)
wolfSSL 0:1239e9b70ca2 5171 XMEMCPY(masterSecret, current->masterSecret, SECRET_LEN);
wolfSSL 0:1239e9b70ca2 5172 } else {
wolfSSL 0:1239e9b70ca2 5173 CYASSL_MSG("Session timed out");
wolfSSL 0:1239e9b70ca2 5174 }
wolfSSL 0:1239e9b70ca2 5175 break; /* no more sessionIDs whether valid or not that match */
wolfSSL 0:1239e9b70ca2 5176 } else {
wolfSSL 0:1239e9b70ca2 5177 CYASSL_MSG("SessionID not a match at this idx");
wolfSSL 0:1239e9b70ca2 5178 }
wolfSSL 0:1239e9b70ca2 5179 }
wolfSSL 0:1239e9b70ca2 5180
wolfSSL 0:1239e9b70ca2 5181 UnLockMutex(&session_mutex);
wolfSSL 0:1239e9b70ca2 5182
wolfSSL 0:1239e9b70ca2 5183 return ret;
wolfSSL 0:1239e9b70ca2 5184 }
wolfSSL 0:1239e9b70ca2 5185
wolfSSL 0:1239e9b70ca2 5186
wolfSSL 0:1239e9b70ca2 5187 int SetSession(CYASSL* ssl, CYASSL_SESSION* session)
wolfSSL 0:1239e9b70ca2 5188 {
wolfSSL 0:1239e9b70ca2 5189 if (ssl->options.sessionCacheOff)
wolfSSL 0:1239e9b70ca2 5190 return SSL_FAILURE;
wolfSSL 0:1239e9b70ca2 5191
wolfSSL 0:1239e9b70ca2 5192 if (LowResTimer() < (session->bornOn + session->timeout)) {
wolfSSL 0:1239e9b70ca2 5193 ssl->session = *session;
wolfSSL 0:1239e9b70ca2 5194 ssl->options.resuming = 1;
wolfSSL 0:1239e9b70ca2 5195
wolfSSL 0:1239e9b70ca2 5196 #ifdef SESSION_CERTS
wolfSSL 0:1239e9b70ca2 5197 ssl->version = session->version;
wolfSSL 0:1239e9b70ca2 5198 ssl->options.cipherSuite0 = session->cipherSuite0;
wolfSSL 0:1239e9b70ca2 5199 ssl->options.cipherSuite = session->cipherSuite;
wolfSSL 0:1239e9b70ca2 5200 #endif
wolfSSL 0:1239e9b70ca2 5201
wolfSSL 0:1239e9b70ca2 5202 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 5203 }
wolfSSL 0:1239e9b70ca2 5204 return SSL_FAILURE; /* session timed out */
wolfSSL 0:1239e9b70ca2 5205 }
wolfSSL 0:1239e9b70ca2 5206
wolfSSL 0:1239e9b70ca2 5207
wolfSSL 0:1239e9b70ca2 5208 int AddSession(CYASSL* ssl)
wolfSSL 0:1239e9b70ca2 5209 {
wolfSSL 0:1239e9b70ca2 5210 word32 row, idx;
wolfSSL 0:1239e9b70ca2 5211 int error = 0;
wolfSSL 0:1239e9b70ca2 5212
wolfSSL 0:1239e9b70ca2 5213 if (ssl->options.sessionCacheOff)
wolfSSL 0:1239e9b70ca2 5214 return 0;
wolfSSL 0:1239e9b70ca2 5215
wolfSSL 0:1239e9b70ca2 5216 if (ssl->options.haveSessionId == 0)
wolfSSL 0:1239e9b70ca2 5217 return 0;
wolfSSL 0:1239e9b70ca2 5218
wolfSSL 0:1239e9b70ca2 5219 row = HashSession(ssl->arrays->sessionID, ID_LEN, &error) % SESSION_ROWS;
wolfSSL 0:1239e9b70ca2 5220 if (error != 0) {
wolfSSL 0:1239e9b70ca2 5221 CYASSL_MSG("Hash session failed");
wolfSSL 0:1239e9b70ca2 5222 return error;
wolfSSL 0:1239e9b70ca2 5223 }
wolfSSL 0:1239e9b70ca2 5224
wolfSSL 0:1239e9b70ca2 5225 if (LockMutex(&session_mutex) != 0)
wolfSSL 0:1239e9b70ca2 5226 return BAD_MUTEX_E;
wolfSSL 0:1239e9b70ca2 5227
wolfSSL 0:1239e9b70ca2 5228 idx = SessionCache[row].nextIdx++;
wolfSSL 0:1239e9b70ca2 5229 #ifdef SESSION_INDEX
wolfSSL 0:1239e9b70ca2 5230 ssl->sessionIndex = (row << SESSIDX_ROW_SHIFT) | idx;
wolfSSL 0:1239e9b70ca2 5231 #endif
wolfSSL 0:1239e9b70ca2 5232
wolfSSL 0:1239e9b70ca2 5233 XMEMCPY(SessionCache[row].Sessions[idx].masterSecret,
wolfSSL 0:1239e9b70ca2 5234 ssl->arrays->masterSecret, SECRET_LEN);
wolfSSL 0:1239e9b70ca2 5235 XMEMCPY(SessionCache[row].Sessions[idx].sessionID, ssl->arrays->sessionID,
wolfSSL 0:1239e9b70ca2 5236 ID_LEN);
wolfSSL 0:1239e9b70ca2 5237
wolfSSL 0:1239e9b70ca2 5238 SessionCache[row].Sessions[idx].timeout = ssl->timeout;
wolfSSL 0:1239e9b70ca2 5239 SessionCache[row].Sessions[idx].bornOn = LowResTimer();
wolfSSL 0:1239e9b70ca2 5240
wolfSSL 0:1239e9b70ca2 5241 #ifdef SESSION_CERTS
wolfSSL 0:1239e9b70ca2 5242 SessionCache[row].Sessions[idx].chain.count = ssl->session.chain.count;
wolfSSL 0:1239e9b70ca2 5243 XMEMCPY(SessionCache[row].Sessions[idx].chain.certs,
wolfSSL 0:1239e9b70ca2 5244 ssl->session.chain.certs, sizeof(x509_buffer) * MAX_CHAIN_DEPTH);
wolfSSL 0:1239e9b70ca2 5245
wolfSSL 0:1239e9b70ca2 5246 SessionCache[row].Sessions[idx].version = ssl->version;
wolfSSL 0:1239e9b70ca2 5247 SessionCache[row].Sessions[idx].cipherSuite0 = ssl->options.cipherSuite0;
wolfSSL 0:1239e9b70ca2 5248 SessionCache[row].Sessions[idx].cipherSuite = ssl->options.cipherSuite;
wolfSSL 0:1239e9b70ca2 5249 #endif /* SESSION_CERTS */
wolfSSL 0:1239e9b70ca2 5250
wolfSSL 0:1239e9b70ca2 5251 SessionCache[row].totalCount++;
wolfSSL 0:1239e9b70ca2 5252 if (SessionCache[row].nextIdx == SESSIONS_PER_ROW)
wolfSSL 0:1239e9b70ca2 5253 SessionCache[row].nextIdx = 0;
wolfSSL 0:1239e9b70ca2 5254
wolfSSL 0:1239e9b70ca2 5255 #ifndef NO_CLIENT_CACHE
wolfSSL 0:1239e9b70ca2 5256 if (ssl->options.side == CYASSL_CLIENT_END && ssl->session.idLen) {
wolfSSL 0:1239e9b70ca2 5257 word32 clientRow, clientIdx;
wolfSSL 0:1239e9b70ca2 5258
wolfSSL 0:1239e9b70ca2 5259 CYASSL_MSG("Adding client cache entry");
wolfSSL 0:1239e9b70ca2 5260
wolfSSL 0:1239e9b70ca2 5261 SessionCache[row].Sessions[idx].idLen = ssl->session.idLen;
wolfSSL 0:1239e9b70ca2 5262 XMEMCPY(SessionCache[row].Sessions[idx].serverID, ssl->session.serverID,
wolfSSL 0:1239e9b70ca2 5263 ssl->session.idLen);
wolfSSL 0:1239e9b70ca2 5264
wolfSSL 0:1239e9b70ca2 5265 clientRow = HashSession(ssl->session.serverID, ssl->session.idLen,
wolfSSL 0:1239e9b70ca2 5266 &error) % SESSION_ROWS;
wolfSSL 0:1239e9b70ca2 5267 if (error != 0) {
wolfSSL 0:1239e9b70ca2 5268 CYASSL_MSG("Hash session failed");
wolfSSL 0:1239e9b70ca2 5269 return error;
wolfSSL 0:1239e9b70ca2 5270 }
wolfSSL 0:1239e9b70ca2 5271 clientIdx = ClientCache[clientRow].nextIdx++;
wolfSSL 0:1239e9b70ca2 5272
wolfSSL 0:1239e9b70ca2 5273 ClientCache[clientRow].Clients[clientIdx].serverRow = (word16)row;
wolfSSL 0:1239e9b70ca2 5274 ClientCache[clientRow].Clients[clientIdx].serverIdx = (word16)idx;
wolfSSL 0:1239e9b70ca2 5275
wolfSSL 0:1239e9b70ca2 5276 ClientCache[clientRow].totalCount++;
wolfSSL 0:1239e9b70ca2 5277 if (ClientCache[clientRow].nextIdx == SESSIONS_PER_ROW)
wolfSSL 0:1239e9b70ca2 5278 ClientCache[clientRow].nextIdx = 0;
wolfSSL 0:1239e9b70ca2 5279 }
wolfSSL 0:1239e9b70ca2 5280 else
wolfSSL 0:1239e9b70ca2 5281 SessionCache[row].Sessions[idx].idLen = 0;
wolfSSL 0:1239e9b70ca2 5282 #endif /* NO_CLIENT_CACHE */
wolfSSL 0:1239e9b70ca2 5283
wolfSSL 0:1239e9b70ca2 5284 if (UnLockMutex(&session_mutex) != 0)
wolfSSL 0:1239e9b70ca2 5285 return BAD_MUTEX_E;
wolfSSL 0:1239e9b70ca2 5286
wolfSSL 0:1239e9b70ca2 5287 return 0;
wolfSSL 0:1239e9b70ca2 5288 }
wolfSSL 0:1239e9b70ca2 5289
wolfSSL 0:1239e9b70ca2 5290
wolfSSL 0:1239e9b70ca2 5291 #ifdef SESSION_INDEX
wolfSSL 0:1239e9b70ca2 5292
wolfSSL 0:1239e9b70ca2 5293 int CyaSSL_GetSessionIndex(CYASSL* ssl)
wolfSSL 0:1239e9b70ca2 5294 {
wolfSSL 0:1239e9b70ca2 5295 CYASSL_ENTER("CyaSSL_GetSessionIndex");
wolfSSL 0:1239e9b70ca2 5296 CYASSL_LEAVE("CyaSSL_GetSessionIndex", ssl->sessionIndex);
wolfSSL 0:1239e9b70ca2 5297 return ssl->sessionIndex;
wolfSSL 0:1239e9b70ca2 5298 }
wolfSSL 0:1239e9b70ca2 5299
wolfSSL 0:1239e9b70ca2 5300
wolfSSL 0:1239e9b70ca2 5301 int CyaSSL_GetSessionAtIndex(int idx, CYASSL_SESSION* session)
wolfSSL 0:1239e9b70ca2 5302 {
wolfSSL 0:1239e9b70ca2 5303 int row, col, result = SSL_FAILURE;
wolfSSL 0:1239e9b70ca2 5304
wolfSSL 0:1239e9b70ca2 5305 CYASSL_ENTER("CyaSSL_GetSessionAtIndex");
wolfSSL 0:1239e9b70ca2 5306
wolfSSL 0:1239e9b70ca2 5307 row = idx >> SESSIDX_ROW_SHIFT;
wolfSSL 0:1239e9b70ca2 5308 col = idx & SESSIDX_IDX_MASK;
wolfSSL 0:1239e9b70ca2 5309
wolfSSL 0:1239e9b70ca2 5310 if (LockMutex(&session_mutex) != 0) {
wolfSSL 0:1239e9b70ca2 5311 return BAD_MUTEX_E;
wolfSSL 0:1239e9b70ca2 5312 }
wolfSSL 0:1239e9b70ca2 5313
wolfSSL 0:1239e9b70ca2 5314 if (row < SESSION_ROWS &&
wolfSSL 0:1239e9b70ca2 5315 col < (int)min(SessionCache[row].totalCount, SESSIONS_PER_ROW)) {
wolfSSL 0:1239e9b70ca2 5316 XMEMCPY(session,
wolfSSL 0:1239e9b70ca2 5317 &SessionCache[row].Sessions[col], sizeof(CYASSL_SESSION));
wolfSSL 0:1239e9b70ca2 5318 result = SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 5319 }
wolfSSL 0:1239e9b70ca2 5320
wolfSSL 0:1239e9b70ca2 5321 if (UnLockMutex(&session_mutex) != 0)
wolfSSL 0:1239e9b70ca2 5322 result = BAD_MUTEX_E;
wolfSSL 0:1239e9b70ca2 5323
wolfSSL 0:1239e9b70ca2 5324 CYASSL_LEAVE("CyaSSL_GetSessionAtIndex", result);
wolfSSL 0:1239e9b70ca2 5325 return result;
wolfSSL 0:1239e9b70ca2 5326 }
wolfSSL 0:1239e9b70ca2 5327
wolfSSL 0:1239e9b70ca2 5328 #endif /* SESSION_INDEX */
wolfSSL 0:1239e9b70ca2 5329
wolfSSL 0:1239e9b70ca2 5330 #if defined(SESSION_INDEX) && defined(SESSION_CERTS)
wolfSSL 0:1239e9b70ca2 5331
wolfSSL 0:1239e9b70ca2 5332 CYASSL_X509_CHAIN* CyaSSL_SESSION_get_peer_chain(CYASSL_SESSION* session)
wolfSSL 0:1239e9b70ca2 5333 {
wolfSSL 0:1239e9b70ca2 5334 CYASSL_X509_CHAIN* chain = NULL;
wolfSSL 0:1239e9b70ca2 5335
wolfSSL 0:1239e9b70ca2 5336 CYASSL_ENTER("CyaSSL_SESSION_get_peer_chain");
wolfSSL 0:1239e9b70ca2 5337 if (session)
wolfSSL 0:1239e9b70ca2 5338 chain = &session->chain;
wolfSSL 0:1239e9b70ca2 5339
wolfSSL 0:1239e9b70ca2 5340 CYASSL_LEAVE("CyaSSL_SESSION_get_peer_chain", chain ? 1 : 0);
wolfSSL 0:1239e9b70ca2 5341 return chain;
wolfSSL 0:1239e9b70ca2 5342 }
wolfSSL 0:1239e9b70ca2 5343
wolfSSL 0:1239e9b70ca2 5344 #endif /* SESSION_INDEX && SESSION_CERTS */
wolfSSL 0:1239e9b70ca2 5345
wolfSSL 0:1239e9b70ca2 5346
wolfSSL 0:1239e9b70ca2 5347 #ifdef SESSION_STATS
wolfSSL 0:1239e9b70ca2 5348
wolfSSL 0:1239e9b70ca2 5349 CYASSL_API
wolfSSL 0:1239e9b70ca2 5350 void PrintSessionStats(void)
wolfSSL 0:1239e9b70ca2 5351 {
wolfSSL 0:1239e9b70ca2 5352 word32 totalSessionsSeen = 0;
wolfSSL 0:1239e9b70ca2 5353 word32 totalSessionsNow = 0;
wolfSSL 0:1239e9b70ca2 5354 word32 rowNow;
wolfSSL 0:1239e9b70ca2 5355 int i;
wolfSSL 0:1239e9b70ca2 5356 double E; /* expected freq */
wolfSSL 0:1239e9b70ca2 5357 double chiSquare = 0;
wolfSSL 0:1239e9b70ca2 5358
wolfSSL 0:1239e9b70ca2 5359 for (i = 0; i < SESSION_ROWS; i++) {
wolfSSL 0:1239e9b70ca2 5360 totalSessionsSeen += SessionCache[i].totalCount;
wolfSSL 0:1239e9b70ca2 5361
wolfSSL 0:1239e9b70ca2 5362 if (SessionCache[i].totalCount >= SESSIONS_PER_ROW)
wolfSSL 0:1239e9b70ca2 5363 rowNow = SESSIONS_PER_ROW;
wolfSSL 0:1239e9b70ca2 5364 else if (SessionCache[i].nextIdx == 0)
wolfSSL 0:1239e9b70ca2 5365 rowNow = 0;
wolfSSL 0:1239e9b70ca2 5366 else
wolfSSL 0:1239e9b70ca2 5367 rowNow = SessionCache[i].nextIdx;
wolfSSL 0:1239e9b70ca2 5368
wolfSSL 0:1239e9b70ca2 5369 totalSessionsNow += rowNow;
wolfSSL 0:1239e9b70ca2 5370 }
wolfSSL 0:1239e9b70ca2 5371
wolfSSL 0:1239e9b70ca2 5372 printf("Total Sessions Seen = %d\n", totalSessionsSeen);
wolfSSL 0:1239e9b70ca2 5373 printf("Total Sessions Now = %d\n", totalSessionsNow);
wolfSSL 0:1239e9b70ca2 5374
wolfSSL 0:1239e9b70ca2 5375 E = (double)totalSessionsSeen / SESSION_ROWS;
wolfSSL 0:1239e9b70ca2 5376
wolfSSL 0:1239e9b70ca2 5377 for (i = 0; i < SESSION_ROWS; i++) {
wolfSSL 0:1239e9b70ca2 5378 double diff = SessionCache[i].totalCount - E;
wolfSSL 0:1239e9b70ca2 5379 diff *= diff; /* square */
wolfSSL 0:1239e9b70ca2 5380 diff /= E; /* normalize */
wolfSSL 0:1239e9b70ca2 5381
wolfSSL 0:1239e9b70ca2 5382 chiSquare += diff;
wolfSSL 0:1239e9b70ca2 5383 }
wolfSSL 0:1239e9b70ca2 5384 printf(" chi-square = %5.1f, d.f. = %d\n", chiSquare,
wolfSSL 0:1239e9b70ca2 5385 SESSION_ROWS - 1);
wolfSSL 0:1239e9b70ca2 5386 if (SESSION_ROWS == 11)
wolfSSL 0:1239e9b70ca2 5387 printf(" .05 p value = 18.3, chi-square should be less\n");
wolfSSL 0:1239e9b70ca2 5388 else if (SESSION_ROWS == 211)
wolfSSL 0:1239e9b70ca2 5389 printf(".05 p value = 244.8, chi-square should be less\n");
wolfSSL 0:1239e9b70ca2 5390 else if (SESSION_ROWS == 5981)
wolfSSL 0:1239e9b70ca2 5391 printf(".05 p value = 6161.0, chi-square should be less\n");
wolfSSL 0:1239e9b70ca2 5392 else if (SESSION_ROWS == 3)
wolfSSL 0:1239e9b70ca2 5393 printf(".05 p value = 6.0, chi-square should be less\n");
wolfSSL 0:1239e9b70ca2 5394 else if (SESSION_ROWS == 2861)
wolfSSL 0:1239e9b70ca2 5395 printf(".05 p value = 2985.5, chi-square should be less\n");
wolfSSL 0:1239e9b70ca2 5396 printf("\n");
wolfSSL 0:1239e9b70ca2 5397 }
wolfSSL 0:1239e9b70ca2 5398
wolfSSL 0:1239e9b70ca2 5399 #endif /* SESSION_STATS */
wolfSSL 0:1239e9b70ca2 5400
wolfSSL 0:1239e9b70ca2 5401 #else /* NO_SESSION_CACHE */
wolfSSL 0:1239e9b70ca2 5402
wolfSSL 0:1239e9b70ca2 5403 /* No session cache version */
wolfSSL 0:1239e9b70ca2 5404 CYASSL_SESSION* GetSession(CYASSL* ssl, byte* masterSecret)
wolfSSL 0:1239e9b70ca2 5405 {
wolfSSL 0:1239e9b70ca2 5406 (void)ssl;
wolfSSL 0:1239e9b70ca2 5407 (void)masterSecret;
wolfSSL 0:1239e9b70ca2 5408
wolfSSL 0:1239e9b70ca2 5409 return NULL;
wolfSSL 0:1239e9b70ca2 5410 }
wolfSSL 0:1239e9b70ca2 5411
wolfSSL 0:1239e9b70ca2 5412 #endif /* NO_SESSION_CACHE */
wolfSSL 0:1239e9b70ca2 5413
wolfSSL 0:1239e9b70ca2 5414
wolfSSL 0:1239e9b70ca2 5415 /* call before SSL_connect, if verifying will add name check to
wolfSSL 0:1239e9b70ca2 5416 date check and signature check */
wolfSSL 0:1239e9b70ca2 5417 int CyaSSL_check_domain_name(CYASSL* ssl, const char* dn)
wolfSSL 0:1239e9b70ca2 5418 {
wolfSSL 0:1239e9b70ca2 5419 CYASSL_ENTER("CyaSSL_check_domain_name");
wolfSSL 0:1239e9b70ca2 5420 if (ssl->buffers.domainName.buffer)
wolfSSL 0:1239e9b70ca2 5421 XFREE(ssl->buffers.domainName.buffer, ssl->heap, DYNAMIC_TYPE_DOMAIN);
wolfSSL 0:1239e9b70ca2 5422
wolfSSL 0:1239e9b70ca2 5423 ssl->buffers.domainName.length = (word32)XSTRLEN(dn) + 1;
wolfSSL 0:1239e9b70ca2 5424 ssl->buffers.domainName.buffer = (byte*) XMALLOC(
wolfSSL 0:1239e9b70ca2 5425 ssl->buffers.domainName.length, ssl->heap, DYNAMIC_TYPE_DOMAIN);
wolfSSL 0:1239e9b70ca2 5426
wolfSSL 0:1239e9b70ca2 5427 if (ssl->buffers.domainName.buffer) {
wolfSSL 0:1239e9b70ca2 5428 XSTRNCPY((char*)ssl->buffers.domainName.buffer, dn,
wolfSSL 0:1239e9b70ca2 5429 ssl->buffers.domainName.length);
wolfSSL 0:1239e9b70ca2 5430 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 5431 }
wolfSSL 0:1239e9b70ca2 5432 else {
wolfSSL 0:1239e9b70ca2 5433 ssl->error = MEMORY_ERROR;
wolfSSL 0:1239e9b70ca2 5434 return SSL_FAILURE;
wolfSSL 0:1239e9b70ca2 5435 }
wolfSSL 0:1239e9b70ca2 5436 }
wolfSSL 0:1239e9b70ca2 5437
wolfSSL 0:1239e9b70ca2 5438
wolfSSL 0:1239e9b70ca2 5439 /* turn on CyaSSL zlib compression
wolfSSL 0:1239e9b70ca2 5440 returns SSL_SUCCESS for success, else error (not built in)
wolfSSL 0:1239e9b70ca2 5441 */
wolfSSL 0:1239e9b70ca2 5442 int CyaSSL_set_compression(CYASSL* ssl)
wolfSSL 0:1239e9b70ca2 5443 {
wolfSSL 0:1239e9b70ca2 5444 CYASSL_ENTER("CyaSSL_set_compression");
wolfSSL 0:1239e9b70ca2 5445 (void)ssl;
wolfSSL 0:1239e9b70ca2 5446 #ifdef HAVE_LIBZ
wolfSSL 0:1239e9b70ca2 5447 ssl->options.usingCompression = 1;
wolfSSL 0:1239e9b70ca2 5448 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 5449 #else
wolfSSL 0:1239e9b70ca2 5450 return NOT_COMPILED_IN;
wolfSSL 0:1239e9b70ca2 5451 #endif
wolfSSL 0:1239e9b70ca2 5452 }
wolfSSL 0:1239e9b70ca2 5453
wolfSSL 0:1239e9b70ca2 5454
wolfSSL 0:1239e9b70ca2 5455 #ifndef USE_WINDOWS_API
wolfSSL 0:1239e9b70ca2 5456 #ifndef NO_WRITEV
wolfSSL 0:1239e9b70ca2 5457
wolfSSL 0:1239e9b70ca2 5458 /* simulate writev semantics, doesn't actually do block at a time though
wolfSSL 0:1239e9b70ca2 5459 because of SSL_write behavior and because front adds may be small */
wolfSSL 0:1239e9b70ca2 5460 int CyaSSL_writev(CYASSL* ssl, const struct iovec* iov, int iovcnt)
wolfSSL 0:1239e9b70ca2 5461 {
wolfSSL 0:1239e9b70ca2 5462 byte tmp[FILE_BUFFER_SIZE];
wolfSSL 0:1239e9b70ca2 5463 byte* myBuffer = tmp;
wolfSSL 0:1239e9b70ca2 5464 int sending = 0;
wolfSSL 0:1239e9b70ca2 5465 int newBuffer = 0;
wolfSSL 0:1239e9b70ca2 5466 int idx = 0;
wolfSSL 0:1239e9b70ca2 5467 int i;
wolfSSL 0:1239e9b70ca2 5468 int ret;
wolfSSL 0:1239e9b70ca2 5469
wolfSSL 0:1239e9b70ca2 5470 CYASSL_ENTER("CyaSSL_writev");
wolfSSL 0:1239e9b70ca2 5471
wolfSSL 0:1239e9b70ca2 5472 for (i = 0; i < iovcnt; i++)
wolfSSL 0:1239e9b70ca2 5473 sending += (int)iov[i].iov_len;
wolfSSL 0:1239e9b70ca2 5474
wolfSSL 0:1239e9b70ca2 5475 if (sending > (int)sizeof(tmp)) {
wolfSSL 0:1239e9b70ca2 5476 byte* tmp2 = (byte*) XMALLOC(sending, ssl->heap,
wolfSSL 0:1239e9b70ca2 5477 DYNAMIC_TYPE_WRITEV);
wolfSSL 0:1239e9b70ca2 5478 if (!tmp2)
wolfSSL 0:1239e9b70ca2 5479 return MEMORY_ERROR;
wolfSSL 0:1239e9b70ca2 5480 myBuffer = tmp2;
wolfSSL 0:1239e9b70ca2 5481 newBuffer = 1;
wolfSSL 0:1239e9b70ca2 5482 }
wolfSSL 0:1239e9b70ca2 5483
wolfSSL 0:1239e9b70ca2 5484 for (i = 0; i < iovcnt; i++) {
wolfSSL 0:1239e9b70ca2 5485 XMEMCPY(&myBuffer[idx], iov[i].iov_base, iov[i].iov_len);
wolfSSL 0:1239e9b70ca2 5486 idx += (int)iov[i].iov_len;
wolfSSL 0:1239e9b70ca2 5487 }
wolfSSL 0:1239e9b70ca2 5488
wolfSSL 0:1239e9b70ca2 5489 ret = CyaSSL_write(ssl, myBuffer, sending);
wolfSSL 0:1239e9b70ca2 5490
wolfSSL 0:1239e9b70ca2 5491 if (newBuffer) XFREE(myBuffer, ssl->heap, DYNAMIC_TYPE_WRITEV);
wolfSSL 0:1239e9b70ca2 5492
wolfSSL 0:1239e9b70ca2 5493 return ret;
wolfSSL 0:1239e9b70ca2 5494 }
wolfSSL 0:1239e9b70ca2 5495 #endif
wolfSSL 0:1239e9b70ca2 5496 #endif
wolfSSL 0:1239e9b70ca2 5497
wolfSSL 0:1239e9b70ca2 5498
wolfSSL 0:1239e9b70ca2 5499 #ifdef CYASSL_CALLBACKS
wolfSSL 0:1239e9b70ca2 5500
wolfSSL 0:1239e9b70ca2 5501 typedef struct itimerval Itimerval;
wolfSSL 0:1239e9b70ca2 5502
wolfSSL 0:1239e9b70ca2 5503 /* don't keep calling simple functions while setting up timer and singals
wolfSSL 0:1239e9b70ca2 5504 if no inlining these are the next best */
wolfSSL 0:1239e9b70ca2 5505
wolfSSL 0:1239e9b70ca2 5506 #define AddTimes(a, b, c) \
wolfSSL 0:1239e9b70ca2 5507 do { \
wolfSSL 0:1239e9b70ca2 5508 c.tv_sec = a.tv_sec + b.tv_sec; \
wolfSSL 0:1239e9b70ca2 5509 c.tv_usec = a.tv_usec + b.tv_usec; \
wolfSSL 0:1239e9b70ca2 5510 if (c.tv_usec >= 1000000) { \
wolfSSL 0:1239e9b70ca2 5511 c.tv_sec++; \
wolfSSL 0:1239e9b70ca2 5512 c.tv_usec -= 1000000; \
wolfSSL 0:1239e9b70ca2 5513 } \
wolfSSL 0:1239e9b70ca2 5514 } while (0)
wolfSSL 0:1239e9b70ca2 5515
wolfSSL 0:1239e9b70ca2 5516
wolfSSL 0:1239e9b70ca2 5517 #define SubtractTimes(a, b, c) \
wolfSSL 0:1239e9b70ca2 5518 do { \
wolfSSL 0:1239e9b70ca2 5519 c.tv_sec = a.tv_sec - b.tv_sec; \
wolfSSL 0:1239e9b70ca2 5520 c.tv_usec = a.tv_usec - b.tv_usec; \
wolfSSL 0:1239e9b70ca2 5521 if (c.tv_usec < 0) { \
wolfSSL 0:1239e9b70ca2 5522 c.tv_sec--; \
wolfSSL 0:1239e9b70ca2 5523 c.tv_usec += 1000000; \
wolfSSL 0:1239e9b70ca2 5524 } \
wolfSSL 0:1239e9b70ca2 5525 } while (0)
wolfSSL 0:1239e9b70ca2 5526
wolfSSL 0:1239e9b70ca2 5527 #define CmpTimes(a, b, cmp) \
wolfSSL 0:1239e9b70ca2 5528 ((a.tv_sec == b.tv_sec) ? \
wolfSSL 0:1239e9b70ca2 5529 (a.tv_usec cmp b.tv_usec) : \
wolfSSL 0:1239e9b70ca2 5530 (a.tv_sec cmp b.tv_sec)) \
wolfSSL 0:1239e9b70ca2 5531
wolfSSL 0:1239e9b70ca2 5532
wolfSSL 0:1239e9b70ca2 5533 /* do nothing handler */
wolfSSL 0:1239e9b70ca2 5534 static void myHandler(int signo)
wolfSSL 0:1239e9b70ca2 5535 {
wolfSSL 0:1239e9b70ca2 5536 (void)signo;
wolfSSL 0:1239e9b70ca2 5537 return;
wolfSSL 0:1239e9b70ca2 5538 }
wolfSSL 0:1239e9b70ca2 5539
wolfSSL 0:1239e9b70ca2 5540
wolfSSL 0:1239e9b70ca2 5541 static int CyaSSL_ex_wrapper(CYASSL* ssl, HandShakeCallBack hsCb,
wolfSSL 0:1239e9b70ca2 5542 TimeoutCallBack toCb, Timeval timeout)
wolfSSL 0:1239e9b70ca2 5543 {
wolfSSL 0:1239e9b70ca2 5544 int ret = SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 5545 int oldTimerOn = 0; /* was timer already on */
wolfSSL 0:1239e9b70ca2 5546 Timeval startTime;
wolfSSL 0:1239e9b70ca2 5547 Timeval endTime;
wolfSSL 0:1239e9b70ca2 5548 Timeval totalTime;
wolfSSL 0:1239e9b70ca2 5549 Itimerval myTimeout;
wolfSSL 0:1239e9b70ca2 5550 Itimerval oldTimeout; /* if old timer adjust from total time to reset */
wolfSSL 0:1239e9b70ca2 5551 struct sigaction act, oact;
wolfSSL 0:1239e9b70ca2 5552
wolfSSL 0:1239e9b70ca2 5553 #define ERR_OUT(x) { ssl->hsInfoOn = 0; ssl->toInfoOn = 0; return x; }
wolfSSL 0:1239e9b70ca2 5554
wolfSSL 0:1239e9b70ca2 5555 if (hsCb) {
wolfSSL 0:1239e9b70ca2 5556 ssl->hsInfoOn = 1;
wolfSSL 0:1239e9b70ca2 5557 InitHandShakeInfo(&ssl->handShakeInfo);
wolfSSL 0:1239e9b70ca2 5558 }
wolfSSL 0:1239e9b70ca2 5559 if (toCb) {
wolfSSL 0:1239e9b70ca2 5560 ssl->toInfoOn = 1;
wolfSSL 0:1239e9b70ca2 5561 InitTimeoutInfo(&ssl->timeoutInfo);
wolfSSL 0:1239e9b70ca2 5562
wolfSSL 0:1239e9b70ca2 5563 if (gettimeofday(&startTime, 0) < 0)
wolfSSL 0:1239e9b70ca2 5564 ERR_OUT(GETTIME_ERROR);
wolfSSL 0:1239e9b70ca2 5565
wolfSSL 0:1239e9b70ca2 5566 /* use setitimer to simulate getitimer, init 0 myTimeout */
wolfSSL 0:1239e9b70ca2 5567 myTimeout.it_interval.tv_sec = 0;
wolfSSL 0:1239e9b70ca2 5568 myTimeout.it_interval.tv_usec = 0;
wolfSSL 0:1239e9b70ca2 5569 myTimeout.it_value.tv_sec = 0;
wolfSSL 0:1239e9b70ca2 5570 myTimeout.it_value.tv_usec = 0;
wolfSSL 0:1239e9b70ca2 5571 if (setitimer(ITIMER_REAL, &myTimeout, &oldTimeout) < 0)
wolfSSL 0:1239e9b70ca2 5572 ERR_OUT(SETITIMER_ERROR);
wolfSSL 0:1239e9b70ca2 5573
wolfSSL 0:1239e9b70ca2 5574 if (oldTimeout.it_value.tv_sec || oldTimeout.it_value.tv_usec) {
wolfSSL 0:1239e9b70ca2 5575 oldTimerOn = 1;
wolfSSL 0:1239e9b70ca2 5576
wolfSSL 0:1239e9b70ca2 5577 /* is old timer going to expire before ours */
wolfSSL 0:1239e9b70ca2 5578 if (CmpTimes(oldTimeout.it_value, timeout, <)) {
wolfSSL 0:1239e9b70ca2 5579 timeout.tv_sec = oldTimeout.it_value.tv_sec;
wolfSSL 0:1239e9b70ca2 5580 timeout.tv_usec = oldTimeout.it_value.tv_usec;
wolfSSL 0:1239e9b70ca2 5581 }
wolfSSL 0:1239e9b70ca2 5582 }
wolfSSL 0:1239e9b70ca2 5583 myTimeout.it_value.tv_sec = timeout.tv_sec;
wolfSSL 0:1239e9b70ca2 5584 myTimeout.it_value.tv_usec = timeout.tv_usec;
wolfSSL 0:1239e9b70ca2 5585
wolfSSL 0:1239e9b70ca2 5586 /* set up signal handler, don't restart socket send/recv */
wolfSSL 0:1239e9b70ca2 5587 act.sa_handler = myHandler;
wolfSSL 0:1239e9b70ca2 5588 sigemptyset(&act.sa_mask);
wolfSSL 0:1239e9b70ca2 5589 act.sa_flags = 0;
wolfSSL 0:1239e9b70ca2 5590 #ifdef SA_INTERRUPT
wolfSSL 0:1239e9b70ca2 5591 act.sa_flags |= SA_INTERRUPT;
wolfSSL 0:1239e9b70ca2 5592 #endif
wolfSSL 0:1239e9b70ca2 5593 if (sigaction(SIGALRM, &act, &oact) < 0)
wolfSSL 0:1239e9b70ca2 5594 ERR_OUT(SIGACT_ERROR);
wolfSSL 0:1239e9b70ca2 5595
wolfSSL 0:1239e9b70ca2 5596 if (setitimer(ITIMER_REAL, &myTimeout, 0) < 0)
wolfSSL 0:1239e9b70ca2 5597 ERR_OUT(SETITIMER_ERROR);
wolfSSL 0:1239e9b70ca2 5598 }
wolfSSL 0:1239e9b70ca2 5599
wolfSSL 0:1239e9b70ca2 5600 /* do main work */
wolfSSL 0:1239e9b70ca2 5601 #ifndef NO_CYASSL_CLIENT
wolfSSL 0:1239e9b70ca2 5602 if (ssl->options.side == CYASSL_CLIENT_END)
wolfSSL 0:1239e9b70ca2 5603 ret = CyaSSL_connect(ssl);
wolfSSL 0:1239e9b70ca2 5604 #endif
wolfSSL 0:1239e9b70ca2 5605 #ifndef NO_CYASSL_SERVER
wolfSSL 0:1239e9b70ca2 5606 if (ssl->options.side == CYASSL_SERVER_END)
wolfSSL 0:1239e9b70ca2 5607 ret = CyaSSL_accept(ssl);
wolfSSL 0:1239e9b70ca2 5608 #endif
wolfSSL 0:1239e9b70ca2 5609
wolfSSL 0:1239e9b70ca2 5610 /* do callbacks */
wolfSSL 0:1239e9b70ca2 5611 if (toCb) {
wolfSSL 0:1239e9b70ca2 5612 if (oldTimerOn) {
wolfSSL 0:1239e9b70ca2 5613 gettimeofday(&endTime, 0);
wolfSSL 0:1239e9b70ca2 5614 SubtractTimes(endTime, startTime, totalTime);
wolfSSL 0:1239e9b70ca2 5615 /* adjust old timer for elapsed time */
wolfSSL 0:1239e9b70ca2 5616 if (CmpTimes(totalTime, oldTimeout.it_value, <))
wolfSSL 0:1239e9b70ca2 5617 SubtractTimes(oldTimeout.it_value, totalTime,
wolfSSL 0:1239e9b70ca2 5618 oldTimeout.it_value);
wolfSSL 0:1239e9b70ca2 5619 else {
wolfSSL 0:1239e9b70ca2 5620 /* reset value to interval, may be off */
wolfSSL 0:1239e9b70ca2 5621 oldTimeout.it_value.tv_sec = oldTimeout.it_interval.tv_sec;
wolfSSL 0:1239e9b70ca2 5622 oldTimeout.it_value.tv_usec =oldTimeout.it_interval.tv_usec;
wolfSSL 0:1239e9b70ca2 5623 }
wolfSSL 0:1239e9b70ca2 5624 /* keep iter the same whether there or not */
wolfSSL 0:1239e9b70ca2 5625 }
wolfSSL 0:1239e9b70ca2 5626 /* restore old handler */
wolfSSL 0:1239e9b70ca2 5627 if (sigaction(SIGALRM, &oact, 0) < 0)
wolfSSL 0:1239e9b70ca2 5628 ret = SIGACT_ERROR; /* more pressing error, stomp */
wolfSSL 0:1239e9b70ca2 5629 else
wolfSSL 0:1239e9b70ca2 5630 /* use old settings which may turn off (expired or not there) */
wolfSSL 0:1239e9b70ca2 5631 if (setitimer(ITIMER_REAL, &oldTimeout, 0) < 0)
wolfSSL 0:1239e9b70ca2 5632 ret = SETITIMER_ERROR;
wolfSSL 0:1239e9b70ca2 5633
wolfSSL 0:1239e9b70ca2 5634 /* if we had a timeout call callback */
wolfSSL 0:1239e9b70ca2 5635 if (ssl->timeoutInfo.timeoutName[0]) {
wolfSSL 0:1239e9b70ca2 5636 ssl->timeoutInfo.timeoutValue.tv_sec = timeout.tv_sec;
wolfSSL 0:1239e9b70ca2 5637 ssl->timeoutInfo.timeoutValue.tv_usec = timeout.tv_usec;
wolfSSL 0:1239e9b70ca2 5638 (toCb)(&ssl->timeoutInfo);
wolfSSL 0:1239e9b70ca2 5639 }
wolfSSL 0:1239e9b70ca2 5640 /* clean up */
wolfSSL 0:1239e9b70ca2 5641 FreeTimeoutInfo(&ssl->timeoutInfo, ssl->heap);
wolfSSL 0:1239e9b70ca2 5642 ssl->toInfoOn = 0;
wolfSSL 0:1239e9b70ca2 5643 }
wolfSSL 0:1239e9b70ca2 5644 if (hsCb) {
wolfSSL 0:1239e9b70ca2 5645 FinishHandShakeInfo(&ssl->handShakeInfo, ssl);
wolfSSL 0:1239e9b70ca2 5646 (hsCb)(&ssl->handShakeInfo);
wolfSSL 0:1239e9b70ca2 5647 ssl->hsInfoOn = 0;
wolfSSL 0:1239e9b70ca2 5648 }
wolfSSL 0:1239e9b70ca2 5649 return ret;
wolfSSL 0:1239e9b70ca2 5650 }
wolfSSL 0:1239e9b70ca2 5651
wolfSSL 0:1239e9b70ca2 5652
wolfSSL 0:1239e9b70ca2 5653 #ifndef NO_CYASSL_CLIENT
wolfSSL 0:1239e9b70ca2 5654
wolfSSL 0:1239e9b70ca2 5655 int CyaSSL_connect_ex(CYASSL* ssl, HandShakeCallBack hsCb,
wolfSSL 0:1239e9b70ca2 5656 TimeoutCallBack toCb, Timeval timeout)
wolfSSL 0:1239e9b70ca2 5657 {
wolfSSL 0:1239e9b70ca2 5658 CYASSL_ENTER("CyaSSL_connect_ex");
wolfSSL 0:1239e9b70ca2 5659 return CyaSSL_ex_wrapper(ssl, hsCb, toCb, timeout);
wolfSSL 0:1239e9b70ca2 5660 }
wolfSSL 0:1239e9b70ca2 5661
wolfSSL 0:1239e9b70ca2 5662 #endif
wolfSSL 0:1239e9b70ca2 5663
wolfSSL 0:1239e9b70ca2 5664
wolfSSL 0:1239e9b70ca2 5665 #ifndef NO_CYASSL_SERVER
wolfSSL 0:1239e9b70ca2 5666
wolfSSL 0:1239e9b70ca2 5667 int CyaSSL_accept_ex(CYASSL* ssl, HandShakeCallBack hsCb,
wolfSSL 0:1239e9b70ca2 5668 TimeoutCallBack toCb,Timeval timeout)
wolfSSL 0:1239e9b70ca2 5669 {
wolfSSL 0:1239e9b70ca2 5670 CYASSL_ENTER("CyaSSL_accept_ex");
wolfSSL 0:1239e9b70ca2 5671 return CyaSSL_ex_wrapper(ssl, hsCb, toCb, timeout);
wolfSSL 0:1239e9b70ca2 5672 }
wolfSSL 0:1239e9b70ca2 5673
wolfSSL 0:1239e9b70ca2 5674 #endif
wolfSSL 0:1239e9b70ca2 5675
wolfSSL 0:1239e9b70ca2 5676 #endif /* CYASSL_CALLBACKS */
wolfSSL 0:1239e9b70ca2 5677
wolfSSL 0:1239e9b70ca2 5678
wolfSSL 0:1239e9b70ca2 5679 #ifndef NO_PSK
wolfSSL 0:1239e9b70ca2 5680
wolfSSL 0:1239e9b70ca2 5681 void CyaSSL_CTX_set_psk_client_callback(CYASSL_CTX* ctx,
wolfSSL 0:1239e9b70ca2 5682 psk_client_callback cb)
wolfSSL 0:1239e9b70ca2 5683 {
wolfSSL 0:1239e9b70ca2 5684 CYASSL_ENTER("SSL_CTX_set_psk_client_callback");
wolfSSL 0:1239e9b70ca2 5685 ctx->havePSK = 1;
wolfSSL 0:1239e9b70ca2 5686 ctx->client_psk_cb = cb;
wolfSSL 0:1239e9b70ca2 5687 }
wolfSSL 0:1239e9b70ca2 5688
wolfSSL 0:1239e9b70ca2 5689
wolfSSL 0:1239e9b70ca2 5690 void CyaSSL_set_psk_client_callback(CYASSL* ssl, psk_client_callback cb)
wolfSSL 0:1239e9b70ca2 5691 {
wolfSSL 0:1239e9b70ca2 5692 byte haveRSA = 1;
wolfSSL 0:1239e9b70ca2 5693
wolfSSL 0:1239e9b70ca2 5694 CYASSL_ENTER("SSL_set_psk_client_callback");
wolfSSL 0:1239e9b70ca2 5695 ssl->options.havePSK = 1;
wolfSSL 0:1239e9b70ca2 5696 ssl->options.client_psk_cb = cb;
wolfSSL 0:1239e9b70ca2 5697
wolfSSL 0:1239e9b70ca2 5698 #ifdef NO_RSA
wolfSSL 0:1239e9b70ca2 5699 haveRSA = 0;
wolfSSL 0:1239e9b70ca2 5700 #endif
wolfSSL 0:1239e9b70ca2 5701 InitSuites(ssl->suites, ssl->version, haveRSA, TRUE,
wolfSSL 0:1239e9b70ca2 5702 ssl->options.haveDH, ssl->options.haveNTRU,
wolfSSL 0:1239e9b70ca2 5703 ssl->options.haveECDSAsig, ssl->options.haveStaticECC,
wolfSSL 0:1239e9b70ca2 5704 ssl->options.side);
wolfSSL 0:1239e9b70ca2 5705 }
wolfSSL 0:1239e9b70ca2 5706
wolfSSL 0:1239e9b70ca2 5707
wolfSSL 0:1239e9b70ca2 5708 void CyaSSL_CTX_set_psk_server_callback(CYASSL_CTX* ctx,
wolfSSL 0:1239e9b70ca2 5709 psk_server_callback cb)
wolfSSL 0:1239e9b70ca2 5710 {
wolfSSL 0:1239e9b70ca2 5711 CYASSL_ENTER("SSL_CTX_set_psk_server_callback");
wolfSSL 0:1239e9b70ca2 5712 ctx->havePSK = 1;
wolfSSL 0:1239e9b70ca2 5713 ctx->server_psk_cb = cb;
wolfSSL 0:1239e9b70ca2 5714 }
wolfSSL 0:1239e9b70ca2 5715
wolfSSL 0:1239e9b70ca2 5716
wolfSSL 0:1239e9b70ca2 5717 void CyaSSL_set_psk_server_callback(CYASSL* ssl, psk_server_callback cb)
wolfSSL 0:1239e9b70ca2 5718 {
wolfSSL 0:1239e9b70ca2 5719 byte haveRSA = 1;
wolfSSL 0:1239e9b70ca2 5720
wolfSSL 0:1239e9b70ca2 5721 CYASSL_ENTER("SSL_set_psk_server_callback");
wolfSSL 0:1239e9b70ca2 5722 ssl->options.havePSK = 1;
wolfSSL 0:1239e9b70ca2 5723 ssl->options.server_psk_cb = cb;
wolfSSL 0:1239e9b70ca2 5724
wolfSSL 0:1239e9b70ca2 5725 #ifdef NO_RSA
wolfSSL 0:1239e9b70ca2 5726 haveRSA = 0;
wolfSSL 0:1239e9b70ca2 5727 #endif
wolfSSL 0:1239e9b70ca2 5728 InitSuites(ssl->suites, ssl->version, haveRSA, TRUE,
wolfSSL 0:1239e9b70ca2 5729 ssl->options.haveDH, ssl->options.haveNTRU,
wolfSSL 0:1239e9b70ca2 5730 ssl->options.haveECDSAsig, ssl->options.haveStaticECC,
wolfSSL 0:1239e9b70ca2 5731 ssl->options.side);
wolfSSL 0:1239e9b70ca2 5732 }
wolfSSL 0:1239e9b70ca2 5733
wolfSSL 0:1239e9b70ca2 5734
wolfSSL 0:1239e9b70ca2 5735 const char* CyaSSL_get_psk_identity_hint(const CYASSL* ssl)
wolfSSL 0:1239e9b70ca2 5736 {
wolfSSL 0:1239e9b70ca2 5737 CYASSL_ENTER("SSL_get_psk_identity_hint");
wolfSSL 0:1239e9b70ca2 5738
wolfSSL 0:1239e9b70ca2 5739 if (ssl == NULL || ssl->arrays == NULL)
wolfSSL 0:1239e9b70ca2 5740 return NULL;
wolfSSL 0:1239e9b70ca2 5741
wolfSSL 0:1239e9b70ca2 5742 return ssl->arrays->server_hint;
wolfSSL 0:1239e9b70ca2 5743 }
wolfSSL 0:1239e9b70ca2 5744
wolfSSL 0:1239e9b70ca2 5745
wolfSSL 0:1239e9b70ca2 5746 const char* CyaSSL_get_psk_identity(const CYASSL* ssl)
wolfSSL 0:1239e9b70ca2 5747 {
wolfSSL 0:1239e9b70ca2 5748 CYASSL_ENTER("SSL_get_psk_identity");
wolfSSL 0:1239e9b70ca2 5749
wolfSSL 0:1239e9b70ca2 5750 if (ssl == NULL || ssl->arrays == NULL)
wolfSSL 0:1239e9b70ca2 5751 return NULL;
wolfSSL 0:1239e9b70ca2 5752
wolfSSL 0:1239e9b70ca2 5753 return ssl->arrays->client_identity;
wolfSSL 0:1239e9b70ca2 5754 }
wolfSSL 0:1239e9b70ca2 5755
wolfSSL 0:1239e9b70ca2 5756
wolfSSL 0:1239e9b70ca2 5757 int CyaSSL_CTX_use_psk_identity_hint(CYASSL_CTX* ctx, const char* hint)
wolfSSL 0:1239e9b70ca2 5758 {
wolfSSL 0:1239e9b70ca2 5759 CYASSL_ENTER("SSL_CTX_use_psk_identity_hint");
wolfSSL 0:1239e9b70ca2 5760 if (hint == 0)
wolfSSL 0:1239e9b70ca2 5761 ctx->server_hint[0] = 0;
wolfSSL 0:1239e9b70ca2 5762 else {
wolfSSL 0:1239e9b70ca2 5763 XSTRNCPY(ctx->server_hint, hint, MAX_PSK_ID_LEN);
wolfSSL 0:1239e9b70ca2 5764 ctx->server_hint[MAX_PSK_ID_LEN - 1] = '\0';
wolfSSL 0:1239e9b70ca2 5765 }
wolfSSL 0:1239e9b70ca2 5766 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 5767 }
wolfSSL 0:1239e9b70ca2 5768
wolfSSL 0:1239e9b70ca2 5769
wolfSSL 0:1239e9b70ca2 5770 int CyaSSL_use_psk_identity_hint(CYASSL* ssl, const char* hint)
wolfSSL 0:1239e9b70ca2 5771 {
wolfSSL 0:1239e9b70ca2 5772 CYASSL_ENTER("SSL_use_psk_identity_hint");
wolfSSL 0:1239e9b70ca2 5773
wolfSSL 0:1239e9b70ca2 5774 if (ssl == NULL || ssl->arrays == NULL)
wolfSSL 0:1239e9b70ca2 5775 return SSL_FAILURE;
wolfSSL 0:1239e9b70ca2 5776
wolfSSL 0:1239e9b70ca2 5777 if (hint == 0)
wolfSSL 0:1239e9b70ca2 5778 ssl->arrays->server_hint[0] = 0;
wolfSSL 0:1239e9b70ca2 5779 else {
wolfSSL 0:1239e9b70ca2 5780 XSTRNCPY(ssl->arrays->server_hint, hint, MAX_PSK_ID_LEN);
wolfSSL 0:1239e9b70ca2 5781 ssl->arrays->server_hint[MAX_PSK_ID_LEN - 1] = '\0';
wolfSSL 0:1239e9b70ca2 5782 }
wolfSSL 0:1239e9b70ca2 5783 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 5784 }
wolfSSL 0:1239e9b70ca2 5785
wolfSSL 0:1239e9b70ca2 5786 #endif /* NO_PSK */
wolfSSL 0:1239e9b70ca2 5787
wolfSSL 0:1239e9b70ca2 5788
wolfSSL 0:1239e9b70ca2 5789 #ifndef NO_CERTS
wolfSSL 0:1239e9b70ca2 5790 /* used to be defined on NO_FILESYSTEM only, but are generally useful */
wolfSSL 0:1239e9b70ca2 5791
wolfSSL 0:1239e9b70ca2 5792 /* CyaSSL extension allows DER files to be loaded from buffers as well */
wolfSSL 0:1239e9b70ca2 5793 int CyaSSL_CTX_load_verify_buffer(CYASSL_CTX* ctx, const unsigned char* in,
wolfSSL 0:1239e9b70ca2 5794 long sz, int format)
wolfSSL 0:1239e9b70ca2 5795 {
wolfSSL 0:1239e9b70ca2 5796 CYASSL_ENTER("CyaSSL_CTX_load_verify_buffer");
wolfSSL 0:1239e9b70ca2 5797 if (format == SSL_FILETYPE_PEM)
wolfSSL 0:1239e9b70ca2 5798 return ProcessChainBuffer(ctx, in, sz, format, CA_TYPE, NULL);
wolfSSL 0:1239e9b70ca2 5799 else
wolfSSL 0:1239e9b70ca2 5800 return ProcessBuffer(ctx, in, sz, format, CA_TYPE, NULL,NULL,0);
wolfSSL 0:1239e9b70ca2 5801 }
wolfSSL 0:1239e9b70ca2 5802
wolfSSL 0:1239e9b70ca2 5803
wolfSSL 0:1239e9b70ca2 5804 int CyaSSL_CTX_use_certificate_buffer(CYASSL_CTX* ctx,
wolfSSL 0:1239e9b70ca2 5805 const unsigned char* in, long sz, int format)
wolfSSL 0:1239e9b70ca2 5806 {
wolfSSL 0:1239e9b70ca2 5807 CYASSL_ENTER("CyaSSL_CTX_use_certificate_buffer");
wolfSSL 0:1239e9b70ca2 5808 return ProcessBuffer(ctx, in, sz, format, CERT_TYPE, NULL, NULL, 0);
wolfSSL 0:1239e9b70ca2 5809 }
wolfSSL 0:1239e9b70ca2 5810
wolfSSL 0:1239e9b70ca2 5811
wolfSSL 0:1239e9b70ca2 5812 int CyaSSL_CTX_use_PrivateKey_buffer(CYASSL_CTX* ctx,
wolfSSL 0:1239e9b70ca2 5813 const unsigned char* in, long sz, int format)
wolfSSL 0:1239e9b70ca2 5814 {
wolfSSL 0:1239e9b70ca2 5815 CYASSL_ENTER("CyaSSL_CTX_use_PrivateKey_buffer");
wolfSSL 0:1239e9b70ca2 5816 return ProcessBuffer(ctx, in, sz, format, PRIVATEKEY_TYPE, NULL,NULL,0);
wolfSSL 0:1239e9b70ca2 5817 }
wolfSSL 0:1239e9b70ca2 5818
wolfSSL 0:1239e9b70ca2 5819
wolfSSL 0:1239e9b70ca2 5820 int CyaSSL_CTX_use_certificate_chain_buffer(CYASSL_CTX* ctx,
wolfSSL 0:1239e9b70ca2 5821 const unsigned char* in, long sz)
wolfSSL 0:1239e9b70ca2 5822 {
wolfSSL 0:1239e9b70ca2 5823 CYASSL_ENTER("CyaSSL_CTX_use_certificate_chain_buffer");
wolfSSL 0:1239e9b70ca2 5824 return ProcessBuffer(ctx, in, sz, SSL_FILETYPE_PEM, CERT_TYPE, NULL,
wolfSSL 0:1239e9b70ca2 5825 NULL, 1);
wolfSSL 0:1239e9b70ca2 5826 }
wolfSSL 0:1239e9b70ca2 5827
wolfSSL 0:1239e9b70ca2 5828 int CyaSSL_use_certificate_buffer(CYASSL* ssl,
wolfSSL 0:1239e9b70ca2 5829 const unsigned char* in, long sz, int format)
wolfSSL 0:1239e9b70ca2 5830 {
wolfSSL 0:1239e9b70ca2 5831 CYASSL_ENTER("CyaSSL_use_certificate_buffer");
wolfSSL 0:1239e9b70ca2 5832 return ProcessBuffer(ssl->ctx, in, sz, format,CERT_TYPE,ssl,NULL,0);
wolfSSL 0:1239e9b70ca2 5833 }
wolfSSL 0:1239e9b70ca2 5834
wolfSSL 0:1239e9b70ca2 5835
wolfSSL 0:1239e9b70ca2 5836 int CyaSSL_use_PrivateKey_buffer(CYASSL* ssl,
wolfSSL 0:1239e9b70ca2 5837 const unsigned char* in, long sz, int format)
wolfSSL 0:1239e9b70ca2 5838 {
wolfSSL 0:1239e9b70ca2 5839 CYASSL_ENTER("CyaSSL_use_PrivateKey_buffer");
wolfSSL 0:1239e9b70ca2 5840 return ProcessBuffer(ssl->ctx, in, sz, format, PRIVATEKEY_TYPE,
wolfSSL 0:1239e9b70ca2 5841 ssl, NULL, 0);
wolfSSL 0:1239e9b70ca2 5842 }
wolfSSL 0:1239e9b70ca2 5843
wolfSSL 0:1239e9b70ca2 5844
wolfSSL 0:1239e9b70ca2 5845 int CyaSSL_use_certificate_chain_buffer(CYASSL* ssl,
wolfSSL 0:1239e9b70ca2 5846 const unsigned char* in, long sz)
wolfSSL 0:1239e9b70ca2 5847 {
wolfSSL 0:1239e9b70ca2 5848 CYASSL_ENTER("CyaSSL_use_certificate_chain_buffer");
wolfSSL 0:1239e9b70ca2 5849 return ProcessBuffer(ssl->ctx, in, sz, SSL_FILETYPE_PEM, CERT_TYPE,
wolfSSL 0:1239e9b70ca2 5850 ssl, NULL, 1);
wolfSSL 0:1239e9b70ca2 5851 }
wolfSSL 0:1239e9b70ca2 5852
wolfSSL 0:1239e9b70ca2 5853
wolfSSL 0:1239e9b70ca2 5854 /* unload any certs or keys that SSL owns, leave CTX as is
wolfSSL 0:1239e9b70ca2 5855 SSL_SUCCESS on ok */
wolfSSL 0:1239e9b70ca2 5856 int CyaSSL_UnloadCertsKeys(CYASSL* ssl)
wolfSSL 0:1239e9b70ca2 5857 {
wolfSSL 0:1239e9b70ca2 5858 if (ssl == NULL) {
wolfSSL 0:1239e9b70ca2 5859 CYASSL_MSG("Null function arg");
wolfSSL 0:1239e9b70ca2 5860 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 5861 }
wolfSSL 0:1239e9b70ca2 5862
wolfSSL 0:1239e9b70ca2 5863 if (ssl->buffers.weOwnCert) {
wolfSSL 0:1239e9b70ca2 5864 CYASSL_MSG("Unloading cert");
wolfSSL 0:1239e9b70ca2 5865 XFREE(ssl->buffers.certificate.buffer, ssl->heap,DYNAMIC_TYPE_CERT);
wolfSSL 0:1239e9b70ca2 5866 ssl->buffers.weOwnCert = 0;
wolfSSL 0:1239e9b70ca2 5867 ssl->buffers.certificate.length = 0;
wolfSSL 0:1239e9b70ca2 5868 ssl->buffers.certificate.buffer = NULL;
wolfSSL 0:1239e9b70ca2 5869 }
wolfSSL 0:1239e9b70ca2 5870
wolfSSL 0:1239e9b70ca2 5871 if (ssl->buffers.weOwnKey) {
wolfSSL 0:1239e9b70ca2 5872 CYASSL_MSG("Unloading key");
wolfSSL 0:1239e9b70ca2 5873 XFREE(ssl->buffers.key.buffer, ssl->heap, DYNAMIC_TYPE_KEY);
wolfSSL 0:1239e9b70ca2 5874 ssl->buffers.weOwnKey = 0;
wolfSSL 0:1239e9b70ca2 5875 ssl->buffers.key.length = 0;
wolfSSL 0:1239e9b70ca2 5876 ssl->buffers.key.buffer = NULL;
wolfSSL 0:1239e9b70ca2 5877 }
wolfSSL 0:1239e9b70ca2 5878
wolfSSL 0:1239e9b70ca2 5879 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 5880 }
wolfSSL 0:1239e9b70ca2 5881
wolfSSL 0:1239e9b70ca2 5882
wolfSSL 0:1239e9b70ca2 5883 int CyaSSL_CTX_UnloadCAs(CYASSL_CTX* ctx)
wolfSSL 0:1239e9b70ca2 5884 {
wolfSSL 0:1239e9b70ca2 5885 CYASSL_ENTER("CyaSSL_CTX_UnloadCAs");
wolfSSL 0:1239e9b70ca2 5886
wolfSSL 0:1239e9b70ca2 5887 if (ctx == NULL)
wolfSSL 0:1239e9b70ca2 5888 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 5889
wolfSSL 0:1239e9b70ca2 5890 return CyaSSL_CertManagerUnloadCAs(ctx->cm);
wolfSSL 0:1239e9b70ca2 5891 }
wolfSSL 0:1239e9b70ca2 5892
wolfSSL 0:1239e9b70ca2 5893 /* old NO_FILESYSTEM end */
wolfSSL 0:1239e9b70ca2 5894 #endif /* !NO_CERTS */
wolfSSL 0:1239e9b70ca2 5895
wolfSSL 0:1239e9b70ca2 5896
wolfSSL 0:1239e9b70ca2 5897 #if defined(OPENSSL_EXTRA) || defined(GOAHEAD_WS)
wolfSSL 0:1239e9b70ca2 5898
wolfSSL 0:1239e9b70ca2 5899
wolfSSL 0:1239e9b70ca2 5900 int CyaSSL_add_all_algorithms(void)
wolfSSL 0:1239e9b70ca2 5901 {
wolfSSL 0:1239e9b70ca2 5902 CYASSL_ENTER("CyaSSL_add_all_algorithms");
wolfSSL 0:1239e9b70ca2 5903 CyaSSL_Init();
wolfSSL 0:1239e9b70ca2 5904 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 5905 }
wolfSSL 0:1239e9b70ca2 5906
wolfSSL 0:1239e9b70ca2 5907
wolfSSL 0:1239e9b70ca2 5908 long CyaSSL_CTX_sess_set_cache_size(CYASSL_CTX* ctx, long sz)
wolfSSL 0:1239e9b70ca2 5909 {
wolfSSL 0:1239e9b70ca2 5910 /* cache size fixed at compile time in CyaSSL */
wolfSSL 0:1239e9b70ca2 5911 (void)ctx;
wolfSSL 0:1239e9b70ca2 5912 (void)sz;
wolfSSL 0:1239e9b70ca2 5913 return 0;
wolfSSL 0:1239e9b70ca2 5914 }
wolfSSL 0:1239e9b70ca2 5915
wolfSSL 0:1239e9b70ca2 5916
wolfSSL 0:1239e9b70ca2 5917 void CyaSSL_CTX_set_quiet_shutdown(CYASSL_CTX* ctx, int mode)
wolfSSL 0:1239e9b70ca2 5918 {
wolfSSL 0:1239e9b70ca2 5919 CYASSL_ENTER("CyaSSL_CTX_set_quiet_shutdown");
wolfSSL 0:1239e9b70ca2 5920 if (mode)
wolfSSL 0:1239e9b70ca2 5921 ctx->quietShutdown = 1;
wolfSSL 0:1239e9b70ca2 5922 }
wolfSSL 0:1239e9b70ca2 5923
wolfSSL 0:1239e9b70ca2 5924
wolfSSL 0:1239e9b70ca2 5925 void CyaSSL_set_quiet_shutdown(CYASSL* ssl, int mode)
wolfSSL 0:1239e9b70ca2 5926 {
wolfSSL 0:1239e9b70ca2 5927 CYASSL_ENTER("CyaSSL_CTX_set_quiet_shutdown");
wolfSSL 0:1239e9b70ca2 5928 if (mode)
wolfSSL 0:1239e9b70ca2 5929 ssl->options.quietShutdown = 1;
wolfSSL 0:1239e9b70ca2 5930 }
wolfSSL 0:1239e9b70ca2 5931
wolfSSL 0:1239e9b70ca2 5932
wolfSSL 0:1239e9b70ca2 5933 void CyaSSL_set_bio(CYASSL* ssl, CYASSL_BIO* rd, CYASSL_BIO* wr)
wolfSSL 0:1239e9b70ca2 5934 {
wolfSSL 0:1239e9b70ca2 5935 CYASSL_ENTER("SSL_set_bio");
wolfSSL 0:1239e9b70ca2 5936 CyaSSL_set_rfd(ssl, rd->fd);
wolfSSL 0:1239e9b70ca2 5937 CyaSSL_set_wfd(ssl, wr->fd);
wolfSSL 0:1239e9b70ca2 5938
wolfSSL 0:1239e9b70ca2 5939 ssl->biord = rd;
wolfSSL 0:1239e9b70ca2 5940 ssl->biowr = wr;
wolfSSL 0:1239e9b70ca2 5941 }
wolfSSL 0:1239e9b70ca2 5942
wolfSSL 0:1239e9b70ca2 5943
wolfSSL 0:1239e9b70ca2 5944 void CyaSSL_CTX_set_client_CA_list(CYASSL_CTX* ctx,
wolfSSL 0:1239e9b70ca2 5945 STACK_OF(CYASSL_X509_NAME)* names)
wolfSSL 0:1239e9b70ca2 5946 {
wolfSSL 0:1239e9b70ca2 5947 (void)ctx;
wolfSSL 0:1239e9b70ca2 5948 (void)names;
wolfSSL 0:1239e9b70ca2 5949 }
wolfSSL 0:1239e9b70ca2 5950
wolfSSL 0:1239e9b70ca2 5951
wolfSSL 0:1239e9b70ca2 5952 STACK_OF(CYASSL_X509_NAME)* CyaSSL_load_client_CA_file(const char* fname)
wolfSSL 0:1239e9b70ca2 5953 {
wolfSSL 0:1239e9b70ca2 5954 (void)fname;
wolfSSL 0:1239e9b70ca2 5955 return 0;
wolfSSL 0:1239e9b70ca2 5956 }
wolfSSL 0:1239e9b70ca2 5957
wolfSSL 0:1239e9b70ca2 5958
wolfSSL 0:1239e9b70ca2 5959 int CyaSSL_CTX_set_default_verify_paths(CYASSL_CTX* ctx)
wolfSSL 0:1239e9b70ca2 5960 {
wolfSSL 0:1239e9b70ca2 5961 /* TODO:, not needed in goahead */
wolfSSL 0:1239e9b70ca2 5962 (void)ctx;
wolfSSL 0:1239e9b70ca2 5963 return SSL_NOT_IMPLEMENTED;
wolfSSL 0:1239e9b70ca2 5964 }
wolfSSL 0:1239e9b70ca2 5965
wolfSSL 0:1239e9b70ca2 5966
wolfSSL 0:1239e9b70ca2 5967 /* keyblock size in bytes or -1 */
wolfSSL 0:1239e9b70ca2 5968 int CyaSSL_get_keyblock_size(CYASSL* ssl)
wolfSSL 0:1239e9b70ca2 5969 {
wolfSSL 0:1239e9b70ca2 5970 if (ssl == NULL)
wolfSSL 0:1239e9b70ca2 5971 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 5972
wolfSSL 0:1239e9b70ca2 5973 return 2 * (ssl->specs.key_size + ssl->specs.iv_size +
wolfSSL 0:1239e9b70ca2 5974 ssl->specs.hash_size);
wolfSSL 0:1239e9b70ca2 5975 }
wolfSSL 0:1239e9b70ca2 5976
wolfSSL 0:1239e9b70ca2 5977
wolfSSL 0:1239e9b70ca2 5978 /* store keys returns SSL_SUCCESS or -1 on error */
wolfSSL 0:1239e9b70ca2 5979 int CyaSSL_get_keys(CYASSL* ssl, unsigned char** ms, unsigned int* msLen,
wolfSSL 0:1239e9b70ca2 5980 unsigned char** sr, unsigned int* srLen,
wolfSSL 0:1239e9b70ca2 5981 unsigned char** cr, unsigned int* crLen)
wolfSSL 0:1239e9b70ca2 5982 {
wolfSSL 0:1239e9b70ca2 5983 if (ssl == NULL || ssl->arrays == NULL)
wolfSSL 0:1239e9b70ca2 5984 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 5985
wolfSSL 0:1239e9b70ca2 5986 *ms = ssl->arrays->masterSecret;
wolfSSL 0:1239e9b70ca2 5987 *sr = ssl->arrays->serverRandom;
wolfSSL 0:1239e9b70ca2 5988 *cr = ssl->arrays->clientRandom;
wolfSSL 0:1239e9b70ca2 5989
wolfSSL 0:1239e9b70ca2 5990 *msLen = SECRET_LEN;
wolfSSL 0:1239e9b70ca2 5991 *srLen = RAN_LEN;
wolfSSL 0:1239e9b70ca2 5992 *crLen = RAN_LEN;
wolfSSL 0:1239e9b70ca2 5993
wolfSSL 0:1239e9b70ca2 5994 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 5995 }
wolfSSL 0:1239e9b70ca2 5996
wolfSSL 0:1239e9b70ca2 5997
wolfSSL 0:1239e9b70ca2 5998 void CyaSSL_set_accept_state(CYASSL* ssl)
wolfSSL 0:1239e9b70ca2 5999 {
wolfSSL 0:1239e9b70ca2 6000 byte haveRSA = 1;
wolfSSL 0:1239e9b70ca2 6001 byte havePSK = 0;
wolfSSL 0:1239e9b70ca2 6002
wolfSSL 0:1239e9b70ca2 6003 CYASSL_ENTER("SSL_set_accept_state");
wolfSSL 0:1239e9b70ca2 6004 ssl->options.side = CYASSL_SERVER_END;
wolfSSL 0:1239e9b70ca2 6005 /* reset suites in case user switched */
wolfSSL 0:1239e9b70ca2 6006
wolfSSL 0:1239e9b70ca2 6007 #ifdef NO_RSA
wolfSSL 0:1239e9b70ca2 6008 haveRSA = 0;
wolfSSL 0:1239e9b70ca2 6009 #endif
wolfSSL 0:1239e9b70ca2 6010 #ifndef NO_PSK
wolfSSL 0:1239e9b70ca2 6011 havePSK = ssl->options.havePSK;
wolfSSL 0:1239e9b70ca2 6012 #endif
wolfSSL 0:1239e9b70ca2 6013 InitSuites(ssl->suites, ssl->version, haveRSA, havePSK,
wolfSSL 0:1239e9b70ca2 6014 ssl->options.haveDH, ssl->options.haveNTRU,
wolfSSL 0:1239e9b70ca2 6015 ssl->options.haveECDSAsig, ssl->options.haveStaticECC,
wolfSSL 0:1239e9b70ca2 6016 ssl->options.side);
wolfSSL 0:1239e9b70ca2 6017 }
wolfSSL 0:1239e9b70ca2 6018 #endif
wolfSSL 0:1239e9b70ca2 6019
wolfSSL 0:1239e9b70ca2 6020 /* return true if connection established */
wolfSSL 0:1239e9b70ca2 6021 int CyaSSL_is_init_finished(CYASSL* ssl)
wolfSSL 0:1239e9b70ca2 6022 {
wolfSSL 0:1239e9b70ca2 6023 if (ssl == NULL)
wolfSSL 0:1239e9b70ca2 6024 return 0;
wolfSSL 0:1239e9b70ca2 6025
wolfSSL 0:1239e9b70ca2 6026 if (ssl->options.handShakeState == HANDSHAKE_DONE)
wolfSSL 0:1239e9b70ca2 6027 return 1;
wolfSSL 0:1239e9b70ca2 6028
wolfSSL 0:1239e9b70ca2 6029 return 0;
wolfSSL 0:1239e9b70ca2 6030 }
wolfSSL 0:1239e9b70ca2 6031
wolfSSL 0:1239e9b70ca2 6032 #if defined(OPENSSL_EXTRA) || defined(GOAHEAD_WS)
wolfSSL 0:1239e9b70ca2 6033 void CyaSSL_CTX_set_tmp_rsa_callback(CYASSL_CTX* ctx,
wolfSSL 0:1239e9b70ca2 6034 CYASSL_RSA*(*f)(CYASSL*, int, int))
wolfSSL 0:1239e9b70ca2 6035 {
wolfSSL 0:1239e9b70ca2 6036 /* CyaSSL verifies all these internally */
wolfSSL 0:1239e9b70ca2 6037 (void)ctx;
wolfSSL 0:1239e9b70ca2 6038 (void)f;
wolfSSL 0:1239e9b70ca2 6039 }
wolfSSL 0:1239e9b70ca2 6040
wolfSSL 0:1239e9b70ca2 6041
wolfSSL 0:1239e9b70ca2 6042 void CyaSSL_set_shutdown(CYASSL* ssl, int opt)
wolfSSL 0:1239e9b70ca2 6043 {
wolfSSL 0:1239e9b70ca2 6044 (void)ssl;
wolfSSL 0:1239e9b70ca2 6045 (void)opt;
wolfSSL 0:1239e9b70ca2 6046 }
wolfSSL 0:1239e9b70ca2 6047
wolfSSL 0:1239e9b70ca2 6048
wolfSSL 0:1239e9b70ca2 6049 long CyaSSL_CTX_set_options(CYASSL_CTX* ctx, long opt)
wolfSSL 0:1239e9b70ca2 6050 {
wolfSSL 0:1239e9b70ca2 6051 /* goahead calls with 0, do nothing */
wolfSSL 0:1239e9b70ca2 6052 CYASSL_ENTER("SSL_CTX_set_options");
wolfSSL 0:1239e9b70ca2 6053 (void)ctx;
wolfSSL 0:1239e9b70ca2 6054 return opt;
wolfSSL 0:1239e9b70ca2 6055 }
wolfSSL 0:1239e9b70ca2 6056
wolfSSL 0:1239e9b70ca2 6057
wolfSSL 0:1239e9b70ca2 6058 int CyaSSL_set_rfd(CYASSL* ssl, int rfd)
wolfSSL 0:1239e9b70ca2 6059 {
wolfSSL 0:1239e9b70ca2 6060 CYASSL_ENTER("SSL_set_rfd");
wolfSSL 0:1239e9b70ca2 6061 ssl->rfd = rfd; /* not used directly to allow IO callbacks */
wolfSSL 0:1239e9b70ca2 6062
wolfSSL 0:1239e9b70ca2 6063 ssl->IOCB_ReadCtx = &ssl->rfd;
wolfSSL 0:1239e9b70ca2 6064
wolfSSL 0:1239e9b70ca2 6065 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 6066 }
wolfSSL 0:1239e9b70ca2 6067
wolfSSL 0:1239e9b70ca2 6068
wolfSSL 0:1239e9b70ca2 6069 int CyaSSL_set_wfd(CYASSL* ssl, int wfd)
wolfSSL 0:1239e9b70ca2 6070 {
wolfSSL 0:1239e9b70ca2 6071 CYASSL_ENTER("SSL_set_wfd");
wolfSSL 0:1239e9b70ca2 6072 ssl->wfd = wfd; /* not used directly to allow IO callbacks */
wolfSSL 0:1239e9b70ca2 6073
wolfSSL 0:1239e9b70ca2 6074 ssl->IOCB_WriteCtx = &ssl->wfd;
wolfSSL 0:1239e9b70ca2 6075
wolfSSL 0:1239e9b70ca2 6076 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 6077 }
wolfSSL 0:1239e9b70ca2 6078
wolfSSL 0:1239e9b70ca2 6079
wolfSSL 0:1239e9b70ca2 6080 CYASSL_RSA* CyaSSL_RSA_generate_key(int len, unsigned long bits,
wolfSSL 0:1239e9b70ca2 6081 void(*f)(int, int, void*), void* data)
wolfSSL 0:1239e9b70ca2 6082 {
wolfSSL 0:1239e9b70ca2 6083 /* no tmp key needed, actual generation not supported */
wolfSSL 0:1239e9b70ca2 6084 CYASSL_ENTER("RSA_generate_key");
wolfSSL 0:1239e9b70ca2 6085 (void)len;
wolfSSL 0:1239e9b70ca2 6086 (void)bits;
wolfSSL 0:1239e9b70ca2 6087 (void)f;
wolfSSL 0:1239e9b70ca2 6088 (void)data;
wolfSSL 0:1239e9b70ca2 6089 return NULL;
wolfSSL 0:1239e9b70ca2 6090 }
wolfSSL 0:1239e9b70ca2 6091
wolfSSL 0:1239e9b70ca2 6092
wolfSSL 0:1239e9b70ca2 6093
wolfSSL 0:1239e9b70ca2 6094 CYASSL_X509* CyaSSL_X509_STORE_CTX_get_current_cert(
wolfSSL 0:1239e9b70ca2 6095 CYASSL_X509_STORE_CTX* ctx)
wolfSSL 0:1239e9b70ca2 6096 {
wolfSSL 0:1239e9b70ca2 6097 (void)ctx;
wolfSSL 0:1239e9b70ca2 6098 return 0;
wolfSSL 0:1239e9b70ca2 6099 }
wolfSSL 0:1239e9b70ca2 6100
wolfSSL 0:1239e9b70ca2 6101
wolfSSL 0:1239e9b70ca2 6102 int CyaSSL_X509_STORE_CTX_get_error(CYASSL_X509_STORE_CTX* ctx)
wolfSSL 0:1239e9b70ca2 6103 {
wolfSSL 0:1239e9b70ca2 6104 if (ctx != NULL)
wolfSSL 0:1239e9b70ca2 6105 return ctx->error;
wolfSSL 0:1239e9b70ca2 6106 return 0;
wolfSSL 0:1239e9b70ca2 6107 }
wolfSSL 0:1239e9b70ca2 6108
wolfSSL 0:1239e9b70ca2 6109
wolfSSL 0:1239e9b70ca2 6110 int CyaSSL_X509_STORE_CTX_get_error_depth(CYASSL_X509_STORE_CTX* ctx)
wolfSSL 0:1239e9b70ca2 6111 {
wolfSSL 0:1239e9b70ca2 6112 (void)ctx;
wolfSSL 0:1239e9b70ca2 6113 return 0;
wolfSSL 0:1239e9b70ca2 6114 }
wolfSSL 0:1239e9b70ca2 6115
wolfSSL 0:1239e9b70ca2 6116
wolfSSL 0:1239e9b70ca2 6117 CYASSL_BIO_METHOD* CyaSSL_BIO_f_buffer(void)
wolfSSL 0:1239e9b70ca2 6118 {
wolfSSL 0:1239e9b70ca2 6119 static CYASSL_BIO_METHOD meth;
wolfSSL 0:1239e9b70ca2 6120
wolfSSL 0:1239e9b70ca2 6121 CYASSL_ENTER("BIO_f_buffer");
wolfSSL 0:1239e9b70ca2 6122 meth.type = BIO_BUFFER;
wolfSSL 0:1239e9b70ca2 6123
wolfSSL 0:1239e9b70ca2 6124 return &meth;
wolfSSL 0:1239e9b70ca2 6125 }
wolfSSL 0:1239e9b70ca2 6126
wolfSSL 0:1239e9b70ca2 6127
wolfSSL 0:1239e9b70ca2 6128 long CyaSSL_BIO_set_write_buffer_size(CYASSL_BIO* bio, long size)
wolfSSL 0:1239e9b70ca2 6129 {
wolfSSL 0:1239e9b70ca2 6130 /* CyaSSL has internal buffer, compatibility only */
wolfSSL 0:1239e9b70ca2 6131 CYASSL_ENTER("BIO_set_write_buffer_size");
wolfSSL 0:1239e9b70ca2 6132 (void)bio;
wolfSSL 0:1239e9b70ca2 6133 return size;
wolfSSL 0:1239e9b70ca2 6134 }
wolfSSL 0:1239e9b70ca2 6135
wolfSSL 0:1239e9b70ca2 6136
wolfSSL 0:1239e9b70ca2 6137 CYASSL_BIO_METHOD* CyaSSL_BIO_f_ssl(void)
wolfSSL 0:1239e9b70ca2 6138 {
wolfSSL 0:1239e9b70ca2 6139 static CYASSL_BIO_METHOD meth;
wolfSSL 0:1239e9b70ca2 6140
wolfSSL 0:1239e9b70ca2 6141 CYASSL_ENTER("BIO_f_ssl");
wolfSSL 0:1239e9b70ca2 6142 meth.type = BIO_SSL;
wolfSSL 0:1239e9b70ca2 6143
wolfSSL 0:1239e9b70ca2 6144 return &meth;
wolfSSL 0:1239e9b70ca2 6145 }
wolfSSL 0:1239e9b70ca2 6146
wolfSSL 0:1239e9b70ca2 6147
wolfSSL 0:1239e9b70ca2 6148 CYASSL_BIO* CyaSSL_BIO_new_socket(int sfd, int closeF)
wolfSSL 0:1239e9b70ca2 6149 {
wolfSSL 0:1239e9b70ca2 6150 CYASSL_BIO* bio = (CYASSL_BIO*) XMALLOC(sizeof(CYASSL_BIO), 0,
wolfSSL 0:1239e9b70ca2 6151 DYNAMIC_TYPE_OPENSSL);
wolfSSL 0:1239e9b70ca2 6152
wolfSSL 0:1239e9b70ca2 6153 CYASSL_ENTER("BIO_new_socket");
wolfSSL 0:1239e9b70ca2 6154 if (bio) {
wolfSSL 0:1239e9b70ca2 6155 bio->type = BIO_SOCKET;
wolfSSL 0:1239e9b70ca2 6156 bio->close = (byte)closeF;
wolfSSL 0:1239e9b70ca2 6157 bio->eof = 0;
wolfSSL 0:1239e9b70ca2 6158 bio->ssl = 0;
wolfSSL 0:1239e9b70ca2 6159 bio->fd = sfd;
wolfSSL 0:1239e9b70ca2 6160 bio->prev = 0;
wolfSSL 0:1239e9b70ca2 6161 bio->next = 0;
wolfSSL 0:1239e9b70ca2 6162 bio->mem = NULL;
wolfSSL 0:1239e9b70ca2 6163 bio->memLen = 0;
wolfSSL 0:1239e9b70ca2 6164 }
wolfSSL 0:1239e9b70ca2 6165 return bio;
wolfSSL 0:1239e9b70ca2 6166 }
wolfSSL 0:1239e9b70ca2 6167
wolfSSL 0:1239e9b70ca2 6168
wolfSSL 0:1239e9b70ca2 6169 int CyaSSL_BIO_eof(CYASSL_BIO* b)
wolfSSL 0:1239e9b70ca2 6170 {
wolfSSL 0:1239e9b70ca2 6171 CYASSL_ENTER("BIO_eof");
wolfSSL 0:1239e9b70ca2 6172 if (b->eof)
wolfSSL 0:1239e9b70ca2 6173 return 1;
wolfSSL 0:1239e9b70ca2 6174
wolfSSL 0:1239e9b70ca2 6175 return 0;
wolfSSL 0:1239e9b70ca2 6176 }
wolfSSL 0:1239e9b70ca2 6177
wolfSSL 0:1239e9b70ca2 6178
wolfSSL 0:1239e9b70ca2 6179 long CyaSSL_BIO_set_ssl(CYASSL_BIO* b, CYASSL* ssl, int closeF)
wolfSSL 0:1239e9b70ca2 6180 {
wolfSSL 0:1239e9b70ca2 6181 CYASSL_ENTER("BIO_set_ssl");
wolfSSL 0:1239e9b70ca2 6182 b->ssl = ssl;
wolfSSL 0:1239e9b70ca2 6183 b->close = (byte)closeF;
wolfSSL 0:1239e9b70ca2 6184 /* add to ssl for bio free if SSL_free called before/instead of free_all? */
wolfSSL 0:1239e9b70ca2 6185
wolfSSL 0:1239e9b70ca2 6186 return 0;
wolfSSL 0:1239e9b70ca2 6187 }
wolfSSL 0:1239e9b70ca2 6188
wolfSSL 0:1239e9b70ca2 6189
wolfSSL 0:1239e9b70ca2 6190 CYASSL_BIO* CyaSSL_BIO_new(CYASSL_BIO_METHOD* method)
wolfSSL 0:1239e9b70ca2 6191 {
wolfSSL 0:1239e9b70ca2 6192 CYASSL_BIO* bio = (CYASSL_BIO*) XMALLOC(sizeof(CYASSL_BIO), 0,
wolfSSL 0:1239e9b70ca2 6193 DYNAMIC_TYPE_OPENSSL);
wolfSSL 0:1239e9b70ca2 6194 CYASSL_ENTER("BIO_new");
wolfSSL 0:1239e9b70ca2 6195 if (bio) {
wolfSSL 0:1239e9b70ca2 6196 bio->type = method->type;
wolfSSL 0:1239e9b70ca2 6197 bio->close = 0;
wolfSSL 0:1239e9b70ca2 6198 bio->eof = 0;
wolfSSL 0:1239e9b70ca2 6199 bio->ssl = NULL;
wolfSSL 0:1239e9b70ca2 6200 bio->mem = NULL;
wolfSSL 0:1239e9b70ca2 6201 bio->memLen = 0;
wolfSSL 0:1239e9b70ca2 6202 bio->fd = 0;
wolfSSL 0:1239e9b70ca2 6203 bio->prev = NULL;
wolfSSL 0:1239e9b70ca2 6204 bio->next = NULL;
wolfSSL 0:1239e9b70ca2 6205 }
wolfSSL 0:1239e9b70ca2 6206 return bio;
wolfSSL 0:1239e9b70ca2 6207 }
wolfSSL 0:1239e9b70ca2 6208
wolfSSL 0:1239e9b70ca2 6209
wolfSSL 0:1239e9b70ca2 6210 int CyaSSL_BIO_get_mem_data(CYASSL_BIO* bio, const byte** p)
wolfSSL 0:1239e9b70ca2 6211 {
wolfSSL 0:1239e9b70ca2 6212 if (bio == NULL || p == NULL)
wolfSSL 0:1239e9b70ca2 6213 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 6214
wolfSSL 0:1239e9b70ca2 6215 *p = bio->mem;
wolfSSL 0:1239e9b70ca2 6216
wolfSSL 0:1239e9b70ca2 6217 return bio->memLen;
wolfSSL 0:1239e9b70ca2 6218 }
wolfSSL 0:1239e9b70ca2 6219
wolfSSL 0:1239e9b70ca2 6220
wolfSSL 0:1239e9b70ca2 6221 CYASSL_BIO* CyaSSL_BIO_new_mem_buf(void* buf, int len)
wolfSSL 0:1239e9b70ca2 6222 {
wolfSSL 0:1239e9b70ca2 6223 CYASSL_BIO* bio = NULL;
wolfSSL 0:1239e9b70ca2 6224 if (buf == NULL)
wolfSSL 0:1239e9b70ca2 6225 return bio;
wolfSSL 0:1239e9b70ca2 6226
wolfSSL 0:1239e9b70ca2 6227 bio = CyaSSL_BIO_new(CyaSSL_BIO_s_mem());
wolfSSL 0:1239e9b70ca2 6228 if (bio == NULL)
wolfSSL 0:1239e9b70ca2 6229 return bio;
wolfSSL 0:1239e9b70ca2 6230
wolfSSL 0:1239e9b70ca2 6231 bio->memLen = len;
wolfSSL 0:1239e9b70ca2 6232 bio->mem = (byte*)XMALLOC(len, 0, DYNAMIC_TYPE_OPENSSL);
wolfSSL 0:1239e9b70ca2 6233 if (bio->mem == NULL) {
wolfSSL 0:1239e9b70ca2 6234 XFREE(bio, 0, DYNAMIC_TYPE_OPENSSL);
wolfSSL 0:1239e9b70ca2 6235 return NULL;
wolfSSL 0:1239e9b70ca2 6236 }
wolfSSL 0:1239e9b70ca2 6237
wolfSSL 0:1239e9b70ca2 6238 XMEMCPY(bio->mem, buf, len);
wolfSSL 0:1239e9b70ca2 6239
wolfSSL 0:1239e9b70ca2 6240 return bio;
wolfSSL 0:1239e9b70ca2 6241 }
wolfSSL 0:1239e9b70ca2 6242
wolfSSL 0:1239e9b70ca2 6243
wolfSSL 0:1239e9b70ca2 6244 #ifdef USE_WINDOWS_API
wolfSSL 0:1239e9b70ca2 6245 #define CloseSocket(s) closesocket(s)
wolfSSL 0:1239e9b70ca2 6246 #elif defined(CYASSL_MDK_ARM)
wolfSSL 0:1239e9b70ca2 6247 #define CloseSocket(s) closesocket(s)
wolfSSL 0:1239e9b70ca2 6248 extern int closesocket(int) ;
wolfSSL 0:1239e9b70ca2 6249 #else
wolfSSL 0:1239e9b70ca2 6250 #define CloseSocket(s) close(s)
wolfSSL 0:1239e9b70ca2 6251 #endif
wolfSSL 0:1239e9b70ca2 6252
wolfSSL 0:1239e9b70ca2 6253 int CyaSSL_BIO_free(CYASSL_BIO* bio)
wolfSSL 0:1239e9b70ca2 6254 {
wolfSSL 0:1239e9b70ca2 6255 /* unchain?, doesn't matter in goahead since from free all */
wolfSSL 0:1239e9b70ca2 6256 CYASSL_ENTER("BIO_free");
wolfSSL 0:1239e9b70ca2 6257 if (bio) {
wolfSSL 0:1239e9b70ca2 6258 if (bio->close) {
wolfSSL 0:1239e9b70ca2 6259 if (bio->ssl)
wolfSSL 0:1239e9b70ca2 6260 CyaSSL_free(bio->ssl);
wolfSSL 0:1239e9b70ca2 6261 if (bio->fd)
wolfSSL 0:1239e9b70ca2 6262 CloseSocket(bio->fd);
wolfSSL 0:1239e9b70ca2 6263 }
wolfSSL 0:1239e9b70ca2 6264 if (bio->mem)
wolfSSL 0:1239e9b70ca2 6265 XFREE(bio->mem, 0, DYNAMIC_TYPE_OPENSSL);
wolfSSL 0:1239e9b70ca2 6266 XFREE(bio, 0, DYNAMIC_TYPE_OPENSSL);
wolfSSL 0:1239e9b70ca2 6267 }
wolfSSL 0:1239e9b70ca2 6268 return 0;
wolfSSL 0:1239e9b70ca2 6269 }
wolfSSL 0:1239e9b70ca2 6270
wolfSSL 0:1239e9b70ca2 6271
wolfSSL 0:1239e9b70ca2 6272 int CyaSSL_BIO_free_all(CYASSL_BIO* bio)
wolfSSL 0:1239e9b70ca2 6273 {
wolfSSL 0:1239e9b70ca2 6274 CYASSL_ENTER("BIO_free_all");
wolfSSL 0:1239e9b70ca2 6275 while (bio) {
wolfSSL 0:1239e9b70ca2 6276 CYASSL_BIO* next = bio->next;
wolfSSL 0:1239e9b70ca2 6277 CyaSSL_BIO_free(bio);
wolfSSL 0:1239e9b70ca2 6278 bio = next;
wolfSSL 0:1239e9b70ca2 6279 }
wolfSSL 0:1239e9b70ca2 6280 return 0;
wolfSSL 0:1239e9b70ca2 6281 }
wolfSSL 0:1239e9b70ca2 6282
wolfSSL 0:1239e9b70ca2 6283
wolfSSL 0:1239e9b70ca2 6284 int CyaSSL_BIO_read(CYASSL_BIO* bio, void* buf, int len)
wolfSSL 0:1239e9b70ca2 6285 {
wolfSSL 0:1239e9b70ca2 6286 int ret;
wolfSSL 0:1239e9b70ca2 6287 CYASSL* ssl = 0;
wolfSSL 0:1239e9b70ca2 6288 CYASSL_BIO* front = bio;
wolfSSL 0:1239e9b70ca2 6289
wolfSSL 0:1239e9b70ca2 6290 CYASSL_ENTER("BIO_read");
wolfSSL 0:1239e9b70ca2 6291 /* already got eof, again is error */
wolfSSL 0:1239e9b70ca2 6292 if (front->eof)
wolfSSL 0:1239e9b70ca2 6293 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 6294
wolfSSL 0:1239e9b70ca2 6295 while(bio && ((ssl = bio->ssl) == 0) )
wolfSSL 0:1239e9b70ca2 6296 bio = bio->next;
wolfSSL 0:1239e9b70ca2 6297
wolfSSL 0:1239e9b70ca2 6298 if (ssl == 0) return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 6299
wolfSSL 0:1239e9b70ca2 6300 ret = CyaSSL_read(ssl, buf, len);
wolfSSL 0:1239e9b70ca2 6301 if (ret == 0)
wolfSSL 0:1239e9b70ca2 6302 front->eof = 1;
wolfSSL 0:1239e9b70ca2 6303 else if (ret < 0) {
wolfSSL 0:1239e9b70ca2 6304 int err = CyaSSL_get_error(ssl, 0);
wolfSSL 0:1239e9b70ca2 6305 if ( !(err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE) )
wolfSSL 0:1239e9b70ca2 6306 front->eof = 1;
wolfSSL 0:1239e9b70ca2 6307 }
wolfSSL 0:1239e9b70ca2 6308 return ret;
wolfSSL 0:1239e9b70ca2 6309 }
wolfSSL 0:1239e9b70ca2 6310
wolfSSL 0:1239e9b70ca2 6311
wolfSSL 0:1239e9b70ca2 6312 int CyaSSL_BIO_write(CYASSL_BIO* bio, const void* data, int len)
wolfSSL 0:1239e9b70ca2 6313 {
wolfSSL 0:1239e9b70ca2 6314 int ret;
wolfSSL 0:1239e9b70ca2 6315 CYASSL* ssl = 0;
wolfSSL 0:1239e9b70ca2 6316 CYASSL_BIO* front = bio;
wolfSSL 0:1239e9b70ca2 6317
wolfSSL 0:1239e9b70ca2 6318 CYASSL_ENTER("BIO_write");
wolfSSL 0:1239e9b70ca2 6319 /* already got eof, again is error */
wolfSSL 0:1239e9b70ca2 6320 if (front->eof)
wolfSSL 0:1239e9b70ca2 6321 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 6322
wolfSSL 0:1239e9b70ca2 6323 while(bio && ((ssl = bio->ssl) == 0) )
wolfSSL 0:1239e9b70ca2 6324 bio = bio->next;
wolfSSL 0:1239e9b70ca2 6325
wolfSSL 0:1239e9b70ca2 6326 if (ssl == 0) return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 6327
wolfSSL 0:1239e9b70ca2 6328 ret = CyaSSL_write(ssl, data, len);
wolfSSL 0:1239e9b70ca2 6329 if (ret == 0)
wolfSSL 0:1239e9b70ca2 6330 front->eof = 1;
wolfSSL 0:1239e9b70ca2 6331 else if (ret < 0) {
wolfSSL 0:1239e9b70ca2 6332 int err = CyaSSL_get_error(ssl, 0);
wolfSSL 0:1239e9b70ca2 6333 if ( !(err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE) )
wolfSSL 0:1239e9b70ca2 6334 front->eof = 1;
wolfSSL 0:1239e9b70ca2 6335 }
wolfSSL 0:1239e9b70ca2 6336
wolfSSL 0:1239e9b70ca2 6337 return ret;
wolfSSL 0:1239e9b70ca2 6338 }
wolfSSL 0:1239e9b70ca2 6339
wolfSSL 0:1239e9b70ca2 6340
wolfSSL 0:1239e9b70ca2 6341 CYASSL_BIO* CyaSSL_BIO_push(CYASSL_BIO* top, CYASSL_BIO* append)
wolfSSL 0:1239e9b70ca2 6342 {
wolfSSL 0:1239e9b70ca2 6343 CYASSL_ENTER("BIO_push");
wolfSSL 0:1239e9b70ca2 6344 top->next = append;
wolfSSL 0:1239e9b70ca2 6345 append->prev = top;
wolfSSL 0:1239e9b70ca2 6346
wolfSSL 0:1239e9b70ca2 6347 return top;
wolfSSL 0:1239e9b70ca2 6348 }
wolfSSL 0:1239e9b70ca2 6349
wolfSSL 0:1239e9b70ca2 6350
wolfSSL 0:1239e9b70ca2 6351 int CyaSSL_BIO_flush(CYASSL_BIO* bio)
wolfSSL 0:1239e9b70ca2 6352 {
wolfSSL 0:1239e9b70ca2 6353 /* for CyaSSL no flushing needed */
wolfSSL 0:1239e9b70ca2 6354 CYASSL_ENTER("BIO_flush");
wolfSSL 0:1239e9b70ca2 6355 (void)bio;
wolfSSL 0:1239e9b70ca2 6356 return 1;
wolfSSL 0:1239e9b70ca2 6357 }
wolfSSL 0:1239e9b70ca2 6358
wolfSSL 0:1239e9b70ca2 6359
wolfSSL 0:1239e9b70ca2 6360 #endif /* OPENSSL_EXTRA || GOAHEAD_WS */
wolfSSL 0:1239e9b70ca2 6361
wolfSSL 0:1239e9b70ca2 6362
wolfSSL 0:1239e9b70ca2 6363 #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
wolfSSL 0:1239e9b70ca2 6364
wolfSSL 0:1239e9b70ca2 6365 void CyaSSL_CTX_set_default_passwd_cb_userdata(CYASSL_CTX* ctx,
wolfSSL 0:1239e9b70ca2 6366 void* userdata)
wolfSSL 0:1239e9b70ca2 6367 {
wolfSSL 0:1239e9b70ca2 6368 CYASSL_ENTER("SSL_CTX_set_default_passwd_cb_userdata");
wolfSSL 0:1239e9b70ca2 6369 ctx->userdata = userdata;
wolfSSL 0:1239e9b70ca2 6370 }
wolfSSL 0:1239e9b70ca2 6371
wolfSSL 0:1239e9b70ca2 6372
wolfSSL 0:1239e9b70ca2 6373 void CyaSSL_CTX_set_default_passwd_cb(CYASSL_CTX* ctx, pem_password_cb cb)
wolfSSL 0:1239e9b70ca2 6374 {
wolfSSL 0:1239e9b70ca2 6375 CYASSL_ENTER("SSL_CTX_set_default_passwd_cb");
wolfSSL 0:1239e9b70ca2 6376 ctx->passwd_cb = cb;
wolfSSL 0:1239e9b70ca2 6377 }
wolfSSL 0:1239e9b70ca2 6378
wolfSSL 0:1239e9b70ca2 6379 int CyaSSL_num_locks(void)
wolfSSL 0:1239e9b70ca2 6380 {
wolfSSL 0:1239e9b70ca2 6381 return 0;
wolfSSL 0:1239e9b70ca2 6382 }
wolfSSL 0:1239e9b70ca2 6383
wolfSSL 0:1239e9b70ca2 6384 void CyaSSL_set_locking_callback(void (*f)(int, int, const char*, int))
wolfSSL 0:1239e9b70ca2 6385 {
wolfSSL 0:1239e9b70ca2 6386 (void)f;
wolfSSL 0:1239e9b70ca2 6387 }
wolfSSL 0:1239e9b70ca2 6388
wolfSSL 0:1239e9b70ca2 6389 void CyaSSL_set_id_callback(unsigned long (*f)(void))
wolfSSL 0:1239e9b70ca2 6390 {
wolfSSL 0:1239e9b70ca2 6391 (void)f;
wolfSSL 0:1239e9b70ca2 6392 }
wolfSSL 0:1239e9b70ca2 6393
wolfSSL 0:1239e9b70ca2 6394 unsigned long CyaSSL_ERR_get_error(void)
wolfSSL 0:1239e9b70ca2 6395 {
wolfSSL 0:1239e9b70ca2 6396 /* TODO: */
wolfSSL 0:1239e9b70ca2 6397 return 0;
wolfSSL 0:1239e9b70ca2 6398 }
wolfSSL 0:1239e9b70ca2 6399
wolfSSL 0:1239e9b70ca2 6400 int CyaSSL_EVP_BytesToKey(const CYASSL_EVP_CIPHER* type,
wolfSSL 0:1239e9b70ca2 6401 const CYASSL_EVP_MD* md, const byte* salt,
wolfSSL 0:1239e9b70ca2 6402 const byte* data, int sz, int count, byte* key, byte* iv)
wolfSSL 0:1239e9b70ca2 6403 {
wolfSSL 0:1239e9b70ca2 6404 int keyLen = 0;
wolfSSL 0:1239e9b70ca2 6405 int ivLen = 0;
wolfSSL 0:1239e9b70ca2 6406
wolfSSL 0:1239e9b70ca2 6407 Md5 myMD;
wolfSSL 0:1239e9b70ca2 6408 byte digest[MD5_DIGEST_SIZE];
wolfSSL 0:1239e9b70ca2 6409
wolfSSL 0:1239e9b70ca2 6410 int j;
wolfSSL 0:1239e9b70ca2 6411 int keyLeft;
wolfSSL 0:1239e9b70ca2 6412 int ivLeft;
wolfSSL 0:1239e9b70ca2 6413 int keyOutput = 0;
wolfSSL 0:1239e9b70ca2 6414
wolfSSL 0:1239e9b70ca2 6415 CYASSL_ENTER("EVP_BytesToKey");
wolfSSL 0:1239e9b70ca2 6416 InitMd5(&myMD);
wolfSSL 0:1239e9b70ca2 6417
wolfSSL 0:1239e9b70ca2 6418 /* only support MD5 for now */
wolfSSL 0:1239e9b70ca2 6419 if (XSTRNCMP(md, "MD5", 3) != 0) return 0;
wolfSSL 0:1239e9b70ca2 6420
wolfSSL 0:1239e9b70ca2 6421 /* only support CBC DES and AES for now */
wolfSSL 0:1239e9b70ca2 6422 if (XSTRNCMP(type, "DES-CBC", 7) == 0) {
wolfSSL 0:1239e9b70ca2 6423 keyLen = DES_KEY_SIZE;
wolfSSL 0:1239e9b70ca2 6424 ivLen = DES_IV_SIZE;
wolfSSL 0:1239e9b70ca2 6425 }
wolfSSL 0:1239e9b70ca2 6426 else if (XSTRNCMP(type, "DES-EDE3-CBC", 12) == 0) {
wolfSSL 0:1239e9b70ca2 6427 keyLen = DES3_KEY_SIZE;
wolfSSL 0:1239e9b70ca2 6428 ivLen = DES_IV_SIZE;
wolfSSL 0:1239e9b70ca2 6429 }
wolfSSL 0:1239e9b70ca2 6430 else if (XSTRNCMP(type, "AES-128-CBC", 11) == 0) {
wolfSSL 0:1239e9b70ca2 6431 keyLen = AES_128_KEY_SIZE;
wolfSSL 0:1239e9b70ca2 6432 ivLen = AES_IV_SIZE;
wolfSSL 0:1239e9b70ca2 6433 }
wolfSSL 0:1239e9b70ca2 6434 else if (XSTRNCMP(type, "AES-192-CBC", 11) == 0) {
wolfSSL 0:1239e9b70ca2 6435 keyLen = AES_192_KEY_SIZE;
wolfSSL 0:1239e9b70ca2 6436 ivLen = AES_IV_SIZE;
wolfSSL 0:1239e9b70ca2 6437 }
wolfSSL 0:1239e9b70ca2 6438 else if (XSTRNCMP(type, "AES-256-CBC", 11) == 0) {
wolfSSL 0:1239e9b70ca2 6439 keyLen = AES_256_KEY_SIZE;
wolfSSL 0:1239e9b70ca2 6440 ivLen = AES_IV_SIZE;
wolfSSL 0:1239e9b70ca2 6441 }
wolfSSL 0:1239e9b70ca2 6442 else
wolfSSL 0:1239e9b70ca2 6443 return 0;
wolfSSL 0:1239e9b70ca2 6444
wolfSSL 0:1239e9b70ca2 6445 keyLeft = keyLen;
wolfSSL 0:1239e9b70ca2 6446 ivLeft = ivLen;
wolfSSL 0:1239e9b70ca2 6447
wolfSSL 0:1239e9b70ca2 6448 while (keyOutput < (keyLen + ivLen)) {
wolfSSL 0:1239e9b70ca2 6449 int digestLeft = MD5_DIGEST_SIZE;
wolfSSL 0:1239e9b70ca2 6450 /* D_(i - 1) */
wolfSSL 0:1239e9b70ca2 6451 if (keyOutput) /* first time D_0 is empty */
wolfSSL 0:1239e9b70ca2 6452 Md5Update(&myMD, digest, MD5_DIGEST_SIZE);
wolfSSL 0:1239e9b70ca2 6453 /* data */
wolfSSL 0:1239e9b70ca2 6454 Md5Update(&myMD, data, sz);
wolfSSL 0:1239e9b70ca2 6455 /* salt */
wolfSSL 0:1239e9b70ca2 6456 if (salt)
wolfSSL 0:1239e9b70ca2 6457 Md5Update(&myMD, salt, EVP_SALT_SIZE);
wolfSSL 0:1239e9b70ca2 6458 Md5Final(&myMD, digest);
wolfSSL 0:1239e9b70ca2 6459 /* count */
wolfSSL 0:1239e9b70ca2 6460 for (j = 1; j < count; j++) {
wolfSSL 0:1239e9b70ca2 6461 Md5Update(&myMD, digest, MD5_DIGEST_SIZE);
wolfSSL 0:1239e9b70ca2 6462 Md5Final(&myMD, digest);
wolfSSL 0:1239e9b70ca2 6463 }
wolfSSL 0:1239e9b70ca2 6464
wolfSSL 0:1239e9b70ca2 6465 if (keyLeft) {
wolfSSL 0:1239e9b70ca2 6466 int store = min(keyLeft, MD5_DIGEST_SIZE);
wolfSSL 0:1239e9b70ca2 6467 XMEMCPY(&key[keyLen - keyLeft], digest, store);
wolfSSL 0:1239e9b70ca2 6468
wolfSSL 0:1239e9b70ca2 6469 keyOutput += store;
wolfSSL 0:1239e9b70ca2 6470 keyLeft -= store;
wolfSSL 0:1239e9b70ca2 6471 digestLeft -= store;
wolfSSL 0:1239e9b70ca2 6472 }
wolfSSL 0:1239e9b70ca2 6473
wolfSSL 0:1239e9b70ca2 6474 if (ivLeft && digestLeft) {
wolfSSL 0:1239e9b70ca2 6475 int store = min(ivLeft, digestLeft);
wolfSSL 0:1239e9b70ca2 6476 XMEMCPY(&iv[ivLen - ivLeft], &digest[MD5_DIGEST_SIZE -
wolfSSL 0:1239e9b70ca2 6477 digestLeft], store);
wolfSSL 0:1239e9b70ca2 6478 keyOutput += store;
wolfSSL 0:1239e9b70ca2 6479 ivLeft -= store;
wolfSSL 0:1239e9b70ca2 6480 }
wolfSSL 0:1239e9b70ca2 6481 }
wolfSSL 0:1239e9b70ca2 6482 if (keyOutput != (keyLen + ivLen))
wolfSSL 0:1239e9b70ca2 6483 return 0;
wolfSSL 0:1239e9b70ca2 6484 return keyOutput;
wolfSSL 0:1239e9b70ca2 6485 }
wolfSSL 0:1239e9b70ca2 6486
wolfSSL 0:1239e9b70ca2 6487 #endif /* OPENSSL_EXTRA || HAVE_WEBSERVER */
wolfSSL 0:1239e9b70ca2 6488
wolfSSL 0:1239e9b70ca2 6489
wolfSSL 0:1239e9b70ca2 6490 #ifdef OPENSSL_EXTRA
wolfSSL 0:1239e9b70ca2 6491
wolfSSL 0:1239e9b70ca2 6492 unsigned long CyaSSLeay(void)
wolfSSL 0:1239e9b70ca2 6493 {
wolfSSL 0:1239e9b70ca2 6494 return SSLEAY_VERSION_NUMBER;
wolfSSL 0:1239e9b70ca2 6495 }
wolfSSL 0:1239e9b70ca2 6496
wolfSSL 0:1239e9b70ca2 6497
wolfSSL 0:1239e9b70ca2 6498 const char* CyaSSLeay_version(int type)
wolfSSL 0:1239e9b70ca2 6499 {
wolfSSL 0:1239e9b70ca2 6500 static const char* version = "SSLeay CyaSSL compatibility";
wolfSSL 0:1239e9b70ca2 6501 (void)type;
wolfSSL 0:1239e9b70ca2 6502 return version;
wolfSSL 0:1239e9b70ca2 6503 }
wolfSSL 0:1239e9b70ca2 6504
wolfSSL 0:1239e9b70ca2 6505
wolfSSL 0:1239e9b70ca2 6506 void CyaSSL_MD5_Init(CYASSL_MD5_CTX* md5)
wolfSSL 0:1239e9b70ca2 6507 {
wolfSSL 0:1239e9b70ca2 6508 typedef char md5_test[sizeof(MD5_CTX) >= sizeof(Md5) ? 1 : -1];
wolfSSL 0:1239e9b70ca2 6509 (void)sizeof(md5_test);
wolfSSL 0:1239e9b70ca2 6510
wolfSSL 0:1239e9b70ca2 6511 CYASSL_ENTER("MD5_Init");
wolfSSL 0:1239e9b70ca2 6512 InitMd5((Md5*)md5);
wolfSSL 0:1239e9b70ca2 6513 }
wolfSSL 0:1239e9b70ca2 6514
wolfSSL 0:1239e9b70ca2 6515
wolfSSL 0:1239e9b70ca2 6516 void CyaSSL_MD5_Update(CYASSL_MD5_CTX* md5, const void* input,
wolfSSL 0:1239e9b70ca2 6517 unsigned long sz)
wolfSSL 0:1239e9b70ca2 6518 {
wolfSSL 0:1239e9b70ca2 6519 CYASSL_ENTER("CyaSSL_MD5_Update");
wolfSSL 0:1239e9b70ca2 6520 Md5Update((Md5*)md5, (const byte*)input, (word32)sz);
wolfSSL 0:1239e9b70ca2 6521 }
wolfSSL 0:1239e9b70ca2 6522
wolfSSL 0:1239e9b70ca2 6523
wolfSSL 0:1239e9b70ca2 6524 void CyaSSL_MD5_Final(byte* input, CYASSL_MD5_CTX* md5)
wolfSSL 0:1239e9b70ca2 6525 {
wolfSSL 0:1239e9b70ca2 6526 CYASSL_ENTER("MD5_Final");
wolfSSL 0:1239e9b70ca2 6527 Md5Final((Md5*)md5, input);
wolfSSL 0:1239e9b70ca2 6528 }
wolfSSL 0:1239e9b70ca2 6529
wolfSSL 0:1239e9b70ca2 6530
wolfSSL 0:1239e9b70ca2 6531 void CyaSSL_SHA_Init(CYASSL_SHA_CTX* sha)
wolfSSL 0:1239e9b70ca2 6532 {
wolfSSL 0:1239e9b70ca2 6533 typedef char sha_test[sizeof(SHA_CTX) >= sizeof(Sha) ? 1 : -1];
wolfSSL 0:1239e9b70ca2 6534 (void)sizeof(sha_test);
wolfSSL 0:1239e9b70ca2 6535
wolfSSL 0:1239e9b70ca2 6536 CYASSL_ENTER("SHA_Init");
wolfSSL 0:1239e9b70ca2 6537 InitSha((Sha*)sha); /* OpenSSL compat, no ret */
wolfSSL 0:1239e9b70ca2 6538 }
wolfSSL 0:1239e9b70ca2 6539
wolfSSL 0:1239e9b70ca2 6540
wolfSSL 0:1239e9b70ca2 6541 void CyaSSL_SHA_Update(CYASSL_SHA_CTX* sha, const void* input,
wolfSSL 0:1239e9b70ca2 6542 unsigned long sz)
wolfSSL 0:1239e9b70ca2 6543 {
wolfSSL 0:1239e9b70ca2 6544 CYASSL_ENTER("SHA_Update");
wolfSSL 0:1239e9b70ca2 6545 ShaUpdate((Sha*)sha, (const byte*)input, (word32)sz);
wolfSSL 0:1239e9b70ca2 6546 }
wolfSSL 0:1239e9b70ca2 6547
wolfSSL 0:1239e9b70ca2 6548
wolfSSL 0:1239e9b70ca2 6549 void CyaSSL_SHA_Final(byte* input, CYASSL_SHA_CTX* sha)
wolfSSL 0:1239e9b70ca2 6550 {
wolfSSL 0:1239e9b70ca2 6551 CYASSL_ENTER("SHA_Final");
wolfSSL 0:1239e9b70ca2 6552 ShaFinal((Sha*)sha, input);
wolfSSL 0:1239e9b70ca2 6553 }
wolfSSL 0:1239e9b70ca2 6554
wolfSSL 0:1239e9b70ca2 6555
wolfSSL 0:1239e9b70ca2 6556 void CyaSSL_SHA1_Init(CYASSL_SHA_CTX* sha)
wolfSSL 0:1239e9b70ca2 6557 {
wolfSSL 0:1239e9b70ca2 6558 CYASSL_ENTER("SHA1_Init");
wolfSSL 0:1239e9b70ca2 6559 SHA_Init(sha);
wolfSSL 0:1239e9b70ca2 6560 }
wolfSSL 0:1239e9b70ca2 6561
wolfSSL 0:1239e9b70ca2 6562
wolfSSL 0:1239e9b70ca2 6563 void CyaSSL_SHA1_Update(CYASSL_SHA_CTX* sha, const void* input,
wolfSSL 0:1239e9b70ca2 6564 unsigned long sz)
wolfSSL 0:1239e9b70ca2 6565 {
wolfSSL 0:1239e9b70ca2 6566 CYASSL_ENTER("SHA1_Update");
wolfSSL 0:1239e9b70ca2 6567 SHA_Update(sha, input, sz);
wolfSSL 0:1239e9b70ca2 6568 }
wolfSSL 0:1239e9b70ca2 6569
wolfSSL 0:1239e9b70ca2 6570
wolfSSL 0:1239e9b70ca2 6571 void CyaSSL_SHA1_Final(byte* input, CYASSL_SHA_CTX* sha)
wolfSSL 0:1239e9b70ca2 6572 {
wolfSSL 0:1239e9b70ca2 6573 CYASSL_ENTER("SHA1_Final");
wolfSSL 0:1239e9b70ca2 6574 SHA_Final(input, sha);
wolfSSL 0:1239e9b70ca2 6575 }
wolfSSL 0:1239e9b70ca2 6576
wolfSSL 0:1239e9b70ca2 6577
wolfSSL 0:1239e9b70ca2 6578 void CyaSSL_SHA256_Init(CYASSL_SHA256_CTX* sha256)
wolfSSL 0:1239e9b70ca2 6579 {
wolfSSL 0:1239e9b70ca2 6580 typedef char sha_test[sizeof(SHA256_CTX) >= sizeof(Sha256) ? 1 : -1];
wolfSSL 0:1239e9b70ca2 6581 (void)sizeof(sha_test);
wolfSSL 0:1239e9b70ca2 6582
wolfSSL 0:1239e9b70ca2 6583 CYASSL_ENTER("SHA256_Init");
wolfSSL 0:1239e9b70ca2 6584 InitSha256((Sha256*)sha256); /* OpenSSL compat, no error */
wolfSSL 0:1239e9b70ca2 6585 }
wolfSSL 0:1239e9b70ca2 6586
wolfSSL 0:1239e9b70ca2 6587
wolfSSL 0:1239e9b70ca2 6588 void CyaSSL_SHA256_Update(CYASSL_SHA256_CTX* sha, const void* input,
wolfSSL 0:1239e9b70ca2 6589 unsigned long sz)
wolfSSL 0:1239e9b70ca2 6590 {
wolfSSL 0:1239e9b70ca2 6591 CYASSL_ENTER("SHA256_Update");
wolfSSL 0:1239e9b70ca2 6592 Sha256Update((Sha256*)sha, (const byte*)input, (word32)sz);
wolfSSL 0:1239e9b70ca2 6593 /* OpenSSL compat, no error */
wolfSSL 0:1239e9b70ca2 6594 }
wolfSSL 0:1239e9b70ca2 6595
wolfSSL 0:1239e9b70ca2 6596
wolfSSL 0:1239e9b70ca2 6597 void CyaSSL_SHA256_Final(byte* input, CYASSL_SHA256_CTX* sha)
wolfSSL 0:1239e9b70ca2 6598 {
wolfSSL 0:1239e9b70ca2 6599 CYASSL_ENTER("SHA256_Final");
wolfSSL 0:1239e9b70ca2 6600 Sha256Final((Sha256*)sha, input);
wolfSSL 0:1239e9b70ca2 6601 /* OpenSSL compat, no error */
wolfSSL 0:1239e9b70ca2 6602 }
wolfSSL 0:1239e9b70ca2 6603
wolfSSL 0:1239e9b70ca2 6604
wolfSSL 0:1239e9b70ca2 6605 #ifdef CYASSL_SHA384
wolfSSL 0:1239e9b70ca2 6606
wolfSSL 0:1239e9b70ca2 6607 void CyaSSL_SHA384_Init(CYASSL_SHA384_CTX* sha)
wolfSSL 0:1239e9b70ca2 6608 {
wolfSSL 0:1239e9b70ca2 6609 typedef char sha_test[sizeof(SHA384_CTX) >= sizeof(Sha384) ? 1 : -1];
wolfSSL 0:1239e9b70ca2 6610 (void)sizeof(sha_test);
wolfSSL 0:1239e9b70ca2 6611
wolfSSL 0:1239e9b70ca2 6612 CYASSL_ENTER("SHA384_Init");
wolfSSL 0:1239e9b70ca2 6613 InitSha384((Sha384*)sha); /* OpenSSL compat, no error */
wolfSSL 0:1239e9b70ca2 6614 }
wolfSSL 0:1239e9b70ca2 6615
wolfSSL 0:1239e9b70ca2 6616
wolfSSL 0:1239e9b70ca2 6617 void CyaSSL_SHA384_Update(CYASSL_SHA384_CTX* sha, const void* input,
wolfSSL 0:1239e9b70ca2 6618 unsigned long sz)
wolfSSL 0:1239e9b70ca2 6619 {
wolfSSL 0:1239e9b70ca2 6620 CYASSL_ENTER("SHA384_Update");
wolfSSL 0:1239e9b70ca2 6621 Sha384Update((Sha384*)sha, (const byte*)input, (word32)sz);
wolfSSL 0:1239e9b70ca2 6622 /* OpenSSL compat, no error */
wolfSSL 0:1239e9b70ca2 6623 }
wolfSSL 0:1239e9b70ca2 6624
wolfSSL 0:1239e9b70ca2 6625
wolfSSL 0:1239e9b70ca2 6626 void CyaSSL_SHA384_Final(byte* input, CYASSL_SHA384_CTX* sha)
wolfSSL 0:1239e9b70ca2 6627 {
wolfSSL 0:1239e9b70ca2 6628 CYASSL_ENTER("SHA384_Final");
wolfSSL 0:1239e9b70ca2 6629 Sha384Final((Sha384*)sha, input);
wolfSSL 0:1239e9b70ca2 6630 /* OpenSSL compat, no error */
wolfSSL 0:1239e9b70ca2 6631 }
wolfSSL 0:1239e9b70ca2 6632
wolfSSL 0:1239e9b70ca2 6633 #endif /* CYASSL_SHA384 */
wolfSSL 0:1239e9b70ca2 6634
wolfSSL 0:1239e9b70ca2 6635
wolfSSL 0:1239e9b70ca2 6636 #ifdef CYASSL_SHA512
wolfSSL 0:1239e9b70ca2 6637
wolfSSL 0:1239e9b70ca2 6638 void CyaSSL_SHA512_Init(CYASSL_SHA512_CTX* sha)
wolfSSL 0:1239e9b70ca2 6639 {
wolfSSL 0:1239e9b70ca2 6640 typedef char sha_test[sizeof(SHA512_CTX) >= sizeof(Sha512) ? 1 : -1];
wolfSSL 0:1239e9b70ca2 6641 (void)sizeof(sha_test);
wolfSSL 0:1239e9b70ca2 6642
wolfSSL 0:1239e9b70ca2 6643 CYASSL_ENTER("SHA512_Init");
wolfSSL 0:1239e9b70ca2 6644 InitSha512((Sha512*)sha); /* OpenSSL compat, no error */
wolfSSL 0:1239e9b70ca2 6645 }
wolfSSL 0:1239e9b70ca2 6646
wolfSSL 0:1239e9b70ca2 6647
wolfSSL 0:1239e9b70ca2 6648 void CyaSSL_SHA512_Update(CYASSL_SHA512_CTX* sha, const void* input,
wolfSSL 0:1239e9b70ca2 6649 unsigned long sz)
wolfSSL 0:1239e9b70ca2 6650 {
wolfSSL 0:1239e9b70ca2 6651 CYASSL_ENTER("SHA512_Update");
wolfSSL 0:1239e9b70ca2 6652 Sha512Update((Sha512*)sha, (const byte*)input, (word32)sz);
wolfSSL 0:1239e9b70ca2 6653 /* OpenSSL compat, no error */
wolfSSL 0:1239e9b70ca2 6654 }
wolfSSL 0:1239e9b70ca2 6655
wolfSSL 0:1239e9b70ca2 6656
wolfSSL 0:1239e9b70ca2 6657 void CyaSSL_SHA512_Final(byte* input, CYASSL_SHA512_CTX* sha)
wolfSSL 0:1239e9b70ca2 6658 {
wolfSSL 0:1239e9b70ca2 6659 CYASSL_ENTER("SHA512_Final");
wolfSSL 0:1239e9b70ca2 6660 Sha512Final((Sha512*)sha, input);
wolfSSL 0:1239e9b70ca2 6661 /* OpenSSL compat, no error */
wolfSSL 0:1239e9b70ca2 6662 }
wolfSSL 0:1239e9b70ca2 6663
wolfSSL 0:1239e9b70ca2 6664 #endif /* CYASSL_SHA512 */
wolfSSL 0:1239e9b70ca2 6665
wolfSSL 0:1239e9b70ca2 6666
wolfSSL 0:1239e9b70ca2 6667 const CYASSL_EVP_MD* CyaSSL_EVP_md5(void)
wolfSSL 0:1239e9b70ca2 6668 {
wolfSSL 0:1239e9b70ca2 6669 static const char* type = "MD5";
wolfSSL 0:1239e9b70ca2 6670 CYASSL_ENTER("EVP_md5");
wolfSSL 0:1239e9b70ca2 6671 return type;
wolfSSL 0:1239e9b70ca2 6672 }
wolfSSL 0:1239e9b70ca2 6673
wolfSSL 0:1239e9b70ca2 6674
wolfSSL 0:1239e9b70ca2 6675 const CYASSL_EVP_MD* CyaSSL_EVP_sha1(void)
wolfSSL 0:1239e9b70ca2 6676 {
wolfSSL 0:1239e9b70ca2 6677 static const char* type = "SHA";
wolfSSL 0:1239e9b70ca2 6678 CYASSL_ENTER("EVP_sha1");
wolfSSL 0:1239e9b70ca2 6679 return type;
wolfSSL 0:1239e9b70ca2 6680 }
wolfSSL 0:1239e9b70ca2 6681
wolfSSL 0:1239e9b70ca2 6682
wolfSSL 0:1239e9b70ca2 6683 const CYASSL_EVP_MD* CyaSSL_EVP_sha256(void)
wolfSSL 0:1239e9b70ca2 6684 {
wolfSSL 0:1239e9b70ca2 6685 static const char* type = "SHA256";
wolfSSL 0:1239e9b70ca2 6686 CYASSL_ENTER("EVP_sha256");
wolfSSL 0:1239e9b70ca2 6687 return type;
wolfSSL 0:1239e9b70ca2 6688 }
wolfSSL 0:1239e9b70ca2 6689
wolfSSL 0:1239e9b70ca2 6690 #ifdef CYASSL_SHA384
wolfSSL 0:1239e9b70ca2 6691
wolfSSL 0:1239e9b70ca2 6692 const CYASSL_EVP_MD* CyaSSL_EVP_sha384(void)
wolfSSL 0:1239e9b70ca2 6693 {
wolfSSL 0:1239e9b70ca2 6694 static const char* type = "SHA384";
wolfSSL 0:1239e9b70ca2 6695 CYASSL_ENTER("EVP_sha384");
wolfSSL 0:1239e9b70ca2 6696 return type;
wolfSSL 0:1239e9b70ca2 6697 }
wolfSSL 0:1239e9b70ca2 6698
wolfSSL 0:1239e9b70ca2 6699 #endif /* CYASSL_SHA384 */
wolfSSL 0:1239e9b70ca2 6700
wolfSSL 0:1239e9b70ca2 6701 #ifdef CYASSL_SHA512
wolfSSL 0:1239e9b70ca2 6702
wolfSSL 0:1239e9b70ca2 6703 const CYASSL_EVP_MD* CyaSSL_EVP_sha512(void)
wolfSSL 0:1239e9b70ca2 6704 {
wolfSSL 0:1239e9b70ca2 6705 static const char* type = "SHA512";
wolfSSL 0:1239e9b70ca2 6706 CYASSL_ENTER("EVP_sha512");
wolfSSL 0:1239e9b70ca2 6707 return type;
wolfSSL 0:1239e9b70ca2 6708 }
wolfSSL 0:1239e9b70ca2 6709
wolfSSL 0:1239e9b70ca2 6710 #endif /* CYASSL_SHA512 */
wolfSSL 0:1239e9b70ca2 6711
wolfSSL 0:1239e9b70ca2 6712
wolfSSL 0:1239e9b70ca2 6713 void CyaSSL_EVP_MD_CTX_init(CYASSL_EVP_MD_CTX* ctx)
wolfSSL 0:1239e9b70ca2 6714 {
wolfSSL 0:1239e9b70ca2 6715 CYASSL_ENTER("EVP_CIPHER_MD_CTX_init");
wolfSSL 0:1239e9b70ca2 6716 (void)ctx;
wolfSSL 0:1239e9b70ca2 6717 /* do nothing */
wolfSSL 0:1239e9b70ca2 6718 }
wolfSSL 0:1239e9b70ca2 6719
wolfSSL 0:1239e9b70ca2 6720
wolfSSL 0:1239e9b70ca2 6721 const CYASSL_EVP_CIPHER* CyaSSL_EVP_aes_128_cbc(void)
wolfSSL 0:1239e9b70ca2 6722 {
wolfSSL 0:1239e9b70ca2 6723 static const char* type = "AES128-CBC";
wolfSSL 0:1239e9b70ca2 6724 CYASSL_ENTER("CyaSSL_EVP_aes_128_cbc");
wolfSSL 0:1239e9b70ca2 6725 return type;
wolfSSL 0:1239e9b70ca2 6726 }
wolfSSL 0:1239e9b70ca2 6727
wolfSSL 0:1239e9b70ca2 6728
wolfSSL 0:1239e9b70ca2 6729 const CYASSL_EVP_CIPHER* CyaSSL_EVP_aes_192_cbc(void)
wolfSSL 0:1239e9b70ca2 6730 {
wolfSSL 0:1239e9b70ca2 6731 static const char* type = "AES192-CBC";
wolfSSL 0:1239e9b70ca2 6732 CYASSL_ENTER("CyaSSL_EVP_aes_192_cbc");
wolfSSL 0:1239e9b70ca2 6733 return type;
wolfSSL 0:1239e9b70ca2 6734 }
wolfSSL 0:1239e9b70ca2 6735
wolfSSL 0:1239e9b70ca2 6736
wolfSSL 0:1239e9b70ca2 6737 const CYASSL_EVP_CIPHER* CyaSSL_EVP_aes_256_cbc(void)
wolfSSL 0:1239e9b70ca2 6738 {
wolfSSL 0:1239e9b70ca2 6739 static const char* type = "AES256-CBC";
wolfSSL 0:1239e9b70ca2 6740 CYASSL_ENTER("CyaSSL_EVP_aes_256_cbc");
wolfSSL 0:1239e9b70ca2 6741 return type;
wolfSSL 0:1239e9b70ca2 6742 }
wolfSSL 0:1239e9b70ca2 6743
wolfSSL 0:1239e9b70ca2 6744
wolfSSL 0:1239e9b70ca2 6745 const CYASSL_EVP_CIPHER* CyaSSL_EVP_aes_128_ctr(void)
wolfSSL 0:1239e9b70ca2 6746 {
wolfSSL 0:1239e9b70ca2 6747 static const char* type = "AES128-CTR";
wolfSSL 0:1239e9b70ca2 6748 CYASSL_ENTER("CyaSSL_EVP_aes_128_ctr");
wolfSSL 0:1239e9b70ca2 6749 return type;
wolfSSL 0:1239e9b70ca2 6750 }
wolfSSL 0:1239e9b70ca2 6751
wolfSSL 0:1239e9b70ca2 6752
wolfSSL 0:1239e9b70ca2 6753 const CYASSL_EVP_CIPHER* CyaSSL_EVP_aes_192_ctr(void)
wolfSSL 0:1239e9b70ca2 6754 {
wolfSSL 0:1239e9b70ca2 6755 static const char* type = "AES192-CTR";
wolfSSL 0:1239e9b70ca2 6756 CYASSL_ENTER("CyaSSL_EVP_aes_192_ctr");
wolfSSL 0:1239e9b70ca2 6757 return type;
wolfSSL 0:1239e9b70ca2 6758 }
wolfSSL 0:1239e9b70ca2 6759
wolfSSL 0:1239e9b70ca2 6760
wolfSSL 0:1239e9b70ca2 6761 const CYASSL_EVP_CIPHER* CyaSSL_EVP_aes_256_ctr(void)
wolfSSL 0:1239e9b70ca2 6762 {
wolfSSL 0:1239e9b70ca2 6763 static const char* type = "AES256-CTR";
wolfSSL 0:1239e9b70ca2 6764 CYASSL_ENTER("CyaSSL_EVP_aes_256_ctr");
wolfSSL 0:1239e9b70ca2 6765 return type;
wolfSSL 0:1239e9b70ca2 6766 }
wolfSSL 0:1239e9b70ca2 6767
wolfSSL 0:1239e9b70ca2 6768
wolfSSL 0:1239e9b70ca2 6769 const CYASSL_EVP_CIPHER* CyaSSL_EVP_des_cbc(void)
wolfSSL 0:1239e9b70ca2 6770 {
wolfSSL 0:1239e9b70ca2 6771 static const char* type = "DES-CBC";
wolfSSL 0:1239e9b70ca2 6772 CYASSL_ENTER("CyaSSL_EVP_des_cbc");
wolfSSL 0:1239e9b70ca2 6773 return type;
wolfSSL 0:1239e9b70ca2 6774 }
wolfSSL 0:1239e9b70ca2 6775
wolfSSL 0:1239e9b70ca2 6776
wolfSSL 0:1239e9b70ca2 6777 const CYASSL_EVP_CIPHER* CyaSSL_EVP_des_ede3_cbc(void)
wolfSSL 0:1239e9b70ca2 6778 {
wolfSSL 0:1239e9b70ca2 6779 static const char* type = "DES-EDE3-CBC";
wolfSSL 0:1239e9b70ca2 6780 CYASSL_ENTER("CyaSSL_EVP_des_ede3_cbc");
wolfSSL 0:1239e9b70ca2 6781 return type;
wolfSSL 0:1239e9b70ca2 6782 }
wolfSSL 0:1239e9b70ca2 6783
wolfSSL 0:1239e9b70ca2 6784
wolfSSL 0:1239e9b70ca2 6785 const CYASSL_EVP_CIPHER* CyaSSL_EVP_rc4(void)
wolfSSL 0:1239e9b70ca2 6786 {
wolfSSL 0:1239e9b70ca2 6787 static const char* type = "ARC4";
wolfSSL 0:1239e9b70ca2 6788 CYASSL_ENTER("CyaSSL_EVP_rc4");
wolfSSL 0:1239e9b70ca2 6789 return type;
wolfSSL 0:1239e9b70ca2 6790 }
wolfSSL 0:1239e9b70ca2 6791
wolfSSL 0:1239e9b70ca2 6792
wolfSSL 0:1239e9b70ca2 6793 const CYASSL_EVP_CIPHER* CyaSSL_EVP_enc_null(void)
wolfSSL 0:1239e9b70ca2 6794 {
wolfSSL 0:1239e9b70ca2 6795 static const char* type = "NULL";
wolfSSL 0:1239e9b70ca2 6796 CYASSL_ENTER("CyaSSL_EVP_enc_null");
wolfSSL 0:1239e9b70ca2 6797 return type;
wolfSSL 0:1239e9b70ca2 6798 }
wolfSSL 0:1239e9b70ca2 6799
wolfSSL 0:1239e9b70ca2 6800
wolfSSL 0:1239e9b70ca2 6801 int CyaSSL_EVP_MD_CTX_cleanup(CYASSL_EVP_MD_CTX* ctx)
wolfSSL 0:1239e9b70ca2 6802 {
wolfSSL 0:1239e9b70ca2 6803 CYASSL_ENTER("EVP_MD_CTX_cleanup");
wolfSSL 0:1239e9b70ca2 6804 (void)ctx;
wolfSSL 0:1239e9b70ca2 6805 return 0;
wolfSSL 0:1239e9b70ca2 6806 }
wolfSSL 0:1239e9b70ca2 6807
wolfSSL 0:1239e9b70ca2 6808
wolfSSL 0:1239e9b70ca2 6809
wolfSSL 0:1239e9b70ca2 6810 void CyaSSL_EVP_CIPHER_CTX_init(CYASSL_EVP_CIPHER_CTX* ctx)
wolfSSL 0:1239e9b70ca2 6811 {
wolfSSL 0:1239e9b70ca2 6812 CYASSL_ENTER("EVP_CIPHER_CTX_init");
wolfSSL 0:1239e9b70ca2 6813 if (ctx) {
wolfSSL 0:1239e9b70ca2 6814 ctx->cipherType = 0xff; /* no init */
wolfSSL 0:1239e9b70ca2 6815 ctx->keyLen = 0;
wolfSSL 0:1239e9b70ca2 6816 ctx->enc = 1; /* start in encrypt mode */
wolfSSL 0:1239e9b70ca2 6817 }
wolfSSL 0:1239e9b70ca2 6818 }
wolfSSL 0:1239e9b70ca2 6819
wolfSSL 0:1239e9b70ca2 6820
wolfSSL 0:1239e9b70ca2 6821 /* SSL_SUCCESS on ok */
wolfSSL 0:1239e9b70ca2 6822 int CyaSSL_EVP_CIPHER_CTX_cleanup(CYASSL_EVP_CIPHER_CTX* ctx)
wolfSSL 0:1239e9b70ca2 6823 {
wolfSSL 0:1239e9b70ca2 6824 CYASSL_ENTER("EVP_CIPHER_CTX_cleanup");
wolfSSL 0:1239e9b70ca2 6825 if (ctx) {
wolfSSL 0:1239e9b70ca2 6826 ctx->cipherType = 0xff; /* no more init */
wolfSSL 0:1239e9b70ca2 6827 ctx->keyLen = 0;
wolfSSL 0:1239e9b70ca2 6828 }
wolfSSL 0:1239e9b70ca2 6829
wolfSSL 0:1239e9b70ca2 6830 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 6831 }
wolfSSL 0:1239e9b70ca2 6832
wolfSSL 0:1239e9b70ca2 6833
wolfSSL 0:1239e9b70ca2 6834 /* SSL_SUCCESS on ok */
wolfSSL 0:1239e9b70ca2 6835 int CyaSSL_EVP_CipherInit(CYASSL_EVP_CIPHER_CTX* ctx,
wolfSSL 0:1239e9b70ca2 6836 const CYASSL_EVP_CIPHER* type, byte* key,
wolfSSL 0:1239e9b70ca2 6837 byte* iv, int enc)
wolfSSL 0:1239e9b70ca2 6838 {
wolfSSL 0:1239e9b70ca2 6839 int ret = 0;
wolfSSL 0:1239e9b70ca2 6840
wolfSSL 0:1239e9b70ca2 6841 CYASSL_ENTER("CyaSSL_EVP_CipherInit");
wolfSSL 0:1239e9b70ca2 6842 if (ctx == NULL) {
wolfSSL 0:1239e9b70ca2 6843 CYASSL_MSG("no ctx");
wolfSSL 0:1239e9b70ca2 6844 return 0; /* failure */
wolfSSL 0:1239e9b70ca2 6845 }
wolfSSL 0:1239e9b70ca2 6846
wolfSSL 0:1239e9b70ca2 6847 if (type == NULL && ctx->cipherType == 0xff) {
wolfSSL 0:1239e9b70ca2 6848 CYASSL_MSG("no type set");
wolfSSL 0:1239e9b70ca2 6849 return 0; /* failure */
wolfSSL 0:1239e9b70ca2 6850 }
wolfSSL 0:1239e9b70ca2 6851
wolfSSL 0:1239e9b70ca2 6852 if (ctx->cipherType == AES_128_CBC_TYPE || (type &&
wolfSSL 0:1239e9b70ca2 6853 XSTRNCMP(type, "AES128-CBC", 10) == 0)) {
wolfSSL 0:1239e9b70ca2 6854 CYASSL_MSG("AES-128-CBC");
wolfSSL 0:1239e9b70ca2 6855 ctx->cipherType = AES_128_CBC_TYPE;
wolfSSL 0:1239e9b70ca2 6856 ctx->keyLen = 16;
wolfSSL 0:1239e9b70ca2 6857 if (enc == 0 || enc == 1)
wolfSSL 0:1239e9b70ca2 6858 ctx->enc = enc ? 1 : 0;
wolfSSL 0:1239e9b70ca2 6859 if (key) {
wolfSSL 0:1239e9b70ca2 6860 ret = AesSetKey(&ctx->cipher.aes, key, ctx->keyLen, iv,
wolfSSL 0:1239e9b70ca2 6861 ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION);
wolfSSL 0:1239e9b70ca2 6862 if (ret != 0)
wolfSSL 0:1239e9b70ca2 6863 return ret;
wolfSSL 0:1239e9b70ca2 6864 }
wolfSSL 0:1239e9b70ca2 6865 if (iv && key == NULL) {
wolfSSL 0:1239e9b70ca2 6866 ret = AesSetIV(&ctx->cipher.aes, iv);
wolfSSL 0:1239e9b70ca2 6867 if (ret != 0)
wolfSSL 0:1239e9b70ca2 6868 return ret;
wolfSSL 0:1239e9b70ca2 6869 }
wolfSSL 0:1239e9b70ca2 6870 }
wolfSSL 0:1239e9b70ca2 6871 else if (ctx->cipherType == AES_192_CBC_TYPE || (type &&
wolfSSL 0:1239e9b70ca2 6872 XSTRNCMP(type, "AES192-CBC", 10) == 0)) {
wolfSSL 0:1239e9b70ca2 6873 CYASSL_MSG("AES-192-CBC");
wolfSSL 0:1239e9b70ca2 6874 ctx->cipherType = AES_192_CBC_TYPE;
wolfSSL 0:1239e9b70ca2 6875 ctx->keyLen = 24;
wolfSSL 0:1239e9b70ca2 6876 if (enc == 0 || enc == 1)
wolfSSL 0:1239e9b70ca2 6877 ctx->enc = enc ? 1 : 0;
wolfSSL 0:1239e9b70ca2 6878 if (key) {
wolfSSL 0:1239e9b70ca2 6879 ret = AesSetKey(&ctx->cipher.aes, key, ctx->keyLen, iv,
wolfSSL 0:1239e9b70ca2 6880 ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION);
wolfSSL 0:1239e9b70ca2 6881 if (ret != 0)
wolfSSL 0:1239e9b70ca2 6882 return ret;
wolfSSL 0:1239e9b70ca2 6883 }
wolfSSL 0:1239e9b70ca2 6884 if (iv && key == NULL) {
wolfSSL 0:1239e9b70ca2 6885 ret = AesSetIV(&ctx->cipher.aes, iv);
wolfSSL 0:1239e9b70ca2 6886 if (ret != 0)
wolfSSL 0:1239e9b70ca2 6887 return ret;
wolfSSL 0:1239e9b70ca2 6888 }
wolfSSL 0:1239e9b70ca2 6889 }
wolfSSL 0:1239e9b70ca2 6890 else if (ctx->cipherType == AES_256_CBC_TYPE || (type &&
wolfSSL 0:1239e9b70ca2 6891 XSTRNCMP(type, "AES256-CBC", 10) == 0)) {
wolfSSL 0:1239e9b70ca2 6892 CYASSL_MSG("AES-256-CBC");
wolfSSL 0:1239e9b70ca2 6893 ctx->cipherType = AES_256_CBC_TYPE;
wolfSSL 0:1239e9b70ca2 6894 ctx->keyLen = 32;
wolfSSL 0:1239e9b70ca2 6895 if (enc == 0 || enc == 1)
wolfSSL 0:1239e9b70ca2 6896 ctx->enc = enc ? 1 : 0;
wolfSSL 0:1239e9b70ca2 6897 if (key) {
wolfSSL 0:1239e9b70ca2 6898 ret = AesSetKey(&ctx->cipher.aes, key, ctx->keyLen, iv,
wolfSSL 0:1239e9b70ca2 6899 ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION);
wolfSSL 0:1239e9b70ca2 6900 if (ret != 0)
wolfSSL 0:1239e9b70ca2 6901 return ret;
wolfSSL 0:1239e9b70ca2 6902 }
wolfSSL 0:1239e9b70ca2 6903 if (iv && key == NULL) {
wolfSSL 0:1239e9b70ca2 6904 ret = AesSetIV(&ctx->cipher.aes, iv);
wolfSSL 0:1239e9b70ca2 6905 if (ret != 0)
wolfSSL 0:1239e9b70ca2 6906 return ret;
wolfSSL 0:1239e9b70ca2 6907 }
wolfSSL 0:1239e9b70ca2 6908 }
wolfSSL 0:1239e9b70ca2 6909 #ifdef CYASSL_AES_COUNTER
wolfSSL 0:1239e9b70ca2 6910 else if (ctx->cipherType == AES_128_CTR_TYPE || (type &&
wolfSSL 0:1239e9b70ca2 6911 XSTRNCMP(type, "AES128-CTR", 10) == 0)) {
wolfSSL 0:1239e9b70ca2 6912 CYASSL_MSG("AES-128-CTR");
wolfSSL 0:1239e9b70ca2 6913 ctx->cipherType = AES_128_CTR_TYPE;
wolfSSL 0:1239e9b70ca2 6914 ctx->keyLen = 16;
wolfSSL 0:1239e9b70ca2 6915 if (enc == 0 || enc == 1)
wolfSSL 0:1239e9b70ca2 6916 ctx->enc = enc ? 1 : 0;
wolfSSL 0:1239e9b70ca2 6917 if (key) {
wolfSSL 0:1239e9b70ca2 6918 ret = AesSetKey(&ctx->cipher.aes, key, ctx->keyLen, iv,
wolfSSL 0:1239e9b70ca2 6919 AES_ENCRYPTION);
wolfSSL 0:1239e9b70ca2 6920 if (ret != 0)
wolfSSL 0:1239e9b70ca2 6921 return ret;
wolfSSL 0:1239e9b70ca2 6922 }
wolfSSL 0:1239e9b70ca2 6923 if (iv && key == NULL) {
wolfSSL 0:1239e9b70ca2 6924 ret = AesSetIV(&ctx->cipher.aes, iv);
wolfSSL 0:1239e9b70ca2 6925 if (ret != 0)
wolfSSL 0:1239e9b70ca2 6926 return ret;
wolfSSL 0:1239e9b70ca2 6927 }
wolfSSL 0:1239e9b70ca2 6928 }
wolfSSL 0:1239e9b70ca2 6929 else if (ctx->cipherType == AES_192_CTR_TYPE || (type &&
wolfSSL 0:1239e9b70ca2 6930 XSTRNCMP(type, "AES192-CTR", 10) == 0)) {
wolfSSL 0:1239e9b70ca2 6931 CYASSL_MSG("AES-192-CTR");
wolfSSL 0:1239e9b70ca2 6932 ctx->cipherType = AES_192_CTR_TYPE;
wolfSSL 0:1239e9b70ca2 6933 ctx->keyLen = 24;
wolfSSL 0:1239e9b70ca2 6934 if (enc == 0 || enc == 1)
wolfSSL 0:1239e9b70ca2 6935 ctx->enc = enc ? 1 : 0;
wolfSSL 0:1239e9b70ca2 6936 if (key) {
wolfSSL 0:1239e9b70ca2 6937 ret = AesSetKey(&ctx->cipher.aes, key, ctx->keyLen, iv,
wolfSSL 0:1239e9b70ca2 6938 AES_ENCRYPTION);
wolfSSL 0:1239e9b70ca2 6939 if (ret != 0)
wolfSSL 0:1239e9b70ca2 6940 return ret;
wolfSSL 0:1239e9b70ca2 6941 }
wolfSSL 0:1239e9b70ca2 6942 if (iv && key == NULL) {
wolfSSL 0:1239e9b70ca2 6943 ret = AesSetIV(&ctx->cipher.aes, iv);
wolfSSL 0:1239e9b70ca2 6944 if (ret != 0)
wolfSSL 0:1239e9b70ca2 6945 return ret;
wolfSSL 0:1239e9b70ca2 6946 }
wolfSSL 0:1239e9b70ca2 6947 }
wolfSSL 0:1239e9b70ca2 6948 else if (ctx->cipherType == AES_256_CTR_TYPE || (type &&
wolfSSL 0:1239e9b70ca2 6949 XSTRNCMP(type, "AES256-CTR", 10) == 0)) {
wolfSSL 0:1239e9b70ca2 6950 CYASSL_MSG("AES-256-CTR");
wolfSSL 0:1239e9b70ca2 6951 ctx->cipherType = AES_256_CTR_TYPE;
wolfSSL 0:1239e9b70ca2 6952 ctx->keyLen = 32;
wolfSSL 0:1239e9b70ca2 6953 if (enc == 0 || enc == 1)
wolfSSL 0:1239e9b70ca2 6954 ctx->enc = enc ? 1 : 0;
wolfSSL 0:1239e9b70ca2 6955 if (key) {
wolfSSL 0:1239e9b70ca2 6956 ret = AesSetKey(&ctx->cipher.aes, key, ctx->keyLen, iv,
wolfSSL 0:1239e9b70ca2 6957 AES_ENCRYPTION);
wolfSSL 0:1239e9b70ca2 6958 if (ret != 0)
wolfSSL 0:1239e9b70ca2 6959 return ret;
wolfSSL 0:1239e9b70ca2 6960 }
wolfSSL 0:1239e9b70ca2 6961 if (iv && key == NULL) {
wolfSSL 0:1239e9b70ca2 6962 ret = AesSetIV(&ctx->cipher.aes, iv);
wolfSSL 0:1239e9b70ca2 6963 if (ret != 0)
wolfSSL 0:1239e9b70ca2 6964 return ret;
wolfSSL 0:1239e9b70ca2 6965 }
wolfSSL 0:1239e9b70ca2 6966 }
wolfSSL 0:1239e9b70ca2 6967 #endif /* CYASSL_AES_CTR */
wolfSSL 0:1239e9b70ca2 6968 else if (ctx->cipherType == DES_CBC_TYPE || (type &&
wolfSSL 0:1239e9b70ca2 6969 XSTRNCMP(type, "DES-CBC", 7) == 0)) {
wolfSSL 0:1239e9b70ca2 6970 CYASSL_MSG("DES-CBC");
wolfSSL 0:1239e9b70ca2 6971 ctx->cipherType = DES_CBC_TYPE;
wolfSSL 0:1239e9b70ca2 6972 ctx->keyLen = 8;
wolfSSL 0:1239e9b70ca2 6973 if (enc == 0 || enc == 1)
wolfSSL 0:1239e9b70ca2 6974 ctx->enc = enc ? 1 : 0;
wolfSSL 0:1239e9b70ca2 6975 if (key) {
wolfSSL 0:1239e9b70ca2 6976 ret = Des_SetKey(&ctx->cipher.des, key, iv,
wolfSSL 0:1239e9b70ca2 6977 ctx->enc ? DES_ENCRYPTION : DES_DECRYPTION);
wolfSSL 0:1239e9b70ca2 6978 if (ret != 0)
wolfSSL 0:1239e9b70ca2 6979 return ret;
wolfSSL 0:1239e9b70ca2 6980 }
wolfSSL 0:1239e9b70ca2 6981
wolfSSL 0:1239e9b70ca2 6982 if (iv && key == NULL)
wolfSSL 0:1239e9b70ca2 6983 Des_SetIV(&ctx->cipher.des, iv);
wolfSSL 0:1239e9b70ca2 6984 }
wolfSSL 0:1239e9b70ca2 6985 else if (ctx->cipherType == DES_EDE3_CBC_TYPE || (type &&
wolfSSL 0:1239e9b70ca2 6986 XSTRNCMP(type, "DES-EDE3-CBC", 11) == 0)) {
wolfSSL 0:1239e9b70ca2 6987 CYASSL_MSG("DES-EDE3-CBC");
wolfSSL 0:1239e9b70ca2 6988 ctx->cipherType = DES_EDE3_CBC_TYPE;
wolfSSL 0:1239e9b70ca2 6989 ctx->keyLen = 24;
wolfSSL 0:1239e9b70ca2 6990 if (enc == 0 || enc == 1)
wolfSSL 0:1239e9b70ca2 6991 ctx->enc = enc ? 1 : 0;
wolfSSL 0:1239e9b70ca2 6992 if (key) {
wolfSSL 0:1239e9b70ca2 6993 ret = Des3_SetKey(&ctx->cipher.des3, key, iv,
wolfSSL 0:1239e9b70ca2 6994 ctx->enc ? DES_ENCRYPTION : DES_DECRYPTION);
wolfSSL 0:1239e9b70ca2 6995 if (ret != 0)
wolfSSL 0:1239e9b70ca2 6996 return ret;
wolfSSL 0:1239e9b70ca2 6997 }
wolfSSL 0:1239e9b70ca2 6998
wolfSSL 0:1239e9b70ca2 6999 if (iv && key == NULL) {
wolfSSL 0:1239e9b70ca2 7000 ret = Des3_SetIV(&ctx->cipher.des3, iv);
wolfSSL 0:1239e9b70ca2 7001 if (ret != 0)
wolfSSL 0:1239e9b70ca2 7002 return ret;
wolfSSL 0:1239e9b70ca2 7003 }
wolfSSL 0:1239e9b70ca2 7004 }
wolfSSL 0:1239e9b70ca2 7005 else if (ctx->cipherType == ARC4_TYPE || (type &&
wolfSSL 0:1239e9b70ca2 7006 XSTRNCMP(type, "ARC4", 4) == 0)) {
wolfSSL 0:1239e9b70ca2 7007 CYASSL_MSG("ARC4");
wolfSSL 0:1239e9b70ca2 7008 ctx->cipherType = ARC4_TYPE;
wolfSSL 0:1239e9b70ca2 7009 if (ctx->keyLen == 0) /* user may have already set */
wolfSSL 0:1239e9b70ca2 7010 ctx->keyLen = 16; /* default to 128 */
wolfSSL 0:1239e9b70ca2 7011 if (key)
wolfSSL 0:1239e9b70ca2 7012 Arc4SetKey(&ctx->cipher.arc4, key, ctx->keyLen);
wolfSSL 0:1239e9b70ca2 7013 }
wolfSSL 0:1239e9b70ca2 7014 else if (ctx->cipherType == NULL_CIPHER_TYPE || (type &&
wolfSSL 0:1239e9b70ca2 7015 XSTRNCMP(type, "NULL", 4) == 0)) {
wolfSSL 0:1239e9b70ca2 7016 CYASSL_MSG("NULL cipher");
wolfSSL 0:1239e9b70ca2 7017 ctx->cipherType = NULL_CIPHER_TYPE;
wolfSSL 0:1239e9b70ca2 7018 ctx->keyLen = 0;
wolfSSL 0:1239e9b70ca2 7019 }
wolfSSL 0:1239e9b70ca2 7020 else
wolfSSL 0:1239e9b70ca2 7021 return 0; /* failure */
wolfSSL 0:1239e9b70ca2 7022
wolfSSL 0:1239e9b70ca2 7023
wolfSSL 0:1239e9b70ca2 7024 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 7025 }
wolfSSL 0:1239e9b70ca2 7026
wolfSSL 0:1239e9b70ca2 7027
wolfSSL 0:1239e9b70ca2 7028 /* SSL_SUCCESS on ok */
wolfSSL 0:1239e9b70ca2 7029 int CyaSSL_EVP_CIPHER_CTX_key_length(CYASSL_EVP_CIPHER_CTX* ctx)
wolfSSL 0:1239e9b70ca2 7030 {
wolfSSL 0:1239e9b70ca2 7031 CYASSL_ENTER("CyaSSL_EVP_CIPHER_CTX_key_length");
wolfSSL 0:1239e9b70ca2 7032 if (ctx)
wolfSSL 0:1239e9b70ca2 7033 return ctx->keyLen;
wolfSSL 0:1239e9b70ca2 7034
wolfSSL 0:1239e9b70ca2 7035 return 0; /* failure */
wolfSSL 0:1239e9b70ca2 7036 }
wolfSSL 0:1239e9b70ca2 7037
wolfSSL 0:1239e9b70ca2 7038
wolfSSL 0:1239e9b70ca2 7039 /* SSL_SUCCESS on ok */
wolfSSL 0:1239e9b70ca2 7040 int CyaSSL_EVP_CIPHER_CTX_set_key_length(CYASSL_EVP_CIPHER_CTX* ctx,
wolfSSL 0:1239e9b70ca2 7041 int keylen)
wolfSSL 0:1239e9b70ca2 7042 {
wolfSSL 0:1239e9b70ca2 7043 CYASSL_ENTER("CyaSSL_EVP_CIPHER_CTX_set_key_length");
wolfSSL 0:1239e9b70ca2 7044 if (ctx)
wolfSSL 0:1239e9b70ca2 7045 ctx->keyLen = keylen;
wolfSSL 0:1239e9b70ca2 7046 else
wolfSSL 0:1239e9b70ca2 7047 return 0; /* failure */
wolfSSL 0:1239e9b70ca2 7048
wolfSSL 0:1239e9b70ca2 7049 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 7050 }
wolfSSL 0:1239e9b70ca2 7051
wolfSSL 0:1239e9b70ca2 7052
wolfSSL 0:1239e9b70ca2 7053 /* SSL_SUCCESS on ok */
wolfSSL 0:1239e9b70ca2 7054 int CyaSSL_EVP_Cipher(CYASSL_EVP_CIPHER_CTX* ctx, byte* dst, byte* src,
wolfSSL 0:1239e9b70ca2 7055 word32 len)
wolfSSL 0:1239e9b70ca2 7056 {
wolfSSL 0:1239e9b70ca2 7057 int ret = 0;
wolfSSL 0:1239e9b70ca2 7058 CYASSL_ENTER("CyaSSL_EVP_Cipher");
wolfSSL 0:1239e9b70ca2 7059
wolfSSL 0:1239e9b70ca2 7060 if (ctx == NULL || dst == NULL || src == NULL) {
wolfSSL 0:1239e9b70ca2 7061 CYASSL_MSG("Bad function argument");
wolfSSL 0:1239e9b70ca2 7062 return 0; /* failure */
wolfSSL 0:1239e9b70ca2 7063 }
wolfSSL 0:1239e9b70ca2 7064
wolfSSL 0:1239e9b70ca2 7065 if (ctx->cipherType == 0xff) {
wolfSSL 0:1239e9b70ca2 7066 CYASSL_MSG("no init");
wolfSSL 0:1239e9b70ca2 7067 return 0; /* failure */
wolfSSL 0:1239e9b70ca2 7068 }
wolfSSL 0:1239e9b70ca2 7069
wolfSSL 0:1239e9b70ca2 7070 switch (ctx->cipherType) {
wolfSSL 0:1239e9b70ca2 7071
wolfSSL 0:1239e9b70ca2 7072 case AES_128_CBC_TYPE :
wolfSSL 0:1239e9b70ca2 7073 case AES_192_CBC_TYPE :
wolfSSL 0:1239e9b70ca2 7074 case AES_256_CBC_TYPE :
wolfSSL 0:1239e9b70ca2 7075 CYASSL_MSG("AES CBC");
wolfSSL 0:1239e9b70ca2 7076 if (ctx->enc)
wolfSSL 0:1239e9b70ca2 7077 ret = AesCbcEncrypt(&ctx->cipher.aes, dst, src, len);
wolfSSL 0:1239e9b70ca2 7078 else
wolfSSL 0:1239e9b70ca2 7079 ret = AesCbcDecrypt(&ctx->cipher.aes, dst, src, len);
wolfSSL 0:1239e9b70ca2 7080 break;
wolfSSL 0:1239e9b70ca2 7081
wolfSSL 0:1239e9b70ca2 7082 #ifdef CYASSL_AES_COUNTER
wolfSSL 0:1239e9b70ca2 7083 case AES_128_CTR_TYPE :
wolfSSL 0:1239e9b70ca2 7084 case AES_192_CTR_TYPE :
wolfSSL 0:1239e9b70ca2 7085 case AES_256_CTR_TYPE :
wolfSSL 0:1239e9b70ca2 7086 CYASSL_MSG("AES CTR");
wolfSSL 0:1239e9b70ca2 7087 AesCtrEncrypt(&ctx->cipher.aes, dst, src, len);
wolfSSL 0:1239e9b70ca2 7088 break;
wolfSSL 0:1239e9b70ca2 7089 #endif
wolfSSL 0:1239e9b70ca2 7090
wolfSSL 0:1239e9b70ca2 7091 case DES_CBC_TYPE :
wolfSSL 0:1239e9b70ca2 7092 if (ctx->enc)
wolfSSL 0:1239e9b70ca2 7093 Des_CbcEncrypt(&ctx->cipher.des, dst, src, len);
wolfSSL 0:1239e9b70ca2 7094 else
wolfSSL 0:1239e9b70ca2 7095 Des_CbcDecrypt(&ctx->cipher.des, dst, src, len);
wolfSSL 0:1239e9b70ca2 7096 break;
wolfSSL 0:1239e9b70ca2 7097
wolfSSL 0:1239e9b70ca2 7098 case DES_EDE3_CBC_TYPE :
wolfSSL 0:1239e9b70ca2 7099 if (ctx->enc)
wolfSSL 0:1239e9b70ca2 7100 ret = Des3_CbcEncrypt(&ctx->cipher.des3, dst, src, len);
wolfSSL 0:1239e9b70ca2 7101 else
wolfSSL 0:1239e9b70ca2 7102 ret = Des3_CbcDecrypt(&ctx->cipher.des3, dst, src, len);
wolfSSL 0:1239e9b70ca2 7103 break;
wolfSSL 0:1239e9b70ca2 7104
wolfSSL 0:1239e9b70ca2 7105 case ARC4_TYPE :
wolfSSL 0:1239e9b70ca2 7106 Arc4Process(&ctx->cipher.arc4, dst, src, len);
wolfSSL 0:1239e9b70ca2 7107 break;
wolfSSL 0:1239e9b70ca2 7108
wolfSSL 0:1239e9b70ca2 7109 case NULL_CIPHER_TYPE :
wolfSSL 0:1239e9b70ca2 7110 XMEMCPY(dst, src, len);
wolfSSL 0:1239e9b70ca2 7111 break;
wolfSSL 0:1239e9b70ca2 7112
wolfSSL 0:1239e9b70ca2 7113 default: {
wolfSSL 0:1239e9b70ca2 7114 CYASSL_MSG("bad type");
wolfSSL 0:1239e9b70ca2 7115 return 0; /* failure */
wolfSSL 0:1239e9b70ca2 7116 }
wolfSSL 0:1239e9b70ca2 7117 }
wolfSSL 0:1239e9b70ca2 7118
wolfSSL 0:1239e9b70ca2 7119 if (ret != 0) {
wolfSSL 0:1239e9b70ca2 7120 CYASSL_MSG("CyaSSL_EVP_Cipher failure");
wolfSSL 0:1239e9b70ca2 7121 return 0; /* failuer */
wolfSSL 0:1239e9b70ca2 7122 }
wolfSSL 0:1239e9b70ca2 7123
wolfSSL 0:1239e9b70ca2 7124 CYASSL_MSG("CyaSSL_EVP_Cipher success");
wolfSSL 0:1239e9b70ca2 7125 return SSL_SUCCESS; /* success */
wolfSSL 0:1239e9b70ca2 7126 }
wolfSSL 0:1239e9b70ca2 7127
wolfSSL 0:1239e9b70ca2 7128
wolfSSL 0:1239e9b70ca2 7129 /* store for external read of iv, SSL_SUCCESS on success */
wolfSSL 0:1239e9b70ca2 7130 int CyaSSL_StoreExternalIV(CYASSL_EVP_CIPHER_CTX* ctx)
wolfSSL 0:1239e9b70ca2 7131 {
wolfSSL 0:1239e9b70ca2 7132 CYASSL_ENTER("CyaSSL_StoreExternalIV");
wolfSSL 0:1239e9b70ca2 7133
wolfSSL 0:1239e9b70ca2 7134 if (ctx == NULL) {
wolfSSL 0:1239e9b70ca2 7135 CYASSL_MSG("Bad function argument");
wolfSSL 0:1239e9b70ca2 7136 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 7137 }
wolfSSL 0:1239e9b70ca2 7138
wolfSSL 0:1239e9b70ca2 7139 switch (ctx->cipherType) {
wolfSSL 0:1239e9b70ca2 7140
wolfSSL 0:1239e9b70ca2 7141 case AES_128_CBC_TYPE :
wolfSSL 0:1239e9b70ca2 7142 case AES_192_CBC_TYPE :
wolfSSL 0:1239e9b70ca2 7143 case AES_256_CBC_TYPE :
wolfSSL 0:1239e9b70ca2 7144 CYASSL_MSG("AES CBC");
wolfSSL 0:1239e9b70ca2 7145 memcpy(ctx->iv, &ctx->cipher.aes.reg, AES_BLOCK_SIZE);
wolfSSL 0:1239e9b70ca2 7146 break;
wolfSSL 0:1239e9b70ca2 7147
wolfSSL 0:1239e9b70ca2 7148 #ifdef CYASSL_AES_COUNTER
wolfSSL 0:1239e9b70ca2 7149 case AES_128_CTR_TYPE :
wolfSSL 0:1239e9b70ca2 7150 case AES_192_CTR_TYPE :
wolfSSL 0:1239e9b70ca2 7151 case AES_256_CTR_TYPE :
wolfSSL 0:1239e9b70ca2 7152 CYASSL_MSG("AES CTR");
wolfSSL 0:1239e9b70ca2 7153 memcpy(ctx->iv, &ctx->cipher.aes.reg, AES_BLOCK_SIZE);
wolfSSL 0:1239e9b70ca2 7154 break;
wolfSSL 0:1239e9b70ca2 7155 #endif
wolfSSL 0:1239e9b70ca2 7156
wolfSSL 0:1239e9b70ca2 7157 case DES_CBC_TYPE :
wolfSSL 0:1239e9b70ca2 7158 CYASSL_MSG("DES CBC");
wolfSSL 0:1239e9b70ca2 7159 memcpy(ctx->iv, &ctx->cipher.des.reg, DES_BLOCK_SIZE);
wolfSSL 0:1239e9b70ca2 7160 break;
wolfSSL 0:1239e9b70ca2 7161
wolfSSL 0:1239e9b70ca2 7162 case DES_EDE3_CBC_TYPE :
wolfSSL 0:1239e9b70ca2 7163 CYASSL_MSG("DES EDE3 CBC");
wolfSSL 0:1239e9b70ca2 7164 memcpy(ctx->iv, &ctx->cipher.des.reg, DES_BLOCK_SIZE);
wolfSSL 0:1239e9b70ca2 7165 break;
wolfSSL 0:1239e9b70ca2 7166
wolfSSL 0:1239e9b70ca2 7167 case ARC4_TYPE :
wolfSSL 0:1239e9b70ca2 7168 CYASSL_MSG("ARC4");
wolfSSL 0:1239e9b70ca2 7169 break;
wolfSSL 0:1239e9b70ca2 7170
wolfSSL 0:1239e9b70ca2 7171 case NULL_CIPHER_TYPE :
wolfSSL 0:1239e9b70ca2 7172 CYASSL_MSG("NULL");
wolfSSL 0:1239e9b70ca2 7173 break;
wolfSSL 0:1239e9b70ca2 7174
wolfSSL 0:1239e9b70ca2 7175 default: {
wolfSSL 0:1239e9b70ca2 7176 CYASSL_MSG("bad type");
wolfSSL 0:1239e9b70ca2 7177 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 7178 }
wolfSSL 0:1239e9b70ca2 7179 }
wolfSSL 0:1239e9b70ca2 7180 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 7181 }
wolfSSL 0:1239e9b70ca2 7182
wolfSSL 0:1239e9b70ca2 7183
wolfSSL 0:1239e9b70ca2 7184 /* set internal IV from external, SSL_SUCCESS on success */
wolfSSL 0:1239e9b70ca2 7185 int CyaSSL_SetInternalIV(CYASSL_EVP_CIPHER_CTX* ctx)
wolfSSL 0:1239e9b70ca2 7186 {
wolfSSL 0:1239e9b70ca2 7187
wolfSSL 0:1239e9b70ca2 7188 CYASSL_ENTER("CyaSSL_SetInternalIV");
wolfSSL 0:1239e9b70ca2 7189
wolfSSL 0:1239e9b70ca2 7190 if (ctx == NULL) {
wolfSSL 0:1239e9b70ca2 7191 CYASSL_MSG("Bad function argument");
wolfSSL 0:1239e9b70ca2 7192 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 7193 }
wolfSSL 0:1239e9b70ca2 7194
wolfSSL 0:1239e9b70ca2 7195 switch (ctx->cipherType) {
wolfSSL 0:1239e9b70ca2 7196
wolfSSL 0:1239e9b70ca2 7197 case AES_128_CBC_TYPE :
wolfSSL 0:1239e9b70ca2 7198 case AES_192_CBC_TYPE :
wolfSSL 0:1239e9b70ca2 7199 case AES_256_CBC_TYPE :
wolfSSL 0:1239e9b70ca2 7200 CYASSL_MSG("AES CBC");
wolfSSL 0:1239e9b70ca2 7201 memcpy(&ctx->cipher.aes.reg, ctx->iv, AES_BLOCK_SIZE);
wolfSSL 0:1239e9b70ca2 7202 break;
wolfSSL 0:1239e9b70ca2 7203
wolfSSL 0:1239e9b70ca2 7204 #ifdef CYASSL_AES_COUNTER
wolfSSL 0:1239e9b70ca2 7205 case AES_128_CTR_TYPE :
wolfSSL 0:1239e9b70ca2 7206 case AES_192_CTR_TYPE :
wolfSSL 0:1239e9b70ca2 7207 case AES_256_CTR_TYPE :
wolfSSL 0:1239e9b70ca2 7208 CYASSL_MSG("AES CTR");
wolfSSL 0:1239e9b70ca2 7209 memcpy(&ctx->cipher.aes.reg, ctx->iv, AES_BLOCK_SIZE);
wolfSSL 0:1239e9b70ca2 7210 break;
wolfSSL 0:1239e9b70ca2 7211 #endif
wolfSSL 0:1239e9b70ca2 7212
wolfSSL 0:1239e9b70ca2 7213 case DES_CBC_TYPE :
wolfSSL 0:1239e9b70ca2 7214 CYASSL_MSG("DES CBC");
wolfSSL 0:1239e9b70ca2 7215 memcpy(&ctx->cipher.des.reg, ctx->iv, DES_BLOCK_SIZE);
wolfSSL 0:1239e9b70ca2 7216 break;
wolfSSL 0:1239e9b70ca2 7217
wolfSSL 0:1239e9b70ca2 7218 case DES_EDE3_CBC_TYPE :
wolfSSL 0:1239e9b70ca2 7219 CYASSL_MSG("DES EDE3 CBC");
wolfSSL 0:1239e9b70ca2 7220 memcpy(&ctx->cipher.des.reg, ctx->iv, DES_BLOCK_SIZE);
wolfSSL 0:1239e9b70ca2 7221 break;
wolfSSL 0:1239e9b70ca2 7222
wolfSSL 0:1239e9b70ca2 7223 case ARC4_TYPE :
wolfSSL 0:1239e9b70ca2 7224 CYASSL_MSG("ARC4");
wolfSSL 0:1239e9b70ca2 7225 break;
wolfSSL 0:1239e9b70ca2 7226
wolfSSL 0:1239e9b70ca2 7227 case NULL_CIPHER_TYPE :
wolfSSL 0:1239e9b70ca2 7228 CYASSL_MSG("NULL");
wolfSSL 0:1239e9b70ca2 7229 break;
wolfSSL 0:1239e9b70ca2 7230
wolfSSL 0:1239e9b70ca2 7231 default: {
wolfSSL 0:1239e9b70ca2 7232 CYASSL_MSG("bad type");
wolfSSL 0:1239e9b70ca2 7233 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 7234 }
wolfSSL 0:1239e9b70ca2 7235 }
wolfSSL 0:1239e9b70ca2 7236 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 7237 }
wolfSSL 0:1239e9b70ca2 7238
wolfSSL 0:1239e9b70ca2 7239
wolfSSL 0:1239e9b70ca2 7240 /* SSL_SUCCESS on ok */
wolfSSL 0:1239e9b70ca2 7241 int CyaSSL_EVP_DigestInit(CYASSL_EVP_MD_CTX* ctx, const CYASSL_EVP_MD* type)
wolfSSL 0:1239e9b70ca2 7242 {
wolfSSL 0:1239e9b70ca2 7243 CYASSL_ENTER("EVP_DigestInit");
wolfSSL 0:1239e9b70ca2 7244 if (XSTRNCMP(type, "MD5", 3) == 0) {
wolfSSL 0:1239e9b70ca2 7245 ctx->macType = MD5;
wolfSSL 0:1239e9b70ca2 7246 CyaSSL_MD5_Init((MD5_CTX*)&ctx->hash);
wolfSSL 0:1239e9b70ca2 7247 }
wolfSSL 0:1239e9b70ca2 7248 else if (XSTRNCMP(type, "SHA256", 6) == 0) {
wolfSSL 0:1239e9b70ca2 7249 ctx->macType = SHA256;
wolfSSL 0:1239e9b70ca2 7250 CyaSSL_SHA256_Init((SHA256_CTX*)&ctx->hash);
wolfSSL 0:1239e9b70ca2 7251 }
wolfSSL 0:1239e9b70ca2 7252 #ifdef CYASSL_SHA384
wolfSSL 0:1239e9b70ca2 7253 else if (XSTRNCMP(type, "SHA384", 6) == 0) {
wolfSSL 0:1239e9b70ca2 7254 ctx->macType = SHA384;
wolfSSL 0:1239e9b70ca2 7255 CyaSSL_SHA384_Init((SHA384_CTX*)&ctx->hash);
wolfSSL 0:1239e9b70ca2 7256 }
wolfSSL 0:1239e9b70ca2 7257 #endif
wolfSSL 0:1239e9b70ca2 7258 #ifdef CYASSL_SHA512
wolfSSL 0:1239e9b70ca2 7259 else if (XSTRNCMP(type, "SHA512", 6) == 0) {
wolfSSL 0:1239e9b70ca2 7260 ctx->macType = SHA512;
wolfSSL 0:1239e9b70ca2 7261 CyaSSL_SHA512_Init((SHA512_CTX*)&ctx->hash);
wolfSSL 0:1239e9b70ca2 7262 }
wolfSSL 0:1239e9b70ca2 7263 #endif
wolfSSL 0:1239e9b70ca2 7264 /* has to be last since would pick or 256, 384, or 512 too */
wolfSSL 0:1239e9b70ca2 7265 else if (XSTRNCMP(type, "SHA", 3) == 0) {
wolfSSL 0:1239e9b70ca2 7266 ctx->macType = SHA;
wolfSSL 0:1239e9b70ca2 7267 CyaSSL_SHA_Init((SHA_CTX*)&ctx->hash);
wolfSSL 0:1239e9b70ca2 7268 }
wolfSSL 0:1239e9b70ca2 7269 else
wolfSSL 0:1239e9b70ca2 7270 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 7271
wolfSSL 0:1239e9b70ca2 7272 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 7273 }
wolfSSL 0:1239e9b70ca2 7274
wolfSSL 0:1239e9b70ca2 7275
wolfSSL 0:1239e9b70ca2 7276 /* SSL_SUCCESS on ok */
wolfSSL 0:1239e9b70ca2 7277 int CyaSSL_EVP_DigestUpdate(CYASSL_EVP_MD_CTX* ctx, const void* data,
wolfSSL 0:1239e9b70ca2 7278 unsigned long sz)
wolfSSL 0:1239e9b70ca2 7279 {
wolfSSL 0:1239e9b70ca2 7280 CYASSL_ENTER("EVP_DigestUpdate");
wolfSSL 0:1239e9b70ca2 7281 if (ctx->macType == MD5)
wolfSSL 0:1239e9b70ca2 7282 CyaSSL_MD5_Update((MD5_CTX*)&ctx->hash, data, (unsigned long)sz);
wolfSSL 0:1239e9b70ca2 7283 else if (ctx->macType == SHA)
wolfSSL 0:1239e9b70ca2 7284 CyaSSL_SHA_Update((SHA_CTX*)&ctx->hash, data, (unsigned long)sz);
wolfSSL 0:1239e9b70ca2 7285 else if (ctx->macType == SHA256)
wolfSSL 0:1239e9b70ca2 7286 CyaSSL_SHA256_Update((SHA256_CTX*)&ctx->hash, data,
wolfSSL 0:1239e9b70ca2 7287 (unsigned long)sz);
wolfSSL 0:1239e9b70ca2 7288 #ifdef CYASSL_SHA384
wolfSSL 0:1239e9b70ca2 7289 else if (ctx->macType == SHA384)
wolfSSL 0:1239e9b70ca2 7290 CyaSSL_SHA384_Update((SHA384_CTX*)&ctx->hash, data,
wolfSSL 0:1239e9b70ca2 7291 (unsigned long)sz);
wolfSSL 0:1239e9b70ca2 7292 #endif
wolfSSL 0:1239e9b70ca2 7293 #ifdef CYASSL_SHA512
wolfSSL 0:1239e9b70ca2 7294 else if (ctx->macType == SHA512)
wolfSSL 0:1239e9b70ca2 7295 CyaSSL_SHA512_Update((SHA512_CTX*)&ctx->hash, data,
wolfSSL 0:1239e9b70ca2 7296 (unsigned long)sz);
wolfSSL 0:1239e9b70ca2 7297 #endif
wolfSSL 0:1239e9b70ca2 7298 else
wolfSSL 0:1239e9b70ca2 7299 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 7300
wolfSSL 0:1239e9b70ca2 7301 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 7302 }
wolfSSL 0:1239e9b70ca2 7303
wolfSSL 0:1239e9b70ca2 7304
wolfSSL 0:1239e9b70ca2 7305 /* SSL_SUCCESS on ok */
wolfSSL 0:1239e9b70ca2 7306 int CyaSSL_EVP_DigestFinal(CYASSL_EVP_MD_CTX* ctx, unsigned char* md,
wolfSSL 0:1239e9b70ca2 7307 unsigned int* s)
wolfSSL 0:1239e9b70ca2 7308 {
wolfSSL 0:1239e9b70ca2 7309 CYASSL_ENTER("EVP_DigestFinal");
wolfSSL 0:1239e9b70ca2 7310 if (ctx->macType == MD5) {
wolfSSL 0:1239e9b70ca2 7311 CyaSSL_MD5_Final(md, (MD5_CTX*)&ctx->hash);
wolfSSL 0:1239e9b70ca2 7312 if (s) *s = MD5_DIGEST_SIZE;
wolfSSL 0:1239e9b70ca2 7313 }
wolfSSL 0:1239e9b70ca2 7314 else if (ctx->macType == SHA) {
wolfSSL 0:1239e9b70ca2 7315 CyaSSL_SHA_Final(md, (SHA_CTX*)&ctx->hash);
wolfSSL 0:1239e9b70ca2 7316 if (s) *s = SHA_DIGEST_SIZE;
wolfSSL 0:1239e9b70ca2 7317 }
wolfSSL 0:1239e9b70ca2 7318 else if (ctx->macType == SHA256) {
wolfSSL 0:1239e9b70ca2 7319 CyaSSL_SHA256_Final(md, (SHA256_CTX*)&ctx->hash);
wolfSSL 0:1239e9b70ca2 7320 if (s) *s = SHA256_DIGEST_SIZE;
wolfSSL 0:1239e9b70ca2 7321 }
wolfSSL 0:1239e9b70ca2 7322 #ifdef CYASSL_SHA384
wolfSSL 0:1239e9b70ca2 7323 else if (ctx->macType == SHA384) {
wolfSSL 0:1239e9b70ca2 7324 CyaSSL_SHA384_Final(md, (SHA384_CTX*)&ctx->hash);
wolfSSL 0:1239e9b70ca2 7325 if (s) *s = SHA384_DIGEST_SIZE;
wolfSSL 0:1239e9b70ca2 7326 }
wolfSSL 0:1239e9b70ca2 7327 #endif
wolfSSL 0:1239e9b70ca2 7328 #ifdef CYASSL_SHA512
wolfSSL 0:1239e9b70ca2 7329 else if (ctx->macType == SHA512) {
wolfSSL 0:1239e9b70ca2 7330 CyaSSL_SHA512_Final(md, (SHA512_CTX*)&ctx->hash);
wolfSSL 0:1239e9b70ca2 7331 if (s) *s = SHA512_DIGEST_SIZE;
wolfSSL 0:1239e9b70ca2 7332 }
wolfSSL 0:1239e9b70ca2 7333 #endif
wolfSSL 0:1239e9b70ca2 7334 else
wolfSSL 0:1239e9b70ca2 7335 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 7336
wolfSSL 0:1239e9b70ca2 7337 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 7338 }
wolfSSL 0:1239e9b70ca2 7339
wolfSSL 0:1239e9b70ca2 7340
wolfSSL 0:1239e9b70ca2 7341 /* SSL_SUCCESS on ok */
wolfSSL 0:1239e9b70ca2 7342 int CyaSSL_EVP_DigestFinal_ex(CYASSL_EVP_MD_CTX* ctx, unsigned char* md,
wolfSSL 0:1239e9b70ca2 7343 unsigned int* s)
wolfSSL 0:1239e9b70ca2 7344 {
wolfSSL 0:1239e9b70ca2 7345 CYASSL_ENTER("EVP_DigestFinal_ex");
wolfSSL 0:1239e9b70ca2 7346 return EVP_DigestFinal(ctx, md, s);
wolfSSL 0:1239e9b70ca2 7347 }
wolfSSL 0:1239e9b70ca2 7348
wolfSSL 0:1239e9b70ca2 7349
wolfSSL 0:1239e9b70ca2 7350 unsigned char* CyaSSL_HMAC(const CYASSL_EVP_MD* evp_md, const void* key,
wolfSSL 0:1239e9b70ca2 7351 int key_len, const unsigned char* d, int n,
wolfSSL 0:1239e9b70ca2 7352 unsigned char* md, unsigned int* md_len)
wolfSSL 0:1239e9b70ca2 7353 {
wolfSSL 0:1239e9b70ca2 7354 Hmac hmac;
wolfSSL 0:1239e9b70ca2 7355
wolfSSL 0:1239e9b70ca2 7356 CYASSL_ENTER("HMAC");
wolfSSL 0:1239e9b70ca2 7357 if (!md) return NULL; /* no static buffer support */
wolfSSL 0:1239e9b70ca2 7358
wolfSSL 0:1239e9b70ca2 7359 if (XSTRNCMP(evp_md, "MD5", 3) == 0) {
wolfSSL 0:1239e9b70ca2 7360 if (HmacSetKey(&hmac, MD5, (const byte*)key, key_len) != 0)
wolfSSL 0:1239e9b70ca2 7361 return NULL;
wolfSSL 0:1239e9b70ca2 7362
wolfSSL 0:1239e9b70ca2 7363 if (md_len) *md_len = MD5_DIGEST_SIZE;
wolfSSL 0:1239e9b70ca2 7364 }
wolfSSL 0:1239e9b70ca2 7365 else if (XSTRNCMP(evp_md, "SHA", 3) == 0) {
wolfSSL 0:1239e9b70ca2 7366 if (HmacSetKey(&hmac, SHA, (const byte*)key, key_len) != 0)
wolfSSL 0:1239e9b70ca2 7367 return NULL;
wolfSSL 0:1239e9b70ca2 7368
wolfSSL 0:1239e9b70ca2 7369 if (md_len) *md_len = SHA_DIGEST_SIZE;
wolfSSL 0:1239e9b70ca2 7370 }
wolfSSL 0:1239e9b70ca2 7371 else
wolfSSL 0:1239e9b70ca2 7372 return NULL;
wolfSSL 0:1239e9b70ca2 7373
wolfSSL 0:1239e9b70ca2 7374 if (HmacUpdate(&hmac, d, n) != 0)
wolfSSL 0:1239e9b70ca2 7375 return NULL;
wolfSSL 0:1239e9b70ca2 7376
wolfSSL 0:1239e9b70ca2 7377 if (HmacFinal(&hmac, md) != 0)
wolfSSL 0:1239e9b70ca2 7378 return NULL;
wolfSSL 0:1239e9b70ca2 7379
wolfSSL 0:1239e9b70ca2 7380 return md;
wolfSSL 0:1239e9b70ca2 7381 }
wolfSSL 0:1239e9b70ca2 7382
wolfSSL 0:1239e9b70ca2 7383 void CyaSSL_ERR_clear_error(void)
wolfSSL 0:1239e9b70ca2 7384 {
wolfSSL 0:1239e9b70ca2 7385 /* TODO: */
wolfSSL 0:1239e9b70ca2 7386 }
wolfSSL 0:1239e9b70ca2 7387
wolfSSL 0:1239e9b70ca2 7388
wolfSSL 0:1239e9b70ca2 7389 int CyaSSL_RAND_status(void)
wolfSSL 0:1239e9b70ca2 7390 {
wolfSSL 0:1239e9b70ca2 7391 return SSL_SUCCESS; /* CTaoCrypt provides enough seed internally */
wolfSSL 0:1239e9b70ca2 7392 }
wolfSSL 0:1239e9b70ca2 7393
wolfSSL 0:1239e9b70ca2 7394
wolfSSL 0:1239e9b70ca2 7395
wolfSSL 0:1239e9b70ca2 7396 void CyaSSL_RAND_add(const void* add, int len, double entropy)
wolfSSL 0:1239e9b70ca2 7397 {
wolfSSL 0:1239e9b70ca2 7398 (void)add;
wolfSSL 0:1239e9b70ca2 7399 (void)len;
wolfSSL 0:1239e9b70ca2 7400 (void)entropy;
wolfSSL 0:1239e9b70ca2 7401
wolfSSL 0:1239e9b70ca2 7402 /* CyaSSL seeds/adds internally, use explicit RNG if you want
wolfSSL 0:1239e9b70ca2 7403 to take control */
wolfSSL 0:1239e9b70ca2 7404 }
wolfSSL 0:1239e9b70ca2 7405
wolfSSL 0:1239e9b70ca2 7406
wolfSSL 0:1239e9b70ca2 7407 /* SSL_SUCCESS on ok */
wolfSSL 0:1239e9b70ca2 7408 int CyaSSL_DES_key_sched(CYASSL_const_DES_cblock* key,
wolfSSL 0:1239e9b70ca2 7409 CYASSL_DES_key_schedule* schedule)
wolfSSL 0:1239e9b70ca2 7410 {
wolfSSL 0:1239e9b70ca2 7411 CYASSL_ENTER("DES_key_sched");
wolfSSL 0:1239e9b70ca2 7412 XMEMCPY(schedule, key, sizeof(const_DES_cblock));
wolfSSL 0:1239e9b70ca2 7413 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 7414 }
wolfSSL 0:1239e9b70ca2 7415
wolfSSL 0:1239e9b70ca2 7416
wolfSSL 0:1239e9b70ca2 7417 void CyaSSL_DES_cbc_encrypt(const unsigned char* input,
wolfSSL 0:1239e9b70ca2 7418 unsigned char* output, long length,
wolfSSL 0:1239e9b70ca2 7419 CYASSL_DES_key_schedule* schedule, CYASSL_DES_cblock* ivec,
wolfSSL 0:1239e9b70ca2 7420 int enc)
wolfSSL 0:1239e9b70ca2 7421 {
wolfSSL 0:1239e9b70ca2 7422 Des myDes;
wolfSSL 0:1239e9b70ca2 7423
wolfSSL 0:1239e9b70ca2 7424 CYASSL_ENTER("DES_cbc_encrypt");
wolfSSL 0:1239e9b70ca2 7425
wolfSSL 0:1239e9b70ca2 7426 /* OpenSSL compat, no ret */
wolfSSL 0:1239e9b70ca2 7427 Des_SetKey(&myDes, (const byte*)schedule, (const byte*)ivec, !enc);
wolfSSL 0:1239e9b70ca2 7428
wolfSSL 0:1239e9b70ca2 7429 if (enc)
wolfSSL 0:1239e9b70ca2 7430 Des_CbcEncrypt(&myDes, output, input, (word32)length);
wolfSSL 0:1239e9b70ca2 7431 else
wolfSSL 0:1239e9b70ca2 7432 Des_CbcDecrypt(&myDes, output, input, (word32)length);
wolfSSL 0:1239e9b70ca2 7433 }
wolfSSL 0:1239e9b70ca2 7434
wolfSSL 0:1239e9b70ca2 7435
wolfSSL 0:1239e9b70ca2 7436 /* correctly sets ivec for next call */
wolfSSL 0:1239e9b70ca2 7437 void CyaSSL_DES_ncbc_encrypt(const unsigned char* input,
wolfSSL 0:1239e9b70ca2 7438 unsigned char* output, long length,
wolfSSL 0:1239e9b70ca2 7439 CYASSL_DES_key_schedule* schedule, CYASSL_DES_cblock* ivec,
wolfSSL 0:1239e9b70ca2 7440 int enc)
wolfSSL 0:1239e9b70ca2 7441 {
wolfSSL 0:1239e9b70ca2 7442 Des myDes;
wolfSSL 0:1239e9b70ca2 7443
wolfSSL 0:1239e9b70ca2 7444 CYASSL_ENTER("DES_ncbc_encrypt");
wolfSSL 0:1239e9b70ca2 7445
wolfSSL 0:1239e9b70ca2 7446 /* OpenSSL compat, no ret */
wolfSSL 0:1239e9b70ca2 7447 Des_SetKey(&myDes, (const byte*)schedule, (const byte*)ivec, !enc);
wolfSSL 0:1239e9b70ca2 7448
wolfSSL 0:1239e9b70ca2 7449 if (enc)
wolfSSL 0:1239e9b70ca2 7450 Des_CbcEncrypt(&myDes, output, input, (word32)length);
wolfSSL 0:1239e9b70ca2 7451 else
wolfSSL 0:1239e9b70ca2 7452 Des_CbcDecrypt(&myDes, output, input, (word32)length);
wolfSSL 0:1239e9b70ca2 7453
wolfSSL 0:1239e9b70ca2 7454 XMEMCPY(ivec, output + length - sizeof(DES_cblock), sizeof(DES_cblock));
wolfSSL 0:1239e9b70ca2 7455 }
wolfSSL 0:1239e9b70ca2 7456
wolfSSL 0:1239e9b70ca2 7457
wolfSSL 0:1239e9b70ca2 7458 void CyaSSL_ERR_free_strings(void)
wolfSSL 0:1239e9b70ca2 7459 {
wolfSSL 0:1239e9b70ca2 7460 /* handled internally */
wolfSSL 0:1239e9b70ca2 7461 }
wolfSSL 0:1239e9b70ca2 7462
wolfSSL 0:1239e9b70ca2 7463
wolfSSL 0:1239e9b70ca2 7464 void CyaSSL_ERR_remove_state(unsigned long state)
wolfSSL 0:1239e9b70ca2 7465 {
wolfSSL 0:1239e9b70ca2 7466 /* TODO: GetErrors().Remove(); */
wolfSSL 0:1239e9b70ca2 7467 (void)state;
wolfSSL 0:1239e9b70ca2 7468 }
wolfSSL 0:1239e9b70ca2 7469
wolfSSL 0:1239e9b70ca2 7470
wolfSSL 0:1239e9b70ca2 7471 void CyaSSL_EVP_cleanup(void)
wolfSSL 0:1239e9b70ca2 7472 {
wolfSSL 0:1239e9b70ca2 7473 /* nothing to do here */
wolfSSL 0:1239e9b70ca2 7474 }
wolfSSL 0:1239e9b70ca2 7475
wolfSSL 0:1239e9b70ca2 7476
wolfSSL 0:1239e9b70ca2 7477 void CyaSSL_cleanup_all_ex_data(void)
wolfSSL 0:1239e9b70ca2 7478 {
wolfSSL 0:1239e9b70ca2 7479 /* nothing to do here */
wolfSSL 0:1239e9b70ca2 7480 }
wolfSSL 0:1239e9b70ca2 7481
wolfSSL 0:1239e9b70ca2 7482
wolfSSL 0:1239e9b70ca2 7483 long CyaSSL_CTX_set_mode(CYASSL_CTX* ctx, long mode)
wolfSSL 0:1239e9b70ca2 7484 {
wolfSSL 0:1239e9b70ca2 7485 /* SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER is CyaSSL default mode */
wolfSSL 0:1239e9b70ca2 7486
wolfSSL 0:1239e9b70ca2 7487 CYASSL_ENTER("SSL_CTX_set_mode");
wolfSSL 0:1239e9b70ca2 7488 if (mode == SSL_MODE_ENABLE_PARTIAL_WRITE)
wolfSSL 0:1239e9b70ca2 7489 ctx->partialWrite = 1;
wolfSSL 0:1239e9b70ca2 7490
wolfSSL 0:1239e9b70ca2 7491 return mode;
wolfSSL 0:1239e9b70ca2 7492 }
wolfSSL 0:1239e9b70ca2 7493
wolfSSL 0:1239e9b70ca2 7494
wolfSSL 0:1239e9b70ca2 7495 long CyaSSL_CTX_get_mode(CYASSL_CTX* ctx)
wolfSSL 0:1239e9b70ca2 7496 {
wolfSSL 0:1239e9b70ca2 7497 /* TODO: */
wolfSSL 0:1239e9b70ca2 7498 (void)ctx;
wolfSSL 0:1239e9b70ca2 7499 return 0;
wolfSSL 0:1239e9b70ca2 7500 }
wolfSSL 0:1239e9b70ca2 7501
wolfSSL 0:1239e9b70ca2 7502
wolfSSL 0:1239e9b70ca2 7503 void CyaSSL_CTX_set_default_read_ahead(CYASSL_CTX* ctx, int m)
wolfSSL 0:1239e9b70ca2 7504 {
wolfSSL 0:1239e9b70ca2 7505 /* TODO: maybe? */
wolfSSL 0:1239e9b70ca2 7506 (void)ctx;
wolfSSL 0:1239e9b70ca2 7507 (void)m;
wolfSSL 0:1239e9b70ca2 7508 }
wolfSSL 0:1239e9b70ca2 7509
wolfSSL 0:1239e9b70ca2 7510
wolfSSL 0:1239e9b70ca2 7511 int CyaSSL_CTX_set_session_id_context(CYASSL_CTX* ctx,
wolfSSL 0:1239e9b70ca2 7512 const unsigned char* sid_ctx,
wolfSSL 0:1239e9b70ca2 7513 unsigned int sid_ctx_len)
wolfSSL 0:1239e9b70ca2 7514 {
wolfSSL 0:1239e9b70ca2 7515 /* No application specific context needed for cyaSSL */
wolfSSL 0:1239e9b70ca2 7516 (void)ctx;
wolfSSL 0:1239e9b70ca2 7517 (void)sid_ctx;
wolfSSL 0:1239e9b70ca2 7518 (void)sid_ctx_len;
wolfSSL 0:1239e9b70ca2 7519 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 7520 }
wolfSSL 0:1239e9b70ca2 7521
wolfSSL 0:1239e9b70ca2 7522
wolfSSL 0:1239e9b70ca2 7523 long CyaSSL_CTX_sess_get_cache_size(CYASSL_CTX* ctx)
wolfSSL 0:1239e9b70ca2 7524 {
wolfSSL 0:1239e9b70ca2 7525 /* TODO: maybe? */
wolfSSL 0:1239e9b70ca2 7526 (void)ctx;
wolfSSL 0:1239e9b70ca2 7527 return (~0);
wolfSSL 0:1239e9b70ca2 7528 }
wolfSSL 0:1239e9b70ca2 7529
wolfSSL 0:1239e9b70ca2 7530 unsigned long CyaSSL_ERR_get_error_line_data(const char** file, int* line,
wolfSSL 0:1239e9b70ca2 7531 const char** data, int *flags)
wolfSSL 0:1239e9b70ca2 7532 {
wolfSSL 0:1239e9b70ca2 7533 /* Not implemented */
wolfSSL 0:1239e9b70ca2 7534 (void)file;
wolfSSL 0:1239e9b70ca2 7535 (void)line;
wolfSSL 0:1239e9b70ca2 7536 (void)data;
wolfSSL 0:1239e9b70ca2 7537 (void)flags;
wolfSSL 0:1239e9b70ca2 7538 return 0;
wolfSSL 0:1239e9b70ca2 7539 }
wolfSSL 0:1239e9b70ca2 7540
wolfSSL 0:1239e9b70ca2 7541 #endif /* OPENSSL_EXTRA */
wolfSSL 0:1239e9b70ca2 7542
wolfSSL 0:1239e9b70ca2 7543
wolfSSL 0:1239e9b70ca2 7544 #if defined(KEEP_PEER_CERT)
wolfSSL 0:1239e9b70ca2 7545
wolfSSL 0:1239e9b70ca2 7546 CYASSL_X509* CyaSSL_get_peer_certificate(CYASSL* ssl)
wolfSSL 0:1239e9b70ca2 7547 {
wolfSSL 0:1239e9b70ca2 7548 CYASSL_ENTER("SSL_get_peer_certificate");
wolfSSL 0:1239e9b70ca2 7549 if (ssl->peerCert.issuer.sz)
wolfSSL 0:1239e9b70ca2 7550 return &ssl->peerCert;
wolfSSL 0:1239e9b70ca2 7551 else
wolfSSL 0:1239e9b70ca2 7552 return 0;
wolfSSL 0:1239e9b70ca2 7553 }
wolfSSL 0:1239e9b70ca2 7554
wolfSSL 0:1239e9b70ca2 7555 #endif /* KEEP_PEER_CERT */
wolfSSL 0:1239e9b70ca2 7556
wolfSSL 0:1239e9b70ca2 7557
wolfSSL 0:1239e9b70ca2 7558 #if defined(KEEP_PEER_CERT) || defined(SESSION_CERTS)
wolfSSL 0:1239e9b70ca2 7559
wolfSSL 0:1239e9b70ca2 7560 void CyaSSL_FreeX509(CYASSL_X509* x509)
wolfSSL 0:1239e9b70ca2 7561 {
wolfSSL 0:1239e9b70ca2 7562 CYASSL_ENTER("CyaSSL_FreeX509");
wolfSSL 0:1239e9b70ca2 7563 FreeX509(x509);
wolfSSL 0:1239e9b70ca2 7564 }
wolfSSL 0:1239e9b70ca2 7565
wolfSSL 0:1239e9b70ca2 7566
wolfSSL 0:1239e9b70ca2 7567 /* return the next, if any, altname from the peer cert */
wolfSSL 0:1239e9b70ca2 7568 char* CyaSSL_X509_get_next_altname(CYASSL_X509* cert)
wolfSSL 0:1239e9b70ca2 7569 {
wolfSSL 0:1239e9b70ca2 7570 char* ret = NULL;
wolfSSL 0:1239e9b70ca2 7571 CYASSL_ENTER("CyaSSL_X509_get_next_altname");
wolfSSL 0:1239e9b70ca2 7572
wolfSSL 0:1239e9b70ca2 7573 /* don't have any to work with */
wolfSSL 0:1239e9b70ca2 7574 if (cert == NULL || cert->altNames == NULL)
wolfSSL 0:1239e9b70ca2 7575 return NULL;
wolfSSL 0:1239e9b70ca2 7576
wolfSSL 0:1239e9b70ca2 7577 /* already went through them */
wolfSSL 0:1239e9b70ca2 7578 if (cert->altNamesNext == NULL)
wolfSSL 0:1239e9b70ca2 7579 return NULL;
wolfSSL 0:1239e9b70ca2 7580
wolfSSL 0:1239e9b70ca2 7581 ret = cert->altNamesNext->name;
wolfSSL 0:1239e9b70ca2 7582 cert->altNamesNext = cert->altNamesNext->next;
wolfSSL 0:1239e9b70ca2 7583
wolfSSL 0:1239e9b70ca2 7584 return ret;
wolfSSL 0:1239e9b70ca2 7585 }
wolfSSL 0:1239e9b70ca2 7586
wolfSSL 0:1239e9b70ca2 7587
wolfSSL 0:1239e9b70ca2 7588 CYASSL_X509_NAME* CyaSSL_X509_get_issuer_name(CYASSL_X509* cert)
wolfSSL 0:1239e9b70ca2 7589 {
wolfSSL 0:1239e9b70ca2 7590 CYASSL_ENTER("X509_get_issuer_name");
wolfSSL 0:1239e9b70ca2 7591 return &cert->issuer;
wolfSSL 0:1239e9b70ca2 7592 }
wolfSSL 0:1239e9b70ca2 7593
wolfSSL 0:1239e9b70ca2 7594
wolfSSL 0:1239e9b70ca2 7595 CYASSL_X509_NAME* CyaSSL_X509_get_subject_name(CYASSL_X509* cert)
wolfSSL 0:1239e9b70ca2 7596 {
wolfSSL 0:1239e9b70ca2 7597 CYASSL_ENTER("X509_get_subject_name");
wolfSSL 0:1239e9b70ca2 7598 return &cert->subject;
wolfSSL 0:1239e9b70ca2 7599 }
wolfSSL 0:1239e9b70ca2 7600
wolfSSL 0:1239e9b70ca2 7601
wolfSSL 0:1239e9b70ca2 7602 int CyaSSL_X509_get_isCA(CYASSL_X509* x509)
wolfSSL 0:1239e9b70ca2 7603 {
wolfSSL 0:1239e9b70ca2 7604 int isCA = 0;
wolfSSL 0:1239e9b70ca2 7605
wolfSSL 0:1239e9b70ca2 7606 CYASSL_ENTER("CyaSSL_X509_get_isCA");
wolfSSL 0:1239e9b70ca2 7607
wolfSSL 0:1239e9b70ca2 7608 if (x509 != NULL)
wolfSSL 0:1239e9b70ca2 7609 isCA = x509->isCa;
wolfSSL 0:1239e9b70ca2 7610
wolfSSL 0:1239e9b70ca2 7611 CYASSL_LEAVE("CyaSSL_X509_get_isCA", isCA);
wolfSSL 0:1239e9b70ca2 7612
wolfSSL 0:1239e9b70ca2 7613 return isCA;
wolfSSL 0:1239e9b70ca2 7614 }
wolfSSL 0:1239e9b70ca2 7615
wolfSSL 0:1239e9b70ca2 7616
wolfSSL 0:1239e9b70ca2 7617 #ifdef OPENSSL_EXTRA
wolfSSL 0:1239e9b70ca2 7618 int CyaSSL_X509_ext_isSet_by_NID(CYASSL_X509* x509, int nid)
wolfSSL 0:1239e9b70ca2 7619 {
wolfSSL 0:1239e9b70ca2 7620 int isSet = 0;
wolfSSL 0:1239e9b70ca2 7621
wolfSSL 0:1239e9b70ca2 7622 CYASSL_ENTER("CyaSSL_X509_ext_isSet_by_NID");
wolfSSL 0:1239e9b70ca2 7623
wolfSSL 0:1239e9b70ca2 7624 if (x509 != NULL) {
wolfSSL 0:1239e9b70ca2 7625 switch (nid) {
wolfSSL 0:1239e9b70ca2 7626 case BASIC_CA_OID: isSet = x509->basicConstSet; break;
wolfSSL 0:1239e9b70ca2 7627 case ALT_NAMES_OID: isSet = x509->subjAltNameSet; break;
wolfSSL 0:1239e9b70ca2 7628 case AUTH_KEY_OID: isSet = x509->authKeyIdSet; break;
wolfSSL 0:1239e9b70ca2 7629 case SUBJ_KEY_OID: isSet = x509->subjKeyIdSet; break;
wolfSSL 0:1239e9b70ca2 7630 case KEY_USAGE_OID: isSet = x509->keyUsageSet; break;
wolfSSL 0:1239e9b70ca2 7631 #ifdef CYASSL_SEP
wolfSSL 0:1239e9b70ca2 7632 case CERT_POLICY_OID: isSet = x509->certPolicySet; break;
wolfSSL 0:1239e9b70ca2 7633 #endif /* CYASSL_SEP */
wolfSSL 0:1239e9b70ca2 7634 }
wolfSSL 0:1239e9b70ca2 7635 }
wolfSSL 0:1239e9b70ca2 7636
wolfSSL 0:1239e9b70ca2 7637 CYASSL_LEAVE("CyaSSL_X509_ext_isSet_by_NID", isSet);
wolfSSL 0:1239e9b70ca2 7638
wolfSSL 0:1239e9b70ca2 7639 return isSet;
wolfSSL 0:1239e9b70ca2 7640 }
wolfSSL 0:1239e9b70ca2 7641
wolfSSL 0:1239e9b70ca2 7642
wolfSSL 0:1239e9b70ca2 7643 int CyaSSL_X509_ext_get_critical_by_NID(CYASSL_X509* x509, int nid)
wolfSSL 0:1239e9b70ca2 7644 {
wolfSSL 0:1239e9b70ca2 7645 int crit = 0;
wolfSSL 0:1239e9b70ca2 7646
wolfSSL 0:1239e9b70ca2 7647 CYASSL_ENTER("CyaSSL_X509_ext_get_critical_by_NID");
wolfSSL 0:1239e9b70ca2 7648
wolfSSL 0:1239e9b70ca2 7649 if (x509 != NULL) {
wolfSSL 0:1239e9b70ca2 7650 switch (nid) {
wolfSSL 0:1239e9b70ca2 7651 case BASIC_CA_OID: crit = x509->basicConstCrit; break;
wolfSSL 0:1239e9b70ca2 7652 case ALT_NAMES_OID: crit = x509->subjAltNameCrit; break;
wolfSSL 0:1239e9b70ca2 7653 case AUTH_KEY_OID: crit = x509->authKeyIdCrit; break;
wolfSSL 0:1239e9b70ca2 7654 case SUBJ_KEY_OID: crit = x509->subjKeyIdCrit; break;
wolfSSL 0:1239e9b70ca2 7655 case KEY_USAGE_OID: crit = x509->keyUsageCrit; break;
wolfSSL 0:1239e9b70ca2 7656 #ifdef CYASSL_SEP
wolfSSL 0:1239e9b70ca2 7657 case CERT_POLICY_OID: crit = x509->certPolicyCrit; break;
wolfSSL 0:1239e9b70ca2 7658 #endif /* CYASSL_SEP */
wolfSSL 0:1239e9b70ca2 7659 }
wolfSSL 0:1239e9b70ca2 7660 }
wolfSSL 0:1239e9b70ca2 7661
wolfSSL 0:1239e9b70ca2 7662 CYASSL_LEAVE("CyaSSL_X509_ext_get_critical_by_NID", crit);
wolfSSL 0:1239e9b70ca2 7663
wolfSSL 0:1239e9b70ca2 7664 return crit;
wolfSSL 0:1239e9b70ca2 7665 }
wolfSSL 0:1239e9b70ca2 7666
wolfSSL 0:1239e9b70ca2 7667
wolfSSL 0:1239e9b70ca2 7668 int CyaSSL_X509_get_isSet_pathLength(CYASSL_X509* x509)
wolfSSL 0:1239e9b70ca2 7669 {
wolfSSL 0:1239e9b70ca2 7670 int isSet = 0;
wolfSSL 0:1239e9b70ca2 7671
wolfSSL 0:1239e9b70ca2 7672 CYASSL_ENTER("CyaSSL_X509_get_isSet_pathLength");
wolfSSL 0:1239e9b70ca2 7673
wolfSSL 0:1239e9b70ca2 7674 if (x509 != NULL)
wolfSSL 0:1239e9b70ca2 7675 isSet = x509->basicConstPlSet;
wolfSSL 0:1239e9b70ca2 7676
wolfSSL 0:1239e9b70ca2 7677 CYASSL_LEAVE("CyaSSL_X509_get_isSet_pathLength", isSet);
wolfSSL 0:1239e9b70ca2 7678
wolfSSL 0:1239e9b70ca2 7679 return isSet;
wolfSSL 0:1239e9b70ca2 7680 }
wolfSSL 0:1239e9b70ca2 7681
wolfSSL 0:1239e9b70ca2 7682
wolfSSL 0:1239e9b70ca2 7683 word32 CyaSSL_X509_get_pathLength(CYASSL_X509* x509)
wolfSSL 0:1239e9b70ca2 7684 {
wolfSSL 0:1239e9b70ca2 7685 word32 pathLength = 0;
wolfSSL 0:1239e9b70ca2 7686
wolfSSL 0:1239e9b70ca2 7687 CYASSL_ENTER("CyaSSL_X509_get_pathLength");
wolfSSL 0:1239e9b70ca2 7688
wolfSSL 0:1239e9b70ca2 7689 if (x509 != NULL)
wolfSSL 0:1239e9b70ca2 7690 pathLength = x509->pathLength;
wolfSSL 0:1239e9b70ca2 7691
wolfSSL 0:1239e9b70ca2 7692 CYASSL_LEAVE("CyaSSL_X509_get_pathLength", pathLength);
wolfSSL 0:1239e9b70ca2 7693
wolfSSL 0:1239e9b70ca2 7694 return pathLength;
wolfSSL 0:1239e9b70ca2 7695 }
wolfSSL 0:1239e9b70ca2 7696
wolfSSL 0:1239e9b70ca2 7697
wolfSSL 0:1239e9b70ca2 7698 unsigned int CyaSSL_X509_get_keyUsage(CYASSL_X509* x509)
wolfSSL 0:1239e9b70ca2 7699 {
wolfSSL 0:1239e9b70ca2 7700 word16 usage = 0;
wolfSSL 0:1239e9b70ca2 7701
wolfSSL 0:1239e9b70ca2 7702 CYASSL_ENTER("CyaSSL_X509_get_keyUsage");
wolfSSL 0:1239e9b70ca2 7703
wolfSSL 0:1239e9b70ca2 7704 if (x509 != NULL)
wolfSSL 0:1239e9b70ca2 7705 usage = x509->keyUsage;
wolfSSL 0:1239e9b70ca2 7706
wolfSSL 0:1239e9b70ca2 7707 CYASSL_LEAVE("CyaSSL_X509_get_keyUsage", usage);
wolfSSL 0:1239e9b70ca2 7708
wolfSSL 0:1239e9b70ca2 7709 return usage;
wolfSSL 0:1239e9b70ca2 7710 }
wolfSSL 0:1239e9b70ca2 7711
wolfSSL 0:1239e9b70ca2 7712
wolfSSL 0:1239e9b70ca2 7713 byte* CyaSSL_X509_get_authorityKeyID(
wolfSSL 0:1239e9b70ca2 7714 CYASSL_X509* x509, byte* dst, int* dstLen)
wolfSSL 0:1239e9b70ca2 7715 {
wolfSSL 0:1239e9b70ca2 7716 byte *id = NULL;
wolfSSL 0:1239e9b70ca2 7717 int copySz = 0;
wolfSSL 0:1239e9b70ca2 7718
wolfSSL 0:1239e9b70ca2 7719 CYASSL_ENTER("CyaSSL_X509_get_authorityKeyID");
wolfSSL 0:1239e9b70ca2 7720
wolfSSL 0:1239e9b70ca2 7721 if (x509 != NULL) {
wolfSSL 0:1239e9b70ca2 7722 if (x509->authKeyIdSet) {
wolfSSL 0:1239e9b70ca2 7723 copySz = min(dstLen != NULL ? *dstLen : 0,
wolfSSL 0:1239e9b70ca2 7724 (int)x509->authKeyIdSz);
wolfSSL 0:1239e9b70ca2 7725 id = x509->authKeyId;
wolfSSL 0:1239e9b70ca2 7726 }
wolfSSL 0:1239e9b70ca2 7727
wolfSSL 0:1239e9b70ca2 7728 if (dst != NULL && dstLen != NULL && id != NULL && copySz > 0) {
wolfSSL 0:1239e9b70ca2 7729 XMEMCPY(dst, id, copySz);
wolfSSL 0:1239e9b70ca2 7730 id = dst;
wolfSSL 0:1239e9b70ca2 7731 *dstLen = copySz;
wolfSSL 0:1239e9b70ca2 7732 }
wolfSSL 0:1239e9b70ca2 7733 }
wolfSSL 0:1239e9b70ca2 7734
wolfSSL 0:1239e9b70ca2 7735 CYASSL_LEAVE("CyaSSL_X509_get_authorityKeyID", copySz);
wolfSSL 0:1239e9b70ca2 7736
wolfSSL 0:1239e9b70ca2 7737 return id;
wolfSSL 0:1239e9b70ca2 7738 }
wolfSSL 0:1239e9b70ca2 7739
wolfSSL 0:1239e9b70ca2 7740
wolfSSL 0:1239e9b70ca2 7741 byte* CyaSSL_X509_get_subjectKeyID(
wolfSSL 0:1239e9b70ca2 7742 CYASSL_X509* x509, byte* dst, int* dstLen)
wolfSSL 0:1239e9b70ca2 7743 {
wolfSSL 0:1239e9b70ca2 7744 byte *id = NULL;
wolfSSL 0:1239e9b70ca2 7745 int copySz = 0;
wolfSSL 0:1239e9b70ca2 7746
wolfSSL 0:1239e9b70ca2 7747 CYASSL_ENTER("CyaSSL_X509_get_subjectKeyID");
wolfSSL 0:1239e9b70ca2 7748
wolfSSL 0:1239e9b70ca2 7749 if (x509 != NULL) {
wolfSSL 0:1239e9b70ca2 7750 if (x509->subjKeyIdSet) {
wolfSSL 0:1239e9b70ca2 7751 copySz = min(dstLen != NULL ? *dstLen : 0,
wolfSSL 0:1239e9b70ca2 7752 (int)x509->subjKeyIdSz);
wolfSSL 0:1239e9b70ca2 7753 id = x509->subjKeyId;
wolfSSL 0:1239e9b70ca2 7754 }
wolfSSL 0:1239e9b70ca2 7755
wolfSSL 0:1239e9b70ca2 7756 if (dst != NULL && dstLen != NULL && id != NULL && copySz > 0) {
wolfSSL 0:1239e9b70ca2 7757 XMEMCPY(dst, id, copySz);
wolfSSL 0:1239e9b70ca2 7758 id = dst;
wolfSSL 0:1239e9b70ca2 7759 *dstLen = copySz;
wolfSSL 0:1239e9b70ca2 7760 }
wolfSSL 0:1239e9b70ca2 7761 }
wolfSSL 0:1239e9b70ca2 7762
wolfSSL 0:1239e9b70ca2 7763 CYASSL_LEAVE("CyaSSL_X509_get_subjectKeyID", copySz);
wolfSSL 0:1239e9b70ca2 7764
wolfSSL 0:1239e9b70ca2 7765 return id;
wolfSSL 0:1239e9b70ca2 7766 }
wolfSSL 0:1239e9b70ca2 7767
wolfSSL 0:1239e9b70ca2 7768
wolfSSL 0:1239e9b70ca2 7769 int CyaSSL_X509_NAME_entry_count(CYASSL_X509_NAME* name)
wolfSSL 0:1239e9b70ca2 7770 {
wolfSSL 0:1239e9b70ca2 7771 int count = 0;
wolfSSL 0:1239e9b70ca2 7772
wolfSSL 0:1239e9b70ca2 7773 CYASSL_ENTER("CyaSSL_X509_NAME_entry_count");
wolfSSL 0:1239e9b70ca2 7774
wolfSSL 0:1239e9b70ca2 7775 if (name != NULL)
wolfSSL 0:1239e9b70ca2 7776 count = name->fullName.entryCount;
wolfSSL 0:1239e9b70ca2 7777
wolfSSL 0:1239e9b70ca2 7778 CYASSL_LEAVE("CyaSSL_X509_NAME_entry_count", count);
wolfSSL 0:1239e9b70ca2 7779 return count;
wolfSSL 0:1239e9b70ca2 7780 }
wolfSSL 0:1239e9b70ca2 7781
wolfSSL 0:1239e9b70ca2 7782
wolfSSL 0:1239e9b70ca2 7783 int CyaSSL_X509_NAME_get_text_by_NID(CYASSL_X509_NAME* name,
wolfSSL 0:1239e9b70ca2 7784 int nid, char* buf, int len)
wolfSSL 0:1239e9b70ca2 7785 {
wolfSSL 0:1239e9b70ca2 7786 char *text = NULL;
wolfSSL 0:1239e9b70ca2 7787 int textSz = 0;
wolfSSL 0:1239e9b70ca2 7788
wolfSSL 0:1239e9b70ca2 7789 CYASSL_ENTER("CyaSSL_X509_NAME_get_text_by_NID");
wolfSSL 0:1239e9b70ca2 7790
wolfSSL 0:1239e9b70ca2 7791 switch (nid) {
wolfSSL 0:1239e9b70ca2 7792 case ASN_COMMON_NAME:
wolfSSL 0:1239e9b70ca2 7793 text = name->fullName.fullName + name->fullName.cnIdx;
wolfSSL 0:1239e9b70ca2 7794 textSz = name->fullName.cnLen;
wolfSSL 0:1239e9b70ca2 7795 break;
wolfSSL 0:1239e9b70ca2 7796 case ASN_SUR_NAME:
wolfSSL 0:1239e9b70ca2 7797 text = name->fullName.fullName + name->fullName.snIdx;
wolfSSL 0:1239e9b70ca2 7798 textSz = name->fullName.snLen;
wolfSSL 0:1239e9b70ca2 7799 break;
wolfSSL 0:1239e9b70ca2 7800 case ASN_SERIAL_NUMBER:
wolfSSL 0:1239e9b70ca2 7801 text = name->fullName.fullName + name->fullName.serialIdx;
wolfSSL 0:1239e9b70ca2 7802 textSz = name->fullName.serialLen;
wolfSSL 0:1239e9b70ca2 7803 break;
wolfSSL 0:1239e9b70ca2 7804 case ASN_COUNTRY_NAME:
wolfSSL 0:1239e9b70ca2 7805 text = name->fullName.fullName + name->fullName.cIdx;
wolfSSL 0:1239e9b70ca2 7806 textSz = name->fullName.cLen;
wolfSSL 0:1239e9b70ca2 7807 break;
wolfSSL 0:1239e9b70ca2 7808 case ASN_LOCALITY_NAME:
wolfSSL 0:1239e9b70ca2 7809 text = name->fullName.fullName + name->fullName.lIdx;
wolfSSL 0:1239e9b70ca2 7810 textSz = name->fullName.lLen;
wolfSSL 0:1239e9b70ca2 7811 break;
wolfSSL 0:1239e9b70ca2 7812 case ASN_STATE_NAME:
wolfSSL 0:1239e9b70ca2 7813 text = name->fullName.fullName + name->fullName.stIdx;
wolfSSL 0:1239e9b70ca2 7814 textSz = name->fullName.stLen;
wolfSSL 0:1239e9b70ca2 7815 break;
wolfSSL 0:1239e9b70ca2 7816 case ASN_ORG_NAME:
wolfSSL 0:1239e9b70ca2 7817 text = name->fullName.fullName + name->fullName.oIdx;
wolfSSL 0:1239e9b70ca2 7818 textSz = name->fullName.oLen;
wolfSSL 0:1239e9b70ca2 7819 break;
wolfSSL 0:1239e9b70ca2 7820 case ASN_ORGUNIT_NAME:
wolfSSL 0:1239e9b70ca2 7821 text = name->fullName.fullName + name->fullName.ouIdx;
wolfSSL 0:1239e9b70ca2 7822 textSz = name->fullName.ouLen;
wolfSSL 0:1239e9b70ca2 7823 break;
wolfSSL 0:1239e9b70ca2 7824 default:
wolfSSL 0:1239e9b70ca2 7825 break;
wolfSSL 0:1239e9b70ca2 7826 }
wolfSSL 0:1239e9b70ca2 7827
wolfSSL 0:1239e9b70ca2 7828 if (buf != NULL && text != NULL) {
wolfSSL 0:1239e9b70ca2 7829 textSz = min(textSz, len);
wolfSSL 0:1239e9b70ca2 7830 XMEMCPY(buf, text, textSz);
wolfSSL 0:1239e9b70ca2 7831 buf[textSz] = '\0';
wolfSSL 0:1239e9b70ca2 7832 }
wolfSSL 0:1239e9b70ca2 7833
wolfSSL 0:1239e9b70ca2 7834 CYASSL_LEAVE("CyaSSL_X509_NAME_get_text_by_NID", textSz);
wolfSSL 0:1239e9b70ca2 7835 return textSz;
wolfSSL 0:1239e9b70ca2 7836 }
wolfSSL 0:1239e9b70ca2 7837 #endif
wolfSSL 0:1239e9b70ca2 7838
wolfSSL 0:1239e9b70ca2 7839
wolfSSL 0:1239e9b70ca2 7840 /* copy name into in buffer, at most sz bytes, if buffer is null will
wolfSSL 0:1239e9b70ca2 7841 malloc buffer, call responsible for freeing */
wolfSSL 0:1239e9b70ca2 7842 char* CyaSSL_X509_NAME_oneline(CYASSL_X509_NAME* name, char* in, int sz)
wolfSSL 0:1239e9b70ca2 7843 {
wolfSSL 0:1239e9b70ca2 7844 int copySz = min(sz, name->sz);
wolfSSL 0:1239e9b70ca2 7845
wolfSSL 0:1239e9b70ca2 7846 CYASSL_ENTER("CyaSSL_X509_NAME_oneline");
wolfSSL 0:1239e9b70ca2 7847 if (!name->sz) return in;
wolfSSL 0:1239e9b70ca2 7848
wolfSSL 0:1239e9b70ca2 7849 if (!in) {
wolfSSL 0:1239e9b70ca2 7850 in = (char*)XMALLOC(name->sz, 0, DYNAMIC_TYPE_OPENSSL);
wolfSSL 0:1239e9b70ca2 7851 if (!in ) return in;
wolfSSL 0:1239e9b70ca2 7852 copySz = name->sz;
wolfSSL 0:1239e9b70ca2 7853 }
wolfSSL 0:1239e9b70ca2 7854
wolfSSL 0:1239e9b70ca2 7855 if (copySz == 0)
wolfSSL 0:1239e9b70ca2 7856 return in;
wolfSSL 0:1239e9b70ca2 7857
wolfSSL 0:1239e9b70ca2 7858 XMEMCPY(in, name->name, copySz - 1);
wolfSSL 0:1239e9b70ca2 7859 in[copySz - 1] = 0;
wolfSSL 0:1239e9b70ca2 7860
wolfSSL 0:1239e9b70ca2 7861 return in;
wolfSSL 0:1239e9b70ca2 7862 }
wolfSSL 0:1239e9b70ca2 7863
wolfSSL 0:1239e9b70ca2 7864
wolfSSL 0:1239e9b70ca2 7865 int CyaSSL_X509_get_signature_type(CYASSL_X509* x509)
wolfSSL 0:1239e9b70ca2 7866 {
wolfSSL 0:1239e9b70ca2 7867 int type = 0;
wolfSSL 0:1239e9b70ca2 7868
wolfSSL 0:1239e9b70ca2 7869 CYASSL_ENTER("CyaSSL_X509_get_signature_type");
wolfSSL 0:1239e9b70ca2 7870
wolfSSL 0:1239e9b70ca2 7871 if (x509 != NULL)
wolfSSL 0:1239e9b70ca2 7872 type = x509->sigOID;
wolfSSL 0:1239e9b70ca2 7873
wolfSSL 0:1239e9b70ca2 7874 return type;
wolfSSL 0:1239e9b70ca2 7875 }
wolfSSL 0:1239e9b70ca2 7876
wolfSSL 0:1239e9b70ca2 7877
wolfSSL 0:1239e9b70ca2 7878 int CyaSSL_X509_get_signature(CYASSL_X509* x509,
wolfSSL 0:1239e9b70ca2 7879 unsigned char* buf, int* bufSz)
wolfSSL 0:1239e9b70ca2 7880 {
wolfSSL 0:1239e9b70ca2 7881 CYASSL_ENTER("CyaSSL_X509_get_signature");
wolfSSL 0:1239e9b70ca2 7882 if (x509 == NULL || bufSz == NULL || *bufSz < (int)x509->sig.length)
wolfSSL 0:1239e9b70ca2 7883 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 7884
wolfSSL 0:1239e9b70ca2 7885 if (buf != NULL)
wolfSSL 0:1239e9b70ca2 7886 XMEMCPY(buf, x509->sig.buffer, x509->sig.length);
wolfSSL 0:1239e9b70ca2 7887 *bufSz = x509->sig.length;
wolfSSL 0:1239e9b70ca2 7888
wolfSSL 0:1239e9b70ca2 7889 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 7890 }
wolfSSL 0:1239e9b70ca2 7891
wolfSSL 0:1239e9b70ca2 7892
wolfSSL 0:1239e9b70ca2 7893 /* write X509 serial number in unsigned binary to buffer
wolfSSL 0:1239e9b70ca2 7894 buffer needs to be at least EXTERNAL_SERIAL_SIZE (32) for all cases
wolfSSL 0:1239e9b70ca2 7895 return SSL_SUCCESS on success */
wolfSSL 0:1239e9b70ca2 7896 int CyaSSL_X509_get_serial_number(CYASSL_X509* x509, byte* in, int* inOutSz)
wolfSSL 0:1239e9b70ca2 7897 {
wolfSSL 0:1239e9b70ca2 7898 CYASSL_ENTER("CyaSSL_X509_get_serial_number");
wolfSSL 0:1239e9b70ca2 7899 if (x509 == NULL || in == NULL ||
wolfSSL 0:1239e9b70ca2 7900 inOutSz == NULL || *inOutSz < x509->serialSz)
wolfSSL 0:1239e9b70ca2 7901 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 7902
wolfSSL 0:1239e9b70ca2 7903 XMEMCPY(in, x509->serial, x509->serialSz);
wolfSSL 0:1239e9b70ca2 7904 *inOutSz = x509->serialSz;
wolfSSL 0:1239e9b70ca2 7905
wolfSSL 0:1239e9b70ca2 7906 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 7907 }
wolfSSL 0:1239e9b70ca2 7908
wolfSSL 0:1239e9b70ca2 7909
wolfSSL 0:1239e9b70ca2 7910 const byte* CyaSSL_X509_get_der(CYASSL_X509* x509, int* outSz)
wolfSSL 0:1239e9b70ca2 7911 {
wolfSSL 0:1239e9b70ca2 7912 CYASSL_ENTER("CyaSSL_X509_get_der");
wolfSSL 0:1239e9b70ca2 7913
wolfSSL 0:1239e9b70ca2 7914 if (x509 == NULL || outSz == NULL)
wolfSSL 0:1239e9b70ca2 7915 return NULL;
wolfSSL 0:1239e9b70ca2 7916
wolfSSL 0:1239e9b70ca2 7917 *outSz = (int)x509->derCert.length;
wolfSSL 0:1239e9b70ca2 7918 return x509->derCert.buffer;
wolfSSL 0:1239e9b70ca2 7919 }
wolfSSL 0:1239e9b70ca2 7920
wolfSSL 0:1239e9b70ca2 7921
wolfSSL 0:1239e9b70ca2 7922 int CyaSSL_X509_version(CYASSL_X509* x509)
wolfSSL 0:1239e9b70ca2 7923 {
wolfSSL 0:1239e9b70ca2 7924 CYASSL_ENTER("CyaSSL_X509_version");
wolfSSL 0:1239e9b70ca2 7925
wolfSSL 0:1239e9b70ca2 7926 if (x509 == NULL)
wolfSSL 0:1239e9b70ca2 7927 return 0;
wolfSSL 0:1239e9b70ca2 7928
wolfSSL 0:1239e9b70ca2 7929 return x509->version;
wolfSSL 0:1239e9b70ca2 7930 }
wolfSSL 0:1239e9b70ca2 7931
wolfSSL 0:1239e9b70ca2 7932
wolfSSL 0:1239e9b70ca2 7933 const byte* CyaSSL_X509_notBefore(CYASSL_X509* x509)
wolfSSL 0:1239e9b70ca2 7934 {
wolfSSL 0:1239e9b70ca2 7935 CYASSL_ENTER("CyaSSL_X509_notBefore");
wolfSSL 0:1239e9b70ca2 7936
wolfSSL 0:1239e9b70ca2 7937 if (x509 == NULL)
wolfSSL 0:1239e9b70ca2 7938 return NULL;
wolfSSL 0:1239e9b70ca2 7939
wolfSSL 0:1239e9b70ca2 7940 return x509->notBefore;
wolfSSL 0:1239e9b70ca2 7941 }
wolfSSL 0:1239e9b70ca2 7942
wolfSSL 0:1239e9b70ca2 7943
wolfSSL 0:1239e9b70ca2 7944 const byte* CyaSSL_X509_notAfter(CYASSL_X509* x509)
wolfSSL 0:1239e9b70ca2 7945 {
wolfSSL 0:1239e9b70ca2 7946 CYASSL_ENTER("CyaSSL_X509_notAfter");
wolfSSL 0:1239e9b70ca2 7947
wolfSSL 0:1239e9b70ca2 7948 if (x509 == NULL)
wolfSSL 0:1239e9b70ca2 7949 return NULL;
wolfSSL 0:1239e9b70ca2 7950
wolfSSL 0:1239e9b70ca2 7951 return x509->notAfter;
wolfSSL 0:1239e9b70ca2 7952 }
wolfSSL 0:1239e9b70ca2 7953
wolfSSL 0:1239e9b70ca2 7954
wolfSSL 0:1239e9b70ca2 7955 #ifdef CYASSL_SEP
wolfSSL 0:1239e9b70ca2 7956
wolfSSL 0:1239e9b70ca2 7957 /* copy oid into in buffer, at most *inOutSz bytes, if buffer is null will
wolfSSL 0:1239e9b70ca2 7958 malloc buffer, call responsible for freeing. Actual size returned in
wolfSSL 0:1239e9b70ca2 7959 *inOutSz. Requires inOutSz be non-null */
wolfSSL 0:1239e9b70ca2 7960 byte* CyaSSL_X509_get_device_type(CYASSL_X509* x509, byte* in, int *inOutSz)
wolfSSL 0:1239e9b70ca2 7961 {
wolfSSL 0:1239e9b70ca2 7962 int copySz;
wolfSSL 0:1239e9b70ca2 7963
wolfSSL 0:1239e9b70ca2 7964 CYASSL_ENTER("CyaSSL_X509_get_dev_type");
wolfSSL 0:1239e9b70ca2 7965 if (inOutSz == NULL) return NULL;
wolfSSL 0:1239e9b70ca2 7966 if (!x509->deviceTypeSz) return in;
wolfSSL 0:1239e9b70ca2 7967
wolfSSL 0:1239e9b70ca2 7968 copySz = min(*inOutSz, x509->deviceTypeSz);
wolfSSL 0:1239e9b70ca2 7969
wolfSSL 0:1239e9b70ca2 7970 if (!in) {
wolfSSL 0:1239e9b70ca2 7971 in = (byte*)XMALLOC(x509->deviceTypeSz, 0, DYNAMIC_TYPE_OPENSSL);
wolfSSL 0:1239e9b70ca2 7972 if (!in) return in;
wolfSSL 0:1239e9b70ca2 7973 copySz = x509->deviceTypeSz;
wolfSSL 0:1239e9b70ca2 7974 }
wolfSSL 0:1239e9b70ca2 7975
wolfSSL 0:1239e9b70ca2 7976 XMEMCPY(in, x509->deviceType, copySz);
wolfSSL 0:1239e9b70ca2 7977 *inOutSz = copySz;
wolfSSL 0:1239e9b70ca2 7978
wolfSSL 0:1239e9b70ca2 7979 return in;
wolfSSL 0:1239e9b70ca2 7980 }
wolfSSL 0:1239e9b70ca2 7981
wolfSSL 0:1239e9b70ca2 7982
wolfSSL 0:1239e9b70ca2 7983 byte* CyaSSL_X509_get_hw_type(CYASSL_X509* x509, byte* in, int* inOutSz)
wolfSSL 0:1239e9b70ca2 7984 {
wolfSSL 0:1239e9b70ca2 7985 int copySz;
wolfSSL 0:1239e9b70ca2 7986
wolfSSL 0:1239e9b70ca2 7987 CYASSL_ENTER("CyaSSL_X509_get_hw_type");
wolfSSL 0:1239e9b70ca2 7988 if (inOutSz == NULL) return NULL;
wolfSSL 0:1239e9b70ca2 7989 if (!x509->hwTypeSz) return in;
wolfSSL 0:1239e9b70ca2 7990
wolfSSL 0:1239e9b70ca2 7991 copySz = min(*inOutSz, x509->hwTypeSz);
wolfSSL 0:1239e9b70ca2 7992
wolfSSL 0:1239e9b70ca2 7993 if (!in) {
wolfSSL 0:1239e9b70ca2 7994 in = (byte*)XMALLOC(x509->hwTypeSz, 0, DYNAMIC_TYPE_OPENSSL);
wolfSSL 0:1239e9b70ca2 7995 if (!in) return in;
wolfSSL 0:1239e9b70ca2 7996 copySz = x509->hwTypeSz;
wolfSSL 0:1239e9b70ca2 7997 }
wolfSSL 0:1239e9b70ca2 7998
wolfSSL 0:1239e9b70ca2 7999 XMEMCPY(in, x509->hwType, copySz);
wolfSSL 0:1239e9b70ca2 8000 *inOutSz = copySz;
wolfSSL 0:1239e9b70ca2 8001
wolfSSL 0:1239e9b70ca2 8002 return in;
wolfSSL 0:1239e9b70ca2 8003 }
wolfSSL 0:1239e9b70ca2 8004
wolfSSL 0:1239e9b70ca2 8005
wolfSSL 0:1239e9b70ca2 8006 byte* CyaSSL_X509_get_hw_serial_number(CYASSL_X509* x509,byte* in,int* inOutSz)
wolfSSL 0:1239e9b70ca2 8007 {
wolfSSL 0:1239e9b70ca2 8008 int copySz;
wolfSSL 0:1239e9b70ca2 8009
wolfSSL 0:1239e9b70ca2 8010 CYASSL_ENTER("CyaSSL_X509_get_hw_serial_number");
wolfSSL 0:1239e9b70ca2 8011 if (inOutSz == NULL) return NULL;
wolfSSL 0:1239e9b70ca2 8012 if (!x509->hwTypeSz) return in;
wolfSSL 0:1239e9b70ca2 8013
wolfSSL 0:1239e9b70ca2 8014 copySz = min(*inOutSz, x509->hwSerialNumSz);
wolfSSL 0:1239e9b70ca2 8015
wolfSSL 0:1239e9b70ca2 8016 if (!in) {
wolfSSL 0:1239e9b70ca2 8017 in = (byte*)XMALLOC(x509->hwSerialNumSz, 0, DYNAMIC_TYPE_OPENSSL);
wolfSSL 0:1239e9b70ca2 8018 if (!in) return in;
wolfSSL 0:1239e9b70ca2 8019 copySz = x509->hwSerialNumSz;
wolfSSL 0:1239e9b70ca2 8020 }
wolfSSL 0:1239e9b70ca2 8021
wolfSSL 0:1239e9b70ca2 8022 XMEMCPY(in, x509->hwSerialNum, copySz);
wolfSSL 0:1239e9b70ca2 8023 *inOutSz = copySz;
wolfSSL 0:1239e9b70ca2 8024
wolfSSL 0:1239e9b70ca2 8025 return in;
wolfSSL 0:1239e9b70ca2 8026 }
wolfSSL 0:1239e9b70ca2 8027
wolfSSL 0:1239e9b70ca2 8028 #endif /* CYASSL_SEP */
wolfSSL 0:1239e9b70ca2 8029
wolfSSL 0:1239e9b70ca2 8030
wolfSSL 0:1239e9b70ca2 8031 CYASSL_X509* CyaSSL_X509_d2i(CYASSL_X509** x509, const byte* in, int len)
wolfSSL 0:1239e9b70ca2 8032 {
wolfSSL 0:1239e9b70ca2 8033 CYASSL_X509 *newX509 = NULL;
wolfSSL 0:1239e9b70ca2 8034
wolfSSL 0:1239e9b70ca2 8035 CYASSL_ENTER("CyaSSL_X509_d2i");
wolfSSL 0:1239e9b70ca2 8036
wolfSSL 0:1239e9b70ca2 8037 if (in != NULL && len != 0) {
wolfSSL 0:1239e9b70ca2 8038 DecodedCert cert;
wolfSSL 0:1239e9b70ca2 8039
wolfSSL 0:1239e9b70ca2 8040 InitDecodedCert(&cert, (byte*)in, len, NULL);
wolfSSL 0:1239e9b70ca2 8041 if (ParseCertRelative(&cert, CERT_TYPE, 0, NULL) == 0) {
wolfSSL 0:1239e9b70ca2 8042 newX509 = (CYASSL_X509*)XMALLOC(sizeof(CYASSL_X509),
wolfSSL 0:1239e9b70ca2 8043 NULL, DYNAMIC_TYPE_X509);
wolfSSL 0:1239e9b70ca2 8044 if (newX509 != NULL) {
wolfSSL 0:1239e9b70ca2 8045 InitX509(newX509, 1);
wolfSSL 0:1239e9b70ca2 8046 if (CopyDecodedToX509(newX509, &cert) != 0) {
wolfSSL 0:1239e9b70ca2 8047 XFREE(newX509, NULL, DYNAMIC_TYPE_X509);
wolfSSL 0:1239e9b70ca2 8048 newX509 = NULL;
wolfSSL 0:1239e9b70ca2 8049 }
wolfSSL 0:1239e9b70ca2 8050 }
wolfSSL 0:1239e9b70ca2 8051 }
wolfSSL 0:1239e9b70ca2 8052 FreeDecodedCert(&cert);
wolfSSL 0:1239e9b70ca2 8053 }
wolfSSL 0:1239e9b70ca2 8054
wolfSSL 0:1239e9b70ca2 8055 if (x509 != NULL)
wolfSSL 0:1239e9b70ca2 8056 *x509 = newX509;
wolfSSL 0:1239e9b70ca2 8057
wolfSSL 0:1239e9b70ca2 8058 return newX509;
wolfSSL 0:1239e9b70ca2 8059 }
wolfSSL 0:1239e9b70ca2 8060
wolfSSL 0:1239e9b70ca2 8061
wolfSSL 0:1239e9b70ca2 8062 #ifndef NO_FILESYSTEM
wolfSSL 0:1239e9b70ca2 8063
wolfSSL 0:1239e9b70ca2 8064 #ifndef NO_STDIO_FILESYSTEM
wolfSSL 0:1239e9b70ca2 8065
wolfSSL 0:1239e9b70ca2 8066 CYASSL_X509* CyaSSL_X509_d2i_fp(CYASSL_X509** x509, XFILE file)
wolfSSL 0:1239e9b70ca2 8067 {
wolfSSL 0:1239e9b70ca2 8068 CYASSL_X509* newX509 = NULL;
wolfSSL 0:1239e9b70ca2 8069
wolfSSL 0:1239e9b70ca2 8070 CYASSL_ENTER("CyaSSL_X509_d2i_fp");
wolfSSL 0:1239e9b70ca2 8071
wolfSSL 0:1239e9b70ca2 8072 if (file != XBADFILE) {
wolfSSL 0:1239e9b70ca2 8073 byte* fileBuffer = NULL;
wolfSSL 0:1239e9b70ca2 8074 long sz = 0;
wolfSSL 0:1239e9b70ca2 8075
wolfSSL 0:1239e9b70ca2 8076 XFSEEK(file, 0, XSEEK_END);
wolfSSL 0:1239e9b70ca2 8077 sz = XFTELL(file);
wolfSSL 0:1239e9b70ca2 8078 XREWIND(file);
wolfSSL 0:1239e9b70ca2 8079
wolfSSL 0:1239e9b70ca2 8080 fileBuffer = (byte*)XMALLOC(sz, NULL, DYNAMIC_TYPE_FILE);
wolfSSL 0:1239e9b70ca2 8081 if (fileBuffer != NULL) {
wolfSSL 0:1239e9b70ca2 8082 if ((int)XFREAD(fileBuffer, sz, 1, file) > 0) {
wolfSSL 0:1239e9b70ca2 8083 newX509 = CyaSSL_X509_d2i(NULL, fileBuffer, (int)sz);
wolfSSL 0:1239e9b70ca2 8084 }
wolfSSL 0:1239e9b70ca2 8085 XFREE(fileBuffer, NULL, DYNAMIC_TYPE_FILE);
wolfSSL 0:1239e9b70ca2 8086 }
wolfSSL 0:1239e9b70ca2 8087 }
wolfSSL 0:1239e9b70ca2 8088
wolfSSL 0:1239e9b70ca2 8089 if (x509 != NULL)
wolfSSL 0:1239e9b70ca2 8090 *x509 = newX509;
wolfSSL 0:1239e9b70ca2 8091
wolfSSL 0:1239e9b70ca2 8092 return newX509;
wolfSSL 0:1239e9b70ca2 8093 }
wolfSSL 0:1239e9b70ca2 8094
wolfSSL 0:1239e9b70ca2 8095 #endif /* NO_STDIO_FILESYSTEM */
wolfSSL 0:1239e9b70ca2 8096
wolfSSL 0:1239e9b70ca2 8097 CYASSL_X509* CyaSSL_X509_load_certificate_file(const char* fname, int format)
wolfSSL 0:1239e9b70ca2 8098 {
wolfSSL 0:1239e9b70ca2 8099 byte staticBuffer[FILE_BUFFER_SIZE];
wolfSSL 0:1239e9b70ca2 8100 byte* fileBuffer = staticBuffer;
wolfSSL 0:1239e9b70ca2 8101 int dynamic = 0;
wolfSSL 0:1239e9b70ca2 8102 long sz = 0;
wolfSSL 0:1239e9b70ca2 8103 XFILE file;
wolfSSL 0:1239e9b70ca2 8104 CYASSL_X509* x509 = NULL;
wolfSSL 0:1239e9b70ca2 8105 buffer der;
wolfSSL 0:1239e9b70ca2 8106
wolfSSL 0:1239e9b70ca2 8107 CYASSL_ENTER("CyaSSL_X509_load_certificate");
wolfSSL 0:1239e9b70ca2 8108
wolfSSL 0:1239e9b70ca2 8109 /* Check the inputs */
wolfSSL 0:1239e9b70ca2 8110 if ((fname == NULL) ||
wolfSSL 0:1239e9b70ca2 8111 (format != SSL_FILETYPE_ASN1 && format != SSL_FILETYPE_PEM))
wolfSSL 0:1239e9b70ca2 8112 return NULL;
wolfSSL 0:1239e9b70ca2 8113
wolfSSL 0:1239e9b70ca2 8114 file = XFOPEN(fname, "rb");
wolfSSL 0:1239e9b70ca2 8115 if (file == XBADFILE) return NULL;
wolfSSL 0:1239e9b70ca2 8116 XFSEEK(file, 0, XSEEK_END);
wolfSSL 0:1239e9b70ca2 8117 sz = XFTELL(file);
wolfSSL 0:1239e9b70ca2 8118 XREWIND(file);
wolfSSL 0:1239e9b70ca2 8119
wolfSSL 0:1239e9b70ca2 8120 if (sz > (long)sizeof(staticBuffer)) {
wolfSSL 0:1239e9b70ca2 8121 fileBuffer = (byte*)XMALLOC(sz, NULL, DYNAMIC_TYPE_FILE);
wolfSSL 0:1239e9b70ca2 8122 if (fileBuffer == NULL) {
wolfSSL 0:1239e9b70ca2 8123 XFCLOSE(file);
wolfSSL 0:1239e9b70ca2 8124 return NULL;
wolfSSL 0:1239e9b70ca2 8125 }
wolfSSL 0:1239e9b70ca2 8126 dynamic = 1;
wolfSSL 0:1239e9b70ca2 8127 }
wolfSSL 0:1239e9b70ca2 8128 if ((int)XFREAD(fileBuffer, sz, 1, file) < 0) {
wolfSSL 0:1239e9b70ca2 8129 XFCLOSE(file);
wolfSSL 0:1239e9b70ca2 8130 if (dynamic) XFREE(fileBuffer, NULL, DYNAMIC_TYPE_FILE);
wolfSSL 0:1239e9b70ca2 8131 return NULL;
wolfSSL 0:1239e9b70ca2 8132 }
wolfSSL 0:1239e9b70ca2 8133 XFCLOSE(file);
wolfSSL 0:1239e9b70ca2 8134
wolfSSL 0:1239e9b70ca2 8135 der.buffer = NULL;
wolfSSL 0:1239e9b70ca2 8136 der.length = 0;
wolfSSL 0:1239e9b70ca2 8137
wolfSSL 0:1239e9b70ca2 8138 if (format == SSL_FILETYPE_PEM) {
wolfSSL 0:1239e9b70ca2 8139 EncryptedInfo info;
wolfSSL 0:1239e9b70ca2 8140 int ecc = 0;
wolfSSL 0:1239e9b70ca2 8141
wolfSSL 0:1239e9b70ca2 8142 info.set = 0;
wolfSSL 0:1239e9b70ca2 8143 info.ctx = NULL;
wolfSSL 0:1239e9b70ca2 8144 info.consumed = 0;
wolfSSL 0:1239e9b70ca2 8145
wolfSSL 0:1239e9b70ca2 8146 if (PemToDer(fileBuffer, sz, CERT_TYPE, &der, NULL, &info, &ecc) != 0)
wolfSSL 0:1239e9b70ca2 8147 {
wolfSSL 0:1239e9b70ca2 8148 /* Only time this should fail, and leave `der` with a buffer
wolfSSL 0:1239e9b70ca2 8149 is when the Base64 Decode fails. Release `der.buffer` in
wolfSSL 0:1239e9b70ca2 8150 that case. */
wolfSSL 0:1239e9b70ca2 8151 if (der.buffer != NULL) {
wolfSSL 0:1239e9b70ca2 8152 XFREE(der.buffer, NULL, DYNAMIC_TYPE_CERT);
wolfSSL 0:1239e9b70ca2 8153 der.buffer = NULL;
wolfSSL 0:1239e9b70ca2 8154 }
wolfSSL 0:1239e9b70ca2 8155 }
wolfSSL 0:1239e9b70ca2 8156 }
wolfSSL 0:1239e9b70ca2 8157 else {
wolfSSL 0:1239e9b70ca2 8158 der.buffer = (byte*)XMALLOC(sz, NULL, DYNAMIC_TYPE_CERT);
wolfSSL 0:1239e9b70ca2 8159 if (der.buffer != NULL) {
wolfSSL 0:1239e9b70ca2 8160 XMEMCPY(der.buffer, fileBuffer, sz);
wolfSSL 0:1239e9b70ca2 8161 der.length = (word32)sz;
wolfSSL 0:1239e9b70ca2 8162 }
wolfSSL 0:1239e9b70ca2 8163 }
wolfSSL 0:1239e9b70ca2 8164 if (dynamic) XFREE(fileBuffer, NULL, DYNAMIC_TYPE_FILE);
wolfSSL 0:1239e9b70ca2 8165
wolfSSL 0:1239e9b70ca2 8166 /* At this point we want `der` to have the certificate in DER format */
wolfSSL 0:1239e9b70ca2 8167 /* ready to be decoded. */
wolfSSL 0:1239e9b70ca2 8168 if (der.buffer != NULL) {
wolfSSL 0:1239e9b70ca2 8169 DecodedCert cert;
wolfSSL 0:1239e9b70ca2 8170
wolfSSL 0:1239e9b70ca2 8171 InitDecodedCert(&cert, der.buffer, der.length, NULL);
wolfSSL 0:1239e9b70ca2 8172 if (ParseCertRelative(&cert, CERT_TYPE, 0, NULL) == 0) {
wolfSSL 0:1239e9b70ca2 8173 x509 = (CYASSL_X509*)XMALLOC(sizeof(CYASSL_X509),
wolfSSL 0:1239e9b70ca2 8174 NULL, DYNAMIC_TYPE_X509);
wolfSSL 0:1239e9b70ca2 8175 if (x509 != NULL) {
wolfSSL 0:1239e9b70ca2 8176 InitX509(x509, 1);
wolfSSL 0:1239e9b70ca2 8177 if (CopyDecodedToX509(x509, &cert) != 0) {
wolfSSL 0:1239e9b70ca2 8178 XFREE(x509, NULL, DYNAMIC_TYPE_X509);
wolfSSL 0:1239e9b70ca2 8179 x509 = NULL;
wolfSSL 0:1239e9b70ca2 8180 }
wolfSSL 0:1239e9b70ca2 8181 }
wolfSSL 0:1239e9b70ca2 8182 }
wolfSSL 0:1239e9b70ca2 8183 FreeDecodedCert(&cert);
wolfSSL 0:1239e9b70ca2 8184
wolfSSL 0:1239e9b70ca2 8185 XFREE(der.buffer, NULL, DYNAMIC_TYPE_CERT);
wolfSSL 0:1239e9b70ca2 8186 }
wolfSSL 0:1239e9b70ca2 8187
wolfSSL 0:1239e9b70ca2 8188 return x509;
wolfSSL 0:1239e9b70ca2 8189 }
wolfSSL 0:1239e9b70ca2 8190
wolfSSL 0:1239e9b70ca2 8191 #endif /* NO_FILESYSTEM */
wolfSSL 0:1239e9b70ca2 8192
wolfSSL 0:1239e9b70ca2 8193 #endif /* KEEP_PEER_CERT || SESSION_CERTS */
wolfSSL 0:1239e9b70ca2 8194
wolfSSL 0:1239e9b70ca2 8195
wolfSSL 0:1239e9b70ca2 8196 #ifdef OPENSSL_EXTRA
wolfSSL 0:1239e9b70ca2 8197 int CyaSSL_set_ex_data(CYASSL* ssl, int idx, void* data)
wolfSSL 0:1239e9b70ca2 8198 {
wolfSSL 0:1239e9b70ca2 8199 #ifdef FORTRESS
wolfSSL 0:1239e9b70ca2 8200 if (ssl != NULL && idx < MAX_EX_DATA)
wolfSSL 0:1239e9b70ca2 8201 {
wolfSSL 0:1239e9b70ca2 8202 ssl->ex_data[idx] = data;
wolfSSL 0:1239e9b70ca2 8203 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 8204 }
wolfSSL 0:1239e9b70ca2 8205 #else
wolfSSL 0:1239e9b70ca2 8206 (void)ssl;
wolfSSL 0:1239e9b70ca2 8207 (void)idx;
wolfSSL 0:1239e9b70ca2 8208 (void)data;
wolfSSL 0:1239e9b70ca2 8209 #endif
wolfSSL 0:1239e9b70ca2 8210 return SSL_FAILURE;
wolfSSL 0:1239e9b70ca2 8211 }
wolfSSL 0:1239e9b70ca2 8212
wolfSSL 0:1239e9b70ca2 8213
wolfSSL 0:1239e9b70ca2 8214 int CyaSSL_set_session_id_context(CYASSL* ssl, const unsigned char* id,
wolfSSL 0:1239e9b70ca2 8215 unsigned int len)
wolfSSL 0:1239e9b70ca2 8216 {
wolfSSL 0:1239e9b70ca2 8217 (void)ssl;
wolfSSL 0:1239e9b70ca2 8218 (void)id;
wolfSSL 0:1239e9b70ca2 8219 (void)len;
wolfSSL 0:1239e9b70ca2 8220 return 0;
wolfSSL 0:1239e9b70ca2 8221 }
wolfSSL 0:1239e9b70ca2 8222
wolfSSL 0:1239e9b70ca2 8223
wolfSSL 0:1239e9b70ca2 8224 void CyaSSL_set_connect_state(CYASSL* ssl)
wolfSSL 0:1239e9b70ca2 8225 {
wolfSSL 0:1239e9b70ca2 8226 (void)ssl;
wolfSSL 0:1239e9b70ca2 8227 /* client by default */
wolfSSL 0:1239e9b70ca2 8228 }
wolfSSL 0:1239e9b70ca2 8229 #endif
wolfSSL 0:1239e9b70ca2 8230
wolfSSL 0:1239e9b70ca2 8231 int CyaSSL_get_shutdown(const CYASSL* ssl)
wolfSSL 0:1239e9b70ca2 8232 {
wolfSSL 0:1239e9b70ca2 8233 return (ssl->options.isClosed ||
wolfSSL 0:1239e9b70ca2 8234 ssl->options.connReset ||
wolfSSL 0:1239e9b70ca2 8235 ssl->options.sentNotify);
wolfSSL 0:1239e9b70ca2 8236 }
wolfSSL 0:1239e9b70ca2 8237
wolfSSL 0:1239e9b70ca2 8238
wolfSSL 0:1239e9b70ca2 8239 int CyaSSL_session_reused(CYASSL* ssl)
wolfSSL 0:1239e9b70ca2 8240 {
wolfSSL 0:1239e9b70ca2 8241 return ssl->options.resuming;
wolfSSL 0:1239e9b70ca2 8242 }
wolfSSL 0:1239e9b70ca2 8243
wolfSSL 0:1239e9b70ca2 8244 #ifdef OPENSSL_EXTRA
wolfSSL 0:1239e9b70ca2 8245 void CyaSSL_SESSION_free(CYASSL_SESSION* session)
wolfSSL 0:1239e9b70ca2 8246 {
wolfSSL 0:1239e9b70ca2 8247 (void)session;
wolfSSL 0:1239e9b70ca2 8248 }
wolfSSL 0:1239e9b70ca2 8249 #endif
wolfSSL 0:1239e9b70ca2 8250
wolfSSL 0:1239e9b70ca2 8251 const char* CyaSSL_get_version(CYASSL* ssl)
wolfSSL 0:1239e9b70ca2 8252 {
wolfSSL 0:1239e9b70ca2 8253 CYASSL_ENTER("SSL_get_version");
wolfSSL 0:1239e9b70ca2 8254 if (ssl->version.major == SSLv3_MAJOR) {
wolfSSL 0:1239e9b70ca2 8255 switch (ssl->version.minor) {
wolfSSL 0:1239e9b70ca2 8256 case SSLv3_MINOR :
wolfSSL 0:1239e9b70ca2 8257 return "SSLv3";
wolfSSL 0:1239e9b70ca2 8258 case TLSv1_MINOR :
wolfSSL 0:1239e9b70ca2 8259 return "TLSv1";
wolfSSL 0:1239e9b70ca2 8260 case TLSv1_1_MINOR :
wolfSSL 0:1239e9b70ca2 8261 return "TLSv1.1";
wolfSSL 0:1239e9b70ca2 8262 case TLSv1_2_MINOR :
wolfSSL 0:1239e9b70ca2 8263 return "TLSv1.2";
wolfSSL 0:1239e9b70ca2 8264 default:
wolfSSL 0:1239e9b70ca2 8265 return "unknown";
wolfSSL 0:1239e9b70ca2 8266 }
wolfSSL 0:1239e9b70ca2 8267 }
wolfSSL 0:1239e9b70ca2 8268 else if (ssl->version.major == DTLS_MAJOR) {
wolfSSL 0:1239e9b70ca2 8269 switch (ssl->version.minor) {
wolfSSL 0:1239e9b70ca2 8270 case DTLS_MINOR :
wolfSSL 0:1239e9b70ca2 8271 return "DTLS";
wolfSSL 0:1239e9b70ca2 8272 case DTLSv1_2_MINOR :
wolfSSL 0:1239e9b70ca2 8273 return "DTLSv1.2";
wolfSSL 0:1239e9b70ca2 8274 default:
wolfSSL 0:1239e9b70ca2 8275 return "unknown";
wolfSSL 0:1239e9b70ca2 8276 }
wolfSSL 0:1239e9b70ca2 8277 }
wolfSSL 0:1239e9b70ca2 8278 return "unknown";
wolfSSL 0:1239e9b70ca2 8279 }
wolfSSL 0:1239e9b70ca2 8280
wolfSSL 0:1239e9b70ca2 8281 int CyaSSL_get_current_cipher_suite(CYASSL* ssl)
wolfSSL 0:1239e9b70ca2 8282 {
wolfSSL 0:1239e9b70ca2 8283 CYASSL_ENTER("SSL_get_current_cipher_suite");
wolfSSL 0:1239e9b70ca2 8284 if (ssl)
wolfSSL 0:1239e9b70ca2 8285 return (ssl->options.cipherSuite0 << 8) | ssl->options.cipherSuite;
wolfSSL 0:1239e9b70ca2 8286 return 0;
wolfSSL 0:1239e9b70ca2 8287 }
wolfSSL 0:1239e9b70ca2 8288
wolfSSL 0:1239e9b70ca2 8289 CYASSL_CIPHER* CyaSSL_get_current_cipher(CYASSL* ssl)
wolfSSL 0:1239e9b70ca2 8290 {
wolfSSL 0:1239e9b70ca2 8291 CYASSL_ENTER("SSL_get_current_cipher");
wolfSSL 0:1239e9b70ca2 8292 if (ssl)
wolfSSL 0:1239e9b70ca2 8293 return &ssl->cipher;
wolfSSL 0:1239e9b70ca2 8294 else
wolfSSL 0:1239e9b70ca2 8295 return NULL;
wolfSSL 0:1239e9b70ca2 8296 }
wolfSSL 0:1239e9b70ca2 8297
wolfSSL 0:1239e9b70ca2 8298
wolfSSL 0:1239e9b70ca2 8299 const char* CyaSSL_CIPHER_get_name(const CYASSL_CIPHER* cipher)
wolfSSL 0:1239e9b70ca2 8300 {
wolfSSL 0:1239e9b70ca2 8301 (void)cipher;
wolfSSL 0:1239e9b70ca2 8302
wolfSSL 0:1239e9b70ca2 8303 CYASSL_ENTER("SSL_CIPHER_get_name");
wolfSSL 0:1239e9b70ca2 8304 #ifndef NO_ERROR_STRINGS
wolfSSL 0:1239e9b70ca2 8305 if (cipher) {
wolfSSL 0:1239e9b70ca2 8306 #ifdef HAVE_ECC
wolfSSL 0:1239e9b70ca2 8307 if (cipher->ssl->options.cipherSuite0 == ECC_BYTE) {
wolfSSL 0:1239e9b70ca2 8308 /* ECC suites */
wolfSSL 0:1239e9b70ca2 8309 switch (cipher->ssl->options.cipherSuite) {
wolfSSL 0:1239e9b70ca2 8310 #ifndef NO_RSA
wolfSSL 0:1239e9b70ca2 8311 case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 :
wolfSSL 0:1239e9b70ca2 8312 return "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256";
wolfSSL 0:1239e9b70ca2 8313 #endif
wolfSSL 0:1239e9b70ca2 8314 case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 :
wolfSSL 0:1239e9b70ca2 8315 return "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256";
wolfSSL 0:1239e9b70ca2 8316 #ifndef NO_RSA
wolfSSL 0:1239e9b70ca2 8317 case TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 :
wolfSSL 0:1239e9b70ca2 8318 return "TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256";
wolfSSL 0:1239e9b70ca2 8319 #endif
wolfSSL 0:1239e9b70ca2 8320 case TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 :
wolfSSL 0:1239e9b70ca2 8321 return "TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256";
wolfSSL 0:1239e9b70ca2 8322 #ifndef NO_RSA
wolfSSL 0:1239e9b70ca2 8323 case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 :
wolfSSL 0:1239e9b70ca2 8324 return "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384";
wolfSSL 0:1239e9b70ca2 8325 #endif
wolfSSL 0:1239e9b70ca2 8326 case TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 :
wolfSSL 0:1239e9b70ca2 8327 return "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384";
wolfSSL 0:1239e9b70ca2 8328 #ifndef NO_RSA
wolfSSL 0:1239e9b70ca2 8329 case TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 :
wolfSSL 0:1239e9b70ca2 8330 return "TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384";
wolfSSL 0:1239e9b70ca2 8331 #endif
wolfSSL 0:1239e9b70ca2 8332 case TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 :
wolfSSL 0:1239e9b70ca2 8333 return "TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384";
wolfSSL 0:1239e9b70ca2 8334 #ifndef NO_SHA
wolfSSL 0:1239e9b70ca2 8335 #ifndef NO_RSA
wolfSSL 0:1239e9b70ca2 8336 case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA :
wolfSSL 0:1239e9b70ca2 8337 return "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA";
wolfSSL 0:1239e9b70ca2 8338 case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA :
wolfSSL 0:1239e9b70ca2 8339 return "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA";
wolfSSL 0:1239e9b70ca2 8340 #endif
wolfSSL 0:1239e9b70ca2 8341 case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA :
wolfSSL 0:1239e9b70ca2 8342 return "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA";
wolfSSL 0:1239e9b70ca2 8343 case TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA :
wolfSSL 0:1239e9b70ca2 8344 return "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA";
wolfSSL 0:1239e9b70ca2 8345 #ifndef NO_RC4
wolfSSL 0:1239e9b70ca2 8346 #ifndef NO_RSA
wolfSSL 0:1239e9b70ca2 8347 case TLS_ECDHE_RSA_WITH_RC4_128_SHA :
wolfSSL 0:1239e9b70ca2 8348 return "TLS_ECDHE_RSA_WITH_RC4_128_SHA";
wolfSSL 0:1239e9b70ca2 8349 #endif
wolfSSL 0:1239e9b70ca2 8350 case TLS_ECDHE_ECDSA_WITH_RC4_128_SHA :
wolfSSL 0:1239e9b70ca2 8351 return "TLS_ECDHE_ECDSA_WITH_RC4_128_SHA";
wolfSSL 0:1239e9b70ca2 8352 #endif
wolfSSL 0:1239e9b70ca2 8353 #ifndef NO_DES3
wolfSSL 0:1239e9b70ca2 8354 #ifndef NO_RSA
wolfSSL 0:1239e9b70ca2 8355 case TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA :
wolfSSL 0:1239e9b70ca2 8356 return "TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA";
wolfSSL 0:1239e9b70ca2 8357 #endif
wolfSSL 0:1239e9b70ca2 8358 case TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA :
wolfSSL 0:1239e9b70ca2 8359 return "TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA";
wolfSSL 0:1239e9b70ca2 8360 #endif
wolfSSL 0:1239e9b70ca2 8361
wolfSSL 0:1239e9b70ca2 8362 #ifndef NO_RSA
wolfSSL 0:1239e9b70ca2 8363 case TLS_ECDH_RSA_WITH_AES_128_CBC_SHA :
wolfSSL 0:1239e9b70ca2 8364 return "TLS_ECDH_RSA_WITH_AES_128_CBC_SHA";
wolfSSL 0:1239e9b70ca2 8365 case TLS_ECDH_RSA_WITH_AES_256_CBC_SHA :
wolfSSL 0:1239e9b70ca2 8366 return "TLS_ECDH_RSA_WITH_AES_256_CBC_SHA";
wolfSSL 0:1239e9b70ca2 8367 #endif
wolfSSL 0:1239e9b70ca2 8368 case TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA :
wolfSSL 0:1239e9b70ca2 8369 return "TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA";
wolfSSL 0:1239e9b70ca2 8370 case TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA :
wolfSSL 0:1239e9b70ca2 8371 return "TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA";
wolfSSL 0:1239e9b70ca2 8372 #ifndef NO_RC4
wolfSSL 0:1239e9b70ca2 8373 #ifndef NO_RSA
wolfSSL 0:1239e9b70ca2 8374 case TLS_ECDH_RSA_WITH_RC4_128_SHA :
wolfSSL 0:1239e9b70ca2 8375 return "TLS_ECDH_RSA_WITH_RC4_128_SHA";
wolfSSL 0:1239e9b70ca2 8376 #endif
wolfSSL 0:1239e9b70ca2 8377 case TLS_ECDH_ECDSA_WITH_RC4_128_SHA :
wolfSSL 0:1239e9b70ca2 8378 return "TLS_ECDH_ECDSA_WITH_RC4_128_SHA";
wolfSSL 0:1239e9b70ca2 8379 #endif
wolfSSL 0:1239e9b70ca2 8380 #ifndef NO_DES3
wolfSSL 0:1239e9b70ca2 8381 #ifndef NO_RSA
wolfSSL 0:1239e9b70ca2 8382 case TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA :
wolfSSL 0:1239e9b70ca2 8383 return "TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA";
wolfSSL 0:1239e9b70ca2 8384 #endif
wolfSSL 0:1239e9b70ca2 8385 case TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA :
wolfSSL 0:1239e9b70ca2 8386 return "TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA";
wolfSSL 0:1239e9b70ca2 8387 #endif
wolfSSL 0:1239e9b70ca2 8388 #endif /* NO_SHA */
wolfSSL 0:1239e9b70ca2 8389
wolfSSL 0:1239e9b70ca2 8390 #ifdef HAVE_AESGCM
wolfSSL 0:1239e9b70ca2 8391 #ifndef NO_RSA
wolfSSL 0:1239e9b70ca2 8392 case TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 :
wolfSSL 0:1239e9b70ca2 8393 return "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256";
wolfSSL 0:1239e9b70ca2 8394 case TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 :
wolfSSL 0:1239e9b70ca2 8395 return "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384";
wolfSSL 0:1239e9b70ca2 8396 #endif
wolfSSL 0:1239e9b70ca2 8397 case TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 :
wolfSSL 0:1239e9b70ca2 8398 return "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256";
wolfSSL 0:1239e9b70ca2 8399 case TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 :
wolfSSL 0:1239e9b70ca2 8400 return "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384";
wolfSSL 0:1239e9b70ca2 8401 #ifndef NO_RSA
wolfSSL 0:1239e9b70ca2 8402 case TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 :
wolfSSL 0:1239e9b70ca2 8403 return "TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256";
wolfSSL 0:1239e9b70ca2 8404 case TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 :
wolfSSL 0:1239e9b70ca2 8405 return "TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384";
wolfSSL 0:1239e9b70ca2 8406 #endif
wolfSSL 0:1239e9b70ca2 8407 case TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 :
wolfSSL 0:1239e9b70ca2 8408 return "TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256";
wolfSSL 0:1239e9b70ca2 8409 case TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 :
wolfSSL 0:1239e9b70ca2 8410 return "TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384";
wolfSSL 0:1239e9b70ca2 8411 #endif
wolfSSL 0:1239e9b70ca2 8412
wolfSSL 0:1239e9b70ca2 8413 #ifdef HAVE_AESCCM
wolfSSL 0:1239e9b70ca2 8414 #ifndef NO_RSA
wolfSSL 0:1239e9b70ca2 8415 case TLS_RSA_WITH_AES_128_CCM_8 :
wolfSSL 0:1239e9b70ca2 8416 return "TLS_RSA_WITH_AES_128_CCM_8";
wolfSSL 0:1239e9b70ca2 8417 case TLS_RSA_WITH_AES_256_CCM_8 :
wolfSSL 0:1239e9b70ca2 8418 return "TLS_RSA_WITH_AES_256_CCM_8";
wolfSSL 0:1239e9b70ca2 8419 #endif
wolfSSL 0:1239e9b70ca2 8420 case TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8:
wolfSSL 0:1239e9b70ca2 8421 return "TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8";
wolfSSL 0:1239e9b70ca2 8422 case TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8 :
wolfSSL 0:1239e9b70ca2 8423 return "TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8";
wolfSSL 0:1239e9b70ca2 8424 #endif
wolfSSL 0:1239e9b70ca2 8425
wolfSSL 0:1239e9b70ca2 8426 default:
wolfSSL 0:1239e9b70ca2 8427 return "NONE";
wolfSSL 0:1239e9b70ca2 8428 }
wolfSSL 0:1239e9b70ca2 8429 }
wolfSSL 0:1239e9b70ca2 8430 #endif /* ECC */
wolfSSL 0:1239e9b70ca2 8431 if (cipher->ssl->options.cipherSuite0 != ECC_BYTE) {
wolfSSL 0:1239e9b70ca2 8432 /* normal suites */
wolfSSL 0:1239e9b70ca2 8433 switch (cipher->ssl->options.cipherSuite) {
wolfSSL 0:1239e9b70ca2 8434 #ifndef NO_RSA
wolfSSL 0:1239e9b70ca2 8435 #ifndef NO_RC4
wolfSSL 0:1239e9b70ca2 8436 #ifndef NO_SHA
wolfSSL 0:1239e9b70ca2 8437 case SSL_RSA_WITH_RC4_128_SHA :
wolfSSL 0:1239e9b70ca2 8438 return "SSL_RSA_WITH_RC4_128_SHA";
wolfSSL 0:1239e9b70ca2 8439 #endif
wolfSSL 0:1239e9b70ca2 8440 #ifndef NO_MD5
wolfSSL 0:1239e9b70ca2 8441 case SSL_RSA_WITH_RC4_128_MD5 :
wolfSSL 0:1239e9b70ca2 8442 return "SSL_RSA_WITH_RC4_128_MD5";
wolfSSL 0:1239e9b70ca2 8443 #endif
wolfSSL 0:1239e9b70ca2 8444 #endif
wolfSSL 0:1239e9b70ca2 8445 #ifndef NO_SHA
wolfSSL 0:1239e9b70ca2 8446 #ifndef NO_DES3
wolfSSL 0:1239e9b70ca2 8447 case SSL_RSA_WITH_3DES_EDE_CBC_SHA :
wolfSSL 0:1239e9b70ca2 8448 return "SSL_RSA_WITH_3DES_EDE_CBC_SHA";
wolfSSL 0:1239e9b70ca2 8449 #endif
wolfSSL 0:1239e9b70ca2 8450 case TLS_RSA_WITH_AES_128_CBC_SHA :
wolfSSL 0:1239e9b70ca2 8451 return "TLS_RSA_WITH_AES_128_CBC_SHA";
wolfSSL 0:1239e9b70ca2 8452 case TLS_RSA_WITH_AES_256_CBC_SHA :
wolfSSL 0:1239e9b70ca2 8453 return "TLS_RSA_WITH_AES_256_CBC_SHA";
wolfSSL 0:1239e9b70ca2 8454 #endif
wolfSSL 0:1239e9b70ca2 8455 case TLS_RSA_WITH_AES_128_CBC_SHA256 :
wolfSSL 0:1239e9b70ca2 8456 return "TLS_RSA_WITH_AES_128_CBC_SHA256";
wolfSSL 0:1239e9b70ca2 8457 case TLS_RSA_WITH_AES_256_CBC_SHA256 :
wolfSSL 0:1239e9b70ca2 8458 return "TLS_RSA_WITH_AES_256_CBC_SHA256";
wolfSSL 0:1239e9b70ca2 8459 #ifdef HAVE_BLAKE2
wolfSSL 0:1239e9b70ca2 8460 case TLS_RSA_WITH_AES_128_CBC_B2B256:
wolfSSL 0:1239e9b70ca2 8461 return "TLS_RSA_WITH_AES_128_CBC_B2B256";
wolfSSL 0:1239e9b70ca2 8462 case TLS_RSA_WITH_AES_256_CBC_B2B256:
wolfSSL 0:1239e9b70ca2 8463 return "TLS_RSA_WITH_AES_256_CBC_B2B256";
wolfSSL 0:1239e9b70ca2 8464 #endif
wolfSSL 0:1239e9b70ca2 8465 #ifndef NO_SHA
wolfSSL 0:1239e9b70ca2 8466 case TLS_RSA_WITH_NULL_SHA :
wolfSSL 0:1239e9b70ca2 8467 return "TLS_RSA_WITH_NULL_SHA";
wolfSSL 0:1239e9b70ca2 8468 #endif
wolfSSL 0:1239e9b70ca2 8469 case TLS_RSA_WITH_NULL_SHA256 :
wolfSSL 0:1239e9b70ca2 8470 return "TLS_RSA_WITH_NULL_SHA256";
wolfSSL 0:1239e9b70ca2 8471 #endif /* NO_RSA */
wolfSSL 0:1239e9b70ca2 8472 #ifndef NO_PSK
wolfSSL 0:1239e9b70ca2 8473 case TLS_PSK_WITH_AES_128_CBC_SHA256 :
wolfSSL 0:1239e9b70ca2 8474 return "TLS_PSK_WITH_AES_128_CBC_SHA256";
wolfSSL 0:1239e9b70ca2 8475 #ifndef NO_SHA
wolfSSL 0:1239e9b70ca2 8476 case TLS_PSK_WITH_AES_128_CBC_SHA :
wolfSSL 0:1239e9b70ca2 8477 return "TLS_PSK_WITH_AES_128_CBC_SHA";
wolfSSL 0:1239e9b70ca2 8478 case TLS_PSK_WITH_AES_256_CBC_SHA :
wolfSSL 0:1239e9b70ca2 8479 return "TLS_PSK_WITH_AES_256_CBC_SHA";
wolfSSL 0:1239e9b70ca2 8480 #endif
wolfSSL 0:1239e9b70ca2 8481 #ifndef NO_SHA256
wolfSSL 0:1239e9b70ca2 8482 #ifdef HAVE_AESCCM
wolfSSL 0:1239e9b70ca2 8483 case TLS_PSK_WITH_AES_128_CCM_8 :
wolfSSL 0:1239e9b70ca2 8484 return "TLS_PSK_WITH_AES_128_CCM_8";
wolfSSL 0:1239e9b70ca2 8485 case TLS_PSK_WITH_AES_256_CCM_8 :
wolfSSL 0:1239e9b70ca2 8486 return "TLS_PSK_WITH_AES_256_CCM_8";
wolfSSL 0:1239e9b70ca2 8487 #endif
wolfSSL 0:1239e9b70ca2 8488 case TLS_PSK_WITH_NULL_SHA256 :
wolfSSL 0:1239e9b70ca2 8489 return "TLS_PSK_WITH_NULL_SHA256";
wolfSSL 0:1239e9b70ca2 8490 #endif
wolfSSL 0:1239e9b70ca2 8491 #ifndef NO_SHA
wolfSSL 0:1239e9b70ca2 8492 case TLS_PSK_WITH_NULL_SHA :
wolfSSL 0:1239e9b70ca2 8493 return "TLS_PSK_WITH_NULL_SHA";
wolfSSL 0:1239e9b70ca2 8494 #endif
wolfSSL 0:1239e9b70ca2 8495 #endif /* NO_PSK */
wolfSSL 0:1239e9b70ca2 8496 #ifndef NO_RSA
wolfSSL 0:1239e9b70ca2 8497 case TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 :
wolfSSL 0:1239e9b70ca2 8498 return "TLS_DHE_RSA_WITH_AES_128_CBC_SHA256";
wolfSSL 0:1239e9b70ca2 8499 case TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 :
wolfSSL 0:1239e9b70ca2 8500 return "TLS_DHE_RSA_WITH_AES_256_CBC_SHA256";
wolfSSL 0:1239e9b70ca2 8501 #ifndef NO_SHA
wolfSSL 0:1239e9b70ca2 8502 case TLS_DHE_RSA_WITH_AES_128_CBC_SHA :
wolfSSL 0:1239e9b70ca2 8503 return "TLS_DHE_RSA_WITH_AES_128_CBC_SHA";
wolfSSL 0:1239e9b70ca2 8504 case TLS_DHE_RSA_WITH_AES_256_CBC_SHA :
wolfSSL 0:1239e9b70ca2 8505 return "TLS_DHE_RSA_WITH_AES_256_CBC_SHA";
wolfSSL 0:1239e9b70ca2 8506 #endif
wolfSSL 0:1239e9b70ca2 8507 #ifndef NO_HC128
wolfSSL 0:1239e9b70ca2 8508 #ifndef NO_MD5
wolfSSL 0:1239e9b70ca2 8509 case TLS_RSA_WITH_HC_128_MD5 :
wolfSSL 0:1239e9b70ca2 8510 return "TLS_RSA_WITH_HC_128_MD5";
wolfSSL 0:1239e9b70ca2 8511 #endif
wolfSSL 0:1239e9b70ca2 8512 #ifndef NO_SHA
wolfSSL 0:1239e9b70ca2 8513 case TLS_RSA_WITH_HC_128_SHA :
wolfSSL 0:1239e9b70ca2 8514 return "TLS_RSA_WITH_HC_128_SHA";
wolfSSL 0:1239e9b70ca2 8515 #endif
wolfSSL 0:1239e9b70ca2 8516 #ifdef HAVE_BLAKE2
wolfSSL 0:1239e9b70ca2 8517 case TLS_RSA_WITH_HC_128_B2B256:
wolfSSL 0:1239e9b70ca2 8518 return "TLS_RSA_WITH_HC_128_B2B256";
wolfSSL 0:1239e9b70ca2 8519 #endif
wolfSSL 0:1239e9b70ca2 8520 #endif /* NO_HC128 */
wolfSSL 0:1239e9b70ca2 8521 #ifndef NO_SHA
wolfSSL 0:1239e9b70ca2 8522 #ifndef NO_RABBIT
wolfSSL 0:1239e9b70ca2 8523 case TLS_RSA_WITH_RABBIT_SHA :
wolfSSL 0:1239e9b70ca2 8524 return "TLS_RSA_WITH_RABBIT_SHA";
wolfSSL 0:1239e9b70ca2 8525 #endif
wolfSSL 0:1239e9b70ca2 8526 #ifdef HAVE_NTRU
wolfSSL 0:1239e9b70ca2 8527 #ifndef NO_RC4
wolfSSL 0:1239e9b70ca2 8528 case TLS_NTRU_RSA_WITH_RC4_128_SHA :
wolfSSL 0:1239e9b70ca2 8529 return "TLS_NTRU_RSA_WITH_RC4_128_SHA";
wolfSSL 0:1239e9b70ca2 8530 #endif
wolfSSL 0:1239e9b70ca2 8531 #ifndef NO_DES3
wolfSSL 0:1239e9b70ca2 8532 case TLS_NTRU_RSA_WITH_3DES_EDE_CBC_SHA :
wolfSSL 0:1239e9b70ca2 8533 return "TLS_NTRU_RSA_WITH_3DES_EDE_CBC_SHA";
wolfSSL 0:1239e9b70ca2 8534 #endif
wolfSSL 0:1239e9b70ca2 8535 case TLS_NTRU_RSA_WITH_AES_128_CBC_SHA :
wolfSSL 0:1239e9b70ca2 8536 return "TLS_NTRU_RSA_WITH_AES_128_CBC_SHA";
wolfSSL 0:1239e9b70ca2 8537 case TLS_NTRU_RSA_WITH_AES_256_CBC_SHA :
wolfSSL 0:1239e9b70ca2 8538 return "TLS_NTRU_RSA_WITH_AES_256_CBC_SHA";
wolfSSL 0:1239e9b70ca2 8539 #endif /* HAVE_NTRU */
wolfSSL 0:1239e9b70ca2 8540 #endif /* NO_SHA */
wolfSSL 0:1239e9b70ca2 8541 case TLS_RSA_WITH_AES_128_GCM_SHA256 :
wolfSSL 0:1239e9b70ca2 8542 return "TLS_RSA_WITH_AES_128_GCM_SHA256";
wolfSSL 0:1239e9b70ca2 8543 case TLS_RSA_WITH_AES_256_GCM_SHA384 :
wolfSSL 0:1239e9b70ca2 8544 return "TLS_RSA_WITH_AES_256_GCM_SHA384";
wolfSSL 0:1239e9b70ca2 8545 case TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 :
wolfSSL 0:1239e9b70ca2 8546 return "TLS_DHE_RSA_WITH_AES_128_GCM_SHA256";
wolfSSL 0:1239e9b70ca2 8547 case TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 :
wolfSSL 0:1239e9b70ca2 8548 return "TLS_DHE_RSA_WITH_AES_256_GCM_SHA384";
wolfSSL 0:1239e9b70ca2 8549 #ifndef NO_SHA
wolfSSL 0:1239e9b70ca2 8550 case TLS_RSA_WITH_CAMELLIA_128_CBC_SHA :
wolfSSL 0:1239e9b70ca2 8551 return "TLS_RSA_WITH_CAMELLIA_128_CBC_SHA";
wolfSSL 0:1239e9b70ca2 8552 case TLS_RSA_WITH_CAMELLIA_256_CBC_SHA :
wolfSSL 0:1239e9b70ca2 8553 return "TLS_RSA_WITH_CAMELLIA_256_CBC_SHA";
wolfSSL 0:1239e9b70ca2 8554 #endif
wolfSSL 0:1239e9b70ca2 8555 case TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256 :
wolfSSL 0:1239e9b70ca2 8556 return "TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256";
wolfSSL 0:1239e9b70ca2 8557 case TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256 :
wolfSSL 0:1239e9b70ca2 8558 return "TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256";
wolfSSL 0:1239e9b70ca2 8559 #ifndef NO_SHA
wolfSSL 0:1239e9b70ca2 8560 case TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA :
wolfSSL 0:1239e9b70ca2 8561 return "TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA";
wolfSSL 0:1239e9b70ca2 8562 case TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA :
wolfSSL 0:1239e9b70ca2 8563 return "TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA";
wolfSSL 0:1239e9b70ca2 8564 #endif
wolfSSL 0:1239e9b70ca2 8565 case TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 :
wolfSSL 0:1239e9b70ca2 8566 return "TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256";
wolfSSL 0:1239e9b70ca2 8567 case TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 :
wolfSSL 0:1239e9b70ca2 8568 return "TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256";
wolfSSL 0:1239e9b70ca2 8569 #endif /* NO_RSA */
wolfSSL 0:1239e9b70ca2 8570 default:
wolfSSL 0:1239e9b70ca2 8571 return "NONE";
wolfSSL 0:1239e9b70ca2 8572 } /* switch */
wolfSSL 0:1239e9b70ca2 8573 } /* normal / ECC */
wolfSSL 0:1239e9b70ca2 8574 }
wolfSSL 0:1239e9b70ca2 8575 #endif /* NO_ERROR_STRINGS */
wolfSSL 0:1239e9b70ca2 8576 return "NONE";
wolfSSL 0:1239e9b70ca2 8577 }
wolfSSL 0:1239e9b70ca2 8578
wolfSSL 0:1239e9b70ca2 8579
wolfSSL 0:1239e9b70ca2 8580 const char* CyaSSL_get_cipher(CYASSL* ssl)
wolfSSL 0:1239e9b70ca2 8581 {
wolfSSL 0:1239e9b70ca2 8582 CYASSL_ENTER("CyaSSL_get_cipher");
wolfSSL 0:1239e9b70ca2 8583 return CyaSSL_CIPHER_get_name(CyaSSL_get_current_cipher(ssl));
wolfSSL 0:1239e9b70ca2 8584 }
wolfSSL 0:1239e9b70ca2 8585
wolfSSL 0:1239e9b70ca2 8586 #ifdef OPENSSL_EXTRA
wolfSSL 0:1239e9b70ca2 8587
wolfSSL 0:1239e9b70ca2 8588 /* XXX shuld be NO_DH */
wolfSSL 0:1239e9b70ca2 8589 #ifndef NO_CERTS
wolfSSL 0:1239e9b70ca2 8590 /* server ctx Diffie-Hellman parameters, SSL_SUCCESS on ok */
wolfSSL 0:1239e9b70ca2 8591 int CyaSSL_CTX_SetTmpDH(CYASSL_CTX* ctx, const unsigned char* p, int pSz,
wolfSSL 0:1239e9b70ca2 8592 const unsigned char* g, int gSz)
wolfSSL 0:1239e9b70ca2 8593 {
wolfSSL 0:1239e9b70ca2 8594 CYASSL_ENTER("CyaSSL_CTX_SetTmpDH");
wolfSSL 0:1239e9b70ca2 8595 if (ctx == NULL || p == NULL || g == NULL) return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 8596
wolfSSL 0:1239e9b70ca2 8597 XFREE(ctx->serverDH_P.buffer, ctx->heap, DYNAMIC_TYPE_DH);
wolfSSL 0:1239e9b70ca2 8598 XFREE(ctx->serverDH_G.buffer, ctx->heap, DYNAMIC_TYPE_DH);
wolfSSL 0:1239e9b70ca2 8599
wolfSSL 0:1239e9b70ca2 8600 ctx->serverDH_P.buffer = (byte*)XMALLOC(pSz, ctx->heap,DYNAMIC_TYPE_DH);
wolfSSL 0:1239e9b70ca2 8601 if (ctx->serverDH_P.buffer == NULL)
wolfSSL 0:1239e9b70ca2 8602 return MEMORY_E;
wolfSSL 0:1239e9b70ca2 8603
wolfSSL 0:1239e9b70ca2 8604 ctx->serverDH_G.buffer = (byte*)XMALLOC(gSz, ctx->heap,DYNAMIC_TYPE_DH);
wolfSSL 0:1239e9b70ca2 8605 if (ctx->serverDH_G.buffer == NULL) {
wolfSSL 0:1239e9b70ca2 8606 XFREE(ctx->serverDH_P.buffer, ctx->heap, DYNAMIC_TYPE_DH);
wolfSSL 0:1239e9b70ca2 8607 return MEMORY_E;
wolfSSL 0:1239e9b70ca2 8608 }
wolfSSL 0:1239e9b70ca2 8609
wolfSSL 0:1239e9b70ca2 8610 ctx->serverDH_P.length = pSz;
wolfSSL 0:1239e9b70ca2 8611 ctx->serverDH_G.length = gSz;
wolfSSL 0:1239e9b70ca2 8612
wolfSSL 0:1239e9b70ca2 8613 XMEMCPY(ctx->serverDH_P.buffer, p, pSz);
wolfSSL 0:1239e9b70ca2 8614 XMEMCPY(ctx->serverDH_G.buffer, g, gSz);
wolfSSL 0:1239e9b70ca2 8615
wolfSSL 0:1239e9b70ca2 8616 ctx->haveDH = 1;
wolfSSL 0:1239e9b70ca2 8617
wolfSSL 0:1239e9b70ca2 8618 CYASSL_LEAVE("CyaSSL_CTX_SetTmpDH", 0);
wolfSSL 0:1239e9b70ca2 8619 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 8620 }
wolfSSL 0:1239e9b70ca2 8621 #endif /* !NO_CERTS */
wolfSSL 0:1239e9b70ca2 8622
wolfSSL 0:1239e9b70ca2 8623
wolfSSL 0:1239e9b70ca2 8624 char* CyaSSL_CIPHER_description(CYASSL_CIPHER* cipher, char* in, int len)
wolfSSL 0:1239e9b70ca2 8625 {
wolfSSL 0:1239e9b70ca2 8626 (void)cipher;
wolfSSL 0:1239e9b70ca2 8627 (void)in;
wolfSSL 0:1239e9b70ca2 8628 (void)len;
wolfSSL 0:1239e9b70ca2 8629 return 0;
wolfSSL 0:1239e9b70ca2 8630 }
wolfSSL 0:1239e9b70ca2 8631
wolfSSL 0:1239e9b70ca2 8632
wolfSSL 0:1239e9b70ca2 8633 CYASSL_SESSION* CyaSSL_get1_session(CYASSL* ssl) /* what's ref count */
wolfSSL 0:1239e9b70ca2 8634 {
wolfSSL 0:1239e9b70ca2 8635 (void)ssl;
wolfSSL 0:1239e9b70ca2 8636 return 0;
wolfSSL 0:1239e9b70ca2 8637 }
wolfSSL 0:1239e9b70ca2 8638
wolfSSL 0:1239e9b70ca2 8639
wolfSSL 0:1239e9b70ca2 8640 void CyaSSL_X509_free(CYASSL_X509* buf)
wolfSSL 0:1239e9b70ca2 8641 {
wolfSSL 0:1239e9b70ca2 8642 (void)buf;
wolfSSL 0:1239e9b70ca2 8643 }
wolfSSL 0:1239e9b70ca2 8644
wolfSSL 0:1239e9b70ca2 8645
wolfSSL 0:1239e9b70ca2 8646 /* was do nothing */
wolfSSL 0:1239e9b70ca2 8647 /*
wolfSSL 0:1239e9b70ca2 8648 void OPENSSL_free(void* buf)
wolfSSL 0:1239e9b70ca2 8649 {
wolfSSL 0:1239e9b70ca2 8650 (void)buf;
wolfSSL 0:1239e9b70ca2 8651 }
wolfSSL 0:1239e9b70ca2 8652 */
wolfSSL 0:1239e9b70ca2 8653
wolfSSL 0:1239e9b70ca2 8654
wolfSSL 0:1239e9b70ca2 8655 int CyaSSL_OCSP_parse_url(char* url, char** host, char** port, char** path,
wolfSSL 0:1239e9b70ca2 8656 int* ssl)
wolfSSL 0:1239e9b70ca2 8657 {
wolfSSL 0:1239e9b70ca2 8658 (void)url;
wolfSSL 0:1239e9b70ca2 8659 (void)host;
wolfSSL 0:1239e9b70ca2 8660 (void)port;
wolfSSL 0:1239e9b70ca2 8661 (void)path;
wolfSSL 0:1239e9b70ca2 8662 (void)ssl;
wolfSSL 0:1239e9b70ca2 8663 return 0;
wolfSSL 0:1239e9b70ca2 8664 }
wolfSSL 0:1239e9b70ca2 8665
wolfSSL 0:1239e9b70ca2 8666
wolfSSL 0:1239e9b70ca2 8667 CYASSL_METHOD* CyaSSLv2_client_method(void)
wolfSSL 0:1239e9b70ca2 8668 {
wolfSSL 0:1239e9b70ca2 8669 return 0;
wolfSSL 0:1239e9b70ca2 8670 }
wolfSSL 0:1239e9b70ca2 8671
wolfSSL 0:1239e9b70ca2 8672
wolfSSL 0:1239e9b70ca2 8673 CYASSL_METHOD* CyaSSLv2_server_method(void)
wolfSSL 0:1239e9b70ca2 8674 {
wolfSSL 0:1239e9b70ca2 8675 return 0;
wolfSSL 0:1239e9b70ca2 8676 }
wolfSSL 0:1239e9b70ca2 8677
wolfSSL 0:1239e9b70ca2 8678
wolfSSL 0:1239e9b70ca2 8679 #ifndef NO_MD4
wolfSSL 0:1239e9b70ca2 8680
wolfSSL 0:1239e9b70ca2 8681 void CyaSSL_MD4_Init(CYASSL_MD4_CTX* md4)
wolfSSL 0:1239e9b70ca2 8682 {
wolfSSL 0:1239e9b70ca2 8683 /* make sure we have a big enough buffer */
wolfSSL 0:1239e9b70ca2 8684 typedef char ok[sizeof(md4->buffer) >= sizeof(Md4) ? 1 : -1];
wolfSSL 0:1239e9b70ca2 8685 (void) sizeof(ok);
wolfSSL 0:1239e9b70ca2 8686
wolfSSL 0:1239e9b70ca2 8687 CYASSL_ENTER("MD4_Init");
wolfSSL 0:1239e9b70ca2 8688 InitMd4((Md4*)md4);
wolfSSL 0:1239e9b70ca2 8689 }
wolfSSL 0:1239e9b70ca2 8690
wolfSSL 0:1239e9b70ca2 8691
wolfSSL 0:1239e9b70ca2 8692 void CyaSSL_MD4_Update(CYASSL_MD4_CTX* md4, const void* data,
wolfSSL 0:1239e9b70ca2 8693 unsigned long len)
wolfSSL 0:1239e9b70ca2 8694 {
wolfSSL 0:1239e9b70ca2 8695 CYASSL_ENTER("MD4_Update");
wolfSSL 0:1239e9b70ca2 8696 Md4Update((Md4*)md4, (const byte*)data, (word32)len);
wolfSSL 0:1239e9b70ca2 8697 }
wolfSSL 0:1239e9b70ca2 8698
wolfSSL 0:1239e9b70ca2 8699
wolfSSL 0:1239e9b70ca2 8700 void CyaSSL_MD4_Final(unsigned char* digest, CYASSL_MD4_CTX* md4)
wolfSSL 0:1239e9b70ca2 8701 {
wolfSSL 0:1239e9b70ca2 8702 CYASSL_ENTER("MD4_Final");
wolfSSL 0:1239e9b70ca2 8703 Md4Final((Md4*)md4, digest);
wolfSSL 0:1239e9b70ca2 8704 }
wolfSSL 0:1239e9b70ca2 8705
wolfSSL 0:1239e9b70ca2 8706 #endif /* NO_MD4 */
wolfSSL 0:1239e9b70ca2 8707
wolfSSL 0:1239e9b70ca2 8708
wolfSSL 0:1239e9b70ca2 8709 CYASSL_BIO* CyaSSL_BIO_pop(CYASSL_BIO* top)
wolfSSL 0:1239e9b70ca2 8710 {
wolfSSL 0:1239e9b70ca2 8711 (void)top;
wolfSSL 0:1239e9b70ca2 8712 return 0;
wolfSSL 0:1239e9b70ca2 8713 }
wolfSSL 0:1239e9b70ca2 8714
wolfSSL 0:1239e9b70ca2 8715
wolfSSL 0:1239e9b70ca2 8716 int CyaSSL_BIO_pending(CYASSL_BIO* bio)
wolfSSL 0:1239e9b70ca2 8717 {
wolfSSL 0:1239e9b70ca2 8718 (void)bio;
wolfSSL 0:1239e9b70ca2 8719 return 0;
wolfSSL 0:1239e9b70ca2 8720 }
wolfSSL 0:1239e9b70ca2 8721
wolfSSL 0:1239e9b70ca2 8722
wolfSSL 0:1239e9b70ca2 8723
wolfSSL 0:1239e9b70ca2 8724 CYASSL_BIO_METHOD* CyaSSL_BIO_s_mem(void)
wolfSSL 0:1239e9b70ca2 8725 {
wolfSSL 0:1239e9b70ca2 8726 static CYASSL_BIO_METHOD meth;
wolfSSL 0:1239e9b70ca2 8727
wolfSSL 0:1239e9b70ca2 8728 CYASSL_ENTER("BIO_s_mem");
wolfSSL 0:1239e9b70ca2 8729 meth.type = BIO_MEMORY;
wolfSSL 0:1239e9b70ca2 8730
wolfSSL 0:1239e9b70ca2 8731 return &meth;
wolfSSL 0:1239e9b70ca2 8732 }
wolfSSL 0:1239e9b70ca2 8733
wolfSSL 0:1239e9b70ca2 8734
wolfSSL 0:1239e9b70ca2 8735 CYASSL_BIO_METHOD* CyaSSL_BIO_f_base64(void)
wolfSSL 0:1239e9b70ca2 8736 {
wolfSSL 0:1239e9b70ca2 8737 return 0;
wolfSSL 0:1239e9b70ca2 8738 }
wolfSSL 0:1239e9b70ca2 8739
wolfSSL 0:1239e9b70ca2 8740
wolfSSL 0:1239e9b70ca2 8741 void CyaSSL_BIO_set_flags(CYASSL_BIO* bio, int flags)
wolfSSL 0:1239e9b70ca2 8742 {
wolfSSL 0:1239e9b70ca2 8743 (void)bio;
wolfSSL 0:1239e9b70ca2 8744 (void)flags;
wolfSSL 0:1239e9b70ca2 8745 }
wolfSSL 0:1239e9b70ca2 8746
wolfSSL 0:1239e9b70ca2 8747
wolfSSL 0:1239e9b70ca2 8748
wolfSSL 0:1239e9b70ca2 8749 void CyaSSL_RAND_screen(void)
wolfSSL 0:1239e9b70ca2 8750 {
wolfSSL 0:1239e9b70ca2 8751
wolfSSL 0:1239e9b70ca2 8752 }
wolfSSL 0:1239e9b70ca2 8753
wolfSSL 0:1239e9b70ca2 8754
wolfSSL 0:1239e9b70ca2 8755 const char* CyaSSL_RAND_file_name(char* fname, unsigned long len)
wolfSSL 0:1239e9b70ca2 8756 {
wolfSSL 0:1239e9b70ca2 8757 (void)fname;
wolfSSL 0:1239e9b70ca2 8758 (void)len;
wolfSSL 0:1239e9b70ca2 8759 return 0;
wolfSSL 0:1239e9b70ca2 8760 }
wolfSSL 0:1239e9b70ca2 8761
wolfSSL 0:1239e9b70ca2 8762
wolfSSL 0:1239e9b70ca2 8763 int CyaSSL_RAND_write_file(const char* fname)
wolfSSL 0:1239e9b70ca2 8764 {
wolfSSL 0:1239e9b70ca2 8765 (void)fname;
wolfSSL 0:1239e9b70ca2 8766 return 0;
wolfSSL 0:1239e9b70ca2 8767 }
wolfSSL 0:1239e9b70ca2 8768
wolfSSL 0:1239e9b70ca2 8769
wolfSSL 0:1239e9b70ca2 8770 int CyaSSL_RAND_load_file(const char* fname, long len)
wolfSSL 0:1239e9b70ca2 8771 {
wolfSSL 0:1239e9b70ca2 8772 (void)fname;
wolfSSL 0:1239e9b70ca2 8773 /* CTaoCrypt provides enough entropy internally or will report error */
wolfSSL 0:1239e9b70ca2 8774 if (len == -1)
wolfSSL 0:1239e9b70ca2 8775 return 1024;
wolfSSL 0:1239e9b70ca2 8776 else
wolfSSL 0:1239e9b70ca2 8777 return (int)len;
wolfSSL 0:1239e9b70ca2 8778 }
wolfSSL 0:1239e9b70ca2 8779
wolfSSL 0:1239e9b70ca2 8780
wolfSSL 0:1239e9b70ca2 8781 int CyaSSL_RAND_egd(const char* path)
wolfSSL 0:1239e9b70ca2 8782 {
wolfSSL 0:1239e9b70ca2 8783 (void)path;
wolfSSL 0:1239e9b70ca2 8784 return 0;
wolfSSL 0:1239e9b70ca2 8785 }
wolfSSL 0:1239e9b70ca2 8786
wolfSSL 0:1239e9b70ca2 8787
wolfSSL 0:1239e9b70ca2 8788
wolfSSL 0:1239e9b70ca2 8789 CYASSL_COMP_METHOD* CyaSSL_COMP_zlib(void)
wolfSSL 0:1239e9b70ca2 8790 {
wolfSSL 0:1239e9b70ca2 8791 return 0;
wolfSSL 0:1239e9b70ca2 8792 }
wolfSSL 0:1239e9b70ca2 8793
wolfSSL 0:1239e9b70ca2 8794
wolfSSL 0:1239e9b70ca2 8795 CYASSL_COMP_METHOD* CyaSSL_COMP_rle(void)
wolfSSL 0:1239e9b70ca2 8796 {
wolfSSL 0:1239e9b70ca2 8797 return 0;
wolfSSL 0:1239e9b70ca2 8798 }
wolfSSL 0:1239e9b70ca2 8799
wolfSSL 0:1239e9b70ca2 8800
wolfSSL 0:1239e9b70ca2 8801 int CyaSSL_COMP_add_compression_method(int method, void* data)
wolfSSL 0:1239e9b70ca2 8802 {
wolfSSL 0:1239e9b70ca2 8803 (void)method;
wolfSSL 0:1239e9b70ca2 8804 (void)data;
wolfSSL 0:1239e9b70ca2 8805 return 0;
wolfSSL 0:1239e9b70ca2 8806 }
wolfSSL 0:1239e9b70ca2 8807
wolfSSL 0:1239e9b70ca2 8808
wolfSSL 0:1239e9b70ca2 8809
wolfSSL 0:1239e9b70ca2 8810 int CyaSSL_get_ex_new_index(long idx, void* data, void* cb1, void* cb2,
wolfSSL 0:1239e9b70ca2 8811 void* cb3)
wolfSSL 0:1239e9b70ca2 8812 {
wolfSSL 0:1239e9b70ca2 8813 (void)idx;
wolfSSL 0:1239e9b70ca2 8814 (void)data;
wolfSSL 0:1239e9b70ca2 8815 (void)cb1;
wolfSSL 0:1239e9b70ca2 8816 (void)cb2;
wolfSSL 0:1239e9b70ca2 8817 (void)cb3;
wolfSSL 0:1239e9b70ca2 8818 return 0;
wolfSSL 0:1239e9b70ca2 8819 }
wolfSSL 0:1239e9b70ca2 8820
wolfSSL 0:1239e9b70ca2 8821
wolfSSL 0:1239e9b70ca2 8822 void CyaSSL_set_dynlock_create_callback(CYASSL_dynlock_value* (*f)(
wolfSSL 0:1239e9b70ca2 8823 const char*, int))
wolfSSL 0:1239e9b70ca2 8824 {
wolfSSL 0:1239e9b70ca2 8825 (void)f;
wolfSSL 0:1239e9b70ca2 8826 }
wolfSSL 0:1239e9b70ca2 8827
wolfSSL 0:1239e9b70ca2 8828
wolfSSL 0:1239e9b70ca2 8829 void CyaSSL_set_dynlock_lock_callback(
wolfSSL 0:1239e9b70ca2 8830 void (*f)(int, CYASSL_dynlock_value*, const char*, int))
wolfSSL 0:1239e9b70ca2 8831 {
wolfSSL 0:1239e9b70ca2 8832 (void)f;
wolfSSL 0:1239e9b70ca2 8833 }
wolfSSL 0:1239e9b70ca2 8834
wolfSSL 0:1239e9b70ca2 8835
wolfSSL 0:1239e9b70ca2 8836 void CyaSSL_set_dynlock_destroy_callback(
wolfSSL 0:1239e9b70ca2 8837 void (*f)(CYASSL_dynlock_value*, const char*, int))
wolfSSL 0:1239e9b70ca2 8838 {
wolfSSL 0:1239e9b70ca2 8839 (void)f;
wolfSSL 0:1239e9b70ca2 8840 }
wolfSSL 0:1239e9b70ca2 8841
wolfSSL 0:1239e9b70ca2 8842
wolfSSL 0:1239e9b70ca2 8843
wolfSSL 0:1239e9b70ca2 8844 const char* CyaSSL_X509_verify_cert_error_string(long err)
wolfSSL 0:1239e9b70ca2 8845 {
wolfSSL 0:1239e9b70ca2 8846 (void)err;
wolfSSL 0:1239e9b70ca2 8847 return 0;
wolfSSL 0:1239e9b70ca2 8848 }
wolfSSL 0:1239e9b70ca2 8849
wolfSSL 0:1239e9b70ca2 8850
wolfSSL 0:1239e9b70ca2 8851
wolfSSL 0:1239e9b70ca2 8852 int CyaSSL_X509_LOOKUP_add_dir(CYASSL_X509_LOOKUP* lookup, const char* dir,
wolfSSL 0:1239e9b70ca2 8853 long len)
wolfSSL 0:1239e9b70ca2 8854 {
wolfSSL 0:1239e9b70ca2 8855 (void)lookup;
wolfSSL 0:1239e9b70ca2 8856 (void)dir;
wolfSSL 0:1239e9b70ca2 8857 (void)len;
wolfSSL 0:1239e9b70ca2 8858 return 0;
wolfSSL 0:1239e9b70ca2 8859 }
wolfSSL 0:1239e9b70ca2 8860
wolfSSL 0:1239e9b70ca2 8861
wolfSSL 0:1239e9b70ca2 8862 int CyaSSL_X509_LOOKUP_load_file(CYASSL_X509_LOOKUP* lookup,
wolfSSL 0:1239e9b70ca2 8863 const char* file, long len)
wolfSSL 0:1239e9b70ca2 8864 {
wolfSSL 0:1239e9b70ca2 8865 (void)lookup;
wolfSSL 0:1239e9b70ca2 8866 (void)file;
wolfSSL 0:1239e9b70ca2 8867 (void)len;
wolfSSL 0:1239e9b70ca2 8868 return 0;
wolfSSL 0:1239e9b70ca2 8869 }
wolfSSL 0:1239e9b70ca2 8870
wolfSSL 0:1239e9b70ca2 8871
wolfSSL 0:1239e9b70ca2 8872 CYASSL_X509_LOOKUP_METHOD* CyaSSL_X509_LOOKUP_hash_dir(void)
wolfSSL 0:1239e9b70ca2 8873 {
wolfSSL 0:1239e9b70ca2 8874 return 0;
wolfSSL 0:1239e9b70ca2 8875 }
wolfSSL 0:1239e9b70ca2 8876
wolfSSL 0:1239e9b70ca2 8877
wolfSSL 0:1239e9b70ca2 8878 CYASSL_X509_LOOKUP_METHOD* CyaSSL_X509_LOOKUP_file(void)
wolfSSL 0:1239e9b70ca2 8879 {
wolfSSL 0:1239e9b70ca2 8880 return 0;
wolfSSL 0:1239e9b70ca2 8881 }
wolfSSL 0:1239e9b70ca2 8882
wolfSSL 0:1239e9b70ca2 8883
wolfSSL 0:1239e9b70ca2 8884
wolfSSL 0:1239e9b70ca2 8885 CYASSL_X509_LOOKUP* CyaSSL_X509_STORE_add_lookup(CYASSL_X509_STORE* store,
wolfSSL 0:1239e9b70ca2 8886 CYASSL_X509_LOOKUP_METHOD* m)
wolfSSL 0:1239e9b70ca2 8887 {
wolfSSL 0:1239e9b70ca2 8888 (void)store;
wolfSSL 0:1239e9b70ca2 8889 (void)m;
wolfSSL 0:1239e9b70ca2 8890 return 0;
wolfSSL 0:1239e9b70ca2 8891 }
wolfSSL 0:1239e9b70ca2 8892
wolfSSL 0:1239e9b70ca2 8893
wolfSSL 0:1239e9b70ca2 8894 int CyaSSL_X509_STORE_add_cert(CYASSL_X509_STORE* store, CYASSL_X509* x509)
wolfSSL 0:1239e9b70ca2 8895 {
wolfSSL 0:1239e9b70ca2 8896 int result = SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 8897
wolfSSL 0:1239e9b70ca2 8898 CYASSL_ENTER("CyaSSL_X509_STORE_add_cert");
wolfSSL 0:1239e9b70ca2 8899 if (store != NULL && store->cm != NULL && x509 != NULL) {
wolfSSL 0:1239e9b70ca2 8900 buffer derCert;
wolfSSL 0:1239e9b70ca2 8901 derCert.buffer = (byte*)XMALLOC(x509->derCert.length,
wolfSSL 0:1239e9b70ca2 8902 NULL, DYNAMIC_TYPE_CERT);
wolfSSL 0:1239e9b70ca2 8903 if (derCert.buffer != NULL) {
wolfSSL 0:1239e9b70ca2 8904 derCert.length = x509->derCert.length;
wolfSSL 0:1239e9b70ca2 8905 // AddCA() frees the buffer.
wolfSSL 0:1239e9b70ca2 8906 XMEMCPY(derCert.buffer,
wolfSSL 0:1239e9b70ca2 8907 x509->derCert.buffer, x509->derCert.length);
wolfSSL 0:1239e9b70ca2 8908 result = AddCA(store->cm, derCert, CYASSL_USER_CA, 1);
wolfSSL 0:1239e9b70ca2 8909 if (result != SSL_SUCCESS) result = SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 8910 }
wolfSSL 0:1239e9b70ca2 8911 }
wolfSSL 0:1239e9b70ca2 8912
wolfSSL 0:1239e9b70ca2 8913 CYASSL_LEAVE("CyaSSL_X509_STORE_add_cert", result);
wolfSSL 0:1239e9b70ca2 8914 return result;
wolfSSL 0:1239e9b70ca2 8915 }
wolfSSL 0:1239e9b70ca2 8916
wolfSSL 0:1239e9b70ca2 8917
wolfSSL 0:1239e9b70ca2 8918 CYASSL_X509_STORE* CyaSSL_X509_STORE_new(void)
wolfSSL 0:1239e9b70ca2 8919 {
wolfSSL 0:1239e9b70ca2 8920 CYASSL_X509_STORE* store = NULL;
wolfSSL 0:1239e9b70ca2 8921
wolfSSL 0:1239e9b70ca2 8922 store = (CYASSL_X509_STORE*)XMALLOC(sizeof(CYASSL_X509_STORE), NULL, 0);
wolfSSL 0:1239e9b70ca2 8923 if (store != NULL) {
wolfSSL 0:1239e9b70ca2 8924 store->cm = CyaSSL_CertManagerNew();
wolfSSL 0:1239e9b70ca2 8925 if (store->cm == NULL) {
wolfSSL 0:1239e9b70ca2 8926 XFREE(store, NULL, 0);
wolfSSL 0:1239e9b70ca2 8927 store = NULL;
wolfSSL 0:1239e9b70ca2 8928 }
wolfSSL 0:1239e9b70ca2 8929 }
wolfSSL 0:1239e9b70ca2 8930
wolfSSL 0:1239e9b70ca2 8931 return store;
wolfSSL 0:1239e9b70ca2 8932 }
wolfSSL 0:1239e9b70ca2 8933
wolfSSL 0:1239e9b70ca2 8934
wolfSSL 0:1239e9b70ca2 8935 void CyaSSL_X509_STORE_free(CYASSL_X509_STORE* store)
wolfSSL 0:1239e9b70ca2 8936 {
wolfSSL 0:1239e9b70ca2 8937 if (store != NULL) {
wolfSSL 0:1239e9b70ca2 8938 if (store->cm != NULL)
wolfSSL 0:1239e9b70ca2 8939 CyaSSL_CertManagerFree(store->cm);
wolfSSL 0:1239e9b70ca2 8940 XFREE(store, NULL, 0);
wolfSSL 0:1239e9b70ca2 8941 }
wolfSSL 0:1239e9b70ca2 8942 }
wolfSSL 0:1239e9b70ca2 8943
wolfSSL 0:1239e9b70ca2 8944
wolfSSL 0:1239e9b70ca2 8945 int CyaSSL_X509_STORE_set_default_paths(CYASSL_X509_STORE* store)
wolfSSL 0:1239e9b70ca2 8946 {
wolfSSL 0:1239e9b70ca2 8947 (void)store;
wolfSSL 0:1239e9b70ca2 8948 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 8949 }
wolfSSL 0:1239e9b70ca2 8950
wolfSSL 0:1239e9b70ca2 8951
wolfSSL 0:1239e9b70ca2 8952 int CyaSSL_X509_STORE_get_by_subject(CYASSL_X509_STORE_CTX* ctx, int idx,
wolfSSL 0:1239e9b70ca2 8953 CYASSL_X509_NAME* name, CYASSL_X509_OBJECT* obj)
wolfSSL 0:1239e9b70ca2 8954 {
wolfSSL 0:1239e9b70ca2 8955 (void)ctx;
wolfSSL 0:1239e9b70ca2 8956 (void)idx;
wolfSSL 0:1239e9b70ca2 8957 (void)name;
wolfSSL 0:1239e9b70ca2 8958 (void)obj;
wolfSSL 0:1239e9b70ca2 8959 return 0;
wolfSSL 0:1239e9b70ca2 8960 }
wolfSSL 0:1239e9b70ca2 8961
wolfSSL 0:1239e9b70ca2 8962
wolfSSL 0:1239e9b70ca2 8963 CYASSL_X509_STORE_CTX* CyaSSL_X509_STORE_CTX_new(void)
wolfSSL 0:1239e9b70ca2 8964 {
wolfSSL 0:1239e9b70ca2 8965 CYASSL_X509_STORE_CTX* ctx = (CYASSL_X509_STORE_CTX*)XMALLOC(
wolfSSL 0:1239e9b70ca2 8966 sizeof(CYASSL_X509_STORE_CTX), NULL, 0);
wolfSSL 0:1239e9b70ca2 8967
wolfSSL 0:1239e9b70ca2 8968 if (ctx != NULL)
wolfSSL 0:1239e9b70ca2 8969 CyaSSL_X509_STORE_CTX_init(ctx, NULL, NULL, NULL);
wolfSSL 0:1239e9b70ca2 8970
wolfSSL 0:1239e9b70ca2 8971 return ctx;
wolfSSL 0:1239e9b70ca2 8972 }
wolfSSL 0:1239e9b70ca2 8973
wolfSSL 0:1239e9b70ca2 8974
wolfSSL 0:1239e9b70ca2 8975 int CyaSSL_X509_STORE_CTX_init(CYASSL_X509_STORE_CTX* ctx,
wolfSSL 0:1239e9b70ca2 8976 CYASSL_X509_STORE* store, CYASSL_X509* x509, STACK_OF(CYASSL_X509)* sk)
wolfSSL 0:1239e9b70ca2 8977 {
wolfSSL 0:1239e9b70ca2 8978 (void)sk;
wolfSSL 0:1239e9b70ca2 8979 if (ctx != NULL) {
wolfSSL 0:1239e9b70ca2 8980 ctx->store = store;
wolfSSL 0:1239e9b70ca2 8981 ctx->current_cert = x509;
wolfSSL 0:1239e9b70ca2 8982 ctx->domain = NULL;
wolfSSL 0:1239e9b70ca2 8983 ctx->ex_data = NULL;
wolfSSL 0:1239e9b70ca2 8984 ctx->userCtx = NULL;
wolfSSL 0:1239e9b70ca2 8985 ctx->error = 0;
wolfSSL 0:1239e9b70ca2 8986 ctx->error_depth = 0;
wolfSSL 0:1239e9b70ca2 8987 ctx->discardSessionCerts = 0;
wolfSSL 0:1239e9b70ca2 8988 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 8989 }
wolfSSL 0:1239e9b70ca2 8990 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 8991 }
wolfSSL 0:1239e9b70ca2 8992
wolfSSL 0:1239e9b70ca2 8993
wolfSSL 0:1239e9b70ca2 8994 void CyaSSL_X509_STORE_CTX_free(CYASSL_X509_STORE_CTX* ctx)
wolfSSL 0:1239e9b70ca2 8995 {
wolfSSL 0:1239e9b70ca2 8996 if (ctx != NULL) {
wolfSSL 0:1239e9b70ca2 8997 if (ctx->store != NULL)
wolfSSL 0:1239e9b70ca2 8998 CyaSSL_X509_STORE_free(ctx->store);
wolfSSL 0:1239e9b70ca2 8999 if (ctx->current_cert != NULL)
wolfSSL 0:1239e9b70ca2 9000 CyaSSL_FreeX509(ctx->current_cert);
wolfSSL 0:1239e9b70ca2 9001 XFREE(ctx, NULL, 0);
wolfSSL 0:1239e9b70ca2 9002 }
wolfSSL 0:1239e9b70ca2 9003 }
wolfSSL 0:1239e9b70ca2 9004
wolfSSL 0:1239e9b70ca2 9005
wolfSSL 0:1239e9b70ca2 9006 void CyaSSL_X509_STORE_CTX_cleanup(CYASSL_X509_STORE_CTX* ctx)
wolfSSL 0:1239e9b70ca2 9007 {
wolfSSL 0:1239e9b70ca2 9008 (void)ctx;
wolfSSL 0:1239e9b70ca2 9009 }
wolfSSL 0:1239e9b70ca2 9010
wolfSSL 0:1239e9b70ca2 9011
wolfSSL 0:1239e9b70ca2 9012 int CyaSSL_X509_verify_cert(CYASSL_X509_STORE_CTX* ctx)
wolfSSL 0:1239e9b70ca2 9013 {
wolfSSL 0:1239e9b70ca2 9014 if (ctx != NULL && ctx->store != NULL && ctx->store->cm != NULL
wolfSSL 0:1239e9b70ca2 9015 && ctx->current_cert != NULL) {
wolfSSL 0:1239e9b70ca2 9016 return CyaSSL_CertManagerVerifyBuffer(ctx->store->cm,
wolfSSL 0:1239e9b70ca2 9017 ctx->current_cert->derCert.buffer,
wolfSSL 0:1239e9b70ca2 9018 ctx->current_cert->derCert.length,
wolfSSL 0:1239e9b70ca2 9019 SSL_FILETYPE_ASN1);
wolfSSL 0:1239e9b70ca2 9020 }
wolfSSL 0:1239e9b70ca2 9021 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 9022 }
wolfSSL 0:1239e9b70ca2 9023
wolfSSL 0:1239e9b70ca2 9024
wolfSSL 0:1239e9b70ca2 9025 CYASSL_ASN1_TIME* CyaSSL_X509_CRL_get_lastUpdate(CYASSL_X509_CRL* crl)
wolfSSL 0:1239e9b70ca2 9026 {
wolfSSL 0:1239e9b70ca2 9027 (void)crl;
wolfSSL 0:1239e9b70ca2 9028 return 0;
wolfSSL 0:1239e9b70ca2 9029 }
wolfSSL 0:1239e9b70ca2 9030
wolfSSL 0:1239e9b70ca2 9031
wolfSSL 0:1239e9b70ca2 9032 CYASSL_ASN1_TIME* CyaSSL_X509_CRL_get_nextUpdate(CYASSL_X509_CRL* crl)
wolfSSL 0:1239e9b70ca2 9033 {
wolfSSL 0:1239e9b70ca2 9034 (void)crl;
wolfSSL 0:1239e9b70ca2 9035 return 0;
wolfSSL 0:1239e9b70ca2 9036 }
wolfSSL 0:1239e9b70ca2 9037
wolfSSL 0:1239e9b70ca2 9038
wolfSSL 0:1239e9b70ca2 9039
wolfSSL 0:1239e9b70ca2 9040 CYASSL_EVP_PKEY* CyaSSL_X509_get_pubkey(CYASSL_X509* x509)
wolfSSL 0:1239e9b70ca2 9041 {
wolfSSL 0:1239e9b70ca2 9042 CYASSL_EVP_PKEY* key = NULL;
wolfSSL 0:1239e9b70ca2 9043 if (x509 != NULL) {
wolfSSL 0:1239e9b70ca2 9044 key = (CYASSL_EVP_PKEY*)XMALLOC(
wolfSSL 0:1239e9b70ca2 9045 sizeof(CYASSL_EVP_PKEY), NULL, DYNAMIC_TYPE_PUBLIC_KEY);
wolfSSL 0:1239e9b70ca2 9046 if (key != NULL) {
wolfSSL 0:1239e9b70ca2 9047 key->type = x509->pubKeyOID;
wolfSSL 0:1239e9b70ca2 9048 key->save_type = 0;
wolfSSL 0:1239e9b70ca2 9049 key->pkey.ptr = (char*)XMALLOC(
wolfSSL 0:1239e9b70ca2 9050 x509->pubKey.length, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
wolfSSL 0:1239e9b70ca2 9051 if (key->pkey.ptr == NULL) {
wolfSSL 0:1239e9b70ca2 9052 XFREE(key, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
wolfSSL 0:1239e9b70ca2 9053 return NULL;
wolfSSL 0:1239e9b70ca2 9054 }
wolfSSL 0:1239e9b70ca2 9055 XMEMCPY(key->pkey.ptr,
wolfSSL 0:1239e9b70ca2 9056 x509->pubKey.buffer, x509->pubKey.length);
wolfSSL 0:1239e9b70ca2 9057 key->pkey_sz = x509->pubKey.length;
wolfSSL 0:1239e9b70ca2 9058 #ifdef HAVE_ECC
wolfSSL 0:1239e9b70ca2 9059 key->pkey_curve = (int)x509->pkCurveOID;
wolfSSL 0:1239e9b70ca2 9060 #endif /* HAVE_ECC */
wolfSSL 0:1239e9b70ca2 9061 }
wolfSSL 0:1239e9b70ca2 9062 }
wolfSSL 0:1239e9b70ca2 9063 return key;
wolfSSL 0:1239e9b70ca2 9064 }
wolfSSL 0:1239e9b70ca2 9065
wolfSSL 0:1239e9b70ca2 9066
wolfSSL 0:1239e9b70ca2 9067 int CyaSSL_X509_CRL_verify(CYASSL_X509_CRL* crl, CYASSL_EVP_PKEY* key)
wolfSSL 0:1239e9b70ca2 9068 {
wolfSSL 0:1239e9b70ca2 9069 (void)crl;
wolfSSL 0:1239e9b70ca2 9070 (void)key;
wolfSSL 0:1239e9b70ca2 9071 return 0;
wolfSSL 0:1239e9b70ca2 9072 }
wolfSSL 0:1239e9b70ca2 9073
wolfSSL 0:1239e9b70ca2 9074
wolfSSL 0:1239e9b70ca2 9075 void CyaSSL_X509_STORE_CTX_set_error(CYASSL_X509_STORE_CTX* ctx, int err)
wolfSSL 0:1239e9b70ca2 9076 {
wolfSSL 0:1239e9b70ca2 9077 (void)ctx;
wolfSSL 0:1239e9b70ca2 9078 (void)err;
wolfSSL 0:1239e9b70ca2 9079 }
wolfSSL 0:1239e9b70ca2 9080
wolfSSL 0:1239e9b70ca2 9081
wolfSSL 0:1239e9b70ca2 9082 void CyaSSL_X509_OBJECT_free_contents(CYASSL_X509_OBJECT* obj)
wolfSSL 0:1239e9b70ca2 9083 {
wolfSSL 0:1239e9b70ca2 9084 (void)obj;
wolfSSL 0:1239e9b70ca2 9085 }
wolfSSL 0:1239e9b70ca2 9086
wolfSSL 0:1239e9b70ca2 9087
wolfSSL 0:1239e9b70ca2 9088 void CyaSSL_EVP_PKEY_free(CYASSL_EVP_PKEY* key)
wolfSSL 0:1239e9b70ca2 9089 {
wolfSSL 0:1239e9b70ca2 9090 if (key != NULL) {
wolfSSL 0:1239e9b70ca2 9091 if (key->pkey.ptr != NULL)
wolfSSL 0:1239e9b70ca2 9092 XFREE(key->pkey.ptr, NULL, 0);
wolfSSL 0:1239e9b70ca2 9093 XFREE(key, NULL, 0);
wolfSSL 0:1239e9b70ca2 9094 }
wolfSSL 0:1239e9b70ca2 9095 }
wolfSSL 0:1239e9b70ca2 9096
wolfSSL 0:1239e9b70ca2 9097
wolfSSL 0:1239e9b70ca2 9098 int CyaSSL_X509_cmp_current_time(const CYASSL_ASN1_TIME* asnTime)
wolfSSL 0:1239e9b70ca2 9099 {
wolfSSL 0:1239e9b70ca2 9100 (void)asnTime;
wolfSSL 0:1239e9b70ca2 9101 return 0;
wolfSSL 0:1239e9b70ca2 9102 }
wolfSSL 0:1239e9b70ca2 9103
wolfSSL 0:1239e9b70ca2 9104
wolfSSL 0:1239e9b70ca2 9105 int CyaSSL_sk_X509_REVOKED_num(CYASSL_X509_REVOKED* revoked)
wolfSSL 0:1239e9b70ca2 9106 {
wolfSSL 0:1239e9b70ca2 9107 (void)revoked;
wolfSSL 0:1239e9b70ca2 9108 return 0;
wolfSSL 0:1239e9b70ca2 9109 }
wolfSSL 0:1239e9b70ca2 9110
wolfSSL 0:1239e9b70ca2 9111
wolfSSL 0:1239e9b70ca2 9112
wolfSSL 0:1239e9b70ca2 9113 CYASSL_X509_REVOKED* CyaSSL_X509_CRL_get_REVOKED(CYASSL_X509_CRL* crl)
wolfSSL 0:1239e9b70ca2 9114 {
wolfSSL 0:1239e9b70ca2 9115 (void)crl;
wolfSSL 0:1239e9b70ca2 9116 return 0;
wolfSSL 0:1239e9b70ca2 9117 }
wolfSSL 0:1239e9b70ca2 9118
wolfSSL 0:1239e9b70ca2 9119
wolfSSL 0:1239e9b70ca2 9120 CYASSL_X509_REVOKED* CyaSSL_sk_X509_REVOKED_value(
wolfSSL 0:1239e9b70ca2 9121 CYASSL_X509_REVOKED* revoked, int value)
wolfSSL 0:1239e9b70ca2 9122 {
wolfSSL 0:1239e9b70ca2 9123 (void)revoked;
wolfSSL 0:1239e9b70ca2 9124 (void)value;
wolfSSL 0:1239e9b70ca2 9125 return 0;
wolfSSL 0:1239e9b70ca2 9126 }
wolfSSL 0:1239e9b70ca2 9127
wolfSSL 0:1239e9b70ca2 9128
wolfSSL 0:1239e9b70ca2 9129
wolfSSL 0:1239e9b70ca2 9130 CYASSL_ASN1_INTEGER* CyaSSL_X509_get_serialNumber(CYASSL_X509* x509)
wolfSSL 0:1239e9b70ca2 9131 {
wolfSSL 0:1239e9b70ca2 9132 (void)x509;
wolfSSL 0:1239e9b70ca2 9133 return 0;
wolfSSL 0:1239e9b70ca2 9134 }
wolfSSL 0:1239e9b70ca2 9135
wolfSSL 0:1239e9b70ca2 9136
wolfSSL 0:1239e9b70ca2 9137 int CyaSSL_ASN1_TIME_print(CYASSL_BIO* bio, const CYASSL_ASN1_TIME* asnTime)
wolfSSL 0:1239e9b70ca2 9138 {
wolfSSL 0:1239e9b70ca2 9139 (void)bio;
wolfSSL 0:1239e9b70ca2 9140 (void)asnTime;
wolfSSL 0:1239e9b70ca2 9141 return 0;
wolfSSL 0:1239e9b70ca2 9142 }
wolfSSL 0:1239e9b70ca2 9143
wolfSSL 0:1239e9b70ca2 9144
wolfSSL 0:1239e9b70ca2 9145
wolfSSL 0:1239e9b70ca2 9146 int CyaSSL_ASN1_INTEGER_cmp(const CYASSL_ASN1_INTEGER* a,
wolfSSL 0:1239e9b70ca2 9147 const CYASSL_ASN1_INTEGER* b)
wolfSSL 0:1239e9b70ca2 9148 {
wolfSSL 0:1239e9b70ca2 9149 (void)a;
wolfSSL 0:1239e9b70ca2 9150 (void)b;
wolfSSL 0:1239e9b70ca2 9151 return 0;
wolfSSL 0:1239e9b70ca2 9152 }
wolfSSL 0:1239e9b70ca2 9153
wolfSSL 0:1239e9b70ca2 9154
wolfSSL 0:1239e9b70ca2 9155 long CyaSSL_ASN1_INTEGER_get(const CYASSL_ASN1_INTEGER* i)
wolfSSL 0:1239e9b70ca2 9156 {
wolfSSL 0:1239e9b70ca2 9157 (void)i;
wolfSSL 0:1239e9b70ca2 9158 return 0;
wolfSSL 0:1239e9b70ca2 9159 }
wolfSSL 0:1239e9b70ca2 9160
wolfSSL 0:1239e9b70ca2 9161
wolfSSL 0:1239e9b70ca2 9162
wolfSSL 0:1239e9b70ca2 9163 void* CyaSSL_X509_STORE_CTX_get_ex_data(CYASSL_X509_STORE_CTX* ctx, int idx)
wolfSSL 0:1239e9b70ca2 9164 {
wolfSSL 0:1239e9b70ca2 9165 #ifdef FORTRESS
wolfSSL 0:1239e9b70ca2 9166 if (ctx != NULL && idx == 0)
wolfSSL 0:1239e9b70ca2 9167 return ctx->ex_data;
wolfSSL 0:1239e9b70ca2 9168 #else
wolfSSL 0:1239e9b70ca2 9169 (void)ctx;
wolfSSL 0:1239e9b70ca2 9170 (void)idx;
wolfSSL 0:1239e9b70ca2 9171 #endif
wolfSSL 0:1239e9b70ca2 9172 return 0;
wolfSSL 0:1239e9b70ca2 9173 }
wolfSSL 0:1239e9b70ca2 9174
wolfSSL 0:1239e9b70ca2 9175
wolfSSL 0:1239e9b70ca2 9176 int CyaSSL_get_ex_data_X509_STORE_CTX_idx(void)
wolfSSL 0:1239e9b70ca2 9177 {
wolfSSL 0:1239e9b70ca2 9178 return 0;
wolfSSL 0:1239e9b70ca2 9179 }
wolfSSL 0:1239e9b70ca2 9180
wolfSSL 0:1239e9b70ca2 9181
wolfSSL 0:1239e9b70ca2 9182 void* CyaSSL_get_ex_data(const CYASSL* ssl, int idx)
wolfSSL 0:1239e9b70ca2 9183 {
wolfSSL 0:1239e9b70ca2 9184 #ifdef FORTRESS
wolfSSL 0:1239e9b70ca2 9185 if (ssl != NULL && idx < MAX_EX_DATA)
wolfSSL 0:1239e9b70ca2 9186 return ssl->ex_data[idx];
wolfSSL 0:1239e9b70ca2 9187 #else
wolfSSL 0:1239e9b70ca2 9188 (void)ssl;
wolfSSL 0:1239e9b70ca2 9189 (void)idx;
wolfSSL 0:1239e9b70ca2 9190 #endif
wolfSSL 0:1239e9b70ca2 9191 return 0;
wolfSSL 0:1239e9b70ca2 9192 }
wolfSSL 0:1239e9b70ca2 9193
wolfSSL 0:1239e9b70ca2 9194
wolfSSL 0:1239e9b70ca2 9195 void CyaSSL_CTX_set_info_callback(CYASSL_CTX* ctx, void (*f)(void))
wolfSSL 0:1239e9b70ca2 9196 {
wolfSSL 0:1239e9b70ca2 9197 (void)ctx;
wolfSSL 0:1239e9b70ca2 9198 (void)f;
wolfSSL 0:1239e9b70ca2 9199 }
wolfSSL 0:1239e9b70ca2 9200
wolfSSL 0:1239e9b70ca2 9201
wolfSSL 0:1239e9b70ca2 9202 unsigned long CyaSSL_ERR_peek_error(void)
wolfSSL 0:1239e9b70ca2 9203 {
wolfSSL 0:1239e9b70ca2 9204 return 0;
wolfSSL 0:1239e9b70ca2 9205 }
wolfSSL 0:1239e9b70ca2 9206
wolfSSL 0:1239e9b70ca2 9207
wolfSSL 0:1239e9b70ca2 9208 int CyaSSL_ERR_GET_REASON(int err)
wolfSSL 0:1239e9b70ca2 9209 {
wolfSSL 0:1239e9b70ca2 9210 (void)err;
wolfSSL 0:1239e9b70ca2 9211 return 0;
wolfSSL 0:1239e9b70ca2 9212 }
wolfSSL 0:1239e9b70ca2 9213
wolfSSL 0:1239e9b70ca2 9214
wolfSSL 0:1239e9b70ca2 9215 char* CyaSSL_alert_type_string_long(int alertID)
wolfSSL 0:1239e9b70ca2 9216 {
wolfSSL 0:1239e9b70ca2 9217 (void)alertID;
wolfSSL 0:1239e9b70ca2 9218 return 0;
wolfSSL 0:1239e9b70ca2 9219 }
wolfSSL 0:1239e9b70ca2 9220
wolfSSL 0:1239e9b70ca2 9221
wolfSSL 0:1239e9b70ca2 9222 char* CyaSSL_alert_desc_string_long(int alertID)
wolfSSL 0:1239e9b70ca2 9223 {
wolfSSL 0:1239e9b70ca2 9224 (void)alertID;
wolfSSL 0:1239e9b70ca2 9225 return 0;
wolfSSL 0:1239e9b70ca2 9226 }
wolfSSL 0:1239e9b70ca2 9227
wolfSSL 0:1239e9b70ca2 9228
wolfSSL 0:1239e9b70ca2 9229 char* CyaSSL_state_string_long(CYASSL* ssl)
wolfSSL 0:1239e9b70ca2 9230 {
wolfSSL 0:1239e9b70ca2 9231 (void)ssl;
wolfSSL 0:1239e9b70ca2 9232 return 0;
wolfSSL 0:1239e9b70ca2 9233 }
wolfSSL 0:1239e9b70ca2 9234
wolfSSL 0:1239e9b70ca2 9235
wolfSSL 0:1239e9b70ca2 9236 int CyaSSL_PEM_def_callback(char* name, int num, int w, void* key)
wolfSSL 0:1239e9b70ca2 9237 {
wolfSSL 0:1239e9b70ca2 9238 (void)name;
wolfSSL 0:1239e9b70ca2 9239 (void)num;
wolfSSL 0:1239e9b70ca2 9240 (void)w;
wolfSSL 0:1239e9b70ca2 9241 (void)key;
wolfSSL 0:1239e9b70ca2 9242 return 0;
wolfSSL 0:1239e9b70ca2 9243 }
wolfSSL 0:1239e9b70ca2 9244
wolfSSL 0:1239e9b70ca2 9245
wolfSSL 0:1239e9b70ca2 9246 long CyaSSL_CTX_sess_accept(CYASSL_CTX* ctx)
wolfSSL 0:1239e9b70ca2 9247 {
wolfSSL 0:1239e9b70ca2 9248 (void)ctx;
wolfSSL 0:1239e9b70ca2 9249 return 0;
wolfSSL 0:1239e9b70ca2 9250 }
wolfSSL 0:1239e9b70ca2 9251
wolfSSL 0:1239e9b70ca2 9252
wolfSSL 0:1239e9b70ca2 9253 long CyaSSL_CTX_sess_connect(CYASSL_CTX* ctx)
wolfSSL 0:1239e9b70ca2 9254 {
wolfSSL 0:1239e9b70ca2 9255 (void)ctx;
wolfSSL 0:1239e9b70ca2 9256 return 0;
wolfSSL 0:1239e9b70ca2 9257 }
wolfSSL 0:1239e9b70ca2 9258
wolfSSL 0:1239e9b70ca2 9259
wolfSSL 0:1239e9b70ca2 9260 long CyaSSL_CTX_sess_accept_good(CYASSL_CTX* ctx)
wolfSSL 0:1239e9b70ca2 9261 {
wolfSSL 0:1239e9b70ca2 9262 (void)ctx;
wolfSSL 0:1239e9b70ca2 9263 return 0;
wolfSSL 0:1239e9b70ca2 9264 }
wolfSSL 0:1239e9b70ca2 9265
wolfSSL 0:1239e9b70ca2 9266
wolfSSL 0:1239e9b70ca2 9267 long CyaSSL_CTX_sess_connect_good(CYASSL_CTX* ctx)
wolfSSL 0:1239e9b70ca2 9268 {
wolfSSL 0:1239e9b70ca2 9269 (void)ctx;
wolfSSL 0:1239e9b70ca2 9270 return 0;
wolfSSL 0:1239e9b70ca2 9271 }
wolfSSL 0:1239e9b70ca2 9272
wolfSSL 0:1239e9b70ca2 9273
wolfSSL 0:1239e9b70ca2 9274 long CyaSSL_CTX_sess_accept_renegotiate(CYASSL_CTX* ctx)
wolfSSL 0:1239e9b70ca2 9275 {
wolfSSL 0:1239e9b70ca2 9276 (void)ctx;
wolfSSL 0:1239e9b70ca2 9277 return 0;
wolfSSL 0:1239e9b70ca2 9278 }
wolfSSL 0:1239e9b70ca2 9279
wolfSSL 0:1239e9b70ca2 9280
wolfSSL 0:1239e9b70ca2 9281 long CyaSSL_CTX_sess_connect_renegotiate(CYASSL_CTX* ctx)
wolfSSL 0:1239e9b70ca2 9282 {
wolfSSL 0:1239e9b70ca2 9283 (void)ctx;
wolfSSL 0:1239e9b70ca2 9284 return 0;
wolfSSL 0:1239e9b70ca2 9285 }
wolfSSL 0:1239e9b70ca2 9286
wolfSSL 0:1239e9b70ca2 9287
wolfSSL 0:1239e9b70ca2 9288 long CyaSSL_CTX_sess_hits(CYASSL_CTX* ctx)
wolfSSL 0:1239e9b70ca2 9289 {
wolfSSL 0:1239e9b70ca2 9290 (void)ctx;
wolfSSL 0:1239e9b70ca2 9291 return 0;
wolfSSL 0:1239e9b70ca2 9292 }
wolfSSL 0:1239e9b70ca2 9293
wolfSSL 0:1239e9b70ca2 9294
wolfSSL 0:1239e9b70ca2 9295 long CyaSSL_CTX_sess_cb_hits(CYASSL_CTX* ctx)
wolfSSL 0:1239e9b70ca2 9296 {
wolfSSL 0:1239e9b70ca2 9297 (void)ctx;
wolfSSL 0:1239e9b70ca2 9298 return 0;
wolfSSL 0:1239e9b70ca2 9299 }
wolfSSL 0:1239e9b70ca2 9300
wolfSSL 0:1239e9b70ca2 9301
wolfSSL 0:1239e9b70ca2 9302 long CyaSSL_CTX_sess_cache_full(CYASSL_CTX* ctx)
wolfSSL 0:1239e9b70ca2 9303 {
wolfSSL 0:1239e9b70ca2 9304 (void)ctx;
wolfSSL 0:1239e9b70ca2 9305 return 0;
wolfSSL 0:1239e9b70ca2 9306 }
wolfSSL 0:1239e9b70ca2 9307
wolfSSL 0:1239e9b70ca2 9308
wolfSSL 0:1239e9b70ca2 9309 long CyaSSL_CTX_sess_misses(CYASSL_CTX* ctx)
wolfSSL 0:1239e9b70ca2 9310 {
wolfSSL 0:1239e9b70ca2 9311 (void)ctx;
wolfSSL 0:1239e9b70ca2 9312 return 0;
wolfSSL 0:1239e9b70ca2 9313 }
wolfSSL 0:1239e9b70ca2 9314
wolfSSL 0:1239e9b70ca2 9315
wolfSSL 0:1239e9b70ca2 9316 long CyaSSL_CTX_sess_timeouts(CYASSL_CTX* ctx)
wolfSSL 0:1239e9b70ca2 9317 {
wolfSSL 0:1239e9b70ca2 9318 (void)ctx;
wolfSSL 0:1239e9b70ca2 9319 return 0;
wolfSSL 0:1239e9b70ca2 9320 }
wolfSSL 0:1239e9b70ca2 9321
wolfSSL 0:1239e9b70ca2 9322
wolfSSL 0:1239e9b70ca2 9323 long CyaSSL_CTX_sess_number(CYASSL_CTX* ctx)
wolfSSL 0:1239e9b70ca2 9324 {
wolfSSL 0:1239e9b70ca2 9325 (void)ctx;
wolfSSL 0:1239e9b70ca2 9326 return 0;
wolfSSL 0:1239e9b70ca2 9327 }
wolfSSL 0:1239e9b70ca2 9328
wolfSSL 0:1239e9b70ca2 9329
wolfSSL 0:1239e9b70ca2 9330 void CyaSSL_DES_set_key_unchecked(CYASSL_const_DES_cblock* myDes,
wolfSSL 0:1239e9b70ca2 9331 CYASSL_DES_key_schedule* key)
wolfSSL 0:1239e9b70ca2 9332 {
wolfSSL 0:1239e9b70ca2 9333 (void)myDes;
wolfSSL 0:1239e9b70ca2 9334 (void)key;
wolfSSL 0:1239e9b70ca2 9335 }
wolfSSL 0:1239e9b70ca2 9336
wolfSSL 0:1239e9b70ca2 9337
wolfSSL 0:1239e9b70ca2 9338 void CyaSSL_DES_set_odd_parity(CYASSL_DES_cblock* myDes)
wolfSSL 0:1239e9b70ca2 9339 {
wolfSSL 0:1239e9b70ca2 9340 (void)myDes;
wolfSSL 0:1239e9b70ca2 9341 }
wolfSSL 0:1239e9b70ca2 9342
wolfSSL 0:1239e9b70ca2 9343
wolfSSL 0:1239e9b70ca2 9344 void CyaSSL_DES_ecb_encrypt(CYASSL_DES_cblock* desa,
wolfSSL 0:1239e9b70ca2 9345 CYASSL_DES_cblock* desb, CYASSL_DES_key_schedule* key, int len)
wolfSSL 0:1239e9b70ca2 9346 {
wolfSSL 0:1239e9b70ca2 9347 (void)desa;
wolfSSL 0:1239e9b70ca2 9348 (void)desb;
wolfSSL 0:1239e9b70ca2 9349 (void)key;
wolfSSL 0:1239e9b70ca2 9350 (void)len;
wolfSSL 0:1239e9b70ca2 9351 }
wolfSSL 0:1239e9b70ca2 9352
wolfSSL 0:1239e9b70ca2 9353 int CyaSSL_BIO_printf(CYASSL_BIO* bio, const char* format, ...)
wolfSSL 0:1239e9b70ca2 9354 {
wolfSSL 0:1239e9b70ca2 9355 (void)bio;
wolfSSL 0:1239e9b70ca2 9356 (void)format;
wolfSSL 0:1239e9b70ca2 9357 return 0;
wolfSSL 0:1239e9b70ca2 9358 }
wolfSSL 0:1239e9b70ca2 9359
wolfSSL 0:1239e9b70ca2 9360
wolfSSL 0:1239e9b70ca2 9361 int CyaSSL_ASN1_UTCTIME_print(CYASSL_BIO* bio, const CYASSL_ASN1_UTCTIME* a)
wolfSSL 0:1239e9b70ca2 9362 {
wolfSSL 0:1239e9b70ca2 9363 (void)bio;
wolfSSL 0:1239e9b70ca2 9364 (void)a;
wolfSSL 0:1239e9b70ca2 9365 return 0;
wolfSSL 0:1239e9b70ca2 9366 }
wolfSSL 0:1239e9b70ca2 9367
wolfSSL 0:1239e9b70ca2 9368
wolfSSL 0:1239e9b70ca2 9369 int CyaSSL_sk_num(CYASSL_X509_REVOKED* rev)
wolfSSL 0:1239e9b70ca2 9370 {
wolfSSL 0:1239e9b70ca2 9371 (void)rev;
wolfSSL 0:1239e9b70ca2 9372 return 0;
wolfSSL 0:1239e9b70ca2 9373 }
wolfSSL 0:1239e9b70ca2 9374
wolfSSL 0:1239e9b70ca2 9375
wolfSSL 0:1239e9b70ca2 9376 void* CyaSSL_sk_value(CYASSL_X509_REVOKED* rev, int i)
wolfSSL 0:1239e9b70ca2 9377 {
wolfSSL 0:1239e9b70ca2 9378 (void)rev;
wolfSSL 0:1239e9b70ca2 9379 (void)i;
wolfSSL 0:1239e9b70ca2 9380 return 0;
wolfSSL 0:1239e9b70ca2 9381 }
wolfSSL 0:1239e9b70ca2 9382
wolfSSL 0:1239e9b70ca2 9383
wolfSSL 0:1239e9b70ca2 9384 /* stunnel 4.28 needs */
wolfSSL 0:1239e9b70ca2 9385 void* CyaSSL_CTX_get_ex_data(const CYASSL_CTX* ctx, int d)
wolfSSL 0:1239e9b70ca2 9386 {
wolfSSL 0:1239e9b70ca2 9387 (void)ctx;
wolfSSL 0:1239e9b70ca2 9388 (void)d;
wolfSSL 0:1239e9b70ca2 9389 return 0;
wolfSSL 0:1239e9b70ca2 9390 }
wolfSSL 0:1239e9b70ca2 9391
wolfSSL 0:1239e9b70ca2 9392
wolfSSL 0:1239e9b70ca2 9393 int CyaSSL_CTX_set_ex_data(CYASSL_CTX* ctx, int d, void* p)
wolfSSL 0:1239e9b70ca2 9394 {
wolfSSL 0:1239e9b70ca2 9395 (void)ctx;
wolfSSL 0:1239e9b70ca2 9396 (void)d;
wolfSSL 0:1239e9b70ca2 9397 (void)p;
wolfSSL 0:1239e9b70ca2 9398 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 9399 }
wolfSSL 0:1239e9b70ca2 9400
wolfSSL 0:1239e9b70ca2 9401
wolfSSL 0:1239e9b70ca2 9402 void CyaSSL_CTX_sess_set_get_cb(CYASSL_CTX* ctx,
wolfSSL 0:1239e9b70ca2 9403 CYASSL_SESSION*(*f)(CYASSL*, unsigned char*, int, int*))
wolfSSL 0:1239e9b70ca2 9404 {
wolfSSL 0:1239e9b70ca2 9405 (void)ctx;
wolfSSL 0:1239e9b70ca2 9406 (void)f;
wolfSSL 0:1239e9b70ca2 9407 }
wolfSSL 0:1239e9b70ca2 9408
wolfSSL 0:1239e9b70ca2 9409
wolfSSL 0:1239e9b70ca2 9410 void CyaSSL_CTX_sess_set_new_cb(CYASSL_CTX* ctx,
wolfSSL 0:1239e9b70ca2 9411 int (*f)(CYASSL*, CYASSL_SESSION*))
wolfSSL 0:1239e9b70ca2 9412 {
wolfSSL 0:1239e9b70ca2 9413 (void)ctx;
wolfSSL 0:1239e9b70ca2 9414 (void)f;
wolfSSL 0:1239e9b70ca2 9415 }
wolfSSL 0:1239e9b70ca2 9416
wolfSSL 0:1239e9b70ca2 9417
wolfSSL 0:1239e9b70ca2 9418 void CyaSSL_CTX_sess_set_remove_cb(CYASSL_CTX* ctx, void (*f)(CYASSL_CTX*,
wolfSSL 0:1239e9b70ca2 9419 CYASSL_SESSION*))
wolfSSL 0:1239e9b70ca2 9420 {
wolfSSL 0:1239e9b70ca2 9421 (void)ctx;
wolfSSL 0:1239e9b70ca2 9422 (void)f;
wolfSSL 0:1239e9b70ca2 9423 }
wolfSSL 0:1239e9b70ca2 9424
wolfSSL 0:1239e9b70ca2 9425
wolfSSL 0:1239e9b70ca2 9426 int CyaSSL_i2d_SSL_SESSION(CYASSL_SESSION* sess, unsigned char** p)
wolfSSL 0:1239e9b70ca2 9427 {
wolfSSL 0:1239e9b70ca2 9428 (void)sess;
wolfSSL 0:1239e9b70ca2 9429 (void)p;
wolfSSL 0:1239e9b70ca2 9430 return sizeof(CYASSL_SESSION);
wolfSSL 0:1239e9b70ca2 9431 }
wolfSSL 0:1239e9b70ca2 9432
wolfSSL 0:1239e9b70ca2 9433
wolfSSL 0:1239e9b70ca2 9434 CYASSL_SESSION* CyaSSL_d2i_SSL_SESSION(CYASSL_SESSION** sess,
wolfSSL 0:1239e9b70ca2 9435 const unsigned char** p, long i)
wolfSSL 0:1239e9b70ca2 9436 {
wolfSSL 0:1239e9b70ca2 9437 (void)p;
wolfSSL 0:1239e9b70ca2 9438 (void)i;
wolfSSL 0:1239e9b70ca2 9439 if (sess)
wolfSSL 0:1239e9b70ca2 9440 return *sess;
wolfSSL 0:1239e9b70ca2 9441 return NULL;
wolfSSL 0:1239e9b70ca2 9442 }
wolfSSL 0:1239e9b70ca2 9443
wolfSSL 0:1239e9b70ca2 9444
wolfSSL 0:1239e9b70ca2 9445 long CyaSSL_SESSION_get_timeout(const CYASSL_SESSION* sess)
wolfSSL 0:1239e9b70ca2 9446 {
wolfSSL 0:1239e9b70ca2 9447 CYASSL_ENTER("CyaSSL_SESSION_get_timeout");
wolfSSL 0:1239e9b70ca2 9448 return sess->timeout;
wolfSSL 0:1239e9b70ca2 9449 }
wolfSSL 0:1239e9b70ca2 9450
wolfSSL 0:1239e9b70ca2 9451
wolfSSL 0:1239e9b70ca2 9452 long CyaSSL_SESSION_get_time(const CYASSL_SESSION* sess)
wolfSSL 0:1239e9b70ca2 9453 {
wolfSSL 0:1239e9b70ca2 9454 CYASSL_ENTER("CyaSSL_SESSION_get_time");
wolfSSL 0:1239e9b70ca2 9455 return sess->bornOn;
wolfSSL 0:1239e9b70ca2 9456 }
wolfSSL 0:1239e9b70ca2 9457
wolfSSL 0:1239e9b70ca2 9458
wolfSSL 0:1239e9b70ca2 9459 int CyaSSL_CTX_get_ex_new_index(long idx, void* arg, void* a, void* b,
wolfSSL 0:1239e9b70ca2 9460 void* c)
wolfSSL 0:1239e9b70ca2 9461 {
wolfSSL 0:1239e9b70ca2 9462 (void)idx;
wolfSSL 0:1239e9b70ca2 9463 (void)arg;
wolfSSL 0:1239e9b70ca2 9464 (void)a;
wolfSSL 0:1239e9b70ca2 9465 (void)b;
wolfSSL 0:1239e9b70ca2 9466 (void)c;
wolfSSL 0:1239e9b70ca2 9467 return 0;
wolfSSL 0:1239e9b70ca2 9468 }
wolfSSL 0:1239e9b70ca2 9469
wolfSSL 0:1239e9b70ca2 9470 #endif /* OPENSSL_EXTRA */
wolfSSL 0:1239e9b70ca2 9471
wolfSSL 0:1239e9b70ca2 9472
wolfSSL 0:1239e9b70ca2 9473 #ifdef KEEP_PEER_CERT
wolfSSL 0:1239e9b70ca2 9474 char* CyaSSL_X509_get_subjectCN(CYASSL_X509* x509)
wolfSSL 0:1239e9b70ca2 9475 {
wolfSSL 0:1239e9b70ca2 9476 if (x509 == NULL)
wolfSSL 0:1239e9b70ca2 9477 return NULL;
wolfSSL 0:1239e9b70ca2 9478
wolfSSL 0:1239e9b70ca2 9479 return x509->subjectCN;
wolfSSL 0:1239e9b70ca2 9480 }
wolfSSL 0:1239e9b70ca2 9481 #endif /* KEEP_PEER_CERT */
wolfSSL 0:1239e9b70ca2 9482
wolfSSL 0:1239e9b70ca2 9483 #ifdef OPENSSL_EXTRA
wolfSSL 0:1239e9b70ca2 9484
wolfSSL 0:1239e9b70ca2 9485 #ifdef FORTRESS
wolfSSL 0:1239e9b70ca2 9486 int CyaSSL_cmp_peer_cert_to_file(CYASSL* ssl, const char *fname)
wolfSSL 0:1239e9b70ca2 9487 {
wolfSSL 0:1239e9b70ca2 9488 int ret = SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 9489
wolfSSL 0:1239e9b70ca2 9490 CYASSL_ENTER("CyaSSL_cmp_peer_cert_to_file");
wolfSSL 0:1239e9b70ca2 9491 if (ssl != NULL && fname != NULL)
wolfSSL 0:1239e9b70ca2 9492 {
wolfSSL 0:1239e9b70ca2 9493 XFILE file = XBADFILE;
wolfSSL 0:1239e9b70ca2 9494 long sz = 0;
wolfSSL 0:1239e9b70ca2 9495 byte staticBuffer[FILE_BUFFER_SIZE];
wolfSSL 0:1239e9b70ca2 9496 byte* myBuffer = staticBuffer;
wolfSSL 0:1239e9b70ca2 9497 CYASSL_CTX* ctx = ssl->ctx;
wolfSSL 0:1239e9b70ca2 9498 EncryptedInfo info;
wolfSSL 0:1239e9b70ca2 9499 buffer fileDer;
wolfSSL 0:1239e9b70ca2 9500 int eccKey = 0;
wolfSSL 0:1239e9b70ca2 9501 CYASSL_X509* peer_cert = &ssl->peerCert;
wolfSSL 0:1239e9b70ca2 9502
wolfSSL 0:1239e9b70ca2 9503 info.set = 0;
wolfSSL 0:1239e9b70ca2 9504 info.ctx = ctx;
wolfSSL 0:1239e9b70ca2 9505 info.consumed = 0;
wolfSSL 0:1239e9b70ca2 9506 fileDer.buffer = 0;
wolfSSL 0:1239e9b70ca2 9507
wolfSSL 0:1239e9b70ca2 9508 file = XFOPEN(fname, "rb");
wolfSSL 0:1239e9b70ca2 9509 if (file == XBADFILE) return SSL_BAD_FILE;
wolfSSL 0:1239e9b70ca2 9510 XFSEEK(file, 0, XSEEK_END);
wolfSSL 0:1239e9b70ca2 9511 sz = XFTELL(file);
wolfSSL 0:1239e9b70ca2 9512 XREWIND(file);
wolfSSL 0:1239e9b70ca2 9513 if (sz > (long)sizeof(staticBuffer)) {
wolfSSL 0:1239e9b70ca2 9514 CYASSL_MSG("Getting dynamic buffer");
wolfSSL 0:1239e9b70ca2 9515 myBuffer = (byte*) XMALLOC(sz, ctx->heap, DYNAMIC_TYPE_FILE);
wolfSSL 0:1239e9b70ca2 9516 }
wolfSSL 0:1239e9b70ca2 9517
wolfSSL 0:1239e9b70ca2 9518 if ((myBuffer != NULL) &&
wolfSSL 0:1239e9b70ca2 9519 (sz > 0) &&
wolfSSL 0:1239e9b70ca2 9520 (XFREAD(myBuffer, sz, 1, file) > 0) &&
wolfSSL 0:1239e9b70ca2 9521 (PemToDer(myBuffer, sz, CERT_TYPE,
wolfSSL 0:1239e9b70ca2 9522 &fileDer, ctx->heap, &info, &eccKey) == 0) &&
wolfSSL 0:1239e9b70ca2 9523 (fileDer.length != 0) &&
wolfSSL 0:1239e9b70ca2 9524 (fileDer.length == peer_cert->derCert.length) &&
wolfSSL 0:1239e9b70ca2 9525 (XMEMCMP(peer_cert->derCert.buffer, fileDer.buffer,
wolfSSL 0:1239e9b70ca2 9526 fileDer.length) == 0))
wolfSSL 0:1239e9b70ca2 9527 {
wolfSSL 0:1239e9b70ca2 9528 ret = 0;
wolfSSL 0:1239e9b70ca2 9529 }
wolfSSL 0:1239e9b70ca2 9530
wolfSSL 0:1239e9b70ca2 9531 XFCLOSE(file);
wolfSSL 0:1239e9b70ca2 9532 if (fileDer.buffer)
wolfSSL 0:1239e9b70ca2 9533 XFREE(fileDer.buffer, ctx->heap, DYNAMIC_TYPE_CERT);
wolfSSL 0:1239e9b70ca2 9534 if (myBuffer && (myBuffer != staticBuffer))
wolfSSL 0:1239e9b70ca2 9535 XFREE(myBuffer, ctx->heap, DYNAMIC_TYPE_FILE);
wolfSSL 0:1239e9b70ca2 9536 }
wolfSSL 0:1239e9b70ca2 9537
wolfSSL 0:1239e9b70ca2 9538 return ret;
wolfSSL 0:1239e9b70ca2 9539 }
wolfSSL 0:1239e9b70ca2 9540 #endif
wolfSSL 0:1239e9b70ca2 9541
wolfSSL 0:1239e9b70ca2 9542
wolfSSL 0:1239e9b70ca2 9543 static RNG globalRNG;
wolfSSL 0:1239e9b70ca2 9544 static int initGlobalRNG = 0;
wolfSSL 0:1239e9b70ca2 9545
wolfSSL 0:1239e9b70ca2 9546 /* SSL_SUCCESS on ok */
wolfSSL 0:1239e9b70ca2 9547 int CyaSSL_RAND_seed(const void* seed, int len)
wolfSSL 0:1239e9b70ca2 9548 {
wolfSSL 0:1239e9b70ca2 9549
wolfSSL 0:1239e9b70ca2 9550 CYASSL_MSG("CyaSSL_RAND_seed");
wolfSSL 0:1239e9b70ca2 9551
wolfSSL 0:1239e9b70ca2 9552 (void)seed;
wolfSSL 0:1239e9b70ca2 9553 (void)len;
wolfSSL 0:1239e9b70ca2 9554
wolfSSL 0:1239e9b70ca2 9555 if (initGlobalRNG == 0) {
wolfSSL 0:1239e9b70ca2 9556 if (InitRng(&globalRNG) < 0) {
wolfSSL 0:1239e9b70ca2 9557 CYASSL_MSG("CyaSSL Init Global RNG failed");
wolfSSL 0:1239e9b70ca2 9558 return 0;
wolfSSL 0:1239e9b70ca2 9559 }
wolfSSL 0:1239e9b70ca2 9560 initGlobalRNG = 1;
wolfSSL 0:1239e9b70ca2 9561 }
wolfSSL 0:1239e9b70ca2 9562
wolfSSL 0:1239e9b70ca2 9563 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 9564 }
wolfSSL 0:1239e9b70ca2 9565
wolfSSL 0:1239e9b70ca2 9566
wolfSSL 0:1239e9b70ca2 9567 /* SSL_SUCCESS on ok */
wolfSSL 0:1239e9b70ca2 9568 int CyaSSL_RAND_bytes(unsigned char* buf, int num)
wolfSSL 0:1239e9b70ca2 9569 {
wolfSSL 0:1239e9b70ca2 9570 RNG tmpRNG;
wolfSSL 0:1239e9b70ca2 9571 RNG* rng = &tmpRNG;
wolfSSL 0:1239e9b70ca2 9572
wolfSSL 0:1239e9b70ca2 9573 CYASSL_ENTER("RAND_bytes");
wolfSSL 0:1239e9b70ca2 9574 if (InitRng(&tmpRNG) != 0) {
wolfSSL 0:1239e9b70ca2 9575 CYASSL_MSG("Bad RNG Init, trying global");
wolfSSL 0:1239e9b70ca2 9576 if (initGlobalRNG == 0) {
wolfSSL 0:1239e9b70ca2 9577 CYASSL_MSG("Global RNG no Init");
wolfSSL 0:1239e9b70ca2 9578 return 0;
wolfSSL 0:1239e9b70ca2 9579 }
wolfSSL 0:1239e9b70ca2 9580 rng = &globalRNG;
wolfSSL 0:1239e9b70ca2 9581 }
wolfSSL 0:1239e9b70ca2 9582
wolfSSL 0:1239e9b70ca2 9583 if (RNG_GenerateBlock(rng, buf, num) != 0) {
wolfSSL 0:1239e9b70ca2 9584 CYASSL_MSG("Bad RNG_GenerateBlock");
wolfSSL 0:1239e9b70ca2 9585 return 0;
wolfSSL 0:1239e9b70ca2 9586 }
wolfSSL 0:1239e9b70ca2 9587
wolfSSL 0:1239e9b70ca2 9588 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 9589 }
wolfSSL 0:1239e9b70ca2 9590
wolfSSL 0:1239e9b70ca2 9591 CYASSL_BN_CTX* CyaSSL_BN_CTX_new(void)
wolfSSL 0:1239e9b70ca2 9592 {
wolfSSL 0:1239e9b70ca2 9593 static int ctx; /* ctaocrypt doesn't now need ctx */
wolfSSL 0:1239e9b70ca2 9594
wolfSSL 0:1239e9b70ca2 9595 CYASSL_MSG("CyaSSL_BN_CTX_new");
wolfSSL 0:1239e9b70ca2 9596
wolfSSL 0:1239e9b70ca2 9597 return (CYASSL_BN_CTX*)&ctx;
wolfSSL 0:1239e9b70ca2 9598 }
wolfSSL 0:1239e9b70ca2 9599
wolfSSL 0:1239e9b70ca2 9600 void CyaSSL_BN_CTX_init(CYASSL_BN_CTX* ctx)
wolfSSL 0:1239e9b70ca2 9601 {
wolfSSL 0:1239e9b70ca2 9602 (void)ctx;
wolfSSL 0:1239e9b70ca2 9603 CYASSL_MSG("CyaSSL_BN_CTX_init");
wolfSSL 0:1239e9b70ca2 9604 }
wolfSSL 0:1239e9b70ca2 9605
wolfSSL 0:1239e9b70ca2 9606
wolfSSL 0:1239e9b70ca2 9607 void CyaSSL_BN_CTX_free(CYASSL_BN_CTX* ctx)
wolfSSL 0:1239e9b70ca2 9608 {
wolfSSL 0:1239e9b70ca2 9609 (void)ctx;
wolfSSL 0:1239e9b70ca2 9610 CYASSL_MSG("CyaSSL_BN_CTX_free");
wolfSSL 0:1239e9b70ca2 9611
wolfSSL 0:1239e9b70ca2 9612 /* do free since static ctx that does nothing */
wolfSSL 0:1239e9b70ca2 9613 }
wolfSSL 0:1239e9b70ca2 9614
wolfSSL 0:1239e9b70ca2 9615
wolfSSL 0:1239e9b70ca2 9616 static void InitCyaSSL_BigNum(CYASSL_BIGNUM* bn)
wolfSSL 0:1239e9b70ca2 9617 {
wolfSSL 0:1239e9b70ca2 9618 CYASSL_MSG("InitCyaSSL_BigNum");
wolfSSL 0:1239e9b70ca2 9619 if (bn) {
wolfSSL 0:1239e9b70ca2 9620 bn->neg = 0;
wolfSSL 0:1239e9b70ca2 9621 bn->internal = NULL;
wolfSSL 0:1239e9b70ca2 9622 }
wolfSSL 0:1239e9b70ca2 9623 }
wolfSSL 0:1239e9b70ca2 9624
wolfSSL 0:1239e9b70ca2 9625
wolfSSL 0:1239e9b70ca2 9626 CYASSL_BIGNUM* CyaSSL_BN_new(void)
wolfSSL 0:1239e9b70ca2 9627 {
wolfSSL 0:1239e9b70ca2 9628 CYASSL_BIGNUM* external;
wolfSSL 0:1239e9b70ca2 9629 mp_int* mpi;
wolfSSL 0:1239e9b70ca2 9630
wolfSSL 0:1239e9b70ca2 9631 CYASSL_MSG("CyaSSL_BN_new");
wolfSSL 0:1239e9b70ca2 9632
wolfSSL 0:1239e9b70ca2 9633 mpi = (mp_int*) XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_BIGINT);
wolfSSL 0:1239e9b70ca2 9634 if (mpi == NULL) {
wolfSSL 0:1239e9b70ca2 9635 CYASSL_MSG("CyaSSL_BN_new malloc mpi failure");
wolfSSL 0:1239e9b70ca2 9636 return NULL;
wolfSSL 0:1239e9b70ca2 9637 }
wolfSSL 0:1239e9b70ca2 9638
wolfSSL 0:1239e9b70ca2 9639 external = (CYASSL_BIGNUM*) XMALLOC(sizeof(CYASSL_BIGNUM), NULL,
wolfSSL 0:1239e9b70ca2 9640 DYNAMIC_TYPE_BIGINT);
wolfSSL 0:1239e9b70ca2 9641 if (external == NULL) {
wolfSSL 0:1239e9b70ca2 9642 CYASSL_MSG("CyaSSL_BN_new malloc CYASSL_BIGNUM failure");
wolfSSL 0:1239e9b70ca2 9643 XFREE(mpi, NULL, DYNAMIC_TYPE_BIGINT);
wolfSSL 0:1239e9b70ca2 9644 return NULL;
wolfSSL 0:1239e9b70ca2 9645 }
wolfSSL 0:1239e9b70ca2 9646
wolfSSL 0:1239e9b70ca2 9647 InitCyaSSL_BigNum(external);
wolfSSL 0:1239e9b70ca2 9648 external->internal = mpi;
wolfSSL 0:1239e9b70ca2 9649 if (mp_init(mpi) != MP_OKAY) {
wolfSSL 0:1239e9b70ca2 9650 CyaSSL_BN_free(external);
wolfSSL 0:1239e9b70ca2 9651 return NULL;
wolfSSL 0:1239e9b70ca2 9652 }
wolfSSL 0:1239e9b70ca2 9653
wolfSSL 0:1239e9b70ca2 9654 return external;
wolfSSL 0:1239e9b70ca2 9655 }
wolfSSL 0:1239e9b70ca2 9656
wolfSSL 0:1239e9b70ca2 9657
wolfSSL 0:1239e9b70ca2 9658 void CyaSSL_BN_free(CYASSL_BIGNUM* bn)
wolfSSL 0:1239e9b70ca2 9659 {
wolfSSL 0:1239e9b70ca2 9660 CYASSL_MSG("CyaSSL_BN_free");
wolfSSL 0:1239e9b70ca2 9661 if (bn) {
wolfSSL 0:1239e9b70ca2 9662 if (bn->internal) {
wolfSSL 0:1239e9b70ca2 9663 mp_clear((mp_int*)bn->internal);
wolfSSL 0:1239e9b70ca2 9664 XFREE(bn->internal, NULL, DYNAMIC_TYPE_BIGINT);
wolfSSL 0:1239e9b70ca2 9665 bn->internal = NULL;
wolfSSL 0:1239e9b70ca2 9666 }
wolfSSL 0:1239e9b70ca2 9667 XFREE(bn, NULL, DYNAMIC_TYPE_BIGINT);
wolfSSL 0:1239e9b70ca2 9668 }
wolfSSL 0:1239e9b70ca2 9669 }
wolfSSL 0:1239e9b70ca2 9670
wolfSSL 0:1239e9b70ca2 9671
wolfSSL 0:1239e9b70ca2 9672 void CyaSSL_BN_clear_free(CYASSL_BIGNUM* bn)
wolfSSL 0:1239e9b70ca2 9673 {
wolfSSL 0:1239e9b70ca2 9674 CYASSL_MSG("CyaSSL_BN_clear_free");
wolfSSL 0:1239e9b70ca2 9675
wolfSSL 0:1239e9b70ca2 9676 CyaSSL_BN_free(bn);
wolfSSL 0:1239e9b70ca2 9677 }
wolfSSL 0:1239e9b70ca2 9678
wolfSSL 0:1239e9b70ca2 9679
wolfSSL 0:1239e9b70ca2 9680 /* SSL_SUCCESS on ok */
wolfSSL 0:1239e9b70ca2 9681 int CyaSSL_BN_sub(CYASSL_BIGNUM* r, const CYASSL_BIGNUM* a,
wolfSSL 0:1239e9b70ca2 9682 const CYASSL_BIGNUM* b)
wolfSSL 0:1239e9b70ca2 9683 {
wolfSSL 0:1239e9b70ca2 9684 CYASSL_MSG("CyaSSL_BN_sub");
wolfSSL 0:1239e9b70ca2 9685
wolfSSL 0:1239e9b70ca2 9686 if (r == NULL || a == NULL || b == NULL)
wolfSSL 0:1239e9b70ca2 9687 return 0;
wolfSSL 0:1239e9b70ca2 9688
wolfSSL 0:1239e9b70ca2 9689 if (mp_sub((mp_int*)a->internal,(mp_int*)b->internal,
wolfSSL 0:1239e9b70ca2 9690 (mp_int*)r->internal) == MP_OKAY)
wolfSSL 0:1239e9b70ca2 9691 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 9692
wolfSSL 0:1239e9b70ca2 9693 CYASSL_MSG("CyaSSL_BN_sub mp_sub failed");
wolfSSL 0:1239e9b70ca2 9694 return 0;
wolfSSL 0:1239e9b70ca2 9695 }
wolfSSL 0:1239e9b70ca2 9696
wolfSSL 0:1239e9b70ca2 9697
wolfSSL 0:1239e9b70ca2 9698 /* SSL_SUCCESS on ok */
wolfSSL 0:1239e9b70ca2 9699 int CyaSSL_BN_mod(CYASSL_BIGNUM* r, const CYASSL_BIGNUM* a,
wolfSSL 0:1239e9b70ca2 9700 const CYASSL_BIGNUM* b, const CYASSL_BN_CTX* c)
wolfSSL 0:1239e9b70ca2 9701 {
wolfSSL 0:1239e9b70ca2 9702 (void)c;
wolfSSL 0:1239e9b70ca2 9703 CYASSL_MSG("CyaSSL_BN_mod");
wolfSSL 0:1239e9b70ca2 9704
wolfSSL 0:1239e9b70ca2 9705 if (r == NULL || a == NULL || b == NULL)
wolfSSL 0:1239e9b70ca2 9706 return 0;
wolfSSL 0:1239e9b70ca2 9707
wolfSSL 0:1239e9b70ca2 9708 if (mp_mod((mp_int*)a->internal,(mp_int*)b->internal,
wolfSSL 0:1239e9b70ca2 9709 (mp_int*)r->internal) == MP_OKAY)
wolfSSL 0:1239e9b70ca2 9710 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 9711
wolfSSL 0:1239e9b70ca2 9712 CYASSL_MSG("CyaSSL_BN_mod mp_mod failed");
wolfSSL 0:1239e9b70ca2 9713 return 0;
wolfSSL 0:1239e9b70ca2 9714 }
wolfSSL 0:1239e9b70ca2 9715
wolfSSL 0:1239e9b70ca2 9716
wolfSSL 0:1239e9b70ca2 9717 const CYASSL_BIGNUM* CyaSSL_BN_value_one(void)
wolfSSL 0:1239e9b70ca2 9718 {
wolfSSL 0:1239e9b70ca2 9719 static CYASSL_BIGNUM* bn_one = NULL;
wolfSSL 0:1239e9b70ca2 9720
wolfSSL 0:1239e9b70ca2 9721 CYASSL_MSG("CyaSSL_BN_value_one");
wolfSSL 0:1239e9b70ca2 9722
wolfSSL 0:1239e9b70ca2 9723 if (bn_one == NULL) {
wolfSSL 0:1239e9b70ca2 9724 bn_one = CyaSSL_BN_new();
wolfSSL 0:1239e9b70ca2 9725 if (bn_one)
wolfSSL 0:1239e9b70ca2 9726 mp_set_int((mp_int*)bn_one->internal, 1);
wolfSSL 0:1239e9b70ca2 9727 }
wolfSSL 0:1239e9b70ca2 9728
wolfSSL 0:1239e9b70ca2 9729 return bn_one;
wolfSSL 0:1239e9b70ca2 9730 }
wolfSSL 0:1239e9b70ca2 9731
wolfSSL 0:1239e9b70ca2 9732
wolfSSL 0:1239e9b70ca2 9733 int CyaSSL_BN_num_bytes(const CYASSL_BIGNUM* bn)
wolfSSL 0:1239e9b70ca2 9734 {
wolfSSL 0:1239e9b70ca2 9735 CYASSL_MSG("CyaSSL_BN_num_bytes");
wolfSSL 0:1239e9b70ca2 9736
wolfSSL 0:1239e9b70ca2 9737 if (bn == NULL || bn->internal == NULL)
wolfSSL 0:1239e9b70ca2 9738 return 0;
wolfSSL 0:1239e9b70ca2 9739
wolfSSL 0:1239e9b70ca2 9740 return mp_unsigned_bin_size((mp_int*)bn->internal);
wolfSSL 0:1239e9b70ca2 9741 }
wolfSSL 0:1239e9b70ca2 9742
wolfSSL 0:1239e9b70ca2 9743
wolfSSL 0:1239e9b70ca2 9744 int CyaSSL_BN_num_bits(const CYASSL_BIGNUM* bn)
wolfSSL 0:1239e9b70ca2 9745 {
wolfSSL 0:1239e9b70ca2 9746 CYASSL_MSG("CyaSSL_BN_num_bits");
wolfSSL 0:1239e9b70ca2 9747
wolfSSL 0:1239e9b70ca2 9748 if (bn == NULL || bn->internal == NULL)
wolfSSL 0:1239e9b70ca2 9749 return 0;
wolfSSL 0:1239e9b70ca2 9750
wolfSSL 0:1239e9b70ca2 9751 return mp_count_bits((mp_int*)bn->internal);
wolfSSL 0:1239e9b70ca2 9752 }
wolfSSL 0:1239e9b70ca2 9753
wolfSSL 0:1239e9b70ca2 9754
wolfSSL 0:1239e9b70ca2 9755 int CyaSSL_BN_is_zero(const CYASSL_BIGNUM* bn)
wolfSSL 0:1239e9b70ca2 9756 {
wolfSSL 0:1239e9b70ca2 9757 CYASSL_MSG("CyaSSL_BN_is_zero");
wolfSSL 0:1239e9b70ca2 9758
wolfSSL 0:1239e9b70ca2 9759 if (bn == NULL || bn->internal == NULL)
wolfSSL 0:1239e9b70ca2 9760 return 0;
wolfSSL 0:1239e9b70ca2 9761
wolfSSL 0:1239e9b70ca2 9762 return mp_iszero((mp_int*)bn->internal);
wolfSSL 0:1239e9b70ca2 9763 }
wolfSSL 0:1239e9b70ca2 9764
wolfSSL 0:1239e9b70ca2 9765
wolfSSL 0:1239e9b70ca2 9766 int CyaSSL_BN_is_one(const CYASSL_BIGNUM* bn)
wolfSSL 0:1239e9b70ca2 9767 {
wolfSSL 0:1239e9b70ca2 9768 CYASSL_MSG("CyaSSL_BN_is_one");
wolfSSL 0:1239e9b70ca2 9769
wolfSSL 0:1239e9b70ca2 9770 if (bn == NULL || bn->internal == NULL)
wolfSSL 0:1239e9b70ca2 9771 return 0;
wolfSSL 0:1239e9b70ca2 9772
wolfSSL 0:1239e9b70ca2 9773 if (mp_cmp_d((mp_int*)bn->internal, 1) == 0)
wolfSSL 0:1239e9b70ca2 9774 return 1;
wolfSSL 0:1239e9b70ca2 9775
wolfSSL 0:1239e9b70ca2 9776 return 0;
wolfSSL 0:1239e9b70ca2 9777 }
wolfSSL 0:1239e9b70ca2 9778
wolfSSL 0:1239e9b70ca2 9779
wolfSSL 0:1239e9b70ca2 9780 int CyaSSL_BN_is_odd(const CYASSL_BIGNUM* bn)
wolfSSL 0:1239e9b70ca2 9781 {
wolfSSL 0:1239e9b70ca2 9782 CYASSL_MSG("CyaSSL_BN_is_odd");
wolfSSL 0:1239e9b70ca2 9783
wolfSSL 0:1239e9b70ca2 9784 if (bn == NULL || bn->internal == NULL)
wolfSSL 0:1239e9b70ca2 9785 return 0;
wolfSSL 0:1239e9b70ca2 9786
wolfSSL 0:1239e9b70ca2 9787 return mp_isodd((mp_int*)bn->internal);
wolfSSL 0:1239e9b70ca2 9788 }
wolfSSL 0:1239e9b70ca2 9789
wolfSSL 0:1239e9b70ca2 9790
wolfSSL 0:1239e9b70ca2 9791 int CyaSSL_BN_cmp(const CYASSL_BIGNUM* a, const CYASSL_BIGNUM* b)
wolfSSL 0:1239e9b70ca2 9792 {
wolfSSL 0:1239e9b70ca2 9793 CYASSL_MSG("CyaSSL_BN_cmp");
wolfSSL 0:1239e9b70ca2 9794
wolfSSL 0:1239e9b70ca2 9795 if (a == NULL || a->internal == NULL || b == NULL || b->internal ==NULL)
wolfSSL 0:1239e9b70ca2 9796 return 0;
wolfSSL 0:1239e9b70ca2 9797
wolfSSL 0:1239e9b70ca2 9798 return mp_cmp((mp_int*)a->internal, (mp_int*)b->internal);
wolfSSL 0:1239e9b70ca2 9799 }
wolfSSL 0:1239e9b70ca2 9800
wolfSSL 0:1239e9b70ca2 9801
wolfSSL 0:1239e9b70ca2 9802 int CyaSSL_BN_bn2bin(const CYASSL_BIGNUM* bn, unsigned char* r)
wolfSSL 0:1239e9b70ca2 9803 {
wolfSSL 0:1239e9b70ca2 9804 CYASSL_MSG("CyaSSL_BN_bn2bin");
wolfSSL 0:1239e9b70ca2 9805
wolfSSL 0:1239e9b70ca2 9806 if (bn == NULL || bn->internal == NULL) {
wolfSSL 0:1239e9b70ca2 9807 CYASSL_MSG("NULL bn error");
wolfSSL 0:1239e9b70ca2 9808 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 9809 }
wolfSSL 0:1239e9b70ca2 9810
wolfSSL 0:1239e9b70ca2 9811 if (r == NULL)
wolfSSL 0:1239e9b70ca2 9812 return mp_unsigned_bin_size((mp_int*)bn->internal);
wolfSSL 0:1239e9b70ca2 9813
wolfSSL 0:1239e9b70ca2 9814 if (mp_to_unsigned_bin((mp_int*)bn->internal, r) != MP_OKAY) {
wolfSSL 0:1239e9b70ca2 9815 CYASSL_MSG("mp_to_unsigned_bin error");
wolfSSL 0:1239e9b70ca2 9816 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 9817 }
wolfSSL 0:1239e9b70ca2 9818
wolfSSL 0:1239e9b70ca2 9819 return mp_unsigned_bin_size((mp_int*)bn->internal);
wolfSSL 0:1239e9b70ca2 9820 }
wolfSSL 0:1239e9b70ca2 9821
wolfSSL 0:1239e9b70ca2 9822
wolfSSL 0:1239e9b70ca2 9823 CYASSL_BIGNUM* CyaSSL_BN_bin2bn(const unsigned char* str, int len,
wolfSSL 0:1239e9b70ca2 9824 CYASSL_BIGNUM* ret)
wolfSSL 0:1239e9b70ca2 9825 {
wolfSSL 0:1239e9b70ca2 9826 CYASSL_MSG("CyaSSL_BN_bin2bn");
wolfSSL 0:1239e9b70ca2 9827
wolfSSL 0:1239e9b70ca2 9828 if (ret && ret->internal) {
wolfSSL 0:1239e9b70ca2 9829 if (mp_read_unsigned_bin((mp_int*)ret->internal, str, len) != 0) {
wolfSSL 0:1239e9b70ca2 9830 CYASSL_MSG("mp_read_unsigned_bin failure");
wolfSSL 0:1239e9b70ca2 9831 return NULL;
wolfSSL 0:1239e9b70ca2 9832 }
wolfSSL 0:1239e9b70ca2 9833 }
wolfSSL 0:1239e9b70ca2 9834 else {
wolfSSL 0:1239e9b70ca2 9835 CYASSL_MSG("CyaSSL_BN_bin2bn wants return bignum");
wolfSSL 0:1239e9b70ca2 9836 }
wolfSSL 0:1239e9b70ca2 9837
wolfSSL 0:1239e9b70ca2 9838 return ret;
wolfSSL 0:1239e9b70ca2 9839 }
wolfSSL 0:1239e9b70ca2 9840
wolfSSL 0:1239e9b70ca2 9841
wolfSSL 0:1239e9b70ca2 9842 int CyaSSL_mask_bits(CYASSL_BIGNUM* bn, int n)
wolfSSL 0:1239e9b70ca2 9843 {
wolfSSL 0:1239e9b70ca2 9844 (void)bn;
wolfSSL 0:1239e9b70ca2 9845 (void)n;
wolfSSL 0:1239e9b70ca2 9846 CYASSL_MSG("CyaSSL_BN_mask_bits");
wolfSSL 0:1239e9b70ca2 9847
wolfSSL 0:1239e9b70ca2 9848 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 9849 }
wolfSSL 0:1239e9b70ca2 9850
wolfSSL 0:1239e9b70ca2 9851
wolfSSL 0:1239e9b70ca2 9852 /* SSL_SUCCESS on ok */
wolfSSL 0:1239e9b70ca2 9853 int CyaSSL_BN_rand(CYASSL_BIGNUM* bn, int bits, int top, int bottom)
wolfSSL 0:1239e9b70ca2 9854 {
wolfSSL 0:1239e9b70ca2 9855 byte buff[1024];
wolfSSL 0:1239e9b70ca2 9856 RNG tmpRNG;
wolfSSL 0:1239e9b70ca2 9857 RNG* rng = &tmpRNG;
wolfSSL 0:1239e9b70ca2 9858 int len = bits/8;
wolfSSL 0:1239e9b70ca2 9859
wolfSSL 0:1239e9b70ca2 9860 (void)top;
wolfSSL 0:1239e9b70ca2 9861 (void)bottom;
wolfSSL 0:1239e9b70ca2 9862 CYASSL_MSG("CyaSSL_BN_rand");
wolfSSL 0:1239e9b70ca2 9863
wolfSSL 0:1239e9b70ca2 9864 if (bn == NULL || bn->internal == NULL) {
wolfSSL 0:1239e9b70ca2 9865 CYASSL_MSG("Bad function arguments");
wolfSSL 0:1239e9b70ca2 9866 return 0;
wolfSSL 0:1239e9b70ca2 9867 }
wolfSSL 0:1239e9b70ca2 9868
wolfSSL 0:1239e9b70ca2 9869 if (bits % 8)
wolfSSL 0:1239e9b70ca2 9870 len++;
wolfSSL 0:1239e9b70ca2 9871
wolfSSL 0:1239e9b70ca2 9872 if ( (InitRng(&tmpRNG)) != 0) {
wolfSSL 0:1239e9b70ca2 9873 CYASSL_MSG("Bad RNG Init, trying global");
wolfSSL 0:1239e9b70ca2 9874 if (initGlobalRNG == 0) {
wolfSSL 0:1239e9b70ca2 9875 CYASSL_MSG("Global RNG no Init");
wolfSSL 0:1239e9b70ca2 9876 return 0;
wolfSSL 0:1239e9b70ca2 9877 }
wolfSSL 0:1239e9b70ca2 9878 rng = &globalRNG;
wolfSSL 0:1239e9b70ca2 9879 }
wolfSSL 0:1239e9b70ca2 9880
wolfSSL 0:1239e9b70ca2 9881 if (RNG_GenerateBlock(rng, buff, len) != 0) {
wolfSSL 0:1239e9b70ca2 9882 CYASSL_MSG("Bad RNG_GenerateBlock");
wolfSSL 0:1239e9b70ca2 9883 return 0;
wolfSSL 0:1239e9b70ca2 9884 }
wolfSSL 0:1239e9b70ca2 9885
wolfSSL 0:1239e9b70ca2 9886 buff[0] |= 0x80 | 0x40;
wolfSSL 0:1239e9b70ca2 9887 buff[len-1] |= 0x01;
wolfSSL 0:1239e9b70ca2 9888
wolfSSL 0:1239e9b70ca2 9889 if (mp_read_unsigned_bin((mp_int*)bn->internal,buff,len) != MP_OKAY) {
wolfSSL 0:1239e9b70ca2 9890 CYASSL_MSG("mp read bin failed");
wolfSSL 0:1239e9b70ca2 9891 return 0;
wolfSSL 0:1239e9b70ca2 9892 }
wolfSSL 0:1239e9b70ca2 9893
wolfSSL 0:1239e9b70ca2 9894 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 9895 }
wolfSSL 0:1239e9b70ca2 9896
wolfSSL 0:1239e9b70ca2 9897
wolfSSL 0:1239e9b70ca2 9898 int CyaSSL_BN_is_bit_set(const CYASSL_BIGNUM* bn, int n)
wolfSSL 0:1239e9b70ca2 9899 {
wolfSSL 0:1239e9b70ca2 9900 (void)bn;
wolfSSL 0:1239e9b70ca2 9901 (void)n;
wolfSSL 0:1239e9b70ca2 9902
wolfSSL 0:1239e9b70ca2 9903 CYASSL_MSG("CyaSSL_BN_is_bit_set");
wolfSSL 0:1239e9b70ca2 9904
wolfSSL 0:1239e9b70ca2 9905 return 0;
wolfSSL 0:1239e9b70ca2 9906 }
wolfSSL 0:1239e9b70ca2 9907
wolfSSL 0:1239e9b70ca2 9908
wolfSSL 0:1239e9b70ca2 9909 /* SSL_SUCCESS on ok */
wolfSSL 0:1239e9b70ca2 9910 int CyaSSL_BN_hex2bn(CYASSL_BIGNUM** bn, const char* str)
wolfSSL 0:1239e9b70ca2 9911 {
wolfSSL 0:1239e9b70ca2 9912 byte decoded[1024];
wolfSSL 0:1239e9b70ca2 9913 word32 decSz = sizeof(decoded);
wolfSSL 0:1239e9b70ca2 9914
wolfSSL 0:1239e9b70ca2 9915 CYASSL_MSG("CyaSSL_BN_hex2bn");
wolfSSL 0:1239e9b70ca2 9916
wolfSSL 0:1239e9b70ca2 9917 if (str == NULL) {
wolfSSL 0:1239e9b70ca2 9918 CYASSL_MSG("Bad function argument");
wolfSSL 0:1239e9b70ca2 9919 return 0;
wolfSSL 0:1239e9b70ca2 9920 }
wolfSSL 0:1239e9b70ca2 9921
wolfSSL 0:1239e9b70ca2 9922 if (Base16_Decode((byte*)str, (int)XSTRLEN(str), decoded, &decSz) < 0) {
wolfSSL 0:1239e9b70ca2 9923 CYASSL_MSG("Bad Base16_Decode error");
wolfSSL 0:1239e9b70ca2 9924 return 0;
wolfSSL 0:1239e9b70ca2 9925 }
wolfSSL 0:1239e9b70ca2 9926
wolfSSL 0:1239e9b70ca2 9927 if (bn == NULL)
wolfSSL 0:1239e9b70ca2 9928 return decSz;
wolfSSL 0:1239e9b70ca2 9929
wolfSSL 0:1239e9b70ca2 9930 if (*bn == NULL) {
wolfSSL 0:1239e9b70ca2 9931 *bn = CyaSSL_BN_new();
wolfSSL 0:1239e9b70ca2 9932 if (*bn == NULL) {
wolfSSL 0:1239e9b70ca2 9933 CYASSL_MSG("BN new failed");
wolfSSL 0:1239e9b70ca2 9934 return 0;
wolfSSL 0:1239e9b70ca2 9935 }
wolfSSL 0:1239e9b70ca2 9936 }
wolfSSL 0:1239e9b70ca2 9937
wolfSSL 0:1239e9b70ca2 9938 if (CyaSSL_BN_bin2bn(decoded, decSz, *bn) == NULL) {
wolfSSL 0:1239e9b70ca2 9939 CYASSL_MSG("Bad bin2bn error");
wolfSSL 0:1239e9b70ca2 9940 return 0;
wolfSSL 0:1239e9b70ca2 9941 }
wolfSSL 0:1239e9b70ca2 9942
wolfSSL 0:1239e9b70ca2 9943 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 9944 }
wolfSSL 0:1239e9b70ca2 9945
wolfSSL 0:1239e9b70ca2 9946
wolfSSL 0:1239e9b70ca2 9947 CYASSL_BIGNUM* CyaSSL_BN_dup(const CYASSL_BIGNUM* bn)
wolfSSL 0:1239e9b70ca2 9948 {
wolfSSL 0:1239e9b70ca2 9949 CYASSL_BIGNUM* ret;
wolfSSL 0:1239e9b70ca2 9950
wolfSSL 0:1239e9b70ca2 9951 CYASSL_MSG("CyaSSL_BN_dup");
wolfSSL 0:1239e9b70ca2 9952
wolfSSL 0:1239e9b70ca2 9953 if (bn == NULL || bn->internal == NULL) {
wolfSSL 0:1239e9b70ca2 9954 CYASSL_MSG("bn NULL error");
wolfSSL 0:1239e9b70ca2 9955 return NULL;
wolfSSL 0:1239e9b70ca2 9956 }
wolfSSL 0:1239e9b70ca2 9957
wolfSSL 0:1239e9b70ca2 9958 ret = CyaSSL_BN_new();
wolfSSL 0:1239e9b70ca2 9959 if (ret == NULL) {
wolfSSL 0:1239e9b70ca2 9960 CYASSL_MSG("bn new error");
wolfSSL 0:1239e9b70ca2 9961 return NULL;
wolfSSL 0:1239e9b70ca2 9962 }
wolfSSL 0:1239e9b70ca2 9963
wolfSSL 0:1239e9b70ca2 9964 if (mp_copy((mp_int*)bn->internal, (mp_int*)ret->internal) != MP_OKAY) {
wolfSSL 0:1239e9b70ca2 9965 CYASSL_MSG("mp_copy error");
wolfSSL 0:1239e9b70ca2 9966 CyaSSL_BN_free(ret);
wolfSSL 0:1239e9b70ca2 9967 return NULL;
wolfSSL 0:1239e9b70ca2 9968 }
wolfSSL 0:1239e9b70ca2 9969
wolfSSL 0:1239e9b70ca2 9970 return ret;
wolfSSL 0:1239e9b70ca2 9971 }
wolfSSL 0:1239e9b70ca2 9972
wolfSSL 0:1239e9b70ca2 9973
wolfSSL 0:1239e9b70ca2 9974 CYASSL_BIGNUM* CyaSSL_BN_copy(CYASSL_BIGNUM* r, const CYASSL_BIGNUM* bn)
wolfSSL 0:1239e9b70ca2 9975 {
wolfSSL 0:1239e9b70ca2 9976 (void)r;
wolfSSL 0:1239e9b70ca2 9977 (void)bn;
wolfSSL 0:1239e9b70ca2 9978
wolfSSL 0:1239e9b70ca2 9979 CYASSL_MSG("CyaSSL_BN_copy");
wolfSSL 0:1239e9b70ca2 9980
wolfSSL 0:1239e9b70ca2 9981 return NULL;
wolfSSL 0:1239e9b70ca2 9982 }
wolfSSL 0:1239e9b70ca2 9983
wolfSSL 0:1239e9b70ca2 9984
wolfSSL 0:1239e9b70ca2 9985 int CyaSSL_BN_set_word(CYASSL_BIGNUM* bn, unsigned long w)
wolfSSL 0:1239e9b70ca2 9986 {
wolfSSL 0:1239e9b70ca2 9987 (void)bn;
wolfSSL 0:1239e9b70ca2 9988 (void)w;
wolfSSL 0:1239e9b70ca2 9989
wolfSSL 0:1239e9b70ca2 9990 CYASSL_MSG("CyaSSL_BN_set_word");
wolfSSL 0:1239e9b70ca2 9991
wolfSSL 0:1239e9b70ca2 9992 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 9993 }
wolfSSL 0:1239e9b70ca2 9994
wolfSSL 0:1239e9b70ca2 9995
wolfSSL 0:1239e9b70ca2 9996 int CyaSSL_BN_dec2bn(CYASSL_BIGNUM** bn, const char* str)
wolfSSL 0:1239e9b70ca2 9997 {
wolfSSL 0:1239e9b70ca2 9998 (void)bn;
wolfSSL 0:1239e9b70ca2 9999 (void)str;
wolfSSL 0:1239e9b70ca2 10000
wolfSSL 0:1239e9b70ca2 10001 CYASSL_MSG("CyaSSL_BN_dec2bn");
wolfSSL 0:1239e9b70ca2 10002
wolfSSL 0:1239e9b70ca2 10003 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 10004 }
wolfSSL 0:1239e9b70ca2 10005
wolfSSL 0:1239e9b70ca2 10006
wolfSSL 0:1239e9b70ca2 10007 char* CyaSSL_BN_bn2dec(const CYASSL_BIGNUM* bn)
wolfSSL 0:1239e9b70ca2 10008 {
wolfSSL 0:1239e9b70ca2 10009 (void)bn;
wolfSSL 0:1239e9b70ca2 10010
wolfSSL 0:1239e9b70ca2 10011 CYASSL_MSG("CyaSSL_BN_bn2dec");
wolfSSL 0:1239e9b70ca2 10012
wolfSSL 0:1239e9b70ca2 10013 return NULL;
wolfSSL 0:1239e9b70ca2 10014 }
wolfSSL 0:1239e9b70ca2 10015
wolfSSL 0:1239e9b70ca2 10016
wolfSSL 0:1239e9b70ca2 10017 static void InitCyaSSL_DH(CYASSL_DH* dh)
wolfSSL 0:1239e9b70ca2 10018 {
wolfSSL 0:1239e9b70ca2 10019 if (dh) {
wolfSSL 0:1239e9b70ca2 10020 dh->p = NULL;
wolfSSL 0:1239e9b70ca2 10021 dh->g = NULL;
wolfSSL 0:1239e9b70ca2 10022 dh->pub_key = NULL;
wolfSSL 0:1239e9b70ca2 10023 dh->priv_key = NULL;
wolfSSL 0:1239e9b70ca2 10024 dh->internal = NULL;
wolfSSL 0:1239e9b70ca2 10025 dh->inSet = 0;
wolfSSL 0:1239e9b70ca2 10026 dh->exSet = 0;
wolfSSL 0:1239e9b70ca2 10027 }
wolfSSL 0:1239e9b70ca2 10028 }
wolfSSL 0:1239e9b70ca2 10029
wolfSSL 0:1239e9b70ca2 10030
wolfSSL 0:1239e9b70ca2 10031 CYASSL_DH* CyaSSL_DH_new(void)
wolfSSL 0:1239e9b70ca2 10032 {
wolfSSL 0:1239e9b70ca2 10033 CYASSL_DH* external;
wolfSSL 0:1239e9b70ca2 10034 DhKey* key;
wolfSSL 0:1239e9b70ca2 10035
wolfSSL 0:1239e9b70ca2 10036 CYASSL_MSG("CyaSSL_DH_new");
wolfSSL 0:1239e9b70ca2 10037
wolfSSL 0:1239e9b70ca2 10038 key = (DhKey*) XMALLOC(sizeof(DhKey), NULL, DYNAMIC_TYPE_DH);
wolfSSL 0:1239e9b70ca2 10039 if (key == NULL) {
wolfSSL 0:1239e9b70ca2 10040 CYASSL_MSG("CyaSSL_DH_new malloc DhKey failure");
wolfSSL 0:1239e9b70ca2 10041 return NULL;
wolfSSL 0:1239e9b70ca2 10042 }
wolfSSL 0:1239e9b70ca2 10043
wolfSSL 0:1239e9b70ca2 10044 external = (CYASSL_DH*) XMALLOC(sizeof(CYASSL_DH), NULL,
wolfSSL 0:1239e9b70ca2 10045 DYNAMIC_TYPE_DH);
wolfSSL 0:1239e9b70ca2 10046 if (external == NULL) {
wolfSSL 0:1239e9b70ca2 10047 CYASSL_MSG("CyaSSL_DH_new malloc CYASSL_DH failure");
wolfSSL 0:1239e9b70ca2 10048 XFREE(key, NULL, DYNAMIC_TYPE_DH);
wolfSSL 0:1239e9b70ca2 10049 return NULL;
wolfSSL 0:1239e9b70ca2 10050 }
wolfSSL 0:1239e9b70ca2 10051
wolfSSL 0:1239e9b70ca2 10052 InitCyaSSL_DH(external);
wolfSSL 0:1239e9b70ca2 10053 InitDhKey(key);
wolfSSL 0:1239e9b70ca2 10054 external->internal = key;
wolfSSL 0:1239e9b70ca2 10055
wolfSSL 0:1239e9b70ca2 10056 return external;
wolfSSL 0:1239e9b70ca2 10057 }
wolfSSL 0:1239e9b70ca2 10058
wolfSSL 0:1239e9b70ca2 10059
wolfSSL 0:1239e9b70ca2 10060 void CyaSSL_DH_free(CYASSL_DH* dh)
wolfSSL 0:1239e9b70ca2 10061 {
wolfSSL 0:1239e9b70ca2 10062 CYASSL_MSG("CyaSSL_DH_free");
wolfSSL 0:1239e9b70ca2 10063
wolfSSL 0:1239e9b70ca2 10064 if (dh) {
wolfSSL 0:1239e9b70ca2 10065 if (dh->internal) {
wolfSSL 0:1239e9b70ca2 10066 FreeDhKey((DhKey*)dh->internal);
wolfSSL 0:1239e9b70ca2 10067 XFREE(dh->internal, NULL, DYNAMIC_TYPE_DH);
wolfSSL 0:1239e9b70ca2 10068 dh->internal = NULL;
wolfSSL 0:1239e9b70ca2 10069 }
wolfSSL 0:1239e9b70ca2 10070 CyaSSL_BN_free(dh->priv_key);
wolfSSL 0:1239e9b70ca2 10071 CyaSSL_BN_free(dh->pub_key);
wolfSSL 0:1239e9b70ca2 10072 CyaSSL_BN_free(dh->g);
wolfSSL 0:1239e9b70ca2 10073 CyaSSL_BN_free(dh->p);
wolfSSL 0:1239e9b70ca2 10074 InitCyaSSL_DH(dh); /* set back to NULLs for safety */
wolfSSL 0:1239e9b70ca2 10075
wolfSSL 0:1239e9b70ca2 10076 XFREE(dh, NULL, DYNAMIC_TYPE_DH);
wolfSSL 0:1239e9b70ca2 10077 }
wolfSSL 0:1239e9b70ca2 10078 }
wolfSSL 0:1239e9b70ca2 10079
wolfSSL 0:1239e9b70ca2 10080
wolfSSL 0:1239e9b70ca2 10081 static int SetDhInternal(CYASSL_DH* dh)
wolfSSL 0:1239e9b70ca2 10082 {
wolfSSL 0:1239e9b70ca2 10083 unsigned char p[1024];
wolfSSL 0:1239e9b70ca2 10084 unsigned char g[1024];
wolfSSL 0:1239e9b70ca2 10085 int pSz = sizeof(p);
wolfSSL 0:1239e9b70ca2 10086 int gSz = sizeof(g);
wolfSSL 0:1239e9b70ca2 10087
wolfSSL 0:1239e9b70ca2 10088 CYASSL_ENTER("SetDhInternal");
wolfSSL 0:1239e9b70ca2 10089
wolfSSL 0:1239e9b70ca2 10090 if (dh == NULL || dh->p == NULL || dh->g == NULL) {
wolfSSL 0:1239e9b70ca2 10091 CYASSL_MSG("Bad function arguments");
wolfSSL 0:1239e9b70ca2 10092 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 10093 }
wolfSSL 0:1239e9b70ca2 10094
wolfSSL 0:1239e9b70ca2 10095 if (CyaSSL_BN_bn2bin(dh->p, NULL) > pSz) {
wolfSSL 0:1239e9b70ca2 10096 CYASSL_MSG("Bad p internal size");
wolfSSL 0:1239e9b70ca2 10097 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 10098 }
wolfSSL 0:1239e9b70ca2 10099
wolfSSL 0:1239e9b70ca2 10100 if (CyaSSL_BN_bn2bin(dh->g, NULL) > gSz) {
wolfSSL 0:1239e9b70ca2 10101 CYASSL_MSG("Bad g internal size");
wolfSSL 0:1239e9b70ca2 10102 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 10103 }
wolfSSL 0:1239e9b70ca2 10104
wolfSSL 0:1239e9b70ca2 10105 pSz = CyaSSL_BN_bn2bin(dh->p, p);
wolfSSL 0:1239e9b70ca2 10106 gSz = CyaSSL_BN_bn2bin(dh->g, g);
wolfSSL 0:1239e9b70ca2 10107
wolfSSL 0:1239e9b70ca2 10108 if (pSz <= 0 || gSz <= 0) {
wolfSSL 0:1239e9b70ca2 10109 CYASSL_MSG("Bad BN2bin set");
wolfSSL 0:1239e9b70ca2 10110 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 10111 }
wolfSSL 0:1239e9b70ca2 10112
wolfSSL 0:1239e9b70ca2 10113 if (DhSetKey((DhKey*)dh->internal, p, pSz, g, gSz) < 0) {
wolfSSL 0:1239e9b70ca2 10114 CYASSL_MSG("Bad DH SetKey");
wolfSSL 0:1239e9b70ca2 10115 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 10116 }
wolfSSL 0:1239e9b70ca2 10117
wolfSSL 0:1239e9b70ca2 10118 dh->inSet = 1;
wolfSSL 0:1239e9b70ca2 10119
wolfSSL 0:1239e9b70ca2 10120 return 0;
wolfSSL 0:1239e9b70ca2 10121 }
wolfSSL 0:1239e9b70ca2 10122
wolfSSL 0:1239e9b70ca2 10123
wolfSSL 0:1239e9b70ca2 10124 int CyaSSL_DH_size(CYASSL_DH* dh)
wolfSSL 0:1239e9b70ca2 10125 {
wolfSSL 0:1239e9b70ca2 10126 CYASSL_MSG("CyaSSL_DH_size");
wolfSSL 0:1239e9b70ca2 10127
wolfSSL 0:1239e9b70ca2 10128 if (dh == NULL)
wolfSSL 0:1239e9b70ca2 10129 return 0;
wolfSSL 0:1239e9b70ca2 10130
wolfSSL 0:1239e9b70ca2 10131 return CyaSSL_BN_num_bytes(dh->p);
wolfSSL 0:1239e9b70ca2 10132 }
wolfSSL 0:1239e9b70ca2 10133
wolfSSL 0:1239e9b70ca2 10134
wolfSSL 0:1239e9b70ca2 10135 /* return SSL_SUCCESS on ok, else 0 */
wolfSSL 0:1239e9b70ca2 10136 int CyaSSL_DH_generate_key(CYASSL_DH* dh)
wolfSSL 0:1239e9b70ca2 10137 {
wolfSSL 0:1239e9b70ca2 10138 unsigned char pub [768];
wolfSSL 0:1239e9b70ca2 10139 unsigned char priv[768];
wolfSSL 0:1239e9b70ca2 10140 word32 pubSz = sizeof(pub);
wolfSSL 0:1239e9b70ca2 10141 word32 privSz = sizeof(priv);
wolfSSL 0:1239e9b70ca2 10142 RNG tmpRNG;
wolfSSL 0:1239e9b70ca2 10143 RNG* rng = &tmpRNG;
wolfSSL 0:1239e9b70ca2 10144
wolfSSL 0:1239e9b70ca2 10145 CYASSL_MSG("CyaSSL_DH_generate_key");
wolfSSL 0:1239e9b70ca2 10146
wolfSSL 0:1239e9b70ca2 10147 if (dh == NULL || dh->p == NULL || dh->g == NULL) {
wolfSSL 0:1239e9b70ca2 10148 CYASSL_MSG("Bad function arguments");
wolfSSL 0:1239e9b70ca2 10149 return 0;
wolfSSL 0:1239e9b70ca2 10150 }
wolfSSL 0:1239e9b70ca2 10151
wolfSSL 0:1239e9b70ca2 10152 if (dh->inSet == 0) {
wolfSSL 0:1239e9b70ca2 10153 if (SetDhInternal(dh) < 0) {
wolfSSL 0:1239e9b70ca2 10154 CYASSL_MSG("Bad DH set internal");
wolfSSL 0:1239e9b70ca2 10155 return 0;
wolfSSL 0:1239e9b70ca2 10156 }
wolfSSL 0:1239e9b70ca2 10157 }
wolfSSL 0:1239e9b70ca2 10158
wolfSSL 0:1239e9b70ca2 10159 if ( (InitRng(&tmpRNG)) != 0) {
wolfSSL 0:1239e9b70ca2 10160 CYASSL_MSG("Bad RNG Init, trying global");
wolfSSL 0:1239e9b70ca2 10161 if (initGlobalRNG == 0) {
wolfSSL 0:1239e9b70ca2 10162 CYASSL_MSG("Global RNG no Init");
wolfSSL 0:1239e9b70ca2 10163 return 0;
wolfSSL 0:1239e9b70ca2 10164 }
wolfSSL 0:1239e9b70ca2 10165 rng = &globalRNG;
wolfSSL 0:1239e9b70ca2 10166 }
wolfSSL 0:1239e9b70ca2 10167
wolfSSL 0:1239e9b70ca2 10168 if (DhGenerateKeyPair((DhKey*)dh->internal, rng, priv, &privSz,
wolfSSL 0:1239e9b70ca2 10169 pub, &pubSz) < 0) {
wolfSSL 0:1239e9b70ca2 10170 CYASSL_MSG("Bad DhGenerateKeyPair");
wolfSSL 0:1239e9b70ca2 10171 return 0;
wolfSSL 0:1239e9b70ca2 10172 }
wolfSSL 0:1239e9b70ca2 10173
wolfSSL 0:1239e9b70ca2 10174 if (dh->pub_key)
wolfSSL 0:1239e9b70ca2 10175 CyaSSL_BN_free(dh->pub_key);
wolfSSL 0:1239e9b70ca2 10176 dh->pub_key = CyaSSL_BN_new();
wolfSSL 0:1239e9b70ca2 10177 if (dh->pub_key == NULL) {
wolfSSL 0:1239e9b70ca2 10178 CYASSL_MSG("Bad DH new pub");
wolfSSL 0:1239e9b70ca2 10179 return 0;
wolfSSL 0:1239e9b70ca2 10180 }
wolfSSL 0:1239e9b70ca2 10181
wolfSSL 0:1239e9b70ca2 10182 if (dh->priv_key)
wolfSSL 0:1239e9b70ca2 10183 CyaSSL_BN_free(dh->priv_key);
wolfSSL 0:1239e9b70ca2 10184 dh->priv_key = CyaSSL_BN_new();
wolfSSL 0:1239e9b70ca2 10185 if (dh->priv_key == NULL) {
wolfSSL 0:1239e9b70ca2 10186 CYASSL_MSG("Bad DH new priv");
wolfSSL 0:1239e9b70ca2 10187 return 0;
wolfSSL 0:1239e9b70ca2 10188 }
wolfSSL 0:1239e9b70ca2 10189
wolfSSL 0:1239e9b70ca2 10190 if (CyaSSL_BN_bin2bn(pub, pubSz, dh->pub_key) == NULL) {
wolfSSL 0:1239e9b70ca2 10191 CYASSL_MSG("Bad DH bn2bin error pub");
wolfSSL 0:1239e9b70ca2 10192 return 0;
wolfSSL 0:1239e9b70ca2 10193 }
wolfSSL 0:1239e9b70ca2 10194
wolfSSL 0:1239e9b70ca2 10195 if (CyaSSL_BN_bin2bn(priv, privSz, dh->priv_key) == NULL) {
wolfSSL 0:1239e9b70ca2 10196 CYASSL_MSG("Bad DH bn2bin error priv");
wolfSSL 0:1239e9b70ca2 10197 return 0;
wolfSSL 0:1239e9b70ca2 10198 }
wolfSSL 0:1239e9b70ca2 10199
wolfSSL 0:1239e9b70ca2 10200 CYASSL_MSG("CyaSSL_generate_key success");
wolfSSL 0:1239e9b70ca2 10201 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 10202 }
wolfSSL 0:1239e9b70ca2 10203
wolfSSL 0:1239e9b70ca2 10204
wolfSSL 0:1239e9b70ca2 10205 /* return key size on ok, 0 otherwise */
wolfSSL 0:1239e9b70ca2 10206 int CyaSSL_DH_compute_key(unsigned char* key, CYASSL_BIGNUM* otherPub,
wolfSSL 0:1239e9b70ca2 10207 CYASSL_DH* dh)
wolfSSL 0:1239e9b70ca2 10208 {
wolfSSL 0:1239e9b70ca2 10209 unsigned char pub [1024];
wolfSSL 0:1239e9b70ca2 10210 unsigned char priv[1024];
wolfSSL 0:1239e9b70ca2 10211 word32 pubSz = sizeof(pub);
wolfSSL 0:1239e9b70ca2 10212 word32 privSz = sizeof(priv);
wolfSSL 0:1239e9b70ca2 10213 word32 keySz;
wolfSSL 0:1239e9b70ca2 10214
wolfSSL 0:1239e9b70ca2 10215 CYASSL_MSG("CyaSSL_DH_compute_key");
wolfSSL 0:1239e9b70ca2 10216
wolfSSL 0:1239e9b70ca2 10217 if (dh == NULL || dh->priv_key == NULL || otherPub == NULL) {
wolfSSL 0:1239e9b70ca2 10218 CYASSL_MSG("Bad function arguments");
wolfSSL 0:1239e9b70ca2 10219 return 0;
wolfSSL 0:1239e9b70ca2 10220 }
wolfSSL 0:1239e9b70ca2 10221
wolfSSL 0:1239e9b70ca2 10222 keySz = (word32)DH_size(dh);
wolfSSL 0:1239e9b70ca2 10223 if (keySz == 0) {
wolfSSL 0:1239e9b70ca2 10224 CYASSL_MSG("Bad DH_size");
wolfSSL 0:1239e9b70ca2 10225 return 0;
wolfSSL 0:1239e9b70ca2 10226 }
wolfSSL 0:1239e9b70ca2 10227
wolfSSL 0:1239e9b70ca2 10228 if (CyaSSL_BN_bn2bin(dh->priv_key, NULL) > (int)privSz) {
wolfSSL 0:1239e9b70ca2 10229 CYASSL_MSG("Bad priv internal size");
wolfSSL 0:1239e9b70ca2 10230 return 0;
wolfSSL 0:1239e9b70ca2 10231 }
wolfSSL 0:1239e9b70ca2 10232
wolfSSL 0:1239e9b70ca2 10233 if (CyaSSL_BN_bn2bin(otherPub, NULL) > (int)pubSz) {
wolfSSL 0:1239e9b70ca2 10234 CYASSL_MSG("Bad otherPub size");
wolfSSL 0:1239e9b70ca2 10235 return 0;
wolfSSL 0:1239e9b70ca2 10236 }
wolfSSL 0:1239e9b70ca2 10237
wolfSSL 0:1239e9b70ca2 10238 privSz = CyaSSL_BN_bn2bin(dh->priv_key, priv);
wolfSSL 0:1239e9b70ca2 10239 pubSz = CyaSSL_BN_bn2bin(otherPub, pub);
wolfSSL 0:1239e9b70ca2 10240
wolfSSL 0:1239e9b70ca2 10241 if (privSz <= 0 || pubSz <= 0) {
wolfSSL 0:1239e9b70ca2 10242 CYASSL_MSG("Bad BN2bin set");
wolfSSL 0:1239e9b70ca2 10243 return 0;
wolfSSL 0:1239e9b70ca2 10244 }
wolfSSL 0:1239e9b70ca2 10245
wolfSSL 0:1239e9b70ca2 10246 if (DhAgree((DhKey*)dh->internal, key, &keySz, priv, privSz, pub,
wolfSSL 0:1239e9b70ca2 10247 pubSz) < 0) {
wolfSSL 0:1239e9b70ca2 10248 CYASSL_MSG("DhAgree failed");
wolfSSL 0:1239e9b70ca2 10249 return 0;
wolfSSL 0:1239e9b70ca2 10250 }
wolfSSL 0:1239e9b70ca2 10251
wolfSSL 0:1239e9b70ca2 10252 CYASSL_MSG("CyaSSL_compute_key success");
wolfSSL 0:1239e9b70ca2 10253 return (int)keySz;
wolfSSL 0:1239e9b70ca2 10254 }
wolfSSL 0:1239e9b70ca2 10255
wolfSSL 0:1239e9b70ca2 10256
wolfSSL 0:1239e9b70ca2 10257 #ifndef NO_DSA
wolfSSL 0:1239e9b70ca2 10258 static void InitCyaSSL_DSA(CYASSL_DSA* dsa)
wolfSSL 0:1239e9b70ca2 10259 {
wolfSSL 0:1239e9b70ca2 10260 if (dsa) {
wolfSSL 0:1239e9b70ca2 10261 dsa->p = NULL;
wolfSSL 0:1239e9b70ca2 10262 dsa->q = NULL;
wolfSSL 0:1239e9b70ca2 10263 dsa->g = NULL;
wolfSSL 0:1239e9b70ca2 10264 dsa->pub_key = NULL;
wolfSSL 0:1239e9b70ca2 10265 dsa->priv_key = NULL;
wolfSSL 0:1239e9b70ca2 10266 dsa->internal = NULL;
wolfSSL 0:1239e9b70ca2 10267 dsa->inSet = 0;
wolfSSL 0:1239e9b70ca2 10268 dsa->exSet = 0;
wolfSSL 0:1239e9b70ca2 10269 }
wolfSSL 0:1239e9b70ca2 10270 }
wolfSSL 0:1239e9b70ca2 10271
wolfSSL 0:1239e9b70ca2 10272
wolfSSL 0:1239e9b70ca2 10273 CYASSL_DSA* CyaSSL_DSA_new(void)
wolfSSL 0:1239e9b70ca2 10274 {
wolfSSL 0:1239e9b70ca2 10275 CYASSL_DSA* external;
wolfSSL 0:1239e9b70ca2 10276 DsaKey* key;
wolfSSL 0:1239e9b70ca2 10277
wolfSSL 0:1239e9b70ca2 10278 CYASSL_MSG("CyaSSL_DSA_new");
wolfSSL 0:1239e9b70ca2 10279
wolfSSL 0:1239e9b70ca2 10280 key = (DsaKey*) XMALLOC(sizeof(DsaKey), NULL, DYNAMIC_TYPE_DSA);
wolfSSL 0:1239e9b70ca2 10281 if (key == NULL) {
wolfSSL 0:1239e9b70ca2 10282 CYASSL_MSG("CyaSSL_DSA_new malloc DsaKey failure");
wolfSSL 0:1239e9b70ca2 10283 return NULL;
wolfSSL 0:1239e9b70ca2 10284 }
wolfSSL 0:1239e9b70ca2 10285
wolfSSL 0:1239e9b70ca2 10286 external = (CYASSL_DSA*) XMALLOC(sizeof(CYASSL_DSA), NULL,
wolfSSL 0:1239e9b70ca2 10287 DYNAMIC_TYPE_DSA);
wolfSSL 0:1239e9b70ca2 10288 if (external == NULL) {
wolfSSL 0:1239e9b70ca2 10289 CYASSL_MSG("CyaSSL_DSA_new malloc CYASSL_DSA failure");
wolfSSL 0:1239e9b70ca2 10290 XFREE(key, NULL, DYNAMIC_TYPE_DSA);
wolfSSL 0:1239e9b70ca2 10291 return NULL;
wolfSSL 0:1239e9b70ca2 10292 }
wolfSSL 0:1239e9b70ca2 10293
wolfSSL 0:1239e9b70ca2 10294 InitCyaSSL_DSA(external);
wolfSSL 0:1239e9b70ca2 10295 InitDsaKey(key);
wolfSSL 0:1239e9b70ca2 10296 external->internal = key;
wolfSSL 0:1239e9b70ca2 10297
wolfSSL 0:1239e9b70ca2 10298 return external;
wolfSSL 0:1239e9b70ca2 10299 }
wolfSSL 0:1239e9b70ca2 10300
wolfSSL 0:1239e9b70ca2 10301
wolfSSL 0:1239e9b70ca2 10302 void CyaSSL_DSA_free(CYASSL_DSA* dsa)
wolfSSL 0:1239e9b70ca2 10303 {
wolfSSL 0:1239e9b70ca2 10304 CYASSL_MSG("CyaSSL_DSA_free");
wolfSSL 0:1239e9b70ca2 10305
wolfSSL 0:1239e9b70ca2 10306 if (dsa) {
wolfSSL 0:1239e9b70ca2 10307 if (dsa->internal) {
wolfSSL 0:1239e9b70ca2 10308 FreeDsaKey((DsaKey*)dsa->internal);
wolfSSL 0:1239e9b70ca2 10309 XFREE(dsa->internal, NULL, DYNAMIC_TYPE_DSA);
wolfSSL 0:1239e9b70ca2 10310 dsa->internal = NULL;
wolfSSL 0:1239e9b70ca2 10311 }
wolfSSL 0:1239e9b70ca2 10312 CyaSSL_BN_free(dsa->priv_key);
wolfSSL 0:1239e9b70ca2 10313 CyaSSL_BN_free(dsa->pub_key);
wolfSSL 0:1239e9b70ca2 10314 CyaSSL_BN_free(dsa->g);
wolfSSL 0:1239e9b70ca2 10315 CyaSSL_BN_free(dsa->q);
wolfSSL 0:1239e9b70ca2 10316 CyaSSL_BN_free(dsa->p);
wolfSSL 0:1239e9b70ca2 10317 InitCyaSSL_DSA(dsa); /* set back to NULLs for safety */
wolfSSL 0:1239e9b70ca2 10318
wolfSSL 0:1239e9b70ca2 10319 XFREE(dsa, NULL, DYNAMIC_TYPE_DSA);
wolfSSL 0:1239e9b70ca2 10320 }
wolfSSL 0:1239e9b70ca2 10321 }
wolfSSL 0:1239e9b70ca2 10322
wolfSSL 0:1239e9b70ca2 10323
wolfSSL 0:1239e9b70ca2 10324 int CyaSSL_DSA_generate_key(CYASSL_DSA* dsa)
wolfSSL 0:1239e9b70ca2 10325 {
wolfSSL 0:1239e9b70ca2 10326 (void)dsa;
wolfSSL 0:1239e9b70ca2 10327
wolfSSL 0:1239e9b70ca2 10328 CYASSL_MSG("CyaSSL_DSA_generate_key");
wolfSSL 0:1239e9b70ca2 10329
wolfSSL 0:1239e9b70ca2 10330 return 0; /* key gen not needed by server */
wolfSSL 0:1239e9b70ca2 10331 }
wolfSSL 0:1239e9b70ca2 10332
wolfSSL 0:1239e9b70ca2 10333
wolfSSL 0:1239e9b70ca2 10334 int CyaSSL_DSA_generate_parameters_ex(CYASSL_DSA* dsa, int bits,
wolfSSL 0:1239e9b70ca2 10335 unsigned char* seed, int seedLen, int* counterRet,
wolfSSL 0:1239e9b70ca2 10336 unsigned long* hRet, void* cb)
wolfSSL 0:1239e9b70ca2 10337 {
wolfSSL 0:1239e9b70ca2 10338 (void)dsa;
wolfSSL 0:1239e9b70ca2 10339 (void)bits;
wolfSSL 0:1239e9b70ca2 10340 (void)seed;
wolfSSL 0:1239e9b70ca2 10341 (void)seedLen;
wolfSSL 0:1239e9b70ca2 10342 (void)counterRet;
wolfSSL 0:1239e9b70ca2 10343 (void)hRet;
wolfSSL 0:1239e9b70ca2 10344 (void)cb;
wolfSSL 0:1239e9b70ca2 10345
wolfSSL 0:1239e9b70ca2 10346 CYASSL_MSG("CyaSSL_DSA_generate_parameters_ex");
wolfSSL 0:1239e9b70ca2 10347
wolfSSL 0:1239e9b70ca2 10348 return 0; /* key gen not needed by server */
wolfSSL 0:1239e9b70ca2 10349 }
wolfSSL 0:1239e9b70ca2 10350 #endif /* NO_DSA */
wolfSSL 0:1239e9b70ca2 10351
wolfSSL 0:1239e9b70ca2 10352 static void InitCyaSSL_Rsa(CYASSL_RSA* rsa)
wolfSSL 0:1239e9b70ca2 10353 {
wolfSSL 0:1239e9b70ca2 10354 if (rsa) {
wolfSSL 0:1239e9b70ca2 10355 rsa->n = NULL;
wolfSSL 0:1239e9b70ca2 10356 rsa->e = NULL;
wolfSSL 0:1239e9b70ca2 10357 rsa->d = NULL;
wolfSSL 0:1239e9b70ca2 10358 rsa->p = NULL;
wolfSSL 0:1239e9b70ca2 10359 rsa->q = NULL;
wolfSSL 0:1239e9b70ca2 10360 rsa->dmp1 = NULL;
wolfSSL 0:1239e9b70ca2 10361 rsa->dmq1 = NULL;
wolfSSL 0:1239e9b70ca2 10362 rsa->iqmp = NULL;
wolfSSL 0:1239e9b70ca2 10363 rsa->internal = NULL;
wolfSSL 0:1239e9b70ca2 10364 rsa->inSet = 0;
wolfSSL 0:1239e9b70ca2 10365 rsa->exSet = 0;
wolfSSL 0:1239e9b70ca2 10366 }
wolfSSL 0:1239e9b70ca2 10367 }
wolfSSL 0:1239e9b70ca2 10368
wolfSSL 0:1239e9b70ca2 10369
wolfSSL 0:1239e9b70ca2 10370 CYASSL_RSA* CyaSSL_RSA_new(void)
wolfSSL 0:1239e9b70ca2 10371 {
wolfSSL 0:1239e9b70ca2 10372 CYASSL_RSA* external;
wolfSSL 0:1239e9b70ca2 10373 RsaKey* key;
wolfSSL 0:1239e9b70ca2 10374
wolfSSL 0:1239e9b70ca2 10375 CYASSL_MSG("CyaSSL_RSA_new");
wolfSSL 0:1239e9b70ca2 10376
wolfSSL 0:1239e9b70ca2 10377 key = (RsaKey*) XMALLOC(sizeof(RsaKey), NULL, DYNAMIC_TYPE_RSA);
wolfSSL 0:1239e9b70ca2 10378 if (key == NULL) {
wolfSSL 0:1239e9b70ca2 10379 CYASSL_MSG("CyaSSL_RSA_new malloc RsaKey failure");
wolfSSL 0:1239e9b70ca2 10380 return NULL;
wolfSSL 0:1239e9b70ca2 10381 }
wolfSSL 0:1239e9b70ca2 10382
wolfSSL 0:1239e9b70ca2 10383 external = (CYASSL_RSA*) XMALLOC(sizeof(CYASSL_RSA), NULL,
wolfSSL 0:1239e9b70ca2 10384 DYNAMIC_TYPE_RSA);
wolfSSL 0:1239e9b70ca2 10385 if (external == NULL) {
wolfSSL 0:1239e9b70ca2 10386 CYASSL_MSG("CyaSSL_RSA_new malloc CYASSL_RSA failure");
wolfSSL 0:1239e9b70ca2 10387 XFREE(key, NULL, DYNAMIC_TYPE_RSA);
wolfSSL 0:1239e9b70ca2 10388 return NULL;
wolfSSL 0:1239e9b70ca2 10389 }
wolfSSL 0:1239e9b70ca2 10390
wolfSSL 0:1239e9b70ca2 10391 InitCyaSSL_Rsa(external);
wolfSSL 0:1239e9b70ca2 10392 if (InitRsaKey(key, NULL) != 0) {
wolfSSL 0:1239e9b70ca2 10393 CYASSL_MSG("InitRsaKey CYASSL_RSA failure");
wolfSSL 0:1239e9b70ca2 10394 XFREE(external, NULL, DYNAMIC_TYPE_RSA);
wolfSSL 0:1239e9b70ca2 10395 XFREE(key, NULL, DYNAMIC_TYPE_RSA);
wolfSSL 0:1239e9b70ca2 10396 return NULL;
wolfSSL 0:1239e9b70ca2 10397 }
wolfSSL 0:1239e9b70ca2 10398 external->internal = key;
wolfSSL 0:1239e9b70ca2 10399
wolfSSL 0:1239e9b70ca2 10400 return external;
wolfSSL 0:1239e9b70ca2 10401 }
wolfSSL 0:1239e9b70ca2 10402
wolfSSL 0:1239e9b70ca2 10403
wolfSSL 0:1239e9b70ca2 10404 void CyaSSL_RSA_free(CYASSL_RSA* rsa)
wolfSSL 0:1239e9b70ca2 10405 {
wolfSSL 0:1239e9b70ca2 10406 CYASSL_MSG("CyaSSL_RSA_free");
wolfSSL 0:1239e9b70ca2 10407
wolfSSL 0:1239e9b70ca2 10408 if (rsa) {
wolfSSL 0:1239e9b70ca2 10409 if (rsa->internal) {
wolfSSL 0:1239e9b70ca2 10410 FreeRsaKey((RsaKey*)rsa->internal);
wolfSSL 0:1239e9b70ca2 10411 XFREE(rsa->internal, NULL, DYNAMIC_TYPE_RSA);
wolfSSL 0:1239e9b70ca2 10412 rsa->internal = NULL;
wolfSSL 0:1239e9b70ca2 10413 }
wolfSSL 0:1239e9b70ca2 10414 CyaSSL_BN_free(rsa->iqmp);
wolfSSL 0:1239e9b70ca2 10415 CyaSSL_BN_free(rsa->dmq1);
wolfSSL 0:1239e9b70ca2 10416 CyaSSL_BN_free(rsa->dmp1);
wolfSSL 0:1239e9b70ca2 10417 CyaSSL_BN_free(rsa->q);
wolfSSL 0:1239e9b70ca2 10418 CyaSSL_BN_free(rsa->p);
wolfSSL 0:1239e9b70ca2 10419 CyaSSL_BN_free(rsa->d);
wolfSSL 0:1239e9b70ca2 10420 CyaSSL_BN_free(rsa->e);
wolfSSL 0:1239e9b70ca2 10421 CyaSSL_BN_free(rsa->n);
wolfSSL 0:1239e9b70ca2 10422 InitCyaSSL_Rsa(rsa); /* set back to NULLs for safety */
wolfSSL 0:1239e9b70ca2 10423
wolfSSL 0:1239e9b70ca2 10424 XFREE(rsa, NULL, DYNAMIC_TYPE_RSA);
wolfSSL 0:1239e9b70ca2 10425 }
wolfSSL 0:1239e9b70ca2 10426 }
wolfSSL 0:1239e9b70ca2 10427
wolfSSL 0:1239e9b70ca2 10428
wolfSSL 0:1239e9b70ca2 10429 static int SetIndividualExternal(CYASSL_BIGNUM** bn, mp_int* mpi)
wolfSSL 0:1239e9b70ca2 10430 {
wolfSSL 0:1239e9b70ca2 10431 CYASSL_MSG("Entering SetIndividualExternal");
wolfSSL 0:1239e9b70ca2 10432
wolfSSL 0:1239e9b70ca2 10433 if (mpi == NULL) {
wolfSSL 0:1239e9b70ca2 10434 CYASSL_MSG("mpi NULL error");
wolfSSL 0:1239e9b70ca2 10435 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 10436 }
wolfSSL 0:1239e9b70ca2 10437
wolfSSL 0:1239e9b70ca2 10438 if (*bn == NULL) {
wolfSSL 0:1239e9b70ca2 10439 *bn = CyaSSL_BN_new();
wolfSSL 0:1239e9b70ca2 10440 if (*bn == NULL) {
wolfSSL 0:1239e9b70ca2 10441 CYASSL_MSG("SetIndividualExternal alloc failed");
wolfSSL 0:1239e9b70ca2 10442 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 10443 }
wolfSSL 0:1239e9b70ca2 10444 }
wolfSSL 0:1239e9b70ca2 10445
wolfSSL 0:1239e9b70ca2 10446 if (mp_copy(mpi, (mp_int*)((*bn)->internal)) != MP_OKAY) {
wolfSSL 0:1239e9b70ca2 10447 CYASSL_MSG("mp_copy error");
wolfSSL 0:1239e9b70ca2 10448 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 10449 }
wolfSSL 0:1239e9b70ca2 10450
wolfSSL 0:1239e9b70ca2 10451 return 0;
wolfSSL 0:1239e9b70ca2 10452 }
wolfSSL 0:1239e9b70ca2 10453
wolfSSL 0:1239e9b70ca2 10454
wolfSSL 0:1239e9b70ca2 10455 #ifndef NO_DSA
wolfSSL 0:1239e9b70ca2 10456 static int SetDsaExternal(CYASSL_DSA* dsa)
wolfSSL 0:1239e9b70ca2 10457 {
wolfSSL 0:1239e9b70ca2 10458 DsaKey* key;
wolfSSL 0:1239e9b70ca2 10459 CYASSL_MSG("Entering SetDsaExternal");
wolfSSL 0:1239e9b70ca2 10460
wolfSSL 0:1239e9b70ca2 10461 if (dsa == NULL || dsa->internal == NULL) {
wolfSSL 0:1239e9b70ca2 10462 CYASSL_MSG("dsa key NULL error");
wolfSSL 0:1239e9b70ca2 10463 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 10464 }
wolfSSL 0:1239e9b70ca2 10465
wolfSSL 0:1239e9b70ca2 10466 key = (DsaKey*)dsa->internal;
wolfSSL 0:1239e9b70ca2 10467
wolfSSL 0:1239e9b70ca2 10468 if (SetIndividualExternal(&dsa->p, &key->p) < 0) {
wolfSSL 0:1239e9b70ca2 10469 CYASSL_MSG("dsa p key error");
wolfSSL 0:1239e9b70ca2 10470 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 10471 }
wolfSSL 0:1239e9b70ca2 10472
wolfSSL 0:1239e9b70ca2 10473 if (SetIndividualExternal(&dsa->q, &key->q) < 0) {
wolfSSL 0:1239e9b70ca2 10474 CYASSL_MSG("dsa q key error");
wolfSSL 0:1239e9b70ca2 10475 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 10476 }
wolfSSL 0:1239e9b70ca2 10477
wolfSSL 0:1239e9b70ca2 10478 if (SetIndividualExternal(&dsa->g, &key->g) < 0) {
wolfSSL 0:1239e9b70ca2 10479 CYASSL_MSG("dsa g key error");
wolfSSL 0:1239e9b70ca2 10480 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 10481 }
wolfSSL 0:1239e9b70ca2 10482
wolfSSL 0:1239e9b70ca2 10483 if (SetIndividualExternal(&dsa->pub_key, &key->y) < 0) {
wolfSSL 0:1239e9b70ca2 10484 CYASSL_MSG("dsa y key error");
wolfSSL 0:1239e9b70ca2 10485 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 10486 }
wolfSSL 0:1239e9b70ca2 10487
wolfSSL 0:1239e9b70ca2 10488 if (SetIndividualExternal(&dsa->priv_key, &key->x) < 0) {
wolfSSL 0:1239e9b70ca2 10489 CYASSL_MSG("dsa x key error");
wolfSSL 0:1239e9b70ca2 10490 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 10491 }
wolfSSL 0:1239e9b70ca2 10492
wolfSSL 0:1239e9b70ca2 10493 dsa->exSet = 1;
wolfSSL 0:1239e9b70ca2 10494
wolfSSL 0:1239e9b70ca2 10495 return 0;
wolfSSL 0:1239e9b70ca2 10496 }
wolfSSL 0:1239e9b70ca2 10497 #endif /* NO_DSA */
wolfSSL 0:1239e9b70ca2 10498
wolfSSL 0:1239e9b70ca2 10499
wolfSSL 0:1239e9b70ca2 10500 static int SetRsaExternal(CYASSL_RSA* rsa)
wolfSSL 0:1239e9b70ca2 10501 {
wolfSSL 0:1239e9b70ca2 10502 RsaKey* key;
wolfSSL 0:1239e9b70ca2 10503 CYASSL_MSG("Entering SetRsaExternal");
wolfSSL 0:1239e9b70ca2 10504
wolfSSL 0:1239e9b70ca2 10505 if (rsa == NULL || rsa->internal == NULL) {
wolfSSL 0:1239e9b70ca2 10506 CYASSL_MSG("rsa key NULL error");
wolfSSL 0:1239e9b70ca2 10507 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 10508 }
wolfSSL 0:1239e9b70ca2 10509
wolfSSL 0:1239e9b70ca2 10510 key = (RsaKey*)rsa->internal;
wolfSSL 0:1239e9b70ca2 10511
wolfSSL 0:1239e9b70ca2 10512 if (SetIndividualExternal(&rsa->n, &key->n) < 0) {
wolfSSL 0:1239e9b70ca2 10513 CYASSL_MSG("rsa n key error");
wolfSSL 0:1239e9b70ca2 10514 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 10515 }
wolfSSL 0:1239e9b70ca2 10516
wolfSSL 0:1239e9b70ca2 10517 if (SetIndividualExternal(&rsa->e, &key->e) < 0) {
wolfSSL 0:1239e9b70ca2 10518 CYASSL_MSG("rsa e key error");
wolfSSL 0:1239e9b70ca2 10519 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 10520 }
wolfSSL 0:1239e9b70ca2 10521
wolfSSL 0:1239e9b70ca2 10522 if (SetIndividualExternal(&rsa->d, &key->d) < 0) {
wolfSSL 0:1239e9b70ca2 10523 CYASSL_MSG("rsa d key error");
wolfSSL 0:1239e9b70ca2 10524 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 10525 }
wolfSSL 0:1239e9b70ca2 10526
wolfSSL 0:1239e9b70ca2 10527 if (SetIndividualExternal(&rsa->p, &key->p) < 0) {
wolfSSL 0:1239e9b70ca2 10528 CYASSL_MSG("rsa p key error");
wolfSSL 0:1239e9b70ca2 10529 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 10530 }
wolfSSL 0:1239e9b70ca2 10531
wolfSSL 0:1239e9b70ca2 10532 if (SetIndividualExternal(&rsa->q, &key->q) < 0) {
wolfSSL 0:1239e9b70ca2 10533 CYASSL_MSG("rsa q key error");
wolfSSL 0:1239e9b70ca2 10534 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 10535 }
wolfSSL 0:1239e9b70ca2 10536
wolfSSL 0:1239e9b70ca2 10537 if (SetIndividualExternal(&rsa->dmp1, &key->dP) < 0) {
wolfSSL 0:1239e9b70ca2 10538 CYASSL_MSG("rsa dP key error");
wolfSSL 0:1239e9b70ca2 10539 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 10540 }
wolfSSL 0:1239e9b70ca2 10541
wolfSSL 0:1239e9b70ca2 10542 if (SetIndividualExternal(&rsa->dmq1, &key->dQ) < 0) {
wolfSSL 0:1239e9b70ca2 10543 CYASSL_MSG("rsa dQ key error");
wolfSSL 0:1239e9b70ca2 10544 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 10545 }
wolfSSL 0:1239e9b70ca2 10546
wolfSSL 0:1239e9b70ca2 10547 if (SetIndividualExternal(&rsa->iqmp, &key->u) < 0) {
wolfSSL 0:1239e9b70ca2 10548 CYASSL_MSG("rsa u key error");
wolfSSL 0:1239e9b70ca2 10549 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 10550 }
wolfSSL 0:1239e9b70ca2 10551
wolfSSL 0:1239e9b70ca2 10552 rsa->exSet = 1;
wolfSSL 0:1239e9b70ca2 10553
wolfSSL 0:1239e9b70ca2 10554 return 0;
wolfSSL 0:1239e9b70ca2 10555 }
wolfSSL 0:1239e9b70ca2 10556
wolfSSL 0:1239e9b70ca2 10557
wolfSSL 0:1239e9b70ca2 10558 /* SSL_SUCCESS on ok */
wolfSSL 0:1239e9b70ca2 10559 int CyaSSL_RSA_generate_key_ex(CYASSL_RSA* rsa, int bits, CYASSL_BIGNUM* bn,
wolfSSL 0:1239e9b70ca2 10560 void* cb)
wolfSSL 0:1239e9b70ca2 10561 {
wolfSSL 0:1239e9b70ca2 10562 RNG rng;
wolfSSL 0:1239e9b70ca2 10563
wolfSSL 0:1239e9b70ca2 10564 CYASSL_MSG("CyaSSL_RSA_generate_key_ex");
wolfSSL 0:1239e9b70ca2 10565
wolfSSL 0:1239e9b70ca2 10566 (void)rsa;
wolfSSL 0:1239e9b70ca2 10567 (void)bits;
wolfSSL 0:1239e9b70ca2 10568 (void)cb;
wolfSSL 0:1239e9b70ca2 10569 (void)bn;
wolfSSL 0:1239e9b70ca2 10570
wolfSSL 0:1239e9b70ca2 10571 if (InitRng(&rng) < 0) {
wolfSSL 0:1239e9b70ca2 10572 CYASSL_MSG("RNG init failed");
wolfSSL 0:1239e9b70ca2 10573 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 10574 }
wolfSSL 0:1239e9b70ca2 10575
wolfSSL 0:1239e9b70ca2 10576 #ifdef CYASSL_KEY_GEN
wolfSSL 0:1239e9b70ca2 10577 if (MakeRsaKey((RsaKey*)rsa->internal, bits, 65537, &rng) < 0) {
wolfSSL 0:1239e9b70ca2 10578 CYASSL_MSG("MakeRsaKey failed");
wolfSSL 0:1239e9b70ca2 10579 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 10580 }
wolfSSL 0:1239e9b70ca2 10581
wolfSSL 0:1239e9b70ca2 10582 if (SetRsaExternal(rsa) < 0) {
wolfSSL 0:1239e9b70ca2 10583 CYASSL_MSG("SetRsaExternal failed");
wolfSSL 0:1239e9b70ca2 10584 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 10585 }
wolfSSL 0:1239e9b70ca2 10586
wolfSSL 0:1239e9b70ca2 10587 rsa->inSet = 1;
wolfSSL 0:1239e9b70ca2 10588
wolfSSL 0:1239e9b70ca2 10589 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 10590 #else
wolfSSL 0:1239e9b70ca2 10591 CYASSL_MSG("No Key Gen built in");
wolfSSL 0:1239e9b70ca2 10592 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 10593 #endif
wolfSSL 0:1239e9b70ca2 10594
wolfSSL 0:1239e9b70ca2 10595 }
wolfSSL 0:1239e9b70ca2 10596
wolfSSL 0:1239e9b70ca2 10597
wolfSSL 0:1239e9b70ca2 10598 /* SSL_SUCCESS on ok */
wolfSSL 0:1239e9b70ca2 10599 int CyaSSL_RSA_blinding_on(CYASSL_RSA* rsa, CYASSL_BN_CTX* bn)
wolfSSL 0:1239e9b70ca2 10600 {
wolfSSL 0:1239e9b70ca2 10601 (void)rsa;
wolfSSL 0:1239e9b70ca2 10602 (void)bn;
wolfSSL 0:1239e9b70ca2 10603
wolfSSL 0:1239e9b70ca2 10604 CYASSL_MSG("CyaSSL_RSA_blinding_on");
wolfSSL 0:1239e9b70ca2 10605
wolfSSL 0:1239e9b70ca2 10606 return SSL_SUCCESS; /* on by default */
wolfSSL 0:1239e9b70ca2 10607 }
wolfSSL 0:1239e9b70ca2 10608
wolfSSL 0:1239e9b70ca2 10609
wolfSSL 0:1239e9b70ca2 10610 int CyaSSL_RSA_public_encrypt(int len, unsigned char* fr,
wolfSSL 0:1239e9b70ca2 10611 unsigned char* to, CYASSL_RSA* rsa, int padding)
wolfSSL 0:1239e9b70ca2 10612 {
wolfSSL 0:1239e9b70ca2 10613 (void)len;
wolfSSL 0:1239e9b70ca2 10614 (void)fr;
wolfSSL 0:1239e9b70ca2 10615 (void)to;
wolfSSL 0:1239e9b70ca2 10616 (void)rsa;
wolfSSL 0:1239e9b70ca2 10617 (void)padding;
wolfSSL 0:1239e9b70ca2 10618
wolfSSL 0:1239e9b70ca2 10619 CYASSL_MSG("CyaSSL_RSA_public_encrypt");
wolfSSL 0:1239e9b70ca2 10620
wolfSSL 0:1239e9b70ca2 10621 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 10622 }
wolfSSL 0:1239e9b70ca2 10623
wolfSSL 0:1239e9b70ca2 10624
wolfSSL 0:1239e9b70ca2 10625 int CyaSSL_RSA_private_decrypt(int len, unsigned char* fr,
wolfSSL 0:1239e9b70ca2 10626 unsigned char* to, CYASSL_RSA* rsa, int padding)
wolfSSL 0:1239e9b70ca2 10627 {
wolfSSL 0:1239e9b70ca2 10628 (void)len;
wolfSSL 0:1239e9b70ca2 10629 (void)fr;
wolfSSL 0:1239e9b70ca2 10630 (void)to;
wolfSSL 0:1239e9b70ca2 10631 (void)rsa;
wolfSSL 0:1239e9b70ca2 10632 (void)padding;
wolfSSL 0:1239e9b70ca2 10633
wolfSSL 0:1239e9b70ca2 10634 CYASSL_MSG("CyaSSL_RSA_private_decrypt");
wolfSSL 0:1239e9b70ca2 10635
wolfSSL 0:1239e9b70ca2 10636 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 10637 }
wolfSSL 0:1239e9b70ca2 10638
wolfSSL 0:1239e9b70ca2 10639
wolfSSL 0:1239e9b70ca2 10640 int CyaSSL_RSA_size(const CYASSL_RSA* rsa)
wolfSSL 0:1239e9b70ca2 10641 {
wolfSSL 0:1239e9b70ca2 10642 CYASSL_MSG("CyaSSL_RSA_size");
wolfSSL 0:1239e9b70ca2 10643
wolfSSL 0:1239e9b70ca2 10644 if (rsa == NULL)
wolfSSL 0:1239e9b70ca2 10645 return 0;
wolfSSL 0:1239e9b70ca2 10646
wolfSSL 0:1239e9b70ca2 10647 return CyaSSL_BN_num_bytes(rsa->n);
wolfSSL 0:1239e9b70ca2 10648 }
wolfSSL 0:1239e9b70ca2 10649
wolfSSL 0:1239e9b70ca2 10650
wolfSSL 0:1239e9b70ca2 10651 #ifndef NO_DSA
wolfSSL 0:1239e9b70ca2 10652 /* return SSL_SUCCESS on success, < 0 otherwise */
wolfSSL 0:1239e9b70ca2 10653 int CyaSSL_DSA_do_sign(const unsigned char* d, unsigned char* sigRet,
wolfSSL 0:1239e9b70ca2 10654 CYASSL_DSA* dsa)
wolfSSL 0:1239e9b70ca2 10655 {
wolfSSL 0:1239e9b70ca2 10656 RNG tmpRNG;
wolfSSL 0:1239e9b70ca2 10657 RNG* rng = &tmpRNG;
wolfSSL 0:1239e9b70ca2 10658
wolfSSL 0:1239e9b70ca2 10659 CYASSL_MSG("CyaSSL_DSA_do_sign");
wolfSSL 0:1239e9b70ca2 10660
wolfSSL 0:1239e9b70ca2 10661 if (d == NULL || sigRet == NULL || dsa == NULL) {
wolfSSL 0:1239e9b70ca2 10662 CYASSL_MSG("Bad function arguments");
wolfSSL 0:1239e9b70ca2 10663 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 10664 }
wolfSSL 0:1239e9b70ca2 10665
wolfSSL 0:1239e9b70ca2 10666 if (dsa->inSet == 0) {
wolfSSL 0:1239e9b70ca2 10667 CYASSL_MSG("No DSA internal set");
wolfSSL 0:1239e9b70ca2 10668 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 10669 }
wolfSSL 0:1239e9b70ca2 10670
wolfSSL 0:1239e9b70ca2 10671 if (InitRng(&tmpRNG) != 0) {
wolfSSL 0:1239e9b70ca2 10672 CYASSL_MSG("Bad RNG Init, trying global");
wolfSSL 0:1239e9b70ca2 10673 if (initGlobalRNG == 0) {
wolfSSL 0:1239e9b70ca2 10674 CYASSL_MSG("Global RNG no Init");
wolfSSL 0:1239e9b70ca2 10675 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 10676 }
wolfSSL 0:1239e9b70ca2 10677 rng = &globalRNG;
wolfSSL 0:1239e9b70ca2 10678 }
wolfSSL 0:1239e9b70ca2 10679
wolfSSL 0:1239e9b70ca2 10680 if (DsaSign(d, sigRet, (DsaKey*)dsa->internal, rng) < 0) {
wolfSSL 0:1239e9b70ca2 10681 CYASSL_MSG("DsaSign failed");
wolfSSL 0:1239e9b70ca2 10682 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 10683 }
wolfSSL 0:1239e9b70ca2 10684
wolfSSL 0:1239e9b70ca2 10685 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 10686 }
wolfSSL 0:1239e9b70ca2 10687 #endif /* NO_DSA */
wolfSSL 0:1239e9b70ca2 10688
wolfSSL 0:1239e9b70ca2 10689
wolfSSL 0:1239e9b70ca2 10690 /* return SSL_SUCCES on ok, 0 otherwise */
wolfSSL 0:1239e9b70ca2 10691 int CyaSSL_RSA_sign(int type, const unsigned char* m,
wolfSSL 0:1239e9b70ca2 10692 unsigned int mLen, unsigned char* sigRet,
wolfSSL 0:1239e9b70ca2 10693 unsigned int* sigLen, CYASSL_RSA* rsa)
wolfSSL 0:1239e9b70ca2 10694 {
wolfSSL 0:1239e9b70ca2 10695 byte encodedSig[MAX_ENCODED_SIG_SZ];
wolfSSL 0:1239e9b70ca2 10696 word32 outLen;
wolfSSL 0:1239e9b70ca2 10697 word32 signSz;
wolfSSL 0:1239e9b70ca2 10698 RNG tmpRNG;
wolfSSL 0:1239e9b70ca2 10699 RNG* rng = &tmpRNG;
wolfSSL 0:1239e9b70ca2 10700
wolfSSL 0:1239e9b70ca2 10701 CYASSL_MSG("CyaSSL_RSA_sign");
wolfSSL 0:1239e9b70ca2 10702
wolfSSL 0:1239e9b70ca2 10703 if (m == NULL || sigRet == NULL || sigLen == NULL || rsa == NULL) {
wolfSSL 0:1239e9b70ca2 10704 CYASSL_MSG("Bad function arguments");
wolfSSL 0:1239e9b70ca2 10705 return 0;
wolfSSL 0:1239e9b70ca2 10706 }
wolfSSL 0:1239e9b70ca2 10707
wolfSSL 0:1239e9b70ca2 10708 if (rsa->inSet == 0) {
wolfSSL 0:1239e9b70ca2 10709 CYASSL_MSG("No RSA internal set");
wolfSSL 0:1239e9b70ca2 10710 return 0;
wolfSSL 0:1239e9b70ca2 10711 }
wolfSSL 0:1239e9b70ca2 10712
wolfSSL 0:1239e9b70ca2 10713 outLen = (word32)CyaSSL_BN_num_bytes(rsa->n);
wolfSSL 0:1239e9b70ca2 10714 if (outLen == 0) {
wolfSSL 0:1239e9b70ca2 10715 CYASSL_MSG("Bad RSA size");
wolfSSL 0:1239e9b70ca2 10716 return 0;
wolfSSL 0:1239e9b70ca2 10717 }
wolfSSL 0:1239e9b70ca2 10718
wolfSSL 0:1239e9b70ca2 10719 if (InitRng(&tmpRNG) != 0) {
wolfSSL 0:1239e9b70ca2 10720 CYASSL_MSG("Bad RNG Init, trying global");
wolfSSL 0:1239e9b70ca2 10721 if (initGlobalRNG == 0) {
wolfSSL 0:1239e9b70ca2 10722 CYASSL_MSG("Global RNG no Init");
wolfSSL 0:1239e9b70ca2 10723 return 0;
wolfSSL 0:1239e9b70ca2 10724 }
wolfSSL 0:1239e9b70ca2 10725 rng = &globalRNG;
wolfSSL 0:1239e9b70ca2 10726 }
wolfSSL 0:1239e9b70ca2 10727
wolfSSL 0:1239e9b70ca2 10728 switch (type) {
wolfSSL 0:1239e9b70ca2 10729 case NID_md5:
wolfSSL 0:1239e9b70ca2 10730 type = MD5h;
wolfSSL 0:1239e9b70ca2 10731 break;
wolfSSL 0:1239e9b70ca2 10732
wolfSSL 0:1239e9b70ca2 10733 case NID_sha1:
wolfSSL 0:1239e9b70ca2 10734 type = SHAh;
wolfSSL 0:1239e9b70ca2 10735 break;
wolfSSL 0:1239e9b70ca2 10736
wolfSSL 0:1239e9b70ca2 10737 default:
wolfSSL 0:1239e9b70ca2 10738 CYASSL_MSG("Bad md type");
wolfSSL 0:1239e9b70ca2 10739 return 0;
wolfSSL 0:1239e9b70ca2 10740 }
wolfSSL 0:1239e9b70ca2 10741
wolfSSL 0:1239e9b70ca2 10742 signSz = EncodeSignature(encodedSig, m, mLen, type);
wolfSSL 0:1239e9b70ca2 10743 if (signSz == 0) {
wolfSSL 0:1239e9b70ca2 10744 CYASSL_MSG("Bad Encode Signature");
wolfSSL 0:1239e9b70ca2 10745 return 0;
wolfSSL 0:1239e9b70ca2 10746 }
wolfSSL 0:1239e9b70ca2 10747
wolfSSL 0:1239e9b70ca2 10748 *sigLen = RsaSSL_Sign(encodedSig, signSz, sigRet, outLen,
wolfSSL 0:1239e9b70ca2 10749 (RsaKey*)rsa->internal, rng);
wolfSSL 0:1239e9b70ca2 10750 if (*sigLen <= 0) {
wolfSSL 0:1239e9b70ca2 10751 CYASSL_MSG("Bad Rsa Sign");
wolfSSL 0:1239e9b70ca2 10752 return 0;
wolfSSL 0:1239e9b70ca2 10753 }
wolfSSL 0:1239e9b70ca2 10754
wolfSSL 0:1239e9b70ca2 10755 CYASSL_MSG("CyaSSL_RSA_sign success");
wolfSSL 0:1239e9b70ca2 10756 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 10757 }
wolfSSL 0:1239e9b70ca2 10758
wolfSSL 0:1239e9b70ca2 10759
wolfSSL 0:1239e9b70ca2 10760 int CyaSSL_RSA_public_decrypt(int flen, unsigned char* from,
wolfSSL 0:1239e9b70ca2 10761 unsigned char* to, CYASSL_RSA* rsa, int padding)
wolfSSL 0:1239e9b70ca2 10762 {
wolfSSL 0:1239e9b70ca2 10763 (void)flen;
wolfSSL 0:1239e9b70ca2 10764 (void)from;
wolfSSL 0:1239e9b70ca2 10765 (void)to;
wolfSSL 0:1239e9b70ca2 10766 (void)rsa;
wolfSSL 0:1239e9b70ca2 10767 (void)padding;
wolfSSL 0:1239e9b70ca2 10768
wolfSSL 0:1239e9b70ca2 10769 CYASSL_MSG("CyaSSL_RSA_public_decrypt");
wolfSSL 0:1239e9b70ca2 10770
wolfSSL 0:1239e9b70ca2 10771 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 10772 }
wolfSSL 0:1239e9b70ca2 10773
wolfSSL 0:1239e9b70ca2 10774
wolfSSL 0:1239e9b70ca2 10775 /* generate p-1 and q-1, SSL_SUCCESS on ok */
wolfSSL 0:1239e9b70ca2 10776 int CyaSSL_RSA_GenAdd(CYASSL_RSA* rsa)
wolfSSL 0:1239e9b70ca2 10777 {
wolfSSL 0:1239e9b70ca2 10778 int err;
wolfSSL 0:1239e9b70ca2 10779 mp_int tmp;
wolfSSL 0:1239e9b70ca2 10780
wolfSSL 0:1239e9b70ca2 10781 CYASSL_MSG("CyaSSL_RsaGenAdd");
wolfSSL 0:1239e9b70ca2 10782
wolfSSL 0:1239e9b70ca2 10783 if (rsa == NULL || rsa->p == NULL || rsa->q == NULL || rsa->d == NULL ||
wolfSSL 0:1239e9b70ca2 10784 rsa->dmp1 == NULL || rsa->dmq1 == NULL) {
wolfSSL 0:1239e9b70ca2 10785 CYASSL_MSG("rsa no init error");
wolfSSL 0:1239e9b70ca2 10786 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 10787 }
wolfSSL 0:1239e9b70ca2 10788
wolfSSL 0:1239e9b70ca2 10789 if (mp_init(&tmp) != MP_OKAY) {
wolfSSL 0:1239e9b70ca2 10790 CYASSL_MSG("mp_init error");
wolfSSL 0:1239e9b70ca2 10791 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 10792 }
wolfSSL 0:1239e9b70ca2 10793
wolfSSL 0:1239e9b70ca2 10794 err = mp_sub_d((mp_int*)rsa->p->internal, 1, &tmp);
wolfSSL 0:1239e9b70ca2 10795 if (err != MP_OKAY) {
wolfSSL 0:1239e9b70ca2 10796 CYASSL_MSG("mp_sub_d error");
wolfSSL 0:1239e9b70ca2 10797 }
wolfSSL 0:1239e9b70ca2 10798 else
wolfSSL 0:1239e9b70ca2 10799 err = mp_mod((mp_int*)rsa->d->internal, &tmp,
wolfSSL 0:1239e9b70ca2 10800 (mp_int*)rsa->dmp1->internal);
wolfSSL 0:1239e9b70ca2 10801
wolfSSL 0:1239e9b70ca2 10802 if (err != MP_OKAY) {
wolfSSL 0:1239e9b70ca2 10803 CYASSL_MSG("mp_mod error");
wolfSSL 0:1239e9b70ca2 10804 }
wolfSSL 0:1239e9b70ca2 10805 else
wolfSSL 0:1239e9b70ca2 10806 err = mp_sub_d((mp_int*)rsa->q->internal, 1, &tmp);
wolfSSL 0:1239e9b70ca2 10807 if (err != MP_OKAY) {
wolfSSL 0:1239e9b70ca2 10808 CYASSL_MSG("mp_sub_d error");
wolfSSL 0:1239e9b70ca2 10809 }
wolfSSL 0:1239e9b70ca2 10810 else
wolfSSL 0:1239e9b70ca2 10811 err = mp_mod((mp_int*)rsa->d->internal, &tmp,
wolfSSL 0:1239e9b70ca2 10812 (mp_int*)rsa->dmq1->internal);
wolfSSL 0:1239e9b70ca2 10813
wolfSSL 0:1239e9b70ca2 10814 mp_clear(&tmp);
wolfSSL 0:1239e9b70ca2 10815
wolfSSL 0:1239e9b70ca2 10816 if (err == MP_OKAY)
wolfSSL 0:1239e9b70ca2 10817 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 10818 else
wolfSSL 0:1239e9b70ca2 10819 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 10820 }
wolfSSL 0:1239e9b70ca2 10821
wolfSSL 0:1239e9b70ca2 10822
wolfSSL 0:1239e9b70ca2 10823 void CyaSSL_HMAC_Init(CYASSL_HMAC_CTX* ctx, const void* key, int keylen,
wolfSSL 0:1239e9b70ca2 10824 const EVP_MD* type)
wolfSSL 0:1239e9b70ca2 10825 {
wolfSSL 0:1239e9b70ca2 10826 CYASSL_MSG("CyaSSL_HMAC_Init");
wolfSSL 0:1239e9b70ca2 10827
wolfSSL 0:1239e9b70ca2 10828 if (ctx == NULL) {
wolfSSL 0:1239e9b70ca2 10829 CYASSL_MSG("no ctx on init");
wolfSSL 0:1239e9b70ca2 10830 return;
wolfSSL 0:1239e9b70ca2 10831 }
wolfSSL 0:1239e9b70ca2 10832
wolfSSL 0:1239e9b70ca2 10833 if (type) {
wolfSSL 0:1239e9b70ca2 10834 CYASSL_MSG("init has type");
wolfSSL 0:1239e9b70ca2 10835
wolfSSL 0:1239e9b70ca2 10836 if (XSTRNCMP(type, "MD5", 3) == 0) {
wolfSSL 0:1239e9b70ca2 10837 CYASSL_MSG("md5 hmac");
wolfSSL 0:1239e9b70ca2 10838 ctx->type = MD5;
wolfSSL 0:1239e9b70ca2 10839 }
wolfSSL 0:1239e9b70ca2 10840 else if (XSTRNCMP(type, "SHA256", 6) == 0) {
wolfSSL 0:1239e9b70ca2 10841 CYASSL_MSG("sha256 hmac");
wolfSSL 0:1239e9b70ca2 10842 ctx->type = SHA256;
wolfSSL 0:1239e9b70ca2 10843 }
wolfSSL 0:1239e9b70ca2 10844
wolfSSL 0:1239e9b70ca2 10845 /* has to be last since would pick or 256, 384, or 512 too */
wolfSSL 0:1239e9b70ca2 10846 else if (XSTRNCMP(type, "SHA", 3) == 0) {
wolfSSL 0:1239e9b70ca2 10847 CYASSL_MSG("sha hmac");
wolfSSL 0:1239e9b70ca2 10848 ctx->type = SHA;
wolfSSL 0:1239e9b70ca2 10849 }
wolfSSL 0:1239e9b70ca2 10850 else {
wolfSSL 0:1239e9b70ca2 10851 CYASSL_MSG("bad init type");
wolfSSL 0:1239e9b70ca2 10852 }
wolfSSL 0:1239e9b70ca2 10853 }
wolfSSL 0:1239e9b70ca2 10854
wolfSSL 0:1239e9b70ca2 10855 if (key && keylen) {
wolfSSL 0:1239e9b70ca2 10856 CYASSL_MSG("keying hmac");
wolfSSL 0:1239e9b70ca2 10857 HmacSetKey(&ctx->hmac, ctx->type, (const byte*)key, (word32)keylen);
wolfSSL 0:1239e9b70ca2 10858 /* OpenSSL compat, no error */
wolfSSL 0:1239e9b70ca2 10859 }
wolfSSL 0:1239e9b70ca2 10860 }
wolfSSL 0:1239e9b70ca2 10861
wolfSSL 0:1239e9b70ca2 10862
wolfSSL 0:1239e9b70ca2 10863 void CyaSSL_HMAC_Update(CYASSL_HMAC_CTX* ctx, const unsigned char* data,
wolfSSL 0:1239e9b70ca2 10864 int len)
wolfSSL 0:1239e9b70ca2 10865 {
wolfSSL 0:1239e9b70ca2 10866 CYASSL_MSG("CyaSSL_HMAC_Update");
wolfSSL 0:1239e9b70ca2 10867
wolfSSL 0:1239e9b70ca2 10868 if (ctx && data) {
wolfSSL 0:1239e9b70ca2 10869 CYASSL_MSG("updating hmac");
wolfSSL 0:1239e9b70ca2 10870 HmacUpdate(&ctx->hmac, data, (word32)len);
wolfSSL 0:1239e9b70ca2 10871 /* OpenSSL compat, no error */
wolfSSL 0:1239e9b70ca2 10872 }
wolfSSL 0:1239e9b70ca2 10873 }
wolfSSL 0:1239e9b70ca2 10874
wolfSSL 0:1239e9b70ca2 10875
wolfSSL 0:1239e9b70ca2 10876 void CyaSSL_HMAC_Final(CYASSL_HMAC_CTX* ctx, unsigned char* hash,
wolfSSL 0:1239e9b70ca2 10877 unsigned int* len)
wolfSSL 0:1239e9b70ca2 10878 {
wolfSSL 0:1239e9b70ca2 10879 CYASSL_MSG("CyaSSL_HMAC_Final");
wolfSSL 0:1239e9b70ca2 10880
wolfSSL 0:1239e9b70ca2 10881 if (ctx && hash) {
wolfSSL 0:1239e9b70ca2 10882 CYASSL_MSG("final hmac");
wolfSSL 0:1239e9b70ca2 10883 HmacFinal(&ctx->hmac, hash);
wolfSSL 0:1239e9b70ca2 10884 /* OpenSSL compat, no error */
wolfSSL 0:1239e9b70ca2 10885
wolfSSL 0:1239e9b70ca2 10886 if (len) {
wolfSSL 0:1239e9b70ca2 10887 CYASSL_MSG("setting output len");
wolfSSL 0:1239e9b70ca2 10888 switch (ctx->type) {
wolfSSL 0:1239e9b70ca2 10889 case MD5:
wolfSSL 0:1239e9b70ca2 10890 *len = MD5_DIGEST_SIZE;
wolfSSL 0:1239e9b70ca2 10891 break;
wolfSSL 0:1239e9b70ca2 10892
wolfSSL 0:1239e9b70ca2 10893 case SHA:
wolfSSL 0:1239e9b70ca2 10894 *len = SHA_DIGEST_SIZE;
wolfSSL 0:1239e9b70ca2 10895 break;
wolfSSL 0:1239e9b70ca2 10896
wolfSSL 0:1239e9b70ca2 10897 case SHA256:
wolfSSL 0:1239e9b70ca2 10898 *len = SHA256_DIGEST_SIZE;
wolfSSL 0:1239e9b70ca2 10899 break;
wolfSSL 0:1239e9b70ca2 10900
wolfSSL 0:1239e9b70ca2 10901 default:
wolfSSL 0:1239e9b70ca2 10902 CYASSL_MSG("bad hmac type");
wolfSSL 0:1239e9b70ca2 10903 }
wolfSSL 0:1239e9b70ca2 10904 }
wolfSSL 0:1239e9b70ca2 10905 }
wolfSSL 0:1239e9b70ca2 10906 }
wolfSSL 0:1239e9b70ca2 10907
wolfSSL 0:1239e9b70ca2 10908
wolfSSL 0:1239e9b70ca2 10909 void CyaSSL_HMAC_cleanup(CYASSL_HMAC_CTX* ctx)
wolfSSL 0:1239e9b70ca2 10910 {
wolfSSL 0:1239e9b70ca2 10911 (void)ctx;
wolfSSL 0:1239e9b70ca2 10912
wolfSSL 0:1239e9b70ca2 10913 CYASSL_MSG("CyaSSL_HMAC_cleanup");
wolfSSL 0:1239e9b70ca2 10914 }
wolfSSL 0:1239e9b70ca2 10915
wolfSSL 0:1239e9b70ca2 10916
wolfSSL 0:1239e9b70ca2 10917 const CYASSL_EVP_MD* CyaSSL_EVP_get_digestbynid(int id)
wolfSSL 0:1239e9b70ca2 10918 {
wolfSSL 0:1239e9b70ca2 10919 CYASSL_MSG("CyaSSL_get_digestbynid");
wolfSSL 0:1239e9b70ca2 10920
wolfSSL 0:1239e9b70ca2 10921 switch(id) {
wolfSSL 0:1239e9b70ca2 10922 case NID_md5:
wolfSSL 0:1239e9b70ca2 10923 return CyaSSL_EVP_md5();
wolfSSL 0:1239e9b70ca2 10924
wolfSSL 0:1239e9b70ca2 10925 case NID_sha1:
wolfSSL 0:1239e9b70ca2 10926 return CyaSSL_EVP_sha1();
wolfSSL 0:1239e9b70ca2 10927
wolfSSL 0:1239e9b70ca2 10928 default:
wolfSSL 0:1239e9b70ca2 10929 CYASSL_MSG("Bad digest id value");
wolfSSL 0:1239e9b70ca2 10930 }
wolfSSL 0:1239e9b70ca2 10931
wolfSSL 0:1239e9b70ca2 10932 return NULL;
wolfSSL 0:1239e9b70ca2 10933 }
wolfSSL 0:1239e9b70ca2 10934
wolfSSL 0:1239e9b70ca2 10935
wolfSSL 0:1239e9b70ca2 10936 CYASSL_RSA* CyaSSL_EVP_PKEY_get1_RSA(CYASSL_EVP_PKEY* key)
wolfSSL 0:1239e9b70ca2 10937 {
wolfSSL 0:1239e9b70ca2 10938 (void)key;
wolfSSL 0:1239e9b70ca2 10939 CYASSL_MSG("CyaSSL_EVP_PKEY_get1_RSA");
wolfSSL 0:1239e9b70ca2 10940
wolfSSL 0:1239e9b70ca2 10941 return NULL;
wolfSSL 0:1239e9b70ca2 10942 }
wolfSSL 0:1239e9b70ca2 10943
wolfSSL 0:1239e9b70ca2 10944
wolfSSL 0:1239e9b70ca2 10945 CYASSL_DSA* CyaSSL_EVP_PKEY_get1_DSA(CYASSL_EVP_PKEY* key)
wolfSSL 0:1239e9b70ca2 10946 {
wolfSSL 0:1239e9b70ca2 10947 (void)key;
wolfSSL 0:1239e9b70ca2 10948 CYASSL_MSG("CyaSSL_EVP_PKEY_get1_DSA");
wolfSSL 0:1239e9b70ca2 10949
wolfSSL 0:1239e9b70ca2 10950 return NULL;
wolfSSL 0:1239e9b70ca2 10951 }
wolfSSL 0:1239e9b70ca2 10952
wolfSSL 0:1239e9b70ca2 10953
wolfSSL 0:1239e9b70ca2 10954 void* CyaSSL_EVP_X_STATE(const CYASSL_EVP_CIPHER_CTX* ctx)
wolfSSL 0:1239e9b70ca2 10955 {
wolfSSL 0:1239e9b70ca2 10956 CYASSL_MSG("CyaSSL_EVP_X_STATE");
wolfSSL 0:1239e9b70ca2 10957
wolfSSL 0:1239e9b70ca2 10958 if (ctx) {
wolfSSL 0:1239e9b70ca2 10959 switch (ctx->cipherType) {
wolfSSL 0:1239e9b70ca2 10960 case ARC4_TYPE:
wolfSSL 0:1239e9b70ca2 10961 CYASSL_MSG("returning arc4 state");
wolfSSL 0:1239e9b70ca2 10962 return (void*)&ctx->cipher.arc4.x;
wolfSSL 0:1239e9b70ca2 10963
wolfSSL 0:1239e9b70ca2 10964 default:
wolfSSL 0:1239e9b70ca2 10965 CYASSL_MSG("bad x state type");
wolfSSL 0:1239e9b70ca2 10966 return 0;
wolfSSL 0:1239e9b70ca2 10967 }
wolfSSL 0:1239e9b70ca2 10968 }
wolfSSL 0:1239e9b70ca2 10969
wolfSSL 0:1239e9b70ca2 10970 return NULL;
wolfSSL 0:1239e9b70ca2 10971 }
wolfSSL 0:1239e9b70ca2 10972
wolfSSL 0:1239e9b70ca2 10973
wolfSSL 0:1239e9b70ca2 10974 int CyaSSL_EVP_X_STATE_LEN(const CYASSL_EVP_CIPHER_CTX* ctx)
wolfSSL 0:1239e9b70ca2 10975 {
wolfSSL 0:1239e9b70ca2 10976 CYASSL_MSG("CyaSSL_EVP_X_STATE_LEN");
wolfSSL 0:1239e9b70ca2 10977
wolfSSL 0:1239e9b70ca2 10978 if (ctx) {
wolfSSL 0:1239e9b70ca2 10979 switch (ctx->cipherType) {
wolfSSL 0:1239e9b70ca2 10980 case ARC4_TYPE:
wolfSSL 0:1239e9b70ca2 10981 CYASSL_MSG("returning arc4 state size");
wolfSSL 0:1239e9b70ca2 10982 return sizeof(Arc4);
wolfSSL 0:1239e9b70ca2 10983
wolfSSL 0:1239e9b70ca2 10984 default:
wolfSSL 0:1239e9b70ca2 10985 CYASSL_MSG("bad x state type");
wolfSSL 0:1239e9b70ca2 10986 return 0;
wolfSSL 0:1239e9b70ca2 10987 }
wolfSSL 0:1239e9b70ca2 10988 }
wolfSSL 0:1239e9b70ca2 10989
wolfSSL 0:1239e9b70ca2 10990 return 0;
wolfSSL 0:1239e9b70ca2 10991 }
wolfSSL 0:1239e9b70ca2 10992
wolfSSL 0:1239e9b70ca2 10993
wolfSSL 0:1239e9b70ca2 10994 void CyaSSL_3des_iv(CYASSL_EVP_CIPHER_CTX* ctx, int doset,
wolfSSL 0:1239e9b70ca2 10995 unsigned char* iv, int len)
wolfSSL 0:1239e9b70ca2 10996 {
wolfSSL 0:1239e9b70ca2 10997 (void)len;
wolfSSL 0:1239e9b70ca2 10998
wolfSSL 0:1239e9b70ca2 10999 CYASSL_MSG("CyaSSL_3des_iv");
wolfSSL 0:1239e9b70ca2 11000
wolfSSL 0:1239e9b70ca2 11001 if (ctx == NULL || iv == NULL) {
wolfSSL 0:1239e9b70ca2 11002 CYASSL_MSG("Bad function argument");
wolfSSL 0:1239e9b70ca2 11003 return;
wolfSSL 0:1239e9b70ca2 11004 }
wolfSSL 0:1239e9b70ca2 11005
wolfSSL 0:1239e9b70ca2 11006 if (doset)
wolfSSL 0:1239e9b70ca2 11007 Des3_SetIV(&ctx->cipher.des3, iv); /* OpenSSL compat, no ret */
wolfSSL 0:1239e9b70ca2 11008 else
wolfSSL 0:1239e9b70ca2 11009 memcpy(iv, &ctx->cipher.des3.reg, DES_BLOCK_SIZE);
wolfSSL 0:1239e9b70ca2 11010 }
wolfSSL 0:1239e9b70ca2 11011
wolfSSL 0:1239e9b70ca2 11012
wolfSSL 0:1239e9b70ca2 11013 void CyaSSL_aes_ctr_iv(CYASSL_EVP_CIPHER_CTX* ctx, int doset,
wolfSSL 0:1239e9b70ca2 11014 unsigned char* iv, int len)
wolfSSL 0:1239e9b70ca2 11015 {
wolfSSL 0:1239e9b70ca2 11016 (void)len;
wolfSSL 0:1239e9b70ca2 11017
wolfSSL 0:1239e9b70ca2 11018 CYASSL_MSG("CyaSSL_aes_ctr_iv");
wolfSSL 0:1239e9b70ca2 11019
wolfSSL 0:1239e9b70ca2 11020 if (ctx == NULL || iv == NULL) {
wolfSSL 0:1239e9b70ca2 11021 CYASSL_MSG("Bad function argument");
wolfSSL 0:1239e9b70ca2 11022 return;
wolfSSL 0:1239e9b70ca2 11023 }
wolfSSL 0:1239e9b70ca2 11024
wolfSSL 0:1239e9b70ca2 11025 if (doset)
wolfSSL 0:1239e9b70ca2 11026 AesSetIV(&ctx->cipher.aes, iv); /* OpenSSL compat, no ret */
wolfSSL 0:1239e9b70ca2 11027 else
wolfSSL 0:1239e9b70ca2 11028 memcpy(iv, &ctx->cipher.aes.reg, AES_BLOCK_SIZE);
wolfSSL 0:1239e9b70ca2 11029 }
wolfSSL 0:1239e9b70ca2 11030
wolfSSL 0:1239e9b70ca2 11031
wolfSSL 0:1239e9b70ca2 11032 const CYASSL_EVP_MD* CyaSSL_EVP_ripemd160(void)
wolfSSL 0:1239e9b70ca2 11033 {
wolfSSL 0:1239e9b70ca2 11034 CYASSL_MSG("CyaSSL_ripemd160");
wolfSSL 0:1239e9b70ca2 11035
wolfSSL 0:1239e9b70ca2 11036 return NULL;
wolfSSL 0:1239e9b70ca2 11037 }
wolfSSL 0:1239e9b70ca2 11038
wolfSSL 0:1239e9b70ca2 11039
wolfSSL 0:1239e9b70ca2 11040 int CyaSSL_EVP_MD_size(const CYASSL_EVP_MD* type)
wolfSSL 0:1239e9b70ca2 11041 {
wolfSSL 0:1239e9b70ca2 11042 CYASSL_MSG("CyaSSL_EVP_MD_size");
wolfSSL 0:1239e9b70ca2 11043
wolfSSL 0:1239e9b70ca2 11044 if (type == NULL) {
wolfSSL 0:1239e9b70ca2 11045 CYASSL_MSG("No md type arg");
wolfSSL 0:1239e9b70ca2 11046 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 11047 }
wolfSSL 0:1239e9b70ca2 11048
wolfSSL 0:1239e9b70ca2 11049 if (XSTRNCMP(type, "MD5", 3) == 0) {
wolfSSL 0:1239e9b70ca2 11050 return MD5_DIGEST_SIZE;
wolfSSL 0:1239e9b70ca2 11051 }
wolfSSL 0:1239e9b70ca2 11052 else if (XSTRNCMP(type, "SHA256", 6) == 0) {
wolfSSL 0:1239e9b70ca2 11053 return SHA256_DIGEST_SIZE;
wolfSSL 0:1239e9b70ca2 11054 }
wolfSSL 0:1239e9b70ca2 11055 #ifdef CYASSL_SHA384
wolfSSL 0:1239e9b70ca2 11056 else if (XSTRNCMP(type, "SHA384", 6) == 0) {
wolfSSL 0:1239e9b70ca2 11057 return SHA384_DIGEST_SIZE;
wolfSSL 0:1239e9b70ca2 11058 }
wolfSSL 0:1239e9b70ca2 11059 #endif
wolfSSL 0:1239e9b70ca2 11060 #ifdef CYASSL_SHA512
wolfSSL 0:1239e9b70ca2 11061 else if (XSTRNCMP(type, "SHA512", 6) == 0) {
wolfSSL 0:1239e9b70ca2 11062 return SHA512_DIGEST_SIZE;
wolfSSL 0:1239e9b70ca2 11063 }
wolfSSL 0:1239e9b70ca2 11064 #endif
wolfSSL 0:1239e9b70ca2 11065 /* has to be last since would pick or 256, 384, or 512 too */
wolfSSL 0:1239e9b70ca2 11066 else if (XSTRNCMP(type, "SHA", 3) == 0) {
wolfSSL 0:1239e9b70ca2 11067 return SHA_DIGEST_SIZE;
wolfSSL 0:1239e9b70ca2 11068 }
wolfSSL 0:1239e9b70ca2 11069
wolfSSL 0:1239e9b70ca2 11070 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 11071 }
wolfSSL 0:1239e9b70ca2 11072
wolfSSL 0:1239e9b70ca2 11073
wolfSSL 0:1239e9b70ca2 11074 int CyaSSL_EVP_CIPHER_CTX_iv_length(const CYASSL_EVP_CIPHER_CTX* ctx)
wolfSSL 0:1239e9b70ca2 11075 {
wolfSSL 0:1239e9b70ca2 11076 CYASSL_MSG("CyaSSL_EVP_CIPHER_CTX_iv_length");
wolfSSL 0:1239e9b70ca2 11077
wolfSSL 0:1239e9b70ca2 11078 switch (ctx->cipherType) {
wolfSSL 0:1239e9b70ca2 11079
wolfSSL 0:1239e9b70ca2 11080 case AES_128_CBC_TYPE :
wolfSSL 0:1239e9b70ca2 11081 case AES_192_CBC_TYPE :
wolfSSL 0:1239e9b70ca2 11082 case AES_256_CBC_TYPE :
wolfSSL 0:1239e9b70ca2 11083 CYASSL_MSG("AES CBC");
wolfSSL 0:1239e9b70ca2 11084 return AES_BLOCK_SIZE;
wolfSSL 0:1239e9b70ca2 11085
wolfSSL 0:1239e9b70ca2 11086 #ifdef CYASSL_AES_COUNTER
wolfSSL 0:1239e9b70ca2 11087 case AES_128_CTR_TYPE :
wolfSSL 0:1239e9b70ca2 11088 case AES_192_CTR_TYPE :
wolfSSL 0:1239e9b70ca2 11089 case AES_256_CTR_TYPE :
wolfSSL 0:1239e9b70ca2 11090 CYASSL_MSG("AES CTR");
wolfSSL 0:1239e9b70ca2 11091 return AES_BLOCK_SIZE;
wolfSSL 0:1239e9b70ca2 11092 #endif
wolfSSL 0:1239e9b70ca2 11093
wolfSSL 0:1239e9b70ca2 11094 case DES_CBC_TYPE :
wolfSSL 0:1239e9b70ca2 11095 CYASSL_MSG("DES CBC");
wolfSSL 0:1239e9b70ca2 11096 return DES_BLOCK_SIZE;
wolfSSL 0:1239e9b70ca2 11097
wolfSSL 0:1239e9b70ca2 11098 case DES_EDE3_CBC_TYPE :
wolfSSL 0:1239e9b70ca2 11099 CYASSL_MSG("DES EDE3 CBC");
wolfSSL 0:1239e9b70ca2 11100 return DES_BLOCK_SIZE;
wolfSSL 0:1239e9b70ca2 11101
wolfSSL 0:1239e9b70ca2 11102 case ARC4_TYPE :
wolfSSL 0:1239e9b70ca2 11103 CYASSL_MSG("ARC4");
wolfSSL 0:1239e9b70ca2 11104 return 0;
wolfSSL 0:1239e9b70ca2 11105
wolfSSL 0:1239e9b70ca2 11106 case NULL_CIPHER_TYPE :
wolfSSL 0:1239e9b70ca2 11107 CYASSL_MSG("NULL");
wolfSSL 0:1239e9b70ca2 11108 return 0;
wolfSSL 0:1239e9b70ca2 11109
wolfSSL 0:1239e9b70ca2 11110 default: {
wolfSSL 0:1239e9b70ca2 11111 CYASSL_MSG("bad type");
wolfSSL 0:1239e9b70ca2 11112 }
wolfSSL 0:1239e9b70ca2 11113 }
wolfSSL 0:1239e9b70ca2 11114 return 0;
wolfSSL 0:1239e9b70ca2 11115 }
wolfSSL 0:1239e9b70ca2 11116
wolfSSL 0:1239e9b70ca2 11117
wolfSSL 0:1239e9b70ca2 11118 void CyaSSL_OPENSSL_free(void* p)
wolfSSL 0:1239e9b70ca2 11119 {
wolfSSL 0:1239e9b70ca2 11120 CYASSL_MSG("CyaSSL_OPENSSL_free");
wolfSSL 0:1239e9b70ca2 11121
wolfSSL 0:1239e9b70ca2 11122 XFREE(p, NULL, 0);
wolfSSL 0:1239e9b70ca2 11123 }
wolfSSL 0:1239e9b70ca2 11124
wolfSSL 0:1239e9b70ca2 11125
wolfSSL 0:1239e9b70ca2 11126 int CyaSSL_PEM_write_bio_RSAPrivateKey(CYASSL_BIO* bio, RSA* rsa,
wolfSSL 0:1239e9b70ca2 11127 const EVP_CIPHER* cipher,
wolfSSL 0:1239e9b70ca2 11128 unsigned char* passwd, int len,
wolfSSL 0:1239e9b70ca2 11129 pem_password_cb cb, void* arg)
wolfSSL 0:1239e9b70ca2 11130 {
wolfSSL 0:1239e9b70ca2 11131 (void)bio;
wolfSSL 0:1239e9b70ca2 11132 (void)rsa;
wolfSSL 0:1239e9b70ca2 11133 (void)cipher;
wolfSSL 0:1239e9b70ca2 11134 (void)passwd;
wolfSSL 0:1239e9b70ca2 11135 (void)len;
wolfSSL 0:1239e9b70ca2 11136 (void)cb;
wolfSSL 0:1239e9b70ca2 11137 (void)arg;
wolfSSL 0:1239e9b70ca2 11138
wolfSSL 0:1239e9b70ca2 11139 CYASSL_MSG("CyaSSL_PEM_write_bio_RSAPrivateKey");
wolfSSL 0:1239e9b70ca2 11140
wolfSSL 0:1239e9b70ca2 11141 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 11142 }
wolfSSL 0:1239e9b70ca2 11143
wolfSSL 0:1239e9b70ca2 11144
wolfSSL 0:1239e9b70ca2 11145
wolfSSL 0:1239e9b70ca2 11146 int CyaSSL_PEM_write_bio_DSAPrivateKey(CYASSL_BIO* bio, DSA* rsa,
wolfSSL 0:1239e9b70ca2 11147 const EVP_CIPHER* cipher,
wolfSSL 0:1239e9b70ca2 11148 unsigned char* passwd, int len,
wolfSSL 0:1239e9b70ca2 11149 pem_password_cb cb, void* arg)
wolfSSL 0:1239e9b70ca2 11150 {
wolfSSL 0:1239e9b70ca2 11151 (void)bio;
wolfSSL 0:1239e9b70ca2 11152 (void)rsa;
wolfSSL 0:1239e9b70ca2 11153 (void)cipher;
wolfSSL 0:1239e9b70ca2 11154 (void)passwd;
wolfSSL 0:1239e9b70ca2 11155 (void)len;
wolfSSL 0:1239e9b70ca2 11156 (void)cb;
wolfSSL 0:1239e9b70ca2 11157 (void)arg;
wolfSSL 0:1239e9b70ca2 11158
wolfSSL 0:1239e9b70ca2 11159 CYASSL_MSG("CyaSSL_PEM_write_bio_DSAPrivateKey");
wolfSSL 0:1239e9b70ca2 11160
wolfSSL 0:1239e9b70ca2 11161 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 11162 }
wolfSSL 0:1239e9b70ca2 11163
wolfSSL 0:1239e9b70ca2 11164
wolfSSL 0:1239e9b70ca2 11165
wolfSSL 0:1239e9b70ca2 11166 CYASSL_EVP_PKEY* CyaSSL_PEM_read_bio_PrivateKey(CYASSL_BIO* bio,
wolfSSL 0:1239e9b70ca2 11167 CYASSL_EVP_PKEY** key, pem_password_cb cb, void* arg)
wolfSSL 0:1239e9b70ca2 11168 {
wolfSSL 0:1239e9b70ca2 11169 (void)bio;
wolfSSL 0:1239e9b70ca2 11170 (void)key;
wolfSSL 0:1239e9b70ca2 11171 (void)cb;
wolfSSL 0:1239e9b70ca2 11172 (void)arg;
wolfSSL 0:1239e9b70ca2 11173
wolfSSL 0:1239e9b70ca2 11174 CYASSL_MSG("CyaSSL_PEM_read_bio_PrivateKey");
wolfSSL 0:1239e9b70ca2 11175
wolfSSL 0:1239e9b70ca2 11176 return NULL;
wolfSSL 0:1239e9b70ca2 11177 }
wolfSSL 0:1239e9b70ca2 11178
wolfSSL 0:1239e9b70ca2 11179
wolfSSL 0:1239e9b70ca2 11180
wolfSSL 0:1239e9b70ca2 11181
wolfSSL 0:1239e9b70ca2 11182 /* Load RSA from Der, SSL_SUCCESS on success < 0 on error */
wolfSSL 0:1239e9b70ca2 11183 int CyaSSL_RSA_LoadDer(CYASSL_RSA* rsa, const unsigned char* der, int derSz)
wolfSSL 0:1239e9b70ca2 11184 {
wolfSSL 0:1239e9b70ca2 11185 word32 idx = 0;
wolfSSL 0:1239e9b70ca2 11186 int ret;
wolfSSL 0:1239e9b70ca2 11187
wolfSSL 0:1239e9b70ca2 11188 CYASSL_ENTER("CyaSSL_RSA_LoadDer");
wolfSSL 0:1239e9b70ca2 11189
wolfSSL 0:1239e9b70ca2 11190 if (rsa == NULL || rsa->internal == NULL || der == NULL || derSz <= 0) {
wolfSSL 0:1239e9b70ca2 11191 CYASSL_MSG("Bad function arguments");
wolfSSL 0:1239e9b70ca2 11192 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 11193 }
wolfSSL 0:1239e9b70ca2 11194
wolfSSL 0:1239e9b70ca2 11195 ret = RsaPrivateKeyDecode(der, &idx, (RsaKey*)rsa->internal, derSz);
wolfSSL 0:1239e9b70ca2 11196 if (ret < 0) {
wolfSSL 0:1239e9b70ca2 11197 CYASSL_MSG("RsaPrivateKeyDecode failed");
wolfSSL 0:1239e9b70ca2 11198 return ret;
wolfSSL 0:1239e9b70ca2 11199 }
wolfSSL 0:1239e9b70ca2 11200
wolfSSL 0:1239e9b70ca2 11201 if (SetRsaExternal(rsa) < 0) {
wolfSSL 0:1239e9b70ca2 11202 CYASSL_MSG("SetRsaExternal failed");
wolfSSL 0:1239e9b70ca2 11203 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 11204 }
wolfSSL 0:1239e9b70ca2 11205
wolfSSL 0:1239e9b70ca2 11206 rsa->inSet = 1;
wolfSSL 0:1239e9b70ca2 11207
wolfSSL 0:1239e9b70ca2 11208 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 11209 }
wolfSSL 0:1239e9b70ca2 11210
wolfSSL 0:1239e9b70ca2 11211
wolfSSL 0:1239e9b70ca2 11212 #ifndef NO_DSA
wolfSSL 0:1239e9b70ca2 11213 /* Load DSA from Der, SSL_SUCCESS on success < 0 on error */
wolfSSL 0:1239e9b70ca2 11214 int CyaSSL_DSA_LoadDer(CYASSL_DSA* dsa, const unsigned char* der, int derSz)
wolfSSL 0:1239e9b70ca2 11215 {
wolfSSL 0:1239e9b70ca2 11216 word32 idx = 0;
wolfSSL 0:1239e9b70ca2 11217 int ret;
wolfSSL 0:1239e9b70ca2 11218
wolfSSL 0:1239e9b70ca2 11219 CYASSL_ENTER("CyaSSL_DSA_LoadDer");
wolfSSL 0:1239e9b70ca2 11220
wolfSSL 0:1239e9b70ca2 11221 if (dsa == NULL || dsa->internal == NULL || der == NULL || derSz <= 0) {
wolfSSL 0:1239e9b70ca2 11222 CYASSL_MSG("Bad function arguments");
wolfSSL 0:1239e9b70ca2 11223 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 11224 }
wolfSSL 0:1239e9b70ca2 11225
wolfSSL 0:1239e9b70ca2 11226 ret = DsaPrivateKeyDecode(der, &idx, (DsaKey*)dsa->internal, derSz);
wolfSSL 0:1239e9b70ca2 11227 if (ret < 0) {
wolfSSL 0:1239e9b70ca2 11228 CYASSL_MSG("DsaPrivateKeyDecode failed");
wolfSSL 0:1239e9b70ca2 11229 return ret;
wolfSSL 0:1239e9b70ca2 11230 }
wolfSSL 0:1239e9b70ca2 11231
wolfSSL 0:1239e9b70ca2 11232 if (SetDsaExternal(dsa) < 0) {
wolfSSL 0:1239e9b70ca2 11233 CYASSL_MSG("SetDsaExternal failed");
wolfSSL 0:1239e9b70ca2 11234 return SSL_FATAL_ERROR;
wolfSSL 0:1239e9b70ca2 11235 }
wolfSSL 0:1239e9b70ca2 11236
wolfSSL 0:1239e9b70ca2 11237 dsa->inSet = 1;
wolfSSL 0:1239e9b70ca2 11238
wolfSSL 0:1239e9b70ca2 11239 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 11240 }
wolfSSL 0:1239e9b70ca2 11241 #endif /* NO_DSA */
wolfSSL 0:1239e9b70ca2 11242
wolfSSL 0:1239e9b70ca2 11243
wolfSSL 0:1239e9b70ca2 11244
wolfSSL 0:1239e9b70ca2 11245
wolfSSL 0:1239e9b70ca2 11246 #endif /* OPENSSL_EXTRA */
wolfSSL 0:1239e9b70ca2 11247
wolfSSL 0:1239e9b70ca2 11248
wolfSSL 0:1239e9b70ca2 11249 #ifdef SESSION_CERTS
wolfSSL 0:1239e9b70ca2 11250
wolfSSL 0:1239e9b70ca2 11251
wolfSSL 0:1239e9b70ca2 11252 /* Get peer's certificate chain */
wolfSSL 0:1239e9b70ca2 11253 CYASSL_X509_CHAIN* CyaSSL_get_peer_chain(CYASSL* ssl)
wolfSSL 0:1239e9b70ca2 11254 {
wolfSSL 0:1239e9b70ca2 11255 CYASSL_ENTER("CyaSSL_get_peer_chain");
wolfSSL 0:1239e9b70ca2 11256 if (ssl)
wolfSSL 0:1239e9b70ca2 11257 return &ssl->session.chain;
wolfSSL 0:1239e9b70ca2 11258
wolfSSL 0:1239e9b70ca2 11259 return 0;
wolfSSL 0:1239e9b70ca2 11260 }
wolfSSL 0:1239e9b70ca2 11261
wolfSSL 0:1239e9b70ca2 11262
wolfSSL 0:1239e9b70ca2 11263 /* Get peer's certificate chain total count */
wolfSSL 0:1239e9b70ca2 11264 int CyaSSL_get_chain_count(CYASSL_X509_CHAIN* chain)
wolfSSL 0:1239e9b70ca2 11265 {
wolfSSL 0:1239e9b70ca2 11266 CYASSL_ENTER("CyaSSL_get_chain_count");
wolfSSL 0:1239e9b70ca2 11267 if (chain)
wolfSSL 0:1239e9b70ca2 11268 return chain->count;
wolfSSL 0:1239e9b70ca2 11269
wolfSSL 0:1239e9b70ca2 11270 return 0;
wolfSSL 0:1239e9b70ca2 11271 }
wolfSSL 0:1239e9b70ca2 11272
wolfSSL 0:1239e9b70ca2 11273
wolfSSL 0:1239e9b70ca2 11274 /* Get peer's ASN.1 DER ceritifcate at index (idx) length in bytes */
wolfSSL 0:1239e9b70ca2 11275 int CyaSSL_get_chain_length(CYASSL_X509_CHAIN* chain, int idx)
wolfSSL 0:1239e9b70ca2 11276 {
wolfSSL 0:1239e9b70ca2 11277 CYASSL_ENTER("CyaSSL_get_chain_length");
wolfSSL 0:1239e9b70ca2 11278 if (chain)
wolfSSL 0:1239e9b70ca2 11279 return chain->certs[idx].length;
wolfSSL 0:1239e9b70ca2 11280
wolfSSL 0:1239e9b70ca2 11281 return 0;
wolfSSL 0:1239e9b70ca2 11282 }
wolfSSL 0:1239e9b70ca2 11283
wolfSSL 0:1239e9b70ca2 11284
wolfSSL 0:1239e9b70ca2 11285 /* Get peer's ASN.1 DER ceritifcate at index (idx) */
wolfSSL 0:1239e9b70ca2 11286 byte* CyaSSL_get_chain_cert(CYASSL_X509_CHAIN* chain, int idx)
wolfSSL 0:1239e9b70ca2 11287 {
wolfSSL 0:1239e9b70ca2 11288 CYASSL_ENTER("CyaSSL_get_chain_cert");
wolfSSL 0:1239e9b70ca2 11289 if (chain)
wolfSSL 0:1239e9b70ca2 11290 return chain->certs[idx].buffer;
wolfSSL 0:1239e9b70ca2 11291
wolfSSL 0:1239e9b70ca2 11292 return 0;
wolfSSL 0:1239e9b70ca2 11293 }
wolfSSL 0:1239e9b70ca2 11294
wolfSSL 0:1239e9b70ca2 11295
wolfSSL 0:1239e9b70ca2 11296 /* Get peer's CyaSSL X509 ceritifcate at index (idx) */
wolfSSL 0:1239e9b70ca2 11297 CYASSL_X509* CyaSSL_get_chain_X509(CYASSL_X509_CHAIN* chain, int idx)
wolfSSL 0:1239e9b70ca2 11298 {
wolfSSL 0:1239e9b70ca2 11299 int ret;
wolfSSL 0:1239e9b70ca2 11300 CYASSL_X509* x509;
wolfSSL 0:1239e9b70ca2 11301 DecodedCert dCert;
wolfSSL 0:1239e9b70ca2 11302
wolfSSL 0:1239e9b70ca2 11303 CYASSL_ENTER("CyaSSL_get_chain_X509");
wolfSSL 0:1239e9b70ca2 11304 if (chain == NULL)
wolfSSL 0:1239e9b70ca2 11305 return NULL;
wolfSSL 0:1239e9b70ca2 11306
wolfSSL 0:1239e9b70ca2 11307 InitDecodedCert(&dCert, chain->certs[idx].buffer, chain->certs[idx].length,
wolfSSL 0:1239e9b70ca2 11308 NULL);
wolfSSL 0:1239e9b70ca2 11309 ret = ParseCertRelative(&dCert, CERT_TYPE, 0, NULL);
wolfSSL 0:1239e9b70ca2 11310 if (ret != 0) {
wolfSSL 0:1239e9b70ca2 11311 CYASSL_MSG("Failed to parse cert");
wolfSSL 0:1239e9b70ca2 11312 FreeDecodedCert(&dCert);
wolfSSL 0:1239e9b70ca2 11313 return NULL;
wolfSSL 0:1239e9b70ca2 11314 }
wolfSSL 0:1239e9b70ca2 11315
wolfSSL 0:1239e9b70ca2 11316 x509 = (CYASSL_X509*)XMALLOC(sizeof(CYASSL_X509), NULL, DYNAMIC_TYPE_X509);
wolfSSL 0:1239e9b70ca2 11317 if (x509 == NULL) {
wolfSSL 0:1239e9b70ca2 11318 CYASSL_MSG("Failed alloc X509");
wolfSSL 0:1239e9b70ca2 11319 FreeDecodedCert(&dCert);
wolfSSL 0:1239e9b70ca2 11320 return NULL;
wolfSSL 0:1239e9b70ca2 11321 }
wolfSSL 0:1239e9b70ca2 11322 InitX509(x509, 1);
wolfSSL 0:1239e9b70ca2 11323
wolfSSL 0:1239e9b70ca2 11324 ret = CopyDecodedToX509(x509, &dCert);
wolfSSL 0:1239e9b70ca2 11325 if (ret != 0) {
wolfSSL 0:1239e9b70ca2 11326 CYASSL_MSG("Failed to copy decoded");
wolfSSL 0:1239e9b70ca2 11327 XFREE(x509, NULL, DYNAMIC_TYPE_X509);
wolfSSL 0:1239e9b70ca2 11328 x509 = NULL;
wolfSSL 0:1239e9b70ca2 11329 }
wolfSSL 0:1239e9b70ca2 11330 FreeDecodedCert(&dCert);
wolfSSL 0:1239e9b70ca2 11331
wolfSSL 0:1239e9b70ca2 11332 return x509;
wolfSSL 0:1239e9b70ca2 11333 }
wolfSSL 0:1239e9b70ca2 11334
wolfSSL 0:1239e9b70ca2 11335
wolfSSL 0:1239e9b70ca2 11336 /* Get peer's PEM ceritifcate at index (idx), output to buffer if inLen big
wolfSSL 0:1239e9b70ca2 11337 enough else return error (-1), output length is in *outLen
wolfSSL 0:1239e9b70ca2 11338 SSL_SUCCESS on ok */
wolfSSL 0:1239e9b70ca2 11339 int CyaSSL_get_chain_cert_pem(CYASSL_X509_CHAIN* chain, int idx,
wolfSSL 0:1239e9b70ca2 11340 unsigned char* buf, int inLen, int* outLen)
wolfSSL 0:1239e9b70ca2 11341 {
wolfSSL 0:1239e9b70ca2 11342 const char header[] = "-----BEGIN CERTIFICATE-----\n";
wolfSSL 0:1239e9b70ca2 11343 const char footer[] = "-----END CERTIFICATE-----\n";
wolfSSL 0:1239e9b70ca2 11344
wolfSSL 0:1239e9b70ca2 11345 int headerLen = sizeof(header) - 1;
wolfSSL 0:1239e9b70ca2 11346 int footerLen = sizeof(footer) - 1;
wolfSSL 0:1239e9b70ca2 11347 int i;
wolfSSL 0:1239e9b70ca2 11348 int err;
wolfSSL 0:1239e9b70ca2 11349
wolfSSL 0:1239e9b70ca2 11350 CYASSL_ENTER("CyaSSL_get_chain_cert_pem");
wolfSSL 0:1239e9b70ca2 11351 if (!chain || !outLen || !buf)
wolfSSL 0:1239e9b70ca2 11352 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 11353
wolfSSL 0:1239e9b70ca2 11354 /* don't even try if inLen too short */
wolfSSL 0:1239e9b70ca2 11355 if (inLen < headerLen + footerLen + chain->certs[idx].length)
wolfSSL 0:1239e9b70ca2 11356 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 11357
wolfSSL 0:1239e9b70ca2 11358 /* header */
wolfSSL 0:1239e9b70ca2 11359 XMEMCPY(buf, header, headerLen);
wolfSSL 0:1239e9b70ca2 11360 i = headerLen;
wolfSSL 0:1239e9b70ca2 11361
wolfSSL 0:1239e9b70ca2 11362 /* body */
wolfSSL 0:1239e9b70ca2 11363 *outLen = inLen; /* input to Base64_Encode */
wolfSSL 0:1239e9b70ca2 11364 if ( (err = Base64_Encode(chain->certs[idx].buffer,
wolfSSL 0:1239e9b70ca2 11365 chain->certs[idx].length, buf + i, (word32*)outLen)) < 0)
wolfSSL 0:1239e9b70ca2 11366 return err;
wolfSSL 0:1239e9b70ca2 11367 i += *outLen;
wolfSSL 0:1239e9b70ca2 11368
wolfSSL 0:1239e9b70ca2 11369 /* footer */
wolfSSL 0:1239e9b70ca2 11370 if ( (i + footerLen) > inLen)
wolfSSL 0:1239e9b70ca2 11371 return BAD_FUNC_ARG;
wolfSSL 0:1239e9b70ca2 11372 XMEMCPY(buf + i, footer, footerLen);
wolfSSL 0:1239e9b70ca2 11373 *outLen += headerLen + footerLen;
wolfSSL 0:1239e9b70ca2 11374
wolfSSL 0:1239e9b70ca2 11375 return SSL_SUCCESS;
wolfSSL 0:1239e9b70ca2 11376 }
wolfSSL 0:1239e9b70ca2 11377
wolfSSL 0:1239e9b70ca2 11378
wolfSSL 0:1239e9b70ca2 11379 /* get session ID */
wolfSSL 0:1239e9b70ca2 11380 const byte* CyaSSL_get_sessionID(const CYASSL_SESSION* session)
wolfSSL 0:1239e9b70ca2 11381 {
wolfSSL 0:1239e9b70ca2 11382 CYASSL_ENTER("CyaSSL_get_sessionID");
wolfSSL 0:1239e9b70ca2 11383 if (session)
wolfSSL 0:1239e9b70ca2 11384 return session->sessionID;
wolfSSL 0:1239e9b70ca2 11385
wolfSSL 0:1239e9b70ca2 11386 return NULL;
wolfSSL 0:1239e9b70ca2 11387 }
wolfSSL 0:1239e9b70ca2 11388
wolfSSL 0:1239e9b70ca2 11389
wolfSSL 0:1239e9b70ca2 11390 #endif /* SESSION_CERTS */
wolfSSL 0:1239e9b70ca2 11391
wolfSSL 0:1239e9b70ca2 11392
wolfSSL 0:1239e9b70ca2 11393 #ifndef NO_CERTS
wolfSSL 0:1239e9b70ca2 11394 #ifdef HAVE_PK_CALLBACKS
wolfSSL 0:1239e9b70ca2 11395
wolfSSL 0:1239e9b70ca2 11396 #ifdef HAVE_ECC
wolfSSL 0:1239e9b70ca2 11397
wolfSSL 0:1239e9b70ca2 11398 void CyaSSL_CTX_SetEccSignCb(CYASSL_CTX* ctx, CallbackEccSign cb)
wolfSSL 0:1239e9b70ca2 11399 {
wolfSSL 0:1239e9b70ca2 11400 if (ctx)
wolfSSL 0:1239e9b70ca2 11401 ctx->EccSignCb = cb;
wolfSSL 0:1239e9b70ca2 11402 }
wolfSSL 0:1239e9b70ca2 11403
wolfSSL 0:1239e9b70ca2 11404
wolfSSL 0:1239e9b70ca2 11405 void CyaSSL_SetEccSignCtx(CYASSL* ssl, void *ctx)
wolfSSL 0:1239e9b70ca2 11406 {
wolfSSL 0:1239e9b70ca2 11407 if (ssl)
wolfSSL 0:1239e9b70ca2 11408 ssl->EccSignCtx = ctx;
wolfSSL 0:1239e9b70ca2 11409 }
wolfSSL 0:1239e9b70ca2 11410
wolfSSL 0:1239e9b70ca2 11411
wolfSSL 0:1239e9b70ca2 11412 void* CyaSSL_GetEccSignCtx(CYASSL* ssl)
wolfSSL 0:1239e9b70ca2 11413 {
wolfSSL 0:1239e9b70ca2 11414 if (ssl)
wolfSSL 0:1239e9b70ca2 11415 return ssl->EccSignCtx;
wolfSSL 0:1239e9b70ca2 11416
wolfSSL 0:1239e9b70ca2 11417 return NULL;
wolfSSL 0:1239e9b70ca2 11418 }
wolfSSL 0:1239e9b70ca2 11419
wolfSSL 0:1239e9b70ca2 11420
wolfSSL 0:1239e9b70ca2 11421 void CyaSSL_CTX_SetEccVerifyCb(CYASSL_CTX* ctx, CallbackEccVerify cb)
wolfSSL 0:1239e9b70ca2 11422 {
wolfSSL 0:1239e9b70ca2 11423 if (ctx)
wolfSSL 0:1239e9b70ca2 11424 ctx->EccVerifyCb = cb;
wolfSSL 0:1239e9b70ca2 11425 }
wolfSSL 0:1239e9b70ca2 11426
wolfSSL 0:1239e9b70ca2 11427
wolfSSL 0:1239e9b70ca2 11428 void CyaSSL_SetEccVerifyCtx(CYASSL* ssl, void *ctx)
wolfSSL 0:1239e9b70ca2 11429 {
wolfSSL 0:1239e9b70ca2 11430 if (ssl)
wolfSSL 0:1239e9b70ca2 11431 ssl->EccVerifyCtx = ctx;
wolfSSL 0:1239e9b70ca2 11432 }
wolfSSL 0:1239e9b70ca2 11433
wolfSSL 0:1239e9b70ca2 11434
wolfSSL 0:1239e9b70ca2 11435 void* CyaSSL_GetEccVerifyCtx(CYASSL* ssl)
wolfSSL 0:1239e9b70ca2 11436 {
wolfSSL 0:1239e9b70ca2 11437 if (ssl)
wolfSSL 0:1239e9b70ca2 11438 return ssl->EccVerifyCtx;
wolfSSL 0:1239e9b70ca2 11439
wolfSSL 0:1239e9b70ca2 11440 return NULL;
wolfSSL 0:1239e9b70ca2 11441 }
wolfSSL 0:1239e9b70ca2 11442
wolfSSL 0:1239e9b70ca2 11443 #endif /* HAVE_ECC */
wolfSSL 0:1239e9b70ca2 11444
wolfSSL 0:1239e9b70ca2 11445 #ifndef NO_RSA
wolfSSL 0:1239e9b70ca2 11446
wolfSSL 0:1239e9b70ca2 11447 void CyaSSL_CTX_SetRsaSignCb(CYASSL_CTX* ctx, CallbackRsaSign cb)
wolfSSL 0:1239e9b70ca2 11448 {
wolfSSL 0:1239e9b70ca2 11449 if (ctx)
wolfSSL 0:1239e9b70ca2 11450 ctx->RsaSignCb = cb;
wolfSSL 0:1239e9b70ca2 11451 }
wolfSSL 0:1239e9b70ca2 11452
wolfSSL 0:1239e9b70ca2 11453
wolfSSL 0:1239e9b70ca2 11454 void CyaSSL_SetRsaSignCtx(CYASSL* ssl, void *ctx)
wolfSSL 0:1239e9b70ca2 11455 {
wolfSSL 0:1239e9b70ca2 11456 if (ssl)
wolfSSL 0:1239e9b70ca2 11457 ssl->RsaSignCtx = ctx;
wolfSSL 0:1239e9b70ca2 11458 }
wolfSSL 0:1239e9b70ca2 11459
wolfSSL 0:1239e9b70ca2 11460
wolfSSL 0:1239e9b70ca2 11461 void* CyaSSL_GetRsaSignCtx(CYASSL* ssl)
wolfSSL 0:1239e9b70ca2 11462 {
wolfSSL 0:1239e9b70ca2 11463 if (ssl)
wolfSSL 0:1239e9b70ca2 11464 return ssl->RsaSignCtx;
wolfSSL 0:1239e9b70ca2 11465
wolfSSL 0:1239e9b70ca2 11466 return NULL;
wolfSSL 0:1239e9b70ca2 11467 }
wolfSSL 0:1239e9b70ca2 11468
wolfSSL 0:1239e9b70ca2 11469
wolfSSL 0:1239e9b70ca2 11470 void CyaSSL_CTX_SetRsaVerifyCb(CYASSL_CTX* ctx, CallbackRsaVerify cb)
wolfSSL 0:1239e9b70ca2 11471 {
wolfSSL 0:1239e9b70ca2 11472 if (ctx)
wolfSSL 0:1239e9b70ca2 11473 ctx->RsaVerifyCb = cb;
wolfSSL 0:1239e9b70ca2 11474 }
wolfSSL 0:1239e9b70ca2 11475
wolfSSL 0:1239e9b70ca2 11476
wolfSSL 0:1239e9b70ca2 11477 void CyaSSL_SetRsaVerifyCtx(CYASSL* ssl, void *ctx)
wolfSSL 0:1239e9b70ca2 11478 {
wolfSSL 0:1239e9b70ca2 11479 if (ssl)
wolfSSL 0:1239e9b70ca2 11480 ssl->RsaVerifyCtx = ctx;
wolfSSL 0:1239e9b70ca2 11481 }
wolfSSL 0:1239e9b70ca2 11482
wolfSSL 0:1239e9b70ca2 11483
wolfSSL 0:1239e9b70ca2 11484 void* CyaSSL_GetRsaVerifyCtx(CYASSL* ssl)
wolfSSL 0:1239e9b70ca2 11485 {
wolfSSL 0:1239e9b70ca2 11486 if (ssl)
wolfSSL 0:1239e9b70ca2 11487 return ssl->RsaVerifyCtx;
wolfSSL 0:1239e9b70ca2 11488
wolfSSL 0:1239e9b70ca2 11489 return NULL;
wolfSSL 0:1239e9b70ca2 11490 }
wolfSSL 0:1239e9b70ca2 11491
wolfSSL 0:1239e9b70ca2 11492 void CyaSSL_CTX_SetRsaEncCb(CYASSL_CTX* ctx, CallbackRsaEnc cb)
wolfSSL 0:1239e9b70ca2 11493 {
wolfSSL 0:1239e9b70ca2 11494 if (ctx)
wolfSSL 0:1239e9b70ca2 11495 ctx->RsaEncCb = cb;
wolfSSL 0:1239e9b70ca2 11496 }
wolfSSL 0:1239e9b70ca2 11497
wolfSSL 0:1239e9b70ca2 11498
wolfSSL 0:1239e9b70ca2 11499 void CyaSSL_SetRsaEncCtx(CYASSL* ssl, void *ctx)
wolfSSL 0:1239e9b70ca2 11500 {
wolfSSL 0:1239e9b70ca2 11501 if (ssl)
wolfSSL 0:1239e9b70ca2 11502 ssl->RsaEncCtx = ctx;
wolfSSL 0:1239e9b70ca2 11503 }
wolfSSL 0:1239e9b70ca2 11504
wolfSSL 0:1239e9b70ca2 11505
wolfSSL 0:1239e9b70ca2 11506 void* CyaSSL_GetRsaEncCtx(CYASSL* ssl)
wolfSSL 0:1239e9b70ca2 11507 {
wolfSSL 0:1239e9b70ca2 11508 if (ssl)
wolfSSL 0:1239e9b70ca2 11509 return ssl->RsaEncCtx;
wolfSSL 0:1239e9b70ca2 11510
wolfSSL 0:1239e9b70ca2 11511 return NULL;
wolfSSL 0:1239e9b70ca2 11512 }
wolfSSL 0:1239e9b70ca2 11513
wolfSSL 0:1239e9b70ca2 11514 void CyaSSL_CTX_SetRsaDecCb(CYASSL_CTX* ctx, CallbackRsaDec cb)
wolfSSL 0:1239e9b70ca2 11515 {
wolfSSL 0:1239e9b70ca2 11516 if (ctx)
wolfSSL 0:1239e9b70ca2 11517 ctx->RsaDecCb = cb;
wolfSSL 0:1239e9b70ca2 11518 }
wolfSSL 0:1239e9b70ca2 11519
wolfSSL 0:1239e9b70ca2 11520
wolfSSL 0:1239e9b70ca2 11521 void CyaSSL_SetRsaDecCtx(CYASSL* ssl, void *ctx)
wolfSSL 0:1239e9b70ca2 11522 {
wolfSSL 0:1239e9b70ca2 11523 if (ssl)
wolfSSL 0:1239e9b70ca2 11524 ssl->RsaDecCtx = ctx;
wolfSSL 0:1239e9b70ca2 11525 }
wolfSSL 0:1239e9b70ca2 11526
wolfSSL 0:1239e9b70ca2 11527
wolfSSL 0:1239e9b70ca2 11528 void* CyaSSL_GetRsaDecCtx(CYASSL* ssl)
wolfSSL 0:1239e9b70ca2 11529 {
wolfSSL 0:1239e9b70ca2 11530 if (ssl)
wolfSSL 0:1239e9b70ca2 11531 return ssl->RsaDecCtx;
wolfSSL 0:1239e9b70ca2 11532
wolfSSL 0:1239e9b70ca2 11533 return NULL;
wolfSSL 0:1239e9b70ca2 11534 }
wolfSSL 0:1239e9b70ca2 11535
wolfSSL 0:1239e9b70ca2 11536
wolfSSL 0:1239e9b70ca2 11537 #endif /* NO_RSA */
wolfSSL 0:1239e9b70ca2 11538
wolfSSL 0:1239e9b70ca2 11539 #endif /* HAVE_PK_CALLBACKS */
wolfSSL 0:1239e9b70ca2 11540 #endif /* NO_CERTS */
wolfSSL 0:1239e9b70ca2 11541
wolfSSL 0:1239e9b70ca2 11542
wolfSSL 0:1239e9b70ca2 11543 #ifdef CYASSL_HAVE_WOLFSCEP
wolfSSL 0:1239e9b70ca2 11544 /* Used by autoconf to see if wolfSCEP is available */
wolfSSL 0:1239e9b70ca2 11545 void CyaSSL_wolfSCEP(void) {}
wolfSSL 0:1239e9b70ca2 11546 #endif
wolfSSL 0:1239e9b70ca2 11547
wolfSSL 0:1239e9b70ca2 11548
wolfSSL 0:1239e9b70ca2 11549 #ifdef CYASSL_HAVE_CERT_SERVICE
wolfSSL 0:1239e9b70ca2 11550 /* Used by autoconf to see if cert service is available */
wolfSSL 0:1239e9b70ca2 11551 void CyaSSL_cert_service(void) {}
wolfSSL 0:1239e9b70ca2 11552 #endif
wolfSSL 0:1239e9b70ca2 11553
wolfSSL 0:1239e9b70ca2 11554