/ components / micropython / port / src / moduhashlib_maixpy.c
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