X-Git-Url: http://nsz.repo.hu/git/?p=epoint;a=blobdiff_plain;f=pkg%2Fkey%2Fkey.go;fp=pkg%2Fkey%2Fkey.go;h=a32c9984cdc6578a1eb5a4bc0b6ee9717d0b3c19;hp=19537d6d4c2cd1254d00c6ac9f8f20bd9ae7d1cb;hb=d24526e0d767f7b45956d362180d2684e1e17294;hpb=b9595460ff43dfd8cf07fe56f9908583456dc9c6 diff --git a/pkg/key/key.go b/pkg/key/key.go index 19537d6..a32c998 100644 --- a/pkg/key/key.go +++ b/pkg/key/key.go @@ -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", "", "")