diff options
Diffstat (limited to 'ffi/lang/python/examples/decrypt.py')
-rw-r--r-- | ffi/lang/python/examples/decrypt.py | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/ffi/lang/python/examples/decrypt.py b/ffi/lang/python/examples/decrypt.py new file mode 100644 index 00000000..c65f151d --- /dev/null +++ b/ffi/lang/python/examples/decrypt.py @@ -0,0 +1,43 @@ +import sys +import os +from getpass import getpass +from enum import Enum, auto +from sequoia.core import Context, NetworkPolicy +from sequoia.openpgp import Tag, PacketParser + +ctx = Context("org.sequoia-pgp.examples", + network_policy=NetworkPolicy.Offline, + ephemeral=True) + +class State(Enum): + Start = auto() + Decrypted = auto() + Deciphered = auto() + Done = auto() + +state = State.Start +algo, key = None, None +pp = PacketParser.open(ctx, sys.argv[1]) +while pp.has_packet: + packet = pp.packet + tag = packet.tag + + if state == State.Start: + if tag == Tag.SKESK: + passphrase = getpass("Enter passphrase to decrypt message: ") + algo, key = packet.match().decrypt(passphrase.encode()) + state = State.Decrypted + elif tag == Tag.PKESK: + sys.stderr.write("Decryption using PKESK not yet supported.\n") + elif state == State.Decrypted: + if tag == Tag.SEIP: + pp.decrypt(algo, key) + state = State.Deciphered + elif state == State.Deciphered: + if tag == Tag.Literal: + body = pp.buffer_unread_content() + os.write(sys.stdout.fileno(), body) + state = State.Done + + pp.recurse() +assert state == State.Done |