|
- #include <stdint.h>
-
- #include "params.h"
- #include "xmss_core.h"
-
- /* This file provides wrapper functions that take keys that include OIDs to
- identify the parameter set to be used. After setting the parameters accordingly
- it falls back to the regular XMSS core functions. */
-
- int xmss_keypair(unsigned char *pk, unsigned char *sk, const uint32_t oid)
- {
- xmss_params params;
- unsigned int i;
-
- if (xmss_parse_oid(¶ms, oid)) {
- return 1;
- }
- for (i = 0; i < XMSS_OID_LEN; i++) {
- pk[i] = (oid >> (8 * i)) & 0xFF;
- /* For an implementation that uses runtime parameters, it is crucial
- that the OID is part of the secret key as well;
- i.e. not just for interoperability, but also for internal use. */
- sk[i] = (oid >> (8 * i)) & 0xFF;
- }
- return xmss_core_keypair(¶ms, pk + XMSS_OID_LEN, sk + XMSS_OID_LEN);
- }
-
- int xmss_sign(unsigned char *sk,
- unsigned char *sm, unsigned long long *smlen,
- const unsigned char *m, unsigned long long mlen)
- {
- xmss_params params;
- uint32_t oid = 0;
- unsigned int i;
-
- for (i = 0; i < XMSS_OID_LEN; i++) {
- oid |= sk[i] << (i * 8);
- }
- if (xmss_parse_oid(¶ms, oid)) {
- return 1;
- }
- return xmss_core_sign(¶ms, sk + XMSS_OID_LEN, sm, smlen, m, mlen);
- }
-
- int xmss_sign_open(unsigned char *m, unsigned long long *mlen,
- const unsigned char *sm, unsigned long long smlen,
- const unsigned char *pk)
- {
- xmss_params params;
- uint32_t oid = 0;
- unsigned int i;
-
- for (i = 0; i < XMSS_OID_LEN; i++) {
- oid |= pk[i] << (i * 8);
- }
- if (xmss_parse_oid(¶ms, oid)) {
- return 1;
- }
- return xmss_core_sign_open(¶ms, m, mlen, sm, smlen, pk + XMSS_OID_LEN);
- }
-
- int xmssmt_keypair(unsigned char *pk, unsigned char *sk, const uint32_t oid)
- {
- xmss_params params;
- unsigned int i;
-
- if (xmssmt_parse_oid(¶ms, oid)) {
- return 1;
- }
- for (i = 0; i < XMSS_OID_LEN; i++) {
- pk[i] = (oid >> (8 * i)) & 0xFF;
- sk[i] = (oid >> (8 * i)) & 0xFF;
- }
- return xmssmt_core_keypair(¶ms, pk + XMSS_OID_LEN, sk + XMSS_OID_LEN);
- }
-
- int xmssmt_sign(unsigned char *sk,
- unsigned char *sm, unsigned long long *smlen,
- const unsigned char *m, unsigned long long mlen)
- {
- xmss_params params;
- uint32_t oid = 0;
- unsigned int i;
-
- for (i = 0; i < XMSS_OID_LEN; i++) {
- oid |= sk[i] << (i * 8);
- }
- if (xmssmt_parse_oid(¶ms, oid)) {
- return 1;
- }
- return xmssmt_core_sign(¶ms, sk + XMSS_OID_LEN, sm, smlen, m, mlen);
- }
-
- int xmssmt_sign_open(unsigned char *m, unsigned long long *mlen,
- const unsigned char *sm, unsigned long long smlen,
- const unsigned char *pk)
- {
- xmss_params params;
- uint32_t oid = 0;
- unsigned int i;
-
- for (i = 0; i < XMSS_OID_LEN; i++) {
- oid |= pk[i] << (i * 8);
- }
- if (xmssmt_parse_oid(¶ms, oid)) {
- return 1;
- }
- return xmssmt_core_sign_open(¶ms, m, mlen, sm, smlen, pk + XMSS_OID_LEN);
- }
|