1use blake3::Hasher;
46use curve25519_dalek::constants::RISTRETTO_BASEPOINT_POINT;
47use curve25519_dalek::ristretto::RistrettoPoint;
48use curve25519_dalek::scalar::Scalar;
49use rand::RngCore;
50use serde::{Deserialize, Serialize};
51use thiserror::Error;
52
53#[derive(Debug, Error)]
54pub enum AdaptorError {
55 #[error("Invalid public key")]
56 InvalidPublicKey,
57 #[error("Invalid signature")]
58 InvalidSignature,
59 #[error("Invalid adaptor point")]
60 InvalidAdaptorPoint,
61 #[error("Secret extraction failed")]
62 SecretExtractionFailed,
63 #[error("Serialization error: {0}")]
64 Serialization(String),
65}
66
67pub type AdaptorResult<T> = Result<T, AdaptorError>;
68
69fn random_scalar() -> Scalar {
71 let mut bytes = [0u8; 32];
72 rand::thread_rng().fill_bytes(&mut bytes);
73 Scalar::from_bytes_mod_order(bytes)
74}
75
76#[derive(Clone, Serialize, Deserialize)]
78pub struct AdaptorSecretKey(Scalar);
79
80#[derive(Clone, Copy, Debug, Serialize, Deserialize)]
82pub struct AdaptorPublicKey(RistrettoPoint);
83
84#[derive(Clone, Serialize, Deserialize)]
86pub struct AdaptorSecret(Scalar);
87
88#[derive(Clone, Copy, Debug, Serialize, Deserialize)]
90pub struct AdaptorPoint(RistrettoPoint);
91
92#[derive(Clone)]
94pub struct AdaptorSigner {
95 secret_key: AdaptorSecretKey,
96 public_key: AdaptorPublicKey,
97}
98
99#[derive(Clone, Copy, Debug, Serialize, Deserialize)]
101pub struct PreSignature {
102 r_prime: RistrettoPoint, s_prime: Scalar, }
105
106#[derive(Clone, Copy, Debug, Serialize, Deserialize)]
108pub struct AdaptorSignature {
109 r: RistrettoPoint,
110 s: Scalar,
111}
112
113impl AdaptorSecret {
114 pub fn random() -> Self {
116 Self(random_scalar())
117 }
118
119 pub fn from_bytes(bytes: &[u8; 32]) -> Self {
121 Self(Scalar::from_bytes_mod_order(*bytes))
122 }
123
124 pub fn to_bytes(&self) -> [u8; 32] {
126 self.0.to_bytes()
127 }
128
129 pub fn to_point(&self) -> AdaptorPoint {
131 AdaptorPoint(RISTRETTO_BASEPOINT_POINT * self.0)
132 }
133}
134
135impl AdaptorPoint {
136 pub fn from_bytes(bytes: &[u8; 32]) -> AdaptorResult<Self> {
138 let point = curve25519_dalek::ristretto::CompressedRistretto(*bytes)
139 .decompress()
140 .ok_or(AdaptorError::InvalidAdaptorPoint)?;
141 Ok(Self(point))
142 }
143
144 pub fn to_bytes(&self) -> [u8; 32] {
146 self.0.compress().to_bytes()
147 }
148}
149
150impl AdaptorSigner {
151 pub fn new() -> Self {
153 let secret = random_scalar();
154 let public = RISTRETTO_BASEPOINT_POINT * secret;
155
156 Self {
157 secret_key: AdaptorSecretKey(secret),
158 public_key: AdaptorPublicKey(public),
159 }
160 }
161
162 pub fn from_bytes(bytes: &[u8; 32]) -> AdaptorResult<Self> {
164 let secret = Scalar::from_bytes_mod_order(*bytes);
165 let public = RISTRETTO_BASEPOINT_POINT * secret;
166
167 Ok(Self {
168 secret_key: AdaptorSecretKey(secret),
169 public_key: AdaptorPublicKey(public),
170 })
171 }
172
173 pub fn public_key(&self) -> AdaptorPublicKey {
175 self.public_key
176 }
177
178 pub fn to_bytes(&self) -> [u8; 32] {
180 self.secret_key.0.to_bytes()
181 }
182
183 pub fn create_pre_signature_with_secret(
191 &self,
192 message: &[u8],
193 adaptor_secret: &AdaptorSecret,
194 ) -> AdaptorResult<PreSignature> {
195 let adaptor = adaptor_secret.to_point();
196
197 let k = random_scalar();
199 let r = RISTRETTO_BASEPOINT_POINT * k;
200
201 let r_prime = r + adaptor.0;
203
204 let challenge = compute_challenge(&r_prime, &self.public_key, message);
206
207 let s_prime = k + challenge * self.secret_key.0;
209
210 Ok(PreSignature { r_prime, s_prime })
211 }
212
213 pub fn create_pre_signature(
219 &self,
220 message: &[u8],
221 adaptor: &AdaptorPoint,
222 ) -> AdaptorResult<PreSignature> {
223 let k = random_scalar();
228 let r = RISTRETTO_BASEPOINT_POINT * k;
229
230 let r_prime = r + adaptor.0;
232
233 let challenge = compute_challenge(&r_prime, &self.public_key, message);
235
236 let s_prime = k + challenge * self.secret_key.0;
239
240 Ok(PreSignature { r_prime, s_prime })
241 }
242}
243
244impl Default for AdaptorSigner {
245 fn default() -> Self {
246 Self::new()
247 }
248}
249
250impl AdaptorPublicKey {
251 pub fn from_bytes(bytes: &[u8; 32]) -> AdaptorResult<Self> {
253 let point = curve25519_dalek::ristretto::CompressedRistretto(*bytes)
254 .decompress()
255 .ok_or(AdaptorError::InvalidPublicKey)?;
256 Ok(Self(point))
257 }
258
259 pub fn to_bytes(&self) -> [u8; 32] {
261 self.0.compress().to_bytes()
262 }
263}
264
265fn compute_challenge(r: &RistrettoPoint, pubkey: &AdaptorPublicKey, message: &[u8]) -> Scalar {
267 let mut hasher = Hasher::new();
268 hasher.update(&r.compress().to_bytes());
269 hasher.update(&pubkey.0.compress().to_bytes());
270 hasher.update(message);
271
272 let hash = hasher.finalize();
273 Scalar::from_bytes_mod_order(*hash.as_bytes())
274}
275
276pub fn verify_pre_signature(
280 pubkey: &AdaptorPublicKey,
281 message: &[u8],
282 pre_sig: &PreSignature,
283 adaptor: &AdaptorPoint,
284) -> bool {
285 let r = pre_sig.r_prime - adaptor.0;
287
288 let challenge = compute_challenge(&pre_sig.r_prime, pubkey, message);
290
291 let lhs = RISTRETTO_BASEPOINT_POINT * pre_sig.s_prime;
293 let rhs = r + challenge * pubkey.0;
294
295 lhs == rhs
296}
297
298pub fn complete_signature(
303 pre_sig: &PreSignature,
304 secret: &AdaptorSecret,
305) -> AdaptorResult<AdaptorSignature> {
306 let r = pre_sig.r_prime;
308
309 let s = pre_sig.s_prime + secret.0;
311
312 Ok(AdaptorSignature { r, s })
313}
314
315pub fn verify_adaptor_signature(
317 pubkey: &AdaptorPublicKey,
318 message: &[u8],
319 signature: &AdaptorSignature,
320) -> bool {
321 let challenge = compute_challenge(&signature.r, pubkey, message);
323
324 let lhs = RISTRETTO_BASEPOINT_POINT * signature.s;
326 let rhs = signature.r + challenge * pubkey.0;
327
328 lhs == rhs
329}
330
331pub fn extract_secret(
335 pre_sig: &PreSignature,
336 complete_sig: &AdaptorSignature,
337 adaptor: &AdaptorPoint,
338) -> AdaptorResult<AdaptorSecret> {
339 let t = complete_sig.s - pre_sig.s_prime;
341
342 let computed_adaptor = RISTRETTO_BASEPOINT_POINT * t;
344 if computed_adaptor != adaptor.0 {
345 return Err(AdaptorError::SecretExtractionFailed);
346 }
347
348 Ok(AdaptorSecret(t))
349}
350
351impl PreSignature {
352 pub fn to_bytes(&self) -> [u8; 64] {
354 let mut bytes = [0u8; 64];
355 bytes[..32].copy_from_slice(&self.r_prime.compress().to_bytes());
356 bytes[32..].copy_from_slice(&self.s_prime.to_bytes());
357 bytes
358 }
359
360 pub fn from_bytes(bytes: &[u8; 64]) -> AdaptorResult<Self> {
362 let r_prime =
363 curve25519_dalek::ristretto::CompressedRistretto(bytes[..32].try_into().unwrap())
364 .decompress()
365 .ok_or(AdaptorError::InvalidSignature)?;
366 let s_prime = Scalar::from_bytes_mod_order(bytes[32..].try_into().unwrap());
367
368 Ok(Self { r_prime, s_prime })
369 }
370}
371
372impl AdaptorSignature {
373 pub fn to_bytes(&self) -> [u8; 64] {
375 let mut bytes = [0u8; 64];
376 bytes[..32].copy_from_slice(&self.r.compress().to_bytes());
377 bytes[32..].copy_from_slice(&self.s.to_bytes());
378 bytes
379 }
380
381 pub fn from_bytes(bytes: &[u8; 64]) -> AdaptorResult<Self> {
383 let r = curve25519_dalek::ristretto::CompressedRistretto(bytes[..32].try_into().unwrap())
384 .decompress()
385 .ok_or(AdaptorError::InvalidSignature)?;
386 let s = Scalar::from_bytes_mod_order(bytes[32..].try_into().unwrap());
387
388 Ok(Self { r, s })
389 }
390}
391
392#[cfg(test)]
393mod tests {
394 use super::*;
395
396 #[test]
397 fn test_adaptor_basic() {
398 let secret = AdaptorSecret::random();
399 let adaptor = secret.to_point();
400
401 let signer = AdaptorSigner::new();
402 let message = b"Test message";
403
404 let pre_sig = signer
405 .create_pre_signature_with_secret(message, &secret)
406 .unwrap();
407 assert!(verify_pre_signature(
408 &signer.public_key(),
409 message,
410 &pre_sig,
411 &adaptor
412 ));
413
414 let complete_sig = complete_signature(&pre_sig, &secret).unwrap();
415 assert!(verify_adaptor_signature(
416 &signer.public_key(),
417 message,
418 &complete_sig
419 ));
420
421 let extracted = extract_secret(&pre_sig, &complete_sig, &adaptor).unwrap();
422 assert_eq!(secret.to_bytes(), extracted.to_bytes());
423 }
424
425 #[test]
426 fn test_adaptor_wrong_secret() {
427 let secret = AdaptorSecret::random();
428 let _adaptor = secret.to_point();
429
430 let signer = AdaptorSigner::new();
431 let message = b"Test message";
432
433 let pre_sig = signer
434 .create_pre_signature_with_secret(message, &secret)
435 .unwrap();
436
437 let wrong_secret = AdaptorSecret::random();
439 let complete_sig = complete_signature(&pre_sig, &wrong_secret).unwrap();
440
441 assert!(!verify_adaptor_signature(
443 &signer.public_key(),
444 message,
445 &complete_sig
446 ));
447 }
448
449 #[test]
450 fn test_adaptor_wrong_message() {
451 let secret = AdaptorSecret::random();
452 let _adaptor = secret.to_point();
453
454 let signer = AdaptorSigner::new();
455 let message = b"Original message";
456
457 let pre_sig = signer
458 .create_pre_signature_with_secret(message, &secret)
459 .unwrap();
460 let complete_sig = complete_signature(&pre_sig, &secret).unwrap();
461
462 assert!(!verify_adaptor_signature(
464 &signer.public_key(),
465 b"Wrong message",
466 &complete_sig
467 ));
468 }
469
470 #[test]
471 fn test_secret_extraction_fails_wrong_adaptor() {
472 let secret = AdaptorSecret::random();
473 let _adaptor = secret.to_point();
474
475 let signer = AdaptorSigner::new();
476 let message = b"Test message";
477
478 let pre_sig = signer
479 .create_pre_signature_with_secret(message, &secret)
480 .unwrap();
481 let complete_sig = complete_signature(&pre_sig, &secret).unwrap();
482
483 let wrong_adaptor = AdaptorSecret::random().to_point();
485 let result = extract_secret(&pre_sig, &complete_sig, &wrong_adaptor);
486 assert!(result.is_err());
487 }
488
489 #[test]
490 fn test_pre_signature_serialization() {
491 let secret = AdaptorSecret::random();
492 let adaptor = secret.to_point();
493
494 let signer = AdaptorSigner::new();
495 let message = b"Test message";
496
497 let pre_sig = signer
498 .create_pre_signature_with_secret(message, &secret)
499 .unwrap();
500 let bytes = pre_sig.to_bytes();
501 let recovered = PreSignature::from_bytes(&bytes).unwrap();
502
503 assert!(verify_pre_signature(
504 &signer.public_key(),
505 message,
506 &recovered,
507 &adaptor
508 ));
509 }
510
511 #[test]
512 fn test_complete_signature_serialization() {
513 let secret = AdaptorSecret::random();
514 let _adaptor = secret.to_point();
515
516 let signer = AdaptorSigner::new();
517 let message = b"Test message";
518
519 let pre_sig = signer
520 .create_pre_signature_with_secret(message, &secret)
521 .unwrap();
522 let complete_sig = complete_signature(&pre_sig, &secret).unwrap();
523
524 let bytes = complete_sig.to_bytes();
525 let recovered = AdaptorSignature::from_bytes(&bytes).unwrap();
526
527 assert!(verify_adaptor_signature(
528 &signer.public_key(),
529 message,
530 &recovered
531 ));
532 }
533
534 #[test]
535 fn test_signer_serialization() {
536 let signer = AdaptorSigner::new();
537 let bytes = signer.to_bytes();
538 let recovered = AdaptorSigner::from_bytes(&bytes).unwrap();
539
540 assert_eq!(
541 signer.public_key().to_bytes(),
542 recovered.public_key().to_bytes()
543 );
544 }
545
546 #[test]
547 fn test_secret_serialization() {
548 let secret = AdaptorSecret::random();
549 let bytes = secret.to_bytes();
550 let recovered = AdaptorSecret::from_bytes(&bytes);
551
552 assert_eq!(secret.to_bytes(), recovered.to_bytes());
553 assert_eq!(
554 secret.to_point().to_bytes(),
555 recovered.to_point().to_bytes()
556 );
557 }
558
559 #[test]
560 fn test_adaptor_point_serialization() {
561 let secret = AdaptorSecret::random();
562 let adaptor = secret.to_point();
563
564 let bytes = adaptor.to_bytes();
565 let recovered = AdaptorPoint::from_bytes(&bytes).unwrap();
566
567 assert_eq!(adaptor.to_bytes(), recovered.to_bytes());
568 }
569
570 #[test]
571 fn test_multiple_pre_signatures_same_message() {
572 let secret = AdaptorSecret::random();
573 let adaptor = secret.to_point();
574
575 let signer = AdaptorSigner::new();
576 let message = b"Same message";
577
578 let pre_sig1 = signer
579 .create_pre_signature_with_secret(message, &secret)
580 .unwrap();
581 let pre_sig2 = signer
582 .create_pre_signature_with_secret(message, &secret)
583 .unwrap();
584
585 assert!(verify_pre_signature(
587 &signer.public_key(),
588 message,
589 &pre_sig1,
590 &adaptor
591 ));
592 assert!(verify_pre_signature(
593 &signer.public_key(),
594 message,
595 &pre_sig2,
596 &adaptor
597 ));
598
599 assert_ne!(pre_sig1.to_bytes(), pre_sig2.to_bytes());
601 }
602
603 #[test]
604 fn test_atomic_swap_scenario() {
605 let alice_secret = AdaptorSecret::random();
608 let adaptor = alice_secret.to_point();
609
610 let bob = AdaptorSigner::new();
612 let payment_to_alice = b"Payment from Bob to Alice for 1 BTC";
613
614 let pre_sig = bob
615 .create_pre_signature_with_secret(payment_to_alice, &alice_secret)
616 .unwrap();
617
618 assert!(verify_pre_signature(
620 &bob.public_key(),
621 payment_to_alice,
622 &pre_sig,
623 &adaptor
624 ));
625
626 let complete_sig = complete_signature(&pre_sig, &alice_secret).unwrap();
628 assert!(verify_adaptor_signature(
629 &bob.public_key(),
630 payment_to_alice,
631 &complete_sig
632 ));
633
634 let extracted_secret = extract_secret(&pre_sig, &complete_sig, &adaptor).unwrap();
636 assert_eq!(alice_secret.to_bytes(), extracted_secret.to_bytes());
637
638 }
640
641 #[test]
642 fn test_public_key_serialization() {
643 let signer = AdaptorSigner::new();
644 let pubkey = signer.public_key();
645
646 let bytes = pubkey.to_bytes();
647 let recovered = AdaptorPublicKey::from_bytes(&bytes).unwrap();
648
649 assert_eq!(pubkey.to_bytes(), recovered.to_bytes());
650 }
651
652 #[test]
653 fn test_deterministic_completion() {
654 let secret = AdaptorSecret::random();
655 let _adaptor = secret.to_point();
656
657 let signer = AdaptorSigner::new();
658 let message = b"Test message";
659
660 let pre_sig = signer
661 .create_pre_signature_with_secret(message, &secret)
662 .unwrap();
663
664 let sig1 = complete_signature(&pre_sig, &secret).unwrap();
666 let sig2 = complete_signature(&pre_sig, &secret).unwrap();
667
668 assert_eq!(sig1.to_bytes(), sig2.to_bytes());
670 }
671}