Add one-and-zeros (ISO/IEC 7816-4) padding
diff --git a/library/cipher.c b/library/cipher.c
index f7f3d1a..9a750db 100644
--- a/library/cipher.c
+++ b/library/cipher.c
@@ -526,6 +526,9 @@
return POLARSSL_ERR_CIPHER_FEATURE_UNAVAILABLE;
}
+/*
+ * PKCS7 (and PKCS5) padding: fill with ll bytes, with ll = padding_len
+ */
static void add_pkcs_padding( unsigned char *output, size_t output_len,
size_t data_len )
{
@@ -558,6 +561,39 @@
return 0;
}
+/*
+ * One and zeros padding: fill with 80 00 ... 00
+ */
+static void add_one_and_zeros_padding( unsigned char *output,
+ size_t output_len, size_t data_len )
+{
+ size_t padding_len = output_len - data_len;
+ unsigned char i = 0;
+
+ output[data_len] = 0x80;
+ for( i = 1; i < padding_len; i++ )
+ output[data_len + i] = 0x00;
+}
+
+static int get_one_and_zeros_padding( unsigned char *input, size_t input_len,
+ size_t *data_len )
+{
+ unsigned char *p = input + input_len - 1;
+
+ if( NULL == input || NULL == data_len )
+ return POLARSSL_ERR_CIPHER_BAD_INPUT_DATA;
+
+ while( *p == 0x00 && p > input )
+ --p;
+
+ if( *p != 0x80 )
+ return POLARSSL_ERR_CIPHER_INVALID_PADDING;
+
+ *data_len = p - input;
+
+ return 0;
+}
+
int cipher_finish( cipher_context_t *ctx, unsigned char *output, size_t *olen)
{
int ret = 0;
@@ -623,6 +659,13 @@
return 0;
}
+ if( POLARSSL_PADDING_ONE_AND_ZEROS == mode )
+ {
+ ctx->add_padding = add_one_and_zeros_padding;
+ ctx->get_padding = get_one_and_zeros_padding;
+ return 0;
+ }
+
return POLARSSL_ERR_CIPHER_BAD_INPUT_DATA;
}