Only in openssl-1.0.0e.ori/apps: CA.pl.bak
diff -crB openssl-1.0.0e.ori/crypto/evp/digest.c openssl-1.0.0e/crypto/evp/digest.c
*** openssl-1.0.0e.ori/crypto/evp/digest.c	2010-03-05 08:33:43.000000000 -0500
--- openssl-1.0.0e/crypto/evp/digest.c	2011-11-27 01:00:35.184167529 -0500
***************
*** 291,297 ****
  	else tmp_buf = NULL;
  	EVP_MD_CTX_cleanup(out);
  	memcpy(out,in,sizeof *out);
! 
  	if (in->md_data && out->digest->ctx_size)
  		{
  		if (tmp_buf)
--- 291,299 ----
  	else tmp_buf = NULL;
  	EVP_MD_CTX_cleanup(out);
  	memcpy(out,in,sizeof *out);
! #ifdef OPENSSL_MD_CTX_CHECKPOINT
! 	out->md_ctx_backup = NULL; /* for now no copy of checkpoint data */
! #endif
  	if (in->md_data && out->digest->ctx_size)
  		{
  		if (tmp_buf)
***************
*** 326,331 ****
--- 328,425 ----
  	return 1;
  	}
  
+ #ifdef OPENSSL_MD_CTX_CHECKPOINT
+ 
+ int EVP_MD_CTX_copy_ex2(EVP_MD_CTX *out, const EVP_MD_CTX *in)
+ {
+   if ((in == NULL) || (in->digest == NULL))
+     {
+       EVPerr(EVP_F_EVP_MD_CTX_COPY_EX,EVP_R_INPUT_NOT_INITIALIZED);
+       return 0;
+     }
+   
+   if(out->md_ctx_backup){
+     if (out->digest != in->digest ||
+ 	in->digest->copy ||
+ 	in->pctx ||
+ 	!in->md_data ||
+ 	!out->md_data)
+       {
+ 	EVPerr(EVP_F_EVP_MD_CTX_COPY_EX,EVP_R_METHOD_NOT_SUPPORTED);
+ 	return 0;
+       }
+     memcpy(out->md_data,in->md_data,out->digest->ctx_size);
+   }
+   else {return EVP_MD_CTX_copy_ex(out, in);}
+   return 1;
+ }
+ 
+ int     EVP_MD_CTX_checkpoint(EVP_MD_CTX *ctx)
+ {
+   if(!ctx){return 0;}
+ 
+   if(ctx->pctx){
+     if(1 != EVP_PKEY_CTX_checkpoint(ctx->pctx)){
+       return 0;
+     }
+     return 1;
+   }
+ 
+   if(!ctx->digest || !ctx->md_data){
+     return 0;
+   }
+ 
+   if(ctx->md_ctx_backup){
+     OPENSSL_free(ctx->md_ctx_backup);
+   }
+ 
+   ctx->md_ctx_backup = OPENSSL_malloc(ctx->digest->ctx_size);
+ 
+   if(!ctx->md_ctx_backup){return 0;}
+ 
+   memcpy(ctx->md_ctx_backup, ctx->md_data, ctx->digest->ctx_size);
+   return 1;
+ }
+ 
+ int     EVP_MD_CTX_restore(EVP_MD_CTX *ctx)
+ {
+   if(!ctx){return 0;}
+ 
+   if(ctx->pctx){
+     if(1 != EVP_PKEY_CTX_restore(ctx->pctx)){
+       return 0;
+     }
+     return 1;
+   }
+ 
+   if(!ctx->digest || !ctx->md_data || !ctx->md_ctx_backup){
+     return 0;
+   }
+ 
+   memcpy(ctx->md_data, ctx->md_ctx_backup, ctx->digest->ctx_size);
+   return 1;
+ }
+ 
+ int    EVP_MD_CTX_has_checkpoint(const EVP_MD_CTX *ctx)
+ {
+   if(!ctx){return 0;}
+ 
+   if(ctx->pctx){
+     if(1 != EVP_PKEY_CTX_has_checkpoint(ctx->pctx)){
+       return 0;
+     }
+     return 1;
+   }
+ 
+   if(!ctx->digest || !ctx->md_data || !ctx->md_ctx_backup){
+     return 0;
+   }
+ 
+   return 1;
+ }
+ 
+ #endif
+ 
  int EVP_Digest(const void *data, size_t count,
  		unsigned char *md, unsigned int *size, const EVP_MD *type, ENGINE *impl)
  	{
***************
*** 363,368 ****
--- 457,467 ----
  		OPENSSL_cleanse(ctx->md_data,ctx->digest->ctx_size);
  		OPENSSL_free(ctx->md_data);
  		}
+ #ifdef OPENSSL_MD_CTX_CHECKPOINT
+ 	if(ctx->md_ctx_backup){
+ 	  OPENSSL_free(ctx->md_ctx_backup); /* todo: hook up reuse? */
+ 	}
+ #endif
  	if (ctx->pctx)
  		EVP_PKEY_CTX_free(ctx->pctx);
  #ifndef OPENSSL_NO_ENGINE
diff -crB openssl-1.0.0e.ori/crypto/evp/evp.h openssl-1.0.0e/crypto/evp/evp.h
*** openssl-1.0.0e.ori/crypto/evp/evp.h	2010-03-27 15:27:50.000000000 -0400
--- openssl-1.0.0e/crypto/evp/evp.h	2011-11-27 00:37:59.551167162 -0500
***************
*** 265,270 ****
--- 265,273 ----
  	ENGINE *engine; /* functional reference if 'digest' is ENGINE-provided */
  	unsigned long flags;
  	void *md_data;
+ #ifdef OPENSSL_MD_CTX_CHECKPOINT
+ 	  void *md_ctx_backup;
+ #endif
  	/* Public key context for sign/verify */
  	EVP_PKEY_CTX *pctx;
  	/* Update function: usually copied from EVP_MD */
***************
*** 506,512 ****
  int	EVP_MD_CTX_cleanup(EVP_MD_CTX *ctx);
  EVP_MD_CTX *EVP_MD_CTX_create(void);
  void	EVP_MD_CTX_destroy(EVP_MD_CTX *ctx);
! int     EVP_MD_CTX_copy_ex(EVP_MD_CTX *out,const EVP_MD_CTX *in);  
  void	EVP_MD_CTX_set_flags(EVP_MD_CTX *ctx, int flags);
  void	EVP_MD_CTX_clear_flags(EVP_MD_CTX *ctx, int flags);
  int 	EVP_MD_CTX_test_flags(const EVP_MD_CTX *ctx,int flags);
--- 509,521 ----
  int	EVP_MD_CTX_cleanup(EVP_MD_CTX *ctx);
  EVP_MD_CTX *EVP_MD_CTX_create(void);
  void	EVP_MD_CTX_destroy(EVP_MD_CTX *ctx);
! int     EVP_MD_CTX_copy_ex(EVP_MD_CTX *out,const EVP_MD_CTX *in);
! #ifdef OPENSSL_MD_CTX_CHECKPOINT
!   int     EVP_MD_CTX_copy_ex2(EVP_MD_CTX *out,const EVP_MD_CTX *in);
!   int     EVP_MD_CTX_checkpoint(EVP_MD_CTX *ctx);
!   int     EVP_MD_CTX_restore(EVP_MD_CTX *ctx);
!   int     EVP_MD_CTX_has_checkpoint(const EVP_MD_CTX *ctx);
! #endif
  void	EVP_MD_CTX_set_flags(EVP_MD_CTX *ctx, int flags);
  void	EVP_MD_CTX_clear_flags(EVP_MD_CTX *ctx, int flags);
  int 	EVP_MD_CTX_test_flags(const EVP_MD_CTX *ctx,int flags);
***************
*** 1047,1052 ****
--- 1056,1073 ----
  #define EVP_PKEY_CTRL_CMS_DECRYPT	10
  #define EVP_PKEY_CTRL_CMS_SIGN		11
  
+ #ifdef OPENSSL_MD_CTX_CHECKPOINT
+ #define EVP_PKEY_CTRL_CTX_CHECKPOINT    101
+ #define EVP_PKEY_CTRL_CTX_RESTORE       102
+ #define EVP_PKEY_CTRL_CTX_HAS_CHKPOINT  103
+ #define EVP_PKEY_CTX_checkpoint(ctx)    EVP_PKEY_CTX_ctrl(ctx, -1, EVP_PKEY_OP_TYPE_SIG,  \
+ 					EVP_PKEY_CTRL_CTX_CHECKPOINT, 0, 0)
+ #define EVP_PKEY_CTX_restore(ctx)       EVP_PKEY_CTX_ctrl(ctx, -1, EVP_PKEY_OP_TYPE_SIG,  \
+ 					EVP_PKEY_CTRL_CTX_RESTORE, 0, 0)
+ #define EVP_PKEY_CTX_has_checkpoint(ctx) EVP_PKEY_CTX_ctrl(ctx, -1, EVP_PKEY_OP_TYPE_SIG,  \
+ 							   EVP_PKEY_CTRL_CTX_HAS_CHKPOINT, 0, 0)
+ #endif
+ 
  #define EVP_PKEY_ALG_CTRL		0x1000
  
  
