Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
67 changes: 6 additions & 61 deletions ntge-core/src/ed25519.rs
Original file line number Diff line number Diff line change
Expand Up @@ -56,16 +56,7 @@ pub fn deserialize_private_key(encoded: &str) -> Result<SecretKey, error::CoreEr

// 2. decode bech32 to base32
let bech32_encoded = components[0];
let (hrp, base32_encoded) = match bech32::decode(&bech32_encoded) {
Ok(tuple) => tuple,
Err(_) => {
let core_error = error::CoreError::KeyDeserializeError {
name: "PrivateKey",
reason: "cannot decode bech32 key payload",
};
return Err(core_error);
}
};
let (hrp, base32_encoded) = bech32::decode(&bech32_encoded)?;

// 3. check hrp
if hrp != "pri" {
Expand All @@ -77,28 +68,10 @@ pub fn deserialize_private_key(encoded: &str) -> Result<SecretKey, error::CoreEr
}

// 4. decode base32 to bytes
let bytes = match Vec::<u8>::from_base32(&base32_encoded) {
Ok(bytes) => bytes,
Err(_) => {
let e = error::CoreError::KeyDeserializeError {
name: "PrivateKey",
reason: "cannot decode base32 key payload",
};
return Err(e);
}
};
let bytes = Vec::<u8>::from_base32(&base32_encoded)?;

// 5. restore key from bytes
let private_key = match SecretKey::from_bytes(&bytes) {
Ok(key) => key,
Err(_) => {
let e = error::CoreError::KeyDeserializeError {
name: "PrivateKey",
reason: "cannot restore key from payload",
};
return Err(e);
}
};
let private_key = SecretKey::from_bytes(&bytes)?;

Ok(private_key)
}
Expand Down Expand Up @@ -128,16 +101,7 @@ pub fn deserialize_public_key(encoded: &str) -> Result<PublicKey, error::CoreErr

// 2. decode bech32 to base32
let bech32_encoded = components[0];
let (hrp, base32_encoded) = match bech32::decode(&bech32_encoded) {
Ok(tuple) => tuple,
Err(_) => {
let core_error = error::CoreError::KeyDeserializeError {
name: "PublicKey",
reason: "cannot decode bech32 key payload",
};
return Err(core_error);
}
};
let (hrp, base32_encoded) = bech32::decode(&bech32_encoded)?;

// 3. check hrp
if hrp != "pub" {
Expand All @@ -149,28 +113,9 @@ pub fn deserialize_public_key(encoded: &str) -> Result<PublicKey, error::CoreErr
}

// 4. decode base32 to bytes
let bytes = match Vec::<u8>::from_base32(&base32_encoded) {
Ok(bytes) => bytes,
Err(_) => {
let e = error::CoreError::KeyDeserializeError {
name: "PublicKey",
reason: "cannot decode base32 key payload",
};
return Err(e);
}
};
let bytes = Vec::<u8>::from_base32(&base32_encoded)?;

// 5. restore key from bytes
let public_key = match PublicKey::from_bytes(&bytes) {
Ok(key) => key,
Err(_) => {
let e = error::CoreError::KeyDeserializeError {
name: "PublicKey",
reason: "cannot restore key from payload",
};
return Err(e);
}
};
let public_key = PublicKey::from_bytes(&bytes)?;

Ok(public_key)
}
Expand Down
42 changes: 41 additions & 1 deletion ntge-core/src/error.rs
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
use core::fmt;
use core::fmt::Display;

use ed25519_dalek::SignatureError;
use bson::EncoderError;
use bson::DecoderError;

#[cfg(feature = "std")]
use std::error::Error;

#[derive(Clone, Copy, Debug, Eq, PartialEq, Hash)]
#[derive(Debug)]
pub enum CoreError {
KeyDeserializeError {
name: &'static str,
Expand Down Expand Up @@ -49,3 +53,39 @@ impl Display for CoreError {
}
}
}

impl From<SignatureError> for CoreError {
fn from(_: SignatureError) -> Self {
CoreError::KeyDeserializeError {
name: "PublicKey",
reason: "cannot restore key from payload",
}
}
}

impl From<bech32::Error> for CoreError {
fn from(_: bech32::Error) -> Self {
CoreError::KeyDeserializeError {
name: "PrivateKey",
reason: "cannot decode base32 key payload",
}
}
}

impl From<EncoderError> for CoreError {
fn from(_: EncoderError) -> Self {
CoreError::MessageSerializationError {
name: "Message",
reason: "cannot encode message to bson",
}
}
}

impl From<DecoderError> for CoreError {
fn from(_: DecoderError) -> Self {
CoreError::KeyDeserializeError {
name: "Message",
reason: "cannot decode bson bytes to message document",
}
}
}
13 changes: 2 additions & 11 deletions ntge-core/src/message.rs
Original file line number Diff line number Diff line change
Expand Up @@ -121,18 +121,9 @@ impl Message {
}
}

#[allow(ptr_arg)]
#[allow(clippy::ptr_arg)]
fn deserialize_from_bson_bytes(bytes: &Vec<u8>) -> Result<Message, CoreError> {
let document = match bson::decode_document(&mut std::io::Cursor::new(&bytes[..])) {
Ok(document) => document,
Err(_) => {
let e = CoreError::KeyDeserializeError {
name: "Message",
reason: "cannot decode bson bytes to message document",
};
return Err(e);
}
};
let document = bson::decode_document(&mut std::io::Cursor::new(&bytes[..]))?;

let result: Result<Message, _> = bson::from_bson(bson::Bson::Document(document));
result.map_err(|_| CoreError::KeyDeserializeError {
Expand Down