| Cryptographic Token Interface Standard | 
 PKCS#11 
 | 
PKCS #12 password-based encryption/authentication mechanisms
Detailed Description
The mechanisms in this section are for generating keys and IVs for performing password-based encryption or authentication. The method used to generate keys and IVs is based on a method that was specified in PKCS #12.
We specify here a general method for producing various types of pseudo-random bits from a password, p ; a string of salt bits, s ; and an iteration count, c. The "type" of pseudo-random bits to be produced is identified by an identification byte, ID, the meaning of which will be discussed later.
Let H be a hash function built around a compression function f: Z 2u X Z 2v -> Z 2u  (that is, H has a chaining variable and output of length u bits, and the message input to the compression function of H is v bits). For MD2 and MD5, u =128 and v =512; for SHA-1, u =160 and v =512.
We assume here that u and v are both multiples of 8, as are the lengths in bits of the password and salt strings and the number n of pseudo-random bits required. In addition, u and v are of course nonzero.
- Construct a string, D (the "diversifier"), by concatenating v /8 copies of ID. 
 - Concatenate copies of the salt together to create a string S of length v .UPPER(s/v ) bits (the final copy of the salt may be truncated to create S). Note that if the salt is the empty string, then so is S. 
 - Concatenate copies of the password together to create a string P  of length v .UPPER(p/v ) bits (the final copy of the password may be truncated to create P). Note that if the password is the empty string, then so is P. 
 - Set I =S ||P to be the concatenation of S  and P. 
 - Set j =UPPER(n /u ). 
 - For i =1, 2, ..., j, do the following: 
 - Set Ai =Hc (D ||I), the c th hash of D ||I. That is, compute the hash of D ||I ; compute the hash of that hash; etc.; continue in this fashion until a total of c hashes have been computed, each on the result of the previous hash. 
 - Concatenate copies of Ai  to create a string B of length v bits (the final copy of Ai  may be truncated to create B). 
 - Treating I as a concatenation I 0, I 1, ..., Ik -1 of v -bit blocks, where k =UPPER(s/v )+UPPER(p/v ), modify I by setting Ij  =(Ij +B +1) mod 2v  for each j. To perform this addition, treat each v -bit block as a binary number represented most-significant bit first. 
 - Concatenate A 1, A 2, ..., Aj  together to form a pseudo-random bit string, A. 
 - Use the first n bits of A as the output of this entire process. 
 
When the password-based encryption mechanisms presented in this section are used to generate a key and IV (if needed) from a password, salt, and an iteration count, the above algorithm is used. To generate a key, the identifier byte ID is set to the value 1; to generate an IV, the identifier byte ID is set to the value 2.
When the password based authentication mechanism presented in this section is used to generate a key from a password, salt, and an iteration count, the above algorithm is used. The identifier byte ID is set to the value 3. 
RSA Security Inc. Public-Key Cryptography Standards - 
PKCS#11 - v211