// Copyright 2015-2018 Parity Technologies (UK) Ltd. // This file is part of Parity. // Parity is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // Parity 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 General Public License for more details. // You should have received a copy of the GNU General Public License // along with Parity. If not, see . use digest; use ring::digest::{SHA256, SHA512}; use ring::hmac::{self, SigningContext}; use std::marker::PhantomData; use std::ops::Deref; /// HMAC signature. pub struct Signature(hmac::Signature, PhantomData); impl Deref for Signature { type Target = [u8]; fn deref(&self) -> &Self::Target { self.0.as_ref() } } /// HMAC signing key. pub struct SigKey(hmac::SigningKey, PhantomData); impl SigKey { pub fn sha256(key: &[u8]) -> SigKey { SigKey(hmac::SigningKey::new(&SHA256, key), PhantomData) } } impl SigKey { pub fn sha512(key: &[u8]) -> SigKey { SigKey(hmac::SigningKey::new(&SHA512, key), PhantomData) } } /// Compute HMAC signature of `data`. pub fn sign(k: &SigKey, data: &[u8]) -> Signature { Signature(hmac::sign(&k.0, data), PhantomData) } /// Stateful HMAC computation. pub struct Signer(SigningContext, PhantomData); impl Signer { pub fn with(key: &SigKey) -> Signer { Signer(hmac::SigningContext::with_key(&key.0), PhantomData) } pub fn update(&mut self, data: &[u8]) { self.0.update(data) } pub fn sign(self) -> Signature { Signature(self.0.sign(), PhantomData) } } /// HMAC signature verification key. pub struct VerifyKey(hmac::VerificationKey, PhantomData); impl VerifyKey { pub fn sha256(key: &[u8]) -> VerifyKey { VerifyKey(hmac::VerificationKey::new(&SHA256, key), PhantomData) } } impl VerifyKey { pub fn sha512(key: &[u8]) -> VerifyKey { VerifyKey(hmac::VerificationKey::new(&SHA512, key), PhantomData) } } /// Verify HMAC signature of `data`. pub fn verify(k: &VerifyKey, data: &[u8], sig: &[u8]) -> bool { hmac::verify(&k.0, data, sig).is_ok() }