1
0
mirror of https://github.com/trezor/trezor-firmware.git synced 2024-11-30 03:18:20 +00:00

core: enable finalizers on extmod classes

This commit is contained in:
matejcik 2020-05-11 15:52:29 +02:00 committed by matejcik
parent 123b07e3ad
commit 050936d0d7
18 changed files with 37 additions and 28 deletions

View File

@ -57,7 +57,7 @@ STATIC mp_obj_t mod_trezorcrypto_AES_make_new(const mp_obj_type_t *type,
size_t n_args, size_t n_kw, size_t n_args, size_t n_kw,
const mp_obj_t *args) { const mp_obj_t *args) {
mp_arg_check_num(n_args, n_kw, 2, 3, false); mp_arg_check_num(n_args, n_kw, 2, 3, false);
mp_obj_AES_t *o = m_new_obj(mp_obj_AES_t); mp_obj_AES_t *o = m_new_obj_with_finaliser(mp_obj_AES_t);
o->base.type = type; o->base.type = type;
o->mode = mp_obj_get_int(args[0]); o->mode = mp_obj_get_int(args[0]);
if (o->mode < ECB || o->mode > CTR) { if (o->mode < ECB || o->mode > CTR) {

View File

@ -123,7 +123,7 @@ STATIC mp_obj_t mod_trezorcrypto_HDNode_make_new(const mp_obj_type_t *type,
mp_raise_ValueError("curve_name is invalid"); mp_raise_ValueError("curve_name is invalid");
} }
mp_obj_HDNode_t *o = m_new_obj(mp_obj_HDNode_t); mp_obj_HDNode_t *o = m_new_obj_with_finaliser(mp_obj_HDNode_t);
o->base.type = type; o->base.type = type;
o->fingerprint = fingerprint; o->fingerprint = fingerprint;
o->hdnode.depth = depth; o->hdnode.depth = depth;
@ -286,7 +286,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_2(mod_trezorcrypto_HDNode_serialize_public_obj,
/// """ /// """
STATIC mp_obj_t mod_trezorcrypto_HDNode_clone(mp_obj_t self) { STATIC mp_obj_t mod_trezorcrypto_HDNode_clone(mp_obj_t self) {
mp_obj_HDNode_t *o = MP_OBJ_TO_PTR(self); mp_obj_HDNode_t *o = MP_OBJ_TO_PTR(self);
mp_obj_HDNode_t *copy = m_new_obj(mp_obj_HDNode_t); mp_obj_HDNode_t *copy = m_new_obj_with_finaliser(mp_obj_HDNode_t);
copy->base.type = &mod_trezorcrypto_HDNode_type; copy->base.type = &mod_trezorcrypto_HDNode_type;
copy->hdnode = o->hdnode; copy->hdnode = o->hdnode;
copy->fingerprint = o->fingerprint; copy->fingerprint = o->fingerprint;
@ -572,7 +572,7 @@ STATIC mp_obj_t mod_trezorcrypto_bip32_from_seed(mp_obj_t seed,
mp_raise_ValueError("Failed to derive the root node"); mp_raise_ValueError("Failed to derive the root node");
} }
mp_obj_HDNode_t *o = m_new_obj(mp_obj_HDNode_t); mp_obj_HDNode_t *o = m_new_obj_with_finaliser(mp_obj_HDNode_t);
o->base.type = &mod_trezorcrypto_HDNode_type; o->base.type = &mod_trezorcrypto_HDNode_type;
o->hdnode = hdnode; o->hdnode = hdnode;
o->fingerprint = 0; o->fingerprint = 0;
@ -615,7 +615,7 @@ STATIC mp_obj_t mod_trezorcrypto_bip32_from_mnemonic_cardano(
mp_raise_ValueError("Invalid mnemonic"); mp_raise_ValueError("Invalid mnemonic");
} }
mp_obj_HDNode_t *o = m_new_obj(mp_obj_HDNode_t); mp_obj_HDNode_t *o = m_new_obj_with_finaliser(mp_obj_HDNode_t);
o->base.type = &mod_trezorcrypto_HDNode_type; o->base.type = &mod_trezorcrypto_HDNode_type;
o->hdnode = hdnode; o->hdnode = hdnode;
o->fingerprint = 0; o->fingerprint = 0;

View File

@ -45,7 +45,7 @@ STATIC mp_obj_t mod_trezorcrypto_Blake256_make_new(const mp_obj_type_t *type,
size_t n_args, size_t n_kw, size_t n_args, size_t n_kw,
const mp_obj_t *args) { const mp_obj_t *args) {
mp_arg_check_num(n_args, n_kw, 0, 1, false); mp_arg_check_num(n_args, n_kw, 0, 1, false);
mp_obj_Blake256_t *o = m_new_obj(mp_obj_Blake256_t); mp_obj_Blake256_t *o = m_new_obj_with_finaliser(mp_obj_Blake256_t);
o->base.type = type; o->base.type = type;
blake256_Init(&(o->ctx)); blake256_Init(&(o->ctx));
// constructor called with bytes/str as first parameter // constructor called with bytes/str as first parameter

View File

@ -85,7 +85,7 @@ STATIC mp_obj_t mod_trezorcrypto_Blake2b_make_new(const mp_obj_type_t *type,
"time"); "time");
} }
mp_obj_Blake2b_t *o = m_new_obj(mp_obj_Blake2b_t); mp_obj_Blake2b_t *o = m_new_obj_with_finaliser(mp_obj_Blake2b_t);
o->base.type = type; o->base.type = type;
int res = 0; int res = 0;

View File

@ -85,7 +85,7 @@ STATIC mp_obj_t mod_trezorcrypto_Blake2s_make_new(const mp_obj_type_t *type,
"time"); "time");
} }
mp_obj_Blake2s_t *o = m_new_obj(mp_obj_Blake2s_t); mp_obj_Blake2s_t *o = m_new_obj_with_finaliser(mp_obj_Blake2s_t);
o->base.type = type; o->base.type = type;
int res = 0; int res = 0;

