Merge branch 'master' of github.com:tuxxy/nucypher-kms into umbral

pull/55/head
tuxxy 2017-09-26 21:18:23 -07:00
commit af0b298cbf
15 changed files with 669 additions and 11 deletions

1
.gitignore vendored
View File

@ -7,3 +7,4 @@ __pycache__
*.so
/MANIFEST
/.tox
/.idea

13
.travis.yml Normal file
View File

@ -0,0 +1,13 @@
language: python
cache: pip
python:
- '3.5'
- '3.6'
install:
- pip install pipenv --upgrade
- pipenv install --dev --three
script:
- pipenv run pytest -v tests
notifications:
slack:
secure: ZGr5vpk+YoQiOqp0ABXUZZyRNL8egBbJGvpTvmmde3pV7wNjjrNvuVHJ6CHHiOiwULojg/+iDYaO//saMHicXI+dFZs9FuyiLR3YbjPF3UCdCFG8fI3EUaFHU+OTY+kSYx9ZvrXFqzGixNpwPCy7kHR22E58yXLTLSPZpNdq7bZsAcHt2DOTnNUO96Rr+1UGekEB+zDqGpJvYR6zujkNe+dO3ZJTp9ldTEKyl93dVLqKuEwsMdd7HMWLucL8aQKdJ8PMz9zxfNpLNHiM4aqgiJz0ZMgjQXOfoDeaF47G9RhGbuX23FodP1u4Lje15dIZ/Lk9w/zMrpu8lY+YDond0ir4atDKYRi9TRzsTlqtJYgpPi5toKd5LBiEk5pkqyQn5M7YS7OcSLVcP2p5Fb8XIlJeACxe0N/lwdgbKRwEypqBbZ+fYQJPMkmi3zCxpfojjCXOs+zuNo/EQ2K/qaQA8H/zBNlhiuFKX3yWY+aVGvvYLqYzjGOy92jrU7OSvnKp+PeTGGWA/XDfNbGmt5aFhE3arzw6Y/W6coDG7Nl+eMlSb7ZZCXvnmV/tip+RrxmWY5q75Anc0DQ4Aui+cNeW1Ew8wIPuRwgPsOcgxE2PYSayvsSizoz7r6nGKnWl6SwNj70YFyXs17xQ3/B9RspyUC6EpXa0Ozg/KqRvJuQ5PY8=

24
Pipfile Normal file
View File

@ -0,0 +1,24 @@
[[source]]
url = "https://pypi.python.org/simple"
verify_ssl = true
name = "pypi"
[packages]
rpcudp = {git = "https://github.com/nucypher/rpcudp", ref = "kms-dependency"}
npre = {git = "https://github.com/nucypher/nucypher-pre-python", ref = "kms-dependency"}
kademlia = {git = "https://github.com/nucypher/kademlia", ref = "kms-dependency"}
lmdb = "*"
pynacl = "*"
"pysha3" = "*"
bidict = "*"
"py-ecc" = "*"
[dev-packages]
pytest = "*"
coverage = "*"
"pytest-cov" = "*"
pdbpp = "*"
ipython = "*"
appdirs = "*"

425
Pipfile.lock generated Normal file
View File

