aboutsummaryrefslogtreecommitdiff
path: root/extmod/moduhashlib.c
diff options
context:
space:
mode:
authorPaul Sokolovsky <pfalcon@users.sourceforge.net>2014-11-22 04:50:29 +0200
committerPaul Sokolovsky <pfalcon@users.sourceforge.net>2014-11-22 14:48:17 +0200
commita944183b353d693b7b7070e6da48cbc36bf70d61 (patch)
tree96a31eeb2948d98ee187a918fc4db0055a53a4cb /extmod/moduhashlib.c
parent63e02e8cc03036880949ca7ea19beb153ab7e803 (diff)
moduhashlib: Integrate sha256 implementation.
Diffstat (limited to 'extmod/moduhashlib.c')
-rw-r--r--extmod/moduhashlib.c25
1 files changed, 22 insertions, 3 deletions
diff --git a/extmod/moduhashlib.c b/extmod/moduhashlib.c
index bdc2529c1..8c6b34a4c 100644
--- a/extmod/moduhashlib.c
+++ b/extmod/moduhashlib.c
@@ -36,6 +36,8 @@
#if MICROPY_PY_UHASHLIB
+#include "crypto-algorithms/sha256.h"
+
typedef struct _mp_obj_hash_t {
mp_obj_base_t base;
char state[0];
@@ -45,8 +47,9 @@ STATIC mp_obj_t hash_update(mp_obj_t self_in, mp_obj_t arg);
STATIC mp_obj_t hash_make_new(mp_obj_t type_in, mp_uint_t n_args, mp_uint_t n_kw, const mp_obj_t *args) {
mp_arg_check_num(n_args, n_kw, 0, 1, false);
- mp_obj_hash_t *o = m_new_obj_var(mp_obj_hash_t, char, 0);
+ mp_obj_hash_t *o = m_new_obj_var(mp_obj_hash_t, char, sizeof(SHA256_CTX));
o->base.type = type_in;
+ sha256_init((SHA256_CTX*)o->state);
if (n_args == 1) {
hash_update(o, args[0]);
}
@@ -54,17 +57,31 @@ STATIC mp_obj_t hash_make_new(mp_obj_t type_in, mp_uint_t n_args, mp_uint_t n_kw
}
STATIC mp_obj_t hash_update(mp_obj_t self_in, mp_obj_t arg) {
+ mp_obj_hash_t *self = self_in;
+ mp_buffer_info_t bufinfo;
+ mp_get_buffer_raise(arg, &bufinfo, MP_BUFFER_READ);
+ sha256_update((SHA256_CTX*)self->state, bufinfo.buf, bufinfo.len);
return mp_const_none;
}
MP_DEFINE_CONST_FUN_OBJ_2(hash_update_obj, hash_update);
STATIC mp_obj_t hash_digest(mp_obj_t self_in) {
- return mp_obj_new_bytes((const byte*)"\0\0\0\0", 4);
+ mp_obj_hash_t *self = self_in;
+ byte *hash;
+ mp_obj_t o = mp_obj_str_builder_start(&mp_type_bytes, SHA256_BLOCK_SIZE, &hash);
+ sha256_final((SHA256_CTX*)self->state, hash);
+ return mp_obj_str_builder_end(o);
}
MP_DEFINE_CONST_FUN_OBJ_1(hash_digest_obj, hash_digest);
STATIC mp_obj_t hash_hexdigest(mp_obj_t self_in) {
- return mp_obj_new_str("00000000", 8, false);
+ mp_not_implemented("");
+#if 0
+ mp_obj_hash_t *self = self_in;
+ byte hash[SHA256_BLOCK_SIZE];
+ sha256_final((SHA256_CTX*)self->state, hash);
+ return mp_obj_new_str((char*)hash, SHA256_BLOCK_SIZE, false);
+#endif
}
MP_DEFINE_CONST_FUN_OBJ_1(hash_hexdigest_obj, hash_hexdigest);
@@ -105,4 +122,6 @@ const mp_obj_module_t mp_module_uhashlib = {
.globals = (mp_obj_dict_t*)&mp_module_hashlib_globals,
};
+#include "crypto-algorithms/sha256.c"
+
#endif //MICROPY_PY_UHASHLIB