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

Fix PKCS#12 PBE routines to cope with passwords

from PEM callbacks which are not null terminated.
parent a5a4b34a
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -4,6 +4,12 @@

 Changes between 0.9.6 and 0.9.6a  [xx XXX 2000]

  *) Change PKCS12_key_gen_asc() so it can cope with non null
     terminated strings whose length is passed in the passlen
     parameter, for example from PEM callbacks. This was done
     by adding an extra length parameter to asc2uni().
     [Steve Henson, reported by <oddissey@samsung.co.kr>]

  *) Fix C code generated by 'openssl dsaparam -C': If a BN_bin2bn
     call failed, free the DSA structure.
     [Bodo Moeller]
+1 −1
Original line number Diff line number Diff line
@@ -151,7 +151,7 @@ int PKCS12_add_friendlyname_asc (PKCS12_SAFEBAG *bag, const char *name,
{
	unsigned char *uniname;
	int ret, unilen;
	if (!asc2uni(name, &uniname, &unilen)) {
	if (!asc2uni(name, namelen, &uniname, &unilen)) {
		PKCS12err(PKCS12_F_PKCS12_ADD_FRIENDLYNAME_ASC,
							ERR_R_MALLOC_FAILURE);
		return 0;
+1 −1
Original line number Diff line number Diff line
@@ -84,7 +84,7 @@ int PKCS12_key_gen_asc(const char *pass, int passlen, unsigned char *salt,
	if(!pass) {
		unipass = NULL;
		uniplen = 0;
	} else if (!asc2uni(pass, &unipass, &uniplen)) {
	} else if (!asc2uni(pass, passlen, &unipass, &uniplen)) {
		PKCS12err(PKCS12_F_PKCS12_KEY_GEN_ASC,ERR_R_MALLOC_FAILURE);
		return 0;
	}
+10 −6
Original line number Diff line number Diff line
@@ -62,16 +62,20 @@

/* Cheap and nasty Unicode stuff */

unsigned char *asc2uni (const char *asc, unsigned char **uni, int *unilen)
unsigned char *asc2uni(const char *asc, int asclen, unsigned char **uni, int *unilen)
{
	int ulen, i;
	unsigned char *unitmp;
	ulen = strlen(asc)*2  + 2;
	if (asclen == -1) asclen = strlen(asc);
	ulen = asclen*2  + 2;
	if (!(unitmp = OPENSSL_malloc(ulen))) return NULL;
	for (i = 0; i < ulen; i+=2) {
	for (i = 0; i < ulen - 2; i+=2) {
		unitmp[i] = 0;
		unitmp[i + 1] = asc[i>>1];
	}
	/* Make result double null terminated */
	unitmp[ulen - 2] = 0;
	unitmp[ulen - 1] = 0;
	if (unilen) *unilen = ulen;
	if (uni) *uni = unitmp;
	return unitmp;
+1 −1
Original line number Diff line number Diff line
@@ -247,7 +247,7 @@ int PKCS12_set_mac(PKCS12 *p12, const char *pass, int passlen,
		   EVP_MD *md_type);
int PKCS12_setup_mac(PKCS12 *p12, int iter, unsigned char *salt,
					 int saltlen, EVP_MD *md_type);
unsigned char *asc2uni(const char *asc, unsigned char **uni, int *unilen);
unsigned char *asc2uni(const char *asc, int asclen, unsigned char **uni, int *unilen);
char *uni2asc(unsigned char *uni, int unilen);
int i2d_PKCS12_BAGS(PKCS12_BAGS *a, unsigned char **pp);
PKCS12_BAGS *PKCS12_BAGS_new(void);