@ -0,0 +1,425 @@
{
"_meta": {
"hash": {
"sha256": "d53c7011c8f43de1210b82e29cd920e3147ebf8b1f1cf88c7b795cc098e5dcc9"
},
"host-environment-markers": {
"implementation_name": "cpython",
"implementation_version": "3.5.2",
"os_name": "posix",
"platform_machine": "x86_64",
"platform_python_implementation": "CPython",
"platform_release": "4.4.0-96-generic",
"platform_system": "Linux",
"platform_version": "#119-Ubuntu SMP Tue Sep 12 14:59:54 UTC 2017",
"python_full_version": "3.5.2",
"python_version": "3.5",
"sys_platform": "linux"
},
"pipfile-spec": 6,
"requires": {},
"sources": [
{
"name": "pypi",
"url": "https://pypi.python.org/simple",
"verify_ssl": true
}
]
},
"default": {
"bidict": {
"hashes": [
"sha256:d39699e569b757893cf0397148b3452357a95ecd88fd1ab0db663c77c93778f3"
],
"version": "==0.13.1"
},
"cffi": {
"hashes": [
"sha256:eddf6bd95b100f34c56a226847be92bde416d028213e87fd700bc593cbf3e9da",
"sha256:929d206ecfefadcec0b0e13956131eec7442829d240da020d67274fefb9e61a4",
"sha256:040e0b5462c65a39b7112ad9e951f3f57b487d0db053ea510dcf8fc53931ab4b",
"sha256:d361e8c504bae02f665fad8d5ba4b74a6c1fab7862eec39cddcc21e4479fa275",
"sha256:56a8c39e6e7225474b36c16a03240fcbbfc5c8cb016645793e0dec2d2f9bdf67",
"sha256:4d2e388ce51e6a4efae8d4533ca15503ea957c41233bad165f8ccec354edca67",
"sha256:c091a1ac521dac2770632f499c124762ddf978d23ced0472f19a8830e006eab8",
"sha256:5c20f34a6858cd8c59eac23f80bc80bb5fd294bd9b22b264255a3eec0ab459f5",
"sha256:b45efc8d81640a8e9122c1ba1817da2a998ca0168c40de7bbfc47b960771ca94",
"sha256:f2ffdfd930bc4bcd4900def32fbb2a16a91656d9caafff573a25934327140431",
"sha256:bd93a0df4dc72893ba604c05d487ea4d47a799e54172b89e414953685b0b08fb",
"sha256:45233398f5e7114e719d0b83ffd0642af7fbf05136195f500fb6b72133c8e998",
"sha256:47853d133f0de32697b55e0c2ee377d88e3143bc8645a3b93d38be2f5387b0a2",
"sha256:6f1a2f85510c675b068e29625ff534f02567f24839cbd7d61cda6b7df62da2b1",
"sha256:6153b26756de2f34f80ca4e8b1e79011ad62bb670539dc3df71e62909a112fdf",
"sha256:5152bbde6ee514a11e2cd1b76a7ccab5af1043356ec3df9efe0112d97b20dae3",
"sha256:42b38cd48e55b2a4c5f038f80137c2cb4393fd4e4d1c3dbeeb7aea9475b68ea1",
"sha256:f6202eab19fd2c44d7d7af2bb8d286cf18b7b3d67b0e5bf1f2f113c99303ff87",
"sha256:ec1112466a924ba69df5a90f31d26d323e3b91ce21f94b10fa0b77f44a07df48",
"sha256:7a55f044dd78fdca379d455550c581b9455af022b8f8b5d97f585a25f4da63f6",
"sha256:fd3c49d7d22ba75382e19c4877e1d4dca232ef48137442f8582c2259b0cdf612",
"sha256:a76b89adecd46138aafdbd348563df1deb714962b5b3659ee1b6b0c5cf6ae0e5",
"sha256:dd9577197fff563e4784ef4ace7da28c7da96a81895b69c008cdb82f1e82853c",
"sha256:2217d22cb001386947693bd93ca4370224989468daf2939f3bf717956fb0a119",
"sha256:59fc30a6f7331fe69cfc67ef151fd03a33491d25430ae0c4597e69c4235fa87e",
"sha256:8a5632592b2752375b6d9e81da022896ece235713129fcc33703b3e10c639ef9",
"sha256:48d6589fda4ec0ccb7d973807890a733381f828d29167177eb7d97892255a769",
"sha256:f14c53dc624529eef175c993ceb886f37ecece09825bf47bf3230aacbc3b7acc",
"sha256:d8930a719781987a876d6de8cf33ce937191c383158daafcb9db804bf3421adf",
"sha256:765cf591a2f790b012075c7f54344a02b622a8561708ec27b3042c8c1699a465",
"sha256:5f4ff33371c6969b39b293d9771ee91e81d26f9129be093ca1b7be357fcefd15"
],
"version": "==1.11.0"
},
"kademlia": {
"git": "https://github.com/nucypher/kademlia",
"ref": "kms-dependency"
},
"lmdb": {
"hashes": [
"sha256:724234c4df6a8ef987957b6db92417c42afc3091d88765e9a8e52143b1309948",
"sha256:348ee17a618ea3afb1c981d262bfa0f2105d2833858747ef1b2c7307a09b5b18",
"sha256:8d7b1ac8dcd06c0a4f01569f8b4dfdcccf8baeaf1fed58fe6ec686de811168e7",
"sha256:6ec5220c3b84469f613c1332363f8a316c4742236f380b7c4e20f317690c8ff7",
"sha256:46f331b63a6daacc4a160a7d587f1a0f2caebaf37a72d1884e4d80fc6539e2cc",
"sha256:335a549e8f93e69edf154f1b760f5225f0f4799b15e7e85892e6f05c131062bb",
"sha256:70d75e3def0d28e08c1684140a63edeb2bbc8a871a4d510e84460a3257ca8234",
"sha256:cb95bb4ffcb1b586f6034a3c60172a6ab757d09dc925e04c5d8e2ce8076230a7",
"sha256:1edd081cf17fa75ca93adc20bca17d0d87bbbc214cd7cfd397faa4d2a9f5acf2",
"sha256:e7cefb0677fd2f8bc2df45846022fca9d0d95d2fdbd8490d4c5ea4b32d5cd014",
"sha256:41a303e7fbfd8e54f32e66a91ff24631eccd2bc904780e833116891712e47b67",
"sha256:df568e740ba04287ae47e50992730717418a142772d1e8596638f4841103736d",
"sha256:f891bb6fb0f745191af601e036f92afc509ee291749e23f4c8ac88ed8fb3c993",
"sha256:c56981dde168316df6307dfd4fcb53363a424f01e4c1b8dddca1609f4fcea2e9",
"sha256:4068da0133368ffd79afddbc466e2d8b573e14e4047340f91d8ec0f4f9e27bec",
"sha256:31675ce3415172ab6da3606d9397b3326bed685d49b2b4db09de4cd10d14e698",
"sha256:6bd267e925aeaff5a7d1a035ade4c3db2b18be3c69e00a55ee7f91ebb63cf0ee",
"sha256:1ea17dabcbfc1824ebedb7b40250f8157e80c0316d03e2bca3dce173386cdb0b",
"sha256:43779624301537e4d7ee9512a2562ea10b937bca562b16ecddde97db1985cffc",
"sha256:d2bbe03e76fc7cd99d8c94102aa4a10b900544096fdd610746c7118bc56e9c2a",
"sha256:aca81006366fb8fadc64c1ce90995ed08fe7bb075f55bed59631078fd2d76a04",
"sha256:78f46e6bb36750ff94d87a05c3f22778e909b4b035fa6d9cdd4dafd4c9ef49e2",
"sha256:744b1d0d4d965e72cec69405e23dafff1f162595697bace489699e9b3f5818ea",
"sha256:ebf73217e208a6ff5d9fe4ecdaed08f09767aaaecc50ac4a10cbdc050f4e056a",
"sha256:e8280656248d7c10aadc74e694bdb0947c3dbb096f9d6dc42e2441471b070e52",
"sha256:146b085b698bf480b35da4eac3a0bd8e331e002a9bafa69842867a879258b775"
],
"version": "==0.93"
},
"npre": {
"git": "https://github.com/nucypher/nucypher-pre-python",
"ref": "kms-dependency"
},
"py-ecc": {
"hashes": [
"sha256:4e80a68a7e04ea5671c174f128c22de645e77bc1eb8f28e5f74b42eee493d591"
],
"version": "==1.1.3"
},
"pycparser": {
"hashes": [
"sha256:99a8ca03e29851d96616ad0404b4aad7d9ee16f25c9f9708a11faf2810f7b226"
],
"version": "==2.18"
},
"pynacl": {
"hashes": [
"sha256:9558ef5c1ae45322c054d1d1151016e0463b4da8b5c746a675e99c5c7d8f4faa",
"sha256:301c966c1e17950e50d174ab4b2e7ef3e98ff51ad7a591152a19fe2139281eed",
"sha256:4d21d733a63637ddf41d0cab50135ec9f5224dd22fd10ebf5c5f5f946b833f84",
"sha256:99f91eb80b85fe16f70d362cfeae8eeeb108cd09a85f039fdab02164762f764b",
"sha256:57314a7bad4bd39501dc622942f9921923673e52e126b0fc4f0214b5d25d619a",
"sha256:c93d151efcdd7d214b1b11d781c9f1b125f0208cd06d9762bddabdfeac1cedfc",
"sha256:1b4938a557b32e5c6b27fac79a94cf1abb70753b5462a0b577bd2a77e09dacd0",
"sha256:506bc2591968a1a7b6577075bc29a591d8fff5bdfec03b0dd926f34b75b670e5",
"sha256:4c15d7cea1a313fff3f68222e682ee1f855e43c0865081cad7385066a6b57d75",
"sha256:c4ea0e3b9f3317ada56e12c7b37f6d0316900ae8b54a20d7b100d4e14350ac87",
"sha256:53d83faf274813a5778bba1cd4cb96b79f39e44a63b1c4a4dada01a2b0eeafe8",
"sha256:5172395dea8203ae124fd282fef3d242aa75366d66aebc0f5aab0c4753eed97b",
"sha256:877879903cddb5da317fe86d923f65eb28c62fd7feb79cd3402d166e401f9423",
"sha256:123c41df1db119397f2e26e9c63ca2ea853d3663e26b1c389bd3859dc1b7178a",
"sha256:ceb16b7977123713ad898450ca86a2dc6706a17fe4cf278ffb6b76929c186550",
"sha256:813d4170f62d68236bb041cf731e8d1f34fc1006a5e5d81139bead6ddaa9d169",
"sha256:f01405a5c453b866e35338c53882f7ba7069c1f4e4045ce67513ad45c796f8a5",
"sha256:4a3be9f884df08087996516707446ba55648bbefae8428bf578fa05f20fa2ed9",
"sha256:7d14f18f8bc43977691276097524b9713d21b9635fea9791311261a66e4fe296",
"sha256:9532aaa446840ece574c719ad3bbf25f60ca9871f48b5446e3f73e8b498e2398",
"sha256:67b75a950dbc4025bfa549c183baa17db4096955912f385df31830e5a2121974",
"sha256:dfc85c2b414dee700e32764559d560063825ec1470d3ee6c973e43c80a622e56",
"sha256:3fd984580cbea8e02fc531aa32ab9487b72c30127f9e4c8db9ba3fe8950ecc93",
"sha256:75a427377b2088c29a44db08c796c75a9cde2f9725dd041903cfbc0f6034895c",
"sha256:ca2deb968135f1400105ca902f5cef24ba6984b6a4904756498afcb9077c76f9",
"sha256:ffb74ac578b3b80b1d2d5a23a6dd7b1d6682e5fce6a7b3d21b46b180a5546055",
"sha256:b796d95704b674100bd99fc42bbde9f8f2ccddae8599a4d4bbcb518428dfbfed",
"sha256:32f52b754abf07c319c04ce16905109cab44b0e7f7c79497431d3b2000f8af8c"
],
"version": "==1.1.2"
},
"pysha3": {
"hashes": [
"sha256:6e6a84efb7856f5d760ee55cd2b446972cb7b835676065f6c4f694913ea8f8d9",
"sha256:f9046d59b3e72aa84f6dae83a040bd1184ebd7fef4e822d38186a8158c89e3cf",
"sha256:68c3a60a39f9179b263d29e221c1bd6e01353178b14323c39cc70593c30f21c5",
"sha256:59111c08b8f34495575d12e5f2ce3bafb98bea470bc81e70c8b6df99aef0dd2f",
"sha256:9fdd28884c5d0b4edfed269b12badfa07f1c89dbc5c9c66dd279833894a9896b",
"sha256:41be70b06c8775a9e4d4eeb52f2f6a3f356f17539a54eac61f43a29e42fd453d",
"sha256:571a246308a7b63f15f5aa9651f99cf30f2a6acba18eddf28f1510935968b603",
"sha256:93abd775dac570cb9951c4e423bcb2bc6303a9d1dc0dc2b7afa2dd401d195b24",
"sha256:11a2ba7a2e1d9669d0052fc8fb30f5661caed5512586ecbeeaf6bf9478ab5c48",
"sha256:5ec8da7c5c70a53b5fa99094af3ba8d343955b212bc346a0d25f6ff75853999f",
"sha256:9c778fa8b161dc9348dc5cc361e94d54aa5ff18413788f4641f6600d4893a608",
"sha256:fd7e66999060d079e9c0e8893e78d8017dad4f59721f6fe0be6307cd32127a07",
"sha256:827b308dc025efe9b6b7bae36c2e09ed0118a81f792d888548188e97b9bf9a3d",
"sha256:4416f16b0f1605c25f627966f76873e432971824778b369bd9ce1bb63d6566d9",
"sha256:c93a2676e6588abcfaecb73eb14485c81c63b94fca2000a811a7b4fb5937b8e8",
"sha256:684cb01d87ed6ff466c135f1c83e7e4042d0fc668fa20619f581e6add1d38d77",
"sha256:386998ee83e313b6911327174e088021f9f2061cbfa1651b97629b761e9ef5c4",
"sha256:c7c2adcc43836223680ebdf91f1d3373543dc32747c182c8ca2e02d1b69ce030",
"sha256:cd5c961b603bd2e6c2b5ef9976f3238a561c58569945d4165efb9b9383b050ef",
"sha256:0060a66be16665d90c432f55a0ba1f6480590cfb7d2ad389e688a399183474f0",
"sha256:fe988e73f2ce6d947220624f04d467faf05f1bbdbc64b0a201296bb3af92739e"
],
"version": "==1.0.2"
},
"rpcudp": {
"git": "https://github.com/nucypher/rpcudp",
"ref": "kms-dependency"
},
"six": {
"hashes": [
"sha256:832dc0e10feb1aa2c68dcc57dbb658f1c7e65b9b61af69048abc87a2db00a0eb",
"sha256:70e8a77beed4562e7f14fe23a786b54f6296e34344c23bc42f07b15018ff98e9"
],
"version": "==1.11.0"
}
},
"develop": {
"appdirs": {
"hashes": [
"sha256:d8b24664561d0d34ddfaec54636d502d7cea6e29c3eaf68f3df6180863e2166e",
"sha256:9e5896d1372858f8dd3344faf4e5014d21849c756c8d5701f78f8a103b372d92"
],
"version": "==1.4.3"
},
"coverage": {
"hashes": [
"sha256:c1456f66c536010cf9e4633a8853a9153e8fd588393695295afd4d0fc16c1d74",
"sha256:97a7ec51cdde3a386e390b159b20f247ccb478084d925c75f1faa3d26c01335e",
"sha256:83e955b975666b5a07d217135e7797857ce844eb340a99e46cc25525120417c4",
"sha256:483ed14080c5301048128bb027b77978c632dd9e92e3ecb09b7e28f5b92abfcf",
"sha256:ef574ab9640bcfa2f3c671831faf03f65788945fdf8efa4d4a1fffc034838e2a",
"sha256:c5a205b4da3c624f5119dc4d84240789b5906bb8468902ec22dcc4aad8aa4638",
"sha256:5dea90ed140e7fa9bc00463313f9bc4a6e6aff297b4969615e7a688615c4c4d2",
"sha256:f9e83b39d29c2815a38e4118d776b482d4082b5bf9c9147fbc99a3f83abe480a",
"sha256:700040c354f0230287906b1276635552a3def4b646e0145555bc9e2e5da9e365",
"sha256:7f1eacae700c66c3d7362a433b228599c9d94a5a3a52613dddd9474e04deb6bc",
"sha256:13ef9f799c8fb45c446a239df68034de3a6f3de274881b088bebd7f5661f79f8",
"sha256:dfb011587e2b7299112f08a2a60d2601706aac9abde37aa1177ea825adaed923",
"sha256:381be5d31d3f0d912334cf2c159bc7bea6bfe6b0e3df6061a3bf2bf88359b1f6",
"sha256:83a477ac4f55a6ef59552683a0544d47b68a85ce6a80fd0ca6b3dc767f6495fb",
"sha256:dfd35f1979da31bcabbe27bcf78d4284d69870731874af629082590023a77336",
"sha256:9681efc2d310cfc53863cc6f63e88ebe7a48124550fa822147996cb09390b6ab",
"sha256:53770b20ac5b4a12e99229d4bae57af0945be87cc257fce6c6c7571a39f0c5d4",
"sha256:8801880d32f11b6df11c32a961e186774b4634ae39d7c43235f5a24368a85f07",
"sha256:16db2c69a1acbcb3c13211e9f954e22b22a729909d81f983b6b9badacc466eda",
"sha256:ef43a06a960b46c73c018704051e023ee6082030f145841ffafc8728039d5a88",
"sha256:c3e2736664a6074fc9bd54fb643f5af0fc60bfedb2963b3d3f98c7450335e34c",
"sha256:17709e22e4c9f5412ba90f446fb13b245cc20bf4a60377021bbff6c0f1f63e7c",
"sha256:a2f7106d1167825c4115794c2ba57cc3b15feb6183db5328fa66f94c12902d8b",
"sha256:2a08e978f402696c6956eee9d1b7e95d3ad042959b71bafe1f3e4557cbd6e0ac",
"sha256:57f510bb16efaec0b6f371b64a8000c62e7e3b3e48e8b0a5745ade078d849814",
"sha256:0f1883eab9c19aa243f51308751b8a2a547b9b817b721cc0ecf3efb99fafbea7",
"sha256:e00fe141e22ce6e9395aa24d862039eb180c6b7e89df0bbaf9765e9aebe560a9",
"sha256:ec596e4401553caa6dd2e3349ce47f9ef82c1f1bcba5d8ac3342724f0df8d6ff",
"sha256:c820a533a943ebc860acc0ce6a00dd36e0fdf2c6f619ff8225755169428c5fa2",
"sha256:b7f7283eb7badd2b8a9c6a9d6eeca200a0a24db6be79baee2c11398f978edcaa",
"sha256:a5ed27ad3e8420b2d6b625dcbd3e59488c14ccc06030167bcf14ffb0f4189b77",
"sha256:d7b70b7b4eb14d0753d33253fe4f121ca99102612e2719f0993607deb30c6f33",
"sha256:4047dc83773869701bde934fb3c4792648eda7c0e008a77a0aec64157d246801",
"sha256:7a9c44400ee0f3b4546066e0710e1250fd75831adc02ab99dda176ad8726f424",
"sha256:0f649e68db74b1b5b8ca4161d08eb2b8fa8ae11af1ebfb80e80e112eb0ef5300",
"sha256:52964fae0fafef8bd283ad8e9a9665205a9fdf912535434defc0ec3def1da26b",
"sha256:36aa6c8db83bc27346ddcd8c2a60846a7178ecd702672689d3ea1828eb1a4d11",
"sha256:9824e15b387d331c0fc0fef905a539ab69784368a1d6ac3db864b4182e520948",
"sha256:4a678e1b9619a29c51301af61ab84122e2f8cc7a0a6b40854b808ac6be604300",
"sha256:8bb7c8dca54109b61013bc4114d96effbf10dea136722c586bce3a5d9fc4e730",
"sha256:1a41d621aa9b6ab6457b557a754d50aaff0813fad3453434de075496fca8a183",
"sha256:0fa423599fc3d9e18177f913552cdb34a8d9ad33efcf52a98c9d4b644edb42c5",
"sha256:e61a4ba0b2686040cb4828297c7e37bcaf3a1a1c0bc0dbe46cc789dde51a80fa",
"sha256:ce9ef0fc99d11d418662e36fd8de6d71b19ec87c2eab961a117cc9d087576e72"
],
"version": "==4.4.1"
},
"decorator": {
"hashes": [
"sha256:95a26b17806e284452bfd97fa20aa1e8cb4ee23542bda4dbac5e4562aa1642cd",
"sha256:7cb64d38cb8002971710c8899fbdfb859a23a364b7c99dab19d1f719c2ba16b5"
],
"version": "==4.1.2"
},
"enum34": {
"hashes": [
"sha256:6bd0f6ad48ec2aa117d3d141940d484deccda84d4fcd884f5c3d93c23ecd8c79",
"sha256:644837f692e5f550741432dd3f223bbb9852018674981b1664e5dc339387588a",
"sha256:8ad8c4783bf61ded74527bffb48ed9b54166685e4230386a9ed9b1279e2df5b1",
"sha256:2d81cbbe0e73112bdfe6ef8576f2238f2ba27dd0d55752a776c41d38b7da2850"
],
"version": "==1.1.6"
},
"fancycompleter": {
"hashes": [
"sha256:5044bf91766dde3addfea81aaf36bacce89e1a872a10567f57e51f981c531eb7"
],
"version": "==0.7"
},
"ipython": {
"hashes": [
"sha256:0faac098d0e5a79272d1a8dd95d568c7ae7a823c9b21b1bca5800541aa994e6f",
"sha256:81b0d6936f87002e6972eccc7e4085f5c2d0673decff22724b53cf34809ffacf"
],
"version": "==6.2.0"
},
"ipython-genutils": {
"hashes": [
"sha256:72dd37233799e619666c9f639a9da83c34013a73e8bbc79a7a6348d93c61fab8",
"sha256:eb2e116e75ecef9d4d228fdc66af54269afa26ab4463042e33785b887c628ba8"
],
"version": "==0.2.0"
},
"jedi": {
"hashes": [
"sha256:3af518490ffcd00a3074c135b42511e081575e9abd115c216a34491411ceebb0",
"sha256:f6d5973573e76b1fd2ea75f6dcd6445d02d41ff3af5fc61b275b4e323d1dd396"
],
"version": "==0.11.0"
},
"parso": {
"hashes": [
"sha256:b573acb69f66a970197b5fdbbdfad3b8a417a520e383133b2b4e708f104bfc9a",
"sha256:c5279916bb417aa2bf634648ff895cf35dce371d7319744884827bfad06f8d7b"
],
"version": "==0.1.0"
},
"pathlib2": {
"hashes": [
"sha256:db3e43032d23787d3e9aec8c7ef1e0d2c3c589d5f303477661ebda2ca6d4bfba",
"sha256:d32550b75a818b289bd4c1f96b60c89957811da205afcceab75bc8b4857ea5b3"
],
"version": "==2.3.0"
},
"pdbpp": {
"hashes": [
"sha256:4a8099079150bbd6b6eedcd6cc42573871bec7d7e7e094feeaca01a62f65959c"
],
"version": "==0.9.1"
},
"pexpect": {
"hashes": [
"sha256:f853b52afaf3b064d29854771e2db509ef80392509bde2dd7a6ecf2dfc3f0018",
"sha256:3d132465a75b57aa818341c6521392a06cc660feb3988d7f1074f39bd23c9a92"
],
"version": "==4.2.1"
},
"pickleshare": {
"hashes": [
"sha256:c9a2541f25aeabc070f12f452e1f2a8eae2abd51e1cd19e8430402bdf4c1d8b5",
"sha256:84a9257227dfdd6fe1b4be1319096c20eb85ff1e82c7932f36efccfe1b09737b"
],
"version": "==0.7.4"
},
"prompt-toolkit": {
"hashes": [
"sha256:3f473ae040ddaa52b52f97f6b4a493cfa9f5920c255a12dc56a7d34397a398a4",
"sha256:1df952620eccb399c53ebb359cc7d9a8d3a9538cb34c5a1344bdbeb29fbcc381",
"sha256:858588f1983ca497f1cf4ffde01d978a3ea02b01c8a26a8bbc5cd2e66d816917"
],
"version": "==1.0.15"
},
"ptyprocess": {
"hashes": [
"sha256:e8c43b5eee76b2083a9badde89fd1bbce6c8942d1045146e100b7b5e014f4f1a",
"sha256:e64193f0047ad603b71f202332ab5527c5e52aa7c8b609704fc28c0dc20c4365"
],
"version": "==0.5.2"
},
"py": {
"hashes": [
"sha256:2ccb79b01769d99115aa600d7eed99f524bf752bba8f041dc1c184853514655a",
"sha256:0f2d585d22050e90c7d293b6451c83db097df77871974d90efd5a30dc12fcde3"
],
"version": "==1.4.34"
},
"pygments": {
"hashes": [
"sha256:78f3f434bcc5d6ee09020f92ba487f95ba50f1e3ef83ae96b9d5ffa1bab25c5d",
"sha256:dbae1046def0efb574852fab9e90209b23f556367b5a320c0bcb871c77c3e8cc"
],
"version": "==2.2.0"
},
"pyrepl": {
"hashes": [
"sha256:3bcbbf1e47d2b80819b805aceea16dc90832ba4800035d595fa3c4bf48fcd4d7"
],
"version": "==0.8.4"
},
"pytest": {
"hashes": [
"sha256:b84f554f8ddc23add65c411bf112b2d88e2489fd45f753b1cae5936358bdf314",
"sha256:f46e49e0340a532764991c498244a60e3a37d7424a532b3ff1a6a7653f1a403a"
],
"version": "==3.2.2"
},
"pytest-cov": {
"hashes": [
"sha256:890fe5565400902b0c78b5357004aab1c814115894f4f21370e2433256a3eeec",
"sha256:03aa752cf11db41d281ea1d807d954c4eda35cfa1b21d6971966cc041bbf6e2d"
],
"version": "==2.5.1"
},
"scandir": {
"hashes": [
"sha256:c2612d1a487d80fb4701b4a91ca1b8f8a695b1ae820570815e85e8c8b23f1283"
],
"version": "==1.5"
},
"simplegeneric": {
"hashes": [
"sha256:dc972e06094b9af5b855b3df4a646395e43d1c9d0d39ed345b7393560d0b9173"
],
"version": "==0.8.1"
},
"six": {
"hashes": [
"sha256:832dc0e10feb1aa2c68dcc57dbb658f1c7e65b9b61af69048abc87a2db00a0eb",
"sha256:70e8a77beed4562e7f14fe23a786b54f6296e34344c23bc42f07b15018ff98e9"
],
"version": "==1.11.0"
},
"traitlets": {
"hashes": [
"sha256:c6cb5e6f57c5a9bdaa40fa71ce7b4af30298fbab9ece9815b5d995ab6217c7d9",
"sha256:9c4bd2d267b7153df9152698efb1050a5d84982d3384a37b2c1f7723ba3e7835"
],
"version": "==4.3.2"
},
"typing": {
"hashes": [
"sha256:349b1f9c109c84b53ac79ac1d822eaa68fc91d63b321bd9392df15098f746f53",
"sha256:63a8255fe7c6269916baa440eb9b6a67139b0b97a01af632e7bd2842e1e02f15",
"sha256:d514bd84b284dd3e844f0305ac07511f097e325171f6cc4a20878d11ad771849"
],
"version": "==3.6.2"
},
"wcwidth": {
"hashes": [
"sha256:f4ebe71925af7b40a864553f761ed559b43544f8f71746c2d756c7fe788ade7c",
"sha256:3df37372226d6e63e1b1e1eda15c594bca98a22d33a23832a90998faa96bc65e"
],
"version": "==0.1.7"
},
"wmctrl": {
"hashes": [
"sha256:d806f65ac1554366b6e31d29d7be2e8893996c0acbb2824bbf2b1f49cf628a13"
],
"version": "==0.3"
}
}
}

