diff options
| author | bors <bors@rust-lang.org> | 2017-01-11 01:33:03 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2017-01-11 01:33:03 +0000 |
| commit | e4fee525e04838dabc82beed5ae1a06051be53fd (patch) | |
| tree | e79e5142ff9ec65593bf927145b0293a9728afda | |
| parent | 0500fbf6ba83b9a6634a5e0580963b44683b44c6 (diff) | |
| parent | a89475d7ec8556d7d51f690e75a948f19787114b (diff) | |
| download | rust-e4fee525e04838dabc82beed5ae1a06051be53fd.tar.gz rust-e4fee525e04838dabc82beed5ae1a06051be53fd.zip | |
Auto merge of #38960 - arielb1:blake-endian, r=michaelwoerister
Use little-endian encoding for Blake2 hashing on all architectures Like many hash functions, the blake2 hash is mathematically defined on a sequence of 64-bit words. As Rust's hash interface operates on sequences of octets, some encoding must be used to bridge that difference. The Blake2 RFC (RFC 7693) specifies that: ``` Byte (octet) streams are interpreted as words in little-endian order, with the least-significant byte first. ``` So use that encoding consistently. Fixes #38891. Beta-nominating since this is a regression since 1.15. r? @michaelwoerister
| -rw-r--r-- | src/librustc_data_structures/blake2b.rs | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/src/librustc_data_structures/blake2b.rs b/src/librustc_data_structures/blake2b.rs index 8c82c135dc4..31492e26219 100644 --- a/src/librustc_data_structures/blake2b.rs +++ b/src/librustc_data_structures/blake2b.rs @@ -113,17 +113,20 @@ fn blake2b_compress(ctx: &mut Blake2bCtx, last: bool) { } { - // Re-interpret the input buffer in the state as u64s + // Re-interpret the input buffer in the state as an array + // of little-endian u64s, converting them to machine + // endianness. It's OK to modify the buffer in place + // since this is the last time this data will be accessed + // before it's overwritten. + let m: &mut [u64; 16] = unsafe { let b: &mut [u8; 128] = &mut ctx.b; ::std::mem::transmute(b) }; - // It's OK to modify the buffer in place since this is the last time - // this data will be accessed before it's overwritten if cfg!(target_endian = "big") { for word in &mut m[..] { - *word = word.to_be(); + *word = u64::from_le(*word); } } @@ -209,9 +212,10 @@ fn blake2b_final(ctx: &mut Blake2bCtx) blake2b_compress(ctx, true); + // Modify our buffer to little-endian format as it will be read + // as a byte array. It's OK to modify the buffer in place since + // this is the last time this data will be accessed. if cfg!(target_endian = "big") { - // Make sure that the data is in memory in little endian format, as is - // demanded by BLAKE2 for word in &mut ctx.h { *word = word.to_le(); } |
