@@ -30,6 +30,10 @@ int pkcs12_kdf( int hash_id,
3030 unsigned char * I = NULL , * key = NULL ;
3131 int err = CRYPT_ERROR ;
3232
33+ LTC_ARGCHK (pw != NULL );
34+ LTC_ARGCHK (salt != NULL );
35+ LTC_ARGCHK (out != NULL );
36+
3337 key = XMALLOC (u * c );
3438 I = XMALLOC (Plen + Slen );
3539 if (key == NULL || I == NULL ) goto DONE ;
@@ -40,7 +44,7 @@ int pkcs12_kdf( int hash_id,
4044 for (i = 0 ; i < Plen ; i ++ ) I [Slen + i ] = pw [i % pwlen ]; /* I = Salt || Pass */
4145
4246 for (i = 0 ; i < c ; i ++ ) {
43- Alen = u ; /* hash size */
47+ Alen = sizeof ( A );
4448 err = hash_memory_multi (hash_id , A , & Alen , D , v , I , Slen + Plen , NULL ); /* A = HASH(D || I) */
4549 if (err != CRYPT_OK ) goto DONE ;
4650 for (j = 1 ; j < iterations ; j ++ ) {
@@ -63,14 +67,21 @@ int pkcs12_kdf( int hash_id,
6367 }
6468 }
6569 /* store derived key block */
66- for (j = 0 ; j < Alen ; j ++ ) key [keylen ++ ] = A [j ];
70+ XMEMCPY (& key [keylen ], A , Alen );
71+ keylen += Alen ;
6772 }
6873
69- for ( i = 0 ; i < outlen ; i ++ ) out [ i ] = key [ i ] ;
74+ XMEMCPY ( out , key , outlen ) ;
7075 err = CRYPT_OK ;
7176DONE :
72- if (I ) XFREE (I );
73- if (key ) XFREE (key );
77+ if (I ) {
78+ zeromem (I , Plen + Slen );
79+ XFREE (I );
80+ }
81+ if (key ) {
82+ zeromem (key , u * c );
83+ XFREE (key );
84+ }
7485 return err ;
7586}
7687
0 commit comments