Skip to content

Commit 76b85e3

Browse files
authored
Make SCTsigner an object (#263)
* move sct signer to object # Conflicts: # internal/scti/handlers_test.go # Conflicts: # internal/scti/handlers_test.go # Conflicts: # internal/scti/signatures_test.go * typo
1 parent be76f23 commit 76b85e3

File tree

4 files changed

+20
-20
lines changed

4 files changed

+20
-20
lines changed

internal/scti/ctlog.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@ type log struct {
3030
storage Storage
3131
}
3232

33+
// signSCT builds an SCT for a leaf.
34+
type signSCT func(leaf *rfc6962.MerkleTreeLeaf) (*rfc6962.SignedCertificateTimestamp, error)
35+
3336
// Storage provides functions to store certificates in a static-ct-api log.
3437
type Storage interface {
3538
// Add assigns an index to the provided Entry, stages the entry for integration, and returns a future for the assigned index.
@@ -71,9 +74,8 @@ func NewLog(ctx context.Context, origin string, signer crypto.Signer, cv ChainVa
7174
return nil, fmt.Errorf("unsupported key type: %v", keyType)
7275
}
7376

74-
log.signSCT = func(leaf *rfc6962.MerkleTreeLeaf) (*rfc6962.SignedCertificateTimestamp, error) {
75-
return buildV1SCT(signer, leaf)
76-
}
77+
sctSigner := &sctSigner{signer: signer}
78+
log.signSCT = sctSigner.Sign
7779

7880
log.chainValidator = cv
7981

internal/scti/handlers_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ func setupTestLog(t *testing.T) (*log, string) {
9696
t.Helper()
9797
storageDir := t.TempDir()
9898

99-
signer, err := setupSigner(fakeSignature)
99+
sctSigner, err := setupSCTSigner(fakeSignature)
100100
if err != nil {
101101
t.Fatalf("Failed to create test signer: %v", err)
102102
}
@@ -112,7 +112,7 @@ func setupTestLog(t *testing.T) (*log, string) {
112112
rejectUnexpired: false,
113113
}
114114

115-
log, err := NewLog(t.Context(), origin, signer, cv, newPOSIXStorageFunc(t, storageDir), newFixedTimeSource(fakeTime))
115+
log, err := NewLog(t.Context(), origin, sctSigner.signer, cv, newPOSIXStorageFunc(t, storageDir), newFixedTimeSource(fakeTime))
116116
if err != nil {
117117
t.Fatalf("newLog(): %v", err)
118118
}

internal/scti/signatures.go

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,9 @@ import (
3131

3232
const nanosPerMilli int64 = int64(time.Millisecond / time.Nanosecond)
3333

34-
// signSCT builds an SCT for a leaf.
35-
type signSCT func(leaf *rfc6962.MerkleTreeLeaf) (*rfc6962.SignedCertificateTimestamp, error)
34+
type sctSigner struct {
35+
signer crypto.Signer
36+
}
3637

3738
// serializeSCTSignatureInput serializes the passed in sct and log entry into
3839
// the correct format for signing.
@@ -63,9 +64,7 @@ func serializeSCTSignatureInput(sct rfc6962.SignedCertificateTimestamp, entry rf
6364
}
6465
}
6566

66-
// TODO(phboneff): create an SCTSigner object
67-
// TODO(phboneff): see if we can change leaf to idx and entry
68-
func buildV1SCT(signer crypto.Signer, leaf *rfc6962.MerkleTreeLeaf) (*rfc6962.SignedCertificateTimestamp, error) {
67+
func (sctSigner *sctSigner) Sign(leaf *rfc6962.MerkleTreeLeaf) (*rfc6962.SignedCertificateTimestamp, error) {
6968
// Serialize SCT signature input to get the bytes that need to be signed
7069
sctInput := rfc6962.SignedCertificateTimestamp{
7170
SCTVersion: rfc6962.V1,
@@ -78,20 +77,20 @@ func buildV1SCT(signer crypto.Signer, leaf *rfc6962.MerkleTreeLeaf) (*rfc6962.Si
7877
}
7978

8079
h := sha256.Sum256(data)
81-
signature, err := signer.Sign(rand.Reader, h[:], crypto.SHA256)
80+
signature, err := sctSigner.signer.Sign(rand.Reader, h[:], crypto.SHA256)
8281
if err != nil {
8382
return nil, fmt.Errorf("failed to sign SCT data: %v", err)
8483
}
8584

8685
digitallySigned := rfc6962.DigitallySigned{
8786
Algorithm: tls.SignatureAndHashAlgorithm{
8887
Hash: tls.SHA256,
89-
Signature: tls.SignatureAlgorithmFromPubKey(signer.Public()),
88+
Signature: tls.SignatureAlgorithmFromPubKey(sctSigner.signer.Public()),
9089
},
9190
Signature: signature,
9291
}
9392

94-
logID, err := getCTLogID(signer.Public())
93+
logID, err := getCTLogID(sctSigner.signer.Public())
9594
if err != nil {
9695
return nil, fmt.Errorf("failed to get logID for signing: %v", err)
9796
}

internal/scti/signatures_test.go

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ package scti
1616

1717
import (
1818
"bytes"
19-
"crypto"
2019
"crypto/ecdsa"
2120
"crypto/sha256"
2221
"crypto/x509"
@@ -250,7 +249,7 @@ func TestBuildV1MerkleTreeLeafForCert(t *testing.T) {
250249
t.Fatalf("failed to set up test cert: %v", err)
251250
}
252251

253-
signer, err := setupSigner(fakeSignature)
252+
sctSigner, err := setupSCTSigner(fakeSignature)
254253
if err != nil {
255254
t.Fatalf("could not create signer: %v", err)
256255
}
@@ -267,7 +266,7 @@ func TestBuildV1MerkleTreeLeafForCert(t *testing.T) {
267266
} else if len(rest) > 0 {
268267
t.Fatalf("extra data (%d bytes) on reconstructing MerkleTreeLeaf", len(rest))
269268
}
270-
got, err := buildV1SCT(signer, &leaf)
269+
got, err := sctSigner.Sign(&leaf)
271270
if err != nil {
272271
t.Fatalf("buildV1SCT()=nil,%v; want _,nil", err)
273272
}
@@ -313,7 +312,7 @@ func TestSignV1SCTForPrecertificate(t *testing.T) {
313312
t.Fatalf("failed to set up test precert: %v", err)
314313
}
315314

316-
signer, err := setupSigner(fakeSignature)
315+
sctSigner, err := setupSCTSigner(fakeSignature)
317316
if err != nil {
318317
t.Fatalf("could not create signer: %v", err)
319318
}
@@ -331,7 +330,7 @@ func TestSignV1SCTForPrecertificate(t *testing.T) {
331330
t.Fatalf("extra data (%d bytes) on reconstructing MerkleTreeLeaf", len(rest))
332331
}
333332

334-
got, err := buildV1SCT(signer, &leaf)
333+
got, err := sctSigner.Sign(&leaf)
335334
if err != nil {
336335
t.Fatalf("buildV1SCT()=nil,%v; want _,nil", err)
337336
}
@@ -393,14 +392,14 @@ func TestGetCTLogID(t *testing.T) {
393392

394393
// Creates a fake signer for use in interaction tests.
395394
// It will always return fakeSig when asked to sign something.
396-
func setupSigner(fakeSig []byte) (crypto.Signer, error) {
395+
func setupSCTSigner(fakeSig []byte) (*sctSigner, error) {
397396
block, _ := pem.Decode([]byte(testdata.DemoPublicKey))
398397
key, err := x509.ParsePKIXPublicKey(block.Bytes)
399398
if err != nil {
400399
return nil, err
401400
}
402401

403-
return testdata.NewSignerWithFixedSig(key, fakeSig), nil
402+
return &sctSigner{testdata.NewSignerWithFixedSig(key, fakeSig)}, nil
404403
}
405404

406405
func TestBuildCp(t *testing.T) {

0 commit comments

Comments
 (0)