2019-05-14 16:08:25 +00:00
|
|
|
package crypto
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"regexp"
|
2019-05-14 18:05:01 +02:00
|
|
|
"strings"
|
2019-05-14 16:08:25 +00:00
|
|
|
"testing"
|
|
|
|
|
|
2019-06-03 17:00:01 +02:00
|
|
|
"github.com/ProtonMail/gopenpgp/constants"
|
2019-05-14 16:08:25 +00:00
|
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
|
)
|
|
|
|
|
|
2019-06-03 17:00:01 +02:00
|
|
|
const signedPlainText = "Signed message\n"
|
2019-05-14 16:08:25 +00:00
|
|
|
const testTime = 1557754627 // 2019-05-13T13:37:07+00:00
|
|
|
|
|
|
|
|
|
|
var signingKeyRing *KeyRing
|
2019-06-03 17:00:01 +02:00
|
|
|
var textSignature, binSignature *PGPSignature
|
|
|
|
|
var message *PlainMessage
|
|
|
|
|
var signatureTest = regexp.MustCompile("(?s)^-----BEGIN PGP SIGNATURE-----.*-----END PGP SIGNATURE-----$")
|
|
|
|
|
var signedMessageTest = regexp.MustCompile(
|
|
|
|
|
"(?s)^-----BEGIN PGP SIGNED MESSAGE-----.*-----BEGIN PGP SIGNATURE-----.*-----END PGP SIGNATURE-----$")
|
2019-05-14 16:08:25 +00:00
|
|
|
|
|
|
|
|
func TestSignTextDetached(t *testing.T) {
|
2019-06-03 17:00:01 +02:00
|
|
|
var err error
|
2019-05-14 16:08:25 +00:00
|
|
|
|
2019-06-03 17:00:01 +02:00
|
|
|
signingKeyRing, err = ReadArmoredKeyRing(strings.NewReader(readTestFile("keyring_privateKey", false)))
|
2019-05-14 16:08:25 +00:00
|
|
|
if err != nil {
|
2019-06-03 17:00:01 +02:00
|
|
|
t.Fatal("Cannot read private key:", err)
|
2019-05-14 16:08:25 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Password defined in keyring_test
|
2019-06-03 17:00:01 +02:00
|
|
|
err = signingKeyRing.UnlockWithPassphrase(testMailboxPassword)
|
2019-05-14 16:08:25 +00:00
|
|
|
if err != nil {
|
|
|
|
|
t.Fatal("Cannot decrypt private key:", err)
|
|
|
|
|
}
|
|
|
|
|
|
2019-06-03 17:00:01 +02:00
|
|
|
message = NewPlainMessageFromString(signedPlainText)
|
|
|
|
|
textSignature, err = signingKeyRing.SignDetached(message)
|
2019-05-14 16:08:25 +00:00
|
|
|
if err != nil {
|
2019-06-03 17:00:01 +02:00
|
|
|
t.Fatal("Cannot generate signature:", err)
|
2019-05-14 16:08:25 +00:00
|
|
|
}
|
|
|
|
|
|
2019-06-03 17:00:01 +02:00
|
|
|
armoredSignature, err := textSignature.GetArmored()
|
2019-05-14 16:08:25 +00:00
|
|
|
if err != nil {
|
2019-06-03 17:00:01 +02:00
|
|
|
t.Fatal("Cannot armor signature:", err)
|
2019-05-14 16:08:25 +00:00
|
|
|
}
|
|
|
|
|
|
2019-06-03 17:00:01 +02:00
|
|
|
assert.Regexp(t, signatureTest, armoredSignature)
|
2019-05-14 16:08:25 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestVerifyTextDetachedSig(t *testing.T) {
|
2019-07-02 07:36:02 -07:00
|
|
|
verificationError := signingKeyRing.VerifyDetached(message, textSignature, testTime)
|
|
|
|
|
if verificationError != nil {
|
2019-05-14 16:08:25 +00:00
|
|
|
t.Fatal("Cannot verify plaintext signature:", err)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestVerifyTextDetachedSigWrong(t *testing.T) {
|
2019-06-03 17:00:01 +02:00
|
|
|
fakeMessage := NewPlainMessageFromString("wrong text")
|
2019-07-02 07:36:02 -07:00
|
|
|
verificationError := signingKeyRing.VerifyDetached(fakeMessage, textSignature, testTime)
|
|
|
|
|
|
|
|
|
|
assert.EqualError(t, verificationError, "Signature Verification Error: Invalid signature")
|
2019-05-14 16:08:25 +00:00
|
|
|
|
2019-07-02 07:36:02 -07:00
|
|
|
err, _ := verificationError.(SignatureVerificationError)
|
|
|
|
|
assert.Exactly(t, constants.SIGNATURE_FAILED, err.Status)
|
2019-06-03 17:00:01 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestSignBinDetached(t *testing.T) {
|
|
|
|
|
var err error
|
|
|
|
|
|
|
|
|
|
binSignature, err = signingKeyRing.SignDetached(NewPlainMessage([]byte(signedPlainText)))
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatal("Cannot generate signature:", err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
armoredSignature, err := binSignature.GetArmored()
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatal("Cannot armor signature:", err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
assert.Regexp(t, signatureTest, armoredSignature)
|
2019-05-14 16:08:25 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestVerifyBinDetachedSig(t *testing.T) {
|
2019-07-02 07:36:02 -07:00
|
|
|
verificationError := signingKeyRing.VerifyDetached(message, binSignature, testTime)
|
|
|
|
|
if verificationError != nil {
|
2019-05-14 16:08:25 +00:00
|
|
|
t.Fatal("Cannot verify binary signature:", err)
|
|
|
|
|
}
|
|
|
|
|
}
|