various fixes to make testing possible
[epoint] / pkg / key / key.go
index 19537d6..a32c998 100644 (file)
@@ -20,6 +20,7 @@ import (
        "crypto"
        "crypto/dsa"
        "crypto/openpgp"
+       "crypto/openpgp/armor"
        "crypto/openpgp/packet"
        "crypto/rand"
        "crypto/sha1"
@@ -120,14 +121,61 @@ func Parse(d []byte) (e *openpgp.Entity, err error) {
        return
 }
 
+// Prepare self signatures of private key
+func SelfSign(e *openpgp.Entity) (err error) {
+       // TODO: maybe e.Serialize should do this internally
+       if e.PrivateKey == nil {
+               err = fmt.Errorf("SelfSign: not a private key")
+               return
+       }
+       for _, ident := range e.Identities {
+               err = ident.SelfSignature.SignUserId(rand.Reader, ident.UserId.Id, e.PrimaryKey, e.PrivateKey)
+               if err != nil {
+                       return
+               }
+       }
+       for _, subkey := range e.Subkeys {
+               err = subkey.Sig.SignKey(rand.Reader, subkey.PublicKey, e.PrivateKey)
+               if err != nil {
+                       return
+               }
+       }
+       return
+}
+
+// Format into an armored public key
+func Format(e *openpgp.Entity) (d []byte, err error) {
+       b := new(bytes.Buffer)
+       w, err := armor.Encode(b, openpgp.PublicKeyType, nil)
+       if err != nil {
+               return
+       }
+       err = e.Serialize(w)
+       if err != nil {
+               return
+       }
+       err = w.Close()
+       if err != nil {
+               return
+       }
+       _, err = b.Write([]byte{'\n'})
+       if err != nil {
+               return
+       }
+       d = b.Bytes()
+       return
+}
+
 // Issuer generates a key for obligation issuer clients from random seed r
 func Issuer(r []byte, denomination string) (e *openpgp.Entity, err error) {
-       return New(DsaKey(r), time.Unix(0,0), "Issuer", denomination, "")
+       return New(DsaKey(r), time.Unix(0, 0), "Issuer", denomination, "")
 }
+
 // Holder generates a key for obligation holder clients from random seed r
 func Holder(r []byte, issuer, denomination string) (e *openpgp.Entity, err error) {
-       return New(DsaKey(r), time.Unix(0,0), "Holder of "+issuer, denomination, "")
+       return New(DsaKey(r), time.Unix(0, 0), "Holder of "+issuer, denomination, "")
 }
+
 // Server generates a key for the server from random seed r
 func Server(r []byte) (e *openpgp.Entity, err error) {
        return New(DsaKey(r), time.Now(), "Server", "", "")