Skip to content

Commit 8bbdb43

Browse files
committed
implementing BLAKE3 opcode
1 parent 7694aea commit 8bbdb43

File tree

7 files changed

+29
-2
lines changed

7 files changed

+29
-2
lines changed

Cargo.lock

Lines changed: 3 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ paste = "1"
2727
strict_encoding = { version = "2.7.0-beta.1", default-features = false, features = ["float", "derive"] }
2828
strict_types = { version = "2.7.0-beta.2", optional = true }
2929
sha2 = "0.10.8"
30+
blake3 = "1.5.1"
3031
ripemd = "0.1.3"
3132
baid58 = "0.4.4"
3233
secp256k1 = { version = "0.28.2", optional = true, features = ["global-context"] }

src/isa/bytecode.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1299,6 +1299,7 @@ impl Bytecode for DigestOp {
12991299
DigestOp::Ripemd(_, _) => INSTR_RIPEMD,
13001300
DigestOp::Sha256(_, _) => INSTR_SHA256,
13011301
DigestOp::Sha512(_, _) => INSTR_SHA512,
1302+
DigestOp::Blake3(_, _) => INSTR_BLAKE3,
13021303
}
13031304
}
13041305

@@ -1309,6 +1310,7 @@ impl Bytecode for DigestOp {
13091310
match self {
13101311
DigestOp::Ripemd(src, dst)
13111312
| DigestOp::Sha256(src, dst)
1313+
| DigestOp::Blake3(src, dst)
13121314
| DigestOp::Sha512(src, dst) => {
13131315
writer.write_u4(src)?;
13141316
writer.write_u4(dst)?;
@@ -1328,6 +1330,7 @@ impl Bytecode for DigestOp {
13281330
Ok(match instr {
13291331
INSTR_RIPEMD => Self::Ripemd(src, dst),
13301332
INSTR_SHA256 => Self::Sha256(src, dst),
1333+
INSTR_BLAKE3 => Self::Blake3(src, dst),
13311334
INSTR_SHA512 => Self::Sha512(src, dst),
13321335
x => unreachable!("instruction {:#010b} classified as digest operation", x),
13331336
})

src/isa/exec.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1372,6 +1372,7 @@ impl InstructionSet for DigestOp {
13721372
match self {
13731373
DigestOp::Ripemd(src, _dst)
13741374
| DigestOp::Sha256(src, _dst)
1375+
| DigestOp::Blake3(src, _dst)
13751376
| DigestOp::Sha512(src, _dst) => bset![Reg::S(*src)],
13761377
}
13771378
}
@@ -1380,6 +1381,7 @@ impl InstructionSet for DigestOp {
13801381
match self {
13811382
DigestOp::Ripemd(_src, dst) => bset![Reg::new(RegR::R160, *dst)],
13821383
DigestOp::Sha256(_src, dst) => bset![Reg::new(RegR::R256, *dst)],
1384+
DigestOp::Blake3(_src, dst) => bset![Reg::new(RegR::R256, *dst)],
13831385
DigestOp::Sha512(_src, dst) => bset![Reg::new(RegR::R512, *dst)],
13841386
}
13851387
}
@@ -1407,6 +1409,12 @@ impl InstructionSet for DigestOp {
14071409
let hash: Option<[u8; 32]> = s.map(|s| sha2::Sha256::digest(s.as_ref()).into());
14081410
regs.set_n(RegR::R256, dst, hash);
14091411
}
1412+
DigestOp::Blake3(src, dst) => {
1413+
let s = regs.get_s(*src);
1414+
none = s.is_none();
1415+
let hash: Option<[u8; 32]> = s.map(|s| blake3::hash(s.as_ref()).into());
1416+
regs.set_n(RegR::R256, dst, hash);
1417+
}
14101418
DigestOp::Sha512(src, dst) => {
14111419
let s = regs.get_s(*src);
14121420
none = s.is_none();

src/isa/instr.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -883,6 +883,16 @@ pub enum DigestOp {
883883
/** Index of string register */ RegS,
884884
/** Index of `r512` register to save result to */ Reg16,
885885
),
886+
887+
/// Computes BLAKE3 hash value
888+
///
889+
/// Sets `st0` to `false` and destination register to `None` if the source register does not
890+
/// contain a value
891+
#[display("Blake3 {0},r256{1}")]
892+
Blake3(
893+
/** Index of string register */ RegS,
894+
/** Index of `r256` register to save result to */ Reg16,
895+
),
886896
}
887897

888898
/// Operations on Secp256k1 elliptic curve

src/isa/macros.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -842,6 +842,9 @@ macro_rules! instr {
842842
(sha2 s16[$idx1:literal],r256[$idx2:literal]) => {
843843
Instr::Digest(DigestOp::Sha256(RegS::from($idx1), $crate::_reg_idx16!($idx2)))
844844
};
845+
(blake3 s16[$idx1:literal],r256[$idx2:literal]) => {
846+
Instr::Digest(DigestOp::Blake3(RegS::from($idx1), $crate::_reg_idx16!($idx2)))
847+
};
845848
(sha2 s16[$idx1:literal],r512[$idx2:literal]) => {
846849
Instr::Digest(DigestOp::Sha512(RegS::from($idx1), $crate::_reg_idx16!($idx2)))
847850
};

src/isa/opcodes.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ pub const INSTR_RESV_TO: u8 = 0b01_111_111;
117117
pub const INSTR_RIPEMD: u8 = 0b10_000_000;
118118
pub const INSTR_SHA256: u8 = 0b10_000_001;
119119
pub const INSTR_SHA512: u8 = 0b10_000_010;
120+
pub const INSTR_BLAKE3: u8 = 0b10_000_100;
120121

121122
// ### Secp256k1 operations (SECP256K1)
122123

0 commit comments

Comments
 (0)