View File

@ -1,11 +1,11 @@
from io import BytesIO
import msgpack
from nacl import utils
from nkms.network import dummy
from nkms.crypto.keyring import KeyRing
from nkms.crypto.storage import EncryptedFile, Header
from nkms.crypto import (default_algorithm, pre_from_algorithm,
symmetric_from_algorithm)
from io import BytesIO
from nkms.crypto.keyring import KeyRing
from nkms.network import dummy
class Client(object):

10
nkms/crypto/hash.py Normal file
View File

@ -0,0 +1,10 @@
import sha3
# TODO: Replace these with actual hash functions.
def signature_hash(hash_input):
return sha3.keccak_256(hash_input).digest()
def content_hash(hash_input):
return sha3.keccak_256(hash_input).digest()

12
nkms/crypto/pre/keygen.py Normal file
View File

@ -0,0 +1,12 @@
# TODO: Make this actually work.
def generate_re_encryption_keys(seckey_enc_alice,
pubkey_enc_bob,
m,
n):
kfrags = [
'sfasdfsd9',
'dfasd09fi',
'sdfksd3f9',
]
return kfrags

0
nkms/policy/__init__.py Normal file
View File

1
nkms/policy/constants.py Normal file
View File

@ -0,0 +1 @@
UNKNOWN_KFRAG = 550

