// utf-8 text of key-value pairs.
// The body contains a content-type MIME header so the document
// can be used in OpenPGP/MIME (RFC 3156) emails.
-// The format of the key-value pairs are similar to MIME header
+// The format of the key-value pairs is similar to MIME header
// fields: keys and values are separated by ": ", repeated keys
// are not allowed, long values can be split before a space.
//
// -----BEGIN PGP SIGNED MESSAGE-----
// Hash: SHA1
//
-// Content-Type: text/plain.epoint.type; charset=utf-8
+// Content-Type: text/vnd.epoint.type; charset=utf-8
//
// Key: Value1
// Another-Key: Value2
// TODO: trailing space handling in ParseFields
// TODO: fields of notice (last notice, serial, failure notice,..)
// TODO: limits and cert type specific input validation
-// TODO: fix Cert mess
-// TODO: nonce is id, id is even number of hex digits (require only drawer.nonce to be uniq)
+// TODO: hex nonce, uniq nonce vs uniq drawer.nonce
// TODO: denom, issuer from key (key representation: armor?)
import (
type DebitCert struct {
Cert
- Beneficiary string
+ Beneficiary string
}
type CreditCert struct {
Cert
- Drawer string
- DebitCert string
+ Drawer string
+ DebitCert string
}
type BounceCert struct {
References []string
}
+// Common cert part of a debit or credit cert
func ToCert(v interface{}) (cert *Cert, err error) {
cert = new(Cert)
switch x := v.(type) {
return fmt.Sprintf("%040X", h.Sum())
}
-// parse an epoint document without checking the signature and format details
+// Parse an epoint document without checking the signature and format details
func Parse(s []byte) (iv interface{}, c *Signed, err error) {
c, err = ParseSigned(s)
if err != nil {
return
}
-// format and sign an epoint document
+// Format and sign an epoint document
func Format(iv interface{}, key *openpgp.Entity) (s []byte, c *Signed, err error) {
doc, err := FormatStruct(iv)
if err != nil {
return
}
-// verify an epoint document, return the cleaned version as well
-func Verify(c *Signed, key openpgp.KeyRing) (err error) {
+// Verify an epoint document, return the cleaned version as well
+func Verify(c *Signed, keys openpgp.KeyRing) (err error) {
msg := bytes.NewBuffer(c.Body)
sig := bytes.NewBuffer(c.Signature)
- // TODO: verify signature
- _, _ = msg, sig
- // _, err = openpgp.CheckArmoredDetachedSignature(key, msg, sig)
+ _, err = openpgp.CheckArmoredDetachedSignature(keys, msg, sig)
return
}
-// sign body with given secret key
+// Sign body with given secret key
func Sign(body []byte, key *openpgp.Entity) (c *Signed, err error) {
c = new(Signed)
c.Hash = "SHA256"
return
}
+// ParseStruct parses an epoint document and returns a struct representation
func ParseStruct(doc *Document) (iv interface{}, err error) {
switch doc.Type {
case "Draft":
return
}
-// turn a struct into a document
+// FormatStruct turns a struct into a document
func FormatStruct(iv interface{}) (doc *Document, err error) {
v := reflect.ValueOf(iv)
if v.Kind() != reflect.Ptr || v.IsNil() || v.Elem().Kind() != reflect.Struct {
return
}
+// ParseFields parses a key value sequence into a fields map
func ParseFields(s []byte) (fields map[string]string, rest []byte, err error) {
rest = s
fields = make(map[string]string)