Commit a944183b authored by Paul Sokolovsky's avatar Paul Sokolovsky
Browse files

moduhashlib: Integrate sha256 implementation.

parent 63e02e8c
...@@ -36,6 +36,8 @@ ...@@ -36,6 +36,8 @@
#if MICROPY_PY_UHASHLIB #if MICROPY_PY_UHASHLIB
#include "crypto-algorithms/sha256.h"
typedef struct _mp_obj_hash_t { typedef struct _mp_obj_hash_t {
mp_obj_base_t base; mp_obj_base_t base;
char state[0]; char state[0];
...@@ -45,8 +47,9 @@ STATIC mp_obj_t hash_update(mp_obj_t self_in, mp_obj_t arg); ...@@ -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) { 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_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; o->base.type = type_in;
sha256_init((SHA256_CTX*)o->state);
if (n_args == 1) { if (n_args == 1) {
hash_update(o, args[0]); 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 ...@@ -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) { 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; return mp_const_none;
} }
MP_DEFINE_CONST_FUN_OBJ_2(hash_update_obj, hash_update); MP_DEFINE_CONST_FUN_OBJ_2(hash_update_obj, hash_update);
STATIC mp_obj_t hash_digest(mp_obj_t self_in) { 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); MP_DEFINE_CONST_FUN_OBJ_1(hash_digest_obj, hash_digest);
STATIC mp_obj_t hash_hexdigest(mp_obj_t self_in) { 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); MP_DEFINE_CONST_FUN_OBJ_1(hash_hexdigest_obj, hash_hexdigest);
...@@ -105,4 +122,6 @@ const mp_obj_module_t mp_module_uhashlib = { ...@@ -105,4 +122,6 @@ const mp_obj_module_t mp_module_uhashlib = {
.globals = (mp_obj_dict_t*)&mp_module_hashlib_globals, .globals = (mp_obj_dict_t*)&mp_module_hashlib_globals,
}; };
#include "crypto-algorithms/sha256.c"
#endif //MICROPY_PY_UHASHLIB #endif //MICROPY_PY_UHASHLIB
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment