1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
|
import time
import random
import pytest
import rnp
@pytest.fixture
def rpgp():
lib = rnp.Rnp()
lib.load_keys(rnp.Input.from_path("tests/data/keyrings/gpg/pubring.gpg"), "GPG")
lib.load_keys(rnp.Input.from_path("tests/data/keyrings/gpg/secring.gpg"), "GPG")
return lib
@pytest.fixture
def key(rpgp):
key = rpgp.find_key_by_id("7bc6709b15c23a4a")
key.unlock("password")
return key
def test_simple_sign(rpgp, key):
signature = rpgp.sign(key, rnp.Input.from_bytes(b"test data"))
assert isinstance(signature, bytes)
assert len(signature) >= 1
rpgp.verify(rnp.Input.from_bytes(signature))
outp = rnp.Output.to_bytes()
rpgp.verify(rnp.Input.from_bytes(signature), outp)
assert outp.bytes() == b"test data"
def test_simple_sign_with_options(rpgp, key):
halg = random.choice(rnp.features("hash algorithm"))
calg = random.choice(
[
calg
for calg in rnp.features("compression algorithm")
if calg != "Uncompressed"
]
)
signature = rpgp.sign(
key,
rnp.Input.from_bytes(b"test data"),
True,
halg,
(calg, 1),
int(time.time()),
60 * 10,
)
assert isinstance(signature, bytes)
assert len(signature) >= 1
assert signature.startswith(b"-----BEGIN PGP MESSAGE-----\r\n")
rpgp.verify(rnp.Input.from_bytes(signature))
op = rnp.Verify.start(rpgp, rnp.Input.from_bytes(signature))
op.finish()
assert len(list(op.signatures())) == 1
sig = next(op.signatures())
if rnp.check('have-rnp-signature-get-expiration'):
assert sig.lifetime() == 60 * 10
assert sig.status() == 0
def test_simple_sign_cleartext(rpgp, key):
key2 = rpgp.find_key_by_fingerprint("be1c4ab951f4c2f6b604c7f82fcadf05ffa501bb")
key2.unlock("password")
signature = rpgp.sign_cleartext([key, key2], rnp.Input.from_bytes(b"some data"))
assert signature.startswith(b"-----BEGIN PGP SIGNED MESSAGE-----\r\n")
pkts = rnp.parse(rnp.Input.from_bytes(signature))
assert [pkt["header"]["tag.str"] for pkt in pkts] == ["Signature", "Signature"]
assert {
subpkt.get("issuer keyid")
for pkt in pkts
for subpkt in pkt["subpackets"]
if "issuer keyid" in subpkt
} == {"7bc6709b15c23a4a", "2fcadf05ffa501bb"}
rpgp.verify(rnp.Input.from_bytes(signature))
def test_simple_sign_detached(rpgp, key):
signature = rpgp.sign_detached(key, rnp.Input.from_bytes(b"test"))
rpgp.verify_detached(rnp.Input.from_bytes(b"test"), rnp.Input.from_bytes(signature))
with pytest.raises(rnp.RnpException):
rpgp.verify_detached(
rnp.Input.from_bytes(b"test2"), rnp.Input.from_bytes(signature)
)
signature = bytearray(signature)
signature[int(len(signature) / 2)] ^= 0xFF
with pytest.raises(rnp.RnpException):
rpgp.verify_detached(
rnp.Input.from_bytes(b"test"), rnp.Input.from_bytes(signature)
)
|