Skip to content
This repository was archived by the owner on May 28, 2019. It is now read-only.

Commit bd53fb2

Browse files
real-or-randomromanzapoelstraprusnak
committed
embed/extmod/modtrezorcrypto: add secp256k1_zkp module
This includes the https://github.com/ElementsProject/secp256k1-zkp library (which is a fork from sipa/secp256k1 used in Bitcoin Core) as a module. It is currently not used in any app. This commit the first step towards integrating Liquid (tracking issue #282). Note that this creates a new 64 kiB read-only data section in .flash2 for pre-computed tables (secp256k1_ecmult_static_context) which speed up signature creation and related private key operations. Co-authored-by: Roman Zeyde <[email protected]> Co-authored-by: Andrew Poelstra <[email protected]> Co-authored-by: Pavol Rusnak <[email protected]>
1 parent e896998 commit bd53fb2

File tree

10 files changed

+475
-25
lines changed

10 files changed

+475
-25
lines changed

.gitmodules

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,7 @@
1616
[submodule "vendor/QR-Code-generator"]
1717
path = vendor/QR-Code-generator
1818
url = https://github.com/nayuki/QR-Code-generator.git
19+
[submodule "vendor/secp256k1-zkp"]
20+
path = vendor/secp256k1-zkp
21+
url = https://github.com/romanz/secp256k1-zkp.git
22+
branch = zkp-trezor

SConscript.firmware

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ CCFLAGS_MOD = ''
66
CPPPATH_MOD = []
77
CPPDEFINES_MOD = []
88
SOURCE_MOD = []
9+
SOURCE_MOD_SECP256K1_ZKP = []
910

1011
PYOPT = '1'
1112

@@ -85,6 +86,32 @@ SOURCE_MOD += [
8586
'vendor/trezor-crypto/sha3.c',
8687
]
8788

