Milán Major

netscape-revival

1 branch
Code

security/lib/util/secpkcs5.h

#ifndef _SECPKCS5_H_
#define _SECPKCS5_H_

#include "secoid.h"
#include "secitem.h"
#include "prarena.h"

typedef SECItem * (* SEC_PKCS5GetPBEPassword)(void *arg);

extern const SEC_ASN1Template SEC_PKCS5PBEParameterTemplate[];
typedef struct SEC_PKCS5PBEParameterStr SEC_PKCS5PBEParameter;

struct SEC_PKCS5PBEParameterStr
{
    PRArenaPool *poolp;
    SECItem	salt;		/* octet string */
    SECItem	iteration;	/* integer */
    SECItem	keyLength;	/* optional key length */
    SECItem	iv;		/* optional iv */
    SECItem 	extendedParams;	/* optional additional params */

    /* used locally */
    SECOidTag	algorithm;
    int		iter;
};

/* Create a PKCS5 Algorithm ID
 * The algorithm ID is set up using the PKCS #5 parameter structure
 *  algorithm is the PBE algorithm ID for the desired algorithm
 *  salt can be specified or can be NULL, if salt is NULL then the
 *    salt is generated from random bytes
 *  iteration is the number of iterations for which to perform the
 *    hash prior to key and iv generation.
 * If an error occurs or the algorithm specified is not supported 
 * or is not a password based encryption algorithm, NULL is returned.
 * Otherwise, a pointer to the algorithm id is returned.
 */
extern SECAlgorithmID *
SEC_PKCS5CreateAlgorithmID(SECOidTag algorithm,
			   SECItem *salt, 
			   int iteration,
			   int keyLength,
			   SECItem *iv,
			   SECItem *param);

/* Get the initialization vector.  The password is passed in, hashing
 * is performed, and the initialization vector is returned.
 *  algid is a pointer to a PBE algorithm ID
 *  pwitem is the password
 * If an error occurs or the algorithm id is not a PBE algrithm,
 * NULL is returned.  Otherwise, the iv is returned in a secitem.
 */
extern SECItem *
SEC_PKCS5GetIV(SECAlgorithmID *algid, 
				SECItem *pwitem);

/* Get the key.  The password is passed in, hashing is performed,
 * and the key is returned.
 *  algid is a pointer to a PBE algorithm ID
 *  pwitem is the password
 * If an error occurs or the algorithm id is not a PBE algrithm,
 * NULL is returned.  Otherwise, the key is returned in a secitem.
 */
extern SECItem *
SEC_PKCS5GetKey(SECAlgorithmID *algid, 
		SECItem *pwitem);

/* Get PBE salt.  The salt for the password based algorithm is returned.
 *  algid is the PBE algorithm identifier
 * If an error occurs NULL is returned, otherwise the salt is returned
 * in a SECItem.
 */
extern SECItem *
SEC_PKCS5GetSalt(SECAlgorithmID *algid);

/* Encrypt/Decrypt data using password based encryption.  
 *  algid is the PBE algorithm identifier,
 *  pwitem is the password,
 *  src is the source for encryption/decryption,
 *  encrypt is PR_TRUE for encryption, PR_FALSE for decryption.
 * The key and iv are generated based upon PKCS #5 then the src
 * is either encrypted or decrypted.  If an error occurs, NULL
 * is returned, otherwise the ciphered contents is returned.
 */
extern SECItem *
SEC_PKCS5CipherData(SECAlgorithmID *algid, SECItem *pwitem,
		    SECItem *src, PRBool encrypt, PRBool *update);

/* Checks to see if algid algorithm is a PBE algorithm.  If
 * so, PR_TRUE is returned, otherwise PR_FALSE is returned.
 */
extern PRBool 
SEC_PKCS5IsAlgorithmPBEAlg(SECAlgorithmID *algid);

/* Destroys PBE parameter */
extern void
SEC_PKCS5DestroyPBEParameter(SEC_PKCS5PBEParameter *param);

/* Convert Algorithm ID to PBE parameter */
extern SEC_PKCS5PBEParameter *
SEC_PKCS5GetPBEParameter(SECAlgorithmID *algid);

/* Determine how large the key generated is */
extern int
SEC_PKCS5GetKeyLength(SECAlgorithmID *algid);

/* map crypto algorithm to pbe algorithm, assume sha 1 hashing for DES
 */
extern SECOidTag
SEC_PKCS5GetPBEAlgorithm(SECOidTag algTag, int keyLen);

/* return the underlying crypto algorithm */
extern SECOidTag
SEC_PKCS5GetCryptoAlgorithm(SECAlgorithmID *algid);
#endif