Skip to content

Commit

Permalink
feat($PGP): support PGP encryption
Browse files Browse the repository at this point in the history
  • Loading branch information
johnnymillergh committed Apr 5, 2023
1 parent 3c41995 commit 88e6e17
Show file tree
Hide file tree
Showing 9 changed files with 602 additions and 98 deletions.
6 changes: 5 additions & 1 deletion .pre-commit-config.yaml
Original file line number Diff line number Diff line change
@@ -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
Expand Down
2 changes: 2 additions & 0 deletions Pipfile
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
309 changes: 212 additions & 97 deletions Pipfile.lock

Large diffs are not rendered by default.

42 changes: 42 additions & 0 deletions python_boilerplate/demo/pgp_usage.py
Original file line number Diff line number Diff line change
@@ -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()
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
-----BEGIN PGP PRIVATE KEY BLOCK-----

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
fbacFOU5a4xcohMiBv0xYj4Z
=IY76
-----END PGP PRIVATE KEY BLOCK-----
Original file line number Diff line number Diff line change
@@ -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-----
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
-----BEGIN PGP PRIVATE KEY BLOCK-----

lQVYBGQf/r4BDAC8zMbR57c4DPe81ln84f+R5DWR52bUo0T0ld7qMCwE8ZdjVZPE
H74Km5DddQ6dthr8uVZsU3ecz+z9CLxvw15RiwNZisbnKdcQBAukGijViXx00ZAP
0ZxilYzPwRYEnEadndH6QvjoUbbpqX4c72rEU7wH6kSb/O/e2EDysQRU6EmEZaFb
IasSvzizgVBKvCuGUYrEpx1wrpFGVTFQfHig46xvMVusq2B4cFpzpAVPuM7o0tio
7brJJUvz/NgO7zRHE+6XIhhVq1Xjyh6NstAXmQMpz/3p+w2gsHlZiyIQCJavm8uw
SsYCybPD1ebtAYu3KeEaginBB3pqdg6hm94wyOGYzhByh1g0IRKc0G53oVyIDML+
hFs9rOpUEqiAczvzukprH1OEwSR7YcAMSTHTtoW3+XlpR/GKlkOI31PLT1ssfkMD
rHT2yEAOjlxdXbatLJWr8vktQia+MF9hzq0ABaV4Bznpo41gDMrSvvEOD6W2XiU5
tz5w1rthXBtgWHEAEQEAAQAL+wZM4xmgHOoe7Kl9kbUxqYCp1+vNiA3ygNuUoMK5
5s4nbcDf2zWBRas+87+gJ2O17wKeALdOtcAi5CqxfvBP2bbo56y2R9rw939OU0Ef
qlst4lxXnfIZMZnMmc1ZCS4QNP8PhDFQyNOf3nW/tTir+KkijjTJaY63Cx4po0k2
BQn8Um+7oH3VCstuXCsJVq+XxfAOio3zcbUP7kMllqaz8KaV0mxHfmKtuWNrhGk1
gQPfC/CTEK3aeRA7UWSL/H3LF6nB+YCrjHQjcJSgDLv7jiWNdwZw2ZrxqqQlzgX8
7y/V1FTArqSy+nM5k1BDyMAI/XsabQYc/hLNnJozFGeu5X4xcVmUeuHH7nWt0o4/
Z7R1V5NRJvQZguQAYUaweEHbMhX57NScgYyprmtOeqIwMpIbGglSAIEFGL0nk2iu
hK1kowZWbWasZvve8vOqEyny3ju/lHHJ8ZeZBqQ+O8crP+WU3zAAo2dOLkkjywrn
rURFwV09GARCUzDdNgU98oRGDQYAxagRLP2EXgD4qteV//n01J60rw4sI+ePgI9m
i91nCuqp1Iofkv0+GOn2UWbfPdAk4l5O6OHsLOkvtLcNq1AYOlqxvJgyeZ+qU7nv
YM0XhP1oJoLHFQL4vbt8DXPCh33VVAxPn/O56YnNr+5j1WURpRmL/jOKsOaTtN+t
2czUCiiexxvNicNJG4LSBC5SgtCAuVA1/0pnVR3JGtHsBcPTfKCKFtS8HtwB7uNj
hE8fXFDSPM8MSDNjK683Iu53OKh3BgD0h3WgzT2ADCNjt0Lm4mVf0Z7oVeOXGups
ZaXZY50ypkZztSb6WPwgL0ZNqrn7E0IQnxM+JiFGbjFytetzoIAv6X/sYktFeyQH
7z7Z7N7dcquczQZq6giKkD4Ke+ewrrTL7Nxp26HlwN6UkEem0Nb8qz1Vkb8TfwKA
k8DY3pn8Ojw5M6rXdgdrm7hqeXWorqrRleJD2ThZxFo2Sbq3V6FYsmP3/CFTMpTE
2NkemBDo/jIOZlURjFlRDAWnbkE3qFcF/0kTbEF5XtJi/xv7vWQKA1bGetK1TiJA
YlQN6vUSP8V4YQpB/IMtnpBMXL130L8QCbE7bsCHXKctVvGU/0tBSCDBC93QaAOP
pSkcOWsdUWunta9xWPw8H6ALyKbiTpp5dwIuPfg80VXZr9hKvqiP2RVSTIGZE5oT
pHZtYiiDVGKEH/GYW7gVwDJ++Z4J67cRCFKOxlGNCXGt2RogSLEb+ObujL/dTlSz
GsBI/yh1sUJJUL/4m/1vBNXfzICrGtOoSuY9tDlKb2hubnkgTWlsbGVyJ3MgUEdQ
IEV4YW1wbGUgLSBCb2IgPGpvaG5ueXN2aXZhQGdtYWlsLmNvbT6JAdEEEwEIADsW
IQQaOGGOzTiDZooV7IVx5CT6rzTK0wUCZB/+vgIbIwULCQgHAgIiAgYVCgkICwIE
FgIDAQIeBwIXgAAKCRBx5CT6rzTK03CGC/9bFwMz/OaPK5ThdlKRC0+E0WZFYOtm
bFi96r47LAf7TQammcDQg6PjrRppA71M6k/8T25wwwVP31MSfUaAGEopxxFee9b9
OhlPewDa3Ovc2f47YvKu8N7SHGFplLRG7ykyCZ8CoC0VsUPqjhaKFLYe5WPpa3hr
VCXjHsONSeVV4dgeeP0fbdVpEaIYexllT6T00O4leFK6lMCz7XveoBRp0eiiYaLo
u67rBzw0S9dZ5rqZeCT8wyw324/Qwr20Wo77ug8fKyq8BTh06JZeZqOza/eZT7V+
uhAPXVDwqdb7p3dbDIKja2eMM1Il4e/EqTsozoaRYsIzsIkb4somx5om2a6mIcn0
DqMmZcHeHiWjK86w0WY0FWt42z3V3/upvlgweeyqIirMocckhKsyAQS8usuptbN2
+VM8lh7bxDw2jF6Dy+B+Pv1X2sSYWi+Hgg/f5JYZTIgjlLWnr9Dmftrv4ew0vIH6
aMsJZ03tfVOBR5JWt8EJpBRdZ8FgOeIyCRudBVgEZB/+vgEMALbcZfNT+UiKDOx2
IFwQGiLd1ctNQT9ML2Fz5T4v7hnZ4z/if8SIFoN16nEX/Q7rH5Dgg63c/nOUZxmn
/jagUwIgOT6kyDUhTUALDyTK6ZeVBduwNydBhQfJhCF6bjrMncP2KP67/bLxGzqe
Pt4cJug2qQmLrT8Lf2ZXFRjW9RJbBSL/R3ka89xfeyyQJGY5uB9pU2MpQd5J3tSP
hECUTApTt5N/1BChwDYO4biKDoN3e6CuJa/rmP+apeHgBdG1HyjXjABuhwJgkLiy
rCtLBH+XCY50RHkXK9B0UakX98pttFONtxhV78HNjRR7wjx+uoUtT/jWQVb9EuvR
s3hidElYV3gkWSskOgQf9OpHs6cKyIflbex0LYRyNl5GFnwmZTWhcczLm4LRODFY
uA11X8VqWPc2pJ9GODOkJTWvFpoGY/dRI+k7W5a8ZVZKZPGuOtgmOLoS+Z9Airqv
pXszU5WsRTGcL7Lm5Kub7eqQ7drqy1cRbSZ9HpC/OEca/rt8MwARAQABAAv/RyQ+
AcnkzSTwXDqk4kxdbr0xhTPcM50XPenSATyyfJo5gExFexea8rA4cqFrkZdGI55F
fKni0OKmreOe0m/Te5s/yjBft9Pp8wWaca0D7jZLHipTetFRyTLMVh4ErpmWs3uc
fWZ0EF8fQdH5EX6QYH2LjCwsTb/SY+VzTsOqeuawe+onS2WCBHWdPTwi/SZtjML0
bzrI5ouExtvDD0DiyI3DeP4dag8T8bQeeyYy+VDN5zh5bxTQ5HitGtCGUw0Mlua6
ud3DQGEaJn/uOTf9AWc4GMFwaxp1GEUT7ejCRfOBhlGCLuyeq2tPSwAy19Bs2VCL
sdw+3gv0xZ5k6ndNd/DnPihbGMsa5zZfidtR3hUeyCtZXTTqK/dSYf865pPkFS0+
J9DFZdV68+8f++agLiLHlUWXCUeg+WPXtgvJ+eW6oUN/i0sPhGAy1cwXCu62+IqG
7xMFxdXLUKTCOIX7xFPH9bh0hWIOPPX70THNnLO3AhCjQV2923qyHqNpxzjZBgDQ
irz9aaG+Y4+t3y3AyiQdb+ZSYNgAWCeKtTC5+XUaelKLxrx5Q92HJxqZi8zDYfFs
OZ/8ok7jDVmvOWKL4QWQbKZ904eer7YXDVZ9/mEhyooGPexW0oxOy51ae2uJzcjV
j8AusUp7IGJLksg5OosETtX//Yxkv6pdWV0al8nhGYa+OZL3wEoOiS4YH8i78mXD
d2P4ir3/HviS1EjbXEliDxtCPoFLGPpWbo6DHISj/RxxJXFhWnHygT7TsGK3XHcG
AOB5iEVucvbauxrZjQsbhDVpHjwcU+rd1rY8ytFVG7xpvlB/PD21+YeCdx2jFMTV
nM/YBBl7N3AAmnJzM5EvnS1D2qzJrBiyhyLEGGvqlXxlO/5TGev+/dftwrMH1bsQ
2HI/vuun0uBdHu/xfi53fozEbIuEmGfXXd0my73XQHTGJKFhYAS9/+qy/3A39Jr2
o9Ht64/NcWIbHQpEYC0EFpQL4uye6UtGF7mmNgkwcxG0lhxQbzbpyw7zNSXPEciZ
JQX/ZCNoUn3BlsnU51viIUTlR+q6awSlEk0IysWrL8QKSQAAA/ybWt3sCDJFu04G
JnjfqsJvNDqWChEfnHp3wSi9+DQKAL1B0ANNw1Y9XM+gSVHpJ/EM1cagYsFHioCY
MOaBEAtJG5EB1mKrI5ypvMGmjWI/UoLdxjuJ6LZ9lqtLw5SzNCkzkbUoYds+qpe8
5+G01/qOySRz+JQMueMdCThrXDX4gHC5RREgmqopdXzosz31mWkc4KfQB+cl1pyG
Efj+5hCJAbYEGAEIACAWIQQaOGGOzTiDZooV7IVx5CT6rzTK0wUCZB/+vgIbDAAK
CRBx5CT6rzTK0/gkDACSx9/N74GYbv843b9WlaefIaDC4LzH1aZZ8oWX7VtWvCKy
VNX3EJzDLCINUVqkknuxllo4BUGY3NRgyyNbrQD4/BvCbN0zfhi+dG8sG/rXtXHB
/7PYUd4rdbsi4lGnHwZWPNKyPakxvMBKiElhLj/EuU+MHzfBfIOKDoeKy/Pi2ZCe
ibnOKOxmG+f1eGGRTxifeG9duv2zlHa25xs09vyg1qSUpICE3EojvWnDx3/Nf4KL
PskoBATmAR0PI23X/LKX6AmXo77s6G7luHCjEIR+PuryvrMKDHEFYLe7KjRj45sh
cQFYw8ggdYt+PbhvMrV0udn8uNe8e5XwMXAEzjjDORPtwwi5NNEx2QYJk1gfNPpq
MC/qLHXPo6K1H295t2+8mHLBShQRWKbngNHxYBV7bIktTJo107oCgRhvDojw7A/0
tjBO7mwAkVpfghBizxOavEXu+JGZkJHlsZpuUJqesmFQc0cNkIYGdatdGIKbTgiL
eNXokI1ipeVw18bb6hg=
=wwBM
-----END PGP PRIVATE KEY BLOCK-----
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----

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
=Nhm+
-----END PGP PUBLIC KEY BLOCK-----
Loading

0 comments on commit 88e6e17

Please sign in to comment.