{ "info": { "author": "Ryan Kung", "author_email": "ryankung@ieee.org", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Environment :: Console", "Operating System :: OS Independent", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy", "Topic :: Security :: Cryptography", "Topic :: Software Development", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "Klefki\n===================\n\n[![travis](https://api.travis-ci.com/ZeroProphet/klefki.svg)](https://travis-ci.com/github/ZeroProphet/klefki)\n[![Maintenance](https://img.shields.io/badge/Maintained%3F-yes-green.svg)](https://GitHub.com/RyanKung/klefki/graphs/commit-activity)\n[![PyPI version klefki](https://badge.fury.io/py/klefki.svg)](https://pypi.python.org/pypi/klefki/)\n[![PyPI license](https://img.shields.io/pypi/l/klefki.svg)](https://pypi.python.org/pypi/klefki/)\n[![PyPI status](https://img.shields.io/pypi/status/klefki.svg)](https://pypi.python.org/pypi/klefki/)\n[![Generic badge](https://img.shields.io/badge/Document-passing-blue.svg)](https://zeroprophet.github.io/klefki/)\n\n![klefki](res/707Klefki.png)\n\n----------------------\n\n> Klefki (Japanese: \u30af\u30ec\u30c3\u30d5\u30a3 Cleffy) is a dual-type Steel/Fairy Pok\u00e9mon introduced in Generation VI. It is not known to evolve into or from any other Pok\u00e9mon.\n\n----------------------\n\n# TL; DR\n\n**Klefki is a playground for researching elliptic curve group based algorithms & applications, such as MPC, HE, ZKP, and Bitcoin/Ethereum. All data types & structures are based on mathematical defination of abstract algebra.**\n\n#### [Check the Document](https://ryankung.github.io/klefki)\n\n#### [Try it!](https://repl.it/@RyanKung/Klefki-Demo)\n\n\n#### For Installation (require python>=3.6):\n\n```shell\npip3 install klefki\n\nklefki shell\n```\n\nHave Fun!!!!\n\n## Elliptic Curve Group Example\n\n* Test pairing\n\n```python\nfrom klefki.curves.barreto_naehrig import bn128\n\nG1 = bn128.ECGBN128.G1\nG2 = bn128.ECGBN128.G2\nG = G1\ne = bn128.ECGBN128.e\n\none = bn128.BN128FP12.one()\np1 = e(G2, G1)\np2 = e(G2, G1 @ 2)\nassert p1 * p1 == p2\n```\n\n* Create Custom Groups\n\n```python\nimport klefki.const as const\nfrom klefki.algebra.fields import FiniteField\nfrom klefki.algebra.groups import EllipticCurveGroup\nfrom klefki.algebra.groups import EllipicCyclicSubgroup\nfrom klefki.curves.arith import short_weierstrass_form_curve_addition2\n\n\nclass FiniteFieldSecp256k1(FiniteField):\n P = const.SECP256K1_P\n\n\nclass FiniteFieldCyclicSecp256k1(FiniteField):\n P = const.SECP256K1_N\n\n\nclass EllipticCurveGroupSecp256k1(EllipticCurveGroup):\n \"\"\"\n y^2 = x^3 + A * x + B\n \"\"\"\n\n N = const.SECP256K1_N\n A = const.SECP256K1_A\n B = const.SECP256K1_B\n\n def op(self, g):\n field = self.id[0].__class__\n x, y = short_weierstrass_form_curve_addition2(\n self.x, self.y,\n g.x, g.y,\n field.zero(),\n field.zero(),\n field.zero(),\n field(self.A),\n field(self.B),\n field\n )\n if x == y == field(0):\n return self.__class__(0)\n return self.__class__((x, y))\n\n```\n\n\n## ZKP Examples\n\n* Play with r1cs\n\n```python\nfrom klefki.zkp.r1cs import R1CS\nfrom functools import partial\n\n\n\n@R1CS.r1cs\ndef t(x):\n y = x**3\n return y + x + 5\n\n\ns = t.witness(3)\nassert R1CS.verify(s, *t.r1cs)\nassert s[2] == t(3)\n```\n\n\n## MPC Examples (SSSS/VSS)\n\n```\nfrom klefki.crypto.ssss import SSSS\nfrom klefki.const import SECP256K1_P as P\nfrom klefki.algebra.utils import randfield\nfrom klefki.algebra.meta import field\nimport random\n\n\ndef test_ssss():\n F = field(P)\n s = SSSS(F)\n k = random.randint(1, 100)\n n = k * 3\n secret = randfield(F)\n\n s.setup(secret, k, n)\n\n assert s.decrypt([s.join() for _ in range(k-1)]) != secret\n assert s.decrypt([s.join() for _ in range(k+1)]) == secret\n assert s.decrypt([s.join() for _ in range(k+2)]) == secret\n\n```\n\n\n## PubKey/PrivKey Examples\n\nWith `AAT(Abstract Algebra Type)` you can easily implement the bitcoin `priv/pub key` and `sign/verify` algorithms like this:\n\n```python\n\nimport random\nfrom klefki.utils import to_sha256int\nfrom klefki.algebra.concrete import (\n JacobianGroupSecp256k1 as JG,\n EllipticCurveCyclicSubgroupSecp256k1 as CG,\n EllipticCurveGroupSecp256k1 as ECG,\n FiniteFieldCyclicSecp256k1 as CF\n)\n\n\nN = CG.N\nG = CG.G\n\n\ndef random_privkey() -> CF:\n return CF(random.randint(1, N))\n\n\ndef pubkey(priv: CF) -> ECG:\n return ECG(JG(G @ priv))\n\n\ndef sign(priv: CF, m: str) -> tuple:\n k = CF(random.randint(1, N))\n z = CF(to_sha256int(m))\n r = CF((G @ k).value[0]) # From Secp256k1Field to CyclicSecp256k1Field\n s = z / k + priv * r / k\n return r, s\n\n\n\ndef verify(pub: ECG, sig: tuple, mhash: int):\n r, s = sig\n z = CF(mhash)\n u1 = z / s\n u2 = r / s\n rp = G @ u1 + pub @ u2\n return r == rp.value[0]\n\n```\n\nEven proof the `Sign/Verify` algorithm mathematically.\n\n\n```python\ndef proof():\n priv = random_privkey()\n m = 'test'\n k = CF(random_privkey())\n z = CF(to_sha256int(m))\n r = CF((G @ k).value[0])\n s = z / k + priv * r / k\n\n assert k == z / s + priv * r / s\n assert G @ k == G @ (z / s + priv * r / s)\n assert G @ k == G @ (z / s) + G @ priv @ (r / s)\n\n pub = G @ priv\n assert pub == pubkey(priv)\n assert G @ k == G @ (z / s) + pub @ (r / s)\n u1 = z / s\n u2 = r / s\n assert G @ k == G @ u1 + pub @ u2\n\n\n```\n\nOr transform your Bitcoin Private Key to EOS Private/Pub key (or back)\n\n```python\nfrom klefki.bitcoin.private import decode_privkey\nfrom klefki.eos.public import gen_pub_key\nfrom klefki.eos.private import encode_privkey\n\n\ndef test_to_eos(priv):\n key = decode_privkey(priv)\n eos_priv = encode_privkey(key)\n eos_pub = gen_pub_key(key)\n print(eos_priv, eos_pub)\n\n```\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/ZeroProphet/klefki", "keywords": "", "license": "GPL", "maintainer": "", "maintainer_email": "", "name": "klefki", "package_url": "https://pypi.org/project/klefki/", "platform": "", "project_url": "https://pypi.org/project/klefki/", "project_urls": { "Homepage": "https://github.com/ZeroProphet/klefki" }, "release_url": "https://pypi.org/project/klefki/1.7.1/", "requires_dist": [ "pyasn1 (==0.3.7)", "base58 (==0.2.5)", "asn1ate (==0.6.0)", "pysha3 (==1.0.2)", "flatbuffers (==1.12)" ], "requires_python": "", "summary": "Klefki is a playground for researching elliptic curve group based algorithms & applications, such as MPC, HE, ZKP, and Bitcoin/Ethereum. All data types & structures are based on mathematical defination of abstract algebra.", "version": "1.7.1", "yanked": false, "yanked_reason": null }, "last_serial": 9702408, "releases": { "0.0.1": [ { "comment_text": "", "digests": { "md5": "217b994fcd79a3182b6ccb2853d1204f", "sha256": "ed88dd42e93ae2873048d82d1dac44c59fe5767be2faddfedbe02404d7bb2562" }, "downloads": -1, "filename": "klefki-0.0.1.tar.gz", "has_sig": false, "md5_digest": "217b994fcd79a3182b6ccb2853d1204f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10013, "upload_time": "2017-11-23T16:34:22", "upload_time_iso_8601": "2017-11-23T16:34:22.692611Z", "url": "https://files.pythonhosted.org/packages/11/c3/eff49363071444969a91becc4a629148e4f2511f92ff43fdf8733efcab33/klefki-0.0.1.tar.gz", "yanked": false, "yanked_reason": null } ], "0.0.2": [ { "comment_text": "", "digests": { "md5": "659f71abb56df68f7ef56f9fb59fbe95", "sha256": "4d7a9299cb5e74bec24ca042a441428d361fd76e309ff682c1c2c4e408e2c9ec" }, "downloads": -1, "filename": "klefki-0.0.2.tar.gz", "has_sig": false, "md5_digest": "659f71abb56df68f7ef56f9fb59fbe95", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12879, "upload_time": "2018-05-22T12:42:20", "upload_time_iso_8601": "2018-05-22T12:42:20.216338Z", "url": "https://files.pythonhosted.org/packages/63/99/12ab2f7b94f0cd6c5b9f8cbdcc517b8663a96adc699e2fdc4f75b8742c5d/klefki-0.0.2.tar.gz", "yanked": false, "yanked_reason": null } ], "0.0.2.1": [ { "comment_text": "", "digests": { "md5": "6de78d8b309ef38b6be663a23f060b89", "sha256": "5bf70fc8c051321ab0c8d7b333a54f23eb357e160e14ed9607d7166cb2390b11" }, "downloads": -1, "filename": "klefki-0.0.2.1.tar.gz", "has_sig": false, "md5_digest": "6de78d8b309ef38b6be663a23f060b89", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13069, "upload_time": "2018-05-27T09:02:32", "upload_time_iso_8601": "2018-05-27T09:02:32.193804Z", "url": "https://files.pythonhosted.org/packages/10/68/b443d2c9917810bc30466d7457fa3429353392597145516896b670c6ea2f/klefki-0.0.2.1.tar.gz", "yanked": false, "yanked_reason": null } ], "0.0.2.2": [ { "comment_text": "", "digests": { "md5": "b21b29272dee3bfadd188ffe7749bb14", "sha256": "4b8a23754ebff0b53cb6617f9a6a086edcb6e209f4b8120d0e09de6b296fb9fd" }, "downloads": -1, "filename": "klefki-0.0.2.2.tar.gz", "has_sig": false, "md5_digest": "b21b29272dee3bfadd188ffe7749bb14", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13081, "upload_time": "2018-05-31T15:49:23", "upload_time_iso_8601": "2018-05-31T15:49:23.989645Z", "url": "https://files.pythonhosted.org/packages/07/ad/0af1f39e861c67ec797d144edc2f2db297347c668112134d4749c8b597fe/klefki-0.0.2.2.tar.gz", "yanked": false, "yanked_reason": null } ], "0.0.2.3": [ { "comment_text": "", "digests": { "md5": "9c31a1a3fcd6ba474ad7245467ce47ee", "sha256": "d4ccde56fe646e3eedc0272972d7713346203cb9c1f0fa835889eb3f176b2e19" }, "downloads": -1, "filename": "klefki-0.0.2.3.tar.gz", "has_sig": false, "md5_digest": "9c31a1a3fcd6ba474ad7245467ce47ee", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13527, "upload_time": "2018-07-19T08:22:13", "upload_time_iso_8601": "2018-07-19T08:22:13.501797Z", "url": "https://files.pythonhosted.org/packages/f7/f5/20585089bfa328b375f7021de42b09035d6c0b8a32a0868164e75a17185a/klefki-0.0.2.3.tar.gz", "yanked": false, "yanked_reason": null } ], "0.0.3": [ { "comment_text": "", "digests": { "md5": "557e1ac6e51c1fc18fa4ff5b0842c97e", "sha256": "a5c293ef229ac702f786c44038eade28fe25b9b1998e3aea56ce2209727408cf" }, "downloads": -1, "filename": "klefki-0.0.3.tar.gz", "has_sig": false, "md5_digest": "557e1ac6e51c1fc18fa4ff5b0842c97e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13526, "upload_time": "2018-07-19T08:22:37", "upload_time_iso_8601": "2018-07-19T08:22:37.553335Z", "url": "https://files.pythonhosted.org/packages/0a/fd/55669af078a43c5f385c95b6284879dc8643f3678c918f8f1093c6de89f5/klefki-0.0.3.tar.gz", "yanked": false, "yanked_reason": null } ], "0.0.3.1": [ { "comment_text": "", "digests": { "md5": "5173abe4c7317027246ba4f2fb837879", "sha256": "ada1f5985d5395fbe51b99c4d901fde3a3887164afa1e5b0d9c2574c83cead6c" }, "downloads": -1, "filename": "klefki-0.0.3.1.tar.gz", "has_sig": false, "md5_digest": "5173abe4c7317027246ba4f2fb837879", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13607, "upload_time": "2018-07-26T11:16:42", "upload_time_iso_8601": "2018-07-26T11:16:42.752006Z", "url": "https://files.pythonhosted.org/packages/d0/57/9a943ce94487d030ecfc1b494b52b82f8664cec1d56f1e26ac77562edcf5/klefki-0.0.3.1.tar.gz", "yanked": false, "yanked_reason": null } ], "0.0.3.2": [ { "comment_text": "", "digests": { "md5": "44c8ec5872a08197124be9d8c283f841", "sha256": "b2d2bdeecdf4a0d3a72bcd9743708627a2213caa59f5b6e7b30fb9b8c1b3c5ae" }, "downloads": -1, "filename": "klefki-0.0.3.2.tar.gz", "has_sig": false, "md5_digest": "44c8ec5872a08197124be9d8c283f841", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13732, "upload_time": "2018-09-25T10:34:10", "upload_time_iso_8601": "2018-09-25T10:34:10.181174Z", "url": "https://files.pythonhosted.org/packages/a0/b0/a2e63277d4b72720a156f2654ef87007332c39de24ba83230d882bcb02b3/klefki-0.0.3.2.tar.gz", "yanked": false, "yanked_reason": null } ], "0.0.4.0": [ { "comment_text": "", "digests": { "md5": "74fed7274b7b894700de641c130e5528", "sha256": "90fe3fb0edab74beea759162b2701395152747d183d8c15bb7d8748984b90dea" }, "downloads": -1, "filename": "klefki-0.0.4.0.tar.gz", "has_sig": false, "md5_digest": "74fed7274b7b894700de641c130e5528", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14326, "upload_time": "2018-09-25T14:31:12", "upload_time_iso_8601": "2018-09-25T14:31:12.488617Z", "url": "https://files.pythonhosted.org/packages/1c/77/a39a294186769938e36b61e3b4500274b0402e5f0bb1c48beb0454f9e610/klefki-0.0.4.0.tar.gz", "yanked": false, "yanked_reason": null } ], "0.0.4.2": [ { "comment_text": "", "digests": { "md5": "fe83eb0060d620f63cc1b36071792733", "sha256": "741d9386d7906ebcc97d51d1f4545981a713f0ec47f3b095bd35ab1727e712ca" }, "downloads": -1, "filename": "klefki-0.0.4.2.tar.gz", "has_sig": false, "md5_digest": "fe83eb0060d620f63cc1b36071792733", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14417, "upload_time": "2018-09-26T07:30:34", "upload_time_iso_8601": "2018-09-26T07:30:34.767426Z", "url": "https://files.pythonhosted.org/packages/2d/2f/801577b4186bde3cd7656b26504f319116b0be69e6ade9a486da5e212a95/klefki-0.0.4.2.tar.gz", "yanked": false, "yanked_reason": null } ], "0.0.4.3": [ { "comment_text": "", "digests": { "md5": "4351dd3d0c9a6985b23a043965677fab", "sha256": "f99f782937ba731403e7ae3fd36008595e20428e746647cbfb763c780a7f3ede" }, "downloads": -1, "filename": "klefki-0.0.4.3.tar.gz", "has_sig": false, "md5_digest": "4351dd3d0c9a6985b23a043965677fab", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14538, "upload_time": "2018-09-27T04:56:25", "upload_time_iso_8601": "2018-09-27T04:56:25.546239Z", "url": "https://files.pythonhosted.org/packages/89/86/f3baff646587ecfd969e40dc088f7fe73b2486a9913b5ef7e954a4d89b2c/klefki-0.0.4.3.tar.gz", "yanked": false, "yanked_reason": null } ], "0.0.5": [ { "comment_text": "", "digests": { "md5": "244e7206e97780c648ec387042ef136c", "sha256": "b4262939a7e51e169931bd3c852c7ca3d1e25de8462e8b7b3a9ae0f36b6391c8" }, "downloads": -1, "filename": "klefki-0.0.5.tar.gz", "has_sig": false, "md5_digest": "244e7206e97780c648ec387042ef136c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15151, "upload_time": "2019-10-08T13:08:13", "upload_time_iso_8601": "2019-10-08T13:08:13.758778Z", "url": "https://files.pythonhosted.org/packages/ce/fa/21630c7b631fc4ceea239e618b10f87d92bc626f0a8428dfc18568abc472/klefki-0.0.5.tar.gz", "yanked": false, "yanked_reason": null } ], "0.5.1": [ { "comment_text": "", "digests": { "md5": "266e5bc616d7693e803e3d33e7dd2452", "sha256": "9bbd70121d12a7f739bc6b5ec1ee405606d8a44408112a76ff6c54a7593aa520" }, "downloads": -1, "filename": "klefki-0.5.1.tar.gz", "has_sig": false, "md5_digest": "266e5bc616d7693e803e3d33e7dd2452", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15345, "upload_time": "2019-10-08T13:33:02", "upload_time_iso_8601": "2019-10-08T13:33:02.198781Z", "url": "https://files.pythonhosted.org/packages/bb/1a/edb4e4f17b3196330be4fc95fa5330b25c4d24fd22d63ab5641b513471f5/klefki-0.5.1.tar.gz", "yanked": false, "yanked_reason": null } ], "0.6": [ { "comment_text": "", "digests": { "md5": "380c692cf6eddc768f1cdf693a650cbc", "sha256": "57b839f9528a32c346c3cce5666350e7501ece7300c892188cf47b076271148e" }, "downloads": -1, "filename": "klefki-0.6.tar.gz", "has_sig": false, "md5_digest": "380c692cf6eddc768f1cdf693a650cbc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15791, "upload_time": "2019-10-24T07:00:15", "upload_time_iso_8601": "2019-10-24T07:00:15.838826Z", "url": "https://files.pythonhosted.org/packages/35/26/9e72f20d501dfd411048a098992123da7cfb3f5c47fe5c94453a22614cda/klefki-0.6.tar.gz", "yanked": false, "yanked_reason": null } ], "0.7": [ { "comment_text": "", "digests": { "md5": "df7b3651ec3989eb6f44c4124bc1a9a3", "sha256": "9e2beb1db23de77198a81a61ec13b597d2375f186b91d7067b4ea196f7f1c3c5" }, "downloads": -1, "filename": "klefki-0.7.tar.gz", "has_sig": false, "md5_digest": "df7b3651ec3989eb6f44c4124bc1a9a3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18365, "upload_time": "2019-10-30T08:02:57", "upload_time_iso_8601": "2019-10-30T08:02:57.453782Z", "url": "https://files.pythonhosted.org/packages/d6/09/96cb1741caa989f7274dafd4f29bf9a430e4daa6c924146400bdc74fd44a/klefki-0.7.tar.gz", "yanked": false, "yanked_reason": null } ], "0.7.1": [ { "comment_text": "", "digests": { "md5": "032165fbd3cb2ad47641eb7ea2727cb5", "sha256": "1b1241eeeff481ced94333e49acd66eabbb742818528843e420ea2f0192ba1bd" }, "downloads": -1, "filename": "klefki-0.7.1.tar.gz", "has_sig": false, "md5_digest": "032165fbd3cb2ad47641eb7ea2727cb5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19544, "upload_time": "2019-11-01T12:26:53", "upload_time_iso_8601": "2019-11-01T12:26:53.697418Z", "url": "https://files.pythonhosted.org/packages/cd/ef/f67227f02fa8a0422cca342ba36e128dff555c2acfbfd98284c3e35b5f50/klefki-0.7.1.tar.gz", "yanked": false, "yanked_reason": null } ], "0.8": [ { "comment_text": "", "digests": { "md5": "dc9b56df806cbba7971bdbcd3f24d97e", "sha256": "5db62c5074e0cedf143f94cf9e727029bdb66f2b937d48a7b908b20bbe0cffd6" }, "downloads": -1, "filename": "klefki-0.8.tar.gz", "has_sig": false, "md5_digest": "dc9b56df806cbba7971bdbcd3f24d97e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22321, "upload_time": "2019-11-20T10:44:10", "upload_time_iso_8601": "2019-11-20T10:44:10.029465Z", "url": "https://files.pythonhosted.org/packages/c3/59/ffd7adafc6caf5228a7472d911667fe9fe6f9d323380b3a44677d2e494ad/klefki-0.8.tar.gz", "yanked": false, "yanked_reason": null } ], "0.9": [ { "comment_text": "", "digests": { "md5": "98dfeaa887563f34322ca902d5a4e983", "sha256": "5129bcb0b141ec5cbd759520fefd63d326c855e522f358e3f275c3adc8998011" }, "downloads": -1, "filename": "klefki-0.9.tar.gz", "has_sig": false, "md5_digest": "98dfeaa887563f34322ca902d5a4e983", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22669, "upload_time": "2019-12-13T10:59:06", "upload_time_iso_8601": "2019-12-13T10:59:06.916874Z", "url": "https://files.pythonhosted.org/packages/f0/3c/8799bf1d9717a3d791d18f8865b31c38d5dc12407a13d021bc104e1bb31b/klefki-0.9.tar.gz", "yanked": false, "yanked_reason": null } ], "0.9.1": [ { "comment_text": "", "digests": { "md5": "d6ba66349df54c219a079120e680ee9e", "sha256": "9ee02d1e1c2bc13a50bf40b80eb7ac14fab9014cf432cf782ffdc0b1521f7ad8" }, "downloads": -1, "filename": "klefki-0.9.1.tar.gz", "has_sig": false, "md5_digest": "d6ba66349df54c219a079120e680ee9e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22503, "upload_time": "2019-12-17T14:27:42", "upload_time_iso_8601": "2019-12-17T14:27:42.664502Z", "url": "https://files.pythonhosted.org/packages/fd/40/6c5b94340501c8316f0bb76a4aaf91d4dcbe85e0a9797c3c6684557d87de/klefki-0.9.1.tar.gz", "yanked": false, "yanked_reason": null } ], "1.0": [ { "comment_text": "", "digests": { "md5": "95cb8b67661e953820f29c956ba05965", "sha256": "ec8ed01870ec4fd8904e60a719e57f3b8175404795baa72ee5328fa7fae1544a" }, "downloads": -1, "filename": "klefki-1.0.tar.gz", "has_sig": false, "md5_digest": "95cb8b67661e953820f29c956ba05965", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23639, "upload_time": "2019-12-31T21:55:26", "upload_time_iso_8601": "2019-12-31T21:55:26.916227Z", "url": "https://files.pythonhosted.org/packages/7d/80/919adf549c72bb56588b8dfdfc3e1cac2d8d967ef8a4a5a044d6c1e757c2/klefki-1.0.tar.gz", "yanked": false, "yanked_reason": null } ], "1.1": [ { "comment_text": "", "digests": { "md5": "a9116d3913fbdb430836ffe856e3395e", "sha256": "44856af5e88540f152a6ea4c71baf843e6928311f04cb2076ce5374bbc0c0a39" }, "downloads": -1, "filename": "klefki-1.1.tar.gz", "has_sig": false, "md5_digest": "a9116d3913fbdb430836ffe856e3395e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20889, "upload_time": "2020-08-25T09:50:34", "upload_time_iso_8601": "2020-08-25T09:50:34.716227Z", "url": "https://files.pythonhosted.org/packages/0d/4a/07ed8eb0ea5c24faf027a98d66e56a34f6cc9aeee87104b2f61553d06c21/klefki-1.1.tar.gz", "yanked": false, "yanked_reason": null } ], "1.1.1": [ { "comment_text": "", "digests": { "md5": "0ab94e35cbf0f5b63fa77e082f6a1c83", "sha256": "152c255791ae9455212f99e5c44ef150b1390b4532e4e560fff8ec699983e8f8" }, "downloads": -1, "filename": "klefki-1.1.1.tar.gz", "has_sig": false, "md5_digest": "0ab94e35cbf0f5b63fa77e082f6a1c83", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 26450, "upload_time": "2020-09-28T17:43:09", "upload_time_iso_8601": "2020-09-28T17:43:09.047035Z", "url": "https://files.pythonhosted.org/packages/92/82/7410281d0c250904292328291c3c70f00afc75f080854374c7266a2b215a/klefki-1.1.1.tar.gz", "yanked": false, "yanked_reason": null } ], "1.1.2": [ { "comment_text": "", "digests": { "md5": "67eec032447b65029d8c32c160e79d09", "sha256": "f93c3df9d0a06f487e41322b2866518dc64bc5488b851c6f5353b882cac4f241" }, "downloads": -1, "filename": "klefki-1.1.2.tar.gz", "has_sig": false, "md5_digest": "67eec032447b65029d8c32c160e79d09", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 26530, "upload_time": "2020-09-28T18:11:11", "upload_time_iso_8601": "2020-09-28T18:11:11.450782Z", "url": "https://files.pythonhosted.org/packages/43/66/ba98af7a23ebe24c7c232dff889c1f62244809a4c96f1e0857d52298fd0e/klefki-1.1.2.tar.gz", "yanked": false, "yanked_reason": null } ], "1.1.3": [ { "comment_text": "", "digests": { "md5": "ea8a09bed7e17c42033f745eba986a07", "sha256": "c16338d251701b198064212998ceb0596ce381adf62d73e1444e4905656768d9" }, "downloads": -1, "filename": "klefki-1.1.3.tar.gz", "has_sig": false, "md5_digest": "ea8a09bed7e17c42033f745eba986a07", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 30385, "upload_time": "2021-01-28T11:33:23", "upload_time_iso_8601": "2021-01-28T11:33:23.563066Z", "url": "https://files.pythonhosted.org/packages/a8/66/5ca887aec7f0ca720dbdb3c3a3a9fb6044a4ad527800ad91f0b108f33151/klefki-1.1.3.tar.gz", "yanked": false, "yanked_reason": null } ], "1.2": [ { "comment_text": "", "digests": { "md5": "c4c940a6a686e27ffdd63dc3e24b9600", "sha256": "7b7aa8f6e71ebea9580cf51c09b5e8845a0e34283d90c9d9d0e350990d2855d9" }, "downloads": -1, "filename": "klefki-1.2.tar.gz", "has_sig": false, "md5_digest": "c4c940a6a686e27ffdd63dc3e24b9600", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 30368, "upload_time": "2021-01-28T11:35:07", "upload_time_iso_8601": "2021-01-28T11:35:07.939563Z", "url": "https://files.pythonhosted.org/packages/23/6a/dce7418988b3e4e72c0cef9f7d8896fbf84bf0b16c1f84a289a2c90fe128/klefki-1.2.tar.gz", "yanked": false, "yanked_reason": null } ], "1.2.1": [ { "comment_text": "", "digests": { "md5": "153220c082deb221cb9314da6bb5d854", "sha256": "fb5a24dc35e26de55ac93c2420e4e8ae1548f79e6f30f023e82853a25b0f99b9" }, "downloads": -1, "filename": "klefki-1.2.1.tar.gz", "has_sig": false, "md5_digest": "153220c082deb221cb9314da6bb5d854", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 33969, "upload_time": "2021-01-30T10:00:42", "upload_time_iso_8601": "2021-01-30T10:00:42.660040Z", "url": "https://files.pythonhosted.org/packages/ac/25/05c32aaec5d7a8e2ddcbebe43d732b76aa512420be7031bcba144aaec625/klefki-1.2.1.tar.gz", "yanked": false, "yanked_reason": null } ], "1.4.1": [ { "comment_text": "", "digests": { "md5": "48869c42d610eaf55728baa8dd07bd60", "sha256": "407f194682b461b35a4f48a1d01a06c7629bb2eb7d839d18242f1beb5b9ad2cb" }, "downloads": -1, "filename": "klefki-1.4.1.tar.gz", "has_sig": false, "md5_digest": "48869c42d610eaf55728baa8dd07bd60", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 34477, "upload_time": "2021-01-30T16:15:19", "upload_time_iso_8601": "2021-01-30T16:15:19.235426Z", "url": "https://files.pythonhosted.org/packages/21/1f/c68b963c20dde350e13b62e6b8eb610dd2d7b72bbb7758c6d264067f93c9/klefki-1.4.1.tar.gz", "yanked": false, "yanked_reason": null } ], "1.4.5": [ { "comment_text": "", "digests": { "md5": "df08802327534edd6f8316441bd36ab5", "sha256": "e3bf638988e0c3f89be94f4ed84f365c8339fd5e0f46259a94458a5dd251b41e" }, "downloads": -1, "filename": "klefki-1.4.5.tar.gz", "has_sig": false, "md5_digest": "df08802327534edd6f8316441bd36ab5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 34351, "upload_time": "2021-02-03T12:38:04", "upload_time_iso_8601": "2021-02-03T12:38:04.097677Z", "url": "https://files.pythonhosted.org/packages/46/fc/76ec8593b48015b8c01cf468d70587b6c83ed75d4178611db8ee393616ac/klefki-1.4.5.tar.gz", "yanked": false, "yanked_reason": null } ], "1.5": [ { "comment_text": "", "digests": { "md5": "3db7886b41872658d8bef89e12a8a117", "sha256": "5da55803305490df0950a2f1272c0bb1d9cb9267cf3571aa9064ba2a328c49a3" }, "downloads": -1, "filename": "klefki-1.5.tar.gz", "has_sig": false, "md5_digest": "3db7886b41872658d8bef89e12a8a117", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 38146, "upload_time": "2021-02-15T06:45:01", "upload_time_iso_8601": "2021-02-15T06:45:01.340821Z", "url": "https://files.pythonhosted.org/packages/35/a2/3479f5149abb8da3bfdb57780c40adbf8bcf3c64b3255153eb9f7ac53ffb/klefki-1.5.tar.gz", "yanked": false, "yanked_reason": null } ], "1.5.1": [ { "comment_text": "", "digests": { "md5": "82a0173aea12422f6f4dd699a47d2597", "sha256": "b82925cb114ca9bbd9d2c5fef06add7dd7c016a921597ea7250a43b711367c09" }, "downloads": -1, "filename": "klefki-1.5.1.tar.gz", "has_sig": false, "md5_digest": "82a0173aea12422f6f4dd699a47d2597", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 38006, "upload_time": "2021-02-15T07:11:06", "upload_time_iso_8601": "2021-02-15T07:11:06.218287Z", "url": "https://files.pythonhosted.org/packages/60/07/5e707f814a61241cd33308d6f23e2e1f51c1a8901af96d8e11f1355596a7/klefki-1.5.1.tar.gz", "yanked": false, "yanked_reason": null } ], "1.5.2": [ { "comment_text": "", "digests": { "md5": "bc553b4872a8990ce3521b528d6b1242", "sha256": "fdec2c4f3b9f356fd73b9c5027203811c22e6483e9117fd17e65d390e0432f49" }, "downloads": -1, "filename": "klefki-1.5.2.tar.gz", "has_sig": false, "md5_digest": "bc553b4872a8990ce3521b528d6b1242", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 38014, "upload_time": "2021-02-15T13:28:18", "upload_time_iso_8601": "2021-02-15T13:28:18.735558Z", "url": "https://files.pythonhosted.org/packages/52/ee/469e41e55e1a75365a9bd952adfbff25ab5608643adba62c1bd32f815f9d/klefki-1.5.2.tar.gz", "yanked": false, "yanked_reason": null } ], "1.5.3": [ { "comment_text": "", "digests": { "md5": "51c4674273b4cc3c96f4bb2eded64786", "sha256": "0c56a01d6b50f8e200fe168005027098f84cdc16c04792d0f642313a42908b06" }, "downloads": -1, "filename": "klefki-1.5.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "51c4674273b4cc3c96f4bb2eded64786", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 74733, "upload_time": "2021-02-15T13:44:23", "upload_time_iso_8601": "2021-02-15T13:44:23.650784Z", "url": "https://files.pythonhosted.org/packages/10/63/fb48d81a24b6c5600e1fd7bdb4e01539b6e79c80486d6461a7ee9fcf6870/klefki-1.5.3-py2.py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "fa0c5251860c61c732fd23c71edf5d20", "sha256": "b296625c401ab5834dbca849914bcccfca37be83cacb37e38a29d70d072045a5" }, "downloads": -1, "filename": "klefki-1.5.3-py3-none-any.whl", "has_sig": false, "md5_digest": "fa0c5251860c61c732fd23c71edf5d20", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 74726, "upload_time": "2021-02-15T13:44:25", "upload_time_iso_8601": "2021-02-15T13:44:25.635932Z", "url": "https://files.pythonhosted.org/packages/cd/63/fb75a1e6d47f9049de036df07bacb6ce1018035265fddc335bfe013e240a/klefki-1.5.3-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "9f056b67ef2538ab1e931c57631e45b7", "sha256": "15c5e038bfd4e2580c1fb7972ffb9f6f89def9f277f10e76f86d6e2ef672832a" }, "downloads": -1, "filename": "klefki-1.5.3.tar.gz", "has_sig": false, "md5_digest": "9f056b67ef2538ab1e931c57631e45b7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 39746, "upload_time": "2021-02-15T13:44:27", "upload_time_iso_8601": "2021-02-15T13:44:27.802790Z", "url": "https://files.pythonhosted.org/packages/9e/04/b0c1ca435143432b25bf3424b2aa2117dc5116bbb5c26e153c3749ca070a/klefki-1.5.3.tar.gz", "yanked": false, "yanked_reason": null } ], "1.5.4": [ { "comment_text": "", "digests": { "md5": "42ebc67c7b6ab067dc08a48ba9057d02", "sha256": "ae36b75a11652bbc5ca073db70e9fa7f52272685da3f9b817afce358dc81ae5d" }, "downloads": -1, "filename": "klefki-1.5.4-py3-none-any.whl", "has_sig": false, "md5_digest": "42ebc67c7b6ab067dc08a48ba9057d02", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 74715, "upload_time": "2021-02-15T13:52:25", "upload_time_iso_8601": "2021-02-15T13:52:25.890147Z", "url": "https://files.pythonhosted.org/packages/9d/b6/a8e0de06fd8be221e8cf8a6be3f96fa0caea04f043a08b81539c43db4ad7/klefki-1.5.4-py3-none-any.whl", "yanked": false, "yanked_reason": null } ], "1.5.5": [ { "comment_text": "", "digests": { "md5": "ca4d5080bc254cb885539b5631fde166", "sha256": "1a2da8ce37bb2f7d882a8534011bf5a15b92ab1a4016d4c02b765575cf5d7e43" }, "downloads": -1, "filename": "klefki-1.5.5-py3-none-any.whl", "has_sig": false, "md5_digest": "ca4d5080bc254cb885539b5631fde166", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 80054, "upload_time": "2021-02-17T13:08:30", "upload_time_iso_8601": "2021-02-17T13:08:30.648390Z", "url": "https://files.pythonhosted.org/packages/9b/18/ad39fb75c840d75ced8ea1a01d60a48a7bc76fda9748b773306b8df06c5b/klefki-1.5.5-py3-none-any.whl", "yanked": false, "yanked_reason": null } ], "1.5.6": [ { "comment_text": "", "digests": { "md5": "177da3745a6608279757fc821a6837db", "sha256": "6f7bd0defd9435b162d108c25e0c96fee46605f12a52a317a7336ba47ec2e0f8" }, "downloads": -1, "filename": "klefki-1.5.6-py3-none-any.whl", "has_sig": false, "md5_digest": "177da3745a6608279757fc821a6837db", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 78909, "upload_time": "2021-02-17T13:22:42", "upload_time_iso_8601": "2021-02-17T13:22:42.891070Z", "url": "https://files.pythonhosted.org/packages/43/9d/ba3e0983007f3466f18fa28e44ec3f88d4a44256b277c5f33619c4a9a622/klefki-1.5.6-py3-none-any.whl", "yanked": false, "yanked_reason": null } ], "1.6.1": [ { "comment_text": "", "digests": { "md5": "66ba68fd7c8a64c318b892db1f8f3bec", "sha256": "3c8a5e6d70f21872923ab622134d42d3285271e56e5f91775a5adb41b5c20c68" }, "downloads": -1, "filename": "klefki-1.6.1-py3-none-any.whl", "has_sig": false, "md5_digest": "66ba68fd7c8a64c318b892db1f8f3bec", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 78628, "upload_time": "2021-02-21T11:50:43", "upload_time_iso_8601": "2021-02-21T11:50:43.291301Z", "url": "https://files.pythonhosted.org/packages/64/81/5183128162c617752eb2a0f9901e5642002c265a4192c6e1f9109c62c176/klefki-1.6.1-py3-none-any.whl", "yanked": false, "yanked_reason": null } ], "1.6.2": [ { "comment_text": "", "digests": { "md5": "550e353b2a6b58c9f77d1ba5047ff64b", "sha256": "56e01e85e346ca355e9672c82e44f959b98893892c8302fa0e50b84e2110f243" }, "downloads": -1, "filename": "klefki-1.6.2-py3-none-any.whl", "has_sig": false, "md5_digest": "550e353b2a6b58c9f77d1ba5047ff64b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 78639, "upload_time": "2021-02-21T18:25:35", "upload_time_iso_8601": "2021-02-21T18:25:35.598921Z", "url": "https://files.pythonhosted.org/packages/5a/eb/8c8eaa6ce40a944ca073c153376b2fe4bc5b2d6d3513ed02d4324dd622c7/klefki-1.6.2-py3-none-any.whl", "yanked": false, "yanked_reason": null } ], "1.7": [ { "comment_text": "", "digests": { "md5": "8e07f580274a100f48b8bb65026e79ec", "sha256": "3f6f30feb3e37f044449b3459597c00626ee4d322293dd9174510858c45324c8" }, "downloads": -1, "filename": "klefki-1.7-py3-none-any.whl", "has_sig": false, "md5_digest": "8e07f580274a100f48b8bb65026e79ec", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 84763, "upload_time": "2021-03-08T10:41:41", "upload_time_iso_8601": "2021-03-08T10:41:41.454981Z", "url": "https://files.pythonhosted.org/packages/4d/28/5563b3ac9f811df1fd78dcc5679cdedee878cfaa54f6b09ad50ebd79e3ad/klefki-1.7-py3-none-any.whl", "yanked": false, "yanked_reason": null } ], "1.7.1": [ { "comment_text": "", "digests": { "md5": "816dcb352d837fe6929594cee362ca20", "sha256": "8db34867eb9c7826b55d108005a971b7786b01fdff5eefd5118da6d1a9e26118" }, "downloads": -1, "filename": "klefki-1.7.1-py3-none-any.whl", "has_sig": false, "md5_digest": "816dcb352d837fe6929594cee362ca20", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 85270, "upload_time": "2021-03-08T10:54:42", "upload_time_iso_8601": "2021-03-08T10:54:42.851531Z", "url": "https://files.pythonhosted.org/packages/02/34/ebfa2843e627f07915fa4071e226f86fda58c969cb32a565d4840e42fc16/klefki-1.7.1-py3-none-any.whl", "yanked": false, "yanked_reason": null } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "816dcb352d837fe6929594cee362ca20", "sha256": "8db34867eb9c7826b55d108005a971b7786b01fdff5eefd5118da6d1a9e26118" }, "downloads": -1, "filename": "klefki-1.7.1-py3-none-any.whl", "has_sig": false, "md5_digest": "816dcb352d837fe6929594cee362ca20", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 85270, "upload_time": "2021-03-08T10:54:42", "upload_time_iso_8601": "2021-03-08T10:54:42.851531Z", "url": "https://files.pythonhosted.org/packages/02/34/ebfa2843e627f07915fa4071e226f86fda58c969cb32a565d4840e42fc16/klefki-1.7.1-py3-none-any.whl", "yanked": false, "yanked_reason": null } ], "vulnerabilities": [] }