xref: /freebsd/crypto/openssh/xmss_fast.h (revision 47dd1d1b619cc035b82b49a91a25544309ff95ae)
1*47dd1d1bSDag-Erling Smørgrav #ifdef WITH_XMSS
2*47dd1d1bSDag-Erling Smørgrav /* $OpenBSD: xmss_fast.h,v 1.2 2018/02/26 03:56:44 dtucker Exp $ */
3*47dd1d1bSDag-Erling Smørgrav /*
4*47dd1d1bSDag-Erling Smørgrav xmss_fast.h version 20160722
5*47dd1d1bSDag-Erling Smørgrav Andreas Hülsing
6*47dd1d1bSDag-Erling Smørgrav Joost Rijneveld
7*47dd1d1bSDag-Erling Smørgrav Public domain.
8*47dd1d1bSDag-Erling Smørgrav */
9*47dd1d1bSDag-Erling Smørgrav 
10*47dd1d1bSDag-Erling Smørgrav #include "xmss_wots.h"
11*47dd1d1bSDag-Erling Smørgrav 
12*47dd1d1bSDag-Erling Smørgrav #ifndef XMSS_H
13*47dd1d1bSDag-Erling Smørgrav #define XMSS_H
14*47dd1d1bSDag-Erling Smørgrav typedef struct{
15*47dd1d1bSDag-Erling Smørgrav   unsigned int level;
16*47dd1d1bSDag-Erling Smørgrav   unsigned long long subtree;
17*47dd1d1bSDag-Erling Smørgrav   unsigned int subleaf;
18*47dd1d1bSDag-Erling Smørgrav } leafaddr;
19*47dd1d1bSDag-Erling Smørgrav 
20*47dd1d1bSDag-Erling Smørgrav typedef struct{
21*47dd1d1bSDag-Erling Smørgrav   wots_params wots_par;
22*47dd1d1bSDag-Erling Smørgrav   unsigned int n;
23*47dd1d1bSDag-Erling Smørgrav   unsigned int h;
24*47dd1d1bSDag-Erling Smørgrav   unsigned int k;
25*47dd1d1bSDag-Erling Smørgrav } xmss_params;
26*47dd1d1bSDag-Erling Smørgrav 
27*47dd1d1bSDag-Erling Smørgrav typedef struct{
28*47dd1d1bSDag-Erling Smørgrav   xmss_params xmss_par;
29*47dd1d1bSDag-Erling Smørgrav   unsigned int n;
30*47dd1d1bSDag-Erling Smørgrav   unsigned int h;
31*47dd1d1bSDag-Erling Smørgrav   unsigned int d;
32*47dd1d1bSDag-Erling Smørgrav   unsigned int index_len;
33*47dd1d1bSDag-Erling Smørgrav } xmssmt_params;
34*47dd1d1bSDag-Erling Smørgrav 
35*47dd1d1bSDag-Erling Smørgrav typedef struct{
36*47dd1d1bSDag-Erling Smørgrav   unsigned int h;
37*47dd1d1bSDag-Erling Smørgrav   unsigned int next_idx;
38*47dd1d1bSDag-Erling Smørgrav   unsigned int stackusage;
39*47dd1d1bSDag-Erling Smørgrav   unsigned char completed;
40*47dd1d1bSDag-Erling Smørgrav   unsigned char *node;
41*47dd1d1bSDag-Erling Smørgrav } treehash_inst;
42*47dd1d1bSDag-Erling Smørgrav 
43*47dd1d1bSDag-Erling Smørgrav typedef struct {
44*47dd1d1bSDag-Erling Smørgrav   unsigned char *stack;
45*47dd1d1bSDag-Erling Smørgrav   unsigned int stackoffset;
46*47dd1d1bSDag-Erling Smørgrav   unsigned char *stacklevels;
47*47dd1d1bSDag-Erling Smørgrav   unsigned char *auth;
48*47dd1d1bSDag-Erling Smørgrav   unsigned char *keep;
49*47dd1d1bSDag-Erling Smørgrav   treehash_inst *treehash;
50*47dd1d1bSDag-Erling Smørgrav   unsigned char *retain;
51*47dd1d1bSDag-Erling Smørgrav   unsigned int next_leaf;
52*47dd1d1bSDag-Erling Smørgrav } bds_state;
53*47dd1d1bSDag-Erling Smørgrav 
54*47dd1d1bSDag-Erling Smørgrav /**
55*47dd1d1bSDag-Erling Smørgrav  * Initialize BDS state struct
56*47dd1d1bSDag-Erling Smørgrav  * parameter names are the same as used in the description of the BDS traversal
57*47dd1d1bSDag-Erling Smørgrav  */
58*47dd1d1bSDag-Erling Smørgrav void xmss_set_bds_state(bds_state *state, unsigned char *stack, int stackoffset, unsigned char *stacklevels, unsigned char *auth, unsigned char *keep, treehash_inst *treehash, unsigned char *retain, int next_leaf);
59*47dd1d1bSDag-Erling Smørgrav /**
60*47dd1d1bSDag-Erling Smørgrav  * Initializes parameter set.
61*47dd1d1bSDag-Erling Smørgrav  * Needed, for any of the other methods.
62*47dd1d1bSDag-Erling Smørgrav  */
63*47dd1d1bSDag-Erling Smørgrav int xmss_set_params(xmss_params *params, int n, int h, int w, int k);
64*47dd1d1bSDag-Erling Smørgrav /**
65*47dd1d1bSDag-Erling Smørgrav  * Initialize xmssmt_params struct
66*47dd1d1bSDag-Erling Smørgrav  * parameter names are the same as in the draft
67*47dd1d1bSDag-Erling Smørgrav  *
68*47dd1d1bSDag-Erling Smørgrav  * Especially h is the total tree height, i.e. the XMSS trees have height h/d
69*47dd1d1bSDag-Erling Smørgrav  */
70*47dd1d1bSDag-Erling Smørgrav int xmssmt_set_params(xmssmt_params *params, int n, int h, int d, int w, int k);
71*47dd1d1bSDag-Erling Smørgrav /**
72*47dd1d1bSDag-Erling Smørgrav  * Generates a XMSS key pair for a given parameter set.
73*47dd1d1bSDag-Erling Smørgrav  * Format sk: [(32bit) idx || SK_SEED || SK_PRF || PUB_SEED || root]
74*47dd1d1bSDag-Erling Smørgrav  * Format pk: [root || PUB_SEED] omitting algo oid.
75*47dd1d1bSDag-Erling Smørgrav  */
76*47dd1d1bSDag-Erling Smørgrav int xmss_keypair(unsigned char *pk, unsigned char *sk, bds_state *state, xmss_params *params);
77*47dd1d1bSDag-Erling Smørgrav /**
78*47dd1d1bSDag-Erling Smørgrav  * Signs a message.
79*47dd1d1bSDag-Erling Smørgrav  * Returns
80*47dd1d1bSDag-Erling Smørgrav  * 1. an array containing the signature followed by the message AND
81*47dd1d1bSDag-Erling Smørgrav  * 2. an updated secret key!
82*47dd1d1bSDag-Erling Smørgrav  *
83*47dd1d1bSDag-Erling Smørgrav  */
84*47dd1d1bSDag-Erling Smørgrav int xmss_sign(unsigned char *sk, bds_state *state, unsigned char *sig_msg, unsigned long long *sig_msg_len, const unsigned char *msg,unsigned long long msglen, const xmss_params *params);
85*47dd1d1bSDag-Erling Smørgrav /**
86*47dd1d1bSDag-Erling Smørgrav  * Verifies a given message signature pair under a given public key.
87*47dd1d1bSDag-Erling Smørgrav  *
88*47dd1d1bSDag-Erling Smørgrav  * Note: msg and msglen are pure outputs which carry the message in case verification succeeds. The (input) message is assumed to be within sig_msg which has the form (sig||msg).
89*47dd1d1bSDag-Erling Smørgrav  */
90*47dd1d1bSDag-Erling Smørgrav int xmss_sign_open(unsigned char *msg,unsigned long long *msglen, const unsigned char *sig_msg,unsigned long long sig_msg_len, const unsigned char *pk, const xmss_params *params);
91*47dd1d1bSDag-Erling Smørgrav 
92*47dd1d1bSDag-Erling Smørgrav /*
93*47dd1d1bSDag-Erling Smørgrav  * Generates a XMSSMT key pair for a given parameter set.
94*47dd1d1bSDag-Erling Smørgrav  * Format sk: [(ceil(h/8) bit) idx || SK_SEED || SK_PRF || PUB_SEED || root]
95*47dd1d1bSDag-Erling Smørgrav  * Format pk: [root || PUB_SEED] omitting algo oid.
96*47dd1d1bSDag-Erling Smørgrav  */
97*47dd1d1bSDag-Erling Smørgrav int xmssmt_keypair(unsigned char *pk, unsigned char *sk, bds_state *states, unsigned char *wots_sigs, xmssmt_params *params);
98*47dd1d1bSDag-Erling Smørgrav /**
99*47dd1d1bSDag-Erling Smørgrav  * Signs a message.
100*47dd1d1bSDag-Erling Smørgrav  * Returns
101*47dd1d1bSDag-Erling Smørgrav  * 1. an array containing the signature followed by the message AND
102*47dd1d1bSDag-Erling Smørgrav  * 2. an updated secret key!
103*47dd1d1bSDag-Erling Smørgrav  *
104*47dd1d1bSDag-Erling Smørgrav  */
105*47dd1d1bSDag-Erling Smørgrav int xmssmt_sign(unsigned char *sk, bds_state *state, unsigned char *wots_sigs, unsigned char *sig_msg, unsigned long long *sig_msg_len, const unsigned char *msg, unsigned long long msglen, const xmssmt_params *params);
106*47dd1d1bSDag-Erling Smørgrav /**
107*47dd1d1bSDag-Erling Smørgrav  * Verifies a given message signature pair under a given public key.
108*47dd1d1bSDag-Erling Smørgrav  */
109*47dd1d1bSDag-Erling Smørgrav int xmssmt_sign_open(unsigned char *msg, unsigned long long *msglen, const unsigned char *sig_msg, unsigned long long sig_msg_len, const unsigned char *pk, const xmssmt_params *params);
110*47dd1d1bSDag-Erling Smørgrav #endif
111*47dd1d1bSDag-Erling Smørgrav #endif /* WITH_XMSS */
112