diff --git a/src/signature.rs b/src/signature.rs index e51ec45..7799ec6 100644 --- a/src/signature.rs +++ b/src/signature.rs @@ -203,6 +203,15 @@ pub trait SignatureScheme { message: &[u8; MESSAGE_LENGTH], sig: &Self::Signature, ) -> bool; + + /// Get public key corresponding to given secret key. + /// + /// ### Parameters + /// * `sk`: A reference to the secret key. + /// + /// ### Returns + /// Public key corresponding to given secret key. + fn get_public_key(sk: &Self::SecretKey) -> Self::PublicKey; } pub mod generalized_xmss; diff --git a/src/signature/generalized_xmss.rs b/src/signature/generalized_xmss.rs index 69f1756..74ec20b 100644 --- a/src/signature/generalized_xmss.rs +++ b/src/signature/generalized_xmss.rs @@ -826,10 +826,8 @@ where ¶meter, roots_of_bottom_trees, ); - let root = top_tree.root(); // assemble public key and secret key - let pk = GeneralizedXMSSPublicKey { root, parameter }; let sk = GeneralizedXMSSSecretKey { prf_key, parameter, @@ -841,6 +839,7 @@ where right_bottom_tree, _encoding_type: PhantomData, }; + let pk = Self::get_public_key(&sk); (pk, sk) } @@ -1003,6 +1002,13 @@ where &sig.path, ) } + + fn get_public_key(sk: &Self::SecretKey) -> Self::PublicKey { + Self::PublicKey { + root: sk.top_tree.root(), + parameter: sk.parameter, + } + } } impl Encode for GeneralizedXMSSPublicKey {