diff -crB openssl-1.0.0e.ori/crypto/evp/m_sigver.c openssl-1.0.0e/crypto/evp/m_sigver.c
*** openssl-1.0.0e.ori/crypto/evp/m_sigver.c	2010-11-27 12:34:57.000000000 -0500
--- openssl-1.0.0e/crypto/evp/m_sigver.c	2011-11-27 00:00:56.004178143 -0500
***************
*** 140,145 ****
--- 140,160 ----
  		EVP_MD_CTX tmp_ctx;
  		unsigned char md[EVP_MAX_MD_SIZE];
  		unsigned int mdlen;
+ #ifdef OPENSSL_MD_CTX_CHECKPOINT
+ 		EVP_MD_CTX *md_ctx_ptr = &tmp_ctx;
+ 		if(EVP_MD_CTX_has_checkpoint(ctx)){
+ 		  md_ctx_ptr = ctx;
+ 		}
+ 		if (sctx)
+ 		  r = md_ctx_ptr->pctx->pmeth->signctx(md_ctx_ptr->pctx,
+ 						       sigret, siglen, md_ctx_ptr);
+ 		else
+ 		  r = EVP_DigestFinal_ex(md_ctx_ptr,md,&mdlen);
+ 
+ 		if(&tmp_ctx == md_ctx_ptr){
+ 		  EVP_MD_CTX_cleanup(&tmp_ctx);
+ 		}
+ #else
  		EVP_MD_CTX_init(&tmp_ctx);
  		if (!EVP_MD_CTX_copy_ex(&tmp_ctx,ctx))
  		     	return 0;
