Select Git revision
certification.rs 12.72 KiB
// Copyright (C) 2018 The Duniter Project Developers.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
//! Wrappers around Certification documents.
extern crate serde;
use duniter_crypto::keys::{PublicKey, Signature, ed25519};
use regex::Regex;
use self::serde::ser::{Serialize, Serializer};
use Blockstamp;
use blockchain::{BlockchainProtocol, Document, DocumentBuilder, IntoSpecializedDocument};
use blockchain::v10::documents::{StandardTextDocumentParser, TextDocument, TextDocumentBuilder,
V10Document, V10DocumentParsingError};
lazy_static! {
static ref CERTIFICATION_REGEX: Regex = Regex::new(
"^Issuer: (?P<issuer>[1-9A-Za-z][^OIl]{43,44})\n\
IdtyIssuer: (?P<target>[1-9A-Za-z][^OIl]{43,44})\n\
IdtyUniqueID: (?P<idty_uid>[[:alnum:]_-]+)\n\
IdtyTimestamp: (?P<idty_blockstamp>[0-9]+-[0-9A-F]{64})\n\
IdtySignature: (?P<idty_sig>(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?)\n\
CertTimestamp: (?P<blockstamp>[0-9]+-[0-9A-F]{64})\n$"
).unwrap();
}
/// Wrap an Certification document.
///
/// Must be created by parsing a text document or using a builder.
#[derive(Debug, Clone)]
pub struct CertificationDocument {
/// Document as text.
///
/// Is used to check signatures, and other values mut be extracted from it.
text: String,
/// Name of the currency.
currency: String,
/// Document issuer (there should be only one).
issuers: Vec<ed25519::PublicKey>,
/// issuer of target identity.
target: ed25519::PublicKey,
/// Username of target identity
identity_username: String,
/// Target Identity document blockstamp.
identity_blockstamp: Blockstamp,
/// Target Identity document signature.
identity_sig: ed25519::Signature,
/// Blockstamp
blockstamp: Blockstamp,
/// Document signature (there should be only one).
signatures: Vec<ed25519::Signature>,
}
impl CertificationDocument {
/// Username of target identity
pub fn identity_username(&self) -> &str {