87 } |
88 } |
88 } |
89 } |
89 |
90 |
90 int outlen = len + 16; |
91 int outlen = len + 16; |
91 unsigned char *out = malloc(outlen); |
92 unsigned char *out = malloc(outlen); |
92 EVP_DecryptUpdate(&dec->ctx, out, &len, buf, len); |
93 EVP_DecryptUpdate(dec->ctx, out, &len, buf, len); |
93 ssize_t wlen = dec->write(out, 1, len, dec->stream); |
94 ssize_t wlen = dec->write(out, 1, len, dec->stream); |
94 SHA256_Update(&dec->sha256, out, wlen); |
95 SHA256_Update(&dec->sha256, out, wlen); |
95 free(out); |
96 free(out); |
96 return (s*n) / s; |
97 return (s*n) / s; |
97 } |
98 } |
98 |
99 |
99 void aes_decrypter_shutdown(AESDecrypter *dec) { |
100 void aes_decrypter_shutdown(AESDecrypter *dec) { |
100 if(dec->init) { |
101 if(dec->init) { |
101 void *out = malloc(128); |
102 void *out = malloc(128); |
102 int len = 0; |
103 int len = 0; |
103 EVP_DecryptFinal_ex(&dec->ctx, out, &len); |
104 EVP_DecryptFinal_ex(dec->ctx, out, &len); |
104 dec->write(out, 1, len, dec->stream); |
105 dec->write(out, 1, len, dec->stream); |
105 SHA256_Update(&dec->sha256, out, len); |
106 SHA256_Update(&dec->sha256, out, len); |
106 free(out); |
107 free(out); |
107 EVP_CIPHER_CTX_cleanup(&dec->ctx); |
108 //EVP_CIPHER_CTX_cleanup(&dec->ctx); |
|
109 EVP_CIPHER_CTX_free(dec->ctx); |
108 } |
110 } |
109 } |
111 } |
110 |
112 |
111 void aes_decrypter_close(AESDecrypter *dec) { |
113 void aes_decrypter_close(AESDecrypter *dec) { |
112 free(dec); |
114 free(dec); |
129 enc->tmpoff = 0; |
131 enc->tmpoff = 0; |
130 enc->end = 0; |
132 enc->end = 0; |
131 enc->iv = iv; |
133 enc->iv = iv; |
132 enc->ivlen = 16; |
134 enc->ivlen = 16; |
133 |
135 |
134 EVP_CIPHER_CTX_init(&enc->ctx); |
136 //EVP_CIPHER_CTX_init(&enc->ctx); |
|
137 enc->ctx = EVP_CIPHER_CTX_new(); |
135 if(key->type == DAV_KEY_AES128) { |
138 if(key->type == DAV_KEY_AES128) { |
136 EVP_EncryptInit_ex(&enc->ctx, EVP_aes_128_cbc(), NULL, key->data, enc->iv); |
139 EVP_EncryptInit_ex(enc->ctx, EVP_aes_128_cbc(), NULL, key->data, enc->iv); |
137 } else if(key->type == DAV_KEY_AES256) { |
140 } else if(key->type == DAV_KEY_AES256) { |
138 EVP_EncryptInit_ex(&enc->ctx, EVP_aes_256_cbc(), NULL, key->data, enc->iv); |
141 EVP_EncryptInit_ex(enc->ctx, EVP_aes_256_cbc(), NULL, key->data, enc->iv); |
139 } else { |
142 } else { |
140 fprintf(stderr, "unknown key type\n"); |
143 fprintf(stderr, "unknown key type\n"); |
141 exit(-1); |
144 exit(-1); |
142 } |
145 } |
143 return enc; |
146 return enc; |
175 outlen = len + 16; |
178 outlen = len + 16; |
176 out = malloc(outlen + ivl); |
179 out = malloc(outlen + ivl); |
177 if(enc->iv) { |
180 if(enc->iv) { |
178 memcpy(out, enc->iv, ivl); |
181 memcpy(out, enc->iv, ivl); |
179 } |
182 } |
180 EVP_EncryptUpdate(&enc->ctx, out + ivl, &outlen, in, in_len); |
183 EVP_EncryptUpdate(enc->ctx, out + ivl, &outlen, in, in_len); |
181 free(in); |
184 free(in); |
182 } else { |
185 } else { |
183 out = malloc(16); |
186 out = malloc(16); |
184 EVP_EncryptFinal_ex(&enc->ctx, out, &outlen); |
187 EVP_EncryptFinal_ex(enc->ctx, out, &outlen); |
185 enc->end = 1; |
188 enc->end = 1; |
186 free(in); |
189 free(in); |
187 } |
190 } |
188 enc->tmp = (char*)out; |
191 enc->tmp = (char*)out; |
189 enc->tmplen = outlen + ivl; |
192 enc->tmplen = outlen + ivl; |
203 free(enc->tmp); |
206 free(enc->tmp); |
204 } |
207 } |
205 if(enc->iv) { |
208 if(enc->iv) { |
206 free(enc->iv); |
209 free(enc->iv); |
207 } |
210 } |
208 EVP_CIPHER_CTX_cleanup(&enc->ctx); |
211 //EVP_CIPHER_CTX_cleanup(&enc->ctx); |
|
212 EVP_CIPHER_CTX_free(enc->ctx); |
209 free(enc); |
213 free(enc); |
210 } |
214 } |
211 |
215 |
212 |
216 |
213 char* aes_encrypt(char *in, size_t len, DavKey *key) { |
217 char* aes_encrypt(char *in, size_t len, DavKey *key) { |
214 unsigned char iv[16]; |
218 unsigned char iv[16]; |
215 if(!RAND_bytes(iv, 16)) { |
219 if(!RAND_bytes(iv, 16)) { |
216 return NULL; |
220 return NULL; |
217 } |
221 } |
218 |
222 |
219 EVP_CIPHER_CTX ctx; |
223 //EVP_CIPHER_CTX ctx; |
220 EVP_CIPHER_CTX_init(&ctx); |
224 //EVP_CIPHER_CTX_init(&ctx); |
|
225 EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new(); |
221 if(key->type == DAV_KEY_AES128) { |
226 if(key->type == DAV_KEY_AES128) { |
222 EVP_EncryptInit_ex( |
227 EVP_EncryptInit_ex( |
223 &ctx, |
228 ctx, |
224 EVP_aes_128_cbc(), |
229 EVP_aes_128_cbc(), |
225 NULL, |
230 NULL, |
226 (unsigned char*)key->data, |
231 (unsigned char*)key->data, |
227 iv); |
232 iv); |
228 } else if(key->type == DAV_KEY_AES256) { |
233 } else if(key->type == DAV_KEY_AES256) { |
229 EVP_EncryptInit_ex( |
234 EVP_EncryptInit_ex( |
230 &ctx, |
235 ctx, |
231 EVP_aes_256_cbc(), |
236 EVP_aes_256_cbc(), |
232 NULL, |
237 NULL, |
233 (unsigned char*)key->data, |
238 (unsigned char*)key->data, |
234 iv); |
239 iv); |
235 } else { |
240 } else { |
236 EVP_CIPHER_CTX_cleanup(&ctx); |
241 //EVP_CIPHER_CTX_cleanup(&ctx); |
|
242 EVP_CIPHER_CTX_free(ctx); |
237 return NULL; |
243 return NULL; |
238 } |
244 } |
239 |
245 |
240 //int len = strlen(in); |
246 //int len = strlen(in); |
241 int buflen = len + 64; |
247 int buflen = len + 64; |
242 unsigned char *buf = calloc(1, buflen); |
248 unsigned char *buf = calloc(1, buflen); |
243 memcpy(buf, iv, 16); |
249 memcpy(buf, iv, 16); |
244 |
250 |
245 int l = buflen - 16; |
251 int l = buflen - 16; |
246 EVP_EncryptUpdate(&ctx, buf + 16, &l, (unsigned char*)in, len); |
252 EVP_EncryptUpdate(ctx, buf + 16, &l, (unsigned char*)in, len); |
247 |
253 |
248 int f = 0; |
254 int f = 0; |
249 EVP_EncryptFinal_ex(&ctx, buf + 16 + l, &f); |
255 EVP_EncryptFinal_ex(ctx, buf + 16 + l, &f); |
250 char *out = util_base64encode((char*)buf, 16 + l + f); |
256 char *out = util_base64encode((char*)buf, 16 + l + f); |
251 free(buf); |
257 free(buf); |
252 EVP_CIPHER_CTX_cleanup(&ctx); |
258 EVP_CIPHER_CTX_free(ctx); |
|
259 //EVP_CIPHER_CTX_cleanup(&ctx); |
253 |
260 |
254 return out; |
261 return out; |
255 } |
262 } |
256 |
263 |
257 char* aes_decrypt(char *in, size_t *length, DavKey *key) { |
264 char* aes_decrypt(char *in, size_t *length, DavKey *key) { |
258 int len; |
265 int len; |
259 unsigned char *buf = (unsigned char*)util_base64decode_len(in, &len); |
266 unsigned char *buf = (unsigned char*)util_base64decode_len(in, &len); |
260 |
267 |
261 EVP_CIPHER_CTX ctx; |
268 //EVP_CIPHER_CTX ctx; |
262 EVP_CIPHER_CTX_init(&ctx); |
269 //EVP_CIPHER_CTX_init(&ctx); |
|
270 EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new(); |
263 if(key->type == DAV_KEY_AES128) { |
271 if(key->type == DAV_KEY_AES128) { |
264 EVP_DecryptInit_ex( |
272 EVP_DecryptInit_ex( |
265 &ctx, |
273 ctx, |
266 EVP_aes_128_cbc(), |
274 EVP_aes_128_cbc(), |
267 NULL, |
275 NULL, |
268 key->data, |
276 key->data, |
269 buf); |
277 buf); |
270 } else if(key->type == DAV_KEY_AES256) { |
278 } else if(key->type == DAV_KEY_AES256) { |
271 EVP_DecryptInit_ex( |
279 EVP_DecryptInit_ex( |
272 &ctx, |
280 ctx, |
273 EVP_aes_256_cbc(), |
281 EVP_aes_256_cbc(), |
274 NULL, |
282 NULL, |
275 key->data, |
283 key->data, |
276 buf); |
284 buf); |
277 } else { |
285 } else { |
278 EVP_CIPHER_CTX_cleanup(&ctx); |
286 //EVP_CIPHER_CTX_cleanup(&ctx); |
|
287 EVP_CIPHER_CTX_free(ctx); |
279 return NULL; |
288 return NULL; |
280 } |
289 } |
281 |
290 |
282 unsigned char *out = malloc(len + 1); |
291 unsigned char *out = malloc(len + 1); |
283 int outlen = len; |
292 int outlen = len; |
284 unsigned char *in_buf = buf + 16; |
293 unsigned char *in_buf = buf + 16; |
285 int inlen = len - 16; |
294 int inlen = len - 16; |
286 int f = 0; |
295 int f = 0; |
287 |
296 |
288 EVP_DecryptUpdate(&ctx, out, &outlen, in_buf, inlen); |
297 EVP_DecryptUpdate(ctx, out, &outlen, in_buf, inlen); |
289 EVP_DecryptFinal_ex(&ctx, out + outlen, &f); |
298 EVP_DecryptFinal_ex(ctx, out + outlen, &f); |
290 out[outlen + f] = '\0'; |
299 out[outlen + f] = '\0'; |
291 free(buf); |
300 free(buf); |
292 EVP_CIPHER_CTX_cleanup(&ctx); |
301 //EVP_CIPHER_CTX_cleanup(&ctx); |
|
302 EVP_CIPHER_CTX_free(ctx); |
293 |
303 |
294 *length = outlen + f; |
304 *length = outlen + f; |
295 return (char*)out; |
305 return (char*)out; |
296 } |
306 } |
297 |
307 |