***************
*** 149,154 ****
--- 164,170 ----
  		else
  			r = EVP_DigestFinal_ex(&tmp_ctx,md,&mdlen);
  		EVP_MD_CTX_cleanup(&tmp_ctx);
+ #endif
  		if (sctx || !r)
  			return r;
  		if (EVP_PKEY_sign(ctx->pctx, sigret, siglen, md, mdlen) <= 0)
diff -crB openssl-1.0.0e.ori/crypto/hmac/hmac.c openssl-1.0.0e/crypto/hmac/hmac.c
*** openssl-1.0.0e.ori/crypto/hmac/hmac.c	2010-06-15 13:25:09.000000000 -0400
--- openssl-1.0.0e/crypto/hmac/hmac.c	2011-11-27 01:01:40.097230153 -0500
***************
*** 143,150 ****
--- 143,155 ----
  
  	if (!EVP_DigestFinal_ex(&ctx->md_ctx,buf,&i))
  		goto err;
+ #ifdef OPENSSL_MD_CTX_CHECKPOINT
+ 	if (!EVP_MD_CTX_copy_ex2(&ctx->md_ctx,&ctx->o_ctx))
+ 		goto err;
+ #else
  	if (!EVP_MD_CTX_copy_ex(&ctx->md_ctx,&ctx->o_ctx))
  		goto err;
+ #endif
  	if (!EVP_DigestUpdate(&ctx->md_ctx,buf,i))
  		goto err;
  	if (!EVP_DigestFinal_ex(&ctx->md_ctx,md,len))
***************
*** 212,214 ****
--- 217,244 ----
  	EVP_MD_CTX_set_flags(&ctx->o_ctx, flags);
  	EVP_MD_CTX_set_flags(&ctx->md_ctx, flags);
  	}
+ 
+ #ifdef OPENSSL_MD_CTX_CHECKPOINT
+ /* only needs to be done on one ctx */
+ int  HMAC_CTX_checkpoint(HMAC_CTX *ctx)
+ {
+   if(!ctx){ return 0;}
+ 
+   return EVP_MD_CTX_checkpoint(&ctx->md_ctx);
+ }
+ 
+ int  HMAC_CTX_restore(HMAC_CTX *ctx)
+ {
+   if(!ctx){ return 0;}
+ 
+   return EVP_MD_CTX_restore(&ctx->md_ctx);
+ }
+ 
+ int  HMAC_CTX_has_checkpoint(const HMAC_CTX *ctx)
+ {
+   if(!ctx){ return 0;}
+ 
+   return EVP_MD_CTX_has_checkpoint(&ctx->md_ctx);
+ }
+ 
+ #endif
diff -crB openssl-1.0.0e.ori/crypto/hmac/hmac.h openssl-1.0.0e/crypto/hmac/hmac.h
*** openssl-1.0.0e.ori/crypto/hmac/hmac.h	2010-01-26 09:33:52.000000000 -0500
--- openssl-1.0.0e/crypto/hmac/hmac.h	2011-11-26 23:56:30.303167565 -0500
***************
*** 103,108 ****
--- 103,114 ----
  
  void HMAC_CTX_set_flags(HMAC_CTX *ctx, unsigned long flags);
  
