Skip to content

Commit a41773c

Browse files
committed
Standardize custom byte types
1 parent 26d4f0a commit a41773c

28 files changed

+253
-255
lines changed

auth/certificates/certificate.go

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,10 @@ var (
2424
// It provides methods for serialization, deserialization, signing, and verifying certificates.
2525
type Certificate struct {
2626
// Type identifier for the certificate, base64 encoded string, 32 bytes
27-
Type wallet.Base64String `json:"type"`
27+
Type wallet.StringBase64 `json:"type"`
2828

2929
// Unique serial number of the certificate, base64 encoded string, 32 bytes
30-
SerialNumber wallet.Base64String `json:"serialNumber"`
30+
SerialNumber wallet.StringBase64 `json:"serialNumber"`
3131

3232
// The public key belonging to the certificate's subject
3333
Subject ec.PublicKey `json:"subject"`
@@ -39,20 +39,20 @@ type Certificate struct {
3939
RevocationOutpoint *overlay.Outpoint `json:"revocationOutpoint"`
4040

4141
// All the fields present in the certificate, with field names as keys and encrypted field values as strings
42-
Fields map[wallet.CertificateFieldNameUnder50Bytes]wallet.Base64String `json:"fields"`
42+
Fields map[wallet.CertificateFieldNameUnder50Bytes]wallet.StringBase64 `json:"fields"`
4343

4444
// Certificate signature by the certifier's private key
4545
Signature []byte `json:"signature,omitempty"`
4646
}
4747

4848
// NewCertificate creates a new certificate with the given fields
4949
func NewCertificate(
50-
certType wallet.Base64String,
51-
serialNumber wallet.Base64String,
50+
certType wallet.StringBase64,
51+
serialNumber wallet.StringBase64,
5252
subject ec.PublicKey,
5353
certifier ec.PublicKey,
5454
revocationOutpoint *overlay.Outpoint,
55-
fields map[wallet.CertificateFieldNameUnder50Bytes]wallet.Base64String,
55+
fields map[wallet.CertificateFieldNameUnder50Bytes]wallet.StringBase64,
5656
signature []byte,
5757
) *Certificate {
5858
return &Certificate{
@@ -75,14 +75,14 @@ func (c *Certificate) ToBinary(includeSignature bool) ([]byte, error) {
7575

7676
writer := util.NewWriter()
7777

78-
// Write type (Base64String, 32 bytes)
78+
// Write type (StringBase64, 32 bytes)
7979
typeBytes, err := base64.StdEncoding.DecodeString(string(c.Type))
8080
if err != nil {
8181
return nil, fmt.Errorf("invalid type encoding: %w", err)
8282
}
8383
writer.WriteBytes(typeBytes)
8484

85-
// Write serialNumber (Base64String, 32 bytes)
85+
// Write serialNumber (StringBase64, 32 bytes)
8686
serialNumberBytes, err := base64.StdEncoding.DecodeString(string(c.SerialNumber))
8787
if err != nil {
8888
return nil, fmt.Errorf("invalid serial number encoding: %w", err)
@@ -197,7 +197,7 @@ func CertificateFromBinary(data []byte) (*Certificate, error) {
197197
}
198198

199199
// Read fields
200-
fields := make(map[wallet.CertificateFieldNameUnder50Bytes]wallet.Base64String)
200+
fields := make(map[wallet.CertificateFieldNameUnder50Bytes]wallet.StringBase64)
201201
for i := uint64(0); i < fieldCount; i++ {
202202
// Field name length (varint)
203203
fieldNameLength, err := reader.ReadVarInt()
@@ -223,7 +223,7 @@ func CertificateFromBinary(data []byte) (*Certificate, error) {
223223
if err != nil {
224224
return nil, fmt.Errorf("failed to read field value: %w", err)
225225
}
226-
fieldValue := wallet.Base64String(string(fieldValueBytes))
226+
fieldValue := wallet.StringBase64(string(fieldValueBytes))
227227

228228
fields[fieldName] = fieldValue
229229
}
@@ -235,8 +235,8 @@ func CertificateFromBinary(data []byte) (*Certificate, error) {
235235
}
236236

237237
return &Certificate{
238-
Type: wallet.Base64String(typeStr),
239-
SerialNumber: wallet.Base64String(serialNumber),
238+
Type: wallet.StringBase64(typeStr),
239+
SerialNumber: wallet.StringBase64(serialNumber),
240240
Subject: *subject,
241241
Certifier: *certifier,
242242
RevocationOutpoint: revocationOutpoint,

auth/certificates/certificate_test.go

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ import (
1313

1414
func TestCertificate(t *testing.T) {
1515
// Sample data for testing - use consistent data like in TS
16-
sampleType := wallet.Base64String(base64.StdEncoding.EncodeToString(make([]byte, 32)))
17-
sampleSerialNumber := wallet.Base64String(base64.StdEncoding.EncodeToString(make([]byte, 32)))
16+
sampleType := wallet.StringBase64(base64.StdEncoding.EncodeToString(make([]byte, 32)))
17+
sampleSerialNumber := wallet.StringBase64(base64.StdEncoding.EncodeToString(make([]byte, 32)))
1818

1919
// Create private keys
2020
sampleSubjectPrivateKey, err := ec.NewPrivateKey()
@@ -33,12 +33,12 @@ func TestCertificate(t *testing.T) {
3333
sampleRevocationOutpoint := &outpoint
3434

3535
// Convert string maps to the proper types
36-
sampleFields := map[wallet.CertificateFieldNameUnder50Bytes]wallet.Base64String{
37-
wallet.CertificateFieldNameUnder50Bytes("name"): wallet.Base64String("Alice"),
38-
wallet.CertificateFieldNameUnder50Bytes("email"): wallet.Base64String("alice@example.com"),
39-
wallet.CertificateFieldNameUnder50Bytes("organization"): wallet.Base64String("Example Corp"),
36+
sampleFields := map[wallet.CertificateFieldNameUnder50Bytes]wallet.StringBase64{
37+
wallet.CertificateFieldNameUnder50Bytes("name"): wallet.StringBase64("Alice"),
38+
wallet.CertificateFieldNameUnder50Bytes("email"): wallet.StringBase64("alice@example.com"),
39+
wallet.CertificateFieldNameUnder50Bytes("organization"): wallet.StringBase64("Example Corp"),
4040
}
41-
sampleFieldsEmpty := map[wallet.CertificateFieldNameUnder50Bytes]wallet.Base64String{}
41+
sampleFieldsEmpty := map[wallet.CertificateFieldNameUnder50Bytes]wallet.StringBase64{}
4242

4343
// Helper function to create a ProtoWallet for testing
4444
createProtoWallet := func(privateKey *ec.PrivateKey) *wallet.ProtoWallet {
@@ -166,7 +166,7 @@ func TestCertificate(t *testing.T) {
166166
require.NoError(t, err)
167167

168168
// Tamper with the certificate (modify a field)
169-
certificate.Fields[wallet.CertificateFieldNameUnder50Bytes("email")] = wallet.Base64String("attacker@example.com")
169+
certificate.Fields[wallet.CertificateFieldNameUnder50Bytes("email")] = wallet.StringBase64("attacker@example.com")
170170

171171
// Verify the signature
172172
err = certificate.Verify(t.Context())
@@ -275,8 +275,8 @@ func TestCertificate(t *testing.T) {
275275
longFieldValue += "longFieldValue_"
276276
}
277277

278-
fields := map[wallet.CertificateFieldNameUnder50Bytes]wallet.Base64String{
279-
wallet.CertificateFieldNameUnder50Bytes(longFieldName): wallet.Base64String(longFieldValue),
278+
fields := map[wallet.CertificateFieldNameUnder50Bytes]wallet.StringBase64{
279+
wallet.CertificateFieldNameUnder50Bytes(longFieldName): wallet.StringBase64(longFieldValue),
280280
}
281281

282282
certificate := &Certificate{

auth/certificates/master.go

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -29,14 +29,14 @@ type MasterCertificate struct {
2929
Certificate
3030
// MasterKeyring contains encrypted symmetric keys (Base64 encoded) for each field.
3131
// The key is the field name, and the value is the encrypted key.
32-
MasterKeyring map[wallet.CertificateFieldNameUnder50Bytes]wallet.Base64String `json:"masterKeyring,omitempty"`
32+
MasterKeyring map[wallet.CertificateFieldNameUnder50Bytes]wallet.StringBase64 `json:"masterKeyring,omitempty"`
3333
}
3434

3535
// NewMasterCertificate creates a new MasterCertificate instance.
3636
// It validates that the masterKeyring contains an entry for every field in the base certificate.
3737
func NewMasterCertificate(
3838
cert *Certificate,
39-
masterKeyring map[wallet.CertificateFieldNameUnder50Bytes]wallet.Base64String,
39+
masterKeyring map[wallet.CertificateFieldNameUnder50Bytes]wallet.StringBase64,
4040
) (*MasterCertificate, error) {
4141
if len(masterKeyring) == 0 {
4242
return nil, ErrMissingMasterKeyring
@@ -59,8 +59,8 @@ func NewMasterCertificate(
5959

6060
// CertificateFieldsResult holds the results from creating encrypted certificate fields.
6161
type CertificateFieldsResult struct {
62-
CertificateFields map[wallet.CertificateFieldNameUnder50Bytes]wallet.Base64String
63-
MasterKeyring map[wallet.CertificateFieldNameUnder50Bytes]wallet.Base64String
62+
CertificateFields map[wallet.CertificateFieldNameUnder50Bytes]wallet.StringBase64
63+
MasterKeyring map[wallet.CertificateFieldNameUnder50Bytes]wallet.StringBase64
6464
}
6565

6666
// CreateCertificateFields encrypts certificate fields for a subject and generates a master keyring.
@@ -73,8 +73,8 @@ func CreateCertificateFields(
7373
privileged bool,
7474
privilegedReason string,
7575
) (*CertificateFieldsResult, error) {
76-
certificateFields := make(map[wallet.CertificateFieldNameUnder50Bytes]wallet.Base64String)
77-
masterKeyring := make(map[wallet.CertificateFieldNameUnder50Bytes]wallet.Base64String)
76+
certificateFields := make(map[wallet.CertificateFieldNameUnder50Bytes]wallet.StringBase64)
77+
masterKeyring := make(map[wallet.CertificateFieldNameUnder50Bytes]wallet.StringBase64)
7878

7979
for fieldName, fieldValue := range fields {
8080
// 1. Generate a random symmetric key (32 bytes)
@@ -89,7 +89,7 @@ func CreateCertificateFields(
8989
if err != nil {
9090
return nil, fmt.Errorf("failed to encrypt field value for %s: %w", fieldName, err)
9191
}
92-
certificateFields[fieldName] = wallet.Base64String(base64.StdEncoding.EncodeToString(encryptedFieldValue))
92+
certificateFields[fieldName] = wallet.StringBase64(base64.StdEncoding.EncodeToString(encryptedFieldValue))
9393

9494
// 3. Encrypt the symmetric key for the certifier/subject
9595
protocolID, keyID := GetCertificateEncryptionDetails(string(fieldName), "") // No serial number for master keyring creation
@@ -106,7 +106,7 @@ func CreateCertificateFields(
106106
if err != nil {
107107
return nil, fmt.Errorf("failed to encrypt field revelation key for %s: %w", fieldName, err)
108108
}
109-
masterKeyring[fieldName] = wallet.Base64String(base64.StdEncoding.EncodeToString(encryptedKey.Ciphertext))
109+
masterKeyring[fieldName] = wallet.StringBase64(base64.StdEncoding.EncodeToString(encryptedKey.Ciphertext))
110110
}
111111

112112
return &CertificateFieldsResult{
@@ -128,19 +128,19 @@ func IssueCertificateForSubject(
128128
plainFields map[string]string, // Plaintext fields
129129
certificateType string,
130130
getRevocationOutpoint func(string) (*overlay.Outpoint, error), // Optional func
131-
serialNumberStr string, // Optional serial number as Base64String
131+
serialNumberStr string, // Optional serial number as StringBase64
132132
) (*MasterCertificate, error) {
133133

134134
// 1. Generate a random serialNumber if not provided
135-
var serialNumber wallet.Base64String
135+
var serialNumber wallet.StringBase64
136136
if serialNumberStr != "" {
137-
serialNumber = wallet.Base64String(serialNumberStr)
137+
serialNumber = wallet.StringBase64(serialNumberStr)
138138
} else {
139139
serialBytes := make([]byte, 32)
140140
if _, err := rand.Read(serialBytes); err != nil {
141141
return nil, fmt.Errorf("failed to generate random serial number: %w", err)
142142
}
143-
serialNumber = wallet.Base64String(base64.StdEncoding.EncodeToString(serialBytes))
143+
serialNumber = wallet.StringBase64(base64.StdEncoding.EncodeToString(serialBytes))
144144
}
145145

146146
// Convert plainFields map[string]string to map[wallet.CertificateFieldNameUnder50Bytes]string
@@ -183,7 +183,7 @@ func IssueCertificateForSubject(
183183

184184
// 5. Create the base Certificate struct
185185
baseCert := &Certificate{
186-
Type: wallet.Base64String(certificateType),
186+
Type: wallet.StringBase64(certificateType),
187187
SerialNumber: serialNumber,
188188
Certifier: *certifierPubKey.PublicKey,
189189
RevocationOutpoint: revocationOutpoint,
@@ -234,9 +234,9 @@ type DecryptFieldResult struct {
234234
func DecryptField(
235235
ctx context.Context,
236236
subjectOrCertifierWallet *wallet.ProtoWallet,
237-
masterKeyring map[wallet.CertificateFieldNameUnder50Bytes]wallet.Base64String,
237+
masterKeyring map[wallet.CertificateFieldNameUnder50Bytes]wallet.StringBase64,
238238
fieldName wallet.CertificateFieldNameUnder50Bytes,
239-
encryptedFieldValue wallet.Base64String, // Base64 encoded encrypted value
239+
encryptedFieldValue wallet.StringBase64, // Base64 encoded encrypted value
240240
counterparty wallet.Counterparty,
241241
privileged bool,
242242
privilegedReason string,
@@ -296,8 +296,8 @@ func DecryptField(
296296
func DecryptFields(
297297
ctx context.Context,
298298
subjectOrCertifierWallet *wallet.ProtoWallet,
299-
masterKeyring map[wallet.CertificateFieldNameUnder50Bytes]wallet.Base64String,
300-
fields map[wallet.CertificateFieldNameUnder50Bytes]wallet.Base64String, // Encrypted fields
299+
masterKeyring map[wallet.CertificateFieldNameUnder50Bytes]wallet.StringBase64,
300+
fields map[wallet.CertificateFieldNameUnder50Bytes]wallet.StringBase64, // Encrypted fields
301301
counterparty wallet.Counterparty,
302302
privileged bool,
303303
privilegedReason string,
@@ -341,19 +341,19 @@ func CreateKeyringForVerifier(
341341
subjectWallet *wallet.ProtoWallet,
342342
certifier wallet.Counterparty, // Counterparty used when decrypting master key
343343
verifier wallet.Counterparty, // Counterparty to encrypt for
344-
fields map[wallet.CertificateFieldNameUnder50Bytes]wallet.Base64String, // All encrypted fields from cert
344+
fields map[wallet.CertificateFieldNameUnder50Bytes]wallet.StringBase64, // All encrypted fields from cert
345345
fieldsToReveal []wallet.CertificateFieldNameUnder50Bytes, // Which fields to include in the new keyring
346-
masterKeyring map[wallet.CertificateFieldNameUnder50Bytes]wallet.Base64String, // The original master keyring
347-
serialNumber wallet.Base64String, // Serial number needed for encryption protocol/key ID
346+
masterKeyring map[wallet.CertificateFieldNameUnder50Bytes]wallet.StringBase64, // The original master keyring
347+
serialNumber wallet.StringBase64, // Serial number needed for encryption protocol/key ID
348348
privileged bool,
349349
privilegedReason string,
350-
) (map[wallet.CertificateFieldNameUnder50Bytes]wallet.Base64String, error) { // Returns the verifier-specific keyring
350+
) (map[wallet.CertificateFieldNameUnder50Bytes]wallet.StringBase64, error) { // Returns the verifier-specific keyring
351351
if len(masterKeyring) == 0 {
352352
return nil, ErrMissingMasterKeyring
353353
}
354354

355355
// Create a new verifier-specific keyring
356-
keyringForVerifier := make(map[wallet.CertificateFieldNameUnder50Bytes]wallet.Base64String)
356+
keyringForVerifier := make(map[wallet.CertificateFieldNameUnder50Bytes]wallet.StringBase64)
357357

358358
// For each field to reveal:
359359
for _, fieldName := range fieldsToReveal {
@@ -397,7 +397,7 @@ func CreateKeyringForVerifier(
397397
}
398398

399399
// 3. Store in verifier keyring
400-
keyringForVerifier[fieldName] = wallet.Base64String(base64.StdEncoding.EncodeToString(encryptedKeyForVerifier.Ciphertext))
400+
keyringForVerifier[fieldName] = wallet.StringBase64(base64.StdEncoding.EncodeToString(encryptedKeyForVerifier.Ciphertext))
401401
}
402402

403403
return keyringForVerifier, nil

auth/certificates/master_test.go

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -47,27 +47,27 @@ func TestMasterCertificate(t *testing.T) {
4747
if err != nil {
4848
t.Fatalf("Failed to encrypt field value: %v", err)
4949
}
50-
encryptedFieldValue := wallet.Base64String(base64.StdEncoding.EncodeToString(encryptedFieldValueBytes))
50+
encryptedFieldValue := wallet.StringBase64(base64.StdEncoding.EncodeToString(encryptedFieldValueBytes))
5151

52-
encryptedKeyForSubject := wallet.Base64String(base64.StdEncoding.EncodeToString([]byte{0, 1, 2, 3}))
52+
encryptedKeyForSubject := wallet.StringBase64(base64.StdEncoding.EncodeToString([]byte{0, 1, 2, 3}))
5353

5454
// We assume we have the same fieldName in both `fields` and `masterKeyring`.
55-
fields := map[wallet.CertificateFieldNameUnder50Bytes]wallet.Base64String{
55+
fields := map[wallet.CertificateFieldNameUnder50Bytes]wallet.StringBase64{
5656
"name": encryptedFieldValue,
5757
}
5858

59-
masterKeyring := map[wallet.CertificateFieldNameUnder50Bytes]wallet.Base64String{
59+
masterKeyring := map[wallet.CertificateFieldNameUnder50Bytes]wallet.StringBase64{
6060
"name": encryptedKeyForSubject,
6161
}
6262

6363
// certificate type is 16 random bytes base64 encoded
6464
certTypeBytes := make([]byte, 16)
6565
_, _ = rand.Read(certTypeBytes)
66-
certType := wallet.Base64String(base64.StdEncoding.EncodeToString(certTypeBytes))
66+
certType := wallet.StringBase64(base64.StdEncoding.EncodeToString(certTypeBytes))
6767

6868
serialNumberBytes := make([]byte, 16)
6969
_, _ = rand.Read(serialNumberBytes)
70-
serialNumber := wallet.Base64String(base64.StdEncoding.EncodeToString(serialNumberBytes))
70+
serialNumber := wallet.StringBase64(base64.StdEncoding.EncodeToString(serialNumberBytes))
7171

7272
baseCert := &certificates.Certificate{
7373
Type: certType,
@@ -102,8 +102,8 @@ func TestMasterCertificate(t *testing.T) {
102102
})
103103

104104
t.Run("should return error if masterKeyring is missing a key for any field", func(t *testing.T) {
105-
fields := map[wallet.CertificateFieldNameUnder50Bytes]wallet.Base64String{"name": utils.RandomBase64(16)}
106-
masterKeyring := map[wallet.CertificateFieldNameUnder50Bytes]wallet.Base64String{} // Intentionally empty
105+
fields := map[wallet.CertificateFieldNameUnder50Bytes]wallet.StringBase64{"name": utils.RandomBase64(16)}
106+
masterKeyring := map[wallet.CertificateFieldNameUnder50Bytes]wallet.StringBase64{} // Intentionally empty
107107

108108
baseCert := &certificates.Certificate{
109109
Type: utils.RandomBase64(16),
@@ -192,7 +192,7 @@ func TestMasterCertificate(t *testing.T) {
192192
_, err = certificates.DecryptFields(
193193
t.Context(),
194194
subjectWallet.ProtoWallet,
195-
map[wallet.CertificateFieldNameUnder50Bytes]wallet.Base64String{}, // Test empty keyring
195+
map[wallet.CertificateFieldNameUnder50Bytes]wallet.StringBase64{}, // Test empty keyring
196196
issueCert.Fields, // Uses issuedCert from outer scope
197197
certifierCounterparty,
198198
false,
@@ -209,7 +209,7 @@ func TestMasterCertificate(t *testing.T) {
209209

210210
t.Run("should return error if decryption fails for any field", func(t *testing.T) {
211211
// Create a bad keyring manually
212-
badMasterKeyring := make(map[wallet.CertificateFieldNameUnder50Bytes]wallet.Base64String)
212+
badMasterKeyring := make(map[wallet.CertificateFieldNameUnder50Bytes]wallet.StringBase64)
213213
for k := range issueCert.Fields { // Uses issuedCert from outer scope
214214
badMasterKeyring[k] = utils.RandomBase64(64) // Provide structurally valid (>48 bytes) but incorrect key data
215215
}
@@ -316,7 +316,7 @@ func TestMasterCertificate(t *testing.T) {
316316

317317
t.Run("should return error if the master key fails to decrypt", func(t *testing.T) {
318318
// Tamper with the master keyring
319-
tamperedMasterKeyring := make(map[wallet.CertificateFieldNameUnder50Bytes]wallet.Base64String)
319+
tamperedMasterKeyring := make(map[wallet.CertificateFieldNameUnder50Bytes]wallet.StringBase64)
320320
for k, v := range issueCert.MasterKeyring { // Uses issuedCert from outer scope
321321
if k == "name" {
322322
tamperedMasterKeyring[k] = utils.RandomBase64(64) // Provide structurally valid (>48 bytes) but incorrect key data

auth/certificates/verifiable.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ type VerifiableCertificate struct {
2424

2525
// KeyRing contains the encrypted field revelation keys, specifically encrypted for the intended verifier.
2626
// The map keys are the field names (string), and values are the base64 encoded encrypted keys (string).
27-
Keyring map[wallet.CertificateFieldNameUnder50Bytes]wallet.Base64String `json:"keyring,omitempty"`
27+
Keyring map[wallet.CertificateFieldNameUnder50Bytes]wallet.StringBase64 `json:"keyring,omitempty"`
2828

2929
// DecryptedFields stores the successfully decrypted field values after calling DecryptFields.
3030
// Populated only upon successful decryption of all fields present in the KeyRing.
@@ -36,7 +36,7 @@ type VerifiableCertificate struct {
3636
// It takes a pointer to a base Certificate and the verifier-specific KeyRing.
3737
func NewVerifiableCertificate(
3838
cert *Certificate, // Pointer to the base Certificate data
39-
keyring map[wallet.CertificateFieldNameUnder50Bytes]wallet.Base64String, // Verifier-specific keyring
39+
keyring map[wallet.CertificateFieldNameUnder50Bytes]wallet.StringBase64, // Verifier-specific keyring
4040
) *VerifiableCertificate {
4141
return &VerifiableCertificate{
4242
Certificate: *cert, // Dereference and copy the base certificate data
@@ -56,7 +56,7 @@ func NewVerifiableCertificateFromBinary(data []byte) (*VerifiableCertificate, er
5656
// Create a VerifiableCertificate with an empty keyring
5757
verifiableCert := &VerifiableCertificate{
5858
Certificate: *cert,
59-
Keyring: make(map[wallet.CertificateFieldNameUnder50Bytes]wallet.Base64String),
59+
Keyring: make(map[wallet.CertificateFieldNameUnder50Bytes]wallet.StringBase64),
6060
DecryptedFields: make(map[string]string),
6161
}
6262

0 commit comments

Comments
 (0)