You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

xmss_core_fast.h 2.9 KiB

8 年之前
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. /*
  2. xmss_fast.h version 20160722
  3. Andreas Hülsing
  4. Joost Rijneveld
  5. Public domain.
  6. */
  7. #ifndef XMSS_CORE_H
  8. #define XMSS_CORE_H
  9. typedef struct{
  10. unsigned int h;
  11. unsigned int next_idx;
  12. unsigned int stackusage;
  13. unsigned char completed;
  14. unsigned char *node;
  15. } treehash_inst;
  16. typedef struct {
  17. unsigned char *stack;
  18. unsigned int stackoffset;
  19. unsigned char *stacklevels;
  20. unsigned char *auth;
  21. unsigned char *keep;
  22. treehash_inst *treehash;
  23. unsigned char *retain;
  24. unsigned int next_leaf;
  25. } bds_state;
  26. /**
  27. * Initialize BDS state struct
  28. * parameter names are the same as used in the description of the BDS traversal
  29. */
  30. void xmss_set_bds_state(bds_state *state, unsigned char *stack,
  31. int stackoffset, unsigned char *stacklevels,
  32. unsigned char *auth, unsigned char *keep,
  33. treehash_inst *treehash, unsigned char *retain,
  34. int next_leaf);
  35. /**
  36. * Generates a XMSS key pair for a given parameter set.
  37. * Format sk: [(32bit) idx || SK_SEED || SK_PRF || PUB_SEED || root]
  38. * Format pk: [root || PUB_SEED] omitting algo oid.
  39. */
  40. int xmss_core_keypair(unsigned char *pk, unsigned char *sk, bds_state *state);
  41. /**
  42. * Signs a message.
  43. * Returns
  44. * 1. an array containing the signature followed by the message AND
  45. * 2. an updated secret key!
  46. */
  47. int xmss_core_sign(unsigned char *sk, bds_state *state,
  48. unsigned char *sm, unsigned long long *smlen,
  49. const unsigned char *m, unsigned long long mlen);
  50. /**
  51. * Verifies a given message signature pair under a given public key.
  52. *
  53. * Note: msg and mlen are pure outputs which carry the message in case verification succeeds. The (input) message is assumed to be within sm which has the form (sig||msg).
  54. */
  55. int xmss_core_sign_open(unsigned char *m, unsigned long long *mlen,
  56. const unsigned char *sm, unsigned long long smlen,
  57. const unsigned char *pk);
  58. /*
  59. * Generates a XMSSMT key pair for a given parameter set.
  60. * Format sk: [(ceil(h/8) bit) idx || SK_SEED || SK_PRF || PUB_SEED || root]
  61. * Format pk: [root || PUB_SEED] omitting algo oid.
  62. */
  63. int xmssmt_core_keypair(unsigned char *pk, unsigned char *sk,
  64. bds_state *states, unsigned char *wots_sigs);
  65. /**
  66. * Signs a message.
  67. * Returns
  68. * 1. an array containing the signature followed by the message AND
  69. * 2. an updated secret key!
  70. */
  71. int xmssmt_core_sign(unsigned char *sk,
  72. bds_state *states, unsigned char *wots_sigs,
  73. unsigned char *sm, unsigned long long *smlen,
  74. const unsigned char *m, unsigned long long mlen);
  75. /**
  76. * Verifies a given message signature pair under a given public key.
  77. */
  78. int xmssmt_core_sign_open(unsigned char *m, unsigned long long *mlen,
  79. const unsigned char *sm, unsigned long long smlen,
  80. const unsigned char *pk);
  81. #endif