diff options
author | markus@openbsd.org <markus@openbsd.org> | 2018-02-23 15:58:37 +0000 |
---|---|---|
committer | Damien Miller <djm@mindrot.org> | 2018-02-26 11:40:41 +1100 |
commit | 1b11ea7c58cd5c59838b5fa574cd456d6047b2d4 (patch) | |
tree | 7e96cb41b5234b9d327f7c8f41392f09aed0994e /xmss_wots.h | |
parent | 7d330a1ac02076de98cfc8fda05353d57b603755 (diff) |
upstream: Add experimental support for PQC XMSS keys (Extended
Hash-Based Signatures) The code is not compiled in by default (see WITH_XMSS
in Makefile.inc) Joint work with stefan-lukas_gazdag at genua.eu See
https://tools.ietf.org/html/draft-irtf-cfrg-xmss-hash-based-signatures-12 ok
djm@
OpenBSD-Commit-ID: ef3eccb96762a5d6f135d7daeef608df7776a7ac
Diffstat (limited to 'xmss_wots.h')
-rw-r--r-- | xmss_wots.h | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/xmss_wots.h b/xmss_wots.h new file mode 100644 index 000000000..495431087 --- /dev/null +++ b/xmss_wots.h | |||
@@ -0,0 +1,59 @@ | |||
1 | /* | ||
2 | wots.h version 20160722 | ||
3 | Andreas Hülsing | ||
4 | Joost Rijneveld | ||
5 | Public domain. | ||
6 | */ | ||
7 | |||
8 | #ifndef WOTS_H | ||
9 | #define WOTS_H | ||
10 | |||
11 | #include "stdint.h" | ||
12 | |||
13 | /** | ||
14 | * WOTS parameter set | ||
15 | * | ||
16 | * Meaning as defined in draft-irtf-cfrg-xmss-hash-based-signatures-02 | ||
17 | */ | ||
18 | typedef struct { | ||
19 | uint32_t len_1; | ||
20 | uint32_t len_2; | ||
21 | uint32_t len; | ||
22 | uint32_t n; | ||
23 | uint32_t w; | ||
24 | uint32_t log_w; | ||
25 | uint32_t keysize; | ||
26 | } wots_params; | ||
27 | |||
28 | /** | ||
29 | * Set the WOTS parameters, | ||
30 | * only m, n, w are required as inputs, | ||
31 | * len, len_1, and len_2 are computed from those. | ||
32 | * | ||
33 | * Assumes w is a power of 2 | ||
34 | */ | ||
35 | void wots_set_params(wots_params *params, int n, int w); | ||
36 | |||
37 | /** | ||
38 | * WOTS key generation. Takes a 32byte seed for the secret key, expands it to a full WOTS secret key and computes the corresponding public key. | ||
39 | * For this it takes the seed pub_seed which is used to generate bitmasks and hash keys and the address of this WOTS key pair addr | ||
40 | * | ||
41 | * params, must have been initialized before using wots_set params for params ! This is not done in this function | ||
42 | * | ||
43 | * Places the computed public key at address pk. | ||
44 | */ | ||
45 | void wots_pkgen(unsigned char *pk, const unsigned char *sk, const wots_params *params, const unsigned char *pub_seed, uint32_t addr[8]); | ||
46 | |||
47 | /** | ||
48 | * Takes a m-byte message and the 32-byte seed for the secret key to compute a signature that is placed at "sig". | ||
49 | * | ||
50 | */ | ||
51 | int wots_sign(unsigned char *sig, const unsigned char *msg, const unsigned char *sk, const wots_params *params, const unsigned char *pub_seed, uint32_t addr[8]); | ||
52 | |||
53 | /** | ||
54 | * Takes a WOTS signature, a m-byte message and computes a WOTS public key that it places at pk. | ||
55 | * | ||
56 | */ | ||
57 | int wots_pkFromSig(unsigned char *pk, const unsigned char *sig, const unsigned char *msg, const wots_params *params, const unsigned char *pub_seed, uint32_t addr[8]); | ||
58 | |||
59 | #endif | ||