Skip to content

Commit 5be67ba

Browse files
committed
nostr: remove support for NIP-44 v1
Signed-off-by: Yuki Kishimoto <[email protected]>
1 parent d9fc081 commit 5be67ba

File tree

4 files changed

+2
-107
lines changed

4 files changed

+2
-107
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@
6868

6969
* Remove deprecated methods/functions ([Yuki Kishimoto])
7070
* nostr: remove support for `nrelay` NIP-19 entity ([Yuki Kishimoto])
71+
* nostr: remove support for NIP-44 v1 ([Yuki Kishimoto])
7172
* cli: remove `tracing-subscriber` dep
7273

7374
## [v0.33.0]

bindings/nostr-ffi/src/nips/nip44.rs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,13 @@ use crate::{PublicKey, SecretKey};
1313
/// NIP44 Version
1414
#[derive(Enum)]
1515
pub enum Nip44Version {
16-
/// V1 (deprecated)
17-
Deprecated,
1816
/// V2 - Secp256k1 ECDH, HKDF, padding, ChaCha20, HMAC-SHA256 and base64
1917
V2,
2018
}
2119

2220
impl From<Nip44Version> for Version {
2321
fn from(version: Nip44Version) -> Self {
2422
match version {
25-
#[allow(deprecated)]
26-
Nip44Version::Deprecated => Self::V1,
2723
Nip44Version::V2 => Self::V2,
2824
}
2925
}

bindings/nostr-js/src/nips/nip44.rs

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,12 @@ use crate::key::{JsPublicKey, JsSecretKey};
1212

1313
#[wasm_bindgen(js_name = NIP44Version)]
1414
pub enum JsNIP44Version {
15-
/// V1 - Deprecated
16-
Deprecated = 1,
1715
V2 = 2,
1816
}
1917

2018
impl From<Version> for JsNIP44Version {
2119
fn from(version: Version) -> Self {
2220
match version {
23-
#[allow(deprecated)]
24-
Version::V1 => Self::Deprecated,
2521
Version::V2 => Self::V2,
2622
}
2723
}
@@ -30,8 +26,6 @@ impl From<Version> for JsNIP44Version {
3026
impl From<JsNIP44Version> for Version {
3127
fn from(version: JsNIP44Version) -> Self {
3228
match version {
33-
#[allow(deprecated)]
34-
JsNIP44Version::Deprecated => Self::V1,
3529
JsNIP44Version::V2 => Self::V2,
3630
}
3731
}

crates/nostr/src/nips/nip44/mod.rs

Lines changed: 1 addition & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -11,18 +11,14 @@ use alloc::vec::Vec;
1111
use core::fmt;
1212

1313
use base64::engine::{general_purpose, Engine};
14-
use bitcoin::hashes::sha256::Hash as Sha256Hash;
15-
use bitcoin::hashes::Hash;
1614
#[cfg(feature = "std")]
1715
use bitcoin::secp256k1::rand::rngs::OsRng;
1816
use bitcoin::secp256k1::rand::RngCore;
19-
use chacha20::cipher::{KeyIvInit, StreamCipher};
20-
use chacha20::XChaCha20;
2117

2218
pub mod v2;
2319

2420
use self::v2::ConversationKey;
25-
use crate::{util, PublicKey, SecretKey};
21+
use crate::{PublicKey, SecretKey};
2622

2723
/// Error
2824
#[derive(Debug, PartialEq, Eq)]
@@ -76,11 +72,6 @@ impl From<base64::DecodeError> for Error {
7672
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
7773
#[repr(u8)]
7874
pub enum Version {
79-
/// Reserved
80-
// Reserved = 0x00,
81-
/// V1 (deprecated)
82-
#[deprecated]
83-
V1 = 0x01,
8475
/// V2 - Secp256k1 ECDH, HKDF, padding, ChaCha20, HMAC-SHA256 and base64
8576
#[default]
8677
V2 = 0x02,
@@ -99,8 +90,6 @@ impl TryFrom<u8> for Version {
9990

10091
fn try_from(version: u8) -> Result<Self, Self::Error> {
10192
match version {
102-
#[allow(deprecated)]
103-
0x01 => Ok(Self::V1),
10493
0x02 => Ok(Self::V2),
10594
v => Err(Error::UnknownVersion(v)),
10695
}
@@ -135,31 +124,6 @@ where
135124
T: AsRef<[u8]>,
136125
{
137126
match version {
138-
#[allow(deprecated)]
139-
Version::V1 => {
140-
// Compose key
141-
let shared_key: [u8; 32] = util::generate_shared_key(secret_key, public_key);
142-
let key: Sha256Hash = Sha256Hash::hash(&shared_key);
143-
144-
// Generate 192-bit nonce
145-
let mut nonce: [u8; 24] = [0u8; 24];
146-
rng.fill_bytes(&mut nonce);
147-
148-
// Compose cipher
149-
let mut cipher = XChaCha20::new(key.as_byte_array().into(), &nonce.into());
150-
151-
// Encrypt
152-
let mut buffer: Vec<u8> = content.as_ref().to_vec();
153-
cipher.apply_keystream(&mut buffer);
154-
155-
// Compose payload
156-
let mut payload: Vec<u8> = vec![version.as_u8()];
157-
payload.extend_from_slice(nonce.as_slice());
158-
payload.extend(buffer);
159-
160-
// Encode payload to base64
161-
Ok(general_purpose::STANDARD.encode(payload))
162-
}
163127
Version::V2 => {
164128
let conversation_key: ConversationKey = ConversationKey::derive(secret_key, public_key);
165129
let payload: Vec<u8> = v2::encrypt_to_bytes_with_rng(rng, &conversation_key, content)?;
@@ -198,29 +162,6 @@ where
198162
let version: u8 = *payload.first().ok_or(Error::VersionNotFound)?;
199163

200164
match Version::try_from(version)? {
201-
#[allow(deprecated)]
202-
Version::V1 => {
203-
// Get data from payload
204-
let nonce: &[u8] = payload
205-
.get(1..25)
206-
.ok_or_else(|| Error::NotFound(String::from("nonce")))?;
207-
let ciphertext: &[u8] = payload
208-
.get(25..)
209-
.ok_or_else(|| Error::NotFound(String::from("ciphertext")))?;
210-
211-
// Compose key
212-
let shared_key: [u8; 32] = util::generate_shared_key(secret_key, public_key);
213-
let key: Sha256Hash = Sha256Hash::hash(&shared_key);
214-
215-
// Compose cipher
216-
let mut cipher = XChaCha20::new(key.as_byte_array().into(), nonce.into());
217-
218-
// Decrypt
219-
let mut buffer: Vec<u8> = ciphertext.to_vec();
220-
cipher.apply_keystream(&mut buffer);
221-
222-
Ok(buffer)
223-
}
224165
Version::V2 => {
225166
let conversation_key: ConversationKey = ConversationKey::derive(secret_key, public_key);
226167
v2::decrypt_to_bytes(&conversation_key, &payload)
@@ -265,41 +206,4 @@ mod tests {
265206
content
266207
);
267208
}
268-
269-
#[test]
270-
fn test_nip44_decryption() {
271-
let secret_key =
272-
SecretKey::from_str("0000000000000000000000000000000000000000000000000000000000000002")
273-
.unwrap();
274-
let public_key =
275-
PublicKey::from_str("1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdeb")
276-
.unwrap();
277-
let payload =
278-
"AUXEhLosA5eFMYOtumkiFW4Joq1OPmkU8k/25+3+VDFvOU39qkUDl1aiy8Q+0ozTwbhD57VJoIYayYS++hE=";
279-
assert_eq!(
280-
decrypt(&secret_key, &public_key, payload).unwrap(),
281-
String::from("A Peer-to-Peer Electronic Cash System")
282-
);
283-
284-
let secret_key =
285-
SecretKey::from_str("0000000000000000000000000000000000000000000000000000000000000001")
286-
.unwrap();
287-
let public_key =
288-
PublicKey::from_str("79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798")
289-
.unwrap();
290-
let payload = "AdYN4IQFz5veUIFH6CIkrGr0CcErnlSS4VdvoQaP2DCB1dIFL72HSriG1aFABcTlu86hrsG0MdOO9rPdVXc3jptMMzqvIN6tJlHPC8GdwFD5Y8BT76xIIOTJR2W0IdrM7++WC/9harEJAdeWHDAC9zNJX81CpCz4fnV1FZ8GxGLC0nUF7NLeUiNYu5WFXQuO9uWMK0pC7tk3XVogk90X6rwq0MQG9ihT7e1elatDy2YGat+VgQlDrz8ZLRw/lvU+QqeXMQgjqn42sMTrimG6NdKfHJSVWkT6SKZYVsuTyU1Iu5Nk0twEV8d11/MPfsMx4i36arzTC9qxE6jftpOoG8f/jwPTSCEpHdZzrb/CHJcpc+zyOW9BZE2ZOmSxYHAE0ustC9zRNbMT3m6LqxIoHq8j+8Ysu+Cwqr4nUNLYq/Q31UMdDg1oamYS17mWIAS7uf2yF5uT5IlG";
291-
assert_eq!(decrypt(&secret_key, &public_key, payload).unwrap(), String::from("A purely peer-to-peer version of electronic cash would allow online payments to be sent directly from one party to another without going through a financial institution. Digital signatures provide part of the solution, but the main benefits are lost if a trusted third party is still required to prevent double-spending."));
292-
293-
let secret_key =
294-
SecretKey::from_str("fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364139")
295-
.unwrap();
296-
let public_key =
297-
PublicKey::from_str("0000000000000000000000000000000000000000000000000000000000000002")
298-
.unwrap();
299-
let payload = "AfSBdQ4T36kLcit8zg2znYCw2y6JXMMAGjM=";
300-
assert_eq!(
301-
decrypt(&secret_key, &public_key, payload).unwrap(),
302-
String::from("a")
303-
);
304-
}
305209
}

0 commit comments

Comments
 (0)