Use binary big endian functions in the crypto boring sha file

This commit is contained in:
Erik Pellizzon 2022-09-16 09:50:52 +01:00
parent 49958f9c40
commit 181767b19c
1 changed files with 45 additions and 81 deletions

View File

@ -57,6 +57,7 @@ _goboringcrypto_gosha512(void *p, size_t n, void *out)
*/ */
import "C" import "C"
import ( import (
"encoding/binary"
"errors" "errors"
"hash" "hash"
"unsafe" "unsafe"
@ -162,14 +163,14 @@ func (h *sha1Hash) MarshalBinary() ([]byte, error) {
d := (*sha1Ctx)(unsafe.Pointer(&h.ctx)) d := (*sha1Ctx)(unsafe.Pointer(&h.ctx))
b := make([]byte, 0, sha1MarshaledSize) b := make([]byte, 0, sha1MarshaledSize)
b = append(b, sha1Magic...) b = append(b, sha1Magic...)
b = appendUint32(b, d.h[0]) b = binary.BigEndian.AppendUint32(b, d.h[0])
b = appendUint32(b, d.h[1]) b = binary.BigEndian.AppendUint32(b, d.h[1])
b = appendUint32(b, d.h[2]) b = binary.BigEndian.AppendUint32(b, d.h[2])
b = appendUint32(b, d.h[3]) b = binary.BigEndian.AppendUint32(b, d.h[3])
b = appendUint32(b, d.h[4]) b = binary.BigEndian.AppendUint32(b, d.h[4])
b = append(b, d.x[:d.nx]...) b = append(b, d.x[:d.nx]...)
b = b[:len(b)+len(d.x)-int(d.nx)] // already zero b = b[:len(b)+len(d.x)-int(d.nx)] // already zero
b = appendUint64(b, uint64(d.nl)>>3|uint64(d.nh)<<29) b = binary.BigEndian.AppendUint64(b, uint64(d.nl)>>3|uint64(d.nh)<<29)
return b, nil return b, nil
} }
@ -288,17 +289,17 @@ func (h *sha224Hash) MarshalBinary() ([]byte, error) {
d := (*sha256Ctx)(unsafe.Pointer(&h.ctx)) d := (*sha256Ctx)(unsafe.Pointer(&h.ctx))
b := make([]byte, 0, marshaledSize256) b := make([]byte, 0, marshaledSize256)
b = append(b, magic224...) b = append(b, magic224...)
b = appendUint32(b, d.h[0]) b = binary.BigEndian.AppendUint32(b, d.h[0])
b = appendUint32(b, d.h[1]) b = binary.BigEndian.AppendUint32(b, d.h[1])
b = appendUint32(b, d.h[2]) b = binary.BigEndian.AppendUint32(b, d.h[2])
b = appendUint32(b, d.h[3]) b = binary.BigEndian.AppendUint32(b, d.h[3])
b = appendUint32(b, d.h[4]) b = binary.BigEndian.AppendUint32(b, d.h[4])
b = appendUint32(b, d.h[5]) b = binary.BigEndian.AppendUint32(b, d.h[5])
b = appendUint32(b, d.h[6]) b = binary.BigEndian.AppendUint32(b, d.h[6])
b = appendUint32(b, d.h[7]) b = binary.BigEndian.AppendUint32(b, d.h[7])
b = append(b, d.x[:d.nx]...) b = append(b, d.x[:d.nx]...)
b = b[:len(b)+len(d.x)-int(d.nx)] // already zero b = b[:len(b)+len(d.x)-int(d.nx)] // already zero
b = appendUint64(b, uint64(d.nl)>>3|uint64(d.nh)<<29) b = binary.BigEndian.AppendUint64(b, uint64(d.nl)>>3|uint64(d.nh)<<29)
return b, nil return b, nil
} }
@ -306,17 +307,17 @@ func (h *sha256Hash) MarshalBinary() ([]byte, error) {
d := (*sha256Ctx)(unsafe.Pointer(&h.ctx)) d := (*sha256Ctx)(unsafe.Pointer(&h.ctx))
b := make([]byte, 0, marshaledSize256) b := make([]byte, 0, marshaledSize256)
b = append(b, magic256...) b = append(b, magic256...)
b = appendUint32(b, d.h[0]) b = binary.BigEndian.AppendUint32(b, d.h[0])
b = appendUint32(b, d.h[1]) b = binary.BigEndian.AppendUint32(b, d.h[1])
b = appendUint32(b, d.h[2]) b = binary.BigEndian.AppendUint32(b, d.h[2])
b = appendUint32(b, d.h[3]) b = binary.BigEndian.AppendUint32(b, d.h[3])
b = appendUint32(b, d.h[4]) b = binary.BigEndian.AppendUint32(b, d.h[4])
b = appendUint32(b, d.h[5]) b = binary.BigEndian.AppendUint32(b, d.h[5])
b = appendUint32(b, d.h[6]) b = binary.BigEndian.AppendUint32(b, d.h[6])
b = appendUint32(b, d.h[7]) b = binary.BigEndian.AppendUint32(b, d.h[7])
b = append(b, d.x[:d.nx]...) b = append(b, d.x[:d.nx]...)
b = b[:len(b)+len(d.x)-int(d.nx)] // already zero b = b[:len(b)+len(d.x)-int(d.nx)] // already zero
b = appendUint64(b, uint64(d.nl)>>3|uint64(d.nh)<<29) b = binary.BigEndian.AppendUint64(b, uint64(d.nl)>>3|uint64(d.nh)<<29)
return b, nil return b, nil
} }
@ -465,17 +466,17 @@ func (h *sha384Hash) MarshalBinary() ([]byte, error) {
d := (*sha512Ctx)(unsafe.Pointer(&h.ctx)) d := (*sha512Ctx)(unsafe.Pointer(&h.ctx))
b := make([]byte, 0, marshaledSize512) b := make([]byte, 0, marshaledSize512)
b = append(b, magic384...) b = append(b, magic384...)
b = appendUint64(b, d.h[0]) b = binary.BigEndian.AppendUint64(b, d.h[0])
b = appendUint64(b, d.h[1]) b = binary.BigEndian.AppendUint64(b, d.h[1])
b = appendUint64(b, d.h[2]) b = binary.BigEndian.AppendUint64(b, d.h[2])
b = appendUint64(b, d.h[3]) b = binary.BigEndian.AppendUint64(b, d.h[3])
b = appendUint64(b, d.h[4]) b = binary.BigEndian.AppendUint64(b, d.h[4])
b = appendUint64(b, d.h[5]) b = binary.BigEndian.AppendUint64(b, d.h[5])
b = appendUint64(b, d.h[6]) b = binary.BigEndian.AppendUint64(b, d.h[6])
b = appendUint64(b, d.h[7]) b = binary.BigEndian.AppendUint64(b, d.h[7])
b = append(b, d.x[:d.nx]...) b = append(b, d.x[:d.nx]...)
b = b[:len(b)+len(d.x)-int(d.nx)] // already zero b = b[:len(b)+len(d.x)-int(d.nx)] // already zero
b = appendUint64(b, d.nl>>3|d.nh<<61) b = binary.BigEndian.AppendUint64(b, d.nl>>3|d.nh<<61)
return b, nil return b, nil
} }
@ -483,17 +484,17 @@ func (h *sha512Hash) MarshalBinary() ([]byte, error) {
d := (*sha512Ctx)(unsafe.Pointer(&h.ctx)) d := (*sha512Ctx)(unsafe.Pointer(&h.ctx))
b := make([]byte, 0, marshaledSize512) b := make([]byte, 0, marshaledSize512)
b = append(b, magic512...) b = append(b, magic512...)
b = appendUint64(b, d.h[0]) b = binary.BigEndian.AppendUint64(b, d.h[0])
b = appendUint64(b, d.h[1]) b = binary.BigEndian.AppendUint64(b, d.h[1])
b = appendUint64(b, d.h[2]) b = binary.BigEndian.AppendUint64(b, d.h[2])
b = appendUint64(b, d.h[3]) b = binary.BigEndian.AppendUint64(b, d.h[3])
b = appendUint64(b, d.h[4]) b = binary.BigEndian.AppendUint64(b, d.h[4])
b = appendUint64(b, d.h[5]) b = binary.BigEndian.AppendUint64(b, d.h[5])
b = appendUint64(b, d.h[6]) b = binary.BigEndian.AppendUint64(b, d.h[6])
b = appendUint64(b, d.h[7]) b = binary.BigEndian.AppendUint64(b, d.h[7])
b = append(b, d.x[:d.nx]...) b = append(b, d.x[:d.nx]...)
b = b[:len(b)+len(d.x)-int(d.nx)] // already zero b = b[:len(b)+len(d.x)-int(d.nx)] // already zero
b = appendUint64(b, d.nl>>3|d.nh<<61) b = binary.BigEndian.AppendUint64(b, d.nl>>3|d.nh<<61)
return b, nil return b, nil
} }
@ -553,47 +554,10 @@ func (h *sha512Hash) UnmarshalBinary(b []byte) error {
return nil return nil
} }
func appendUint64(b []byte, x uint64) []byte {
var a [8]byte
putUint64(a[:], x)
return append(b, a[:]...)
}
func appendUint32(b []byte, x uint32) []byte {
var a [4]byte
putUint32(a[:], x)
return append(b, a[:]...)
}
func consumeUint64(b []byte) ([]byte, uint64) { func consumeUint64(b []byte) ([]byte, uint64) {
_ = b[7] return b[8:], binary.BigEndian.Uint64(b)
x := uint64(b[7]) | uint64(b[6])<<8 | uint64(b[5])<<16 | uint64(b[4])<<24 |
uint64(b[3])<<32 | uint64(b[2])<<40 | uint64(b[1])<<48 | uint64(b[0])<<56
return b[8:], x
} }
func consumeUint32(b []byte) ([]byte, uint32) { func consumeUint32(b []byte) ([]byte, uint32) {
_ = b[3] return b[4:], binary.BigEndian.Uint32(b)
x := uint32(b[3]) | uint32(b[2])<<8 | uint32(b[1])<<16 | uint32(b[0])<<24
return b[4:], x
}
func putUint64(x []byte, s uint64) {
_ = x[7]
x[0] = byte(s >> 56)
x[1] = byte(s >> 48)
x[2] = byte(s >> 40)
x[3] = byte(s >> 32)
x[4] = byte(s >> 24)
x[5] = byte(s >> 16)
x[6] = byte(s >> 8)
x[7] = byte(s)
}
func putUint32(x []byte, s uint32) {
_ = x[3]
x[0] = byte(s >> 24)
x[1] = byte(s >> 16)
x[2] = byte(s >> 8)
x[3] = byte(s)
} }