tinyec


Nametinyec JSON
Version 0.4.0 PyPI version JSON
download
home_pagehttps://github.com/alexmgr/tinyec
SummaryA tiny library to perform arithmetic operations on elliptic curves in pure python
upload_time2021-11-08 19:15:51
maintainer
docs_urlNone
authorAlex Moneger
requires_python
licenseGPLv3
keywords elliptic curves crypto tls ssl ecdhe diffie-hellman
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # tinyec
A tiny library to perform arithmetic operations on elliptic curves in pure python. No dependencies.

**This is not a library suitable for production.** It is useful for security professionals to understand the inner workings of EC, and be able to play with pre-defined curves.

## installation
`pip install tinyec`

## usage
There are 2 main classes:
* Curve(), which describes an elliptic curve in a finite field
* Point(), which describes a point belonging to an EC

**Warning** Calculation on points outside the curve are allowed. They will only raise a warning.

### working on existing curves
Example use on the NIST routine samples => https://www.nsa.gov/ia/_files/nist-routines.pdf:
```python
>>> import tinyec.ec as ec
>>> import tinyec.registry as reg
>>> c = reg.get_curve("secp192r1")
>>> s = ec.Point(c, 0xd458e7d127ae671b0c330266d246769353a012073e97acf8, 0x325930500d851f336bddc050cf7fb11b5673a1645086df3b)
>>> t = ec.Point(c, 0xf22c4395213e9ebe67ddecdd87fdbd01be16fb059b9753a4, 0x264424096af2b3597796db48f8dfb41fa9cecc97691a9c79)
>>> r = s + t
>>> r
(1787070900316344022479363585363935252075532448940096815760, 1583034776780933252095415958625802984888372377603917916747) on secp192r1 => y^2 = x^3 + 6277101735386680763835789423207666416083908700390324961276x + 2455155546008943817740293915197451784769108058161191238065 
(mod 6277101735386680763835789423207666416083908700390324961279)
>>> hex(r.x)
'0x48e1e4096b9b8e5ca9d0f1f077b8abf58e843894de4d0290L'
>>> hex(r.y)
'0x408fa77c797cd7dbfb16aa48a3648d3d63c94117d7b6aa4bL'
>>> r = s - t
>>> r
(6193438478050209507979672067809269724375390027440522152494, 226636415264149817017346905052752138772359775362461041003) on secp192r1 => y^2 = x^3 + 6277101735386680763835789423207666416083908700390324961276x + 2455155546008943817740293915197451784769108058161191238065 (
mod 6277101735386680763835789423207666416083908700390324961279)
>>> hex(r.x)
'0xfc9683cc5abfb4fe0cc8cc3bc9f61eabc4688f11e9f64a2eL'
>>> hex(r.y)
'0x93e31d00fb78269732b1bd2a73c23cdd31745d0523d816bL'
>>> r = 2 * s
>>> r
(1195895923065450997501505402941681398272052708885411031394, 340030206158745947396451508065335698335058477174385838543) on secp192r1 => y^2 = x^3 + 6277101735386680763835789423207666416083908700390324961276x + 2455155546008943817740293915197451784769108058161191238065 (
mod 6277101735386680763835789423207666416083908700390324961279)
>>> hex(r.x)
'0x30c5bc6b8c7da25354b373dc14dd8a0eba42d25a3f6e6962L'
>>> hex(r.y)
'0xdde14bc4249a721c407aedbf011e2ddbbcb2968c9d889cfL'
>>> d = 0xa78a236d60baec0c5dd41b33a542463a8255391af64c74ee
>>> r = d * s
>>> hex(r.x)
'0x1faee4205a4f669d2d0a8f25e3bcec9a62a6952965bf6d31L'
>>> hex(r.y)
'0x5ff2cdfa508a2581892367087c696f179e7a4d7e8260fb06L'
>>> e = 0xc4be3d53ec3089e71e4de8ceab7cce889bc393cd85b972bc
>>> r = d * s + e * t
>>> r
(39786866609245082371772779541859439402855864496422607838, 547967566579883709478937502153554894699060378424501614148) on secp192r1 => y^2 = x^3 + 6277101735386680763835789423207666416083908700390324961276x + 2455155546008943817740293915197451784769108058161191238065 (mo
d 6277101735386680763835789423207666416083908700390324961279)
>>> hex(r.x)
'0x19f64eed8fa9b72b7dfea82c17c9bfa60ecb9e1778b5bdeL'
>>> hex(r.y)
'0x16590c5fcd8655fa4ced33fb800e2a7e3c61f35d83503644L'
```

