Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

97 рядки
3.2 KiB

  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. #include "params.h"
  10. typedef struct{
  11. unsigned int h;
  12. unsigned int next_idx;
  13. unsigned int stackusage;
  14. unsigned char completed;
  15. unsigned char *node;
  16. } treehash_inst;
  17. typedef struct {
  18. unsigned char *stack;
  19. unsigned int stackoffset;
  20. unsigned char *stacklevels;
  21. unsigned char *auth;
  22. unsigned char *keep;
  23. treehash_inst *treehash;
  24. unsigned char *retain;
  25. unsigned int next_leaf;
  26. } bds_state;
  27. /**
  28. * Initialize BDS state struct
  29. * parameter names are the same as used in the description of the BDS traversal
  30. */
  31. void xmss_set_bds_state(bds_state *state, unsigned char *stack,
  32. int stackoffset, unsigned char *stacklevels,
  33. unsigned char *auth, unsigned char *keep,
  34. treehash_inst *treehash, unsigned char *retain,
  35. int next_leaf);
  36. /**
  37. * Generates a XMSS key pair for a given parameter set.
  38. * Format sk: [(32bit) idx || SK_SEED || SK_PRF || PUB_SEED || root]
  39. * Format pk: [root || PUB_SEED] omitting algo oid.
  40. */
  41. int xmss_core_keypair(const xmss_params *params,
  42. unsigned char *pk, unsigned char *sk, bds_state *state);
  43. /**
  44. * Signs a message.
  45. * Returns
  46. * 1. an array containing the signature followed by the message AND
  47. * 2. an updated secret key!
  48. */
  49. int xmss_core_sign(const xmss_params *params,
  50. unsigned char *sk, bds_state *state,
  51. unsigned char *sm, unsigned long long *smlen,
  52. const unsigned char *m, unsigned long long mlen);
  53. /**
  54. * Verifies a given message signature pair under a given public key.
  55. *
  56. * 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).
  57. */
  58. int xmss_core_sign_open(const xmss_params *params,
  59. unsigned char *m, unsigned long long *mlen,
  60. const unsigned char *sm, unsigned long long smlen,
  61. const unsigned char *pk);
  62. /*
  63. * Generates a XMSSMT key pair for a given parameter set.
  64. * Format sk: [(ceil(h/8) bit) idx || SK_SEED || SK_PRF || PUB_SEED || root]
  65. * Format pk: [root || PUB_SEED] omitting algo oid.
  66. */
  67. int xmssmt_core_keypair(const xmss_params *params,
  68. unsigned char *pk, unsigned char *sk,
  69. bds_state *states, unsigned char *wots_sigs);
  70. /**
  71. * Signs a message.
  72. * Returns
  73. * 1. an array containing the signature followed by the message AND
  74. * 2. an updated secret key!
  75. */
  76. int xmssmt_core_sign(const xmss_params *params,
  77. unsigned char *sk,
  78. bds_state *states, unsigned char *wots_sigs,
  79. unsigned char *sm, unsigned long long *smlen,
  80. const unsigned char *m, unsigned long long mlen);
  81. /**
  82. * Verifies a given message signature pair under a given public key.
  83. */
  84. int xmssmt_core_sign_open(const xmss_params *params,
  85. unsigned char *m, unsigned long long *mlen,
  86. const unsigned char *sm, unsigned long long smlen,
  87. const unsigned char *pk);
  88. #endif