mirror of
https://bitbucket.org/jsuto/piler.git
synced 2024-12-26 07:00:12 +01:00
openssl refactor of digest handling
Signed-off-by: Janos SUTO <sj@acts.hu>
This commit is contained in:
parent
dbad46b002
commit
611260fd7e
@ -41,7 +41,8 @@
|
|||||||
|
|
||||||
#define BASE64_RATIO 1.33333333
|
#define BASE64_RATIO 1.33333333
|
||||||
|
|
||||||
#define DIGEST_LENGTH SHA256_DIGEST_LENGTH
|
#define DIGEST_LENGTH EVP_MAX_MD_SIZE
|
||||||
|
#define DIGEST_HEX_LENGTH 2*DIGEST_LENGTH+1
|
||||||
|
|
||||||
#define UNDEF 0
|
#define UNDEF 0
|
||||||
#define READY 1
|
#define READY 1
|
||||||
|
119
src/digest.c
119
src/digest.c
@ -34,16 +34,30 @@ int search_header_end(char *p, int n){
|
|||||||
|
|
||||||
|
|
||||||
int make_digests(struct session_data *sdata, struct config *cfg){
|
int make_digests(struct session_data *sdata, struct config *cfg){
|
||||||
int i=0, n, fd, offset=3, hdr_len=0;
|
int n, fd, offset=3, hdr_len=0;
|
||||||
char *body=NULL;
|
char *body=NULL;
|
||||||
unsigned char buf[BIGBUFSIZE], md[DIGEST_LENGTH], md2[DIGEST_LENGTH];
|
unsigned char buf[BIGBUFSIZE];
|
||||||
SHA256_CTX context, context2;
|
|
||||||
|
EVP_MD_CTX *ctx, *ctx2;
|
||||||
|
const EVP_MD *md, *md2;
|
||||||
|
unsigned int i=0, md_len, md_len2;
|
||||||
|
unsigned char md_value[EVP_MAX_MD_SIZE], md_value2[EVP_MAX_MD_SIZE];
|
||||||
|
|
||||||
memset(sdata->bodydigest, 0, 2*DIGEST_LENGTH+1);
|
memset(sdata->bodydigest, 0, 2*DIGEST_LENGTH+1);
|
||||||
memset(sdata->digest, 0, 2*DIGEST_LENGTH+1);
|
memset(sdata->digest, 0, 2*DIGEST_LENGTH+1);
|
||||||
SHA256_Init(&context);
|
|
||||||
SHA256_Init(&context2);
|
|
||||||
|
|
||||||
|
md = EVP_get_digestbyname("sha256");
|
||||||
|
md2 = EVP_get_digestbyname("sha256");
|
||||||
|
if(md == NULL || md2 == NULL){
|
||||||
|
syslog(LOG_PRIORITY, "ERROR: unknown message digest: sha256 in %s:%d", __func__, __LINE__);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx = EVP_MD_CTX_new();
|
||||||
|
EVP_DigestInit_ex(ctx, md, NULL);
|
||||||
|
|
||||||
|
ctx2 = EVP_MD_CTX_new();
|
||||||
|
EVP_DigestInit_ex(ctx2, md2, NULL);
|
||||||
|
|
||||||
fd = open(sdata->filename, O_RDONLY);
|
fd = open(sdata->filename, O_RDONLY);
|
||||||
if(fd == -1) return -1;
|
if(fd == -1) return -1;
|
||||||
@ -51,7 +65,7 @@ int make_digests(struct session_data *sdata, struct config *cfg){
|
|||||||
memset(buf, 0, sizeof(buf));
|
memset(buf, 0, sizeof(buf));
|
||||||
|
|
||||||
while((n = read(fd, buf, sizeof(buf))) > 0){
|
while((n = read(fd, buf, sizeof(buf))) > 0){
|
||||||
SHA256_Update(&context2, buf, n);
|
EVP_DigestUpdate(ctx2, buf, n);
|
||||||
|
|
||||||
body = (char *)&buf[0];
|
body = (char *)&buf[0];
|
||||||
|
|
||||||
@ -68,7 +82,7 @@ int make_digests(struct session_data *sdata, struct config *cfg){
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
SHA256_Update(&context, body, n);
|
EVP_DigestUpdate(ctx, body, n);
|
||||||
|
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
@ -77,82 +91,93 @@ int make_digests(struct session_data *sdata, struct config *cfg){
|
|||||||
|
|
||||||
sdata->hdr_len = hdr_len;
|
sdata->hdr_len = hdr_len;
|
||||||
|
|
||||||
SHA256_Final(md, &context);
|
EVP_DigestFinal_ex(ctx, md_value, &md_len);
|
||||||
SHA256_Final(md2, &context2);
|
EVP_MD_CTX_free(ctx);
|
||||||
|
EVP_DigestFinal_ex(ctx2, md_value2, &md_len2);
|
||||||
|
EVP_MD_CTX_free(ctx2);
|
||||||
|
|
||||||
for(i=0;i<DIGEST_LENGTH;i++){
|
for(i=0;i<md_len;i++){
|
||||||
snprintf(sdata->bodydigest + i*2, 3, "%02x", md[i]);
|
snprintf(sdata->bodydigest + i*2, 3, "%02x", md_value[i]);
|
||||||
snprintf(sdata->digest + i*2, 3, "%02x", md2[i]);
|
}
|
||||||
|
|
||||||
|
for(i=0;i<md_len2;i++){
|
||||||
|
snprintf(sdata->digest + i*2, 3, "%02x", md_value2[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void digest_file(char *filename, char *digest){
|
void raw_digest_file(char *digestname, char *filename, unsigned char *md_value){
|
||||||
int fd, i, n;
|
int fd, n;
|
||||||
unsigned char buf[MAXBUFSIZE], md[DIGEST_LENGTH];
|
unsigned char buf[MAXBUFSIZE];
|
||||||
SHA256_CTX context;
|
EVP_MD_CTX *ctx;
|
||||||
|
const EVP_MD *md;
|
||||||
|
unsigned int md_len;
|
||||||
|
|
||||||
memset(digest, 0, 2*DIGEST_LENGTH+1);
|
md = EVP_get_digestbyname(digestname);
|
||||||
|
if(md == NULL){
|
||||||
|
syslog(LOG_PRIORITY, "ERROR: unknown message digest: '%s' in %s:%d", digestname, __func__, __LINE__);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
fd = open(filename, O_RDONLY);
|
fd = open(filename, O_RDONLY);
|
||||||
if(fd == -1) return;
|
if(fd == -1) return;
|
||||||
|
|
||||||
SHA256_Init(&context);
|
ctx = EVP_MD_CTX_new();
|
||||||
|
EVP_DigestInit_ex(ctx, md, NULL);
|
||||||
|
|
||||||
while((n = read(fd, buf, sizeof(buf))) > 0){
|
while((n = read(fd, buf, sizeof(buf))) > 0){
|
||||||
SHA256_Update(&context, buf, n);
|
EVP_DigestUpdate(ctx, buf, n);
|
||||||
}
|
}
|
||||||
|
|
||||||
close(fd);
|
close(fd);
|
||||||
|
|
||||||
SHA256_Final(md, &context);
|
EVP_DigestFinal_ex(ctx, md_value, &md_len);
|
||||||
|
EVP_MD_CTX_free(ctx);
|
||||||
for(i=0;i<DIGEST_LENGTH;i++)
|
|
||||||
snprintf(digest + i*2, 2*DIGEST_LENGTH, "%02x", md[i]);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void digest_string(char *s, char *digest){
|
void digest_file(char *filename, char *digest){
|
||||||
int i;
|
|
||||||
unsigned char md[DIGEST_LENGTH];
|
unsigned char md[DIGEST_LENGTH];
|
||||||
SHA256_CTX context;
|
|
||||||
|
raw_digest_file("sha256", filename, &md[0]);
|
||||||
|
|
||||||
memset(digest, 0, 2*DIGEST_LENGTH+1);
|
memset(digest, 0, 2*DIGEST_LENGTH+1);
|
||||||
|
|
||||||
SHA256_Init(&context);
|
for(int i=0;i<SHA256_DIGEST_LENGTH;i++){
|
||||||
|
|
||||||
SHA256_Update(&context, s, strlen(s));
|
|
||||||
|
|
||||||
SHA256_Final(md, &context);
|
|
||||||
|
|
||||||
for(i=0;i<DIGEST_LENGTH;i++)
|
|
||||||
snprintf(digest + i*2, 2*DIGEST_LENGTH, "%02x", md[i]);
|
snprintf(digest + i*2, 2*DIGEST_LENGTH, "%02x", md[i]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void md5_string(char *s, char *digest){
|
void digest_string(char *digestname, char *s, char *digest){
|
||||||
int i;
|
EVP_MD_CTX *ctx;
|
||||||
unsigned char md[MD5_DIGEST_LENGTH];
|
const EVP_MD *md;
|
||||||
MD5_CTX context;
|
unsigned int i, md_len;
|
||||||
|
unsigned char md_value[DIGEST_LENGTH];
|
||||||
|
|
||||||
memset(digest, 0, 2*MD5_DIGEST_LENGTH+2);
|
memset(digest, 0, 2*DIGEST_LENGTH+2);
|
||||||
|
|
||||||
MD5_Init(&context);
|
md = EVP_get_digestbyname(digestname);
|
||||||
|
if(md == NULL){
|
||||||
|
syslog(LOG_PRIORITY, "ERROR: unknown message digest: '%s' in %s:%d", digestname, __func__, __LINE__);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
MD5_Update(&context, s, strlen(s));
|
ctx = EVP_MD_CTX_new();
|
||||||
|
EVP_DigestInit_ex(ctx, md, NULL);
|
||||||
|
EVP_DigestUpdate(ctx, s, strlen(s));
|
||||||
|
EVP_DigestFinal_ex(ctx, md_value, &md_len);
|
||||||
|
EVP_MD_CTX_free(ctx);
|
||||||
|
|
||||||
MD5_Final(md, &context);
|
for(i=0;i<md_len;i++){
|
||||||
|
snprintf(digest + i*2, 2*DIGEST_LENGTH, "%02x", md_value[i]);
|
||||||
for(i=0;i<MD5_DIGEST_LENGTH;i++)
|
}
|
||||||
snprintf(digest + i*2, 2*MD5_DIGEST_LENGTH, "%02x", md[i]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void create_md5_from_email_address(char *puf, char *md5buf){
|
void create_md5_from_email_address(char *puf, char *md5buf){
|
||||||
md5_string(puf, md5buf);
|
digest_string("md5", puf, md5buf);
|
||||||
md5buf[2*MD5_DIGEST_LENGTH] = ' ';
|
md5buf[2*MD5_DIGEST_LENGTH] = ' ';
|
||||||
}
|
}
|
||||||
|
@ -206,11 +206,11 @@ int store_meta_data(struct session_data *sdata, struct parser_state *state, stru
|
|||||||
|
|
||||||
snprintf(s, sizeof(s)-1, "%llu+%s%s%s%ld%ld%ld%d%d%d%d%s%s%s", id, subj, sender, state->message_id, sdata->now, sdata->sent, sdata->retained, sdata->tot_len, sdata->hdr_len, sdata->direction, state->n_attachments, sdata->ttmpfile, sdata->digest, sdata->bodydigest);
|
snprintf(s, sizeof(s)-1, "%llu+%s%s%s%ld%ld%ld%d%d%d%d%s%s%s", id, subj, sender, state->message_id, sdata->now, sdata->sent, sdata->retained, sdata->tot_len, sdata->hdr_len, sdata->direction, state->n_attachments, sdata->ttmpfile, sdata->digest, sdata->bodydigest);
|
||||||
|
|
||||||
digest_string(s, &vcode[0]);
|
digest_string("sha256", s, &vcode[0]);
|
||||||
|
|
||||||
memset(ref, 0, sizeof(ref));
|
memset(ref, 0, sizeof(ref));
|
||||||
if(strlen(state->reference) > 10){
|
if(strlen(state->reference) > 10){
|
||||||
digest_string(state->reference, &ref[0]);
|
digest_string("sha256", state->reference, &ref[0]);
|
||||||
update_metadata_reference(sdata, state, &ref[0], cfg);
|
update_metadata_reference(sdata, state, &ref[0], cfg);
|
||||||
}
|
}
|
||||||
else if(state->reference[0] == 0){
|
else if(state->reference[0] == 0){
|
||||||
@ -218,20 +218,20 @@ int store_meta_data(struct session_data *sdata, struct parser_state *state, stru
|
|||||||
// check if this is a message which is already referenced
|
// check if this is a message which is already referenced
|
||||||
uint64 count=0;
|
uint64 count=0;
|
||||||
|
|
||||||
digest_string(state->message_id, &ref[0]);
|
digest_string("sha256", state->message_id, &ref[0]);
|
||||||
if(prepare_sql_statement(sdata, &sql, SQL_PREPARED_STMT_GET_METADATA_REFERENCE) != ERR){
|
if(prepare_sql_statement(sdata, &sql, SQL_PREPARED_STMT_GET_METADATA_REFERENCE) != ERR){
|
||||||
p_bind_init(&sql);
|
p_bind_init(&sql);
|
||||||
|
|
||||||
sql.sql[sql.pos] = &ref[0]; sql.type[sql.pos] = TYPE_STRING; sql.pos++;
|
sql.sql[sql.pos] = &ref[0]; sql.type[sql.pos] = TYPE_STRING; sql.pos++;
|
||||||
|
|
||||||
if(p_exec_stmt(sdata, &sql) == OK){
|
if(p_exec_stmt(sdata, &sql) == OK){
|
||||||
p_bind_init(&sql);
|
p_bind_init(&sql);
|
||||||
|
|
||||||
sql.sql[sql.pos] = (char *)&count; sql.type[sql.pos] = TYPE_LONGLONG; sql.len[sql.pos] = sizeof(uint64); sql.pos++;
|
sql.sql[sql.pos] = (char *)&count; sql.type[sql.pos] = TYPE_LONGLONG; sql.len[sql.pos] = sizeof(uint64); sql.pos++;
|
||||||
p_store_results(&sql);
|
p_store_results(&sql);
|
||||||
p_fetch_results(&sql);
|
p_fetch_results(&sql);
|
||||||
p_free_results(&sql);
|
p_free_results(&sql);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
close_prepared_statement(&sql);
|
close_prepared_statement(&sql);
|
||||||
|
@ -169,7 +169,7 @@ void post_parse(struct session_data *sdata, struct parser_state *state, struct c
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
digest_string(state->message_id, &(state->message_id_hash[0]));
|
digest_string("sha256", state->message_id, &(state->message_id_hash[0]));
|
||||||
|
|
||||||
if(sdata->sent == 0) sdata->sent = sdata->now;
|
if(sdata->sent == 0) sdata->sent = sdata->now;
|
||||||
}
|
}
|
||||||
|
@ -37,7 +37,7 @@ int do_av_check(char *filename, struct config *cfg);
|
|||||||
|
|
||||||
int make_digests(struct session_data *sdata, struct config *cfg);
|
int make_digests(struct session_data *sdata, struct config *cfg);
|
||||||
void digest_file(char *filename, char *digest);
|
void digest_file(char *filename, char *digest);
|
||||||
void digest_string(char *s, char *digest);
|
void digest_string(char *digestname, char *s, char *digest);
|
||||||
void create_md5_from_email_address(char *puf, char *md5buf);
|
void create_md5_from_email_address(char *puf, char *md5buf);
|
||||||
|
|
||||||
void remove_stripped_attachments(struct parser_state *state);
|
void remove_stripped_attachments(struct parser_state *state);
|
||||||
|
@ -29,7 +29,7 @@ static void test_digest_string(){
|
|||||||
};
|
};
|
||||||
|
|
||||||
for(i=0; i<sizeof(tests)/sizeof(struct digest_test); i++){
|
for(i=0; i<sizeof(tests)/sizeof(struct digest_test); i++){
|
||||||
digest_string(tests[i].s, &digest[0]);
|
digest_string("sha256", tests[i].s, &digest[0]);
|
||||||
assert(strcmp(digest, tests[i].digest1) == 0 && "test_digest_string()");
|
assert(strcmp(digest, tests[i].digest1) == 0 && "test_digest_string()");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user