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 }