Add DMA-friendly MLKEM windows
This commit is contained in:
@@ -14,6 +14,7 @@ void dma_start_transfer(int ch_id, u32 src, u32 dst, u32 bytes, u32 tag) {
|
||||
ch->DST_ADDR = dst;
|
||||
ch->LENGTH = bytes;
|
||||
ch->TAG = tag; // 可选,填入任务ID
|
||||
ch->MODE = DMA_MODE_MEM2MEM;
|
||||
|
||||
// 置 Burst 属性并触发传输
|
||||
// AXI SIZE: 2 (代表 2^2 = 4 Bytes,与 32-bit 数据线匹配)
|
||||
@@ -34,4 +35,4 @@ void dma_wait_polling(int ch_id) {
|
||||
// 清除 Done 标志位 (Write 1 to Clear Bit 1)
|
||||
// 注意:写 1 清 0 的设计,所以我们对 bit 1 写入 1
|
||||
ch->STATUS = STATUS_DONE_BIT;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,6 +20,8 @@
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#include "dma.h"
|
||||
|
||||
/* ─── BSP globals ─────────────────────────────────────────────────── */
|
||||
unsigned long UART_BASE = 0xbf000000;
|
||||
unsigned long CONFREG_TIMER_BASE = 0xbf20f100;
|
||||
@@ -41,6 +43,9 @@ unsigned long CORE_CLOCKS_PER_SEC = 33000000L;
|
||||
#define MLKEM_RDB_SEL (MLKEM_BASE + 0x10C) /* RW 0=ek 1=dk_pke 2=dk 3=ct */
|
||||
#define MLKEM_RDB_ADR (MLKEM_BASE + 0x110) /* RW output byte index */
|
||||
#define MLKEM_RDB_DAT (MLKEM_BASE + 0x114) /* R selected byte (low 8b) */
|
||||
#define MLKEM_EK_WINDOW (MLKEM_BASE + 0x1000) /* W preload ek, R read ek */
|
||||
#define MLKEM_DK_WINDOW (MLKEM_BASE + 0x2000) /* W preload dk, R read dk */
|
||||
#define MLKEM_CT_WINDOW (MLKEM_BASE + 0x3000) /* W preload c, R read ct */
|
||||
|
||||
#define CTRL_START 0x1
|
||||
#define STATUS_BUSY 0x1
|
||||
@@ -70,6 +75,8 @@ unsigned long CORE_CLOCKS_PER_SEC = 33000000L;
|
||||
/* ─── Convenience macros ──────────────────────────────────────────── */
|
||||
#define REG_WR(addr, val) (*(volatile uint32_t *)(addr) = (uint32_t)(val))
|
||||
#define REG_RD(addr) (*(volatile uint32_t *)(addr))
|
||||
#define PHYS_ADDR(addr) ((uint32_t)(addr) & 0x1FFFFFFFu)
|
||||
#define UNCACHED_ADDR(addr) ((PHYS_ADDR(addr)) | 0xA0000000u)
|
||||
|
||||
/* PLACEHOLDER */
|
||||
|
||||
@@ -149,6 +156,39 @@ static void readback(uint32_t sel, uint8_t *buf, int n)
|
||||
|
||||
/* PLACEHOLDER2 */
|
||||
|
||||
static volatile uint8_t *uncached_u8(uint8_t *buf)
|
||||
{
|
||||
return (volatile uint8_t *)UNCACHED_ADDR(buf);
|
||||
}
|
||||
|
||||
static void dma_to_mlkem(uint32_t dst_window, volatile uint8_t *src, int n)
|
||||
{
|
||||
dma_start_transfer(0, PHYS_ADDR(src), PHYS_ADDR(dst_window), (uint32_t)n, 0);
|
||||
dma_wait_polling(0);
|
||||
}
|
||||
|
||||
static void dma_from_mlkem(volatile uint8_t *dst, uint32_t src_window, int n)
|
||||
{
|
||||
dma_start_transfer(0, PHYS_ADDR(src_window), PHYS_ADDR(dst), (uint32_t)n, 0);
|
||||
dma_wait_polling(0);
|
||||
}
|
||||
|
||||
static void print_hex_uc(const char *label, volatile uint8_t *b, int n)
|
||||
{
|
||||
int i;
|
||||
printf("%s", label);
|
||||
for (i = 0; i < n; i++)
|
||||
printf("%02x", b[i]);
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
static void clear_uc(volatile uint8_t *b, int n)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < n; i++)
|
||||
b[i] = 0;
|
||||
}
|
||||
|
||||
/* Arbitrary but fixed test seeds / message (32 bytes each). */
|
||||
static uint8_t SEED_D[32] = {
|
||||
0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,
|
||||
@@ -163,9 +203,9 @@ static uint8_t MSG_M[32] = {
|
||||
0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF
|
||||
};
|
||||
|
||||
static uint8_t ek[EK_BYTES];
|
||||
static uint8_t dk[DK_BYTES];
|
||||
static uint8_t ct[CT_BYTES];
|
||||
static uint8_t ek[EK_BYTES] __attribute__((aligned(64)));
|
||||
static uint8_t dk[DK_BYTES] __attribute__((aligned(64)));
|
||||
static uint8_t ct[CT_BYTES] __attribute__((aligned(64)));
|
||||
static uint8_t ss_enc[32];
|
||||
static uint8_t ss_dec[32];
|
||||
|
||||
@@ -181,6 +221,9 @@ static void print_hex(const char *label, const uint8_t *b, int n)
|
||||
int main(void)
|
||||
{
|
||||
int i, mismatch;
|
||||
volatile uint8_t *ek_uc = uncached_u8(ek);
|
||||
volatile uint8_t *dk_uc = uncached_u8(dk);
|
||||
volatile uint8_t *ct_uc = uncached_u8(ct);
|
||||
|
||||
printf("MLKEM_START\n");
|
||||
|
||||
@@ -188,21 +231,21 @@ int main(void)
|
||||
write_block32(MLKEM_D, SEED_D);
|
||||
write_block32(MLKEM_Z, SEED_Z);
|
||||
run_op(OP_KEYGEN);
|
||||
readback(RDB_EK, ek, EK_BYTES);
|
||||
readback(RDB_DK, dk, DK_BYTES);
|
||||
print_hex("EK32=", ek, 32); /* first 32 bytes as a fingerprint */
|
||||
dma_from_mlkem(ek_uc, MLKEM_EK_WINDOW, EK_BYTES);
|
||||
dma_from_mlkem(dk_uc, MLKEM_DK_WINDOW, DK_BYTES);
|
||||
print_hex_uc("EK32=", ek_uc, 32); /* first 32 bytes as a fingerprint */
|
||||
|
||||
/* ── 2. Encaps: ek + msg -> ss, ct ────────────────────────────── */
|
||||
preload(PRE_EK, ek, EK_BYTES);
|
||||
dma_to_mlkem(MLKEM_EK_WINDOW, ek_uc, EK_BYTES);
|
||||
write_block32(MLKEM_MSG, MSG_M);
|
||||
run_op(OP_ENCAPS);
|
||||
read_block32(MLKEM_SS, ss_enc);
|
||||
readback(RDB_CT, ct, CT_BYTES);
|
||||
dma_from_mlkem(ct_uc, MLKEM_CT_WINDOW, CT_BYTES);
|
||||
print_hex("SS_ENC=", ss_enc, 32);
|
||||
|
||||
/* ── 3. Decaps: dk + ct -> ss' ────────────────────────────────── */
|
||||
preload(PRE_DK, dk, DK_BYTES);
|
||||
preload(PRE_C, ct, CT_BYTES);
|
||||
dma_to_mlkem(MLKEM_DK_WINDOW, dk_uc, DK_BYTES);
|
||||
dma_to_mlkem(MLKEM_CT_WINDOW, ct_uc, CT_BYTES);
|
||||
run_op(OP_DECAPS);
|
||||
read_block32(MLKEM_SS, ss_dec);
|
||||
print_hex("SS_DEC=", ss_dec, 32);
|
||||
@@ -223,9 +266,9 @@ int main(void)
|
||||
SEED_D[2] = 0;
|
||||
SEED_Z[2] = 0;
|
||||
MSG_M[2] = 0;
|
||||
memset(ek, 0, sizeof(ek));
|
||||
memset(dk, 0, sizeof(dk));
|
||||
memset(ct, 0, sizeof(ct));
|
||||
clear_uc(ek_uc, sizeof(ek));
|
||||
clear_uc(dk_uc, sizeof(dk));
|
||||
clear_uc(ct_uc, sizeof(ct));
|
||||
memset(ss_enc, 0, sizeof(ss_enc));
|
||||
memset(ss_dec, 0, sizeof(ss_dec));
|
||||
|
||||
@@ -233,21 +276,21 @@ int main(void)
|
||||
write_block32(MLKEM_D, SEED_D);
|
||||
write_block32(MLKEM_Z, SEED_Z);
|
||||
run_op(OP_KEYGEN);
|
||||
readback(RDB_EK, ek, EK_BYTES);
|
||||
readback(RDB_DK, dk, DK_BYTES);
|
||||
print_hex("EK32=", ek, 32); /* first 32 bytes as a fingerprint */
|
||||
dma_from_mlkem(ek_uc, MLKEM_EK_WINDOW, EK_BYTES);
|
||||
dma_from_mlkem(dk_uc, MLKEM_DK_WINDOW, DK_BYTES);
|
||||
print_hex_uc("EK32=", ek_uc, 32); /* first 32 bytes as a fingerprint */
|
||||
|
||||
/* ── 2. Encaps: ek + msg -> ss, ct ────────────────────────────── */
|
||||
preload(PRE_EK, ek, EK_BYTES);
|
||||
dma_to_mlkem(MLKEM_EK_WINDOW, ek_uc, EK_BYTES);
|
||||
write_block32(MLKEM_MSG, MSG_M);
|
||||
run_op(OP_ENCAPS);
|
||||
read_block32(MLKEM_SS, ss_enc);
|
||||
readback(RDB_CT, ct, CT_BYTES);
|
||||
dma_from_mlkem(ct_uc, MLKEM_CT_WINDOW, CT_BYTES);
|
||||
print_hex("SS_ENC=", ss_enc, 32);
|
||||
|
||||
/* ── 3. Decaps: dk + ct -> ss' ────────────────────────────────── */
|
||||
preload(PRE_DK, dk, DK_BYTES);
|
||||
preload(PRE_C, ct, CT_BYTES);
|
||||
dma_to_mlkem(MLKEM_DK_WINDOW, dk_uc, DK_BYTES);
|
||||
dma_to_mlkem(MLKEM_CT_WINDOW, ct_uc, CT_BYTES);
|
||||
run_op(OP_DECAPS);
|
||||
read_block32(MLKEM_SS, ss_dec);
|
||||
print_hex("SS_DEC=", ss_dec, 32);
|
||||
|
||||
Reference in New Issue
Block a user