Skip to content

Commit f6adcce

Browse files
committed
Use ec.PublicKey for wallet interface objects
1 parent 5a67f16 commit f6adcce

34 files changed

+320
-310
lines changed

auth/clients/authhttp/authhttp_test.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"github.com/bsv-blockchain/go-sdk/auth"
88
"github.com/bsv-blockchain/go-sdk/auth/certificates"
99
"github.com/bsv-blockchain/go-sdk/auth/utils"
10+
ec "github.com/bsv-blockchain/go-sdk/primitives/ec"
1011
"github.com/bsv-blockchain/go-sdk/wallet"
1112
"github.com/stretchr/testify/require"
1213
)
@@ -53,7 +54,7 @@ func TestNew(t *testing.T) {
5354
mockWallet := wallet.NewMockWallet(t)
5455
mockSessionManager := NewMockSessionManager()
5556
requestedCerts := &utils.RequestedCertificateSet{
56-
Certifiers: []wallet.PubKey{},
57+
Certifiers: []*ec.PublicKey{},
5758
CertificateTypes: make(utils.RequestedCertificateTypeIDAndFieldList),
5859
}
5960

@@ -74,7 +75,7 @@ func TestNewWithNilSessionManager(t *testing.T) {
7475
// Set up dependencies
7576
mockWallet := wallet.NewMockWallet(t)
7677
requestedCerts := &utils.RequestedCertificateSet{
77-
Certifiers: []wallet.PubKey{},
78+
Certifiers: []*ec.PublicKey{},
7879
CertificateTypes: make(utils.RequestedCertificateTypeIDAndFieldList),
7980
}
8081

auth/peer.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ func NewPeer(cfg *PeerOptions) *Peer {
103103
peer.CertificatesToRequest = cfg.CertificatesToRequest
104104
} else {
105105
peer.CertificatesToRequest = &utils.RequestedCertificateSet{
106-
Certifiers: []wallet.PubKey{},
106+
Certifiers: []*ec.PublicKey{},
107107
CertificateTypes: make(utils.RequestedCertificateTypeIDAndFieldList),
108108
}
109109
}

auth/peer_test.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -623,14 +623,14 @@ func TestPeerCertificateExchange(t *testing.T) {
623623

624624
// Set certificate requirements - We need to use the RAW type string here, not base64 encoded
625625
aliceCertReqs := &utils.RequestedCertificateSet{
626-
Certifiers: []wallet.PubKey{tu.GetByte33FromString("any")}, // "any" is special value that accepts any certifier
626+
Certifiers: []*ec.PublicKey{tu.GetPKFromString("any")}, // "any" is special value that accepts any certifier
627627
CertificateTypes: utils.RequestedCertificateTypeIDAndFieldList{
628628
certType: []string{requiredField},
629629
},
630630
}
631631

632632
bobCertReqs := &utils.RequestedCertificateSet{
633-
Certifiers: []wallet.PubKey{tu.GetByte33FromString("any")}, // "any" is special value that accepts any certifier
633+
Certifiers: []*ec.PublicKey{tu.GetPKFromString("any")}, // "any" is special value that accepts any certifier
634634
CertificateTypes: utils.RequestedCertificateTypeIDAndFieldList{
635635
certType: []string{requiredField},
636636
},
@@ -1157,7 +1157,7 @@ func TestPartialCertificateAcceptance(t *testing.T) {
11571157

11581158
// Setup certificate requirements - requesting two fields but accepting partial matches
11591159
requestedCertificates := &utils.RequestedCertificateSet{
1160-
Certifiers: []wallet.PubKey{tu.GetByte33FromString("any")},
1160+
Certifiers: []*ec.PublicKey{tu.GetPKFromString("any")},
11611161
CertificateTypes: utils.RequestedCertificateTypeIDAndFieldList{
11621162
certType: []string{"name", "email"},
11631163
},
@@ -1426,7 +1426,7 @@ func TestLibraryCardVerification(t *testing.T) {
14261426

14271427
// Setup certificate requirements - Alice requires Bob's library card number
14281428
alice.CertificatesToRequest = &utils.RequestedCertificateSet{
1429-
Certifiers: []wallet.PubKey{tu.GetByte33FromString("any")},
1429+
Certifiers: []*ec.PublicKey{tu.GetPKFromString("any")},
14301430
CertificateTypes: utils.RequestedCertificateTypeIDAndFieldList{
14311431
certType: []string{"cardNumber"},
14321432
},
@@ -1447,7 +1447,7 @@ func TestLibraryCardVerification(t *testing.T) {
14471447

14481448
// Alice explicitly requests Bob's certificate
14491449
err = alice.RequestCertificates(ctx, bobPubKey.PublicKey, utils.RequestedCertificateSet{
1450-
Certifiers: []wallet.PubKey{tu.GetByte33FromString("any")},
1450+
Certifiers: []*ec.PublicKey{tu.GetPKFromString("any")},
14511451
CertificateTypes: utils.RequestedCertificateTypeIDAndFieldList{
14521452
certType: []string{"cardNumber"},
14531453
},
@@ -1721,14 +1721,14 @@ func TestNonmatchingCertificateRejection(t *testing.T) {
17211721

17221722
// Create peers with different certificate requirements
17231723
aliceRequiredCerts := utils.RequestedCertificateSet{
1724-
Certifiers: []wallet.PubKey{tu.GetByte33FromString("any")},
1724+
Certifiers: []*ec.PublicKey{tu.GetPKFromString("any")},
17251725
CertificateTypes: utils.RequestedCertificateTypeIDAndFieldList{
17261726
certTypeA: []string{"name"}, // Alice only accepts partnerA certs
17271727
},
17281728
}
17291729

17301730
bobRequiredCerts := utils.RequestedCertificateSet{
1731-
Certifiers: []wallet.PubKey{tu.GetByte33FromString("any")},
1731+
Certifiers: []*ec.PublicKey{tu.GetPKFromString("any")},
17321732
CertificateTypes: utils.RequestedCertificateTypeIDAndFieldList{
17331733
certTypeB: []string{"name"}, // Bob only accepts partnerB certs
17341734
},

auth/types.go

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import (
66
"encoding/base64"
77
"encoding/json"
88
"fmt"
9-
"slices"
109
"sync"
1110

1211
"github.com/bsv-blockchain/go-sdk/auth/certificates"
@@ -109,13 +108,11 @@ func ValidateCertificates(
109108
types := certificatesRequested.CertificateTypes
110109

111110
// Check certifier matches
112-
var certifierKey wallet.PubKey
113-
copy(certifierKey[:], cert.Certifier.ToDER())
114-
if !slices.Contains(certifiers, certifierKey) {
111+
if !utils.CertifierInSlice(certifiers, &cert.Certifier) {
115112
errCh <- fmt.Errorf(
116113
"certificate with serial number %s has an unrequested certifier: %x",
117114
cert.SerialNumber,
118-
certifierKey,
115+
cert.Certifier.ToDER(),
119116
)
120117
return
121118
}

auth/utils/get_verifiable_certificates.go

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -71,16 +71,10 @@ func GetVerifiableCertificates(ctx context.Context, options *GetVerifiableCertif
7171
continue // Skip if no fields requested for this type
7272
}
7373

74-
// Prepare verifier hex (empty if no key)
75-
var verifierHex [33]byte
76-
if options.VerifierIdentityKey != nil {
77-
copy(verifierHex[:], options.VerifierIdentityKey.ToDER())
78-
}
79-
8074
proveResult, err := options.Wallet.ProveCertificate(ctx, wallet.ProveCertificateArgs{
8175
Certificate: certResult.Certificate,
8276
FieldsToReveal: requestedFields,
83-
Verifier: verifierHex,
77+
Verifier: options.VerifierIdentityKey,
8478
Privileged: &options.Privileged,
8579
PrivilegedReason: options.PrivilegedReason,
8680
}, "")

auth/utils/get_verifiable_certificates_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ func TestGetVerifiableCertificates(t *testing.T) {
4444
keyring2Base64 := base64.StdEncoding.EncodeToString([]byte("key2"))
4545

4646
requestedCerts := &RequestedCertificateSet{
47-
Certifiers: []wallet.PubKey{tu.GetByte33FromString("certifier1"), tu.GetByte33FromString("certifier2")},
47+
Certifiers: []*ec.PublicKey{tu.GetPKFromString("certifier1"), tu.GetPKFromString("certifier2")},
4848
CertificateTypes: RequestedCertificateTypeIDAndFieldList{
4949
certType1: {"field1", "field2"},
5050
certType2: {"field3"},
@@ -113,7 +113,7 @@ func TestGetVerifiableCertificates(t *testing.T) {
113113
mockWallet := wallet.NewMockWallet(t)
114114

115115
requestedCerts := &RequestedCertificateSet{
116-
Certifiers: []wallet.PubKey{tu.GetByte33FromString("certifier1")},
116+
Certifiers: []*ec.PublicKey{tu.GetPKFromString("certifier1")},
117117
CertificateTypes: RequestedCertificateTypeIDAndFieldList{
118118
certType1: {"field1"},
119119
},
@@ -143,7 +143,7 @@ func TestGetVerifiableCertificates(t *testing.T) {
143143
mockWallet := wallet.NewMockWallet(t)
144144

145145
requestedCerts := &RequestedCertificateSet{
146-
Certifiers: []wallet.PubKey{tu.GetByte33FromString("certifier1")},
146+
Certifiers: []*ec.PublicKey{tu.GetPKFromString("certifier1")},
147147
CertificateTypes: RequestedCertificateTypeIDAndFieldList{
148148
certType1: {"field1"},
149149
},

auth/utils/validate_certificates.go

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@ import (
66
"encoding/json"
77
"errors"
88
"fmt"
9-
"slices"
10-
119
"github.com/bsv-blockchain/go-sdk/auth/certificates"
1210
ec "github.com/bsv-blockchain/go-sdk/primitives/ec"
1311
"github.com/bsv-blockchain/go-sdk/wallet"
@@ -56,12 +54,24 @@ func (m *RequestedCertificateTypeIDAndFieldList) UnmarshalJSON(data []byte) erro
5654
// RequestedCertificateSet represents a set of requested certificates
5755
type RequestedCertificateSet struct {
5856
// Array of public keys that must have signed the certificates
59-
Certifiers []wallet.PubKey
57+
Certifiers []*ec.PublicKey
6058

6159
// Map of certificate type IDs to field names that must be included
6260
CertificateTypes RequestedCertificateTypeIDAndFieldList
6361
}
6462

63+
func CertifierInSlice(certifiers []*ec.PublicKey, certifier *ec.PublicKey) bool {
64+
if certifier == nil {
65+
return false
66+
}
67+
for _, c := range certifiers {
68+
if c.IsEqual(certifier) {
69+
return true
70+
}
71+
}
72+
return false
73+
}
74+
6575
// isEmptyPublicKey checks if a public key is empty/uninitialized
6676
func isEmptyPublicKey(key ec.PublicKey) bool {
6777
return key.X == nil || key.Y == nil
@@ -114,9 +124,8 @@ func ValidateCertificates(
114124
if certificatesRequested != nil {
115125
// Check certifier matches
116126
if !isEmptyPublicKey(cert.Certifier) {
117-
var certifierKey wallet.PubKey
118-
copy(certifierKey[:], cert.Certifier.ToDER())
119-
if !slices.Contains(certificatesRequested.Certifiers, certifierKey) {
127+
certifierKey := &cert.Certifier
128+
if !CertifierInSlice(certificatesRequested.Certifiers, certifierKey) {
120129
errCh <- fmt.Errorf("certificate with serial number %s has an unrequested certifier: %x",
121130
cert.SerialNumber, certifierKey)
122131
return

auth/utils/validate_certificates_test.go

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package utils
22

33
import (
44
"context"
5-
"slices"
65
"testing"
76

87
"github.com/bsv-blockchain/go-sdk/auth/certificates"
@@ -38,7 +37,7 @@ func TestValidateCertificatesFunctionality(t *testing.T) {
3837
require.NoError(t, err)
3938
differentSubjectKey := differentSubject.PubKey()
4039

41-
anyCertifier := wallet.PubKey(tu.GetByte33FromString("any"))
40+
anyCertifier := tu.GetPKFromString("any")
4241

4342
var requestedType [32]byte
4443
copy(requestedType[:], "requested_type")
@@ -95,36 +94,34 @@ func TestValidateCertificatesFunctionality(t *testing.T) {
9594
t.Run("throws an error for unrequested certifier", func(t *testing.T) {
9695
// Create certificate request with different certifier
9796
certificatesRequested := &RequestedCertificateSet{
98-
Certifiers: []wallet.PubKey{tu.GetByte33FromString("another_certifier")}, // Different from certifierHex
97+
Certifiers: []*ec.PublicKey{tu.GetPKFromString("another_certifier")},
9998
CertificateTypes: RequestedCertificateTypeIDAndFieldList{
10099
requestedType: []string{"field1"},
101100
},
102101
}
103102

104103
// Check certifier match logic
105-
var certifierKey wallet.PubKey
106-
copy(certifierKey[:], validCertifierKey.ToDER())
107-
assert.False(t, slices.Contains(certificatesRequested.Certifiers, certifierKey))
104+
assert.False(t, CertifierInSlice(certificatesRequested.Certifiers, validCertifierKey))
108105
// The logic in ValidateCertificates would have raised an error here
109106
})
110107

111108
t.Run("accepts 'any' as a certifier match", func(t *testing.T) {
112109
// Create certificate request with "any" certifier
113110
certificatesRequested := &RequestedCertificateSet{
114-
Certifiers: []wallet.PubKey{anyCertifier},
111+
Certifiers: []*ec.PublicKey{anyCertifier},
115112
CertificateTypes: RequestedCertificateTypeIDAndFieldList{
116113
requestedType: []string{"field1"},
117114
},
118115
}
119116

120117
// "any" should match any certifier value
121-
assert.True(t, slices.Contains(certificatesRequested.Certifiers, anyCertifier))
118+
assert.True(t, CertifierInSlice(certificatesRequested.Certifiers, anyCertifier))
122119
})
123120

124121
t.Run("throws an error for unrequested certificate type", func(t *testing.T) {
125122
// Create certificate request with different type
126123
certificatesRequested := &RequestedCertificateSet{
127-
Certifiers: []wallet.PubKey{anyCertifier},
124+
Certifiers: []*ec.PublicKey{anyCertifier},
128125
CertificateTypes: RequestedCertificateTypeIDAndFieldList{
129126
anotherType: []string{"field1"}, // Different from "requested_type"
130127
},
@@ -138,7 +135,7 @@ func TestValidateCertificatesFunctionality(t *testing.T) {
138135
t.Run("validate certificates request set validation", func(t *testing.T) {
139136
// Test empty certifiers
140137
req := &RequestedCertificateSet{
141-
Certifiers: []wallet.PubKey{},
138+
Certifiers: []*ec.PublicKey{},
142139
CertificateTypes: RequestedCertificateTypeIDAndFieldList{
143140
type1: []string{"field1"},
144141
},
@@ -149,7 +146,7 @@ func TestValidateCertificatesFunctionality(t *testing.T) {
149146

150147
// Test empty types
151148
req = &RequestedCertificateSet{
152-
Certifiers: []wallet.PubKey{tu.GetByte33FromString("certifier1")},
149+
Certifiers: []*ec.PublicKey{tu.GetPKFromString("certifier1")},
153150
CertificateTypes: RequestedCertificateTypeIDAndFieldList{},
154151
}
155152
err = ValidateRequestedCertificateSet(req)
@@ -158,7 +155,7 @@ func TestValidateCertificatesFunctionality(t *testing.T) {
158155

159156
// Test empty type name
160157
req = &RequestedCertificateSet{
161-
Certifiers: []wallet.PubKey{tu.GetByte33FromString("certifier1")},
158+
Certifiers: []*ec.PublicKey{tu.GetPKFromString("certifier1")},
162159
CertificateTypes: RequestedCertificateTypeIDAndFieldList{
163160
[32]byte{}: []string{"field1"},
164161
},
@@ -169,7 +166,7 @@ func TestValidateCertificatesFunctionality(t *testing.T) {
169166

170167
// Test empty fields
171168
req = &RequestedCertificateSet{
172-
Certifiers: []wallet.PubKey{tu.GetByte33FromString("certifier1")},
169+
Certifiers: []*ec.PublicKey{tu.GetPKFromString("certifier1")},
173170
CertificateTypes: RequestedCertificateTypeIDAndFieldList{
174171
type1: []string{},
175172
},
@@ -180,7 +177,7 @@ func TestValidateCertificatesFunctionality(t *testing.T) {
180177

181178
// Test valid request
182179
req = &RequestedCertificateSet{
183-
Certifiers: []wallet.PubKey{tu.GetByte33FromString("certifier1")},
180+
Certifiers: []*ec.PublicKey{tu.GetPKFromString("certifier1")},
184181
CertificateTypes: RequestedCertificateTypeIDAndFieldList{
185182
type1: []string{"field1"},
186183
},

auth/validate_certificates_test.go

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ func TestValidateCertificates(t *testing.T) {
3434
copy(certType[:], "requested_type")
3535
// Test validate certificate requirements struct
3636
reqs := &utils.RequestedCertificateSet{
37-
Certifiers: []wallet.PubKey{tu.GetByte33FromString("valid_certifier")},
37+
Certifiers: []*ec.PublicKey{tu.GetPKFromString("valid_certifier")},
3838
CertificateTypes: utils.RequestedCertificateTypeIDAndFieldList{
3939
certType: {"field1"},
4040
},
@@ -137,17 +137,13 @@ func TestValidateCertificates(t *testing.T) {
137137
IdentityKey: subjectIdentityKey.PublicKey, // Fixed: use subject's key
138138
}
139139

140-
// Create certificate requirements
141-
var certifierHex [33]byte
142-
copy(certifierHex[:], certifierIdentityKey.PublicKey.Compressed())
143-
144140
// Convert masterCert.Type from StringBase64 to Base64Bytes32
145141
var certType32 wallet.CertificateType
146142
typeBytes, _ := base64.StdEncoding.DecodeString(string(masterCert.Type))
147143
copy(certType32[:], typeBytes)
148144

149145
certReqs := &utils.RequestedCertificateSet{
150-
Certifiers: []wallet.PubKey{certifierHex},
146+
Certifiers: []*ec.PublicKey{certifierIdentityKey.PublicKey},
151147
CertificateTypes: utils.RequestedCertificateTypeIDAndFieldList{
152148
certType32: []string{"name", "email"},
153149
},
@@ -231,17 +227,13 @@ func TestValidateCertificates(t *testing.T) {
231227
IdentityKey: subjectIdentityKey.PublicKey,
232228
}
233229

234-
// Create requirements
235-
var subjectHex [33]byte
236-
copy(subjectHex[:], subjectIdentityKey.PublicKey.Compressed())
237-
238230
// Convert certTypeBase64 from string to Base64Bytes32
239231
var certType32 wallet.CertificateType
240232
typeBytes, _ := base64.StdEncoding.DecodeString(certTypeBase64)
241233
copy(certType32[:], typeBytes)
242234

243235
certReqs := &utils.RequestedCertificateSet{
244-
Certifiers: []wallet.PubKey{subjectHex},
236+
Certifiers: []*ec.PublicKey{subjectIdentityKey.PublicKey},
245237
CertificateTypes: utils.RequestedCertificateTypeIDAndFieldList{
246238
certType32: []string{"owner"},
247239
},

docs/examples/identity_client/main.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"log"
77

88
"github.com/bsv-blockchain/go-sdk/identity"
9+
ec "github.com/bsv-blockchain/go-sdk/primitives/ec"
910
"github.com/bsv-blockchain/go-sdk/wallet"
1011
)
1112

@@ -76,10 +77,16 @@ func main() {
7677
// -------------------------------------------------------------------------
7778
// EXAMPLE 3: Resolve identity by identity key
7879
// -------------------------------------------------------------------------
80+
// Create a valid identity key for the example
81+
identityPubKey, err := ec.NewPrivateKey()
82+
if err != nil {
83+
log.Fatalf("Failed to create identity key: %v", err)
84+
}
85+
7986
identities, err := client.ResolveByIdentityKey(
8087
context.Background(),
8188
wallet.DiscoverByIdentityKeyArgs{
82-
IdentityKey: [33]byte{0x01, 0x02, 0x03},
89+
IdentityKey: identityPubKey.PubKey(),
8390
},
8491
)
8592
if err != nil {

0 commit comments

Comments
 (0)