aboutsummaryrefslogtreecommitdiff
path: root/crypto.h
blob: e7362365cb8e42ae7ec27dd718d0e1b7334fe1ad (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
/* This file is part of libbrandt.
 * Copyright (C) 2016 GNUnet e.V.
 *
 * libbrandt is free software: you can redistribute it and/or modify it under
 * the terms of the GNU General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later
 * version.
 *
 * libbrandt is distributed in the hope that it will be useful, but WITHOUT ANY
 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
 * A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along with
 * libbrandt.  If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * @file crypto.h
 * @brief Interface of the crypto primitives.
 */

#ifndef _BRANDT_CRYPTO_H
#define _BRANDT_CRYPTO_H

#include <gcrypt.h>
#include <stdint.h>

void brandt_crypto_init ();


/* --- RANDOM --- */

void brandt_rand_poll ();


/* --- HASHING --- */

struct brandt_hash_code {
	uint32_t bits[512 / 8 / sizeof (uint32_t)];   /* = 16 */
};

void brandt_hash (const void *block, size_t size, struct brandt_hash_code *ret);


/* --- MPI --- */

void brandt_mpi_print_unsigned (void *buf, size_t size, gcry_mpi_t val);
void brandt_mpi_scan_unsigned (gcry_mpi_t *result,
                               const void *data,
                               size_t     size);


/* --- EC --- */

struct ec_point {
	unsigned char data[256 / 8];
};

int ec_point_cmp (const gcry_mpi_point_t a, const gcry_mpi_point_t b);
void ec_skey_create (gcry_mpi_t skey);
void ec_keypair_create (gcry_mpi_point_t pkey, gcry_mpi_t skey);
void ec_keypair_create_base (gcry_mpi_point_t       pkey,
                             gcry_mpi_t             skey,
                             const gcry_mpi_point_t base);




/* --- Zero knowledge proofs --- */

void smc_zkp_dl (const gcry_mpi_point_t v,
                 const gcry_mpi_point_t g,
                 const gcry_mpi_t       x,
                 const gcry_mpi_point_t a,
                 gcry_mpi_t             c,
                 gcry_mpi_t             r);
int smc_zkp_dl_check (const gcry_mpi_point_t v,
                      const gcry_mpi_point_t g,
                      const gcry_mpi_point_t a,
                      const gcry_mpi_t       c,
                      const gcry_mpi_t       r);

void smc_zkp_2dle (const gcry_mpi_point_t v,
                   const gcry_mpi_point_t w,
                   const gcry_mpi_point_t g1,
                   const gcry_mpi_point_t g2,
                   const gcry_mpi_t       x,
                   gcry_mpi_point_t       a,
                   gcry_mpi_point_t       b,
                   gcry_mpi_t             c,
                   gcry_mpi_t             r);
int smc_zkp_2dle_check (const gcry_mpi_point_t v,
                        const gcry_mpi_point_t w,
                        const gcry_mpi_point_t g1,
                        const gcry_mpi_point_t g2,
                        const gcry_mpi_point_t a,
                        const gcry_mpi_point_t b,
                        const gcry_mpi_t       c,
                        const gcry_mpi_t       r);

void smc_zkp_0og (gcry_mpi_point_t       alpha,
                  const gcry_mpi_point_t m,
                  const gcry_mpi_point_t y,
                  gcry_mpi_point_t       beta,
                  gcry_mpi_point_t       a1,
                  gcry_mpi_point_t       a2,
                  gcry_mpi_point_t       b1,
                  gcry_mpi_point_t       b2,
                  gcry_mpi_t             c,
                  gcry_mpi_t             d1,
                  gcry_mpi_t             d2,
                  gcry_mpi_t             r1,
                  gcry_mpi_t             r2);
int smc_zkp_0og_check (const gcry_mpi_point_t alpha,
                       const gcry_mpi_point_t y,
                       const gcry_mpi_point_t beta,
                       const gcry_mpi_point_t a1,
                       const gcry_mpi_point_t a2,
                       const gcry_mpi_point_t b1,
                       const gcry_mpi_point_t b2,
                       const gcry_mpi_t       c,
                       const gcry_mpi_t       d1,
                       const gcry_mpi_t       d2,
                       const gcry_mpi_t       r1,
                       const gcry_mpi_t       r2);

#endif /* ifndef _BRANDT_CRYPTO_H */