Skip to content

Commit 18783be

Browse files
authored
chore(mlkem): refactoring, reduce alloc times
1 parent 85f4205 commit 18783be

File tree

2 files changed

+13
-17
lines changed

2 files changed

+13
-17
lines changed

mlkem/field.go

Lines changed: 12 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -307,7 +307,7 @@ func ringDecodeAndDecompress10(bb *[encodingSize10]byte) ringElement {
307307
func ringCompressAndEncode(s []byte, f ringElement, d uint8) []byte {
308308
var b byte
309309
var bIdx uint8
310-
for i := 0; i < n; i++ {
310+
for i := range n {
311311
c := compress(f[i], d)
312312
var cIdx uint8
313313
for cIdx < d {
@@ -401,8 +401,8 @@ func samplePolyCBD(s []byte, b, η byte) ringElement {
401401
prf := sha3.NewSHAKE256()
402402
prf.Write(s)
403403
prf.Write([]byte{b})
404-
B := make([]byte, 64*η)
405-
prf.Read(B)
404+
var B [maxBytesOf64Mulη]byte
405+
prf.Read(B[:64*η])
406406

407407
// SamplePolyCBD simply draws four (2η) bits for each coefficient, and adds
408408
// the first two and subtracts the last two.
@@ -419,20 +419,15 @@ func samplePolyCBD(s []byte, b, η byte) ringElement {
419419
}
420420
case 3:
421421
for i := 0; i < n; i += 4 {
422-
j := (i / 4) * 3
423-
b := B[j]
424-
b_7, b_6, b_5, b_4 := b>>7, b>>6&1, b>>5&1, b>>4&1
425-
b_3, b_2, b_1, b_0 := b>>3&1, b>>2&1, b>>1&1, b&1
426-
b = B[j+1]
427-
b_15, b_14, b_13, b_12 := b>>7, b>>6&1, b>>5&1, b>>4&1
428-
b_11, b_10, b_9, b_8 := b>>3&1, b>>2&1, b>>1&1, b&1
429-
b = B[j+2]
430-
b_23, b_22, b_21, b_20 := b>>7, b>>6&1, b>>5&1, b>>4&1
431-
b_19, b_18, b_17, b_16 := b>>3&1, b>>2&1, b>>1&1, b&1
432-
f[i] = fieldSub(fieldElement(b_0+b_1+b_2), fieldElement(b_3+b_4+b_5))
433-
f[i+1] = fieldSub(fieldElement(b_6+b_7+b_8), fieldElement(b_9+b_10+b_11))
434-
f[i+2] = fieldSub(fieldElement(b_12+b_13+b_14), fieldElement(b_15+b_16+b_17))
435-
f[i+3] = fieldSub(fieldElement(b_18+b_19+b_20), fieldElement(b_21+b_22+b_23))
422+
j := (i >> 2) * 3
423+
424+
bits := uint32(B[j]) | uint32(B[j+1])<<8 | uint32(B[j+2])<<16
425+
for k := range 4 {
426+
off := 6 * k
427+
sum := ((bits >> off) & 1) + ((bits >> (off + 1)) & 1) + ((bits >> (off + 2)) & 1)
428+
sub := ((bits >> (off + 3)) & 1) + ((bits >> (off + 4)) & 1) + ((bits >> (off + 5)) & 1)
429+
f[i+k] = fieldSub(fieldElement(sum), fieldElement(sub))
430+
}
436431
}
437432
}
438433
return f

mlkem/mlkem768.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ const (
3737
// ML-KEM global constants.
3838
n = 256
3939
q = 3329
40+
maxBytesOf64Mulη = 192
4041

4142
// encodingSizeX is the byte size of a ringElement or nttElement encoded
4243
// by ByteEncode_X (FIPS 203, Algorithm 5).

0 commit comments

Comments
 (0)