Browse Source

add function for one-off calculation (#45)

kris/switch_to_rust
Henry Case 4 years ago
committed by GitHub
parent
commit
45bc1a75f6
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 34 additions and 12 deletions
  1. +34
    -12
      hash/sha3/sha3.go

+ 34
- 12
hash/sha3/sha3.go View File

@@ -132,6 +132,24 @@ func (c *state) Write(in []byte) (nwrite int, err error) {
return nwrite, nil
}

func (c *state) finalize_sha3() {
buf := c.data.asBytes()[:]
rate := c.BlockSize()

// there is at least one byte free, otherise
// buf would be squezed already
for i := c.idx + 1; i < rate; i++ {
buf[i] = 0
}
buf[c.idx] = c.sfx
buf[rate-1] |= 0x80
xorIn(c, buf[:rate])
keccakF1600(&c.a)
copyOut(c, buf[:rate])
c.idx = rate // now, idx indicates unconsumed amount of data
c.isSquezing = true
}

// Read changes state of the hash if called first time. It will
// return len(out) bytes of data. Never fails.
func (c *state) Read(out []byte) (nread int, err error) {
@@ -140,18 +158,7 @@ func (c *state) Read(out []byte) (nread int, err error) {
nread = len(out)

if !c.isSquezing {
// there is at least one byte free, otherise
// buf would be squezed already
for i := c.idx + 1; i < rate; i++ {
buf[i] = 0
}
buf[c.idx] = c.sfx
buf[rate-1] |= 0x80
xorIn(c, buf[:rate])
keccakF1600(&c.a)
copyOut(c, buf[:rate])
c.idx = rate // now, idx indicates unconsumed amount of data
c.isSquezing = true
c.finalize_sha3()
}

// Copy-out bytes that are still kept in the buffer
@@ -211,6 +218,21 @@ func (c *state) Sum(in []byte) []byte {
return in
}

func (c *state) digest(out, in []byte) {
nread := len(out)
rate := c.BlockSize()
nblocks := nread / rate
c.Write(in)
c.finalize_sha3()
for i := 0; i < nblocks-1; i++ {
keccakF1600(&c.a)
copyOut(c, out[:])
out = out[rate:]
}
keccakF1600(&c.a)
copyOut(c, out[:len(out)])
}

// New224 creates a new SHA3-224 hash.
// Its generic security strength is 224 bits against preimage attacks,
// and 112 bits against collision attacks.


Loading…
Cancel
Save