passforios-gopenpgp/crypto/key_test.go

158 lines
4.2 KiB
Go
Raw Normal View History

2019-05-09 20:12:28 +02:00
package crypto
import (
2019-05-13 14:06:54 +00:00
"encoding/base64"
2019-05-09 20:12:28 +02:00
"regexp"
2019-05-13 14:06:54 +00:00
"strings"
2019-05-09 20:12:28 +02:00
"testing"
2019-05-13 14:07:18 +02:00
"github.com/ProtonMail/gopenpgp/constants"
"github.com/stretchr/testify/assert"
2019-05-09 20:12:28 +02:00
)
const name = "richard.stallman"
2019-05-13 14:06:54 +00:00
const domain = "protonmail.ch"
2019-05-09 20:12:28 +02:00
2019-05-13 14:06:54 +00:00
var passphrase = "I love GNU"
var rsaKey, ecKey, rsaPublicKey, ecPublicKey string
2019-05-09 20:12:28 +02:00
2019-05-13 14:06:54 +00:00
var (
rsaPrivateKeyRing *KeyRing
ecPrivateKeyRing *KeyRing
rsaPublicKeyRing *KeyRing
ecPublicKeyRing *KeyRing
)
func TestGenerateKeys(t *testing.T) {
2019-05-14 18:05:01 +02:00
rsaKey, err = pgp.GenerateKey(name, domain, passphrase, "rsa", 1024)
2019-05-13 14:06:54 +00:00
if err != nil {
t.Fatal("Cannot generate RSA key:", err)
}
2019-05-14 18:05:01 +02:00
ecKey, err = pgp.GenerateKey(name, domain, passphrase, "x25519", 256)
2019-05-09 20:12:28 +02:00
if err != nil {
2019-05-13 14:06:54 +00:00
t.Fatal("Cannot generate EC key:", err)
2019-05-09 20:12:28 +02:00
}
rTest := regexp.MustCompile("(?s)^-----BEGIN PGP PRIVATE KEY BLOCK-----.*-----END PGP PRIVATE KEY BLOCK-----$")
assert.Regexp(t, rTest, rsaKey)
2019-05-13 14:06:54 +00:00
assert.Regexp(t, rTest, ecKey)
2019-05-09 20:12:28 +02:00
}
2019-05-13 14:06:54 +00:00
func TestGenerateKeyRings(t *testing.T) {
rsaPrivateKeyRing, err = ReadArmoredKeyRing(strings.NewReader(rsaKey))
2019-05-09 20:12:28 +02:00
if err != nil {
2019-05-13 14:06:54 +00:00
t.Fatal("Cannot read RSA key:", err)
2019-05-09 20:12:28 +02:00
}
rsaPublicKey, err = rsaPrivateKeyRing.GetArmoredPublicKey()
2019-05-13 14:06:54 +00:00
if err != nil {
t.Fatal("Cannot extract RSA public key:", err)
}
rsaPublicKeyRing, err = ReadArmoredKeyRing(strings.NewReader(rsaPublicKey))
2019-05-13 14:06:54 +00:00
if err != nil {
t.Fatal("Cannot read RSA public key:", err)
}
err = rsaPrivateKeyRing.Unlock([]byte(passphrase))
if err != nil {
t.Fatal("Cannot decrypt RSA key:", err)
}
ecPrivateKeyRing, err = ReadArmoredKeyRing(strings.NewReader(ecKey))
2019-05-13 14:06:54 +00:00
if err != nil {
t.Fatal("Cannot read EC key:", err)
}
ecPublicKey, err = ecPrivateKeyRing.GetArmoredPublicKey()
2019-05-13 14:06:54 +00:00
if err != nil {
t.Fatal("Cannot extract EC public key:", err)
}
ecPublicKeyRing, err = ReadArmoredKeyRing(strings.NewReader(ecPublicKey))
2019-05-13 14:06:54 +00:00
if err != nil {
t.Fatal("Cannot read EC public key:", err)
}
err = ecPrivateKeyRing.Unlock([]byte(passphrase))
if err != nil {
t.Fatal("Cannot decrypt EC key:", err)
}
}
func TestEncryptDecryptKeys(t *testing.T) {
var pass, _ = base64.StdEncoding.DecodeString("H2CAwzpdexjxXucVYMERDiAc/td8aGPrr6ZhfMnZlLI=")
var testSymmetricKey = &SymmetricKey{
Key: pass,
Algo: constants.AES256,
2019-05-13 14:06:54 +00:00
}
packet, err := rsaPublicKeyRing.EncryptKey(testSymmetricKey)
2019-05-13 14:06:54 +00:00
if err != nil {
t.Fatal("Cannot encrypt keypacket with RSA keyring", err)
}
rsaTestSymmetricKey, err := DecryptAttKey(rsaPrivateKeyRing, packet)
if err != nil {
t.Fatal("Cannot decrypt keypacket with RSA keyring", err)
}
assert.Exactly(t, testSymmetricKey, rsaTestSymmetricKey)
packet, err = ecPublicKeyRing.EncryptKey(testSymmetricKey)
2019-05-13 14:06:54 +00:00
if err != nil {
t.Fatal("Cannot encrypt keypacket with EC keyring", err)
}
ecTestSymmetricKey, err := DecryptAttKey(ecPrivateKeyRing, packet)
if err != nil {
t.Fatal("Cannot decrypt keypacket with EC keyring", err)
}
assert.Exactly(t, testSymmetricKey, ecTestSymmetricKey)
}
func TestUpdatePrivateKeysPassphrase(t *testing.T) {
newPassphrase := "I like GNU"
2019-05-14 18:05:01 +02:00
rsaKey, err = pgp.UpdatePrivateKeyPassphrase(rsaKey, passphrase, newPassphrase)
2019-05-13 14:06:54 +00:00
if err != nil {
t.Fatal("Error in changing RSA key's passphrase:", err)
}
2019-05-14 18:05:01 +02:00
ecKey, err = pgp.UpdatePrivateKeyPassphrase(ecKey, passphrase, newPassphrase)
2019-05-13 14:06:54 +00:00
if err != nil {
t.Fatal("Error in changing EC key's passphrase:", err)
}
passphrase = newPassphrase
}
2019-05-14 16:08:25 +00:00
func ExampleCheckKeys() {
2019-05-14 18:05:01 +02:00
_, _ = pgp.CheckKey(readTestFile("keyring_publicKey", false))
2019-05-13 14:06:54 +00:00
// Output:
// SubKey:37e4bcf09b36e34012d10c0247dc67b5cb8267f6
// PrimaryKey:6e8ba229b0cccaf6962f97953eb6259edf21df24
}
func TestIsKeyExpired(t *testing.T) {
2019-05-14 18:05:01 +02:00
rsaRes, err := pgp.IsKeyExpired(rsaPublicKey)
2019-05-13 14:06:54 +00:00
if err != nil {
t.Fatal("Error in checking expiration of RSA key:", err)
}
2019-05-14 18:05:01 +02:00
ecRes, err := pgp.IsKeyExpired(ecPublicKey)
2019-05-13 14:06:54 +00:00
if err != nil {
t.Fatal("Error in checking expiration of EC key:", err)
}
assert.Exactly(t, false, rsaRes)
assert.Exactly(t, false, ecRes)
2019-05-14 18:05:01 +02:00
pgp.UpdateTime(1557754627) // 2019-05-13T13:37:07+00:00
2019-05-14 18:05:01 +02:00
expRes, expErr := pgp.IsKeyExpired(readTestFile("key_expiredKey", false))
futureRes, futureErr := pgp.IsKeyExpired(readTestFile("key_futureKey", false))
assert.Exactly(t, true, expRes)
assert.Exactly(t, true, futureRes)
assert.EqualError(t, expErr, "keys expired")
assert.EqualError(t, futureErr, "keys expired")
2019-05-09 20:12:28 +02:00
}