package main
import (
- "epoint/dsakey"
"crypto/openpgp"
+ "epoint/dsakey"
+ "fmt"
"log"
"os"
- "time"
)
-const usage = "usage: ./genkey name comment email seckeyfile pubkeyfile < seed"
+const usage = "usage: ./genkey [issuer] denomination seckeyfile pubkeyfile < seed > fingerprint"
func serialize(e *openpgp.Entity, sk, pk string) (err error) {
f, err := os.Create(sk)
}
func main() {
- if len(os.Args) != 6 {
+ isIssuer := false
+ issuer := ""
+ denom := ""
+ sk := ""
+ pk := ""
+ if len(os.Args) == 4 {
+ isIssuer = true
+ denom = os.Args[1]
+ sk = os.Args[2]
+ pk = os.Args[3]
+ } else if len(os.Args) == 5 {
+ issuer = os.Args[1]
+ denom = os.Args[2]
+ sk = os.Args[3]
+ pk = os.Args[4]
+ } else {
log.Fatal(usage)
}
b := make([]byte, 1000)
log.Print(err)
log.Fatal(usage)
}
- key := dsakey.PrivKey(b[:n])
- e, err := dsakey.NewEntity(key, time.Seconds(), os.Args[1], os.Args[2], os.Args[3])
+ var e *openpgp.Entity
+ if isIssuer {
+ e, err = dsakey.NewIssuerEntity(b[:n], denom)
+ } else {
+ e, err = dsakey.NewHolderEntity(b[:n], issuer, denom)
+ }
if err != nil {
log.Fatal(err)
}
- err = serialize(e, os.Args[4], os.Args[5])
+ err = serialize(e, sk, pk)
if err != nil {
log.Fatal(err)
}
+ fmt.Fprintf(os.Stdout, "%X\n", e.PrimaryKey.Fingerprint)
}
package dsakey
import (
- "crypto/sha1"
+ "crypto"
"crypto/dsa"
"crypto/openpgp"
"crypto/openpgp/packet"
"crypto/rand"
- "crypto"
+ "crypto/sha1"
"fmt"
"io"
"math/big"
func PrivKey(r []byte) *dsa.PrivateKey {
priv := new(dsa.PrivateKey)
- priv.Parameters.P,_ = new(big.Int).SetString(P, 16)
- priv.Parameters.Q,_ = new(big.Int).SetString(Q, 16)
- priv.Parameters.G,_ = new(big.Int).SetString(G, 16)
+ priv.Parameters.P, _ = new(big.Int).SetString(P, 16)
+ priv.Parameters.Q, _ = new(big.Int).SetString(Q, 16)
+ priv.Parameters.G, _ = new(big.Int).SetString(G, 16)
// q > 2^159 prime
// x = sha1(r)
IssuerKeyId: &e.PrimaryKey.KeyId,
},
}
-/*
- e.Subkeys = make([]Subkey, 1)
- e.Subkeys[0] = Subkey{
- PublicKey: packet.NewRSAPublicKey(t, &encryptingPriv.PublicKey, true),
- PrivateKey: packet.NewRSAPrivateKey(t, encryptingPriv, true),
- Sig: &packet.Signature{
- CreationTime: t,
- SigType: packet.SigTypeSubkeyBinding,
- PubKeyAlgo: packet.PubKeyAlgoRSA,
- Hash: crypto.SHA256,
- FlagsValid: true,
- FlagEncryptStorage: true,
- FlagEncryptCommunications: true,
- IssuerKeyId: &e.PrimaryKey.KeyId,
- },
- }
-*/
+ /*
+ e.Subkeys = make([]Subkey, 1)
+ e.Subkeys[0] = Subkey{
+ PublicKey: packet.NewRSAPublicKey(t, &encryptingPriv.PublicKey, true),
+ PrivateKey: packet.NewRSAPrivateKey(t, encryptingPriv, true),
+ Sig: &packet.Signature{
+ CreationTime: t,
+ SigType: packet.SigTypeSubkeyBinding,
+ PubKeyAlgo: packet.PubKeyAlgoRSA,
+ Hash: crypto.SHA256,
+ FlagsValid: true,
+ FlagEncryptStorage: true,
+ FlagEncryptCommunications: true,
+ IssuerKeyId: &e.PrimaryKey.KeyId,
+ },
+ }
+ */
return
}
}
// simple key generation for obligation holder clients
func NewHolderEntity(r []byte, issuer, denomination string) (e *openpgp.Entity, err error) {
- return NewEntity(PrivKey(r), 0, "Holder of " + issuer, denomination, "")
+ return NewEntity(PrivKey(r), 0, "Holder of "+issuer, denomination, "")
}
// check the issuer and denomination associated with the given pgp key