1
0
mirror of https://github.com/trezor/trezor-firmware.git synced 2024-11-22 07:28:10 +00:00

trezor.config: rework for new structure

This commit is contained in:
Pavol Rusnak 2017-06-20 13:24:12 +02:00
parent 285fb1263b
commit acb68dc429
No known key found for this signature in database
GPG Key ID: 91F3B339B9A02A3D
6 changed files with 67 additions and 85 deletions

View File

@ -5,44 +5,38 @@
* see LICENSE file for details * see LICENSE file for details
*/ */
#include <stdio.h>
#include <string.h>
#include <stdint.h>
#include "py/runtime.h" #include "py/runtime.h"
#include "norcow.h"
#if MICROPY_PY_TREZORCONFIG #if MICROPY_PY_TREZORCONFIG
/// class Config: #include <stdint.h>
/// ''' #include <string.h>
/// Persistent key-value storage, with 16-bit keys and bytes values. #include "norcow.h"
/// '''
typedef struct _mp_obj_Config_t {
mp_obj_base_t base;
} mp_obj_Config_t;
/// def __init__(self): static bool initialized = false;
/// def init(self) -> None:
/// ''' /// '''
/// Initializes the storage. /// Initializes the storage. Must be called before any other method is called from this module!
/// ''' /// '''
STATIC mp_obj_t mod_trezorconfig_Config_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 mod_trezorconfig_init(void) {
mp_arg_check_num(n_args, n_kw, 0, 0, false);
mp_obj_Config_t *o = m_new_obj(mp_obj_Config_t);
o->base.type = type;
bool r = norcow_init(); bool r = norcow_init();
if (!r) { if (!r) {
mp_raise_msg(&mp_type_RuntimeError, "Could not initialize storage"); mp_raise_msg(&mp_type_RuntimeError, "Could not initialize config module");
} }
return MP_OBJ_FROM_PTR(o); initialized = true;
return mp_const_none;
} }
STATIC MP_DEFINE_CONST_FUN_OBJ_0(mod_trezorconfig_init_obj, mod_trezorconfig_init);
/// def get(self, app: int, key: int) -> bytes: /// def get(app: int, key: int) -> bytes:
/// ''' /// '''
/// Gets a value of given key for given app (or empty bytes if not set). /// Gets a value of given key for given app (or empty bytes if not set).
/// ''' /// '''
STATIC mp_obj_t mod_trezorconfig_Config_get(mp_obj_t self, mp_obj_t app, mp_obj_t key) { STATIC mp_obj_t mod_trezorconfig_get(mp_obj_t app, mp_obj_t key) {
if (!initialized) {
mp_raise_msg(&mp_type_RuntimeError, "Config module not initialized");
}
uint8_t a = mp_obj_get_int(app); uint8_t a = mp_obj_get_int(app);
uint8_t k = mp_obj_get_int(key); uint8_t k = mp_obj_get_int(key);
uint16_t appkey = a << 8 | k, len; uint16_t appkey = a << 8 | k, len;
@ -56,57 +50,51 @@ STATIC mp_obj_t mod_trezorconfig_Config_get(mp_obj_t self, mp_obj_t app, mp_obj_
memcpy(vstr.buf, val, len); memcpy(vstr.buf, val, len);
return mp_obj_new_str_from_vstr(&mp_type_bytes, &vstr); return mp_obj_new_str_from_vstr(&mp_type_bytes, &vstr);
} }
STATIC MP_DEFINE_CONST_FUN_OBJ_3(mod_trezorconfig_Config_get_obj, mod_trezorconfig_Config_get); STATIC MP_DEFINE_CONST_FUN_OBJ_2(mod_trezorconfig_get_obj, mod_trezorconfig_get);
/// def set(self, app: int, key: int, value: bytes) -> None: /// def set(app: int, key: int, value: bytes) -> None:
/// ''' /// '''
/// Sets a value of given key for given app. /// Sets a value of given key for given app.
/// Returns True on success.
/// ''' /// '''
STATIC mp_obj_t mod_trezorconfig_Config_set(size_t n_args, const mp_obj_t *args) { STATIC mp_obj_t mod_trezorconfig_set(mp_obj_t app, mp_obj_t key, mp_obj_t value) {
uint8_t a = mp_obj_get_int(args[1]); if (!initialized) {
uint8_t k = mp_obj_get_int(args[2]); mp_raise_msg(&mp_type_RuntimeError, "Config module not initialized");
}
uint8_t a = mp_obj_get_int(app);
uint8_t k = mp_obj_get_int(key);
uint16_t appkey = a << 8 | k; uint16_t appkey = a << 8 | k;
mp_buffer_info_t value; mp_buffer_info_t v;
mp_get_buffer_raise(args[3], &value, MP_BUFFER_READ); mp_get_buffer_raise(value, &v, MP_BUFFER_READ);
bool r = norcow_set(appkey, value.buf, value.len); bool r = norcow_set(appkey, v.buf, v.len);
if (!r) { if (!r) {
mp_raise_msg(&mp_type_RuntimeError, "Could not save value"); mp_raise_msg(&mp_type_RuntimeError, "Could not save value");
} }
return mp_const_none; return mp_const_none;
} }
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mod_trezorconfig_Config_set_obj, 4, 4, mod_trezorconfig_Config_set); STATIC MP_DEFINE_CONST_FUN_OBJ_3(mod_trezorconfig_set_obj, mod_trezorconfig_set);
/// def wipe(self) -> None: /// def wipe(self) -> None:
/// ''' /// '''
/// Erases the whole config. Use with caution! /// Erases the whole config. Use with caution!
/// ''' /// '''
STATIC mp_obj_t mod_trezorconfig_Config_wipe(mp_obj_t self) { STATIC mp_obj_t mod_trezorconfig_wipe(void) {
if (!initialized) {
mp_raise_msg(&mp_type_RuntimeError, "Config module not initialized");
}
bool r = norcow_wipe(); bool r = norcow_wipe();
if (!r) { if (!r) {
mp_raise_msg(&mp_type_RuntimeError, "Could not wipe storage"); mp_raise_msg(&mp_type_RuntimeError, "Could not wipe storage");
} }
return mp_const_none; return mp_const_none;
} }
STATIC MP_DEFINE_CONST_FUN_OBJ_1(mod_trezorconfig_Config_wipe_obj, mod_trezorconfig_Config_wipe); STATIC MP_DEFINE_CONST_FUN_OBJ_0(mod_trezorconfig_wipe_obj, mod_trezorconfig_wipe);
STATIC const mp_rom_map_elem_t mod_trezorconfig_Config_locals_dict_table[] = {
{ MP_ROM_QSTR(MP_QSTR_get), MP_ROM_PTR(&mod_trezorconfig_Config_get_obj) },
{ MP_ROM_QSTR(MP_QSTR_set), MP_ROM_PTR(&mod_trezorconfig_Config_set_obj) },
{ MP_ROM_QSTR(MP_QSTR_wipe), MP_ROM_PTR(&mod_trezorconfig_Config_wipe_obj) },
};
STATIC MP_DEFINE_CONST_DICT(mod_trezorconfig_Config_locals_dict, mod_trezorconfig_Config_locals_dict_table);
STATIC const mp_obj_type_t mod_trezorconfig_Config_type = {
{ &mp_type_type },
.name = MP_QSTR_Config,
.make_new = mod_trezorconfig_Config_make_new,
.locals_dict = (void*)&mod_trezorconfig_Config_locals_dict,
};
STATIC const mp_rom_map_elem_t mp_module_trezorconfig_globals_table[] = { STATIC const mp_rom_map_elem_t mp_module_trezorconfig_globals_table[] = {
{ MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_trezorconfig) }, { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_trezorconfig) },
{ MP_ROM_QSTR(MP_QSTR_Config), MP_ROM_PTR(&mod_trezorconfig_Config_type) }, { MP_ROM_QSTR(MP_QSTR_init), MP_ROM_PTR(&mod_trezorconfig_init_obj) },
{ MP_ROM_QSTR(MP_QSTR_get), MP_ROM_PTR(&mod_trezorconfig_get_obj) },
{ MP_ROM_QSTR(MP_QSTR_set), MP_ROM_PTR(&mod_trezorconfig_set_obj) },
{ MP_ROM_QSTR(MP_QSTR_wipe), MP_ROM_PTR(&mod_trezorconfig_wipe_obj) },
}; };
STATIC MP_DEFINE_CONST_DICT(mp_module_trezorconfig_globals, mp_module_trezorconfig_globals_table); STATIC MP_DEFINE_CONST_DICT(mp_module_trezorconfig_globals, mp_module_trezorconfig_globals_table);

