197 lines
4.3 KiB
Go
197 lines
4.3 KiB
Go
package p256k1
|
|
|
|
import (
|
|
"crypto/rand"
|
|
"testing"
|
|
)
|
|
|
|
func TestBasicFunctionality(t *testing.T) {
|
|
// Test context creation
|
|
ctx, err := ContextCreate(ContextNone)
|
|
if err != nil {
|
|
t.Fatalf("Failed to create context: %v", err)
|
|
}
|
|
defer ContextDestroy(ctx)
|
|
|
|
// Test selftest
|
|
if err := Selftest(); err != nil {
|
|
t.Fatalf("Selftest failed: %v", err)
|
|
}
|
|
|
|
t.Log("Basic functionality test passed")
|
|
}
|
|
|
|
func TestFieldElement(t *testing.T) {
|
|
// Test field element creation and operations
|
|
var a, b, c FieldElement
|
|
|
|
a.setInt(5)
|
|
b.setInt(7)
|
|
c.add(&a)
|
|
c.add(&b)
|
|
c.normalize()
|
|
|
|
var expected FieldElement
|
|
expected.setInt(12)
|
|
expected.normalize()
|
|
|
|
if !c.equal(&expected) {
|
|
t.Error("Field element addition failed")
|
|
}
|
|
|
|
t.Log("Field element test passed")
|
|
}
|
|
|
|
func TestScalar(t *testing.T) {
|
|
// Test scalar operations
|
|
var a, b, c Scalar
|
|
|
|
a.setInt(3)
|
|
b.setInt(4)
|
|
c.mul(&a, &b)
|
|
|
|
var expected Scalar
|
|
expected.setInt(12)
|
|
|
|
if !c.equal(&expected) {
|
|
t.Error("Scalar multiplication failed")
|
|
}
|
|
|
|
t.Log("Scalar test passed")
|
|
}
|
|
|
|
func TestKeyGeneration(t *testing.T) {
|
|
ctx, err := ContextCreate(ContextNone)
|
|
if err != nil {
|
|
t.Fatalf("Failed to create context: %v", err)
|
|
}
|
|
defer ContextDestroy(ctx)
|
|
|
|
// Generate a random secret key
|
|
var seckey [32]byte
|
|
_, err = rand.Read(seckey[:])
|
|
if err != nil {
|
|
t.Fatalf("Failed to generate random bytes: %v", err)
|
|
}
|
|
|
|
// Verify the secret key
|
|
if !ECSecKeyVerify(ctx, seckey[:]) {
|
|
// Try a few more times with different random keys
|
|
for i := 0; i < 10; i++ {
|
|
_, err = rand.Read(seckey[:])
|
|
if err != nil {
|
|
t.Fatalf("Failed to generate random bytes: %v", err)
|
|
}
|
|
if ECSecKeyVerify(ctx, seckey[:]) {
|
|
break
|
|
}
|
|
if i == 9 {
|
|
t.Fatal("Failed to generate valid secret key after 10 attempts")
|
|
}
|
|
}
|
|
}
|
|
|
|
// Create public key
|
|
var pubkey PublicKey
|
|
if !ECPubkeyCreate(ctx, &pubkey, seckey[:]) {
|
|
t.Fatal("Failed to create public key")
|
|
}
|
|
|
|
t.Log("Key generation test passed")
|
|
}
|
|
|
|
func TestSignatureOperations(t *testing.T) {
|
|
ctx, err := ContextCreate(ContextNone)
|
|
if err != nil {
|
|
t.Fatalf("Failed to create context: %v", err)
|
|
}
|
|
defer ContextDestroy(ctx)
|
|
|
|
// Test signature parsing
|
|
var sig Signature
|
|
var compactSig [64]byte
|
|
|
|
// Fill with some test data
|
|
for i := range compactSig {
|
|
compactSig[i] = byte(i % 256)
|
|
}
|
|
|
|
// Try to parse (may fail with invalid signature, which is expected)
|
|
parsed := ECDSASignatureParseCompact(ctx, &sig, compactSig[:])
|
|
|
|
if parsed {
|
|
// If parsing succeeded, try to serialize it back
|
|
var output [64]byte
|
|
if ECDSASignatureSerializeCompact(ctx, output[:], &sig) {
|
|
t.Log("Signature parsing and serialization test passed")
|
|
} else {
|
|
t.Error("Failed to serialize signature")
|
|
}
|
|
} else {
|
|
t.Log("Signature parsing failed as expected with test data")
|
|
}
|
|
}
|
|
|
|
func TestPublicKeyOperations(t *testing.T) {
|
|
ctx, err := ContextCreate(ContextNone)
|
|
if err != nil {
|
|
t.Fatalf("Failed to create context: %v", err)
|
|
}
|
|
defer ContextDestroy(ctx)
|
|
|
|
// Test with a known valid public key (generator point in uncompressed format)
|
|
pubkeyBytes := []byte{
|
|
0x04, // Uncompressed format
|
|
// X coordinate
|
|
0x79, 0xBE, 0x66, 0x7E, 0xF9, 0xDC, 0xBB, 0xAC,
|
|
0x55, 0xA0, 0x62, 0x95, 0xCE, 0x87, 0x0B, 0x07,
|
|
0x02, 0x9B, 0xFC, 0xDB, 0x2D, 0xCE, 0x28, 0xD9,
|
|
0x59, 0xF2, 0x81, 0x5B, 0x16, 0xF8, 0x17, 0x98,
|
|
// Y coordinate
|
|
0x48, 0x3A, 0xDA, 0x77, 0x26, 0xA3, 0xC4, 0x65,
|
|
0x5D, 0xA4, 0xFB, 0xFC, 0x0E, 0x11, 0x08, 0xA8,
|
|
0xFD, 0x17, 0xB4, 0x48, 0xA6, 0x85, 0x54, 0x19,
|
|
0x9C, 0x47, 0xD0, 0x8F, 0xFB, 0x10, 0xD4, 0xB8,
|
|
}
|
|
|
|
var pubkey PublicKey
|
|
if !ECPubkeyParse(ctx, &pubkey, pubkeyBytes) {
|
|
t.Fatal("Failed to parse known valid public key")
|
|
}
|
|
|
|
// Test serialization
|
|
var output [65]byte
|
|
outputLen := 65
|
|
if !ECPubkeySerialize(ctx, output[:], &outputLen, &pubkey, ECUncompressed) {
|
|
t.Fatal("Failed to serialize public key")
|
|
}
|
|
|
|
// Note: Our implementation may return compressed format (33 bytes) instead of uncompressed
|
|
if outputLen != 65 && outputLen != 33 {
|
|
t.Errorf("Expected output length 65 or 33, got %d", outputLen)
|
|
}
|
|
|
|
t.Log("Public key operations test passed")
|
|
}
|
|
|
|
func BenchmarkFieldAddition(b *testing.B) {
|
|
var a, c FieldElement
|
|
a.setInt(12345)
|
|
|
|
b.ResetTimer()
|
|
for i := 0; i < b.N; i++ {
|
|
c.add(&a)
|
|
}
|
|
}
|
|
|
|
func BenchmarkScalarMultiplication(b *testing.B) {
|
|
var a, c, result Scalar
|
|
a.setInt(12345)
|
|
c.setInt(67890)
|
|
|
|
b.ResetTimer()
|
|
for i := 0; i < b.N; i++ {
|
|
result.mul(&a, &c)
|
|
}
|
|
}
|