32 #if defined(POLARSSL_CIPHER_C)
37 #if defined(POLARSSL_GCM_C)
43 #if defined(POLARSSL_ARC4_C) || defined(POLARSSL_CIPHER_NULL_CIPHER)
44 #define POLARSSL_CIPHER_MODE_STREAM
47 #if defined _MSC_VER && !defined strcasecmp
48 #define strcasecmp _stricmp
51 static int supported_init = 0;
58 if( ! supported_init )
63 while( def->
type != 0 )
64 *type++ = (*def++).type;
78 for( def = cipher_definitions; def->
info != NULL; def++ )
79 if( def->
type == cipher_type )
89 if( NULL == cipher_name )
92 for( def = cipher_definitions; def->
info != NULL; def++ )
93 if( ! strcasecmp( def->
info->
name, cipher_name ) )
105 for( def = cipher_definitions; def->
info != NULL; def++ )
116 if( NULL == cipher_info || NULL == ctx )
126 #if defined(POLARSSL_CIPHER_MODE_WITH_PADDING)
130 #if defined(POLARSSL_CIPHER_PADDING_PKCS7)
181 const unsigned char *iv,
size_t iv_len )
183 size_t actual_iv_size;
185 if( NULL == ctx || NULL == ctx->
cipher_info || NULL == iv )
189 actual_iv_size = iv_len;
193 memcpy( ctx->
iv, iv, actual_iv_size );
209 #if defined(POLARSSL_CIPHER_MODE_AEAD)
211 const unsigned char *ad,
size_t ad_len )
216 #if defined(POLARSSL_GCM_C)
229 unsigned char *output,
size_t *olen )
235 if( NULL == ctx || NULL == ctx->
cipher_info || NULL == olen )
256 #if defined(POLARSSL_GCM_C)
265 if( input == output &&
271 #if defined(POLARSSL_CIPHER_MODE_CBC)
350 #if defined(POLARSSL_CIPHER_MODE_CFB)
366 #if defined(POLARSSL_CIPHER_MODE_CTR)
382 #if defined(POLARSSL_CIPHER_MODE_STREAM)
386 ilen, input, output ) ) )
400 #if defined(POLARSSL_CIPHER_MODE_WITH_PADDING)
401 #if defined(POLARSSL_CIPHER_PADDING_PKCS7)
405 static void add_pkcs_padding(
unsigned char *output,
size_t output_len,
408 size_t padding_len = output_len - data_len;
411 for( i = 0; i < padding_len; i++ )
412 output[data_len + i] = (
unsigned char) padding_len;
415 static int get_pkcs_padding(
unsigned char *input,
size_t input_len,
418 size_t i, padding_len = 0;
420 if( NULL == input || NULL == data_len )
423 padding_len = input[input_len - 1];
425 if( padding_len > input_len || padding_len == 0 )
428 for( i = input_len - padding_len; i < input_len; i++ )
429 if( input[i] != padding_len )
432 *data_len = input_len - padding_len;
438 #if defined(POLARSSL_CIPHER_PADDING_ONE_AND_ZEROS)
442 static void add_one_and_zeros_padding(
unsigned char *output,
443 size_t output_len,
size_t data_len )
445 size_t padding_len = output_len - data_len;
448 output[data_len] = 0x80;
449 for( i = 1; i < padding_len; i++ )
450 output[data_len + i] = 0x00;
453 static int get_one_and_zeros_padding(
unsigned char *input,
size_t input_len,
456 unsigned char *p = input + input_len - 1;
458 if( NULL == input || NULL == data_len )
461 while( *p == 0x00 && p > input )
467 *data_len = p - input;
473 #if defined(POLARSSL_CIPHER_PADDING_ZEROS_AND_LEN)
477 static void add_zeros_and_len_padding(
unsigned char *output,
478 size_t output_len,
size_t data_len )
480 size_t padding_len = output_len - data_len;
483 for( i = 1; i < padding_len; i++ )
484 output[data_len + i - 1] = 0x00;
485 output[output_len - 1] = (
unsigned char) padding_len;
488 static int get_zeros_and_len_padding(
unsigned char *input,
size_t input_len,
491 size_t i, padding_len = 0;
493 if( NULL == input || NULL == data_len )
496 padding_len = input[input_len - 1];
498 if( padding_len > input_len || padding_len == 0 )
501 for( i = input_len - padding_len; i < input_len - 1; i++ )
502 if( input[i] != 0x00 )
505 *data_len = input_len - padding_len;
511 #if defined(POLARSSL_CIPHER_PADDING_ZEROS)
515 static void add_zeros_padding(
unsigned char *output,
516 size_t output_len,
size_t data_len )
520 for( i = data_len; i < output_len; i++ )
524 static int get_zeros_padding(
unsigned char *input,
size_t input_len,
527 unsigned char *p = input + input_len - 1;
528 if( NULL == input || NULL == data_len )
531 while( *p == 0x00 && p > input )
534 *data_len = *p == 0x00 ? 0 : p - input + 1;
546 static int get_no_padding(
unsigned char *input,
size_t input_len,
549 if( NULL == input || NULL == data_len )
552 *data_len = input_len;
559 unsigned char *output,
size_t *olen )
561 if( NULL == ctx || NULL == ctx->
cipher_info || NULL == olen )
582 #if defined(POLARSSL_CIPHER_MODE_CBC)
637 #if defined(POLARSSL_CIPHER_MODE_WITH_PADDING)
648 #if defined(POLARSSL_CIPHER_PADDING_PKCS7)
654 #if defined(POLARSSL_CIPHER_PADDING_ONE_AND_ZEROS)
660 #if defined(POLARSSL_CIPHER_PADDING_ZEROS_AND_LEN)
666 #if defined(POLARSSL_CIPHER_PADDING_ZEROS)
685 #if defined(POLARSSL_CIPHER_MODE_AEAD)
687 unsigned char *tag,
size_t tag_len )
689 if( NULL == ctx || NULL == ctx->
cipher_info || NULL == tag )
695 #if defined(POLARSSL_GCM_C)
704 const unsigned char *tag,
size_t tag_len )
714 #if defined(POLARSSL_GCM_C)
717 unsigned char check_tag[16];
721 if( tag_len >
sizeof( check_tag ) )
725 check_tag, tag_len ) ) )
731 for( diff = 0, i = 0; i < tag_len; i++ )
732 diff |= tag[i] ^ check_tag[i];
745 #if defined(POLARSSL_SELF_TEST)
749 #define ASSERT(x) if (!(x)) { \
750 printf( "failed with %i at %s\n", value, (#x) ); \