View File

@ -1,28 +1,25 @@
from typing import * from typing import *
# extmod/modtrezorconfig/modtrezorconfig.c # extmod/modtrezorconfig/modtrezorconfig.c
class Config: def init(self) -> None:
''' '''
Persistent key-value storage, with 16-bit keys and bytes values. Initializes the storage. Must be called before any other method is called from this module!
''' '''
def __init__(self): # extmod/modtrezorconfig/modtrezorconfig.c
''' def get(app: int, key: int) -> bytes:
Initializes the storage. '''
''' Gets a value of given key for given app (or empty bytes if not set).
'''
def get(self, app: int, key: int) -> bytes: # extmod/modtrezorconfig/modtrezorconfig.c
''' def set(app: int, key: int, value: bytes) -> None:
Gets a value of given key for given app (or empty bytes if not set). '''
''' Sets a value of given key for given app.
'''
def set(self, app: int, key: int, value: bytes) -> None: # extmod/modtrezorconfig/modtrezorconfig.c
''' def wipe(self) -> None:
Sets a value of given key for given app. '''
Returns True on success. Erases the whole config. Use with caution!
''' '''
def wipe(self) -> None:
'''
Erases the whole config. Use with caution!
'''

View File

@ -1,10 +1,13 @@
from micropython import const from micropython import const
import trezor.main import trezor.main
from trezor import config
from trezor import msg from trezor import msg
from trezor import ui from trezor import ui
from trezor import wire from trezor import wire
config.init()
# Load all applications # Load all applications
if __debug__: if __debug__:
from apps import debug from apps import debug