### working on custom curves
If needed, you can also work on your own curves. Here we take a a prime field 97, with a generator point (1, 2), an order 5 and a cofactor of 1:
```python
>>> import tinyec.ec as ec
>>> field = ec.SubGroup(97, (1, 2), 5, 1)
>>> curve = ec.Curve(2, 3, field)
tinyec/ec.py:115: UserWarning: Point (1, 2) is not on curve "undefined" => y^2 = x^3 + 2x + 3 (mod 97)
  warnings.warn("Point (%d, %d) is not on curve %s" % (self.x, self.y, self.curve))
>>> # Warning is generated because the generator point does not belong to the curve
>>> p1 = ec.Point(curve, -5, 3)
>>> p1.on_curve
False
>>> p2 = ec.Point(curve, 22, 5)
>>> p2.on_curve
True
>>> print(p1 + p2)
(18, 42) off "undefined" => y^2 = x^3 + 2x + 3 (mod 97)
```
            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/alexmgr/tinyec",
    "name": "tinyec",
    "maintainer": "",
    "docs_url": null,
    "requires_python": "",
    "maintainer_email": "",
    "keywords": "elliptic,curves,crypto,tls,ssl,ecdhe,diffie-hellman",
    "author": "Alex Moneger",
    "author_email": "alexmgr+github@gmail.com",
    "download_url": "https://files.pythonhosted.org/packages/76/2f/1bf6060620aae864597422ed50a0b46ad66a720d22e0f5d6c62e58aebff9/tinyec-0.4.0.tar.gz",
    "platform": "",
    "description": "# tinyec\nA tiny library to perform arithmetic operations on elliptic curves in pure python. No dependencies.\n\n**This is not a library suitable for production.** It is useful for security professionals to understand the inner workings of EC, and be able to play with pre-defined curves.\n\n## installation\n`pip install tinyec`\n\n## usage\nThere are 2 main classes:\n* Curve(), which describes an elliptic curve in a finite field\n* Point(), which describes a point belonging to an EC\n\n**Warning** Calculation on points outside the curve are allowed. They will only raise a warning.\n\n### working on existing curves\nExample use on the NIST routine samples => https://www.nsa.gov/ia/_files/nist-routines.pdf:\n```python\n>>> import tinyec.ec as ec\n>>> import tinyec.registry as reg\n>>> c = reg.get_curve(\"secp192r1\")\n>>> s = ec.Point(c, 0xd458e7d127ae671b0c330266d246769353a012073e97acf8, 0x325930500d851f336bddc050cf7fb11b5673a1645086df3b)\n>>> t = ec.Point(c, 0xf22c4395213e9ebe67ddecdd87fdbd01be16fb059b9753a4, 0x264424096af2b3597796db48f8dfb41fa9cecc97691a9c79)\n>>> r = s + t\n>>> r\n(1787070900316344022479363585363935252075532448940096815760, 1583034776780933252095415958625802984888372377603917916747) on secp192r1 => y^2 = x^3 + 6277101735386680763835789423207666416083908700390324961276x + 2455155546008943817740293915197451784769108058161191238065 \n(mod 6277101735386680763835789423207666416083908700390324961279)\n>>> hex(r.x)\n'0x48e1e4096b9b8e5ca9d0f1f077b8abf58e843894de4d0290L'\n>>> hex(r.y)\n'0x408fa77c797cd7dbfb16aa48a3648d3d63c94117d7b6aa4bL'\n>>> r = s - t\n>>> r\n(6193438478050209507979672067809269724375390027440522152494, 226636415264149817017346905052752138772359775362461041003) on secp192r1 => y^2 = x^3 + 6277101735386680763835789423207666416083908700390324961276x + 2455155546008943817740293915197451784769108058161191238065 (\nmod 6277101735386680763835789423207666416083908700390324961279)\n>>> hex(r.x)\n'0xfc9683cc5abfb4fe0cc8cc3bc9f61eabc4688f11e9f64a2eL'\n>>> hex(r.y)\n'0x93e31d00fb78269732b1bd2a73c23cdd31745d0523d816bL'\n>>> r = 2 * s\n>>> r\n(1195895923065450997501505402941681398272052708885411031394, 340030206158745947396451508065335698335058477174385838543) on secp192r1 => y^2 = x^3 + 6277101735386680763835789423207666416083908700390324961276x + 2455155546008943817740293915197451784769108058161191238065 (\nmod 6277101735386680763835789423207666416083908700390324961279)\n>>> hex(r.x)\n'0x30c5bc6b8c7da25354b373dc14dd8a0eba42d25a3f6e6962L'\n>>> hex(r.y)\n'0xdde14bc4249a721c407aedbf011e2ddbbcb2968c9d889cfL'\n>>> d = 0xa78a236d60baec0c5dd41b33a542463a8255391af64c74ee\n>>> r = d * s\n>>> hex(r.x)\n'0x1faee4205a4f669d2d0a8f25e3bcec9a62a6952965bf6d31L'\n>>> hex(r.y)\n'0x5ff2cdfa508a2581892367087c696f179e7a4d7e8260fb06L'\n>>> e = 0xc4be3d53ec3089e71e4de8ceab7cce889bc393cd85b972bc\n>>> r = d * s + e * t\n>>> r\n(39786866609245082371772779541859439402855864496422607838, 547967566579883709478937502153554894699060378424501614148) on secp192r1 => y^2 = x^3 + 6277101735386680763835789423207666416083908700390324961276x + 2455155546008943817740293915197451784769108058161191238065 (mo\nd 6277101735386680763835789423207666416083908700390324961279)\n>>> hex(r.x)\n'0x19f64eed8fa9b72b7dfea82c17c9bfa60ecb9e1778b5bdeL'\n>>> hex(r.y)\n'0x16590c5fcd8655fa4ced33fb800e2a7e3c61f35d83503644L'\n```\n\n### working on custom curves\nIf needed, you can also work on your own curves. Here we take a a prime field 97, with a generator point (1, 2), an order 5 and a cofactor of 1:\n```python\n>>> import tinyec.ec as ec\n>>> field = ec.SubGroup(97, (1, 2), 5, 1)\n>>> curve = ec.Curve(2, 3, field)\ntinyec/ec.py:115: UserWarning: Point (1, 2) is not on curve \"undefined\" => y^2 = x^3 + 2x + 3 (mod 97)\n  warnings.warn(\"Point (%d, %d) is not on curve %s\" % (self.x, self.y, self.curve))\n>>> # Warning is generated because the generator point does not belong to the curve\n>>> p1 = ec.Point(curve, -5, 3)\n>>> p1.on_curve\nFalse\n>>> p2 = ec.Point(curve, 22, 5)\n>>> p2.on_curve\nTrue\n>>> print(p1 + p2)\n(18, 42) off \"undefined\" => y^2 = x^3 + 2x + 3 (mod 97)\n```",
    "bugtrack_url": null,
    "license": "GPLv3",
    "summary": "A tiny library to perform arithmetic operations on elliptic curves in pure python",
    "version": "0.4.0",
    "project_urls": {
        "Download": "https://github.com/alexmgr/tinyec/archive/v0.4.0.tar.gz",
        "Homepage": "https://github.com/alexmgr/tinyec"
    },
    "split_keywords": [
        "elliptic",
        "curves",
        "crypto",
        "tls",
        "ssl",
        "ecdhe",
        "diffie-hellman"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "762f1bf6060620aae864597422ed50a0b46ad66a720d22e0f5d6c62e58aebff9",
                "md5": "93f4ef068315a277fc5682094e1578f1",
                "sha256": "b0364aab3b9af632b64f24eafae0c8e56cc64b4845648752610f48f2ab0547a3"
            },
            "downloads": -1,
            "filename": "tinyec-0.4.0.tar.gz",
            "has_sig": false,
            "md5_digest": "93f4ef068315a277fc5682094e1578f1",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": null,
            "size": 24069,
            "upload_time": "2021-11-08T19:15:51",
            "upload_time_iso_8601": "2021-11-08T19:15:51.532369Z",
            "url": "https://files.pythonhosted.org/packages/76/2f/1bf6060620aae864597422ed50a0b46ad66a720d22e0f5d6c62e58aebff9/tinyec-0.4.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2021-11-08 19:15:51",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "alexmgr",
    "github_project": "tinyec",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": false,
    "lcname": "tinyec"
}
        
Elapsed time: 0.14662s