aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--type.go76
-rw-r--r--type_test.go56
2 files changed, 131 insertions, 1 deletions
diff --git a/type.go b/type.go
index 140a698..e9b5ef2 100644
--- a/type.go
+++ b/type.go
@@ -1,3 +1,77 @@
package stfe
-// Leaf definition and such goes here
+import (
+ "fmt"
+
+ "encoding/base64"
+
+ "github.com/google/certificate-transparency-go/tls"
+)
+
+// StFormat defines a particular StItem type that is versioned
+type StFormat tls.Enum
+
+const (
+ StFormatReserved StFormat = 0
+ StFormatSignedTreeHeadV1 StFormat = 1
+ StFormatSignedDebugInfoV1 StFormat = 2
+ StFormatConsistencyProofV1 StFormat = 3
+ StFormatInclusionProofV1 StFormat = 4
+ StFormatChecksumV1 = 5
+)
+
+func (f StFormat) String() string {
+ switch f {
+ case StFormatReserved:
+ return "reserved"
+ case StFormatSignedTreeHeadV1:
+ return "signed_tree_head_v1"
+ case StFormatSignedDebugInfoV1:
+ return "signed_debug_info_v1"
+ case StFormatConsistencyProofV1:
+ return "consistency_proof_v1"
+ case StFormatInclusionProofV1:
+ return "inclusion_proof_v1"
+ case StFormatChecksumV1:
+ return "checksum_v1"
+ default:
+ return fmt.Sprintf("Unknown StFormat: %d", f)
+ }
+}
+
+// StItem references a versioned item based on a given format specifier.
+type StItem struct {
+ Format StFormat `tls:"maxval:65535"`
+ ChecksumV1 *ChecksumV1 `tls:"selector:Format,val:5"`
+ // TODO: add more items
+}
+
+func (i StItem) String() string {
+ switch i.Format {
+ case StFormatChecksumV1:
+ return fmt.Sprintf("%s %s", i.Format, *i.ChecksumV1)
+ default:
+ return fmt.Sprintf("unknown StItem: %s", i.Format)
+ }
+}
+
+// ChecksumV1 associates a package name with an arbitrary checksum value
+type ChecksumV1 struct {
+ Package []byte `tls:"minlen:0,maxlen:255"`
+ Checksum []byte `tls:"minlen:32,maxlen:255"`
+}
+
+// NewChecksumV1 creates a new StItem of type checksum_v1
+func NewChecksumV1(name string, checksum []byte) (StItem, error) {
+ return StItem{
+ Format: StFormatChecksumV1,
+ ChecksumV1: &ChecksumV1{
+ Package: []byte(name),
+ Checksum: checksum,
+ },
+ }, nil // TODO: error handling
+}
+
+func (i ChecksumV1) String() string {
+ return fmt.Sprintf("%v %v", string(i.Package), base64.StdEncoding.EncodeToString(i.Checksum))
+}
diff --git a/type_test.go b/type_test.go
new file mode 100644
index 0000000..bcd66e6
--- /dev/null
+++ b/type_test.go
@@ -0,0 +1,56 @@
+package stfe
+
+import (
+ "fmt"
+
+ "crypto/sha256"
+
+ "github.com/google/certificate-transparency-go/tls"
+)
+
+func ExampleNewChecksumV1() {
+ name := "foobar-1.2.3"
+ hasher := sha256.New()
+ hasher.Write([]byte(name))
+ checksum := hasher.Sum(nil) // hash of package name
+
+ item, err := NewChecksumV1(name, checksum)
+ if err != nil {
+ fmt.Printf("failed creating checksum item: %v", err)
+ return
+ }
+ fmt.Printf("%s\n", item)
+ // Output: checksum_v1 foobar-1.2.3 UOeWe84malBvj2FLtQlr66WA0gUEa5GPR9I7LsYm114=
+}
+
+func ExampleMarshalChecksumV1() {
+ item, err := NewChecksumV1("foobar-1.2.3", make([]byte, 32))
+ if err != nil {
+ fmt.Printf("failed creating checksum item: %v", err)
+ return
+ }
+
+ b, err := tls.Marshal(item)
+ if err != nil {
+ fmt.Printf("tls.Marshal() failed: %v", err)
+ return
+ }
+ fmt.Printf("%v\n", b)
+ // Output: [0 5 12 102 111 111 98 97 114 45 49 46 50 46 51 32 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
+}
+
+func ExampleUnmarshalChecksumV1() {
+ b := []byte{0, 5, 12, 102, 111, 111, 98, 97, 114, 45, 49, 46, 50, 46, 51, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
+
+ var item StItem
+ extra, err := tls.Unmarshal(b, &item)
+ if err != nil {
+ fmt.Printf("tls.Unmarshal() failed: %v (%v)", err, extra)
+ return
+ } else if len(extra) > 0 {
+ fmt.Printf("tls.Unmarshal() found extra data: %v", extra)
+ return
+ }
+ fmt.Printf("%v\n", item)
+ // Output: checksum_v1 foobar-1.2.3 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
+}