mirror of
https://github.com/emmansun/gmsm.git
synced 2025-04-27 04:36:19 +08:00
zuc: constant time & correct lazy mod
This commit is contained in:
parent
b7cc21a055
commit
b299ca46f2
22
zuc/core.go
22
zuc/core.go
@ -118,32 +118,20 @@ func add31(x, y uint32) uint32 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (s *zucState32) enterInitMode(w uint32) {
|
func (s *zucState32) enterInitMode(w uint32) {
|
||||||
v := uint64(s.lfsr[15])<<15 + uint64(s.lfsr[13])<<17 + uint64(s.lfsr[10])<<21 + uint64(s.lfsr[4])<<20 + uint64(s.lfsr[0])<<8 + uint64(s.lfsr[0])
|
v := uint64(s.lfsr[15])<<15 + uint64(s.lfsr[13])<<17 + uint64(s.lfsr[10])<<21 + uint64(s.lfsr[4])<<20 + uint64(s.lfsr[0])<<8 + uint64(s.lfsr[0]) + uint64(w)
|
||||||
v = (v & 0x7FFFFFFF) + (v >> 31)
|
v = (v & 0x7FFFFFFF) + (v >> 31)
|
||||||
t := add31(uint32(v), w)
|
|
||||||
|
|
||||||
if t == 0 {
|
|
||||||
t = 0x7FFFFFFF
|
|
||||||
}
|
|
||||||
var temp [16]uint32
|
|
||||||
copy(temp[:], s.lfsr[1:])
|
|
||||||
copy(s.lfsr[:], temp[:])
|
|
||||||
s.lfsr[15] = t
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *zucState32) enterWorkMode() {
|
|
||||||
v := uint64(s.lfsr[15])<<15 + uint64(s.lfsr[13])<<17 + uint64(s.lfsr[10])<<21 + uint64(s.lfsr[4])<<20 + uint64(s.lfsr[0])<<8 + uint64(s.lfsr[0])
|
|
||||||
v = (v & 0x7FFFFFFF) + (v >> 31)
|
v = (v & 0x7FFFFFFF) + (v >> 31)
|
||||||
|
|
||||||
if v == 0 {
|
|
||||||
v = 0x7FFFFFFF
|
|
||||||
}
|
|
||||||
var temp [16]uint32
|
var temp [16]uint32
|
||||||
copy(temp[:], s.lfsr[1:])
|
copy(temp[:], s.lfsr[1:])
|
||||||
copy(s.lfsr[:], temp[:])
|
copy(s.lfsr[:], temp[:])
|
||||||
s.lfsr[15] = uint32(v)
|
s.lfsr[15] = uint32(v)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *zucState32) enterWorkMode() {
|
||||||
|
s.enterInitMode(uint32(0))
|
||||||
|
}
|
||||||
|
|
||||||
func makeFieldValue3(a, b, c uint32) uint32 {
|
func makeFieldValue3(a, b, c uint32) uint32 {
|
||||||
return (a << 23) | (b << 8) | c
|
return (a << 23) | (b << 8) | c
|
||||||
}
|
}
|
||||||
|
12
zuc/eia.go
12
zuc/eia.go
@ -102,9 +102,7 @@ func blockGeneric(m *ZUC128Mac, p []byte) {
|
|||||||
k64 = uint64(m.k0[i])<<32 | uint64(m.k0[i+1])
|
k64 = uint64(m.k0[i])<<32 | uint64(m.k0[i+1])
|
||||||
w := binary.BigEndian.Uint32(p[i*4:])
|
w := binary.BigEndian.Uint32(p[i*4:])
|
||||||
for j := 0; j < 32; j++ {
|
for j := 0; j < 32; j++ {
|
||||||
if w&0x80000000 == 0x80000000 {
|
t64 ^= ^(uint64(w>>31) - 1) & k64
|
||||||
t64 ^= k64
|
|
||||||
}
|
|
||||||
w <<= 1
|
w <<= 1
|
||||||
k64 <<= 1
|
k64 <<= 1
|
||||||
}
|
}
|
||||||
@ -156,9 +154,7 @@ func (m *ZUC128Mac) checkSum(additionalBits int, b byte) [4]byte {
|
|||||||
k64 = uint64(m.k0[i])<<32 | uint64(m.k0[i+1])
|
k64 = uint64(m.k0[i])<<32 | uint64(m.k0[i+1])
|
||||||
w := binary.BigEndian.Uint32(m.x[i*4:])
|
w := binary.BigEndian.Uint32(m.x[i*4:])
|
||||||
for j := 0; j < 32; j++ {
|
for j := 0; j < 32; j++ {
|
||||||
if w&0x80000000 == 0x80000000 {
|
t64 ^= ^(uint64(w>>31) - 1) & k64
|
||||||
t64 ^= k64
|
|
||||||
}
|
|
||||||
w <<= 1
|
w <<= 1
|
||||||
k64 <<= 1
|
k64 <<= 1
|
||||||
}
|
}
|
||||||
@ -169,9 +165,7 @@ func (m *ZUC128Mac) checkSum(additionalBits int, b byte) [4]byte {
|
|||||||
k64 = uint64(m.k0[kIdx])<<32 | uint64(m.k0[kIdx+1])
|
k64 = uint64(m.k0[kIdx])<<32 | uint64(m.k0[kIdx+1])
|
||||||
w := binary.BigEndian.Uint32(m.x[(words-1)*4:])
|
w := binary.BigEndian.Uint32(m.x[(words-1)*4:])
|
||||||
for j := 0; j < nRemainBits; j++ {
|
for j := 0; j < nRemainBits; j++ {
|
||||||
if w&0x80000000 == 0x80000000 {
|
t64 ^= ^(uint64(w>>31) - 1) & k64
|
||||||
t64 ^= k64
|
|
||||||
}
|
|
||||||
w <<= 1
|
w <<= 1
|
||||||
k64 <<= 1
|
k64 <<= 1
|
||||||
}
|
}
|
||||||
|
@ -98,19 +98,16 @@ func block256Generic(m *ZUC256Mac, p []byte) {
|
|||||||
case 4:
|
case 4:
|
||||||
k64 = uint64(m.k0[l])<<32 | uint64(m.k0[l+1])
|
k64 = uint64(m.k0[l])<<32 | uint64(m.k0[l+1])
|
||||||
for j := 0; j < 32; j++ {
|
for j := 0; j < 32; j++ {
|
||||||
if w&0x80000000 == 0x80000000 {
|
t64 ^= ^(uint64(w>>31) - 1) & k64
|
||||||
t64 ^= k64
|
|
||||||
}
|
|
||||||
w <<= 1
|
w <<= 1
|
||||||
k64 <<= 1
|
k64 <<= 1
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
k1 := m.k0[tagWords+l]
|
k1 := m.k0[tagWords+l]
|
||||||
for i := 0; i < 32; i++ {
|
for i := 0; i < 32; i++ {
|
||||||
if w&0x80000000 == 0x80000000 {
|
wBit := ^(w>>31 - 1)
|
||||||
for j := 0; j < tagWords; j++ {
|
for j := 0; j < tagWords; j++ {
|
||||||
m.t[j] ^= m.k0[j]
|
m.t[j] ^= wBit & m.k0[j]
|
||||||
}
|
|
||||||
}
|
}
|
||||||
w <<= 1
|
w <<= 1
|
||||||
var j int
|
var j int
|
||||||
@ -170,10 +167,9 @@ func (m *ZUC256Mac) checkSum(additionalBits int, b byte) []byte {
|
|||||||
w := binary.BigEndian.Uint32(m.x[l*4:])
|
w := binary.BigEndian.Uint32(m.x[l*4:])
|
||||||
k1 := m.k0[m.tagSize/4+l]
|
k1 := m.k0[m.tagSize/4+l]
|
||||||
for i := 0; i < 32; i++ {
|
for i := 0; i < 32; i++ {
|
||||||
if w&0x80000000 == 0x80000000 {
|
wBit := ^(w>>31 - 1)
|
||||||
for j := 0; j < m.tagSize/4; j++ {
|
for j := 0; j < m.tagSize/4; j++ {
|
||||||
m.t[j] ^= m.k0[j]
|
m.t[j] ^= wBit & m.k0[j]
|
||||||
}
|
|
||||||
}
|
}
|
||||||
w <<= 1
|
w <<= 1
|
||||||
var j int
|
var j int
|
||||||
@ -189,10 +185,9 @@ func (m *ZUC256Mac) checkSum(additionalBits int, b byte) []byte {
|
|||||||
if nRemainBits > 0 {
|
if nRemainBits > 0 {
|
||||||
w := binary.BigEndian.Uint32(m.x[(words-1)*4:])
|
w := binary.BigEndian.Uint32(m.x[(words-1)*4:])
|
||||||
for i := 0; i < nRemainBits; i++ {
|
for i := 0; i < nRemainBits; i++ {
|
||||||
if w&0x80000000 == 0x80000000 {
|
wBit := ^(w>>31 - 1)
|
||||||
for j := 0; j < m.tagSize/4; j++ {
|
for j := 0; j < m.tagSize/4; j++ {
|
||||||
m.t[j] ^= m.k0[j+kIdx]
|
m.t[j] ^= wBit & m.k0[j+kIdx]
|
||||||
}
|
|
||||||
}
|
}
|
||||||
w <<= 1
|
w <<= 1
|
||||||
var j int
|
var j int
|
||||||
|
Loading…
x
Reference in New Issue
Block a user