pike.git/
src/
post_modules/
Nettle/
hash.H
Branch:
Tag:
Non-build tags
All tags
No tags
2017-08-01
2017-08-01 13:01:40 by Martin Nilsson <nilsson@fastmail.com>
d19e9c2b02a321d6be80e4e8372d818c5bd781cb (
76
lines) (+
76
/-
0
)
[
Show
|
Annotate
]
Branch:
8.1
Use Nettle HMAC implementation for Nettle implemented ciphers. Up to 3 times faster.
43:
} #endif
+
#ifdef HAVE_NETTLE_HMAC_H
+
PIKECLASS _HMAC
+
flags ID_PROTECTED;
+
{
+
EXTRA
+
{
+
inherit_internal_class(MK_STRING("_HMAC"));
+
}
+
+
PIKECLASS State
+
{
+
CVAR struct HMAC_CTX(struct cmod_CONCAT_EVAL(NETTLE_NAME, _ctx)) ctx;
+
CVAR const struct nettle_hash *meta;
+
+
EXTRA
+
{
+
inherit_internal_class(MK_STRING("State"));
+
}
+
+
PIKEFUN void create(string(8bit) passwd, void|int b)
+
{
+
const struct nettle_hash *meta = THIS->meta = ((struct Nettle_Hash_struct *)parent_storage(2, Nettle_Hash_program))->meta;
+
NO_WIDE_STRING(passwd);
+
HMAC_SET_KEY(&THIS->ctx, meta, passwd->len, (const uint8_t *)passwd->str);
+
}
+
+
PIKEFUN string(8bit) `()(string(8bit) text)
+
{
+
struct cmod_CONCAT_EVAL(NETTLE_NAME, _ctx) state;
+
int bytes = THIS->meta->digest_size;
+
struct pike_string *dst = begin_shared_string(bytes);
+
+
memcpy(&state, &THIS->ctx.inner, THIS->meta->context_size);
+
THIS->meta->update(&state, text->len, (const uint8_t *)text->str);
+
hmac_digest(&THIS->ctx.outer, &THIS->ctx.inner, &state,
+
THIS->meta, THIS->meta->digest_size, (uint8_t *)dst->str);
+
push_string(end_shared_string(dst));
+
}
+
+
PIKEFUN object update(string(8bit) data)
+
optflags OPT_SIDE_EFFECT;
+
rawtype tFunc(tStr8, tObjImpl_NETTLE_HASH_STATE);
+
{
+
THIS->meta->update(&THIS->ctx.state, data->len, (const uint8_t *)data->str);
+
push_object(this_object());
+
}
+
+
PIKEFUN object init(string(8bit)|void data)
+
optflags OPT_SIDE_EFFECT;
+
rawtype tFunc(tOr(tVoid, tStr8), tObjImpl_NETTLE_HASH_STATE);
+
{
+
memcpy(&THIS->ctx.state, &THIS->ctx.inner, THIS->meta->context_size);
+
if(data)
+
THIS->meta->update(&THIS->ctx.state, data->len, (const uint8_t *)data->str);
+
push_object(this_object());
+
}
+
+
PIKEFUN string(8bit) digest(int(0..)|void length)
+
{
+
int bytes = THIS->meta->digest_size;
+
struct pike_string *dst;
+
if(length)
+
bytes = MINIMUM(bytes, length->u.integer);
+
dst = begin_shared_string(bytes);
+
+
hmac_digest(&THIS->ctx.outer, &THIS->ctx.inner, &THIS->ctx.state,
+
THIS->meta, bytes, (uint8_t *)dst->str);
+
+
push_string(end_shared_string(dst));
+
}
+
+
}
+
}
+
#endif
+
DOCSTART() @class State *! *! State for PIKE_NAME hashing.