Skip to content

Commit

Permalink
u coord and x coord decode/encode
Browse files Browse the repository at this point in the history
  • Loading branch information
Victor Machado committed Aug 31, 2020
1 parent b3c26a7 commit 20f2dfe
Show file tree
Hide file tree
Showing 5 changed files with 70 additions and 12 deletions.
12 changes: 11 additions & 1 deletion benchmark/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ main(int argc, char const *argv[])

hex_to_big("35fedf799f98ffaefb6fb91d77db7dc8fc8ff23fb5dc8fd77db7dc8ff3fc23f9", &a);
hex_to_big("3ace9e4bddc3029198a2be2ef84826ea23060628308a93ec90170e02654f33df", &b);
hex_to_big("1790f520c6645bdc6192b7da46c9382a5b9d8bf3e856a96e2c7018bc46f38534", &l);
hex_to_big("77076d0a7318a57d3c16c17251b26645df4c2f87ebc0992ab177fba51db92c2a", &l);
hex_to_big("9ac6241f", &c);
hex_to_big("30591451fdebaf7c7c0457f47a3139c5db1bde9faacc877667c0457f47a3139c5db1b7c0457f47a3139c5db1b421df59658c21d04c88ebf9ed887b58bf7112dc", &d);

Expand Down Expand Up @@ -140,10 +140,20 @@ main(int argc, char const *argv[])
big_null(&Gx);
Gx.value[0] = Gx_25519;

/*
if bits % 8:
u[-1] &= (1<<(bits%8))-1
*/
uint8_t bytes[32];
u32_to_u8(l.value, bytes, 8);
big_null(&l);
mask_bytes(bytes);
u8_to_u32(bytes, l.value, 8);
start = clock();
ecp_mul_cst(&Gx, &l, &p, &r);
end = clock();
cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC;
decode_uc(r.value);
big_to_hex(&r);
printf("%lf\n", cpu_time_used);
printf("\n");
Expand Down
40 changes: 39 additions & 1 deletion ecc/ecc_25519.c
Original file line number Diff line number Diff line change
@@ -1,9 +1,47 @@
#include "ecc_25519.h"

void
get_rnd_bytes(uint8_t *bytes)
{
FILE *fp = fopen("/dev/urandom", "rb");
for (int i = 0; i < 32; i++) {
int read = fread(&bytes[i], sizeof(uint8_t), 1, fp);
if (read == 0) {
return;
}
}
fclose(fp);
}

void
mask_bytes(uint8_t *bytes)
{
bytes[0] &= 248;
bytes[31] &= 127;
bytes[31] |= 64;
}

void
get_scalar25519(uint32_t *scalar)
{
uint8_t bytes[32];
get_rnd_bytes(bytes);
mask_bytes(bytes);
u8_to_u32(bytes, scalar, 8);
}

void
decode_uc(uint32_t *uc)
{
uint8_t bytes[32];
u32_to_u8(uc, bytes, 8);
u8_to_u32(bytes, uc, 8);
}

static inline void
cst_swap(uint8_t swap, big_t* a, big_t *b)
{
uint32_t dummy, mask = 0 - swap;
uint32_t dummy, mask = 0u - swap;

for (int i = 0; i < 8; i++) {
dummy = mask & (a->value[i] ^ b->value[i]);
Expand Down
4 changes: 4 additions & 0 deletions ecc/ecc_25519.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,9 @@
#define Gx_25519 9u

void ecp_mul_cst (big_t *, big_t *, big_t *, big_t *);
void get_rnd_bytes(uint8_t *);
void mask_bytes(uint8_t *);
void get_scalar25519(uint32_t *);
void decode_uc(uint32_t *);

#endif
13 changes: 10 additions & 3 deletions ecdh_aead_example.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,11 @@ int main() {
big_t prime, priv1, priv2;
big_t own_pbk, own_pbk2, own_pbk3, own_pbk4;

big_rnd_dig(&priv1);
big_rnd_dig(&priv2);
big_null(&priv1);
big_null(&priv2);

get_scalar25519(priv1.value);
get_scalar25519(priv2.value);

printf("\t\t\t --- ECDH - Key Agreement ---\nPrivate key1: ");
big_to_hex(&priv1);
Expand All @@ -23,10 +26,14 @@ int main() {
big_null(&Gx);
Gx.value[0] = Gx_25519;
ecp_mul_cst(&Gx, &priv1, &prime, &own_pbk);

ecp_mul_cst(&own_pbk, &priv2, &prime, &own_pbk2);

decode_uc(own_pbk2.value);

ecp_mul_cst(&Gx, &priv2, &prime, &own_pbk3);

ecp_mul_cst(&own_pbk3, &priv1, &prime, &own_pbk4);
decode_uc(own_pbk4.value);

printf("Public Key1: ");
big_to_hex(&own_pbk);
Expand Down
13 changes: 6 additions & 7 deletions utils.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,10 @@
void
u32_to_u8(uint32_t *state, uint8_t *stream, unsigned len)
{
for (int i = 0; i < len; i++) {
for (int i = len - 1; i >= 0; i--) {
uint32_t curr = state[i];
for (int j = 0; j < 4; j++) {
int stream_index = i * 4 + (3 - j);
stream[stream_index] = (uint8_t)((curr >> (j * 8)) & 0xFFu);
for (int j = 3; j >= 0; j--) {
stream[(len - 1 - i) * 4 + (3 - j)] = (uint8_t)(curr >> (8 * j));
}
}
}
Expand All @@ -16,10 +15,10 @@ void
u8_to_u32(uint8_t *stream, uint32_t *arr, unsigned len)
{
for (int i = 0; i < len; i++) {
uint32_t acc = 0;
uint32_t sum = 0;
for (int j = 0; j < 4; j++) {
acc += (uint32_t)(stream[i * 4 + j] << (j * 8));
sum += (uint32_t)stream[i * 4 + j] << (8 * j);
}
arr[i] = acc;
arr[i] = sum;
}
}

0 comments on commit 20f2dfe

Please sign in to comment.