From d752d967335e1418f27e03e0389b01178b28f232 Mon Sep 17 00:00:00 2001 From: Rasmus Dahlberg Date: Wed, 28 Oct 2020 13:38:39 +0100 Subject: added signed tree head and get-sth code path --- type.go | 49 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) (limited to 'type.go') diff --git a/type.go b/type.go index 726b215..be2571e 100644 --- a/type.go +++ b/type.go @@ -5,6 +5,7 @@ import ( "crypto/x509" "encoding/base64" + "time" "github.com/google/certificate-transparency-go/tls" "github.com/google/trillian" @@ -25,10 +26,24 @@ const ( // StItem references a versioned item based on a given format specifier. type StItem struct { Format StFormat `tls:"maxval:65535"` + SignedTreeHeadV1 *SignedTreeHeadV1 `tls:"selector:Format,val:1"` SignedDebugInfoV1 *SignedDebugInfoV1 `tls:"selector:Format,val:2"` + // TODO: add consistency proof InclusionProofV1 *InclusionProofV1 `tls:"selector:Format,val:4"` ChecksumV1 *ChecksumV1 `tls:"selector:Format,val:5"` - // TODO: add more items +} + +type SignedTreeHeadV1 struct { + LogId []byte `tls:"minlen:2,maxlen:127"` + TreeHead TreeHeadV1 `tls:minlen:0, maxlen:65535` // what should maxlen be? + Signature []byte `tls:"minlen:0,maxlen:65535"` +} + +type TreeHeadV1 struct { + Timestamp uint64 + TreeSize uint64 + RootHash NodeHash `tls:minlen:32,maxlen:255` + Extension []byte `tls:"minlen:0,maxlen:65535"` } // ChecksumV1 associates a package name with an arbitrary checksum value @@ -60,6 +75,28 @@ type NodeHash struct { Data []byte `tls:"minlen:32,maxlen:255"` } +func NewSignedTreeHeadV1(th TreeHeadV1, logId, signature []byte) StItem { + return StItem{ + Format: StFormatSignedTreeHeadV1, + SignedTreeHeadV1: &SignedTreeHeadV1{ + LogId: logId, + TreeHead: th, + Signature: signature, + }, + } +} + +func NewTreeHeadV1(timestamp, treeSize uint64, rootHash []byte) TreeHeadV1 { + return TreeHeadV1{ + Timestamp: timestamp, + TreeSize: treeSize, + RootHash: NodeHash{ + Data: rootHash, + }, + Extension: nil, + } +} + func NewSignedDebugInfoV1(logId, message, signature []byte) StItem { return StItem{ Format: StFormatSignedDebugInfoV1, @@ -127,11 +164,21 @@ func (i StItem) String() string { return fmt.Sprintf("Format(%s): %s", i.Format, *i.InclusionProofV1) case StFormatSignedDebugInfoV1: return fmt.Sprintf("Format(%s): %s", i.Format, *i.SignedDebugInfoV1) + case StFormatSignedTreeHeadV1: + return fmt.Sprintf("Format(%s): %s", i.Format, *i.SignedTreeHeadV1) default: return fmt.Sprintf("unknown StItem: %s", i.Format) } } +func (th TreeHeadV1) String() string { + return fmt.Sprintf("Timestamp(%s) TreeSize(%d) RootHash(%s)", time.Unix(int64(th.Timestamp/1000), 0), th.TreeSize, base64.StdEncoding.EncodeToString(th.RootHash.Data)) +} + +func (i SignedTreeHeadV1) String() string { + return fmt.Sprintf("LogId(%s) TreeHead(%s) Signature(%s)", base64.StdEncoding.EncodeToString(i.LogId), i.TreeHead, base64.StdEncoding.EncodeToString(i.Signature)) +} + func (i SignedDebugInfoV1) String() string { return fmt.Sprintf("LogId(%s) Message(%s) Signature(%s)", base64.StdEncoding.EncodeToString(i.LogId), string(i.Message), base64.StdEncoding.EncodeToString(i.Signature)) } -- cgit v1.2.3