Skip to content
Snippets Groups Projects
Commit 0b49e348 authored by nanocryk's avatar nanocryk
Browse files

Merge branch '32-add-signature-test-for-identity-and-membership-documents-parsing' into 'dev'

Resolve "Add signature test for identity and membership documents parsing"

Closes #32

See merge request !23
parents a1024e20 06ab5a0e
No related branches found
No related tags found
1 merge request!23Resolve "Add signature test for identity and membership documents parsing"
...@@ -50,7 +50,7 @@ dependencies = [ ...@@ -50,7 +50,7 @@ dependencies = [
[[package]] [[package]]
name = "duniter-protocol" name = "duniter-protocol"
version = "0.4.0" version = "0.4.1"
dependencies = [ dependencies = [
"base58 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "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)", "base64 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
......
[package] [package]
name = "duniter-protocol" name = "duniter-protocol"
version = "0.4.0" version = "0.4.1"
authors = ["nanocryk <nanocryk@duniter.org>"] authors = ["nanocryk <nanocryk@duniter.org>"]
description = "Implements the Duniter Protocol" description = "Implements the Duniter Protocol"
repository = "https://git.duniter.org/nodes/rust/duniter-rs" repository = "https://git.duniter.org/nodes/rust/duniter-rs"
......
...@@ -69,7 +69,7 @@ pub trait Document: Debug { ...@@ -69,7 +69,7 @@ pub trait Document: Debug {
let signatures = self.signatures(); let signatures = self.signatures();
let mismatches: Vec<_> = issuers let mismatches: Vec<_> = issuers
.iter() .iter()
.zip(signatures.iter()) .zip(signatures)
.enumerate() .enumerate()
.filter(|&(_, (key, signature))| !key.verify(self.as_bytes(), signature)) .filter(|&(_, (key, signature))| !key.verify(self.as_bytes(), signature))
.map(|(i, _)| i) .map(|(i, _)| i)
......
...@@ -199,7 +199,7 @@ impl StandardTextDocumentParser for IdentityDocumentParser { ...@@ -199,7 +199,7 @@ impl StandardTextDocumentParser for IdentityDocumentParser {
mod tests { mod tests {
use super::*; use super::*;
use duniter_crypto::keys::{PrivateKey, PublicKey, Signature}; use duniter_crypto::keys::{PrivateKey, PublicKey, Signature};
use blockchain::VerificationResult; use blockchain::{Document, VerificationResult};
#[test] #[test]
fn generate_real_document() { fn generate_real_document() {
...@@ -241,8 +241,8 @@ mod tests { ...@@ -241,8 +241,8 @@ mod tests {
#[test] #[test]
fn identity_standard_regex() { fn identity_standard_regex() {
assert!(IDENTITY_REGEX.is_match( assert!(IDENTITY_REGEX.is_match(
"Issuer: DKpQPUL4ckzXYdnDRvCRKAm1gNvSdmAXnTrJZ7LvM5Qo "Issuer: DNann1Lh55eZMEDXeYt59bzHbA3NJR46DeQYCS2qQdLV
UniqueID: toc UniqueID: tic
Timestamp: 0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855 Timestamp: 0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
" "
)); ));
...@@ -253,22 +253,28 @@ Timestamp: 0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855 ...@@ -253,22 +253,28 @@ Timestamp: 0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
let doc = "Version: 10 let doc = "Version: 10
Type: Identity Type: Identity
Currency: duniter_unit_test_currency Currency: duniter_unit_test_currency
Issuer: DKpQPUL4ckzXYdnDRvCRKAm1gNvSdmAXnTrJZ7LvM5Qo Issuer: DNann1Lh55eZMEDXeYt59bzHbA3NJR46DeQYCS2qQdLV
UniqueID: toc UniqueID: tic
Timestamp: 0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855 Timestamp: 0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
lcekuS0eP2dpFL99imJcwvDAwx49diiDMkG8Lj7FLkC/6IJ0tgNjUzCIZgMGi7bL5tODRiWi9B49UMXb8b3MAw=="; ";
let body = "Issuer: DKpQPUL4ckzXYdnDRvCRKAm1gNvSdmAXnTrJZ7LvM5Qo let body = "Issuer: DNann1Lh55eZMEDXeYt59bzHbA3NJR46DeQYCS2qQdLV
UniqueID: toc UniqueID: tic
Timestamp: 0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855 Timestamp: 0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
"; ";
let currency = "duniter_unit_test_currency"; let currency = "duniter_unit_test_currency";
let signatures = vec![Signature::from_base64( let signatures = vec![Signature::from_base64(
"lcekuS0eP2dpFL99imJcwvDAwx49diiDMkG8Lj7FLkC/6IJ0tgNjUzCIZgMGi7bL5tODRiWi9B49UMXb8b3MAw==" "1eubHHbuNfilHMM0G2bI30iZzebQ2cQ1PC7uPAw08FGMMmQCRerlF/3pc4sAcsnexsxBseA/3lY03KlONqJBAg=="
).unwrap(),]; ).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");
}
} }
} }
...@@ -308,7 +308,7 @@ Block: 0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855 ...@@ -308,7 +308,7 @@ Block: 0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
Membership: IN Membership: IN
UserID: tic UserID: tic
CertTS: 0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855 CertTS: 0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
s2hUbokkibTAWGEwErw6hyXSWlWFQ2UWs2PWx8d/kkElAyuuWaQq4Tsonuweh1xn4AC1TVWt4yMR3WrDdkhnAw=="; ";
let body = "Issuer: DNann1Lh55eZMEDXeYt59bzHbA3NJR46DeQYCS2qQdLV let body = "Issuer: DNann1Lh55eZMEDXeYt59bzHbA3NJR46DeQYCS2qQdLV
Block: 0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855 Block: 0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
...@@ -323,6 +323,13 @@ CertTS: 0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855 ...@@ -323,6 +323,13 @@ CertTS: 0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
"s2hUbokkibTAWGEwErw6hyXSWlWFQ2UWs2PWx8d/kkElAyuuWaQq4Tsonuweh1xn4AC1TVWt4yMR3WrDdkhnAw==" "s2hUbokkibTAWGEwErw6hyXSWlWFQ2UWs2PWx8d/kkElAyuuWaQq4Tsonuweh1xn4AC1TVWt4yMR3WrDdkhnAw=="
).unwrap(),]; ).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");
}
} }
} }
...@@ -33,11 +33,11 @@ lazy_static! { ...@@ -33,11 +33,11 @@ lazy_static! {
Type: (?P<type>[[:alpha:]]+)\n\ Type: (?P<type>[[:alpha:]]+)\n\
Currency: (?P<currency>[[:alnum:] _-]+)\n\ Currency: (?P<currency>[[:alnum:] _-]+)\n\
(?P<body>(?:.*\n)+?))\ (?P<body>(?:.*\n)+?))\
(?P<sigs>([[:alnum:]+/=]+\n)+)$" (?P<sigs>([[:alnum:]+/=]+\n)*([[:alnum:]+/=]+))$"
).unwrap(); ).unwrap();
static ref SIGNATURES_REGEX: Regex = Regex::new( static ref SIGNATURES_REGEX: Regex = Regex::new(
"[[:alnum:]+/=]+\n" "[[:alnum:]+/=]+\n?"
).unwrap(); ).unwrap();
} }
...@@ -180,6 +180,7 @@ impl<'a> DocumentParser<&'a str, V10Document, V10DocumentParsingError> for V10Do ...@@ -180,6 +180,7 @@ impl<'a> DocumentParser<&'a str, V10Document, V10DocumentParsingError> for V10Do
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use super::*; use super::*;
use blockchain::{Document, VerificationResult};
#[test] #[test]
fn document_regex() { fn document_regex() {
...@@ -215,8 +216,7 @@ Outputs: ...@@ -215,8 +216,7 @@ Outputs:
Comment: -----@@@----- (why not this comment?) Comment: -----@@@----- (why not this comment?)
42yQm4hGTJYWkPg39hQAUgP6S6EQ4vTfXdJuxKEHL1ih6YHiDL2hcwrFgBHjXLRgxRhj2VNVqqc6b4JayKqTE14r 42yQm4hGTJYWkPg39hQAUgP6S6EQ4vTfXdJuxKEHL1ih6YHiDL2hcwrFgBHjXLRgxRhj2VNVqqc6b4JayKqTE14r
2D96KZwNUvVtcapQPq2mm7J9isFcDCfykwJpVEZwBc7tCgL4qPyu17BT5ePozAE9HS6Yvj51f62Mp4n9d9dkzJoX 2D96KZwNUvVtcapQPq2mm7J9isFcDCfykwJpVEZwBc7tCgL4qPyu17BT5ePozAE9HS6Yvj51f62Mp4n9d9dkzJoX
2XiBDpuUdu6zCPWGzHXXy8c4ATSscfFQG9DjmqMZUxDZVt1Dp4m2N5oHYVUfoPdrU9SLk4qxi65RNrfCVnvQtQJk 2XiBDpuUdu6zCPWGzHXXy8c4ATSscfFQG9DjmqMZUxDZVt1Dp4m2N5oHYVUfoPdrU9SLk4qxi65RNrfCVnvQtQJk"
"
)); ));
assert!(DOCUMENT_REGEX.is_match( assert!(DOCUMENT_REGEX.is_match(
...@@ -230,8 +230,7 @@ IdtyTimestamp: 32-DB30D958EE5CB75186972286ED3F4686B8A1C2CD ...@@ -230,8 +230,7 @@ IdtyTimestamp: 32-DB30D958EE5CB75186972286ED3F4686B8A1C2CD
IdtySignature: J3G9oM5AKYZNLAB5Wx499w61NuUoS57JVccTShUb\ IdtySignature: J3G9oM5AKYZNLAB5Wx499w61NuUoS57JVccTShUb\
GpCMjCqj9yXXqNq7dyZpDWA6BxipsiaMZhujMeBfCznzyci GpCMjCqj9yXXqNq7dyZpDWA6BxipsiaMZhujMeBfCznzyci
CertTimestamp: 36-1076F10A7397715D2BEE82579861999EA1F274AC CertTimestamp: 36-1076F10A7397715D2BEE82579861999EA1F274AC
SoKwoa8PFfCDJWZ6dNCv7XstezHcc2BbKiJgVDXv82R5zYR83nis9dShLgWJ5w48noVUHimdngzYQneNYSMV3rk SoKwoa8PFfCDJWZ6dNCv7XstezHcc2BbKiJgVDXv82R5zYR83nis9dShLgWJ5w48noVUHimdngzYQneNYSMV3rk"
"
)); ));
} }
...@@ -243,8 +242,7 @@ SoKwoa8PFfCDJWZ6dNCv7XstezHcc2BbKiJgVDXv82R5zYR83nis9dShLgWJ5w48noVUHimdngzYQneN ...@@ -243,8 +242,7 @@ SoKwoa8PFfCDJWZ6dNCv7XstezHcc2BbKiJgVDXv82R5zYR83nis9dShLgWJ5w48noVUHimdngzYQneN
" "
42yQm4hGTJYWkPg39hQAUgP6S6EQ4vTfXdJuxKEHL1ih6YHiDL2hcwrFgBHjXLRgxRhj2VNVqqc6b4JayKqTE14r 42yQm4hGTJYWkPg39hQAUgP6S6EQ4vTfXdJuxKEHL1ih6YHiDL2hcwrFgBHjXLRgxRhj2VNVqqc6b4JayKqTE14r
2D96KZwNUvVtcapQPq2mm7J9isFcDCfykwJpVEZwBc7tCgL4qPyu17BT5ePozAE9HS6Yvj51f62Mp4n9d9dkzJoX 2D96KZwNUvVtcapQPq2mm7J9isFcDCfykwJpVEZwBc7tCgL4qPyu17BT5ePozAE9HS6Yvj51f62Mp4n9d9dkzJoX
2XiBDpuUdu6zCPWGzHXXy8c4ATSscfFQG9DjmqMZUxDZVt1Dp4m2N5oHYVUfoPdrU9SLk4qxi65RNrfCVnvQtQJk 2XiBDpuUdu6zCPWGzHXXy8c4ATSscfFQG9DjmqMZUxDZVt1Dp4m2N5oHYVUfoPdrU9SLk4qxi65RNrfCVnvQtQJk"
"
) )
.count(), .count(),
3 3
...@@ -255,11 +253,50 @@ SoKwoa8PFfCDJWZ6dNCv7XstezHcc2BbKiJgVDXv82R5zYR83nis9dShLgWJ5w48noVUHimdngzYQneN ...@@ -255,11 +253,50 @@ SoKwoa8PFfCDJWZ6dNCv7XstezHcc2BbKiJgVDXv82R5zYR83nis9dShLgWJ5w48noVUHimdngzYQneN
.captures_iter( .captures_iter(
" "
42yQm4hGTJYWkPg39hQAUgP6S6EQ4vTfXdJuxKEHL1ih6YHiDL2hcwrFgBHjXLRgxRhj2VNVqqc6b4JayKqTE14r 42yQm4hGTJYWkPg39hQAUgP6S6EQ4vTfXdJuxKEHL1ih6YHiDL2hcwrFgBHjXLRgxRhj2VNVqqc6b4JayKqTE14r
2XiBDpuUdu6zCPWGzHXXy8c4ATSscfFQG9DjmqMZUxDZVt1Dp4m2N5oHYVUfoPdrU9SLk4qxi65RNrfCVnvQtQJk 2XiBDpuUdu6zCPWGzHXXy8c4ATSscfFQG9DjmqMZUxDZVt1Dp4m2N5oHYVUfoPdrU9SLk4qxi65RNrfCVnvQtQJk"
"
) )
.count(), .count(),
2 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");
}
}
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment