diff --git a/extmod/modtrezorcrypto/modtrezorcrypto-blake2s.h b/extmod/modtrezorcrypto/modtrezorcrypto-blake2s.h new file mode 100644 index 000000000..427ae3749 --- /dev/null +++ b/extmod/modtrezorcrypto/modtrezorcrypto-blake2s.h @@ -0,0 +1,90 @@ +/* + * Copyright (c) Pavol Rusnak, SatoshiLabs + * + * Licensed under TREZOR License + * see LICENSE file for details + */ + +#include "py/objstr.h" + +#include "trezor-crypto/blake2s.h" + +#define HASH_BLAKE2S_BLOCK_SIZE BLAKE2S_BLOCKBYTES +#define HASH_BLAKE2S_DIGEST_SIZE BLAKE2S_OUTBYTES + +typedef struct _mp_obj_Blake2s_t { + mp_obj_base_t base; + BLAKE2S_CTX ctx; +} mp_obj_Blake2s_t; + +STATIC mp_obj_t mod_TrezorCrypto_Blake2s_update(mp_obj_t self, mp_obj_t data); + +/// def trezor.crypto.hashlib.blake2s(data: bytes=None) -> Blake2s: +/// ''' +/// Creates a hash context object. +/// ''' +STATIC mp_obj_t mod_TrezorCrypto_Blake2s_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_Blake2s_t *o = m_new_obj(mp_obj_Blake2s_t); + o->base.type = type; + blake2s_Init(&(o->ctx), BLAKE2S_OUTBYTES); + // constructor called with bytes/str as first parameter + if (n_args == 1) { + mod_TrezorCrypto_Blake2s_update(MP_OBJ_FROM_PTR(o), args[0]); + } + return MP_OBJ_FROM_PTR(o); +} + +/// def trezor.crypto.hashlib.Blake2s.update(self, data: bytes) -> None: +/// ''' +/// Update the hash context with hashed data. +/// ''' +STATIC mp_obj_t mod_TrezorCrypto_Blake2s_update(mp_obj_t self, mp_obj_t data) { + mp_obj_Blake2s_t *o = MP_OBJ_TO_PTR(self); + mp_buffer_info_t msg; + mp_get_buffer_raise(data, &msg, MP_BUFFER_READ); + if (msg.len > 0) { + blake2s_Update(&(o->ctx), msg.buf, msg.len); + } + return mp_const_none; +} +STATIC MP_DEFINE_CONST_FUN_OBJ_2(mod_TrezorCrypto_Blake2s_update_obj, mod_TrezorCrypto_Blake2s_update); + +/// def trezor.crypto.hashlib.Blake2s.digest(self) -> bytes: +/// ''' +/// Returns the digest of hashed data. +/// ''' +STATIC mp_obj_t mod_TrezorCrypto_Blake2s_digest(mp_obj_t self) { + mp_obj_Blake2s_t *o = MP_OBJ_TO_PTR(self); + vstr_t vstr; + vstr_init_len(&vstr, HASH_BLAKE2S_DIGEST_SIZE); + BLAKE2S_CTX ctx; + memcpy(&ctx, &(o->ctx), sizeof(BLAKE2S_CTX)); + blake2s_Final(&ctx, (uint8_t *)vstr.buf, BLAKE2S_OUTBYTES); + memset(&ctx, 0, sizeof(BLAKE2S_CTX)); + return mp_obj_new_str_from_vstr(&mp_type_bytes, &vstr); +} +STATIC MP_DEFINE_CONST_FUN_OBJ_1(mod_TrezorCrypto_Blake2s_digest_obj, mod_TrezorCrypto_Blake2s_digest); + +STATIC mp_obj_t mod_TrezorCrypto_Blake2s___del__(mp_obj_t self) { + mp_obj_Blake2s_t *o = MP_OBJ_TO_PTR(self); + memset(&(o->ctx), 0, sizeof(BLAKE2S_CTX)); + return mp_const_none; +} +STATIC MP_DEFINE_CONST_FUN_OBJ_1(mod_TrezorCrypto_Blake2s___del___obj, mod_TrezorCrypto_Blake2s___del__); + +STATIC const mp_rom_map_elem_t mod_TrezorCrypto_Blake2s_locals_dict_table[] = { + { MP_ROM_QSTR(MP_QSTR_update), MP_ROM_PTR(&mod_TrezorCrypto_Blake2s_update_obj) }, + { MP_ROM_QSTR(MP_QSTR_digest), MP_ROM_PTR(&mod_TrezorCrypto_Blake2s_digest_obj) }, + { MP_ROM_QSTR(MP_QSTR___del__), MP_ROM_PTR(&mod_TrezorCrypto_Blake2s___del___obj) }, + { MP_ROM_QSTR(MP_QSTR_block_size), MP_OBJ_NEW_SMALL_INT(HASH_BLAKE2S_BLOCK_SIZE) }, + { MP_ROM_QSTR(MP_QSTR_digest_size), MP_OBJ_NEW_SMALL_INT(HASH_BLAKE2S_DIGEST_SIZE) }, +}; +STATIC MP_DEFINE_CONST_DICT(mod_TrezorCrypto_Blake2s_locals_dict, mod_TrezorCrypto_Blake2s_locals_dict_table); + +STATIC const mp_obj_type_t mod_TrezorCrypto_Blake2s_type = { + { &mp_type_type }, + .name = MP_QSTR_Blake2s, + .make_new = mod_TrezorCrypto_Blake2s_make_new, + .locals_dict = (void*)&mod_TrezorCrypto_Blake2s_locals_dict, +}; diff --git a/extmod/modtrezorcrypto/modtrezorcrypto-ripemd160.h b/extmod/modtrezorcrypto/modtrezorcrypto-ripemd160.h index 5f88a0c85..6b495fd9f 100644 --- a/extmod/modtrezorcrypto/modtrezorcrypto-ripemd160.h +++ b/extmod/modtrezorcrypto/modtrezorcrypto-ripemd160.h @@ -9,8 +9,8 @@ #include "trezor-crypto/ripemd160.h" -#define HASH_RIPEMD160_BLOCK_SIZE 64 -#define HASH_RIPEMD160_DIGEST_SIZE 20 +#define HASH_RIPEMD160_BLOCK_SIZE RIPEMD160_BLOCK_LENGTH +#define HASH_RIPEMD160_DIGEST_SIZE RIPEMD160_DIGEST_LENGTH typedef struct _mp_obj_Ripemd160_t { mp_obj_base_t base; diff --git a/extmod/modtrezorcrypto/modtrezorcrypto-sha256.h b/extmod/modtrezorcrypto/modtrezorcrypto-sha256.h index 4a5a4b52c..38cc3c4b6 100644 --- a/extmod/modtrezorcrypto/modtrezorcrypto-sha256.h +++ b/extmod/modtrezorcrypto/modtrezorcrypto-sha256.h @@ -9,8 +9,8 @@ #include "trezor-crypto/sha2.h" -#define HASH_SHA256_BLOCK_SIZE 64 -#define HASH_SHA256_DIGEST_SIZE 32 +#define HASH_SHA256_BLOCK_SIZE SHA256_BLOCK_LENGTH +#define HASH_SHA256_DIGEST_SIZE SHA256_DIGEST_LENGTH typedef struct _mp_obj_Sha256_t { mp_obj_base_t base; diff --git a/extmod/modtrezorcrypto/modtrezorcrypto-sha3-256.h b/extmod/modtrezorcrypto/modtrezorcrypto-sha3-256.h index 2a4026cbb..87ea285c9 100644 --- a/extmod/modtrezorcrypto/modtrezorcrypto-sha3-256.h +++ b/extmod/modtrezorcrypto/modtrezorcrypto-sha3-256.h @@ -10,7 +10,7 @@ #include "trezor-crypto/sha3.h" #define HASH_SHA3_256_BLOCK_SIZE 64 -#define HASH_SHA3_256_DIGEST_SIZE 32 +#define HASH_SHA3_256_DIGEST_SIZE sha3_256_hash_size typedef struct _mp_obj_Sha3_256_t { mp_obj_base_t base; diff --git a/extmod/modtrezorcrypto/modtrezorcrypto-sha3-512.h b/extmod/modtrezorcrypto/modtrezorcrypto-sha3-512.h index 0a66705a3..4074e0210 100644 --- a/extmod/modtrezorcrypto/modtrezorcrypto-sha3-512.h +++ b/extmod/modtrezorcrypto/modtrezorcrypto-sha3-512.h @@ -10,7 +10,7 @@ #include "trezor-crypto/sha3.h" #define HASH_SHA3_512_BLOCK_SIZE 128 -#define HASH_SHA3_512_DIGEST_SIZE 64 +#define HASH_SHA3_512_DIGEST_SIZE sha3_512_hash_size typedef struct _mp_obj_Sha3_512_t { mp_obj_base_t base; diff --git a/extmod/modtrezorcrypto/modtrezorcrypto-sha512.h b/extmod/modtrezorcrypto/modtrezorcrypto-sha512.h index 8de24f471..e8b24ff47 100644 --- a/extmod/modtrezorcrypto/modtrezorcrypto-sha512.h +++ b/extmod/modtrezorcrypto/modtrezorcrypto-sha512.h @@ -9,8 +9,8 @@ #include "trezor-crypto/sha2.h" -#define HASH_SHA512_BLOCK_SIZE 128 -#define HASH_SHA512_DIGEST_SIZE 64 +#define HASH_SHA512_BLOCK_SIZE SHA512_BLOCK_LENGTH +#define HASH_SHA512_DIGEST_SIZE SHA512_DIGEST_LENGTH typedef struct _mp_obj_Sha512_t { mp_obj_base_t base; diff --git a/extmod/modtrezorcrypto/modtrezorcrypto.c b/extmod/modtrezorcrypto/modtrezorcrypto.c index b17962aa0..5187cbebe 100644 --- a/extmod/modtrezorcrypto/modtrezorcrypto.c +++ b/extmod/modtrezorcrypto/modtrezorcrypto.c @@ -18,6 +18,7 @@ #include "modtrezorcrypto-aes.h" #include "modtrezorcrypto-bip32.h" #include "modtrezorcrypto-bip39.h" +#include "modtrezorcrypto-blake2s.h" #include "modtrezorcrypto-curve25519.h" #include "modtrezorcrypto-ed25519.h" #include "modtrezorcrypto-pbkdf2.h" @@ -36,6 +37,7 @@ STATIC const mp_rom_map_elem_t mp_module_TrezorCrypto_globals_table[] = { { MP_ROM_QSTR(MP_QSTR_AES), MP_ROM_PTR(&mod_TrezorCrypto_AES_type) }, { MP_ROM_QSTR(MP_QSTR_Bip32), MP_ROM_PTR(&mod_TrezorCrypto_Bip32_type) }, { MP_ROM_QSTR(MP_QSTR_Bip39), MP_ROM_PTR(&mod_TrezorCrypto_Bip39_type) }, + { MP_ROM_QSTR(MP_QSTR_Blake2s), MP_ROM_PTR(&mod_TrezorCrypto_Blake2s_type) }, { MP_ROM_QSTR(MP_QSTR_Curve25519), MP_ROM_PTR(&mod_TrezorCrypto_Curve25519_type) }, { MP_ROM_QSTR(MP_QSTR_Ed25519), MP_ROM_PTR(&mod_TrezorCrypto_Ed25519_type) }, { MP_ROM_QSTR(MP_QSTR_Nist256p1), MP_ROM_PTR(&mod_TrezorCrypto_Nist256p1_type) }, diff --git a/vendor/micropython b/vendor/micropython index 26553fefd..a90137694 160000 --- a/vendor/micropython +++ b/vendor/micropython @@ -1 +1 @@ -Subproject commit 26553fefd87651e80bf6610f61101977a0d1c5a8 +Subproject commit a9013769469e58ce84456c703f0eea0e2f7e6a57 diff --git a/vendor/trezor-crypto b/vendor/trezor-crypto index fa8772dfe..a91e00563 160000 --- a/vendor/trezor-crypto +++ b/vendor/trezor-crypto @@ -1 +1 @@ -Subproject commit fa8772dfee59f426fda238553f4613bcb7d30636 +Subproject commit a91e005633fa6950a95beae58f49561a29cc0053