View File

@ -0,0 +1 @@
import trezorconfig as config

View File

@ -1,15 +0,0 @@
from trezorconfig import Config
_config = Config()
def get(app: int, key: int) -> bytes:
return _config.get(app, key)
def set(app: int, key: int, value: bytes):
return _config.set(app, key, value)
def wipe():
return _config.wipe()

View File

@ -6,7 +6,13 @@ from trezor import config
class TestConfig(unittest.TestCase): class TestConfig(unittest.TestCase):
def test_init(self):
config.init()
config.init()
config.init()
def test_wipe(self): def test_wipe(self):
config.init()
config.wipe() config.wipe()
config.set(0, 0, b'hello') config.set(0, 0, b'hello')
config.set(1, 1, b'world') config.set(1, 1, b'world')
@ -21,6 +27,7 @@ class TestConfig(unittest.TestCase):
self.assertEqual(v1, bytes()) self.assertEqual(v1, bytes())
def test_set_get(self): def test_set_get(self):
config.init()
config.wipe() config.wipe()
for _ in range(64): for _ in range(64):
appid, key = random.uniform(256), random.uniform(256) appid, key = random.uniform(256), random.uniform(256)
@ -30,6 +37,7 @@ class TestConfig(unittest.TestCase):
self.assertEqual(value, value2) self.assertEqual(value, value2)
def test_get_default(self): def test_get_default(self):
config.init()
config.wipe() config.wipe()
for _ in range(64): for _ in range(64):
appid, key = random.uniform(256), random.uniform(256) appid, key = random.uniform(256), random.uniform(256)