gestumblinde

Gestumblinde - reference implementation of SLH-DSA
git clone git://www.tkruger.se/gestumblinde.git
Log | Files | Refs | README

slhdsa_gen.c (2430B)


      1 #include <stdio.h>
      2 #include <string.h>
      3 #include <stdlib.h>
      4 
      5 #include <api.h>
      6 #include <params.h>
      7 #include <randombytes.h>
      8 #include <jansson.h>
      9 
     10 #define str(s) #s
     11 #define xstr(s) str(s)
     12 #define STRING_PK xstr(PFX SLH PK)
     13 #define STRING_SK xstr(PFX SLH SK)
     14 #define STRING_MSG xstr(PFX SLH MSG)
     15 #define STRING_SIG xstr(PFX SLH SIGNATURE)
     16 
     17 #define SPX_MLEN 32
     18 
     19 int main(void)
     20 {
     21     int ret = 0;
     22 
     23     /* Make stdout buffer more responsive. */
     24     setbuf(stdout, NULL);
     25 
     26     unsigned char pk[SPX_PK_BYTES];
     27     unsigned char sk[SPX_SK_BYTES];
     28     unsigned char *m = malloc(SPX_MLEN);
     29     unsigned char *sm = malloc(SPX_BYTES + SPX_MLEN);
     30     unsigned char *mout = malloc(SPX_BYTES + SPX_MLEN);
     31     size_t smlen;
     32 
     33     randombytes(m,  SPX_MLEN);
     34     randombytes(pk, SPX_PK_BYTES);
     35     randombytes(sk, SPX_SK_BYTES-SPX_PK_BYTES);
     36     memcpy(sk + (SPX_SK_BYTES-SPX_PK_BYTES), pk, SPX_PK_BYTES);
     37 
     38     json_t* jtv = json_object();
     39     json_t* jpk = json_array();
     40     json_t* jpk_seed = json_array();
     41     json_t* jpk_root = json_array();
     42     json_t* jsk_seed = json_array();
     43     json_t* jsk_prf  = json_array();
     44     json_t* jsk = json_array();
     45     json_t* jmsg = json_array();
     46 
     47     size_t i;
     48     for(i = 0; i < SPX_N; i++) {
     49       json_t* t = json_integer((json_int_t) pk[i]);
     50       json_array_append(jpk_seed, t);
     51 
     52       t = json_integer((json_int_t) pk[i+SPX_N]);
     53       json_array_append(jpk_root, t);
     54 
     55       t = json_integer((json_int_t) sk[i]);
     56       json_array_append(jsk_seed, t);
     57 
     58       t = json_integer((json_int_t) sk[i+SPX_N]);
     59       json_array_append(jsk_prf,  t);
     60     }
     61 
     62     json_array_append(jsk, jsk_seed);
     63     json_array_append(jsk, jsk_prf);
     64     json_array_append(jsk, jpk_seed);
     65     json_array_append(jsk, jpk_root);
     66 
     67     json_array_append(jpk, jpk_seed);
     68     json_array_append(jpk, jpk_root);
     69 
     70     for(i = 0; i < SPX_MLEN; i++) {
     71       json_t* t = json_integer((json_int_t) m[i]);
     72       json_array_append(jmsg, t);
     73     }
     74 
     75     json_object_set(jtv, STRING_PK, jpk);
     76     json_object_set(jtv, STRING_SK, jsk);
     77     json_object_set(jtv, STRING_MSG, jmsg);
     78 
     79     crypto_sign_signature(sm, &smlen, m, SPX_MLEN, sk);
     80 
     81     json_t* jsig = json_array();
     82 
     83     for(i = 0; i < SPX_BYTES; i++) {
     84       json_t* t = json_integer((json_int_t) sm[i]);
     85       json_array_append(jsig, t);
     86     }
     87 
     88     json_object_set(jtv, STRING_SIG, jsig);
     89 
     90     json_dumpf(jtv, stdout, JSON_INDENT(2));
     91 
     92     free(m);
     93     free(sm);
     94     free(mout);
     95 
     96     return ret;
     97 }