diff --git a/Cargo.lock b/Cargo.lock index 5ecd84f1686ded6b94b0898a4880f7880ee0bec5..b75da19b441f5ba03b5c8680958eeaac40efb270 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -50,7 +50,7 @@ dependencies = [ [[package]] name = "duniter-protocol" -version = "0.4.0" +version = "0.4.1" dependencies = [ "base58 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "base64 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/protocol/Cargo.toml b/protocol/Cargo.toml index 0420f09aa36f2a91b2387f02e22bf54dd9bfc409..0bdca9af799e722a32da1bb372834c98b766e715 100644 --- a/protocol/Cargo.toml +++ b/protocol/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "duniter-protocol" -version = "0.4.0" +version = "0.4.1" authors = ["nanocryk <nanocryk@duniter.org>"] description = "Implements the Duniter Protocol" repository = "https://git.duniter.org/nodes/rust/duniter-rs" diff --git a/protocol/blockchain/mod.rs b/protocol/blockchain/mod.rs index 3d20cc64ff949e3fb8276ac14e2fd6b6a328afc8..5f997b0c9fd18f8dfc1443f8ca304c22a9c1d42f 100644 --- a/protocol/blockchain/mod.rs +++ b/protocol/blockchain/mod.rs @@ -69,7 +69,7 @@ pub trait Document: Debug { let signatures = self.signatures(); let mismatches: Vec<_> = issuers .iter() - .zip(signatures.iter()) + .zip(signatures) .enumerate() .filter(|&(_, (key, signature))| !key.verify(self.as_bytes(), signature)) .map(|(i, _)| i) diff --git a/protocol/blockchain/v10/documents/identity.rs b/protocol/blockchain/v10/documents/identity.rs index 36aa5a61635fb3c4f82fb772e241c787b1ed9dde..5e901d74e82a3591d44c95df3c117a3f09d2754c 100644 --- a/protocol/blockchain/v10/documents/identity.rs +++ b/protocol/blockchain/v10/documents/identity.rs @@ -199,7 +199,7 @@ impl StandardTextDocumentParser for IdentityDocumentParser { mod tests { use super::*; use duniter_crypto::keys::{PrivateKey, PublicKey, Signature}; - use blockchain::VerificationResult; + use blockchain::{Document, VerificationResult}; #[test] fn generate_real_document() { @@ -241,8 +241,8 @@ mod tests { #[test] fn identity_standard_regex() { assert!(IDENTITY_REGEX.is_match( - "Issuer: DKpQPUL4ckzXYdnDRvCRKAm1gNvSdmAXnTrJZ7LvM5Qo -UniqueID: toc + "Issuer: DNann1Lh55eZMEDXeYt59bzHbA3NJR46DeQYCS2qQdLV +UniqueID: tic Timestamp: 0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855 " )); @@ -253,22 +253,28 @@ Timestamp: 0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855 let doc = "Version: 10 Type: Identity Currency: duniter_unit_test_currency -Issuer: DKpQPUL4ckzXYdnDRvCRKAm1gNvSdmAXnTrJZ7LvM5Qo -UniqueID: toc +Issuer: DNann1Lh55eZMEDXeYt59bzHbA3NJR46DeQYCS2qQdLV +UniqueID: tic Timestamp: 0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855 -lcekuS0eP2dpFL99imJcwvDAwx49diiDMkG8Lj7FLkC/6IJ0tgNjUzCIZgMGi7bL5tODRiWi9B49UMXb8b3MAw=="; +"; - let body = "Issuer: DKpQPUL4ckzXYdnDRvCRKAm1gNvSdmAXnTrJZ7LvM5Qo -UniqueID: toc + let body = "Issuer: DNann1Lh55eZMEDXeYt59bzHbA3NJR46DeQYCS2qQdLV +UniqueID: tic Timestamp: 0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855 "; let currency = "duniter_unit_test_currency"; let signatures = vec![Signature::from_base64( -"lcekuS0eP2dpFL99imJcwvDAwx49diiDMkG8Lj7FLkC/6IJ0tgNjUzCIZgMGi7bL5tODRiWi9B49UMXb8b3MAw==" +"1eubHHbuNfilHMM0G2bI30iZzebQ2cQ1PC7uPAw08FGMMmQCRerlF/3pc4sAcsnexsxBseA/3lY03KlONqJBAg==" ).unwrap(),]; - let _ = IdentityDocumentParser::parse_standard(doc, body, currency, signatures).unwrap(); + let doc = IdentityDocumentParser::parse_standard(doc, body, currency, signatures).unwrap(); + if let V10Document::Identity(doc) = doc { + println!("Doc : {:?}", doc); + assert_eq!(doc.verify_signatures(), VerificationResult::Valid()) + } else { + panic!("Wrong document type"); + } } } diff --git a/protocol/blockchain/v10/documents/membership.rs b/protocol/blockchain/v10/documents/membership.rs index 07153b79a886e6ef368ae14953be5e3bb03ba444..2710cfeae00c421ff8266da20cb34d72ba6bf64b 100644 --- a/protocol/blockchain/v10/documents/membership.rs +++ b/protocol/blockchain/v10/documents/membership.rs @@ -308,7 +308,7 @@ Block: 0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855 Membership: IN UserID: tic CertTS: 0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855 -s2hUbokkibTAWGEwErw6hyXSWlWFQ2UWs2PWx8d/kkElAyuuWaQq4Tsonuweh1xn4AC1TVWt4yMR3WrDdkhnAw=="; +"; let body = "Issuer: DNann1Lh55eZMEDXeYt59bzHbA3NJR46DeQYCS2qQdLV Block: 0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855 @@ -323,6 +323,13 @@ CertTS: 0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855 "s2hUbokkibTAWGEwErw6hyXSWlWFQ2UWs2PWx8d/kkElAyuuWaQq4Tsonuweh1xn4AC1TVWt4yMR3WrDdkhnAw==" ).unwrap(),]; - let _ = MembershipDocumentParser::parse_standard(doc, body, currency, signatures).unwrap(); + let doc = + MembershipDocumentParser::parse_standard(doc, body, currency, signatures).unwrap(); + if let V10Document::Membership(doc) = doc { + println!("Doc : {:?}", doc); + assert_eq!(doc.verify_signatures(), VerificationResult::Valid()) + } else { + panic!("Wrong document type"); + } } } diff --git a/protocol/blockchain/v10/documents/mod.rs b/protocol/blockchain/v10/documents/mod.rs index 31ed9af9e8a2bd5b6661ad18e50a4616fe55b9e7..684028d255db4dce5baab69d4622894701fb84f3 100644 --- a/protocol/blockchain/v10/documents/mod.rs +++ b/protocol/blockchain/v10/documents/mod.rs @@ -33,11 +33,11 @@ lazy_static! { Type: (?P<type>[[:alpha:]]+)\n\ Currency: (?P<currency>[[:alnum:] _-]+)\n\ (?P<body>(?:.*\n)+?))\ - (?P<sigs>([[:alnum:]+/=]+\n)+)$" + (?P<sigs>([[:alnum:]+/=]+\n)*([[:alnum:]+/=]+))$" ).unwrap(); static ref SIGNATURES_REGEX: Regex = Regex::new( - "[[:alnum:]+/=]+\n" + "[[:alnum:]+/=]+\n?" ).unwrap(); } @@ -180,6 +180,7 @@ impl<'a> DocumentParser<&'a str, V10Document, V10DocumentParsingError> for V10Do #[cfg(test)] mod tests { use super::*; + use blockchain::{Document, VerificationResult}; #[test] fn document_regex() { @@ -215,8 +216,7 @@ Outputs: Comment: -----@@@----- (why not this comment?) 42yQm4hGTJYWkPg39hQAUgP6S6EQ4vTfXdJuxKEHL1ih6YHiDL2hcwrFgBHjXLRgxRhj2VNVqqc6b4JayKqTE14r 2D96KZwNUvVtcapQPq2mm7J9isFcDCfykwJpVEZwBc7tCgL4qPyu17BT5ePozAE9HS6Yvj51f62Mp4n9d9dkzJoX -2XiBDpuUdu6zCPWGzHXXy8c4ATSscfFQG9DjmqMZUxDZVt1Dp4m2N5oHYVUfoPdrU9SLk4qxi65RNrfCVnvQtQJk -" +2XiBDpuUdu6zCPWGzHXXy8c4ATSscfFQG9DjmqMZUxDZVt1Dp4m2N5oHYVUfoPdrU9SLk4qxi65RNrfCVnvQtQJk" )); assert!(DOCUMENT_REGEX.is_match( @@ -230,8 +230,7 @@ IdtyTimestamp: 32-DB30D958EE5CB75186972286ED3F4686B8A1C2CD IdtySignature: J3G9oM5AKYZNLAB5Wx499w61NuUoS57JVccTShUb\ GpCMjCqj9yXXqNq7dyZpDWA6BxipsiaMZhujMeBfCznzyci CertTimestamp: 36-1076F10A7397715D2BEE82579861999EA1F274AC -SoKwoa8PFfCDJWZ6dNCv7XstezHcc2BbKiJgVDXv82R5zYR83nis9dShLgWJ5w48noVUHimdngzYQneNYSMV3rk -" +SoKwoa8PFfCDJWZ6dNCv7XstezHcc2BbKiJgVDXv82R5zYR83nis9dShLgWJ5w48noVUHimdngzYQneNYSMV3rk" )); } @@ -243,8 +242,7 @@ SoKwoa8PFfCDJWZ6dNCv7XstezHcc2BbKiJgVDXv82R5zYR83nis9dShLgWJ5w48noVUHimdngzYQneN " 42yQm4hGTJYWkPg39hQAUgP6S6EQ4vTfXdJuxKEHL1ih6YHiDL2hcwrFgBHjXLRgxRhj2VNVqqc6b4JayKqTE14r 2D96KZwNUvVtcapQPq2mm7J9isFcDCfykwJpVEZwBc7tCgL4qPyu17BT5ePozAE9HS6Yvj51f62Mp4n9d9dkzJoX -2XiBDpuUdu6zCPWGzHXXy8c4ATSscfFQG9DjmqMZUxDZVt1Dp4m2N5oHYVUfoPdrU9SLk4qxi65RNrfCVnvQtQJk -" +2XiBDpuUdu6zCPWGzHXXy8c4ATSscfFQG9DjmqMZUxDZVt1Dp4m2N5oHYVUfoPdrU9SLk4qxi65RNrfCVnvQtQJk" ) .count(), 3 @@ -255,11 +253,50 @@ SoKwoa8PFfCDJWZ6dNCv7XstezHcc2BbKiJgVDXv82R5zYR83nis9dShLgWJ5w48noVUHimdngzYQneN .captures_iter( " 42yQm4hGTJYWkPg39hQAUgP6S6EQ4vTfXdJuxKEHL1ih6YHiDL2hcwrFgBHjXLRgxRhj2VNVqqc6b4JayKqTE14r -2XiBDpuUdu6zCPWGzHXXy8c4ATSscfFQG9DjmqMZUxDZVt1Dp4m2N5oHYVUfoPdrU9SLk4qxi65RNrfCVnvQtQJk -" +2XiBDpuUdu6zCPWGzHXXy8c4ATSscfFQG9DjmqMZUxDZVt1Dp4m2N5oHYVUfoPdrU9SLk4qxi65RNrfCVnvQtQJk" ) .count(), 2 ); } + + #[test] + fn parse_identity_document() { + let text = "Version: 10 +Type: Identity +Currency: duniter_unit_test_currency +Issuer: DNann1Lh55eZMEDXeYt59bzHbA3NJR46DeQYCS2qQdLV +UniqueID: tic +Timestamp: 0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855 +1eubHHbuNfilHMM0G2bI30iZzebQ2cQ1PC7uPAw08FGMMmQCRerlF/3pc4sAcsnexsxBseA/3lY03KlONqJBAg=="; + + let doc = V10DocumentParser::parse(text).unwrap(); + if let V10Document::Identity(doc) = doc { + println!("Doc : {:?}", doc); + assert_eq!(doc.verify_signatures(), VerificationResult::Valid()) + } else { + panic!("Wrong document type"); + } + } + + #[test] + fn parse_membership_document() { + let text = "Version: 10 +Type: Membership +Currency: duniter_unit_test_currency +Issuer: DNann1Lh55eZMEDXeYt59bzHbA3NJR46DeQYCS2qQdLV +Block: 0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855 +Membership: IN +UserID: tic +CertTS: 0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855 +s2hUbokkibTAWGEwErw6hyXSWlWFQ2UWs2PWx8d/kkElAyuuWaQq4Tsonuweh1xn4AC1TVWt4yMR3WrDdkhnAw=="; + + let doc = V10DocumentParser::parse(text).unwrap(); + if let V10Document::Membership(doc) = doc { + println!("Doc : {:?}", doc); + assert_eq!(doc.verify_signatures(), VerificationResult::Valid()) + } else { + panic!("Wrong document type"); + } + } }