ISARA Radiate Security Solution Suite Toolkit Edition Version 1.5

Quantum-safe cryptographic primitives and algorithms.

iqr_hss.h File Reference

ISARA Radiate Security Solution Suite's Hierarchical Signature Scheme. More...

Typedefs

typedef struct iqr_HSSPrivateKeyState_struct iqr_HSSPrivateKeyState
 
typedef struct iqr_HSSParams_struct iqr_HSSParams
 
typedef struct iqr_HSSPublicKey_struct iqr_HSSPublicKey
 
typedef struct iqr_HSSPrivateKey_struct iqr_HSSPrivateKey
 
typedef struct iqr_HSSTreeStrategy_struct iqr_HSSTreeStrategy
 

Enumerations

enum  iqr_HSSWinternitz {
  IQR_HSS_WINTERNITZ_1 = 0,
  IQR_HSS_WINTERNITZ_2 = 1,
  IQR_HSS_WINTERNITZ_4 = 2,
  IQR_HSS_WINTERNITZ_8 = 3
}
 
enum  iqr_HSSHeight {
  IQR_HSS_HEIGHT_5 = 0,
  IQR_HSS_HEIGHT_10 = 1,
  IQR_HSS_HEIGHT_15 = 2,
  IQR_HSS_HEIGHT_20 = 3,
  IQR_HSS_HEIGHT_25 = 4
}
 
enum  iqr_HSSLevels { IQR_HSS_LEVEL_1 = 0 }
 

Functions

IQR_API iqr_retval iqr_HSSCreateParams (const iqr_Context *ctx, const iqr_HSSTreeStrategy *strategy, iqr_HSSWinternitz w, iqr_HSSHeight h, iqr_HSSLevels l, iqr_HSSParams **params)
 
IQR_API_UNENFORCED_RETURN iqr_retval iqr_HSSDestroyParams (iqr_HSSParams **params)
 
IQR_API iqr_retval iqr_HSSCreateKeyPair (const iqr_HSSParams *params, const iqr_RNG *rng, iqr_HSSPublicKey **public_key, iqr_HSSPrivateKey **private_key, iqr_HSSPrivateKeyState **state)
 
IQR_API iqr_retval iqr_HSSImportPrivateKey (const iqr_HSSParams *params, const uint8_t *buf, size_t buf_size, iqr_HSSPrivateKey **private_key)
 
IQR_API iqr_retval iqr_HSSExportPrivateKey (const iqr_HSSPrivateKey *private_key, uint8_t *buf, size_t buf_size)
 
IQR_API iqr_retval iqr_HSSImportPublicKey (const iqr_HSSParams *params, const uint8_t *buf, size_t buf_size, iqr_HSSPublicKey **public_key)
 
IQR_API iqr_retval iqr_HSSExportPublicKey (const iqr_HSSPublicKey *public_key, uint8_t *buf, size_t buf_size)
 
IQR_API iqr_retval iqr_HSSImportState (const iqr_HSSParams *params, const uint8_t *buf, size_t buf_size, iqr_HSSPrivateKeyState **state)
 
IQR_API iqr_retval iqr_HSSExportState (const iqr_HSSPrivateKeyState *state, uint8_t *buf, size_t buf_size)
 
IQR_API_UNENFORCED_RETURN iqr_retval iqr_HSSDestroyPrivateKey (iqr_HSSPrivateKey **private_key)
 
IQR_API_UNENFORCED_RETURN iqr_retval iqr_HSSDestroyPublicKey (iqr_HSSPublicKey **public_key)
 
IQR_API_UNENFORCED_RETURN iqr_retval iqr_HSSDestroyState (iqr_HSSPrivateKeyState **state)
 
IQR_API iqr_retval iqr_HSSDetachState (const iqr_HSSPrivateKey *private_key, iqr_HSSPrivateKeyState *state, uint32_t num_sigs, iqr_HSSPrivateKeyState **detached_state)
 
IQR_API iqr_retval iqr_HSSGetPrivateKeySize (const iqr_HSSPrivateKey *private_key, size_t *private_key_size)
 
IQR_API iqr_retval iqr_HSSGetPublicKeySize (const iqr_HSSPublicKey *public_key, size_t *public_key_size)
 
IQR_API iqr_retval iqr_HSSGetStateSize (const iqr_HSSPrivateKeyState *state, size_t *state_size)
 
