|
8 | 8 | use core::iter; |
9 | 9 | use std::convert::TryFrom; |
10 | 10 |
|
11 | | -use curve25519_dalek::edwards::{CompressedEdwardsY, EdwardsPoint}; |
| 11 | +use curve25519_dalek::edwards::EdwardsPoint; |
12 | 12 | use curve25519_dalek::scalar::Scalar; |
13 | 13 | use curve25519_dalek::traits::{IsIdentity, VartimeMultiscalarMul}; |
14 | 14 | use keccak_hash::keccak_256; |
@@ -540,117 +540,48 @@ pub enum MpcError { |
540 | 540 |
|
541 | 541 | impl From<RangeProof> for crate::util::ringct::Bulletproof { |
542 | 542 | fn from(from: RangeProof) -> Self { |
543 | | - use crate::util::ringct::Key; |
544 | | - |
545 | 543 | Self { |
546 | | - A: Key { |
547 | | - key: from.A.compress().to_bytes(), |
548 | | - }, |
549 | | - S: Key { |
550 | | - key: from.S.compress().to_bytes(), |
551 | | - }, |
552 | | - T1: Key { |
553 | | - key: from.T_1.compress().to_bytes(), |
554 | | - }, |
555 | | - T2: Key { |
556 | | - key: from.T_2.compress().to_bytes(), |
557 | | - }, |
558 | | - taux: Key { |
559 | | - key: from.t_x_blinding.to_bytes(), |
560 | | - }, |
561 | | - mu: Key { |
562 | | - key: from.e_blinding.to_bytes(), |
563 | | - }, |
564 | | - L: from |
565 | | - .ipp_proof |
566 | | - .L_vec |
567 | | - .iter() |
568 | | - .map(|l| Key { |
569 | | - key: l.compress().to_bytes(), |
570 | | - }) |
571 | | - .collect(), |
572 | | - R: from |
573 | | - .ipp_proof |
574 | | - .R_vec |
575 | | - .iter() |
576 | | - .map(|r| Key { |
577 | | - key: r.compress().to_bytes(), |
578 | | - }) |
579 | | - .collect(), |
580 | | - a: Key { |
581 | | - key: from.ipp_proof.a.to_bytes(), |
582 | | - }, |
583 | | - b: Key { |
584 | | - key: from.ipp_proof.b.to_bytes(), |
585 | | - }, |
586 | | - t: Key { |
587 | | - key: from.t_x.to_bytes(), |
588 | | - }, |
| 544 | + A: from.A, |
| 545 | + S: from.S, |
| 546 | + T1: from.T_1, |
| 547 | + T2: from.T_2, |
| 548 | + taux: from.t_x_blinding, |
| 549 | + mu: from.e_blinding, |
| 550 | + L: from.ipp_proof.L_vec, |
| 551 | + R: from.ipp_proof.R_vec, |
| 552 | + a: from.ipp_proof.a, |
| 553 | + b: from.ipp_proof.b, |
| 554 | + t: from.t_x, |
589 | 555 | } |
590 | 556 | } |
591 | 557 | } |
592 | 558 |
|
593 | | -#[derive(Debug)] |
594 | | -pub enum ConversionError { |
595 | | - InvalidPoint, |
596 | | - NonCanonicalScalar, |
597 | | -} |
598 | | - |
599 | | -impl TryFrom<crate::util::ringct::Bulletproof> for RangeProof { |
600 | | - type Error = ConversionError; |
601 | | - |
602 | | - fn try_from(from: crate::util::ringct::Bulletproof) -> Result<Self, ConversionError> { |
603 | | - Ok(Self { |
604 | | - A: CompressedEdwardsY::from_slice(&from.A.key) |
605 | | - .decompress() |
606 | | - .ok_or(ConversionError::InvalidPoint)?, |
607 | | - S: CompressedEdwardsY::from_slice(&from.S.key) |
608 | | - .decompress() |
609 | | - .ok_or(ConversionError::InvalidPoint)?, |
610 | | - T_1: CompressedEdwardsY::from_slice(&from.T1.key) |
611 | | - .decompress() |
612 | | - .ok_or(ConversionError::InvalidPoint)?, |
613 | | - T_2: CompressedEdwardsY::from_slice(&from.T2.key) |
614 | | - .decompress() |
615 | | - .ok_or(ConversionError::InvalidPoint)?, |
616 | | - t_x: Scalar::from_canonical_bytes(from.t.key) |
617 | | - .ok_or(ConversionError::NonCanonicalScalar)?, |
618 | | - t_x_blinding: Scalar::from_canonical_bytes(from.taux.key) |
619 | | - .ok_or(ConversionError::NonCanonicalScalar)?, |
620 | | - e_blinding: Scalar::from_canonical_bytes(from.mu.key) |
621 | | - .ok_or(ConversionError::NonCanonicalScalar)?, |
| 559 | +impl From<crate::util::ringct::Bulletproof> for RangeProof { |
| 560 | + fn from(from: crate::util::ringct::Bulletproof) -> Self { |
| 561 | + Self { |
| 562 | + A: from.A, |
| 563 | + S: from.S, |
| 564 | + T_1: from.T1, |
| 565 | + T_2: from.T2, |
| 566 | + t_x: from.t, |
| 567 | + t_x_blinding: from.taux, |
| 568 | + e_blinding: from.mu, |
622 | 569 | ipp_proof: InnerProductProof { |
623 | | - L_vec: from |
624 | | - .L |
625 | | - .iter() |
626 | | - .map(|L| { |
627 | | - CompressedEdwardsY::from_slice(&L.key) |
628 | | - .decompress() |
629 | | - .ok_or(ConversionError::InvalidPoint) |
630 | | - }) |
631 | | - .collect::<Result<Vec<_>, _>>()?, |
632 | | - R_vec: from |
633 | | - .R |
634 | | - .iter() |
635 | | - .map(|R| { |
636 | | - CompressedEdwardsY::from_slice(&R.key) |
637 | | - .decompress() |
638 | | - .ok_or(ConversionError::InvalidPoint) |
639 | | - }) |
640 | | - .collect::<Result<Vec<_>, _>>()?, |
641 | | - a: Scalar::from_canonical_bytes(from.a.key) |
642 | | - .ok_or(ConversionError::NonCanonicalScalar)?, |
643 | | - b: Scalar::from_canonical_bytes(from.b.key) |
644 | | - .ok_or(ConversionError::NonCanonicalScalar)?, |
| 570 | + L_vec: from.L, |
| 571 | + R_vec: from.R, |
| 572 | + a: from.a, |
| 573 | + b: from.b, |
645 | 574 | }, |
646 | | - }) |
| 575 | + } |
647 | 576 | } |
648 | 577 | } |
649 | 578 |
|
650 | 579 | #[cfg(test)] |
651 | 580 | mod tests { |
652 | 581 | use super::*; |
| 582 | + use curve25519_dalek::edwards::CompressedEdwardsY; |
653 | 583 | use rand::thread_rng; |
| 584 | + use std::convert::TryInto; |
654 | 585 |
|
655 | 586 | #[test] |
656 | 587 | fn public_api() { |
@@ -780,101 +711,96 @@ mod tests { |
780 | 711 | #[test] |
781 | 712 | fn verify_monero_mainnet_bulletproof() { |
782 | 713 | use crate::util::ringct::Bulletproof; |
783 | | - use crate::util::ringct::Key; |
784 | 714 | use hex_literal::hex; |
785 | 715 |
|
786 | 716 | // data from: |
787 | 717 | // https://xmrchain.net/tx/f34e0414a413cc7d6d4452b1a962f08be6de937eeb76fed9ca0774f5cb3b161b/1 |
788 | 718 |
|
789 | 719 | let proof = Bulletproof { |
790 | | - A: Key { |
791 | | - key: hex!("78ddbccf2e1ced3b68835600768770ebe3e219db19a35f5ebe6495ec58c763d4"), |
792 | | - }, |
793 | | - S: Key { |
794 | | - key: hex!("e61bd5f461172a14d31149207a9f473289f89dbf4c42dff5f7cbcbd87a12210e"), |
795 | | - }, |
796 | | - T1: Key { |
797 | | - key: hex!("74989471b2e26755d60128a0a54de6e8d0a3d30e9c6810f885f09be27339765f"), |
798 | | - }, |
799 | | - T2: Key { |
800 | | - key: hex!("bd0b0fb338cc8f16a3c8b05f504a34223263f6fb61865cff29f62d7731581a85"), |
801 | | - }, |
802 | | - taux: Key { |
803 | | - key: hex!("df0abd33124389ef8c32fb948b5e4b40259757b5f0ca6c7010f33c0ee625880f"), |
804 | | - }, |
805 | | - mu: Key { |
806 | | - key: hex!("5b98150bedb8ba4861246bb31f3f0cb7a0d9a915475c9be92b847be8c3236602"), |
807 | | - }, |
| 720 | + A: hex!("78ddbccf2e1ced3b68835600768770ebe3e219db19a35f5ebe6495ec58c763d4") |
| 721 | + .try_into() |
| 722 | + .unwrap(), |
| 723 | + S: hex!("e61bd5f461172a14d31149207a9f473289f89dbf4c42dff5f7cbcbd87a12210e") |
| 724 | + .try_into() |
| 725 | + .unwrap(), |
| 726 | + T1: hex!("74989471b2e26755d60128a0a54de6e8d0a3d30e9c6810f885f09be27339765f") |
| 727 | + .try_into() |
| 728 | + .unwrap(), |
| 729 | + T2: hex!("bd0b0fb338cc8f16a3c8b05f504a34223263f6fb61865cff29f62d7731581a85") |
| 730 | + .try_into() |
| 731 | + .unwrap(), |
| 732 | + taux: hex!("df0abd33124389ef8c32fb948b5e4b40259757b5f0ca6c7010f33c0ee625880f") |
| 733 | + .try_into() |
| 734 | + .unwrap(), |
| 735 | + mu: hex!("5b98150bedb8ba4861246bb31f3f0cb7a0d9a915475c9be92b847be8c3236602") |
| 736 | + .try_into() |
| 737 | + .unwrap(), |
808 | 738 | L: vec![ |
809 | | - Key { |
810 | | - key: hex!("0568cb5dc56fd8077435a87268931c5995367e9f45ad8527248c69c87840f17e"), |
811 | | - }, |
812 | | - Key { |
813 | | - key: hex!("3818ef23fb0da1edb0180be8a06fe66e0c12b85955b96a329eccffeb4f0af152"), |
814 | | - }, |
815 | | - Key { |
816 | | - key: hex!("c1f9e3d157143326e3f60101e2119c2e8528bcada27087b8248226b9ad827db5"), |
817 | | - }, |
818 | | - Key { |
819 | | - key: hex!("46443a7d575c97658f2ffd4cdfaf53de6b39ca340e59f40d195068e4725feb89"), |
820 | | - }, |
821 | | - Key { |
822 | | - key: hex!("b0019ac9d69c511c899ab647695bb6e5c5fff5256aa3b168ecb57b20a5ad6fa8"), |
823 | | - }, |
824 | | - Key { |
825 | | - key: hex!("24f25935783d645279e575eac839beba4c91b04efb4fc0c8d7f4a0fa27d95fe1"), |
826 | | - }, |
827 | | - Key { |
828 | | - key: hex!("5d8f4d63b5ce10d9ab579c30da28108c13abd54e876a0308636fdc8b0e69d059"), |
829 | | - }, |
| 739 | + hex!("0568cb5dc56fd8077435a87268931c5995367e9f45ad8527248c69c87840f17e") |
| 740 | + .try_into() |
| 741 | + .unwrap(), |
| 742 | + hex!("3818ef23fb0da1edb0180be8a06fe66e0c12b85955b96a329eccffeb4f0af152") |
| 743 | + .try_into() |
| 744 | + .unwrap(), |
| 745 | + hex!("c1f9e3d157143326e3f60101e2119c2e8528bcada27087b8248226b9ad827db5") |
| 746 | + .try_into() |
| 747 | + .unwrap(), |
| 748 | + hex!("46443a7d575c97658f2ffd4cdfaf53de6b39ca340e59f40d195068e4725feb89") |
| 749 | + .try_into() |
| 750 | + .unwrap(), |
| 751 | + hex!("b0019ac9d69c511c899ab647695bb6e5c5fff5256aa3b168ecb57b20a5ad6fa8") |
| 752 | + .try_into() |
| 753 | + .unwrap(), |
| 754 | + hex!("24f25935783d645279e575eac839beba4c91b04efb4fc0c8d7f4a0fa27d95fe1") |
| 755 | + .try_into() |
| 756 | + .unwrap(), |
| 757 | + hex!("5d8f4d63b5ce10d9ab579c30da28108c13abd54e876a0308636fdc8b0e69d059") |
| 758 | + .try_into() |
| 759 | + .unwrap(), |
830 | 760 | ], |
831 | 761 | R: vec![ |
832 | | - Key { |
833 | | - key: hex!("88f99b0bfb5a4e052b209400594c2c423a95497e3be315d9e8fbb4410bd73102"), |
834 | | - }, |
835 | | - Key { |
836 | | - key: hex!("e2bdf54f0b3456c5816004549e76c88f004baf8a84aa3d581d7dbffde4316ec4"), |
837 | | - }, |
838 | | - Key { |
839 | | - key: hex!("6d808eec11aa732e94040894517806aa615fadf826c9fc351f73f7c13097cc02"), |
840 | | - }, |
841 | | - Key { |
842 | | - key: hex!("8e44c3df858a0991f5b176ae4c862f79bdb153cfb35d1e4c75c28f8493c4a3ff"), |
843 | | - }, |
844 | | - Key { |
845 | | - key: hex!("b0334d4f506cd30173ce6398de28084fc8b687a4cfe4eca08476e8a042a8e6fd"), |
846 | | - }, |
847 | | - Key { |
848 | | - key: hex!("cc11034e07e9c80029b4220cf15574ded93ba96a2f2bc94bd504a30abfddba5a"), |
849 | | - }, |
850 | | - Key { |
851 | | - key: hex!("e5ede5ed6e0d603a668baa586bfa2139553ef487c1a9474fbafaa5ba5b8760d0"), |
852 | | - }, |
| 762 | + hex!("88f99b0bfb5a4e052b209400594c2c423a95497e3be315d9e8fbb4410bd73102") |
| 763 | + .try_into() |
| 764 | + .unwrap(), |
| 765 | + hex!("e2bdf54f0b3456c5816004549e76c88f004baf8a84aa3d581d7dbffde4316ec4") |
| 766 | + .try_into() |
| 767 | + .unwrap(), |
| 768 | + hex!("6d808eec11aa732e94040894517806aa615fadf826c9fc351f73f7c13097cc02") |
| 769 | + .try_into() |
| 770 | + .unwrap(), |
| 771 | + hex!("8e44c3df858a0991f5b176ae4c862f79bdb153cfb35d1e4c75c28f8493c4a3ff") |
| 772 | + .try_into() |
| 773 | + .unwrap(), |
| 774 | + hex!("b0334d4f506cd30173ce6398de28084fc8b687a4cfe4eca08476e8a042a8e6fd") |
| 775 | + .try_into() |
| 776 | + .unwrap(), |
| 777 | + hex!("cc11034e07e9c80029b4220cf15574ded93ba96a2f2bc94bd504a30abfddba5a") |
| 778 | + .try_into() |
| 779 | + .unwrap(), |
| 780 | + hex!("e5ede5ed6e0d603a668baa586bfa2139553ef487c1a9474fbafaa5ba5b8760d0") |
| 781 | + .try_into() |
| 782 | + .unwrap(), |
853 | 783 | ], |
854 | | - a: Key { |
855 | | - key: hex!("d782e742fafc78de94aa51bfd89ec61cbf54180093b3617b694652e6a4cea005"), |
856 | | - }, |
857 | | - b: Key { |
858 | | - key: hex!("8ae6cc60d17472f9ca87ffa8932ff480bc55e00d95e60b39aa866bb94ac8f90a"), |
859 | | - }, |
860 | | - t: Key { |
861 | | - key: hex!("0f42ab37f27887291eb3f3126708e5ff4fdf4c4499bc43c61516684e9f176100"), |
862 | | - }, |
| 784 | + a: hex!("d782e742fafc78de94aa51bfd89ec61cbf54180093b3617b694652e6a4cea005") |
| 785 | + .try_into() |
| 786 | + .unwrap(), |
| 787 | + b: hex!("8ae6cc60d17472f9ca87ffa8932ff480bc55e00d95e60b39aa866bb94ac8f90a") |
| 788 | + .try_into() |
| 789 | + .unwrap(), |
| 790 | + t: hex!("0f42ab37f27887291eb3f3126708e5ff4fdf4c4499bc43c61516684e9f176100") |
| 791 | + .try_into() |
| 792 | + .unwrap(), |
863 | 793 | }; |
864 | 794 |
|
865 | 795 | let commitments = vec![ |
866 | | - CompressedEdwardsY::from_slice( |
867 | | - hex::decode("5bef186a6d084a0372e3d91446f6b7ec4a900ab7b0abf7b205c5f2b2f105b32c") |
868 | | - .unwrap() |
869 | | - .as_slice(), |
870 | | - ) |
| 796 | + CompressedEdwardsY(hex!( |
| 797 | + "5bef186a6d084a0372e3d91446f6b7ec4a900ab7b0abf7b205c5f2b2f105b32c" |
| 798 | + )) |
871 | 799 | .decompress() |
872 | 800 | .unwrap(), |
873 | | - CompressedEdwardsY::from_slice( |
874 | | - hex::decode("22d187e6a788eaeecf0fd4d31f1718e03c259f39fd120fd8ef660ddb1c36a852") |
875 | | - .unwrap() |
876 | | - .as_slice(), |
877 | | - ) |
| 801 | + CompressedEdwardsY(hex!( |
| 802 | + "22d187e6a788eaeecf0fd4d31f1718e03c259f39fd120fd8ef660ddb1c36a852" |
| 803 | + )) |
878 | 804 | .decompress() |
879 | 805 | .unwrap(), |
880 | 806 | ]; |
|
0 commit comments