#ifndef OSSL_CRYPTO_LMS_H
#define OSSL_CRYPTO_LMS_H
#pragma once
#ifndef OPENSSL_NO_LMS
#include "types.h"
#include <openssl/params.h>
#define OSSL_LMS_TYPE_SHA256_N32_H5 0x00000005
#define OSSL_LMS_TYPE_SHA256_N32_H10 0x00000006
#define OSSL_LMS_TYPE_SHA256_N32_H15 0x00000007
#define OSSL_LMS_TYPE_SHA256_N32_H20 0x00000008
#define OSSL_LMS_TYPE_SHA256_N32_H25 0x00000009
#define OSSL_LMS_TYPE_SHA256_N24_H5 0x0000000A
#define OSSL_LMS_TYPE_SHA256_N24_H10 0x0000000B
#define OSSL_LMS_TYPE_SHA256_N24_H15 0x0000000C
#define OSSL_LMS_TYPE_SHA256_N24_H20 0x0000000D
#define OSSL_LMS_TYPE_SHA256_N24_H25 0x0000000E
#define OSSL_LMS_TYPE_SHAKE_N32_H5 0x0000000F
#define OSSL_LMS_TYPE_SHAKE_N32_H10 0x00000010
#define OSSL_LMS_TYPE_SHAKE_N32_H15 0x00000011
#define OSSL_LMS_TYPE_SHAKE_N32_H20 0x00000012
#define OSSL_LMS_TYPE_SHAKE_N32_H25 0x00000013
#define OSSL_LMS_TYPE_SHAKE_N24_H5 0x00000014
#define OSSL_LMS_TYPE_SHAKE_N24_H10 0x00000015
#define OSSL_LMS_TYPE_SHAKE_N24_H15 0x00000016
#define OSSL_LMS_TYPE_SHAKE_N24_H20 0x00000017
#define OSSL_LMS_TYPE_SHAKE_N24_H25 0x00000018
#define OSSL_LM_OTS_TYPE_SHA256_N32_W1 0x00000001
#define OSSL_LM_OTS_TYPE_SHA256_N32_W2 0x00000002
#define OSSL_LM_OTS_TYPE_SHA256_N32_W4 0x00000003
#define OSSL_LM_OTS_TYPE_SHA256_N32_W8 0x00000004
#define OSSL_LM_OTS_TYPE_SHA256_N24_W1 0x00000005
#define OSSL_LM_OTS_TYPE_SHA256_N24_W2 0x00000006
#define OSSL_LM_OTS_TYPE_SHA256_N24_W4 0x00000007
#define OSSL_LM_OTS_TYPE_SHA256_N24_W8 0x00000008
#define OSSL_LM_OTS_TYPE_SHAKE_N32_W1 0x00000009
#define OSSL_LM_OTS_TYPE_SHAKE_N32_W2 0x0000000A
#define OSSL_LM_OTS_TYPE_SHAKE_N32_W4 0x0000000B
#define OSSL_LM_OTS_TYPE_SHAKE_N32_W8 0x0000000C
#define OSSL_LM_OTS_TYPE_SHAKE_N24_W1 0x0000000D
#define OSSL_LM_OTS_TYPE_SHAKE_N24_W2 0x0000000E
#define OSSL_LM_OTS_TYPE_SHAKE_N24_W4 0x0000000F
#define OSSL_LM_OTS_TYPE_SHAKE_N24_W8 0x00000010
#define LMS_SIZE_q 4
#define LMS_SIZE_I 16
#define LMS_SIZE_LMS_TYPE 4
#define LMS_SIZE_OTS_TYPE 4
#define LMS_MAX_DIGEST_SIZE 32
#define LMS_MAX_PUBKEY \
(LMS_SIZE_LMS_TYPE + LMS_SIZE_OTS_TYPE + LMS_SIZE_I + LMS_MAX_DIGEST_SIZE)
typedef struct lm_ots_params_st {
uint32_t lm_ots_type;
uint32_t n;
uint32_t w;
uint32_t p;
uint32_t ls;
const char *digestname;
} LM_OTS_PARAMS;
typedef struct lms_params_st {
uint32_t lms_type;
const char *digestname;
uint32_t n;
uint32_t h;
} LMS_PARAMS;
typedef struct lms_pub_key_st {
unsigned char *encoded;
size_t encodedlen;
unsigned char *K;
} LMS_PUB_KEY;
typedef struct lms_key_st {
const LMS_PARAMS *lms_params;
const LM_OTS_PARAMS *ots_params;
OSSL_LIB_CTX *libctx;
unsigned char *Id;
LMS_PUB_KEY pub;
} LMS_KEY;
const LMS_PARAMS *ossl_lms_params_get(uint32_t lms_type);
const LM_OTS_PARAMS *ossl_lm_ots_params_get(uint32_t ots_type);
LMS_KEY *ossl_lms_key_new(OSSL_LIB_CTX *libctx);
void ossl_lms_key_free(LMS_KEY *lmskey);
int ossl_lms_key_equal(const LMS_KEY *key1, const LMS_KEY *key2, int selection);
int ossl_lms_key_valid(const LMS_KEY *key, int selection);
int ossl_lms_key_has(const LMS_KEY *key, int selection);
int ossl_lms_pubkey_from_params(const OSSL_PARAM *pub, LMS_KEY *lmskey);
int ossl_lms_pubkey_decode(const unsigned char *pub, size_t publen,
LMS_KEY *lmskey);
size_t ossl_lms_pubkey_length(const unsigned char *data, size_t datalen);
#endif
#endif