36 #if defined(POLARSSL_SSL_TLS_C)
46 #if defined(POLARSSL_GCM_C)
53 #if defined _MSC_VER && !defined strcasecmp
54 #define strcasecmp _stricmp
57 #if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
59 const unsigned char *key_enc,
const unsigned char *key_dec,
60 const unsigned char *iv_enc,
const unsigned char *iv_dec,
61 const unsigned char *mac_enc,
const unsigned char *mac_dec) = NULL;
62 int (*ssl_hw_record_reset)(
ssl_context *ssl) = NULL;
63 int (*ssl_hw_record_write)(
ssl_context *ssl) = NULL;
65 int (*ssl_hw_record_finish)(
ssl_context *ssl) = NULL;
68 static int ssl_rsa_decrypt(
void *ctx,
int mode,
size_t *olen,
69 const unsigned char *input,
unsigned char *output,
70 size_t output_max_len )
76 static int ssl_rsa_sign(
void *ctx,
77 int (*f_rng)(
void *,
unsigned char *,
size_t),
void *p_rng,
78 int mode,
int hash_id,
unsigned int hashlen,
79 const unsigned char *hash,
unsigned char *sig )
85 static size_t ssl_rsa_key_len(
void *ctx )
93 static int ssl3_prf(
unsigned char *secret,
size_t slen,
char *label,
94 unsigned char *random,
size_t rlen,
95 unsigned char *dstbuf,
size_t dlen )
100 unsigned char padding[16];
101 unsigned char sha1sum[20];
112 for( i = 0; i < dlen / 16; i++ )
114 memset( padding,
'A' + i, 1 + i );
128 memset( &md5, 0,
sizeof( md5 ) );
129 memset( &sha1, 0,
sizeof( sha1 ) );
131 memset( padding, 0,
sizeof( padding ) );
132 memset( sha1sum, 0,
sizeof( sha1sum ) );
137 static int tls1_prf(
unsigned char *secret,
size_t slen,
char *label,
138 unsigned char *random,
size_t rlen,
139 unsigned char *dstbuf,
size_t dlen )
143 unsigned char *S1, *S2;
144 unsigned char tmp[128];
145 unsigned char h_i[20];
147 if(
sizeof( tmp ) < 20 + strlen( label ) + rlen )
150 hs = ( slen + 1 ) / 2;
152 S2 = secret + slen - hs;
154 nb = strlen( label );
155 memcpy( tmp + 20, label, nb );
156 memcpy( tmp + 20 + nb, random, rlen );
162 md5_hmac( S1, hs, tmp + 20, nb, 4 + tmp );
164 for( i = 0; i < dlen; i += 16 )
166 md5_hmac( S1, hs, 4 + tmp, 16 + nb, h_i );
167 md5_hmac( S1, hs, 4 + tmp, 16, 4 + tmp );
169 k = ( i + 16 > dlen ) ? dlen % 16 : 16;
171 for( j = 0; j < k; j++ )
172 dstbuf[i + j] = h_i[j];
180 for( i = 0; i < dlen; i += 20 )
185 k = ( i + 20 > dlen ) ? dlen % 20 : 20;
187 for( j = 0; j < k; j++ )
188 dstbuf[i + j] = (
unsigned char)( dstbuf[i + j] ^ h_i[j] );
191 memset( tmp, 0,
sizeof( tmp ) );
192 memset( h_i, 0,
sizeof( h_i ) );
197 static int tls_prf_sha256(
unsigned char *secret,
size_t slen,
char *label,
198 unsigned char *random,
size_t rlen,
199 unsigned char *dstbuf,
size_t dlen )
203 unsigned char tmp[128];
204 unsigned char h_i[32];
206 if(
sizeof( tmp ) < 32 + strlen( label ) + rlen )
209 nb = strlen( label );
210 memcpy( tmp + 32, label, nb );
211 memcpy( tmp + 32 + nb, random, rlen );
217 sha2_hmac( secret, slen, tmp + 32, nb, tmp, 0 );
219 for( i = 0; i < dlen; i += 32 )
221 sha2_hmac( secret, slen, tmp, 32 + nb, h_i, 0 );
222 sha2_hmac( secret, slen, tmp, 32, tmp, 0 );
224 k = ( i + 32 > dlen ) ? dlen % 32 : 32;
226 for( j = 0; j < k; j++ )
227 dstbuf[i + j] = h_i[j];
230 memset( tmp, 0,
sizeof( tmp ) );
231 memset( h_i, 0,
sizeof( h_i ) );
236 #if defined(POLARSSL_SHA4_C)
237 static int tls_prf_sha384(
unsigned char *secret,
size_t slen,
char *label,
238 unsigned char *random,
size_t rlen,
239 unsigned char *dstbuf,
size_t dlen )
243 unsigned char tmp[128];
244 unsigned char h_i[48];
246 if(
sizeof( tmp ) < 48 + strlen( label ) + rlen )
249 nb = strlen( label );
250 memcpy( tmp + 48, label, nb );
251 memcpy( tmp + 48 + nb, random, rlen );
257 sha4_hmac( secret, slen, tmp + 48, nb, tmp, 1 );
259 for( i = 0; i < dlen; i += 48 )
261 sha4_hmac( secret, slen, tmp, 48 + nb, h_i, 1 );
262 sha4_hmac( secret, slen, tmp, 48, tmp, 1 );
264 k = ( i + 48 > dlen ) ? dlen % 48 : 48;
266 for( j = 0; j < k; j++ )
267 dstbuf[i + j] = h_i[j];
270 memset( tmp, 0,
sizeof( tmp ) );
271 memset( h_i, 0,
sizeof( h_i ) );
277 static void ssl_update_checksum_start(
ssl_context *,
unsigned char *,
size_t);
278 static void ssl_update_checksum_md5sha1(
ssl_context *,
unsigned char *,
size_t);
279 static void ssl_update_checksum_sha256(
ssl_context *,
unsigned char *,
size_t);
281 static void ssl_calc_verify_ssl(
ssl_context *,
unsigned char *);
282 static void ssl_calc_verify_tls(
ssl_context *,
unsigned char *);
283 static void ssl_calc_verify_tls_sha256(
ssl_context *,
unsigned char *);
285 static void ssl_calc_finished_ssl(
ssl_context *,
unsigned char *,
int);
286 static void ssl_calc_finished_tls(
ssl_context *,
unsigned char *,
int);
287 static void ssl_calc_finished_tls_sha256(
ssl_context *,
unsigned char *,
int);
289 #if defined(POLARSSL_SHA4_C)
290 static void ssl_update_checksum_sha384(
ssl_context *,
unsigned char *,
size_t);
291 static void ssl_calc_verify_tls_sha384(
ssl_context *,
unsigned char *);
292 static void ssl_calc_finished_tls_sha384(
ssl_context *,
unsigned char *,
int);
297 unsigned char tmp[64];
298 unsigned char keyblk[256];
301 unsigned int iv_copy_len;
323 #if defined(POLARSSL_SHA4_C)
327 handshake->
tls_prf = tls_prf_sha384;
328 handshake->
calc_verify = ssl_calc_verify_tls_sha384;
334 handshake->
tls_prf = tls_prf_sha256;
335 handshake->
calc_verify = ssl_calc_verify_tls_sha256;
349 if( handshake->
resume == 0 )
367 memcpy( handshake->
randbytes, tmp + 32, 32 );
368 memcpy( handshake->
randbytes + 32, tmp, 32 );
369 memset( tmp, 0,
sizeof( tmp ) );
399 #if defined(POLARSSL_ARC4_C)
411 #if defined(POLARSSL_DES_C)
419 #if defined(POLARSSL_AES_C)
432 #if defined(POLARSSL_SHA2_C)
445 #if defined(POLARSSL_GCM_C)
462 #if defined(POLARSSL_CAMELLIA_C)
475 #if defined(POLARSSL_SHA2_C)
490 #if defined(POLARSSL_ENABLE_WEAK_CIPHERSUITES)
491 #if defined(POLARSSL_CIPHER_NULL_CIPHER)
508 #if defined(POLARSSL_DES_C)
523 SSL_DEBUG_MSG( 3, (
"keylen: %d, minlen: %d, ivlen: %d, maclen: %d",
532 key1 = keyblk + transform->
maclen * 2;
533 key2 = keyblk + transform->
maclen * 2 + transform->
keylen;
544 memcpy( transform->
iv_enc, key2 + transform->
keylen, iv_copy_len );
545 memcpy( transform->
iv_dec, key2 + transform->
keylen + iv_copy_len,
550 key1 = keyblk + transform->
maclen * 2 + transform->
keylen;
551 key2 = keyblk + transform->
maclen * 2;
562 memcpy( transform->
iv_dec, key1 + transform->
keylen, iv_copy_len );
563 memcpy( transform->
iv_enc, key1 + transform->
keylen + iv_copy_len,
567 #if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
568 if( ssl_hw_record_init != NULL)
574 if( ( ret = ssl_hw_record_init( ssl, key1, key2, transform->
iv_enc,
586 #if defined(POLARSSL_ARC4_C)
596 #if defined(POLARSSL_DES_C)
604 #if defined(POLARSSL_AES_C)
621 #if defined(POLARSSL_GCM_C)
636 #if defined(POLARSSL_CAMELLIA_C)
654 #if defined(POLARSSL_ENABLE_WEAK_CIPHERSUITES)
655 #if defined(POLARSSL_CIPHER_NULL_CIPHER)
662 #if defined(POLARSSL_DES_C)
675 memset( keyblk, 0,
sizeof( keyblk ) );
677 #if defined(POLARSSL_ZLIB_SUPPORT)
684 memset( &transform->ctx_deflate, 0,
sizeof( transform->ctx_deflate ) );
685 memset( &transform->ctx_inflate, 0,
sizeof( transform->ctx_inflate ) );
687 if( deflateInit( &transform->ctx_deflate, Z_DEFAULT_COMPRESSION ) != Z_OK ||
688 inflateInit( &transform->ctx_inflate ) != Z_OK )
701 void ssl_calc_verify_ssl(
ssl_context *ssl,
unsigned char hash[36] )
705 unsigned char pad_1[48];
706 unsigned char pad_2[48];
713 memset( pad_1, 0x36, 48 );
714 memset( pad_2, 0x5C, 48 );
742 void ssl_calc_verify_tls(
ssl_context *ssl,
unsigned char hash[36] )
761 void ssl_calc_verify_tls_sha256(
ssl_context *ssl,
unsigned char hash[32] )
776 #if defined(POLARSSL_SHA4_C)
777 void ssl_calc_verify_tls_sha384(
ssl_context *ssl,
unsigned char hash[48] )
796 static void ssl_mac_md5(
unsigned char *secret,
797 unsigned char *buf,
size_t len,
798 unsigned char *ctr,
int type )
800 unsigned char header[11];
801 unsigned char padding[48];
804 memcpy( header, ctr, 8 );
805 header[ 8] = (
unsigned char) type;
806 header[ 9] = (
unsigned char)( len >> 8 );
807 header[10] = (
unsigned char)( len );
809 memset( padding, 0x36, 48 );
817 memset( padding, 0x5C, 48 );
825 static void ssl_mac_sha1(
unsigned char *secret,
826 unsigned char *buf,
size_t len,
827 unsigned char *ctr,
int type )
829 unsigned char header[11];
830 unsigned char padding[40];
833 memcpy( header, ctr, 8 );
834 header[ 8] = (
unsigned char) type;
835 header[ 9] = (
unsigned char)( len >> 8 );
836 header[10] = (
unsigned char)( len );
838 memset( padding, 0x36, 40 );
846 memset( padding, 0x5C, 40 );
854 static void ssl_mac_sha2(
unsigned char *secret,
855 unsigned char *buf,
size_t len,
856 unsigned char *ctr,
int type )
858 unsigned char header[11];
859 unsigned char padding[32];
862 memcpy( header, ctr, 8 );
863 header[ 8] = (
unsigned char) type;
864 header[ 9] = (
unsigned char)( len >> 8 );
865 header[10] = (
unsigned char)( len );
867 memset( padding, 0x36, 32 );
875 memset( padding, 0x5C, 32 );
963 "including %d bytes of padding",
969 #if defined(POLARSSL_ARC4_C)
978 #if defined(POLARSSL_CIPHER_NULL_CIPHER)
990 unsigned char *enc_msg;
991 unsigned char add_data[13];
997 memcpy( add_data, ssl->
out_ctr, 8 );
1001 add_data[11] = ( ssl->
out_msglen >> 8 ) & 0xFF;
1007 #if defined(POLARSSL_AES_C) && defined(POLARSSL_GCM_C)
1043 "including %d bytes of padding",
1059 16, enc_msg + enc_msglen );
1062 enc_msg + enc_msglen, 16 );
1070 unsigned char *enc_msg;
1078 for( i = 0; i <= padlen; i++ )
1117 "including %d bytes of IV and %d bytes of padding",
1125 #if defined(POLARSSL_DES_C)
1127 #if defined(POLARSSL_ENABLE_WEAK_CIPHERSUITES)
1144 #if defined(POLARSSL_AES_C)
1161 #if defined(POLARSSL_CAMELLIA_C)
1183 for( i = 8; i > 0; i-- )
1184 if( ++ssl->
out_ctr[i - 1] != 0 )
1195 #define POLARSSL_SSL_MAX_MAC_SIZE 32
1199 size_t i, padlen = 0, correct = 1;
1200 unsigned char tmp[POLARSSL_SSL_MAX_MAC_SIZE];
1213 #if defined(POLARSSL_ARC4_C)
1222 #if defined(POLARSSL_CIPHER_NULL_CIPHER)
1233 unsigned char *dec_msg;
1234 unsigned char *dec_msg_result;
1236 unsigned char add_data[13];
1239 #if defined(POLARSSL_AES_C) && defined(POLARSSL_GCM_C)
1250 dec_msg_result = ssl->
in_msg;
1253 memcpy( add_data, ssl->
in_ctr, 8 );
1257 add_data[11] = ( ssl->
in_msglen >> 8 ) & 0xFF;
1280 dec_msg + dec_msglen, 16,
1281 dec_msg, dec_msg_result );
1285 SSL_DEBUG_MSG( 1, (
"AEAD decrypt failed on validation (ret = -0x%02x)",
1299 unsigned char *dec_msg;
1300 unsigned char *dec_msg_result;
1320 SSL_DEBUG_MSG( 1, (
"msglen (%d) < max( ivlen(%d), maclen (%d) + 1 ) ( + expl IV )",
1327 dec_msg_result = ssl->
in_msg;
1344 #if defined(POLARSSL_DES_C)
1346 #if defined(POLARSSL_ENABLE_WEAK_CIPHERSUITES)
1363 #if defined(POLARSSL_AES_C)
1380 #if defined(POLARSSL_CAMELLIA_C)
1405 #if defined(POLARSSL_SSL_DEBUG_ALL)
1406 SSL_DEBUG_MSG( 1, (
"msglen (%d) < maclen (%d) + padlen (%d)",
1417 #if defined(POLARSSL_SSL_DEBUG_ALL)
1419 "should be no more than %d",
1431 size_t pad_count = 0, fake_pad_count = 0;
1432 size_t padding_idx = ssl->
in_msglen - padlen - 1;
1434 for( i = 1; i <= padlen; i++ )
1435 pad_count += ( ssl->
in_msg[padding_idx + i] == padlen - 1 );
1437 for( ; i <= 256; i++ )
1438 fake_pad_count += ( ssl->
in_msg[padding_idx + i] == padlen - 1 );
1440 correct &= ( pad_count == padlen );
1441 correct &= ( pad_count + fake_pad_count < 512 );
1443 #if defined(POLARSSL_SSL_DEBUG_ALL)
1444 if( padlen > 0 && correct == 0)
1447 padlen &= correct * 0x1FF;
1500 int j, extra_run = 0;
1501 extra_run = ( 13 + ssl->
in_msglen + padlen + 8 ) / 64 -
1504 extra_run &= correct * 0xFF;
1513 for( j = 0; j < extra_run; j++ )
1523 for( j = 0; j < extra_run; j++ )
1533 for( j = 0; j < extra_run; j++ )
1551 #if defined(POLARSSL_SSL_DEBUG_ALL)
1574 "messages, possible DoS attack" ) );
1581 for( i = 8; i > 0; i-- )
1582 if( ++ssl->
in_ctr[i - 1] != 0 )
1590 #if defined(POLARSSL_ZLIB_SUPPORT)
1597 unsigned char *msg_post = ssl->
out_msg;
1599 unsigned char *msg_pre;
1603 msg_pre = (
unsigned char*) malloc( len_pre );
1604 if( msg_pre == NULL )
1610 memcpy( msg_pre, ssl->
out_msg, len_pre );
1623 ret = deflate( &ssl->
transform_out->ctx_deflate, Z_SYNC_FLUSH );
1626 SSL_DEBUG_MSG( 1, (
"failed to perform compression (%d)", ret ) );
1648 unsigned char *msg_post = ssl->
in_msg;
1650 unsigned char *msg_pre;
1654 msg_pre = (
unsigned char*) malloc( len_pre );
1655 if( msg_pre == NULL )
1661 memcpy( msg_pre, ssl->
in_msg, len_pre );
1674 ret = inflate( &ssl->
transform_in->ctx_inflate, Z_SYNC_FLUSH );
1677 SSL_DEBUG_MSG( 1, (
"failed to perform decompression (%d)", ret ) );
1707 while( ssl->
in_left < nb_want )
1749 buf = ssl->
out_hdr + 5 - header_left;
1788 ssl->
out_msg[1] = (
unsigned char)( ( len - 4 ) >> 16 );
1789 ssl->
out_msg[2] = (
unsigned char)( ( len - 4 ) >> 8 );
1790 ssl->
out_msg[3] = (
unsigned char)( ( len - 4 ) );
1795 #if defined(POLARSSL_ZLIB_SUPPORT)
1799 if( ( ret = ssl_compress_buf( ssl ) ) != 0 )
1809 #if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
1810 if( ssl_hw_record_write != NULL)
1814 ret = ssl_hw_record_write( ssl );
1828 ssl->
out_hdr[3] = (
unsigned char)( len >> 8 );
1829 ssl->
out_hdr[4] = (
unsigned char)( len );
1833 if( ( ret = ssl_encrypt_buf( ssl ) ) != 0 )
1840 ssl->
out_hdr[3] = (
unsigned char)( len >> 8 );
1841 ssl->
out_hdr[4] = (
unsigned char)( len );
1847 "version = [%d:%d], msglen = %d",
1889 " %d, type = %d, hslen = %d",
1924 "version = [%d:%d], msglen = %d",
1990 #if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
1991 if( ssl_hw_record_read != NULL)
1995 ret = ssl_hw_record_read( ssl );
2006 if( ( ret = ssl_decrypt_buf( ssl ) ) != 0 )
2008 #if defined(POLARSSL_SSL_ALERT_MESSAGES)
2030 #if defined(POLARSSL_ZLIB_SUPPORT)
2034 if( ( ret = ssl_decompress_buf( ssl ) ) != 0 )
2068 " %d, type = %d, hslen = %d",
2139 unsigned char level,
2140 unsigned char message )
2221 while( crt != NULL )
2231 ssl->
out_msg[i ] = (
unsigned char)( n >> 16 );
2232 ssl->
out_msg[i + 1] = (
unsigned char)( n >> 8 );
2233 ssl->
out_msg[i + 2] = (
unsigned char)( n );
2235 i += 3; memcpy( ssl->
out_msg + i, crt->
raw.
p, n );
2236 i += n; crt = crt->
next;
2239 ssl->
out_msg[4] = (
unsigned char)( ( i - 7 ) >> 16 );
2240 ssl->
out_msg[5] = (
unsigned char)( ( i - 7 ) >> 8 );
2241 ssl->
out_msg[6] = (
unsigned char)( ( i - 7 ) );
2313 memcmp( ssl->
in_msg + 4,
"\0\0\0", 3 ) == 0 )
2360 while( i < ssl->in_hslen )
2362 if( ssl->
in_msg[i] != 0 )
2368 n = ( (
unsigned int) ssl->
in_msg[i + 1] << 8 )
2369 | (
unsigned int) ssl->
in_msg[i + 2];
2372 if( n < 128 || i + n > ssl->
in_hslen )
2472 #if !defined(POLARSSL_SHA4_C)
2473 ((void) ciphersuite);
2478 #if defined(POLARSSL_SHA4_C)
2489 static void ssl_update_checksum_start(
ssl_context *ssl,
unsigned char *buf,
2495 #if defined(POLARSSL_SHA4_C)
2500 static void ssl_update_checksum_md5sha1(
ssl_context *ssl,
unsigned char *buf,
2507 static void ssl_update_checksum_sha256(
ssl_context *ssl,
unsigned char *buf,
2513 #if defined(POLARSSL_SHA4_C)
2514 static void ssl_update_checksum_sha384(
ssl_context *ssl,
unsigned char *buf,
2521 static void ssl_calc_finished_ssl(
2528 unsigned char padbuf[48];
2529 unsigned char md5sum[16];
2530 unsigned char sha1sum[20];
2550 #if !defined(POLARSSL_MD5_ALT)
2555 #if !defined(POLARSSL_SHA1_ALT)
2563 memset( padbuf, 0x36, 48 );
2565 md5_update( &md5, (
const unsigned char *) sender, 4 );
2570 sha1_update( &sha1, (
const unsigned char *) sender, 4 );
2575 memset( padbuf, 0x5C, 48 );
2594 memset( padbuf, 0,
sizeof( padbuf ) );
2595 memset( md5sum, 0,
sizeof( md5sum ) );
2596 memset( sha1sum, 0,
sizeof( sha1sum ) );
2601 static void ssl_calc_finished_tls(
2608 unsigned char padbuf[36];
2625 #if !defined(POLARSSL_MD5_ALT)
2630 #if !defined(POLARSSL_SHA1_ALT)
2637 :
"server finished";
2643 padbuf, 36, buf, len );
2650 memset( padbuf, 0,
sizeof( padbuf ) );
2655 static void ssl_calc_finished_tls_sha256(
2661 unsigned char padbuf[32];
2677 #if !defined(POLARSSL_SHA2_ALT)
2684 :
"server finished";
2689 padbuf, 32, buf, len );
2695 memset( padbuf, 0,
sizeof( padbuf ) );
2700 #if defined(POLARSSL_SHA4_C)
2701 static void ssl_calc_finished_tls_sha384(
2707 unsigned char padbuf[48];
2723 #if !defined(POLARSSL_SHA4_ALT)
2730 :
"server finished";
2735 padbuf, 48, buf, len );
2741 memset( padbuf, 0,
sizeof( padbuf ) );
2824 SSL_DEBUG_MSG( 3, (
"switching to new transform spec for outbound data" ) );
2843 unsigned int hash_len;
2844 unsigned char buf[36];
2853 SSL_DEBUG_MSG( 3, (
"switching to new transform spec for inbound data" ) );
2856 memset( ssl->
in_ctr, 0, 8 );
2880 if( memcmp( ssl->
in_msg + 4, buf, hash_len ) != 0 )
2926 SSL_DEBUG_MSG( 1, (
"malloc() of ssl sub-contexts failed" ) );
2937 #if defined(POLARSSL_SHA4_C)
2970 #if defined(POLARSSL_DHM_C)
2984 ssl->
in_ctr = (
unsigned char *) malloc( len );
2988 if( ssl->
in_ctr == NULL )
2994 ssl->
out_ctr = (
unsigned char *) malloc( len );
3001 free( ssl-> in_ctr );
3011 if( ( ret = ssl_handshake_init( ssl ) ) != 0 )
3052 #if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
3053 if( ssl_hw_record_reset != NULL)
3056 if( ssl_hw_record_reset( ssl ) != 0 )
3078 if( ( ret = ssl_handshake_init( ssl ) ) != 0 )
3098 int (*f_vrfy)(
void *,
x509_cert *,
int,
int *),
3106 int (*f_rng)(
void *,
unsigned char *,
size_t),
3114 void (*f_dbg)(
void *,
int,
const char *),
3122 int (*f_recv)(
void *,
unsigned char *,
size_t),
void *p_recv,
3123 int (*f_send)(
void *,
const unsigned char *,
size_t),
void *p_send )
3132 int (*f_get_cache)(
void *,
ssl_session *),
void *p_get_cache,
3133 int (*f_set_cache)(
void *,
const ssl_session *),
void *p_set_cache )
3156 int major,
int minor )
3168 x509_crl *ca_crl,
const char *peer_cn )
3196 #if defined(POLARSSL_DHM_C)
3238 if( hostname == NULL )
3247 memcpy( ssl->
hostname, (
const unsigned char *) hostname,
3257 const unsigned char *,
size_t),
3301 switch( ciphersuite_id )
3303 #if defined(POLARSSL_ARC4_C)
3305 return(
"TLS-RSA-WITH-RC4-128-MD5" );
3308 return(
"TLS-RSA-WITH-RC4-128-SHA" );
3311 #if defined(POLARSSL_DES_C)
3313 return(
"TLS-RSA-WITH-3DES-EDE-CBC-SHA" );
3316 return(
"TLS-DHE-RSA-WITH-3DES-EDE-CBC-SHA" );
3319 #if defined(POLARSSL_AES_C)
3321 return(
"TLS-RSA-WITH-AES-128-CBC-SHA" );
3324 return(
"TLS-DHE-RSA-WITH-AES-128-CBC-SHA" );
3327 return(
"TLS-RSA-WITH-AES-256-CBC-SHA" );
3330 return(
"TLS-DHE-RSA-WITH-AES-256-CBC-SHA" );
3332 #if defined(POLARSSL_SHA2_C)
3334 return(
"TLS-RSA-WITH-AES-128-CBC-SHA256" );
3337 return(
"TLS-RSA-WITH-AES-256-CBC-SHA256" );
3340 return(
"TLS-DHE-RSA-WITH-AES-128-CBC-SHA256" );
3343 return(
"TLS-DHE-RSA-WITH-AES-256-CBC-SHA256" );
3346 #if defined(POLARSSL_GCM_C) && defined(POLARSSL_SHA2_C)
3348 return(
"TLS-RSA-WITH-AES-128-GCM-SHA256" );
3351 return(
"TLS-RSA-WITH-AES-256-GCM-SHA384" );
3354 #if defined(POLARSSL_GCM_C) && defined(POLARSSL_SHA4_C)
3356 return(
"TLS-DHE-RSA-WITH-AES-128-GCM-SHA256" );
3359 return(
"TLS-DHE-RSA-WITH-AES-256-GCM-SHA384" );
3363 #if defined(POLARSSL_CAMELLIA_C)
3365 return(
"TLS-RSA-WITH-CAMELLIA-128-CBC-SHA" );
3368 return(
"TLS-DHE-RSA-WITH-CAMELLIA-128-CBC-SHA" );
3371 return(
"TLS-RSA-WITH-CAMELLIA-256-CBC-SHA" );
3374 return(
"TLS-DHE-RSA-WITH-CAMELLIA-256-CBC-SHA" );
3376 #if defined(POLARSSL_SHA2_C)
3378 return(
"TLS-RSA-WITH-CAMELLIA-128-CBC-SHA256" );
3381 return(
"TLS-DHE-RSA-WITH-CAMELLIA-128-CBC-SHA256" );
3384 return(
"TLS-RSA-WITH-CAMELLIA-256-CBC-SHA256" );
3387 return(
"TLS-DHE-RSA-WITH-CAMELLIA-256-CBC-SHA256" );
3391 #if defined(POLARSSL_ENABLE_WEAK_CIPHERSUITES)
3392 #if defined(POLARSSL_CIPHER_NULL_CIPHER)
3394 return(
"TLS-RSA-WITH-NULL-MD5" );
3396 return(
"TLS-RSA-WITH-NULL-SHA" );
3398 return(
"TLS-RSA-WITH-NULL-SHA256" );
3401 #if defined(POLARSSL_DES_C)
3403 return(
"TLS-RSA-WITH-DES-CBC-SHA" );
3405 return(
"TLS-DHE-RSA-WITH-DES-CBC-SHA" );
3413 return(
"unknown" );
3418 #if defined(POLARSSL_ARC4_C)
3419 if (0 == strcasecmp(ciphersuite_name,
"TLS-RSA-WITH-RC4-128-MD5"))
3421 if (0 == strcasecmp(ciphersuite_name,
"TLS-RSA-WITH-RC4-128-SHA"))
3425 #if defined(POLARSSL_DES_C)
3426 if (0 == strcasecmp(ciphersuite_name,
"TLS-RSA-WITH-3DES-EDE-CBC-SHA"))
3428 if (0 == strcasecmp(ciphersuite_name,
"TLS-DHE-RSA-WITH-3DES-EDE-CBC-SHA"))
3432 #if defined(POLARSSL_AES_C)
3433 if (0 == strcasecmp(ciphersuite_name,
"TLS-RSA-WITH-AES-128-CBC-SHA"))
3435 if (0 == strcasecmp(ciphersuite_name,
"TLS-DHE-RSA-WITH-AES-128-CBC-SHA"))
3437 if (0 == strcasecmp(ciphersuite_name,
"TLS-RSA-WITH-AES-256-CBC-SHA"))
3439 if (0 == strcasecmp(ciphersuite_name,
"TLS-DHE-RSA-WITH-AES-256-CBC-SHA"))
3442 #if defined(POLARSSL_SHA2_C)
3443 if (0 == strcasecmp(ciphersuite_name,
"TLS-RSA-WITH-AES-128-CBC-SHA256"))
3445 if (0 == strcasecmp(ciphersuite_name,
"TLS-RSA-WITH-AES-256-CBC-SHA256"))
3447 if (0 == strcasecmp(ciphersuite_name,
"TLS-DHE-RSA-WITH-AES-128-CBC-SHA256"))
3449 if (0 == strcasecmp(ciphersuite_name,
"TLS-DHE-RSA-WITH-AES-256-CBC-SHA256"))
3453 #if defined(POLARSSL_GCM_C) && defined(POLARSSL_SHA2_C)
3454 if (0 == strcasecmp(ciphersuite_name,
"TLS-RSA-WITH-AES-128-GCM-SHA256"))
3456 if (0 == strcasecmp(ciphersuite_name,
"TLS-RSA-WITH-AES-256-GCM-SHA384"))
3460 #if defined(POLARSSL_GCM_C) && defined(POLARSSL_SHA2_C)
3461 if (0 == strcasecmp(ciphersuite_name,
"TLS-DHE-RSA-WITH-AES-128-GCM-SHA256"))
3463 if (0 == strcasecmp(ciphersuite_name,
"TLS-DHE-RSA-WITH-AES-256-GCM-SHA384"))
3468 #if defined(POLARSSL_CAMELLIA_C)
3469 if (0 == strcasecmp(ciphersuite_name,
"TLS-RSA-WITH-CAMELLIA-128-CBC-SHA"))
3471 if (0 == strcasecmp(ciphersuite_name,
"TLS-DHE-RSA-WITH-CAMELLIA-128-CBC-SHA"))
3473 if (0 == strcasecmp(ciphersuite_name,
"TLS-RSA-WITH-CAMELLIA-256-CBC-SHA"))
3475 if (0 == strcasecmp(ciphersuite_name,
"TLS-DHE-RSA-WITH-CAMELLIA-256-CBC-SHA"))
3478 #if defined(POLARSSL_SHA2_C)
3479 if (0 == strcasecmp(ciphersuite_name,
"TLS-RSA-WITH-CAMELLIA-128-CBC-SHA256"))
3481 if (0 == strcasecmp(ciphersuite_name,
"TLS-DHE-RSA-WITH-CAMELLIA-128-CBC-SHA256"))
3483 if (0 == strcasecmp(ciphersuite_name,
"TLS-RSA-WITH-CAMELLIA-256-CBC-SHA256"))
3485 if (0 == strcasecmp(ciphersuite_name,
"TLS-DHE-RSA-WITH-CAMELLIA-256-CBC-SHA256"))
3490 #if defined(POLARSSL_ENABLE_WEAK_CIPHERSUITES)
3491 #if defined(POLARSSL_CIPHER_NULL_CIPHER)
3492 if (0 == strcasecmp(ciphersuite_name,
"TLS-RSA-WITH-NULL-MD5"))
3494 if (0 == strcasecmp(ciphersuite_name,
"TLS-RSA-WITH-NULL-SHA"))
3496 if (0 == strcasecmp(ciphersuite_name,
"TLS-RSA-WITH-NULL-SHA256"))
3500 #if defined(POLARSSL_DES_C)
3501 if (0 == strcasecmp(ciphersuite_name,
"TLS-RSA-WITH-DES-CBC-SHA"))
3503 if (0 == strcasecmp(ciphersuite_name,
"TLS-DHE-RSA-WITH-DES-CBC-SHA"))
3513 if( ssl == NULL || ssl->
session == NULL )
3524 return(
"SSLv3.0" );
3527 return(
"TLSv1.0" );
3530 return(
"TLSv1.1" );
3533 return(
"TLSv1.2" );
3538 return(
"unknown" );
3543 if( ssl == NULL || ssl->
session == NULL )
3551 #if defined(POLARSSL_DHM_C)
3552 #if defined(POLARSSL_AES_C)
3553 #if defined(POLARSSL_SHA2_C)
3556 #if defined(POLARSSL_GCM_C) && defined(POLARSSL_SHA4_C)
3560 #if defined(POLARSSL_SHA2_C)
3563 #if defined(POLARSSL_GCM_C) && defined(POLARSSL_SHA2_C)
3568 #if defined(POLARSSL_CAMELLIA_C)
3569 #if defined(POLARSSL_SHA2_C)
3573 #if defined(POLARSSL_SHA2_C)
3578 #if defined(POLARSSL_DES_C)
3583 #if defined(POLARSSL_AES_C)
3584 #if defined(POLARSSL_SHA2_C)
3587 #if defined(POLARSSL_GCM_C) && defined(POLARSSL_SHA4_C)
3592 #if defined(POLARSSL_CAMELLIA_C)
3593 #if defined(POLARSSL_SHA2_C)
3598 #if defined(POLARSSL_AES_C)
3599 #if defined(POLARSSL_SHA2_C)
3602 #if defined(POLARSSL_GCM_C) && defined(POLARSSL_SHA2_C)
3607 #if defined(POLARSSL_CAMELLIA_C)
3608 #if defined(POLARSSL_SHA2_C)
3613 #if defined(POLARSSL_DES_C)
3616 #if defined(POLARSSL_ARC4_C)
3630 #if defined(POLARSSL_SSL_CLI_C)
3635 #if defined(POLARSSL_SSL_SRV_C)
3680 if( ( ret = ssl_handshake_init( ssl ) ) != 0 )
3748 SSL_DEBUG_MSG( 1, (
"handshake received (not HelloRequest)" ) );
3756 SSL_DEBUG_MSG( 3, (
"ignoring renegotiation, sending alert" ) );
3799 memcpy( buf, ssl->
in_offt, n );
3848 memcpy( ssl->
out_msg, buf, n );
3894 #if defined(POLARSSL_ZLIB_SUPPORT)
3895 deflateEnd( &transform->ctx_deflate );
3896 inflateEnd( &transform->ctx_inflate );
3904 #if defined(POLARSSL_DHM_C)
3936 if( ssl->
in_ctr != NULL )
3942 #if defined(POLARSSL_DHM_C)
3977 #if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
3978 if( ssl_hw_record_finish != NULL )
3981 ssl_hw_record_finish( ssl );
#define SSL_ALERT_LEVEL_FATAL
#define SSL_ALERT_MSG_BAD_RECORD_MAC
#define TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
TLS 1.2.
void sha1_hmac_finish(sha1_context *ctx, unsigned char output[20])
SHA-1 HMAC final digest.
#define POLARSSL_ERR_SSL_BAD_HS_CHANGE_CIPHER_SPEC
Processing of the ChangeCipherSpec handshake message failed.
int x509parse_crt_der(x509_cert *chain, const unsigned char *buf, size_t buflen)
Parse a single DER formatted certificate and add it to the chained list.
int ssl_send_alert_message(ssl_context *ssl, unsigned char level, unsigned char message)
Send an alert message.
void(* f_dbg)(void *, int, const char *)
int(* f_rng)(void *, unsigned char *, size_t)
void sha2_hmac_update(sha2_context *ctx, const unsigned char *input, size_t ilen)
SHA-256 HMAC process buffer.
SHA-256 context structure.
#define POLARSSL_DHM_RFC5114_MODP_1024_P
int gcm_auth_decrypt(gcm_context *ctx, size_t length, const unsigned char *iv, size_t iv_len, const unsigned char *add, size_t add_len, const unsigned char *tag, size_t tag_len, const unsigned char *input, unsigned char *output)
GCM buffer authenticated decryption using AES.
#define TLS_RSA_WITH_CAMELLIA_128_CBC_SHA
void(* update_checksum)(ssl_context *, unsigned char *, size_t)
#define SSL_DEBUG_RET(level, text, ret)
#define TLS_RSA_WITH_AES_128_CBC_SHA
int(* tls_prf)(unsigned char *, size_t, char *, unsigned char *, size_t, unsigned char *, size_t)
int arc4_crypt(arc4_context *ctx, size_t length, const unsigned char *input, unsigned char *output)
ARC4 cipher function.
void arc4_setup(arc4_context *ctx, const unsigned char *key, unsigned int keylen)
ARC4 key schedule.
const int ** ciphersuites
#define TLS_RSA_WITH_RC4_128_SHA
char peer_verify_data[36]
int camellia_crypt_cbc(camellia_context *ctx, int mode, size_t length, unsigned char iv[16], const unsigned char *input, unsigned char *output)
CAMELLIA-CBC buffer encryption/decryption Length should be a multiple of the block size (16 bytes) ...
void ssl_set_own_cert(ssl_context *ssl, x509_cert *own_cert, rsa_context *rsa_key)
Set own certificate chain and private key.
ssl_transform * transform_out
#define POLARSSL_ERR_SSL_CONN_EOF
The connection indicated an EOF.
int(* f_sni)(void *, ssl_context *, const unsigned char *, size_t)
void sha1(const unsigned char *input, size_t ilen, unsigned char output[20])
Output = SHA-1( input buffer )
void(* calc_verify)(ssl_context *, unsigned char *)
#define TLS_RSA_WITH_AES_256_CBC_SHA256
TLS 1.2.
void sha1_finish(sha1_context *ctx, unsigned char output[20])
SHA-1 final digest.
void ssl_set_verify(ssl_context *ssl, int(*f_vrfy)(void *, x509_cert *, int, int *), void *p_vrfy)
Set the verification callback (Optional).
ssl_session * session_negotiate
void ssl_legacy_renegotiation(ssl_context *ssl, int allow_legacy)
Prevent or allow legacy renegotiation.
int ssl_parse_certificate(ssl_context *ssl)
void ssl_set_dbg(ssl_context *ssl, void(*f_dbg)(void *, int, const char *), void *p_dbg)
Set the debug callback.
#define POLARSSL_ERR_SSL_INVALID_RECORD
An invalid SSL record was received.
void ssl_set_own_cert_alt(ssl_context *ssl, x509_cert *own_cert, void *rsa_key, rsa_decrypt_func rsa_decrypt, rsa_sign_func rsa_sign, rsa_key_len_func rsa_key_len)
Set own certificate and alternate non-PolarSSL private key and handling callbacks, such as the PKCS#11 wrappers or any other external private key handler.
#define BADCERT_SKIP_VERIFY
Certificate verification was skipped.
void sha2_hmac_starts(sha2_context *ctx, const unsigned char *key, size_t keylen, int is224)
SHA-256 HMAC context setup.
ssl_transform * transform_in
int ssl_parse_finished(ssl_context *ssl)
x509_buf raw
The raw certificate data (DER).
int rsa_pkcs1_sign(rsa_context *ctx, int(*f_rng)(void *, unsigned char *, size_t), void *p_rng, int mode, int hash_id, unsigned int hashlen, const unsigned char *hash, unsigned char *sig)
Generic wrapper to perform a PKCS#1 signature using the mode from the context.
#define TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256
TLS 1.2.
#define SSL_RENEGOTIATION
void ssl_session_free(ssl_session *session)
Free referenced items in an SSL session including the peer certificate and clear memory.
void sha1_hmac(const unsigned char *key, size_t keylen, const unsigned char *input, size_t ilen, unsigned char output[20])
Output = HMAC-SHA-1( hmac key, input buffer )
void x509_free(x509_cert *crt)
Unallocate all certificate data.
int ssl_write_finished(ssl_context *ssl)
#define TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256
TLS 1.2.
Configuration options (set of defines)
ssl_transform * transform
#define SSL_DEBUG_MSG(level, args)
int aes_setkey_dec(aes_context *ctx, const unsigned char *key, unsigned int keysize)
AES key schedule (decryption)
#define POLARSSL_ERR_SSL_PEER_CLOSE_NOTIFY
The peer notified us that the connection is going to be closed.
void ssl_handshake_wrapup(ssl_context *ssl)
int camellia_setkey_enc(camellia_context *ctx, const unsigned char *key, unsigned int keysize)
CAMELLIA key schedule (encryption)
#define TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
void md5_finish(md5_context *ctx, unsigned char output[16])
MD5 final digest.
int(* f_send)(void *, const unsigned char *, size_t)
#define SSL_VERIFY_OPTIONAL
int ssl_set_dh_param_ctx(ssl_context *ssl, dhm_context *dhm_ctx)
Set the Diffie-Hellman public P and G values, read from existing context (server-side only) ...
#define TLS_RSA_WITH_3DES_EDE_CBC_SHA
Container for an X.509 certificate.
#define SSL_VERIFY_REQUIRED
#define SSL_ALERT_MSG_NO_RENEGOTIATION
void md5_hmac(const unsigned char *key, size_t keylen, const unsigned char *input, size_t ilen, unsigned char output[16])
Output = HMAC-MD5( hmac key, input buffer )
int ssl_handshake_server_step(ssl_context *ssl)
#define SSL_LEGACY_NO_RENEGOTIATION
#define SSL_MAJOR_VERSION_3
#define TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA
#define POLARSSL_ERR_SSL_HW_ACCEL_FAILED
Hardware acceleration function returned with error.
void ssl_set_max_version(ssl_context *ssl, int major, int minor)
Set the maximum supported version sent from the client side.
#define POLARSSL_ERR_SSL_INVALID_MAC
Verification of the message MAC failed.
#define POLARSSL_ERR_SSL_NO_CLIENT_CERTIFICATE
No client certification received from the client, but required by the authentication mode...
const int ssl_default_ciphersuites[]
void ssl_set_ciphersuites_for_version(ssl_context *ssl, const int *ciphersuites, int major, int minor)
Set the list of allowed ciphersuites for a specific version of the protocol.
int des3_set3key_enc(des3_context *ctx, const unsigned char key[DES_KEY_SIZE *3])
Triple-DES key schedule (168-bit, encryption)
int ssl_init(ssl_context *ssl)
Initialize an SSL context.
int ssl_get_ciphersuite_id(const char *ciphersuite_name)
Return the ID of the ciphersuite associated with the given name.
#define SSL_MINOR_VERSION_1
void sha2_hmac_finish(sha2_context *ctx, unsigned char output[32])
SHA-256 HMAC final digest.
#define TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
#define POLARSSL_ERR_SSL_HW_ACCEL_FALLTHROUGH
Hardware acceleration function skipped / left alone data.
int des3_set3key_dec(des3_context *ctx, const unsigned char key[DES_KEY_SIZE *3])
Triple-DES key schedule (168-bit, decryption)
unsigned char premaster[POLARSSL_MPI_MAX_SIZE]
#define POLARSSL_ERR_SSL_CERTIFICATE_REQUIRED
The own certificate is not set, but needed by the server.
void sha4_starts(sha4_context *ctx, int is384)
SHA-512 context setup.
#define SSL_ALERT_MSG_UNEXPECTED_MESSAGE
#define TLS_RSA_WITH_AES_256_GCM_SHA384
ssl_handshake_params * handshake
#define POLARSSL_ERR_SSL_CERTIFICATE_TOO_LARGE
Our own certificate(s) is/are too large to send in an SSL message.
#define SSL_MSG_HANDSHAKE
#define SSL_MINOR_VERSION_2
void sha4_hmac(const unsigned char *key, size_t keylen, const unsigned char *input, size_t ilen, unsigned char output[64], int is384)
Output = HMAC-SHA-512( hmac key, input buffer )
int ssl_write_certificate(ssl_context *ssl)
int gcm_crypt_and_tag(gcm_context *ctx, int mode, size_t length, const unsigned char *iv, size_t iv_len, const unsigned char *add, size_t add_len, const unsigned char *input, unsigned char *output, size_t tag_len, unsigned char *tag)
GCM buffer encryption/decryption using AES.
size_t(* rsa_key_len_func)(void *ctx)
#define POLARSSL_DHM_RFC5114_MODP_1024_G
rsa_key_len_func rsa_key_len
#define POLARSSL_ERR_SSL_FATAL_ALERT_MESSAGE
A fatal alert message was received from our peer.
#define TLS_RSA_WITH_CAMELLIA_256_CBC_SHA
Triple-DES context structure.
void md5_hmac_starts(md5_context *ctx, const unsigned char *key, size_t keylen)
MD5 HMAC context setup.
const char * ssl_get_ciphersuite(const ssl_context *ssl)
Return the name of the current ciphersuite.
const char * ssl_get_version(const ssl_context *ssl)
Return the current SSL version (SSLv3/TLSv1/etc)
void ssl_set_renegotiation(ssl_context *ssl, int renegotiation)
Enable / Disable renegotiation support for connection when initiated by peer (Default: SSL_RENEGOTIAT...
int aes_crypt_cbc(aes_context *ctx, int mode, size_t length, unsigned char iv[16], const unsigned char *input, unsigned char *output)
AES-CBC buffer encryption/decryption Length should be a multiple of the block size (16 bytes) ...
SHA-224 and SHA-256 cryptographic hash function.
#define SSL_MINOR_VERSION_0
#define SSL_MSG_CHANGE_CIPHER_SPEC
int rsa_pkcs1_decrypt(rsa_context *ctx, int mode, size_t *olen, const unsigned char *input, unsigned char *output, size_t output_max_len)
Generic wrapper to perform a PKCS#1 decryption using the mode from the context.
#define TLS_DHE_RSA_WITH_DES_CBC_SHA
Weak! Not in TLS 1.2.
int ssl_handshake_client_step(ssl_context *ssl)
void sha4_update(sha4_context *ctx, const unsigned char *input, size_t ilen)
SHA-512 process buffer.
#define POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE
An unexpected message was received from our peer.
unsigned char * p
ASN1 data, e.g.
#define TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA
#define POLARSSL_ERR_SSL_COMPRESSION_FAILED
Processing of the compression / decompression failed.
int(* f_vrfy)(void *, x509_cert *, int, int *)
void ssl_set_endpoint(ssl_context *ssl, int endpoint)
Set the current endpoint type.
void mpi_free(mpi *X)
Unallocate one MPI.
void ssl_set_ciphersuites(ssl_context *ssl, const int *ciphersuites)
Set the list of allowed ciphersuites (Default: ssl_default_ciphersuites) (Overrides all version speci...
void md5_process(md5_context *ctx, const unsigned char data[64])
#define TLS_RSA_WITH_NULL_SHA256
Weak!
#define SSL_ALERT_LEVEL_WARNING
void ssl_set_rng(ssl_context *ssl, int(*f_rng)(void *, unsigned char *, size_t), void *p_rng)
Set the random number generator callback.
#define TLS_RSA_WITH_RC4_128_MD5
void ssl_set_bio(ssl_context *ssl, int(*f_recv)(void *, unsigned char *, size_t), void *p_recv, int(*f_send)(void *, const unsigned char *, size_t), void *p_send)
Set the underlying BIO read and write callbacks.
void ssl_free(ssl_context *ssl)
Free referenced items in an SSL context and clear memory.
void md5_starts(md5_context *ctx)
MD5 context setup.
#define SSL_RENEGOTIATION_DISABLED
int(* rsa_sign_func)(void *ctx, int(*f_rng)(void *, unsigned char *, size_t), void *p_rng, int mode, int hash_id, unsigned int hashlen, const unsigned char *hash, unsigned char *sig)
#define POLARSSL_ERR_SSL_CA_CHAIN_REQUIRED
No CA Chain is set, but required to operate.
CAMELLIA context structure.
void ssl_handshake_free(ssl_handshake_params *handshake)
Free referenced items in an SSL handshake context and clear memory.
int ssl_flush_output(ssl_context *ssl)
int ssl_handshake(ssl_context *ssl)
Perform the SSL handshake.
rsa_decrypt_func rsa_decrypt
#define TLS_DHE_RSA_WITH_AES_256_CBC_SHA
void ssl_set_min_version(ssl_context *ssl, int major, int minor)
Set the minimum accepted SSL/TLS protocol version (Default: SSL_MAJOR_VERSION_3, SSL_MINOR_VERSION_0)...
#define SSL_COMPRESS_DEFLATE
void sha1_hmac_starts(sha1_context *ctx, const unsigned char *key, size_t keylen)
SHA-1 HMAC context setup.
void ssl_set_session(ssl_context *ssl, const ssl_session *session)
Request resumption of session (client-side only) Session data is copied from presented session struct...
int ssl_set_hostname(ssl_context *ssl, const char *hostname)
Set hostname for ServerName TLS extension (client-side only)
void md5_hmac_finish(md5_context *ctx, unsigned char output[16])
MD5 HMAC final digest.
int ssl_handshake_step(ssl_context *ssl)
Perform a single step of the SSL handshake.
#define SSL_MINOR_VERSION_3
int gcm_init(gcm_context *ctx, const unsigned char *key, unsigned int keysize)
GCM initialization (encryption)
#define POLARSSL_ERR_NET_WANT_READ
Connection requires a read call.
#define SSL_HS_CERTIFICATE
int ssl_parse_change_cipher_spec(ssl_context *ssl)
#define SSL_DEBUG_CRT(level, text, crt)
void sha1_starts(sha1_context *ctx)
SHA-1 context setup.
int des_crypt_cbc(des_context *ctx, int mode, size_t length, unsigned char iv[8], const unsigned char *input, unsigned char *output)
DES-CBC buffer encryption/decryption.
struct _x509_cert * next
Next certificate in the CA-chain.
#define SSL_ALERT_MSG_HANDSHAKE_FAILURE
int ssl_close_notify(ssl_context *ssl)
Notify the peer that the connection is being closed.
void ssl_set_session_cache(ssl_context *ssl, int(*f_get_cache)(void *, ssl_session *), void *p_get_cache, int(*f_set_cache)(void *, const ssl_session *), void *p_set_cache)
Set the session cache callbacks (server-side only) If not set, no session resuming is done...
size_t ssl_get_bytes_avail(const ssl_context *ssl)
Return the number of data bytes available to read.
#define TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
TLS 1.2.
#define SSL_DEBUG_BUF(level, text, buf, len)
int mpi_read_string(mpi *X, int radix, const char *s)
Import from an ASCII string.
#define SSL_INITIAL_HANDSHAKE
#define TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA
void sha2_update(sha2_context *ctx, const unsigned char *input, size_t ilen)
SHA-256 process buffer.
int allow_legacy_renegotiation
void sha2_process(sha2_context *ctx, const unsigned char data[64])
ssl_session * session_out
int camellia_setkey_dec(camellia_context *ctx, const unsigned char *key, unsigned int keysize)
CAMELLIA key schedule (decryption)
void(* calc_finished)(ssl_context *, unsigned char *, int)
int ssl_read_record(ssl_context *ssl)
size_t len
ASN1 length, e.g.
int des_setkey_enc(des_context *ctx, const unsigned char key[DES_KEY_SIZE])
DES key schedule (56-bit, encryption)
#define TLS_RSA_WITH_AES_256_CBC_SHA
int ssl_set_dh_param(ssl_context *ssl, const char *dhm_P, const char *dhm_G)
Set the Diffie-Hellman public P and G values, read as hexadecimal strings (server-side only) (Default...
#define TLS_RSA_WITH_AES_128_CBC_SHA256
TLS 1.2.
void sha4(const unsigned char *input, size_t ilen, unsigned char output[64], int is384)
Output = SHA-512( input buffer )
int des_setkey_dec(des_context *ctx, const unsigned char key[DES_KEY_SIZE])
DES key schedule (56-bit, decryption)
#define BADCERT_MISSING
Certificate was missing.
#define POLARSSL_ERR_SSL_BAD_HS_FINISHED
Processing of the Finished handshake message failed.
int mpi_copy(mpi *X, const mpi *Y)
Copy the contents of Y into X.
void sha2_hmac(const unsigned char *key, size_t keylen, const unsigned char *input, size_t ilen, unsigned char output[32], int is224)
Output = HMAC-SHA-256( hmac key, input buffer )
int ssl_get_verify_result(const ssl_context *ssl)
Return the result of the certificate verification.
#define SSL_ALERT_MSG_NO_CERT
Galois/Counter mode for AES.
int ssl_session_reset(ssl_context *ssl)
Reset an already initialized SSL context for re-use while retaining application-set variables...
Certificate revocation list structure.
ssl_transform * transform_negotiate
SHA-512 context structure.
#define SSL_LEGACY_RENEGOTIATION
#define POLARSSL_ERR_SSL_MALLOC_FAILED
Memory allocation failed.
int disable_renegotiation
#define SSL_ALERT_MSG_CLOSE_NOTIFY
void sha1_update(sha1_context *ctx, const unsigned char *input, size_t ilen)
SHA-1 process buffer.
#define TLS_DHE_RSA_WITH_AES_128_CBC_SHA
void dhm_free(dhm_context *ctx)
Free the components of a DHM key.
#define TLS_RSA_WITH_DES_CBC_SHA
Weak! Not in TLS 1.2.
void md5_update(md5_context *ctx, const unsigned char *input, size_t ilen)
MD5 process buffer.
int ssl_write_change_cipher_spec(ssl_context *ssl)
int(* f_get_cache)(void *, ssl_session *)
void sha2(const unsigned char *input, size_t ilen, unsigned char output[32], int is224)
Output = SHA-256( input buffer )
int ssl_derive_keys(ssl_context *ssl)
void ssl_set_authmode(ssl_context *ssl, int authmode)
Set the certificate verification mode.
void sha4_finish(sha4_context *ctx, unsigned char output[64])
SHA-512 final digest.
void sha1_process(sha1_context *ctx, const unsigned char data[64])
#define TLS_RSA_WITH_NULL_SHA
Weak!
int(* f_set_cache)(void *, const ssl_session *)
void ssl_set_ca_chain(ssl_context *ssl, x509_cert *ca_chain, x509_crl *ca_crl, const char *peer_cn)
Set the data required to verify peer certificate.
void sha1_hmac_update(sha1_context *ctx, const unsigned char *input, size_t ilen)
SHA-1 HMAC process buffer.
void ssl_optimize_checksum(ssl_context *ssl, int ciphersuite)
int x509parse_verify(x509_cert *crt, x509_cert *trust_ca, x509_crl *ca_crl, const char *cn, int *flags, int(*f_vrfy)(void *, x509_cert *, int, int *), void *p_vrfy)
Verify the certificate signature.
void md5_hmac_update(md5_context *ctx, const unsigned char *input, size_t ilen)
MD5 HMAC process buffer.
int ssl_send_fatal_handshake_failure(ssl_context *ssl)
#define TLS_RSA_WITH_AES_128_GCM_SHA256
void sha2_starts(sha2_context *ctx, int is224)
SHA-256 context setup.
int ssl_read(ssl_context *ssl, unsigned char *buf, size_t len)
Read at most 'len' application data bytes.
void ssl_transform_free(ssl_transform *transform)
Free referenced items in an SSL transform context and clear memory.
#define TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256
TLS 1.2.
#define SSL_MAX_CONTENT_LEN
Size of the input / output buffer.
#define SSL_MSG_APPLICATION_DATA
const char * ssl_get_ciphersuite_name(const int ciphersuite_id)
Return the name of the ciphersuite associated with the given ID.
int ssl_renegotiate(ssl_context *ssl)
Perform an SSL renegotiation on the running connection.
#define TLS_RSA_WITH_NULL_MD5
Weak!
int(* f_recv)(void *, unsigned char *, size_t)
int ssl_write(ssl_context *ssl, const unsigned char *buf, size_t len)
Write exactly 'len' application data bytes.
void md5(const unsigned char *input, size_t ilen, unsigned char output[16])
Output = MD5( input buffer )
#define POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE
The requested feature is not available.
#define POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE
Processing of the Certificate handshake message failed.
The ARCFOUR stream cipher.
int aes_setkey_enc(aes_context *ctx, const unsigned char *key, unsigned int keysize)
AES key schedule (encryption)
#define POLARSSL_ERR_SSL_BAD_INPUT_DATA
Bad input parameters to function.
void ssl_set_sni(ssl_context *ssl, int(*f_sni)(void *, ssl_context *, const unsigned char *, size_t), void *p_sni)
Set server side ServerName TLS extension callback (optional, server-side only).
int ssl_fetch_input(ssl_context *ssl, size_t nb_want)
#define TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256
TLS 1.2.
int ssl_write_record(ssl_context *ssl)
const x509_cert * ssl_get_peer_cert(const ssl_context *ssl)
Return the peer certificate from the current connection.
unsigned char randbytes[64]
void sha2_finish(sha2_context *ctx, unsigned char output[32])
SHA-256 final digest.
int(* rsa_decrypt_func)(void *ctx, int mode, size_t *olen, const unsigned char *input, unsigned char *output, size_t output_max_len)
int des3_crypt_cbc(des3_context *ctx, int mode, size_t length, unsigned char iv[8], const unsigned char *input, unsigned char *output)
3DES-CBC buffer encryption/decryption
#define SSL_HS_HELLO_REQUEST