1
0
mirror of https://github.com/trezor/trezor-firmware.git synced 2025-03-03 08:46:05 +00:00

add trezor.crypto.random

This commit is contained in:
Pavol Rusnak 2016-06-01 17:48:32 +02:00
parent 6a647b124d
commit 35b26651ba
No known key found for this signature in database
GPG Key ID: 91F3B339B9A02A3D
7 changed files with 124 additions and 10 deletions

View File

@ -233,6 +233,27 @@ def Sha3_512.digest(self) -> bytes
Returns the digest of hashed data. Returns the digest of hashed data.
####trezor.crypto.random
``` python
def trezor.crypto.random.uniform(n: int) -> int
```
Compute uniform random number from interval 0 ... n - 1
``` python
def trezor.crypto.random.bytes(len: int) -> bytes
```
Generate random bytes sequence of length len
``` python
def trezor.crypto.random.shuffle(data: list) -> None
```
Shuffles items of given list (in-place)
####trezor.crypto.ssss ####trezor.crypto.ssss
``` python ``` python

View File

@ -48,6 +48,10 @@ Syntax used below is a valid Python function declaration with type hints defined
@extmod/modtrezorcrypto/modtrezorcrypto-sha3-512.h @extmod/modtrezorcrypto/modtrezorcrypto-sha3-512.h
####trezor.crypto.random
@extmod/modtrezorcrypto/modtrezorcrypto-random.h
####trezor.crypto.ssss ####trezor.crypto.ssss
@extmod/modtrezorcrypto/modtrezorcrypto-ssss.h @extmod/modtrezorcrypto/modtrezorcrypto-ssss.h

View File

@ -0,0 +1,84 @@
/*
* Copyright (c) Pavol Rusnak, SatoshiLabs
*
* Licensed under TREZOR License
* see LICENSE file for details
*/
#include "py/objstr.h"
#include "rand.h"
typedef struct _mp_obj_Random_t {
mp_obj_base_t base;
} mp_obj_Random_t;
STATIC mp_obj_t mod_TrezorCrypto_Random_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_Random_t *o = m_new_obj(mp_obj_Random_t);
o->base.type = type;
return MP_OBJ_FROM_PTR(o);
}
/// def trezor.crypto.random.uniform(n: int) -> int
///
/// Compute uniform random number from interval 0 ... n - 1
///
STATIC mp_obj_t mod_TrezorCrypto_Random_uniform(mp_obj_t self, mp_obj_t n) {
uint32_t nn = mp_obj_get_int(n);
if (nn == 0) {
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, "Maximum can't be zero"));
}
return MP_OBJ_NEW_SMALL_INT(random_uniform(nn));
}
STATIC MP_DEFINE_CONST_FUN_OBJ_2(mod_TrezorCrypto_Random_uniform_obj, mod_TrezorCrypto_Random_uniform);
/// def trezor.crypto.random.bytes(len: int) -> bytes
///
/// Generate random bytes sequence of length len
///
STATIC mp_obj_t mod_TrezorCrypto_Random_bytes(mp_obj_t self, mp_obj_t len) {
uint32_t l = mp_obj_get_int(len);
vstr_t vstr;
vstr_init_len(&vstr, l);
random_buffer((uint8_t *)vstr.buf, l);
return mp_obj_new_str_from_vstr(&mp_type_bytes, &vstr);
}
STATIC MP_DEFINE_CONST_FUN_OBJ_2(mod_TrezorCrypto_Random_bytes_obj, mod_TrezorCrypto_Random_bytes);
/// def trezor.crypto.random.shuffle(data: list) -> None
///
/// Shuffles items of given list (in-place)
///
STATIC mp_obj_t mod_TrezorCrypto_Random_shuffle(mp_obj_t self, mp_obj_t data) {
mp_uint_t item_cnt;
mp_obj_t *items;
if (MP_OBJ_IS_TYPE(data, &mp_type_list)) {
mp_obj_list_get(data, &item_cnt, &items);
} else {
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, "List expected"));
}
if (item_cnt > 256) {
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, "Maximum list size is 256 items"));
}
random_permute(items, sizeof(mp_obj_t *), item_cnt);
return mp_const_none;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_2(mod_TrezorCrypto_Random_shuffle_obj, mod_TrezorCrypto_Random_shuffle);
STATIC const mp_rom_map_elem_t mod_TrezorCrypto_Random_locals_dict_table[] = {
{ MP_ROM_QSTR(MP_QSTR_uniform), MP_ROM_PTR(&mod_TrezorCrypto_Random_uniform_obj) },
{ MP_ROM_QSTR(MP_QSTR_bytes), MP_ROM_PTR(&mod_TrezorCrypto_Random_bytes_obj) },
{ MP_ROM_QSTR(MP_QSTR_shuffle), MP_ROM_PTR(&mod_TrezorCrypto_Random_shuffle_obj) },
};
STATIC MP_DEFINE_CONST_DICT(mod_TrezorCrypto_Random_locals_dict, mod_TrezorCrypto_Random_locals_dict_table);
STATIC const mp_obj_type_t mod_TrezorCrypto_Random_type = {
{ &mp_type_type },
.name = MP_QSTR_Random,
.make_new = mod_TrezorCrypto_Random_make_new,
.locals_dict = (void*)&mod_TrezorCrypto_Random_locals_dict,
};

