1 Commits
Author SHA1 Message Date
Michele Balistreri 118dfca457 backport 4.5 fixes 2024-01-10 10:29:39 +01:00
3 changed files with 108 additions and 87 deletions
+95 -69
View File
@@ -23,6 +23,8 @@
/*===========================================================================*
* Defines:
*===========================================================================*/
//#define FAME_SOFT_FUP
#define SB_BLS 1
#define SB_ECDSA 2
@@ -34,13 +36,14 @@
#define BLS_POINT_WSIZE (FP2_INT_WSIZE * 3)
#define FAME_OW_SIZE (PH_CLUTILS_FAME_WORD_SIZE/2)
#define FAME_WAIT(mask) do { dcw_dci(); } while(gphlibSfrUm_PKCC_STATUS.bVal & mask);
#define FAME_WAIT(mask) while(gphlibSfrUm_PKCC_STATUS.bVal & mask) {}
#define FAME_START(mask) dcw_dci(); gphlibSfrUm_PKCC_START.bVal = mask
#define FAME_PTR(addr) (((uint16_t) addr) - SB_INFO_STRUCT_START)
#define FAME_RPTR(addr) ((uint16_t*)(addr + SB_INFO_STRUCT_START))
#define FAME_WALLOC(mem, size) &mem[size]; mem += size
#define FUP_ENTRY(p0, p1, x, y, z, r) (p0|(p1 << 8)), (x|(y << 8)), (z|(r << 8))
#define FMC_ENTRY(a, b) (a|(b << 8))
#define FUP_ENTRY(p0, p1, x, y, z, r) (uint16_t)(p0|((uint16_t)p1 << 8)), (uint16_t)(x|(uint16_t)(y << 8)), (uint16_t)(z|(uint16_t)(r << 8))
#define FMC_ENTRY(a, b) (uint16_t)(a|(uint16_t)(b << 8))
#define FAME_USER_MACRO_ADDR 0x80
#define FAME_USER_MACRO_WLEN 27
#define FAME_MC_MODINVO FAME_USER_MACRO_ADDR
@@ -141,11 +144,25 @@ typedef struct LLVM_UNALIGNED {
fp2_int_t z;
} bls_point_t;
typedef struct __attribute__((packed)) {
uint8_t op_type;
uint8_t op_code;
uint8_t x;
uint8_t y;
uint8_t z;
uint8_t r;
} fup_entry_t;
/*===========================================================================*
* Globals:
*===========================================================================*/
uint16_t* FAME_MEMORY_TYPE fameMem = (uint16_t* FAME_MEMORY_TYPE) SB_WORKSPACE_START;
DM32_MEMORY_TYPE uint16_t* fup = NULL;
phNativeLibParameterArea_t parameterArea __attribute__((used, section(".section.infostruct")));
uint16_t fameMem[0x3C0] __attribute__ ((section(".section.workspace")));
uint8_t stack[0x120] __attribute__((used, section(".section.stack")));
#ifndef FAME_SOFT_FUP
volatile const uint16_t* fup;
#endif
const uint16_t SECP256K1_R2_NDASH_N[] = {
// R^2
@@ -329,6 +346,9 @@ void fame_open() {
gphlibSfrUm_PKCC_CTRL.bVal &= (uint8_t)~PHLIB_SFRUMPKCC_CTRL_RESET_MASK;
while(gphlibSfrUm_PKCC_CTRL.bVal & PHLIB_SFRUMPKCC_CTRL_RESET_MASK);
gphlibSfrUm_PKCC_UPCTRL.bVal = PHLIB_SFRUMPKCC_UPCTRL_CACHE_EN_MASK;
gphlibSfrUm_PKCC_UPFIFO_CFG.bVal = (gphlibSfrUm_PKCC_VERSION0.wVal >> 8) & 0xf0;
}
void fame_close() {
@@ -339,6 +359,34 @@ void fame_close() {
while((gphlibSfrUm_PKCC_CTRL.bVal & PHLIB_SFRUMPKCC_CTRL_STOP_MASK) != PHLIB_SFRUMPKCC_CTRL_STOP_MASK);
}
void fame_run_fup(const uint16_t* prg, uint8_t prg_len, uint16_t* FAME_MEMORY_TYPE uptable) {
#ifndef FAME_SOFT_FUP
fup = prg;
FAME_WAIT(PHLIB_SFRUMPKCC_STATUS_GOANY_MASK);
gphlibSfrUm_PKCC_UPLEN.bVal = prg_len;
gphlibSfrUm_PKCC_UPTRT.wVal = FAME_PTR(uptable);
FAME_START(PHLIB_SFRUMPKCC_START_GOU_MASK);
gphlibSfrUm_PKCC_UPIRQ.bVal |= PHLIB_SFRUMPKCC_UPIRQ_LVL_MASK_VALUE_HIGH;
FAME_WAIT(PHLIB_SFRUMPKCC_STATUS_ACTV_MASK);
#else
fup_entry_t* ops = (fup_entry_t*) prg;
FAME_WAIT(PHLIB_SFRUMPKCC_STATUS_GOANY_MASK);
for (int i = 0; i < prg_len; i++) {
gphlibSfrUm_PKCC_XPTR.wVal = uptable[ops[i].x];
gphlibSfrUm_PKCC_YPTR.wVal = uptable[ops[i].y];
gphlibSfrUm_PKCC_TOPP.wVal = uptable[ops[i].z];
gphlibSfrUm_PKCC_RPTR.wVal = uptable[ops[i].r];
gphlibSfrUm_PKCC_MODE.bVal = ops[i].op_code;
FAME_START(PHLIB_SFRUMPKCC_START_GOM1_MASK); // we always use macros in our FUP programs
FAME_WAIT(PHLIB_SFRUMPKCC_STATUS_ACTV_MASK);
}
#endif
}
uint8_t fame_cmp(uint16_t* FAME_MEMORY_TYPE a, uint16_t* FAME_MEMORY_TYPE b) {
FAME_WAIT(PHLIB_SFRUMPKCC_STATUS_GOANY_MASK);
@@ -346,7 +394,7 @@ uint8_t fame_cmp(uint16_t* FAME_MEMORY_TYPE a, uint16_t* FAME_MEMORY_TYPE b) {
gphlibSfrUm_PKCC_TOPP.wVal = FAME_PTR(b);
gphlibSfrUm_PKCC_MODE.bVal = FM_CMP;
gphlibSfrUm_PKCC_START.bVal = PHLIB_SFRUMPKCC_START_GOD1_MASK;
FAME_START(PHLIB_SFRUMPKCC_START_GOD1_MASK);
FAME_WAIT(PHLIB_SFRUMPKCC_STATUS_ACTV_MASK);
return gphlibSfrUm_PKCC_STATUS.bVal & 0x3;
@@ -360,28 +408,28 @@ void fame_rshift(uint16_t* FAME_MEMORY_TYPE a, uint16_t n) {
gphlibSfrUm_PKCC_RPTR.wVal = FAME_PTR(a);
gphlibSfrUm_PKCC_MODE.bVal = FM_SHR;
gphlibSfrUm_PKCC_START.bVal = PHLIB_SFRUMPKCC_START_GOD1_MASK;
FAME_START(PHLIB_SFRUMPKCC_START_GOD1_MASK);
FAME_WAIT(PHLIB_SFRUMPKCC_STATUS_ACTV_MASK);
}
void fame_modInvEven(uint16_t* ab, uint16_t* uv, uint16_t* FAME_MEMORY_TYPE n) {
FAME_WAIT(PHLIB_SFRUMPKCC_STATUS_GOANY_MASK);
n[-1] = 0x8000;
FAME_WAIT(PHLIB_SFRUMPKCC_STATUS_GOANY_MASK);
gphlibSfrUm_PKCC_XPTR.wVal = FAME_PTR(n) - gphlibSfrUm_PKCC_OPLEN.wVal;
gphlibSfrUm_PKCC_YPTR.wVal = FAME_PTR(n);
gphlibSfrUm_PKCC_TOPP.wVal = FAME_PTR(ab);
gphlibSfrUm_PKCC_RPTR.wVal = FAME_PTR(uv);
gphlibSfrUm_PKCC_MODE.bVal = FAME_MC_MODINVE;
gphlibSfrUm_PKCC_START.bVal = PHLIB_SFRUMPKCC_START_GOM1_MASK;
FAME_START(PHLIB_SFRUMPKCC_START_GOM1_MASK);
FAME_WAIT(PHLIB_SFRUMPKCC_STATUS_ACTV_MASK);
}
void fame_modInvOdd(uint16_t* FAME_MEMORY_TYPE ab, uint16_t* FAME_MEMORY_TYPE ba, uint16_t* FAME_MEMORY_TYPE uv, uint16_t* FAME_MEMORY_TYPE vu, uint16_t* FAME_MEMORY_TYPE n) {
FAME_WAIT(PHLIB_SFRUMPKCC_STATUS_GOANY_MASK);
n[-1] = 0x8000;
FAME_WAIT(PHLIB_SFRUMPKCC_STATUS_GOANY_MASK);
gphlibSfrUm_PKCC_XPTR.wVal = FAME_PTR(vu);
gphlibSfrUm_PKCC_YPTR.wVal = FAME_PTR(uv);
gphlibSfrUm_PKCC_TOPP.wVal = FAME_PTR(ab);
@@ -389,7 +437,7 @@ void fame_modInvOdd(uint16_t* FAME_MEMORY_TYPE ab, uint16_t* FAME_MEMORY_TYPE ba
gphlibSfrUm_PKCC_MCLEN.wVal = FAME_PTR(n);
gphlibSfrUm_PKCC_MODE.bVal = FAME_MC_MODINVO;
gphlibSfrUm_PKCC_START.bVal = PHLIB_SFRUMPKCC_START_GOM1_MASK;
FAME_START(PHLIB_SFRUMPKCC_START_GOM1_MASK);
FAME_WAIT(PHLIB_SFRUMPKCC_STATUS_ACTV_MASK);
}
@@ -432,7 +480,7 @@ void fame_monpro(uint16_t* FAME_MEMORY_TYPE a, uint16_t* FAME_MEMORY_TYPE b, uin
gphlibSfrUm_PKCC_MCLEN.wVal = ECDSA_OP_SIZE;
gphlibSfrUm_PKCC_MODE.bVal = FMC_MONPRO;
gphlibSfrUm_PKCC_START.bVal = PHLIB_SFRUMPKCC_START_GOM1_MASK;
FAME_START(PHLIB_SFRUMPKCC_START_GOM1_MASK);
FAME_WAIT(PHLIB_SFRUMPKCC_STATUS_ACTV_MASK);
}
@@ -447,19 +495,9 @@ static inline void fame_unblind(uint16_t* FAME_MEMORY_TYPE a, uint16_t* FAME_MEM
void fame_ecdsaSign(uint16_t* FAME_MEMORY_TYPE uptable) {
FAME_WAIT(PHLIB_SFRUMPKCC_STATUS_GOANY_MASK);
gphlibSfrUm_PKCC_MCLEN.wVal = ECDSA_OP_SIZE;
gphlibSfrUm_PKCC_UPCTRL.bVal = PHLIB_SFRUMPKCC_UPCTRL_CACHE_EN_MASK;
gphlibSfrUm_PKCC_UPLEN.bVal = ECDSA_SIGN_LEN;
gphlibSfrUm_PKCC_UPTRT.wVal = FAME_PTR(uptable);
fup = ECDSA_SIGN;
gphlibSfrUm_PKCC_START.bVal = PHLIB_SFRUMPKCC_START_GOU_MASK;
gphlibSfrUm_PKCC_UPIRQ.bVal |= PHLIB_SFRUMPKCC_UPIRQ_LVL_MASK_VALUE_HIGH;
FAME_WAIT(PHLIB_SFRUMPKCC_STATUS_ACTV_MASK);
fame_run_fup(ECDSA_SIGN, ECDSA_SIGN_LEN, uptable);
}
void flipmpi(uint8_t* mpi, uint16_t size) {
@@ -473,21 +511,13 @@ void flipmpi(uint8_t* mpi, uint16_t size) {
}
void fame_fp2_do(uint16_t* FAME_MEMORY_TYPE uptable, fp2_int_t* a, fp2_int_t* b, fp2_int_t* r, const uint16_t* op, uint16_t oplen) {
FAME_WAIT(PHLIB_SFRUMPKCC_STATUS_GOANY_MASK);
void fame_fp2_do(uint16_t* FAME_MEMORY_TYPE uptable, fp2_int_t* a, fp2_int_t* b, fp2_int_t* r, const uint16_t* op, uint8_t oplen) {
uptable[0] = FAME_PTR(a->re);
uptable[1] = FAME_PTR(a->im);
uptable[2] = FAME_PTR(b->re);
uptable[3] = FAME_PTR(b->im);
gphlibSfrUm_PKCC_UPLEN.bVal = oplen;
fup = op;
gphlibSfrUm_PKCC_START.bVal = PHLIB_SFRUMPKCC_START_GOU_MASK;
gphlibSfrUm_PKCC_UPIRQ.bVal |= PHLIB_SFRUMPKCC_UPIRQ_LVL_MASK_VALUE_HIGH;
FAME_WAIT(PHLIB_SFRUMPKCC_STATUS_ACTV_MASK);
fame_run_fup(op, oplen, uptable);
uint16_t* rre = FAME_RPTR(uptable[6]);
uint16_t* rim = FAME_RPTR(uptable[7]);
@@ -525,19 +555,11 @@ void fame_fp2_mult_fp(uint16_t* FAME_MEMORY_TYPE uptable, fp2_int_t* a, const ui
}
void fame_fp2_invert(uint16_t* FAME_MEMORY_TYPE uptable, fp2_int_t* a, fp2_int_t* r) {
FAME_WAIT(PHLIB_SFRUMPKCC_STATUS_GOANY_MASK);
uptable[0] = FAME_PTR(a->re);
uptable[1] = FAME_PTR(a->im);
uptable[2] = uptable[9];
gphlibSfrUm_PKCC_UPLEN.bVal = FP2_PRE_INV_LEN;
fup = FP2_PRE_INV;
gphlibSfrUm_PKCC_START.bVal = PHLIB_SFRUMPKCC_START_GOU_MASK;
gphlibSfrUm_PKCC_UPIRQ.bVal |= PHLIB_SFRUMPKCC_UPIRQ_LVL_MASK_VALUE_HIGH;
FAME_WAIT(PHLIB_SFRUMPKCC_STATUS_ACTV_MASK);
fame_run_fup(FP2_PRE_INV, FP2_PRE_INV_LEN, uptable);
uint16_t* factor = FAME_RPTR(uptable[9]);
uint16_t* b = FAME_RPTR(uptable[6]);
@@ -560,13 +582,7 @@ void fame_fp2_invert(uint16_t* FAME_MEMORY_TYPE uptable, fp2_int_t* a, fp2_int_t
}
gphlibSfrUm_PKCC_MCLEN.wVal = FP2_OP_SIZE;
gphlibSfrUm_PKCC_UPLEN.bVal = FP2_POST_INV_LEN;
fup = FP2_POST_INV;
gphlibSfrUm_PKCC_START.bVal = PHLIB_SFRUMPKCC_START_GOU_MASK;
gphlibSfrUm_PKCC_UPIRQ.bVal |= PHLIB_SFRUMPKCC_UPIRQ_LVL_MASK_VALUE_HIGH;
FAME_WAIT(PHLIB_SFRUMPKCC_STATUS_ACTV_MASK);
fame_run_fup(FP2_POST_INV, FP2_POST_INV_LEN, uptable);
for (uint8_t i = 0; i < FP2_OP_WSIZE; i++) {
r->re[i] = b[i];
@@ -673,17 +689,15 @@ uint16_t ecdsaSign() {
res[off++] = recIdInv;
_ecdsa_finish:;
phNativeLibParameterArea_t* params = (phNativeLibParameterArea_t*)SB_INFO_STRUCT_START;
params->siCopyBackAddress = (puint8_uni_t) res;
params->siCopyBackSize = off;
params->scCopyBackAtomic = 0xff;
parameterArea.siCopyBackAddress = (puint8_uni_t) res;
parameterArea.siCopyBackSize = off;
parameterArea.scCopyBackAtomic = 0xff;
return off;
}
uint8_t bls_point_is_zero(bls_point_t* FAME_MEMORY_TYPE p) {
uint8_t res = 0;
uint16_t res = 0;
for (uint16_t i = 0; i < FP2_OP_WSIZE; i++) {
res |= p->z.re[i];
@@ -892,8 +906,6 @@ uint16_t blsSign() {
gphlibSfrUm_PKCC_OPLEN.wVal = FP2_OP_SIZE;
gphlibSfrUm_PKCC_MCLEN.wVal = FP2_OP_SIZE;
gphlibSfrUm_PKCC_UPCTRL.bVal = PHLIB_SFRUMPKCC_UPCTRL_CACHE_EN_MASK;
gphlibSfrUm_PKCC_UPTRT.wVal = FAME_PTR(uptable);
fame_load_macros();
@@ -908,39 +920,53 @@ uint16_t blsSign() {
bls_toggle_montgomeryxy(uptable, s);
phNativeLibParameterArea_t* params = (phNativeLibParameterArea_t*)SB_INFO_STRUCT_START;
flipmpi((uint8_t*) s->x.re, FP2_OP_SIZE);
flipmpi((uint8_t*) s->x.im, FP2_OP_SIZE);
flipmpi((uint8_t*) s->y.re, FP2_OP_SIZE);
flipmpi((uint8_t*) s->y.im, FP2_OP_SIZE);
params->siCopyBackAddress = (puint8_uni_t) s;
params->siCopyBackSize = (FP2_OP_SIZE * 4);
params->scCopyBackAtomic = 0xff;
parameterArea.siCopyBackAddress = (puint8_uni_t) s;
parameterArea.siCopyBackSize = (FP2_OP_SIZE * 4);
parameterArea.scCopyBackAtomic = 0xff;
return (FP2_OP_SIZE * 4);
}
/* Main entry to test native library -> USR_0 */
LLVM_ISR_WITH_ARGS uint16_t mainEntry(uint16_t funcId) {
sil(0);
#ifndef FAME_SOFT_FUP
sil(6);
#endif
OpenResources_SYS(NATIVELIB_OPEN_FAME_MASK|NATIVELIB_OPEN_RNG_MASK);
//SetClock_SYS(NATIVELIB_CLOCK_ID_PKCC, NATIVELIB_CLOCK_MODE_ENABLE);
fame_open();
uint16_t res;
switch (funcId) {
case SB_BLS: return blsSign();
case SB_ECDSA: return ecdsaSign();
case SB_BLS:
res = blsSign();
break;
case SB_ECDSA:
res = ecdsaSign();
break;
default:
res = 0xffff;
break;
}
fame_close();
//SetClock_SYS(NATIVELIB_CLOCK_ID_PKCC, NATIVELIB_CLOCK_MODE_DISABLE);
CloseResources_SYS(NATIVELIB_OPEN_FAME_MASK|NATIVELIB_OPEN_RNG_MASK);
return 0x6d00;
return res;
}
/* FAME UPFIFO Empty ISR */
void phIntHandler_FAME3_UPFIFO_Empty_Isr() LLVM_ISR {
#ifndef FAME_SOFT_FUP
while(!(gphlibSfrUm_PKCC_UPIRQ.bVal & PHLIB_SFRUMPKCC_UPIRQ_STOP_READING_MASK)) {
gphlibSfrUm_PKCC_UPFIFO.wVal = *(fup++);
gphlibSfrUm_PKCC_UPFIFO.wVal = *(fup++);
@@ -956,6 +982,7 @@ void phIntHandler_FAME3_UPFIFO_Empty_Isr() LLVM_ISR {
}
gphlibSfrUm_PKCC_UPIRQ.bVal = (gphlibSfrUm_PKCC_UPIRQ.bVal & ~mask) | PHLIB_SFRUMPKCC_UPIRQ_CLR_MASK;
#endif
}
/* Timer ISR */
@@ -971,4 +998,3 @@ LLVM_ISR_WITH_ARGS void phappSysCall_Reset_POR() {
LLVM_ISR_WITH_ARGS void phSecureBox_Exception_UsrCall(uint16_t liExceptionType, uint16_t liExceptionReason) {
Exception_SYS(liExceptionType, liExceptionReason);
}
+3 -4
View File
@@ -9,11 +9,10 @@
secureBoxWorkSpaceSize = 0x780;
/* SecureBox Stack size (located in FRAM) */
secureBoxStackSize = 0x100;
secureBoxStackSize = 0x120;
/* SecureBox Transient State size (located in T-Heap)*/
secureBoxTransienStateSize = 0x100;
secureBoxTransienStateSize = 0x20;
/* SecureBox Persistent State size (located in P-Heap)*/
secureBoxPersistentStateSize = 0x00;
secureBoxPersistentStateSize = 0x00;
+10 -14
View File
@@ -106,9 +106,8 @@ SECTIONS
.nxp.jcop.securebox.bss.SECUREBOX_PRODUCT_NAME (NOLOAD) :
{
FILL(0);
*(SORT_BY_USAGE(.bss*)
SORT_BY_USAGE(COMMON))
KEEP (*(SORT_BY_NAME(.bss*)
SORT_BY_USAGE(COMMON)))
. = .;
. = ALIGN(__MMU_RAM_GRANULARITY_BYTES);
@@ -123,17 +122,14 @@ SECTIONS
.nxp.jcop.securebox.workspace.SECUREBOX_PRODUCT_NAME (ORIGIN(DATA) + (0x4000)) :
{
FILL(0);
KEEP (*(.section.workspace))
. = .;
. = ALIGN(__MMU_RAM_GRANULARITY_BYTES);
} > DATA
{
FILL(0);
KEEP (*(.section.infostruct))
ASSERT(. == 0x30, "InfoStruct allocation does not have the correct length");
KEEP (*(.section.workspace))
. = .;
. = ALIGN(__MMU_RAM_GRANULARITY_BYTES);
} > DATA
.nxp.jcop.securebox.stack.SECUREBOX_PRODUCT_NAME :
{