mirror of
https://github.com/mimblewimble/grin-wallet.git
synced 2025-02-08 04:11:08 +03:00
rework decode_slatepack function to accept decryption key indices (#445)
This commit is contained in:
parent
d9c6bd89e2
commit
040b28f35a
5 changed files with 72 additions and 16 deletions
|
@ -2117,13 +2117,16 @@ where
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Decode an armored slatepack, returning a Slatepack object that can be
|
/// Decode an armored slatepack, returning a Slatepack object that can be
|
||||||
/// viewed, manipulated, output as json, etc
|
/// viewed, manipulated, output as json, etc. The resulting slatepack will be
|
||||||
|
/// decrypted by this wallet if possible
|
||||||
///
|
///
|
||||||
/// # Arguments
|
/// # Arguments
|
||||||
///
|
///
|
||||||
/// * `keychain_mask` - Wallet secret mask to XOR against the stored wallet seed before using
|
/// * `keychain_mask` - Wallet secret mask to XOR against the stored wallet seed before using
|
||||||
/// * `slatepack` - A string representing an armored slatepack
|
/// * `slatepack` - A string representing an armored slatepack
|
||||||
/// * `decrypt` - If true and the slatepack message content is encrypted, attempt to decrypt
|
/// * `secret_indices` - Indices along this wallet's deriviation path with which to attempt
|
||||||
|
/// decryption. If this wallet can't decrypt this slatepack, the payload of the returned
|
||||||
|
/// Slatepack will remain encrypted.
|
||||||
///
|
///
|
||||||
/// # Returns
|
/// # Returns
|
||||||
/// * Ok with a [Slatepack](../grin_wallet_libwallet/slatepack/types/struct.Slatepack.html) if successful
|
/// * Ok with a [Slatepack](../grin_wallet_libwallet/slatepack/types/struct.Slatepack.html) if successful
|
||||||
|
@ -2143,18 +2146,25 @@ where
|
||||||
/// # let slatepack_string = String::from("");
|
/// # let slatepack_string = String::from("");
|
||||||
/// // .. receive a slatepack from somewhere
|
/// // .. receive a slatepack from somewhere
|
||||||
/// let res = api_owner.decode_slatepack_message(
|
/// let res = api_owner.decode_slatepack_message(
|
||||||
|
/// None,
|
||||||
/// slatepack_string,
|
/// slatepack_string,
|
||||||
/// false,
|
/// vec![0, 1, 2],
|
||||||
/// );
|
/// );
|
||||||
///
|
///
|
||||||
/// ```
|
/// ```
|
||||||
|
|
||||||
pub fn decode_slatepack_message(
|
pub fn decode_slatepack_message(
|
||||||
&self,
|
&self,
|
||||||
|
keychain_mask: Option<&SecretKey>,
|
||||||
slatepack: String,
|
slatepack: String,
|
||||||
decrypt: bool,
|
secret_indices: Vec<u32>,
|
||||||
) -> Result<Slatepack, Error> {
|
) -> Result<Slatepack, Error> {
|
||||||
owner::decode_slatepack_message(slatepack, decrypt)
|
owner::decode_slatepack_message(
|
||||||
|
self.wallet_inst.clone(),
|
||||||
|
keychain_mask,
|
||||||
|
slatepack,
|
||||||
|
secret_indices,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// PAYMENT PROOFS
|
// PAYMENT PROOFS
|
||||||
|
|
|
@ -1577,8 +1577,9 @@ pub trait OwnerRpc {
|
||||||
"jsonrpc": "2.0",
|
"jsonrpc": "2.0",
|
||||||
"method": "decode_slatepack_message",
|
"method": "decode_slatepack_message",
|
||||||
"params": {
|
"params": {
|
||||||
"message": "BEGINSLATEPACK. t9EcGgrKr1GFCQB SK2jPCxME6Hgpqx bntpQm3zKFycoPY nW4UeoL4KQ7ExNK At6EQsvpz6MjUs8 6WG8KHEbMfqufJQ ZJTw2gkcdJmJjiJ f29oGgYqqXDZox4 ujPSjrtoxCN4h3e i1sZ8dYsm3dPeXL 7VQLsYNjAefciqj ZJXPm4Pqd7VDdd4 okGBGBu3YJvYzT6 arAxeCEx66us31h AJLcDweFwyWBkW5 J1DLiYAjt5ftFTo CjpfW9KjiLq2LM5 jepXWEHJPSDAYVK 4macDZUhRbJiG6E hrQcPrJBVC716mb Hw5E1PFrE6on5wq oEmrS4j9vaB5nw8 Z9ZyXvPc2LN7tER yt6pSHZeY9EpYdY zv4bthzfRfF8ePT TMeMpV2gpgyRXQa CPD2TR. ENDSLATEPACK.\n",
|
"token": "d202964900000000d302964900000000d402964900000000d502964900000000",
|
||||||
"decrypt" : false
|
"secret_indices": [0],
|
||||||
|
"message": "BEGINSLATEPACK. t9EcGgrKr1GFCQB SK2jPCxME6Hgpqx bntpQm3zKFycoPY nW4UeoL4KQ7ExNK At6EQsvpz6MjUs8 6WG8KHEbMfqufJQ ZJTw2gkcdJmJjiJ f29oGgYqqXDZox4 ujPSjrtoxCN4h3e i1sZ8dYsm3dPeXL 7VQLsYNjAefciqj ZJXPm4Pqd7VDdd4 okGBGBu3YJvYzT6 arAxeCEx66us31h AJLcDweFwyWBkW5 J1DLiYAjt5ftFTo CjpfW9KjiLq2LM5 jepXWEHJPSDAYVK 4macDZUhRbJiG6E hrQcPrJBVC716mb Hw5E1PFrE6on5wq oEmrS4j9vaB5nw8 Z9ZyXvPc2LN7tER yt6pSHZeY9EpYdY zv4bthzfRfF8ePT TMeMpV2gpgyRXQa CPD2TR. ENDSLATEPACK.\n"
|
||||||
},
|
},
|
||||||
"id": 1
|
"id": 1
|
||||||
}
|
}
|
||||||
|
@ -1604,8 +1605,9 @@ pub trait OwnerRpc {
|
||||||
|
|
||||||
fn decode_slatepack_message(
|
fn decode_slatepack_message(
|
||||||
&self,
|
&self,
|
||||||
|
token: Token,
|
||||||
message: String,
|
message: String,
|
||||||
decrypt: bool,
|
secret_indices: Vec<u32>,
|
||||||
) -> Result<Slatepack, ErrorKind>;
|
) -> Result<Slatepack, ErrorKind>;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -2077,10 +2079,17 @@ where
|
||||||
|
|
||||||
fn decode_slatepack_message(
|
fn decode_slatepack_message(
|
||||||
&self,
|
&self,
|
||||||
|
token: Token,
|
||||||
message: String,
|
message: String,
|
||||||
decrypt: bool,
|
secret_indices: Vec<u32>,
|
||||||
) -> Result<Slatepack, ErrorKind> {
|
) -> Result<Slatepack, ErrorKind> {
|
||||||
Owner::decode_slatepack_message(self, message, decrypt).map_err(|e| e.kind())
|
Owner::decode_slatepack_message(
|
||||||
|
self,
|
||||||
|
(&token.keychain_mask).as_ref(),
|
||||||
|
message,
|
||||||
|
secret_indices,
|
||||||
|
)
|
||||||
|
.map_err(|e| e.kind())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn retrieve_payment_proof(
|
fn retrieve_payment_proof(
|
||||||
|
|
|
@ -626,7 +626,8 @@ where
|
||||||
|api, m| {
|
|api, m| {
|
||||||
slate =
|
slate =
|
||||||
api.slate_from_slatepack_message(m, message.clone(), vec![0])?;
|
api.slate_from_slatepack_message(m, message.clone(), vec![0])?;
|
||||||
let slatepack = api.decode_slatepack_message(message, true)?;
|
let slatepack =
|
||||||
|
api.decode_slatepack_message(m, message.clone(), vec![0])?;
|
||||||
ret_address = slatepack.sender;
|
ret_address = slatepack.sender;
|
||||||
Ok(())
|
Ok(())
|
||||||
},
|
},
|
||||||
|
@ -735,8 +736,8 @@ where
|
||||||
None => match args.input_slatepack_message {
|
None => match args.input_slatepack_message {
|
||||||
Some(mes) => {
|
Some(mes) => {
|
||||||
let mut sp = Slatepack::default();
|
let mut sp = Slatepack::default();
|
||||||
controller::owner_single_use(None, keychain_mask, Some(owner_api), |api, _| {
|
controller::owner_single_use(None, keychain_mask, Some(owner_api), |api, m| {
|
||||||
sp = api.decode_slatepack_message(mes, false)?;
|
sp = api.decode_slatepack_message(m, mes, vec![])?;
|
||||||
Ok(())
|
Ok(())
|
||||||
})?;
|
})?;
|
||||||
sp
|
sp
|
||||||
|
|
|
@ -496,7 +496,7 @@ fn slatepack_api_impl(test_dir: &'static str) -> Result<(), libwallet::Error> {
|
||||||
let enc_addr = api.get_slatepack_address(m, 0)?;
|
let enc_addr = api.get_slatepack_address(m, 0)?;
|
||||||
let slatepack = api.create_slatepack_message(m, &slate, Some(0), vec![enc_addr])?;
|
let slatepack = api.create_slatepack_message(m, &slate, Some(0), vec![enc_addr])?;
|
||||||
println!("{}", slatepack);
|
println!("{}", slatepack);
|
||||||
let slatepack_raw = api.decode_slatepack_message(slatepack.clone(), true)?;
|
let slatepack_raw = api.decode_slatepack_message(m, slatepack.clone(), vec![0])?;
|
||||||
println!("{}", slatepack_raw);
|
println!("{}", slatepack_raw);
|
||||||
let decoded_slate = api.slate_from_slatepack_message(m, slatepack, vec![0])?;
|
let decoded_slate = api.slate_from_slatepack_message(m, slatepack, vec![0])?;
|
||||||
println!("{}", decoded_slate);
|
println!("{}", decoded_slate);
|
||||||
|
|
|
@ -201,13 +201,49 @@ where
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Decode a slatepack message, to allow viewing
|
/// Decode a slatepack message, to allow viewing
|
||||||
pub fn decode_slatepack_message(slatepack: String, decrypt: bool) -> Result<Slatepack, Error> {
|
/// Will decrypt if possible, otherwise will return
|
||||||
|
/// undecrypted slatepack
|
||||||
|
pub fn decode_slatepack_message<'a, L, C, K>(
|
||||||
|
wallet_inst: Arc<Mutex<Box<dyn WalletInst<'a, L, C, K>>>>,
|
||||||
|
keychain_mask: Option<&SecretKey>,
|
||||||
|
slatepack: String,
|
||||||
|
secret_indices: Vec<u32>,
|
||||||
|
) -> Result<Slatepack, Error>
|
||||||
|
where
|
||||||
|
L: WalletLCProvider<'a, C, K>,
|
||||||
|
C: NodeClient + 'a,
|
||||||
|
K: Keychain + 'a,
|
||||||
|
{
|
||||||
let packer = Slatepacker::new(SlatepackerArgs {
|
let packer = Slatepacker::new(SlatepackerArgs {
|
||||||
sender: None,
|
sender: None,
|
||||||
recipients: vec![],
|
recipients: vec![],
|
||||||
dec_key: None,
|
dec_key: None,
|
||||||
});
|
});
|
||||||
packer.deser_slatepack(slatepack.as_bytes().to_vec(), decrypt)
|
if secret_indices.is_empty() {
|
||||||
|
packer.deser_slatepack(slatepack.as_bytes().to_vec(), false)
|
||||||
|
} else {
|
||||||
|
for index in secret_indices {
|
||||||
|
let dec_key = Some(get_slatepack_secret_key(
|
||||||
|
wallet_inst.clone(),
|
||||||
|
keychain_mask,
|
||||||
|
index,
|
||||||
|
)?);
|
||||||
|
let packer = Slatepacker::new(SlatepackerArgs {
|
||||||
|
sender: None,
|
||||||
|
recipients: vec![],
|
||||||
|
dec_key: (&dec_key).as_ref(),
|
||||||
|
});
|
||||||
|
let res = packer.deser_slatepack(slatepack.as_bytes().to_vec(), true);
|
||||||
|
let slatepack = match res {
|
||||||
|
Ok(sp) => sp,
|
||||||
|
Err(_) => {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
return Ok(slatepack);
|
||||||
|
}
|
||||||
|
packer.deser_slatepack(slatepack.as_bytes().to_vec(), false)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// retrieve outputs
|
/// retrieve outputs
|
||||||
|
|
Loading…
Reference in a new issue