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

Retain compatibility of EVP_DigestInit() and EVP_DigestFinal()
with existing code.

Modify library to use digest *_ex() functions.
parent 9ba3ec91
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -12,6 +12,16 @@
         *) applies to 0.9.6a/0.9.6b/0.9.6c and 0.9.7
         +) applies to 0.9.7 only

  +) Modify the behaviour of EVP_DigestInit() and EVP_DigestFinal() to retain
     compatibility with existing code. In particular the 'ctx' parameter is
     not assumed to be valid before the call to EVP_DigestInit() and it is tidied
     up after a call to EVP_DigestFinal(). A new function EVP_DigestFinal_ex()
     but does not free up the ctx. Also change function EVP_MD_CTX_copy() to
     assume the destination is uninitialized: EVP_MD_CTX_copy_ex() do assumes
     the destiation is valid. Also modify all the OpenSSL digest calls to call 
     EVP_DigestInit_ex(), EVP_DigestFinal_ex() and EVP_MD_CTX_copy_ex().
     [Steve Henson]

  +) Change ssl3_get_message (ssl/s3_both.c) and the functions using it
     so that complete 'Handshake' protocol structures are kept in memory
     instead of overwriting 'msg_type' and 'length' with 'body' data.
+6 −6
Original line number Diff line number Diff line
@@ -327,7 +327,7 @@ static char *md5crypt(const char *passwd, const char *magic, const char *salt)
	assert(salt_len <= 8);
	
	EVP_MD_CTX_init(&md);
	EVP_DigestInit(&md,EVP_md5());
	EVP_DigestInit_ex(&md,EVP_md5(), NULL);
	EVP_DigestUpdate(&md, passwd, passwd_len);
	EVP_DigestUpdate(&md, "$", 1);
	EVP_DigestUpdate(&md, magic, strlen(magic));
@@ -335,11 +335,11 @@ static char *md5crypt(const char *passwd, const char *magic, const char *salt)
	EVP_DigestUpdate(&md, salt_out, salt_len);
	
	EVP_MD_CTX_init(&md2);
	EVP_DigestInit(&md2,EVP_md5());
	EVP_DigestInit_ex(&md2,EVP_md5(), NULL);
	EVP_DigestUpdate(&md2, passwd, passwd_len);
	EVP_DigestUpdate(&md2, salt_out, salt_len);
	EVP_DigestUpdate(&md2, passwd, passwd_len);
	EVP_DigestFinal(&md2, buf, NULL);
	EVP_DigestFinal_ex(&md2, buf, NULL);

	for (i = passwd_len; i > sizeof buf; i -= sizeof buf)
		EVP_DigestUpdate(&md, buf, sizeof buf);
@@ -351,11 +351,11 @@ static char *md5crypt(const char *passwd, const char *magic, const char *salt)
		EVP_DigestUpdate(&md, (n & 1) ? "\0" : passwd, 1);
		n >>= 1;
		}
	EVP_DigestFinal(&md, buf, NULL);
	EVP_DigestFinal_ex(&md, buf, NULL);

	for (i = 0; i < 1000; i++)
		{
		EVP_DigestInit(&md2,EVP_md5());
		EVP_DigestInit_ex(&md2,EVP_md5(), NULL);
		EVP_DigestUpdate(&md2, (i & 1) ? (unsigned char *) passwd : buf,
		                       (i & 1) ? passwd_len : sizeof buf);
		if (i % 3)
@@ -364,7 +364,7 @@ static char *md5crypt(const char *passwd, const char *magic, const char *salt)
			EVP_DigestUpdate(&md2, passwd, passwd_len);
		EVP_DigestUpdate(&md2, (i & 1) ? buf : (unsigned char *) passwd,
		                       (i & 1) ? sizeof buf : passwd_len);
		EVP_DigestFinal(&md2, buf, NULL);
		EVP_DigestFinal_ex(&md2, buf, NULL);
		}
	EVP_MD_CTX_cleanup(&md2);
	
+7 −6
Original line number Diff line number Diff line
@@ -944,7 +944,7 @@ int MAIN(int argc, char **argv)
			print_message(names[D_MD2],c[D_MD2][j],lengths[j]);
			Time_F(START,usertime);
			for (count=0,run=1; COND(c[D_MD2][j]); count++)
				EVP_Digest(buf,(unsigned long)lengths[j],&(md2[0]),NULL,EVP_md2());
				EVP_Digest(buf,(unsigned long)lengths[j],&(md2[0]),NULL,EVP_md2(), NULL);
			d=Time_F(STOP,usertime);
			BIO_printf(bio_err,"%ld %s's in %.2fs\n",
				count,names[D_MD2],d);
