SSL/TLS Library

Dependents:  

CyaSSL is SSL/TLS library for embedded systems.

wolfssl.com

Committer:
wolfSSL
Date:
Sun Apr 20 12:40:57 2014 +0000
Revision:
0:9d17e4342598
CyaSSL SSL/TLS Library 2.9.4;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
wolfSSL 0:9d17e4342598 1 /* ssl.c
wolfSSL 0:9d17e4342598 2 *
wolfSSL 0:9d17e4342598 3 * Copyright (C) 2006-2013 wolfSSL Inc.
wolfSSL 0:9d17e4342598 4 *
wolfSSL 0:9d17e4342598 5 * This file is part of CyaSSL.
wolfSSL 0:9d17e4342598 6 *
wolfSSL 0:9d17e4342598 7 * CyaSSL is free software; you can redistribute it and/or modify
wolfSSL 0:9d17e4342598 8 * it under the terms of the GNU General Public License as published by
wolfSSL 0:9d17e4342598 9 * the Free Software Foundation; either version 2 of the License, or
wolfSSL 0:9d17e4342598 10 * (at your option) any later version.
wolfSSL 0:9d17e4342598 11 *
wolfSSL 0:9d17e4342598 12 * CyaSSL is distributed in the hope that it will be useful,
wolfSSL 0:9d17e4342598 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
wolfSSL 0:9d17e4342598 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
wolfSSL 0:9d17e4342598 15 * GNU General Public License for more details.
wolfSSL 0:9d17e4342598 16 *
wolfSSL 0:9d17e4342598 17 * You should have received a copy of the GNU General Public License
wolfSSL 0:9d17e4342598 18 * along with this program; if not, write to the Free Software
wolfSSL 0:9d17e4342598 19 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
wolfSSL 0:9d17e4342598 20 */
wolfSSL 0:9d17e4342598 21
wolfSSL 0:9d17e4342598 22 #ifdef HAVE_CONFIG_H
wolfSSL 0:9d17e4342598 23 #include <config.h>
wolfSSL 0:9d17e4342598 24 #endif
wolfSSL 0:9d17e4342598 25
wolfSSL 0:9d17e4342598 26 #include <cyassl/ctaocrypt/settings.h>
wolfSSL 0:9d17e4342598 27
wolfSSL 0:9d17e4342598 28 #ifdef HAVE_ERRNO_H
wolfSSL 0:9d17e4342598 29 #include <errno.h>
wolfSSL 0:9d17e4342598 30 #endif
wolfSSL 0:9d17e4342598 31
wolfSSL 0:9d17e4342598 32
wolfSSL 0:9d17e4342598 33 #include <cyassl/ssl.h>
wolfSSL 0:9d17e4342598 34 #include <cyassl/internal.h>
wolfSSL 0:9d17e4342598 35 #include <cyassl/error-ssl.h>
wolfSSL 0:9d17e4342598 36 #include <cyassl/ctaocrypt/coding.h>
wolfSSL 0:9d17e4342598 37
wolfSSL 0:9d17e4342598 38 #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
wolfSSL 0:9d17e4342598 39 #include <cyassl/openssl/evp.h>
wolfSSL 0:9d17e4342598 40 #endif
wolfSSL 0:9d17e4342598 41
wolfSSL 0:9d17e4342598 42 #ifdef OPENSSL_EXTRA
wolfSSL 0:9d17e4342598 43 /* openssl headers begin */
wolfSSL 0:9d17e4342598 44 #include <cyassl/openssl/hmac.h>
wolfSSL 0:9d17e4342598 45 #include <cyassl/openssl/crypto.h>
wolfSSL 0:9d17e4342598 46 #include <cyassl/openssl/des.h>
wolfSSL 0:9d17e4342598 47 #include <cyassl/openssl/bn.h>
wolfSSL 0:9d17e4342598 48 #include <cyassl/openssl/dh.h>
wolfSSL 0:9d17e4342598 49 #include <cyassl/openssl/rsa.h>
wolfSSL 0:9d17e4342598 50 #include <cyassl/openssl/pem.h>
wolfSSL 0:9d17e4342598 51 /* openssl headers end, cyassl internal headers next */
wolfSSL 0:9d17e4342598 52 #include <cyassl/ctaocrypt/hmac.h>
wolfSSL 0:9d17e4342598 53 #include <cyassl/ctaocrypt/random.h>
wolfSSL 0:9d17e4342598 54 #include <cyassl/ctaocrypt/des3.h>
wolfSSL 0:9d17e4342598 55 #include <cyassl/ctaocrypt/md4.h>
wolfSSL 0:9d17e4342598 56 #include <cyassl/ctaocrypt/md5.h>
wolfSSL 0:9d17e4342598 57 #include <cyassl/ctaocrypt/arc4.h>
wolfSSL 0:9d17e4342598 58 #ifdef CYASSL_SHA512
wolfSSL 0:9d17e4342598 59 #include <cyassl/ctaocrypt/sha512.h>
wolfSSL 0:9d17e4342598 60 #endif
wolfSSL 0:9d17e4342598 61 #endif
wolfSSL 0:9d17e4342598 62
wolfSSL 0:9d17e4342598 63 #ifndef NO_FILESYSTEM
wolfSSL 0:9d17e4342598 64 #if !defined(USE_WINDOWS_API) && !defined(NO_CYASSL_DIR) \
wolfSSL 0:9d17e4342598 65 && !defined(EBSNET)
wolfSSL 0:9d17e4342598 66 #include <dirent.h>
wolfSSL 0:9d17e4342598 67 #include <sys/stat.h>
wolfSSL 0:9d17e4342598 68 #endif
wolfSSL 0:9d17e4342598 69 #ifdef EBSNET
wolfSSL 0:9d17e4342598 70 #include "vfapi.h"
wolfSSL 0:9d17e4342598 71 #include "vfile.h"
wolfSSL 0:9d17e4342598 72 #endif
wolfSSL 0:9d17e4342598 73 #endif /* NO_FILESYSTEM */
wolfSSL 0:9d17e4342598 74
wolfSSL 0:9d17e4342598 75 #ifndef TRUE
wolfSSL 0:9d17e4342598 76 #define TRUE 1
wolfSSL 0:9d17e4342598 77 #endif
wolfSSL 0:9d17e4342598 78 #ifndef FALSE
wolfSSL 0:9d17e4342598 79 #define FALSE 0
wolfSSL 0:9d17e4342598 80 #endif
wolfSSL 0:9d17e4342598 81
wolfSSL 0:9d17e4342598 82 #ifndef min
wolfSSL 0:9d17e4342598 83
wolfSSL 0:9d17e4342598 84 static INLINE word32 min(word32 a, word32 b)
wolfSSL 0:9d17e4342598 85 {
wolfSSL 0:9d17e4342598 86 return a > b ? b : a;
wolfSSL 0:9d17e4342598 87 }
wolfSSL 0:9d17e4342598 88
wolfSSL 0:9d17e4342598 89 #endif /* min */
wolfSSL 0:9d17e4342598 90
wolfSSL 0:9d17e4342598 91 #ifndef max
wolfSSL 0:9d17e4342598 92 #ifdef CYASSL_DTLS
wolfSSL 0:9d17e4342598 93 static INLINE word32 max(word32 a, word32 b)
wolfSSL 0:9d17e4342598 94 {
wolfSSL 0:9d17e4342598 95 return a > b ? a : b;
wolfSSL 0:9d17e4342598 96 }
wolfSSL 0:9d17e4342598 97 #endif
wolfSSL 0:9d17e4342598 98 #endif /* min */
wolfSSL 0:9d17e4342598 99
wolfSSL 0:9d17e4342598 100
wolfSSL 0:9d17e4342598 101 #ifndef CYASSL_LEANPSK
wolfSSL 0:9d17e4342598 102 char* mystrnstr(const char* s1, const char* s2, unsigned int n)
wolfSSL 0:9d17e4342598 103 {
wolfSSL 0:9d17e4342598 104 unsigned int s2_len = (unsigned int)XSTRLEN(s2);
wolfSSL 0:9d17e4342598 105
wolfSSL 0:9d17e4342598 106 if (s2_len == 0)
wolfSSL 0:9d17e4342598 107 return (char*)s1;
wolfSSL 0:9d17e4342598 108
wolfSSL 0:9d17e4342598 109 while (n >= s2_len && s1[0]) {
wolfSSL 0:9d17e4342598 110 if (s1[0] == s2[0])
wolfSSL 0:9d17e4342598 111 if (XMEMCMP(s1, s2, s2_len) == 0)
wolfSSL 0:9d17e4342598 112 return (char*)s1;
wolfSSL 0:9d17e4342598 113 s1++;
wolfSSL 0:9d17e4342598 114 n--;
wolfSSL 0:9d17e4342598 115 }
wolfSSL 0:9d17e4342598 116
wolfSSL 0:9d17e4342598 117 return NULL;
wolfSSL 0:9d17e4342598 118 }
wolfSSL 0:9d17e4342598 119 #endif
wolfSSL 0:9d17e4342598 120
wolfSSL 0:9d17e4342598 121
wolfSSL 0:9d17e4342598 122 /* prevent multiple mutex initializations */
wolfSSL 0:9d17e4342598 123 static volatile int initRefCount = 0;
wolfSSL 0:9d17e4342598 124 static CyaSSL_Mutex count_mutex; /* init ref count mutex */
wolfSSL 0:9d17e4342598 125
wolfSSL 0:9d17e4342598 126
wolfSSL 0:9d17e4342598 127 CYASSL_CTX* CyaSSL_CTX_new(CYASSL_METHOD* method)
wolfSSL 0:9d17e4342598 128 {
wolfSSL 0:9d17e4342598 129 CYASSL_CTX* ctx = NULL;
wolfSSL 0:9d17e4342598 130
wolfSSL 0:9d17e4342598 131 CYASSL_ENTER("CYASSL_CTX_new");
wolfSSL 0:9d17e4342598 132
wolfSSL 0:9d17e4342598 133 if (initRefCount == 0)
wolfSSL 0:9d17e4342598 134 CyaSSL_Init(); /* user no longer forced to call Init themselves */
wolfSSL 0:9d17e4342598 135
wolfSSL 0:9d17e4342598 136 if (method == NULL)
wolfSSL 0:9d17e4342598 137 return ctx;
wolfSSL 0:9d17e4342598 138
wolfSSL 0:9d17e4342598 139 ctx = (CYASSL_CTX*) XMALLOC(sizeof(CYASSL_CTX), 0, DYNAMIC_TYPE_CTX);
wolfSSL 0:9d17e4342598 140 if (ctx) {
wolfSSL 0:9d17e4342598 141 if (InitSSL_Ctx(ctx, method) < 0) {
wolfSSL 0:9d17e4342598 142 CYASSL_MSG("Init CTX failed");
wolfSSL 0:9d17e4342598 143 CyaSSL_CTX_free(ctx);
wolfSSL 0:9d17e4342598 144 ctx = NULL;
wolfSSL 0:9d17e4342598 145 }
wolfSSL 0:9d17e4342598 146 }
wolfSSL 0:9d17e4342598 147 else {
wolfSSL 0:9d17e4342598 148 CYASSL_MSG("Alloc CTX failed, method freed");
wolfSSL 0:9d17e4342598 149 XFREE(method, NULL, DYNAMIC_TYPE_METHOD);
wolfSSL 0:9d17e4342598 150 }
wolfSSL 0:9d17e4342598 151
wolfSSL 0:9d17e4342598 152 CYASSL_LEAVE("CYASSL_CTX_new", 0);
wolfSSL 0:9d17e4342598 153 return ctx;
wolfSSL 0:9d17e4342598 154 }
wolfSSL 0:9d17e4342598 155
wolfSSL 0:9d17e4342598 156
wolfSSL 0:9d17e4342598 157 void CyaSSL_CTX_free(CYASSL_CTX* ctx)
wolfSSL 0:9d17e4342598 158 {
wolfSSL 0:9d17e4342598 159 CYASSL_ENTER("SSL_CTX_free");
wolfSSL 0:9d17e4342598 160 if (ctx)
wolfSSL 0:9d17e4342598 161 FreeSSL_Ctx(ctx);
wolfSSL 0:9d17e4342598 162 CYASSL_LEAVE("SSL_CTX_free", 0);
wolfSSL 0:9d17e4342598 163 }
wolfSSL 0:9d17e4342598 164
wolfSSL 0:9d17e4342598 165
wolfSSL 0:9d17e4342598 166 CYASSL* CyaSSL_new(CYASSL_CTX* ctx)
wolfSSL 0:9d17e4342598 167 {
wolfSSL 0:9d17e4342598 168 CYASSL* ssl = NULL;
wolfSSL 0:9d17e4342598 169 int ret = 0;
wolfSSL 0:9d17e4342598 170
wolfSSL 0:9d17e4342598 171 (void)ret;
wolfSSL 0:9d17e4342598 172 CYASSL_ENTER("SSL_new");
wolfSSL 0:9d17e4342598 173
wolfSSL 0:9d17e4342598 174 if (ctx == NULL)
wolfSSL 0:9d17e4342598 175 return ssl;
wolfSSL 0:9d17e4342598 176
wolfSSL 0:9d17e4342598 177 ssl = (CYASSL*) XMALLOC(sizeof(CYASSL), ctx->heap,DYNAMIC_TYPE_SSL);
wolfSSL 0:9d17e4342598 178 if (ssl)
wolfSSL 0:9d17e4342598 179 if ( (ret = InitSSL(ssl, ctx)) < 0) {
wolfSSL 0:9d17e4342598 180 FreeSSL(ssl);
wolfSSL 0:9d17e4342598 181 ssl = 0;
wolfSSL 0:9d17e4342598 182 }
wolfSSL 0:9d17e4342598 183
wolfSSL 0:9d17e4342598 184 CYASSL_LEAVE("SSL_new", ret);
wolfSSL 0:9d17e4342598 185 return ssl;
wolfSSL 0:9d17e4342598 186 }
wolfSSL 0:9d17e4342598 187
wolfSSL 0:9d17e4342598 188
wolfSSL 0:9d17e4342598 189 void CyaSSL_free(CYASSL* ssl)
wolfSSL 0:9d17e4342598 190 {
wolfSSL 0:9d17e4342598 191 CYASSL_ENTER("SSL_free");
wolfSSL 0:9d17e4342598 192 if (ssl)
wolfSSL 0:9d17e4342598 193 FreeSSL(ssl);
wolfSSL 0:9d17e4342598 194 CYASSL_LEAVE("SSL_free", 0);
wolfSSL 0:9d17e4342598 195 }
wolfSSL 0:9d17e4342598 196
wolfSSL 0:9d17e4342598 197
wolfSSL 0:9d17e4342598 198 int CyaSSL_set_fd(CYASSL* ssl, int fd)
wolfSSL 0:9d17e4342598 199 {
wolfSSL 0:9d17e4342598 200 CYASSL_ENTER("SSL_set_fd");
wolfSSL 0:9d17e4342598 201 ssl->rfd = fd; /* not used directly to allow IO callbacks */
wolfSSL 0:9d17e4342598 202 ssl->wfd = fd;
wolfSSL 0:9d17e4342598 203
wolfSSL 0:9d17e4342598 204 ssl->IOCB_ReadCtx = &ssl->rfd;
wolfSSL 0:9d17e4342598 205 ssl->IOCB_WriteCtx = &ssl->wfd;
wolfSSL 0:9d17e4342598 206
wolfSSL 0:9d17e4342598 207 #ifdef CYASSL_DTLS
wolfSSL 0:9d17e4342598 208 if (ssl->options.dtls) {
wolfSSL 0:9d17e4342598 209 ssl->IOCB_ReadCtx = &ssl->buffers.dtlsCtx;
wolfSSL 0:9d17e4342598 210 ssl->IOCB_WriteCtx = &ssl->buffers.dtlsCtx;
wolfSSL 0:9d17e4342598 211 ssl->buffers.dtlsCtx.fd = fd;
wolfSSL 0:9d17e4342598 212 }
wolfSSL 0:9d17e4342598 213 #endif
wolfSSL 0:9d17e4342598 214
wolfSSL 0:9d17e4342598 215 CYASSL_LEAVE("SSL_set_fd", SSL_SUCCESS);
wolfSSL 0:9d17e4342598 216 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 217 }
wolfSSL 0:9d17e4342598 218
wolfSSL 0:9d17e4342598 219
wolfSSL 0:9d17e4342598 220 int CyaSSL_get_fd(const CYASSL* ssl)
wolfSSL 0:9d17e4342598 221 {
wolfSSL 0:9d17e4342598 222 CYASSL_ENTER("SSL_get_fd");
wolfSSL 0:9d17e4342598 223 CYASSL_LEAVE("SSL_get_fd", ssl->rfd);
wolfSSL 0:9d17e4342598 224 return ssl->rfd;
wolfSSL 0:9d17e4342598 225 }
wolfSSL 0:9d17e4342598 226
wolfSSL 0:9d17e4342598 227
wolfSSL 0:9d17e4342598 228 int CyaSSL_get_using_nonblock(CYASSL* ssl)
wolfSSL 0:9d17e4342598 229 {
wolfSSL 0:9d17e4342598 230 CYASSL_ENTER("CyaSSL_get_using_nonblock");
wolfSSL 0:9d17e4342598 231 CYASSL_LEAVE("CyaSSL_get_using_nonblock", ssl->options.usingNonblock);
wolfSSL 0:9d17e4342598 232 return ssl->options.usingNonblock;
wolfSSL 0:9d17e4342598 233 }
wolfSSL 0:9d17e4342598 234
wolfSSL 0:9d17e4342598 235
wolfSSL 0:9d17e4342598 236 int CyaSSL_dtls(CYASSL* ssl)
wolfSSL 0:9d17e4342598 237 {
wolfSSL 0:9d17e4342598 238 return ssl->options.dtls;
wolfSSL 0:9d17e4342598 239 }
wolfSSL 0:9d17e4342598 240
wolfSSL 0:9d17e4342598 241
wolfSSL 0:9d17e4342598 242 #ifndef CYASSL_LEANPSK
wolfSSL 0:9d17e4342598 243 void CyaSSL_set_using_nonblock(CYASSL* ssl, int nonblock)
wolfSSL 0:9d17e4342598 244 {
wolfSSL 0:9d17e4342598 245 CYASSL_ENTER("CyaSSL_set_using_nonblock");
wolfSSL 0:9d17e4342598 246 ssl->options.usingNonblock = (nonblock != 0);
wolfSSL 0:9d17e4342598 247 }
wolfSSL 0:9d17e4342598 248
wolfSSL 0:9d17e4342598 249
wolfSSL 0:9d17e4342598 250 int CyaSSL_dtls_set_peer(CYASSL* ssl, void* peer, unsigned int peerSz)
wolfSSL 0:9d17e4342598 251 {
wolfSSL 0:9d17e4342598 252 #ifdef CYASSL_DTLS
wolfSSL 0:9d17e4342598 253 void* sa = (void*)XMALLOC(peerSz, ssl->heap, DYNAMIC_TYPE_SOCKADDR);
wolfSSL 0:9d17e4342598 254 if (sa != NULL) {
wolfSSL 0:9d17e4342598 255 XMEMCPY(sa, peer, peerSz);
wolfSSL 0:9d17e4342598 256 ssl->buffers.dtlsCtx.peer.sa = sa;
wolfSSL 0:9d17e4342598 257 ssl->buffers.dtlsCtx.peer.sz = peerSz;
wolfSSL 0:9d17e4342598 258 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 259 }
wolfSSL 0:9d17e4342598 260 return SSL_FAILURE;
wolfSSL 0:9d17e4342598 261 #else
wolfSSL 0:9d17e4342598 262 (void)ssl;
wolfSSL 0:9d17e4342598 263 (void)peer;
wolfSSL 0:9d17e4342598 264 (void)peerSz;
wolfSSL 0:9d17e4342598 265 return SSL_NOT_IMPLEMENTED;
wolfSSL 0:9d17e4342598 266 #endif
wolfSSL 0:9d17e4342598 267 }
wolfSSL 0:9d17e4342598 268
wolfSSL 0:9d17e4342598 269 int CyaSSL_dtls_get_peer(CYASSL* ssl, void* peer, unsigned int* peerSz)
wolfSSL 0:9d17e4342598 270 {
wolfSSL 0:9d17e4342598 271 #ifdef CYASSL_DTLS
wolfSSL 0:9d17e4342598 272 if (peer != NULL && peerSz != NULL
wolfSSL 0:9d17e4342598 273 && *peerSz >= ssl->buffers.dtlsCtx.peer.sz) {
wolfSSL 0:9d17e4342598 274 *peerSz = ssl->buffers.dtlsCtx.peer.sz;
wolfSSL 0:9d17e4342598 275 XMEMCPY(peer, ssl->buffers.dtlsCtx.peer.sa, *peerSz);
wolfSSL 0:9d17e4342598 276 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 277 }
wolfSSL 0:9d17e4342598 278 return SSL_FAILURE;
wolfSSL 0:9d17e4342598 279 #else
wolfSSL 0:9d17e4342598 280 (void)ssl;
wolfSSL 0:9d17e4342598 281 (void)peer;
wolfSSL 0:9d17e4342598 282 (void)peerSz;
wolfSSL 0:9d17e4342598 283 return SSL_NOT_IMPLEMENTED;
wolfSSL 0:9d17e4342598 284 #endif
wolfSSL 0:9d17e4342598 285 }
wolfSSL 0:9d17e4342598 286 #endif /* CYASSL_LEANPSK */
wolfSSL 0:9d17e4342598 287
wolfSSL 0:9d17e4342598 288
wolfSSL 0:9d17e4342598 289 /* return underlyig connect or accept, SSL_SUCCESS on ok */
wolfSSL 0:9d17e4342598 290 int CyaSSL_negotiate(CYASSL* ssl)
wolfSSL 0:9d17e4342598 291 {
wolfSSL 0:9d17e4342598 292 int err = SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 293
wolfSSL 0:9d17e4342598 294 CYASSL_ENTER("CyaSSL_negotiate");
wolfSSL 0:9d17e4342598 295 #ifndef NO_CYASSL_SERVER
wolfSSL 0:9d17e4342598 296 if (ssl->options.side == CYASSL_SERVER_END)
wolfSSL 0:9d17e4342598 297 err = CyaSSL_accept(ssl);
wolfSSL 0:9d17e4342598 298 #endif
wolfSSL 0:9d17e4342598 299
wolfSSL 0:9d17e4342598 300 #ifndef NO_CYASSL_CLIENT
wolfSSL 0:9d17e4342598 301 if (ssl->options.side == CYASSL_CLIENT_END)
wolfSSL 0:9d17e4342598 302 err = CyaSSL_connect(ssl);
wolfSSL 0:9d17e4342598 303 #endif
wolfSSL 0:9d17e4342598 304
wolfSSL 0:9d17e4342598 305 CYASSL_LEAVE("CyaSSL_negotiate", err);
wolfSSL 0:9d17e4342598 306
wolfSSL 0:9d17e4342598 307 return err;
wolfSSL 0:9d17e4342598 308 }
wolfSSL 0:9d17e4342598 309
wolfSSL 0:9d17e4342598 310
wolfSSL 0:9d17e4342598 311 #ifndef CYASSL_LEANPSK
wolfSSL 0:9d17e4342598 312 /* object size based on build */
wolfSSL 0:9d17e4342598 313 int CyaSSL_GetObjectSize(void)
wolfSSL 0:9d17e4342598 314 {
wolfSSL 0:9d17e4342598 315 #ifdef SHOW_SIZES
wolfSSL 0:9d17e4342598 316 printf("sizeof suites = %lu\n", sizeof(Suites));
wolfSSL 0:9d17e4342598 317 printf("sizeof ciphers(2) = %lu\n", sizeof(Ciphers));
wolfSSL 0:9d17e4342598 318 #ifndef NO_RC4
wolfSSL 0:9d17e4342598 319 printf(" sizeof arc4 = %lu\n", sizeof(Arc4));
wolfSSL 0:9d17e4342598 320 #endif
wolfSSL 0:9d17e4342598 321 printf(" sizeof aes = %lu\n", sizeof(Aes));
wolfSSL 0:9d17e4342598 322 #ifndef NO_DES3
wolfSSL 0:9d17e4342598 323 printf(" sizeof des3 = %lu\n", sizeof(Des3));
wolfSSL 0:9d17e4342598 324 #endif
wolfSSL 0:9d17e4342598 325 #ifndef NO_RABBIT
wolfSSL 0:9d17e4342598 326 printf(" sizeof rabbit = %lu\n", sizeof(Rabbit));
wolfSSL 0:9d17e4342598 327 #endif
wolfSSL 0:9d17e4342598 328 printf("sizeof cipher specs = %lu\n", sizeof(CipherSpecs));
wolfSSL 0:9d17e4342598 329 printf("sizeof keys = %lu\n", sizeof(Keys));
wolfSSL 0:9d17e4342598 330 printf("sizeof Hashes(2) = %lu\n", sizeof(Hashes));
wolfSSL 0:9d17e4342598 331 #ifndef NO_MD5
wolfSSL 0:9d17e4342598 332 printf(" sizeof MD5 = %lu\n", sizeof(Md5));
wolfSSL 0:9d17e4342598 333 #endif
wolfSSL 0:9d17e4342598 334 #ifndef NO_SHA
wolfSSL 0:9d17e4342598 335 printf(" sizeof SHA = %lu\n", sizeof(Sha));
wolfSSL 0:9d17e4342598 336 #endif
wolfSSL 0:9d17e4342598 337 #ifndef NO_SHA256
wolfSSL 0:9d17e4342598 338 printf(" sizeof SHA256 = %lu\n", sizeof(Sha256));
wolfSSL 0:9d17e4342598 339 #endif
wolfSSL 0:9d17e4342598 340 #ifdef CYASSL_SHA384
wolfSSL 0:9d17e4342598 341 printf(" sizeof SHA384 = %lu\n", sizeof(Sha384));
wolfSSL 0:9d17e4342598 342 #endif
wolfSSL 0:9d17e4342598 343 #ifdef CYASSL_SHA384
wolfSSL 0:9d17e4342598 344 printf(" sizeof SHA512 = %lu\n", sizeof(Sha512));
wolfSSL 0:9d17e4342598 345 #endif
wolfSSL 0:9d17e4342598 346 printf("sizeof Buffers = %lu\n", sizeof(Buffers));
wolfSSL 0:9d17e4342598 347 printf("sizeof Options = %lu\n", sizeof(Options));
wolfSSL 0:9d17e4342598 348 printf("sizeof Arrays = %lu\n", sizeof(Arrays));
wolfSSL 0:9d17e4342598 349 #ifndef NO_RSA
wolfSSL 0:9d17e4342598 350 printf("sizeof RsaKey = %lu\n", sizeof(RsaKey));
wolfSSL 0:9d17e4342598 351 #endif
wolfSSL 0:9d17e4342598 352 #ifdef HAVE_ECC
wolfSSL 0:9d17e4342598 353 printf("sizeof ecc_key = %lu\n", sizeof(ecc_key));
wolfSSL 0:9d17e4342598 354 #endif
wolfSSL 0:9d17e4342598 355 printf("sizeof CYASSL_CIPHER = %lu\n", sizeof(CYASSL_CIPHER));
wolfSSL 0:9d17e4342598 356 printf("sizeof CYASSL_SESSION = %lu\n", sizeof(CYASSL_SESSION));
wolfSSL 0:9d17e4342598 357 printf("sizeof CYASSL = %lu\n", sizeof(CYASSL));
wolfSSL 0:9d17e4342598 358 printf("sizeof CYASSL_CTX = %lu\n", sizeof(CYASSL_CTX));
wolfSSL 0:9d17e4342598 359 #endif
wolfSSL 0:9d17e4342598 360
wolfSSL 0:9d17e4342598 361 return sizeof(CYASSL);
wolfSSL 0:9d17e4342598 362 }
wolfSSL 0:9d17e4342598 363 #endif
wolfSSL 0:9d17e4342598 364
wolfSSL 0:9d17e4342598 365 /* XXX should be NO_DH */
wolfSSL 0:9d17e4342598 366 #ifndef NO_CERTS
wolfSSL 0:9d17e4342598 367 /* server Diffie-Hellman parameters, SSL_SUCCESS on ok */
wolfSSL 0:9d17e4342598 368 int CyaSSL_SetTmpDH(CYASSL* ssl, const unsigned char* p, int pSz,
wolfSSL 0:9d17e4342598 369 const unsigned char* g, int gSz)
wolfSSL 0:9d17e4342598 370 {
wolfSSL 0:9d17e4342598 371 byte havePSK = 0;
wolfSSL 0:9d17e4342598 372 byte haveRSA = 1;
wolfSSL 0:9d17e4342598 373
wolfSSL 0:9d17e4342598 374 CYASSL_ENTER("CyaSSL_SetTmpDH");
wolfSSL 0:9d17e4342598 375 if (ssl == NULL || p == NULL || g == NULL) return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 376
wolfSSL 0:9d17e4342598 377 if (ssl->options.side != CYASSL_SERVER_END)
wolfSSL 0:9d17e4342598 378 return SIDE_ERROR;
wolfSSL 0:9d17e4342598 379
wolfSSL 0:9d17e4342598 380 if (ssl->buffers.serverDH_P.buffer && ssl->buffers.weOwnDH)
wolfSSL 0:9d17e4342598 381 XFREE(ssl->buffers.serverDH_P.buffer, ssl->ctx->heap, DYNAMIC_TYPE_DH);
wolfSSL 0:9d17e4342598 382 if (ssl->buffers.serverDH_G.buffer && ssl->buffers.weOwnDH)
wolfSSL 0:9d17e4342598 383 XFREE(ssl->buffers.serverDH_G.buffer, ssl->ctx->heap, DYNAMIC_TYPE_DH);
wolfSSL 0:9d17e4342598 384
wolfSSL 0:9d17e4342598 385 ssl->buffers.weOwnDH = 1; /* SSL owns now */
wolfSSL 0:9d17e4342598 386 ssl->buffers.serverDH_P.buffer = (byte*)XMALLOC(pSz, ssl->ctx->heap,
wolfSSL 0:9d17e4342598 387 DYNAMIC_TYPE_DH);
wolfSSL 0:9d17e4342598 388 if (ssl->buffers.serverDH_P.buffer == NULL)
wolfSSL 0:9d17e4342598 389 return MEMORY_E;
wolfSSL 0:9d17e4342598 390
wolfSSL 0:9d17e4342598 391 ssl->buffers.serverDH_G.buffer = (byte*)XMALLOC(gSz, ssl->ctx->heap,
wolfSSL 0:9d17e4342598 392 DYNAMIC_TYPE_DH);
wolfSSL 0:9d17e4342598 393 if (ssl->buffers.serverDH_G.buffer == NULL) {
wolfSSL 0:9d17e4342598 394 XFREE(ssl->buffers.serverDH_P.buffer, ssl->ctx->heap, DYNAMIC_TYPE_DH);
wolfSSL 0:9d17e4342598 395 return MEMORY_E;
wolfSSL 0:9d17e4342598 396 }
wolfSSL 0:9d17e4342598 397
wolfSSL 0:9d17e4342598 398 ssl->buffers.serverDH_P.length = pSz;
wolfSSL 0:9d17e4342598 399 ssl->buffers.serverDH_G.length = gSz;
wolfSSL 0:9d17e4342598 400
wolfSSL 0:9d17e4342598 401 XMEMCPY(ssl->buffers.serverDH_P.buffer, p, pSz);
wolfSSL 0:9d17e4342598 402 XMEMCPY(ssl->buffers.serverDH_G.buffer, g, gSz);
wolfSSL 0:9d17e4342598 403
wolfSSL 0:9d17e4342598 404 ssl->options.haveDH = 1;
wolfSSL 0:9d17e4342598 405 #ifndef NO_PSK
wolfSSL 0:9d17e4342598 406 havePSK = ssl->options.havePSK;
wolfSSL 0:9d17e4342598 407 #endif
wolfSSL 0:9d17e4342598 408 #ifdef NO_RSA
wolfSSL 0:9d17e4342598 409 haveRSA = 0;
wolfSSL 0:9d17e4342598 410 #endif
wolfSSL 0:9d17e4342598 411 InitSuites(ssl->suites, ssl->version, haveRSA, havePSK, ssl->options.haveDH,
wolfSSL 0:9d17e4342598 412 ssl->options.haveNTRU, ssl->options.haveECDSAsig,
wolfSSL 0:9d17e4342598 413 ssl->options.haveStaticECC, ssl->options.side);
wolfSSL 0:9d17e4342598 414
wolfSSL 0:9d17e4342598 415 CYASSL_LEAVE("CyaSSL_SetTmpDH", 0);
wolfSSL 0:9d17e4342598 416 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 417 }
wolfSSL 0:9d17e4342598 418 #endif /* !NO_CERTS */
wolfSSL 0:9d17e4342598 419
wolfSSL 0:9d17e4342598 420
wolfSSL 0:9d17e4342598 421 int CyaSSL_write(CYASSL* ssl, const void* data, int sz)
wolfSSL 0:9d17e4342598 422 {
wolfSSL 0:9d17e4342598 423 int ret;
wolfSSL 0:9d17e4342598 424
wolfSSL 0:9d17e4342598 425 CYASSL_ENTER("SSL_write()");
wolfSSL 0:9d17e4342598 426
wolfSSL 0:9d17e4342598 427 if (ssl == NULL || data == NULL || sz < 0)
wolfSSL 0:9d17e4342598 428 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 429
wolfSSL 0:9d17e4342598 430 #ifdef HAVE_ERRNO_H
wolfSSL 0:9d17e4342598 431 errno = 0;
wolfSSL 0:9d17e4342598 432 #endif
wolfSSL 0:9d17e4342598 433
wolfSSL 0:9d17e4342598 434 ret = SendData(ssl, data, sz);
wolfSSL 0:9d17e4342598 435
wolfSSL 0:9d17e4342598 436 CYASSL_LEAVE("SSL_write()", ret);
wolfSSL 0:9d17e4342598 437
wolfSSL 0:9d17e4342598 438 if (ret < 0)
wolfSSL 0:9d17e4342598 439 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 440 else
wolfSSL 0:9d17e4342598 441 return ret;
wolfSSL 0:9d17e4342598 442 }
wolfSSL 0:9d17e4342598 443
wolfSSL 0:9d17e4342598 444
wolfSSL 0:9d17e4342598 445 static int CyaSSL_read_internal(CYASSL* ssl, void* data, int sz, int peek)
wolfSSL 0:9d17e4342598 446 {
wolfSSL 0:9d17e4342598 447 int ret;
wolfSSL 0:9d17e4342598 448
wolfSSL 0:9d17e4342598 449 CYASSL_ENTER("CyaSSL_read_internal()");
wolfSSL 0:9d17e4342598 450
wolfSSL 0:9d17e4342598 451 if (ssl == NULL || data == NULL || sz < 0)
wolfSSL 0:9d17e4342598 452 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 453
wolfSSL 0:9d17e4342598 454 #ifdef HAVE_ERRNO_H
wolfSSL 0:9d17e4342598 455 errno = 0;
wolfSSL 0:9d17e4342598 456 #endif
wolfSSL 0:9d17e4342598 457 #ifdef CYASSL_DTLS
wolfSSL 0:9d17e4342598 458 if (ssl->options.dtls)
wolfSSL 0:9d17e4342598 459 ssl->dtls_expected_rx = max(sz + 100, MAX_MTU);
wolfSSL 0:9d17e4342598 460 #endif
wolfSSL 0:9d17e4342598 461
wolfSSL 0:9d17e4342598 462 #ifdef HAVE_MAX_FRAGMENT
wolfSSL 0:9d17e4342598 463 ret = ReceiveData(ssl, (byte*)data,
wolfSSL 0:9d17e4342598 464 min(sz, min(ssl->max_fragment, OUTPUT_RECORD_SIZE)), peek);
wolfSSL 0:9d17e4342598 465 #else
wolfSSL 0:9d17e4342598 466 ret = ReceiveData(ssl, (byte*)data, min(sz, OUTPUT_RECORD_SIZE), peek);
wolfSSL 0:9d17e4342598 467 #endif
wolfSSL 0:9d17e4342598 468
wolfSSL 0:9d17e4342598 469 CYASSL_LEAVE("CyaSSL_read_internal()", ret);
wolfSSL 0:9d17e4342598 470
wolfSSL 0:9d17e4342598 471 if (ret < 0)
wolfSSL 0:9d17e4342598 472 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 473 else
wolfSSL 0:9d17e4342598 474 return ret;
wolfSSL 0:9d17e4342598 475 }
wolfSSL 0:9d17e4342598 476
wolfSSL 0:9d17e4342598 477
wolfSSL 0:9d17e4342598 478 int CyaSSL_peek(CYASSL* ssl, void* data, int sz)
wolfSSL 0:9d17e4342598 479 {
wolfSSL 0:9d17e4342598 480 CYASSL_ENTER("CyaSSL_peek()");
wolfSSL 0:9d17e4342598 481
wolfSSL 0:9d17e4342598 482 return CyaSSL_read_internal(ssl, data, sz, TRUE);
wolfSSL 0:9d17e4342598 483 }
wolfSSL 0:9d17e4342598 484
wolfSSL 0:9d17e4342598 485
wolfSSL 0:9d17e4342598 486 int CyaSSL_read(CYASSL* ssl, void* data, int sz)
wolfSSL 0:9d17e4342598 487 {
wolfSSL 0:9d17e4342598 488 CYASSL_ENTER("CyaSSL_read()");
wolfSSL 0:9d17e4342598 489
wolfSSL 0:9d17e4342598 490 return CyaSSL_read_internal(ssl, data, sz, FALSE);
wolfSSL 0:9d17e4342598 491 }
wolfSSL 0:9d17e4342598 492
wolfSSL 0:9d17e4342598 493
wolfSSL 0:9d17e4342598 494 #ifdef HAVE_CAVIUM
wolfSSL 0:9d17e4342598 495
wolfSSL 0:9d17e4342598 496 /* let's use cavium, SSL_SUCCESS on ok */
wolfSSL 0:9d17e4342598 497 int CyaSSL_UseCavium(CYASSL* ssl, int devId)
wolfSSL 0:9d17e4342598 498 {
wolfSSL 0:9d17e4342598 499 if (ssl == NULL)
wolfSSL 0:9d17e4342598 500 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 501
wolfSSL 0:9d17e4342598 502 ssl->devId = devId;
wolfSSL 0:9d17e4342598 503
wolfSSL 0:9d17e4342598 504 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 505 }
wolfSSL 0:9d17e4342598 506
wolfSSL 0:9d17e4342598 507
wolfSSL 0:9d17e4342598 508 /* let's use cavium, SSL_SUCCESS on ok */
wolfSSL 0:9d17e4342598 509 int CyaSSL_CTX_UseCavium(CYASSL_CTX* ctx, int devId)
wolfSSL 0:9d17e4342598 510 {
wolfSSL 0:9d17e4342598 511 if (ctx == NULL)
wolfSSL 0:9d17e4342598 512 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 513
wolfSSL 0:9d17e4342598 514 ctx->devId = devId;
wolfSSL 0:9d17e4342598 515
wolfSSL 0:9d17e4342598 516 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 517 }
wolfSSL 0:9d17e4342598 518
wolfSSL 0:9d17e4342598 519
wolfSSL 0:9d17e4342598 520 #endif /* HAVE_CAVIUM */
wolfSSL 0:9d17e4342598 521
wolfSSL 0:9d17e4342598 522 #ifdef HAVE_SNI
wolfSSL 0:9d17e4342598 523
wolfSSL 0:9d17e4342598 524 int CyaSSL_UseSNI(CYASSL* ssl, byte type, const void* data, word16 size)
wolfSSL 0:9d17e4342598 525 {
wolfSSL 0:9d17e4342598 526 if (ssl == NULL)
wolfSSL 0:9d17e4342598 527 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 528
wolfSSL 0:9d17e4342598 529 return TLSX_UseSNI(&ssl->extensions, type, data, size);
wolfSSL 0:9d17e4342598 530 }
wolfSSL 0:9d17e4342598 531
wolfSSL 0:9d17e4342598 532 int CyaSSL_CTX_UseSNI(CYASSL_CTX* ctx, byte type, const void* data, word16 size)
wolfSSL 0:9d17e4342598 533 {
wolfSSL 0:9d17e4342598 534 if (ctx == NULL)
wolfSSL 0:9d17e4342598 535 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 536
wolfSSL 0:9d17e4342598 537 return TLSX_UseSNI(&ctx->extensions, type, data, size);
wolfSSL 0:9d17e4342598 538 }
wolfSSL 0:9d17e4342598 539
wolfSSL 0:9d17e4342598 540 #ifndef NO_CYASSL_SERVER
wolfSSL 0:9d17e4342598 541
wolfSSL 0:9d17e4342598 542 void CyaSSL_SNI_SetOptions(CYASSL* ssl, byte type, byte options)
wolfSSL 0:9d17e4342598 543 {
wolfSSL 0:9d17e4342598 544 if (ssl && ssl->extensions)
wolfSSL 0:9d17e4342598 545 TLSX_SNI_SetOptions(ssl->extensions, type, options);
wolfSSL 0:9d17e4342598 546 }
wolfSSL 0:9d17e4342598 547
wolfSSL 0:9d17e4342598 548 void CyaSSL_CTX_SNI_SetOptions(CYASSL_CTX* ctx, byte type, byte options)
wolfSSL 0:9d17e4342598 549 {
wolfSSL 0:9d17e4342598 550 if (ctx && ctx->extensions)
wolfSSL 0:9d17e4342598 551 TLSX_SNI_SetOptions(ctx->extensions, type, options);
wolfSSL 0:9d17e4342598 552 }
wolfSSL 0:9d17e4342598 553
wolfSSL 0:9d17e4342598 554 byte CyaSSL_SNI_Status(CYASSL* ssl, byte type)
wolfSSL 0:9d17e4342598 555 {
wolfSSL 0:9d17e4342598 556 return TLSX_SNI_Status(ssl ? ssl->extensions : NULL, type);
wolfSSL 0:9d17e4342598 557 }
wolfSSL 0:9d17e4342598 558
wolfSSL 0:9d17e4342598 559 word16 CyaSSL_SNI_GetRequest(CYASSL* ssl, byte type, void** data)
wolfSSL 0:9d17e4342598 560 {
wolfSSL 0:9d17e4342598 561 if (data)
wolfSSL 0:9d17e4342598 562 *data = NULL;
wolfSSL 0:9d17e4342598 563
wolfSSL 0:9d17e4342598 564 if (ssl && ssl->extensions)
wolfSSL 0:9d17e4342598 565 return TLSX_SNI_GetRequest(ssl->extensions, type, data);
wolfSSL 0:9d17e4342598 566
wolfSSL 0:9d17e4342598 567 return 0;
wolfSSL 0:9d17e4342598 568 }
wolfSSL 0:9d17e4342598 569
wolfSSL 0:9d17e4342598 570 int CyaSSL_SNI_GetFromBuffer(const byte* clientHello, word32 helloSz, byte type,
wolfSSL 0:9d17e4342598 571 byte* sni, word32* inOutSz)
wolfSSL 0:9d17e4342598 572 {
wolfSSL 0:9d17e4342598 573 if (clientHello && helloSz > 0 && sni && inOutSz && *inOutSz > 0)
wolfSSL 0:9d17e4342598 574 return TLSX_SNI_GetFromBuffer(clientHello, helloSz, type, sni, inOutSz);
wolfSSL 0:9d17e4342598 575
wolfSSL 0:9d17e4342598 576 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 577 }
wolfSSL 0:9d17e4342598 578
wolfSSL 0:9d17e4342598 579 #endif /* NO_CYASSL_SERVER */
wolfSSL 0:9d17e4342598 580
wolfSSL 0:9d17e4342598 581 #endif /* HAVE_SNI */
wolfSSL 0:9d17e4342598 582
wolfSSL 0:9d17e4342598 583
wolfSSL 0:9d17e4342598 584 #ifdef HAVE_MAX_FRAGMENT
wolfSSL 0:9d17e4342598 585 #ifndef NO_CYASSL_CLIENT
wolfSSL 0:9d17e4342598 586 int CyaSSL_UseMaxFragment(CYASSL* ssl, byte mfl)
wolfSSL 0:9d17e4342598 587 {
wolfSSL 0:9d17e4342598 588 if (ssl == NULL)
wolfSSL 0:9d17e4342598 589 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 590
wolfSSL 0:9d17e4342598 591 return TLSX_UseMaxFragment(&ssl->extensions, mfl);
wolfSSL 0:9d17e4342598 592 }
wolfSSL 0:9d17e4342598 593
wolfSSL 0:9d17e4342598 594 int CyaSSL_CTX_UseMaxFragment(CYASSL_CTX* ctx, byte mfl)
wolfSSL 0:9d17e4342598 595 {
wolfSSL 0:9d17e4342598 596 if (ctx == NULL)
wolfSSL 0:9d17e4342598 597 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 598
wolfSSL 0:9d17e4342598 599 return TLSX_UseMaxFragment(&ctx->extensions, mfl);
wolfSSL 0:9d17e4342598 600 }
wolfSSL 0:9d17e4342598 601 #endif /* NO_CYASSL_CLIENT */
wolfSSL 0:9d17e4342598 602 #endif /* HAVE_MAX_FRAGMENT */
wolfSSL 0:9d17e4342598 603
wolfSSL 0:9d17e4342598 604 #ifdef HAVE_TRUNCATED_HMAC
wolfSSL 0:9d17e4342598 605 #ifndef NO_CYASSL_CLIENT
wolfSSL 0:9d17e4342598 606 int CyaSSL_UseTruncatedHMAC(CYASSL* ssl)
wolfSSL 0:9d17e4342598 607 {
wolfSSL 0:9d17e4342598 608 if (ssl == NULL)
wolfSSL 0:9d17e4342598 609 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 610
wolfSSL 0:9d17e4342598 611 return TLSX_UseTruncatedHMAC(&ssl->extensions);
wolfSSL 0:9d17e4342598 612 }
wolfSSL 0:9d17e4342598 613
wolfSSL 0:9d17e4342598 614 int CyaSSL_CTX_UseTruncatedHMAC(CYASSL_CTX* ctx)
wolfSSL 0:9d17e4342598 615 {
wolfSSL 0:9d17e4342598 616 if (ctx == NULL)
wolfSSL 0:9d17e4342598 617 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 618
wolfSSL 0:9d17e4342598 619 return TLSX_UseTruncatedHMAC(&ctx->extensions);
wolfSSL 0:9d17e4342598 620 }
wolfSSL 0:9d17e4342598 621 #endif /* NO_CYASSL_CLIENT */
wolfSSL 0:9d17e4342598 622 #endif /* HAVE_TRUNCATED_HMAC */
wolfSSL 0:9d17e4342598 623
wolfSSL 0:9d17e4342598 624 /* Elliptic Curves */
wolfSSL 0:9d17e4342598 625 #ifdef HAVE_SUPPORTED_CURVES
wolfSSL 0:9d17e4342598 626 #ifndef NO_CYASSL_CLIENT
wolfSSL 0:9d17e4342598 627
wolfSSL 0:9d17e4342598 628 int CyaSSL_UseSupportedCurve(CYASSL* ssl, word16 name)
wolfSSL 0:9d17e4342598 629 {
wolfSSL 0:9d17e4342598 630 if (ssl == NULL)
wolfSSL 0:9d17e4342598 631 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 632
wolfSSL 0:9d17e4342598 633 switch (name) {
wolfSSL 0:9d17e4342598 634 case CYASSL_ECC_SECP160R1:
wolfSSL 0:9d17e4342598 635 case CYASSL_ECC_SECP192R1:
wolfSSL 0:9d17e4342598 636 case CYASSL_ECC_SECP224R1:
wolfSSL 0:9d17e4342598 637 case CYASSL_ECC_SECP256R1:
wolfSSL 0:9d17e4342598 638 case CYASSL_ECC_SECP384R1:
wolfSSL 0:9d17e4342598 639 case CYASSL_ECC_SECP521R1:
wolfSSL 0:9d17e4342598 640 break;
wolfSSL 0:9d17e4342598 641
wolfSSL 0:9d17e4342598 642 default:
wolfSSL 0:9d17e4342598 643 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 644 }
wolfSSL 0:9d17e4342598 645
wolfSSL 0:9d17e4342598 646 return TLSX_UseSupportedCurve(&ssl->extensions, name);
wolfSSL 0:9d17e4342598 647 }
wolfSSL 0:9d17e4342598 648
wolfSSL 0:9d17e4342598 649 int CyaSSL_CTX_UseSupportedCurve(CYASSL_CTX* ctx, word16 name)
wolfSSL 0:9d17e4342598 650 {
wolfSSL 0:9d17e4342598 651 if (ctx == NULL)
wolfSSL 0:9d17e4342598 652 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 653
wolfSSL 0:9d17e4342598 654 switch (name) {
wolfSSL 0:9d17e4342598 655 case CYASSL_ECC_SECP160R1:
wolfSSL 0:9d17e4342598 656 case CYASSL_ECC_SECP192R1:
wolfSSL 0:9d17e4342598 657 case CYASSL_ECC_SECP224R1:
wolfSSL 0:9d17e4342598 658 case CYASSL_ECC_SECP256R1:
wolfSSL 0:9d17e4342598 659 case CYASSL_ECC_SECP384R1:
wolfSSL 0:9d17e4342598 660 case CYASSL_ECC_SECP521R1:
wolfSSL 0:9d17e4342598 661 break;
wolfSSL 0:9d17e4342598 662
wolfSSL 0:9d17e4342598 663 default:
wolfSSL 0:9d17e4342598 664 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 665 }
wolfSSL 0:9d17e4342598 666
wolfSSL 0:9d17e4342598 667 return TLSX_UseSupportedCurve(&ctx->extensions, name);
wolfSSL 0:9d17e4342598 668 }
wolfSSL 0:9d17e4342598 669
wolfSSL 0:9d17e4342598 670 #endif /* NO_CYASSL_CLIENT */
wolfSSL 0:9d17e4342598 671 #endif /* HAVE_SUPPORTED_CURVES */
wolfSSL 0:9d17e4342598 672
wolfSSL 0:9d17e4342598 673
wolfSSL 0:9d17e4342598 674 #ifndef CYASSL_LEANPSK
wolfSSL 0:9d17e4342598 675 int CyaSSL_send(CYASSL* ssl, const void* data, int sz, int flags)
wolfSSL 0:9d17e4342598 676 {
wolfSSL 0:9d17e4342598 677 int ret;
wolfSSL 0:9d17e4342598 678 int oldFlags;
wolfSSL 0:9d17e4342598 679
wolfSSL 0:9d17e4342598 680 CYASSL_ENTER("CyaSSL_send()");
wolfSSL 0:9d17e4342598 681
wolfSSL 0:9d17e4342598 682 if (ssl == NULL || data == NULL || sz < 0)
wolfSSL 0:9d17e4342598 683 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 684
wolfSSL 0:9d17e4342598 685 oldFlags = ssl->wflags;
wolfSSL 0:9d17e4342598 686
wolfSSL 0:9d17e4342598 687 ssl->wflags = flags;
wolfSSL 0:9d17e4342598 688 ret = CyaSSL_write(ssl, data, sz);
wolfSSL 0:9d17e4342598 689 ssl->wflags = oldFlags;
wolfSSL 0:9d17e4342598 690
wolfSSL 0:9d17e4342598 691 CYASSL_LEAVE("CyaSSL_send()", ret);
wolfSSL 0:9d17e4342598 692
wolfSSL 0:9d17e4342598 693 return ret;
wolfSSL 0:9d17e4342598 694 }
wolfSSL 0:9d17e4342598 695
wolfSSL 0:9d17e4342598 696
wolfSSL 0:9d17e4342598 697 int CyaSSL_recv(CYASSL* ssl, void* data, int sz, int flags)
wolfSSL 0:9d17e4342598 698 {
wolfSSL 0:9d17e4342598 699 int ret;
wolfSSL 0:9d17e4342598 700 int oldFlags;
wolfSSL 0:9d17e4342598 701
wolfSSL 0:9d17e4342598 702 CYASSL_ENTER("CyaSSL_recv()");
wolfSSL 0:9d17e4342598 703
wolfSSL 0:9d17e4342598 704 if (ssl == NULL || data == NULL || sz < 0)
wolfSSL 0:9d17e4342598 705 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 706
wolfSSL 0:9d17e4342598 707 oldFlags = ssl->rflags;
wolfSSL 0:9d17e4342598 708
wolfSSL 0:9d17e4342598 709 ssl->rflags = flags;
wolfSSL 0:9d17e4342598 710 ret = CyaSSL_read(ssl, data, sz);
wolfSSL 0:9d17e4342598 711 ssl->rflags = oldFlags;
wolfSSL 0:9d17e4342598 712
wolfSSL 0:9d17e4342598 713 CYASSL_LEAVE("CyaSSL_recv()", ret);
wolfSSL 0:9d17e4342598 714
wolfSSL 0:9d17e4342598 715 return ret;
wolfSSL 0:9d17e4342598 716 }
wolfSSL 0:9d17e4342598 717 #endif
wolfSSL 0:9d17e4342598 718
wolfSSL 0:9d17e4342598 719
wolfSSL 0:9d17e4342598 720 /* SSL_SUCCESS on ok */
wolfSSL 0:9d17e4342598 721 int CyaSSL_shutdown(CYASSL* ssl)
wolfSSL 0:9d17e4342598 722 {
wolfSSL 0:9d17e4342598 723 CYASSL_ENTER("SSL_shutdown()");
wolfSSL 0:9d17e4342598 724
wolfSSL 0:9d17e4342598 725 if (ssl == NULL)
wolfSSL 0:9d17e4342598 726 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 727
wolfSSL 0:9d17e4342598 728 if (ssl->options.quietShutdown) {
wolfSSL 0:9d17e4342598 729 CYASSL_MSG("quiet shutdown, no close notify sent");
wolfSSL 0:9d17e4342598 730 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 731 }
wolfSSL 0:9d17e4342598 732
wolfSSL 0:9d17e4342598 733 /* try to send close notify, not an error if can't */
wolfSSL 0:9d17e4342598 734 if (!ssl->options.isClosed && !ssl->options.connReset &&
wolfSSL 0:9d17e4342598 735 !ssl->options.sentNotify) {
wolfSSL 0:9d17e4342598 736 ssl->error = SendAlert(ssl, alert_warning, close_notify);
wolfSSL 0:9d17e4342598 737 if (ssl->error < 0) {
wolfSSL 0:9d17e4342598 738 CYASSL_ERROR(ssl->error);
wolfSSL 0:9d17e4342598 739 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 740 }
wolfSSL 0:9d17e4342598 741 ssl->options.sentNotify = 1; /* don't send close_notify twice */
wolfSSL 0:9d17e4342598 742 }
wolfSSL 0:9d17e4342598 743
wolfSSL 0:9d17e4342598 744 CYASSL_LEAVE("SSL_shutdown()", ssl->error);
wolfSSL 0:9d17e4342598 745
wolfSSL 0:9d17e4342598 746 ssl->error = SSL_ERROR_SYSCALL; /* simulate OpenSSL behavior */
wolfSSL 0:9d17e4342598 747
wolfSSL 0:9d17e4342598 748 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 749 }
wolfSSL 0:9d17e4342598 750
wolfSSL 0:9d17e4342598 751
wolfSSL 0:9d17e4342598 752 int CyaSSL_get_error(CYASSL* ssl, int ret)
wolfSSL 0:9d17e4342598 753 {
wolfSSL 0:9d17e4342598 754 CYASSL_ENTER("SSL_get_error");
wolfSSL 0:9d17e4342598 755
wolfSSL 0:9d17e4342598 756 if (ret > 0)
wolfSSL 0:9d17e4342598 757 return SSL_ERROR_NONE;
wolfSSL 0:9d17e4342598 758 if (ssl == NULL)
wolfSSL 0:9d17e4342598 759 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 760
wolfSSL 0:9d17e4342598 761 CYASSL_LEAVE("SSL_get_error", ssl->error);
wolfSSL 0:9d17e4342598 762
wolfSSL 0:9d17e4342598 763 /* make sure converted types are handled in SetErrorString() too */
wolfSSL 0:9d17e4342598 764 if (ssl->error == WANT_READ)
wolfSSL 0:9d17e4342598 765 return SSL_ERROR_WANT_READ; /* convert to OpenSSL type */
wolfSSL 0:9d17e4342598 766 else if (ssl->error == WANT_WRITE)
wolfSSL 0:9d17e4342598 767 return SSL_ERROR_WANT_WRITE; /* convert to OpenSSL type */
wolfSSL 0:9d17e4342598 768 else if (ssl->error == ZERO_RETURN)
wolfSSL 0:9d17e4342598 769 return SSL_ERROR_ZERO_RETURN; /* convert to OpenSSL type */
wolfSSL 0:9d17e4342598 770 return ssl->error;
wolfSSL 0:9d17e4342598 771 }
wolfSSL 0:9d17e4342598 772
wolfSSL 0:9d17e4342598 773
wolfSSL 0:9d17e4342598 774 /* retrive alert history, SSL_SUCCESS on ok */
wolfSSL 0:9d17e4342598 775 int CyaSSL_get_alert_history(CYASSL* ssl, CYASSL_ALERT_HISTORY *h)
wolfSSL 0:9d17e4342598 776 {
wolfSSL 0:9d17e4342598 777 if (ssl && h) {
wolfSSL 0:9d17e4342598 778 *h = ssl->alert_history;
wolfSSL 0:9d17e4342598 779 }
wolfSSL 0:9d17e4342598 780 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 781 }
wolfSSL 0:9d17e4342598 782
wolfSSL 0:9d17e4342598 783
wolfSSL 0:9d17e4342598 784 /* return TRUE if current error is want read */
wolfSSL 0:9d17e4342598 785 int CyaSSL_want_read(CYASSL* ssl)
wolfSSL 0:9d17e4342598 786 {
wolfSSL 0:9d17e4342598 787 CYASSL_ENTER("SSL_want_read");
wolfSSL 0:9d17e4342598 788 if (ssl->error == WANT_READ)
wolfSSL 0:9d17e4342598 789 return 1;
wolfSSL 0:9d17e4342598 790
wolfSSL 0:9d17e4342598 791 return 0;
wolfSSL 0:9d17e4342598 792 }
wolfSSL 0:9d17e4342598 793
wolfSSL 0:9d17e4342598 794
wolfSSL 0:9d17e4342598 795 /* return TRUE if current error is want write */
wolfSSL 0:9d17e4342598 796 int CyaSSL_want_write(CYASSL* ssl)
wolfSSL 0:9d17e4342598 797 {
wolfSSL 0:9d17e4342598 798 CYASSL_ENTER("SSL_want_write");
wolfSSL 0:9d17e4342598 799 if (ssl->error == WANT_WRITE)
wolfSSL 0:9d17e4342598 800 return 1;
wolfSSL 0:9d17e4342598 801
wolfSSL 0:9d17e4342598 802 return 0;
wolfSSL 0:9d17e4342598 803 }
wolfSSL 0:9d17e4342598 804
wolfSSL 0:9d17e4342598 805
wolfSSL 0:9d17e4342598 806 char* CyaSSL_ERR_error_string(unsigned long errNumber, char* data)
wolfSSL 0:9d17e4342598 807 {
wolfSSL 0:9d17e4342598 808 static const char* msg = "Please supply a buffer for error string";
wolfSSL 0:9d17e4342598 809
wolfSSL 0:9d17e4342598 810 CYASSL_ENTER("ERR_error_string");
wolfSSL 0:9d17e4342598 811 if (data) {
wolfSSL 0:9d17e4342598 812 SetErrorString((int)errNumber, data);
wolfSSL 0:9d17e4342598 813 return data;
wolfSSL 0:9d17e4342598 814 }
wolfSSL 0:9d17e4342598 815
wolfSSL 0:9d17e4342598 816 return (char*)msg;
wolfSSL 0:9d17e4342598 817 }
wolfSSL 0:9d17e4342598 818
wolfSSL 0:9d17e4342598 819
wolfSSL 0:9d17e4342598 820 void CyaSSL_ERR_error_string_n(unsigned long e, char* buf, unsigned long len)
wolfSSL 0:9d17e4342598 821 {
wolfSSL 0:9d17e4342598 822 CYASSL_ENTER("CyaSSL_ERR_error_string_n");
wolfSSL 0:9d17e4342598 823 if (len >= CYASSL_MAX_ERROR_SZ)
wolfSSL 0:9d17e4342598 824 CyaSSL_ERR_error_string(e, buf);
wolfSSL 0:9d17e4342598 825 else {
wolfSSL 0:9d17e4342598 826 char tmp[CYASSL_MAX_ERROR_SZ];
wolfSSL 0:9d17e4342598 827
wolfSSL 0:9d17e4342598 828 CYASSL_MSG("Error buffer too short, truncating");
wolfSSL 0:9d17e4342598 829 if (len) {
wolfSSL 0:9d17e4342598 830 CyaSSL_ERR_error_string(e, tmp);
wolfSSL 0:9d17e4342598 831 XMEMCPY(buf, tmp, len-1);
wolfSSL 0:9d17e4342598 832 buf[len-1] = '\0';
wolfSSL 0:9d17e4342598 833 }
wolfSSL 0:9d17e4342598 834 }
wolfSSL 0:9d17e4342598 835 }
wolfSSL 0:9d17e4342598 836
wolfSSL 0:9d17e4342598 837
wolfSSL 0:9d17e4342598 838 /* don't free temporary arrays at end of handshake */
wolfSSL 0:9d17e4342598 839 void CyaSSL_KeepArrays(CYASSL* ssl)
wolfSSL 0:9d17e4342598 840 {
wolfSSL 0:9d17e4342598 841 if (ssl)
wolfSSL 0:9d17e4342598 842 ssl->options.saveArrays = 1;
wolfSSL 0:9d17e4342598 843 }
wolfSSL 0:9d17e4342598 844
wolfSSL 0:9d17e4342598 845
wolfSSL 0:9d17e4342598 846 /* user doesn't need temporary arrays anymore, Free */
wolfSSL 0:9d17e4342598 847 void CyaSSL_FreeArrays(CYASSL* ssl)
wolfSSL 0:9d17e4342598 848 {
wolfSSL 0:9d17e4342598 849 if (ssl && ssl->options.handShakeState == HANDSHAKE_DONE) {
wolfSSL 0:9d17e4342598 850 ssl->options.saveArrays = 0;
wolfSSL 0:9d17e4342598 851 FreeArrays(ssl, 1);
wolfSSL 0:9d17e4342598 852 }
wolfSSL 0:9d17e4342598 853 }
wolfSSL 0:9d17e4342598 854
wolfSSL 0:9d17e4342598 855
wolfSSL 0:9d17e4342598 856 const byte* CyaSSL_GetMacSecret(CYASSL* ssl, int verify)
wolfSSL 0:9d17e4342598 857 {
wolfSSL 0:9d17e4342598 858 if (ssl == NULL)
wolfSSL 0:9d17e4342598 859 return NULL;
wolfSSL 0:9d17e4342598 860
wolfSSL 0:9d17e4342598 861 if ( (ssl->options.side == CYASSL_CLIENT_END && !verify) ||
wolfSSL 0:9d17e4342598 862 (ssl->options.side == CYASSL_SERVER_END && verify) )
wolfSSL 0:9d17e4342598 863 return ssl->keys.client_write_MAC_secret;
wolfSSL 0:9d17e4342598 864 else
wolfSSL 0:9d17e4342598 865 return ssl->keys.server_write_MAC_secret;
wolfSSL 0:9d17e4342598 866 }
wolfSSL 0:9d17e4342598 867
wolfSSL 0:9d17e4342598 868
wolfSSL 0:9d17e4342598 869 #ifdef ATOMIC_USER
wolfSSL 0:9d17e4342598 870
wolfSSL 0:9d17e4342598 871 void CyaSSL_CTX_SetMacEncryptCb(CYASSL_CTX* ctx, CallbackMacEncrypt cb)
wolfSSL 0:9d17e4342598 872 {
wolfSSL 0:9d17e4342598 873 if (ctx)
wolfSSL 0:9d17e4342598 874 ctx->MacEncryptCb = cb;
wolfSSL 0:9d17e4342598 875 }
wolfSSL 0:9d17e4342598 876
wolfSSL 0:9d17e4342598 877
wolfSSL 0:9d17e4342598 878 void CyaSSL_SetMacEncryptCtx(CYASSL* ssl, void *ctx)
wolfSSL 0:9d17e4342598 879 {
wolfSSL 0:9d17e4342598 880 if (ssl)
wolfSSL 0:9d17e4342598 881 ssl->MacEncryptCtx = ctx;
wolfSSL 0:9d17e4342598 882 }
wolfSSL 0:9d17e4342598 883
wolfSSL 0:9d17e4342598 884
wolfSSL 0:9d17e4342598 885 void* CyaSSL_GetMacEncryptCtx(CYASSL* ssl)
wolfSSL 0:9d17e4342598 886 {
wolfSSL 0:9d17e4342598 887 if (ssl)
wolfSSL 0:9d17e4342598 888 return ssl->MacEncryptCtx;
wolfSSL 0:9d17e4342598 889
wolfSSL 0:9d17e4342598 890 return NULL;
wolfSSL 0:9d17e4342598 891 }
wolfSSL 0:9d17e4342598 892
wolfSSL 0:9d17e4342598 893
wolfSSL 0:9d17e4342598 894 void CyaSSL_CTX_SetDecryptVerifyCb(CYASSL_CTX* ctx, CallbackDecryptVerify cb)
wolfSSL 0:9d17e4342598 895 {
wolfSSL 0:9d17e4342598 896 if (ctx)
wolfSSL 0:9d17e4342598 897 ctx->DecryptVerifyCb = cb;
wolfSSL 0:9d17e4342598 898 }
wolfSSL 0:9d17e4342598 899
wolfSSL 0:9d17e4342598 900
wolfSSL 0:9d17e4342598 901 void CyaSSL_SetDecryptVerifyCtx(CYASSL* ssl, void *ctx)
wolfSSL 0:9d17e4342598 902 {
wolfSSL 0:9d17e4342598 903 if (ssl)
wolfSSL 0:9d17e4342598 904 ssl->DecryptVerifyCtx = ctx;
wolfSSL 0:9d17e4342598 905 }
wolfSSL 0:9d17e4342598 906
wolfSSL 0:9d17e4342598 907
wolfSSL 0:9d17e4342598 908 void* CyaSSL_GetDecryptVerifyCtx(CYASSL* ssl)
wolfSSL 0:9d17e4342598 909 {
wolfSSL 0:9d17e4342598 910 if (ssl)
wolfSSL 0:9d17e4342598 911 return ssl->DecryptVerifyCtx;
wolfSSL 0:9d17e4342598 912
wolfSSL 0:9d17e4342598 913 return NULL;
wolfSSL 0:9d17e4342598 914 }
wolfSSL 0:9d17e4342598 915
wolfSSL 0:9d17e4342598 916
wolfSSL 0:9d17e4342598 917 const byte* CyaSSL_GetClientWriteKey(CYASSL* ssl)
wolfSSL 0:9d17e4342598 918 {
wolfSSL 0:9d17e4342598 919 if (ssl)
wolfSSL 0:9d17e4342598 920 return ssl->keys.client_write_key;
wolfSSL 0:9d17e4342598 921
wolfSSL 0:9d17e4342598 922 return NULL;
wolfSSL 0:9d17e4342598 923 }
wolfSSL 0:9d17e4342598 924
wolfSSL 0:9d17e4342598 925
wolfSSL 0:9d17e4342598 926 const byte* CyaSSL_GetClientWriteIV(CYASSL* ssl)
wolfSSL 0:9d17e4342598 927 {
wolfSSL 0:9d17e4342598 928 if (ssl)
wolfSSL 0:9d17e4342598 929 return ssl->keys.client_write_IV;
wolfSSL 0:9d17e4342598 930
wolfSSL 0:9d17e4342598 931 return NULL;
wolfSSL 0:9d17e4342598 932 }
wolfSSL 0:9d17e4342598 933
wolfSSL 0:9d17e4342598 934
wolfSSL 0:9d17e4342598 935 const byte* CyaSSL_GetServerWriteKey(CYASSL* ssl)
wolfSSL 0:9d17e4342598 936 {
wolfSSL 0:9d17e4342598 937 if (ssl)
wolfSSL 0:9d17e4342598 938 return ssl->keys.server_write_key;
wolfSSL 0:9d17e4342598 939
wolfSSL 0:9d17e4342598 940 return NULL;
wolfSSL 0:9d17e4342598 941 }
wolfSSL 0:9d17e4342598 942
wolfSSL 0:9d17e4342598 943
wolfSSL 0:9d17e4342598 944 const byte* CyaSSL_GetServerWriteIV(CYASSL* ssl)
wolfSSL 0:9d17e4342598 945 {
wolfSSL 0:9d17e4342598 946 if (ssl)
wolfSSL 0:9d17e4342598 947 return ssl->keys.server_write_IV;
wolfSSL 0:9d17e4342598 948
wolfSSL 0:9d17e4342598 949 return NULL;
wolfSSL 0:9d17e4342598 950 }
wolfSSL 0:9d17e4342598 951
wolfSSL 0:9d17e4342598 952
wolfSSL 0:9d17e4342598 953 int CyaSSL_GetKeySize(CYASSL* ssl)
wolfSSL 0:9d17e4342598 954 {
wolfSSL 0:9d17e4342598 955 if (ssl)
wolfSSL 0:9d17e4342598 956 return ssl->specs.key_size;
wolfSSL 0:9d17e4342598 957
wolfSSL 0:9d17e4342598 958 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 959 }
wolfSSL 0:9d17e4342598 960
wolfSSL 0:9d17e4342598 961
wolfSSL 0:9d17e4342598 962 int CyaSSL_GetIVSize(CYASSL* ssl)
wolfSSL 0:9d17e4342598 963 {
wolfSSL 0:9d17e4342598 964 if (ssl)
wolfSSL 0:9d17e4342598 965 return ssl->specs.iv_size;
wolfSSL 0:9d17e4342598 966
wolfSSL 0:9d17e4342598 967 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 968 }
wolfSSL 0:9d17e4342598 969
wolfSSL 0:9d17e4342598 970
wolfSSL 0:9d17e4342598 971 int CyaSSL_GetBulkCipher(CYASSL* ssl)
wolfSSL 0:9d17e4342598 972 {
wolfSSL 0:9d17e4342598 973 if (ssl)
wolfSSL 0:9d17e4342598 974 return ssl->specs.bulk_cipher_algorithm;
wolfSSL 0:9d17e4342598 975
wolfSSL 0:9d17e4342598 976 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 977 }
wolfSSL 0:9d17e4342598 978
wolfSSL 0:9d17e4342598 979
wolfSSL 0:9d17e4342598 980 int CyaSSL_GetCipherType(CYASSL* ssl)
wolfSSL 0:9d17e4342598 981 {
wolfSSL 0:9d17e4342598 982 if (ssl == NULL)
wolfSSL 0:9d17e4342598 983 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 984
wolfSSL 0:9d17e4342598 985 if (ssl->specs.cipher_type == block)
wolfSSL 0:9d17e4342598 986 return CYASSL_BLOCK_TYPE;
wolfSSL 0:9d17e4342598 987 if (ssl->specs.cipher_type == stream)
wolfSSL 0:9d17e4342598 988 return CYASSL_STREAM_TYPE;
wolfSSL 0:9d17e4342598 989 if (ssl->specs.cipher_type == aead)
wolfSSL 0:9d17e4342598 990 return CYASSL_AEAD_TYPE;
wolfSSL 0:9d17e4342598 991
wolfSSL 0:9d17e4342598 992 return -1;
wolfSSL 0:9d17e4342598 993 }
wolfSSL 0:9d17e4342598 994
wolfSSL 0:9d17e4342598 995
wolfSSL 0:9d17e4342598 996 int CyaSSL_GetCipherBlockSize(CYASSL* ssl)
wolfSSL 0:9d17e4342598 997 {
wolfSSL 0:9d17e4342598 998 if (ssl == NULL)
wolfSSL 0:9d17e4342598 999 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 1000
wolfSSL 0:9d17e4342598 1001 return ssl->specs.block_size;
wolfSSL 0:9d17e4342598 1002 }
wolfSSL 0:9d17e4342598 1003
wolfSSL 0:9d17e4342598 1004
wolfSSL 0:9d17e4342598 1005 int CyaSSL_GetAeadMacSize(CYASSL* ssl)
wolfSSL 0:9d17e4342598 1006 {
wolfSSL 0:9d17e4342598 1007 if (ssl == NULL)
wolfSSL 0:9d17e4342598 1008 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 1009
wolfSSL 0:9d17e4342598 1010 return ssl->specs.aead_mac_size;
wolfSSL 0:9d17e4342598 1011 }
wolfSSL 0:9d17e4342598 1012
wolfSSL 0:9d17e4342598 1013
wolfSSL 0:9d17e4342598 1014 int CyaSSL_IsTLSv1_1(CYASSL* ssl)
wolfSSL 0:9d17e4342598 1015 {
wolfSSL 0:9d17e4342598 1016 if (ssl == NULL)
wolfSSL 0:9d17e4342598 1017 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 1018
wolfSSL 0:9d17e4342598 1019 if (ssl->options.tls1_1)
wolfSSL 0:9d17e4342598 1020 return 1;
wolfSSL 0:9d17e4342598 1021
wolfSSL 0:9d17e4342598 1022 return 0;
wolfSSL 0:9d17e4342598 1023 }
wolfSSL 0:9d17e4342598 1024
wolfSSL 0:9d17e4342598 1025
wolfSSL 0:9d17e4342598 1026 int CyaSSL_GetSide(CYASSL* ssl)
wolfSSL 0:9d17e4342598 1027 {
wolfSSL 0:9d17e4342598 1028 if (ssl)
wolfSSL 0:9d17e4342598 1029 return ssl->options.side;
wolfSSL 0:9d17e4342598 1030
wolfSSL 0:9d17e4342598 1031 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 1032 }
wolfSSL 0:9d17e4342598 1033
wolfSSL 0:9d17e4342598 1034
wolfSSL 0:9d17e4342598 1035 int CyaSSL_GetHmacSize(CYASSL* ssl)
wolfSSL 0:9d17e4342598 1036 {
wolfSSL 0:9d17e4342598 1037 /* AEAD ciphers don't have HMAC keys */
wolfSSL 0:9d17e4342598 1038 if (ssl)
wolfSSL 0:9d17e4342598 1039 return (ssl->specs.cipher_type != aead) ? ssl->specs.hash_size : 0;
wolfSSL 0:9d17e4342598 1040
wolfSSL 0:9d17e4342598 1041 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 1042 }
wolfSSL 0:9d17e4342598 1043
wolfSSL 0:9d17e4342598 1044 #endif /* ATOMIC_USER */
wolfSSL 0:9d17e4342598 1045
wolfSSL 0:9d17e4342598 1046 #ifndef NO_CERTS
wolfSSL 0:9d17e4342598 1047
wolfSSL 0:9d17e4342598 1048 CYASSL_CERT_MANAGER* CyaSSL_CertManagerNew(void)
wolfSSL 0:9d17e4342598 1049 {
wolfSSL 0:9d17e4342598 1050 CYASSL_CERT_MANAGER* cm = NULL;
wolfSSL 0:9d17e4342598 1051
wolfSSL 0:9d17e4342598 1052 CYASSL_ENTER("CyaSSL_CertManagerNew");
wolfSSL 0:9d17e4342598 1053
wolfSSL 0:9d17e4342598 1054 cm = (CYASSL_CERT_MANAGER*) XMALLOC(sizeof(CYASSL_CERT_MANAGER), 0,
wolfSSL 0:9d17e4342598 1055 DYNAMIC_TYPE_CERT_MANAGER);
wolfSSL 0:9d17e4342598 1056 if (cm) {
wolfSSL 0:9d17e4342598 1057 XMEMSET(cm, 0, sizeof(CYASSL_CERT_MANAGER));
wolfSSL 0:9d17e4342598 1058
wolfSSL 0:9d17e4342598 1059 if (InitMutex(&cm->caLock) != 0) {
wolfSSL 0:9d17e4342598 1060 CYASSL_MSG("Bad mutex init");
wolfSSL 0:9d17e4342598 1061 CyaSSL_CertManagerFree(cm);
wolfSSL 0:9d17e4342598 1062 return NULL;
wolfSSL 0:9d17e4342598 1063 }
wolfSSL 0:9d17e4342598 1064 }
wolfSSL 0:9d17e4342598 1065
wolfSSL 0:9d17e4342598 1066 return cm;
wolfSSL 0:9d17e4342598 1067 }
wolfSSL 0:9d17e4342598 1068
wolfSSL 0:9d17e4342598 1069
wolfSSL 0:9d17e4342598 1070 void CyaSSL_CertManagerFree(CYASSL_CERT_MANAGER* cm)
wolfSSL 0:9d17e4342598 1071 {
wolfSSL 0:9d17e4342598 1072 CYASSL_ENTER("CyaSSL_CertManagerFree");
wolfSSL 0:9d17e4342598 1073
wolfSSL 0:9d17e4342598 1074 if (cm) {
wolfSSL 0:9d17e4342598 1075 #ifdef HAVE_CRL
wolfSSL 0:9d17e4342598 1076 if (cm->crl)
wolfSSL 0:9d17e4342598 1077 FreeCRL(cm->crl, 1);
wolfSSL 0:9d17e4342598 1078 #endif
wolfSSL 0:9d17e4342598 1079 #ifdef HAVE_OCSP
wolfSSL 0:9d17e4342598 1080 if (cm->ocsp)
wolfSSL 0:9d17e4342598 1081 FreeOCSP(cm->ocsp, 1);
wolfSSL 0:9d17e4342598 1082 #endif
wolfSSL 0:9d17e4342598 1083 FreeSignerTable(cm->caTable, CA_TABLE_SIZE, NULL);
wolfSSL 0:9d17e4342598 1084 FreeMutex(&cm->caLock);
wolfSSL 0:9d17e4342598 1085 XFREE(cm, NULL, DYNAMIC_TYPE_CERT_MANAGER);
wolfSSL 0:9d17e4342598 1086 }
wolfSSL 0:9d17e4342598 1087
wolfSSL 0:9d17e4342598 1088 }
wolfSSL 0:9d17e4342598 1089
wolfSSL 0:9d17e4342598 1090
wolfSSL 0:9d17e4342598 1091 /* Unload the CA signer list */
wolfSSL 0:9d17e4342598 1092 int CyaSSL_CertManagerUnloadCAs(CYASSL_CERT_MANAGER* cm)
wolfSSL 0:9d17e4342598 1093 {
wolfSSL 0:9d17e4342598 1094 CYASSL_ENTER("CyaSSL_CertManagerUnloadCAs");
wolfSSL 0:9d17e4342598 1095
wolfSSL 0:9d17e4342598 1096 if (cm == NULL)
wolfSSL 0:9d17e4342598 1097 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 1098
wolfSSL 0:9d17e4342598 1099 if (LockMutex(&cm->caLock) != 0)
wolfSSL 0:9d17e4342598 1100 return BAD_MUTEX_E;
wolfSSL 0:9d17e4342598 1101
wolfSSL 0:9d17e4342598 1102 FreeSignerTable(cm->caTable, CA_TABLE_SIZE, NULL);
wolfSSL 0:9d17e4342598 1103
wolfSSL 0:9d17e4342598 1104 UnLockMutex(&cm->caLock);
wolfSSL 0:9d17e4342598 1105
wolfSSL 0:9d17e4342598 1106
wolfSSL 0:9d17e4342598 1107 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 1108 }
wolfSSL 0:9d17e4342598 1109
wolfSSL 0:9d17e4342598 1110
wolfSSL 0:9d17e4342598 1111 /* Return bytes written to buff or < 0 for error */
wolfSSL 0:9d17e4342598 1112 int CyaSSL_CertPemToDer(const unsigned char* pem, int pemSz,
wolfSSL 0:9d17e4342598 1113 unsigned char* buff, int buffSz,
wolfSSL 0:9d17e4342598 1114 int type)
wolfSSL 0:9d17e4342598 1115 {
wolfSSL 0:9d17e4342598 1116 EncryptedInfo info;
wolfSSL 0:9d17e4342598 1117 int eccKey = 0;
wolfSSL 0:9d17e4342598 1118 int ret;
wolfSSL 0:9d17e4342598 1119 buffer der;
wolfSSL 0:9d17e4342598 1120
wolfSSL 0:9d17e4342598 1121 CYASSL_ENTER("CyaSSL_CertPemToDer");
wolfSSL 0:9d17e4342598 1122
wolfSSL 0:9d17e4342598 1123 if (pem == NULL || buff == NULL || buffSz <= 0) {
wolfSSL 0:9d17e4342598 1124 CYASSL_MSG("Bad pem der args");
wolfSSL 0:9d17e4342598 1125 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 1126 }
wolfSSL 0:9d17e4342598 1127
wolfSSL 0:9d17e4342598 1128 if (type != CERT_TYPE && type != CA_TYPE && type != CERTREQ_TYPE) {
wolfSSL 0:9d17e4342598 1129 CYASSL_MSG("Bad cert type");
wolfSSL 0:9d17e4342598 1130 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 1131 }
wolfSSL 0:9d17e4342598 1132
wolfSSL 0:9d17e4342598 1133 info.set = 0;
wolfSSL 0:9d17e4342598 1134 info.ctx = NULL;
wolfSSL 0:9d17e4342598 1135 info.consumed = 0;
wolfSSL 0:9d17e4342598 1136 der.buffer = NULL;
wolfSSL 0:9d17e4342598 1137
wolfSSL 0:9d17e4342598 1138 ret = PemToDer(pem, pemSz, type, &der, NULL, &info, &eccKey);
wolfSSL 0:9d17e4342598 1139 if (ret < 0) {
wolfSSL 0:9d17e4342598 1140 CYASSL_MSG("Bad Pem To Der");
wolfSSL 0:9d17e4342598 1141 }
wolfSSL 0:9d17e4342598 1142 else {
wolfSSL 0:9d17e4342598 1143 if (der.length <= (word32)buffSz) {
wolfSSL 0:9d17e4342598 1144 XMEMCPY(buff, der.buffer, der.length);
wolfSSL 0:9d17e4342598 1145 ret = der.length;
wolfSSL 0:9d17e4342598 1146 }
wolfSSL 0:9d17e4342598 1147 else {
wolfSSL 0:9d17e4342598 1148 CYASSL_MSG("Bad der length");
wolfSSL 0:9d17e4342598 1149 ret = BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 1150 }
wolfSSL 0:9d17e4342598 1151 }
wolfSSL 0:9d17e4342598 1152
wolfSSL 0:9d17e4342598 1153 XFREE(der.buffer, NULL, DYNAMIC_TYPE_KEY);
wolfSSL 0:9d17e4342598 1154
wolfSSL 0:9d17e4342598 1155 return ret;
wolfSSL 0:9d17e4342598 1156 }
wolfSSL 0:9d17e4342598 1157
wolfSSL 0:9d17e4342598 1158
wolfSSL 0:9d17e4342598 1159 #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
wolfSSL 0:9d17e4342598 1160
wolfSSL 0:9d17e4342598 1161 /* our KeyPemToDer password callback, password in userData */
wolfSSL 0:9d17e4342598 1162 static INLINE int OurPasswordCb(char* passwd, int sz, int rw, void* userdata)
wolfSSL 0:9d17e4342598 1163 {
wolfSSL 0:9d17e4342598 1164 (void)rw;
wolfSSL 0:9d17e4342598 1165
wolfSSL 0:9d17e4342598 1166 if (userdata == NULL)
wolfSSL 0:9d17e4342598 1167 return 0;
wolfSSL 0:9d17e4342598 1168
wolfSSL 0:9d17e4342598 1169 XSTRNCPY(passwd, (char*)userdata, sz);
wolfSSL 0:9d17e4342598 1170 return min((word32)sz, (word32)XSTRLEN((char*)userdata));
wolfSSL 0:9d17e4342598 1171 }
wolfSSL 0:9d17e4342598 1172
wolfSSL 0:9d17e4342598 1173 #endif /* OPENSSL_EXTRA || HAVE_WEBSERVER */
wolfSSL 0:9d17e4342598 1174
wolfSSL 0:9d17e4342598 1175
wolfSSL 0:9d17e4342598 1176 /* Return bytes written to buff or < 0 for error */
wolfSSL 0:9d17e4342598 1177 int CyaSSL_KeyPemToDer(const unsigned char* pem, int pemSz, unsigned char* buff,
wolfSSL 0:9d17e4342598 1178 int buffSz, const char* pass)
wolfSSL 0:9d17e4342598 1179 {
wolfSSL 0:9d17e4342598 1180 EncryptedInfo info;
wolfSSL 0:9d17e4342598 1181 int eccKey = 0;
wolfSSL 0:9d17e4342598 1182 int ret;
wolfSSL 0:9d17e4342598 1183 buffer der;
wolfSSL 0:9d17e4342598 1184
wolfSSL 0:9d17e4342598 1185 (void)pass;
wolfSSL 0:9d17e4342598 1186
wolfSSL 0:9d17e4342598 1187 CYASSL_ENTER("CyaSSL_KeyPemToDer");
wolfSSL 0:9d17e4342598 1188
wolfSSL 0:9d17e4342598 1189 if (pem == NULL || buff == NULL || buffSz <= 0) {
wolfSSL 0:9d17e4342598 1190 CYASSL_MSG("Bad pem der args");
wolfSSL 0:9d17e4342598 1191 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 1192 }
wolfSSL 0:9d17e4342598 1193
wolfSSL 0:9d17e4342598 1194 info.set = 0;
wolfSSL 0:9d17e4342598 1195 info.ctx = NULL;
wolfSSL 0:9d17e4342598 1196 info.consumed = 0;
wolfSSL 0:9d17e4342598 1197 der.buffer = NULL;
wolfSSL 0:9d17e4342598 1198
wolfSSL 0:9d17e4342598 1199 #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
wolfSSL 0:9d17e4342598 1200 if (pass) {
wolfSSL 0:9d17e4342598 1201 info.ctx = CyaSSL_CTX_new(CyaSSLv23_client_method());
wolfSSL 0:9d17e4342598 1202 if (info.ctx == NULL)
wolfSSL 0:9d17e4342598 1203 return MEMORY_E;
wolfSSL 0:9d17e4342598 1204 CyaSSL_CTX_set_default_passwd_cb(info.ctx, OurPasswordCb);
wolfSSL 0:9d17e4342598 1205 CyaSSL_CTX_set_default_passwd_cb_userdata(info.ctx, (void*)pass);
wolfSSL 0:9d17e4342598 1206 }
wolfSSL 0:9d17e4342598 1207 #endif
wolfSSL 0:9d17e4342598 1208
wolfSSL 0:9d17e4342598 1209 ret = PemToDer(pem, pemSz, PRIVATEKEY_TYPE, &der, NULL, &info, &eccKey);
wolfSSL 0:9d17e4342598 1210 if (ret < 0) {
wolfSSL 0:9d17e4342598 1211 CYASSL_MSG("Bad Pem To Der");
wolfSSL 0:9d17e4342598 1212 }
wolfSSL 0:9d17e4342598 1213 else {
wolfSSL 0:9d17e4342598 1214 if (der.length <= (word32)buffSz) {
wolfSSL 0:9d17e4342598 1215 XMEMCPY(buff, der.buffer, der.length);
wolfSSL 0:9d17e4342598 1216 ret = der.length;
wolfSSL 0:9d17e4342598 1217 }
wolfSSL 0:9d17e4342598 1218 else {
wolfSSL 0:9d17e4342598 1219 CYASSL_MSG("Bad der length");
wolfSSL 0:9d17e4342598 1220 ret = BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 1221 }
wolfSSL 0:9d17e4342598 1222 }
wolfSSL 0:9d17e4342598 1223
wolfSSL 0:9d17e4342598 1224 XFREE(der.buffer, NULL, DYNAMIC_TYPE_KEY);
wolfSSL 0:9d17e4342598 1225
wolfSSL 0:9d17e4342598 1226 if (info.ctx)
wolfSSL 0:9d17e4342598 1227 CyaSSL_CTX_free(info.ctx);
wolfSSL 0:9d17e4342598 1228
wolfSSL 0:9d17e4342598 1229 return ret;
wolfSSL 0:9d17e4342598 1230 }
wolfSSL 0:9d17e4342598 1231
wolfSSL 0:9d17e4342598 1232
wolfSSL 0:9d17e4342598 1233 #endif /* !NO_CERTS */
wolfSSL 0:9d17e4342598 1234
wolfSSL 0:9d17e4342598 1235
wolfSSL 0:9d17e4342598 1236
wolfSSL 0:9d17e4342598 1237 #if !defined(NO_FILESYSTEM) && !defined(NO_STDIO_FILESYSTEM)
wolfSSL 0:9d17e4342598 1238
wolfSSL 0:9d17e4342598 1239 void CyaSSL_ERR_print_errors_fp(FILE* fp, int err)
wolfSSL 0:9d17e4342598 1240 {
wolfSSL 0:9d17e4342598 1241 char data[CYASSL_MAX_ERROR_SZ + 1];
wolfSSL 0:9d17e4342598 1242
wolfSSL 0:9d17e4342598 1243 CYASSL_ENTER("CyaSSL_ERR_print_errors_fp");
wolfSSL 0:9d17e4342598 1244 SetErrorString(err, data);
wolfSSL 0:9d17e4342598 1245 fprintf(fp, "%s", data);
wolfSSL 0:9d17e4342598 1246 }
wolfSSL 0:9d17e4342598 1247
wolfSSL 0:9d17e4342598 1248 #endif
wolfSSL 0:9d17e4342598 1249
wolfSSL 0:9d17e4342598 1250
wolfSSL 0:9d17e4342598 1251 int CyaSSL_pending(CYASSL* ssl)
wolfSSL 0:9d17e4342598 1252 {
wolfSSL 0:9d17e4342598 1253 CYASSL_ENTER("SSL_pending");
wolfSSL 0:9d17e4342598 1254 return ssl->buffers.clearOutputBuffer.length;
wolfSSL 0:9d17e4342598 1255 }
wolfSSL 0:9d17e4342598 1256
wolfSSL 0:9d17e4342598 1257
wolfSSL 0:9d17e4342598 1258 #ifndef CYASSL_LEANPSK
wolfSSL 0:9d17e4342598 1259 /* trun on handshake group messages for context */
wolfSSL 0:9d17e4342598 1260 int CyaSSL_CTX_set_group_messages(CYASSL_CTX* ctx)
wolfSSL 0:9d17e4342598 1261 {
wolfSSL 0:9d17e4342598 1262 if (ctx == NULL)
wolfSSL 0:9d17e4342598 1263 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 1264
wolfSSL 0:9d17e4342598 1265 ctx->groupMessages = 1;
wolfSSL 0:9d17e4342598 1266
wolfSSL 0:9d17e4342598 1267 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 1268 }
wolfSSL 0:9d17e4342598 1269 #endif
wolfSSL 0:9d17e4342598 1270
wolfSSL 0:9d17e4342598 1271
wolfSSL 0:9d17e4342598 1272 #ifndef NO_CYASSL_CLIENT
wolfSSL 0:9d17e4342598 1273 /* connect enough to get peer cert chain */
wolfSSL 0:9d17e4342598 1274 int CyaSSL_connect_cert(CYASSL* ssl)
wolfSSL 0:9d17e4342598 1275 {
wolfSSL 0:9d17e4342598 1276 int ret;
wolfSSL 0:9d17e4342598 1277
wolfSSL 0:9d17e4342598 1278 if (ssl == NULL)
wolfSSL 0:9d17e4342598 1279 return SSL_FAILURE;
wolfSSL 0:9d17e4342598 1280
wolfSSL 0:9d17e4342598 1281 ssl->options.certOnly = 1;
wolfSSL 0:9d17e4342598 1282 ret = CyaSSL_connect(ssl);
wolfSSL 0:9d17e4342598 1283 ssl->options.certOnly = 0;
wolfSSL 0:9d17e4342598 1284
wolfSSL 0:9d17e4342598 1285 return ret;
wolfSSL 0:9d17e4342598 1286 }
wolfSSL 0:9d17e4342598 1287 #endif
wolfSSL 0:9d17e4342598 1288
wolfSSL 0:9d17e4342598 1289
wolfSSL 0:9d17e4342598 1290 #ifndef CYASSL_LEANPSK
wolfSSL 0:9d17e4342598 1291 /* trun on handshake group messages for ssl object */
wolfSSL 0:9d17e4342598 1292 int CyaSSL_set_group_messages(CYASSL* ssl)
wolfSSL 0:9d17e4342598 1293 {
wolfSSL 0:9d17e4342598 1294 if (ssl == NULL)
wolfSSL 0:9d17e4342598 1295 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 1296
wolfSSL 0:9d17e4342598 1297 ssl->options.groupMessages = 1;
wolfSSL 0:9d17e4342598 1298
wolfSSL 0:9d17e4342598 1299 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 1300 }
wolfSSL 0:9d17e4342598 1301
wolfSSL 0:9d17e4342598 1302
wolfSSL 0:9d17e4342598 1303 int CyaSSL_SetVersion(CYASSL* ssl, int version)
wolfSSL 0:9d17e4342598 1304 {
wolfSSL 0:9d17e4342598 1305 byte haveRSA = 1;
wolfSSL 0:9d17e4342598 1306 byte havePSK = 0;
wolfSSL 0:9d17e4342598 1307
wolfSSL 0:9d17e4342598 1308 CYASSL_ENTER("CyaSSL_SetVersion");
wolfSSL 0:9d17e4342598 1309
wolfSSL 0:9d17e4342598 1310 if (ssl == NULL) {
wolfSSL 0:9d17e4342598 1311 CYASSL_MSG("Bad function argument");
wolfSSL 0:9d17e4342598 1312 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 1313 }
wolfSSL 0:9d17e4342598 1314
wolfSSL 0:9d17e4342598 1315 switch (version) {
wolfSSL 0:9d17e4342598 1316 #ifndef NO_OLD_TLS
wolfSSL 0:9d17e4342598 1317 case CYASSL_SSLV3:
wolfSSL 0:9d17e4342598 1318 ssl->version = MakeSSLv3();
wolfSSL 0:9d17e4342598 1319 break;
wolfSSL 0:9d17e4342598 1320 #endif
wolfSSL 0:9d17e4342598 1321
wolfSSL 0:9d17e4342598 1322 #ifndef NO_TLS
wolfSSL 0:9d17e4342598 1323 #ifndef NO_OLD_TLS
wolfSSL 0:9d17e4342598 1324 case CYASSL_TLSV1:
wolfSSL 0:9d17e4342598 1325 ssl->version = MakeTLSv1();
wolfSSL 0:9d17e4342598 1326 break;
wolfSSL 0:9d17e4342598 1327
wolfSSL 0:9d17e4342598 1328 case CYASSL_TLSV1_1:
wolfSSL 0:9d17e4342598 1329 ssl->version = MakeTLSv1_1();
wolfSSL 0:9d17e4342598 1330 break;
wolfSSL 0:9d17e4342598 1331 #endif
wolfSSL 0:9d17e4342598 1332 case CYASSL_TLSV1_2:
wolfSSL 0:9d17e4342598 1333 ssl->version = MakeTLSv1_2();
wolfSSL 0:9d17e4342598 1334 break;
wolfSSL 0:9d17e4342598 1335 #endif
wolfSSL 0:9d17e4342598 1336
wolfSSL 0:9d17e4342598 1337 default:
wolfSSL 0:9d17e4342598 1338 CYASSL_MSG("Bad function argument");
wolfSSL 0:9d17e4342598 1339 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 1340 }
wolfSSL 0:9d17e4342598 1341
wolfSSL 0:9d17e4342598 1342 #ifdef NO_RSA
wolfSSL 0:9d17e4342598 1343 haveRSA = 0;
wolfSSL 0:9d17e4342598 1344 #endif
wolfSSL 0:9d17e4342598 1345 #ifndef NO_PSK
wolfSSL 0:9d17e4342598 1346 havePSK = ssl->options.havePSK;
wolfSSL 0:9d17e4342598 1347 #endif
wolfSSL 0:9d17e4342598 1348
wolfSSL 0:9d17e4342598 1349 InitSuites(ssl->suites, ssl->version, haveRSA, havePSK, ssl->options.haveDH,
wolfSSL 0:9d17e4342598 1350 ssl->options.haveNTRU, ssl->options.haveECDSAsig,
wolfSSL 0:9d17e4342598 1351 ssl->options.haveStaticECC, ssl->options.side);
wolfSSL 0:9d17e4342598 1352
wolfSSL 0:9d17e4342598 1353 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 1354 }
wolfSSL 0:9d17e4342598 1355 #endif /* !leanpsk */
wolfSSL 0:9d17e4342598 1356
wolfSSL 0:9d17e4342598 1357
wolfSSL 0:9d17e4342598 1358 #if !defined(NO_CERTS) || !defined(NO_SESSION_CACHE)
wolfSSL 0:9d17e4342598 1359
wolfSSL 0:9d17e4342598 1360 /* Make a work from the front of random hash */
wolfSSL 0:9d17e4342598 1361 static INLINE word32 MakeWordFromHash(const byte* hashID)
wolfSSL 0:9d17e4342598 1362 {
wolfSSL 0:9d17e4342598 1363 return (hashID[0] << 24) | (hashID[1] << 16) | (hashID[2] << 8) |
wolfSSL 0:9d17e4342598 1364 hashID[3];
wolfSSL 0:9d17e4342598 1365 }
wolfSSL 0:9d17e4342598 1366
wolfSSL 0:9d17e4342598 1367 #endif /* !NO_CERTS || !NO_SESSION_CACHE */
wolfSSL 0:9d17e4342598 1368
wolfSSL 0:9d17e4342598 1369
wolfSSL 0:9d17e4342598 1370 #ifndef NO_CERTS
wolfSSL 0:9d17e4342598 1371
wolfSSL 0:9d17e4342598 1372 /* hash is the SHA digest of name, just use first 32 bits as hash */
wolfSSL 0:9d17e4342598 1373 static INLINE word32 HashSigner(const byte* hash)
wolfSSL 0:9d17e4342598 1374 {
wolfSSL 0:9d17e4342598 1375 return MakeWordFromHash(hash) % CA_TABLE_SIZE;
wolfSSL 0:9d17e4342598 1376 }
wolfSSL 0:9d17e4342598 1377
wolfSSL 0:9d17e4342598 1378
wolfSSL 0:9d17e4342598 1379 /* does CA already exist on signer list */
wolfSSL 0:9d17e4342598 1380 int AlreadySigner(CYASSL_CERT_MANAGER* cm, byte* hash)
wolfSSL 0:9d17e4342598 1381 {
wolfSSL 0:9d17e4342598 1382 Signer* signers;
wolfSSL 0:9d17e4342598 1383 int ret = 0;
wolfSSL 0:9d17e4342598 1384 word32 row = HashSigner(hash);
wolfSSL 0:9d17e4342598 1385
wolfSSL 0:9d17e4342598 1386 if (LockMutex(&cm->caLock) != 0)
wolfSSL 0:9d17e4342598 1387 return ret;
wolfSSL 0:9d17e4342598 1388 signers = cm->caTable[row];
wolfSSL 0:9d17e4342598 1389 while (signers) {
wolfSSL 0:9d17e4342598 1390 byte* subjectHash;
wolfSSL 0:9d17e4342598 1391 #ifndef NO_SKID
wolfSSL 0:9d17e4342598 1392 subjectHash = signers->subjectKeyIdHash;
wolfSSL 0:9d17e4342598 1393 #else
wolfSSL 0:9d17e4342598 1394 subjectHash = signers->subjectNameHash;
wolfSSL 0:9d17e4342598 1395 #endif
wolfSSL 0:9d17e4342598 1396 if (XMEMCMP(hash, subjectHash, SHA_DIGEST_SIZE) == 0) {
wolfSSL 0:9d17e4342598 1397 ret = 1;
wolfSSL 0:9d17e4342598 1398 break;
wolfSSL 0:9d17e4342598 1399 }
wolfSSL 0:9d17e4342598 1400 signers = signers->next;
wolfSSL 0:9d17e4342598 1401 }
wolfSSL 0:9d17e4342598 1402 UnLockMutex(&cm->caLock);
wolfSSL 0:9d17e4342598 1403
wolfSSL 0:9d17e4342598 1404 return ret;
wolfSSL 0:9d17e4342598 1405 }
wolfSSL 0:9d17e4342598 1406
wolfSSL 0:9d17e4342598 1407
wolfSSL 0:9d17e4342598 1408 /* return CA if found, otherwise NULL */
wolfSSL 0:9d17e4342598 1409 Signer* GetCA(void* vp, byte* hash)
wolfSSL 0:9d17e4342598 1410 {
wolfSSL 0:9d17e4342598 1411 CYASSL_CERT_MANAGER* cm = (CYASSL_CERT_MANAGER*)vp;
wolfSSL 0:9d17e4342598 1412 Signer* ret = NULL;
wolfSSL 0:9d17e4342598 1413 Signer* signers;
wolfSSL 0:9d17e4342598 1414 word32 row = HashSigner(hash);
wolfSSL 0:9d17e4342598 1415
wolfSSL 0:9d17e4342598 1416 if (cm == NULL)
wolfSSL 0:9d17e4342598 1417 return NULL;
wolfSSL 0:9d17e4342598 1418
wolfSSL 0:9d17e4342598 1419 if (LockMutex(&cm->caLock) != 0)
wolfSSL 0:9d17e4342598 1420 return ret;
wolfSSL 0:9d17e4342598 1421
wolfSSL 0:9d17e4342598 1422 signers = cm->caTable[row];
wolfSSL 0:9d17e4342598 1423 while (signers) {
wolfSSL 0:9d17e4342598 1424 byte* subjectHash;
wolfSSL 0:9d17e4342598 1425 #ifndef NO_SKID
wolfSSL 0:9d17e4342598 1426 subjectHash = signers->subjectKeyIdHash;
wolfSSL 0:9d17e4342598 1427 #else
wolfSSL 0:9d17e4342598 1428 subjectHash = signers->subjectNameHash;
wolfSSL 0:9d17e4342598 1429 #endif
wolfSSL 0:9d17e4342598 1430 if (XMEMCMP(hash, subjectHash, SHA_DIGEST_SIZE) == 0) {
wolfSSL 0:9d17e4342598 1431 ret = signers;
wolfSSL 0:9d17e4342598 1432 break;
wolfSSL 0:9d17e4342598 1433 }
wolfSSL 0:9d17e4342598 1434 signers = signers->next;
wolfSSL 0:9d17e4342598 1435 }
wolfSSL 0:9d17e4342598 1436 UnLockMutex(&cm->caLock);
wolfSSL 0:9d17e4342598 1437
wolfSSL 0:9d17e4342598 1438 return ret;
wolfSSL 0:9d17e4342598 1439 }
wolfSSL 0:9d17e4342598 1440
wolfSSL 0:9d17e4342598 1441
wolfSSL 0:9d17e4342598 1442 #ifndef NO_SKID
wolfSSL 0:9d17e4342598 1443 /* return CA if found, otherwise NULL. Walk through hash table. */
wolfSSL 0:9d17e4342598 1444 Signer* GetCAByName(void* vp, byte* hash)
wolfSSL 0:9d17e4342598 1445 {
wolfSSL 0:9d17e4342598 1446 CYASSL_CERT_MANAGER* cm = (CYASSL_CERT_MANAGER*)vp;
wolfSSL 0:9d17e4342598 1447 Signer* ret = NULL;
wolfSSL 0:9d17e4342598 1448 Signer* signers;
wolfSSL 0:9d17e4342598 1449 word32 row;
wolfSSL 0:9d17e4342598 1450
wolfSSL 0:9d17e4342598 1451 if (cm == NULL)
wolfSSL 0:9d17e4342598 1452 return NULL;
wolfSSL 0:9d17e4342598 1453
wolfSSL 0:9d17e4342598 1454 if (LockMutex(&cm->caLock) != 0)
wolfSSL 0:9d17e4342598 1455 return ret;
wolfSSL 0:9d17e4342598 1456
wolfSSL 0:9d17e4342598 1457 for (row = 0; row < CA_TABLE_SIZE && ret == NULL; row++) {
wolfSSL 0:9d17e4342598 1458 signers = cm->caTable[row];
wolfSSL 0:9d17e4342598 1459 while (signers && ret == NULL) {
wolfSSL 0:9d17e4342598 1460 if (XMEMCMP(hash, signers->subjectNameHash, SHA_DIGEST_SIZE) == 0) {
wolfSSL 0:9d17e4342598 1461 ret = signers;
wolfSSL 0:9d17e4342598 1462 }
wolfSSL 0:9d17e4342598 1463 signers = signers->next;
wolfSSL 0:9d17e4342598 1464 }
wolfSSL 0:9d17e4342598 1465 }
wolfSSL 0:9d17e4342598 1466 UnLockMutex(&cm->caLock);
wolfSSL 0:9d17e4342598 1467
wolfSSL 0:9d17e4342598 1468 return ret;
wolfSSL 0:9d17e4342598 1469 }
wolfSSL 0:9d17e4342598 1470 #endif
wolfSSL 0:9d17e4342598 1471
wolfSSL 0:9d17e4342598 1472
wolfSSL 0:9d17e4342598 1473 /* owns der, internal now uses too */
wolfSSL 0:9d17e4342598 1474 /* type flag ids from user or from chain received during verify
wolfSSL 0:9d17e4342598 1475 don't allow chain ones to be added w/o isCA extension */
wolfSSL 0:9d17e4342598 1476 int AddCA(CYASSL_CERT_MANAGER* cm, buffer der, int type, int verify)
wolfSSL 0:9d17e4342598 1477 {
wolfSSL 0:9d17e4342598 1478 int ret;
wolfSSL 0:9d17e4342598 1479 DecodedCert cert;
wolfSSL 0:9d17e4342598 1480 Signer* signer = 0;
wolfSSL 0:9d17e4342598 1481 word32 row;
wolfSSL 0:9d17e4342598 1482 byte* subjectHash;
wolfSSL 0:9d17e4342598 1483
wolfSSL 0:9d17e4342598 1484 CYASSL_MSG("Adding a CA");
wolfSSL 0:9d17e4342598 1485 InitDecodedCert(&cert, der.buffer, der.length, cm->heap);
wolfSSL 0:9d17e4342598 1486 ret = ParseCert(&cert, CA_TYPE, verify, cm);
wolfSSL 0:9d17e4342598 1487 CYASSL_MSG(" Parsed new CA");
wolfSSL 0:9d17e4342598 1488
wolfSSL 0:9d17e4342598 1489 #ifndef NO_SKID
wolfSSL 0:9d17e4342598 1490 subjectHash = cert.extSubjKeyId;
wolfSSL 0:9d17e4342598 1491 #else
wolfSSL 0:9d17e4342598 1492 subjectHash = cert.subjectHash;
wolfSSL 0:9d17e4342598 1493 #endif
wolfSSL 0:9d17e4342598 1494
wolfSSL 0:9d17e4342598 1495 if (ret == 0 && cert.isCA == 0 && type != CYASSL_USER_CA) {
wolfSSL 0:9d17e4342598 1496 CYASSL_MSG(" Can't add as CA if not actually one");
wolfSSL 0:9d17e4342598 1497 ret = NOT_CA_ERROR;
wolfSSL 0:9d17e4342598 1498 }
wolfSSL 0:9d17e4342598 1499 else if (ret == 0 && AlreadySigner(cm, subjectHash)) {
wolfSSL 0:9d17e4342598 1500 CYASSL_MSG(" Already have this CA, not adding again");
wolfSSL 0:9d17e4342598 1501 (void)ret;
wolfSSL 0:9d17e4342598 1502 }
wolfSSL 0:9d17e4342598 1503 else if (ret == 0) {
wolfSSL 0:9d17e4342598 1504 /* take over signer parts */
wolfSSL 0:9d17e4342598 1505 signer = MakeSigner(cm->heap);
wolfSSL 0:9d17e4342598 1506 if (!signer)
wolfSSL 0:9d17e4342598 1507 ret = MEMORY_ERROR;
wolfSSL 0:9d17e4342598 1508 else {
wolfSSL 0:9d17e4342598 1509 signer->keyOID = cert.keyOID;
wolfSSL 0:9d17e4342598 1510 signer->publicKey = cert.publicKey;
wolfSSL 0:9d17e4342598 1511 signer->pubKeySize = cert.pubKeySize;
wolfSSL 0:9d17e4342598 1512 signer->nameLen = cert.subjectCNLen;
wolfSSL 0:9d17e4342598 1513 signer->name = cert.subjectCN;
wolfSSL 0:9d17e4342598 1514 #ifndef NO_SKID
wolfSSL 0:9d17e4342598 1515 XMEMCPY(signer->subjectKeyIdHash,
wolfSSL 0:9d17e4342598 1516 cert.extSubjKeyId, SHA_DIGEST_SIZE);
wolfSSL 0:9d17e4342598 1517 #endif
wolfSSL 0:9d17e4342598 1518 XMEMCPY(signer->subjectNameHash, cert.subjectHash, SHA_DIGEST_SIZE);
wolfSSL 0:9d17e4342598 1519 signer->next = NULL; /* in case lock fails */
wolfSSL 0:9d17e4342598 1520
wolfSSL 0:9d17e4342598 1521 cert.publicKey = 0; /* don't free here */
wolfSSL 0:9d17e4342598 1522 cert.subjectCN = 0;
wolfSSL 0:9d17e4342598 1523
wolfSSL 0:9d17e4342598 1524 #ifndef NO_SKID
wolfSSL 0:9d17e4342598 1525 row = HashSigner(signer->subjectKeyIdHash);
wolfSSL 0:9d17e4342598 1526 #else
wolfSSL 0:9d17e4342598 1527 row = HashSigner(signer->subjectNameHash);
wolfSSL 0:9d17e4342598 1528 #endif
wolfSSL 0:9d17e4342598 1529
wolfSSL 0:9d17e4342598 1530 if (LockMutex(&cm->caLock) == 0) {
wolfSSL 0:9d17e4342598 1531 signer->next = cm->caTable[row];
wolfSSL 0:9d17e4342598 1532 cm->caTable[row] = signer; /* takes ownership */
wolfSSL 0:9d17e4342598 1533 UnLockMutex(&cm->caLock);
wolfSSL 0:9d17e4342598 1534 if (cm->caCacheCallback)
wolfSSL 0:9d17e4342598 1535 cm->caCacheCallback(der.buffer, (int)der.length, type);
wolfSSL 0:9d17e4342598 1536 }
wolfSSL 0:9d17e4342598 1537 else {
wolfSSL 0:9d17e4342598 1538 CYASSL_MSG(" CA Mutex Lock failed");
wolfSSL 0:9d17e4342598 1539 ret = BAD_MUTEX_E;
wolfSSL 0:9d17e4342598 1540 FreeSigner(signer, cm->heap);
wolfSSL 0:9d17e4342598 1541 }
wolfSSL 0:9d17e4342598 1542 }
wolfSSL 0:9d17e4342598 1543 }
wolfSSL 0:9d17e4342598 1544
wolfSSL 0:9d17e4342598 1545 CYASSL_MSG(" Freeing Parsed CA");
wolfSSL 0:9d17e4342598 1546 FreeDecodedCert(&cert);
wolfSSL 0:9d17e4342598 1547 CYASSL_MSG(" Freeing der CA");
wolfSSL 0:9d17e4342598 1548 XFREE(der.buffer, cm->heap, DYNAMIC_TYPE_CA);
wolfSSL 0:9d17e4342598 1549 CYASSL_MSG(" OK Freeing der CA");
wolfSSL 0:9d17e4342598 1550
wolfSSL 0:9d17e4342598 1551 CYASSL_LEAVE("AddCA", ret);
wolfSSL 0:9d17e4342598 1552 if (ret == 0) return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 1553 return ret;
wolfSSL 0:9d17e4342598 1554 }
wolfSSL 0:9d17e4342598 1555
wolfSSL 0:9d17e4342598 1556 #endif /* !NO_CERTS */
wolfSSL 0:9d17e4342598 1557
wolfSSL 0:9d17e4342598 1558
wolfSSL 0:9d17e4342598 1559 #ifndef NO_SESSION_CACHE
wolfSSL 0:9d17e4342598 1560
wolfSSL 0:9d17e4342598 1561 /* basic config gives a cache with 33 sessions, adequate for clients and
wolfSSL 0:9d17e4342598 1562 embedded servers
wolfSSL 0:9d17e4342598 1563
wolfSSL 0:9d17e4342598 1564 MEDIUM_SESSION_CACHE allows 1055 sessions, adequate for servers that
wolfSSL 0:9d17e4342598 1565 aren't under heavy load, basically allows 200 new sessions per minute
wolfSSL 0:9d17e4342598 1566
wolfSSL 0:9d17e4342598 1567 BIG_SESSION_CACHE yields 20,027 sessions
wolfSSL 0:9d17e4342598 1568
wolfSSL 0:9d17e4342598 1569 HUGE_SESSION_CACHE yields 65,791 sessions, for servers under heavy load,
wolfSSL 0:9d17e4342598 1570 allows over 13,000 new sessions per minute or over 200 new sessions per
wolfSSL 0:9d17e4342598 1571 second
wolfSSL 0:9d17e4342598 1572
wolfSSL 0:9d17e4342598 1573 SMALL_SESSION_CACHE only stores 6 sessions, good for embedded clients
wolfSSL 0:9d17e4342598 1574 or systems where the default of nearly 3kB is too much RAM, this define
wolfSSL 0:9d17e4342598 1575 uses less than 500 bytes RAM
wolfSSL 0:9d17e4342598 1576
wolfSSL 0:9d17e4342598 1577 default SESSION_CACHE stores 33 sessions (no XXX_SESSION_CACHE defined)
wolfSSL 0:9d17e4342598 1578 */
wolfSSL 0:9d17e4342598 1579 #ifdef HUGE_SESSION_CACHE
wolfSSL 0:9d17e4342598 1580 #define SESSIONS_PER_ROW 11
wolfSSL 0:9d17e4342598 1581 #define SESSION_ROWS 5981
wolfSSL 0:9d17e4342598 1582 #elif defined(BIG_SESSION_CACHE)
wolfSSL 0:9d17e4342598 1583 #define SESSIONS_PER_ROW 7
wolfSSL 0:9d17e4342598 1584 #define SESSION_ROWS 2861
wolfSSL 0:9d17e4342598 1585 #elif defined(MEDIUM_SESSION_CACHE)
wolfSSL 0:9d17e4342598 1586 #define SESSIONS_PER_ROW 5
wolfSSL 0:9d17e4342598 1587 #define SESSION_ROWS 211
wolfSSL 0:9d17e4342598 1588 #elif defined(SMALL_SESSION_CACHE)
wolfSSL 0:9d17e4342598 1589 #define SESSIONS_PER_ROW 2
wolfSSL 0:9d17e4342598 1590 #define SESSION_ROWS 3
wolfSSL 0:9d17e4342598 1591 #else
wolfSSL 0:9d17e4342598 1592 #define SESSIONS_PER_ROW 3
wolfSSL 0:9d17e4342598 1593 #define SESSION_ROWS 11
wolfSSL 0:9d17e4342598 1594 #endif
wolfSSL 0:9d17e4342598 1595
wolfSSL 0:9d17e4342598 1596 typedef struct SessionRow {
wolfSSL 0:9d17e4342598 1597 int nextIdx; /* where to place next one */
wolfSSL 0:9d17e4342598 1598 int totalCount; /* sessions ever on this row */
wolfSSL 0:9d17e4342598 1599 CYASSL_SESSION Sessions[SESSIONS_PER_ROW];
wolfSSL 0:9d17e4342598 1600 } SessionRow;
wolfSSL 0:9d17e4342598 1601
wolfSSL 0:9d17e4342598 1602 static SessionRow SessionCache[SESSION_ROWS];
wolfSSL 0:9d17e4342598 1603
wolfSSL 0:9d17e4342598 1604 static CyaSSL_Mutex session_mutex; /* SessionCache mutex */
wolfSSL 0:9d17e4342598 1605
wolfSSL 0:9d17e4342598 1606 #ifndef NO_CLIENT_CACHE
wolfSSL 0:9d17e4342598 1607
wolfSSL 0:9d17e4342598 1608 typedef struct ClientSession {
wolfSSL 0:9d17e4342598 1609 word16 serverRow; /* SessionCache Row id */
wolfSSL 0:9d17e4342598 1610 word16 serverIdx; /* SessionCache Idx (column) */
wolfSSL 0:9d17e4342598 1611 } ClientSession;
wolfSSL 0:9d17e4342598 1612
wolfSSL 0:9d17e4342598 1613 typedef struct ClientRow {
wolfSSL 0:9d17e4342598 1614 int nextIdx; /* where to place next one */
wolfSSL 0:9d17e4342598 1615 int totalCount; /* sessions ever on this row */
wolfSSL 0:9d17e4342598 1616 ClientSession Clients[SESSIONS_PER_ROW];
wolfSSL 0:9d17e4342598 1617 } ClientRow;
wolfSSL 0:9d17e4342598 1618
wolfSSL 0:9d17e4342598 1619 static ClientRow ClientCache[SESSION_ROWS]; /* Client Cache */
wolfSSL 0:9d17e4342598 1620 /* uses session mutex */
wolfSSL 0:9d17e4342598 1621 #endif /* NO_CLIENT_CACHE */
wolfSSL 0:9d17e4342598 1622
wolfSSL 0:9d17e4342598 1623 #endif /* NO_SESSION_CACHE */
wolfSSL 0:9d17e4342598 1624
wolfSSL 0:9d17e4342598 1625
wolfSSL 0:9d17e4342598 1626 int CyaSSL_Init(void)
wolfSSL 0:9d17e4342598 1627 {
wolfSSL 0:9d17e4342598 1628 int ret = SSL_SUCCESS;
wolfSSL 0:9d17e4342598 1629
wolfSSL 0:9d17e4342598 1630 CYASSL_ENTER("CyaSSL_Init");
wolfSSL 0:9d17e4342598 1631
wolfSSL 0:9d17e4342598 1632 if (initRefCount == 0) {
wolfSSL 0:9d17e4342598 1633 #ifndef NO_SESSION_CACHE
wolfSSL 0:9d17e4342598 1634 if (InitMutex(&session_mutex) != 0)
wolfSSL 0:9d17e4342598 1635 ret = BAD_MUTEX_E;
wolfSSL 0:9d17e4342598 1636 #endif
wolfSSL 0:9d17e4342598 1637 if (InitMutex(&count_mutex) != 0)
wolfSSL 0:9d17e4342598 1638 ret = BAD_MUTEX_E;
wolfSSL 0:9d17e4342598 1639 }
wolfSSL 0:9d17e4342598 1640 if (ret == SSL_SUCCESS) {
wolfSSL 0:9d17e4342598 1641 if (LockMutex(&count_mutex) != 0) {
wolfSSL 0:9d17e4342598 1642 CYASSL_MSG("Bad Lock Mutex count");
wolfSSL 0:9d17e4342598 1643 return BAD_MUTEX_E;
wolfSSL 0:9d17e4342598 1644 }
wolfSSL 0:9d17e4342598 1645 initRefCount++;
wolfSSL 0:9d17e4342598 1646 UnLockMutex(&count_mutex);
wolfSSL 0:9d17e4342598 1647 }
wolfSSL 0:9d17e4342598 1648
wolfSSL 0:9d17e4342598 1649 return ret;
wolfSSL 0:9d17e4342598 1650 }
wolfSSL 0:9d17e4342598 1651
wolfSSL 0:9d17e4342598 1652
wolfSSL 0:9d17e4342598 1653 #ifndef NO_CERTS
wolfSSL 0:9d17e4342598 1654
wolfSSL 0:9d17e4342598 1655 /* Remove PEM header/footer, convert to ASN1, store any encrypted data
wolfSSL 0:9d17e4342598 1656 info->consumed tracks of PEM bytes consumed in case multiple parts */
wolfSSL 0:9d17e4342598 1657 int PemToDer(const unsigned char* buff, long longSz, int type,
wolfSSL 0:9d17e4342598 1658 buffer* der, void* heap, EncryptedInfo* info, int* eccKey)
wolfSSL 0:9d17e4342598 1659 {
wolfSSL 0:9d17e4342598 1660 char header[PEM_LINE_LEN];
wolfSSL 0:9d17e4342598 1661 char footer[PEM_LINE_LEN];
wolfSSL 0:9d17e4342598 1662 char* headerEnd;
wolfSSL 0:9d17e4342598 1663 char* footerEnd;
wolfSSL 0:9d17e4342598 1664 char* consumedEnd;
wolfSSL 0:9d17e4342598 1665 char* bufferEnd = (char*)(buff + longSz);
wolfSSL 0:9d17e4342598 1666 long neededSz;
wolfSSL 0:9d17e4342598 1667 int ret = 0;
wolfSSL 0:9d17e4342598 1668 int pkcs8 = 0;
wolfSSL 0:9d17e4342598 1669 int pkcs8Enc = 0;
wolfSSL 0:9d17e4342598 1670 int dynamicType = 0;
wolfSSL 0:9d17e4342598 1671 int sz = (int)longSz;
wolfSSL 0:9d17e4342598 1672
wolfSSL 0:9d17e4342598 1673 (void)heap;
wolfSSL 0:9d17e4342598 1674 (void)dynamicType;
wolfSSL 0:9d17e4342598 1675
wolfSSL 0:9d17e4342598 1676 if (type == CERT_TYPE || type == CA_TYPE) {
wolfSSL 0:9d17e4342598 1677 XSTRNCPY(header, "-----BEGIN CERTIFICATE-----", sizeof(header));
wolfSSL 0:9d17e4342598 1678 XSTRNCPY(footer, "-----END CERTIFICATE-----", sizeof(footer));
wolfSSL 0:9d17e4342598 1679 dynamicType = (type == CA_TYPE) ? DYNAMIC_TYPE_CA :
wolfSSL 0:9d17e4342598 1680 DYNAMIC_TYPE_CERT;
wolfSSL 0:9d17e4342598 1681 } else if (type == CERTREQ_TYPE) {
wolfSSL 0:9d17e4342598 1682 XSTRNCPY(header, "-----BEGIN CERTIFICATE REQUEST-----",
wolfSSL 0:9d17e4342598 1683 sizeof(header));
wolfSSL 0:9d17e4342598 1684 XSTRNCPY(footer, "-----END CERTIFICATE REQUEST-----",
wolfSSL 0:9d17e4342598 1685 sizeof(footer));
wolfSSL 0:9d17e4342598 1686 dynamicType = DYNAMIC_TYPE_KEY;
wolfSSL 0:9d17e4342598 1687 } else if (type == DH_PARAM_TYPE) {
wolfSSL 0:9d17e4342598 1688 XSTRNCPY(header, "-----BEGIN DH PARAMETERS-----", sizeof(header));
wolfSSL 0:9d17e4342598 1689 XSTRNCPY(footer, "-----END DH PARAMETERS-----", sizeof(footer));
wolfSSL 0:9d17e4342598 1690 dynamicType = DYNAMIC_TYPE_KEY;
wolfSSL 0:9d17e4342598 1691 } else if (type == CRL_TYPE) {
wolfSSL 0:9d17e4342598 1692 XSTRNCPY(header, "-----BEGIN X509 CRL-----", sizeof(header));
wolfSSL 0:9d17e4342598 1693 XSTRNCPY(footer, "-----END X509 CRL-----", sizeof(footer));
wolfSSL 0:9d17e4342598 1694 dynamicType = DYNAMIC_TYPE_CRL;
wolfSSL 0:9d17e4342598 1695 } else {
wolfSSL 0:9d17e4342598 1696 XSTRNCPY(header, "-----BEGIN RSA PRIVATE KEY-----", sizeof(header));
wolfSSL 0:9d17e4342598 1697 XSTRNCPY(footer, "-----END RSA PRIVATE KEY-----", sizeof(footer));
wolfSSL 0:9d17e4342598 1698 dynamicType = DYNAMIC_TYPE_KEY;
wolfSSL 0:9d17e4342598 1699 }
wolfSSL 0:9d17e4342598 1700
wolfSSL 0:9d17e4342598 1701 /* find header */
wolfSSL 0:9d17e4342598 1702 headerEnd = XSTRNSTR((char*)buff, header, sz);
wolfSSL 0:9d17e4342598 1703 if (!headerEnd && type == PRIVATEKEY_TYPE) { /* may be pkcs8 */
wolfSSL 0:9d17e4342598 1704 XSTRNCPY(header, "-----BEGIN PRIVATE KEY-----", sizeof(header));
wolfSSL 0:9d17e4342598 1705 XSTRNCPY(footer, "-----END PRIVATE KEY-----", sizeof(footer));
wolfSSL 0:9d17e4342598 1706
wolfSSL 0:9d17e4342598 1707 headerEnd = XSTRNSTR((char*)buff, header, sz);
wolfSSL 0:9d17e4342598 1708 if (headerEnd)
wolfSSL 0:9d17e4342598 1709 pkcs8 = 1;
wolfSSL 0:9d17e4342598 1710 else {
wolfSSL 0:9d17e4342598 1711 XSTRNCPY(header, "-----BEGIN ENCRYPTED PRIVATE KEY-----",
wolfSSL 0:9d17e4342598 1712 sizeof(header));
wolfSSL 0:9d17e4342598 1713 XSTRNCPY(footer, "-----END ENCRYPTED PRIVATE KEY-----",
wolfSSL 0:9d17e4342598 1714 sizeof(footer));
wolfSSL 0:9d17e4342598 1715
wolfSSL 0:9d17e4342598 1716 headerEnd = XSTRNSTR((char*)buff, header, sz);
wolfSSL 0:9d17e4342598 1717 if (headerEnd) {
wolfSSL 0:9d17e4342598 1718 pkcs8Enc = 1;
wolfSSL 0:9d17e4342598 1719 (void)pkcs8Enc; /* only opensslextra will read */
wolfSSL 0:9d17e4342598 1720 }
wolfSSL 0:9d17e4342598 1721 }
wolfSSL 0:9d17e4342598 1722 }
wolfSSL 0:9d17e4342598 1723 if (!headerEnd && type == PRIVATEKEY_TYPE) { /* may be ecc */
wolfSSL 0:9d17e4342598 1724 XSTRNCPY(header, "-----BEGIN EC PRIVATE KEY-----", sizeof(header));
wolfSSL 0:9d17e4342598 1725 XSTRNCPY(footer, "-----END EC PRIVATE KEY-----", sizeof(footer));
wolfSSL 0:9d17e4342598 1726
wolfSSL 0:9d17e4342598 1727 headerEnd = XSTRNSTR((char*)buff, header, sz);
wolfSSL 0:9d17e4342598 1728 if (headerEnd)
wolfSSL 0:9d17e4342598 1729 *eccKey = 1;
wolfSSL 0:9d17e4342598 1730 }
wolfSSL 0:9d17e4342598 1731 if (!headerEnd && type == PRIVATEKEY_TYPE) { /* may be dsa */
wolfSSL 0:9d17e4342598 1732 XSTRNCPY(header, "-----BEGIN DSA PRIVATE KEY-----", sizeof(header));
wolfSSL 0:9d17e4342598 1733 XSTRNCPY(footer, "-----END DSA PRIVATE KEY-----", sizeof(footer));
wolfSSL 0:9d17e4342598 1734
wolfSSL 0:9d17e4342598 1735 headerEnd = XSTRNSTR((char*)buff, header, sz);
wolfSSL 0:9d17e4342598 1736 }
wolfSSL 0:9d17e4342598 1737 if (!headerEnd) {
wolfSSL 0:9d17e4342598 1738 CYASSL_MSG("Couldn't find PEM header");
wolfSSL 0:9d17e4342598 1739 return SSL_NO_PEM_HEADER;
wolfSSL 0:9d17e4342598 1740 }
wolfSSL 0:9d17e4342598 1741 headerEnd += XSTRLEN(header);
wolfSSL 0:9d17e4342598 1742
wolfSSL 0:9d17e4342598 1743 /* eat end of line */
wolfSSL 0:9d17e4342598 1744 if (headerEnd[0] == '\n')
wolfSSL 0:9d17e4342598 1745 headerEnd++;
wolfSSL 0:9d17e4342598 1746 else if (headerEnd[1] == '\n')
wolfSSL 0:9d17e4342598 1747 headerEnd += 2;
wolfSSL 0:9d17e4342598 1748 else
wolfSSL 0:9d17e4342598 1749 return SSL_BAD_FILE;
wolfSSL 0:9d17e4342598 1750
wolfSSL 0:9d17e4342598 1751 #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
wolfSSL 0:9d17e4342598 1752 {
wolfSSL 0:9d17e4342598 1753 /* remove encrypted header if there */
wolfSSL 0:9d17e4342598 1754 char encHeader[] = "Proc-Type";
wolfSSL 0:9d17e4342598 1755 char* line = XSTRNSTR((char*)buff, encHeader, PEM_LINE_LEN);
wolfSSL 0:9d17e4342598 1756 if (line) {
wolfSSL 0:9d17e4342598 1757 char* newline;
wolfSSL 0:9d17e4342598 1758 char* finish;
wolfSSL 0:9d17e4342598 1759 char* start = XSTRNSTR(line, "DES", PEM_LINE_LEN);
wolfSSL 0:9d17e4342598 1760
wolfSSL 0:9d17e4342598 1761 if (!start)
wolfSSL 0:9d17e4342598 1762 start = XSTRNSTR(line, "AES", PEM_LINE_LEN);
wolfSSL 0:9d17e4342598 1763
wolfSSL 0:9d17e4342598 1764 if (!start) return SSL_BAD_FILE;
wolfSSL 0:9d17e4342598 1765 if (!info) return SSL_BAD_FILE;
wolfSSL 0:9d17e4342598 1766
wolfSSL 0:9d17e4342598 1767 finish = XSTRNSTR(start, ",", PEM_LINE_LEN);
wolfSSL 0:9d17e4342598 1768
wolfSSL 0:9d17e4342598 1769 if (start && finish && (start < finish)) {
wolfSSL 0:9d17e4342598 1770 newline = XSTRNSTR(finish, "\r", PEM_LINE_LEN);
wolfSSL 0:9d17e4342598 1771
wolfSSL 0:9d17e4342598 1772 XMEMCPY(info->name, start, finish - start);
wolfSSL 0:9d17e4342598 1773 info->name[finish - start] = 0;
wolfSSL 0:9d17e4342598 1774 XMEMCPY(info->iv, finish + 1, sizeof(info->iv));
wolfSSL 0:9d17e4342598 1775
wolfSSL 0:9d17e4342598 1776 if (!newline) newline = XSTRNSTR(finish, "\n", PEM_LINE_LEN);
wolfSSL 0:9d17e4342598 1777 if (newline && (newline > finish)) {
wolfSSL 0:9d17e4342598 1778 info->ivSz = (word32)(newline - (finish + 1));
wolfSSL 0:9d17e4342598 1779 info->set = 1;
wolfSSL 0:9d17e4342598 1780 }
wolfSSL 0:9d17e4342598 1781 else
wolfSSL 0:9d17e4342598 1782 return SSL_BAD_FILE;
wolfSSL 0:9d17e4342598 1783 }
wolfSSL 0:9d17e4342598 1784 else
wolfSSL 0:9d17e4342598 1785 return SSL_BAD_FILE;
wolfSSL 0:9d17e4342598 1786
wolfSSL 0:9d17e4342598 1787 /* eat blank line */
wolfSSL 0:9d17e4342598 1788 while (*newline == '\r' || *newline == '\n')
wolfSSL 0:9d17e4342598 1789 newline++;
wolfSSL 0:9d17e4342598 1790 headerEnd = newline;
wolfSSL 0:9d17e4342598 1791 }
wolfSSL 0:9d17e4342598 1792 }
wolfSSL 0:9d17e4342598 1793 #endif /* OPENSSL_EXTRA || HAVE_WEBSERVER */
wolfSSL 0:9d17e4342598 1794
wolfSSL 0:9d17e4342598 1795 /* find footer */
wolfSSL 0:9d17e4342598 1796 footerEnd = XSTRNSTR((char*)buff, footer, sz);
wolfSSL 0:9d17e4342598 1797 if (!footerEnd) return SSL_BAD_FILE;
wolfSSL 0:9d17e4342598 1798
wolfSSL 0:9d17e4342598 1799 consumedEnd = footerEnd + XSTRLEN(footer);
wolfSSL 0:9d17e4342598 1800
wolfSSL 0:9d17e4342598 1801 if (consumedEnd < bufferEnd) { /* handle no end of line on last line */
wolfSSL 0:9d17e4342598 1802 /* eat end of line */
wolfSSL 0:9d17e4342598 1803 if (consumedEnd[0] == '\n')
wolfSSL 0:9d17e4342598 1804 consumedEnd++;
wolfSSL 0:9d17e4342598 1805 else if (consumedEnd[1] == '\n')
wolfSSL 0:9d17e4342598 1806 consumedEnd += 2;
wolfSSL 0:9d17e4342598 1807 else
wolfSSL 0:9d17e4342598 1808 return SSL_BAD_FILE;
wolfSSL 0:9d17e4342598 1809 }
wolfSSL 0:9d17e4342598 1810
wolfSSL 0:9d17e4342598 1811 if (info)
wolfSSL 0:9d17e4342598 1812 info->consumed = (long)(consumedEnd - (char*)buff);
wolfSSL 0:9d17e4342598 1813
wolfSSL 0:9d17e4342598 1814 /* set up der buffer */
wolfSSL 0:9d17e4342598 1815 neededSz = (long)(footerEnd - headerEnd);
wolfSSL 0:9d17e4342598 1816 if (neededSz > sz || neededSz < 0) return SSL_BAD_FILE;
wolfSSL 0:9d17e4342598 1817 der->buffer = (byte*) XMALLOC(neededSz, heap, dynamicType);
wolfSSL 0:9d17e4342598 1818 if (!der->buffer) return MEMORY_ERROR;
wolfSSL 0:9d17e4342598 1819 der->length = (word32)neededSz;
wolfSSL 0:9d17e4342598 1820
wolfSSL 0:9d17e4342598 1821 if (Base64_Decode((byte*)headerEnd, (word32)neededSz, der->buffer,
wolfSSL 0:9d17e4342598 1822 &der->length) < 0)
wolfSSL 0:9d17e4342598 1823 return SSL_BAD_FILE;
wolfSSL 0:9d17e4342598 1824
wolfSSL 0:9d17e4342598 1825 if (pkcs8) {
wolfSSL 0:9d17e4342598 1826 /* convert and adjust length */
wolfSSL 0:9d17e4342598 1827 if ( (ret = ToTraditional(der->buffer, der->length)) < 0 ) {
wolfSSL 0:9d17e4342598 1828 return ret;
wolfSSL 0:9d17e4342598 1829 } else {
wolfSSL 0:9d17e4342598 1830 der->length = ret;
wolfSSL 0:9d17e4342598 1831 return 0;
wolfSSL 0:9d17e4342598 1832 }
wolfSSL 0:9d17e4342598 1833 }
wolfSSL 0:9d17e4342598 1834
wolfSSL 0:9d17e4342598 1835 #if (defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)) && !defined(NO_PWDBASED)
wolfSSL 0:9d17e4342598 1836 if (pkcs8Enc) {
wolfSSL 0:9d17e4342598 1837 int passwordSz;
wolfSSL 0:9d17e4342598 1838 char password[80];
wolfSSL 0:9d17e4342598 1839
wolfSSL 0:9d17e4342598 1840 if (!info || !info->ctx || !info->ctx->passwd_cb)
wolfSSL 0:9d17e4342598 1841 return SSL_BAD_FILE; /* no callback error */
wolfSSL 0:9d17e4342598 1842 passwordSz = info->ctx->passwd_cb(password, sizeof(password), 0,
wolfSSL 0:9d17e4342598 1843 info->ctx->userdata);
wolfSSL 0:9d17e4342598 1844 /* convert and adjust length */
wolfSSL 0:9d17e4342598 1845 if ( (ret = ToTraditionalEnc(der->buffer, der->length, password,
wolfSSL 0:9d17e4342598 1846 passwordSz)) < 0 ) {
wolfSSL 0:9d17e4342598 1847 return ret;
wolfSSL 0:9d17e4342598 1848 } else {
wolfSSL 0:9d17e4342598 1849 der->length = ret;
wolfSSL 0:9d17e4342598 1850 return 0;
wolfSSL 0:9d17e4342598 1851 }
wolfSSL 0:9d17e4342598 1852 }
wolfSSL 0:9d17e4342598 1853 #endif
wolfSSL 0:9d17e4342598 1854
wolfSSL 0:9d17e4342598 1855 return 0;
wolfSSL 0:9d17e4342598 1856 }
wolfSSL 0:9d17e4342598 1857
wolfSSL 0:9d17e4342598 1858
wolfSSL 0:9d17e4342598 1859 /* process the buffer buff, legnth sz, into ctx of format and type
wolfSSL 0:9d17e4342598 1860 used tracks bytes consumed, userChain specifies a user cert chain
wolfSSL 0:9d17e4342598 1861 to pass during the handshake */
wolfSSL 0:9d17e4342598 1862 static int ProcessBuffer(CYASSL_CTX* ctx, const unsigned char* buff,
wolfSSL 0:9d17e4342598 1863 long sz, int format, int type, CYASSL* ssl,
wolfSSL 0:9d17e4342598 1864 long* used, int userChain)
wolfSSL 0:9d17e4342598 1865 {
wolfSSL 0:9d17e4342598 1866 EncryptedInfo info;
wolfSSL 0:9d17e4342598 1867 buffer der; /* holds DER or RAW (for NTRU) */
wolfSSL 0:9d17e4342598 1868 int ret;
wolfSSL 0:9d17e4342598 1869 int dynamicType = 0;
wolfSSL 0:9d17e4342598 1870 int eccKey = 0;
wolfSSL 0:9d17e4342598 1871 int rsaKey = 0;
wolfSSL 0:9d17e4342598 1872 void* heap = ctx ? ctx->heap : NULL;
wolfSSL 0:9d17e4342598 1873
wolfSSL 0:9d17e4342598 1874 info.set = 0;
wolfSSL 0:9d17e4342598 1875 info.ctx = ctx;
wolfSSL 0:9d17e4342598 1876 info.consumed = 0;
wolfSSL 0:9d17e4342598 1877 der.buffer = 0;
wolfSSL 0:9d17e4342598 1878
wolfSSL 0:9d17e4342598 1879 (void)dynamicType;
wolfSSL 0:9d17e4342598 1880 (void)rsaKey;
wolfSSL 0:9d17e4342598 1881
wolfSSL 0:9d17e4342598 1882 if (used)
wolfSSL 0:9d17e4342598 1883 *used = sz; /* used bytes default to sz, PEM chain may shorten*/
wolfSSL 0:9d17e4342598 1884
wolfSSL 0:9d17e4342598 1885 if (format != SSL_FILETYPE_ASN1 && format != SSL_FILETYPE_PEM
wolfSSL 0:9d17e4342598 1886 && format != SSL_FILETYPE_RAW)
wolfSSL 0:9d17e4342598 1887 return SSL_BAD_FILETYPE;
wolfSSL 0:9d17e4342598 1888
wolfSSL 0:9d17e4342598 1889 if (type == CA_TYPE)
wolfSSL 0:9d17e4342598 1890 dynamicType = DYNAMIC_TYPE_CA;
wolfSSL 0:9d17e4342598 1891 else if (type == CERT_TYPE)
wolfSSL 0:9d17e4342598 1892 dynamicType = DYNAMIC_TYPE_CERT;
wolfSSL 0:9d17e4342598 1893 else
wolfSSL 0:9d17e4342598 1894 dynamicType = DYNAMIC_TYPE_KEY;
wolfSSL 0:9d17e4342598 1895
wolfSSL 0:9d17e4342598 1896 if (format == SSL_FILETYPE_PEM) {
wolfSSL 0:9d17e4342598 1897 ret = PemToDer(buff, sz, type, &der, heap, &info, &eccKey);
wolfSSL 0:9d17e4342598 1898 if (ret < 0) {
wolfSSL 0:9d17e4342598 1899 XFREE(der.buffer, heap, dynamicType);
wolfSSL 0:9d17e4342598 1900 return ret;
wolfSSL 0:9d17e4342598 1901 }
wolfSSL 0:9d17e4342598 1902 if (used)
wolfSSL 0:9d17e4342598 1903 *used = info.consumed;
wolfSSL 0:9d17e4342598 1904 /* we may have a user cert chain, try to consume */
wolfSSL 0:9d17e4342598 1905 if (userChain && type == CERT_TYPE && info.consumed < sz) {
wolfSSL 0:9d17e4342598 1906 byte staticBuffer[FILE_BUFFER_SIZE]; /* tmp chain buffer */
wolfSSL 0:9d17e4342598 1907 byte* chainBuffer = staticBuffer;
wolfSSL 0:9d17e4342598 1908 int dynamicBuffer = 0;
wolfSSL 0:9d17e4342598 1909 word32 bufferSz = sizeof(staticBuffer);
wolfSSL 0:9d17e4342598 1910 long consumed = info.consumed;
wolfSSL 0:9d17e4342598 1911 word32 idx = 0;
wolfSSL 0:9d17e4342598 1912 int gotOne = 0;
wolfSSL 0:9d17e4342598 1913
wolfSSL 0:9d17e4342598 1914 if ( (sz - consumed) > (int)bufferSz) {
wolfSSL 0:9d17e4342598 1915 CYASSL_MSG("Growing Tmp Chain Buffer");
wolfSSL 0:9d17e4342598 1916 bufferSz = (word32)(sz - consumed);
wolfSSL 0:9d17e4342598 1917 /* will shrink to actual size */
wolfSSL 0:9d17e4342598 1918 chainBuffer = (byte*)XMALLOC(bufferSz, heap,
wolfSSL 0:9d17e4342598 1919 DYNAMIC_TYPE_FILE);
wolfSSL 0:9d17e4342598 1920 if (chainBuffer == NULL) {
wolfSSL 0:9d17e4342598 1921 XFREE(der.buffer, heap, dynamicType);
wolfSSL 0:9d17e4342598 1922 return MEMORY_E;
wolfSSL 0:9d17e4342598 1923 }
wolfSSL 0:9d17e4342598 1924 dynamicBuffer = 1;
wolfSSL 0:9d17e4342598 1925 }
wolfSSL 0:9d17e4342598 1926
wolfSSL 0:9d17e4342598 1927 CYASSL_MSG("Processing Cert Chain");
wolfSSL 0:9d17e4342598 1928 while (consumed < sz) {
wolfSSL 0:9d17e4342598 1929 buffer part;
wolfSSL 0:9d17e4342598 1930 info.consumed = 0;
wolfSSL 0:9d17e4342598 1931 part.buffer = 0;
wolfSSL 0:9d17e4342598 1932
wolfSSL 0:9d17e4342598 1933 ret = PemToDer(buff + consumed, sz - consumed, type, &part,
wolfSSL 0:9d17e4342598 1934 heap, &info, &eccKey);
wolfSSL 0:9d17e4342598 1935 if (ret == 0) {
wolfSSL 0:9d17e4342598 1936 gotOne = 1;
wolfSSL 0:9d17e4342598 1937 if ( (idx + part.length) > bufferSz) {
wolfSSL 0:9d17e4342598 1938 CYASSL_MSG(" Cert Chain bigger than buffer");
wolfSSL 0:9d17e4342598 1939 ret = BUFFER_E;
wolfSSL 0:9d17e4342598 1940 }
wolfSSL 0:9d17e4342598 1941 else {
wolfSSL 0:9d17e4342598 1942 c32to24(part.length, &chainBuffer[idx]);
wolfSSL 0:9d17e4342598 1943 idx += CERT_HEADER_SZ;
wolfSSL 0:9d17e4342598 1944 XMEMCPY(&chainBuffer[idx], part.buffer,part.length);
wolfSSL 0:9d17e4342598 1945 idx += part.length;
wolfSSL 0:9d17e4342598 1946 consumed += info.consumed;
wolfSSL 0:9d17e4342598 1947 if (used)
wolfSSL 0:9d17e4342598 1948 *used += info.consumed;
wolfSSL 0:9d17e4342598 1949 }
wolfSSL 0:9d17e4342598 1950 }
wolfSSL 0:9d17e4342598 1951
wolfSSL 0:9d17e4342598 1952 XFREE(part.buffer, heap, dynamicType);
wolfSSL 0:9d17e4342598 1953
wolfSSL 0:9d17e4342598 1954 if (ret == SSL_NO_PEM_HEADER && gotOne) {
wolfSSL 0:9d17e4342598 1955 CYASSL_MSG("We got one good PEM so stuff at end ok");
wolfSSL 0:9d17e4342598 1956 break;
wolfSSL 0:9d17e4342598 1957 }
wolfSSL 0:9d17e4342598 1958
wolfSSL 0:9d17e4342598 1959 if (ret < 0) {
wolfSSL 0:9d17e4342598 1960 CYASSL_MSG(" Error in Cert in Chain");
wolfSSL 0:9d17e4342598 1961 XFREE(der.buffer, heap, dynamicType);
wolfSSL 0:9d17e4342598 1962 return ret;
wolfSSL 0:9d17e4342598 1963 }
wolfSSL 0:9d17e4342598 1964 CYASSL_MSG(" Consumed another Cert in Chain");
wolfSSL 0:9d17e4342598 1965 }
wolfSSL 0:9d17e4342598 1966 CYASSL_MSG("Finished Processing Cert Chain");
wolfSSL 0:9d17e4342598 1967
wolfSSL 0:9d17e4342598 1968 if (ctx == NULL) {
wolfSSL 0:9d17e4342598 1969 CYASSL_MSG("certChain needs context");
wolfSSL 0:9d17e4342598 1970 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 1971 }
wolfSSL 0:9d17e4342598 1972 ctx->certChain.buffer = (byte*)XMALLOC(idx, heap,
wolfSSL 0:9d17e4342598 1973 dynamicType);
wolfSSL 0:9d17e4342598 1974 if (ctx->certChain.buffer) {
wolfSSL 0:9d17e4342598 1975 ctx->certChain.length = idx;
wolfSSL 0:9d17e4342598 1976 XMEMCPY(ctx->certChain.buffer, chainBuffer, idx);
wolfSSL 0:9d17e4342598 1977 }
wolfSSL 0:9d17e4342598 1978 if (dynamicBuffer)
wolfSSL 0:9d17e4342598 1979 XFREE(chainBuffer, heap, DYNAMIC_TYPE_FILE);
wolfSSL 0:9d17e4342598 1980 if (ctx->certChain.buffer == NULL) {
wolfSSL 0:9d17e4342598 1981 XFREE(der.buffer, heap, dynamicType);
wolfSSL 0:9d17e4342598 1982 return MEMORY_E;
wolfSSL 0:9d17e4342598 1983 }
wolfSSL 0:9d17e4342598 1984 }
wolfSSL 0:9d17e4342598 1985 }
wolfSSL 0:9d17e4342598 1986 else { /* ASN1 (DER) or RAW (NTRU) */
wolfSSL 0:9d17e4342598 1987 der.buffer = (byte*) XMALLOC(sz, heap, dynamicType);
wolfSSL 0:9d17e4342598 1988 if (!der.buffer) return MEMORY_ERROR;
wolfSSL 0:9d17e4342598 1989 XMEMCPY(der.buffer, buff, sz);
wolfSSL 0:9d17e4342598 1990 der.length = (word32)sz;
wolfSSL 0:9d17e4342598 1991 }
wolfSSL 0:9d17e4342598 1992
wolfSSL 0:9d17e4342598 1993 #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
wolfSSL 0:9d17e4342598 1994 if (info.set) {
wolfSSL 0:9d17e4342598 1995 /* decrypt */
wolfSSL 0:9d17e4342598 1996 char password[80];
wolfSSL 0:9d17e4342598 1997 int passwordSz;
wolfSSL 0:9d17e4342598 1998
wolfSSL 0:9d17e4342598 1999 byte key[AES_256_KEY_SIZE];
wolfSSL 0:9d17e4342598 2000 byte iv[AES_IV_SIZE];
wolfSSL 0:9d17e4342598 2001
wolfSSL 0:9d17e4342598 2002 if (!ctx || !ctx->passwd_cb) {
wolfSSL 0:9d17e4342598 2003 XFREE(der.buffer, heap, dynamicType);
wolfSSL 0:9d17e4342598 2004 return NO_PASSWORD;
wolfSSL 0:9d17e4342598 2005 }
wolfSSL 0:9d17e4342598 2006
wolfSSL 0:9d17e4342598 2007 /* use file's salt for key derivation, hex decode first */
wolfSSL 0:9d17e4342598 2008 if (Base16_Decode(info.iv, info.ivSz, info.iv, &info.ivSz) != 0) {
wolfSSL 0:9d17e4342598 2009 XFREE(der.buffer, heap, dynamicType);
wolfSSL 0:9d17e4342598 2010 return ASN_INPUT_E;
wolfSSL 0:9d17e4342598 2011 }
wolfSSL 0:9d17e4342598 2012
wolfSSL 0:9d17e4342598 2013 passwordSz = ctx->passwd_cb(password, sizeof(password), 0,
wolfSSL 0:9d17e4342598 2014 ctx->userdata);
wolfSSL 0:9d17e4342598 2015 if ( (ret = EVP_BytesToKey(info.name, "MD5", info.iv,
wolfSSL 0:9d17e4342598 2016 (byte*)password, passwordSz, 1, key, iv)) <= 0) {
wolfSSL 0:9d17e4342598 2017 XFREE(der.buffer, heap, dynamicType);
wolfSSL 0:9d17e4342598 2018 return ret;
wolfSSL 0:9d17e4342598 2019 }
wolfSSL 0:9d17e4342598 2020 ret = 0; /* back to good status */
wolfSSL 0:9d17e4342598 2021
wolfSSL 0:9d17e4342598 2022 if (XSTRNCMP(info.name, "DES-CBC", 7) == 0) {
wolfSSL 0:9d17e4342598 2023 Des enc;
wolfSSL 0:9d17e4342598 2024
wolfSSL 0:9d17e4342598 2025 ret = Des_SetKey(&enc, key, info.iv, DES_DECRYPTION);
wolfSSL 0:9d17e4342598 2026 if (ret != 0)
wolfSSL 0:9d17e4342598 2027 return ret;
wolfSSL 0:9d17e4342598 2028
wolfSSL 0:9d17e4342598 2029 Des_CbcDecrypt(&enc, der.buffer, der.buffer, der.length);
wolfSSL 0:9d17e4342598 2030 }
wolfSSL 0:9d17e4342598 2031 else if (XSTRNCMP(info.name, "DES-EDE3-CBC", 13) == 0) {
wolfSSL 0:9d17e4342598 2032 Des3 enc;
wolfSSL 0:9d17e4342598 2033
wolfSSL 0:9d17e4342598 2034 ret = Des3_SetKey(&enc, key, info.iv, DES_DECRYPTION);
wolfSSL 0:9d17e4342598 2035 if (ret != 0)
wolfSSL 0:9d17e4342598 2036 return ret;
wolfSSL 0:9d17e4342598 2037
wolfSSL 0:9d17e4342598 2038 ret = Des3_CbcDecrypt(&enc, der.buffer, der.buffer, der.length);
wolfSSL 0:9d17e4342598 2039 if (ret != 0)
wolfSSL 0:9d17e4342598 2040 return ret;
wolfSSL 0:9d17e4342598 2041 }
wolfSSL 0:9d17e4342598 2042 else if (XSTRNCMP(info.name, "AES-128-CBC", 13) == 0) {
wolfSSL 0:9d17e4342598 2043 Aes enc;
wolfSSL 0:9d17e4342598 2044 ret = AesSetKey(&enc, key, AES_128_KEY_SIZE, info.iv,
wolfSSL 0:9d17e4342598 2045 AES_DECRYPTION);
wolfSSL 0:9d17e4342598 2046 if (ret == 0)
wolfSSL 0:9d17e4342598 2047 ret = AesCbcDecrypt(&enc, der.buffer,der.buffer,der.length);
wolfSSL 0:9d17e4342598 2048 }
wolfSSL 0:9d17e4342598 2049 else if (XSTRNCMP(info.name, "AES-192-CBC", 13) == 0) {
wolfSSL 0:9d17e4342598 2050 Aes enc;
wolfSSL 0:9d17e4342598 2051 ret = AesSetKey(&enc, key, AES_192_KEY_SIZE, info.iv,
wolfSSL 0:9d17e4342598 2052 AES_DECRYPTION);
wolfSSL 0:9d17e4342598 2053 if (ret == 0)
wolfSSL 0:9d17e4342598 2054 ret = AesCbcDecrypt(&enc, der.buffer,der.buffer,der.length);
wolfSSL 0:9d17e4342598 2055 }
wolfSSL 0:9d17e4342598 2056 else if (XSTRNCMP(info.name, "AES-256-CBC", 13) == 0) {
wolfSSL 0:9d17e4342598 2057 Aes enc;
wolfSSL 0:9d17e4342598 2058 ret = AesSetKey(&enc, key, AES_256_KEY_SIZE, info.iv,
wolfSSL 0:9d17e4342598 2059 AES_DECRYPTION);
wolfSSL 0:9d17e4342598 2060 if (ret == 0)
wolfSSL 0:9d17e4342598 2061 ret = AesCbcDecrypt(&enc, der.buffer,der.buffer,der.length);
wolfSSL 0:9d17e4342598 2062 }
wolfSSL 0:9d17e4342598 2063 else {
wolfSSL 0:9d17e4342598 2064 XFREE(der.buffer, heap, dynamicType);
wolfSSL 0:9d17e4342598 2065 return SSL_BAD_FILE;
wolfSSL 0:9d17e4342598 2066 }
wolfSSL 0:9d17e4342598 2067
wolfSSL 0:9d17e4342598 2068 if (ret != 0) {
wolfSSL 0:9d17e4342598 2069 XFREE(der.buffer, heap, dynamicType);
wolfSSL 0:9d17e4342598 2070 return ret;
wolfSSL 0:9d17e4342598 2071 }
wolfSSL 0:9d17e4342598 2072 }
wolfSSL 0:9d17e4342598 2073 #endif /* OPENSSL_EXTRA || HAVE_WEBSERVER */
wolfSSL 0:9d17e4342598 2074
wolfSSL 0:9d17e4342598 2075 if (type == CA_TYPE) {
wolfSSL 0:9d17e4342598 2076 if (ctx == NULL) {
wolfSSL 0:9d17e4342598 2077 CYASSL_MSG("Need context for CA load");
wolfSSL 0:9d17e4342598 2078 XFREE(der.buffer, heap, dynamicType);
wolfSSL 0:9d17e4342598 2079 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 2080 }
wolfSSL 0:9d17e4342598 2081 return AddCA(ctx->cm, der, CYASSL_USER_CA, ctx->verifyPeer);
wolfSSL 0:9d17e4342598 2082 /* takes der over */
wolfSSL 0:9d17e4342598 2083 }
wolfSSL 0:9d17e4342598 2084 else if (type == CERT_TYPE) {
wolfSSL 0:9d17e4342598 2085 if (ssl) {
wolfSSL 0:9d17e4342598 2086 if (ssl->buffers.weOwnCert && ssl->buffers.certificate.buffer)
wolfSSL 0:9d17e4342598 2087 XFREE(ssl->buffers.certificate.buffer, heap,
wolfSSL 0:9d17e4342598 2088 dynamicType);
wolfSSL 0:9d17e4342598 2089 ssl->buffers.certificate = der;
wolfSSL 0:9d17e4342598 2090 ssl->buffers.weOwnCert = 1;
wolfSSL 0:9d17e4342598 2091 }
wolfSSL 0:9d17e4342598 2092 else if (ctx) {
wolfSSL 0:9d17e4342598 2093 if (ctx->certificate.buffer)
wolfSSL 0:9d17e4342598 2094 XFREE(ctx->certificate.buffer, heap, dynamicType);
wolfSSL 0:9d17e4342598 2095 ctx->certificate = der; /* takes der over */
wolfSSL 0:9d17e4342598 2096 }
wolfSSL 0:9d17e4342598 2097 }
wolfSSL 0:9d17e4342598 2098 else if (type == PRIVATEKEY_TYPE) {
wolfSSL 0:9d17e4342598 2099 if (ssl) {
wolfSSL 0:9d17e4342598 2100 if (ssl->buffers.weOwnKey && ssl->buffers.key.buffer)
wolfSSL 0:9d17e4342598 2101 XFREE(ssl->buffers.key.buffer, heap, dynamicType);
wolfSSL 0:9d17e4342598 2102 ssl->buffers.key = der;
wolfSSL 0:9d17e4342598 2103 ssl->buffers.weOwnKey = 1;
wolfSSL 0:9d17e4342598 2104 }
wolfSSL 0:9d17e4342598 2105 else if (ctx) {
wolfSSL 0:9d17e4342598 2106 if (ctx->privateKey.buffer)
wolfSSL 0:9d17e4342598 2107 XFREE(ctx->privateKey.buffer, heap, dynamicType);
wolfSSL 0:9d17e4342598 2108 ctx->privateKey = der; /* takes der over */
wolfSSL 0:9d17e4342598 2109 }
wolfSSL 0:9d17e4342598 2110 }
wolfSSL 0:9d17e4342598 2111 else {
wolfSSL 0:9d17e4342598 2112 XFREE(der.buffer, heap, dynamicType);
wolfSSL 0:9d17e4342598 2113 return SSL_BAD_CERTTYPE;
wolfSSL 0:9d17e4342598 2114 }
wolfSSL 0:9d17e4342598 2115
wolfSSL 0:9d17e4342598 2116 if (type == PRIVATEKEY_TYPE && format != SSL_FILETYPE_RAW) {
wolfSSL 0:9d17e4342598 2117 #ifndef NO_RSA
wolfSSL 0:9d17e4342598 2118 if (!eccKey) {
wolfSSL 0:9d17e4342598 2119 /* make sure RSA key can be used */
wolfSSL 0:9d17e4342598 2120 RsaKey key;
wolfSSL 0:9d17e4342598 2121 word32 idx = 0;
wolfSSL 0:9d17e4342598 2122
wolfSSL 0:9d17e4342598 2123 ret = InitRsaKey(&key, 0);
wolfSSL 0:9d17e4342598 2124 if (ret != 0) return ret;
wolfSSL 0:9d17e4342598 2125 if (RsaPrivateKeyDecode(der.buffer,&idx,&key,der.length) != 0) {
wolfSSL 0:9d17e4342598 2126 #ifdef HAVE_ECC
wolfSSL 0:9d17e4342598 2127 /* could have DER ECC (or pkcs8 ecc), no easy way to tell */
wolfSSL 0:9d17e4342598 2128 eccKey = 1; /* so try it out */
wolfSSL 0:9d17e4342598 2129 #endif
wolfSSL 0:9d17e4342598 2130 if (!eccKey) {
wolfSSL 0:9d17e4342598 2131 FreeRsaKey(&key);
wolfSSL 0:9d17e4342598 2132 return SSL_BAD_FILE;
wolfSSL 0:9d17e4342598 2133 }
wolfSSL 0:9d17e4342598 2134 } else {
wolfSSL 0:9d17e4342598 2135 rsaKey = 1;
wolfSSL 0:9d17e4342598 2136 (void)rsaKey; /* for no ecc builds */
wolfSSL 0:9d17e4342598 2137 }
wolfSSL 0:9d17e4342598 2138 FreeRsaKey(&key);
wolfSSL 0:9d17e4342598 2139 }
wolfSSL 0:9d17e4342598 2140 #endif
wolfSSL 0:9d17e4342598 2141 #ifdef HAVE_ECC
wolfSSL 0:9d17e4342598 2142 if (!rsaKey) {
wolfSSL 0:9d17e4342598 2143 /* make sure ECC key can be used */
wolfSSL 0:9d17e4342598 2144 word32 idx = 0;
wolfSSL 0:9d17e4342598 2145 ecc_key key;
wolfSSL 0:9d17e4342598 2146
wolfSSL 0:9d17e4342598 2147 ecc_init(&key);
wolfSSL 0:9d17e4342598 2148 if (EccPrivateKeyDecode(der.buffer,&idx,&key,der.length) != 0) {
wolfSSL 0:9d17e4342598 2149 ecc_free(&key);
wolfSSL 0:9d17e4342598 2150 return SSL_BAD_FILE;
wolfSSL 0:9d17e4342598 2151 }
wolfSSL 0:9d17e4342598 2152 ecc_free(&key);
wolfSSL 0:9d17e4342598 2153 eccKey = 1;
wolfSSL 0:9d17e4342598 2154 if (ctx)
wolfSSL 0:9d17e4342598 2155 ctx->haveStaticECC = 1;
wolfSSL 0:9d17e4342598 2156 if (ssl)
wolfSSL 0:9d17e4342598 2157 ssl->options.haveStaticECC = 1;
wolfSSL 0:9d17e4342598 2158 }
wolfSSL 0:9d17e4342598 2159 #endif /* HAVE_ECC */
wolfSSL 0:9d17e4342598 2160 }
wolfSSL 0:9d17e4342598 2161 else if (type == CERT_TYPE) {
wolfSSL 0:9d17e4342598 2162 DecodedCert cert;
wolfSSL 0:9d17e4342598 2163
wolfSSL 0:9d17e4342598 2164 CYASSL_MSG("Checking cert signature type");
wolfSSL 0:9d17e4342598 2165 InitDecodedCert(&cert, der.buffer, der.length, heap);
wolfSSL 0:9d17e4342598 2166
wolfSSL 0:9d17e4342598 2167 if (DecodeToKey(&cert, 0) < 0) {
wolfSSL 0:9d17e4342598 2168 CYASSL_MSG("Decode to key failed");
wolfSSL 0:9d17e4342598 2169 return SSL_BAD_FILE;
wolfSSL 0:9d17e4342598 2170 }
wolfSSL 0:9d17e4342598 2171 switch (cert.signatureOID) {
wolfSSL 0:9d17e4342598 2172 case CTC_SHAwECDSA:
wolfSSL 0:9d17e4342598 2173 case CTC_SHA256wECDSA:
wolfSSL 0:9d17e4342598 2174 case CTC_SHA384wECDSA:
wolfSSL 0:9d17e4342598 2175 case CTC_SHA512wECDSA:
wolfSSL 0:9d17e4342598 2176 CYASSL_MSG("ECDSA cert signature");
wolfSSL 0:9d17e4342598 2177 if (ctx)
wolfSSL 0:9d17e4342598 2178 ctx->haveECDSAsig = 1;
wolfSSL 0:9d17e4342598 2179 if (ssl)
wolfSSL 0:9d17e4342598 2180 ssl->options.haveECDSAsig = 1;
wolfSSL 0:9d17e4342598 2181 break;
wolfSSL 0:9d17e4342598 2182 default:
wolfSSL 0:9d17e4342598 2183 CYASSL_MSG("Not ECDSA cert signature");
wolfSSL 0:9d17e4342598 2184 break;
wolfSSL 0:9d17e4342598 2185 }
wolfSSL 0:9d17e4342598 2186
wolfSSL 0:9d17e4342598 2187 #ifdef HAVE_ECC
wolfSSL 0:9d17e4342598 2188 if (ctx)
wolfSSL 0:9d17e4342598 2189 ctx->pkCurveOID = cert.pkCurveOID;
wolfSSL 0:9d17e4342598 2190 if (ssl)
wolfSSL 0:9d17e4342598 2191 ssl->pkCurveOID = cert.pkCurveOID;
wolfSSL 0:9d17e4342598 2192 #endif
wolfSSL 0:9d17e4342598 2193
wolfSSL 0:9d17e4342598 2194 FreeDecodedCert(&cert);
wolfSSL 0:9d17e4342598 2195 }
wolfSSL 0:9d17e4342598 2196
wolfSSL 0:9d17e4342598 2197 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 2198 }
wolfSSL 0:9d17e4342598 2199
wolfSSL 0:9d17e4342598 2200
wolfSSL 0:9d17e4342598 2201
wolfSSL 0:9d17e4342598 2202
wolfSSL 0:9d17e4342598 2203 /* CA PEM file for verification, may have multiple/chain certs to process */
wolfSSL 0:9d17e4342598 2204 static int ProcessChainBuffer(CYASSL_CTX* ctx, const unsigned char* buff,
wolfSSL 0:9d17e4342598 2205 long sz, int format, int type, CYASSL* ssl)
wolfSSL 0:9d17e4342598 2206 {
wolfSSL 0:9d17e4342598 2207 long used = 0;
wolfSSL 0:9d17e4342598 2208 int ret = 0;
wolfSSL 0:9d17e4342598 2209 int gotOne = 0;
wolfSSL 0:9d17e4342598 2210
wolfSSL 0:9d17e4342598 2211 CYASSL_MSG("Processing CA PEM file");
wolfSSL 0:9d17e4342598 2212 while (used < sz) {
wolfSSL 0:9d17e4342598 2213 long consumed = 0;
wolfSSL 0:9d17e4342598 2214
wolfSSL 0:9d17e4342598 2215 ret = ProcessBuffer(ctx, buff + used, sz - used, format, type, ssl,
wolfSSL 0:9d17e4342598 2216 &consumed, 0);
wolfSSL 0:9d17e4342598 2217
wolfSSL 0:9d17e4342598 2218 if (ret == SSL_NO_PEM_HEADER && gotOne) {
wolfSSL 0:9d17e4342598 2219 CYASSL_MSG("We got one good PEM file so stuff at end ok");
wolfSSL 0:9d17e4342598 2220 ret = SSL_SUCCESS;
wolfSSL 0:9d17e4342598 2221 break;
wolfSSL 0:9d17e4342598 2222 }
wolfSSL 0:9d17e4342598 2223
wolfSSL 0:9d17e4342598 2224 if (ret < 0)
wolfSSL 0:9d17e4342598 2225 break;
wolfSSL 0:9d17e4342598 2226
wolfSSL 0:9d17e4342598 2227 CYASSL_MSG(" Processed a CA");
wolfSSL 0:9d17e4342598 2228 gotOne = 1;
wolfSSL 0:9d17e4342598 2229 used += consumed;
wolfSSL 0:9d17e4342598 2230 }
wolfSSL 0:9d17e4342598 2231
wolfSSL 0:9d17e4342598 2232 return ret;
wolfSSL 0:9d17e4342598 2233 }
wolfSSL 0:9d17e4342598 2234
wolfSSL 0:9d17e4342598 2235
wolfSSL 0:9d17e4342598 2236 /* Verify the ceritficate, SSL_SUCCESS for ok, < 0 for error */
wolfSSL 0:9d17e4342598 2237 int CyaSSL_CertManagerVerifyBuffer(CYASSL_CERT_MANAGER* cm, const byte* buff,
wolfSSL 0:9d17e4342598 2238 long sz, int format)
wolfSSL 0:9d17e4342598 2239 {
wolfSSL 0:9d17e4342598 2240 int ret = 0;
wolfSSL 0:9d17e4342598 2241 int eccKey = 0; /* not used */
wolfSSL 0:9d17e4342598 2242
wolfSSL 0:9d17e4342598 2243 DecodedCert cert;
wolfSSL 0:9d17e4342598 2244 buffer der;
wolfSSL 0:9d17e4342598 2245
wolfSSL 0:9d17e4342598 2246 CYASSL_ENTER("CyaSSL_CertManagerVerifyBuffer");
wolfSSL 0:9d17e4342598 2247
wolfSSL 0:9d17e4342598 2248 der.buffer = NULL;
wolfSSL 0:9d17e4342598 2249 der.length = 0;
wolfSSL 0:9d17e4342598 2250
wolfSSL 0:9d17e4342598 2251 if (format == SSL_FILETYPE_PEM) {
wolfSSL 0:9d17e4342598 2252 EncryptedInfo info;
wolfSSL 0:9d17e4342598 2253
wolfSSL 0:9d17e4342598 2254 info.set = 0;
wolfSSL 0:9d17e4342598 2255 info.ctx = NULL;
wolfSSL 0:9d17e4342598 2256 info.consumed = 0;
wolfSSL 0:9d17e4342598 2257 ret = PemToDer(buff, sz, CERT_TYPE, &der, cm->heap, &info, &eccKey);
wolfSSL 0:9d17e4342598 2258 InitDecodedCert(&cert, der.buffer, der.length, cm->heap);
wolfSSL 0:9d17e4342598 2259 }
wolfSSL 0:9d17e4342598 2260 else
wolfSSL 0:9d17e4342598 2261 InitDecodedCert(&cert, (byte*)buff, (word32)sz, cm->heap);
wolfSSL 0:9d17e4342598 2262
wolfSSL 0:9d17e4342598 2263 if (ret == 0)
wolfSSL 0:9d17e4342598 2264 ret = ParseCertRelative(&cert, CERT_TYPE, 1, cm);
wolfSSL 0:9d17e4342598 2265 #ifdef HAVE_CRL
wolfSSL 0:9d17e4342598 2266 if (ret == 0 && cm->crlEnabled)
wolfSSL 0:9d17e4342598 2267 ret = CheckCertCRL(cm->crl, &cert);
wolfSSL 0:9d17e4342598 2268 #endif
wolfSSL 0:9d17e4342598 2269
wolfSSL 0:9d17e4342598 2270 FreeDecodedCert(&cert);
wolfSSL 0:9d17e4342598 2271 XFREE(der.buffer, cm->heap, DYNAMIC_TYPE_CERT);
wolfSSL 0:9d17e4342598 2272
wolfSSL 0:9d17e4342598 2273 if (ret == 0)
wolfSSL 0:9d17e4342598 2274 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 2275 return ret;
wolfSSL 0:9d17e4342598 2276 }
wolfSSL 0:9d17e4342598 2277
wolfSSL 0:9d17e4342598 2278
wolfSSL 0:9d17e4342598 2279 #ifndef NO_FILESYSTEM
wolfSSL 0:9d17e4342598 2280
wolfSSL 0:9d17e4342598 2281 #if defined(CYASSL_MDK_ARM)
wolfSSL 0:9d17e4342598 2282 extern FILE * CyaSSL_fopen(const char *name, const char *mode) ;
wolfSSL 0:9d17e4342598 2283 #define XFOPEN CyaSSL_fopen
wolfSSL 0:9d17e4342598 2284 #else
wolfSSL 0:9d17e4342598 2285 #define XFOPEN fopen
wolfSSL 0:9d17e4342598 2286 #endif
wolfSSL 0:9d17e4342598 2287
wolfSSL 0:9d17e4342598 2288 /* process a file with name fname into ctx of format and type
wolfSSL 0:9d17e4342598 2289 userChain specifies a user certificate chain to pass during handshake */
wolfSSL 0:9d17e4342598 2290 int ProcessFile(CYASSL_CTX* ctx, const char* fname, int format, int type,
wolfSSL 0:9d17e4342598 2291 CYASSL* ssl, int userChain, CYASSL_CRL* crl)
wolfSSL 0:9d17e4342598 2292 {
wolfSSL 0:9d17e4342598 2293 byte staticBuffer[FILE_BUFFER_SIZE];
wolfSSL 0:9d17e4342598 2294 byte* myBuffer = staticBuffer;
wolfSSL 0:9d17e4342598 2295 int dynamic = 0;
wolfSSL 0:9d17e4342598 2296 int ret;
wolfSSL 0:9d17e4342598 2297 long sz = 0;
wolfSSL 0:9d17e4342598 2298 XFILE file;
wolfSSL 0:9d17e4342598 2299 void* heapHint = ctx ? ctx->heap : NULL;
wolfSSL 0:9d17e4342598 2300
wolfSSL 0:9d17e4342598 2301 (void)crl;
wolfSSL 0:9d17e4342598 2302 (void)heapHint;
wolfSSL 0:9d17e4342598 2303
wolfSSL 0:9d17e4342598 2304 if (fname == NULL) return SSL_BAD_FILE;
wolfSSL 0:9d17e4342598 2305
wolfSSL 0:9d17e4342598 2306 file = XFOPEN(fname, "rb");
wolfSSL 0:9d17e4342598 2307 if (file == XBADFILE) return SSL_BAD_FILE;
wolfSSL 0:9d17e4342598 2308 XFSEEK(file, 0, XSEEK_END);
wolfSSL 0:9d17e4342598 2309 sz = XFTELL(file);
wolfSSL 0:9d17e4342598 2310 XREWIND(file);
wolfSSL 0:9d17e4342598 2311
wolfSSL 0:9d17e4342598 2312 if (sz > (long)sizeof(staticBuffer)) {
wolfSSL 0:9d17e4342598 2313 CYASSL_MSG("Getting dynamic buffer");
wolfSSL 0:9d17e4342598 2314 myBuffer = (byte*)XMALLOC(sz, heapHint, DYNAMIC_TYPE_FILE);
wolfSSL 0:9d17e4342598 2315 if (myBuffer == NULL) {
wolfSSL 0:9d17e4342598 2316 XFCLOSE(file);
wolfSSL 0:9d17e4342598 2317 return SSL_BAD_FILE;
wolfSSL 0:9d17e4342598 2318 }
wolfSSL 0:9d17e4342598 2319 dynamic = 1;
wolfSSL 0:9d17e4342598 2320 }
wolfSSL 0:9d17e4342598 2321 else if (sz < 0) {
wolfSSL 0:9d17e4342598 2322 XFCLOSE(file);
wolfSSL 0:9d17e4342598 2323 return SSL_BAD_FILE;
wolfSSL 0:9d17e4342598 2324 }
wolfSSL 0:9d17e4342598 2325
wolfSSL 0:9d17e4342598 2326 if ( (ret = (int)XFREAD(myBuffer, sz, 1, file)) < 0)
wolfSSL 0:9d17e4342598 2327 ret = SSL_BAD_FILE;
wolfSSL 0:9d17e4342598 2328 else {
wolfSSL 0:9d17e4342598 2329 if (type == CA_TYPE && format == SSL_FILETYPE_PEM)
wolfSSL 0:9d17e4342598 2330 ret = ProcessChainBuffer(ctx, myBuffer, sz, format, type, ssl);
wolfSSL 0:9d17e4342598 2331 #ifdef HAVE_CRL
wolfSSL 0:9d17e4342598 2332 else if (type == CRL_TYPE)
wolfSSL 0:9d17e4342598 2333 ret = BufferLoadCRL(crl, myBuffer, sz, format);
wolfSSL 0:9d17e4342598 2334 #endif
wolfSSL 0:9d17e4342598 2335 else
wolfSSL 0:9d17e4342598 2336 ret = ProcessBuffer(ctx, myBuffer, sz, format, type, ssl, NULL,
wolfSSL 0:9d17e4342598 2337 userChain);
wolfSSL 0:9d17e4342598 2338 }
wolfSSL 0:9d17e4342598 2339
wolfSSL 0:9d17e4342598 2340 XFCLOSE(file);
wolfSSL 0:9d17e4342598 2341 if (dynamic) XFREE(myBuffer, heapHint, DYNAMIC_TYPE_FILE);
wolfSSL 0:9d17e4342598 2342
wolfSSL 0:9d17e4342598 2343 return ret;
wolfSSL 0:9d17e4342598 2344 }
wolfSSL 0:9d17e4342598 2345
wolfSSL 0:9d17e4342598 2346
wolfSSL 0:9d17e4342598 2347 /* loads file then loads each file in path, no c_rehash */
wolfSSL 0:9d17e4342598 2348 int CyaSSL_CTX_load_verify_locations(CYASSL_CTX* ctx, const char* file,
wolfSSL 0:9d17e4342598 2349 const char* path)
wolfSSL 0:9d17e4342598 2350 {
wolfSSL 0:9d17e4342598 2351 int ret = SSL_SUCCESS;
wolfSSL 0:9d17e4342598 2352
wolfSSL 0:9d17e4342598 2353 CYASSL_ENTER("CyaSSL_CTX_load_verify_locations");
wolfSSL 0:9d17e4342598 2354 (void)path;
wolfSSL 0:9d17e4342598 2355
wolfSSL 0:9d17e4342598 2356 if (ctx == NULL || (file == NULL && path == NULL) )
wolfSSL 0:9d17e4342598 2357 return SSL_FAILURE;
wolfSSL 0:9d17e4342598 2358
wolfSSL 0:9d17e4342598 2359 if (file)
wolfSSL 0:9d17e4342598 2360 ret = ProcessFile(ctx, file, SSL_FILETYPE_PEM, CA_TYPE, NULL, 0, NULL);
wolfSSL 0:9d17e4342598 2361
wolfSSL 0:9d17e4342598 2362 if (ret == SSL_SUCCESS && path) {
wolfSSL 0:9d17e4342598 2363 /* try to load each regular file in path */
wolfSSL 0:9d17e4342598 2364 #ifdef USE_WINDOWS_API
wolfSSL 0:9d17e4342598 2365 WIN32_FIND_DATAA FindFileData;
wolfSSL 0:9d17e4342598 2366 HANDLE hFind;
wolfSSL 0:9d17e4342598 2367 char name[MAX_FILENAME_SZ];
wolfSSL 0:9d17e4342598 2368
wolfSSL 0:9d17e4342598 2369 XMEMSET(name, 0, sizeof(name));
wolfSSL 0:9d17e4342598 2370 XSTRNCPY(name, path, MAX_FILENAME_SZ - 4);
wolfSSL 0:9d17e4342598 2371 XSTRNCAT(name, "\\*", 3);
wolfSSL 0:9d17e4342598 2372
wolfSSL 0:9d17e4342598 2373 hFind = FindFirstFileA(name, &FindFileData);
wolfSSL 0:9d17e4342598 2374 if (hFind == INVALID_HANDLE_VALUE) {
wolfSSL 0:9d17e4342598 2375 CYASSL_MSG("FindFirstFile for path verify locations failed");
wolfSSL 0:9d17e4342598 2376 return BAD_PATH_ERROR;
wolfSSL 0:9d17e4342598 2377 }
wolfSSL 0:9d17e4342598 2378
wolfSSL 0:9d17e4342598 2379 do {
wolfSSL 0:9d17e4342598 2380 if (FindFileData.dwFileAttributes != FILE_ATTRIBUTE_DIRECTORY) {
wolfSSL 0:9d17e4342598 2381 XSTRNCPY(name, path, MAX_FILENAME_SZ/2 - 3);
wolfSSL 0:9d17e4342598 2382 XSTRNCAT(name, "\\", 2);
wolfSSL 0:9d17e4342598 2383 XSTRNCAT(name, FindFileData.cFileName, MAX_FILENAME_SZ/2);
wolfSSL 0:9d17e4342598 2384
wolfSSL 0:9d17e4342598 2385 ret = ProcessFile(ctx, name, SSL_FILETYPE_PEM, CA_TYPE, NULL,0,
wolfSSL 0:9d17e4342598 2386 NULL);
wolfSSL 0:9d17e4342598 2387 }
wolfSSL 0:9d17e4342598 2388 } while (ret == SSL_SUCCESS && FindNextFileA(hFind, &FindFileData));
wolfSSL 0:9d17e4342598 2389
wolfSSL 0:9d17e4342598 2390 FindClose(hFind);
wolfSSL 0:9d17e4342598 2391 #elif !defined(NO_CYASSL_DIR)
wolfSSL 0:9d17e4342598 2392 struct dirent* entry;
wolfSSL 0:9d17e4342598 2393 DIR* dir = opendir(path);
wolfSSL 0:9d17e4342598 2394
wolfSSL 0:9d17e4342598 2395 if (dir == NULL) {
wolfSSL 0:9d17e4342598 2396 CYASSL_MSG("opendir path verify locations failed");
wolfSSL 0:9d17e4342598 2397 return BAD_PATH_ERROR;
wolfSSL 0:9d17e4342598 2398 }
wolfSSL 0:9d17e4342598 2399 while ( ret == SSL_SUCCESS && (entry = readdir(dir)) != NULL) {
wolfSSL 0:9d17e4342598 2400 char name[MAX_FILENAME_SZ];
wolfSSL 0:9d17e4342598 2401 struct stat s;
wolfSSL 0:9d17e4342598 2402
wolfSSL 0:9d17e4342598 2403 XMEMSET(name, 0, sizeof(name));
wolfSSL 0:9d17e4342598 2404 XSTRNCPY(name, path, MAX_FILENAME_SZ/2 - 2);
wolfSSL 0:9d17e4342598 2405 XSTRNCAT(name, "/", 1);
wolfSSL 0:9d17e4342598 2406 XSTRNCAT(name, entry->d_name, MAX_FILENAME_SZ/2);
wolfSSL 0:9d17e4342598 2407
wolfSSL 0:9d17e4342598 2408 if (stat(name, &s) != 0) {
wolfSSL 0:9d17e4342598 2409 CYASSL_MSG("stat on name failed");
wolfSSL 0:9d17e4342598 2410 closedir(dir);
wolfSSL 0:9d17e4342598 2411 return BAD_PATH_ERROR;
wolfSSL 0:9d17e4342598 2412 }
wolfSSL 0:9d17e4342598 2413 if (s.st_mode & S_IFREG) {
wolfSSL 0:9d17e4342598 2414 ret = ProcessFile(ctx, name, SSL_FILETYPE_PEM, CA_TYPE, NULL,0,
wolfSSL 0:9d17e4342598 2415 NULL);
wolfSSL 0:9d17e4342598 2416 }
wolfSSL 0:9d17e4342598 2417 }
wolfSSL 0:9d17e4342598 2418 closedir(dir);
wolfSSL 0:9d17e4342598 2419 #endif
wolfSSL 0:9d17e4342598 2420 }
wolfSSL 0:9d17e4342598 2421
wolfSSL 0:9d17e4342598 2422 return ret;
wolfSSL 0:9d17e4342598 2423 }
wolfSSL 0:9d17e4342598 2424
wolfSSL 0:9d17e4342598 2425
wolfSSL 0:9d17e4342598 2426 /* Verify the ceritficate, SSL_SUCCESS for ok, < 0 for error */
wolfSSL 0:9d17e4342598 2427 int CyaSSL_CertManagerVerify(CYASSL_CERT_MANAGER* cm, const char* fname,
wolfSSL 0:9d17e4342598 2428 int format)
wolfSSL 0:9d17e4342598 2429 {
wolfSSL 0:9d17e4342598 2430 int ret = SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 2431 byte staticBuffer[FILE_BUFFER_SIZE];
wolfSSL 0:9d17e4342598 2432 byte* myBuffer = staticBuffer;
wolfSSL 0:9d17e4342598 2433 int dynamic = 0;
wolfSSL 0:9d17e4342598 2434 long sz = 0;
wolfSSL 0:9d17e4342598 2435 XFILE file = XFOPEN(fname, "rb");
wolfSSL 0:9d17e4342598 2436
wolfSSL 0:9d17e4342598 2437 CYASSL_ENTER("CyaSSL_CertManagerVerify");
wolfSSL 0:9d17e4342598 2438
wolfSSL 0:9d17e4342598 2439 if (file == XBADFILE) return SSL_BAD_FILE;
wolfSSL 0:9d17e4342598 2440 XFSEEK(file, 0, XSEEK_END);
wolfSSL 0:9d17e4342598 2441 sz = XFTELL(file);
wolfSSL 0:9d17e4342598 2442 XREWIND(file);
wolfSSL 0:9d17e4342598 2443
wolfSSL 0:9d17e4342598 2444 if (sz > MAX_CYASSL_FILE_SIZE || sz < 0) {
wolfSSL 0:9d17e4342598 2445 CYASSL_MSG("CertManagerVerify file bad size");
wolfSSL 0:9d17e4342598 2446 XFCLOSE(file);
wolfSSL 0:9d17e4342598 2447 return SSL_BAD_FILE;
wolfSSL 0:9d17e4342598 2448 }
wolfSSL 0:9d17e4342598 2449
wolfSSL 0:9d17e4342598 2450 if (sz > (long)sizeof(staticBuffer)) {
wolfSSL 0:9d17e4342598 2451 CYASSL_MSG("Getting dynamic buffer");
wolfSSL 0:9d17e4342598 2452 myBuffer = (byte*) XMALLOC(sz, cm->heap, DYNAMIC_TYPE_FILE);
wolfSSL 0:9d17e4342598 2453 if (myBuffer == NULL) {
wolfSSL 0:9d17e4342598 2454 XFCLOSE(file);
wolfSSL 0:9d17e4342598 2455 return SSL_BAD_FILE;
wolfSSL 0:9d17e4342598 2456 }
wolfSSL 0:9d17e4342598 2457 dynamic = 1;
wolfSSL 0:9d17e4342598 2458 }
wolfSSL 0:9d17e4342598 2459
wolfSSL 0:9d17e4342598 2460 if ( (ret = (int)XFREAD(myBuffer, sz, 1, file)) < 0)
wolfSSL 0:9d17e4342598 2461 ret = SSL_BAD_FILE;
wolfSSL 0:9d17e4342598 2462 else
wolfSSL 0:9d17e4342598 2463 ret = CyaSSL_CertManagerVerifyBuffer(cm, myBuffer, sz, format);
wolfSSL 0:9d17e4342598 2464
wolfSSL 0:9d17e4342598 2465 XFCLOSE(file);
wolfSSL 0:9d17e4342598 2466 if (dynamic) XFREE(myBuffer, cm->heap, DYNAMIC_TYPE_FILE);
wolfSSL 0:9d17e4342598 2467
wolfSSL 0:9d17e4342598 2468 return ret;
wolfSSL 0:9d17e4342598 2469 }
wolfSSL 0:9d17e4342598 2470
wolfSSL 0:9d17e4342598 2471
wolfSSL 0:9d17e4342598 2472 static INLINE CYASSL_METHOD* cm_pick_method(void)
wolfSSL 0:9d17e4342598 2473 {
wolfSSL 0:9d17e4342598 2474 #ifndef NO_CYASSL_CLIENT
wolfSSL 0:9d17e4342598 2475 #ifdef NO_OLD_TLS
wolfSSL 0:9d17e4342598 2476 return CyaTLSv1_2_client_method();
wolfSSL 0:9d17e4342598 2477 #else
wolfSSL 0:9d17e4342598 2478 return CyaSSLv3_client_method();
wolfSSL 0:9d17e4342598 2479 #endif
wolfSSL 0:9d17e4342598 2480 #elif !defined(NO_CYASSL_SERVER)
wolfSSL 0:9d17e4342598 2481 #ifdef NO_OLD_TLS
wolfSSL 0:9d17e4342598 2482 return CyaTLSv1_2_server_method();
wolfSSL 0:9d17e4342598 2483 #else
wolfSSL 0:9d17e4342598 2484 return CyaSSLv3_server_method();
wolfSSL 0:9d17e4342598 2485 #endif
wolfSSL 0:9d17e4342598 2486 #else
wolfSSL 0:9d17e4342598 2487 return NULL;
wolfSSL 0:9d17e4342598 2488 #endif
wolfSSL 0:9d17e4342598 2489 }
wolfSSL 0:9d17e4342598 2490
wolfSSL 0:9d17e4342598 2491
wolfSSL 0:9d17e4342598 2492 /* like load verify locations, 1 for success, < 0 for error */
wolfSSL 0:9d17e4342598 2493 int CyaSSL_CertManagerLoadCA(CYASSL_CERT_MANAGER* cm, const char* file,
wolfSSL 0:9d17e4342598 2494 const char* path)
wolfSSL 0:9d17e4342598 2495 {
wolfSSL 0:9d17e4342598 2496 int ret = SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 2497 CYASSL_CTX* tmp;
wolfSSL 0:9d17e4342598 2498
wolfSSL 0:9d17e4342598 2499 CYASSL_ENTER("CyaSSL_CertManagerLoadCA");
wolfSSL 0:9d17e4342598 2500
wolfSSL 0:9d17e4342598 2501 if (cm == NULL) {
wolfSSL 0:9d17e4342598 2502 CYASSL_MSG("No CertManager error");
wolfSSL 0:9d17e4342598 2503 return ret;
wolfSSL 0:9d17e4342598 2504 }
wolfSSL 0:9d17e4342598 2505 tmp = CyaSSL_CTX_new(cm_pick_method());
wolfSSL 0:9d17e4342598 2506
wolfSSL 0:9d17e4342598 2507 if (tmp == NULL) {
wolfSSL 0:9d17e4342598 2508 CYASSL_MSG("CTX new failed");
wolfSSL 0:9d17e4342598 2509 return ret;
wolfSSL 0:9d17e4342598 2510 }
wolfSSL 0:9d17e4342598 2511
wolfSSL 0:9d17e4342598 2512 /* for tmp use */
wolfSSL 0:9d17e4342598 2513 CyaSSL_CertManagerFree(tmp->cm);
wolfSSL 0:9d17e4342598 2514 tmp->cm = cm;
wolfSSL 0:9d17e4342598 2515
wolfSSL 0:9d17e4342598 2516 ret = CyaSSL_CTX_load_verify_locations(tmp, file, path);
wolfSSL 0:9d17e4342598 2517
wolfSSL 0:9d17e4342598 2518 /* don't loose our good one */
wolfSSL 0:9d17e4342598 2519 tmp->cm = NULL;
wolfSSL 0:9d17e4342598 2520 CyaSSL_CTX_free(tmp);
wolfSSL 0:9d17e4342598 2521
wolfSSL 0:9d17e4342598 2522 return ret;
wolfSSL 0:9d17e4342598 2523 }
wolfSSL 0:9d17e4342598 2524
wolfSSL 0:9d17e4342598 2525
wolfSSL 0:9d17e4342598 2526
wolfSSL 0:9d17e4342598 2527 /* turn on CRL if off and compiled in, set options */
wolfSSL 0:9d17e4342598 2528 int CyaSSL_CertManagerEnableCRL(CYASSL_CERT_MANAGER* cm, int options)
wolfSSL 0:9d17e4342598 2529 {
wolfSSL 0:9d17e4342598 2530 int ret = SSL_SUCCESS;
wolfSSL 0:9d17e4342598 2531
wolfSSL 0:9d17e4342598 2532 (void)options;
wolfSSL 0:9d17e4342598 2533
wolfSSL 0:9d17e4342598 2534 CYASSL_ENTER("CyaSSL_CertManagerEnableCRL");
wolfSSL 0:9d17e4342598 2535 if (cm == NULL)
wolfSSL 0:9d17e4342598 2536 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 2537
wolfSSL 0:9d17e4342598 2538 #ifdef HAVE_CRL
wolfSSL 0:9d17e4342598 2539 if (cm->crl == NULL) {
wolfSSL 0:9d17e4342598 2540 cm->crl = (CYASSL_CRL*)XMALLOC(sizeof(CYASSL_CRL), cm->heap,
wolfSSL 0:9d17e4342598 2541 DYNAMIC_TYPE_CRL);
wolfSSL 0:9d17e4342598 2542 if (cm->crl == NULL)
wolfSSL 0:9d17e4342598 2543 return MEMORY_E;
wolfSSL 0:9d17e4342598 2544
wolfSSL 0:9d17e4342598 2545 if (InitCRL(cm->crl, cm) != 0) {
wolfSSL 0:9d17e4342598 2546 CYASSL_MSG("Init CRL failed");
wolfSSL 0:9d17e4342598 2547 FreeCRL(cm->crl, 1);
wolfSSL 0:9d17e4342598 2548 cm->crl = NULL;
wolfSSL 0:9d17e4342598 2549 return SSL_FAILURE;
wolfSSL 0:9d17e4342598 2550 }
wolfSSL 0:9d17e4342598 2551 }
wolfSSL 0:9d17e4342598 2552 cm->crlEnabled = 1;
wolfSSL 0:9d17e4342598 2553 if (options & CYASSL_CRL_CHECKALL)
wolfSSL 0:9d17e4342598 2554 cm->crlCheckAll = 1;
wolfSSL 0:9d17e4342598 2555 #else
wolfSSL 0:9d17e4342598 2556 ret = NOT_COMPILED_IN;
wolfSSL 0:9d17e4342598 2557 #endif
wolfSSL 0:9d17e4342598 2558
wolfSSL 0:9d17e4342598 2559 return ret;
wolfSSL 0:9d17e4342598 2560 }
wolfSSL 0:9d17e4342598 2561
wolfSSL 0:9d17e4342598 2562
wolfSSL 0:9d17e4342598 2563 int CyaSSL_CertManagerDisableCRL(CYASSL_CERT_MANAGER* cm)
wolfSSL 0:9d17e4342598 2564 {
wolfSSL 0:9d17e4342598 2565 CYASSL_ENTER("CyaSSL_CertManagerDisableCRL");
wolfSSL 0:9d17e4342598 2566 if (cm == NULL)
wolfSSL 0:9d17e4342598 2567 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 2568
wolfSSL 0:9d17e4342598 2569 cm->crlEnabled = 0;
wolfSSL 0:9d17e4342598 2570
wolfSSL 0:9d17e4342598 2571 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 2572 }
wolfSSL 0:9d17e4342598 2573
wolfSSL 0:9d17e4342598 2574
wolfSSL 0:9d17e4342598 2575 /* turn on OCSP if off and compiled in, set options */
wolfSSL 0:9d17e4342598 2576 int CyaSSL_CertManagerEnableOCSP(CYASSL_CERT_MANAGER* cm, int options)
wolfSSL 0:9d17e4342598 2577 {
wolfSSL 0:9d17e4342598 2578 int ret = SSL_SUCCESS;
wolfSSL 0:9d17e4342598 2579
wolfSSL 0:9d17e4342598 2580 (void)options;
wolfSSL 0:9d17e4342598 2581
wolfSSL 0:9d17e4342598 2582 CYASSL_ENTER("CyaSSL_CertManagerEnableOCSP");
wolfSSL 0:9d17e4342598 2583 if (cm == NULL)
wolfSSL 0:9d17e4342598 2584 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 2585
wolfSSL 0:9d17e4342598 2586 #ifdef HAVE_OCSP
wolfSSL 0:9d17e4342598 2587 if (cm->ocsp == NULL) {
wolfSSL 0:9d17e4342598 2588 cm->ocsp = (CYASSL_OCSP*)XMALLOC(sizeof(CYASSL_OCSP), cm->heap,
wolfSSL 0:9d17e4342598 2589 DYNAMIC_TYPE_OCSP);
wolfSSL 0:9d17e4342598 2590 if (cm->ocsp == NULL)
wolfSSL 0:9d17e4342598 2591 return MEMORY_E;
wolfSSL 0:9d17e4342598 2592
wolfSSL 0:9d17e4342598 2593 if (InitOCSP(cm->ocsp, cm) != 0) {
wolfSSL 0:9d17e4342598 2594 CYASSL_MSG("Init OCSP failed");
wolfSSL 0:9d17e4342598 2595 FreeOCSP(cm->ocsp, 1);
wolfSSL 0:9d17e4342598 2596 cm->ocsp = NULL;
wolfSSL 0:9d17e4342598 2597 return SSL_FAILURE;
wolfSSL 0:9d17e4342598 2598 }
wolfSSL 0:9d17e4342598 2599 }
wolfSSL 0:9d17e4342598 2600 cm->ocspEnabled = 1;
wolfSSL 0:9d17e4342598 2601 if (options & CYASSL_OCSP_URL_OVERRIDE)
wolfSSL 0:9d17e4342598 2602 cm->ocspUseOverrideURL = 1;
wolfSSL 0:9d17e4342598 2603 if (options & CYASSL_OCSP_NO_NONCE)
wolfSSL 0:9d17e4342598 2604 cm->ocspSendNonce = 0;
wolfSSL 0:9d17e4342598 2605 else
wolfSSL 0:9d17e4342598 2606 cm->ocspSendNonce = 1;
wolfSSL 0:9d17e4342598 2607 #ifndef CYASSL_USER_IO
wolfSSL 0:9d17e4342598 2608 cm->ocspIOCb = EmbedOcspLookup;
wolfSSL 0:9d17e4342598 2609 cm->ocspRespFreeCb = EmbedOcspRespFree;
wolfSSL 0:9d17e4342598 2610 #endif /* CYASSL_USER_IO */
wolfSSL 0:9d17e4342598 2611 #else
wolfSSL 0:9d17e4342598 2612 ret = NOT_COMPILED_IN;
wolfSSL 0:9d17e4342598 2613 #endif
wolfSSL 0:9d17e4342598 2614
wolfSSL 0:9d17e4342598 2615 return ret;
wolfSSL 0:9d17e4342598 2616 }
wolfSSL 0:9d17e4342598 2617
wolfSSL 0:9d17e4342598 2618
wolfSSL 0:9d17e4342598 2619 int CyaSSL_CertManagerDisableOCSP(CYASSL_CERT_MANAGER* cm)
wolfSSL 0:9d17e4342598 2620 {
wolfSSL 0:9d17e4342598 2621 CYASSL_ENTER("CyaSSL_CertManagerDisableOCSP");
wolfSSL 0:9d17e4342598 2622 if (cm == NULL)
wolfSSL 0:9d17e4342598 2623 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 2624
wolfSSL 0:9d17e4342598 2625 cm->ocspEnabled = 0;
wolfSSL 0:9d17e4342598 2626
wolfSSL 0:9d17e4342598 2627 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 2628 }
wolfSSL 0:9d17e4342598 2629
wolfSSL 0:9d17e4342598 2630
wolfSSL 0:9d17e4342598 2631 int CyaSSL_CTX_check_private_key(CYASSL_CTX* ctx)
wolfSSL 0:9d17e4342598 2632 {
wolfSSL 0:9d17e4342598 2633 /* TODO: check private against public for RSA match */
wolfSSL 0:9d17e4342598 2634 (void)ctx;
wolfSSL 0:9d17e4342598 2635 CYASSL_ENTER("SSL_CTX_check_private_key");
wolfSSL 0:9d17e4342598 2636 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 2637 }
wolfSSL 0:9d17e4342598 2638
wolfSSL 0:9d17e4342598 2639
wolfSSL 0:9d17e4342598 2640 #ifdef HAVE_CRL
wolfSSL 0:9d17e4342598 2641
wolfSSL 0:9d17e4342598 2642
wolfSSL 0:9d17e4342598 2643 /* check CRL if enabled, SSL_SUCCESS */
wolfSSL 0:9d17e4342598 2644 int CyaSSL_CertManagerCheckCRL(CYASSL_CERT_MANAGER* cm, byte* der, int sz)
wolfSSL 0:9d17e4342598 2645 {
wolfSSL 0:9d17e4342598 2646 int ret;
wolfSSL 0:9d17e4342598 2647 DecodedCert cert;
wolfSSL 0:9d17e4342598 2648
wolfSSL 0:9d17e4342598 2649 CYASSL_ENTER("CyaSSL_CertManagerCheckCRL");
wolfSSL 0:9d17e4342598 2650
wolfSSL 0:9d17e4342598 2651 if (cm == NULL)
wolfSSL 0:9d17e4342598 2652 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 2653
wolfSSL 0:9d17e4342598 2654 if (cm->crlEnabled == 0)
wolfSSL 0:9d17e4342598 2655 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 2656
wolfSSL 0:9d17e4342598 2657 InitDecodedCert(&cert, der, sz, NULL);
wolfSSL 0:9d17e4342598 2658
wolfSSL 0:9d17e4342598 2659 ret = ParseCertRelative(&cert, CERT_TYPE, NO_VERIFY, cm);
wolfSSL 0:9d17e4342598 2660 if (ret != 0) {
wolfSSL 0:9d17e4342598 2661 CYASSL_MSG("ParseCert failed");
wolfSSL 0:9d17e4342598 2662 return ret;
wolfSSL 0:9d17e4342598 2663 }
wolfSSL 0:9d17e4342598 2664 else {
wolfSSL 0:9d17e4342598 2665 ret = CheckCertCRL(cm->crl, &cert);
wolfSSL 0:9d17e4342598 2666 if (ret != 0) {
wolfSSL 0:9d17e4342598 2667 CYASSL_MSG("CheckCertCRL failed");
wolfSSL 0:9d17e4342598 2668 }
wolfSSL 0:9d17e4342598 2669 }
wolfSSL 0:9d17e4342598 2670
wolfSSL 0:9d17e4342598 2671 FreeDecodedCert(&cert);
wolfSSL 0:9d17e4342598 2672
wolfSSL 0:9d17e4342598 2673 if (ret == 0)
wolfSSL 0:9d17e4342598 2674 return SSL_SUCCESS; /* convert */
wolfSSL 0:9d17e4342598 2675
wolfSSL 0:9d17e4342598 2676 return ret;
wolfSSL 0:9d17e4342598 2677 }
wolfSSL 0:9d17e4342598 2678
wolfSSL 0:9d17e4342598 2679
wolfSSL 0:9d17e4342598 2680 int CyaSSL_CertManagerSetCRL_Cb(CYASSL_CERT_MANAGER* cm, CbMissingCRL cb)
wolfSSL 0:9d17e4342598 2681 {
wolfSSL 0:9d17e4342598 2682 CYASSL_ENTER("CyaSSL_CertManagerSetCRL_Cb");
wolfSSL 0:9d17e4342598 2683 if (cm == NULL)
wolfSSL 0:9d17e4342598 2684 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 2685
wolfSSL 0:9d17e4342598 2686 cm->cbMissingCRL = cb;
wolfSSL 0:9d17e4342598 2687
wolfSSL 0:9d17e4342598 2688 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 2689 }
wolfSSL 0:9d17e4342598 2690
wolfSSL 0:9d17e4342598 2691
wolfSSL 0:9d17e4342598 2692 int CyaSSL_CertManagerLoadCRL(CYASSL_CERT_MANAGER* cm, const char* path,
wolfSSL 0:9d17e4342598 2693 int type, int monitor)
wolfSSL 0:9d17e4342598 2694 {
wolfSSL 0:9d17e4342598 2695 CYASSL_ENTER("CyaSSL_CertManagerLoadCRL");
wolfSSL 0:9d17e4342598 2696 if (cm == NULL)
wolfSSL 0:9d17e4342598 2697 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 2698
wolfSSL 0:9d17e4342598 2699 if (cm->crl == NULL) {
wolfSSL 0:9d17e4342598 2700 if (CyaSSL_CertManagerEnableCRL(cm, 0) != SSL_SUCCESS) {
wolfSSL 0:9d17e4342598 2701 CYASSL_MSG("Enable CRL failed");
wolfSSL 0:9d17e4342598 2702 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 2703 }
wolfSSL 0:9d17e4342598 2704 }
wolfSSL 0:9d17e4342598 2705
wolfSSL 0:9d17e4342598 2706 return LoadCRL(cm->crl, path, type, monitor);
wolfSSL 0:9d17e4342598 2707 }
wolfSSL 0:9d17e4342598 2708
wolfSSL 0:9d17e4342598 2709
wolfSSL 0:9d17e4342598 2710 int CyaSSL_EnableCRL(CYASSL* ssl, int options)
wolfSSL 0:9d17e4342598 2711 {
wolfSSL 0:9d17e4342598 2712 CYASSL_ENTER("CyaSSL_EnableCRL");
wolfSSL 0:9d17e4342598 2713 if (ssl)
wolfSSL 0:9d17e4342598 2714 return CyaSSL_CertManagerEnableCRL(ssl->ctx->cm, options);
wolfSSL 0:9d17e4342598 2715 else
wolfSSL 0:9d17e4342598 2716 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 2717 }
wolfSSL 0:9d17e4342598 2718
wolfSSL 0:9d17e4342598 2719
wolfSSL 0:9d17e4342598 2720 int CyaSSL_DisableCRL(CYASSL* ssl)
wolfSSL 0:9d17e4342598 2721 {
wolfSSL 0:9d17e4342598 2722 CYASSL_ENTER("CyaSSL_DisableCRL");
wolfSSL 0:9d17e4342598 2723 if (ssl)
wolfSSL 0:9d17e4342598 2724 return CyaSSL_CertManagerDisableCRL(ssl->ctx->cm);
wolfSSL 0:9d17e4342598 2725 else
wolfSSL 0:9d17e4342598 2726 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 2727 }
wolfSSL 0:9d17e4342598 2728
wolfSSL 0:9d17e4342598 2729
wolfSSL 0:9d17e4342598 2730 int CyaSSL_LoadCRL(CYASSL* ssl, const char* path, int type, int monitor)
wolfSSL 0:9d17e4342598 2731 {
wolfSSL 0:9d17e4342598 2732 CYASSL_ENTER("CyaSSL_LoadCRL");
wolfSSL 0:9d17e4342598 2733 if (ssl)
wolfSSL 0:9d17e4342598 2734 return CyaSSL_CertManagerLoadCRL(ssl->ctx->cm, path, type, monitor);
wolfSSL 0:9d17e4342598 2735 else
wolfSSL 0:9d17e4342598 2736 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 2737 }
wolfSSL 0:9d17e4342598 2738
wolfSSL 0:9d17e4342598 2739
wolfSSL 0:9d17e4342598 2740 int CyaSSL_SetCRL_Cb(CYASSL* ssl, CbMissingCRL cb)
wolfSSL 0:9d17e4342598 2741 {
wolfSSL 0:9d17e4342598 2742 CYASSL_ENTER("CyaSSL_SetCRL_Cb");
wolfSSL 0:9d17e4342598 2743 if (ssl)
wolfSSL 0:9d17e4342598 2744 return CyaSSL_CertManagerSetCRL_Cb(ssl->ctx->cm, cb);
wolfSSL 0:9d17e4342598 2745 else
wolfSSL 0:9d17e4342598 2746 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 2747 }
wolfSSL 0:9d17e4342598 2748
wolfSSL 0:9d17e4342598 2749
wolfSSL 0:9d17e4342598 2750 int CyaSSL_CTX_EnableCRL(CYASSL_CTX* ctx, int options)
wolfSSL 0:9d17e4342598 2751 {
wolfSSL 0:9d17e4342598 2752 CYASSL_ENTER("CyaSSL_CTX_EnableCRL");
wolfSSL 0:9d17e4342598 2753 if (ctx)
wolfSSL 0:9d17e4342598 2754 return CyaSSL_CertManagerEnableCRL(ctx->cm, options);
wolfSSL 0:9d17e4342598 2755 else
wolfSSL 0:9d17e4342598 2756 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 2757 }
wolfSSL 0:9d17e4342598 2758
wolfSSL 0:9d17e4342598 2759
wolfSSL 0:9d17e4342598 2760 int CyaSSL_CTX_DisableCRL(CYASSL_CTX* ctx)
wolfSSL 0:9d17e4342598 2761 {
wolfSSL 0:9d17e4342598 2762 CYASSL_ENTER("CyaSSL_CTX_DisableCRL");
wolfSSL 0:9d17e4342598 2763 if (ctx)
wolfSSL 0:9d17e4342598 2764 return CyaSSL_CertManagerDisableCRL(ctx->cm);
wolfSSL 0:9d17e4342598 2765 else
wolfSSL 0:9d17e4342598 2766 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 2767 }
wolfSSL 0:9d17e4342598 2768
wolfSSL 0:9d17e4342598 2769
wolfSSL 0:9d17e4342598 2770 int CyaSSL_CTX_LoadCRL(CYASSL_CTX* ctx, const char* path, int type, int monitor)
wolfSSL 0:9d17e4342598 2771 {
wolfSSL 0:9d17e4342598 2772 CYASSL_ENTER("CyaSSL_CTX_LoadCRL");
wolfSSL 0:9d17e4342598 2773 if (ctx)
wolfSSL 0:9d17e4342598 2774 return CyaSSL_CertManagerLoadCRL(ctx->cm, path, type, monitor);
wolfSSL 0:9d17e4342598 2775 else
wolfSSL 0:9d17e4342598 2776 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 2777 }
wolfSSL 0:9d17e4342598 2778
wolfSSL 0:9d17e4342598 2779
wolfSSL 0:9d17e4342598 2780 int CyaSSL_CTX_SetCRL_Cb(CYASSL_CTX* ctx, CbMissingCRL cb)
wolfSSL 0:9d17e4342598 2781 {
wolfSSL 0:9d17e4342598 2782 CYASSL_ENTER("CyaSSL_CTX_SetCRL_Cb");
wolfSSL 0:9d17e4342598 2783 if (ctx)
wolfSSL 0:9d17e4342598 2784 return CyaSSL_CertManagerSetCRL_Cb(ctx->cm, cb);
wolfSSL 0:9d17e4342598 2785 else
wolfSSL 0:9d17e4342598 2786 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 2787 }
wolfSSL 0:9d17e4342598 2788
wolfSSL 0:9d17e4342598 2789
wolfSSL 0:9d17e4342598 2790 #endif /* HAVE_CRL */
wolfSSL 0:9d17e4342598 2791
wolfSSL 0:9d17e4342598 2792
wolfSSL 0:9d17e4342598 2793 #ifdef HAVE_OCSP
wolfSSL 0:9d17e4342598 2794
wolfSSL 0:9d17e4342598 2795
wolfSSL 0:9d17e4342598 2796 /* check CRL if enabled, SSL_SUCCESS */
wolfSSL 0:9d17e4342598 2797 int CyaSSL_CertManagerCheckOCSP(CYASSL_CERT_MANAGER* cm, byte* der, int sz)
wolfSSL 0:9d17e4342598 2798 {
wolfSSL 0:9d17e4342598 2799 int ret;
wolfSSL 0:9d17e4342598 2800 DecodedCert cert;
wolfSSL 0:9d17e4342598 2801
wolfSSL 0:9d17e4342598 2802 CYASSL_ENTER("CyaSSL_CertManagerCheckOCSP");
wolfSSL 0:9d17e4342598 2803
wolfSSL 0:9d17e4342598 2804 if (cm == NULL)
wolfSSL 0:9d17e4342598 2805 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 2806
wolfSSL 0:9d17e4342598 2807 if (cm->ocspEnabled == 0)
wolfSSL 0:9d17e4342598 2808 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 2809
wolfSSL 0:9d17e4342598 2810 InitDecodedCert(&cert, der, sz, NULL);
wolfSSL 0:9d17e4342598 2811
wolfSSL 0:9d17e4342598 2812 ret = ParseCertRelative(&cert, CERT_TYPE, NO_VERIFY, cm);
wolfSSL 0:9d17e4342598 2813 if (ret != 0) {
wolfSSL 0:9d17e4342598 2814 CYASSL_MSG("ParseCert failed");
wolfSSL 0:9d17e4342598 2815 return ret;
wolfSSL 0:9d17e4342598 2816 }
wolfSSL 0:9d17e4342598 2817 else {
wolfSSL 0:9d17e4342598 2818 ret = CheckCertOCSP(cm->ocsp, &cert);
wolfSSL 0:9d17e4342598 2819 if (ret != 0) {
wolfSSL 0:9d17e4342598 2820 CYASSL_MSG("CheckCertOCSP failed");
wolfSSL 0:9d17e4342598 2821 }
wolfSSL 0:9d17e4342598 2822 }
wolfSSL 0:9d17e4342598 2823
wolfSSL 0:9d17e4342598 2824 FreeDecodedCert(&cert);
wolfSSL 0:9d17e4342598 2825
wolfSSL 0:9d17e4342598 2826 if (ret == 0)
wolfSSL 0:9d17e4342598 2827 return SSL_SUCCESS; /* convert */
wolfSSL 0:9d17e4342598 2828
wolfSSL 0:9d17e4342598 2829 return ret;
wolfSSL 0:9d17e4342598 2830 }
wolfSSL 0:9d17e4342598 2831
wolfSSL 0:9d17e4342598 2832
wolfSSL 0:9d17e4342598 2833 int CyaSSL_CertManagerSetOCSPOverrideURL(CYASSL_CERT_MANAGER* cm,
wolfSSL 0:9d17e4342598 2834 const char* url)
wolfSSL 0:9d17e4342598 2835 {
wolfSSL 0:9d17e4342598 2836 CYASSL_ENTER("CyaSSL_CertManagerSetOCSPOverrideURL");
wolfSSL 0:9d17e4342598 2837 if (cm == NULL)
wolfSSL 0:9d17e4342598 2838 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 2839
wolfSSL 0:9d17e4342598 2840 XFREE(cm->ocspOverrideURL, cm->heap, 0);
wolfSSL 0:9d17e4342598 2841 if (url != NULL) {
wolfSSL 0:9d17e4342598 2842 int urlSz = (int)XSTRLEN(url) + 1;
wolfSSL 0:9d17e4342598 2843 cm->ocspOverrideURL = (char*)XMALLOC(urlSz, cm->heap, 0);
wolfSSL 0:9d17e4342598 2844 if (cm->ocspOverrideURL != NULL) {
wolfSSL 0:9d17e4342598 2845 XMEMCPY(cm->ocspOverrideURL, url, urlSz);
wolfSSL 0:9d17e4342598 2846 }
wolfSSL 0:9d17e4342598 2847 else
wolfSSL 0:9d17e4342598 2848 return MEMORY_E;
wolfSSL 0:9d17e4342598 2849 }
wolfSSL 0:9d17e4342598 2850 else
wolfSSL 0:9d17e4342598 2851 cm->ocspOverrideURL = NULL;
wolfSSL 0:9d17e4342598 2852
wolfSSL 0:9d17e4342598 2853 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 2854 }
wolfSSL 0:9d17e4342598 2855
wolfSSL 0:9d17e4342598 2856
wolfSSL 0:9d17e4342598 2857 int CyaSSL_CertManagerSetOCSP_Cb(CYASSL_CERT_MANAGER* cm,
wolfSSL 0:9d17e4342598 2858 CbOCSPIO ioCb, CbOCSPRespFree respFreeCb, void* ioCbCtx)
wolfSSL 0:9d17e4342598 2859 {
wolfSSL 0:9d17e4342598 2860 CYASSL_ENTER("CyaSSL_CertManagerSetOCSP_Cb");
wolfSSL 0:9d17e4342598 2861 if (cm == NULL)
wolfSSL 0:9d17e4342598 2862 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 2863
wolfSSL 0:9d17e4342598 2864 cm->ocspIOCb = ioCb;
wolfSSL 0:9d17e4342598 2865 cm->ocspRespFreeCb = respFreeCb;
wolfSSL 0:9d17e4342598 2866 cm->ocspIOCtx = ioCbCtx;
wolfSSL 0:9d17e4342598 2867
wolfSSL 0:9d17e4342598 2868 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 2869 }
wolfSSL 0:9d17e4342598 2870
wolfSSL 0:9d17e4342598 2871
wolfSSL 0:9d17e4342598 2872 int CyaSSL_EnableOCSP(CYASSL* ssl, int options)
wolfSSL 0:9d17e4342598 2873 {
wolfSSL 0:9d17e4342598 2874 CYASSL_ENTER("CyaSSL_EnableOCSP");
wolfSSL 0:9d17e4342598 2875 if (ssl)
wolfSSL 0:9d17e4342598 2876 return CyaSSL_CertManagerEnableOCSP(ssl->ctx->cm, options);
wolfSSL 0:9d17e4342598 2877 else
wolfSSL 0:9d17e4342598 2878 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 2879 }
wolfSSL 0:9d17e4342598 2880
wolfSSL 0:9d17e4342598 2881
wolfSSL 0:9d17e4342598 2882 int CyaSSL_DisableOCSP(CYASSL* ssl)
wolfSSL 0:9d17e4342598 2883 {
wolfSSL 0:9d17e4342598 2884 CYASSL_ENTER("CyaSSL_DisableOCSP");
wolfSSL 0:9d17e4342598 2885 if (ssl)
wolfSSL 0:9d17e4342598 2886 return CyaSSL_CertManagerDisableOCSP(ssl->ctx->cm);
wolfSSL 0:9d17e4342598 2887 else
wolfSSL 0:9d17e4342598 2888 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 2889 }
wolfSSL 0:9d17e4342598 2890
wolfSSL 0:9d17e4342598 2891
wolfSSL 0:9d17e4342598 2892 int CyaSSL_SetOCSP_OverrideURL(CYASSL* ssl, const char* url)
wolfSSL 0:9d17e4342598 2893 {
wolfSSL 0:9d17e4342598 2894 CYASSL_ENTER("CyaSSL_SetOCSP_OverrideURL");
wolfSSL 0:9d17e4342598 2895 if (ssl)
wolfSSL 0:9d17e4342598 2896 return CyaSSL_CertManagerSetOCSPOverrideURL(ssl->ctx->cm, url);
wolfSSL 0:9d17e4342598 2897 else
wolfSSL 0:9d17e4342598 2898 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 2899 }
wolfSSL 0:9d17e4342598 2900
wolfSSL 0:9d17e4342598 2901
wolfSSL 0:9d17e4342598 2902 int CyaSSL_SetOCSP_Cb(CYASSL* ssl,
wolfSSL 0:9d17e4342598 2903 CbOCSPIO ioCb, CbOCSPRespFree respFreeCb, void* ioCbCtx)
wolfSSL 0:9d17e4342598 2904 {
wolfSSL 0:9d17e4342598 2905 CYASSL_ENTER("CyaSSL_SetOCSP_Cb");
wolfSSL 0:9d17e4342598 2906 if (ssl)
wolfSSL 0:9d17e4342598 2907 return CyaSSL_CertManagerSetOCSP_Cb(ssl->ctx->cm,
wolfSSL 0:9d17e4342598 2908 ioCb, respFreeCb, ioCbCtx);
wolfSSL 0:9d17e4342598 2909 else
wolfSSL 0:9d17e4342598 2910 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 2911 }
wolfSSL 0:9d17e4342598 2912
wolfSSL 0:9d17e4342598 2913
wolfSSL 0:9d17e4342598 2914 int CyaSSL_CTX_EnableOCSP(CYASSL_CTX* ctx, int options)
wolfSSL 0:9d17e4342598 2915 {
wolfSSL 0:9d17e4342598 2916 CYASSL_ENTER("CyaSSL_CTX_EnableOCSP");
wolfSSL 0:9d17e4342598 2917 if (ctx)
wolfSSL 0:9d17e4342598 2918 return CyaSSL_CertManagerEnableOCSP(ctx->cm, options);
wolfSSL 0:9d17e4342598 2919 else
wolfSSL 0:9d17e4342598 2920 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 2921 }
wolfSSL 0:9d17e4342598 2922
wolfSSL 0:9d17e4342598 2923
wolfSSL 0:9d17e4342598 2924 int CyaSSL_CTX_DisableOCSP(CYASSL_CTX* ctx)
wolfSSL 0:9d17e4342598 2925 {
wolfSSL 0:9d17e4342598 2926 CYASSL_ENTER("CyaSSL_CTX_DisableOCSP");
wolfSSL 0:9d17e4342598 2927 if (ctx)
wolfSSL 0:9d17e4342598 2928 return CyaSSL_CertManagerDisableOCSP(ctx->cm);
wolfSSL 0:9d17e4342598 2929 else
wolfSSL 0:9d17e4342598 2930 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 2931 }
wolfSSL 0:9d17e4342598 2932
wolfSSL 0:9d17e4342598 2933
wolfSSL 0:9d17e4342598 2934 int CyaSSL_CTX_SetOCSP_OverrideURL(CYASSL_CTX* ctx, const char* url)
wolfSSL 0:9d17e4342598 2935 {
wolfSSL 0:9d17e4342598 2936 CYASSL_ENTER("CyaSSL_SetOCSP_OverrideURL");
wolfSSL 0:9d17e4342598 2937 if (ctx)
wolfSSL 0:9d17e4342598 2938 return CyaSSL_CertManagerSetOCSPOverrideURL(ctx->cm, url);
wolfSSL 0:9d17e4342598 2939 else
wolfSSL 0:9d17e4342598 2940 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 2941 }
wolfSSL 0:9d17e4342598 2942
wolfSSL 0:9d17e4342598 2943
wolfSSL 0:9d17e4342598 2944 int CyaSSL_CTX_SetOCSP_Cb(CYASSL_CTX* ctx,
wolfSSL 0:9d17e4342598 2945 CbOCSPIO ioCb, CbOCSPRespFree respFreeCb, void* ioCbCtx)
wolfSSL 0:9d17e4342598 2946 {
wolfSSL 0:9d17e4342598 2947 CYASSL_ENTER("CyaSSL_CTX_SetOCSP_Cb");
wolfSSL 0:9d17e4342598 2948 if (ctx)
wolfSSL 0:9d17e4342598 2949 return CyaSSL_CertManagerSetOCSP_Cb(ctx->cm, ioCb, respFreeCb, ioCbCtx);
wolfSSL 0:9d17e4342598 2950 else
wolfSSL 0:9d17e4342598 2951 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 2952 }
wolfSSL 0:9d17e4342598 2953
wolfSSL 0:9d17e4342598 2954
wolfSSL 0:9d17e4342598 2955 #endif /* HAVE_OCSP */
wolfSSL 0:9d17e4342598 2956
wolfSSL 0:9d17e4342598 2957
wolfSSL 0:9d17e4342598 2958 #ifdef CYASSL_DER_LOAD
wolfSSL 0:9d17e4342598 2959
wolfSSL 0:9d17e4342598 2960 /* Add format parameter to allow DER load of CA files */
wolfSSL 0:9d17e4342598 2961 int CyaSSL_CTX_der_load_verify_locations(CYASSL_CTX* ctx, const char* file,
wolfSSL 0:9d17e4342598 2962 int format)
wolfSSL 0:9d17e4342598 2963 {
wolfSSL 0:9d17e4342598 2964 CYASSL_ENTER("CyaSSL_CTX_der_load_verify_locations");
wolfSSL 0:9d17e4342598 2965 if (ctx == NULL || file == NULL)
wolfSSL 0:9d17e4342598 2966 return SSL_FAILURE;
wolfSSL 0:9d17e4342598 2967
wolfSSL 0:9d17e4342598 2968 if (ProcessFile(ctx, file, format, CA_TYPE, NULL, 0, NULL) == SSL_SUCCESS)
wolfSSL 0:9d17e4342598 2969 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 2970
wolfSSL 0:9d17e4342598 2971 return SSL_FAILURE;
wolfSSL 0:9d17e4342598 2972 }
wolfSSL 0:9d17e4342598 2973
wolfSSL 0:9d17e4342598 2974 #endif /* CYASSL_DER_LOAD */
wolfSSL 0:9d17e4342598 2975
wolfSSL 0:9d17e4342598 2976
wolfSSL 0:9d17e4342598 2977 #ifdef CYASSL_CERT_GEN
wolfSSL 0:9d17e4342598 2978
wolfSSL 0:9d17e4342598 2979 /* load pem cert from file into der buffer, return der size or error */
wolfSSL 0:9d17e4342598 2980 int CyaSSL_PemCertToDer(const char* fileName, unsigned char* derBuf, int derSz)
wolfSSL 0:9d17e4342598 2981 {
wolfSSL 0:9d17e4342598 2982 byte staticBuffer[FILE_BUFFER_SIZE];
wolfSSL 0:9d17e4342598 2983 byte* fileBuf = staticBuffer;
wolfSSL 0:9d17e4342598 2984 int dynamic = 0;
wolfSSL 0:9d17e4342598 2985 int ret;
wolfSSL 0:9d17e4342598 2986 int ecc = 0;
wolfSSL 0:9d17e4342598 2987 long sz = 0;
wolfSSL 0:9d17e4342598 2988 XFILE file = XFOPEN(fileName, "rb");
wolfSSL 0:9d17e4342598 2989 EncryptedInfo info;
wolfSSL 0:9d17e4342598 2990 buffer converted;
wolfSSL 0:9d17e4342598 2991
wolfSSL 0:9d17e4342598 2992 CYASSL_ENTER("CyaSSL_PemCertToDer");
wolfSSL 0:9d17e4342598 2993 converted.buffer = 0;
wolfSSL 0:9d17e4342598 2994
wolfSSL 0:9d17e4342598 2995 if (file == XBADFILE) return SSL_BAD_FILE;
wolfSSL 0:9d17e4342598 2996 XFSEEK(file, 0, XSEEK_END);
wolfSSL 0:9d17e4342598 2997 sz = XFTELL(file);
wolfSSL 0:9d17e4342598 2998 XREWIND(file);
wolfSSL 0:9d17e4342598 2999
wolfSSL 0:9d17e4342598 3000 if (sz > (long)sizeof(staticBuffer)) {
wolfSSL 0:9d17e4342598 3001 fileBuf = (byte*) XMALLOC(sz, 0, DYNAMIC_TYPE_FILE);
wolfSSL 0:9d17e4342598 3002 if (fileBuf == NULL) {
wolfSSL 0:9d17e4342598 3003 XFCLOSE(file);
wolfSSL 0:9d17e4342598 3004 return SSL_BAD_FILE;
wolfSSL 0:9d17e4342598 3005 }
wolfSSL 0:9d17e4342598 3006 dynamic = 1;
wolfSSL 0:9d17e4342598 3007 }
wolfSSL 0:9d17e4342598 3008 else if (sz < 0) {
wolfSSL 0:9d17e4342598 3009 XFCLOSE(file);
wolfSSL 0:9d17e4342598 3010 return SSL_BAD_FILE;
wolfSSL 0:9d17e4342598 3011 }
wolfSSL 0:9d17e4342598 3012
wolfSSL 0:9d17e4342598 3013 if ( (ret = (int)XFREAD(fileBuf, sz, 1, file)) < 0)
wolfSSL 0:9d17e4342598 3014 ret = SSL_BAD_FILE;
wolfSSL 0:9d17e4342598 3015 else
wolfSSL 0:9d17e4342598 3016 ret = PemToDer(fileBuf, sz, CA_TYPE, &converted, 0, &info, &ecc);
wolfSSL 0:9d17e4342598 3017
wolfSSL 0:9d17e4342598 3018 if (ret == 0) {
wolfSSL 0:9d17e4342598 3019 if (converted.length < (word32)derSz) {
wolfSSL 0:9d17e4342598 3020 XMEMCPY(derBuf, converted.buffer, converted.length);
wolfSSL 0:9d17e4342598 3021 ret = converted.length;
wolfSSL 0:9d17e4342598 3022 }
wolfSSL 0:9d17e4342598 3023 else
wolfSSL 0:9d17e4342598 3024 ret = BUFFER_E;
wolfSSL 0:9d17e4342598 3025 }
wolfSSL 0:9d17e4342598 3026
wolfSSL 0:9d17e4342598 3027 XFREE(converted.buffer, 0, DYNAMIC_TYPE_CA);
wolfSSL 0:9d17e4342598 3028 if (dynamic)
wolfSSL 0:9d17e4342598 3029 XFREE(fileBuf, 0, DYNAMIC_TYPE_FILE);
wolfSSL 0:9d17e4342598 3030 XFCLOSE(file);
wolfSSL 0:9d17e4342598 3031
wolfSSL 0:9d17e4342598 3032 return ret;
wolfSSL 0:9d17e4342598 3033 }
wolfSSL 0:9d17e4342598 3034
wolfSSL 0:9d17e4342598 3035 #endif /* CYASSL_CERT_GEN */
wolfSSL 0:9d17e4342598 3036
wolfSSL 0:9d17e4342598 3037
wolfSSL 0:9d17e4342598 3038 int CyaSSL_CTX_use_certificate_file(CYASSL_CTX* ctx, const char* file,
wolfSSL 0:9d17e4342598 3039 int format)
wolfSSL 0:9d17e4342598 3040 {
wolfSSL 0:9d17e4342598 3041 CYASSL_ENTER("CyaSSL_CTX_use_certificate_file");
wolfSSL 0:9d17e4342598 3042 if (ProcessFile(ctx, file, format, CERT_TYPE, NULL, 0, NULL) == SSL_SUCCESS)
wolfSSL 0:9d17e4342598 3043 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 3044
wolfSSL 0:9d17e4342598 3045 return SSL_FAILURE;
wolfSSL 0:9d17e4342598 3046 }
wolfSSL 0:9d17e4342598 3047
wolfSSL 0:9d17e4342598 3048
wolfSSL 0:9d17e4342598 3049 int CyaSSL_CTX_use_PrivateKey_file(CYASSL_CTX* ctx, const char* file,int format)
wolfSSL 0:9d17e4342598 3050 {
wolfSSL 0:9d17e4342598 3051 CYASSL_ENTER("CyaSSL_CTX_use_PrivateKey_file");
wolfSSL 0:9d17e4342598 3052 if (ProcessFile(ctx, file, format, PRIVATEKEY_TYPE, NULL, 0, NULL)
wolfSSL 0:9d17e4342598 3053 == SSL_SUCCESS)
wolfSSL 0:9d17e4342598 3054 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 3055
wolfSSL 0:9d17e4342598 3056 return SSL_FAILURE;
wolfSSL 0:9d17e4342598 3057 }
wolfSSL 0:9d17e4342598 3058
wolfSSL 0:9d17e4342598 3059
wolfSSL 0:9d17e4342598 3060 int CyaSSL_CTX_use_certificate_chain_file(CYASSL_CTX* ctx, const char* file)
wolfSSL 0:9d17e4342598 3061 {
wolfSSL 0:9d17e4342598 3062 /* procces up to MAX_CHAIN_DEPTH plus subject cert */
wolfSSL 0:9d17e4342598 3063 CYASSL_ENTER("CyaSSL_CTX_use_certificate_chain_file");
wolfSSL 0:9d17e4342598 3064 if (ProcessFile(ctx, file, SSL_FILETYPE_PEM,CERT_TYPE,NULL,1, NULL)
wolfSSL 0:9d17e4342598 3065 == SSL_SUCCESS)
wolfSSL 0:9d17e4342598 3066 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 3067
wolfSSL 0:9d17e4342598 3068 return SSL_FAILURE;
wolfSSL 0:9d17e4342598 3069 }
wolfSSL 0:9d17e4342598 3070
wolfSSL 0:9d17e4342598 3071
wolfSSL 0:9d17e4342598 3072 #ifdef OPENSSL_EXTRA
wolfSSL 0:9d17e4342598 3073 /* put SSL type in extra for now, not very common */
wolfSSL 0:9d17e4342598 3074
wolfSSL 0:9d17e4342598 3075 int CyaSSL_use_certificate_file(CYASSL* ssl, const char* file, int format)
wolfSSL 0:9d17e4342598 3076 {
wolfSSL 0:9d17e4342598 3077 CYASSL_ENTER("CyaSSL_use_certificate_file");
wolfSSL 0:9d17e4342598 3078 if (ProcessFile(ssl->ctx, file, format, CERT_TYPE, ssl, 0, NULL)
wolfSSL 0:9d17e4342598 3079 == SSL_SUCCESS)
wolfSSL 0:9d17e4342598 3080 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 3081
wolfSSL 0:9d17e4342598 3082 return SSL_FAILURE;
wolfSSL 0:9d17e4342598 3083 }
wolfSSL 0:9d17e4342598 3084
wolfSSL 0:9d17e4342598 3085
wolfSSL 0:9d17e4342598 3086 int CyaSSL_use_PrivateKey_file(CYASSL* ssl, const char* file, int format)
wolfSSL 0:9d17e4342598 3087 {
wolfSSL 0:9d17e4342598 3088 CYASSL_ENTER("CyaSSL_use_PrivateKey_file");
wolfSSL 0:9d17e4342598 3089 if (ProcessFile(ssl->ctx, file, format, PRIVATEKEY_TYPE, ssl, 0, NULL)
wolfSSL 0:9d17e4342598 3090 == SSL_SUCCESS)
wolfSSL 0:9d17e4342598 3091 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 3092
wolfSSL 0:9d17e4342598 3093 return SSL_FAILURE;
wolfSSL 0:9d17e4342598 3094 }
wolfSSL 0:9d17e4342598 3095
wolfSSL 0:9d17e4342598 3096
wolfSSL 0:9d17e4342598 3097 int CyaSSL_use_certificate_chain_file(CYASSL* ssl, const char* file)
wolfSSL 0:9d17e4342598 3098 {
wolfSSL 0:9d17e4342598 3099 /* procces up to MAX_CHAIN_DEPTH plus subject cert */
wolfSSL 0:9d17e4342598 3100 CYASSL_ENTER("CyaSSL_use_certificate_chain_file");
wolfSSL 0:9d17e4342598 3101 if (ProcessFile(ssl->ctx, file, SSL_FILETYPE_PEM, CERT_TYPE, ssl, 1, NULL)
wolfSSL 0:9d17e4342598 3102 == SSL_SUCCESS)
wolfSSL 0:9d17e4342598 3103 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 3104
wolfSSL 0:9d17e4342598 3105 return SSL_FAILURE;
wolfSSL 0:9d17e4342598 3106 }
wolfSSL 0:9d17e4342598 3107
wolfSSL 0:9d17e4342598 3108
wolfSSL 0:9d17e4342598 3109 /* server wrapper for ctx or ssl Diffie-Hellman parameters */
wolfSSL 0:9d17e4342598 3110 static int CyaSSL_SetTmpDH_buffer_wrapper(CYASSL_CTX* ctx, CYASSL* ssl,
wolfSSL 0:9d17e4342598 3111 const unsigned char* buf, long sz, int format)
wolfSSL 0:9d17e4342598 3112 {
wolfSSL 0:9d17e4342598 3113 buffer der;
wolfSSL 0:9d17e4342598 3114 int ret;
wolfSSL 0:9d17e4342598 3115 int weOwnDer = 0;
wolfSSL 0:9d17e4342598 3116 byte p[MAX_DH_SIZE];
wolfSSL 0:9d17e4342598 3117 byte g[MAX_DH_SIZE];
wolfSSL 0:9d17e4342598 3118 word32 pSz = sizeof(p);
wolfSSL 0:9d17e4342598 3119 word32 gSz = sizeof(g);
wolfSSL 0:9d17e4342598 3120
wolfSSL 0:9d17e4342598 3121 der.buffer = (byte*)buf;
wolfSSL 0:9d17e4342598 3122 der.length = (word32)sz;
wolfSSL 0:9d17e4342598 3123
wolfSSL 0:9d17e4342598 3124 if (format != SSL_FILETYPE_ASN1 && format != SSL_FILETYPE_PEM)
wolfSSL 0:9d17e4342598 3125 return SSL_BAD_FILETYPE;
wolfSSL 0:9d17e4342598 3126
wolfSSL 0:9d17e4342598 3127 if (format == SSL_FILETYPE_PEM) {
wolfSSL 0:9d17e4342598 3128 der.buffer = NULL;
wolfSSL 0:9d17e4342598 3129 ret = PemToDer(buf, sz, DH_PARAM_TYPE, &der, ctx->heap, NULL,NULL);
wolfSSL 0:9d17e4342598 3130 if (ret < 0) {
wolfSSL 0:9d17e4342598 3131 XFREE(der.buffer, ctx->heap, DYNAMIC_TYPE_KEY);
wolfSSL 0:9d17e4342598 3132 return ret;
wolfSSL 0:9d17e4342598 3133 }
wolfSSL 0:9d17e4342598 3134 weOwnDer = 1;
wolfSSL 0:9d17e4342598 3135 }
wolfSSL 0:9d17e4342598 3136
wolfSSL 0:9d17e4342598 3137 if (DhParamsLoad(der.buffer, der.length, p, &pSz, g, &gSz) < 0)
wolfSSL 0:9d17e4342598 3138 ret = SSL_BAD_FILETYPE;
wolfSSL 0:9d17e4342598 3139 else {
wolfSSL 0:9d17e4342598 3140 if (ssl)
wolfSSL 0:9d17e4342598 3141 ret = CyaSSL_SetTmpDH(ssl, p, pSz, g, gSz);
wolfSSL 0:9d17e4342598 3142 else
wolfSSL 0:9d17e4342598 3143 ret = CyaSSL_CTX_SetTmpDH(ctx, p, pSz, g, gSz);
wolfSSL 0:9d17e4342598 3144 }
wolfSSL 0:9d17e4342598 3145
wolfSSL 0:9d17e4342598 3146 if (weOwnDer)
wolfSSL 0:9d17e4342598 3147 XFREE(der.buffer, ctx->heap, DYNAMIC_TYPE_KEY);
wolfSSL 0:9d17e4342598 3148
wolfSSL 0:9d17e4342598 3149 return ret;
wolfSSL 0:9d17e4342598 3150 }
wolfSSL 0:9d17e4342598 3151
wolfSSL 0:9d17e4342598 3152 /* server Diffie-Hellman parameters, SSL_SUCCESS on ok */
wolfSSL 0:9d17e4342598 3153 int CyaSSL_SetTmpDH_buffer(CYASSL* ssl, const unsigned char* buf, long sz,
wolfSSL 0:9d17e4342598 3154 int format)
wolfSSL 0:9d17e4342598 3155 {
wolfSSL 0:9d17e4342598 3156 return CyaSSL_SetTmpDH_buffer_wrapper(ssl->ctx, ssl, buf, sz, format);
wolfSSL 0:9d17e4342598 3157 }
wolfSSL 0:9d17e4342598 3158
wolfSSL 0:9d17e4342598 3159
wolfSSL 0:9d17e4342598 3160 /* server ctx Diffie-Hellman parameters, SSL_SUCCESS on ok */
wolfSSL 0:9d17e4342598 3161 int CyaSSL_CTX_SetTmpDH_buffer(CYASSL_CTX* ctx, const unsigned char* buf,
wolfSSL 0:9d17e4342598 3162 long sz, int format)
wolfSSL 0:9d17e4342598 3163 {
wolfSSL 0:9d17e4342598 3164 return CyaSSL_SetTmpDH_buffer_wrapper(ctx, NULL, buf, sz, format);
wolfSSL 0:9d17e4342598 3165 }
wolfSSL 0:9d17e4342598 3166
wolfSSL 0:9d17e4342598 3167
wolfSSL 0:9d17e4342598 3168 #ifdef HAVE_ECC
wolfSSL 0:9d17e4342598 3169
wolfSSL 0:9d17e4342598 3170 /* Set Temp CTX EC-DHE size in octets, should be 20 - 66 for 160 - 521 bit */
wolfSSL 0:9d17e4342598 3171 int CyaSSL_CTX_SetTmpEC_DHE_Sz(CYASSL_CTX* ctx, word16 sz)
wolfSSL 0:9d17e4342598 3172 {
wolfSSL 0:9d17e4342598 3173 if (ctx == NULL || sz < ECC_MINSIZE || sz > ECC_MAXSIZE)
wolfSSL 0:9d17e4342598 3174 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 3175
wolfSSL 0:9d17e4342598 3176 ctx->eccTempKeySz = sz;
wolfSSL 0:9d17e4342598 3177
wolfSSL 0:9d17e4342598 3178 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 3179 }
wolfSSL 0:9d17e4342598 3180
wolfSSL 0:9d17e4342598 3181
wolfSSL 0:9d17e4342598 3182 /* Set Temp SSL EC-DHE size in octets, should be 20 - 66 for 160 - 521 bit */
wolfSSL 0:9d17e4342598 3183 int CyaSSL_SetTmpEC_DHE_Sz(CYASSL* ssl, word16 sz)
wolfSSL 0:9d17e4342598 3184 {
wolfSSL 0:9d17e4342598 3185 if (ssl == NULL || sz < ECC_MINSIZE || sz > ECC_MAXSIZE)
wolfSSL 0:9d17e4342598 3186 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 3187
wolfSSL 0:9d17e4342598 3188 ssl->eccTempKeySz = sz;
wolfSSL 0:9d17e4342598 3189
wolfSSL 0:9d17e4342598 3190 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 3191 }
wolfSSL 0:9d17e4342598 3192
wolfSSL 0:9d17e4342598 3193 #endif /* HAVE_ECC */
wolfSSL 0:9d17e4342598 3194
wolfSSL 0:9d17e4342598 3195
wolfSSL 0:9d17e4342598 3196 #if !defined(NO_FILESYSTEM)
wolfSSL 0:9d17e4342598 3197
wolfSSL 0:9d17e4342598 3198 /* server Diffie-Hellman parameters */
wolfSSL 0:9d17e4342598 3199 static int CyaSSL_SetTmpDH_file_wrapper(CYASSL_CTX* ctx, CYASSL* ssl,
wolfSSL 0:9d17e4342598 3200 const char* fname, int format)
wolfSSL 0:9d17e4342598 3201 {
wolfSSL 0:9d17e4342598 3202 byte staticBuffer[FILE_BUFFER_SIZE];
wolfSSL 0:9d17e4342598 3203 byte* myBuffer = staticBuffer;
wolfSSL 0:9d17e4342598 3204 int dynamic = 0;
wolfSSL 0:9d17e4342598 3205 int ret;
wolfSSL 0:9d17e4342598 3206 long sz = 0;
wolfSSL 0:9d17e4342598 3207 XFILE file = XFOPEN(fname, "rb");
wolfSSL 0:9d17e4342598 3208
wolfSSL 0:9d17e4342598 3209 if (file == XBADFILE) return SSL_BAD_FILE;
wolfSSL 0:9d17e4342598 3210 XFSEEK(file, 0, XSEEK_END);
wolfSSL 0:9d17e4342598 3211 sz = XFTELL(file);
wolfSSL 0:9d17e4342598 3212 XREWIND(file);
wolfSSL 0:9d17e4342598 3213
wolfSSL 0:9d17e4342598 3214 if (sz > (long)sizeof(staticBuffer)) {
wolfSSL 0:9d17e4342598 3215 CYASSL_MSG("Getting dynamic buffer");
wolfSSL 0:9d17e4342598 3216 myBuffer = (byte*) XMALLOC(sz, ctx->heap, DYNAMIC_TYPE_FILE);
wolfSSL 0:9d17e4342598 3217 if (myBuffer == NULL) {
wolfSSL 0:9d17e4342598 3218 XFCLOSE(file);
wolfSSL 0:9d17e4342598 3219 return SSL_BAD_FILE;
wolfSSL 0:9d17e4342598 3220 }
wolfSSL 0:9d17e4342598 3221 dynamic = 1;
wolfSSL 0:9d17e4342598 3222 }
wolfSSL 0:9d17e4342598 3223 else if (sz < 0) {
wolfSSL 0:9d17e4342598 3224 XFCLOSE(file);
wolfSSL 0:9d17e4342598 3225 return SSL_BAD_FILE;
wolfSSL 0:9d17e4342598 3226 }
wolfSSL 0:9d17e4342598 3227
wolfSSL 0:9d17e4342598 3228 if ( (ret = (int)XFREAD(myBuffer, sz, 1, file)) < 0)
wolfSSL 0:9d17e4342598 3229 ret = SSL_BAD_FILE;
wolfSSL 0:9d17e4342598 3230 else {
wolfSSL 0:9d17e4342598 3231 if (ssl)
wolfSSL 0:9d17e4342598 3232 ret = CyaSSL_SetTmpDH_buffer(ssl, myBuffer, sz, format);
wolfSSL 0:9d17e4342598 3233 else
wolfSSL 0:9d17e4342598 3234 ret = CyaSSL_CTX_SetTmpDH_buffer(ctx, myBuffer, sz, format);
wolfSSL 0:9d17e4342598 3235 }
wolfSSL 0:9d17e4342598 3236
wolfSSL 0:9d17e4342598 3237 XFCLOSE(file);
wolfSSL 0:9d17e4342598 3238 if (dynamic) XFREE(myBuffer, ctx->heap, DYNAMIC_TYPE_FILE);
wolfSSL 0:9d17e4342598 3239
wolfSSL 0:9d17e4342598 3240 return ret;
wolfSSL 0:9d17e4342598 3241 }
wolfSSL 0:9d17e4342598 3242
wolfSSL 0:9d17e4342598 3243 /* server Diffie-Hellman parameters */
wolfSSL 0:9d17e4342598 3244 int CyaSSL_SetTmpDH_file(CYASSL* ssl, const char* fname, int format)
wolfSSL 0:9d17e4342598 3245 {
wolfSSL 0:9d17e4342598 3246 return CyaSSL_SetTmpDH_file_wrapper(ssl->ctx, ssl, fname, format);
wolfSSL 0:9d17e4342598 3247 }
wolfSSL 0:9d17e4342598 3248
wolfSSL 0:9d17e4342598 3249
wolfSSL 0:9d17e4342598 3250 /* server Diffie-Hellman parameters */
wolfSSL 0:9d17e4342598 3251 int CyaSSL_CTX_SetTmpDH_file(CYASSL_CTX* ctx, const char* fname, int format)
wolfSSL 0:9d17e4342598 3252 {
wolfSSL 0:9d17e4342598 3253 return CyaSSL_SetTmpDH_file_wrapper(ctx, NULL, fname, format);
wolfSSL 0:9d17e4342598 3254 }
wolfSSL 0:9d17e4342598 3255
wolfSSL 0:9d17e4342598 3256
wolfSSL 0:9d17e4342598 3257 #endif /* !NO_FILESYSTEM */
wolfSSL 0:9d17e4342598 3258 #endif /* OPENSSL_EXTRA */
wolfSSL 0:9d17e4342598 3259
wolfSSL 0:9d17e4342598 3260 #ifdef HAVE_NTRU
wolfSSL 0:9d17e4342598 3261
wolfSSL 0:9d17e4342598 3262 int CyaSSL_CTX_use_NTRUPrivateKey_file(CYASSL_CTX* ctx, const char* file)
wolfSSL 0:9d17e4342598 3263 {
wolfSSL 0:9d17e4342598 3264 CYASSL_ENTER("CyaSSL_CTX_use_NTRUPrivateKey_file");
wolfSSL 0:9d17e4342598 3265 if (ProcessFile(ctx, file, SSL_FILETYPE_RAW, PRIVATEKEY_TYPE, NULL, 0, NULL)
wolfSSL 0:9d17e4342598 3266 == SSL_SUCCESS) {
wolfSSL 0:9d17e4342598 3267 ctx->haveNTRU = 1;
wolfSSL 0:9d17e4342598 3268 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 3269 }
wolfSSL 0:9d17e4342598 3270
wolfSSL 0:9d17e4342598 3271 return SSL_FAILURE;
wolfSSL 0:9d17e4342598 3272 }
wolfSSL 0:9d17e4342598 3273
wolfSSL 0:9d17e4342598 3274 #endif /* HAVE_NTRU */
wolfSSL 0:9d17e4342598 3275
wolfSSL 0:9d17e4342598 3276
wolfSSL 0:9d17e4342598 3277
wolfSSL 0:9d17e4342598 3278 #if defined(OPENSSL_EXTRA)
wolfSSL 0:9d17e4342598 3279
wolfSSL 0:9d17e4342598 3280 int CyaSSL_CTX_use_RSAPrivateKey_file(CYASSL_CTX* ctx,const char* file,
wolfSSL 0:9d17e4342598 3281 int format)
wolfSSL 0:9d17e4342598 3282 {
wolfSSL 0:9d17e4342598 3283 CYASSL_ENTER("SSL_CTX_use_RSAPrivateKey_file");
wolfSSL 0:9d17e4342598 3284
wolfSSL 0:9d17e4342598 3285 return CyaSSL_CTX_use_PrivateKey_file(ctx, file, format);
wolfSSL 0:9d17e4342598 3286 }
wolfSSL 0:9d17e4342598 3287
wolfSSL 0:9d17e4342598 3288 int CyaSSL_use_RSAPrivateKey_file(CYASSL* ssl, const char* file, int format)
wolfSSL 0:9d17e4342598 3289 {
wolfSSL 0:9d17e4342598 3290 CYASSL_ENTER("CyaSSL_use_RSAPrivateKey_file");
wolfSSL 0:9d17e4342598 3291
wolfSSL 0:9d17e4342598 3292 return CyaSSL_use_PrivateKey_file(ssl, file, format);
wolfSSL 0:9d17e4342598 3293 }
wolfSSL 0:9d17e4342598 3294
wolfSSL 0:9d17e4342598 3295 #endif /* OPENSSL_EXTRA */
wolfSSL 0:9d17e4342598 3296
wolfSSL 0:9d17e4342598 3297 #endif /* NO_FILESYSTEM */
wolfSSL 0:9d17e4342598 3298
wolfSSL 0:9d17e4342598 3299
wolfSSL 0:9d17e4342598 3300 void CyaSSL_CTX_set_verify(CYASSL_CTX* ctx, int mode, VerifyCallback vc)
wolfSSL 0:9d17e4342598 3301 {
wolfSSL 0:9d17e4342598 3302 CYASSL_ENTER("CyaSSL_CTX_set_verify");
wolfSSL 0:9d17e4342598 3303 if (mode & SSL_VERIFY_PEER) {
wolfSSL 0:9d17e4342598 3304 ctx->verifyPeer = 1;
wolfSSL 0:9d17e4342598 3305 ctx->verifyNone = 0; /* in case perviously set */
wolfSSL 0:9d17e4342598 3306 }
wolfSSL 0:9d17e4342598 3307
wolfSSL 0:9d17e4342598 3308 if (mode == SSL_VERIFY_NONE) {
wolfSSL 0:9d17e4342598 3309 ctx->verifyNone = 1;
wolfSSL 0:9d17e4342598 3310 ctx->verifyPeer = 0; /* in case previously set */
wolfSSL 0:9d17e4342598 3311 }
wolfSSL 0:9d17e4342598 3312
wolfSSL 0:9d17e4342598 3313 if (mode & SSL_VERIFY_FAIL_IF_NO_PEER_CERT)
wolfSSL 0:9d17e4342598 3314 ctx->failNoCert = 1;
wolfSSL 0:9d17e4342598 3315
wolfSSL 0:9d17e4342598 3316 ctx->verifyCallback = vc;
wolfSSL 0:9d17e4342598 3317 }
wolfSSL 0:9d17e4342598 3318
wolfSSL 0:9d17e4342598 3319
wolfSSL 0:9d17e4342598 3320 void CyaSSL_set_verify(CYASSL* ssl, int mode, VerifyCallback vc)
wolfSSL 0:9d17e4342598 3321 {
wolfSSL 0:9d17e4342598 3322 CYASSL_ENTER("CyaSSL_set_verify");
wolfSSL 0:9d17e4342598 3323 if (mode & SSL_VERIFY_PEER) {
wolfSSL 0:9d17e4342598 3324 ssl->options.verifyPeer = 1;
wolfSSL 0:9d17e4342598 3325 ssl->options.verifyNone = 0; /* in case perviously set */
wolfSSL 0:9d17e4342598 3326 }
wolfSSL 0:9d17e4342598 3327
wolfSSL 0:9d17e4342598 3328 if (mode == SSL_VERIFY_NONE) {
wolfSSL 0:9d17e4342598 3329 ssl->options.verifyNone = 1;
wolfSSL 0:9d17e4342598 3330 ssl->options.verifyPeer = 0; /* in case previously set */
wolfSSL 0:9d17e4342598 3331 }
wolfSSL 0:9d17e4342598 3332
wolfSSL 0:9d17e4342598 3333 if (mode & SSL_VERIFY_FAIL_IF_NO_PEER_CERT)
wolfSSL 0:9d17e4342598 3334 ssl->options.failNoCert = 1;
wolfSSL 0:9d17e4342598 3335
wolfSSL 0:9d17e4342598 3336 ssl->verifyCallback = vc;
wolfSSL 0:9d17e4342598 3337 }
wolfSSL 0:9d17e4342598 3338
wolfSSL 0:9d17e4342598 3339
wolfSSL 0:9d17e4342598 3340 /* store user ctx for verify callback */
wolfSSL 0:9d17e4342598 3341 void CyaSSL_SetCertCbCtx(CYASSL* ssl, void* ctx)
wolfSSL 0:9d17e4342598 3342 {
wolfSSL 0:9d17e4342598 3343 CYASSL_ENTER("CyaSSL_SetCertCbCtx");
wolfSSL 0:9d17e4342598 3344 if (ssl)
wolfSSL 0:9d17e4342598 3345 ssl->verifyCbCtx = ctx;
wolfSSL 0:9d17e4342598 3346 }
wolfSSL 0:9d17e4342598 3347
wolfSSL 0:9d17e4342598 3348
wolfSSL 0:9d17e4342598 3349 /* store context CA Cache addition callback */
wolfSSL 0:9d17e4342598 3350 void CyaSSL_CTX_SetCACb(CYASSL_CTX* ctx, CallbackCACache cb)
wolfSSL 0:9d17e4342598 3351 {
wolfSSL 0:9d17e4342598 3352 if (ctx && ctx->cm)
wolfSSL 0:9d17e4342598 3353 ctx->cm->caCacheCallback = cb;
wolfSSL 0:9d17e4342598 3354 }
wolfSSL 0:9d17e4342598 3355
wolfSSL 0:9d17e4342598 3356
wolfSSL 0:9d17e4342598 3357 #if defined(PERSIST_CERT_CACHE)
wolfSSL 0:9d17e4342598 3358
wolfSSL 0:9d17e4342598 3359 #if !defined(NO_FILESYSTEM)
wolfSSL 0:9d17e4342598 3360
wolfSSL 0:9d17e4342598 3361 /* Persist cert cache to file */
wolfSSL 0:9d17e4342598 3362 int CyaSSL_CTX_save_cert_cache(CYASSL_CTX* ctx, const char* fname)
wolfSSL 0:9d17e4342598 3363 {
wolfSSL 0:9d17e4342598 3364 CYASSL_ENTER("CyaSSL_CTX_save_cert_cache");
wolfSSL 0:9d17e4342598 3365
wolfSSL 0:9d17e4342598 3366 if (ctx == NULL || fname == NULL)
wolfSSL 0:9d17e4342598 3367 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 3368
wolfSSL 0:9d17e4342598 3369 return CM_SaveCertCache(ctx->cm, fname);
wolfSSL 0:9d17e4342598 3370 }
wolfSSL 0:9d17e4342598 3371
wolfSSL 0:9d17e4342598 3372
wolfSSL 0:9d17e4342598 3373 /* Persist cert cache from file */
wolfSSL 0:9d17e4342598 3374 int CyaSSL_CTX_restore_cert_cache(CYASSL_CTX* ctx, const char* fname)
wolfSSL 0:9d17e4342598 3375 {
wolfSSL 0:9d17e4342598 3376 CYASSL_ENTER("CyaSSL_CTX_restore_cert_cache");
wolfSSL 0:9d17e4342598 3377
wolfSSL 0:9d17e4342598 3378 if (ctx == NULL || fname == NULL)
wolfSSL 0:9d17e4342598 3379 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 3380
wolfSSL 0:9d17e4342598 3381 return CM_RestoreCertCache(ctx->cm, fname);
wolfSSL 0:9d17e4342598 3382 }
wolfSSL 0:9d17e4342598 3383
wolfSSL 0:9d17e4342598 3384 #endif /* NO_FILESYSTEM */
wolfSSL 0:9d17e4342598 3385
wolfSSL 0:9d17e4342598 3386 /* Persist cert cache to memory */
wolfSSL 0:9d17e4342598 3387 int CyaSSL_CTX_memsave_cert_cache(CYASSL_CTX* ctx, void* mem, int sz, int* used)
wolfSSL 0:9d17e4342598 3388 {
wolfSSL 0:9d17e4342598 3389 CYASSL_ENTER("CyaSSL_CTX_memsave_cert_cache");
wolfSSL 0:9d17e4342598 3390
wolfSSL 0:9d17e4342598 3391 if (ctx == NULL || mem == NULL || used == NULL || sz <= 0)
wolfSSL 0:9d17e4342598 3392 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 3393
wolfSSL 0:9d17e4342598 3394 return CM_MemSaveCertCache(ctx->cm, mem, sz, used);
wolfSSL 0:9d17e4342598 3395 }
wolfSSL 0:9d17e4342598 3396
wolfSSL 0:9d17e4342598 3397
wolfSSL 0:9d17e4342598 3398 /* Restore cert cache from memory */
wolfSSL 0:9d17e4342598 3399 int CyaSSL_CTX_memrestore_cert_cache(CYASSL_CTX* ctx, const void* mem, int sz)
wolfSSL 0:9d17e4342598 3400 {
wolfSSL 0:9d17e4342598 3401 CYASSL_ENTER("CyaSSL_CTX_memrestore_cert_cache");
wolfSSL 0:9d17e4342598 3402
wolfSSL 0:9d17e4342598 3403 if (ctx == NULL || mem == NULL || sz <= 0)
wolfSSL 0:9d17e4342598 3404 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 3405
wolfSSL 0:9d17e4342598 3406 return CM_MemRestoreCertCache(ctx->cm, mem, sz);
wolfSSL 0:9d17e4342598 3407 }
wolfSSL 0:9d17e4342598 3408
wolfSSL 0:9d17e4342598 3409
wolfSSL 0:9d17e4342598 3410 /* get how big the the cert cache save buffer needs to be */
wolfSSL 0:9d17e4342598 3411 int CyaSSL_CTX_get_cert_cache_memsize(CYASSL_CTX* ctx)
wolfSSL 0:9d17e4342598 3412 {
wolfSSL 0:9d17e4342598 3413 CYASSL_ENTER("CyaSSL_CTX_get_cert_cache_memsize");
wolfSSL 0:9d17e4342598 3414
wolfSSL 0:9d17e4342598 3415 if (ctx == NULL)
wolfSSL 0:9d17e4342598 3416 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 3417
wolfSSL 0:9d17e4342598 3418 return CM_GetCertCacheMemSize(ctx->cm);
wolfSSL 0:9d17e4342598 3419 }
wolfSSL 0:9d17e4342598 3420
wolfSSL 0:9d17e4342598 3421 #endif /* PERSISTE_CERT_CACHE */
wolfSSL 0:9d17e4342598 3422 #endif /* !NO_CERTS */
wolfSSL 0:9d17e4342598 3423
wolfSSL 0:9d17e4342598 3424
wolfSSL 0:9d17e4342598 3425 #ifndef NO_SESSION_CACHE
wolfSSL 0:9d17e4342598 3426
wolfSSL 0:9d17e4342598 3427 CYASSL_SESSION* CyaSSL_get_session(CYASSL* ssl)
wolfSSL 0:9d17e4342598 3428 {
wolfSSL 0:9d17e4342598 3429 CYASSL_ENTER("SSL_get_session");
wolfSSL 0:9d17e4342598 3430 if (ssl)
wolfSSL 0:9d17e4342598 3431 return GetSession(ssl, 0);
wolfSSL 0:9d17e4342598 3432
wolfSSL 0:9d17e4342598 3433 return NULL;
wolfSSL 0:9d17e4342598 3434 }
wolfSSL 0:9d17e4342598 3435
wolfSSL 0:9d17e4342598 3436
wolfSSL 0:9d17e4342598 3437 int CyaSSL_set_session(CYASSL* ssl, CYASSL_SESSION* session)
wolfSSL 0:9d17e4342598 3438 {
wolfSSL 0:9d17e4342598 3439 CYASSL_ENTER("SSL_set_session");
wolfSSL 0:9d17e4342598 3440 if (session)
wolfSSL 0:9d17e4342598 3441 return SetSession(ssl, session);
wolfSSL 0:9d17e4342598 3442
wolfSSL 0:9d17e4342598 3443 return SSL_FAILURE;
wolfSSL 0:9d17e4342598 3444 }
wolfSSL 0:9d17e4342598 3445
wolfSSL 0:9d17e4342598 3446
wolfSSL 0:9d17e4342598 3447 #ifndef NO_CLIENT_CACHE
wolfSSL 0:9d17e4342598 3448
wolfSSL 0:9d17e4342598 3449 /* Associate client session with serverID, find existing or store for saving
wolfSSL 0:9d17e4342598 3450 if newSession flag on, don't reuse existing session
wolfSSL 0:9d17e4342598 3451 SSL_SUCCESS on ok */
wolfSSL 0:9d17e4342598 3452 int CyaSSL_SetServerID(CYASSL* ssl, const byte* id, int len, int newSession)
wolfSSL 0:9d17e4342598 3453 {
wolfSSL 0:9d17e4342598 3454 CYASSL_SESSION* session = NULL;
wolfSSL 0:9d17e4342598 3455
wolfSSL 0:9d17e4342598 3456 CYASSL_ENTER("CyaSSL_SetServerID");
wolfSSL 0:9d17e4342598 3457
wolfSSL 0:9d17e4342598 3458 if (ssl == NULL || id == NULL || len <= 0)
wolfSSL 0:9d17e4342598 3459 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 3460
wolfSSL 0:9d17e4342598 3461 if (newSession == 0) {
wolfSSL 0:9d17e4342598 3462 session = GetSessionClient(ssl, id, len);
wolfSSL 0:9d17e4342598 3463 if (session) {
wolfSSL 0:9d17e4342598 3464 if (SetSession(ssl, session) != SSL_SUCCESS) {
wolfSSL 0:9d17e4342598 3465 CYASSL_MSG("SetSession failed");
wolfSSL 0:9d17e4342598 3466 session = NULL;
wolfSSL 0:9d17e4342598 3467 }
wolfSSL 0:9d17e4342598 3468 }
wolfSSL 0:9d17e4342598 3469 }
wolfSSL 0:9d17e4342598 3470
wolfSSL 0:9d17e4342598 3471 if (session == NULL) {
wolfSSL 0:9d17e4342598 3472 CYASSL_MSG("Valid ServerID not cached already");
wolfSSL 0:9d17e4342598 3473
wolfSSL 0:9d17e4342598 3474 ssl->session.idLen = (word16)min(SERVER_ID_LEN, (word32)len);
wolfSSL 0:9d17e4342598 3475 XMEMCPY(ssl->session.serverID, id, ssl->session.idLen);
wolfSSL 0:9d17e4342598 3476 }
wolfSSL 0:9d17e4342598 3477
wolfSSL 0:9d17e4342598 3478 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 3479 }
wolfSSL 0:9d17e4342598 3480
wolfSSL 0:9d17e4342598 3481 #endif /* NO_CLIENT_CACHE */
wolfSSL 0:9d17e4342598 3482
wolfSSL 0:9d17e4342598 3483 #if defined(PERSIST_SESSION_CACHE)
wolfSSL 0:9d17e4342598 3484
wolfSSL 0:9d17e4342598 3485 /* for persistance, if changes to layout need to increment and modify
wolfSSL 0:9d17e4342598 3486 save_session_cache() and restore_session_cache and memory versions too */
wolfSSL 0:9d17e4342598 3487 #define CYASSL_CACHE_VERSION 2
wolfSSL 0:9d17e4342598 3488
wolfSSL 0:9d17e4342598 3489 /* Session Cache Header information */
wolfSSL 0:9d17e4342598 3490 typedef struct {
wolfSSL 0:9d17e4342598 3491 int version; /* cache layout version id */
wolfSSL 0:9d17e4342598 3492 int rows; /* session rows */
wolfSSL 0:9d17e4342598 3493 int columns; /* session columns */
wolfSSL 0:9d17e4342598 3494 int sessionSz; /* sizeof CYASSL_SESSION */
wolfSSL 0:9d17e4342598 3495 } cache_header_t;
wolfSSL 0:9d17e4342598 3496
wolfSSL 0:9d17e4342598 3497 /* current persistence layout is:
wolfSSL 0:9d17e4342598 3498
wolfSSL 0:9d17e4342598 3499 1) cache_header_t
wolfSSL 0:9d17e4342598 3500 2) SessionCache
wolfSSL 0:9d17e4342598 3501 3) ClientCache
wolfSSL 0:9d17e4342598 3502
wolfSSL 0:9d17e4342598 3503 update CYASSL_CACHE_VERSION if change layout for the following
wolfSSL 0:9d17e4342598 3504 PERSISTENT_SESSION_CACHE functions
wolfSSL 0:9d17e4342598 3505 */
wolfSSL 0:9d17e4342598 3506
wolfSSL 0:9d17e4342598 3507
wolfSSL 0:9d17e4342598 3508 /* get how big the the session cache save buffer needs to be */
wolfSSL 0:9d17e4342598 3509 int CyaSSL_get_session_cache_memsize(void)
wolfSSL 0:9d17e4342598 3510 {
wolfSSL 0:9d17e4342598 3511 int sz = (int)(sizeof(SessionCache) + sizeof(cache_header_t));
wolfSSL 0:9d17e4342598 3512
wolfSSL 0:9d17e4342598 3513 #ifndef NO_CLIENT_CACHE
wolfSSL 0:9d17e4342598 3514 sz += (int)(sizeof(ClientCache));
wolfSSL 0:9d17e4342598 3515 #endif
wolfSSL 0:9d17e4342598 3516
wolfSSL 0:9d17e4342598 3517 return sz;
wolfSSL 0:9d17e4342598 3518 }
wolfSSL 0:9d17e4342598 3519
wolfSSL 0:9d17e4342598 3520
wolfSSL 0:9d17e4342598 3521 /* Persist session cache to memory */
wolfSSL 0:9d17e4342598 3522 int CyaSSL_memsave_session_cache(void* mem, int sz)
wolfSSL 0:9d17e4342598 3523 {
wolfSSL 0:9d17e4342598 3524 int i;
wolfSSL 0:9d17e4342598 3525 cache_header_t cache_header;
wolfSSL 0:9d17e4342598 3526 SessionRow* row = (SessionRow*)((byte*)mem + sizeof(cache_header));
wolfSSL 0:9d17e4342598 3527 #ifndef NO_CLIENT_CACHE
wolfSSL 0:9d17e4342598 3528 ClientRow* clRow;
wolfSSL 0:9d17e4342598 3529 #endif
wolfSSL 0:9d17e4342598 3530
wolfSSL 0:9d17e4342598 3531 CYASSL_ENTER("CyaSSL_memsave_session_cache");
wolfSSL 0:9d17e4342598 3532
wolfSSL 0:9d17e4342598 3533 if (sz < CyaSSL_get_session_cache_memsize()) {
wolfSSL 0:9d17e4342598 3534 CYASSL_MSG("Memory buffer too small");
wolfSSL 0:9d17e4342598 3535 return BUFFER_E;
wolfSSL 0:9d17e4342598 3536 }
wolfSSL 0:9d17e4342598 3537
wolfSSL 0:9d17e4342598 3538 cache_header.version = CYASSL_CACHE_VERSION;
wolfSSL 0:9d17e4342598 3539 cache_header.rows = SESSION_ROWS;
wolfSSL 0:9d17e4342598 3540 cache_header.columns = SESSIONS_PER_ROW;
wolfSSL 0:9d17e4342598 3541 cache_header.sessionSz = (int)sizeof(CYASSL_SESSION);
wolfSSL 0:9d17e4342598 3542 XMEMCPY(mem, &cache_header, sizeof(cache_header));
wolfSSL 0:9d17e4342598 3543
wolfSSL 0:9d17e4342598 3544 if (LockMutex(&session_mutex) != 0) {
wolfSSL 0:9d17e4342598 3545 CYASSL_MSG("Session cache mutex lock failed");
wolfSSL 0:9d17e4342598 3546 return BAD_MUTEX_E;
wolfSSL 0:9d17e4342598 3547 }
wolfSSL 0:9d17e4342598 3548
wolfSSL 0:9d17e4342598 3549 for (i = 0; i < cache_header.rows; ++i)
wolfSSL 0:9d17e4342598 3550 XMEMCPY(row++, SessionCache + i, sizeof(SessionRow));
wolfSSL 0:9d17e4342598 3551
wolfSSL 0:9d17e4342598 3552 #ifndef NO_CLIENT_CACHE
wolfSSL 0:9d17e4342598 3553 clRow = (ClientRow*)row;
wolfSSL 0:9d17e4342598 3554 for (i = 0; i < cache_header.rows; ++i)
wolfSSL 0:9d17e4342598 3555 XMEMCPY(clRow++, ClientCache + i, sizeof(ClientRow));
wolfSSL 0:9d17e4342598 3556 #endif
wolfSSL 0:9d17e4342598 3557
wolfSSL 0:9d17e4342598 3558 UnLockMutex(&session_mutex);
wolfSSL 0:9d17e4342598 3559
wolfSSL 0:9d17e4342598 3560 CYASSL_LEAVE("CyaSSL_memsave_session_cache", SSL_SUCCESS);
wolfSSL 0:9d17e4342598 3561
wolfSSL 0:9d17e4342598 3562 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 3563 }
wolfSSL 0:9d17e4342598 3564
wolfSSL 0:9d17e4342598 3565
wolfSSL 0:9d17e4342598 3566 /* Restore the persistant session cache from memory */
wolfSSL 0:9d17e4342598 3567 int CyaSSL_memrestore_session_cache(const void* mem, int sz)
wolfSSL 0:9d17e4342598 3568 {
wolfSSL 0:9d17e4342598 3569 int i;
wolfSSL 0:9d17e4342598 3570 cache_header_t cache_header;
wolfSSL 0:9d17e4342598 3571 SessionRow* row = (SessionRow*)((byte*)mem + sizeof(cache_header));
wolfSSL 0:9d17e4342598 3572 #ifndef NO_CLIENT_CACHE
wolfSSL 0:9d17e4342598 3573 ClientRow* clRow;
wolfSSL 0:9d17e4342598 3574 #endif
wolfSSL 0:9d17e4342598 3575
wolfSSL 0:9d17e4342598 3576 CYASSL_ENTER("CyaSSL_memrestore_session_cache");
wolfSSL 0:9d17e4342598 3577
wolfSSL 0:9d17e4342598 3578 if (sz < CyaSSL_get_session_cache_memsize()) {
wolfSSL 0:9d17e4342598 3579 CYASSL_MSG("Memory buffer too small");
wolfSSL 0:9d17e4342598 3580 return BUFFER_E;
wolfSSL 0:9d17e4342598 3581 }
wolfSSL 0:9d17e4342598 3582
wolfSSL 0:9d17e4342598 3583 XMEMCPY(&cache_header, mem, sizeof(cache_header));
wolfSSL 0:9d17e4342598 3584 if (cache_header.version != CYASSL_CACHE_VERSION ||
wolfSSL 0:9d17e4342598 3585 cache_header.rows != SESSION_ROWS ||
wolfSSL 0:9d17e4342598 3586 cache_header.columns != SESSIONS_PER_ROW ||
wolfSSL 0:9d17e4342598 3587 cache_header.sessionSz != (int)sizeof(CYASSL_SESSION)) {
wolfSSL 0:9d17e4342598 3588
wolfSSL 0:9d17e4342598 3589 CYASSL_MSG("Session cache header match failed");
wolfSSL 0:9d17e4342598 3590 return CACHE_MATCH_ERROR;
wolfSSL 0:9d17e4342598 3591 }
wolfSSL 0:9d17e4342598 3592
wolfSSL 0:9d17e4342598 3593 if (LockMutex(&session_mutex) != 0) {
wolfSSL 0:9d17e4342598 3594 CYASSL_MSG("Session cache mutex lock failed");
wolfSSL 0:9d17e4342598 3595 return BAD_MUTEX_E;
wolfSSL 0:9d17e4342598 3596 }
wolfSSL 0:9d17e4342598 3597
wolfSSL 0:9d17e4342598 3598 for (i = 0; i < cache_header.rows; ++i)
wolfSSL 0:9d17e4342598 3599 XMEMCPY(SessionCache + i, row++, sizeof(SessionRow));
wolfSSL 0:9d17e4342598 3600
wolfSSL 0:9d17e4342598 3601 #ifndef NO_CLIENT_CACHE
wolfSSL 0:9d17e4342598 3602 clRow = (ClientRow*)row;
wolfSSL 0:9d17e4342598 3603 for (i = 0; i < cache_header.rows; ++i)
wolfSSL 0:9d17e4342598 3604 XMEMCPY(ClientCache + i, clRow++, sizeof(ClientRow));
wolfSSL 0:9d17e4342598 3605 #endif
wolfSSL 0:9d17e4342598 3606
wolfSSL 0:9d17e4342598 3607 UnLockMutex(&session_mutex);
wolfSSL 0:9d17e4342598 3608
wolfSSL 0:9d17e4342598 3609 CYASSL_LEAVE("CyaSSL_memrestore_session_cache", SSL_SUCCESS);
wolfSSL 0:9d17e4342598 3610
wolfSSL 0:9d17e4342598 3611 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 3612 }
wolfSSL 0:9d17e4342598 3613
wolfSSL 0:9d17e4342598 3614 #if !defined(NO_FILESYSTEM)
wolfSSL 0:9d17e4342598 3615
wolfSSL 0:9d17e4342598 3616 /* Persist session cache to file */
wolfSSL 0:9d17e4342598 3617 /* doesn't use memsave because of additional memory use */
wolfSSL 0:9d17e4342598 3618 int CyaSSL_save_session_cache(const char *fname)
wolfSSL 0:9d17e4342598 3619 {
wolfSSL 0:9d17e4342598 3620 XFILE file;
wolfSSL 0:9d17e4342598 3621 int ret;
wolfSSL 0:9d17e4342598 3622 int rc = SSL_SUCCESS;
wolfSSL 0:9d17e4342598 3623 int i;
wolfSSL 0:9d17e4342598 3624 cache_header_t cache_header;
wolfSSL 0:9d17e4342598 3625
wolfSSL 0:9d17e4342598 3626 CYASSL_ENTER("CyaSSL_save_session_cache");
wolfSSL 0:9d17e4342598 3627
wolfSSL 0:9d17e4342598 3628 file = XFOPEN(fname, "w+b");
wolfSSL 0:9d17e4342598 3629 if (file == XBADFILE) {
wolfSSL 0:9d17e4342598 3630 CYASSL_MSG("Couldn't open session cache save file");
wolfSSL 0:9d17e4342598 3631 return SSL_BAD_FILE;
wolfSSL 0:9d17e4342598 3632 }
wolfSSL 0:9d17e4342598 3633 cache_header.version = CYASSL_CACHE_VERSION;
wolfSSL 0:9d17e4342598 3634 cache_header.rows = SESSION_ROWS;
wolfSSL 0:9d17e4342598 3635 cache_header.columns = SESSIONS_PER_ROW;
wolfSSL 0:9d17e4342598 3636 cache_header.sessionSz = (int)sizeof(CYASSL_SESSION);
wolfSSL 0:9d17e4342598 3637
wolfSSL 0:9d17e4342598 3638 /* cache header */
wolfSSL 0:9d17e4342598 3639 ret = (int)XFWRITE(&cache_header, sizeof cache_header, 1, file);
wolfSSL 0:9d17e4342598 3640 if (ret != 1) {
wolfSSL 0:9d17e4342598 3641 CYASSL_MSG("Session cache header file write failed");
wolfSSL 0:9d17e4342598 3642 XFCLOSE(file);
wolfSSL 0:9d17e4342598 3643 return FWRITE_ERROR;
wolfSSL 0:9d17e4342598 3644 }
wolfSSL 0:9d17e4342598 3645
wolfSSL 0:9d17e4342598 3646 if (LockMutex(&session_mutex) != 0) {
wolfSSL 0:9d17e4342598 3647 CYASSL_MSG("Session cache mutex lock failed");
wolfSSL 0:9d17e4342598 3648 XFCLOSE(file);
wolfSSL 0:9d17e4342598 3649 return BAD_MUTEX_E;
wolfSSL 0:9d17e4342598 3650 }
wolfSSL 0:9d17e4342598 3651
wolfSSL 0:9d17e4342598 3652 /* session cache */
wolfSSL 0:9d17e4342598 3653 for (i = 0; i < cache_header.rows; ++i) {
wolfSSL 0:9d17e4342598 3654 ret = (int)XFWRITE(SessionCache + i, sizeof(SessionRow), 1, file);
wolfSSL 0:9d17e4342598 3655 if (ret != 1) {
wolfSSL 0:9d17e4342598 3656 CYASSL_MSG("Session cache member file write failed");
wolfSSL 0:9d17e4342598 3657 rc = FWRITE_ERROR;
wolfSSL 0:9d17e4342598 3658 break;
wolfSSL 0:9d17e4342598 3659 }
wolfSSL 0:9d17e4342598 3660 }
wolfSSL 0:9d17e4342598 3661
wolfSSL 0:9d17e4342598 3662 #ifndef NO_CLIENT_CACHE
wolfSSL 0:9d17e4342598 3663 /* client cache */
wolfSSL 0:9d17e4342598 3664 for (i = 0; i < cache_header.rows; ++i) {
wolfSSL 0:9d17e4342598 3665 ret = (int)XFWRITE(ClientCache + i, sizeof(ClientRow), 1, file);
wolfSSL 0:9d17e4342598 3666 if (ret != 1) {
wolfSSL 0:9d17e4342598 3667 CYASSL_MSG("Client cache member file write failed");
wolfSSL 0:9d17e4342598 3668 rc = FWRITE_ERROR;
wolfSSL 0:9d17e4342598 3669 break;
wolfSSL 0:9d17e4342598 3670 }
wolfSSL 0:9d17e4342598 3671 }
wolfSSL 0:9d17e4342598 3672 #endif /* NO_CLIENT_CACHE */
wolfSSL 0:9d17e4342598 3673
wolfSSL 0:9d17e4342598 3674 UnLockMutex(&session_mutex);
wolfSSL 0:9d17e4342598 3675
wolfSSL 0:9d17e4342598 3676 XFCLOSE(file);
wolfSSL 0:9d17e4342598 3677 CYASSL_LEAVE("CyaSSL_save_session_cache", rc);
wolfSSL 0:9d17e4342598 3678
wolfSSL 0:9d17e4342598 3679 return rc;
wolfSSL 0:9d17e4342598 3680 }
wolfSSL 0:9d17e4342598 3681
wolfSSL 0:9d17e4342598 3682
wolfSSL 0:9d17e4342598 3683 /* Restore the persistant session cache from file */
wolfSSL 0:9d17e4342598 3684 /* doesn't use memstore because of additional memory use */
wolfSSL 0:9d17e4342598 3685 int CyaSSL_restore_session_cache(const char *fname)
wolfSSL 0:9d17e4342598 3686 {
wolfSSL 0:9d17e4342598 3687 XFILE file;
wolfSSL 0:9d17e4342598 3688 int rc = SSL_SUCCESS;
wolfSSL 0:9d17e4342598 3689 int ret;
wolfSSL 0:9d17e4342598 3690 int i;
wolfSSL 0:9d17e4342598 3691 cache_header_t cache_header;
wolfSSL 0:9d17e4342598 3692
wolfSSL 0:9d17e4342598 3693 CYASSL_ENTER("CyaSSL_restore_session_cache");
wolfSSL 0:9d17e4342598 3694
wolfSSL 0:9d17e4342598 3695 file = XFOPEN(fname, "rb");
wolfSSL 0:9d17e4342598 3696 if (file == XBADFILE) {
wolfSSL 0:9d17e4342598 3697 CYASSL_MSG("Couldn't open session cache save file");
wolfSSL 0:9d17e4342598 3698 return SSL_BAD_FILE;
wolfSSL 0:9d17e4342598 3699 }
wolfSSL 0:9d17e4342598 3700 /* cache header */
wolfSSL 0:9d17e4342598 3701 ret = (int)XFREAD(&cache_header, sizeof cache_header, 1, file);
wolfSSL 0:9d17e4342598 3702 if (ret != 1) {
wolfSSL 0:9d17e4342598 3703 CYASSL_MSG("Session cache header file read failed");
wolfSSL 0:9d17e4342598 3704 XFCLOSE(file);
wolfSSL 0:9d17e4342598 3705 return FREAD_ERROR;
wolfSSL 0:9d17e4342598 3706 }
wolfSSL 0:9d17e4342598 3707 if (cache_header.version != CYASSL_CACHE_VERSION ||
wolfSSL 0:9d17e4342598 3708 cache_header.rows != SESSION_ROWS ||
wolfSSL 0:9d17e4342598 3709 cache_header.columns != SESSIONS_PER_ROW ||
wolfSSL 0:9d17e4342598 3710 cache_header.sessionSz != (int)sizeof(CYASSL_SESSION)) {
wolfSSL 0:9d17e4342598 3711
wolfSSL 0:9d17e4342598 3712 CYASSL_MSG("Session cache header match failed");
wolfSSL 0:9d17e4342598 3713 XFCLOSE(file);
wolfSSL 0:9d17e4342598 3714 return CACHE_MATCH_ERROR;
wolfSSL 0:9d17e4342598 3715 }
wolfSSL 0:9d17e4342598 3716
wolfSSL 0:9d17e4342598 3717 if (LockMutex(&session_mutex) != 0) {
wolfSSL 0:9d17e4342598 3718 CYASSL_MSG("Session cache mutex lock failed");
wolfSSL 0:9d17e4342598 3719 XFCLOSE(file);
wolfSSL 0:9d17e4342598 3720 return BAD_MUTEX_E;
wolfSSL 0:9d17e4342598 3721 }
wolfSSL 0:9d17e4342598 3722
wolfSSL 0:9d17e4342598 3723 /* session cache */
wolfSSL 0:9d17e4342598 3724 for (i = 0; i < cache_header.rows; ++i) {
wolfSSL 0:9d17e4342598 3725 ret = (int)XFREAD(SessionCache + i, sizeof(SessionRow), 1, file);
wolfSSL 0:9d17e4342598 3726 if (ret != 1) {
wolfSSL 0:9d17e4342598 3727 CYASSL_MSG("Session cache member file read failed");
wolfSSL 0:9d17e4342598 3728 XMEMSET(SessionCache, 0, sizeof SessionCache);
wolfSSL 0:9d17e4342598 3729 rc = FREAD_ERROR;
wolfSSL 0:9d17e4342598 3730 break;
wolfSSL 0:9d17e4342598 3731 }
wolfSSL 0:9d17e4342598 3732 }
wolfSSL 0:9d17e4342598 3733
wolfSSL 0:9d17e4342598 3734 #ifndef NO_CLIENT_CACHE
wolfSSL 0:9d17e4342598 3735 /* client cache */
wolfSSL 0:9d17e4342598 3736 for (i = 0; i < cache_header.rows; ++i) {
wolfSSL 0:9d17e4342598 3737 ret = (int)XFREAD(ClientCache + i, sizeof(ClientRow), 1, file);
wolfSSL 0:9d17e4342598 3738 if (ret != 1) {
wolfSSL 0:9d17e4342598 3739 CYASSL_MSG("Client cache member file read failed");
wolfSSL 0:9d17e4342598 3740 XMEMSET(ClientCache, 0, sizeof ClientCache);
wolfSSL 0:9d17e4342598 3741 rc = FREAD_ERROR;
wolfSSL 0:9d17e4342598 3742 break;
wolfSSL 0:9d17e4342598 3743 }
wolfSSL 0:9d17e4342598 3744 }
wolfSSL 0:9d17e4342598 3745
wolfSSL 0:9d17e4342598 3746 #endif /* NO_CLIENT_CACHE */
wolfSSL 0:9d17e4342598 3747
wolfSSL 0:9d17e4342598 3748 UnLockMutex(&session_mutex);
wolfSSL 0:9d17e4342598 3749
wolfSSL 0:9d17e4342598 3750 XFCLOSE(file);
wolfSSL 0:9d17e4342598 3751 CYASSL_LEAVE("CyaSSL_restore_session_cache", rc);
wolfSSL 0:9d17e4342598 3752
wolfSSL 0:9d17e4342598 3753 return rc;
wolfSSL 0:9d17e4342598 3754 }
wolfSSL 0:9d17e4342598 3755
wolfSSL 0:9d17e4342598 3756 #endif /* !NO_FILESYSTEM */
wolfSSL 0:9d17e4342598 3757 #endif /* PERSIST_SESSION_CACHE */
wolfSSL 0:9d17e4342598 3758 #endif /* NO_SESSION_CACHE */
wolfSSL 0:9d17e4342598 3759
wolfSSL 0:9d17e4342598 3760
wolfSSL 0:9d17e4342598 3761 void CyaSSL_load_error_strings(void) /* compatibility only */
wolfSSL 0:9d17e4342598 3762 {}
wolfSSL 0:9d17e4342598 3763
wolfSSL 0:9d17e4342598 3764
wolfSSL 0:9d17e4342598 3765 int CyaSSL_library_init(void)
wolfSSL 0:9d17e4342598 3766 {
wolfSSL 0:9d17e4342598 3767 CYASSL_ENTER("SSL_library_init");
wolfSSL 0:9d17e4342598 3768 if (CyaSSL_Init() == SSL_SUCCESS)
wolfSSL 0:9d17e4342598 3769 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 3770 else
wolfSSL 0:9d17e4342598 3771 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 3772 }
wolfSSL 0:9d17e4342598 3773
wolfSSL 0:9d17e4342598 3774
wolfSSL 0:9d17e4342598 3775 #ifndef NO_SESSION_CACHE
wolfSSL 0:9d17e4342598 3776
wolfSSL 0:9d17e4342598 3777 /* on by default if built in but allow user to turn off */
wolfSSL 0:9d17e4342598 3778 long CyaSSL_CTX_set_session_cache_mode(CYASSL_CTX* ctx, long mode)
wolfSSL 0:9d17e4342598 3779 {
wolfSSL 0:9d17e4342598 3780 CYASSL_ENTER("SSL_CTX_set_session_cache_mode");
wolfSSL 0:9d17e4342598 3781 if (mode == SSL_SESS_CACHE_OFF)
wolfSSL 0:9d17e4342598 3782 ctx->sessionCacheOff = 1;
wolfSSL 0:9d17e4342598 3783
wolfSSL 0:9d17e4342598 3784 if (mode == SSL_SESS_CACHE_NO_AUTO_CLEAR)
wolfSSL 0:9d17e4342598 3785 ctx->sessionCacheFlushOff = 1;
wolfSSL 0:9d17e4342598 3786
wolfSSL 0:9d17e4342598 3787 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 3788 }
wolfSSL 0:9d17e4342598 3789
wolfSSL 0:9d17e4342598 3790 #endif /* NO_SESSION_CACHE */
wolfSSL 0:9d17e4342598 3791
wolfSSL 0:9d17e4342598 3792
wolfSSL 0:9d17e4342598 3793 #if !defined(NO_CERTS)
wolfSSL 0:9d17e4342598 3794 #if defined(PERSIST_CERT_CACHE)
wolfSSL 0:9d17e4342598 3795
wolfSSL 0:9d17e4342598 3796
wolfSSL 0:9d17e4342598 3797 #define CYASSL_CACHE_CERT_VERSION 1
wolfSSL 0:9d17e4342598 3798
wolfSSL 0:9d17e4342598 3799 typedef struct {
wolfSSL 0:9d17e4342598 3800 int version; /* cache cert layout version id */
wolfSSL 0:9d17e4342598 3801 int rows; /* hash table rows, CA_TABLE_SIZE */
wolfSSL 0:9d17e4342598 3802 int columns[CA_TABLE_SIZE]; /* columns per row on list */
wolfSSL 0:9d17e4342598 3803 int signerSz; /* sizeof Signer object */
wolfSSL 0:9d17e4342598 3804 } CertCacheHeader;
wolfSSL 0:9d17e4342598 3805
wolfSSL 0:9d17e4342598 3806 /* current cert persistance layout is:
wolfSSL 0:9d17e4342598 3807
wolfSSL 0:9d17e4342598 3808 1) CertCacheHeader
wolfSSL 0:9d17e4342598 3809 2) caTable
wolfSSL 0:9d17e4342598 3810
wolfSSL 0:9d17e4342598 3811 update CYASSL_CERT_CACHE_VERSION if change layout for the following
wolfSSL 0:9d17e4342598 3812 PERSIST_CERT_CACHE functions
wolfSSL 0:9d17e4342598 3813 */
wolfSSL 0:9d17e4342598 3814
wolfSSL 0:9d17e4342598 3815
wolfSSL 0:9d17e4342598 3816 /* Return memory needed to persist this signer, have lock */
wolfSSL 0:9d17e4342598 3817 static INLINE int GetSignerMemory(Signer* signer)
wolfSSL 0:9d17e4342598 3818 {
wolfSSL 0:9d17e4342598 3819 int sz = sizeof(signer->pubKeySize) + sizeof(signer->keyOID)
wolfSSL 0:9d17e4342598 3820 + sizeof(signer->nameLen) + sizeof(signer->subjectNameHash);
wolfSSL 0:9d17e4342598 3821
wolfSSL 0:9d17e4342598 3822 #if !defined(NO_SKID)
wolfSSL 0:9d17e4342598 3823 sz += (int)sizeof(signer->subjectKeyIdHash);
wolfSSL 0:9d17e4342598 3824 #endif
wolfSSL 0:9d17e4342598 3825
wolfSSL 0:9d17e4342598 3826 /* add dynamic bytes needed */
wolfSSL 0:9d17e4342598 3827 sz += signer->pubKeySize;
wolfSSL 0:9d17e4342598 3828 sz += signer->nameLen;
wolfSSL 0:9d17e4342598 3829
wolfSSL 0:9d17e4342598 3830 return sz;
wolfSSL 0:9d17e4342598 3831 }
wolfSSL 0:9d17e4342598 3832
wolfSSL 0:9d17e4342598 3833
wolfSSL 0:9d17e4342598 3834 /* Return memory needed to persist this row, have lock */
wolfSSL 0:9d17e4342598 3835 static INLINE int GetCertCacheRowMemory(Signer* row)
wolfSSL 0:9d17e4342598 3836 {
wolfSSL 0:9d17e4342598 3837 int sz = 0;
wolfSSL 0:9d17e4342598 3838
wolfSSL 0:9d17e4342598 3839 while (row) {
wolfSSL 0:9d17e4342598 3840 sz += GetSignerMemory(row);
wolfSSL 0:9d17e4342598 3841 row = row->next;
wolfSSL 0:9d17e4342598 3842 }
wolfSSL 0:9d17e4342598 3843
wolfSSL 0:9d17e4342598 3844 return sz;
wolfSSL 0:9d17e4342598 3845 }
wolfSSL 0:9d17e4342598 3846
wolfSSL 0:9d17e4342598 3847
wolfSSL 0:9d17e4342598 3848 /* get the size of persist cert cache, have lock */
wolfSSL 0:9d17e4342598 3849 static INLINE int GetCertCacheMemSize(CYASSL_CERT_MANAGER* cm)
wolfSSL 0:9d17e4342598 3850 {
wolfSSL 0:9d17e4342598 3851 int sz;
wolfSSL 0:9d17e4342598 3852 int i;
wolfSSL 0:9d17e4342598 3853
wolfSSL 0:9d17e4342598 3854 sz = sizeof(CertCacheHeader);
wolfSSL 0:9d17e4342598 3855
wolfSSL 0:9d17e4342598 3856 for (i = 0; i < CA_TABLE_SIZE; i++)
wolfSSL 0:9d17e4342598 3857 sz += GetCertCacheRowMemory(cm->caTable[i]);
wolfSSL 0:9d17e4342598 3858
wolfSSL 0:9d17e4342598 3859 return sz;
wolfSSL 0:9d17e4342598 3860 }
wolfSSL 0:9d17e4342598 3861
wolfSSL 0:9d17e4342598 3862
wolfSSL 0:9d17e4342598 3863 /* Store cert cache header columns with number of items per list, have lock */
wolfSSL 0:9d17e4342598 3864 static INLINE void SetCertHeaderColumns(CYASSL_CERT_MANAGER* cm, int* columns)
wolfSSL 0:9d17e4342598 3865 {
wolfSSL 0:9d17e4342598 3866 int i;
wolfSSL 0:9d17e4342598 3867 Signer* row;
wolfSSL 0:9d17e4342598 3868
wolfSSL 0:9d17e4342598 3869 for (i = 0; i < CA_TABLE_SIZE; i++) {
wolfSSL 0:9d17e4342598 3870 int count = 0;
wolfSSL 0:9d17e4342598 3871 row = cm->caTable[i];
wolfSSL 0:9d17e4342598 3872
wolfSSL 0:9d17e4342598 3873 while (row) {
wolfSSL 0:9d17e4342598 3874 ++count;
wolfSSL 0:9d17e4342598 3875 row = row->next;
wolfSSL 0:9d17e4342598 3876 }
wolfSSL 0:9d17e4342598 3877 columns[i] = count;
wolfSSL 0:9d17e4342598 3878 }
wolfSSL 0:9d17e4342598 3879 }
wolfSSL 0:9d17e4342598 3880
wolfSSL 0:9d17e4342598 3881
wolfSSL 0:9d17e4342598 3882 /* Restore whole cert row from memory, have lock, return bytes consumed,
wolfSSL 0:9d17e4342598 3883 < 0 on error, have lock */
wolfSSL 0:9d17e4342598 3884 static INLINE int RestoreCertRow(CYASSL_CERT_MANAGER* cm, byte* current,
wolfSSL 0:9d17e4342598 3885 int row, int listSz, const byte* end)
wolfSSL 0:9d17e4342598 3886 {
wolfSSL 0:9d17e4342598 3887 int idx = 0;
wolfSSL 0:9d17e4342598 3888
wolfSSL 0:9d17e4342598 3889 if (listSz < 0) {
wolfSSL 0:9d17e4342598 3890 CYASSL_MSG("Row header corrupted, negative value");
wolfSSL 0:9d17e4342598 3891 return PARSE_ERROR;
wolfSSL 0:9d17e4342598 3892 }
wolfSSL 0:9d17e4342598 3893
wolfSSL 0:9d17e4342598 3894 while (listSz) {
wolfSSL 0:9d17e4342598 3895 Signer* signer;
wolfSSL 0:9d17e4342598 3896 byte* start = current + idx; /* for end checks on this signer */
wolfSSL 0:9d17e4342598 3897 int minSz = sizeof(signer->pubKeySize) + sizeof(signer->keyOID) +
wolfSSL 0:9d17e4342598 3898 sizeof(signer->nameLen) + sizeof(signer->subjectNameHash);
wolfSSL 0:9d17e4342598 3899 #ifndef NO_SKID
wolfSSL 0:9d17e4342598 3900 minSz += (int)sizeof(signer->subjectKeyIdHash);
wolfSSL 0:9d17e4342598 3901 #endif
wolfSSL 0:9d17e4342598 3902
wolfSSL 0:9d17e4342598 3903 if (start + minSz > end) {
wolfSSL 0:9d17e4342598 3904 CYASSL_MSG("Would overread restore buffer");
wolfSSL 0:9d17e4342598 3905 return BUFFER_E;
wolfSSL 0:9d17e4342598 3906 }
wolfSSL 0:9d17e4342598 3907 signer = MakeSigner(cm->heap);
wolfSSL 0:9d17e4342598 3908 if (signer == NULL)
wolfSSL 0:9d17e4342598 3909 return MEMORY_E;
wolfSSL 0:9d17e4342598 3910
wolfSSL 0:9d17e4342598 3911 /* pubKeySize */
wolfSSL 0:9d17e4342598 3912 XMEMCPY(&signer->pubKeySize, current + idx, sizeof(signer->pubKeySize));
wolfSSL 0:9d17e4342598 3913 idx += (int)sizeof(signer->pubKeySize);
wolfSSL 0:9d17e4342598 3914
wolfSSL 0:9d17e4342598 3915 /* keyOID */
wolfSSL 0:9d17e4342598 3916 XMEMCPY(&signer->keyOID, current + idx, sizeof(signer->keyOID));
wolfSSL 0:9d17e4342598 3917 idx += (int)sizeof(signer->keyOID);
wolfSSL 0:9d17e4342598 3918
wolfSSL 0:9d17e4342598 3919 /* pulicKey */
wolfSSL 0:9d17e4342598 3920 if (start + minSz + signer->pubKeySize > end) {
wolfSSL 0:9d17e4342598 3921 CYASSL_MSG("Would overread restore buffer");
wolfSSL 0:9d17e4342598 3922 FreeSigner(signer, cm->heap);
wolfSSL 0:9d17e4342598 3923 return BUFFER_E;
wolfSSL 0:9d17e4342598 3924 }
wolfSSL 0:9d17e4342598 3925 signer->publicKey = (byte*)XMALLOC(signer->pubKeySize, cm->heap,
wolfSSL 0:9d17e4342598 3926 DYNAMIC_TYPE_KEY);
wolfSSL 0:9d17e4342598 3927 if (signer->publicKey == NULL) {
wolfSSL 0:9d17e4342598 3928 FreeSigner(signer, cm->heap);
wolfSSL 0:9d17e4342598 3929 return MEMORY_E;
wolfSSL 0:9d17e4342598 3930 }
wolfSSL 0:9d17e4342598 3931
wolfSSL 0:9d17e4342598 3932 XMEMCPY(signer->publicKey, current + idx, signer->pubKeySize);
wolfSSL 0:9d17e4342598 3933 idx += signer->pubKeySize;
wolfSSL 0:9d17e4342598 3934
wolfSSL 0:9d17e4342598 3935 /* nameLen */
wolfSSL 0:9d17e4342598 3936 XMEMCPY(&signer->nameLen, current + idx, sizeof(signer->nameLen));
wolfSSL 0:9d17e4342598 3937 idx += (int)sizeof(signer->nameLen);
wolfSSL 0:9d17e4342598 3938
wolfSSL 0:9d17e4342598 3939 /* name */
wolfSSL 0:9d17e4342598 3940 if (start + minSz + signer->pubKeySize + signer->nameLen > end) {
wolfSSL 0:9d17e4342598 3941 CYASSL_MSG("Would overread restore buffer");
wolfSSL 0:9d17e4342598 3942 FreeSigner(signer, cm->heap);
wolfSSL 0:9d17e4342598 3943 return BUFFER_E;
wolfSSL 0:9d17e4342598 3944 }
wolfSSL 0:9d17e4342598 3945 signer->name = (char*)XMALLOC(signer->nameLen, cm->heap,
wolfSSL 0:9d17e4342598 3946 DYNAMIC_TYPE_SUBJECT_CN);
wolfSSL 0:9d17e4342598 3947 if (signer->name == NULL) {
wolfSSL 0:9d17e4342598 3948 FreeSigner(signer, cm->heap);
wolfSSL 0:9d17e4342598 3949 return MEMORY_E;
wolfSSL 0:9d17e4342598 3950 }
wolfSSL 0:9d17e4342598 3951
wolfSSL 0:9d17e4342598 3952 XMEMCPY(signer->name, current + idx, signer->nameLen);
wolfSSL 0:9d17e4342598 3953 idx += signer->nameLen;
wolfSSL 0:9d17e4342598 3954
wolfSSL 0:9d17e4342598 3955 /* subjectNameHash */
wolfSSL 0:9d17e4342598 3956 XMEMCPY(signer->subjectNameHash, current + idx, SIGNER_DIGEST_SIZE);
wolfSSL 0:9d17e4342598 3957 idx += SIGNER_DIGEST_SIZE;
wolfSSL 0:9d17e4342598 3958
wolfSSL 0:9d17e4342598 3959 #ifndef NO_SKID
wolfSSL 0:9d17e4342598 3960 /* subjectKeyIdHash */
wolfSSL 0:9d17e4342598 3961 XMEMCPY(signer->subjectKeyIdHash, current + idx,SIGNER_DIGEST_SIZE);
wolfSSL 0:9d17e4342598 3962 idx += SIGNER_DIGEST_SIZE;
wolfSSL 0:9d17e4342598 3963 #endif
wolfSSL 0:9d17e4342598 3964
wolfSSL 0:9d17e4342598 3965 signer->next = cm->caTable[row];
wolfSSL 0:9d17e4342598 3966 cm->caTable[row] = signer;
wolfSSL 0:9d17e4342598 3967
wolfSSL 0:9d17e4342598 3968 --listSz;
wolfSSL 0:9d17e4342598 3969 }
wolfSSL 0:9d17e4342598 3970
wolfSSL 0:9d17e4342598 3971 return idx;
wolfSSL 0:9d17e4342598 3972 }
wolfSSL 0:9d17e4342598 3973
wolfSSL 0:9d17e4342598 3974
wolfSSL 0:9d17e4342598 3975 /* Store whole cert row into memory, have lock, return bytes added */
wolfSSL 0:9d17e4342598 3976 static INLINE int StoreCertRow(CYASSL_CERT_MANAGER* cm, byte* current, int row)
wolfSSL 0:9d17e4342598 3977 {
wolfSSL 0:9d17e4342598 3978 int added = 0;
wolfSSL 0:9d17e4342598 3979 Signer* list = cm->caTable[row];
wolfSSL 0:9d17e4342598 3980
wolfSSL 0:9d17e4342598 3981 while (list) {
wolfSSL 0:9d17e4342598 3982 XMEMCPY(current + added, &list->pubKeySize, sizeof(list->pubKeySize));
wolfSSL 0:9d17e4342598 3983 added += (int)sizeof(list->pubKeySize);
wolfSSL 0:9d17e4342598 3984
wolfSSL 0:9d17e4342598 3985 XMEMCPY(current + added, &list->keyOID, sizeof(list->keyOID));
wolfSSL 0:9d17e4342598 3986 added += (int)sizeof(list->keyOID);
wolfSSL 0:9d17e4342598 3987
wolfSSL 0:9d17e4342598 3988 XMEMCPY(current + added, list->publicKey, list->pubKeySize);
wolfSSL 0:9d17e4342598 3989 added += list->pubKeySize;
wolfSSL 0:9d17e4342598 3990
wolfSSL 0:9d17e4342598 3991 XMEMCPY(current + added, &list->nameLen, sizeof(list->nameLen));
wolfSSL 0:9d17e4342598 3992 added += (int)sizeof(list->nameLen);
wolfSSL 0:9d17e4342598 3993
wolfSSL 0:9d17e4342598 3994 XMEMCPY(current + added, list->name, list->nameLen);
wolfSSL 0:9d17e4342598 3995 added += list->nameLen;
wolfSSL 0:9d17e4342598 3996
wolfSSL 0:9d17e4342598 3997 XMEMCPY(current + added, list->subjectNameHash, SIGNER_DIGEST_SIZE);
wolfSSL 0:9d17e4342598 3998 added += SIGNER_DIGEST_SIZE;
wolfSSL 0:9d17e4342598 3999
wolfSSL 0:9d17e4342598 4000 #ifndef NO_SKID
wolfSSL 0:9d17e4342598 4001 XMEMCPY(current + added, list->subjectKeyIdHash,SIGNER_DIGEST_SIZE);
wolfSSL 0:9d17e4342598 4002 added += SIGNER_DIGEST_SIZE;
wolfSSL 0:9d17e4342598 4003 #endif
wolfSSL 0:9d17e4342598 4004
wolfSSL 0:9d17e4342598 4005 list = list->next;
wolfSSL 0:9d17e4342598 4006 }
wolfSSL 0:9d17e4342598 4007
wolfSSL 0:9d17e4342598 4008 return added;
wolfSSL 0:9d17e4342598 4009 }
wolfSSL 0:9d17e4342598 4010
wolfSSL 0:9d17e4342598 4011
wolfSSL 0:9d17e4342598 4012 /* Persist cert cache to memory, have lock */
wolfSSL 0:9d17e4342598 4013 static INLINE int DoMemSaveCertCache(CYASSL_CERT_MANAGER* cm, void* mem, int sz)
wolfSSL 0:9d17e4342598 4014 {
wolfSSL 0:9d17e4342598 4015 int realSz;
wolfSSL 0:9d17e4342598 4016 int ret = SSL_SUCCESS;
wolfSSL 0:9d17e4342598 4017 int i;
wolfSSL 0:9d17e4342598 4018
wolfSSL 0:9d17e4342598 4019 CYASSL_ENTER("DoMemSaveCertCache");
wolfSSL 0:9d17e4342598 4020
wolfSSL 0:9d17e4342598 4021 realSz = GetCertCacheMemSize(cm);
wolfSSL 0:9d17e4342598 4022 if (realSz > sz) {
wolfSSL 0:9d17e4342598 4023 CYASSL_MSG("Mem output buffer too small");
wolfSSL 0:9d17e4342598 4024 ret = BUFFER_E;
wolfSSL 0:9d17e4342598 4025 }
wolfSSL 0:9d17e4342598 4026 else {
wolfSSL 0:9d17e4342598 4027 byte* current;
wolfSSL 0:9d17e4342598 4028 CertCacheHeader hdr;
wolfSSL 0:9d17e4342598 4029
wolfSSL 0:9d17e4342598 4030 hdr.version = CYASSL_CACHE_CERT_VERSION;
wolfSSL 0:9d17e4342598 4031 hdr.rows = CA_TABLE_SIZE;
wolfSSL 0:9d17e4342598 4032 SetCertHeaderColumns(cm, hdr.columns);
wolfSSL 0:9d17e4342598 4033 hdr.signerSz = (int)sizeof(Signer);
wolfSSL 0:9d17e4342598 4034
wolfSSL 0:9d17e4342598 4035 XMEMCPY(mem, &hdr, sizeof(CertCacheHeader));
wolfSSL 0:9d17e4342598 4036 current = (byte*)mem + sizeof(CertCacheHeader);
wolfSSL 0:9d17e4342598 4037
wolfSSL 0:9d17e4342598 4038 for (i = 0; i < CA_TABLE_SIZE; ++i)
wolfSSL 0:9d17e4342598 4039 current += StoreCertRow(cm, current, i);
wolfSSL 0:9d17e4342598 4040 }
wolfSSL 0:9d17e4342598 4041
wolfSSL 0:9d17e4342598 4042 return ret;
wolfSSL 0:9d17e4342598 4043 }
wolfSSL 0:9d17e4342598 4044
wolfSSL 0:9d17e4342598 4045
wolfSSL 0:9d17e4342598 4046 #if !defined(NO_FILESYSTEM)
wolfSSL 0:9d17e4342598 4047
wolfSSL 0:9d17e4342598 4048 /* Persist cert cache to file */
wolfSSL 0:9d17e4342598 4049 int CM_SaveCertCache(CYASSL_CERT_MANAGER* cm, const char* fname)
wolfSSL 0:9d17e4342598 4050 {
wolfSSL 0:9d17e4342598 4051 XFILE file;
wolfSSL 0:9d17e4342598 4052 int rc = SSL_SUCCESS;
wolfSSL 0:9d17e4342598 4053 int memSz;
wolfSSL 0:9d17e4342598 4054 byte* mem;
wolfSSL 0:9d17e4342598 4055
wolfSSL 0:9d17e4342598 4056 CYASSL_ENTER("CM_SaveCertCache");
wolfSSL 0:9d17e4342598 4057
wolfSSL 0:9d17e4342598 4058 file = XFOPEN(fname, "w+b");
wolfSSL 0:9d17e4342598 4059 if (file == XBADFILE) {
wolfSSL 0:9d17e4342598 4060 CYASSL_MSG("Couldn't open cert cache save file");
wolfSSL 0:9d17e4342598 4061 return SSL_BAD_FILE;
wolfSSL 0:9d17e4342598 4062 }
wolfSSL 0:9d17e4342598 4063
wolfSSL 0:9d17e4342598 4064 if (LockMutex(&cm->caLock) != 0) {
wolfSSL 0:9d17e4342598 4065 CYASSL_MSG("LockMutex on caLock failed");
wolfSSL 0:9d17e4342598 4066 XFCLOSE(file);
wolfSSL 0:9d17e4342598 4067 return BAD_MUTEX_E;
wolfSSL 0:9d17e4342598 4068 }
wolfSSL 0:9d17e4342598 4069
wolfSSL 0:9d17e4342598 4070 memSz = GetCertCacheMemSize(cm);
wolfSSL 0:9d17e4342598 4071 mem = (byte*)XMALLOC(memSz, cm->heap, DYNAMIC_TYPE_TMP_BUFFER);
wolfSSL 0:9d17e4342598 4072 if (mem == NULL) {
wolfSSL 0:9d17e4342598 4073 CYASSL_MSG("Alloc for tmp buffer failed");
wolfSSL 0:9d17e4342598 4074 rc = MEMORY_E;
wolfSSL 0:9d17e4342598 4075 } else {
wolfSSL 0:9d17e4342598 4076 rc = DoMemSaveCertCache(cm, mem, memSz);
wolfSSL 0:9d17e4342598 4077 if (rc == SSL_SUCCESS) {
wolfSSL 0:9d17e4342598 4078 int ret = (int)XFWRITE(mem, memSz, 1, file);
wolfSSL 0:9d17e4342598 4079 if (ret != 1) {
wolfSSL 0:9d17e4342598 4080 CYASSL_MSG("Cert cache file write failed");
wolfSSL 0:9d17e4342598 4081 rc = FWRITE_ERROR;
wolfSSL 0:9d17e4342598 4082 }
wolfSSL 0:9d17e4342598 4083 }
wolfSSL 0:9d17e4342598 4084 XFREE(mem, cm->heap, DYNAMIC_TYPE_TMP_BUFFER);
wolfSSL 0:9d17e4342598 4085 }
wolfSSL 0:9d17e4342598 4086
wolfSSL 0:9d17e4342598 4087 UnLockMutex(&cm->caLock);
wolfSSL 0:9d17e4342598 4088 XFCLOSE(file);
wolfSSL 0:9d17e4342598 4089
wolfSSL 0:9d17e4342598 4090 return rc;
wolfSSL 0:9d17e4342598 4091 }
wolfSSL 0:9d17e4342598 4092
wolfSSL 0:9d17e4342598 4093
wolfSSL 0:9d17e4342598 4094 /* Restore cert cache from file */
wolfSSL 0:9d17e4342598 4095 int CM_RestoreCertCache(CYASSL_CERT_MANAGER* cm, const char* fname)
wolfSSL 0:9d17e4342598 4096 {
wolfSSL 0:9d17e4342598 4097 XFILE file;
wolfSSL 0:9d17e4342598 4098 int rc = SSL_SUCCESS;
wolfSSL 0:9d17e4342598 4099 int ret;
wolfSSL 0:9d17e4342598 4100 int memSz;
wolfSSL 0:9d17e4342598 4101 byte* mem;
wolfSSL 0:9d17e4342598 4102
wolfSSL 0:9d17e4342598 4103 CYASSL_ENTER("CM_RestoreCertCache");
wolfSSL 0:9d17e4342598 4104
wolfSSL 0:9d17e4342598 4105 file = XFOPEN(fname, "rb");
wolfSSL 0:9d17e4342598 4106 if (file == XBADFILE) {
wolfSSL 0:9d17e4342598 4107 CYASSL_MSG("Couldn't open cert cache save file");
wolfSSL 0:9d17e4342598 4108 return SSL_BAD_FILE;
wolfSSL 0:9d17e4342598 4109 }
wolfSSL 0:9d17e4342598 4110
wolfSSL 0:9d17e4342598 4111 XFSEEK(file, 0, XSEEK_END);
wolfSSL 0:9d17e4342598 4112 memSz = (int)XFTELL(file);
wolfSSL 0:9d17e4342598 4113 XREWIND(file);
wolfSSL 0:9d17e4342598 4114
wolfSSL 0:9d17e4342598 4115 if (memSz <= 0) {
wolfSSL 0:9d17e4342598 4116 CYASSL_MSG("Bad file size");
wolfSSL 0:9d17e4342598 4117 XFCLOSE(file);
wolfSSL 0:9d17e4342598 4118 return SSL_BAD_FILE;
wolfSSL 0:9d17e4342598 4119 }
wolfSSL 0:9d17e4342598 4120
wolfSSL 0:9d17e4342598 4121 mem = (byte*)XMALLOC(memSz, cm->heap, DYNAMIC_TYPE_TMP_BUFFER);
wolfSSL 0:9d17e4342598 4122 if (mem == NULL) {
wolfSSL 0:9d17e4342598 4123 CYASSL_MSG("Alloc for tmp buffer failed");
wolfSSL 0:9d17e4342598 4124 XFCLOSE(file);
wolfSSL 0:9d17e4342598 4125 return MEMORY_E;
wolfSSL 0:9d17e4342598 4126 }
wolfSSL 0:9d17e4342598 4127
wolfSSL 0:9d17e4342598 4128 ret = (int)XFREAD(mem, memSz, 1, file);
wolfSSL 0:9d17e4342598 4129 if (ret != 1) {
wolfSSL 0:9d17e4342598 4130 CYASSL_MSG("Cert file read error");
wolfSSL 0:9d17e4342598 4131 rc = FREAD_ERROR;
wolfSSL 0:9d17e4342598 4132 } else {
wolfSSL 0:9d17e4342598 4133 rc = CM_MemRestoreCertCache(cm, mem, memSz);
wolfSSL 0:9d17e4342598 4134 if (rc != SSL_SUCCESS) {
wolfSSL 0:9d17e4342598 4135 CYASSL_MSG("Mem restore cert cache failed");
wolfSSL 0:9d17e4342598 4136 }
wolfSSL 0:9d17e4342598 4137 }
wolfSSL 0:9d17e4342598 4138
wolfSSL 0:9d17e4342598 4139 XFREE(mem, cm->heap, DYNAMIC_TYPE_TMP_BUFFER);
wolfSSL 0:9d17e4342598 4140 XFCLOSE(file);
wolfSSL 0:9d17e4342598 4141
wolfSSL 0:9d17e4342598 4142 return rc;
wolfSSL 0:9d17e4342598 4143 }
wolfSSL 0:9d17e4342598 4144
wolfSSL 0:9d17e4342598 4145 #endif /* NO_FILESYSTEM */
wolfSSL 0:9d17e4342598 4146
wolfSSL 0:9d17e4342598 4147
wolfSSL 0:9d17e4342598 4148 /* Persist cert cache to memory */
wolfSSL 0:9d17e4342598 4149 int CM_MemSaveCertCache(CYASSL_CERT_MANAGER* cm, void* mem, int sz, int* used)
wolfSSL 0:9d17e4342598 4150 {
wolfSSL 0:9d17e4342598 4151 int ret = SSL_SUCCESS;
wolfSSL 0:9d17e4342598 4152
wolfSSL 0:9d17e4342598 4153 CYASSL_ENTER("CM_MemSaveCertCache");
wolfSSL 0:9d17e4342598 4154
wolfSSL 0:9d17e4342598 4155 if (LockMutex(&cm->caLock) != 0) {
wolfSSL 0:9d17e4342598 4156 CYASSL_MSG("LockMutex on caLock failed");
wolfSSL 0:9d17e4342598 4157 return BAD_MUTEX_E;
wolfSSL 0:9d17e4342598 4158 }
wolfSSL 0:9d17e4342598 4159
wolfSSL 0:9d17e4342598 4160 ret = DoMemSaveCertCache(cm, mem, sz);
wolfSSL 0:9d17e4342598 4161 if (ret == SSL_SUCCESS)
wolfSSL 0:9d17e4342598 4162 *used = GetCertCacheMemSize(cm);
wolfSSL 0:9d17e4342598 4163
wolfSSL 0:9d17e4342598 4164 UnLockMutex(&cm->caLock);
wolfSSL 0:9d17e4342598 4165
wolfSSL 0:9d17e4342598 4166 return ret;
wolfSSL 0:9d17e4342598 4167 }
wolfSSL 0:9d17e4342598 4168
wolfSSL 0:9d17e4342598 4169
wolfSSL 0:9d17e4342598 4170 /* Restore cert cache from memory */
wolfSSL 0:9d17e4342598 4171 int CM_MemRestoreCertCache(CYASSL_CERT_MANAGER* cm, const void* mem, int sz)
wolfSSL 0:9d17e4342598 4172 {
wolfSSL 0:9d17e4342598 4173 int ret = SSL_SUCCESS;
wolfSSL 0:9d17e4342598 4174 int i;
wolfSSL 0:9d17e4342598 4175 CertCacheHeader* hdr = (CertCacheHeader*)mem;
wolfSSL 0:9d17e4342598 4176 byte* current = (byte*)mem + sizeof(CertCacheHeader);
wolfSSL 0:9d17e4342598 4177 byte* end = (byte*)mem + sz; /* don't go over */
wolfSSL 0:9d17e4342598 4178
wolfSSL 0:9d17e4342598 4179 CYASSL_ENTER("CM_MemRestoreCertCache");
wolfSSL 0:9d17e4342598 4180
wolfSSL 0:9d17e4342598 4181 if (current > end) {
wolfSSL 0:9d17e4342598 4182 CYASSL_MSG("Cert Cache Memory buffer too small");
wolfSSL 0:9d17e4342598 4183 return BUFFER_E;
wolfSSL 0:9d17e4342598 4184 }
wolfSSL 0:9d17e4342598 4185
wolfSSL 0:9d17e4342598 4186 if (hdr->version != CYASSL_CACHE_CERT_VERSION ||
wolfSSL 0:9d17e4342598 4187 hdr->rows != CA_TABLE_SIZE ||
wolfSSL 0:9d17e4342598 4188 hdr->signerSz != (int)sizeof(Signer)) {
wolfSSL 0:9d17e4342598 4189
wolfSSL 0:9d17e4342598 4190 CYASSL_MSG("Cert Cache Memory header mismatch");
wolfSSL 0:9d17e4342598 4191 return CACHE_MATCH_ERROR;
wolfSSL 0:9d17e4342598 4192 }
wolfSSL 0:9d17e4342598 4193
wolfSSL 0:9d17e4342598 4194 if (LockMutex(&cm->caLock) != 0) {
wolfSSL 0:9d17e4342598 4195 CYASSL_MSG("LockMutex on caLock failed");
wolfSSL 0:9d17e4342598 4196 return BAD_MUTEX_E;
wolfSSL 0:9d17e4342598 4197 }
wolfSSL 0:9d17e4342598 4198
wolfSSL 0:9d17e4342598 4199 FreeSignerTable(cm->caTable, CA_TABLE_SIZE, cm->heap);
wolfSSL 0:9d17e4342598 4200
wolfSSL 0:9d17e4342598 4201 for (i = 0; i < CA_TABLE_SIZE; ++i) {
wolfSSL 0:9d17e4342598 4202 int added = RestoreCertRow(cm, current, i, hdr->columns[i], end);
wolfSSL 0:9d17e4342598 4203 if (added < 0) {
wolfSSL 0:9d17e4342598 4204 CYASSL_MSG("RestoreCertRow error");
wolfSSL 0:9d17e4342598 4205 ret = added;
wolfSSL 0:9d17e4342598 4206 break;
wolfSSL 0:9d17e4342598 4207 }
wolfSSL 0:9d17e4342598 4208 current += added;
wolfSSL 0:9d17e4342598 4209 }
wolfSSL 0:9d17e4342598 4210
wolfSSL 0:9d17e4342598 4211 UnLockMutex(&cm->caLock);
wolfSSL 0:9d17e4342598 4212
wolfSSL 0:9d17e4342598 4213 return ret;
wolfSSL 0:9d17e4342598 4214 }
wolfSSL 0:9d17e4342598 4215
wolfSSL 0:9d17e4342598 4216
wolfSSL 0:9d17e4342598 4217 /* get how big the the cert cache save buffer needs to be */
wolfSSL 0:9d17e4342598 4218 int CM_GetCertCacheMemSize(CYASSL_CERT_MANAGER* cm)
wolfSSL 0:9d17e4342598 4219 {
wolfSSL 0:9d17e4342598 4220 int sz;
wolfSSL 0:9d17e4342598 4221
wolfSSL 0:9d17e4342598 4222 CYASSL_ENTER("CM_GetCertCacheMemSize");
wolfSSL 0:9d17e4342598 4223
wolfSSL 0:9d17e4342598 4224 if (LockMutex(&cm->caLock) != 0) {
wolfSSL 0:9d17e4342598 4225 CYASSL_MSG("LockMutex on caLock failed");
wolfSSL 0:9d17e4342598 4226 return BAD_MUTEX_E;
wolfSSL 0:9d17e4342598 4227 }
wolfSSL 0:9d17e4342598 4228
wolfSSL 0:9d17e4342598 4229 sz = GetCertCacheMemSize(cm);
wolfSSL 0:9d17e4342598 4230
wolfSSL 0:9d17e4342598 4231 UnLockMutex(&cm->caLock);
wolfSSL 0:9d17e4342598 4232
wolfSSL 0:9d17e4342598 4233 return sz;
wolfSSL 0:9d17e4342598 4234 }
wolfSSL 0:9d17e4342598 4235
wolfSSL 0:9d17e4342598 4236 #endif /* PERSIST_CERT_CACHE */
wolfSSL 0:9d17e4342598 4237 #endif /* NO_CERTS */
wolfSSL 0:9d17e4342598 4238
wolfSSL 0:9d17e4342598 4239
wolfSSL 0:9d17e4342598 4240 int CyaSSL_CTX_set_cipher_list(CYASSL_CTX* ctx, const char* list)
wolfSSL 0:9d17e4342598 4241 {
wolfSSL 0:9d17e4342598 4242 CYASSL_ENTER("CyaSSL_CTX_set_cipher_list");
wolfSSL 0:9d17e4342598 4243 if (SetCipherList(&ctx->suites, list))
wolfSSL 0:9d17e4342598 4244 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 4245 else
wolfSSL 0:9d17e4342598 4246 return SSL_FAILURE;
wolfSSL 0:9d17e4342598 4247 }
wolfSSL 0:9d17e4342598 4248
wolfSSL 0:9d17e4342598 4249
wolfSSL 0:9d17e4342598 4250 int CyaSSL_set_cipher_list(CYASSL* ssl, const char* list)
wolfSSL 0:9d17e4342598 4251 {
wolfSSL 0:9d17e4342598 4252 CYASSL_ENTER("CyaSSL_set_cipher_list");
wolfSSL 0:9d17e4342598 4253 if (SetCipherList(ssl->suites, list)) {
wolfSSL 0:9d17e4342598 4254 byte haveRSA = 1;
wolfSSL 0:9d17e4342598 4255 byte havePSK = 0;
wolfSSL 0:9d17e4342598 4256
wolfSSL 0:9d17e4342598 4257 #ifdef NO_RSA
wolfSSL 0:9d17e4342598 4258 haveRSA = 0;
wolfSSL 0:9d17e4342598 4259 #endif
wolfSSL 0:9d17e4342598 4260 #ifndef NO_PSK
wolfSSL 0:9d17e4342598 4261 havePSK = ssl->options.havePSK;
wolfSSL 0:9d17e4342598 4262 #endif
wolfSSL 0:9d17e4342598 4263
wolfSSL 0:9d17e4342598 4264 InitSuites(ssl->suites, ssl->version, haveRSA, havePSK,
wolfSSL 0:9d17e4342598 4265 ssl->options.haveDH, ssl->options.haveNTRU,
wolfSSL 0:9d17e4342598 4266 ssl->options.haveECDSAsig, ssl->options.haveStaticECC,
wolfSSL 0:9d17e4342598 4267 ssl->options.side);
wolfSSL 0:9d17e4342598 4268
wolfSSL 0:9d17e4342598 4269 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 4270 }
wolfSSL 0:9d17e4342598 4271 else
wolfSSL 0:9d17e4342598 4272 return SSL_FAILURE;
wolfSSL 0:9d17e4342598 4273 }
wolfSSL 0:9d17e4342598 4274
wolfSSL 0:9d17e4342598 4275
wolfSSL 0:9d17e4342598 4276 #ifndef CYASSL_LEANPSK
wolfSSL 0:9d17e4342598 4277 #ifdef CYASSL_DTLS
wolfSSL 0:9d17e4342598 4278
wolfSSL 0:9d17e4342598 4279 int CyaSSL_dtls_get_current_timeout(CYASSL* ssl)
wolfSSL 0:9d17e4342598 4280 {
wolfSSL 0:9d17e4342598 4281 (void)ssl;
wolfSSL 0:9d17e4342598 4282
wolfSSL 0:9d17e4342598 4283 return ssl->dtls_timeout;
wolfSSL 0:9d17e4342598 4284 }
wolfSSL 0:9d17e4342598 4285
wolfSSL 0:9d17e4342598 4286
wolfSSL 0:9d17e4342598 4287 /* user may need to alter init dtls recv timeout, SSL_SUCCESS on ok */
wolfSSL 0:9d17e4342598 4288 int CyaSSL_dtls_set_timeout_init(CYASSL* ssl, int timeout)
wolfSSL 0:9d17e4342598 4289 {
wolfSSL 0:9d17e4342598 4290 if (ssl == NULL || timeout < 0)
wolfSSL 0:9d17e4342598 4291 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 4292
wolfSSL 0:9d17e4342598 4293 if (timeout > ssl->dtls_timeout_max) {
wolfSSL 0:9d17e4342598 4294 CYASSL_MSG("Can't set dtls timeout init greater than dtls timeout max");
wolfSSL 0:9d17e4342598 4295 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 4296 }
wolfSSL 0:9d17e4342598 4297
wolfSSL 0:9d17e4342598 4298 ssl->dtls_timeout_init = timeout;
wolfSSL 0:9d17e4342598 4299 ssl->dtls_timeout = timeout;
wolfSSL 0:9d17e4342598 4300
wolfSSL 0:9d17e4342598 4301 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 4302 }
wolfSSL 0:9d17e4342598 4303
wolfSSL 0:9d17e4342598 4304
wolfSSL 0:9d17e4342598 4305 /* user may need to alter max dtls recv timeout, SSL_SUCCESS on ok */
wolfSSL 0:9d17e4342598 4306 int CyaSSL_dtls_set_timeout_max(CYASSL* ssl, int timeout)
wolfSSL 0:9d17e4342598 4307 {
wolfSSL 0:9d17e4342598 4308 if (ssl == NULL || timeout < 0)
wolfSSL 0:9d17e4342598 4309 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 4310
wolfSSL 0:9d17e4342598 4311 if (timeout < ssl->dtls_timeout_init) {
wolfSSL 0:9d17e4342598 4312 CYASSL_MSG("Can't set dtls timeout max less than dtls timeout init");
wolfSSL 0:9d17e4342598 4313 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 4314 }
wolfSSL 0:9d17e4342598 4315
wolfSSL 0:9d17e4342598 4316 ssl->dtls_timeout_max = timeout;
wolfSSL 0:9d17e4342598 4317
wolfSSL 0:9d17e4342598 4318 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 4319 }
wolfSSL 0:9d17e4342598 4320
wolfSSL 0:9d17e4342598 4321
wolfSSL 0:9d17e4342598 4322 int CyaSSL_dtls_got_timeout(CYASSL* ssl)
wolfSSL 0:9d17e4342598 4323 {
wolfSSL 0:9d17e4342598 4324 int result = SSL_SUCCESS;
wolfSSL 0:9d17e4342598 4325
wolfSSL 0:9d17e4342598 4326 DtlsMsgListDelete(ssl->dtls_msg_list, ssl->heap);
wolfSSL 0:9d17e4342598 4327 ssl->dtls_msg_list = NULL;
wolfSSL 0:9d17e4342598 4328 if (DtlsPoolTimeout(ssl) < 0 || DtlsPoolSend(ssl) < 0) {
wolfSSL 0:9d17e4342598 4329 result = SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 4330 }
wolfSSL 0:9d17e4342598 4331 return result;
wolfSSL 0:9d17e4342598 4332 }
wolfSSL 0:9d17e4342598 4333
wolfSSL 0:9d17e4342598 4334 #endif /* DTLS */
wolfSSL 0:9d17e4342598 4335 #endif /* LEANPSK */
wolfSSL 0:9d17e4342598 4336
wolfSSL 0:9d17e4342598 4337
wolfSSL 0:9d17e4342598 4338 /* client only parts */
wolfSSL 0:9d17e4342598 4339 #ifndef NO_CYASSL_CLIENT
wolfSSL 0:9d17e4342598 4340
wolfSSL 0:9d17e4342598 4341 #ifndef NO_OLD_TLS
wolfSSL 0:9d17e4342598 4342 CYASSL_METHOD* CyaSSLv3_client_method(void)
wolfSSL 0:9d17e4342598 4343 {
wolfSSL 0:9d17e4342598 4344 CYASSL_METHOD* method =
wolfSSL 0:9d17e4342598 4345 (CYASSL_METHOD*) XMALLOC(sizeof(CYASSL_METHOD), 0,
wolfSSL 0:9d17e4342598 4346 DYNAMIC_TYPE_METHOD);
wolfSSL 0:9d17e4342598 4347 CYASSL_ENTER("SSLv3_client_method");
wolfSSL 0:9d17e4342598 4348 if (method)
wolfSSL 0:9d17e4342598 4349 InitSSL_Method(method, MakeSSLv3());
wolfSSL 0:9d17e4342598 4350 return method;
wolfSSL 0:9d17e4342598 4351 }
wolfSSL 0:9d17e4342598 4352 #endif
wolfSSL 0:9d17e4342598 4353
wolfSSL 0:9d17e4342598 4354 #ifdef CYASSL_DTLS
wolfSSL 0:9d17e4342598 4355 CYASSL_METHOD* CyaDTLSv1_client_method(void)
wolfSSL 0:9d17e4342598 4356 {
wolfSSL 0:9d17e4342598 4357 CYASSL_METHOD* method =
wolfSSL 0:9d17e4342598 4358 (CYASSL_METHOD*) XMALLOC(sizeof(CYASSL_METHOD), 0,
wolfSSL 0:9d17e4342598 4359 DYNAMIC_TYPE_METHOD);
wolfSSL 0:9d17e4342598 4360 CYASSL_ENTER("DTLSv1_client_method");
wolfSSL 0:9d17e4342598 4361 if (method)
wolfSSL 0:9d17e4342598 4362 InitSSL_Method(method, MakeDTLSv1());
wolfSSL 0:9d17e4342598 4363 return method;
wolfSSL 0:9d17e4342598 4364 }
wolfSSL 0:9d17e4342598 4365
wolfSSL 0:9d17e4342598 4366 CYASSL_METHOD* CyaDTLSv1_2_client_method(void)
wolfSSL 0:9d17e4342598 4367 {
wolfSSL 0:9d17e4342598 4368 CYASSL_METHOD* method =
wolfSSL 0:9d17e4342598 4369 (CYASSL_METHOD*) XMALLOC(sizeof(CYASSL_METHOD), 0,
wolfSSL 0:9d17e4342598 4370 DYNAMIC_TYPE_METHOD);
wolfSSL 0:9d17e4342598 4371 CYASSL_ENTER("DTLSv1_2_client_method");
wolfSSL 0:9d17e4342598 4372 if (method)
wolfSSL 0:9d17e4342598 4373 InitSSL_Method(method, MakeDTLSv1_2());
wolfSSL 0:9d17e4342598 4374 return method;
wolfSSL 0:9d17e4342598 4375 }
wolfSSL 0:9d17e4342598 4376 #endif
wolfSSL 0:9d17e4342598 4377
wolfSSL 0:9d17e4342598 4378
wolfSSL 0:9d17e4342598 4379 /* please see note at top of README if you get an error from connect */
wolfSSL 0:9d17e4342598 4380 int CyaSSL_connect(CYASSL* ssl)
wolfSSL 0:9d17e4342598 4381 {
wolfSSL 0:9d17e4342598 4382 int neededState;
wolfSSL 0:9d17e4342598 4383
wolfSSL 0:9d17e4342598 4384 CYASSL_ENTER("SSL_connect()");
wolfSSL 0:9d17e4342598 4385
wolfSSL 0:9d17e4342598 4386 #ifdef HAVE_ERRNO_H
wolfSSL 0:9d17e4342598 4387 errno = 0;
wolfSSL 0:9d17e4342598 4388 #endif
wolfSSL 0:9d17e4342598 4389
wolfSSL 0:9d17e4342598 4390 if (ssl->options.side != CYASSL_CLIENT_END) {
wolfSSL 0:9d17e4342598 4391 CYASSL_ERROR(ssl->error = SIDE_ERROR);
wolfSSL 0:9d17e4342598 4392 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 4393 }
wolfSSL 0:9d17e4342598 4394
wolfSSL 0:9d17e4342598 4395 #ifdef CYASSL_DTLS
wolfSSL 0:9d17e4342598 4396 if (ssl->version.major == DTLS_MAJOR) {
wolfSSL 0:9d17e4342598 4397 ssl->options.dtls = 1;
wolfSSL 0:9d17e4342598 4398 ssl->options.tls = 1;
wolfSSL 0:9d17e4342598 4399 ssl->options.tls1_1 = 1;
wolfSSL 0:9d17e4342598 4400
wolfSSL 0:9d17e4342598 4401 if (DtlsPoolInit(ssl) != 0) {
wolfSSL 0:9d17e4342598 4402 ssl->error = MEMORY_ERROR;
wolfSSL 0:9d17e4342598 4403 CYASSL_ERROR(ssl->error);
wolfSSL 0:9d17e4342598 4404 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 4405 }
wolfSSL 0:9d17e4342598 4406 }
wolfSSL 0:9d17e4342598 4407 #endif
wolfSSL 0:9d17e4342598 4408
wolfSSL 0:9d17e4342598 4409 if (ssl->buffers.outputBuffer.length > 0) {
wolfSSL 0:9d17e4342598 4410 if ( (ssl->error = SendBuffered(ssl)) == 0) {
wolfSSL 0:9d17e4342598 4411 ssl->options.connectState++;
wolfSSL 0:9d17e4342598 4412 CYASSL_MSG("connect state: Advanced from buffered send");
wolfSSL 0:9d17e4342598 4413 }
wolfSSL 0:9d17e4342598 4414 else {
wolfSSL 0:9d17e4342598 4415 CYASSL_ERROR(ssl->error);
wolfSSL 0:9d17e4342598 4416 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 4417 }
wolfSSL 0:9d17e4342598 4418 }
wolfSSL 0:9d17e4342598 4419
wolfSSL 0:9d17e4342598 4420 switch (ssl->options.connectState) {
wolfSSL 0:9d17e4342598 4421
wolfSSL 0:9d17e4342598 4422 case CONNECT_BEGIN :
wolfSSL 0:9d17e4342598 4423 /* always send client hello first */
wolfSSL 0:9d17e4342598 4424 if ( (ssl->error = SendClientHello(ssl)) != 0) {
wolfSSL 0:9d17e4342598 4425 CYASSL_ERROR(ssl->error);
wolfSSL 0:9d17e4342598 4426 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 4427 }
wolfSSL 0:9d17e4342598 4428 ssl->options.connectState = CLIENT_HELLO_SENT;
wolfSSL 0:9d17e4342598 4429 CYASSL_MSG("connect state: CLIENT_HELLO_SENT");
wolfSSL 0:9d17e4342598 4430
wolfSSL 0:9d17e4342598 4431 case CLIENT_HELLO_SENT :
wolfSSL 0:9d17e4342598 4432 neededState = ssl->options.resuming ? SERVER_FINISHED_COMPLETE :
wolfSSL 0:9d17e4342598 4433 SERVER_HELLODONE_COMPLETE;
wolfSSL 0:9d17e4342598 4434 #ifdef CYASSL_DTLS
wolfSSL 0:9d17e4342598 4435 /* In DTLS, when resuming, we can go straight to FINISHED,
wolfSSL 0:9d17e4342598 4436 * or do a cookie exchange and then skip to FINISHED, assume
wolfSSL 0:9d17e4342598 4437 * we need the cookie exchange first. */
wolfSSL 0:9d17e4342598 4438 if (ssl->options.dtls)
wolfSSL 0:9d17e4342598 4439 neededState = SERVER_HELLOVERIFYREQUEST_COMPLETE;
wolfSSL 0:9d17e4342598 4440 #endif
wolfSSL 0:9d17e4342598 4441 /* get response */
wolfSSL 0:9d17e4342598 4442 while (ssl->options.serverState < neededState) {
wolfSSL 0:9d17e4342598 4443 if ( (ssl->error = ProcessReply(ssl)) < 0) {
wolfSSL 0:9d17e4342598 4444 CYASSL_ERROR(ssl->error);
wolfSSL 0:9d17e4342598 4445 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 4446 }
wolfSSL 0:9d17e4342598 4447 /* if resumption failed, reset needed state */
wolfSSL 0:9d17e4342598 4448 else if (neededState == SERVER_FINISHED_COMPLETE)
wolfSSL 0:9d17e4342598 4449 if (!ssl->options.resuming) {
wolfSSL 0:9d17e4342598 4450 if (!ssl->options.dtls)
wolfSSL 0:9d17e4342598 4451 neededState = SERVER_HELLODONE_COMPLETE;
wolfSSL 0:9d17e4342598 4452 else
wolfSSL 0:9d17e4342598 4453 neededState = SERVER_HELLOVERIFYREQUEST_COMPLETE;
wolfSSL 0:9d17e4342598 4454 }
wolfSSL 0:9d17e4342598 4455 }
wolfSSL 0:9d17e4342598 4456
wolfSSL 0:9d17e4342598 4457 ssl->options.connectState = HELLO_AGAIN;
wolfSSL 0:9d17e4342598 4458 CYASSL_MSG("connect state: HELLO_AGAIN");
wolfSSL 0:9d17e4342598 4459
wolfSSL 0:9d17e4342598 4460 case HELLO_AGAIN :
wolfSSL 0:9d17e4342598 4461 if (ssl->options.certOnly)
wolfSSL 0:9d17e4342598 4462 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 4463
wolfSSL 0:9d17e4342598 4464 #ifdef CYASSL_DTLS
wolfSSL 0:9d17e4342598 4465 if (ssl->options.dtls) {
wolfSSL 0:9d17e4342598 4466 /* re-init hashes, exclude first hello and verify request */
wolfSSL 0:9d17e4342598 4467 #ifndef NO_OLD_TLS
wolfSSL 0:9d17e4342598 4468 InitMd5(&ssl->hashMd5);
wolfSSL 0:9d17e4342598 4469 if ( (ssl->error = InitSha(&ssl->hashSha)) != 0) {
wolfSSL 0:9d17e4342598 4470 CYASSL_ERROR(ssl->error);
wolfSSL 0:9d17e4342598 4471 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 4472 }
wolfSSL 0:9d17e4342598 4473 #endif
wolfSSL 0:9d17e4342598 4474 if (IsAtLeastTLSv1_2(ssl)) {
wolfSSL 0:9d17e4342598 4475 #ifndef NO_SHA256
wolfSSL 0:9d17e4342598 4476 if ( (ssl->error =
wolfSSL 0:9d17e4342598 4477 InitSha256(&ssl->hashSha256)) != 0) {
wolfSSL 0:9d17e4342598 4478 CYASSL_ERROR(ssl->error);
wolfSSL 0:9d17e4342598 4479 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 4480 }
wolfSSL 0:9d17e4342598 4481 #endif
wolfSSL 0:9d17e4342598 4482 #ifdef CYASSL_SHA384
wolfSSL 0:9d17e4342598 4483 if ( (ssl->error =
wolfSSL 0:9d17e4342598 4484 InitSha384(&ssl->hashSha384)) != 0) {
wolfSSL 0:9d17e4342598 4485 CYASSL_ERROR(ssl->error);
wolfSSL 0:9d17e4342598 4486 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 4487 }
wolfSSL 0:9d17e4342598 4488 #endif
wolfSSL 0:9d17e4342598 4489 }
wolfSSL 0:9d17e4342598 4490 if ( (ssl->error = SendClientHello(ssl)) != 0) {
wolfSSL 0:9d17e4342598 4491 CYASSL_ERROR(ssl->error);
wolfSSL 0:9d17e4342598 4492 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 4493 }
wolfSSL 0:9d17e4342598 4494 }
wolfSSL 0:9d17e4342598 4495 #endif
wolfSSL 0:9d17e4342598 4496
wolfSSL 0:9d17e4342598 4497 ssl->options.connectState = HELLO_AGAIN_REPLY;
wolfSSL 0:9d17e4342598 4498 CYASSL_MSG("connect state: HELLO_AGAIN_REPLY");
wolfSSL 0:9d17e4342598 4499
wolfSSL 0:9d17e4342598 4500 case HELLO_AGAIN_REPLY :
wolfSSL 0:9d17e4342598 4501 #ifdef CYASSL_DTLS
wolfSSL 0:9d17e4342598 4502 if (ssl->options.dtls) {
wolfSSL 0:9d17e4342598 4503 neededState = ssl->options.resuming ?
wolfSSL 0:9d17e4342598 4504 SERVER_FINISHED_COMPLETE : SERVER_HELLODONE_COMPLETE;
wolfSSL 0:9d17e4342598 4505
wolfSSL 0:9d17e4342598 4506 /* get response */
wolfSSL 0:9d17e4342598 4507 while (ssl->options.serverState < neededState) {
wolfSSL 0:9d17e4342598 4508 if ( (ssl->error = ProcessReply(ssl)) < 0) {
wolfSSL 0:9d17e4342598 4509 CYASSL_ERROR(ssl->error);
wolfSSL 0:9d17e4342598 4510 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 4511 }
wolfSSL 0:9d17e4342598 4512 /* if resumption failed, reset needed state */
wolfSSL 0:9d17e4342598 4513 else if (neededState == SERVER_FINISHED_COMPLETE)
wolfSSL 0:9d17e4342598 4514 if (!ssl->options.resuming)
wolfSSL 0:9d17e4342598 4515 neededState = SERVER_HELLODONE_COMPLETE;
wolfSSL 0:9d17e4342598 4516 }
wolfSSL 0:9d17e4342598 4517 }
wolfSSL 0:9d17e4342598 4518 #endif
wolfSSL 0:9d17e4342598 4519
wolfSSL 0:9d17e4342598 4520 ssl->options.connectState = FIRST_REPLY_DONE;
wolfSSL 0:9d17e4342598 4521 CYASSL_MSG("connect state: FIRST_REPLY_DONE");
wolfSSL 0:9d17e4342598 4522
wolfSSL 0:9d17e4342598 4523 case FIRST_REPLY_DONE :
wolfSSL 0:9d17e4342598 4524 #ifndef NO_CERTS
wolfSSL 0:9d17e4342598 4525 if (ssl->options.sendVerify) {
wolfSSL 0:9d17e4342598 4526 if ( (ssl->error = SendCertificate(ssl)) != 0) {
wolfSSL 0:9d17e4342598 4527 CYASSL_ERROR(ssl->error);
wolfSSL 0:9d17e4342598 4528 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 4529 }
wolfSSL 0:9d17e4342598 4530 CYASSL_MSG("sent: certificate");
wolfSSL 0:9d17e4342598 4531 }
wolfSSL 0:9d17e4342598 4532
wolfSSL 0:9d17e4342598 4533 #endif
wolfSSL 0:9d17e4342598 4534 ssl->options.connectState = FIRST_REPLY_FIRST;
wolfSSL 0:9d17e4342598 4535 CYASSL_MSG("connect state: FIRST_REPLY_FIRST");
wolfSSL 0:9d17e4342598 4536
wolfSSL 0:9d17e4342598 4537 case FIRST_REPLY_FIRST :
wolfSSL 0:9d17e4342598 4538 if (!ssl->options.resuming) {
wolfSSL 0:9d17e4342598 4539 if ( (ssl->error = SendClientKeyExchange(ssl)) != 0) {
wolfSSL 0:9d17e4342598 4540 CYASSL_ERROR(ssl->error);
wolfSSL 0:9d17e4342598 4541 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 4542 }
wolfSSL 0:9d17e4342598 4543 CYASSL_MSG("sent: client key exchange");
wolfSSL 0:9d17e4342598 4544 }
wolfSSL 0:9d17e4342598 4545
wolfSSL 0:9d17e4342598 4546 ssl->options.connectState = FIRST_REPLY_SECOND;
wolfSSL 0:9d17e4342598 4547 CYASSL_MSG("connect state: FIRST_REPLY_SECOND");
wolfSSL 0:9d17e4342598 4548
wolfSSL 0:9d17e4342598 4549 case FIRST_REPLY_SECOND :
wolfSSL 0:9d17e4342598 4550 #ifndef NO_CERTS
wolfSSL 0:9d17e4342598 4551 if (ssl->options.sendVerify) {
wolfSSL 0:9d17e4342598 4552 if ( (ssl->error = SendCertificateVerify(ssl)) != 0) {
wolfSSL 0:9d17e4342598 4553 CYASSL_ERROR(ssl->error);
wolfSSL 0:9d17e4342598 4554 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 4555 }
wolfSSL 0:9d17e4342598 4556 CYASSL_MSG("sent: certificate verify");
wolfSSL 0:9d17e4342598 4557 }
wolfSSL 0:9d17e4342598 4558 #endif
wolfSSL 0:9d17e4342598 4559 ssl->options.connectState = FIRST_REPLY_THIRD;
wolfSSL 0:9d17e4342598 4560 CYASSL_MSG("connect state: FIRST_REPLY_THIRD");
wolfSSL 0:9d17e4342598 4561
wolfSSL 0:9d17e4342598 4562 case FIRST_REPLY_THIRD :
wolfSSL 0:9d17e4342598 4563 if ( (ssl->error = SendChangeCipher(ssl)) != 0) {
wolfSSL 0:9d17e4342598 4564 CYASSL_ERROR(ssl->error);
wolfSSL 0:9d17e4342598 4565 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 4566 }
wolfSSL 0:9d17e4342598 4567 CYASSL_MSG("sent: change cipher spec");
wolfSSL 0:9d17e4342598 4568 ssl->options.connectState = FIRST_REPLY_FOURTH;
wolfSSL 0:9d17e4342598 4569 CYASSL_MSG("connect state: FIRST_REPLY_FOURTH");
wolfSSL 0:9d17e4342598 4570
wolfSSL 0:9d17e4342598 4571 case FIRST_REPLY_FOURTH :
wolfSSL 0:9d17e4342598 4572 if ( (ssl->error = SendFinished(ssl)) != 0) {
wolfSSL 0:9d17e4342598 4573 CYASSL_ERROR(ssl->error);
wolfSSL 0:9d17e4342598 4574 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 4575 }
wolfSSL 0:9d17e4342598 4576 CYASSL_MSG("sent: finished");
wolfSSL 0:9d17e4342598 4577 ssl->options.connectState = FINISHED_DONE;
wolfSSL 0:9d17e4342598 4578 CYASSL_MSG("connect state: FINISHED_DONE");
wolfSSL 0:9d17e4342598 4579
wolfSSL 0:9d17e4342598 4580 case FINISHED_DONE :
wolfSSL 0:9d17e4342598 4581 /* get response */
wolfSSL 0:9d17e4342598 4582 while (ssl->options.serverState < SERVER_FINISHED_COMPLETE)
wolfSSL 0:9d17e4342598 4583 if ( (ssl->error = ProcessReply(ssl)) < 0) {
wolfSSL 0:9d17e4342598 4584 CYASSL_ERROR(ssl->error);
wolfSSL 0:9d17e4342598 4585 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 4586 }
wolfSSL 0:9d17e4342598 4587
wolfSSL 0:9d17e4342598 4588 ssl->options.connectState = SECOND_REPLY_DONE;
wolfSSL 0:9d17e4342598 4589 CYASSL_MSG("connect state: SECOND_REPLY_DONE");
wolfSSL 0:9d17e4342598 4590
wolfSSL 0:9d17e4342598 4591 case SECOND_REPLY_DONE:
wolfSSL 0:9d17e4342598 4592 FreeHandshakeResources(ssl);
wolfSSL 0:9d17e4342598 4593 CYASSL_LEAVE("SSL_connect()", SSL_SUCCESS);
wolfSSL 0:9d17e4342598 4594 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 4595
wolfSSL 0:9d17e4342598 4596 default:
wolfSSL 0:9d17e4342598 4597 CYASSL_MSG("Unknown connect state ERROR");
wolfSSL 0:9d17e4342598 4598 return SSL_FATAL_ERROR; /* unknown connect state */
wolfSSL 0:9d17e4342598 4599 }
wolfSSL 0:9d17e4342598 4600 }
wolfSSL 0:9d17e4342598 4601
wolfSSL 0:9d17e4342598 4602 #endif /* NO_CYASSL_CLIENT */
wolfSSL 0:9d17e4342598 4603
wolfSSL 0:9d17e4342598 4604
wolfSSL 0:9d17e4342598 4605 /* server only parts */
wolfSSL 0:9d17e4342598 4606 #ifndef NO_CYASSL_SERVER
wolfSSL 0:9d17e4342598 4607
wolfSSL 0:9d17e4342598 4608 #ifndef NO_OLD_TLS
wolfSSL 0:9d17e4342598 4609 CYASSL_METHOD* CyaSSLv3_server_method(void)
wolfSSL 0:9d17e4342598 4610 {
wolfSSL 0:9d17e4342598 4611 CYASSL_METHOD* method =
wolfSSL 0:9d17e4342598 4612 (CYASSL_METHOD*) XMALLOC(sizeof(CYASSL_METHOD), 0,
wolfSSL 0:9d17e4342598 4613 DYNAMIC_TYPE_METHOD);
wolfSSL 0:9d17e4342598 4614 CYASSL_ENTER("SSLv3_server_method");
wolfSSL 0:9d17e4342598 4615 if (method) {
wolfSSL 0:9d17e4342598 4616 InitSSL_Method(method, MakeSSLv3());
wolfSSL 0:9d17e4342598 4617 method->side = CYASSL_SERVER_END;
wolfSSL 0:9d17e4342598 4618 }
wolfSSL 0:9d17e4342598 4619 return method;
wolfSSL 0:9d17e4342598 4620 }
wolfSSL 0:9d17e4342598 4621 #endif
wolfSSL 0:9d17e4342598 4622
wolfSSL 0:9d17e4342598 4623
wolfSSL 0:9d17e4342598 4624 #ifdef CYASSL_DTLS
wolfSSL 0:9d17e4342598 4625 CYASSL_METHOD* CyaDTLSv1_server_method(void)
wolfSSL 0:9d17e4342598 4626 {
wolfSSL 0:9d17e4342598 4627 CYASSL_METHOD* method =
wolfSSL 0:9d17e4342598 4628 (CYASSL_METHOD*) XMALLOC(sizeof(CYASSL_METHOD), 0,
wolfSSL 0:9d17e4342598 4629 DYNAMIC_TYPE_METHOD);
wolfSSL 0:9d17e4342598 4630 CYASSL_ENTER("DTLSv1_server_method");
wolfSSL 0:9d17e4342598 4631 if (method) {
wolfSSL 0:9d17e4342598 4632 InitSSL_Method(method, MakeDTLSv1());
wolfSSL 0:9d17e4342598 4633 method->side = CYASSL_SERVER_END;
wolfSSL 0:9d17e4342598 4634 }
wolfSSL 0:9d17e4342598 4635 return method;
wolfSSL 0:9d17e4342598 4636 }
wolfSSL 0:9d17e4342598 4637
wolfSSL 0:9d17e4342598 4638 CYASSL_METHOD* CyaDTLSv1_2_server_method(void)
wolfSSL 0:9d17e4342598 4639 {
wolfSSL 0:9d17e4342598 4640 CYASSL_METHOD* method =
wolfSSL 0:9d17e4342598 4641 (CYASSL_METHOD*) XMALLOC(sizeof(CYASSL_METHOD), 0,
wolfSSL 0:9d17e4342598 4642 DYNAMIC_TYPE_METHOD);
wolfSSL 0:9d17e4342598 4643 CYASSL_ENTER("DTLSv1_2_server_method");
wolfSSL 0:9d17e4342598 4644 if (method) {
wolfSSL 0:9d17e4342598 4645 InitSSL_Method(method, MakeDTLSv1_2());
wolfSSL 0:9d17e4342598 4646 method->side = CYASSL_SERVER_END;
wolfSSL 0:9d17e4342598 4647 }
wolfSSL 0:9d17e4342598 4648 return method;
wolfSSL 0:9d17e4342598 4649 }
wolfSSL 0:9d17e4342598 4650 #endif
wolfSSL 0:9d17e4342598 4651
wolfSSL 0:9d17e4342598 4652
wolfSSL 0:9d17e4342598 4653 int CyaSSL_accept(CYASSL* ssl)
wolfSSL 0:9d17e4342598 4654 {
wolfSSL 0:9d17e4342598 4655 byte havePSK = 0;
wolfSSL 0:9d17e4342598 4656 CYASSL_ENTER("SSL_accept()");
wolfSSL 0:9d17e4342598 4657
wolfSSL 0:9d17e4342598 4658 #ifdef HAVE_ERRNO_H
wolfSSL 0:9d17e4342598 4659 errno = 0;
wolfSSL 0:9d17e4342598 4660 #endif
wolfSSL 0:9d17e4342598 4661
wolfSSL 0:9d17e4342598 4662 #ifndef NO_PSK
wolfSSL 0:9d17e4342598 4663 havePSK = ssl->options.havePSK;
wolfSSL 0:9d17e4342598 4664 #endif
wolfSSL 0:9d17e4342598 4665 (void)havePSK;
wolfSSL 0:9d17e4342598 4666
wolfSSL 0:9d17e4342598 4667 if (ssl->options.side != CYASSL_SERVER_END) {
wolfSSL 0:9d17e4342598 4668 CYASSL_ERROR(ssl->error = SIDE_ERROR);
wolfSSL 0:9d17e4342598 4669 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 4670 }
wolfSSL 0:9d17e4342598 4671
wolfSSL 0:9d17e4342598 4672 #ifndef NO_CERTS
wolfSSL 0:9d17e4342598 4673 /* in case used set_accept_state after init */
wolfSSL 0:9d17e4342598 4674 if (!havePSK && (ssl->buffers.certificate.buffer == NULL ||
wolfSSL 0:9d17e4342598 4675 ssl->buffers.key.buffer == NULL)) {
wolfSSL 0:9d17e4342598 4676 CYASSL_MSG("accept error: don't have server cert and key");
wolfSSL 0:9d17e4342598 4677 ssl->error = NO_PRIVATE_KEY;
wolfSSL 0:9d17e4342598 4678 CYASSL_ERROR(ssl->error);
wolfSSL 0:9d17e4342598 4679 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 4680 }
wolfSSL 0:9d17e4342598 4681 #endif
wolfSSL 0:9d17e4342598 4682
wolfSSL 0:9d17e4342598 4683 #ifdef HAVE_ECC
wolfSSL 0:9d17e4342598 4684 /* in case used set_accept_state after init */
wolfSSL 0:9d17e4342598 4685 if (ssl->eccTempKeyPresent == 0) {
wolfSSL 0:9d17e4342598 4686 if (ecc_make_key(ssl->rng, ssl->eccTempKeySz,
wolfSSL 0:9d17e4342598 4687 ssl->eccTempKey) != 0) {
wolfSSL 0:9d17e4342598 4688 ssl->error = ECC_MAKEKEY_ERROR;
wolfSSL 0:9d17e4342598 4689 CYASSL_ERROR(ssl->error);
wolfSSL 0:9d17e4342598 4690 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 4691 }
wolfSSL 0:9d17e4342598 4692 ssl->eccTempKeyPresent = 1;
wolfSSL 0:9d17e4342598 4693 }
wolfSSL 0:9d17e4342598 4694 #endif
wolfSSL 0:9d17e4342598 4695
wolfSSL 0:9d17e4342598 4696 #ifdef CYASSL_DTLS
wolfSSL 0:9d17e4342598 4697 if (ssl->version.major == DTLS_MAJOR) {
wolfSSL 0:9d17e4342598 4698 ssl->options.dtls = 1;
wolfSSL 0:9d17e4342598 4699 ssl->options.tls = 1;
wolfSSL 0:9d17e4342598 4700 ssl->options.tls1_1 = 1;
wolfSSL 0:9d17e4342598 4701
wolfSSL 0:9d17e4342598 4702 if (DtlsPoolInit(ssl) != 0) {
wolfSSL 0:9d17e4342598 4703 ssl->error = MEMORY_ERROR;
wolfSSL 0:9d17e4342598 4704 CYASSL_ERROR(ssl->error);
wolfSSL 0:9d17e4342598 4705 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 4706 }
wolfSSL 0:9d17e4342598 4707 }
wolfSSL 0:9d17e4342598 4708 #endif
wolfSSL 0:9d17e4342598 4709
wolfSSL 0:9d17e4342598 4710 if (ssl->buffers.outputBuffer.length > 0) {
wolfSSL 0:9d17e4342598 4711 if ( (ssl->error = SendBuffered(ssl)) == 0) {
wolfSSL 0:9d17e4342598 4712 ssl->options.acceptState++;
wolfSSL 0:9d17e4342598 4713 CYASSL_MSG("accept state: Advanced from buffered send");
wolfSSL 0:9d17e4342598 4714 }
wolfSSL 0:9d17e4342598 4715 else {
wolfSSL 0:9d17e4342598 4716 CYASSL_ERROR(ssl->error);
wolfSSL 0:9d17e4342598 4717 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 4718 }
wolfSSL 0:9d17e4342598 4719 }
wolfSSL 0:9d17e4342598 4720
wolfSSL 0:9d17e4342598 4721 switch (ssl->options.acceptState) {
wolfSSL 0:9d17e4342598 4722
wolfSSL 0:9d17e4342598 4723 case ACCEPT_BEGIN :
wolfSSL 0:9d17e4342598 4724 /* get response */
wolfSSL 0:9d17e4342598 4725 while (ssl->options.clientState < CLIENT_HELLO_COMPLETE)
wolfSSL 0:9d17e4342598 4726 if ( (ssl->error = ProcessReply(ssl)) < 0) {
wolfSSL 0:9d17e4342598 4727 CYASSL_ERROR(ssl->error);
wolfSSL 0:9d17e4342598 4728 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 4729 }
wolfSSL 0:9d17e4342598 4730 ssl->options.acceptState = ACCEPT_CLIENT_HELLO_DONE;
wolfSSL 0:9d17e4342598 4731 CYASSL_MSG("accept state ACCEPT_CLIENT_HELLO_DONE");
wolfSSL 0:9d17e4342598 4732
wolfSSL 0:9d17e4342598 4733 case ACCEPT_CLIENT_HELLO_DONE :
wolfSSL 0:9d17e4342598 4734 #ifdef CYASSL_DTLS
wolfSSL 0:9d17e4342598 4735 if (ssl->options.dtls)
wolfSSL 0:9d17e4342598 4736 if ( (ssl->error = SendHelloVerifyRequest(ssl)) != 0) {
wolfSSL 0:9d17e4342598 4737 CYASSL_ERROR(ssl->error);
wolfSSL 0:9d17e4342598 4738 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 4739 }
wolfSSL 0:9d17e4342598 4740 #endif
wolfSSL 0:9d17e4342598 4741 ssl->options.acceptState = HELLO_VERIFY_SENT;
wolfSSL 0:9d17e4342598 4742 CYASSL_MSG("accept state HELLO_VERIFY_SENT");
wolfSSL 0:9d17e4342598 4743
wolfSSL 0:9d17e4342598 4744 case HELLO_VERIFY_SENT:
wolfSSL 0:9d17e4342598 4745 #ifdef CYASSL_DTLS
wolfSSL 0:9d17e4342598 4746 if (ssl->options.dtls) {
wolfSSL 0:9d17e4342598 4747 ssl->options.clientState = NULL_STATE; /* get again */
wolfSSL 0:9d17e4342598 4748 /* re-init hashes, exclude first hello and verify request */
wolfSSL 0:9d17e4342598 4749 #ifndef NO_OLD_TLS
wolfSSL 0:9d17e4342598 4750 InitMd5(&ssl->hashMd5);
wolfSSL 0:9d17e4342598 4751 if ( (ssl->error = InitSha(&ssl->hashSha)) != 0) {
wolfSSL 0:9d17e4342598 4752 CYASSL_ERROR(ssl->error);
wolfSSL 0:9d17e4342598 4753 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 4754 }
wolfSSL 0:9d17e4342598 4755 #endif
wolfSSL 0:9d17e4342598 4756 if (IsAtLeastTLSv1_2(ssl)) {
wolfSSL 0:9d17e4342598 4757 #ifndef NO_SHA256
wolfSSL 0:9d17e4342598 4758 if ( (ssl->error =
wolfSSL 0:9d17e4342598 4759 InitSha256(&ssl->hashSha256)) != 0) {
wolfSSL 0:9d17e4342598 4760 CYASSL_ERROR(ssl->error);
wolfSSL 0:9d17e4342598 4761 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 4762 }
wolfSSL 0:9d17e4342598 4763 #endif
wolfSSL 0:9d17e4342598 4764 #ifdef CYASSL_SHA384
wolfSSL 0:9d17e4342598 4765 if ( (ssl->error =
wolfSSL 0:9d17e4342598 4766 InitSha384(&ssl->hashSha384)) != 0) {
wolfSSL 0:9d17e4342598 4767 CYASSL_ERROR(ssl->error);
wolfSSL 0:9d17e4342598 4768 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 4769 }
wolfSSL 0:9d17e4342598 4770 #endif
wolfSSL 0:9d17e4342598 4771 }
wolfSSL 0:9d17e4342598 4772
wolfSSL 0:9d17e4342598 4773 while (ssl->options.clientState < CLIENT_HELLO_COMPLETE)
wolfSSL 0:9d17e4342598 4774 if ( (ssl->error = ProcessReply(ssl)) < 0) {
wolfSSL 0:9d17e4342598 4775 CYASSL_ERROR(ssl->error);
wolfSSL 0:9d17e4342598 4776 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 4777 }
wolfSSL 0:9d17e4342598 4778 }
wolfSSL 0:9d17e4342598 4779 #endif
wolfSSL 0:9d17e4342598 4780 ssl->options.acceptState = ACCEPT_FIRST_REPLY_DONE;
wolfSSL 0:9d17e4342598 4781 CYASSL_MSG("accept state ACCEPT_FIRST_REPLY_DONE");
wolfSSL 0:9d17e4342598 4782
wolfSSL 0:9d17e4342598 4783 case ACCEPT_FIRST_REPLY_DONE :
wolfSSL 0:9d17e4342598 4784 if ( (ssl->error = SendServerHello(ssl)) != 0) {
wolfSSL 0:9d17e4342598 4785 CYASSL_ERROR(ssl->error);
wolfSSL 0:9d17e4342598 4786 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 4787 }
wolfSSL 0:9d17e4342598 4788 ssl->options.acceptState = SERVER_HELLO_SENT;
wolfSSL 0:9d17e4342598 4789 CYASSL_MSG("accept state SERVER_HELLO_SENT");
wolfSSL 0:9d17e4342598 4790
wolfSSL 0:9d17e4342598 4791 case SERVER_HELLO_SENT :
wolfSSL 0:9d17e4342598 4792 #ifndef NO_CERTS
wolfSSL 0:9d17e4342598 4793 if (!ssl->options.resuming)
wolfSSL 0:9d17e4342598 4794 if ( (ssl->error = SendCertificate(ssl)) != 0) {
wolfSSL 0:9d17e4342598 4795 CYASSL_ERROR(ssl->error);
wolfSSL 0:9d17e4342598 4796 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 4797 }
wolfSSL 0:9d17e4342598 4798 #endif
wolfSSL 0:9d17e4342598 4799 ssl->options.acceptState = CERT_SENT;
wolfSSL 0:9d17e4342598 4800 CYASSL_MSG("accept state CERT_SENT");
wolfSSL 0:9d17e4342598 4801
wolfSSL 0:9d17e4342598 4802 case CERT_SENT :
wolfSSL 0:9d17e4342598 4803 if (!ssl->options.resuming)
wolfSSL 0:9d17e4342598 4804 if ( (ssl->error = SendServerKeyExchange(ssl)) != 0) {
wolfSSL 0:9d17e4342598 4805 CYASSL_ERROR(ssl->error);
wolfSSL 0:9d17e4342598 4806 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 4807 }
wolfSSL 0:9d17e4342598 4808 ssl->options.acceptState = KEY_EXCHANGE_SENT;
wolfSSL 0:9d17e4342598 4809 CYASSL_MSG("accept state KEY_EXCHANGE_SENT");
wolfSSL 0:9d17e4342598 4810
wolfSSL 0:9d17e4342598 4811 case KEY_EXCHANGE_SENT :
wolfSSL 0:9d17e4342598 4812 #ifndef NO_CERTS
wolfSSL 0:9d17e4342598 4813 if (!ssl->options.resuming)
wolfSSL 0:9d17e4342598 4814 if (ssl->options.verifyPeer)
wolfSSL 0:9d17e4342598 4815 if ( (ssl->error = SendCertificateRequest(ssl)) != 0) {
wolfSSL 0:9d17e4342598 4816 CYASSL_ERROR(ssl->error);
wolfSSL 0:9d17e4342598 4817 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 4818 }
wolfSSL 0:9d17e4342598 4819 #endif
wolfSSL 0:9d17e4342598 4820 ssl->options.acceptState = CERT_REQ_SENT;
wolfSSL 0:9d17e4342598 4821 CYASSL_MSG("accept state CERT_REQ_SENT");
wolfSSL 0:9d17e4342598 4822
wolfSSL 0:9d17e4342598 4823 case CERT_REQ_SENT :
wolfSSL 0:9d17e4342598 4824 if (!ssl->options.resuming)
wolfSSL 0:9d17e4342598 4825 if ( (ssl->error = SendServerHelloDone(ssl)) != 0) {
wolfSSL 0:9d17e4342598 4826 CYASSL_ERROR(ssl->error);
wolfSSL 0:9d17e4342598 4827 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 4828 }
wolfSSL 0:9d17e4342598 4829 ssl->options.acceptState = SERVER_HELLO_DONE;
wolfSSL 0:9d17e4342598 4830 CYASSL_MSG("accept state SERVER_HELLO_DONE");
wolfSSL 0:9d17e4342598 4831
wolfSSL 0:9d17e4342598 4832 case SERVER_HELLO_DONE :
wolfSSL 0:9d17e4342598 4833 if (!ssl->options.resuming) {
wolfSSL 0:9d17e4342598 4834 while (ssl->options.clientState < CLIENT_FINISHED_COMPLETE)
wolfSSL 0:9d17e4342598 4835 if ( (ssl->error = ProcessReply(ssl)) < 0) {
wolfSSL 0:9d17e4342598 4836 CYASSL_ERROR(ssl->error);
wolfSSL 0:9d17e4342598 4837 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 4838 }
wolfSSL 0:9d17e4342598 4839 }
wolfSSL 0:9d17e4342598 4840 ssl->options.acceptState = ACCEPT_SECOND_REPLY_DONE;
wolfSSL 0:9d17e4342598 4841 CYASSL_MSG("accept state ACCEPT_SECOND_REPLY_DONE");
wolfSSL 0:9d17e4342598 4842
wolfSSL 0:9d17e4342598 4843 case ACCEPT_SECOND_REPLY_DONE :
wolfSSL 0:9d17e4342598 4844 if ( (ssl->error = SendChangeCipher(ssl)) != 0) {
wolfSSL 0:9d17e4342598 4845 CYASSL_ERROR(ssl->error);
wolfSSL 0:9d17e4342598 4846 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 4847 }
wolfSSL 0:9d17e4342598 4848 ssl->options.acceptState = CHANGE_CIPHER_SENT;
wolfSSL 0:9d17e4342598 4849 CYASSL_MSG("accept state CHANGE_CIPHER_SENT");
wolfSSL 0:9d17e4342598 4850
wolfSSL 0:9d17e4342598 4851 case CHANGE_CIPHER_SENT :
wolfSSL 0:9d17e4342598 4852 if ( (ssl->error = SendFinished(ssl)) != 0) {
wolfSSL 0:9d17e4342598 4853 CYASSL_ERROR(ssl->error);
wolfSSL 0:9d17e4342598 4854 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 4855 }
wolfSSL 0:9d17e4342598 4856
wolfSSL 0:9d17e4342598 4857 ssl->options.acceptState = ACCEPT_FINISHED_DONE;
wolfSSL 0:9d17e4342598 4858 CYASSL_MSG("accept state ACCEPT_FINISHED_DONE");
wolfSSL 0:9d17e4342598 4859
wolfSSL 0:9d17e4342598 4860 case ACCEPT_FINISHED_DONE :
wolfSSL 0:9d17e4342598 4861 if (ssl->options.resuming)
wolfSSL 0:9d17e4342598 4862 while (ssl->options.clientState < CLIENT_FINISHED_COMPLETE)
wolfSSL 0:9d17e4342598 4863 if ( (ssl->error = ProcessReply(ssl)) < 0) {
wolfSSL 0:9d17e4342598 4864 CYASSL_ERROR(ssl->error);
wolfSSL 0:9d17e4342598 4865 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 4866 }
wolfSSL 0:9d17e4342598 4867
wolfSSL 0:9d17e4342598 4868 ssl->options.acceptState = ACCEPT_THIRD_REPLY_DONE;
wolfSSL 0:9d17e4342598 4869 CYASSL_MSG("accept state ACCEPT_THIRD_REPLY_DONE");
wolfSSL 0:9d17e4342598 4870
wolfSSL 0:9d17e4342598 4871 case ACCEPT_THIRD_REPLY_DONE :
wolfSSL 0:9d17e4342598 4872 FreeHandshakeResources(ssl);
wolfSSL 0:9d17e4342598 4873 CYASSL_LEAVE("SSL_accept()", SSL_SUCCESS);
wolfSSL 0:9d17e4342598 4874 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 4875
wolfSSL 0:9d17e4342598 4876 default :
wolfSSL 0:9d17e4342598 4877 CYASSL_MSG("Unknown accept state ERROR");
wolfSSL 0:9d17e4342598 4878 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 4879 }
wolfSSL 0:9d17e4342598 4880 }
wolfSSL 0:9d17e4342598 4881
wolfSSL 0:9d17e4342598 4882 #endif /* NO_CYASSL_SERVER */
wolfSSL 0:9d17e4342598 4883
wolfSSL 0:9d17e4342598 4884
wolfSSL 0:9d17e4342598 4885 int CyaSSL_Cleanup(void)
wolfSSL 0:9d17e4342598 4886 {
wolfSSL 0:9d17e4342598 4887 int ret = SSL_SUCCESS;
wolfSSL 0:9d17e4342598 4888 int release = 0;
wolfSSL 0:9d17e4342598 4889
wolfSSL 0:9d17e4342598 4890 CYASSL_ENTER("CyaSSL_Cleanup");
wolfSSL 0:9d17e4342598 4891
wolfSSL 0:9d17e4342598 4892 if (initRefCount == 0)
wolfSSL 0:9d17e4342598 4893 return ret; /* possibly no init yet, but not failure either way */
wolfSSL 0:9d17e4342598 4894
wolfSSL 0:9d17e4342598 4895 if (LockMutex(&count_mutex) != 0) {
wolfSSL 0:9d17e4342598 4896 CYASSL_MSG("Bad Lock Mutex count");
wolfSSL 0:9d17e4342598 4897 return BAD_MUTEX_E;
wolfSSL 0:9d17e4342598 4898 }
wolfSSL 0:9d17e4342598 4899
wolfSSL 0:9d17e4342598 4900 release = initRefCount-- == 1;
wolfSSL 0:9d17e4342598 4901 if (initRefCount < 0)
wolfSSL 0:9d17e4342598 4902 initRefCount = 0;
wolfSSL 0:9d17e4342598 4903
wolfSSL 0:9d17e4342598 4904 UnLockMutex(&count_mutex);
wolfSSL 0:9d17e4342598 4905
wolfSSL 0:9d17e4342598 4906 if (!release)
wolfSSL 0:9d17e4342598 4907 return ret;
wolfSSL 0:9d17e4342598 4908
wolfSSL 0:9d17e4342598 4909 #ifndef NO_SESSION_CACHE
wolfSSL 0:9d17e4342598 4910 if (FreeMutex(&session_mutex) != 0)
wolfSSL 0:9d17e4342598 4911 ret = BAD_MUTEX_E;
wolfSSL 0:9d17e4342598 4912 #endif
wolfSSL 0:9d17e4342598 4913 if (FreeMutex(&count_mutex) != 0)
wolfSSL 0:9d17e4342598 4914 ret = BAD_MUTEX_E;
wolfSSL 0:9d17e4342598 4915
wolfSSL 0:9d17e4342598 4916 #if defined(HAVE_ECC) && defined(FP_ECC)
wolfSSL 0:9d17e4342598 4917 ecc_fp_free();
wolfSSL 0:9d17e4342598 4918 #endif
wolfSSL 0:9d17e4342598 4919
wolfSSL 0:9d17e4342598 4920 return ret;
wolfSSL 0:9d17e4342598 4921 }
wolfSSL 0:9d17e4342598 4922
wolfSSL 0:9d17e4342598 4923
wolfSSL 0:9d17e4342598 4924 #ifndef NO_SESSION_CACHE
wolfSSL 0:9d17e4342598 4925
wolfSSL 0:9d17e4342598 4926 #ifndef NO_MD5
wolfSSL 0:9d17e4342598 4927
wolfSSL 0:9d17e4342598 4928 /* some session IDs aren't random afterall, let's make them random */
wolfSSL 0:9d17e4342598 4929
wolfSSL 0:9d17e4342598 4930 static INLINE word32 HashSession(const byte* sessionID, word32 len, int* error)
wolfSSL 0:9d17e4342598 4931 {
wolfSSL 0:9d17e4342598 4932 byte digest[MD5_DIGEST_SIZE];
wolfSSL 0:9d17e4342598 4933 Md5 md5;
wolfSSL 0:9d17e4342598 4934
wolfSSL 0:9d17e4342598 4935 (void)error;
wolfSSL 0:9d17e4342598 4936
wolfSSL 0:9d17e4342598 4937 InitMd5(&md5);
wolfSSL 0:9d17e4342598 4938 Md5Update(&md5, sessionID, len);
wolfSSL 0:9d17e4342598 4939 Md5Final(&md5, digest);
wolfSSL 0:9d17e4342598 4940
wolfSSL 0:9d17e4342598 4941 return MakeWordFromHash(digest);
wolfSSL 0:9d17e4342598 4942 }
wolfSSL 0:9d17e4342598 4943
wolfSSL 0:9d17e4342598 4944 #elif !defined(NO_SHA)
wolfSSL 0:9d17e4342598 4945
wolfSSL 0:9d17e4342598 4946 /* 0 on failure */
wolfSSL 0:9d17e4342598 4947 static INLINE word32 HashSession(const byte* sessionID, word32 len, int* error)
wolfSSL 0:9d17e4342598 4948 {
wolfSSL 0:9d17e4342598 4949 byte digest[SHA_DIGEST_SIZE];
wolfSSL 0:9d17e4342598 4950 Sha sha;
wolfSSL 0:9d17e4342598 4951 int ret = 0;
wolfSSL 0:9d17e4342598 4952
wolfSSL 0:9d17e4342598 4953 ret = InitSha(&sha);
wolfSSL 0:9d17e4342598 4954 if (ret != 0) {
wolfSSL 0:9d17e4342598 4955 *error = ret;
wolfSSL 0:9d17e4342598 4956 return 0;
wolfSSL 0:9d17e4342598 4957 }
wolfSSL 0:9d17e4342598 4958 ShaUpdate(&sha, sessionID, len);
wolfSSL 0:9d17e4342598 4959 ShaFinal(&sha, digest);
wolfSSL 0:9d17e4342598 4960
wolfSSL 0:9d17e4342598 4961 return MakeWordFromHash(digest);
wolfSSL 0:9d17e4342598 4962 }
wolfSSL 0:9d17e4342598 4963
wolfSSL 0:9d17e4342598 4964 #elif !defined(NO_SHA256)
wolfSSL 0:9d17e4342598 4965
wolfSSL 0:9d17e4342598 4966 static INLINE word32 HashSession(const byte* sessionID, word32 len, int* error)
wolfSSL 0:9d17e4342598 4967 {
wolfSSL 0:9d17e4342598 4968 byte digest[SHA256_DIGEST_SIZE];
wolfSSL 0:9d17e4342598 4969 Sha256 sha256;
wolfSSL 0:9d17e4342598 4970 int ret;
wolfSSL 0:9d17e4342598 4971
wolfSSL 0:9d17e4342598 4972 ret = InitSha256(&sha256);
wolfSSL 0:9d17e4342598 4973 if (ret != 0) {
wolfSSL 0:9d17e4342598 4974 *error = ret;
wolfSSL 0:9d17e4342598 4975 return 0;
wolfSSL 0:9d17e4342598 4976 }
wolfSSL 0:9d17e4342598 4977 Sha256Update(&sha256, sessionID, len);
wolfSSL 0:9d17e4342598 4978 Sha256Final(&sha256, digest);
wolfSSL 0:9d17e4342598 4979
wolfSSL 0:9d17e4342598 4980 return MakeWordFromHash(digest);
wolfSSL 0:9d17e4342598 4981 }
wolfSSL 0:9d17e4342598 4982
wolfSSL 0:9d17e4342598 4983 #else
wolfSSL 0:9d17e4342598 4984
wolfSSL 0:9d17e4342598 4985 #error "We need a digest to hash the session IDs"
wolfSSL 0:9d17e4342598 4986
wolfSSL 0:9d17e4342598 4987 #endif /* NO_MD5 */
wolfSSL 0:9d17e4342598 4988
wolfSSL 0:9d17e4342598 4989
wolfSSL 0:9d17e4342598 4990 void CyaSSL_flush_sessions(CYASSL_CTX* ctx, long tm)
wolfSSL 0:9d17e4342598 4991 {
wolfSSL 0:9d17e4342598 4992 /* static table now, no flusing needed */
wolfSSL 0:9d17e4342598 4993 (void)ctx;
wolfSSL 0:9d17e4342598 4994 (void)tm;
wolfSSL 0:9d17e4342598 4995 }
wolfSSL 0:9d17e4342598 4996
wolfSSL 0:9d17e4342598 4997
wolfSSL 0:9d17e4342598 4998 /* set ssl session timeout in seconds */
wolfSSL 0:9d17e4342598 4999 int CyaSSL_set_timeout(CYASSL* ssl, unsigned int to)
wolfSSL 0:9d17e4342598 5000 {
wolfSSL 0:9d17e4342598 5001 if (ssl == NULL)
wolfSSL 0:9d17e4342598 5002 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 5003
wolfSSL 0:9d17e4342598 5004 ssl->timeout = to;
wolfSSL 0:9d17e4342598 5005
wolfSSL 0:9d17e4342598 5006 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 5007 }
wolfSSL 0:9d17e4342598 5008
wolfSSL 0:9d17e4342598 5009
wolfSSL 0:9d17e4342598 5010 /* set ctx session timeout in seconds */
wolfSSL 0:9d17e4342598 5011 int CyaSSL_CTX_set_timeout(CYASSL_CTX* ctx, unsigned int to)
wolfSSL 0:9d17e4342598 5012 {
wolfSSL 0:9d17e4342598 5013 if (ctx == NULL)
wolfSSL 0:9d17e4342598 5014 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 5015
wolfSSL 0:9d17e4342598 5016 ctx->timeout = to;
wolfSSL 0:9d17e4342598 5017
wolfSSL 0:9d17e4342598 5018 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 5019 }
wolfSSL 0:9d17e4342598 5020
wolfSSL 0:9d17e4342598 5021
wolfSSL 0:9d17e4342598 5022 #ifndef NO_CLIENT_CACHE
wolfSSL 0:9d17e4342598 5023
wolfSSL 0:9d17e4342598 5024 /* Get Session from Client cache based on id/len, return NULL on failure */
wolfSSL 0:9d17e4342598 5025 CYASSL_SESSION* GetSessionClient(CYASSL* ssl, const byte* id, int len)
wolfSSL 0:9d17e4342598 5026 {
wolfSSL 0:9d17e4342598 5027 CYASSL_SESSION* ret = NULL;
wolfSSL 0:9d17e4342598 5028 word32 row;
wolfSSL 0:9d17e4342598 5029 int idx;
wolfSSL 0:9d17e4342598 5030 int count;
wolfSSL 0:9d17e4342598 5031 int error = 0;
wolfSSL 0:9d17e4342598 5032
wolfSSL 0:9d17e4342598 5033 CYASSL_ENTER("GetSessionClient");
wolfSSL 0:9d17e4342598 5034
wolfSSL 0:9d17e4342598 5035 if (ssl->options.side == CYASSL_SERVER_END)
wolfSSL 0:9d17e4342598 5036 return NULL;
wolfSSL 0:9d17e4342598 5037
wolfSSL 0:9d17e4342598 5038 len = min(SERVER_ID_LEN, (word32)len);
wolfSSL 0:9d17e4342598 5039 row = HashSession(id, len, &error) % SESSION_ROWS;
wolfSSL 0:9d17e4342598 5040 if (error != 0) {
wolfSSL 0:9d17e4342598 5041 CYASSL_MSG("Hash session failed");
wolfSSL 0:9d17e4342598 5042 return NULL;
wolfSSL 0:9d17e4342598 5043 }
wolfSSL 0:9d17e4342598 5044
wolfSSL 0:9d17e4342598 5045 if (LockMutex(&session_mutex) != 0) {
wolfSSL 0:9d17e4342598 5046 CYASSL_MSG("Lock session mutex failed");
wolfSSL 0:9d17e4342598 5047 return NULL;
wolfSSL 0:9d17e4342598 5048 }
wolfSSL 0:9d17e4342598 5049
wolfSSL 0:9d17e4342598 5050 /* start from most recently used */
wolfSSL 0:9d17e4342598 5051 count = min((word32)ClientCache[row].totalCount, SESSIONS_PER_ROW);
wolfSSL 0:9d17e4342598 5052 idx = ClientCache[row].nextIdx - 1;
wolfSSL 0:9d17e4342598 5053 if (idx < 0)
wolfSSL 0:9d17e4342598 5054 idx = SESSIONS_PER_ROW - 1; /* if back to front, the previous was end */
wolfSSL 0:9d17e4342598 5055
wolfSSL 0:9d17e4342598 5056 for (; count > 0; --count, idx = idx ? idx - 1 : SESSIONS_PER_ROW - 1) {
wolfSSL 0:9d17e4342598 5057 CYASSL_SESSION* current;
wolfSSL 0:9d17e4342598 5058 ClientSession clSess;
wolfSSL 0:9d17e4342598 5059
wolfSSL 0:9d17e4342598 5060 if (idx >= SESSIONS_PER_ROW || idx < 0) { /* sanity check */
wolfSSL 0:9d17e4342598 5061 CYASSL_MSG("Bad idx");
wolfSSL 0:9d17e4342598 5062 break;
wolfSSL 0:9d17e4342598 5063 }
wolfSSL 0:9d17e4342598 5064
wolfSSL 0:9d17e4342598 5065 clSess = ClientCache[row].Clients[idx];
wolfSSL 0:9d17e4342598 5066
wolfSSL 0:9d17e4342598 5067 current = &SessionCache[clSess.serverRow].Sessions[clSess.serverIdx];
wolfSSL 0:9d17e4342598 5068 if (XMEMCMP(current->serverID, id, len) == 0) {
wolfSSL 0:9d17e4342598 5069 CYASSL_MSG("Found a serverid match for client");
wolfSSL 0:9d17e4342598 5070 if (LowResTimer() < (current->bornOn + current->timeout)) {
wolfSSL 0:9d17e4342598 5071 CYASSL_MSG("Session valid");
wolfSSL 0:9d17e4342598 5072 ret = current;
wolfSSL 0:9d17e4342598 5073 break;
wolfSSL 0:9d17e4342598 5074 } else {
wolfSSL 0:9d17e4342598 5075 CYASSL_MSG("Session timed out"); /* could have more for id */
wolfSSL 0:9d17e4342598 5076 }
wolfSSL 0:9d17e4342598 5077 } else {
wolfSSL 0:9d17e4342598 5078 CYASSL_MSG("ServerID not a match from client table");
wolfSSL 0:9d17e4342598 5079 }
wolfSSL 0:9d17e4342598 5080 }
wolfSSL 0:9d17e4342598 5081
wolfSSL 0:9d17e4342598 5082 UnLockMutex(&session_mutex);
wolfSSL 0:9d17e4342598 5083
wolfSSL 0:9d17e4342598 5084 return ret;
wolfSSL 0:9d17e4342598 5085 }
wolfSSL 0:9d17e4342598 5086
wolfSSL 0:9d17e4342598 5087 #endif /* NO_CLIENT_CACHE */
wolfSSL 0:9d17e4342598 5088
wolfSSL 0:9d17e4342598 5089
wolfSSL 0:9d17e4342598 5090 CYASSL_SESSION* GetSession(CYASSL* ssl, byte* masterSecret)
wolfSSL 0:9d17e4342598 5091 {
wolfSSL 0:9d17e4342598 5092 CYASSL_SESSION* ret = 0;
wolfSSL 0:9d17e4342598 5093 const byte* id = NULL;
wolfSSL 0:9d17e4342598 5094 word32 row;
wolfSSL 0:9d17e4342598 5095 int idx;
wolfSSL 0:9d17e4342598 5096 int count;
wolfSSL 0:9d17e4342598 5097 int error = 0;
wolfSSL 0:9d17e4342598 5098
wolfSSL 0:9d17e4342598 5099 if (ssl->options.sessionCacheOff)
wolfSSL 0:9d17e4342598 5100 return NULL;
wolfSSL 0:9d17e4342598 5101
wolfSSL 0:9d17e4342598 5102 if (ssl->options.haveSessionId == 0)
wolfSSL 0:9d17e4342598 5103 return NULL;
wolfSSL 0:9d17e4342598 5104
wolfSSL 0:9d17e4342598 5105 if (ssl->arrays)
wolfSSL 0:9d17e4342598 5106 id = ssl->arrays->sessionID;
wolfSSL 0:9d17e4342598 5107 else
wolfSSL 0:9d17e4342598 5108 id = ssl->session.sessionID;
wolfSSL 0:9d17e4342598 5109
wolfSSL 0:9d17e4342598 5110 row = HashSession(id, ID_LEN, &error) % SESSION_ROWS;
wolfSSL 0:9d17e4342598 5111 if (error != 0) {
wolfSSL 0:9d17e4342598 5112 CYASSL_MSG("Hash session failed");
wolfSSL 0:9d17e4342598 5113 return NULL;
wolfSSL 0:9d17e4342598 5114 }
wolfSSL 0:9d17e4342598 5115
wolfSSL 0:9d17e4342598 5116 if (LockMutex(&session_mutex) != 0)
wolfSSL 0:9d17e4342598 5117 return 0;
wolfSSL 0:9d17e4342598 5118
wolfSSL 0:9d17e4342598 5119 /* start from most recently used */
wolfSSL 0:9d17e4342598 5120 count = min((word32)SessionCache[row].totalCount, SESSIONS_PER_ROW);
wolfSSL 0:9d17e4342598 5121 idx = SessionCache[row].nextIdx - 1;
wolfSSL 0:9d17e4342598 5122 if (idx < 0)
wolfSSL 0:9d17e4342598 5123 idx = SESSIONS_PER_ROW - 1; /* if back to front, the previous was end */
wolfSSL 0:9d17e4342598 5124
wolfSSL 0:9d17e4342598 5125 for (; count > 0; --count, idx = idx ? idx - 1 : SESSIONS_PER_ROW - 1) {
wolfSSL 0:9d17e4342598 5126 CYASSL_SESSION* current;
wolfSSL 0:9d17e4342598 5127
wolfSSL 0:9d17e4342598 5128 if (idx >= SESSIONS_PER_ROW || idx < 0) { /* sanity check */
wolfSSL 0:9d17e4342598 5129 CYASSL_MSG("Bad idx");
wolfSSL 0:9d17e4342598 5130 break;
wolfSSL 0:9d17e4342598 5131 }
wolfSSL 0:9d17e4342598 5132
wolfSSL 0:9d17e4342598 5133 current = &SessionCache[row].Sessions[idx];
wolfSSL 0:9d17e4342598 5134 if (XMEMCMP(current->sessionID, id, ID_LEN) == 0) {
wolfSSL 0:9d17e4342598 5135 CYASSL_MSG("Found a session match");
wolfSSL 0:9d17e4342598 5136 if (LowResTimer() < (current->bornOn + current->timeout)) {
wolfSSL 0:9d17e4342598 5137 CYASSL_MSG("Session valid");
wolfSSL 0:9d17e4342598 5138 ret = current;
wolfSSL 0:9d17e4342598 5139 if (masterSecret)
wolfSSL 0:9d17e4342598 5140 XMEMCPY(masterSecret, current->masterSecret, SECRET_LEN);
wolfSSL 0:9d17e4342598 5141 } else {
wolfSSL 0:9d17e4342598 5142 CYASSL_MSG("Session timed out");
wolfSSL 0:9d17e4342598 5143 }
wolfSSL 0:9d17e4342598 5144 break; /* no more sessionIDs whether valid or not that match */
wolfSSL 0:9d17e4342598 5145 } else {
wolfSSL 0:9d17e4342598 5146 CYASSL_MSG("SessionID not a match at this idx");
wolfSSL 0:9d17e4342598 5147 }
wolfSSL 0:9d17e4342598 5148 }
wolfSSL 0:9d17e4342598 5149
wolfSSL 0:9d17e4342598 5150 UnLockMutex(&session_mutex);
wolfSSL 0:9d17e4342598 5151
wolfSSL 0:9d17e4342598 5152 return ret;
wolfSSL 0:9d17e4342598 5153 }
wolfSSL 0:9d17e4342598 5154
wolfSSL 0:9d17e4342598 5155
wolfSSL 0:9d17e4342598 5156 int SetSession(CYASSL* ssl, CYASSL_SESSION* session)
wolfSSL 0:9d17e4342598 5157 {
wolfSSL 0:9d17e4342598 5158 if (ssl->options.sessionCacheOff)
wolfSSL 0:9d17e4342598 5159 return SSL_FAILURE;
wolfSSL 0:9d17e4342598 5160
wolfSSL 0:9d17e4342598 5161 if (LowResTimer() < (session->bornOn + session->timeout)) {
wolfSSL 0:9d17e4342598 5162 ssl->session = *session;
wolfSSL 0:9d17e4342598 5163 ssl->options.resuming = 1;
wolfSSL 0:9d17e4342598 5164
wolfSSL 0:9d17e4342598 5165 #ifdef SESSION_CERTS
wolfSSL 0:9d17e4342598 5166 ssl->version = session->version;
wolfSSL 0:9d17e4342598 5167 ssl->options.cipherSuite0 = session->cipherSuite0;
wolfSSL 0:9d17e4342598 5168 ssl->options.cipherSuite = session->cipherSuite;
wolfSSL 0:9d17e4342598 5169 #endif
wolfSSL 0:9d17e4342598 5170
wolfSSL 0:9d17e4342598 5171 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 5172 }
wolfSSL 0:9d17e4342598 5173 return SSL_FAILURE; /* session timed out */
wolfSSL 0:9d17e4342598 5174 }
wolfSSL 0:9d17e4342598 5175
wolfSSL 0:9d17e4342598 5176
wolfSSL 0:9d17e4342598 5177 int AddSession(CYASSL* ssl)
wolfSSL 0:9d17e4342598 5178 {
wolfSSL 0:9d17e4342598 5179 word32 row, idx;
wolfSSL 0:9d17e4342598 5180 int error = 0;
wolfSSL 0:9d17e4342598 5181
wolfSSL 0:9d17e4342598 5182 if (ssl->options.sessionCacheOff)
wolfSSL 0:9d17e4342598 5183 return 0;
wolfSSL 0:9d17e4342598 5184
wolfSSL 0:9d17e4342598 5185 if (ssl->options.haveSessionId == 0)
wolfSSL 0:9d17e4342598 5186 return 0;
wolfSSL 0:9d17e4342598 5187
wolfSSL 0:9d17e4342598 5188 row = HashSession(ssl->arrays->sessionID, ID_LEN, &error) % SESSION_ROWS;
wolfSSL 0:9d17e4342598 5189 if (error != 0) {
wolfSSL 0:9d17e4342598 5190 CYASSL_MSG("Hash session failed");
wolfSSL 0:9d17e4342598 5191 return error;
wolfSSL 0:9d17e4342598 5192 }
wolfSSL 0:9d17e4342598 5193
wolfSSL 0:9d17e4342598 5194 if (LockMutex(&session_mutex) != 0)
wolfSSL 0:9d17e4342598 5195 return BAD_MUTEX_E;
wolfSSL 0:9d17e4342598 5196
wolfSSL 0:9d17e4342598 5197 idx = SessionCache[row].nextIdx++;
wolfSSL 0:9d17e4342598 5198 #ifdef SESSION_INDEX
wolfSSL 0:9d17e4342598 5199 ssl->sessionIndex = (row << SESSIDX_ROW_SHIFT) | idx;
wolfSSL 0:9d17e4342598 5200 #endif
wolfSSL 0:9d17e4342598 5201
wolfSSL 0:9d17e4342598 5202 XMEMCPY(SessionCache[row].Sessions[idx].masterSecret,
wolfSSL 0:9d17e4342598 5203 ssl->arrays->masterSecret, SECRET_LEN);
wolfSSL 0:9d17e4342598 5204 XMEMCPY(SessionCache[row].Sessions[idx].sessionID, ssl->arrays->sessionID,
wolfSSL 0:9d17e4342598 5205 ID_LEN);
wolfSSL 0:9d17e4342598 5206
wolfSSL 0:9d17e4342598 5207 SessionCache[row].Sessions[idx].timeout = ssl->timeout;
wolfSSL 0:9d17e4342598 5208 SessionCache[row].Sessions[idx].bornOn = LowResTimer();
wolfSSL 0:9d17e4342598 5209
wolfSSL 0:9d17e4342598 5210 #ifdef SESSION_CERTS
wolfSSL 0:9d17e4342598 5211 SessionCache[row].Sessions[idx].chain.count = ssl->session.chain.count;
wolfSSL 0:9d17e4342598 5212 XMEMCPY(SessionCache[row].Sessions[idx].chain.certs,
wolfSSL 0:9d17e4342598 5213 ssl->session.chain.certs, sizeof(x509_buffer) * MAX_CHAIN_DEPTH);
wolfSSL 0:9d17e4342598 5214
wolfSSL 0:9d17e4342598 5215 SessionCache[row].Sessions[idx].version = ssl->version;
wolfSSL 0:9d17e4342598 5216 SessionCache[row].Sessions[idx].cipherSuite0 = ssl->options.cipherSuite0;
wolfSSL 0:9d17e4342598 5217 SessionCache[row].Sessions[idx].cipherSuite = ssl->options.cipherSuite;
wolfSSL 0:9d17e4342598 5218 #endif /* SESSION_CERTS */
wolfSSL 0:9d17e4342598 5219
wolfSSL 0:9d17e4342598 5220 SessionCache[row].totalCount++;
wolfSSL 0:9d17e4342598 5221 if (SessionCache[row].nextIdx == SESSIONS_PER_ROW)
wolfSSL 0:9d17e4342598 5222 SessionCache[row].nextIdx = 0;
wolfSSL 0:9d17e4342598 5223
wolfSSL 0:9d17e4342598 5224 #ifndef NO_CLIENT_CACHE
wolfSSL 0:9d17e4342598 5225 if (ssl->options.side == CYASSL_CLIENT_END && ssl->session.idLen) {
wolfSSL 0:9d17e4342598 5226 word32 clientRow, clientIdx;
wolfSSL 0:9d17e4342598 5227
wolfSSL 0:9d17e4342598 5228 CYASSL_MSG("Adding client cache entry");
wolfSSL 0:9d17e4342598 5229
wolfSSL 0:9d17e4342598 5230 SessionCache[row].Sessions[idx].idLen = ssl->session.idLen;
wolfSSL 0:9d17e4342598 5231 XMEMCPY(SessionCache[row].Sessions[idx].serverID, ssl->session.serverID,
wolfSSL 0:9d17e4342598 5232 ssl->session.idLen);
wolfSSL 0:9d17e4342598 5233
wolfSSL 0:9d17e4342598 5234 clientRow = HashSession(ssl->session.serverID, ssl->session.idLen,
wolfSSL 0:9d17e4342598 5235 &error) % SESSION_ROWS;
wolfSSL 0:9d17e4342598 5236 if (error != 0) {
wolfSSL 0:9d17e4342598 5237 CYASSL_MSG("Hash session failed");
wolfSSL 0:9d17e4342598 5238 return error;
wolfSSL 0:9d17e4342598 5239 }
wolfSSL 0:9d17e4342598 5240 clientIdx = ClientCache[clientRow].nextIdx++;
wolfSSL 0:9d17e4342598 5241
wolfSSL 0:9d17e4342598 5242 ClientCache[clientRow].Clients[clientIdx].serverRow = (word16)row;
wolfSSL 0:9d17e4342598 5243 ClientCache[clientRow].Clients[clientIdx].serverIdx = (word16)idx;
wolfSSL 0:9d17e4342598 5244
wolfSSL 0:9d17e4342598 5245 ClientCache[clientRow].totalCount++;
wolfSSL 0:9d17e4342598 5246 if (ClientCache[clientRow].nextIdx == SESSIONS_PER_ROW)
wolfSSL 0:9d17e4342598 5247 ClientCache[clientRow].nextIdx = 0;
wolfSSL 0:9d17e4342598 5248 }
wolfSSL 0:9d17e4342598 5249 else
wolfSSL 0:9d17e4342598 5250 SessionCache[row].Sessions[idx].idLen = 0;
wolfSSL 0:9d17e4342598 5251 #endif /* NO_CLIENT_CACHE */
wolfSSL 0:9d17e4342598 5252
wolfSSL 0:9d17e4342598 5253 if (UnLockMutex(&session_mutex) != 0)
wolfSSL 0:9d17e4342598 5254 return BAD_MUTEX_E;
wolfSSL 0:9d17e4342598 5255
wolfSSL 0:9d17e4342598 5256 return 0;
wolfSSL 0:9d17e4342598 5257 }
wolfSSL 0:9d17e4342598 5258
wolfSSL 0:9d17e4342598 5259
wolfSSL 0:9d17e4342598 5260 #ifdef SESSION_INDEX
wolfSSL 0:9d17e4342598 5261
wolfSSL 0:9d17e4342598 5262 int CyaSSL_GetSessionIndex(CYASSL* ssl)
wolfSSL 0:9d17e4342598 5263 {
wolfSSL 0:9d17e4342598 5264 CYASSL_ENTER("CyaSSL_GetSessionIndex");
wolfSSL 0:9d17e4342598 5265 CYASSL_LEAVE("CyaSSL_GetSessionIndex", ssl->sessionIndex);
wolfSSL 0:9d17e4342598 5266 return ssl->sessionIndex;
wolfSSL 0:9d17e4342598 5267 }
wolfSSL 0:9d17e4342598 5268
wolfSSL 0:9d17e4342598 5269
wolfSSL 0:9d17e4342598 5270 int CyaSSL_GetSessionAtIndex(int idx, CYASSL_SESSION* session)
wolfSSL 0:9d17e4342598 5271 {
wolfSSL 0:9d17e4342598 5272 int row, col, result = SSL_FAILURE;
wolfSSL 0:9d17e4342598 5273
wolfSSL 0:9d17e4342598 5274 CYASSL_ENTER("CyaSSL_GetSessionAtIndex");
wolfSSL 0:9d17e4342598 5275
wolfSSL 0:9d17e4342598 5276 row = idx >> SESSIDX_ROW_SHIFT;
wolfSSL 0:9d17e4342598 5277 col = idx & SESSIDX_IDX_MASK;
wolfSSL 0:9d17e4342598 5278
wolfSSL 0:9d17e4342598 5279 if (LockMutex(&session_mutex) != 0) {
wolfSSL 0:9d17e4342598 5280 return BAD_MUTEX_E;
wolfSSL 0:9d17e4342598 5281 }
wolfSSL 0:9d17e4342598 5282
wolfSSL 0:9d17e4342598 5283 if (row < SESSION_ROWS &&
wolfSSL 0:9d17e4342598 5284 col < (int)min(SessionCache[row].totalCount, SESSIONS_PER_ROW)) {
wolfSSL 0:9d17e4342598 5285 XMEMCPY(session,
wolfSSL 0:9d17e4342598 5286 &SessionCache[row].Sessions[col], sizeof(CYASSL_SESSION));
wolfSSL 0:9d17e4342598 5287 result = SSL_SUCCESS;
wolfSSL 0:9d17e4342598 5288 }
wolfSSL 0:9d17e4342598 5289
wolfSSL 0:9d17e4342598 5290 if (UnLockMutex(&session_mutex) != 0)
wolfSSL 0:9d17e4342598 5291 result = BAD_MUTEX_E;
wolfSSL 0:9d17e4342598 5292
wolfSSL 0:9d17e4342598 5293 CYASSL_LEAVE("CyaSSL_GetSessionAtIndex", result);
wolfSSL 0:9d17e4342598 5294 return result;
wolfSSL 0:9d17e4342598 5295 }
wolfSSL 0:9d17e4342598 5296
wolfSSL 0:9d17e4342598 5297 #endif /* SESSION_INDEX */
wolfSSL 0:9d17e4342598 5298
wolfSSL 0:9d17e4342598 5299 #if defined(SESSION_INDEX) && defined(SESSION_CERTS)
wolfSSL 0:9d17e4342598 5300
wolfSSL 0:9d17e4342598 5301 CYASSL_X509_CHAIN* CyaSSL_SESSION_get_peer_chain(CYASSL_SESSION* session)
wolfSSL 0:9d17e4342598 5302 {
wolfSSL 0:9d17e4342598 5303 CYASSL_X509_CHAIN* chain = NULL;
wolfSSL 0:9d17e4342598 5304
wolfSSL 0:9d17e4342598 5305 CYASSL_ENTER("CyaSSL_SESSION_get_peer_chain");
wolfSSL 0:9d17e4342598 5306 if (session)
wolfSSL 0:9d17e4342598 5307 chain = &session->chain;
wolfSSL 0:9d17e4342598 5308
wolfSSL 0:9d17e4342598 5309 CYASSL_LEAVE("CyaSSL_SESSION_get_peer_chain", chain ? 1 : 0);
wolfSSL 0:9d17e4342598 5310 return chain;
wolfSSL 0:9d17e4342598 5311 }
wolfSSL 0:9d17e4342598 5312
wolfSSL 0:9d17e4342598 5313 #endif /* SESSION_INDEX && SESSION_CERTS */
wolfSSL 0:9d17e4342598 5314
wolfSSL 0:9d17e4342598 5315
wolfSSL 0:9d17e4342598 5316 #ifdef SESSION_STATS
wolfSSL 0:9d17e4342598 5317
wolfSSL 0:9d17e4342598 5318 CYASSL_API
wolfSSL 0:9d17e4342598 5319 void PrintSessionStats(void)
wolfSSL 0:9d17e4342598 5320 {
wolfSSL 0:9d17e4342598 5321 word32 totalSessionsSeen = 0;
wolfSSL 0:9d17e4342598 5322 word32 totalSessionsNow = 0;
wolfSSL 0:9d17e4342598 5323 word32 rowNow;
wolfSSL 0:9d17e4342598 5324 int i;
wolfSSL 0:9d17e4342598 5325 double E; /* expected freq */
wolfSSL 0:9d17e4342598 5326 double chiSquare = 0;
wolfSSL 0:9d17e4342598 5327
wolfSSL 0:9d17e4342598 5328 for (i = 0; i < SESSION_ROWS; i++) {
wolfSSL 0:9d17e4342598 5329 totalSessionsSeen += SessionCache[i].totalCount;
wolfSSL 0:9d17e4342598 5330
wolfSSL 0:9d17e4342598 5331 if (SessionCache[i].totalCount >= SESSIONS_PER_ROW)
wolfSSL 0:9d17e4342598 5332 rowNow = SESSIONS_PER_ROW;
wolfSSL 0:9d17e4342598 5333 else if (SessionCache[i].nextIdx == 0)
wolfSSL 0:9d17e4342598 5334 rowNow = 0;
wolfSSL 0:9d17e4342598 5335 else
wolfSSL 0:9d17e4342598 5336 rowNow = SessionCache[i].nextIdx;
wolfSSL 0:9d17e4342598 5337
wolfSSL 0:9d17e4342598 5338 totalSessionsNow += rowNow;
wolfSSL 0:9d17e4342598 5339 }
wolfSSL 0:9d17e4342598 5340
wolfSSL 0:9d17e4342598 5341 printf("Total Sessions Seen = %d\n", totalSessionsSeen);
wolfSSL 0:9d17e4342598 5342 printf("Total Sessions Now = %d\n", totalSessionsNow);
wolfSSL 0:9d17e4342598 5343
wolfSSL 0:9d17e4342598 5344 E = (double)totalSessionsSeen / SESSION_ROWS;
wolfSSL 0:9d17e4342598 5345
wolfSSL 0:9d17e4342598 5346 for (i = 0; i < SESSION_ROWS; i++) {
wolfSSL 0:9d17e4342598 5347 double diff = SessionCache[i].totalCount - E;
wolfSSL 0:9d17e4342598 5348 diff *= diff; /* square */
wolfSSL 0:9d17e4342598 5349 diff /= E; /* normalize */
wolfSSL 0:9d17e4342598 5350
wolfSSL 0:9d17e4342598 5351 chiSquare += diff;
wolfSSL 0:9d17e4342598 5352 }
wolfSSL 0:9d17e4342598 5353 printf(" chi-square = %5.1f, d.f. = %d\n", chiSquare,
wolfSSL 0:9d17e4342598 5354 SESSION_ROWS - 1);
wolfSSL 0:9d17e4342598 5355 if (SESSION_ROWS == 11)
wolfSSL 0:9d17e4342598 5356 printf(" .05 p value = 18.3, chi-square should be less\n");
wolfSSL 0:9d17e4342598 5357 else if (SESSION_ROWS == 211)
wolfSSL 0:9d17e4342598 5358 printf(".05 p value = 244.8, chi-square should be less\n");
wolfSSL 0:9d17e4342598 5359 else if (SESSION_ROWS == 5981)
wolfSSL 0:9d17e4342598 5360 printf(".05 p value = 6161.0, chi-square should be less\n");
wolfSSL 0:9d17e4342598 5361 else if (SESSION_ROWS == 3)
wolfSSL 0:9d17e4342598 5362 printf(".05 p value = 6.0, chi-square should be less\n");
wolfSSL 0:9d17e4342598 5363 else if (SESSION_ROWS == 2861)
wolfSSL 0:9d17e4342598 5364 printf(".05 p value = 2985.5, chi-square should be less\n");
wolfSSL 0:9d17e4342598 5365 printf("\n");
wolfSSL 0:9d17e4342598 5366 }
wolfSSL 0:9d17e4342598 5367
wolfSSL 0:9d17e4342598 5368 #endif /* SESSION_STATS */
wolfSSL 0:9d17e4342598 5369
wolfSSL 0:9d17e4342598 5370 #else /* NO_SESSION_CACHE */
wolfSSL 0:9d17e4342598 5371
wolfSSL 0:9d17e4342598 5372 /* No session cache version */
wolfSSL 0:9d17e4342598 5373 CYASSL_SESSION* GetSession(CYASSL* ssl, byte* masterSecret)
wolfSSL 0:9d17e4342598 5374 {
wolfSSL 0:9d17e4342598 5375 (void)ssl;
wolfSSL 0:9d17e4342598 5376 (void)masterSecret;
wolfSSL 0:9d17e4342598 5377
wolfSSL 0:9d17e4342598 5378 return NULL;
wolfSSL 0:9d17e4342598 5379 }
wolfSSL 0:9d17e4342598 5380
wolfSSL 0:9d17e4342598 5381 #endif /* NO_SESSION_CACHE */
wolfSSL 0:9d17e4342598 5382
wolfSSL 0:9d17e4342598 5383
wolfSSL 0:9d17e4342598 5384 /* call before SSL_connect, if verifying will add name check to
wolfSSL 0:9d17e4342598 5385 date check and signature check */
wolfSSL 0:9d17e4342598 5386 int CyaSSL_check_domain_name(CYASSL* ssl, const char* dn)
wolfSSL 0:9d17e4342598 5387 {
wolfSSL 0:9d17e4342598 5388 CYASSL_ENTER("CyaSSL_check_domain_name");
wolfSSL 0:9d17e4342598 5389 if (ssl->buffers.domainName.buffer)
wolfSSL 0:9d17e4342598 5390 XFREE(ssl->buffers.domainName.buffer, ssl->heap, DYNAMIC_TYPE_DOMAIN);
wolfSSL 0:9d17e4342598 5391
wolfSSL 0:9d17e4342598 5392 ssl->buffers.domainName.length = (word32)XSTRLEN(dn) + 1;
wolfSSL 0:9d17e4342598 5393 ssl->buffers.domainName.buffer = (byte*) XMALLOC(
wolfSSL 0:9d17e4342598 5394 ssl->buffers.domainName.length, ssl->heap, DYNAMIC_TYPE_DOMAIN);
wolfSSL 0:9d17e4342598 5395
wolfSSL 0:9d17e4342598 5396 if (ssl->buffers.domainName.buffer) {
wolfSSL 0:9d17e4342598 5397 XSTRNCPY((char*)ssl->buffers.domainName.buffer, dn,
wolfSSL 0:9d17e4342598 5398 ssl->buffers.domainName.length);
wolfSSL 0:9d17e4342598 5399 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 5400 }
wolfSSL 0:9d17e4342598 5401 else {
wolfSSL 0:9d17e4342598 5402 ssl->error = MEMORY_ERROR;
wolfSSL 0:9d17e4342598 5403 return SSL_FAILURE;
wolfSSL 0:9d17e4342598 5404 }
wolfSSL 0:9d17e4342598 5405 }
wolfSSL 0:9d17e4342598 5406
wolfSSL 0:9d17e4342598 5407
wolfSSL 0:9d17e4342598 5408 /* turn on CyaSSL zlib compression
wolfSSL 0:9d17e4342598 5409 returns SSL_SUCCESS for success, else error (not built in)
wolfSSL 0:9d17e4342598 5410 */
wolfSSL 0:9d17e4342598 5411 int CyaSSL_set_compression(CYASSL* ssl)
wolfSSL 0:9d17e4342598 5412 {
wolfSSL 0:9d17e4342598 5413 CYASSL_ENTER("CyaSSL_set_compression");
wolfSSL 0:9d17e4342598 5414 (void)ssl;
wolfSSL 0:9d17e4342598 5415 #ifdef HAVE_LIBZ
wolfSSL 0:9d17e4342598 5416 ssl->options.usingCompression = 1;
wolfSSL 0:9d17e4342598 5417 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 5418 #else
wolfSSL 0:9d17e4342598 5419 return NOT_COMPILED_IN;
wolfSSL 0:9d17e4342598 5420 #endif
wolfSSL 0:9d17e4342598 5421 }
wolfSSL 0:9d17e4342598 5422
wolfSSL 0:9d17e4342598 5423
wolfSSL 0:9d17e4342598 5424 #ifndef USE_WINDOWS_API
wolfSSL 0:9d17e4342598 5425 #ifndef NO_WRITEV
wolfSSL 0:9d17e4342598 5426
wolfSSL 0:9d17e4342598 5427 /* simulate writev semantics, doesn't actually do block at a time though
wolfSSL 0:9d17e4342598 5428 because of SSL_write behavior and because front adds may be small */
wolfSSL 0:9d17e4342598 5429 int CyaSSL_writev(CYASSL* ssl, const struct iovec* iov, int iovcnt)
wolfSSL 0:9d17e4342598 5430 {
wolfSSL 0:9d17e4342598 5431 byte tmp[FILE_BUFFER_SIZE];
wolfSSL 0:9d17e4342598 5432 byte* myBuffer = tmp;
wolfSSL 0:9d17e4342598 5433 int sending = 0;
wolfSSL 0:9d17e4342598 5434 int newBuffer = 0;
wolfSSL 0:9d17e4342598 5435 int idx = 0;
wolfSSL 0:9d17e4342598 5436 int i;
wolfSSL 0:9d17e4342598 5437 int ret;
wolfSSL 0:9d17e4342598 5438
wolfSSL 0:9d17e4342598 5439 CYASSL_ENTER("CyaSSL_writev");
wolfSSL 0:9d17e4342598 5440
wolfSSL 0:9d17e4342598 5441 for (i = 0; i < iovcnt; i++)
wolfSSL 0:9d17e4342598 5442 sending += (int)iov[i].iov_len;
wolfSSL 0:9d17e4342598 5443
wolfSSL 0:9d17e4342598 5444 if (sending > (int)sizeof(tmp)) {
wolfSSL 0:9d17e4342598 5445 byte* tmp2 = (byte*) XMALLOC(sending, ssl->heap,
wolfSSL 0:9d17e4342598 5446 DYNAMIC_TYPE_WRITEV);
wolfSSL 0:9d17e4342598 5447 if (!tmp2)
wolfSSL 0:9d17e4342598 5448 return MEMORY_ERROR;
wolfSSL 0:9d17e4342598 5449 myBuffer = tmp2;
wolfSSL 0:9d17e4342598 5450 newBuffer = 1;
wolfSSL 0:9d17e4342598 5451 }
wolfSSL 0:9d17e4342598 5452
wolfSSL 0:9d17e4342598 5453 for (i = 0; i < iovcnt; i++) {
wolfSSL 0:9d17e4342598 5454 XMEMCPY(&myBuffer[idx], iov[i].iov_base, iov[i].iov_len);
wolfSSL 0:9d17e4342598 5455 idx += (int)iov[i].iov_len;
wolfSSL 0:9d17e4342598 5456 }
wolfSSL 0:9d17e4342598 5457
wolfSSL 0:9d17e4342598 5458 ret = CyaSSL_write(ssl, myBuffer, sending);
wolfSSL 0:9d17e4342598 5459
wolfSSL 0:9d17e4342598 5460 if (newBuffer) XFREE(myBuffer, ssl->heap, DYNAMIC_TYPE_WRITEV);
wolfSSL 0:9d17e4342598 5461
wolfSSL 0:9d17e4342598 5462 return ret;
wolfSSL 0:9d17e4342598 5463 }
wolfSSL 0:9d17e4342598 5464 #endif
wolfSSL 0:9d17e4342598 5465 #endif
wolfSSL 0:9d17e4342598 5466
wolfSSL 0:9d17e4342598 5467
wolfSSL 0:9d17e4342598 5468 #ifdef CYASSL_CALLBACKS
wolfSSL 0:9d17e4342598 5469
wolfSSL 0:9d17e4342598 5470 typedef struct itimerval Itimerval;
wolfSSL 0:9d17e4342598 5471
wolfSSL 0:9d17e4342598 5472 /* don't keep calling simple functions while setting up timer and singals
wolfSSL 0:9d17e4342598 5473 if no inlining these are the next best */
wolfSSL 0:9d17e4342598 5474
wolfSSL 0:9d17e4342598 5475 #define AddTimes(a, b, c) \
wolfSSL 0:9d17e4342598 5476 do { \
wolfSSL 0:9d17e4342598 5477 c.tv_sec = a.tv_sec + b.tv_sec; \
wolfSSL 0:9d17e4342598 5478 c.tv_usec = a.tv_usec + b.tv_usec; \
wolfSSL 0:9d17e4342598 5479 if (c.tv_usec >= 1000000) { \
wolfSSL 0:9d17e4342598 5480 c.tv_sec++; \
wolfSSL 0:9d17e4342598 5481 c.tv_usec -= 1000000; \
wolfSSL 0:9d17e4342598 5482 } \
wolfSSL 0:9d17e4342598 5483 } while (0)
wolfSSL 0:9d17e4342598 5484
wolfSSL 0:9d17e4342598 5485
wolfSSL 0:9d17e4342598 5486 #define SubtractTimes(a, b, c) \
wolfSSL 0:9d17e4342598 5487 do { \
wolfSSL 0:9d17e4342598 5488 c.tv_sec = a.tv_sec - b.tv_sec; \
wolfSSL 0:9d17e4342598 5489 c.tv_usec = a.tv_usec - b.tv_usec; \
wolfSSL 0:9d17e4342598 5490 if (c.tv_usec < 0) { \
wolfSSL 0:9d17e4342598 5491 c.tv_sec--; \
wolfSSL 0:9d17e4342598 5492 c.tv_usec += 1000000; \
wolfSSL 0:9d17e4342598 5493 } \
wolfSSL 0:9d17e4342598 5494 } while (0)
wolfSSL 0:9d17e4342598 5495
wolfSSL 0:9d17e4342598 5496 #define CmpTimes(a, b, cmp) \
wolfSSL 0:9d17e4342598 5497 ((a.tv_sec == b.tv_sec) ? \
wolfSSL 0:9d17e4342598 5498 (a.tv_usec cmp b.tv_usec) : \
wolfSSL 0:9d17e4342598 5499 (a.tv_sec cmp b.tv_sec)) \
wolfSSL 0:9d17e4342598 5500
wolfSSL 0:9d17e4342598 5501
wolfSSL 0:9d17e4342598 5502 /* do nothing handler */
wolfSSL 0:9d17e4342598 5503 static void myHandler(int signo)
wolfSSL 0:9d17e4342598 5504 {
wolfSSL 0:9d17e4342598 5505 (void)signo;
wolfSSL 0:9d17e4342598 5506 return;
wolfSSL 0:9d17e4342598 5507 }
wolfSSL 0:9d17e4342598 5508
wolfSSL 0:9d17e4342598 5509
wolfSSL 0:9d17e4342598 5510 static int CyaSSL_ex_wrapper(CYASSL* ssl, HandShakeCallBack hsCb,
wolfSSL 0:9d17e4342598 5511 TimeoutCallBack toCb, Timeval timeout)
wolfSSL 0:9d17e4342598 5512 {
wolfSSL 0:9d17e4342598 5513 int ret = SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 5514 int oldTimerOn = 0; /* was timer already on */
wolfSSL 0:9d17e4342598 5515 Timeval startTime;
wolfSSL 0:9d17e4342598 5516 Timeval endTime;
wolfSSL 0:9d17e4342598 5517 Timeval totalTime;
wolfSSL 0:9d17e4342598 5518 Itimerval myTimeout;
wolfSSL 0:9d17e4342598 5519 Itimerval oldTimeout; /* if old timer adjust from total time to reset */
wolfSSL 0:9d17e4342598 5520 struct sigaction act, oact;
wolfSSL 0:9d17e4342598 5521
wolfSSL 0:9d17e4342598 5522 #define ERR_OUT(x) { ssl->hsInfoOn = 0; ssl->toInfoOn = 0; return x; }
wolfSSL 0:9d17e4342598 5523
wolfSSL 0:9d17e4342598 5524 if (hsCb) {
wolfSSL 0:9d17e4342598 5525 ssl->hsInfoOn = 1;
wolfSSL 0:9d17e4342598 5526 InitHandShakeInfo(&ssl->handShakeInfo);
wolfSSL 0:9d17e4342598 5527 }
wolfSSL 0:9d17e4342598 5528 if (toCb) {
wolfSSL 0:9d17e4342598 5529 ssl->toInfoOn = 1;
wolfSSL 0:9d17e4342598 5530 InitTimeoutInfo(&ssl->timeoutInfo);
wolfSSL 0:9d17e4342598 5531
wolfSSL 0:9d17e4342598 5532 if (gettimeofday(&startTime, 0) < 0)
wolfSSL 0:9d17e4342598 5533 ERR_OUT(GETTIME_ERROR);
wolfSSL 0:9d17e4342598 5534
wolfSSL 0:9d17e4342598 5535 /* use setitimer to simulate getitimer, init 0 myTimeout */
wolfSSL 0:9d17e4342598 5536 myTimeout.it_interval.tv_sec = 0;
wolfSSL 0:9d17e4342598 5537 myTimeout.it_interval.tv_usec = 0;
wolfSSL 0:9d17e4342598 5538 myTimeout.it_value.tv_sec = 0;
wolfSSL 0:9d17e4342598 5539 myTimeout.it_value.tv_usec = 0;
wolfSSL 0:9d17e4342598 5540 if (setitimer(ITIMER_REAL, &myTimeout, &oldTimeout) < 0)
wolfSSL 0:9d17e4342598 5541 ERR_OUT(SETITIMER_ERROR);
wolfSSL 0:9d17e4342598 5542
wolfSSL 0:9d17e4342598 5543 if (oldTimeout.it_value.tv_sec || oldTimeout.it_value.tv_usec) {
wolfSSL 0:9d17e4342598 5544 oldTimerOn = 1;
wolfSSL 0:9d17e4342598 5545
wolfSSL 0:9d17e4342598 5546 /* is old timer going to expire before ours */
wolfSSL 0:9d17e4342598 5547 if (CmpTimes(oldTimeout.it_value, timeout, <)) {
wolfSSL 0:9d17e4342598 5548 timeout.tv_sec = oldTimeout.it_value.tv_sec;
wolfSSL 0:9d17e4342598 5549 timeout.tv_usec = oldTimeout.it_value.tv_usec;
wolfSSL 0:9d17e4342598 5550 }
wolfSSL 0:9d17e4342598 5551 }
wolfSSL 0:9d17e4342598 5552 myTimeout.it_value.tv_sec = timeout.tv_sec;
wolfSSL 0:9d17e4342598 5553 myTimeout.it_value.tv_usec = timeout.tv_usec;
wolfSSL 0:9d17e4342598 5554
wolfSSL 0:9d17e4342598 5555 /* set up signal handler, don't restart socket send/recv */
wolfSSL 0:9d17e4342598 5556 act.sa_handler = myHandler;
wolfSSL 0:9d17e4342598 5557 sigemptyset(&act.sa_mask);
wolfSSL 0:9d17e4342598 5558 act.sa_flags = 0;
wolfSSL 0:9d17e4342598 5559 #ifdef SA_INTERRUPT
wolfSSL 0:9d17e4342598 5560 act.sa_flags |= SA_INTERRUPT;
wolfSSL 0:9d17e4342598 5561 #endif
wolfSSL 0:9d17e4342598 5562 if (sigaction(SIGALRM, &act, &oact) < 0)
wolfSSL 0:9d17e4342598 5563 ERR_OUT(SIGACT_ERROR);
wolfSSL 0:9d17e4342598 5564
wolfSSL 0:9d17e4342598 5565 if (setitimer(ITIMER_REAL, &myTimeout, 0) < 0)
wolfSSL 0:9d17e4342598 5566 ERR_OUT(SETITIMER_ERROR);
wolfSSL 0:9d17e4342598 5567 }
wolfSSL 0:9d17e4342598 5568
wolfSSL 0:9d17e4342598 5569 /* do main work */
wolfSSL 0:9d17e4342598 5570 #ifndef NO_CYASSL_CLIENT
wolfSSL 0:9d17e4342598 5571 if (ssl->options.side == CYASSL_CLIENT_END)
wolfSSL 0:9d17e4342598 5572 ret = CyaSSL_connect(ssl);
wolfSSL 0:9d17e4342598 5573 #endif
wolfSSL 0:9d17e4342598 5574 #ifndef NO_CYASSL_SERVER
wolfSSL 0:9d17e4342598 5575 if (ssl->options.side == CYASSL_SERVER_END)
wolfSSL 0:9d17e4342598 5576 ret = CyaSSL_accept(ssl);
wolfSSL 0:9d17e4342598 5577 #endif
wolfSSL 0:9d17e4342598 5578
wolfSSL 0:9d17e4342598 5579 /* do callbacks */
wolfSSL 0:9d17e4342598 5580 if (toCb) {
wolfSSL 0:9d17e4342598 5581 if (oldTimerOn) {
wolfSSL 0:9d17e4342598 5582 gettimeofday(&endTime, 0);
wolfSSL 0:9d17e4342598 5583 SubtractTimes(endTime, startTime, totalTime);
wolfSSL 0:9d17e4342598 5584 /* adjust old timer for elapsed time */
wolfSSL 0:9d17e4342598 5585 if (CmpTimes(totalTime, oldTimeout.it_value, <))
wolfSSL 0:9d17e4342598 5586 SubtractTimes(oldTimeout.it_value, totalTime,
wolfSSL 0:9d17e4342598 5587 oldTimeout.it_value);
wolfSSL 0:9d17e4342598 5588 else {
wolfSSL 0:9d17e4342598 5589 /* reset value to interval, may be off */
wolfSSL 0:9d17e4342598 5590 oldTimeout.it_value.tv_sec = oldTimeout.it_interval.tv_sec;
wolfSSL 0:9d17e4342598 5591 oldTimeout.it_value.tv_usec =oldTimeout.it_interval.tv_usec;
wolfSSL 0:9d17e4342598 5592 }
wolfSSL 0:9d17e4342598 5593 /* keep iter the same whether there or not */
wolfSSL 0:9d17e4342598 5594 }
wolfSSL 0:9d17e4342598 5595 /* restore old handler */
wolfSSL 0:9d17e4342598 5596 if (sigaction(SIGALRM, &oact, 0) < 0)
wolfSSL 0:9d17e4342598 5597 ret = SIGACT_ERROR; /* more pressing error, stomp */
wolfSSL 0:9d17e4342598 5598 else
wolfSSL 0:9d17e4342598 5599 /* use old settings which may turn off (expired or not there) */
wolfSSL 0:9d17e4342598 5600 if (setitimer(ITIMER_REAL, &oldTimeout, 0) < 0)
wolfSSL 0:9d17e4342598 5601 ret = SETITIMER_ERROR;
wolfSSL 0:9d17e4342598 5602
wolfSSL 0:9d17e4342598 5603 /* if we had a timeout call callback */
wolfSSL 0:9d17e4342598 5604 if (ssl->timeoutInfo.timeoutName[0]) {
wolfSSL 0:9d17e4342598 5605 ssl->timeoutInfo.timeoutValue.tv_sec = timeout.tv_sec;
wolfSSL 0:9d17e4342598 5606 ssl->timeoutInfo.timeoutValue.tv_usec = timeout.tv_usec;
wolfSSL 0:9d17e4342598 5607 (toCb)(&ssl->timeoutInfo);
wolfSSL 0:9d17e4342598 5608 }
wolfSSL 0:9d17e4342598 5609 /* clean up */
wolfSSL 0:9d17e4342598 5610 FreeTimeoutInfo(&ssl->timeoutInfo, ssl->heap);
wolfSSL 0:9d17e4342598 5611 ssl->toInfoOn = 0;
wolfSSL 0:9d17e4342598 5612 }
wolfSSL 0:9d17e4342598 5613 if (hsCb) {
wolfSSL 0:9d17e4342598 5614 FinishHandShakeInfo(&ssl->handShakeInfo, ssl);
wolfSSL 0:9d17e4342598 5615 (hsCb)(&ssl->handShakeInfo);
wolfSSL 0:9d17e4342598 5616 ssl->hsInfoOn = 0;
wolfSSL 0:9d17e4342598 5617 }
wolfSSL 0:9d17e4342598 5618 return ret;
wolfSSL 0:9d17e4342598 5619 }
wolfSSL 0:9d17e4342598 5620
wolfSSL 0:9d17e4342598 5621
wolfSSL 0:9d17e4342598 5622 #ifndef NO_CYASSL_CLIENT
wolfSSL 0:9d17e4342598 5623
wolfSSL 0:9d17e4342598 5624 int CyaSSL_connect_ex(CYASSL* ssl, HandShakeCallBack hsCb,
wolfSSL 0:9d17e4342598 5625 TimeoutCallBack toCb, Timeval timeout)
wolfSSL 0:9d17e4342598 5626 {
wolfSSL 0:9d17e4342598 5627 CYASSL_ENTER("CyaSSL_connect_ex");
wolfSSL 0:9d17e4342598 5628 return CyaSSL_ex_wrapper(ssl, hsCb, toCb, timeout);
wolfSSL 0:9d17e4342598 5629 }
wolfSSL 0:9d17e4342598 5630
wolfSSL 0:9d17e4342598 5631 #endif
wolfSSL 0:9d17e4342598 5632
wolfSSL 0:9d17e4342598 5633
wolfSSL 0:9d17e4342598 5634 #ifndef NO_CYASSL_SERVER
wolfSSL 0:9d17e4342598 5635
wolfSSL 0:9d17e4342598 5636 int CyaSSL_accept_ex(CYASSL* ssl, HandShakeCallBack hsCb,
wolfSSL 0:9d17e4342598 5637 TimeoutCallBack toCb,Timeval timeout)
wolfSSL 0:9d17e4342598 5638 {
wolfSSL 0:9d17e4342598 5639 CYASSL_ENTER("CyaSSL_accept_ex");
wolfSSL 0:9d17e4342598 5640 return CyaSSL_ex_wrapper(ssl, hsCb, toCb, timeout);
wolfSSL 0:9d17e4342598 5641 }
wolfSSL 0:9d17e4342598 5642
wolfSSL 0:9d17e4342598 5643 #endif
wolfSSL 0:9d17e4342598 5644
wolfSSL 0:9d17e4342598 5645 #endif /* CYASSL_CALLBACKS */
wolfSSL 0:9d17e4342598 5646
wolfSSL 0:9d17e4342598 5647
wolfSSL 0:9d17e4342598 5648 #ifndef NO_PSK
wolfSSL 0:9d17e4342598 5649
wolfSSL 0:9d17e4342598 5650 void CyaSSL_CTX_set_psk_client_callback(CYASSL_CTX* ctx,
wolfSSL 0:9d17e4342598 5651 psk_client_callback cb)
wolfSSL 0:9d17e4342598 5652 {
wolfSSL 0:9d17e4342598 5653 CYASSL_ENTER("SSL_CTX_set_psk_client_callback");
wolfSSL 0:9d17e4342598 5654 ctx->havePSK = 1;
wolfSSL 0:9d17e4342598 5655 ctx->client_psk_cb = cb;
wolfSSL 0:9d17e4342598 5656 }
wolfSSL 0:9d17e4342598 5657
wolfSSL 0:9d17e4342598 5658
wolfSSL 0:9d17e4342598 5659 void CyaSSL_set_psk_client_callback(CYASSL* ssl, psk_client_callback cb)
wolfSSL 0:9d17e4342598 5660 {
wolfSSL 0:9d17e4342598 5661 byte haveRSA = 1;
wolfSSL 0:9d17e4342598 5662
wolfSSL 0:9d17e4342598 5663 CYASSL_ENTER("SSL_set_psk_client_callback");
wolfSSL 0:9d17e4342598 5664 ssl->options.havePSK = 1;
wolfSSL 0:9d17e4342598 5665 ssl->options.client_psk_cb = cb;
wolfSSL 0:9d17e4342598 5666
wolfSSL 0:9d17e4342598 5667 #ifdef NO_RSA
wolfSSL 0:9d17e4342598 5668 haveRSA = 0;
wolfSSL 0:9d17e4342598 5669 #endif
wolfSSL 0:9d17e4342598 5670 InitSuites(ssl->suites, ssl->version, haveRSA, TRUE,
wolfSSL 0:9d17e4342598 5671 ssl->options.haveDH, ssl->options.haveNTRU,
wolfSSL 0:9d17e4342598 5672 ssl->options.haveECDSAsig, ssl->options.haveStaticECC,
wolfSSL 0:9d17e4342598 5673 ssl->options.side);
wolfSSL 0:9d17e4342598 5674 }
wolfSSL 0:9d17e4342598 5675
wolfSSL 0:9d17e4342598 5676
wolfSSL 0:9d17e4342598 5677 void CyaSSL_CTX_set_psk_server_callback(CYASSL_CTX* ctx,
wolfSSL 0:9d17e4342598 5678 psk_server_callback cb)
wolfSSL 0:9d17e4342598 5679 {
wolfSSL 0:9d17e4342598 5680 CYASSL_ENTER("SSL_CTX_set_psk_server_callback");
wolfSSL 0:9d17e4342598 5681 ctx->havePSK = 1;
wolfSSL 0:9d17e4342598 5682 ctx->server_psk_cb = cb;
wolfSSL 0:9d17e4342598 5683 }
wolfSSL 0:9d17e4342598 5684
wolfSSL 0:9d17e4342598 5685
wolfSSL 0:9d17e4342598 5686 void CyaSSL_set_psk_server_callback(CYASSL* ssl, psk_server_callback cb)
wolfSSL 0:9d17e4342598 5687 {
wolfSSL 0:9d17e4342598 5688 byte haveRSA = 1;
wolfSSL 0:9d17e4342598 5689
wolfSSL 0:9d17e4342598 5690 CYASSL_ENTER("SSL_set_psk_server_callback");
wolfSSL 0:9d17e4342598 5691 ssl->options.havePSK = 1;
wolfSSL 0:9d17e4342598 5692 ssl->options.server_psk_cb = cb;
wolfSSL 0:9d17e4342598 5693
wolfSSL 0:9d17e4342598 5694 #ifdef NO_RSA
wolfSSL 0:9d17e4342598 5695 haveRSA = 0;
wolfSSL 0:9d17e4342598 5696 #endif
wolfSSL 0:9d17e4342598 5697 InitSuites(ssl->suites, ssl->version, haveRSA, TRUE,
wolfSSL 0:9d17e4342598 5698 ssl->options.haveDH, ssl->options.haveNTRU,
wolfSSL 0:9d17e4342598 5699 ssl->options.haveECDSAsig, ssl->options.haveStaticECC,
wolfSSL 0:9d17e4342598 5700 ssl->options.side);
wolfSSL 0:9d17e4342598 5701 }
wolfSSL 0:9d17e4342598 5702
wolfSSL 0:9d17e4342598 5703
wolfSSL 0:9d17e4342598 5704 const char* CyaSSL_get_psk_identity_hint(const CYASSL* ssl)
wolfSSL 0:9d17e4342598 5705 {
wolfSSL 0:9d17e4342598 5706 CYASSL_ENTER("SSL_get_psk_identity_hint");
wolfSSL 0:9d17e4342598 5707
wolfSSL 0:9d17e4342598 5708 if (ssl == NULL || ssl->arrays == NULL)
wolfSSL 0:9d17e4342598 5709 return NULL;
wolfSSL 0:9d17e4342598 5710
wolfSSL 0:9d17e4342598 5711 return ssl->arrays->server_hint;
wolfSSL 0:9d17e4342598 5712 }
wolfSSL 0:9d17e4342598 5713
wolfSSL 0:9d17e4342598 5714
wolfSSL 0:9d17e4342598 5715 const char* CyaSSL_get_psk_identity(const CYASSL* ssl)
wolfSSL 0:9d17e4342598 5716 {
wolfSSL 0:9d17e4342598 5717 CYASSL_ENTER("SSL_get_psk_identity");
wolfSSL 0:9d17e4342598 5718
wolfSSL 0:9d17e4342598 5719 if (ssl == NULL || ssl->arrays == NULL)
wolfSSL 0:9d17e4342598 5720 return NULL;
wolfSSL 0:9d17e4342598 5721
wolfSSL 0:9d17e4342598 5722 return ssl->arrays->client_identity;
wolfSSL 0:9d17e4342598 5723 }
wolfSSL 0:9d17e4342598 5724
wolfSSL 0:9d17e4342598 5725
wolfSSL 0:9d17e4342598 5726 int CyaSSL_CTX_use_psk_identity_hint(CYASSL_CTX* ctx, const char* hint)
wolfSSL 0:9d17e4342598 5727 {
wolfSSL 0:9d17e4342598 5728 CYASSL_ENTER("SSL_CTX_use_psk_identity_hint");
wolfSSL 0:9d17e4342598 5729 if (hint == 0)
wolfSSL 0:9d17e4342598 5730 ctx->server_hint[0] = 0;
wolfSSL 0:9d17e4342598 5731 else {
wolfSSL 0:9d17e4342598 5732 XSTRNCPY(ctx->server_hint, hint, MAX_PSK_ID_LEN);
wolfSSL 0:9d17e4342598 5733 ctx->server_hint[MAX_PSK_ID_LEN - 1] = '\0';
wolfSSL 0:9d17e4342598 5734 }
wolfSSL 0:9d17e4342598 5735 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 5736 }
wolfSSL 0:9d17e4342598 5737
wolfSSL 0:9d17e4342598 5738
wolfSSL 0:9d17e4342598 5739 int CyaSSL_use_psk_identity_hint(CYASSL* ssl, const char* hint)
wolfSSL 0:9d17e4342598 5740 {
wolfSSL 0:9d17e4342598 5741 CYASSL_ENTER("SSL_use_psk_identity_hint");
wolfSSL 0:9d17e4342598 5742
wolfSSL 0:9d17e4342598 5743 if (ssl == NULL || ssl->arrays == NULL)
wolfSSL 0:9d17e4342598 5744 return SSL_FAILURE;
wolfSSL 0:9d17e4342598 5745
wolfSSL 0:9d17e4342598 5746 if (hint == 0)
wolfSSL 0:9d17e4342598 5747 ssl->arrays->server_hint[0] = 0;
wolfSSL 0:9d17e4342598 5748 else {
wolfSSL 0:9d17e4342598 5749 XSTRNCPY(ssl->arrays->server_hint, hint, MAX_PSK_ID_LEN);
wolfSSL 0:9d17e4342598 5750 ssl->arrays->server_hint[MAX_PSK_ID_LEN - 1] = '\0';
wolfSSL 0:9d17e4342598 5751 }
wolfSSL 0:9d17e4342598 5752 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 5753 }
wolfSSL 0:9d17e4342598 5754
wolfSSL 0:9d17e4342598 5755 #endif /* NO_PSK */
wolfSSL 0:9d17e4342598 5756
wolfSSL 0:9d17e4342598 5757
wolfSSL 0:9d17e4342598 5758 #ifndef NO_CERTS
wolfSSL 0:9d17e4342598 5759 /* used to be defined on NO_FILESYSTEM only, but are generally useful */
wolfSSL 0:9d17e4342598 5760
wolfSSL 0:9d17e4342598 5761 /* CyaSSL extension allows DER files to be loaded from buffers as well */
wolfSSL 0:9d17e4342598 5762 int CyaSSL_CTX_load_verify_buffer(CYASSL_CTX* ctx, const unsigned char* in,
wolfSSL 0:9d17e4342598 5763 long sz, int format)
wolfSSL 0:9d17e4342598 5764 {
wolfSSL 0:9d17e4342598 5765 CYASSL_ENTER("CyaSSL_CTX_load_verify_buffer");
wolfSSL 0:9d17e4342598 5766 if (format == SSL_FILETYPE_PEM)
wolfSSL 0:9d17e4342598 5767 return ProcessChainBuffer(ctx, in, sz, format, CA_TYPE, NULL);
wolfSSL 0:9d17e4342598 5768 else
wolfSSL 0:9d17e4342598 5769 return ProcessBuffer(ctx, in, sz, format, CA_TYPE, NULL,NULL,0);
wolfSSL 0:9d17e4342598 5770 }
wolfSSL 0:9d17e4342598 5771
wolfSSL 0:9d17e4342598 5772
wolfSSL 0:9d17e4342598 5773 int CyaSSL_CTX_use_certificate_buffer(CYASSL_CTX* ctx,
wolfSSL 0:9d17e4342598 5774 const unsigned char* in, long sz, int format)
wolfSSL 0:9d17e4342598 5775 {
wolfSSL 0:9d17e4342598 5776 CYASSL_ENTER("CyaSSL_CTX_use_certificate_buffer");
wolfSSL 0:9d17e4342598 5777 return ProcessBuffer(ctx, in, sz, format, CERT_TYPE, NULL, NULL, 0);
wolfSSL 0:9d17e4342598 5778 }
wolfSSL 0:9d17e4342598 5779
wolfSSL 0:9d17e4342598 5780
wolfSSL 0:9d17e4342598 5781 int CyaSSL_CTX_use_PrivateKey_buffer(CYASSL_CTX* ctx,
wolfSSL 0:9d17e4342598 5782 const unsigned char* in, long sz, int format)
wolfSSL 0:9d17e4342598 5783 {
wolfSSL 0:9d17e4342598 5784 CYASSL_ENTER("CyaSSL_CTX_use_PrivateKey_buffer");
wolfSSL 0:9d17e4342598 5785 return ProcessBuffer(ctx, in, sz, format, PRIVATEKEY_TYPE, NULL,NULL,0);
wolfSSL 0:9d17e4342598 5786 }
wolfSSL 0:9d17e4342598 5787
wolfSSL 0:9d17e4342598 5788
wolfSSL 0:9d17e4342598 5789 int CyaSSL_CTX_use_certificate_chain_buffer(CYASSL_CTX* ctx,
wolfSSL 0:9d17e4342598 5790 const unsigned char* in, long sz)
wolfSSL 0:9d17e4342598 5791 {
wolfSSL 0:9d17e4342598 5792 CYASSL_ENTER("CyaSSL_CTX_use_certificate_chain_buffer");
wolfSSL 0:9d17e4342598 5793 return ProcessBuffer(ctx, in, sz, SSL_FILETYPE_PEM, CERT_TYPE, NULL,
wolfSSL 0:9d17e4342598 5794 NULL, 1);
wolfSSL 0:9d17e4342598 5795 }
wolfSSL 0:9d17e4342598 5796
wolfSSL 0:9d17e4342598 5797 int CyaSSL_use_certificate_buffer(CYASSL* ssl,
wolfSSL 0:9d17e4342598 5798 const unsigned char* in, long sz, int format)
wolfSSL 0:9d17e4342598 5799 {
wolfSSL 0:9d17e4342598 5800 CYASSL_ENTER("CyaSSL_use_certificate_buffer");
wolfSSL 0:9d17e4342598 5801 return ProcessBuffer(ssl->ctx, in, sz, format,CERT_TYPE,ssl,NULL,0);
wolfSSL 0:9d17e4342598 5802 }
wolfSSL 0:9d17e4342598 5803
wolfSSL 0:9d17e4342598 5804
wolfSSL 0:9d17e4342598 5805 int CyaSSL_use_PrivateKey_buffer(CYASSL* ssl,
wolfSSL 0:9d17e4342598 5806 const unsigned char* in, long sz, int format)
wolfSSL 0:9d17e4342598 5807 {
wolfSSL 0:9d17e4342598 5808 CYASSL_ENTER("CyaSSL_use_PrivateKey_buffer");
wolfSSL 0:9d17e4342598 5809 return ProcessBuffer(ssl->ctx, in, sz, format, PRIVATEKEY_TYPE,
wolfSSL 0:9d17e4342598 5810 ssl, NULL, 0);
wolfSSL 0:9d17e4342598 5811 }
wolfSSL 0:9d17e4342598 5812
wolfSSL 0:9d17e4342598 5813
wolfSSL 0:9d17e4342598 5814 int CyaSSL_use_certificate_chain_buffer(CYASSL* ssl,
wolfSSL 0:9d17e4342598 5815 const unsigned char* in, long sz)
wolfSSL 0:9d17e4342598 5816 {
wolfSSL 0:9d17e4342598 5817 CYASSL_ENTER("CyaSSL_use_certificate_chain_buffer");
wolfSSL 0:9d17e4342598 5818 return ProcessBuffer(ssl->ctx, in, sz, SSL_FILETYPE_PEM, CERT_TYPE,
wolfSSL 0:9d17e4342598 5819 ssl, NULL, 1);
wolfSSL 0:9d17e4342598 5820 }
wolfSSL 0:9d17e4342598 5821
wolfSSL 0:9d17e4342598 5822
wolfSSL 0:9d17e4342598 5823 /* unload any certs or keys that SSL owns, leave CTX as is
wolfSSL 0:9d17e4342598 5824 SSL_SUCCESS on ok */
wolfSSL 0:9d17e4342598 5825 int CyaSSL_UnloadCertsKeys(CYASSL* ssl)
wolfSSL 0:9d17e4342598 5826 {
wolfSSL 0:9d17e4342598 5827 if (ssl == NULL) {
wolfSSL 0:9d17e4342598 5828 CYASSL_MSG("Null function arg");
wolfSSL 0:9d17e4342598 5829 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 5830 }
wolfSSL 0:9d17e4342598 5831
wolfSSL 0:9d17e4342598 5832 if (ssl->buffers.weOwnCert) {
wolfSSL 0:9d17e4342598 5833 CYASSL_MSG("Unloading cert");
wolfSSL 0:9d17e4342598 5834 XFREE(ssl->buffers.certificate.buffer, ssl->heap,DYNAMIC_TYPE_CERT);
wolfSSL 0:9d17e4342598 5835 ssl->buffers.weOwnCert = 0;
wolfSSL 0:9d17e4342598 5836 ssl->buffers.certificate.length = 0;
wolfSSL 0:9d17e4342598 5837 ssl->buffers.certificate.buffer = NULL;
wolfSSL 0:9d17e4342598 5838 }
wolfSSL 0:9d17e4342598 5839
wolfSSL 0:9d17e4342598 5840 if (ssl->buffers.weOwnKey) {
wolfSSL 0:9d17e4342598 5841 CYASSL_MSG("Unloading key");
wolfSSL 0:9d17e4342598 5842 XFREE(ssl->buffers.key.buffer, ssl->heap, DYNAMIC_TYPE_KEY);
wolfSSL 0:9d17e4342598 5843 ssl->buffers.weOwnKey = 0;
wolfSSL 0:9d17e4342598 5844 ssl->buffers.key.length = 0;
wolfSSL 0:9d17e4342598 5845 ssl->buffers.key.buffer = NULL;
wolfSSL 0:9d17e4342598 5846 }
wolfSSL 0:9d17e4342598 5847
wolfSSL 0:9d17e4342598 5848 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 5849 }
wolfSSL 0:9d17e4342598 5850
wolfSSL 0:9d17e4342598 5851
wolfSSL 0:9d17e4342598 5852 int CyaSSL_CTX_UnloadCAs(CYASSL_CTX* ctx)
wolfSSL 0:9d17e4342598 5853 {
wolfSSL 0:9d17e4342598 5854 CYASSL_ENTER("CyaSSL_CTX_UnloadCAs");
wolfSSL 0:9d17e4342598 5855
wolfSSL 0:9d17e4342598 5856 if (ctx == NULL)
wolfSSL 0:9d17e4342598 5857 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 5858
wolfSSL 0:9d17e4342598 5859 return CyaSSL_CertManagerUnloadCAs(ctx->cm);
wolfSSL 0:9d17e4342598 5860 }
wolfSSL 0:9d17e4342598 5861
wolfSSL 0:9d17e4342598 5862 /* old NO_FILESYSTEM end */
wolfSSL 0:9d17e4342598 5863 #endif /* !NO_CERTS */
wolfSSL 0:9d17e4342598 5864
wolfSSL 0:9d17e4342598 5865
wolfSSL 0:9d17e4342598 5866 #if defined(OPENSSL_EXTRA) || defined(GOAHEAD_WS)
wolfSSL 0:9d17e4342598 5867
wolfSSL 0:9d17e4342598 5868
wolfSSL 0:9d17e4342598 5869 int CyaSSL_add_all_algorithms(void)
wolfSSL 0:9d17e4342598 5870 {
wolfSSL 0:9d17e4342598 5871 CYASSL_ENTER("CyaSSL_add_all_algorithms");
wolfSSL 0:9d17e4342598 5872 CyaSSL_Init();
wolfSSL 0:9d17e4342598 5873 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 5874 }
wolfSSL 0:9d17e4342598 5875
wolfSSL 0:9d17e4342598 5876
wolfSSL 0:9d17e4342598 5877 long CyaSSL_CTX_sess_set_cache_size(CYASSL_CTX* ctx, long sz)
wolfSSL 0:9d17e4342598 5878 {
wolfSSL 0:9d17e4342598 5879 /* cache size fixed at compile time in CyaSSL */
wolfSSL 0:9d17e4342598 5880 (void)ctx;
wolfSSL 0:9d17e4342598 5881 (void)sz;
wolfSSL 0:9d17e4342598 5882 return 0;
wolfSSL 0:9d17e4342598 5883 }
wolfSSL 0:9d17e4342598 5884
wolfSSL 0:9d17e4342598 5885
wolfSSL 0:9d17e4342598 5886 void CyaSSL_CTX_set_quiet_shutdown(CYASSL_CTX* ctx, int mode)
wolfSSL 0:9d17e4342598 5887 {
wolfSSL 0:9d17e4342598 5888 CYASSL_ENTER("CyaSSL_CTX_set_quiet_shutdown");
wolfSSL 0:9d17e4342598 5889 if (mode)
wolfSSL 0:9d17e4342598 5890 ctx->quietShutdown = 1;
wolfSSL 0:9d17e4342598 5891 }
wolfSSL 0:9d17e4342598 5892
wolfSSL 0:9d17e4342598 5893
wolfSSL 0:9d17e4342598 5894 void CyaSSL_set_quiet_shutdown(CYASSL* ssl, int mode)
wolfSSL 0:9d17e4342598 5895 {
wolfSSL 0:9d17e4342598 5896 CYASSL_ENTER("CyaSSL_CTX_set_quiet_shutdown");
wolfSSL 0:9d17e4342598 5897 if (mode)
wolfSSL 0:9d17e4342598 5898 ssl->options.quietShutdown = 1;
wolfSSL 0:9d17e4342598 5899 }
wolfSSL 0:9d17e4342598 5900
wolfSSL 0:9d17e4342598 5901
wolfSSL 0:9d17e4342598 5902 void CyaSSL_set_bio(CYASSL* ssl, CYASSL_BIO* rd, CYASSL_BIO* wr)
wolfSSL 0:9d17e4342598 5903 {
wolfSSL 0:9d17e4342598 5904 CYASSL_ENTER("SSL_set_bio");
wolfSSL 0:9d17e4342598 5905 CyaSSL_set_rfd(ssl, rd->fd);
wolfSSL 0:9d17e4342598 5906 CyaSSL_set_wfd(ssl, wr->fd);
wolfSSL 0:9d17e4342598 5907
wolfSSL 0:9d17e4342598 5908 ssl->biord = rd;
wolfSSL 0:9d17e4342598 5909 ssl->biowr = wr;
wolfSSL 0:9d17e4342598 5910 }
wolfSSL 0:9d17e4342598 5911
wolfSSL 0:9d17e4342598 5912
wolfSSL 0:9d17e4342598 5913 void CyaSSL_CTX_set_client_CA_list(CYASSL_CTX* ctx,
wolfSSL 0:9d17e4342598 5914 STACK_OF(CYASSL_X509_NAME)* names)
wolfSSL 0:9d17e4342598 5915 {
wolfSSL 0:9d17e4342598 5916 (void)ctx;
wolfSSL 0:9d17e4342598 5917 (void)names;
wolfSSL 0:9d17e4342598 5918 }
wolfSSL 0:9d17e4342598 5919
wolfSSL 0:9d17e4342598 5920
wolfSSL 0:9d17e4342598 5921 STACK_OF(CYASSL_X509_NAME)* CyaSSL_load_client_CA_file(const char* fname)
wolfSSL 0:9d17e4342598 5922 {
wolfSSL 0:9d17e4342598 5923 (void)fname;
wolfSSL 0:9d17e4342598 5924 return 0;
wolfSSL 0:9d17e4342598 5925 }
wolfSSL 0:9d17e4342598 5926
wolfSSL 0:9d17e4342598 5927
wolfSSL 0:9d17e4342598 5928 int CyaSSL_CTX_set_default_verify_paths(CYASSL_CTX* ctx)
wolfSSL 0:9d17e4342598 5929 {
wolfSSL 0:9d17e4342598 5930 /* TODO:, not needed in goahead */
wolfSSL 0:9d17e4342598 5931 (void)ctx;
wolfSSL 0:9d17e4342598 5932 return SSL_NOT_IMPLEMENTED;
wolfSSL 0:9d17e4342598 5933 }
wolfSSL 0:9d17e4342598 5934
wolfSSL 0:9d17e4342598 5935
wolfSSL 0:9d17e4342598 5936 /* keyblock size in bytes or -1 */
wolfSSL 0:9d17e4342598 5937 int CyaSSL_get_keyblock_size(CYASSL* ssl)
wolfSSL 0:9d17e4342598 5938 {
wolfSSL 0:9d17e4342598 5939 if (ssl == NULL)
wolfSSL 0:9d17e4342598 5940 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 5941
wolfSSL 0:9d17e4342598 5942 return 2 * (ssl->specs.key_size + ssl->specs.iv_size +
wolfSSL 0:9d17e4342598 5943 ssl->specs.hash_size);
wolfSSL 0:9d17e4342598 5944 }
wolfSSL 0:9d17e4342598 5945
wolfSSL 0:9d17e4342598 5946
wolfSSL 0:9d17e4342598 5947 /* store keys returns SSL_SUCCESS or -1 on error */
wolfSSL 0:9d17e4342598 5948 int CyaSSL_get_keys(CYASSL* ssl, unsigned char** ms, unsigned int* msLen,
wolfSSL 0:9d17e4342598 5949 unsigned char** sr, unsigned int* srLen,
wolfSSL 0:9d17e4342598 5950 unsigned char** cr, unsigned int* crLen)
wolfSSL 0:9d17e4342598 5951 {
wolfSSL 0:9d17e4342598 5952 if (ssl == NULL || ssl->arrays == NULL)
wolfSSL 0:9d17e4342598 5953 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 5954
wolfSSL 0:9d17e4342598 5955 *ms = ssl->arrays->masterSecret;
wolfSSL 0:9d17e4342598 5956 *sr = ssl->arrays->serverRandom;
wolfSSL 0:9d17e4342598 5957 *cr = ssl->arrays->clientRandom;
wolfSSL 0:9d17e4342598 5958
wolfSSL 0:9d17e4342598 5959 *msLen = SECRET_LEN;
wolfSSL 0:9d17e4342598 5960 *srLen = RAN_LEN;
wolfSSL 0:9d17e4342598 5961 *crLen = RAN_LEN;
wolfSSL 0:9d17e4342598 5962
wolfSSL 0:9d17e4342598 5963 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 5964 }
wolfSSL 0:9d17e4342598 5965
wolfSSL 0:9d17e4342598 5966
wolfSSL 0:9d17e4342598 5967 void CyaSSL_set_accept_state(CYASSL* ssl)
wolfSSL 0:9d17e4342598 5968 {
wolfSSL 0:9d17e4342598 5969 byte haveRSA = 1;
wolfSSL 0:9d17e4342598 5970 byte havePSK = 0;
wolfSSL 0:9d17e4342598 5971
wolfSSL 0:9d17e4342598 5972 CYASSL_ENTER("SSL_set_accept_state");
wolfSSL 0:9d17e4342598 5973 ssl->options.side = CYASSL_SERVER_END;
wolfSSL 0:9d17e4342598 5974 /* reset suites in case user switched */
wolfSSL 0:9d17e4342598 5975
wolfSSL 0:9d17e4342598 5976 #ifdef NO_RSA
wolfSSL 0:9d17e4342598 5977 haveRSA = 0;
wolfSSL 0:9d17e4342598 5978 #endif
wolfSSL 0:9d17e4342598 5979 #ifndef NO_PSK
wolfSSL 0:9d17e4342598 5980 havePSK = ssl->options.havePSK;
wolfSSL 0:9d17e4342598 5981 #endif
wolfSSL 0:9d17e4342598 5982 InitSuites(ssl->suites, ssl->version, haveRSA, havePSK,
wolfSSL 0:9d17e4342598 5983 ssl->options.haveDH, ssl->options.haveNTRU,
wolfSSL 0:9d17e4342598 5984 ssl->options.haveECDSAsig, ssl->options.haveStaticECC,
wolfSSL 0:9d17e4342598 5985 ssl->options.side);
wolfSSL 0:9d17e4342598 5986 }
wolfSSL 0:9d17e4342598 5987 #endif
wolfSSL 0:9d17e4342598 5988
wolfSSL 0:9d17e4342598 5989 /* return true if connection established */
wolfSSL 0:9d17e4342598 5990 int CyaSSL_is_init_finished(CYASSL* ssl)
wolfSSL 0:9d17e4342598 5991 {
wolfSSL 0:9d17e4342598 5992 if (ssl == NULL)
wolfSSL 0:9d17e4342598 5993 return 0;
wolfSSL 0:9d17e4342598 5994
wolfSSL 0:9d17e4342598 5995 if (ssl->options.handShakeState == HANDSHAKE_DONE)
wolfSSL 0:9d17e4342598 5996 return 1;
wolfSSL 0:9d17e4342598 5997
wolfSSL 0:9d17e4342598 5998 return 0;
wolfSSL 0:9d17e4342598 5999 }
wolfSSL 0:9d17e4342598 6000
wolfSSL 0:9d17e4342598 6001 #if defined(OPENSSL_EXTRA) || defined(GOAHEAD_WS)
wolfSSL 0:9d17e4342598 6002 void CyaSSL_CTX_set_tmp_rsa_callback(CYASSL_CTX* ctx,
wolfSSL 0:9d17e4342598 6003 CYASSL_RSA*(*f)(CYASSL*, int, int))
wolfSSL 0:9d17e4342598 6004 {
wolfSSL 0:9d17e4342598 6005 /* CyaSSL verifies all these internally */
wolfSSL 0:9d17e4342598 6006 (void)ctx;
wolfSSL 0:9d17e4342598 6007 (void)f;
wolfSSL 0:9d17e4342598 6008 }
wolfSSL 0:9d17e4342598 6009
wolfSSL 0:9d17e4342598 6010
wolfSSL 0:9d17e4342598 6011 void CyaSSL_set_shutdown(CYASSL* ssl, int opt)
wolfSSL 0:9d17e4342598 6012 {
wolfSSL 0:9d17e4342598 6013 (void)ssl;
wolfSSL 0:9d17e4342598 6014 (void)opt;
wolfSSL 0:9d17e4342598 6015 }
wolfSSL 0:9d17e4342598 6016
wolfSSL 0:9d17e4342598 6017
wolfSSL 0:9d17e4342598 6018 long CyaSSL_CTX_set_options(CYASSL_CTX* ctx, long opt)
wolfSSL 0:9d17e4342598 6019 {
wolfSSL 0:9d17e4342598 6020 /* goahead calls with 0, do nothing */
wolfSSL 0:9d17e4342598 6021 CYASSL_ENTER("SSL_CTX_set_options");
wolfSSL 0:9d17e4342598 6022 (void)ctx;
wolfSSL 0:9d17e4342598 6023 return opt;
wolfSSL 0:9d17e4342598 6024 }
wolfSSL 0:9d17e4342598 6025
wolfSSL 0:9d17e4342598 6026
wolfSSL 0:9d17e4342598 6027 int CyaSSL_set_rfd(CYASSL* ssl, int rfd)
wolfSSL 0:9d17e4342598 6028 {
wolfSSL 0:9d17e4342598 6029 CYASSL_ENTER("SSL_set_rfd");
wolfSSL 0:9d17e4342598 6030 ssl->rfd = rfd; /* not used directly to allow IO callbacks */
wolfSSL 0:9d17e4342598 6031
wolfSSL 0:9d17e4342598 6032 ssl->IOCB_ReadCtx = &ssl->rfd;
wolfSSL 0:9d17e4342598 6033
wolfSSL 0:9d17e4342598 6034 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 6035 }
wolfSSL 0:9d17e4342598 6036
wolfSSL 0:9d17e4342598 6037
wolfSSL 0:9d17e4342598 6038 int CyaSSL_set_wfd(CYASSL* ssl, int wfd)
wolfSSL 0:9d17e4342598 6039 {
wolfSSL 0:9d17e4342598 6040 CYASSL_ENTER("SSL_set_wfd");
wolfSSL 0:9d17e4342598 6041 ssl->wfd = wfd; /* not used directly to allow IO callbacks */
wolfSSL 0:9d17e4342598 6042
wolfSSL 0:9d17e4342598 6043 ssl->IOCB_WriteCtx = &ssl->wfd;
wolfSSL 0:9d17e4342598 6044
wolfSSL 0:9d17e4342598 6045 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 6046 }
wolfSSL 0:9d17e4342598 6047
wolfSSL 0:9d17e4342598 6048
wolfSSL 0:9d17e4342598 6049 CYASSL_RSA* CyaSSL_RSA_generate_key(int len, unsigned long bits,
wolfSSL 0:9d17e4342598 6050 void(*f)(int, int, void*), void* data)
wolfSSL 0:9d17e4342598 6051 {
wolfSSL 0:9d17e4342598 6052 /* no tmp key needed, actual generation not supported */
wolfSSL 0:9d17e4342598 6053 CYASSL_ENTER("RSA_generate_key");
wolfSSL 0:9d17e4342598 6054 (void)len;
wolfSSL 0:9d17e4342598 6055 (void)bits;
wolfSSL 0:9d17e4342598 6056 (void)f;
wolfSSL 0:9d17e4342598 6057 (void)data;
wolfSSL 0:9d17e4342598 6058 return NULL;
wolfSSL 0:9d17e4342598 6059 }
wolfSSL 0:9d17e4342598 6060
wolfSSL 0:9d17e4342598 6061
wolfSSL 0:9d17e4342598 6062
wolfSSL 0:9d17e4342598 6063 CYASSL_X509* CyaSSL_X509_STORE_CTX_get_current_cert(
wolfSSL 0:9d17e4342598 6064 CYASSL_X509_STORE_CTX* ctx)
wolfSSL 0:9d17e4342598 6065 {
wolfSSL 0:9d17e4342598 6066 (void)ctx;
wolfSSL 0:9d17e4342598 6067 return 0;
wolfSSL 0:9d17e4342598 6068 }
wolfSSL 0:9d17e4342598 6069
wolfSSL 0:9d17e4342598 6070
wolfSSL 0:9d17e4342598 6071 int CyaSSL_X509_STORE_CTX_get_error(CYASSL_X509_STORE_CTX* ctx)
wolfSSL 0:9d17e4342598 6072 {
wolfSSL 0:9d17e4342598 6073 if (ctx != NULL)
wolfSSL 0:9d17e4342598 6074 return ctx->error;
wolfSSL 0:9d17e4342598 6075 return 0;
wolfSSL 0:9d17e4342598 6076 }
wolfSSL 0:9d17e4342598 6077
wolfSSL 0:9d17e4342598 6078
wolfSSL 0:9d17e4342598 6079 int CyaSSL_X509_STORE_CTX_get_error_depth(CYASSL_X509_STORE_CTX* ctx)
wolfSSL 0:9d17e4342598 6080 {
wolfSSL 0:9d17e4342598 6081 (void)ctx;
wolfSSL 0:9d17e4342598 6082 return 0;
wolfSSL 0:9d17e4342598 6083 }
wolfSSL 0:9d17e4342598 6084
wolfSSL 0:9d17e4342598 6085
wolfSSL 0:9d17e4342598 6086 CYASSL_BIO_METHOD* CyaSSL_BIO_f_buffer(void)
wolfSSL 0:9d17e4342598 6087 {
wolfSSL 0:9d17e4342598 6088 static CYASSL_BIO_METHOD meth;
wolfSSL 0:9d17e4342598 6089
wolfSSL 0:9d17e4342598 6090 CYASSL_ENTER("BIO_f_buffer");
wolfSSL 0:9d17e4342598 6091 meth.type = BIO_BUFFER;
wolfSSL 0:9d17e4342598 6092
wolfSSL 0:9d17e4342598 6093 return &meth;
wolfSSL 0:9d17e4342598 6094 }
wolfSSL 0:9d17e4342598 6095
wolfSSL 0:9d17e4342598 6096
wolfSSL 0:9d17e4342598 6097 long CyaSSL_BIO_set_write_buffer_size(CYASSL_BIO* bio, long size)
wolfSSL 0:9d17e4342598 6098 {
wolfSSL 0:9d17e4342598 6099 /* CyaSSL has internal buffer, compatibility only */
wolfSSL 0:9d17e4342598 6100 CYASSL_ENTER("BIO_set_write_buffer_size");
wolfSSL 0:9d17e4342598 6101 (void)bio;
wolfSSL 0:9d17e4342598 6102 return size;
wolfSSL 0:9d17e4342598 6103 }
wolfSSL 0:9d17e4342598 6104
wolfSSL 0:9d17e4342598 6105
wolfSSL 0:9d17e4342598 6106 CYASSL_BIO_METHOD* CyaSSL_BIO_f_ssl(void)
wolfSSL 0:9d17e4342598 6107 {
wolfSSL 0:9d17e4342598 6108 static CYASSL_BIO_METHOD meth;
wolfSSL 0:9d17e4342598 6109
wolfSSL 0:9d17e4342598 6110 CYASSL_ENTER("BIO_f_ssl");
wolfSSL 0:9d17e4342598 6111 meth.type = BIO_SSL;
wolfSSL 0:9d17e4342598 6112
wolfSSL 0:9d17e4342598 6113 return &meth;
wolfSSL 0:9d17e4342598 6114 }
wolfSSL 0:9d17e4342598 6115
wolfSSL 0:9d17e4342598 6116
wolfSSL 0:9d17e4342598 6117 CYASSL_BIO* CyaSSL_BIO_new_socket(int sfd, int closeF)
wolfSSL 0:9d17e4342598 6118 {
wolfSSL 0:9d17e4342598 6119 CYASSL_BIO* bio = (CYASSL_BIO*) XMALLOC(sizeof(CYASSL_BIO), 0,
wolfSSL 0:9d17e4342598 6120 DYNAMIC_TYPE_OPENSSL);
wolfSSL 0:9d17e4342598 6121
wolfSSL 0:9d17e4342598 6122 CYASSL_ENTER("BIO_new_socket");
wolfSSL 0:9d17e4342598 6123 if (bio) {
wolfSSL 0:9d17e4342598 6124 bio->type = BIO_SOCKET;
wolfSSL 0:9d17e4342598 6125 bio->close = (byte)closeF;
wolfSSL 0:9d17e4342598 6126 bio->eof = 0;
wolfSSL 0:9d17e4342598 6127 bio->ssl = 0;
wolfSSL 0:9d17e4342598 6128 bio->fd = sfd;
wolfSSL 0:9d17e4342598 6129 bio->prev = 0;
wolfSSL 0:9d17e4342598 6130 bio->next = 0;
wolfSSL 0:9d17e4342598 6131 bio->mem = NULL;
wolfSSL 0:9d17e4342598 6132 bio->memLen = 0;
wolfSSL 0:9d17e4342598 6133 }
wolfSSL 0:9d17e4342598 6134 return bio;
wolfSSL 0:9d17e4342598 6135 }
wolfSSL 0:9d17e4342598 6136
wolfSSL 0:9d17e4342598 6137
wolfSSL 0:9d17e4342598 6138 int CyaSSL_BIO_eof(CYASSL_BIO* b)
wolfSSL 0:9d17e4342598 6139 {
wolfSSL 0:9d17e4342598 6140 CYASSL_ENTER("BIO_eof");
wolfSSL 0:9d17e4342598 6141 if (b->eof)
wolfSSL 0:9d17e4342598 6142 return 1;
wolfSSL 0:9d17e4342598 6143
wolfSSL 0:9d17e4342598 6144 return 0;
wolfSSL 0:9d17e4342598 6145 }
wolfSSL 0:9d17e4342598 6146
wolfSSL 0:9d17e4342598 6147
wolfSSL 0:9d17e4342598 6148 long CyaSSL_BIO_set_ssl(CYASSL_BIO* b, CYASSL* ssl, int closeF)
wolfSSL 0:9d17e4342598 6149 {
wolfSSL 0:9d17e4342598 6150 CYASSL_ENTER("BIO_set_ssl");
wolfSSL 0:9d17e4342598 6151 b->ssl = ssl;
wolfSSL 0:9d17e4342598 6152 b->close = (byte)closeF;
wolfSSL 0:9d17e4342598 6153 /* add to ssl for bio free if SSL_free called before/instead of free_all? */
wolfSSL 0:9d17e4342598 6154
wolfSSL 0:9d17e4342598 6155 return 0;
wolfSSL 0:9d17e4342598 6156 }
wolfSSL 0:9d17e4342598 6157
wolfSSL 0:9d17e4342598 6158
wolfSSL 0:9d17e4342598 6159 CYASSL_BIO* CyaSSL_BIO_new(CYASSL_BIO_METHOD* method)
wolfSSL 0:9d17e4342598 6160 {
wolfSSL 0:9d17e4342598 6161 CYASSL_BIO* bio = (CYASSL_BIO*) XMALLOC(sizeof(CYASSL_BIO), 0,
wolfSSL 0:9d17e4342598 6162 DYNAMIC_TYPE_OPENSSL);
wolfSSL 0:9d17e4342598 6163 CYASSL_ENTER("BIO_new");
wolfSSL 0:9d17e4342598 6164 if (bio) {
wolfSSL 0:9d17e4342598 6165 bio->type = method->type;
wolfSSL 0:9d17e4342598 6166 bio->close = 0;
wolfSSL 0:9d17e4342598 6167 bio->eof = 0;
wolfSSL 0:9d17e4342598 6168 bio->ssl = NULL;
wolfSSL 0:9d17e4342598 6169 bio->mem = NULL;
wolfSSL 0:9d17e4342598 6170 bio->memLen = 0;
wolfSSL 0:9d17e4342598 6171 bio->fd = 0;
wolfSSL 0:9d17e4342598 6172 bio->prev = NULL;
wolfSSL 0:9d17e4342598 6173 bio->next = NULL;
wolfSSL 0:9d17e4342598 6174 }
wolfSSL 0:9d17e4342598 6175 return bio;
wolfSSL 0:9d17e4342598 6176 }
wolfSSL 0:9d17e4342598 6177
wolfSSL 0:9d17e4342598 6178
wolfSSL 0:9d17e4342598 6179 int CyaSSL_BIO_get_mem_data(CYASSL_BIO* bio, const byte** p)
wolfSSL 0:9d17e4342598 6180 {
wolfSSL 0:9d17e4342598 6181 if (bio == NULL || p == NULL)
wolfSSL 0:9d17e4342598 6182 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 6183
wolfSSL 0:9d17e4342598 6184 *p = bio->mem;
wolfSSL 0:9d17e4342598 6185
wolfSSL 0:9d17e4342598 6186 return bio->memLen;
wolfSSL 0:9d17e4342598 6187 }
wolfSSL 0:9d17e4342598 6188
wolfSSL 0:9d17e4342598 6189
wolfSSL 0:9d17e4342598 6190 CYASSL_BIO* CyaSSL_BIO_new_mem_buf(void* buf, int len)
wolfSSL 0:9d17e4342598 6191 {
wolfSSL 0:9d17e4342598 6192 CYASSL_BIO* bio = NULL;
wolfSSL 0:9d17e4342598 6193 if (buf == NULL)
wolfSSL 0:9d17e4342598 6194 return bio;
wolfSSL 0:9d17e4342598 6195
wolfSSL 0:9d17e4342598 6196 bio = CyaSSL_BIO_new(CyaSSL_BIO_s_mem());
wolfSSL 0:9d17e4342598 6197 if (bio == NULL)
wolfSSL 0:9d17e4342598 6198 return bio;
wolfSSL 0:9d17e4342598 6199
wolfSSL 0:9d17e4342598 6200 bio->memLen = len;
wolfSSL 0:9d17e4342598 6201 bio->mem = (byte*)XMALLOC(len, 0, DYNAMIC_TYPE_OPENSSL);
wolfSSL 0:9d17e4342598 6202 if (bio->mem == NULL) {
wolfSSL 0:9d17e4342598 6203 XFREE(bio, 0, DYNAMIC_TYPE_OPENSSL);
wolfSSL 0:9d17e4342598 6204 return NULL;
wolfSSL 0:9d17e4342598 6205 }
wolfSSL 0:9d17e4342598 6206
wolfSSL 0:9d17e4342598 6207 XMEMCPY(bio->mem, buf, len);
wolfSSL 0:9d17e4342598 6208
wolfSSL 0:9d17e4342598 6209 return bio;
wolfSSL 0:9d17e4342598 6210 }
wolfSSL 0:9d17e4342598 6211
wolfSSL 0:9d17e4342598 6212
wolfSSL 0:9d17e4342598 6213 #ifdef USE_WINDOWS_API
wolfSSL 0:9d17e4342598 6214 #define CloseSocket(s) closesocket(s)
wolfSSL 0:9d17e4342598 6215 #elif defined(CYASSL_MDK_ARM)
wolfSSL 0:9d17e4342598 6216 #define CloseSocket(s) closesocket(s)
wolfSSL 0:9d17e4342598 6217 extern int closesocket(int) ;
wolfSSL 0:9d17e4342598 6218 #else
wolfSSL 0:9d17e4342598 6219 #define CloseSocket(s) close(s)
wolfSSL 0:9d17e4342598 6220 #endif
wolfSSL 0:9d17e4342598 6221
wolfSSL 0:9d17e4342598 6222 int CyaSSL_BIO_free(CYASSL_BIO* bio)
wolfSSL 0:9d17e4342598 6223 {
wolfSSL 0:9d17e4342598 6224 /* unchain?, doesn't matter in goahead since from free all */
wolfSSL 0:9d17e4342598 6225 CYASSL_ENTER("BIO_free");
wolfSSL 0:9d17e4342598 6226 if (bio) {
wolfSSL 0:9d17e4342598 6227 if (bio->close) {
wolfSSL 0:9d17e4342598 6228 if (bio->ssl)
wolfSSL 0:9d17e4342598 6229 CyaSSL_free(bio->ssl);
wolfSSL 0:9d17e4342598 6230 if (bio->fd)
wolfSSL 0:9d17e4342598 6231 CloseSocket(bio->fd);
wolfSSL 0:9d17e4342598 6232 }
wolfSSL 0:9d17e4342598 6233 if (bio->mem)
wolfSSL 0:9d17e4342598 6234 XFREE(bio->mem, 0, DYNAMIC_TYPE_OPENSSL);
wolfSSL 0:9d17e4342598 6235 XFREE(bio, 0, DYNAMIC_TYPE_OPENSSL);
wolfSSL 0:9d17e4342598 6236 }
wolfSSL 0:9d17e4342598 6237 return 0;
wolfSSL 0:9d17e4342598 6238 }
wolfSSL 0:9d17e4342598 6239
wolfSSL 0:9d17e4342598 6240
wolfSSL 0:9d17e4342598 6241 int CyaSSL_BIO_free_all(CYASSL_BIO* bio)
wolfSSL 0:9d17e4342598 6242 {
wolfSSL 0:9d17e4342598 6243 CYASSL_ENTER("BIO_free_all");
wolfSSL 0:9d17e4342598 6244 while (bio) {
wolfSSL 0:9d17e4342598 6245 CYASSL_BIO* next = bio->next;
wolfSSL 0:9d17e4342598 6246 CyaSSL_BIO_free(bio);
wolfSSL 0:9d17e4342598 6247 bio = next;
wolfSSL 0:9d17e4342598 6248 }
wolfSSL 0:9d17e4342598 6249 return 0;
wolfSSL 0:9d17e4342598 6250 }
wolfSSL 0:9d17e4342598 6251
wolfSSL 0:9d17e4342598 6252
wolfSSL 0:9d17e4342598 6253 int CyaSSL_BIO_read(CYASSL_BIO* bio, void* buf, int len)
wolfSSL 0:9d17e4342598 6254 {
wolfSSL 0:9d17e4342598 6255 int ret;
wolfSSL 0:9d17e4342598 6256 CYASSL* ssl = 0;
wolfSSL 0:9d17e4342598 6257 CYASSL_BIO* front = bio;
wolfSSL 0:9d17e4342598 6258
wolfSSL 0:9d17e4342598 6259 CYASSL_ENTER("BIO_read");
wolfSSL 0:9d17e4342598 6260 /* already got eof, again is error */
wolfSSL 0:9d17e4342598 6261 if (front->eof)
wolfSSL 0:9d17e4342598 6262 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 6263
wolfSSL 0:9d17e4342598 6264 while(bio && ((ssl = bio->ssl) == 0) )
wolfSSL 0:9d17e4342598 6265 bio = bio->next;
wolfSSL 0:9d17e4342598 6266
wolfSSL 0:9d17e4342598 6267 if (ssl == 0) return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 6268
wolfSSL 0:9d17e4342598 6269 ret = CyaSSL_read(ssl, buf, len);
wolfSSL 0:9d17e4342598 6270 if (ret == 0)
wolfSSL 0:9d17e4342598 6271 front->eof = 1;
wolfSSL 0:9d17e4342598 6272 else if (ret < 0) {
wolfSSL 0:9d17e4342598 6273 int err = CyaSSL_get_error(ssl, 0);
wolfSSL 0:9d17e4342598 6274 if ( !(err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE) )
wolfSSL 0:9d17e4342598 6275 front->eof = 1;
wolfSSL 0:9d17e4342598 6276 }
wolfSSL 0:9d17e4342598 6277 return ret;
wolfSSL 0:9d17e4342598 6278 }
wolfSSL 0:9d17e4342598 6279
wolfSSL 0:9d17e4342598 6280
wolfSSL 0:9d17e4342598 6281 int CyaSSL_BIO_write(CYASSL_BIO* bio, const void* data, int len)
wolfSSL 0:9d17e4342598 6282 {
wolfSSL 0:9d17e4342598 6283 int ret;
wolfSSL 0:9d17e4342598 6284 CYASSL* ssl = 0;
wolfSSL 0:9d17e4342598 6285 CYASSL_BIO* front = bio;
wolfSSL 0:9d17e4342598 6286
wolfSSL 0:9d17e4342598 6287 CYASSL_ENTER("BIO_write");
wolfSSL 0:9d17e4342598 6288 /* already got eof, again is error */
wolfSSL 0:9d17e4342598 6289 if (front->eof)
wolfSSL 0:9d17e4342598 6290 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 6291
wolfSSL 0:9d17e4342598 6292 while(bio && ((ssl = bio->ssl) == 0) )
wolfSSL 0:9d17e4342598 6293 bio = bio->next;
wolfSSL 0:9d17e4342598 6294
wolfSSL 0:9d17e4342598 6295 if (ssl == 0) return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 6296
wolfSSL 0:9d17e4342598 6297 ret = CyaSSL_write(ssl, data, len);
wolfSSL 0:9d17e4342598 6298 if (ret == 0)
wolfSSL 0:9d17e4342598 6299 front->eof = 1;
wolfSSL 0:9d17e4342598 6300 else if (ret < 0) {
wolfSSL 0:9d17e4342598 6301 int err = CyaSSL_get_error(ssl, 0);
wolfSSL 0:9d17e4342598 6302 if ( !(err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE) )
wolfSSL 0:9d17e4342598 6303 front->eof = 1;
wolfSSL 0:9d17e4342598 6304 }
wolfSSL 0:9d17e4342598 6305
wolfSSL 0:9d17e4342598 6306 return ret;
wolfSSL 0:9d17e4342598 6307 }
wolfSSL 0:9d17e4342598 6308
wolfSSL 0:9d17e4342598 6309
wolfSSL 0:9d17e4342598 6310 CYASSL_BIO* CyaSSL_BIO_push(CYASSL_BIO* top, CYASSL_BIO* append)
wolfSSL 0:9d17e4342598 6311 {
wolfSSL 0:9d17e4342598 6312 CYASSL_ENTER("BIO_push");
wolfSSL 0:9d17e4342598 6313 top->next = append;
wolfSSL 0:9d17e4342598 6314 append->prev = top;
wolfSSL 0:9d17e4342598 6315
wolfSSL 0:9d17e4342598 6316 return top;
wolfSSL 0:9d17e4342598 6317 }
wolfSSL 0:9d17e4342598 6318
wolfSSL 0:9d17e4342598 6319
wolfSSL 0:9d17e4342598 6320 int CyaSSL_BIO_flush(CYASSL_BIO* bio)
wolfSSL 0:9d17e4342598 6321 {
wolfSSL 0:9d17e4342598 6322 /* for CyaSSL no flushing needed */
wolfSSL 0:9d17e4342598 6323 CYASSL_ENTER("BIO_flush");
wolfSSL 0:9d17e4342598 6324 (void)bio;
wolfSSL 0:9d17e4342598 6325 return 1;
wolfSSL 0:9d17e4342598 6326 }
wolfSSL 0:9d17e4342598 6327
wolfSSL 0:9d17e4342598 6328
wolfSSL 0:9d17e4342598 6329 #endif /* OPENSSL_EXTRA || GOAHEAD_WS */
wolfSSL 0:9d17e4342598 6330
wolfSSL 0:9d17e4342598 6331
wolfSSL 0:9d17e4342598 6332 #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
wolfSSL 0:9d17e4342598 6333
wolfSSL 0:9d17e4342598 6334 void CyaSSL_CTX_set_default_passwd_cb_userdata(CYASSL_CTX* ctx,
wolfSSL 0:9d17e4342598 6335 void* userdata)
wolfSSL 0:9d17e4342598 6336 {
wolfSSL 0:9d17e4342598 6337 CYASSL_ENTER("SSL_CTX_set_default_passwd_cb_userdata");
wolfSSL 0:9d17e4342598 6338 ctx->userdata = userdata;
wolfSSL 0:9d17e4342598 6339 }
wolfSSL 0:9d17e4342598 6340
wolfSSL 0:9d17e4342598 6341
wolfSSL 0:9d17e4342598 6342 void CyaSSL_CTX_set_default_passwd_cb(CYASSL_CTX* ctx, pem_password_cb cb)
wolfSSL 0:9d17e4342598 6343 {
wolfSSL 0:9d17e4342598 6344 CYASSL_ENTER("SSL_CTX_set_default_passwd_cb");
wolfSSL 0:9d17e4342598 6345 ctx->passwd_cb = cb;
wolfSSL 0:9d17e4342598 6346 }
wolfSSL 0:9d17e4342598 6347
wolfSSL 0:9d17e4342598 6348 int CyaSSL_num_locks(void)
wolfSSL 0:9d17e4342598 6349 {
wolfSSL 0:9d17e4342598 6350 return 0;
wolfSSL 0:9d17e4342598 6351 }
wolfSSL 0:9d17e4342598 6352
wolfSSL 0:9d17e4342598 6353 void CyaSSL_set_locking_callback(void (*f)(int, int, const char*, int))
wolfSSL 0:9d17e4342598 6354 {
wolfSSL 0:9d17e4342598 6355 (void)f;
wolfSSL 0:9d17e4342598 6356 }
wolfSSL 0:9d17e4342598 6357
wolfSSL 0:9d17e4342598 6358 void CyaSSL_set_id_callback(unsigned long (*f)(void))
wolfSSL 0:9d17e4342598 6359 {
wolfSSL 0:9d17e4342598 6360 (void)f;
wolfSSL 0:9d17e4342598 6361 }
wolfSSL 0:9d17e4342598 6362
wolfSSL 0:9d17e4342598 6363 unsigned long CyaSSL_ERR_get_error(void)
wolfSSL 0:9d17e4342598 6364 {
wolfSSL 0:9d17e4342598 6365 /* TODO: */
wolfSSL 0:9d17e4342598 6366 return 0;
wolfSSL 0:9d17e4342598 6367 }
wolfSSL 0:9d17e4342598 6368
wolfSSL 0:9d17e4342598 6369 int CyaSSL_EVP_BytesToKey(const CYASSL_EVP_CIPHER* type,
wolfSSL 0:9d17e4342598 6370 const CYASSL_EVP_MD* md, const byte* salt,
wolfSSL 0:9d17e4342598 6371 const byte* data, int sz, int count, byte* key, byte* iv)
wolfSSL 0:9d17e4342598 6372 {
wolfSSL 0:9d17e4342598 6373 int keyLen = 0;
wolfSSL 0:9d17e4342598 6374 int ivLen = 0;
wolfSSL 0:9d17e4342598 6375
wolfSSL 0:9d17e4342598 6376 Md5 myMD;
wolfSSL 0:9d17e4342598 6377 byte digest[MD5_DIGEST_SIZE];
wolfSSL 0:9d17e4342598 6378
wolfSSL 0:9d17e4342598 6379 int j;
wolfSSL 0:9d17e4342598 6380 int keyLeft;
wolfSSL 0:9d17e4342598 6381 int ivLeft;
wolfSSL 0:9d17e4342598 6382 int keyOutput = 0;
wolfSSL 0:9d17e4342598 6383
wolfSSL 0:9d17e4342598 6384 CYASSL_ENTER("EVP_BytesToKey");
wolfSSL 0:9d17e4342598 6385 InitMd5(&myMD);
wolfSSL 0:9d17e4342598 6386
wolfSSL 0:9d17e4342598 6387 /* only support MD5 for now */
wolfSSL 0:9d17e4342598 6388 if (XSTRNCMP(md, "MD5", 3) != 0) return 0;
wolfSSL 0:9d17e4342598 6389
wolfSSL 0:9d17e4342598 6390 /* only support CBC DES and AES for now */
wolfSSL 0:9d17e4342598 6391 if (XSTRNCMP(type, "DES-CBC", 7) == 0) {
wolfSSL 0:9d17e4342598 6392 keyLen = DES_KEY_SIZE;
wolfSSL 0:9d17e4342598 6393 ivLen = DES_IV_SIZE;
wolfSSL 0:9d17e4342598 6394 }
wolfSSL 0:9d17e4342598 6395 else if (XSTRNCMP(type, "DES-EDE3-CBC", 12) == 0) {
wolfSSL 0:9d17e4342598 6396 keyLen = DES3_KEY_SIZE;
wolfSSL 0:9d17e4342598 6397 ivLen = DES_IV_SIZE;
wolfSSL 0:9d17e4342598 6398 }
wolfSSL 0:9d17e4342598 6399 else if (XSTRNCMP(type, "AES-128-CBC", 11) == 0) {
wolfSSL 0:9d17e4342598 6400 keyLen = AES_128_KEY_SIZE;
wolfSSL 0:9d17e4342598 6401 ivLen = AES_IV_SIZE;
wolfSSL 0:9d17e4342598 6402 }
wolfSSL 0:9d17e4342598 6403 else if (XSTRNCMP(type, "AES-192-CBC", 11) == 0) {
wolfSSL 0:9d17e4342598 6404 keyLen = AES_192_KEY_SIZE;
wolfSSL 0:9d17e4342598 6405 ivLen = AES_IV_SIZE;
wolfSSL 0:9d17e4342598 6406 }
wolfSSL 0:9d17e4342598 6407 else if (XSTRNCMP(type, "AES-256-CBC", 11) == 0) {
wolfSSL 0:9d17e4342598 6408 keyLen = AES_256_KEY_SIZE;
wolfSSL 0:9d17e4342598 6409 ivLen = AES_IV_SIZE;
wolfSSL 0:9d17e4342598 6410 }
wolfSSL 0:9d17e4342598 6411 else
wolfSSL 0:9d17e4342598 6412 return 0;
wolfSSL 0:9d17e4342598 6413
wolfSSL 0:9d17e4342598 6414 keyLeft = keyLen;
wolfSSL 0:9d17e4342598 6415 ivLeft = ivLen;
wolfSSL 0:9d17e4342598 6416
wolfSSL 0:9d17e4342598 6417 while (keyOutput < (keyLen + ivLen)) {
wolfSSL 0:9d17e4342598 6418 int digestLeft = MD5_DIGEST_SIZE;
wolfSSL 0:9d17e4342598 6419 /* D_(i - 1) */
wolfSSL 0:9d17e4342598 6420 if (keyOutput) /* first time D_0 is empty */
wolfSSL 0:9d17e4342598 6421 Md5Update(&myMD, digest, MD5_DIGEST_SIZE);
wolfSSL 0:9d17e4342598 6422 /* data */
wolfSSL 0:9d17e4342598 6423 Md5Update(&myMD, data, sz);
wolfSSL 0:9d17e4342598 6424 /* salt */
wolfSSL 0:9d17e4342598 6425 if (salt)
wolfSSL 0:9d17e4342598 6426 Md5Update(&myMD, salt, EVP_SALT_SIZE);
wolfSSL 0:9d17e4342598 6427 Md5Final(&myMD, digest);
wolfSSL 0:9d17e4342598 6428 /* count */
wolfSSL 0:9d17e4342598 6429 for (j = 1; j < count; j++) {
wolfSSL 0:9d17e4342598 6430 Md5Update(&myMD, digest, MD5_DIGEST_SIZE);
wolfSSL 0:9d17e4342598 6431 Md5Final(&myMD, digest);
wolfSSL 0:9d17e4342598 6432 }
wolfSSL 0:9d17e4342598 6433
wolfSSL 0:9d17e4342598 6434 if (keyLeft) {
wolfSSL 0:9d17e4342598 6435 int store = min(keyLeft, MD5_DIGEST_SIZE);
wolfSSL 0:9d17e4342598 6436 XMEMCPY(&key[keyLen - keyLeft], digest, store);
wolfSSL 0:9d17e4342598 6437
wolfSSL 0:9d17e4342598 6438 keyOutput += store;
wolfSSL 0:9d17e4342598 6439 keyLeft -= store;
wolfSSL 0:9d17e4342598 6440 digestLeft -= store;
wolfSSL 0:9d17e4342598 6441 }
wolfSSL 0:9d17e4342598 6442
wolfSSL 0:9d17e4342598 6443 if (ivLeft && digestLeft) {
wolfSSL 0:9d17e4342598 6444 int store = min(ivLeft, digestLeft);
wolfSSL 0:9d17e4342598 6445 XMEMCPY(&iv[ivLen - ivLeft], &digest[MD5_DIGEST_SIZE -
wolfSSL 0:9d17e4342598 6446 digestLeft], store);
wolfSSL 0:9d17e4342598 6447 keyOutput += store;
wolfSSL 0:9d17e4342598 6448 ivLeft -= store;
wolfSSL 0:9d17e4342598 6449 }
wolfSSL 0:9d17e4342598 6450 }
wolfSSL 0:9d17e4342598 6451 if (keyOutput != (keyLen + ivLen))
wolfSSL 0:9d17e4342598 6452 return 0;
wolfSSL 0:9d17e4342598 6453 return keyOutput;
wolfSSL 0:9d17e4342598 6454 }
wolfSSL 0:9d17e4342598 6455
wolfSSL 0:9d17e4342598 6456 #endif /* OPENSSL_EXTRA || HAVE_WEBSERVER */
wolfSSL 0:9d17e4342598 6457
wolfSSL 0:9d17e4342598 6458
wolfSSL 0:9d17e4342598 6459 #ifdef OPENSSL_EXTRA
wolfSSL 0:9d17e4342598 6460
wolfSSL 0:9d17e4342598 6461 unsigned long CyaSSLeay(void)
wolfSSL 0:9d17e4342598 6462 {
wolfSSL 0:9d17e4342598 6463 return SSLEAY_VERSION_NUMBER;
wolfSSL 0:9d17e4342598 6464 }
wolfSSL 0:9d17e4342598 6465
wolfSSL 0:9d17e4342598 6466
wolfSSL 0:9d17e4342598 6467 const char* CyaSSLeay_version(int type)
wolfSSL 0:9d17e4342598 6468 {
wolfSSL 0:9d17e4342598 6469 static const char* version = "SSLeay CyaSSL compatibility";
wolfSSL 0:9d17e4342598 6470 (void)type;
wolfSSL 0:9d17e4342598 6471 return version;
wolfSSL 0:9d17e4342598 6472 }
wolfSSL 0:9d17e4342598 6473
wolfSSL 0:9d17e4342598 6474
wolfSSL 0:9d17e4342598 6475 void CyaSSL_MD5_Init(CYASSL_MD5_CTX* md5)
wolfSSL 0:9d17e4342598 6476 {
wolfSSL 0:9d17e4342598 6477 typedef char md5_test[sizeof(MD5_CTX) >= sizeof(Md5) ? 1 : -1];
wolfSSL 0:9d17e4342598 6478 (void)sizeof(md5_test);
wolfSSL 0:9d17e4342598 6479
wolfSSL 0:9d17e4342598 6480 CYASSL_ENTER("MD5_Init");
wolfSSL 0:9d17e4342598 6481 InitMd5((Md5*)md5);
wolfSSL 0:9d17e4342598 6482 }
wolfSSL 0:9d17e4342598 6483
wolfSSL 0:9d17e4342598 6484
wolfSSL 0:9d17e4342598 6485 void CyaSSL_MD5_Update(CYASSL_MD5_CTX* md5, const void* input,
wolfSSL 0:9d17e4342598 6486 unsigned long sz)
wolfSSL 0:9d17e4342598 6487 {
wolfSSL 0:9d17e4342598 6488 CYASSL_ENTER("CyaSSL_MD5_Update");
wolfSSL 0:9d17e4342598 6489 Md5Update((Md5*)md5, (const byte*)input, (word32)sz);
wolfSSL 0:9d17e4342598 6490 }
wolfSSL 0:9d17e4342598 6491
wolfSSL 0:9d17e4342598 6492
wolfSSL 0:9d17e4342598 6493 void CyaSSL_MD5_Final(byte* input, CYASSL_MD5_CTX* md5)
wolfSSL 0:9d17e4342598 6494 {
wolfSSL 0:9d17e4342598 6495 CYASSL_ENTER("MD5_Final");
wolfSSL 0:9d17e4342598 6496 Md5Final((Md5*)md5, input);
wolfSSL 0:9d17e4342598 6497 }
wolfSSL 0:9d17e4342598 6498
wolfSSL 0:9d17e4342598 6499
wolfSSL 0:9d17e4342598 6500 void CyaSSL_SHA_Init(CYASSL_SHA_CTX* sha)
wolfSSL 0:9d17e4342598 6501 {
wolfSSL 0:9d17e4342598 6502 typedef char sha_test[sizeof(SHA_CTX) >= sizeof(Sha) ? 1 : -1];
wolfSSL 0:9d17e4342598 6503 (void)sizeof(sha_test);
wolfSSL 0:9d17e4342598 6504
wolfSSL 0:9d17e4342598 6505 CYASSL_ENTER("SHA_Init");
wolfSSL 0:9d17e4342598 6506 InitSha((Sha*)sha); /* OpenSSL compat, no ret */
wolfSSL 0:9d17e4342598 6507 }
wolfSSL 0:9d17e4342598 6508
wolfSSL 0:9d17e4342598 6509
wolfSSL 0:9d17e4342598 6510 void CyaSSL_SHA_Update(CYASSL_SHA_CTX* sha, const void* input,
wolfSSL 0:9d17e4342598 6511 unsigned long sz)
wolfSSL 0:9d17e4342598 6512 {
wolfSSL 0:9d17e4342598 6513 CYASSL_ENTER("SHA_Update");
wolfSSL 0:9d17e4342598 6514 ShaUpdate((Sha*)sha, (const byte*)input, (word32)sz);
wolfSSL 0:9d17e4342598 6515 }
wolfSSL 0:9d17e4342598 6516
wolfSSL 0:9d17e4342598 6517
wolfSSL 0:9d17e4342598 6518 void CyaSSL_SHA_Final(byte* input, CYASSL_SHA_CTX* sha)
wolfSSL 0:9d17e4342598 6519 {
wolfSSL 0:9d17e4342598 6520 CYASSL_ENTER("SHA_Final");
wolfSSL 0:9d17e4342598 6521 ShaFinal((Sha*)sha, input);
wolfSSL 0:9d17e4342598 6522 }
wolfSSL 0:9d17e4342598 6523
wolfSSL 0:9d17e4342598 6524
wolfSSL 0:9d17e4342598 6525 void CyaSSL_SHA1_Init(CYASSL_SHA_CTX* sha)
wolfSSL 0:9d17e4342598 6526 {
wolfSSL 0:9d17e4342598 6527 CYASSL_ENTER("SHA1_Init");
wolfSSL 0:9d17e4342598 6528 SHA_Init(sha);
wolfSSL 0:9d17e4342598 6529 }
wolfSSL 0:9d17e4342598 6530
wolfSSL 0:9d17e4342598 6531
wolfSSL 0:9d17e4342598 6532 void CyaSSL_SHA1_Update(CYASSL_SHA_CTX* sha, const void* input,
wolfSSL 0:9d17e4342598 6533 unsigned long sz)
wolfSSL 0:9d17e4342598 6534 {
wolfSSL 0:9d17e4342598 6535 CYASSL_ENTER("SHA1_Update");
wolfSSL 0:9d17e4342598 6536 SHA_Update(sha, input, sz);
wolfSSL 0:9d17e4342598 6537 }
wolfSSL 0:9d17e4342598 6538
wolfSSL 0:9d17e4342598 6539
wolfSSL 0:9d17e4342598 6540 void CyaSSL_SHA1_Final(byte* input, CYASSL_SHA_CTX* sha)
wolfSSL 0:9d17e4342598 6541 {
wolfSSL 0:9d17e4342598 6542 CYASSL_ENTER("SHA1_Final");
wolfSSL 0:9d17e4342598 6543 SHA_Final(input, sha);
wolfSSL 0:9d17e4342598 6544 }
wolfSSL 0:9d17e4342598 6545
wolfSSL 0:9d17e4342598 6546
wolfSSL 0:9d17e4342598 6547 void CyaSSL_SHA256_Init(CYASSL_SHA256_CTX* sha256)
wolfSSL 0:9d17e4342598 6548 {
wolfSSL 0:9d17e4342598 6549 typedef char sha_test[sizeof(SHA256_CTX) >= sizeof(Sha256) ? 1 : -1];
wolfSSL 0:9d17e4342598 6550 (void)sizeof(sha_test);
wolfSSL 0:9d17e4342598 6551
wolfSSL 0:9d17e4342598 6552 CYASSL_ENTER("SHA256_Init");
wolfSSL 0:9d17e4342598 6553 InitSha256((Sha256*)sha256); /* OpenSSL compat, no error */
wolfSSL 0:9d17e4342598 6554 }
wolfSSL 0:9d17e4342598 6555
wolfSSL 0:9d17e4342598 6556
wolfSSL 0:9d17e4342598 6557 void CyaSSL_SHA256_Update(CYASSL_SHA256_CTX* sha, const void* input,
wolfSSL 0:9d17e4342598 6558 unsigned long sz)
wolfSSL 0:9d17e4342598 6559 {
wolfSSL 0:9d17e4342598 6560 CYASSL_ENTER("SHA256_Update");
wolfSSL 0:9d17e4342598 6561 Sha256Update((Sha256*)sha, (const byte*)input, (word32)sz);
wolfSSL 0:9d17e4342598 6562 }
wolfSSL 0:9d17e4342598 6563
wolfSSL 0:9d17e4342598 6564
wolfSSL 0:9d17e4342598 6565 void CyaSSL_SHA256_Final(byte* input, CYASSL_SHA256_CTX* sha)
wolfSSL 0:9d17e4342598 6566 {
wolfSSL 0:9d17e4342598 6567 CYASSL_ENTER("SHA256_Final");
wolfSSL 0:9d17e4342598 6568 Sha256Final((Sha256*)sha, input);
wolfSSL 0:9d17e4342598 6569 }
wolfSSL 0:9d17e4342598 6570
wolfSSL 0:9d17e4342598 6571
wolfSSL 0:9d17e4342598 6572 #ifdef CYASSL_SHA384
wolfSSL 0:9d17e4342598 6573
wolfSSL 0:9d17e4342598 6574 void CyaSSL_SHA384_Init(CYASSL_SHA384_CTX* sha)
wolfSSL 0:9d17e4342598 6575 {
wolfSSL 0:9d17e4342598 6576 typedef char sha_test[sizeof(SHA384_CTX) >= sizeof(Sha384) ? 1 : -1];
wolfSSL 0:9d17e4342598 6577 (void)sizeof(sha_test);
wolfSSL 0:9d17e4342598 6578
wolfSSL 0:9d17e4342598 6579 CYASSL_ENTER("SHA384_Init");
wolfSSL 0:9d17e4342598 6580 InitSha384((Sha384*)sha); /* OpenSSL compat, no error */
wolfSSL 0:9d17e4342598 6581 }
wolfSSL 0:9d17e4342598 6582
wolfSSL 0:9d17e4342598 6583
wolfSSL 0:9d17e4342598 6584 void CyaSSL_SHA384_Update(CYASSL_SHA384_CTX* sha, const void* input,
wolfSSL 0:9d17e4342598 6585 unsigned long sz)
wolfSSL 0:9d17e4342598 6586 {
wolfSSL 0:9d17e4342598 6587 CYASSL_ENTER("SHA384_Update");
wolfSSL 0:9d17e4342598 6588 Sha384Update((Sha384*)sha, (const byte*)input, (word32)sz);
wolfSSL 0:9d17e4342598 6589 }
wolfSSL 0:9d17e4342598 6590
wolfSSL 0:9d17e4342598 6591
wolfSSL 0:9d17e4342598 6592 void CyaSSL_SHA384_Final(byte* input, CYASSL_SHA384_CTX* sha)
wolfSSL 0:9d17e4342598 6593 {
wolfSSL 0:9d17e4342598 6594 CYASSL_ENTER("SHA384_Final");
wolfSSL 0:9d17e4342598 6595 Sha384Final((Sha384*)sha, input);
wolfSSL 0:9d17e4342598 6596 }
wolfSSL 0:9d17e4342598 6597
wolfSSL 0:9d17e4342598 6598 #endif /* CYASSL_SHA384 */
wolfSSL 0:9d17e4342598 6599
wolfSSL 0:9d17e4342598 6600
wolfSSL 0:9d17e4342598 6601 #ifdef CYASSL_SHA512
wolfSSL 0:9d17e4342598 6602
wolfSSL 0:9d17e4342598 6603 void CyaSSL_SHA512_Init(CYASSL_SHA512_CTX* sha)
wolfSSL 0:9d17e4342598 6604 {
wolfSSL 0:9d17e4342598 6605 typedef char sha_test[sizeof(SHA512_CTX) >= sizeof(Sha512) ? 1 : -1];
wolfSSL 0:9d17e4342598 6606 (void)sizeof(sha_test);
wolfSSL 0:9d17e4342598 6607
wolfSSL 0:9d17e4342598 6608 CYASSL_ENTER("SHA512_Init");
wolfSSL 0:9d17e4342598 6609 InitSha512((Sha512*)sha); /* OpenSSL compat, no error */
wolfSSL 0:9d17e4342598 6610 }
wolfSSL 0:9d17e4342598 6611
wolfSSL 0:9d17e4342598 6612
wolfSSL 0:9d17e4342598 6613 void CyaSSL_SHA512_Update(CYASSL_SHA512_CTX* sha, const void* input,
wolfSSL 0:9d17e4342598 6614 unsigned long sz)
wolfSSL 0:9d17e4342598 6615 {
wolfSSL 0:9d17e4342598 6616 CYASSL_ENTER("SHA512_Update");
wolfSSL 0:9d17e4342598 6617 Sha512Update((Sha512*)sha, (const byte*)input, (word32)sz);
wolfSSL 0:9d17e4342598 6618 }
wolfSSL 0:9d17e4342598 6619
wolfSSL 0:9d17e4342598 6620
wolfSSL 0:9d17e4342598 6621 void CyaSSL_SHA512_Final(byte* input, CYASSL_SHA512_CTX* sha)
wolfSSL 0:9d17e4342598 6622 {
wolfSSL 0:9d17e4342598 6623 CYASSL_ENTER("SHA512_Final");
wolfSSL 0:9d17e4342598 6624 Sha512Final((Sha512*)sha, input);
wolfSSL 0:9d17e4342598 6625 }
wolfSSL 0:9d17e4342598 6626
wolfSSL 0:9d17e4342598 6627 #endif /* CYASSL_SHA512 */
wolfSSL 0:9d17e4342598 6628
wolfSSL 0:9d17e4342598 6629
wolfSSL 0:9d17e4342598 6630 const CYASSL_EVP_MD* CyaSSL_EVP_md5(void)
wolfSSL 0:9d17e4342598 6631 {
wolfSSL 0:9d17e4342598 6632 static const char* type = "MD5";
wolfSSL 0:9d17e4342598 6633 CYASSL_ENTER("EVP_md5");
wolfSSL 0:9d17e4342598 6634 return type;
wolfSSL 0:9d17e4342598 6635 }
wolfSSL 0:9d17e4342598 6636
wolfSSL 0:9d17e4342598 6637
wolfSSL 0:9d17e4342598 6638 const CYASSL_EVP_MD* CyaSSL_EVP_sha1(void)
wolfSSL 0:9d17e4342598 6639 {
wolfSSL 0:9d17e4342598 6640 static const char* type = "SHA";
wolfSSL 0:9d17e4342598 6641 CYASSL_ENTER("EVP_sha1");
wolfSSL 0:9d17e4342598 6642 return type;
wolfSSL 0:9d17e4342598 6643 }
wolfSSL 0:9d17e4342598 6644
wolfSSL 0:9d17e4342598 6645
wolfSSL 0:9d17e4342598 6646 const CYASSL_EVP_MD* CyaSSL_EVP_sha256(void)
wolfSSL 0:9d17e4342598 6647 {
wolfSSL 0:9d17e4342598 6648 static const char* type = "SHA256";
wolfSSL 0:9d17e4342598 6649 CYASSL_ENTER("EVP_sha256");
wolfSSL 0:9d17e4342598 6650 return type;
wolfSSL 0:9d17e4342598 6651 }
wolfSSL 0:9d17e4342598 6652
wolfSSL 0:9d17e4342598 6653 #ifdef CYASSL_SHA384
wolfSSL 0:9d17e4342598 6654
wolfSSL 0:9d17e4342598 6655 const CYASSL_EVP_MD* CyaSSL_EVP_sha384(void)
wolfSSL 0:9d17e4342598 6656 {
wolfSSL 0:9d17e4342598 6657 static const char* type = "SHA384";
wolfSSL 0:9d17e4342598 6658 CYASSL_ENTER("EVP_sha384");
wolfSSL 0:9d17e4342598 6659 return type;
wolfSSL 0:9d17e4342598 6660 }
wolfSSL 0:9d17e4342598 6661
wolfSSL 0:9d17e4342598 6662 #endif /* CYASSL_SHA384 */
wolfSSL 0:9d17e4342598 6663
wolfSSL 0:9d17e4342598 6664 #ifdef CYASSL_SHA512
wolfSSL 0:9d17e4342598 6665
wolfSSL 0:9d17e4342598 6666 const CYASSL_EVP_MD* CyaSSL_EVP_sha512(void)
wolfSSL 0:9d17e4342598 6667 {
wolfSSL 0:9d17e4342598 6668 static const char* type = "SHA512";
wolfSSL 0:9d17e4342598 6669 CYASSL_ENTER("EVP_sha512");
wolfSSL 0:9d17e4342598 6670 return type;
wolfSSL 0:9d17e4342598 6671 }
wolfSSL 0:9d17e4342598 6672
wolfSSL 0:9d17e4342598 6673 #endif /* CYASSL_SHA512 */
wolfSSL 0:9d17e4342598 6674
wolfSSL 0:9d17e4342598 6675
wolfSSL 0:9d17e4342598 6676 void CyaSSL_EVP_MD_CTX_init(CYASSL_EVP_MD_CTX* ctx)
wolfSSL 0:9d17e4342598 6677 {
wolfSSL 0:9d17e4342598 6678 CYASSL_ENTER("EVP_CIPHER_MD_CTX_init");
wolfSSL 0:9d17e4342598 6679 (void)ctx;
wolfSSL 0:9d17e4342598 6680 /* do nothing */
wolfSSL 0:9d17e4342598 6681 }
wolfSSL 0:9d17e4342598 6682
wolfSSL 0:9d17e4342598 6683
wolfSSL 0:9d17e4342598 6684 const CYASSL_EVP_CIPHER* CyaSSL_EVP_aes_128_cbc(void)
wolfSSL 0:9d17e4342598 6685 {
wolfSSL 0:9d17e4342598 6686 static const char* type = "AES128-CBC";
wolfSSL 0:9d17e4342598 6687 CYASSL_ENTER("CyaSSL_EVP_aes_128_cbc");
wolfSSL 0:9d17e4342598 6688 return type;
wolfSSL 0:9d17e4342598 6689 }
wolfSSL 0:9d17e4342598 6690
wolfSSL 0:9d17e4342598 6691
wolfSSL 0:9d17e4342598 6692 const CYASSL_EVP_CIPHER* CyaSSL_EVP_aes_192_cbc(void)
wolfSSL 0:9d17e4342598 6693 {
wolfSSL 0:9d17e4342598 6694 static const char* type = "AES192-CBC";
wolfSSL 0:9d17e4342598 6695 CYASSL_ENTER("CyaSSL_EVP_aes_192_cbc");
wolfSSL 0:9d17e4342598 6696 return type;
wolfSSL 0:9d17e4342598 6697 }
wolfSSL 0:9d17e4342598 6698
wolfSSL 0:9d17e4342598 6699
wolfSSL 0:9d17e4342598 6700 const CYASSL_EVP_CIPHER* CyaSSL_EVP_aes_256_cbc(void)
wolfSSL 0:9d17e4342598 6701 {
wolfSSL 0:9d17e4342598 6702 static const char* type = "AES256-CBC";
wolfSSL 0:9d17e4342598 6703 CYASSL_ENTER("CyaSSL_EVP_aes_256_cbc");
wolfSSL 0:9d17e4342598 6704 return type;
wolfSSL 0:9d17e4342598 6705 }
wolfSSL 0:9d17e4342598 6706
wolfSSL 0:9d17e4342598 6707
wolfSSL 0:9d17e4342598 6708 const CYASSL_EVP_CIPHER* CyaSSL_EVP_aes_128_ctr(void)
wolfSSL 0:9d17e4342598 6709 {
wolfSSL 0:9d17e4342598 6710 static const char* type = "AES128-CTR";
wolfSSL 0:9d17e4342598 6711 CYASSL_ENTER("CyaSSL_EVP_aes_128_ctr");
wolfSSL 0:9d17e4342598 6712 return type;
wolfSSL 0:9d17e4342598 6713 }
wolfSSL 0:9d17e4342598 6714
wolfSSL 0:9d17e4342598 6715
wolfSSL 0:9d17e4342598 6716 const CYASSL_EVP_CIPHER* CyaSSL_EVP_aes_192_ctr(void)
wolfSSL 0:9d17e4342598 6717 {
wolfSSL 0:9d17e4342598 6718 static const char* type = "AES192-CTR";
wolfSSL 0:9d17e4342598 6719 CYASSL_ENTER("CyaSSL_EVP_aes_192_ctr");
wolfSSL 0:9d17e4342598 6720 return type;
wolfSSL 0:9d17e4342598 6721 }
wolfSSL 0:9d17e4342598 6722
wolfSSL 0:9d17e4342598 6723
wolfSSL 0:9d17e4342598 6724 const CYASSL_EVP_CIPHER* CyaSSL_EVP_aes_256_ctr(void)
wolfSSL 0:9d17e4342598 6725 {
wolfSSL 0:9d17e4342598 6726 static const char* type = "AES256-CTR";
wolfSSL 0:9d17e4342598 6727 CYASSL_ENTER("CyaSSL_EVP_aes_256_ctr");
wolfSSL 0:9d17e4342598 6728 return type;
wolfSSL 0:9d17e4342598 6729 }
wolfSSL 0:9d17e4342598 6730
wolfSSL 0:9d17e4342598 6731
wolfSSL 0:9d17e4342598 6732 const CYASSL_EVP_CIPHER* CyaSSL_EVP_des_cbc(void)
wolfSSL 0:9d17e4342598 6733 {
wolfSSL 0:9d17e4342598 6734 static const char* type = "DES-CBC";
wolfSSL 0:9d17e4342598 6735 CYASSL_ENTER("CyaSSL_EVP_des_cbc");
wolfSSL 0:9d17e4342598 6736 return type;
wolfSSL 0:9d17e4342598 6737 }
wolfSSL 0:9d17e4342598 6738
wolfSSL 0:9d17e4342598 6739
wolfSSL 0:9d17e4342598 6740 const CYASSL_EVP_CIPHER* CyaSSL_EVP_des_ede3_cbc(void)
wolfSSL 0:9d17e4342598 6741 {
wolfSSL 0:9d17e4342598 6742 static const char* type = "DES-EDE3-CBC";
wolfSSL 0:9d17e4342598 6743 CYASSL_ENTER("CyaSSL_EVP_des_ede3_cbc");
wolfSSL 0:9d17e4342598 6744 return type;
wolfSSL 0:9d17e4342598 6745 }
wolfSSL 0:9d17e4342598 6746
wolfSSL 0:9d17e4342598 6747
wolfSSL 0:9d17e4342598 6748 const CYASSL_EVP_CIPHER* CyaSSL_EVP_rc4(void)
wolfSSL 0:9d17e4342598 6749 {
wolfSSL 0:9d17e4342598 6750 static const char* type = "ARC4";
wolfSSL 0:9d17e4342598 6751 CYASSL_ENTER("CyaSSL_EVP_rc4");
wolfSSL 0:9d17e4342598 6752 return type;
wolfSSL 0:9d17e4342598 6753 }
wolfSSL 0:9d17e4342598 6754
wolfSSL 0:9d17e4342598 6755
wolfSSL 0:9d17e4342598 6756 const CYASSL_EVP_CIPHER* CyaSSL_EVP_enc_null(void)
wolfSSL 0:9d17e4342598 6757 {
wolfSSL 0:9d17e4342598 6758 static const char* type = "NULL";
wolfSSL 0:9d17e4342598 6759 CYASSL_ENTER("CyaSSL_EVP_enc_null");
wolfSSL 0:9d17e4342598 6760 return type;
wolfSSL 0:9d17e4342598 6761 }
wolfSSL 0:9d17e4342598 6762
wolfSSL 0:9d17e4342598 6763
wolfSSL 0:9d17e4342598 6764 int CyaSSL_EVP_MD_CTX_cleanup(CYASSL_EVP_MD_CTX* ctx)
wolfSSL 0:9d17e4342598 6765 {
wolfSSL 0:9d17e4342598 6766 CYASSL_ENTER("EVP_MD_CTX_cleanup");
wolfSSL 0:9d17e4342598 6767 (void)ctx;
wolfSSL 0:9d17e4342598 6768 return 0;
wolfSSL 0:9d17e4342598 6769 }
wolfSSL 0:9d17e4342598 6770
wolfSSL 0:9d17e4342598 6771
wolfSSL 0:9d17e4342598 6772
wolfSSL 0:9d17e4342598 6773 void CyaSSL_EVP_CIPHER_CTX_init(CYASSL_EVP_CIPHER_CTX* ctx)
wolfSSL 0:9d17e4342598 6774 {
wolfSSL 0:9d17e4342598 6775 CYASSL_ENTER("EVP_CIPHER_CTX_init");
wolfSSL 0:9d17e4342598 6776 if (ctx) {
wolfSSL 0:9d17e4342598 6777 ctx->cipherType = 0xff; /* no init */
wolfSSL 0:9d17e4342598 6778 ctx->keyLen = 0;
wolfSSL 0:9d17e4342598 6779 ctx->enc = 1; /* start in encrypt mode */
wolfSSL 0:9d17e4342598 6780 }
wolfSSL 0:9d17e4342598 6781 }
wolfSSL 0:9d17e4342598 6782
wolfSSL 0:9d17e4342598 6783
wolfSSL 0:9d17e4342598 6784 /* SSL_SUCCESS on ok */
wolfSSL 0:9d17e4342598 6785 int CyaSSL_EVP_CIPHER_CTX_cleanup(CYASSL_EVP_CIPHER_CTX* ctx)
wolfSSL 0:9d17e4342598 6786 {
wolfSSL 0:9d17e4342598 6787 CYASSL_ENTER("EVP_CIPHER_CTX_cleanup");
wolfSSL 0:9d17e4342598 6788 if (ctx) {
wolfSSL 0:9d17e4342598 6789 ctx->cipherType = 0xff; /* no more init */
wolfSSL 0:9d17e4342598 6790 ctx->keyLen = 0;
wolfSSL 0:9d17e4342598 6791 }
wolfSSL 0:9d17e4342598 6792
wolfSSL 0:9d17e4342598 6793 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 6794 }
wolfSSL 0:9d17e4342598 6795
wolfSSL 0:9d17e4342598 6796
wolfSSL 0:9d17e4342598 6797 /* SSL_SUCCESS on ok */
wolfSSL 0:9d17e4342598 6798 int CyaSSL_EVP_CipherInit(CYASSL_EVP_CIPHER_CTX* ctx,
wolfSSL 0:9d17e4342598 6799 const CYASSL_EVP_CIPHER* type, byte* key,
wolfSSL 0:9d17e4342598 6800 byte* iv, int enc)
wolfSSL 0:9d17e4342598 6801 {
wolfSSL 0:9d17e4342598 6802 int ret = 0;
wolfSSL 0:9d17e4342598 6803
wolfSSL 0:9d17e4342598 6804 CYASSL_ENTER("CyaSSL_EVP_CipherInit");
wolfSSL 0:9d17e4342598 6805 if (ctx == NULL) {
wolfSSL 0:9d17e4342598 6806 CYASSL_MSG("no ctx");
wolfSSL 0:9d17e4342598 6807 return 0; /* failure */
wolfSSL 0:9d17e4342598 6808 }
wolfSSL 0:9d17e4342598 6809
wolfSSL 0:9d17e4342598 6810 if (type == NULL && ctx->cipherType == 0xff) {
wolfSSL 0:9d17e4342598 6811 CYASSL_MSG("no type set");
wolfSSL 0:9d17e4342598 6812 return 0; /* failure */
wolfSSL 0:9d17e4342598 6813 }
wolfSSL 0:9d17e4342598 6814
wolfSSL 0:9d17e4342598 6815 if (ctx->cipherType == AES_128_CBC_TYPE || (type &&
wolfSSL 0:9d17e4342598 6816 XSTRNCMP(type, "AES128-CBC", 10) == 0)) {
wolfSSL 0:9d17e4342598 6817 CYASSL_MSG("AES-128-CBC");
wolfSSL 0:9d17e4342598 6818 ctx->cipherType = AES_128_CBC_TYPE;
wolfSSL 0:9d17e4342598 6819 ctx->keyLen = 16;
wolfSSL 0:9d17e4342598 6820 if (enc == 0 || enc == 1)
wolfSSL 0:9d17e4342598 6821 ctx->enc = enc ? 1 : 0;
wolfSSL 0:9d17e4342598 6822 if (key) {
wolfSSL 0:9d17e4342598 6823 ret = AesSetKey(&ctx->cipher.aes, key, ctx->keyLen, iv,
wolfSSL 0:9d17e4342598 6824 ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION);
wolfSSL 0:9d17e4342598 6825 if (ret != 0)
wolfSSL 0:9d17e4342598 6826 return ret;
wolfSSL 0:9d17e4342598 6827 }
wolfSSL 0:9d17e4342598 6828 if (iv && key == NULL) {
wolfSSL 0:9d17e4342598 6829 ret = AesSetIV(&ctx->cipher.aes, iv);
wolfSSL 0:9d17e4342598 6830 if (ret != 0)
wolfSSL 0:9d17e4342598 6831 return ret;
wolfSSL 0:9d17e4342598 6832 }
wolfSSL 0:9d17e4342598 6833 }
wolfSSL 0:9d17e4342598 6834 else if (ctx->cipherType == AES_192_CBC_TYPE || (type &&
wolfSSL 0:9d17e4342598 6835 XSTRNCMP(type, "AES192-CBC", 10) == 0)) {
wolfSSL 0:9d17e4342598 6836 CYASSL_MSG("AES-192-CBC");
wolfSSL 0:9d17e4342598 6837 ctx->cipherType = AES_192_CBC_TYPE;
wolfSSL 0:9d17e4342598 6838 ctx->keyLen = 24;
wolfSSL 0:9d17e4342598 6839 if (enc == 0 || enc == 1)
wolfSSL 0:9d17e4342598 6840 ctx->enc = enc ? 1 : 0;
wolfSSL 0:9d17e4342598 6841 if (key) {
wolfSSL 0:9d17e4342598 6842 ret = AesSetKey(&ctx->cipher.aes, key, ctx->keyLen, iv,
wolfSSL 0:9d17e4342598 6843 ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION);
wolfSSL 0:9d17e4342598 6844 if (ret != 0)
wolfSSL 0:9d17e4342598 6845 return ret;
wolfSSL 0:9d17e4342598 6846 }
wolfSSL 0:9d17e4342598 6847 if (iv && key == NULL) {
wolfSSL 0:9d17e4342598 6848 ret = AesSetIV(&ctx->cipher.aes, iv);
wolfSSL 0:9d17e4342598 6849 if (ret != 0)
wolfSSL 0:9d17e4342598 6850 return ret;
wolfSSL 0:9d17e4342598 6851 }
wolfSSL 0:9d17e4342598 6852 }
wolfSSL 0:9d17e4342598 6853 else if (ctx->cipherType == AES_256_CBC_TYPE || (type &&
wolfSSL 0:9d17e4342598 6854 XSTRNCMP(type, "AES256-CBC", 10) == 0)) {
wolfSSL 0:9d17e4342598 6855 CYASSL_MSG("AES-256-CBC");
wolfSSL 0:9d17e4342598 6856 ctx->cipherType = AES_256_CBC_TYPE;
wolfSSL 0:9d17e4342598 6857 ctx->keyLen = 32;
wolfSSL 0:9d17e4342598 6858 if (enc == 0 || enc == 1)
wolfSSL 0:9d17e4342598 6859 ctx->enc = enc ? 1 : 0;
wolfSSL 0:9d17e4342598 6860 if (key) {
wolfSSL 0:9d17e4342598 6861 ret = AesSetKey(&ctx->cipher.aes, key, ctx->keyLen, iv,
wolfSSL 0:9d17e4342598 6862 ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION);
wolfSSL 0:9d17e4342598 6863 if (ret != 0)
wolfSSL 0:9d17e4342598 6864 return ret;
wolfSSL 0:9d17e4342598 6865 }
wolfSSL 0:9d17e4342598 6866 if (iv && key == NULL) {
wolfSSL 0:9d17e4342598 6867 ret = AesSetIV(&ctx->cipher.aes, iv);
wolfSSL 0:9d17e4342598 6868 if (ret != 0)
wolfSSL 0:9d17e4342598 6869 return ret;
wolfSSL 0:9d17e4342598 6870 }
wolfSSL 0:9d17e4342598 6871 }
wolfSSL 0:9d17e4342598 6872 #ifdef CYASSL_AES_COUNTER
wolfSSL 0:9d17e4342598 6873 else if (ctx->cipherType == AES_128_CTR_TYPE || (type &&
wolfSSL 0:9d17e4342598 6874 XSTRNCMP(type, "AES128-CTR", 10) == 0)) {
wolfSSL 0:9d17e4342598 6875 CYASSL_MSG("AES-128-CTR");
wolfSSL 0:9d17e4342598 6876 ctx->cipherType = AES_128_CTR_TYPE;
wolfSSL 0:9d17e4342598 6877 ctx->keyLen = 16;
wolfSSL 0:9d17e4342598 6878 if (enc == 0 || enc == 1)
wolfSSL 0:9d17e4342598 6879 ctx->enc = enc ? 1 : 0;
wolfSSL 0:9d17e4342598 6880 if (key) {
wolfSSL 0:9d17e4342598 6881 ret = AesSetKey(&ctx->cipher.aes, key, ctx->keyLen, iv,
wolfSSL 0:9d17e4342598 6882 AES_ENCRYPTION);
wolfSSL 0:9d17e4342598 6883 if (ret != 0)
wolfSSL 0:9d17e4342598 6884 return ret;
wolfSSL 0:9d17e4342598 6885 }
wolfSSL 0:9d17e4342598 6886 if (iv && key == NULL) {
wolfSSL 0:9d17e4342598 6887 ret = AesSetIV(&ctx->cipher.aes, iv);
wolfSSL 0:9d17e4342598 6888 if (ret != 0)
wolfSSL 0:9d17e4342598 6889 return ret;
wolfSSL 0:9d17e4342598 6890 }
wolfSSL 0:9d17e4342598 6891 }
wolfSSL 0:9d17e4342598 6892 else if (ctx->cipherType == AES_192_CTR_TYPE || (type &&
wolfSSL 0:9d17e4342598 6893 XSTRNCMP(type, "AES192-CTR", 10) == 0)) {
wolfSSL 0:9d17e4342598 6894 CYASSL_MSG("AES-192-CTR");
wolfSSL 0:9d17e4342598 6895 ctx->cipherType = AES_192_CTR_TYPE;
wolfSSL 0:9d17e4342598 6896 ctx->keyLen = 24;
wolfSSL 0:9d17e4342598 6897 if (enc == 0 || enc == 1)
wolfSSL 0:9d17e4342598 6898 ctx->enc = enc ? 1 : 0;
wolfSSL 0:9d17e4342598 6899 if (key) {
wolfSSL 0:9d17e4342598 6900 ret = AesSetKey(&ctx->cipher.aes, key, ctx->keyLen, iv,
wolfSSL 0:9d17e4342598 6901 AES_ENCRYPTION);
wolfSSL 0:9d17e4342598 6902 if (ret != 0)
wolfSSL 0:9d17e4342598 6903 return ret;
wolfSSL 0:9d17e4342598 6904 }
wolfSSL 0:9d17e4342598 6905 if (iv && key == NULL) {
wolfSSL 0:9d17e4342598 6906 ret = AesSetIV(&ctx->cipher.aes, iv);
wolfSSL 0:9d17e4342598 6907 if (ret != 0)
wolfSSL 0:9d17e4342598 6908 return ret;
wolfSSL 0:9d17e4342598 6909 }
wolfSSL 0:9d17e4342598 6910 }
wolfSSL 0:9d17e4342598 6911 else if (ctx->cipherType == AES_256_CTR_TYPE || (type &&
wolfSSL 0:9d17e4342598 6912 XSTRNCMP(type, "AES256-CTR", 10) == 0)) {
wolfSSL 0:9d17e4342598 6913 CYASSL_MSG("AES-256-CTR");
wolfSSL 0:9d17e4342598 6914 ctx->cipherType = AES_256_CTR_TYPE;
wolfSSL 0:9d17e4342598 6915 ctx->keyLen = 32;
wolfSSL 0:9d17e4342598 6916 if (enc == 0 || enc == 1)
wolfSSL 0:9d17e4342598 6917 ctx->enc = enc ? 1 : 0;
wolfSSL 0:9d17e4342598 6918 if (key) {
wolfSSL 0:9d17e4342598 6919 ret = AesSetKey(&ctx->cipher.aes, key, ctx->keyLen, iv,
wolfSSL 0:9d17e4342598 6920 AES_ENCRYPTION);
wolfSSL 0:9d17e4342598 6921 if (ret != 0)
wolfSSL 0:9d17e4342598 6922 return ret;
wolfSSL 0:9d17e4342598 6923 }
wolfSSL 0:9d17e4342598 6924 if (iv && key == NULL) {
wolfSSL 0:9d17e4342598 6925 ret = AesSetIV(&ctx->cipher.aes, iv);
wolfSSL 0:9d17e4342598 6926 if (ret != 0)
wolfSSL 0:9d17e4342598 6927 return ret;
wolfSSL 0:9d17e4342598 6928 }
wolfSSL 0:9d17e4342598 6929 }
wolfSSL 0:9d17e4342598 6930 #endif /* CYASSL_AES_CTR */
wolfSSL 0:9d17e4342598 6931 else if (ctx->cipherType == DES_CBC_TYPE || (type &&
wolfSSL 0:9d17e4342598 6932 XSTRNCMP(type, "DES-CBC", 7) == 0)) {
wolfSSL 0:9d17e4342598 6933 CYASSL_MSG("DES-CBC");
wolfSSL 0:9d17e4342598 6934 ctx->cipherType = DES_CBC_TYPE;
wolfSSL 0:9d17e4342598 6935 ctx->keyLen = 8;
wolfSSL 0:9d17e4342598 6936 if (enc == 0 || enc == 1)
wolfSSL 0:9d17e4342598 6937 ctx->enc = enc ? 1 : 0;
wolfSSL 0:9d17e4342598 6938 if (key) {
wolfSSL 0:9d17e4342598 6939 ret = Des_SetKey(&ctx->cipher.des, key, iv,
wolfSSL 0:9d17e4342598 6940 ctx->enc ? DES_ENCRYPTION : DES_DECRYPTION);
wolfSSL 0:9d17e4342598 6941 if (ret != 0)
wolfSSL 0:9d17e4342598 6942 return ret;
wolfSSL 0:9d17e4342598 6943 }
wolfSSL 0:9d17e4342598 6944
wolfSSL 0:9d17e4342598 6945 if (iv && key == NULL)
wolfSSL 0:9d17e4342598 6946 Des_SetIV(&ctx->cipher.des, iv);
wolfSSL 0:9d17e4342598 6947 }
wolfSSL 0:9d17e4342598 6948 else if (ctx->cipherType == DES_EDE3_CBC_TYPE || (type &&
wolfSSL 0:9d17e4342598 6949 XSTRNCMP(type, "DES-EDE3-CBC", 11) == 0)) {
wolfSSL 0:9d17e4342598 6950 CYASSL_MSG("DES-EDE3-CBC");
wolfSSL 0:9d17e4342598 6951 ctx->cipherType = DES_EDE3_CBC_TYPE;
wolfSSL 0:9d17e4342598 6952 ctx->keyLen = 24;
wolfSSL 0:9d17e4342598 6953 if (enc == 0 || enc == 1)
wolfSSL 0:9d17e4342598 6954 ctx->enc = enc ? 1 : 0;
wolfSSL 0:9d17e4342598 6955 if (key) {
wolfSSL 0:9d17e4342598 6956 ret = Des3_SetKey(&ctx->cipher.des3, key, iv,
wolfSSL 0:9d17e4342598 6957 ctx->enc ? DES_ENCRYPTION : DES_DECRYPTION);
wolfSSL 0:9d17e4342598 6958 if (ret != 0)
wolfSSL 0:9d17e4342598 6959 return ret;
wolfSSL 0:9d17e4342598 6960 }
wolfSSL 0:9d17e4342598 6961
wolfSSL 0:9d17e4342598 6962 if (iv && key == NULL) {
wolfSSL 0:9d17e4342598 6963 ret = Des3_SetIV(&ctx->cipher.des3, iv);
wolfSSL 0:9d17e4342598 6964 if (ret != 0)
wolfSSL 0:9d17e4342598 6965 return ret;
wolfSSL 0:9d17e4342598 6966 }
wolfSSL 0:9d17e4342598 6967 }
wolfSSL 0:9d17e4342598 6968 else if (ctx->cipherType == ARC4_TYPE || (type &&
wolfSSL 0:9d17e4342598 6969 XSTRNCMP(type, "ARC4", 4) == 0)) {
wolfSSL 0:9d17e4342598 6970 CYASSL_MSG("ARC4");
wolfSSL 0:9d17e4342598 6971 ctx->cipherType = ARC4_TYPE;
wolfSSL 0:9d17e4342598 6972 if (ctx->keyLen == 0) /* user may have already set */
wolfSSL 0:9d17e4342598 6973 ctx->keyLen = 16; /* default to 128 */
wolfSSL 0:9d17e4342598 6974 if (key)
wolfSSL 0:9d17e4342598 6975 Arc4SetKey(&ctx->cipher.arc4, key, ctx->keyLen);
wolfSSL 0:9d17e4342598 6976 }
wolfSSL 0:9d17e4342598 6977 else if (ctx->cipherType == NULL_CIPHER_TYPE || (type &&
wolfSSL 0:9d17e4342598 6978 XSTRNCMP(type, "NULL", 4) == 0)) {
wolfSSL 0:9d17e4342598 6979 CYASSL_MSG("NULL cipher");
wolfSSL 0:9d17e4342598 6980 ctx->cipherType = NULL_CIPHER_TYPE;
wolfSSL 0:9d17e4342598 6981 ctx->keyLen = 0;
wolfSSL 0:9d17e4342598 6982 }
wolfSSL 0:9d17e4342598 6983 else
wolfSSL 0:9d17e4342598 6984 return 0; /* failure */
wolfSSL 0:9d17e4342598 6985
wolfSSL 0:9d17e4342598 6986
wolfSSL 0:9d17e4342598 6987 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 6988 }
wolfSSL 0:9d17e4342598 6989
wolfSSL 0:9d17e4342598 6990
wolfSSL 0:9d17e4342598 6991 /* SSL_SUCCESS on ok */
wolfSSL 0:9d17e4342598 6992 int CyaSSL_EVP_CIPHER_CTX_key_length(CYASSL_EVP_CIPHER_CTX* ctx)
wolfSSL 0:9d17e4342598 6993 {
wolfSSL 0:9d17e4342598 6994 CYASSL_ENTER("CyaSSL_EVP_CIPHER_CTX_key_length");
wolfSSL 0:9d17e4342598 6995 if (ctx)
wolfSSL 0:9d17e4342598 6996 return ctx->keyLen;
wolfSSL 0:9d17e4342598 6997
wolfSSL 0:9d17e4342598 6998 return 0; /* failure */
wolfSSL 0:9d17e4342598 6999 }
wolfSSL 0:9d17e4342598 7000
wolfSSL 0:9d17e4342598 7001
wolfSSL 0:9d17e4342598 7002 /* SSL_SUCCESS on ok */
wolfSSL 0:9d17e4342598 7003 int CyaSSL_EVP_CIPHER_CTX_set_key_length(CYASSL_EVP_CIPHER_CTX* ctx,
wolfSSL 0:9d17e4342598 7004 int keylen)
wolfSSL 0:9d17e4342598 7005 {
wolfSSL 0:9d17e4342598 7006 CYASSL_ENTER("CyaSSL_EVP_CIPHER_CTX_set_key_length");
wolfSSL 0:9d17e4342598 7007 if (ctx)
wolfSSL 0:9d17e4342598 7008 ctx->keyLen = keylen;
wolfSSL 0:9d17e4342598 7009 else
wolfSSL 0:9d17e4342598 7010 return 0; /* failure */
wolfSSL 0:9d17e4342598 7011
wolfSSL 0:9d17e4342598 7012 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 7013 }
wolfSSL 0:9d17e4342598 7014
wolfSSL 0:9d17e4342598 7015
wolfSSL 0:9d17e4342598 7016 /* SSL_SUCCESS on ok */
wolfSSL 0:9d17e4342598 7017 int CyaSSL_EVP_Cipher(CYASSL_EVP_CIPHER_CTX* ctx, byte* dst, byte* src,
wolfSSL 0:9d17e4342598 7018 word32 len)
wolfSSL 0:9d17e4342598 7019 {
wolfSSL 0:9d17e4342598 7020 int ret = 0;
wolfSSL 0:9d17e4342598 7021 CYASSL_ENTER("CyaSSL_EVP_Cipher");
wolfSSL 0:9d17e4342598 7022
wolfSSL 0:9d17e4342598 7023 if (ctx == NULL || dst == NULL || src == NULL) {
wolfSSL 0:9d17e4342598 7024 CYASSL_MSG("Bad function argument");
wolfSSL 0:9d17e4342598 7025 return 0; /* failure */
wolfSSL 0:9d17e4342598 7026 }
wolfSSL 0:9d17e4342598 7027
wolfSSL 0:9d17e4342598 7028 if (ctx->cipherType == 0xff) {
wolfSSL 0:9d17e4342598 7029 CYASSL_MSG("no init");
wolfSSL 0:9d17e4342598 7030 return 0; /* failure */
wolfSSL 0:9d17e4342598 7031 }
wolfSSL 0:9d17e4342598 7032
wolfSSL 0:9d17e4342598 7033 switch (ctx->cipherType) {
wolfSSL 0:9d17e4342598 7034
wolfSSL 0:9d17e4342598 7035 case AES_128_CBC_TYPE :
wolfSSL 0:9d17e4342598 7036 case AES_192_CBC_TYPE :
wolfSSL 0:9d17e4342598 7037 case AES_256_CBC_TYPE :
wolfSSL 0:9d17e4342598 7038 CYASSL_MSG("AES CBC");
wolfSSL 0:9d17e4342598 7039 if (ctx->enc)
wolfSSL 0:9d17e4342598 7040 ret = AesCbcEncrypt(&ctx->cipher.aes, dst, src, len);
wolfSSL 0:9d17e4342598 7041 else
wolfSSL 0:9d17e4342598 7042 ret = AesCbcDecrypt(&ctx->cipher.aes, dst, src, len);
wolfSSL 0:9d17e4342598 7043 break;
wolfSSL 0:9d17e4342598 7044
wolfSSL 0:9d17e4342598 7045 #ifdef CYASSL_AES_COUNTER
wolfSSL 0:9d17e4342598 7046 case AES_128_CTR_TYPE :
wolfSSL 0:9d17e4342598 7047 case AES_192_CTR_TYPE :
wolfSSL 0:9d17e4342598 7048 case AES_256_CTR_TYPE :
wolfSSL 0:9d17e4342598 7049 CYASSL_MSG("AES CTR");
wolfSSL 0:9d17e4342598 7050 AesCtrEncrypt(&ctx->cipher.aes, dst, src, len);
wolfSSL 0:9d17e4342598 7051 break;
wolfSSL 0:9d17e4342598 7052 #endif
wolfSSL 0:9d17e4342598 7053
wolfSSL 0:9d17e4342598 7054 case DES_CBC_TYPE :
wolfSSL 0:9d17e4342598 7055 if (ctx->enc)
wolfSSL 0:9d17e4342598 7056 Des_CbcEncrypt(&ctx->cipher.des, dst, src, len);
wolfSSL 0:9d17e4342598 7057 else
wolfSSL 0:9d17e4342598 7058 Des_CbcDecrypt(&ctx->cipher.des, dst, src, len);
wolfSSL 0:9d17e4342598 7059 break;
wolfSSL 0:9d17e4342598 7060
wolfSSL 0:9d17e4342598 7061 case DES_EDE3_CBC_TYPE :
wolfSSL 0:9d17e4342598 7062 if (ctx->enc)
wolfSSL 0:9d17e4342598 7063 ret = Des3_CbcEncrypt(&ctx->cipher.des3, dst, src, len);
wolfSSL 0:9d17e4342598 7064 else
wolfSSL 0:9d17e4342598 7065 ret = Des3_CbcDecrypt(&ctx->cipher.des3, dst, src, len);
wolfSSL 0:9d17e4342598 7066 break;
wolfSSL 0:9d17e4342598 7067
wolfSSL 0:9d17e4342598 7068 case ARC4_TYPE :
wolfSSL 0:9d17e4342598 7069 Arc4Process(&ctx->cipher.arc4, dst, src, len);
wolfSSL 0:9d17e4342598 7070 break;
wolfSSL 0:9d17e4342598 7071
wolfSSL 0:9d17e4342598 7072 case NULL_CIPHER_TYPE :
wolfSSL 0:9d17e4342598 7073 XMEMCPY(dst, src, len);
wolfSSL 0:9d17e4342598 7074 break;
wolfSSL 0:9d17e4342598 7075
wolfSSL 0:9d17e4342598 7076 default: {
wolfSSL 0:9d17e4342598 7077 CYASSL_MSG("bad type");
wolfSSL 0:9d17e4342598 7078 return 0; /* failure */
wolfSSL 0:9d17e4342598 7079 }
wolfSSL 0:9d17e4342598 7080 }
wolfSSL 0:9d17e4342598 7081
wolfSSL 0:9d17e4342598 7082 if (ret != 0) {
wolfSSL 0:9d17e4342598 7083 CYASSL_MSG("CyaSSL_EVP_Cipher failure");
wolfSSL 0:9d17e4342598 7084 return 0; /* failuer */
wolfSSL 0:9d17e4342598 7085 }
wolfSSL 0:9d17e4342598 7086
wolfSSL 0:9d17e4342598 7087 CYASSL_MSG("CyaSSL_EVP_Cipher success");
wolfSSL 0:9d17e4342598 7088 return SSL_SUCCESS; /* success */
wolfSSL 0:9d17e4342598 7089 }
wolfSSL 0:9d17e4342598 7090
wolfSSL 0:9d17e4342598 7091
wolfSSL 0:9d17e4342598 7092 /* store for external read of iv, SSL_SUCCESS on success */
wolfSSL 0:9d17e4342598 7093 int CyaSSL_StoreExternalIV(CYASSL_EVP_CIPHER_CTX* ctx)
wolfSSL 0:9d17e4342598 7094 {
wolfSSL 0:9d17e4342598 7095 CYASSL_ENTER("CyaSSL_StoreExternalIV");
wolfSSL 0:9d17e4342598 7096
wolfSSL 0:9d17e4342598 7097 if (ctx == NULL) {
wolfSSL 0:9d17e4342598 7098 CYASSL_MSG("Bad function argument");
wolfSSL 0:9d17e4342598 7099 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 7100 }
wolfSSL 0:9d17e4342598 7101
wolfSSL 0:9d17e4342598 7102 switch (ctx->cipherType) {
wolfSSL 0:9d17e4342598 7103
wolfSSL 0:9d17e4342598 7104 case AES_128_CBC_TYPE :
wolfSSL 0:9d17e4342598 7105 case AES_192_CBC_TYPE :
wolfSSL 0:9d17e4342598 7106 case AES_256_CBC_TYPE :
wolfSSL 0:9d17e4342598 7107 CYASSL_MSG("AES CBC");
wolfSSL 0:9d17e4342598 7108 memcpy(ctx->iv, &ctx->cipher.aes.reg, AES_BLOCK_SIZE);
wolfSSL 0:9d17e4342598 7109 break;
wolfSSL 0:9d17e4342598 7110
wolfSSL 0:9d17e4342598 7111 #ifdef CYASSL_AES_COUNTER
wolfSSL 0:9d17e4342598 7112 case AES_128_CTR_TYPE :
wolfSSL 0:9d17e4342598 7113 case AES_192_CTR_TYPE :
wolfSSL 0:9d17e4342598 7114 case AES_256_CTR_TYPE :
wolfSSL 0:9d17e4342598 7115 CYASSL_MSG("AES CTR");
wolfSSL 0:9d17e4342598 7116 memcpy(ctx->iv, &ctx->cipher.aes.reg, AES_BLOCK_SIZE);
wolfSSL 0:9d17e4342598 7117 break;
wolfSSL 0:9d17e4342598 7118 #endif
wolfSSL 0:9d17e4342598 7119
wolfSSL 0:9d17e4342598 7120 case DES_CBC_TYPE :
wolfSSL 0:9d17e4342598 7121 CYASSL_MSG("DES CBC");
wolfSSL 0:9d17e4342598 7122 memcpy(ctx->iv, &ctx->cipher.des.reg, DES_BLOCK_SIZE);
wolfSSL 0:9d17e4342598 7123 break;
wolfSSL 0:9d17e4342598 7124
wolfSSL 0:9d17e4342598 7125 case DES_EDE3_CBC_TYPE :
wolfSSL 0:9d17e4342598 7126 CYASSL_MSG("DES EDE3 CBC");
wolfSSL 0:9d17e4342598 7127 memcpy(ctx->iv, &ctx->cipher.des.reg, DES_BLOCK_SIZE);
wolfSSL 0:9d17e4342598 7128 break;
wolfSSL 0:9d17e4342598 7129
wolfSSL 0:9d17e4342598 7130 case ARC4_TYPE :
wolfSSL 0:9d17e4342598 7131 CYASSL_MSG("ARC4");
wolfSSL 0:9d17e4342598 7132 break;
wolfSSL 0:9d17e4342598 7133
wolfSSL 0:9d17e4342598 7134 case NULL_CIPHER_TYPE :
wolfSSL 0:9d17e4342598 7135 CYASSL_MSG("NULL");
wolfSSL 0:9d17e4342598 7136 break;
wolfSSL 0:9d17e4342598 7137
wolfSSL 0:9d17e4342598 7138 default: {
wolfSSL 0:9d17e4342598 7139 CYASSL_MSG("bad type");
wolfSSL 0:9d17e4342598 7140 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 7141 }
wolfSSL 0:9d17e4342598 7142 }
wolfSSL 0:9d17e4342598 7143 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 7144 }
wolfSSL 0:9d17e4342598 7145
wolfSSL 0:9d17e4342598 7146
wolfSSL 0:9d17e4342598 7147 /* set internal IV from external, SSL_SUCCESS on success */
wolfSSL 0:9d17e4342598 7148 int CyaSSL_SetInternalIV(CYASSL_EVP_CIPHER_CTX* ctx)
wolfSSL 0:9d17e4342598 7149 {
wolfSSL 0:9d17e4342598 7150
wolfSSL 0:9d17e4342598 7151 CYASSL_ENTER("CyaSSL_SetInternalIV");
wolfSSL 0:9d17e4342598 7152
wolfSSL 0:9d17e4342598 7153 if (ctx == NULL) {
wolfSSL 0:9d17e4342598 7154 CYASSL_MSG("Bad function argument");
wolfSSL 0:9d17e4342598 7155 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 7156 }
wolfSSL 0:9d17e4342598 7157
wolfSSL 0:9d17e4342598 7158 switch (ctx->cipherType) {
wolfSSL 0:9d17e4342598 7159
wolfSSL 0:9d17e4342598 7160 case AES_128_CBC_TYPE :
wolfSSL 0:9d17e4342598 7161 case AES_192_CBC_TYPE :
wolfSSL 0:9d17e4342598 7162 case AES_256_CBC_TYPE :
wolfSSL 0:9d17e4342598 7163 CYASSL_MSG("AES CBC");
wolfSSL 0:9d17e4342598 7164 memcpy(&ctx->cipher.aes.reg, ctx->iv, AES_BLOCK_SIZE);
wolfSSL 0:9d17e4342598 7165 break;
wolfSSL 0:9d17e4342598 7166
wolfSSL 0:9d17e4342598 7167 #ifdef CYASSL_AES_COUNTER
wolfSSL 0:9d17e4342598 7168 case AES_128_CTR_TYPE :
wolfSSL 0:9d17e4342598 7169 case AES_192_CTR_TYPE :
wolfSSL 0:9d17e4342598 7170 case AES_256_CTR_TYPE :
wolfSSL 0:9d17e4342598 7171 CYASSL_MSG("AES CTR");
wolfSSL 0:9d17e4342598 7172 memcpy(&ctx->cipher.aes.reg, ctx->iv, AES_BLOCK_SIZE);
wolfSSL 0:9d17e4342598 7173 break;
wolfSSL 0:9d17e4342598 7174 #endif
wolfSSL 0:9d17e4342598 7175
wolfSSL 0:9d17e4342598 7176 case DES_CBC_TYPE :
wolfSSL 0:9d17e4342598 7177 CYASSL_MSG("DES CBC");
wolfSSL 0:9d17e4342598 7178 memcpy(&ctx->cipher.des.reg, ctx->iv, DES_BLOCK_SIZE);
wolfSSL 0:9d17e4342598 7179 break;
wolfSSL 0:9d17e4342598 7180
wolfSSL 0:9d17e4342598 7181 case DES_EDE3_CBC_TYPE :
wolfSSL 0:9d17e4342598 7182 CYASSL_MSG("DES EDE3 CBC");
wolfSSL 0:9d17e4342598 7183 memcpy(&ctx->cipher.des.reg, ctx->iv, DES_BLOCK_SIZE);
wolfSSL 0:9d17e4342598 7184 break;
wolfSSL 0:9d17e4342598 7185
wolfSSL 0:9d17e4342598 7186 case ARC4_TYPE :
wolfSSL 0:9d17e4342598 7187 CYASSL_MSG("ARC4");
wolfSSL 0:9d17e4342598 7188 break;
wolfSSL 0:9d17e4342598 7189
wolfSSL 0:9d17e4342598 7190 case NULL_CIPHER_TYPE :
wolfSSL 0:9d17e4342598 7191 CYASSL_MSG("NULL");
wolfSSL 0:9d17e4342598 7192 break;
wolfSSL 0:9d17e4342598 7193
wolfSSL 0:9d17e4342598 7194 default: {
wolfSSL 0:9d17e4342598 7195 CYASSL_MSG("bad type");
wolfSSL 0:9d17e4342598 7196 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 7197 }
wolfSSL 0:9d17e4342598 7198 }
wolfSSL 0:9d17e4342598 7199 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 7200 }
wolfSSL 0:9d17e4342598 7201
wolfSSL 0:9d17e4342598 7202
wolfSSL 0:9d17e4342598 7203 /* SSL_SUCCESS on ok */
wolfSSL 0:9d17e4342598 7204 int CyaSSL_EVP_DigestInit(CYASSL_EVP_MD_CTX* ctx, const CYASSL_EVP_MD* type)
wolfSSL 0:9d17e4342598 7205 {
wolfSSL 0:9d17e4342598 7206 CYASSL_ENTER("EVP_DigestInit");
wolfSSL 0:9d17e4342598 7207 if (XSTRNCMP(type, "MD5", 3) == 0) {
wolfSSL 0:9d17e4342598 7208 ctx->macType = MD5;
wolfSSL 0:9d17e4342598 7209 CyaSSL_MD5_Init((MD5_CTX*)&ctx->hash);
wolfSSL 0:9d17e4342598 7210 }
wolfSSL 0:9d17e4342598 7211 else if (XSTRNCMP(type, "SHA256", 6) == 0) {
wolfSSL 0:9d17e4342598 7212 ctx->macType = SHA256;
wolfSSL 0:9d17e4342598 7213 CyaSSL_SHA256_Init((SHA256_CTX*)&ctx->hash);
wolfSSL 0:9d17e4342598 7214 }
wolfSSL 0:9d17e4342598 7215 #ifdef CYASSL_SHA384
wolfSSL 0:9d17e4342598 7216 else if (XSTRNCMP(type, "SHA384", 6) == 0) {
wolfSSL 0:9d17e4342598 7217 ctx->macType = SHA384;
wolfSSL 0:9d17e4342598 7218 CyaSSL_SHA384_Init((SHA384_CTX*)&ctx->hash);
wolfSSL 0:9d17e4342598 7219 }
wolfSSL 0:9d17e4342598 7220 #endif
wolfSSL 0:9d17e4342598 7221 #ifdef CYASSL_SHA512
wolfSSL 0:9d17e4342598 7222 else if (XSTRNCMP(type, "SHA512", 6) == 0) {
wolfSSL 0:9d17e4342598 7223 ctx->macType = SHA512;
wolfSSL 0:9d17e4342598 7224 CyaSSL_SHA512_Init((SHA512_CTX*)&ctx->hash);
wolfSSL 0:9d17e4342598 7225 }
wolfSSL 0:9d17e4342598 7226 #endif
wolfSSL 0:9d17e4342598 7227 /* has to be last since would pick or 256, 384, or 512 too */
wolfSSL 0:9d17e4342598 7228 else if (XSTRNCMP(type, "SHA", 3) == 0) {
wolfSSL 0:9d17e4342598 7229 ctx->macType = SHA;
wolfSSL 0:9d17e4342598 7230 CyaSSL_SHA_Init((SHA_CTX*)&ctx->hash);
wolfSSL 0:9d17e4342598 7231 }
wolfSSL 0:9d17e4342598 7232 else
wolfSSL 0:9d17e4342598 7233 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 7234
wolfSSL 0:9d17e4342598 7235 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 7236 }
wolfSSL 0:9d17e4342598 7237
wolfSSL 0:9d17e4342598 7238
wolfSSL 0:9d17e4342598 7239 /* SSL_SUCCESS on ok */
wolfSSL 0:9d17e4342598 7240 int CyaSSL_EVP_DigestUpdate(CYASSL_EVP_MD_CTX* ctx, const void* data,
wolfSSL 0:9d17e4342598 7241 unsigned long sz)
wolfSSL 0:9d17e4342598 7242 {
wolfSSL 0:9d17e4342598 7243 CYASSL_ENTER("EVP_DigestUpdate");
wolfSSL 0:9d17e4342598 7244 if (ctx->macType == MD5)
wolfSSL 0:9d17e4342598 7245 CyaSSL_MD5_Update((MD5_CTX*)&ctx->hash, data, (unsigned long)sz);
wolfSSL 0:9d17e4342598 7246 else if (ctx->macType == SHA)
wolfSSL 0:9d17e4342598 7247 CyaSSL_SHA_Update((SHA_CTX*)&ctx->hash, data, (unsigned long)sz);
wolfSSL 0:9d17e4342598 7248 else if (ctx->macType == SHA256)
wolfSSL 0:9d17e4342598 7249 CyaSSL_SHA256_Update((SHA256_CTX*)&ctx->hash, data,
wolfSSL 0:9d17e4342598 7250 (unsigned long)sz);
wolfSSL 0:9d17e4342598 7251 #ifdef CYASSL_SHA384
wolfSSL 0:9d17e4342598 7252 else if (ctx->macType == SHA384)
wolfSSL 0:9d17e4342598 7253 CyaSSL_SHA384_Update((SHA384_CTX*)&ctx->hash, data,
wolfSSL 0:9d17e4342598 7254 (unsigned long)sz);
wolfSSL 0:9d17e4342598 7255 #endif
wolfSSL 0:9d17e4342598 7256 #ifdef CYASSL_SHA512
wolfSSL 0:9d17e4342598 7257 else if (ctx->macType == SHA512)
wolfSSL 0:9d17e4342598 7258 CyaSSL_SHA512_Update((SHA512_CTX*)&ctx->hash, data,
wolfSSL 0:9d17e4342598 7259 (unsigned long)sz);
wolfSSL 0:9d17e4342598 7260 #endif
wolfSSL 0:9d17e4342598 7261 else
wolfSSL 0:9d17e4342598 7262 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 7263
wolfSSL 0:9d17e4342598 7264 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 7265 }
wolfSSL 0:9d17e4342598 7266
wolfSSL 0:9d17e4342598 7267
wolfSSL 0:9d17e4342598 7268 /* SSL_SUCCESS on ok */
wolfSSL 0:9d17e4342598 7269 int CyaSSL_EVP_DigestFinal(CYASSL_EVP_MD_CTX* ctx, unsigned char* md,
wolfSSL 0:9d17e4342598 7270 unsigned int* s)
wolfSSL 0:9d17e4342598 7271 {
wolfSSL 0:9d17e4342598 7272 CYASSL_ENTER("EVP_DigestFinal");
wolfSSL 0:9d17e4342598 7273 if (ctx->macType == MD5) {
wolfSSL 0:9d17e4342598 7274 CyaSSL_MD5_Final(md, (MD5_CTX*)&ctx->hash);
wolfSSL 0:9d17e4342598 7275 if (s) *s = MD5_DIGEST_SIZE;
wolfSSL 0:9d17e4342598 7276 }
wolfSSL 0:9d17e4342598 7277 else if (ctx->macType == SHA) {
wolfSSL 0:9d17e4342598 7278 CyaSSL_SHA_Final(md, (SHA_CTX*)&ctx->hash);
wolfSSL 0:9d17e4342598 7279 if (s) *s = SHA_DIGEST_SIZE;
wolfSSL 0:9d17e4342598 7280 }
wolfSSL 0:9d17e4342598 7281 else if (ctx->macType == SHA256) {
wolfSSL 0:9d17e4342598 7282 CyaSSL_SHA256_Final(md, (SHA256_CTX*)&ctx->hash);
wolfSSL 0:9d17e4342598 7283 if (s) *s = SHA256_DIGEST_SIZE;
wolfSSL 0:9d17e4342598 7284 }
wolfSSL 0:9d17e4342598 7285 #ifdef CYASSL_SHA384
wolfSSL 0:9d17e4342598 7286 else if (ctx->macType == SHA384) {
wolfSSL 0:9d17e4342598 7287 CyaSSL_SHA384_Final(md, (SHA384_CTX*)&ctx->hash);
wolfSSL 0:9d17e4342598 7288 if (s) *s = SHA384_DIGEST_SIZE;
wolfSSL 0:9d17e4342598 7289 }
wolfSSL 0:9d17e4342598 7290 #endif
wolfSSL 0:9d17e4342598 7291 #ifdef CYASSL_SHA512
wolfSSL 0:9d17e4342598 7292 else if (ctx->macType == SHA512) {
wolfSSL 0:9d17e4342598 7293 CyaSSL_SHA512_Final(md, (SHA512_CTX*)&ctx->hash);
wolfSSL 0:9d17e4342598 7294 if (s) *s = SHA512_DIGEST_SIZE;
wolfSSL 0:9d17e4342598 7295 }
wolfSSL 0:9d17e4342598 7296 #endif
wolfSSL 0:9d17e4342598 7297 else
wolfSSL 0:9d17e4342598 7298 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 7299
wolfSSL 0:9d17e4342598 7300 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 7301 }
wolfSSL 0:9d17e4342598 7302
wolfSSL 0:9d17e4342598 7303
wolfSSL 0:9d17e4342598 7304 /* SSL_SUCCESS on ok */
wolfSSL 0:9d17e4342598 7305 int CyaSSL_EVP_DigestFinal_ex(CYASSL_EVP_MD_CTX* ctx, unsigned char* md,
wolfSSL 0:9d17e4342598 7306 unsigned int* s)
wolfSSL 0:9d17e4342598 7307 {
wolfSSL 0:9d17e4342598 7308 CYASSL_ENTER("EVP_DigestFinal_ex");
wolfSSL 0:9d17e4342598 7309 return EVP_DigestFinal(ctx, md, s);
wolfSSL 0:9d17e4342598 7310 }
wolfSSL 0:9d17e4342598 7311
wolfSSL 0:9d17e4342598 7312
wolfSSL 0:9d17e4342598 7313 unsigned char* CyaSSL_HMAC(const CYASSL_EVP_MD* evp_md, const void* key,
wolfSSL 0:9d17e4342598 7314 int key_len, const unsigned char* d, int n,
wolfSSL 0:9d17e4342598 7315 unsigned char* md, unsigned int* md_len)
wolfSSL 0:9d17e4342598 7316 {
wolfSSL 0:9d17e4342598 7317 Hmac hmac;
wolfSSL 0:9d17e4342598 7318 int ret;
wolfSSL 0:9d17e4342598 7319
wolfSSL 0:9d17e4342598 7320 CYASSL_ENTER("HMAC");
wolfSSL 0:9d17e4342598 7321 if (!md) return NULL; /* no static buffer support */
wolfSSL 0:9d17e4342598 7322
wolfSSL 0:9d17e4342598 7323 if (XSTRNCMP(evp_md, "MD5", 3) == 0) {
wolfSSL 0:9d17e4342598 7324 ret = HmacSetKey(&hmac, MD5, (const byte*)key, key_len);
wolfSSL 0:9d17e4342598 7325 if (md_len) *md_len = MD5_DIGEST_SIZE;
wolfSSL 0:9d17e4342598 7326 }
wolfSSL 0:9d17e4342598 7327 else if (XSTRNCMP(evp_md, "SHA", 3) == 0) {
wolfSSL 0:9d17e4342598 7328 ret = HmacSetKey(&hmac, SHA, (const byte*)key, key_len);
wolfSSL 0:9d17e4342598 7329 if (md_len) *md_len = SHA_DIGEST_SIZE;
wolfSSL 0:9d17e4342598 7330 }
wolfSSL 0:9d17e4342598 7331 else
wolfSSL 0:9d17e4342598 7332 return NULL;
wolfSSL 0:9d17e4342598 7333
wolfSSL 0:9d17e4342598 7334 if (ret != 0)
wolfSSL 0:9d17e4342598 7335 return NULL;
wolfSSL 0:9d17e4342598 7336
wolfSSL 0:9d17e4342598 7337 HmacUpdate(&hmac, d, n);
wolfSSL 0:9d17e4342598 7338 HmacFinal(&hmac, md);
wolfSSL 0:9d17e4342598 7339
wolfSSL 0:9d17e4342598 7340 return md;
wolfSSL 0:9d17e4342598 7341 }
wolfSSL 0:9d17e4342598 7342
wolfSSL 0:9d17e4342598 7343 void CyaSSL_ERR_clear_error(void)
wolfSSL 0:9d17e4342598 7344 {
wolfSSL 0:9d17e4342598 7345 /* TODO: */
wolfSSL 0:9d17e4342598 7346 }
wolfSSL 0:9d17e4342598 7347
wolfSSL 0:9d17e4342598 7348
wolfSSL 0:9d17e4342598 7349 int CyaSSL_RAND_status(void)
wolfSSL 0:9d17e4342598 7350 {
wolfSSL 0:9d17e4342598 7351 return SSL_SUCCESS; /* CTaoCrypt provides enough seed internally */
wolfSSL 0:9d17e4342598 7352 }
wolfSSL 0:9d17e4342598 7353
wolfSSL 0:9d17e4342598 7354
wolfSSL 0:9d17e4342598 7355
wolfSSL 0:9d17e4342598 7356 void CyaSSL_RAND_add(const void* add, int len, double entropy)
wolfSSL 0:9d17e4342598 7357 {
wolfSSL 0:9d17e4342598 7358 (void)add;
wolfSSL 0:9d17e4342598 7359 (void)len;
wolfSSL 0:9d17e4342598 7360 (void)entropy;
wolfSSL 0:9d17e4342598 7361
wolfSSL 0:9d17e4342598 7362 /* CyaSSL seeds/adds internally, use explicit RNG if you want
wolfSSL 0:9d17e4342598 7363 to take control */
wolfSSL 0:9d17e4342598 7364 }
wolfSSL 0:9d17e4342598 7365
wolfSSL 0:9d17e4342598 7366
wolfSSL 0:9d17e4342598 7367 /* SSL_SUCCESS on ok */
wolfSSL 0:9d17e4342598 7368 int CyaSSL_DES_key_sched(CYASSL_const_DES_cblock* key,
wolfSSL 0:9d17e4342598 7369 CYASSL_DES_key_schedule* schedule)
wolfSSL 0:9d17e4342598 7370 {
wolfSSL 0:9d17e4342598 7371 CYASSL_ENTER("DES_key_sched");
wolfSSL 0:9d17e4342598 7372 XMEMCPY(schedule, key, sizeof(const_DES_cblock));
wolfSSL 0:9d17e4342598 7373 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 7374 }
wolfSSL 0:9d17e4342598 7375
wolfSSL 0:9d17e4342598 7376
wolfSSL 0:9d17e4342598 7377 void CyaSSL_DES_cbc_encrypt(const unsigned char* input,
wolfSSL 0:9d17e4342598 7378 unsigned char* output, long length,
wolfSSL 0:9d17e4342598 7379 CYASSL_DES_key_schedule* schedule, CYASSL_DES_cblock* ivec,
wolfSSL 0:9d17e4342598 7380 int enc)
wolfSSL 0:9d17e4342598 7381 {
wolfSSL 0:9d17e4342598 7382 Des myDes;
wolfSSL 0:9d17e4342598 7383
wolfSSL 0:9d17e4342598 7384 CYASSL_ENTER("DES_cbc_encrypt");
wolfSSL 0:9d17e4342598 7385
wolfSSL 0:9d17e4342598 7386 /* OpenSSL compat, no ret */
wolfSSL 0:9d17e4342598 7387 Des_SetKey(&myDes, (const byte*)schedule, (const byte*)ivec, !enc);
wolfSSL 0:9d17e4342598 7388
wolfSSL 0:9d17e4342598 7389 if (enc)
wolfSSL 0:9d17e4342598 7390 Des_CbcEncrypt(&myDes, output, input, (word32)length);
wolfSSL 0:9d17e4342598 7391 else
wolfSSL 0:9d17e4342598 7392 Des_CbcDecrypt(&myDes, output, input, (word32)length);
wolfSSL 0:9d17e4342598 7393 }
wolfSSL 0:9d17e4342598 7394
wolfSSL 0:9d17e4342598 7395
wolfSSL 0:9d17e4342598 7396 /* correctly sets ivec for next call */
wolfSSL 0:9d17e4342598 7397 void CyaSSL_DES_ncbc_encrypt(const unsigned char* input,
wolfSSL 0:9d17e4342598 7398 unsigned char* output, long length,
wolfSSL 0:9d17e4342598 7399 CYASSL_DES_key_schedule* schedule, CYASSL_DES_cblock* ivec,
wolfSSL 0:9d17e4342598 7400 int enc)
wolfSSL 0:9d17e4342598 7401 {
wolfSSL 0:9d17e4342598 7402 Des myDes;
wolfSSL 0:9d17e4342598 7403
wolfSSL 0:9d17e4342598 7404 CYASSL_ENTER("DES_ncbc_encrypt");
wolfSSL 0:9d17e4342598 7405
wolfSSL 0:9d17e4342598 7406 /* OpenSSL compat, no ret */
wolfSSL 0:9d17e4342598 7407 Des_SetKey(&myDes, (const byte*)schedule, (const byte*)ivec, !enc);
wolfSSL 0:9d17e4342598 7408
wolfSSL 0:9d17e4342598 7409 if (enc)
wolfSSL 0:9d17e4342598 7410 Des_CbcEncrypt(&myDes, output, input, (word32)length);
wolfSSL 0:9d17e4342598 7411 else
wolfSSL 0:9d17e4342598 7412 Des_CbcDecrypt(&myDes, output, input, (word32)length);
wolfSSL 0:9d17e4342598 7413
wolfSSL 0:9d17e4342598 7414 XMEMCPY(ivec, output + length - sizeof(DES_cblock), sizeof(DES_cblock));
wolfSSL 0:9d17e4342598 7415 }
wolfSSL 0:9d17e4342598 7416
wolfSSL 0:9d17e4342598 7417
wolfSSL 0:9d17e4342598 7418 void CyaSSL_ERR_free_strings(void)
wolfSSL 0:9d17e4342598 7419 {
wolfSSL 0:9d17e4342598 7420 /* handled internally */
wolfSSL 0:9d17e4342598 7421 }
wolfSSL 0:9d17e4342598 7422
wolfSSL 0:9d17e4342598 7423
wolfSSL 0:9d17e4342598 7424 void CyaSSL_ERR_remove_state(unsigned long state)
wolfSSL 0:9d17e4342598 7425 {
wolfSSL 0:9d17e4342598 7426 /* TODO: GetErrors().Remove(); */
wolfSSL 0:9d17e4342598 7427 (void)state;
wolfSSL 0:9d17e4342598 7428 }
wolfSSL 0:9d17e4342598 7429
wolfSSL 0:9d17e4342598 7430
wolfSSL 0:9d17e4342598 7431 void CyaSSL_EVP_cleanup(void)
wolfSSL 0:9d17e4342598 7432 {
wolfSSL 0:9d17e4342598 7433 /* nothing to do here */
wolfSSL 0:9d17e4342598 7434 }
wolfSSL 0:9d17e4342598 7435
wolfSSL 0:9d17e4342598 7436
wolfSSL 0:9d17e4342598 7437 void CyaSSL_cleanup_all_ex_data(void)
wolfSSL 0:9d17e4342598 7438 {
wolfSSL 0:9d17e4342598 7439 /* nothing to do here */
wolfSSL 0:9d17e4342598 7440 }
wolfSSL 0:9d17e4342598 7441
wolfSSL 0:9d17e4342598 7442
wolfSSL 0:9d17e4342598 7443 long CyaSSL_CTX_set_mode(CYASSL_CTX* ctx, long mode)
wolfSSL 0:9d17e4342598 7444 {
wolfSSL 0:9d17e4342598 7445 /* SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER is CyaSSL default mode */
wolfSSL 0:9d17e4342598 7446
wolfSSL 0:9d17e4342598 7447 CYASSL_ENTER("SSL_CTX_set_mode");
wolfSSL 0:9d17e4342598 7448 if (mode == SSL_MODE_ENABLE_PARTIAL_WRITE)
wolfSSL 0:9d17e4342598 7449 ctx->partialWrite = 1;
wolfSSL 0:9d17e4342598 7450
wolfSSL 0:9d17e4342598 7451 return mode;
wolfSSL 0:9d17e4342598 7452 }
wolfSSL 0:9d17e4342598 7453
wolfSSL 0:9d17e4342598 7454
wolfSSL 0:9d17e4342598 7455 long CyaSSL_CTX_get_mode(CYASSL_CTX* ctx)
wolfSSL 0:9d17e4342598 7456 {
wolfSSL 0:9d17e4342598 7457 /* TODO: */
wolfSSL 0:9d17e4342598 7458 (void)ctx;
wolfSSL 0:9d17e4342598 7459 return 0;
wolfSSL 0:9d17e4342598 7460 }
wolfSSL 0:9d17e4342598 7461
wolfSSL 0:9d17e4342598 7462
wolfSSL 0:9d17e4342598 7463 void CyaSSL_CTX_set_default_read_ahead(CYASSL_CTX* ctx, int m)
wolfSSL 0:9d17e4342598 7464 {
wolfSSL 0:9d17e4342598 7465 /* TODO: maybe? */
wolfSSL 0:9d17e4342598 7466 (void)ctx;
wolfSSL 0:9d17e4342598 7467 (void)m;
wolfSSL 0:9d17e4342598 7468 }
wolfSSL 0:9d17e4342598 7469
wolfSSL 0:9d17e4342598 7470
wolfSSL 0:9d17e4342598 7471 int CyaSSL_CTX_set_session_id_context(CYASSL_CTX* ctx,
wolfSSL 0:9d17e4342598 7472 const unsigned char* sid_ctx,
wolfSSL 0:9d17e4342598 7473 unsigned int sid_ctx_len)
wolfSSL 0:9d17e4342598 7474 {
wolfSSL 0:9d17e4342598 7475 /* No application specific context needed for cyaSSL */
wolfSSL 0:9d17e4342598 7476 (void)ctx;
wolfSSL 0:9d17e4342598 7477 (void)sid_ctx;
wolfSSL 0:9d17e4342598 7478 (void)sid_ctx_len;
wolfSSL 0:9d17e4342598 7479 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 7480 }
wolfSSL 0:9d17e4342598 7481
wolfSSL 0:9d17e4342598 7482
wolfSSL 0:9d17e4342598 7483 long CyaSSL_CTX_sess_get_cache_size(CYASSL_CTX* ctx)
wolfSSL 0:9d17e4342598 7484 {
wolfSSL 0:9d17e4342598 7485 /* TODO: maybe? */
wolfSSL 0:9d17e4342598 7486 (void)ctx;
wolfSSL 0:9d17e4342598 7487 return (~0);
wolfSSL 0:9d17e4342598 7488 }
wolfSSL 0:9d17e4342598 7489
wolfSSL 0:9d17e4342598 7490 unsigned long CyaSSL_ERR_get_error_line_data(const char** file, int* line,
wolfSSL 0:9d17e4342598 7491 const char** data, int *flags)
wolfSSL 0:9d17e4342598 7492 {
wolfSSL 0:9d17e4342598 7493 /* Not implemented */
wolfSSL 0:9d17e4342598 7494 (void)file;
wolfSSL 0:9d17e4342598 7495 (void)line;
wolfSSL 0:9d17e4342598 7496 (void)data;
wolfSSL 0:9d17e4342598 7497 (void)flags;
wolfSSL 0:9d17e4342598 7498 return 0;
wolfSSL 0:9d17e4342598 7499 }
wolfSSL 0:9d17e4342598 7500
wolfSSL 0:9d17e4342598 7501 #endif /* OPENSSL_EXTRA */
wolfSSL 0:9d17e4342598 7502
wolfSSL 0:9d17e4342598 7503
wolfSSL 0:9d17e4342598 7504 #if defined(KEEP_PEER_CERT)
wolfSSL 0:9d17e4342598 7505
wolfSSL 0:9d17e4342598 7506 CYASSL_X509* CyaSSL_get_peer_certificate(CYASSL* ssl)
wolfSSL 0:9d17e4342598 7507 {
wolfSSL 0:9d17e4342598 7508 CYASSL_ENTER("SSL_get_peer_certificate");
wolfSSL 0:9d17e4342598 7509 if (ssl->peerCert.issuer.sz)
wolfSSL 0:9d17e4342598 7510 return &ssl->peerCert;
wolfSSL 0:9d17e4342598 7511 else
wolfSSL 0:9d17e4342598 7512 return 0;
wolfSSL 0:9d17e4342598 7513 }
wolfSSL 0:9d17e4342598 7514
wolfSSL 0:9d17e4342598 7515 #endif /* KEEP_PEER_CERT */
wolfSSL 0:9d17e4342598 7516
wolfSSL 0:9d17e4342598 7517
wolfSSL 0:9d17e4342598 7518 #if defined(KEEP_PEER_CERT) || defined(SESSION_CERTS)
wolfSSL 0:9d17e4342598 7519
wolfSSL 0:9d17e4342598 7520 void CyaSSL_FreeX509(CYASSL_X509* x509)
wolfSSL 0:9d17e4342598 7521 {
wolfSSL 0:9d17e4342598 7522 CYASSL_ENTER("CyaSSL_FreeX509");
wolfSSL 0:9d17e4342598 7523 FreeX509(x509);
wolfSSL 0:9d17e4342598 7524 }
wolfSSL 0:9d17e4342598 7525
wolfSSL 0:9d17e4342598 7526
wolfSSL 0:9d17e4342598 7527 /* return the next, if any, altname from the peer cert */
wolfSSL 0:9d17e4342598 7528 char* CyaSSL_X509_get_next_altname(CYASSL_X509* cert)
wolfSSL 0:9d17e4342598 7529 {
wolfSSL 0:9d17e4342598 7530 char* ret = NULL;
wolfSSL 0:9d17e4342598 7531 CYASSL_ENTER("CyaSSL_X509_get_next_altname");
wolfSSL 0:9d17e4342598 7532
wolfSSL 0:9d17e4342598 7533 /* don't have any to work with */
wolfSSL 0:9d17e4342598 7534 if (cert == NULL || cert->altNames == NULL)
wolfSSL 0:9d17e4342598 7535 return NULL;
wolfSSL 0:9d17e4342598 7536
wolfSSL 0:9d17e4342598 7537 /* already went through them */
wolfSSL 0:9d17e4342598 7538 if (cert->altNamesNext == NULL)
wolfSSL 0:9d17e4342598 7539 return NULL;
wolfSSL 0:9d17e4342598 7540
wolfSSL 0:9d17e4342598 7541 ret = cert->altNamesNext->name;
wolfSSL 0:9d17e4342598 7542 cert->altNamesNext = cert->altNamesNext->next;
wolfSSL 0:9d17e4342598 7543
wolfSSL 0:9d17e4342598 7544 return ret;
wolfSSL 0:9d17e4342598 7545 }
wolfSSL 0:9d17e4342598 7546
wolfSSL 0:9d17e4342598 7547
wolfSSL 0:9d17e4342598 7548 CYASSL_X509_NAME* CyaSSL_X509_get_issuer_name(CYASSL_X509* cert)
wolfSSL 0:9d17e4342598 7549 {
wolfSSL 0:9d17e4342598 7550 CYASSL_ENTER("X509_get_issuer_name");
wolfSSL 0:9d17e4342598 7551 return &cert->issuer;
wolfSSL 0:9d17e4342598 7552 }
wolfSSL 0:9d17e4342598 7553
wolfSSL 0:9d17e4342598 7554
wolfSSL 0:9d17e4342598 7555 CYASSL_X509_NAME* CyaSSL_X509_get_subject_name(CYASSL_X509* cert)
wolfSSL 0:9d17e4342598 7556 {
wolfSSL 0:9d17e4342598 7557 CYASSL_ENTER("X509_get_subject_name");
wolfSSL 0:9d17e4342598 7558 return &cert->subject;
wolfSSL 0:9d17e4342598 7559 }
wolfSSL 0:9d17e4342598 7560
wolfSSL 0:9d17e4342598 7561
wolfSSL 0:9d17e4342598 7562 int CyaSSL_X509_get_isCA(CYASSL_X509* x509)
wolfSSL 0:9d17e4342598 7563 {
wolfSSL 0:9d17e4342598 7564 int isCA = 0;
wolfSSL 0:9d17e4342598 7565
wolfSSL 0:9d17e4342598 7566 CYASSL_ENTER("CyaSSL_X509_get_isCA");
wolfSSL 0:9d17e4342598 7567
wolfSSL 0:9d17e4342598 7568 if (x509 != NULL)
wolfSSL 0:9d17e4342598 7569 isCA = x509->isCa;
wolfSSL 0:9d17e4342598 7570
wolfSSL 0:9d17e4342598 7571 CYASSL_LEAVE("CyaSSL_X509_get_isCA", isCA);
wolfSSL 0:9d17e4342598 7572
wolfSSL 0:9d17e4342598 7573 return isCA;
wolfSSL 0:9d17e4342598 7574 }
wolfSSL 0:9d17e4342598 7575
wolfSSL 0:9d17e4342598 7576
wolfSSL 0:9d17e4342598 7577 #ifdef OPENSSL_EXTRA
wolfSSL 0:9d17e4342598 7578 int CyaSSL_X509_ext_isSet_by_NID(CYASSL_X509* x509, int nid)
wolfSSL 0:9d17e4342598 7579 {
wolfSSL 0:9d17e4342598 7580 int isSet = 0;
wolfSSL 0:9d17e4342598 7581
wolfSSL 0:9d17e4342598 7582 CYASSL_ENTER("CyaSSL_X509_ext_isSet_by_NID");
wolfSSL 0:9d17e4342598 7583
wolfSSL 0:9d17e4342598 7584 if (x509 != NULL) {
wolfSSL 0:9d17e4342598 7585 switch (nid) {
wolfSSL 0:9d17e4342598 7586 case BASIC_CA_OID: isSet = x509->basicConstSet; break;
wolfSSL 0:9d17e4342598 7587 case ALT_NAMES_OID: isSet = x509->subjAltNameSet; break;
wolfSSL 0:9d17e4342598 7588 case AUTH_KEY_OID: isSet = x509->authKeyIdSet; break;
wolfSSL 0:9d17e4342598 7589 case SUBJ_KEY_OID: isSet = x509->subjKeyIdSet; break;
wolfSSL 0:9d17e4342598 7590 case KEY_USAGE_OID: isSet = x509->keyUsageSet; break;
wolfSSL 0:9d17e4342598 7591 #ifdef CYASSL_SEP
wolfSSL 0:9d17e4342598 7592 case CERT_POLICY_OID: isSet = x509->certPolicySet; break;
wolfSSL 0:9d17e4342598 7593 #endif /* CYASSL_SEP */
wolfSSL 0:9d17e4342598 7594 }
wolfSSL 0:9d17e4342598 7595 }
wolfSSL 0:9d17e4342598 7596
wolfSSL 0:9d17e4342598 7597 CYASSL_LEAVE("CyaSSL_X509_ext_isSet_by_NID", isSet);
wolfSSL 0:9d17e4342598 7598
wolfSSL 0:9d17e4342598 7599 return isSet;
wolfSSL 0:9d17e4342598 7600 }
wolfSSL 0:9d17e4342598 7601
wolfSSL 0:9d17e4342598 7602
wolfSSL 0:9d17e4342598 7603 int CyaSSL_X509_ext_get_critical_by_NID(CYASSL_X509* x509, int nid)
wolfSSL 0:9d17e4342598 7604 {
wolfSSL 0:9d17e4342598 7605 int crit = 0;
wolfSSL 0:9d17e4342598 7606
wolfSSL 0:9d17e4342598 7607 CYASSL_ENTER("CyaSSL_X509_ext_get_critical_by_NID");
wolfSSL 0:9d17e4342598 7608
wolfSSL 0:9d17e4342598 7609 if (x509 != NULL) {
wolfSSL 0:9d17e4342598 7610 switch (nid) {
wolfSSL 0:9d17e4342598 7611 case BASIC_CA_OID: crit = x509->basicConstCrit; break;
wolfSSL 0:9d17e4342598 7612 case ALT_NAMES_OID: crit = x509->subjAltNameCrit; break;
wolfSSL 0:9d17e4342598 7613 case AUTH_KEY_OID: crit = x509->authKeyIdCrit; break;
wolfSSL 0:9d17e4342598 7614 case SUBJ_KEY_OID: crit = x509->subjKeyIdCrit; break;
wolfSSL 0:9d17e4342598 7615 case KEY_USAGE_OID: crit = x509->keyUsageCrit; break;
wolfSSL 0:9d17e4342598 7616 #ifdef CYASSL_SEP
wolfSSL 0:9d17e4342598 7617 case CERT_POLICY_OID: crit = x509->certPolicyCrit; break;
wolfSSL 0:9d17e4342598 7618 #endif /* CYASSL_SEP */
wolfSSL 0:9d17e4342598 7619 }
wolfSSL 0:9d17e4342598 7620 }
wolfSSL 0:9d17e4342598 7621
wolfSSL 0:9d17e4342598 7622 CYASSL_LEAVE("CyaSSL_X509_ext_get_critical_by_NID", crit);
wolfSSL 0:9d17e4342598 7623
wolfSSL 0:9d17e4342598 7624 return crit;
wolfSSL 0:9d17e4342598 7625 }
wolfSSL 0:9d17e4342598 7626
wolfSSL 0:9d17e4342598 7627
wolfSSL 0:9d17e4342598 7628 int CyaSSL_X509_get_isSet_pathLength(CYASSL_X509* x509)
wolfSSL 0:9d17e4342598 7629 {
wolfSSL 0:9d17e4342598 7630 int isSet = 0;
wolfSSL 0:9d17e4342598 7631
wolfSSL 0:9d17e4342598 7632 CYASSL_ENTER("CyaSSL_X509_get_isSet_pathLength");
wolfSSL 0:9d17e4342598 7633
wolfSSL 0:9d17e4342598 7634 if (x509 != NULL)
wolfSSL 0:9d17e4342598 7635 isSet = x509->basicConstPlSet;
wolfSSL 0:9d17e4342598 7636
wolfSSL 0:9d17e4342598 7637 CYASSL_LEAVE("CyaSSL_X509_get_isSet_pathLength", isSet);
wolfSSL 0:9d17e4342598 7638
wolfSSL 0:9d17e4342598 7639 return isSet;
wolfSSL 0:9d17e4342598 7640 }
wolfSSL 0:9d17e4342598 7641
wolfSSL 0:9d17e4342598 7642
wolfSSL 0:9d17e4342598 7643 word32 CyaSSL_X509_get_pathLength(CYASSL_X509* x509)
wolfSSL 0:9d17e4342598 7644 {
wolfSSL 0:9d17e4342598 7645 word32 pathLength = 0;
wolfSSL 0:9d17e4342598 7646
wolfSSL 0:9d17e4342598 7647 CYASSL_ENTER("CyaSSL_X509_get_pathLength");
wolfSSL 0:9d17e4342598 7648
wolfSSL 0:9d17e4342598 7649 if (x509 != NULL)
wolfSSL 0:9d17e4342598 7650 pathLength = x509->pathLength;
wolfSSL 0:9d17e4342598 7651
wolfSSL 0:9d17e4342598 7652 CYASSL_LEAVE("CyaSSL_X509_get_pathLength", pathLength);
wolfSSL 0:9d17e4342598 7653
wolfSSL 0:9d17e4342598 7654 return pathLength;
wolfSSL 0:9d17e4342598 7655 }
wolfSSL 0:9d17e4342598 7656
wolfSSL 0:9d17e4342598 7657
wolfSSL 0:9d17e4342598 7658 unsigned int CyaSSL_X509_get_keyUsage(CYASSL_X509* x509)
wolfSSL 0:9d17e4342598 7659 {
wolfSSL 0:9d17e4342598 7660 word16 usage = 0;
wolfSSL 0:9d17e4342598 7661
wolfSSL 0:9d17e4342598 7662 CYASSL_ENTER("CyaSSL_X509_get_keyUsage");
wolfSSL 0:9d17e4342598 7663
wolfSSL 0:9d17e4342598 7664 if (x509 != NULL)
wolfSSL 0:9d17e4342598 7665 usage = x509->keyUsage;
wolfSSL 0:9d17e4342598 7666
wolfSSL 0:9d17e4342598 7667 CYASSL_LEAVE("CyaSSL_X509_get_keyUsage", usage);
wolfSSL 0:9d17e4342598 7668
wolfSSL 0:9d17e4342598 7669 return usage;
wolfSSL 0:9d17e4342598 7670 }
wolfSSL 0:9d17e4342598 7671
wolfSSL 0:9d17e4342598 7672
wolfSSL 0:9d17e4342598 7673 byte* CyaSSL_X509_get_authorityKeyID(
wolfSSL 0:9d17e4342598 7674 CYASSL_X509* x509, byte* dst, int* dstLen)
wolfSSL 0:9d17e4342598 7675 {
wolfSSL 0:9d17e4342598 7676 byte *id = NULL;
wolfSSL 0:9d17e4342598 7677 int copySz = 0;
wolfSSL 0:9d17e4342598 7678
wolfSSL 0:9d17e4342598 7679 CYASSL_ENTER("CyaSSL_X509_get_authorityKeyID");
wolfSSL 0:9d17e4342598 7680
wolfSSL 0:9d17e4342598 7681 if (x509 != NULL) {
wolfSSL 0:9d17e4342598 7682 if (x509->authKeyIdSet) {
wolfSSL 0:9d17e4342598 7683 copySz = min(dstLen != NULL ? *dstLen : 0,
wolfSSL 0:9d17e4342598 7684 (int)x509->authKeyIdSz);
wolfSSL 0:9d17e4342598 7685 id = x509->authKeyId;
wolfSSL 0:9d17e4342598 7686 }
wolfSSL 0:9d17e4342598 7687
wolfSSL 0:9d17e4342598 7688 if (dst != NULL && dstLen != NULL && id != NULL && copySz > 0) {
wolfSSL 0:9d17e4342598 7689 XMEMCPY(dst, id, copySz);
wolfSSL 0:9d17e4342598 7690 id = dst;
wolfSSL 0:9d17e4342598 7691 *dstLen = copySz;
wolfSSL 0:9d17e4342598 7692 }
wolfSSL 0:9d17e4342598 7693 }
wolfSSL 0:9d17e4342598 7694
wolfSSL 0:9d17e4342598 7695 CYASSL_LEAVE("CyaSSL_X509_get_authorityKeyID", copySz);
wolfSSL 0:9d17e4342598 7696
wolfSSL 0:9d17e4342598 7697 return id;
wolfSSL 0:9d17e4342598 7698 }
wolfSSL 0:9d17e4342598 7699
wolfSSL 0:9d17e4342598 7700
wolfSSL 0:9d17e4342598 7701 byte* CyaSSL_X509_get_subjectKeyID(
wolfSSL 0:9d17e4342598 7702 CYASSL_X509* x509, byte* dst, int* dstLen)
wolfSSL 0:9d17e4342598 7703 {
wolfSSL 0:9d17e4342598 7704 byte *id = NULL;
wolfSSL 0:9d17e4342598 7705 int copySz = 0;
wolfSSL 0:9d17e4342598 7706
wolfSSL 0:9d17e4342598 7707 CYASSL_ENTER("CyaSSL_X509_get_subjectKeyID");
wolfSSL 0:9d17e4342598 7708
wolfSSL 0:9d17e4342598 7709 if (x509 != NULL) {
wolfSSL 0:9d17e4342598 7710 if (x509->subjKeyIdSet) {
wolfSSL 0:9d17e4342598 7711 copySz = min(dstLen != NULL ? *dstLen : 0,
wolfSSL 0:9d17e4342598 7712 (int)x509->subjKeyIdSz);
wolfSSL 0:9d17e4342598 7713 id = x509->subjKeyId;
wolfSSL 0:9d17e4342598 7714 }
wolfSSL 0:9d17e4342598 7715
wolfSSL 0:9d17e4342598 7716 if (dst != NULL && dstLen != NULL && id != NULL && copySz > 0) {
wolfSSL 0:9d17e4342598 7717 XMEMCPY(dst, id, copySz);
wolfSSL 0:9d17e4342598 7718 id = dst;
wolfSSL 0:9d17e4342598 7719 *dstLen = copySz;
wolfSSL 0:9d17e4342598 7720 }
wolfSSL 0:9d17e4342598 7721 }
wolfSSL 0:9d17e4342598 7722
wolfSSL 0:9d17e4342598 7723 CYASSL_LEAVE("CyaSSL_X509_get_subjectKeyID", copySz);
wolfSSL 0:9d17e4342598 7724
wolfSSL 0:9d17e4342598 7725 return id;
wolfSSL 0:9d17e4342598 7726 }
wolfSSL 0:9d17e4342598 7727
wolfSSL 0:9d17e4342598 7728
wolfSSL 0:9d17e4342598 7729 int CyaSSL_X509_NAME_entry_count(CYASSL_X509_NAME* name)
wolfSSL 0:9d17e4342598 7730 {
wolfSSL 0:9d17e4342598 7731 int count = 0;
wolfSSL 0:9d17e4342598 7732
wolfSSL 0:9d17e4342598 7733 CYASSL_ENTER("CyaSSL_X509_NAME_entry_count");
wolfSSL 0:9d17e4342598 7734
wolfSSL 0:9d17e4342598 7735 if (name != NULL)
wolfSSL 0:9d17e4342598 7736 count = name->fullName.entryCount;
wolfSSL 0:9d17e4342598 7737
wolfSSL 0:9d17e4342598 7738 CYASSL_LEAVE("CyaSSL_X509_NAME_entry_count", count);
wolfSSL 0:9d17e4342598 7739 return count;
wolfSSL 0:9d17e4342598 7740 }
wolfSSL 0:9d17e4342598 7741
wolfSSL 0:9d17e4342598 7742
wolfSSL 0:9d17e4342598 7743 int CyaSSL_X509_NAME_get_text_by_NID(CYASSL_X509_NAME* name,
wolfSSL 0:9d17e4342598 7744 int nid, char* buf, int len)
wolfSSL 0:9d17e4342598 7745 {
wolfSSL 0:9d17e4342598 7746 char *text = NULL;
wolfSSL 0:9d17e4342598 7747 int textSz = 0;
wolfSSL 0:9d17e4342598 7748
wolfSSL 0:9d17e4342598 7749 CYASSL_ENTER("CyaSSL_X509_NAME_get_text_by_NID");
wolfSSL 0:9d17e4342598 7750
wolfSSL 0:9d17e4342598 7751 switch (nid) {
wolfSSL 0:9d17e4342598 7752 case ASN_COMMON_NAME:
wolfSSL 0:9d17e4342598 7753 text = name->fullName.fullName + name->fullName.cnIdx;
wolfSSL 0:9d17e4342598 7754 textSz = name->fullName.cnLen;
wolfSSL 0:9d17e4342598 7755 break;
wolfSSL 0:9d17e4342598 7756 case ASN_SUR_NAME:
wolfSSL 0:9d17e4342598 7757 text = name->fullName.fullName + name->fullName.snIdx;
wolfSSL 0:9d17e4342598 7758 textSz = name->fullName.snLen;
wolfSSL 0:9d17e4342598 7759 break;
wolfSSL 0:9d17e4342598 7760 case ASN_SERIAL_NUMBER:
wolfSSL 0:9d17e4342598 7761 text = name->fullName.fullName + name->fullName.serialIdx;
wolfSSL 0:9d17e4342598 7762 textSz = name->fullName.serialLen;
wolfSSL 0:9d17e4342598 7763 break;
wolfSSL 0:9d17e4342598 7764 case ASN_COUNTRY_NAME:
wolfSSL 0:9d17e4342598 7765 text = name->fullName.fullName + name->fullName.cIdx;
wolfSSL 0:9d17e4342598 7766 textSz = name->fullName.cLen;
wolfSSL 0:9d17e4342598 7767 break;
wolfSSL 0:9d17e4342598 7768 case ASN_LOCALITY_NAME:
wolfSSL 0:9d17e4342598 7769 text = name->fullName.fullName + name->fullName.lIdx;
wolfSSL 0:9d17e4342598 7770 textSz = name->fullName.lLen;
wolfSSL 0:9d17e4342598 7771 break;
wolfSSL 0:9d17e4342598 7772 case ASN_STATE_NAME:
wolfSSL 0:9d17e4342598 7773 text = name->fullName.fullName + name->fullName.stIdx;
wolfSSL 0:9d17e4342598 7774 textSz = name->fullName.stLen;
wolfSSL 0:9d17e4342598 7775 break;
wolfSSL 0:9d17e4342598 7776 case ASN_ORG_NAME:
wolfSSL 0:9d17e4342598 7777 text = name->fullName.fullName + name->fullName.oIdx;
wolfSSL 0:9d17e4342598 7778 textSz = name->fullName.oLen;
wolfSSL 0:9d17e4342598 7779 break;
wolfSSL 0:9d17e4342598 7780 case ASN_ORGUNIT_NAME:
wolfSSL 0:9d17e4342598 7781 text = name->fullName.fullName + name->fullName.ouIdx;
wolfSSL 0:9d17e4342598 7782 textSz = name->fullName.ouLen;
wolfSSL 0:9d17e4342598 7783 break;
wolfSSL 0:9d17e4342598 7784 default:
wolfSSL 0:9d17e4342598 7785 break;
wolfSSL 0:9d17e4342598 7786 }
wolfSSL 0:9d17e4342598 7787
wolfSSL 0:9d17e4342598 7788 if (buf != NULL) {
wolfSSL 0:9d17e4342598 7789 textSz = min(textSz, len);
wolfSSL 0:9d17e4342598 7790 XMEMCPY(buf, text, textSz);
wolfSSL 0:9d17e4342598 7791 buf[textSz] = '\0';
wolfSSL 0:9d17e4342598 7792 }
wolfSSL 0:9d17e4342598 7793
wolfSSL 0:9d17e4342598 7794 CYASSL_LEAVE("CyaSSL_X509_NAME_get_text_by_NID", textSz);
wolfSSL 0:9d17e4342598 7795 return textSz;
wolfSSL 0:9d17e4342598 7796 }
wolfSSL 0:9d17e4342598 7797 #endif
wolfSSL 0:9d17e4342598 7798
wolfSSL 0:9d17e4342598 7799
wolfSSL 0:9d17e4342598 7800 /* copy name into in buffer, at most sz bytes, if buffer is null will
wolfSSL 0:9d17e4342598 7801 malloc buffer, call responsible for freeing */
wolfSSL 0:9d17e4342598 7802 char* CyaSSL_X509_NAME_oneline(CYASSL_X509_NAME* name, char* in, int sz)
wolfSSL 0:9d17e4342598 7803 {
wolfSSL 0:9d17e4342598 7804 int copySz = min(sz, name->sz);
wolfSSL 0:9d17e4342598 7805
wolfSSL 0:9d17e4342598 7806 CYASSL_ENTER("CyaSSL_X509_NAME_oneline");
wolfSSL 0:9d17e4342598 7807 if (!name->sz) return in;
wolfSSL 0:9d17e4342598 7808
wolfSSL 0:9d17e4342598 7809 if (!in) {
wolfSSL 0:9d17e4342598 7810 in = (char*)XMALLOC(name->sz, 0, DYNAMIC_TYPE_OPENSSL);
wolfSSL 0:9d17e4342598 7811 if (!in ) return in;
wolfSSL 0:9d17e4342598 7812 copySz = name->sz;
wolfSSL 0:9d17e4342598 7813 }
wolfSSL 0:9d17e4342598 7814
wolfSSL 0:9d17e4342598 7815 if (copySz == 0)
wolfSSL 0:9d17e4342598 7816 return in;
wolfSSL 0:9d17e4342598 7817
wolfSSL 0:9d17e4342598 7818 XMEMCPY(in, name->name, copySz - 1);
wolfSSL 0:9d17e4342598 7819 in[copySz - 1] = 0;
wolfSSL 0:9d17e4342598 7820
wolfSSL 0:9d17e4342598 7821 return in;
wolfSSL 0:9d17e4342598 7822 }
wolfSSL 0:9d17e4342598 7823
wolfSSL 0:9d17e4342598 7824
wolfSSL 0:9d17e4342598 7825 int CyaSSL_X509_get_signature_type(CYASSL_X509* x509)
wolfSSL 0:9d17e4342598 7826 {
wolfSSL 0:9d17e4342598 7827 int type = 0;
wolfSSL 0:9d17e4342598 7828
wolfSSL 0:9d17e4342598 7829 CYASSL_ENTER("CyaSSL_X509_get_signature_type");
wolfSSL 0:9d17e4342598 7830
wolfSSL 0:9d17e4342598 7831 if (x509 != NULL)
wolfSSL 0:9d17e4342598 7832 type = x509->sigOID;
wolfSSL 0:9d17e4342598 7833
wolfSSL 0:9d17e4342598 7834 return type;
wolfSSL 0:9d17e4342598 7835 }
wolfSSL 0:9d17e4342598 7836
wolfSSL 0:9d17e4342598 7837
wolfSSL 0:9d17e4342598 7838 int CyaSSL_X509_get_signature(CYASSL_X509* x509,
wolfSSL 0:9d17e4342598 7839 unsigned char* buf, int* bufSz)
wolfSSL 0:9d17e4342598 7840 {
wolfSSL 0:9d17e4342598 7841 CYASSL_ENTER("CyaSSL_X509_get_signature");
wolfSSL 0:9d17e4342598 7842 if (x509 == NULL || bufSz == NULL || *bufSz < (int)x509->sig.length)
wolfSSL 0:9d17e4342598 7843 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 7844
wolfSSL 0:9d17e4342598 7845 if (buf != NULL)
wolfSSL 0:9d17e4342598 7846 XMEMCPY(buf, x509->sig.buffer, x509->sig.length);
wolfSSL 0:9d17e4342598 7847 *bufSz = x509->sig.length;
wolfSSL 0:9d17e4342598 7848
wolfSSL 0:9d17e4342598 7849 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 7850 }
wolfSSL 0:9d17e4342598 7851
wolfSSL 0:9d17e4342598 7852
wolfSSL 0:9d17e4342598 7853 /* write X509 serial number in unsigned binary to buffer
wolfSSL 0:9d17e4342598 7854 buffer needs to be at least EXTERNAL_SERIAL_SIZE (32) for all cases
wolfSSL 0:9d17e4342598 7855 return SSL_SUCCESS on success */
wolfSSL 0:9d17e4342598 7856 int CyaSSL_X509_get_serial_number(CYASSL_X509* x509, byte* in, int* inOutSz)
wolfSSL 0:9d17e4342598 7857 {
wolfSSL 0:9d17e4342598 7858 CYASSL_ENTER("CyaSSL_X509_get_serial_number");
wolfSSL 0:9d17e4342598 7859 if (x509 == NULL || in == NULL ||
wolfSSL 0:9d17e4342598 7860 inOutSz == NULL || *inOutSz < x509->serialSz)
wolfSSL 0:9d17e4342598 7861 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 7862
wolfSSL 0:9d17e4342598 7863 XMEMCPY(in, x509->serial, x509->serialSz);
wolfSSL 0:9d17e4342598 7864 *inOutSz = x509->serialSz;
wolfSSL 0:9d17e4342598 7865
wolfSSL 0:9d17e4342598 7866 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 7867 }
wolfSSL 0:9d17e4342598 7868
wolfSSL 0:9d17e4342598 7869
wolfSSL 0:9d17e4342598 7870 const byte* CyaSSL_X509_get_der(CYASSL_X509* x509, int* outSz)
wolfSSL 0:9d17e4342598 7871 {
wolfSSL 0:9d17e4342598 7872 CYASSL_ENTER("CyaSSL_X509_get_der");
wolfSSL 0:9d17e4342598 7873
wolfSSL 0:9d17e4342598 7874 if (x509 == NULL || outSz == NULL)
wolfSSL 0:9d17e4342598 7875 return NULL;
wolfSSL 0:9d17e4342598 7876
wolfSSL 0:9d17e4342598 7877 *outSz = (int)x509->derCert.length;
wolfSSL 0:9d17e4342598 7878 return x509->derCert.buffer;
wolfSSL 0:9d17e4342598 7879 }
wolfSSL 0:9d17e4342598 7880
wolfSSL 0:9d17e4342598 7881
wolfSSL 0:9d17e4342598 7882 int CyaSSL_X509_version(CYASSL_X509* x509)
wolfSSL 0:9d17e4342598 7883 {
wolfSSL 0:9d17e4342598 7884 CYASSL_ENTER("CyaSSL_X509_version");
wolfSSL 0:9d17e4342598 7885
wolfSSL 0:9d17e4342598 7886 if (x509 == NULL)
wolfSSL 0:9d17e4342598 7887 return 0;
wolfSSL 0:9d17e4342598 7888
wolfSSL 0:9d17e4342598 7889 return x509->version;
wolfSSL 0:9d17e4342598 7890 }
wolfSSL 0:9d17e4342598 7891
wolfSSL 0:9d17e4342598 7892
wolfSSL 0:9d17e4342598 7893 const byte* CyaSSL_X509_notBefore(CYASSL_X509* x509)
wolfSSL 0:9d17e4342598 7894 {
wolfSSL 0:9d17e4342598 7895 CYASSL_ENTER("CyaSSL_X509_notBefore");
wolfSSL 0:9d17e4342598 7896
wolfSSL 0:9d17e4342598 7897 if (x509 == NULL)
wolfSSL 0:9d17e4342598 7898 return NULL;
wolfSSL 0:9d17e4342598 7899
wolfSSL 0:9d17e4342598 7900 return x509->notBefore;
wolfSSL 0:9d17e4342598 7901 }
wolfSSL 0:9d17e4342598 7902
wolfSSL 0:9d17e4342598 7903
wolfSSL 0:9d17e4342598 7904 const byte* CyaSSL_X509_notAfter(CYASSL_X509* x509)
wolfSSL 0:9d17e4342598 7905 {
wolfSSL 0:9d17e4342598 7906 CYASSL_ENTER("CyaSSL_X509_notAfter");
wolfSSL 0:9d17e4342598 7907
wolfSSL 0:9d17e4342598 7908 if (x509 == NULL)
wolfSSL 0:9d17e4342598 7909 return NULL;
wolfSSL 0:9d17e4342598 7910
wolfSSL 0:9d17e4342598 7911 return x509->notAfter;
wolfSSL 0:9d17e4342598 7912 }
wolfSSL 0:9d17e4342598 7913
wolfSSL 0:9d17e4342598 7914
wolfSSL 0:9d17e4342598 7915 #ifdef CYASSL_SEP
wolfSSL 0:9d17e4342598 7916
wolfSSL 0:9d17e4342598 7917 /* copy oid into in buffer, at most *inOutSz bytes, if buffer is null will
wolfSSL 0:9d17e4342598 7918 malloc buffer, call responsible for freeing. Actual size returned in
wolfSSL 0:9d17e4342598 7919 *inOutSz. Requires inOutSz be non-null */
wolfSSL 0:9d17e4342598 7920 byte* CyaSSL_X509_get_device_type(CYASSL_X509* x509, byte* in, int *inOutSz)
wolfSSL 0:9d17e4342598 7921 {
wolfSSL 0:9d17e4342598 7922 int copySz;
wolfSSL 0:9d17e4342598 7923
wolfSSL 0:9d17e4342598 7924 CYASSL_ENTER("CyaSSL_X509_get_dev_type");
wolfSSL 0:9d17e4342598 7925 if (inOutSz == NULL) return NULL;
wolfSSL 0:9d17e4342598 7926 if (!x509->deviceTypeSz) return in;
wolfSSL 0:9d17e4342598 7927
wolfSSL 0:9d17e4342598 7928 copySz = min(*inOutSz, x509->deviceTypeSz);
wolfSSL 0:9d17e4342598 7929
wolfSSL 0:9d17e4342598 7930 if (!in) {
wolfSSL 0:9d17e4342598 7931 in = (byte*)XMALLOC(x509->deviceTypeSz, 0, DYNAMIC_TYPE_OPENSSL);
wolfSSL 0:9d17e4342598 7932 if (!in) return in;
wolfSSL 0:9d17e4342598 7933 copySz = x509->deviceTypeSz;
wolfSSL 0:9d17e4342598 7934 }
wolfSSL 0:9d17e4342598 7935
wolfSSL 0:9d17e4342598 7936 XMEMCPY(in, x509->deviceType, copySz);
wolfSSL 0:9d17e4342598 7937 *inOutSz = copySz;
wolfSSL 0:9d17e4342598 7938
wolfSSL 0:9d17e4342598 7939 return in;
wolfSSL 0:9d17e4342598 7940 }
wolfSSL 0:9d17e4342598 7941
wolfSSL 0:9d17e4342598 7942
wolfSSL 0:9d17e4342598 7943 byte* CyaSSL_X509_get_hw_type(CYASSL_X509* x509, byte* in, int* inOutSz)
wolfSSL 0:9d17e4342598 7944 {
wolfSSL 0:9d17e4342598 7945 int copySz;
wolfSSL 0:9d17e4342598 7946
wolfSSL 0:9d17e4342598 7947 CYASSL_ENTER("CyaSSL_X509_get_hw_type");
wolfSSL 0:9d17e4342598 7948 if (inOutSz == NULL) return NULL;
wolfSSL 0:9d17e4342598 7949 if (!x509->hwTypeSz) return in;
wolfSSL 0:9d17e4342598 7950
wolfSSL 0:9d17e4342598 7951 copySz = min(*inOutSz, x509->hwTypeSz);
wolfSSL 0:9d17e4342598 7952
wolfSSL 0:9d17e4342598 7953 if (!in) {
wolfSSL 0:9d17e4342598 7954 in = (byte*)XMALLOC(x509->hwTypeSz, 0, DYNAMIC_TYPE_OPENSSL);
wolfSSL 0:9d17e4342598 7955 if (!in) return in;
wolfSSL 0:9d17e4342598 7956 copySz = x509->hwTypeSz;
wolfSSL 0:9d17e4342598 7957 }
wolfSSL 0:9d17e4342598 7958
wolfSSL 0:9d17e4342598 7959 XMEMCPY(in, x509->hwType, copySz);
wolfSSL 0:9d17e4342598 7960 *inOutSz = copySz;
wolfSSL 0:9d17e4342598 7961
wolfSSL 0:9d17e4342598 7962 return in;
wolfSSL 0:9d17e4342598 7963 }
wolfSSL 0:9d17e4342598 7964
wolfSSL 0:9d17e4342598 7965
wolfSSL 0:9d17e4342598 7966 byte* CyaSSL_X509_get_hw_serial_number(CYASSL_X509* x509,byte* in,int* inOutSz)
wolfSSL 0:9d17e4342598 7967 {
wolfSSL 0:9d17e4342598 7968 int copySz;
wolfSSL 0:9d17e4342598 7969
wolfSSL 0:9d17e4342598 7970 CYASSL_ENTER("CyaSSL_X509_get_hw_serial_number");
wolfSSL 0:9d17e4342598 7971 if (inOutSz == NULL) return NULL;
wolfSSL 0:9d17e4342598 7972 if (!x509->hwTypeSz) return in;
wolfSSL 0:9d17e4342598 7973
wolfSSL 0:9d17e4342598 7974 copySz = min(*inOutSz, x509->hwSerialNumSz);
wolfSSL 0:9d17e4342598 7975
wolfSSL 0:9d17e4342598 7976 if (!in) {
wolfSSL 0:9d17e4342598 7977 in = (byte*)XMALLOC(x509->hwSerialNumSz, 0, DYNAMIC_TYPE_OPENSSL);
wolfSSL 0:9d17e4342598 7978 if (!in) return in;
wolfSSL 0:9d17e4342598 7979 copySz = x509->hwSerialNumSz;
wolfSSL 0:9d17e4342598 7980 }
wolfSSL 0:9d17e4342598 7981
wolfSSL 0:9d17e4342598 7982 XMEMCPY(in, x509->hwSerialNum, copySz);
wolfSSL 0:9d17e4342598 7983 *inOutSz = copySz;
wolfSSL 0:9d17e4342598 7984
wolfSSL 0:9d17e4342598 7985 return in;
wolfSSL 0:9d17e4342598 7986 }
wolfSSL 0:9d17e4342598 7987
wolfSSL 0:9d17e4342598 7988 #endif /* CYASSL_SEP */
wolfSSL 0:9d17e4342598 7989
wolfSSL 0:9d17e4342598 7990
wolfSSL 0:9d17e4342598 7991 CYASSL_X509* CyaSSL_X509_d2i(CYASSL_X509** x509, const byte* in, int len)
wolfSSL 0:9d17e4342598 7992 {
wolfSSL 0:9d17e4342598 7993 CYASSL_X509 *newX509 = NULL;
wolfSSL 0:9d17e4342598 7994
wolfSSL 0:9d17e4342598 7995 CYASSL_ENTER("CyaSSL_X509_d2i");
wolfSSL 0:9d17e4342598 7996
wolfSSL 0:9d17e4342598 7997 if (in != NULL && len != 0) {
wolfSSL 0:9d17e4342598 7998 DecodedCert cert;
wolfSSL 0:9d17e4342598 7999
wolfSSL 0:9d17e4342598 8000 InitDecodedCert(&cert, (byte*)in, len, NULL);
wolfSSL 0:9d17e4342598 8001 if (ParseCertRelative(&cert, CERT_TYPE, 0, NULL) == 0) {
wolfSSL 0:9d17e4342598 8002 newX509 = (CYASSL_X509*)XMALLOC(sizeof(CYASSL_X509),
wolfSSL 0:9d17e4342598 8003 NULL, DYNAMIC_TYPE_X509);
wolfSSL 0:9d17e4342598 8004 if (newX509 != NULL) {
wolfSSL 0:9d17e4342598 8005 InitX509(newX509, 1);
wolfSSL 0:9d17e4342598 8006 if (CopyDecodedToX509(newX509, &cert) != 0) {
wolfSSL 0:9d17e4342598 8007 XFREE(newX509, NULL, DYNAMIC_TYPE_X509);
wolfSSL 0:9d17e4342598 8008 newX509 = NULL;
wolfSSL 0:9d17e4342598 8009 }
wolfSSL 0:9d17e4342598 8010 }
wolfSSL 0:9d17e4342598 8011 }
wolfSSL 0:9d17e4342598 8012 FreeDecodedCert(&cert);
wolfSSL 0:9d17e4342598 8013 }
wolfSSL 0:9d17e4342598 8014
wolfSSL 0:9d17e4342598 8015 if (x509 != NULL)
wolfSSL 0:9d17e4342598 8016 *x509 = newX509;
wolfSSL 0:9d17e4342598 8017
wolfSSL 0:9d17e4342598 8018 return newX509;
wolfSSL 0:9d17e4342598 8019 }
wolfSSL 0:9d17e4342598 8020
wolfSSL 0:9d17e4342598 8021
wolfSSL 0:9d17e4342598 8022 #ifndef NO_FILESYSTEM
wolfSSL 0:9d17e4342598 8023
wolfSSL 0:9d17e4342598 8024 #ifndef NO_STDIO_FILESYSTEM
wolfSSL 0:9d17e4342598 8025
wolfSSL 0:9d17e4342598 8026 CYASSL_X509* CyaSSL_X509_d2i_fp(CYASSL_X509** x509, XFILE file)
wolfSSL 0:9d17e4342598 8027 {
wolfSSL 0:9d17e4342598 8028 CYASSL_X509* newX509 = NULL;
wolfSSL 0:9d17e4342598 8029
wolfSSL 0:9d17e4342598 8030 CYASSL_ENTER("CyaSSL_X509_d2i_fp");
wolfSSL 0:9d17e4342598 8031
wolfSSL 0:9d17e4342598 8032 if (file != XBADFILE) {
wolfSSL 0:9d17e4342598 8033 byte* fileBuffer = NULL;
wolfSSL 0:9d17e4342598 8034 long sz = 0;
wolfSSL 0:9d17e4342598 8035
wolfSSL 0:9d17e4342598 8036 XFSEEK(file, 0, XSEEK_END);
wolfSSL 0:9d17e4342598 8037 sz = XFTELL(file);
wolfSSL 0:9d17e4342598 8038 XREWIND(file);
wolfSSL 0:9d17e4342598 8039
wolfSSL 0:9d17e4342598 8040 fileBuffer = (byte*)XMALLOC(sz, NULL, DYNAMIC_TYPE_FILE);
wolfSSL 0:9d17e4342598 8041 if (fileBuffer != NULL) {
wolfSSL 0:9d17e4342598 8042 if ((int)XFREAD(fileBuffer, sz, 1, file) > 0) {
wolfSSL 0:9d17e4342598 8043 newX509 = CyaSSL_X509_d2i(NULL, fileBuffer, (int)sz);
wolfSSL 0:9d17e4342598 8044 }
wolfSSL 0:9d17e4342598 8045 XFREE(fileBuffer, NULL, DYNAMIC_TYPE_FILE);
wolfSSL 0:9d17e4342598 8046 }
wolfSSL 0:9d17e4342598 8047 }
wolfSSL 0:9d17e4342598 8048
wolfSSL 0:9d17e4342598 8049 if (x509 != NULL)
wolfSSL 0:9d17e4342598 8050 *x509 = newX509;
wolfSSL 0:9d17e4342598 8051
wolfSSL 0:9d17e4342598 8052 return newX509;
wolfSSL 0:9d17e4342598 8053 }
wolfSSL 0:9d17e4342598 8054
wolfSSL 0:9d17e4342598 8055 #endif /* NO_STDIO_FILESYSTEM */
wolfSSL 0:9d17e4342598 8056
wolfSSL 0:9d17e4342598 8057 CYASSL_X509* CyaSSL_X509_load_certificate_file(const char* fname, int format)
wolfSSL 0:9d17e4342598 8058 {
wolfSSL 0:9d17e4342598 8059 byte staticBuffer[FILE_BUFFER_SIZE];
wolfSSL 0:9d17e4342598 8060 byte* fileBuffer = staticBuffer;
wolfSSL 0:9d17e4342598 8061 int dynamic = 0;
wolfSSL 0:9d17e4342598 8062 long sz = 0;
wolfSSL 0:9d17e4342598 8063 XFILE file;
wolfSSL 0:9d17e4342598 8064 CYASSL_X509* x509 = NULL;
wolfSSL 0:9d17e4342598 8065 buffer der;
wolfSSL 0:9d17e4342598 8066
wolfSSL 0:9d17e4342598 8067 CYASSL_ENTER("CyaSSL_X509_load_certificate");
wolfSSL 0:9d17e4342598 8068
wolfSSL 0:9d17e4342598 8069 /* Check the inputs */
wolfSSL 0:9d17e4342598 8070 if ((fname == NULL) ||
wolfSSL 0:9d17e4342598 8071 (format != SSL_FILETYPE_ASN1 && format != SSL_FILETYPE_PEM))
wolfSSL 0:9d17e4342598 8072 return NULL;
wolfSSL 0:9d17e4342598 8073
wolfSSL 0:9d17e4342598 8074 file = XFOPEN(fname, "rb");
wolfSSL 0:9d17e4342598 8075 if (file == XBADFILE) return NULL;
wolfSSL 0:9d17e4342598 8076 XFSEEK(file, 0, XSEEK_END);
wolfSSL 0:9d17e4342598 8077 sz = XFTELL(file);
wolfSSL 0:9d17e4342598 8078 XREWIND(file);
wolfSSL 0:9d17e4342598 8079
wolfSSL 0:9d17e4342598 8080 if (sz > (long)sizeof(staticBuffer)) {
wolfSSL 0:9d17e4342598 8081 fileBuffer = (byte*)XMALLOC(sz, NULL, DYNAMIC_TYPE_FILE);
wolfSSL 0:9d17e4342598 8082 if (fileBuffer == NULL) {
wolfSSL 0:9d17e4342598 8083 XFCLOSE(file);
wolfSSL 0:9d17e4342598 8084 return NULL;
wolfSSL 0:9d17e4342598 8085 }
wolfSSL 0:9d17e4342598 8086 dynamic = 1;
wolfSSL 0:9d17e4342598 8087 }
wolfSSL 0:9d17e4342598 8088 if ((int)XFREAD(fileBuffer, sz, 1, file) < 0) {
wolfSSL 0:9d17e4342598 8089 XFCLOSE(file);
wolfSSL 0:9d17e4342598 8090 if (dynamic) XFREE(fileBuffer, NULL, DYNAMIC_TYPE_FILE);
wolfSSL 0:9d17e4342598 8091 return NULL;
wolfSSL 0:9d17e4342598 8092 }
wolfSSL 0:9d17e4342598 8093 XFCLOSE(file);
wolfSSL 0:9d17e4342598 8094
wolfSSL 0:9d17e4342598 8095 der.buffer = NULL;
wolfSSL 0:9d17e4342598 8096 der.length = 0;
wolfSSL 0:9d17e4342598 8097
wolfSSL 0:9d17e4342598 8098 if (format == SSL_FILETYPE_PEM) {
wolfSSL 0:9d17e4342598 8099 EncryptedInfo info;
wolfSSL 0:9d17e4342598 8100 int ecc = 0;
wolfSSL 0:9d17e4342598 8101
wolfSSL 0:9d17e4342598 8102 info.set = 0;
wolfSSL 0:9d17e4342598 8103 info.ctx = NULL;
wolfSSL 0:9d17e4342598 8104 info.consumed = 0;
wolfSSL 0:9d17e4342598 8105
wolfSSL 0:9d17e4342598 8106 if (PemToDer(fileBuffer, sz, CERT_TYPE, &der, NULL, &info, &ecc) != 0)
wolfSSL 0:9d17e4342598 8107 {
wolfSSL 0:9d17e4342598 8108 /* Only time this should fail, and leave `der` with a buffer
wolfSSL 0:9d17e4342598 8109 is when the Base64 Decode fails. Release `der.buffer` in
wolfSSL 0:9d17e4342598 8110 that case. */
wolfSSL 0:9d17e4342598 8111 if (der.buffer != NULL) {
wolfSSL 0:9d17e4342598 8112 XFREE(der.buffer, NULL, DYNAMIC_TYPE_CERT);
wolfSSL 0:9d17e4342598 8113 der.buffer = NULL;
wolfSSL 0:9d17e4342598 8114 }
wolfSSL 0:9d17e4342598 8115 }
wolfSSL 0:9d17e4342598 8116 }
wolfSSL 0:9d17e4342598 8117 else {
wolfSSL 0:9d17e4342598 8118 der.buffer = (byte*)XMALLOC(sz, NULL, DYNAMIC_TYPE_CERT);
wolfSSL 0:9d17e4342598 8119 if (der.buffer != NULL) {
wolfSSL 0:9d17e4342598 8120 XMEMCPY(der.buffer, fileBuffer, sz);
wolfSSL 0:9d17e4342598 8121 der.length = (word32)sz;
wolfSSL 0:9d17e4342598 8122 }
wolfSSL 0:9d17e4342598 8123 }
wolfSSL 0:9d17e4342598 8124 if (dynamic) XFREE(fileBuffer, NULL, DYNAMIC_TYPE_FILE);
wolfSSL 0:9d17e4342598 8125
wolfSSL 0:9d17e4342598 8126 /* At this point we want `der` to have the certificate in DER format */
wolfSSL 0:9d17e4342598 8127 /* ready to be decoded. */
wolfSSL 0:9d17e4342598 8128 if (der.buffer != NULL) {
wolfSSL 0:9d17e4342598 8129 DecodedCert cert;
wolfSSL 0:9d17e4342598 8130
wolfSSL 0:9d17e4342598 8131 InitDecodedCert(&cert, der.buffer, der.length, NULL);
wolfSSL 0:9d17e4342598 8132 if (ParseCertRelative(&cert, CERT_TYPE, 0, NULL) == 0) {
wolfSSL 0:9d17e4342598 8133 x509 = (CYASSL_X509*)XMALLOC(sizeof(CYASSL_X509),
wolfSSL 0:9d17e4342598 8134 NULL, DYNAMIC_TYPE_X509);
wolfSSL 0:9d17e4342598 8135 if (x509 != NULL) {
wolfSSL 0:9d17e4342598 8136 InitX509(x509, 1);
wolfSSL 0:9d17e4342598 8137 if (CopyDecodedToX509(x509, &cert) != 0) {
wolfSSL 0:9d17e4342598 8138 XFREE(x509, NULL, DYNAMIC_TYPE_X509);
wolfSSL 0:9d17e4342598 8139 x509 = NULL;
wolfSSL 0:9d17e4342598 8140 }
wolfSSL 0:9d17e4342598 8141 }
wolfSSL 0:9d17e4342598 8142 }
wolfSSL 0:9d17e4342598 8143 FreeDecodedCert(&cert);
wolfSSL 0:9d17e4342598 8144
wolfSSL 0:9d17e4342598 8145 XFREE(der.buffer, NULL, DYNAMIC_TYPE_CERT);
wolfSSL 0:9d17e4342598 8146 }
wolfSSL 0:9d17e4342598 8147
wolfSSL 0:9d17e4342598 8148 return x509;
wolfSSL 0:9d17e4342598 8149 }
wolfSSL 0:9d17e4342598 8150
wolfSSL 0:9d17e4342598 8151 #endif /* NO_FILESYSTEM */
wolfSSL 0:9d17e4342598 8152
wolfSSL 0:9d17e4342598 8153 #endif /* KEEP_PEER_CERT || SESSION_CERTS */
wolfSSL 0:9d17e4342598 8154
wolfSSL 0:9d17e4342598 8155
wolfSSL 0:9d17e4342598 8156 #ifdef OPENSSL_EXTRA
wolfSSL 0:9d17e4342598 8157 int CyaSSL_set_ex_data(CYASSL* ssl, int idx, void* data)
wolfSSL 0:9d17e4342598 8158 {
wolfSSL 0:9d17e4342598 8159 #ifdef FORTRESS
wolfSSL 0:9d17e4342598 8160 if (ssl != NULL && idx < MAX_EX_DATA)
wolfSSL 0:9d17e4342598 8161 {
wolfSSL 0:9d17e4342598 8162 ssl->ex_data[idx] = data;
wolfSSL 0:9d17e4342598 8163 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 8164 }
wolfSSL 0:9d17e4342598 8165 #else
wolfSSL 0:9d17e4342598 8166 (void)ssl;
wolfSSL 0:9d17e4342598 8167 (void)idx;
wolfSSL 0:9d17e4342598 8168 (void)data;
wolfSSL 0:9d17e4342598 8169 #endif
wolfSSL 0:9d17e4342598 8170 return SSL_FAILURE;
wolfSSL 0:9d17e4342598 8171 }
wolfSSL 0:9d17e4342598 8172
wolfSSL 0:9d17e4342598 8173
wolfSSL 0:9d17e4342598 8174 int CyaSSL_set_session_id_context(CYASSL* ssl, const unsigned char* id,
wolfSSL 0:9d17e4342598 8175 unsigned int len)
wolfSSL 0:9d17e4342598 8176 {
wolfSSL 0:9d17e4342598 8177 (void)ssl;
wolfSSL 0:9d17e4342598 8178 (void)id;
wolfSSL 0:9d17e4342598 8179 (void)len;
wolfSSL 0:9d17e4342598 8180 return 0;
wolfSSL 0:9d17e4342598 8181 }
wolfSSL 0:9d17e4342598 8182
wolfSSL 0:9d17e4342598 8183
wolfSSL 0:9d17e4342598 8184 void CyaSSL_set_connect_state(CYASSL* ssl)
wolfSSL 0:9d17e4342598 8185 {
wolfSSL 0:9d17e4342598 8186 (void)ssl;
wolfSSL 0:9d17e4342598 8187 /* client by default */
wolfSSL 0:9d17e4342598 8188 }
wolfSSL 0:9d17e4342598 8189 #endif
wolfSSL 0:9d17e4342598 8190
wolfSSL 0:9d17e4342598 8191 int CyaSSL_get_shutdown(const CYASSL* ssl)
wolfSSL 0:9d17e4342598 8192 {
wolfSSL 0:9d17e4342598 8193 return (ssl->options.isClosed ||
wolfSSL 0:9d17e4342598 8194 ssl->options.connReset ||
wolfSSL 0:9d17e4342598 8195 ssl->options.sentNotify);
wolfSSL 0:9d17e4342598 8196 }
wolfSSL 0:9d17e4342598 8197
wolfSSL 0:9d17e4342598 8198
wolfSSL 0:9d17e4342598 8199 int CyaSSL_session_reused(CYASSL* ssl)
wolfSSL 0:9d17e4342598 8200 {
wolfSSL 0:9d17e4342598 8201 return ssl->options.resuming;
wolfSSL 0:9d17e4342598 8202 }
wolfSSL 0:9d17e4342598 8203
wolfSSL 0:9d17e4342598 8204 #ifdef OPENSSL_EXTRA
wolfSSL 0:9d17e4342598 8205 void CyaSSL_SESSION_free(CYASSL_SESSION* session)
wolfSSL 0:9d17e4342598 8206 {
wolfSSL 0:9d17e4342598 8207 (void)session;
wolfSSL 0:9d17e4342598 8208 }
wolfSSL 0:9d17e4342598 8209 #endif
wolfSSL 0:9d17e4342598 8210
wolfSSL 0:9d17e4342598 8211 const char* CyaSSL_get_version(CYASSL* ssl)
wolfSSL 0:9d17e4342598 8212 {
wolfSSL 0:9d17e4342598 8213 CYASSL_ENTER("SSL_get_version");
wolfSSL 0:9d17e4342598 8214 if (ssl->version.major == SSLv3_MAJOR) {
wolfSSL 0:9d17e4342598 8215 switch (ssl->version.minor) {
wolfSSL 0:9d17e4342598 8216 case SSLv3_MINOR :
wolfSSL 0:9d17e4342598 8217 return "SSLv3";
wolfSSL 0:9d17e4342598 8218 case TLSv1_MINOR :
wolfSSL 0:9d17e4342598 8219 return "TLSv1";
wolfSSL 0:9d17e4342598 8220 case TLSv1_1_MINOR :
wolfSSL 0:9d17e4342598 8221 return "TLSv1.1";
wolfSSL 0:9d17e4342598 8222 case TLSv1_2_MINOR :
wolfSSL 0:9d17e4342598 8223 return "TLSv1.2";
wolfSSL 0:9d17e4342598 8224 default:
wolfSSL 0:9d17e4342598 8225 return "unknown";
wolfSSL 0:9d17e4342598 8226 }
wolfSSL 0:9d17e4342598 8227 }
wolfSSL 0:9d17e4342598 8228 else if (ssl->version.major == DTLS_MAJOR) {
wolfSSL 0:9d17e4342598 8229 switch (ssl->version.minor) {
wolfSSL 0:9d17e4342598 8230 case DTLS_MINOR :
wolfSSL 0:9d17e4342598 8231 return "DTLS";
wolfSSL 0:9d17e4342598 8232 case DTLSv1_2_MINOR :
wolfSSL 0:9d17e4342598 8233 return "DTLSv1.2";
wolfSSL 0:9d17e4342598 8234 default:
wolfSSL 0:9d17e4342598 8235 return "unknown";
wolfSSL 0:9d17e4342598 8236 }
wolfSSL 0:9d17e4342598 8237 }
wolfSSL 0:9d17e4342598 8238 return "unknown";
wolfSSL 0:9d17e4342598 8239 }
wolfSSL 0:9d17e4342598 8240
wolfSSL 0:9d17e4342598 8241 int CyaSSL_get_current_cipher_suite(CYASSL* ssl)
wolfSSL 0:9d17e4342598 8242 {
wolfSSL 0:9d17e4342598 8243 CYASSL_ENTER("SSL_get_current_cipher_suite");
wolfSSL 0:9d17e4342598 8244 if (ssl)
wolfSSL 0:9d17e4342598 8245 return (ssl->options.cipherSuite0 << 8) | ssl->options.cipherSuite;
wolfSSL 0:9d17e4342598 8246 return 0;
wolfSSL 0:9d17e4342598 8247 }
wolfSSL 0:9d17e4342598 8248
wolfSSL 0:9d17e4342598 8249 CYASSL_CIPHER* CyaSSL_get_current_cipher(CYASSL* ssl)
wolfSSL 0:9d17e4342598 8250 {
wolfSSL 0:9d17e4342598 8251 CYASSL_ENTER("SSL_get_current_cipher");
wolfSSL 0:9d17e4342598 8252 if (ssl)
wolfSSL 0:9d17e4342598 8253 return &ssl->cipher;
wolfSSL 0:9d17e4342598 8254 else
wolfSSL 0:9d17e4342598 8255 return NULL;
wolfSSL 0:9d17e4342598 8256 }
wolfSSL 0:9d17e4342598 8257
wolfSSL 0:9d17e4342598 8258
wolfSSL 0:9d17e4342598 8259 const char* CyaSSL_CIPHER_get_name(const CYASSL_CIPHER* cipher)
wolfSSL 0:9d17e4342598 8260 {
wolfSSL 0:9d17e4342598 8261 (void)cipher;
wolfSSL 0:9d17e4342598 8262
wolfSSL 0:9d17e4342598 8263 CYASSL_ENTER("SSL_CIPHER_get_name");
wolfSSL 0:9d17e4342598 8264 #ifndef NO_ERROR_STRINGS
wolfSSL 0:9d17e4342598 8265 if (cipher) {
wolfSSL 0:9d17e4342598 8266 #ifdef HAVE_ECC
wolfSSL 0:9d17e4342598 8267 if (cipher->ssl->options.cipherSuite0 == ECC_BYTE) {
wolfSSL 0:9d17e4342598 8268 /* ECC suites */
wolfSSL 0:9d17e4342598 8269 switch (cipher->ssl->options.cipherSuite) {
wolfSSL 0:9d17e4342598 8270 #ifndef NO_RSA
wolfSSL 0:9d17e4342598 8271 case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 :
wolfSSL 0:9d17e4342598 8272 return "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256";
wolfSSL 0:9d17e4342598 8273 #endif
wolfSSL 0:9d17e4342598 8274 case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 :
wolfSSL 0:9d17e4342598 8275 return "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256";
wolfSSL 0:9d17e4342598 8276 #ifndef NO_RSA
wolfSSL 0:9d17e4342598 8277 case TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 :
wolfSSL 0:9d17e4342598 8278 return "TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256";
wolfSSL 0:9d17e4342598 8279 #endif
wolfSSL 0:9d17e4342598 8280 case TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 :
wolfSSL 0:9d17e4342598 8281 return "TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256";
wolfSSL 0:9d17e4342598 8282 #ifndef NO_RSA
wolfSSL 0:9d17e4342598 8283 case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 :
wolfSSL 0:9d17e4342598 8284 return "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384";
wolfSSL 0:9d17e4342598 8285 #endif
wolfSSL 0:9d17e4342598 8286 case TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 :
wolfSSL 0:9d17e4342598 8287 return "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384";
wolfSSL 0:9d17e4342598 8288 #ifndef NO_RSA
wolfSSL 0:9d17e4342598 8289 case TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 :
wolfSSL 0:9d17e4342598 8290 return "TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384";
wolfSSL 0:9d17e4342598 8291 #endif
wolfSSL 0:9d17e4342598 8292 case TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 :
wolfSSL 0:9d17e4342598 8293 return "TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384";
wolfSSL 0:9d17e4342598 8294 #ifndef NO_SHA
wolfSSL 0:9d17e4342598 8295 #ifndef NO_RSA
wolfSSL 0:9d17e4342598 8296 case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA :
wolfSSL 0:9d17e4342598 8297 return "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA";
wolfSSL 0:9d17e4342598 8298 case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA :
wolfSSL 0:9d17e4342598 8299 return "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA";
wolfSSL 0:9d17e4342598 8300 #endif
wolfSSL 0:9d17e4342598 8301 case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA :
wolfSSL 0:9d17e4342598 8302 return "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA";
wolfSSL 0:9d17e4342598 8303 case TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA :
wolfSSL 0:9d17e4342598 8304 return "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA";
wolfSSL 0:9d17e4342598 8305 #ifndef NO_RC4
wolfSSL 0:9d17e4342598 8306 #ifndef NO_RSA
wolfSSL 0:9d17e4342598 8307 case TLS_ECDHE_RSA_WITH_RC4_128_SHA :
wolfSSL 0:9d17e4342598 8308 return "TLS_ECDHE_RSA_WITH_RC4_128_SHA";
wolfSSL 0:9d17e4342598 8309 #endif
wolfSSL 0:9d17e4342598 8310 case TLS_ECDHE_ECDSA_WITH_RC4_128_SHA :
wolfSSL 0:9d17e4342598 8311 return "TLS_ECDHE_ECDSA_WITH_RC4_128_SHA";
wolfSSL 0:9d17e4342598 8312 #endif
wolfSSL 0:9d17e4342598 8313 #ifndef NO_DES3
wolfSSL 0:9d17e4342598 8314 #ifndef NO_RSA
wolfSSL 0:9d17e4342598 8315 case TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA :
wolfSSL 0:9d17e4342598 8316 return "TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA";
wolfSSL 0:9d17e4342598 8317 #endif
wolfSSL 0:9d17e4342598 8318 case TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA :
wolfSSL 0:9d17e4342598 8319 return "TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA";
wolfSSL 0:9d17e4342598 8320 #endif
wolfSSL 0:9d17e4342598 8321
wolfSSL 0:9d17e4342598 8322 #ifndef NO_RSA
wolfSSL 0:9d17e4342598 8323 case TLS_ECDH_RSA_WITH_AES_128_CBC_SHA :
wolfSSL 0:9d17e4342598 8324 return "TLS_ECDH_RSA_WITH_AES_128_CBC_SHA";
wolfSSL 0:9d17e4342598 8325 case TLS_ECDH_RSA_WITH_AES_256_CBC_SHA :
wolfSSL 0:9d17e4342598 8326 return "TLS_ECDH_RSA_WITH_AES_256_CBC_SHA";
wolfSSL 0:9d17e4342598 8327 #endif
wolfSSL 0:9d17e4342598 8328 case TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA :
wolfSSL 0:9d17e4342598 8329 return "TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA";
wolfSSL 0:9d17e4342598 8330 case TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA :
wolfSSL 0:9d17e4342598 8331 return "TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA";
wolfSSL 0:9d17e4342598 8332 #ifndef NO_RC4
wolfSSL 0:9d17e4342598 8333 #ifndef NO_RSA
wolfSSL 0:9d17e4342598 8334 case TLS_ECDH_RSA_WITH_RC4_128_SHA :
wolfSSL 0:9d17e4342598 8335 return "TLS_ECDH_RSA_WITH_RC4_128_SHA";
wolfSSL 0:9d17e4342598 8336 #endif
wolfSSL 0:9d17e4342598 8337 case TLS_ECDH_ECDSA_WITH_RC4_128_SHA :
wolfSSL 0:9d17e4342598 8338 return "TLS_ECDH_ECDSA_WITH_RC4_128_SHA";
wolfSSL 0:9d17e4342598 8339 #endif
wolfSSL 0:9d17e4342598 8340 #ifndef NO_DES3
wolfSSL 0:9d17e4342598 8341 #ifndef NO_RSA
wolfSSL 0:9d17e4342598 8342 case TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA :
wolfSSL 0:9d17e4342598 8343 return "TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA";
wolfSSL 0:9d17e4342598 8344 #endif
wolfSSL 0:9d17e4342598 8345 case TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA :
wolfSSL 0:9d17e4342598 8346 return "TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA";
wolfSSL 0:9d17e4342598 8347 #endif
wolfSSL 0:9d17e4342598 8348 #endif /* NO_SHA */
wolfSSL 0:9d17e4342598 8349
wolfSSL 0:9d17e4342598 8350 #ifdef HAVE_AESGCM
wolfSSL 0:9d17e4342598 8351 #ifndef NO_RSA
wolfSSL 0:9d17e4342598 8352 case TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 :
wolfSSL 0:9d17e4342598 8353 return "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256";
wolfSSL 0:9d17e4342598 8354 case TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 :
wolfSSL 0:9d17e4342598 8355 return "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384";
wolfSSL 0:9d17e4342598 8356 #endif
wolfSSL 0:9d17e4342598 8357 case TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 :
wolfSSL 0:9d17e4342598 8358 return "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256";
wolfSSL 0:9d17e4342598 8359 case TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 :
wolfSSL 0:9d17e4342598 8360 return "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384";
wolfSSL 0:9d17e4342598 8361 #ifndef NO_RSA
wolfSSL 0:9d17e4342598 8362 case TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 :
wolfSSL 0:9d17e4342598 8363 return "TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256";
wolfSSL 0:9d17e4342598 8364 case TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 :
wolfSSL 0:9d17e4342598 8365 return "TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384";
wolfSSL 0:9d17e4342598 8366 #endif
wolfSSL 0:9d17e4342598 8367 case TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 :
wolfSSL 0:9d17e4342598 8368 return "TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256";
wolfSSL 0:9d17e4342598 8369 case TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 :
wolfSSL 0:9d17e4342598 8370 return "TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384";
wolfSSL 0:9d17e4342598 8371 #endif
wolfSSL 0:9d17e4342598 8372
wolfSSL 0:9d17e4342598 8373 #ifdef HAVE_AESCCM
wolfSSL 0:9d17e4342598 8374 #ifndef NO_RSA
wolfSSL 0:9d17e4342598 8375 case TLS_RSA_WITH_AES_128_CCM_8 :
wolfSSL 0:9d17e4342598 8376 return "TLS_RSA_WITH_AES_128_CCM_8";
wolfSSL 0:9d17e4342598 8377 case TLS_RSA_WITH_AES_256_CCM_8 :
wolfSSL 0:9d17e4342598 8378 return "TLS_RSA_WITH_AES_256_CCM_8";
wolfSSL 0:9d17e4342598 8379 #endif
wolfSSL 0:9d17e4342598 8380 case TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8:
wolfSSL 0:9d17e4342598 8381 return "TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8";
wolfSSL 0:9d17e4342598 8382 case TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8 :
wolfSSL 0:9d17e4342598 8383 return "TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8";
wolfSSL 0:9d17e4342598 8384 #endif
wolfSSL 0:9d17e4342598 8385
wolfSSL 0:9d17e4342598 8386 default:
wolfSSL 0:9d17e4342598 8387 return "NONE";
wolfSSL 0:9d17e4342598 8388 }
wolfSSL 0:9d17e4342598 8389 }
wolfSSL 0:9d17e4342598 8390 #endif /* ECC */
wolfSSL 0:9d17e4342598 8391 if (cipher->ssl->options.cipherSuite0 != ECC_BYTE) {
wolfSSL 0:9d17e4342598 8392 /* normal suites */
wolfSSL 0:9d17e4342598 8393 switch (cipher->ssl->options.cipherSuite) {
wolfSSL 0:9d17e4342598 8394 #ifndef NO_RSA
wolfSSL 0:9d17e4342598 8395 #ifndef NO_RC4
wolfSSL 0:9d17e4342598 8396 #ifndef NO_SHA
wolfSSL 0:9d17e4342598 8397 case SSL_RSA_WITH_RC4_128_SHA :
wolfSSL 0:9d17e4342598 8398 return "SSL_RSA_WITH_RC4_128_SHA";
wolfSSL 0:9d17e4342598 8399 #endif
wolfSSL 0:9d17e4342598 8400 #ifndef NO_MD5
wolfSSL 0:9d17e4342598 8401 case SSL_RSA_WITH_RC4_128_MD5 :
wolfSSL 0:9d17e4342598 8402 return "SSL_RSA_WITH_RC4_128_MD5";
wolfSSL 0:9d17e4342598 8403 #endif
wolfSSL 0:9d17e4342598 8404 #endif
wolfSSL 0:9d17e4342598 8405 #ifndef NO_SHA
wolfSSL 0:9d17e4342598 8406 #ifndef NO_DES3
wolfSSL 0:9d17e4342598 8407 case SSL_RSA_WITH_3DES_EDE_CBC_SHA :
wolfSSL 0:9d17e4342598 8408 return "SSL_RSA_WITH_3DES_EDE_CBC_SHA";
wolfSSL 0:9d17e4342598 8409 #endif
wolfSSL 0:9d17e4342598 8410 case TLS_RSA_WITH_AES_128_CBC_SHA :
wolfSSL 0:9d17e4342598 8411 return "TLS_RSA_WITH_AES_128_CBC_SHA";
wolfSSL 0:9d17e4342598 8412 case TLS_RSA_WITH_AES_256_CBC_SHA :
wolfSSL 0:9d17e4342598 8413 return "TLS_RSA_WITH_AES_256_CBC_SHA";
wolfSSL 0:9d17e4342598 8414 #endif
wolfSSL 0:9d17e4342598 8415 case TLS_RSA_WITH_AES_128_CBC_SHA256 :
wolfSSL 0:9d17e4342598 8416 return "TLS_RSA_WITH_AES_128_CBC_SHA256";
wolfSSL 0:9d17e4342598 8417 case TLS_RSA_WITH_AES_256_CBC_SHA256 :
wolfSSL 0:9d17e4342598 8418 return "TLS_RSA_WITH_AES_256_CBC_SHA256";
wolfSSL 0:9d17e4342598 8419 #ifdef HAVE_BLAKE2
wolfSSL 0:9d17e4342598 8420 case TLS_RSA_WITH_AES_128_CBC_B2B256:
wolfSSL 0:9d17e4342598 8421 return "TLS_RSA_WITH_AES_128_CBC_B2B256";
wolfSSL 0:9d17e4342598 8422 case TLS_RSA_WITH_AES_256_CBC_B2B256:
wolfSSL 0:9d17e4342598 8423 return "TLS_RSA_WITH_AES_256_CBC_B2B256";
wolfSSL 0:9d17e4342598 8424 #endif
wolfSSL 0:9d17e4342598 8425 #ifndef NO_SHA
wolfSSL 0:9d17e4342598 8426 case TLS_RSA_WITH_NULL_SHA :
wolfSSL 0:9d17e4342598 8427 return "TLS_RSA_WITH_NULL_SHA";
wolfSSL 0:9d17e4342598 8428 #endif
wolfSSL 0:9d17e4342598 8429 case TLS_RSA_WITH_NULL_SHA256 :
wolfSSL 0:9d17e4342598 8430 return "TLS_RSA_WITH_NULL_SHA256";
wolfSSL 0:9d17e4342598 8431 #endif /* NO_RSA */
wolfSSL 0:9d17e4342598 8432 #ifndef NO_PSK
wolfSSL 0:9d17e4342598 8433 case TLS_PSK_WITH_AES_128_CBC_SHA256 :
wolfSSL 0:9d17e4342598 8434 return "TLS_PSK_WITH_AES_128_CBC_SHA256";
wolfSSL 0:9d17e4342598 8435 #ifndef NO_SHA
wolfSSL 0:9d17e4342598 8436 case TLS_PSK_WITH_AES_128_CBC_SHA :
wolfSSL 0:9d17e4342598 8437 return "TLS_PSK_WITH_AES_128_CBC_SHA";
wolfSSL 0:9d17e4342598 8438 case TLS_PSK_WITH_AES_256_CBC_SHA :
wolfSSL 0:9d17e4342598 8439 return "TLS_PSK_WITH_AES_256_CBC_SHA";
wolfSSL 0:9d17e4342598 8440 #endif
wolfSSL 0:9d17e4342598 8441 #ifndef NO_SHA256
wolfSSL 0:9d17e4342598 8442 #ifdef HAVE_AESCCM
wolfSSL 0:9d17e4342598 8443 case TLS_PSK_WITH_AES_128_CCM_8 :
wolfSSL 0:9d17e4342598 8444 return "TLS_PSK_WITH_AES_128_CCM_8";
wolfSSL 0:9d17e4342598 8445 case TLS_PSK_WITH_AES_256_CCM_8 :
wolfSSL 0:9d17e4342598 8446 return "TLS_PSK_WITH_AES_256_CCM_8";
wolfSSL 0:9d17e4342598 8447 #endif
wolfSSL 0:9d17e4342598 8448 case TLS_PSK_WITH_NULL_SHA256 :
wolfSSL 0:9d17e4342598 8449 return "TLS_PSK_WITH_NULL_SHA256";
wolfSSL 0:9d17e4342598 8450 #endif
wolfSSL 0:9d17e4342598 8451 #ifndef NO_SHA
wolfSSL 0:9d17e4342598 8452 case TLS_PSK_WITH_NULL_SHA :
wolfSSL 0:9d17e4342598 8453 return "TLS_PSK_WITH_NULL_SHA";
wolfSSL 0:9d17e4342598 8454 #endif
wolfSSL 0:9d17e4342598 8455 #endif /* NO_PSK */
wolfSSL 0:9d17e4342598 8456 #ifndef NO_RSA
wolfSSL 0:9d17e4342598 8457 case TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 :
wolfSSL 0:9d17e4342598 8458 return "TLS_DHE_RSA_WITH_AES_128_CBC_SHA256";
wolfSSL 0:9d17e4342598 8459 case TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 :
wolfSSL 0:9d17e4342598 8460 return "TLS_DHE_RSA_WITH_AES_256_CBC_SHA256";
wolfSSL 0:9d17e4342598 8461 #ifndef NO_SHA
wolfSSL 0:9d17e4342598 8462 case TLS_DHE_RSA_WITH_AES_128_CBC_SHA :
wolfSSL 0:9d17e4342598 8463 return "TLS_DHE_RSA_WITH_AES_128_CBC_SHA";
wolfSSL 0:9d17e4342598 8464 case TLS_DHE_RSA_WITH_AES_256_CBC_SHA :
wolfSSL 0:9d17e4342598 8465 return "TLS_DHE_RSA_WITH_AES_256_CBC_SHA";
wolfSSL 0:9d17e4342598 8466 #endif
wolfSSL 0:9d17e4342598 8467 #ifndef NO_HC128
wolfSSL 0:9d17e4342598 8468 #ifndef NO_MD5
wolfSSL 0:9d17e4342598 8469 case TLS_RSA_WITH_HC_128_MD5 :
wolfSSL 0:9d17e4342598 8470 return "TLS_RSA_WITH_HC_128_MD5";
wolfSSL 0:9d17e4342598 8471 #endif
wolfSSL 0:9d17e4342598 8472 #ifndef NO_SHA
wolfSSL 0:9d17e4342598 8473 case TLS_RSA_WITH_HC_128_SHA :
wolfSSL 0:9d17e4342598 8474 return "TLS_RSA_WITH_HC_128_SHA";
wolfSSL 0:9d17e4342598 8475 #endif
wolfSSL 0:9d17e4342598 8476 #ifdef HAVE_BLAKE2
wolfSSL 0:9d17e4342598 8477 case TLS_RSA_WITH_HC_128_B2B256:
wolfSSL 0:9d17e4342598 8478 return "TLS_RSA_WITH_HC_128_B2B256";
wolfSSL 0:9d17e4342598 8479 #endif
wolfSSL 0:9d17e4342598 8480 #endif /* NO_HC128 */
wolfSSL 0:9d17e4342598 8481 #ifndef NO_SHA
wolfSSL 0:9d17e4342598 8482 #ifndef NO_RABBIT
wolfSSL 0:9d17e4342598 8483 case TLS_RSA_WITH_RABBIT_SHA :
wolfSSL 0:9d17e4342598 8484 return "TLS_RSA_WITH_RABBIT_SHA";
wolfSSL 0:9d17e4342598 8485 #endif
wolfSSL 0:9d17e4342598 8486 #ifdef HAVE_NTRU
wolfSSL 0:9d17e4342598 8487 #ifndef NO_RC4
wolfSSL 0:9d17e4342598 8488 case TLS_NTRU_RSA_WITH_RC4_128_SHA :
wolfSSL 0:9d17e4342598 8489 return "TLS_NTRU_RSA_WITH_RC4_128_SHA";
wolfSSL 0:9d17e4342598 8490 #endif
wolfSSL 0:9d17e4342598 8491 #ifndef NO_DES3
wolfSSL 0:9d17e4342598 8492 case TLS_NTRU_RSA_WITH_3DES_EDE_CBC_SHA :
wolfSSL 0:9d17e4342598 8493 return "TLS_NTRU_RSA_WITH_3DES_EDE_CBC_SHA";
wolfSSL 0:9d17e4342598 8494 #endif
wolfSSL 0:9d17e4342598 8495 case TLS_NTRU_RSA_WITH_AES_128_CBC_SHA :
wolfSSL 0:9d17e4342598 8496 return "TLS_NTRU_RSA_WITH_AES_128_CBC_SHA";
wolfSSL 0:9d17e4342598 8497 case TLS_NTRU_RSA_WITH_AES_256_CBC_SHA :
wolfSSL 0:9d17e4342598 8498 return "TLS_NTRU_RSA_WITH_AES_256_CBC_SHA";
wolfSSL 0:9d17e4342598 8499 #endif /* HAVE_NTRU */
wolfSSL 0:9d17e4342598 8500 #endif /* NO_SHA */
wolfSSL 0:9d17e4342598 8501 case TLS_RSA_WITH_AES_128_GCM_SHA256 :
wolfSSL 0:9d17e4342598 8502 return "TLS_RSA_WITH_AES_128_GCM_SHA256";
wolfSSL 0:9d17e4342598 8503 case TLS_RSA_WITH_AES_256_GCM_SHA384 :
wolfSSL 0:9d17e4342598 8504 return "TLS_RSA_WITH_AES_256_GCM_SHA384";
wolfSSL 0:9d17e4342598 8505 case TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 :
wolfSSL 0:9d17e4342598 8506 return "TLS_DHE_RSA_WITH_AES_128_GCM_SHA256";
wolfSSL 0:9d17e4342598 8507 case TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 :
wolfSSL 0:9d17e4342598 8508 return "TLS_DHE_RSA_WITH_AES_256_GCM_SHA384";
wolfSSL 0:9d17e4342598 8509 #ifndef NO_SHA
wolfSSL 0:9d17e4342598 8510 case TLS_RSA_WITH_CAMELLIA_128_CBC_SHA :
wolfSSL 0:9d17e4342598 8511 return "TLS_RSA_WITH_CAMELLIA_128_CBC_SHA";
wolfSSL 0:9d17e4342598 8512 case TLS_RSA_WITH_CAMELLIA_256_CBC_SHA :
wolfSSL 0:9d17e4342598 8513 return "TLS_RSA_WITH_CAMELLIA_256_CBC_SHA";
wolfSSL 0:9d17e4342598 8514 #endif
wolfSSL 0:9d17e4342598 8515 case TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256 :
wolfSSL 0:9d17e4342598 8516 return "TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256";
wolfSSL 0:9d17e4342598 8517 case TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256 :
wolfSSL 0:9d17e4342598 8518 return "TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256";
wolfSSL 0:9d17e4342598 8519 #ifndef NO_SHA
wolfSSL 0:9d17e4342598 8520 case TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA :
wolfSSL 0:9d17e4342598 8521 return "TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA";
wolfSSL 0:9d17e4342598 8522 case TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA :
wolfSSL 0:9d17e4342598 8523 return "TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA";
wolfSSL 0:9d17e4342598 8524 #endif
wolfSSL 0:9d17e4342598 8525 case TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 :
wolfSSL 0:9d17e4342598 8526 return "TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256";
wolfSSL 0:9d17e4342598 8527 case TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 :
wolfSSL 0:9d17e4342598 8528 return "TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256";
wolfSSL 0:9d17e4342598 8529 #endif /* NO_RSA */
wolfSSL 0:9d17e4342598 8530 default:
wolfSSL 0:9d17e4342598 8531 return "NONE";
wolfSSL 0:9d17e4342598 8532 } /* switch */
wolfSSL 0:9d17e4342598 8533 } /* normal / ECC */
wolfSSL 0:9d17e4342598 8534 }
wolfSSL 0:9d17e4342598 8535 #endif /* NO_ERROR_STRINGS */
wolfSSL 0:9d17e4342598 8536 return "NONE";
wolfSSL 0:9d17e4342598 8537 }
wolfSSL 0:9d17e4342598 8538
wolfSSL 0:9d17e4342598 8539
wolfSSL 0:9d17e4342598 8540 const char* CyaSSL_get_cipher(CYASSL* ssl)
wolfSSL 0:9d17e4342598 8541 {
wolfSSL 0:9d17e4342598 8542 CYASSL_ENTER("CyaSSL_get_cipher");
wolfSSL 0:9d17e4342598 8543 return CyaSSL_CIPHER_get_name(CyaSSL_get_current_cipher(ssl));
wolfSSL 0:9d17e4342598 8544 }
wolfSSL 0:9d17e4342598 8545
wolfSSL 0:9d17e4342598 8546 #ifdef OPENSSL_EXTRA
wolfSSL 0:9d17e4342598 8547
wolfSSL 0:9d17e4342598 8548 /* XXX shuld be NO_DH */
wolfSSL 0:9d17e4342598 8549 #ifndef NO_CERTS
wolfSSL 0:9d17e4342598 8550 /* server ctx Diffie-Hellman parameters, SSL_SUCCESS on ok */
wolfSSL 0:9d17e4342598 8551 int CyaSSL_CTX_SetTmpDH(CYASSL_CTX* ctx, const unsigned char* p, int pSz,
wolfSSL 0:9d17e4342598 8552 const unsigned char* g, int gSz)
wolfSSL 0:9d17e4342598 8553 {
wolfSSL 0:9d17e4342598 8554 CYASSL_ENTER("CyaSSL_CTX_SetTmpDH");
wolfSSL 0:9d17e4342598 8555 if (ctx == NULL || p == NULL || g == NULL) return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 8556
wolfSSL 0:9d17e4342598 8557 XFREE(ctx->serverDH_P.buffer, ctx->heap, DYNAMIC_TYPE_DH);
wolfSSL 0:9d17e4342598 8558 XFREE(ctx->serverDH_G.buffer, ctx->heap, DYNAMIC_TYPE_DH);
wolfSSL 0:9d17e4342598 8559
wolfSSL 0:9d17e4342598 8560 ctx->serverDH_P.buffer = (byte*)XMALLOC(pSz, ctx->heap,DYNAMIC_TYPE_DH);
wolfSSL 0:9d17e4342598 8561 if (ctx->serverDH_P.buffer == NULL)
wolfSSL 0:9d17e4342598 8562 return MEMORY_E;
wolfSSL 0:9d17e4342598 8563
wolfSSL 0:9d17e4342598 8564 ctx->serverDH_G.buffer = (byte*)XMALLOC(gSz, ctx->heap,DYNAMIC_TYPE_DH);
wolfSSL 0:9d17e4342598 8565 if (ctx->serverDH_G.buffer == NULL) {
wolfSSL 0:9d17e4342598 8566 XFREE(ctx->serverDH_P.buffer, ctx->heap, DYNAMIC_TYPE_DH);
wolfSSL 0:9d17e4342598 8567 return MEMORY_E;
wolfSSL 0:9d17e4342598 8568 }
wolfSSL 0:9d17e4342598 8569
wolfSSL 0:9d17e4342598 8570 ctx->serverDH_P.length = pSz;
wolfSSL 0:9d17e4342598 8571 ctx->serverDH_G.length = gSz;
wolfSSL 0:9d17e4342598 8572
wolfSSL 0:9d17e4342598 8573 XMEMCPY(ctx->serverDH_P.buffer, p, pSz);
wolfSSL 0:9d17e4342598 8574 XMEMCPY(ctx->serverDH_G.buffer, g, gSz);
wolfSSL 0:9d17e4342598 8575
wolfSSL 0:9d17e4342598 8576 ctx->haveDH = 1;
wolfSSL 0:9d17e4342598 8577
wolfSSL 0:9d17e4342598 8578 CYASSL_LEAVE("CyaSSL_CTX_SetTmpDH", 0);
wolfSSL 0:9d17e4342598 8579 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 8580 }
wolfSSL 0:9d17e4342598 8581 #endif /* !NO_CERTS */
wolfSSL 0:9d17e4342598 8582
wolfSSL 0:9d17e4342598 8583
wolfSSL 0:9d17e4342598 8584 char* CyaSSL_CIPHER_description(CYASSL_CIPHER* cipher, char* in, int len)
wolfSSL 0:9d17e4342598 8585 {
wolfSSL 0:9d17e4342598 8586 (void)cipher;
wolfSSL 0:9d17e4342598 8587 (void)in;
wolfSSL 0:9d17e4342598 8588 (void)len;
wolfSSL 0:9d17e4342598 8589 return 0;
wolfSSL 0:9d17e4342598 8590 }
wolfSSL 0:9d17e4342598 8591
wolfSSL 0:9d17e4342598 8592
wolfSSL 0:9d17e4342598 8593 CYASSL_SESSION* CyaSSL_get1_session(CYASSL* ssl) /* what's ref count */
wolfSSL 0:9d17e4342598 8594 {
wolfSSL 0:9d17e4342598 8595 (void)ssl;
wolfSSL 0:9d17e4342598 8596 return 0;
wolfSSL 0:9d17e4342598 8597 }
wolfSSL 0:9d17e4342598 8598
wolfSSL 0:9d17e4342598 8599
wolfSSL 0:9d17e4342598 8600 void CyaSSL_X509_free(CYASSL_X509* buf)
wolfSSL 0:9d17e4342598 8601 {
wolfSSL 0:9d17e4342598 8602 (void)buf;
wolfSSL 0:9d17e4342598 8603 }
wolfSSL 0:9d17e4342598 8604
wolfSSL 0:9d17e4342598 8605
wolfSSL 0:9d17e4342598 8606 /* was do nothing */
wolfSSL 0:9d17e4342598 8607 /*
wolfSSL 0:9d17e4342598 8608 void OPENSSL_free(void* buf)
wolfSSL 0:9d17e4342598 8609 {
wolfSSL 0:9d17e4342598 8610 (void)buf;
wolfSSL 0:9d17e4342598 8611 }
wolfSSL 0:9d17e4342598 8612 */
wolfSSL 0:9d17e4342598 8613
wolfSSL 0:9d17e4342598 8614
wolfSSL 0:9d17e4342598 8615 int CyaSSL_OCSP_parse_url(char* url, char** host, char** port, char** path,
wolfSSL 0:9d17e4342598 8616 int* ssl)
wolfSSL 0:9d17e4342598 8617 {
wolfSSL 0:9d17e4342598 8618 (void)url;
wolfSSL 0:9d17e4342598 8619 (void)host;
wolfSSL 0:9d17e4342598 8620 (void)port;
wolfSSL 0:9d17e4342598 8621 (void)path;
wolfSSL 0:9d17e4342598 8622 (void)ssl;
wolfSSL 0:9d17e4342598 8623 return 0;
wolfSSL 0:9d17e4342598 8624 }
wolfSSL 0:9d17e4342598 8625
wolfSSL 0:9d17e4342598 8626
wolfSSL 0:9d17e4342598 8627 CYASSL_METHOD* CyaSSLv2_client_method(void)
wolfSSL 0:9d17e4342598 8628 {
wolfSSL 0:9d17e4342598 8629 return 0;
wolfSSL 0:9d17e4342598 8630 }
wolfSSL 0:9d17e4342598 8631
wolfSSL 0:9d17e4342598 8632
wolfSSL 0:9d17e4342598 8633 CYASSL_METHOD* CyaSSLv2_server_method(void)
wolfSSL 0:9d17e4342598 8634 {
wolfSSL 0:9d17e4342598 8635 return 0;
wolfSSL 0:9d17e4342598 8636 }
wolfSSL 0:9d17e4342598 8637
wolfSSL 0:9d17e4342598 8638
wolfSSL 0:9d17e4342598 8639 #ifndef NO_MD4
wolfSSL 0:9d17e4342598 8640
wolfSSL 0:9d17e4342598 8641 void CyaSSL_MD4_Init(CYASSL_MD4_CTX* md4)
wolfSSL 0:9d17e4342598 8642 {
wolfSSL 0:9d17e4342598 8643 /* make sure we have a big enough buffer */
wolfSSL 0:9d17e4342598 8644 typedef char ok[sizeof(md4->buffer) >= sizeof(Md4) ? 1 : -1];
wolfSSL 0:9d17e4342598 8645 (void) sizeof(ok);
wolfSSL 0:9d17e4342598 8646
wolfSSL 0:9d17e4342598 8647 CYASSL_ENTER("MD4_Init");
wolfSSL 0:9d17e4342598 8648 InitMd4((Md4*)md4);
wolfSSL 0:9d17e4342598 8649 }
wolfSSL 0:9d17e4342598 8650
wolfSSL 0:9d17e4342598 8651
wolfSSL 0:9d17e4342598 8652 void CyaSSL_MD4_Update(CYASSL_MD4_CTX* md4, const void* data,
wolfSSL 0:9d17e4342598 8653 unsigned long len)
wolfSSL 0:9d17e4342598 8654 {
wolfSSL 0:9d17e4342598 8655 CYASSL_ENTER("MD4_Update");
wolfSSL 0:9d17e4342598 8656 Md4Update((Md4*)md4, (const byte*)data, (word32)len);
wolfSSL 0:9d17e4342598 8657 }
wolfSSL 0:9d17e4342598 8658
wolfSSL 0:9d17e4342598 8659
wolfSSL 0:9d17e4342598 8660 void CyaSSL_MD4_Final(unsigned char* digest, CYASSL_MD4_CTX* md4)
wolfSSL 0:9d17e4342598 8661 {
wolfSSL 0:9d17e4342598 8662 CYASSL_ENTER("MD4_Final");
wolfSSL 0:9d17e4342598 8663 Md4Final((Md4*)md4, digest);
wolfSSL 0:9d17e4342598 8664 }
wolfSSL 0:9d17e4342598 8665
wolfSSL 0:9d17e4342598 8666 #endif /* NO_MD4 */
wolfSSL 0:9d17e4342598 8667
wolfSSL 0:9d17e4342598 8668
wolfSSL 0:9d17e4342598 8669 CYASSL_BIO* CyaSSL_BIO_pop(CYASSL_BIO* top)
wolfSSL 0:9d17e4342598 8670 {
wolfSSL 0:9d17e4342598 8671 (void)top;
wolfSSL 0:9d17e4342598 8672 return 0;
wolfSSL 0:9d17e4342598 8673 }
wolfSSL 0:9d17e4342598 8674
wolfSSL 0:9d17e4342598 8675
wolfSSL 0:9d17e4342598 8676 int CyaSSL_BIO_pending(CYASSL_BIO* bio)
wolfSSL 0:9d17e4342598 8677 {
wolfSSL 0:9d17e4342598 8678 (void)bio;
wolfSSL 0:9d17e4342598 8679 return 0;
wolfSSL 0:9d17e4342598 8680 }
wolfSSL 0:9d17e4342598 8681
wolfSSL 0:9d17e4342598 8682
wolfSSL 0:9d17e4342598 8683
wolfSSL 0:9d17e4342598 8684 CYASSL_BIO_METHOD* CyaSSL_BIO_s_mem(void)
wolfSSL 0:9d17e4342598 8685 {
wolfSSL 0:9d17e4342598 8686 static CYASSL_BIO_METHOD meth;
wolfSSL 0:9d17e4342598 8687
wolfSSL 0:9d17e4342598 8688 CYASSL_ENTER("BIO_s_mem");
wolfSSL 0:9d17e4342598 8689 meth.type = BIO_MEMORY;
wolfSSL 0:9d17e4342598 8690
wolfSSL 0:9d17e4342598 8691 return &meth;
wolfSSL 0:9d17e4342598 8692 }
wolfSSL 0:9d17e4342598 8693
wolfSSL 0:9d17e4342598 8694
wolfSSL 0:9d17e4342598 8695 CYASSL_BIO_METHOD* CyaSSL_BIO_f_base64(void)
wolfSSL 0:9d17e4342598 8696 {
wolfSSL 0:9d17e4342598 8697 return 0;
wolfSSL 0:9d17e4342598 8698 }
wolfSSL 0:9d17e4342598 8699
wolfSSL 0:9d17e4342598 8700
wolfSSL 0:9d17e4342598 8701 void CyaSSL_BIO_set_flags(CYASSL_BIO* bio, int flags)
wolfSSL 0:9d17e4342598 8702 {
wolfSSL 0:9d17e4342598 8703 (void)bio;
wolfSSL 0:9d17e4342598 8704 (void)flags;
wolfSSL 0:9d17e4342598 8705 }
wolfSSL 0:9d17e4342598 8706
wolfSSL 0:9d17e4342598 8707
wolfSSL 0:9d17e4342598 8708
wolfSSL 0:9d17e4342598 8709 void CyaSSL_RAND_screen(void)
wolfSSL 0:9d17e4342598 8710 {
wolfSSL 0:9d17e4342598 8711
wolfSSL 0:9d17e4342598 8712 }
wolfSSL 0:9d17e4342598 8713
wolfSSL 0:9d17e4342598 8714
wolfSSL 0:9d17e4342598 8715 const char* CyaSSL_RAND_file_name(char* fname, unsigned long len)
wolfSSL 0:9d17e4342598 8716 {
wolfSSL 0:9d17e4342598 8717 (void)fname;
wolfSSL 0:9d17e4342598 8718 (void)len;
wolfSSL 0:9d17e4342598 8719 return 0;
wolfSSL 0:9d17e4342598 8720 }
wolfSSL 0:9d17e4342598 8721
wolfSSL 0:9d17e4342598 8722
wolfSSL 0:9d17e4342598 8723 int CyaSSL_RAND_write_file(const char* fname)
wolfSSL 0:9d17e4342598 8724 {
wolfSSL 0:9d17e4342598 8725 (void)fname;
wolfSSL 0:9d17e4342598 8726 return 0;
wolfSSL 0:9d17e4342598 8727 }
wolfSSL 0:9d17e4342598 8728
wolfSSL 0:9d17e4342598 8729
wolfSSL 0:9d17e4342598 8730 int CyaSSL_RAND_load_file(const char* fname, long len)
wolfSSL 0:9d17e4342598 8731 {
wolfSSL 0:9d17e4342598 8732 (void)fname;
wolfSSL 0:9d17e4342598 8733 /* CTaoCrypt provides enough entropy internally or will report error */
wolfSSL 0:9d17e4342598 8734 if (len == -1)
wolfSSL 0:9d17e4342598 8735 return 1024;
wolfSSL 0:9d17e4342598 8736 else
wolfSSL 0:9d17e4342598 8737 return (int)len;
wolfSSL 0:9d17e4342598 8738 }
wolfSSL 0:9d17e4342598 8739
wolfSSL 0:9d17e4342598 8740
wolfSSL 0:9d17e4342598 8741 int CyaSSL_RAND_egd(const char* path)
wolfSSL 0:9d17e4342598 8742 {
wolfSSL 0:9d17e4342598 8743 (void)path;
wolfSSL 0:9d17e4342598 8744 return 0;
wolfSSL 0:9d17e4342598 8745 }
wolfSSL 0:9d17e4342598 8746
wolfSSL 0:9d17e4342598 8747
wolfSSL 0:9d17e4342598 8748
wolfSSL 0:9d17e4342598 8749 CYASSL_COMP_METHOD* CyaSSL_COMP_zlib(void)
wolfSSL 0:9d17e4342598 8750 {
wolfSSL 0:9d17e4342598 8751 return 0;
wolfSSL 0:9d17e4342598 8752 }
wolfSSL 0:9d17e4342598 8753
wolfSSL 0:9d17e4342598 8754
wolfSSL 0:9d17e4342598 8755 CYASSL_COMP_METHOD* CyaSSL_COMP_rle(void)
wolfSSL 0:9d17e4342598 8756 {
wolfSSL 0:9d17e4342598 8757 return 0;
wolfSSL 0:9d17e4342598 8758 }
wolfSSL 0:9d17e4342598 8759
wolfSSL 0:9d17e4342598 8760
wolfSSL 0:9d17e4342598 8761 int CyaSSL_COMP_add_compression_method(int method, void* data)
wolfSSL 0:9d17e4342598 8762 {
wolfSSL 0:9d17e4342598 8763 (void)method;
wolfSSL 0:9d17e4342598 8764 (void)data;
wolfSSL 0:9d17e4342598 8765 return 0;
wolfSSL 0:9d17e4342598 8766 }
wolfSSL 0:9d17e4342598 8767
wolfSSL 0:9d17e4342598 8768
wolfSSL 0:9d17e4342598 8769
wolfSSL 0:9d17e4342598 8770 int CyaSSL_get_ex_new_index(long idx, void* data, void* cb1, void* cb2,
wolfSSL 0:9d17e4342598 8771 void* cb3)
wolfSSL 0:9d17e4342598 8772 {
wolfSSL 0:9d17e4342598 8773 (void)idx;
wolfSSL 0:9d17e4342598 8774 (void)data;
wolfSSL 0:9d17e4342598 8775 (void)cb1;
wolfSSL 0:9d17e4342598 8776 (void)cb2;
wolfSSL 0:9d17e4342598 8777 (void)cb3;
wolfSSL 0:9d17e4342598 8778 return 0;
wolfSSL 0:9d17e4342598 8779 }
wolfSSL 0:9d17e4342598 8780
wolfSSL 0:9d17e4342598 8781
wolfSSL 0:9d17e4342598 8782 void CyaSSL_set_dynlock_create_callback(CYASSL_dynlock_value* (*f)(
wolfSSL 0:9d17e4342598 8783 const char*, int))
wolfSSL 0:9d17e4342598 8784 {
wolfSSL 0:9d17e4342598 8785 (void)f;
wolfSSL 0:9d17e4342598 8786 }
wolfSSL 0:9d17e4342598 8787
wolfSSL 0:9d17e4342598 8788
wolfSSL 0:9d17e4342598 8789 void CyaSSL_set_dynlock_lock_callback(
wolfSSL 0:9d17e4342598 8790 void (*f)(int, CYASSL_dynlock_value*, const char*, int))
wolfSSL 0:9d17e4342598 8791 {
wolfSSL 0:9d17e4342598 8792 (void)f;
wolfSSL 0:9d17e4342598 8793 }
wolfSSL 0:9d17e4342598 8794
wolfSSL 0:9d17e4342598 8795
wolfSSL 0:9d17e4342598 8796 void CyaSSL_set_dynlock_destroy_callback(
wolfSSL 0:9d17e4342598 8797 void (*f)(CYASSL_dynlock_value*, const char*, int))
wolfSSL 0:9d17e4342598 8798 {
wolfSSL 0:9d17e4342598 8799 (void)f;
wolfSSL 0:9d17e4342598 8800 }
wolfSSL 0:9d17e4342598 8801
wolfSSL 0:9d17e4342598 8802
wolfSSL 0:9d17e4342598 8803
wolfSSL 0:9d17e4342598 8804 const char* CyaSSL_X509_verify_cert_error_string(long err)
wolfSSL 0:9d17e4342598 8805 {
wolfSSL 0:9d17e4342598 8806 (void)err;
wolfSSL 0:9d17e4342598 8807 return 0;
wolfSSL 0:9d17e4342598 8808 }
wolfSSL 0:9d17e4342598 8809
wolfSSL 0:9d17e4342598 8810
wolfSSL 0:9d17e4342598 8811
wolfSSL 0:9d17e4342598 8812 int CyaSSL_X509_LOOKUP_add_dir(CYASSL_X509_LOOKUP* lookup, const char* dir,
wolfSSL 0:9d17e4342598 8813 long len)
wolfSSL 0:9d17e4342598 8814 {
wolfSSL 0:9d17e4342598 8815 (void)lookup;
wolfSSL 0:9d17e4342598 8816 (void)dir;
wolfSSL 0:9d17e4342598 8817 (void)len;
wolfSSL 0:9d17e4342598 8818 return 0;
wolfSSL 0:9d17e4342598 8819 }
wolfSSL 0:9d17e4342598 8820
wolfSSL 0:9d17e4342598 8821
wolfSSL 0:9d17e4342598 8822 int CyaSSL_X509_LOOKUP_load_file(CYASSL_X509_LOOKUP* lookup,
wolfSSL 0:9d17e4342598 8823 const char* file, long len)
wolfSSL 0:9d17e4342598 8824 {
wolfSSL 0:9d17e4342598 8825 (void)lookup;
wolfSSL 0:9d17e4342598 8826 (void)file;
wolfSSL 0:9d17e4342598 8827 (void)len;
wolfSSL 0:9d17e4342598 8828 return 0;
wolfSSL 0:9d17e4342598 8829 }
wolfSSL 0:9d17e4342598 8830
wolfSSL 0:9d17e4342598 8831
wolfSSL 0:9d17e4342598 8832 CYASSL_X509_LOOKUP_METHOD* CyaSSL_X509_LOOKUP_hash_dir(void)
wolfSSL 0:9d17e4342598 8833 {
wolfSSL 0:9d17e4342598 8834 return 0;
wolfSSL 0:9d17e4342598 8835 }
wolfSSL 0:9d17e4342598 8836
wolfSSL 0:9d17e4342598 8837
wolfSSL 0:9d17e4342598 8838 CYASSL_X509_LOOKUP_METHOD* CyaSSL_X509_LOOKUP_file(void)
wolfSSL 0:9d17e4342598 8839 {
wolfSSL 0:9d17e4342598 8840 return 0;
wolfSSL 0:9d17e4342598 8841 }
wolfSSL 0:9d17e4342598 8842
wolfSSL 0:9d17e4342598 8843
wolfSSL 0:9d17e4342598 8844
wolfSSL 0:9d17e4342598 8845 CYASSL_X509_LOOKUP* CyaSSL_X509_STORE_add_lookup(CYASSL_X509_STORE* store,
wolfSSL 0:9d17e4342598 8846 CYASSL_X509_LOOKUP_METHOD* m)
wolfSSL 0:9d17e4342598 8847 {
wolfSSL 0:9d17e4342598 8848 (void)store;
wolfSSL 0:9d17e4342598 8849 (void)m;
wolfSSL 0:9d17e4342598 8850 return 0;
wolfSSL 0:9d17e4342598 8851 }
wolfSSL 0:9d17e4342598 8852
wolfSSL 0:9d17e4342598 8853
wolfSSL 0:9d17e4342598 8854 int CyaSSL_X509_STORE_add_cert(CYASSL_X509_STORE* store, CYASSL_X509* x509)
wolfSSL 0:9d17e4342598 8855 {
wolfSSL 0:9d17e4342598 8856 int result = SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 8857
wolfSSL 0:9d17e4342598 8858 CYASSL_ENTER("CyaSSL_X509_STORE_add_cert");
wolfSSL 0:9d17e4342598 8859 if (store != NULL && store->cm != NULL && x509 != NULL) {
wolfSSL 0:9d17e4342598 8860 buffer derCert;
wolfSSL 0:9d17e4342598 8861 derCert.buffer = (byte*)XMALLOC(x509->derCert.length,
wolfSSL 0:9d17e4342598 8862 NULL, DYNAMIC_TYPE_CERT);
wolfSSL 0:9d17e4342598 8863 if (derCert.buffer != NULL) {
wolfSSL 0:9d17e4342598 8864 derCert.length = x509->derCert.length;
wolfSSL 0:9d17e4342598 8865 // AddCA() frees the buffer.
wolfSSL 0:9d17e4342598 8866 XMEMCPY(derCert.buffer,
wolfSSL 0:9d17e4342598 8867 x509->derCert.buffer, x509->derCert.length);
wolfSSL 0:9d17e4342598 8868 result = AddCA(store->cm, derCert, CYASSL_USER_CA, 1);
wolfSSL 0:9d17e4342598 8869 if (result != SSL_SUCCESS) result = SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 8870 }
wolfSSL 0:9d17e4342598 8871 }
wolfSSL 0:9d17e4342598 8872
wolfSSL 0:9d17e4342598 8873 CYASSL_LEAVE("CyaSSL_X509_STORE_add_cert", result);
wolfSSL 0:9d17e4342598 8874 return result;
wolfSSL 0:9d17e4342598 8875 }
wolfSSL 0:9d17e4342598 8876
wolfSSL 0:9d17e4342598 8877
wolfSSL 0:9d17e4342598 8878 CYASSL_X509_STORE* CyaSSL_X509_STORE_new(void)
wolfSSL 0:9d17e4342598 8879 {
wolfSSL 0:9d17e4342598 8880 CYASSL_X509_STORE* store = NULL;
wolfSSL 0:9d17e4342598 8881
wolfSSL 0:9d17e4342598 8882 store = (CYASSL_X509_STORE*)XMALLOC(sizeof(CYASSL_X509_STORE), NULL, 0);
wolfSSL 0:9d17e4342598 8883 if (store != NULL) {
wolfSSL 0:9d17e4342598 8884 store->cm = CyaSSL_CertManagerNew();
wolfSSL 0:9d17e4342598 8885 if (store->cm == NULL) {
wolfSSL 0:9d17e4342598 8886 XFREE(store, NULL, 0);
wolfSSL 0:9d17e4342598 8887 store = NULL;
wolfSSL 0:9d17e4342598 8888 }
wolfSSL 0:9d17e4342598 8889 }
wolfSSL 0:9d17e4342598 8890
wolfSSL 0:9d17e4342598 8891 return store;
wolfSSL 0:9d17e4342598 8892 }
wolfSSL 0:9d17e4342598 8893
wolfSSL 0:9d17e4342598 8894
wolfSSL 0:9d17e4342598 8895 void CyaSSL_X509_STORE_free(CYASSL_X509_STORE* store)
wolfSSL 0:9d17e4342598 8896 {
wolfSSL 0:9d17e4342598 8897 if (store != NULL) {
wolfSSL 0:9d17e4342598 8898 if (store->cm != NULL)
wolfSSL 0:9d17e4342598 8899 CyaSSL_CertManagerFree(store->cm);
wolfSSL 0:9d17e4342598 8900 XFREE(store, NULL, 0);
wolfSSL 0:9d17e4342598 8901 }
wolfSSL 0:9d17e4342598 8902 }
wolfSSL 0:9d17e4342598 8903
wolfSSL 0:9d17e4342598 8904
wolfSSL 0:9d17e4342598 8905 int CyaSSL_X509_STORE_set_default_paths(CYASSL_X509_STORE* store)
wolfSSL 0:9d17e4342598 8906 {
wolfSSL 0:9d17e4342598 8907 (void)store;
wolfSSL 0:9d17e4342598 8908 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 8909 }
wolfSSL 0:9d17e4342598 8910
wolfSSL 0:9d17e4342598 8911
wolfSSL 0:9d17e4342598 8912 int CyaSSL_X509_STORE_get_by_subject(CYASSL_X509_STORE_CTX* ctx, int idx,
wolfSSL 0:9d17e4342598 8913 CYASSL_X509_NAME* name, CYASSL_X509_OBJECT* obj)
wolfSSL 0:9d17e4342598 8914 {
wolfSSL 0:9d17e4342598 8915 (void)ctx;
wolfSSL 0:9d17e4342598 8916 (void)idx;
wolfSSL 0:9d17e4342598 8917 (void)name;
wolfSSL 0:9d17e4342598 8918 (void)obj;
wolfSSL 0:9d17e4342598 8919 return 0;
wolfSSL 0:9d17e4342598 8920 }
wolfSSL 0:9d17e4342598 8921
wolfSSL 0:9d17e4342598 8922
wolfSSL 0:9d17e4342598 8923 CYASSL_X509_STORE_CTX* CyaSSL_X509_STORE_CTX_new(void)
wolfSSL 0:9d17e4342598 8924 {
wolfSSL 0:9d17e4342598 8925 CYASSL_X509_STORE_CTX* ctx = (CYASSL_X509_STORE_CTX*)XMALLOC(
wolfSSL 0:9d17e4342598 8926 sizeof(CYASSL_X509_STORE_CTX), NULL, 0);
wolfSSL 0:9d17e4342598 8927
wolfSSL 0:9d17e4342598 8928 if (ctx != NULL)
wolfSSL 0:9d17e4342598 8929 CyaSSL_X509_STORE_CTX_init(ctx, NULL, NULL, NULL);
wolfSSL 0:9d17e4342598 8930
wolfSSL 0:9d17e4342598 8931 return ctx;
wolfSSL 0:9d17e4342598 8932 }
wolfSSL 0:9d17e4342598 8933
wolfSSL 0:9d17e4342598 8934
wolfSSL 0:9d17e4342598 8935 int CyaSSL_X509_STORE_CTX_init(CYASSL_X509_STORE_CTX* ctx,
wolfSSL 0:9d17e4342598 8936 CYASSL_X509_STORE* store, CYASSL_X509* x509, STACK_OF(CYASSL_X509)* sk)
wolfSSL 0:9d17e4342598 8937 {
wolfSSL 0:9d17e4342598 8938 (void)sk;
wolfSSL 0:9d17e4342598 8939 if (ctx != NULL) {
wolfSSL 0:9d17e4342598 8940 ctx->store = store;
wolfSSL 0:9d17e4342598 8941 ctx->current_cert = x509;
wolfSSL 0:9d17e4342598 8942 ctx->domain = NULL;
wolfSSL 0:9d17e4342598 8943 ctx->ex_data = NULL;
wolfSSL 0:9d17e4342598 8944 ctx->userCtx = NULL;
wolfSSL 0:9d17e4342598 8945 ctx->error = 0;
wolfSSL 0:9d17e4342598 8946 ctx->error_depth = 0;
wolfSSL 0:9d17e4342598 8947 ctx->discardSessionCerts = 0;
wolfSSL 0:9d17e4342598 8948 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 8949 }
wolfSSL 0:9d17e4342598 8950 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 8951 }
wolfSSL 0:9d17e4342598 8952
wolfSSL 0:9d17e4342598 8953
wolfSSL 0:9d17e4342598 8954 void CyaSSL_X509_STORE_CTX_free(CYASSL_X509_STORE_CTX* ctx)
wolfSSL 0:9d17e4342598 8955 {
wolfSSL 0:9d17e4342598 8956 if (ctx != NULL) {
wolfSSL 0:9d17e4342598 8957 if (ctx->store != NULL)
wolfSSL 0:9d17e4342598 8958 CyaSSL_X509_STORE_free(ctx->store);
wolfSSL 0:9d17e4342598 8959 if (ctx->current_cert != NULL)
wolfSSL 0:9d17e4342598 8960 CyaSSL_FreeX509(ctx->current_cert);
wolfSSL 0:9d17e4342598 8961 XFREE(ctx, NULL, 0);
wolfSSL 0:9d17e4342598 8962 }
wolfSSL 0:9d17e4342598 8963 }
wolfSSL 0:9d17e4342598 8964
wolfSSL 0:9d17e4342598 8965
wolfSSL 0:9d17e4342598 8966 void CyaSSL_X509_STORE_CTX_cleanup(CYASSL_X509_STORE_CTX* ctx)
wolfSSL 0:9d17e4342598 8967 {
wolfSSL 0:9d17e4342598 8968 (void)ctx;
wolfSSL 0:9d17e4342598 8969 }
wolfSSL 0:9d17e4342598 8970
wolfSSL 0:9d17e4342598 8971
wolfSSL 0:9d17e4342598 8972 int CyaSSL_X509_verify_cert(CYASSL_X509_STORE_CTX* ctx)
wolfSSL 0:9d17e4342598 8973 {
wolfSSL 0:9d17e4342598 8974 if (ctx != NULL && ctx->store != NULL && ctx->store->cm != NULL
wolfSSL 0:9d17e4342598 8975 && ctx->current_cert != NULL) {
wolfSSL 0:9d17e4342598 8976 return CyaSSL_CertManagerVerifyBuffer(ctx->store->cm,
wolfSSL 0:9d17e4342598 8977 ctx->current_cert->derCert.buffer,
wolfSSL 0:9d17e4342598 8978 ctx->current_cert->derCert.length,
wolfSSL 0:9d17e4342598 8979 SSL_FILETYPE_ASN1);
wolfSSL 0:9d17e4342598 8980 }
wolfSSL 0:9d17e4342598 8981 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 8982 }
wolfSSL 0:9d17e4342598 8983
wolfSSL 0:9d17e4342598 8984
wolfSSL 0:9d17e4342598 8985 CYASSL_ASN1_TIME* CyaSSL_X509_CRL_get_lastUpdate(CYASSL_X509_CRL* crl)
wolfSSL 0:9d17e4342598 8986 {
wolfSSL 0:9d17e4342598 8987 (void)crl;
wolfSSL 0:9d17e4342598 8988 return 0;
wolfSSL 0:9d17e4342598 8989 }
wolfSSL 0:9d17e4342598 8990
wolfSSL 0:9d17e4342598 8991
wolfSSL 0:9d17e4342598 8992 CYASSL_ASN1_TIME* CyaSSL_X509_CRL_get_nextUpdate(CYASSL_X509_CRL* crl)
wolfSSL 0:9d17e4342598 8993 {
wolfSSL 0:9d17e4342598 8994 (void)crl;
wolfSSL 0:9d17e4342598 8995 return 0;
wolfSSL 0:9d17e4342598 8996 }
wolfSSL 0:9d17e4342598 8997
wolfSSL 0:9d17e4342598 8998
wolfSSL 0:9d17e4342598 8999
wolfSSL 0:9d17e4342598 9000 CYASSL_EVP_PKEY* CyaSSL_X509_get_pubkey(CYASSL_X509* x509)
wolfSSL 0:9d17e4342598 9001 {
wolfSSL 0:9d17e4342598 9002 CYASSL_EVP_PKEY* key = NULL;
wolfSSL 0:9d17e4342598 9003 if (x509 != NULL) {
wolfSSL 0:9d17e4342598 9004 key = (CYASSL_EVP_PKEY*)XMALLOC(
wolfSSL 0:9d17e4342598 9005 sizeof(CYASSL_EVP_PKEY), NULL, DYNAMIC_TYPE_PUBLIC_KEY);
wolfSSL 0:9d17e4342598 9006 if (key != NULL) {
wolfSSL 0:9d17e4342598 9007 key->type = x509->pubKeyOID;
wolfSSL 0:9d17e4342598 9008 key->save_type = 0;
wolfSSL 0:9d17e4342598 9009 key->pkey.ptr = (char*)XMALLOC(
wolfSSL 0:9d17e4342598 9010 x509->pubKey.length, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
wolfSSL 0:9d17e4342598 9011 if (key->pkey.ptr == NULL) {
wolfSSL 0:9d17e4342598 9012 XFREE(key, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
wolfSSL 0:9d17e4342598 9013 return NULL;
wolfSSL 0:9d17e4342598 9014 }
wolfSSL 0:9d17e4342598 9015 XMEMCPY(key->pkey.ptr,
wolfSSL 0:9d17e4342598 9016 x509->pubKey.buffer, x509->pubKey.length);
wolfSSL 0:9d17e4342598 9017 key->pkey_sz = x509->pubKey.length;
wolfSSL 0:9d17e4342598 9018 #ifdef HAVE_ECC
wolfSSL 0:9d17e4342598 9019 key->pkey_curve = (int)x509->pkCurveOID;
wolfSSL 0:9d17e4342598 9020 #endif /* HAVE_ECC */
wolfSSL 0:9d17e4342598 9021 }
wolfSSL 0:9d17e4342598 9022 }
wolfSSL 0:9d17e4342598 9023 return key;
wolfSSL 0:9d17e4342598 9024 }
wolfSSL 0:9d17e4342598 9025
wolfSSL 0:9d17e4342598 9026
wolfSSL 0:9d17e4342598 9027 int CyaSSL_X509_CRL_verify(CYASSL_X509_CRL* crl, CYASSL_EVP_PKEY* key)
wolfSSL 0:9d17e4342598 9028 {
wolfSSL 0:9d17e4342598 9029 (void)crl;
wolfSSL 0:9d17e4342598 9030 (void)key;
wolfSSL 0:9d17e4342598 9031 return 0;
wolfSSL 0:9d17e4342598 9032 }
wolfSSL 0:9d17e4342598 9033
wolfSSL 0:9d17e4342598 9034
wolfSSL 0:9d17e4342598 9035 void CyaSSL_X509_STORE_CTX_set_error(CYASSL_X509_STORE_CTX* ctx, int err)
wolfSSL 0:9d17e4342598 9036 {
wolfSSL 0:9d17e4342598 9037 (void)ctx;
wolfSSL 0:9d17e4342598 9038 (void)err;
wolfSSL 0:9d17e4342598 9039 }
wolfSSL 0:9d17e4342598 9040
wolfSSL 0:9d17e4342598 9041
wolfSSL 0:9d17e4342598 9042 void CyaSSL_X509_OBJECT_free_contents(CYASSL_X509_OBJECT* obj)
wolfSSL 0:9d17e4342598 9043 {
wolfSSL 0:9d17e4342598 9044 (void)obj;
wolfSSL 0:9d17e4342598 9045 }
wolfSSL 0:9d17e4342598 9046
wolfSSL 0:9d17e4342598 9047
wolfSSL 0:9d17e4342598 9048 void CyaSSL_EVP_PKEY_free(CYASSL_EVP_PKEY* key)
wolfSSL 0:9d17e4342598 9049 {
wolfSSL 0:9d17e4342598 9050 if (key != NULL) {
wolfSSL 0:9d17e4342598 9051 if (key->pkey.ptr != NULL)
wolfSSL 0:9d17e4342598 9052 XFREE(key->pkey.ptr, NULL, 0);
wolfSSL 0:9d17e4342598 9053 XFREE(key, NULL, 0);
wolfSSL 0:9d17e4342598 9054 }
wolfSSL 0:9d17e4342598 9055 }
wolfSSL 0:9d17e4342598 9056
wolfSSL 0:9d17e4342598 9057
wolfSSL 0:9d17e4342598 9058 int CyaSSL_X509_cmp_current_time(const CYASSL_ASN1_TIME* asnTime)
wolfSSL 0:9d17e4342598 9059 {
wolfSSL 0:9d17e4342598 9060 (void)asnTime;
wolfSSL 0:9d17e4342598 9061 return 0;
wolfSSL 0:9d17e4342598 9062 }
wolfSSL 0:9d17e4342598 9063
wolfSSL 0:9d17e4342598 9064
wolfSSL 0:9d17e4342598 9065 int CyaSSL_sk_X509_REVOKED_num(CYASSL_X509_REVOKED* revoked)
wolfSSL 0:9d17e4342598 9066 {
wolfSSL 0:9d17e4342598 9067 (void)revoked;
wolfSSL 0:9d17e4342598 9068 return 0;
wolfSSL 0:9d17e4342598 9069 }
wolfSSL 0:9d17e4342598 9070
wolfSSL 0:9d17e4342598 9071
wolfSSL 0:9d17e4342598 9072
wolfSSL 0:9d17e4342598 9073 CYASSL_X509_REVOKED* CyaSSL_X509_CRL_get_REVOKED(CYASSL_X509_CRL* crl)
wolfSSL 0:9d17e4342598 9074 {
wolfSSL 0:9d17e4342598 9075 (void)crl;
wolfSSL 0:9d17e4342598 9076 return 0;
wolfSSL 0:9d17e4342598 9077 }
wolfSSL 0:9d17e4342598 9078
wolfSSL 0:9d17e4342598 9079
wolfSSL 0:9d17e4342598 9080 CYASSL_X509_REVOKED* CyaSSL_sk_X509_REVOKED_value(
wolfSSL 0:9d17e4342598 9081 CYASSL_X509_REVOKED* revoked, int value)
wolfSSL 0:9d17e4342598 9082 {
wolfSSL 0:9d17e4342598 9083 (void)revoked;
wolfSSL 0:9d17e4342598 9084 (void)value;
wolfSSL 0:9d17e4342598 9085 return 0;
wolfSSL 0:9d17e4342598 9086 }
wolfSSL 0:9d17e4342598 9087
wolfSSL 0:9d17e4342598 9088
wolfSSL 0:9d17e4342598 9089
wolfSSL 0:9d17e4342598 9090 CYASSL_ASN1_INTEGER* CyaSSL_X509_get_serialNumber(CYASSL_X509* x509)
wolfSSL 0:9d17e4342598 9091 {
wolfSSL 0:9d17e4342598 9092 (void)x509;
wolfSSL 0:9d17e4342598 9093 return 0;
wolfSSL 0:9d17e4342598 9094 }
wolfSSL 0:9d17e4342598 9095
wolfSSL 0:9d17e4342598 9096
wolfSSL 0:9d17e4342598 9097 int CyaSSL_ASN1_TIME_print(CYASSL_BIO* bio, const CYASSL_ASN1_TIME* asnTime)
wolfSSL 0:9d17e4342598 9098 {
wolfSSL 0:9d17e4342598 9099 (void)bio;
wolfSSL 0:9d17e4342598 9100 (void)asnTime;
wolfSSL 0:9d17e4342598 9101 return 0;
wolfSSL 0:9d17e4342598 9102 }
wolfSSL 0:9d17e4342598 9103
wolfSSL 0:9d17e4342598 9104
wolfSSL 0:9d17e4342598 9105
wolfSSL 0:9d17e4342598 9106 int CyaSSL_ASN1_INTEGER_cmp(const CYASSL_ASN1_INTEGER* a,
wolfSSL 0:9d17e4342598 9107 const CYASSL_ASN1_INTEGER* b)
wolfSSL 0:9d17e4342598 9108 {
wolfSSL 0:9d17e4342598 9109 (void)a;
wolfSSL 0:9d17e4342598 9110 (void)b;
wolfSSL 0:9d17e4342598 9111 return 0;
wolfSSL 0:9d17e4342598 9112 }
wolfSSL 0:9d17e4342598 9113
wolfSSL 0:9d17e4342598 9114
wolfSSL 0:9d17e4342598 9115 long CyaSSL_ASN1_INTEGER_get(const CYASSL_ASN1_INTEGER* i)
wolfSSL 0:9d17e4342598 9116 {
wolfSSL 0:9d17e4342598 9117 (void)i;
wolfSSL 0:9d17e4342598 9118 return 0;
wolfSSL 0:9d17e4342598 9119 }
wolfSSL 0:9d17e4342598 9120
wolfSSL 0:9d17e4342598 9121
wolfSSL 0:9d17e4342598 9122
wolfSSL 0:9d17e4342598 9123 void* CyaSSL_X509_STORE_CTX_get_ex_data(CYASSL_X509_STORE_CTX* ctx, int idx)
wolfSSL 0:9d17e4342598 9124 {
wolfSSL 0:9d17e4342598 9125 #ifdef FORTRESS
wolfSSL 0:9d17e4342598 9126 if (ctx != NULL && idx == 0)
wolfSSL 0:9d17e4342598 9127 return ctx->ex_data;
wolfSSL 0:9d17e4342598 9128 #else
wolfSSL 0:9d17e4342598 9129 (void)ctx;
wolfSSL 0:9d17e4342598 9130 (void)idx;
wolfSSL 0:9d17e4342598 9131 #endif
wolfSSL 0:9d17e4342598 9132 return 0;
wolfSSL 0:9d17e4342598 9133 }
wolfSSL 0:9d17e4342598 9134
wolfSSL 0:9d17e4342598 9135
wolfSSL 0:9d17e4342598 9136 int CyaSSL_get_ex_data_X509_STORE_CTX_idx(void)
wolfSSL 0:9d17e4342598 9137 {
wolfSSL 0:9d17e4342598 9138 return 0;
wolfSSL 0:9d17e4342598 9139 }
wolfSSL 0:9d17e4342598 9140
wolfSSL 0:9d17e4342598 9141
wolfSSL 0:9d17e4342598 9142 void* CyaSSL_get_ex_data(const CYASSL* ssl, int idx)
wolfSSL 0:9d17e4342598 9143 {
wolfSSL 0:9d17e4342598 9144 #ifdef FORTRESS
wolfSSL 0:9d17e4342598 9145 if (ssl != NULL && idx < MAX_EX_DATA)
wolfSSL 0:9d17e4342598 9146 return ssl->ex_data[idx];
wolfSSL 0:9d17e4342598 9147 #else
wolfSSL 0:9d17e4342598 9148 (void)ssl;
wolfSSL 0:9d17e4342598 9149 (void)idx;
wolfSSL 0:9d17e4342598 9150 #endif
wolfSSL 0:9d17e4342598 9151 return 0;
wolfSSL 0:9d17e4342598 9152 }
wolfSSL 0:9d17e4342598 9153
wolfSSL 0:9d17e4342598 9154
wolfSSL 0:9d17e4342598 9155 void CyaSSL_CTX_set_info_callback(CYASSL_CTX* ctx, void (*f)(void))
wolfSSL 0:9d17e4342598 9156 {
wolfSSL 0:9d17e4342598 9157 (void)ctx;
wolfSSL 0:9d17e4342598 9158 (void)f;
wolfSSL 0:9d17e4342598 9159 }
wolfSSL 0:9d17e4342598 9160
wolfSSL 0:9d17e4342598 9161
wolfSSL 0:9d17e4342598 9162 unsigned long CyaSSL_ERR_peek_error(void)
wolfSSL 0:9d17e4342598 9163 {
wolfSSL 0:9d17e4342598 9164 return 0;
wolfSSL 0:9d17e4342598 9165 }
wolfSSL 0:9d17e4342598 9166
wolfSSL 0:9d17e4342598 9167
wolfSSL 0:9d17e4342598 9168 int CyaSSL_ERR_GET_REASON(int err)
wolfSSL 0:9d17e4342598 9169 {
wolfSSL 0:9d17e4342598 9170 (void)err;
wolfSSL 0:9d17e4342598 9171 return 0;
wolfSSL 0:9d17e4342598 9172 }
wolfSSL 0:9d17e4342598 9173
wolfSSL 0:9d17e4342598 9174
wolfSSL 0:9d17e4342598 9175 char* CyaSSL_alert_type_string_long(int alertID)
wolfSSL 0:9d17e4342598 9176 {
wolfSSL 0:9d17e4342598 9177 (void)alertID;
wolfSSL 0:9d17e4342598 9178 return 0;
wolfSSL 0:9d17e4342598 9179 }
wolfSSL 0:9d17e4342598 9180
wolfSSL 0:9d17e4342598 9181
wolfSSL 0:9d17e4342598 9182 char* CyaSSL_alert_desc_string_long(int alertID)
wolfSSL 0:9d17e4342598 9183 {
wolfSSL 0:9d17e4342598 9184 (void)alertID;
wolfSSL 0:9d17e4342598 9185 return 0;
wolfSSL 0:9d17e4342598 9186 }
wolfSSL 0:9d17e4342598 9187
wolfSSL 0:9d17e4342598 9188
wolfSSL 0:9d17e4342598 9189 char* CyaSSL_state_string_long(CYASSL* ssl)
wolfSSL 0:9d17e4342598 9190 {
wolfSSL 0:9d17e4342598 9191 (void)ssl;
wolfSSL 0:9d17e4342598 9192 return 0;
wolfSSL 0:9d17e4342598 9193 }
wolfSSL 0:9d17e4342598 9194
wolfSSL 0:9d17e4342598 9195
wolfSSL 0:9d17e4342598 9196 int CyaSSL_PEM_def_callback(char* name, int num, int w, void* key)
wolfSSL 0:9d17e4342598 9197 {
wolfSSL 0:9d17e4342598 9198 (void)name;
wolfSSL 0:9d17e4342598 9199 (void)num;
wolfSSL 0:9d17e4342598 9200 (void)w;
wolfSSL 0:9d17e4342598 9201 (void)key;
wolfSSL 0:9d17e4342598 9202 return 0;
wolfSSL 0:9d17e4342598 9203 }
wolfSSL 0:9d17e4342598 9204
wolfSSL 0:9d17e4342598 9205
wolfSSL 0:9d17e4342598 9206 long CyaSSL_CTX_sess_accept(CYASSL_CTX* ctx)
wolfSSL 0:9d17e4342598 9207 {
wolfSSL 0:9d17e4342598 9208 (void)ctx;
wolfSSL 0:9d17e4342598 9209 return 0;
wolfSSL 0:9d17e4342598 9210 }
wolfSSL 0:9d17e4342598 9211
wolfSSL 0:9d17e4342598 9212
wolfSSL 0:9d17e4342598 9213 long CyaSSL_CTX_sess_connect(CYASSL_CTX* ctx)
wolfSSL 0:9d17e4342598 9214 {
wolfSSL 0:9d17e4342598 9215 (void)ctx;
wolfSSL 0:9d17e4342598 9216 return 0;
wolfSSL 0:9d17e4342598 9217 }
wolfSSL 0:9d17e4342598 9218
wolfSSL 0:9d17e4342598 9219
wolfSSL 0:9d17e4342598 9220 long CyaSSL_CTX_sess_accept_good(CYASSL_CTX* ctx)
wolfSSL 0:9d17e4342598 9221 {
wolfSSL 0:9d17e4342598 9222 (void)ctx;
wolfSSL 0:9d17e4342598 9223 return 0;
wolfSSL 0:9d17e4342598 9224 }
wolfSSL 0:9d17e4342598 9225
wolfSSL 0:9d17e4342598 9226
wolfSSL 0:9d17e4342598 9227 long CyaSSL_CTX_sess_connect_good(CYASSL_CTX* ctx)
wolfSSL 0:9d17e4342598 9228 {
wolfSSL 0:9d17e4342598 9229 (void)ctx;
wolfSSL 0:9d17e4342598 9230 return 0;
wolfSSL 0:9d17e4342598 9231 }
wolfSSL 0:9d17e4342598 9232
wolfSSL 0:9d17e4342598 9233
wolfSSL 0:9d17e4342598 9234 long CyaSSL_CTX_sess_accept_renegotiate(CYASSL_CTX* ctx)
wolfSSL 0:9d17e4342598 9235 {
wolfSSL 0:9d17e4342598 9236 (void)ctx;
wolfSSL 0:9d17e4342598 9237 return 0;
wolfSSL 0:9d17e4342598 9238 }
wolfSSL 0:9d17e4342598 9239
wolfSSL 0:9d17e4342598 9240
wolfSSL 0:9d17e4342598 9241 long CyaSSL_CTX_sess_connect_renegotiate(CYASSL_CTX* ctx)
wolfSSL 0:9d17e4342598 9242 {
wolfSSL 0:9d17e4342598 9243 (void)ctx;
wolfSSL 0:9d17e4342598 9244 return 0;
wolfSSL 0:9d17e4342598 9245 }
wolfSSL 0:9d17e4342598 9246
wolfSSL 0:9d17e4342598 9247
wolfSSL 0:9d17e4342598 9248 long CyaSSL_CTX_sess_hits(CYASSL_CTX* ctx)
wolfSSL 0:9d17e4342598 9249 {
wolfSSL 0:9d17e4342598 9250 (void)ctx;
wolfSSL 0:9d17e4342598 9251 return 0;
wolfSSL 0:9d17e4342598 9252 }
wolfSSL 0:9d17e4342598 9253
wolfSSL 0:9d17e4342598 9254
wolfSSL 0:9d17e4342598 9255 long CyaSSL_CTX_sess_cb_hits(CYASSL_CTX* ctx)
wolfSSL 0:9d17e4342598 9256 {
wolfSSL 0:9d17e4342598 9257 (void)ctx;
wolfSSL 0:9d17e4342598 9258 return 0;
wolfSSL 0:9d17e4342598 9259 }
wolfSSL 0:9d17e4342598 9260
wolfSSL 0:9d17e4342598 9261
wolfSSL 0:9d17e4342598 9262 long CyaSSL_CTX_sess_cache_full(CYASSL_CTX* ctx)
wolfSSL 0:9d17e4342598 9263 {
wolfSSL 0:9d17e4342598 9264 (void)ctx;
wolfSSL 0:9d17e4342598 9265 return 0;
wolfSSL 0:9d17e4342598 9266 }
wolfSSL 0:9d17e4342598 9267
wolfSSL 0:9d17e4342598 9268
wolfSSL 0:9d17e4342598 9269 long CyaSSL_CTX_sess_misses(CYASSL_CTX* ctx)
wolfSSL 0:9d17e4342598 9270 {
wolfSSL 0:9d17e4342598 9271 (void)ctx;
wolfSSL 0:9d17e4342598 9272 return 0;
wolfSSL 0:9d17e4342598 9273 }
wolfSSL 0:9d17e4342598 9274
wolfSSL 0:9d17e4342598 9275
wolfSSL 0:9d17e4342598 9276 long CyaSSL_CTX_sess_timeouts(CYASSL_CTX* ctx)
wolfSSL 0:9d17e4342598 9277 {
wolfSSL 0:9d17e4342598 9278 (void)ctx;
wolfSSL 0:9d17e4342598 9279 return 0;
wolfSSL 0:9d17e4342598 9280 }
wolfSSL 0:9d17e4342598 9281
wolfSSL 0:9d17e4342598 9282
wolfSSL 0:9d17e4342598 9283 long CyaSSL_CTX_sess_number(CYASSL_CTX* ctx)
wolfSSL 0:9d17e4342598 9284 {
wolfSSL 0:9d17e4342598 9285 (void)ctx;
wolfSSL 0:9d17e4342598 9286 return 0;
wolfSSL 0:9d17e4342598 9287 }
wolfSSL 0:9d17e4342598 9288
wolfSSL 0:9d17e4342598 9289
wolfSSL 0:9d17e4342598 9290 void CyaSSL_DES_set_key_unchecked(CYASSL_const_DES_cblock* myDes,
wolfSSL 0:9d17e4342598 9291 CYASSL_DES_key_schedule* key)
wolfSSL 0:9d17e4342598 9292 {
wolfSSL 0:9d17e4342598 9293 (void)myDes;
wolfSSL 0:9d17e4342598 9294 (void)key;
wolfSSL 0:9d17e4342598 9295 }
wolfSSL 0:9d17e4342598 9296
wolfSSL 0:9d17e4342598 9297
wolfSSL 0:9d17e4342598 9298 void CyaSSL_DES_set_odd_parity(CYASSL_DES_cblock* myDes)
wolfSSL 0:9d17e4342598 9299 {
wolfSSL 0:9d17e4342598 9300 (void)myDes;
wolfSSL 0:9d17e4342598 9301 }
wolfSSL 0:9d17e4342598 9302
wolfSSL 0:9d17e4342598 9303
wolfSSL 0:9d17e4342598 9304 void CyaSSL_DES_ecb_encrypt(CYASSL_DES_cblock* desa,
wolfSSL 0:9d17e4342598 9305 CYASSL_DES_cblock* desb, CYASSL_DES_key_schedule* key, int len)
wolfSSL 0:9d17e4342598 9306 {
wolfSSL 0:9d17e4342598 9307 (void)desa;
wolfSSL 0:9d17e4342598 9308 (void)desb;
wolfSSL 0:9d17e4342598 9309 (void)key;
wolfSSL 0:9d17e4342598 9310 (void)len;
wolfSSL 0:9d17e4342598 9311 }
wolfSSL 0:9d17e4342598 9312
wolfSSL 0:9d17e4342598 9313 int CyaSSL_BIO_printf(CYASSL_BIO* bio, const char* format, ...)
wolfSSL 0:9d17e4342598 9314 {
wolfSSL 0:9d17e4342598 9315 (void)bio;
wolfSSL 0:9d17e4342598 9316 (void)format;
wolfSSL 0:9d17e4342598 9317 return 0;
wolfSSL 0:9d17e4342598 9318 }
wolfSSL 0:9d17e4342598 9319
wolfSSL 0:9d17e4342598 9320
wolfSSL 0:9d17e4342598 9321 int CyaSSL_ASN1_UTCTIME_print(CYASSL_BIO* bio, const CYASSL_ASN1_UTCTIME* a)
wolfSSL 0:9d17e4342598 9322 {
wolfSSL 0:9d17e4342598 9323 (void)bio;
wolfSSL 0:9d17e4342598 9324 (void)a;
wolfSSL 0:9d17e4342598 9325 return 0;
wolfSSL 0:9d17e4342598 9326 }
wolfSSL 0:9d17e4342598 9327
wolfSSL 0:9d17e4342598 9328
wolfSSL 0:9d17e4342598 9329 int CyaSSL_sk_num(CYASSL_X509_REVOKED* rev)
wolfSSL 0:9d17e4342598 9330 {
wolfSSL 0:9d17e4342598 9331 (void)rev;
wolfSSL 0:9d17e4342598 9332 return 0;
wolfSSL 0:9d17e4342598 9333 }
wolfSSL 0:9d17e4342598 9334
wolfSSL 0:9d17e4342598 9335
wolfSSL 0:9d17e4342598 9336 void* CyaSSL_sk_value(CYASSL_X509_REVOKED* rev, int i)
wolfSSL 0:9d17e4342598 9337 {
wolfSSL 0:9d17e4342598 9338 (void)rev;
wolfSSL 0:9d17e4342598 9339 (void)i;
wolfSSL 0:9d17e4342598 9340 return 0;
wolfSSL 0:9d17e4342598 9341 }
wolfSSL 0:9d17e4342598 9342
wolfSSL 0:9d17e4342598 9343
wolfSSL 0:9d17e4342598 9344 /* stunnel 4.28 needs */
wolfSSL 0:9d17e4342598 9345 void* CyaSSL_CTX_get_ex_data(const CYASSL_CTX* ctx, int d)
wolfSSL 0:9d17e4342598 9346 {
wolfSSL 0:9d17e4342598 9347 (void)ctx;
wolfSSL 0:9d17e4342598 9348 (void)d;
wolfSSL 0:9d17e4342598 9349 return 0;
wolfSSL 0:9d17e4342598 9350 }
wolfSSL 0:9d17e4342598 9351
wolfSSL 0:9d17e4342598 9352
wolfSSL 0:9d17e4342598 9353 int CyaSSL_CTX_set_ex_data(CYASSL_CTX* ctx, int d, void* p)
wolfSSL 0:9d17e4342598 9354 {
wolfSSL 0:9d17e4342598 9355 (void)ctx;
wolfSSL 0:9d17e4342598 9356 (void)d;
wolfSSL 0:9d17e4342598 9357 (void)p;
wolfSSL 0:9d17e4342598 9358 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 9359 }
wolfSSL 0:9d17e4342598 9360
wolfSSL 0:9d17e4342598 9361
wolfSSL 0:9d17e4342598 9362 void CyaSSL_CTX_sess_set_get_cb(CYASSL_CTX* ctx,
wolfSSL 0:9d17e4342598 9363 CYASSL_SESSION*(*f)(CYASSL*, unsigned char*, int, int*))
wolfSSL 0:9d17e4342598 9364 {
wolfSSL 0:9d17e4342598 9365 (void)ctx;
wolfSSL 0:9d17e4342598 9366 (void)f;
wolfSSL 0:9d17e4342598 9367 }
wolfSSL 0:9d17e4342598 9368
wolfSSL 0:9d17e4342598 9369
wolfSSL 0:9d17e4342598 9370 void CyaSSL_CTX_sess_set_new_cb(CYASSL_CTX* ctx,
wolfSSL 0:9d17e4342598 9371 int (*f)(CYASSL*, CYASSL_SESSION*))
wolfSSL 0:9d17e4342598 9372 {
wolfSSL 0:9d17e4342598 9373 (void)ctx;
wolfSSL 0:9d17e4342598 9374 (void)f;
wolfSSL 0:9d17e4342598 9375 }
wolfSSL 0:9d17e4342598 9376
wolfSSL 0:9d17e4342598 9377
wolfSSL 0:9d17e4342598 9378 void CyaSSL_CTX_sess_set_remove_cb(CYASSL_CTX* ctx, void (*f)(CYASSL_CTX*,
wolfSSL 0:9d17e4342598 9379 CYASSL_SESSION*))
wolfSSL 0:9d17e4342598 9380 {
wolfSSL 0:9d17e4342598 9381 (void)ctx;
wolfSSL 0:9d17e4342598 9382 (void)f;
wolfSSL 0:9d17e4342598 9383 }
wolfSSL 0:9d17e4342598 9384
wolfSSL 0:9d17e4342598 9385
wolfSSL 0:9d17e4342598 9386 int CyaSSL_i2d_SSL_SESSION(CYASSL_SESSION* sess, unsigned char** p)
wolfSSL 0:9d17e4342598 9387 {
wolfSSL 0:9d17e4342598 9388 (void)sess;
wolfSSL 0:9d17e4342598 9389 (void)p;
wolfSSL 0:9d17e4342598 9390 return sizeof(CYASSL_SESSION);
wolfSSL 0:9d17e4342598 9391 }
wolfSSL 0:9d17e4342598 9392
wolfSSL 0:9d17e4342598 9393
wolfSSL 0:9d17e4342598 9394 CYASSL_SESSION* CyaSSL_d2i_SSL_SESSION(CYASSL_SESSION** sess,
wolfSSL 0:9d17e4342598 9395 const unsigned char** p, long i)
wolfSSL 0:9d17e4342598 9396 {
wolfSSL 0:9d17e4342598 9397 (void)p;
wolfSSL 0:9d17e4342598 9398 (void)i;
wolfSSL 0:9d17e4342598 9399 if (sess)
wolfSSL 0:9d17e4342598 9400 return *sess;
wolfSSL 0:9d17e4342598 9401 return NULL;
wolfSSL 0:9d17e4342598 9402 }
wolfSSL 0:9d17e4342598 9403
wolfSSL 0:9d17e4342598 9404
wolfSSL 0:9d17e4342598 9405 long CyaSSL_SESSION_get_timeout(const CYASSL_SESSION* sess)
wolfSSL 0:9d17e4342598 9406 {
wolfSSL 0:9d17e4342598 9407 CYASSL_ENTER("CyaSSL_SESSION_get_timeout");
wolfSSL 0:9d17e4342598 9408 return sess->timeout;
wolfSSL 0:9d17e4342598 9409 }
wolfSSL 0:9d17e4342598 9410
wolfSSL 0:9d17e4342598 9411
wolfSSL 0:9d17e4342598 9412 long CyaSSL_SESSION_get_time(const CYASSL_SESSION* sess)
wolfSSL 0:9d17e4342598 9413 {
wolfSSL 0:9d17e4342598 9414 CYASSL_ENTER("CyaSSL_SESSION_get_time");
wolfSSL 0:9d17e4342598 9415 return sess->bornOn;
wolfSSL 0:9d17e4342598 9416 }
wolfSSL 0:9d17e4342598 9417
wolfSSL 0:9d17e4342598 9418
wolfSSL 0:9d17e4342598 9419 int CyaSSL_CTX_get_ex_new_index(long idx, void* arg, void* a, void* b,
wolfSSL 0:9d17e4342598 9420 void* c)
wolfSSL 0:9d17e4342598 9421 {
wolfSSL 0:9d17e4342598 9422 (void)idx;
wolfSSL 0:9d17e4342598 9423 (void)arg;
wolfSSL 0:9d17e4342598 9424 (void)a;
wolfSSL 0:9d17e4342598 9425 (void)b;
wolfSSL 0:9d17e4342598 9426 (void)c;
wolfSSL 0:9d17e4342598 9427 return 0;
wolfSSL 0:9d17e4342598 9428 }
wolfSSL 0:9d17e4342598 9429
wolfSSL 0:9d17e4342598 9430 #endif /* OPENSSL_EXTRA */
wolfSSL 0:9d17e4342598 9431
wolfSSL 0:9d17e4342598 9432
wolfSSL 0:9d17e4342598 9433 #ifdef KEEP_PEER_CERT
wolfSSL 0:9d17e4342598 9434 char* CyaSSL_X509_get_subjectCN(CYASSL_X509* x509)
wolfSSL 0:9d17e4342598 9435 {
wolfSSL 0:9d17e4342598 9436 if (x509 == NULL)
wolfSSL 0:9d17e4342598 9437 return NULL;
wolfSSL 0:9d17e4342598 9438
wolfSSL 0:9d17e4342598 9439 return x509->subjectCN;
wolfSSL 0:9d17e4342598 9440 }
wolfSSL 0:9d17e4342598 9441 #endif /* KEEP_PEER_CERT */
wolfSSL 0:9d17e4342598 9442
wolfSSL 0:9d17e4342598 9443 #ifdef OPENSSL_EXTRA
wolfSSL 0:9d17e4342598 9444
wolfSSL 0:9d17e4342598 9445 #ifdef FORTRESS
wolfSSL 0:9d17e4342598 9446 int CyaSSL_cmp_peer_cert_to_file(CYASSL* ssl, const char *fname)
wolfSSL 0:9d17e4342598 9447 {
wolfSSL 0:9d17e4342598 9448 int ret = SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 9449
wolfSSL 0:9d17e4342598 9450 CYASSL_ENTER("CyaSSL_cmp_peer_cert_to_file");
wolfSSL 0:9d17e4342598 9451 if (ssl != NULL && fname != NULL)
wolfSSL 0:9d17e4342598 9452 {
wolfSSL 0:9d17e4342598 9453 XFILE file = XBADFILE;
wolfSSL 0:9d17e4342598 9454 long sz = 0;
wolfSSL 0:9d17e4342598 9455 byte staticBuffer[FILE_BUFFER_SIZE];
wolfSSL 0:9d17e4342598 9456 byte* myBuffer = staticBuffer;
wolfSSL 0:9d17e4342598 9457 CYASSL_CTX* ctx = ssl->ctx;
wolfSSL 0:9d17e4342598 9458 EncryptedInfo info;
wolfSSL 0:9d17e4342598 9459 buffer fileDer;
wolfSSL 0:9d17e4342598 9460 int eccKey = 0;
wolfSSL 0:9d17e4342598 9461 CYASSL_X509* peer_cert = &ssl->peerCert;
wolfSSL 0:9d17e4342598 9462
wolfSSL 0:9d17e4342598 9463 info.set = 0;
wolfSSL 0:9d17e4342598 9464 info.ctx = ctx;
wolfSSL 0:9d17e4342598 9465 info.consumed = 0;
wolfSSL 0:9d17e4342598 9466 fileDer.buffer = 0;
wolfSSL 0:9d17e4342598 9467
wolfSSL 0:9d17e4342598 9468 file = XFOPEN(fname, "rb");
wolfSSL 0:9d17e4342598 9469 if (file == XBADFILE) return SSL_BAD_FILE;
wolfSSL 0:9d17e4342598 9470 XFSEEK(file, 0, XSEEK_END);
wolfSSL 0:9d17e4342598 9471 sz = XFTELL(file);
wolfSSL 0:9d17e4342598 9472 XREWIND(file);
wolfSSL 0:9d17e4342598 9473 if (sz > (long)sizeof(staticBuffer)) {
wolfSSL 0:9d17e4342598 9474 CYASSL_MSG("Getting dynamic buffer");
wolfSSL 0:9d17e4342598 9475 myBuffer = (byte*) XMALLOC(sz, ctx->heap, DYNAMIC_TYPE_FILE);
wolfSSL 0:9d17e4342598 9476 }
wolfSSL 0:9d17e4342598 9477
wolfSSL 0:9d17e4342598 9478 if ((myBuffer != NULL) &&
wolfSSL 0:9d17e4342598 9479 (sz > 0) &&
wolfSSL 0:9d17e4342598 9480 (XFREAD(myBuffer, sz, 1, file) > 0) &&
wolfSSL 0:9d17e4342598 9481 (PemToDer(myBuffer, sz, CERT_TYPE,
wolfSSL 0:9d17e4342598 9482 &fileDer, ctx->heap, &info, &eccKey) == 0) &&
wolfSSL 0:9d17e4342598 9483 (fileDer.length != 0) &&
wolfSSL 0:9d17e4342598 9484 (fileDer.length == peer_cert->derCert.length) &&
wolfSSL 0:9d17e4342598 9485 (XMEMCMP(peer_cert->derCert.buffer, fileDer.buffer,
wolfSSL 0:9d17e4342598 9486 fileDer.length) == 0))
wolfSSL 0:9d17e4342598 9487 {
wolfSSL 0:9d17e4342598 9488 ret = 0;
wolfSSL 0:9d17e4342598 9489 }
wolfSSL 0:9d17e4342598 9490
wolfSSL 0:9d17e4342598 9491 XFCLOSE(file);
wolfSSL 0:9d17e4342598 9492 if (fileDer.buffer)
wolfSSL 0:9d17e4342598 9493 XFREE(fileDer.buffer, ctx->heap, DYNAMIC_TYPE_CERT);
wolfSSL 0:9d17e4342598 9494 if (myBuffer && (myBuffer != staticBuffer))
wolfSSL 0:9d17e4342598 9495 XFREE(myBuffer, ctx->heap, DYNAMIC_TYPE_FILE);
wolfSSL 0:9d17e4342598 9496 }
wolfSSL 0:9d17e4342598 9497
wolfSSL 0:9d17e4342598 9498 return ret;
wolfSSL 0:9d17e4342598 9499 }
wolfSSL 0:9d17e4342598 9500 #endif
wolfSSL 0:9d17e4342598 9501
wolfSSL 0:9d17e4342598 9502
wolfSSL 0:9d17e4342598 9503 static RNG globalRNG;
wolfSSL 0:9d17e4342598 9504 static int initGlobalRNG = 0;
wolfSSL 0:9d17e4342598 9505
wolfSSL 0:9d17e4342598 9506 /* SSL_SUCCESS on ok */
wolfSSL 0:9d17e4342598 9507 int CyaSSL_RAND_seed(const void* seed, int len)
wolfSSL 0:9d17e4342598 9508 {
wolfSSL 0:9d17e4342598 9509
wolfSSL 0:9d17e4342598 9510 CYASSL_MSG("CyaSSL_RAND_seed");
wolfSSL 0:9d17e4342598 9511
wolfSSL 0:9d17e4342598 9512 (void)seed;
wolfSSL 0:9d17e4342598 9513 (void)len;
wolfSSL 0:9d17e4342598 9514
wolfSSL 0:9d17e4342598 9515 if (initGlobalRNG == 0) {
wolfSSL 0:9d17e4342598 9516 if (InitRng(&globalRNG) < 0) {
wolfSSL 0:9d17e4342598 9517 CYASSL_MSG("CyaSSL Init Global RNG failed");
wolfSSL 0:9d17e4342598 9518 }
wolfSSL 0:9d17e4342598 9519 initGlobalRNG = 1;
wolfSSL 0:9d17e4342598 9520 }
wolfSSL 0:9d17e4342598 9521
wolfSSL 0:9d17e4342598 9522 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 9523 }
wolfSSL 0:9d17e4342598 9524
wolfSSL 0:9d17e4342598 9525
wolfSSL 0:9d17e4342598 9526 /* SSL_SUCCESS on ok */
wolfSSL 0:9d17e4342598 9527 int CyaSSL_RAND_bytes(unsigned char* buf, int num)
wolfSSL 0:9d17e4342598 9528 {
wolfSSL 0:9d17e4342598 9529 RNG tmpRNG;
wolfSSL 0:9d17e4342598 9530 RNG* rng = &tmpRNG;
wolfSSL 0:9d17e4342598 9531
wolfSSL 0:9d17e4342598 9532 CYASSL_ENTER("RAND_bytes");
wolfSSL 0:9d17e4342598 9533 if (InitRng(&tmpRNG) != 0) {
wolfSSL 0:9d17e4342598 9534 CYASSL_MSG("Bad RNG Init, trying global");
wolfSSL 0:9d17e4342598 9535 if (initGlobalRNG == 0) {
wolfSSL 0:9d17e4342598 9536 CYASSL_MSG("Global RNG no Init");
wolfSSL 0:9d17e4342598 9537 return 0;
wolfSSL 0:9d17e4342598 9538 }
wolfSSL 0:9d17e4342598 9539 rng = &globalRNG;
wolfSSL 0:9d17e4342598 9540 }
wolfSSL 0:9d17e4342598 9541
wolfSSL 0:9d17e4342598 9542 RNG_GenerateBlock(rng, buf, num);
wolfSSL 0:9d17e4342598 9543
wolfSSL 0:9d17e4342598 9544 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 9545 }
wolfSSL 0:9d17e4342598 9546
wolfSSL 0:9d17e4342598 9547 CYASSL_BN_CTX* CyaSSL_BN_CTX_new(void)
wolfSSL 0:9d17e4342598 9548 {
wolfSSL 0:9d17e4342598 9549 static int ctx; /* ctaocrypt doesn't now need ctx */
wolfSSL 0:9d17e4342598 9550
wolfSSL 0:9d17e4342598 9551 CYASSL_MSG("CyaSSL_BN_CTX_new");
wolfSSL 0:9d17e4342598 9552
wolfSSL 0:9d17e4342598 9553 return (CYASSL_BN_CTX*)&ctx;
wolfSSL 0:9d17e4342598 9554 }
wolfSSL 0:9d17e4342598 9555
wolfSSL 0:9d17e4342598 9556 void CyaSSL_BN_CTX_init(CYASSL_BN_CTX* ctx)
wolfSSL 0:9d17e4342598 9557 {
wolfSSL 0:9d17e4342598 9558 (void)ctx;
wolfSSL 0:9d17e4342598 9559 CYASSL_MSG("CyaSSL_BN_CTX_init");
wolfSSL 0:9d17e4342598 9560 }
wolfSSL 0:9d17e4342598 9561
wolfSSL 0:9d17e4342598 9562
wolfSSL 0:9d17e4342598 9563 void CyaSSL_BN_CTX_free(CYASSL_BN_CTX* ctx)
wolfSSL 0:9d17e4342598 9564 {
wolfSSL 0:9d17e4342598 9565 (void)ctx;
wolfSSL 0:9d17e4342598 9566 CYASSL_MSG("CyaSSL_BN_CTX_free");
wolfSSL 0:9d17e4342598 9567
wolfSSL 0:9d17e4342598 9568 /* do free since static ctx that does nothing */
wolfSSL 0:9d17e4342598 9569 }
wolfSSL 0:9d17e4342598 9570
wolfSSL 0:9d17e4342598 9571
wolfSSL 0:9d17e4342598 9572 static void InitCyaSSL_BigNum(CYASSL_BIGNUM* bn)
wolfSSL 0:9d17e4342598 9573 {
wolfSSL 0:9d17e4342598 9574 CYASSL_MSG("InitCyaSSL_BigNum");
wolfSSL 0:9d17e4342598 9575 if (bn) {
wolfSSL 0:9d17e4342598 9576 bn->neg = 0;
wolfSSL 0:9d17e4342598 9577 bn->internal = NULL;
wolfSSL 0:9d17e4342598 9578 }
wolfSSL 0:9d17e4342598 9579 }
wolfSSL 0:9d17e4342598 9580
wolfSSL 0:9d17e4342598 9581
wolfSSL 0:9d17e4342598 9582 CYASSL_BIGNUM* CyaSSL_BN_new(void)
wolfSSL 0:9d17e4342598 9583 {
wolfSSL 0:9d17e4342598 9584 CYASSL_BIGNUM* external;
wolfSSL 0:9d17e4342598 9585 mp_int* mpi;
wolfSSL 0:9d17e4342598 9586
wolfSSL 0:9d17e4342598 9587 CYASSL_MSG("CyaSSL_BN_new");
wolfSSL 0:9d17e4342598 9588
wolfSSL 0:9d17e4342598 9589 mpi = (mp_int*) XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_BIGINT);
wolfSSL 0:9d17e4342598 9590 if (mpi == NULL) {
wolfSSL 0:9d17e4342598 9591 CYASSL_MSG("CyaSSL_BN_new malloc mpi failure");
wolfSSL 0:9d17e4342598 9592 return NULL;
wolfSSL 0:9d17e4342598 9593 }
wolfSSL 0:9d17e4342598 9594
wolfSSL 0:9d17e4342598 9595 external = (CYASSL_BIGNUM*) XMALLOC(sizeof(CYASSL_BIGNUM), NULL,
wolfSSL 0:9d17e4342598 9596 DYNAMIC_TYPE_BIGINT);
wolfSSL 0:9d17e4342598 9597 if (external == NULL) {
wolfSSL 0:9d17e4342598 9598 CYASSL_MSG("CyaSSL_BN_new malloc CYASSL_BIGNUM failure");
wolfSSL 0:9d17e4342598 9599 XFREE(mpi, NULL, DYNAMIC_TYPE_BIGINT);
wolfSSL 0:9d17e4342598 9600 return NULL;
wolfSSL 0:9d17e4342598 9601 }
wolfSSL 0:9d17e4342598 9602
wolfSSL 0:9d17e4342598 9603 InitCyaSSL_BigNum(external);
wolfSSL 0:9d17e4342598 9604 external->internal = mpi;
wolfSSL 0:9d17e4342598 9605 if (mp_init(mpi) != MP_OKAY) {
wolfSSL 0:9d17e4342598 9606 CyaSSL_BN_free(external);
wolfSSL 0:9d17e4342598 9607 return NULL;
wolfSSL 0:9d17e4342598 9608 }
wolfSSL 0:9d17e4342598 9609
wolfSSL 0:9d17e4342598 9610 return external;
wolfSSL 0:9d17e4342598 9611 }
wolfSSL 0:9d17e4342598 9612
wolfSSL 0:9d17e4342598 9613
wolfSSL 0:9d17e4342598 9614 void CyaSSL_BN_free(CYASSL_BIGNUM* bn)
wolfSSL 0:9d17e4342598 9615 {
wolfSSL 0:9d17e4342598 9616 CYASSL_MSG("CyaSSL_BN_free");
wolfSSL 0:9d17e4342598 9617 if (bn) {
wolfSSL 0:9d17e4342598 9618 if (bn->internal) {
wolfSSL 0:9d17e4342598 9619 mp_clear((mp_int*)bn->internal);
wolfSSL 0:9d17e4342598 9620 XFREE(bn->internal, NULL, DYNAMIC_TYPE_BIGINT);
wolfSSL 0:9d17e4342598 9621 bn->internal = NULL;
wolfSSL 0:9d17e4342598 9622 }
wolfSSL 0:9d17e4342598 9623 XFREE(bn, NULL, DYNAMIC_TYPE_BIGINT);
wolfSSL 0:9d17e4342598 9624 }
wolfSSL 0:9d17e4342598 9625 }
wolfSSL 0:9d17e4342598 9626
wolfSSL 0:9d17e4342598 9627
wolfSSL 0:9d17e4342598 9628 void CyaSSL_BN_clear_free(CYASSL_BIGNUM* bn)
wolfSSL 0:9d17e4342598 9629 {
wolfSSL 0:9d17e4342598 9630 CYASSL_MSG("CyaSSL_BN_clear_free");
wolfSSL 0:9d17e4342598 9631
wolfSSL 0:9d17e4342598 9632 CyaSSL_BN_free(bn);
wolfSSL 0:9d17e4342598 9633 }
wolfSSL 0:9d17e4342598 9634
wolfSSL 0:9d17e4342598 9635
wolfSSL 0:9d17e4342598 9636 /* SSL_SUCCESS on ok */
wolfSSL 0:9d17e4342598 9637 int CyaSSL_BN_sub(CYASSL_BIGNUM* r, const CYASSL_BIGNUM* a,
wolfSSL 0:9d17e4342598 9638 const CYASSL_BIGNUM* b)
wolfSSL 0:9d17e4342598 9639 {
wolfSSL 0:9d17e4342598 9640 CYASSL_MSG("CyaSSL_BN_sub");
wolfSSL 0:9d17e4342598 9641
wolfSSL 0:9d17e4342598 9642 if (r == NULL || a == NULL || b == NULL)
wolfSSL 0:9d17e4342598 9643 return 0;
wolfSSL 0:9d17e4342598 9644
wolfSSL 0:9d17e4342598 9645 if (mp_sub((mp_int*)a->internal,(mp_int*)b->internal,
wolfSSL 0:9d17e4342598 9646 (mp_int*)r->internal) == MP_OKAY)
wolfSSL 0:9d17e4342598 9647 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 9648
wolfSSL 0:9d17e4342598 9649 CYASSL_MSG("CyaSSL_BN_sub mp_sub failed");
wolfSSL 0:9d17e4342598 9650 return 0;
wolfSSL 0:9d17e4342598 9651 }
wolfSSL 0:9d17e4342598 9652
wolfSSL 0:9d17e4342598 9653
wolfSSL 0:9d17e4342598 9654 /* SSL_SUCCESS on ok */
wolfSSL 0:9d17e4342598 9655 int CyaSSL_BN_mod(CYASSL_BIGNUM* r, const CYASSL_BIGNUM* a,
wolfSSL 0:9d17e4342598 9656 const CYASSL_BIGNUM* b, const CYASSL_BN_CTX* c)
wolfSSL 0:9d17e4342598 9657 {
wolfSSL 0:9d17e4342598 9658 (void)c;
wolfSSL 0:9d17e4342598 9659 CYASSL_MSG("CyaSSL_BN_mod");
wolfSSL 0:9d17e4342598 9660
wolfSSL 0:9d17e4342598 9661 if (r == NULL || a == NULL || b == NULL)
wolfSSL 0:9d17e4342598 9662 return 0;
wolfSSL 0:9d17e4342598 9663
wolfSSL 0:9d17e4342598 9664 if (mp_mod((mp_int*)a->internal,(mp_int*)b->internal,
wolfSSL 0:9d17e4342598 9665 (mp_int*)r->internal) == MP_OKAY)
wolfSSL 0:9d17e4342598 9666 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 9667
wolfSSL 0:9d17e4342598 9668 CYASSL_MSG("CyaSSL_BN_mod mp_mod failed");
wolfSSL 0:9d17e4342598 9669 return 0;
wolfSSL 0:9d17e4342598 9670 }
wolfSSL 0:9d17e4342598 9671
wolfSSL 0:9d17e4342598 9672
wolfSSL 0:9d17e4342598 9673 const CYASSL_BIGNUM* CyaSSL_BN_value_one(void)
wolfSSL 0:9d17e4342598 9674 {
wolfSSL 0:9d17e4342598 9675 static CYASSL_BIGNUM* bn_one = NULL;
wolfSSL 0:9d17e4342598 9676
wolfSSL 0:9d17e4342598 9677 CYASSL_MSG("CyaSSL_BN_value_one");
wolfSSL 0:9d17e4342598 9678
wolfSSL 0:9d17e4342598 9679 if (bn_one == NULL) {
wolfSSL 0:9d17e4342598 9680 bn_one = CyaSSL_BN_new();
wolfSSL 0:9d17e4342598 9681 if (bn_one)
wolfSSL 0:9d17e4342598 9682 mp_set_int((mp_int*)bn_one->internal, 1);
wolfSSL 0:9d17e4342598 9683 }
wolfSSL 0:9d17e4342598 9684
wolfSSL 0:9d17e4342598 9685 return bn_one;
wolfSSL 0:9d17e4342598 9686 }
wolfSSL 0:9d17e4342598 9687
wolfSSL 0:9d17e4342598 9688
wolfSSL 0:9d17e4342598 9689 int CyaSSL_BN_num_bytes(const CYASSL_BIGNUM* bn)
wolfSSL 0:9d17e4342598 9690 {
wolfSSL 0:9d17e4342598 9691 CYASSL_MSG("CyaSSL_BN_num_bytes");
wolfSSL 0:9d17e4342598 9692
wolfSSL 0:9d17e4342598 9693 if (bn == NULL || bn->internal == NULL)
wolfSSL 0:9d17e4342598 9694 return 0;
wolfSSL 0:9d17e4342598 9695
wolfSSL 0:9d17e4342598 9696 return mp_unsigned_bin_size((mp_int*)bn->internal);
wolfSSL 0:9d17e4342598 9697 }
wolfSSL 0:9d17e4342598 9698
wolfSSL 0:9d17e4342598 9699
wolfSSL 0:9d17e4342598 9700 int CyaSSL_BN_num_bits(const CYASSL_BIGNUM* bn)
wolfSSL 0:9d17e4342598 9701 {
wolfSSL 0:9d17e4342598 9702 CYASSL_MSG("CyaSSL_BN_num_bits");
wolfSSL 0:9d17e4342598 9703
wolfSSL 0:9d17e4342598 9704 if (bn == NULL || bn->internal == NULL)
wolfSSL 0:9d17e4342598 9705 return 0;
wolfSSL 0:9d17e4342598 9706
wolfSSL 0:9d17e4342598 9707 return mp_count_bits((mp_int*)bn->internal);
wolfSSL 0:9d17e4342598 9708 }
wolfSSL 0:9d17e4342598 9709
wolfSSL 0:9d17e4342598 9710
wolfSSL 0:9d17e4342598 9711 int CyaSSL_BN_is_zero(const CYASSL_BIGNUM* bn)
wolfSSL 0:9d17e4342598 9712 {
wolfSSL 0:9d17e4342598 9713 CYASSL_MSG("CyaSSL_BN_is_zero");
wolfSSL 0:9d17e4342598 9714
wolfSSL 0:9d17e4342598 9715 if (bn == NULL || bn->internal == NULL)
wolfSSL 0:9d17e4342598 9716 return 0;
wolfSSL 0:9d17e4342598 9717
wolfSSL 0:9d17e4342598 9718 return mp_iszero((mp_int*)bn->internal);
wolfSSL 0:9d17e4342598 9719 }
wolfSSL 0:9d17e4342598 9720
wolfSSL 0:9d17e4342598 9721
wolfSSL 0:9d17e4342598 9722 int CyaSSL_BN_is_one(const CYASSL_BIGNUM* bn)
wolfSSL 0:9d17e4342598 9723 {
wolfSSL 0:9d17e4342598 9724 CYASSL_MSG("CyaSSL_BN_is_one");
wolfSSL 0:9d17e4342598 9725
wolfSSL 0:9d17e4342598 9726 if (bn == NULL || bn->internal == NULL)
wolfSSL 0:9d17e4342598 9727 return 0;
wolfSSL 0:9d17e4342598 9728
wolfSSL 0:9d17e4342598 9729 if (mp_cmp_d((mp_int*)bn->internal, 1) == 0)
wolfSSL 0:9d17e4342598 9730 return 1;
wolfSSL 0:9d17e4342598 9731
wolfSSL 0:9d17e4342598 9732 return 0;
wolfSSL 0:9d17e4342598 9733 }
wolfSSL 0:9d17e4342598 9734
wolfSSL 0:9d17e4342598 9735
wolfSSL 0:9d17e4342598 9736 int CyaSSL_BN_is_odd(const CYASSL_BIGNUM* bn)
wolfSSL 0:9d17e4342598 9737 {
wolfSSL 0:9d17e4342598 9738 CYASSL_MSG("CyaSSL_BN_is_odd");
wolfSSL 0:9d17e4342598 9739
wolfSSL 0:9d17e4342598 9740 if (bn == NULL || bn->internal == NULL)
wolfSSL 0:9d17e4342598 9741 return 0;
wolfSSL 0:9d17e4342598 9742
wolfSSL 0:9d17e4342598 9743 return mp_isodd((mp_int*)bn->internal);
wolfSSL 0:9d17e4342598 9744 }
wolfSSL 0:9d17e4342598 9745
wolfSSL 0:9d17e4342598 9746
wolfSSL 0:9d17e4342598 9747 int CyaSSL_BN_cmp(const CYASSL_BIGNUM* a, const CYASSL_BIGNUM* b)
wolfSSL 0:9d17e4342598 9748 {
wolfSSL 0:9d17e4342598 9749 CYASSL_MSG("CyaSSL_BN_cmp");
wolfSSL 0:9d17e4342598 9750
wolfSSL 0:9d17e4342598 9751 if (a == NULL || a->internal == NULL || b == NULL || b->internal ==NULL)
wolfSSL 0:9d17e4342598 9752 return 0;
wolfSSL 0:9d17e4342598 9753
wolfSSL 0:9d17e4342598 9754 return mp_cmp((mp_int*)a->internal, (mp_int*)b->internal);
wolfSSL 0:9d17e4342598 9755 }
wolfSSL 0:9d17e4342598 9756
wolfSSL 0:9d17e4342598 9757
wolfSSL 0:9d17e4342598 9758 int CyaSSL_BN_bn2bin(const CYASSL_BIGNUM* bn, unsigned char* r)
wolfSSL 0:9d17e4342598 9759 {
wolfSSL 0:9d17e4342598 9760 CYASSL_MSG("CyaSSL_BN_bn2bin");
wolfSSL 0:9d17e4342598 9761
wolfSSL 0:9d17e4342598 9762 if (bn == NULL || bn->internal == NULL) {
wolfSSL 0:9d17e4342598 9763 CYASSL_MSG("NULL bn error");
wolfSSL 0:9d17e4342598 9764 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 9765 }
wolfSSL 0:9d17e4342598 9766
wolfSSL 0:9d17e4342598 9767 if (r == NULL)
wolfSSL 0:9d17e4342598 9768 return mp_unsigned_bin_size((mp_int*)bn->internal);
wolfSSL 0:9d17e4342598 9769
wolfSSL 0:9d17e4342598 9770 if (mp_to_unsigned_bin((mp_int*)bn->internal, r) != MP_OKAY) {
wolfSSL 0:9d17e4342598 9771 CYASSL_MSG("mp_to_unsigned_bin error");
wolfSSL 0:9d17e4342598 9772 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 9773 }
wolfSSL 0:9d17e4342598 9774
wolfSSL 0:9d17e4342598 9775 return mp_unsigned_bin_size((mp_int*)bn->internal);
wolfSSL 0:9d17e4342598 9776 }
wolfSSL 0:9d17e4342598 9777
wolfSSL 0:9d17e4342598 9778
wolfSSL 0:9d17e4342598 9779 CYASSL_BIGNUM* CyaSSL_BN_bin2bn(const unsigned char* str, int len,
wolfSSL 0:9d17e4342598 9780 CYASSL_BIGNUM* ret)
wolfSSL 0:9d17e4342598 9781 {
wolfSSL 0:9d17e4342598 9782 CYASSL_MSG("CyaSSL_BN_bin2bn");
wolfSSL 0:9d17e4342598 9783
wolfSSL 0:9d17e4342598 9784 if (ret && ret->internal) {
wolfSSL 0:9d17e4342598 9785 if (mp_read_unsigned_bin((mp_int*)ret->internal, str, len) != 0) {
wolfSSL 0:9d17e4342598 9786 CYASSL_MSG("mp_read_unsigned_bin failure");
wolfSSL 0:9d17e4342598 9787 return NULL;
wolfSSL 0:9d17e4342598 9788 }
wolfSSL 0:9d17e4342598 9789 }
wolfSSL 0:9d17e4342598 9790 else {
wolfSSL 0:9d17e4342598 9791 CYASSL_MSG("CyaSSL_BN_bin2bn wants return bignum");
wolfSSL 0:9d17e4342598 9792 }
wolfSSL 0:9d17e4342598 9793
wolfSSL 0:9d17e4342598 9794 return ret;
wolfSSL 0:9d17e4342598 9795 }
wolfSSL 0:9d17e4342598 9796
wolfSSL 0:9d17e4342598 9797
wolfSSL 0:9d17e4342598 9798 int CyaSSL_mask_bits(CYASSL_BIGNUM* bn, int n)
wolfSSL 0:9d17e4342598 9799 {
wolfSSL 0:9d17e4342598 9800 (void)bn;
wolfSSL 0:9d17e4342598 9801 (void)n;
wolfSSL 0:9d17e4342598 9802 CYASSL_MSG("CyaSSL_BN_mask_bits");
wolfSSL 0:9d17e4342598 9803
wolfSSL 0:9d17e4342598 9804 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 9805 }
wolfSSL 0:9d17e4342598 9806
wolfSSL 0:9d17e4342598 9807
wolfSSL 0:9d17e4342598 9808 /* SSL_SUCCESS on ok */
wolfSSL 0:9d17e4342598 9809 int CyaSSL_BN_rand(CYASSL_BIGNUM* bn, int bits, int top, int bottom)
wolfSSL 0:9d17e4342598 9810 {
wolfSSL 0:9d17e4342598 9811 byte buff[1024];
wolfSSL 0:9d17e4342598 9812 RNG tmpRNG;
wolfSSL 0:9d17e4342598 9813 RNG* rng = &tmpRNG;
wolfSSL 0:9d17e4342598 9814 int len = bits/8;
wolfSSL 0:9d17e4342598 9815
wolfSSL 0:9d17e4342598 9816 (void)top;
wolfSSL 0:9d17e4342598 9817 (void)bottom;
wolfSSL 0:9d17e4342598 9818 CYASSL_MSG("CyaSSL_BN_rand");
wolfSSL 0:9d17e4342598 9819
wolfSSL 0:9d17e4342598 9820 if (bn == NULL || bn->internal == NULL) {
wolfSSL 0:9d17e4342598 9821 CYASSL_MSG("Bad function arguments");
wolfSSL 0:9d17e4342598 9822 return 0;
wolfSSL 0:9d17e4342598 9823 }
wolfSSL 0:9d17e4342598 9824
wolfSSL 0:9d17e4342598 9825 if (bits % 8)
wolfSSL 0:9d17e4342598 9826 len++;
wolfSSL 0:9d17e4342598 9827
wolfSSL 0:9d17e4342598 9828 if ( (InitRng(&tmpRNG)) != 0) {
wolfSSL 0:9d17e4342598 9829 CYASSL_MSG("Bad RNG Init, trying global");
wolfSSL 0:9d17e4342598 9830 if (initGlobalRNG == 0) {
wolfSSL 0:9d17e4342598 9831 CYASSL_MSG("Global RNG no Init");
wolfSSL 0:9d17e4342598 9832 return 0;
wolfSSL 0:9d17e4342598 9833 }
wolfSSL 0:9d17e4342598 9834 rng = &globalRNG;
wolfSSL 0:9d17e4342598 9835 }
wolfSSL 0:9d17e4342598 9836
wolfSSL 0:9d17e4342598 9837 RNG_GenerateBlock(rng, buff, len);
wolfSSL 0:9d17e4342598 9838 buff[0] |= 0x80 | 0x40;
wolfSSL 0:9d17e4342598 9839 buff[len-1] |= 0x01;
wolfSSL 0:9d17e4342598 9840
wolfSSL 0:9d17e4342598 9841 if (mp_read_unsigned_bin((mp_int*)bn->internal,buff,len) != MP_OKAY) {
wolfSSL 0:9d17e4342598 9842 CYASSL_MSG("mp read bin failed");
wolfSSL 0:9d17e4342598 9843 return 0;
wolfSSL 0:9d17e4342598 9844 }
wolfSSL 0:9d17e4342598 9845
wolfSSL 0:9d17e4342598 9846 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 9847 }
wolfSSL 0:9d17e4342598 9848
wolfSSL 0:9d17e4342598 9849
wolfSSL 0:9d17e4342598 9850 int CyaSSL_BN_is_bit_set(const CYASSL_BIGNUM* bn, int n)
wolfSSL 0:9d17e4342598 9851 {
wolfSSL 0:9d17e4342598 9852 (void)bn;
wolfSSL 0:9d17e4342598 9853 (void)n;
wolfSSL 0:9d17e4342598 9854
wolfSSL 0:9d17e4342598 9855 CYASSL_MSG("CyaSSL_BN_is_bit_set");
wolfSSL 0:9d17e4342598 9856
wolfSSL 0:9d17e4342598 9857 return 0;
wolfSSL 0:9d17e4342598 9858 }
wolfSSL 0:9d17e4342598 9859
wolfSSL 0:9d17e4342598 9860
wolfSSL 0:9d17e4342598 9861 /* SSL_SUCCESS on ok */
wolfSSL 0:9d17e4342598 9862 int CyaSSL_BN_hex2bn(CYASSL_BIGNUM** bn, const char* str)
wolfSSL 0:9d17e4342598 9863 {
wolfSSL 0:9d17e4342598 9864 byte decoded[1024];
wolfSSL 0:9d17e4342598 9865 word32 decSz = sizeof(decoded);
wolfSSL 0:9d17e4342598 9866
wolfSSL 0:9d17e4342598 9867 CYASSL_MSG("CyaSSL_BN_hex2bn");
wolfSSL 0:9d17e4342598 9868
wolfSSL 0:9d17e4342598 9869 if (str == NULL) {
wolfSSL 0:9d17e4342598 9870 CYASSL_MSG("Bad function argument");
wolfSSL 0:9d17e4342598 9871 return 0;
wolfSSL 0:9d17e4342598 9872 }
wolfSSL 0:9d17e4342598 9873
wolfSSL 0:9d17e4342598 9874 if (Base16_Decode((byte*)str, (int)XSTRLEN(str), decoded, &decSz) < 0) {
wolfSSL 0:9d17e4342598 9875 CYASSL_MSG("Bad Base16_Decode error");
wolfSSL 0:9d17e4342598 9876 return 0;
wolfSSL 0:9d17e4342598 9877 }
wolfSSL 0:9d17e4342598 9878
wolfSSL 0:9d17e4342598 9879 if (bn == NULL)
wolfSSL 0:9d17e4342598 9880 return decSz;
wolfSSL 0:9d17e4342598 9881
wolfSSL 0:9d17e4342598 9882 if (*bn == NULL) {
wolfSSL 0:9d17e4342598 9883 *bn = CyaSSL_BN_new();
wolfSSL 0:9d17e4342598 9884 if (*bn == NULL) {
wolfSSL 0:9d17e4342598 9885 CYASSL_MSG("BN new failed");
wolfSSL 0:9d17e4342598 9886 return 0;
wolfSSL 0:9d17e4342598 9887 }
wolfSSL 0:9d17e4342598 9888 }
wolfSSL 0:9d17e4342598 9889
wolfSSL 0:9d17e4342598 9890 if (CyaSSL_BN_bin2bn(decoded, decSz, *bn) == NULL) {
wolfSSL 0:9d17e4342598 9891 CYASSL_MSG("Bad bin2bn error");
wolfSSL 0:9d17e4342598 9892 return 0;
wolfSSL 0:9d17e4342598 9893 }
wolfSSL 0:9d17e4342598 9894
wolfSSL 0:9d17e4342598 9895 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 9896 }
wolfSSL 0:9d17e4342598 9897
wolfSSL 0:9d17e4342598 9898
wolfSSL 0:9d17e4342598 9899 CYASSL_BIGNUM* CyaSSL_BN_dup(const CYASSL_BIGNUM* bn)
wolfSSL 0:9d17e4342598 9900 {
wolfSSL 0:9d17e4342598 9901 CYASSL_BIGNUM* ret;
wolfSSL 0:9d17e4342598 9902
wolfSSL 0:9d17e4342598 9903 CYASSL_MSG("CyaSSL_BN_dup");
wolfSSL 0:9d17e4342598 9904
wolfSSL 0:9d17e4342598 9905 if (bn == NULL || bn->internal == NULL) {
wolfSSL 0:9d17e4342598 9906 CYASSL_MSG("bn NULL error");
wolfSSL 0:9d17e4342598 9907 return NULL;
wolfSSL 0:9d17e4342598 9908 }
wolfSSL 0:9d17e4342598 9909
wolfSSL 0:9d17e4342598 9910 ret = CyaSSL_BN_new();
wolfSSL 0:9d17e4342598 9911 if (ret == NULL) {
wolfSSL 0:9d17e4342598 9912 CYASSL_MSG("bn new error");
wolfSSL 0:9d17e4342598 9913 return NULL;
wolfSSL 0:9d17e4342598 9914 }
wolfSSL 0:9d17e4342598 9915
wolfSSL 0:9d17e4342598 9916 if (mp_copy((mp_int*)bn->internal, (mp_int*)ret->internal) != MP_OKAY) {
wolfSSL 0:9d17e4342598 9917 CYASSL_MSG("mp_copy error");
wolfSSL 0:9d17e4342598 9918 CyaSSL_BN_free(ret);
wolfSSL 0:9d17e4342598 9919 return NULL;
wolfSSL 0:9d17e4342598 9920 }
wolfSSL 0:9d17e4342598 9921
wolfSSL 0:9d17e4342598 9922 return ret;
wolfSSL 0:9d17e4342598 9923 }
wolfSSL 0:9d17e4342598 9924
wolfSSL 0:9d17e4342598 9925
wolfSSL 0:9d17e4342598 9926 CYASSL_BIGNUM* CyaSSL_BN_copy(CYASSL_BIGNUM* r, const CYASSL_BIGNUM* bn)
wolfSSL 0:9d17e4342598 9927 {
wolfSSL 0:9d17e4342598 9928 (void)r;
wolfSSL 0:9d17e4342598 9929 (void)bn;
wolfSSL 0:9d17e4342598 9930
wolfSSL 0:9d17e4342598 9931 CYASSL_MSG("CyaSSL_BN_copy");
wolfSSL 0:9d17e4342598 9932
wolfSSL 0:9d17e4342598 9933 return NULL;
wolfSSL 0:9d17e4342598 9934 }
wolfSSL 0:9d17e4342598 9935
wolfSSL 0:9d17e4342598 9936
wolfSSL 0:9d17e4342598 9937 int CyaSSL_BN_set_word(CYASSL_BIGNUM* bn, unsigned long w)
wolfSSL 0:9d17e4342598 9938 {
wolfSSL 0:9d17e4342598 9939 (void)bn;
wolfSSL 0:9d17e4342598 9940 (void)w;
wolfSSL 0:9d17e4342598 9941
wolfSSL 0:9d17e4342598 9942 CYASSL_MSG("CyaSSL_BN_set_word");
wolfSSL 0:9d17e4342598 9943
wolfSSL 0:9d17e4342598 9944 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 9945 }
wolfSSL 0:9d17e4342598 9946
wolfSSL 0:9d17e4342598 9947
wolfSSL 0:9d17e4342598 9948 int CyaSSL_BN_dec2bn(CYASSL_BIGNUM** bn, const char* str)
wolfSSL 0:9d17e4342598 9949 {
wolfSSL 0:9d17e4342598 9950 (void)bn;
wolfSSL 0:9d17e4342598 9951 (void)str;
wolfSSL 0:9d17e4342598 9952
wolfSSL 0:9d17e4342598 9953 CYASSL_MSG("CyaSSL_BN_dec2bn");
wolfSSL 0:9d17e4342598 9954
wolfSSL 0:9d17e4342598 9955 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 9956 }
wolfSSL 0:9d17e4342598 9957
wolfSSL 0:9d17e4342598 9958
wolfSSL 0:9d17e4342598 9959 char* CyaSSL_BN_bn2dec(const CYASSL_BIGNUM* bn)
wolfSSL 0:9d17e4342598 9960 {
wolfSSL 0:9d17e4342598 9961 (void)bn;
wolfSSL 0:9d17e4342598 9962
wolfSSL 0:9d17e4342598 9963 CYASSL_MSG("CyaSSL_BN_bn2dec");
wolfSSL 0:9d17e4342598 9964
wolfSSL 0:9d17e4342598 9965 return NULL;
wolfSSL 0:9d17e4342598 9966 }
wolfSSL 0:9d17e4342598 9967
wolfSSL 0:9d17e4342598 9968
wolfSSL 0:9d17e4342598 9969 static void InitCyaSSL_DH(CYASSL_DH* dh)
wolfSSL 0:9d17e4342598 9970 {
wolfSSL 0:9d17e4342598 9971 if (dh) {
wolfSSL 0:9d17e4342598 9972 dh->p = NULL;
wolfSSL 0:9d17e4342598 9973 dh->g = NULL;
wolfSSL 0:9d17e4342598 9974 dh->pub_key = NULL;
wolfSSL 0:9d17e4342598 9975 dh->priv_key = NULL;
wolfSSL 0:9d17e4342598 9976 dh->internal = NULL;
wolfSSL 0:9d17e4342598 9977 dh->inSet = 0;
wolfSSL 0:9d17e4342598 9978 dh->exSet = 0;
wolfSSL 0:9d17e4342598 9979 }
wolfSSL 0:9d17e4342598 9980 }
wolfSSL 0:9d17e4342598 9981
wolfSSL 0:9d17e4342598 9982
wolfSSL 0:9d17e4342598 9983 CYASSL_DH* CyaSSL_DH_new(void)
wolfSSL 0:9d17e4342598 9984 {
wolfSSL 0:9d17e4342598 9985 CYASSL_DH* external;
wolfSSL 0:9d17e4342598 9986 DhKey* key;
wolfSSL 0:9d17e4342598 9987
wolfSSL 0:9d17e4342598 9988 CYASSL_MSG("CyaSSL_DH_new");
wolfSSL 0:9d17e4342598 9989
wolfSSL 0:9d17e4342598 9990 key = (DhKey*) XMALLOC(sizeof(DhKey), NULL, DYNAMIC_TYPE_DH);
wolfSSL 0:9d17e4342598 9991 if (key == NULL) {
wolfSSL 0:9d17e4342598 9992 CYASSL_MSG("CyaSSL_DH_new malloc DhKey failure");
wolfSSL 0:9d17e4342598 9993 return NULL;
wolfSSL 0:9d17e4342598 9994 }
wolfSSL 0:9d17e4342598 9995
wolfSSL 0:9d17e4342598 9996 external = (CYASSL_DH*) XMALLOC(sizeof(CYASSL_DH), NULL,
wolfSSL 0:9d17e4342598 9997 DYNAMIC_TYPE_DH);
wolfSSL 0:9d17e4342598 9998 if (external == NULL) {
wolfSSL 0:9d17e4342598 9999 CYASSL_MSG("CyaSSL_DH_new malloc CYASSL_DH failure");
wolfSSL 0:9d17e4342598 10000 XFREE(key, NULL, DYNAMIC_TYPE_DH);
wolfSSL 0:9d17e4342598 10001 return NULL;
wolfSSL 0:9d17e4342598 10002 }
wolfSSL 0:9d17e4342598 10003
wolfSSL 0:9d17e4342598 10004 InitCyaSSL_DH(external);
wolfSSL 0:9d17e4342598 10005 InitDhKey(key);
wolfSSL 0:9d17e4342598 10006 external->internal = key;
wolfSSL 0:9d17e4342598 10007
wolfSSL 0:9d17e4342598 10008 return external;
wolfSSL 0:9d17e4342598 10009 }
wolfSSL 0:9d17e4342598 10010
wolfSSL 0:9d17e4342598 10011
wolfSSL 0:9d17e4342598 10012 void CyaSSL_DH_free(CYASSL_DH* dh)
wolfSSL 0:9d17e4342598 10013 {
wolfSSL 0:9d17e4342598 10014 CYASSL_MSG("CyaSSL_DH_free");
wolfSSL 0:9d17e4342598 10015
wolfSSL 0:9d17e4342598 10016 if (dh) {
wolfSSL 0:9d17e4342598 10017 if (dh->internal) {
wolfSSL 0:9d17e4342598 10018 FreeDhKey((DhKey*)dh->internal);
wolfSSL 0:9d17e4342598 10019 XFREE(dh->internal, NULL, DYNAMIC_TYPE_DH);
wolfSSL 0:9d17e4342598 10020 dh->internal = NULL;
wolfSSL 0:9d17e4342598 10021 }
wolfSSL 0:9d17e4342598 10022 CyaSSL_BN_free(dh->priv_key);
wolfSSL 0:9d17e4342598 10023 CyaSSL_BN_free(dh->pub_key);
wolfSSL 0:9d17e4342598 10024 CyaSSL_BN_free(dh->g);
wolfSSL 0:9d17e4342598 10025 CyaSSL_BN_free(dh->p);
wolfSSL 0:9d17e4342598 10026 InitCyaSSL_DH(dh); /* set back to NULLs for safety */
wolfSSL 0:9d17e4342598 10027
wolfSSL 0:9d17e4342598 10028 XFREE(dh, NULL, DYNAMIC_TYPE_DH);
wolfSSL 0:9d17e4342598 10029 }
wolfSSL 0:9d17e4342598 10030 }
wolfSSL 0:9d17e4342598 10031
wolfSSL 0:9d17e4342598 10032
wolfSSL 0:9d17e4342598 10033 static int SetDhInternal(CYASSL_DH* dh)
wolfSSL 0:9d17e4342598 10034 {
wolfSSL 0:9d17e4342598 10035 unsigned char p[1024];
wolfSSL 0:9d17e4342598 10036 unsigned char g[1024];
wolfSSL 0:9d17e4342598 10037 int pSz = sizeof(p);
wolfSSL 0:9d17e4342598 10038 int gSz = sizeof(g);
wolfSSL 0:9d17e4342598 10039
wolfSSL 0:9d17e4342598 10040 CYASSL_ENTER("SetDhInternal");
wolfSSL 0:9d17e4342598 10041
wolfSSL 0:9d17e4342598 10042 if (dh == NULL || dh->p == NULL || dh->g == NULL) {
wolfSSL 0:9d17e4342598 10043 CYASSL_MSG("Bad function arguments");
wolfSSL 0:9d17e4342598 10044 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 10045 }
wolfSSL 0:9d17e4342598 10046
wolfSSL 0:9d17e4342598 10047 if (CyaSSL_BN_bn2bin(dh->p, NULL) > pSz) {
wolfSSL 0:9d17e4342598 10048 CYASSL_MSG("Bad p internal size");
wolfSSL 0:9d17e4342598 10049 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 10050 }
wolfSSL 0:9d17e4342598 10051
wolfSSL 0:9d17e4342598 10052 if (CyaSSL_BN_bn2bin(dh->g, NULL) > gSz) {
wolfSSL 0:9d17e4342598 10053 CYASSL_MSG("Bad g internal size");
wolfSSL 0:9d17e4342598 10054 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 10055 }
wolfSSL 0:9d17e4342598 10056
wolfSSL 0:9d17e4342598 10057 pSz = CyaSSL_BN_bn2bin(dh->p, p);
wolfSSL 0:9d17e4342598 10058 gSz = CyaSSL_BN_bn2bin(dh->g, g);
wolfSSL 0:9d17e4342598 10059
wolfSSL 0:9d17e4342598 10060 if (pSz <= 0 || gSz <= 0) {
wolfSSL 0:9d17e4342598 10061 CYASSL_MSG("Bad BN2bin set");
wolfSSL 0:9d17e4342598 10062 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 10063 }
wolfSSL 0:9d17e4342598 10064
wolfSSL 0:9d17e4342598 10065 if (DhSetKey((DhKey*)dh->internal, p, pSz, g, gSz) < 0) {
wolfSSL 0:9d17e4342598 10066 CYASSL_MSG("Bad DH SetKey");
wolfSSL 0:9d17e4342598 10067 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 10068 }
wolfSSL 0:9d17e4342598 10069
wolfSSL 0:9d17e4342598 10070 dh->inSet = 1;
wolfSSL 0:9d17e4342598 10071
wolfSSL 0:9d17e4342598 10072 return 0;
wolfSSL 0:9d17e4342598 10073 }
wolfSSL 0:9d17e4342598 10074
wolfSSL 0:9d17e4342598 10075
wolfSSL 0:9d17e4342598 10076 int CyaSSL_DH_size(CYASSL_DH* dh)
wolfSSL 0:9d17e4342598 10077 {
wolfSSL 0:9d17e4342598 10078 CYASSL_MSG("CyaSSL_DH_size");
wolfSSL 0:9d17e4342598 10079
wolfSSL 0:9d17e4342598 10080 if (dh == NULL)
wolfSSL 0:9d17e4342598 10081 return 0;
wolfSSL 0:9d17e4342598 10082
wolfSSL 0:9d17e4342598 10083 return CyaSSL_BN_num_bytes(dh->p);
wolfSSL 0:9d17e4342598 10084 }
wolfSSL 0:9d17e4342598 10085
wolfSSL 0:9d17e4342598 10086
wolfSSL 0:9d17e4342598 10087 /* return SSL_SUCCESS on ok, else 0 */
wolfSSL 0:9d17e4342598 10088 int CyaSSL_DH_generate_key(CYASSL_DH* dh)
wolfSSL 0:9d17e4342598 10089 {
wolfSSL 0:9d17e4342598 10090 unsigned char pub [768];
wolfSSL 0:9d17e4342598 10091 unsigned char priv[768];
wolfSSL 0:9d17e4342598 10092 word32 pubSz = sizeof(pub);
wolfSSL 0:9d17e4342598 10093 word32 privSz = sizeof(priv);
wolfSSL 0:9d17e4342598 10094 RNG tmpRNG;
wolfSSL 0:9d17e4342598 10095 RNG* rng = &tmpRNG;
wolfSSL 0:9d17e4342598 10096
wolfSSL 0:9d17e4342598 10097 CYASSL_MSG("CyaSSL_DH_generate_key");
wolfSSL 0:9d17e4342598 10098
wolfSSL 0:9d17e4342598 10099 if (dh == NULL || dh->p == NULL || dh->g == NULL) {
wolfSSL 0:9d17e4342598 10100 CYASSL_MSG("Bad function arguments");
wolfSSL 0:9d17e4342598 10101 return 0;
wolfSSL 0:9d17e4342598 10102 }
wolfSSL 0:9d17e4342598 10103
wolfSSL 0:9d17e4342598 10104 if (dh->inSet == 0) {
wolfSSL 0:9d17e4342598 10105 if (SetDhInternal(dh) < 0) {
wolfSSL 0:9d17e4342598 10106 CYASSL_MSG("Bad DH set internal");
wolfSSL 0:9d17e4342598 10107 return 0;
wolfSSL 0:9d17e4342598 10108 }
wolfSSL 0:9d17e4342598 10109 }
wolfSSL 0:9d17e4342598 10110
wolfSSL 0:9d17e4342598 10111 if ( (InitRng(&tmpRNG)) != 0) {
wolfSSL 0:9d17e4342598 10112 CYASSL_MSG("Bad RNG Init, trying global");
wolfSSL 0:9d17e4342598 10113 if (initGlobalRNG == 0) {
wolfSSL 0:9d17e4342598 10114 CYASSL_MSG("Global RNG no Init");
wolfSSL 0:9d17e4342598 10115 return 0;
wolfSSL 0:9d17e4342598 10116 }
wolfSSL 0:9d17e4342598 10117 rng = &globalRNG;
wolfSSL 0:9d17e4342598 10118 }
wolfSSL 0:9d17e4342598 10119
wolfSSL 0:9d17e4342598 10120 if (DhGenerateKeyPair((DhKey*)dh->internal, rng, priv, &privSz,
wolfSSL 0:9d17e4342598 10121 pub, &pubSz) < 0) {
wolfSSL 0:9d17e4342598 10122 CYASSL_MSG("Bad DhGenerateKeyPair");
wolfSSL 0:9d17e4342598 10123 return 0;
wolfSSL 0:9d17e4342598 10124 }
wolfSSL 0:9d17e4342598 10125
wolfSSL 0:9d17e4342598 10126 if (dh->pub_key)
wolfSSL 0:9d17e4342598 10127 CyaSSL_BN_free(dh->pub_key);
wolfSSL 0:9d17e4342598 10128 dh->pub_key = CyaSSL_BN_new();
wolfSSL 0:9d17e4342598 10129 if (dh->pub_key == NULL) {
wolfSSL 0:9d17e4342598 10130 CYASSL_MSG("Bad DH new pub");
wolfSSL 0:9d17e4342598 10131 return 0;
wolfSSL 0:9d17e4342598 10132 }
wolfSSL 0:9d17e4342598 10133
wolfSSL 0:9d17e4342598 10134 if (dh->priv_key)
wolfSSL 0:9d17e4342598 10135 CyaSSL_BN_free(dh->priv_key);
wolfSSL 0:9d17e4342598 10136 dh->priv_key = CyaSSL_BN_new();
wolfSSL 0:9d17e4342598 10137 if (dh->priv_key == NULL) {
wolfSSL 0:9d17e4342598 10138 CYASSL_MSG("Bad DH new priv");
wolfSSL 0:9d17e4342598 10139 return 0;
wolfSSL 0:9d17e4342598 10140 }
wolfSSL 0:9d17e4342598 10141
wolfSSL 0:9d17e4342598 10142 if (CyaSSL_BN_bin2bn(pub, pubSz, dh->pub_key) == NULL) {
wolfSSL 0:9d17e4342598 10143 CYASSL_MSG("Bad DH bn2bin error pub");
wolfSSL 0:9d17e4342598 10144 return 0;
wolfSSL 0:9d17e4342598 10145 }
wolfSSL 0:9d17e4342598 10146
wolfSSL 0:9d17e4342598 10147 if (CyaSSL_BN_bin2bn(priv, privSz, dh->priv_key) == NULL) {
wolfSSL 0:9d17e4342598 10148 CYASSL_MSG("Bad DH bn2bin error priv");
wolfSSL 0:9d17e4342598 10149 return 0;
wolfSSL 0:9d17e4342598 10150 }
wolfSSL 0:9d17e4342598 10151
wolfSSL 0:9d17e4342598 10152 CYASSL_MSG("CyaSSL_generate_key success");
wolfSSL 0:9d17e4342598 10153 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 10154 }
wolfSSL 0:9d17e4342598 10155
wolfSSL 0:9d17e4342598 10156
wolfSSL 0:9d17e4342598 10157 /* return key size on ok, 0 otherwise */
wolfSSL 0:9d17e4342598 10158 int CyaSSL_DH_compute_key(unsigned char* key, CYASSL_BIGNUM* otherPub,
wolfSSL 0:9d17e4342598 10159 CYASSL_DH* dh)
wolfSSL 0:9d17e4342598 10160 {
wolfSSL 0:9d17e4342598 10161 unsigned char pub [1024];
wolfSSL 0:9d17e4342598 10162 unsigned char priv[1024];
wolfSSL 0:9d17e4342598 10163 word32 pubSz = sizeof(pub);
wolfSSL 0:9d17e4342598 10164 word32 privSz = sizeof(priv);
wolfSSL 0:9d17e4342598 10165 word32 keySz;
wolfSSL 0:9d17e4342598 10166
wolfSSL 0:9d17e4342598 10167 CYASSL_MSG("CyaSSL_DH_compute_key");
wolfSSL 0:9d17e4342598 10168
wolfSSL 0:9d17e4342598 10169 if (dh == NULL || dh->priv_key == NULL || otherPub == NULL) {
wolfSSL 0:9d17e4342598 10170 CYASSL_MSG("Bad function arguments");
wolfSSL 0:9d17e4342598 10171 return 0;
wolfSSL 0:9d17e4342598 10172 }
wolfSSL 0:9d17e4342598 10173
wolfSSL 0:9d17e4342598 10174 keySz = (word32)DH_size(dh);
wolfSSL 0:9d17e4342598 10175 if (keySz == 0) {
wolfSSL 0:9d17e4342598 10176 CYASSL_MSG("Bad DH_size");
wolfSSL 0:9d17e4342598 10177 return 0;
wolfSSL 0:9d17e4342598 10178 }
wolfSSL 0:9d17e4342598 10179
wolfSSL 0:9d17e4342598 10180 if (CyaSSL_BN_bn2bin(dh->priv_key, NULL) > (int)privSz) {
wolfSSL 0:9d17e4342598 10181 CYASSL_MSG("Bad priv internal size");
wolfSSL 0:9d17e4342598 10182 return 0;
wolfSSL 0:9d17e4342598 10183 }
wolfSSL 0:9d17e4342598 10184
wolfSSL 0:9d17e4342598 10185 if (CyaSSL_BN_bn2bin(otherPub, NULL) > (int)pubSz) {
wolfSSL 0:9d17e4342598 10186 CYASSL_MSG("Bad otherPub size");
wolfSSL 0:9d17e4342598 10187 return 0;
wolfSSL 0:9d17e4342598 10188 }
wolfSSL 0:9d17e4342598 10189
wolfSSL 0:9d17e4342598 10190 privSz = CyaSSL_BN_bn2bin(dh->priv_key, priv);
wolfSSL 0:9d17e4342598 10191 pubSz = CyaSSL_BN_bn2bin(otherPub, pub);
wolfSSL 0:9d17e4342598 10192
wolfSSL 0:9d17e4342598 10193 if (privSz <= 0 || pubSz <= 0) {
wolfSSL 0:9d17e4342598 10194 CYASSL_MSG("Bad BN2bin set");
wolfSSL 0:9d17e4342598 10195 return 0;
wolfSSL 0:9d17e4342598 10196 }
wolfSSL 0:9d17e4342598 10197
wolfSSL 0:9d17e4342598 10198 if (DhAgree((DhKey*)dh->internal, key, &keySz, priv, privSz, pub,
wolfSSL 0:9d17e4342598 10199 pubSz) < 0) {
wolfSSL 0:9d17e4342598 10200 CYASSL_MSG("DhAgree failed");
wolfSSL 0:9d17e4342598 10201 return 0;
wolfSSL 0:9d17e4342598 10202 }
wolfSSL 0:9d17e4342598 10203
wolfSSL 0:9d17e4342598 10204 CYASSL_MSG("CyaSSL_compute_key success");
wolfSSL 0:9d17e4342598 10205 return (int)keySz;
wolfSSL 0:9d17e4342598 10206 }
wolfSSL 0:9d17e4342598 10207
wolfSSL 0:9d17e4342598 10208
wolfSSL 0:9d17e4342598 10209 #ifndef NO_DSA
wolfSSL 0:9d17e4342598 10210 static void InitCyaSSL_DSA(CYASSL_DSA* dsa)
wolfSSL 0:9d17e4342598 10211 {
wolfSSL 0:9d17e4342598 10212 if (dsa) {
wolfSSL 0:9d17e4342598 10213 dsa->p = NULL;
wolfSSL 0:9d17e4342598 10214 dsa->q = NULL;
wolfSSL 0:9d17e4342598 10215 dsa->g = NULL;
wolfSSL 0:9d17e4342598 10216 dsa->pub_key = NULL;
wolfSSL 0:9d17e4342598 10217 dsa->priv_key = NULL;
wolfSSL 0:9d17e4342598 10218 dsa->internal = NULL;
wolfSSL 0:9d17e4342598 10219 dsa->inSet = 0;
wolfSSL 0:9d17e4342598 10220 dsa->exSet = 0;
wolfSSL 0:9d17e4342598 10221 }
wolfSSL 0:9d17e4342598 10222 }
wolfSSL 0:9d17e4342598 10223
wolfSSL 0:9d17e4342598 10224
wolfSSL 0:9d17e4342598 10225 CYASSL_DSA* CyaSSL_DSA_new(void)
wolfSSL 0:9d17e4342598 10226 {
wolfSSL 0:9d17e4342598 10227 CYASSL_DSA* external;
wolfSSL 0:9d17e4342598 10228 DsaKey* key;
wolfSSL 0:9d17e4342598 10229
wolfSSL 0:9d17e4342598 10230 CYASSL_MSG("CyaSSL_DSA_new");
wolfSSL 0:9d17e4342598 10231
wolfSSL 0:9d17e4342598 10232 key = (DsaKey*) XMALLOC(sizeof(DsaKey), NULL, DYNAMIC_TYPE_DSA);
wolfSSL 0:9d17e4342598 10233 if (key == NULL) {
wolfSSL 0:9d17e4342598 10234 CYASSL_MSG("CyaSSL_DSA_new malloc DsaKey failure");
wolfSSL 0:9d17e4342598 10235 return NULL;
wolfSSL 0:9d17e4342598 10236 }
wolfSSL 0:9d17e4342598 10237
wolfSSL 0:9d17e4342598 10238 external = (CYASSL_DSA*) XMALLOC(sizeof(CYASSL_DSA), NULL,
wolfSSL 0:9d17e4342598 10239 DYNAMIC_TYPE_DSA);
wolfSSL 0:9d17e4342598 10240 if (external == NULL) {
wolfSSL 0:9d17e4342598 10241 CYASSL_MSG("CyaSSL_DSA_new malloc CYASSL_DSA failure");
wolfSSL 0:9d17e4342598 10242 XFREE(key, NULL, DYNAMIC_TYPE_DSA);
wolfSSL 0:9d17e4342598 10243 return NULL;
wolfSSL 0:9d17e4342598 10244 }
wolfSSL 0:9d17e4342598 10245
wolfSSL 0:9d17e4342598 10246 InitCyaSSL_DSA(external);
wolfSSL 0:9d17e4342598 10247 InitDsaKey(key);
wolfSSL 0:9d17e4342598 10248 external->internal = key;
wolfSSL 0:9d17e4342598 10249
wolfSSL 0:9d17e4342598 10250 return external;
wolfSSL 0:9d17e4342598 10251 }
wolfSSL 0:9d17e4342598 10252
wolfSSL 0:9d17e4342598 10253
wolfSSL 0:9d17e4342598 10254 void CyaSSL_DSA_free(CYASSL_DSA* dsa)
wolfSSL 0:9d17e4342598 10255 {
wolfSSL 0:9d17e4342598 10256 CYASSL_MSG("CyaSSL_DSA_free");
wolfSSL 0:9d17e4342598 10257
wolfSSL 0:9d17e4342598 10258 if (dsa) {
wolfSSL 0:9d17e4342598 10259 if (dsa->internal) {
wolfSSL 0:9d17e4342598 10260 FreeDsaKey((DsaKey*)dsa->internal);
wolfSSL 0:9d17e4342598 10261 XFREE(dsa->internal, NULL, DYNAMIC_TYPE_DSA);
wolfSSL 0:9d17e4342598 10262 dsa->internal = NULL;
wolfSSL 0:9d17e4342598 10263 }
wolfSSL 0:9d17e4342598 10264 CyaSSL_BN_free(dsa->priv_key);
wolfSSL 0:9d17e4342598 10265 CyaSSL_BN_free(dsa->pub_key);
wolfSSL 0:9d17e4342598 10266 CyaSSL_BN_free(dsa->g);
wolfSSL 0:9d17e4342598 10267 CyaSSL_BN_free(dsa->q);
wolfSSL 0:9d17e4342598 10268 CyaSSL_BN_free(dsa->p);
wolfSSL 0:9d17e4342598 10269 InitCyaSSL_DSA(dsa); /* set back to NULLs for safety */
wolfSSL 0:9d17e4342598 10270
wolfSSL 0:9d17e4342598 10271 XFREE(dsa, NULL, DYNAMIC_TYPE_DSA);
wolfSSL 0:9d17e4342598 10272 }
wolfSSL 0:9d17e4342598 10273 }
wolfSSL 0:9d17e4342598 10274
wolfSSL 0:9d17e4342598 10275
wolfSSL 0:9d17e4342598 10276 int CyaSSL_DSA_generate_key(CYASSL_DSA* dsa)
wolfSSL 0:9d17e4342598 10277 {
wolfSSL 0:9d17e4342598 10278 (void)dsa;
wolfSSL 0:9d17e4342598 10279
wolfSSL 0:9d17e4342598 10280 CYASSL_MSG("CyaSSL_DSA_generate_key");
wolfSSL 0:9d17e4342598 10281
wolfSSL 0:9d17e4342598 10282 return 0; /* key gen not needed by server */
wolfSSL 0:9d17e4342598 10283 }
wolfSSL 0:9d17e4342598 10284
wolfSSL 0:9d17e4342598 10285
wolfSSL 0:9d17e4342598 10286 int CyaSSL_DSA_generate_parameters_ex(CYASSL_DSA* dsa, int bits,
wolfSSL 0:9d17e4342598 10287 unsigned char* seed, int seedLen, int* counterRet,
wolfSSL 0:9d17e4342598 10288 unsigned long* hRet, void* cb)
wolfSSL 0:9d17e4342598 10289 {
wolfSSL 0:9d17e4342598 10290 (void)dsa;
wolfSSL 0:9d17e4342598 10291 (void)bits;
wolfSSL 0:9d17e4342598 10292 (void)seed;
wolfSSL 0:9d17e4342598 10293 (void)seedLen;
wolfSSL 0:9d17e4342598 10294 (void)counterRet;
wolfSSL 0:9d17e4342598 10295 (void)hRet;
wolfSSL 0:9d17e4342598 10296 (void)cb;
wolfSSL 0:9d17e4342598 10297
wolfSSL 0:9d17e4342598 10298 CYASSL_MSG("CyaSSL_DSA_generate_parameters_ex");
wolfSSL 0:9d17e4342598 10299
wolfSSL 0:9d17e4342598 10300 return 0; /* key gen not needed by server */
wolfSSL 0:9d17e4342598 10301 }
wolfSSL 0:9d17e4342598 10302 #endif /* NO_DSA */
wolfSSL 0:9d17e4342598 10303
wolfSSL 0:9d17e4342598 10304 static void InitCyaSSL_Rsa(CYASSL_RSA* rsa)
wolfSSL 0:9d17e4342598 10305 {
wolfSSL 0:9d17e4342598 10306 if (rsa) {
wolfSSL 0:9d17e4342598 10307 rsa->n = NULL;
wolfSSL 0:9d17e4342598 10308 rsa->e = NULL;
wolfSSL 0:9d17e4342598 10309 rsa->d = NULL;
wolfSSL 0:9d17e4342598 10310 rsa->p = NULL;
wolfSSL 0:9d17e4342598 10311 rsa->q = NULL;
wolfSSL 0:9d17e4342598 10312 rsa->dmp1 = NULL;
wolfSSL 0:9d17e4342598 10313 rsa->dmq1 = NULL;
wolfSSL 0:9d17e4342598 10314 rsa->iqmp = NULL;
wolfSSL 0:9d17e4342598 10315 rsa->internal = NULL;
wolfSSL 0:9d17e4342598 10316 rsa->inSet = 0;
wolfSSL 0:9d17e4342598 10317 rsa->exSet = 0;
wolfSSL 0:9d17e4342598 10318 }
wolfSSL 0:9d17e4342598 10319 }
wolfSSL 0:9d17e4342598 10320
wolfSSL 0:9d17e4342598 10321
wolfSSL 0:9d17e4342598 10322 CYASSL_RSA* CyaSSL_RSA_new(void)
wolfSSL 0:9d17e4342598 10323 {
wolfSSL 0:9d17e4342598 10324 CYASSL_RSA* external;
wolfSSL 0:9d17e4342598 10325 RsaKey* key;
wolfSSL 0:9d17e4342598 10326
wolfSSL 0:9d17e4342598 10327 CYASSL_MSG("CyaSSL_RSA_new");
wolfSSL 0:9d17e4342598 10328
wolfSSL 0:9d17e4342598 10329 key = (RsaKey*) XMALLOC(sizeof(RsaKey), NULL, DYNAMIC_TYPE_RSA);
wolfSSL 0:9d17e4342598 10330 if (key == NULL) {
wolfSSL 0:9d17e4342598 10331 CYASSL_MSG("CyaSSL_RSA_new malloc RsaKey failure");
wolfSSL 0:9d17e4342598 10332 return NULL;
wolfSSL 0:9d17e4342598 10333 }
wolfSSL 0:9d17e4342598 10334
wolfSSL 0:9d17e4342598 10335 external = (CYASSL_RSA*) XMALLOC(sizeof(CYASSL_RSA), NULL,
wolfSSL 0:9d17e4342598 10336 DYNAMIC_TYPE_RSA);
wolfSSL 0:9d17e4342598 10337 if (external == NULL) {
wolfSSL 0:9d17e4342598 10338 CYASSL_MSG("CyaSSL_RSA_new malloc CYASSL_RSA failure");
wolfSSL 0:9d17e4342598 10339 XFREE(key, NULL, DYNAMIC_TYPE_RSA);
wolfSSL 0:9d17e4342598 10340 return NULL;
wolfSSL 0:9d17e4342598 10341 }
wolfSSL 0:9d17e4342598 10342
wolfSSL 0:9d17e4342598 10343 InitCyaSSL_Rsa(external);
wolfSSL 0:9d17e4342598 10344 if (InitRsaKey(key, NULL) != 0) {
wolfSSL 0:9d17e4342598 10345 CYASSL_MSG("InitRsaKey CYASSL_RSA failure");
wolfSSL 0:9d17e4342598 10346 XFREE(external, NULL, DYNAMIC_TYPE_RSA);
wolfSSL 0:9d17e4342598 10347 XFREE(key, NULL, DYNAMIC_TYPE_RSA);
wolfSSL 0:9d17e4342598 10348 return NULL;
wolfSSL 0:9d17e4342598 10349 }
wolfSSL 0:9d17e4342598 10350 external->internal = key;
wolfSSL 0:9d17e4342598 10351
wolfSSL 0:9d17e4342598 10352 return external;
wolfSSL 0:9d17e4342598 10353 }
wolfSSL 0:9d17e4342598 10354
wolfSSL 0:9d17e4342598 10355
wolfSSL 0:9d17e4342598 10356 void CyaSSL_RSA_free(CYASSL_RSA* rsa)
wolfSSL 0:9d17e4342598 10357 {
wolfSSL 0:9d17e4342598 10358 CYASSL_MSG("CyaSSL_RSA_free");
wolfSSL 0:9d17e4342598 10359
wolfSSL 0:9d17e4342598 10360 if (rsa) {
wolfSSL 0:9d17e4342598 10361 if (rsa->internal) {
wolfSSL 0:9d17e4342598 10362 FreeRsaKey((RsaKey*)rsa->internal);
wolfSSL 0:9d17e4342598 10363 XFREE(rsa->internal, NULL, DYNAMIC_TYPE_RSA);
wolfSSL 0:9d17e4342598 10364 rsa->internal = NULL;
wolfSSL 0:9d17e4342598 10365 }
wolfSSL 0:9d17e4342598 10366 CyaSSL_BN_free(rsa->iqmp);
wolfSSL 0:9d17e4342598 10367 CyaSSL_BN_free(rsa->dmq1);
wolfSSL 0:9d17e4342598 10368 CyaSSL_BN_free(rsa->dmp1);
wolfSSL 0:9d17e4342598 10369 CyaSSL_BN_free(rsa->q);
wolfSSL 0:9d17e4342598 10370 CyaSSL_BN_free(rsa->p);
wolfSSL 0:9d17e4342598 10371 CyaSSL_BN_free(rsa->d);
wolfSSL 0:9d17e4342598 10372 CyaSSL_BN_free(rsa->e);
wolfSSL 0:9d17e4342598 10373 CyaSSL_BN_free(rsa->n);
wolfSSL 0:9d17e4342598 10374 InitCyaSSL_Rsa(rsa); /* set back to NULLs for safety */
wolfSSL 0:9d17e4342598 10375
wolfSSL 0:9d17e4342598 10376 XFREE(rsa, NULL, DYNAMIC_TYPE_RSA);
wolfSSL 0:9d17e4342598 10377 }
wolfSSL 0:9d17e4342598 10378 }
wolfSSL 0:9d17e4342598 10379
wolfSSL 0:9d17e4342598 10380
wolfSSL 0:9d17e4342598 10381 static int SetIndividualExternal(CYASSL_BIGNUM** bn, mp_int* mpi)
wolfSSL 0:9d17e4342598 10382 {
wolfSSL 0:9d17e4342598 10383 CYASSL_MSG("Entering SetIndividualExternal");
wolfSSL 0:9d17e4342598 10384
wolfSSL 0:9d17e4342598 10385 if (mpi == NULL) {
wolfSSL 0:9d17e4342598 10386 CYASSL_MSG("mpi NULL error");
wolfSSL 0:9d17e4342598 10387 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 10388 }
wolfSSL 0:9d17e4342598 10389
wolfSSL 0:9d17e4342598 10390 if (*bn == NULL) {
wolfSSL 0:9d17e4342598 10391 *bn = CyaSSL_BN_new();
wolfSSL 0:9d17e4342598 10392 if (*bn == NULL) {
wolfSSL 0:9d17e4342598 10393 CYASSL_MSG("SetIndividualExternal alloc failed");
wolfSSL 0:9d17e4342598 10394 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 10395 }
wolfSSL 0:9d17e4342598 10396 }
wolfSSL 0:9d17e4342598 10397
wolfSSL 0:9d17e4342598 10398 if (mp_copy(mpi, (mp_int*)((*bn)->internal)) != MP_OKAY) {
wolfSSL 0:9d17e4342598 10399 CYASSL_MSG("mp_copy error");
wolfSSL 0:9d17e4342598 10400 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 10401 }
wolfSSL 0:9d17e4342598 10402
wolfSSL 0:9d17e4342598 10403 return 0;
wolfSSL 0:9d17e4342598 10404 }
wolfSSL 0:9d17e4342598 10405
wolfSSL 0:9d17e4342598 10406
wolfSSL 0:9d17e4342598 10407 #ifndef NO_DSA
wolfSSL 0:9d17e4342598 10408 static int SetDsaExternal(CYASSL_DSA* dsa)
wolfSSL 0:9d17e4342598 10409 {
wolfSSL 0:9d17e4342598 10410 DsaKey* key;
wolfSSL 0:9d17e4342598 10411 CYASSL_MSG("Entering SetDsaExternal");
wolfSSL 0:9d17e4342598 10412
wolfSSL 0:9d17e4342598 10413 if (dsa == NULL || dsa->internal == NULL) {
wolfSSL 0:9d17e4342598 10414 CYASSL_MSG("dsa key NULL error");
wolfSSL 0:9d17e4342598 10415 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 10416 }
wolfSSL 0:9d17e4342598 10417
wolfSSL 0:9d17e4342598 10418 key = (DsaKey*)dsa->internal;
wolfSSL 0:9d17e4342598 10419
wolfSSL 0:9d17e4342598 10420 if (SetIndividualExternal(&dsa->p, &key->p) < 0) {
wolfSSL 0:9d17e4342598 10421 CYASSL_MSG("dsa p key error");
wolfSSL 0:9d17e4342598 10422 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 10423 }
wolfSSL 0:9d17e4342598 10424
wolfSSL 0:9d17e4342598 10425 if (SetIndividualExternal(&dsa->q, &key->q) < 0) {
wolfSSL 0:9d17e4342598 10426 CYASSL_MSG("dsa q key error");
wolfSSL 0:9d17e4342598 10427 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 10428 }
wolfSSL 0:9d17e4342598 10429
wolfSSL 0:9d17e4342598 10430 if (SetIndividualExternal(&dsa->g, &key->g) < 0) {
wolfSSL 0:9d17e4342598 10431 CYASSL_MSG("dsa g key error");
wolfSSL 0:9d17e4342598 10432 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 10433 }
wolfSSL 0:9d17e4342598 10434
wolfSSL 0:9d17e4342598 10435 if (SetIndividualExternal(&dsa->pub_key, &key->y) < 0) {
wolfSSL 0:9d17e4342598 10436 CYASSL_MSG("dsa y key error");
wolfSSL 0:9d17e4342598 10437 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 10438 }
wolfSSL 0:9d17e4342598 10439
wolfSSL 0:9d17e4342598 10440 if (SetIndividualExternal(&dsa->priv_key, &key->x) < 0) {
wolfSSL 0:9d17e4342598 10441 CYASSL_MSG("dsa x key error");
wolfSSL 0:9d17e4342598 10442 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 10443 }
wolfSSL 0:9d17e4342598 10444
wolfSSL 0:9d17e4342598 10445 dsa->exSet = 1;
wolfSSL 0:9d17e4342598 10446
wolfSSL 0:9d17e4342598 10447 return 0;
wolfSSL 0:9d17e4342598 10448 }
wolfSSL 0:9d17e4342598 10449 #endif /* NO_DSA */
wolfSSL 0:9d17e4342598 10450
wolfSSL 0:9d17e4342598 10451
wolfSSL 0:9d17e4342598 10452 static int SetRsaExternal(CYASSL_RSA* rsa)
wolfSSL 0:9d17e4342598 10453 {
wolfSSL 0:9d17e4342598 10454 RsaKey* key;
wolfSSL 0:9d17e4342598 10455 CYASSL_MSG("Entering SetRsaExternal");
wolfSSL 0:9d17e4342598 10456
wolfSSL 0:9d17e4342598 10457 if (rsa == NULL || rsa->internal == NULL) {
wolfSSL 0:9d17e4342598 10458 CYASSL_MSG("rsa key NULL error");
wolfSSL 0:9d17e4342598 10459 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 10460 }
wolfSSL 0:9d17e4342598 10461
wolfSSL 0:9d17e4342598 10462 key = (RsaKey*)rsa->internal;
wolfSSL 0:9d17e4342598 10463
wolfSSL 0:9d17e4342598 10464 if (SetIndividualExternal(&rsa->n, &key->n) < 0) {
wolfSSL 0:9d17e4342598 10465 CYASSL_MSG("rsa n key error");
wolfSSL 0:9d17e4342598 10466 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 10467 }
wolfSSL 0:9d17e4342598 10468
wolfSSL 0:9d17e4342598 10469 if (SetIndividualExternal(&rsa->e, &key->e) < 0) {
wolfSSL 0:9d17e4342598 10470 CYASSL_MSG("rsa e key error");
wolfSSL 0:9d17e4342598 10471 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 10472 }
wolfSSL 0:9d17e4342598 10473
wolfSSL 0:9d17e4342598 10474 if (SetIndividualExternal(&rsa->d, &key->d) < 0) {
wolfSSL 0:9d17e4342598 10475 CYASSL_MSG("rsa d key error");
wolfSSL 0:9d17e4342598 10476 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 10477 }
wolfSSL 0:9d17e4342598 10478
wolfSSL 0:9d17e4342598 10479 if (SetIndividualExternal(&rsa->p, &key->p) < 0) {
wolfSSL 0:9d17e4342598 10480 CYASSL_MSG("rsa p key error");
wolfSSL 0:9d17e4342598 10481 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 10482 }
wolfSSL 0:9d17e4342598 10483
wolfSSL 0:9d17e4342598 10484 if (SetIndividualExternal(&rsa->q, &key->q) < 0) {
wolfSSL 0:9d17e4342598 10485 CYASSL_MSG("rsa q key error");
wolfSSL 0:9d17e4342598 10486 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 10487 }
wolfSSL 0:9d17e4342598 10488
wolfSSL 0:9d17e4342598 10489 if (SetIndividualExternal(&rsa->dmp1, &key->dP) < 0) {
wolfSSL 0:9d17e4342598 10490 CYASSL_MSG("rsa dP key error");
wolfSSL 0:9d17e4342598 10491 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 10492 }
wolfSSL 0:9d17e4342598 10493
wolfSSL 0:9d17e4342598 10494 if (SetIndividualExternal(&rsa->dmq1, &key->dQ) < 0) {
wolfSSL 0:9d17e4342598 10495 CYASSL_MSG("rsa dQ key error");
wolfSSL 0:9d17e4342598 10496 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 10497 }
wolfSSL 0:9d17e4342598 10498
wolfSSL 0:9d17e4342598 10499 if (SetIndividualExternal(&rsa->iqmp, &key->u) < 0) {
wolfSSL 0:9d17e4342598 10500 CYASSL_MSG("rsa u key error");
wolfSSL 0:9d17e4342598 10501 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 10502 }
wolfSSL 0:9d17e4342598 10503
wolfSSL 0:9d17e4342598 10504 rsa->exSet = 1;
wolfSSL 0:9d17e4342598 10505
wolfSSL 0:9d17e4342598 10506 return 0;
wolfSSL 0:9d17e4342598 10507 }
wolfSSL 0:9d17e4342598 10508
wolfSSL 0:9d17e4342598 10509
wolfSSL 0:9d17e4342598 10510 /* SSL_SUCCESS on ok */
wolfSSL 0:9d17e4342598 10511 int CyaSSL_RSA_generate_key_ex(CYASSL_RSA* rsa, int bits, CYASSL_BIGNUM* bn,
wolfSSL 0:9d17e4342598 10512 void* cb)
wolfSSL 0:9d17e4342598 10513 {
wolfSSL 0:9d17e4342598 10514 RNG rng;
wolfSSL 0:9d17e4342598 10515
wolfSSL 0:9d17e4342598 10516 CYASSL_MSG("CyaSSL_RSA_generate_key_ex");
wolfSSL 0:9d17e4342598 10517
wolfSSL 0:9d17e4342598 10518 (void)rsa;
wolfSSL 0:9d17e4342598 10519 (void)bits;
wolfSSL 0:9d17e4342598 10520 (void)cb;
wolfSSL 0:9d17e4342598 10521 (void)bn;
wolfSSL 0:9d17e4342598 10522
wolfSSL 0:9d17e4342598 10523 if (InitRng(&rng) < 0) {
wolfSSL 0:9d17e4342598 10524 CYASSL_MSG("RNG init failed");
wolfSSL 0:9d17e4342598 10525 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 10526 }
wolfSSL 0:9d17e4342598 10527
wolfSSL 0:9d17e4342598 10528 #ifdef CYASSL_KEY_GEN
wolfSSL 0:9d17e4342598 10529 if (MakeRsaKey((RsaKey*)rsa->internal, bits, 65537, &rng) < 0) {
wolfSSL 0:9d17e4342598 10530 CYASSL_MSG("MakeRsaKey failed");
wolfSSL 0:9d17e4342598 10531 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 10532 }
wolfSSL 0:9d17e4342598 10533
wolfSSL 0:9d17e4342598 10534 if (SetRsaExternal(rsa) < 0) {
wolfSSL 0:9d17e4342598 10535 CYASSL_MSG("SetRsaExternal failed");
wolfSSL 0:9d17e4342598 10536 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 10537 }
wolfSSL 0:9d17e4342598 10538
wolfSSL 0:9d17e4342598 10539 rsa->inSet = 1;
wolfSSL 0:9d17e4342598 10540
wolfSSL 0:9d17e4342598 10541 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 10542 #else
wolfSSL 0:9d17e4342598 10543 CYASSL_MSG("No Key Gen built in");
wolfSSL 0:9d17e4342598 10544 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 10545 #endif
wolfSSL 0:9d17e4342598 10546
wolfSSL 0:9d17e4342598 10547 }
wolfSSL 0:9d17e4342598 10548
wolfSSL 0:9d17e4342598 10549
wolfSSL 0:9d17e4342598 10550 /* SSL_SUCCESS on ok */
wolfSSL 0:9d17e4342598 10551 int CyaSSL_RSA_blinding_on(CYASSL_RSA* rsa, CYASSL_BN_CTX* bn)
wolfSSL 0:9d17e4342598 10552 {
wolfSSL 0:9d17e4342598 10553 (void)rsa;
wolfSSL 0:9d17e4342598 10554 (void)bn;
wolfSSL 0:9d17e4342598 10555
wolfSSL 0:9d17e4342598 10556 CYASSL_MSG("CyaSSL_RSA_blinding_on");
wolfSSL 0:9d17e4342598 10557
wolfSSL 0:9d17e4342598 10558 return SSL_SUCCESS; /* on by default */
wolfSSL 0:9d17e4342598 10559 }
wolfSSL 0:9d17e4342598 10560
wolfSSL 0:9d17e4342598 10561
wolfSSL 0:9d17e4342598 10562 int CyaSSL_RSA_public_encrypt(int len, unsigned char* fr,
wolfSSL 0:9d17e4342598 10563 unsigned char* to, CYASSL_RSA* rsa, int padding)
wolfSSL 0:9d17e4342598 10564 {
wolfSSL 0:9d17e4342598 10565 (void)len;
wolfSSL 0:9d17e4342598 10566 (void)fr;
wolfSSL 0:9d17e4342598 10567 (void)to;
wolfSSL 0:9d17e4342598 10568 (void)rsa;
wolfSSL 0:9d17e4342598 10569 (void)padding;
wolfSSL 0:9d17e4342598 10570
wolfSSL 0:9d17e4342598 10571 CYASSL_MSG("CyaSSL_RSA_public_encrypt");
wolfSSL 0:9d17e4342598 10572
wolfSSL 0:9d17e4342598 10573 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 10574 }
wolfSSL 0:9d17e4342598 10575
wolfSSL 0:9d17e4342598 10576
wolfSSL 0:9d17e4342598 10577 int CyaSSL_RSA_private_decrypt(int len, unsigned char* fr,
wolfSSL 0:9d17e4342598 10578 unsigned char* to, CYASSL_RSA* rsa, int padding)
wolfSSL 0:9d17e4342598 10579 {
wolfSSL 0:9d17e4342598 10580 (void)len;
wolfSSL 0:9d17e4342598 10581 (void)fr;
wolfSSL 0:9d17e4342598 10582 (void)to;
wolfSSL 0:9d17e4342598 10583 (void)rsa;
wolfSSL 0:9d17e4342598 10584 (void)padding;
wolfSSL 0:9d17e4342598 10585
wolfSSL 0:9d17e4342598 10586 CYASSL_MSG("CyaSSL_RSA_private_decrypt");
wolfSSL 0:9d17e4342598 10587
wolfSSL 0:9d17e4342598 10588 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 10589 }
wolfSSL 0:9d17e4342598 10590
wolfSSL 0:9d17e4342598 10591
wolfSSL 0:9d17e4342598 10592 int CyaSSL_RSA_size(const CYASSL_RSA* rsa)
wolfSSL 0:9d17e4342598 10593 {
wolfSSL 0:9d17e4342598 10594 CYASSL_MSG("CyaSSL_RSA_size");
wolfSSL 0:9d17e4342598 10595
wolfSSL 0:9d17e4342598 10596 if (rsa == NULL)
wolfSSL 0:9d17e4342598 10597 return 0;
wolfSSL 0:9d17e4342598 10598
wolfSSL 0:9d17e4342598 10599 return CyaSSL_BN_num_bytes(rsa->n);
wolfSSL 0:9d17e4342598 10600 }
wolfSSL 0:9d17e4342598 10601
wolfSSL 0:9d17e4342598 10602
wolfSSL 0:9d17e4342598 10603 #ifndef NO_DSA
wolfSSL 0:9d17e4342598 10604 /* return SSL_SUCCESS on success, < 0 otherwise */
wolfSSL 0:9d17e4342598 10605 int CyaSSL_DSA_do_sign(const unsigned char* d, unsigned char* sigRet,
wolfSSL 0:9d17e4342598 10606 CYASSL_DSA* dsa)
wolfSSL 0:9d17e4342598 10607 {
wolfSSL 0:9d17e4342598 10608 RNG tmpRNG;
wolfSSL 0:9d17e4342598 10609 RNG* rng = &tmpRNG;
wolfSSL 0:9d17e4342598 10610
wolfSSL 0:9d17e4342598 10611 CYASSL_MSG("CyaSSL_DSA_do_sign");
wolfSSL 0:9d17e4342598 10612
wolfSSL 0:9d17e4342598 10613 if (d == NULL || sigRet == NULL || dsa == NULL) {
wolfSSL 0:9d17e4342598 10614 CYASSL_MSG("Bad function arguments");
wolfSSL 0:9d17e4342598 10615 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 10616 }
wolfSSL 0:9d17e4342598 10617
wolfSSL 0:9d17e4342598 10618 if (dsa->inSet == 0) {
wolfSSL 0:9d17e4342598 10619 CYASSL_MSG("No DSA internal set");
wolfSSL 0:9d17e4342598 10620 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 10621 }
wolfSSL 0:9d17e4342598 10622
wolfSSL 0:9d17e4342598 10623 if (InitRng(&tmpRNG) != 0) {
wolfSSL 0:9d17e4342598 10624 CYASSL_MSG("Bad RNG Init, trying global");
wolfSSL 0:9d17e4342598 10625 if (initGlobalRNG == 0) {
wolfSSL 0:9d17e4342598 10626 CYASSL_MSG("Global RNG no Init");
wolfSSL 0:9d17e4342598 10627 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 10628 }
wolfSSL 0:9d17e4342598 10629 rng = &globalRNG;
wolfSSL 0:9d17e4342598 10630 }
wolfSSL 0:9d17e4342598 10631
wolfSSL 0:9d17e4342598 10632 if (DsaSign(d, sigRet, (DsaKey*)dsa->internal, rng) < 0) {
wolfSSL 0:9d17e4342598 10633 CYASSL_MSG("DsaSign failed");
wolfSSL 0:9d17e4342598 10634 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 10635 }
wolfSSL 0:9d17e4342598 10636
wolfSSL 0:9d17e4342598 10637 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 10638 }
wolfSSL 0:9d17e4342598 10639 #endif /* NO_DSA */
wolfSSL 0:9d17e4342598 10640
wolfSSL 0:9d17e4342598 10641
wolfSSL 0:9d17e4342598 10642 /* return SSL_SUCCES on ok, 0 otherwise */
wolfSSL 0:9d17e4342598 10643 int CyaSSL_RSA_sign(int type, const unsigned char* m,
wolfSSL 0:9d17e4342598 10644 unsigned int mLen, unsigned char* sigRet,
wolfSSL 0:9d17e4342598 10645 unsigned int* sigLen, CYASSL_RSA* rsa)
wolfSSL 0:9d17e4342598 10646 {
wolfSSL 0:9d17e4342598 10647 byte encodedSig[MAX_ENCODED_SIG_SZ];
wolfSSL 0:9d17e4342598 10648 word32 outLen;
wolfSSL 0:9d17e4342598 10649 word32 signSz;
wolfSSL 0:9d17e4342598 10650 RNG tmpRNG;
wolfSSL 0:9d17e4342598 10651 RNG* rng = &tmpRNG;
wolfSSL 0:9d17e4342598 10652
wolfSSL 0:9d17e4342598 10653 CYASSL_MSG("CyaSSL_RSA_sign");
wolfSSL 0:9d17e4342598 10654
wolfSSL 0:9d17e4342598 10655 if (m == NULL || sigRet == NULL || sigLen == NULL || rsa == NULL) {
wolfSSL 0:9d17e4342598 10656 CYASSL_MSG("Bad function arguments");
wolfSSL 0:9d17e4342598 10657 return 0;
wolfSSL 0:9d17e4342598 10658 }
wolfSSL 0:9d17e4342598 10659
wolfSSL 0:9d17e4342598 10660 if (rsa->inSet == 0) {
wolfSSL 0:9d17e4342598 10661 CYASSL_MSG("No RSA internal set");
wolfSSL 0:9d17e4342598 10662 return 0;
wolfSSL 0:9d17e4342598 10663 }
wolfSSL 0:9d17e4342598 10664
wolfSSL 0:9d17e4342598 10665 outLen = (word32)CyaSSL_BN_num_bytes(rsa->n);
wolfSSL 0:9d17e4342598 10666 if (outLen == 0) {
wolfSSL 0:9d17e4342598 10667 CYASSL_MSG("Bad RSA size");
wolfSSL 0:9d17e4342598 10668 return 0;
wolfSSL 0:9d17e4342598 10669 }
wolfSSL 0:9d17e4342598 10670
wolfSSL 0:9d17e4342598 10671 if (InitRng(&tmpRNG) != 0) {
wolfSSL 0:9d17e4342598 10672 CYASSL_MSG("Bad RNG Init, trying global");
wolfSSL 0:9d17e4342598 10673 if (initGlobalRNG == 0) {
wolfSSL 0:9d17e4342598 10674 CYASSL_MSG("Global RNG no Init");
wolfSSL 0:9d17e4342598 10675 return 0;
wolfSSL 0:9d17e4342598 10676 }
wolfSSL 0:9d17e4342598 10677 rng = &globalRNG;
wolfSSL 0:9d17e4342598 10678 }
wolfSSL 0:9d17e4342598 10679
wolfSSL 0:9d17e4342598 10680 switch (type) {
wolfSSL 0:9d17e4342598 10681 case NID_md5:
wolfSSL 0:9d17e4342598 10682 type = MD5h;
wolfSSL 0:9d17e4342598 10683 break;
wolfSSL 0:9d17e4342598 10684
wolfSSL 0:9d17e4342598 10685 case NID_sha1:
wolfSSL 0:9d17e4342598 10686 type = SHAh;
wolfSSL 0:9d17e4342598 10687 break;
wolfSSL 0:9d17e4342598 10688
wolfSSL 0:9d17e4342598 10689 default:
wolfSSL 0:9d17e4342598 10690 CYASSL_MSG("Bad md type");
wolfSSL 0:9d17e4342598 10691 return 0;
wolfSSL 0:9d17e4342598 10692 }
wolfSSL 0:9d17e4342598 10693
wolfSSL 0:9d17e4342598 10694 signSz = EncodeSignature(encodedSig, m, mLen, type);
wolfSSL 0:9d17e4342598 10695 if (signSz == 0) {
wolfSSL 0:9d17e4342598 10696 CYASSL_MSG("Bad Encode Signature");
wolfSSL 0:9d17e4342598 10697 return 0;
wolfSSL 0:9d17e4342598 10698 }
wolfSSL 0:9d17e4342598 10699
wolfSSL 0:9d17e4342598 10700 *sigLen = RsaSSL_Sign(encodedSig, signSz, sigRet, outLen,
wolfSSL 0:9d17e4342598 10701 (RsaKey*)rsa->internal, rng);
wolfSSL 0:9d17e4342598 10702 if (*sigLen <= 0) {
wolfSSL 0:9d17e4342598 10703 CYASSL_MSG("Bad Rsa Sign");
wolfSSL 0:9d17e4342598 10704 return 0;
wolfSSL 0:9d17e4342598 10705 }
wolfSSL 0:9d17e4342598 10706
wolfSSL 0:9d17e4342598 10707 CYASSL_MSG("CyaSSL_RSA_sign success");
wolfSSL 0:9d17e4342598 10708 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 10709 }
wolfSSL 0:9d17e4342598 10710
wolfSSL 0:9d17e4342598 10711
wolfSSL 0:9d17e4342598 10712 int CyaSSL_RSA_public_decrypt(int flen, unsigned char* from,
wolfSSL 0:9d17e4342598 10713 unsigned char* to, CYASSL_RSA* rsa, int padding)
wolfSSL 0:9d17e4342598 10714 {
wolfSSL 0:9d17e4342598 10715 (void)flen;
wolfSSL 0:9d17e4342598 10716 (void)from;
wolfSSL 0:9d17e4342598 10717 (void)to;
wolfSSL 0:9d17e4342598 10718 (void)rsa;
wolfSSL 0:9d17e4342598 10719 (void)padding;
wolfSSL 0:9d17e4342598 10720
wolfSSL 0:9d17e4342598 10721 CYASSL_MSG("CyaSSL_RSA_public_decrypt");
wolfSSL 0:9d17e4342598 10722
wolfSSL 0:9d17e4342598 10723 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 10724 }
wolfSSL 0:9d17e4342598 10725
wolfSSL 0:9d17e4342598 10726
wolfSSL 0:9d17e4342598 10727 /* generate p-1 and q-1, SSL_SUCCESS on ok */
wolfSSL 0:9d17e4342598 10728 int CyaSSL_RSA_GenAdd(CYASSL_RSA* rsa)
wolfSSL 0:9d17e4342598 10729 {
wolfSSL 0:9d17e4342598 10730 int err;
wolfSSL 0:9d17e4342598 10731 mp_int tmp;
wolfSSL 0:9d17e4342598 10732
wolfSSL 0:9d17e4342598 10733 CYASSL_MSG("CyaSSL_RsaGenAdd");
wolfSSL 0:9d17e4342598 10734
wolfSSL 0:9d17e4342598 10735 if (rsa == NULL || rsa->p == NULL || rsa->q == NULL || rsa->d == NULL ||
wolfSSL 0:9d17e4342598 10736 rsa->dmp1 == NULL || rsa->dmq1 == NULL) {
wolfSSL 0:9d17e4342598 10737 CYASSL_MSG("rsa no init error");
wolfSSL 0:9d17e4342598 10738 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 10739 }
wolfSSL 0:9d17e4342598 10740
wolfSSL 0:9d17e4342598 10741 if (mp_init(&tmp) != MP_OKAY) {
wolfSSL 0:9d17e4342598 10742 CYASSL_MSG("mp_init error");
wolfSSL 0:9d17e4342598 10743 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 10744 }
wolfSSL 0:9d17e4342598 10745
wolfSSL 0:9d17e4342598 10746 err = mp_sub_d((mp_int*)rsa->p->internal, 1, &tmp);
wolfSSL 0:9d17e4342598 10747 if (err != MP_OKAY) {
wolfSSL 0:9d17e4342598 10748 CYASSL_MSG("mp_sub_d error");
wolfSSL 0:9d17e4342598 10749 }
wolfSSL 0:9d17e4342598 10750 else
wolfSSL 0:9d17e4342598 10751 err = mp_mod((mp_int*)rsa->d->internal, &tmp,
wolfSSL 0:9d17e4342598 10752 (mp_int*)rsa->dmp1->internal);
wolfSSL 0:9d17e4342598 10753
wolfSSL 0:9d17e4342598 10754 if (err != MP_OKAY) {
wolfSSL 0:9d17e4342598 10755 CYASSL_MSG("mp_mod error");
wolfSSL 0:9d17e4342598 10756 }
wolfSSL 0:9d17e4342598 10757 else
wolfSSL 0:9d17e4342598 10758 err = mp_sub_d((mp_int*)rsa->q->internal, 1, &tmp);
wolfSSL 0:9d17e4342598 10759 if (err != MP_OKAY) {
wolfSSL 0:9d17e4342598 10760 CYASSL_MSG("mp_sub_d error");
wolfSSL 0:9d17e4342598 10761 }
wolfSSL 0:9d17e4342598 10762 else
wolfSSL 0:9d17e4342598 10763 err = mp_mod((mp_int*)rsa->d->internal, &tmp,
wolfSSL 0:9d17e4342598 10764 (mp_int*)rsa->dmq1->internal);
wolfSSL 0:9d17e4342598 10765
wolfSSL 0:9d17e4342598 10766 mp_clear(&tmp);
wolfSSL 0:9d17e4342598 10767
wolfSSL 0:9d17e4342598 10768 if (err == MP_OKAY)
wolfSSL 0:9d17e4342598 10769 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 10770 else
wolfSSL 0:9d17e4342598 10771 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 10772 }
wolfSSL 0:9d17e4342598 10773
wolfSSL 0:9d17e4342598 10774
wolfSSL 0:9d17e4342598 10775 void CyaSSL_HMAC_Init(CYASSL_HMAC_CTX* ctx, const void* key, int keylen,
wolfSSL 0:9d17e4342598 10776 const EVP_MD* type)
wolfSSL 0:9d17e4342598 10777 {
wolfSSL 0:9d17e4342598 10778 CYASSL_MSG("CyaSSL_HMAC_Init");
wolfSSL 0:9d17e4342598 10779
wolfSSL 0:9d17e4342598 10780 if (ctx == NULL) {
wolfSSL 0:9d17e4342598 10781 CYASSL_MSG("no ctx on init");
wolfSSL 0:9d17e4342598 10782 return;
wolfSSL 0:9d17e4342598 10783 }
wolfSSL 0:9d17e4342598 10784
wolfSSL 0:9d17e4342598 10785 if (type) {
wolfSSL 0:9d17e4342598 10786 CYASSL_MSG("init has type");
wolfSSL 0:9d17e4342598 10787
wolfSSL 0:9d17e4342598 10788 if (XSTRNCMP(type, "MD5", 3) == 0) {
wolfSSL 0:9d17e4342598 10789 CYASSL_MSG("md5 hmac");
wolfSSL 0:9d17e4342598 10790 ctx->type = MD5;
wolfSSL 0:9d17e4342598 10791 }
wolfSSL 0:9d17e4342598 10792 else if (XSTRNCMP(type, "SHA256", 6) == 0) {
wolfSSL 0:9d17e4342598 10793 CYASSL_MSG("sha256 hmac");
wolfSSL 0:9d17e4342598 10794 ctx->type = SHA256;
wolfSSL 0:9d17e4342598 10795 }
wolfSSL 0:9d17e4342598 10796
wolfSSL 0:9d17e4342598 10797 /* has to be last since would pick or 256, 384, or 512 too */
wolfSSL 0:9d17e4342598 10798 else if (XSTRNCMP(type, "SHA", 3) == 0) {
wolfSSL 0:9d17e4342598 10799 CYASSL_MSG("sha hmac");
wolfSSL 0:9d17e4342598 10800 ctx->type = SHA;
wolfSSL 0:9d17e4342598 10801 }
wolfSSL 0:9d17e4342598 10802 else {
wolfSSL 0:9d17e4342598 10803 CYASSL_MSG("bad init type");
wolfSSL 0:9d17e4342598 10804 }
wolfSSL 0:9d17e4342598 10805 }
wolfSSL 0:9d17e4342598 10806
wolfSSL 0:9d17e4342598 10807 if (key && keylen) {
wolfSSL 0:9d17e4342598 10808 CYASSL_MSG("keying hmac");
wolfSSL 0:9d17e4342598 10809 HmacSetKey(&ctx->hmac, ctx->type, (const byte*)key, (word32)keylen);
wolfSSL 0:9d17e4342598 10810 /* OpenSSL compat, no error */
wolfSSL 0:9d17e4342598 10811 }
wolfSSL 0:9d17e4342598 10812 }
wolfSSL 0:9d17e4342598 10813
wolfSSL 0:9d17e4342598 10814
wolfSSL 0:9d17e4342598 10815 void CyaSSL_HMAC_Update(CYASSL_HMAC_CTX* ctx, const unsigned char* data,
wolfSSL 0:9d17e4342598 10816 int len)
wolfSSL 0:9d17e4342598 10817 {
wolfSSL 0:9d17e4342598 10818 CYASSL_MSG("CyaSSL_HMAC_Update");
wolfSSL 0:9d17e4342598 10819
wolfSSL 0:9d17e4342598 10820 if (ctx && data) {
wolfSSL 0:9d17e4342598 10821 CYASSL_MSG("updating hmac");
wolfSSL 0:9d17e4342598 10822 HmacUpdate(&ctx->hmac, data, (word32)len);
wolfSSL 0:9d17e4342598 10823 }
wolfSSL 0:9d17e4342598 10824 }
wolfSSL 0:9d17e4342598 10825
wolfSSL 0:9d17e4342598 10826
wolfSSL 0:9d17e4342598 10827 void CyaSSL_HMAC_Final(CYASSL_HMAC_CTX* ctx, unsigned char* hash,
wolfSSL 0:9d17e4342598 10828 unsigned int* len)
wolfSSL 0:9d17e4342598 10829 {
wolfSSL 0:9d17e4342598 10830 CYASSL_MSG("CyaSSL_HMAC_Final");
wolfSSL 0:9d17e4342598 10831
wolfSSL 0:9d17e4342598 10832 if (ctx && hash) {
wolfSSL 0:9d17e4342598 10833 CYASSL_MSG("final hmac");
wolfSSL 0:9d17e4342598 10834 HmacFinal(&ctx->hmac, hash);
wolfSSL 0:9d17e4342598 10835
wolfSSL 0:9d17e4342598 10836 if (len) {
wolfSSL 0:9d17e4342598 10837 CYASSL_MSG("setting output len");
wolfSSL 0:9d17e4342598 10838 switch (ctx->type) {
wolfSSL 0:9d17e4342598 10839 case MD5:
wolfSSL 0:9d17e4342598 10840 *len = MD5_DIGEST_SIZE;
wolfSSL 0:9d17e4342598 10841 break;
wolfSSL 0:9d17e4342598 10842
wolfSSL 0:9d17e4342598 10843 case SHA:
wolfSSL 0:9d17e4342598 10844 *len = SHA_DIGEST_SIZE;
wolfSSL 0:9d17e4342598 10845 break;
wolfSSL 0:9d17e4342598 10846
wolfSSL 0:9d17e4342598 10847 case SHA256:
wolfSSL 0:9d17e4342598 10848 *len = SHA256_DIGEST_SIZE;
wolfSSL 0:9d17e4342598 10849 break;
wolfSSL 0:9d17e4342598 10850
wolfSSL 0:9d17e4342598 10851 default:
wolfSSL 0:9d17e4342598 10852 CYASSL_MSG("bad hmac type");
wolfSSL 0:9d17e4342598 10853 }
wolfSSL 0:9d17e4342598 10854 }
wolfSSL 0:9d17e4342598 10855 }
wolfSSL 0:9d17e4342598 10856 }
wolfSSL 0:9d17e4342598 10857
wolfSSL 0:9d17e4342598 10858
wolfSSL 0:9d17e4342598 10859 void CyaSSL_HMAC_cleanup(CYASSL_HMAC_CTX* ctx)
wolfSSL 0:9d17e4342598 10860 {
wolfSSL 0:9d17e4342598 10861 (void)ctx;
wolfSSL 0:9d17e4342598 10862
wolfSSL 0:9d17e4342598 10863 CYASSL_MSG("CyaSSL_HMAC_cleanup");
wolfSSL 0:9d17e4342598 10864 }
wolfSSL 0:9d17e4342598 10865
wolfSSL 0:9d17e4342598 10866
wolfSSL 0:9d17e4342598 10867 const CYASSL_EVP_MD* CyaSSL_EVP_get_digestbynid(int id)
wolfSSL 0:9d17e4342598 10868 {
wolfSSL 0:9d17e4342598 10869 CYASSL_MSG("CyaSSL_get_digestbynid");
wolfSSL 0:9d17e4342598 10870
wolfSSL 0:9d17e4342598 10871 switch(id) {
wolfSSL 0:9d17e4342598 10872 case NID_md5:
wolfSSL 0:9d17e4342598 10873 return CyaSSL_EVP_md5();
wolfSSL 0:9d17e4342598 10874
wolfSSL 0:9d17e4342598 10875 case NID_sha1:
wolfSSL 0:9d17e4342598 10876 return CyaSSL_EVP_sha1();
wolfSSL 0:9d17e4342598 10877
wolfSSL 0:9d17e4342598 10878 default:
wolfSSL 0:9d17e4342598 10879 CYASSL_MSG("Bad digest id value");
wolfSSL 0:9d17e4342598 10880 }
wolfSSL 0:9d17e4342598 10881
wolfSSL 0:9d17e4342598 10882 return NULL;
wolfSSL 0:9d17e4342598 10883 }
wolfSSL 0:9d17e4342598 10884
wolfSSL 0:9d17e4342598 10885
wolfSSL 0:9d17e4342598 10886 CYASSL_RSA* CyaSSL_EVP_PKEY_get1_RSA(CYASSL_EVP_PKEY* key)
wolfSSL 0:9d17e4342598 10887 {
wolfSSL 0:9d17e4342598 10888 (void)key;
wolfSSL 0:9d17e4342598 10889 CYASSL_MSG("CyaSSL_EVP_PKEY_get1_RSA");
wolfSSL 0:9d17e4342598 10890
wolfSSL 0:9d17e4342598 10891 return NULL;
wolfSSL 0:9d17e4342598 10892 }
wolfSSL 0:9d17e4342598 10893
wolfSSL 0:9d17e4342598 10894
wolfSSL 0:9d17e4342598 10895 CYASSL_DSA* CyaSSL_EVP_PKEY_get1_DSA(CYASSL_EVP_PKEY* key)
wolfSSL 0:9d17e4342598 10896 {
wolfSSL 0:9d17e4342598 10897 (void)key;
wolfSSL 0:9d17e4342598 10898 CYASSL_MSG("CyaSSL_EVP_PKEY_get1_DSA");
wolfSSL 0:9d17e4342598 10899
wolfSSL 0:9d17e4342598 10900 return NULL;
wolfSSL 0:9d17e4342598 10901 }
wolfSSL 0:9d17e4342598 10902
wolfSSL 0:9d17e4342598 10903
wolfSSL 0:9d17e4342598 10904 void* CyaSSL_EVP_X_STATE(const CYASSL_EVP_CIPHER_CTX* ctx)
wolfSSL 0:9d17e4342598 10905 {
wolfSSL 0:9d17e4342598 10906 CYASSL_MSG("CyaSSL_EVP_X_STATE");
wolfSSL 0:9d17e4342598 10907
wolfSSL 0:9d17e4342598 10908 if (ctx) {
wolfSSL 0:9d17e4342598 10909 switch (ctx->cipherType) {
wolfSSL 0:9d17e4342598 10910 case ARC4_TYPE:
wolfSSL 0:9d17e4342598 10911 CYASSL_MSG("returning arc4 state");
wolfSSL 0:9d17e4342598 10912 return (void*)&ctx->cipher.arc4.x;
wolfSSL 0:9d17e4342598 10913
wolfSSL 0:9d17e4342598 10914 default:
wolfSSL 0:9d17e4342598 10915 CYASSL_MSG("bad x state type");
wolfSSL 0:9d17e4342598 10916 return 0;
wolfSSL 0:9d17e4342598 10917 }
wolfSSL 0:9d17e4342598 10918 }
wolfSSL 0:9d17e4342598 10919
wolfSSL 0:9d17e4342598 10920 return NULL;
wolfSSL 0:9d17e4342598 10921 }
wolfSSL 0:9d17e4342598 10922
wolfSSL 0:9d17e4342598 10923
wolfSSL 0:9d17e4342598 10924 int CyaSSL_EVP_X_STATE_LEN(const CYASSL_EVP_CIPHER_CTX* ctx)
wolfSSL 0:9d17e4342598 10925 {
wolfSSL 0:9d17e4342598 10926 CYASSL_MSG("CyaSSL_EVP_X_STATE_LEN");
wolfSSL 0:9d17e4342598 10927
wolfSSL 0:9d17e4342598 10928 if (ctx) {
wolfSSL 0:9d17e4342598 10929 switch (ctx->cipherType) {
wolfSSL 0:9d17e4342598 10930 case ARC4_TYPE:
wolfSSL 0:9d17e4342598 10931 CYASSL_MSG("returning arc4 state size");
wolfSSL 0:9d17e4342598 10932 return sizeof(Arc4);
wolfSSL 0:9d17e4342598 10933
wolfSSL 0:9d17e4342598 10934 default:
wolfSSL 0:9d17e4342598 10935 CYASSL_MSG("bad x state type");
wolfSSL 0:9d17e4342598 10936 return 0;
wolfSSL 0:9d17e4342598 10937 }
wolfSSL 0:9d17e4342598 10938 }
wolfSSL 0:9d17e4342598 10939
wolfSSL 0:9d17e4342598 10940 return 0;
wolfSSL 0:9d17e4342598 10941 }
wolfSSL 0:9d17e4342598 10942
wolfSSL 0:9d17e4342598 10943
wolfSSL 0:9d17e4342598 10944 void CyaSSL_3des_iv(CYASSL_EVP_CIPHER_CTX* ctx, int doset,
wolfSSL 0:9d17e4342598 10945 unsigned char* iv, int len)
wolfSSL 0:9d17e4342598 10946 {
wolfSSL 0:9d17e4342598 10947 (void)len;
wolfSSL 0:9d17e4342598 10948
wolfSSL 0:9d17e4342598 10949 CYASSL_MSG("CyaSSL_3des_iv");
wolfSSL 0:9d17e4342598 10950
wolfSSL 0:9d17e4342598 10951 if (ctx == NULL || iv == NULL) {
wolfSSL 0:9d17e4342598 10952 CYASSL_MSG("Bad function argument");
wolfSSL 0:9d17e4342598 10953 return;
wolfSSL 0:9d17e4342598 10954 }
wolfSSL 0:9d17e4342598 10955
wolfSSL 0:9d17e4342598 10956 if (doset)
wolfSSL 0:9d17e4342598 10957 Des3_SetIV(&ctx->cipher.des3, iv); /* OpenSSL compat, no ret */
wolfSSL 0:9d17e4342598 10958 else
wolfSSL 0:9d17e4342598 10959 memcpy(iv, &ctx->cipher.des3.reg, DES_BLOCK_SIZE);
wolfSSL 0:9d17e4342598 10960 }
wolfSSL 0:9d17e4342598 10961
wolfSSL 0:9d17e4342598 10962
wolfSSL 0:9d17e4342598 10963 void CyaSSL_aes_ctr_iv(CYASSL_EVP_CIPHER_CTX* ctx, int doset,
wolfSSL 0:9d17e4342598 10964 unsigned char* iv, int len)
wolfSSL 0:9d17e4342598 10965 {
wolfSSL 0:9d17e4342598 10966 (void)len;
wolfSSL 0:9d17e4342598 10967
wolfSSL 0:9d17e4342598 10968 CYASSL_MSG("CyaSSL_aes_ctr_iv");
wolfSSL 0:9d17e4342598 10969
wolfSSL 0:9d17e4342598 10970 if (ctx == NULL || iv == NULL) {
wolfSSL 0:9d17e4342598 10971 CYASSL_MSG("Bad function argument");
wolfSSL 0:9d17e4342598 10972 return;
wolfSSL 0:9d17e4342598 10973 }
wolfSSL 0:9d17e4342598 10974
wolfSSL 0:9d17e4342598 10975 if (doset)
wolfSSL 0:9d17e4342598 10976 AesSetIV(&ctx->cipher.aes, iv); /* OpenSSL compat, no ret */
wolfSSL 0:9d17e4342598 10977 else
wolfSSL 0:9d17e4342598 10978 memcpy(iv, &ctx->cipher.aes.reg, AES_BLOCK_SIZE);
wolfSSL 0:9d17e4342598 10979 }
wolfSSL 0:9d17e4342598 10980
wolfSSL 0:9d17e4342598 10981
wolfSSL 0:9d17e4342598 10982 const CYASSL_EVP_MD* CyaSSL_EVP_ripemd160(void)
wolfSSL 0:9d17e4342598 10983 {
wolfSSL 0:9d17e4342598 10984 CYASSL_MSG("CyaSSL_ripemd160");
wolfSSL 0:9d17e4342598 10985
wolfSSL 0:9d17e4342598 10986 return NULL;
wolfSSL 0:9d17e4342598 10987 }
wolfSSL 0:9d17e4342598 10988
wolfSSL 0:9d17e4342598 10989
wolfSSL 0:9d17e4342598 10990 int CyaSSL_EVP_MD_size(const CYASSL_EVP_MD* type)
wolfSSL 0:9d17e4342598 10991 {
wolfSSL 0:9d17e4342598 10992 CYASSL_MSG("CyaSSL_EVP_MD_size");
wolfSSL 0:9d17e4342598 10993
wolfSSL 0:9d17e4342598 10994 if (type == NULL) {
wolfSSL 0:9d17e4342598 10995 CYASSL_MSG("No md type arg");
wolfSSL 0:9d17e4342598 10996 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 10997 }
wolfSSL 0:9d17e4342598 10998
wolfSSL 0:9d17e4342598 10999 if (XSTRNCMP(type, "MD5", 3) == 0) {
wolfSSL 0:9d17e4342598 11000 return MD5_DIGEST_SIZE;
wolfSSL 0:9d17e4342598 11001 }
wolfSSL 0:9d17e4342598 11002 else if (XSTRNCMP(type, "SHA256", 6) == 0) {
wolfSSL 0:9d17e4342598 11003 return SHA256_DIGEST_SIZE;
wolfSSL 0:9d17e4342598 11004 }
wolfSSL 0:9d17e4342598 11005 #ifdef CYASSL_SHA384
wolfSSL 0:9d17e4342598 11006 else if (XSTRNCMP(type, "SHA384", 6) == 0) {
wolfSSL 0:9d17e4342598 11007 return SHA384_DIGEST_SIZE;
wolfSSL 0:9d17e4342598 11008 }
wolfSSL 0:9d17e4342598 11009 #endif
wolfSSL 0:9d17e4342598 11010 #ifdef CYASSL_SHA512
wolfSSL 0:9d17e4342598 11011 else if (XSTRNCMP(type, "SHA512", 6) == 0) {
wolfSSL 0:9d17e4342598 11012 return SHA512_DIGEST_SIZE;
wolfSSL 0:9d17e4342598 11013 }
wolfSSL 0:9d17e4342598 11014 #endif
wolfSSL 0:9d17e4342598 11015 /* has to be last since would pick or 256, 384, or 512 too */
wolfSSL 0:9d17e4342598 11016 else if (XSTRNCMP(type, "SHA", 3) == 0) {
wolfSSL 0:9d17e4342598 11017 return SHA_DIGEST_SIZE;
wolfSSL 0:9d17e4342598 11018 }
wolfSSL 0:9d17e4342598 11019
wolfSSL 0:9d17e4342598 11020 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 11021 }
wolfSSL 0:9d17e4342598 11022
wolfSSL 0:9d17e4342598 11023
wolfSSL 0:9d17e4342598 11024 int CyaSSL_EVP_CIPHER_CTX_iv_length(const CYASSL_EVP_CIPHER_CTX* ctx)
wolfSSL 0:9d17e4342598 11025 {
wolfSSL 0:9d17e4342598 11026 CYASSL_MSG("CyaSSL_EVP_CIPHER_CTX_iv_length");
wolfSSL 0:9d17e4342598 11027
wolfSSL 0:9d17e4342598 11028 switch (ctx->cipherType) {
wolfSSL 0:9d17e4342598 11029
wolfSSL 0:9d17e4342598 11030 case AES_128_CBC_TYPE :
wolfSSL 0:9d17e4342598 11031 case AES_192_CBC_TYPE :
wolfSSL 0:9d17e4342598 11032 case AES_256_CBC_TYPE :
wolfSSL 0:9d17e4342598 11033 CYASSL_MSG("AES CBC");
wolfSSL 0:9d17e4342598 11034 return AES_BLOCK_SIZE;
wolfSSL 0:9d17e4342598 11035
wolfSSL 0:9d17e4342598 11036 #ifdef CYASSL_AES_COUNTER
wolfSSL 0:9d17e4342598 11037 case AES_128_CTR_TYPE :
wolfSSL 0:9d17e4342598 11038 case AES_192_CTR_TYPE :
wolfSSL 0:9d17e4342598 11039 case AES_256_CTR_TYPE :
wolfSSL 0:9d17e4342598 11040 CYASSL_MSG("AES CTR");
wolfSSL 0:9d17e4342598 11041 return AES_BLOCK_SIZE;
wolfSSL 0:9d17e4342598 11042 #endif
wolfSSL 0:9d17e4342598 11043
wolfSSL 0:9d17e4342598 11044 case DES_CBC_TYPE :
wolfSSL 0:9d17e4342598 11045 CYASSL_MSG("DES CBC");
wolfSSL 0:9d17e4342598 11046 return DES_BLOCK_SIZE;
wolfSSL 0:9d17e4342598 11047
wolfSSL 0:9d17e4342598 11048 case DES_EDE3_CBC_TYPE :
wolfSSL 0:9d17e4342598 11049 CYASSL_MSG("DES EDE3 CBC");
wolfSSL 0:9d17e4342598 11050 return DES_BLOCK_SIZE;
wolfSSL 0:9d17e4342598 11051
wolfSSL 0:9d17e4342598 11052 case ARC4_TYPE :
wolfSSL 0:9d17e4342598 11053 CYASSL_MSG("ARC4");
wolfSSL 0:9d17e4342598 11054 return 0;
wolfSSL 0:9d17e4342598 11055
wolfSSL 0:9d17e4342598 11056 case NULL_CIPHER_TYPE :
wolfSSL 0:9d17e4342598 11057 CYASSL_MSG("NULL");
wolfSSL 0:9d17e4342598 11058 return 0;
wolfSSL 0:9d17e4342598 11059
wolfSSL 0:9d17e4342598 11060 default: {
wolfSSL 0:9d17e4342598 11061 CYASSL_MSG("bad type");
wolfSSL 0:9d17e4342598 11062 }
wolfSSL 0:9d17e4342598 11063 }
wolfSSL 0:9d17e4342598 11064 return 0;
wolfSSL 0:9d17e4342598 11065 }
wolfSSL 0:9d17e4342598 11066
wolfSSL 0:9d17e4342598 11067
wolfSSL 0:9d17e4342598 11068 void CyaSSL_OPENSSL_free(void* p)
wolfSSL 0:9d17e4342598 11069 {
wolfSSL 0:9d17e4342598 11070 CYASSL_MSG("CyaSSL_OPENSSL_free");
wolfSSL 0:9d17e4342598 11071
wolfSSL 0:9d17e4342598 11072 XFREE(p, NULL, 0);
wolfSSL 0:9d17e4342598 11073 }
wolfSSL 0:9d17e4342598 11074
wolfSSL 0:9d17e4342598 11075
wolfSSL 0:9d17e4342598 11076 int CyaSSL_PEM_write_bio_RSAPrivateKey(CYASSL_BIO* bio, RSA* rsa,
wolfSSL 0:9d17e4342598 11077 const EVP_CIPHER* cipher,
wolfSSL 0:9d17e4342598 11078 unsigned char* passwd, int len,
wolfSSL 0:9d17e4342598 11079 pem_password_cb cb, void* arg)
wolfSSL 0:9d17e4342598 11080 {
wolfSSL 0:9d17e4342598 11081 (void)bio;
wolfSSL 0:9d17e4342598 11082 (void)rsa;
wolfSSL 0:9d17e4342598 11083 (void)cipher;
wolfSSL 0:9d17e4342598 11084 (void)passwd;
wolfSSL 0:9d17e4342598 11085 (void)len;
wolfSSL 0:9d17e4342598 11086 (void)cb;
wolfSSL 0:9d17e4342598 11087 (void)arg;
wolfSSL 0:9d17e4342598 11088
wolfSSL 0:9d17e4342598 11089 CYASSL_MSG("CyaSSL_PEM_write_bio_RSAPrivateKey");
wolfSSL 0:9d17e4342598 11090
wolfSSL 0:9d17e4342598 11091 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 11092 }
wolfSSL 0:9d17e4342598 11093
wolfSSL 0:9d17e4342598 11094
wolfSSL 0:9d17e4342598 11095
wolfSSL 0:9d17e4342598 11096 int CyaSSL_PEM_write_bio_DSAPrivateKey(CYASSL_BIO* bio, DSA* rsa,
wolfSSL 0:9d17e4342598 11097 const EVP_CIPHER* cipher,
wolfSSL 0:9d17e4342598 11098 unsigned char* passwd, int len,
wolfSSL 0:9d17e4342598 11099 pem_password_cb cb, void* arg)
wolfSSL 0:9d17e4342598 11100 {
wolfSSL 0:9d17e4342598 11101 (void)bio;
wolfSSL 0:9d17e4342598 11102 (void)rsa;
wolfSSL 0:9d17e4342598 11103 (void)cipher;
wolfSSL 0:9d17e4342598 11104 (void)passwd;
wolfSSL 0:9d17e4342598 11105 (void)len;
wolfSSL 0:9d17e4342598 11106 (void)cb;
wolfSSL 0:9d17e4342598 11107 (void)arg;
wolfSSL 0:9d17e4342598 11108
wolfSSL 0:9d17e4342598 11109 CYASSL_MSG("CyaSSL_PEM_write_bio_DSAPrivateKey");
wolfSSL 0:9d17e4342598 11110
wolfSSL 0:9d17e4342598 11111 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 11112 }
wolfSSL 0:9d17e4342598 11113
wolfSSL 0:9d17e4342598 11114
wolfSSL 0:9d17e4342598 11115
wolfSSL 0:9d17e4342598 11116 CYASSL_EVP_PKEY* CyaSSL_PEM_read_bio_PrivateKey(CYASSL_BIO* bio,
wolfSSL 0:9d17e4342598 11117 CYASSL_EVP_PKEY** key, pem_password_cb cb, void* arg)
wolfSSL 0:9d17e4342598 11118 {
wolfSSL 0:9d17e4342598 11119 (void)bio;
wolfSSL 0:9d17e4342598 11120 (void)key;
wolfSSL 0:9d17e4342598 11121 (void)cb;
wolfSSL 0:9d17e4342598 11122 (void)arg;
wolfSSL 0:9d17e4342598 11123
wolfSSL 0:9d17e4342598 11124 CYASSL_MSG("CyaSSL_PEM_read_bio_PrivateKey");
wolfSSL 0:9d17e4342598 11125
wolfSSL 0:9d17e4342598 11126 return NULL;
wolfSSL 0:9d17e4342598 11127 }
wolfSSL 0:9d17e4342598 11128
wolfSSL 0:9d17e4342598 11129
wolfSSL 0:9d17e4342598 11130
wolfSSL 0:9d17e4342598 11131
wolfSSL 0:9d17e4342598 11132 /* Load RSA from Der, SSL_SUCCESS on success < 0 on error */
wolfSSL 0:9d17e4342598 11133 int CyaSSL_RSA_LoadDer(CYASSL_RSA* rsa, const unsigned char* der, int derSz)
wolfSSL 0:9d17e4342598 11134 {
wolfSSL 0:9d17e4342598 11135 word32 idx = 0;
wolfSSL 0:9d17e4342598 11136 int ret;
wolfSSL 0:9d17e4342598 11137
wolfSSL 0:9d17e4342598 11138 CYASSL_ENTER("CyaSSL_RSA_LoadDer");
wolfSSL 0:9d17e4342598 11139
wolfSSL 0:9d17e4342598 11140 if (rsa == NULL || rsa->internal == NULL || der == NULL || derSz <= 0) {
wolfSSL 0:9d17e4342598 11141 CYASSL_MSG("Bad function arguments");
wolfSSL 0:9d17e4342598 11142 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 11143 }
wolfSSL 0:9d17e4342598 11144
wolfSSL 0:9d17e4342598 11145 ret = RsaPrivateKeyDecode(der, &idx, (RsaKey*)rsa->internal, derSz);
wolfSSL 0:9d17e4342598 11146 if (ret < 0) {
wolfSSL 0:9d17e4342598 11147 CYASSL_MSG("RsaPrivateKeyDecode failed");
wolfSSL 0:9d17e4342598 11148 return ret;
wolfSSL 0:9d17e4342598 11149 }
wolfSSL 0:9d17e4342598 11150
wolfSSL 0:9d17e4342598 11151 if (SetRsaExternal(rsa) < 0) {
wolfSSL 0:9d17e4342598 11152 CYASSL_MSG("SetRsaExternal failed");
wolfSSL 0:9d17e4342598 11153 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 11154 }
wolfSSL 0:9d17e4342598 11155
wolfSSL 0:9d17e4342598 11156 rsa->inSet = 1;
wolfSSL 0:9d17e4342598 11157
wolfSSL 0:9d17e4342598 11158 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 11159 }
wolfSSL 0:9d17e4342598 11160
wolfSSL 0:9d17e4342598 11161
wolfSSL 0:9d17e4342598 11162 #ifndef NO_DSA
wolfSSL 0:9d17e4342598 11163 /* Load DSA from Der, SSL_SUCCESS on success < 0 on error */
wolfSSL 0:9d17e4342598 11164 int CyaSSL_DSA_LoadDer(CYASSL_DSA* dsa, const unsigned char* der, int derSz)
wolfSSL 0:9d17e4342598 11165 {
wolfSSL 0:9d17e4342598 11166 word32 idx = 0;
wolfSSL 0:9d17e4342598 11167 int ret;
wolfSSL 0:9d17e4342598 11168
wolfSSL 0:9d17e4342598 11169 CYASSL_ENTER("CyaSSL_DSA_LoadDer");
wolfSSL 0:9d17e4342598 11170
wolfSSL 0:9d17e4342598 11171 if (dsa == NULL || dsa->internal == NULL || der == NULL || derSz <= 0) {
wolfSSL 0:9d17e4342598 11172 CYASSL_MSG("Bad function arguments");
wolfSSL 0:9d17e4342598 11173 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 11174 }
wolfSSL 0:9d17e4342598 11175
wolfSSL 0:9d17e4342598 11176 ret = DsaPrivateKeyDecode(der, &idx, (DsaKey*)dsa->internal, derSz);
wolfSSL 0:9d17e4342598 11177 if (ret < 0) {
wolfSSL 0:9d17e4342598 11178 CYASSL_MSG("DsaPrivateKeyDecode failed");
wolfSSL 0:9d17e4342598 11179 return ret;
wolfSSL 0:9d17e4342598 11180 }
wolfSSL 0:9d17e4342598 11181
wolfSSL 0:9d17e4342598 11182 if (SetDsaExternal(dsa) < 0) {
wolfSSL 0:9d17e4342598 11183 CYASSL_MSG("SetDsaExternal failed");
wolfSSL 0:9d17e4342598 11184 return SSL_FATAL_ERROR;
wolfSSL 0:9d17e4342598 11185 }
wolfSSL 0:9d17e4342598 11186
wolfSSL 0:9d17e4342598 11187 dsa->inSet = 1;
wolfSSL 0:9d17e4342598 11188
wolfSSL 0:9d17e4342598 11189 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 11190 }
wolfSSL 0:9d17e4342598 11191 #endif /* NO_DSA */
wolfSSL 0:9d17e4342598 11192
wolfSSL 0:9d17e4342598 11193
wolfSSL 0:9d17e4342598 11194
wolfSSL 0:9d17e4342598 11195
wolfSSL 0:9d17e4342598 11196 #endif /* OPENSSL_EXTRA */
wolfSSL 0:9d17e4342598 11197
wolfSSL 0:9d17e4342598 11198
wolfSSL 0:9d17e4342598 11199 #ifdef SESSION_CERTS
wolfSSL 0:9d17e4342598 11200
wolfSSL 0:9d17e4342598 11201
wolfSSL 0:9d17e4342598 11202 /* Get peer's certificate chain */
wolfSSL 0:9d17e4342598 11203 CYASSL_X509_CHAIN* CyaSSL_get_peer_chain(CYASSL* ssl)
wolfSSL 0:9d17e4342598 11204 {
wolfSSL 0:9d17e4342598 11205 CYASSL_ENTER("CyaSSL_get_peer_chain");
wolfSSL 0:9d17e4342598 11206 if (ssl)
wolfSSL 0:9d17e4342598 11207 return &ssl->session.chain;
wolfSSL 0:9d17e4342598 11208
wolfSSL 0:9d17e4342598 11209 return 0;
wolfSSL 0:9d17e4342598 11210 }
wolfSSL 0:9d17e4342598 11211
wolfSSL 0:9d17e4342598 11212
wolfSSL 0:9d17e4342598 11213 /* Get peer's certificate chain total count */
wolfSSL 0:9d17e4342598 11214 int CyaSSL_get_chain_count(CYASSL_X509_CHAIN* chain)
wolfSSL 0:9d17e4342598 11215 {
wolfSSL 0:9d17e4342598 11216 CYASSL_ENTER("CyaSSL_get_chain_count");
wolfSSL 0:9d17e4342598 11217 if (chain)
wolfSSL 0:9d17e4342598 11218 return chain->count;
wolfSSL 0:9d17e4342598 11219
wolfSSL 0:9d17e4342598 11220 return 0;
wolfSSL 0:9d17e4342598 11221 }
wolfSSL 0:9d17e4342598 11222
wolfSSL 0:9d17e4342598 11223
wolfSSL 0:9d17e4342598 11224 /* Get peer's ASN.1 DER ceritifcate at index (idx) length in bytes */
wolfSSL 0:9d17e4342598 11225 int CyaSSL_get_chain_length(CYASSL_X509_CHAIN* chain, int idx)
wolfSSL 0:9d17e4342598 11226 {
wolfSSL 0:9d17e4342598 11227 CYASSL_ENTER("CyaSSL_get_chain_length");
wolfSSL 0:9d17e4342598 11228 if (chain)
wolfSSL 0:9d17e4342598 11229 return chain->certs[idx].length;
wolfSSL 0:9d17e4342598 11230
wolfSSL 0:9d17e4342598 11231 return 0;
wolfSSL 0:9d17e4342598 11232 }
wolfSSL 0:9d17e4342598 11233
wolfSSL 0:9d17e4342598 11234
wolfSSL 0:9d17e4342598 11235 /* Get peer's ASN.1 DER ceritifcate at index (idx) */
wolfSSL 0:9d17e4342598 11236 byte* CyaSSL_get_chain_cert(CYASSL_X509_CHAIN* chain, int idx)
wolfSSL 0:9d17e4342598 11237 {
wolfSSL 0:9d17e4342598 11238 CYASSL_ENTER("CyaSSL_get_chain_cert");
wolfSSL 0:9d17e4342598 11239 if (chain)
wolfSSL 0:9d17e4342598 11240 return chain->certs[idx].buffer;
wolfSSL 0:9d17e4342598 11241
wolfSSL 0:9d17e4342598 11242 return 0;
wolfSSL 0:9d17e4342598 11243 }
wolfSSL 0:9d17e4342598 11244
wolfSSL 0:9d17e4342598 11245
wolfSSL 0:9d17e4342598 11246 /* Get peer's CyaSSL X509 ceritifcate at index (idx) */
wolfSSL 0:9d17e4342598 11247 CYASSL_X509* CyaSSL_get_chain_X509(CYASSL_X509_CHAIN* chain, int idx)
wolfSSL 0:9d17e4342598 11248 {
wolfSSL 0:9d17e4342598 11249 int ret;
wolfSSL 0:9d17e4342598 11250 CYASSL_X509* x509;
wolfSSL 0:9d17e4342598 11251 DecodedCert dCert;
wolfSSL 0:9d17e4342598 11252
wolfSSL 0:9d17e4342598 11253 CYASSL_ENTER("CyaSSL_get_chain_X509");
wolfSSL 0:9d17e4342598 11254 if (chain == NULL)
wolfSSL 0:9d17e4342598 11255 return NULL;
wolfSSL 0:9d17e4342598 11256
wolfSSL 0:9d17e4342598 11257 InitDecodedCert(&dCert, chain->certs[idx].buffer, chain->certs[idx].length,
wolfSSL 0:9d17e4342598 11258 NULL);
wolfSSL 0:9d17e4342598 11259 ret = ParseCertRelative(&dCert, CERT_TYPE, 0, NULL);
wolfSSL 0:9d17e4342598 11260 if (ret != 0) {
wolfSSL 0:9d17e4342598 11261 CYASSL_MSG("Failed to parse cert");
wolfSSL 0:9d17e4342598 11262 FreeDecodedCert(&dCert);
wolfSSL 0:9d17e4342598 11263 return NULL;
wolfSSL 0:9d17e4342598 11264 }
wolfSSL 0:9d17e4342598 11265
wolfSSL 0:9d17e4342598 11266 x509 = (CYASSL_X509*)XMALLOC(sizeof(CYASSL_X509), NULL, DYNAMIC_TYPE_X509);
wolfSSL 0:9d17e4342598 11267 if (x509 == NULL) {
wolfSSL 0:9d17e4342598 11268 CYASSL_MSG("Failed alloc X509");
wolfSSL 0:9d17e4342598 11269 FreeDecodedCert(&dCert);
wolfSSL 0:9d17e4342598 11270 return NULL;
wolfSSL 0:9d17e4342598 11271 }
wolfSSL 0:9d17e4342598 11272 InitX509(x509, 1);
wolfSSL 0:9d17e4342598 11273
wolfSSL 0:9d17e4342598 11274 ret = CopyDecodedToX509(x509, &dCert);
wolfSSL 0:9d17e4342598 11275 if (ret != 0) {
wolfSSL 0:9d17e4342598 11276 CYASSL_MSG("Failed to copy decoded");
wolfSSL 0:9d17e4342598 11277 XFREE(x509, NULL, DYNAMIC_TYPE_X509);
wolfSSL 0:9d17e4342598 11278 x509 = NULL;
wolfSSL 0:9d17e4342598 11279 }
wolfSSL 0:9d17e4342598 11280 FreeDecodedCert(&dCert);
wolfSSL 0:9d17e4342598 11281
wolfSSL 0:9d17e4342598 11282 return x509;
wolfSSL 0:9d17e4342598 11283 }
wolfSSL 0:9d17e4342598 11284
wolfSSL 0:9d17e4342598 11285
wolfSSL 0:9d17e4342598 11286 /* Get peer's PEM ceritifcate at index (idx), output to buffer if inLen big
wolfSSL 0:9d17e4342598 11287 enough else return error (-1), output length is in *outLen
wolfSSL 0:9d17e4342598 11288 SSL_SUCCESS on ok */
wolfSSL 0:9d17e4342598 11289 int CyaSSL_get_chain_cert_pem(CYASSL_X509_CHAIN* chain, int idx,
wolfSSL 0:9d17e4342598 11290 unsigned char* buf, int inLen, int* outLen)
wolfSSL 0:9d17e4342598 11291 {
wolfSSL 0:9d17e4342598 11292 const char header[] = "-----BEGIN CERTIFICATE-----\n";
wolfSSL 0:9d17e4342598 11293 const char footer[] = "-----END CERTIFICATE-----\n";
wolfSSL 0:9d17e4342598 11294
wolfSSL 0:9d17e4342598 11295 int headerLen = sizeof(header) - 1;
wolfSSL 0:9d17e4342598 11296 int footerLen = sizeof(footer) - 1;
wolfSSL 0:9d17e4342598 11297 int i;
wolfSSL 0:9d17e4342598 11298 int err;
wolfSSL 0:9d17e4342598 11299
wolfSSL 0:9d17e4342598 11300 CYASSL_ENTER("CyaSSL_get_chain_cert_pem");
wolfSSL 0:9d17e4342598 11301 if (!chain || !outLen || !buf)
wolfSSL 0:9d17e4342598 11302 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 11303
wolfSSL 0:9d17e4342598 11304 /* don't even try if inLen too short */
wolfSSL 0:9d17e4342598 11305 if (inLen < headerLen + footerLen + chain->certs[idx].length)
wolfSSL 0:9d17e4342598 11306 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 11307
wolfSSL 0:9d17e4342598 11308 /* header */
wolfSSL 0:9d17e4342598 11309 XMEMCPY(buf, header, headerLen);
wolfSSL 0:9d17e4342598 11310 i = headerLen;
wolfSSL 0:9d17e4342598 11311
wolfSSL 0:9d17e4342598 11312 /* body */
wolfSSL 0:9d17e4342598 11313 *outLen = inLen; /* input to Base64_Encode */
wolfSSL 0:9d17e4342598 11314 if ( (err = Base64_Encode(chain->certs[idx].buffer,
wolfSSL 0:9d17e4342598 11315 chain->certs[idx].length, buf + i, (word32*)outLen)) < 0)
wolfSSL 0:9d17e4342598 11316 return err;
wolfSSL 0:9d17e4342598 11317 i += *outLen;
wolfSSL 0:9d17e4342598 11318
wolfSSL 0:9d17e4342598 11319 /* footer */
wolfSSL 0:9d17e4342598 11320 if ( (i + footerLen) > inLen)
wolfSSL 0:9d17e4342598 11321 return BAD_FUNC_ARG;
wolfSSL 0:9d17e4342598 11322 XMEMCPY(buf + i, footer, footerLen);
wolfSSL 0:9d17e4342598 11323 *outLen += headerLen + footerLen;
wolfSSL 0:9d17e4342598 11324
wolfSSL 0:9d17e4342598 11325 return SSL_SUCCESS;
wolfSSL 0:9d17e4342598 11326 }
wolfSSL 0:9d17e4342598 11327
wolfSSL 0:9d17e4342598 11328
wolfSSL 0:9d17e4342598 11329 /* get session ID */
wolfSSL 0:9d17e4342598 11330 const byte* CyaSSL_get_sessionID(const CYASSL_SESSION* session)
wolfSSL 0:9d17e4342598 11331 {
wolfSSL 0:9d17e4342598 11332 CYASSL_ENTER("CyaSSL_get_sessionID");
wolfSSL 0:9d17e4342598 11333 if (session)
wolfSSL 0:9d17e4342598 11334 return session->sessionID;
wolfSSL 0:9d17e4342598 11335
wolfSSL 0:9d17e4342598 11336 return NULL;
wolfSSL 0:9d17e4342598 11337 }
wolfSSL 0:9d17e4342598 11338
wolfSSL 0:9d17e4342598 11339
wolfSSL 0:9d17e4342598 11340 #endif /* SESSION_CERTS */
wolfSSL 0:9d17e4342598 11341
wolfSSL 0:9d17e4342598 11342
wolfSSL 0:9d17e4342598 11343 #ifndef NO_CERTS
wolfSSL 0:9d17e4342598 11344 #ifdef HAVE_PK_CALLBACKS
wolfSSL 0:9d17e4342598 11345
wolfSSL 0:9d17e4342598 11346 #ifdef HAVE_ECC
wolfSSL 0:9d17e4342598 11347
wolfSSL 0:9d17e4342598 11348 void CyaSSL_CTX_SetEccSignCb(CYASSL_CTX* ctx, CallbackEccSign cb)
wolfSSL 0:9d17e4342598 11349 {
wolfSSL 0:9d17e4342598 11350 if (ctx)
wolfSSL 0:9d17e4342598 11351 ctx->EccSignCb = cb;
wolfSSL 0:9d17e4342598 11352 }
wolfSSL 0:9d17e4342598 11353
wolfSSL 0:9d17e4342598 11354
wolfSSL 0:9d17e4342598 11355 void CyaSSL_SetEccSignCtx(CYASSL* ssl, void *ctx)
wolfSSL 0:9d17e4342598 11356 {
wolfSSL 0:9d17e4342598 11357 if (ssl)
wolfSSL 0:9d17e4342598 11358 ssl->EccSignCtx = ctx;
wolfSSL 0:9d17e4342598 11359 }
wolfSSL 0:9d17e4342598 11360
wolfSSL 0:9d17e4342598 11361
wolfSSL 0:9d17e4342598 11362 void* CyaSSL_GetEccSignCtx(CYASSL* ssl)
wolfSSL 0:9d17e4342598 11363 {
wolfSSL 0:9d17e4342598 11364 if (ssl)
wolfSSL 0:9d17e4342598 11365 return ssl->EccSignCtx;
wolfSSL 0:9d17e4342598 11366
wolfSSL 0:9d17e4342598 11367 return NULL;
wolfSSL 0:9d17e4342598 11368 }
wolfSSL 0:9d17e4342598 11369
wolfSSL 0:9d17e4342598 11370
wolfSSL 0:9d17e4342598 11371 void CyaSSL_CTX_SetEccVerifyCb(CYASSL_CTX* ctx, CallbackEccVerify cb)
wolfSSL 0:9d17e4342598 11372 {
wolfSSL 0:9d17e4342598 11373 if (ctx)
wolfSSL 0:9d17e4342598 11374 ctx->EccVerifyCb = cb;
wolfSSL 0:9d17e4342598 11375 }
wolfSSL 0:9d17e4342598 11376
wolfSSL 0:9d17e4342598 11377
wolfSSL 0:9d17e4342598 11378 void CyaSSL_SetEccVerifyCtx(CYASSL* ssl, void *ctx)
wolfSSL 0:9d17e4342598 11379 {
wolfSSL 0:9d17e4342598 11380 if (ssl)
wolfSSL 0:9d17e4342598 11381 ssl->EccVerifyCtx = ctx;
wolfSSL 0:9d17e4342598 11382 }
wolfSSL 0:9d17e4342598 11383
wolfSSL 0:9d17e4342598 11384
wolfSSL 0:9d17e4342598 11385 void* CyaSSL_GetEccVerifyCtx(CYASSL* ssl)
wolfSSL 0:9d17e4342598 11386 {
wolfSSL 0:9d17e4342598 11387 if (ssl)
wolfSSL 0:9d17e4342598 11388 return ssl->EccVerifyCtx;
wolfSSL 0:9d17e4342598 11389
wolfSSL 0:9d17e4342598 11390 return NULL;
wolfSSL 0:9d17e4342598 11391 }
wolfSSL 0:9d17e4342598 11392
wolfSSL 0:9d17e4342598 11393 #endif /* HAVE_ECC */
wolfSSL 0:9d17e4342598 11394
wolfSSL 0:9d17e4342598 11395 #ifndef NO_RSA
wolfSSL 0:9d17e4342598 11396
wolfSSL 0:9d17e4342598 11397 void CyaSSL_CTX_SetRsaSignCb(CYASSL_CTX* ctx, CallbackRsaSign cb)
wolfSSL 0:9d17e4342598 11398 {
wolfSSL 0:9d17e4342598 11399 if (ctx)
wolfSSL 0:9d17e4342598 11400 ctx->RsaSignCb = cb;
wolfSSL 0:9d17e4342598 11401 }
wolfSSL 0:9d17e4342598 11402
wolfSSL 0:9d17e4342598 11403
wolfSSL 0:9d17e4342598 11404 void CyaSSL_SetRsaSignCtx(CYASSL* ssl, void *ctx)
wolfSSL 0:9d17e4342598 11405 {
wolfSSL 0:9d17e4342598 11406 if (ssl)
wolfSSL 0:9d17e4342598 11407 ssl->RsaSignCtx = ctx;
wolfSSL 0:9d17e4342598 11408 }
wolfSSL 0:9d17e4342598 11409
wolfSSL 0:9d17e4342598 11410
wolfSSL 0:9d17e4342598 11411 void* CyaSSL_GetRsaSignCtx(CYASSL* ssl)
wolfSSL 0:9d17e4342598 11412 {
wolfSSL 0:9d17e4342598 11413 if (ssl)
wolfSSL 0:9d17e4342598 11414 return ssl->RsaSignCtx;
wolfSSL 0:9d17e4342598 11415
wolfSSL 0:9d17e4342598 11416 return NULL;
wolfSSL 0:9d17e4342598 11417 }
wolfSSL 0:9d17e4342598 11418
wolfSSL 0:9d17e4342598 11419
wolfSSL 0:9d17e4342598 11420 void CyaSSL_CTX_SetRsaVerifyCb(CYASSL_CTX* ctx, CallbackRsaVerify cb)
wolfSSL 0:9d17e4342598 11421 {
wolfSSL 0:9d17e4342598 11422 if (ctx)
wolfSSL 0:9d17e4342598 11423 ctx->RsaVerifyCb = cb;
wolfSSL 0:9d17e4342598 11424 }
wolfSSL 0:9d17e4342598 11425
wolfSSL 0:9d17e4342598 11426
wolfSSL 0:9d17e4342598 11427 void CyaSSL_SetRsaVerifyCtx(CYASSL* ssl, void *ctx)
wolfSSL 0:9d17e4342598 11428 {
wolfSSL 0:9d17e4342598 11429 if (ssl)
wolfSSL 0:9d17e4342598 11430 ssl->RsaVerifyCtx = ctx;
wolfSSL 0:9d17e4342598 11431 }
wolfSSL 0:9d17e4342598 11432
wolfSSL 0:9d17e4342598 11433
wolfSSL 0:9d17e4342598 11434 void* CyaSSL_GetRsaVerifyCtx(CYASSL* ssl)
wolfSSL 0:9d17e4342598 11435 {
wolfSSL 0:9d17e4342598 11436 if (ssl)
wolfSSL 0:9d17e4342598 11437 return ssl->RsaVerifyCtx;
wolfSSL 0:9d17e4342598 11438
wolfSSL 0:9d17e4342598 11439 return NULL;
wolfSSL 0:9d17e4342598 11440 }
wolfSSL 0:9d17e4342598 11441
wolfSSL 0:9d17e4342598 11442 void CyaSSL_CTX_SetRsaEncCb(CYASSL_CTX* ctx, CallbackRsaEnc cb)
wolfSSL 0:9d17e4342598 11443 {
wolfSSL 0:9d17e4342598 11444 if (ctx)
wolfSSL 0:9d17e4342598 11445 ctx->RsaEncCb = cb;
wolfSSL 0:9d17e4342598 11446 }
wolfSSL 0:9d17e4342598 11447
wolfSSL 0:9d17e4342598 11448
wolfSSL 0:9d17e4342598 11449 void CyaSSL_SetRsaEncCtx(CYASSL* ssl, void *ctx)
wolfSSL 0:9d17e4342598 11450 {
wolfSSL 0:9d17e4342598 11451 if (ssl)
wolfSSL 0:9d17e4342598 11452 ssl->RsaEncCtx = ctx;
wolfSSL 0:9d17e4342598 11453 }
wolfSSL 0:9d17e4342598 11454
wolfSSL 0:9d17e4342598 11455
wolfSSL 0:9d17e4342598 11456 void* CyaSSL_GetRsaEncCtx(CYASSL* ssl)
wolfSSL 0:9d17e4342598 11457 {
wolfSSL 0:9d17e4342598 11458 if (ssl)
wolfSSL 0:9d17e4342598 11459 return ssl->RsaEncCtx;
wolfSSL 0:9d17e4342598 11460
wolfSSL 0:9d17e4342598 11461 return NULL;
wolfSSL 0:9d17e4342598 11462 }
wolfSSL 0:9d17e4342598 11463
wolfSSL 0:9d17e4342598 11464 void CyaSSL_CTX_SetRsaDecCb(CYASSL_CTX* ctx, CallbackRsaDec cb)
wolfSSL 0:9d17e4342598 11465 {
wolfSSL 0:9d17e4342598 11466 if (ctx)
wolfSSL 0:9d17e4342598 11467 ctx->RsaDecCb = cb;
wolfSSL 0:9d17e4342598 11468 }
wolfSSL 0:9d17e4342598 11469
wolfSSL 0:9d17e4342598 11470
wolfSSL 0:9d17e4342598 11471 void CyaSSL_SetRsaDecCtx(CYASSL* ssl, void *ctx)
wolfSSL 0:9d17e4342598 11472 {
wolfSSL 0:9d17e4342598 11473 if (ssl)
wolfSSL 0:9d17e4342598 11474 ssl->RsaDecCtx = ctx;
wolfSSL 0:9d17e4342598 11475 }
wolfSSL 0:9d17e4342598 11476
wolfSSL 0:9d17e4342598 11477
wolfSSL 0:9d17e4342598 11478 void* CyaSSL_GetRsaDecCtx(CYASSL* ssl)
wolfSSL 0:9d17e4342598 11479 {
wolfSSL 0:9d17e4342598 11480 if (ssl)
wolfSSL 0:9d17e4342598 11481 return ssl->RsaDecCtx;
wolfSSL 0:9d17e4342598 11482
wolfSSL 0:9d17e4342598 11483 return NULL;
wolfSSL 0:9d17e4342598 11484 }
wolfSSL 0:9d17e4342598 11485
wolfSSL 0:9d17e4342598 11486
wolfSSL 0:9d17e4342598 11487 #endif /* NO_RSA */
wolfSSL 0:9d17e4342598 11488
wolfSSL 0:9d17e4342598 11489 #endif /* HAVE_PK_CALLBACKS */
wolfSSL 0:9d17e4342598 11490 #endif /* NO_CERTS */
wolfSSL 0:9d17e4342598 11491
wolfSSL 0:9d17e4342598 11492
wolfSSL 0:9d17e4342598 11493 #ifdef CYASSL_HAVE_WOLFSCEP
wolfSSL 0:9d17e4342598 11494 /* Used by autoconf to see if wolfSCEP is available */
wolfSSL 0:9d17e4342598 11495 void CyaSSL_wolfSCEP(void) {}
wolfSSL 0:9d17e4342598 11496 #endif
wolfSSL 0:9d17e4342598 11497
wolfSSL 0:9d17e4342598 11498
wolfSSL 0:9d17e4342598 11499 #ifdef CYASSL_HAVE_CERT_SERVICE
wolfSSL 0:9d17e4342598 11500 /* Used by autoconf to see if cert service is available */
wolfSSL 0:9d17e4342598 11501 void CyaSSL_cert_service(void) {}
wolfSSL 0:9d17e4342598 11502 #endif
wolfSSL 0:9d17e4342598 11503