/** | |||||
/* | |||||
!/.gitignore | !/.gitignore | ||||
!/Examples/ | !/Examples/ |
*.elf | |||||
*.list | |||||
*.bin | |||||
*.map | |||||
*.d | |||||
*.o | |||||
!vector.o | |||||
!elmoasmfunctions.o |
## | |||||
## University of Bristol – Open Access Software Licence | |||||
## Copyright (c) 2016, The University of Bristol, a chartered | |||||
## corporation having Royal Charter number RC000648 and a charity | |||||
## (number X1121) and its place of administration being at Senate | |||||
## House, Tyndall Avenue, Bristol, BS8 1TH, United Kingdom. | |||||
## All rights reserved | |||||
## | |||||
## Redistribution and use in source and binary forms, with or without | |||||
## modification, are permitted provided that the following conditions | |||||
## are met: | |||||
## | |||||
## 1. Redistributions of source code must retain the above copyright | |||||
## notice, this list of conditions and the following disclaimer. | |||||
## | |||||
## 2. Redistributions in binary form must reproduce the above | |||||
## copyright notice, this list of conditions and the following | |||||
## disclaimer in the documentation and/or other materials provided | |||||
## with the distribution. | |||||
## | |||||
## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | |||||
## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | |||||
## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | |||||
## FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE | |||||
## COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, | |||||
## INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | |||||
## (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | |||||
## SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | |||||
## HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, | |||||
## STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | |||||
## ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED | |||||
## OF THE POSSIBILITY OF SUCH DAMAGE. | |||||
## | |||||
## Any use of the software for scientific publications or commercial | |||||
## purposes should be reported to the University of Bristol | |||||
## (OSI-notifications@bristol.ac.uk and quote reference 2668). This is | |||||
## for impact and usage monitoring purposes only. | |||||
## | |||||
## Enquiries about further applications and development opportunities | |||||
## are welcome. Please contact elisabeth.oswald@bristol.ac.uk | |||||
## | |||||
## | |||||
## This file was based on files that are part of the libopencm3 project. | |||||
## See below for licecning information. | |||||
## | |||||
## Copyright (C) 2009 Uwe Hermann <uwe@hermann-uwe.de> | |||||
## Copyright (C) 2010 Piotr Esden-Tempski <piotr@esden.net> | |||||
## Copyright (C) 2011 Fergus Noble <fergusnoble@gmail.com> | |||||
## | |||||
## This library is free software: you can redistribute it and/or modify | |||||
## it under the terms of the GNU Lesser General Public License as published by | |||||
## the Free Software Foundation, either version 3 of the License, or | |||||
## (at your option) any later version. | |||||
## | |||||
## This library is distributed in the hope that it will be useful, | |||||
## but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
## GNU Lesser General Public License for more details. | |||||
## | |||||
## You should have received a copy of the GNU Lesser General Public License | |||||
## along with this library. If not, see <http://www.gnu.org/licenses/>. | |||||
# Remove to display makefile output | |||||
Q := @ | |||||
BINARY = project | |||||
FP_FLAGS ?= -msoft-float | |||||
ARCH_FLAGS = -mthumb -mcpu=cortex-m0 $(FP_FLAGS) | |||||
############################################################################### | |||||
# Executables | |||||
PREFIX ?= arm-none-eabi | |||||
CC := $(PREFIX)-gcc | |||||
LD := $(PREFIX)-gcc | |||||
OBJCOPY := $(PREFIX)-objcopy | |||||
OBJDUMP := $(PREFIX)-objdump | |||||
############################################################################### | |||||
# Source files | |||||
LDSCRIPT = $(BINARY).ld | |||||
#OBJS += $(BINARY).o | |||||
ELMOASMFUNCTIONS = elmoasmfunctions.o | |||||
#!!! PLEASE ADD YOUR SOURCES, HEADERS AND OBJECTS HERE !!! | |||||
SOURCES = ntt.c poly.c polyvec.c reduce.c $(BINARY).c | |||||
HEADERS = ntt.h poly.h polyvec.h reduce.h params.h | |||||
OBJECTS = ntt.o poly.o polyvec.o reduce.o $(BINARY).o | |||||
############################################################################### | |||||
# C flags | |||||
CFLAGS += -Os -g | |||||
CFLAGS += -Wextra -Wshadow -Wimplicit-function-declaration | |||||
CFLAGS += -Wredundant-decls -Wmissing-prototypes -Wstrict-prototypes | |||||
CFLAGS += -fno-common -ffunction-sections -fdata-sections | |||||
############################################################################### | |||||
# C & C++ preprocessor common flags | |||||
CPPFLAGS += -MD | |||||
CPPFLAGS += -Wall -Wundef | |||||
############################################################################### | |||||
# Linker flags | |||||
LDFLAGS += --static -nostartfiles | |||||
LDFLAGS += -T$(LDSCRIPT) | |||||
LDFLAGS += -Wl,-Map=$(*).map | |||||
LDFLAGS += -Wl,--gc-sections | |||||
############################################################################### | |||||
# Used libraries | |||||
LDLIBS += -Wl,--start-group -lc -lgcc -lnosys -Wl,--end-group | |||||
############################################################################### | |||||
############################################################################### | |||||
############################################################################### | |||||
all: elf bin list | |||||
elf: $(BINARY).elf | |||||
bin: $(BINARY).bin | |||||
list: $(BINARY).list | |||||
images: $(BINARY).images | |||||
$(BINARY).images: $(BINARY).bin $(BINARY).list $(BINARY).map | |||||
$(BINARY).bin: $(BINARY).elf | |||||
$(Q)$(OBJCOPY) -Obinary $(BINARY).elf $(BINARY).bin | |||||
$(BINARY).list: $(BINARY).elf | |||||
$(Q)$(OBJDUMP) -S $(BINARY).elf > $(BINARY).list | |||||
$(BINARY).elf $(BINARY).map: $(OBJECTS) $(LDSCRIPT) | |||||
$(Q)$(LD) $(LDFLAGS) vector.o $(ARCH_FLAGS) $(OBJECTS) $(ELMOASMFUNCTIONS) $(LDLIBS) -o $(BINARY).elf | |||||
%.o: %.c $(HEADER) | |||||
$(Q)$(CC) $(CFLAGS) $(CPPFLAGS) $(ARCH_FLAGS) -c -o $@ $< | |||||
clean: | |||||
$(Q)$(RM) $(OBJECTS) $(BINARY).d $(BINARY).elf $(BINARY).bin $(BINARY).list $(BINARY).map |
## | |||||
## University of Bristol – Open Access Software Licence | |||||
## Copyright (c) 2016, The University of Bristol, a chartered | |||||
## corporation having Royal Charter number RC000648 and a charity | |||||
## (number X1121) and its place of administration being at Senate | |||||
## House, Tyndall Avenue, Bristol, BS8 1TH, United Kingdom. | |||||
## All rights reserved | |||||
## | |||||
## Redistribution and use in source and binary forms, with or without | |||||
## modification, are permitted provided that the following conditions | |||||
## are met: | |||||
## | |||||
## 1. Redistributions of source code must retain the above copyright | |||||
## notice, this list of conditions and the following disclaimer. | |||||
## | |||||
## 2. Redistributions in binary form must reproduce the above | |||||
## copyright notice, this list of conditions and the following | |||||
## disclaimer in the documentation and/or other materials provided | |||||
## with the distribution. | |||||
## | |||||
## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | |||||
## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | |||||
## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | |||||
## FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE | |||||
## COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, | |||||
## INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | |||||
## (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | |||||
## SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | |||||
## HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, | |||||
## STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | |||||
## ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED | |||||
## OF THE POSSIBILITY OF SUCH DAMAGE. | |||||
## | |||||
## Any use of the software for scientific publications or commercial | |||||
## purposes should be reported to the University of Bristol | |||||
## (OSI-notifications@bristol.ac.uk and quote reference 2668). This is | |||||
## for impact and usage monitoring purposes only. | |||||
## | |||||
## Enquiries about further applications and development opportunities | |||||
## are welcome. Please contact elisabeth.oswald@bristol.ac.uk | |||||
## | |||||
.syntax unified | |||||
.text | |||||
.thumb | |||||
.func starttrigger | |||||
.global starttrigger | |||||
starttrigger: | |||||
push {r0-r7} | |||||
movs r4, #0xE0 | |||||
lsls r4, #24 | |||||
movs r5, #0x04 | |||||
eors r4, r5 | |||||
movs r5, #1 | |||||
str r5, [r4, #0] | |||||
pop {r0-r7} | |||||
bx lr | |||||
.endfunc | |||||
.func endtrigger | |||||
.global endtrigger | |||||
endtrigger: | |||||
push {r0-r7} | |||||
movs r4, #0xE0 | |||||
lsls r4, #24 | |||||
movs r5, #0x04 | |||||
eors r4, r5 | |||||
movs r5, #0 | |||||
str r5, [r4, #0] | |||||
pop {r0-r7} | |||||
bx lr | |||||
.endfunc | |||||
.func readbyte | |||||
.global readbyte | |||||
readbyte: | |||||
push {r0-r7} | |||||
movs r4, #0xE1 | |||||
lsls r4, #24 | |||||
ldr r1, [r4, #0] | |||||
strb r1, [r0, #0] | |||||
pop {r0-r7} | |||||
bx lr | |||||
.endfunc | |||||
.func LoadN | |||||
.global LoadN | |||||
LoadN: | |||||
push {r0-r7} | |||||
movs r4, #0xE1 | |||||
lsls r4, #24 | |||||
movs r5, #0x10 | |||||
eors r4, r5 | |||||
ldr r1, [r4, #0] | |||||
str r1, [r0, #0] | |||||
pop {r0-r7} | |||||
bx lr | |||||
.endfunc | |||||
.func randbyte | |||||
.global randbyte | |||||
randbyte: | |||||
push {r0-r7} | |||||
movs r4, #0xE1 | |||||
lsls r4, #24 | |||||
movs r5, #0x04 | |||||
eors r4, r5 | |||||
ldr r1, [r4, #0] | |||||
strb r1, [r0, #0] | |||||
pop {r0-r7} | |||||
bx lr | |||||
.endfunc | |||||
.func getstart | |||||
.global getstart | |||||
getstart: | |||||
push {r0-r7} | |||||
movs r4, #0xE1 | |||||
lsls r4, #24 | |||||
movs r5, #0x08 | |||||
eors r4, r5 | |||||
ldr r1, [r4, #0] | |||||
str r1, [r0, #0] | |||||
pop {r0-r7} | |||||
bx lr | |||||
.endfunc | |||||
.func getruncount | |||||
.global getruncount | |||||
getruncount: | |||||
push {r0-r7} | |||||
movs r4, #0xE1 | |||||
lsls r4, #24 | |||||
movs r5, #0x0C | |||||
eors r4, r5 | |||||
ldr r1, [r4, #0] | |||||
str r1, [r0, #0] | |||||
pop {r0-r7} | |||||
bx lr | |||||
.endfunc | |||||
.func printbyte | |||||
.global printbyte | |||||
printbyte: | |||||
push {r0-r7} | |||||
movs r4, #0xE0 | |||||
lsls r4, #24 | |||||
ldrb r5, [r0] | |||||
str r5, [r4] | |||||
pop {r0-r7} | |||||
bx lr | |||||
.endfunc | |||||
.func endprogram | |||||
.global endprogram | |||||
endprogram: | |||||
push {r0-r7} | |||||
movs r4, #0xF0 | |||||
lsls r4, #24 | |||||
movs r5, #0 | |||||
str r5, [r4] | |||||
pop {r0-r7} | |||||
bx lr | |||||
.endfunc | |||||
.func initialisemaskflow | |||||
.global initialisemaskflow | |||||
# Takes address of key as input (r0) | |||||
initialisemaskflow: | |||||
push {r0-r7} | |||||
movs r4, #0xE0 | |||||
lsls r4, #24 | |||||
movs r5, #0x40 | |||||
eors r4, r5 | |||||
str r0, [r4] | |||||
pop {r0-r7} | |||||
bx lr | |||||
.endfunc | |||||
.func resetmaskflow | |||||
.global resetmaskflow | |||||
resetmaskflow: | |||||
push {r0-r7} | |||||
movs r4, #0xE0 | |||||
lsls r4, #24 | |||||
movs r5, #0x42 | |||||
eors r4, r5 | |||||
movs r5, #0 | |||||
str r5, [r4] | |||||
pop {r0-r7} | |||||
bx lr | |||||
.endfunc | |||||
.func setmaskflowstart | |||||
.global setmaskflowstart | |||||
# Takes r0 as start number | |||||
setmaskflowstart: | |||||
push {r0-r7} | |||||
movs r4, #0xE0 | |||||
lsls r4, #24 | |||||
movs r5, #0x44 | |||||
eors r4, r5 | |||||
str r0, [r4] | |||||
pop {r0-r7} | |||||
bx lr | |||||
.endfunc | |||||
.func resetdatafile | |||||
.global resetdatafile | |||||
resetdatafile: | |||||
push {r0-r7} | |||||
movs r4, #0xE0 | |||||
lsls r4, #24 | |||||
movs r5, #0x46 | |||||
eors r4, r5 | |||||
movs r5, #0 | |||||
str r5, [r4] | |||||
pop {r0-r7} | |||||
bx lr | |||||
.endfunc |
#include "elmoasmfunctionsdef.h" | |||||
// Extension of the ELMO API for 2-bytes types | |||||
static void rand2bytes(uint16_t* elt) { | |||||
randbyte((uint8_t*) elt+1); | |||||
randbyte((uint8_t*) elt); | |||||
} | |||||
static void print2bytes(uint16_t* elt) { | |||||
printbyte((uint8_t*) elt+1); | |||||
printbyte((uint8_t*) elt); | |||||
} | |||||
static void read2bytes(uint16_t* elt) { | |||||
readbyte((uint8_t*) elt+1); | |||||
readbyte((uint8_t*) elt); | |||||
} | |||||
// Extension of the ELMO API for 4-bytes types | |||||
static void rand4bytes(uint32_t* elt) { | |||||
randbyte((uint8_t*) elt+3); | |||||
randbyte((uint8_t*) elt+2); | |||||
randbyte((uint8_t*) elt+1); | |||||
randbyte((uint8_t*) elt); | |||||
} | |||||
static void print4bytes(uint32_t* elt) { | |||||
printbyte((uint8_t*) elt+3); | |||||
printbyte((uint8_t*) elt+2); | |||||
printbyte((uint8_t*) elt+1); | |||||
printbyte((uint8_t*) elt); | |||||
} | |||||
static void read4bytes(uint32_t* elt) { | |||||
readbyte((uint8_t*) elt+3); | |||||
readbyte((uint8_t*) elt+2); | |||||
readbyte((uint8_t*) elt+1); | |||||
readbyte((uint8_t*) elt); | |||||
} |
/* | |||||
* University of Bristol – Open Access Software Licence | |||||
* Copyright (c) 2016, The University of Bristol, a chartered | |||||
* corporation having Royal Charter number RC000648 and a charity | |||||
* (number X1121) and its place of administration being at Senate | |||||
* House, Tyndall Avenue, Bristol, BS8 1TH, United Kingdom. | |||||
* All rights reserved | |||||
* | |||||
* Redistribution and use in source and binary forms, with or without | |||||
* modification, are permitted provided that the following conditions | |||||
* are met: | |||||
* | |||||
* 1. Redistributions of source code must retain the above copyright | |||||
* notice, this list of conditions and the following disclaimer. | |||||
* | |||||
* 2. Redistributions in binary form must reproduce the above | |||||
* copyright notice, this list of conditions and the following | |||||
* disclaimer in the documentation and/or other materials provided | |||||
* with the distribution. | |||||
* | |||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | |||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | |||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | |||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE | |||||
* COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, | |||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | |||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | |||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | |||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, | |||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | |||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED | |||||
* OF THE POSSIBILITY OF SUCH DAMAGE. | |||||
* | |||||
* Any use of the software for scientific publications or commercial | |||||
* purposes should be reported to the University of Bristol | |||||
* (OSI-notifications@bristol.ac.uk and quote reference 2668). This is | |||||
* for impact and usage monitoring purposes only. | |||||
* | |||||
* Enquiries about further applications and development opportunities | |||||
* are welcome. Please contact elisabeth.oswald@bristol.ac.uk | |||||
*/ | |||||
extern void starttrigger(void); | |||||
extern void endtrigger(void); | |||||
extern void randbyte(unsigned char * pointer); | |||||
extern void LoadN(void* addr); | |||||
extern void readbyte(unsigned char * pointer); | |||||
extern void printbyte(unsigned char * pointer); | |||||
extern void endprogram(void); | |||||
extern void getstart(unsigned int * pointer); | |||||
extern void getruncount(unsigned int * pointer); | |||||
extern void initialisemaskflow(unsigned char * pointer); | |||||
extern void resetmaskflow(void); | |||||
extern void setmaskflowstart(unsigned int start); | |||||
extern void resetdatafile(void); |
#include <stdint.h> | |||||
#include "params.h" | |||||
#include "ntt.h" | |||||
#include "reduce.h" | |||||
int16_t zetas[128] = { | |||||
2285, 2571, 2970, 1812, 1493, 1422, 287, 202, 3158, 622, 1577, 182, 962, 2127, 1855, 1468, | |||||
573, 2004, 264, 383, 2500, 1458, 1727, 3199, 2648, 1017, 732, 608, 1787, 411, 3124, 1758, | |||||
1223, 652, 2777, 1015, 2036, 1491, 3047, 1785, 516, 3321, 3009, 2663, 1711, 2167, 126, 1469, | |||||
2476, 3239, 3058, 830, 107, 1908, 3082, 2378, 2931, 961, 1821, 2604, 448, 2264, 677, 2054, | |||||
2226, 430, 555, 843, 2078, 871, 1550, 105, 422, 587, 177, 3094, 3038, 2869, 1574, 1653, | |||||
3083, 778, 1159, 3182, 2552, 1483, 2727, 1119, 1739, 644, 2457, 349, 418, 329, 3173, 3254, | |||||
817, 1097, 603, 610, 1322, 2044, 1864, 384, 2114, 3193, 1218, 1994, 2455, 220, 2142, 1670, | |||||
2144, 1799, 2051, 794, 1819, 2475, 2459, 478, 3221, 3021, 996, 991, 958, 1869, 1522, 1628}; | |||||
/************************************************* | |||||
* Name: fqmul | |||||
* | |||||
* Description: Multiplication followed by Montgomery reduction | |||||
* | |||||
* Arguments: - int16_t a: first factor | |||||
* - int16_t b: second factor | |||||
* | |||||
* Returns 16-bit integer congruent to a*b*R^{-1} mod q | |||||
**************************************************/ | |||||
static int16_t fqmul(int16_t a, int16_t b) { | |||||
return montgomery_reduce((int32_t)a*b); | |||||
} | |||||
/************************************************* | |||||
* Name: ntt | |||||
* | |||||
* Description: Inplace number-theoretic transform (NTT) in Rq | |||||
* input is in standard order, output is in bitreversed order | |||||
* | |||||
* Arguments: - int16_t r[256]: pointer to input/output vector of elements of Zq | |||||
**************************************************/ | |||||
void ntt(int16_t r[256]) { | |||||
unsigned int len, start, j, k; | |||||
int16_t t, zeta; | |||||
k = 1; | |||||
for(len = 128; len >= 2; len >>= 1) { | |||||
for(start = 0; start < 256; start = j + len) { | |||||
zeta = zetas[k++]; | |||||
for(j = start; j < start + len; ++j) { | |||||
t = fqmul(zeta, r[j + len]); | |||||
r[j + len] = r[j] - t; | |||||
r[j] = r[j] + t; | |||||
} | |||||
} | |||||
} | |||||
} | |||||
#ifndef NTT_H | |||||
#define NTT_H | |||||
#include <stdint.h> | |||||
extern int16_t zetas[128]; | |||||
void ntt(int16_t *poly); | |||||
#endif |
#ifndef PARAMS_H | |||||
#define PARAMS_H | |||||
#ifndef KYBER_K | |||||
#define KYBER_K 2 /* Change this for different security strengths */ | |||||
#endif | |||||
/* Don't change parameters below this line */ | |||||
#define KYBER_N 256 | |||||
#define KYBER_Q 3329 | |||||
#define KYBER_ETA 2 | |||||
#define KYBER_SYMBYTES 32 /* size in bytes of hashes, and seeds */ | |||||
#define KYBER_SSBYTES 32 /* size in bytes of shared key */ | |||||
#define KYBER_POLYBYTES 384 | |||||
#define KYBER_POLYVECBYTES (KYBER_K * KYBER_POLYBYTES) | |||||
#if KYBER_K == 2 | |||||
#define KYBER_POLYCOMPRESSEDBYTES 96 | |||||
#define KYBER_POLYVECCOMPRESSEDBYTES (KYBER_K * 320) | |||||
#elif KYBER_K == 3 | |||||
#define KYBER_POLYCOMPRESSEDBYTES 128 | |||||
#define KYBER_POLYVECCOMPRESSEDBYTES (KYBER_K * 320) | |||||
#elif KYBER_K == 4 | |||||
#define KYBER_POLYCOMPRESSEDBYTES 160 | |||||
#define KYBER_POLYVECCOMPRESSEDBYTES (KYBER_K * 352) | |||||
#endif | |||||
#define KYBER_INDCPA_MSGBYTES KYBER_SYMBYTES | |||||
#define KYBER_INDCPA_PUBLICKEYBYTES (KYBER_POLYVECBYTES + KYBER_SYMBYTES) | |||||
#define KYBER_INDCPA_SECRETKEYBYTES (KYBER_POLYVECBYTES) | |||||
#define KYBER_INDCPA_BYTES (KYBER_POLYVECCOMPRESSEDBYTES + KYBER_POLYCOMPRESSEDBYTES) | |||||
#define KYBER_PUBLICKEYBYTES (KYBER_INDCPA_PUBLICKEYBYTES) | |||||
#define KYBER_SECRETKEYBYTES (KYBER_INDCPA_SECRETKEYBYTES + KYBER_INDCPA_PUBLICKEYBYTES + 2*KYBER_SYMBYTES) /* 32 bytes of additional space to save H(pk) */ | |||||
#define KYBER_CIPHERTEXTBYTES KYBER_INDCPA_BYTES | |||||
#endif |
#include <stdint.h> | |||||
#include "params.h" | |||||
#include "poly.h" | |||||
#include "ntt.h" | |||||
#include "reduce.h" | |||||
/************************************************* | |||||
* Name: poly_ntt | |||||
* | |||||
* Description: Computes negacyclic number-theoretic transform (NTT) of | |||||
* a polynomial in place; | |||||
* inputs assumed to be in normal order, output in bitreversed order | |||||
* | |||||
* Arguments: - uint16_t *r: pointer to in/output polynomial | |||||
**************************************************/ | |||||
void poly_ntt(poly *r) | |||||
{ | |||||
ntt(r->coeffs); | |||||
poly_reduce(r); | |||||
} | |||||
/************************************************* | |||||
* Name: poly_reduce | |||||
* | |||||
* Description: Applies Barrett reduction to all coefficients of a polynomial | |||||
* for details of the Barrett reduction see comments in reduce.c | |||||
* | |||||
* Arguments: - poly *r: pointer to input/output polynomial | |||||
**************************************************/ | |||||
void poly_reduce(poly *r) | |||||
{ | |||||
int i; | |||||
for(i=0;i<KYBER_N;i++) | |||||
r->coeffs[i] = barrett_reduce(r->coeffs[i]); | |||||
} | |||||
#ifndef POLY_H | |||||
#define POLY_H | |||||
#include <stdint.h> | |||||
#include "params.h" | |||||
/* | |||||
* Elements of R_q = Z_q[X]/(X^n + 1). Represents polynomial | |||||
* coeffs[0] + X*coeffs[1] + X^2*xoeffs[2] + ... + X^{n-1}*coeffs[n-1] | |||||
*/ | |||||
typedef struct{ | |||||
int16_t coeffs[KYBER_N]; | |||||
} poly; | |||||
void poly_ntt(poly *r); | |||||
void poly_reduce(poly *r); | |||||
#endif |
#include <stdint.h> | |||||
#include "polyvec.h" | |||||
#include "poly.h" | |||||
/************************************************* | |||||
* Name: polyvec_ntt | |||||
* | |||||
* Description: Apply forward NTT to all elements of a vector of polynomials | |||||
* | |||||
* Arguments: - polyvec *r: pointer to in/output vector of polynomials | |||||
**************************************************/ | |||||
void polyvec_ntt(polyvec *r) | |||||
{ | |||||
int i; | |||||
for(i=0;i<KYBER_K;i++) | |||||
poly_ntt(&r->vec[i]); | |||||
} |
#ifndef POLYVEC_H | |||||
#define POLYVEC_H | |||||
#include "params.h" | |||||
#include "poly.h" | |||||
typedef struct{ | |||||
poly vec[KYBER_K]; | |||||
} polyvec; | |||||
void polyvec_ntt(polyvec *r); | |||||
#endif |
#include <stdio.h> | |||||
#include <stdlib.h> | |||||
#include "elmoasmfunctionsdef-extension.h" | |||||
// ELMO API : | |||||
// - printbyte(addr): Print single byte located at address 'addr' to output file; | |||||
// - randbyte(addr): Load byte of random to memory address 'addr'; | |||||
// - readbyte(addr): Read byte from input file to address 'addr'. | |||||
// ELMO API (extension) : | |||||
// - print2bytes, rand2bytes and read2bytes: idem, but for an address pointing on 2 bytes; | |||||
// - print4bytes, rand4bytes and read4bytes: idem, but for an address pointing on 4 bytes. | |||||
#include "polyvec.h" | |||||
#include "params.h" | |||||
int main(void) { | |||||
uint16_t num_challenge, nb_challenges; | |||||
int j, k; | |||||
polyvec skpv; | |||||
read2bytes(&nb_challenges); | |||||
for(num_challenge=0; num_challenge<nb_challenges; num_challenge++) { | |||||
// Load the private vector s | |||||
for(j=0;j<KYBER_K;j++) | |||||
for(k=0;k<KYBER_N;k++) | |||||
read2bytes((uint16_t*) &skpv.vec[j].coeffs[k]); | |||||
starttrigger(); // To start a new trace | |||||
// Do the leaking operations here... | |||||
polyvec_ntt(&skpv); | |||||
endtrigger(); // To end the current trace | |||||
// Print the results of the computation | |||||
for(j=0;j<KYBER_K;j++) | |||||
for(k=0;k<KYBER_N;k++) | |||||
print2bytes((uint16_t*) &skpv.vec[j].coeffs[k]); | |||||
} | |||||
endprogram(); // To indicate to ELMO that the simulation is finished | |||||
return 0; | |||||
} |
/* | |||||
* University of Bristol – Open Access Software Licence | |||||
* Copyright (c) 2016, The University of Bristol, a chartered | |||||
* corporation having Royal Charter number RC000648 and a charity | |||||
* (number X1121) and its place of administration being at Senate | |||||
* House, Tyndall Avenue, Bristol, BS8 1TH, United Kingdom. | |||||
* All rights reserved | |||||
* | |||||
* Redistribution and use in source and binary forms, with or without | |||||
* modification, are permitted provided that the following conditions | |||||
* are met: | |||||
* | |||||
* 1. Redistributions of source code must retain the above copyright | |||||
* notice, this list of conditions and the following disclaimer. | |||||
* | |||||
* 2. Redistributions in binary form must reproduce the above | |||||
* copyright notice, this list of conditions and the following | |||||
* disclaimer in the documentation and/or other materials provided | |||||
* with the distribution. | |||||
* | |||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | |||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | |||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | |||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE | |||||
* COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, | |||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | |||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | |||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | |||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, | |||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | |||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED | |||||
* OF THE POSSIBILITY OF SUCH DAMAGE. | |||||
* | |||||
* Any use of the software for scientific publications or commercial | |||||
* purposes should be reported to the University of Bristol | |||||
* (OSI-notifications@bristol.ac.uk and quote reference 2668). This is | |||||
* for impact and usage monitoring purposes only. | |||||
* | |||||
* Enquiries about further applications and development opportunities | |||||
* are welcome. Please contact elisabeth.oswald@bristol.ac.uk | |||||
*/ | |||||
/* | |||||
* This file was based on files that are part of the libopencm3 project. | |||||
* See below for licecning information. | |||||
* | |||||
* Copyright (C) 2009 Uwe Hermann <uwe@hermann-uwe.de> | |||||
* Copyright (C) 2011 Stephen Caudle <scaudle@doceme.com> | |||||
* | |||||
* This library is free software: you can redistribute it and/or modify | |||||
* it under the terms of the GNU Lesser General Public License as published by | |||||
* the Free Software Foundation, either version 3 of the License, or | |||||
* (at your option) any later version. | |||||
* | |||||
* This library is distributed in the hope that it will be useful, | |||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
* GNU Lesser General Public License for more details. | |||||
* | |||||
* You should have received a copy of the GNU Lesser General Public License | |||||
* along with this library. If not, see <http://www.gnu.org/licenses/>. | |||||
*/ | |||||
/* Linker script for ST STM32F0DISCOVERY (STM32F051R8T6, 64K flash, 8K RAM). */ | |||||
/* Define memory regions. */ | |||||
MEMORY | |||||
{ | |||||
rom (rx) : ORIGIN = 0x08000000, LENGTH = 64K | |||||
ram (rwx) : ORIGIN = 0x20000000, LENGTH = 8K | |||||
} | |||||
/* Generic linker script for STM32 targets using libopencm3. */ | |||||
/* Memory regions must be defined in the ld script which includes this one. */ | |||||
/* Enforce emmition of the vector table. */ | |||||
EXTERN (vector_table) | |||||
/* Define the entry point of the output file. */ | |||||
ENTRY(reset_handler) | |||||
/* Define sections. */ | |||||
SECTIONS | |||||
{ | |||||
.text : { | |||||
*(.vectors) /* Vector table */ | |||||
*(.text*) /* Program code */ | |||||
. = ALIGN(4); | |||||
*(.rodata*) /* Read-only data */ | |||||
. = ALIGN(4); | |||||
} >rom | |||||
/* C++ Static constructors/destructors, also used for __attribute__ | |||||
* ((constructor)) and the likes */ | |||||
.preinit_array : { | |||||
. = ALIGN(4); | |||||
__preinit_array_start = .; | |||||
KEEP (*(.preinit_array)) | |||||
__preinit_array_end = .; | |||||
} >rom | |||||
.init_array : { | |||||
. = ALIGN(4); | |||||
__init_array_start = .; | |||||
KEEP (*(SORT(.init_array.*))) | |||||
KEEP (*(.init_array)) | |||||
__init_array_end = .; | |||||
} >rom | |||||
.fini_array : { | |||||
. = ALIGN(4); | |||||
__fini_array_start = .; | |||||
KEEP (*(.fini_array)) | |||||
KEEP (*(SORT(.fini_array.*))) | |||||
__fini_array_end = .; | |||||
} >rom | |||||
/* | |||||
* Another section used by C++ stuff, appears when using newlib with | |||||
* 64bit (long long) printf support | |||||
*/ | |||||
.ARM.extab : { | |||||
*(.ARM.extab*) | |||||
} >rom | |||||
.ARM.exidx : { | |||||
__exidx_start = .; | |||||
*(.ARM.exidx*) | |||||
__exidx_end = .; | |||||
} >rom | |||||
. = ALIGN(4); | |||||
_etext = .; | |||||
.data : { | |||||
_data = .; | |||||
*(.data*) /* Read-write initialized data */ | |||||
. = ALIGN(4); | |||||
_edata = .; | |||||
} >ram AT >rom | |||||
_data_loadaddr = LOADADDR(.data); | |||||
.bss : { | |||||
*(.bss*) /* Read-write zero initialized data */ | |||||
*(COMMON) | |||||
. = ALIGN(4); | |||||
_ebss = .; | |||||
} >ram | |||||
/* | |||||
* The .eh_frame section appears to be used for C++ exception handling. | |||||
* You may need to fix this if you're using C++. | |||||
*/ | |||||
/DISCARD/ : { *(.eh_frame) } | |||||
. = ALIGN(4); | |||||
end = .; | |||||
} | |||||
PROVIDE(_stack = ORIGIN(ram) + LENGTH(ram)); | |||||
class KyberNTTSimulation(SimulationProject): | |||||
@classmethod | |||||
def get_binary(cl): | |||||
return 'project.bin' | |||||
def __init__(self, *args, **kwargs): | |||||
super().__init__(*args, **kwargs) | |||||
def set_input(self, input): | |||||
""" Write into the 'input' file of ELMO tool | |||||
the parameters and the challenges for the simulation """ | |||||
super().set_input(input) | |||||
def set_input_for_each_challenge(self, input, challenge): | |||||
""" Write into the 'input' file of ELMO tool | |||||
the 'challenge' for the simulation """ | |||||
secret = challenge | |||||
# Write the secret vector | |||||
for j in range(2): #k=2 for Kyber512 | |||||
for k in range(256): #n=256 for Kyber512 | |||||
write(input, secret[j,k]) |
#include <stdint.h> | |||||
#include "params.h" | |||||
#include "reduce.h" | |||||
/************************************************* | |||||
* Name: montgomery_reduce | |||||
* | |||||
* Description: Montgomery reduction; given a 32-bit integer a, computes | |||||
* 16-bit integer congruent to a * R^-1 mod q, | |||||
* where R=2^16 | |||||
* | |||||
* Arguments: - int32_t a: input integer to be reduced; has to be in {-q2^15,...,q2^15-1} | |||||
* | |||||
* Returns: integer in {-q+1,...,q-1} congruent to a * R^-1 modulo q. | |||||
**************************************************/ | |||||
int16_t montgomery_reduce(int32_t a) | |||||
{ | |||||
int32_t t; | |||||
int16_t u; | |||||
u = a * QINV; | |||||
t = (int32_t)u * KYBER_Q; | |||||
t = a - t; | |||||
t >>= 16; | |||||
return t; | |||||
} | |||||
/************************************************* | |||||
* Name: barrett_reduce | |||||
* | |||||
* Description: Barrett reduction; given a 16-bit integer a, computes | |||||
* 16-bit integer congruent to a mod q in {0,...,q} | |||||
* | |||||
* Arguments: - int16_t a: input integer to be reduced | |||||
* | |||||
* Returns: integer in {0,...,q} congruent to a modulo q. | |||||
**************************************************/ | |||||
int16_t barrett_reduce(int16_t a) { | |||||
int32_t t; | |||||
const int32_t v = (1U << 26)/KYBER_Q + 1; | |||||
t = v*a; | |||||
t >>= 26; | |||||
t *= KYBER_Q; | |||||
return a - t; | |||||
} |
#ifndef REDUCE_H | |||||
#define REDUCE_H | |||||
#include <stdint.h> | |||||
#define MONT 2285 // 2^16 % Q | |||||
#define QINV 62209 // q^(-1) mod 2^16 | |||||
int16_t montgomery_reduce(int32_t a); | |||||
int16_t barrett_reduce(int16_t a); | |||||
#endif |