Przeglądaj źródła

Merge pull request #915 from BitcreditProtocol/peanut/transactionid_panic

TransactionId::from_hex check bytes len before copy_from_slice
thesimplekid 2 miesięcy temu
rodzic
commit
db04537a34
1 zmienionych plików z 29 dodań i 0 usunięć
  1. 29 0
      crates/cdk-common/src/wallet.rs

+ 29 - 0
crates/cdk-common/src/wallet.rs

@@ -310,6 +310,9 @@ impl TransactionId {
     /// From hex string
     pub fn from_hex(value: &str) -> Result<Self, Error> {
         let bytes = hex::decode(value)?;
+        if bytes.len() != 32 {
+            return Err(Error::InvalidTransactionId);
+        }
         let mut array = [0u8; 32];
         array.copy_from_slice(&bytes);
         Ok(Self(array))
@@ -357,3 +360,29 @@ impl TryFrom<Proofs> for TransactionId {
         Self::from_proofs(proofs)
     }
 }
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    #[test]
+    fn test_transaction_id_from_hex() {
+        let hex_str = "a1b2c3d4e5f60718293a0b1c2d3e4f506172839a0b1c2d3e4f506172839a0b1c";
+        let transaction_id = TransactionId::from_hex(hex_str).unwrap();
+        assert_eq!(transaction_id.to_string(), hex_str);
+    }
+
+    #[test]
+    fn test_transaction_id_from_hex_empty_string() {
+        let hex_str = "";
+        let res = TransactionId::from_hex(hex_str);
+        assert!(matches!(res, Err(Error::InvalidTransactionId)));
+    }
+
+    #[test]
+    fn test_transaction_id_from_hex_longer_string() {
+        let hex_str = "a1b2c3d4e5f60718293a0b1c2d3e4f506172839a0b1c2d3e4f506172839a0b1ca1b2";
+        let res = TransactionId::from_hex(hex_str);
+        assert!(matches!(res, Err(Error::InvalidTransactionId)));
+    }
+}