View File

@ -18,6 +18,7 @@
#include "modtrezorcrypto-bip39.h" #include "modtrezorcrypto-bip39.h"
#include "modtrezorcrypto-ed25519.h" #include "modtrezorcrypto-ed25519.h"
#include "modtrezorcrypto-pbkdf2.h" #include "modtrezorcrypto-pbkdf2.h"
#include "modtrezorcrypto-random.h"
#include "modtrezorcrypto-ripemd160.h" #include "modtrezorcrypto-ripemd160.h"
#include "modtrezorcrypto-nist256p1.h" #include "modtrezorcrypto-nist256p1.h"
#include "modtrezorcrypto-secp256k1.h" #include "modtrezorcrypto-secp256k1.h"
@ -33,6 +34,7 @@ STATIC const mp_rom_map_elem_t mp_module_TrezorCrypto_globals_table[] = {
{ MP_ROM_QSTR(MP_QSTR_Ed25519), MP_ROM_PTR(&mod_TrezorCrypto_Ed25519_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) }, { MP_ROM_QSTR(MP_QSTR_Nist256p1), MP_ROM_PTR(&mod_TrezorCrypto_Nist256p1_type) },
{ MP_ROM_QSTR(MP_QSTR_Pbkdf2), MP_ROM_PTR(&mod_TrezorCrypto_Pbkdf2_type) }, { MP_ROM_QSTR(MP_QSTR_Pbkdf2), MP_ROM_PTR(&mod_TrezorCrypto_Pbkdf2_type) },
{ MP_ROM_QSTR(MP_QSTR_Random), MP_ROM_PTR(&mod_TrezorCrypto_Random_type) },
{ MP_ROM_QSTR(MP_QSTR_Ripemd160), MP_ROM_PTR(&mod_TrezorCrypto_Ripemd160_type) }, { MP_ROM_QSTR(MP_QSTR_Ripemd160), MP_ROM_PTR(&mod_TrezorCrypto_Ripemd160_type) },
{ MP_ROM_QSTR(MP_QSTR_Secp256k1), MP_ROM_PTR(&mod_TrezorCrypto_Secp256k1_type) }, { MP_ROM_QSTR(MP_QSTR_Secp256k1), MP_ROM_PTR(&mod_TrezorCrypto_Secp256k1_type) },
{ MP_ROM_QSTR(MP_QSTR_Sha256), MP_ROM_PTR(&mod_TrezorCrypto_Sha256_type) }, { MP_ROM_QSTR(MP_QSTR_Sha256), MP_ROM_PTR(&mod_TrezorCrypto_Sha256_type) },

View File

@ -1,3 +1,4 @@
#include <string.h>
#include "rand.h" #include "rand.h"
#ifdef UNIX #ifdef UNIX
@ -53,14 +54,14 @@ void random_buffer(uint8_t *buf, size_t len)
#endif #endif
} }
void random_permute(char *str, size_t len) void random_permute(void *buf, size_t size, size_t count)
{ {
int i, j; uint8_t *d = (uint8_t *)buf;
char t; uint8_t t[size];
for (i = len - 1; i >= 1; i--) { for (size_t i = count - 1; i >= 1; i--) {
j = random_uniform(i + 1); size_t j = random_uniform(i + 1);
t = str[j]; memcpy(t, d + j * size, size);
str[j] = str[i]; memcpy(d + j * size, d + i * size, size);
str[i] = t; memcpy(d + i * size, t, size);
} }
} }

View File

@ -7,6 +7,6 @@
uint32_t random32(void); uint32_t random32(void);
uint32_t random_uniform(uint32_t n); uint32_t random_uniform(uint32_t n);
void random_buffer(uint8_t *buf, size_t len); void random_buffer(uint8_t *buf, size_t len);
void random_permute(char *buf, size_t len); void random_permute(void *buf, size_t size, size_t count);
#endif #endif

View File

@ -1,6 +1,8 @@
from TrezorCrypto import Pbkdf2 as pbkdf2
from TrezorCrypto import Bip39 from TrezorCrypto import Bip39
from TrezorCrypto import Pbkdf2 as pbkdf2
from TrezorCrypto import Random
from TrezorCrypto import SSSS from TrezorCrypto import SSSS
bip39 = Bip39() bip39 = Bip39()
random = Random()
ssss = SSSS() ssss = SSSS()