mirror of
https://github.com/zeek/zeek.git
synced 2025-10-08 01:28:20 +00:00
Migrate free SHA* functions to SHA*Val::digest().
This commit is contained in:
parent
91f2cb2b64
commit
ddd306f00f
5 changed files with 80 additions and 81 deletions
|
@ -1 +1 @@
|
||||||
Subproject commit 06682dbb15d26d2688bdc9ad76efec17d38dc80f
|
Subproject commit a8846fc5b004ffe4e3d00e826d0077ba19518192
|
|
@ -1 +1 @@
|
||||||
Subproject commit 91e3b8ad445cb4d8919b4ee1cc6f0753c3fa0a55
|
Subproject commit 834131cd0ec0f63cce9de818726fe6167dedbf34
|
|
@ -29,7 +29,7 @@ bool HashVal::Feed(const void* data, size_t size)
|
||||||
return Update(data, size);
|
return Update(data, size);
|
||||||
|
|
||||||
reporter->InternalError("invalidated opaque handle");
|
reporter->InternalError("invalidated opaque handle");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool HashVal::Update(const void*, size_t)
|
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])
|
void MD5Val::digest(val_list& vlist, u_char result[MD5_DIGEST_LENGTH])
|
||||||
{
|
{
|
||||||
MD5_CTX h;
|
MD5_CTX h;
|
||||||
|
|
||||||
md5_init(&h);
|
md5_init(&h);
|
||||||
loop_over_list(vlist, i)
|
loop_over_list(vlist, i)
|
||||||
{
|
{
|
||||||
Val* v = vlist[i];
|
Val* v = vlist[i];
|
||||||
if ( v->Type()->Tag() == TYPE_STRING )
|
if ( v->Type()->Tag() == TYPE_STRING )
|
||||||
{
|
{
|
||||||
const BroString* str = v->AsString();
|
const BroString* str = v->AsString();
|
||||||
md5_update(&h, str->Bytes(), str->Len());
|
md5_update(&h, str->Bytes(), str->Len());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ODesc d(DESC_BINARY);
|
ODesc d(DESC_BINARY);
|
||||||
v->Describe(&d);
|
v->Describe(&d);
|
||||||
md5_update(&h, (const u_char *) d.Bytes(), d.Len());
|
md5_update(&h, (const u_char *) d.Bytes(), d.Len());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
md5_final(&h, result);
|
md5_final(&h, result);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MD5Val::hmac(val_list& vlist,
|
void MD5Val::hmac(val_list& vlist,
|
||||||
u_char key[MD5_DIGEST_LENGTH],
|
u_char key[MD5_DIGEST_LENGTH],
|
||||||
u_char result[MD5_DIGEST_LENGTH])
|
u_char result[MD5_DIGEST_LENGTH])
|
||||||
{
|
{
|
||||||
digest(vlist, result);
|
digest(vlist, result);
|
||||||
for ( int i = 0; i < MD5_DIGEST_LENGTH; ++i )
|
for ( int i = 0; i < MD5_DIGEST_LENGTH; ++i )
|
||||||
result[i] ^= key[i];
|
result[i] ^= key[i];
|
||||||
MD5(result, MD5_DIGEST_LENGTH, result);
|
MD5(result, MD5_DIGEST_LENGTH, result);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MD5Val::Init()
|
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()
|
bool SHA1Val::Init()
|
||||||
{
|
{
|
||||||
sha1_init(&ctx);
|
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()
|
bool SHA256Val::Init()
|
||||||
{
|
{
|
||||||
sha256_init(&ctx);
|
sha256_init(&ctx);
|
||||||
|
|
|
@ -49,6 +49,8 @@ private:
|
||||||
|
|
||||||
class SHA1Val : public HashVal {
|
class SHA1Val : public HashVal {
|
||||||
public:
|
public:
|
||||||
|
static void digest(val_list& vlist, u_char result[SHA_DIGEST_LENGTH]);
|
||||||
|
|
||||||
SHA1Val() : HashVal(new OpaqueType("sha1")) { }
|
SHA1Val() : HashVal(new OpaqueType("sha1")) { }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
@ -66,6 +68,8 @@ private:
|
||||||
|
|
||||||
class SHA256Val : public HashVal {
|
class SHA256Val : public HashVal {
|
||||||
public:
|
public:
|
||||||
|
static void digest(val_list& vlist, u_char result[SHA256_DIGEST_LENGTH]);
|
||||||
|
|
||||||
SHA256Val() : HashVal(new OpaqueType("sha256")) { }
|
SHA256Val() : HashVal(new OpaqueType("sha256")) { }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
55
src/bro.bif
55
src/bro.bif
|
@ -529,55 +529,6 @@ function piped_exec%(program: string, to_write: string%): bool
|
||||||
return new Val(1, TYPE_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"
|
#include "OpaqueVal.h"
|
||||||
%%}
|
%%}
|
||||||
|
@ -618,7 +569,7 @@ function md5_hash%(...%): string
|
||||||
function sha1_hash%(...%): string
|
function sha1_hash%(...%): string
|
||||||
%{
|
%{
|
||||||
unsigned char digest[SHA_DIGEST_LENGTH];
|
unsigned char digest[SHA_DIGEST_LENGTH];
|
||||||
hash_sha1_val(@ARG@, digest);
|
SHA1Val::digest(@ARG@, digest);
|
||||||
return new StringVal(sha1_digest_print(digest));
|
return new StringVal(sha1_digest_print(digest));
|
||||||
%}
|
%}
|
||||||
|
|
||||||
|
@ -638,7 +589,7 @@ function sha1_hash%(...%): string
|
||||||
function sha256_hash%(...%): string
|
function sha256_hash%(...%): string
|
||||||
%{
|
%{
|
||||||
unsigned char digest[SHA256_DIGEST_LENGTH];
|
unsigned char digest[SHA256_DIGEST_LENGTH];
|
||||||
hash_sha256_val(@ARG@, digest);
|
SHA256Val::digest(@ARG@, digest);
|
||||||
return new StringVal(sha256_digest_print(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
|
## 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 finally need to call :bro:id:`md5_hash_finish` to finish the computation
|
||||||
## and get the final hash value.
|
## and get the final hash value.
|
||||||
##
|
##
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue