Skip to content

Commit 820f576

Browse files
committed
fix(store): switch SecretBytes to SecretBytesMut
This is done due to the recent Secrecy breaking changes induced by Bytes 0.5 tokio-rs/bytes#335 iqlusioninc/crates#301
1 parent 91112fb commit 820f576

File tree

4 files changed

+38
-31
lines changed

4 files changed

+38
-31
lines changed

crates/interledger-store/Cargo.toml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ path = "tests/redis/redis_tests.rs"
2121
required-features = ["redis"]
2222

2323
[dependencies]
24-
bytes = { version = "0.4.12", default-features = false }
24+
bytes = { version = "0.5", default-features = false }
2525
futures = { version = "0.3", default-features = false }
2626
interledger-api = { path = "../interledger-api", version = "^0.3.0", default-features = false }
2727
interledger-packet = { path = "../interledger-packet", version = "^0.4.0", default-features = false }
@@ -42,8 +42,8 @@ serde_json = { version = "1.0.41", default-features = false }
4242
tokio = { version = "0.2.6", default-features = false, features = ["macros", "rt-core"] }
4343
url = { version = "2.1.0", default-features = false, features = ["serde"] }
4444
http = { version = "0.2", default-features = false }
45-
secrecy = { version = "0.5.1", default-features = false, features = ["serde", "bytes"] }
46-
zeroize = { version = "1.0.0", default-features = false, features = ["bytes"] }
45+
secrecy = { version = "0.6", features = ["serde", "bytes"] }
46+
zeroize = { version = "1.0.0", default-features = false }
4747
num-bigint = { version = "0.2.3", default-features = false, features = ["std"]}
4848
uuid = { version = "0.8.1", default-features = false, features = ["serde"] }
4949

