diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 71b9407..d0cd4d5 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,18 +1,22 @@ # See https://pre-commit.com/ for usage and config +fail_fast: true repos: # https://github.com/pre-commit/pre-commit-hooks/releases/tag/v4.3.0 - repo: https://github.com/pre-commit/pre-commit-hooks rev: v4.4.0 hooks: + - id: check-ast - id: trailing-whitespace - id: end-of-file-fixer - id: mixed-line-ending args: [ --fix, auto ] + - id: check-json - id: check-yaml + - id: check-toml - id: debug-statements - id: name-tests-test args: [ --pytest-test-first ] - - id: detect-private-key + - id: check-case-conflict - repo: local hooks: - id: isort diff --git a/Pipfile b/Pipfile index 585cc97..27368c7 100644 --- a/Pipfile +++ b/Pipfile @@ -40,6 +40,8 @@ python-stdnum = "==1.18" tenacity = "==8.2.2" # Python plotting package. https://pypi.org/project/matplotlib/ matplotlib = "==3.7.1" +# Pretty Good Privacy for Python. https://github.com/SecurityInnovation/PGPy +pgpy = "==0.6.0" [dev-packages] # Black is the uncompromising Python code formatter. By using it, you agree to cede control over minutiae of diff --git a/Pipfile.lock b/Pipfile.lock index b75178b..7e5b7fb 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "07f047c5dd5f7c9ba9d36e2c1c489da488c2c2bef0e5a2cad7909c93f08efe83" + "sha256": "7122e2779651121548ba8ba1b23499a556cc160d32f87df218eaaa16f3c11370" }, "pipfile-spec": 6, "requires": { @@ -24,6 +24,75 @@ "index": "pypi", "version": "==1.2.3" }, + "cffi": { + "hashes": [ + "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5", + "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef", + "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104", + "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426", + "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405", + "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375", + "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a", + "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e", + "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc", + "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf", + "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185", + "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497", + "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3", + "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35", + "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c", + "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83", + "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21", + "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca", + "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984", + "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac", + "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd", + "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee", + "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a", + "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2", + "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192", + "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7", + "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585", + "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f", + "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e", + "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27", + "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b", + "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e", + "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e", + "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d", + "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c", + "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415", + "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82", + "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02", + "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314", + "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325", + "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c", + "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3", + "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914", + "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045", + "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d", + "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9", + "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5", + "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2", + "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c", + "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3", + "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2", + "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8", + "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d", + "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d", + "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9", + "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162", + "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76", + "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4", + "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e", + "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9", + "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6", + "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b", + "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01", + "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0" + ], + "version": "==1.15.1" + }, "colorama": { "hashes": [ "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", @@ -93,6 +162,31 @@ "markers": "python_version >= '3.8'", "version": "==1.0.7" }, + "cryptography": { + "hashes": [ + "sha256:0a4e3406cfed6b1f6d6e87ed243363652b2586b2d917b0609ca4f97072994405", + "sha256:1e0af458515d5e4028aad75f3bb3fe7a31e46ad920648cd59b64d3da842e4356", + "sha256:2803f2f8b1e95f614419926c7e6f55d828afc614ca5ed61543877ae668cc3472", + "sha256:28d63d75bf7ae4045b10de5413fb1d6338616e79015999ad9cf6fc538f772d41", + "sha256:32057d3d0ab7d4453778367ca43e99ddb711770477c4f072a51b3ca69602780a", + "sha256:3a4805a4ca729d65570a1b7cac84eac1e431085d40387b7d3bbaa47e39890b88", + "sha256:63dac2d25c47f12a7b8aa60e528bfb3c51c5a6c5a9f7c86987909c6c79765554", + "sha256:650883cc064297ef3676b1db1b7b1df6081794c4ada96fa457253c4cc40f97db", + "sha256:6f2bbd72f717ce33100e6467572abaedc61f1acb87b8d546001328d7f466b778", + "sha256:7c872413353c70e0263a9368c4993710070e70ab3e5318d85510cc91cce77e7c", + "sha256:918cb89086c7d98b1b86b9fdb70c712e5a9325ba6f7d7cfb509e784e0cfc6917", + "sha256:9618a87212cb5200500e304e43691111570e1f10ec3f35569fdfcd17e28fd797", + "sha256:a805a7bce4a77d51696410005b3e85ae2839bad9aa38894afc0aa99d8e0c3160", + "sha256:cc3a621076d824d75ab1e1e530e66e7e8564e357dd723f2533225d40fe35c60c", + "sha256:cd033d74067d8928ef00a6b1327c8ea0452523967ca4463666eeba65ca350d4c", + "sha256:cf91e428c51ef692b82ce786583e214f58392399cf65c341bc7301d096fa3ba2", + "sha256:d36bbeb99704aabefdca5aee4eba04455d7a27ceabd16f3b3ba9bdcc31da86c4", + "sha256:d8aa3609d337ad85e4eb9bb0f8bcf6e4409bfb86e706efa9a027912169e89122", + "sha256:f5d7b79fa56bc29580faafc2ff736ce05ba31feaa9d4735048b0de7d9ceb2b94" + ], + "markers": "python_version >= '3.6'", + "version": "==40.0.1" + }, "cycler": { "hashes": [ "sha256:3a27e95f763a428a739d2add979fa7494c912a32c17c4c38c4d5f082cad165a3", @@ -111,11 +205,11 @@ }, "fonttools": { "hashes": [ - "sha256:85245aa2fd4cf502a643c9a9a2b5a393703e150a6eaacc3e0e84bb448053f061", - "sha256:e2d9f10337c9e3b17f9bce17a60a16a885a7d23b59b7f45ce07ea643e5580439" + "sha256:64c0c05c337f826183637570ac5ab49ee220eec66cf50248e8df527edfa95aeb", + "sha256:9234b9f57b74e31b192c3fc32ef1a40750a8fbc1cd9837a7b7bfc4ca4a5c51d7" ], "markers": "python_version >= '3.8'", - "version": "==4.39.2" + "version": "==4.39.3" }, "jinja2": { "hashes": [ @@ -392,88 +486,109 @@ "index": "pypi", "version": "==3.16.0" }, + "pgpy": { + "hashes": [ + "sha256:279c2e353f4c3a319f00bd9bd582456e420f8a3ac6de2b4e9731444746828383" + ], + "index": "pypi", + "version": "==0.6.0" + }, "pillow": { "hashes": [ - "sha256:013016af6b3a12a2f40b704677f8b51f72cb007dac785a9933d5c86a72a7fe33", - "sha256:0845adc64fe9886db00f5ab68c4a8cd933ab749a87747555cec1c95acea64b0b", - "sha256:0884ba7b515163a1a05440a138adeb722b8a6ae2c2b33aea93ea3118dd3a899e", - "sha256:09b89ddc95c248ee788328528e6a2996e09eaccddeeb82a5356e92645733be35", - "sha256:0dd4c681b82214b36273c18ca7ee87065a50e013112eea7d78c7a1b89a739153", - "sha256:0e51f608da093e5d9038c592b5b575cadc12fd748af1479b5e858045fff955a9", - "sha256:0f3269304c1a7ce82f1759c12ce731ef9b6e95b6df829dccd9fe42912cc48569", - "sha256:16a8df99701f9095bea8a6c4b3197da105df6f74e6176c5b410bc2df2fd29a57", - "sha256:19005a8e58b7c1796bc0167862b1f54a64d3b44ee5d48152b06bb861458bc0f8", - "sha256:1b4b4e9dda4f4e4c4e6896f93e84a8f0bcca3b059de9ddf67dac3c334b1195e1", - "sha256:28676836c7796805914b76b1837a40f76827ee0d5398f72f7dcc634bae7c6264", - "sha256:2968c58feca624bb6c8502f9564dd187d0e1389964898f5e9e1fbc8533169157", - "sha256:3f4cc516e0b264c8d4ccd6b6cbc69a07c6d582d8337df79be1e15a5056b258c9", - "sha256:3fa1284762aacca6dc97474ee9c16f83990b8eeb6697f2ba17140d54b453e133", - "sha256:43521ce2c4b865d385e78579a082b6ad1166ebed2b1a2293c3be1d68dd7ca3b9", - "sha256:451f10ef963918e65b8869e17d67db5e2f4ab40e716ee6ce7129b0cde2876eab", - "sha256:46c259e87199041583658457372a183636ae8cd56dbf3f0755e0f376a7f9d0e6", - "sha256:46f39cab8bbf4a384ba7cb0bc8bae7b7062b6a11cfac1ca4bc144dea90d4a9f5", - "sha256:519e14e2c49fcf7616d6d2cfc5c70adae95682ae20f0395e9280db85e8d6c4df", - "sha256:53dcb50fbdc3fb2c55431a9b30caeb2f7027fcd2aeb501459464f0214200a503", - "sha256:54614444887e0d3043557d9dbc697dbb16cfb5a35d672b7a0fcc1ed0cf1c600b", - "sha256:575d8912dca808edd9acd6f7795199332696d3469665ef26163cd090fa1f8bfa", - "sha256:5dd5a9c3091a0f414a963d427f920368e2b6a4c2f7527fdd82cde8ef0bc7a327", - "sha256:5f532a2ad4d174eb73494e7397988e22bf427f91acc8e6ebf5bb10597b49c493", - "sha256:60e7da3a3ad1812c128750fc1bc14a7ceeb8d29f77e0a2356a8fb2aa8925287d", - "sha256:653d7fb2df65efefbcbf81ef5fe5e5be931f1ee4332c2893ca638c9b11a409c4", - "sha256:6663977496d616b618b6cfa43ec86e479ee62b942e1da76a2c3daa1c75933ef4", - "sha256:6abfb51a82e919e3933eb137e17c4ae9c0475a25508ea88993bb59faf82f3b35", - "sha256:6c6b1389ed66cdd174d040105123a5a1bc91d0aa7059c7261d20e583b6d8cbd2", - "sha256:6d9dfb9959a3b0039ee06c1a1a90dc23bac3b430842dcb97908ddde05870601c", - "sha256:765cb54c0b8724a7c12c55146ae4647e0274a839fb6de7bcba841e04298e1011", - "sha256:7a21222644ab69ddd9967cfe6f2bb420b460dae4289c9d40ff9a4896e7c35c9a", - "sha256:7ac7594397698f77bce84382929747130765f66406dc2cd8b4ab4da68ade4c6e", - "sha256:7cfc287da09f9d2a7ec146ee4d72d6ea1342e770d975e49a8621bf54eaa8f30f", - "sha256:83125753a60cfc8c412de5896d10a0a405e0bd88d0470ad82e0869ddf0cb3848", - "sha256:847b114580c5cc9ebaf216dd8c8dbc6b00a3b7ab0131e173d7120e6deade1f57", - "sha256:87708d78a14d56a990fbf4f9cb350b7d89ee8988705e58e39bdf4d82c149210f", - "sha256:8a2b5874d17e72dfb80d917213abd55d7e1ed2479f38f001f264f7ce7bae757c", - "sha256:8f127e7b028900421cad64f51f75c051b628db17fb00e099eb148761eed598c9", - "sha256:94cdff45173b1919350601f82d61365e792895e3c3a3443cf99819e6fbf717a5", - "sha256:99d92d148dd03fd19d16175b6d355cc1b01faf80dae93c6c3eb4163709edc0a9", - "sha256:9a3049a10261d7f2b6514d35bbb7a4dfc3ece4c4de14ef5876c4b7a23a0e566d", - "sha256:9d9a62576b68cd90f7075876f4e8444487db5eeea0e4df3ba298ee38a8d067b0", - "sha256:9e5f94742033898bfe84c93c831a6f552bb629448d4072dd312306bab3bd96f1", - "sha256:a1c2d7780448eb93fbcc3789bf3916aa5720d942e37945f4056680317f1cd23e", - "sha256:a2e0f87144fcbbe54297cae708c5e7f9da21a4646523456b00cc956bd4c65815", - "sha256:a4dfdae195335abb4e89cc9762b2edc524f3c6e80d647a9a81bf81e17e3fb6f0", - "sha256:a96e6e23f2b79433390273eaf8cc94fec9c6370842e577ab10dabdcc7ea0a66b", - "sha256:aabdab8ec1e7ca7f1434d042bf8b1e92056245fb179790dc97ed040361f16bfd", - "sha256:b222090c455d6d1a64e6b7bb5f4035c4dff479e22455c9eaa1bdd4c75b52c80c", - "sha256:b52ff4f4e002f828ea6483faf4c4e8deea8d743cf801b74910243c58acc6eda3", - "sha256:b70756ec9417c34e097f987b4d8c510975216ad26ba6e57ccb53bc758f490dab", - "sha256:b8c2f6eb0df979ee99433d8b3f6d193d9590f735cf12274c108bd954e30ca858", - "sha256:b9b752ab91e78234941e44abdecc07f1f0d8f51fb62941d32995b8161f68cfe5", - "sha256:ba6612b6548220ff5e9df85261bddc811a057b0b465a1226b39bfb8550616aee", - "sha256:bd752c5ff1b4a870b7661234694f24b1d2b9076b8bf337321a814c612665f343", - "sha256:c3c4ed2ff6760e98d262e0cc9c9a7f7b8a9f61aa4d47c58835cdaf7b0b8811bb", - "sha256:c5c1362c14aee73f50143d74389b2c158707b4abce2cb055b7ad37ce60738d47", - "sha256:cb362e3b0976dc994857391b776ddaa8c13c28a16f80ac6522c23d5257156bed", - "sha256:d197df5489004db87d90b918033edbeee0bd6df3848a204bca3ff0a903bef837", - "sha256:d3b56206244dc8711f7e8b7d6cad4663917cd5b2d950799425076681e8766286", - "sha256:d5b2f8a31bd43e0f18172d8ac82347c8f37ef3e0b414431157718aa234991b28", - "sha256:d7081c084ceb58278dd3cf81f836bc818978c0ccc770cbbb202125ddabec6628", - "sha256:db74f5562c09953b2c5f8ec4b7dfd3f5421f31811e97d1dbc0a7c93d6e3a24df", - "sha256:df41112ccce5d47770a0c13651479fbcd8793f34232a2dd9faeccb75eb5d0d0d", - "sha256:e1339790c083c5a4de48f688b4841f18df839eb3c9584a770cbd818b33e26d5d", - "sha256:e621b0246192d3b9cb1dc62c78cfa4c6f6d2ddc0ec207d43c0dedecb914f152a", - "sha256:e8c5cf126889a4de385c02a2c3d3aba4b00f70234bfddae82a5eaa3ee6d5e3e6", - "sha256:e9d7747847c53a16a729b6ee5e737cf170f7a16611c143d95aa60a109a59c336", - "sha256:eaef5d2de3c7e9b21f1e762f289d17b726c2239a42b11e25446abf82b26ac132", - "sha256:ed3e4b4e1e6de75fdc16d3259098de7c6571b1a6cc863b1a49e7d3d53e036070", - "sha256:ef21af928e807f10bf4141cad4746eee692a0dd3ff56cfb25fce076ec3cc8abe", - "sha256:f09598b416ba39a8f489c124447b007fe865f786a89dbfa48bb5cf395693132a", - "sha256:f0caf4a5dcf610d96c3bd32932bfac8aee61c96e60481c2a0ea58da435e25acd", - "sha256:f6e78171be3fb7941f9910ea15b4b14ec27725865a73c15277bc39f5ca4f8391", - "sha256:f715c32e774a60a337b2bb8ad9839b4abf75b267a0f18806f6f4f5f1688c4b5a", - "sha256:fb5c1ad6bad98c57482236a21bf985ab0ef42bd51f7ad4e4538e89a997624e12" + "sha256:07999f5834bdc404c442146942a2ecadd1cb6292f5229f4ed3b31e0a108746b1", + "sha256:0852ddb76d85f127c135b6dd1f0bb88dbb9ee990d2cd9aa9e28526c93e794fba", + "sha256:1781a624c229cb35a2ac31cc4a77e28cafc8900733a864870c49bfeedacd106a", + "sha256:1e7723bd90ef94eda669a3c2c19d549874dd5badaeefabefd26053304abe5799", + "sha256:229e2c79c00e85989a34b5981a2b67aa079fd08c903f0aaead522a1d68d79e51", + "sha256:22baf0c3cf0c7f26e82d6e1adf118027afb325e703922c8dfc1d5d0156bb2eeb", + "sha256:252a03f1bdddce077eff2354c3861bf437c892fb1832f75ce813ee94347aa9b5", + "sha256:2dfaaf10b6172697b9bceb9a3bd7b951819d1ca339a5ef294d1f1ac6d7f63270", + "sha256:322724c0032af6692456cd6ed554bb85f8149214d97398bb80613b04e33769f6", + "sha256:35f6e77122a0c0762268216315bf239cf52b88865bba522999dc38f1c52b9b47", + "sha256:375f6e5ee9620a271acb6820b3d1e94ffa8e741c0601db4c0c4d3cb0a9c224bf", + "sha256:3ded42b9ad70e5f1754fb7c2e2d6465a9c842e41d178f262e08b8c85ed8a1d8e", + "sha256:432b975c009cf649420615388561c0ce7cc31ce9b2e374db659ee4f7d57a1f8b", + "sha256:482877592e927fd263028c105b36272398e3e1be3269efda09f6ba21fd83ec66", + "sha256:489f8389261e5ed43ac8ff7b453162af39c3e8abd730af8363587ba64bb2e865", + "sha256:54f7102ad31a3de5666827526e248c3530b3a33539dbda27c6843d19d72644ec", + "sha256:560737e70cb9c6255d6dcba3de6578a9e2ec4b573659943a5e7e4af13f298f5c", + "sha256:5671583eab84af046a397d6d0ba25343c00cd50bce03787948e0fff01d4fd9b1", + "sha256:5ba1b81ee69573fe7124881762bb4cd2e4b6ed9dd28c9c60a632902fe8db8b38", + "sha256:5d4ebf8e1db4441a55c509c4baa7a0587a0210f7cd25fcfe74dbbce7a4bd1906", + "sha256:60037a8db8750e474af7ffc9faa9b5859e6c6d0a50e55c45576bf28be7419705", + "sha256:608488bdcbdb4ba7837461442b90ea6f3079397ddc968c31265c1e056964f1ef", + "sha256:6608ff3bf781eee0cd14d0901a2b9cc3d3834516532e3bd673a0a204dc8615fc", + "sha256:662da1f3f89a302cc22faa9f14a262c2e3951f9dbc9617609a47521c69dd9f8f", + "sha256:7002d0797a3e4193c7cdee3198d7c14f92c0836d6b4a3f3046a64bd1ce8df2bf", + "sha256:763782b2e03e45e2c77d7779875f4432e25121ef002a41829d8868700d119392", + "sha256:77165c4a5e7d5a284f10a6efaa39a0ae8ba839da344f20b111d62cc932fa4e5d", + "sha256:7c9af5a3b406a50e313467e3565fc99929717f780164fe6fbb7704edba0cebbe", + "sha256:7ec6f6ce99dab90b52da21cf0dc519e21095e332ff3b399a357c187b1a5eee32", + "sha256:833b86a98e0ede388fa29363159c9b1a294b0905b5128baf01db683672f230f5", + "sha256:84a6f19ce086c1bf894644b43cd129702f781ba5751ca8572f08aa40ef0ab7b7", + "sha256:8507eda3cd0608a1f94f58c64817e83ec12fa93a9436938b191b80d9e4c0fc44", + "sha256:85ec677246533e27770b0de5cf0f9d6e4ec0c212a1f89dfc941b64b21226009d", + "sha256:8aca1152d93dcc27dc55395604dcfc55bed5f25ef4c98716a928bacba90d33a3", + "sha256:8d935f924bbab8f0a9a28404422da8af4904e36d5c33fc6f677e4c4485515625", + "sha256:8f36397bf3f7d7c6a3abdea815ecf6fd14e7fcd4418ab24bae01008d8d8ca15e", + "sha256:91ec6fe47b5eb5a9968c79ad9ed78c342b1f97a091677ba0e012701add857829", + "sha256:965e4a05ef364e7b973dd17fc765f42233415974d773e82144c9bbaaaea5d089", + "sha256:96e88745a55b88a7c64fa49bceff363a1a27d9a64e04019c2281049444a571e3", + "sha256:99eb6cafb6ba90e436684e08dad8be1637efb71c4f2180ee6b8f940739406e78", + "sha256:9adf58f5d64e474bed00d69bcd86ec4bcaa4123bfa70a65ce72e424bfb88ed96", + "sha256:9b1af95c3a967bf1da94f253e56b6286b50af23392a886720f563c547e48e964", + "sha256:a0aa9417994d91301056f3d0038af1199eb7adc86e646a36b9e050b06f526597", + "sha256:a0f9bb6c80e6efcde93ffc51256d5cfb2155ff8f78292f074f60f9e70b942d99", + "sha256:a127ae76092974abfbfa38ca2d12cbeddcdeac0fb71f9627cc1135bedaf9d51a", + "sha256:aaf305d6d40bd9632198c766fb64f0c1a83ca5b667f16c1e79e1661ab5060140", + "sha256:aca1c196f407ec7cf04dcbb15d19a43c507a81f7ffc45b690899d6a76ac9fda7", + "sha256:ace6ca218308447b9077c14ea4ef381ba0b67ee78d64046b3f19cf4e1139ad16", + "sha256:b416f03d37d27290cb93597335a2f85ed446731200705b22bb927405320de903", + "sha256:bf548479d336726d7a0eceb6e767e179fbde37833ae42794602631a070d630f1", + "sha256:c1170d6b195555644f0616fd6ed929dfcf6333b8675fcca044ae5ab110ded296", + "sha256:c380b27d041209b849ed246b111b7c166ba36d7933ec6e41175fd15ab9eb1572", + "sha256:c446d2245ba29820d405315083d55299a796695d747efceb5717a8b450324115", + "sha256:c830a02caeb789633863b466b9de10c015bded434deb3ec87c768e53752ad22a", + "sha256:cb841572862f629b99725ebaec3287fc6d275be9b14443ea746c1dd325053cbd", + "sha256:cfa4561277f677ecf651e2b22dc43e8f5368b74a25a8f7d1d4a3a243e573f2d4", + "sha256:cfcc2c53c06f2ccb8976fb5c71d448bdd0a07d26d8e07e321c103416444c7ad1", + "sha256:d3c6b54e304c60c4181da1c9dadf83e4a54fd266a99c70ba646a9baa626819eb", + "sha256:d3d403753c9d5adc04d4694d35cf0391f0f3d57c8e0030aac09d7678fa8030aa", + "sha256:d9c206c29b46cfd343ea7cdfe1232443072bbb270d6a46f59c259460db76779a", + "sha256:e49eb4e95ff6fd7c0c402508894b1ef0e01b99a44320ba7d8ecbabefddcc5569", + "sha256:f8286396b351785801a976b1e85ea88e937712ee2c3ac653710a4a57a8da5d9c", + "sha256:f8fc330c3370a81bbf3f88557097d1ea26cd8b019d6433aa59f71195f5ddebbf", + "sha256:fbd359831c1657d69bb81f0db962905ee05e5e9451913b18b831febfe0519082", + "sha256:fe7e1c262d3392afcf5071df9afa574544f28eac825284596ac6db56e6d11062", + "sha256:fed1e1cf6a42577953abbe8e6cf2fe2f566daebde7c34724ec8803c4c0cda579" ], "markers": "python_version >= '3.7'", - "version": "==9.4.0" + "version": "==9.5.0" + }, + "pyasn1": { + "hashes": [ + "sha256:014c0e9976956a08139dc0712ae195324a75e142284d5f87f1a87ee1b068a359", + "sha256:03840c999ba71680a131cfaee6fab142e1ed9bbd9c693e285cc6aca0d555e576", + "sha256:0458773cfe65b153891ac249bcf1b5f8f320b7c2ce462151f8fa74de8934becf", + "sha256:08c3c53b75eaa48d71cf8c710312316392ed40899cb34710d092e96745a358b7", + "sha256:39c7e2ec30515947ff4e87fb6f456dfc6e84857d34be479c9d4a4ba4bf46aa5d", + "sha256:5c9414dcfede6e441f7e8f81b43b34e834731003427e5b09e4e00e3172a10f00", + "sha256:6e7545f1a61025a4e58bb336952c5061697da694db1cae97b116e9c46abcf7c8", + "sha256:78fa6da68ed2727915c4767bb386ab32cdba863caa7dbe473eaae45f9959da86", + "sha256:7ab8a544af125fb704feadb008c99a88805126fb525280b2270bb25cc1d78a12", + "sha256:99fcc3c8d804d1bc6d9a099921e39d827026409a58f2a720dcdb89374ea0c776", + "sha256:aef77c9fb94a3ac588e87841208bdec464471d9871bd5050a287cc9a475cd0ba", + "sha256:e89bf84b5437b532b0803ba5c9a5e054d21fec423a89952a74f87fa2c9b7bce2", + "sha256:fec3e9d8e36808a28efb59b489e4528c10ad0f480e57dcc32b4de5c9d8c9fdf3" + ], + "version": "==0.4.8" + }, + "pycparser": { + "hashes": [ + "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9", + "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206" + ], + "version": "==2.21" }, "pyhocon": { "hashes": [ @@ -508,10 +623,10 @@ }, "pytz": { "hashes": [ - "sha256:01a0681c4b9684a28304615eba55d1ab31ae00bf68ec157ec3708a8182dbbcd0", - "sha256:78f4f37d8198e0627c5f1143240bb0206b8691d8d7ac6d78fee88b78733f8c4a" + "sha256:1d8ce29db189191fb55338ee6d0387d82ab59f3d00eac103412d64e0ebd0c588", + "sha256:a151b3abb88eda1d4e34a9814df37de2a80e301e68ba0fd856fb9b46bfbbbffb" ], - "version": "==2022.7.1" + "version": "==2023.3" }, "six": { "hashes": [ @@ -775,11 +890,11 @@ }, "filelock": { "hashes": [ - "sha256:75997740323c5f12e18f10b494bc11c03e42843129f980f17c04352cc7b09d40", - "sha256:eb8f0f2d37ed68223ea63e3bddf2fac99667e4362c88b3f762e434d160190d18" + "sha256:892be14aa8efc01673b5ed6589dbccb95f9a8596f0507e232626155495c18105", + "sha256:bde48477b15fde2c7e5a0713cbe72721cb5a5ad32ee0b8f419907960b9d75536" ], "markers": "python_version >= '3.7'", - "version": "==3.10.2" + "version": "==3.10.7" }, "flake8": { "hashes": [ @@ -821,11 +936,11 @@ }, "identify": { "hashes": [ - "sha256:69edcaffa8e91ae0f77d397af60f148b6b45a8044b2cc6d99cafa5b04793ff00", - "sha256:7671a05ef9cfaf8ff63b15d45a91a1147a03aaccb2976d4e9bd047cbbc508471" + "sha256:f0faad595a4687053669c112004178149f6c326db71ee999ae4636685753ad2f", + "sha256:f7a93d6cf98e29bd07663c60728e7a4057615068d7a639d132dc883b2d54d31e" ], "markers": "python_version >= '3.7'", - "version": "==2.5.21" + "version": "==2.5.22" }, "idna": { "hashes": [ @@ -949,11 +1064,11 @@ }, "platformdirs": { "hashes": [ - "sha256:024996549ee88ec1a9aa99ff7f8fc819bb59e2c3477b410d90a16d32d6e707aa", - "sha256:e5986afb596e4bb5bde29a79ac9061aa955b94fca2399b7aaac4090860920dd8" + "sha256:d5b638ca397f25f979350ff789db335903d7ea010ab28903f57b27e1b16c2b08", + "sha256:ebe11c0d7a805086e99506aa331612429a72ca7cd52a1f0d277dc4adc20cb10e" ], "markers": "python_version >= '3.7'", - "version": "==3.1.1" + "version": "==3.2.0" }, "pluggy": { "hashes": [ @@ -1217,11 +1332,11 @@ }, "setuptools": { "hashes": [ - "sha256:2ee892cd5f29f3373097f5a814697e397cf3ce313616df0af11231e2ad118077", - "sha256:b78aaa36f6b90a074c1fa651168723acbf45d14cb1196b6f02c0fd07f17623b2" + "sha256:257de92a9d50a60b8e22abfcbb771571fde0dbf3ec234463212027a4eeecbe9a", + "sha256:e728ca814a823bf7bf60162daf9db95b93d532948c4c0bea762ce62f60189078" ], "markers": "python_version >= '3.7'", - "version": "==67.6.0" + "version": "==67.6.1" }, "typing-extensions": { "hashes": [ diff --git a/python_boilerplate/demo/pgp_usage.py b/python_boilerplate/demo/pgp_usage.py new file mode 100644 index 0000000..6b5ed97 --- /dev/null +++ b/python_boilerplate/demo/pgp_usage.py @@ -0,0 +1,42 @@ +from typing import Final + +from loguru import logger +from pgpy import PGPKey + +from python_boilerplate.common.common_function import get_resources_dir + +_alice_public_key_path = ( + get_resources_dir() + / "pgp-keys/Johnny Miller's PGP Example - Alice_0x3A9AA381_public.asc" +) +alice_public_key: Final[PGPKey] = PGPKey.from_file(_alice_public_key_path.__str__())[0] +_alice_secret_key_path = ( + get_resources_dir() + / "pgp-keys/Johnny Miller's PGP Example - Alice_0x3A9AA381_SECRET.asc" +) +alice_secret_key: Final[PGPKey] = PGPKey.from_file(_alice_secret_key_path.__str__())[0] + +_bob_public_key_path = ( + get_resources_dir() + / "pgp-keys/Johnny Miller's PGP Example - Bob_0xAF34CAD3_public.asc" +) +bob_public_key: Final[PGPKey] = PGPKey.from_file(_bob_public_key_path.__str__())[0] +_bob_secret_key_path = ( + get_resources_dir() + / "pgp-keys/Johnny Miller's PGP Example - Bob_0xAF34CAD3_SECRET.asc" +) +bob_secret_key: Final[PGPKey] = PGPKey.from_file(_bob_secret_key_path.__str__())[0] + +logger.warning( + f""" + Done reading PGP keys. + Alice PGP public key: {alice_public_key.fingerprint} + created: {alice_public_key.created} + Alice PGP SECRET key: {alice_secret_key.fingerprint} + created: {alice_secret_key.created} + Bob's PGP public key: {bob_public_key.fingerprint} + created: {bob_public_key.created} + Bob's PGP SECRET key: {bob_secret_key.fingerprint} + created: {bob_secret_key.created} + """.lstrip() +) diff --git a/python_boilerplate/resources/pgp-keys/Johnny Miller's PGP Example - Alice_0x3A9AA381_SECRET.asc b/python_boilerplate/resources/pgp-keys/Johnny Miller's PGP Example - Alice_0x3A9AA381_SECRET.asc new file mode 100644 index 0000000..7945466 --- /dev/null +++ b/python_boilerplate/resources/pgp-keys/Johnny Miller's PGP Example - Alice_0x3A9AA381_SECRET.asc @@ -0,0 +1,82 @@ +-----BEGIN PGP PRIVATE KEY BLOCK----- + +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 +fbacFOU5a4xcohMiBv0xYj4Z +=IY76 +-----END PGP PRIVATE KEY BLOCK----- diff --git a/python_boilerplate/resources/pgp-keys/Johnny Miller's PGP Example - Alice_0x3A9AA381_public.asc b/python_boilerplate/resources/pgp-keys/Johnny Miller's PGP Example - Alice_0x3A9AA381_public.asc new file mode 100644 index 0000000..16f8cc7 --- /dev/null +++ b/python_boilerplate/resources/pgp-keys/Johnny Miller's PGP Example - Alice_0x3A9AA381_public.asc @@ -0,0 +1,41 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mQGNBGQf/p8BDADwDmIQWBcQELCXCyRUGQX+SMhp4wjrbc1GZd8xpgxs7KNFtKWq +AC5/o5BT2Leyqv2YoFy6u13jgagDVUDUgiMCblXKQdpo9Pdh3F7UeY62ONgCAbGv +qxPKJSojWNrR/HW98TJbU9zOvRq+a+be70H8rjwDPVzhDA1zY22TDmcQXagjrqFk +ZU9M2YCvKrGRSRnDYS3rEwzmbUItL59H79d2huX0g1//iri/sXbmXj52Cb5FKru7 +pi/taxmg1drOk4BrOincF9WbyoEA6cvQEyIc6+GyNjn8+1eZw6aztJW718D76cFy +BDYooh2Iy1hJ+dOTj1Hbmuu16gBWreJuJ8nuUIBguyhF+EPTtrefGHy9GtJ9IvTO +mmHd1S1tyKnon1qDTZjNXX/Nl9QmAn4iFRAkT2n40M+sU22KHy5pTvCl6NDCQpdl +BohrnkB0pSNI4IC5KfT0TQ5NEzEWWeR3ThGw4XoNinECaNYPNHAsxrFPaEwFSXOg +EMxcRfVk6FsB3G8AEQEAAbQ9Sm9obm55IE1pbGxlcidzIFBHUCBFeGFtcGxlIC0g +QWxpY2UgPGpvaG5ueXN2aXZhQG91dGxvb2suY29tPokB0QQTAQgAOxYhBG5esBT1 +d87TnHi3cM1hBm06mqOBBQJkH/6fAhsjBQsJCAcCAiICBhUKCQgLAgQWAgMBAh4H +AheAAAoJEM1hBm06mqOBc/8L/1caNCHF5k7ehzXrZYpxNzJXPJ0k6vTKQO+uqCaM +zORozFibRNfKGFYrRluLpBHw3hk04iny4tM/CQ/uW6L94X4jAQ0bvxguSS7e2tcd +32L3Iq4xVA3WuQeiBOHWnz4Kn/bG5mWTvE46ybIdHDp/8dSoVcUFrNwbCzYvEVG1 +WiSQloI5x8MbLavD7jeTRrFPTlwuq5hiri7EFoyJZmTolZgfPnidBEKEUdvCYlbX +HoUfttN0rS+5YmRaEk7qt+DLpIHe3Lz1JrfP+bYC/n6nZ6icoaWwWNdClPbSC2Pj +CJJy4w4Qp8btBiPyhbk5m7GfmLVBLXZltVhvcriQ2CYQwaiD3o7jUA9I3DLj0OBU +8qP7tCB4Mm6fw4kjEetUCacjKjOqJd84jk/KDYNPT9J2IwshnfcbhZ/KPmRCp7/P +Sx+V66BmqM9HMIndnekEHHvHnGpJzyPVIBJOrDnIqOtHzinRowteQAlUXnjSBvX7 +t93iQ9vmrC9JZYyYp64dVJQflbkBjQRkH/6fAQwAxnprBx3Mn+Rzpns+v//9SW7S +wF5Tq/vBGF7FDCfmhDk2bxWG64Sq80e9qVgjL1kVyuWFlLLCKQxcQmanULVTVSKQ +51zwKPKxQLKVdXdUaY75YGVLZvBeNBL8EOIDIXeAa3HsLBn52BbNzYWAGzlTbmR+ +NJfL2tc6Tr+AhexL8UhtJkwEaqoOnXl5/zP5ZnYXJLnJUUhptxz85AF6cb6eqaU5 +4MGwIAyr3gSFqM+5Zp6GpMltttbwyrEEOq3Z6pQnz8NWu4lJvLIuM9FiucqEkQfW +q2HPn57irLnmjPg6A5hnyVdg+gy4E+1vXbIngjLmfL+IHVwryJv1lWbFSE8+qo+N +N19f9WlfbWeqsHm/LhRe8i/S6XowA0HdZTAVYEkPHGFvv05qO1vpJNsrr80k1T+S +L2FLfCkwKZSlsYEV1JiWeFnKo+ZHejntki6iwcRvKXHl+upTIJ7nGGyXJ6rTionM +lD/5Lutgh95PRg7m/h0FGmhykfo+uaZlSvZitA33ABEBAAGJAbYEGAEIACAWIQRu +XrAU9XfO05x4t3DNYQZtOpqjgQUCZB/+nwIbDAAKCRDNYQZtOpqjgaSqDADTOdNW +ZD+FPTW6ojefx8QmmYfqjRD+c0ArLF5DTM5hHiYwq1/231vBLMojpNueJCDweaVL +iIoqeTjHy7Y0+pEi0jLg//LbdFJJb6K2x9SNs6YcCSXpYGQ0kiFM6p0/HHtvEupR +M04jTyQTBtC33pjH2RRdrrPu+TJWV/+o5NR84+1ibHAGQ1BvrPlrVQIInWpQYOH4 +0PopavTAawkmHPRjxjCj+4AP6zgvAFgf0s9/3D4CdW+ogSQzSgyJFfFxNGKaP5v8 +BzZ8jU2CGpwb5nswrfbevscmqfy29mFCD+7ZEi8QbhUjvU7DgosB+glv1vDIDBPJ +SpzF7Eq8l6ozDJdVAZgT0Ok2dOlK94Qm5VtWZ9ag64M0RXmDi9cbSaxX7ZLQtaw/ +/lbuFseJtU9mjrxdcwtGSMn6eqg+tsUEauNKrLLCv6lOdwwEDHKvY/U43j45RKSM +X/FylGd2X9PWaz4n8KFZTw7ILbhRoh1AtaB9tpwU5TlrjFyiEyIG/TFiPhk= +=AEiU +-----END PGP PUBLIC KEY BLOCK----- diff --git a/python_boilerplate/resources/pgp-keys/Johnny Miller's PGP Example - Bob_0xAF34CAD3_SECRET.asc b/python_boilerplate/resources/pgp-keys/Johnny Miller's PGP Example - Bob_0xAF34CAD3_SECRET.asc new file mode 100644 index 0000000..18ea5f6 --- /dev/null +++ b/python_boilerplate/resources/pgp-keys/Johnny Miller's PGP Example - Bob_0xAF34CAD3_SECRET.asc @@ -0,0 +1,82 @@ +-----BEGIN PGP PRIVATE KEY BLOCK----- + +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 +eNXokI1ipeVw18bb6hg= +=wwBM +-----END PGP PRIVATE KEY BLOCK----- diff --git a/python_boilerplate/resources/pgp-keys/Johnny Miller's PGP Example - Bob_0xAF34CAD3_public.asc b/python_boilerplate/resources/pgp-keys/Johnny Miller's PGP Example - Bob_0xAF34CAD3_public.asc new file mode 100644 index 0000000..e7c3b2c --- /dev/null +++ b/python_boilerplate/resources/pgp-keys/Johnny Miller's PGP Example - Bob_0xAF34CAD3_public.asc @@ -0,0 +1,41 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +=Nhm+ +-----END PGP PUBLIC KEY BLOCK----- diff --git a/tests/demo/test_pgp_usage.py b/tests/demo/test_pgp_usage.py new file mode 100644 index 0000000..31ca1c5 --- /dev/null +++ b/tests/demo/test_pgp_usage.py @@ -0,0 +1,95 @@ +import textwrap + +import pgpy +from loguru import logger +from pgpy.constants import HashAlgorithm + +from python_boilerplate.demo.pgp_usage import ( + alice_public_key, + alice_secret_key, + bob_public_key, + bob_secret_key, +) + + +def test_when_alice_sends_message_to_bob(): + plaintext = "Hello World!" + signature = pgpy.PGPMessage.new(plaintext) + assert signature is not None + # sign a message + # the bitwise OR operator "|" is used to add a signature to a PGPMessage. + signature |= alice_secret_key.sign(signature, hash=HashAlgorithm.SHA512) + assert signature is not None + logger.info(f'The signature for "{plaintext}" is:\n{str(signature)}') + encrypted = bob_public_key.encrypt(signature) + assert encrypted is not None + logger.info(f"The signed encrypted is:\n{str(encrypted)}") + + decrypted = bob_secret_key.decrypt(encrypted) + assert decrypted is not None + assert decrypted.message is not None + assert plaintext == decrypted.message + logger.info(f"The decrypted: {decrypted.message}") + verified = alice_public_key.verify(decrypted) + assert verified is not None + + +def test_when_bob_sends_message_to_alice(): + plaintext = "Hello World!" + signature = pgpy.PGPMessage.new(plaintext) + assert signature is not None + # sign a message + # the bitwise OR operator "|" is used to add a signature to a PGPMessage. + signature |= bob_secret_key.sign(signature, hash=HashAlgorithm.SHA512) + assert signature is not None + logger.info(f'The signature for "{plaintext}" is:\n{str(signature)}') + encrypted = alice_public_key.encrypt(signature) + assert encrypted is not None + logger.info(f"The signed encrypted is:\n{str(encrypted)}") + + decrypted = alice_secret_key.decrypt(encrypted) + assert decrypted is not None + assert decrypted.message is not None + assert plaintext == decrypted.message + logger.info(f"The decrypted: {decrypted.message}") + verified = bob_public_key.verify(decrypted) + assert verified is not None + + +def test_load_armor_ciphertext_and_then_verify(): + message_text = textwrap.dedent( + """\ + -----BEGIN PGP MESSAGE----- + + wcDMA+ncLmW9GlBZAQv8DE6tT4ncRzg/+49v4lM93eksvHvJgl7vQ9FBnWN+VMrt + gySvhVUTh80lkrH1yWTxgpcclzO9TLb1yyxCIBm2tLkw4PUfZ863NlI/iYSQvo6f + 3XFcYqhcjRtUqIb+6/twuAsL40Nj6pRXnHLCHdAvi1VotC8LsVC0aG5BozN+FDZV + TSLbaWuXrmY5dlR17Vguncaazp0G6MXg6dvyIP/OyBFn6r9W02/+BTfPR00pRQFt + oS58yPF+/NmeuC6mEBuR5hN93yWPo9DJgpf3bQrKbpecU6pmjalkXV7qsDZuNGVV + opEvis+PlU2jJVmwPT8eUIFNbz2d1HIOoF5GGBqvWchWaV19FbxcnF3qk/hBzzFh + mJLTcAKozcr/RPwY8ppdyOVmfjzdu802BAHrmtKYDj1Xz0+9nOP9tsKVHKaQ1wY4 + d2zLjMj6a3q7sOBzABtarR5aKdKhibvrEGz27iWyVgJjQ5tTtB29gVZaBjn5yvfO + E6SgHc2XI+y+dWt6dFk30sFLAVEf7F88Sr0yZsBwMDcPgK7OGMkwcpU2iDkUp3Ww + 7PTILmyAu0yL/mzTzPNBLUOwiWLz1TWfjReopZzlWi2SyKHAkYo0YcTGJoUDLFmy + gRaXs2VTEyGY4c1Ivxuy2+QRN9uVi3LKflL0Ay3/h8LXydVH7IO7xsCu+TDYiX5A + C+v8mP6ATzw/9bze4cnv9BR6guylpr1DyVHHNAkkvtGhNW0ASj5xFiWtOiVwxOm6 + 06jrD2BiE7KZdHIWgI07H0UnY7i0miVHVKmLgpr74Ctq5LqCTn14a42ObsJblghg + Wa+ymdMLNLsKsTu3G1XLiHF/xJjlVyFjykggqL0hAR1k3rRtShou/9iH90T2VTvr + HTV7EmXH6fn/NnTlMG4o1oTZf9vImGvUywdIsuxojV0bw1Kitf36x+Y+XY299JiW + 6VqE5/MxPEE5GesBgjZeKJAZp+6x6GxnIijEaycDqYRMw80rEgzJyOhP9+JdJ6JS + v5YTAxagpLdnpwqJw6KQLjIHrZLSJNBxRJ5GcQ0hxUmlpxMz01eoNSePq2Nos5hf + 4i2OabOo6Hy92BQG/czhIaXLt7rRbH05cYfYc6q+QXtTNIOEkJIQRfkUnMMvJKLq + QnqIc+AQ+Cx12LHKewpxAXm1gQfnKxUm5BwvgCmP1HklJgJa5MqpFjNeoPxiJkqc + ICtXJXKuK/MGXL2q8Q== + =I73S + -----END PGP MESSAGE----- + """ + ) + message = pgpy.PGPMessage.from_blob(message_text) + assert message is not None + decrypted = alice_secret_key.decrypt(message) + assert decrypted is not None + assert decrypted.message == "Hello World!" + verified = bob_public_key.verify(decrypted) + assert verified is not None + logger.info(f"{verified}")