csidh: adds interface with POD types only
This commit is contained in:
parent
0a242b5d0b
commit
1a54c2f55e
@ -5,6 +5,8 @@
|
|||||||
#include "csidh.h"
|
#include "csidh.h"
|
||||||
#include "rng.h"
|
#include "rng.h"
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
/* specific to p, should perhaps be somewhere else */
|
/* specific to p, should perhaps be somewhere else */
|
||||||
const unsigned primes[num_primes] = {
|
const unsigned primes[num_primes] = {
|
||||||
3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59,
|
3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59,
|
||||||
@ -218,3 +220,59 @@ bool csidh(public_key *out, public_key const *in, private_key const *priv)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Public API
|
||||||
|
|
||||||
|
void export_public(uint8_t *out, const public_key *pub) {
|
||||||
|
for(size_t i=0; i<64; i++) {
|
||||||
|
size_t j = i / 8;
|
||||||
|
size_t k = i % 8;
|
||||||
|
out[i] = ((uint64_t)pub->A.x.c[j] >> (8*k)) & 0xFF;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void import_public(public_key *pub, const uint8_t *out) {
|
||||||
|
for (size_t i=0; i<64; i++) {
|
||||||
|
size_t j = i / 8;
|
||||||
|
size_t k = i%8;
|
||||||
|
uint64_t tmp = out[i];
|
||||||
|
pub->A.x.c[j] |= tmp << (8*k);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void export_private(uint8_t *out, const private_key *prv) {
|
||||||
|
for(size_t i=0; i<37; i++) {
|
||||||
|
out[i] = (uint8_t) prv->e[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void import_private(private_key *prv, const uint8_t *out) {
|
||||||
|
for (size_t i=0; i<37; i++) {
|
||||||
|
prv->e[i] = (int8_t) out[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void keygen_prv(uint8_t private[37]) {
|
||||||
|
private_key priv;
|
||||||
|
csidh_private(&priv);
|
||||||
|
export_private(&private[0], &priv);
|
||||||
|
}
|
||||||
|
|
||||||
|
void keygen_pub(uint8_t public[64], const uint8_t private[37]) {
|
||||||
|
private_key prv1 = {0};
|
||||||
|
public_key pub1 = {0};
|
||||||
|
import_private(&prv1, &private[0]);
|
||||||
|
csidh(&pub1, &base, &prv1);
|
||||||
|
export_public(&public[0], &pub1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void derive(uint8_t result[64], const uint8_t public[64], const uint8_t private[37]) {
|
||||||
|
public_key pub = {0};
|
||||||
|
public_key ss = {0};
|
||||||
|
private_key prv;
|
||||||
|
|
||||||
|
import_private(&prv, &private[0]);
|
||||||
|
import_public(&pub, &public[0]);
|
||||||
|
|
||||||
|
csidh(&ss, &pub, &prv);
|
||||||
|
export_public(&result[0], &ss);
|
||||||
|
}
|
||||||
|
@ -23,4 +23,12 @@ extern const public_key base;
|
|||||||
void csidh_private(private_key *priv);
|
void csidh_private(private_key *priv);
|
||||||
bool csidh(public_key *out, public_key const *in, private_key const *priv);
|
bool csidh(public_key *out, public_key const *in, private_key const *priv);
|
||||||
|
|
||||||
|
void keygen_prv(uint8_t private[37]);
|
||||||
|
void keygen_pub(uint8_t public[64], const uint8_t private[37]);
|
||||||
|
void derive(uint8_t result[64], const uint8_t public[64], const uint8_t private_key[37]);
|
||||||
|
|
||||||
|
void export_public(uint8_t *out, const public_key *pub);
|
||||||
|
void import_public(public_key *pub, const uint8_t *out);
|
||||||
|
void export_private(uint8_t *out, const private_key *prv);
|
||||||
|
void import_private(private_key *prv, const uint8_t *out);
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user