Add keypair & update pubkey

Keypair & FullKeypair match structs in damus ios

Signed-off-by: kernelkind <kernelkind@gmail.com>
Signed-off-by: William Casarin <jb55@jb55.com>
This commit is contained in:
kernelkind
2024-05-07 19:57:40 -04:00
committed by William Casarin
parent b8177459ab
commit e04c8821d5
4 changed files with 119 additions and 2 deletions

View File

@@ -1,14 +1,15 @@
use serde::{Deserialize, Deserializer, Serialize, Serializer};
use crate::Error;
use hex;
use log::debug;
//use nostr::key::XOnlyPublicKey;
use nostr::bech32::Hrp;
use std::fmt;
#[derive(Debug, Eq, PartialEq, Clone, Hash)]
pub struct Pubkey([u8; 32]);
static HRP_NPUB: Hrp = Hrp::parse_unchecked("npub");
impl Pubkey {
pub fn new(data: &[u8; 32]) -> Self {
Self(*data)
@@ -25,6 +26,41 @@ impl Pubkey {
pub fn from_hex(hex_str: &str) -> Result<Self, Error> {
Ok(Pubkey(hex::decode(hex_str)?.as_slice().try_into()?))
}
pub fn try_from_hex_str_with_verify(hex_str: &str) -> Result<Self, Error> {
let vec: Vec<u8> = hex::decode(hex_str)?;
if vec.len() != 32 {
Err(Error::HexDecodeFailed)
} else {
let _ = match nostr::secp256k1::XOnlyPublicKey::from_slice(&vec) {
Ok(r) => Ok(r),
Err(_) => Err(Error::InvalidPublicKey),
}?;
Ok(Pubkey(vec.try_into().unwrap()))
}
}
pub fn try_from_bech32_string(s: &str, verify: bool) -> Result<Self, Error> {
let data = match nostr::bech32::decode(s) {
Ok(res) => Ok(res),
Err(_) => Err(Error::InvalidBech32),
}?;
if data.0 != HRP_NPUB {
Err(Error::InvalidBech32)
} else if data.1.len() != 32 {
Err(Error::InvalidByteSize)
} else {
if verify {
let _ = match nostr::secp256k1::XOnlyPublicKey::from_slice(&data.1) {
Ok(r) => Ok(r),
Err(_) => Err(Error::InvalidPublicKey),
}?;
}
Ok(Pubkey(data.1.try_into().unwrap()))
}
}
}
impl fmt::Display for Pubkey {