116
nkms/policy/models.py Normal file
View File

@ -0,0 +1,116 @@
from nkms.crypto.hash import content_hash
from nkms.crypto.pre.keygen import generate_re_encryption_keys
from nkms.policy.constants import UNKNOWN_KFRAG
class PolicyManager(object):
pass
class PolicyManagerForAlice(PolicyManager):
def __init__(self, keychain_alice: "KeyChain"):
self.keychain_alice = keychain_alice
def create_policy_group(self,
pubkey_enc_bob: tuple,
uri: bytes,
m: int,
n: int
):
"""
Alice dictates a new group of policies.
"""
re_enc_keys = generate_re_encryption_keys(self.keychain_alice.enc_keypair.priv_key,
pubkey_enc_bob,
m,
n)
policies = []
for kfrag_id, key in enumerate(re_enc_keys):
policy = Policy.from_alice(
key, # Bob won't know this.
self.keychain_alice.sig_keypair.pub_key,
pubkey_enc_bob,
uri, # Ursula won't know this.
kfrag_id,
)
policies.append(policy)
return PolicyGroup(policies)
class PolicyGroup(object):
"""
The terms and conditions by which Alice shares with Bob.
"""
def __init__(self, policies=None):
self.policies = policies or []
def transmit(self, networky_stuff):
for policy in self.policies:
policy_offer = policy.craft_offer(networky_stuff)
result = networky_stuff.transmit_offer(policy.ursula, policy_offer)
if result.was_accepted:
policy.update_treasure_map(result)
class Policy(object):
"""
An individual agreement between Alice and Ursula. Together, all of the Policies by which
Ursula nodes which enter into an agreement regarding the same series of kFrags constitute
a PolicyGroup.
A Policy has a unique ID, which includes a fingerprint of Alice's public key so that
only she can set a policy with that ID. Ursula must verify this; otherwise a collision
attack is possible.
"""
ursula = None
hashed_part = None
def __init__(self, kfrag=UNKNOWN_KFRAG, challenge_size=20):
self.kfrag = kfrag
self.challenge_size = challenge_size
self.treasure_map = []
@staticmethod
def from_alice(kfrag,
pubkey_sig_alice,
pubkey_enc_bob,
uri,
kfrag_id
):
policy = Policy(kfrag)
policy.generate_challenge_pack()
policy.hash(pubkey_sig_alice=pubkey_sig_alice, hash_input=(pubkey_enc_bob, uri, kfrag_id))
return policy
def hash(self, pubkey_sig_alice, hash_input):
hash_input = str(hash_input).encode()
self.hashed_part = content_hash(hash_input)
hash_input_for_id = str(pubkey_sig_alice).encode() + str(self.hashed_part).encode()
self.id = content_hash(hash_input_for_id)
return self.id
def craft_offer(self, networky_stuff):
"""
Find an Ursula and craft an offer for her.
"""
self.ursula = networky_stuff.find_ursula(self.id, self.hashed_part)
return self.ursula.encrypt_for((self.kfrag, self.challenge_pack, self.treasure_map))
def generate_challenge_pack(self):
if self.kfrag == UNKNOWN_KFRAG:
raise TypeError(
"Can't generate a challenge pack unless we know the kfrag. Are you Alice?")
# TODO: make this work instead of being random.
import random
self.challenge_pack = [(random.getrandbits(32), random.getrandbits(32)) for x in
range(self.challenge_size)]
return True
def update_treasure_map(self, policy_offer_result):
# TODO: parse the result and add the node information to the treasure map.
self.treasure_map.append(policy_offer_result)

