gmsm/mldsa/compress_test.go
2025-05-07 10:09:48 +08:00

90 lines
2.2 KiB
Go

// Copyright 2025 Sun Yimin. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
//go:build go1.24
package mldsa
import (
"testing"
)
func _power2Round(r uint32) (r1 uint32, r0 int32) {
const rd = 1 << d
r = r % q
r0 = int32(r % rd)
if r0 > int32(rd/2) {
r0 -= int32(rd)
}
r1 = uint32((int32(r) - r0) / int32(rd))
if r0 < 0 {
r0 += int32(q)
}
return
}
func _decompse(r uint32, gamma2 uint32) (r1 uint32, r0 int32) {
r = r % q
r0 = int32(r % (2 * gamma2))
if r0 > int32(gamma2) {
r0 -= 2 * int32(gamma2)
}
if int32(r)-r0 == q-1 {
r1 = 0
r0--
} else {
r1 = uint32(int32(r)-r0) / (2 * gamma2)
}
return
}
func TestPower2Round(t *testing.T) {
for i := 0; i <= 1000; i++ {
r1, r0 := power2Round(fieldElement(i))
expectedR1, expectedR0 := _power2Round(uint32(i))
if r1 != fieldElement(expectedR1) {
t.Errorf("power2Round(%d) = %d, want %d", i, r1, expectedR1)
}
if r0 != fieldElement(expectedR0) {
t.Errorf("power2Round(%d) = %d, want %d", i, r0, expectedR0)
}
}
for i := q - 1001; i < q; i++ {
r1, r0 := power2Round(fieldElement(i))
expectedR1, expectedR0 := _power2Round(uint32(i))
if r1 != fieldElement(expectedR1) {
t.Errorf("power2Round(%d) = %d, want %d", i, r1, expectedR1)
}
if r0 != fieldElement(expectedR0) {
t.Errorf("power2Round(%d) = %d, want %d", i, r0, expectedR0)
}
}
}
func TestDecompose(t *testing.T) {
gammas := []uint32{gamma2QMinus1Div32, gamma2QMinus1Div88}
for _, gamma := range gammas {
for i := 0; i <= 1000; i++ {
r1, r0 := decompose(fieldElement(i), gamma)
expectedR1, expectedR0 := _decompse(uint32(i), gamma)
if r1 != expectedR1 {
t.Errorf("decompose(%d/%d) r1 = %d, want %d", i, gamma, r1, expectedR1)
}
if r0 != expectedR0 {
t.Errorf("decompose(%d/%d) r0 = %d, want %d", i, gamma, r0, expectedR0)
}
}
for i := q - 1001; i < q; i++ {
r1, r0 := decompose(fieldElement(i), gamma)
expectedR1, expectedR0 := _decompse(uint32(i), gamma)
if r1 != expectedR1 {
t.Errorf("decompose(%d/%d) r1 = %d, want %d", i, gamma, r1, expectedR1)
}
if r0 != expectedR0 {
t.Errorf("decompose(%d/%d) r0 = %d, want %d", i, gamma, r0, expectedR0)
}
}
}
}