mirror of
https://github.com/henrydcase/pqc.git
synced 2024-11-22 23:48:58 +00:00
resolve remaining todos
This commit is contained in:
parent
c90f95cf66
commit
5788e00a1c
@ -2,7 +2,6 @@
|
||||
/// @brief Implementations for functions in rainbow_keypair_computation.h
|
||||
///
|
||||
|
||||
|
||||
#include "blas.h"
|
||||
#include "blas_comm.h"
|
||||
#include "rainbow_blas.h"
|
||||
@ -12,7 +11,6 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
|
||||
void PQCLEAN_RAINBOWIIICCLASSIC_CLEAN_extcpk_to_pk( pk_t *pk, const ext_cpk_t *cpk ) {
|
||||
const unsigned char *idx_l1 = cpk->l1_Q1;
|
||||
const unsigned char *idx_l2 = cpk->l2_Q1;
|
||||
@ -187,11 +185,7 @@ void calculate_Q_from_F_ref( ext_cpk_t *Qs, const sk_t *Fs, const sk_t *Ts ) {
|
||||
batch_trimatTr_madd( Qs->l2_Q6, Fs->l2_F5, Ts->t3, _O1, _O1_BYTE, _O2, _O2_BYTE ); // F2tr*T2 + F5_F5T*T3 + F6
|
||||
batch_matTr_madd( Qs->l2_Q6, Ts->t1, _V1, _V1_BYTE, _O1, Qs->l2_Q3, _O2, _O2_BYTE ); // Q6
|
||||
}
|
||||
// TODO: these defines are not really required for a clean implementation - just implement directly
|
||||
#define calculate_Q_from_F_impl calculate_Q_from_F_ref
|
||||
void PQCLEAN_RAINBOWIIICCLASSIC_CLEAN_calculate_Q_from_F( ext_cpk_t *Qs, const sk_t *Fs, const sk_t *Ts ) {
|
||||
calculate_Q_from_F_impl( Qs, Fs, Ts );
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
@ -12,23 +12,15 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
|
||||
|
||||
int
|
||||
PQCLEAN_RAINBOWIIICCLASSIC_CLEAN_crypto_sign_keypair(unsigned char *pk, unsigned char *sk) {
|
||||
unsigned char sk_seed[LEN_SKSEED] = {0};
|
||||
randombytes( sk_seed, LEN_SKSEED );
|
||||
|
||||
|
||||
PQCLEAN_RAINBOWIIICCLASSIC_CLEAN_generate_keypair( (pk_t *) pk, (sk_t *) sk, sk_seed );
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
int
|
||||
PQCLEAN_RAINBOWIIICCLASSIC_CLEAN_crypto_sign(unsigned char *sm, size_t *smlen, const unsigned char *m, size_t mlen, const unsigned char *sk) {
|
||||
unsigned char digest[_HASH_LEN];
|
||||
@ -38,35 +30,29 @@ PQCLEAN_RAINBOWIIICCLASSIC_CLEAN_crypto_sign(unsigned char *sm, size_t *smlen, c
|
||||
memcpy( sm, m, mlen );
|
||||
smlen[0] = mlen + _SIGNATURE_BYTE;
|
||||
|
||||
|
||||
return PQCLEAN_RAINBOWIIICCLASSIC_CLEAN_rainbow_sign( sm + mlen, (const sk_t *)sk, digest );
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
int
|
||||
PQCLEAN_RAINBOWIIICCLASSIC_CLEAN_crypto_sign_open(unsigned char *m, size_t *mlen, const unsigned char *sm, size_t smlen, const unsigned char *pk) {
|
||||
//TODO: this should not copy out the message if verification fails
|
||||
int rc;
|
||||
if ( _SIGNATURE_BYTE > smlen ) {
|
||||
return -1;
|
||||
}
|
||||
memcpy( m, sm, smlen - _SIGNATURE_BYTE );
|
||||
mlen[0] = smlen - _SIGNATURE_BYTE;
|
||||
rc = -1;
|
||||
} else {
|
||||
*mlen = smlen - _SIGNATURE_BYTE;
|
||||
|
||||
unsigned char digest[_HASH_LEN];
|
||||
PQCLEAN_RAINBOWIIICCLASSIC_CLEAN_hash_msg( digest, _HASH_LEN, m, *mlen );
|
||||
|
||||
|
||||
return PQCLEAN_RAINBOWIIICCLASSIC_CLEAN_rainbow_verify( digest, sm + mlen[0], (const pk_t *)pk );
|
||||
|
||||
|
||||
PQCLEAN_RAINBOWIIICCLASSIC_CLEAN_hash_msg(digest, _HASH_LEN, sm, *mlen);
|
||||
|
||||
rc = PQCLEAN_RAINBOWIIICCLASSIC_CLEAN_rainbow_verify(digest, sm + mlen[0], (const pk_t *)pk);
|
||||
}
|
||||
if (!rc) {
|
||||
memcpy( m, sm, smlen - _SIGNATURE_BYTE );
|
||||
} else { // bad signature
|
||||
*mlen = (size_t) -1;
|
||||
memset(m, 0, smlen);
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
int PQCLEAN_RAINBOWIIICCLASSIC_CLEAN_crypto_sign_signature(
|
||||
@ -88,5 +74,4 @@ int PQCLEAN_RAINBOWIIICCLASSIC_CLEAN_crypto_sign_verify(
|
||||
unsigned char digest[_HASH_LEN];
|
||||
PQCLEAN_RAINBOWIIICCLASSIC_CLEAN_hash_msg( digest, _HASH_LEN, m, mlen );
|
||||
return PQCLEAN_RAINBOWIIICCLASSIC_CLEAN_rainbow_verify( digest, sig, (const pk_t *)pk );
|
||||
|
||||
}
|
||||
|
@ -2,7 +2,6 @@
|
||||
/// @brief Implementations for functions in rainbow_keypair_computation.h
|
||||
///
|
||||
|
||||
|
||||
#include "blas.h"
|
||||
#include "blas_comm.h"
|
||||
#include "rainbow_blas.h"
|
||||
@ -12,7 +11,6 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
|
||||
void PQCLEAN_RAINBOWIIICCYCLICCOMPRESSED_CLEAN_extcpk_to_pk( pk_t *pk, const ext_cpk_t *cpk ) {
|
||||
const unsigned char *idx_l1 = cpk->l1_Q1;
|
||||
const unsigned char *idx_l2 = cpk->l2_Q1;
|
||||
@ -82,9 +80,6 @@ void PQCLEAN_RAINBOWIIICCYCLICCOMPRESSED_CLEAN_extcpk_to_pk( pk_t *pk, const ext
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
static
|
||||
void calculate_F_from_Q_ref( sk_t *Fs, const sk_t *Qs, sk_t *Ts ) {
|
||||
// Layer 1
|
||||
@ -147,9 +142,6 @@ void calculate_F_from_Q_ref( sk_t *Fs, const sk_t *Qs, sk_t *Ts ) {
|
||||
|
||||
}
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
static
|
||||
void calculate_Q_from_F_cyclic_ref( cpk_t *Qs, const sk_t *Fs, const sk_t *Ts ) {
|
||||
// Layer 1: Computing Q5, Q3, Q6, Q9
|
||||
@ -212,17 +204,10 @@ void calculate_Q_from_F_cyclic_ref( cpk_t *Qs, const sk_t *Fs, const sk_t *Ts )
|
||||
PQCLEAN_RAINBOWIIICCYCLICCOMPRESSED_CLEAN_UpperTrianglize( Qs->l2_Q9, tempQ.l2_F3, _O2, _O2_BYTE ); // Q9
|
||||
}
|
||||
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
// Choosing implementations depends on the macros: _BLAS_SSE_ and _BLAS_AVX2_
|
||||
#define calculate_F_from_Q_impl calculate_F_from_Q_ref
|
||||
#define calculate_Q_from_F_cyclic_impl calculate_Q_from_F_cyclic_ref
|
||||
|
||||
|
||||
|
||||
void PQCLEAN_RAINBOWIIICCYCLICCOMPRESSED_CLEAN_calculate_F_from_Q( sk_t *Fs, const sk_t *Qs, sk_t *Ts ) {
|
||||
calculate_F_from_Q_impl( Fs, Qs, Ts );
|
||||
}
|
||||
@ -230,4 +215,3 @@ void PQCLEAN_RAINBOWIIICCYCLICCOMPRESSED_CLEAN_calculate_F_from_Q( sk_t *Fs, con
|
||||
void PQCLEAN_RAINBOWIIICCYCLICCOMPRESSED_CLEAN_calculate_Q_from_F_cyclic( cpk_t *Qs, const sk_t *Fs, const sk_t *Ts ) {
|
||||
calculate_Q_from_F_cyclic_impl( Qs, Fs, Ts );
|
||||
}
|
||||
|
||||
|
@ -12,25 +12,17 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
|
||||
|
||||
int
|
||||
PQCLEAN_RAINBOWIIICCYCLICCOMPRESSED_CLEAN_crypto_sign_keypair(unsigned char *pk, unsigned char *sk) {
|
||||
unsigned char sk_seed[LEN_SKSEED] = {0};
|
||||
randombytes( sk_seed, LEN_SKSEED );
|
||||
|
||||
|
||||
unsigned char pk_seed[LEN_PKSEED] = {0};
|
||||
randombytes( pk_seed, LEN_PKSEED );
|
||||
PQCLEAN_RAINBOWIIICCYCLICCOMPRESSED_CLEAN_generate_compact_keypair_cyclic( (cpk_t *) pk, (csk_t *) sk, pk_seed, sk_seed );
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
int
|
||||
PQCLEAN_RAINBOWIIICCYCLICCOMPRESSED_CLEAN_crypto_sign(unsigned char *sm, size_t *smlen, const unsigned char *m, size_t mlen, const unsigned char *sk) {
|
||||
unsigned char digest[_HASH_LEN];
|
||||
@ -40,35 +32,29 @@ PQCLEAN_RAINBOWIIICCYCLICCOMPRESSED_CLEAN_crypto_sign(unsigned char *sm, size_t
|
||||
memcpy( sm, m, mlen );
|
||||
smlen[0] = mlen + _SIGNATURE_BYTE;
|
||||
|
||||
|
||||
return PQCLEAN_RAINBOWIIICCYCLICCOMPRESSED_CLEAN_rainbow_sign_cyclic( sm + mlen, (const csk_t *)sk, digest );
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
int
|
||||
PQCLEAN_RAINBOWIIICCYCLICCOMPRESSED_CLEAN_crypto_sign_open(unsigned char *m, size_t *mlen, const unsigned char *sm, size_t smlen, const unsigned char *pk) {
|
||||
//TODO: this should not copy out the message if verification fails
|
||||
int rc;
|
||||
if ( _SIGNATURE_BYTE > smlen ) {
|
||||
return -1;
|
||||
}
|
||||
memcpy( m, sm, smlen - _SIGNATURE_BYTE );
|
||||
mlen[0] = smlen - _SIGNATURE_BYTE;
|
||||
rc = -1;
|
||||
} else {
|
||||
*mlen = smlen - _SIGNATURE_BYTE;
|
||||
|
||||
unsigned char digest[_HASH_LEN];
|
||||
PQCLEAN_RAINBOWIIICCYCLICCOMPRESSED_CLEAN_hash_msg( digest, _HASH_LEN, m, *mlen );
|
||||
|
||||
|
||||
return PQCLEAN_RAINBOWIIICCYCLICCOMPRESSED_CLEAN_rainbow_verify_cyclic( digest, sm + mlen[0], (const cpk_t *)pk );
|
||||
|
||||
|
||||
PQCLEAN_RAINBOWIIICCYCLICCOMPRESSED_CLEAN_hash_msg(digest, _HASH_LEN, sm, *mlen);
|
||||
|
||||
rc = PQCLEAN_RAINBOWIIICCYCLICCOMPRESSED_CLEAN_rainbow_verify_cyclic(digest, sm + mlen[0], (const cpk_t *)pk);
|
||||
}
|
||||
if (!rc) {
|
||||
memcpy( m, sm, smlen - _SIGNATURE_BYTE );
|
||||
} else { // bad signature
|
||||
*mlen = (size_t) -1;
|
||||
memset(m, 0, smlen);
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
int PQCLEAN_RAINBOWIIICCYCLICCOMPRESSED_CLEAN_crypto_sign_signature(
|
||||
@ -90,5 +76,4 @@ int PQCLEAN_RAINBOWIIICCYCLICCOMPRESSED_CLEAN_crypto_sign_verify(
|
||||
unsigned char digest[_HASH_LEN];
|
||||
PQCLEAN_RAINBOWIIICCYCLICCOMPRESSED_CLEAN_hash_msg( digest, _HASH_LEN, m, mlen );
|
||||
return PQCLEAN_RAINBOWIIICCYCLICCOMPRESSED_CLEAN_rainbow_verify_cyclic( digest, sig, (const cpk_t *)pk );
|
||||
|
||||
}
|
||||
|
@ -2,7 +2,6 @@
|
||||
/// @brief Implementations for functions in rainbow_keypair_computation.h
|
||||
///
|
||||
|
||||
|
||||
#include "blas.h"
|
||||
#include "blas_comm.h"
|
||||
#include "rainbow_blas.h"
|
||||
@ -12,7 +11,6 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
|
||||
void PQCLEAN_RAINBOWIIICCYCLIC_CLEAN_extcpk_to_pk( pk_t *pk, const ext_cpk_t *cpk ) {
|
||||
const unsigned char *idx_l1 = cpk->l1_Q1;
|
||||
const unsigned char *idx_l2 = cpk->l2_Q1;
|
||||
@ -82,9 +80,6 @@ void PQCLEAN_RAINBOWIIICCYCLIC_CLEAN_extcpk_to_pk( pk_t *pk, const ext_cpk_t *cp
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
static
|
||||
void calculate_F_from_Q_ref( sk_t *Fs, const sk_t *Qs, sk_t *Ts ) {
|
||||
// Layer 1
|
||||
@ -147,9 +142,6 @@ void calculate_F_from_Q_ref( sk_t *Fs, const sk_t *Qs, sk_t *Ts ) {
|
||||
|
||||
}
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
static
|
||||
void calculate_Q_from_F_cyclic_ref( cpk_t *Qs, const sk_t *Fs, const sk_t *Ts ) {
|
||||
// Layer 1: Computing Q5, Q3, Q6, Q9
|
||||
@ -212,17 +204,10 @@ void calculate_Q_from_F_cyclic_ref( cpk_t *Qs, const sk_t *Fs, const sk_t *Ts )
|
||||
PQCLEAN_RAINBOWIIICCYCLIC_CLEAN_UpperTrianglize( Qs->l2_Q9, tempQ.l2_F3, _O2, _O2_BYTE ); // Q9
|
||||
}
|
||||
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
// Choosing implementations depends on the macros: _BLAS_SSE_ and _BLAS_AVX2_
|
||||
#define calculate_F_from_Q_impl calculate_F_from_Q_ref
|
||||
#define calculate_Q_from_F_cyclic_impl calculate_Q_from_F_cyclic_ref
|
||||
|
||||
|
||||
|
||||
void PQCLEAN_RAINBOWIIICCYCLIC_CLEAN_calculate_F_from_Q( sk_t *Fs, const sk_t *Qs, sk_t *Ts ) {
|
||||
calculate_F_from_Q_impl( Fs, Qs, Ts );
|
||||
}
|
||||
@ -230,4 +215,3 @@ void PQCLEAN_RAINBOWIIICCYCLIC_CLEAN_calculate_F_from_Q( sk_t *Fs, const sk_t *Q
|
||||
void PQCLEAN_RAINBOWIIICCYCLIC_CLEAN_calculate_Q_from_F_cyclic( cpk_t *Qs, const sk_t *Fs, const sk_t *Ts ) {
|
||||
calculate_Q_from_F_cyclic_impl( Qs, Fs, Ts );
|
||||
}
|
||||
|
||||
|
@ -12,25 +12,17 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
|
||||
|
||||
int
|
||||
PQCLEAN_RAINBOWIIICCYCLIC_CLEAN_crypto_sign_keypair(unsigned char *pk, unsigned char *sk) {
|
||||
unsigned char sk_seed[LEN_SKSEED] = {0};
|
||||
randombytes( sk_seed, LEN_SKSEED );
|
||||
|
||||
|
||||
unsigned char pk_seed[LEN_PKSEED] = {0};
|
||||
randombytes( pk_seed, LEN_PKSEED );
|
||||
PQCLEAN_RAINBOWIIICCYCLIC_CLEAN_generate_keypair_cyclic( (cpk_t *) pk, (sk_t *) sk, pk_seed, sk_seed );
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
int
|
||||
PQCLEAN_RAINBOWIIICCYCLIC_CLEAN_crypto_sign(unsigned char *sm, size_t *smlen, const unsigned char *m, size_t mlen, const unsigned char *sk) {
|
||||
unsigned char digest[_HASH_LEN];
|
||||
@ -40,35 +32,29 @@ PQCLEAN_RAINBOWIIICCYCLIC_CLEAN_crypto_sign(unsigned char *sm, size_t *smlen, co
|
||||
memcpy( sm, m, mlen );
|
||||
smlen[0] = mlen + _SIGNATURE_BYTE;
|
||||
|
||||
|
||||
return PQCLEAN_RAINBOWIIICCYCLIC_CLEAN_rainbow_sign( sm + mlen, (const sk_t *)sk, digest );
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
int
|
||||
PQCLEAN_RAINBOWIIICCYCLIC_CLEAN_crypto_sign_open(unsigned char *m, size_t *mlen, const unsigned char *sm, size_t smlen, const unsigned char *pk) {
|
||||
//TODO: this should not copy out the message if verification fails
|
||||
int rc;
|
||||
if ( _SIGNATURE_BYTE > smlen ) {
|
||||
return -1;
|
||||
}
|
||||
memcpy( m, sm, smlen - _SIGNATURE_BYTE );
|
||||
mlen[0] = smlen - _SIGNATURE_BYTE;
|
||||
rc = -1;
|
||||
} else {
|
||||
*mlen = smlen - _SIGNATURE_BYTE;
|
||||
|
||||
unsigned char digest[_HASH_LEN];
|
||||
PQCLEAN_RAINBOWIIICCYCLIC_CLEAN_hash_msg( digest, _HASH_LEN, m, *mlen );
|
||||
|
||||
|
||||
return PQCLEAN_RAINBOWIIICCYCLIC_CLEAN_rainbow_verify_cyclic( digest, sm + mlen[0], (const cpk_t *)pk );
|
||||
|
||||
|
||||
PQCLEAN_RAINBOWIIICCYCLIC_CLEAN_hash_msg(digest, _HASH_LEN, sm, *mlen);
|
||||
|
||||
rc = PQCLEAN_RAINBOWIIICCYCLIC_CLEAN_rainbow_verify_cyclic(digest, sm + mlen[0], (const cpk_t *)pk);
|
||||
}
|
||||
if (!rc) {
|
||||
memcpy( m, sm, smlen - _SIGNATURE_BYTE );
|
||||
} else { // bad signature
|
||||
*mlen = (size_t) -1;
|
||||
memset(m, 0, smlen);
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
int PQCLEAN_RAINBOWIIICCYCLIC_CLEAN_crypto_sign_signature(
|
||||
@ -90,5 +76,4 @@ int PQCLEAN_RAINBOWIIICCYCLIC_CLEAN_crypto_sign_verify(
|
||||
unsigned char digest[_HASH_LEN];
|
||||
PQCLEAN_RAINBOWIIICCYCLIC_CLEAN_hash_msg( digest, _HASH_LEN, m, mlen );
|
||||
return PQCLEAN_RAINBOWIIICCYCLIC_CLEAN_rainbow_verify_cyclic( digest, sig, (const cpk_t *)pk );
|
||||
|
||||
}
|
||||
|
@ -100,7 +100,7 @@ unsigned gf16mat_solve_linear_eq_ref(uint8_t *sol, const uint8_t *inp_mat, const
|
||||
memcpy(mat + i * (n_byte + 1), inp_mat + i * n_byte, n_byte);
|
||||
mat[i * (n_byte + 1) + n_byte] = PQCLEAN_RAINBOWIACLASSIC_CLEAN_gf16v_get_ele(c_terms, i);
|
||||
}
|
||||
unsigned r8 = PQCLEAN_RAINBOWIACLASSIC_CLEAN_gf16mat_gauss_elim(mat, n, n + 2); /// XXX: this function is ``defined'' in blas.h
|
||||
unsigned r8 = PQCLEAN_RAINBOWIACLASSIC_CLEAN_gf16mat_gauss_elim(mat, n, n + 2);
|
||||
for (unsigned i = 0; i < n; i++) {
|
||||
PQCLEAN_RAINBOWIACLASSIC_CLEAN_gf16v_set_ele(sol, i, mat[i * (n_byte + 1) + n_byte]);
|
||||
}
|
||||
@ -128,7 +128,7 @@ unsigned PQCLEAN_RAINBOWIACLASSIC_CLEAN_gf16mat_inv(uint8_t *inv_a, const uint8_
|
||||
gf256v_add(ai, a + i * n_w_byte, n_w_byte);
|
||||
PQCLEAN_RAINBOWIACLASSIC_CLEAN_gf16v_set_ele(ai + n_w_byte, i, 1);
|
||||
}
|
||||
unsigned r8 = PQCLEAN_RAINBOWIACLASSIC_CLEAN_gf16mat_gauss_elim(aa, H, 2 * H); /// XXX: would 2*H fail if H is odd ???
|
||||
unsigned r8 = PQCLEAN_RAINBOWIACLASSIC_CLEAN_gf16mat_gauss_elim(aa, H, 2 * H);
|
||||
gf16mat_submat(inv_a, H, H, aa, 2 * H, H);
|
||||
return r8;
|
||||
}
|
||||
|
@ -2,7 +2,6 @@
|
||||
/// @brief Implementations for functions in rainbow_keypair_computation.h
|
||||
///
|
||||
|
||||
|
||||
#include "blas.h"
|
||||
#include "blas_comm.h"
|
||||
#include "rainbow_blas.h"
|
||||
@ -12,7 +11,6 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
|
||||
void PQCLEAN_RAINBOWIACLASSIC_CLEAN_extcpk_to_pk( pk_t *pk, const ext_cpk_t *cpk ) {
|
||||
const unsigned char *idx_l1 = cpk->l1_Q1;
|
||||
const unsigned char *idx_l2 = cpk->l2_Q1;
|
||||
@ -187,11 +185,7 @@ void calculate_Q_from_F_ref( ext_cpk_t *Qs, const sk_t *Fs, const sk_t *Ts ) {
|
||||
batch_trimatTr_madd( Qs->l2_Q6, Fs->l2_F5, Ts->t3, _O1, _O1_BYTE, _O2, _O2_BYTE ); // F2tr*T2 + F5_F5T*T3 + F6
|
||||
batch_matTr_madd( Qs->l2_Q6, Ts->t1, _V1, _V1_BYTE, _O1, Qs->l2_Q3, _O2, _O2_BYTE ); // Q6
|
||||
}
|
||||
// TODO: these defines are not really required for a clean implementation - just implement directly
|
||||
#define calculate_Q_from_F_impl calculate_Q_from_F_ref
|
||||
void PQCLEAN_RAINBOWIACLASSIC_CLEAN_calculate_Q_from_F( ext_cpk_t *Qs, const sk_t *Fs, const sk_t *Ts ) {
|
||||
calculate_Q_from_F_impl( Qs, Fs, Ts );
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
@ -12,23 +12,15 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
|
||||
|
||||
int
|
||||
PQCLEAN_RAINBOWIACLASSIC_CLEAN_crypto_sign_keypair(unsigned char *pk, unsigned char *sk) {
|
||||
unsigned char sk_seed[LEN_SKSEED] = {0};
|
||||
randombytes( sk_seed, LEN_SKSEED );
|
||||
|
||||
|
||||
PQCLEAN_RAINBOWIACLASSIC_CLEAN_generate_keypair( (pk_t *) pk, (sk_t *) sk, sk_seed );
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
int
|
||||
PQCLEAN_RAINBOWIACLASSIC_CLEAN_crypto_sign(unsigned char *sm, size_t *smlen, const unsigned char *m, size_t mlen, const unsigned char *sk) {
|
||||
unsigned char digest[_HASH_LEN];
|
||||
@ -38,35 +30,29 @@ PQCLEAN_RAINBOWIACLASSIC_CLEAN_crypto_sign(unsigned char *sm, size_t *smlen, con
|
||||
memcpy( sm, m, mlen );
|
||||
smlen[0] = mlen + _SIGNATURE_BYTE;
|
||||
|
||||
|
||||
return PQCLEAN_RAINBOWIACLASSIC_CLEAN_rainbow_sign( sm + mlen, (const sk_t *)sk, digest );
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
int
|
||||
PQCLEAN_RAINBOWIACLASSIC_CLEAN_crypto_sign_open(unsigned char *m, size_t *mlen, const unsigned char *sm, size_t smlen, const unsigned char *pk) {
|
||||
//TODO: this should not copy out the message if verification fails
|
||||
int rc;
|
||||
if ( _SIGNATURE_BYTE > smlen ) {
|
||||
return -1;
|
||||
}
|
||||
memcpy( m, sm, smlen - _SIGNATURE_BYTE );
|
||||
mlen[0] = smlen - _SIGNATURE_BYTE;
|
||||
rc = -1;
|
||||
} else {
|
||||
*mlen = smlen - _SIGNATURE_BYTE;
|
||||
|
||||
unsigned char digest[_HASH_LEN];
|
||||
PQCLEAN_RAINBOWIACLASSIC_CLEAN_hash_msg( digest, _HASH_LEN, m, *mlen );
|
||||
|
||||
|
||||
return PQCLEAN_RAINBOWIACLASSIC_CLEAN_rainbow_verify( digest, sm + mlen[0], (const pk_t *)pk );
|
||||
|
||||
|
||||
PQCLEAN_RAINBOWIACLASSIC_CLEAN_hash_msg(digest, _HASH_LEN, sm, *mlen);
|
||||
|
||||
rc = PQCLEAN_RAINBOWIACLASSIC_CLEAN_rainbow_verify(digest, sm + mlen[0], (const pk_t *)pk);
|
||||
}
|
||||
if (!rc) {
|
||||
memcpy( m, sm, smlen - _SIGNATURE_BYTE );
|
||||
} else { // bad signature
|
||||
*mlen = (size_t) -1;
|
||||
memset(m, 0, smlen);
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
int PQCLEAN_RAINBOWIACLASSIC_CLEAN_crypto_sign_signature(
|
||||
@ -88,5 +74,4 @@ int PQCLEAN_RAINBOWIACLASSIC_CLEAN_crypto_sign_verify(
|
||||
unsigned char digest[_HASH_LEN];
|
||||
PQCLEAN_RAINBOWIACLASSIC_CLEAN_hash_msg( digest, _HASH_LEN, m, mlen );
|
||||
return PQCLEAN_RAINBOWIACLASSIC_CLEAN_rainbow_verify( digest, sig, (const pk_t *)pk );
|
||||
|
||||
}
|
||||
|
@ -100,7 +100,7 @@ unsigned gf16mat_solve_linear_eq_ref(uint8_t *sol, const uint8_t *inp_mat, const
|
||||
memcpy(mat + i * (n_byte + 1), inp_mat + i * n_byte, n_byte);
|
||||
mat[i * (n_byte + 1) + n_byte] = PQCLEAN_RAINBOWIACYCLICCOMPRESSED_CLEAN_gf16v_get_ele(c_terms, i);
|
||||
}
|
||||
unsigned r8 = PQCLEAN_RAINBOWIACYCLICCOMPRESSED_CLEAN_gf16mat_gauss_elim(mat, n, n + 2); /// XXX: this function is ``defined'' in blas.h
|
||||
unsigned r8 = PQCLEAN_RAINBOWIACYCLICCOMPRESSED_CLEAN_gf16mat_gauss_elim(mat, n, n + 2);
|
||||
for (unsigned i = 0; i < n; i++) {
|
||||
PQCLEAN_RAINBOWIACYCLICCOMPRESSED_CLEAN_gf16v_set_ele(sol, i, mat[i * (n_byte + 1) + n_byte]);
|
||||
}
|
||||
@ -128,7 +128,7 @@ unsigned PQCLEAN_RAINBOWIACYCLICCOMPRESSED_CLEAN_gf16mat_inv(uint8_t *inv_a, con
|
||||
gf256v_add(ai, a + i * n_w_byte, n_w_byte);
|
||||
PQCLEAN_RAINBOWIACYCLICCOMPRESSED_CLEAN_gf16v_set_ele(ai + n_w_byte, i, 1);
|
||||
}
|
||||
unsigned r8 = PQCLEAN_RAINBOWIACYCLICCOMPRESSED_CLEAN_gf16mat_gauss_elim(aa, H, 2 * H); /// XXX: would 2*H fail if H is odd ???
|
||||
unsigned r8 = PQCLEAN_RAINBOWIACYCLICCOMPRESSED_CLEAN_gf16mat_gauss_elim(aa, H, 2 * H);
|
||||
gf16mat_submat(inv_a, H, H, aa, 2 * H, H);
|
||||
return r8;
|
||||
}
|
||||
|
@ -2,7 +2,6 @@
|
||||
/// @brief Implementations for functions in rainbow_keypair_computation.h
|
||||
///
|
||||
|
||||
|
||||
#include "blas.h"
|
||||
#include "blas_comm.h"
|
||||
#include "rainbow_blas.h"
|
||||
@ -12,7 +11,6 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
|
||||
void PQCLEAN_RAINBOWIACYCLICCOMPRESSED_CLEAN_extcpk_to_pk( pk_t *pk, const ext_cpk_t *cpk ) {
|
||||
const unsigned char *idx_l1 = cpk->l1_Q1;
|
||||
const unsigned char *idx_l2 = cpk->l2_Q1;
|
||||
@ -82,9 +80,6 @@ void PQCLEAN_RAINBOWIACYCLICCOMPRESSED_CLEAN_extcpk_to_pk( pk_t *pk, const ext_c
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
static
|
||||
void calculate_F_from_Q_ref( sk_t *Fs, const sk_t *Qs, sk_t *Ts ) {
|
||||
// Layer 1
|
||||
@ -147,9 +142,6 @@ void calculate_F_from_Q_ref( sk_t *Fs, const sk_t *Qs, sk_t *Ts ) {
|
||||
|
||||
}
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
static
|
||||
void calculate_Q_from_F_cyclic_ref( cpk_t *Qs, const sk_t *Fs, const sk_t *Ts ) {
|
||||
// Layer 1: Computing Q5, Q3, Q6, Q9
|
||||
@ -212,17 +204,10 @@ void calculate_Q_from_F_cyclic_ref( cpk_t *Qs, const sk_t *Fs, const sk_t *Ts )
|
||||
PQCLEAN_RAINBOWIACYCLICCOMPRESSED_CLEAN_UpperTrianglize( Qs->l2_Q9, tempQ.l2_F3, _O2, _O2_BYTE ); // Q9
|
||||
}
|
||||
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
// Choosing implementations depends on the macros: _BLAS_SSE_ and _BLAS_AVX2_
|
||||
#define calculate_F_from_Q_impl calculate_F_from_Q_ref
|
||||
#define calculate_Q_from_F_cyclic_impl calculate_Q_from_F_cyclic_ref
|
||||
|
||||
|
||||
|
||||
void PQCLEAN_RAINBOWIACYCLICCOMPRESSED_CLEAN_calculate_F_from_Q( sk_t *Fs, const sk_t *Qs, sk_t *Ts ) {
|
||||
calculate_F_from_Q_impl( Fs, Qs, Ts );
|
||||
}
|
||||
@ -230,4 +215,3 @@ void PQCLEAN_RAINBOWIACYCLICCOMPRESSED_CLEAN_calculate_F_from_Q( sk_t *Fs, const
|
||||
void PQCLEAN_RAINBOWIACYCLICCOMPRESSED_CLEAN_calculate_Q_from_F_cyclic( cpk_t *Qs, const sk_t *Fs, const sk_t *Ts ) {
|
||||
calculate_Q_from_F_cyclic_impl( Qs, Fs, Ts );
|
||||
}
|
||||
|
||||
|
@ -12,25 +12,17 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
|
||||
|
||||
int
|
||||
PQCLEAN_RAINBOWIACYCLICCOMPRESSED_CLEAN_crypto_sign_keypair(unsigned char *pk, unsigned char *sk) {
|
||||
unsigned char sk_seed[LEN_SKSEED] = {0};
|
||||
randombytes( sk_seed, LEN_SKSEED );
|
||||
|
||||
|
||||
unsigned char pk_seed[LEN_PKSEED] = {0};
|
||||
randombytes( pk_seed, LEN_PKSEED );
|
||||
PQCLEAN_RAINBOWIACYCLICCOMPRESSED_CLEAN_generate_compact_keypair_cyclic( (cpk_t *) pk, (csk_t *) sk, pk_seed, sk_seed );
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
int
|
||||
PQCLEAN_RAINBOWIACYCLICCOMPRESSED_CLEAN_crypto_sign(unsigned char *sm, size_t *smlen, const unsigned char *m, size_t mlen, const unsigned char *sk) {
|
||||
unsigned char digest[_HASH_LEN];
|
||||
@ -40,35 +32,29 @@ PQCLEAN_RAINBOWIACYCLICCOMPRESSED_CLEAN_crypto_sign(unsigned char *sm, size_t *s
|
||||
memcpy( sm, m, mlen );
|
||||
smlen[0] = mlen + _SIGNATURE_BYTE;
|
||||
|
||||
|
||||
return PQCLEAN_RAINBOWIACYCLICCOMPRESSED_CLEAN_rainbow_sign_cyclic( sm + mlen, (const csk_t *)sk, digest );
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
int
|
||||
PQCLEAN_RAINBOWIACYCLICCOMPRESSED_CLEAN_crypto_sign_open(unsigned char *m, size_t *mlen, const unsigned char *sm, size_t smlen, const unsigned char *pk) {
|
||||
//TODO: this should not copy out the message if verification fails
|
||||
int rc;
|
||||
if ( _SIGNATURE_BYTE > smlen ) {
|
||||
return -1;
|
||||
}
|
||||
memcpy( m, sm, smlen - _SIGNATURE_BYTE );
|
||||
mlen[0] = smlen - _SIGNATURE_BYTE;
|
||||
rc = -1;
|
||||
} else {
|
||||
*mlen = smlen - _SIGNATURE_BYTE;
|
||||
|
||||
unsigned char digest[_HASH_LEN];
|
||||
PQCLEAN_RAINBOWIACYCLICCOMPRESSED_CLEAN_hash_msg( digest, _HASH_LEN, m, *mlen );
|
||||
|
||||
|
||||
return PQCLEAN_RAINBOWIACYCLICCOMPRESSED_CLEAN_rainbow_verify_cyclic( digest, sm + mlen[0], (const cpk_t *)pk );
|
||||
|
||||
|
||||
PQCLEAN_RAINBOWIACYCLICCOMPRESSED_CLEAN_hash_msg(digest, _HASH_LEN, sm, *mlen);
|
||||
|
||||
rc = PQCLEAN_RAINBOWIACYCLICCOMPRESSED_CLEAN_rainbow_verify_cyclic(digest, sm + mlen[0], (const cpk_t *)pk);
|
||||
}
|
||||
if (!rc) {
|
||||
memcpy( m, sm, smlen - _SIGNATURE_BYTE );
|
||||
} else { // bad signature
|
||||
*mlen = (size_t) -1;
|
||||
memset(m, 0, smlen);
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
int PQCLEAN_RAINBOWIACYCLICCOMPRESSED_CLEAN_crypto_sign_signature(
|
||||
@ -90,5 +76,4 @@ int PQCLEAN_RAINBOWIACYCLICCOMPRESSED_CLEAN_crypto_sign_verify(
|
||||
unsigned char digest[_HASH_LEN];
|
||||
PQCLEAN_RAINBOWIACYCLICCOMPRESSED_CLEAN_hash_msg( digest, _HASH_LEN, m, mlen );
|
||||
return PQCLEAN_RAINBOWIACYCLICCOMPRESSED_CLEAN_rainbow_verify_cyclic( digest, sig, (const cpk_t *)pk );
|
||||
|
||||
}
|
||||
|
@ -100,7 +100,7 @@ unsigned gf16mat_solve_linear_eq_ref(uint8_t *sol, const uint8_t *inp_mat, const
|
||||
memcpy(mat + i * (n_byte + 1), inp_mat + i * n_byte, n_byte);
|
||||
mat[i * (n_byte + 1) + n_byte] = PQCLEAN_RAINBOWIACYCLIC_CLEAN_gf16v_get_ele(c_terms, i);
|
||||
}
|
||||
unsigned r8 = PQCLEAN_RAINBOWIACYCLIC_CLEAN_gf16mat_gauss_elim(mat, n, n + 2); /// XXX: this function is ``defined'' in blas.h
|
||||
unsigned r8 = PQCLEAN_RAINBOWIACYCLIC_CLEAN_gf16mat_gauss_elim(mat, n, n + 2);
|
||||
for (unsigned i = 0; i < n; i++) {
|
||||
PQCLEAN_RAINBOWIACYCLIC_CLEAN_gf16v_set_ele(sol, i, mat[i * (n_byte + 1) + n_byte]);
|
||||
}
|
||||
@ -128,7 +128,7 @@ unsigned PQCLEAN_RAINBOWIACYCLIC_CLEAN_gf16mat_inv(uint8_t *inv_a, const uint8_t
|
||||
gf256v_add(ai, a + i * n_w_byte, n_w_byte);
|
||||
PQCLEAN_RAINBOWIACYCLIC_CLEAN_gf16v_set_ele(ai + n_w_byte, i, 1);
|
||||
}
|
||||
unsigned r8 = PQCLEAN_RAINBOWIACYCLIC_CLEAN_gf16mat_gauss_elim(aa, H, 2 * H); /// XXX: would 2*H fail if H is odd ???
|
||||
unsigned r8 = PQCLEAN_RAINBOWIACYCLIC_CLEAN_gf16mat_gauss_elim(aa, H, 2 * H);
|
||||
gf16mat_submat(inv_a, H, H, aa, 2 * H, H);
|
||||
return r8;
|
||||
}
|
||||
|
@ -2,7 +2,6 @@
|
||||
/// @brief Implementations for functions in rainbow_keypair_computation.h
|
||||
///
|
||||
|
||||
|
||||
#include "blas.h"
|
||||
#include "blas_comm.h"
|
||||
#include "rainbow_blas.h"
|
||||
@ -12,7 +11,6 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
|
||||
void PQCLEAN_RAINBOWIACYCLIC_CLEAN_extcpk_to_pk( pk_t *pk, const ext_cpk_t *cpk ) {
|
||||
const unsigned char *idx_l1 = cpk->l1_Q1;
|
||||
const unsigned char *idx_l2 = cpk->l2_Q1;
|
||||
@ -82,9 +80,6 @@ void PQCLEAN_RAINBOWIACYCLIC_CLEAN_extcpk_to_pk( pk_t *pk, const ext_cpk_t *cpk
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
static
|
||||
void calculate_F_from_Q_ref( sk_t *Fs, const sk_t *Qs, sk_t *Ts ) {
|
||||
// Layer 1
|
||||
@ -147,9 +142,6 @@ void calculate_F_from_Q_ref( sk_t *Fs, const sk_t *Qs, sk_t *Ts ) {
|
||||
|
||||
}
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
static
|
||||
void calculate_Q_from_F_cyclic_ref( cpk_t *Qs, const sk_t *Fs, const sk_t *Ts ) {
|
||||
// Layer 1: Computing Q5, Q3, Q6, Q9
|
||||
@ -212,17 +204,10 @@ void calculate_Q_from_F_cyclic_ref( cpk_t *Qs, const sk_t *Fs, const sk_t *Ts )
|
||||
PQCLEAN_RAINBOWIACYCLIC_CLEAN_UpperTrianglize( Qs->l2_Q9, tempQ.l2_F3, _O2, _O2_BYTE ); // Q9
|
||||
}
|
||||
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
// Choosing implementations depends on the macros: _BLAS_SSE_ and _BLAS_AVX2_
|
||||
#define calculate_F_from_Q_impl calculate_F_from_Q_ref
|
||||
#define calculate_Q_from_F_cyclic_impl calculate_Q_from_F_cyclic_ref
|
||||
|
||||
|
||||
|
||||
void PQCLEAN_RAINBOWIACYCLIC_CLEAN_calculate_F_from_Q( sk_t *Fs, const sk_t *Qs, sk_t *Ts ) {
|
||||
calculate_F_from_Q_impl( Fs, Qs, Ts );
|
||||
}
|
||||
@ -230,4 +215,3 @@ void PQCLEAN_RAINBOWIACYCLIC_CLEAN_calculate_F_from_Q( sk_t *Fs, const sk_t *Qs,
|
||||
void PQCLEAN_RAINBOWIACYCLIC_CLEAN_calculate_Q_from_F_cyclic( cpk_t *Qs, const sk_t *Fs, const sk_t *Ts ) {
|
||||
calculate_Q_from_F_cyclic_impl( Qs, Fs, Ts );
|
||||
}
|
||||
|
||||
|
@ -12,25 +12,17 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
|
||||
|
||||
int
|
||||
PQCLEAN_RAINBOWIACYCLIC_CLEAN_crypto_sign_keypair(unsigned char *pk, unsigned char *sk) {
|
||||
unsigned char sk_seed[LEN_SKSEED] = {0};
|
||||
randombytes( sk_seed, LEN_SKSEED );
|
||||
|
||||
|
||||
unsigned char pk_seed[LEN_PKSEED] = {0};
|
||||
randombytes( pk_seed, LEN_PKSEED );
|
||||
PQCLEAN_RAINBOWIACYCLIC_CLEAN_generate_keypair_cyclic( (cpk_t *) pk, (sk_t *) sk, pk_seed, sk_seed );
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
int
|
||||
PQCLEAN_RAINBOWIACYCLIC_CLEAN_crypto_sign(unsigned char *sm, size_t *smlen, const unsigned char *m, size_t mlen, const unsigned char *sk) {
|
||||
unsigned char digest[_HASH_LEN];
|
||||
@ -40,35 +32,29 @@ PQCLEAN_RAINBOWIACYCLIC_CLEAN_crypto_sign(unsigned char *sm, size_t *smlen, cons
|
||||
memcpy( sm, m, mlen );
|
||||
smlen[0] = mlen + _SIGNATURE_BYTE;
|
||||
|
||||
|
||||
return PQCLEAN_RAINBOWIACYCLIC_CLEAN_rainbow_sign( sm + mlen, (const sk_t *)sk, digest );
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
int
|
||||
PQCLEAN_RAINBOWIACYCLIC_CLEAN_crypto_sign_open(unsigned char *m, size_t *mlen, const unsigned char *sm, size_t smlen, const unsigned char *pk) {
|
||||
//TODO: this should not copy out the message if verification fails
|
||||
int rc;
|
||||
if ( _SIGNATURE_BYTE > smlen ) {
|
||||
return -1;
|
||||
}
|
||||
memcpy( m, sm, smlen - _SIGNATURE_BYTE );
|
||||
mlen[0] = smlen - _SIGNATURE_BYTE;
|
||||
rc = -1;
|
||||
} else {
|
||||
*mlen = smlen - _SIGNATURE_BYTE;
|
||||
|
||||
unsigned char digest[_HASH_LEN];
|
||||
PQCLEAN_RAINBOWIACYCLIC_CLEAN_hash_msg( digest, _HASH_LEN, m, *mlen );
|
||||
|
||||
|
||||
return PQCLEAN_RAINBOWIACYCLIC_CLEAN_rainbow_verify_cyclic( digest, sm + mlen[0], (const cpk_t *)pk );
|
||||
|
||||
|
||||
PQCLEAN_RAINBOWIACYCLIC_CLEAN_hash_msg(digest, _HASH_LEN, sm, *mlen);
|
||||
|
||||
rc = PQCLEAN_RAINBOWIACYCLIC_CLEAN_rainbow_verify_cyclic(digest, sm + mlen[0], (const cpk_t *)pk);
|
||||
}
|
||||
if (!rc) {
|
||||
memcpy( m, sm, smlen - _SIGNATURE_BYTE );
|
||||
} else { // bad signature
|
||||
*mlen = (size_t) -1;
|
||||
memset(m, 0, smlen);
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
int PQCLEAN_RAINBOWIACYCLIC_CLEAN_crypto_sign_signature(
|
||||
@ -90,5 +76,4 @@ int PQCLEAN_RAINBOWIACYCLIC_CLEAN_crypto_sign_verify(
|
||||
unsigned char digest[_HASH_LEN];
|
||||
PQCLEAN_RAINBOWIACYCLIC_CLEAN_hash_msg( digest, _HASH_LEN, m, mlen );
|
||||
return PQCLEAN_RAINBOWIACYCLIC_CLEAN_rainbow_verify_cyclic( digest, sig, (const cpk_t *)pk );
|
||||
|
||||
}
|
||||
|
@ -2,7 +2,6 @@
|
||||
/// @brief Implementations for functions in rainbow_keypair_computation.h
|
||||
///
|
||||
|
||||
|
||||
#include "blas.h"
|
||||
#include "blas_comm.h"
|
||||
#include "rainbow_blas.h"
|
||||
@ -12,7 +11,6 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
|
||||
void PQCLEAN_RAINBOWVCCLASSIC_CLEAN_extcpk_to_pk( pk_t *pk, const ext_cpk_t *cpk ) {
|
||||
const unsigned char *idx_l1 = cpk->l1_Q1;
|
||||
const unsigned char *idx_l2 = cpk->l2_Q1;
|
||||
@ -187,11 +185,7 @@ void calculate_Q_from_F_ref( ext_cpk_t *Qs, const sk_t *Fs, const sk_t *Ts ) {
|
||||
batch_trimatTr_madd( Qs->l2_Q6, Fs->l2_F5, Ts->t3, _O1, _O1_BYTE, _O2, _O2_BYTE ); // F2tr*T2 + F5_F5T*T3 + F6
|
||||
batch_matTr_madd( Qs->l2_Q6, Ts->t1, _V1, _V1_BYTE, _O1, Qs->l2_Q3, _O2, _O2_BYTE ); // Q6
|
||||
}
|
||||
// TODO: these defines are not really required for a clean implementation - just implement directly
|
||||
#define calculate_Q_from_F_impl calculate_Q_from_F_ref
|
||||
void PQCLEAN_RAINBOWVCCLASSIC_CLEAN_calculate_Q_from_F( ext_cpk_t *Qs, const sk_t *Fs, const sk_t *Ts ) {
|
||||
calculate_Q_from_F_impl( Qs, Fs, Ts );
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
@ -12,23 +12,15 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
|
||||
|
||||
int
|
||||
PQCLEAN_RAINBOWVCCLASSIC_CLEAN_crypto_sign_keypair(unsigned char *pk, unsigned char *sk) {
|
||||
unsigned char sk_seed[LEN_SKSEED] = {0};
|
||||
randombytes( sk_seed, LEN_SKSEED );
|
||||
|
||||
|
||||
PQCLEAN_RAINBOWVCCLASSIC_CLEAN_generate_keypair( (pk_t *) pk, (sk_t *) sk, sk_seed );
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
int
|
||||
PQCLEAN_RAINBOWVCCLASSIC_CLEAN_crypto_sign(unsigned char *sm, size_t *smlen, const unsigned char *m, size_t mlen, const unsigned char *sk) {
|
||||
unsigned char digest[_HASH_LEN];
|
||||
@ -38,35 +30,29 @@ PQCLEAN_RAINBOWVCCLASSIC_CLEAN_crypto_sign(unsigned char *sm, size_t *smlen, con
|
||||
memcpy( sm, m, mlen );
|
||||
smlen[0] = mlen + _SIGNATURE_BYTE;
|
||||
|
||||
|
||||
return PQCLEAN_RAINBOWVCCLASSIC_CLEAN_rainbow_sign( sm + mlen, (const sk_t *)sk, digest );
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
int
|
||||
PQCLEAN_RAINBOWVCCLASSIC_CLEAN_crypto_sign_open(unsigned char *m, size_t *mlen, const unsigned char *sm, size_t smlen, const unsigned char *pk) {
|
||||
//TODO: this should not copy out the message if verification fails
|
||||
int rc;
|
||||
if ( _SIGNATURE_BYTE > smlen ) {
|
||||
return -1;
|
||||
}
|
||||
memcpy( m, sm, smlen - _SIGNATURE_BYTE );
|
||||
mlen[0] = smlen - _SIGNATURE_BYTE;
|
||||
rc = -1;
|
||||
} else {
|
||||
*mlen = smlen - _SIGNATURE_BYTE;
|
||||
|
||||
unsigned char digest[_HASH_LEN];
|
||||
PQCLEAN_RAINBOWVCCLASSIC_CLEAN_hash_msg( digest, _HASH_LEN, m, *mlen );
|
||||
|
||||
|
||||
return PQCLEAN_RAINBOWVCCLASSIC_CLEAN_rainbow_verify( digest, sm + mlen[0], (const pk_t *)pk );
|
||||
|
||||
|
||||
PQCLEAN_RAINBOWVCCLASSIC_CLEAN_hash_msg(digest, _HASH_LEN, sm, *mlen);
|
||||
|
||||
rc = PQCLEAN_RAINBOWVCCLASSIC_CLEAN_rainbow_verify(digest, sm + mlen[0], (const pk_t *)pk);
|
||||
}
|
||||
if (!rc) {
|
||||
memcpy( m, sm, smlen - _SIGNATURE_BYTE );
|
||||
} else { // bad signature
|
||||
*mlen = (size_t) -1;
|
||||
memset(m, 0, smlen);
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
int PQCLEAN_RAINBOWVCCLASSIC_CLEAN_crypto_sign_signature(
|
||||
@ -88,5 +74,4 @@ int PQCLEAN_RAINBOWVCCLASSIC_CLEAN_crypto_sign_verify(
|
||||
unsigned char digest[_HASH_LEN];
|
||||
PQCLEAN_RAINBOWVCCLASSIC_CLEAN_hash_msg( digest, _HASH_LEN, m, mlen );
|
||||
return PQCLEAN_RAINBOWVCCLASSIC_CLEAN_rainbow_verify( digest, sig, (const pk_t *)pk );
|
||||
|
||||
}
|
||||
|
@ -2,7 +2,6 @@
|
||||
/// @brief Implementations for functions in rainbow_keypair_computation.h
|
||||
///
|
||||
|
||||
|
||||
#include "blas.h"
|
||||
#include "blas_comm.h"
|
||||
#include "rainbow_blas.h"
|
||||
@ -12,7 +11,6 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
|
||||
void PQCLEAN_RAINBOWVCCYCLICCOMPRESSED_CLEAN_extcpk_to_pk( pk_t *pk, const ext_cpk_t *cpk ) {
|
||||
const unsigned char *idx_l1 = cpk->l1_Q1;
|
||||
const unsigned char *idx_l2 = cpk->l2_Q1;
|
||||
@ -82,9 +80,6 @@ void PQCLEAN_RAINBOWVCCYCLICCOMPRESSED_CLEAN_extcpk_to_pk( pk_t *pk, const ext_c
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
static
|
||||
void calculate_F_from_Q_ref( sk_t *Fs, const sk_t *Qs, sk_t *Ts ) {
|
||||
// Layer 1
|
||||
@ -147,9 +142,6 @@ void calculate_F_from_Q_ref( sk_t *Fs, const sk_t *Qs, sk_t *Ts ) {
|
||||
|
||||
}
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
static
|
||||
void calculate_Q_from_F_cyclic_ref( cpk_t *Qs, const sk_t *Fs, const sk_t *Ts ) {
|
||||
// Layer 1: Computing Q5, Q3, Q6, Q9
|
||||
@ -212,17 +204,10 @@ void calculate_Q_from_F_cyclic_ref( cpk_t *Qs, const sk_t *Fs, const sk_t *Ts )
|
||||
PQCLEAN_RAINBOWVCCYCLICCOMPRESSED_CLEAN_UpperTrianglize( Qs->l2_Q9, tempQ.l2_F3, _O2, _O2_BYTE ); // Q9
|
||||
}
|
||||
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
// Choosing implementations depends on the macros: _BLAS_SSE_ and _BLAS_AVX2_
|
||||
#define calculate_F_from_Q_impl calculate_F_from_Q_ref
|
||||
#define calculate_Q_from_F_cyclic_impl calculate_Q_from_F_cyclic_ref
|
||||
|
||||
|
||||
|
||||
void PQCLEAN_RAINBOWVCCYCLICCOMPRESSED_CLEAN_calculate_F_from_Q( sk_t *Fs, const sk_t *Qs, sk_t *Ts ) {
|
||||
calculate_F_from_Q_impl( Fs, Qs, Ts );
|
||||
}
|
||||
@ -230,4 +215,3 @@ void PQCLEAN_RAINBOWVCCYCLICCOMPRESSED_CLEAN_calculate_F_from_Q( sk_t *Fs, const
|
||||
void PQCLEAN_RAINBOWVCCYCLICCOMPRESSED_CLEAN_calculate_Q_from_F_cyclic( cpk_t *Qs, const sk_t *Fs, const sk_t *Ts ) {
|
||||
calculate_Q_from_F_cyclic_impl( Qs, Fs, Ts );
|
||||
}
|
||||
|
||||
|
@ -12,25 +12,17 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
|
||||
|
||||
int
|
||||
PQCLEAN_RAINBOWVCCYCLICCOMPRESSED_CLEAN_crypto_sign_keypair(unsigned char *pk, unsigned char *sk) {
|
||||
unsigned char sk_seed[LEN_SKSEED] = {0};
|
||||
randombytes( sk_seed, LEN_SKSEED );
|
||||
|
||||
|
||||
unsigned char pk_seed[LEN_PKSEED] = {0};
|
||||
randombytes( pk_seed, LEN_PKSEED );
|
||||
PQCLEAN_RAINBOWVCCYCLICCOMPRESSED_CLEAN_generate_compact_keypair_cyclic( (cpk_t *) pk, (csk_t *) sk, pk_seed, sk_seed );
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
int
|
||||
PQCLEAN_RAINBOWVCCYCLICCOMPRESSED_CLEAN_crypto_sign(unsigned char *sm, size_t *smlen, const unsigned char *m, size_t mlen, const unsigned char *sk) {
|
||||
unsigned char digest[_HASH_LEN];
|
||||
@ -40,35 +32,29 @@ PQCLEAN_RAINBOWVCCYCLICCOMPRESSED_CLEAN_crypto_sign(unsigned char *sm, size_t *s
|
||||
memcpy( sm, m, mlen );
|
||||
smlen[0] = mlen + _SIGNATURE_BYTE;
|
||||
|
||||
|
||||
return PQCLEAN_RAINBOWVCCYCLICCOMPRESSED_CLEAN_rainbow_sign_cyclic( sm + mlen, (const csk_t *)sk, digest );
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
int
|
||||
PQCLEAN_RAINBOWVCCYCLICCOMPRESSED_CLEAN_crypto_sign_open(unsigned char *m, size_t *mlen, const unsigned char *sm, size_t smlen, const unsigned char *pk) {
|
||||
//TODO: this should not copy out the message if verification fails
|
||||
int rc;
|
||||
if ( _SIGNATURE_BYTE > smlen ) {
|
||||
return -1;
|
||||
}
|
||||
memcpy( m, sm, smlen - _SIGNATURE_BYTE );
|
||||
mlen[0] = smlen - _SIGNATURE_BYTE;
|
||||
rc = -1;
|
||||
} else {
|
||||
*mlen = smlen - _SIGNATURE_BYTE;
|
||||
|
||||
unsigned char digest[_HASH_LEN];
|
||||
PQCLEAN_RAINBOWVCCYCLICCOMPRESSED_CLEAN_hash_msg( digest, _HASH_LEN, m, *mlen );
|
||||
|
||||
|
||||
return PQCLEAN_RAINBOWVCCYCLICCOMPRESSED_CLEAN_rainbow_verify_cyclic( digest, sm + mlen[0], (const cpk_t *)pk );
|
||||
|
||||
|
||||
PQCLEAN_RAINBOWVCCYCLICCOMPRESSED_CLEAN_hash_msg(digest, _HASH_LEN, sm, *mlen);
|
||||
|
||||
rc = PQCLEAN_RAINBOWVCCYCLICCOMPRESSED_CLEAN_rainbow_verify_cyclic(digest, sm + mlen[0], (const cpk_t *)pk);
|
||||
}
|
||||
if (!rc) {
|
||||
memcpy( m, sm, smlen - _SIGNATURE_BYTE );
|
||||
} else { // bad signature
|
||||
*mlen = (size_t) -1;
|
||||
memset(m, 0, smlen);
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
int PQCLEAN_RAINBOWVCCYCLICCOMPRESSED_CLEAN_crypto_sign_signature(
|
||||
@ -90,5 +76,4 @@ int PQCLEAN_RAINBOWVCCYCLICCOMPRESSED_CLEAN_crypto_sign_verify(
|
||||
unsigned char digest[_HASH_LEN];
|
||||
PQCLEAN_RAINBOWVCCYCLICCOMPRESSED_CLEAN_hash_msg( digest, _HASH_LEN, m, mlen );
|
||||
return PQCLEAN_RAINBOWVCCYCLICCOMPRESSED_CLEAN_rainbow_verify_cyclic( digest, sig, (const cpk_t *)pk );
|
||||
|
||||
}
|
||||
|
@ -2,7 +2,6 @@
|
||||
/// @brief Implementations for functions in rainbow_keypair_computation.h
|
||||
///
|
||||
|
||||
|
||||
#include "blas.h"
|
||||
#include "blas_comm.h"
|
||||
#include "rainbow_blas.h"
|
||||
@ -12,7 +11,6 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
|
||||
void PQCLEAN_RAINBOWVCCYCLIC_CLEAN_extcpk_to_pk( pk_t *pk, const ext_cpk_t *cpk ) {
|
||||
const unsigned char *idx_l1 = cpk->l1_Q1;
|
||||
const unsigned char *idx_l2 = cpk->l2_Q1;
|
||||
@ -82,9 +80,6 @@ void PQCLEAN_RAINBOWVCCYCLIC_CLEAN_extcpk_to_pk( pk_t *pk, const ext_cpk_t *cpk
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
static
|
||||
void calculate_F_from_Q_ref( sk_t *Fs, const sk_t *Qs, sk_t *Ts ) {
|
||||
// Layer 1
|
||||
@ -147,9 +142,6 @@ void calculate_F_from_Q_ref( sk_t *Fs, const sk_t *Qs, sk_t *Ts ) {
|
||||
|
||||
}
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
static
|
||||
void calculate_Q_from_F_cyclic_ref( cpk_t *Qs, const sk_t *Fs, const sk_t *Ts ) {
|
||||
// Layer 1: Computing Q5, Q3, Q6, Q9
|
||||
@ -212,17 +204,10 @@ void calculate_Q_from_F_cyclic_ref( cpk_t *Qs, const sk_t *Fs, const sk_t *Ts )
|
||||
PQCLEAN_RAINBOWVCCYCLIC_CLEAN_UpperTrianglize( Qs->l2_Q9, tempQ.l2_F3, _O2, _O2_BYTE ); // Q9
|
||||
}
|
||||
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
// Choosing implementations depends on the macros: _BLAS_SSE_ and _BLAS_AVX2_
|
||||
#define calculate_F_from_Q_impl calculate_F_from_Q_ref
|
||||
#define calculate_Q_from_F_cyclic_impl calculate_Q_from_F_cyclic_ref
|
||||
|
||||
|
||||
|
||||
void PQCLEAN_RAINBOWVCCYCLIC_CLEAN_calculate_F_from_Q( sk_t *Fs, const sk_t *Qs, sk_t *Ts ) {
|
||||
calculate_F_from_Q_impl( Fs, Qs, Ts );
|
||||
}
|
||||
@ -230,4 +215,3 @@ void PQCLEAN_RAINBOWVCCYCLIC_CLEAN_calculate_F_from_Q( sk_t *Fs, const sk_t *Qs,
|
||||
void PQCLEAN_RAINBOWVCCYCLIC_CLEAN_calculate_Q_from_F_cyclic( cpk_t *Qs, const sk_t *Fs, const sk_t *Ts ) {
|
||||
calculate_Q_from_F_cyclic_impl( Qs, Fs, Ts );
|
||||
}
|
||||
|
||||
|
@ -12,25 +12,17 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
|
||||
|
||||
int
|
||||
PQCLEAN_RAINBOWVCCYCLIC_CLEAN_crypto_sign_keypair(unsigned char *pk, unsigned char *sk) {
|
||||
unsigned char sk_seed[LEN_SKSEED] = {0};
|
||||
randombytes( sk_seed, LEN_SKSEED );
|
||||
|
||||
|
||||
unsigned char pk_seed[LEN_PKSEED] = {0};
|
||||
randombytes( pk_seed, LEN_PKSEED );
|
||||
PQCLEAN_RAINBOWVCCYCLIC_CLEAN_generate_keypair_cyclic( (cpk_t *) pk, (sk_t *) sk, pk_seed, sk_seed );
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
int
|
||||
PQCLEAN_RAINBOWVCCYCLIC_CLEAN_crypto_sign(unsigned char *sm, size_t *smlen, const unsigned char *m, size_t mlen, const unsigned char *sk) {
|
||||
unsigned char digest[_HASH_LEN];
|
||||
@ -40,35 +32,29 @@ PQCLEAN_RAINBOWVCCYCLIC_CLEAN_crypto_sign(unsigned char *sm, size_t *smlen, cons
|
||||
memcpy( sm, m, mlen );
|
||||
smlen[0] = mlen + _SIGNATURE_BYTE;
|
||||
|
||||
|
||||
return PQCLEAN_RAINBOWVCCYCLIC_CLEAN_rainbow_sign( sm + mlen, (const sk_t *)sk, digest );
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
int
|
||||
PQCLEAN_RAINBOWVCCYCLIC_CLEAN_crypto_sign_open(unsigned char *m, size_t *mlen, const unsigned char *sm, size_t smlen, const unsigned char *pk) {
|
||||
//TODO: this should not copy out the message if verification fails
|
||||
int rc;
|
||||
if ( _SIGNATURE_BYTE > smlen ) {
|
||||
return -1;
|
||||
}
|
||||
memcpy( m, sm, smlen - _SIGNATURE_BYTE );
|
||||
mlen[0] = smlen - _SIGNATURE_BYTE;
|
||||
rc = -1;
|
||||
} else {
|
||||
*mlen = smlen - _SIGNATURE_BYTE;
|
||||
|
||||
unsigned char digest[_HASH_LEN];
|
||||
PQCLEAN_RAINBOWVCCYCLIC_CLEAN_hash_msg( digest, _HASH_LEN, m, *mlen );
|
||||
|
||||
|
||||
return PQCLEAN_RAINBOWVCCYCLIC_CLEAN_rainbow_verify_cyclic( digest, sm + mlen[0], (const cpk_t *)pk );
|
||||
|
||||
|
||||
PQCLEAN_RAINBOWVCCYCLIC_CLEAN_hash_msg(digest, _HASH_LEN, sm, *mlen);
|
||||
|
||||
rc = PQCLEAN_RAINBOWVCCYCLIC_CLEAN_rainbow_verify_cyclic(digest, sm + mlen[0], (const cpk_t *)pk);
|
||||
}
|
||||
if (!rc) {
|
||||
memcpy( m, sm, smlen - _SIGNATURE_BYTE );
|
||||
} else { // bad signature
|
||||
*mlen = (size_t) -1;
|
||||
memset(m, 0, smlen);
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
int PQCLEAN_RAINBOWVCCYCLIC_CLEAN_crypto_sign_signature(
|
||||
@ -90,5 +76,4 @@ int PQCLEAN_RAINBOWVCCYCLIC_CLEAN_crypto_sign_verify(
|
||||
unsigned char digest[_HASH_LEN];
|
||||
PQCLEAN_RAINBOWVCCYCLIC_CLEAN_hash_msg( digest, _HASH_LEN, m, mlen );
|
||||
return PQCLEAN_RAINBOWVCCYCLIC_CLEAN_rainbow_verify_cyclic( digest, sig, (const cpk_t *)pk );
|
||||
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user