PageRenderTime 48ms CodeModel.GetById 5ms RepoModel.GetById 0ms app.codeStats 2ms

/src/internal.c

https://github.com/andersmalm/cyassl
C | 8996 lines | 7080 code | 1550 blank | 366 comment | 1611 complexity | 6cce09424e74b757c538993f414fadba MD5 | raw file
Possible License(s): GPL-2.0
  1. /* internal.c
  2. *
  3. * Copyright (C) 2006-2012 Sawtooth Consulting Ltd.
  4. *
  5. * This file is part of CyaSSL.
  6. *
  7. * CyaSSL is free software; you can redistribute it and/or modify
  8. * it under the terms of the GNU General Public License as published by
  9. * the Free Software Foundation; either version 2 of the License, or
  10. * (at your option) any later version.
  11. *
  12. * CyaSSL is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. * GNU General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU General Public License
  18. * along with this program; if not, write to the Free Software
  19. * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
  20. */
  21. #ifdef HAVE_CONFIG_H
  22. #include <config.h>
  23. #endif
  24. #include <cyassl/internal.h>
  25. #include <cyassl/error.h>
  26. #include <cyassl/ctaocrypt/asn.h>
  27. #ifdef HAVE_LIBZ
  28. #include "zlib.h"
  29. #endif
  30. #ifdef HAVE_NTRU
  31. #include "crypto_ntru.h"
  32. #endif
  33. #if defined(DEBUG_CYASSL) || defined(SHOW_SECRETS)
  34. #ifdef FREESCALE_MQX
  35. #include <fio.h>
  36. #else
  37. #include <stdio.h>
  38. #endif
  39. #endif
  40. #ifdef __sun
  41. #include <sys/filio.h>
  42. #endif
  43. #ifndef TRUE
  44. #define TRUE 1
  45. #endif
  46. #ifndef FALSE
  47. #define FALSE 0
  48. #endif
  49. #if defined(OPENSSL_EXTRA) && defined(NO_DH)
  50. #error OPENSSL_EXTRA needs DH, please remove NO_DH
  51. #endif
  52. #ifndef NO_CYASSL_CLIENT
  53. static int DoHelloVerifyRequest(CYASSL* ssl, const byte* input, word32*);
  54. static int DoServerHello(CYASSL* ssl, const byte* input, word32*, word32);
  55. static int DoServerKeyExchange(CYASSL* ssl, const byte* input, word32*);
  56. #ifndef NO_CERTS
  57. static int DoCertificateRequest(CYASSL* ssl, const byte* input,word32*);
  58. #endif
  59. #endif
  60. #ifndef NO_CYASSL_SERVER
  61. static int DoClientHello(CYASSL* ssl, const byte* input, word32*, word32,
  62. word32);
  63. static int DoClientKeyExchange(CYASSL* ssl, byte* input, word32*, word32);
  64. #if !defined(NO_RSA) || defined(HAVE_ECC)
  65. static int DoCertificateVerify(CYASSL* ssl, byte*, word32*, word32);
  66. #endif
  67. #endif
  68. typedef enum {
  69. doProcessInit = 0,
  70. #ifndef NO_CYASSL_SERVER
  71. runProcessOldClientHello,
  72. #endif
  73. getRecordLayerHeader,
  74. getData,
  75. runProcessingOneMessage
  76. } processReply;
  77. #ifndef NO_MD5
  78. static void Hmac(CYASSL* ssl, byte* digest, const byte* buffer, word32 sz,
  79. int content, int verify);
  80. static void BuildCertHashes(CYASSL* ssl, Hashes* hashes);
  81. #endif
  82. #ifndef min
  83. static INLINE word32 min(word32 a, word32 b)
  84. {
  85. return a > b ? b : a;
  86. }
  87. #endif /* min */
  88. int IsTLS(const CYASSL* ssl)
  89. {
  90. if (ssl->version.major == SSLv3_MAJOR && ssl->version.minor >=TLSv1_MINOR)
  91. return 1;
  92. return 0;
  93. }
  94. int IsAtLeastTLSv1_2(const CYASSL* ssl)
  95. {
  96. if (ssl->version.major == SSLv3_MAJOR && ssl->version.minor >=TLSv1_2_MINOR)
  97. return 1;
  98. return 0;
  99. }
  100. #ifdef HAVE_NTRU
  101. static byte GetEntropy(ENTROPY_CMD cmd, byte* out)
  102. {
  103. /* TODO: add locking? */
  104. static RNG rng;
  105. if (cmd == INIT) {
  106. int ret = InitRng(&rng);
  107. if (ret == 0)
  108. return 1;
  109. else
  110. return 0;
  111. }
  112. if (out == NULL)
  113. return 0;
  114. if (cmd == GET_BYTE_OF_ENTROPY) {
  115. RNG_GenerateBlock(&rng, out, 1);
  116. return 1;
  117. }
  118. if (cmd == GET_NUM_BYTES_PER_BYTE_OF_ENTROPY) {
  119. *out = 1;
  120. return 1;
  121. }
  122. return 0;
  123. }
  124. #endif /* HAVE_NTRU */
  125. /* used by ssl.c too */
  126. void c32to24(word32 in, word24 out)
  127. {
  128. out[0] = (in >> 16) & 0xff;
  129. out[1] = (in >> 8) & 0xff;
  130. out[2] = in & 0xff;
  131. }
  132. #ifdef CYASSL_DTLS
  133. static INLINE void c32to48(word32 in, byte out[6])
  134. {
  135. out[0] = 0;
  136. out[1] = 0;
  137. out[2] = (in >> 24) & 0xff;
  138. out[3] = (in >> 16) & 0xff;
  139. out[4] = (in >> 8) & 0xff;
  140. out[5] = in & 0xff;
  141. }
  142. #endif /* CYASSL_DTLS */
  143. /* convert 16 bit integer to opaque */
  144. static INLINE void c16toa(word16 u16, byte* c)
  145. {
  146. c[0] = (u16 >> 8) & 0xff;
  147. c[1] = u16 & 0xff;
  148. }
  149. /* convert 32 bit integer to opaque */
  150. static INLINE void c32toa(word32 u32, byte* c)
  151. {
  152. c[0] = (u32 >> 24) & 0xff;
  153. c[1] = (u32 >> 16) & 0xff;
  154. c[2] = (u32 >> 8) & 0xff;
  155. c[3] = u32 & 0xff;
  156. }
  157. /* convert a 24 bit integer into a 32 bit one */
  158. static INLINE void c24to32(const word24 u24, word32* u32)
  159. {
  160. *u32 = (u24[0] << 16) | (u24[1] << 8) | u24[2];
  161. }
  162. /* convert opaque to 16 bit integer */
  163. static INLINE void ato16(const byte* c, word16* u16)
  164. {
  165. *u16 = (c[0] << 8) | (c[1]);
  166. }
  167. /* convert opaque to 32 bit integer */
  168. static INLINE void ato32(const byte* c, word32* u32)
  169. {
  170. *u32 = (c[0] << 24) | (c[1] << 16) | (c[2] << 8) | c[3];
  171. }
  172. #ifdef HAVE_LIBZ
  173. /* alloc user allocs to work with zlib */
  174. static void* myAlloc(void* opaque, unsigned int item, unsigned int size)
  175. {
  176. (void)opaque;
  177. return XMALLOC(item * size, opaque, DYNAMIC_TYPE_LIBZ);
  178. }
  179. static void myFree(void* opaque, void* memory)
  180. {
  181. (void)opaque;
  182. XFREE(memory, opaque, DYNAMIC_TYPE_LIBZ);
  183. }
  184. /* init zlib comp/decomp streams, 0 on success */
  185. static int InitStreams(CYASSL* ssl)
  186. {
  187. ssl->c_stream.zalloc = (alloc_func)myAlloc;
  188. ssl->c_stream.zfree = (free_func)myFree;
  189. ssl->c_stream.opaque = (voidpf)ssl->heap;
  190. if (deflateInit(&ssl->c_stream, Z_DEFAULT_COMPRESSION) != Z_OK)
  191. return ZLIB_INIT_ERROR;
  192. ssl->didStreamInit = 1;
  193. ssl->d_stream.zalloc = (alloc_func)myAlloc;
  194. ssl->d_stream.zfree = (free_func)myFree;
  195. ssl->d_stream.opaque = (voidpf)ssl->heap;
  196. if (inflateInit(&ssl->d_stream) != Z_OK) return ZLIB_INIT_ERROR;
  197. return 0;
  198. }
  199. static void FreeStreams(CYASSL* ssl)
  200. {
  201. if (ssl->didStreamInit) {
  202. deflateEnd(&ssl->c_stream);
  203. inflateEnd(&ssl->d_stream);
  204. }
  205. }
  206. /* compress in to out, return out size or error */
  207. static int Compress(CYASSL* ssl, byte* in, int inSz, byte* out, int outSz)
  208. {
  209. int err;
  210. int currTotal = (int)ssl->c_stream.total_out;
  211. ssl->c_stream.next_in = in;
  212. ssl->c_stream.avail_in = inSz;
  213. ssl->c_stream.next_out = out;
  214. ssl->c_stream.avail_out = outSz;
  215. err = deflate(&ssl->c_stream, Z_SYNC_FLUSH);
  216. if (err != Z_OK && err != Z_STREAM_END) return ZLIB_COMPRESS_ERROR;
  217. return (int)ssl->c_stream.total_out - currTotal;
  218. }
  219. /* decompress in to out, returnn out size or error */
  220. static int DeCompress(CYASSL* ssl, byte* in, int inSz, byte* out, int outSz)
  221. {
  222. int err;
  223. int currTotal = (int)ssl->d_stream.total_out;
  224. ssl->d_stream.next_in = in;
  225. ssl->d_stream.avail_in = inSz;
  226. ssl->d_stream.next_out = out;
  227. ssl->d_stream.avail_out = outSz;
  228. err = inflate(&ssl->d_stream, Z_SYNC_FLUSH);
  229. if (err != Z_OK && err != Z_STREAM_END) return ZLIB_DECOMPRESS_ERROR;
  230. return (int)ssl->d_stream.total_out - currTotal;
  231. }
  232. #endif /* HAVE_LIBZ */
  233. void InitSSL_Method(CYASSL_METHOD* method, ProtocolVersion pv)
  234. {
  235. method->version = pv;
  236. method->side = CLIENT_END;
  237. method->downgrade = 0;
  238. }
  239. /* Initialze SSL context, return 0 on success */
  240. int InitSSL_Ctx(CYASSL_CTX* ctx, CYASSL_METHOD* method)
  241. {
  242. ctx->method = method;
  243. ctx->refCount = 1; /* so either CTX_free or SSL_free can release */
  244. #ifndef NO_CERTS
  245. ctx->certificate.buffer = 0;
  246. ctx->certChain.buffer = 0;
  247. ctx->privateKey.buffer = 0;
  248. ctx->serverDH_P.buffer = 0;
  249. ctx->serverDH_G.buffer = 0;
  250. #endif
  251. ctx->haveDH = 0;
  252. ctx->haveNTRU = 0; /* start off */
  253. ctx->haveECDSAsig = 0; /* start off */
  254. ctx->haveStaticECC = 0; /* start off */
  255. ctx->heap = ctx; /* defaults to self */
  256. #ifndef NO_PSK
  257. ctx->havePSK = 0;
  258. ctx->server_hint[0] = 0;
  259. ctx->client_psk_cb = 0;
  260. ctx->server_psk_cb = 0;
  261. #endif /* NO_PSK */
  262. #ifdef HAVE_ECC
  263. ctx->eccTempKeySz = ECDHE_SIZE;
  264. #endif
  265. #ifdef OPENSSL_EXTRA
  266. ctx->passwd_cb = 0;
  267. ctx->userdata = 0;
  268. #endif /* OPENSSL_EXTRA */
  269. ctx->timeout = DEFAULT_TIMEOUT;
  270. #ifndef CYASSL_USER_IO
  271. ctx->CBIORecv = EmbedReceive;
  272. ctx->CBIOSend = EmbedSend;
  273. #ifdef CYASSL_DTLS
  274. if (method->version.major == DTLS_MAJOR
  275. && method->version.minor == DTLS_MINOR) {
  276. ctx->CBIORecv = EmbedReceiveFrom;
  277. ctx->CBIOSend = EmbedSendTo;
  278. }
  279. #endif
  280. #else
  281. /* user will set */
  282. ctx->CBIORecv = NULL;
  283. ctx->CBIOSend = NULL;
  284. #endif
  285. ctx->partialWrite = 0;
  286. ctx->verifyCallback = 0;
  287. #ifndef NO_CERTS
  288. ctx->cm = CyaSSL_CertManagerNew();
  289. #endif
  290. #ifdef HAVE_NTRU
  291. if (method->side == CLIENT_END)
  292. ctx->haveNTRU = 1; /* always on cliet side */
  293. /* server can turn on by loading key */
  294. #endif
  295. #ifdef HAVE_ECC
  296. if (method->side == CLIENT_END) {
  297. ctx->haveECDSAsig = 1; /* always on cliet side */
  298. ctx->haveStaticECC = 1; /* server can turn on by loading key */
  299. }
  300. #endif
  301. ctx->suites.setSuites = 0; /* user hasn't set yet */
  302. /* remove DH later if server didn't set, add psk later */
  303. InitSuites(&ctx->suites, method->version, TRUE, FALSE, TRUE, ctx->haveNTRU,
  304. ctx->haveECDSAsig, ctx->haveStaticECC, method->side);
  305. ctx->verifyPeer = 0;
  306. ctx->verifyNone = 0;
  307. ctx->failNoCert = 0;
  308. ctx->sessionCacheOff = 0; /* initially on */
  309. ctx->sessionCacheFlushOff = 0; /* initially on */
  310. ctx->sendVerify = 0;
  311. ctx->quietShutdown = 0;
  312. ctx->groupMessages = 0;
  313. #ifdef HAVE_OCSP
  314. CyaSSL_OCSP_Init(&ctx->ocsp);
  315. #endif
  316. #ifdef HAVE_CAVIUM
  317. ctx->devId = NO_CAVIUM_DEVICE;
  318. #endif
  319. if (InitMutex(&ctx->countMutex) < 0) {
  320. CYASSL_MSG("Mutex error on CTX init");
  321. return BAD_MUTEX_ERROR;
  322. }
  323. #ifndef NO_CERTS
  324. if (ctx->cm == NULL) {
  325. CYASSL_MSG("Bad Cert Manager New");
  326. return BAD_CERT_MANAGER_ERROR;
  327. }
  328. #endif
  329. return 0;
  330. }
  331. /* In case contexts are held in array and don't want to free actual ctx */
  332. void SSL_CtxResourceFree(CYASSL_CTX* ctx)
  333. {
  334. XFREE(ctx->method, ctx->heap, DYNAMIC_TYPE_METHOD);
  335. #ifndef NO_CERTS
  336. XFREE(ctx->serverDH_G.buffer, ctx->heap, DYNAMIC_TYPE_DH);
  337. XFREE(ctx->serverDH_P.buffer, ctx->heap, DYNAMIC_TYPE_DH);
  338. XFREE(ctx->privateKey.buffer, ctx->heap, DYNAMIC_TYPE_KEY);
  339. XFREE(ctx->certificate.buffer, ctx->heap, DYNAMIC_TYPE_CERT);
  340. XFREE(ctx->certChain.buffer, ctx->heap, DYNAMIC_TYPE_CERT);
  341. CyaSSL_CertManagerFree(ctx->cm);
  342. #endif
  343. #ifdef HAVE_OCSP
  344. CyaSSL_OCSP_Cleanup(&ctx->ocsp);
  345. #endif
  346. }
  347. void FreeSSL_Ctx(CYASSL_CTX* ctx)
  348. {
  349. int doFree = 0;
  350. if (LockMutex(&ctx->countMutex) != 0) {
  351. CYASSL_MSG("Couldn't lock count mutex");
  352. return;
  353. }
  354. ctx->refCount--;
  355. if (ctx->refCount == 0)
  356. doFree = 1;
  357. UnLockMutex(&ctx->countMutex);
  358. if (doFree) {
  359. CYASSL_MSG("CTX ref count down to 0, doing full free");
  360. SSL_CtxResourceFree(ctx);
  361. XFREE(ctx, ctx->heap, DYNAMIC_TYPE_CTX);
  362. }
  363. else {
  364. (void)ctx;
  365. CYASSL_MSG("CTX ref count not 0 yet, no free");
  366. }
  367. }
  368. /* Set cipher pointers to null */
  369. void InitCiphers(CYASSL* ssl)
  370. {
  371. #ifdef BUILD_ARC4
  372. ssl->encrypt.arc4 = NULL;
  373. ssl->decrypt.arc4 = NULL;
  374. #endif
  375. #ifdef BUILD_DES3
  376. ssl->encrypt.des3 = NULL;
  377. ssl->decrypt.des3 = NULL;
  378. #endif
  379. #ifdef BUILD_AES
  380. ssl->encrypt.aes = NULL;
  381. ssl->decrypt.aes = NULL;
  382. #endif
  383. #ifdef HAVE_CAMELLIA
  384. ssl->encrypt.cam = NULL;
  385. ssl->decrypt.cam = NULL;
  386. #endif
  387. #ifdef HAVE_HC128
  388. ssl->encrypt.hc128 = NULL;
  389. ssl->decrypt.hc128 = NULL;
  390. #endif
  391. #ifdef BUILD_RABBIT
  392. ssl->encrypt.rabbit = NULL;
  393. ssl->decrypt.rabbit = NULL;
  394. #endif
  395. ssl->encrypt.setup = 0;
  396. ssl->decrypt.setup = 0;
  397. }
  398. /* Free ciphers */
  399. void FreeCiphers(CYASSL* ssl)
  400. {
  401. (void)ssl;
  402. #ifdef BUILD_ARC4
  403. #ifdef HAVE_CAVIUM
  404. if (ssl->devId != NO_CAVIUM_DEVICE) {
  405. Arc4FreeCavium(ssl->encrypt.arc4);
  406. Arc4FreeCavium(ssl->decrypt.arc4);
  407. }
  408. #endif
  409. XFREE(ssl->encrypt.arc4, ssl->heap, DYNAMIC_TYPE_CIPHER);
  410. XFREE(ssl->decrypt.arc4, ssl->heap, DYNAMIC_TYPE_CIPHER);
  411. #endif
  412. #ifdef BUILD_DES3
  413. #ifdef HAVE_CAVIUM
  414. if (ssl->devId != NO_CAVIUM_DEVICE) {
  415. Des3_FreeCavium(ssl->encrypt.des3);
  416. Des3_FreeCavium(ssl->decrypt.des3);
  417. }
  418. #endif
  419. XFREE(ssl->encrypt.des3, ssl->heap, DYNAMIC_TYPE_CIPHER);
  420. XFREE(ssl->decrypt.des3, ssl->heap, DYNAMIC_TYPE_CIPHER);
  421. #endif
  422. #ifdef BUILD_AES
  423. #ifdef HAVE_CAVIUM
  424. if (ssl->devId != NO_CAVIUM_DEVICE) {
  425. AesFreeCavium(ssl->encrypt.aes);
  426. AesFreeCavium(ssl->decrypt.aes);
  427. }
  428. #endif
  429. XFREE(ssl->encrypt.aes, ssl->heap, DYNAMIC_TYPE_CIPHER);
  430. XFREE(ssl->decrypt.aes, ssl->heap, DYNAMIC_TYPE_CIPHER);
  431. #endif
  432. #ifdef BUILD_CAMELLIA
  433. XFREE(ssl->encrypt.cam, ssl->heap, DYNAMIC_TYPE_CIPHER);
  434. XFREE(ssl->decrypt.cam, ssl->heap, DYNAMIC_TYPE_CIPHER);
  435. #endif
  436. #ifdef HAVE_HC128
  437. XFREE(ssl->encrypt.hc128, ssl->heap, DYNAMIC_TYPE_CIPHER);
  438. XFREE(ssl->decrypt.hc128, ssl->heap, DYNAMIC_TYPE_CIPHER);
  439. #endif
  440. #ifdef BUILD_RABBIT
  441. XFREE(ssl->encrypt.rabbit, ssl->heap, DYNAMIC_TYPE_CIPHER);
  442. XFREE(ssl->decrypt.rabbit, ssl->heap, DYNAMIC_TYPE_CIPHER);
  443. #endif
  444. }
  445. void InitCipherSpecs(CipherSpecs* cs)
  446. {
  447. cs->bulk_cipher_algorithm = INVALID_BYTE;
  448. cs->cipher_type = INVALID_BYTE;
  449. cs->mac_algorithm = INVALID_BYTE;
  450. cs->kea = INVALID_BYTE;
  451. cs->sig_algo = INVALID_BYTE;
  452. cs->hash_size = 0;
  453. cs->static_ecdh = 0;
  454. cs->key_size = 0;
  455. cs->iv_size = 0;
  456. cs->block_size = 0;
  457. }
  458. void InitSuites(Suites* suites, ProtocolVersion pv, byte haveRSA, byte havePSK,
  459. byte haveDH, byte haveNTRU, byte haveECDSAsig,
  460. byte haveStaticECC, int side)
  461. {
  462. word16 idx = 0;
  463. int tls = pv.major == SSLv3_MAJOR && pv.minor >= TLSv1_MINOR;
  464. int tls1_2 = pv.major == SSLv3_MAJOR && pv.minor >= TLSv1_2_MINOR;
  465. int haveRSAsig = 1;
  466. (void)tls; /* shut up compiler */
  467. (void)tls1_2;
  468. (void)haveDH;
  469. (void)havePSK;
  470. (void)haveNTRU;
  471. (void)haveStaticECC;
  472. if (suites == NULL) {
  473. CYASSL_MSG("InitSuites pointer error");
  474. return;
  475. }
  476. if (suites->setSuites)
  477. return; /* trust user settings, don't override */
  478. if (side == SERVER_END && haveStaticECC)
  479. haveRSA = 0; /* can't do RSA with ECDSA key */
  480. if (side == SERVER_END && haveECDSAsig) {
  481. haveRSAsig = 0; /* can't have RSA sig if signed by ECDSA */
  482. (void)haveRSAsig; /* non ecc builds won't read */
  483. }
  484. #ifdef CYASSL_DTLS
  485. if (pv.major == DTLS_MAJOR && pv.minor == DTLS_MINOR)
  486. tls = 1;
  487. #endif
  488. #ifdef BUILD_TLS_NTRU_RSA_WITH_AES_256_CBC_SHA
  489. if (tls && haveNTRU && haveRSA) {
  490. suites->suites[idx++] = 0;
  491. suites->suites[idx++] = TLS_NTRU_RSA_WITH_AES_256_CBC_SHA;
  492. }
  493. #endif
  494. #ifdef BUILD_TLS_NTRU_RSA_WITH_AES_128_CBC_SHA
  495. if (tls && haveNTRU && haveRSA) {
  496. suites->suites[idx++] = 0;
  497. suites->suites[idx++] = TLS_NTRU_RSA_WITH_AES_128_CBC_SHA;
  498. }
  499. #endif
  500. #ifdef BUILD_TLS_NTRU_RSA_WITH_RC4_128_SHA
  501. if (tls && haveNTRU && haveRSA) {
  502. suites->suites[idx++] = 0;
  503. suites->suites[idx++] = TLS_NTRU_RSA_WITH_RC4_128_SHA;
  504. }
  505. #endif
  506. #ifdef BUILD_TLS_NTRU_RSA_WITH_3DES_EDE_CBC_SHA
  507. if (tls && haveNTRU && haveRSA) {
  508. suites->suites[idx++] = 0;
  509. suites->suites[idx++] = TLS_NTRU_RSA_WITH_3DES_EDE_CBC_SHA;
  510. }
  511. #endif
  512. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
  513. if (tls1_2 && haveStaticECC) {
  514. suites->suites[idx++] = ECC_BYTE;
  515. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384;
  516. }
  517. #endif
  518. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
  519. if (tls && haveStaticECC) {
  520. suites->suites[idx++] = ECC_BYTE;
  521. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA;
  522. }
  523. #endif
  524. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384
  525. if (tls1_2 && haveECDSAsig && haveStaticECC) {
  526. suites->suites[idx++] = ECC_BYTE;
  527. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384;
  528. }
  529. #endif
  530. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA
  531. if (tls && haveECDSAsig && haveStaticECC) {
  532. suites->suites[idx++] = ECC_BYTE;
  533. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA;
  534. }
  535. #endif
  536. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
  537. if (tls1_2 && haveStaticECC) {
  538. suites->suites[idx++] = ECC_BYTE;
  539. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256;
  540. }
  541. #endif
  542. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
  543. if (tls && haveStaticECC) {
  544. suites->suites[idx++] = ECC_BYTE;
  545. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA;
  546. }
  547. #endif
  548. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256
  549. if (tls1_2 && haveECDSAsig && haveStaticECC) {
  550. suites->suites[idx++] = ECC_BYTE;
  551. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256;
  552. }
  553. #endif
  554. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA
  555. if (tls && haveECDSAsig && haveStaticECC) {
  556. suites->suites[idx++] = ECC_BYTE;
  557. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA;
  558. }
  559. #endif
  560. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA
  561. if (tls && haveStaticECC) {
  562. suites->suites[idx++] = ECC_BYTE;
  563. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_RC4_128_SHA;
  564. }
  565. #endif
  566. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_RC4_128_SHA
  567. if (tls && haveECDSAsig && haveStaticECC) {
  568. suites->suites[idx++] = ECC_BYTE;
  569. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_RC4_128_SHA;
  570. }
  571. #endif
  572. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA
  573. if (tls && haveStaticECC) {
  574. suites->suites[idx++] = ECC_BYTE;
  575. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA;
  576. }
  577. #endif
  578. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA
  579. if (tls && haveECDSAsig && haveStaticECC) {
  580. suites->suites[idx++] = ECC_BYTE;
  581. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA;
  582. }
  583. #endif
  584. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
  585. if (tls1_2 && haveRSA) {
  586. suites->suites[idx++] = ECC_BYTE;
  587. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384;
  588. }
  589. #endif
  590. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
  591. if (tls && haveRSA) {
  592. suites->suites[idx++] = ECC_BYTE;
  593. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA;
  594. }
  595. #endif
  596. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384
  597. if (tls1_2 && haveRSAsig && haveStaticECC) {
  598. suites->suites[idx++] = ECC_BYTE;
  599. suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384;
  600. }
  601. #endif
  602. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA
  603. if (tls && haveRSAsig && haveStaticECC) {
  604. suites->suites[idx++] = ECC_BYTE;
  605. suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_256_CBC_SHA;
  606. }
  607. #endif
  608. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
  609. if (tls1_2 && haveRSA) {
  610. suites->suites[idx++] = ECC_BYTE;
  611. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256;
  612. }
  613. #endif
  614. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
  615. if (tls && haveRSA) {
  616. suites->suites[idx++] = ECC_BYTE;
  617. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA;
  618. }
  619. #endif
  620. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256
  621. if (tls1_2 && haveRSAsig && haveStaticECC) {
  622. suites->suites[idx++] = ECC_BYTE;
  623. suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256;
  624. }
  625. #endif
  626. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA
  627. if (tls && haveRSAsig && haveStaticECC) {
  628. suites->suites[idx++] = ECC_BYTE;
  629. suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_128_CBC_SHA;
  630. }
  631. #endif
  632. #ifdef BUILD_TLS_ECDHE_RSA_WITH_RC4_128_SHA
  633. if (tls && haveRSA) {
  634. suites->suites[idx++] = ECC_BYTE;
  635. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_RC4_128_SHA;
  636. }
  637. #endif
  638. #ifdef BUILD_TLS_ECDH_RSA_WITH_RC4_128_SHA
  639. if (tls && haveRSAsig && haveStaticECC) {
  640. suites->suites[idx++] = ECC_BYTE;
  641. suites->suites[idx++] = TLS_ECDH_RSA_WITH_RC4_128_SHA;
  642. }
  643. #endif
  644. #ifdef BUILD_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA
  645. if (tls && haveRSA) {
  646. suites->suites[idx++] = ECC_BYTE;
  647. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA;
  648. }
  649. #endif
  650. #ifdef BUILD_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA
  651. if (tls && haveRSAsig && haveStaticECC) {
  652. suites->suites[idx++] = ECC_BYTE;
  653. suites->suites[idx++] = TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA;
  654. }
  655. #endif
  656. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
  657. if (tls1_2 && haveDH && haveRSA) {
  658. suites->suites[idx++] = 0;
  659. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_256_GCM_SHA384;
  660. }
  661. #endif
  662. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8_SHA256
  663. if (tls1_2 && haveECDSAsig && haveDH) {
  664. suites->suites[idx++] = ECC_BYTE;
  665. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8_SHA256;
  666. }
  667. #endif
  668. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8_SHA384
  669. if (tls1_2 && haveECDSAsig && haveDH) {
  670. suites->suites[idx++] = ECC_BYTE;
  671. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8_SHA384;
  672. }
  673. #endif
  674. #ifdef BUILD_TLS_RSA_WITH_AES_128_CCM_8_SHA256
  675. if (tls1_2 && haveRSA) {
  676. suites->suites[idx++] = ECC_BYTE;
  677. suites->suites[idx++] = TLS_RSA_WITH_AES_128_CCM_8_SHA256;
  678. }
  679. #endif
  680. #ifdef BUILD_TLS_RSA_WITH_AES_256_CCM_8_SHA384
  681. if (tls1_2 && haveRSA) {
  682. suites->suites[idx++] = ECC_BYTE;
  683. suites->suites[idx++] = TLS_RSA_WITH_AES_256_CCM_8_SHA384;
  684. }
  685. #endif
  686. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
  687. if (tls1_2 && haveDH && haveRSA) {
  688. suites->suites[idx++] = 0;
  689. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_256_CBC_SHA256;
  690. }
  691. #endif
  692. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
  693. if (tls1_2 && haveDH && haveRSA) {
  694. suites->suites[idx++] = 0;
  695. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_128_GCM_SHA256;
  696. }
  697. #endif
  698. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
  699. if (tls1_2 && haveDH && haveRSA) {
  700. suites->suites[idx++] = 0;
  701. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_128_CBC_SHA256;
  702. }
  703. #endif
  704. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_CBC_SHA
  705. if (tls && haveDH && haveRSA) {
  706. suites->suites[idx++] = 0;
  707. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_256_CBC_SHA;
  708. }
  709. #endif
  710. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_CBC_SHA
  711. if (tls && haveDH && haveRSA) {
  712. suites->suites[idx++] = 0;
  713. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_128_CBC_SHA;
  714. }
  715. #endif
  716. #ifdef BUILD_TLS_RSA_WITH_AES_256_GCM_SHA384
  717. if (tls1_2 && haveRSA) {
  718. suites->suites[idx++] = 0;
  719. suites->suites[idx++] = TLS_RSA_WITH_AES_256_GCM_SHA384;
  720. }
  721. #endif
  722. #ifdef BUILD_TLS_RSA_WITH_AES_256_CBC_SHA256
  723. if (tls1_2 && haveRSA) {
  724. suites->suites[idx++] = 0;
  725. suites->suites[idx++] = TLS_RSA_WITH_AES_256_CBC_SHA256;
  726. }
  727. #endif
  728. #ifdef BUILD_TLS_RSA_WITH_AES_128_GCM_SHA256
  729. if (tls1_2 && haveRSA) {
  730. suites->suites[idx++] = 0;
  731. suites->suites[idx++] = TLS_RSA_WITH_AES_128_GCM_SHA256;
  732. }
  733. #endif
  734. #ifdef BUILD_TLS_RSA_WITH_AES_128_CBC_SHA256
  735. if (tls1_2 && haveRSA) {
  736. suites->suites[idx++] = 0;
  737. suites->suites[idx++] = TLS_RSA_WITH_AES_128_CBC_SHA256;
  738. }
  739. #endif
  740. #ifdef BUILD_TLS_RSA_WITH_AES_256_CBC_SHA
  741. if (tls && haveRSA) {
  742. suites->suites[idx++] = 0;
  743. suites->suites[idx++] = TLS_RSA_WITH_AES_256_CBC_SHA;
  744. }
  745. #endif
  746. #ifdef BUILD_TLS_RSA_WITH_AES_128_CBC_SHA
  747. if (tls && haveRSA) {
  748. suites->suites[idx++] = 0;
  749. suites->suites[idx++] = TLS_RSA_WITH_AES_128_CBC_SHA;
  750. }
  751. #endif
  752. #ifdef BUILD_TLS_RSA_WITH_NULL_SHA
  753. if (tls && haveRSA) {
  754. suites->suites[idx++] = 0;
  755. suites->suites[idx++] = TLS_RSA_WITH_NULL_SHA;
  756. }
  757. #endif
  758. #ifdef BUILD_TLS_RSA_WITH_NULL_SHA256
  759. if (tls && haveRSA) {
  760. suites->suites[idx++] = 0;
  761. suites->suites[idx++] = TLS_RSA_WITH_NULL_SHA256;
  762. }
  763. #endif
  764. #ifdef BUILD_TLS_PSK_WITH_AES_256_CBC_SHA
  765. if (tls && havePSK) {
  766. suites->suites[idx++] = 0;
  767. suites->suites[idx++] = TLS_PSK_WITH_AES_256_CBC_SHA;
  768. }
  769. #endif
  770. #ifdef BUILD_TLS_PSK_WITH_AES_128_CBC_SHA256
  771. if (tls && havePSK) {
  772. suites->suites[idx++] = 0;
  773. suites->suites[idx++] = TLS_PSK_WITH_AES_128_CBC_SHA256;
  774. }
  775. #endif
  776. #ifdef BUILD_TLS_PSK_WITH_AES_128_CBC_SHA
  777. if (tls && havePSK) {
  778. suites->suites[idx++] = 0;
  779. suites->suites[idx++] = TLS_PSK_WITH_AES_128_CBC_SHA;
  780. }
  781. #endif
  782. #ifdef BUILD_TLS_PSK_WITH_NULL_SHA256
  783. if (tls & havePSK) {
  784. suites->suites[idx++] = 0;
  785. suites->suites[idx++] = TLS_PSK_WITH_NULL_SHA256;
  786. }
  787. #endif
  788. #ifdef BUILD_TLS_PSK_WITH_NULL_SHA
  789. if (tls & havePSK) {
  790. suites->suites[idx++] = 0;
  791. suites->suites[idx++] = TLS_PSK_WITH_NULL_SHA;
  792. }
  793. #endif
  794. #ifdef BUILD_SSL_RSA_WITH_RC4_128_SHA
  795. if (haveRSA ) {
  796. suites->suites[idx++] = 0;
  797. suites->suites[idx++] = SSL_RSA_WITH_RC4_128_SHA;
  798. }
  799. #endif
  800. #ifdef BUILD_SSL_RSA_WITH_RC4_128_MD5
  801. if (haveRSA ) {
  802. suites->suites[idx++] = 0;
  803. suites->suites[idx++] = SSL_RSA_WITH_RC4_128_MD5;
  804. }
  805. #endif
  806. #ifdef BUILD_SSL_RSA_WITH_3DES_EDE_CBC_SHA
  807. if (haveRSA ) {
  808. suites->suites[idx++] = 0;
  809. suites->suites[idx++] = SSL_RSA_WITH_3DES_EDE_CBC_SHA;
  810. }
  811. #endif
  812. #ifdef BUILD_TLS_RSA_WITH_HC_128_CBC_MD5
  813. if (tls && haveRSA) {
  814. suites->suites[idx++] = 0;
  815. suites->suites[idx++] = TLS_RSA_WITH_HC_128_CBC_MD5;
  816. }
  817. #endif
  818. #ifdef BUILD_TLS_RSA_WITH_HC_128_CBC_SHA
  819. if (tls && haveRSA) {
  820. suites->suites[idx++] = 0;
  821. suites->suites[idx++] = TLS_RSA_WITH_HC_128_CBC_SHA;
  822. }
  823. #endif
  824. #ifdef BUILD_TLS_RSA_WITH_RABBIT_CBC_SHA
  825. if (tls && haveRSA) {
  826. suites->suites[idx++] = 0;
  827. suites->suites[idx++] = TLS_RSA_WITH_RABBIT_CBC_SHA;
  828. }
  829. #endif
  830. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA
  831. if (tls && haveRSA) {
  832. suites->suites[idx++] = 0;
  833. suites->suites[idx++] = TLS_RSA_WITH_CAMELLIA_128_CBC_SHA;
  834. }
  835. #endif
  836. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA
  837. if (tls && haveDH && haveRSA) {
  838. suites->suites[idx++] = 0;
  839. suites->suites[idx++] = TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA;
  840. }
  841. #endif
  842. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA
  843. if (tls && haveRSA) {
  844. suites->suites[idx++] = 0;
  845. suites->suites[idx++] = TLS_RSA_WITH_CAMELLIA_256_CBC_SHA;
  846. }
  847. #endif
  848. #ifdef BUILD_TLS_DHE_WITH_RSA_CAMELLIA_256_CBC_SHA
  849. if (tls && haveDH && haveRSA) {
  850. suites->suites[idx++] = 0;
  851. suites->suites[idx++] = TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA;
  852. }
  853. #endif
  854. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256
  855. if (tls && haveRSA) {
  856. suites->suites[idx++] = 0;
  857. suites->suites[idx++] = TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256;
  858. }
  859. #endif
  860. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256
  861. if (tls && haveDH && haveRSA) {
  862. suites->suites[idx++] = 0;
  863. suites->suites[idx++] = TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256;
  864. }
  865. #endif
  866. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256
  867. if (tls && haveRSA) {
  868. suites->suites[idx++] = 0;
  869. suites->suites[idx++] = TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256;
  870. }
  871. #endif
  872. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256
  873. if (tls && haveDH && haveRSA) {
  874. suites->suites[idx++] = 0;
  875. suites->suites[idx++] = TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256;
  876. }
  877. #endif
  878. suites->suiteSz = idx;
  879. }
  880. /* init everything to 0, NULL, default values before calling anything that may
  881. fail so that desctructor has a "good" state to cleanup */
  882. int InitSSL(CYASSL* ssl, CYASSL_CTX* ctx)
  883. {
  884. int ret;
  885. byte haveRSA = 0;
  886. byte havePSK = 0;
  887. ssl->ctx = ctx; /* only for passing to calls, options could change */
  888. ssl->version = ctx->method->version;
  889. ssl->suites = NULL;
  890. #ifdef HAVE_LIBZ
  891. ssl->didStreamInit = 0;
  892. #endif
  893. #ifndef NO_RSA
  894. haveRSA = 1;
  895. #endif
  896. #ifndef NO_CERTS
  897. ssl->buffers.certificate.buffer = 0;
  898. ssl->buffers.key.buffer = 0;
  899. ssl->buffers.certChain.buffer = 0;
  900. #endif
  901. ssl->buffers.inputBuffer.length = 0;
  902. ssl->buffers.inputBuffer.idx = 0;
  903. ssl->buffers.inputBuffer.buffer = ssl->buffers.inputBuffer.staticBuffer;
  904. ssl->buffers.inputBuffer.bufferSize = STATIC_BUFFER_LEN;
  905. ssl->buffers.inputBuffer.dynamicFlag = 0;
  906. ssl->buffers.outputBuffer.length = 0;
  907. ssl->buffers.outputBuffer.idx = 0;
  908. ssl->buffers.outputBuffer.buffer = ssl->buffers.outputBuffer.staticBuffer;
  909. ssl->buffers.outputBuffer.bufferSize = STATIC_BUFFER_LEN;
  910. ssl->buffers.outputBuffer.dynamicFlag = 0;
  911. ssl->buffers.domainName.buffer = 0;
  912. #ifndef NO_CERTS
  913. ssl->buffers.serverDH_P.buffer = 0;
  914. ssl->buffers.serverDH_G.buffer = 0;
  915. ssl->buffers.serverDH_Pub.buffer = 0;
  916. ssl->buffers.serverDH_Priv.buffer = 0;
  917. #endif
  918. ssl->buffers.clearOutputBuffer.buffer = 0;
  919. ssl->buffers.clearOutputBuffer.length = 0;
  920. ssl->buffers.prevSent = 0;
  921. ssl->buffers.plainSz = 0;
  922. #ifdef OPENSSL_EXTRA
  923. ssl->peerCert.derCert.buffer = NULL;
  924. ssl->peerCert.altNames = NULL;
  925. ssl->peerCert.altNamesNext = NULL;
  926. #endif
  927. #ifdef HAVE_ECC
  928. ssl->eccTempKeySz = ctx->eccTempKeySz;
  929. ssl->peerEccKeyPresent = 0;
  930. ssl->peerEccDsaKeyPresent = 0;
  931. ssl->eccDsaKeyPresent = 0;
  932. ssl->eccTempKeyPresent = 0;
  933. ssl->peerEccKey = NULL;
  934. ssl->peerEccDsaKey = NULL;
  935. ssl->eccDsaKey = NULL;
  936. ssl->eccTempKey = NULL;
  937. #endif
  938. ssl->timeout = ctx->timeout;
  939. ssl->rfd = -1; /* set to invalid descriptor */
  940. ssl->wfd = -1;
  941. ssl->rflags = 0; /* no user flags yet */
  942. ssl->wflags = 0; /* no user flags yet */
  943. ssl->biord = 0;
  944. ssl->biowr = 0;
  945. ssl->IOCB_ReadCtx = &ssl->rfd; /* prevent invalid pointer access if not */
  946. ssl->IOCB_WriteCtx = &ssl->wfd; /* correctly set */
  947. #ifndef NO_MD5
  948. InitMd5(&ssl->hashMd5);
  949. #endif
  950. InitSha(&ssl->hashSha);
  951. #ifndef NO_SHA256
  952. InitSha256(&ssl->hashSha256);
  953. #endif
  954. #ifdef CYASSL_SHA384
  955. InitSha384(&ssl->hashSha384);
  956. #endif
  957. #ifndef NO_RSA
  958. ssl->peerRsaKey = NULL;
  959. ssl->peerRsaKeyPresent = 0;
  960. #endif
  961. ssl->verifyCallback = ctx->verifyCallback;
  962. ssl->options.side = ctx->method->side;
  963. ssl->options.downgrade = ctx->method->downgrade;
  964. ssl->error = 0;
  965. ssl->options.connReset = 0;
  966. ssl->options.isClosed = 0;
  967. ssl->options.closeNotify = 0;
  968. ssl->options.sentNotify = 0;
  969. ssl->options.usingCompression = 0;
  970. if (ssl->options.side == SERVER_END)
  971. ssl->options.haveDH = ctx->haveDH;
  972. else
  973. ssl->options.haveDH = 0;
  974. ssl->options.haveNTRU = ctx->haveNTRU;
  975. ssl->options.haveECDSAsig = ctx->haveECDSAsig;
  976. ssl->options.haveStaticECC = ctx->haveStaticECC;
  977. ssl->options.havePeerCert = 0;
  978. ssl->options.usingPSK_cipher = 0;
  979. ssl->options.sendAlertState = 0;
  980. #ifndef NO_PSK
  981. havePSK = ctx->havePSK;
  982. ssl->options.havePSK = ctx->havePSK;
  983. ssl->options.client_psk_cb = ctx->client_psk_cb;
  984. ssl->options.server_psk_cb = ctx->server_psk_cb;
  985. #endif /* NO_PSK */
  986. ssl->options.serverState = NULL_STATE;
  987. ssl->options.clientState = NULL_STATE;
  988. ssl->options.connectState = CONNECT_BEGIN;
  989. ssl->options.acceptState = ACCEPT_BEGIN;
  990. ssl->options.handShakeState = NULL_STATE;
  991. ssl->options.processReply = doProcessInit;
  992. #ifdef CYASSL_DTLS
  993. ssl->keys.dtls_sequence_number = 0;
  994. ssl->keys.dtls_peer_sequence_number = 0;
  995. ssl->keys.dtls_expected_peer_sequence_number = 0;
  996. ssl->keys.dtls_handshake_number = 0;
  997. ssl->keys.dtls_expected_peer_handshake_number = 0;
  998. ssl->keys.dtls_epoch = 0;
  999. ssl->keys.dtls_peer_epoch = 0;
  1000. ssl->keys.dtls_expected_peer_epoch = 0;
  1001. ssl->dtls_timeout = DTLS_DEFAULT_TIMEOUT;
  1002. ssl->dtls_pool = NULL;
  1003. #endif
  1004. ssl->keys.encryptionOn = 0; /* initially off */
  1005. ssl->keys.decryptedCur = 0; /* initially off */
  1006. ssl->options.sessionCacheOff = ctx->sessionCacheOff;
  1007. ssl->options.sessionCacheFlushOff = ctx->sessionCacheFlushOff;
  1008. ssl->options.verifyPeer = ctx->verifyPeer;
  1009. ssl->options.verifyNone = ctx->verifyNone;
  1010. ssl->options.failNoCert = ctx->failNoCert;
  1011. ssl->options.sendVerify = ctx->sendVerify;
  1012. ssl->options.resuming = 0;
  1013. ssl->options.haveSessionId = 0;
  1014. #ifndef NO_OLD_TLS
  1015. ssl->hmac = Hmac; /* default to SSLv3 */
  1016. #else
  1017. ssl->hmac = TLS_hmac;
  1018. #endif
  1019. ssl->heap = ctx->heap; /* defaults to self */
  1020. ssl->options.tls = 0;
  1021. ssl->options.tls1_1 = 0;
  1022. if (ssl->version.major == DTLS_MAJOR && ssl->version.minor == DTLS_MINOR)
  1023. ssl->options.dtls = 1;
  1024. else
  1025. ssl->options.dtls = 0;
  1026. ssl->options.partialWrite = ctx->partialWrite;
  1027. ssl->options.quietShutdown = ctx->quietShutdown;
  1028. ssl->options.certOnly = 0;
  1029. ssl->options.groupMessages = ctx->groupMessages;
  1030. ssl->options.usingNonblock = 0;
  1031. ssl->options.saveArrays = 0;
  1032. #ifndef NO_CERTS
  1033. /* ctx still owns certificate, certChain, key, dh, and cm */
  1034. ssl->buffers.certificate = ctx->certificate;
  1035. ssl->buffers.certChain = ctx->certChain;
  1036. ssl->buffers.key = ctx->privateKey;
  1037. if (ssl->options.side == SERVER_END) {
  1038. ssl->buffers.serverDH_P = ctx->serverDH_P;
  1039. ssl->buffers.serverDH_G = ctx->serverDH_G;
  1040. }
  1041. #endif
  1042. ssl->buffers.weOwnCert = 0;
  1043. ssl->buffers.weOwnKey = 0;
  1044. ssl->buffers.weOwnDH = 0;
  1045. #ifdef CYASSL_DTLS
  1046. ssl->buffers.dtlsHandshake.length = 0;
  1047. ssl->buffers.dtlsHandshake.buffer = NULL;
  1048. ssl->buffers.dtlsType = 0;
  1049. ssl->buffers.dtlsCtx.fd = -1;
  1050. ssl->buffers.dtlsCtx.peer.sa = NULL;
  1051. ssl->buffers.dtlsCtx.peer.sz = 0;
  1052. #endif
  1053. #ifdef OPENSSL_EXTRA
  1054. ssl->peerCert.issuer.sz = 0;
  1055. ssl->peerCert.subject.sz = 0;
  1056. #endif
  1057. #ifdef SESSION_CERTS
  1058. ssl->session.chain.count = 0;
  1059. #endif
  1060. ssl->cipher.ssl = ssl;
  1061. #ifdef FORTRESS
  1062. ssl->ex_data[0] = 0;
  1063. ssl->ex_data[1] = 0;
  1064. ssl->ex_data[2] = 0;
  1065. #endif
  1066. #ifdef CYASSL_CALLBACKS
  1067. ssl->hsInfoOn = 0;
  1068. ssl->toInfoOn = 0;
  1069. #endif
  1070. #ifdef HAVE_CAVIUM
  1071. ssl->devId = ctx->devId;
  1072. #endif
  1073. ssl->rng = NULL;
  1074. ssl->arrays = NULL;
  1075. InitCiphers(ssl);
  1076. /* all done with init, now can return errors, call other stuff */
  1077. /* increment CTX reference count */
  1078. if (LockMutex(&ctx->countMutex) != 0) {
  1079. CYASSL_MSG("Couldn't lock CTX count mutex");
  1080. return BAD_MUTEX_ERROR;
  1081. }
  1082. ctx->refCount++;
  1083. UnLockMutex(&ctx->countMutex);
  1084. /* arrays */
  1085. ssl->arrays = (Arrays*)XMALLOC(sizeof(Arrays), ssl->heap,
  1086. DYNAMIC_TYPE_ARRAYS);
  1087. if (ssl->arrays == NULL) {
  1088. CYASSL_MSG("Arrays Memory error");
  1089. return MEMORY_E;
  1090. }
  1091. #ifndef NO_PSK
  1092. ssl->arrays->client_identity[0] = 0;
  1093. if (ctx->server_hint[0]) { /* set in CTX */
  1094. XSTRNCPY(ssl->arrays->server_hint, ctx->server_hint, MAX_PSK_ID_LEN);
  1095. ssl->arrays->server_hint[MAX_PSK_ID_LEN - 1] = '\0';
  1096. }
  1097. else
  1098. ssl->arrays->server_hint[0] = 0;
  1099. #endif /* NO_PSK */
  1100. #ifdef CYASSL_DTLS
  1101. ssl->arrays->cookieSz = 0;
  1102. #endif
  1103. /* RNG */
  1104. ssl->rng = (RNG*)XMALLOC(sizeof(RNG), ssl->heap, DYNAMIC_TYPE_RNG);
  1105. if (ssl->rng == NULL) {
  1106. CYASSL_MSG("RNG Memory error");
  1107. return MEMORY_E;
  1108. }
  1109. if ( (ret = InitRng(ssl->rng)) != 0)
  1110. return ret;
  1111. /* suites */
  1112. ssl->suites = (Suites*)XMALLOC(sizeof(Suites), ssl->heap,
  1113. DYNAMIC_TYPE_SUITES);
  1114. if (ssl->suites == NULL) {
  1115. CYASSL_MSG("Suites Memory error");
  1116. return MEMORY_E;
  1117. }
  1118. *ssl->suites = ctx->suites;
  1119. /* peer key */
  1120. #ifndef NO_RSA
  1121. ssl->peerRsaKey = (RsaKey*)XMALLOC(sizeof(RsaKey), ssl->heap,
  1122. DYNAMIC_TYPE_RSA);
  1123. if (ssl->peerRsaKey == NULL) {
  1124. CYASSL_MSG("PeerRsaKey Memory error");
  1125. return MEMORY_E;
  1126. }
  1127. InitRsaKey(ssl->peerRsaKey, ctx->heap);
  1128. #endif
  1129. #ifndef NO_CERTS
  1130. /* make sure server has cert and key unless using PSK */
  1131. if (ssl->options.side == SERVER_END && !havePSK)
  1132. if (!ssl->buffers.certificate.buffer || !ssl->buffers.key.buffer) {
  1133. CYASSL_MSG("Server missing certificate and/or private key");
  1134. return NO_PRIVATE_KEY;
  1135. }
  1136. #endif
  1137. #ifdef HAVE_ECC
  1138. ssl->peerEccKey = (ecc_key*)XMALLOC(sizeof(ecc_key),
  1139. ctx->heap, DYNAMIC_TYPE_ECC);
  1140. if (ssl->peerEccKey == NULL) {
  1141. CYASSL_MSG("PeerEccKey Memory error");
  1142. return MEMORY_E;
  1143. }
  1144. ssl->peerEccDsaKey = (ecc_key*)XMALLOC(sizeof(ecc_key),
  1145. ctx->heap, DYNAMIC_TYPE_ECC);
  1146. if (ssl->peerEccDsaKey == NULL) {
  1147. CYASSL_MSG("PeerEccDsaKey Memory error");
  1148. return MEMORY_E;
  1149. }
  1150. ssl->eccDsaKey = (ecc_key*)XMALLOC(sizeof(ecc_key),
  1151. ctx->heap, DYNAMIC_TYPE_ECC);
  1152. if (ssl->eccDsaKey == NULL) {
  1153. CYASSL_MSG("EccDsaKey Memory error");
  1154. return MEMORY_E;
  1155. }
  1156. ssl->eccTempKey = (ecc_key*)XMALLOC(sizeof(ecc_key),
  1157. ctx->heap, DYNAMIC_TYPE_ECC);
  1158. if (ssl->eccTempKey == NULL) {
  1159. CYASSL_MSG("EccTempKey Memory error");
  1160. return MEMORY_E;
  1161. }
  1162. ecc_init(ssl->peerEccKey);
  1163. ecc_init(ssl->peerEccDsaKey);
  1164. ecc_init(ssl->eccDsaKey);
  1165. ecc_init(ssl->eccTempKey);
  1166. #endif
  1167. /* make sure server has DH parms, and add PSK if there, add NTRU too */
  1168. if (ssl->options.side == SERVER_END)
  1169. InitSuites(ssl->suites, ssl->version, haveRSA, havePSK,
  1170. ssl->options.haveDH, ssl->options.haveNTRU,
  1171. ssl->options.haveECDSAsig, ssl->options.haveStaticECC,
  1172. ssl->options.side);
  1173. else
  1174. InitSuites(ssl->suites, ssl->version, haveRSA, havePSK, TRUE,
  1175. ssl->options.haveNTRU, ssl->options.haveECDSAsig,
  1176. ssl->options.haveStaticECC, ssl->options.side);
  1177. return 0;
  1178. }
  1179. /* free use of temporary arrays */
  1180. void FreeArrays(CYASSL* ssl, int keep)
  1181. {
  1182. if (ssl->arrays && keep) {
  1183. /* keeps session id for user retrieval */
  1184. XMEMCPY(ssl->session.sessionID, ssl->arrays->sessionID, ID_LEN);
  1185. }
  1186. XFREE(ssl->arrays, ssl->heap, DYNAMIC_TYPE_ARRAYS);
  1187. ssl->arrays = NULL;
  1188. }
  1189. /* In case holding SSL object in array and don't want to free actual ssl */
  1190. void SSL_ResourceFree(CYASSL* ssl)
  1191. {
  1192. FreeCiphers(ssl);
  1193. FreeArrays(ssl, 0);
  1194. XFREE(ssl->rng, ssl->heap, DYNAMIC_TYPE_RNG);
  1195. XFREE(ssl->suites, ssl->heap, DYNAMIC_TYPE_SUITES);
  1196. XFREE(ssl->buffers.domainName.buffer, ssl->heap, DYNAMIC_TYPE_DOMAIN);
  1197. #ifndef NO_CERTS
  1198. XFREE(ssl->buffers.serverDH_Priv.buffer, ssl->heap, DYNAMIC_TYPE_DH);
  1199. XFREE(ssl->buffers.serverDH_Pub.buffer, ssl->heap, DYNAMIC_TYPE_DH);
  1200. /* parameters (p,g) may be owned by ctx */
  1201. if (ssl->buffers.weOwnDH || ssl->options.side == CLIENT_END) {
  1202. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap, DYNAMIC_TYPE_DH);
  1203. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap, DYNAMIC_TYPE_DH);
  1204. }
  1205. /* CYASSL_CTX always owns certChain */
  1206. if (ssl->buffers.weOwnCert)
  1207. XFREE(ssl->buffers.certificate.buffer, ssl->heap, DYNAMIC_TYPE_CERT);
  1208. if (ssl->buffers.weOwnKey)
  1209. XFREE(ssl->buffers.key.buffer, ssl->heap, DYNAMIC_TYPE_KEY);
  1210. #endif
  1211. #ifndef NO_RSA
  1212. if (ssl->peerRsaKey) {
  1213. FreeRsaKey(ssl->peerRsaKey);
  1214. XFREE(ssl->peerRsaKey, ssl->heap, DYNAMIC_TYPE_RSA);
  1215. }
  1216. #endif
  1217. if (ssl->buffers.inputBuffer.dynamicFlag)
  1218. ShrinkInputBuffer(ssl, FORCED_FREE);
  1219. if (ssl->buffers.outputBuffer.dynamicFlag)
  1220. ShrinkOutputBuffer(ssl);
  1221. #ifdef CYASSL_DTLS
  1222. if (ssl->buffers.dtlsHandshake.buffer != NULL)
  1223. XFREE(ssl->buffers.dtlsHandshake.buffer, ssl->heap, DYNAMIC_TYPE_NONE);
  1224. if (ssl->dtls_pool != NULL) {
  1225. DtlsPoolReset(ssl);
  1226. XFREE(ssl->dtls_pool, ssl->heap, DYNAMIC_TYPE_NONE);
  1227. }
  1228. XFREE(ssl->buffers.dtlsCtx.peer.sa, ssl->heap, DYNAMIC_TYPE_SOCKADDR);
  1229. ssl->buffers.dtlsCtx.peer.sa = NULL;
  1230. #endif
  1231. #if defined(OPENSSL_EXTRA) || defined(GOAHEAD_WS)
  1232. XFREE(ssl->peerCert.derCert.buffer, ssl->heap, DYNAMIC_TYPE_CERT);
  1233. if (ssl->peerCert.altNames)
  1234. FreeAltNames(ssl->peerCert.altNames, ssl->heap);
  1235. CyaSSL_BIO_free(ssl->biord);
  1236. if (ssl->biord != ssl->biowr) /* in case same as write */
  1237. CyaSSL_BIO_free(ssl->biowr);
  1238. #endif
  1239. #ifdef HAVE_LIBZ
  1240. FreeStreams(ssl);
  1241. #endif
  1242. #ifdef HAVE_ECC
  1243. if (ssl->peerEccKey) {
  1244. if (ssl->peerEccKeyPresent)
  1245. ecc_free(ssl->peerEccKey);
  1246. XFREE(ssl->peerEccKey, ssl->heap, DYNAMIC_TYPE_ECC);
  1247. }
  1248. if (ssl->peerEccDsaKey) {
  1249. if (ssl->peerEccDsaKeyPresent)
  1250. ecc_free(ssl->peerEccDsaKey);
  1251. XFREE(ssl->peerEccDsaKey, ssl->heap, DYNAMIC_TYPE_ECC);
  1252. }
  1253. if (ssl->eccTempKey) {
  1254. if (ssl->eccTempKeyPresent)
  1255. ecc_free(ssl->eccTempKey);
  1256. XFREE(ssl->eccTempKey, ssl->heap, DYNAMIC_TYPE_ECC);
  1257. }
  1258. if (ssl->eccDsaKey) {
  1259. if (ssl->eccDsaKeyPresent)
  1260. ecc_free(ssl->eccDsaKey);
  1261. XFREE(ssl->eccDsaKey, ssl->heap, DYNAMIC_TYPE_ECC);
  1262. }
  1263. #endif
  1264. }
  1265. /* Free any handshake resources no longer needed */
  1266. void FreeHandshakeResources(CYASSL* ssl)
  1267. {
  1268. /* input buffer */
  1269. if (ssl->buffers.inputBuffer.dynamicFlag)
  1270. ShrinkInputBuffer(ssl, NO_FORCED_FREE);
  1271. /* suites */
  1272. XFREE(ssl->suites, ssl->heap, DYNAMIC_TYPE_SUITES);
  1273. ssl->suites = NULL;
  1274. /* RNG */
  1275. if (ssl->specs.cipher_type == stream || ssl->options.tls1_1 == 0) {
  1276. XFREE(ssl->rng, ssl->heap, DYNAMIC_TYPE_RNG);
  1277. ssl->rng = NULL;
  1278. }
  1279. #ifdef CYASSL_DTLS
  1280. /* DTLS_POOL */
  1281. if (ssl->options.dtls && ssl->dtls_pool != NULL) {
  1282. DtlsPoolReset(ssl);
  1283. XFREE(ssl->dtls_pool, ssl->heap, DYNAMIC_TYPE_DTLS_POOL);
  1284. ssl->dtls_pool = NULL;
  1285. }
  1286. #endif
  1287. /* arrays */
  1288. if (ssl->options.saveArrays)
  1289. FreeArrays(ssl, 1);
  1290. #ifndef NO_RSA
  1291. /* peerRsaKey */
  1292. if (ssl->peerRsaKey) {
  1293. FreeRsaKey(ssl->peerRsaKey);
  1294. XFREE(ssl->peerRsaKey, ssl->heap, DYNAMIC_TYPE_RSA);
  1295. ssl->peerRsaKey = NULL;
  1296. }
  1297. #endif
  1298. #ifdef HAVE_ECC
  1299. if (ssl->peerEccKey)
  1300. {
  1301. if (ssl->peerEccKeyPresent) {
  1302. ecc_free(ssl->peerEccKey);
  1303. ssl->peerEccKeyPresent = 0;
  1304. }
  1305. XFREE(ssl->peerEccKey, ssl->heap, DYNAMIC_TYPE_ECC);
  1306. ssl->peerEccKey = NULL;
  1307. }
  1308. if (ssl->peerEccDsaKey)
  1309. {
  1310. if (ssl->peerEccDsaKeyPresent) {
  1311. ecc_free(ssl->peerEccDsaKey);
  1312. ssl->peerEccDsaKeyPresent = 0;
  1313. }
  1314. XFREE(ssl->peerEccDsaKey, ssl->heap, DYNAMIC_TYPE_ECC);
  1315. ssl->peerEccDsaKey = NULL;
  1316. }
  1317. if (ssl->eccTempKey)
  1318. {
  1319. if (ssl->eccTempKeyPresent) {
  1320. ecc_free(ssl->eccTempKey);
  1321. ssl->eccTempKeyPresent = 0;
  1322. }
  1323. XFREE(ssl->eccTempKey, ssl->heap, DYNAMIC_TYPE_ECC);
  1324. ssl->eccTempKey = NULL;
  1325. }
  1326. if (ssl->eccDsaKey)
  1327. {
  1328. if (ssl->eccDsaKeyPresent) {
  1329. ecc_free(ssl->eccDsaKey);
  1330. ssl->eccDsaKeyPresent = 0;
  1331. }
  1332. XFREE(ssl->eccDsaKey, ssl->heap, DYNAMIC_TYPE_ECC);
  1333. ssl->eccDsaKey = NULL;
  1334. }
  1335. #endif
  1336. }
  1337. void FreeSSL(CYASSL* ssl)
  1338. {
  1339. FreeSSL_Ctx(ssl->ctx); /* will decrement and free underyling CTX if 0 */
  1340. SSL_ResourceFree(ssl);
  1341. XFREE(ssl, ssl->heap, DYNAMIC_TYPE_SSL);
  1342. }
  1343. #ifdef CYASSL_DTLS
  1344. int DtlsPoolInit(CYASSL* ssl)
  1345. {
  1346. if (ssl->dtls_pool == NULL) {
  1347. DtlsPool *pool = (DtlsPool*)XMALLOC(sizeof(DtlsPool),
  1348. ssl->heap, DYNAMIC_TYPE_DTLS_POOL);
  1349. if (pool == NULL) {
  1350. CYASSL_MSG("DTLS Buffer Pool Memory error");
  1351. return MEMORY_E;
  1352. }
  1353. else {
  1354. int i;
  1355. for (i = 0; i < DTLS_POOL_SZ; i++) {
  1356. pool->buf[i].length = 0;
  1357. pool->buf[i].buffer = NULL;
  1358. }
  1359. pool->used = 0;
  1360. ssl->dtls_pool = pool;
  1361. }
  1362. }
  1363. return 0;
  1364. }
  1365. int DtlsPoolSave(CYASSL* ssl, const byte *src, int sz)
  1366. {
  1367. DtlsPool *pool = ssl->dtls_pool;
  1368. if (pool != NULL && pool->used < DTLS_POOL_SZ) {
  1369. buffer *pBuf = &pool->buf[pool->used];
  1370. pBuf->buffer = (byte*)XMALLOC(sz, ssl->heap, DYNAMIC_TYPE_OUT_BUFFER);
  1371. if (pBuf->buffer == NULL) {
  1372. CYASSL_MSG("DTLS Buffer Memory error");
  1373. return MEMORY_ERROR;
  1374. }
  1375. XMEMCPY(pBuf->buffer, src, sz);
  1376. pBuf->length = (word32)sz;
  1377. pool->used++;
  1378. }
  1379. return 0;
  1380. }
  1381. void DtlsPoolReset(CYASSL* ssl)
  1382. {
  1383. DtlsPool *pool = ssl->dtls_pool;
  1384. if (pool != NULL) {
  1385. buffer *pBuf;
  1386. int i, used;
  1387. used = pool->used;
  1388. for (i = 0, pBuf = &pool->buf[0]; i < used; i++, pBuf++) {
  1389. XFREE(pBuf->buffer, ssl->heap, DYNAMIC_TYPE_OUT_BUFFER);
  1390. pBuf->buffer = NULL;
  1391. pBuf->length = 0;
  1392. }
  1393. pool->used = 0;
  1394. }
  1395. ssl->dtls_timeout = DTLS_DEFAULT_TIMEOUT;
  1396. }
  1397. int DtlsPoolTimeout(CYASSL* ssl)
  1398. {
  1399. int result = -1;
  1400. if (ssl->dtls_timeout < 64) {
  1401. ssl->dtls_timeout *= 2;
  1402. result = 0;
  1403. }
  1404. return result;
  1405. }
  1406. int DtlsPoolSend(CYASSL* ssl)
  1407. {
  1408. DtlsPool *pool = ssl->dtls_pool;
  1409. if (pool != NULL && pool->used > 0) {
  1410. int i;
  1411. for (i = 0; i < pool->used; i++) {
  1412. int sendResult;
  1413. buffer* buf = &pool->buf[i];
  1414. DtlsRecordLayerHeader* dtls = (DtlsRecordLayerHeader*)buf->buffer;
  1415. if (dtls->type == change_cipher_spec) {
  1416. ssl->keys.dtls_epoch++;
  1417. ssl->keys.dtls_sequence_number = 0;
  1418. }
  1419. c16toa(ssl->keys.dtls_epoch, dtls->epoch);
  1420. c32to48(ssl->keys.dtls_sequence_number++, dtls->sequence_number);
  1421. XMEMCPY(ssl->buffers.outputBuffer.buffer, buf->buffer, buf->length);
  1422. ssl->buffers.outputBuffer.idx = 0;
  1423. ssl->buffers.outputBuffer.length = buf->length;
  1424. sendResult = SendBuffered(ssl);
  1425. if (sendResult < 0) {
  1426. return sendResult;
  1427. }
  1428. }
  1429. }
  1430. return 0;
  1431. }
  1432. #endif
  1433. #ifndef NO_OLD_TLS
  1434. ProtocolVersion MakeSSLv3(void)
  1435. {
  1436. ProtocolVersion pv;
  1437. pv.major = SSLv3_MAJOR;
  1438. pv.minor = SSLv3_MINOR;
  1439. return pv;
  1440. }
  1441. #endif /* NO_OLD_TLS */
  1442. #ifdef CYASSL_DTLS
  1443. ProtocolVersion MakeDTLSv1(void)
  1444. {
  1445. ProtocolVersion pv;
  1446. pv.major = DTLS_MAJOR;
  1447. pv.minor = DTLS_MINOR;
  1448. return pv;
  1449. }
  1450. #endif /* CYASSL_DTLS */
  1451. #ifdef USE_WINDOWS_API
  1452. timer_d Timer(void)
  1453. {
  1454. static int init = 0;
  1455. static LARGE_INTEGER freq;
  1456. LARGE_INTEGER count;
  1457. if (!init) {
  1458. QueryPerformanceFrequency(&freq);
  1459. init = 1;
  1460. }
  1461. QueryPerformanceCounter(&count);
  1462. return (double)count.QuadPart / freq.QuadPart;
  1463. }
  1464. word32 LowResTimer(void)
  1465. {
  1466. return (word32)Timer();
  1467. }
  1468. #elif defined(THREADX)
  1469. #include "rtptime.h"
  1470. word32 LowResTimer(void)
  1471. {
  1472. return (word32)rtp_get_system_sec();
  1473. }
  1474. #elif defined(MICRIUM)
  1475. word32 LowResTimer(void)
  1476. {
  1477. NET_SECURE_OS_TICK clk;
  1478. #if (NET_SECURE_MGR_CFG_EN == DEF_ENABLED)
  1479. clk = NetSecure_OS_TimeGet();
  1480. #endif
  1481. return (word32)clk;
  1482. }
  1483. #elif defined(USER_TICKS)
  1484. word32 LowResTimer(void)
  1485. {
  1486. /*
  1487. write your own clock tick function if don't want time(0)
  1488. needs second accuracy but doesn't have to correlated to EPOCH
  1489. */
  1490. }
  1491. #else /* !USE_WINDOWS_API && !THREADX && !MICRIUM && !USER_TICKS */
  1492. #include <time.h>
  1493. word32 LowResTimer(void)
  1494. {
  1495. return (word32)time(0);
  1496. }
  1497. #endif /* USE_WINDOWS_API */
  1498. /* add output to md5 and sha handshake hashes, exclude record header */
  1499. static void HashOutput(CYASSL* ssl, const byte* output, int sz, int ivSz)
  1500. {
  1501. const byte* adj = output + RECORD_HEADER_SZ + ivSz;
  1502. sz -= RECORD_HEADER_SZ;
  1503. #ifdef CYASSL_DTLS
  1504. if (ssl->options.dtls) {
  1505. adj += DTLS_RECORD_EXTRA;
  1506. sz -= DTLS_RECORD_EXTRA;
  1507. }
  1508. #endif
  1509. ShaUpdate(&ssl->hashSha, adj, sz);
  1510. #ifndef NO_MD5
  1511. Md5Update(&ssl->hashMd5, adj, sz);
  1512. #endif
  1513. if (IsAtLeastTLSv1_2(ssl)) {
  1514. #ifndef NO_SHA256
  1515. Sha256Update(&ssl->hashSha256, adj, sz);
  1516. #endif
  1517. #ifdef CYASSL_SHA384
  1518. Sha384Update(&ssl->hashSha384, adj, sz);
  1519. #endif
  1520. }
  1521. }
  1522. /* add input to md5 and sha handshake hashes, include handshake header */
  1523. static void HashInput(CYASSL* ssl, const byte* input, int sz)
  1524. {
  1525. const byte* adj = input - HANDSHAKE_HEADER_SZ;
  1526. sz += HANDSHAKE_HEADER_SZ;
  1527. #ifdef CYASSL_DTLS
  1528. if (ssl->options.dtls) {
  1529. adj -= DTLS_HANDSHAKE_EXTRA;
  1530. sz += DTLS_HANDSHAKE_EXTRA;
  1531. }
  1532. #endif
  1533. ShaUpdate(&ssl->hashSha, adj, sz);
  1534. #ifndef NO_MD5
  1535. Md5Update(&ssl->hashMd5, adj, sz);
  1536. #endif
  1537. if (IsAtLeastTLSv1_2(ssl)) {
  1538. #ifndef NO_SHA256
  1539. Sha256Update(&ssl->hashSha256, adj, sz);
  1540. #endif
  1541. #ifdef CYASSL_SHA384
  1542. Sha384Update(&ssl->hashSha384, adj, sz);
  1543. #endif
  1544. }
  1545. }
  1546. /* add record layer header for message */
  1547. static void AddRecordHeader(byte* output, word32 length, byte type, CYASSL* ssl)
  1548. {
  1549. RecordLayerHeader* rl;
  1550. /* record layer header */
  1551. rl = (RecordLayerHeader*)output;
  1552. rl->type = type;
  1553. rl->pvMajor = ssl->version.major; /* type and version same in each */
  1554. rl->pvMinor = ssl->version.minor;
  1555. if (!ssl->options.dtls)
  1556. c16toa((word16)length, rl->length);
  1557. else {
  1558. #ifdef CYASSL_DTLS
  1559. DtlsRecordLayerHeader* dtls;
  1560. /* dtls record layer header extensions */
  1561. dtls = (DtlsRecordLayerHeader*)output;
  1562. c16toa(ssl->keys.dtls_epoch, dtls->epoch);
  1563. c32to48(ssl->keys.dtls_sequence_number++, dtls->sequence_number);
  1564. c16toa((word16)length, dtls->length);
  1565. #endif
  1566. }
  1567. }
  1568. /* add handshake header for message */
  1569. static void AddHandShakeHeader(byte* output, word32 length, byte type,
  1570. CYASSL* ssl)
  1571. {
  1572. HandShakeHeader* hs;
  1573. (void)ssl;
  1574. /* handshake header */
  1575. hs = (HandShakeHeader*)output;
  1576. hs->type = type;
  1577. c32to24(length, hs->length); /* type and length same for each */
  1578. #ifdef CYASSL_DTLS
  1579. if (ssl->options.dtls) {
  1580. DtlsHandShakeHeader* dtls;
  1581. /* dtls handshake header extensions */
  1582. dtls = (DtlsHandShakeHeader*)output;
  1583. c16toa(ssl->keys.dtls_handshake_number++, dtls->message_seq);
  1584. c32to24(0, dtls->fragment_offset);
  1585. c32to24(length, dtls->fragment_length);
  1586. }
  1587. #endif
  1588. }
  1589. /* add both headers for handshake message */
  1590. static void AddHeaders(byte* output, word32 length, byte type, CYASSL* ssl)
  1591. {
  1592. if (!ssl->options.dtls) {
  1593. AddRecordHeader(output, length + HANDSHAKE_HEADER_SZ, handshake, ssl);
  1594. AddHandShakeHeader(output + RECORD_HEADER_SZ, length, type, ssl);
  1595. }
  1596. #ifdef CYASSL_DTLS
  1597. else {
  1598. AddRecordHeader(output, length+DTLS_HANDSHAKE_HEADER_SZ, handshake,ssl);
  1599. AddHandShakeHeader(output + DTLS_RECORD_HEADER_SZ, length, type, ssl);
  1600. }
  1601. #endif
  1602. }
  1603. /* return bytes received, -1 on error */
  1604. static int Receive(CYASSL* ssl, byte* buf, word32 sz)
  1605. {
  1606. int recvd;
  1607. retry:
  1608. recvd = ssl->ctx->CBIORecv(ssl, (char *)buf, (int)sz, ssl->IOCB_ReadCtx);
  1609. if (recvd < 0)
  1610. switch (recvd) {
  1611. case IO_ERR_GENERAL: /* general/unknown error */
  1612. return -1;
  1613. case IO_ERR_WANT_READ: /* want read, would block */
  1614. return WANT_READ;
  1615. case IO_ERR_CONN_RST: /* connection reset */
  1616. #ifdef USE_WINDOWS_API
  1617. if (ssl->options.dtls) {
  1618. goto retry;
  1619. }
  1620. #endif
  1621. ssl->options.connReset = 1;
  1622. return -1;
  1623. case IO_ERR_ISR: /* interrupt */
  1624. /* see if we got our timeout */
  1625. #ifdef CYASSL_CALLBACKS
  1626. if (ssl->toInfoOn) {
  1627. struct itimerval timeout;
  1628. getitimer(ITIMER_REAL, &timeout);
  1629. if (timeout.it_value.tv_sec == 0 &&
  1630. timeout.it_value.tv_usec == 0) {
  1631. XSTRNCPY(ssl->timeoutInfo.timeoutName,
  1632. "recv() timeout", MAX_TIMEOUT_NAME_SZ);
  1633. CYASSL_MSG("Got our timeout");
  1634. return WANT_READ;
  1635. }
  1636. }
  1637. #endif
  1638. goto retry;
  1639. case IO_ERR_CONN_CLOSE: /* peer closed connection */
  1640. ssl->options.isClosed = 1;
  1641. return -1;
  1642. #ifdef CYASSL_DTLS
  1643. case IO_ERR_TIMEOUT:
  1644. if (DtlsPoolTimeout(ssl) == 0 && DtlsPoolSend(ssl) == 0)
  1645. goto retry;
  1646. else
  1647. return -1;
  1648. #endif
  1649. default:
  1650. return recvd;
  1651. }
  1652. return recvd;
  1653. }
  1654. /* Switch dynamic output buffer back to static, buffer is assumed clear */
  1655. void ShrinkOutputBuffer(CYASSL* ssl)
  1656. {
  1657. CYASSL_MSG("Shrinking output buffer\n");
  1658. XFREE(ssl->buffers.outputBuffer.buffer, ssl->heap, DYNAMIC_TYPE_OUT_BUFFER);
  1659. ssl->buffers.outputBuffer.buffer = ssl->buffers.outputBuffer.staticBuffer;
  1660. ssl->buffers.outputBuffer.bufferSize = STATIC_BUFFER_LEN;
  1661. ssl->buffers.outputBuffer.dynamicFlag = 0;
  1662. }
  1663. /* Switch dynamic input buffer back to static, keep any remaining input */
  1664. /* forced free means cleaning up */
  1665. void ShrinkInputBuffer(CYASSL* ssl, int forcedFree)
  1666. {
  1667. int usedLength = ssl->buffers.inputBuffer.length -
  1668. ssl->buffers.inputBuffer.idx;
  1669. if (!forcedFree && usedLength > STATIC_BUFFER_LEN)
  1670. return;
  1671. CYASSL_MSG("Shrinking input buffer\n");
  1672. if (!forcedFree && usedLength)
  1673. XMEMCPY(ssl->buffers.inputBuffer.staticBuffer,
  1674. ssl->buffers.inputBuffer.buffer + ssl->buffers.inputBuffer.idx,
  1675. usedLength);
  1676. XFREE(ssl->buffers.inputBuffer.buffer, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  1677. ssl->buffers.inputBuffer.buffer = ssl->buffers.inputBuffer.staticBuffer;
  1678. ssl->buffers.inputBuffer.bufferSize = STATIC_BUFFER_LEN;
  1679. ssl->buffers.inputBuffer.dynamicFlag = 0;
  1680. ssl->buffers.inputBuffer.idx = 0;
  1681. ssl->buffers.inputBuffer.length = usedLength;
  1682. }
  1683. int SendBuffered(CYASSL* ssl)
  1684. {
  1685. while (ssl->buffers.outputBuffer.length > 0) {
  1686. int sent = ssl->ctx->CBIOSend(ssl,
  1687. (char*)ssl->buffers.outputBuffer.buffer +
  1688. ssl->buffers.outputBuffer.idx,
  1689. (int)ssl->buffers.outputBuffer.length,
  1690. ssl->IOCB_WriteCtx);
  1691. if (sent < 0) {
  1692. switch (sent) {
  1693. case IO_ERR_WANT_WRITE: /* would block */
  1694. return WANT_WRITE;
  1695. case IO_ERR_CONN_RST: /* connection reset */
  1696. ssl->options.connReset = 1;
  1697. break;
  1698. case IO_ERR_ISR: /* interrupt */
  1699. /* see if we got our timeout */
  1700. #ifdef CYASSL_CALLBACKS
  1701. if (ssl->toInfoOn) {
  1702. struct itimerval timeout;
  1703. getitimer(ITIMER_REAL, &timeout);
  1704. if (timeout.it_value.tv_sec == 0 &&
  1705. timeout.it_value.tv_usec == 0) {
  1706. XSTRNCPY(ssl->timeoutInfo.timeoutName,
  1707. "send() timeout", MAX_TIMEOUT_NAME_SZ);
  1708. CYASSL_MSG("Got our timeout");
  1709. return WANT_WRITE;
  1710. }
  1711. }
  1712. #endif
  1713. continue;
  1714. case IO_ERR_CONN_CLOSE: /* epipe / conn closed, same as reset */
  1715. ssl->options.connReset = 1;
  1716. break;
  1717. default:
  1718. return SOCKET_ERROR_E;
  1719. }
  1720. return SOCKET_ERROR_E;
  1721. }
  1722. ssl->buffers.outputBuffer.idx += sent;
  1723. ssl->buffers.outputBuffer.length -= sent;
  1724. }
  1725. ssl->buffers.outputBuffer.idx = 0;
  1726. if (ssl->buffers.outputBuffer.dynamicFlag)
  1727. ShrinkOutputBuffer(ssl);
  1728. return 0;
  1729. }
  1730. /* Grow the output buffer */
  1731. static INLINE int GrowOutputBuffer(CYASSL* ssl, int size)
  1732. {
  1733. byte* tmp = (byte*) XMALLOC(size + ssl->buffers.outputBuffer.length,
  1734. ssl->heap, DYNAMIC_TYPE_OUT_BUFFER);
  1735. CYASSL_MSG("growing output buffer\n");
  1736. if (!tmp) return MEMORY_E;
  1737. if (ssl->buffers.outputBuffer.length)
  1738. XMEMCPY(tmp, ssl->buffers.outputBuffer.buffer,
  1739. ssl->buffers.outputBuffer.length);
  1740. if (ssl->buffers.outputBuffer.dynamicFlag)
  1741. XFREE(ssl->buffers.outputBuffer.buffer, ssl->heap,
  1742. DYNAMIC_TYPE_OUT_BUFFER);
  1743. ssl->buffers.outputBuffer.dynamicFlag = 1;
  1744. ssl->buffers.outputBuffer.buffer = tmp;
  1745. ssl->buffers.outputBuffer.bufferSize = size +
  1746. ssl->buffers.outputBuffer.length;
  1747. return 0;
  1748. }
  1749. /* Grow the input buffer, should only be to read cert or big app data */
  1750. int GrowInputBuffer(CYASSL* ssl, int size, int usedLength)
  1751. {
  1752. byte* tmp = (byte*) XMALLOC(size + usedLength, ssl->heap,
  1753. DYNAMIC_TYPE_IN_BUFFER);
  1754. CYASSL_MSG("growing input buffer\n");
  1755. if (!tmp) return MEMORY_E;
  1756. if (usedLength)
  1757. XMEMCPY(tmp, ssl->buffers.inputBuffer.buffer +
  1758. ssl->buffers.inputBuffer.idx, usedLength);
  1759. if (ssl->buffers.inputBuffer.dynamicFlag)
  1760. XFREE(ssl->buffers.inputBuffer.buffer,ssl->heap,DYNAMIC_TYPE_IN_BUFFER);
  1761. ssl->buffers.inputBuffer.dynamicFlag = 1;
  1762. ssl->buffers.inputBuffer.buffer = tmp;
  1763. ssl->buffers.inputBuffer.bufferSize = size + usedLength;
  1764. ssl->buffers.inputBuffer.idx = 0;
  1765. ssl->buffers.inputBuffer.length = usedLength;
  1766. return 0;
  1767. }
  1768. /* check avalaible size into output buffer, make room if needed */
  1769. int CheckAvalaibleSize(CYASSL *ssl, int size)
  1770. {
  1771. if (ssl->buffers.outputBuffer.bufferSize - ssl->buffers.outputBuffer.length
  1772. < (word32)size) {
  1773. if (GrowOutputBuffer(ssl, size) < 0)
  1774. return MEMORY_E;
  1775. }
  1776. return 0;
  1777. }
  1778. /* do all verify and sanity checks on record header */
  1779. static int GetRecordHeader(CYASSL* ssl, const byte* input, word32* inOutIdx,
  1780. RecordLayerHeader* rh, word16 *size)
  1781. {
  1782. if (!ssl->options.dtls) {
  1783. XMEMCPY(rh, input + *inOutIdx, RECORD_HEADER_SZ);
  1784. *inOutIdx += RECORD_HEADER_SZ;
  1785. ato16(rh->length, size);
  1786. }
  1787. else {
  1788. #ifdef CYASSL_DTLS
  1789. /* type and version in same sport */
  1790. XMEMCPY(rh, input + *inOutIdx, ENUM_LEN + VERSION_SZ);
  1791. *inOutIdx += ENUM_LEN + VERSION_SZ;
  1792. ato16(input + *inOutIdx, &ssl->keys.dtls_peer_epoch);
  1793. *inOutIdx += 4; /* advance past epoch, skip first 2 seq bytes for now */
  1794. ato32(input + *inOutIdx, &ssl->keys.dtls_peer_sequence_number);
  1795. *inOutIdx += 4; /* advance past rest of seq */
  1796. ato16(input + *inOutIdx, size);
  1797. *inOutIdx += LENGTH_SZ;
  1798. #endif
  1799. }
  1800. /* catch version mismatch */
  1801. if (rh->pvMajor != ssl->version.major || rh->pvMinor != ssl->version.minor){
  1802. if (ssl->options.side == SERVER_END &&
  1803. ssl->options.acceptState == ACCEPT_BEGIN)
  1804. CYASSL_MSG("Client attempting to connect with different version");
  1805. else if (ssl->options.side == CLIENT_END && ssl->options.downgrade &&
  1806. ssl->options.connectState < FIRST_REPLY_DONE)
  1807. CYASSL_MSG("Server attempting to accept with different version");
  1808. else {
  1809. CYASSL_MSG("SSL version error");
  1810. return VERSION_ERROR; /* only use requested version */
  1811. }
  1812. }
  1813. #ifdef CYASSL_DTLS
  1814. /* If DTLS, check the sequence number against expected. If out of
  1815. * order, drop the record. Allows newer records in and resets the
  1816. * expected to the next record. */
  1817. if (ssl->options.dtls) {
  1818. if ((ssl->keys.dtls_expected_peer_epoch ==
  1819. ssl->keys.dtls_peer_epoch) &&
  1820. (ssl->keys.dtls_peer_sequence_number >=
  1821. ssl->keys.dtls_expected_peer_sequence_number)) {
  1822. ssl->keys.dtls_expected_peer_sequence_number =
  1823. ssl->keys.dtls_peer_sequence_number + 1;
  1824. }
  1825. else {
  1826. return SEQUENCE_ERROR;
  1827. }
  1828. }
  1829. #endif
  1830. /* record layer length check */
  1831. if (*size > (MAX_RECORD_SIZE + MAX_COMP_EXTRA + MAX_MSG_EXTRA))
  1832. return LENGTH_ERROR;
  1833. /* verify record type here as well */
  1834. switch ((enum ContentType)rh->type) {
  1835. case handshake:
  1836. case change_cipher_spec:
  1837. case application_data:
  1838. case alert:
  1839. break;
  1840. case no_type:
  1841. default:
  1842. CYASSL_MSG("Unknown Record Type");
  1843. return UNKNOWN_RECORD_TYPE;
  1844. }
  1845. /* haven't decrypted this record yet */
  1846. ssl->keys.decryptedCur = 0;
  1847. return 0;
  1848. }
  1849. static int GetHandShakeHeader(CYASSL* ssl, const byte* input, word32* inOutIdx,
  1850. byte *type, word32 *size)
  1851. {
  1852. const byte *ptr = input + *inOutIdx;
  1853. (void)ssl;
  1854. *inOutIdx += HANDSHAKE_HEADER_SZ;
  1855. *type = ptr[0];
  1856. c24to32(&ptr[1], size);
  1857. return 0;
  1858. }
  1859. #ifdef CYASSL_DTLS
  1860. static int GetDtlsHandShakeHeader(CYASSL* ssl, const byte* input,
  1861. word32* inOutIdx, byte *type, word32 *size,
  1862. word32 *fragOffset, word32 *fragSz)
  1863. {
  1864. word32 idx = *inOutIdx;
  1865. *inOutIdx += HANDSHAKE_HEADER_SZ + DTLS_HANDSHAKE_EXTRA;
  1866. *type = input[idx++];
  1867. c24to32(input + idx, size);
  1868. idx += BYTE3_LEN;
  1869. ato16(input + idx, &ssl->keys.dtls_peer_handshake_number);
  1870. idx += DTLS_HANDSHAKE_SEQ_SZ;
  1871. c24to32(input + idx, fragOffset);
  1872. idx += DTLS_HANDSHAKE_FRAG_SZ;
  1873. c24to32(input + idx, fragSz);
  1874. idx += DTLS_HANDSHAKE_FRAG_SZ;
  1875. return 0;
  1876. }
  1877. #endif
  1878. #ifndef NO_MD5
  1879. /* fill with MD5 pad size since biggest required */
  1880. static const byte PAD1[PAD_MD5] =
  1881. { 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
  1882. 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
  1883. 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
  1884. 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
  1885. 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
  1886. 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36
  1887. };
  1888. static const byte PAD2[PAD_MD5] =
  1889. { 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
  1890. 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
  1891. 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
  1892. 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
  1893. 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
  1894. 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c
  1895. };
  1896. /* calculate MD5 hash for finished */
  1897. static void BuildMD5(CYASSL* ssl, Hashes* hashes, const byte* sender)
  1898. {
  1899. byte md5_result[MD5_DIGEST_SIZE];
  1900. /* make md5 inner */
  1901. Md5Update(&ssl->hashMd5, sender, SIZEOF_SENDER);
  1902. Md5Update(&ssl->hashMd5, ssl->arrays->masterSecret, SECRET_LEN);
  1903. Md5Update(&ssl->hashMd5, PAD1, PAD_MD5);
  1904. Md5Final(&ssl->hashMd5, md5_result);
  1905. /* make md5 outer */
  1906. Md5Update(&ssl->hashMd5, ssl->arrays->masterSecret, SECRET_LEN);
  1907. Md5Update(&ssl->hashMd5, PAD2, PAD_MD5);
  1908. Md5Update(&ssl->hashMd5, md5_result, MD5_DIGEST_SIZE);
  1909. Md5Final(&ssl->hashMd5, hashes->md5);
  1910. }
  1911. /* calculate SHA hash for finished */
  1912. static void BuildSHA(CYASSL* ssl, Hashes* hashes, const byte* sender)
  1913. {
  1914. byte sha_result[SHA_DIGEST_SIZE];
  1915. /* make sha inner */
  1916. ShaUpdate(&ssl->hashSha, sender, SIZEOF_SENDER);
  1917. ShaUpdate(&ssl->hashSha, ssl->arrays->masterSecret, SECRET_LEN);
  1918. ShaUpdate(&ssl->hashSha, PAD1, PAD_SHA);
  1919. ShaFinal(&ssl->hashSha, sha_result);
  1920. /* make sha outer */
  1921. ShaUpdate(&ssl->hashSha, ssl->arrays->masterSecret, SECRET_LEN);
  1922. ShaUpdate(&ssl->hashSha, PAD2, PAD_SHA);
  1923. ShaUpdate(&ssl->hashSha, sha_result, SHA_DIGEST_SIZE);
  1924. ShaFinal(&ssl->hashSha, hashes->sha);
  1925. }
  1926. #endif
  1927. static void BuildFinished(CYASSL* ssl, Hashes* hashes, const byte* sender)
  1928. {
  1929. /* store current states, building requires get_digest which resets state */
  1930. #ifndef NO_MD5
  1931. Md5 md5 = ssl->hashMd5;
  1932. #endif
  1933. Sha sha = ssl->hashSha;
  1934. #ifndef NO_SHA256
  1935. Sha256 sha256;
  1936. #endif
  1937. #ifdef CYASSL_SHA384
  1938. Sha384 sha384;
  1939. #endif
  1940. #ifndef NO_SHA256
  1941. InitSha256(&sha256);
  1942. if (IsAtLeastTLSv1_2(ssl))
  1943. sha256 = ssl->hashSha256;
  1944. #endif
  1945. #ifdef CYASSL_SHA384
  1946. InitSha384(&sha384);
  1947. if (IsAtLeastTLSv1_2(ssl))
  1948. sha384 = ssl->hashSha384;
  1949. #endif
  1950. if (ssl->options.tls)
  1951. BuildTlsFinished(ssl, hashes, sender);
  1952. #ifndef NO_MD5
  1953. else {
  1954. BuildMD5(ssl, hashes, sender);
  1955. BuildSHA(ssl, hashes, sender);
  1956. }
  1957. #endif
  1958. /* restore */
  1959. #ifndef NO_MD5
  1960. ssl->hashMd5 = md5;
  1961. #endif
  1962. ssl->hashSha = sha;
  1963. if (IsAtLeastTLSv1_2(ssl)) {
  1964. #ifndef NO_SHA256
  1965. ssl->hashSha256 = sha256;
  1966. #endif
  1967. #ifdef CYASSL_SHA384
  1968. ssl->hashSha384 = sha384;
  1969. #endif
  1970. }
  1971. }
  1972. #ifndef NO_CERTS
  1973. static int DoCertificate(CYASSL* ssl, byte* input, word32* inOutIdx)
  1974. {
  1975. word32 listSz, i = *inOutIdx;
  1976. int ret = 0;
  1977. int anyError = 0;
  1978. int totalCerts = 0; /* number of certs in certs buffer */
  1979. int count;
  1980. char domain[ASN_NAME_MAX];
  1981. buffer certs[MAX_CHAIN_DEPTH];
  1982. #ifdef CYASSL_CALLBACKS
  1983. if (ssl->hsInfoOn) AddPacketName("Certificate", &ssl->handShakeInfo);
  1984. if (ssl->toInfoOn) AddLateName("Certificate", &ssl->timeoutInfo);
  1985. #endif
  1986. c24to32(&input[i], &listSz);
  1987. i += CERT_HEADER_SZ;
  1988. CYASSL_MSG("Loading peer's cert chain");
  1989. /* first put cert chain into buffer so can verify top down
  1990. we're sent bottom up */
  1991. while (listSz) {
  1992. /* cert size */
  1993. word32 certSz;
  1994. if (totalCerts >= MAX_CHAIN_DEPTH)
  1995. return MAX_CHAIN_ERROR;
  1996. c24to32(&input[i], &certSz);
  1997. i += CERT_HEADER_SZ;
  1998. if (listSz > MAX_RECORD_SIZE || certSz > MAX_RECORD_SIZE)
  1999. return BUFFER_E;
  2000. certs[totalCerts].length = certSz;
  2001. certs[totalCerts].buffer = input + i;
  2002. #ifdef SESSION_CERTS
  2003. if (ssl->session.chain.count < MAX_CHAIN_DEPTH &&
  2004. certSz < MAX_X509_SIZE) {
  2005. ssl->session.chain.certs[ssl->session.chain.count].length = certSz;
  2006. XMEMCPY(ssl->session.chain.certs[ssl->session.chain.count].buffer,
  2007. input + i, certSz);
  2008. ssl->session.chain.count++;
  2009. } else {
  2010. CYASSL_MSG("Couldn't store chain cert for session");
  2011. }
  2012. #endif
  2013. i += certSz;
  2014. listSz -= certSz + CERT_HEADER_SZ;
  2015. totalCerts++;
  2016. CYASSL_MSG(" Put another cert into chain");
  2017. }
  2018. count = totalCerts;
  2019. /* verify up to peer's first */
  2020. while (count > 1) {
  2021. buffer myCert = certs[count - 1];
  2022. DecodedCert dCert;
  2023. InitDecodedCert(&dCert, myCert.buffer, myCert.length, ssl->heap);
  2024. ret = ParseCertRelative(&dCert, CERT_TYPE, !ssl->options.verifyNone,
  2025. ssl->ctx->cm);
  2026. if (ret == 0 && dCert.isCA == 0) {
  2027. CYASSL_MSG("Chain cert is not a CA, not adding as one");
  2028. }
  2029. else if (ret == 0 && ssl->options.verifyNone) {
  2030. CYASSL_MSG("Chain cert not verified by option, not adding as CA");
  2031. }
  2032. else if (ret == 0 && !AlreadySigner(ssl->ctx->cm, dCert.subjectHash)) {
  2033. buffer add;
  2034. add.length = myCert.length;
  2035. add.buffer = (byte*)XMALLOC(myCert.length, ssl->heap,
  2036. DYNAMIC_TYPE_CA);
  2037. CYASSL_MSG("Adding CA from chain");
  2038. if (add.buffer == NULL)
  2039. return MEMORY_E;
  2040. XMEMCPY(add.buffer, myCert.buffer, myCert.length);
  2041. ret = AddCA(ssl->ctx->cm, add, CYASSL_CHAIN_CA,
  2042. ssl->ctx->verifyPeer);
  2043. if (ret == 1) ret = 0; /* SSL_SUCCESS for external */
  2044. }
  2045. else if (ret != 0) {
  2046. CYASSL_MSG("Failed to verify CA from chain");
  2047. }
  2048. else {
  2049. CYASSL_MSG("Verified CA from chain and already had it");
  2050. }
  2051. #ifdef HAVE_CRL
  2052. if (ret == 0 && ssl->ctx->cm->crlEnabled && ssl->ctx->cm->crlCheckAll) {
  2053. CYASSL_MSG("Doing Non Leaf CRL check");
  2054. ret = CheckCertCRL(ssl->ctx->cm->crl, &dCert);
  2055. if (ret != 0) {
  2056. CYASSL_MSG("\tCRL check not ok");
  2057. }
  2058. }
  2059. #endif /* HAVE_CRL */
  2060. if (ret != 0 && anyError == 0)
  2061. anyError = ret; /* save error from last time */
  2062. FreeDecodedCert(&dCert);
  2063. count--;
  2064. }
  2065. /* peer's, may not have one if blank client cert sent by TLSv1.2 */
  2066. if (count) {
  2067. buffer myCert = certs[0];
  2068. DecodedCert dCert;
  2069. int fatal = 0;
  2070. CYASSL_MSG("Veriying Peer's cert");
  2071. InitDecodedCert(&dCert, myCert.buffer, myCert.length, ssl->heap);
  2072. ret = ParseCertRelative(&dCert, CERT_TYPE, !ssl->options.verifyNone,
  2073. ssl->ctx->cm);
  2074. if (ret == 0) {
  2075. CYASSL_MSG("Verified Peer's cert");
  2076. fatal = 0;
  2077. }
  2078. else if (ret == ASN_PARSE_E) {
  2079. CYASSL_MSG("Got Peer cert ASN PARSE ERROR, fatal");
  2080. fatal = 1;
  2081. }
  2082. else {
  2083. CYASSL_MSG("Failed to verify Peer's cert");
  2084. if (ssl->verifyCallback) {
  2085. CYASSL_MSG("\tCallback override available, will continue");
  2086. fatal = 0;
  2087. }
  2088. else {
  2089. CYASSL_MSG("\tNo callback override available, fatal");
  2090. fatal = 1;
  2091. }
  2092. }
  2093. #ifdef HAVE_OCSP
  2094. if (fatal == 0) {
  2095. ret = CyaSSL_OCSP_Lookup_Cert(&ssl->ctx->ocsp, &dCert);
  2096. if (ret != 0) {
  2097. CYASSL_MSG("\tOCSP Lookup not ok");
  2098. fatal = 0;
  2099. }
  2100. }
  2101. #endif
  2102. #ifdef HAVE_CRL
  2103. if (fatal == 0 && ssl->ctx->cm->crlEnabled) {
  2104. int doCrlLookup = 1;
  2105. #ifdef HAVE_OCSP
  2106. if (ssl->ctx->ocsp.enabled) {
  2107. doCrlLookup = (ret == OCSP_CERT_UNKNOWN);
  2108. }
  2109. #endif /* HAVE_OCSP */
  2110. if (doCrlLookup) {
  2111. CYASSL_MSG("Doing Leaf CRL check");
  2112. ret = CheckCertCRL(ssl->ctx->cm->crl, &dCert);
  2113. if (ret != 0) {
  2114. CYASSL_MSG("\tCRL check not ok");
  2115. fatal = 0;
  2116. }
  2117. }
  2118. }
  2119. #endif /* HAVE_CRL */
  2120. #ifdef OPENSSL_EXTRA
  2121. /* set X509 format for peer cert even if fatal */
  2122. XSTRNCPY(ssl->peerCert.issuer.name, dCert.issuer, ASN_NAME_MAX);
  2123. ssl->peerCert.issuer.name[ASN_NAME_MAX - 1] = '\0';
  2124. ssl->peerCert.issuer.sz = (int)XSTRLEN(ssl->peerCert.issuer.name) + 1;
  2125. XSTRNCPY(ssl->peerCert.subject.name, dCert.subject, ASN_NAME_MAX);
  2126. ssl->peerCert.subject.name[ASN_NAME_MAX - 1] = '\0';
  2127. ssl->peerCert.subject.sz = (int)XSTRLEN(ssl->peerCert.subject.name) + 1;
  2128. XMEMCPY(ssl->peerCert.serial, dCert.serial, EXTERNAL_SERIAL_SIZE);
  2129. ssl->peerCert.serialSz = dCert.serialSz;
  2130. if (dCert.subjectCNLen < ASN_NAME_MAX) {
  2131. XMEMCPY(ssl->peerCert.subjectCN,dCert.subjectCN,dCert.subjectCNLen);
  2132. ssl->peerCert.subjectCN[dCert.subjectCNLen] = '\0';
  2133. }
  2134. else
  2135. ssl->peerCert.subjectCN[0] = '\0';
  2136. /* store cert for potential retrieval */
  2137. ssl->peerCert.derCert.buffer = (byte*)XMALLOC(myCert.length, ssl->heap,
  2138. DYNAMIC_TYPE_CERT);
  2139. if (ssl->peerCert.derCert.buffer == NULL) {
  2140. ret = MEMORY_E;
  2141. fatal = 1;
  2142. }
  2143. else {
  2144. XMEMCPY(ssl->peerCert.derCert.buffer, myCert.buffer, myCert.length);
  2145. ssl->peerCert.derCert.length = myCert.length;
  2146. }
  2147. ssl->peerCert.altNames = dCert.altNames;
  2148. dCert.altNames = NULL; /* takes ownership */
  2149. ssl->peerCert.altNamesNext = ssl->peerCert.altNames; /* index hint */
  2150. #endif
  2151. if (fatal) {
  2152. FreeDecodedCert(&dCert);
  2153. ssl->error = ret;
  2154. return ret;
  2155. }
  2156. ssl->options.havePeerCert = 1;
  2157. /* store for callback use */
  2158. if (dCert.subjectCNLen < ASN_NAME_MAX) {
  2159. XMEMCPY(domain, dCert.subjectCN, dCert.subjectCNLen);
  2160. domain[dCert.subjectCNLen] = '\0';
  2161. }
  2162. else
  2163. domain[0] = '\0';
  2164. if (!ssl->options.verifyNone && ssl->buffers.domainName.buffer)
  2165. if (XSTRNCMP((char*)ssl->buffers.domainName.buffer,
  2166. dCert.subjectCN,
  2167. ssl->buffers.domainName.length - 1) != 0) {
  2168. ret = DOMAIN_NAME_MISMATCH; /* try to get peer key still */
  2169. }
  2170. /* decode peer key */
  2171. switch (dCert.keyOID) {
  2172. #ifndef NO_RSA
  2173. case RSAk:
  2174. {
  2175. word32 idx = 0;
  2176. if (RsaPublicKeyDecode(dCert.publicKey, &idx,
  2177. ssl->peerRsaKey, dCert.pubKeySize) != 0) {
  2178. ret = PEER_KEY_ERROR;
  2179. }
  2180. else
  2181. ssl->peerRsaKeyPresent = 1;
  2182. }
  2183. break;
  2184. #endif /* NO_RSA */
  2185. #ifdef HAVE_NTRU
  2186. case NTRUk:
  2187. {
  2188. if (dCert.pubKeySize > sizeof(ssl->peerNtruKey)) {
  2189. ret = PEER_KEY_ERROR;
  2190. }
  2191. else {
  2192. XMEMCPY(ssl->peerNtruKey, dCert.publicKey, dCert.pubKeySize);
  2193. ssl->peerNtruKeyLen = (word16)dCert.pubKeySize;
  2194. ssl->peerNtruKeyPresent = 1;
  2195. }
  2196. }
  2197. break;
  2198. #endif /* HAVE_NTRU */
  2199. #ifdef HAVE_ECC
  2200. case ECDSAk:
  2201. {
  2202. if (ecc_import_x963(dCert.publicKey, dCert.pubKeySize,
  2203. ssl->peerEccDsaKey) != 0) {
  2204. ret = PEER_KEY_ERROR;
  2205. }
  2206. else
  2207. ssl->peerEccDsaKeyPresent = 1;
  2208. }
  2209. break;
  2210. #endif /* HAVE_ECC */
  2211. default:
  2212. break;
  2213. }
  2214. FreeDecodedCert(&dCert);
  2215. }
  2216. if (anyError != 0 && ret == 0)
  2217. ret = anyError;
  2218. if (ret == 0 && ssl->options.side == CLIENT_END)
  2219. ssl->options.serverState = SERVER_CERT_COMPLETE;
  2220. if (ret != 0) {
  2221. if (!ssl->options.verifyNone) {
  2222. int why = bad_certificate;
  2223. if (ret == ASN_AFTER_DATE_E || ret == ASN_BEFORE_DATE_E)
  2224. why = certificate_expired;
  2225. if (ssl->verifyCallback) {
  2226. int ok;
  2227. CYASSL_X509_STORE_CTX store;
  2228. store.error = ret;
  2229. store.error_depth = totalCerts;
  2230. store.domain = domain;
  2231. #ifdef OPENSSL_EXTRA
  2232. store.current_cert = &ssl->peerCert;
  2233. #else
  2234. store.current_cert = NULL;
  2235. #endif
  2236. #ifdef FORTRESS
  2237. store.ex_data = ssl;
  2238. #endif
  2239. ok = ssl->verifyCallback(0, &store);
  2240. if (ok) {
  2241. CYASSL_MSG("Verify callback overriding error!");
  2242. ret = 0;
  2243. }
  2244. }
  2245. if (ret != 0) {
  2246. SendAlert(ssl, alert_fatal, why); /* try to send */
  2247. ssl->options.isClosed = 1;
  2248. }
  2249. }
  2250. ssl->error = ret;
  2251. }
  2252. #ifdef FORTRESS
  2253. else {
  2254. if (ssl->verifyCallback) {
  2255. int ok;
  2256. CYASSL_X509_STORE_CTX store;
  2257. store.error = ret;
  2258. store.error_depth = totalCerts;
  2259. store.domain = domain;
  2260. store.current_cert = &ssl->peerCert;
  2261. store.ex_data = ssl;
  2262. ok = ssl->verifyCallback(1, &store);
  2263. if (!ok) {
  2264. CYASSL_MSG("Verify callback overriding valid certificate!");
  2265. ret = -1;
  2266. SendAlert(ssl, alert_fatal, bad_certificate);
  2267. ssl->options.isClosed = 1;
  2268. }
  2269. }
  2270. }
  2271. #endif
  2272. *inOutIdx = i;
  2273. return ret;
  2274. }
  2275. #endif /* !NO_CERTS */
  2276. static int DoHelloRequest(CYASSL* ssl, const byte* input, word32* inOutIdx)
  2277. {
  2278. if (ssl->keys.encryptionOn) {
  2279. const byte* mac;
  2280. int padSz = ssl->keys.encryptSz - HANDSHAKE_HEADER_SZ -
  2281. ssl->specs.hash_size;
  2282. byte verify[SHA256_DIGEST_SIZE];
  2283. ssl->hmac(ssl, verify, input + *inOutIdx - HANDSHAKE_HEADER_SZ,
  2284. HANDSHAKE_HEADER_SZ, handshake, 1);
  2285. /* read mac and fill */
  2286. mac = input + *inOutIdx;
  2287. *inOutIdx += ssl->specs.hash_size;
  2288. if (ssl->options.tls1_1 && ssl->specs.cipher_type == block)
  2289. padSz -= ssl->specs.block_size;
  2290. *inOutIdx += padSz;
  2291. /* verify */
  2292. if (XMEMCMP(mac, verify, ssl->specs.hash_size) != 0) {
  2293. CYASSL_MSG(" hello_request verify mac error");
  2294. return VERIFY_MAC_ERROR;
  2295. }
  2296. }
  2297. if (ssl->options.side == SERVER_END) {
  2298. SendAlert(ssl, alert_fatal, unexpected_message); /* try */
  2299. return FATAL_ERROR;
  2300. }
  2301. else
  2302. return SendAlert(ssl, alert_warning, no_renegotiation);
  2303. }
  2304. int DoFinished(CYASSL* ssl, const byte* input, word32* inOutIdx, int sniff)
  2305. {
  2306. byte verifyMAC[SHA256_DIGEST_SIZE];
  2307. int finishedSz = ssl->options.tls ? TLS_FINISHED_SZ : FINISHED_SZ;
  2308. int headerSz = HANDSHAKE_HEADER_SZ;
  2309. word32 macSz = finishedSz + HANDSHAKE_HEADER_SZ,
  2310. idx = *inOutIdx,
  2311. padSz = ssl->keys.encryptSz - HANDSHAKE_HEADER_SZ - finishedSz -
  2312. ssl->specs.hash_size;
  2313. const byte* mac;
  2314. #ifdef CYASSL_DTLS
  2315. if (ssl->options.dtls) {
  2316. headerSz += DTLS_HANDSHAKE_EXTRA;
  2317. macSz += DTLS_HANDSHAKE_EXTRA;
  2318. padSz -= DTLS_HANDSHAKE_EXTRA;
  2319. }
  2320. #endif
  2321. #ifdef CYASSL_CALLBACKS
  2322. if (ssl->hsInfoOn) AddPacketName("Finished", &ssl->handShakeInfo);
  2323. if (ssl->toInfoOn) AddLateName("Finished", &ssl->timeoutInfo);
  2324. #endif
  2325. if (sniff == NO_SNIFF) {
  2326. if (XMEMCMP(input + idx, &ssl->verifyHashes, finishedSz) != 0) {
  2327. CYASSL_MSG("Verify finished error on hashes");
  2328. return VERIFY_FINISHED_ERROR;
  2329. }
  2330. }
  2331. if (ssl->specs.cipher_type != aead) {
  2332. ssl->hmac(ssl, verifyMAC, input + idx - headerSz, macSz,
  2333. handshake, 1);
  2334. idx += finishedSz;
  2335. /* read mac and fill */
  2336. mac = input + idx;
  2337. idx += ssl->specs.hash_size;
  2338. if (ssl->options.tls1_1 && ssl->specs.cipher_type == block)
  2339. padSz -= ssl->specs.block_size;
  2340. idx += padSz;
  2341. /* verify mac */
  2342. if (XMEMCMP(mac, verifyMAC, ssl->specs.hash_size) != 0) {
  2343. CYASSL_MSG("Verify finished error on mac");
  2344. return VERIFY_MAC_ERROR;
  2345. }
  2346. }
  2347. else {
  2348. idx += (finishedSz + AEAD_AUTH_TAG_SZ);
  2349. }
  2350. if (ssl->options.side == CLIENT_END) {
  2351. ssl->options.serverState = SERVER_FINISHED_COMPLETE;
  2352. if (!ssl->options.resuming)
  2353. ssl->options.handShakeState = HANDSHAKE_DONE;
  2354. }
  2355. else {
  2356. ssl->options.clientState = CLIENT_FINISHED_COMPLETE;
  2357. if (ssl->options.resuming)
  2358. ssl->options.handShakeState = HANDSHAKE_DONE;
  2359. }
  2360. *inOutIdx = idx;
  2361. return 0;
  2362. }
  2363. static int DoHandShakeMsgType(CYASSL* ssl, byte* input, word32* inOutIdx,
  2364. byte type, word32 size, word32 totalSz)
  2365. {
  2366. int ret = 0;
  2367. (void)totalSz;
  2368. CYASSL_ENTER("DoHandShakeMsgType");
  2369. HashInput(ssl, input + *inOutIdx, size);
  2370. #ifdef CYASSL_CALLBACKS
  2371. /* add name later, add on record and handshake header part back on */
  2372. if (ssl->toInfoOn) {
  2373. int add = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  2374. AddPacketInfo(0, &ssl->timeoutInfo, input + *inOutIdx - add,
  2375. size + add, ssl->heap);
  2376. AddLateRecordHeader(&ssl->curRL, &ssl->timeoutInfo);
  2377. }
  2378. #endif
  2379. if (ssl->options.handShakeState == HANDSHAKE_DONE && type != hello_request){
  2380. CYASSL_MSG("HandShake message after handshake complete");
  2381. SendAlert(ssl, alert_fatal, unexpected_message);
  2382. return OUT_OF_ORDER_E;
  2383. }
  2384. if (ssl->options.side == CLIENT_END && ssl->options.dtls == 0 &&
  2385. ssl->options.serverState == NULL_STATE && type != server_hello) {
  2386. CYASSL_MSG("First server message not server hello");
  2387. SendAlert(ssl, alert_fatal, unexpected_message);
  2388. return OUT_OF_ORDER_E;
  2389. }
  2390. if (ssl->options.side == CLIENT_END && ssl->options.dtls &&
  2391. type == server_hello_done &&
  2392. ssl->options.serverState < SERVER_HELLO_COMPLETE) {
  2393. CYASSL_MSG("Server hello done received before server hello in DTLS");
  2394. SendAlert(ssl, alert_fatal, unexpected_message);
  2395. return OUT_OF_ORDER_E;
  2396. }
  2397. if (ssl->options.side == SERVER_END &&
  2398. ssl->options.clientState == NULL_STATE && type != client_hello) {
  2399. CYASSL_MSG("First client message not client hello");
  2400. SendAlert(ssl, alert_fatal, unexpected_message);
  2401. return OUT_OF_ORDER_E;
  2402. }
  2403. switch (type) {
  2404. case hello_request:
  2405. CYASSL_MSG("processing hello request");
  2406. ret = DoHelloRequest(ssl, input, inOutIdx);
  2407. break;
  2408. #ifndef NO_CYASSL_CLIENT
  2409. case hello_verify_request:
  2410. CYASSL_MSG("processing hello verify request");
  2411. ret = DoHelloVerifyRequest(ssl, input,inOutIdx);
  2412. break;
  2413. case server_hello:
  2414. CYASSL_MSG("processing server hello");
  2415. ret = DoServerHello(ssl, input, inOutIdx, size);
  2416. break;
  2417. #ifndef NO_CERTS
  2418. case certificate_request:
  2419. CYASSL_MSG("processing certificate request");
  2420. ret = DoCertificateRequest(ssl, input, inOutIdx);
  2421. break;
  2422. #endif
  2423. case server_key_exchange:
  2424. CYASSL_MSG("processing server key exchange");
  2425. ret = DoServerKeyExchange(ssl, input, inOutIdx);
  2426. break;
  2427. #endif
  2428. #ifndef NO_CERTS
  2429. case certificate:
  2430. CYASSL_MSG("processing certificate");
  2431. ret = DoCertificate(ssl, input, inOutIdx);
  2432. break;
  2433. #endif
  2434. case server_hello_done:
  2435. CYASSL_MSG("processing server hello done");
  2436. #ifdef CYASSL_CALLBACKS
  2437. if (ssl->hsInfoOn)
  2438. AddPacketName("ServerHelloDone", &ssl->handShakeInfo);
  2439. if (ssl->toInfoOn)
  2440. AddLateName("ServerHelloDone", &ssl->timeoutInfo);
  2441. #endif
  2442. ssl->options.serverState = SERVER_HELLODONE_COMPLETE;
  2443. break;
  2444. case finished:
  2445. CYASSL_MSG("processing finished");
  2446. ret = DoFinished(ssl, input, inOutIdx, NO_SNIFF);
  2447. break;
  2448. #ifndef NO_CYASSL_SERVER
  2449. case client_hello:
  2450. CYASSL_MSG("processing client hello");
  2451. ret = DoClientHello(ssl, input, inOutIdx, totalSz, size);
  2452. break;
  2453. case client_key_exchange:
  2454. CYASSL_MSG("processing client key exchange");
  2455. ret = DoClientKeyExchange(ssl, input, inOutIdx, totalSz);
  2456. break;
  2457. #if !defined(NO_RSA) || defined(HAVE_ECC)
  2458. case certificate_verify:
  2459. CYASSL_MSG("processing certificate verify");
  2460. ret = DoCertificateVerify(ssl, input, inOutIdx, totalSz);
  2461. break;
  2462. #endif /* !NO_RSA || HAVE_ECC */
  2463. #endif /* !NO_CYASSL_SERVER */
  2464. default:
  2465. CYASSL_MSG("Unknown handshake message type");
  2466. ret = UNKNOWN_HANDSHAKE_TYPE;
  2467. }
  2468. CYASSL_LEAVE("DoHandShakeMsgType()", ret);
  2469. return ret;
  2470. }
  2471. static int DoHandShakeMsg(CYASSL* ssl, byte* input, word32* inOutIdx,
  2472. word32 totalSz)
  2473. {
  2474. byte type;
  2475. word32 size;
  2476. int ret = 0;
  2477. CYASSL_ENTER("DoHandShakeMsg()");
  2478. if (GetHandShakeHeader(ssl, input, inOutIdx, &type, &size) != 0)
  2479. return PARSE_ERROR;
  2480. if (*inOutIdx + size > totalSz)
  2481. return INCOMPLETE_DATA;
  2482. ret = DoHandShakeMsgType(ssl, input, inOutIdx, type, size, totalSz);
  2483. CYASSL_LEAVE("DoHandShakeMsg()", ret);
  2484. return ret;
  2485. }
  2486. #ifdef CYASSL_DTLS
  2487. static int DoDtlsHandShakeMsg(CYASSL* ssl, byte* input, word32* inOutIdx,
  2488. word32 totalSz)
  2489. {
  2490. byte type;
  2491. word32 size;
  2492. word32 fragOffset, fragSz;
  2493. int ret = 0;
  2494. CYASSL_ENTER("DoDtlsHandShakeMsg()");
  2495. if (GetDtlsHandShakeHeader(ssl, input, inOutIdx, &type,
  2496. &size, &fragOffset, &fragSz) != 0)
  2497. return PARSE_ERROR;
  2498. if (*inOutIdx + fragSz > totalSz)
  2499. return INCOMPLETE_DATA;
  2500. if (fragSz < size) {
  2501. /* message is fragmented, knit back together */
  2502. byte* buf = ssl->buffers.dtlsHandshake.buffer;
  2503. if (ssl->buffers.dtlsHandshake.length == 0) {
  2504. /* Need to add a header back into the data. The Hash is calculated
  2505. * as if this were a single message, not several fragments. */
  2506. buf = (byte*)XMALLOC(size + DTLS_HANDSHAKE_HEADER_SZ,
  2507. ssl->heap, DYNAMIC_TYPE_NONE);
  2508. if (buf == NULL)
  2509. return MEMORY_ERROR;
  2510. ssl->buffers.dtlsHandshake.length = size;
  2511. ssl->buffers.dtlsHandshake.buffer = buf;
  2512. ssl->buffers.dtlsUsed = 0;
  2513. ssl->buffers.dtlsType = type;
  2514. /* Construct a new header for the reassembled message as if it
  2515. * were originally sent as one fragment for the hashing later. */
  2516. XMEMCPY(buf,
  2517. input + *inOutIdx - DTLS_HANDSHAKE_HEADER_SZ,
  2518. DTLS_HANDSHAKE_HEADER_SZ - DTLS_HANDSHAKE_FRAG_SZ);
  2519. XMEMCPY(buf + DTLS_HANDSHAKE_HEADER_SZ - DTLS_HANDSHAKE_FRAG_SZ,
  2520. input + *inOutIdx - DTLS_HANDSHAKE_HEADER_SZ + ENUM_LEN,
  2521. DTLS_HANDSHAKE_FRAG_SZ);
  2522. }
  2523. /* readjust the buf pointer past the header */
  2524. buf += DTLS_HANDSHAKE_HEADER_SZ;
  2525. XMEMCPY(buf + fragOffset, input + *inOutIdx, fragSz);
  2526. ssl->buffers.dtlsUsed += fragSz;
  2527. *inOutIdx += fragSz;
  2528. if (ssl->buffers.dtlsUsed != size) {
  2529. CYASSL_LEAVE("DoDtlsHandShakeMsg()", 0);
  2530. return 0;
  2531. }
  2532. else {
  2533. if (ssl->keys.dtls_peer_handshake_number ==
  2534. ssl->keys.dtls_expected_peer_handshake_number) {
  2535. word32 idx = 0;
  2536. totalSz = size;
  2537. ssl->keys.dtls_expected_peer_handshake_number++;
  2538. ret = DoHandShakeMsgType(ssl, buf, &idx, type, size, totalSz);
  2539. }
  2540. else {
  2541. *inOutIdx += size;
  2542. ret = 0;
  2543. }
  2544. }
  2545. }
  2546. else {
  2547. if (ssl->keys.dtls_peer_handshake_number ==
  2548. ssl->keys.dtls_expected_peer_handshake_number) {
  2549. ssl->keys.dtls_expected_peer_handshake_number++;
  2550. ret = DoHandShakeMsgType(ssl, input, inOutIdx, type, size, totalSz);
  2551. }
  2552. else {
  2553. *inOutIdx += size;
  2554. ret = 0;
  2555. }
  2556. }
  2557. if (ssl->buffers.dtlsHandshake.buffer != NULL) {
  2558. XFREE(ssl->buffers.dtlsHandshake.buffer, ssl->heap, DYNAMIC_TYPE_NONE);
  2559. ssl->buffers.dtlsHandshake.length = 0;
  2560. ssl->buffers.dtlsHandshake.buffer = NULL;
  2561. ssl->buffers.dtlsUsed = 0;
  2562. ssl->buffers.dtlsType = 0;
  2563. }
  2564. CYASSL_LEAVE("DoDtlsHandShakeMsg()", ret);
  2565. return ret;
  2566. }
  2567. #endif
  2568. static INLINE word32 GetSEQIncrement(CYASSL* ssl, int verify)
  2569. {
  2570. if (verify)
  2571. return ssl->keys.peer_sequence_number++;
  2572. else
  2573. return ssl->keys.sequence_number++;
  2574. }
  2575. #ifdef HAVE_AEAD
  2576. static INLINE void AeadIncrementExpIV(CYASSL* ssl)
  2577. {
  2578. int i;
  2579. for (i = AEAD_EXP_IV_SZ-1; i >= 0; i--) {
  2580. if (++ssl->keys.aead_exp_IV[i]) return;
  2581. }
  2582. }
  2583. #endif
  2584. static INLINE int Encrypt(CYASSL* ssl, byte* out, const byte* input, word32 sz)
  2585. {
  2586. (void)out;
  2587. (void)input;
  2588. (void)sz;
  2589. if (ssl->encrypt.setup == 0) {
  2590. CYASSL_MSG("Encrypt ciphers not setup");
  2591. return ENCRYPT_ERROR;
  2592. }
  2593. switch (ssl->specs.bulk_cipher_algorithm) {
  2594. #ifdef BUILD_ARC4
  2595. case rc4:
  2596. Arc4Process(ssl->encrypt.arc4, out, input, sz);
  2597. break;
  2598. #endif
  2599. #ifdef BUILD_DES3
  2600. case triple_des:
  2601. Des3_CbcEncrypt(ssl->encrypt.des3, out, input, sz);
  2602. break;
  2603. #endif
  2604. #ifdef BUILD_AES
  2605. case aes:
  2606. #ifdef CYASSL_AESNI
  2607. if ((word)input % 16) {
  2608. byte* tmp = (byte*)XMALLOC(sz, ssl->heap,
  2609. DYNAMIC_TYPE_TMP_BUFFER);
  2610. if (tmp == NULL) return MEMORY_E;
  2611. XMEMCPY(tmp, input, sz);
  2612. AesCbcEncrypt(ssl->encrypt.aes, tmp, tmp, sz);
  2613. XMEMCPY(out, tmp, sz);
  2614. XFREE(tmp, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  2615. break;
  2616. }
  2617. #endif
  2618. AesCbcEncrypt(ssl->encrypt.aes, out, input, sz);
  2619. break;
  2620. #endif
  2621. #ifdef BUILD_AESGCM
  2622. case aes_gcm:
  2623. {
  2624. byte additional[AES_BLOCK_SIZE];
  2625. byte nonce[AEAD_NONCE_SZ];
  2626. XMEMSET(additional, 0, AES_BLOCK_SIZE);
  2627. /* sequence number field is 64-bits, we only use 32-bits */
  2628. c32toa(GetSEQIncrement(ssl, 0),
  2629. additional + AEAD_SEQ_OFFSET);
  2630. /* Store the type, version. Unfortunately, they are in
  2631. * the input buffer ahead of the plaintext. */
  2632. XMEMCPY(additional + AEAD_TYPE_OFFSET, input - 5, 3);
  2633. /* Store the length of the plain text minus the explicit
  2634. * IV length minus the authentication tag size. */
  2635. c16toa(sz - AEAD_EXP_IV_SZ - AEAD_AUTH_TAG_SZ,
  2636. additional + AEAD_LEN_OFFSET);
  2637. XMEMCPY(nonce,
  2638. ssl->keys.aead_enc_imp_IV, AEAD_IMP_IV_SZ);
  2639. XMEMCPY(nonce + AEAD_IMP_IV_SZ,
  2640. ssl->keys.aead_exp_IV, AEAD_EXP_IV_SZ);
  2641. AesGcmEncrypt(ssl->encrypt.aes,
  2642. out + AEAD_EXP_IV_SZ, input + AEAD_EXP_IV_SZ,
  2643. sz - AEAD_EXP_IV_SZ - AEAD_AUTH_TAG_SZ,
  2644. nonce, AEAD_NONCE_SZ,
  2645. out + sz - AEAD_AUTH_TAG_SZ, AEAD_AUTH_TAG_SZ,
  2646. additional, AEAD_AUTH_DATA_SZ);
  2647. AeadIncrementExpIV(ssl);
  2648. XMEMSET(nonce, 0, AEAD_NONCE_SZ);
  2649. }
  2650. break;
  2651. #endif
  2652. #ifdef HAVE_AESCCM
  2653. case aes_ccm:
  2654. {
  2655. byte additional[AES_BLOCK_SIZE];
  2656. byte nonce[AEAD_NONCE_SZ];
  2657. XMEMSET(additional, 0, AES_BLOCK_SIZE);
  2658. /* sequence number field is 64-bits, we only use 32-bits */
  2659. c32toa(GetSEQIncrement(ssl, 0),
  2660. additional + AEAD_SEQ_OFFSET);
  2661. /* Store the type, version. Unfortunately, they are in
  2662. * the input buffer ahead of the plaintext. */
  2663. XMEMCPY(additional + AEAD_TYPE_OFFSET, input - 5, 3);
  2664. /* Store the length of the plain text minus the explicit
  2665. * IV length minus the authentication tag size. */
  2666. c16toa(sz - AEAD_EXP_IV_SZ - AEAD_AUTH_TAG_SZ,
  2667. additional + AEAD_LEN_OFFSET);
  2668. XMEMCPY(nonce,
  2669. ssl->keys.aead_enc_imp_IV, AEAD_IMP_IV_SZ);
  2670. XMEMCPY(nonce + AEAD_IMP_IV_SZ,
  2671. ssl->keys.aead_exp_IV, AEAD_EXP_IV_SZ);
  2672. AesCcmEncrypt(ssl->encrypt.aes,
  2673. out + AEAD_EXP_IV_SZ, input + AEAD_EXP_IV_SZ,
  2674. sz - AEAD_EXP_IV_SZ - AEAD_AUTH_TAG_SZ,
  2675. nonce, AEAD_NONCE_SZ,
  2676. out + sz - AEAD_AUTH_TAG_SZ, AEAD_AUTH_TAG_SZ,
  2677. additional, AEAD_AUTH_DATA_SZ);
  2678. AeadIncrementExpIV(ssl);
  2679. XMEMSET(nonce, 0, AEAD_NONCE_SZ);
  2680. }
  2681. break;
  2682. #endif
  2683. #ifdef HAVE_CAMELLIA
  2684. case camellia:
  2685. CamelliaCbcEncrypt(ssl->encrypt.cam, out, input, sz);
  2686. break;
  2687. #endif
  2688. #ifdef HAVE_HC128
  2689. case hc128:
  2690. #ifdef XSTREAM_ALIGNMENT
  2691. if ((word)input % 4) {
  2692. byte* tmp = (byte*)XMALLOC(sz, ssl->heap,
  2693. DYNAMIC_TYPE_TMP_BUFFER);
  2694. if (tmp == NULL) return MEMORY_E;
  2695. XMEMCPY(tmp, input, sz);
  2696. Hc128_Process(ssl->encrypt.hc128, tmp, tmp, sz);
  2697. XMEMCPY(out, tmp, sz);
  2698. XFREE(tmp, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  2699. break;
  2700. }
  2701. #endif
  2702. Hc128_Process(ssl->encrypt.hc128, out, input, sz);
  2703. break;
  2704. #endif
  2705. #ifdef BUILD_RABBIT
  2706. case rabbit:
  2707. #ifdef XSTREAM_ALIGNMENT
  2708. if ((word)input % 4) {
  2709. byte* tmp = (byte*)XMALLOC(sz, ssl->heap,
  2710. DYNAMIC_TYPE_TMP_BUFFER);
  2711. if (tmp == NULL) return MEMORY_E;
  2712. XMEMCPY(tmp, input, sz);
  2713. RabbitProcess(ssl->encrypt.rabbit, tmp, tmp, sz);
  2714. XMEMCPY(out, tmp, sz);
  2715. XFREE(tmp, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  2716. break;
  2717. }
  2718. #endif
  2719. RabbitProcess(ssl->encrypt.rabbit, out, input, sz);
  2720. break;
  2721. #endif
  2722. #ifdef HAVE_NULL_CIPHER
  2723. case cipher_null:
  2724. if (input != out) {
  2725. XMEMMOVE(out, input, sz);
  2726. }
  2727. break;
  2728. #endif
  2729. default:
  2730. CYASSL_MSG("CyaSSL Encrypt programming error");
  2731. return ENCRYPT_ERROR;
  2732. }
  2733. return 0;
  2734. }
  2735. static INLINE int Decrypt(CYASSL* ssl, byte* plain, const byte* input,
  2736. word32 sz)
  2737. {
  2738. (void)plain;
  2739. (void)input;
  2740. (void)sz;
  2741. if (ssl->decrypt.setup == 0) {
  2742. CYASSL_MSG("Decrypt ciphers not setup");
  2743. return DECRYPT_ERROR;
  2744. }
  2745. switch (ssl->specs.bulk_cipher_algorithm) {
  2746. #ifdef BUILD_ARC4
  2747. case rc4:
  2748. Arc4Process(ssl->decrypt.arc4, plain, input, sz);
  2749. break;
  2750. #endif
  2751. #ifdef BUILD_DES3
  2752. case triple_des:
  2753. Des3_CbcDecrypt(ssl->decrypt.des3, plain, input, sz);
  2754. break;
  2755. #endif
  2756. #ifdef BUILD_AES
  2757. case aes:
  2758. AesCbcDecrypt(ssl->decrypt.aes, plain, input, sz);
  2759. break;
  2760. #endif
  2761. #ifdef BUILD_AESGCM
  2762. case aes_gcm:
  2763. {
  2764. byte additional[AES_BLOCK_SIZE];
  2765. byte nonce[AEAD_NONCE_SZ];
  2766. XMEMSET(additional, 0, AES_BLOCK_SIZE);
  2767. /* sequence number field is 64-bits, we only use 32-bits */
  2768. c32toa(GetSEQIncrement(ssl, 1), additional + AEAD_SEQ_OFFSET);
  2769. additional[AEAD_TYPE_OFFSET] = ssl->curRL.type;
  2770. additional[AEAD_VMAJ_OFFSET] = ssl->curRL.pvMajor;
  2771. additional[AEAD_VMIN_OFFSET] = ssl->curRL.pvMinor;
  2772. c16toa(sz - AEAD_EXP_IV_SZ - AEAD_AUTH_TAG_SZ,
  2773. additional + AEAD_LEN_OFFSET);
  2774. XMEMCPY(nonce, ssl->keys.aead_dec_imp_IV, AEAD_IMP_IV_SZ);
  2775. XMEMCPY(nonce + AEAD_IMP_IV_SZ, input, AEAD_EXP_IV_SZ);
  2776. if (AesGcmDecrypt(ssl->decrypt.aes,
  2777. plain + AEAD_EXP_IV_SZ,
  2778. input + AEAD_EXP_IV_SZ,
  2779. sz - AEAD_EXP_IV_SZ - AEAD_AUTH_TAG_SZ,
  2780. nonce, AEAD_NONCE_SZ,
  2781. input + sz - AEAD_AUTH_TAG_SZ, AEAD_AUTH_TAG_SZ,
  2782. additional, AEAD_AUTH_DATA_SZ) < 0) {
  2783. SendAlert(ssl, alert_fatal, bad_record_mac);
  2784. XMEMSET(nonce, 0, AEAD_NONCE_SZ);
  2785. return VERIFY_MAC_ERROR;
  2786. }
  2787. XMEMSET(nonce, 0, AEAD_NONCE_SZ);
  2788. break;
  2789. }
  2790. #endif
  2791. #ifdef HAVE_AESCCM
  2792. case aes_ccm:
  2793. {
  2794. byte additional[AES_BLOCK_SIZE];
  2795. byte nonce[AEAD_NONCE_SZ];
  2796. XMEMSET(additional, 0, AES_BLOCK_SIZE);
  2797. /* sequence number field is 64-bits, we only use 32-bits */
  2798. c32toa(GetSEQIncrement(ssl, 1), additional + AEAD_SEQ_OFFSET);
  2799. additional[AEAD_TYPE_OFFSET] = ssl->curRL.type;
  2800. additional[AEAD_VMAJ_OFFSET] = ssl->curRL.pvMajor;
  2801. additional[AEAD_VMIN_OFFSET] = ssl->curRL.pvMinor;
  2802. c16toa(sz - AEAD_EXP_IV_SZ - AEAD_AUTH_TAG_SZ,
  2803. additional + AEAD_LEN_OFFSET);
  2804. XMEMCPY(nonce, ssl->keys.aead_dec_imp_IV, AEAD_IMP_IV_SZ);
  2805. XMEMCPY(nonce + AEAD_IMP_IV_SZ, input, AEAD_EXP_IV_SZ);
  2806. if (AesCcmDecrypt(ssl->decrypt.aes,
  2807. plain + AEAD_EXP_IV_SZ,
  2808. input + AEAD_EXP_IV_SZ,
  2809. sz - AEAD_EXP_IV_SZ - AEAD_AUTH_TAG_SZ,
  2810. nonce, AEAD_NONCE_SZ,
  2811. input + sz - AEAD_AUTH_TAG_SZ, AEAD_AUTH_TAG_SZ,
  2812. additional, AEAD_AUTH_DATA_SZ) < 0) {
  2813. SendAlert(ssl, alert_fatal, bad_record_mac);
  2814. XMEMSET(nonce, 0, AEAD_NONCE_SZ);
  2815. return VERIFY_MAC_ERROR;
  2816. }
  2817. XMEMSET(nonce, 0, AEAD_NONCE_SZ);
  2818. break;
  2819. }
  2820. #endif
  2821. #ifdef HAVE_CAMELLIA
  2822. case camellia:
  2823. CamelliaCbcDecrypt(ssl->decrypt.cam, plain, input, sz);
  2824. break;
  2825. #endif
  2826. #ifdef HAVE_HC128
  2827. case hc128:
  2828. Hc128_Process(ssl->decrypt.hc128, plain, input, sz);
  2829. break;
  2830. #endif
  2831. #ifdef BUILD_RABBIT
  2832. case rabbit:
  2833. RabbitProcess(ssl->decrypt.rabbit, plain, input, sz);
  2834. break;
  2835. #endif
  2836. #ifdef HAVE_NULL_CIPHER
  2837. case cipher_null:
  2838. if (input != plain) {
  2839. XMEMMOVE(plain, input, sz);
  2840. }
  2841. break;
  2842. #endif
  2843. default:
  2844. CYASSL_MSG("CyaSSL Decrypt programming error");
  2845. return DECRYPT_ERROR;
  2846. }
  2847. return 0;
  2848. }
  2849. /* check cipher text size for sanity */
  2850. static int SanityCheckCipherText(CYASSL* ssl, word32 encryptSz)
  2851. {
  2852. word32 minLength = 0;
  2853. if (ssl->specs.cipher_type == block) {
  2854. if (encryptSz % ssl->specs.block_size) {
  2855. CYASSL_MSG("Block ciphertext not block size");
  2856. return SANITY_CIPHER_E;
  2857. }
  2858. minLength = ssl->specs.hash_size + 1; /* pad byte */
  2859. if (ssl->specs.block_size > minLength)
  2860. minLength = ssl->specs.block_size;
  2861. if (ssl->options.tls1_1)
  2862. minLength += ssl->specs.block_size; /* explicit IV */
  2863. }
  2864. else if (ssl->specs.cipher_type == stream) {
  2865. minLength = ssl->specs.hash_size;
  2866. }
  2867. else if (ssl->specs.cipher_type == aead) {
  2868. minLength = ssl->specs.block_size; /* explicit IV + implicit IV + CTR*/
  2869. }
  2870. if (encryptSz < minLength) {
  2871. CYASSL_MSG("Ciphertext not minimum size");
  2872. return SANITY_CIPHER_E;
  2873. }
  2874. return 0;
  2875. }
  2876. /* decrypt input message in place */
  2877. static int DecryptMessage(CYASSL* ssl, byte* input, word32 sz, word32* idx)
  2878. {
  2879. int decryptResult;
  2880. int sanityResult = SanityCheckCipherText(ssl, sz);
  2881. if (sanityResult != 0)
  2882. return sanityResult;
  2883. decryptResult = Decrypt(ssl, input, input, sz);
  2884. if (decryptResult == 0)
  2885. {
  2886. ssl->keys.encryptSz = sz;
  2887. ssl->keys.decryptedCur = 1;
  2888. if (ssl->options.tls1_1 && ssl->specs.cipher_type == block)
  2889. *idx += ssl->specs.block_size; /* go past TLSv1.1 IV */
  2890. if (ssl->specs.cipher_type == aead)
  2891. *idx += AEAD_EXP_IV_SZ;
  2892. }
  2893. return decryptResult;
  2894. }
  2895. #ifndef NO_MD5
  2896. static INLINE void Md5Rounds(int rounds, const byte* data, int sz)
  2897. {
  2898. Md5 md5;
  2899. int i;
  2900. InitMd5(&md5);
  2901. for (i = 0; i < rounds; i++);
  2902. Md5Update(&md5, data, sz);
  2903. }
  2904. #endif
  2905. static INLINE void ShaRounds(int rounds, const byte* data, int sz)
  2906. {
  2907. Sha sha;
  2908. int i;
  2909. InitSha(&sha);
  2910. for (i = 0; i < rounds; i++);
  2911. ShaUpdate(&sha, data, sz);
  2912. }
  2913. #ifndef NO_SHA256
  2914. static INLINE void Sha256Rounds(int rounds, const byte* data, int sz)
  2915. {
  2916. Sha256 sha256;
  2917. int i;
  2918. InitSha256(&sha256);
  2919. for (i = 0; i < rounds; i++);
  2920. Sha256Update(&sha256, data, sz);
  2921. }
  2922. #endif
  2923. #ifdef CYASSL_SHA384
  2924. static INLINE void Sha384Rounds(int rounds, const byte* data, int sz)
  2925. {
  2926. Sha384 sha384;
  2927. int i;
  2928. InitSha384(&sha384);
  2929. for (i = 0; i < rounds; i++);
  2930. Sha384Update(&sha384, data, sz);
  2931. }
  2932. #endif
  2933. #ifdef CYASSL_SHA512
  2934. static INLINE void Sha512Rounds(int rounds, const byte* data, int sz)
  2935. {
  2936. Sha512 sha512;
  2937. int i;
  2938. InitSha512(&sha512);
  2939. for (i = 0; i < rounds; i++);
  2940. Sha512Update(&sha512, data, sz);
  2941. }
  2942. #endif
  2943. #ifdef CYASSL_RIPEMD
  2944. static INLINE void RmdRounds(int rounds, const byte* data, int sz)
  2945. {
  2946. RipeMd ripemd;
  2947. int i;
  2948. InitRipeMd(&ripemd);
  2949. for (i = 0; i < rounds; i++);
  2950. RipeMdUpdate(&ripemd, data, sz);
  2951. }
  2952. #endif
  2953. static INLINE void DoRounds(int type, int rounds, const byte* data, int sz)
  2954. {
  2955. switch (type) {
  2956. case no_mac :
  2957. break;
  2958. #ifndef NO_MD5
  2959. case md5_mac :
  2960. Md5Rounds(rounds, data, sz);
  2961. break;
  2962. #endif
  2963. case sha_mac :
  2964. ShaRounds(rounds, data, sz);
  2965. break;
  2966. #ifndef NO_SHA256
  2967. case sha256_mac :
  2968. Sha256Rounds(rounds, data, sz);
  2969. break;
  2970. #endif
  2971. #ifdef CYASSL_SHA384
  2972. case sha384_mac :
  2973. Sha384Rounds(rounds, data, sz);
  2974. break;
  2975. #endif
  2976. #ifdef CYASSL_SHA512
  2977. case sha512_mac :
  2978. Sha512Rounds(rounds, data, sz);
  2979. break;
  2980. #endif
  2981. #ifdef CYASSL_RIPEMD
  2982. case rmd_mac :
  2983. RmdRounds(rounds, data, sz);
  2984. break;
  2985. #endif
  2986. default:
  2987. CYASSL_MSG("Bad round type");
  2988. break;
  2989. }
  2990. }
  2991. /* do number of compression rounds on dummy data */
  2992. static INLINE void CompressRounds(CYASSL* ssl, int rounds, const byte* dummy)
  2993. {
  2994. if (rounds)
  2995. DoRounds(ssl->specs.mac_algorithm, rounds, dummy, COMPRESS_LOWER);
  2996. }
  2997. /* check all length bytes for equality, return 0 on success */
  2998. static int ConstantCompare(const byte* a, const byte* b, int length)
  2999. {
  3000. int i;
  3001. int good = 0;
  3002. int bad = 0;
  3003. for (i = 0; i < length; i++) {
  3004. if (a[i] == b[i])
  3005. good++;
  3006. else
  3007. bad++;
  3008. }
  3009. if (good == length)
  3010. return 0;
  3011. else
  3012. return 0 - bad; /* compare failed */
  3013. }
  3014. /* check all length bytes for the pad value, return 0 on success */
  3015. static int PadCheck(const byte* input, byte pad, int length)
  3016. {
  3017. int i;
  3018. int good = 0;
  3019. int bad = 0;
  3020. for (i = 0; i < length; i++) {
  3021. if (input[i] == pad)
  3022. good++;
  3023. else
  3024. bad++;
  3025. }
  3026. if (good == length)
  3027. return 0;
  3028. else
  3029. return 0 - bad; /* pad check failed */
  3030. }
  3031. /* get compression extra rounds */
  3032. static INLINE int GetRounds(int pLen, int padLen, int t)
  3033. {
  3034. int roundL1 = 1; /* round up flags */
  3035. int roundL2 = 1;
  3036. int L1 = COMPRESS_CONSTANT + pLen - t;
  3037. int L2 = COMPRESS_CONSTANT + pLen - padLen - 1 - t;
  3038. L1 -= COMPRESS_UPPER;
  3039. L2 -= COMPRESS_UPPER;
  3040. if ( (L1 % COMPRESS_LOWER) == 0)
  3041. roundL1 = 0;
  3042. if ( (L2 % COMPRESS_LOWER) == 0)
  3043. roundL2 = 0;
  3044. L1 /= COMPRESS_LOWER;
  3045. L2 /= COMPRESS_LOWER;
  3046. L1 += roundL1;
  3047. L2 += roundL2;
  3048. return L1 - L2;
  3049. }
  3050. /* timing resistant pad/verify check, return 0 on success */
  3051. static int TimingPadVerify(CYASSL* ssl, const byte* input, int padLen, int t,
  3052. int pLen)
  3053. {
  3054. byte verify[SHA256_DIGEST_SIZE];
  3055. byte dummy[MAX_PAD_SIZE];
  3056. XMEMSET(dummy, 1, sizeof(dummy));
  3057. if ( (t + padLen + 1) > pLen) {
  3058. CYASSL_MSG("Plain Len not long enough for pad/mac");
  3059. PadCheck(dummy, (byte)padLen, MAX_PAD_SIZE);
  3060. ssl->hmac(ssl, verify, input, pLen - t, application_data, 1);
  3061. ConstantCompare(verify, input + pLen - t, t);
  3062. return VERIFY_MAC_ERROR;
  3063. }
  3064. if (PadCheck(input + pLen - (padLen + 1), (byte)padLen, padLen + 1) != 0) {
  3065. CYASSL_MSG("PadCheck failed");
  3066. PadCheck(dummy, (byte)padLen, MAX_PAD_SIZE - padLen - 1);
  3067. ssl->hmac(ssl, verify, input, pLen - t, application_data, 1);
  3068. ConstantCompare(verify, input + pLen - t, t);
  3069. return VERIFY_MAC_ERROR;
  3070. }
  3071. PadCheck(dummy, (byte)padLen, MAX_PAD_SIZE - padLen - 1);
  3072. ssl->hmac(ssl, verify, input, pLen - padLen - 1 - t, application_data, 1);
  3073. CompressRounds(ssl, GetRounds(pLen, padLen, t), dummy);
  3074. if (ConstantCompare(verify, input + (pLen - padLen - 1 - t), t) != 0) {
  3075. CYASSL_MSG("Verify MAC compare failed");
  3076. return VERIFY_MAC_ERROR;
  3077. }
  3078. return 0;
  3079. }
  3080. int DoApplicationData(CYASSL* ssl, byte* input, word32* inOutIdx)
  3081. {
  3082. word32 msgSz = ssl->keys.encryptSz;
  3083. word32 pad = 0,
  3084. padByte = 0,
  3085. idx = *inOutIdx,
  3086. digestSz = ssl->specs.hash_size;
  3087. int dataSz, ret;
  3088. int ivExtra = 0;
  3089. byte* rawData = input + idx; /* keep current for hmac */
  3090. #ifdef HAVE_LIBZ
  3091. byte decomp[MAX_RECORD_SIZE + MAX_COMP_EXTRA];
  3092. #endif
  3093. byte verify[SHA256_DIGEST_SIZE];
  3094. if (ssl->options.handShakeState != HANDSHAKE_DONE) {
  3095. CYASSL_MSG("Received App data before handshake complete");
  3096. SendAlert(ssl, alert_fatal, unexpected_message);
  3097. return OUT_OF_ORDER_E;
  3098. }
  3099. if (ssl->specs.cipher_type == block) {
  3100. if (ssl->options.tls1_1)
  3101. ivExtra = ssl->specs.block_size;
  3102. pad = *(input + idx + msgSz - ivExtra - 1);
  3103. padByte = 1;
  3104. if (ssl->options.tls) {
  3105. ret = TimingPadVerify(ssl, input + idx, pad, digestSz,
  3106. msgSz - ivExtra);
  3107. if (ret != 0)
  3108. return ret;
  3109. }
  3110. else { /* sslv3, some implementations have bad padding */
  3111. ssl->hmac(ssl, verify, rawData, msgSz - digestSz - pad - 1,
  3112. application_data, 1);
  3113. if (ConstantCompare(verify, rawData + msgSz - digestSz - pad - 1,
  3114. digestSz) != 0)
  3115. return VERIFY_MAC_ERROR;
  3116. }
  3117. }
  3118. else if (ssl->specs.cipher_type == stream) {
  3119. ssl->hmac(ssl, verify, rawData, msgSz - digestSz, application_data, 1);
  3120. if (ConstantCompare(verify, rawData + msgSz - digestSz, digestSz) != 0){
  3121. return VERIFY_MAC_ERROR;
  3122. }
  3123. }
  3124. else if (ssl->specs.cipher_type == aead) {
  3125. ivExtra = AEAD_EXP_IV_SZ;
  3126. digestSz = AEAD_AUTH_TAG_SZ;
  3127. }
  3128. dataSz = msgSz - ivExtra - digestSz - pad - padByte;
  3129. if (dataSz < 0) {
  3130. CYASSL_MSG("App data buffer error, malicious input?");
  3131. return BUFFER_ERROR;
  3132. }
  3133. /* read data */
  3134. if (dataSz) {
  3135. int rawSz = dataSz; /* keep raw size for idx adjustment */
  3136. #ifdef HAVE_LIBZ
  3137. if (ssl->options.usingCompression) {
  3138. dataSz = DeCompress(ssl, rawData, dataSz, decomp, sizeof(decomp));
  3139. if (dataSz < 0) return dataSz;
  3140. }
  3141. #endif
  3142. idx += rawSz;
  3143. ssl->buffers.clearOutputBuffer.buffer = rawData;
  3144. ssl->buffers.clearOutputBuffer.length = dataSz;
  3145. }
  3146. idx += digestSz;
  3147. idx += pad;
  3148. if (padByte)
  3149. idx++;
  3150. #ifdef HAVE_LIBZ
  3151. /* decompress could be bigger, overwrite after verify */
  3152. if (ssl->options.usingCompression)
  3153. XMEMMOVE(rawData, decomp, dataSz);
  3154. #endif
  3155. *inOutIdx = idx;
  3156. return 0;
  3157. }
  3158. /* process alert, return level */
  3159. static int DoAlert(CYASSL* ssl, byte* input, word32* inOutIdx, int* type)
  3160. {
  3161. byte level;
  3162. #ifdef CYASSL_CALLBACKS
  3163. if (ssl->hsInfoOn)
  3164. AddPacketName("Alert", &ssl->handShakeInfo);
  3165. if (ssl->toInfoOn)
  3166. /* add record header back on to info + 2 byte level, data */
  3167. AddPacketInfo("Alert", &ssl->timeoutInfo, input + *inOutIdx -
  3168. RECORD_HEADER_SZ, 2 + RECORD_HEADER_SZ, ssl->heap);
  3169. #endif
  3170. level = input[(*inOutIdx)++];
  3171. *type = (int)input[(*inOutIdx)++];
  3172. CYASSL_MSG("Got alert");
  3173. if (*type == close_notify) {
  3174. CYASSL_MSG(" close notify");
  3175. ssl->options.closeNotify = 1;
  3176. }
  3177. CYASSL_ERROR(*type);
  3178. if (ssl->keys.encryptionOn) {
  3179. if (ssl->specs.cipher_type != aead) {
  3180. int aSz = ALERT_SIZE;
  3181. const byte* mac;
  3182. byte verify[SHA256_DIGEST_SIZE];
  3183. int padSz = ssl->keys.encryptSz - aSz - ssl->specs.hash_size;
  3184. ssl->hmac(ssl, verify, input + *inOutIdx - aSz, aSz, alert, 1);
  3185. /* read mac and fill */
  3186. mac = input + *inOutIdx;
  3187. *inOutIdx += (ssl->specs.hash_size + padSz);
  3188. /* verify */
  3189. if (XMEMCMP(mac, verify, ssl->specs.hash_size) != 0) {
  3190. CYASSL_MSG(" alert verify mac error");
  3191. return VERIFY_MAC_ERROR;
  3192. }
  3193. }
  3194. else {
  3195. *inOutIdx += AEAD_AUTH_TAG_SZ;
  3196. }
  3197. }
  3198. return level;
  3199. }
  3200. static int GetInputData(CYASSL *ssl, word32 size)
  3201. {
  3202. int in;
  3203. int inSz;
  3204. int maxLength;
  3205. int usedLength;
  3206. /* check max input length */
  3207. usedLength = ssl->buffers.inputBuffer.length - ssl->buffers.inputBuffer.idx;
  3208. maxLength = ssl->buffers.inputBuffer.bufferSize - usedLength;
  3209. inSz = (int)(size - usedLength); /* from last partial read */
  3210. #ifdef CYASSL_DTLS
  3211. if (ssl->options.dtls)
  3212. inSz = MAX_MTU; /* read ahead up to MTU */
  3213. #endif
  3214. if (inSz > maxLength) {
  3215. if (GrowInputBuffer(ssl, size, usedLength) < 0)
  3216. return MEMORY_E;
  3217. }
  3218. if (inSz <= 0)
  3219. return BUFFER_ERROR;
  3220. /* Put buffer data at start if not there */
  3221. if (usedLength > 0 && ssl->buffers.inputBuffer.idx != 0)
  3222. XMEMMOVE(ssl->buffers.inputBuffer.buffer,
  3223. ssl->buffers.inputBuffer.buffer + ssl->buffers.inputBuffer.idx,
  3224. usedLength);
  3225. /* remove processed data */
  3226. ssl->buffers.inputBuffer.idx = 0;
  3227. ssl->buffers.inputBuffer.length = usedLength;
  3228. /* read data from network */
  3229. do {
  3230. in = Receive(ssl,
  3231. ssl->buffers.inputBuffer.buffer +
  3232. ssl->buffers.inputBuffer.length,
  3233. inSz);
  3234. if (in == -1)
  3235. return SOCKET_ERROR_E;
  3236. if (in == WANT_READ)
  3237. return WANT_READ;
  3238. if (in > inSz)
  3239. return RECV_OVERFLOW_E;
  3240. ssl->buffers.inputBuffer.length += in;
  3241. inSz -= in;
  3242. } while (ssl->buffers.inputBuffer.length < size);
  3243. return 0;
  3244. }
  3245. /* process input requests, return 0 is done, 1 is call again to complete, and
  3246. negative number is error */
  3247. int ProcessReply(CYASSL* ssl)
  3248. {
  3249. int ret = 0, type, readSz;
  3250. word32 startIdx = 0;
  3251. #ifndef NO_CYASSL_SERVER
  3252. byte b0, b1;
  3253. #endif
  3254. #ifdef CYASSL_DTLS
  3255. int used;
  3256. #endif
  3257. for (;;) {
  3258. switch ((processReply)ssl->options.processReply) {
  3259. /* in the CYASSL_SERVER case, get the first byte for detecting
  3260. * old client hello */
  3261. case doProcessInit:
  3262. readSz = RECORD_HEADER_SZ;
  3263. #ifdef CYASSL_DTLS
  3264. if (ssl->options.dtls)
  3265. readSz = DTLS_RECORD_HEADER_SZ;
  3266. #endif
  3267. /* get header or return error */
  3268. if (!ssl->options.dtls) {
  3269. if ((ret = GetInputData(ssl, readSz)) < 0)
  3270. return ret;
  3271. } else {
  3272. #ifdef CYASSL_DTLS
  3273. /* read ahead may already have header */
  3274. used = ssl->buffers.inputBuffer.length -
  3275. ssl->buffers.inputBuffer.idx;
  3276. if (used < readSz)
  3277. if ((ret = GetInputData(ssl, readSz)) < 0)
  3278. return ret;
  3279. #endif
  3280. }
  3281. #ifndef NO_CYASSL_SERVER
  3282. /* see if sending SSLv2 client hello */
  3283. if ( ssl->options.side == SERVER_END &&
  3284. ssl->options.clientState == NULL_STATE &&
  3285. ssl->buffers.inputBuffer.buffer[ssl->buffers.inputBuffer.idx]
  3286. != handshake) {
  3287. ssl->options.processReply = runProcessOldClientHello;
  3288. /* how many bytes need ProcessOldClientHello */
  3289. b0 =
  3290. ssl->buffers.inputBuffer.buffer[ssl->buffers.inputBuffer.idx++];
  3291. b1 =
  3292. ssl->buffers.inputBuffer.buffer[ssl->buffers.inputBuffer.idx++];
  3293. ssl->curSize = ((b0 & 0x7f) << 8) | b1;
  3294. }
  3295. else {
  3296. ssl->options.processReply = getRecordLayerHeader;
  3297. continue;
  3298. }
  3299. /* in the CYASSL_SERVER case, run the old client hello */
  3300. case runProcessOldClientHello:
  3301. /* get sz bytes or return error */
  3302. if (!ssl->options.dtls) {
  3303. if ((ret = GetInputData(ssl, ssl->curSize)) < 0)
  3304. return ret;
  3305. } else {
  3306. #ifdef CYASSL_DTLS
  3307. /* read ahead may already have */
  3308. used = ssl->buffers.inputBuffer.length -
  3309. ssl->buffers.inputBuffer.idx;
  3310. if (used < ssl->curSize)
  3311. if ((ret = GetInputData(ssl, ssl->curSize)) < 0)
  3312. return ret;
  3313. #endif /* CYASSL_DTLS */
  3314. }
  3315. ret = ProcessOldClientHello(ssl, ssl->buffers.inputBuffer.buffer,
  3316. &ssl->buffers.inputBuffer.idx,
  3317. ssl->buffers.inputBuffer.length -
  3318. ssl->buffers.inputBuffer.idx,
  3319. ssl->curSize);
  3320. if (ret < 0)
  3321. return ret;
  3322. else if (ssl->buffers.inputBuffer.idx ==
  3323. ssl->buffers.inputBuffer.length) {
  3324. ssl->options.processReply = doProcessInit;
  3325. return 0;
  3326. }
  3327. #endif /* NO_CYASSL_SERVER */
  3328. /* get the record layer header */
  3329. case getRecordLayerHeader:
  3330. ret = GetRecordHeader(ssl, ssl->buffers.inputBuffer.buffer,
  3331. &ssl->buffers.inputBuffer.idx,
  3332. &ssl->curRL, &ssl->curSize);
  3333. #ifdef CYASSL_DTLS
  3334. if (ssl->options.dtls && ret == SEQUENCE_ERROR) {
  3335. /* This message is out of order. Forget it ever happened. */
  3336. ssl->options.processReply = doProcessInit;
  3337. ssl->buffers.inputBuffer.length = 0;
  3338. ssl->buffers.inputBuffer.idx = 0;
  3339. continue;
  3340. }
  3341. #endif
  3342. if (ret != 0)
  3343. return ret;
  3344. ssl->options.processReply = getData;
  3345. /* retrieve record layer data */
  3346. case getData:
  3347. /* get sz bytes or return error */
  3348. if (!ssl->options.dtls) {
  3349. if ((ret = GetInputData(ssl, ssl->curSize)) < 0)
  3350. return ret;
  3351. } else {
  3352. #ifdef CYASSL_DTLS
  3353. /* read ahead may already have */
  3354. used = ssl->buffers.inputBuffer.length -
  3355. ssl->buffers.inputBuffer.idx;
  3356. if (used < ssl->curSize)
  3357. if ((ret = GetInputData(ssl, ssl->curSize)) < 0)
  3358. return ret;
  3359. #endif
  3360. }
  3361. ssl->options.processReply = runProcessingOneMessage;
  3362. startIdx = ssl->buffers.inputBuffer.idx; /* in case > 1 msg per */
  3363. /* the record layer is here */
  3364. case runProcessingOneMessage:
  3365. if (ssl->keys.encryptionOn && ssl->keys.decryptedCur == 0)
  3366. if (DecryptMessage(ssl, ssl->buffers.inputBuffer.buffer +
  3367. ssl->buffers.inputBuffer.idx,
  3368. ssl->curSize,
  3369. &ssl->buffers.inputBuffer.idx) < 0)
  3370. return DECRYPT_ERROR;
  3371. CYASSL_MSG("received record layer msg");
  3372. switch (ssl->curRL.type) {
  3373. case handshake :
  3374. /* debugging in DoHandShakeMsg */
  3375. if (!ssl->options.dtls) {
  3376. ret = DoHandShakeMsg(ssl,
  3377. ssl->buffers.inputBuffer.buffer,
  3378. &ssl->buffers.inputBuffer.idx,
  3379. ssl->buffers.inputBuffer.length);
  3380. }
  3381. else {
  3382. #ifdef CYASSL_DTLS
  3383. ret = DoDtlsHandShakeMsg(ssl,
  3384. ssl->buffers.inputBuffer.buffer,
  3385. &ssl->buffers.inputBuffer.idx,
  3386. ssl->buffers.inputBuffer.length);
  3387. #endif
  3388. }
  3389. if (ret != 0)
  3390. return ret;
  3391. break;
  3392. case change_cipher_spec:
  3393. CYASSL_MSG("got CHANGE CIPHER SPEC");
  3394. #ifdef CYASSL_CALLBACKS
  3395. if (ssl->hsInfoOn)
  3396. AddPacketName("ChangeCipher", &ssl->handShakeInfo);
  3397. /* add record header back on info */
  3398. if (ssl->toInfoOn) {
  3399. AddPacketInfo("ChangeCipher", &ssl->timeoutInfo,
  3400. ssl->buffers.inputBuffer.buffer +
  3401. ssl->buffers.inputBuffer.idx - RECORD_HEADER_SZ,
  3402. 1 + RECORD_HEADER_SZ, ssl->heap);
  3403. AddLateRecordHeader(&ssl->curRL, &ssl->timeoutInfo);
  3404. }
  3405. #endif
  3406. if (ssl->curSize != 1) {
  3407. CYASSL_MSG("Malicious or corrupted ChangeCipher msg");
  3408. return LENGTH_ERROR;
  3409. }
  3410. ssl->buffers.inputBuffer.idx++;
  3411. ssl->keys.encryptionOn = 1;
  3412. #ifdef CYASSL_DTLS
  3413. if (ssl->options.dtls) {
  3414. DtlsPoolReset(ssl);
  3415. ssl->keys.dtls_expected_peer_epoch++;
  3416. ssl->keys.dtls_expected_peer_sequence_number = 0;
  3417. }
  3418. #endif
  3419. #ifdef HAVE_LIBZ
  3420. if (ssl->options.usingCompression)
  3421. if ( (ret = InitStreams(ssl)) != 0)
  3422. return ret;
  3423. #endif
  3424. if (ssl->options.resuming && ssl->options.side ==
  3425. CLIENT_END)
  3426. BuildFinished(ssl, &ssl->verifyHashes, server);
  3427. else if (!ssl->options.resuming && ssl->options.side ==
  3428. SERVER_END)
  3429. BuildFinished(ssl, &ssl->verifyHashes, client);
  3430. break;
  3431. case application_data:
  3432. CYASSL_MSG("got app DATA");
  3433. if ((ret = DoApplicationData(ssl,
  3434. ssl->buffers.inputBuffer.buffer,
  3435. &ssl->buffers.inputBuffer.idx))
  3436. != 0) {
  3437. CYASSL_ERROR(ret);
  3438. return ret;
  3439. }
  3440. break;
  3441. case alert:
  3442. CYASSL_MSG("got ALERT!");
  3443. if (DoAlert(ssl, ssl->buffers.inputBuffer.buffer,
  3444. &ssl->buffers.inputBuffer.idx, &type) == alert_fatal)
  3445. return FATAL_ERROR;
  3446. /* catch warnings that are handled as errors */
  3447. if (type == close_notify)
  3448. return ssl->error = ZERO_RETURN;
  3449. if (type == decrypt_error)
  3450. return FATAL_ERROR;
  3451. break;
  3452. default:
  3453. CYASSL_ERROR(UNKNOWN_RECORD_TYPE);
  3454. return UNKNOWN_RECORD_TYPE;
  3455. }
  3456. ssl->options.processReply = doProcessInit;
  3457. /* input exhausted? */
  3458. if (ssl->buffers.inputBuffer.idx == ssl->buffers.inputBuffer.length)
  3459. return 0;
  3460. /* more messages per record */
  3461. else if ((ssl->buffers.inputBuffer.idx - startIdx) < ssl->curSize) {
  3462. CYASSL_MSG("More messages in record");
  3463. #ifdef CYASSL_DTLS
  3464. /* read-ahead but dtls doesn't bundle messages per record */
  3465. if (ssl->options.dtls) {
  3466. ssl->options.processReply = doProcessInit;
  3467. continue;
  3468. }
  3469. #endif
  3470. ssl->options.processReply = runProcessingOneMessage;
  3471. continue;
  3472. }
  3473. /* more records */
  3474. else {
  3475. CYASSL_MSG("More records in input");
  3476. ssl->options.processReply = doProcessInit;
  3477. continue;
  3478. }
  3479. default:
  3480. CYASSL_MSG("Bad process input state, programming error");
  3481. return INPUT_CASE_ERROR;
  3482. }
  3483. }
  3484. }
  3485. int SendChangeCipher(CYASSL* ssl)
  3486. {
  3487. byte *output;
  3488. int sendSz = RECORD_HEADER_SZ + ENUM_LEN;
  3489. int idx = RECORD_HEADER_SZ;
  3490. int ret;
  3491. #ifdef CYASSL_DTLS
  3492. if (ssl->options.dtls) {
  3493. sendSz += DTLS_RECORD_EXTRA;
  3494. idx += DTLS_RECORD_EXTRA;
  3495. }
  3496. #endif
  3497. /* check for avalaible size */
  3498. if ((ret = CheckAvalaibleSize(ssl, sendSz)) != 0)
  3499. return ret;
  3500. /* get ouput buffer */
  3501. output = ssl->buffers.outputBuffer.buffer +
  3502. ssl->buffers.outputBuffer.length;
  3503. AddRecordHeader(output, 1, change_cipher_spec, ssl);
  3504. output[idx] = 1; /* turn it on */
  3505. #ifdef CYASSL_DTLS
  3506. if (ssl->options.dtls) {
  3507. if ((ret = DtlsPoolSave(ssl, output, sendSz)) != 0)
  3508. return ret;
  3509. }
  3510. #endif
  3511. #ifdef CYASSL_CALLBACKS
  3512. if (ssl->hsInfoOn) AddPacketName("ChangeCipher", &ssl->handShakeInfo);
  3513. if (ssl->toInfoOn)
  3514. AddPacketInfo("ChangeCipher", &ssl->timeoutInfo, output, sendSz,
  3515. ssl->heap);
  3516. #endif
  3517. ssl->buffers.outputBuffer.length += sendSz;
  3518. if (ssl->options.groupMessages)
  3519. return 0;
  3520. else
  3521. return SendBuffered(ssl);
  3522. }
  3523. static INLINE const byte* GetMacSecret(CYASSL* ssl, int verify)
  3524. {
  3525. if ( (ssl->options.side == CLIENT_END && !verify) ||
  3526. (ssl->options.side == SERVER_END && verify) )
  3527. return ssl->keys.client_write_MAC_secret;
  3528. else
  3529. return ssl->keys.server_write_MAC_secret;
  3530. }
  3531. #ifndef NO_OLD_TLS
  3532. static void Hmac(CYASSL* ssl, byte* digest, const byte* in, word32 sz,
  3533. int content, int verify)
  3534. {
  3535. byte result[SHA256_DIGEST_SIZE]; /* max possible sizes */
  3536. word32 digestSz = ssl->specs.hash_size; /* actual sizes */
  3537. word32 padSz = ssl->specs.pad_size;
  3538. Md5 md5;
  3539. Sha sha;
  3540. /* data */
  3541. byte seq[SEQ_SZ];
  3542. byte conLen[ENUM_LEN + LENGTH_SZ]; /* content & length */
  3543. const byte* macSecret = GetMacSecret(ssl, verify);
  3544. XMEMSET(seq, 0, SEQ_SZ);
  3545. conLen[0] = (byte)content;
  3546. c16toa((word16)sz, &conLen[ENUM_LEN]);
  3547. c32toa(GetSEQIncrement(ssl, verify), &seq[sizeof(word32)]);
  3548. if (ssl->specs.mac_algorithm == md5_mac) {
  3549. InitMd5(&md5);
  3550. /* inner */
  3551. Md5Update(&md5, macSecret, digestSz);
  3552. Md5Update(&md5, PAD1, padSz);
  3553. Md5Update(&md5, seq, SEQ_SZ);
  3554. Md5Update(&md5, conLen, sizeof(conLen));
  3555. /* in buffer */
  3556. Md5Update(&md5, in, sz);
  3557. Md5Final(&md5, result);
  3558. /* outer */
  3559. Md5Update(&md5, macSecret, digestSz);
  3560. Md5Update(&md5, PAD2, padSz);
  3561. Md5Update(&md5, result, digestSz);
  3562. Md5Final(&md5, digest);
  3563. }
  3564. else {
  3565. InitSha(&sha);
  3566. /* inner */
  3567. ShaUpdate(&sha, macSecret, digestSz);
  3568. ShaUpdate(&sha, PAD1, padSz);
  3569. ShaUpdate(&sha, seq, SEQ_SZ);
  3570. ShaUpdate(&sha, conLen, sizeof(conLen));
  3571. /* in buffer */
  3572. ShaUpdate(&sha, in, sz);
  3573. ShaFinal(&sha, result);
  3574. /* outer */
  3575. ShaUpdate(&sha, macSecret, digestSz);
  3576. ShaUpdate(&sha, PAD2, padSz);
  3577. ShaUpdate(&sha, result, digestSz);
  3578. ShaFinal(&sha, digest);
  3579. }
  3580. }
  3581. static void BuildMD5_CertVerify(CYASSL* ssl, byte* digest)
  3582. {
  3583. byte md5_result[MD5_DIGEST_SIZE];
  3584. /* make md5 inner */
  3585. Md5Update(&ssl->hashMd5, ssl->arrays->masterSecret, SECRET_LEN);
  3586. Md5Update(&ssl->hashMd5, PAD1, PAD_MD5);
  3587. Md5Final(&ssl->hashMd5, md5_result);
  3588. /* make md5 outer */
  3589. Md5Update(&ssl->hashMd5, ssl->arrays->masterSecret, SECRET_LEN);
  3590. Md5Update(&ssl->hashMd5, PAD2, PAD_MD5);
  3591. Md5Update(&ssl->hashMd5, md5_result, MD5_DIGEST_SIZE);
  3592. Md5Final(&ssl->hashMd5, digest);
  3593. }
  3594. static void BuildSHA_CertVerify(CYASSL* ssl, byte* digest)
  3595. {
  3596. byte sha_result[SHA_DIGEST_SIZE];
  3597. /* make sha inner */
  3598. ShaUpdate(&ssl->hashSha, ssl->arrays->masterSecret, SECRET_LEN);
  3599. ShaUpdate(&ssl->hashSha, PAD1, PAD_SHA);
  3600. ShaFinal(&ssl->hashSha, sha_result);
  3601. /* make sha outer */
  3602. ShaUpdate(&ssl->hashSha, ssl->arrays->masterSecret, SECRET_LEN);
  3603. ShaUpdate(&ssl->hashSha, PAD2, PAD_SHA);
  3604. ShaUpdate(&ssl->hashSha, sha_result, SHA_DIGEST_SIZE);
  3605. ShaFinal(&ssl->hashSha, digest);
  3606. }
  3607. static void BuildCertHashes(CYASSL* ssl, Hashes* hashes)
  3608. {
  3609. /* store current states, building requires get_digest which resets state */
  3610. Md5 md5 = ssl->hashMd5;
  3611. Sha sha = ssl->hashSha;
  3612. #ifndef NO_SHA256 /* for possible future changes */
  3613. Sha256 sha256;
  3614. InitSha256(&sha256);
  3615. if (IsAtLeastTLSv1_2(ssl))
  3616. sha256 = ssl->hashSha256;
  3617. #endif
  3618. if (ssl->options.tls) {
  3619. Md5Final(&ssl->hashMd5, hashes->md5);
  3620. ShaFinal(&ssl->hashSha, hashes->sha);
  3621. }
  3622. else {
  3623. BuildMD5_CertVerify(ssl, hashes->md5);
  3624. BuildSHA_CertVerify(ssl, hashes->sha);
  3625. }
  3626. /* restore */
  3627. ssl->hashMd5 = md5;
  3628. ssl->hashSha = sha;
  3629. #ifndef NO_SHA256
  3630. if (IsAtLeastTLSv1_2(ssl))
  3631. ssl->hashSha256 = sha256;
  3632. #endif
  3633. }
  3634. #endif
  3635. /* Build SSL Message, encrypted */
  3636. static int BuildMessage(CYASSL* ssl, byte* output, const byte* input, int inSz,
  3637. int type)
  3638. {
  3639. word32 digestSz = ssl->specs.hash_size;
  3640. word32 sz = RECORD_HEADER_SZ + inSz + digestSz;
  3641. word32 pad = 0, i;
  3642. word32 idx = RECORD_HEADER_SZ;
  3643. word32 ivSz = 0; /* TLSv1.1 IV */
  3644. word32 headerSz = RECORD_HEADER_SZ;
  3645. word16 size;
  3646. byte iv[AES_BLOCK_SIZE]; /* max size */
  3647. int ret = 0;
  3648. #ifdef CYASSL_DTLS
  3649. if (ssl->options.dtls) {
  3650. sz += DTLS_RECORD_EXTRA;
  3651. idx += DTLS_RECORD_EXTRA;
  3652. headerSz += DTLS_RECORD_EXTRA;
  3653. }
  3654. #endif
  3655. if (ssl->specs.cipher_type == block) {
  3656. word32 blockSz = ssl->specs.block_size;
  3657. if (ssl->options.tls1_1) {
  3658. ivSz = blockSz;
  3659. sz += ivSz;
  3660. RNG_GenerateBlock(ssl->rng, iv, ivSz);
  3661. }
  3662. sz += 1; /* pad byte */
  3663. pad = (sz - headerSz) % blockSz;
  3664. pad = blockSz - pad;
  3665. sz += pad;
  3666. }
  3667. #ifdef HAVE_AEAD
  3668. if (ssl->specs.cipher_type == aead) {
  3669. ivSz = AEAD_EXP_IV_SZ;
  3670. sz += (ivSz + 16 - digestSz);
  3671. XMEMCPY(iv, ssl->keys.aead_exp_IV, AEAD_EXP_IV_SZ);
  3672. }
  3673. #endif
  3674. size = (word16)(sz - headerSz); /* include mac and digest */
  3675. AddRecordHeader(output, size, (byte)type, ssl);
  3676. /* write to output */
  3677. if (ivSz) {
  3678. XMEMCPY(output + idx, iv, min(ivSz, sizeof(iv)));
  3679. idx += ivSz;
  3680. }
  3681. XMEMCPY(output + idx, input, inSz);
  3682. idx += inSz;
  3683. if (type == handshake) {
  3684. #ifdef CYASSL_DTLS
  3685. if (ssl->options.dtls) {
  3686. if ((ret = DtlsPoolSave(ssl, output, headerSz+inSz)) != 0)
  3687. return ret;
  3688. }
  3689. #endif
  3690. HashOutput(ssl, output, headerSz + inSz, ivSz);
  3691. }
  3692. if (ssl->specs.cipher_type != aead) {
  3693. ssl->hmac(ssl, output+idx, output + headerSz + ivSz, inSz, type, 0);
  3694. idx += digestSz;
  3695. }
  3696. if (ssl->specs.cipher_type == block)
  3697. for (i = 0; i <= pad; i++)
  3698. output[idx++] = (byte)pad; /* pad byte gets pad value too */
  3699. if ( (ret = Encrypt(ssl, output + headerSz, output + headerSz, size)) != 0)
  3700. return ret;
  3701. return sz;
  3702. }
  3703. int SendFinished(CYASSL* ssl)
  3704. {
  3705. int sendSz,
  3706. finishedSz = ssl->options.tls ? TLS_FINISHED_SZ :
  3707. FINISHED_SZ;
  3708. byte input[FINISHED_SZ + DTLS_HANDSHAKE_HEADER_SZ]; /* max */
  3709. byte *output;
  3710. Hashes* hashes;
  3711. int ret;
  3712. int headerSz = HANDSHAKE_HEADER_SZ;
  3713. #ifdef CYASSL_DTLS
  3714. if (ssl->options.dtls) {
  3715. headerSz += DTLS_HANDSHAKE_EXTRA;
  3716. ssl->keys.dtls_epoch++;
  3717. ssl->keys.dtls_sequence_number = 0; /* reset after epoch change */
  3718. }
  3719. #endif
  3720. /* check for avalaible size */
  3721. if ((ret = CheckAvalaibleSize(ssl, sizeof(input) + MAX_MSG_EXTRA)) != 0)
  3722. return ret;
  3723. /* get ouput buffer */
  3724. output = ssl->buffers.outputBuffer.buffer +
  3725. ssl->buffers.outputBuffer.length;
  3726. AddHandShakeHeader(input, finishedSz, finished, ssl);
  3727. /* make finished hashes */
  3728. hashes = (Hashes*)&input[headerSz];
  3729. BuildFinished(ssl, hashes, ssl->options.side == CLIENT_END ? client :
  3730. server);
  3731. if ( (sendSz = BuildMessage(ssl, output, input, headerSz +
  3732. finishedSz, handshake)) < 0)
  3733. return BUILD_MSG_ERROR;
  3734. if (!ssl->options.resuming) {
  3735. #ifndef NO_SESSION_CACHE
  3736. AddSession(ssl); /* just try */
  3737. #endif
  3738. if (ssl->options.side == CLIENT_END)
  3739. BuildFinished(ssl, &ssl->verifyHashes, server);
  3740. else
  3741. ssl->options.handShakeState = HANDSHAKE_DONE;
  3742. }
  3743. else {
  3744. if (ssl->options.side == CLIENT_END)
  3745. ssl->options.handShakeState = HANDSHAKE_DONE;
  3746. else
  3747. BuildFinished(ssl, &ssl->verifyHashes, client);
  3748. }
  3749. #ifdef CYASSL_DTLS
  3750. if (ssl->options.dtls) {
  3751. if ((ret = DtlsPoolSave(ssl, output, sendSz)) != 0)
  3752. return ret;
  3753. }
  3754. #endif
  3755. #ifdef CYASSL_CALLBACKS
  3756. if (ssl->hsInfoOn) AddPacketName("Finished", &ssl->handShakeInfo);
  3757. if (ssl->toInfoOn)
  3758. AddPacketInfo("Finished", &ssl->timeoutInfo, output, sendSz,
  3759. ssl->heap);
  3760. #endif
  3761. ssl->buffers.outputBuffer.length += sendSz;
  3762. return SendBuffered(ssl);
  3763. }
  3764. #ifndef NO_CERTS
  3765. int SendCertificate(CYASSL* ssl)
  3766. {
  3767. int sendSz, length, ret = 0;
  3768. word32 i = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  3769. word32 certSz, listSz;
  3770. byte* output = 0;
  3771. if (ssl->options.usingPSK_cipher) return 0; /* not needed */
  3772. if (ssl->options.sendVerify == SEND_BLANK_CERT) {
  3773. certSz = 0;
  3774. length = CERT_HEADER_SZ;
  3775. listSz = 0;
  3776. }
  3777. else {
  3778. certSz = ssl->buffers.certificate.length;
  3779. /* list + cert size */
  3780. length = certSz + 2 * CERT_HEADER_SZ;
  3781. listSz = certSz + CERT_HEADER_SZ;
  3782. /* may need to send rest of chain, already has leading size(s) */
  3783. if (ssl->buffers.certChain.buffer) {
  3784. length += ssl->buffers.certChain.length;
  3785. listSz += ssl->buffers.certChain.length;
  3786. }
  3787. }
  3788. sendSz = length + RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  3789. #ifdef CYASSL_DTLS
  3790. if (ssl->options.dtls) {
  3791. sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  3792. i += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  3793. }
  3794. #endif
  3795. /* check for avalaible size */
  3796. if ((ret = CheckAvalaibleSize(ssl, sendSz)) != 0)
  3797. return ret;
  3798. /* get ouput buffer */
  3799. output = ssl->buffers.outputBuffer.buffer +
  3800. ssl->buffers.outputBuffer.length;
  3801. AddHeaders(output, length, certificate, ssl);
  3802. /* list total */
  3803. c32to24(listSz, output + i);
  3804. i += CERT_HEADER_SZ;
  3805. /* member */
  3806. if (certSz) {
  3807. c32to24(certSz, output + i);
  3808. i += CERT_HEADER_SZ;
  3809. XMEMCPY(output + i, ssl->buffers.certificate.buffer, certSz);
  3810. i += certSz;
  3811. /* send rest of chain? */
  3812. if (ssl->buffers.certChain.buffer) {
  3813. XMEMCPY(output + i, ssl->buffers.certChain.buffer,
  3814. ssl->buffers.certChain.length);
  3815. /* if add more to output adjust i
  3816. i += ssl->buffers.certChain.length; */
  3817. }
  3818. }
  3819. #ifdef CYASSL_DTLS
  3820. if (ssl->options.dtls) {
  3821. if ((ret = DtlsPoolSave(ssl, output, sendSz)) != 0)
  3822. return ret;
  3823. }
  3824. #endif
  3825. HashOutput(ssl, output, sendSz, 0);
  3826. #ifdef CYASSL_CALLBACKS
  3827. if (ssl->hsInfoOn) AddPacketName("Certificate", &ssl->handShakeInfo);
  3828. if (ssl->toInfoOn)
  3829. AddPacketInfo("Certificate", &ssl->timeoutInfo, output, sendSz,
  3830. ssl->heap);
  3831. #endif
  3832. if (ssl->options.side == SERVER_END)
  3833. ssl->options.serverState = SERVER_CERT_COMPLETE;
  3834. ssl->buffers.outputBuffer.length += sendSz;
  3835. if (ssl->options.groupMessages)
  3836. return 0;
  3837. else
  3838. return SendBuffered(ssl);
  3839. }
  3840. int SendCertificateRequest(CYASSL* ssl)
  3841. {
  3842. byte *output;
  3843. int ret;
  3844. int sendSz;
  3845. word32 i = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  3846. int typeTotal = 1; /* only rsa for now */
  3847. int reqSz = ENUM_LEN + typeTotal + REQ_HEADER_SZ; /* add auth later */
  3848. if (IsAtLeastTLSv1_2(ssl))
  3849. reqSz += LENGTH_SZ + HASH_SIG_SIZE;
  3850. if (ssl->options.usingPSK_cipher) return 0; /* not needed */
  3851. sendSz = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ + reqSz;
  3852. #ifdef CYASSL_DTLS
  3853. if (ssl->options.dtls) {
  3854. sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  3855. i += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  3856. }
  3857. #endif
  3858. /* check for avalaible size */
  3859. if ((ret = CheckAvalaibleSize(ssl, sendSz)) != 0)
  3860. return ret;
  3861. /* get ouput buffer */
  3862. output = ssl->buffers.outputBuffer.buffer +
  3863. ssl->buffers.outputBuffer.length;
  3864. AddHeaders(output, reqSz, certificate_request, ssl);
  3865. /* write to output */
  3866. output[i++] = (byte)typeTotal; /* # of types */
  3867. output[i++] = rsa_sign;
  3868. /* supported hash/sig */
  3869. if (IsAtLeastTLSv1_2(ssl)) {
  3870. c16toa(HASH_SIG_SIZE, &output[i]);
  3871. i += LENGTH_SZ;
  3872. output[i++] = sha_mac; /* hash */
  3873. output[i++] = rsa_sa_algo; /* sig */
  3874. }
  3875. c16toa(0, &output[i]); /* auth's */
  3876. /* if add more to output, adjust i
  3877. i += REQ_HEADER_SZ; */
  3878. #ifdef CYASSL_DTLS
  3879. if (ssl->options.dtls) {
  3880. if ((ret = DtlsPoolSave(ssl, output, sendSz)) != 0)
  3881. return ret;
  3882. }
  3883. #endif
  3884. HashOutput(ssl, output, sendSz, 0);
  3885. #ifdef CYASSL_CALLBACKS
  3886. if (ssl->hsInfoOn)
  3887. AddPacketName("CertificateRequest", &ssl->handShakeInfo);
  3888. if (ssl->toInfoOn)
  3889. AddPacketInfo("CertificateRequest", &ssl->timeoutInfo, output,
  3890. sendSz, ssl->heap);
  3891. #endif
  3892. ssl->buffers.outputBuffer.length += sendSz;
  3893. if (ssl->options.groupMessages)
  3894. return 0;
  3895. else
  3896. return SendBuffered(ssl);
  3897. }
  3898. #endif /* !NO_CERTS */
  3899. int SendData(CYASSL* ssl, const void* data, int sz)
  3900. {
  3901. int sent = 0, /* plainText size */
  3902. sendSz,
  3903. ret;
  3904. if (ssl->error == WANT_WRITE)
  3905. ssl->error = 0;
  3906. if (ssl->options.handShakeState != HANDSHAKE_DONE) {
  3907. int err;
  3908. CYASSL_MSG("handshake not complete, trying to finish");
  3909. if ( (err = CyaSSL_negotiate(ssl)) != 0)
  3910. return err;
  3911. }
  3912. /* last time system socket output buffer was full, try again to send */
  3913. if (ssl->buffers.outputBuffer.length > 0) {
  3914. CYASSL_MSG("output buffer was full, trying to send again");
  3915. if ( (ssl->error = SendBuffered(ssl)) < 0) {
  3916. CYASSL_ERROR(ssl->error);
  3917. if (ssl->error == SOCKET_ERROR_E && ssl->options.connReset)
  3918. return 0; /* peer reset */
  3919. return ssl->error;
  3920. }
  3921. else {
  3922. /* advance sent to previous sent + plain size just sent */
  3923. sent = ssl->buffers.prevSent + ssl->buffers.plainSz;
  3924. CYASSL_MSG("sent write buffered data");
  3925. }
  3926. }
  3927. for (;;) {
  3928. int len = min(sz - sent, OUTPUT_RECORD_SIZE);
  3929. byte* out;
  3930. byte* sendBuffer = (byte*)data + sent; /* may switch on comp */
  3931. int buffSz = len; /* may switch on comp */
  3932. #ifdef HAVE_LIBZ
  3933. byte comp[MAX_RECORD_SIZE + MAX_COMP_EXTRA];
  3934. #endif
  3935. if (sent == sz) break;
  3936. #ifdef CYASSL_DTLS
  3937. if (ssl->options.dtls) {
  3938. len = min(len, MAX_UDP_SIZE);
  3939. buffSz = len;
  3940. }
  3941. #endif
  3942. /* check for avalaible size */
  3943. if ((ret = CheckAvalaibleSize(ssl, len + COMP_EXTRA +
  3944. MAX_MSG_EXTRA)) != 0)
  3945. return ret;
  3946. /* get ouput buffer */
  3947. out = ssl->buffers.outputBuffer.buffer +
  3948. ssl->buffers.outputBuffer.length;
  3949. #ifdef HAVE_LIBZ
  3950. if (ssl->options.usingCompression) {
  3951. buffSz = Compress(ssl, sendBuffer, buffSz, comp, sizeof(comp));
  3952. if (buffSz < 0) {
  3953. return buffSz;
  3954. }
  3955. sendBuffer = comp;
  3956. }
  3957. #endif
  3958. sendSz = BuildMessage(ssl, out, sendBuffer, buffSz,
  3959. application_data);
  3960. ssl->buffers.outputBuffer.length += sendSz;
  3961. if ( (ret = SendBuffered(ssl)) < 0) {
  3962. CYASSL_ERROR(ret);
  3963. /* store for next call if WANT_WRITE or user embedSend() that
  3964. doesn't present like WANT_WRITE */
  3965. ssl->buffers.plainSz = len;
  3966. ssl->buffers.prevSent = sent;
  3967. if (ret == SOCKET_ERROR_E && ssl->options.connReset)
  3968. return 0; /* peer reset */
  3969. return ssl->error = ret;
  3970. }
  3971. sent += len;
  3972. /* only one message per attempt */
  3973. if (ssl->options.partialWrite == 1) {
  3974. CYASSL_MSG("Paritial Write on, only sending one record");
  3975. break;
  3976. }
  3977. }
  3978. return sent;
  3979. }
  3980. /* process input data */
  3981. int ReceiveData(CYASSL* ssl, byte* output, int sz, int peek)
  3982. {
  3983. int size;
  3984. CYASSL_ENTER("ReceiveData()");
  3985. if (ssl->error == WANT_READ)
  3986. ssl->error = 0;
  3987. if (ssl->options.handShakeState != HANDSHAKE_DONE) {
  3988. int err;
  3989. CYASSL_MSG("Handshake not complete, trying to finish");
  3990. if ( (err = CyaSSL_negotiate(ssl)) != 0)
  3991. return err;
  3992. }
  3993. while (ssl->buffers.clearOutputBuffer.length == 0)
  3994. if ( (ssl->error = ProcessReply(ssl)) < 0) {
  3995. CYASSL_ERROR(ssl->error);
  3996. if (ssl->error == ZERO_RETURN) {
  3997. CYASSL_MSG("Zero return, no more data coming");
  3998. ssl->options.isClosed = 1;
  3999. return 0; /* no more data coming */
  4000. }
  4001. if (ssl->error == SOCKET_ERROR_E) {
  4002. if (ssl->options.connReset || ssl->options.isClosed) {
  4003. CYASSL_MSG("Peer reset or closed, connection done");
  4004. return 0; /* peer reset or closed */
  4005. }
  4006. }
  4007. return ssl->error;
  4008. }
  4009. if (sz < (int)ssl->buffers.clearOutputBuffer.length)
  4010. size = sz;
  4011. else
  4012. size = ssl->buffers.clearOutputBuffer.length;
  4013. XMEMCPY(output, ssl->buffers.clearOutputBuffer.buffer, size);
  4014. if (peek == 0) {
  4015. ssl->buffers.clearOutputBuffer.length -= size;
  4016. ssl->buffers.clearOutputBuffer.buffer += size;
  4017. }
  4018. if (ssl->buffers.clearOutputBuffer.length == 0 &&
  4019. ssl->buffers.inputBuffer.dynamicFlag)
  4020. ShrinkInputBuffer(ssl, NO_FORCED_FREE);
  4021. CYASSL_LEAVE("ReceiveData()", size);
  4022. return size;
  4023. }
  4024. /* send alert message */
  4025. int SendAlert(CYASSL* ssl, int severity, int type)
  4026. {
  4027. byte input[ALERT_SIZE];
  4028. byte *output;
  4029. int sendSz;
  4030. int ret;
  4031. /* if sendalert is called again for nonbloking */
  4032. if (ssl->options.sendAlertState != 0) {
  4033. ret = SendBuffered(ssl);
  4034. if (ret == 0)
  4035. ssl->options.sendAlertState = 0;
  4036. return ret;
  4037. }
  4038. /* check for avalaible size */
  4039. if ((ret = CheckAvalaibleSize(ssl, ALERT_SIZE + MAX_MSG_EXTRA)) != 0)
  4040. return ret;
  4041. /* get ouput buffer */
  4042. output = ssl->buffers.outputBuffer.buffer +
  4043. ssl->buffers.outputBuffer.length;
  4044. input[0] = (byte)severity;
  4045. input[1] = (byte)type;
  4046. /* only send encrypted alert if handshake actually complete, otherwise
  4047. other side may not be able to handle it */
  4048. if (ssl->keys.encryptionOn && ssl->options.handShakeState == HANDSHAKE_DONE)
  4049. sendSz = BuildMessage(ssl, output, input, ALERT_SIZE, alert);
  4050. else {
  4051. AddRecordHeader(output, ALERT_SIZE, alert, ssl);
  4052. output += RECORD_HEADER_SZ;
  4053. #ifdef CYASSL_DTLS
  4054. output += DTLS_RECORD_EXTRA;
  4055. #endif
  4056. XMEMCPY(output, input, ALERT_SIZE);
  4057. sendSz = RECORD_HEADER_SZ + ALERT_SIZE;
  4058. #ifdef CYASSL_DTLS
  4059. sendSz += DTLS_RECORD_EXTRA;
  4060. #endif
  4061. }
  4062. #ifdef CYASSL_CALLBACKS
  4063. if (ssl->hsInfoOn)
  4064. AddPacketName("Alert", &ssl->handShakeInfo);
  4065. if (ssl->toInfoOn)
  4066. AddPacketInfo("Alert", &ssl->timeoutInfo, output, sendSz,ssl->heap);
  4067. #endif
  4068. ssl->buffers.outputBuffer.length += sendSz;
  4069. ssl->options.sendAlertState = 1;
  4070. return SendBuffered(ssl);
  4071. }
  4072. void SetErrorString(int error, char* str)
  4073. {
  4074. const int max = MAX_ERROR_SZ; /* shorthand */
  4075. #ifdef NO_ERROR_STRINGS
  4076. (void)error;
  4077. XSTRNCPY(str, "no support for error strings built in", max);
  4078. #else
  4079. /* pass to CTaoCrypt */
  4080. if (error < MAX_CODE_E && error > MIN_CODE_E) {
  4081. CTaoCryptErrorString(error, str);
  4082. return;
  4083. }
  4084. switch (error) {
  4085. case UNSUPPORTED_SUITE :
  4086. XSTRNCPY(str, "unsupported cipher suite", max);
  4087. break;
  4088. case INPUT_CASE_ERROR :
  4089. XSTRNCPY(str, "input state error", max);
  4090. break;
  4091. case PREFIX_ERROR :
  4092. XSTRNCPY(str, "bad index to key rounds", max);
  4093. break;
  4094. case MEMORY_ERROR :
  4095. XSTRNCPY(str, "out of memory", max);
  4096. break;
  4097. case VERIFY_FINISHED_ERROR :
  4098. XSTRNCPY(str, "verify problem on finished", max);
  4099. break;
  4100. case VERIFY_MAC_ERROR :
  4101. XSTRNCPY(str, "verify mac problem", max);
  4102. break;
  4103. case PARSE_ERROR :
  4104. XSTRNCPY(str, "parse error on header", max);
  4105. break;
  4106. case SIDE_ERROR :
  4107. XSTRNCPY(str, "wrong client/server type", max);
  4108. break;
  4109. case NO_PEER_CERT :
  4110. XSTRNCPY(str, "peer didn't send cert", max);
  4111. break;
  4112. case UNKNOWN_HANDSHAKE_TYPE :
  4113. XSTRNCPY(str, "weird handshake type", max);
  4114. break;
  4115. case SOCKET_ERROR_E :
  4116. XSTRNCPY(str, "error state on socket", max);
  4117. break;
  4118. case SOCKET_NODATA :
  4119. XSTRNCPY(str, "expected data, not there", max);
  4120. break;
  4121. case INCOMPLETE_DATA :
  4122. XSTRNCPY(str, "don't have enough data to complete task", max);
  4123. break;
  4124. case UNKNOWN_RECORD_TYPE :
  4125. XSTRNCPY(str, "unknown type in record hdr", max);
  4126. break;
  4127. case DECRYPT_ERROR :
  4128. XSTRNCPY(str, "error during decryption", max);
  4129. break;
  4130. case FATAL_ERROR :
  4131. XSTRNCPY(str, "revcd alert fatal error", max);
  4132. break;
  4133. case ENCRYPT_ERROR :
  4134. XSTRNCPY(str, "error during encryption", max);
  4135. break;
  4136. case FREAD_ERROR :
  4137. XSTRNCPY(str, "fread problem", max);
  4138. break;
  4139. case NO_PEER_KEY :
  4140. XSTRNCPY(str, "need peer's key", max);
  4141. break;
  4142. case NO_PRIVATE_KEY :
  4143. XSTRNCPY(str, "need the private key", max);
  4144. break;
  4145. case NO_DH_PARAMS :
  4146. XSTRNCPY(str, "server missing DH params", max);
  4147. break;
  4148. case RSA_PRIVATE_ERROR :
  4149. XSTRNCPY(str, "error during rsa priv op", max);
  4150. break;
  4151. case MATCH_SUITE_ERROR :
  4152. XSTRNCPY(str, "can't match cipher suite", max);
  4153. break;
  4154. case BUILD_MSG_ERROR :
  4155. XSTRNCPY(str, "build message failure", max);
  4156. break;
  4157. case BAD_HELLO :
  4158. XSTRNCPY(str, "client hello malformed", max);
  4159. break;
  4160. case DOMAIN_NAME_MISMATCH :
  4161. XSTRNCPY(str, "peer subject name mismatch", max);
  4162. break;
  4163. case WANT_READ :
  4164. case SSL_ERROR_WANT_READ :
  4165. XSTRNCPY(str, "non-blocking socket wants data to be read", max);
  4166. break;
  4167. case NOT_READY_ERROR :
  4168. XSTRNCPY(str, "handshake layer not ready yet, complete first", max);
  4169. break;
  4170. case PMS_VERSION_ERROR :
  4171. XSTRNCPY(str, "premaster secret version mismatch error", max);
  4172. break;
  4173. case VERSION_ERROR :
  4174. XSTRNCPY(str, "record layer version error", max);
  4175. break;
  4176. case WANT_WRITE :
  4177. case SSL_ERROR_WANT_WRITE :
  4178. XSTRNCPY(str, "non-blocking socket write buffer full", max);
  4179. break;
  4180. case BUFFER_ERROR :
  4181. XSTRNCPY(str, "malformed buffer input error", max);
  4182. break;
  4183. case VERIFY_CERT_ERROR :
  4184. XSTRNCPY(str, "verify problem on certificate", max);
  4185. break;
  4186. case VERIFY_SIGN_ERROR :
  4187. XSTRNCPY(str, "verify problem based on signature", max);
  4188. break;
  4189. case CLIENT_ID_ERROR :
  4190. XSTRNCPY(str, "psk client identity error", max);
  4191. break;
  4192. case SERVER_HINT_ERROR:
  4193. XSTRNCPY(str, "psk server hint error", max);
  4194. break;
  4195. case PSK_KEY_ERROR:
  4196. XSTRNCPY(str, "psk key callback error", max);
  4197. break;
  4198. case NTRU_KEY_ERROR:
  4199. XSTRNCPY(str, "NTRU key error", max);
  4200. break;
  4201. case NTRU_DRBG_ERROR:
  4202. XSTRNCPY(str, "NTRU drbg error", max);
  4203. break;
  4204. case NTRU_ENCRYPT_ERROR:
  4205. XSTRNCPY(str, "NTRU encrypt error", max);
  4206. break;
  4207. case NTRU_DECRYPT_ERROR:
  4208. XSTRNCPY(str, "NTRU decrypt error", max);
  4209. break;
  4210. case ZLIB_INIT_ERROR:
  4211. XSTRNCPY(str, "zlib init error", max);
  4212. break;
  4213. case ZLIB_COMPRESS_ERROR:
  4214. XSTRNCPY(str, "zlib compress error", max);
  4215. break;
  4216. case ZLIB_DECOMPRESS_ERROR:
  4217. XSTRNCPY(str, "zlib decompress error", max);
  4218. break;
  4219. case GETTIME_ERROR:
  4220. XSTRNCPY(str, "gettimeofday() error", max);
  4221. break;
  4222. case GETITIMER_ERROR:
  4223. XSTRNCPY(str, "getitimer() error", max);
  4224. break;
  4225. case SIGACT_ERROR:
  4226. XSTRNCPY(str, "sigaction() error", max);
  4227. break;
  4228. case SETITIMER_ERROR:
  4229. XSTRNCPY(str, "setitimer() error", max);
  4230. break;
  4231. case LENGTH_ERROR:
  4232. XSTRNCPY(str, "record layer length error", max);
  4233. break;
  4234. case PEER_KEY_ERROR:
  4235. XSTRNCPY(str, "cant decode peer key", max);
  4236. break;
  4237. case ZERO_RETURN:
  4238. case SSL_ERROR_ZERO_RETURN:
  4239. XSTRNCPY(str, "peer sent close notify alert", max);
  4240. break;
  4241. case ECC_CURVETYPE_ERROR:
  4242. XSTRNCPY(str, "Bad ECC Curve Type or unsupported", max);
  4243. break;
  4244. case ECC_CURVE_ERROR:
  4245. XSTRNCPY(str, "Bad ECC Curve or unsupported", max);
  4246. break;
  4247. case ECC_PEERKEY_ERROR:
  4248. XSTRNCPY(str, "Bad ECC Peer Key", max);
  4249. break;
  4250. case ECC_MAKEKEY_ERROR:
  4251. XSTRNCPY(str, "ECC Make Key failure", max);
  4252. break;
  4253. case ECC_EXPORT_ERROR:
  4254. XSTRNCPY(str, "ECC Export Key failure", max);
  4255. break;
  4256. case ECC_SHARED_ERROR:
  4257. XSTRNCPY(str, "ECC DHE shared failure", max);
  4258. break;
  4259. case BAD_MUTEX_ERROR:
  4260. XSTRNCPY(str, "Bad mutex, operation failed", max);
  4261. break;
  4262. case NOT_CA_ERROR:
  4263. XSTRNCPY(str, "Not a CA by basic constraint error", max);
  4264. break;
  4265. case BAD_PATH_ERROR:
  4266. XSTRNCPY(str, "Bad path for opendir error", max);
  4267. break;
  4268. case BAD_CERT_MANAGER_ERROR:
  4269. XSTRNCPY(str, "Bad Cert Manager error", max);
  4270. break;
  4271. case OCSP_CERT_REVOKED:
  4272. XSTRNCPY(str, "OCSP Cert revoked", max);
  4273. break;
  4274. case CRL_CERT_REVOKED:
  4275. XSTRNCPY(str, "CRL Cert revoked", max);
  4276. break;
  4277. case CRL_MISSING:
  4278. XSTRNCPY(str, "CRL missing, not loaded", max);
  4279. break;
  4280. case MONITOR_RUNNING_E:
  4281. XSTRNCPY(str, "CRL monitor already running", max);
  4282. break;
  4283. case THREAD_CREATE_E:
  4284. XSTRNCPY(str, "Thread creation problem", max);
  4285. break;
  4286. case OCSP_NEED_URL:
  4287. XSTRNCPY(str, "OCSP need URL", max);
  4288. break;
  4289. case OCSP_CERT_UNKNOWN:
  4290. XSTRNCPY(str, "OCSP Cert unknown", max);
  4291. break;
  4292. case OCSP_LOOKUP_FAIL:
  4293. XSTRNCPY(str, "OCSP Responder lookup fail", max);
  4294. break;
  4295. case MAX_CHAIN_ERROR:
  4296. XSTRNCPY(str, "Maximum Chain Depth Exceeded", max);
  4297. break;
  4298. case COOKIE_ERROR:
  4299. XSTRNCPY(str, "DTLS Cookie Error", max);
  4300. break;
  4301. case SEQUENCE_ERROR:
  4302. XSTRNCPY(str, "DTLS Sequence Error", max);
  4303. break;
  4304. case SUITES_ERROR:
  4305. XSTRNCPY(str, "Suites Pointer Error", max);
  4306. break;
  4307. case SSL_NO_PEM_HEADER:
  4308. XSTRNCPY(str, "No PEM Header Error", max);
  4309. break;
  4310. case OUT_OF_ORDER_E:
  4311. XSTRNCPY(str, "Out of order message, fatal", max);
  4312. break;
  4313. case BAD_KEA_TYPE_E:
  4314. XSTRNCPY(str, "Bad KEA type found", max);
  4315. break;
  4316. case SANITY_CIPHER_E:
  4317. XSTRNCPY(str, "Sanity check on ciphertext failed", max);
  4318. break;
  4319. case RECV_OVERFLOW_E:
  4320. XSTRNCPY(str, "Receive callback returned more than requested", max);
  4321. break;
  4322. default :
  4323. XSTRNCPY(str, "unknown error number", max);
  4324. }
  4325. #endif /* NO_ERROR_STRINGS */
  4326. }
  4327. /* be sure to add to cipher_name_idx too !!!! */
  4328. const char* const cipher_names[] =
  4329. {
  4330. #ifdef BUILD_SSL_RSA_WITH_RC4_128_SHA
  4331. "RC4-SHA",
  4332. #endif
  4333. #ifdef BUILD_SSL_RSA_WITH_RC4_128_MD5
  4334. "RC4-MD5",
  4335. #endif
  4336. #ifdef BUILD_SSL_RSA_WITH_3DES_EDE_CBC_SHA
  4337. "DES-CBC3-SHA",
  4338. #endif
  4339. #ifdef BUILD_TLS_RSA_WITH_AES_128_CBC_SHA
  4340. "AES128-SHA",
  4341. #endif
  4342. #ifdef BUILD_TLS_RSA_WITH_AES_256_CBC_SHA
  4343. "AES256-SHA",
  4344. #endif
  4345. #ifdef BUILD_TLS_RSA_WITH_NULL_SHA
  4346. "NULL-SHA",
  4347. #endif
  4348. #ifdef BUILD_TLS_RSA_WITH_NULL_SHA256
  4349. "NULL-SHA256",
  4350. #endif
  4351. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_CBC_SHA
  4352. "DHE-RSA-AES128-SHA",
  4353. #endif
  4354. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_CBC_SHA
  4355. "DHE-RSA-AES256-SHA",
  4356. #endif
  4357. #ifdef BUILD_TLS_PSK_WITH_AES_128_CBC_SHA256
  4358. "PSK-AES128-CBC-SHA256",
  4359. #endif
  4360. #ifdef BUILD_TLS_PSK_WITH_AES_128_CBC_SHA
  4361. "PSK-AES128-CBC-SHA",
  4362. #endif
  4363. #ifdef BUILD_TLS_PSK_WITH_AES_256_CBC_SHA
  4364. "PSK-AES256-CBC-SHA",
  4365. #endif
  4366. #ifdef BUILD_TLS_PSK_WITH_NULL_SHA256
  4367. "PSK-NULL-SHA256",
  4368. #endif
  4369. #ifdef BUILD_TLS_PSK_WITH_NULL_SHA
  4370. "PSK-NULL-SHA",
  4371. #endif
  4372. #ifdef BUILD_TLS_RSA_WITH_HC_128_CBC_MD5
  4373. "HC128-MD5",
  4374. #endif
  4375. #ifdef BUILD_TLS_RSA_WITH_HC_128_CBC_SHA
  4376. "HC128-SHA",
  4377. #endif
  4378. #ifdef BUILD_TLS_RSA_WITH_RABBIT_CBC_SHA
  4379. "RABBIT-SHA",
  4380. #endif
  4381. #ifdef BUILD_TLS_NTRU_RSA_WITH_RC4_128_SHA
  4382. "NTRU-RC4-SHA",
  4383. #endif
  4384. #ifdef BUILD_TLS_NTRU_RSA_WITH_3DES_EDE_CBC_SHA
  4385. "NTRU-DES-CBC3-SHA",
  4386. #endif
  4387. #ifdef BUILD_TLS_NTRU_RSA_WITH_AES_128_CBC_SHA
  4388. "NTRU-AES128-SHA",
  4389. #endif
  4390. #ifdef BUILD_TLS_NTRU_RSA_WITH_AES_256_CBC_SHA
  4391. "NTRU-AES256-SHA",
  4392. #endif
  4393. #ifdef BUILD_TLS_RSA_WITH_AES_128_CCM_8_SHA256
  4394. "AES128-CCM-8-SHA256",
  4395. #endif
  4396. #ifdef BUILD_TLS_RSA_WITH_AES_256_CCM_8_SHA384
  4397. "AES256-CCM-8-SHA384",
  4398. #endif
  4399. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8_SHA256
  4400. "ECDHE-ECDSA-AES128-CCM-8-SHA256",
  4401. #endif
  4402. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8_SHA384
  4403. "ECDHE-ECDSA-AES256-CCM-8-SHA384",
  4404. #endif
  4405. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
  4406. "ECDHE-RSA-AES128-SHA",
  4407. #endif
  4408. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
  4409. "ECDHE-RSA-AES256-SHA",
  4410. #endif
  4411. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
  4412. "ECDHE-ECDSA-AES128-SHA",
  4413. #endif
  4414. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
  4415. "ECDHE-ECDSA-AES256-SHA",
  4416. #endif
  4417. #ifdef BUILD_TLS_ECDHE_RSA_WITH_RC4_128_SHA
  4418. "ECDHE-RSA-RC4-SHA",
  4419. #endif
  4420. #ifdef BUILD_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA
  4421. "ECDHE-RSA-DES-CBC3-SHA",
  4422. #endif
  4423. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA
  4424. "ECDHE-ECDSA-RC4-SHA",
  4425. #endif
  4426. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA
  4427. "ECDHE-ECDSA-DES-CBC3-SHA",
  4428. #endif
  4429. #ifdef BUILD_TLS_RSA_WITH_AES_128_CBC_SHA256
  4430. "AES128-SHA256",
  4431. #endif
  4432. #ifdef BUILD_TLS_RSA_WITH_AES_256_CBC_SHA256
  4433. "AES256-SHA256",
  4434. #endif
  4435. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
  4436. "DHE-RSA-AES128-SHA256",
  4437. #endif
  4438. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
  4439. "DHE-RSA-AES256-SHA256",
  4440. #endif
  4441. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA
  4442. "ECDH-RSA-AES128-SHA",
  4443. #endif
  4444. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA
  4445. "ECDH-RSA-AES256-SHA",
  4446. #endif
  4447. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA
  4448. "ECDH-ECDSA-AES128-SHA",
  4449. #endif
  4450. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA
  4451. "ECDH-ECDSA-AES256-SHA",
  4452. #endif
  4453. #ifdef BUILD_TLS_ECDH_RSA_WITH_RC4_128_SHA
  4454. "ECDH-RSA-RC4-SHA",
  4455. #endif
  4456. #ifdef BUILD_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA
  4457. "ECDH-RSA-DES-CBC3-SHA",
  4458. #endif
  4459. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_RC4_128_SHA
  4460. "ECDH-ECDSA-RC4-SHA",
  4461. #endif
  4462. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA
  4463. "ECDH-ECDSA-DES-CBC3-SHA",
  4464. #endif
  4465. #ifdef BUILD_TLS_RSA_WITH_AES_128_GCM_SHA256
  4466. "AES128-GCM-SHA256",
  4467. #endif
  4468. #ifdef BUILD_TLS_RSA_WITH_AES_256_GCM_SHA384
  4469. "AES256-GCM-SHA384",
  4470. #endif
  4471. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
  4472. "DHE-RSA-AES128-GCM-SHA256",
  4473. #endif
  4474. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
  4475. "DHE-RSA-AES256-GCM-SHA384",
  4476. #endif
  4477. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
  4478. "ECDHE-RSA-AES128-GCM-SHA256",
  4479. #endif
  4480. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
  4481. "ECDHE-RSA-AES256-GCM-SHA384",
  4482. #endif
  4483. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
  4484. "ECDHE-ECDSA-AES128-GCM-SHA256",
  4485. #endif
  4486. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
  4487. "ECDHE-ECDSA-AES256-GCM-SHA384",
  4488. #endif
  4489. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256
  4490. "ECDH-RSA-AES128-GCM-SHA256",
  4491. #endif
  4492. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384
  4493. "ECDH-RSA-AES256-GCM-SHA384",
  4494. #endif
  4495. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256
  4496. "ECDH-ECDSA-AES128-GCM-SHA256",
  4497. #endif
  4498. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384
  4499. "ECDH-ECDSA-AES256-GCM-SHA384",
  4500. #endif
  4501. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA
  4502. "CAMELLIA128-SHA",
  4503. #endif
  4504. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA
  4505. "DHE-RSA-CAMELLIA128-SHA",
  4506. #endif
  4507. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA
  4508. "CAMELLIA256-SHA",
  4509. #endif
  4510. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA
  4511. "DHE-RSA-CAMELLIA256-SHA",
  4512. #endif
  4513. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256
  4514. "CAMELLIA128-SHA256",
  4515. #endif
  4516. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256
  4517. "DHE-RSA-CAMELLIA128-SHA256",
  4518. #endif
  4519. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256
  4520. "CAMELLIA256-SHA256",
  4521. #endif
  4522. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256
  4523. "DHE-RSA-CAMELLIA256-SHA256"
  4524. #endif
  4525. };
  4526. /* cipher suite number that matches above name table */
  4527. int cipher_name_idx[] =
  4528. {
  4529. #ifdef BUILD_SSL_RSA_WITH_RC4_128_SHA
  4530. SSL_RSA_WITH_RC4_128_SHA,
  4531. #endif
  4532. #ifdef BUILD_SSL_RSA_WITH_RC4_128_MD5
  4533. SSL_RSA_WITH_RC4_128_MD5,
  4534. #endif
  4535. #ifdef BUILD_SSL_RSA_WITH_3DES_EDE_CBC_SHA
  4536. SSL_RSA_WITH_3DES_EDE_CBC_SHA,
  4537. #endif
  4538. #ifdef BUILD_TLS_RSA_WITH_AES_128_CBC_SHA
  4539. TLS_RSA_WITH_AES_128_CBC_SHA,
  4540. #endif
  4541. #ifdef BUILD_TLS_RSA_WITH_AES_256_CBC_SHA
  4542. TLS_RSA_WITH_AES_256_CBC_SHA,
  4543. #endif
  4544. #ifdef BUILD_TLS_RSA_WITH_NULL_SHA
  4545. TLS_RSA_WITH_NULL_SHA,
  4546. #endif
  4547. #ifdef BUILD_TLS_RSA_WITH_NULL_SHA256
  4548. TLS_RSA_WITH_NULL_SHA256,
  4549. #endif
  4550. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_CBC_SHA
  4551. TLS_DHE_RSA_WITH_AES_128_CBC_SHA,
  4552. #endif
  4553. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_CBC_SHA
  4554. TLS_DHE_RSA_WITH_AES_256_CBC_SHA,
  4555. #endif
  4556. #ifdef BUILD_TLS_PSK_WITH_AES_128_CBC_SHA256
  4557. TLS_PSK_WITH_AES_128_CBC_SHA256,
  4558. #endif
  4559. #ifdef BUILD_TLS_PSK_WITH_AES_128_CBC_SHA
  4560. TLS_PSK_WITH_AES_128_CBC_SHA,
  4561. #endif
  4562. #ifdef BUILD_TLS_PSK_WITH_AES_256_CBC_SHA
  4563. TLS_PSK_WITH_AES_256_CBC_SHA,
  4564. #endif
  4565. #ifdef BUILD_TLS_PSK_WITH_NULL_SHA256
  4566. TLS_PSK_WITH_NULL_SHA256,
  4567. #endif
  4568. #ifdef BUILD_TLS_PSK_WITH_NULL_SHA
  4569. TLS_PSK_WITH_NULL_SHA,
  4570. #endif
  4571. #ifdef BUILD_TLS_RSA_WITH_HC_128_CBC_MD5
  4572. TLS_RSA_WITH_HC_128_CBC_MD5,
  4573. #endif
  4574. #ifdef BUILD_TLS_RSA_WITH_HC_128_CBC_SHA
  4575. TLS_RSA_WITH_HC_128_CBC_SHA,
  4576. #endif
  4577. #ifdef BUILD_TLS_RSA_WITH_RABBIT_CBC_SHA
  4578. TLS_RSA_WITH_RABBIT_CBC_SHA,
  4579. #endif
  4580. #ifdef BUILD_TLS_NTRU_RSA_WITH_RC4_128_SHA
  4581. TLS_NTRU_RSA_WITH_RC4_128_SHA,
  4582. #endif
  4583. #ifdef BUILD_TLS_NTRU_RSA_WITH_3DES_EDE_CBC_SHA
  4584. TLS_NTRU_RSA_WITH_3DES_EDE_CBC_SHA,
  4585. #endif
  4586. #ifdef BUILD_TLS_NTRU_RSA_WITH_AES_128_CBC_SHA
  4587. TLS_NTRU_RSA_WITH_AES_128_CBC_SHA,
  4588. #endif
  4589. #ifdef BUILD_TLS_NTRU_RSA_WITH_AES_256_CBC_SHA
  4590. TLS_NTRU_RSA_WITH_AES_256_CBC_SHA,
  4591. #endif
  4592. #ifdef BUILD_TLS_RSA_WITH_AES_128_CCM_8_SHA256
  4593. TLS_RSA_WITH_AES_128_CCM_8_SHA256,
  4594. #endif
  4595. #ifdef BUILD_TLS_RSA_WITH_AES_256_CCM_8_SHA384
  4596. TLS_RSA_WITH_AES_256_CCM_8_SHA384,
  4597. #endif
  4598. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8_SHA256
  4599. TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8_SHA256,
  4600. #endif
  4601. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8_SHA384
  4602. TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8_SHA384,
  4603. #endif
  4604. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
  4605. TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
  4606. #endif
  4607. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
  4608. TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
  4609. #endif
  4610. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
  4611. TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,
  4612. #endif
  4613. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
  4614. TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,
  4615. #endif
  4616. #ifdef BUILD_TLS_ECDHE_RSA_WITH_RC4_128_SHA
  4617. TLS_ECDHE_RSA_WITH_RC4_128_SHA,
  4618. #endif
  4619. #ifdef BUILD_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA
  4620. TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA,
  4621. #endif
  4622. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA
  4623. TLS_ECDHE_ECDSA_WITH_RC4_128_SHA,
  4624. #endif
  4625. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA
  4626. TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA,
  4627. #endif
  4628. #ifdef BUILD_TLS_RSA_WITH_AES_128_CBC_SHA256
  4629. TLS_RSA_WITH_AES_128_CBC_SHA256,
  4630. #endif
  4631. #ifdef BUILD_TLS_RSA_WITH_AES_256_CBC_SHA256
  4632. TLS_RSA_WITH_AES_256_CBC_SHA256,
  4633. #endif
  4634. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
  4635. TLS_DHE_RSA_WITH_AES_128_CBC_SHA256,
  4636. #endif
  4637. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
  4638. TLS_DHE_RSA_WITH_AES_256_CBC_SHA256,
  4639. #endif
  4640. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA
  4641. TLS_ECDH_RSA_WITH_AES_128_CBC_SHA,
  4642. #endif
  4643. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA
  4644. TLS_ECDH_RSA_WITH_AES_256_CBC_SHA,
  4645. #endif
  4646. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA
  4647. TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA,
  4648. #endif
  4649. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA
  4650. TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA,
  4651. #endif
  4652. #ifdef BUILD_TLS_ECDH_RSA_WITH_RC4_128_SHA
  4653. TLS_ECDH_RSA_WITH_RC4_128_SHA,
  4654. #endif
  4655. #ifdef BUILD_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA
  4656. TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA,
  4657. #endif
  4658. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_RC4_128_SHA
  4659. TLS_ECDH_ECDSA_WITH_RC4_128_SHA,
  4660. #endif
  4661. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA
  4662. TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA,
  4663. #endif
  4664. #ifdef BUILD_TLS_RSA_WITH_AES_128_GCM_SHA256
  4665. TLS_RSA_WITH_AES_128_GCM_SHA256,
  4666. #endif
  4667. #ifdef BUILD_TLS_RSA_WITH_AES_256_GCM_SHA384
  4668. TLS_RSA_WITH_AES_256_GCM_SHA384,
  4669. #endif
  4670. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
  4671. TLS_DHE_RSA_WITH_AES_128_GCM_SHA256,
  4672. #endif
  4673. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
  4674. TLS_DHE_RSA_WITH_AES_256_GCM_SHA384,
  4675. #endif
  4676. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
  4677. TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
  4678. #endif
  4679. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
  4680. TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
  4681. #endif
  4682. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
  4683. TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
  4684. #endif
  4685. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
  4686. TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
  4687. #endif
  4688. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256
  4689. TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256,
  4690. #endif
  4691. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384
  4692. TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384,
  4693. #endif
  4694. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256
  4695. TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256,
  4696. #endif
  4697. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384
  4698. TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384,
  4699. #endif
  4700. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA
  4701. TLS_RSA_WITH_CAMELLIA_128_CBC_SHA,
  4702. #endif
  4703. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA
  4704. TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA,
  4705. #endif
  4706. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA
  4707. TLS_RSA_WITH_CAMELLIA_256_CBC_SHA,
  4708. #endif
  4709. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA
  4710. TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA,
  4711. #endif
  4712. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256
  4713. TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256,
  4714. #endif
  4715. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256
  4716. TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256,
  4717. #endif
  4718. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256
  4719. TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256,
  4720. #endif
  4721. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256
  4722. TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256
  4723. #endif
  4724. };
  4725. /* return true if set, else false */
  4726. /* only supports full name from cipher_name[] delimited by : */
  4727. int SetCipherList(Suites* s, const char* list)
  4728. {
  4729. int ret = 0, i;
  4730. char name[MAX_SUITE_NAME];
  4731. char needle[] = ":";
  4732. char* haystack = (char*)list;
  4733. char* prev;
  4734. const int suiteSz = sizeof(cipher_names) / sizeof(cipher_names[0]);
  4735. int idx = 0;
  4736. if (s == NULL) {
  4737. CYASSL_MSG("SetCipherList suite pointer error");
  4738. return 0;
  4739. }
  4740. if (!list)
  4741. return 0;
  4742. if (*list == 0) return 1; /* CyaSSL default */
  4743. if (XSTRNCMP(haystack, "ALL", 3) == 0) return 1; /* CyaSSL defualt */
  4744. for(;;) {
  4745. word32 len;
  4746. prev = haystack;
  4747. haystack = XSTRSTR(haystack, needle);
  4748. if (!haystack) /* last cipher */
  4749. len = min(sizeof(name), (word32)XSTRLEN(prev));
  4750. else
  4751. len = min(sizeof(name), (word32)(haystack - prev));
  4752. XSTRNCPY(name, prev, len);
  4753. name[(len == sizeof(name)) ? len - 1 : len] = 0;
  4754. for (i = 0; i < suiteSz; i++)
  4755. if (XSTRNCMP(name, cipher_names[i], sizeof(name)) == 0) {
  4756. if (XSTRSTR(name, "EC") || XSTRSTR(name, "CCM"))
  4757. s->suites[idx++] = ECC_BYTE; /* ECC suite */
  4758. else
  4759. s->suites[idx++] = 0x00; /* normal */
  4760. s->suites[idx++] = (byte)cipher_name_idx[i];
  4761. if (!ret) ret = 1; /* found at least one */
  4762. break;
  4763. }
  4764. if (!haystack) break;
  4765. haystack++;
  4766. }
  4767. if (ret) {
  4768. s->setSuites = 1;
  4769. s->suiteSz = (word16)idx;
  4770. }
  4771. return ret;
  4772. }
  4773. #ifdef CYASSL_CALLBACKS
  4774. /* Initialisze HandShakeInfo */
  4775. void InitHandShakeInfo(HandShakeInfo* info)
  4776. {
  4777. int i;
  4778. info->cipherName[0] = 0;
  4779. for (i = 0; i < MAX_PACKETS_HANDSHAKE; i++)
  4780. info->packetNames[i][0] = 0;
  4781. info->numberPackets = 0;
  4782. info->negotiationError = 0;
  4783. }
  4784. /* Set Final HandShakeInfo parameters */
  4785. void FinishHandShakeInfo(HandShakeInfo* info, const CYASSL* ssl)
  4786. {
  4787. int i;
  4788. int sz = sizeof(cipher_name_idx)/sizeof(int);
  4789. for (i = 0; i < sz; i++)
  4790. if (ssl->options.cipherSuite == (byte)cipher_name_idx[i]) {
  4791. if (ssl->options.cipherSuite0 == ECC_BYTE)
  4792. continue; /* ECC suites at end */
  4793. XSTRNCPY(info->cipherName, cipher_names[i], MAX_CIPHERNAME_SZ);
  4794. break;
  4795. }
  4796. /* error max and min are negative numbers */
  4797. if (ssl->error <= MIN_PARAM_ERR && ssl->error >= MAX_PARAM_ERR)
  4798. info->negotiationError = ssl->error;
  4799. }
  4800. /* Add name to info packet names, increase packet name count */
  4801. void AddPacketName(const char* name, HandShakeInfo* info)
  4802. {
  4803. if (info->numberPackets < MAX_PACKETS_HANDSHAKE) {
  4804. XSTRNCPY(info->packetNames[info->numberPackets++], name,
  4805. MAX_PACKETNAME_SZ);
  4806. }
  4807. }
  4808. /* Initialisze TimeoutInfo */
  4809. void InitTimeoutInfo(TimeoutInfo* info)
  4810. {
  4811. int i;
  4812. info->timeoutName[0] = 0;
  4813. info->flags = 0;
  4814. for (i = 0; i < MAX_PACKETS_HANDSHAKE; i++) {
  4815. info->packets[i].packetName[0] = 0;
  4816. info->packets[i].timestamp.tv_sec = 0;
  4817. info->packets[i].timestamp.tv_usec = 0;
  4818. info->packets[i].bufferValue = 0;
  4819. info->packets[i].valueSz = 0;
  4820. }
  4821. info->numberPackets = 0;
  4822. info->timeoutValue.tv_sec = 0;
  4823. info->timeoutValue.tv_usec = 0;
  4824. }
  4825. /* Free TimeoutInfo */
  4826. void FreeTimeoutInfo(TimeoutInfo* info, void* heap)
  4827. {
  4828. int i;
  4829. for (i = 0; i < MAX_PACKETS_HANDSHAKE; i++)
  4830. if (info->packets[i].bufferValue) {
  4831. XFREE(info->packets[i].bufferValue, heap, DYNAMIC_TYPE_INFO);
  4832. info->packets[i].bufferValue = 0;
  4833. }
  4834. }
  4835. /* Add PacketInfo to TimeoutInfo */
  4836. void AddPacketInfo(const char* name, TimeoutInfo* info, const byte* data,
  4837. int sz, void* heap)
  4838. {
  4839. if (info->numberPackets < (MAX_PACKETS_HANDSHAKE - 1)) {
  4840. Timeval currTime;
  4841. /* may add name after */
  4842. if (name)
  4843. XSTRNCPY(info->packets[info->numberPackets].packetName, name,
  4844. MAX_PACKETNAME_SZ);
  4845. /* add data, put in buffer if bigger than static buffer */
  4846. info->packets[info->numberPackets].valueSz = sz;
  4847. if (sz < MAX_VALUE_SZ)
  4848. XMEMCPY(info->packets[info->numberPackets].value, data, sz);
  4849. else {
  4850. info->packets[info->numberPackets].bufferValue =
  4851. XMALLOC(sz, heap, DYNAMIC_TYPE_INFO);
  4852. if (!info->packets[info->numberPackets].bufferValue)
  4853. /* let next alloc catch, just don't fill, not fatal here */
  4854. info->packets[info->numberPackets].valueSz = 0;
  4855. else
  4856. XMEMCPY(info->packets[info->numberPackets].bufferValue,
  4857. data, sz);
  4858. }
  4859. gettimeofday(&currTime, 0);
  4860. info->packets[info->numberPackets].timestamp.tv_sec =
  4861. currTime.tv_sec;
  4862. info->packets[info->numberPackets].timestamp.tv_usec =
  4863. currTime.tv_usec;
  4864. info->numberPackets++;
  4865. }
  4866. }
  4867. /* Add packet name to previsouly added packet info */
  4868. void AddLateName(const char* name, TimeoutInfo* info)
  4869. {
  4870. /* make sure we have a valid previous one */
  4871. if (info->numberPackets > 0 && info->numberPackets <
  4872. MAX_PACKETS_HANDSHAKE) {
  4873. XSTRNCPY(info->packets[info->numberPackets - 1].packetName, name,
  4874. MAX_PACKETNAME_SZ);
  4875. }
  4876. }
  4877. /* Add record header to previsouly added packet info */
  4878. void AddLateRecordHeader(const RecordLayerHeader* rl, TimeoutInfo* info)
  4879. {
  4880. /* make sure we have a valid previous one */
  4881. if (info->numberPackets > 0 && info->numberPackets <
  4882. MAX_PACKETS_HANDSHAKE) {
  4883. if (info->packets[info->numberPackets - 1].bufferValue)
  4884. XMEMCPY(info->packets[info->numberPackets - 1].bufferValue, rl,
  4885. RECORD_HEADER_SZ);
  4886. else
  4887. XMEMCPY(info->packets[info->numberPackets - 1].value, rl,
  4888. RECORD_HEADER_SZ);
  4889. }
  4890. }
  4891. #endif /* CYASSL_CALLBACKS */
  4892. /* client only parts */
  4893. #ifndef NO_CYASSL_CLIENT
  4894. int SendClientHello(CYASSL* ssl)
  4895. {
  4896. byte *output;
  4897. word32 length, idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  4898. int sendSz;
  4899. int idSz = ssl->options.resuming ? ID_LEN : 0;
  4900. int ret;
  4901. if (ssl->suites == NULL) {
  4902. CYASSL_MSG("Bad suites pointer in SendClientHello");
  4903. return SUITES_ERROR;
  4904. }
  4905. length = VERSION_SZ + RAN_LEN
  4906. + idSz + ENUM_LEN
  4907. + ssl->suites->suiteSz + SUITE_LEN
  4908. + COMP_LEN + ENUM_LEN;
  4909. if (IsAtLeastTLSv1_2(ssl))
  4910. length += HELLO_EXT_SZ;
  4911. sendSz = length + HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ;
  4912. #ifdef CYASSL_DTLS
  4913. if (ssl->options.dtls) {
  4914. length += ENUM_LEN; /* cookie */
  4915. if (ssl->arrays->cookieSz != 0) length += ssl->arrays->cookieSz;
  4916. sendSz = length + DTLS_HANDSHAKE_HEADER_SZ + DTLS_RECORD_HEADER_SZ;
  4917. idx += DTLS_HANDSHAKE_EXTRA + DTLS_RECORD_EXTRA;
  4918. }
  4919. #endif
  4920. /* check for avalaible size */
  4921. if ((ret = CheckAvalaibleSize(ssl, sendSz)) != 0)
  4922. return ret;
  4923. /* get ouput buffer */
  4924. output = ssl->buffers.outputBuffer.buffer +
  4925. ssl->buffers.outputBuffer.length;
  4926. AddHeaders(output, length, client_hello, ssl);
  4927. /* client hello, first version */
  4928. output[idx++] = ssl->version.major;
  4929. output[idx++] = ssl->version.minor;
  4930. ssl->chVersion = ssl->version; /* store in case changed */
  4931. /* then random */
  4932. if (ssl->options.connectState == CONNECT_BEGIN) {
  4933. RNG_GenerateBlock(ssl->rng, output + idx, RAN_LEN);
  4934. /* store random */
  4935. XMEMCPY(ssl->arrays->clientRandom, output + idx, RAN_LEN);
  4936. } else {
  4937. #ifdef CYASSL_DTLS
  4938. /* send same random on hello again */
  4939. XMEMCPY(output + idx, ssl->arrays->clientRandom, RAN_LEN);
  4940. #endif
  4941. }
  4942. idx += RAN_LEN;
  4943. /* then session id */
  4944. output[idx++] = (byte)idSz;
  4945. if (idSz) {
  4946. XMEMCPY(output + idx, ssl->session.sessionID, ID_LEN);
  4947. idx += ID_LEN;
  4948. }
  4949. /* then DTLS cookie */
  4950. #ifdef CYASSL_DTLS
  4951. if (ssl->options.dtls) {
  4952. byte cookieSz = ssl->arrays->cookieSz;
  4953. output[idx++] = cookieSz;
  4954. if (cookieSz) {
  4955. XMEMCPY(&output[idx], ssl->arrays->cookie, cookieSz);
  4956. idx += cookieSz;
  4957. }
  4958. }
  4959. #endif
  4960. /* then cipher suites */
  4961. c16toa(ssl->suites->suiteSz, output + idx);
  4962. idx += 2;
  4963. XMEMCPY(output + idx, &ssl->suites->suites, ssl->suites->suiteSz);
  4964. idx += ssl->suites->suiteSz;
  4965. /* last, compression */
  4966. output[idx++] = COMP_LEN;
  4967. if (ssl->options.usingCompression)
  4968. output[idx++] = ZLIB_COMPRESSION;
  4969. else
  4970. output[idx++] = NO_COMPRESSION;
  4971. if (IsAtLeastTLSv1_2(ssl))
  4972. {
  4973. /* add in the extensions length */
  4974. c16toa(HELLO_EXT_LEN, output + idx);
  4975. idx += 2;
  4976. c16toa(HELLO_EXT_SIG_ALGO, output + idx);
  4977. idx += 2;
  4978. c16toa(HELLO_EXT_SIGALGO_SZ, output + idx);
  4979. idx += 2;
  4980. /* This is a lazy list setup. Eventually, we'll need to support
  4981. * using other hash types or even other extensions. */
  4982. c16toa(HELLO_EXT_SIGALGO_LEN, output + idx);
  4983. idx += 2;
  4984. output[idx++] = sha_mac;
  4985. output[idx++] = rsa_sa_algo;
  4986. output[idx++] = sha_mac;
  4987. output[idx++] = dsa_sa_algo;
  4988. output[idx++] = sha_mac;
  4989. output[idx++] = ecc_dsa_sa_algo;
  4990. }
  4991. #ifdef CYASSL_DTLS
  4992. if (ssl->options.dtls) {
  4993. if ((ret = DtlsPoolSave(ssl, output, sendSz)) != 0)
  4994. return ret;
  4995. }
  4996. #endif
  4997. HashOutput(ssl, output, sendSz, 0);
  4998. ssl->options.clientState = CLIENT_HELLO_COMPLETE;
  4999. #ifdef CYASSL_CALLBACKS
  5000. if (ssl->hsInfoOn) AddPacketName("ClientHello", &ssl->handShakeInfo);
  5001. if (ssl->toInfoOn)
  5002. AddPacketInfo("ClientHello", &ssl->timeoutInfo, output, sendSz,
  5003. ssl->heap);
  5004. #endif
  5005. ssl->buffers.outputBuffer.length += sendSz;
  5006. return SendBuffered(ssl);
  5007. }
  5008. static int DoHelloVerifyRequest(CYASSL* ssl, const byte* input,
  5009. word32* inOutIdx)
  5010. {
  5011. ProtocolVersion pv;
  5012. byte cookieSz;
  5013. #ifdef CYASSL_CALLBACKS
  5014. if (ssl->hsInfoOn) AddPacketName("HelloVerifyRequest",
  5015. &ssl->handShakeInfo);
  5016. if (ssl->toInfoOn) AddLateName("HelloVerifyRequest", &ssl->timeoutInfo);
  5017. #endif
  5018. #ifdef CYASSL_DTLS
  5019. if (ssl->options.dtls) {
  5020. DtlsPoolReset(ssl);
  5021. }
  5022. #endif
  5023. XMEMCPY(&pv, input + *inOutIdx, sizeof(pv));
  5024. *inOutIdx += (word32)sizeof(pv);
  5025. cookieSz = input[(*inOutIdx)++];
  5026. if (cookieSz) {
  5027. #ifdef CYASSL_DTLS
  5028. if (cookieSz <= MAX_COOKIE_LEN) {
  5029. XMEMCPY(ssl->arrays->cookie, input + *inOutIdx, cookieSz);
  5030. ssl->arrays->cookieSz = cookieSz;
  5031. }
  5032. #endif
  5033. *inOutIdx += cookieSz;
  5034. }
  5035. ssl->options.serverState = SERVER_HELLOVERIFYREQUEST_COMPLETE;
  5036. return 0;
  5037. }
  5038. static int DoServerHello(CYASSL* ssl, const byte* input, word32* inOutIdx,
  5039. word32 helloSz)
  5040. {
  5041. byte b;
  5042. byte compression;
  5043. ProtocolVersion pv;
  5044. word32 i = *inOutIdx;
  5045. word32 begin = i;
  5046. #ifdef CYASSL_CALLBACKS
  5047. if (ssl->hsInfoOn) AddPacketName("ServerHello", &ssl->handShakeInfo);
  5048. if (ssl->toInfoOn) AddLateName("ServerHello", &ssl->timeoutInfo);
  5049. #endif
  5050. XMEMCPY(&pv, input + i, sizeof(pv));
  5051. i += (word32)sizeof(pv);
  5052. if (pv.minor > ssl->version.minor) {
  5053. CYASSL_MSG("Server using higher version, fatal error");
  5054. return VERSION_ERROR;
  5055. }
  5056. else if (pv.minor < ssl->version.minor) {
  5057. CYASSL_MSG("server using lower version");
  5058. if (!ssl->options.downgrade) {
  5059. CYASSL_MSG(" no downgrade allowed, fatal error");
  5060. return VERSION_ERROR;
  5061. }
  5062. else if (pv.minor == SSLv3_MINOR) {
  5063. /* turn off tls */
  5064. CYASSL_MSG(" downgrading to SSLv3");
  5065. ssl->options.tls = 0;
  5066. ssl->options.tls1_1 = 0;
  5067. ssl->version.minor = SSLv3_MINOR;
  5068. }
  5069. else if (pv.minor == TLSv1_MINOR) {
  5070. /* turn off tls 1.1+ */
  5071. CYASSL_MSG(" downgrading to TLSv1");
  5072. ssl->options.tls1_1 = 0;
  5073. ssl->version.minor = TLSv1_MINOR;
  5074. }
  5075. else if (pv.minor == TLSv1_1_MINOR) {
  5076. CYASSL_MSG(" downgrading to TLSv1.1");
  5077. ssl->version.minor = TLSv1_1_MINOR;
  5078. }
  5079. }
  5080. XMEMCPY(ssl->arrays->serverRandom, input + i, RAN_LEN);
  5081. i += RAN_LEN;
  5082. b = input[i++];
  5083. if (b) {
  5084. XMEMCPY(ssl->arrays->sessionID, input + i, min(b, ID_LEN));
  5085. i += b;
  5086. ssl->options.haveSessionId = 1;
  5087. }
  5088. ssl->options.cipherSuite0 = input[i++];
  5089. ssl->options.cipherSuite = input[i++];
  5090. compression = input[i++];
  5091. if (compression != ZLIB_COMPRESSION && ssl->options.usingCompression) {
  5092. CYASSL_MSG("Server refused compression, turning off");
  5093. ssl->options.usingCompression = 0; /* turn off if server refused */
  5094. }
  5095. *inOutIdx = i;
  5096. if ( (i - begin) < helloSz)
  5097. *inOutIdx = begin + helloSz; /* skip extensions */
  5098. ssl->options.serverState = SERVER_HELLO_COMPLETE;
  5099. *inOutIdx = i;
  5100. if (ssl->options.resuming) {
  5101. if (ssl->options.haveSessionId && XMEMCMP(ssl->arrays->sessionID,
  5102. ssl->session.sessionID, ID_LEN) == 0) {
  5103. if (SetCipherSpecs(ssl) == 0) {
  5104. int ret;
  5105. XMEMCPY(ssl->arrays->masterSecret,
  5106. ssl->session.masterSecret, SECRET_LEN);
  5107. #ifndef NO_OLD_TLS
  5108. if (ssl->options.tls)
  5109. ret = DeriveTlsKeys(ssl);
  5110. else
  5111. ret = DeriveKeys(ssl);
  5112. #else
  5113. ret = DeriveTlsKeys(ssl);
  5114. #endif
  5115. ssl->options.serverState = SERVER_HELLODONE_COMPLETE;
  5116. return ret;
  5117. }
  5118. else {
  5119. CYASSL_MSG("Unsupported cipher suite, DoServerHello");
  5120. return UNSUPPORTED_SUITE;
  5121. }
  5122. }
  5123. else {
  5124. CYASSL_MSG("Server denied resumption attempt");
  5125. ssl->options.resuming = 0; /* server denied resumption try */
  5126. }
  5127. }
  5128. #ifdef CYASSL_DTLS
  5129. if (ssl->options.dtls) {
  5130. DtlsPoolReset(ssl);
  5131. }
  5132. #endif
  5133. return SetCipherSpecs(ssl);
  5134. }
  5135. #ifndef NO_CERTS
  5136. /* just read in and ignore for now TODO: */
  5137. static int DoCertificateRequest(CYASSL* ssl, const byte* input, word32*
  5138. inOutIdx)
  5139. {
  5140. word16 len;
  5141. #ifdef CYASSL_CALLBACKS
  5142. if (ssl->hsInfoOn)
  5143. AddPacketName("CertificateRequest", &ssl->handShakeInfo);
  5144. if (ssl->toInfoOn)
  5145. AddLateName("CertificateRequest", &ssl->timeoutInfo);
  5146. #endif
  5147. len = input[(*inOutIdx)++];
  5148. /* types, read in here */
  5149. *inOutIdx += len;
  5150. ato16(&input[*inOutIdx], &len);
  5151. *inOutIdx += LENGTH_SZ;
  5152. if (IsAtLeastTLSv1_2(ssl)) {
  5153. /* hash sig format */
  5154. *inOutIdx += len;
  5155. ato16(&input[*inOutIdx], &len);
  5156. *inOutIdx += LENGTH_SZ;
  5157. }
  5158. /* authorities */
  5159. while (len) {
  5160. word16 dnSz;
  5161. ato16(&input[*inOutIdx], &dnSz);
  5162. *inOutIdx += (REQUEST_HEADER + dnSz);
  5163. len -= dnSz + REQUEST_HEADER;
  5164. }
  5165. /* don't send client cert or cert verify if user hasn't provided
  5166. cert and private key */
  5167. if (ssl->buffers.certificate.buffer && ssl->buffers.key.buffer)
  5168. ssl->options.sendVerify = SEND_CERT;
  5169. else if (IsAtLeastTLSv1_2(ssl))
  5170. ssl->options.sendVerify = SEND_BLANK_CERT;
  5171. return 0;
  5172. }
  5173. #endif /* !NO_CERTS */
  5174. static int DoServerKeyExchange(CYASSL* ssl, const byte* input,
  5175. word32* inOutIdx)
  5176. {
  5177. #if defined(OPENSSL_EXTRA) || defined(HAVE_ECC)
  5178. word16 length = 0;
  5179. word16 sigLen = 0;
  5180. word16 verifySz = (word16)*inOutIdx; /* keep start idx */
  5181. byte* signature = 0;
  5182. #endif
  5183. (void)ssl;
  5184. (void)input;
  5185. (void)inOutIdx;
  5186. #ifdef CYASSL_CALLBACKS
  5187. if (ssl->hsInfoOn)
  5188. AddPacketName("ServerKeyExchange", &ssl->handShakeInfo);
  5189. if (ssl->toInfoOn)
  5190. AddLateName("ServerKeyExchange", &ssl->timeoutInfo);
  5191. #endif
  5192. #ifndef NO_PSK
  5193. if (ssl->specs.kea == psk_kea) {
  5194. word16 pskLen = 0;
  5195. ato16(&input[*inOutIdx], &pskLen);
  5196. *inOutIdx += LENGTH_SZ;
  5197. XMEMCPY(ssl->arrays->server_hint, &input[*inOutIdx],
  5198. min(pskLen, MAX_PSK_ID_LEN));
  5199. if (pskLen < MAX_PSK_ID_LEN)
  5200. ssl->arrays->server_hint[pskLen] = 0;
  5201. else
  5202. ssl->arrays->server_hint[MAX_PSK_ID_LEN - 1] = 0;
  5203. *inOutIdx += pskLen;
  5204. return 0;
  5205. }
  5206. #endif
  5207. #ifdef OPENSSL_EXTRA
  5208. if (ssl->specs.kea == diffie_hellman_kea)
  5209. {
  5210. /* p */
  5211. ato16(&input[*inOutIdx], &length);
  5212. *inOutIdx += LENGTH_SZ;
  5213. ssl->buffers.serverDH_P.buffer = (byte*) XMALLOC(length, ssl->heap,
  5214. DYNAMIC_TYPE_DH);
  5215. if (ssl->buffers.serverDH_P.buffer)
  5216. ssl->buffers.serverDH_P.length = length;
  5217. else
  5218. return MEMORY_ERROR;
  5219. XMEMCPY(ssl->buffers.serverDH_P.buffer, &input[*inOutIdx], length);
  5220. *inOutIdx += length;
  5221. /* g */
  5222. ato16(&input[*inOutIdx], &length);
  5223. *inOutIdx += LENGTH_SZ;
  5224. ssl->buffers.serverDH_G.buffer = (byte*) XMALLOC(length, ssl->heap,
  5225. DYNAMIC_TYPE_DH);
  5226. if (ssl->buffers.serverDH_G.buffer)
  5227. ssl->buffers.serverDH_G.length = length;
  5228. else
  5229. return MEMORY_ERROR;
  5230. XMEMCPY(ssl->buffers.serverDH_G.buffer, &input[*inOutIdx], length);
  5231. *inOutIdx += length;
  5232. /* pub */
  5233. ato16(&input[*inOutIdx], &length);
  5234. *inOutIdx += LENGTH_SZ;
  5235. ssl->buffers.serverDH_Pub.buffer = (byte*) XMALLOC(length, ssl->heap,
  5236. DYNAMIC_TYPE_DH);
  5237. if (ssl->buffers.serverDH_Pub.buffer)
  5238. ssl->buffers.serverDH_Pub.length = length;
  5239. else
  5240. return MEMORY_ERROR;
  5241. XMEMCPY(ssl->buffers.serverDH_Pub.buffer, &input[*inOutIdx], length);
  5242. *inOutIdx += length;
  5243. } /* dh_kea */
  5244. #endif /* OPENSSL_EXTRA */
  5245. #ifdef HAVE_ECC
  5246. if (ssl->specs.kea == ecc_diffie_hellman_kea)
  5247. {
  5248. byte b = input[*inOutIdx];
  5249. *inOutIdx += 1;
  5250. if (b != named_curve)
  5251. return ECC_CURVETYPE_ERROR;
  5252. *inOutIdx += 1; /* curve type, eat leading 0 */
  5253. b = input[*inOutIdx];
  5254. *inOutIdx += 1;
  5255. if (b != secp256r1 && b != secp384r1 && b != secp521r1 && b !=
  5256. secp160r1 && b != secp192r1 && b != secp224r1)
  5257. return ECC_CURVE_ERROR;
  5258. length = input[*inOutIdx];
  5259. *inOutIdx += 1;
  5260. if (ecc_import_x963(&input[*inOutIdx], length, ssl->peerEccKey) != 0)
  5261. return ECC_PEERKEY_ERROR;
  5262. *inOutIdx += length;
  5263. ssl->peerEccKeyPresent = 1;
  5264. }
  5265. #endif /* HAVE_ECC */
  5266. #if defined(OPENSSL_EXTRA) || defined(HAVE_ECC)
  5267. {
  5268. Md5 md5;
  5269. Sha sha;
  5270. byte hash[FINISHED_SZ];
  5271. byte messageVerify[MAX_DH_SZ];
  5272. /* adjust from start idx */
  5273. verifySz = (word16)(*inOutIdx - verifySz);
  5274. /* save message for hash verify */
  5275. if (verifySz > sizeof(messageVerify))
  5276. return BUFFER_ERROR;
  5277. XMEMCPY(messageVerify, &input[*inOutIdx - verifySz], verifySz);
  5278. if (IsAtLeastTLSv1_2(ssl)) {
  5279. /* just advance for now TODO: validate hash algo params */
  5280. *inOutIdx += LENGTH_SZ;
  5281. }
  5282. /* signature */
  5283. ato16(&input[*inOutIdx], &length);
  5284. *inOutIdx += LENGTH_SZ;
  5285. signature = (byte*)&input[*inOutIdx];
  5286. *inOutIdx += length;
  5287. sigLen = length;
  5288. /* verify signature */
  5289. /* md5 */
  5290. InitMd5(&md5);
  5291. Md5Update(&md5, ssl->arrays->clientRandom, RAN_LEN);
  5292. Md5Update(&md5, ssl->arrays->serverRandom, RAN_LEN);
  5293. Md5Update(&md5, messageVerify, verifySz);
  5294. Md5Final(&md5, hash);
  5295. /* sha */
  5296. InitSha(&sha);
  5297. ShaUpdate(&sha, ssl->arrays->clientRandom, RAN_LEN);
  5298. ShaUpdate(&sha, ssl->arrays->serverRandom, RAN_LEN);
  5299. ShaUpdate(&sha, messageVerify, verifySz);
  5300. ShaFinal(&sha, &hash[MD5_DIGEST_SIZE]);
  5301. /* rsa */
  5302. if (ssl->specs.sig_algo == rsa_sa_algo)
  5303. {
  5304. int ret;
  5305. byte* out;
  5306. if (!ssl->peerRsaKeyPresent)
  5307. return NO_PEER_KEY;
  5308. ret = RsaSSL_VerifyInline(signature, sigLen,&out, ssl->peerRsaKey);
  5309. if (IsAtLeastTLSv1_2(ssl)) {
  5310. byte encodedSig[MAX_ENCODED_SIG_SZ];
  5311. word32 encSigSz;
  5312. byte* digest;
  5313. int typeH;
  5314. int digestSz;
  5315. /* sha1 for now */
  5316. digest = &hash[MD5_DIGEST_SIZE];
  5317. typeH = SHAh;
  5318. digestSz = SHA_DIGEST_SIZE;
  5319. encSigSz = EncodeSignature(encodedSig, digest, digestSz, typeH);
  5320. if (encSigSz != (word32)ret || XMEMCMP(out, encodedSig,
  5321. min(encSigSz, MAX_ENCODED_SIG_SZ)) != 0)
  5322. return VERIFY_SIGN_ERROR;
  5323. }
  5324. else {
  5325. if (ret != sizeof(hash) || XMEMCMP(out, hash,sizeof(hash)) != 0)
  5326. return VERIFY_SIGN_ERROR;
  5327. }
  5328. }
  5329. #ifdef HAVE_ECC
  5330. /* ecdsa */
  5331. else if (ssl->specs.sig_algo == ecc_dsa_sa_algo) {
  5332. int verify = 0, ret;
  5333. if (!ssl->peerEccDsaKeyPresent)
  5334. return NO_PEER_KEY;
  5335. ret = ecc_verify_hash(signature, sigLen, &hash[MD5_DIGEST_SIZE],
  5336. SHA_DIGEST_SIZE, &verify, ssl->peerEccDsaKey);
  5337. if (ret != 0 || verify == 0)
  5338. return VERIFY_SIGN_ERROR;
  5339. }
  5340. #endif /* HAVE_ECC */
  5341. else
  5342. return ALGO_ID_E;
  5343. ssl->options.serverState = SERVER_KEYEXCHANGE_COMPLETE;
  5344. return 0;
  5345. }
  5346. #else /* HAVE_OPENSSL or HAVE_ECC */
  5347. return NOT_COMPILED_IN; /* not supported by build */
  5348. #endif /* HAVE_OPENSSL or HAVE_ECC */
  5349. }
  5350. int SendClientKeyExchange(CYASSL* ssl)
  5351. {
  5352. byte encSecret[MAX_ENCRYPT_SZ];
  5353. word32 encSz = 0;
  5354. word32 idx = 0;
  5355. int ret = 0;
  5356. switch (ssl->specs.kea) {
  5357. #ifndef NO_RSA
  5358. case rsa_kea:
  5359. RNG_GenerateBlock(ssl->rng, ssl->arrays->preMasterSecret,
  5360. SECRET_LEN);
  5361. ssl->arrays->preMasterSecret[0] = ssl->chVersion.major;
  5362. ssl->arrays->preMasterSecret[1] = ssl->chVersion.minor;
  5363. ssl->arrays->preMasterSz = SECRET_LEN;
  5364. if (ssl->peerRsaKeyPresent == 0)
  5365. return NO_PEER_KEY;
  5366. ret = RsaPublicEncrypt(ssl->arrays->preMasterSecret, SECRET_LEN,
  5367. encSecret, sizeof(encSecret), ssl->peerRsaKey,
  5368. ssl->rng);
  5369. if (ret > 0) {
  5370. encSz = ret;
  5371. ret = 0; /* set success to 0 */
  5372. }
  5373. break;
  5374. #endif
  5375. #ifdef OPENSSL_EXTRA
  5376. case diffie_hellman_kea:
  5377. {
  5378. buffer serverP = ssl->buffers.serverDH_P;
  5379. buffer serverG = ssl->buffers.serverDH_G;
  5380. buffer serverPub = ssl->buffers.serverDH_Pub;
  5381. byte priv[ENCRYPT_LEN];
  5382. word32 privSz = 0;
  5383. DhKey key;
  5384. if (serverP.buffer == 0 || serverG.buffer == 0 ||
  5385. serverPub.buffer == 0)
  5386. return NO_PEER_KEY;
  5387. InitDhKey(&key);
  5388. ret = DhSetKey(&key, serverP.buffer, serverP.length,
  5389. serverG.buffer, serverG.length);
  5390. if (ret == 0)
  5391. /* for DH, encSecret is Yc, agree is pre-master */
  5392. ret = DhGenerateKeyPair(&key, ssl->rng, priv, &privSz,
  5393. encSecret, &encSz);
  5394. if (ret == 0)
  5395. ret = DhAgree(&key, ssl->arrays->preMasterSecret,
  5396. &ssl->arrays->preMasterSz, priv, privSz,
  5397. serverPub.buffer, serverPub.length);
  5398. FreeDhKey(&key);
  5399. }
  5400. break;
  5401. #endif /* OPENSSL_EXTRA */
  5402. #ifndef NO_PSK
  5403. case psk_kea:
  5404. {
  5405. byte* pms = ssl->arrays->preMasterSecret;
  5406. ssl->arrays->psk_keySz = ssl->options.client_psk_cb(ssl,
  5407. ssl->arrays->server_hint, ssl->arrays->client_identity,
  5408. MAX_PSK_ID_LEN, ssl->arrays->psk_key, MAX_PSK_KEY_LEN);
  5409. if (ssl->arrays->psk_keySz == 0 ||
  5410. ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN)
  5411. return PSK_KEY_ERROR;
  5412. encSz = (word32)XSTRLEN(ssl->arrays->client_identity);
  5413. if (encSz > MAX_PSK_ID_LEN) return CLIENT_ID_ERROR;
  5414. XMEMCPY(encSecret, ssl->arrays->client_identity, encSz);
  5415. /* make psk pre master secret */
  5416. /* length of key + length 0s + length of key + key */
  5417. c16toa((word16)ssl->arrays->psk_keySz, pms);
  5418. pms += 2;
  5419. XMEMSET(pms, 0, ssl->arrays->psk_keySz);
  5420. pms += ssl->arrays->psk_keySz;
  5421. c16toa((word16)ssl->arrays->psk_keySz, pms);
  5422. pms += 2;
  5423. XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  5424. ssl->arrays->preMasterSz = ssl->arrays->psk_keySz * 2 + 4;
  5425. }
  5426. break;
  5427. #endif /* NO_PSK */
  5428. #ifdef HAVE_NTRU
  5429. case ntru_kea:
  5430. {
  5431. word32 rc;
  5432. word16 cipherLen = sizeof(encSecret);
  5433. DRBG_HANDLE drbg;
  5434. static uint8_t const cyasslStr[] = {
  5435. 'C', 'y', 'a', 'S', 'S', 'L', ' ', 'N', 'T', 'R', 'U'
  5436. };
  5437. RNG_GenerateBlock(ssl->rng, ssl->arrays->preMasterSecret,
  5438. SECRET_LEN);
  5439. ssl->arrays->preMasterSz = SECRET_LEN;
  5440. if (ssl->peerNtruKeyPresent == 0)
  5441. return NO_PEER_KEY;
  5442. rc = crypto_drbg_instantiate(MAX_NTRU_BITS, cyasslStr,
  5443. sizeof(cyasslStr), GetEntropy,
  5444. &drbg);
  5445. if (rc != DRBG_OK)
  5446. return NTRU_DRBG_ERROR;
  5447. rc = crypto_ntru_encrypt(drbg, ssl->peerNtruKeyLen,
  5448. ssl->peerNtruKey,
  5449. ssl->arrays->preMasterSz,
  5450. ssl->arrays->preMasterSecret,
  5451. &cipherLen, encSecret);
  5452. crypto_drbg_uninstantiate(drbg);
  5453. if (rc != NTRU_OK)
  5454. return NTRU_ENCRYPT_ERROR;
  5455. encSz = cipherLen;
  5456. ret = 0;
  5457. }
  5458. break;
  5459. #endif /* HAVE_NTRU */
  5460. #ifdef HAVE_ECC
  5461. case ecc_diffie_hellman_kea:
  5462. {
  5463. ecc_key myKey;
  5464. ecc_key* peerKey = &myKey;
  5465. word32 size = sizeof(encSecret);
  5466. if (ssl->specs.static_ecdh) {
  5467. /* TODO: EccDsa is really fixed Ecc change naming */
  5468. if (!ssl->peerEccDsaKeyPresent || !ssl->peerEccDsaKey->dp)
  5469. return NO_PEER_KEY;
  5470. peerKey = ssl->peerEccDsaKey;
  5471. }
  5472. else {
  5473. if (!ssl->peerEccKeyPresent || !ssl->peerEccKey->dp)
  5474. return NO_PEER_KEY;
  5475. peerKey = ssl->peerEccKey;
  5476. }
  5477. ecc_init(&myKey);
  5478. ret = ecc_make_key(ssl->rng, peerKey->dp->size, &myKey);
  5479. if (ret != 0)
  5480. return ECC_MAKEKEY_ERROR;
  5481. /* precede export with 1 byte length */
  5482. ret = ecc_export_x963(&myKey, encSecret + 1, &size);
  5483. encSecret[0] = (byte)size;
  5484. encSz = size + 1;
  5485. if (ret != 0)
  5486. ret = ECC_EXPORT_ERROR;
  5487. else {
  5488. size = sizeof(ssl->arrays->preMasterSecret);
  5489. ret = ecc_shared_secret(&myKey, peerKey,
  5490. ssl->arrays->preMasterSecret, &size);
  5491. if (ret != 0)
  5492. ret = ECC_SHARED_ERROR;
  5493. }
  5494. ssl->arrays->preMasterSz = size;
  5495. ecc_free(&myKey);
  5496. }
  5497. break;
  5498. #endif /* HAVE_ECC */
  5499. default:
  5500. return ALGO_ID_E; /* unsupported kea */
  5501. }
  5502. if (ret == 0) {
  5503. byte *output;
  5504. int sendSz;
  5505. word32 tlsSz = 0;
  5506. if (ssl->options.tls || ssl->specs.kea == diffie_hellman_kea)
  5507. tlsSz = 2;
  5508. if (ssl->specs.kea == ecc_diffie_hellman_kea) /* always off */
  5509. tlsSz = 0;
  5510. sendSz = encSz + tlsSz + HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ;
  5511. idx = HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ;
  5512. #ifdef CYASSL_DTLS
  5513. if (ssl->options.dtls) {
  5514. sendSz += DTLS_HANDSHAKE_EXTRA + DTLS_RECORD_EXTRA;
  5515. idx += DTLS_HANDSHAKE_EXTRA + DTLS_RECORD_EXTRA;
  5516. }
  5517. #endif
  5518. /* check for avalaible size */
  5519. if ((ret = CheckAvalaibleSize(ssl, sendSz)) != 0)
  5520. return ret;
  5521. /* get ouput buffer */
  5522. output = ssl->buffers.outputBuffer.buffer +
  5523. ssl->buffers.outputBuffer.length;
  5524. AddHeaders(output, encSz + tlsSz, client_key_exchange, ssl);
  5525. if (tlsSz) {
  5526. c16toa((word16)encSz, &output[idx]);
  5527. idx += 2;
  5528. }
  5529. XMEMCPY(output + idx, encSecret, encSz);
  5530. /* if add more to output, adjust idx
  5531. idx += encSz; */
  5532. #ifdef CYASSL_DTLS
  5533. if (ssl->options.dtls) {
  5534. if ((ret = DtlsPoolSave(ssl, output, sendSz)) != 0)
  5535. return ret;
  5536. }
  5537. #endif
  5538. HashOutput(ssl, output, sendSz, 0);
  5539. #ifdef CYASSL_CALLBACKS
  5540. if (ssl->hsInfoOn)
  5541. AddPacketName("ClientKeyExchange", &ssl->handShakeInfo);
  5542. if (ssl->toInfoOn)
  5543. AddPacketInfo("ClientKeyExchange", &ssl->timeoutInfo,
  5544. output, sendSz, ssl->heap);
  5545. #endif
  5546. ssl->buffers.outputBuffer.length += sendSz;
  5547. if (ssl->options.groupMessages)
  5548. ret = 0;
  5549. else
  5550. ret = SendBuffered(ssl);
  5551. }
  5552. if (ret == 0 || ret == WANT_WRITE) {
  5553. int tmpRet = MakeMasterSecret(ssl);
  5554. if (tmpRet != 0)
  5555. ret = tmpRet; /* save WANT_WRITE unless more serious */
  5556. ssl->options.clientState = CLIENT_KEYEXCHANGE_COMPLETE;
  5557. }
  5558. return ret;
  5559. }
  5560. #ifndef NO_RSA
  5561. int SendCertificateVerify(CYASSL* ssl)
  5562. {
  5563. byte *output;
  5564. int sendSz = 0, length, ret;
  5565. word32 idx = 0;
  5566. word32 sigOutSz = 0;
  5567. RsaKey key;
  5568. int usingEcc = 0;
  5569. #ifdef HAVE_ECC
  5570. ecc_key eccKey;
  5571. #endif
  5572. if (ssl->options.sendVerify == SEND_BLANK_CERT)
  5573. return 0; /* sent blank cert, can't verify */
  5574. /* check for avalaible size */
  5575. if ((ret = CheckAvalaibleSize(ssl, MAX_CERT_VERIFY_SZ)) != 0)
  5576. return ret;
  5577. /* get ouput buffer */
  5578. output = ssl->buffers.outputBuffer.buffer +
  5579. ssl->buffers.outputBuffer.length;
  5580. BuildCertHashes(ssl, &ssl->certHashes);
  5581. #ifdef HAVE_ECC
  5582. ecc_init(&eccKey);
  5583. #endif
  5584. InitRsaKey(&key, ssl->heap);
  5585. ret = RsaPrivateKeyDecode(ssl->buffers.key.buffer, &idx, &key,
  5586. ssl->buffers.key.length);
  5587. if (ret == 0)
  5588. sigOutSz = RsaEncryptSize(&key);
  5589. else {
  5590. #ifdef HAVE_ECC
  5591. CYASSL_MSG("Trying ECC client cert, RSA didn't work");
  5592. idx = 0;
  5593. ret = EccPrivateKeyDecode(ssl->buffers.key.buffer, &idx, &eccKey,
  5594. ssl->buffers.key.length);
  5595. if (ret == 0) {
  5596. CYASSL_MSG("Using ECC client cert");
  5597. usingEcc = 1;
  5598. sigOutSz = ecc_sig_size(&eccKey);
  5599. }
  5600. else {
  5601. CYASSL_MSG("Bad client cert type");
  5602. }
  5603. #endif
  5604. }
  5605. if (ret == 0) {
  5606. byte* verify = (byte*)&output[RECORD_HEADER_SZ +
  5607. HANDSHAKE_HEADER_SZ];
  5608. byte* signBuffer = ssl->certHashes.md5;
  5609. word32 signSz = sizeof(Hashes);
  5610. byte encodedSig[MAX_ENCODED_SIG_SZ];
  5611. word32 extraSz = 0; /* tls 1.2 hash/sig */
  5612. #ifdef CYASSL_DTLS
  5613. if (ssl->options.dtls)
  5614. verify += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  5615. #endif
  5616. length = sigOutSz;
  5617. if (IsAtLeastTLSv1_2(ssl)) {
  5618. verify[0] = sha_mac;
  5619. verify[1] = usingEcc ? ecc_dsa_sa_algo : rsa_sa_algo;
  5620. extraSz = HASH_SIG_SIZE;
  5621. }
  5622. c16toa((word16)length, verify + extraSz); /* prepend verify header*/
  5623. if (usingEcc) {
  5624. #ifdef HAVE_ECC
  5625. word32 localSz = sigOutSz;
  5626. ret = ecc_sign_hash(signBuffer + MD5_DIGEST_SIZE,
  5627. SHA_DIGEST_SIZE, verify + extraSz + VERIFY_HEADER,
  5628. &localSz, ssl->rng, &eccKey);
  5629. #endif
  5630. }
  5631. else {
  5632. if (IsAtLeastTLSv1_2(ssl)) {
  5633. byte* digest;
  5634. int typeH;
  5635. int digestSz;
  5636. /* sha1 for now */
  5637. digest = ssl->certHashes.sha;
  5638. typeH = SHAh;
  5639. digestSz = SHA_DIGEST_SIZE;
  5640. signSz = EncodeSignature(encodedSig, digest,digestSz,typeH);
  5641. signBuffer = encodedSig;
  5642. }
  5643. ret = RsaSSL_Sign(signBuffer, signSz, verify + extraSz +
  5644. VERIFY_HEADER, ENCRYPT_LEN, &key, ssl->rng);
  5645. if (ret > 0)
  5646. ret = 0; /* RSA reset */
  5647. }
  5648. if (ret == 0) {
  5649. AddHeaders(output, length + extraSz + VERIFY_HEADER,
  5650. certificate_verify, ssl);
  5651. sendSz = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ + length +
  5652. extraSz + VERIFY_HEADER;
  5653. #ifdef CYASSL_DTLS
  5654. if (ssl->options.dtls) {
  5655. sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  5656. if ((ret = DtlsPoolSave(ssl, output, sendSz)) != 0)
  5657. return ret;
  5658. }
  5659. #endif
  5660. HashOutput(ssl, output, sendSz, 0);
  5661. }
  5662. }
  5663. FreeRsaKey(&key);
  5664. #ifdef HAVE_ECC
  5665. ecc_free(&eccKey);
  5666. #endif
  5667. if (ret == 0) {
  5668. #ifdef CYASSL_CALLBACKS
  5669. if (ssl->hsInfoOn)
  5670. AddPacketName("CertificateVerify", &ssl->handShakeInfo);
  5671. if (ssl->toInfoOn)
  5672. AddPacketInfo("CertificateVerify", &ssl->timeoutInfo,
  5673. output, sendSz, ssl->heap);
  5674. #endif
  5675. ssl->buffers.outputBuffer.length += sendSz;
  5676. if (ssl->options.groupMessages)
  5677. return 0;
  5678. else
  5679. return SendBuffered(ssl);
  5680. }
  5681. else
  5682. return ret;
  5683. }
  5684. #endif /* NO_RSA */
  5685. #endif /* NO_CYASSL_CLIENT */
  5686. #ifndef NO_CYASSL_SERVER
  5687. int SendServerHello(CYASSL* ssl)
  5688. {
  5689. byte *output;
  5690. word32 length, idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  5691. int sendSz;
  5692. int ret;
  5693. length = VERSION_SZ + RAN_LEN
  5694. + ID_LEN + ENUM_LEN
  5695. + SUITE_LEN
  5696. + ENUM_LEN;
  5697. /* check for avalaible size */
  5698. if ((ret = CheckAvalaibleSize(ssl, MAX_HELLO_SZ)) != 0)
  5699. return ret;
  5700. /* get ouput buffer */
  5701. output = ssl->buffers.outputBuffer.buffer +
  5702. ssl->buffers.outputBuffer.length;
  5703. sendSz = length + HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ;
  5704. AddHeaders(output, length, server_hello, ssl);
  5705. #ifdef CYASSL_DTLS
  5706. if (ssl->options.dtls) {
  5707. idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  5708. sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  5709. }
  5710. #endif
  5711. /* now write to output */
  5712. /* first version */
  5713. output[idx++] = ssl->version.major;
  5714. output[idx++] = ssl->version.minor;
  5715. /* then random */
  5716. if (!ssl->options.resuming)
  5717. RNG_GenerateBlock(ssl->rng, ssl->arrays->serverRandom, RAN_LEN);
  5718. XMEMCPY(output + idx, ssl->arrays->serverRandom, RAN_LEN);
  5719. idx += RAN_LEN;
  5720. #ifdef SHOW_SECRETS
  5721. {
  5722. int j;
  5723. printf("server random: ");
  5724. for (j = 0; j < RAN_LEN; j++)
  5725. printf("%02x", ssl->arrays->serverRandom[j]);
  5726. printf("\n");
  5727. }
  5728. #endif
  5729. /* then session id */
  5730. output[idx++] = ID_LEN;
  5731. if (!ssl->options.resuming)
  5732. RNG_GenerateBlock(ssl->rng, ssl->arrays->sessionID, ID_LEN);
  5733. XMEMCPY(output + idx, ssl->arrays->sessionID, ID_LEN);
  5734. idx += ID_LEN;
  5735. /* then cipher suite */
  5736. output[idx++] = ssl->options.cipherSuite0;
  5737. output[idx++] = ssl->options.cipherSuite;
  5738. /* last, compression */
  5739. if (ssl->options.usingCompression)
  5740. output[idx++] = ZLIB_COMPRESSION;
  5741. else
  5742. output[idx++] = NO_COMPRESSION;
  5743. ssl->buffers.outputBuffer.length += sendSz;
  5744. #ifdef CYASSL_DTLS
  5745. if (ssl->options.dtls) {
  5746. if ((ret = DtlsPoolSave(ssl, output, sendSz)) != 0)
  5747. return ret;
  5748. }
  5749. #endif
  5750. HashOutput(ssl, output, sendSz, 0);
  5751. #ifdef CYASSL_CALLBACKS
  5752. if (ssl->hsInfoOn)
  5753. AddPacketName("ServerHello", &ssl->handShakeInfo);
  5754. if (ssl->toInfoOn)
  5755. AddPacketInfo("ServerHello", &ssl->timeoutInfo, output, sendSz,
  5756. ssl->heap);
  5757. #endif
  5758. ssl->options.serverState = SERVER_HELLO_COMPLETE;
  5759. if (ssl->options.groupMessages)
  5760. return 0;
  5761. else
  5762. return SendBuffered(ssl);
  5763. }
  5764. #ifdef HAVE_ECC
  5765. static byte SetCurveId(int size)
  5766. {
  5767. switch(size) {
  5768. case 20:
  5769. return secp160r1;
  5770. break;
  5771. case 24:
  5772. return secp192r1;
  5773. break;
  5774. case 28:
  5775. return secp224r1;
  5776. break;
  5777. case 32:
  5778. return secp256r1;
  5779. break;
  5780. case 48:
  5781. return secp384r1;
  5782. break;
  5783. case 66:
  5784. return secp521r1;
  5785. break;
  5786. default:
  5787. return 0;
  5788. }
  5789. }
  5790. #endif /* HAVE_ECC */
  5791. int SendServerKeyExchange(CYASSL* ssl)
  5792. {
  5793. int ret = 0;
  5794. (void)ssl;
  5795. #ifndef NO_PSK
  5796. if (ssl->specs.kea == psk_kea)
  5797. {
  5798. byte *output;
  5799. word32 length, idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  5800. int sendSz;
  5801. if (ssl->arrays->server_hint[0] == 0) return 0; /* don't send */
  5802. /* include size part */
  5803. length = (word32)XSTRLEN(ssl->arrays->server_hint);
  5804. if (length > MAX_PSK_ID_LEN) return SERVER_HINT_ERROR;
  5805. length += HINT_LEN_SZ;
  5806. sendSz = length + HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ;
  5807. #ifdef CYASSL_DTLS
  5808. if (ssl->options.dtls) {
  5809. sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  5810. idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  5811. }
  5812. #endif
  5813. /* check for avalaible size */
  5814. if ((ret = CheckAvalaibleSize(ssl, sendSz)) != 0)
  5815. return ret;
  5816. /* get ouput buffer */
  5817. output = ssl->buffers.outputBuffer.buffer +
  5818. ssl->buffers.outputBuffer.length;
  5819. AddHeaders(output, length, server_key_exchange, ssl);
  5820. /* key data */
  5821. c16toa((word16)(length - HINT_LEN_SZ), output + idx);
  5822. idx += HINT_LEN_SZ;
  5823. XMEMCPY(output + idx, ssl->arrays->server_hint,length -HINT_LEN_SZ);
  5824. HashOutput(ssl, output, sendSz, 0);
  5825. #ifdef CYASSL_CALLBACKS
  5826. if (ssl->hsInfoOn)
  5827. AddPacketName("ServerKeyExchange", &ssl->handShakeInfo);
  5828. if (ssl->toInfoOn)
  5829. AddPacketInfo("ServerKeyExchange", &ssl->timeoutInfo,
  5830. output, sendSz, ssl->heap);
  5831. #endif
  5832. ssl->buffers.outputBuffer.length += sendSz;
  5833. if (ssl->options.groupMessages)
  5834. ret = 0;
  5835. else
  5836. ret = SendBuffered(ssl);
  5837. ssl->options.serverState = SERVER_KEYEXCHANGE_COMPLETE;
  5838. }
  5839. #endif /*NO_PSK */
  5840. #ifdef HAVE_ECC
  5841. if (ssl->specs.kea == ecc_diffie_hellman_kea)
  5842. {
  5843. byte *output;
  5844. word32 length, idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  5845. int sendSz;
  5846. byte exportBuf[MAX_EXPORT_ECC_SZ];
  5847. word32 expSz = sizeof(exportBuf);
  5848. word32 sigSz;
  5849. word32 preSigSz, preSigIdx;
  5850. RsaKey rsaKey;
  5851. ecc_key dsaKey;
  5852. if (ssl->specs.static_ecdh) {
  5853. CYASSL_MSG("Using Static ECDH, not sending ServerKeyExchagne");
  5854. return 0;
  5855. }
  5856. /* curve type, named curve, length(1) */
  5857. length = ENUM_LEN + CURVE_LEN + ENUM_LEN;
  5858. /* pub key size */
  5859. CYASSL_MSG("Using ephemeral ECDH");
  5860. if (ecc_export_x963(ssl->eccTempKey, exportBuf, &expSz) != 0)
  5861. return ECC_EXPORT_ERROR;
  5862. length += expSz;
  5863. preSigSz = length;
  5864. preSigIdx = idx;
  5865. InitRsaKey(&rsaKey, ssl->heap);
  5866. ecc_init(&dsaKey);
  5867. /* sig length */
  5868. length += LENGTH_SZ;
  5869. if (!ssl->buffers.key.buffer) {
  5870. FreeRsaKey(&rsaKey);
  5871. ecc_free(&dsaKey);
  5872. return NO_PRIVATE_KEY;
  5873. }
  5874. if (ssl->specs.sig_algo == rsa_sa_algo) {
  5875. /* rsa sig size */
  5876. word32 i = 0;
  5877. ret = RsaPrivateKeyDecode(ssl->buffers.key.buffer, &i,
  5878. &rsaKey, ssl->buffers.key.length);
  5879. if (ret != 0) return ret;
  5880. sigSz = RsaEncryptSize(&rsaKey);
  5881. }
  5882. else if (ssl->specs.sig_algo == ecc_dsa_sa_algo) {
  5883. /* ecdsa sig size */
  5884. word32 i = 0;
  5885. ret = EccPrivateKeyDecode(ssl->buffers.key.buffer, &i,
  5886. &dsaKey, ssl->buffers.key.length);
  5887. if (ret != 0) return ret;
  5888. sigSz = ecc_sig_size(&dsaKey);
  5889. }
  5890. else {
  5891. FreeRsaKey(&rsaKey);
  5892. ecc_free(&dsaKey);
  5893. return ALGO_ID_E; /* unsupported type */
  5894. }
  5895. length += sigSz;
  5896. if (IsAtLeastTLSv1_2(ssl))
  5897. length += HASH_SIG_SIZE;
  5898. sendSz = length + HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ;
  5899. #ifdef CYASSL_DTLS
  5900. if (ssl->options.dtls) {
  5901. sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  5902. idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  5903. preSigIdx = idx;
  5904. }
  5905. #endif
  5906. /* check for avalaible size */
  5907. if ((ret = CheckAvalaibleSize(ssl, sendSz)) != 0) {
  5908. FreeRsaKey(&rsaKey);
  5909. ecc_free(&dsaKey);
  5910. return ret;
  5911. }
  5912. /* get ouput buffer */
  5913. output = ssl->buffers.outputBuffer.buffer +
  5914. ssl->buffers.outputBuffer.length;
  5915. AddHeaders(output, length, server_key_exchange, ssl);
  5916. /* key exchange data */
  5917. output[idx++] = named_curve;
  5918. output[idx++] = 0x00; /* leading zero */
  5919. output[idx++] = SetCurveId(ecc_size(ssl->eccTempKey));
  5920. output[idx++] = (byte)expSz;
  5921. XMEMCPY(output + idx, exportBuf, expSz);
  5922. idx += expSz;
  5923. if (IsAtLeastTLSv1_2(ssl)) {
  5924. output[idx++] = sha_mac;
  5925. output[idx++] = ssl->specs.sig_algo;
  5926. }
  5927. c16toa((word16)sigSz, output + idx);
  5928. idx += LENGTH_SZ;
  5929. /* do signature */
  5930. {
  5931. Md5 md5;
  5932. Sha sha;
  5933. byte hash[FINISHED_SZ];
  5934. /* md5 */
  5935. InitMd5(&md5);
  5936. Md5Update(&md5, ssl->arrays->clientRandom, RAN_LEN);
  5937. Md5Update(&md5, ssl->arrays->serverRandom, RAN_LEN);
  5938. Md5Update(&md5, output + preSigIdx, preSigSz);
  5939. Md5Final(&md5, hash);
  5940. /* sha */
  5941. InitSha(&sha);
  5942. ShaUpdate(&sha, ssl->arrays->clientRandom, RAN_LEN);
  5943. ShaUpdate(&sha, ssl->arrays->serverRandom, RAN_LEN);
  5944. ShaUpdate(&sha, output + preSigIdx, preSigSz);
  5945. ShaFinal(&sha, &hash[MD5_DIGEST_SIZE]);
  5946. if (ssl->specs.sig_algo == rsa_sa_algo) {
  5947. byte* signBuffer = hash;
  5948. word32 signSz = sizeof(hash);
  5949. byte encodedSig[MAX_ENCODED_SIG_SZ];
  5950. if (IsAtLeastTLSv1_2(ssl)) {
  5951. byte* digest;
  5952. int hType;
  5953. int digestSz;
  5954. /* sha1 for now */
  5955. digest = &hash[MD5_DIGEST_SIZE];
  5956. hType = SHAh;
  5957. digestSz = SHA_DIGEST_SIZE;
  5958. signSz = EncodeSignature(encodedSig, digest, digestSz,
  5959. hType);
  5960. signBuffer = encodedSig;
  5961. }
  5962. ret = RsaSSL_Sign(signBuffer, signSz, output + idx, sigSz,
  5963. &rsaKey, ssl->rng);
  5964. FreeRsaKey(&rsaKey);
  5965. ecc_free(&dsaKey);
  5966. if (ret > 0)
  5967. ret = 0; /* reset on success */
  5968. else
  5969. return ret;
  5970. }
  5971. else if (ssl->specs.sig_algo == ecc_dsa_sa_algo) {
  5972. word32 sz = sigSz;
  5973. ret = ecc_sign_hash(&hash[MD5_DIGEST_SIZE], SHA_DIGEST_SIZE,
  5974. output + idx, &sz, ssl->rng, &dsaKey);
  5975. FreeRsaKey(&rsaKey);
  5976. ecc_free(&dsaKey);
  5977. if (ret < 0) return ret;
  5978. }
  5979. }
  5980. HashOutput(ssl, output, sendSz, 0);
  5981. #ifdef CYASSL_CALLBACKS
  5982. if (ssl->hsInfoOn)
  5983. AddPacketName("ServerKeyExchange", &ssl->handShakeInfo);
  5984. if (ssl->toInfoOn)
  5985. AddPacketInfo("ServerKeyExchange", &ssl->timeoutInfo,
  5986. output, sendSz, ssl->heap);
  5987. #endif
  5988. ssl->buffers.outputBuffer.length += sendSz;
  5989. if (ssl->options.groupMessages)
  5990. ret = 0;
  5991. else
  5992. ret = SendBuffered(ssl);
  5993. ssl->options.serverState = SERVER_KEYEXCHANGE_COMPLETE;
  5994. }
  5995. #endif /* HAVE_ECC */
  5996. #ifdef OPENSSL_EXTRA
  5997. if (ssl->specs.kea == diffie_hellman_kea) {
  5998. byte *output;
  5999. word32 length = 0, idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  6000. int sendSz;
  6001. word32 sigSz = 0, i = 0;
  6002. word32 preSigSz = 0, preSigIdx = 0;
  6003. RsaKey rsaKey;
  6004. DhKey dhKey;
  6005. if (ssl->buffers.serverDH_P.buffer == NULL ||
  6006. ssl->buffers.serverDH_G.buffer == NULL)
  6007. return NO_DH_PARAMS;
  6008. if (ssl->buffers.serverDH_Pub.buffer == NULL) {
  6009. ssl->buffers.serverDH_Pub.buffer = (byte*)XMALLOC(
  6010. ssl->buffers.serverDH_P.length + 2, ssl->ctx->heap,
  6011. DYNAMIC_TYPE_DH);
  6012. if (ssl->buffers.serverDH_Pub.buffer == NULL)
  6013. return MEMORY_E;
  6014. }
  6015. if (ssl->buffers.serverDH_Priv.buffer == NULL) {
  6016. ssl->buffers.serverDH_Priv.buffer = (byte*)XMALLOC(
  6017. ssl->buffers.serverDH_P.length + 2, ssl->ctx->heap,
  6018. DYNAMIC_TYPE_DH);
  6019. if (ssl->buffers.serverDH_Priv.buffer == NULL)
  6020. return MEMORY_E;
  6021. }
  6022. InitDhKey(&dhKey);
  6023. ret = DhSetKey(&dhKey, ssl->buffers.serverDH_P.buffer,
  6024. ssl->buffers.serverDH_P.length,
  6025. ssl->buffers.serverDH_G.buffer,
  6026. ssl->buffers.serverDH_G.length);
  6027. if (ret == 0)
  6028. ret = DhGenerateKeyPair(&dhKey, ssl->rng,
  6029. ssl->buffers.serverDH_Priv.buffer,
  6030. &ssl->buffers.serverDH_Priv.length,
  6031. ssl->buffers.serverDH_Pub.buffer,
  6032. &ssl->buffers.serverDH_Pub.length);
  6033. FreeDhKey(&dhKey);
  6034. if (ret == 0) {
  6035. length = LENGTH_SZ * 3; /* p, g, pub */
  6036. length += ssl->buffers.serverDH_P.length +
  6037. ssl->buffers.serverDH_G.length +
  6038. ssl->buffers.serverDH_Pub.length;
  6039. preSigIdx = idx;
  6040. preSigSz = length;
  6041. /* sig length */
  6042. length += LENGTH_SZ;
  6043. if (!ssl->buffers.key.buffer)
  6044. return NO_PRIVATE_KEY;
  6045. InitRsaKey(&rsaKey, ssl->heap);
  6046. ret = RsaPrivateKeyDecode(ssl->buffers.key.buffer, &i, &rsaKey,
  6047. ssl->buffers.key.length);
  6048. if (ret == 0) {
  6049. sigSz = RsaEncryptSize(&rsaKey);
  6050. length += sigSz;
  6051. }
  6052. }
  6053. if (ret != 0) {
  6054. FreeRsaKey(&rsaKey);
  6055. return ret;
  6056. }
  6057. if (IsAtLeastTLSv1_2(ssl))
  6058. length += HASH_SIG_SIZE;
  6059. sendSz = length + HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ;
  6060. #ifdef CYASSL_DTLS
  6061. if (ssl->options.dtls) {
  6062. sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  6063. idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  6064. preSigIdx = idx;
  6065. }
  6066. #endif
  6067. /* check for avalaible size */
  6068. if ((ret = CheckAvalaibleSize(ssl, sendSz)) != 0) {
  6069. FreeRsaKey(&rsaKey);
  6070. return ret;
  6071. }
  6072. /* get ouput buffer */
  6073. output = ssl->buffers.outputBuffer.buffer +
  6074. ssl->buffers.outputBuffer.length;
  6075. AddHeaders(output, length, server_key_exchange, ssl);
  6076. /* add p, g, pub */
  6077. c16toa((word16)ssl->buffers.serverDH_P.length, output + idx);
  6078. idx += LENGTH_SZ;
  6079. XMEMCPY(output + idx, ssl->buffers.serverDH_P.buffer,
  6080. ssl->buffers.serverDH_P.length);
  6081. idx += ssl->buffers.serverDH_P.length;
  6082. /* g */
  6083. c16toa((word16)ssl->buffers.serverDH_G.length, output + idx);
  6084. idx += LENGTH_SZ;
  6085. XMEMCPY(output + idx, ssl->buffers.serverDH_G.buffer,
  6086. ssl->buffers.serverDH_G.length);
  6087. idx += ssl->buffers.serverDH_G.length;
  6088. /* pub */
  6089. c16toa((word16)ssl->buffers.serverDH_Pub.length, output + idx);
  6090. idx += LENGTH_SZ;
  6091. XMEMCPY(output + idx, ssl->buffers.serverDH_Pub.buffer,
  6092. ssl->buffers.serverDH_Pub.length);
  6093. idx += ssl->buffers.serverDH_Pub.length;
  6094. /* Add signature */
  6095. if (IsAtLeastTLSv1_2(ssl)) {
  6096. output[idx++] = sha_mac;
  6097. output[idx++] = ssl->specs.sig_algo;
  6098. }
  6099. /* size */
  6100. c16toa((word16)sigSz, output + idx);
  6101. idx += LENGTH_SZ;
  6102. /* do signature */
  6103. {
  6104. Md5 md5;
  6105. Sha sha;
  6106. byte hash[FINISHED_SZ];
  6107. /* md5 */
  6108. InitMd5(&md5);
  6109. Md5Update(&md5, ssl->arrays->clientRandom, RAN_LEN);
  6110. Md5Update(&md5, ssl->arrays->serverRandom, RAN_LEN);
  6111. Md5Update(&md5, output + preSigIdx, preSigSz);
  6112. Md5Final(&md5, hash);
  6113. /* sha */
  6114. InitSha(&sha);
  6115. ShaUpdate(&sha, ssl->arrays->clientRandom, RAN_LEN);
  6116. ShaUpdate(&sha, ssl->arrays->serverRandom, RAN_LEN);
  6117. ShaUpdate(&sha, output + preSigIdx, preSigSz);
  6118. ShaFinal(&sha, &hash[MD5_DIGEST_SIZE]);
  6119. if (ssl->specs.sig_algo == rsa_sa_algo) {
  6120. byte* signBuffer = hash;
  6121. word32 signSz = sizeof(hash);
  6122. byte encodedSig[MAX_ENCODED_SIG_SZ];
  6123. if (IsAtLeastTLSv1_2(ssl)) {
  6124. byte* digest;
  6125. int typeH;
  6126. int digestSz;
  6127. /* sha1 for now */
  6128. digest = &hash[MD5_DIGEST_SIZE];
  6129. typeH = SHAh;
  6130. digestSz = SHA_DIGEST_SIZE;
  6131. signSz = EncodeSignature(encodedSig, digest, digestSz,
  6132. typeH);
  6133. signBuffer = encodedSig;
  6134. }
  6135. ret = RsaSSL_Sign(signBuffer, signSz, output + idx, sigSz,
  6136. &rsaKey, ssl->rng);
  6137. FreeRsaKey(&rsaKey);
  6138. if (ret <= 0)
  6139. return ret;
  6140. }
  6141. }
  6142. #ifdef CYASSL_DTLS
  6143. if (ssl->options.dtls) {
  6144. if ((ret = DtlsPoolSave(ssl, output, sendSz)) != 0)
  6145. return ret;
  6146. }
  6147. #endif
  6148. HashOutput(ssl, output, sendSz, 0);
  6149. #ifdef CYASSL_CALLBACKS
  6150. if (ssl->hsInfoOn)
  6151. AddPacketName("ServerKeyExchange", &ssl->handShakeInfo);
  6152. if (ssl->toInfoOn)
  6153. AddPacketInfo("ServerKeyExchange", &ssl->timeoutInfo,
  6154. output, sendSz, ssl->heap);
  6155. #endif
  6156. ssl->buffers.outputBuffer.length += sendSz;
  6157. if (ssl->options.groupMessages)
  6158. ret = 0;
  6159. else
  6160. ret = SendBuffered(ssl);
  6161. ssl->options.serverState = SERVER_KEYEXCHANGE_COMPLETE;
  6162. }
  6163. #endif /* OPENSSL_EXTRA */
  6164. return ret;
  6165. }
  6166. /* cipher requirements */
  6167. enum {
  6168. REQUIRES_RSA,
  6169. REQUIRES_DHE,
  6170. REQUIRES_ECC_DSA,
  6171. REQUIRES_ECC_STATIC,
  6172. REQUIRES_PSK,
  6173. REQUIRES_NTRU,
  6174. REQUIRES_RSA_SIG
  6175. };
  6176. /* Does this cipher suite (first, second) have the requirement
  6177. an ephemeral key exchange will still require the key for signing
  6178. the key exchange so ECHDE_RSA requires an rsa key thus rsa_kea */
  6179. static int CipherRequires(byte first, byte second, int requirement)
  6180. {
  6181. /* ECC extensions */
  6182. if (first == ECC_BYTE) {
  6183. switch (second) {
  6184. case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA :
  6185. if (requirement == REQUIRES_RSA)
  6186. return 1;
  6187. break;
  6188. case TLS_ECDH_RSA_WITH_AES_128_CBC_SHA :
  6189. if (requirement == REQUIRES_ECC_STATIC)
  6190. return 1;
  6191. if (requirement == REQUIRES_RSA_SIG)
  6192. return 1;
  6193. break;
  6194. case TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA :
  6195. if (requirement == REQUIRES_RSA)
  6196. return 1;
  6197. break;
  6198. case TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA :
  6199. if (requirement == REQUIRES_ECC_STATIC)
  6200. return 1;
  6201. if (requirement == REQUIRES_RSA_SIG)
  6202. return 1;
  6203. break;
  6204. case TLS_ECDHE_RSA_WITH_RC4_128_SHA :
  6205. if (requirement == REQUIRES_RSA)
  6206. return 1;
  6207. break;
  6208. case TLS_ECDH_RSA_WITH_RC4_128_SHA :
  6209. if (requirement == REQUIRES_ECC_STATIC)
  6210. return 1;
  6211. if (requirement == REQUIRES_RSA_SIG)
  6212. return 1;
  6213. break;
  6214. case TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA :
  6215. if (requirement == REQUIRES_ECC_DSA)
  6216. return 1;
  6217. break;
  6218. case TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA :
  6219. if (requirement == REQUIRES_ECC_STATIC)
  6220. return 1;
  6221. break;
  6222. case TLS_ECDHE_ECDSA_WITH_RC4_128_SHA :
  6223. if (requirement == REQUIRES_ECC_DSA)
  6224. return 1;
  6225. break;
  6226. case TLS_ECDH_ECDSA_WITH_RC4_128_SHA :
  6227. if (requirement == REQUIRES_ECC_STATIC)
  6228. return 1;
  6229. break;
  6230. case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA :
  6231. if (requirement == REQUIRES_RSA)
  6232. return 1;
  6233. break;
  6234. case TLS_ECDH_RSA_WITH_AES_256_CBC_SHA :
  6235. if (requirement == REQUIRES_ECC_STATIC)
  6236. return 1;
  6237. if (requirement == REQUIRES_RSA_SIG)
  6238. return 1;
  6239. break;
  6240. case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA :
  6241. if (requirement == REQUIRES_ECC_DSA)
  6242. return 1;
  6243. break;
  6244. case TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA :
  6245. if (requirement == REQUIRES_ECC_STATIC)
  6246. return 1;
  6247. break;
  6248. case TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA :
  6249. if (requirement == REQUIRES_ECC_DSA)
  6250. return 1;
  6251. break;
  6252. case TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA :
  6253. if (requirement == REQUIRES_ECC_STATIC)
  6254. return 1;
  6255. break;
  6256. case TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 :
  6257. if (requirement == REQUIRES_ECC_DSA)
  6258. return 1;
  6259. break;
  6260. case TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 :
  6261. if (requirement == REQUIRES_ECC_DSA)
  6262. return 1;
  6263. break;
  6264. case TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 :
  6265. if (requirement == REQUIRES_ECC_STATIC)
  6266. return 1;
  6267. break;
  6268. case TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 :
  6269. if (requirement == REQUIRES_ECC_STATIC)
  6270. return 1;
  6271. break;
  6272. case TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 :
  6273. if (requirement == REQUIRES_RSA)
  6274. return 1;
  6275. break;
  6276. case TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 :
  6277. if (requirement == REQUIRES_RSA)
  6278. return 1;
  6279. break;
  6280. case TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 :
  6281. if (requirement == REQUIRES_ECC_STATIC)
  6282. return 1;
  6283. if (requirement == REQUIRES_RSA_SIG)
  6284. return 1;
  6285. break;
  6286. case TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 :
  6287. if (requirement == REQUIRES_ECC_STATIC)
  6288. return 1;
  6289. if (requirement == REQUIRES_RSA_SIG)
  6290. return 1;
  6291. break;
  6292. case TLS_RSA_WITH_AES_128_CCM_8_SHA256 :
  6293. case TLS_RSA_WITH_AES_256_CCM_8_SHA384 :
  6294. if (requirement == REQUIRES_RSA)
  6295. return 1;
  6296. if (requirement == REQUIRES_RSA_SIG)
  6297. return 1;
  6298. break;
  6299. case TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8_SHA256 :
  6300. case TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8_SHA384 :
  6301. if (requirement == REQUIRES_ECC_DSA)
  6302. return 1;
  6303. break;
  6304. default:
  6305. CYASSL_MSG("Unsupported cipher suite, CipherRequires ECC");
  6306. return 0;
  6307. } /* switch */
  6308. } /* if */
  6309. if (first != ECC_BYTE) { /* normal suites */
  6310. switch (second) {
  6311. case SSL_RSA_WITH_RC4_128_SHA :
  6312. if (requirement == REQUIRES_RSA)
  6313. return 1;
  6314. break;
  6315. case TLS_NTRU_RSA_WITH_RC4_128_SHA :
  6316. if (requirement == REQUIRES_NTRU)
  6317. return 1;
  6318. break;
  6319. case SSL_RSA_WITH_RC4_128_MD5 :
  6320. if (requirement == REQUIRES_RSA)
  6321. return 1;
  6322. break;
  6323. case SSL_RSA_WITH_3DES_EDE_CBC_SHA :
  6324. if (requirement == REQUIRES_RSA)
  6325. return 1;
  6326. break;
  6327. case TLS_NTRU_RSA_WITH_3DES_EDE_CBC_SHA :
  6328. if (requirement == REQUIRES_NTRU)
  6329. return 1;
  6330. break;
  6331. case TLS_RSA_WITH_AES_128_CBC_SHA :
  6332. if (requirement == REQUIRES_RSA)
  6333. return 1;
  6334. break;
  6335. case TLS_RSA_WITH_AES_128_CBC_SHA256 :
  6336. if (requirement == REQUIRES_RSA)
  6337. return 1;
  6338. break;
  6339. case TLS_NTRU_RSA_WITH_AES_128_CBC_SHA :
  6340. if (requirement == REQUIRES_NTRU)
  6341. return 1;
  6342. break;
  6343. case TLS_RSA_WITH_AES_256_CBC_SHA :
  6344. if (requirement == REQUIRES_RSA)
  6345. return 1;
  6346. break;
  6347. case TLS_RSA_WITH_AES_256_CBC_SHA256 :
  6348. if (requirement == REQUIRES_RSA)
  6349. return 1;
  6350. break;
  6351. case TLS_RSA_WITH_NULL_SHA :
  6352. case TLS_RSA_WITH_NULL_SHA256 :
  6353. if (requirement == REQUIRES_RSA)
  6354. return 1;
  6355. break;
  6356. case TLS_NTRU_RSA_WITH_AES_256_CBC_SHA :
  6357. if (requirement == REQUIRES_NTRU)
  6358. return 1;
  6359. break;
  6360. case TLS_PSK_WITH_AES_128_CBC_SHA256 :
  6361. if (requirement == REQUIRES_PSK)
  6362. return 1;
  6363. break;
  6364. case TLS_PSK_WITH_AES_128_CBC_SHA :
  6365. if (requirement == REQUIRES_PSK)
  6366. return 1;
  6367. break;
  6368. case TLS_PSK_WITH_AES_256_CBC_SHA :
  6369. if (requirement == REQUIRES_PSK)
  6370. return 1;
  6371. break;
  6372. case TLS_PSK_WITH_NULL_SHA256 :
  6373. if (requirement == REQUIRES_PSK)
  6374. return 1;
  6375. break;
  6376. case TLS_PSK_WITH_NULL_SHA :
  6377. if (requirement == REQUIRES_PSK)
  6378. return 1;
  6379. break;
  6380. case TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 :
  6381. if (requirement == REQUIRES_RSA)
  6382. return 1;
  6383. if (requirement == REQUIRES_DHE)
  6384. return 1;
  6385. break;
  6386. case TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 :
  6387. if (requirement == REQUIRES_RSA)
  6388. return 1;
  6389. if (requirement == REQUIRES_DHE)
  6390. return 1;
  6391. break;
  6392. case TLS_DHE_RSA_WITH_AES_128_CBC_SHA :
  6393. if (requirement == REQUIRES_RSA)
  6394. return 1;
  6395. if (requirement == REQUIRES_DHE)
  6396. return 1;
  6397. break;
  6398. case TLS_DHE_RSA_WITH_AES_256_CBC_SHA :
  6399. if (requirement == REQUIRES_RSA)
  6400. return 1;
  6401. if (requirement == REQUIRES_DHE)
  6402. return 1;
  6403. break;
  6404. case TLS_RSA_WITH_HC_128_CBC_MD5 :
  6405. if (requirement == REQUIRES_RSA)
  6406. return 1;
  6407. break;
  6408. case TLS_RSA_WITH_HC_128_CBC_SHA :
  6409. if (requirement == REQUIRES_RSA)
  6410. return 1;
  6411. break;
  6412. case TLS_RSA_WITH_RABBIT_CBC_SHA :
  6413. if (requirement == REQUIRES_RSA)
  6414. return 1;
  6415. break;
  6416. case TLS_RSA_WITH_AES_128_GCM_SHA256 :
  6417. case TLS_RSA_WITH_AES_256_GCM_SHA384 :
  6418. if (requirement == REQUIRES_RSA)
  6419. return 1;
  6420. break;
  6421. case TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 :
  6422. case TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 :
  6423. if (requirement == REQUIRES_RSA)
  6424. return 1;
  6425. if (requirement == REQUIRES_DHE)
  6426. return 1;
  6427. break;
  6428. case TLS_RSA_WITH_CAMELLIA_128_CBC_SHA :
  6429. case TLS_RSA_WITH_CAMELLIA_256_CBC_SHA :
  6430. case TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256 :
  6431. case TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256 :
  6432. if (requirement == REQUIRES_RSA)
  6433. return 1;
  6434. break;
  6435. case TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA :
  6436. case TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA :
  6437. case TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 :
  6438. case TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 :
  6439. if (requirement == REQUIRES_RSA)
  6440. return 1;
  6441. if (requirement == REQUIRES_RSA_SIG)
  6442. return 1;
  6443. if (requirement == REQUIRES_DHE)
  6444. return 1;
  6445. break;
  6446. default:
  6447. CYASSL_MSG("Unsupported cipher suite, CipherRequires");
  6448. return 0;
  6449. } /* switch */
  6450. } /* if ECC / Normal suites else */
  6451. return 0;
  6452. }
  6453. /* Make sure cert/key are valid for this suite, true on success */
  6454. static int VerifySuite(CYASSL* ssl, word16 idx)
  6455. {
  6456. int haveRSA = !ssl->options.haveStaticECC;
  6457. int havePSK = 0;
  6458. byte first;
  6459. byte second;
  6460. CYASSL_ENTER("VerifySuite");
  6461. if (ssl->suites == NULL) {
  6462. CYASSL_MSG("Suites pointer error");
  6463. return 0;
  6464. }
  6465. first = ssl->suites->suites[idx];
  6466. second = ssl->suites->suites[idx+1];
  6467. #ifndef NO_PSK
  6468. havePSK = ssl->options.havePSK;
  6469. #endif
  6470. if (ssl->options.haveNTRU)
  6471. haveRSA = 0;
  6472. if (CipherRequires(first, second, REQUIRES_RSA)) {
  6473. CYASSL_MSG("Requires RSA");
  6474. if (haveRSA == 0) {
  6475. CYASSL_MSG("Don't have RSA");
  6476. return 0;
  6477. }
  6478. }
  6479. if (CipherRequires(first, second, REQUIRES_DHE)) {
  6480. CYASSL_MSG("Requires DHE");
  6481. if (ssl->options.haveDH == 0) {
  6482. CYASSL_MSG("Don't have DHE");
  6483. return 0;
  6484. }
  6485. }
  6486. if (CipherRequires(first, second, REQUIRES_ECC_DSA)) {
  6487. CYASSL_MSG("Requires ECCDSA");
  6488. if (ssl->options.haveECDSAsig == 0) {
  6489. CYASSL_MSG("Don't have ECCDSA");
  6490. return 0;
  6491. }
  6492. }
  6493. if (CipherRequires(first, second, REQUIRES_ECC_STATIC)) {
  6494. CYASSL_MSG("Requires static ECC");
  6495. if (ssl->options.haveStaticECC == 0) {
  6496. CYASSL_MSG("Don't have static ECC");
  6497. return 0;
  6498. }
  6499. }
  6500. if (CipherRequires(first, second, REQUIRES_PSK)) {
  6501. CYASSL_MSG("Requires PSK");
  6502. if (havePSK == 0) {
  6503. CYASSL_MSG("Don't have PSK");
  6504. return 0;
  6505. }
  6506. }
  6507. if (CipherRequires(first, second, REQUIRES_NTRU)) {
  6508. CYASSL_MSG("Requires NTRU");
  6509. if (ssl->options.haveNTRU == 0) {
  6510. CYASSL_MSG("Don't have NTRU");
  6511. return 0;
  6512. }
  6513. }
  6514. if (CipherRequires(first, second, REQUIRES_RSA_SIG)) {
  6515. CYASSL_MSG("Requires RSA Signature");
  6516. if (ssl->options.side == SERVER_END && ssl->options.haveECDSAsig == 1) {
  6517. CYASSL_MSG("Don't have RSA Signature");
  6518. return 0;
  6519. }
  6520. }
  6521. /* ECCDHE is always supported if ECC on */
  6522. return 1;
  6523. }
  6524. static int MatchSuite(CYASSL* ssl, Suites* peerSuites)
  6525. {
  6526. word16 i, j;
  6527. CYASSL_ENTER("MatchSuite");
  6528. /* & 0x1 equivalent % 2 */
  6529. if (peerSuites->suiteSz == 0 || peerSuites->suiteSz & 0x1)
  6530. return MATCH_SUITE_ERROR;
  6531. if (ssl->suites == NULL)
  6532. return SUITES_ERROR;
  6533. /* start with best, if a match we are good */
  6534. for (i = 0; i < ssl->suites->suiteSz; i += 2)
  6535. for (j = 0; j < peerSuites->suiteSz; j += 2)
  6536. if (ssl->suites->suites[i] == peerSuites->suites[j] &&
  6537. ssl->suites->suites[i+1] == peerSuites->suites[j+1] ) {
  6538. if (VerifySuite(ssl, i)) {
  6539. CYASSL_MSG("Verified suite validity");
  6540. ssl->options.cipherSuite0 = ssl->suites->suites[i];
  6541. ssl->options.cipherSuite = ssl->suites->suites[i+1];
  6542. return SetCipherSpecs(ssl);
  6543. }
  6544. else {
  6545. CYASSL_MSG("Could not verify suite validity, continue");
  6546. }
  6547. }
  6548. return MATCH_SUITE_ERROR;
  6549. }
  6550. /* process old style client hello, deprecate? */
  6551. int ProcessOldClientHello(CYASSL* ssl, const byte* input, word32* inOutIdx,
  6552. word32 inSz, word16 sz)
  6553. {
  6554. word32 idx = *inOutIdx;
  6555. word16 sessionSz;
  6556. word16 randomSz;
  6557. word16 i, j;
  6558. ProtocolVersion pv;
  6559. Suites clSuites;
  6560. (void)inSz;
  6561. CYASSL_MSG("Got old format client hello");
  6562. #ifdef CYASSL_CALLBACKS
  6563. if (ssl->hsInfoOn)
  6564. AddPacketName("ClientHello", &ssl->handShakeInfo);
  6565. if (ssl->toInfoOn)
  6566. AddLateName("ClientHello", &ssl->timeoutInfo);
  6567. #endif
  6568. /* manually hash input since different format */
  6569. #ifndef NO_MD5
  6570. Md5Update(&ssl->hashMd5, input + idx, sz);
  6571. #endif
  6572. ShaUpdate(&ssl->hashSha, input + idx, sz);
  6573. #ifndef NO_SHA256
  6574. if (IsAtLeastTLSv1_2(ssl))
  6575. Sha256Update(&ssl->hashSha256, input + idx, sz);
  6576. #endif
  6577. /* does this value mean client_hello? */
  6578. idx++;
  6579. /* version */
  6580. pv.major = input[idx++];
  6581. pv.minor = input[idx++];
  6582. ssl->chVersion = pv; /* store */
  6583. if (ssl->version.minor > pv.minor) {
  6584. byte haveRSA = 0;
  6585. byte havePSK = 0;
  6586. if (!ssl->options.downgrade) {
  6587. CYASSL_MSG("Client trying to connect with lesser version");
  6588. return VERSION_ERROR;
  6589. }
  6590. if (pv.minor == SSLv3_MINOR) {
  6591. /* turn off tls */
  6592. CYASSL_MSG(" downgrading to SSLv3");
  6593. ssl->options.tls = 0;
  6594. ssl->options.tls1_1 = 0;
  6595. ssl->version.minor = SSLv3_MINOR;
  6596. }
  6597. else if (pv.minor == TLSv1_MINOR) {
  6598. CYASSL_MSG(" downgrading to TLSv1");
  6599. /* turn off tls 1.1+ */
  6600. ssl->options.tls1_1 = 0;
  6601. ssl->version.minor = TLSv1_MINOR;
  6602. }
  6603. else if (pv.minor == TLSv1_1_MINOR) {
  6604. CYASSL_MSG(" downgrading to TLSv1.1");
  6605. ssl->version.minor = TLSv1_1_MINOR;
  6606. }
  6607. #ifndef NO_RSA
  6608. haveRSA = 1;
  6609. #endif
  6610. #ifndef NO_PSK
  6611. havePSK = ssl->options.havePSK;
  6612. #endif
  6613. InitSuites(ssl->suites, ssl->version, haveRSA, havePSK,
  6614. ssl->options.haveDH, ssl->options.haveNTRU,
  6615. ssl->options.haveECDSAsig, ssl->options.haveStaticECC,
  6616. ssl->options.side);
  6617. }
  6618. /* suite size */
  6619. ato16(&input[idx], &clSuites.suiteSz);
  6620. idx += 2;
  6621. if (clSuites.suiteSz > MAX_SUITE_SZ)
  6622. return BUFFER_ERROR;
  6623. /* session size */
  6624. ato16(&input[idx], &sessionSz);
  6625. idx += 2;
  6626. if (sessionSz > ID_LEN)
  6627. return BUFFER_ERROR;
  6628. /* random size */
  6629. ato16(&input[idx], &randomSz);
  6630. idx += 2;
  6631. if (randomSz > RAN_LEN)
  6632. return BUFFER_ERROR;
  6633. /* suites */
  6634. for (i = 0, j = 0; i < clSuites.suiteSz; i += 3) {
  6635. byte first = input[idx++];
  6636. if (!first) { /* implicit: skip sslv2 type */
  6637. XMEMCPY(&clSuites.suites[j], &input[idx], 2);
  6638. j += 2;
  6639. }
  6640. idx += 2;
  6641. }
  6642. clSuites.suiteSz = j;
  6643. /* session id */
  6644. if (sessionSz) {
  6645. XMEMCPY(ssl->arrays->sessionID, input + idx, sessionSz);
  6646. idx += sessionSz;
  6647. ssl->options.resuming = 1;
  6648. }
  6649. /* random */
  6650. if (randomSz < RAN_LEN)
  6651. XMEMSET(ssl->arrays->clientRandom, 0, RAN_LEN - randomSz);
  6652. XMEMCPY(&ssl->arrays->clientRandom[RAN_LEN - randomSz], input + idx,
  6653. randomSz);
  6654. idx += randomSz;
  6655. if (ssl->options.usingCompression)
  6656. ssl->options.usingCompression = 0; /* turn off */
  6657. ssl->options.clientState = CLIENT_HELLO_COMPLETE;
  6658. *inOutIdx = idx;
  6659. ssl->options.haveSessionId = 1;
  6660. /* DoClientHello uses same resume code */
  6661. if (ssl->options.resuming) { /* let's try */
  6662. int ret;
  6663. CYASSL_SESSION* session = GetSession(ssl,ssl->arrays->masterSecret);
  6664. if (!session) {
  6665. CYASSL_MSG("Session lookup for resume failed");
  6666. ssl->options.resuming = 0;
  6667. } else {
  6668. if (MatchSuite(ssl, &clSuites) < 0) {
  6669. CYASSL_MSG("Unsupported cipher suite, OldClientHello");
  6670. return UNSUPPORTED_SUITE;
  6671. }
  6672. RNG_GenerateBlock(ssl->rng, ssl->arrays->serverRandom, RAN_LEN);
  6673. #ifndef NO_OLD_TLS
  6674. if (ssl->options.tls)
  6675. ret = DeriveTlsKeys(ssl);
  6676. else
  6677. ret = DeriveKeys(ssl);
  6678. #else
  6679. ret = DeriveTlsKeys(ssl);
  6680. #endif
  6681. ssl->options.clientState = CLIENT_KEYEXCHANGE_COMPLETE;
  6682. return ret;
  6683. }
  6684. }
  6685. return MatchSuite(ssl, &clSuites);
  6686. }
  6687. static int DoClientHello(CYASSL* ssl, const byte* input, word32* inOutIdx,
  6688. word32 totalSz, word32 helloSz)
  6689. {
  6690. byte b;
  6691. ProtocolVersion pv;
  6692. Suites clSuites;
  6693. word32 i = *inOutIdx;
  6694. word32 begin = i;
  6695. #ifdef CYASSL_CALLBACKS
  6696. if (ssl->hsInfoOn) AddPacketName("ClientHello", &ssl->handShakeInfo);
  6697. if (ssl->toInfoOn) AddLateName("ClientHello", &ssl->timeoutInfo);
  6698. #endif
  6699. /* make sure can read up to session */
  6700. if (i + sizeof(pv) + RAN_LEN + ENUM_LEN > totalSz)
  6701. return INCOMPLETE_DATA;
  6702. XMEMCPY(&pv, input + i, sizeof(pv));
  6703. ssl->chVersion = pv; /* store */
  6704. i += (word32)sizeof(pv);
  6705. if (ssl->version.minor > pv.minor) {
  6706. byte haveRSA = 0;
  6707. byte havePSK = 0;
  6708. if (!ssl->options.downgrade) {
  6709. CYASSL_MSG("Client trying to connect with lesser version");
  6710. return VERSION_ERROR;
  6711. }
  6712. if (pv.minor == SSLv3_MINOR) {
  6713. /* turn off tls */
  6714. CYASSL_MSG(" downgrading to SSLv3");
  6715. ssl->options.tls = 0;
  6716. ssl->options.tls1_1 = 0;
  6717. ssl->version.minor = SSLv3_MINOR;
  6718. }
  6719. else if (pv.minor == TLSv1_MINOR) {
  6720. /* turn off tls 1.1+ */
  6721. CYASSL_MSG(" downgrading to TLSv1");
  6722. ssl->options.tls1_1 = 0;
  6723. ssl->version.minor = TLSv1_MINOR;
  6724. }
  6725. else if (pv.minor == TLSv1_1_MINOR) {
  6726. CYASSL_MSG(" downgrading to TLSv1.1");
  6727. ssl->version.minor = TLSv1_1_MINOR;
  6728. }
  6729. #ifndef NO_RSA
  6730. haveRSA = 1;
  6731. #endif
  6732. #ifndef NO_PSK
  6733. havePSK = ssl->options.havePSK;
  6734. #endif
  6735. InitSuites(ssl->suites, ssl->version, haveRSA, havePSK,
  6736. ssl->options.haveDH, ssl->options.haveNTRU,
  6737. ssl->options.haveECDSAsig, ssl->options.haveStaticECC,
  6738. ssl->options.side);
  6739. }
  6740. /* random */
  6741. XMEMCPY(ssl->arrays->clientRandom, input + i, RAN_LEN);
  6742. i += RAN_LEN;
  6743. #ifdef SHOW_SECRETS
  6744. {
  6745. int j;
  6746. printf("client random: ");
  6747. for (j = 0; j < RAN_LEN; j++)
  6748. printf("%02x", ssl->arrays->clientRandom[j]);
  6749. printf("\n");
  6750. }
  6751. #endif
  6752. /* session id */
  6753. b = input[i++];
  6754. if (b) {
  6755. if (i + ID_LEN > totalSz)
  6756. return INCOMPLETE_DATA;
  6757. XMEMCPY(ssl->arrays->sessionID, input + i, ID_LEN);
  6758. i += b;
  6759. ssl->options.resuming= 1; /* client wants to resume */
  6760. CYASSL_MSG("Client wants to resume session");
  6761. }
  6762. #ifdef CYASSL_DTLS
  6763. /* cookie */
  6764. if (ssl->options.dtls) {
  6765. b = input[i++];
  6766. if (b) {
  6767. byte cookie[MAX_COOKIE_LEN];
  6768. if (b > MAX_COOKIE_LEN)
  6769. return BUFFER_ERROR;
  6770. if (i + b > totalSz)
  6771. return INCOMPLETE_DATA;
  6772. if ((EmbedGenerateCookie(cookie, COOKIE_SZ, ssl)
  6773. != COOKIE_SZ)
  6774. || (b != COOKIE_SZ)
  6775. || (XMEMCMP(cookie, input + i, b) != 0)) {
  6776. return COOKIE_ERROR;
  6777. }
  6778. i += b;
  6779. }
  6780. }
  6781. #endif
  6782. if (i + LENGTH_SZ > totalSz)
  6783. return INCOMPLETE_DATA;
  6784. /* suites */
  6785. ato16(&input[i], &clSuites.suiteSz);
  6786. i += 2;
  6787. /* suites and comp len */
  6788. if (i + clSuites.suiteSz + ENUM_LEN > totalSz)
  6789. return INCOMPLETE_DATA;
  6790. if (clSuites.suiteSz > MAX_SUITE_SZ)
  6791. return BUFFER_ERROR;
  6792. XMEMCPY(clSuites.suites, input + i, clSuites.suiteSz);
  6793. i += clSuites.suiteSz;
  6794. b = input[i++]; /* comp len */
  6795. if (i + b > totalSz)
  6796. return INCOMPLETE_DATA;
  6797. if (ssl->options.usingCompression) {
  6798. int match = 0;
  6799. while (b--) {
  6800. byte comp = input[i++];
  6801. if (comp == ZLIB_COMPRESSION)
  6802. match = 1;
  6803. }
  6804. if (!match) {
  6805. CYASSL_MSG("Not matching compression, turning off");
  6806. ssl->options.usingCompression = 0; /* turn off */
  6807. }
  6808. }
  6809. else
  6810. i += b; /* ignore, since we're not on */
  6811. ssl->options.clientState = CLIENT_HELLO_COMPLETE;
  6812. *inOutIdx = i;
  6813. if ( (i - begin) < helloSz)
  6814. *inOutIdx = begin + helloSz; /* skip extensions */
  6815. ssl->options.haveSessionId = 1;
  6816. /* ProcessOld uses same resume code */
  6817. if (ssl->options.resuming) { /* let's try */
  6818. int ret;
  6819. CYASSL_SESSION* session = GetSession(ssl,ssl->arrays->masterSecret);
  6820. if (!session) {
  6821. CYASSL_MSG("Session lookup for resume failed");
  6822. ssl->options.resuming = 0;
  6823. } else {
  6824. if (MatchSuite(ssl, &clSuites) < 0) {
  6825. CYASSL_MSG("Unsupported cipher suite, ClientHello");
  6826. return UNSUPPORTED_SUITE;
  6827. }
  6828. RNG_GenerateBlock(ssl->rng, ssl->arrays->serverRandom, RAN_LEN);
  6829. #ifndef NO_OLD_TLS
  6830. if (ssl->options.tls)
  6831. ret = DeriveTlsKeys(ssl);
  6832. else
  6833. ret = DeriveKeys(ssl);
  6834. #else
  6835. ret = DeriveTlsKeys(ssl);
  6836. #endif
  6837. ssl->options.clientState = CLIENT_KEYEXCHANGE_COMPLETE;
  6838. return ret;
  6839. }
  6840. }
  6841. return MatchSuite(ssl, &clSuites);
  6842. }
  6843. #if !defined(NO_RSA) || defined(HAVE_ECC)
  6844. static int DoCertificateVerify(CYASSL* ssl, byte* input, word32* inOutsz,
  6845. word32 totalSz)
  6846. {
  6847. word16 sz = 0;
  6848. word32 i = *inOutsz;
  6849. int ret = VERIFY_CERT_ERROR; /* start in error state */
  6850. byte* sig;
  6851. byte* out;
  6852. int outLen;
  6853. #ifdef CYASSL_CALLBACKS
  6854. if (ssl->hsInfoOn)
  6855. AddPacketName("CertificateVerify", &ssl->handShakeInfo);
  6856. if (ssl->toInfoOn)
  6857. AddLateName("CertificateVerify", &ssl->timeoutInfo);
  6858. #endif
  6859. if ( (i + VERIFY_HEADER) > totalSz)
  6860. return INCOMPLETE_DATA;
  6861. if (IsAtLeastTLSv1_2(ssl))
  6862. i += HASH_SIG_SIZE;
  6863. ato16(&input[i], &sz);
  6864. i += VERIFY_HEADER;
  6865. if ( (i + sz) > totalSz)
  6866. return INCOMPLETE_DATA;
  6867. if (sz > ENCRYPT_LEN)
  6868. return BUFFER_ERROR;
  6869. sig = &input[i];
  6870. *inOutsz = i + sz;
  6871. /* RSA */
  6872. #ifndef NO_RSA
  6873. if (ssl->peerRsaKeyPresent != 0) {
  6874. CYASSL_MSG("Doing RSA peer cert verify");
  6875. outLen = RsaSSL_VerifyInline(sig, sz, &out, ssl->peerRsaKey);
  6876. if (IsAtLeastTLSv1_2(ssl)) {
  6877. byte encodedSig[MAX_ENCODED_SIG_SZ];
  6878. word32 sigSz;
  6879. byte* digest;
  6880. int typeH;
  6881. int digestSz;
  6882. /* sha1 for now */
  6883. digest = ssl->certHashes.sha;
  6884. typeH = SHAh;
  6885. digestSz = SHA_DIGEST_SIZE;
  6886. sigSz = EncodeSignature(encodedSig, digest, digestSz, typeH);
  6887. if (outLen == (int)sigSz && XMEMCMP(out, encodedSig,
  6888. min(sigSz, MAX_ENCODED_SIG_SZ)) == 0)
  6889. ret = 0; /* verified */
  6890. }
  6891. else {
  6892. if (outLen == sizeof(ssl->certHashes) && XMEMCMP(out,
  6893. &ssl->certHashes, sizeof(ssl->certHashes)) == 0)
  6894. ret = 0; /* verified */
  6895. }
  6896. }
  6897. #endif
  6898. #ifdef HAVE_ECC
  6899. if (ssl->peerEccDsaKeyPresent) {
  6900. int verify = 0;
  6901. int err = -1;
  6902. CYASSL_MSG("Doing ECC peer cert verify");
  6903. err = ecc_verify_hash(sig, sz, ssl->certHashes.sha, SHA_DIGEST_SIZE,
  6904. &verify, ssl->peerEccDsaKey);
  6905. if (err == 0 && verify == 1)
  6906. ret = 0; /* verified */
  6907. }
  6908. #endif
  6909. return ret;
  6910. }
  6911. #endif /* !NO_RSA || HAVE_ECC */
  6912. int SendServerHelloDone(CYASSL* ssl)
  6913. {
  6914. byte *output;
  6915. int sendSz = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  6916. int ret;
  6917. #ifdef CYASSL_DTLS
  6918. if (ssl->options.dtls)
  6919. sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  6920. #endif
  6921. /* check for avalaible size */
  6922. if ((ret = CheckAvalaibleSize(ssl, sendSz)) != 0)
  6923. return ret;
  6924. /* get ouput buffer */
  6925. output = ssl->buffers.outputBuffer.buffer +
  6926. ssl->buffers.outputBuffer.length;
  6927. AddHeaders(output, 0, server_hello_done, ssl);
  6928. #ifdef CYASSL_DTLS
  6929. if (ssl->options.dtls) {
  6930. if ((ret = DtlsPoolSave(ssl, output, sendSz)) != 0)
  6931. return 0;
  6932. }
  6933. #endif
  6934. HashOutput(ssl, output, sendSz, 0);
  6935. #ifdef CYASSL_CALLBACKS
  6936. if (ssl->hsInfoOn)
  6937. AddPacketName("ServerHelloDone", &ssl->handShakeInfo);
  6938. if (ssl->toInfoOn)
  6939. AddPacketInfo("ServerHelloDone", &ssl->timeoutInfo, output, sendSz,
  6940. ssl->heap);
  6941. #endif
  6942. ssl->options.serverState = SERVER_HELLODONE_COMPLETE;
  6943. ssl->buffers.outputBuffer.length += sendSz;
  6944. return SendBuffered(ssl);
  6945. }
  6946. #ifdef CYASSL_DTLS
  6947. int SendHelloVerifyRequest(CYASSL* ssl)
  6948. {
  6949. byte* output;
  6950. byte cookieSz = COOKIE_SZ;
  6951. int length = VERSION_SZ + ENUM_LEN + cookieSz;
  6952. int idx = DTLS_RECORD_HEADER_SZ + DTLS_HANDSHAKE_HEADER_SZ;
  6953. int sendSz = length + idx;
  6954. int ret;
  6955. /* check for avalaible size */
  6956. if ((ret = CheckAvalaibleSize(ssl, sendSz)) != 0)
  6957. return ret;
  6958. /* get ouput buffer */
  6959. output = ssl->buffers.outputBuffer.buffer +
  6960. ssl->buffers.outputBuffer.length;
  6961. AddHeaders(output, length, hello_verify_request, ssl);
  6962. output[idx++] = ssl->chVersion.major;
  6963. output[idx++] = ssl->chVersion.minor;
  6964. output[idx++] = cookieSz;
  6965. if ((ret = EmbedGenerateCookie(output + idx, cookieSz, ssl)) < 0)
  6966. return ret;
  6967. HashOutput(ssl, output, sendSz, 0);
  6968. #ifdef CYASSL_CALLBACKS
  6969. if (ssl->hsInfoOn)
  6970. AddPacketName("HelloVerifyRequest", &ssl->handShakeInfo);
  6971. if (ssl->toInfoOn)
  6972. AddPacketInfo("HelloVerifyRequest", &ssl->timeoutInfo, output,
  6973. sendSz, ssl->heap);
  6974. #endif
  6975. ssl->options.serverState = SERVER_HELLOVERIFYREQUEST_COMPLETE;
  6976. ssl->buffers.outputBuffer.length += sendSz;
  6977. return SendBuffered(ssl);
  6978. }
  6979. #endif
  6980. static int DoClientKeyExchange(CYASSL* ssl, byte* input,
  6981. word32* inOutIdx, word32 totalSz)
  6982. {
  6983. int ret = 0;
  6984. word32 length = 0;
  6985. byte* out = NULL;
  6986. (void)length; /* shut up compiler warnings */
  6987. (void)out;
  6988. (void)input;
  6989. (void)inOutIdx;
  6990. (void)totalSz;
  6991. if (ssl->options.clientState < CLIENT_HELLO_COMPLETE) {
  6992. CYASSL_MSG("Client sending keyexchange at wrong time");
  6993. SendAlert(ssl, alert_fatal, unexpected_message);
  6994. return OUT_OF_ORDER_E;
  6995. }
  6996. #ifndef NO_CERTS
  6997. if (ssl->options.verifyPeer && ssl->options.failNoCert)
  6998. if (!ssl->options.havePeerCert) {
  6999. CYASSL_MSG("client didn't present peer cert");
  7000. return NO_PEER_CERT;
  7001. }
  7002. #endif
  7003. #ifdef CYASSL_CALLBACKS
  7004. if (ssl->hsInfoOn)
  7005. AddPacketName("ClientKeyExchange", &ssl->handShakeInfo);
  7006. if (ssl->toInfoOn)
  7007. AddLateName("ClientKeyExchange", &ssl->timeoutInfo);
  7008. #endif
  7009. switch (ssl->specs.kea) {
  7010. #ifndef NO_RSA
  7011. case rsa_kea:
  7012. {
  7013. word32 idx = 0;
  7014. RsaKey key;
  7015. byte* tmp = 0;
  7016. InitRsaKey(&key, ssl->heap);
  7017. if (ssl->buffers.key.buffer)
  7018. ret = RsaPrivateKeyDecode(ssl->buffers.key.buffer, &idx,
  7019. &key, ssl->buffers.key.length);
  7020. else
  7021. return NO_PRIVATE_KEY;
  7022. if (ret == 0) {
  7023. length = RsaEncryptSize(&key);
  7024. ssl->arrays->preMasterSz = SECRET_LEN;
  7025. if (ssl->options.tls) {
  7026. word16 check;
  7027. ato16(input + *inOutIdx, &check);
  7028. if ((word32)check != length) {
  7029. CYASSL_MSG("RSA explicit size doesn't match");
  7030. FreeRsaKey(&key);
  7031. return RSA_PRIVATE_ERROR;
  7032. }
  7033. (*inOutIdx) += 2;
  7034. }
  7035. tmp = input + *inOutIdx;
  7036. *inOutIdx += length;
  7037. if (*inOutIdx > totalSz) {
  7038. CYASSL_MSG("RSA message too big");
  7039. FreeRsaKey(&key);
  7040. return INCOMPLETE_DATA;
  7041. }
  7042. if (RsaPrivateDecryptInline(tmp, length, &out, &key) ==
  7043. SECRET_LEN) {
  7044. XMEMCPY(ssl->arrays->preMasterSecret, out, SECRET_LEN);
  7045. if (ssl->arrays->preMasterSecret[0] !=
  7046. ssl->chVersion.major
  7047. || ssl->arrays->preMasterSecret[1] !=
  7048. ssl->chVersion.minor)
  7049. ret = PMS_VERSION_ERROR;
  7050. else
  7051. ret = MakeMasterSecret(ssl);
  7052. }
  7053. else
  7054. ret = RSA_PRIVATE_ERROR;
  7055. }
  7056. FreeRsaKey(&key);
  7057. }
  7058. break;
  7059. #endif
  7060. #ifndef NO_PSK
  7061. case psk_kea:
  7062. {
  7063. byte* pms = ssl->arrays->preMasterSecret;
  7064. word16 ci_sz;
  7065. ato16(&input[*inOutIdx], &ci_sz);
  7066. *inOutIdx += LENGTH_SZ;
  7067. if (ci_sz > MAX_PSK_ID_LEN) return CLIENT_ID_ERROR;
  7068. XMEMCPY(ssl->arrays->client_identity, &input[*inOutIdx], ci_sz);
  7069. *inOutIdx += ci_sz;
  7070. ssl->arrays->client_identity[ci_sz] = 0;
  7071. ssl->arrays->psk_keySz = ssl->options.server_psk_cb(ssl,
  7072. ssl->arrays->client_identity, ssl->arrays->psk_key,
  7073. MAX_PSK_KEY_LEN);
  7074. if (ssl->arrays->psk_keySz == 0 ||
  7075. ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN)
  7076. return PSK_KEY_ERROR;
  7077. /* make psk pre master secret */
  7078. /* length of key + length 0s + length of key + key */
  7079. c16toa((word16)ssl->arrays->psk_keySz, pms);
  7080. pms += 2;
  7081. XMEMSET(pms, 0, ssl->arrays->psk_keySz);
  7082. pms += ssl->arrays->psk_keySz;
  7083. c16toa((word16)ssl->arrays->psk_keySz, pms);
  7084. pms += 2;
  7085. XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  7086. ssl->arrays->preMasterSz = ssl->arrays->psk_keySz * 2 + 4;
  7087. ret = MakeMasterSecret(ssl);
  7088. }
  7089. break;
  7090. #endif /* NO_PSK */
  7091. #ifdef HAVE_NTRU
  7092. case ntru_kea:
  7093. {
  7094. word32 rc;
  7095. word16 cipherLen;
  7096. word16 plainLen = sizeof(ssl->arrays->preMasterSecret);
  7097. byte* tmp;
  7098. if (!ssl->buffers.key.buffer)
  7099. return NO_PRIVATE_KEY;
  7100. ato16(&input[*inOutIdx], &cipherLen);
  7101. *inOutIdx += LENGTH_SZ;
  7102. if (cipherLen > MAX_NTRU_ENCRYPT_SZ)
  7103. return NTRU_KEY_ERROR;
  7104. tmp = input + *inOutIdx;
  7105. rc = crypto_ntru_decrypt((word16)ssl->buffers.key.length,
  7106. ssl->buffers.key.buffer, cipherLen, tmp, &plainLen,
  7107. ssl->arrays->preMasterSecret);
  7108. if (rc != NTRU_OK || plainLen != SECRET_LEN)
  7109. return NTRU_DECRYPT_ERROR;
  7110. *inOutIdx += cipherLen;
  7111. ssl->arrays->preMasterSz = plainLen;
  7112. ret = MakeMasterSecret(ssl);
  7113. }
  7114. break;
  7115. #endif /* HAVE_NTRU */
  7116. #ifdef HAVE_ECC
  7117. case ecc_diffie_hellman_kea:
  7118. {
  7119. word32 size;
  7120. word32 bLength = input[*inOutIdx]; /* one byte length */
  7121. *inOutIdx += 1;
  7122. ret = ecc_import_x963(&input[*inOutIdx],
  7123. bLength, ssl->peerEccKey);
  7124. if (ret != 0)
  7125. return ECC_PEERKEY_ERROR;
  7126. *inOutIdx += bLength;
  7127. ssl->peerEccKeyPresent = 1;
  7128. size = sizeof(ssl->arrays->preMasterSecret);
  7129. if (ssl->specs.static_ecdh) {
  7130. ecc_key staticKey;
  7131. word32 i = 0;
  7132. ecc_init(&staticKey);
  7133. ret = EccPrivateKeyDecode(ssl->buffers.key.buffer, &i,
  7134. &staticKey, ssl->buffers.key.length);
  7135. if (ret == 0)
  7136. ret = ecc_shared_secret(&staticKey, ssl->peerEccKey,
  7137. ssl->arrays->preMasterSecret, &size);
  7138. ecc_free(&staticKey);
  7139. }
  7140. else
  7141. ret = ecc_shared_secret(ssl->eccTempKey, ssl->peerEccKey,
  7142. ssl->arrays->preMasterSecret, &size);
  7143. if (ret != 0)
  7144. return ECC_SHARED_ERROR;
  7145. ssl->arrays->preMasterSz = size;
  7146. ret = MakeMasterSecret(ssl);
  7147. }
  7148. break;
  7149. #endif /* HAVE_ECC */
  7150. #ifdef OPENSSL_EXTRA
  7151. case diffie_hellman_kea:
  7152. {
  7153. byte* clientPub;
  7154. word16 clientPubSz;
  7155. DhKey dhKey;
  7156. ato16(&input[*inOutIdx], &clientPubSz);
  7157. *inOutIdx += LENGTH_SZ;
  7158. clientPub = &input[*inOutIdx];
  7159. *inOutIdx += clientPubSz;
  7160. InitDhKey(&dhKey);
  7161. ret = DhSetKey(&dhKey, ssl->buffers.serverDH_P.buffer,
  7162. ssl->buffers.serverDH_P.length,
  7163. ssl->buffers.serverDH_G.buffer,
  7164. ssl->buffers.serverDH_G.length);
  7165. if (ret == 0)
  7166. ret = DhAgree(&dhKey, ssl->arrays->preMasterSecret,
  7167. &ssl->arrays->preMasterSz,
  7168. ssl->buffers.serverDH_Priv.buffer,
  7169. ssl->buffers.serverDH_Priv.length,
  7170. clientPub, clientPubSz);
  7171. FreeDhKey(&dhKey);
  7172. if (ret == 0)
  7173. ret = MakeMasterSecret(ssl);
  7174. }
  7175. break;
  7176. #endif /* OPENSSL_EXTRA */
  7177. default:
  7178. {
  7179. CYASSL_MSG("Bad kea type");
  7180. ret = BAD_KEA_TYPE_E;
  7181. }
  7182. break;
  7183. }
  7184. if (ret == 0) {
  7185. ssl->options.clientState = CLIENT_KEYEXCHANGE_COMPLETE;
  7186. #ifndef NO_CERTS
  7187. if (ssl->options.verifyPeer)
  7188. BuildCertHashes(ssl, &ssl->certHashes);
  7189. #endif
  7190. }
  7191. return ret;
  7192. }
  7193. #endif /* NO_CYASSL_SERVER */
  7194. #ifdef SINGLE_THREADED
  7195. int InitMutex(CyaSSL_Mutex* m)
  7196. {
  7197. (void)m;
  7198. return 0;
  7199. }
  7200. int FreeMutex(CyaSSL_Mutex *m)
  7201. {
  7202. (void)m;
  7203. return 0;
  7204. }
  7205. int LockMutex(CyaSSL_Mutex *m)
  7206. {
  7207. (void)m;
  7208. return 0;
  7209. }
  7210. int UnLockMutex(CyaSSL_Mutex *m)
  7211. {
  7212. (void)m;
  7213. return 0;
  7214. }
  7215. #else /* MULTI_THREAD */
  7216. #if defined(FREERTOS)
  7217. int InitMutex(CyaSSL_Mutex* m)
  7218. {
  7219. int iReturn;
  7220. *m = ( CyaSSL_Mutex ) xSemaphoreCreateMutex();
  7221. if( *m != NULL )
  7222. iReturn = 0;
  7223. else
  7224. iReturn = BAD_MUTEX_ERROR;
  7225. return iReturn;
  7226. }
  7227. int FreeMutex(CyaSSL_Mutex* m)
  7228. {
  7229. vSemaphoreDelete( *m );
  7230. return 0;
  7231. }
  7232. int LockMutex(CyaSSL_Mutex* m)
  7233. {
  7234. /* Assume an infinite block, or should there be zero block? */
  7235. xSemaphoreTake( *m, portMAX_DELAY );
  7236. return 0;
  7237. }
  7238. int UnLockMutex(CyaSSL_Mutex* m)
  7239. {
  7240. xSemaphoreGive( *m );
  7241. return 0;
  7242. }
  7243. #elif defined(CYASSL_SAFERTOS)
  7244. int InitMutex(CyaSSL_Mutex* m)
  7245. {
  7246. vSemaphoreCreateBinary(m->mutexBuffer, m->mutex);
  7247. if (m->mutex == NULL)
  7248. return BAD_MUTEX_ERROR;
  7249. return 0;
  7250. }
  7251. int FreeMutex(CyaSSL_Mutex* m)
  7252. {
  7253. (void)m;
  7254. return 0;
  7255. }
  7256. int LockMutex(CyaSSL_Mutex* m)
  7257. {
  7258. /* Assume an infinite block */
  7259. xSemaphoreTake(m->mutex, portMAX_DELAY);
  7260. return 0;
  7261. }
  7262. int UnLockMutex(CyaSSL_Mutex* m)
  7263. {
  7264. xSemaphoreGive(m->mutex);
  7265. return 0;
  7266. }
  7267. #elif defined(USE_WINDOWS_API)
  7268. int InitMutex(CyaSSL_Mutex* m)
  7269. {
  7270. InitializeCriticalSection(m);
  7271. return 0;
  7272. }
  7273. int FreeMutex(CyaSSL_Mutex* m)
  7274. {
  7275. DeleteCriticalSection(m);
  7276. return 0;
  7277. }
  7278. int LockMutex(CyaSSL_Mutex* m)
  7279. {
  7280. EnterCriticalSection(m);
  7281. return 0;
  7282. }
  7283. int UnLockMutex(CyaSSL_Mutex* m)
  7284. {
  7285. LeaveCriticalSection(m);
  7286. return 0;
  7287. }
  7288. #elif defined(CYASSL_PTHREADS)
  7289. int InitMutex(CyaSSL_Mutex* m)
  7290. {
  7291. if (pthread_mutex_init(m, 0) == 0)
  7292. return 0;
  7293. else
  7294. return BAD_MUTEX_ERROR;
  7295. }
  7296. int FreeMutex(CyaSSL_Mutex* m)
  7297. {
  7298. if (pthread_mutex_destroy(m) == 0)
  7299. return 0;
  7300. else
  7301. return BAD_MUTEX_ERROR;
  7302. }
  7303. int LockMutex(CyaSSL_Mutex* m)
  7304. {
  7305. if (pthread_mutex_lock(m) == 0)
  7306. return 0;
  7307. else
  7308. return BAD_MUTEX_ERROR;
  7309. }
  7310. int UnLockMutex(CyaSSL_Mutex* m)
  7311. {
  7312. if (pthread_mutex_unlock(m) == 0)
  7313. return 0;
  7314. else
  7315. return BAD_MUTEX_ERROR;
  7316. }
  7317. #elif defined(THREADX)
  7318. int InitMutex(CyaSSL_Mutex* m)
  7319. {
  7320. if (tx_mutex_create(m, "CyaSSL Mutex", TX_NO_INHERIT) == 0)
  7321. return 0;
  7322. else
  7323. return BAD_MUTEX_ERROR;
  7324. }
  7325. int FreeMutex(CyaSSL_Mutex* m)
  7326. {
  7327. if (tx_mutex_delete(m) == 0)
  7328. return 0;
  7329. else
  7330. return BAD_MUTEX_ERROR;
  7331. }
  7332. int LockMutex(CyaSSL_Mutex* m)
  7333. {
  7334. if (tx_mutex_get(m, TX_WAIT_FOREVER) == 0)
  7335. return 0;
  7336. else
  7337. return BAD_MUTEX_ERROR;
  7338. }
  7339. int UnLockMutex(CyaSSL_Mutex* m)
  7340. {
  7341. if (tx_mutex_put(m) == 0)
  7342. return 0;
  7343. else
  7344. return BAD_MUTEX_ERROR;
  7345. }
  7346. #elif defined(MICRIUM)
  7347. int InitMutex(CyaSSL_Mutex* m)
  7348. {
  7349. #if (NET_SECURE_MGR_CFG_EN == DEF_ENABLED)
  7350. if (NetSecure_OS_MutexCreate(m) == 0)
  7351. return 0;
  7352. else
  7353. return BAD_MUTEX_ERROR;
  7354. #else
  7355. return 0;
  7356. #endif
  7357. }
  7358. int FreeMutex(CyaSSL_Mutex* m)
  7359. {
  7360. #if (NET_SECURE_MGR_CFG_EN == DEF_ENABLED)
  7361. if (NetSecure_OS_FreeMutex(m) == 0)
  7362. return 0;
  7363. else
  7364. return BAD_MUTEX_ERROR;
  7365. #else
  7366. return 0;
  7367. #endif
  7368. }
  7369. int LockMutex(CyaSSL_Mutex* m)
  7370. {
  7371. #if (NET_SECURE_MGR_CFG_EN == DEF_ENABLED)
  7372. if (NetSecure_OS_LockMutex(m) == 0)
  7373. return 0;
  7374. else
  7375. return BAD_MUTEX_ERROR;
  7376. #else
  7377. return 0;
  7378. #endif
  7379. }
  7380. int UnLockMutex(CyaSSL_Mutex* m)
  7381. {
  7382. #if (NET_SECURE_MGR_CFG_EN == DEF_ENABLED)
  7383. if (NetSecure_OS_UnLockMutex(m) == 0)
  7384. return 0;
  7385. else
  7386. return BAD_MUTEX_ERROR;
  7387. #else
  7388. return 0;
  7389. #endif
  7390. }
  7391. #elif defined(EBSNET)
  7392. int InitMutex(CyaSSL_Mutex* m)
  7393. {
  7394. if (rtp_sig_mutex_alloc(m, "CyaSSL Mutex") == -1)
  7395. return BAD_MUTEX_ERROR;
  7396. else
  7397. return 0;
  7398. }
  7399. int FreeMutex(CyaSSL_Mutex* m)
  7400. {
  7401. rtp_sig_mutex_free(*m);
  7402. return 0;
  7403. }
  7404. int LockMutex(CyaSSL_Mutex* m)
  7405. {
  7406. if (rtp_sig_mutex_claim_timed(*m, RTIP_INF) == 0)
  7407. return 0;
  7408. else
  7409. return BAD_MUTEX_ERROR;
  7410. }
  7411. int UnLockMutex(CyaSSL_Mutex* m)
  7412. {
  7413. rtp_sig_mutex_release(*m);
  7414. return 0;
  7415. }
  7416. #elif defined(FREESCALE_MQX)
  7417. int InitMutex(CyaSSL_Mutex* m)
  7418. {
  7419. if (_mutex_init(m, NULL) == MQX_EOK)
  7420. return 0;
  7421. else
  7422. return BAD_MUTEX_ERROR;
  7423. }
  7424. int FreeMutex(CyaSSL_Mutex* m)
  7425. {
  7426. if (_mutex_destroy(m) == MQX_EOK)
  7427. return 0;
  7428. else
  7429. return BAD_MUTEX_ERROR;
  7430. }
  7431. int LockMutex(CyaSSL_Mutex* m)
  7432. {
  7433. if (_mutex_lock(m) == MQX_EOK)
  7434. return 0;
  7435. else
  7436. return BAD_MUTEX_ERROR;
  7437. }
  7438. int UnLockMutex(CyaSSL_Mutex* m)
  7439. {
  7440. if (_mutex_unlock(m) == MQX_EOK)
  7441. return 0;
  7442. else
  7443. return BAD_MUTEX_ERROR;
  7444. }
  7445. #endif /* USE_WINDOWS_API */
  7446. #endif /* SINGLE_THREADED */