This commit introduces a new test file for context management, covering various scenarios for context creation, destruction, and capabilities. Additionally, it implements the generator multiplication context, enhancing the secp256k1 elliptic curve operations. The changes ensure comprehensive testing and improved functionality for context handling, contributing to the overall robustness of the implementation.
184 lines
4.3 KiB
Go
184 lines
4.3 KiB
Go
package p256k1
|
|
|
|
import (
|
|
"crypto/rand"
|
|
"testing"
|
|
)
|
|
|
|
func TestContextCreate(t *testing.T) {
|
|
// Test creating context with different flags
|
|
testCases := []struct {
|
|
name string
|
|
flags uint
|
|
}{
|
|
{"none", ContextNone},
|
|
{"sign", ContextSign},
|
|
{"verify", ContextVerify},
|
|
{"both", ContextSign | ContextVerify},
|
|
}
|
|
|
|
for _, tc := range testCases {
|
|
t.Run(tc.name, func(t *testing.T) {
|
|
ctx := ContextCreate(tc.flags)
|
|
if ctx == nil {
|
|
t.Error("ContextCreate should not return nil")
|
|
}
|
|
if ctx.flags != tc.flags {
|
|
t.Errorf("context flags should be %d, got %d", tc.flags, ctx.flags)
|
|
}
|
|
|
|
// Check capabilities
|
|
expectedCanSign := (tc.flags & ContextSign) != 0
|
|
expectedCanVerify := (tc.flags & ContextVerify) != 0
|
|
|
|
if ctx.canSign() != expectedCanSign {
|
|
t.Errorf("canSign() should be %v", expectedCanSign)
|
|
}
|
|
if ctx.canVerify() != expectedCanVerify {
|
|
t.Errorf("canVerify() should be %v", expectedCanVerify)
|
|
}
|
|
|
|
// Clean up
|
|
ContextDestroy(ctx)
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestContextDestroy(t *testing.T) {
|
|
// Test destroying nil context (should not panic)
|
|
ContextDestroy(nil)
|
|
|
|
// Test destroying valid context
|
|
ctx := ContextCreate(ContextSign | ContextVerify)
|
|
ContextDestroy(ctx)
|
|
|
|
// After destruction, context should be cleared
|
|
if ctx.flags != 0 {
|
|
t.Error("context flags should be cleared after destruction")
|
|
}
|
|
if ctx.ecmultGenCtx != nil {
|
|
t.Error("ecmult_gen context should be cleared after destruction")
|
|
}
|
|
}
|
|
|
|
func TestContextRandomize(t *testing.T) {
|
|
ctx := ContextCreate(ContextSign | ContextVerify)
|
|
defer ContextDestroy(ctx)
|
|
|
|
// Test with nil seed (should generate random seed)
|
|
err := ContextRandomize(ctx, nil)
|
|
if err != nil {
|
|
t.Errorf("ContextRandomize with nil seed failed: %v", err)
|
|
}
|
|
|
|
// Test with provided seed
|
|
seed := make([]byte, 32)
|
|
if _, err := rand.Read(seed); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
err = ContextRandomize(ctx, seed)
|
|
if err != nil {
|
|
t.Errorf("ContextRandomize with seed failed: %v", err)
|
|
}
|
|
|
|
// Test with invalid seed length
|
|
invalidSeed := make([]byte, 16) // Wrong length
|
|
err = ContextRandomize(ctx, invalidSeed)
|
|
if err == nil {
|
|
t.Error("ContextRandomize should fail with invalid seed length")
|
|
}
|
|
|
|
// Test with nil context
|
|
err = ContextRandomize(nil, seed)
|
|
if err == nil {
|
|
t.Error("ContextRandomize should fail with nil context")
|
|
}
|
|
}
|
|
|
|
func TestContextStatic(t *testing.T) {
|
|
// Test that static context exists and has correct properties
|
|
if ContextStatic == nil {
|
|
t.Error("ContextStatic should not be nil")
|
|
}
|
|
|
|
if ContextStatic.flags != ContextVerify {
|
|
t.Errorf("ContextStatic should have ContextVerify flag, got %d", ContextStatic.flags)
|
|
}
|
|
|
|
if !ContextStatic.canVerify() {
|
|
t.Error("ContextStatic should be able to verify")
|
|
}
|
|
|
|
if ContextStatic.canSign() {
|
|
t.Error("ContextStatic should not be able to sign")
|
|
}
|
|
}
|
|
|
|
func TestContextCapabilities(t *testing.T) {
|
|
// Test signing context
|
|
signCtx := ContextCreate(ContextSign)
|
|
defer ContextDestroy(signCtx)
|
|
|
|
if !signCtx.canSign() {
|
|
t.Error("sign context should be able to sign")
|
|
}
|
|
if signCtx.canVerify() {
|
|
t.Error("sign-only context should not be able to verify")
|
|
}
|
|
|
|
// Test verify context
|
|
verifyCtx := ContextCreate(ContextVerify)
|
|
defer ContextDestroy(verifyCtx)
|
|
|
|
if verifyCtx.canSign() {
|
|
t.Error("verify-only context should not be able to sign")
|
|
}
|
|
if !verifyCtx.canVerify() {
|
|
t.Error("verify context should be able to verify")
|
|
}
|
|
|
|
// Test combined context
|
|
bothCtx := ContextCreate(ContextSign | ContextVerify)
|
|
defer ContextDestroy(bothCtx)
|
|
|
|
if !bothCtx.canSign() {
|
|
t.Error("combined context should be able to sign")
|
|
}
|
|
if !bothCtx.canVerify() {
|
|
t.Error("combined context should be able to verify")
|
|
}
|
|
|
|
// Test none context
|
|
noneCtx := ContextCreate(ContextNone)
|
|
defer ContextDestroy(noneCtx)
|
|
|
|
if noneCtx.canSign() {
|
|
t.Error("none context should not be able to sign")
|
|
}
|
|
if noneCtx.canVerify() {
|
|
t.Error("none context should not be able to verify")
|
|
}
|
|
}
|
|
|
|
func BenchmarkContextCreate(b *testing.B) {
|
|
b.ResetTimer()
|
|
for i := 0; i < b.N; i++ {
|
|
ctx := ContextCreate(ContextSign | ContextVerify)
|
|
ContextDestroy(ctx)
|
|
}
|
|
}
|
|
|
|
func BenchmarkContextRandomize(b *testing.B) {
|
|
ctx := ContextCreate(ContextSign | ContextVerify)
|
|
defer ContextDestroy(ctx)
|
|
|
|
seed := make([]byte, 32)
|
|
rand.Read(seed)
|
|
|
|
b.ResetTimer()
|
|
for i := 0; i < b.N; i++ {
|
|
ContextRandomize(ctx, seed)
|
|
}
|
|
}
|