moduhashlib_maixpy.c
1 /* 2 * Copyright 2019 Sipeed Co.,Ltd. 3 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #include <assert.h> 18 #include <string.h> 19 #include "py/runtime.h" 20 21 #if MICROPY_PY_UHASHLIB_MAIX 22 #include "sha256.h" 23 24 typedef struct _mp_obj_hash_t { 25 mp_obj_base_t base; 26 size_t total_len; 27 char state[0]; 28 } mp_obj_hash_t; 29 30 STATIC const mp_obj_type_t uhashlib_sha256_type; 31 32 #if MICROPY_PY_UHASHLIB_SHA256_MAIX 33 STATIC mp_obj_t uhashlib_sha256_update(mp_obj_t self_in, mp_obj_t arg); 34 35 STATIC mp_obj_t uhashlib_sha256_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { 36 mp_arg_check_num(n_args, n_kw, 0, 1, false); 37 mp_obj_hash_t *o = m_new_obj_var(mp_obj_hash_t, char, sizeof(sha256_context_t)); 38 o->base.type = type; 39 o->total_len = 0; 40 sha256_init((sha256_context_t*)o->state, 64); 41 if (n_args == 1) { 42 uhashlib_sha256_update(MP_OBJ_FROM_PTR(o), args[0]); 43 } 44 return MP_OBJ_FROM_PTR(o); 45 } 46 47 STATIC mp_obj_t uhashlib_sha256_update(mp_obj_t self_in, mp_obj_t arg) { 48 mp_obj_hash_t *self = MP_OBJ_TO_PTR(self_in); 49 mp_buffer_info_t bufinfo; 50 mp_get_buffer_raise(arg, &bufinfo, MP_BUFFER_READ); 51 self->total_len += bufinfo.len; 52 sha256_update_length(self->total_len); 53 sha256_update((sha256_context_t*)self->state, bufinfo.buf, bufinfo.len); 54 return mp_const_none; 55 } 56 57 STATIC mp_obj_t uhashlib_sha256_digest(mp_obj_t self_in) { 58 mp_obj_hash_t *self = MP_OBJ_TO_PTR(self_in); 59 vstr_t vstr; 60 vstr_init_len(&vstr, 32); 61 sha256_final((sha256_context_t*)self->state, (byte*)vstr.buf); 62 return mp_obj_new_str_from_vstr(&mp_type_bytes, &vstr); 63 } 64 65 STATIC mp_obj_t uhashlib_sha256_hard(mp_obj_t self_in,mp_obj_t arg) { 66 mp_buffer_info_t bufinfo; 67 mp_get_buffer_raise(arg, &bufinfo, MP_BUFFER_READ); 68 vstr_t vstr; 69 vstr_init_len(&vstr, 32); 70 sha256_hard_calculate(bufinfo.buf, bufinfo.len, (byte*)vstr.buf); 71 return mp_obj_new_str_from_vstr(&mp_type_bytes, &vstr); 72 } 73 74 STATIC MP_DEFINE_CONST_FUN_OBJ_2(uhashlib_sha256_update_obj, uhashlib_sha256_update); 75 STATIC MP_DEFINE_CONST_FUN_OBJ_1(uhashlib_sha256_digest_obj, uhashlib_sha256_digest); 76 STATIC MP_DEFINE_CONST_FUN_OBJ_2(uhashlib_sha256_hard_obj, uhashlib_sha256_hard); 77 78 STATIC const mp_rom_map_elem_t uhashlib_sha256_locals_dict_table[] = { 79 { MP_ROM_QSTR(MP_QSTR_update), MP_ROM_PTR(&uhashlib_sha256_update_obj) }, 80 { MP_ROM_QSTR(MP_QSTR_digest), MP_ROM_PTR(&uhashlib_sha256_digest_obj) }, 81 { MP_ROM_QSTR(MP_QSTR_calculate_hard), MP_ROM_PTR(&uhashlib_sha256_hard_obj) }, 82 }; 83 STATIC MP_DEFINE_CONST_DICT(uhashlib_sha256_locals_dict, uhashlib_sha256_locals_dict_table); 84 85 STATIC const mp_obj_type_t uhashlib_sha256_type = { 86 { &mp_type_type }, 87 .name = MP_QSTR_sha256, 88 .make_new = uhashlib_sha256_make_new, 89 .locals_dict = (mp_obj_dict_t*)&uhashlib_sha256_locals_dict, 90 }; 91 #endif 92 93 94 STATIC const mp_rom_map_elem_t mp_module_uhashlib_globals_table[] = { 95 { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_uhashlib) }, 96 { MP_ROM_QSTR(MP_QSTR_sha256), MP_ROM_PTR(&uhashlib_sha256_type) }, 97 }; 98 99 STATIC MP_DEFINE_CONST_DICT(mp_module_uhashlib_globals, mp_module_uhashlib_globals_table); 100 101 const mp_obj_module_t mp_module_uhashlib_maix = { 102 .base = { &mp_type_module }, 103 .globals = (mp_obj_dict_t*)&mp_module_uhashlib_globals, 104 }; 105 106 #endif //MICROPY_PY_UHASHLIB_K210