trust-graph/identity/src/key_pair.rs

169 lines
5.3 KiB
Rust
Raw Normal View History

2021-01-15 19:37:06 +03:00
/*
* Copyright 2020 Fluence Labs Limited
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
2021-01-19 17:25:28 +03:00
use crate::ed25519::Keypair as Libp2pKeyPair;
use crate::public_key::PublicKey;
use crate::secret_key::SecretKey;
use crate::signature::Signature;
2021-01-15 19:37:06 +03:00
use ed25519_dalek::SignatureError;
use ed25519_dalek::Signer;
2021-01-18 20:14:40 +03:00
2021-01-18 20:08:05 +03:00
use rand::rngs::OsRng;
2021-01-19 17:25:28 +03:00
use std::fmt;
2021-01-15 19:37:06 +03:00
/// An Ed25519 keypair.
2021-01-18 20:08:05 +03:00
#[derive(Debug)]
2021-01-15 19:37:06 +03:00
pub struct KeyPair {
key_pair: ed25519_dalek::Keypair,
}
2021-01-15 19:37:06 +03:00
impl KeyPair {
/// Generate a new Ed25519 keypair.
#[allow(dead_code)]
pub fn generate() -> Self {
2021-01-19 17:25:28 +03:00
let mut csprng = OsRng {};
2021-01-18 20:08:05 +03:00
let kp = ed25519_dalek::Keypair::generate(&mut csprng);
2021-01-15 19:37:06 +03:00
kp.into()
}
pub fn public(&self) -> PublicKey {
PublicKey(self.key_pair.public)
}
pub fn secret(&self) -> SecretKey {
let b = self.key_pair.secret.to_bytes();
SecretKey::from_bytes(&b).expect("SecretKey::from_bytes(to_bytes(k)) != k")
}
2021-01-18 20:08:05 +03:00
pub fn from_bytes(sk_bytes: &[u8]) -> Result<Self, SignatureError> {
let kp = ed25519_dalek::Keypair::from_bytes(sk_bytes)?;
2021-01-19 17:25:28 +03:00
Ok(KeyPair { key_pair: kp })
2021-01-15 19:37:06 +03:00
}
/// Encode the keypair into a byte array by concatenating the bytes
/// of the secret scalar and the compressed public point/
#[allow(dead_code)]
pub fn encode(&self) -> [u8; 64] {
2021-01-18 20:08:05 +03:00
self.key_pair.to_bytes()
2021-01-15 19:37:06 +03:00
}
/// Decode a keypair from the format produced by `encode`.
#[allow(dead_code)]
pub fn decode(kp: &[u8]) -> Result<KeyPair, SignatureError> {
let kp = ed25519_dalek::Keypair::from_bytes(kp)?;
2021-01-19 17:25:28 +03:00
Ok(Self { key_pair: kp })
2021-01-15 19:37:06 +03:00
}
/// Get the public key of this keypair.
#[allow(dead_code)]
pub fn public_key(&self) -> PublicKey {
PublicKey(self.key_pair.public)
2021-01-15 19:37:06 +03:00
}
/// Sign a message using the private key of this keypair.
2021-01-18 20:08:05 +03:00
pub fn sign(&self, msg: &[u8]) -> Signature {
Signature(self.key_pair.sign(msg))
2021-01-15 19:37:06 +03:00
}
/// Verify the Ed25519 signature on a message using the public key.
2021-02-11 17:57:09 +03:00
pub fn verify(pk: &PublicKey, msg: &[u8], signature: &Signature) -> Result<(), SignatureError> {
2021-01-18 20:08:05 +03:00
// let signature = ed25519_dalek::Signature::from_bytes(signature)
// .map_err(|err| format!("Cannot convert bytes to a signature: {:?}", err))?;
pk.verify_strict(msg, signature)
2021-01-15 19:37:06 +03:00
}
}
impl From<Libp2pKeyPair> for KeyPair {
fn from(kp: Libp2pKeyPair) -> Self {
2021-03-11 14:48:58 +03:00
// TODO: this is a hack. Convert directly. Maybe use mem::transmute?
2021-01-18 20:08:05 +03:00
let kp = ed25519_dalek::Keypair::from_bytes(&kp.encode()).unwrap();
Self { key_pair: kp }
}
}
impl From<ed25519_dalek::Keypair> for KeyPair {
fn from(kp: ed25519_dalek::Keypair) -> Self {
2021-01-15 19:37:06 +03:00
Self { key_pair: kp }
}
}
2021-03-11 14:48:58 +03:00
impl From<KeyPair> for ed25519_dalek::Keypair {
fn from(kp: KeyPair) -> Self {
kp.key_pair
}
}
impl From<KeyPair> for Libp2pKeyPair {
fn from(kp: KeyPair) -> Self {
Libp2pKeyPair::from(kp.key_pair)
}
}
2021-01-15 19:37:06 +03:00
/// Implement serde::Deserialize for KeyPair
impl<'de> serde::Deserialize<'de> for KeyPair {
fn deserialize<D>(deserializer: D) -> Result<KeyPair, D::Error>
where
D: serde::Deserializer<'de>,
{
use serde::de::{Error, Unexpected, Visitor};
struct KeyPairVisitor;
impl<'de> Visitor<'de> for KeyPairVisitor {
type Value = KeyPair;
/// Error message stating what was expected
fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
formatter.write_str("byte array or base58 string")
}
/// Implement deserialization from base58 string
fn visit_str<E>(self, s: &str) -> Result<Self::Value, E>
where
E: Error,
{
bs58::decode(s)
.into_vec()
.map_err(|_| Error::invalid_value(Unexpected::Str(s), &self))
.and_then(|v| self.visit_bytes(v.as_slice()))
}
/// Implement deserialization from bytes
fn visit_bytes<E>(self, b: &[u8]) -> Result<Self::Value, E>
where
E: Error,
{
KeyPair::decode(b).map_err(|_| Error::invalid_value(Unexpected::Bytes(b), &self))
}
}
deserializer.deserialize_str(KeyPairVisitor)
}
}
2021-01-18 20:27:47 +03:00
impl Clone for KeyPair {
fn clone(&self) -> KeyPair {
2021-02-11 15:16:40 +03:00
let sk_bytes = self.key_pair.secret.to_bytes();
let secret = ed25519_dalek::SecretKey::from_bytes(&sk_bytes)
2021-01-18 20:27:47 +03:00
.expect("ed25519::SecretKey::from_bytes(to_bytes(k)) != k");
let public = ed25519_dalek::PublicKey::from_bytes(&self.key_pair.public.to_bytes())
2021-01-18 20:27:47 +03:00
.expect("ed25519::PublicKey::from_bytes(to_bytes(k)) != k");
2021-01-19 17:25:28 +03:00
KeyPair {
key_pair: ed25519_dalek::Keypair { secret, public },
}
2021-01-18 20:27:47 +03:00
}
}