"crypto"
"crypto/dsa"
"crypto/openpgp"
+ "crypto/openpgp/armor"
"crypto/openpgp/packet"
"crypto/rand"
"crypto/sha1"
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", "", "")