View File

@ -23,7 +23,7 @@ TESTS_REQUIRE = [
LINKS = [
'https://github.com/nucypher/kademlia/archive/kms-dependency.tar.gz#egg=kademlia-1.0',
'https://github.com/bmuller/rpcudp/archive/python3.5.tar.gz#egg=rpcudp-3.0.0',
'https://github.com/nucypher/nucypher-pre-python/archive/0.3.tar.gz#egg=npre-0.3']
'https://github.com/nucypher/nucypher-pre-python@kms-dependency#egg=npre']
setup(name='nkms',
version='0.1',

0
tests/__init__.py Normal file
View File

View File

@ -15,6 +15,7 @@ class TestClient(unittest.TestCase):
self.client = Client()
@unittest.skip(reason="Tux is going to revisit this.")
def test_derive_path_key(self):
path = b'/foo/bar'
pub_path_key = self.client._derive_path_key(path, is_pub=True)
@ -35,6 +36,7 @@ class TestClient(unittest.TestCase):
self.assertEqual(subdirs[2], b'/foo/bar')
self.assertEqual(subdirs[3], b'/foo/bar/test.jpg')
@unittest.skip(reason="Tux is going to revisit this.")
def test_build_header_prealpha(self):
enc_keys = [random(148), random(148), random(148)]
version = 100
@ -52,6 +54,7 @@ class TestClient(unittest.TestCase):
self.assertIn(version.to_bytes(4, byteorder='big'), header)
@unittest.skip(reason="Tux is going to revisit this.")
def test_read_header_prealpha(self):
enc_keys = [random(148), random(148), random(148)]
version = 100
@ -77,6 +80,7 @@ class TestClient(unittest.TestCase):
for key in header[1]:
self.assertIn(key, enc_keys)
@unittest.skip(reason="Tux is going to revisit this.")
def test_encrypt_key_with_path_tuple(self):
key = random(32)
path = b'/foo/bar'
@ -85,6 +89,7 @@ class TestClient(unittest.TestCase):
self.assertEqual(3, len(enc_keys))
self.assertTrue(key not in enc_keys)
@unittest.skip(reason="Tux is going to revisit this.")
def test_encrypt_key_with_path_string(self):
key = random(32)
path = b'foobar'
@ -92,6 +97,7 @@ class TestClient(unittest.TestCase):
enc_key = self.client.encrypt_key(key, path=path)
self.assertNotEqual(key, enc_key)
@unittest.skip(reason="Tux is going to revisit this.")
def test_encrypt_key_no_path(self):
key = random(32)
@ -104,6 +110,7 @@ class TestClient(unittest.TestCase):
self.assertNotEqual(key, enc_key_2)
self.assertNotEqual(enc_key_1, enc_key_2)
@unittest.skip(reason="Tux is going to revisit this.")
def test_decrypt_key_with_path(self):
key = random(32)
path = b'/foo/bar'
@ -120,6 +127,7 @@ class TestClient(unittest.TestCase):
dec_key = self.client.decrypt_key(enc_key, path=subpaths[idx])
self.assertEqual(key, dec_key)
@unittest.skip(reason="Tux is going to revisit this.")
def test_decrypt_key_no_path(self):
key = random(32)
@ -129,6 +137,7 @@ class TestClient(unittest.TestCase):
dec_key = self.client.decrypt_key(enc_key)
self.assertEqual(key, dec_key)
@unittest.skip(reason="Tux is going to revisit this.")
def test_encrypt_bulk(self):
test_data = b'hello world!'
key = random(32)
@ -136,6 +145,7 @@ class TestClient(unittest.TestCase):
enc_data = self.client.encrypt_bulk(test_data, key)
self.assertNotEqual(test_data, enc_data)
@unittest.skip(reason="Tux is going to revisit this.")
def test_decrypt_bulk(self):
test_data = b'hello world!'
nonce_size_bytes = 24

View File

@ -0,0 +1,46 @@
from nkms.crypto.keyring import KeyRing
from nkms.policy.models import PolicyGroup, PolicyManagerForAlice
class MockUrsula(object):
def encrypt_for(self, payload):
# TODO: Make this a testable result
import random
return random.getrandbits(32)
class MockPolicyOfferResponse(object):
was_accepted = True
class MockNetworkyStuff(object):
def transmit_offer(self, ursula, policy_offer):
return MockPolicyOfferResponse()
def find_ursula(self, id, hashed_part):
return MockUrsula()
def test_alice_has_ursulas_public_key_and_uses_it_to_encode_policy_payload():
keychain_alice = KeyRing()
keychain_bob = KeyRing()
keychain_ursula = KeyRing()
# For example, a hashed path.
resource_id = b"as098duasdlkj213098asf"
# Alice runs this to get a policy object.
policy_manager = PolicyManagerForAlice(keychain_alice)
policy_group = policy_manager.create_policy_group(
keychain_bob.enc_keypair.pub_key,
resource_id,
m=20,
n=50
)
networky_stuff = MockNetworkyStuff()
policy_group.transmit(networky_stuff)

View File

@ -1,15 +1,14 @@
import asyncio
import pytest
# Kademlia emits a bunch of useful logging info; uncomment below to see it.
import logging
from nkms.network.server import NuCypherSeedOnlyDHTServer, NuCypherDHTServer
# Kademlia emits a bunch of useful logging info; uncomment below to see it.
import logging
logging.basicConfig(level=logging.DEBUG)
import pytest
@pytest.mark.skip(reason="Strange. This appeared to be fixed in ab6cbaead69c9e0073de13c36078b09997d2a6ff, but still sometimes fails.")
def test_seed_only_node_does_not_store_anything():
"""
Shows that when we set up two nodes, a "full" node and a "seed-only" node,
@ -66,6 +65,7 @@ def test_seed_only_node_does_not_store_anything():
event_loop.close()
@pytest.mark.skip(reason="Strange. This appeared to be fixed in ab6cbaead69c9e0073de13c36078b09997d2a6ff, but still sometimes fails.")
def test_full_node_does_not_try_to_store_on_seed_only_node():
"""
A full node is able to determine that a seed-only node does not have the capability