Initial project import
This commit is contained in:
commit
23f2d29e32
11957 files changed
+1754577
No files matched your search
@@ -0,0 +1,75 @@
|
||||
# slhdsa
|
||||
Experimental module of NIST FIPS-205 Stateless Hash-Based Digital Signature Standard (SLH-DSA) in V
|
||||
|
||||
## About
|
||||
SLH-DSA was a quantum resistent cryptographic digital signature standard that was approved and publicly published by NIST at August, 2024. Its availables on [NIST FIPS 205](https://csrc.nist.gov/pubs/fips/205/final). <br>
|
||||
SLH-DSA allow builds relatively big signaturue size with small key (`16 - 32` bytes key).
|
||||
The signatures range from `±8K - ±50K` depending on the type chosen.
|
||||
|
||||
> [!NOTE]
|
||||
> This module wraps and written on top of SLH-DSA functionality availables on latest release
|
||||
> of recent OpenSSL library. Based on the history, this functionality was added in OpenSSL 3.5.
|
||||
> So, make sure, you have required version of OpenSSL library installed. For simple guides how
|
||||
> to build and install latest OpenSSL library on unix-like box,
|
||||
> see [install-latest-ssl.md](https://github.com/vlang/v/blob/master/vlib/x/crypto/slhdsa/install-latest-ssl.md)
|
||||
|
||||
## Basic
|
||||
SLH-DSA signature scheme is constructed using other hash-based signature schemes as components.
|
||||
SLH-DSA was comes with set of predefined parameter that describes security categories, ie:<br>
|
||||
|
||||
- What is underlying hash algorithm used in the mean of process. <br>
|
||||
The standard defines two's hash algorithm family availables, `sha2` family and `shake` family
|
||||
- Security bits number of parameter set
|
||||
- Whether the parameter set was designed to create relatively small signatures ('s') or to have
|
||||
relatively fast signature generation ('f').<br>
|
||||
See Table. 2 SLH-DSA parameter sets in the standard document. <br>
|
||||
|
||||
This parameter set represented by this opaque on this module:
|
||||
```codeblock
|
||||
pub enum Kind {
|
||||
// SHA2-based family
|
||||
sha2_128s = C.NID_SLH_DSA_SHA2_128s
|
||||
sha2_128f = C.NID_SLH_DSA_SHA2_128f
|
||||
sha2_192s = C.NID_SLH_DSA_SHA2_192s
|
||||
sha2_192f = C.NID_SLH_DSA_SHA2_192f
|
||||
sha2_256s = C.NID_SLH_DSA_SHA2_256s
|
||||
sha2_256f = C.NID_SLH_DSA_SHA2_256f
|
||||
// SHAKE-based family
|
||||
shake_128s = C.NID_SLH_DSA_SHAKE_128s
|
||||
shake_128f = C.NID_SLH_DSA_SHAKE_128f
|
||||
shake_192s = C.NID_SLH_DSA_SHAKE_192s
|
||||
shake_192f = C.NID_SLH_DSA_SHAKE_192f
|
||||
shake_256s = C.NID_SLH_DSA_SHAKE_256s
|
||||
shake_256f = C.NID_SLH_DSA_SHAKE_256f
|
||||
}
|
||||
```
|
||||
|
||||
Example
|
||||
-------
|
||||
```v cgen
|
||||
import x.crypto.slhdsa
|
||||
|
||||
fn main() {
|
||||
// you can choose and pass the kind of the SLH-DSA parameter to the constructor
|
||||
opt := slhdsa.KeyOpts{
|
||||
kind: .sha2_128s
|
||||
// other options was availables
|
||||
}
|
||||
mut pv := slhdsa.PrivateKey.new(opt)!
|
||||
|
||||
// Example message
|
||||
msg := 'SLH-DSA example message'.bytes()
|
||||
|
||||
// Sign a message using constructed key
|
||||
sig := pv.sign(msg)!
|
||||
|
||||
// Then the public key part can verify this signature
|
||||
mut pb := pv.public_key()!
|
||||
verified := pb.verify(sig, msg)!
|
||||
assert verified // true
|
||||
|
||||
// release the resource
|
||||
pv.free()
|
||||
pb.free()
|
||||
}
|
||||
```
|
||||
@@ -0,0 +1,405 @@
|
||||
// Copyright (c) blackshirt. All rights reserved.
|
||||
// Use of this source code is governed by an MIT license
|
||||
// that can be found in the LICENSE file.
|
||||
module slhdsa
|
||||
|
||||
// Configuration options used in SLH-DSA key generation.
|
||||
@[params]
|
||||
pub struct KeyOpts {
|
||||
pub mut:
|
||||
// An opaque represents the kind of SLH-DSA keys want to built.
|
||||
// See `enum Kind` for available options.
|
||||
kind Kind = .sha2_128s
|
||||
|
||||
// flag, 0=random (default), 1= use seed bytes, 2 = use priv bytes, otherwise error
|
||||
flag int
|
||||
// when you set flag=1, builder will use seed bytes as a params,
|
||||
// so, make sure to pass seed bytes length != 0
|
||||
seed []u8
|
||||
// when flag=2, you should ensure private bytes length != 0
|
||||
priv []u8
|
||||
|
||||
// This option below was not supported yet.
|
||||
//
|
||||
// Sets properties to be used when fetching algorithm implementations
|
||||
// used for SLH-DSA hashing operations.
|
||||
propq string
|
||||
}
|
||||
|
||||
// Configurations parameters used for signing (and or verifying)
|
||||
@[params]
|
||||
pub struct SignerOpts {
|
||||
pub mut:
|
||||
// optional context string up to 255 length, used in signing (verifying)
|
||||
context string
|
||||
|
||||
// "message-encoding"
|
||||
// The default value of 1 uses 'Pure SLH-DSA Signature Generation'.
|
||||
// Setting it to 0 does not encode the message, which is used for testing,
|
||||
// but can also be used for 'Pre Hash SLH-DSA Signature Generation'.
|
||||
// If you set encoding to 0, you should provide the entropy.
|
||||
encoding int = 1
|
||||
|
||||
// "test-entropy" used for testing to pass a optional random value.
|
||||
entropy []u8 // octet-string
|
||||
|
||||
// "deterministic" integer option.
|
||||
// The default value of 0 generates a random value (using a DRBG) this is used when
|
||||
// processing the message. Setting this to 1 causes the private key seed to be used instead.
|
||||
// This value is ignored if "test-entropy" is set.
|
||||
deterministic int
|
||||
}
|
||||
|
||||
// from_seed creates a new SLH-DSA PrivateKey from seed bytes and kind options.
|
||||
// If the seed length was zero, it will create a key based on randomly generated seed.
|
||||
// You should make sure, the seed bytes comes from trusted cryptographic secure source.
|
||||
// The seed size was 3 times of `𝑛` parameter defined in the standard.
|
||||
// The `𝑛` size maybe 16, 24 or 32 bytes length, depend on the chosen type.
|
||||
fn PrivateKey.from_seed(seed []u8, kind Kind) !PrivateKey {
|
||||
// when seed bytes length was zero, build the key based on the random ones
|
||||
if seed.len == 0 {
|
||||
return PrivateKey.new(kind: kind)!
|
||||
}
|
||||
// Get the n size parameter set from the options
|
||||
nsize := kind.nsize()
|
||||
// The length of the seed bytes supplied must be 3 * nsize.
|
||||
if seed.len != 3 * nsize {
|
||||
return error('Unmatching seed length with kind supplied, need ${3 * nsize} bytes')
|
||||
}
|
||||
|
||||
param_bld := C.OSSL_PARAM_BLD_new()
|
||||
assert param_bld != 0
|
||||
|
||||
m := C.OSSL_PARAM_BLD_push_octet_string(param_bld, c'seed', seed.data, seed.len)
|
||||
if m <= 0 {
|
||||
C.OSSL_PARAM_BLD_free(param_bld)
|
||||
return error('OSSL_PARAM_BLD_push failed')
|
||||
}
|
||||
|
||||
// build params
|
||||
params := C.OSSL_PARAM_BLD_to_param(param_bld)
|
||||
// create a desired context
|
||||
pctx := C.EVP_PKEY_CTX_new_from_name(0, kind.long_name(), 0)
|
||||
if params == 0 || pctx == 0 {
|
||||
C.OSSL_PARAM_BLD_free(param_bld)
|
||||
C.OSSL_PARAM_free(params)
|
||||
C.EVP_PKEY_CTX_free(pctx)
|
||||
return error('EVP_PKEY_CTX_new or OSSL_PARAM_BLD_to_param failed')
|
||||
}
|
||||
pkey := C.EVP_PKEY_new()
|
||||
assert pkey != 0
|
||||
ke := C.EVP_PKEY_keygen_init(pctx)
|
||||
if ke <= 0 {
|
||||
C.OSSL_PARAM_BLD_free(param_bld)
|
||||
C.OSSL_PARAM_free(params)
|
||||
C.EVP_PKEY_CTX_free(pctx)
|
||||
C.EVP_PKEY_free(pkey)
|
||||
return error('EVP_PKEY_keygen_init failed')
|
||||
}
|
||||
// Use EVP_PKEY_CTX_set_params() after calling EVP_PKEY_keygen_init().
|
||||
s := C.EVP_PKEY_CTX_set_params(pctx, params)
|
||||
if s != 1 {
|
||||
C.OSSL_PARAM_BLD_free(param_bld)
|
||||
C.OSSL_PARAM_free(params)
|
||||
C.EVP_PKEY_CTX_free(pctx)
|
||||
C.EVP_PKEY_free(pkey)
|
||||
return error('EVP_PKEY_CTX_set_params failed')
|
||||
}
|
||||
|
||||
ss := C.EVP_PKEY_keygen(pctx, &pkey)
|
||||
if ss <= 0 {
|
||||
C.OSSL_PARAM_BLD_free(param_bld)
|
||||
C.OSSL_PARAM_free(params)
|
||||
C.EVP_PKEY_CTX_free(pctx)
|
||||
C.EVP_PKEY_free(pkey)
|
||||
return error('EVP_PKEY_keygen failed')
|
||||
}
|
||||
// TODO: right way to check the key
|
||||
pvkey := PrivateKey{
|
||||
key: pkey
|
||||
}
|
||||
// Cleans up
|
||||
C.OSSL_PARAM_BLD_free(param_bld)
|
||||
C.OSSL_PARAM_free(params)
|
||||
C.EVP_PKEY_CTX_free(pctx)
|
||||
|
||||
return pvkey
|
||||
}
|
||||
|
||||
fn PrivateKey.from_bytes(bytes []u8, kind Kind) !PrivateKey {
|
||||
// when bytes length was zero, build the key based on the random ones
|
||||
if bytes.len == 0 {
|
||||
return PrivateKey.new(kind: kind)!
|
||||
}
|
||||
// Get the n size parameter set from the options
|
||||
nsize := kind.nsize()
|
||||
// The private key has a size of 4 * n bytes.
|
||||
if bytes.len != 4 * nsize {
|
||||
return error('Unmatching private bytes length with kind supplied, need ${4 * nsize} bytes')
|
||||
}
|
||||
|
||||
param_bld := C.OSSL_PARAM_BLD_new()
|
||||
assert param_bld != 0
|
||||
|
||||
m := C.OSSL_PARAM_BLD_push_octet_string(param_bld, c'priv', bytes.data, bytes.len)
|
||||
if m <= 0 {
|
||||
C.OSSL_PARAM_BLD_free(param_bld)
|
||||
return error('OSSL_PARAM_BLD_push FAILED')
|
||||
}
|
||||
|
||||
// build params
|
||||
params := C.OSSL_PARAM_BLD_to_param(param_bld)
|
||||
// create a desired context
|
||||
pctx := C.EVP_PKEY_CTX_new_from_name(0, kind.long_name(), 0)
|
||||
if params == 0 || pctx == 0 {
|
||||
C.OSSL_PARAM_BLD_free(param_bld)
|
||||
C.OSSL_PARAM_free(params)
|
||||
C.EVP_PKEY_CTX_free(pctx)
|
||||
return error('EVP_PKEY_CTX_new or OSSL_PARAM_BLD_to_param failed')
|
||||
}
|
||||
|
||||
pkey := C.EVP_PKEY_new()
|
||||
assert pkey != 0
|
||||
|
||||
s := C.EVP_PKEY_fromdata_init(pctx)
|
||||
if s <= 0 {
|
||||
C.OSSL_PARAM_BLD_free(param_bld)
|
||||
C.OSSL_PARAM_free(params)
|
||||
C.EVP_PKEY_CTX_free(pctx)
|
||||
C.EVP_PKEY_free(pkey)
|
||||
return error('EVP_PKEY_fromdata_init failed')
|
||||
}
|
||||
|
||||
ss := C.EVP_PKEY_fromdata(pctx, &pkey, evp_pkey_keypair, params)
|
||||
if ss <= 0 {
|
||||
C.OSSL_PARAM_BLD_free(param_bld)
|
||||
C.OSSL_PARAM_free(params)
|
||||
C.EVP_PKEY_CTX_free(pctx)
|
||||
C.EVP_PKEY_free(pkey)
|
||||
return error('EVP_PKEY_fromdata failed')
|
||||
}
|
||||
|
||||
pvkey := PrivateKey{
|
||||
key: pkey
|
||||
}
|
||||
// Cleans up
|
||||
C.OSSL_PARAM_BLD_free(param_bld)
|
||||
C.OSSL_PARAM_free(params)
|
||||
C.EVP_PKEY_CTX_free(pctx)
|
||||
|
||||
return pvkey
|
||||
}
|
||||
|
||||
// from_bytes creates a new PublicKey with type of supported key and bytes array.
|
||||
// If you dont provide the bytes, ie, supplied with zero-length bytes,
|
||||
// it will be generated with random bytes for you.
|
||||
pub fn PublicKey.from_bytes(bytes []u8, kind Kind) !PublicKey {
|
||||
// when bytes length was zero, build the key based on the random ones
|
||||
if bytes.len == 0 {
|
||||
pv := PrivateKey.new(kind: kind)!
|
||||
pbk := pv.public_key()!
|
||||
return pbk
|
||||
}
|
||||
// Get the n size parameter set from the options
|
||||
nsize := kind.nsize()
|
||||
// The public key has a size of 2 * n bytes.
|
||||
if bytes.len != 2 * nsize {
|
||||
return error('Unmatching public bytes length with kind supplied, need ${2 * nsize} bytes')
|
||||
}
|
||||
|
||||
param_bld := C.OSSL_PARAM_BLD_new()
|
||||
assert param_bld != 0
|
||||
|
||||
m := C.OSSL_PARAM_BLD_push_octet_string(param_bld, c'pub', bytes.data, bytes.len)
|
||||
if m <= 0 {
|
||||
C.OSSL_PARAM_BLD_free(param_bld)
|
||||
return error('OSSL_PARAM_BLD_push FAILED')
|
||||
}
|
||||
|
||||
// build params
|
||||
params := C.OSSL_PARAM_BLD_to_param(param_bld)
|
||||
// create a desired context
|
||||
pctx := C.EVP_PKEY_CTX_new_from_name(0, kind.long_name(), 0)
|
||||
if params == 0 || pctx == 0 {
|
||||
C.OSSL_PARAM_BLD_free(param_bld)
|
||||
C.OSSL_PARAM_free(params)
|
||||
C.EVP_PKEY_CTX_free(pctx)
|
||||
return error('EVP_PKEY_CTX_new or OSSL_PARAM_BLD_to_param failed')
|
||||
}
|
||||
|
||||
pkey := C.EVP_PKEY_new()
|
||||
assert pkey != 0
|
||||
|
||||
s := C.EVP_PKEY_fromdata_init(pctx)
|
||||
if s <= 0 {
|
||||
C.OSSL_PARAM_BLD_free(param_bld)
|
||||
C.OSSL_PARAM_free(params)
|
||||
C.EVP_PKEY_CTX_free(pctx)
|
||||
C.EVP_PKEY_free(pkey)
|
||||
return error('EVP_PKEY_fromdata failed')
|
||||
}
|
||||
|
||||
ss := C.EVP_PKEY_fromdata(pctx, &pkey, evp_pkey_public_key, params)
|
||||
if ss <= 0 {
|
||||
C.OSSL_PARAM_BLD_free(param_bld)
|
||||
C.OSSL_PARAM_free(params)
|
||||
C.EVP_PKEY_CTX_free(pctx)
|
||||
C.EVP_PKEY_free(pkey)
|
||||
return error('EVP_PKEY_fromdata failed')
|
||||
}
|
||||
|
||||
pbkey := PublicKey{
|
||||
key: pkey
|
||||
}
|
||||
// Cleans up
|
||||
C.OSSL_PARAM_BLD_free(param_bld)
|
||||
C.OSSL_PARAM_free(params)
|
||||
C.EVP_PKEY_CTX_free(pctx)
|
||||
|
||||
return pbkey
|
||||
}
|
||||
|
||||
// The enumeration of NID of SLHDSA parameters set. <br>
|
||||
// See Table 2. SLH-DSA parameter sets of the Chapter 11. Parameter Sets<br>
|
||||
// Each sets name indicates:
|
||||
//
|
||||
// - the hash function family (SHA2 or SHAKE) that is used to instantiate the hash functions.
|
||||
// - the length in bits of the security parameter, in the 128, 192, and 256 respectives number.
|
||||
// - the mnemonic name indicates parameter to create relatively small signatures (`s`)
|
||||
// or to have relatively fast signature generation (`f`).
|
||||
pub enum Kind {
|
||||
// SHA2-based family
|
||||
sha2_128s = C.NID_SLH_DSA_SHA2_128s
|
||||
sha2_128f = C.NID_SLH_DSA_SHA2_128f
|
||||
sha2_192s = C.NID_SLH_DSA_SHA2_192s
|
||||
sha2_192f = C.NID_SLH_DSA_SHA2_192f
|
||||
sha2_256s = C.NID_SLH_DSA_SHA2_256s
|
||||
sha2_256f = C.NID_SLH_DSA_SHA2_256f
|
||||
// SHAKE-based family
|
||||
shake_128s = C.NID_SLH_DSA_SHAKE_128s
|
||||
shake_128f = C.NID_SLH_DSA_SHAKE_128f
|
||||
shake_192s = C.NID_SLH_DSA_SHAKE_192s
|
||||
shake_192f = C.NID_SLH_DSA_SHAKE_192f
|
||||
shake_256s = C.NID_SLH_DSA_SHAKE_256s
|
||||
shake_256f = C.NID_SLH_DSA_SHAKE_256f
|
||||
}
|
||||
|
||||
// nsize returns the size of underlying n parameter from current type.
|
||||
@[inline]
|
||||
fn (n Kind) nsize() int {
|
||||
match n {
|
||||
.sha2_128s, .sha2_128f, .shake_128s, .shake_128f { return 16 }
|
||||
.sha2_192s, .sha2_192f, .shake_192s, .shake_192f { return 24 }
|
||||
.sha2_256s, .sha2_256f, .shake_256s, .shake_256f { return 32 }
|
||||
}
|
||||
}
|
||||
|
||||
fn (n Kind) str() string {
|
||||
match n {
|
||||
// vfmt off
|
||||
// SHA2-based family
|
||||
.sha2_128s { return "sha2_128s" }
|
||||
.sha2_128f { return "sha2_128f" }
|
||||
.sha2_192s { return "sha2_192s" }
|
||||
.sha2_192f { return "sha2_192f" }
|
||||
.sha2_256s { return "sha2_256s" }
|
||||
.sha2_256f { return "sha2_256f" }
|
||||
// SHAKE-based family
|
||||
.shake_128s { return "shake_128s" }
|
||||
.shake_128f { return "shake_128f" }
|
||||
.shake_192s { return "shake_192s" }
|
||||
.shake_192f { return "shake_192f" }
|
||||
.shake_256s { return "shake_256s" }
|
||||
.shake_256f { return "shake_256f" }
|
||||
// vfmt on
|
||||
}
|
||||
}
|
||||
|
||||
// Kind long name as v string
|
||||
@[inline]
|
||||
fn (n Kind) ln_to_vstr() string {
|
||||
out := unsafe { n.long_name().vstring() }
|
||||
return out
|
||||
}
|
||||
|
||||
// Kind long name as c-style string
|
||||
@[inline]
|
||||
fn (n Kind) long_name() &char {
|
||||
match n {
|
||||
// vfmt off
|
||||
// SHA2-based family
|
||||
.sha2_128s { return ln_slhdsa_sha2_128s }
|
||||
.sha2_128f { return ln_slhdsa_sha2_128f }
|
||||
.sha2_192s { return ln_slhdsa_sha2_192s }
|
||||
.sha2_192f { return ln_slhdsa_sha2_192f }
|
||||
.sha2_256s { return ln_slhdsa_sha2_256s }
|
||||
.sha2_256f { return ln_slhdsa_sha2_256f }
|
||||
// SHAKE-based family
|
||||
.shake_128s { return ln_slhdsa_shake_128s }
|
||||
.shake_128f { return ln_slhdsa_shake_128f }
|
||||
.shake_192s { return ln_slhdsa_shake_192s }
|
||||
.shake_192f { return ln_slhdsa_shake_192f }
|
||||
.shake_256s { return ln_slhdsa_shake_256s }
|
||||
.shake_256f { return ln_slhdsa_shake_256f }
|
||||
// vfmt on
|
||||
}
|
||||
}
|
||||
|
||||
// Chapter 11. Parameters Set
|
||||
struct ParamSet {
|
||||
// Algorithm name
|
||||
id Kind
|
||||
n int
|
||||
h int
|
||||
d int
|
||||
hp int
|
||||
a int
|
||||
k int
|
||||
lgw int = 4
|
||||
m int
|
||||
sc int
|
||||
pkb int
|
||||
sig int
|
||||
}
|
||||
|
||||
// Table 2. SLH-DSA parameter sets
|
||||
const paramset = {
|
||||
// id 𝑛 ℎ 𝑑 ℎ′ 𝑎 𝑘 𝑙𝑔𝑤 𝑚 sc pkb sig
|
||||
'sha2_128s': ParamSet{.sha2_128s, 16, 63, 7, 9, 12, 14, 4, 30, 1, 32, 7856}
|
||||
'sha2_128f': ParamSet{.sha2_128f, 16, 66, 22, 3, 6, 33, 4, 34, 1, 32, 17088}
|
||||
'sha2_192s': ParamSet{.sha2_192s, 24, 63, 7, 9, 14, 17, 4, 39, 3, 48, 16224}
|
||||
'sha2_192f': ParamSet{.sha2_192f, 24, 66, 22, 3, 8, 33, 4, 42, 3, 48, 35664}
|
||||
'sha2_256s': ParamSet{.sha2_256s, 32, 64, 8, 8, 14, 22, 4, 47, 5, 64, 29792}
|
||||
'sha2_256f': ParamSet{.sha2_256f, 32, 68, 17, 4, 9, 35, 4, 49, 5, 64, 49856}
|
||||
// SHAKE family
|
||||
'shake_128s': ParamSet{.shake_128s, 16, 63, 7, 9, 12, 14, 4, 30, 1, 32, 7856}
|
||||
'shake_128f': ParamSet{.shake_128f, 16, 66, 22, 3, 6, 33, 4, 34, 1, 32, 17088}
|
||||
'shake_192s': ParamSet{.shake_192s, 24, 63, 7, 9, 14, 17, 4, 39, 3, 48, 16224}
|
||||
'shake_192f': ParamSet{.shake_192f, 24, 66, 22, 3, 8, 33, 4, 42, 3, 48, 35664}
|
||||
'shake_256s': ParamSet{.shake_256s, 32, 64, 8, 8, 14, 22, 4, 47, 5, 64, 29792}
|
||||
'shake_256f': ParamSet{.shake_256f, 32, 68, 17, 4, 9, 35, 4, 49, 5, 64, 49856}
|
||||
}
|
||||
|
||||
fn ParamSet.from_kind(k Kind) ParamSet {
|
||||
return paramset[k.str()]
|
||||
}
|
||||
|
||||
// Some helpers
|
||||
//
|
||||
fn key_algo_name(key &C.EVP_PKEY) &char {
|
||||
name := voidptr(C.EVP_PKEY_get0_type_name(key))
|
||||
assert name != 0
|
||||
return name
|
||||
}
|
||||
|
||||
fn key_type_name(key &C.EVP_PKEY) &char {
|
||||
kn := voidptr(C.EVP_PKEY_get0_type_name(key))
|
||||
assert kn != 0
|
||||
return kn
|
||||
}
|
||||
|
||||
fn key_description(key &C.EVP_PKEY) &char {
|
||||
kd := voidptr(C.EVP_PKEY_get0_description(key))
|
||||
assert kd != 0
|
||||
return kd
|
||||
}
|
||||
@@ -0,0 +1,188 @@
|
||||
// Copyright (c) blackshirt. All rights reserved.
|
||||
// Use of this source code is governed by an MIT license
|
||||
// that can be found in the LICENSE file.
|
||||
// vtest build: has_modern_openssl?
|
||||
module slhdsa
|
||||
|
||||
import rand
|
||||
import encoding.hex
|
||||
|
||||
fn test_privatekey_from_bytes() ! {
|
||||
// for sha2_128s
|
||||
priv :=
|
||||
hex.decode('4329f96b412b5d5ca9c730c9d54e52595265f6fc3ea67c183aa7043d90e949b8fd320c8fc0fa6a23462483535f131b9ea265848e7bb5f4d3cfd99de2595382b3')!
|
||||
mut pv := PrivateKey.from_bytes(priv, .sha2_128s)!
|
||||
|
||||
sig := pv.sign('test'.bytes())!
|
||||
|
||||
mut pb := pv.public_key()!
|
||||
status := pb.verify(sig, 'test'.bytes())!
|
||||
assert status == true
|
||||
|
||||
pv.free()
|
||||
pb.free()
|
||||
}
|
||||
|
||||
fn test_pvkey_from_seed() ! {
|
||||
kind := Kind.sha2_128s
|
||||
seed := rand.bytes(3 * kind.nsize())!
|
||||
|
||||
mut pv := PrivateKey.from_seed(seed, kind)!
|
||||
|
||||
msg := 'Hello'.bytes()
|
||||
sig := pv.sign(msg)!
|
||||
|
||||
mut pb := pv.public_key()!
|
||||
|
||||
verified := pb.verify(sig, msg)!
|
||||
assert verified
|
||||
|
||||
pv.free()
|
||||
pb.free()
|
||||
}
|
||||
|
||||
fn test_privkey_signing() ! {
|
||||
mut pv := PrivateKey.new(kind: .shake_256f)!
|
||||
assert pv.bytes()!.len == 128
|
||||
assert pv.public_bytes()!.len == 64
|
||||
|
||||
// type name
|
||||
chr := key_type_name(pv.key)
|
||||
assert unsafe { chr.vstring() } == 'SLH-DSA-SHAKE-256f'
|
||||
|
||||
msg := 'Hello'.bytes()
|
||||
sig := slhdsa_do_sign(pv.key, msg)!
|
||||
assert sig.len == 49856
|
||||
|
||||
verified := slhdsa_do_verify(pv.key, sig, msg)!
|
||||
assert verified
|
||||
|
||||
mut pb := pv.public_key()!
|
||||
sig2 := pv.sign(msg)!
|
||||
|
||||
status := pb.verify(sig, msg)!
|
||||
status2 := pb.verify(sig2, msg)!
|
||||
|
||||
assert status
|
||||
assert status2
|
||||
|
||||
pv.free()
|
||||
pb.free()
|
||||
}
|
||||
|
||||
fn test_basic_properties() ! {
|
||||
mut pv := PrivateKey.new()!
|
||||
desc := key_description(pv.key)
|
||||
unsafe { desc.vstring() } == 'OpenSSL SLH-DSA-SHA2-128f implementation'
|
||||
|
||||
n := C.EVP_PKEY_is_a(pv.key, ln_slhdsa_sha2_128s)
|
||||
assert n == 1 // true
|
||||
assert C.EVP_PKEY_size(pv.key) == 7856
|
||||
assert C.EVP_PKEY_get_bits(pv.key) == 256
|
||||
assert C.EVP_PKEY_get_security_bits(pv.key) == 128
|
||||
|
||||
mut pv2 := PrivateKey.new(kind: .sha2_128f)!
|
||||
n2 := C.EVP_PKEY_is_a(pv2.key, ln_slhdsa_sha2_128f)
|
||||
assert n2 == 1 // true
|
||||
assert C.EVP_PKEY_size(pv2.key) == 17088
|
||||
assert C.EVP_PKEY_get_bits(pv2.key) == 256
|
||||
assert C.EVP_PKEY_get_security_bits(pv2.key) == 128
|
||||
|
||||
mut pv3 := PrivateKey.new(kind: .sha2_192s)!
|
||||
n3 := C.EVP_PKEY_is_a(pv3.key, ln_slhdsa_sha2_192s)
|
||||
assert n3 == 1 // true
|
||||
assert C.EVP_PKEY_size(pv3.key) == 16224
|
||||
assert C.EVP_PKEY_get_bits(pv3.key) == 384
|
||||
assert C.EVP_PKEY_get_security_bits(pv3.key) == 192
|
||||
|
||||
mut pv4 := PrivateKey.new(kind: .shake_256f)!
|
||||
n4 := C.EVP_PKEY_is_a(pv4.key, ln_slhdsa_shake_256f)
|
||||
assert n4 == 1 // true
|
||||
assert C.EVP_PKEY_size(pv4.key) == 49856
|
||||
assert C.EVP_PKEY_get_bits(pv4.key) == 512
|
||||
assert C.EVP_PKEY_get_security_bits(pv4.key) == 256
|
||||
|
||||
pv.free()
|
||||
pv2.free()
|
||||
pv3.free()
|
||||
pv4.free()
|
||||
}
|
||||
|
||||
struct Slh128sSeed {
|
||||
mut:
|
||||
seed string
|
||||
pubk string
|
||||
priv string
|
||||
}
|
||||
|
||||
// test SLH-DSA-SHA2_128s based on samples data
|
||||
fn test_privatekey_slhdsa_128s_from_seed_with_sample_data() ! {
|
||||
for obj in sample_slhdsa_128s_seed {
|
||||
seed := hex.decode(obj.seed)!
|
||||
k_opt := KeyOpts{
|
||||
kind: .sha2_128s
|
||||
flag: 1
|
||||
seed: seed
|
||||
}
|
||||
mut pv := PrivateKey.new(k_opt)!
|
||||
assert pv.bytes()! == hex.decode(obj.priv)!
|
||||
assert pv.public_bytes()! == hex.decode(obj.pubk)!
|
||||
pv.free()
|
||||
}
|
||||
}
|
||||
|
||||
// This sample data was copied and adapted from boringssl test data in slh_keygen.txt
|
||||
// at https://boringssl.googlesource.com/boringssl.git/+/chromium-stable/crypto/slhdsa/slhdsa_keygen.txt
|
||||
// Its likely only support for SLH-DSA-SHA2_128s
|
||||
const sample_slhdsa_128s_seed = [
|
||||
Slh128sSeed{
|
||||
seed: '2f896d61d9cd9038ca303394fadaa22a24ac5ec1d86a989ca2196c3c8632419c1a05a42fe300e87b16aee116cb2e2363'
|
||||
pubk: '1a05a42fe300e87b16aee116cb2e236358e2c3e62632c9de03d08a535a0eb7e7'
|
||||
priv: '2f896d61d9cd9038ca303394fadaa22a24ac5ec1d86a989ca2196c3c8632419c1a05a42fe300e87b16aee116cb2e236358e2c3e62632c9de03d08a535a0eb7e7'
|
||||
},
|
||||
Slh128sSeed{
|
||||
seed: '87dd614ea188940d93c7df9943caa283cbdf2ccc4940e7007b7b6c799e95e160bbaca7b93fec1a097e115f10d18e6611'
|
||||
pubk: 'bbaca7b93fec1a097e115f10d18e66112aa087f0eeed95be3ab301ebc812406f'
|
||||
priv: '87dd614ea188940d93c7df9943caa283cbdf2ccc4940e7007b7b6c799e95e160bbaca7b93fec1a097e115f10d18e66112aa087f0eeed95be3ab301ebc812406f'
|
||||
},
|
||||
Slh128sSeed{
|
||||
seed: '0436b480d04c4c47f5ecd1e4b94f103988c5f804913fac77a96572cdc26f6a92f18d59d50b6b13f71821526f3aa800a8'
|
||||
pubk: 'f18d59d50b6b13f71821526f3aa800a8cde5ccb604485df0c6f14cd64b60979c'
|
||||
priv: '0436b480d04c4c47f5ecd1e4b94f103988c5f804913fac77a96572cdc26f6a92f18d59d50b6b13f71821526f3aa800a8cde5ccb604485df0c6f14cd64b60979c'
|
||||
},
|
||||
Slh128sSeed{
|
||||
seed: 'b9341d201d49b337c84e6ac2c26361e1f5dcab582f404fe89739df4ec64eccdd04519d0d7c1ad543cd1b479602e41784'
|
||||
pubk: '04519d0d7c1ad543cd1b479602e417848aeb88695d05f531a8415a4365b62983'
|
||||
priv: 'b9341d201d49b337c84e6ac2c26361e1f5dcab582f404fe89739df4ec64eccdd04519d0d7c1ad543cd1b479602e417848aeb88695d05f531a8415a4365b62983'
|
||||
},
|
||||
Slh128sSeed{
|
||||
seed: 'cbcaec354573e8cee1373b7aced67cdc683ed4491e17ef1dff9a9163fe7bcf74d91e0df4756c799ada2a0cf1b1aada1d'
|
||||
pubk: 'd91e0df4756c799ada2a0cf1b1aada1d1fddc3692e8909f2185e11654dc84def'
|
||||
priv: 'cbcaec354573e8cee1373b7aced67cdc683ed4491e17ef1dff9a9163fe7bcf74d91e0df4756c799ada2a0cf1b1aada1d1fddc3692e8909f2185e11654dc84def'
|
||||
},
|
||||
Slh128sSeed{
|
||||
seed: '1d92b6cc53e5bb08841b2669f1fb481c62db8f494e1bac12a6c6163142842a33771c182ffb096207da6476874ebdaf15'
|
||||
pubk: '771c182ffb096207da6476874ebdaf158c0143adbd0f66057a5180c96467d31d'
|
||||
priv: '1d92b6cc53e5bb08841b2669f1fb481c62db8f494e1bac12a6c6163142842a33771c182ffb096207da6476874ebdaf158c0143adbd0f66057a5180c96467d31d'
|
||||
},
|
||||
Slh128sSeed{
|
||||
seed: '94b11b26e2ec430f413f353fae96c144915e7ec84e9c786c895593b859bdb0edd54cc085cb4f4265f8288a9d67ae5806'
|
||||
pubk: 'd54cc085cb4f4265f8288a9d67ae5806ac638ad976a1fc8e2c7c5b9db2ea0573'
|
||||
priv: '94b11b26e2ec430f413f353fae96c144915e7ec84e9c786c895593b859bdb0edd54cc085cb4f4265f8288a9d67ae5806ac638ad976a1fc8e2c7c5b9db2ea0573'
|
||||
},
|
||||
Slh128sSeed{
|
||||
seed: '9078f099c6420c6bb1303977029b1e1bac048a4375f3c48862f74a6ccedb5be4755e624791fbfd27cd195ce3aa32c62c'
|
||||
pubk: '755e624791fbfd27cd195ce3aa32c62cd9030c131ca25c8c442c4ac0b27ae548'
|
||||
priv: '9078f099c6420c6bb1303977029b1e1bac048a4375f3c48862f74a6ccedb5be4755e624791fbfd27cd195ce3aa32c62cd9030c131ca25c8c442c4ac0b27ae548'
|
||||
},
|
||||
Slh128sSeed{
|
||||
seed: 'e0c67d9fb2434e27165c861c0f1040ed58c13b7f5e9517d000770bd3e88fbdb48cdf5f1cc1aa770a8bafcf1b8c5c843b'
|
||||
pubk: '8cdf5f1cc1aa770a8bafcf1b8c5c843ba659b85d99ca18f555b8452f411b519c'
|
||||
priv: 'e0c67d9fb2434e27165c861c0f1040ed58c13b7f5e9517d000770bd3e88fbdb48cdf5f1cc1aa770a8bafcf1b8c5c843ba659b85d99ca18f555b8452f411b519c'
|
||||
},
|
||||
Slh128sSeed{
|
||||
seed: 'ccae2481cecc4a55aa2afe4874b0ce501984d48423fc2452f24f49b2a68ef9b8d66807ecbfd2dc999d274d0d6414afc3'
|
||||
pubk: 'd66807ecbfd2dc999d274d0d6414afc3dfba899a4f7799cf74e98dc1c82a26ab'
|
||||
priv: 'ccae2481cecc4a55aa2afe4874b0ce501984d48423fc2452f24f49b2a68ef9b8d66807ecbfd2dc999d274d0d6414afc3dfba899a4f7799cf74e98dc1c82a26ab'
|
||||
},
|
||||
]
|
||||
@@ -0,0 +1,101 @@
|
||||
// Copyright (c) blackshirt. All rights reserved.
|
||||
// Use of this source code is governed by an MIT license
|
||||
// that can be found in the LICENSE file.
|
||||
module slhdsa
|
||||
|
||||
// The SLH-DSA functionality was added in recent OpenSSL 3.5 version.
|
||||
// So, we would panic if this module run on unmeet version on the current stock.
|
||||
fn init() {
|
||||
if C.OpenSSL_version_num() < u64(0x030500000) {
|
||||
panic('Your OpenSSL version ${C.OpenSSL_version_num().hex()} does not support for SLH-DSA')
|
||||
}
|
||||
}
|
||||
|
||||
// NID and LN constants for SLH-DSA algorithms
|
||||
pub const C.NID_SLH_DSA_SHA2_128s int
|
||||
pub const C.NID_SLH_DSA_SHA2_128f int
|
||||
pub const C.NID_SLH_DSA_SHA2_192s int
|
||||
pub const C.NID_SLH_DSA_SHA2_192f int
|
||||
pub const C.NID_SLH_DSA_SHA2_256s int
|
||||
pub const C.NID_SLH_DSA_SHA2_256f int
|
||||
pub const C.NID_SLH_DSA_SHAKE_128s int
|
||||
pub const C.NID_SLH_DSA_SHAKE_128f int
|
||||
pub const C.NID_SLH_DSA_SHAKE_192s int
|
||||
pub const C.NID_SLH_DSA_SHAKE_192f int
|
||||
pub const C.NID_SLH_DSA_SHAKE_256s int
|
||||
pub const C.NID_SLH_DSA_SHAKE_256f int
|
||||
|
||||
pub const C.LN_SLH_DSA_SHA2_128s int
|
||||
pub const C.LN_SLH_DSA_SHA2_128f int
|
||||
pub const C.LN_SLH_DSA_SHA2_192s int
|
||||
pub const C.LN_SLH_DSA_SHA2_192f int
|
||||
pub const C.LN_SLH_DSA_SHA2_256s int
|
||||
pub const C.LN_SLH_DSA_SHA2_256f int
|
||||
pub const C.LN_SLH_DSA_SHAKE_128s int
|
||||
pub const C.LN_SLH_DSA_SHAKE_128f int
|
||||
pub const C.LN_SLH_DSA_SHAKE_192s int
|
||||
pub const C.LN_SLH_DSA_SHAKE_192f int
|
||||
pub const C.LN_SLH_DSA_SHAKE_256s int
|
||||
pub const C.LN_SLH_DSA_SHAKE_256f int // #define LN_SLH_DSA_SHA2_128s "SLH-DSA-SHA2-128s"
|
||||
// #define NID_SLH_DSA_SHA2_128s 1460
|
||||
|
||||
const nid_slhdsa_sha2_128s = C.NID_SLH_DSA_SHA2_128s
|
||||
const ln_slhdsa_sha2_128s = &char(C.LN_SLH_DSA_SHA2_128s)
|
||||
|
||||
// #define LN_SLH_DSA_SHA2_128f "SLH-DSA-SHA2-128f"
|
||||
// #define NID_SLH_DSA_SHA2_128f 1461
|
||||
const nid_slhdsa_sha2_128f = C.NID_SLH_DSA_SHA2_128f
|
||||
const ln_slhdsa_sha2_128f = &char(C.LN_SLH_DSA_SHA2_128f)
|
||||
|
||||
// #define LN_SLH_DSA_SHA2_192s "SLH-DSA-SHA2-192s"
|
||||
// #define NID_SLH_DSA_SHA2_192s 1462
|
||||
const ln_slhdsa_sha2_192s = &char(C.LN_SLH_DSA_SHA2_192s)
|
||||
const nid_slhdsa_sha2_192s = C.NID_SLH_DSA_SHA2_192s
|
||||
|
||||
// #define LN_SLH_DSA_SHA2_192f "SLH-DSA-SHA2-192f"
|
||||
// #define NID_SLH_DSA_SHA2_192f 1463
|
||||
const ln_slhdsa_sha2_192f = &char(C.LN_SLH_DSA_SHA2_192f)
|
||||
const nid_slhdsa_sha2_192f = C.NID_SLH_DSA_SHA2_192f
|
||||
|
||||
// #define LN_SLH_DSA_SHA2_256s "SLH-DSA-SHA2-256s"
|
||||
// #define NID_SLH_DSA_SHA2_256s 1464
|
||||
const ln_slhdsa_sha2_256s = &char(C.LN_SLH_DSA_SHA2_256s)
|
||||
const nid_slhdsa_sha2_256s = C.NID_SLH_DSA_SHA2_256s
|
||||
|
||||
// #define LN_SLH_DSA_SHA2_256f "SLH-DSA-SHA2-256f"
|
||||
// #define NID_SLH_DSA_SHA2_256f 1465
|
||||
const ln_slhdsa_sha2_256f = &char(C.LN_SLH_DSA_SHA2_256f)
|
||||
const nid_slhdsa_sha2_256f = C.NID_SLH_DSA_SHA2_256f
|
||||
|
||||
// #define LN_SLH_DSA_SHAKE_128s "SLH-DSA-SHAKE-128s"
|
||||
// #define NID_SLH_DSA_SHAKE_128s 1466
|
||||
const ln_slhdsa_shake_128s = &char(C.LN_SLH_DSA_SHAKE_128s)
|
||||
const nid_slhdsa_shake_128s = C.NID_SLH_DSA_SHAKE_128s
|
||||
|
||||
// #define LN_SLH_DSA_SHAKE_128f "SLH-DSA-SHAKE-128f"
|
||||
// #define NID_SLH_DSA_SHAKE_128f 1467
|
||||
const ln_slhdsa_shake_128f = &char(C.LN_SLH_DSA_SHAKE_128f)
|
||||
const nid_slhdsa_shake_128f = C.NID_SLH_DSA_SHAKE_128f
|
||||
|
||||
// #define LN_SLH_DSA_SHAKE_192s "SLH-DSA-SHAKE-192s"
|
||||
// #define NID_SLH_DSA_SHAKE_192s 1468
|
||||
const ln_slhdsa_shake_192s = &char(C.LN_SLH_DSA_SHAKE_192s)
|
||||
const nid_slhdsa_shake_192s = C.NID_SLH_DSA_SHAKE_192s
|
||||
|
||||
// #define LN_SLH_DSA_SHAKE_192f "SLH-DSA-SHAKE-192f"
|
||||
// #define NID_SLH_DSA_SHAKE_192f 1469
|
||||
const ln_slhdsa_shake_192f = &char(C.LN_SLH_DSA_SHAKE_192f)
|
||||
const nid_slhdsa_shake_192f = C.NID_SLH_DSA_SHAKE_192f
|
||||
|
||||
// #define LN_SLH_DSA_SHAKE_256s "SLH-DSA-SHAKE-256s"
|
||||
// #define NID_SLH_DSA_SHAKE_256s 1470
|
||||
const ln_slhdsa_shake_256s = &char(C.LN_SLH_DSA_SHAKE_256s)
|
||||
const nid_slhdsa_shake_256s = C.NID_SLH_DSA_SHAKE_256s
|
||||
|
||||
// #define LN_SLH_DSA_SHAKE_256f "SLH-DSA-SHAKE-256f"
|
||||
// #define NID_SLH_DSA_SHAKE_256f 1471
|
||||
const ln_slhdsa_shake_256f = &char(C.LN_SLH_DSA_SHAKE_256f)
|
||||
const nid_slhdsa_shake_256f = C.NID_SLH_DSA_SHAKE_256f
|
||||
|
||||
const evp_pkey_keypair = C.EVP_PKEY_KEYPAIR
|
||||
const evp_pkey_public_key = C.EVP_PKEY_PUBLIC_KEY
|
||||
@@ -0,0 +1,26 @@
|
||||
module main
|
||||
|
||||
import x.crypto.slhdsa
|
||||
|
||||
fn main() {
|
||||
// creates default key
|
||||
mut pvkey := slhdsa.PrivateKey.new()!
|
||||
|
||||
// example of message
|
||||
xmsg := 'Sample message'.bytes()
|
||||
|
||||
// signing the message with the key
|
||||
sig := pvkey.sign(xmsg)!
|
||||
|
||||
// example of public key
|
||||
mut pbkey := pvkey.public_key()!
|
||||
|
||||
// verify signature with the public key
|
||||
verified := pbkey.verify(sig, xmsg)!
|
||||
dump(verified) // true
|
||||
assert verified == true
|
||||
|
||||
// release the resources
|
||||
pvkey.free()
|
||||
pbkey.free()
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
This `slhdsa` module requires latest OpenSSL library and development headers.
|
||||
It required minimum of OpenSLL 3.5 version.
|
||||
Likely most of the linux (unix) distros do not ship with this version on this time
|
||||
of writing, at March, 2025.
|
||||
|
||||
You can manually download and install OpenSSL library by your self. This documents acts as a simple
|
||||
guide on how to build and install latest OpenSSL library to your box.
|
||||
|
||||
This guide was for unix-like system, for others, see the guides more detail goes to
|
||||
[install.md](https://github.com/openssl/openssl/blob/master/INSTALL.md#building-openssl)<br>
|
||||
1. Go to https://openssl-library.org/source/ and download the latest version
|
||||
```bash
|
||||
$ wget -v https://github.com/openssl/openssl/releases/download/openssl-3.5.0-beta1/openssl-3.5.0-beta1.tar.gz
|
||||
```
|
||||
2. Extract your downloaded file
|
||||
```bash
|
||||
$ tar -xzvf openssl-3.5.0-beta1.tar.gz
|
||||
$ cd openssl-3.5.0-beta1
|
||||
```
|
||||
3. Configure the build flag, this module for optional build requires to use `/opt/ssl` prefix.
|
||||
```bash
|
||||
$ ./Configure --prefix=/opt/ssl --openssldir=/opt/ssl
|
||||
$ make
|
||||
$ sudo make install
|
||||
```
|
||||
By successfully completing this step, the latest OpenSSL has been built and installed onto
|
||||
configured path. You need to tell the system to add this path. <br>
|
||||
|
||||
4. Add `/opt/ssl/lib64` entry onto `/etc/ld.so.conf.d/libcrypto.conf`
|
||||
|
||||
5. Run `ldconfig`
|
||||
```bash
|
||||
$sudo ldconfig
|
||||
```
|
||||
6. Verify if the modules works.
|
||||
@@ -0,0 +1,110 @@
|
||||
// Copyright (c) blackshirt. All rights reserved.
|
||||
// Use of this source code is governed by an MIT license
|
||||
// that can be found in the LICENSE file.
|
||||
module slhdsa
|
||||
|
||||
// TODO: remove this when the 3.5 version was commonly availables on the stock.
|
||||
#flag linux -I/opt/ssl/include/openssl
|
||||
#flag linux -I/opt/ssl/include/crypto
|
||||
#flag linux -I/opt/ssl/include
|
||||
#flag linux -L/opt/ssl/lib64
|
||||
|
||||
// Standard path
|
||||
#flag linux -I/usr/local/include/openssl
|
||||
#flag linux -I/usr/local/include/crypto
|
||||
#flag linux -L/usr/local/lib64
|
||||
|
||||
#flag darwin -L /opt/homebrew/opt/openssl/lib -I /opt/homebrew/opt/openssl/include
|
||||
|
||||
#flag -I/usr/include/openssl
|
||||
#flag -lcrypto
|
||||
|
||||
#flag darwin -I/usr/local/opt/openssl/include
|
||||
#flag darwin -L/usr/local/opt/openssl/lib
|
||||
|
||||
#flag openbsd -I/usr/local/include/eopenssl35
|
||||
#flag openbsd -L/usr/local/lib/eopenssl35 -Wl,-rpath,/usr/local/lib/eopenssl35
|
||||
|
||||
// Installed through choco:
|
||||
#flag windows -IC:/Program Files/OpenSSL-Win64/include
|
||||
#flag windows -LC:/Program Files/OpenSSL-Win64/lib/VC/x64/MD
|
||||
// Installed on the CI:
|
||||
#flag windows -IC:/Program Files/OpenSSL/include
|
||||
#flag windows -LC:/Program Files/OpenSSL/lib/VC/x64/MD
|
||||
#flag windows -l libcrypto
|
||||
|
||||
#include <openssl/obj_mac.h>
|
||||
#include <openssl/evp.h>
|
||||
#include <openssl/bio.h>
|
||||
#include <openssl/param_build.h>
|
||||
|
||||
@[typedef]
|
||||
struct C.EVP_PKEY {}
|
||||
|
||||
fn C.EVP_PKEY_new() &C.EVP_PKEY
|
||||
fn C.EVP_PKEY_Q_keygen(ctx voidptr, propq &char, tipe &char) &C.EVP_PKEY
|
||||
fn C.EVP_PKEY_is_a(pkey &C.EVP_PKEY, name &char) i32
|
||||
fn C.EVP_PKEY_size(key &C.EVP_PKEY) i32
|
||||
fn C.EVP_PKEY_dup(key &C.EVP_PKEY) &C.EVP_PKEY
|
||||
fn C.EVP_PKEY_free(key &C.EVP_PKEY)
|
||||
fn C.EVP_PKEY_get_octet_string_param(pkey &C.EVP_PKEY, key_name &char, buf &u8, max_buf_sz i32, out_len &usize) i32
|
||||
fn C.EVP_PKEY_print_private(out &C.BIO, pkey &C.EVP_PKEY, indent i32, pctx voidptr) i32
|
||||
fn C.EVP_PKEY_print_public(out &C.BIO, pkey &C.EVP_PKEY, indent i32, pctx voidptr) i32
|
||||
fn C.EVP_PKEY_keygen_init(ctx &C.EVP_PKEY_CTX) i32 // 1 success
|
||||
fn C.EVP_PKEY_keygen(ctx &C.EVP_PKEY_CTX, ppkey &&C.EVP_PKEY) i32
|
||||
fn C.EVP_PKEY_CTX_set_params(ctx &C.EVP_PKEY_CTX, params &C.OSSL_PARAM) i32
|
||||
fn C.EVP_PKEY_get0_type_name(key &C.EVP_PKEY) &char
|
||||
fn C.EVP_PKEY_get0_description(key &C.EVP_PKEY) &char
|
||||
fn C.EVP_PKEY_get_bits(pkey &C.EVP_PKEY) i32
|
||||
fn C.EVP_PKEY_get_security_bits(pkey &C.EVP_PKEY) i32
|
||||
fn C.EVP_PKEY_sign_init_ex(ctx &C.EVP_PKEY_CTX, params &C.OSSL_PARAM) i32
|
||||
fn C.EVP_PKEY_sign_message_init(ctx &C.EVP_PKEY_CTX, algo &C.EVP_SIGNATURE, params &C.OSSL_PARAM) i32
|
||||
fn C.EVP_PKEY_sign(ctx &C.EVP_PKEY_CTX, sig &char, siglen &usize, tbs &char, tbslen i32) i32
|
||||
fn C.EVP_PKEY_verify_message_init(ctx &C.EVP_PKEY_CTX, algo &C.EVP_SIGNATURE, params &C.OSSL_PARAM) i32
|
||||
fn C.EVP_PKEY_verify(ctx &C.EVP_PKEY_CTX, sig &char, siglen &int, tbs &char, tbslen i32) i32
|
||||
fn C.EVP_PKEY_set_octet_string_param(key &C.EVP_PKEY, key_name &u8, buf &u8, bsize i32) i32
|
||||
fn C.EVP_PKEY_fromdata_init(ctx &C.EVP_PKEY_CTX) i32
|
||||
fn C.EVP_PKEY_fromdata(ctx &C.EVP_PKEY_CTX, ppkey &&C.EVP_PKEY, selection i32, params &C.OSSL_PARAM) i32
|
||||
fn C.EVP_PKEY_check(ctx &C.EVP_PKEY_CTX) i32
|
||||
fn C.EVP_PKEY_private_check(ctx &C.EVP_PKEY_CTX) i32
|
||||
fn C.EVP_PKEY_public_check(ctx &C.EVP_PKEY_CTX) i32
|
||||
|
||||
@[typedef]
|
||||
struct C.EVP_PKEY_CTX {}
|
||||
|
||||
fn C.EVP_PKEY_CTX_free(ctx &C.EVP_PKEY_CTX)
|
||||
fn C.EVP_PKEY_CTX_new_from_name(libctx voidptr, name &char, pq voidptr) &C.EVP_PKEY_CTX
|
||||
fn C.EVP_PKEY_CTX_new_from_pkey(libctx voidptr, pkey &C.EVP_PKEY, pq voidptr) &C.EVP_PKEY_CTX
|
||||
|
||||
fn C.OpenSSL_version_num() u64
|
||||
|
||||
@[typedef]
|
||||
struct C.EVP_SIGNATURE {}
|
||||
|
||||
fn C.EVP_SIGNATURE_free(signature &C.EVP_SIGNATURE)
|
||||
fn C.EVP_SIGNATURE_fetch(ctx voidptr, algorithm &char, properties voidptr) &C.EVP_SIGNATURE
|
||||
fn C.EVP_SIGNATURE_get0_name(signature &C.EVP_SIGNATURE) &char
|
||||
|
||||
@[typedef]
|
||||
struct C.OSSL_PARAM {}
|
||||
|
||||
@[typedef]
|
||||
struct C.OSSL_PARAM_BLD {}
|
||||
|
||||
fn C.OSSL_PARAM_free(params &C.OSSL_PARAM)
|
||||
fn C.OSSL_PARAM_BLD_free(param_bld &C.OSSL_PARAM_BLD)
|
||||
fn C.OSSL_PARAM_BLD_new() &C.OSSL_PARAM_BLD
|
||||
fn C.OSSL_PARAM_BLD_push_int(bld &C.OSSL_PARAM_BLD, key &u8, val i32) i32
|
||||
fn C.OSSL_PARAM_BLD_push_octet_string(bld &C.OSSL_PARAM_BLD, key &u8, buf voidptr, bsize i32) i32
|
||||
fn C.OSSL_PARAM_BLD_to_param(bld &C.OSSL_PARAM_BLD) &C.OSSL_PARAM
|
||||
|
||||
@[typedef]
|
||||
struct C.BIO_METHOD {}
|
||||
|
||||
@[typedef]
|
||||
struct C.BIO {}
|
||||
|
||||
fn C.BIO_new(t &C.BIO_METHOD) &C.BIO
|
||||
fn C.BIO_read_ex(b &C.BIO, data voidptr, dlen i32, readbytes &usize) i32
|
||||
fn C.BIO_free_all(a &C.BIO)
|
||||
fn C.BIO_s_mem() &C.BIO_METHOD
|
||||
@@ -0,0 +1,376 @@
|
||||
// Copyright (c) blackshirt. All rights reserved.
|
||||
// Use of this source code is governed by an MIT license
|
||||
// that can be found in the LICENSE file.
|
||||
module slhdsa
|
||||
|
||||
// PrivateKey represents SLH-DSA keypair.
|
||||
pub struct PrivateKey {
|
||||
key &C.EVP_PKEY
|
||||
}
|
||||
|
||||
// new creates a new SLH-DSA PrivateKey based on the supplied options.
|
||||
// By default, it will create a `SLH-DSA-SHA2-128s` key with random generator.
|
||||
// See `enum Kind` for all of availables choice's type (kind) of key.
|
||||
// Its also support to generate keys based on the seed or private bytes through
|
||||
// provided options. See available options in `KeyOpts`.
|
||||
// Usage example:
|
||||
// ```v
|
||||
// pk1 := slhdsa.PrivateKey.new()!; println(pk1)
|
||||
// pk2 := slhdsa.PrivateKey.new(kind: .sha2_128s)!; println(pk2)
|
||||
// ```
|
||||
pub fn PrivateKey.new(opt KeyOpts) !PrivateKey {
|
||||
match opt.flag {
|
||||
// default random generated key, its recommended way
|
||||
0 {
|
||||
kind := opt.kind.long_name()
|
||||
key := C.EVP_PKEY_Q_keygen(0, 0, kind)
|
||||
if key == 0 {
|
||||
return error('EVP_PKEY_Q_keygen failed')
|
||||
}
|
||||
return PrivateKey{
|
||||
key: key
|
||||
}
|
||||
}
|
||||
// use seed bytes, usually for testing purposes
|
||||
1 {
|
||||
// if you dont provides seed bytes, it will discarded, and use random one
|
||||
return PrivateKey.from_seed(opt.seed, opt.kind)!
|
||||
}
|
||||
// use private bytes, usually for testing purposes
|
||||
2 {
|
||||
// if you dont provides private bytes, it will discarded, and use random one
|
||||
return PrivateKey.from_bytes(opt.priv, opt.kind)!
|
||||
}
|
||||
else {
|
||||
return error('Unsupported flag')
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// sign signs the message using this key under desired options in opt.
|
||||
pub fn (pv PrivateKey) sign(msg []u8, opt SignerOpts) ![]u8 {
|
||||
if msg.len == 0 {
|
||||
return error('Zero length of messages')
|
||||
}
|
||||
if opt.context.len > 255 {
|
||||
return error('The context string size was over than 255')
|
||||
}
|
||||
out := slhdsa_do_sign(pv.key, msg, opt)!
|
||||
return out
|
||||
}
|
||||
|
||||
// verify verifies signature for the message msg under provided options.
|
||||
// Its possible because of under the hood, private key is a key pair.
|
||||
pub fn (pv PrivateKey) verify(sig []u8, msg []u8, opt SignerOpts) !bool {
|
||||
if opt.context.len > 255 {
|
||||
return error('The context string size was over than 255')
|
||||
}
|
||||
return slhdsa_do_verify(pv.key, sig, msg, opt)!
|
||||
}
|
||||
|
||||
const default_bioread_bufsize = 4096
|
||||
|
||||
// dump_key represents PrivateKey in human readable string.
|
||||
pub fn (pv PrivateKey) dump_key() !string {
|
||||
bo := C.BIO_new(C.BIO_s_mem())
|
||||
if bo == 0 {
|
||||
C.BIO_free_all(bo)
|
||||
return error('BIO_new failed')
|
||||
}
|
||||
n := C.EVP_PKEY_print_private(bo, pv.key, 2, 0)
|
||||
if n <= 0 {
|
||||
C.BIO_free_all(bo)
|
||||
return error('print private failed')
|
||||
}
|
||||
size := usize(0)
|
||||
buf := []u8{len: default_bioread_bufsize}
|
||||
m := C.BIO_read_ex(bo, buf.data, buf.len, &size)
|
||||
|
||||
if m <= 0 {
|
||||
unsafe { buf.free() }
|
||||
C.BIO_free_all(bo)
|
||||
return error('BIO_read_ex failed')
|
||||
}
|
||||
output := buf[..size].bytestr()
|
||||
|
||||
// Cleans up and return the result
|
||||
unsafe { buf.free() }
|
||||
C.BIO_free_all(bo)
|
||||
|
||||
return output
|
||||
}
|
||||
|
||||
// public_key gets the public part of this private key as a PublicKey.
|
||||
pub fn (pv PrivateKey) public_key() !PublicKey {
|
||||
pbkey := C.EVP_PKEY_dup(pv.key)
|
||||
// we clears out the private bits from the key
|
||||
// by setting it into null
|
||||
n := C.EVP_PKEY_set_octet_string_param(pbkey, c'priv', 0, 0)
|
||||
if n <= 0 {
|
||||
C.EVP_PKEY_free(pbkey)
|
||||
return error('EVP_PKEY_set_octet_string_param')
|
||||
}
|
||||
|
||||
return PublicKey{
|
||||
key: pbkey
|
||||
}
|
||||
}
|
||||
|
||||
// free releases memory occupied by this key.
|
||||
pub fn (mut pv PrivateKey) free() {
|
||||
C.EVP_PKEY_free(pv.key)
|
||||
}
|
||||
|
||||
// PublicKey represents public key part from the key.
|
||||
pub struct PublicKey {
|
||||
key &C.EVP_PKEY
|
||||
}
|
||||
|
||||
// verify verifies signature sig for messages msg under options provided.
|
||||
pub fn (pb PublicKey) verify(sig []u8, msg []u8, opt SignerOpts) !bool {
|
||||
if opt.context.len > 255 {
|
||||
return error('The context string size was over than 255')
|
||||
}
|
||||
return slhdsa_do_verify(pb.key, sig, msg, opt)!
|
||||
}
|
||||
|
||||
// dump_key dumps this public key as a human readable string.
|
||||
pub fn (pb PublicKey) dump_key() !string {
|
||||
bo := C.BIO_new(C.BIO_s_mem())
|
||||
n := C.EVP_PKEY_print_public(bo, pb.key, 2, 0)
|
||||
if n <= 0 {
|
||||
C.BIO_free_all(bo)
|
||||
return error('EVP_PKEY_print_public failed')
|
||||
}
|
||||
size := usize(0)
|
||||
mut m := C.BIO_read_ex(bo, 0, default_bioread_bufsize, &size)
|
||||
mut buf := []u8{len: int(size)}
|
||||
m = C.BIO_read_ex(bo, buf.data, buf.len, &size)
|
||||
if m <= 0 {
|
||||
C.BIO_free_all(bo)
|
||||
return error('BIO_read_ex failed')
|
||||
}
|
||||
|
||||
output := buf[..size].bytestr()
|
||||
// Cleans up
|
||||
unsafe { buf.free() }
|
||||
C.BIO_free_all(bo)
|
||||
|
||||
return output
|
||||
}
|
||||
|
||||
// free releases memory occupied by this public key
|
||||
pub fn (mut pb PublicKey) free() {
|
||||
C.EVP_PKEY_free(pb.key)
|
||||
}
|
||||
|
||||
// the biggest supported size of seed was 32 bytes length, where private key contains 4*32 bytes
|
||||
const default_privkey_buffer = 128
|
||||
|
||||
fn (pv PrivateKey) bytes() ![]u8 {
|
||||
priv_len := usize(0)
|
||||
priv := []u8{len: default_privkey_buffer}
|
||||
|
||||
n := C.EVP_PKEY_get_octet_string_param(pv.key, c'priv', priv.data, priv.len, &priv_len)
|
||||
if n <= 0 {
|
||||
return error('EVP_PKEY_get_octet_string_param failed')
|
||||
}
|
||||
out := priv[..int(priv_len)].clone()
|
||||
unsafe { priv.free() }
|
||||
return out
|
||||
}
|
||||
|
||||
// the biggest public key size was 64 bytes length, where public key
|
||||
// was contains 2*n, so we relaxed it to 2*72 bytes
|
||||
const default_pubkey_buffer = 144
|
||||
|
||||
fn (pv PrivateKey) public_bytes() ![]u8 {
|
||||
pblen := usize(0)
|
||||
buf := []u8{len: default_pubkey_buffer}
|
||||
n := C.EVP_PKEY_get_octet_string_param(pv.key, c'pub', buf.data, buf.len, &pblen)
|
||||
if n <= 0 {
|
||||
return error('EVP_PKEY_get_octet_string_param failed')
|
||||
}
|
||||
|
||||
out := buf[..pblen].clone()
|
||||
unsafe { buf.free() }
|
||||
|
||||
return out
|
||||
}
|
||||
|
||||
// Signing and verifying Helpers
|
||||
//
|
||||
// slhdsa_do_sign performs signing msg with SLH-DSA key.
|
||||
@[inline]
|
||||
fn slhdsa_do_sign(key &C.EVP_PKEY, msg []u8, opt SignerOpts) ![]u8 {
|
||||
sctx := C.EVP_PKEY_CTX_new_from_pkey(0, key, 0)
|
||||
if sctx == 0 {
|
||||
C.EVP_PKEY_CTX_free(sctx)
|
||||
return error('EVP_PKEY_CTX_new_from_pkey failed')
|
||||
}
|
||||
|
||||
// gets algo name from key
|
||||
algo_name := key_type_name(key)
|
||||
sig_alg := C.EVP_SIGNATURE_fetch(0, algo_name, 0)
|
||||
if sig_alg == 0 {
|
||||
C.EVP_SIGNATURE_free(sig_alg)
|
||||
C.EVP_PKEY_CTX_free(sctx)
|
||||
return error('EVP_SIGNATURE_fetch failed')
|
||||
}
|
||||
|
||||
param_bld := C.OSSL_PARAM_BLD_new()
|
||||
if param_bld == 0 {
|
||||
C.OSSL_PARAM_BLD_free(param_bld)
|
||||
C.EVP_SIGNATURE_free(sig_alg)
|
||||
C.EVP_PKEY_CTX_free(sctx)
|
||||
return error('OSSL_PARAM_BLD_new failed')
|
||||
}
|
||||
|
||||
// writes `context-string` params into context key generator.
|
||||
// OSSL_PARAM_octet_string("context-string", (unsigned char *)"A context string", 33),
|
||||
cs := C.OSSL_PARAM_BLD_push_octet_string(param_bld, c'context-string', opt.context.str,
|
||||
opt.context.len)
|
||||
if cs <= 0 {
|
||||
C.OSSL_PARAM_BLD_free(param_bld)
|
||||
C.EVP_SIGNATURE_free(sig_alg)
|
||||
C.EVP_PKEY_CTX_free(sctx)
|
||||
return error('OSSL_PARAM_BLD_push_octet_string context-string flag FAILED')
|
||||
}
|
||||
|
||||
// write `message-encoding` flag
|
||||
me := C.OSSL_PARAM_BLD_push_int(param_bld, c'message-encoding', opt.encoding)
|
||||
if me <= 0 {
|
||||
C.OSSL_PARAM_BLD_free(param_bld)
|
||||
C.EVP_SIGNATURE_free(sig_alg)
|
||||
C.EVP_PKEY_CTX_free(sctx)
|
||||
return error('OSSL_PARAM_BLD_push_int message-encoding flag FAILED')
|
||||
}
|
||||
|
||||
// handle entropy testing
|
||||
// `test-entropy flag only handled when `encoding` flag was set into 0 value
|
||||
if opt.encoding == 0 {
|
||||
te := C.OSSL_PARAM_BLD_push_octet_string(param_bld, c'test-entropy', opt.entropy.data,
|
||||
opt.entropy.len)
|
||||
if te <= 0 {
|
||||
C.OSSL_PARAM_BLD_free(param_bld)
|
||||
C.EVP_SIGNATURE_free(sig_alg)
|
||||
C.EVP_PKEY_CTX_free(sctx)
|
||||
return error('OSSL_PARAM_BLD_push_octet_string test-entropy flag failed')
|
||||
}
|
||||
}
|
||||
|
||||
// write `deterministic` flag, its getting ignored if "test-entropy" is set.
|
||||
dt := C.OSSL_PARAM_BLD_push_int(param_bld, c'deterministic', opt.deterministic)
|
||||
if dt <= 0 {
|
||||
C.OSSL_PARAM_BLD_free(param_bld)
|
||||
C.EVP_SIGNATURE_free(sig_alg)
|
||||
C.EVP_PKEY_CTX_free(sctx)
|
||||
return error('OSSL_PARAM_BLD_push_int deterministic flag FAILED')
|
||||
}
|
||||
// build params
|
||||
params := C.OSSL_PARAM_BLD_to_param(param_bld)
|
||||
|
||||
// Then init the context with this params
|
||||
x := C.EVP_PKEY_sign_message_init(sctx, sig_alg, params)
|
||||
if x <= 0 {
|
||||
C.OSSL_PARAM_BLD_free(param_bld)
|
||||
C.OSSL_PARAM_free(params)
|
||||
C.EVP_SIGNATURE_free(sig_alg)
|
||||
C.EVP_PKEY_CTX_free(sctx)
|
||||
return error('EVP_PKEY_sign_message_init failed')
|
||||
}
|
||||
|
||||
sig_len := usize(C.EVP_PKEY_size(key))
|
||||
buf := []u8{len: int(sig_len)}
|
||||
// Do signing the msg and updates the sig_len.
|
||||
m := C.EVP_PKEY_sign(sctx, buf.data, &sig_len, msg.data, msg.len)
|
||||
if m <= 0 {
|
||||
C.OSSL_PARAM_BLD_free(param_bld)
|
||||
C.OSSL_PARAM_free(params)
|
||||
C.EVP_SIGNATURE_free(sig_alg)
|
||||
C.EVP_PKEY_CTX_free(sctx)
|
||||
return error('EVP_PKEY_sign failed')
|
||||
}
|
||||
|
||||
// return the copy of the sig
|
||||
sig := buf[..sig_len].clone()
|
||||
|
||||
// cleans up
|
||||
unsafe { buf.free() }
|
||||
C.OSSL_PARAM_BLD_free(param_bld)
|
||||
C.OSSL_PARAM_free(params)
|
||||
C.EVP_SIGNATURE_free(sig_alg)
|
||||
C.EVP_PKEY_CTX_free(sctx)
|
||||
|
||||
return sig
|
||||
}
|
||||
|
||||
// slhdsa_do_verify performs verifying of provided signature in sign for the msg message.
|
||||
@[inline]
|
||||
fn slhdsa_do_verify(key &C.EVP_PKEY, sign []u8, msg []u8, opt SignerOpts) !bool {
|
||||
sctx := C.EVP_PKEY_CTX_new_from_pkey(0, key, 0)
|
||||
if sctx == 0 {
|
||||
C.EVP_PKEY_CTX_free(sctx)
|
||||
return error('EVP_PKEY_CTX_new_from_pkey failed')
|
||||
}
|
||||
|
||||
// get the algo signature name from the key
|
||||
algo_name := key_type_name(key)
|
||||
sig_alg := C.EVP_SIGNATURE_fetch(0, algo_name, 0)
|
||||
if sig_alg == 0 {
|
||||
C.EVP_SIGNATURE_free(sig_alg)
|
||||
C.EVP_PKEY_CTX_free(sctx)
|
||||
return error('EVP_SIGNATURE_fetch failed')
|
||||
}
|
||||
|
||||
param_bld := C.OSSL_PARAM_BLD_new()
|
||||
if param_bld == 0 {
|
||||
C.OSSL_PARAM_BLD_free(param_bld)
|
||||
C.EVP_SIGNATURE_free(sig_alg)
|
||||
C.EVP_PKEY_CTX_free(sctx)
|
||||
return error('OSSL_PARAM_BLD_new failed')
|
||||
}
|
||||
|
||||
// handle context option
|
||||
if opt.context.len > 0 {
|
||||
o := C.OSSL_PARAM_BLD_push_octet_string(param_bld, c'context-string', opt.context.str,
|
||||
opt.context.len)
|
||||
if o <= 0 {
|
||||
C.OSSL_PARAM_BLD_free(param_bld)
|
||||
C.EVP_SIGNATURE_free(sig_alg)
|
||||
C.EVP_PKEY_CTX_free(sctx)
|
||||
return error('OSSL_PARAM_BLD_push failed')
|
||||
}
|
||||
}
|
||||
// for testing
|
||||
if opt.encoding == 0 {
|
||||
oo := C.OSSL_PARAM_BLD_push_int(param_bld, c'message-encoding', opt.encoding)
|
||||
if oo <= 0 {
|
||||
C.OSSL_PARAM_BLD_free(param_bld)
|
||||
C.EVP_SIGNATURE_free(sig_alg)
|
||||
C.EVP_PKEY_CTX_free(sctx)
|
||||
return error('OSSL_PARAM_BLD_push FAILED')
|
||||
}
|
||||
}
|
||||
// build params
|
||||
params := C.OSSL_PARAM_BLD_to_param(param_bld)
|
||||
n := C.EVP_PKEY_verify_message_init(sctx, sig_alg, params)
|
||||
if n <= 0 {
|
||||
C.OSSL_PARAM_BLD_free(param_bld)
|
||||
C.OSSL_PARAM_free(params)
|
||||
C.EVP_SIGNATURE_free(sig_alg)
|
||||
C.EVP_PKEY_CTX_free(sctx)
|
||||
return error('OSSL_PARAM_BLD_push FAILED')
|
||||
}
|
||||
|
||||
// do verifying of the signature.
|
||||
m := C.EVP_PKEY_verify(sctx, sign.data, sign.len, msg.data, msg.len)
|
||||
|
||||
// Cleans up
|
||||
C.EVP_SIGNATURE_free(sig_alg)
|
||||
C.EVP_PKEY_CTX_free(sctx)
|
||||
C.OSSL_PARAM_BLD_free(param_bld)
|
||||
C.OSSL_PARAM_free(params)
|
||||
|
||||
return m == 1
|
||||
}
|
||||
@@ -0,0 +1,111 @@
|
||||
// Copyright (c) blackshirt. All rights reserved.
|
||||
// Use of this source code is governed by an MIT license
|
||||
// that can be found in the LICENSE file.
|
||||
// vtest build: has_modern_openssl?
|
||||
module slhdsa
|
||||
|
||||
import encoding.hex
|
||||
|
||||
fn test_basic_slhdsa_signing_verifying() ! {
|
||||
mut pv := PrivateKey.new()!
|
||||
msg := 'msg'.bytes()
|
||||
|
||||
sig := pv.sign(msg)!
|
||||
|
||||
mut pb := pv.public_key()!
|
||||
verified := pb.verify(sig, msg)!
|
||||
assert verified
|
||||
|
||||
pv.free()
|
||||
pb.free()
|
||||
}
|
||||
|
||||
// Test for SLH-DSA signature generation, for SLH_DSA_SHA2_128s key
|
||||
fn test_sha2_128_signature_generation() ! {
|
||||
for idx, item in samples_slh128s_generated_signatures {
|
||||
priv := hex.decode(item.priv)!
|
||||
entropy := hex.decode(item.entropy)!
|
||||
msg := hex.decode(item.msg)!
|
||||
sig := hex.decode(item.sig)!
|
||||
|
||||
// key options
|
||||
k_opt := KeyOpts{
|
||||
kind: .sha2_128s
|
||||
flag: 2
|
||||
priv: priv
|
||||
}
|
||||
mut pv := PrivateKey.new(k_opt)!
|
||||
|
||||
// signing (verifying) options
|
||||
s_opt := SignerOpts{
|
||||
encoding: 0
|
||||
entropy: entropy
|
||||
deterministic: 0
|
||||
}
|
||||
|
||||
out_sig := pv.sign(msg, s_opt)!
|
||||
assert out_sig == sig
|
||||
|
||||
mut pb := pv.public_key()!
|
||||
verified := pb.verify(out_sig, msg, s_opt)!
|
||||
assert verified
|
||||
|
||||
pv.free()
|
||||
pb.free()
|
||||
}
|
||||
}
|
||||
|
||||
struct TestSignatureGenerationSLHSHA2128s {
|
||||
priv string
|
||||
entropy string
|
||||
msg string
|
||||
sig string
|
||||
}
|
||||
|
||||
// This samples of data was copied and adapted into V opaque from
|
||||
// https://boringssl.googlesource.com/boringssl.git/+/chromium-stable/crypto/slhdsa/slhdsa_siggen.txt
|
||||
//
|
||||
const samples_slh128s_generated_signatures = [
|
||||
TestSignatureGenerationSLHSHA2128s{
|
||||
priv: '4329f96b412b5d5ca9c730c9d54e52595265f6fc3ea67c183aa7043d90e949b8fd320c8fc0fa6a23462483535f131b9ea265848e7bb5f4d3cfd99de2595382b3'
|
||||
entropy: '65ac888a4cbd14aa5533e8685b0cc0e1'
|
||||
msg: '707951a4c5040af79e4dbb1d5614ea77ee58a1b16d8c17a40abb01499d1b65f5c55b517b603711e5db67f758cf6717aa10cee53b4417b4c1f4b1dcd6e9e65e96a68b856ebefb45d394e6c9214d0c55e692eb2ffbb10b804bc91076a50aa5cba4884564254ea99540c99647c4637ed26b57e77cb58be6db0ab0d418543b0f69db'
|
||||
sig: '136e72a8d764f24962b52245fedaaef9c339d972d839a1f7f33d1d6e2f1ca8c1248999a12f22cfcac4a46ab69b13304489240ec009a72198942bde5c2bcd67bd899f6fc40843c17580828a012bc235a94e4b3d5a5a18c7977f119bf1634ce2adbff5b3e48656aa69826584d1309649321f2aa6389626658eac20a48bdac6540af45baf8937ec2f97c361e3e5df8ba1e7633bbb1aa63800c2b285a0abb006fe47bf0c25fe3770ccf4979456f4227ad50edae1126fecb5c267261dd9f4cf9eb5e8763a9eaffc8861cfde3be4a28aff5e60cb54f73cbc3362d730e06af762bcaaa234173570aca0ed0833979c4daba7304948f2546a954aea75d296258d7136ea0b5c7fb62e0de3502e8f8482fc5c51010be81e9ae6ed867c249163c3a2d90c45ce4fce831afe6c7721b6bade1d1057c0981a7093830a34cddc4edaada2b6d50b4cc741210f075b0ff3278973ddbdaef76017fe0b52798886f41480b418404c9ce9a96070e4fbd972bde8a46151328c2181afed161b9f72870e1f96c1bf610642fcf65ce80a9949044662b8cedb16e59cde13275dfcd2d62d98dd01e8d9a602ae2f8dd48905394ac3057c5d37bffb02bd8dbcc5d9ebd851fa30019e2df181f6e1729b1ad4de384408a3f39b78ae9c4b2fceeb07f1a95a1ddaffd2215df02b3c589854cff081a7386c5e92d1af1ecc56c51d688a4ee7f3a483abd9a1d25273e7977d9a2648d82d551fb4f7ed5c823aedcaef272471ef3cef7ede7cb78bd103332ede5e9a8da19dcf65a299b4af23a57a2913f04afc370453564b8f62375ab3d0ca93a13f106f555fc0ca2330009bb041c6027180dba18b9286a92fedac1bb5b42dd1881f007f0d16800d1fd87cc059e4964c61ed2660b296dbbadb76c852a9e16dcaf96f687664dabcb96a5ba1ba4c42ccf82175063d81b6524267bdccfd80c5414d304232e4d26d44b456652d0278a84a1038933860a4bc19cadb82a5d112ccf9ca684058cdb2c6d7a2249749c375d9a94d5795bfe8733f93e4d5c7361a81adc499e4d11802841f41131724546fc6e4d9cc47c74c5b90ab60f9cd7c2066363fda14736378ce5fed35a4accf200cdab5d0963c40e1a466299463aaab60ae9242d6bf41d575a4932936b1843fb389c785250be0f1ed7295d1d039f0ef2cb5cdee668cb579f9db6727d6618ec1c52daad824b355c157e70a59457daa922b943ffac9d2fd4a5fe25ed453e642ef9a329804407c2c585781460fe16d713cf3a3d1573c4347a936ddc3c380650c0a7def8bfa5cde285c3ee71a4b69654e8f2e2797400907d35ab13ce35fb3e297ef62bfe6d15c9fc741618756416a8bc87770025b3fe432dbc3a60ab0a8075c2bfd1d10f3f01ac09475d4b88348e20930ba252f39345c37acdfb5f413018c78f0838e1f561d4a64ace9e2adf7e92be50570e805f8ccb8b87db71e3afaee1a538454bd4770120733ac5a9db705aa0396380a832438265ae777dfdc27eb9df853bfc2ba4dce83bd41413b0cc3da9687db8cd07d37b668f2a0a48dc0e535c86e31f57198c4222754a411e74f46b32d92ed49a66b92a69a5c71da1c0450f8fe0f1a622aff6de03949e06315b6ed81e7b885fa5ae680d36b7712b16299d1e323d89446a499a356e31778a0d5c76e6681039c17b35b7b578f8381062675754ab1b4de49af29e7d6c360a156ac0dd505378d1bdb9dc611fd6874a22a17598baa7b972d17d14febe7c1b2415f5d1c107161bf9447b1bd59199ce95362b5e1b80bbfc9851dfde80c26c28336a3ffd67dba66714ebbaf0f9d76907f7338300c9de16e2254715890d4b3c8944450bf881db83a78dbad091394e4dbd09394f2955aeb9e43afe0ab753174a83fb214e3187c66a23766c52d7e0ad944de19d7aeefbbe4e6f288a4c039601905e2f05d0931618a03e3f5896da4c9fee1c9d01b2ff5ecf23e7bcea36f26c8c4e50d4ca1a6af3b91143e135a9c73bd263fee460117c1badf3dd0807eaf42bc5656a0b8c9b0a5a1099338383adb26968d136845a750961a15abd55373e11945f6e746f1fdff838325c39c2a47095564040b31e2d181f647090a89687a78a0df574bbb25924b887f72d93e313a6f4dc5e3a0370a15a541a02fe07646a59e34585addf83ae66a58577a20418438243cbf891b81142696e3970af0cdc5df1cbe9d57f2364cb3f4282c68132cee8963b20aed5bc5abb0cab5676467f1d9ec82b919daba3d82503beb4a87b4be622ef3fdc1f43c29230ee362049f9d34063938befaccd7e300603eb79b34f9946c2d082e64db5023f2e289cc6d2fc03767c894ce704456306c733639c814a23b085ac8ca966f7afcb6b8f38d0404fc0a0b4c25de3737585f3dc4a7f8079145398ca4d032e4526b80d6185ecd6a09312c612d903924ede98336f578413e520f6d41d8365352e38fad8836ceaa44441836aa4dca93a9671f22d358d771d008ed0689c2faa7ee16e6145f9eac030073b6df4e68cbf26c84d320239df1dd7bd36fdd1693164e060c4e408b02b00e412edde1bbfc3d1873e4e0fdd3bff4c12eb57f393a59b782590000b47d897fcb19ae53a3783c8a15ec9698d3451157a569d4cd143c23fdd0db0a78c25c661911137c137f38ac0a7c5e6fd6058db5ad85d8459677dd15ab4c16be58eca77aee1372f774b7e5a5cecd806300962a80be3b25a7afea5bad71dc1ed923e388bb2c4be1ede0b6c030a07fe8b0af2f13c1c6c18c6a86da8fe202675193c84f9850f5c0642ce601301496ce263755c59dba98d5a10190969e2f572b282aa81d3018b517a7d0fa09d2e96eebba51b9dc13309c8c15c4f48dc3dcbe3339d7409bba5227b19769dc35fa479fefe054f071408c37546f9bfaa2667afba9665e2920572e3254ec2a3926c273c50fb6328db1f33e145c198e24ac4d4504fd819702724ca05e94b295acc8d822c8871a70a38a67fdf36be6fb5437a789397c15c2604ccf09d12cc5563544a31f98a6738be99d763f74d3662142f1744b4ca91fe57efe7c5af92246a54634e49de35f2cee5f5b9f3e6f962656945f6a3233a5ca417603997275a10f84e33b7d357d532082a65f0135571b8cf323aa49d6e61cac7ccc3de0bd64a896c2d587047d2ef13306034aa9877351e246daf297fac49a015ad47af1e1714ec64ed0a6004e1194b7c56470f543176fc04fd40e251258f0c04011eebd39824886a1caeebc2cb19c8eea56435d678a93c8b71c2902a5b866d82cbf485219ceb34c8135692a0963756b38fcbf6db0d7b79e2f36626bb9b1ea78912535dd43bf199fec9576b0569394b8bef60298b8e408d7390370c7b14f3f86a2ac53dcd0759ca1e5429d10948458bfdd8639fabfa586f757fb8e6a1ef044d661e80c6d3403dd54d2da5a6e662ab81c30be433c2f42d231f6e3b911ea70be32c9de4a9abffd6e0481abfb7f3cc2aeab33f35f2c74cf4f3382996e826897b4629055a97686dc6f1591fdec91e0e3f227690463d2bdb8cf5fec0994733e8737dace9Line truncated
|
||||
},
|
||||
TestSignatureGenerationSLHSHA2128s{
|
||||
priv: '5c34d15e5931c27c976f7044d18f24e11a268267de70e8c86e1e90f888dd692fb534c67bf12f66252e772e66675c46de3aecaf7da2a98e7971b1a455eb4e1300'
|
||||
entropy: 'f93091ff5b082105513400726dfbd17b'
|
||||
msg: '2d884fd72a2daf869220adb4abfd959ebbfff58b3e74676afdad958ef77b'
|
||||
sig: '369288da6f9fab54421a365462580ef9b385cd5cafe3ea68d7f8a48e4ff3b2a88bd6c4ee0d8e62354386857c7ac7e3979571b50435656d112cbe94f494446071e5f3e9056b498f4c32a1515b72ecf27cf36ececd306db293dc83ca7212bb0da2fc01aac45f44aaac157affd1e88a70482b4f2c352554fe0b61d14f7b360707df6d55595516b2411388e51d8b558c8fa2e4542465b2e9ddd9e3944c252b3d1304dada55c46ed1cb2b6368bdfb70678a3b79ac5c630f8b26b6175fe0fcdf12494c551fe135adbdc2cced3689244f3b525211705ea469a153bab14fd77b83c0583f64ad5d83858e67b753f8f6643157941b1a5c41b8141440b2d891ed13a69f17412dd6aa68747765269cc81ca638b905efae40751ac3a4f5e78abc5d638ac6e4e47dc9a1ecb560216aa765f4675e45b189b264b7edaa4ec501ff6d1d6ab99a5c75d9fc0113bcf26a13f806b7dd0c56c490b74f81c504b5f5d1087dfe29ff93d5852abb53d8e5ec7a6634509c11d63c62b8a519747db311e650e22103239cbbb995848f3163702243253c562bd2bed6515e5ddc75ba8cb7c1bac4d52a470b0a2e0ea58485c8968394a59ce251ddb13278b670e061e81c3987c1943d4e8ceb297f454933f4f16b1a74185f1ddf255e739c743be84dc0eb9a696c9277ec21ef7e20857043113c999f6c1bff2dcf3b73eeb8c43eb46dfadc7883149bd889b1c40b5f5918239fca6ba4c276360086bf323109ec9ce8b848663cd126a42ca9d77c70e51926d27de81bb22aab2a880ea67412a0f8c895a9a10ba59c6470345bbb8f550f11031bfe3b78b2572ec119e908d4785740c79d320e1363782e7a771f36d8bedf9fa1b58f73a9cd952caf9481a8fbe485466d97e5718d57b4a3b7e42a2df4fe15d921b1299d05a6d34fa94c01cd4a8498689d71957fb5eeb45076face2addc83f79716300ffe462a81c4e0bec1665a199ca2b314fc7efc47aa18ced7ed7923d42c503ee1808676b0386c58de9e4bb76f41a58bf6b9dcc619e9faa7867b93a5880f635bb01c253f52b5e1fd1b30b5cbab6c9f01d21c5a1c6345d528c2b8bcd1eca66f97eeb5a4ec6c098e686412a285038b72d80855020b26f9cfd1472cab8b3105b8d3ef6a5c463629ace8a608b196b8c1e1ffd0cdefb4289faba6266a473ee879276605db6b9c78a105b3ab66e743ade9f200ce472be8c0176cd8f66f7acee6213af486ccf55a5c9f36e0a2970d0b38393826a0105544a76a5ea2ed708e5463dc7641e42b2ee03ebc8579df948f43d093c4d9788872c0766c410fd1b377bacefa014ce5861aecc132582f1dabe29b3feba9b96dfc6c75d5a686ce2dcd5e8d280b7b23870e79572164bc5f04b4947881dc33a2f7361353703515927b420f39a74551fcf5939ca870d25735d6160fdb209426d4e7069aba6f261688a4ca99b844c16c35029afd3de0b80be6ba37505c9f952337622f4bb8b2755f1aeafd7e7db6daeae77413cbb725617ed74460d4db8bffe68aed519d9f3d9f7179490da848ccb6947b6fa8fbe18697a1b7d4e95e5a78afcf1f5bacac6e8b55b23317f2aa2902371a1e241700bdca544dfb9678cadfe8a1930ff33bd55294baabfd5d02c7d3a85f2781d68ed95c06ffa037db411dc7075626378318f7567232e25825464a346318d3be98720200d95a6204afbc96fbc3d92eccab3e417813318564f6aa8e60ff4fb8de3764527d77246860d70264f018c24fa7e279c9a3ca22362b8bf3573536172f866ec81de6f8cb5f1f58425d3441cddf1e7ba802b4f199824c5909d17a68d0a16c7a0e394e02b0bda932e7f7422e1211e54514a6ed4c28e87f241209723f0d0b88daabb200bc4518e20bab6b12a493d9d71fd0c9c2dd2fe0438e4898ac7c2efc70fb9c681785a8a9d65a3e95a7aad01a97fbc63da244a8f4e785fc5df12877cbf51f3817f51e74fed7e7937f61979c0974e75535b6bd6cfde0d6f9b67072995a453de195d08824f1e1162c40081d58ff7edfb6c1e7c8fd73ad8a62b909ffa3afa187221c7be3a43910521ba84725657d2ac7abae660541e29f566164a718f14f1236dd8c209368cb6074e4d3b813bda648c5bae9a035a28defd038b81a96dca674a99842b32197e18095c05cdea57a72a40f337fec249bbbdeb04fba805bb6320b4dd867d3a197185eafd3d621a7b3a2c952acf9b8d06dc928814326a46e1cf14b632c95b945142cc46c104a538192f855a1f014c718fe94252e7b67975b0a8d47e5d69d2109d5af072fdda7aa401ed95e9f1fc56cd123078fd81333f1dbe8c6364ff5ad8797aaeef75b15165f4aa819b0e5d64e73c9c061f6b20295913b1a8920b4a84598d3b93d1c57e98b4dc2645def986da5ecbe493329e7d36db61fdabff8a7bb683433a169306960f0680faccbc1476eb3ac0cf1a7b9fbefe478be2b4b2e509e329b3a00345730ced8da0caa34955e2a7e6ed321969c6f6b63fde4d61314cb85f3db302854e9318746ef311ac89819c37dad2b181054206f139d1a85715a7c3d9a61f4462807bcc9b4e9b8be71e9eb22216c46f811b371dac40ffb2be532fe965a3660b4bbdcec0e288a8579ed31d770771796c5bffc212b7e978656b13449733a1c3963a950242e97036d16041039cae1d535f8f707fe4be52a0d93c20f9d8975fe987920c700fdd9d8c0d3dfabf535d4552b7cc1a1ca2a9eebdb494c7c4d7c5642f207784f3ee6c1fe4c259fefe7b3ca8ff71811ab154fc36efea5e6fb1721d0f80c6282451a563e80a7b3b195dc9853d53c2020c7ccd811ba8da967737931525ef6caec872cbd82299b2b7bc90b0c4241f8d00ee0fca135bf5a10926937f7e4d301d2bc87dd9fe90c350f2b34effeeab12a5de2b37eefeba87fe53183747cdee4bc5b54f16a42a6914e5b937242c3e878fa5c048f0d7f4e8664e8dc74a97de172dbb7bf2fb71937eb2ddb5f67f1dc6d15a6cf3b079e2035461dd473a8f6503f976e1c795093429a16d28241dee85804513cdc5d79f79103218159d1072005f95c3aaaa3896c5d47e176a14b955a27a4df7d1b17da170fe4cd8694948f8bff51684556f224df55ff5ffe5e8176d23c427ecbd20b5554e2b5a311e94c10988e1581df886a4aa6d4be348e73856eec14fca5f53451b773c5bf46fa82121dd3a4e7992655991de8294940c1d6c68d5d66e3f05cbbe26400d660bb6643ddb28b2e0566ec9d866cd8d25c71086ad784337bf8f3e8ed0711ee9d75368517f3e09b84ee9a20957b8eb61fd7a8dc953901cbdfe3dd58cdd4bac8059da694dcfc4f8fd643ed3ee5898c474e36dd15d55fc92d7146696c75efac53bc828e7c0b5c0b030bfa9212c6f57da9235bd75ac3b058da28670aa992b55f4a0cabee2d3e425d8723535d46d1a96e4536aa8815f0c35cc46f13b7b49e9b62f0335f904262422dc430501a7628b334ed4072f4f5a2ae0da11101ffcb38d3859f5d93bf6dcf146f10f29c4d9013c8cfe7effb14bdcb47bf0265380c24640889538ac37fLine truncated
|
||||
},
|
||||
TestSignatureGenerationSLHSHA2128s{
|
||||
priv: '4f0b94c0e1d8abec0d22ad3f180e514115272ce1ab8252b0608da02659d84732a4bf46d8c3329e2e48594ab7970d1ff0e644e8ac35994f9308049ca1e108ff1e'
|
||||
entropy: 'c02b762bed67adc3a058487df6fabf42'
|
||||
msg: '7ea1563d2d0e4d398028b06f1fab51f69962c6e84f9e916b655aeff9bcd2d811fcbfd1aacfe09515f4e45f73441046fc1b6912f1204d01504c251dc323421edf9bf57f65a86d60ab53e73650efdd91821d133bdab274067c257a182f8be9fc2b354e51'
|
||||
sig: '4cd0a9f80f16724b2261a5a112dce40fab8a0b45e9441fa97faeff4fe559952e4f2f617e70324cf6e2fe2b391b4d2934dd9f29dd9f5db44644127156847df600419f59558820f1c254d2c622ff12e840b36db78ad365c9e1c75db7da389c5ebad22b6b5bc53ae7bf7c96b060ad06b465a139a6c7fb370d28eb965992a9960eb76b3839e78ccc79eb22a934894694dd54dc12ee05ce4baa4c866a30cc39b99f49c28a2eb743a6c4fee178b18192ecb371bcdc303d52322e8ca2e958aa48e5af33e6559ff611917c4e3844770eebf0474ac14b57ee90fc549f99544549e21ecbd8f452982cc1497714cb27f37f7e962d87f796d80563a8249d01f4b3fd750d633cfdc639779219c10699af985dd69b8e88f894562781cf0425ddbbb9b3b762caf582b034cf7ec211a98552e527fce0a1c2393d9d358b0b060cfbd081f44b28ee080330e994d4e529c563bb411e3869554717b6f5c14498945c7bd481255cf94cb18f4023cff0db253062c86cb7db2cfbbe2d9f02db737510ce2e205e849c6ca3f0e4779aa19bec94640b39e066d255cbdc3ecfc3d9229448865c70b039321252329e2a8e1eac60987988763473a133d3c7e452d91f8874edc3967e1f1303a75bda3fc3ed7e57eb3910be2d64515da328f1def59ab62ae722467fda9056c75b958b767d431dbb08e0c23b624912595694e5070da34b8263ad9b3b20618d5a956694c5b9430024393dd319d9d074f74c81d595c302b7c1721f395d51b3208d60ec9f1b655c6f5cb2059defbb94e97964d1980e11d98a8a60c216d91edbd23e585e9d3e36c1171b57ff288836c2a35137dcb0948c38ec37d78c5d0ed084eadbf2b9aafff36cc3bb5737e39b31727068281fb7882a7e843e3b594ce7ba70cfd0c9d539e7b73ffdb80beb7865b20537b428fb00feae7e30cf0017473cef8bc05d874211c76ee528606f018cd29e9b4e5a50bf03708320c96f184cb3b700a009c1c73f8eac9100c46804d33975707248cf1d23cdc91faf56abe6b05df0e7cc3007c6c9515675a6e62d9289fd0ec369b04cab702ab80d63b4360731bdbb78a99bb4d9f5f715fafb79affe98d0375460d7eaca6c8f32bcd4ef82728efe337533593f6c8e152347bd7c4179977d9b1179d61b29778b24c33ba6637940c9a059232b571c3100237f06e39983d7fab30c3d20cbab664d9609ef8e68f9b7c6561af3f131c0fede258a674e151f970acc4b1472f1399d816fe71d2f875add20601a89360c9bba2eb357e919856d82e37e0cb9b192eece4220ac9f91f6fb6da4e84280e10f50f5c7efaa629a30ea5a4095cdc231c3beee5e9162edafca64ee722588d1b45d9516aabd1756fb744a5d7c25222403823293b41f4b42a4c4ee3ce4c4348f8b369d23927cbdfab7c17d1e1724ed29aa2c14330519e4648cf3fdc769f4798bc46b3e9375e6b6b23c05b5562ebe923af33875e9b2990473ff74f45859ebcf9bffd3875b304b7d81b1907d2b2f3a2a3a6c7aaff09f0277b8b41b2175e7485bb04f8505160dac6fd1050b2dd480e5af66524fa079bb62b17be63048394938ed37e0b513ee2acc6edf0692cf9fd60d9ce4262b888ceddd981182c098a4fb60902779ba55481f1d7109698947d2126c28da6cb185b747531f9e8a6bd0c4b89c9ebde25d15cb8cdedba463657ca1ddedc0cfb63499be2afb4879ca86825a043e1904557fae3e60bf1c46b2d8876c383746f7c43369a542dba3c55a6333eeda741d38a4e3826225a6fea94c48b5b73887089437bd766032df7c9a324b1d4c8f6ef96afe9dbb899ba2b638a923656f74098edc95ae2b13c95ac55eb2de0bbb9d054ef0f7cab4142607846c4ee273da1c31e575eb950bb45b29039deb6a428929239c26f514c0944ebad924427bb6098593c4e444b37557d4b582616dceeecf7c48cb32e2c28a61e999c668b5eedbe92ffcbc60c4d915b051f776d27d72e3a8ec232890d7739557388601fdf6d0ceab06e2bb9817b2c0f4799a598f55409a219baa7442a7f6ce1ebbb202cf8acb1f9209c1ee7b2d978a1a73bba36523070bad2eb59bb5108e0917e16a4e0a419f69e3ad1bd9b51d27f904e877a69bddfb91ae46f4bf7e6f36be44c6c99614230dc2e06d587bcede7d275572e12e81747156d84e4f27007fe0de765f2cab8f96a25aafb923d18d0a0a0c8ed26e7bf55b459ba94b454b4333be8b2d151780f2906631119d7bcf11d02709e57864fe6e14412ada64d7a4aee627b8b27721f7cdb4951989d0f81ce7a1d74f71eba2388bde05f5246786e7c429f04f43240bdb5fdcbf2aed4ad73c8f39dd4bec7bdd7f088163b63bcb5a18eb93276ec5b8dfb11bff19e6f333b08668c527b4641038179fd51228533b96c59f01a18ea0861efa41b0f16ea5b2875b7dc9b35f6720432f108305151d301b120bdf15dfa0fef5d918efa7066aa7c247f903abd7d52a76e04ca5bcdfa51a74257e5405db981a0d24ad0f52235104824da4f65bea8c505dc556cc868a0f6e2c0c11c65672a4c638f43a657b15650f0d76cb8d092f78189d613fd803198ccfc8d9c854ebd0249070a0976795bc4dfb61100170a5a052c92e45d83f5205dc2d8290278ea75372bef19d8a11e7800b56aa4a506afb3b3a5b31de87b51b7ab6c032a4582a6804e79c93a640430e7f2f99172084cda7ebf9587ebcf0a48f9285afe7c7eb19179965b9e744d2fceaf82489ffc9890b9337ee5705cfe8438390b4f89c3acab7a1dcadc790c7596685d81146f4b97e0d792e27e31d8debc21d40860213ce46472fa32575e04ae164c1480c7aea047937078ce6f1d743cf6ffe0c5906ac560164a31e97ede4ce95e2e1fd19e9ce1be2ad74f4c38ecbcc92c095deda6fdc8c6541d7d1b2914c219c73f1a09aee6ca2f09e0e00b4268fbbcafdfe5b33c94c7f3e2e2a87cc1c2a5b9bc71806693ff3e65a987ac03056fc08d0518fb18309beeb71243a874d68c6fe3acf34e3f2226a8ad5f3794f78d601081d5e30d547057380994b97e735a384b4ea36708fa9e9db21c45e19e454e53277d4d432be99539c68a23c556b77fcf13c41cb317eaf5fb8827f625074b16f0936d5a4b01e47d14b3fa181642f6c05c4a01fd8d7d3e566200de9dfef341de36892b04af2d071c28ebb79e47ffbb526ac1bd8e66e956e6c953bb71976672792c899b09d64a7121ad9615aa2aa3118a0d1c64fd4f31468b2430d56660dc0c4dc6b50356b18b143fb543afb9ef846d57c6c4d2cc7c6e210586f7bfad5cb245e6618390667af68c2e7214ed86fa25be845b5a819b59f0acb9b80b46e2ea0a7dcee65faae82e0f5f8ab159dcd2a4f1589bb55c8184e954f056fdb3103a1ab512edb4183c2a7667f7425d79118f7d6c8651a32280b0de03849dc14c116641632d851c5899802249147d1f11c0586e5f5bc6e2c06cb76f7b30f8a449f484ed6a2b9163963d5f0b7583d547a22fef7d9ce190fa2a7930c00ebe19690de4109d7d99700a011b8663e582924c3a265f4ff2Line truncated
|
||||
},
|
||||
TestSignatureGenerationSLHSHA2128s{
|
||||
priv: 'f99d60c4ba723d4a81277aa8bdeec37b6fc27624faafef99f6e82256f351fae23d422fcf462f0f4a0df974a7ebcf5b85217fc357d9db5e5fa864d848636b5511'
|
||||
entropy: 'd45c2dcbb823f8db583a4038ca7af794'
|
||||
msg: '90'
|
||||
sig: '721167c73d781f1fb286a71d3bdc90f5620462e5b8a5cad327fcbcc7f3bfd54990e958d000b0a4ddf8323b1fa3c99214db692107cc837eae4b68a873ba80ccd4446e6bf50ab2b2ed1d7d850682a81190e2c39a6ac44dc4b10d63a509f2a1eec3ed370fb539fc0bba96f43be9e4d9abcd62d6e8238c858c9f4babd50fd8a90d3953a70a2fd5b698d9d3655d2f61facab44eb9a4b3a6509bf8f990f0b5163740a066bef43aea368c66ff9508907a9359f131703ba5ced3f1d97a7e506c77be1581c4c26a977eb0e7a2b21570ff87e9b7d38db9fb175a073882c651f59d72246038af0486b29a4d0d452f40faa4585128596f4703e87773a0f6a927b816773bab4c73f0dd75ff0ecca1e482aedd47c7a9fec46e67355483518e77dd6763d8a37257f288cd0b5a1a6cbd723fa7b4abe0f9a1b90c2e9d8de2f5b14a9e810897e4597de74d87c365f5f83e16cfc909cb307cb7d53e6160261d2411d2d8f5368c3c4632e34f84abe9b796ffbe47f40591776bcaf740cb561625ddeeda7d6cc2752e30db798fa6fb28af4fe9f411fe3c3bbfc82d44b6f9f12c47ec89287c4169ebdea3f54506407f5662cc3260091d947b5fa1717e32c796588d4056094f0a769d4f273bdebe3dc25438336b62c71ba13bb1383a0886b04fdf3d50e071dc2375488dfa0fbddb5b1cb436bf661bb36ba8837759e050dddfaa63b9c1b2d090ea37dede65d2b5b9bc122ef03e66c9de057a8b0d25db939fcb2e9a3b7a97904463ea38c40eff639cbb981a4257d2a4360fdf183cf21b6d05630567062384d8959ff6b09f9857c0f0ddf7454ec8b26153167e4fcdde265537f0ac6e76b1936c9e6ab5362f91774bef8c761e4ea5d5cf5455d65fb19a5ae5fcc12f65d955bd499f94362d4c71e32d4e57f9f8c44c6de0fda06e68a17569043c8b7b0a15d820bf8ac395e6a4056efc009eda486d1480100e5458cb68dedcbfdd1577294a4877924b92b0580539c75b0ef0c6f8494bdd38b5df5f07e02c9ffe5eea2906f162565648d3b9cf9b8e0e509338c5d26db51b82adb5a14f471b67893227b0ba8c676dcabcde257c8e1def9b973647ba00218f428068df4c826c00327d5258a5e5702861d2ffc8e7fbb71e2f0b9989646898d3ae61d07e475803c822a1a697d90d9dd318176483af171ad5a855e80a4125fc3648b0bc6efbcc63fca1a77d9461747d636545e1ad4c5b980ff6729b53cd249ee3dd47cefa8c7dd315d242a54578f57f9db9d98855eb1542c0178265d9e88af5b09e3de037a98d9900c45b81735c6fe830441d934d3d10b22e2ab678d8710030df5385e0dfccc9c8dd3a0c3d59f9ef55f2be1619810b6b7e1b63ceedc37f82bb40847f42bc85836dcda3dfa29346620b69b69e00878b300e5cd7953f83259ded343c4ae87e595666196d6e33e256befcb47257bb9f238470ea31b1c18ca2b26857de2721631d3cab03a4a0318ae1587de019b213a9716cb605a4720abc2440de2c5434c720ef42c3a0f4545c80d3cb9af6340b1c8e1b63b8f82af671324a3dc34120e1fe10551e2a8f96e03164c149dddedbe7ed3deb1a5529db6dff4e6d911870b870cfffc484ab342f3288750f6a26cd825395689b7b6e0c7f3d09c0ae98150889ad495bfdc010e5f8d6245f72ce3ab9c04978bba485f2bed6fa480aa0ac3467d7cf3ed5bf9539a8f5b37a56a669587efc97fbb5661f1405f43d4d761a65f626c51af4fed5a7965368285e81b2427ec59d6f29bd982119fdbe9075aefa2b57111a9ce78e7a8d5b23a28408f55d0d00cc09a0bcb4b7ed15d954ddc1dff10ef676959a9f5d8322d99f6ac744161ddcd52b03f492857654954f465b3810e260c6d24032eed7f542992c6d61639095bc9542e93387036b7a4e7e002a45650127e3ba1724252f596aeff2e794e985cc34bdd1a9b5824f31ebf37a55addb0c1c9007828d19a9d7c7c38a1ae87bd7ecbd6706e1abbd69578e2c8cde5e7b55d1ed7bad2de45fed6d159d83c8a2d7fc7cd131a822e3311fce7ed99b5ce216dcdd16dcd0d68da8c1714b0fe8a8c8e052bd8a77032a9964d7bcf10c56dfb6f21d37fd3fd56252d0a59a99ca3caf80049d2122534e21fb991b6b3223155df56d6cb44c6c1dfb8fe41c26597f7bbff29de83531384d4902ec51d728cb9f78d1fb0d06398b8b51369d1c4509be4bcc0752f5b3dc495ac0275a85d63318e58d640d9402141664f0ccffc28f1ca8acf76460948ad1920a7ddcc86f8696efaa82ba4d0b6ef0adfb285af7b8935b1f7ce74728c310cd703afa568d50b42360adcf75aea0db1a6eb538d1a35c88ee0dbf5f574bbe66b4eb170d76bbff29d909c8486cf908f9759fa11aba4db27cc0f0884efe36e40c3f31c81c41e9722ead897c7c446d329bdd8e1356a5f4f1e0dcfaeeb8968fc4d7fa8f2249e0ae4c6a8379f367ac486cf5b14e665b5c44c14c739a699b9dcc0d7c605c33f6afec76645d93b5c8490ab6701a3fabacb59d0abad306f8ad7f255b3b5c9e8c6e8d9aee4773511b459707173f04db9cb996a3b32d421cef7fa3f8b70c31eb58acabd708435f3f4218de33a0d3a0b4a6f1be83e1aed637c00ae1e15b1e65b680be3394beeb67a91275fb5b7f8c27d89dd7317c43c33a993047d41a1591f9ca329fefb7f47614fb502179e4ece8698a9f7b97e5419635f989e12a07ee5aa78ab61854bdfe135aae21b15ba5ed668374dcc493cf96189193d4a822290947a87df55aa0c5d4dc63aff3d6ebd948aceae5d7cac3df23d91a1431bc04b9ead7d8ac8817e51a999d799622736e52746fb0ab4ff102a3960782abf3c68f89de58e6c67c63e20038e4ef2ff12c251f8eba19cd1c59b8475af01c4196d5ba1935df59b4ab01693394befee6f8e86eabdacc0a4cc164776f27fc6a59547c567020e2a03eb37226d575aaabdb8e929a4ce8eab531bbca97a110f8cb8a17c23c8a5a8ad06602ac9aaaec3413eee33ee2a0889e87b7e3286f9bfb03d107ef67f4f6045beb348046b2f259290b24e9128153bc7c017d2d0eda453b3e9261da64c0da7ab92231aa49fda4c70e3367a4f75e1d3ffae6ee1a0796288ffacf3732b9dabbbc5dfe85af8f498779f4deccd5e3646d7107c461c7ee6f214f4f495fcdbe560ba3a50624b68210e8716e5fe0d53d4d3fa467a10d1ecd8fa6a36e6ceb7a2fd44cd432b3c5369b807e6dd8707eeb7fe648c0f57b0b3255bf1349f0603b04a37e70a689e77c858abf9338fb6ee853edefd398bea095eb08cda4e84d5bba785fe4739e5c34c64f006030cc103da948a40d6bd70358173329d8ef54a6f7d7c13bfb568ad5ef5cc36bc4c0ab36b621682718a06936d161268353447817aba388621a1922fc3b054e13f6d28e3b6ca9515c56b87cdaf9959cea061416ca5404f58bb1fb303eab83dc9ca91e7043866676a3ff752c85d51c6006b1fa81cf8268ed4ce663a4432e5e590952df1a36a004fe9913ae26bc2694c6b2fcf107f6e7cfd5bd5c842bea600e72f1113a17df5a9Line truncated
|
||||
},
|
||||
TestSignatureGenerationSLHSHA2128s{
|
||||
priv: '2174e8f49dab2ab631e641a5406fd710f772a575d2746c9c9b7a2b4217441f88bf830dd8d578bd710316bf443cca3f48e4e056030eaad73bdef022c2a0291fd3'
|
||||
entropy: '10bc13cc39a3d35de53c309a6ad1902c'
|
||||
msg: '7f47df895ab1a0a777ab84002eef5844bcffb413dabe8fd6fc0027721be348207a59316f89dc88d587c3b22d8227b659595d898890516ab0b66966e387286a2ad90627e448b1a246884465456f463f63e3ae9b860e2127a23e7a202b221019ed082173c28a9907f4e398a9b7f4a82ad79488f4a116734c4cc9b2'
|
||||
sig: 'a8984197d241f76ccd039b1b46f431c4e5eca7e66136969fc716800ee969d8c1bf081942c52685f8b7c7aca9e49784c6f5fa6505fc42c8c34317bece5f3e41d0f982a86cd4f4baf78e1310159e14be4d0c389d436a7e4e18fc4bb45b8a5dfe1703a6578b355f4aa9c944eb851641e317abc56313c52718f186c80ca556423b1bcf717d6a83916984b4af05fb06d0c4736fda2f77090b78ed0eb1e2f49a1fca63ef4e5c7c660e8f10b3069ba6711367a9ca1f2eef7df2d72b1fd3e4ca9af2c05908fdad72cdebfca97c4bbd52b4692c081d6847da7d4f60d04c8736c71071b27c4e2498f32c3bb5b0854f5f9e9026ccb92006c8ea93e669a6d4c1306fca05c7c452477c611d22fdd2ffce7e4b268408115b6c798332f8670ca919fce94a98114a2d9b6698ce278aa12a9f6df77272f4bd2513c07501ac4ae5b22a21fe0fd8f382ce3d730c760c07ed54bbc442918235631c03986943f2505d43344fae5a0b77dcb341ff786f9ed79ea4cd5522d106292606e72780c479fb809d36000fbd4d23c975f244b843b354021cda8da38152113f873f97d37572da67c7d11a5d8ad3cf14a9cc33c4cf0e7074c1616872b9a1c0a30b8b92193d4fb773dfb79f8ac3a07ed1375d314d67c5b4b14ad07dc33ec824c11308bf44f9f7c2d9a58258e791bf7e5eeb7bec6cf87236297350f0a82925c78e968c30a226c352145c4cf07f8f01afbfe2e08886c9c59f6e4cbb47d037dea6e797da1c08126a1e04989c2e2fba4535c5b2e216fbe25028be66e4fab88309b69e0a89a44dc4ad303b85ba0488b7a8a7047521923b5a43c4cee1c2dbf22fdcf6563ccfd1726f7be30263f29a352c97ce34a8b3c407247d5dc20afa09ac48846d4ecea7a576b123c47a43733dca5ab5580843b2c3acb5dff6b571a795ce91c81c1f8b32e96c58f2142fc20c49a4d06a24ea22722e920088c08ac1ae1ff5f68c86b0b4849fa7f26396986407f1e2a7e2413baabc668ffaa0a7bd8ca896a2e68bb1bc43e7303ec8ce139481d0f837056ce6319b85001383a7cdbfeb76f3b5ad33af6869ac76b4978dc0f344bd68dc6dfbfd0a2014b2465683f77d9f420c74ef494b2c45c8f0bdea96b905a00790c9dd0037a28277aa9cd3dc758f23c7a62c6b430280630eae17156c1689d8999e4870ab2411ed8913235b7fd8bc4e8352b479c31bd24ca7792613c69b633d39afc8315b119973e4b7f7ba5c7553558b9a2955d9ed3a4b2db98f24e172f5861ed09e954d5f7e29e95947dbdece7e66550254074b6b57cea15e112e34035e0c4eeeb95ec8aec4ab4798b78e85b1483fc4361f3b2f0224f92ae8290fab399ac57371c2efce91d4259005a2f754fdf05c5452a367bb55f6f6b95a5ad6e841e0c440cdaf7c96d3dfabcf7513dadcb35f97507aee6e3dc3164635a1f9419314213e49db449636add74807eb5a2ebe89017a45ac770c0b4a771e0e5111be8b42157639f8962be298286a32afab63a2e66d43135fd242629b0f2bed9bd4869f702a3aac886669f384042195e14acb6cf138d0c00a3c8117b912ad268bd9fb98bb9f1ae6ce4dca3162ca8912bd4e5ab831e6468fb0de0979b3c2a422315dcd3e8c48657ec4de8090ac9afce3c374941f7c605d035200be9de0fde80fd483dcc8c39e476e7e8d37a8ea9b4b27673b2ea9fc87b39840c21ae66a944fa8f18b5d9c6c4a00e71109338e6ad66cb1412ec1cb0fc37f18d18e6925b854b0ac782d7c51329d07a5efef9c386823cf6ff4efe93c32f4ad22d82f576f66b6ba1438ebdb39a0b725036668b5bd2309590e5ae1b668dc4f173718a6f9488f04953767901da17a2405b76fa6cfca982ee101f7f9a77d59dd807c7ae6fecc9c819d744b8f0183cd7a3b40ee6dd31bdccfe2f92459a6f0c0786db3be03e201ef6fd7cc9b637e2cae81c21a9fc58672f960f6c926180b09f510ae732a84c399bb3fee7b443cb54e54e64739aa9846952090f4460d1d2020acee02abe63ffea127a46cb080508b46d70391460084c504241ea2d6c0bec047a05b0a76db5b649b9317f1b6496448817d0c1b7d49fa6d9a856f938b09c8cde6ecd4ff7495c083d950a49139b68ae8fe6507b8e0f32dcb6b9aa47b16ab61e61ce403867f623ec39ea454f54db1496c815482af51af3624dfec6ac6b32f7ca3a2f772ca32965012bcc6e151537f1201d616403ffbdcc768bb1dc9111ba49226d7a715b6706373ecc97332ad8445f032c2258bb46b37a18cadbb8a5f693189396d84b14d6ab0c301030a1836924a34b6ba0ddb4a208006530fb2bdd1b0f935f90d745a2dd44061c074950f97e507b51a9f8117259dae0f9e7dd6a347699a641549284f7fd7437b44bc88f7489a669b1d40b715a57b1c3f05aafa6e3fc0b3e89644485746fa062426f440c59e1bf73fd6dcd24864c3ab7424d274c4b934a8be6d75a8853b40a71e7490b9c07ca24ded6d36ba133db21695426fec2ca62fcb0cb9ebd1e82d2334573614fb8ba0bdf65529320594428d3fae5b8cc782d625e563b79b495355f8623edd188390a89956332e38c9e46143b23c2eb40f763d76595a4bf69f3e3e0916743879d1464ac0aae0f7f4632db115a4d9a55d24067ade2e0fd2857cf3bf54560de9d136e792a0213391ac6f3f2a51570e43c1b3ef99383f48b554457ef41238df05cf8d38acd409afc33a25fd8052a6a0ff42b9453a98beab21673f1ab164434e15c86161dbfc291fa18473ccc7a76aca41fd0fde8f4daa05a5f130a5a5f7625bb01758441007db787b06533e96e54cd9387a67138da2558eb24bd46d48f2d8d0c716a1661630b97fe66d90ba2ef5fb51f66479b13416d72159e2ac9710e524f4fac024a3e78bb80ae6f0dfff17e1e923592009eee2c783c0d919d81c61beb64aff71d0cdffe7cd47a1f61a3e051a93e45f816ef9cb9bfb48719d9b5b65f22bdc130a6554bcf6f6f63feb7506e1be2ca0c2af9d14a2a1b405b3ca8da00578903b1410886c297633fce57d7d8b0ddb68dfbdbda6776741588344d62fd4e371a4e755f6d9e7e4226b919bf1df92354d34418f83c0600dc19d55920788e774ee6b98e2f0427b2ed428daf4cdfee920eb33c870d71f1dddf3262b8142c3cbf520f8e10e46106d1d3239a95ec322c0a2bf03f75e0190d6ae5f0bf24e8fb92d8a538110d67d1a024314f2233a81c242923b5c78bb91fbca44fbfac304d47f144e07bce81404d320486ba0e2161389cb973565605e02c3705023f370be9fa4e505915bc97e68dfa80d21b783cb574c12c37e2fc55e68b825970c6ba5c7fd012194ff7bec9a8660dcb4dfd60f123354c129004e050795114d09827c3a0c264dc2f1959c927a071ea4b66cf71b140195de1f94b2f09d585a295afa201903014ee5618a6d1a755a973c899667ac6976c47e6286acb94f9914cf734cb1ff3d93304f6c103ebceede3698eb13c982ffb914ebf0ea84eeadb7a12e15b85ff756d8301a378ce571f15743f0a5f3382e0fe0ee67cd2c94804e3Line truncated
|
||||
},
|
||||
TestSignatureGenerationSLHSHA2128s{
|
||||
priv: 'be4bfeaaf8e4fbe9bdc93b44d621380a48090ab3599d40d3bcbcfb50c0564d7b48f8846d7ba5fa5ef49151563e84bce614b947b2be7565f4fcf7ad7a5ee899f9'
|
||||
entropy: 'df096f9d0302657c0f9b6974b80c59eb'
|
||||
msg: 'eb29cb0687183747a27d51778eb7282fd52778778ea810131092cc90e4e3500d348908e88622a237c28d5309f70c7b895a2027262f6d94f4125129294ff9d4f6'
|
||||
sig: '387364e440c43f36d5cbecf78ddfa7f1bd52bb3e8106ef942388825b5190e0e7765a83bb807c7b098b5ea4b1dd21e23c6181c8ba82101906d3856dad4bfa62e816b011c3c58337fe8bc680d6f5f5031f032843ac9abad7c0796245e3748755e9aa513788b7479373f8f2d9d370614cc537a594be1fa4dd1a64b70721c4fd1134b1ba87a064cb291818dbe9b3f6a19d2c5fd1b24c88124a11a9889d7d760a399822825b5167a5ed5fd47c0622977fac96dbbb9079e5b0a646fb67b9791e881dd99a26b8339d9fa001362f9c97c9a3b860d59ffc9ab7375b73b717109e03f187da9ef005630763ce06bc0d18aa2da00eeea4940567c93c2b7230f55590259001d8d9f94d87e1a6fc0fa7cc76e4959bea5b451be66dcbefca49e21813776f3345dda3d8269a3e68a622204fb3ffe362f95ad0f5bbf18b375306f141d44a70c9b5f95120ce6fad4765955f5dd2e0716bfed79007b28b447019f22f981b3e737c1be4a230ccdb897cfe2b2d282faa91387680247f72b5a091736a0ed87168ed71e5ce0b7021674eb9c203795d04d5ba44cd19ef32060fa085308e939a83b2cf00e5db18ddcf205e95a4e48d350e26d97e7777aadb85eb78b5006b6e829ad2dcde0a0a101739871db2fd3036d0c77c247fc1c726b8826019dcd804721e7304f4d2858f5d2f29f87452693e14a6b9df27097bb5f5bd29b54814ad0d80e3cb0d0fedf3fe42cf584c1c3d986c8929081b5fa06996dccef67f93c62ccc9ae57f2be204d2b04d2f326cd8dd97c1ef351cd101312cd23f964884f7c79f8053aa9cdaa95c0990403474f7a76f02aa61e2cd0252a8bab84cb4fb8397320882737e8771d408879b032a44b8562ab41d646781ac1cf5596f5c29e5d4650eac1cbcae551874afa2d46c143572f3e7e826c0d2b6ab249bf3777570c802c881aa80c5de9b06d7bb9c87bf2bd12e82f806bae57f32f8bed88562da4d5a4c48cc9950390e95b508faff7543673e624ed438c9b4eb8a2a055478f79d98edc1b942156a14cd0ce4d0d049123407306175bafe3f6b1622c8423cbd31cc46e135ae75d61b0b74024444af8dc1680c9c8f511d5598ec92d0c2b40ec462f5482358f4b803c1e2e77d2e1d6dafa440e23800be4cdfd10568c0d9a4e2fde113f31d495b0e8b0eaa815874352a3447f74ac1134d49f158d8cd86f9a055d700ab8fcaccfc82ecff216ebabee300fcbfa73e3452e1d051ba012f7dda395836f70feb87931e5c90125defc399349ae9a4103c3a85a9fa79a38bf8bda98c90e27712b6b67ed991a47b95bf33e0ccc0b7b4d5ac404b917907f55649f7f6cb3cc7f1335471d1489ba40e30311b22e1744e4fb92e68b2daab4e728d26c995eac88b5e95e3b8605d3ef2e71773c02128f8b2c9b055aa204e6dba68a31e08ec4d9c8b149aac139e60783ba51dbfd16738a9f9f54529f260df6d749cef03b008c08f76d11dd8d00f7232bfd2bc22932cc6b0f88bddbbea13291bfd9614fe6f051ebf9d295ba09df2b03d9a040e771f0ebdf205340e334cc3d3d40ba546383700b4688934150d9c6affa5e6ecaa6ef9846ade386bd571ff180583dbdb13d633096b0d20bbf51ea5fa9a98d9d83f3685f87e78d684dc8dddf2250b917eb4e046bc81e46296ff12375f2e3d7f7beaa120108090862d145f05cbc9bd52c71a204032eb8754ceb6531ff077cad16dc955bb9cc6644f308c48be48e22b84a93215c27301fb459fc704a077c81af05e2a0d3e946b2b6e15b56b1e7718fcfb00b317f6d7c345143322c32fd2ce79e421629d2117accae16af5322f90e22c3931f8d6192890c75f7aa51e990746313d3f97f38fbaeed0e00d48cec9ec722c5332b19ef46f0626b6f03ca15d60b06d041c7b39f5f2d1eb90a0ef8f6d8ac066e49e5d5bb04263dfed241aa9e0e623b1f08d33cb22ddc31c889747eed19c0bc5300cad7ea713dd50cdae0c1ed8709051a0d044b42a9e7e6cb43e0700ef7687d0fbcd704fcd879fe1f3de894ac5d0dc48e5b2040c88a7d424011dcce91b97348d80479de6caa80ff8a6f1b426bb03e619a039f04c21fce746e31cfd4fc905b024acb5857eec432c66603be796f074799e74f7d953b034e837d6aa2d72dce7827d32fa02b04b9cb5215e7f0c67f64fa55e63f3bc58607cfad3bb0892482b9afe4c13d73076dbfed0fdb2a575a9b1b10d4bcde9fceb30a76706ee39ae9f9ce58ddd1bbbc52c0b10b2116b9df3563c441e991cb49911eb244dcc1c675ee6ac23196b5af91be2b852b6e1c62c158266f5b22fe6e8019cd5c780c89319c45df8ecb049e6fbe6ff9ae3a801c3e15c5848c5d275ebbefa57cbdd96740e857c3a2a173290f7c71dfadc95da4a5c45645919dd0c8b1e20438e6cfb912569845cf2b0270d65949a09e0752a06d42e96d73e1c96b63153f28f04dbcc509779f5c4ce0d88833ca9690e73f8a2b16dbd37f0a5d63cd175befcced3bb6541e844df1172d2ba2b4297ef76f9f01ddb58f2fbf073ea22ff543ff9dffdd1bb419acb5f0d7f739f8f717f84a02a3f03750324bc30e4ecda5acdf53bc77d8d21fe5290fce64994a45c80bf5631880a303586c817de84282d1d8ff596aa95e51740f1c46e877badf7085687cd362d27e52ab57303c831813dfc03f87dee3c344eddba2dc663c517603da2d21ef66a39e6be054f511de6a69e4306ae10baa0ddb57aa626561fb1f9521b12d92f75782ec119dc41e82f60c8b6199c31db4f6aafb36d9196254a3856edcf8d38ab4fd17f091344ccc22520802a1cfcd485ac0a4f6a6489f98672857cc8343c25a7a6dc7fc8bf41df905aec371c06092a06c86c41c6e784495a339858213f83ccf2b635f9839cd128444fa8bf766c7c1d3ca486e5d7d74a038959a87884e21e12417d64a68f695940a6a89d95fa5371c44d9a86baecff1c98d83040fd8e1e7a5a97c46b1219b1d7e9225cfa26279e2b5ec7552618769d1213ba0920b69557fa57d9affebcd74cd2f11c2c5b9215eedf03214d213426037d83d447ae3f01929246bb8d25578c63c3c190eade26db6983032d3b56617d90aeea2dbfa635d1311f7ae5d633a686fcd8d0ffe765ae7cb486d384b60b3d3da8e561d4bf75c3976c0bdac0aac0fa78ba0be27da88d87337ea0692e0de95e74124b328a50e8eb2c923f4c5b869d2e5e1ddeaf6c053c1be94f7a24e0ddc59fd3664da4436c940a06ba8bf95af9dc31c67efea7f6c42c18ca40088e3210462b4a1d9e5353d4d39e01e5692abf5ce6a2ed086c187313d1c5888ae874f310ea297c6cc45367cb2634326f30023cf3f0fd4e015c09f9f69dcadda7d7e44ae567cfeff06dc5bdcf0fcee74c7cd3cda20a80b83471e91af53f85c793a130dae12cb583eef5ca18e761e2a894a904e5efeb7bfaf7519a8f267572e44a048165d2cfc8ef1cbf072a697e926d3cbc9877fbcff72ef3ab8c9ed5743d1706297bef5208ec5addac92ddf29e89a0a02e6d29954cbfce9da9a676e33abd3606f2bbf387d9e6232afLine truncated
|
||||
},
|
||||
TestSignatureGenerationSLHSHA2128s{
|
||||
priv: '03d3b1c80c61d8f13ffa8ab1f2515d2071c4afd7d2b91d979cf8f4b6dd907ef2a0985f04c61e90ef3af41d6fbba798d070b5f35f53599f764ad53121ae24da8d'
|
||||
entropy: '426827d1935bb4642b404799bafc62d6'
|
||||
msg: 'f724'
|
||||
sig: '0cae4b13c588d34cade7c04001dbd9aba9eaba67004cdd551aa1d0eeeaa36d8a2a35b9864564d85079654a9b75951401f482512e9c9e8aa16755bb80868e2a77511a5b14f4c244b928de487dcd03a1458e4dae9e74ca65f71999ad4c24b0100ce5e30a7a1637688af010a5af1537f87dedae85987f9cceb8bb259ac64f90d5113eb0fe8c996655e5223b03072b73cb38052ae7ec098f800c654b7731e99c543af8da0734bfa3c59653f6dd82b585a93e7aeb8051f7b237774d4b5ec57de9c1938d0f99bf56b9d49b745d1864bd0942a6b5c99c5d3f8c74829e2f9d1b69b7143a2b18a7d4fdb31013a611d6a0aa56fc7ff49eb36f70531e122bf14aeed11adf09af727cfc95d2046cd5e146b1aa2c50c092104617a059c47b1333513b0af66693b3bbb326ca7851d02809e8a72ca54bbc4f10b3ae2a6f34146523fa48dab754c989ca18b21560b52997c0a96928f181c14f0f2437f1eac007fc6215951a453348c3268066538f66ab0bfc6d1c1dfa775e4f04819bedc7086b988e1d2a09b23c54956a59ca7849183709f6f58643aab0f8d96b693e002f5b7c6bc1b2edce760e38da74da1fbf9c701931fe68edda80952dd485bae8af84cfc55b19c24cd3eeebb909758431696148f146ff92bbf11a28ff3669bae04a679daf30cd35b01cff31ab604f2c0e6c8e1ed1a5056545e1b572a633f800e63a2154bab816cb4115f8885a51b965166e71a3a5bf5bc0c38c297941b8ab1b178835da471154abbbf6cc1087dcb9bfd6b58c9c488582747be517756512f06e835d385871551b1bca7ef87c350a56600b6012e7fa2539f4135d855f391bf1c253540c313e479ce4fc3242a319b525d074aceead3d09c0af366f614284dd5b577a2d0a3e2f527426394a53a756c395ca167b8d4e288e4b70ddd04ea26e39f2da35a9ea7e52fb037b7c8ed5808504e6e99c9f6862b73696e8ab1aaa1cf3742701ebe2f3cbfd4b488f32134088b894a6cfcce94f4a39b963b56f6b08a5f68eb9f95e94ace2ed6eb2f4e94f57b2d42ef9ce917432cb19da8c58bd02d9e37548a3003f7d0850b4478128e68fbc0895ccf45b79e5aaeccfaaf9ab308f46e2bd7e578aa52c27f2fe8587105ff0e4a651af8c53a6f945106f7155d9597d992b0316ed677ec19427f147b6e49fbe4ef897ea723469fe39267e5649cc4808cb98e462e6f0a7061f9029dcbbe9a6787f4909fad4099af4782892673604762c84608810ab18577af16d4988d12b2d9cc0903a49e834312f7f31f2e45f8c2dc1efc5166f304cd8ec9be956a576d64f1d19eee4ec202428e348c45d678546dbbf5da4822384c3a6155f4b63228a9cbefede298aafee33e7671607a567c7694a368c8c3ccfc5d19cd98979038ca75ceff52d18e19451ab53c0f5c9d071132321db21b05e9ec19d78ee2c309489a1ec5b7544a2d9ad38a3d8c3bc49235ed189d7fe446059ec2de889ab9da38dd63c5a3297cf92a2f366e91856e221e1063cb0d36241f1d5e990ed32d37d9186d14a9fc595ec039ef369d3a91cfa67e6017abf2301b7c53b6c4bf9f8731de8656feffaf8f006c0b5a0ee7b6d2cb74a90de6bec0a005bea3d17a39b0a9d25b3bedfd99ab5bec4d8c0577df04f8f67a1eb1cd8f329bd225ab9404cd8237f5a296fded520ba3fa42ab81b2399d74f9df40e49c8e3dc1e4d0ddbab27df8704d8d56ec8879290f51765b7dd98d5984ba836a5272528c87af5b1623028bc74908cddc50ec0277126a3be2f8d2f0eb25f642a69ae629d4099eb6ecc8f748b320f877b82ec51d48deb697354597dbb3b0355b5f80074296482ec9ac7f99241d605164f5cb092ecaf6009c040abaa65768f2379b017e33ee0696709c0e05a18cb98f93146712e9b4853c4b927afdbd3992cf61c295399ce695ec92aca20de145f2ee2503fd9a2fb264f5d941468800e5c402c6cca6de5d6f076a950497c971ab03aca63a2f3ef38e0a98a732f6630875e86f09d2b92a63bd37ae1315370b3ab562412fcdd2bb82d043993941cde9550b74cbd875f13d82fac9c0222d38bebd43a44744c9cb3e048f18bdd3f2e03ce2b8909187273a8839cda5ee6a3e313a780bc18f6a0e530e1f9a807c8d9b683161f1c4aa03f17271457929310229c26373bdd795e38a2b46bb26d8e68937205fd6d34f296814f1665ced940adad52617097b6e985a6483719f4f7f357c48e861eff3047258bb8ffa0994579024286a84f3339e219254e8ac2cf3596de2f7f2c2a6425a33ff1895540c8ef6da47685eba9934ed4fd01b4c1a5e9db467a6048f304fce11cb0dcc6eb24af7b339f4b2cefc10b9c67c84e09309728cc4c5a27a489878e9273581067f91e576a7bc591723629e553e840f22db62fc55632e36d100972f070793686d84d22600e58f19804a239945dd9ad889fdff17ec60da20ee67e8fb25dc156ba1c9b5f97f28e02a0ee2d226d05ebe639836150976541c35673e8d10871ac1b698baf196d1ce4e0b17c9bbe03edc36df15b35c45a910f6c0c13b4df18a410362142929b118a5336d265868333fb83129f150ec255776f7a44400b1f26ce4286e74280e29672008bac856f540e6b5ceb79787536204818d495fba01707e69511caef1bcea2a3d68f327ebca006d693df1411c71bfffc6fc40ea82b5a56d4eb1618e15026d695ab5b21dee3b3446cb19271da057d321a5e7b28de9d53611d2e4834d1a658e5254e65e1070715517c16b0e0e48569bb322601a03fa04e0b83f102a5c3bb149de3cc214c559ac355ad1820d9e97c340c266cddebf0b6f0436d9bd3bfb785c0880f78ee6ec62909aa51ebd8eb8cb38f632b16b3ec8e5f41c43c06696a12f6ed759cae698dba6476678d7cee2e9ebe2efeb62f8ca107dd092c93b19af137e20bba7beb6b9daead8bd3ae8d347ad56f28b654362416aa217478e7938239694fd2d554549b405cbf236bae8b54946b675f85e1fb81b2c87ad6c1f0f1721b2a2035b4aef844760bb916d0fa633a85b64122780790da87cb597c841861c22841c05c6f059d9f661cdbe01412bfaa78864288f9401e6582469a737693dfa41233394ea1f95eb1168d956515b01715bc5901c457cebfd114b8cf25a1af8c8bc843fc26da374e08f71edb0f97812c014fb17d56dc436753ab0e37b4dc8261bc6e9ae4d9770fb36a9d1303271824cb55e4be303387f898855bcd7d8ac82136ca83e55d973cb1a3d118e33ae09844e0270b8f4f088d3345dbbab54466d00ff52c875783b9443bc0a56420f6e0e15be7fcf4af4873959d7e0c022c11c1bcdac4d93aae6c80af2518c9d88bd0837df4d4cfb68d237f602855707a0b198b4474986d54a2cecdc6821ea2393f787de975c3081364641d19db819e9fe5b351757964761666bd6e191be0dc1734fea2830f670f2b25af9282991e49795f1835dd063d2ccdfe4ace5e2227b0a357a67afd0a97fd0bf1fb7d13a83814a9f05bd648056a415f2ecc1dbd33265a52ac619bd54768061fd773e98e3142cLine truncated
|
||||
},
|
||||
]
|
||||
@@ -0,0 +1,94 @@
|
||||
// Copyright (c) blackshirt. All rights reserved.
|
||||
// Use of this source code is governed by an MIT license
|
||||
// that can be found in the LICENSE file.
|
||||
// vtest build: has_modern_openssl?
|
||||
module slhdsa
|
||||
|
||||
import encoding.hex
|
||||
|
||||
struct TestSignatureVerifySLHSHA2128s {
|
||||
pbk string
|
||||
msg string
|
||||
sig string
|
||||
valid bool
|
||||
}
|
||||
|
||||
fn test_slh128s_signature_verification_from_samples() ! {
|
||||
for idx, item in samples_slh128s_signature_verified {
|
||||
pbk := hex.decode(item.pbk)!
|
||||
msg := hex.decode(item.msg)!
|
||||
sig := hex.decode(item.sig)!
|
||||
|
||||
// create public key
|
||||
mut pbkey := PublicKey.from_bytes(pbk, .sha2_128s)!
|
||||
// for testing, set encoding option into 0
|
||||
opt := SignerOpts{
|
||||
encoding: 0
|
||||
}
|
||||
valid := pbkey.verify(sig, msg, opt)!
|
||||
assert valid == item.valid
|
||||
|
||||
pbkey.free()
|
||||
}
|
||||
}
|
||||
|
||||
// This samples of data was copied and adapted into V from BoringSSL signature verification test located at
|
||||
// https://boringssl.googlesource.com/boringssl.git/+/chromium-stable/crypto/slhdsa/slhdsa_sigver.txt
|
||||
// Its only availables for sha2_128s
|
||||
const samples_slh128s_signature_verified = [
|
||||
TestSignatureVerifySLHSHA2128s{
|
||||
pbk: '9c0b487a467b79234031eed3569055ffea884d68408b0f7a960ecdde04f6aa2a'
|
||||
msg: '1b9dcd809ca93f5192af4f8ca9e2ae0b3221325279709d9d24169a2ef98a604a54ba8b006e272bd32a2ff703736b4503b9c48b93a94fa3a79d3ca8c77c69818ab2c2f8'
|
||||
sig: 'efe10647796960ab92a3602a3d8451c2124bae8daec699d92b8bb752145fbcca3802b82f5eea1c8e961530d202380628f7ca05378713e28cec298b9e65e813df4d1a67740d92e5207aa42ee73b55c72ecf5192076c270550cc5066d45c95f07a0eeaca5b63456313c6e2ba616b23742bb741c77cc7197112788bbc43a411a3629bb809ca65277971da730f9b5b2208e2e957b1364411edf606179b34d087d6e689b06fc3b23a4a6fec1d84556ca0031b7bd4f6f626bfa515b5faf567a2f94974e9253c040718223132e6460b30dbb57d74e3f82fb537cbdde882273d1c9151ee2ca5518129f85fa64679eb8021d67503a7a26750d7258f9ac093ffdb53691afef05de62c95a7e6076eb4d9727aa1ac9b9f647b33fc7102e037ebd3f006b5f479e532a882211119aa75686b5a0f4e078324cc2aad5260c54f869c8a3c01391e42635637cd9479f1f8a1b19908891b72400927220c72c3c5153c62942c9e8f5ea2044dd62596ef026fe2a56238813a5af175506c99a25a1950efd60544d24501d09865315621f9b1219841c1f00f5b06ee0d60ae54364c43c7ed714c7099380224c73d6239ad98b3277b60aead1ab205dcfb0360d4d0b7d4c0befacc69ca46bc34ec899c74f386b11bc37be5a1b8e4c7e04cc86d04c2c3983a68fa54fb6aed7e2eae6dcb1acb36632fd6159eae655b32d0529dfd8ecf0fa9d2439b4626a17bdfa9af5b87f49e973bf3b26c94008b90e185c2a0f1127432d5114fd34a7f70e6e1f9bb948b48d864d3cc6fdd3ceab0f063f25ec9cb531b0fef1a66e6b5c44fdad40ba550f2c7a9fa466a508cfb30296c149c4548de282a792727b0900575e9e66e95507eb3a569793092a89e42ad3d658db15d330f04acc194edc7dec7f90736ed851b27a84dfe444bdfcba288eb79f9a0599eb4fb622fc2748770470d22e1990b4d4f4b1212cd5915ccb31eaca7a5d43220d3a41b67ed4af68f165587274e7d88512f88b491dae5cf88e4cd9f39e490f508bbbc60b9127985da654f0d7211443ff44b9a40298daca5ce768b86cbbd9dde9b33f149f5b276cfd24c94fe75e8a4ccab822b1d28e76e38e763044ff8a8a2b5602692b86b1c012f261637ff304473ab10a223a03b19d09eb434f57c3a9d07f5b29265d26c48c7cf14684cd08862dc26eac370217ab0979ad709ff94eaf2961d93532e82d6f70f7becb79f6a43006cca20396c21a180637382bbe4c4429c8a2c9b4482615249f3cc5035fde868a7a9a9b6e943cb00d1c93f11baee2dbe1b9c7f37f27b0062c78c000ce09790bb65856b1d77812943ed0b65fd8b19d83a87223a01aa686462976fa655450b52efedfd7f6dcf7de329650503a7258ef8042951feb36d09be408aa6a659ae2cc0f876503e4ab8bfc5ad10f92ccd34ada5a46bfd3e5c1ec16622accec7493ef7b5f43af4f0a262e3ee437c2645fd63f54bf6cb8dbe03589f18a611f19632887ced759546f4e152b443811ff0e723b1bc401b3177d56e104824e69ff1903d38533cf2c9804e766544d7368f56160c397ac81ee695b1768f3ca6edaa7740d48c4b0d404b69843b4d371d3c7b6d1a92078d64402a16474418566b486bba42c0e8659c95ab1c876554038ce9c8cfa930f60cf2ebace8a66e994a3140deaaad2477edc263b9bbe801103f4490cf48d03f99f85d8bbfbf9cf4d2f205ed1284317630e50eb03f9aa2d3b99e1dff49342ec7e1adc8bad1ecb8e9d117030700f751d679f647d06cd50dca5494a2ade2b0010ae6fb09cb0ef1f548eeef081137bf944ed2267a696264aa4ab1a7cb5cf1196c48b96a6293822c1a242ac06692b641926425fcb4c6854457533cd333cae82703757ff77940e38283764ebe6b1f16668ab383dc975244a7c7efac4dd649df527b193044041fad3a5522a850b6c1b3dcc35fb20d886d1fe91b4d1ddcbb5e5699bc149850ae5adecb1d688a06600d2fde426224d75b280e8563d9bff9dfdb70bfc4abe12f29ae6bc89624cdec52ed31f5988c958a6abf2691884fa630a9a30071166cf62d21512fd926aab3a2bdcd8045cf2ef54ece5ff779e440c58737ef696470dd959951992e99945ef4cf09111f52702bac82b8051fd9fe9d7fd49114d2065cf68f43bfe6f46418e756da54435ec67901945deef4cb9357582fba27aa825de6e7edaac408646ff1071cbdba92a82aa9239800ce43daa8cd5e43a0701e86e6608819ffe33db74b93876fb51fc9bb41fa5dcd46bc6b11f98b4b17839fd7de56aff2e8a60486f9b3822d7308e6cfb0293a322aa582d9be32b53b0b3f579ee2f1444b45ce5382e14b408813f5ff27287c7fac3eae0535b79ada1749fcf09cf227563467bd737091a0943ad7c68cd6c82e5b3f3ac0978abbdc250ae1f7c3cc79286205d091f3e9de0209802b46e66493b45d67cab140f817c1f877ca118fba49fe3291041bd3a4d632c0f9ac93b0170f331fc75e92570bb4536b10b4336ae5a03ee9b4950787de7a648160337a82c32d5fe759b2ba1af24360fa900840b412b912cb463b1a759651850eb1f6866d7214bbe5be85d3c5839b5df6abed9e60446fc8255a2c7d658e887eefca64edf61d2c360da007a6b4023d3d24ea2c022d5ed569b58e65c92ddfddfa4a6a7af397ae3e6b7a92dbaeeecaa1e291af91b1aece2c11a0f6831a55b092a2409e1d3908115203aeb5597a4143a93b069d20cbd5c03afe0029dfb172b492fbedd3ba68de55323fcbe1d9cf6c582923789dba882f8922a46ee09513bad2ad7bb26e4691fefd001d89a20fcc0b4801bd97dec58ed3453ab6aa28213eedd30bddb3fc56f7c77bf18305fb890c3bd9edf96368641f19d676af702e635dc481bdab30f501ef15bdb978036c2c6b2f5083782561fda465d735f00d0868fdb3e2f45ab0ee705999d1dc0bea46300d8cab70c0b31d082e2caf922ec9bb20725296f21db3ad17d67d9b3c62e65eadb9569b270b96315d521e1b7a86afec65af1d382af43d1fc112b60e184931a36608493d5cf7098735e148f7c141ed87be5f5ca8fcdca07ffe8f7198ac5bde9861710934dc28d58e797dccac9944f5e8c57e9a208dc3fb362d0b88c213d78dbc5550ef9f03c8706d7bc3e345f3c49d7aa6d45b9dcb840890997181ce75912a45044ce27aed3ab4adcd00b03e3db600eebef5f101436f78060551f6fccfee3997991646327aa9111995b30711f058c11060dcc96d926bc423f33c51769dd661b1bacb81e4ad7889e70c783a59c780f0d27eaeaa2555e8f36ca6c23d2d30f6e5b301e9d7db5768bd9166a260030ba7fdfca851dd0a99f6b45c97d4ec6baa3fe084baa9490fe5355feeb4ef2c4ef4fe15b2c7e469c7d963c1355eca6f8f4aae83879987dc610ae5ada4c1f6072f1a07a51ecb6cb6c3cdd67e645a431837aa8706dbb591f9b3fe4454515e2852574219bae91238298c5dc21dd25be3e14411eb3307a4b9263c46483a134ba4e5284cef0a9b280703547087ebf0215b217ff41e75e421970edd6c1c7Line truncated
|
||||
valid: false
|
||||
}, /*
|
||||
TestSignatureVerifySLHSHA2128s{
|
||||
pbk: '507d6635a4c00f4bc736631a2c2b2188a0fe22e75800707d68b70d6fc1b2fafd'
|
||||
msg: 'aebbbfb373acd2a4b775e1c6f19c600e5585694684d043dcc0c23bb4924514'
|
||||
sig: 'cefcc8d3d4f86004eaae49e49236e5b5de5dee75c02d04aa698c8b756808901c68fb205146d8ee0f4cee31b866b1b52333dd889e210f4b30af28939e23e289f7a35c00ed8a5ca887866832031205bf8b5a3c77fe091813803fc563f7e303200a0b9f51446b241f2f3340b622f831f972312adc9a37367309247a29407fc4d84e20bb872f37c8a9c75c78c846c8e98262c50d6a694d1230b20e487c9da99ed719205a427110cdc4f67ff36a5843cde2bc344cfb07d08e3eb6f441ffaaf963e3395d548c7db6a668211629ef0cf05c126aea0644d1b0fa5f72446ab3b8b794f009c76eedbb8c17378e6144f8b3b3dd6c1dc71c26a4884f8aea0db2fa7e1f05e5950899a570ec01538beca5f2fb9303c9c61a3701748fae49d1b91142d30778461dfed8c14dc3d2f9103dabef4f0ddf279774af57501e3cb98d9912e1c6fc0ce8c372700d1a84b4901f37e2e5e407f4cf17e18d1af070b70d841f5750318135b407ccefc821e0c3dd557ceeba9f96a115e15b69fc7d92b3deb4126b613ce97ab050b4c462cf3e9f23213131a1fe2497a527ad8cd823c14f17ccd177f7ec033c27b183d380665a01d7a83997e289ff056b334132b33d9acd927681b5b4d4ce1f8828215db3c284fb7685576258e6b8eb4b0e4fb4067dd5b41fea46bb4e994de34fad14016fa8c4b96c285ab483d1a8cee0f91501b5571ccc503276255d47d3e456393ab64873d6a878fa51604238f29fcc9150fd5877e2526ec528a592dba1768b080cc42d3c2db15841cff81eff0902c9cc9d4d2bd51d2f5cef77f0e0c7be218baef797ea877743be71af9fd838731e95ed8b1a951a70614814a24f11778e020790d6262d71cd25ba9f189d28d3fd59d9960a1baec3133122d283a1cc4ebd68bde96e2222691681a3e83671d1ce6703108e595ecfad2910a5006e74f569b756861264ee0444058b7cd1cfd12c7d1f76e06f0c1072732e1799e13e684b20825a1c9d97cfe1ae2184085eb2adfbd9d698010183659128acede7f663af1908c730f056f6e68644d1efb51603fb96d67268cb033bdbb34f3abe64ec4363958a9b5f1c2e06ed6ec4872ffc96d7ab139c342d946a1d5b2393dfd33ff41563baf8f4e80de15b2e69f9ac37466ad4aa49ed8c45c30cba60095db290a098a139e4697691c3517565b8c5a4e81dba072218b9c2f8ad55a90df94f6a4785ad3ebef880cb9e3c530275504079a00150e1893eaeca90270a13cdcd95f27a499ae661220b56764c0574441a867c177793d1dbb79ec1a3894c0adedcebac248b8918c2f5d00a2f85abc840afa43a7ecb90649e122438d703227b1dc7cac6543558236d99b4eaf41b888f765792e83998c38efe8fadf1ef64b55e171bbfe88ed87d7f8069ba8061b2cd0ec51c492db483fe0de1f1d5b95962592a05f9c91dfa782681ecec3f8686e1ae66f11cdb01d0f80e4acee014c767ea3ec15ff9b73f758822098ec58b1b195e2e6d3192b290cec26fd3d82f3a0f8054b923ef1a5b8b27f566cd02575a150b4f58045af4f69607c5d731bf996c12383621a5ac98309ef3fea1705b0c68d641bc8e876220a0917e4abefc420d700d727d8cec3e67f868d1616ba5d57e475b26fcf7f7605e2a9eda6ce3892dde5b7efd20bc6dbfe60ee53f523749a5a6bf7c6648f1a66dc60e41f7d35214a2046c2790a3c2414570bcd42f1383fd6de7c3fe5226d5671811300236a7bf2f86075b8710f4b631535c866e5b98b6c4a6c2269cd0cfb607ecabf00eeade936e0479476054ccfd4e9aa0c60284ba436703bf4cbec35c2dd1c19e2a6d24f55a79f8008d1e0517230f20b428fd3f612216dd97841cc784c1b8675913a3bca2d23c158bfbfbcb577b5665092858450621ccbb32968468f87de2975d40c90c28c242818083f47c08bb73245d7be2b3c2c737a1a670cb6fa1c1b8a2b94571735ee1b6bf8f1f527a1fa32d9762d75c2ca3096ebba77c05528b6847a069ba7a09022f4e91b2fb0051757549d0f6721c942dbd6fb428ba393627cb4cbe5d2eebb55b622720c479480e1f52a6e2891ec3ac2b51fbd4ccc2d0483c71c5ba6129684e80f8436511f170bbe78b2091c7cce4f04af444d5d268006022400b9c94c052cc301865590537ff7fa7b0af65c3127a77522b6491ecc1aa3cb176db1b997791734664377cb3296c91896ab2f6b713cea1d1522f08d4fec68ca472f06c4296a0991a1f292ca1bd5ce0fc6c87b2305c6c65806fab6c8f312674b4d4db73b41eaca291d4b5752a4557076aa5fe4f4881370e8588e876b348846a661bb184c19bf526245752cef2fa2af988414232a610ee2125e5aea6a32fd9288b7afcd7ac8252f77aeb74544e1e075d898b39c2c49154408878cd3beac57ca5ff422aea647c870836c8b6ac2d95a5e2af05514dc6cb556c63be8f6ea501070c5dacfe4fac6cd0b63e4ae392caa1184c404144a6615c9a5a73aac9f6c17375d4ea9caf71b22be4d09d74f02b0fe747fbe2af292695370c67376a5f907c145ab85fd7fdb445d288af264c098b1a79f519c266c7db226e0fe5215c6eb6900980cc1e7483f2f722caf1e0a4d8963658b68df3e737ee0d53a862c5885970efae5a7531c908caa8f8d2d23521f49082cff997709ea146fcac18a454e1448240ae64641d33072f163d91ff9f0a44e7100cb336cefd8405e688c504269de4a8b588c667b17a630651607c8ecdddf282f07b1d019703cd7e0d2bf723fa4d699d0dc167bfe1a19e4264c4c3294f6b6168553426d35284fd1c23badf6ddcae16284cae3a39d05127a694d54acf211c13d7c9a94af939b75db89f25371b598bb2706a1b6b6b7a31b74c93b99fde0be439c62683933d4b34fb3bbcfa918c11155fa8bf7e86924afd7bc68e87def69342b214782290b40a8211f388f3d24d821b38d5992b7b161c579d8683247b15d18ef8b65bb68fc4ba59a3779088db143b86581365092816259a78b59062b01c96ec093e7cb8cb7caea4cf1a35514fd5fcf91b8cf753c99f9916280c6b9fc3f547cd784bbceee64c499afeb6d81f124ecf56dbccd2099fc6924ffc179deb5bbb8c1a348416efeba433cc8fff80f865437abf30db46b6802188e3db7c5b862190b85eeda2e3d09bf1bc0a0952777ea7d91c97fe97b0b1902ce2364bc50576cc3f86656230b8ef62ab031b969b7b5bd55d39db05bf113c28f67ecefffda7d9d5edcb1b157278ee9ef0fedf3d431836a13b30332778ebe0d15e6f67d98f38e19f2a6cd36167b7135a098c0f3e11af1e2d5cb76414632542eba5d854ce96b29a6058b7190419df624b963d31d0510dc6004e694ce852547d769f57ac0196d1aa6a978a5d460d2627f2243dafa0769adcb36deadda6547674be185afe96bd0cc2d30abe876ce1c75803eef9f997ee3ab6b877c943c573ebeb085e755d1007353bd34af29c6cad02feadffd9cdf7cfb577395cbcb772510c7c18c0e22d6102d3d13753bc1a9ff692616c3bc14eb68dcbf041bc6e051ad686285ca5cLine truncated
|
||||
valid: true
|
||||
},
|
||||
*/
|
||||
TestSignatureVerifySLHSHA2128s{
|
||||
pbk: 'b31826a9c03c1d1e9da67ece57879e0e4ef1ec125fd5f581fa28f01044d0eed9'
|
||||
msg: '8a4e07dbdc77b8053cc949f987e6960ab79c606d9e285d6123b72730aa625b1920e3d7dd1e04601ccaf14cff025c03f0a8177278ab36fb612b26e03c9482f688c94b568bd63f2129150ca49a8a888804f4bcb2a1eb2565766fae1c3f2e75286f8bd7888a61f8ac5bb85d9e10ad6a1048660eb2bdf1826052d5b783839ada87b2'
|
||||
sig: 'c3621d36a21f4754ec93dbe072fc2acf4167d02186baf84fac23a4915d942b30574812521568cc0d52f27c7c76945971b1b59d6744486acd1dc25ff3589d68cfb612c8e6836db00cff8b239290281fcbd8da190b9f36bf1a084842c16e77278e77423e75b1890c7b278abac6dd1435757cf0fd336c80a0b5a802202fae021cac791e65c84321f8aac7f2e331accc95f9b3cf3fd68bfe75c794904004fdd940179659ea2625f4d7f672d461f457dec5dbdcdd9966b156fa2d631363f7283cf35a72109b00ba1bed7943fe00d0857b60b2b55758b70ce1660b19b104214d50bbc92329d0214051ddd623050f36a55684a8a55cd1328e212569bfec0aaf4913baa5ff92185ac603cdd267f801e4feb00ed1e87b98b4a243d6d8b2b5fa8d2bfbf2904d7e926a52c6fde736b608dc72e4d2af01c596b36f056c02916108880c357c13e4dbec03c4f2901e7def917541e00ab35391ca947ec55e0f0b0ffb91026bdba4df371ca9009c061cc2d9cbec133ee3e593e2be15bedbb08294a96d6f7cc46530bdabf127402fb9ac6e16df3f5abf05e3b324b7c4fbe800314ac877eb01289d0ea3ec919f8fe94439da47659551f0d3c7066633fa8d2a43aea3592f05c93249c07c127c32b75a5d6b4f1b118f513b4e34125975cf4097cc9c460828dd5457a72f1ec0230b9077aef0ccd49817c0af5c8b7a9d236faff2c4f67dbe3b1814b46741c51591c6f44ea32a5425d43b845beb2cd0a48e877de6cf3cea0bb550d878387796b890187116d9099a032859ddd0ff4c671efae781a519c110c9867a3deb53c8f76b022b0193844ca69967aa0f89e0d0ea047c6f35cff5bfa8725965bdddfc057c1e70e565a5c70d4279fe9651b788fd93d921f5dccccb0ee59ad0f385d453bc7ccd28f9918ead6793df45c119ef996c9ee0e9082b2098bb59f388a36a354ba9674c1b2feb72b7cdcf6a415dc60bf519fb4b7446da66c0bcfe5766d5868e3e1fb93994a0c723890efee849cadbc7c4994e56736aa27abb215670c236dbfc3cd69039639e1d80dd806df738aca44f7bc3c0ebeb6219f9f7ca6a79b9678e0853ae11085f29f92e8d4bd1ab4e5df02136d1f90a0b4d844e1d2d7bced2797d36ac16dad6fa06b834fe225ce6675e1f0d0795148187974cdd3eed3a97a815ef2413abae9d0b3dac6f685d82625784a2b246e1802fe526d3b5b4889345f23e23cd86131f21806f7a8d782daf2c36db7f08f2815e49c59ca73645530cbd5ffbc61e2ca49a9d80bae6da42269b10dd31eacfe206bdc08d67b0744eaa1105ce6d55608df74a559bf6e5da99b23b1ccc7f4aba312b16e1105b47140fd7367020a5c11111a333df39671f5d3237b57eebd76ef485a86c2cc202f36b09a108217095933fd2a9fd43f1b1d7531ab355cbd613652f40c0c71969e75dabab7e6a39aa447a096e0cea11b6b64db40a569eefc76463ffae1368b19975ebf318c4dfe93ab947b1e4c046037d180f36b38a01fa10f098913d7680541a07a41a575272017fa19ba8490083c9a64d92de4173032fdef08933db2a6325c9c01e748ef50f37ade046b8a03d7552c29877069224ed6b9ade019c0734b22dafd5103bd34f8514545c04aa3b47c4bb1217a7e13a177ef2aa956457c03251c60e01f9a66865b893a5c0659ca9932bdc4a62082bdc7d1df7f0161d44d4e32d390e39c25c71336cdc13b23eb7533459de5f0c47f4f9137f0f16b2764f4c904bb5115e15bc4b9bb3ebd284f530661343ad5f9713950f65c23fabe14429e30677a769b64aad38d33821ade1e3977782e83eee003d7f2dafca2397819ee36a736df2519af3cb3eff5c5a838f6fef5a589d36a21b2006e93acba365610172a1bc7bbbfeaa7fbed92e78bedcacf6da7bd2308e331350a91a18aca81968dc5fd1df0d0113aac532cb151092a9b7ccd912683fd990362acf5c4d01115eac01e15e0afc7655fc14df82a9558882765bf8427e722ba0b86b7c968f84f877f947dffe551f3ae182c9d95a527d3cbb2a044506931de7715c4d2f7c95f78c58d569a34e6b89462eb7f75e241945b693a8734d049b7e3aa9d1f00a81e1af503eeeae0bc4ea7f9aeb6567c0d05997d3172fc17e9bf2153dab7bd5d93b822937c1b8f4b3c841b1ac04b904a986089e8dc534a7a91cba4435997704bcd111d4a5195222b272881530d5453265b917fd170ee1131cddb5ec096105f09538b9c28511a26ca9af97d44b0bcc2dcabeb2e8653493736df1a07c34d36a09fc570855331935df6945195a23f59a6161c209d398de393c6e29b428336f9712d31db0adeeb5c48f6bc866d688d11da179ac01ccbe056c05cbaf467a5703054dd69af288b832dd3f6bbe0dc5cfdda74eae22c5e457f9deb65aecbadbf20aa92ae3987cbfdbf695218239eb887bca5620bbbf64f4eb18abbf42592ba40bcf64a6ce9de84c84ebb423d5e9114730554bb22a8867ed7df0b2b33b9e3f47d4a0c42eddd79d36f4be27df24c5d0d65a2e92a5548f65235e9fb202fd5b356db94bd2106d86fa45219689c125956250e7c8eec851f7b094abe588a5f69c8e641c97e15ad6f08c5a89c7cf2f27af82d25d01c9a32333e56ce6629e4249fabc779db9d695b08559098bc6b7c103c93a282fd26d500e7d765b94cfc7ae56dbc9a5ab516a8ea0ff4e5ab031e112a76e015d79f4ddfd7973558ac56a7faf185db656239f23406a8f140441af6d013bfe22d118564bc1c76a65f6c4ffb3bbad6b3d22442c1e8b877ff3eef93724a32a94b0ec5d9109a0858b3126afc84a2c930464e2e11f2f9f3729ba20f97592ce9592eef6e55c1246642e14c7a1e12349e680a323c6f5a0b9e9d286dc061ee8e8d783ba9fcdb1be9488022a8e99e9a7d69d1a50716a3a9e090128e36f24420cebd5715285e2f2f837e3581799d146f742afa40e0c3be78b07ab855b23f5f93f62cef61b14c0c0a2bc3ffa85c179bb31f27a0fd9ff96385026f9017859169ec15d8554879d85790c8352906eff40450eb85fb2d743c487471e2bc018b754736297e1d20773fab6dc01173f9a5532e2fd952aa47e8453fa04c9aaeebba0e6ed23b01e92b7a58509c4d60718f0571231afddad09d9ec87ae17e72f757350fb17910e1ca266ba12bf6e6ae32205451bac6d51496fdd7b4fdc7ba429b47fb5084c9b4ed5ce8d2309e2d51287d0747c59f6531e796f1b082422d3ad9c6ddfc16f7cc9fc1d19e4282275e8c8c966c7b6559a3392e2f851cbdffc958b822ee56e6045387db193646e4d41d42afb4ac8972cd0f8eadb4830ae1202cb8b468c041a17ddd0114df73958bce008bf3ccdc245778a58442ebe8af829d38b43db67dc6d27b6641c148ca558f93ee436b226f2e8434b3724f660691338ea97a87c90ca9a0a5e1edfda8c828462a5e5296174bc5dc74fd69c581f92b4c7f359619b9dc9403f2e0877fed0775e9a4b39a8b6646b50c1b93be000fb5550f540eaaa8d917da9125f5d52f766924302fa4ecda68f88318bcae458011Line truncated
|
||||
valid: false
|
||||
},
|
||||
TestSignatureVerifySLHSHA2128s{
|
||||
pbk: 'de4dac64aebce7d48ba91cd715515d0fcc208da8d4e41c7a7f9d5bffb66a43c5'
|
||||
msg: '8d00'
|
||||
sig: '2dacf7830511002dffa6a2414525b8a590b5521f9e06158ecdad6a8e24acba5d7da2f6451866464806b0ea68b1982a30a5167d491305c10895a04ea5f846ff3c46867a408134ef5939173c35331d91a19f7c9991a36ceb03be529ed24b473fd0097bf77ed0e71364a8e45dfc71c31c40e96b6ebbbd3bdec22adf5f98ddbf5c8bbdee24088519b93a5dd033594ea895d1dcc16f0a36d1694f18d35ec48f3b0657503565d1e6a0286e83114a99c403178b66e4d8e2dc63a77c9472f30611116184eab0890dc9e2e98b0d47d96c8fc67044feb7b46f67ab60e6638352b8f07e387f041323e7df7b93c76d67dee91c778b818fc0fd2f207e26ba25165ab510f76afe7e92114f465a76e0c8b92f5c1d142e42d36c9a0a3984162833227950b2137a7cfb9cda1a78085dbeb4a9be53f63b20f0c9ffa6d44e8b8d8bd2de9d939988029353c905d71a3200d28c9e4ddbf44b7fea3998f3c6c5e2cbd6d811432a2669dd3b0effe6e904ed79b738c517eaf204de0d3debeedd8a29446f2d0497b749b0e5206c70718f69a03687950e6bda2ef23dfb837364ed4d15fb31c2eb7c6e5e88a8987074253d1f184701b419e45bafe74782b8f932bb97e78d6b48d4649366308a04d707114b1d42ee17433e4a2292ec9f9538bf85cac7cc0991ba5890bf80533b6a8a2a1bc533ba049a10c5c054ed03362016a81eebd6897dc353fc29f14b141a22e85ab8003d6862f7ab4af2af4e29ae217fe2ae635b63e69c9e3c2a65fe85dbd2f17198423fe86818416c8967c22a1122de9fda3eb6b34895e33ef3243a563beb403ff58b7f8c77847a826670509f186b8d3ec808dad8255d8c091f0f3c861f12e6319de66852bff5629ed34ea466de062f673163efae197cec1d30a94d7ad20c45d5be7c21a069f061563208dbb08f1c8c279bef7bcfa2baf05c0bfbca81251914767bd6faae79d9092e5ebdae9a282675f3f40bc85757b46e90d43e190f3e84f16199c3967ff2acccd842828b9cca973753cfbcf6cd4fbe4cb2c00c34435cfbb6b203fd18d43679a6f4c421124002e702a2b210752912d22b3790b402a05d006f7fb254bb1059e3f61f6f364c3b3725c91600480889377e33b2aa67a46b6ffe2bc7550de80d91f9cb01a02fa170e9dee2c9ab4808d9a209b33d737c7c1a7076d14abd97650fa54db59d3d81f7ca857602512879261b30d6f48edb00fbb50685797814dcf4d798dab8a67efed17625ce2ddf676ec21556128410de597687ca7fbf5a7487662d8e64201101a9b498b383c707be18b781fd84185ce5df09932561b1b803a4c56a360b394a9d83be582f0b7464274d05f313f208a59d89c94ce729379035de931b35a1eaee6ee303b570a6d10077620d1905a7cf24d82a0845d1ee3b80c3da821ad4a1fff6dfc6c5b5f56c2b76bce7ddedb8a39e639ef62b7b765f43c1df486a8584f520e819cd02cd61d78f254e4de2ca645acdc7bb97b6233cf0dca9539fffba9e915653770eb6bfb1c6875e814ce3f94c7670c3d422c317ad8574d8ec4e44b10beefca786e59a67b041643419bf35ed0ab0701a3fc9c6ae6eb216e9798e3ea0648c057da983591068c10ad2e270bb3920435d0d0da07d9ab29ea8ce8d0955c1b2fdfe56e219e66e53395b308468072e52abe91686f14bd973ca0fd348449b9e996d1c8d2200f70db66c9a2bc440b2f418121fb49c136d8862e4bf545071404b38e34fe1336542b601d2cb02a13a7d92bfb86714957e8a779bedb568b3d4e27bad503fc17276554b9777c07a63a78df4d6970f714d76a0acf79b5745b44f6f837b1c1f4797f9c4779cea6ddde09a7c40e7abcb20070e11db7bb222d78185f49ac30412d04132a52aca5897ab18fe37d25b5f23822d1a2287cbda90a5937d54fe5dd7e8d2720e891c9921a91f59166c9f9ac63cd07d15d2134de02f38b8926427a56a2dab76e79091f79dfa0ec38405800cbff56045fe854f4763f0a93050af6dc8191f2f4e7b06864a21f7dd051569c0a57521da59db4b2a040e7f3a48bebfa70c9bd4e808044312147058cffcd7413f236a9bd2b5f50adc61d3e8cdae92107843ada272f51f11f366db3da2ca98d394752e43cfbd076382a03a85727b21fee06caab927a7c81baeb515ffa0e7a228fd1b9e7632681b2cf675a7e9e9efd79a5d32ab76084754a8f3cc9234648ea40103a119bef7d9b2775d8d1e3728335abd048a29af2628f747d27b3487aca78b1e3f900e4e56766a276343272d7c6aba044749a004b76d448001647c7e50760a4b0fd25c2f309bb7581e4e4ec74f2e640a6506ab01591e35e0d7e0e51b9426d59585c39e3d7bc8515dbd70713ef3d4d9f01d6a5f81d40f2aed59ca8e3ed5363a0643f89d640afdd0fd17441295fae1046ecab84dfe9f931b443c7943cadd116ef4a0c8d6e4f426a67edbfb0faa5f7fdf2dfac4137428c318ab7aed807f6525bcb3d213ee9c9b51a75ba5bbedc053dc7e5109a2309ed89636e61e354ac2cd5d0f5e395fd3c141db63389fa72b3eb85a74991f12fd381cbde4a2e923c08521cb22ddfd99158e6c5cef8f39a80b0b8daf293075368dc2abbcee534e65be6f3d494552c7d31e974ba3d1b1493e9ef2d426ed8f44341bb60129c8d54fd9d783f518501c71c2a7879757bbc97f910e52ed6cf7ba62ebfbf1ca62e681ab05908e29326bb9626d12bed0980a0d2708da506afc8dc53cf19fa6fd7b08958d147241d65d575388d87689ef14c08e1ec2a595b44638afe26f84580b4ffb25d90ca626d15afda78f4f26c7a9d5d163a21822ee8a8300829875d0415137ac1455574d5026642b26d6d9a2b1d6f0b07395cc9c7d0c1530c1dddf689eb144c1a40b482d449f9c9b837c2c87670d1cb740633df2321feee6530e17b7c46ecc038fa8966cc02c1c802f191c9a2f0017b0bedfcfb03220b94fce8e3b70876fd57c3bd60b331c28c89347b6ba154f55ad877f079fc4d019f97109503ad3ff2171ea4b55ab7bf0393921906fc5265c5e6c739a5de230a2527b7c1b64cb0c57e19fe71cf564d26841b70199ac91236ff90c231d8a4b1a53ad7f6307cd832c3264ae7c6c3a233b032d7d5d150250ce3924249c4fb86c411771abc13c224214eb31098a6f818463022f9666c3f2cc898a6e1fd181172259c8aaef0bf4ca1e612421d2fd57e2998bc20ee3a2905d607a5e677e73f07429cfcf231c8965e131b6b1926cf0625bfaabcb228fa52cef12e2b91b7beb457f8e43f67618bc7df54a5df14d81fbad4d76bafddaa3a8b3f445d3fe84d72878131baf03d2d3ec6edfa69279b36b8f2cb4a357d8d12eeac38b2bd73d1c58c02eab49dcd82f91a948f1f38219d52f19a919edba6f950a5f5594a026639148d13e5a4048699e15db01d677af078b414d8db88083a1e830892a8705c295fcefeeb69b90b9a15a272be7e1ea850ef35081645b890768efb91df4b41397aeaf5e7d4271e0709f5f9dcb8eec84c9c85c95be73b17490caaf3e0b67711504b965116911ff9Line truncated
|
||||
valid: true
|
||||
},
|
||||
TestSignatureVerifySLHSHA2128s{
|
||||
pbk: 'a21207c0f63475fdc0e4bb74236803352e3799b7915d3bd9d290dd1d2b2c330d'
|
||||
msg: '04c1567025442898d1cff952156e13eb4d124f6e0107f6aeeacf2dd6056d0e388554c0173a291b0fbef8c7bee746b026ec30d66513d0edc5d991994053e791988ee199c594ff1c2378623eefcdd03f841080be97059c1a1e195517564d9371fde7948e27cbc0a6'
|
||||
sig: 'a78f1f0e51e00c0449c809d3069b7ad0f916a22cd183bede503757f038d58babcce020191aa369cd00e6e27197f193981a93d209a6be5ac5cd7c4a3f5f117fab7669367fd1048e8468df6d6df877b218b0c75e0179d95902a96058b992f09d59fdd72ea3a2bc6198afb1ec2bc8e1502e8002f2fae2c9f9dcdf411bf8f97e294c04cccf4c50e16763abc8bd9a4f36657402e965274debb97e71e7fd6e92eaf08a50f60e9e2dfd0fc7289ae49e31a505e0117f410d5896c5a78f5995c2dfd1eb817a3bb4cfae652cbce59d5ba8f24d595477da6558efe2190207fd33ff9a0b1567ce336fc2060cc74ed07a7cfcb158dd97c749ec2f0640db5435d9c31fc3e49116c57119067bbcfb53244b63a892185e0110ab2502fc71ca9223c2817428de6b5224ff58795b8fe671b32929b7ea2e3d362f2018bed9b332e2bf9bb39f096daa67e4dcb97187662ab2d6a8e257cd3f2e4a32d874a6103966696f9d98f73a383f3ffdce391f0862cdb147ed611db1a55b99810b5da8c18b0bdb6e6e07ad1080667e2487dbb32824d488d367f7e494d64c33cd79e4eb471291f5cafba2b1baa95a1ed5d00042deaaa030cf06cb8f0758076740a47545d7fe83cd94067fad06a2f18eb214c8154f798bd2cc2f37387a1ff492d9bc004af61e2ed466dac8a6a9d8c6c08b3d9465f4d296e4b07df2808393e9ed2903ba25492bdef7cc769a547b8a0e3bab76ac5d18489db7003994bf7d40b9c35fca83a4ef1d6e7c206f04fe87003414ce97a45b78fd91ba94a556ae6f8f0bbc4521101041dd21104430b791ddd30914dc2f0977f8e0c4bb81f08d055e90e150448e09db7e9a298cb978c5b5ea7a9d0f76db8935bcce23c55302fcc03cb7106a6cc22706b68acff42ee565a05fb38637829e3bbff25524ffdc83e9b4b5ef7021688d636a496c31ee066d343158c3970b42bb47765084abc3579b62dcfc5956d9ca0db8223d2c163dca4d45afcc10429f58ecc63096ef7c6a6c1f0e4ed4ebd0056896b9cfeafd21aeab6606f21c863da1b1eb8b26fa7f30f2e8e8d95566a3a6e768d4cb73cbfd3cf9848793a504dced9735ad23a806b767d31b1a4d29c1cc8f429adce79db6ef657b8ddad148e34e95a97fec33c50d1ec3fefdec3272bd3193cc7535877c13a48799de549600de0d624df8851c3c65d11c0d5c538effd722facd617602ac1db85c22c3d70b099a72019dd1496532b07957caaf640618b3a04bf0b7981708826ec470d9450cda6891566649401deb2997fbed9bd7523fc95ceb146d5bbb99f93a945052fc8544c1d8dc0c66729ec10e1b38397ecaf0c7e34ebc5545b53bfa53271eae4401c0ef5a9ea0c01b969a41c4c808f1510c870e5fd41370cdf31bd52e63553183bab13fa3f4fac881dab68f0d2b9a1184b5d0eaec5bed4e414cc84b70bc64295fb16df1111f1e89e6783a673199c63d87a3a83355a27eab6e52b5eb88f82180222768301e84363fb0aab38c3bd08481410f09fb28dfcd1ed764859d8c1615142a98c92f14c8b509e18252d9b0c5ba8c59580695935f03b3a6c0f7a66f67ac27f35d578de5b3215ee61fcfc3ba2b79e749d7b0d55accc59eca4c82539a74d9576d9ddf4b1d41e19ade5c404644725e430deb2e81b29f84dd93779a8a546244f8191e7771126490c8dbc4000d3178f19c1e10d4fc98de01b1818af63aaea884a1a452881e2d2264518271ba831043f9d2bd8988917f04d9b8f1dac504ef1da4a199836357cd4e35abb754e9b65675830a3ee44e8e4ce29e53f6cccba94d1636b8dcbbd4076e5aaf06d49e806612ae28abc02c42459772e3a4c48423fdc8ba35a4d30bc29b58db4d7904200cd1847b572ffe9e30da762398dd9be68b5464842d9b853c73973dc522fb54fef36e578a095f9d0eefa28287c02ede9794360a9060fd4ac0cee9abb521f1a2de9ff2aec1506d91a4fcdfb64f7f8fa32236f60d215e50ae291eb78314aef88e2364cabc565fe4f61e0feb7563fe1a6c94e8e8d98fe5fa9cc39771d3662ac16441caee39f4e683a1cc5e94816a116d6361747091a75d2c5e2613e52a6f6163ab411bbc34003fee1d54f87e1bbb63c0bf8a4fe75881ae2601e607b14311305fabcc1d9920e8e100bc8ff65c3838c94c3e40e586cf1e5a90e1021c95163494c9b196bb2851679456d7a5d04f44edd8348cce5904ca47cedd905415196d0ebc9ecb08f13fcc4271055353f4758665eef38f97c6ee56e818f01268a4e04a4d4ea1e5963791d549a59e276e4480e7a8f8278b7e6b92430a54987d955eb11870e37ce30c2ecc8b27ec56a49f95cf556c85477191aea317f0dca0a54ac0827fdc86eb2512c8e768fa0fb666a9e5c47bbb5ee47b00546995036a55c503fa670fb782bfb69876f7c2568ed8eb0b99550ec2346c63f2a8b8af93d85f0fbb5c75a61c21adeea3b4a96821305337845a16596cff5a167525243e5d9963bc0911d541861c93eed1bc06caa7d16cf48ea64cebb434e4024e25b7f1615fc497705f5e8e89ce84e57ac9a4ed90fd955dc82e0f588d83b0b4447255db54d7c53eae046b08db0447dc460967b5877e800cde0a4c260702e0dfae2523d59195b91129b2aa5d399338a27a21cc78eced6912af65721b46c267b9316d908a093f7a08d3e94274ac5375d0c75c4d519634ff151287a40a7bdf47423b68f7c562066d759a4c208b7c7f5603f3764e10512edb9bad496dfe9876d87dd00f508379197722779a4f39bd34d1fd550aed976b5b293a6861fed3aa00e345c710720b3f098f852e77766ce1bc03ec711089155bd0b195f0109b4ecc665c5e8bdb2a48e9ff5055f2adbfc1f572c445c28722d30c1054b6236c50f7d2d5526543bb4fc33c03d0795d7b7c7f1554fec36cc4296bb5ba22159835a727720e756162c79759a0c993714928eb0dd14cd8729d2929aa1b50af5d46b4a9ad8d40996ddd05d0188c3d2533828ec62c6fd527ab6ba418d5b5d447d69bd2ac010e314986c23a1a7a53758dc38813560c7f421a3dc29d0c874408760b5109de3311e4663c86b1901ee0d054d0ce19ab093e6c525e5850bf6d8ed1d64952d4c249dadd50a53387b9e333d7041221dd3c817f3e181e396613c0696aa6e5734cdbbc31f9ab650e4d0c1fff536e55cdfc6f87b20a238a9a81a01035de6e4b9d932560191556afe32df5567e83db0fd35b6ae95933897bb6b83168856a613fb0b968ca4b8851811ec093455e3702eff4f3a366da91ba9697e28ef54683682a3af38ae1e3316d2c8c838ee0af772163229d7d9f62fcdcc765d15353df0345cbb1fbc56218cdaaf2dafdda33e20d152669825c00d6a7c2b2be2f72b6ccfda4546cb7ff91c6b1e272e486661e97f65d2a28390894318e32428de3681e28c36cbd0bc664e7652f483c7456b83f6d6a44f1c5f5d630323d3b002fd9eb8eeccf44b36a96c583f530ef7e56945bb342a6a70f78543a89b300d6817b2b05cb854fdba99d81a43dac2925b1c56041302e0b5602723600eac2aLine truncated
|
||||
valid: false
|
||||
},
|
||||
TestSignatureVerifySLHSHA2128s{
|
||||
pbk: '3dd6ad6dc886e370b5cb3909cded99e67292f34028295071c0b47a5bf92fd7ee'
|
||||
msg: '3f'
|
||||
sig: '36ba339230b38122d5433e6e7e6d818ed0f2c5e165e338974e7d7b24fe7fac639e81c443f89dd82b71a45bd85dcc25737f7701509f700e67f14ef02b43dccfaf41d0a11ce52ad7f6b4349cd30bf5742cab7cd8041281093d17b7a7bcba8f4a1cf90786d76998abbc89431f44c991035f1cf0bb0d94fb6d1e311c86aa2845afa6a21475a3dd16bcc4839cd620ed783dfefd3287fedc4452a83c6169c39d4af3c0714d34dd09fbc4de704524e79c4be600a21cd749a7eca9fbbce2680243a87afdda4c49163af344d93f7c08273cc49b2450da626120f858e117287855791bbc902620a645f785d1bbbf5f29b3e61c253276e6a693d202925773f5ff28ab3cc58a50601aba560c024b19adb93ebfdba71566483649d31e1b8764f9ee34d117c3e85126fb0071c0ba0f8dc532918c5485ef453ecd16e958e0a8deaf4294fa70a1c8e944f9436523d7f3ab1d2c652a1d62043138dae046a573e72744b0b0581125ac135e1d9f8eb071cecf296c741df6686d08e25ed45c3b7ac4cae7dfacd8f4312283e9bce2c79c78d2a06084f969f363bd39b549d64ea7008b7a5f592620b63a06c570dfca5c48c75bf5bd488bb07b471ba4ae20950872cf0fe0d60f69bbfffe87b59f50467943acd34e007db232be3cf9e3355701efe667f8674c40c2c2daef8149cd031798707e736f440b94ec5982f550d4940c23fa770a9371577b376cd70bfa769d2da8e2feec828a2c67d91d101b62a18a2bbf38e478ab79f34d11f12b482e0c1d204a1ab1a28b1f7a1d7da4142306613e0d5cc64d697add853bd7c11ea15ab46bee122fef2f6708ea706c95cc842e6b25c392f533f5e9dc0ee8f2e4207f34ef25a02e588c80bb0e0c0ce565d5ca9d7f5f26fb6a850e9fd9abf3324abd991b714e98a86f035d3181ebbe68ab3f46f6601191426f4132a6ff9ec784bafd38d475b068fc64cf850f1ad6c04942e3f4612c7426b22f33857322835ce52dae388b14d8ce73060b079a9a9d5a8614d0201714ae74a6f909db77dfa4f970ff4f9e04cc9883164a04dfb80c9d1f535475f0267971b55f48c86838e02ec28ad3d3e18f90e8420eb52e6486870dc9eb1043c7c375a9f1f7aa96096a3e8c89a3b0e1cf81887bc34be139737d78dee84058874fc3c9163ed9ae023be75924db798f947ea7713ae6d2491b38e8809bfef7bce0f9461c02bba6f73133b22de18c14a9e8e23ca1eca81a69649de33581be754d0923e804d4c153db6d711419963033915089d146d8e01c19ab12029c5282ed59b61c195f9b7380f5e5cf6aee945ce224953597df6503280683bb44cc8dc1f42bdadc5de2e05526862e4763c9c7ccbc98c50df85a76ad10cffd21423d7db0f6c1635e32be49cbf25b4378dd902422155d03baa9d32aa9c3f3e4f6d32553da0ac647ae197df21dde3d876b5e478d90242f0ffe89585187372c48467ae94cfc7eeab72fa91ab88cbe30beaadd7b55543227ab5ac6837e53f6c7c0803fadafa3c8c3fc5e4f6e44da61a0b3589501e63a6bec755d2046e002c530637c47584bead31997aaacb0fe30507702826934db0a02adb10546b295d44541203ed0c57304ab4f16d2d56ec7e7d5924a54c5f34622a73f9b9befaebbced7970f224e30206c5f77a43e52104d11455491d80a698e4901ec227e931280614e2719a75b8059696b279ae493c5518a04be621d50eb8daf8212765ca1df279e587a8ea2378ef9743e729a202b082154480a2c775656e61717c9635471dea945096457445373d081594c9c6e8c6ec5cc05cbe4199103f43afa9c5739067e147a7e28bb8f066219da5cafd0f4d71d6fe9b696b1fc3d022f90aa480d4c8675e13003c30c2c40526254cc481eb1bc07306833e5118f81b6a76980baa2bf49d07af378f9c7ef024f702766f1750230acc7d31303b1c61c6972b888321dfc3f26f99d8294d0f5e649cff798992b9b1bb38d03a618bc085653caa1d7365f92f6a377a50efb12336632a4b87e881ccbeffe32e0a361c0642174a2e4f45328011d418fd1284103f026c993549480365e9aee7ac74c562364abc4d0b46772f061f611b9709952633c02664a01d959f5c7f0a4760226149eda532c4e1a62969a962cb70bac620fee1810d40dc05db94d6f7cceb87eb8853ae264451b9feddbc07e027ed0c5039def465f63cb1605355339f4eee36082db38216390844ee367f8b010f4c03fe94f5e570135e3161a22875054089a5bea5c8d3ca92ddf970a6c2df16ffd9e884acb88ed7eb21aca2c0fdd27fced574d5c95533ec7c636b5c5e316d55b34fa1dc18cb3b02a92c16bb94ab0b089d06cba1c02b19635c7104698c3859591f90a364286096add4fa5a894d6836701eefcfef94db02204bf6ed4ec6e1c082b5e106529f44661effcdedb93326ba7ad772e0677a3199e354570815ad2fc1e4480b16b7dffab803dfb07cac43fa09816485109dcb2abe18e53802926b6af1261ef928fed8aed00522ee1c6b9b3ddb6d90613df74a41e8efc9b9369fefbc919b9c2e0d7d856b1954e65af86124069099402f4421026eae8172f4d42d8b09150b1e10eeac48d2500a76094ca5dd871f1d27e36afc3715fb9b03f065129c66225afc2700ecde68127bd16f19203f08ab9eceb6fc8605b8f6d2c0c930467439a7d4332823e3deb3c7a76970c60f66687fa3d4a7c01befe123dbe4545e26185d24fbdf10a2b5dcd934ebcc0b95af6fc3950896a6124ae3d8a075040bf6b9e0872e26cb3626d8268d8eb973a89404eb23f755b1b3b1a4d4c59a20683a1646f6ef1334d73b8eac4a820883a04254ac057d5ada6dcd3f7857c4fd6007400b877ac40022d2e94a450f4d1bcc6c878fe1e64cbc02d1fa5f45880391209f879d5c1da899d72a2821b797d89fe889c6d524de7d8b7ee004f6619b21f4e79a01ed1115e18376a086f311886b59f8fbaf8ae745434fdf9a243c6d020d4ff45def94cd14e70c6ab8bead47d3e9c0a3acd38cdf78e98ff6c21d3b1be3e9fe9bc8e09438db71580f92ad62f5a3c001dc2690619aa4e951a7508cb0bbe9b1b7ab294e0f0220064172870b8dbfcd998e8abe966ba92df7062c33e4441dc2652e2b2b56e3278fb6f7361fe3b08ba890eac7b62569e607b049feeff57c66542c86458eb1dd83918f263aa59f9da3a68df85634a067db6ba30365d3a270a853227439e8ee70d4c74458fce7aa0623e39a28b2bd270cd49a9a07161e1659c44f909d22fb4f220b841165d21fb8bf809c9ddab6dc1d8103f62b0573f6e6c8a71e1c140ed2904a4dda2c66913c9bcd5605ebba9c68d8a50a8b0483bcb4fd7beb8f85c128bc16da7e215ec9dd6729d45bb455a99acad94722f2ad4de6a5e5171e46f82ecd5bde1da15d9b51cd38b1ca7815209ee6c78628b2ef3d27aacf8bbffe920850555e3b04a6793b7c44e5cf26bbf06d592623e9cf827f36f43324ee647e7dc904bc15930ae0e3c29d5bb22195a0991b8949e26512d73f46f23e2b714d7b93de9d9ec2e9029ced2bLine truncated
|
||||
valid: true
|
||||
},
|
||||
TestSignatureVerifySLHSHA2128s{
|
||||
pbk: 'ac376ce9c7700fd27039a75bb74622dc6ae1f7f99100f80bf4eba17614d9e3cd'
|
||||
msg: '21e9a27edb1f76d2ad5a00b0623cc9e46b8d03d5ad44c58d962163d249ef166ef1c4a2abae6d0fbb4fd3b9b2a4801490c9bd21fc160f2bc49450ecebdb'
|
||||
sig: '798aab181c7cc147448d8c08b81c4812e97cd3dd045b5b86b61411cc16013aab707872c9fc1fcbe22ce4a50991ff41beef29c5ebef16c2788d28b9f436767a77c9861ffd829ef70aaae2af61077f5542ea59cfb5cc261839cd9b2dcb9ab754c74845892f8daca24c14a27295210e559e489b8e069a138644faeac714ee48fc535ec2712f7d9a103c1c64e315d9f1fb16b9c43bbced95a7df107fd85f58b21ad374b7c167f5a7a7eb432601ca88a10fcd0b8048a40328314d82911589a9899a38a8cc0c228679ef64993c157a10d7521c6f19660a3d56a0c81aaca963f0fbe4d95b0380476fdea2362445383165a5b5c128c33b3fd3d41cc5491543f6c04470c5f50ea5865bb5c1ed37ff4fe26471a25ead0b0a6d62013821bf4debd6b70c0155636d5a8ca6e6978a0eee5ca5ca71ceaaf2e7319e1f5c163d53b939c22c9065dddd2beb24a293f1cabdc335981b0f82982618b3d91cba8d387d69f404ec25906ce737dadc8083b4983e31d6d71efedb6ee670bed421ee62f3abcbfb2e5b8d576eb11e5a5d46d73a1d90ed20a36bffc6ccdd6718bfefda6f094725a32d3968fa471cb633c9952e853a36d9e76641dc404a57a128511d2684271f15a32c9b9e986bb180810a70f75b9456556bb407359cc30b50cd0ae6a1b524ccd1a0874fe8aa50446f389ba60de3616c3e84e1270ed9dddab8cfea4a9d7b6a0198250c0fd7e8dcd835d7d2fb1be0b275c97c7a26e4b05acf88b53c8ae1f8b6fa663a95535276357b7b0f3c204cc61fba9626fbae3a96e13199e6c592c83198fdd42564a891e038fea59ff1796c99ed499985bec712185fa1ad0f9b5c46a6589b836c8f0308ff74b306c42adf6414d7425a125e7d4a12f26b7760b9e39d7f80ecb00bf073bdec280412651ea5b4526fe0ba0afdb41df2242bb722869afc2a7e9ecbc4e1c0d62fdae7afe9966c9e38e07a1cc624198982ebeb5a9b4f9ce4d0c3223e88cfdcdd819cd65f932bfd013f8d3f311c730034a007511f0e723639ed68095341db84a538830e0f099035515149d80db43eb416ff6e852444813797c396e69ee60cb30cd356fcc8e65aa9ebad75f87c109d24b88cc8d3eb4442166c3f5cd6063930705e7084d447a82ce250062e5c894ccc269f268c89b74687b90d6e4b97ffd4dd1176bdc0f249973df502aebde4bad1ceed390127cacb782060fd6b978fff51f108879aa69d6426def5cfd189a27023570e392bff5b8377116ff4d751e2d1eee70680e3f7926d68d8096aa20b5119fb09020d0e2b2832eac1b4907a5d4d785c4cd93db96cd9e542a63c2e3d096293a323ebc90b6bac48ddb0b7cf1f94d3028b943b309779e7ac56b3f80495ec31d3cccfb798656e3e8d3f61329ec7c89970b8097ccea5ecda0a92fab053d129159c95c07cc04aee987c4ace462bb6ff8d818e0ecc53eea3ea396fdb54a62f6e5130d7dce37676b7a2b61a87dd97f99575ae20af93962732336137ae96f3c22a8bf38323c927000335e0adaa9413dd54f1a994163d73987215729f2d71fb1c342e0276c858db38bd421db222e6060092991bba429f3abd1125ca665033cec8839b74c201ffd9fa9a18f951fc698f5cac73d1e53f8715cd0d341b60a2f5417a543896bb5fb9e11c26384e62bad26b39d2174a6d1016b801b5cf84831c7ee9134b5b57596996b1f5bf176682b3cac0b9d2e4a8572afecad6a8e7b423e7c086b98eb4eb0d9292bc18c221da50fd6aaa529287b850a97352d2f936e0dce0c08f7cf7bc02621c9ade36e35a28014cf63c2e6a8c19b29f42180f6b6a99595fa9a6b5f86300ce884abafe7e98a602679751c0db00c22d924f25cf633557c2932cab597a2e3fa78d0a7fdcca54dc0c13ee0d9b8024835777b844b2810e395f3a70c52f21f6564ead87baf1c6f808033814e36875b40f0d11e159c157e7240dad7034271771b6d4865f9518e64f83dd9d0138abb840f08512ddee06edfb400745e60f5c9c29c8d4e1ffda9a5d06808909d298cf0d9b2d4726ff3cd0abaee29767789e0b8c26d2af15bdf87383aa36e22359b0978bbe0f4b241a3e408a3bc87797de0c41f41b0c75d8cf4f25d6b30793094f3dcb6c815829e8c40384747978c7170df6b134cd12facfcf232ba115a6ece390f7142207d6c35a6a038d1c1abd965d0f9b75d5304ccd2db249e8ed9b69d6c26ad6be7644fef981dc3260aefcfcee2331042ed5afb057e02a2ca0ab690fe7f86157052a6230c3ab05f782cb3a76bde530ce40bed9ceb71a4aaffb80b293b3f8a173b4b13c6f782a60da3750f0818a58e6cdf3db452ddcd707a722a00781cb95e5482615ac3a4d6a286d5a6680c572ccfd32ab87b469620c0a07a07dbcf7b2ae89967794fe8c65eb301a8aa9eadc73178607404d80c5d92a9249dd8527f0af54fb903d33676c1ca721f41182ece3765b40ce5c0c781a342b2b997486b73e0e94647f1ce8f68b6655c47f74df2056cab2eb6ddfc03de55ae6011adbdf4a21a06f23b4d76f10eb6c1c0a80f0ba23d32f11dc62c0f8140f5711588c73374203ed77df00a6091fc94bedc9d86797fbf63fadee53d9171150d08d80b70252e45d5661d81066fafdb730804affc324305d6beace434c2ce82e44aed8d2ac0169a41cfe1a244940e753f6009f224a135bc1e8cbfc1f1ecf670fde2a1edee2189d5619d3070a8849fad19de86b44e7dba87f5a0929e979c4374e05ea3e3a5484a83da450848d592d0905837625cee73dc8e87abe1d1917846ee16b6f642f2605ec3f7e597edf0880145963e8f5bbcca05257ed99f78d549bede9af965f9b4a2bc8cd6be0e1c4459a887e99451b2bc80142cd8840438187b03cc92e498e05315bcf88087d47fe9cde8c0395ae8509854ec63bfdcee760674baf6e178169c009958f91699e8265ce6a15d1836186ed45960d01509beb13a3a45329acec9719f588bbea06e40b5275ecbf390ce9632822c1e11cbde0fa1cfd57f08a8b5306cbbd763b0b45efd3ef12ea9f25d3a4de950bc71ef9574b7a237d9fa3a6512098c7ef3aaf4fd4abc4fe82048ea910c7c81adf0a3a432fcfc2f948cfe9d213773076c4d7c39e1c7ec64a1202970454d302dacff4f09ac85a88184900ec6fc5dc67b26996e240b5a043c596f42cbff88c1ecb5edaef3e4e190b4f9f5e945f27157006fece83120112fc895966e07ee0bf745c6170fe7f918159ca366f378bb7b1c5241bc334f3488606c3890cbbf48aad6245bd05e58242718996c058fc2fe8d150fc3616526dff035e50ee97de70a2ff66bfaa42e9683d64ce0a3455a695665febb508f348ede32938ac7bb3705466d80eada08eb75e7236984c2d36f3ec4054296616c71ec26665063471a9597c74a1f734417eb9ee18c4cf0269cd8823b107285a3a11ac439294111621fd2b2a08650b87c8c5d37ff532f71ef2054e62b78db8598929800449b8841e0a65e5c4e63be9e19a4cb752d09867355f9ca574b385e8c120e50ce7a5ee2c5c887f50e92f9f7919dLine truncated
|
||||
valid: false
|
||||
},
|
||||
TestSignatureVerifySLHSHA2128s{
|
||||
pbk: '90c17eea2ee4ecf9e9158339844171fce6891d26c11de869a81fbb3622fdf9cf'
|
||||
msg: 'b897f15adc12154cee4751cf79acb6f3d31768a21a2a9414b9176a9a5bfb4855c06f707f65'
|
||||
sig: '82fa9f26e48af74a9e987759ddd32f2c84cc4413d93f5f5ffdfaa6e9245294e735c22720a6975ce772cca6b73c5f25af1c53c30ee233ad8ffd12da19ed84fcfc9cba0d2accce27c75424ed2261801b28dc47a9ee6367837be72a7c651690734995ea8d9061fde894adb645f2d4a7406ca1836f285a66f91e7464b4131579d8b37ae71170321a7f072d5895ece5e7e2aadaf1f98bc47893c123a391cfbd207c40d38476a0d1438b5eb6400493bcb65f922307249e83db00981256c846e181872790854c940a9815348a7bf5ade59d09b723ec65a420c6de705371cab753126cc8f86b8e4129372ba758a4d19e9c5f761cc82a33f341393817ad1888b4d6bf7ce9ca1e993bcf3010a32d5663f52d694f2767fa02afdb9e726c27d43d7539fc9a7a8be1b4995a722403fa899c723f556b6c166898b87d1b65b73b9e98345323f5eea1811048ca2b5b3260624fcad17e0147d44885b0281b4e5c6389c5c265f0c25d61622f7c3dac2845986d39a818c9a660c98b9ddd6ca09d34e4036f303cc4d13709a883bd602d05e4c56c6c9956994e4267e793beac6c5c81f8a575c9c2ebeb02ae760a404b7715217b045d0c5100899a6557ed6f24c8abbd7c61715fa906faed0083c5299f6411815aef4d5cade4f0ce45e9413dc49dc20da13b86cf48d7259f2048608690862e0736a6e32101304c805a47028e28f1f44aadc15b5e7b3d6c8f596b85540f52a53f8920a28dc8954bb2d306cd98bb9d1d06e7cc6701bee38a21338db8bffb43ab4e3c192c782084fdf4a33b17addfd9d7760f201143f03278eb9519448648daa4d41c8a7208e03bc0a90c8cb6c81385a3fa3e68fa52185d8d0124781935d8d33e1dfb4933146004b58f9b39dd2ae8193b78ff3ecdde8e2a3289cd8e7f63e525db64ed3fb510a8c671b8934e19a9dd8b487051af806c4e6e927a636e969372373ade00037a698f5e73a3c98050e1d29de40400289b1aae620968267cefb49ada722981516daaf4ed7659776ea685e2b7e039bacdffda2306b158cd81da0bbee7ca8fcb3fbe3754b1588244bf8fbd0fb246f76496b5865698329f0591ea2fdf3be22a2e10c2fe619baf35bd9f55ed86d6664c28fe7ae8e837d7e968ea0def2fca17506ae037e4a08bef94bb9dd4056ff2c6fbb2661f6ba3c7fd64eeb43bbba60c8d9d8ec7bf7fef28a462122d9ebf436c111d7e19b3db7dddf8f882aa9793012a945457543e2dac850bcf62d82ff667000c984ec4bd1f653ad38a12c3103eafb04ed211f9201e040f560cdcd9df18515df9cbdce835b7499759588547838e1f04d509efa2ec588fa204b58570cebaeddeb3bd92e4dbfbeb28a132d8f6d91f0e193872ef1bfff0ee585ae0146cd685abfc4a8d67411a56de18663fbd30991a5edc85ca5c1ed256a3bacc4f8ca3a469486efdf72d5e625090242b36db2d746af30b69cc4862e3a3a55b17cab1071cff25a90b0206b3f33f38b740dc8f0fd2121bd08fd521c332b5c9ac59a8f93c6611437d965be1e9893f5a806e595f16e6dd3ffe1b71234885d54fd9aa9309bc41f4a38d07a6cc14be015f18168bbde115df49639e8390078a69c80917025c144fb57b225424a86c256a3b9cb1535cae0b9914c23bebfe5454360e37d9e47224f9ed55896af15f0cef5bb3df931037eb900490017952883862ff37d0ac4aed95b7b744720c8a39d5f1fe1abaf4633da564e743471b7f6fe6f081bcd44fdb234ecde612259b44499828a54bb44096fddaa6a7111034ed81a202878d45632ffef6d9b6154d2cd04d5869714f4e03238b2f03656ed64adefe73ed3ae567f8f55fcdca2d22760eba588737e4f05292725cdb5f71e33e4b7e2aa62d61487fde9430fc674ff9b7a73cde7ba6ab261c7f7bc67c10248afb494a7e3b358194163f1e07b70017f80d63dd7d33995050efc17599fb952066bf066ea205fcf8b61075474db2a79c77e7b11f2429315ea5bb1362402aa74f3506f15ff930b1cf5f7a1e8c154c57c2edce3a1cc71614b3359a96324606e62df001cb18c5a0a1e496bb44fc7d9c09f4fedad5baba050445dd2afc8ab4d17a77ba15ed8cef6c811a94e3d7265cc4a2e666a0a4dcef9e25bb4481339988e0805a968d45f547df5fe69d69db368316e59d121c5158e3c76115f368aaf106ba5c22b50c00a66251741d9eb77d5c7829899d39ec14a0cbb1098f6fa397cec02af59837fa7bf6b58cb8fdd37cc7310a1187ba3b01e4df9ae0516cebb6faeef2fbd9677da60363f10bbc4f42facbe44baf4c9f612abf8abaa22e2cfe5fbc92efa2688640f0b624da291ea526137d191be8fe59b0c507787e6f4f6595bd469be0b3709a7601b0de610cdca0a6536b06d1ed699ae5f87f5ae15560de70ba35f72ec8cf38523f6e95ec8bb61df7f09e8694acd26efa161dc79abd69b78d2ef9a678e8be5bdbc3d242b31052a5a5cb714f833860d83fec3aa5e62e2f82f9e6cb7cf015d176801ce1604f67d95d08bea08d7901e706f496a4a370cabb8c94fb93f9a5d6f7c18f1ec5b5c5e68f637ffa8a64ab6ff22629e0a676356b239e3e542cfb1358b5152d01a4ad46827c4fc2a29df74be89c9a918abacdfa33356bf80d55db7549f4a1dbeb6c103280f7f0a665eb1e4f0e9996c09b1240e7dcda49090bd79fb545d5c0342b8e8ae64d7fe5c066d52a4b06d23cd7b7c8e8e0979f8e5afbe41e09d5f19e3f8bf8543c4f5eedf8a63373a41b2013ee9ee8a48031110fbce08b681d1c3cf222e8004c0bf62c86c2e028b7e05886e6f45b469545c8012c58000a3a7091b5dd494da9dfc92d3be6b4c958e3981691067ed1d2171a93b38a85d64c0ac2c16c3142650de9b4aa370cdee4bdf6bc6dc9bd26469249d3dbe25d2acdfcab7cc8290dc6ef0ee34ce94a8a3243f545e2aa1a2ff27f7abc0b66676aede777aac8118255192db878e3ac77f93d9ff72c7cab6649c7d5f0ef03f883f5c312dc26beb487da8d185c0af971000e95f75e58a9ec3bface61d7111dc8301f1c5f892e1421dc5142ef521bd99ea9ce71ddc41acd59b038927891602fcdc20bd9813a14625434b7570d00e55c39ae3553403d7508c1ff4e45fd5f63041806de5dd6c0ab74299608ceb7925e477b48a7a1ef6144de0d5129f495a950f09c2fef3ccd8644207d26363867bac76af02bbefd84e3c910019aff835cdeb7ddcf698a33cd4cb0a69615861bb7962b5d6a96a5ff789f3006230ed3f330e3889cf513c4a6f866f4591810a654136f04ff17998eb264b31f1bed329c00a92b15c9beefdfbcbe107b7907f8e7e575cc5abe420179c5b94eec9c349c16d8ba1023f82afc67fa558de921fb4afd90a2bab3c1bf38298b266f59ef014c5b579dcab91e10f9506145e421c0d3363daa038a1eb9b77b282211d6394c6d71c0f26fc91076f39cb57d52cb5b9c7434229bbbd9fb856836b032e91451a787ebe1889eeaacb4284f57327dc4e93474530533fe8aa524758dd64bdaf747e51cf7bfd44027f9ae94dafa5d050Line truncated
|
||||
valid: false
|
||||
},
|
||||
TestSignatureVerifySLHSHA2128s{
|
||||
pbk: '95ab9f808b34e34796c4f7b09c554bed61e8bb8800a12dda2fc80d0c45420c3b'
|
||||
msg: '42f78db178ee85a9ad1131e87e4a0d'
|
||||
sig: 'd9c0a55cc8c58bf37c8c2b5dee94415dbce233d9a0240d0a3260bf21d4ad5abdc47884ac7bd539806b36d34890ac3c19a9c048bc1c71eaeb2c21195dde14a2c811a68cad55b65198b7bd267683161de8c02e9368c2c648f5e83ab8c18c54a1ceee137b8bafa6544769fbfdea1e6d30c4abf38803af57120706ee25eb11aa744cce44d47b561b90b682c32a658a9e4393e9c3f6ae7b60b54ffb30f686e81ac0e0010e17311759a6d66565e1ca61f9ca06a2470d008590c50d87f70d36ed23f3039125195d60bc7803685d11dfa69a0ec11771df7be6d3c1cdf33f5517cd07e1d87087863a7039a3896af3e351827c13269bb42d601a8586a8dfa98c205be880e96fd2775806d2a02742d4ad55e1d067401a9bc710a0dbee443cee791508849e975c572e9dff01a9e3686c1c3adc2a9a5b10391e415f5c2a7547b6b24ee6b94bb6fc769abaf48db8ac0f21666d4f858732641d20d4b9c236cd5851da2e735e374395da78916ac9cffc147260446e8a08d9221624f4531339173ec7ef423d1eb2882b276aa3664efee703b319a599914f84005961fa569fdf1999ebc886c24e5527d4e07d5455125ffbe2fa00fb005054d9a4dc9d1c21b13254517c2bb05375fda9f7582c395b87fa4e7afac1eae6eb054cc7f3f79d20346582d4d06ff079defda9faea1c3873b8ad1a7f08a632c98f4d0ca1b7304a67c9cb2892be3b29591f6ce96266e234af6df22db20b6a96a41b467a333caf81eb60a4d0707769aba789e128be14814e2316195019be5606d2b6aa4421f15c653c7dd3a565f0a7fac375d17dbbe019482ba70b61481614cc03f8d38a8419d461fa7cd0c68626efee5de5d8ea80b4cfd72a2c560d1d6074769b93abbcf9105e0ab510cab584b2d3855b7e5f1ff4502b745148f7d2d34b9e2c778db5cf8aea866b9f63906ad875a1c225bf679a958887b28b32722f12d68fac1ffbe8ee0d3a44f2e3ee0c2567a8aeb811b6e92b87ac252a00cc725b9f6ee94d242201710e653f18738e98ec7c6c61875bbc81c3f3715ee67cc44b421e5e6481d4a7062a25468b99ffad9172031347aa86ea192d0e7f6ee6b070bddb72df1c872041bad6fe61acf71d1237ed12344a9035852ccc3ecb7343c2f189c75bbe53af2c7c9b8b644eae071579ccd7c156aaf1dec22c7d682178ed1f8e2b48cc22883c2ac63218e037241d88fba6adc0fc3abd6c56621276bf48517ea2056554510422209f7b580f4a11e1776df20d3cfe4db1eccb1c0f3c078af12a2cef84c4b0ebad9755f10f3416f78b027b95b40a0c1a7abd8c755699cf4763f74b6fb8c598cfda9d93fdb5f8685d466f2f9d8255b2dd643e4229d1258e2cf596a0a631ad6b68b0af8bbc5fb2c27d18b0d65346023ecab329e111316a1b757605b4b54dccf1d2f944fb59dabf1a69ef860f3847fb89b274a7f50dfade31f216a8b5936d2f8ad181a2f4b723c47509c3532f0bd40b01029239761119438c67475df231fbf428c468c2156625420c655fbf3b93d858064b1d5b7fa564276c3d19b09540406387c77ff95e7e0c14245a9cde6e14d3dfe52b77c30bf3b2176502468724fa47159f6feec63d020630ec6f79a6e21afe02c7659f56692d21728180922633e863e2df5114e1457403af56690caa28a88c28cb8c0548479996250f08147dd7b41e8a340f7b22bc406a9a7a72f76ac71cbd1377e953512637ce79cdab058e012a923e44d7f34ad3257053342ead7b42360b28db7d13fb52c32dc26c8b09707fdd022f440af5d1ba5e8eab4dc812553eb3f8f2cfcfef660f5256f3d643b44ace6167daa9e6e51656a29447b9802d0cb32ea5464baddfe972ff89942ddbcc2ae8d55d9107ff98579a9b59fd8d7f35594af3584a288f1fa30d9e378c8d4b6b2b35e1441fc2c679c5c4ac2bd7e7679975d073d4a15ecb8f8bdb27b18dce1e850cca6ba6d6b6969c161c52f2cb82b74272e4f8145e0c0e1a721e46f3d60af2886eab7c4368893adff3cdfe3a9f4a9f713ffb0314238120059b1754ddade3cfc757ff5f4db4a87c26f0e34aadbe7efcc63f21cadd3d20c30f810e0712a1e48b095cf6f36ffdbcf87e981db7d6295fcfdf20d72ba4ff991a8021ca77440040b51132a3500eff2724817d393f4222c11b137aa9669ec8f8fc599d1574134bddb315021cfd7f943ff295748776b709176731912d099d017a46bd70f61bc97f74103c3a3cdd769cd8f9eba34e32dc7e21cd64aa2c328bb45100f4f7f69cf179087d35cd87a5cc8973b1e02783e7b4d57c157768e94313a69e83014ef0ae1dda85d5778d5d0f40d3500c06be0793ca3b01419359cef3905b8e28d27f6c63e790bfa92eff37c105d0a39d559743c57b49ae2fc5687813e69521934bb6e4b565650a4181e1ce3e76a13089e2dd5527b83973e72ec4fda294148e353eb5c042863b3759cffc270f962cefa6770fdc9ab627d5f0aed88bdc6d166b11846dff032ef19c3f46eaa77882f83d702eab4a3adbf9613dd743cc2179defda22313c22d19b46338324b63b05bc3e75954e87a3b697358ae0c344031792e126b2fbf2d9023661d0a907d84f126df5760d010371eafb3e38287f54e1034933aa577e8a2ef9b242507e51e6e64e7186e36743d6c0c6e34a8c7f34dca046a9b8c4775abd04455dd6812fd5989bcb34cab2ce7e014e695ce86beb8af90440623e504e014b9e4eb9cd9e1e2a7d4fa48beda9f73e2ba812b130bcc970f4b0014b8a4a60635fe72692f8cc843743f3972c08cc988c3478b4f6993e9c3cbb89874dcacbc7d6d3d58c56357cae0343350b18d925707066650f98c3b2359e085d47f602d50f29ea0d2016f5a67c196288e9eb316f8d48c339fa196d160a93ad0191b5a33eb7885ecb6c8d502b3d96c9ebf8b7ed21d41eb4fc7dea758fea8dec14fe2137418ead09d4565ccf097437ff6388091e3fb73947ebd1e51e70a0fb64fea99233ffcd7a9b2fe594d9369b2f90b583c62ed80a8b778e7f69d7d5705c7603dfca9f18f0230637bdd6947aadfa835f21aeca12aaa1e4203f95457ae7b7e0bef97540205a6242adf32a93b361a6fed0f1a0326e50d9974cd0935a882ff78a7cc8d8db36a170553ef4ef82eb8429a912c0eb73bf5ba9060fa4d7ef089d41e320b30f23c9340e826a54548257e7036cd7d1feed64bbd6d44baba1de09ac540cb558c50062c41bcb8eb942eb921199bbc368be47ff9edf4c689313441a30b3deece5a3931bd67f35a1b0f2b462abd98b7e21ae28206f6ba35367f94bb2551479bfb8d55776f1b22dc537fa3b94471c2762a2d5cae6a6a1fe375a5dd99d89e37dc0dde775620d1ade011675c5e82a3223472c6b481fab153fbbd1b686337f5e85fd58df835806039253ed2414d32dba8ebd89caf7eff1466a69bfdcc2905a9956017509007dfaed4c268c062defe70ceb1d3d74e8bcf03c3c1b3cca572e7cc7aff07d8ef6c269382f37d3489edbf2177afca9b05b548f62deee2bc2684c7f7aa15f5a4ca1b4b96f4395Line truncated
|
||||
valid: false
|
||||
},
|
||||
]
|
||||
@@ -0,0 +1,28 @@
|
||||
// Copyright (c) blackshirt. All rights reserved.
|
||||
// Use of this source code is governed by an MIT license
|
||||
// that can be found in the LICENSE file.
|
||||
// vtest build: has_modern_openssl?
|
||||
import x.crypto.slhdsa
|
||||
|
||||
fn test_slhdsa_basic_default_functionality() ! {
|
||||
// creates default key
|
||||
mut pvkey := slhdsa.PrivateKey.new()!
|
||||
|
||||
// example of message
|
||||
xmsg := 'Sample message'.bytes()
|
||||
|
||||
// signing the message with the key
|
||||
sig := pvkey.sign(xmsg)!
|
||||
|
||||
// example of public key
|
||||
mut pbkey := pvkey.public_key()!
|
||||
|
||||
// verify signature with the public key
|
||||
verified := pbkey.verify(sig, xmsg)!
|
||||
println(verified)
|
||||
assert verified == true
|
||||
|
||||
// release
|
||||
pvkey.free()
|
||||
pbkey.free()
|
||||
}
|
||||
Reference in new issue
Block a user