pub struct QuantumSignature { /* private fields */ }Expand description
Quantum-safe one-time digital signature key pair.
Implements a Lamport one-time signature (Lamport, 1979): a hash-based
scheme whose security rests only on the one-wayness of a hash function,
not on factoring/discrete-log assumptions that Shor’s algorithm breaks –
making it “quantum-safe” in the sense this module’s name advertises,
unlike the previous XOR-based placeholder. Verification (see
QuantumSignatureVerifyingKey::verify) uses only the public key,
structurally correcting the previous bug where verify could only be
called by whoever held the private key.
This is genuinely a one-time signature scheme: signing two
different messages with the same key pair reveals enough of the private
key to forge further signatures, exactly as with real Lamport signatures.
A new QuantumSignature::new key pair should be generated per message.
Implementations§
Source§impl QuantumSignature
impl QuantumSignature
Sourcepub fn new(security_bits: usize, algorithm: &str) -> Result<Self>
pub fn new(security_bits: usize, algorithm: &str) -> Result<Self>
Creates a new quantum signature key pair.
Examples found in repository?
129fn run_signature_example() -> Result<()> {
130 println!("\nQuantum Digital Signatures");
131 println!("-------------------------");
132
133 // Create quantum signature with 256 qubits
134 let num_qubits = 256;
135 println!("Creating quantum signature scheme with {num_qubits} qubits");
136
137 // Choose a quantum-resistant algorithm
138 let algorithm = "Dilithium";
139 println!("Using algorithm: {algorithm}");
140
141 let signature = QuantumSignature::new(num_qubits, algorithm)?;
142 println!("Quantum signature scheme created");
143
144 // Sign a message
145 let message = b"This message is quantum-signed";
146 println!(
147 "Signing message: '{}'",
148 std::str::from_utf8(message).unwrap()
149 );
150
151 let start = Instant::now();
152 let sig = signature.sign(message)?;
153 println!("Signature generated in {:.2?}", start.elapsed());
154 println!("Signature size: {} bytes", sig.len());
155
156 // Verify signature
157 println!("Verifying signature...");
158 let start = Instant::now();
159 let is_valid = signature.verify(message, &sig)?;
160 println!("Verification completed in {:.2?}", start.elapsed());
161
162 if is_valid {
163 println!("✓ Signature verification successful!");
164 } else {
165 println!("✗ Signature verification failed!");
166 }
167
168 // Try with tampered message
169 let tampered = b"This message has been modified";
170 println!("Verifying signature with tampered message...");
171 let is_valid = signature.verify(tampered, &sig)?;
172
173 if is_valid {
174 println!("✗ Signature incorrectly verified on tampered message!");
175 } else {
176 println!("✓ Signature correctly rejected tampered message!");
177 }
178
179 Ok(())
180}Sourcepub fn sign(&self, message: &[u8]) -> Result<Vec<u8>>
pub fn sign(&self, message: &[u8]) -> Result<Vec<u8>>
Signs a message: hashes it with SHA-256, then reveals one of the two private-key preimages per digest bit (selected by that bit’s value).
Examples found in repository?
129fn run_signature_example() -> Result<()> {
130 println!("\nQuantum Digital Signatures");
131 println!("-------------------------");
132
133 // Create quantum signature with 256 qubits
134 let num_qubits = 256;
135 println!("Creating quantum signature scheme with {num_qubits} qubits");
136
137 // Choose a quantum-resistant algorithm
138 let algorithm = "Dilithium";
139 println!("Using algorithm: {algorithm}");
140
141 let signature = QuantumSignature::new(num_qubits, algorithm)?;
142 println!("Quantum signature scheme created");
143
144 // Sign a message
145 let message = b"This message is quantum-signed";
146 println!(
147 "Signing message: '{}'",
148 std::str::from_utf8(message).unwrap()
149 );
150
151 let start = Instant::now();
152 let sig = signature.sign(message)?;
153 println!("Signature generated in {:.2?}", start.elapsed());
154 println!("Signature size: {} bytes", sig.len());
155
156 // Verify signature
157 println!("Verifying signature...");
158 let start = Instant::now();
159 let is_valid = signature.verify(message, &sig)?;
160 println!("Verification completed in {:.2?}", start.elapsed());
161
162 if is_valid {
163 println!("✓ Signature verification successful!");
164 } else {
165 println!("✗ Signature verification failed!");
166 }
167
168 // Try with tampered message
169 let tampered = b"This message has been modified";
170 println!("Verifying signature with tampered message...");
171 let is_valid = signature.verify(tampered, &sig)?;
172
173 if is_valid {
174 println!("✗ Signature incorrectly verified on tampered message!");
175 } else {
176 println!("✓ Signature correctly rejected tampered message!");
177 }
178
179 Ok(())
180}Sourcepub fn verify(&self, message: &[u8], signature: &[u8]) -> Result<bool>
pub fn verify(&self, message: &[u8], signature: &[u8]) -> Result<bool>
Verifies a signature using this key pair’s public key. Structurally
identical to QuantumSignatureVerifyingKey::verify – exposed here
too so existing callers that only have a full QuantumSignature
(e.g. the signer itself, checking its own work) do not need to call
Self::verifying_key first.
Examples found in repository?
129fn run_signature_example() -> Result<()> {
130 println!("\nQuantum Digital Signatures");
131 println!("-------------------------");
132
133 // Create quantum signature with 256 qubits
134 let num_qubits = 256;
135 println!("Creating quantum signature scheme with {num_qubits} qubits");
136
137 // Choose a quantum-resistant algorithm
138 let algorithm = "Dilithium";
139 println!("Using algorithm: {algorithm}");
140
141 let signature = QuantumSignature::new(num_qubits, algorithm)?;
142 println!("Quantum signature scheme created");
143
144 // Sign a message
145 let message = b"This message is quantum-signed";
146 println!(
147 "Signing message: '{}'",
148 std::str::from_utf8(message).unwrap()
149 );
150
151 let start = Instant::now();
152 let sig = signature.sign(message)?;
153 println!("Signature generated in {:.2?}", start.elapsed());
154 println!("Signature size: {} bytes", sig.len());
155
156 // Verify signature
157 println!("Verifying signature...");
158 let start = Instant::now();
159 let is_valid = signature.verify(message, &sig)?;
160 println!("Verification completed in {:.2?}", start.elapsed());
161
162 if is_valid {
163 println!("✓ Signature verification successful!");
164 } else {
165 println!("✗ Signature verification failed!");
166 }
167
168 // Try with tampered message
169 let tampered = b"This message has been modified";
170 println!("Verifying signature with tampered message...");
171 let is_valid = signature.verify(tampered, &sig)?;
172
173 if is_valid {
174 println!("✗ Signature incorrectly verified on tampered message!");
175 } else {
176 println!("✓ Signature correctly rejected tampered message!");
177 }
178
179 Ok(())
180}Sourcepub fn verifying_key(&self) -> QuantumSignatureVerifyingKey
pub fn verifying_key(&self) -> QuantumSignatureVerifyingKey
Extracts a standalone QuantumSignatureVerifyingKey containing only
the public key, for distribution to verifiers.
Sourcepub fn public_key_bytes(&self) -> Vec<u8> ⓘ
pub fn public_key_bytes(&self) -> Vec<u8> ⓘ
Serializes this key pair’s public key; see
QuantumSignatureVerifyingKey::to_bytes.
Trait Implementations§
Source§impl Clone for QuantumSignature
impl Clone for QuantumSignature
Source§fn clone(&self) -> QuantumSignature
fn clone(&self) -> QuantumSignature
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreAuto Trait Implementations§
impl Freeze for QuantumSignature
impl RefUnwindSafe for QuantumSignature
impl Send for QuantumSignature
impl Sync for QuantumSignature
impl Unpin for QuantumSignature
impl UnsafeUnpin for QuantumSignature
impl UnwindSafe for QuantumSignature
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> Pointable for T
impl<T> Pointable for T
impl<T> Read<Exclusive, BecauseExclusive> for Twhere
T: ?Sized,
Source§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
Source§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self from the equivalent element of its
superset. Read moreSource§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
self is actually part of its subset T (and can be converted to it).Source§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset but without any property checks. Always succeeds.Source§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self to the equivalent element of its superset.