IQR_API iqr_retval iqr_HSSGetSignatureSize (const iqr_HSSParams *params, size_t *sig_size)
 
IQR_API iqr_retval iqr_HSSGetSignatureCount (const iqr_HSSPrivateKeyState *state, uint32_t *max_sigs, uint32_t *remaining_sigs)
 
IQR_API iqr_retval iqr_HSSSign (const iqr_HSSPrivateKey *private_key, const iqr_RNG *rng, const uint8_t *message, size_t message_size, iqr_HSSPrivateKeyState *state, uint8_t *sig, size_t sig_size)
 
IQR_API iqr_retval iqr_HSSVerify (const iqr_HSSPublicKey *public_key, const uint8_t *message, size_t message_size, const uint8_t *sig, size_t sig_size)
 

Variables

IQR_EXTERN const iqr_HSSTreeStrategy IQR_HSS_BDS_STRATEGY
 
IQR_EXTERN const iqr_HSSTreeStrategy IQR_HSS_FULL_STRATEGY
 
IQR_EXTERN const iqr_HSSTreeStrategy IQR_HSS_VERIFY_ONLY_STRATEGY
 

Typedef Documentation

◆ iqr_HSSParams

typedef struct iqr_HSSParams_struct iqr_HSSParams

The HSS algorithm's domain parameters.

◆ iqr_HSSPrivateKey

typedef struct iqr_HSSPrivateKey_struct iqr_HSSPrivateKey

The HSS private key.

◆ iqr_HSSPrivateKeyState

typedef struct iqr_HSSPrivateKeyState_struct iqr_HSSPrivateKeyState

The HSS algorithm's state.

◆ iqr_HSSPublicKey

typedef struct iqr_HSSPublicKey_struct iqr_HSSPublicKey

The HSS public key.

◆ iqr_HSSTreeStrategy

typedef struct iqr_HSSTreeStrategy_struct iqr_HSSTreeStrategy

The HSS tree strategy.

Enumeration Type Documentation

◆ iqr_HSSHeight

Supported HSS tree heights.

The HSS tree height, as documented in the Hash-Based Signatures IETF Draft. The height dictates the number of one-time signatures available (2height).

Enumerator
IQR_HSS_HEIGHT_5 

Provide 32 (25) one-time signatures.

IQR_HSS_HEIGHT_10 

Provide 1024 (210) one-time signatures.

IQR_HSS_HEIGHT_15 

Provide 32,768 (215) one-time signatures.

IQR_HSS_HEIGHT_20 

Provide 1,048,576 (220) one-time signatures.

IQR_HSS_HEIGHT_25 

Provide 33,554,432 (225) one-time signatures.

◆ iqr_HSSLevels

Supported HSS hyper-tree levels.

The Hyper-tree is a binary tree of Merkle trees. It's purpose is to increase the number of signatures provided by this scheme. For each level, the signature increases in size.

Enumerator
IQR_HSS_LEVEL_1 

Provides a hyper-tree consisting of a single Merkle tree.

◆ iqr_HSSWinternitz

Supported HSS Winternitz values.

The Winternitz domain parameter, as documented in the Hash-Based Signatures IETF Draft. A higher Winternitz value will result in greater hash iterations, impacting performance, but provides smaller signatures.

IQR_HSS_WINTERNITZ_4 provides the best space/performance characteristics.

See the Developer's Guide (online: Toolkit edition, or Signature edition) for details about key sizes, state sizes, and signature sizes.

Enumerator
IQR_HSS_WINTERNITZ_1 
IQR_HSS_WINTERNITZ_2 
IQR_HSS_WINTERNITZ_4 
IQR_HSS_WINTERNITZ_8 

Function Documentation

◆ iqr_HSSCreateKeyPair()

IQR_API iqr_retval iqr_HSSCreateKeyPair ( const iqr_HSSParams params,
const iqr_RNG rng,
iqr_HSSPublicKey **  public_key,
iqr_HSSPrivateKey **  private_key,
iqr_HSSPrivateKeyState **  state 
)

Generate an HSS private/public key pair.

This can take a significant amount of time, especially when creating a height 25 tree (using IQR_HSS_HEIGHT_25). Larger Winternitz values (iqr_HSSWinternitz) also increase the time required to generate keys.

The iqr_HSSCreateKeyPair() function calls the watchdog callback (see iqr_watchdog.h).

