浏览代码

csidh: adds interface with POD types only

keep-around/f007fe787db8a7e6f4e7d31e55e1d97011b7db44
Kris Kwiatkowski 5 年前
父节点
当前提交
1a54c2f55e
共有 2 个文件被更改,包括 66 次插入0 次删除
  1. +58
    -0
      csidh/ref/csidh/csidh.c
  2. +8
    -0
      csidh/ref/csidh/csidh.h

+ 58
- 0
csidh/ref/csidh/csidh.c 查看文件

@@ -5,6 +5,8 @@
#include "csidh.h"
#include "rng.h"

#include <stdio.h>

/* specific to p, should perhaps be somewhere else */
const unsigned primes[num_primes] = {
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;
}

/// 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);
}

+ 8
- 0
csidh/ref/csidh/csidh.h 查看文件

@@ -23,4 +23,12 @@ extern const public_key base;
void csidh_private(private_key *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

正在加载...
取消
保存