func (gkms *gpgKeypairMgrSuite) TestGetNotUnique(c *C) { mockGPG := func(prev asserts.GPGRunner, input []byte, args ...string) ([]byte, error) { if args[1] == "--list-secret-keys" { return prev(input, args...) } c.Assert(args[1], Equals, "--export") pk1, err := rsa.GenerateKey(rand.Reader, 512) c.Assert(err, IsNil) pk2, err := rsa.GenerateKey(rand.Reader, 512) c.Assert(err, IsNil) buf := new(bytes.Buffer) err = packet.NewRSAPublicKey(time.Now(), &pk1.PublicKey).Serialize(buf) c.Assert(err, IsNil) err = packet.NewRSAPublicKey(time.Now(), &pk2.PublicKey).Serialize(buf) c.Assert(err, IsNil) return buf.Bytes(), nil } restore := asserts.MockRunGPG(mockGPG) defer restore() _, err := gkms.keypairMgr.Get(assertstest.DevKeyID) c.Check(err, ErrorMatches, `cannot load GPG public key with fingerprint "[A-F0-9]+": cannot select exported public key, found many`) }
// NewEntity returns an Entity that contains a fresh RSA/RSA keypair with a // single identity composed of the given full name, comment and email, any of // which may be empty but must not contain any of "()<>\x00". // If config is nil, sensible defaults will be used. func NewEntity(name, comment, email string, config *packet.Config) (*Entity, error) { currentTime := config.Now() uid := packet.NewUserId(name, comment, email) if uid == nil { return nil, errors.InvalidArgumentError("user id field contained invalid characters") } signingPriv, err := rsa.GenerateKey(config.Random(), defaultRSAKeyBits) if err != nil { return nil, err } encryptingPriv, err := rsa.GenerateKey(config.Random(), defaultRSAKeyBits) if err != nil { return nil, err } e := &Entity{ PrimaryKey: packet.NewRSAPublicKey(currentTime, &signingPriv.PublicKey), PrivateKey: packet.NewRSAPrivateKey(currentTime, signingPriv), Identities: make(map[string]*Identity), } isPrimaryId := true e.Identities[uid.Id] = &Identity{ Name: uid.Name, UserId: uid, SelfSignature: &packet.Signature{ CreationTime: currentTime, SigType: packet.SigTypePositiveCert, PubKeyAlgo: packet.PubKeyAlgoRSA, Hash: config.Hash(), IsPrimaryId: &isPrimaryId, FlagsValid: true, FlagSign: true, FlagCertify: true, IssuerKeyId: &e.PrimaryKey.KeyId, }, } e.Subkeys = make([]Subkey, 1) e.Subkeys[0] = Subkey{ PublicKey: packet.NewRSAPublicKey(currentTime, &encryptingPriv.PublicKey), PrivateKey: packet.NewRSAPrivateKey(currentTime, encryptingPriv), Sig: &packet.Signature{ CreationTime: currentTime, SigType: packet.SigTypeSubkeyBinding, PubKeyAlgo: packet.PubKeyAlgoRSA, Hash: config.Hash(), FlagsValid: true, FlagEncryptStorage: true, FlagEncryptCommunications: true, IssuerKeyId: &e.PrimaryKey.KeyId, }, } e.Subkeys[0].PublicKey.IsSubkey = true e.Subkeys[0].PrivateKey.IsSubkey = true return e, nil }
// RSAPublicKey returns a database useable public key out of rsa.PublicKey. func RSAPublicKey(pubKey *rsa.PublicKey) PublicKey { intPubKey := packet.NewRSAPublicKey(v1FixedTimestamp, pubKey) return newOpenPGPPubKey(intPubKey) }