Note
You must register a SHA2-256 implementation by calling iqr_HashRegisterCallbacks() before using the HSS API.

The rng must be initialized before being passed to iqr_HSSCreateKeyPair().

*public_key, *private_key, and *state must be set to NULL before calling iqr_HSSCreateKeyPair().

Parameters
[in]paramsThe key parameters to use.
[in]rngA seeded random number generator.
[out]public_keyThe resulting iqr_HSSPublicKey object.
[out]private_keyThe resulting iqr_HSSPrivateKey object.
[out]stateThe resulting iqr_HSSPrivateKeyState object.
Returns
IQR_OK on success, or a value from iqr_retval.h when an error occurs.

◆ iqr_HSSCreateParams()

IQR_API iqr_retval iqr_HSSCreateParams ( const iqr_Context ctx,
const iqr_HSSTreeStrategy strategy,
iqr_HSSWinternitz  w,
iqr_HSSHeight  h,
iqr_HSSLevels  l,
iqr_HSSParams **  params 
)

Create an HSS Parameters object that encapsulates the domain parameters for the Hierarchical Signature Scheme.

It's up to the user to manage domain parameters; the parameter data is not exposed in stored keys or signatures.

Note
You must register a SHA2-256 implementation by calling iqr_HashRegisterCallbacks() before using the HSS API.

*params must be set to NULL before calling iqr_HSSCreateParams().

Parameters
[in]ctxA Context object.
[in]strategyAn HSS tree strategy.
[in]wThe iqr_HSSWinternitz.
[in]hThe iqr_HSSHeight.
[in]lThe iqr_HSSLevels.
[out]paramsThe iqr_HSSParams output.
Returns
IQR_OK on success, or a value from iqr_retval.h when an error occurs.

◆ iqr_HSSDestroyParams()

IQR_API_UNENFORCED_RETURN iqr_retval iqr_HSSDestroyParams ( iqr_HSSParams **  params)

Clear and deallocate an HSS parameters object.

params will be set to NULL before returning.

All internal iqr_HSSParams buffers are cleared and deallocated during the call to iqr_HSSDestroyParams(). The iqr_HSSParams object does not store any cryptographic material.

Parameters
[in,out]paramsThe iqr_HSSParams instance to destroy.
Returns
IQR_OK on success, or a value from iqr_retval.h when an error occurs.

◆ iqr_HSSDestroyPrivateKey()

IQR_API_UNENFORCED_RETURN iqr_retval iqr_HSSDestroyPrivateKey ( iqr_HSSPrivateKey **  private_key)

Clear and deallocate an HSS private key.

*private_key will be set to NULL prior to returning.

The private key's data is cleared before its internal buffers are deallocated.

Parameters
[in,out]private_keyThe iqr_HSSPrivateKey object to destroy.
Returns
IQR_OK on success, or a value from iqr_retval.h when an error occurs.

◆ iqr_HSSDestroyPublicKey()

IQR_API_UNENFORCED_RETURN iqr_retval iqr_HSSDestroyPublicKey ( iqr_HSSPublicKey **  public_key)

Clear and deallocate an HSS public key.

*public_key will be set to NULL prior to returning.

Parameters
[in,out]public_keyThe iqr_HSSPublicKey object to destroy.
Returns
IQR_OK on success, or a value from iqr_retval.h when an error occurs.

◆ iqr_HSSDestroyState()

IQR_API_UNENFORCED_RETURN iqr_retval iqr_HSSDestroyState ( iqr_HSSPrivateKeyState **  state)

Clear and deallocate an HSS state.

*state will be set to NULL prior to returning.

Parameters
[in,out]stateThe state object to destroy.
Returns
IQR_OK on success, or a value from iqr_retval.h when an error occurs.

◆ iqr_HSSDetachState()

IQR_API iqr_retval iqr_HSSDetachState ( const iqr_HSSPrivateKey private_key,
iqr_HSSPrivateKeyState state,
uint32_t  num_sigs,
iqr_HSSPrivateKeyState **  detached_state 
)

Detaches a subset of signatures from state into a new state object.

This function can be used to split a state into two distinct, non-overlapping state objects. This operation effectively "reserves" a number of signatures from state and places them into a new distinct object, detached_state. Both state objects must be used with the same private key to generate signatures.