crates/interledger-store/src/account.rs

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use interledger_service_util::{
1111
use interledger_settlement::core::types::{SettlementAccount, SettlementEngineDetails};
1212
use log::error;
1313
use ring::aead;
14-
use secrecy::{ExposeSecret, SecretBytes, SecretString};
14+
use secrecy::{ExposeSecret, SecretBytesMut, SecretString};
1515
use serde::Serializer;
1616
use serde::{Deserialize, Serialize};
1717
use std::str::{self, FromStr};
@@ -31,14 +31,14 @@ pub struct Account {
3131
pub(crate) min_balance: Option<i64>,
3232
pub(crate) ilp_over_http_url: Option<Url>,
3333
#[serde(serialize_with = "optional_secret_bytes_to_utf8")]
34-
pub(crate) ilp_over_http_incoming_token: Option<SecretBytes>,
34+
pub(crate) ilp_over_http_incoming_token: Option<SecretBytesMut>,
3535
#[serde(serialize_with = "optional_secret_bytes_to_utf8")]
36-
pub(crate) ilp_over_http_outgoing_token: Option<SecretBytes>,
36+
pub(crate) ilp_over_http_outgoing_token: Option<SecretBytesMut>,
3737
pub(crate) ilp_over_btp_url: Option<Url>,
3838
#[serde(serialize_with = "optional_secret_bytes_to_utf8")]
39-
pub(crate) ilp_over_btp_incoming_token: Option<SecretBytes>,
39+
pub(crate) ilp_over_btp_incoming_token: Option<SecretBytesMut>,
4040
#[serde(serialize_with = "optional_secret_bytes_to_utf8")]
41-
pub(crate) ilp_over_btp_outgoing_token: Option<SecretBytes>,
41+
pub(crate) ilp_over_btp_outgoing_token: Option<SecretBytesMut>,
4242
pub(crate) settle_threshold: Option<i64>,
4343
pub(crate) settle_to: Option<i64>,
4444
pub(crate) routing_relation: RoutingRelation,
@@ -56,7 +56,7 @@ where
5656
}
5757

5858
fn optional_secret_bytes_to_utf8<S>(
59-
_bytes: &Option<SecretBytes>,
59+
_bytes: &Option<SecretBytesMut>,
6060
serializer: S,
6161
) -> Result<S::Ok, S::Error>
6262
where
@@ -118,17 +118,17 @@ impl Account {
118118
ilp_over_http_url,
119119
ilp_over_http_incoming_token: details
120120
.ilp_over_http_incoming_token
121-
.map(|token| SecretBytes::new(token.expose_secret().to_string())),
121+
.map(|token| SecretBytesMut::new(token.expose_secret().as_str())),
122122
ilp_over_http_outgoing_token: details
123123
.ilp_over_http_outgoing_token
124-
.map(|token| SecretBytes::new(token.expose_secret().to_string())),
124+
.map(|token| SecretBytesMut::new(token.expose_secret().as_str())),
125125
ilp_over_btp_url,
126126
ilp_over_btp_incoming_token: details
127127
.ilp_over_btp_incoming_token
128-
.map(|token| SecretBytes::new(token.expose_secret().to_string())),
128+
.map(|token| SecretBytesMut::new(token.expose_secret().as_str())),
129129
ilp_over_btp_outgoing_token: details
130130
.ilp_over_btp_outgoing_token
131-
.map(|token| SecretBytes::new(token.expose_secret().to_string())),
131+
.map(|token| SecretBytesMut::new(token.expose_secret().as_str())),
132132
settle_to: details.settle_to,
133133
settle_threshold: details.settle_threshold,
134134
routing_relation,
@@ -144,25 +144,25 @@ impl Account {
144144
encryption_key: &aead::LessSafeKey,
145145
) -> AccountWithEncryptedTokens {
146146
if let Some(ref token) = self.ilp_over_btp_outgoing_token {
147-
self.ilp_over_btp_outgoing_token = Some(SecretBytes::from(encrypt_token(
147+
self.ilp_over_btp_outgoing_token = Some(SecretBytesMut::from(encrypt_token(
148148
encryption_key,
149149
&token.expose_secret(),
150150
)));
151151
}
152152
if let Some(ref token) = self.ilp_over_http_outgoing_token {
153-
self.ilp_over_http_outgoing_token = Some(SecretBytes::from(encrypt_token(
153+
self.ilp_over_http_outgoing_token = Some(SecretBytesMut::from(encrypt_token(
154154
encryption_key,
155155
&token.expose_secret(),
156156
)));
157157
}
158158
if let Some(ref token) = self.ilp_over_btp_incoming_token {
159-
self.ilp_over_btp_incoming_token = Some(SecretBytes::from(encrypt_token(
159+
self.ilp_over_btp_incoming_token = Some(SecretBytesMut::from(encrypt_token(
160160
encryption_key,
161161
&token.expose_secret(),
162162
)));
163163
}
164164
if let Some(ref token) = self.ilp_over_http_incoming_token {
165-
self.ilp_over_http_incoming_token = Some(SecretBytes::from(encrypt_token(
165+
self.ilp_over_http_incoming_token = Some(SecretBytesMut::from(encrypt_token(
166166
encryption_key,
167167
&token.expose_secret(),
168168
)));

crates/interledger-store/src/crypto.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use bytes::Bytes;
1+
use bytes::BytesMut;
22
use ring::{
33
aead, hmac,
44
rand::{SecureRandom, SystemRandom},
@@ -8,7 +8,7 @@ const NONCE_LENGTH: usize = 12;
88
static ENCRYPTION_KEY_GENERATION_STRING: &[u8] = b"ilp_store_redis_encryption_key";
99

1010
use core::sync::atomic;
11-
use secrecy::{DebugSecret, Secret, SecretBytes};
11+
use secrecy::{DebugSecret, Secret, SecretBytesMut};
1212
use std::ptr;
1313
use zeroize::Zeroize;
1414

@@ -117,7 +117,7 @@ pub fn generate_keys(server_secret: &[u8]) -> (Secret<EncryptionKey>, Secret<Dec
117117
(encryption_key, decryption_key)
118118
}
119119

120-
pub fn encrypt_token(encryption_key: &aead::LessSafeKey, token: &[u8]) -> Bytes {
120+
pub fn encrypt_token(encryption_key: &aead::LessSafeKey, token: &[u8]) -> BytesMut {
121121
let mut token = token.to_vec();
122122

123123
let mut nonce: [u8; NONCE_LENGTH] = [0; NONCE_LENGTH];
@@ -129,7 +129,7 @@ pub fn encrypt_token(encryption_key: &aead::LessSafeKey, token: &[u8]) -> Bytes
129129
match encryption_key.seal_in_place_append_tag(nonce, aead::Aad::from(&[]), &mut token) {
130130
Ok(_) => {
131131
token.append(&mut nonce_copy.as_ref().to_vec());
132-
Bytes::from(token)
132+
BytesMut::from(token.as_slice())
133133
}
134134
_ => panic!("Unable to encrypt token"),
135135
}
@@ -138,7 +138,7 @@ pub fn encrypt_token(encryption_key: &aead::LessSafeKey, token: &[u8]) -> Bytes
138138
pub fn decrypt_token(
139139
decryption_key: &aead::LessSafeKey,
140140
encrypted: &[u8],
141-
) -> Result<SecretBytes, ()> {
141+
) -> Result<SecretBytesMut, ()> {
142142
if encrypted.len() < aead::MAX_TAG_LEN {
143143
return Err(());
144144
}
@@ -150,7 +150,7 @@ pub fn decrypt_token(
150150
let nonce = aead::Nonce::assume_unique_for_key(nonce);
151151

152152
if let Ok(token) = decryption_key.open_in_place(nonce, aead::Aad::empty(), &mut encrypted) {
153-
Ok(SecretBytes::new(token.to_vec()))
153+
Ok(SecretBytesMut::new(&token[..]))
154154
} else {
155155
Err(())
156156
}

crates/interledger-store/src/redis/mod.rs

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ use reconnect::RedisReconnect;
2020
use super::account::{Account, AccountWithEncryptedTokens};
2121
use super::crypto::{encrypt_token, generate_keys, DecryptionKey, EncryptionKey};
2222
use async_trait::async_trait;
23-
use bytes::Bytes;
23+
use bytes::{Bytes, BytesMut};
2424
use futures::channel::mpsc::UnboundedSender;
2525
use http::StatusCode;
2626
use interledger_api::{AccountDetails, AccountSettings, EncryptedAccountSettings, NodeStore};
@@ -47,7 +47,7 @@ use redis_crate::{
4747
self, cmd, from_redis_value, Client, ConnectionInfo, ControlFlow, ErrorKind, FromRedisValue,
4848
PubSubCommands, RedisError, RedisWrite, Script, ToRedisArgs, Value,
4949
};
50-
use secrecy::{ExposeSecret, Secret, SecretBytes};
50+
use secrecy::{ExposeSecret, Secret, SecretBytesMut};
5151
use serde::{Deserialize, Serialize};
5252
use serde_json;
5353
use std::{
@@ -993,24 +993,28 @@ impl NodeStore for RedisStore {
993993
&encryption_key.expose_secret().0,
994994
token.expose_secret().as_bytes(),
995995
)
996+
.freeze()
996997
}),
997998
ilp_over_http_incoming_token: settings.ilp_over_http_incoming_token.map(|token| {
998999
encrypt_token(
9991000
&encryption_key.expose_secret().0,
10001001
token.expose_secret().as_bytes(),
10011002
)
1003+
.freeze()
10021004
}),
10031005
ilp_over_btp_outgoing_token: settings.ilp_over_btp_outgoing_token.map(|token| {
10041006
encrypt_token(
10051007
&encryption_key.expose_secret().0,
10061008
token.expose_secret().as_bytes(),
10071009
)
1010+
.freeze()
10081011
}),
10091012
ilp_over_http_outgoing_token: settings.ilp_over_http_outgoing_token.map(|token| {
10101013
encrypt_token(
10111014
&encryption_key.expose_secret().0,
10121015
token.expose_secret().as_bytes(),
10131016
)
1017+
.freeze()
10141018
}),
10151019
};
10161020

@@ -2032,23 +2036,23 @@ impl FromRedisValue for AccountWithEncryptedTokens {
20322036
"ilp_over_http_incoming_token",
20332037
&hash,
20342038
)?
2035-
.map(SecretBytes::from),
2039+
.map(SecretBytesMut::from),
20362040
ilp_over_http_outgoing_token: get_bytes_option(
20372041
"ilp_over_http_outgoing_token",
20382042
&hash,
20392043
)?
2040-
.map(SecretBytes::from),
2044+
.map(SecretBytesMut::from),
20412045
ilp_over_btp_url: get_url_option("ilp_over_btp_url", &hash)?,
20422046
ilp_over_btp_incoming_token: get_bytes_option(
20432047
"ilp_over_btp_incoming_token",
20442048
&hash,
20452049
)?
2046-
.map(SecretBytes::from),
2050+
.map(SecretBytesMut::from),
20472051
ilp_over_btp_outgoing_token: get_bytes_option(
20482052
"ilp_over_btp_outgoing_token",
20492053
&hash,
20502054
)?
2051-
.map(SecretBytes::from),
2055+
.map(SecretBytesMut::from),
20522056
max_packet_amount: get_value("max_packet_amount", &hash)?,
20532057
min_balance: get_value_option("min_balance", &hash)?,
20542058
settle_threshold: get_value_option("settle_threshold", &hash)?,
@@ -2089,10 +2093,13 @@ where
20892093
}
20902094
}
20912095

2092-
fn get_bytes_option(key: &str, map: &HashMap<String, Value>) -> Result<Option<Bytes>, RedisError> {
2096+
fn get_bytes_option(
2097+
key: &str,
2098+
map: &HashMap<String, Value>,
2099+
) -> Result<Option<BytesMut>, RedisError> {
20932100
if let Some(ref value) = map.get(key) {
20942101
let vec: Vec<u8> = from_redis_value(value)?;
2095-
Ok(Some(Bytes::from(vec)))
2102+
Ok(Some(BytesMut::from(vec.as_slice())))
20962103
} else {
20972104
Ok(None)
20982105
}

0 commit comments

Comments
 (0)