Commit b8f702a0 authored by Dr. Stephen Henson's avatar Dr. Stephen Henson
Browse files

Change builting PBE to use static table. Add entries for HMAC and MD5, GOST.

parent 43c9825c
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -5,6 +5,8 @@
 Changes between 0.9.8b and 0.9.9  [xx XXX xxxx]

  *) Initial support for PKCS#5 v2.0 PRFs other than default SHA1 HMAC.
     Reorganize PBE internals to lookup from a static table using NIDs,
     add support for HMAC PBE OID translation.
     [Steve Henson]

  *) Replace the algorithm specific calls to generate keys in "req" with the
+0 −2
Original line number Diff line number Diff line
@@ -183,6 +183,4 @@ void OpenSSL_add_all_ciphers(void)
	EVP_add_cipher_alias(SN_aes_256_cbc,"AES256");
	EVP_add_cipher_alias(SN_aes_256_cbc,"aes256");
#endif
	PKCS12_PBE_add();
	PKCS5_PBE_add();
	}
+95 −4
Original line number Diff line number Diff line
@@ -59,6 +59,7 @@
#include <stdio.h>
#include "cryptlib.h"
#include <openssl/evp.h>
#include <openssl/pkcs12.h>
#include <openssl/x509.h>

/* Password based encryption (PBE) functions */
@@ -76,6 +77,71 @@ typedef struct
	EVP_PBE_KEYGEN *keygen;
	} EVP_PBE_CTL;

EVP_PBE_CTL builtin_pbe[] = 
	{
	{EVP_PBE_TYPE_OUTER, NID_pbeWithMD2AndDES_CBC,
			NID_des_cbc, NID_md2, PKCS5_PBE_keyivgen},
	{EVP_PBE_TYPE_OUTER, NID_pbeWithMD5AndDES_CBC,
			NID_des_cbc, NID_md5, PKCS5_PBE_keyivgen},
	{EVP_PBE_TYPE_OUTER, NID_pbeWithSHA1AndRC2_CBC,
			NID_rc2_64_cbc, NID_sha1, PKCS5_PBE_keyivgen},

	{EVP_PBE_TYPE_OUTER, NID_pbe_WithSHA1And128BitRC4,
			NID_rc4, NID_sha1, PKCS12_PBE_keyivgen},
	{EVP_PBE_TYPE_OUTER, NID_pbe_WithSHA1And40BitRC4,
			NID_rc4_40, NID_sha1, PKCS12_PBE_keyivgen},
	{EVP_PBE_TYPE_OUTER, NID_pbe_WithSHA1And3_Key_TripleDES_CBC,
		 	NID_des_ede3_cbc, NID_sha1, PKCS12_PBE_keyivgen},
	{EVP_PBE_TYPE_OUTER, NID_pbe_WithSHA1And2_Key_TripleDES_CBC, 
			NID_des_ede_cbc, NID_sha1, PKCS12_PBE_keyivgen},
	{EVP_PBE_TYPE_OUTER, NID_pbe_WithSHA1And128BitRC2_CBC,
			NID_rc2_cbc, NID_sha1, PKCS12_PBE_keyivgen},
	{EVP_PBE_TYPE_OUTER, NID_pbe_WithSHA1And40BitRC2_CBC,
			NID_rc2_40_cbc, NID_sha1, PKCS12_PBE_keyivgen},

#ifndef OPENSSL_NO_HMAC
	{EVP_PBE_TYPE_OUTER, NID_pbes2, -1, -1, PKCS5_v2_PBE_keyivgen},
#endif
	{EVP_PBE_TYPE_OUTER, NID_pbeWithMD2AndRC2_CBC,
			NID_rc2_64_cbc, NID_md2, PKCS5_PBE_keyivgen},
	{EVP_PBE_TYPE_OUTER, NID_pbeWithMD5AndRC2_CBC,
			NID_rc2_64_cbc, NID_md5, PKCS5_PBE_keyivgen},
	{EVP_PBE_TYPE_OUTER, NID_pbeWithSHA1AndDES_CBC,
			NID_des_cbc, NID_sha1, PKCS5_PBE_keyivgen},


	{EVP_PBE_TYPE_PRF, NID_hmacWithSHA1, -1, NID_sha1, 0},
	{EVP_PBE_TYPE_PRF, NID_id_HMACGostR3411_94, -1, NID_id_GostR3411_94, 0},
	{EVP_PBE_TYPE_PRF, NID_hmacWithMD5, -1, NID_md5, 0},
	};