View File

@ -43,7 +43,8 @@ STATIC mp_obj_t mod_trezorcrypto_ChaCha20Poly1305_make_new(
const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_type_t *type, size_t n_args, size_t n_kw,
const mp_obj_t *args) { const mp_obj_t *args) {
mp_arg_check_num(n_args, n_kw, 2, 2, false); mp_arg_check_num(n_args, n_kw, 2, 2, false);
mp_obj_ChaCha20Poly1305_t *o = m_new_obj(mp_obj_ChaCha20Poly1305_t); mp_obj_ChaCha20Poly1305_t *o =
m_new_obj_with_finaliser(mp_obj_ChaCha20Poly1305_t);
o->base.type = type; o->base.type = type;
mp_buffer_info_t key, nonce; mp_buffer_info_t key, nonce;
mp_get_buffer_raise(args[0], &key, MP_BUFFER_READ); mp_get_buffer_raise(args[0], &key, MP_BUFFER_READ);

View File

@ -49,7 +49,7 @@ STATIC mp_obj_t mod_trezorcrypto_Groestl512_make_new(const mp_obj_type_t *type,
size_t n_args, size_t n_kw, size_t n_args, size_t n_kw,
const mp_obj_t *args) { const mp_obj_t *args) {
mp_arg_check_num(n_args, n_kw, 0, 1, false); mp_arg_check_num(n_args, n_kw, 0, 1, false);
mp_obj_Groestl512_t *o = m_new_obj(mp_obj_Groestl512_t); mp_obj_Groestl512_t *o = m_new_obj_with_finaliser(mp_obj_Groestl512_t);
o->base.type = type; o->base.type = type;
groestl512_Init(&(o->ctx)); groestl512_Init(&(o->ctx));
if (n_args == 1) { if (n_args == 1) {

View File

@ -117,7 +117,7 @@ static uint64_t mp_obj_get_uint64(mp_const_obj_t arg) {
} }
STATIC mp_obj_t mp_obj_new_scalar() { STATIC mp_obj_t mp_obj_new_scalar() {
mp_obj_bignum256modm_t *o = m_new_obj(mp_obj_bignum256modm_t); mp_obj_bignum256modm_t *o = m_new_obj_with_finaliser(mp_obj_bignum256modm_t);
o->base.type = &mod_trezorcrypto_monero_bignum256modm_type; o->base.type = &mod_trezorcrypto_monero_bignum256modm_type;
set256_modm(o->p, 0); set256_modm(o->p, 0);
return MP_OBJ_FROM_PTR(o); return MP_OBJ_FROM_PTR(o);
@ -133,7 +133,7 @@ STATIC mp_obj_t mp_obj_new_scalar_r(mp_obj_t r) {
} }
STATIC mp_obj_t mp_obj_new_ge25519() { STATIC mp_obj_t mp_obj_new_ge25519() {
mp_obj_ge25519_t *o = m_new_obj(mp_obj_ge25519_t); mp_obj_ge25519_t *o = m_new_obj_with_finaliser(mp_obj_ge25519_t);
o->base.type = &mod_trezorcrypto_monero_ge25519_type; o->base.type = &mod_trezorcrypto_monero_ge25519_type;
ge25519_set_neutral(&o->p); ge25519_set_neutral(&o->p);
return MP_OBJ_FROM_PTR(o); return MP_OBJ_FROM_PTR(o);
@ -189,7 +189,7 @@ STATIC mp_obj_t mod_trezorcrypto_monero_ge25519_make_new(
const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_type_t *type, size_t n_args, size_t n_kw,
const mp_obj_t *args) { const mp_obj_t *args) {
mp_arg_check_num(n_args, n_kw, 0, 1, false); mp_arg_check_num(n_args, n_kw, 0, 1, false);
mp_obj_ge25519_t *o = m_new_obj(mp_obj_ge25519_t); mp_obj_ge25519_t *o = m_new_obj_with_finaliser(mp_obj_ge25519_t);
o->base.type = type; o->base.type = type;
if (n_args == 0 || args[0] == mp_const_none) { if (n_args == 0 || args[0] == mp_const_none) {
@ -228,7 +228,7 @@ STATIC mp_obj_t mod_trezorcrypto_monero_bignum256modm_make_new(
const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_type_t *type, size_t n_args, size_t n_kw,
const mp_obj_t *args) { const mp_obj_t *args) {
mp_arg_check_num(n_args, n_kw, 0, 1, false); mp_arg_check_num(n_args, n_kw, 0, 1, false);
mp_obj_bignum256modm_t *o = m_new_obj(mp_obj_bignum256modm_t); mp_obj_bignum256modm_t *o = m_new_obj_with_finaliser(mp_obj_bignum256modm_t);
o->base.type = type; o->base.type = type;
if (n_args == 0 || args[0] == mp_const_none) { if (n_args == 0 || args[0] == mp_const_none) {
@ -286,7 +286,7 @@ STATIC mp_obj_t mod_trezorcrypto_monero_hasher_make_new(
const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_type_t *type, size_t n_args, size_t n_kw,
const mp_obj_t *args) { const mp_obj_t *args) {
mp_arg_check_num(n_args, n_kw, 0, 1, false); mp_arg_check_num(n_args, n_kw, 0, 1, false);
mp_obj_hasher_t *o = m_new_obj(mp_obj_hasher_t); mp_obj_hasher_t *o = m_new_obj_with_finaliser(mp_obj_hasher_t);
o->base.type = type; o->base.type = type;
xmr_hasher_init(&(o->h)); xmr_hasher_init(&(o->h));
@ -1350,7 +1350,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(
STATIC mp_obj_t mod_trezorcrypto_monero_hasher_copy(mp_obj_t self) { STATIC mp_obj_t mod_trezorcrypto_monero_hasher_copy(mp_obj_t self) {
mp_obj_hasher_t *o = MP_OBJ_TO_PTR(self); mp_obj_hasher_t *o = MP_OBJ_TO_PTR(self);
mp_obj_hasher_t *cp = m_new_obj(mp_obj_hasher_t); mp_obj_hasher_t *cp = m_new_obj_with_finaliser(mp_obj_hasher_t);
cp->base.type = o->base.type; cp->base.type = o->base.type;
memcpy(&(cp->h), &(o->h), sizeof(Hasher)); memcpy(&(cp->h), &(o->h), sizeof(Hasher));
return MP_OBJ_FROM_PTR(o); return MP_OBJ_FROM_PTR(o);

View File

@ -59,7 +59,7 @@ STATIC mp_obj_t mod_trezorcrypto_Pbkdf2_make_new(const mp_obj_type_t *type,
size_t n_args, size_t n_kw, size_t n_args, size_t n_kw,
const mp_obj_t *args) { const mp_obj_t *args) {
mp_arg_check_num(n_args, n_kw, 3, 4, false); mp_arg_check_num(n_args, n_kw, 3, 4, false);
mp_obj_Pbkdf2_t *o = m_new_obj(mp_obj_Pbkdf2_t); mp_obj_Pbkdf2_t *o = m_new_obj_with_finaliser(mp_obj_Pbkdf2_t);
o->base.type = type; o->base.type = type;
mp_buffer_info_t password; mp_buffer_info_t password;

View File

@ -40,7 +40,7 @@ STATIC mp_obj_t mod_trezorcrypto_Rfc6979_make_new(const mp_obj_type_t *type,
size_t n_args, size_t n_kw, size_t n_args, size_t n_kw,
const mp_obj_t *args) { const mp_obj_t *args) {
mp_arg_check_num(n_args, n_kw, 2, 2, false); mp_arg_check_num(n_args, n_kw, 2, 2, false);
mp_obj_Rfc6979_t *o = m_new_obj(mp_obj_Rfc6979_t); mp_obj_Rfc6979_t *o = m_new_obj_with_finaliser(mp_obj_Rfc6979_t);
o->base.type = type; o->base.type = type;
mp_buffer_info_t pkey, hash; mp_buffer_info_t pkey, hash;
mp_get_buffer_raise(args[0], &pkey, MP_BUFFER_READ); mp_get_buffer_raise(args[0], &pkey, MP_BUFFER_READ);

View File

@ -45,7 +45,7 @@ STATIC mp_obj_t mod_trezorcrypto_Ripemd160_make_new(const mp_obj_type_t *type,
size_t n_args, size_t n_kw, size_t n_args, size_t n_kw,
const mp_obj_t *args) { const mp_obj_t *args) {
mp_arg_check_num(n_args, n_kw, 0, 1, false); mp_arg_check_num(n_args, n_kw, 0, 1, false);
mp_obj_Ripemd160_t *o = m_new_obj(mp_obj_Ripemd160_t); mp_obj_Ripemd160_t *o = m_new_obj_with_finaliser(mp_obj_Ripemd160_t);
o->base.type = type; o->base.type = type;
ripemd160_Init(&(o->ctx)); ripemd160_Init(&(o->ctx));
// constructor called with bytes/str as first parameter // constructor called with bytes/str as first parameter

View File

@ -18,6 +18,7 @@
*/ */
#include "common.h" #include "common.h"
#include "py/gc.h"
#include "py/objstr.h" #include "py/objstr.h"
#include "vendor/secp256k1-zkp/include/secp256k1.h" #include "vendor/secp256k1-zkp/include/secp256k1.h"
@ -25,6 +26,13 @@
#include "vendor/secp256k1-zkp/include/secp256k1_preallocated.h" #include "vendor/secp256k1-zkp/include/secp256k1_preallocated.h"
#include "vendor/secp256k1-zkp/include/secp256k1_recovery.h" #include "vendor/secp256k1-zkp/include/secp256k1_recovery.h"
// "maybe" = do not fail if allocation fails
// "with_finaliser" = pass true to gc_alloc
// combination of "malloc_maybe" and "malloc_with_finaliser" does not exist in
// malloc.c, so we need to define our own version here.
#define m_new_obj_var_maybe_with_finaliser(obj_type, var_type, var_num) \
gc_alloc(sizeof(obj_type) + sizeof(var_type) * (var_num), true)
void secp256k1_default_illegal_callback_fn(const char *str, void *data) { void secp256k1_default_illegal_callback_fn(const char *str, void *data) {
(void)data; (void)data;
mp_raise_ValueError(str); mp_raise_ValueError(str);
@ -64,7 +72,7 @@ STATIC mp_obj_t mod_trezorcrypto_secp256k1_context_make_new(
const size_t secp256k1_ctx_size = secp256k1_context_preallocated_size( const size_t secp256k1_ctx_size = secp256k1_context_preallocated_size(
SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY); SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY);
mp_obj_secp256k1_context_t *o = m_new_obj_var_maybe( mp_obj_secp256k1_context_t *o = m_new_obj_var_maybe_with_finaliser(
mp_obj_secp256k1_context_t, uint8_t, secp256k1_ctx_size); mp_obj_secp256k1_context_t, uint8_t, secp256k1_ctx_size);
if (!o) { if (!o) {
mp_raise_ValueError("secp256k1_zkp context is too large"); mp_raise_ValueError("secp256k1_zkp context is too large");

View File

@ -45,7 +45,7 @@ STATIC mp_obj_t mod_trezorcrypto_Sha1_make_new(const mp_obj_type_t *type,
size_t n_args, size_t n_kw, size_t n_args, size_t n_kw,
const mp_obj_t *args) { const mp_obj_t *args) {
mp_arg_check_num(n_args, n_kw, 0, 1, false); mp_arg_check_num(n_args, n_kw, 0, 1, false);
mp_obj_Sha1_t *o = m_new_obj(mp_obj_Sha1_t); mp_obj_Sha1_t *o = m_new_obj_with_finaliser(mp_obj_Sha1_t);
o->base.type = type; o->base.type = type;
sha1_Init(&(o->ctx)); sha1_Init(&(o->ctx));
// constructor called with bytes/str as first parameter // constructor called with bytes/str as first parameter

View File

@ -45,7 +45,7 @@ STATIC mp_obj_t mod_trezorcrypto_Sha256_make_new(const mp_obj_type_t *type,
size_t n_args, size_t n_kw, size_t n_args, size_t n_kw,
const mp_obj_t *args) { const mp_obj_t *args) {
mp_arg_check_num(n_args, n_kw, 0, 1, false); mp_arg_check_num(n_args, n_kw, 0, 1, false);
mp_obj_Sha256_t *o = m_new_obj(mp_obj_Sha256_t); mp_obj_Sha256_t *o = m_new_obj_with_finaliser(mp_obj_Sha256_t);
o->base.type = type; o->base.type = type;
sha256_Init(&(o->ctx)); sha256_Init(&(o->ctx));
// constructor called with bytes/str as first parameter // constructor called with bytes/str as first parameter

View File

@ -46,7 +46,7 @@ STATIC mp_obj_t mod_trezorcrypto_Sha3_256_make_new(const mp_obj_type_t *type,
size_t n_args, size_t n_kw, size_t n_args, size_t n_kw,
const mp_obj_t *args) { const mp_obj_t *args) {
mp_arg_check_num(n_args, n_kw, 0, 1, true); mp_arg_check_num(n_args, n_kw, 0, 1, true);
mp_obj_Sha3_256_t *o = m_new_obj(mp_obj_Sha3_256_t); mp_obj_Sha3_256_t *o = m_new_obj_with_finaliser(mp_obj_Sha3_256_t);
o->base.type = type; o->base.type = type;
o->keccak = 0; o->keccak = 0;
sha3_256_Init(&(o->ctx)); sha3_256_Init(&(o->ctx));
@ -111,7 +111,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(mod_trezorcrypto_Sha3_256_digest_obj,
STATIC mp_obj_t mod_trezorcrypto_Sha3_256_copy(size_t n_args, STATIC mp_obj_t mod_trezorcrypto_Sha3_256_copy(size_t n_args,
const mp_obj_t *args) { const mp_obj_t *args) {
mp_obj_Sha3_256_t *o = MP_OBJ_TO_PTR(args[0]); mp_obj_Sha3_256_t *o = MP_OBJ_TO_PTR(args[0]);
mp_obj_Sha3_256_t *out = m_new_obj(mp_obj_Sha3_256_t); mp_obj_Sha3_256_t *out = m_new_obj_with_finaliser(mp_obj_Sha3_256_t);
out->base.type = o->base.type; out->base.type = o->base.type;
out->keccak = o->keccak; out->keccak = o->keccak;
memcpy(&(out->ctx), &(o->ctx), sizeof(SHA3_CTX)); memcpy(&(out->ctx), &(o->ctx), sizeof(SHA3_CTX));

View File

@ -46,7 +46,7 @@ STATIC mp_obj_t mod_trezorcrypto_Sha3_512_make_new(const mp_obj_type_t *type,
size_t n_args, size_t n_kw, size_t n_args, size_t n_kw,
const mp_obj_t *args) { const mp_obj_t *args) {
mp_arg_check_num(n_args, n_kw, 0, 1, true); mp_arg_check_num(n_args, n_kw, 0, 1, true);
mp_obj_Sha3_512_t *o = m_new_obj(mp_obj_Sha3_512_t); mp_obj_Sha3_512_t *o = m_new_obj_with_finaliser(mp_obj_Sha3_512_t);
o->base.type = type; o->base.type = type;
o->keccak = 0; o->keccak = 0;
sha3_512_Init(&(o->ctx)); sha3_512_Init(&(o->ctx));
@ -111,7 +111,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(mod_trezorcrypto_Sha3_512_digest_obj,
STATIC mp_obj_t mod_trezorcrypto_Sha3_512_copy(size_t n_args, STATIC mp_obj_t mod_trezorcrypto_Sha3_512_copy(size_t n_args,
const mp_obj_t *args) { const mp_obj_t *args) {
mp_obj_Sha3_512_t *o = MP_OBJ_TO_PTR(args[0]); mp_obj_Sha3_512_t *o = MP_OBJ_TO_PTR(args[0]);
mp_obj_Sha3_512_t *out = m_new_obj(mp_obj_Sha3_512_t); mp_obj_Sha3_512_t *out = m_new_obj_with_finaliser(mp_obj_Sha3_512_t);
out->base.type = o->base.type; out->base.type = o->base.type;
out->keccak = o->keccak; out->keccak = o->keccak;
memcpy(&(out->ctx), &(o->ctx), sizeof(SHA3_CTX)); memcpy(&(out->ctx), &(o->ctx), sizeof(SHA3_CTX));

View File

@ -45,7 +45,7 @@ STATIC mp_obj_t mod_trezorcrypto_Sha512_make_new(const mp_obj_type_t *type,
size_t n_args, size_t n_kw, size_t n_args, size_t n_kw,
const mp_obj_t *args) { const mp_obj_t *args) {
mp_arg_check_num(n_args, n_kw, 0, 1, false); mp_arg_check_num(n_args, n_kw, 0, 1, false);
mp_obj_Sha512_t *o = m_new_obj(mp_obj_Sha512_t); mp_obj_Sha512_t *o = m_new_obj_with_finaliser(mp_obj_Sha512_t);
o->base.type = type; o->base.type = type;
sha512_Init(&(o->ctx)); sha512_Init(&(o->ctx));
if (n_args == 1) { if (n_args == 1) {

View File

@ -135,7 +135,7 @@ STATIC mp_obj_t mod_trezorio_USB_make_new(const mp_obj_type_t *type,
mp_raise_ValueError("interface is invalid"); mp_raise_ValueError("interface is invalid");
} }
mp_obj_USB_t *o = m_new_obj(mp_obj_USB_t); mp_obj_USB_t *o = m_new_obj_with_finaliser(mp_obj_USB_t);
o->base.type = type; o->base.type = type;
o->state = USB_CLOSED; o->state = USB_CLOSED;