summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/evp/p5_crpt2.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libcrypto/evp/p5_crpt2.c')
-rw-r--r--src/lib/libcrypto/evp/p5_crpt2.c40
1 files changed, 9 insertions, 31 deletions
diff --git a/src/lib/libcrypto/evp/p5_crpt2.c b/src/lib/libcrypto/evp/p5_crpt2.c
index fe3c6c8813..975d004df4 100644
--- a/src/lib/libcrypto/evp/p5_crpt2.c
+++ b/src/lib/libcrypto/evp/p5_crpt2.c
@@ -85,24 +85,19 @@ int PKCS5_PBKDF2_HMAC(const char *pass, int passlen,
85 unsigned char digtmp[EVP_MAX_MD_SIZE], *p, itmp[4]; 85 unsigned char digtmp[EVP_MAX_MD_SIZE], *p, itmp[4];
86 int cplen, j, k, tkeylen, mdlen; 86 int cplen, j, k, tkeylen, mdlen;
87 unsigned long i = 1; 87 unsigned long i = 1;
88 HMAC_CTX hctx_tpl, hctx; 88 HMAC_CTX hctx;
89 89
90 mdlen = EVP_MD_size(digest); 90 mdlen = EVP_MD_size(digest);
91 if (mdlen < 0) 91 if (mdlen < 0)
92 return 0; 92 return 0;
93 93
94 HMAC_CTX_init(&hctx_tpl); 94 HMAC_CTX_init(&hctx);
95 p = out; 95 p = out;
96 tkeylen = keylen; 96 tkeylen = keylen;
97 if(!pass) 97 if(!pass)
98 passlen = 0; 98 passlen = 0;
99 else if(passlen == -1) 99 else if(passlen == -1)
100 passlen = strlen(pass); 100 passlen = strlen(pass);
101 if (!HMAC_Init_ex(&hctx_tpl, pass, passlen, digest, NULL))
102 {
103 HMAC_CTX_cleanup(&hctx_tpl);
104 return 0;
105 }
106 while(tkeylen) 101 while(tkeylen)
107 { 102 {
108 if(tkeylen > mdlen) 103 if(tkeylen > mdlen)
@@ -116,36 +111,19 @@ int PKCS5_PBKDF2_HMAC(const char *pass, int passlen,
116 itmp[1] = (unsigned char)((i >> 16) & 0xff); 111 itmp[1] = (unsigned char)((i >> 16) & 0xff);
117 itmp[2] = (unsigned char)((i >> 8) & 0xff); 112 itmp[2] = (unsigned char)((i >> 8) & 0xff);
118 itmp[3] = (unsigned char)(i & 0xff); 113 itmp[3] = (unsigned char)(i & 0xff);
119 if (!HMAC_CTX_copy(&hctx, &hctx_tpl)) 114 if (!HMAC_Init_ex(&hctx, pass, passlen, digest, NULL)
115 || !HMAC_Update(&hctx, salt, saltlen)
116 || !HMAC_Update(&hctx, itmp, 4)
117 || !HMAC_Final(&hctx, digtmp, NULL))
120 { 118 {
121 HMAC_CTX_cleanup(&hctx_tpl);
122 return 0;
123 }
124 if (!HMAC_Update(&hctx, salt, saltlen)
125 || !HMAC_Update(&hctx, itmp, 4)
126 || !HMAC_Final(&hctx, digtmp, NULL))
127 {
128 HMAC_CTX_cleanup(&hctx_tpl);
129 HMAC_CTX_cleanup(&hctx); 119 HMAC_CTX_cleanup(&hctx);
130 return 0; 120 return 0;
131 } 121 }
132 HMAC_CTX_cleanup(&hctx);
133 memcpy(p, digtmp, cplen); 122 memcpy(p, digtmp, cplen);
134 for(j = 1; j < iter; j++) 123 for(j = 1; j < iter; j++)
135 { 124 {
136 if (!HMAC_CTX_copy(&hctx, &hctx_tpl)) 125 HMAC(digest, pass, passlen,
137 { 126 digtmp, mdlen, digtmp, NULL);
138 HMAC_CTX_cleanup(&hctx_tpl);
139 return 0;
140 }
141 if (!HMAC_Update(&hctx, digtmp, mdlen)
142 || !HMAC_Final(&hctx, digtmp, NULL))
143 {
144 HMAC_CTX_cleanup(&hctx_tpl);
145 HMAC_CTX_cleanup(&hctx);
146 return 0;
147 }
148 HMAC_CTX_cleanup(&hctx);
149 for(k = 0; k < cplen; k++) 127 for(k = 0; k < cplen; k++)
150 p[k] ^= digtmp[k]; 128 p[k] ^= digtmp[k];
151 } 129 }
@@ -153,7 +131,7 @@ int PKCS5_PBKDF2_HMAC(const char *pass, int passlen,
153 i++; 131 i++;
154 p+= cplen; 132 p+= cplen;
155 } 133 }
156 HMAC_CTX_cleanup(&hctx_tpl); 134 HMAC_CTX_cleanup(&hctx);
157#ifdef DEBUG_PKCS5V2 135#ifdef DEBUG_PKCS5V2
158 fprintf(stderr, "Password:\n"); 136 fprintf(stderr, "Password:\n");
159 h__dump (pass, passlen); 137 h__dump (pass, passlen);