30 #if !defined(POLARSSL_CONFIG_FILE)
33 #include POLARSSL_CONFIG_FILE
36 #if defined(POLARSSL_CIPHER_C)
41 #if defined(POLARSSL_GCM_C)
45 #if defined(POLARSSL_CCM_C)
51 #if defined(POLARSSL_ARC4_C) || defined(POLARSSL_CIPHER_NULL_CIPHER)
52 #define POLARSSL_CIPHER_MODE_STREAM
55 #if defined(_MSC_VER) && !defined strcasecmp && !defined(EFIX64) && \
57 #define strcasecmp _stricmp
61 static void polarssl_zeroize(
void *v,
size_t n ) {
62 volatile unsigned char *p = v;
while( n-- ) *p++ = 0;
65 static int supported_init = 0;
72 if( ! supported_init )
77 while( def->
type != 0 )
78 *type++ = (*def++).type;
85 return( supported_ciphers );
92 for( def = cipher_definitions; def->
info != NULL; def++ )
93 if( def->
type == cipher_type )
103 if( NULL == cipher_name )
106 for( def = cipher_definitions; def->
info != NULL; def++ )
107 if( ! strcasecmp( def->
info->
name, cipher_name ) )
119 for( def = cipher_definitions; def->
info != NULL; def++ )
146 if( NULL == cipher_info || NULL == ctx )
156 #if defined(POLARSSL_CIPHER_MODE_WITH_PADDING)
160 #if defined(POLARSSL_CIPHER_PADDING_PKCS7)
212 const unsigned char *iv,
size_t iv_len )
214 size_t actual_iv_size;
216 if( NULL == ctx || NULL == ctx->
cipher_info || NULL == iv )
224 actual_iv_size = iv_len;
230 if( actual_iv_size > iv_len )
234 memcpy( ctx->
iv, iv, actual_iv_size );
250 #if defined(POLARSSL_GCM_C)
252 const unsigned char *ad,
size_t ad_len )
268 size_t ilen,
unsigned char *output,
size_t *olen )
272 if( NULL == ctx || NULL == ctx->
cipher_info || NULL == olen )
295 #if defined(POLARSSL_GCM_C)
304 if( input == output &&
310 #if defined(POLARSSL_CIPHER_MODE_CBC)
389 #if defined(POLARSSL_CIPHER_MODE_CFB)
405 #if defined(POLARSSL_CIPHER_MODE_CTR)
421 #if defined(POLARSSL_CIPHER_MODE_STREAM)
425 ilen, input, output ) ) )
439 #if defined(POLARSSL_CIPHER_MODE_WITH_PADDING)
440 #if defined(POLARSSL_CIPHER_PADDING_PKCS7)
444 static void add_pkcs_padding(
unsigned char *output,
size_t output_len,
447 size_t padding_len = output_len - data_len;
450 for( i = 0; i < padding_len; i++ )
451 output[data_len + i] = (
unsigned char) padding_len;
454 static int get_pkcs_padding(
unsigned char *input,
size_t input_len,
458 unsigned char padding_len, bad = 0;
460 if( NULL == input || NULL == data_len )
463 padding_len = input[input_len - 1];
464 *data_len = input_len - padding_len;
467 bad |= padding_len > input_len;
468 bad |= padding_len == 0;
472 pad_idx = input_len - padding_len;
473 for( i = 0; i < input_len; i++ )
474 bad |= ( input[i] ^ padding_len ) * ( i >= pad_idx );
480 #if defined(POLARSSL_CIPHER_PADDING_ONE_AND_ZEROS)
484 static void add_one_and_zeros_padding(
unsigned char *output,
485 size_t output_len,
size_t data_len )
487 size_t padding_len = output_len - data_len;
490 output[data_len] = 0x80;
491 for( i = 1; i < padding_len; i++ )
492 output[data_len + i] = 0x00;
495 static int get_one_and_zeros_padding(
unsigned char *input,
size_t input_len,
499 unsigned char done = 0, prev_done, bad;
501 if( NULL == input || NULL == data_len )
506 for( i = input_len; i > 0; i-- )
509 done |= ( input[i-1] != 0 );
510 *data_len |= ( i - 1 ) * ( done != prev_done );
511 bad &= ( input[i-1] ^ 0x80 ) | ( done == prev_done );
519 #if defined(POLARSSL_CIPHER_PADDING_ZEROS_AND_LEN)
523 static void add_zeros_and_len_padding(
unsigned char *output,
524 size_t output_len,
size_t data_len )
526 size_t padding_len = output_len - data_len;
529 for( i = 1; i < padding_len; i++ )
530 output[data_len + i - 1] = 0x00;
531 output[output_len - 1] = (
unsigned char) padding_len;
534 static int get_zeros_and_len_padding(
unsigned char *input,
size_t input_len,
538 unsigned char padding_len, bad = 0;
540 if( NULL == input || NULL == data_len )
543 padding_len = input[input_len - 1];
544 *data_len = input_len - padding_len;
547 bad |= padding_len > input_len;
548 bad |= padding_len == 0;
551 pad_idx = input_len - padding_len;
552 for( i = 0; i < input_len - 1; i++ )
553 bad |= input[i] * ( i >= pad_idx );
559 #if defined(POLARSSL_CIPHER_PADDING_ZEROS)
563 static void add_zeros_padding(
unsigned char *output,
564 size_t output_len,
size_t data_len )
568 for( i = data_len; i < output_len; i++ )
572 static int get_zeros_padding(
unsigned char *input,
size_t input_len,
576 unsigned char done = 0, prev_done;
578 if( NULL == input || NULL == data_len )
582 for( i = input_len; i > 0; i-- )
585 done |= ( input[i-1] != 0 );
586 *data_len |= i * ( done != prev_done );
599 static int get_no_padding(
unsigned char *input,
size_t input_len,
602 if( NULL == input || NULL == data_len )
605 *data_len = input_len;
612 unsigned char *output,
size_t *olen )
614 if( NULL == ctx || NULL == ctx->
cipher_info || NULL == olen )
635 #if defined(POLARSSL_CIPHER_MODE_CBC)
690 #if defined(POLARSSL_CIPHER_MODE_WITH_PADDING)
701 #if defined(POLARSSL_CIPHER_PADDING_PKCS7)
707 #if defined(POLARSSL_CIPHER_PADDING_ONE_AND_ZEROS)
713 #if defined(POLARSSL_CIPHER_PADDING_ZEROS_AND_LEN)
719 #if defined(POLARSSL_CIPHER_PADDING_ZEROS)
738 #if defined(POLARSSL_GCM_C)
740 unsigned char *tag,
size_t tag_len )
742 if( NULL == ctx || NULL == ctx->
cipher_info || NULL == tag )
755 const unsigned char *tag,
size_t tag_len )
767 unsigned char check_tag[16];
771 if( tag_len >
sizeof( check_tag ) )
775 check_tag, tag_len ) ) )
781 for( diff = 0, i = 0; i < tag_len; i++ )
782 diff |= tag[i] ^ check_tag[i];
798 const unsigned char *iv,
size_t iv_len,
799 const unsigned char *input,
size_t ilen,
800 unsigned char *output,
size_t *olen )
811 if( ( ret =
cipher_update( ctx, input, ilen, output, olen ) ) != 0 )
814 if( ( ret =
cipher_finish( ctx, output + *olen, &finish_olen ) ) != 0 )
817 *olen += finish_olen;
822 #if defined(POLARSSL_CIPHER_MODE_AEAD)
827 const unsigned char *iv,
size_t iv_len,
828 const unsigned char *ad,
size_t ad_len,
829 const unsigned char *input,
size_t ilen,
830 unsigned char *output,
size_t *olen,
831 unsigned char *tag,
size_t tag_len )
833 #if defined(POLARSSL_GCM_C)
838 iv, iv_len, ad, ad_len, input, output,
842 #if defined(POLARSSL_CCM_C)
847 iv, iv_len, ad, ad_len, input, output,
859 const unsigned char *iv,
size_t iv_len,
860 const unsigned char *ad,
size_t ad_len,
861 const unsigned char *input,
size_t ilen,
862 unsigned char *output,
size_t *olen,
863 const unsigned char *tag,
size_t tag_len )
865 #if defined(POLARSSL_GCM_C)
872 iv, iv_len, ad, ad_len,
873 tag, tag_len, input, output );
881 #if defined(POLARSSL_CCM_C)
888 iv, iv_len, ad, ad_len,
889 input, output, tag, tag_len );
903 #if defined(POLARSSL_SELF_TEST)