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) {
func Id(c *Signed) string {
h := sha1.New()
h.Write(c.Body)
- return fmt.Sprintf("%040X", h.Sum())
+ return fmt.Sprintf("%040X", h.Sum(nil))
}
-// 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"
fv.SetString(val)
case "int":
var val int64
- val, err = strconv.Atoi64(s)
+ val, err = strconv.ParseInt(s, 10, 64)
fv.SetInt(val)
case "date":
var val int64
return
}
+// ParseStruct parses an epoint document and returns a struct representation
func ParseStruct(doc *Document) (iv interface{}, err error) {
switch doc.Type {
case "Draft":
case "text":
val = formatString(fv.String())
case "int":
- val = strconv.Itoa64(fv.Int())
+ val = strconv.FormatInt(fv.Int(), 10)
case "date":
val = formatDate(fv.Int())
case "ids":
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)
if err != nil {
return 0, err
}
- return t.Seconds(), nil
+ return t.Unix(), nil
}
func formatDate(i int64) string {
- return time.SecondsToUTC(i).Format(time.RFC3339)
+ return time.Unix(i,0).UTC().Format(time.RFC3339)
}
func getLine(data []byte) (line, rest []byte) {