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

fix so it is safe to repeatedly add PBE algorithms

parent 1dac2cae
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -4,7 +4,11 @@

 Changes between 0.9.8o and 0.9.8p [xx XXX xxxx]

  *)
  *) Don't repeatedly append PBE algorithms to table if they already exist.
     Sort table on each new add. This effectively makes the table read only
     after all algorithms are added and subsequent calls to PKCS12_pbe_add
     etc are non-op.
     [Steve Henson]

 Changes between 0.9.8n and 0.9.8o [01 Jun 2010]

+43 −8
Original line number Diff line number Diff line
@@ -116,17 +116,52 @@ static int pbe_cmp(const char * const *a, const char * const *b)
int EVP_PBE_alg_add(int nid, const EVP_CIPHER *cipher, const EVP_MD *md,
	     EVP_PBE_KEYGEN *keygen)
{
	EVP_PBE_CTL *pbe_tmp;
	if (!pbe_algs) pbe_algs = sk_new(pbe_cmp);
	if (!(pbe_tmp = (EVP_PBE_CTL*) OPENSSL_malloc (sizeof(EVP_PBE_CTL)))) {
	EVP_PBE_CTL *pbe_tmp, pbelu;
	int i;
	if (!pbe_algs)
		{
		pbe_algs = sk_new(pbe_cmp);
		if (!pbe_algs)
			{
			EVPerr(EVP_F_EVP_PBE_ALG_ADD,ERR_R_MALLOC_FAILURE);
			return 0;
			}
		}
	else
		{
		/* Check if already present */
		pbelu.pbe_nid = nid;
		i = sk_find(pbe_algs, (char *)&pbelu);
		if (i >= 0)
			{
			pbe_tmp = (EVP_PBE_CTL *)sk_value(pbe_algs, i);
			/* If everything identical leave alone */
			if (pbe_tmp->cipher == cipher
				&& pbe_tmp->md == md
				&& pbe_tmp->keygen == keygen)
				return 1;
			}
		else
			pbe_tmp = NULL;
		}

	if (!pbe_tmp)
		{
		pbe_tmp = OPENSSL_malloc (sizeof(EVP_PBE_CTL));
		if (!pbe_tmp)
			{
			EVPerr(EVP_F_EVP_PBE_ALG_ADD,ERR_R_MALLOC_FAILURE);
			return 0;
			}
		/* If adding a new PBE, set nid, append and sort */
		pbe_tmp->pbe_nid = nid;
		sk_push (pbe_algs, (char *)pbe_tmp);
		sk_sort(pbe_algs);
		}
		
	pbe_tmp->cipher = cipher;
	pbe_tmp->md = md;
	pbe_tmp->keygen = keygen;
	sk_push (pbe_algs, (char *)pbe_tmp);
	return 1;
}