ReactOS 0.4.15-dev-7842-g558ab78
pkcs5.c
Go to the documentation of this file.
1
50/*
51 * PKCS#5 includes PBKDF2 and more
52 *
53 * http://tools.ietf.org/html/rfc2898 (Specification)
54 * http://tools.ietf.org/html/rfc6070 (Test vectors)
55 */
56
57#if !defined(MBEDTLS_CONFIG_FILE)
58#include "mbedtls/config.h"
59#else
60#include MBEDTLS_CONFIG_FILE
61#endif
62
63#if defined(MBEDTLS_PKCS5_C)
64
65#include "mbedtls/pkcs5.h"
66
67#if defined(MBEDTLS_ASN1_PARSE_C)
68#include "mbedtls/asn1.h"
69#include "mbedtls/cipher.h"
70#include "mbedtls/oid.h"
71#endif /* MBEDTLS_ASN1_PARSE_C */
72
73#include <string.h>
74
75#if defined(MBEDTLS_PLATFORM_C)
76#include "mbedtls/platform.h"
77#else
78#include <stdio.h>
79#define mbedtls_printf printf
80#endif
81
82#if defined(MBEDTLS_ASN1_PARSE_C)
83static int pkcs5_parse_pbkdf2_params( const mbedtls_asn1_buf *params,
84 mbedtls_asn1_buf *salt, int *iterations,
85 int *keylen, mbedtls_md_type_t *md_type )
86{
87 int ret;
88 mbedtls_asn1_buf prf_alg_oid;
89 unsigned char *p = params->p;
90 const unsigned char *end = params->p + params->len;
91
95 /*
96 * PBKDF2-params ::= SEQUENCE {
97 * salt OCTET STRING,
98 * iterationCount INTEGER,
99 * keyLength INTEGER OPTIONAL
100 * prf AlgorithmIdentifier DEFAULT algid-hmacWithSHA1
101 * }
102 *
103 */
104 if( ( ret = mbedtls_asn1_get_tag( &p, end, &salt->len, MBEDTLS_ASN1_OCTET_STRING ) ) != 0 )
106
107 salt->p = p;
108 p += salt->len;
109
110 if( ( ret = mbedtls_asn1_get_int( &p, end, iterations ) ) != 0 )
112
113 if( p == end )
114 return( 0 );
115
116 if( ( ret = mbedtls_asn1_get_int( &p, end, keylen ) ) != 0 )
117 {
120 }
121
122 if( p == end )
123 return( 0 );
124
125 if( ( ret = mbedtls_asn1_get_alg_null( &p, end, &prf_alg_oid ) ) != 0 )
127
128 if( mbedtls_oid_get_md_hmac( &prf_alg_oid, md_type ) != 0 )
130
131 if( p != end )
134
135 return( 0 );
136}
137
138int mbedtls_pkcs5_pbes2( const mbedtls_asn1_buf *pbe_params, int mode,
139 const unsigned char *pwd, size_t pwdlen,
140 const unsigned char *data, size_t datalen,
141 unsigned char *output )
142{
143 int ret, iterations = 0, keylen = 0;
144 unsigned char *p, *end;
145 mbedtls_asn1_buf kdf_alg_oid, enc_scheme_oid, kdf_alg_params, enc_scheme_params;
146 mbedtls_asn1_buf salt;
148 unsigned char key[32], iv[32];
149 size_t olen = 0;
150 const mbedtls_md_info_t *md_info;
151 const mbedtls_cipher_info_t *cipher_info;
153 mbedtls_cipher_type_t cipher_alg;
154 mbedtls_cipher_context_t cipher_ctx;
155
156 p = pbe_params->p;
157 end = p + pbe_params->len;
158
159 /*
160 * PBES2-params ::= SEQUENCE {
161 * keyDerivationFunc AlgorithmIdentifier {{PBES2-KDFs}},
162 * encryptionScheme AlgorithmIdentifier {{PBES2-Encs}}
163 * }
164 */
165 if( pbe_params->tag != ( MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) )
168
169 if( ( ret = mbedtls_asn1_get_alg( &p, end, &kdf_alg_oid, &kdf_alg_params ) ) != 0 )
171
172 // Only PBKDF2 supported at the moment
173 //
174 if( MBEDTLS_OID_CMP( MBEDTLS_OID_PKCS5_PBKDF2, &kdf_alg_oid ) != 0 )
176
177 if( ( ret = pkcs5_parse_pbkdf2_params( &kdf_alg_params,
178 &salt, &iterations, &keylen,
179 &md_type ) ) != 0 )
180 {
181 return( ret );
182 }
183
184 md_info = mbedtls_md_info_from_type( md_type );
185 if( md_info == NULL )
187
188 if( ( ret = mbedtls_asn1_get_alg( &p, end, &enc_scheme_oid,
189 &enc_scheme_params ) ) != 0 )
190 {
192 }
193
194 if( mbedtls_oid_get_cipher_alg( &enc_scheme_oid, &cipher_alg ) != 0 )
196
197 cipher_info = mbedtls_cipher_info_from_type( cipher_alg );
198 if( cipher_info == NULL )
200
201 /*
202 * The value of keylen from pkcs5_parse_pbkdf2_params() is ignored
203 * since it is optional and we don't know if it was set or not
204 */
205 keylen = cipher_info->key_bitlen / 8;
206
207 if( enc_scheme_params.tag != MBEDTLS_ASN1_OCTET_STRING ||
208 enc_scheme_params.len != cipher_info->iv_size )
209 {
211 }
212
213 mbedtls_md_init( &md_ctx );
214 mbedtls_cipher_init( &cipher_ctx );
215
216 memcpy( iv, enc_scheme_params.p, enc_scheme_params.len );
217
218 if( ( ret = mbedtls_md_setup( &md_ctx, md_info, 1 ) ) != 0 )
219 goto exit;
220
221 if( ( ret = mbedtls_pkcs5_pbkdf2_hmac( &md_ctx, pwd, pwdlen, salt.p, salt.len,
222 iterations, keylen, key ) ) != 0 )
223 {
224 goto exit;
225 }
226
227 if( ( ret = mbedtls_cipher_setup( &cipher_ctx, cipher_info ) ) != 0 )
228 goto exit;
229
230 if( ( ret = mbedtls_cipher_setkey( &cipher_ctx, key, 8 * keylen, (mbedtls_operation_t) mode ) ) != 0 )
231 goto exit;
232
233 if( ( ret = mbedtls_cipher_crypt( &cipher_ctx, iv, enc_scheme_params.len,
234 data, datalen, output, &olen ) ) != 0 )
236
237exit:
238 mbedtls_md_free( &md_ctx );
239 mbedtls_cipher_free( &cipher_ctx );
240
241 return( ret );
242}
243#endif /* MBEDTLS_ASN1_PARSE_C */
244
246 size_t plen, const unsigned char *salt, size_t slen,
247 unsigned int iteration_count,
248 uint32_t key_length, unsigned char *output )
249{
250 int ret = 0, j;
251 unsigned int i;
252 unsigned char md1[MBEDTLS_MD_MAX_SIZE];
253 unsigned char work[MBEDTLS_MD_MAX_SIZE];
254 unsigned char md_size = mbedtls_md_get_size( ctx->md_info );
255 size_t use_len;
256 unsigned char *out_p = output;
257 unsigned char counter[4];
258
259 memset( counter, 0, 4 );
260 counter[3] = 1;
261
262#if UINT_MAX > 0xFFFFFFFF
263 if( iteration_count > 0xFFFFFFFF )
265#endif
266
267 while( key_length )
268 {
269 // U1 ends up in work
270 //
271 if( ( ret = mbedtls_md_hmac_starts( ctx, password, plen ) ) != 0 )
272 goto cleanup;
273
274 if( ( ret = mbedtls_md_hmac_update( ctx, salt, slen ) ) != 0 )
275 goto cleanup;
276
277 if( ( ret = mbedtls_md_hmac_update( ctx, counter, 4 ) ) != 0 )
278 goto cleanup;
279
280 if( ( ret = mbedtls_md_hmac_finish( ctx, work ) ) != 0 )
281 goto cleanup;
282
283 memcpy( md1, work, md_size );
284
285 for( i = 1; i < iteration_count; i++ )
286 {
287 // U2 ends up in md1
288 //
289 if( ( ret = mbedtls_md_hmac_starts( ctx, password, plen ) ) != 0 )
290 goto cleanup;
291
292 if( ( ret = mbedtls_md_hmac_update( ctx, md1, md_size ) ) != 0 )
293 goto cleanup;
294
295 if( ( ret = mbedtls_md_hmac_finish( ctx, md1 ) ) != 0 )
296 goto cleanup;
297
298 // U1 xor U2
299 //
300 for( j = 0; j < md_size; j++ )
301 work[j] ^= md1[j];
302 }
303
304 use_len = ( key_length < md_size ) ? key_length : md_size;
305 memcpy( out_p, work, use_len );
306
307 key_length -= (uint32_t) use_len;
308 out_p += use_len;
309
310 for( i = 4; i > 0; i-- )
311 if( ++counter[i - 1] != 0 )
312 break;
313 }
314
315cleanup:
316 /* Zeroise buffers to clear sensitive data from memory. */
319
320 return( ret );
321}
322
323#if defined(MBEDTLS_SELF_TEST)
324
325#if !defined(MBEDTLS_SHA1_C)
326int mbedtls_pkcs5_self_test( int verbose )
327{
328 if( verbose != 0 )
329 mbedtls_printf( " PBKDF2 (SHA1): skipped\n\n" );
330
331 return( 0 );
332}
333#else
334
335#define MAX_TESTS 6
336
337static const size_t plen[MAX_TESTS] =
338 { 8, 8, 8, 24, 9 };
339
340static const unsigned char password[MAX_TESTS][32] =
341{
342 "password",
343 "password",
344 "password",
345 "passwordPASSWORDpassword",
346 "pass\0word",
347};
348
349static const size_t slen[MAX_TESTS] =
350 { 4, 4, 4, 36, 5 };
351
352static const unsigned char salt[MAX_TESTS][40] =
353{
354 "salt",
355 "salt",
356 "salt",
357 "saltSALTsaltSALTsaltSALTsaltSALTsalt",
358 "sa\0lt",
359};
360
361static const uint32_t it_cnt[MAX_TESTS] =
362 { 1, 2, 4096, 4096, 4096 };
363
364static const uint32_t key_len[MAX_TESTS] =
365 { 20, 20, 20, 25, 16 };
366
367static const unsigned char result_key[MAX_TESTS][32] =
368{
369 { 0x0c, 0x60, 0xc8, 0x0f, 0x96, 0x1f, 0x0e, 0x71,
370 0xf3, 0xa9, 0xb5, 0x24, 0xaf, 0x60, 0x12, 0x06,
371 0x2f, 0xe0, 0x37, 0xa6 },
372 { 0xea, 0x6c, 0x01, 0x4d, 0xc7, 0x2d, 0x6f, 0x8c,
373 0xcd, 0x1e, 0xd9, 0x2a, 0xce, 0x1d, 0x41, 0xf0,
374 0xd8, 0xde, 0x89, 0x57 },
375 { 0x4b, 0x00, 0x79, 0x01, 0xb7, 0x65, 0x48, 0x9a,
376 0xbe, 0xad, 0x49, 0xd9, 0x26, 0xf7, 0x21, 0xd0,
377 0x65, 0xa4, 0x29, 0xc1 },
378 { 0x3d, 0x2e, 0xec, 0x4f, 0xe4, 0x1c, 0x84, 0x9b,
379 0x80, 0xc8, 0xd8, 0x36, 0x62, 0xc0, 0xe4, 0x4a,
380 0x8b, 0x29, 0x1a, 0x96, 0x4c, 0xf2, 0xf0, 0x70,
381 0x38 },
382 { 0x56, 0xfa, 0x6a, 0xa7, 0x55, 0x48, 0x09, 0x9d,
383 0xcc, 0x37, 0xd7, 0xf0, 0x34, 0x25, 0xe0, 0xc3 },
384};
385
386int mbedtls_pkcs5_self_test( int verbose )
387{
388 mbedtls_md_context_t sha1_ctx;
389 const mbedtls_md_info_t *info_sha1;
390 int ret, i;
391 unsigned char key[64];
392
393 mbedtls_md_init( &sha1_ctx );
394
396 if( info_sha1 == NULL )
397 {
398 ret = 1;
399 goto exit;
400 }
401
402 if( ( ret = mbedtls_md_setup( &sha1_ctx, info_sha1, 1 ) ) != 0 )
403 {
404 ret = 1;
405 goto exit;
406 }
407
408 for( i = 0; i < MAX_TESTS; i++ )
409 {
410 if( verbose != 0 )
411 mbedtls_printf( " PBKDF2 (SHA1) #%d: ", i );
412
413 ret = mbedtls_pkcs5_pbkdf2_hmac( &sha1_ctx, password[i], plen[i], salt[i],
414 slen[i], it_cnt[i], key_len[i], key );
415 if( ret != 0 ||
416 memcmp( result_key[i], key, key_len[i] ) != 0 )
417 {
418 if( verbose != 0 )
419 mbedtls_printf( "failed\n" );
420
421 ret = 1;
422 goto exit;
423 }
424
425 if( verbose != 0 )
426 mbedtls_printf( "passed\n" );
427 }
428
429 if( verbose != 0 )
430 mbedtls_printf( "\n" );
431
432exit:
433 mbedtls_md_free( &sha1_ctx );
434
435 return( ret );
436}
437#endif /* MBEDTLS_SHA1_C */
438
439#endif /* MBEDTLS_SELF_TEST */
440
441#endif /* MBEDTLS_PKCS5_C */
int memcmp(void *Buffer1, void *Buffer2, ACPI_SIZE Count)
Definition: utclib.c:112
Generic ASN.1 parsing.
void pwd(int argc, const char *argv[])
Definition: cmds.c:1401
This file contains an abstraction interface for use with the cipher primitives provided by the librar...
int mbedtls_cipher_setup(mbedtls_cipher_context_t *ctx, const mbedtls_cipher_info_t *cipher_info)
This function initializes and fills the cipher-context structure with the appropriate values....
mbedtls_cipher_type_t
Supported {cipher type, cipher mode} pairs.
Definition: cipher.h:129
int mbedtls_cipher_setkey(mbedtls_cipher_context_t *ctx, const unsigned char *key, int key_bitlen, const mbedtls_operation_t operation)
This function sets the key to use with the given context.
int mbedtls_cipher_crypt(mbedtls_cipher_context_t *ctx, const unsigned char *iv, size_t iv_len, const unsigned char *input, size_t ilen, unsigned char *output, size_t *olen)
The generic all-in-one encryption/decryption function, for all ciphers except AEAD constructs.
void mbedtls_cipher_init(mbedtls_cipher_context_t *ctx)
This function initializes a cipher_context as NONE.
void mbedtls_cipher_free(mbedtls_cipher_context_t *ctx)
This function frees and clears the cipher-specific context of ctx. Freeing ctx itself remains the res...
mbedtls_operation_t
Definition: cipher.h:231
#define NULL
Definition: types.h:112
UINT32 uint32_t
Definition: types.h:75
static void cleanup(void)
Definition: main.c:1335
GLuint GLuint end
Definition: gl.h:1545
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
GLenum mode
Definition: glext.h:6217
GLenum const GLfloat * params
Definition: glext.h:5645
GLfloat GLfloat p
Definition: glext.h:8902
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
Definition: glfuncs.h:250
size_t len
Definition: asn1.h:162
#define MBEDTLS_ASN1_OCTET_STRING
Definition: asn1.h:100
unsigned char * p
Definition: asn1.h:163
#define MBEDTLS_OID_CMP(oid_str, oid_buf)
Definition: asn1.h:143
#define MBEDTLS_ASN1_SEQUENCE
Definition: asn1.h:104
int mbedtls_asn1_get_int(unsigned char **p, const unsigned char *end, int *val)
Retrieve an integer ASN.1 tag and its value. Updates the pointer to immediately behind the full tag.
#define MBEDTLS_ASN1_CONSTRUCTED
Definition: asn1.h:114
#define MBEDTLS_ERR_ASN1_UNEXPECTED_TAG
Definition: asn1.h:77
#define MBEDTLS_ERR_ASN1_LENGTH_MISMATCH
Definition: asn1.h:79
int mbedtls_asn1_get_alg_null(unsigned char **p, const unsigned char *end, mbedtls_asn1_buf *alg)
Retrieve an AlgorithmIdentifier ASN.1 sequence with NULL or no params. Updates the pointer to immedia...
int mbedtls_asn1_get_alg(unsigned char **p, const unsigned char *end, mbedtls_asn1_buf *alg, mbedtls_asn1_buf *params)
Retrieve an AlgorithmIdentifier ASN.1 sequence. Updates the pointer to immediately behind the full Al...
int mbedtls_asn1_get_tag(unsigned char **p, const unsigned char *end, size_t *len, int tag)
Get the tag and length of the tag. Check for the requested tag. Updates the pointer to immediately be...
int const JOCTET unsigned int datalen
Definition: jpeglib.h:1031
int mbedtls_md_setup(mbedtls_md_context_t *ctx, const mbedtls_md_info_t *md_info, int hmac)
This function selects the message digest algorithm to use, and allocates internal structures.
mbedtls_md_type_t
Supported message digests.
Definition: md.h:83
@ MBEDTLS_MD_SHA1
Definition: md.h:88
int mbedtls_md_hmac_finish(mbedtls_md_context_t *ctx, unsigned char *output)
This function finishes the HMAC operation, and writes the result to the output buffer.
int mbedtls_md_hmac_update(mbedtls_md_context_t *ctx, const unsigned char *input, size_t ilen)
This function feeds an input buffer into an ongoing HMAC computation.
int mbedtls_md_hmac_starts(mbedtls_md_context_t *ctx, const unsigned char *key, size_t keylen)
This function sets the HMAC key and prepares to authenticate a new message.
#define MBEDTLS_MD_MAX_SIZE
Definition: md.h:97
void mbedtls_md_init(mbedtls_md_context_t *ctx)
This function initializes a message-digest context without binding it to a particular message-digest ...
unsigned char mbedtls_md_get_size(const mbedtls_md_info_t *md_info)
This function extracts the message-digest size from the message-digest information structure.
void mbedtls_md_free(mbedtls_md_context_t *ctx)
This function clears the internal structure of ctx and frees any embedded internal structure,...
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
#define key_length
Definition: crypt.c:1002
static WCHAR password[]
Definition: url.c:33
#define uint32_t
Definition: nsiface.idl:61
Object Identifier (OID) database.
int mbedtls_oid_get_cipher_alg(const mbedtls_asn1_buf *oid, mbedtls_cipher_type_t *cipher_alg)
Translate encryption algorithm OID into cipher_type.
#define MBEDTLS_OID_PKCS5_PBKDF2
Definition: oid.h:288
int mbedtls_oid_get_md_hmac(const mbedtls_asn1_buf *oid, mbedtls_md_type_t *md_hmac)
Translate hmac algorithm OID into md_type.
PKCS#5 functions.
#define MBEDTLS_ERR_PKCS5_BAD_INPUT_DATA
Definition: pkcs5.h:66
#define MBEDTLS_ERR_PKCS5_FEATURE_UNAVAILABLE
Definition: pkcs5.h:68
int mbedtls_pkcs5_pbkdf2_hmac(mbedtls_md_context_t *ctx, const unsigned char *password, size_t plen, const unsigned char *salt, size_t slen, unsigned int iteration_count, uint32_t key_length, unsigned char *output)
PKCS#5 PBKDF2 using HMAC.
int mbedtls_pkcs5_pbes2(const mbedtls_asn1_buf *pbe_params, int mode, const unsigned char *pwd, size_t pwdlen, const unsigned char *data, size_t datalen, unsigned char *output)
PKCS#5 PBES2 function.
#define MBEDTLS_ERR_PKCS5_INVALID_FORMAT
Definition: pkcs5.h:67
#define MBEDTLS_ERR_PKCS5_PASSWORD_MISMATCH
Definition: pkcs5.h:69
void mbedtls_platform_zeroize(void *buf, size_t len)
Securely zeroize a buffer.
Definition: platform_util.c:98
#define verbose
Definition: rosglue.h:36
#define mbedtls_md_info_from_type
#define mbedtls_cipher_info_from_type
Configuration options (set of defines)
This file contains the definitions and functions of the Mbed TLS platform abstraction layer.
#define exit(n)
Definition: config.h:202
#define memset(x, y, z)
Definition: compat.h:39
Definition: copy.c:22
unsigned int key_bitlen
Definition: cipher.h:281
unsigned int iv_size
Definition: cipher.h:290
#define mbedtls_printf
Definition: timing.c:57
int ret