@@ -960,7 +960,7 @@ int MAIN(int argc, char **argv)
			print_message(names[D_MDC2],c[D_MDC2][j],lengths[j]);
			Time_F(START,usertime);
			for (count=0,run=1; COND(c[D_MDC2][j]); count++)
				EVP_Digest(buf,(unsigned long)lengths[j],&(mdc2[0]),NULL,EVP_mdc2());
				EVP_Digest(buf,(unsigned long)lengths[j],&(mdc2[0]),NULL,EVP_mdc2(), NULL);
			d=Time_F(STOP,usertime);
			BIO_printf(bio_err,"%ld %s's in %.2fs\n",
				count,names[D_MDC2],d);
@@ -977,7 +977,7 @@ int MAIN(int argc, char **argv)
			print_message(names[D_MD4],c[D_MD4][j],lengths[j]);
			Time_F(START,usertime);
			for (count=0,run=1; COND(c[D_MD4][j]); count++)
				EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md4[0]),NULL,EVP_md4());
				EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md4[0]),NULL,EVP_md4(), NULL);
			d=Time_F(STOP,usertime);
			BIO_printf(bio_err,"%ld %s's in %.2fs\n",
				count,names[D_MD4],d);
@@ -994,7 +994,8 @@ int MAIN(int argc, char **argv)
			print_message(names[D_MD5],c[D_MD5][j],lengths[j]);
			Time_F(START,usertime);
			for (count=0,run=1; COND(c[D_MD5][j]); count++)
				EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md5[0]),NULL,EVP_get_digestbyname("md5"));
				EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md5[0]),NULL,
										EVP_get_digestbyname("md5"), NULL);
			d=Time_F(STOP,usertime);
			BIO_printf(bio_err,"%ld %s's in %.2fs\n",
				count,names[D_MD5],d);
@@ -1038,7 +1039,7 @@ int MAIN(int argc, char **argv)
			print_message(names[D_SHA1],c[D_SHA1][j],lengths[j]);
			Time_F(START,usertime);
			for (count=0,run=1; COND(c[D_SHA1][j]); count++)
				EVP_Digest(buf,(unsigned long)lengths[j],&(sha[0]),NULL,EVP_sha1());
				EVP_Digest(buf,(unsigned long)lengths[j],&(sha[0]),NULL,EVP_sha1(), NULL);
			d=Time_F(STOP,usertime);
			BIO_printf(bio_err,"%ld %s's in %.2fs\n",
				count,names[D_SHA1],d);
@@ -1054,7 +1055,7 @@ int MAIN(int argc, char **argv)
			print_message(names[D_RMD160],c[D_RMD160][j],lengths[j]);
			Time_F(START,usertime);
			for (count=0,run=1; COND(c[D_RMD160][j]); count++)
				EVP_Digest(buf,(unsigned long)lengths[j],&(rmd160[0]),NULL,EVP_ripemd160());
				EVP_Digest(buf,(unsigned long)lengths[j],&(rmd160[0]),NULL,EVP_ripemd160(), NULL);
			d=Time_F(STOP,usertime);
			BIO_printf(bio_err,"%ld %s's in %.2fs\n",
				count,names[D_RMD160],d);
+2 −2
Original line number Diff line number Diff line
@@ -82,7 +82,7 @@ int ASN1_digest(int (*i2d)(), const EVP_MD *type, char *data,
	p=str;
	i2d(data,&p);

	EVP_Digest(str, i, md, len, type);
	EVP_Digest(str, i, md, len, type, NULL);
	OPENSSL_free(str);
	return(1);
	}
@@ -99,7 +99,7 @@ int ASN1_item_digest(const ASN1_ITEM *it, const EVP_MD *type, void *asn,
	i=ASN1_item_i2d(asn,&str, it);
	if (!str) return(0);

	EVP_Digest(str, i, md, len, type);
	EVP_Digest(str, i, md, len, type, NULL);
	OPENSSL_free(str);
	return(1);
	}
+2 −2
Original line number Diff line number Diff line
@@ -123,7 +123,7 @@ int ASN1_sign(int (*i2d)(), X509_ALGOR *algor1, X509_ALGOR *algor2,
	p=buf_in;

	i2d(data,&p);
	EVP_SignInit(&ctx,type);
	EVP_SignInit_ex(&ctx,type, NULL);
	EVP_SignUpdate(&ctx,(unsigned char *)buf_in,inl);
	if (!EVP_SignFinal(&ctx,(unsigned char *)buf_out,
			(unsigned int *)&outl,pkey))
@@ -199,7 +199,7 @@ int ASN1_item_sign(const ASN1_ITEM *it, X509_ALGOR *algor1, X509_ALGOR *algor2,
		goto err;
		}

	EVP_SignInit(&ctx,type);
	EVP_SignInit_ex(&ctx,type, NULL);
	EVP_SignUpdate(&ctx,(unsigned char *)buf_in,inl);
	if (!EVP_SignFinal(&ctx,(unsigned char *)buf_out,
			(unsigned int *)&outl,pkey))
Loading