{ "info": { "author": "Brian Warner", "author_email": "warner-pyecdsa@lothar.com", "bugtrack_url": null, "classifiers": [ "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.2", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Topic :: Security :: Cryptography" ], "description": "# Pure-Python ECDSA\n\n[![build status](https://travis-ci.org/warner/python-ecdsa.png)](http://travis-ci.org/warner/python-ecdsa)\n[![Coverage Status](https://coveralls.io/repos/warner/python-ecdsa/badge.svg)](https://coveralls.io/r/warner/python-ecdsa)\n[![Latest Version](https://pypip.in/version/ecdsa/badge.svg?style=flat)](https://pypi.python.org/pypi/ecdsa/)\n\n\nThis is an easy-to-use implementation of ECDSA cryptography (Elliptic Curve\nDigital Signature Algorithm), implemented purely in Python, released under\nthe MIT license. With this library, you can quickly create keypairs (signing\nkey and verifying key), sign messages, and verify the signatures. The keys\nand signatures are very short, making them easy to handle and incorporate\ninto other protocols.\n\n## Features\n\nThis library provides key generation, signing, and verifying, for five\npopular NIST \"Suite B\" GF(p) curves, with key lengths of 192, 224, 256, 384,\nand 521 bits. The \"short names\" for these curves, as known by the OpenSSL\ntool (`openssl ecparam --list_curves`), are: prime192v1, secp224r1,\nprime256v1, secp384r1, and secp521r1. It also includes the 256-bit curve used\nby Bitcoin, whose short name is secp256k1. No other curves are included, but\nit would not be too hard to add more.\n\n## Dependencies\n\nThis library uses only Python. It requires python2.6 or later versions of the\npython2.x series. It is also compatible with python3.2 and 3.3.\n\nTo run the OpenSSL compatibility tests, the 'openssl' tool must be on your\n$PATH. This release has been tested successfully against both OpenSSL 0.9.8o\nand 1.0.0a .\n\n## Speed\n\nThe following table shows how long this library takes to generate keypairs\n(keygen=), to sign data (sign=), and to verify those signatures (verify=), on\nmy 2008 Mac laptop. All times are in seconds. It also shows the length of a\nsignature (in bytes): the verifying (\"public\") key is typically the same\nlength as the signature, and the signing (\"private\") key is half that length. Use \"python setup.py speed\" to generate this table on your own computer.\n\n* NIST192p: siglen= 48, keygen=0.160s, sign=0.058s, verify=0.116s\n* NIST224p: siglen= 56, keygen=0.230s, sign=0.086s, verify=0.165s\n* NIST256p: siglen= 64, keygen=0.305s, sign=0.112s, verify=0.220s\n* NIST384p: siglen= 96, keygen=0.801s, sign=0.289s, verify=0.558s\n* NIST521p: siglen=132, keygen=1.582s, sign=0.584s, verify=1.152s\n\nFor comparison, a quality C++ implementation of ECDSA (Crypto++) typically\ncomputes a NIST256p signature in 2.88ms and a verification in 8.53ms, about\n30-40x faster.\n\nKeys and signature can be serialized in different ways (see Usage, below).\nFor a NIST192p key, the three basic representations require strings of the\nfollowing lengths (in bytes):\n\n to_string: signkey= 24, verifykey= 48, signature=48\n DER: signkey=106, verifykey= 80, signature=55\n PEM: signkey=278, verifykey=162, (no support for PEM signatures)\n\n## History\n\nIn 2006, Peter Pearson announced his pure-python implementation of ECDSA in a\n[message to sci.crypt][1], available from his [download site][2]. In 2010,\nBrian Warner wrote a wrapper around this code, to make it a bit easier and\nsafer to use. You are looking at the README for this wrapper.\n\n[1]: http://www.derkeiler.com/Newsgroups/sci.crypt/2006-01/msg00651.html\n[2]: http://webpages.charter.net/curryfans/peter/downloads.html\n\n## Testing\n\nThere are four test suites, three for the original Pearson module, and one\nmore for the wrapper. To run them all, do this:\n\n python setup.py test\n tox -e coverage\n\nOn my 2014 Mac Mini, the combined tests take about 20 seconds to run. On a\n2.4GHz P4 Linux box, they take 81 seconds.\n\nOne component of `test_pyecdsa.py` checks compatibility with OpenSSL, by\nrunning the \"openssl\" CLI tool. If this tool is not on your $PATH, you may\nwant to comment out this test (the easiest way is to add a line that says\n\"del OpenSSL\" to the end of test_pyecdsa.py).\n\n## Security\n\nThis library does not protect against timing attacks. Do not allow attackers\nto measure how long it takes you to generate a keypair or sign a message.\nThis library depends upon a strong source of random numbers. Do not use it on\na system where os.urandom() is weak.\n\n## Usage\n\nYou start by creating a SigningKey. You can use this to sign data, by passing\nin a data string and getting back the signature (also a string). You can also\nask a SigningKey to give you the corresponding VerifyingKey. The VerifyingKey\ncan be used to verify a signature, by passing it both the data string and the\nsignature string: it either returns True or raises BadSignatureError.\n\n from ecdsa import SigningKey\n sk = SigningKey.generate() # uses NIST192p\n vk = sk.get_verifying_key()\n signature = sk.sign(\"message\")\n assert vk.verify(signature, \"message\")\n\nEach SigningKey/VerifyingKey is associated with a specific curve, like\nNIST192p (the default one). Longer curves are more secure, but take longer to\nuse, and result in longer keys and signatures.\n\n from ecdsa import SigningKey, NIST384p\n sk = SigningKey.generate(curve=NIST384p)\n vk = sk.get_verifying_key()\n signature = sk.sign(\"message\")\n assert vk.verify(signature, \"message\")\n\nThe SigningKey can be serialized into several different formats: the shortest\nis to call `s=sk.to_string()`, and then re-create it with\n`SigningKey.from_string(s, curve)` . This short form does not record the\ncurve, so you must be sure to tell from_string() the same curve you used for\nthe original key. The short form of a NIST192p-based signing key is just 24\nbytes long. If the point encoding is invalid or it does not lie on the\nspecified curve, `from_string()` will raise MalformedPointError.\n\n from ecdsa import SigningKey, NIST384p\n sk = SigningKey.generate(curve=NIST384p)\n sk_string = sk.to_string()\n sk2 = SigningKey.from_string(sk_string, curve=NIST384p)\n # sk and sk2 are the same key\n\n`sk.to_pem()` and `sk.to_der()` will serialize the signing key into the same\nformats that OpenSSL uses. The PEM file looks like the familiar ASCII-armored\n`\"-----BEGIN EC PRIVATE KEY-----\"` base64-encoded format, and the DER format\nis a shorter binary form of the same data.\n`SigningKey.from_pem()/.from_der()` will undo this serialization. These\nformats include the curve name, so you do not need to pass in a curve\nidentifier to the deserializer. In case the file is malformed `from_der()`\nand `from_pem()` will raise UnexpectedDER or MalformedPointError.\n\n from ecdsa import SigningKey, NIST384p\n sk = SigningKey.generate(curve=NIST384p)\n sk_pem = sk.to_pem()\n sk2 = SigningKey.from_pem(sk_pem)\n # sk and sk2 are the same key\n\nLikewise, the VerifyingKey can be serialized in the same way:\n`vk.to_string()/VerifyingKey.from_string()`, `to_pem()/from_pem()`, and\n`to_der()/from_der()`. The same curve= argument is needed for\n`VerifyingKey.from_string()`.\n\n from ecdsa import SigningKey, VerifyingKey, NIST384p\n sk = SigningKey.generate(curve=NIST384p)\n vk = sk.get_verifying_key()\n vk_string = vk.to_string()\n vk2 = VerifyingKey.from_string(vk_string, curve=NIST384p)\n # vk and vk2 are the same key\n\n from ecdsa import SigningKey, VerifyingKey, NIST384p\n sk = SigningKey.generate(curve=NIST384p)\n vk = sk.get_verifying_key()\n vk_pem = vk.to_pem()\n vk2 = VerifyingKey.from_pem(vk_pem)\n # vk and vk2 are the same key\n\nThere are a couple of different ways to compute a signature. Fundamentally,\nECDSA takes a number that represents the data being signed, and returns a\npair of numbers that represent the signature. The hashfunc= argument to\n`sk.sign()` and `vk.verify()` is used to turn an arbitrary string into\nfixed-length digest, which is then turned into a number that ECDSA can sign,\nand both sign and verify must use the same approach. The default value is\nhashlib.sha1, but if you use NIST256p or a longer curve, you can use\nhashlib.sha256 instead.\n\nThere are also multiple ways to represent a signature. The default\n`sk.sign()` and `vk.verify()` methods present it as a short string, for\nsimplicity and minimal overhead. To use a different scheme, use the\n`sk.sign(sigencode=)` and `vk.verify(sigdecode=)` arguments. There are helper\nfuncions in the \"ecdsa.util\" module that can be useful here.\n\nIt is also possible to create a SigningKey from a \"seed\", which is\ndeterministic. This can be used in protocols where you want to derive\nconsistent signing keys from some other secret, for example when you want\nthree separate keys and only want to store a single master secret. You should\nstart with a uniformly-distributed unguessable seed with about curve.baselen\nbytes of entropy, and then use one of the helper functions in ecdsa.util to\nconvert it into an integer in the correct range, and then finally pass it\ninto `SigningKey.from_secret_exponent()`, like this:\n\n from pyecdsa import NIST384p, SigningKey\n from pyecdsa.util import randrange_from_seed__trytryagain\n\n def make_key(seed):\n secexp = randrange_from_seed__trytryagain(seed, NIST384p.order)\n return SigningKey.from_secret_exponent(secexp, curve=NIST384p)\n\n seed = os.urandom(NIST384p.baselen) # or other starting point\n sk1a = make_key(seed)\n sk1b = make_key(seed)\n # note: sk1a and sk1b are the same key\n sk2 = make_key(\"2-\"+seed) # different key\n\n## OpenSSL Compatibility\n\nTo produce signatures that can be verified by OpenSSL tools, or to verify\nsignatures that were produced by those tools, use:\n\n # openssl ecparam -name secp224r1 -genkey -out sk.pem\n # openssl ec -in sk.pem -pubout -out vk.pem\n # openssl dgst -ecdsa-with-SHA1 -sign sk.pem -out data.sig data\n # openssl dgst -ecdsa-with-SHA1 -verify vk.pem -signature data.sig data\n # openssl dgst -ecdsa-with-SHA1 -prverify sk.pem -signature data.sig data\n\n sk.sign(msg, hashfunc=hashlib.sha1, sigencode=ecdsa.util.sigencode_der)\n vk.verify(sig, msg, hashfunc=hashlib.sha1, sigdecode=ecdsa.util.sigdecode_der)\n\nThe keys that openssl handles can be read and written as follows:\n\n sk = SigningKey.from_pem(open(\"sk.pem\").read())\n open(\"sk.pem\",\"w\").write(sk.to_pem())\n\n vk = VerifyingKey.from_pem(open(\"vk.pem\").read())\n open(\"vk.pem\",\"w\").write(vk.to_pem())\n\n## Entropy\n\nCreating a signing key with `SigningKey.generate()` requires some form of\nentropy (as opposed to `from_secret_exponent/from_string/from_der/from_pem`,\nwhich are deterministic and do not require an entropy source). The default\nsource is `os.urandom()`, but you can pass any other function that behaves\nlike os.urandom as the entropy= argument to do something different. This may\nbe useful in unit tests, where you want to achieve repeatable results. The\necdsa.util.PRNG utility is handy here: it takes a seed and produces a strong\npseudo-random stream from it:\n\n from ecdsa.util import PRNG\n from ecdsa import SigningKey\n rng1 = PRNG(\"seed\")\n sk1 = SigningKey.generate(entropy=rng1)\n rng2 = PRNG(\"seed\")\n sk2 = SigningKey.generate(entropy=rng2)\n # sk1 and sk2 are the same key\n\nLikewise, ECDSA signature generation requires a random number, and each\nsignature must use a different one (using the same number twice will\nimmediately reveal the private signing key). The `sk.sign()` method takes an\nentropy= argument which behaves the same as `SigningKey.generate(entropy=)`.\n\n## Deterministic Signatures\n\nIf you call `SigningKey.sign_deterministic(data)` instead of `.sign(data)`,\nthe code will generate a deterministic signature instead of a random one.\nThis uses the algorithm from RFC6979 to safely generate a unique `k` value,\nderived from the private key and the message being signed. Each time you sign\nthe same message with the same key, you will get the same signature (using\nthe same `k`).\n\nThis may become the default in a future version, as it is not vulnerable to\nfailures of the entropy source.\n\n## Examples\n\nCreate a NIST192p keypair and immediately save both to disk:\n\n from ecdsa import SigningKey\n sk = SigningKey.generate()\n vk = sk.get_verifying_key()\n open(\"private.pem\",\"w\").write(sk.to_pem())\n open(\"public.pem\",\"w\").write(vk.to_pem())\n\nLoad a signing key from disk, use it to sign a message, and write the\nsignature to disk:\n\n from ecdsa import SigningKey\n sk = SigningKey.from_pem(open(\"private.pem\").read())\n message = open(\"message\",\"rb\").read()\n sig = sk.sign(message)\n open(\"signature\",\"wb\").write(sig)\n\nLoad the verifying key, message, and signature from disk, and verify the\nsignature:\n\n from ecdsa import VerifyingKey, BadSignatureError\n vk = VerifyingKey.from_pem(open(\"public.pem\").read())\n message = open(\"message\",\"rb\").read()\n sig = open(\"signature\",\"rb\").read()\n try:\n vk.verify(sig, message)\n print \"good signature\"\n except BadSignatureError:\n print \"BAD SIGNATURE\"\n\nCreate a NIST521p keypair\n\n from ecdsa import SigningKey, NIST521p\n sk = SigningKey.generate(curve=NIST521p)\n vk = sk.get_verifying_key()\n\nCreate three independent signing keys from a master seed:\n\n from pyecdsa import NIST192p, SigningKey\n from pyecdsa.util import randrange_from_seed__trytryagain\n\n def make_key_from_seed(seed, curve=NIST192p):\n secexp = randrange_from_seed__trytryagain(seed, curve.order)\n return SigningKey.from_secret_exponent(secexp, curve)\n\n sk1 = make_key_from_seed(\"1:%s\" % seed)\n sk2 = make_key_from_seed(\"2:%s\" % seed)\n sk3 = make_key_from_seed(\"3:%s\" % seed)\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": "http://github.com/warner/python-ecdsa", "keywords": "", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "ecdsa", "package_url": "https://pypi.org/project/ecdsa/", "platform": "", "project_url": "https://pypi.org/project/ecdsa/", "project_urls": { "Homepage": "http://github.com/warner/python-ecdsa" }, "release_url": "https://pypi.org/project/ecdsa/0.13.3/", "requires_dist": null, "requires_python": "", "summary": "ECDSA cryptographic signature library (pure python)", "version": "0.13.3" }, "last_serial": 5938962, "releases": { "0.10": [ { "comment_text": "", "digests": { "md5": "e95941b3bcbf1726472bb724d7478551", "sha256": "67dae9e1af2b0fd71bc9a378654f7dc89211c1c5aee71e160f8cfce1fa6d6980" }, "downloads": -1, "filename": "ecdsa-0.10.tar.gz", "has_sig": false, "md5_digest": "e95941b3bcbf1726472bb724d7478551", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 45153, "upload_time": "2013-10-23T18:47:11", "url": "https://files.pythonhosted.org/packages/8a/52/d5517842ba27739f0fcf83afb3b33a40c4abbb3fb954719e44b02f2a0ef8/ecdsa-0.10.tar.gz" } ], "0.11": [ { "comment_text": "", "digests": { "md5": "8ef586fe4dbb156697d756900cb41d7c", "sha256": "8e3b6c193f91dc94b2f3b0261e3eabbdc604f78ff99fdad324a56fdd0b5e958c" }, "downloads": -1, "filename": "ecdsa-0.11.tar.gz", "has_sig": false, "md5_digest": "8ef586fe4dbb156697d756900cb41d7c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 45689, "upload_time": "2014-03-10T22:54:27", "url": "https://files.pythonhosted.org/packages/6c/3f/92fe5dcdcaa7bd117be21e5520c9a54375112b66ec000d209e9e9519fad1/ecdsa-0.11.tar.gz" } ], "0.12": [ { "comment_text": "", "digests": { "md5": "553233ea1ab15a601dbe7ab69f641375", "sha256": "f52785ccb624a420dfee6d450c9fd043d03e3032a6ba650c97909bfd8a86ec73" }, "downloads": -1, "filename": "ecdsa-0.12-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "553233ea1ab15a601dbe7ab69f641375", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 86918, "upload_time": "2015-02-06T21:42:40", "url": "https://files.pythonhosted.org/packages/fb/56/2d9097441b091c6ff1a7996cf1d47f1913924ee9cb756cc3c6665f220cb3/ecdsa-0.12-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c3a4f41156392f71e0c790e497dae8b5", "sha256": "226fd3deb98dc62e9dbe300eb88a6f4db5d765ffae97c71e39c12c3eb4d5f0d9" }, "downloads": -1, "filename": "ecdsa-0.12.tar.gz", "has_sig": false, "md5_digest": "c3a4f41156392f71e0c790e497dae8b5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 55487, "upload_time": "2015-02-06T21:42:48", "url": "https://files.pythonhosted.org/packages/1b/06/2d1896aa07c3fe0b5a46d02cb0b102abeb0453c92a50e58fbaf0b8b3313b/ecdsa-0.12.tar.gz" } ], "0.13": [ { "comment_text": "", "digests": { "md5": "a325d50195d049599f9b578ec4417bc6", "sha256": "40d002cf360d0e035cf2cb985e1308d41aaa087cbfc135b2dc2d844296ea546c" }, "downloads": -1, "filename": "ecdsa-0.13-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "a325d50195d049599f9b578ec4417bc6", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 86911, "upload_time": "2015-02-07T18:26:20", "url": "https://files.pythonhosted.org/packages/63/f4/73669d51825516ce8c43b816c0a6b64cd6eb71d08b99820c00792cb42222/ecdsa-0.13-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1f60eda9cb5c46722856db41a3ae6670", "sha256": "64cf1ee26d1cde3c73c6d7d107f835fed7c6a2904aef9eac223d57ad800c43fa" }, "downloads": -1, "filename": "ecdsa-0.13.tar.gz", "has_sig": false, "md5_digest": "1f60eda9cb5c46722856db41a3ae6670", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 55579, "upload_time": "2015-02-07T18:26:23", "url": "https://files.pythonhosted.org/packages/f9/e5/99ebb176e47f150ac115ffeda5fedb6a3dbb3c00c74a59fd84ddf12f5857/ecdsa-0.13.tar.gz" } ], "0.13.1": [ { "comment_text": "", "digests": { "md5": "9f9fc9a654bf0743bc0a7b213324d244", "sha256": "47d64429e90998846a141f5beadc1e4e8dc1d8a614e321a0609fef5df616a44a" }, "downloads": -1, "filename": "ecdsa-0.13.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "9f9fc9a654bf0743bc0a7b213324d244", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 59034, "upload_time": "2019-04-17T14:02:43", "url": "https://files.pythonhosted.org/packages/f9/2a/ed9be4ad09ee37a75d68ee2d7bf535148de4546a875da42e1135bc84d51a/ecdsa-0.13.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9c77bcde4dc8e3b291d1362d406a5c43", "sha256": "713271197ad6e5bdf69d0b74118d4632de01e235ac4bdecc9fa565451cbfb3df" }, "downloads": -1, "filename": "ecdsa-0.13.1.tar.gz", "has_sig": false, "md5_digest": "9c77bcde4dc8e3b291d1362d406a5c43", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 61523, "upload_time": "2019-04-17T14:02:44", "url": "https://files.pythonhosted.org/packages/db/2e/843cf62fb8807e02acac95caa4bc8dba792b5068e68c16c043c7f903714c/ecdsa-0.13.1.tar.gz" } ], "0.13.2": [ { "comment_text": "", "digests": { "md5": "07e6070e33de157448afc9f47b04e3a8", "sha256": "20c17e527e75acad8f402290e158a6ac178b91b881f941fc6ea305bfdfb9657c" }, "downloads": -1, "filename": "ecdsa-0.13.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "07e6070e33de157448afc9f47b04e3a8", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 59060, "upload_time": "2019-04-17T19:34:16", "url": "https://files.pythonhosted.org/packages/23/a8/8aa68e70959e1287da9154e5164bb8bd5dd7025e41ae54e8d177b8d165c9/ecdsa-0.13.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0ce51d17c0751e5232be4eafd69b7f13", "sha256": "5c034ffa23413ac923541ceb3ac14ec15a0d2530690413bff58c12b80e56d884" }, "downloads": -1, "filename": "ecdsa-0.13.2.tar.gz", "has_sig": false, "md5_digest": "0ce51d17c0751e5232be4eafd69b7f13", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 61595, "upload_time": "2019-04-17T19:34:18", "url": "https://files.pythonhosted.org/packages/51/76/139bf6e9b7b6684d5891212cdbd9e0739f2bfc03f380a1a6ffa700f392ac/ecdsa-0.13.2.tar.gz" } ], "0.13.3": [ { "comment_text": "", "digests": { "md5": "531b03c68145ac3629461fc451bd0426", "sha256": "9814e700890991abeceeb2242586024d4758c8fc18445b194a49bd62d85861db" }, "downloads": -1, "filename": "ecdsa-0.13.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "531b03c68145ac3629461fc451bd0426", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 52113, "upload_time": "2019-10-07T14:05:22", "url": "https://files.pythonhosted.org/packages/a6/81/2b170b460c84fdc8700cf08aa077ac6a9ff41f4ad3f05d0b3a64ba9f8f2e/ecdsa-0.13.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b1b33f7fe171eb1278de6f93eefc34f8", "sha256": "163c80b064a763ea733870feb96f9dd9b92216cfcacd374837af18e4e8ec3d4d" }, "downloads": -1, "filename": "ecdsa-0.13.3.tar.gz", "has_sig": false, "md5_digest": "b1b33f7fe171eb1278de6f93eefc34f8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 60477, "upload_time": "2019-10-07T14:05:24", "url": "https://files.pythonhosted.org/packages/8c/d8/9c3596fd0f18ae0a76333492a119c00183323d8e64de1a4f4bd642856963/ecdsa-0.13.3.tar.gz" } ], "0.6": [ { "comment_text": "", "digests": { "md5": "7a4750df7b7b5147a78a69ff92056ead", "sha256": "f963025a4f6ced53ec63951aa4b1c1774b4d3ec7f008a5671abcf137c857aa00" }, "downloads": -1, "filename": "ecdsa-0.6.tar.gz", "has_sig": false, "md5_digest": "7a4750df7b7b5147a78a69ff92056ead", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 35072, "upload_time": "2010-10-16T02:50:08", "url": "https://files.pythonhosted.org/packages/50/ad/2ac887c3773a770a396995f2f74cd0cc64942cdeaf2bcc243cd2355d072b/ecdsa-0.6.tar.gz" } ], "0.7": [ { "comment_text": "", "digests": { "md5": "cdf12b87e2f3cd96bac221b87a8eee52", "sha256": "3fe6ec84b6efadc5523e1549cec1cbd3f19f83bab28163802d024a717a7671cd" }, "downloads": -1, "filename": "ecdsa-0.7.tar.gz", "has_sig": false, "md5_digest": "cdf12b87e2f3cd96bac221b87a8eee52", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 35375, "upload_time": "2010-12-28T20:07:56", "url": "https://files.pythonhosted.org/packages/fb/c5/49e23d246bda83e37a6a99ca0e2f6455d0b78f3a6c43b3d939a1f0dd02cf/ecdsa-0.7.tar.gz" } ], "0.8": [ { "comment_text": "", "digests": { "md5": "a3575705afb24d7cbc1694960d3965b1", "sha256": "926dbc7f31f5e099079884e1ae8121d25c43b17f1db48d77c9540cd1e40acc1a" }, "downloads": -1, "filename": "ecdsa-0.8.tar.gz", "has_sig": false, "md5_digest": "a3575705afb24d7cbc1694960d3965b1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 35754, "upload_time": "2012-07-13T21:13:19", "url": "https://files.pythonhosted.org/packages/92/de/b4299eab4b538170c089c2b1c4e75c031b6c3d71c29540fe15861cd178e3/ecdsa-0.8.tar.gz" } ], "0.9": [ { "comment_text": "", "digests": { "md5": "2b9c35245ce391d6b7d8f991aad5c630", "sha256": "3f283a4769220dc59587677d264c6687ecd0dc068d6ad792d891d53757735800" }, "downloads": -1, "filename": "ecdsa-0.9.tar.gz", "has_sig": false, "md5_digest": "2b9c35245ce391d6b7d8f991aad5c630", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 45178, "upload_time": "2013-10-02T00:11:45", "url": "https://files.pythonhosted.org/packages/8d/b5/4956a11caa082de8b1f54d4bf0bd7e90076154c1dba152db58f79f2b638c/ecdsa-0.9.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "531b03c68145ac3629461fc451bd0426", "sha256": "9814e700890991abeceeb2242586024d4758c8fc18445b194a49bd62d85861db" }, "downloads": -1, "filename": "ecdsa-0.13.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "531b03c68145ac3629461fc451bd0426", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 52113, "upload_time": "2019-10-07T14:05:22", "url": "https://files.pythonhosted.org/packages/a6/81/2b170b460c84fdc8700cf08aa077ac6a9ff41f4ad3f05d0b3a64ba9f8f2e/ecdsa-0.13.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b1b33f7fe171eb1278de6f93eefc34f8", "sha256": "163c80b064a763ea733870feb96f9dd9b92216cfcacd374837af18e4e8ec3d4d" }, "downloads": -1, "filename": "ecdsa-0.13.3.tar.gz", "has_sig": false, "md5_digest": "b1b33f7fe171eb1278de6f93eefc34f8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 60477, "upload_time": "2019-10-07T14:05:24", "url": "https://files.pythonhosted.org/packages/8c/d8/9c3596fd0f18ae0a76333492a119c00183323d8e64de1a4f4bd642856963/ecdsa-0.13.3.tar.gz" } ] }