Skip to content

Commit ca4ae7c

Browse files
committed
Keyring revealer object to handle JSON hex or certifier
1 parent dc294c3 commit ca4ae7c

File tree

5 files changed

+46
-13
lines changed

5 files changed

+46
-13
lines changed

wallet/interfaces.go

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -608,6 +608,41 @@ func AcquisitionProtocolFromString(s string) (AcquisitionProtocol, error) {
608608

609609
const KeyringRevealerCertifier = "certifier"
610610

611+
// KeyringRevealer is a special JSON type used for identifying the revealer of a keyring.
612+
// It can either point to the certifier or be a public key.
613+
type KeyringRevealer struct {
614+
Certifier bool
615+
PubKey HexBytes33
616+
}
617+
618+
func (r KeyringRevealer) MarshalJSON() ([]byte, error) {
619+
if r.Certifier {
620+
return json.Marshal(KeyringRevealerCertifier)
621+
}
622+
return json.Marshal(hex.EncodeToString(r.PubKey[:]))
623+
}
624+
625+
func (r *KeyringRevealer) UnmarshalJSON(data []byte) error {
626+
var str string
627+
if err := json.Unmarshal(data, &str); err != nil {
628+
return fmt.Errorf("error unmarshaling revealer: %w", err)
629+
}
630+
631+
if str == KeyringRevealerCertifier {
632+
r.Certifier = true
633+
return nil
634+
}
635+
data, err := hex.DecodeString(str)
636+
if err != nil {
637+
return fmt.Errorf("error decoding revealer hex: %w", err)
638+
}
639+
if len(data) != 33 {
640+
return fmt.Errorf("revealer hex must be 33 bytes, got %d", len(data))
641+
}
642+
copy(r.PubKey[:], data)
643+
return nil
644+
}
645+
611646
type AcquireCertificateArgs struct {
612647
Type Base64Bytes32 `json:"type"`
613648
Certifier HexBytes33 `json:"certifier"`
@@ -617,7 +652,7 @@ type AcquireCertificateArgs struct {
617652
RevocationOutpoint *Outpoint `json:"revocationOutpoint,omitempty"`
618653
Signature JSONByteHex `json:"signature,omitempty"`
619654
CertifierUrl string `json:"certifierUrl,omitempty"`
620-
KeyringRevealer string `json:"keyringRevealer,omitempty"` // "certifier" | PubKeyHex
655+
KeyringRevealer KeyringRevealer `json:"keyringRevealer,omitempty"` // "certifier" | PubKeyHex
621656
KeyringForSubject map[string]string `json:"keyringForSubject,omitempty"`
622657
Privileged *bool `json:"privileged,omitempty"`
623658
PrivilegedReason string `json:"privilegedReason,omitempty"`

wallet/serializer/acquire_certificate.go

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

33
import (
4-
"encoding/hex"
54
"fmt"
65

76
"github.com/bsv-blockchain/go-sdk/util"
@@ -63,10 +62,10 @@ func SerializeAcquireCertificateArgs(args *wallet.AcquireCertificateArgs) ([]byt
6362
w.WriteIntBytes(args.Signature)
6463

6564
// Keyring revealer
66-
if args.KeyringRevealer == wallet.KeyringRevealerCertifier {
65+
if args.KeyringRevealer.Certifier {
6766
w.WriteByte(keyRingRevealerCertifier)
68-
} else if err := w.WriteSizeFromHex(args.KeyringRevealer, sizeRevealer); err != nil {
69-
return nil, fmt.Errorf("invalid keyringRevealer hex: %w", err)
67+
} else {
68+
w.WriteBytes(args.KeyringRevealer.PubKey[:])
7069
}
7170

7271
// Keyring for subject
@@ -152,10 +151,12 @@ func DeserializeAcquireCertificateArgs(data []byte) (*wallet.AcquireCertificateA
152151
// Read keyring revealer
153152
keyringRevealerIdentifier := r.ReadByte()
154153
if keyringRevealerIdentifier == keyRingRevealerCertifier {
155-
args.KeyringRevealer = wallet.KeyringRevealerCertifier
154+
args.KeyringRevealer = wallet.KeyringRevealer{
155+
Certifier: true,
156+
}
156157
} else {
157158
keyringRevealerBytes := append([]byte{keyringRevealerIdentifier}, r.ReadBytes(sizeRevealer-1)...)
158-
args.KeyringRevealer = hex.EncodeToString(keyringRevealerBytes)
159+
copy(args.KeyringRevealer.PubKey[:], keyringRevealerBytes)
159160
}
160161

161162
// Read keyring for subject

wallet/serializer/acquire_certificate_test.go

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package serializer
22

33
import (
44
"encoding/base64"
5-
"encoding/hex"
65
"github.com/bsv-blockchain/go-sdk/util"
76
"github.com/bsv-blockchain/go-sdk/util/test_util"
87
"github.com/bsv-blockchain/go-sdk/wallet"
@@ -28,7 +27,7 @@ func TestAcquireCertificateArgs(t *testing.T) {
2827
SerialNumber: [32]byte{1},
2928
RevocationOutpoint: revocationOutpoint,
3029
Signature: make([]byte, 64),
31-
KeyringRevealer: wallet.KeyringRevealerCertifier,
30+
KeyringRevealer: wallet.KeyringRevealer{Certifier: true},
3231
KeyringForSubject: map[string]string{
3332
"field1": base64.StdEncoding.EncodeToString([]byte("keyring1")),
3433
},
@@ -54,8 +53,6 @@ func TestAcquireCertificateArgs(t *testing.T) {
5453
AcquisitionProtocol: wallet.AcquisitionProtocolDirect,
5554
SerialNumber: [32]byte{3},
5655
RevocationOutpoint: revocationOutpoint,
57-
Signature: make([]byte, 64),
58-
KeyringRevealer: hex.EncodeToString(make([]byte, sizeRevealer)),
5956
},
6057
}}
6158

wallet/substrates/testdata/acquireCertificate-simple-args.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
"revocationOutpoint": "aec245f27b7640c8b1865045107731bfb848115c573f7da38166074b1c9e475d.0",
1212
"signature": "3045022100a6f09ee70382ab364f3f6b040aebb8fe7a51dbc3b4c99cfeb2f7756432162833022067349b91a6319345996faddf36d1b2f3a502e4ae002205f9d2db85474f9aed5a",
1313
"certifierUrl": "https://certifier.example.com",
14-
"keyringRevealer": "revealer-key-hex",
14+
"keyringRevealer": "319ee9fb4b2d9d84d2f5046986a12f29f163c5aa2db664a9b758e983837a321838",
1515
"keyringForSubject": {
1616
"field1": "key1",
1717
"field2": "key2"

wallet/substrates/vector_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -443,7 +443,7 @@ func TestVectors(t *testing.T) {
443443
RevocationOutpoint: outpoint,
444444
Signature: signature,
445445
CertifierUrl: "https://certifier.example.com",
446-
KeyringRevealer: "revealer-key-hex", // TODO: change to real hex, e.g. 319ee9fb4b2d9d84d2f5046986a12f29f163c5aa2db664a9b758e983837a321838
446+
KeyringRevealer: wallet.KeyringRevealer{PubKey: tu.GetByte33FromHexString(t, "319ee9fb4b2d9d84d2f5046986a12f29f163c5aa2db664a9b758e983837a321838")},
447447
KeyringForSubject: map[string]string{"field1": "key1", "field2": "key2"},
448448
Privileged: util.BoolPtr(false),
449449
},

0 commit comments

Comments
 (0)