diff --git a/Makefile b/Makefile index a6f036d..383b7a1 100644 --- a/Makefile +++ b/Makefile @@ -4,7 +4,6 @@ S_TOP ?= libs/secp256k1 MBED_TOP ?= $(MPY_TOP)/lib/mbedtls BECH32_PATCH ?= cd libs/bech32; git apply ../../bech32.patch || true -MPY_PATCH ?= cd libs/mpy; git apply ../../mpy.patch || true all: $(TARGET) @@ -36,7 +35,6 @@ K1_CONF_FLAGS = --with-ecmult-window=2 --with-ecmult-gen-kb=2 --enable-module-re one-time: cd $(MPY_TOP); git submodule update $(BECH32_PATCH) - $(MPY_PATCH) cd $(MPY_TOP)/mpy-cross; make cd $(S_TOP); ./autogen.sh && ./configure $(K1_CONF_FLAGS) && make precomp @@ -45,7 +43,6 @@ one-time: min-one-time: cd libs; git submodule update --init bech32 cifra secp256k1 $(BECH32_PATCH) - $(MPY_PATCH) cd $(S_TOP); ./autogen.sh && ./configure $(K1_CONF_FLAGS) && make precomp esp: diff --git a/libs/mpy b/libs/mpy index ab754d5..e0e9fbb 160000 --- a/libs/mpy +++ b/libs/mpy @@ -1 +1 @@ -Subproject commit ab754d5924168d027bfc2eeed7881b9b2e469535 +Subproject commit e0e9fbb17ed6fd06bb76e266ae554784c9c80804 diff --git a/mpy.patch b/mpy.patch deleted file mode 100644 index 4c3844a..0000000 --- a/mpy.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff --git a/py/py.mk b/py/py.mk -index bac38f074..2e6f3d9c6 100644 ---- a/py/py.mk -+++ b/py/py.mk -@@ -216,7 +216,7 @@ PY_CORE_O = $(addprefix $(BUILD)/, $(PY_CORE_O_BASENAME)) - PY_EXTMOD_O = $(addprefix $(BUILD)/, $(PY_EXTMOD_O_BASENAME)) - - # this is a convenience variable for ports that want core, extmod and frozen code --PY_O = $(PY_CORE_O) $(PY_EXTMOD_O) -+PY_O += $(PY_CORE_O) $(PY_EXTMOD_O) - - # object file for frozen code specified via a manifest - ifneq ($(FROZEN_MANIFEST),) diff --git a/ngu/aes.c b/ngu/aes.c index f2ab019..d68f8a5 100644 --- a/ngu/aes.c +++ b/ngu/aes.c @@ -26,7 +26,7 @@ typedef struct { cf_ctr mode_ctx; } mp_obj_CTR_t; -STATIC const mp_obj_type_t s_CBC_type, s_CTR_type; +static const mp_obj_type_t s_CBC_type, s_CTR_type; static void _aes_setup(cf_aes_context *aes_ctx, const mp_obj_t key_in) { @@ -45,11 +45,11 @@ static void _aes_setup(cf_aes_context *aes_ctx, const mp_obj_t key_in) cf_aes_init(aes_ctx, key.buf, key.len); } -STATIC mp_obj_t s_CBC_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { +static mp_obj_t s_CBC_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { // args: is_encrypt, key, iv? mp_arg_check_num(n_args, n_kw, 3, 3, false); - mp_obj_CBC_t *o = m_new_obj_with_finaliser(mp_obj_CBC_t); + mp_obj_CBC_t *o = (mp_obj_CBC_t *)m_malloc_with_finaliser(sizeof(mp_obj_CBC_t)); o->base.type = type; o->is_encrypt = !!mp_obj_get_int_truncated(args[0]); @@ -66,11 +66,11 @@ STATIC mp_obj_t s_CBC_make_new(const mp_obj_type_t *type, size_t n_args, size_t return MP_OBJ_FROM_PTR(o); } -STATIC mp_obj_t s_CTR_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { +static mp_obj_t s_CTR_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { // args: key, nonce mp_arg_check_num(n_args, n_kw, 1, 2, false); - mp_obj_CTR_t *o = m_new_obj_with_finaliser(mp_obj_CTR_t); + mp_obj_CTR_t *o = (mp_obj_CTR_t *)m_malloc_with_finaliser(sizeof(mp_obj_CTR_t)); o->base.type = type; _aes_setup(&o->aes_ctx, args[0]); @@ -91,7 +91,7 @@ STATIC mp_obj_t s_CTR_make_new(const mp_obj_type_t *type, size_t n_args, size_t return MP_OBJ_FROM_PTR(o); } -STATIC mp_obj_t s_CBC_cipher(mp_obj_t self_in, mp_obj_t buf_in) +static mp_obj_t s_CBC_cipher(mp_obj_t self_in, mp_obj_t buf_in) { mp_buffer_info_t buf; mp_get_buffer_raise(buf_in, &buf, MP_BUFFER_READ); @@ -99,23 +99,23 @@ STATIC mp_obj_t s_CBC_cipher(mp_obj_t self_in, mp_obj_t buf_in) assert(self->aes_ctx.rounds); - vstr_t rv; - vstr_init_len(&rv, buf.len); + uint8_t rv[buf.len]; + if(buf.len % CF_MAXBLOCK) { // 16 mp_raise_ValueError(NULL); } if(self->is_encrypt) { - cf_cbc_encrypt(&self->mode_ctx, buf.buf, (uint8_t *)rv.buf, buf.len/CF_MAXBLOCK); + cf_cbc_encrypt(&self->mode_ctx, buf.buf, rv, buf.len/CF_MAXBLOCK); } else { - cf_cbc_decrypt(&self->mode_ctx, buf.buf, (uint8_t *)rv.buf, buf.len/CF_MAXBLOCK); + cf_cbc_decrypt(&self->mode_ctx, buf.buf, rv, buf.len/CF_MAXBLOCK); } - return mp_obj_new_str_from_vstr(&mp_type_bytes, &rv); + return mp_obj_new_bytes(rv, buf.len); } -STATIC MP_DEFINE_CONST_FUN_OBJ_2(s_CBC_cipher_obj, s_CBC_cipher); +static MP_DEFINE_CONST_FUN_OBJ_2(s_CBC_cipher_obj, s_CBC_cipher); -STATIC mp_obj_t s_CTR_cipher(mp_obj_t self_in, mp_obj_t buf_in) +static mp_obj_t s_CTR_cipher(mp_obj_t self_in, mp_obj_t buf_in) { mp_buffer_info_t buf; mp_get_buffer_raise(buf_in, &buf, MP_BUFFER_READ); @@ -123,17 +123,16 @@ STATIC mp_obj_t s_CTR_cipher(mp_obj_t self_in, mp_obj_t buf_in) assert(self->aes_ctx.rounds); - vstr_t rv; - vstr_init_len(&rv, buf.len); + uint8_t rv[buf.len]; // any size i/o works - cf_ctr_cipher(&self->mode_ctx, buf.buf, (uint8_t *)rv.buf, buf.len); + cf_ctr_cipher(&self->mode_ctx, buf.buf, rv, buf.len); - return mp_obj_new_str_from_vstr(&mp_type_bytes, &rv); + return mp_obj_new_bytes(rv, buf.len); } -STATIC MP_DEFINE_CONST_FUN_OBJ_2(s_CTR_cipher_obj, s_CTR_cipher); +static MP_DEFINE_CONST_FUN_OBJ_2(s_CTR_cipher_obj, s_CTR_cipher); -STATIC mp_obj_t s_CBC_blank(mp_obj_t self_in) { +static mp_obj_t s_CBC_blank(mp_obj_t self_in) { mp_obj_CBC_t *self = MP_OBJ_TO_PTR(self_in); // cf_aes_finish is just this anyway @@ -142,20 +141,20 @@ STATIC mp_obj_t s_CBC_blank(mp_obj_t self_in) { return MP_OBJ_FROM_PTR(self); } -STATIC MP_DEFINE_CONST_FUN_OBJ_1(s_CBC_blank_obj, s_CBC_blank); +static MP_DEFINE_CONST_FUN_OBJ_1(s_CBC_blank_obj, s_CBC_blank); -STATIC mp_obj_t s_CBC_copy(mp_obj_t self_in) { +static mp_obj_t s_CBC_copy(mp_obj_t self_in) { mp_obj_CBC_t *self = MP_OBJ_TO_PTR(self_in); - mp_obj_CBC_t *rv = m_new_obj_with_finaliser(mp_obj_CBC_t); + mp_obj_CBC_t *rv = (mp_obj_CBC_t *)m_malloc_with_finaliser(sizeof(mp_obj_CBC_t)); *rv = *self; rv->base.type = &s_CBC_type; return MP_OBJ_FROM_PTR(rv); } -STATIC MP_DEFINE_CONST_FUN_OBJ_1(s_CBC_copy_obj, s_CBC_copy); +static MP_DEFINE_CONST_FUN_OBJ_1(s_CBC_copy_obj, s_CBC_copy); -STATIC mp_obj_t s_CTR_blank(mp_obj_t self_in) { +static mp_obj_t s_CTR_blank(mp_obj_t self_in) { mp_obj_CTR_t *self = MP_OBJ_TO_PTR(self_in); // cf_aes_finish is just this anyway @@ -164,59 +163,60 @@ STATIC mp_obj_t s_CTR_blank(mp_obj_t self_in) { return MP_OBJ_FROM_PTR(self); } -STATIC MP_DEFINE_CONST_FUN_OBJ_1(s_CTR_blank_obj, s_CTR_blank); +static MP_DEFINE_CONST_FUN_OBJ_1(s_CTR_blank_obj, s_CTR_blank); -STATIC mp_obj_t s_CTR_copy(mp_obj_t self_in) { +static mp_obj_t s_CTR_copy(mp_obj_t self_in) { mp_obj_CTR_t *self = MP_OBJ_TO_PTR(self_in); - mp_obj_CTR_t *rv = m_new_obj_with_finaliser(mp_obj_CTR_t); + mp_obj_CTR_t *rv = (mp_obj_CTR_t *)m_malloc_with_finaliser(sizeof(mp_obj_CTR_t)); *rv = *self; rv->base.type = &s_CTR_type; return MP_OBJ_FROM_PTR(rv); } -STATIC MP_DEFINE_CONST_FUN_OBJ_1(s_CTR_copy_obj, s_CTR_copy); +static MP_DEFINE_CONST_FUN_OBJ_1(s_CTR_copy_obj, s_CTR_copy); -STATIC const mp_rom_map_elem_t s_CBC_locals_dict_table[] = { +static const mp_rom_map_elem_t s_CBC_locals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_cipher), MP_ROM_PTR(&s_CBC_cipher_obj) }, { MP_ROM_QSTR(MP_QSTR_blank), MP_ROM_PTR(&s_CBC_blank_obj) }, { MP_ROM_QSTR(MP_QSTR_copy), MP_ROM_PTR(&s_CBC_copy_obj) }, { MP_ROM_QSTR(MP_QSTR___del__), MP_ROM_PTR(&s_CBC_blank_obj) }, }; -STATIC MP_DEFINE_CONST_DICT(s_CBC_locals_dict, s_CBC_locals_dict_table); +static MP_DEFINE_CONST_DICT(s_CBC_locals_dict, s_CBC_locals_dict_table); -STATIC const mp_obj_type_t s_CBC_type = { - { &mp_type_type }, - .name = MP_QSTR_CBC, - .make_new = s_CBC_make_new, - .locals_dict = (void *)&s_CBC_locals_dict, -}; +static MP_DEFINE_CONST_OBJ_TYPE( + s_CBC_type, + MP_QSTR_CBC, + MP_TYPE_FLAG_NONE, + make_new, s_CBC_make_new, + locals_dict, &s_CBC_locals_dict +); -STATIC const mp_rom_map_elem_t s_CTR_locals_dict_table[] = { +static const mp_rom_map_elem_t s_CTR_locals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_cipher), MP_ROM_PTR(&s_CTR_cipher_obj) }, { MP_ROM_QSTR(MP_QSTR_blank), MP_ROM_PTR(&s_CTR_blank_obj) }, { MP_ROM_QSTR(MP_QSTR_copy), MP_ROM_PTR(&s_CTR_copy_obj) }, { MP_ROM_QSTR(MP_QSTR___del__), MP_ROM_PTR(&s_CTR_blank_obj) }, }; -STATIC MP_DEFINE_CONST_DICT(s_CTR_locals_dict, s_CTR_locals_dict_table); - -STATIC const mp_obj_type_t s_CTR_type = { - { &mp_type_type }, - .name = MP_QSTR_CTR, - .make_new = s_CTR_make_new, - .locals_dict = (void *)&s_CTR_locals_dict, -}; +static MP_DEFINE_CONST_DICT(s_CTR_locals_dict, s_CTR_locals_dict_table); +static MP_DEFINE_CONST_OBJ_TYPE( + s_CTR_type, + MP_QSTR_CTR, + MP_TYPE_FLAG_NONE, + make_new, s_CTR_make_new, + locals_dict, &s_CTR_locals_dict +); -STATIC const mp_rom_map_elem_t mp_module_aes_globals_table[] = { +static const mp_rom_map_elem_t mp_module_aes_globals_table[] = { { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_aes) }, { MP_ROM_QSTR(MP_QSTR_CTR), MP_ROM_PTR(&s_CTR_type) }, { MP_ROM_QSTR(MP_QSTR_CBC), MP_ROM_PTR(&s_CBC_type) }, }; -STATIC MP_DEFINE_CONST_DICT(mp_module_aes_globals, mp_module_aes_globals_table); +static MP_DEFINE_CONST_DICT(mp_module_aes_globals, mp_module_aes_globals_table); const mp_obj_module_t mp_module_aes = { .base = { &mp_type_module }, diff --git a/ngu/cert.c b/ngu/cert.c index 9269544..08b8f7d 100644 --- a/ngu/cert.c +++ b/ngu/cert.c @@ -19,7 +19,7 @@ if(rv) nlr_raise(mp_obj_new_exception_arg1(&mp_type_RuntimeError, \ MP_OBJ_NEW_SMALL_INT(rv))); } -STATIC const mp_obj_type_t cert_type; +static const mp_obj_type_t cert_type; typedef struct { mp_obj_base_t base; @@ -28,10 +28,10 @@ typedef struct { // Constructor -STATIC mp_obj_t cert_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { +static mp_obj_t cert_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { mp_arg_check_num(n_args, n_kw, 0, 0, false); - mp_obj_cert_t *o = m_new_obj_with_finaliser(mp_obj_cert_t); + mp_obj_cert_t *o = (mp_obj_cert_t *)m_malloc_with_finaliser(sizeof(mp_obj_cert_t)); o->base.type = type; mbedtls_x509_crt_init(&o->mcert); @@ -40,18 +40,18 @@ STATIC mp_obj_t cert_make_new(const mp_obj_type_t *type, size_t n_args, size_t n } // Finalizer -STATIC mp_obj_t cert_del(mp_obj_t self_in) { +static mp_obj_t cert_del(mp_obj_t self_in) { mp_obj_cert_t *self = MP_OBJ_TO_PTR(self_in); mbedtls_x509_crt_free(&self->mcert); return mp_const_none; } -STATIC MP_DEFINE_CONST_FUN_OBJ_1(cert_del_obj, cert_del); +static MP_DEFINE_CONST_FUN_OBJ_1(cert_del_obj, cert_del); // Parse PEM (base64) -STATIC mp_obj_t parse(mp_obj_t self_in, mp_obj_t data_in) +static mp_obj_t parse(mp_obj_t self_in, mp_obj_t data_in) { mp_obj_cert_t *self = MP_OBJ_TO_PTR(self_in); @@ -62,10 +62,10 @@ STATIC mp_obj_t parse(mp_obj_t self_in, mp_obj_t data_in) return mp_const_none; } -STATIC MP_DEFINE_CONST_FUN_OBJ_2(parse_obj, parse); +static MP_DEFINE_CONST_FUN_OBJ_2(parse_obj, parse); // Verify chain -STATIC mp_obj_t verify_chain(mp_obj_t self_in, mp_obj_t trust_ca_in) +static mp_obj_t verify_chain(mp_obj_t self_in, mp_obj_t trust_ca_in) { // TODO: add ca_crl, profile, etc. mp_obj_cert_t *self = MP_OBJ_TO_PTR(self_in); @@ -87,10 +87,10 @@ STATIC mp_obj_t verify_chain(mp_obj_t self_in, mp_obj_t trust_ca_in) return MP_OBJ_NEW_SMALL_INT(rv); } -STATIC MP_DEFINE_CONST_FUN_OBJ_2(verify_chain_obj, verify_chain); +static MP_DEFINE_CONST_FUN_OBJ_2(verify_chain_obj, verify_chain); // get_ec_pubkey -STATIC mp_obj_t get_ec_pubkey(mp_obj_t self_in) +static mp_obj_t get_ec_pubkey(mp_obj_t self_in) { mp_obj_cert_t *self = MP_OBJ_TO_PTR(self_in); mbedtls_pk_context *pk = &self->mcert.pk; @@ -105,23 +105,22 @@ STATIC mp_obj_t get_ec_pubkey(mp_obj_t self_in) mp_raise_TypeError(MP_ERROR_TEXT("only EC for now")); } - - vstr_t vstr; - vstr_init_len(&vstr, 65); + unsigned char pk_buf[65]; const mbedtls_ecp_keypair *pair = mbedtls_pk_ec(*pk); size_t actual = 0; - CHECK_RESULT(mbedtls_ecp_point_write_binary(&pair->grp, &pair->Q, - MBEDTLS_ECP_PF_UNCOMPRESSED, &actual, (uint8_t *)vstr.buf, vstr.len)); + + CHECK_RESULT(mbedtls_ecp_point_write_binary(&pair->MBEDTLS_PRIVATE(grp), &pair->MBEDTLS_PRIVATE(Q), + MBEDTLS_ECP_PF_UNCOMPRESSED, &actual, pk_buf, 65)); assert(actual == 65); - return mp_obj_new_str_from_vstr(&mp_type_bytes, &vstr); + return mp_obj_new_bytes(pk_buf, 65); } -STATIC MP_DEFINE_CONST_FUN_OBJ_1(get_ec_pubkey_obj, get_ec_pubkey); +static MP_DEFINE_CONST_FUN_OBJ_1(get_ec_pubkey_obj, get_ec_pubkey); // __repr__ -STATIC void cert_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) { +static void cert_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) { (void)kind; mp_obj_cert_t *self = MP_OBJ_TO_PTR(self_in); @@ -132,28 +131,29 @@ STATIC void cert_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_ } -STATIC const mp_rom_map_elem_t cert_locals_dict_table[] = { +static const mp_rom_map_elem_t cert_locals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR___del__), MP_ROM_PTR(&cert_del_obj) }, { MP_ROM_QSTR(MP_QSTR_parse), MP_ROM_PTR(&parse_obj) }, { MP_ROM_QSTR(MP_QSTR_verify_chain), MP_ROM_PTR(&verify_chain_obj) }, { MP_ROM_QSTR(MP_QSTR_get_ec_pubkey), MP_ROM_PTR(&get_ec_pubkey_obj) }, }; -STATIC MP_DEFINE_CONST_DICT(cert_locals_dict, cert_locals_dict_table); - -STATIC const mp_obj_type_t cert_type = { - { &mp_type_type }, - .name = MP_QSTR_x509_cert, - .print = cert_print, - .make_new = cert_make_new, - .locals_dict = (void *)&cert_locals_dict, -}; - -STATIC const mp_rom_map_elem_t globals_table[] = { +static MP_DEFINE_CONST_DICT(cert_locals_dict, cert_locals_dict_table); + +static MP_DEFINE_CONST_OBJ_TYPE( + cert_type, + MP_QSTR_x509_cert, + MP_TYPE_FLAG_NONE, + print, cert_print, + make_new, cert_make_new, + locals_dict, &cert_locals_dict +); + +static const mp_rom_map_elem_t globals_table[] = { { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_cert) }, { MP_ROM_QSTR(MP_QSTR_x509), MP_ROM_PTR(&cert_type) }, }; -STATIC MP_DEFINE_CONST_DICT(mod_globals, globals_table); +static MP_DEFINE_CONST_DICT(mod_globals, globals_table); const mp_obj_module_t mp_module_cert = { .base = { &mp_type_module }, diff --git a/ngu/codecs.c b/ngu/codecs.c index e9868db..d9550bf 100644 --- a/ngu/codecs.c +++ b/ngu/codecs.c @@ -17,7 +17,7 @@ // // Base 32 // -STATIC mp_obj_t c_b32decode(mp_obj_t arg_in) +static mp_obj_t c_b32decode(mp_obj_t arg_in) { const char *arg = mp_obj_str_get_str(arg_in); uint8_t tmp[strlen(arg)+10]; @@ -29,10 +29,10 @@ STATIC mp_obj_t c_b32decode(mp_obj_t arg_in) return mp_obj_new_bytes(tmp, len_out); } -STATIC MP_DEFINE_CONST_FUN_OBJ_1(c_b32decode_obj, c_b32decode); +static MP_DEFINE_CONST_FUN_OBJ_1(c_b32decode_obj, c_b32decode); -STATIC mp_obj_t c_b32encode(mp_obj_t arg_in) { +static mp_obj_t c_b32encode(mp_obj_t arg_in) { mp_buffer_info_t buf; mp_get_buffer_raise(arg_in, &buf, MP_BUFFER_READ); @@ -45,7 +45,7 @@ STATIC mp_obj_t c_b32encode(mp_obj_t arg_in) { return mp_obj_new_str((char *)tmp, len_out); } -STATIC MP_DEFINE_CONST_FUN_OBJ_1(c_b32encode_obj, c_b32encode); +static MP_DEFINE_CONST_FUN_OBJ_1(c_b32encode_obj, c_b32encode); // // Base 58 - always with checksum, never with a particular prefix @@ -59,7 +59,7 @@ bool b58_sha256_impl(void *out, const void *inp, int len) return true; } -STATIC mp_obj_t c_b58decode(mp_obj_t arg_in) +static mp_obj_t c_b58decode(mp_obj_t arg_in) { uint8_t tmp[128]; @@ -70,10 +70,10 @@ STATIC mp_obj_t c_b58decode(mp_obj_t arg_in) return mp_obj_new_bytes(tmp, len_out); } -STATIC MP_DEFINE_CONST_FUN_OBJ_1(c_b58decode_obj, c_b58decode); +static MP_DEFINE_CONST_FUN_OBJ_1(c_b58decode_obj, c_b58decode); -STATIC mp_obj_t c_b58encode(mp_obj_t arg_in) +static mp_obj_t c_b58encode(mp_obj_t arg_in) { mp_buffer_info_t buf; mp_get_buffer_raise(arg_in, &buf, MP_BUFFER_READ); @@ -87,11 +87,11 @@ STATIC mp_obj_t c_b58encode(mp_obj_t arg_in) return mp_obj_new_str(tmp, len_out-1); } -STATIC MP_DEFINE_CONST_FUN_OBJ_1(c_b58encode_obj, c_b58encode); +static MP_DEFINE_CONST_FUN_OBJ_1(c_b58encode_obj, c_b58encode); // Segwit = BECH32(m) -STATIC mp_obj_t c_segwit_encode(mp_obj_t hrp_in, mp_obj_t witver_in, mp_obj_t prog_in) +static mp_obj_t c_segwit_encode(mp_obj_t hrp_in, mp_obj_t witver_in, mp_obj_t prog_in) { const char *hrp = mp_obj_str_get_str(hrp_in); int witver = mp_obj_get_int_truncated(witver_in); @@ -109,10 +109,10 @@ STATIC mp_obj_t c_segwit_encode(mp_obj_t hrp_in, mp_obj_t witver_in, mp_obj_t pr return mp_obj_new_str(tmp, strlen(tmp)); } -STATIC MP_DEFINE_CONST_FUN_OBJ_3(c_segwit_encode_obj, c_segwit_encode); +static MP_DEFINE_CONST_FUN_OBJ_3(c_segwit_encode_obj, c_segwit_encode); -STATIC mp_obj_t c_segwit_decode(mp_obj_t addr_in) +static mp_obj_t c_segwit_decode(mp_obj_t addr_in) { const char *addr = mp_obj_str_get_str(addr_in); @@ -134,11 +134,11 @@ STATIC mp_obj_t c_segwit_decode(mp_obj_t addr_in) return mp_obj_new_tuple(3, rv); } -STATIC MP_DEFINE_CONST_FUN_OBJ_1(c_segwit_decode_obj, c_segwit_decode); +static MP_DEFINE_CONST_FUN_OBJ_1(c_segwit_decode_obj, c_segwit_decode); // BECH32 -STATIC mp_obj_t c_nip19_encode(mp_obj_t hrp_in, mp_obj_t prog_in) +static mp_obj_t c_nip19_encode(mp_obj_t hrp_in, mp_obj_t prog_in) { const char *hrp = mp_obj_str_get_str(hrp_in); @@ -161,10 +161,10 @@ STATIC mp_obj_t c_nip19_encode(mp_obj_t hrp_in, mp_obj_t prog_in) return mp_obj_new_str(tmp, strlen(tmp)); } -STATIC MP_DEFINE_CONST_FUN_OBJ_2(c_nip19_encode_obj, c_nip19_encode); +static MP_DEFINE_CONST_FUN_OBJ_2(c_nip19_encode_obj, c_nip19_encode); -STATIC mp_obj_t c_nip19_decode(mp_obj_t str_in) +static mp_obj_t c_nip19_decode(mp_obj_t str_in) { const char *str = mp_obj_str_get_str(str_in); @@ -184,10 +184,10 @@ STATIC mp_obj_t c_nip19_decode(mp_obj_t str_in) convert_bits(res, &reslen, 8, data, data_len, 5, 0); return mp_obj_new_bytes(res, reslen); } -STATIC MP_DEFINE_CONST_FUN_OBJ_1(c_nip19_decode_obj, c_nip19_decode); +static MP_DEFINE_CONST_FUN_OBJ_1(c_nip19_decode_obj, c_nip19_decode); -STATIC const mp_rom_map_elem_t globals_table[] = { +static const mp_rom_map_elem_t globals_table[] = { { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_codecs) }, { MP_ROM_QSTR(MP_QSTR_b32_encode), MP_ROM_PTR(&c_b32encode_obj) }, @@ -203,7 +203,7 @@ STATIC const mp_rom_map_elem_t globals_table[] = { { MP_ROM_QSTR(MP_QSTR_nip19_decode), MP_ROM_PTR(&c_nip19_decode_obj) }, }; -STATIC MP_DEFINE_CONST_DICT(globals_table_obj, globals_table); +static MP_DEFINE_CONST_DICT(globals_table_obj, globals_table); const mp_obj_module_t mp_module_codecs = { .base = { &mp_type_module }, diff --git a/ngu/ec.c b/ngu/ec.c index 8ee8db9..09706bc 100644 --- a/ngu/ec.c +++ b/ngu/ec.c @@ -14,6 +14,9 @@ #include "mbedtls/ecp.h" #include "mbedtls/ecdsa.h" +#include "mbedtls/md.h" +#include "mbedtls/entropy.h" +#include "mbedtls/ctr_drbg.h" #ifndef MBEDTLS_ECP_C # error "requires MBEDTLS_ECP_C" @@ -32,10 +35,10 @@ typedef struct _mp_obj_curve_t { // Constructor -STATIC mp_obj_t curve_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { +static mp_obj_t curve_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { mp_arg_check_num(n_args, n_kw, 1, 1, false); - mp_obj_curve_t *o = m_new_obj_with_finaliser(mp_obj_curve_t); + mp_obj_curve_t *o = (mp_obj_curve_t *)m_malloc_with_finaliser(sizeof(mp_obj_curve_t)); o->base.type = type; mbedtls_ecp_group_init(&o->grp); @@ -46,18 +49,18 @@ STATIC mp_obj_t curve_make_new(const mp_obj_type_t *type, size_t n_args, size_t } // Finalizer -STATIC mp_obj_t curve_del(mp_obj_t self_in) { +static mp_obj_t curve_del(mp_obj_t self_in) { mp_obj_curve_t *self = MP_OBJ_TO_PTR(self_in); mbedtls_ecp_group_free(&self->grp); return mp_const_none; } -STATIC MP_DEFINE_CONST_FUN_OBJ_1(curve_del_obj, curve_del); +static MP_DEFINE_CONST_FUN_OBJ_1(curve_del_obj, curve_del); // Signing -STATIC mp_obj_t curve_sign(mp_obj_t self_in, mp_obj_t privkey_in, mp_obj_t digest_in) +static mp_obj_t curve_sign(mp_obj_t self_in, mp_obj_t privkey_in, mp_obj_t digest_in) { mp_obj_curve_t *self = MP_OBJ_TO_PTR(self_in); @@ -80,27 +83,36 @@ STATIC mp_obj_t curve_sign(mp_obj_t self_in, mp_obj_t privkey_in, mp_obj_t diges CHECK_RESULT(mbedtls_mpi_read_binary(&privkey, pk_buf.buf, 32)); - CHECK_RESULT(mbedtls_ecdsa_sign_det(&self->grp, &r, &s, &privkey, digest.buf, digest.len, MBEDTLS_MD_SHA256)); + mbedtls_entropy_context entropy; + mbedtls_ctr_drbg_context ctr_drbg; + mbedtls_entropy_init(&entropy); + mbedtls_ctr_drbg_init(&ctr_drbg); + CHECK_RESULT(mbedtls_ctr_drbg_seed(&ctr_drbg, mbedtls_entropy_func, &entropy, NULL, 0)); + CHECK_RESULT(mbedtls_ecdsa_sign_det_ext(&self->grp, &r, &s, &privkey, + digest.buf, digest.len, + MBEDTLS_MD_SHA256, + mbedtls_ctr_drbg_random, &ctr_drbg)); + + mbedtls_ctr_drbg_free(&ctr_drbg); + mbedtls_entropy_free(&entropy); mbedtls_mpi_free(&privkey); // convert (R,S) output pair to 64 bytes - vstr_t vstr; - vstr_init_len(&vstr, 64); + uint8_t result[64]; - uint8_t *result = (uint8_t *)vstr.buf; - CHECK_RESULT(mbedtls_mpi_write_binary(&r, &result[0], 32)); - CHECK_RESULT(mbedtls_mpi_write_binary(&s, &result[32], 32)); + CHECK_RESULT(mbedtls_mpi_write_binary(&r, result, 32)); + CHECK_RESULT(mbedtls_mpi_write_binary(&s, result + 32, 32)); mbedtls_mpi_free(&r); mbedtls_mpi_free(&s); - return mp_obj_new_str_from_vstr(&mp_type_bytes, &vstr); + return mp_obj_new_bytes(result, 64); } -STATIC MP_DEFINE_CONST_FUN_OBJ_3(curve_sign_obj, curve_sign); +static MP_DEFINE_CONST_FUN_OBJ_3(curve_sign_obj, curve_sign); // Verify -STATIC mp_obj_t curve_verify(size_t n_args, const mp_obj_t *args) +static mp_obj_t curve_verify(size_t n_args, const mp_obj_t *args) { mp_obj_curve_t *self = MP_OBJ_TO_PTR(args[0]); mp_obj_t pubkey_in = args[1]; @@ -155,24 +167,25 @@ STATIC mp_obj_t curve_verify(size_t n_args, const mp_obj_t *args) return rv; } -STATIC MP_DEFINE_CONST_FUN_OBJ_VAR(curve_verify_obj, 4, curve_verify); +static MP_DEFINE_CONST_FUN_OBJ_VAR(curve_verify_obj, 4, curve_verify); -STATIC const mp_rom_map_elem_t curve_locals_dict_table[] = { +static const mp_rom_map_elem_t curve_locals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR___del__), MP_ROM_PTR(&curve_del_obj) }, { MP_ROM_QSTR(MP_QSTR_sign), MP_ROM_PTR(&curve_sign_obj) }, { MP_ROM_QSTR(MP_QSTR_verify), MP_ROM_PTR(&curve_verify_obj) }, }; -STATIC MP_DEFINE_CONST_DICT(curve_locals_dict, curve_locals_dict_table); +static MP_DEFINE_CONST_DICT(curve_locals_dict, curve_locals_dict_table); -STATIC const mp_obj_type_t modngu_ec_curve_type = { - { &mp_type_type }, - .name = MP_QSTR_ec_curve, - .make_new = curve_make_new, - .locals_dict = (void *)&curve_locals_dict, -}; +static MP_DEFINE_CONST_OBJ_TYPE( + modngu_ec_curve_type, + MP_QSTR_ec_curve, + MP_TYPE_FLAG_NONE, + make_new, curve_make_new, + locals_dict, &curve_locals_dict +); -STATIC const mp_rom_map_elem_t mp_module_ec_globals_table[] = { +static const mp_rom_map_elem_t mp_module_ec_globals_table[] = { { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_ec) }, { MP_ROM_QSTR(MP_QSTR_curve), MP_ROM_PTR(&modngu_ec_curve_type) }, @@ -192,7 +205,7 @@ STATIC const mp_rom_map_elem_t mp_module_ec_globals_table[] = { }; -STATIC MP_DEFINE_CONST_DICT(mp_module_ec_globals, mp_module_ec_globals_table); +static MP_DEFINE_CONST_DICT(mp_module_ec_globals, mp_module_ec_globals_table); const mp_obj_module_t mp_module_ec = { .base = { &mp_type_module }, diff --git a/ngu/hash.c b/ngu/hash.c index 829bd75..d798b8b 100644 --- a/ngu/hash.c +++ b/ngu/hash.c @@ -42,77 +42,81 @@ void ripemd160(const uint8_t *msg, int msglen, uint8_t digest[20]); // SHA512 // -STATIC mp_obj_t modngu_hash_sha512_update(mp_obj_t self_in, mp_obj_t arg); +static mp_obj_t modngu_hash_sha512_update(mp_obj_t self_in, mp_obj_t arg) { + mp_obj_hash_t *self = MP_OBJ_TO_PTR(self_in); + mp_buffer_info_t bufinfo; + mp_get_buffer_raise(arg, &bufinfo, MP_BUFFER_READ); + +#if MICROPY_SSL_MBEDTLS + mbedtls_sha512_update((mbedtls_sha512_context *)self->state, bufinfo.buf, bufinfo.len); +#else + cf_sha512_update((cf_sha512_context *)self->state, bufinfo.buf, bufinfo.len); +#endif + + return mp_const_none; +} -STATIC mp_obj_t modngu_hash_sha512_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { +static mp_obj_t modngu_hash_sha512_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { mp_arg_check_num(n_args, n_kw, 0, 1, false); + #if MICROPY_SSL_MBEDTLS - mp_obj_hash_t *o = m_new_obj_var(mp_obj_hash_t, char, sizeof(mbedtls_sha512_context)); + // New v1.28 allocation: 4 arguments + correct field name + uintptr_t alignment + size_t n = (sizeof(mbedtls_sha512_context) + sizeof(uintptr_t) - 1) / sizeof(uintptr_t); + mp_obj_hash_t *o = m_new_obj_var(mp_obj_hash_t, state, uintptr_t, n); o->base.type = type; mbedtls_sha512_init((mbedtls_sha512_context *)o->state); - mbedtls_sha512_starts_ret((mbedtls_sha512_context *)o->state, false); + mbedtls_sha512_starts((mbedtls_sha512_context *)o->state, false); #else - mp_obj_hash_t *o = m_new_obj_var(mp_obj_hash_t, char, sizeof(cf_sha512_context)); + // Same pattern for the tinycrypt/cf fallback + size_t n = (sizeof(cf_sha512_context) + sizeof(uintptr_t) - 1) / sizeof(uintptr_t); + mp_obj_hash_t *o = m_new_obj_var(mp_obj_hash_t, state, uintptr_t, n); o->base.type = type; + cf_sha512_init((cf_sha512_context *)o->state); #endif - if(n_args == 1) { + if (n_args == 1) { modngu_hash_sha512_update(MP_OBJ_FROM_PTR(o), args[0]); } return MP_OBJ_FROM_PTR(o); } -STATIC mp_obj_t modngu_hash_sha512_update(mp_obj_t self_in, mp_obj_t arg) { +static mp_obj_t modngu_hash_sha512_digest(mp_obj_t self_in) { mp_obj_hash_t *self = MP_OBJ_TO_PTR(self_in); - mp_buffer_info_t bufinfo; - mp_get_buffer_raise(arg, &bufinfo, MP_BUFFER_READ); -#if MICROPY_SSL_MBEDTLS - mbedtls_sha512_update_ret((mbedtls_sha512_context *)self->state, bufinfo.buf, bufinfo.len); -#else - cf_sha512_update((cf_sha512_context *)self->state, bufinfo.buf, bufinfo.len); -#endif - - return mp_const_none; -} - -STATIC mp_obj_t modngu_hash_sha512_digest(mp_obj_t self_in) { - mp_obj_hash_t *self = MP_OBJ_TO_PTR(self_in); - - vstr_t vstr; - vstr_init_len(&vstr, 64); + uint8_t rv[64]; #if MICROPY_SSL_MBEDTLS - mbedtls_sha512_finish_ret((mbedtls_sha512_context *)self->state, (byte *)vstr.buf); + mbedtls_sha512_finish((mbedtls_sha512_context *)self->state, rv); mbedtls_sha512_free((mbedtls_sha512_context *)self->state); #else - cf_sha512_digest_final((cf_sha512_context *)self->state, (byte *)vstr.buf); + cf_sha512_digest_final((cf_sha512_context *)self->state, rv); #endif - return mp_obj_new_str_from_vstr(&mp_type_bytes, &vstr); + return mp_obj_new_bytes(rv, 64); } -STATIC MP_DEFINE_CONST_FUN_OBJ_2(modngu_hash_sha512_update_obj, modngu_hash_sha512_update); -STATIC MP_DEFINE_CONST_FUN_OBJ_1(modngu_hash_sha512_digest_obj, modngu_hash_sha512_digest); +static MP_DEFINE_CONST_FUN_OBJ_2(modngu_hash_sha512_update_obj, modngu_hash_sha512_update); +static MP_DEFINE_CONST_FUN_OBJ_1(modngu_hash_sha512_digest_obj, modngu_hash_sha512_digest); -STATIC const mp_rom_map_elem_t modngu_hash_sha512_locals_dict_table[] = { +static const mp_rom_map_elem_t modngu_hash_sha512_locals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_update), MP_ROM_PTR(&modngu_hash_sha512_update_obj) }, { MP_ROM_QSTR(MP_QSTR_digest), MP_ROM_PTR(&modngu_hash_sha512_digest_obj) }, }; -STATIC MP_DEFINE_CONST_DICT(modngu_hash_sha512_locals_dict, modngu_hash_sha512_locals_dict_table); +static MP_DEFINE_CONST_DICT(modngu_hash_sha512_locals_dict, modngu_hash_sha512_locals_dict_table); -STATIC const mp_obj_type_t modngu_hash_sha512_type = { - { &mp_type_type }, - .name = MP_QSTR_sha512, - .make_new = modngu_hash_sha512_make_new, - .locals_dict = (void *)&modngu_hash_sha512_locals_dict, -}; +static MP_DEFINE_CONST_OBJ_TYPE( + modngu_hash_sha512_type, + MP_QSTR_sha512, + MP_TYPE_FLAG_NONE, + make_new, modngu_hash_sha512_make_new, + locals_dict, &modngu_hash_sha512_locals_dict +); // Tagged sha256 = SHA256(SHA256(tag)||SHA256(tag)||msg) -STATIC mp_obj_t hm_tagged_sha256(size_t n_args, const mp_obj_t *args) { +static mp_obj_t hm_tagged_sha256(size_t n_args, const mp_obj_t *args) { mp_obj_t tag = args[0]; mp_obj_t msg = args[1]; bool is_tag_hashed = false; @@ -139,80 +143,76 @@ STATIC mp_obj_t hm_tagged_sha256(size_t n_args, const mp_obj_t *args) { memcpy(ser + 32, s0, 32); memcpy(ser + 64, m.buf, m.len); - vstr_t res; - vstr_init_len(&res, 32); - sha256_single(ser, ser_len, (uint8_t *)res.buf); - return mp_obj_new_str_from_vstr(&mp_type_bytes, &res); + uint8_t res[32]; + sha256_single(ser, ser_len, res); + + return mp_obj_new_bytes(res, 32); } -STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(hm_tagged_sha256_obj,2,3, hm_tagged_sha256); +static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(hm_tagged_sha256_obj,2,3, hm_tagged_sha256); // Double sha256 = sha256(sha256('foo').digest()).digest() ... in one step -STATIC mp_obj_t hm_double_sha256(mp_obj_t arg) { +static mp_obj_t hm_double_sha256(mp_obj_t arg) { mp_buffer_info_t inp; mp_get_buffer_raise(arg, &inp, MP_BUFFER_READ); - vstr_t vstr; - vstr_init_len(&vstr, 32); + uint8_t res[32]; - sha256_double(inp.buf, inp.len, (uint8_t *)vstr.buf); + sha256_double(inp.buf, inp.len, res); - return mp_obj_new_str_from_vstr(&mp_type_bytes, &vstr); + return mp_obj_new_bytes(res, 32); } -STATIC MP_DEFINE_CONST_FUN_OBJ_1(hm_double_sha256_obj, hm_double_sha256); +static MP_DEFINE_CONST_FUN_OBJ_1(hm_double_sha256_obj, hm_double_sha256); // single-shot sha256/ripe/etc -STATIC mp_obj_t hm_single_sha256(mp_obj_t arg) { +static mp_obj_t hm_single_sha256(mp_obj_t arg) { mp_buffer_info_t inp; mp_get_buffer_raise(arg, &inp, MP_BUFFER_READ); - vstr_t vstr; - vstr_init_len(&vstr, 32); + uint8_t res[32]; - sha256_single(inp.buf, inp.len, (uint8_t *)vstr.buf); + sha256_single(inp.buf, inp.len, res); - return mp_obj_new_str_from_vstr(&mp_type_bytes, &vstr); + return mp_obj_new_bytes(res, 32); } -STATIC MP_DEFINE_CONST_FUN_OBJ_1(hm_single_sha256_obj, hm_single_sha256); +static MP_DEFINE_CONST_FUN_OBJ_1(hm_single_sha256_obj, hm_single_sha256); -STATIC mp_obj_t hm_single_ripemd160(mp_obj_t arg) { +static mp_obj_t hm_single_ripemd160(mp_obj_t arg) { mp_buffer_info_t inp; mp_get_buffer_raise(arg, &inp, MP_BUFFER_READ); - vstr_t vstr; - vstr_init_len(&vstr, 20); + uint8_t res[20]; #if 0 mbedtls_ripemd160_context ctx; mbedtls_ripemd160_init(&ctx); - mbedtls_ripemd160_starts_ret(&ctx); - mbedtls_ripemd160_update_ret(&ctx, inp.buf, inp.len); - mbedtls_ripemd160_finish_ret(&ctx, (uint8_t *)vstr.buf); + mbedtls_ripemd160_starts(&ctx); + mbedtls_ripemd160_update(&ctx, inp.buf, inp.len); + mbedtls_ripemd160_finish(&ctx, res); mbedtls_ripemd160_free(&ctx); #endif - ripemd160(inp.buf, inp.len, (uint8_t *)vstr.buf); + ripemd160(inp.buf, inp.len, res); - return mp_obj_new_str_from_vstr(&mp_type_bytes, &vstr); + return mp_obj_new_bytes(res, 20); } -STATIC MP_DEFINE_CONST_FUN_OBJ_1(hm_single_ripemd160_obj, hm_single_ripemd160); +static MP_DEFINE_CONST_FUN_OBJ_1(hm_single_ripemd160_obj, hm_single_ripemd160); -STATIC mp_obj_t hm_hash160(mp_obj_t arg) { +static mp_obj_t hm_hash160(mp_obj_t arg) { mp_buffer_info_t inp; mp_get_buffer_raise(arg, &inp, MP_BUFFER_READ); - vstr_t vstr; - vstr_init_len(&vstr, 20); + uint8_t res[20]; - hash160(inp.buf, inp.len, (uint8_t *)vstr.buf); + hash160(inp.buf, inp.len, res); - return mp_obj_new_str_from_vstr(&mp_type_bytes, &vstr); + return mp_obj_new_bytes(res, 20); } -STATIC MP_DEFINE_CONST_FUN_OBJ_1(hm_hash160_obj, hm_hash160); +static MP_DEFINE_CONST_FUN_OBJ_1(hm_hash160_obj, hm_hash160); // Pbkdf2 using sha512 hmac, for use in BIP39=>BIP32 seed -STATIC mp_obj_t pbkdf2_sha512(mp_obj_t pass_in, mp_obj_t salt_in, mp_obj_t rounds_in) { +static mp_obj_t pbkdf2_sha512(mp_obj_t pass_in, mp_obj_t salt_in, mp_obj_t rounds_in) { mp_buffer_info_t pass, salt; mp_get_buffer_raise(pass_in, &pass, MP_BUFFER_READ); mp_get_buffer_raise(salt_in, &salt, MP_BUFFER_READ); @@ -222,10 +222,9 @@ STATIC mp_obj_t pbkdf2_sha512(mp_obj_t pass_in, mp_obj_t salt_in, mp_obj_t round const mbedtls_md_info_t *md_algo = mbedtls_md_info_from_type(MBEDTLS_MD_SHA512); #endif - vstr_t key_out; - vstr_init_len(&key_out, H_SIZE); uint32_t key_len = H_SIZE; - uint8_t *key = (uint8_t *)key_out.buf; + uint8_t key_arr[H_SIZE]; + uint8_t *key = key_arr; // Based on https://github.com/openbsd/src/blob/master/lib/libutil/pkcs5_pbkdf2.c @@ -281,12 +280,12 @@ STATIC mp_obj_t pbkdf2_sha512(mp_obj_t pass_in, mp_obj_t salt_in, mp_obj_t round explicit_bzero(obuf, sizeof(obuf)); */ - return mp_obj_new_str_from_vstr(&mp_type_bytes, &key_out); + return mp_obj_new_bytes(key_arr, H_SIZE); } -STATIC MP_DEFINE_CONST_FUN_OBJ_3(pbkdf2_sha512_obj, pbkdf2_sha512); +static MP_DEFINE_CONST_FUN_OBJ_3(pbkdf2_sha512_obj, pbkdf2_sha512); -STATIC const mp_rom_map_elem_t mp_module_hash_globals_table[] = { +static const mp_rom_map_elem_t mp_module_hash_globals_table[] = { { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_hash) }, { MP_ROM_QSTR(MP_QSTR_sha512), MP_ROM_PTR(&modngu_hash_sha512_type) }, @@ -299,7 +298,7 @@ STATIC const mp_rom_map_elem_t mp_module_hash_globals_table[] = { }; -STATIC MP_DEFINE_CONST_DICT(mp_module_hash_globals, mp_module_hash_globals_table); +static MP_DEFINE_CONST_DICT(mp_module_hash_globals, mp_module_hash_globals_table); const mp_obj_module_t mp_module_hash = { .base = { &mp_type_module }, .globals = (mp_obj_dict_t *)&mp_module_hash_globals, @@ -346,9 +345,9 @@ void sha256_single(const uint8_t *msg, int msglen, uint8_t digest[32]) #if MICROPY_SSL_MBEDTLS mbedtls_sha256_context ctx; mbedtls_sha256_init(&ctx); - mbedtls_sha256_starts_ret(&ctx, 0); - mbedtls_sha256_update_ret(&ctx, msg, msglen); - mbedtls_sha256_finish_ret(&ctx, digest); + mbedtls_sha256_starts(&ctx, 0); + mbedtls_sha256_update(&ctx, msg, msglen); + mbedtls_sha256_finish(&ctx, digest); mbedtls_sha256_free(&ctx); #elif defined(HASH_DATATYPE_8B) // Hardware Accelerated on this board. @@ -396,13 +395,13 @@ void sha256_double(const uint8_t *msg, int msglen, uint8_t digest[32]) // re-used ctx here (slight savings in stack depth) mbedtls_sha256_context ctx; mbedtls_sha256_init(&ctx); - mbedtls_sha256_starts_ret(&ctx, 0); - mbedtls_sha256_update_ret(&ctx, msg, msglen); - mbedtls_sha256_finish_ret(&ctx, digest); + mbedtls_sha256_starts(&ctx, 0); + mbedtls_sha256_update(&ctx, msg, msglen); + mbedtls_sha256_finish(&ctx, digest); - mbedtls_sha256_starts_ret(&ctx, 0); - mbedtls_sha256_update_ret(&ctx, digest, 32); - mbedtls_sha256_finish_ret(&ctx, digest); + mbedtls_sha256_starts(&ctx, 0); + mbedtls_sha256_update(&ctx, digest, 32); + mbedtls_sha256_finish(&ctx, digest); mbedtls_sha256_free(&ctx); #else sha256_single(msg, msglen, digest); diff --git a/ngu/hdnode.c b/ngu/hdnode.c index 7253d59..8cabaea 100644 --- a/ngu/hdnode.c +++ b/ngu/hdnode.c @@ -30,7 +30,7 @@ typedef struct { #endif } mp_obj_hdnode_t; -STATIC const mp_obj_type_t s_hdnode_type; +static const mp_obj_type_t s_hdnode_type; static inline uint8_t *write_be32(uint8_t *p, uint32_t v) { @@ -180,9 +180,9 @@ static uint32_t _calc_my_fp(mp_obj_hdnode_t *self) } // Constructor: makes empty/invalid obj -STATIC mp_obj_t s_hdnode_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { +static mp_obj_t s_hdnode_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { mp_arg_check_num(n_args, n_kw, 0, 0, false); - mp_obj_hdnode_t *o = m_new_obj_with_finaliser(mp_obj_hdnode_t); + mp_obj_hdnode_t *o = (mp_obj_hdnode_t *)m_malloc_with_finaliser(sizeof(mp_obj_hdnode_t)); memset(o, 0, sizeof(mp_obj_hdnode_t)); o->base.type = type; @@ -194,19 +194,19 @@ STATIC mp_obj_t s_hdnode_make_new(const mp_obj_type_t *type, size_t n_args, size // METHODS -STATIC mp_obj_t s_hdnode_copy(mp_obj_t self_in) { +static mp_obj_t s_hdnode_copy(mp_obj_t self_in) { mp_obj_hdnode_t *self = MP_OBJ_TO_PTR(self_in); raise_on_invalid(self); // debatable, but isolates faults faster - mp_obj_hdnode_t *rv = m_new_obj_with_finaliser(mp_obj_hdnode_t); + mp_obj_hdnode_t *rv = (mp_obj_hdnode_t *)m_malloc_with_finaliser(sizeof(mp_obj_hdnode_t)); *rv = *self; rv->base.type = &s_hdnode_type; return MP_OBJ_FROM_PTR(rv); } -STATIC MP_DEFINE_CONST_FUN_OBJ_1(s_hdnode_copy_obj, s_hdnode_copy); +static MP_DEFINE_CONST_FUN_OBJ_1(s_hdnode_copy_obj, s_hdnode_copy); -STATIC mp_obj_t s_hdnode_blank(mp_obj_t self_in) { +static mp_obj_t s_hdnode_blank(mp_obj_t self_in) { mp_obj_hdnode_t *self = MP_OBJ_TO_PTR(self_in); memset(self, 0, sizeof(mp_obj_hdnode_t)); @@ -215,40 +215,29 @@ STATIC mp_obj_t s_hdnode_blank(mp_obj_t self_in) { return MP_OBJ_FROM_PTR(self); } -STATIC MP_DEFINE_CONST_FUN_OBJ_1(s_hdnode_blank_obj, s_hdnode_blank); +static MP_DEFINE_CONST_FUN_OBJ_1(s_hdnode_blank_obj, s_hdnode_blank); -STATIC mp_obj_t s_hdnode_privkey(mp_obj_t self_in) { +static mp_obj_t s_hdnode_privkey(mp_obj_t self_in) { mp_obj_hdnode_t *self = MP_OBJ_TO_PTR(self_in); raise_on_invalid(self); - vstr_t vstr; - vstr_init_len(&vstr, 32); - if(!self->have_private) { mp_raise_ValueError(MP_ERROR_TEXT("no privkey")); } - memcpy(vstr.buf, self->privkey, 32); - return mp_obj_new_str_from_vstr(&mp_type_bytes, &vstr); + return mp_obj_new_bytes(self->privkey, 32); } -STATIC MP_DEFINE_CONST_FUN_OBJ_1(s_hdnode_privkey_obj, s_hdnode_privkey); - +static MP_DEFINE_CONST_FUN_OBJ_1(s_hdnode_privkey_obj, s_hdnode_privkey); -STATIC mp_obj_t s_hdnode_pubkey(mp_obj_t self_in) { +static mp_obj_t s_hdnode_pubkey(mp_obj_t self_in) { mp_obj_hdnode_t *self = MP_OBJ_TO_PTR(self_in); raise_on_invalid(self); - vstr_t vstr; - vstr_init_len(&vstr, 33); - - // 33 bytes of pubkey - memcpy(vstr.buf, self->pubkey, sizeof(self->pubkey)); - - return mp_obj_new_str_from_vstr(&mp_type_bytes, &vstr); + return mp_obj_new_bytes(self->pubkey, 33); } -STATIC MP_DEFINE_CONST_FUN_OBJ_1(s_hdnode_pubkey_obj, s_hdnode_pubkey); +static MP_DEFINE_CONST_FUN_OBJ_1(s_hdnode_pubkey_obj, s_hdnode_pubkey); -STATIC mp_obj_t s_hdnode_addr_help(size_t n_args, const mp_obj_t *args) { +static mp_obj_t s_hdnode_addr_help(size_t n_args, const mp_obj_t *args) { mp_obj_hdnode_t *self = MP_OBJ_TO_PTR(args[0]); raise_on_invalid(self); @@ -270,9 +259,9 @@ STATIC mp_obj_t s_hdnode_addr_help(size_t n_args, const mp_obj_t *args) { } return mp_obj_new_str(tmp, len_out-1); } -STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(s_hdnode_addr_help_obj, 1, 2, s_hdnode_addr_help); +static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(s_hdnode_addr_help_obj, 1, 2, s_hdnode_addr_help); -STATIC mp_obj_t s_hdnode_serialize(mp_obj_t self_in, mp_obj_t version_in, mp_obj_t want_private_in) { +static mp_obj_t s_hdnode_serialize(mp_obj_t self_in, mp_obj_t version_in, mp_obj_t want_private_in) { // output BIP32 bytes // version bytes: uint32 w/ first 4 bytes (giving xpub/Zpub/etc) // private: flag, exporting private key else public part @@ -323,9 +312,9 @@ printf("\n"); return mp_obj_new_str(tmp, len_out-1); } -STATIC MP_DEFINE_CONST_FUN_OBJ_3(s_hdnode_serialize_obj, s_hdnode_serialize); +static MP_DEFINE_CONST_FUN_OBJ_3(s_hdnode_serialize_obj, s_hdnode_serialize); -STATIC mp_obj_t s_hdnode_deserialize(mp_obj_t self_in, mp_obj_t encoded) { +static mp_obj_t s_hdnode_deserialize(mp_obj_t self_in, mp_obj_t encoded) { // deserialize into self, works from base58; returns version observed mp_obj_hdnode_t *self = MP_OBJ_TO_PTR(self_in); @@ -340,9 +329,9 @@ STATIC mp_obj_t s_hdnode_deserialize(mp_obj_t self_in, mp_obj_t encoded) { return hdnode_deserialize_bytes(self, tmp); } -STATIC MP_DEFINE_CONST_FUN_OBJ_2(s_hdnode_deserialize_obj, s_hdnode_deserialize); +static MP_DEFINE_CONST_FUN_OBJ_2(s_hdnode_deserialize_obj, s_hdnode_deserialize); -STATIC mp_obj_t s_hdnode_deser_bytes(mp_obj_t self_in, mp_obj_t bytes) { +static mp_obj_t s_hdnode_deser_bytes(mp_obj_t self_in, mp_obj_t bytes) { // deserialize into self, works from base58; returns version observed mp_obj_hdnode_t *self = MP_OBJ_TO_PTR(self_in); @@ -354,9 +343,9 @@ STATIC mp_obj_t s_hdnode_deser_bytes(mp_obj_t self_in, mp_obj_t bytes) { return hdnode_deserialize_bytes(self, buf.buf); } -STATIC MP_DEFINE_CONST_FUN_OBJ_2(s_hdnode_deser_bytes_obj, s_hdnode_deser_bytes); +static MP_DEFINE_CONST_FUN_OBJ_2(s_hdnode_deser_bytes_obj, s_hdnode_deser_bytes); -STATIC mp_obj_t s_hdnode_from_master(mp_obj_t self_in, mp_obj_t master_secret_in) { +static mp_obj_t s_hdnode_from_master(mp_obj_t self_in, mp_obj_t master_secret_in) { mp_obj_hdnode_t *self = MP_OBJ_TO_PTR(self_in); mp_buffer_info_t buf; @@ -383,9 +372,9 @@ STATIC mp_obj_t s_hdnode_from_master(mp_obj_t self_in, mp_obj_t master_secret_in return MP_OBJ_FROM_PTR(self); } -STATIC MP_DEFINE_CONST_FUN_OBJ_2(s_hdnode_from_master_obj, s_hdnode_from_master); +static MP_DEFINE_CONST_FUN_OBJ_2(s_hdnode_from_master_obj, s_hdnode_from_master); -STATIC mp_obj_t s_hdnode_from_chaincode_privkey(mp_obj_t self_in, mp_obj_t chain_code_in, mp_obj_t privkey_in) { +static mp_obj_t s_hdnode_from_chaincode_privkey(mp_obj_t self_in, mp_obj_t chain_code_in, mp_obj_t privkey_in) { mp_obj_hdnode_t *self = MP_OBJ_TO_PTR(self_in); mp_buffer_info_t cc, pk; @@ -416,10 +405,10 @@ STATIC mp_obj_t s_hdnode_from_chaincode_privkey(mp_obj_t self_in, mp_obj_t chain return MP_OBJ_FROM_PTR(self); } -STATIC MP_DEFINE_CONST_FUN_OBJ_3(s_hdnode_from_chaincode_privkey_obj, s_hdnode_from_chaincode_privkey); +static MP_DEFINE_CONST_FUN_OBJ_3(s_hdnode_from_chaincode_privkey_obj, s_hdnode_from_chaincode_privkey); -STATIC mp_obj_t s_hdnode_from_chaincode_pubkey(mp_obj_t self_in, mp_obj_t chain_code_in, mp_obj_t pubkey_in) { +static mp_obj_t s_hdnode_from_chaincode_pubkey(mp_obj_t self_in, mp_obj_t chain_code_in, mp_obj_t pubkey_in) { mp_obj_hdnode_t *self = MP_OBJ_TO_PTR(self_in); mp_buffer_info_t cc, pk; @@ -452,9 +441,9 @@ STATIC mp_obj_t s_hdnode_from_chaincode_pubkey(mp_obj_t self_in, mp_obj_t chain_ return MP_OBJ_FROM_PTR(self); } -STATIC MP_DEFINE_CONST_FUN_OBJ_3(s_hdnode_from_chaincode_pubkey_obj, s_hdnode_from_chaincode_pubkey); +static MP_DEFINE_CONST_FUN_OBJ_3(s_hdnode_from_chaincode_pubkey_obj, s_hdnode_from_chaincode_pubkey); -STATIC mp_obj_t s_hdnode_censor(mp_obj_t self_in) { +static mp_obj_t s_hdnode_censor(mp_obj_t self_in) { mp_obj_hdnode_t *self = MP_OBJ_TO_PTR(self_in); raise_on_invalid(self); @@ -468,10 +457,10 @@ STATIC mp_obj_t s_hdnode_censor(mp_obj_t self_in) { return MP_OBJ_FROM_PTR(self); } -STATIC MP_DEFINE_CONST_FUN_OBJ_1(s_hdnode_censor_obj, s_hdnode_censor); +static MP_DEFINE_CONST_FUN_OBJ_1(s_hdnode_censor_obj, s_hdnode_censor); -STATIC mp_obj_t s_hdnode_derive(mp_obj_t self_in, mp_obj_t next_child_in, mp_obj_t hard_in) { +static mp_obj_t s_hdnode_derive(mp_obj_t self_in, mp_obj_t next_child_in, mp_obj_t hard_in) { mp_obj_hdnode_t *self = MP_OBJ_TO_PTR(self_in); raise_on_invalid(self); @@ -551,27 +540,27 @@ STATIC mp_obj_t s_hdnode_derive(mp_obj_t self_in, mp_obj_t next_child_in, mp_obj mp_raise_ValueError(MP_ERROR_TEXT("bip32 lottery won")); return 0; // not reached } -STATIC MP_DEFINE_CONST_FUN_OBJ_3(s_hdnode_derive_obj, s_hdnode_derive); +static MP_DEFINE_CONST_FUN_OBJ_3(s_hdnode_derive_obj, s_hdnode_derive); // Accessors -STATIC mp_obj_t s_hdnode_depth(mp_obj_t self_in) { +static mp_obj_t s_hdnode_depth(mp_obj_t self_in) { mp_obj_hdnode_t *self = MP_OBJ_TO_PTR(self_in); raise_on_invalid(self); return MP_OBJ_NEW_SMALL_INT(self->depth); } -STATIC MP_DEFINE_CONST_FUN_OBJ_1(s_hdnode_depth_obj, s_hdnode_depth); +static MP_DEFINE_CONST_FUN_OBJ_1(s_hdnode_depth_obj, s_hdnode_depth); -STATIC mp_obj_t s_hdnode_parent_fp(mp_obj_t self_in) { +static mp_obj_t s_hdnode_parent_fp(mp_obj_t self_in) { mp_obj_hdnode_t *self = MP_OBJ_TO_PTR(self_in); raise_on_invalid(self); return mp_obj_new_int_from_uint(self->parent_fp); } -STATIC MP_DEFINE_CONST_FUN_OBJ_1(s_hdnode_parent_fp_obj, s_hdnode_parent_fp); +static MP_DEFINE_CONST_FUN_OBJ_1(s_hdnode_parent_fp_obj, s_hdnode_parent_fp); -STATIC mp_obj_t s_hdnode_my_fp(mp_obj_t self_in) { +static mp_obj_t s_hdnode_my_fp(mp_obj_t self_in) { mp_obj_hdnode_t *self = MP_OBJ_TO_PTR(self_in); raise_on_invalid(self); @@ -579,9 +568,9 @@ STATIC mp_obj_t s_hdnode_my_fp(mp_obj_t self_in) { return mp_obj_new_int_from_uint(rv); } -STATIC MP_DEFINE_CONST_FUN_OBJ_1(s_hdnode_my_fp_obj, s_hdnode_my_fp); +static MP_DEFINE_CONST_FUN_OBJ_1(s_hdnode_my_fp_obj, s_hdnode_my_fp); -STATIC mp_obj_t s_hdnode_child_number(mp_obj_t self_in) { +static mp_obj_t s_hdnode_child_number(mp_obj_t self_in) { mp_obj_hdnode_t *self = MP_OBJ_TO_PTR(self_in); raise_on_invalid(self); @@ -591,22 +580,18 @@ STATIC mp_obj_t s_hdnode_child_number(mp_obj_t self_in) { }; return mp_obj_new_tuple(2, rv); } -STATIC MP_DEFINE_CONST_FUN_OBJ_1(s_hdnode_child_number_obj, s_hdnode_child_number); +static MP_DEFINE_CONST_FUN_OBJ_1(s_hdnode_child_number_obj, s_hdnode_child_number); -STATIC mp_obj_t s_hdnode_chain_code(mp_obj_t self_in) { +static mp_obj_t s_hdnode_chain_code(mp_obj_t self_in) { mp_obj_hdnode_t *self = MP_OBJ_TO_PTR(self_in); raise_on_invalid(self); - vstr_t vstr; - vstr_init_len(&vstr, 32); - memcpy(vstr.buf, self->chain_code, 32); - - return mp_obj_new_str_from_vstr(&mp_type_bytes, &vstr); + return mp_obj_new_bytes(self->chain_code, 32); } -STATIC MP_DEFINE_CONST_FUN_OBJ_1(s_hdnode_chain_code_obj, s_hdnode_chain_code); +static MP_DEFINE_CONST_FUN_OBJ_1(s_hdnode_chain_code_obj, s_hdnode_chain_code); #ifdef EXTRA_DEBUG -STATIC void s_hdnode_repr(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) { +static void s_hdnode_repr(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) { (void)kind; mp_obj_hdnode_t *self = MP_OBJ_TO_PTR(self_in); @@ -627,7 +612,7 @@ STATIC void s_hdnode_repr(const mp_print_t *print, mp_obj_t self_in, mp_print_ki // member vars -STATIC const mp_rom_map_elem_t s_hdnode_locals_dict_table[] = { +static const mp_rom_map_elem_t s_hdnode_locals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_privkey), MP_ROM_PTR(&s_hdnode_privkey_obj) }, { MP_ROM_QSTR(MP_QSTR_pubkey), MP_ROM_PTR(&s_hdnode_pubkey_obj) }, { MP_ROM_QSTR(MP_QSTR_serialize), MP_ROM_PTR(&s_hdnode_serialize_obj) }, @@ -651,26 +636,27 @@ STATIC const mp_rom_map_elem_t s_hdnode_locals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_blank), MP_ROM_PTR(&s_hdnode_blank_obj) }, { MP_ROM_QSTR(MP_QSTR___del__), MP_ROM_PTR(&s_hdnode_blank_obj) }, }; -STATIC MP_DEFINE_CONST_DICT(s_hdnode_locals_dict, s_hdnode_locals_dict_table); +static MP_DEFINE_CONST_DICT(s_hdnode_locals_dict, s_hdnode_locals_dict_table); // class: HDNode -STATIC const mp_obj_type_t s_hdnode_type = { - { &mp_type_type }, - .name = MP_QSTR_HDNode, - .make_new = s_hdnode_make_new, +static MP_DEFINE_CONST_OBJ_TYPE( + s_hdnode_type, + MP_QSTR_HDNode, + MP_TYPE_FLAG_NONE, #ifdef EXTRA_DEBUG - .print = s_hdnode_repr, + print, s_hdnode_repr, #endif - .locals_dict = (void *)&s_hdnode_locals_dict, -}; + make_new, s_hdnode_make_new, + locals_dict, &s_hdnode_locals_dict +); -STATIC const mp_rom_map_elem_t globals_table[] = { +static const mp_rom_map_elem_t globals_table[] = { { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_hdnode) }, { MP_ROM_QSTR(MP_QSTR_HDNode), MP_ROM_PTR(&s_hdnode_type) }, }; -STATIC MP_DEFINE_CONST_DICT(globals_table_obj, globals_table); +static MP_DEFINE_CONST_DICT(globals_table_obj, globals_table); const mp_obj_module_t mp_module_hdnode = { .base = { &mp_type_module }, diff --git a/ngu/hm.c b/ngu/hm.c index c1196a8..bc757e8 100644 --- a/ngu/hm.c +++ b/ngu/hm.c @@ -24,14 +24,13 @@ # include "cifra/sha3.h" #endif -STATIC mp_obj_t hmac_X(int md_size, mp_obj_t key_in, mp_obj_t msg_in) +static mp_obj_t hmac_X(int md_size, mp_obj_t key_in, mp_obj_t msg_in) { mp_buffer_info_t key, msg; mp_get_buffer_raise(key_in, &key, MP_BUFFER_READ); mp_get_buffer_raise(msg_in, &msg, MP_BUFFER_READ); - vstr_t rv_out; - vstr_init_len(&rv_out, md_size); + uint8_t rv_out[md_size]; #if MICROPY_SSL_MBEDTLS const mbedtls_md_info_t *algo; @@ -50,7 +49,7 @@ STATIC mp_obj_t hmac_X(int md_size, mp_obj_t key_in, mp_obj_t msg_in) mp_raise_ValueError(NULL); } - int x = mbedtls_md_hmac(algo, key.buf, key.len, msg.buf, msg.len, (uint8_t*)rv_out.buf); + int x = mbedtls_md_hmac(algo, key.buf, key.len, msg.buf, msg.len, rv_out); if(x) { mp_raise_msg(&mp_type_RuntimeError, MP_ERROR_TEXT("mbedtls_md_hmac")); @@ -72,32 +71,32 @@ STATIC mp_obj_t hmac_X(int md_size, mp_obj_t key_in, mp_obj_t msg_in) default: mp_raise_ValueError(NULL); } - cf_hmac(key.buf, key.len, msg.buf, msg.len, (uint8_t*)rv_out.buf, algo); + cf_hmac(key.buf, key.len, msg.buf, msg.len, rv_out, algo); #endif - return mp_obj_new_str_from_vstr(&mp_type_bytes, &rv_out); + return mp_obj_new_bytes(rv_out, md_size); } -STATIC mp_obj_t hmac_sha512(mp_obj_t key_in, mp_obj_t msg_in) +static mp_obj_t hmac_sha512(mp_obj_t key_in, mp_obj_t msg_in) { return hmac_X(64, key_in, msg_in); } -STATIC MP_DEFINE_CONST_FUN_OBJ_2(hmac_sha512_obj, hmac_sha512); +static MP_DEFINE_CONST_FUN_OBJ_2(hmac_sha512_obj, hmac_sha512); -STATIC mp_obj_t hmac_sha256(mp_obj_t key_in, mp_obj_t msg_in) +static mp_obj_t hmac_sha256(mp_obj_t key_in, mp_obj_t msg_in) { return hmac_X(32, key_in, msg_in); } -STATIC MP_DEFINE_CONST_FUN_OBJ_2(hmac_sha256_obj, hmac_sha256); +static MP_DEFINE_CONST_FUN_OBJ_2(hmac_sha256_obj, hmac_sha256); -STATIC mp_obj_t hmac_sha1(mp_obj_t key_in, mp_obj_t msg_in) +static mp_obj_t hmac_sha1(mp_obj_t key_in, mp_obj_t msg_in) { return hmac_X(20, key_in, msg_in); } -STATIC MP_DEFINE_CONST_FUN_OBJ_2(hmac_sha1_obj, hmac_sha1); +static MP_DEFINE_CONST_FUN_OBJ_2(hmac_sha1_obj, hmac_sha1); -STATIC const mp_rom_map_elem_t mp_module_hmac_globals_table[] = { +static const mp_rom_map_elem_t mp_module_hmac_globals_table[] = { { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_hmac) }, { MP_ROM_QSTR(MP_QSTR_hmac_sha512), MP_ROM_PTR(&hmac_sha512_obj) }, @@ -105,7 +104,7 @@ STATIC const mp_rom_map_elem_t mp_module_hmac_globals_table[] = { { MP_ROM_QSTR(MP_QSTR_hmac_sha1), MP_ROM_PTR(&hmac_sha1_obj) }, }; -STATIC MP_DEFINE_CONST_DICT(mp_module_hmac_globals, mp_module_hmac_globals_table); +static MP_DEFINE_CONST_DICT(mp_module_hmac_globals, mp_module_hmac_globals_table); const mp_obj_module_t mp_module_hmac = { .base = { &mp_type_module }, diff --git a/ngu/k1.c b/ngu/k1.c index 21fcae9..f9363f1 100644 --- a/ngu/k1.c +++ b/ngu/k1.c @@ -7,6 +7,7 @@ // - see test_k1.py // #include "py/runtime.h" +#include "py/objmodule.h" // needed for mp_obj_module_get_globals #include "py/objlist.h" // For list-related functions #include "random.h" #include @@ -19,7 +20,7 @@ #if MICROPY_SSL_MBEDTLS #include "mbedtls/sha256.h" #else -#include "extmod/crypto-algorithms/sha256.h" +#include "lib/crypto-algorithms/sha256.h" #endif typedef struct { @@ -75,16 +76,16 @@ typedef struct { } mp_obj_musig_partial_sig_t; -STATIC const mp_obj_type_t s_pubkey_type; -STATIC const mp_obj_type_t s_xonly_pubkey_type; -STATIC const mp_obj_type_t s_sig_type; -STATIC const mp_obj_type_t s_keypair_type; -STATIC const mp_obj_type_t s_musig_pubnonce_type; -STATIC const mp_obj_type_t s_musig_secnonce_type; -STATIC const mp_obj_type_t s_musig_aggnonce_type; -STATIC const mp_obj_type_t s_musig_keyagg_cache_type; -STATIC const mp_obj_type_t s_musig_session_type; -STATIC const mp_obj_type_t s_musig_partial_sig_type; +static const mp_obj_type_t s_pubkey_type; +static const mp_obj_type_t s_xonly_pubkey_type; +static const mp_obj_type_t s_sig_type; +static const mp_obj_type_t s_keypair_type; +static const mp_obj_type_t s_musig_pubnonce_type; +static const mp_obj_type_t s_musig_secnonce_type; +static const mp_obj_type_t s_musig_aggnonce_type; +static const mp_obj_type_t s_musig_keyagg_cache_type; +static const mp_obj_type_t s_musig_session_type; +static const mp_obj_type_t s_musig_partial_sig_type; // Shared context for all major ops. secp256k1_context *lib_ctx; @@ -144,15 +145,15 @@ void sec_setup_ctx(void) // static error callbacks already in place above, no need to setup } -STATIC mp_obj_t s_ctx_rnd(void) { +static mp_obj_t s_ctx_rnd(void) { sec_setup_ctx(); ctx_randomize(); return mp_const_none; } -STATIC MP_DEFINE_CONST_FUN_OBJ_0(s_ctx_rnd_obj, s_ctx_rnd); +static MP_DEFINE_CONST_FUN_OBJ_0(s_ctx_rnd_obj, s_ctx_rnd); // Constructor for signature -STATIC mp_obj_t s_sig_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { +static mp_obj_t s_sig_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { mp_arg_check_num(n_args, n_kw, 1, 1, false); mp_obj_sig_t *o = m_new_obj(mp_obj_sig_t); @@ -184,7 +185,7 @@ STATIC mp_obj_t s_sig_make_new(const mp_obj_type_t *type, size_t n_args, size_t // Constructor for pubkey -STATIC mp_obj_t s_pubkey_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { +static mp_obj_t s_pubkey_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { mp_arg_check_num(n_args, n_kw, 1, 1, false); mp_obj_pubkey_t *o = m_new_obj(mp_obj_pubkey_t); @@ -203,7 +204,7 @@ STATIC mp_obj_t s_pubkey_make_new(const mp_obj_type_t *type, size_t n_args, size } // Constructor for xonly pubkey -STATIC mp_obj_t s_xonly_pubkey_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { +static mp_obj_t s_xonly_pubkey_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { mp_arg_check_num(n_args, n_kw, 1, 1, false); mp_obj_xonly_pubkey_t *o = m_new_obj(mp_obj_xonly_pubkey_t); @@ -224,11 +225,11 @@ STATIC mp_obj_t s_xonly_pubkey_make_new(const mp_obj_type_t *type, size_t n_args } // output pubkey -STATIC mp_obj_t s_pubkey_to_bytes(size_t n_args, const mp_obj_t *args) { +static mp_obj_t s_pubkey_to_bytes(size_t n_args, const mp_obj_t *args) { mp_obj_pubkey_t *self = MP_OBJ_TO_PTR(args[0]); - vstr_t vstr; - vstr_init_len(&vstr, 66); + size_t outlen = 66; + uint8_t res[outlen]; // default: compressed, but can pass in true to get uncompressed bool compressed = true; @@ -236,18 +237,16 @@ STATIC mp_obj_t s_pubkey_to_bytes(size_t n_args, const mp_obj_t *args) { compressed = !mp_obj_is_true(args[1]); } - size_t outlen = vstr.len; - secp256k1_ec_pubkey_serialize(secp256k1_context_static, (uint8_t *)vstr.buf, &outlen, + secp256k1_ec_pubkey_serialize(secp256k1_context_static, res, &outlen, &self->pubkey, compressed ? SECP256K1_EC_COMPRESSED: SECP256K1_EC_UNCOMPRESSED ); - vstr.len = outlen; - return mp_obj_new_str_from_vstr(&mp_type_bytes, &vstr); + return mp_obj_new_bytes(res, outlen); } -STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(s_pubkey_to_bytes_obj, 1, 2, s_pubkey_to_bytes); +static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(s_pubkey_to_bytes_obj, 1, 2, s_pubkey_to_bytes); -STATIC mp_obj_t s_pubkey_to_xonly(mp_obj_t self_in){ +static mp_obj_t s_pubkey_to_xonly(mp_obj_t self_in){ mp_obj_pubkey_t *self = MP_OBJ_TO_PTR(self_in); mp_obj_xonly_pubkey_t *xonly = m_new_obj(mp_obj_xonly_pubkey_t); @@ -259,31 +258,30 @@ STATIC mp_obj_t s_pubkey_to_xonly(mp_obj_t self_in){ } return MP_OBJ_FROM_PTR(xonly); } -STATIC MP_DEFINE_CONST_FUN_OBJ_1(s_pubkey_to_xonly_obj, s_pubkey_to_xonly); +static MP_DEFINE_CONST_FUN_OBJ_1(s_pubkey_to_xonly_obj, s_pubkey_to_xonly); // output xonly pubkey -STATIC mp_obj_t s_xonly_pubkey_to_bytes(size_t n_args, const mp_obj_t *args) { +static mp_obj_t s_xonly_pubkey_to_bytes(size_t n_args, const mp_obj_t *args) { mp_obj_xonly_pubkey_t *self = MP_OBJ_TO_PTR(args[0]); - vstr_t vstr; - vstr_init_len(&vstr, 32); + uint8_t res[32]; - secp256k1_xonly_pubkey_serialize(secp256k1_context_static, (uint8_t *)vstr.buf, &self->pubkey); + secp256k1_xonly_pubkey_serialize(secp256k1_context_static, res, &self->pubkey); - return mp_obj_new_str_from_vstr(&mp_type_bytes, &vstr); + return mp_obj_new_bytes(res, 32); } -STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(s_xonly_pubkey_to_bytes_obj, 1, 2, s_xonly_pubkey_to_bytes); +static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(s_xonly_pubkey_to_bytes_obj, 1, 2, s_xonly_pubkey_to_bytes); // output xonly pubkey parity -STATIC mp_obj_t s_xonly_pubkey_parity(mp_obj_t self_in) { +static mp_obj_t s_xonly_pubkey_parity(mp_obj_t self_in) { mp_obj_xonly_pubkey_t *self = MP_OBJ_TO_PTR(self_in); return mp_obj_new_int(self->parity); } -STATIC MP_DEFINE_CONST_FUN_OBJ_1(s_xonly_pubkey_parity_obj, s_xonly_pubkey_parity); +static MP_DEFINE_CONST_FUN_OBJ_1(s_xonly_pubkey_parity_obj, s_xonly_pubkey_parity); // add tweak32 to xonly pubkey -STATIC mp_obj_t s_xonly_pubkey_tweak_add(mp_obj_t self_in, mp_obj_t tweak32_in) { +static mp_obj_t s_xonly_pubkey_tweak_add(mp_obj_t self_in, mp_obj_t tweak32_in) { int rc; mp_buffer_info_t tweak32; mp_get_buffer_raise(tweak32_in, &tweak32, MP_BUFFER_READ); @@ -307,29 +305,28 @@ STATIC mp_obj_t s_xonly_pubkey_tweak_add(mp_obj_t self_in, mp_obj_t tweak32_in) return MP_OBJ_FROM_PTR(rv); } -STATIC MP_DEFINE_CONST_FUN_OBJ_2(s_xonly_pubkey_tweak_add_obj, s_xonly_pubkey_tweak_add); +static MP_DEFINE_CONST_FUN_OBJ_2(s_xonly_pubkey_tweak_add_obj, s_xonly_pubkey_tweak_add); // output signature as 65 bytes -STATIC mp_obj_t s_sig_to_bytes(mp_obj_t self_in) { +static mp_obj_t s_sig_to_bytes(mp_obj_t self_in) { mp_obj_sig_t *self = MP_OBJ_TO_PTR(self_in); int recid = 0; - vstr_t vstr; - vstr_init_len(&vstr, 65); - secp256k1_ecdsa_recoverable_signature_serialize_compact(secp256k1_context_static, - ((uint8_t *)vstr.buf)+1, &recid, &self->sig); + uint8_t res[65]; + + secp256k1_ecdsa_recoverable_signature_serialize_compact(secp256k1_context_static, res+1, &recid, &self->sig); // first byte is bitcoin-specific rec id // - always compressed - vstr.buf[0] = 27 + recid + 4; + res[0] = 27 + recid + 4; - return mp_obj_new_str_from_vstr(&mp_type_bytes, &vstr); + return mp_obj_new_bytes(res, 65); } -STATIC MP_DEFINE_CONST_FUN_OBJ_1(s_sig_to_bytes_obj, s_sig_to_bytes); +static MP_DEFINE_CONST_FUN_OBJ_1(s_sig_to_bytes_obj, s_sig_to_bytes); // verify sig (and recovery pubkey) -STATIC mp_obj_t s_sig_verify_recover(mp_obj_t self_in, mp_obj_t digest_in) +static mp_obj_t s_sig_verify_recover(mp_obj_t self_in, mp_obj_t digest_in) { mp_obj_sig_t *self = MP_OBJ_TO_PTR(self_in); @@ -350,10 +347,10 @@ STATIC mp_obj_t s_sig_verify_recover(mp_obj_t self_in, mp_obj_t digest_in) return MP_OBJ_FROM_PTR(rv); } -STATIC MP_DEFINE_CONST_FUN_OBJ_2(s_sig_verify_recover_obj, s_sig_verify_recover); +static MP_DEFINE_CONST_FUN_OBJ_2(s_sig_verify_recover_obj, s_sig_verify_recover); -STATIC mp_obj_t s_sign(mp_obj_t privkey_in, mp_obj_t digest_in, mp_obj_t counter_in) +static mp_obj_t s_sign(mp_obj_t privkey_in, mp_obj_t digest_in, mp_obj_t counter_in) { sec_setup_ctx(); @@ -395,10 +392,10 @@ STATIC mp_obj_t s_sign(mp_obj_t privkey_in, mp_obj_t digest_in, mp_obj_t counter return MP_OBJ_FROM_PTR(rv); } -STATIC MP_DEFINE_CONST_FUN_OBJ_3(s_sign_obj, s_sign); +static MP_DEFINE_CONST_FUN_OBJ_3(s_sign_obj, s_sign); -STATIC mp_obj_t s_verify_schnorr(mp_obj_t compact_sig_in, mp_obj_t digest_in, mp_obj_t xonly_pubkey_in) { +static mp_obj_t s_verify_schnorr(mp_obj_t compact_sig_in, mp_obj_t digest_in, mp_obj_t xonly_pubkey_in) { mp_buffer_info_t compact_sig; mp_get_buffer_raise(compact_sig_in, &compact_sig, MP_BUFFER_READ); if(compact_sig.len != 64) { @@ -422,10 +419,10 @@ STATIC mp_obj_t s_verify_schnorr(mp_obj_t compact_sig_in, mp_obj_t digest_in, mp } return mp_obj_new_int(ok); } -STATIC MP_DEFINE_CONST_FUN_OBJ_3(s_verify_schnorr_obj, s_verify_schnorr); +static MP_DEFINE_CONST_FUN_OBJ_3(s_verify_schnorr_obj, s_verify_schnorr); -STATIC mp_obj_t s_sign_schnorr(mp_obj_t privkey_in, mp_obj_t digest_in, mp_obj_t aux_rand_in) +static mp_obj_t s_sign_schnorr(mp_obj_t privkey_in, mp_obj_t digest_in, mp_obj_t aux_rand_in) { sec_setup_ctx(); @@ -440,13 +437,12 @@ STATIC mp_obj_t s_sign_schnorr(mp_obj_t privkey_in, mp_obj_t digest_in, mp_obj_t mp_raise_ValueError(MP_ERROR_TEXT("aux rand len != 32")); } - vstr_t rv; - vstr_init_len(&rv, 64); + uint8_t rv[64]; int ok; if(mp_obj_get_type(privkey_in) == &s_keypair_type) { mp_obj_keypair_t *keypair = MP_OBJ_TO_PTR(privkey_in); - ok = secp256k1_schnorrsig_sign32(lib_ctx, (uint8_t *)rv.buf, digest.buf, &keypair->keypair, aux_rand.buf); + ok = secp256k1_schnorrsig_sign32(lib_ctx, rv, digest.buf, &keypair->keypair, aux_rand.buf); } else { // typical: raw privkey mp_buffer_info_t privkey; @@ -460,20 +456,20 @@ STATIC mp_obj_t s_sign_schnorr(mp_obj_t privkey_in, mp_obj_t digest_in, mp_obj_t if (!key_ok) { mp_raise_ValueError(MP_ERROR_TEXT("invalid secret")); } - ok = secp256k1_schnorrsig_sign32(lib_ctx, (uint8_t *)rv.buf, digest.buf, &keypair, aux_rand.buf); + ok = secp256k1_schnorrsig_sign32(lib_ctx, rv, digest.buf, &keypair, aux_rand.buf); } if(!ok) { mp_raise_ValueError(MP_ERROR_TEXT("secp256k1_schnorrsig_sign")); } - return mp_obj_new_str_from_vstr(&mp_type_bytes, &rv); + return mp_obj_new_bytes(rv, 64); } -STATIC MP_DEFINE_CONST_FUN_OBJ_3(s_sign_schnorr_obj, s_sign_schnorr); +static MP_DEFINE_CONST_FUN_OBJ_3(s_sign_schnorr_obj, s_sign_schnorr); // KEY PAIRS (private key, with public key computed) // Constructor for keypair -STATIC mp_obj_t s_keypair_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { +static mp_obj_t s_keypair_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { mp_arg_check_num(n_args, n_kw, 0, 1, false); mp_obj_keypair_t *o = m_new_obj(mp_obj_keypair_t); @@ -513,7 +509,7 @@ STATIC mp_obj_t s_keypair_make_new(const mp_obj_type_t *type, size_t n_args, siz // keypair METHODS -STATIC mp_obj_t s_keypair_privkey(mp_obj_t self_in) { +static mp_obj_t s_keypair_privkey(mp_obj_t self_in) { mp_obj_keypair_t *self = MP_OBJ_TO_PTR(self_in); uint8_t seckey[32]; @@ -521,9 +517,9 @@ STATIC mp_obj_t s_keypair_privkey(mp_obj_t self_in) { return mp_obj_new_bytes(seckey, 32); } -STATIC MP_DEFINE_CONST_FUN_OBJ_1(s_keypair_privkey_obj, s_keypair_privkey); +static MP_DEFINE_CONST_FUN_OBJ_1(s_keypair_privkey_obj, s_keypair_privkey); -STATIC mp_obj_t s_keypair_pubkey(mp_obj_t self_in) { +static mp_obj_t s_keypair_pubkey(mp_obj_t self_in) { mp_obj_keypair_t *self = MP_OBJ_TO_PTR(self_in); sec_setup_ctx(); @@ -539,9 +535,9 @@ STATIC mp_obj_t s_keypair_pubkey(mp_obj_t self_in) { return MP_OBJ_FROM_PTR(rv); } -STATIC MP_DEFINE_CONST_FUN_OBJ_1(s_keypair_pubkey_obj, s_keypair_pubkey); +static MP_DEFINE_CONST_FUN_OBJ_1(s_keypair_pubkey_obj, s_keypair_pubkey); -STATIC mp_obj_t s_keypair_xonly_pubkey(mp_obj_t self_in) { +static mp_obj_t s_keypair_xonly_pubkey(mp_obj_t self_in) { mp_obj_keypair_t *self = MP_OBJ_TO_PTR(self_in); sec_setup_ctx(); @@ -557,9 +553,9 @@ STATIC mp_obj_t s_keypair_xonly_pubkey(mp_obj_t self_in) { return MP_OBJ_FROM_PTR(rv); } -STATIC MP_DEFINE_CONST_FUN_OBJ_1(s_keypair_xonly_pubkey_obj, s_keypair_xonly_pubkey); +static MP_DEFINE_CONST_FUN_OBJ_1(s_keypair_xonly_pubkey_obj, s_keypair_xonly_pubkey); -STATIC mp_obj_t s_keypair_xonly_tweak_add(mp_obj_t self_in, mp_obj_t tweak32_in) { +static mp_obj_t s_keypair_xonly_tweak_add(mp_obj_t self_in, mp_obj_t tweak32_in) { // Tweak a keypair by adding tweak32 to the secret key and updating the public // key accordingly. mp_buffer_info_t tweak32; @@ -590,7 +586,7 @@ STATIC mp_obj_t s_keypair_xonly_tweak_add(mp_obj_t self_in, mp_obj_t tweak32_in) return MP_OBJ_FROM_PTR(rv); } -STATIC MP_DEFINE_CONST_FUN_OBJ_2(s_keypair_xonly_tweak_add_obj, s_keypair_xonly_tweak_add); +static MP_DEFINE_CONST_FUN_OBJ_2(s_keypair_xonly_tweak_add_obj, s_keypair_xonly_tweak_add); static int _my_ecdh_hash(uint8_t *output, const uint8_t *x32, const uint8_t *y32, void *data) { (void)data; @@ -600,10 +596,10 @@ static int _my_ecdh_hash(uint8_t *output, const uint8_t *x32, const uint8_t *y32 mbedtls_sha256_context ctx; mbedtls_sha256_init(&ctx); - mbedtls_sha256_starts_ret(&ctx, 0); - mbedtls_sha256_update_ret(&ctx, x32, 32); - mbedtls_sha256_update_ret(&ctx, y32, 32); - mbedtls_sha256_finish_ret(&ctx, output); + mbedtls_sha256_starts(&ctx, 0); + mbedtls_sha256_update(&ctx, x32, 32); + mbedtls_sha256_update(&ctx, y32, 32); + mbedtls_sha256_finish(&ctx, output); mbedtls_sha256_free(&ctx); #else @@ -618,7 +614,7 @@ static int _my_ecdh_hash(uint8_t *output, const uint8_t *x32, const uint8_t *y32 return 1; } -STATIC mp_obj_t s_keypair_ecdh_multiply(mp_obj_t self_in, mp_obj_t other_point_in) { +static mp_obj_t s_keypair_ecdh_multiply(mp_obj_t self_in, mp_obj_t other_point_in) { mp_obj_keypair_t *self = MP_OBJ_TO_PTR(self_in); // returns sha256(pubkey64(privkey * other_pubkey_point)) @@ -636,22 +632,21 @@ STATIC mp_obj_t s_keypair_ecdh_multiply(mp_obj_t self_in, mp_obj_t other_point_i uint8_t seckey[32]; secp256k1_keypair_sec(lib_ctx, seckey, &self->keypair); - vstr_t rv; - vstr_init_len(&rv, 32); + uint8_t rv[32]; - ok = secp256k1_ecdh(lib_ctx, (uint8_t *)rv.buf, &other_point, seckey, _my_ecdh_hash, NULL); + ok = secp256k1_ecdh(lib_ctx, rv, &other_point, seckey, _my_ecdh_hash, NULL); if(!ok) { mp_raise_ValueError(MP_ERROR_TEXT("secp256k1_ecdh")); } - return mp_obj_new_str_from_vstr(&mp_type_bytes, &rv); + return mp_obj_new_bytes(rv, 32); } -STATIC MP_DEFINE_CONST_FUN_OBJ_2(s_keypair_ecdh_multiply_obj, s_keypair_ecdh_multiply); +static MP_DEFINE_CONST_FUN_OBJ_2(s_keypair_ecdh_multiply_obj, s_keypair_ecdh_multiply); // MuSig2 -STATIC mp_obj_t s_musig_keyagg_cache_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { +static mp_obj_t s_musig_keyagg_cache_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { mp_arg_check_num(n_args, n_kw, 0, 0, false); mp_obj_musig_keyagg_cache_t *cache = m_new_obj(mp_obj_musig_keyagg_cache_t); cache->base.type = type; @@ -660,9 +655,9 @@ STATIC mp_obj_t s_musig_keyagg_cache_make_new(const mp_obj_type_t *type, size_t } -STATIC mp_obj_t s_musig_pubkey_agg(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { +static mp_obj_t s_musig_pubkey_agg(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { - STATIC const mp_arg_t allowed_args[] = { + static const mp_arg_t allowed_args[] = { { MP_QSTR_pubkeys, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} }, { MP_QSTR_keyagg_cache, MP_ARG_OBJ, {.u_obj = mp_const_none} }, { MP_QSTR_sort, MP_ARG_OBJ, {.u_obj = mp_const_true} }, @@ -728,7 +723,7 @@ MP_DEFINE_CONST_FUN_OBJ_KW(s_musig_pubkey_agg_obj, 1, s_musig_pubkey_agg); // when non-xonly aggregate pubkey is needed -STATIC mp_obj_t s_musig_pubkey_get(mp_obj_t keyagg_cache_in){ +static mp_obj_t s_musig_pubkey_get(mp_obj_t keyagg_cache_in){ mp_obj_musig_keyagg_cache_t *cache = MP_OBJ_TO_PTR(keyagg_cache_in); @@ -741,10 +736,10 @@ STATIC mp_obj_t s_musig_pubkey_get(mp_obj_t keyagg_cache_in){ } return MP_OBJ_FROM_PTR(pubkey); } -STATIC MP_DEFINE_CONST_FUN_OBJ_1(s_musig_pubkey_get_obj, s_musig_pubkey_get); +static MP_DEFINE_CONST_FUN_OBJ_1(s_musig_pubkey_get_obj, s_musig_pubkey_get); -STATIC mp_obj_t s_musig_pubkey_ec_tweak_add(mp_obj_t keyagg_cache_in, mp_obj_t tweak32_in){ +static mp_obj_t s_musig_pubkey_ec_tweak_add(mp_obj_t keyagg_cache_in, mp_obj_t tweak32_in){ if(mp_obj_get_type(keyagg_cache_in) != &s_musig_keyagg_cache_type) { mp_raise_TypeError(MP_ERROR_TEXT("key aggregation cache type")); @@ -769,10 +764,10 @@ STATIC mp_obj_t s_musig_pubkey_ec_tweak_add(mp_obj_t keyagg_cache_in, mp_obj_t t return MP_OBJ_FROM_PTR(res); } -STATIC MP_DEFINE_CONST_FUN_OBJ_2(s_musig_pubkey_ec_tweak_add_obj, s_musig_pubkey_ec_tweak_add); +static MP_DEFINE_CONST_FUN_OBJ_2(s_musig_pubkey_ec_tweak_add_obj, s_musig_pubkey_ec_tweak_add); -STATIC mp_obj_t s_musig_pubkey_xonly_tweak_add(mp_obj_t keyagg_cache_in, mp_obj_t tweak32_in){ +static mp_obj_t s_musig_pubkey_xonly_tweak_add(mp_obj_t keyagg_cache_in, mp_obj_t tweak32_in){ if(mp_obj_get_type(keyagg_cache_in) != &s_musig_keyagg_cache_type) { mp_raise_TypeError(MP_ERROR_TEXT("key aggregation cache type")); @@ -797,12 +792,12 @@ STATIC mp_obj_t s_musig_pubkey_xonly_tweak_add(mp_obj_t keyagg_cache_in, mp_obj_ return MP_OBJ_FROM_PTR(res); } -STATIC MP_DEFINE_CONST_FUN_OBJ_2(s_musig_pubkey_xonly_tweak_add_obj, s_musig_pubkey_xonly_tweak_add); +static MP_DEFINE_CONST_FUN_OBJ_2(s_musig_pubkey_xonly_tweak_add_obj, s_musig_pubkey_xonly_tweak_add); -STATIC mp_obj_t s_musig_nonce_gen(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { +static mp_obj_t s_musig_nonce_gen(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { - STATIC const mp_arg_t allowed_args[] = { + static const mp_arg_t allowed_args[] = { { MP_QSTR_pubkey, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} }, { MP_QSTR_secrand, MP_ARG_OBJ, {.u_obj = mp_const_none} }, { MP_QSTR_seckey, MP_ARG_OBJ, {.u_obj = mp_const_none} }, @@ -908,21 +903,20 @@ STATIC mp_obj_t s_musig_nonce_gen(size_t n_args, const mp_obj_t *pos_args, mp_ma MP_DEFINE_CONST_FUN_OBJ_KW(s_musig_nonce_gen_obj, 1, s_musig_nonce_gen); -STATIC mp_obj_t s_pubnonce_to_bytes(mp_obj_t pubnonce_in) { +static mp_obj_t s_pubnonce_to_bytes(mp_obj_t pubnonce_in) { mp_obj_musig_pubnonce_t *self = MP_OBJ_TO_PTR(pubnonce_in); - vstr_t vstr; - vstr_init_len(&vstr, 66); + uint8_t rv[66]; - secp256k1_musig_pubnonce_serialize(secp256k1_context_static, (uint8_t *)vstr.buf, &self->pubnonce); + secp256k1_musig_pubnonce_serialize(secp256k1_context_static, rv, &self->pubnonce); - return mp_obj_new_str_from_vstr(&mp_type_bytes, &vstr); + return mp_obj_new_bytes(rv, 66); } -STATIC MP_DEFINE_CONST_FUN_OBJ_1(s_pubnonce_to_bytes_obj, s_pubnonce_to_bytes); +static MP_DEFINE_CONST_FUN_OBJ_1(s_pubnonce_to_bytes_obj, s_pubnonce_to_bytes); // Constructor for pubnonce -STATIC mp_obj_t s_pubnonce_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { +static mp_obj_t s_pubnonce_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { mp_arg_check_num(n_args, n_kw, 1, 1, false); mp_obj_musig_pubnonce_t *self = m_new_obj(mp_obj_musig_pubnonce_t); @@ -944,21 +938,20 @@ STATIC mp_obj_t s_pubnonce_make_new(const mp_obj_type_t *type, size_t n_args, si } -STATIC mp_obj_t s_aggnonce_to_bytes(mp_obj_t aggnonce_in) { +static mp_obj_t s_aggnonce_to_bytes(mp_obj_t aggnonce_in) { mp_obj_musig_aggnonce_t *self = MP_OBJ_TO_PTR(aggnonce_in); - vstr_t vstr; - vstr_init_len(&vstr, 66); + uint8_t rv[66]; - secp256k1_musig_aggnonce_serialize(secp256k1_context_static, (uint8_t *)vstr.buf, &self->aggnonce); + secp256k1_musig_aggnonce_serialize(secp256k1_context_static, rv, &self->aggnonce); - return mp_obj_new_str_from_vstr(&mp_type_bytes, &vstr); + return mp_obj_new_bytes(rv, 66); } -STATIC MP_DEFINE_CONST_FUN_OBJ_1(s_aggnonce_to_bytes_obj, s_aggnonce_to_bytes); +static MP_DEFINE_CONST_FUN_OBJ_1(s_aggnonce_to_bytes_obj, s_aggnonce_to_bytes); // Constructor for aggregate nonce -STATIC mp_obj_t s_aggnonce_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { +static mp_obj_t s_aggnonce_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { mp_arg_check_num(n_args, n_kw, 1, 1, false); mp_obj_musig_aggnonce_t *self = m_new_obj(mp_obj_musig_aggnonce_t); @@ -980,7 +973,7 @@ STATIC mp_obj_t s_aggnonce_make_new(const mp_obj_type_t *type, size_t n_args, si } -STATIC mp_obj_t s_musig_nonce_agg(mp_obj_t pubnonces_in){ +static mp_obj_t s_musig_nonce_agg(mp_obj_t pubnonces_in){ if (!mp_obj_is_type(pubnonces_in, &mp_type_list)) { mp_raise_TypeError(MP_ERROR_TEXT("Expected a list object")); } @@ -1011,10 +1004,10 @@ STATIC mp_obj_t s_musig_nonce_agg(mp_obj_t pubnonces_in){ return MP_OBJ_FROM_PTR(an); } -STATIC MP_DEFINE_CONST_FUN_OBJ_1(s_musig_nonce_agg_obj, s_musig_nonce_agg); +static MP_DEFINE_CONST_FUN_OBJ_1(s_musig_nonce_agg_obj, s_musig_nonce_agg); -STATIC mp_obj_t s_musig_nonce_process(mp_obj_t aggnonce_in, mp_obj_t msg32_in, mp_obj_t keyagg_cache_in){ +static mp_obj_t s_musig_nonce_process(mp_obj_t aggnonce_in, mp_obj_t msg32_in, mp_obj_t keyagg_cache_in){ if(mp_obj_get_type(aggnonce_in) != &s_musig_aggnonce_type) { mp_raise_TypeError(MP_ERROR_TEXT("aggnonce type")); @@ -1046,11 +1039,11 @@ STATIC mp_obj_t s_musig_nonce_process(mp_obj_t aggnonce_in, mp_obj_t msg32_in, m return MP_OBJ_FROM_PTR(session); } -STATIC MP_DEFINE_CONST_FUN_OBJ_3(s_musig_nonce_process_obj, s_musig_nonce_process); +static MP_DEFINE_CONST_FUN_OBJ_3(s_musig_nonce_process_obj, s_musig_nonce_process); // Constructor for musig partial signature -STATIC mp_obj_t s_musig_partial_sig_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { +static mp_obj_t s_musig_partial_sig_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { mp_arg_check_num(n_args, n_kw, 1, 1, false); mp_obj_musig_partial_sig_t *self = m_new_obj(mp_obj_musig_partial_sig_t); @@ -1070,20 +1063,19 @@ STATIC mp_obj_t s_musig_partial_sig_make_new(const mp_obj_type_t *type, size_t n return MP_OBJ_FROM_PTR(self); } -STATIC mp_obj_t s_musig_partial_sig_to_bytes(mp_obj_t part_sig_in) { +static mp_obj_t s_musig_partial_sig_to_bytes(mp_obj_t part_sig_in) { mp_obj_musig_partial_sig_t *self = MP_OBJ_TO_PTR(part_sig_in); - vstr_t vstr; - vstr_init_len(&vstr, 32); + uint8_t rv[32]; - secp256k1_musig_partial_sig_serialize(secp256k1_context_static, (uint8_t *)vstr.buf, &self->sig); + secp256k1_musig_partial_sig_serialize(secp256k1_context_static, rv, &self->sig); - return mp_obj_new_str_from_vstr(&mp_type_bytes, &vstr); + return mp_obj_new_bytes(rv, 32); } -STATIC MP_DEFINE_CONST_FUN_OBJ_1(s_musig_partial_sig_to_bytes_obj, s_musig_partial_sig_to_bytes); +static MP_DEFINE_CONST_FUN_OBJ_1(s_musig_partial_sig_to_bytes_obj, s_musig_partial_sig_to_bytes); -STATIC mp_obj_t s_musig_partial_sign(size_t n_args, const mp_obj_t *args){ +static mp_obj_t s_musig_partial_sign(size_t n_args, const mp_obj_t *args){ if(mp_obj_get_type(args[0]) != &s_musig_secnonce_type) { mp_raise_TypeError(MP_ERROR_TEXT("secnonce type")); @@ -1120,11 +1112,11 @@ STATIC mp_obj_t s_musig_partial_sign(size_t n_args, const mp_obj_t *args){ return MP_OBJ_FROM_PTR(res); } -STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(s_musig_partial_sign_obj, 4, 4, s_musig_partial_sign); +static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(s_musig_partial_sign_obj, 4, 4, s_musig_partial_sign); // verify musig partial sig -STATIC mp_obj_t s_musig_partial_sig_verify(size_t n_args, const mp_obj_t *args) +static mp_obj_t s_musig_partial_sig_verify(size_t n_args, const mp_obj_t *args) { // no need to verify partial sig type as it this is method of the object if(mp_obj_get_type(args[1]) != &s_musig_pubnonce_type) { @@ -1157,10 +1149,10 @@ STATIC mp_obj_t s_musig_partial_sig_verify(size_t n_args, const mp_obj_t *args) return mp_obj_new_int(ok); } -STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(s_musig_partial_sig_verify_obj, 5, 5, s_musig_partial_sig_verify); +static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(s_musig_partial_sig_verify_obj, 5, 5, s_musig_partial_sig_verify); -STATIC mp_obj_t s_musig_partial_sig_agg(mp_obj_t part_sigs_in, mp_obj_t session_in){ +static mp_obj_t s_musig_partial_sig_agg(mp_obj_t part_sigs_in, mp_obj_t session_in){ if (!mp_obj_is_type(part_sigs_in, &mp_type_list)) { mp_raise_TypeError(MP_ERROR_TEXT("Expected a list object")); @@ -1188,142 +1180,150 @@ STATIC mp_obj_t s_musig_partial_sig_agg(mp_obj_t part_sigs_in, mp_obj_t session_ mp_obj_musig_session_t *session = MP_OBJ_TO_PTR(session_in); - vstr_t res; - vstr_init_len(&res, 64); + uint8_t res[64]; - int ok = secp256k1_musig_partial_sig_agg(lib_ctx, (uint8_t *)res.buf, &session->session, ps, len_part_sigs); + int ok = secp256k1_musig_partial_sig_agg(lib_ctx, res, &session->session, ps, len_part_sigs); if (!ok) { mp_raise_ValueError(MP_ERROR_TEXT("secp256k1_musig_partial_sig_agg invalid arguments")); } - return mp_obj_new_str_from_vstr(&mp_type_bytes, &res); + return mp_obj_new_bytes(res, 64); } -STATIC MP_DEFINE_CONST_FUN_OBJ_2(s_musig_partial_sig_agg_obj, s_musig_partial_sig_agg); +static MP_DEFINE_CONST_FUN_OBJ_2(s_musig_partial_sig_agg_obj, s_musig_partial_sig_agg); // sigs and what you can do with them -STATIC const mp_rom_map_elem_t s_sig_locals_dict_table[] = { +static const mp_rom_map_elem_t s_sig_locals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_to_bytes), MP_ROM_PTR(&s_sig_to_bytes_obj) }, { MP_ROM_QSTR(MP_QSTR_verify_recover), MP_ROM_PTR(&s_sig_verify_recover_obj) }, }; -STATIC MP_DEFINE_CONST_DICT(s_sig_locals_dict, s_sig_locals_dict_table); +static MP_DEFINE_CONST_DICT(s_sig_locals_dict, s_sig_locals_dict_table); -STATIC const mp_obj_type_t s_sig_type = { - { &mp_type_type }, - .name = MP_QSTR_secp256k1_sig, - .make_new = s_sig_make_new, - .locals_dict = (void *)&s_sig_locals_dict, -}; +static MP_DEFINE_CONST_OBJ_TYPE( + s_sig_type, + MP_QSTR_secp256k1_sig, + MP_TYPE_FLAG_NONE, + make_new, s_sig_make_new, + locals_dict, &s_sig_locals_dict +); // musig partial signature -STATIC const mp_rom_map_elem_t s_musig_partial_sig_locals_dict_table[] = { +static const mp_rom_map_elem_t s_musig_partial_sig_locals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_to_bytes), MP_ROM_PTR(&s_musig_partial_sig_to_bytes_obj) }, { MP_ROM_QSTR(MP_QSTR_verify), MP_ROM_PTR(&s_musig_partial_sig_verify_obj) }, }; -STATIC MP_DEFINE_CONST_DICT(s_musig_partial_sig_locals_dict, s_musig_partial_sig_locals_dict_table); +static MP_DEFINE_CONST_DICT(s_musig_partial_sig_locals_dict, s_musig_partial_sig_locals_dict_table); -STATIC const mp_obj_type_t s_musig_partial_sig_type = { - { &mp_type_type }, - .name = MP_QSTR_secp256k1_musig_partial_sig, - .make_new = s_musig_partial_sig_make_new, - .locals_dict = (void *)&s_musig_partial_sig_locals_dict, -}; +static MP_DEFINE_CONST_OBJ_TYPE( + s_musig_partial_sig_type, + MP_QSTR_secp256k1_musig_partial_sig, + MP_TYPE_FLAG_NONE, + make_new, s_musig_partial_sig_make_new, + locals_dict, &s_musig_partial_sig_locals_dict +); // pubkeys and what you can do with them -STATIC const mp_rom_map_elem_t s_pubkey_locals_dict_table[] = { +static const mp_rom_map_elem_t s_pubkey_locals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_to_bytes), MP_ROM_PTR(&s_pubkey_to_bytes_obj) }, { MP_ROM_QSTR(MP_QSTR_to_xonly), MP_ROM_PTR(&s_pubkey_to_xonly_obj) }, }; -STATIC MP_DEFINE_CONST_DICT(s_pubkey_locals_dict, s_pubkey_locals_dict_table); +static MP_DEFINE_CONST_DICT(s_pubkey_locals_dict, s_pubkey_locals_dict_table); -STATIC const mp_rom_map_elem_t s_xonly_pubkey_locals_dict_table[] = { +static const mp_rom_map_elem_t s_xonly_pubkey_locals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_to_bytes), MP_ROM_PTR(&s_xonly_pubkey_to_bytes_obj) }, { MP_ROM_QSTR(MP_QSTR_parity), MP_ROM_PTR(&s_xonly_pubkey_parity_obj) }, { MP_ROM_QSTR(MP_QSTR_tweak_add), MP_ROM_PTR(&s_xonly_pubkey_tweak_add_obj) }, }; -STATIC MP_DEFINE_CONST_DICT(s_xonly_pubkey_locals_dict, s_xonly_pubkey_locals_dict_table); - -STATIC const mp_obj_type_t s_pubkey_type = { - { &mp_type_type }, - .name = MP_QSTR_secp256k1_pubkey, - .make_new = s_pubkey_make_new, - .locals_dict = (void *)&s_pubkey_locals_dict, -}; - -STATIC const mp_obj_type_t s_xonly_pubkey_type = { - { &mp_type_type }, - .name = MP_QSTR_secp256k1_xonly_pubkey, - .make_new = s_xonly_pubkey_make_new, - .locals_dict = (void *)&s_xonly_pubkey_locals_dict, -}; +static MP_DEFINE_CONST_DICT(s_xonly_pubkey_locals_dict, s_xonly_pubkey_locals_dict_table); + +static MP_DEFINE_CONST_OBJ_TYPE( + s_pubkey_type, + MP_QSTR_secp256k1_pubkey, + MP_TYPE_FLAG_NONE, + make_new, s_pubkey_make_new, + locals_dict, &s_pubkey_locals_dict +); + +static MP_DEFINE_CONST_OBJ_TYPE( + s_xonly_pubkey_type, + MP_QSTR_secp256k1_xonly_pubkey, + MP_TYPE_FLAG_NONE, + make_new, s_xonly_pubkey_make_new, + locals_dict, &s_xonly_pubkey_locals_dict +); // musig opaque -STATIC const mp_obj_type_t s_musig_session_type = { - { &mp_type_type }, - .name = MP_QSTR_secp256k1_musig_session, -}; +static MP_DEFINE_CONST_OBJ_TYPE( + s_musig_session_type, + MP_QSTR_secp256k1_musig_session, + MP_TYPE_FLAG_NONE +); -STATIC const mp_rom_map_elem_t s_musig_keyagg_cache_locals_dict_table[] = { +static const mp_rom_map_elem_t s_musig_keyagg_cache_locals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_agg_pubkey), MP_ROM_PTR(&s_musig_pubkey_get_obj) }, }; -STATIC MP_DEFINE_CONST_DICT(s_musig_keyagg_cache_locals_dict, s_musig_keyagg_cache_locals_dict_table); +static MP_DEFINE_CONST_DICT(s_musig_keyagg_cache_locals_dict, s_musig_keyagg_cache_locals_dict_table); -STATIC const mp_obj_type_t s_musig_keyagg_cache_type = { - { &mp_type_type }, - .name = MP_QSTR_secp256k1_musig_keyagg_cache, - .make_new = s_musig_keyagg_cache_make_new, - .locals_dict = (void *)&s_musig_keyagg_cache_locals_dict, -}; +static MP_DEFINE_CONST_OBJ_TYPE( + s_musig_keyagg_cache_type, + MP_QSTR_secp256k1_musig_keyagg_cache, + MP_TYPE_FLAG_NONE, + make_new, s_musig_keyagg_cache_make_new, + locals_dict, &s_musig_keyagg_cache_locals_dict +); // musig nonces -STATIC const mp_rom_map_elem_t s_musig_pubnonce_locals_dict_table[] = { +static const mp_rom_map_elem_t s_musig_pubnonce_locals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_to_bytes), MP_ROM_PTR(&s_pubnonce_to_bytes_obj) }, }; -STATIC MP_DEFINE_CONST_DICT(s_musig_pubnonce_locals_dict, s_musig_pubnonce_locals_dict_table); +static MP_DEFINE_CONST_DICT(s_musig_pubnonce_locals_dict, s_musig_pubnonce_locals_dict_table); -STATIC const mp_obj_type_t s_musig_pubnonce_type = { - { &mp_type_type }, - .name = MP_QSTR_secp256k1_musig_pubnonce, - .make_new = s_pubnonce_make_new, - .locals_dict = (void *)&s_musig_pubnonce_locals_dict, -}; +static MP_DEFINE_CONST_OBJ_TYPE( + s_musig_pubnonce_type, + MP_QSTR_secp256k1_musig_pubnonce, + MP_TYPE_FLAG_NONE, + make_new, s_pubnonce_make_new, + locals_dict, &s_musig_pubnonce_locals_dict +); -STATIC const mp_rom_map_elem_t s_musig_aggnonce_locals_dict_table[] = { +static const mp_rom_map_elem_t s_musig_aggnonce_locals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_to_bytes), MP_ROM_PTR(&s_aggnonce_to_bytes_obj) }, }; -STATIC MP_DEFINE_CONST_DICT(s_musig_aggnonce_locals_dict, s_musig_aggnonce_locals_dict_table); - -STATIC const mp_obj_type_t s_musig_aggnonce_type = { - { &mp_type_type }, - .name = MP_QSTR_secp256k1_musig_aggnonce, - .make_new = s_aggnonce_make_new, - .locals_dict = (void *)&s_musig_aggnonce_locals_dict, -}; - -STATIC const mp_obj_type_t s_musig_secnonce_type = { - { &mp_type_type }, - .name = MP_QSTR_secp256k1_musig_secnonce, -}; +static MP_DEFINE_CONST_DICT(s_musig_aggnonce_locals_dict, s_musig_aggnonce_locals_dict_table); + +static MP_DEFINE_CONST_OBJ_TYPE( + s_musig_aggnonce_type, + MP_QSTR_secp256k1_musig_aggnonce, + MP_TYPE_FLAG_NONE, + make_new, s_aggnonce_make_new, + locals_dict, &s_musig_aggnonce_locals_dict +); + +static MP_DEFINE_CONST_OBJ_TYPE( + s_musig_secnonce_type, + MP_QSTR_secp256k1_musig_secnonce, + MP_TYPE_FLAG_NONE +); // privkeys and what you can do with them -STATIC const mp_rom_map_elem_t s_keypair_locals_dict_table[] = { +static const mp_rom_map_elem_t s_keypair_locals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_privkey), MP_ROM_PTR(&s_keypair_privkey_obj) }, { MP_ROM_QSTR(MP_QSTR_pubkey), MP_ROM_PTR(&s_keypair_pubkey_obj) }, { MP_ROM_QSTR(MP_QSTR_xonly_pubkey), MP_ROM_PTR(&s_keypair_xonly_pubkey_obj) }, { MP_ROM_QSTR(MP_QSTR_xonly_tweak_add), MP_ROM_PTR(&s_keypair_xonly_tweak_add_obj) }, { MP_ROM_QSTR(MP_QSTR_ecdh_multiply), MP_ROM_PTR(&s_keypair_ecdh_multiply_obj) }, }; -STATIC MP_DEFINE_CONST_DICT(s_keypair_locals_dict, s_keypair_locals_dict_table); - -STATIC const mp_obj_type_t s_keypair_type = { - { &mp_type_type }, - .name = MP_QSTR_secp256k1_keypair, - .make_new = s_keypair_make_new, - .locals_dict = (void *)&s_keypair_locals_dict, -}; +static MP_DEFINE_CONST_DICT(s_keypair_locals_dict, s_keypair_locals_dict_table); +static MP_DEFINE_CONST_OBJ_TYPE( + s_keypair_type, + MP_QSTR_secp256k1_keypair, + MP_TYPE_FLAG_NONE, + make_new, s_keypair_make_new, + locals_dict, &s_keypair_locals_dict +); -STATIC const mp_rom_map_elem_t globals_table[] = { +static const mp_rom_map_elem_t globals_table[] = { { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_secp256k1) }, { MP_ROM_QSTR(MP_QSTR_pubkey), MP_ROM_PTR(&s_pubkey_type) }, @@ -1349,7 +1349,7 @@ STATIC const mp_rom_map_elem_t globals_table[] = { { MP_ROM_QSTR(MP_QSTR_musig_partial_sig_agg), MP_ROM_PTR(&s_musig_partial_sig_agg_obj) }, }; -STATIC MP_DEFINE_CONST_DICT(globals_table_obj, globals_table); +static MP_DEFINE_CONST_DICT(globals_table_obj, globals_table); const mp_obj_module_t mp_module_secp256k1 = { .base = { &mp_type_module }, diff --git a/ngu/micropython.mk b/ngu/micropython.mk index baf48c8..f86f865 100644 --- a/ngu/micropython.mk +++ b/ngu/micropython.mk @@ -36,7 +36,7 @@ $(BUILD)/hack_lib_cifra.o: @echo HACKING target: $@ $(RM) -f $(CIFRA_OBJS) (cd $(NGU_TOP_DIR)/libs/cifra/src; $(MAKE) CC=$(CC) CFLAGS="$(CIFRA_CFLAGS)" $(CIFRA_PARTS)) - $(CC) -r -o $@ $(CIFRA_CFLAGS) $(CIFRA_OBJS) + $(CC) -r -nostdlib -o $@ $(CIFRA_CFLAGS) $(CIFRA_OBJS) PY_O += $(BUILD)/hack_lib_cifra.o diff --git a/ngu/modngu.c b/ngu/modngu.c index a5090c1..4c7580a 100644 --- a/ngu/modngu.c +++ b/ngu/modngu.c @@ -27,7 +27,7 @@ extern const mp_obj_module_t mp_module_cert; extern const mp_obj_module_t mp_module_aes; #endif -STATIC const mp_rom_map_elem_t mp_module_ngu_globals_table[] = { +static const mp_rom_map_elem_t mp_module_ngu_globals_table[] = { { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_ngu) }, // Constants @@ -48,13 +48,13 @@ STATIC const mp_rom_map_elem_t mp_module_ngu_globals_table[] = { #endif }; -STATIC MP_DEFINE_CONST_DICT(mp_module_ngu_globals, mp_module_ngu_globals_table); +static MP_DEFINE_CONST_DICT(mp_module_ngu_globals, mp_module_ngu_globals_table); const mp_obj_module_t mp_module_ngu = { .base = { &mp_type_module }, .globals = (mp_obj_dict_t *)&mp_module_ngu_globals, }; -MP_REGISTER_MODULE(MP_QSTR_ngu, mp_module_ngu, 1); +MP_REGISTER_MODULE(MP_QSTR_ngu, mp_module_ngu); diff --git a/ngu/ngu_tests/test_cert.py b/ngu/ngu_tests/test_cert.py index 09c93eb..52ff0c3 100644 --- a/ngu/ngu_tests/test_cert.py +++ b/ngu/ngu_tests/test_cert.py @@ -70,7 +70,7 @@ c.parse(unit_cert) #print(repr(c)) assert 'Opendime' in repr(c) -assert 'serialNumber=PEXEVEKLGRIFCICKJIYBCHQC74+cd229fbd8405' in repr(c) +assert 'serialNumber=PEXEVEKLGRIFCICKJIYBCHQC74\+cd229fbd8405' in repr(c) pubkey = c.get_ec_pubkey() assert pubkey[0] == 4 and len(pubkey) == 65 diff --git a/ngu/random.c b/ngu/random.c index 1fc2232..a060c1f 100644 --- a/ngu/random.c +++ b/ngu/random.c @@ -55,7 +55,7 @@ extern uint32_t rng_get(void); static uint32_t yasmarang_pad = 0x0a8ce26f, yasmarang_n = 69, yasmarang_d = 233; static uint8_t yasmarang_dat = 0; -STATIC uint32_t my_yasmarang(void) { +static uint32_t my_yasmarang(void) { yasmarang_pad += yasmarang_dat + yasmarang_d * yasmarang_n; yasmarang_pad = (yasmarang_pad << 3) + (yasmarang_pad >> 29); yasmarang_n = yasmarang_pad | 2; @@ -88,7 +88,7 @@ void my_random_bytes(uint8_t *dest, uint32_t count) } } -STATIC mp_obj_t random_uint32(void) { +static mp_obj_t random_uint32(void) { // full 32-bit values, not 30 CHIP_TRNG_SETUP(); @@ -98,7 +98,7 @@ STATIC mp_obj_t random_uint32(void) { return mp_obj_new_int_from_uint(rv); } -STATIC MP_DEFINE_CONST_FUN_OBJ_0(random_uint32_obj, random_uint32); +static MP_DEFINE_CONST_FUN_OBJ_0(random_uint32_obj, random_uint32); int _bit_length(uint32_t x) { @@ -134,41 +134,40 @@ int _rand_below(int mx) } } -STATIC mp_obj_t random_uniform(mp_obj_t mx_in) { +static mp_obj_t random_uniform(mp_obj_t mx_in) { int mx = mp_obj_get_int_truncated(mx_in); return mp_obj_new_int_from_uint(_rand_below(mx)); } -STATIC MP_DEFINE_CONST_FUN_OBJ_1(random_uniform_obj, random_uniform); +static MP_DEFINE_CONST_FUN_OBJ_1(random_uniform_obj, random_uniform); -STATIC mp_obj_t random_bytes(mp_obj_t count_in) +static mp_obj_t random_bytes(mp_obj_t count_in) { int count = mp_obj_get_int_truncated(count_in); if(count > 4096) { mp_raise_ValueError(MP_ERROR_TEXT("too many")); } - vstr_t rv; - vstr_init_len(&rv, count); + uint8_t rv[count]; - my_random_bytes((uint8_t *)rv.buf, count); + my_random_bytes(rv, count); - return mp_obj_new_str_from_vstr(&mp_type_bytes, &rv); + return mp_obj_new_bytes(rv, count); } -STATIC MP_DEFINE_CONST_FUN_OBJ_1(random_bytes_obj, random_bytes); +static MP_DEFINE_CONST_FUN_OBJ_1(random_bytes_obj, random_bytes); -STATIC mp_obj_t random_reseed(mp_obj_t arg) +static mp_obj_t random_reseed(mp_obj_t arg) { yasmarang_pad = mp_obj_get_int_truncated(arg); return mp_const_none; } -STATIC MP_DEFINE_CONST_FUN_OBJ_1(random_reseed_obj, random_reseed); +static MP_DEFINE_CONST_FUN_OBJ_1(random_reseed_obj, random_reseed); -STATIC const mp_rom_map_elem_t globals_table[] = { +static const mp_rom_map_elem_t globals_table[] = { { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_random) }, { MP_ROM_QSTR(MP_QSTR_bytes), MP_ROM_PTR(&random_bytes_obj) }, @@ -177,7 +176,7 @@ STATIC const mp_rom_map_elem_t globals_table[] = { { MP_ROM_QSTR(MP_QSTR_reseed), MP_ROM_PTR(&random_reseed_obj) }, }; -STATIC MP_DEFINE_CONST_DICT(globals_table_obj, globals_table); +static MP_DEFINE_CONST_DICT(globals_table_obj, globals_table); const mp_obj_module_t mp_module_random = { .base = { &mp_type_module }, diff --git a/var/mbedtls_config_ngu.h b/var/mbedtls_config_ngu.h new file mode 100644 index 0000000..4194861 --- /dev/null +++ b/var/mbedtls_config_ngu.h @@ -0,0 +1,7 @@ +#include "mbedtls/mbedtls_config_port.h" + +#define MBEDTLS_BASE64_C +#define MBEDTLS_PEM_PARSE_C +#define MBEDTLS_HMAC_DRBG_C +#define MBEDTLS_ECDSA_DETERMINISTIC +#define MBEDTLS_ECP_DP_BP256R1_ENABLED diff --git a/var/mpconfigvariant.h b/var/mpconfigvariant.h index bded2a9..7514a3c 100644 --- a/var/mpconfigvariant.h +++ b/var/mpconfigvariant.h @@ -2,3 +2,15 @@ #define MICROPY_PY_BUILTINS_HELP (1) #define MICROPY_HELPER_REPL (1) #define MICROPY_PY_BUILTINS_HELP_MODULES (1) + +#define MICROPY_KBD_EXCEPTION (1) +#define MICROPY_PY_BUILTINS_MEMORYVIEW (1) +#define MICROPY_PY_BINASCII (1) +#define MICROPY_PY_BUILTINS_BYTES_HEX (1) +#define MICROPY_PY_UCTYPES (1) +#define MICROPY_PY_HASHLIB (1) +#define MICROPY_PY_DEFLATE (1) +#define MICROPY_PY_DEFLATE_COMPRESS (1) + +#define MICROPY_FLOAT_IMPL (MICROPY_FLOAT_IMPL_DOUBLE) +#define MICROPY_LONGINT_IMPL (MICROPY_LONGINT_IMPL_MPZ) diff --git a/var/mpconfigvariant.mk b/var/mpconfigvariant.mk index e9983bf..252036c 100644 --- a/var/mpconfigvariant.mk +++ b/var/mpconfigvariant.mk @@ -9,5 +9,8 @@ PROG = ngu-micropython MICROPY_SSL_AXTLS = 0 MICROPY_SSL_MBEDTLS = 1 +MICROPY_PY_BTREE = 0 + +MBEDTLS_CONFIG_FILE = \"$(VARIANT_DIR)/mbedtls_config_ngu.h\"