#ifdef TEST
int main(int argc, char **argv)
	{
	int i, nid_md, nid_cipher;
	EVP_PBE_CTL *tpbe, *tpbe2;
	/*OpenSSL_add_all_algorithms();*/

	for (i = 0; i < sizeof(builtin_pbe)/sizeof(EVP_PBE_CTL); i++)
		{
		tpbe = builtin_pbe + i;
		fprintf(stderr, "%d %d %s ", tpbe->pbe_type, tpbe->pbe_nid,
						OBJ_nid2sn(tpbe->pbe_nid));
		if (EVP_PBE_find(tpbe->pbe_type, tpbe->pbe_nid,
					&nid_cipher ,&nid_md,0))
			fprintf(stderr, "Found %s %s\n",
					OBJ_nid2sn(nid_cipher),
					OBJ_nid2sn(nid_md));
		else
			fprintf(stderr, "Find ERROR!!\n");
		}

	return 0;
	}
#endif
		


int EVP_PBE_CipherInit(ASN1_OBJECT *pbe_obj, const char *pass, int passlen,
	     ASN1_TYPE *param, EVP_CIPHER_CTX *ctx, int en_de)
	{
@@ -118,6 +184,17 @@ int EVP_PBE_CipherInit(ASN1_OBJECT *pbe_obj, const char *pass, int passlen,
	return 1;	
}

static int pbe_cmp2(const void *a, const void *b)
	{
	const EVP_PBE_CTL *pbe1 = a;
	const EVP_PBE_CTL *pbe2 = b;
	int ret = pbe1->pbe_type - pbe2->pbe_type;
	if (ret)
		return ret;
	else
		return pbe1->pbe_nid - pbe2->pbe_nid;
	}

static int pbe_cmp(const char * const *a, const char * const *b)
	{
	const EVP_PBE_CTL * const *pbe1 = (const EVP_PBE_CTL * const *) a,
@@ -173,16 +250,30 @@ int EVP_PBE_alg_add(int nid, const EVP_CIPHER *cipher, const EVP_MD *md,
int EVP_PBE_find(int type, int pbe_nid,
			int *pcnid, int *pmnid, EVP_PBE_KEYGEN **pkeygen)
	{
	EVP_PBE_CTL *pbetmp, pbelu;
	EVP_PBE_CTL *pbetmp = NULL, pbelu;
	int i;
	if (pbe_nid == NID_undef)
		return 0;

	pbelu.pbe_type = type;
	pbelu.pbe_nid = pbe_nid;

	if (pbe_algs)
		{
		i = sk_find(pbe_algs, (char *)&pbelu);
	if (i == -1)
		return 0;
		if (i != -1)
			pbetmp = (EVP_PBE_CTL *)sk_value (pbe_algs, i);
		}
	if (pbetmp == NULL)
		{
		pbetmp = (EVP_PBE_CTL *) OBJ_bsearch((char *)&pbelu,
        		(char *)builtin_pbe,
			sizeof(builtin_pbe)/sizeof(EVP_PBE_CTL),
        		sizeof(EVP_PBE_CTL),
			pbe_cmp2);
		}
	if (pbetmp == NULL)
		return 0;
	if (pcnid)
		*pcnid = pbetmp->cipher_nid;
	if (pmnid)
+1 −33
Original line number Diff line number Diff line
@@ -62,43 +62,11 @@
#include <openssl/x509.h>
#include <openssl/evp.h>

/* PKCS#5 v1.5 compatible PBE functions: see PKCS#5 v2.0 for more info.
/* Doesn't do anything now: Builtin PBE algorithms in static table.
 */

void PKCS5_PBE_add(void)
{
#ifndef OPENSSL_NO_DES
#  ifndef OPENSSL_NO_MD5
EVP_PBE_alg_add(NID_pbeWithMD5AndDES_CBC, EVP_des_cbc(), EVP_md5(),
							 PKCS5_PBE_keyivgen);
#  endif
#  ifndef OPENSSL_NO_MD2
EVP_PBE_alg_add(NID_pbeWithMD2AndDES_CBC, EVP_des_cbc(), EVP_md2(),
							 PKCS5_PBE_keyivgen);
#  endif
#  ifndef OPENSSL_NO_SHA
EVP_PBE_alg_add(NID_pbeWithSHA1AndDES_CBC, EVP_des_cbc(), EVP_sha1(),
							 PKCS5_PBE_keyivgen);
#  endif
#endif
#ifndef OPENSSL_NO_RC2
#  ifndef OPENSSL_NO_MD5
EVP_PBE_alg_add(NID_pbeWithMD5AndRC2_CBC, EVP_rc2_64_cbc(), EVP_md5(),
							 PKCS5_PBE_keyivgen);
#  endif
#  ifndef OPENSSL_NO_MD2
EVP_PBE_alg_add(NID_pbeWithMD2AndRC2_CBC, EVP_rc2_64_cbc(), EVP_md2(),
							 PKCS5_PBE_keyivgen);
#  endif
#  ifndef OPENSSL_NO_SHA
EVP_PBE_alg_add(NID_pbeWithSHA1AndRC2_CBC, EVP_rc2_64_cbc(), EVP_sha1(),
							 PKCS5_PBE_keyivgen);
#  endif
#endif
#ifndef OPENSSL_NO_HMAC
EVP_PBE_alg_add(NID_pbes2, NULL, NULL, PKCS5_v2_PBE_keyivgen);
EVP_PBE_alg_add_type(EVP_PBE_TYPE_PRF, NID_hmacWithSHA1, -1, NID_sha1, 0);
#endif
}

int PKCS5_PBE_keyivgen(EVP_CIPHER_CTX *cctx, const char *pass, int passlen,
+1 −19
Original line number Diff line number Diff line
@@ -60,28 +60,10 @@
#include "cryptlib.h"
#include <openssl/pkcs12.h>

/* PKCS#12 specific PBE functions */
/* PKCS#12 PBE algorithms now in static table */

void PKCS12_PBE_add(void)
{
#ifndef OPENSSL_NO_RC4
EVP_PBE_alg_add(NID_pbe_WithSHA1And128BitRC4, EVP_rc4(), EVP_sha1(),
							 PKCS12_PBE_keyivgen);
EVP_PBE_alg_add(NID_pbe_WithSHA1And40BitRC4, EVP_rc4_40(), EVP_sha1(),
							 PKCS12_PBE_keyivgen);
#endif
#ifndef OPENSSL_NO_DES
EVP_PBE_alg_add(NID_pbe_WithSHA1And3_Key_TripleDES_CBC,
		 	EVP_des_ede3_cbc(), EVP_sha1(), PKCS12_PBE_keyivgen);
EVP_PBE_alg_add(NID_pbe_WithSHA1And2_Key_TripleDES_CBC, 
			EVP_des_ede_cbc(), EVP_sha1(), PKCS12_PBE_keyivgen);
#endif
#ifndef OPENSSL_NO_RC2
EVP_PBE_alg_add(NID_pbe_WithSHA1And128BitRC2_CBC, EVP_rc2_cbc(),
					EVP_sha1(), PKCS12_PBE_keyivgen);
EVP_PBE_alg_add(NID_pbe_WithSHA1And40BitRC2_CBC, EVP_rc2_40_cbc(),
					EVP_sha1(), PKCS12_PBE_keyivgen);
#endif
}

int PKCS12_PBE_keyivgen(EVP_CIPHER_CTX *ctx, const char *pass, int passlen,