Skip to content

Commit 736e5e1

Browse files
committed
Merge branch 'master' into ml-dsa
2 parents 7663d0b + 9265f5c commit 736e5e1

File tree

3 files changed

+61
-2
lines changed

3 files changed

+61
-2
lines changed

.github/workflows/slh-dsa.yml

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,24 @@ env:
1717
RUSTFLAGS: "-Dwarnings"
1818

1919
jobs:
20+
no_std:
21+
runs-on: ubuntu-latest
22+
strategy:
23+
matrix:
24+
target:
25+
- thumbv7em-none-eabi
26+
- wasm32-unknown-unknown
27+
rust:
28+
- 1.81.0 # MSRV
29+
- stable
30+
steps:
31+
- uses: actions/checkout@v4
32+
- uses: dtolnay/rust-toolchain@master
33+
with:
34+
toolchain: ${{ matrix.rust }}
35+
targets: ${{ matrix.target }}
36+
- run: cargo build --target ${{ matrix.target }} --no-default-features
37+
2038
test:
2139
runs-on: ubuntu-latest
2240
strategy:

lms/src/lms/private.rs

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ impl<'a, Mode: LmsMode> TryFrom<&'a [u8]> for SigningKey<Mode> {
176176
Ordering::Greater => Err(LmsDeserializeError::TooLong),
177177
Ordering::Equal => {
178178
// pk is now guaranteed to be of the form otstype || q || id || seed
179-
let (otstype, qk) = pk.split_at(ID_LEN);
179+
let (otstype, qk) = pk.split_at(4);
180180
let (q, idseed) = qk.split_at(4);
181181
let (id, seed) = idseed.split_at(ID_LEN);
182182

@@ -200,10 +200,11 @@ impl<'a, Mode: LmsMode> TryFrom<&'a [u8]> for SigningKey<Mode> {
200200

201201
#[cfg(test)]
202202
mod tests {
203-
use super::SigningKey;
203+
use super::{SigningKey, VerifyingKey};
204204
use crate::lms::modes::{LmsSha256M32H10, LmsSha256M32H5};
205205
use crate::ots::modes::{LmsOtsSha256N32W4, LmsOtsSha256N32W8};
206206
use hex_literal::hex;
207+
use hybrid_array::Array;
207208
use signature::{RandomizedSignerMut, SignatureEncoding};
208209

209210
// Known-Answer Test vectors from <https://datatracker.ietf.org/doc/html/rfc8554#appendix-F>
@@ -359,4 +360,43 @@ mod tests {
359360
assert_eq!(sig.len(), expected_signature.len());
360361
assert_eq!(sig, expected_signature)
361362
}
363+
364+
#[test]
365+
fn test_signing_key_to_bytes_and_back() {
366+
let seed = hex!("558b8966c48ae9cb898b423c83443aae014a72f1b1ab5cc85cf1d892903b5439");
367+
let id = hex!("d08fabd4a2091ff0a8cb4ed834e74534");
368+
let expected_k = hex!("32a58885cd9ba0431235466bff9651c6c92124404d45fa53cf161c28f1ad5a8e");
369+
370+
let lms_priv =
371+
SigningKey::<LmsSha256M32H10<LmsOtsSha256N32W4>>::new_from_seed(id, seed).unwrap();
372+
373+
let lms_priv_bytes: Array<_, _> = lms_priv.into();
374+
let lms_priv_bytes: &[u8] = &*lms_priv_bytes;
375+
let lms_priv: SigningKey<LmsSha256M32H10<LmsOtsSha256N32W4>> =
376+
lms_priv_bytes.try_into().unwrap();
377+
378+
let lms_pub = lms_priv.public();
379+
assert_eq!(lms_pub.k(), expected_k);
380+
assert_eq!(lms_pub.id(), &id);
381+
}
382+
383+
#[test]
384+
fn test_public_key_to_bytes_and_back() {
385+
let seed = hex!("558b8966c48ae9cb898b423c83443aae014a72f1b1ab5cc85cf1d892903b5439");
386+
let id = hex!("d08fabd4a2091ff0a8cb4ed834e74534");
387+
let expected_k = hex!("32a58885cd9ba0431235466bff9651c6c92124404d45fa53cf161c28f1ad5a8e");
388+
389+
let lms_priv =
390+
SigningKey::<LmsSha256M32H10<LmsOtsSha256N32W4>>::new_from_seed(id, seed).unwrap();
391+
392+
let lms_pub = lms_priv.public();
393+
394+
let lms_pub_bytes: Array<_, _> = lms_pub.into();
395+
let lms_pub_bytes: &[u8] = &*lms_pub_bytes;
396+
let lms_pub: VerifyingKey<LmsSha256M32H10<LmsOtsSha256N32W4>> =
397+
lms_pub_bytes.try_into().unwrap();
398+
399+
assert_eq!(lms_pub.k(), expected_k);
400+
assert_eq!(lms_pub.id(), &id);
401+
}
362402
}

slh-dsa/src/util.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ pub fn split_digest<P: ForsParams>(digest: &Array<u8, P::M>) -> (&Array<u8, P::M
4949

5050
#[cfg(test)]
5151
pub mod macros {
52+
/// Generate a test case
5253
#[macro_export]
5354
macro_rules! gen_test {
5455
($name:ident, $t:ty) => {

0 commit comments

Comments
 (0)