From ddd306f00f337659a652c3da8fbfba63d1b6ebb2 Mon Sep 17 00:00:00 2001 From: Matthias Vallentin Date: Wed, 12 Dec 2012 10:28:56 -0800 Subject: [PATCH] Migrate free SHA* functions to SHA*Val::digest(). --- aux/broccoli | 2 +- aux/broctl | 2 +- src/OpaqueVal.cc | 98 +++++++++++++++++++++++++++++++++++------------- src/OpaqueVal.h | 4 ++ src/bro.bif | 55 ++------------------------- 5 files changed, 80 insertions(+), 81 deletions(-) diff --git a/aux/broccoli b/aux/broccoli index 06682dbb15..a8846fc5b0 160000 --- a/aux/broccoli +++ b/aux/broccoli @@ -1 +1 @@ -Subproject commit 06682dbb15d26d2688bdc9ad76efec17d38dc80f +Subproject commit a8846fc5b004ffe4e3d00e826d0077ba19518192 diff --git a/aux/broctl b/aux/broctl index 91e3b8ad44..834131cd0e 160000 --- a/aux/broctl +++ b/aux/broctl @@ -1 +1 @@ -Subproject commit 91e3b8ad445cb4d8919b4ee1cc6f0753c3fa0a55 +Subproject commit 834131cd0ec0f63cce9de818726fe6167dedbf34 diff --git a/src/OpaqueVal.cc b/src/OpaqueVal.cc index 478a2f502d..fb70a85293 100644 --- a/src/OpaqueVal.cc +++ b/src/OpaqueVal.cc @@ -29,7 +29,7 @@ bool HashVal::Feed(const void* data, size_t size) return Update(data, size); reporter->InternalError("invalidated opaque handle"); - return false; + return false; } bool HashVal::Update(const void*, size_t) @@ -60,37 +60,37 @@ bool HashVal::DoUnserialize(UnserialInfo* info) void MD5Val::digest(val_list& vlist, u_char result[MD5_DIGEST_LENGTH]) - { - MD5_CTX h; + { + MD5_CTX h; - md5_init(&h); - loop_over_list(vlist, i) - { - Val* v = vlist[i]; - if ( v->Type()->Tag() == TYPE_STRING ) - { - const BroString* str = v->AsString(); - md5_update(&h, str->Bytes(), str->Len()); - } - else - { - ODesc d(DESC_BINARY); - v->Describe(&d); - md5_update(&h, (const u_char *) d.Bytes(), d.Len()); - } - } - md5_final(&h, result); - } + md5_init(&h); + loop_over_list(vlist, i) + { + Val* v = vlist[i]; + if ( v->Type()->Tag() == TYPE_STRING ) + { + const BroString* str = v->AsString(); + md5_update(&h, str->Bytes(), str->Len()); + } + else + { + ODesc d(DESC_BINARY); + v->Describe(&d); + md5_update(&h, (const u_char *) d.Bytes(), d.Len()); + } + } + md5_final(&h, result); + } void MD5Val::hmac(val_list& vlist, u_char key[MD5_DIGEST_LENGTH], u_char result[MD5_DIGEST_LENGTH]) - { - digest(vlist, result); - for ( int i = 0; i < MD5_DIGEST_LENGTH; ++i ) - result[i] ^= key[i]; - MD5(result, MD5_DIGEST_LENGTH, result); - } + { + digest(vlist, result); + for ( int i = 0; i < MD5_DIGEST_LENGTH; ++i ) + result[i] ^= key[i]; + MD5(result, MD5_DIGEST_LENGTH, result); + } bool MD5Val::Init() { @@ -128,6 +128,28 @@ bool MD5Val::DoUnserialize(UnserialInfo* info) } +void SHA1Val::digest(val_list& vlist, u_char result[SHA_DIGEST_LENGTH]) + { + SHA_CTX h; + sha1_init(&h); + loop_over_list(vlist, i) + { + Val* v = vlist[i]; + if ( v->Type()->Tag() == TYPE_STRING ) + { + const BroString* str = v->AsString(); + sha1_update(&h, str->Bytes(), str->Len()); + } + else + { + ODesc d(DESC_BINARY); + v->Describe(&d); + sha1_update(&h, (const u_char *) d.Bytes(), d.Len()); + } + } + sha1_final(&h, result); + } + bool SHA1Val::Init() { sha1_init(&ctx); @@ -164,6 +186,28 @@ bool SHA1Val::DoUnserialize(UnserialInfo* info) } +void SHA256Val::digest(val_list& vlist, u_char result[SHA256_DIGEST_LENGTH]) + { + SHA256_CTX h; + sha256_init(&h); + loop_over_list(vlist, i) + { + Val* v = vlist[i]; + if ( v->Type()->Tag() == TYPE_STRING ) + { + const BroString* str = v->AsString(); + sha256_update(&h, str->Bytes(), str->Len()); + } + else + { + ODesc d(DESC_BINARY); + v->Describe(&d); + sha256_update(&h, (const u_char *) d.Bytes(), d.Len()); + } + } + sha256_final(&h, result); + } + bool SHA256Val::Init() { sha256_init(&ctx); diff --git a/src/OpaqueVal.h b/src/OpaqueVal.h index 6b86b96999..3d665446aa 100644 --- a/src/OpaqueVal.h +++ b/src/OpaqueVal.h @@ -49,6 +49,8 @@ private: class SHA1Val : public HashVal { public: + static void digest(val_list& vlist, u_char result[SHA_DIGEST_LENGTH]); + SHA1Val() : HashVal(new OpaqueType("sha1")) { } protected: @@ -66,6 +68,8 @@ private: class SHA256Val : public HashVal { public: + static void digest(val_list& vlist, u_char result[SHA256_DIGEST_LENGTH]); + SHA256Val() : HashVal(new OpaqueType("sha256")) { } protected: diff --git a/src/bro.bif b/src/bro.bif index b4ce3b8530..36e86efd52 100644 --- a/src/bro.bif +++ b/src/bro.bif @@ -529,55 +529,6 @@ function piped_exec%(program: string, to_write: string%): bool return new Val(1, TYPE_BOOL); %} -%%{ -// TODO: Migrate these functions into SHA*Val, in the same vein as MD5Val. -static void hash_sha1_val(val_list& vlist, unsigned char digest[20]) - { - SHA_CTX h; - - sha1_init(&h); - loop_over_list(vlist, i) - { - Val* v = vlist[i]; - if ( v->Type()->Tag() == TYPE_STRING ) - { - const BroString* str = v->AsString(); - sha1_update(&h, str->Bytes(), str->Len()); - } - else - { - ODesc d(DESC_BINARY); - v->Describe(&d); - sha1_update(&h, (const u_char *) d.Bytes(), d.Len()); - } - } - sha1_final(&h, digest); - } - -static void hash_sha256_val(val_list& vlist, unsigned char digest[32]) - { - SHA256_CTX h; - - sha256_init(&h); - loop_over_list(vlist, i) - { - Val* v = vlist[i]; - if ( v->Type()->Tag() == TYPE_STRING ) - { - const BroString* str = v->AsString(); - sha256_update(&h, str->Bytes(), str->Len()); - } - else - { - ODesc d(DESC_BINARY); - v->Describe(&d); - sha256_update(&h, (const u_char *) d.Bytes(), d.Len()); - } - } - sha256_final(&h, digest); - } -%%} - %%{ #include "OpaqueVal.h" %%} @@ -618,7 +569,7 @@ function md5_hash%(...%): string function sha1_hash%(...%): string %{ unsigned char digest[SHA_DIGEST_LENGTH]; - hash_sha1_val(@ARG@, digest); + SHA1Val::digest(@ARG@, digest); return new StringVal(sha1_digest_print(digest)); %} @@ -638,7 +589,7 @@ function sha1_hash%(...%): string function sha256_hash%(...%): string %{ unsigned char digest[SHA256_DIGEST_LENGTH]; - hash_sha256_val(@ARG@, digest); + SHA256Val::digest(@ARG@, digest); return new StringVal(sha256_digest_print(digest)); %} @@ -659,7 +610,7 @@ function md5_hmac%(...%): string %} ## Constructs an MD5 handle to enable incremental hash computation. You can -## feed data to the ## returned opaque value with ## :bro:id:`md5_hash_update` +## feed data to the returned opaque value with ## :bro:id:`md5_hash_update` ## and finally need to call :bro:id:`md5_hash_finish` to finish the computation ## and get the final hash value. ##