This operation is useful for disaster recovery, whereby a small section of the state is detached and used for signing while the rest of the state is persisted in non-volatile memory. Or, this feature can be used to aid in the distribution of a state and key pair to multiple machines, where each machine is given a distinct state.

The detached_state will have a reduced number of maximum signatures once this function returns. Use iqr_HSSGetSignatureCount() to obtain the number of available signatures. Use iqr_HSSGetStateSize() to obtain the state sizes prior to exporting.

In the unlikely case that an error occurs while state is being updated, the state will become unusable. This function and any subsequent function calls will return IQR_ESTATECORRUPTED.

Parameters
[in]private_keyThe private key.
[in,out]stateThe original state to be split.
[in]num_sigsThe number of signatures to split off.
[out]detached_stateA new state object containing num_sigs signatures.
Returns
IQR_OK on success, or a value from iqr_retval.h when an error occurs.

◆ iqr_HSSExportPrivateKey()

IQR_API iqr_retval iqr_HSSExportPrivateKey ( const iqr_HSSPrivateKey private_key,
uint8_t *  buf,
size_t  buf_size 
)

Export the HSS private key's data into a buffer.

Be sure to safely wipe and discard buf when you're done using it.

Parameters
[in]private_keyThe private key object.
[out]bufThe destination buffer.
[in]buf_sizeThe size of buf in bytes. Must be exactly the size returned by iqr_HSSGetPrivateKeySize().
Returns
IQR_OK on success, or a value from iqr_retval.h when an error occurs.

◆ iqr_HSSExportPublicKey()

IQR_API iqr_retval iqr_HSSExportPublicKey ( const iqr_HSSPublicKey public_key,
uint8_t *  buf,
size_t  buf_size 
)

Export the HSS public key's data into a buffer.

Parameters
[in]public_keyThe public key object.
[out]bufThe destination buffer.
[in]buf_sizeThe size of buf in bytes. Must be exactly the size returned by iqr_HSSGetPublicKeySize().
Returns
IQR_OK on success, or a value from iqr_retval.h when an error occurs.

◆ iqr_HSSExportState()

IQR_API iqr_retval iqr_HSSExportState ( const iqr_HSSPrivateKeyState state,
uint8_t *  buf,
size_t  buf_size 
)

Export the HSS state's data into a buffer.

Parameters
[in]stateThe state object.
[out]bufThe destination buffer.
[in]buf_sizeThe size of buf in bytes. Must be exactly the size returned by iqr_HSSGetStateSize().
Returns
IQR_OK on success, or a value from iqr_retval.h when an error occurs.

◆ iqr_HSSGetPrivateKeySize()

IQR_API iqr_retval iqr_HSSGetPrivateKeySize ( const iqr_HSSPrivateKey private_key,
size_t *  private_key_size 
)

Retrieves the size of the HSS private key, in bytes.

Parameters
[in]private_keyThe private key.
[out]private_key_sizeThe size of the private key in bytes.
Returns
IQR_OK on success, or a value from iqr_retval.h when an error occurs.

◆ iqr_HSSGetPublicKeySize()

IQR_API iqr_retval iqr_HSSGetPublicKeySize ( const iqr_HSSPublicKey public_key,
size_t *  public_key_size 
)

Retrieve the size of the HSS public key, in bytes.

Parameters
[in]public_keyThe public key.
[out]public_key_sizeThe size of the public key in bytes.
Returns
IQR_OK on success, or a value from iqr_retval.h when an error occurs.

◆ iqr_HSSGetSignatureCount()

IQR_API iqr_retval iqr_HSSGetSignatureCount ( const iqr_HSSPrivateKeyState state,
uint32_t *  max_sigs,
uint32_t *  remaining_sigs 
)

Get the number of signatures available with the given state.

The total number of signatures that can be generated is based on the height of the tree (governed by the iqr_HSSHeight domain parameter). The number of remaining signatures depends on how many iqr_HSSSign() operations have been performed.

Parameters
[in]stateThe state.
[out]max_sigsThe total number of signatures.
[out]remaining_sigsThe remaining number of signatures.
Returns
IQR_OK on success, or a value from iqr_retval.h when an error occurs.

◆ iqr_HSSGetSignatureSize()

IQR_API iqr_retval iqr_HSSGetSignatureSize ( const iqr_HSSParams params,
size_t *  sig_size 
)

Get the size of the signature.

Parameters
[in]paramsHSS domain parameters.
[out]sig_sizeThe size of the HSS signature for the given private key, in bytes.
Returns
IQR_OK on success, or a value from iqr_retval.h when an error occurs.

◆ iqr_HSSGetStateSize()

IQR_API iqr_retval iqr_HSSGetStateSize ( const iqr_HSSPrivateKeyState state,
size_t *  state_size 
)

Retrieve the size of the HSS state, in bytes.

Parameters
[in]stateThe state object.
[out]state_sizeThe size of the state in bytes.
Returns
IQR_OK on success, or a value from iqr_retval.h when an error occurs.

◆ iqr_HSSImportPrivateKey()

IQR_API iqr_retval iqr_HSSImportPrivateKey ( const iqr_HSSParams params,
const uint8_t *  buf,
size_t  buf_size,
iqr_HSSPrivateKey **  private_key 
)

Import an HSS private key object from a buffer.

The value of buf_size must be exactly the size given by iqr_HSSGetPrivateKeySize().

Note
You must register a SHA2-256 implementation by calling iqr_HashRegisterCallbacks() before using the HSS API.

*private_key must be set to NULL before calling iqr_HSSImportPrivateKey(). Be sure to safely wipe and discard buf after calling this function.

Parameters
[in]paramsHSS Key parameters. Must be the same as when the keys were created.
[in]bufA buffer that contains a private key.
[in]buf_sizeThe size of buf in bytes. Must be exactly the size returned by iqr_HSSGetPrivateKeySize().
[out]private_keyThe resulting iqr_HSSPrivateKey object.
Returns
IQR_OK on success, or a value from iqr_retval.h when an error occurs.

◆ iqr_HSSImportPublicKey()

IQR_API iqr_retval iqr_HSSImportPublicKey ( const iqr_HSSParams params,
const uint8_t *  buf,
size_t  buf_size,
iqr_HSSPublicKey **  public_key 
)

Import an HSS public key object from a buffer.

Note
You must register a SHA2-256 implementation by calling iqr_HashRegisterCallbacks() before using the HSS API.

*public_key must be set to NULL before calling iqr_HSSImportPublicKey().

Parameters
[in]paramsHSS Key parameters. Must be the same as when the keys were created.
[in]bufA buffer containing the public key.
[in]buf_sizeThe size of buf in bytes. Must be exactly the size returned by iqr_HSSGetPublicKeySize().
[out]public_keyThe resulting iqr_HSSPublickey object.
Returns
IQR_OK on success, or a value from iqr_retval.h when an error occurs.

◆ iqr_HSSImportState()

IQR_API iqr_retval iqr_HSSImportState ( const iqr_HSSParams params,
const uint8_t *  buf,
size_t  buf_size,
iqr_HSSPrivateKeyState **  state 
)

Import an HSS State object from a buffer.

The value of buf_size must be exactly the size given by iqr_HSSGetStateSize().

*state must be set to NULL before calling iqr_HSSImportState().

Parameters
[in]paramsHSS Key parameters. Must be the same as when the keys were created.
[in]bufA buffer that contains a state.
[in]buf_sizeThe size of buf in bytes. Must be exactly the size returned by iqr_HSSGetStateSize().
[out]stateThe resulting iqr_HSSPrivateKeyState object.
Returns
IQR_OK on success, or a value from iqr_retval.h when an error occurs.

◆ iqr_HSSSign()

IQR_API iqr_retval iqr_HSSSign ( const iqr_HSSPrivateKey private_key,
const iqr_RNG rng,
const uint8_t *  message,
size_t  message_size,
iqr_HSSPrivateKeyState state,
uint8_t *  sig,
size_t  sig_size 
)

Sign a message using an HSS private key.

As signatures are generated, the state can run out of signing keys. In that case, IQR_ESTATEDEPLETED will be returned and the state can no longer be used for signing. Use iqr_HSSGetSignatureCount() to check the total number of signatures and the number of signatures remaining.

Each time this function is called, the state is advanced to the next usable state. You must store this new state in non-volatile memory prior to releasing the signature. Alternatively, use iqr_HSSDetachState() to work with smaller states that can be lost without catastrophe. For more details, refer to the Developer's Guide (online: Toolkit edition, or Signature edition).

In the unlikely case that an error occurs while state is being updated, the state will become unusable. This function and any subsequent function calls will return IQR_ESTATECORRUPTED.

Warning
Restarting from a previous state makes HSS insecure.

If the message is a hash digest it must be 48 bytes or longer to be quantum-safe.

Note
You must register a SHA2-256 implementation by calling iqr_HashRegisterCallbacks() before using the HSS API.

The rng must be initialized before being passed to iqr_HSSSign().

All internal buffers are cleared and deallocated before the call to iqr_HSSSign() returns.

Parameters
[in]private_keyThe private key.
[in]rngA seeded random number generator.
[in]messageThe message to be signed.
[in]message_sizeThe size of message in bytes.
[in,out]stateThe state used to sign the message.
[out]sigThe buffer receiving the resulting signature.
[in]sig_sizeThe size of sig in bytes. Must be exactly the size returned by iqr_HSSGetSignatureSize().
Returns
IQR_OK on success, or a value from iqr_retval.h when an error occurs.

◆ iqr_HSSVerify()

IQR_API iqr_retval iqr_HSSVerify ( const iqr_HSSPublicKey public_key,
const uint8_t *  message,
size_t  message_size,
const uint8_t *  sig,
size_t  sig_size 
)

Verify the signature of a message using an HSS public key.

If the message is a hash digest it must be 48 bytes or longer to be quantum-safe.

Note
You must register a SHA2-256 implementation by calling iqr_HashRegisterCallbacks() before using the HSS API.

All internal buffers are cleared and deallocated before the call to iqr_HSSVerify() returns.

Parameters
[in]public_keyThe public key.
[in]messageThe message to verify.
[in]message_sizeThe size of message in bytes.
[in]sigThe signature to verify.
[in]sig_sizeThe size of sig in bytes. Must be exactly the size returned by iqr_HSSGetSignatureSize().
Returns
IQR_OK on success, or a value from iqr_retval.h when an error occurs.

Variable Documentation

◆ IQR_HSS_BDS_STRATEGY

IQR_EXTERN const iqr_HSSTreeStrategy IQR_HSS_BDS_STRATEGY

Tree strategies offer a trade-off between CPU utilization and memory usage during signing. Choosing the correct strategy is highly dependent on the hardware restrictions of the target platform.

Please see the Developer's Guide (online: Toolkit edition, or Signature edition) for state size requirements. Implements the BDS algorithm as proposed in the Merkle Tree Traversal Revisited Whitepaper. This strategy features minimal memory requirements at the cost of recomputing parts of the Merkle tree. This option is ideal for memory constrained devices with a fast CPU to handle recomputation. This is an excellent choice for embedded platforms, such as Hardware Security Modules.

◆ IQR_HSS_FULL_STRATEGY

IQR_EXTERN const iqr_HSSTreeStrategy IQR_HSS_FULL_STRATEGY

Implements a full Merkle tree in memory. This strategy offers the least CPU utilization at the cost of using memory. This option is ideal for servers with large amounts of memory and the need to generate signatures frequently. For larger tree heights, this strategy requires up to 2GB of memory to store the state.

◆ IQR_HSS_VERIFY_ONLY_STRATEGY

IQR_EXTERN const iqr_HSSTreeStrategy IQR_HSS_VERIFY_ONLY_STRATEGY

This strategy is only used to verify signatures; it cannot be used to create or import private keys nor can it be used to create signatures. This option is ideal for a client that only needs to verify signatures.

Detailed Description

ISARA Radiate Security Solution Suite's Hierarchical Signature Scheme.

The Hierarchical Signature scheme is defined by the Hash-Based Signatures IETF Draft 13 specification by McGrew and Curcio.

This header contains the functions and parameters necessary to create and verify an HSS signature. The two main functions are iqr_HSSSign() and iqr_HSSVerify(). The rest of the functions let you create and manipulate HSS keys.

The HSS scheme has some fundamental differences from traditional signature schemes such as RSA or ECDSA. In particular, you'll need to manage the state used by iqr_HSSSign() carefully. For more details, refer to the Developer's Guide (online: Toolkit edition, or Signature edition).

Note
Due to ongoing changes in the IETF specification, keys and signatures created with this version of HSS are not compatible with earlier versions or our past HSS implementation.
License
The code and other content set out herein is not in the public domain, is considered a trade secret and is confidential to ISARA Corporation. Use, reproduction or distribution, in whole or in part, of such code or other content is strictly prohibited except by express written permission of ISARA Corporation. Please contact ISARA Corporation at info@.nosp@m.isar.nosp@m.a.com for more information.