moduhashlib: Integrate sha256 implementation.

This commit is contained in:
Paul Sokolovsky 2014-11-22 04:50:29 +02:00
parent 63e02e8cc0
commit a944183b35

View File

@ -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);
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
} }
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 = {
.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