+ #ifdef OPENSSL_MD_CTX_CHECKPOINT
+   int  HMAC_CTX_checkpoint(HMAC_CTX *ctx);
+   int  HMAC_CTX_restore(HMAC_CTX *ctx);
+   int  HMAC_CTX_has_checkpoint(const HMAC_CTX *ctx);
+ #endif
+ 
  #ifdef  __cplusplus
  }
  #endif
diff -crB openssl-1.0.0e.ori/crypto/hmac/hm_pmeth.c openssl-1.0.0e/crypto/hmac/hm_pmeth.c
*** openssl-1.0.0e.ori/crypto/hmac/hm_pmeth.c	2011-05-19 13:39:49.000000000 -0400
--- openssl-1.0.0e/crypto/hmac/hm_pmeth.c	2011-11-27 21:24:50.304723674 -0500
***************
*** 196,201 ****
--- 196,215 ----
  				ctx->engine);
  		break;
  
+ #ifdef OPENSSL_MD_CTX_CHECKPOINT
+ 		case EVP_PKEY_CTRL_CTX_CHECKPOINT:
+ 		  if(!HMAC_CTX_checkpoint(&hctx->ctx)) return 0;
+ 		break;
+ 
+ 		case EVP_PKEY_CTRL_CTX_RESTORE:
+ 		  if(!HMAC_CTX_restore(&hctx->ctx)) return 0;
+ 		break;
+ 
+ 		case EVP_PKEY_CTRL_CTX_HAS_CHKPOINT:
+ 		  if(!HMAC_CTX_has_checkpoint(&hctx->ctx)) return 0;
+ 		break;
+ #endif
+ 
  		default:
  		return -2;
  
Only in openssl-1.0.0e/crypto/hmac: hm_pmeth.c~
Only in openssl-1.0.0e.ori/crypto: opensslconf.h.bak
diff -crB openssl-1.0.0e.ori/ssl/s3_enc.c openssl-1.0.0e/ssl/s3_enc.c
*** openssl-1.0.0e.ori/ssl/s3_enc.c	2010-06-15 13:25:14.000000000 -0400
--- openssl-1.0.0e/ssl/s3_enc.c	2011-11-27 11:46:46.484171507 -0500
***************
*** 374,379 ****
--- 375,389 ----
  
  	EVP_CipherInit_ex(dd,c,NULL,key,iv,(which & SSL3_CC_WRITE));
  
+ #ifdef OPENSSL_MD_CTX_CHECKPOINT
+ 	if (which & SSL3_CC_READ){
+ 	  EVP_MD_CTX_checkpoint(s->read_hash);
+ 	}
+ 	else{
+ 	  EVP_MD_CTX_checkpoint(s->write_hash);
+ 	}
+ #endif
+ 
  	OPENSSL_cleanse(&(exp_key[0]),sizeof(exp_key));
  	OPENSSL_cleanse(&(exp_iv[0]),sizeof(exp_iv));
  	EVP_MD_CTX_cleanup(&md);
***************
*** 704,709 ****
--- 714,722 ----
  	unsigned int md_size;
  	int npad;
  	int t;
+ #ifdef OPENSSL_MD_CTX_CHECKPOINT
+ 	EVP_MD_CTX *md_ctx_ptr = &md_ctx;
+ #endif
  
  	if (send)
  		{
***************
*** 725,731 ****
--- 738,780 ----
  		return -1;
  	md_size=t;
  	npad=(48/md_size)*md_size;
+ #ifdef OPENSSL_MD_CTX_CHECKPOINT
+ 	/* Chop the digest off the end :-) */
+ 	if(!EVP_MD_CTX_restore(hash)){
+ 	  EVP_MD_CTX_init(&md_ctx);
+ 	  EVP_MD_CTX_copy_ex( &md_ctx,hash);
+ 	}
+ 	else{
+ 	  md_ctx_ptr = hash;
+ 	}
  
+ 	EVP_DigestUpdate(md_ctx_ptr,mac_sec,md_size);
+ 	EVP_DigestUpdate(md_ctx_ptr,ssl3_pad_1,npad);
+ 	EVP_DigestUpdate(md_ctx_ptr,seq,8);
+ 	rec_char=rec->type;
+ 	EVP_DigestUpdate(md_ctx_ptr,&rec_char,1);
+ 	p=md;
+ 	s2n(rec->length,p);
+ 	EVP_DigestUpdate(md_ctx_ptr,md,2);
+ 	EVP_DigestUpdate(md_ctx_ptr,rec->input,rec->length);
+ 	EVP_DigestFinal_ex(md_ctx_ptr,md,NULL);
+ 
+ 	if( &md_ctx == md_ctx_ptr){
+ 	  EVP_MD_CTX_copy_ex( &md_ctx,hash);
+ 	}
+ 	else{
+ 	  EVP_MD_CTX_restore(hash);
+ 	}
+ 
+ 	EVP_DigestUpdate(md_ctx_ptr,mac_sec,md_size);
+ 	EVP_DigestUpdate(md_ctx_ptr,ssl3_pad_2,npad);
+ 	EVP_DigestUpdate(md_ctx_ptr,md,md_size);
+ 	EVP_DigestFinal_ex(md_ctx_ptr,md,&md_size);
+ 
+ 	if( &md_ctx == md_ctx_ptr){
+ 	  EVP_MD_CTX_cleanup(&md_ctx);
+ 	}
+ #else
  	/* Chop the digest off the end :-) */
  	EVP_MD_CTX_init(&md_ctx);
  
***************
*** 748,753 ****
--- 797,803 ----
  	EVP_DigestFinal_ex( &md_ctx,md,&md_size);
  
  	EVP_MD_CTX_cleanup(&md_ctx);
+ #endif
  
  	ssl3_record_sequence_update(seq);
  	return(md_size);
diff -crB openssl-1.0.0e.ori/ssl/t1_enc.c openssl-1.0.0e/ssl/t1_enc.c
*** openssl-1.0.0e.ori/ssl/t1_enc.c	2010-06-15 13:25:15.000000000 -0400
--- openssl-1.0.0e/ssl/t1_enc.c	2011-11-26 22:58:26.804167368 -0500
***************
*** 478,483 ****
--- 478,488 ----
  			mac_secret,*mac_secret_size);
  	EVP_DigestSignInit(mac_ctx,NULL,m,NULL,mac_key);
  	EVP_PKEY_free(mac_key);
+ 
+ #ifdef OPENSSL_MD_CTX_CHECKPOINT
+ 	EVP_MD_CTX_checkpoint(mac_ctx);
+ #endif
+ 
  #ifdef TLS_DEBUG
  printf("which = %04X\nmac key=",which);
  { int z; for (z=0; z<i; z++) printf("%02X%c",ms[z],((z+1)%16)?' ':'\n'); }
***************
*** 915,922 ****
--- 920,937 ----
  		}
  		else
  		{
+ #ifdef OPENSSL_MD_CTX_CHECKPOINT
+ 		  if(!EVP_MD_CTX_restore(hash)){
+ 		    EVP_MD_CTX_copy(&hmac,hash);
+ 		    mac_ctx = &hmac;
+ 		  }
+ 		  else{
+ 		    mac_ctx = hash;
+ 		  }
+ #else
  			EVP_MD_CTX_copy(&hmac,hash);
  			mac_ctx = &hmac;
+ #endif
  		}
  
  	if (ssl->version == DTLS1_VERSION || ssl->version == DTLS1_BAD_VER)
***************
*** 935,942 ****
  	EVP_DigestSignUpdate(mac_ctx,rec->input,rec->length);
  	t=EVP_DigestSignFinal(mac_ctx,md,&md_size);
  	OPENSSL_assert(t > 0);
! 		
  	if (!stream_mac) EVP_MD_CTX_cleanup(&hmac);
  #ifdef TLS_DEBUG
  printf("sec=");
  {unsigned int z; for (z=0; z<md_size; z++) printf("%02X ",mac_sec[z]); printf("\n"); }
--- 950,961 ----
  	EVP_DigestSignUpdate(mac_ctx,rec->input,rec->length);
  	t=EVP_DigestSignFinal(mac_ctx,md,&md_size);
  	OPENSSL_assert(t > 0);
! 
! #ifdef OPENSSL_MD_CTX_CHECKPOINT
! 	if (!stream_mac && (&hmac == mac_ctx)) EVP_MD_CTX_cleanup(&hmac);
! #else
  	if (!stream_mac) EVP_MD_CTX_cleanup(&hmac);
+ #endif
  #ifdef TLS_DEBUG
  printf("sec=");
  {unsigned int z; for (z=0; z<md_size; z++) printf("%02X ",mac_sec[z]); printf("\n"); }
Only in openssl-1.0.0e.ori/tools: c_rehash.bak