89+
# libsecp256k1-zkp
90+
CPPPATH_MOD += [
91+
'vendor/secp256k1-zkp',
92+
'vendor/secp256k1-zkp/src',
93+
'vendor/secp256k1-zkp/include',
94+
]
95+
CPPDEFINES_MOD += [
96+
'SECP256K1_BUILD',
97+
'USE_ASM_ARM',
98+
'USE_NUM_NONE',
99+
'USE_FIELD_INV_BUILTIN',
100+
'USE_SCALAR_INV_BUILTIN',
101+
'USE_FIELD_10X26',
102+
'USE_SCALAR_8X32',
103+
'USE_ECMULT_STATIC_PRECOMPUTATION',
104+
'USE_EXTERNAL_DEFAULT_CALLBACKS',
105+
('ECMULT_WINDOW_SIZE', '8'),
106+
'ENABLE_MODULE_GENERATOR',
107+
'ENABLE_MODULE_RANGEPROOF',
108+
'ENABLE_MODULE_RECOVERY',
109+
'ENABLE_MODULE_ECDH',
110+
]
111+
SOURCE_MOD_SECP256K1_ZKP += [
112+
'vendor/secp256k1-zkp/src/secp256k1.c',
113+
]
114+
88115
# modtrezorio
89116
SOURCE_MOD += [
90117
'embed/extmod/modtrezorio/modtrezorio.c',
@@ -403,12 +430,34 @@ source_mpyc = env.FrozenCFile(
403430

404431
env.Depends(source_mpyc, qstr_generated)
405432

433+
#
434+
# static secp256-zkp ecmult context
435+
#
436+
437+
host_env = Environment(ENV=os.environ)
438+
host_env.Replace(
439+
CC=os.getenv('CC_FOR_BUILD') or 'gcc',
440+
COPT='-O2',
441+
CPPPATH='vendor/secp256k1-zkp',
442+
)
443+
gen_context = host_env.Program(
444+
target='vendor/secp256k1-zkp/gen_context',
445+
source='vendor/secp256k1-zkp/src/gen_context.c',
446+
)
447+
448+
secp256k1_zkp_ecmult_static_context = host_env.Command(
449+
target='vendor/secp256k1-zkp/src/ecmult_static_context.h',
450+
source='vendor/secp256k1-zkp/gen_context',
451+
action='cd ${SOURCE.dir}; ./gen_context',
452+
)
453+
406454
#
407455
# Program objects
408456
#
409457

410458
obj_program = []
411459
obj_program.extend(env.Object(source=SOURCE_MOD))
460+
obj_program.extend(env.Object(source=SOURCE_MOD_SECP256K1_ZKP, CCFLAGS='$CCFLAGS -Wno-unused-function'))
412461
obj_program.extend(env.Object(source=SOURCE_FIRMWARE))
413462
obj_program.extend(env.Object(source=SOURCE_MICROPYTHON))
414463
obj_program.extend(env.Object(source=SOURCE_MICROPYTHON_SPEED, COPT='-O3'))
@@ -435,6 +484,7 @@ obj_program.extend(
435484
' $SOURCE $TARGET', ))
436485

437486
env.Depends(obj_program, qstr_generated)
487+
env.Depends(obj_program, secp256k1_zkp_ecmult_static_context)
438488

439489
program_elf = env.Command(
440490
target='firmware.elf',

SConscript.unix

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import os
55
CCFLAGS_MOD = ''
66
CPPPATH_MOD = []
77
CPPDEFINES_MOD = []
8+
SOURCE_MOD_SECP256K1_ZKP = []
89
SOURCE_MOD = []
910
LIBS_MOD = []
1011

@@ -82,6 +83,31 @@ SOURCE_MOD += [
8283
'vendor/trezor-crypto/nem.c',
8384
]
8485

86+
# libsecp256k1-zkp
87+
CPPPATH_MOD += [
88+
'vendor/secp256k1-zkp/',
89+
'vendor/secp256k1-zkp/src',
90+
'vendor/secp256k1-zkp/include',
91+
]
92+
CPPDEFINES_MOD += [
93+
'SECP256K1_BUILD',
94+
'USE_NUM_NONE',
95+
'USE_FIELD_INV_BUILTIN',
96+
'USE_SCALAR_INV_BUILTIN',
97+
'USE_FIELD_10X26',
98+
'USE_SCALAR_8X32',
99+
'USE_ECMULT_STATIC_PRECOMPUTATION',
100+
'USE_EXTERNAL_DEFAULT_CALLBACKS',
101+
('ECMULT_WINDOW_SIZE', '8'),
102+
'ENABLE_MODULE_GENERATOR',
103+
'ENABLE_MODULE_RANGEPROOF',
104+
'ENABLE_MODULE_RECOVERY',
105+
'ENABLE_MODULE_ECDH',
106+
]
107+
SOURCE_MOD_SECP256K1_ZKP += [
108+
'vendor/secp256k1-zkp/src/secp256k1.c',
109+
]
110+
85111
# modtrezorio
86112
SOURCE_MOD += [
87113
'embed/extmod/modtrezorio/modtrezorio.c',
@@ -346,16 +372,39 @@ qstr_generated = env.GenerateQstrDefs(
346372

347373
env.Ignore(qstr_collected, qstr_generated)
348374

375+
#
376+
# static secp256-zkp ecmult context
377+
#
378+
379+
host_env = Environment(ENV=os.environ)
380+
host_env.Replace(
381+
CC=os.getenv('CC_FOR_BUILD') or 'gcc',
382+
COPT='-O2',
383+
CPPPATH='vendor/secp256k1-zkp',
384+
)
385+
gen_context = host_env.Program(
386+
target='vendor/secp256k1-zkp/gen_context',
387+
source='vendor/secp256k1-zkp/src/gen_context.c',
388+
)
389+
390+
secp256k1_zkp_ecmult_static_context = host_env.Command(
391+
target='vendor/secp256k1-zkp/src/ecmult_static_context.h',
392+
source='vendor/secp256k1-zkp/gen_context',
393+
action='cd ${SOURCE.dir}; ./gen_context',
394+
)
395+
349396
#
350397
# Program objects
351398
#
352399

353400
obj_program = []
354401
obj_program += env.Object(source=SOURCE_MOD)
402+
obj_program += env.Object(source=SOURCE_MOD_SECP256K1_ZKP, CCFLAGS='$CCFLAGS -Wno-unused-function')
355403
obj_program += env.Object(source=SOURCE_MICROPYTHON)
356404
obj_program += env.Object(source=SOURCE_UNIX)
357405

358406
env.Depends(obj_program, qstr_generated)
407+
env.Depends(obj_program, secp256k1_zkp_ecmult_static_context)
359408

360409
program = env.Command(
361410
target='micropython',

embed/extmod/modtrezorcrypto/modtrezorcrypto-secp256k1.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@
1919

2020
#include "py/objstr.h"
2121

22-
#include "ecdsa.h"
23-
#include "secp256k1.h"
22+
#include "vendor/trezor-crypto/ecdsa.h"
23+
#include "vendor/trezor-crypto/secp256k1.h"
2424

2525
/// package: trezorcrypto.secp256k1
2626

0 commit comments

Comments
 (0)