mirror of
https://github.com/henrydcase/pqc.git
synced 2024-11-27 09:51:30 +00:00
171 lines
4.9 KiB
C
171 lines
4.9 KiB
C
|
#include "blas_u32.h"
|
||
|
#include "gf.h"
|
||
|
|
||
|
void PQCLEAN_RAINBOWIACYCLIC_CLEAN_gf256v_predicated_add_u32(uint8_t *accu_b, uint8_t predicate, const uint8_t *a, unsigned _num_byte) {
|
||
|
uint32_t pr_u32 = ((uint32_t) 0) - ((uint32_t) predicate);
|
||
|
uint8_t pr_u8 = pr_u32 & 0xff;
|
||
|
|
||
|
unsigned n_u32 = _num_byte >> 2;
|
||
|
uint32_t *b_u32 = (uint32_t *) accu_b;
|
||
|
const uint32_t *a_u32 = (const uint32_t *) a;
|
||
|
for (unsigned i = 0; i < n_u32; i++) {
|
||
|
b_u32[i] ^= (a_u32[i] & pr_u32);
|
||
|
}
|
||
|
|
||
|
a += (n_u32 << 2);
|
||
|
accu_b += (n_u32 << 2);
|
||
|
unsigned rem = _num_byte & 3;
|
||
|
for (unsigned i = 0; i < rem; i++) {
|
||
|
accu_b[i] ^= (a[i] & pr_u8);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void PQCLEAN_RAINBOWIACYCLIC_CLEAN_gf256v_add_u32(uint8_t *accu_b, const uint8_t *a, unsigned _num_byte) {
|
||
|
unsigned n_u32 = _num_byte >> 2;
|
||
|
uint32_t *b_u32 = (uint32_t *) accu_b;
|
||
|
const uint32_t *a_u32 = (const uint32_t *) a;
|
||
|
for (unsigned i = 0; i < n_u32; i++) {
|
||
|
b_u32[i] ^= a_u32[i];
|
||
|
}
|
||
|
|
||
|
a += (n_u32 << 2);
|
||
|
accu_b += (n_u32 << 2);
|
||
|
unsigned rem = _num_byte & 3;
|
||
|
for (unsigned i = 0; i < rem; i++) {
|
||
|
accu_b[i] ^= a[i];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
#ifdef _USE_GF16
|
||
|
|
||
|
void PQCLEAN_RAINBOWIACYCLIC_CLEAN_gf16v_mul_scalar_u32(uint8_t *a, uint8_t gf16_b, unsigned _num_byte) {
|
||
|
unsigned n_u32 = _num_byte >> 2;
|
||
|
uint32_t *a_u32 = (uint32_t *) a;
|
||
|
for (unsigned i = 0; i < n_u32; i++) {
|
||
|
a_u32[i] = PQCLEAN_RAINBOWIACYCLIC_CLEAN_gf16v_mul_u32(a_u32[i], gf16_b);
|
||
|
}
|
||
|
|
||
|
union tmp_32 {
|
||
|
uint8_t u8[4];
|
||
|
uint32_t u32;
|
||
|
} t;
|
||
|
t.u32 = 0;
|
||
|
a += (n_u32 << 2);
|
||
|
unsigned rem = _num_byte & 3;
|
||
|
for (unsigned i = 0; i < rem; i++) {
|
||
|
t.u8[i] = a[i];
|
||
|
}
|
||
|
t.u32 = PQCLEAN_RAINBOWIACYCLIC_CLEAN_gf16v_mul_u32(t.u32, gf16_b);
|
||
|
for (unsigned i = 0; i < rem; i++) {
|
||
|
a[i] = t.u8[i];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void PQCLEAN_RAINBOWIACYCLIC_CLEAN_gf16v_madd_u32(uint8_t *accu_c, const uint8_t *a, uint8_t gf16_b, unsigned _num_byte) {
|
||
|
unsigned n_u32 = _num_byte >> 2;
|
||
|
uint32_t *c_u32 = (uint32_t *) accu_c;
|
||
|
const uint32_t *a_u32 = (const uint32_t *) a;
|
||
|
for (unsigned i = 0; i < n_u32; i++) {
|
||
|
c_u32[i] ^= PQCLEAN_RAINBOWIACYCLIC_CLEAN_gf16v_mul_u32(a_u32[i], gf16_b);
|
||
|
}
|
||
|
|
||
|
union tmp_32 {
|
||
|
uint8_t u8[4];
|
||
|
uint32_t u32;
|
||
|
} t;
|
||
|
t.u32 = 0;
|
||
|
accu_c += (n_u32 << 2);
|
||
|
a += (n_u32 << 2);
|
||
|
unsigned rem = _num_byte & 3;
|
||
|
for (unsigned i = 0; i < rem; i++) {
|
||
|
t.u8[i] = a[i];
|
||
|
}
|
||
|
t.u32 = PQCLEAN_RAINBOWIACYCLIC_CLEAN_gf16v_mul_u32(t.u32, gf16_b);
|
||
|
for (unsigned i = 0; i < rem; i++) {
|
||
|
accu_c[i] ^= t.u8[i];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
uint8_t PQCLEAN_RAINBOWIACYCLIC_CLEAN_gf16v_dot_u32(const uint8_t *a, const uint8_t *b, unsigned _num_byte) {
|
||
|
unsigned n_u32 = _num_byte >> 2;
|
||
|
const uint32_t *a_u32 = (const uint32_t *) a;
|
||
|
const uint32_t *b_u32 = (const uint32_t *) b;
|
||
|
uint32_t r = 0;
|
||
|
for (unsigned i = 0; i < n_u32; i++) {
|
||
|
r ^= PQCLEAN_RAINBOWIACYCLIC_CLEAN_gf16v_mul_u32_u32(a_u32[i], b_u32[i]);
|
||
|
}
|
||
|
|
||
|
unsigned rem = _num_byte & 3;
|
||
|
if (rem) {
|
||
|
union tmp_32 {
|
||
|
uint8_t u8[4];
|
||
|
uint32_t u32;
|
||
|
} ta, tb;
|
||
|
ta.u32 = 0;
|
||
|
tb.u32 = 0;
|
||
|
for (unsigned i = 0; i < rem; i++) {
|
||
|
ta.u8[i] = a[(n_u32 << 2) + i];
|
||
|
}
|
||
|
for (unsigned i = 0; i < rem; i++) {
|
||
|
tb.u8[i] = b[(n_u32 << 2) + i];
|
||
|
}
|
||
|
r ^= PQCLEAN_RAINBOWIACYCLIC_CLEAN_gf16v_mul_u32_u32(ta.u32, tb.u32);
|
||
|
}
|
||
|
return PQCLEAN_RAINBOWIACYCLIC_CLEAN_gf16v_reduce_u32(r);
|
||
|
}
|
||
|
|
||
|
#else
|
||
|
|
||
|
|
||
|
void PQCLEAN_RAINBOWIACYCLIC_CLEAN_gf256v_mul_scalar_u32(uint8_t *a, uint8_t b, unsigned _num_byte) {
|
||
|
unsigned n_u32 = _num_byte >> 2;
|
||
|
uint32_t *a_u32 = (uint32_t *) a;
|
||
|
for (unsigned i = 0; i < n_u32; i++) {
|
||
|
a_u32[i] = PQCLEAN_RAINBOWIACYCLIC_CLEAN_gf256v_mul_u32(a_u32[i], b);
|
||
|
}
|
||
|
|
||
|
union tmp_32 {
|
||
|
uint8_t u8[4];
|
||
|
uint32_t u32;
|
||
|
} t;
|
||
|
t.u32 = 0;
|
||
|
a += (n_u32 << 2);
|
||
|
unsigned rem = _num_byte & 3;
|
||
|
for (unsigned i = 0; i < rem; i++) {
|
||
|
t.u8[i] = a[i];
|
||
|
}
|
||
|
t.u32 = PQCLEAN_RAINBOWIACYCLIC_CLEAN_gf256v_mul_u32(t.u32, b);
|
||
|
for (unsigned i = 0; i < rem; i++) {
|
||
|
a[i] = t.u8[i];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
void PQCLEAN_RAINBOWIACYCLIC_CLEAN_gf256v_madd_u32(uint8_t *accu_c, const uint8_t *a, uint8_t gf256_b, unsigned _num_byte) {
|
||
|
unsigned n_u32 = _num_byte >> 2;
|
||
|
uint32_t *c_u32 = (uint32_t *) accu_c;
|
||
|
const uint32_t *a_u32 = (const uint32_t *) a;
|
||
|
for (unsigned i = 0; i < n_u32; i++) {
|
||
|
c_u32[i] ^= PQCLEAN_RAINBOWIACYCLIC_CLEAN_gf256v_mul_u32(a_u32[i], gf256_b);
|
||
|
}
|
||
|
|
||
|
union tmp_32 {
|
||
|
uint8_t u8[4];
|
||
|
uint32_t u32;
|
||
|
} t;
|
||
|
t.u32 = 0;
|
||
|
accu_c += (n_u32 << 2);
|
||
|
a += (n_u32 << 2);
|
||
|
unsigned rem = _num_byte & 3;
|
||
|
for (unsigned i = 0; i < rem; i++) {
|
||
|
t.u8[i] = a[i];
|
||
|
}
|
||
|
t.u32 = PQCLEAN_RAINBOWIACYCLIC_CLEAN_gf256v_mul_u32(t.u32, gf256_b);
|
||
|
for (unsigned i = 0; i < rem; i++) {
|
||
|
accu_c[i] ^= t.u8[i];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#endif
|