27 */ |
27 */ |
28 |
28 |
29 #include <stdio.h> |
29 #include <stdio.h> |
30 #include <stdlib.h> |
30 #include <stdlib.h> |
31 #include <string.h> |
31 #include <string.h> |
|
32 #include <openssl/rand.h> |
32 |
33 |
33 #include "crypto.h" |
34 #include "crypto.h" |
34 |
35 |
35 AESDecrypter* aes_decrypter_new(Key *key, void *stream, dav_write_func write_func) { |
36 AESDecrypter* aes_decrypter_new(Key *key, void *stream, dav_write_func write_func) { |
36 AESDecrypter *dec = malloc(sizeof(AESDecrypter)); |
37 AESDecrypter *dec = malloc(sizeof(AESDecrypter)); |
37 dec->stream = stream; |
38 dec->stream = stream; |
38 dec->write = write_func; |
39 dec->write = write_func; |
|
40 dec->key = key; |
|
41 dec->init = 0; |
|
42 dec->ivpos = 0; |
39 |
43 |
|
44 return dec; |
|
45 } |
|
46 |
|
47 void aes_decrypter_init(AESDecrypter *dec) { |
40 EVP_CIPHER_CTX_init(&dec->ctx); |
48 EVP_CIPHER_CTX_init(&dec->ctx); |
41 if(key->type == KEY_AES128) { |
49 dec->init = 1; |
42 EVP_DecryptInit_ex(&dec->ctx, EVP_aes_128_cbc(), NULL, key->data, NULL); |
50 if(dec->key->type == KEY_AES128) { |
43 } else if(key->type == KEY_AES256) { |
51 EVP_DecryptInit_ex( |
44 EVP_DecryptInit_ex(&dec->ctx, EVP_aes_256_cbc(), NULL, key->data, NULL); |
52 &dec->ctx, |
|
53 EVP_aes_128_cbc(), |
|
54 NULL, |
|
55 dec->key->data, |
|
56 dec->ivtmp); |
|
57 } else if(dec->key->type == KEY_AES256) { |
|
58 EVP_DecryptInit_ex( |
|
59 &dec->ctx, |
|
60 EVP_aes_256_cbc(), |
|
61 NULL, |
|
62 dec->key->data, |
|
63 dec->ivtmp); |
45 } else { |
64 } else { |
46 fprintf(stderr, "unknown key type\n"); |
65 fprintf(stderr, "unknown key type\n"); |
47 exit(-1); |
66 exit(-1); |
48 } |
67 } |
49 return dec; |
|
50 } |
68 } |
51 |
69 |
52 size_t aes_write(const void *buf, size_t s, size_t n, AESDecrypter *dec) { |
70 size_t aes_write(const void *buf, size_t s, size_t n, AESDecrypter *dec) { |
53 int len = s*n; |
71 int len = s*n; |
|
72 if(!dec->init) { |
|
73 size_t n = 16 - dec->ivpos; |
|
74 size_t cp = n > len ? len : n; |
|
75 memcpy(dec->ivtmp + dec->ivpos, buf, cp); |
|
76 dec->ivpos += cp; |
|
77 if(dec->ivpos >= 16) { |
|
78 aes_decrypter_init(dec); |
|
79 } |
|
80 if(len == cp) { |
|
81 return len; |
|
82 } else { |
|
83 buf = (char*)buf + cp; |
|
84 len -= cp; |
|
85 } |
|
86 } |
|
87 |
54 int outlen = len + 16; |
88 int outlen = len + 16; |
55 unsigned char *out = malloc(outlen); |
89 unsigned char *out = malloc(outlen); |
56 EVP_DecryptUpdate(&dec->ctx, out, &len, buf, len); |
90 EVP_DecryptUpdate(&dec->ctx, out, &len, buf, len); |
57 dec->write(out, 1, len, dec->stream); |
91 dec->write(out, 1, len, dec->stream); |
58 free(out); |
92 free(out); |
69 free(dec); |
103 free(dec); |
70 } |
104 } |
71 |
105 |
72 |
106 |
73 AESEncrypter* aes_encrypter_new(Key *key, void *stream, dav_read_func read_func) { |
107 AESEncrypter* aes_encrypter_new(Key *key, void *stream, dav_read_func read_func) { |
|
108 unsigned char *iv = malloc(16); |
|
109 if(!RAND_bytes(iv, 16)) { |
|
110 free(iv); |
|
111 return NULL; |
|
112 } |
|
113 |
74 AESEncrypter *enc = malloc(sizeof(AESEncrypter)); |
114 AESEncrypter *enc = malloc(sizeof(AESEncrypter)); |
75 enc->stream = stream; |
115 enc->stream = stream; |
76 enc->read = read_func; |
116 enc->read = read_func; |
77 enc->tmp = NULL; |
117 enc->tmp = NULL; |
78 enc->tmplen = 0; |
118 enc->tmplen = 0; |
79 enc->tmpoff = 0; |
119 enc->tmpoff = 0; |
80 enc->end = 0; |
120 enc->end = 0; |
|
121 //enc->iv = iv; |
|
122 enc->iv = iv; |
|
123 enc->ivlen = 16; |
81 |
124 |
82 EVP_CIPHER_CTX_init(&enc->ctx); |
125 EVP_CIPHER_CTX_init(&enc->ctx); |
83 if(key->type == KEY_AES128) { |
126 if(key->type == KEY_AES128) { |
84 EVP_EncryptInit_ex(&enc->ctx, EVP_aes_128_cbc(), NULL, key->data, NULL); |
127 EVP_EncryptInit_ex(&enc->ctx, EVP_aes_128_cbc(), NULL, key->data, enc->iv); |
85 } else if(key->type == KEY_AES256) { |
128 } else if(key->type == KEY_AES256) { |
86 EVP_EncryptInit_ex(&enc->ctx, EVP_aes_256_cbc(), NULL, key->data, NULL); |
129 EVP_EncryptInit_ex(&enc->ctx, EVP_aes_256_cbc(), NULL, key->data, enc->iv); |
87 } else { |
130 } else { |
88 fprintf(stderr, "unknown key type\n"); |
131 fprintf(stderr, "unknown key type\n"); |
89 exit(-1); |
132 exit(-1); |
90 } |
133 } |
91 return enc; |
134 return enc; |
112 } |
155 } |
113 |
156 |
114 void *in = malloc(len); |
157 void *in = malloc(len); |
115 size_t in_len = enc->read(in, 1, len, enc->stream); |
158 size_t in_len = enc->read(in, 1, len, enc->stream); |
116 |
159 |
117 void *out = NULL; |
160 unsigned char *out = NULL; |
118 int outlen = 0; |
161 int outlen = 0; |
|
162 size_t ivl = enc->ivlen; |
119 if(in_len != 0) { |
163 if(in_len != 0) { |
120 outlen = len + 16; |
164 outlen = len + 16; |
121 out = malloc(outlen); |
165 out = malloc(outlen + ivl); |
122 EVP_EncryptUpdate(&enc->ctx, out, &outlen, in, in_len); |
166 if(enc->iv) { |
123 //out = (char*)aes_encrypt(enc->ctx, (unsigned char*)in, (int*)&in_len); |
167 memcpy(out, enc->iv, ivl); |
|
168 } |
|
169 EVP_EncryptUpdate(&enc->ctx, out + ivl, &outlen, in, in_len); |
124 } else { |
170 } else { |
125 out = malloc(16); |
171 out = malloc(16); |
126 EVP_EncryptFinal_ex(&enc->ctx, out, &outlen); |
172 EVP_EncryptFinal_ex(&enc->ctx, out, &outlen); |
127 enc->end = 1; |
173 enc->end = 1; |
128 } |
174 } |
129 enc->tmp = out; |
175 enc->tmp = (char*)out; |
130 enc->tmplen = outlen; |
176 enc->tmplen = outlen + ivl; |
131 enc->tmpoff = 0; |
177 enc->tmpoff = 0; |
|
178 |
|
179 if(enc->iv) { |
|
180 enc->iv = NULL; |
|
181 enc->ivlen = 0; |
|
182 } |
132 |
183 |
133 return aes_read(buf, s, n, enc); |
184 return aes_read(buf, s, n, enc); |
134 } |
185 } |
135 |
186 |
136 void aes_encrypter_close(AESEncrypter *enc) { |
187 void aes_encrypter_close(AESEncrypter *enc) { |