{ "info": { "author": "Unchained Capital Engineering", "author_email": "engineering@unchained-capital.com", "bugtrack_url": null, "classifiers": [ "License :: OSI Approved :: Apache Software License", "Operating System :: OS Independent", "Programming Language :: Python :: 3" ], "description": "Hermit\n======\n[![PyPI](https://img.shields.io/pypi/v/hermit.svg)](https://pypi.python.org/pypi)\n[![Travis](https://img.shields.io/travis/unchained-capital/hermit.svg)](https://travis-ci.org/unchained-capital/hermit/)\n[![Codecov](https://img.shields.io/codecov/c/github/unchained-capital/hermit.svg)](https://codecov.io/gh/unchained-capital/hermit/)\n\nHermit is a sharded,\n[HD](https://en.bitcoin.it/wiki/Deterministic_wallet) command-line\nwallet designed for cryptocurrency owners who demand the highest\npossible form of security.\n\nHermit implements the\n[SLIP-0039](https://github.com/satoshilabs/slips/blob/master/slip-0039.md)\nstandard for hierarchical Shamir sharding.\n\nHermit is designed to operate in tandem with an online wallet which\ncan talk to a blockchain. All communication between the user, Hermit,\nand the online wallet is done via QR codes, cameras, screen, and\nkeyboard.\n\nThis means that a Hermit installation does not require WiFi,\nBluetooth, or any other form of wired or wireless communication.\nHermit can operate in a completely air-gapped environment.\n\nRead on or watch these videos to learn more about Hermit:\n\n* [Creating a shard family](https://www.youtube.com/watch?v=tOc0GBjIK8Y&feature=youtu.be)\n* [Exporting/importing shards](https://www.youtube.com/watch?v=usBk-X3a4Qo&feature=youtu.be)\n* [Export a public key](https://www.youtube.com/watch?v=ut9ALBqjZbg&feature=youtu.be)\n* [Sign a bitcoin transaction](https://www.youtube.com/watch?v=NYjJa0fUxQE&feature=youtu.be)\n\n\n\nQuickstart\n----------\n\n```\n$ pip install hermit # may need 'sudo' for this command\n...\n$ hermit # launch hermit\n...\nwallet> help # see wallet commands\n...\nwallet> shards # enter shard mode\n...\nshards> help # see shard commands\n...\nshards> list-shards # see current shards\n...\nshards> build-family-from-random # create new shard family from random data\n...\nshards> list-shards # see newly created shards\n...\nshards> write # save newly created shards to disk\nshards> quit # back to wallet mode\nwallet> export-xpub m/45'/0'/0' # export an extended public key\n...\nwallet> sign-bitcoin # sign a bitcoin transaction\n # see examples/signature_requests/bitcoin_testnet.png\n\n...\n```\n\nSee more details in the \"Usage\" section below.\n\nDesign\n------\n\nHermit follows the following design principles:\n\n * Unidirectional information transfer -- information should only move in one direction\n * Always-on sharding & encryption -- keys should always be sharded and each shard encrypted\n * Open-source everything -- complete control over your software and hardware gives you the best security\n * Flexibility for human security -- you can customize the sharding configuration to suit your organization\n\n### Audience\n\nHermit is a difficult to use but highly-secure wallet.\n\nHermit is **not recommended** for non-technical individuals with a\nsmall amount of cryptocurrency.\n\nHermit is designed for computer-savvy people and organizations to\nself-custody significant amounts of cryptocurrency.\n\n### Sharding\n\nHermit is different than other wallets you may have used because it\nalways shards your key.\n\nSharding is done using\n[SLIP-39](https://github.com/satoshilabs/slips/blob/master/slip-0039.md)\nwhich means there are two levels of structure:\n\n* Groups -- some quorum of *P* of *Q* groups is required to unlock a key\n\n* Shards -- some quorum of *n* of *m* shards is required to unlock\n each group, with *n* and *m* possibly different for each group\n\nThis structure creates a lot of flexibility for different scenarios.\n\nHermit extends the current SLIP-39 proposal by encrypting each shard\nwith a password.\n\nShards in Hermit are generally encrypted by a password. Each shard has\nits own password, allowing for teams to operate a key together, each\nteam member operating a given shard (in some group). However, if the\nuser explicitly supplies an empty string as the password when either\ncreating a shard, or changing the password on the shard, the resulting\nshard will be unencrypted. While this makes the transport of the shard\nless safe, it does make it possible to export the shards to technologies\nthat support only unencrypted SLIP-39 implementations.\n\n#### Compatibility with other wallets\n\nIf you are using a non-sharded wallet such as a hardware wallet\n(Trezor, Ledger, &c.) or Electrum, you can import your key from your\nBIP39 \"seed phrase\" and Hermit will shard it for you.\n\nYou may also input a new key using whatever source of randomness you\nlike.\n\nHermit will **not** export keys as BIP39 phrases; only as encrypted\nSLIP39 phrases. This means it is challenging to extract a key from a\nHermit installation for use in, for example, a hardware wallet or\nElectrum. This constraint is present by design.\n\n### Input & Output\n\nHermit is designed to be deployed in air-gapped environments.\n\n* The only way data should be able to enter the device Hermit is\n running on is via keyboard and camera.\n\n* The only way data can leave Hermit is via the screen of the device\n it is running on.\n\nHermit has no idea what is happening on the blockchain and relies on\nan external, online wallet application to draft transaction requests.\nThese transaction requests are passed to Hermit via QR codes.\nSignatures produced by Hermit are similarly displayed on screen as QR\ncodes.\n\nThe usage of QR codes for transaction requests and signatures creates\na limit to how complex of a transaction Hermit can sign. This\nlimitation will be addressed by a QR code packeting algorithm one day.\n\n### Storage\n\nHermit uses 3 storage locations:\n\n _________ _____________ ____________\n | | | | | |\n | memory | -- write -> | filesystem | -- persist --> | data store |\n |_________| |_____________| |____________|\n\n\nWhen Hermit first boots, shards from the data store or filesystem\n(in that order) are loaded into memory. Changes made to shards\nare always made *in memory* and will not survive Hermit restarts.\n\nTo save data across Hermit restarts, ensure you `write` it to the\nfilesystem.\n\nIf your Hermit lives on a read-only filesystem, to save data\nacross Hermit machine restarts, ensure you `persist` it to the\ndata store.\n\n### Modes\n\nHermit is a modal application with two modes:\n\n* `wallet` mode is where you will spend most of your time, signing transactions and exporting public keys\n* `shards` mode is accessed when you need to import keys or shards, export shards, or otherwise change something about how your key is unlocked\n\n### Bitcoin Only\n\nAs a sharded, HD wallet, Hermit is a tool that can be used with any\ncryptocurrency that operates with the BIP32 standard.\n\nBut Hermit also ships with a `sign-bitcoin` command that will sign\nBitcoin (BTC) transactions.\n\nYou can extend Hermit for other cryptocurrencies if you need; see the\n\"Plugins\" section below.\n\nUsage\n-----\n\n### Installation\n\nInstalling Hermit can be done via `pip`:\n\n```\n$ pip install hermit\n```\n\nIf you want to develop against Hermit, see the \"Developers\" section\nbelow for a different way of installing Hermit.\n\n### Starting Hermit\n\nTo start Hermit, just run the `hermit` command.\n\n```\n$ hermit\n```\n\nYou can also pass a configuration file\n\n```\n$ HERMIT_CONFIG=/path/to/hermit.yml hermit\n```\n\nSee the \"Configuration\" section below for more information on how to\nconfigure Hermit.\n\n### Creating a Key\n\nBefore you can do much with Hermit you'll need to create or import at\nleast one key. To do so, first enter shards mode:\n\n```\n$ hermit\n...\nwallet> shards\n```\n\nTwo `shard` mode commands will let you import a key:\n\n* `build-family-from-phrase` -- enter a BIP39 phrase. This is useful if you are importing a key from a hardware wallet such as Trezor or Ledger or from another software wallet such as Electrum.\n* `build-family-from-random` -- enter random characters. This is useful if you want to generate your own entropy (from, say, rolling dice)\n\nWhichever you choose, you will be prompted to enter a shard configuration.\n\nCreating a secure shard set from a key requires additional randomness\nbeyond the seed of the key. So even if you choose to\n`build-family-from-phrase`, you will still be asked to input random\ncharacters. Ensure you are prepared to do so using a good source of\nrandomness (such as rolling dice).\n\n\n### Exporting Public Keys\n\nHermit can export public keys (or extended public keys) from the key\nit protects. These are useful for other applications which want to\nrefer to Hermit's key but, obviously, can't be allowed to see its\nprivate contents.\n\nTwo `wallet` mode commands are useful for this:\n\n* `export-xpub` -- exports an extended public key\n* `export-pub` -- exports a public key\n\nEach of these commands expects a BIP32 path as an argument and each\nwill display its data as a QR code.\n\n### Signing Transactions\n\nThe whole point of Hermit is to ultimately sign transactions.\nTransaction signature requests must be created by an external\napplication. You can also use a test signature request available at\n[examples/signature_requests/bitcoin.png](examples/signature_requests/bitcoin.png).\n\nOnce you have a signature request, and you're in `wallet` mode, you\ncan run `sign-bitcoin` to start signing a Bitcoin transaction.\n\n### Configuration\n\nHermit looks for a configuration file at `/etc/hermit.yml` by default.\nYou can change this path by passing the`HERMIT_CONFIG` environment\nvariable when you start the `hermit` program:\n\n```\n$ HERMIT_CONFIG=/path/to/hermit.yml hermit\n```\n\nThe configuration file is a YAML file. See the documentation for the\n`HermitConfig` class for details on allowed configuration settings.\n\n\nDevelopers\n----------\n\nDevelopers will want to clone a copy of the Hermit source code:\n\n```\n$ git clone --recursive https://github.com/unchained-capital/hermit\n$ cd hermit\n$ make\n```\n\n**NOTE:** To develop using the Hermit code in this directory, run\n`source environment.sh`. This applies to all the commands below in\nthis section.\n\n### Testing\n\nHermit ships with a full [pytest] suite. Run it as follows:\n\n```\n$ source environment.sh\n$ make test\n$ make lint\n```\n\nHermit has been tested on the following platforms:\n\n* OS X High Sierra 10.13.6\n* Linux Ubuntu 18.04\n* Linux Slax 9.6.4\n\nThere is also a full-flow example script provided at\n(tests/test_script.md)[tests/test_script.md] that you can follow to\nsee and test all functionality.\n\n\n### Developers\n\n#### Integrating\n\nHermit needs an external, online wallet application in order to work.\nThis application has a few ways it may need to integrate with\nHermit:\n\n* Read a public key displayed by Hermit\n\n* Generate a signature request for Hermit (see [examples/signature_requests/bitcoin_testnet.json](examples/signature_requests/bitcoin_testnet.json))\n\n* Read a signature displayed by Hermit (see [examples/signatures/bitcoin.json](examples/signatures/bitcoin.json))\n\nIn all cases, Hermit uses the same scheme to encode/decode data into\nQR codes. The pipelines look like this:\n\n * To create a QR code from a `string`: utf-8 encode -> gzip-compress -> Base32 encode\n * To parse a QR code `string`: Base32 decode -> gzip-decompress -> utf-8 decode\n\nThe `string` data may sometimes itself be JSON.\n\n#### Plugins\n\nHermit allows you to write plugins to extend its functionality. This\nis chiefly so that you can write `Signer` classes for cryptocurrencies\nbeyond Bitcoin (BTC).\n\nThe default directory for plugin code is `/var/lib/hermit`. Any\n`*.py` files in this directory will be loaded by Hermit when it boots\n(though you can customize this directory; see the \"Configuration\"\nsection above).\n\nAn example signer class is below\n\n```python\n#\n# Example signer class for a putative \"MyCoin\" currency.\n#\n# Put in /var/lib/hermit/mycoin_signer.py\n#\n\nfrom hermit.errors import InvalidSignatureRequest\nfrom hermit.signer.base import Signer\nfrom hermit.ui.wallet import wallet_command\nimport hermit.ui.state as state\n\n# Some library for MyCoin\nfrom mycoin_lib import sign_mycoin_transaction\n\nclass MyCoinSigner(Signer):\n \"\"\"Signs MyCoin transactions\"\"\"\n\n def validate_request(self) -> None:\n \"\"\"Validates a MyCoin signature request\"\"\"\n\t# This is built into the Signer class\n\tself.validate_bip32_path(request.get('bip32_path'))\n\n\t# this isn't great validation code, but you get the point...\n\tif 'input' not in self.request:\n\t raise InvalidSignatureRequest(\"The param 'input' is required.\")\n\tif 'output' not in self.request:\n\t raise InvalidSignatureRequest(\"The param 'output' is required.\")\n\tif 'amount' not in self.request:\n\t raise InvalidSignatureRequest(\"The param 'amount' is required.\")\n\n\tself.bip32_path = self.request['bip32_path']\n\tself.input = self.request[input]\n\tself.output = self.request['output']\n\tself.amount = self.request['amount']\n\n def display_request(self) -> None:\n \"\"\"Displays the transaction to be signed\"\"\"\n print(\"\"\"\n INPUT: {}\n\tOUTPUT: {}\n\tAMOUNT: {}\n SIGNING AS: {}\n\t\"\"\".format(self.input,\n self.output,\n self.amount,\n\t self.bip32_path))\n\n def create_signature(self) -> None:\n \"\"\"Signs a transaction\"\"\"\n\tkeys = self.generate_child_keys(self.bip32_path)\n\t# Here is the magic of MyCoin...\n self.signature = sign_mycoin_transaction(self.input, self.output, self.amount, keys)\n\n@wallet_command('sign-mycoin')\ndef sign_mycoin():\n \"\"\"usage: sign-mycoin\n\n Create a signature for a MyCoin transaction.\n\n Hermit will open a QR code reader window and wait for you to scan an\n Ethereum transaction signature request.\n\n Once scanned, the details of the signature request will be displayed\n on screen and you will be prompted whether or not you want to sign\n the transaction.\n\n If you agree, Hermit will open a window displaying the signature as\n a QR code.\n\n Creating a signature requires unlocking the wallet.\n\n \"\"\"\n MyCoinSigner(state.Wallet, state.Session).sign()\n```\n\n#### Contributing to Hermit\n\nUnchained Capital welcomes bug reports, new features, and better\ndocumentation for Hermit. To contribute, create a pull request (PR)\non GitHub against the [Unchained Capital fork of\nHermit](https://github.com/unchained-capital/hermit).\n\nBefore you submit your PR, make sure to lint your code and run the test suite!\n\n```\n$ source environment.sh\n$ make test\n$ make lint\n```\n\n(Linting is done with [flake8] and [mypy].)\n\n[pytest]: https://docs.pytest.org/en/latest/\n[flake8]: http://flake8.pycqa.org/en/latest/\n[mypy]: http://mypy-lang.org/\n[bip32]: https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki\n\n## Key rotation\n\nEach individual share should be managed by a team. Each team has multiple\ncopies of the passphrase to decrypt the share. The share only exists on the\nHermit device, and it's encrypted. Rotating out a member is achieved by using\none of the other team members to decrypt the share and then re-encrypting the\nshare with a new passphrase, thus excluding the previous user.\n\n## TODO\n\n* Validate wallet public keys/signatures against the provided redeem script in the bitcoin signer.\n* Re-do QR-code protocol details once a [standard emerges](https://www.blockchaincommons.com)\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/unchained-captial/hermit", "keywords": "", "license": "", "maintainer": "", "maintainer_email": "", "name": "hermit", "package_url": "https://pypi.org/project/hermit/", "platform": "", "project_url": "https://pypi.org/project/hermit/", "project_urls": { "Homepage": "https://github.com/unchained-captial/hermit" }, "release_url": "https://pypi.org/project/hermit/0.1.12/", "requires_dist": [ "Babel (==2.7.0)", "Click (==7.0)", "Jinja2 (==2.10.1)", "MarkupSafe (==1.1.1)", "Pillow (==6.2.0)", "PyYAML (==5.1.1)", "Pygments (==2.4.2)", "Sphinx (==1.8.5)", "alabaster (==0.7.12)", "asn1crypto (==0.24.0)", "atomicwrites (==1.3.0)", "attrs (==19.1.0)", "bleach (==3.1.0)", "bson (==0.5.8)", "certifi (==2019.6.16)", "cffi (==1.12.3)", "chardet (==3.0.4)", "colorama (==0.4.1)", "coverage (==4.5.4)", "cryptography (==2.7)", "docutils (==0.15.2)", "ecdsa (==0.13.3)", "entrypoints (==0.3)", "flake8 (==3.7.7)", "idna (==2.8)", "imagesize (==1.1.0)", "importlib-metadata (==0.19)", "imutils (==0.5.1)", "mccabe (==0.6.1)", "mnemonic (==0.18)", "more-itertools (==7.2.0)", "mypy-extensions (==0.4.1)", "mypy (==0.701)", "numpy (==1.17.0)", "opencv-python (==3.4.3.18)", "packaging (==19.1)", "pbkdf2 (==1.3)", "pkginfo (==1.5.0.1)", "pluggy (==0.12.0)", "prompt-toolkit (==2.0.7)", "py (==1.8.0)", "pyAesCrypt (==0.4.2)", "pycodestyle (==2.5.0)", "pycparser (==2.19)", "pyflakes (==2.1.1)", "pyparsing (==2.4.2)", "pysha3 (==1.0.2)", "pytest-cov (==2.6.1)", "pytest (==4.4.0)", "python-bitcoinlib (==0.10.1)", "python-dateutil (==2.8.0)", "pytz (==2019.2)", "pyzbar (==0.1.7)", "qrcode (==6.0)", "readme-renderer (==24.0)", "requests-toolbelt (==0.9.1)", "requests (==2.22.0)", "shamir-mnemonic (==0.1.0)", "six (==1.12.0)", "snowballstemmer (==1.9.0)", "sphinxcontrib-websupport (==1.1.2)", "tqdm (==4.32.2)", "twine (==1.13.0)", "typed-ast (==1.3.5)", "urllib3 (==1.25.3)", "wcwidth (==0.1.7)", "webencodings (==0.5.1)", "zipp (==0.5.2)" ], "requires_python": "", "summary": "Unchained Capital Hermit", "version": "0.1.12", "yanked": false, "yanked_reason": null }, "last_serial": 6416024, "releases": { "0.1.1": [ { "comment_text": "", "digests": { "md5": "67b6378e75d1ca63ce8e96b3478cd642", "sha256": "b27ac7746d22c880cf9cbe2d70f3694c49000436d2c1a1607f928692dca0c173" }, "downloads": -1, "filename": "hermit-0.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "67b6378e75d1ca63ce8e96b3478cd642", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 100810, "upload_time": "2019-07-31T18:47:54", "upload_time_iso_8601": "2019-07-31T18:47:54.388051Z", "url": "https://files.pythonhosted.org/packages/30/db/f70b9170258ad9b16f4adeb1ba54bf460ee2d2936b146e2aed7c8d74a8ed/hermit-0.1.1-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "bdd0605b39086a23a25165357145c0e1", "sha256": "06869b4b1dba2318a48360c6ba29587a193efc94e3ab6ef1357de84d8250839d" }, "downloads": -1, "filename": "hermit-0.1.1.tar.gz", "has_sig": false, "md5_digest": "bdd0605b39086a23a25165357145c0e1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 74345, "upload_time": "2019-07-31T18:47:56", "upload_time_iso_8601": "2019-07-31T18:47:56.372321Z", "url": "https://files.pythonhosted.org/packages/7d/fb/f6ff8b8b14b2477b8a1d7a143c1845c4172e5de5389bb83ab6df19b16c75/hermit-0.1.1.tar.gz", "yanked": false, "yanked_reason": null } ], "0.1.11": [ { "comment_text": "", "digests": { "md5": "a21d404d35ac8112c7d06e5caed1fce7", "sha256": "2eb08d8f24e1e67c823b3e7df7c45e3a45c86c04ecbd8546e0695c38dab21b57" }, "downloads": -1, "filename": "hermit-0.1.11-py3-none-any.whl", "has_sig": false, "md5_digest": "a21d404d35ac8112c7d06e5caed1fce7", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 103776, "upload_time": "2019-11-20T16:06:02", "upload_time_iso_8601": "2019-11-20T16:06:02.773049Z", "url": "https://files.pythonhosted.org/packages/a1/b4/ce5c33a5069192d9bbbc66de82444215837269b1e5c7d525fb5b177290b6/hermit-0.1.11-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "4315255403231b570b1fe49d3fde6a29", "sha256": "983e48c9944348389fab9731b95fd1f462465aa3eaa82138b503f70ea138d431" }, "downloads": -1, "filename": "hermit-0.1.11.tar.gz", "has_sig": false, "md5_digest": "4315255403231b570b1fe49d3fde6a29", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 77552, "upload_time": "2019-11-20T16:06:04", "upload_time_iso_8601": "2019-11-20T16:06:04.794783Z", "url": "https://files.pythonhosted.org/packages/78/f5/eba80eb80ae1a8b500f66703410829e733d2afe67f2f62d3a67908b2e966/hermit-0.1.11.tar.gz", "yanked": false, "yanked_reason": null } ], "0.1.12": [ { "comment_text": "", "digests": { "md5": "677268ed57efcd097988ec59abe4690d", "sha256": "6a3875a7bf8d31533e6b579df582eeb9c768557e91786139a06c3a209e0e5444" }, "downloads": -1, "filename": "hermit-0.1.12-py3.7.egg", "has_sig": false, "md5_digest": "677268ed57efcd097988ec59abe4690d", "packagetype": "bdist_egg", "python_version": "3.7", "requires_python": null, "size": 179606, "upload_time": "2020-01-08T15:58:51", "upload_time_iso_8601": "2020-01-08T15:58:51.681607Z", "url": "https://files.pythonhosted.org/packages/5f/72/96cb169f31c31cd3b5ed9772a3d73729433f9e3b815cc082a48a0a1a10ab/hermit-0.1.12-py3.7.egg", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "9a2213c654036afc337a9b33c9dd13c2", "sha256": "e827b9a2fe9be380f01687da20120b40ae12b076a79724de3e2baa282abf122a" }, "downloads": -1, "filename": "hermit-0.1.12-py3-none-any.whl", "has_sig": false, "md5_digest": "9a2213c654036afc337a9b33c9dd13c2", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 103729, "upload_time": "2020-01-08T15:58:49", "upload_time_iso_8601": "2020-01-08T15:58:49.453379Z", "url": "https://files.pythonhosted.org/packages/45/58/20414edc44187f63ea1a470feee428aabd22f5c5026168a48b7003292857/hermit-0.1.12-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "0ef5d6e0b5d5cfc1b1ea35b4e73eb0d9", "sha256": "c7d304411205d6ea6e32e349658fb6a153ff98c77b42d5628a8661efee2a8acb" }, "downloads": -1, "filename": "hermit-0.1.12.tar.gz", "has_sig": false, "md5_digest": "0ef5d6e0b5d5cfc1b1ea35b4e73eb0d9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 77515, "upload_time": "2020-01-08T15:58:53", "upload_time_iso_8601": "2020-01-08T15:58:53.358331Z", "url": "https://files.pythonhosted.org/packages/9f/67/cd372194c812f7333bb3f859ba2b16f750b9f19a82891976bb34647b07a8/hermit-0.1.12.tar.gz", "yanked": false, "yanked_reason": null } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "3e189246c5010706acb99b457ed8022c", "sha256": "8fd50796b933da92254dc72b4d52206de437e8cc615574e5366080889c897194" }, "downloads": -1, "filename": "hermit-0.1.2-py3-none-any.whl", "has_sig": false, "md5_digest": "3e189246c5010706acb99b457ed8022c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 100806, "upload_time": "2019-07-31T20:24:51", "upload_time_iso_8601": "2019-07-31T20:24:51.346156Z", "url": "https://files.pythonhosted.org/packages/0b/22/a2b1749ad158eb700f46ca2396b4779dc7ce354bb4a0dfbf6690c609c707/hermit-0.1.2-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "9a874f3872f31cb60016b53a03f66f68", "sha256": "d40920f28aea9735026b92fcf8aa632113ff8c886b0bce38d6de6275815190b7" }, "downloads": -1, "filename": "hermit-0.1.2.tar.gz", "has_sig": false, "md5_digest": "9a874f3872f31cb60016b53a03f66f68", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 74325, "upload_time": "2019-07-31T20:24:55", "upload_time_iso_8601": "2019-07-31T20:24:55.643318Z", "url": "https://files.pythonhosted.org/packages/2d/00/6c3ce88ea9cd7ea8997f3f6e1f4aae594c8909cdeb88cab8c2c1dfaf268b/hermit-0.1.2.tar.gz", "yanked": false, "yanked_reason": null } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "6cbcc3fbc44de241140eacd5841bbc6e", "sha256": "2ef22473ad166d972ed68b6ada554a36af184d0ee0b8cf26d5c716343aa75792" }, "downloads": -1, "filename": "hermit-0.1.3-py3-none-any.whl", "has_sig": false, "md5_digest": "6cbcc3fbc44de241140eacd5841bbc6e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 100793, "upload_time": "2019-07-31T21:29:08", "upload_time_iso_8601": "2019-07-31T21:29:08.981876Z", "url": "https://files.pythonhosted.org/packages/33/72/8e3de941de88b504eeebb829e03430c1b1c27cf300f05ab2bfab3e2f5d71/hermit-0.1.3-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "49aa6fa071ee1f7fb76ed6e77b774fcd", "sha256": "6d9adac869428fdb253cca0e4359dcaa235fbec146d37b5d455a7fd58491ddd8" }, "downloads": -1, "filename": "hermit-0.1.3.tar.gz", "has_sig": false, "md5_digest": "49aa6fa071ee1f7fb76ed6e77b774fcd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 74300, "upload_time": "2019-07-31T21:29:10", "upload_time_iso_8601": "2019-07-31T21:29:10.944906Z", "url": "https://files.pythonhosted.org/packages/7d/30/d09d5c3fae7fc0ae8e05315734bd6eb7432265e45d1f76b46e714f25dce2/hermit-0.1.3.tar.gz", "yanked": false, "yanked_reason": null } ], "0.1.4": [ { "comment_text": "", "digests": { "md5": "28dd9fd237c6ba251cfa7b69f6bde5c5", "sha256": "9ffadb6dfa5327cc9f545912cce52ef705814c6fb0c5c53fa2f57d9ecc45cd88" }, "downloads": -1, "filename": "hermit-0.1.4-py3-none-any.whl", "has_sig": false, "md5_digest": "28dd9fd237c6ba251cfa7b69f6bde5c5", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 102098, "upload_time": "2019-08-15T18:51:37", "upload_time_iso_8601": "2019-08-15T18:51:37.452305Z", "url": "https://files.pythonhosted.org/packages/95/8b/493b1ab4dead11fdf3b830578a757dfb6ec27c4b4b3a4e819ae9ae772c77/hermit-0.1.4-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "97aec715e66be2411339538cfad068a8", "sha256": "731b4f2f037397fa20340effb7cec4c371e74b2927f446809f71627f48d3551d" }, "downloads": -1, "filename": "hermit-0.1.4.tar.gz", "has_sig": false, "md5_digest": "97aec715e66be2411339538cfad068a8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 75640, "upload_time": "2019-08-15T18:51:39", "upload_time_iso_8601": "2019-08-15T18:51:39.502940Z", "url": "https://files.pythonhosted.org/packages/d0/88/645de8ef86df11359f02855eede1e27b23242603dd4099361bff04277b4d/hermit-0.1.4.tar.gz", "yanked": false, "yanked_reason": null } ], "0.1.5": [ { "comment_text": "", "digests": { "md5": "10b66028ece26b946ae50100f2650506", "sha256": "a082a4e31a16e66ba22a61fc505f183329c65259f235f70e9b1b8d1ab42130c2" }, "downloads": -1, "filename": "hermit-0.1.5-py3.7.egg", "has_sig": false, "md5_digest": "10b66028ece26b946ae50100f2650506", "packagetype": "bdist_egg", "python_version": "3.7", "requires_python": null, "size": 178639, "upload_time": "2019-10-30T21:15:42", "upload_time_iso_8601": "2019-10-30T21:15:42.594389Z", "url": "https://files.pythonhosted.org/packages/b8/7a/3a43f0264a4d1cd280412ed6d100c7b1a27d1181a022f7c628597253bfae/hermit-0.1.5-py3.7.egg", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "1b3f0fea5891401eb785a858485b4169", "sha256": "3ff3a0148c182bf2704197af114054ca057dc9b0009dbeba6673cc14c92393a4" }, "downloads": -1, "filename": "hermit-0.1.5-py3-none-any.whl", "has_sig": false, "md5_digest": "1b3f0fea5891401eb785a858485b4169", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 102121, "upload_time": "2019-08-15T21:56:52", "upload_time_iso_8601": "2019-08-15T21:56:52.758790Z", "url": "https://files.pythonhosted.org/packages/8d/3c/a56032e64145ac2221886171573b16f85dd7f5cd0f9ffabfbd2c1d44d29c/hermit-0.1.5-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "e177e80f59a656d05586a9bd6f8a42eb", "sha256": "94f9e4834b0f349dbd5872666b9d54530b799abd79f58ca25d4b2700bd2803dc" }, "downloads": -1, "filename": "hermit-0.1.5.tar.gz", "has_sig": false, "md5_digest": "e177e80f59a656d05586a9bd6f8a42eb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 75661, "upload_time": "2019-08-15T21:56:54", "upload_time_iso_8601": "2019-08-15T21:56:54.678991Z", "url": "https://files.pythonhosted.org/packages/f5/84/c34b0b8b52c42e2a0695c3baeda9c715c94f881c787b9ce476b60f3c9894/hermit-0.1.5.tar.gz", "yanked": false, "yanked_reason": null } ], "0.1.6": [ { "comment_text": "", "digests": { "md5": "4714a6bba831558da29d468e84766055", "sha256": "cd18f38aeedd70b97dea7528ca45f7803d3fe5b92e0611122c243d63db51dbac" }, "downloads": -1, "filename": "hermit-0.1.6-py3-none-any.whl", "has_sig": false, "md5_digest": "4714a6bba831558da29d468e84766055", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 102890, "upload_time": "2019-08-16T20:29:10", "upload_time_iso_8601": "2019-08-16T20:29:10.730397Z", "url": "https://files.pythonhosted.org/packages/ed/6b/a5b9bf29fd25b766b294a953327331881d722e3af5bddfbdcea548f463b4/hermit-0.1.6-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "954cdf94ca2268b2eabbb502ed855102", "sha256": "07941abe2130a2375e9924bfe20f79ff98b21b2a48fcee4596d25a4bd6994207" }, "downloads": -1, "filename": "hermit-0.1.6.tar.gz", "has_sig": false, "md5_digest": "954cdf94ca2268b2eabbb502ed855102", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 76319, "upload_time": "2019-08-16T20:29:12", "upload_time_iso_8601": "2019-08-16T20:29:12.717596Z", "url": "https://files.pythonhosted.org/packages/b9/13/332a4ea881a2d2a698e8dfdc9dcb0998736e68153df95a14be18b57ca00e/hermit-0.1.6.tar.gz", "yanked": false, "yanked_reason": null } ], "0.1.7": [ { "comment_text": "", "digests": { "md5": "6a2e01c9cc9e01f9b29d47bbfc54917d", "sha256": "f70d624089822181ea47c900b74386dc3357d82221b6949224467ea3eb326759" }, "downloads": -1, "filename": "hermit-0.1.7-py3.7.egg", "has_sig": false, "md5_digest": "6a2e01c9cc9e01f9b29d47bbfc54917d", "packagetype": "bdist_egg", "python_version": "3.7", "requires_python": null, "size": 179628, "upload_time": "2019-10-30T21:15:44", "upload_time_iso_8601": "2019-10-30T21:15:44.933831Z", "url": "https://files.pythonhosted.org/packages/96/c2/140453af85d7af5f68605fd0b651d92675ece141f6fe144e24c4cedae872/hermit-0.1.7-py3.7.egg", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "7bf2797a1c96481ea2dbcc252deb216d", "sha256": "7b9f97cb3ca7fbe5ffa167aa3392a852ae29a99ccf6301d08bfcef004c6dc27a" }, "downloads": -1, "filename": "hermit-0.1.7-py3-none-any.whl", "has_sig": false, "md5_digest": "7bf2797a1c96481ea2dbcc252deb216d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 104052, "upload_time": "2019-10-30T21:15:36", "upload_time_iso_8601": "2019-10-30T21:15:36.432996Z", "url": "https://files.pythonhosted.org/packages/1e/ba/49313796913ece8f221699fafae35c8f4056cb2422d03a40d9ecf810e43a/hermit-0.1.7-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "d4ac0f7660422548945bf07f2b7988e6", "sha256": "f33da2385f11a765b9d05f471440f0f3a5936dcd883cd4bbca2f1ba24b5df119" }, "downloads": -1, "filename": "hermit-0.1.7.tar.gz", "has_sig": false, "md5_digest": "d4ac0f7660422548945bf07f2b7988e6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 77929, "upload_time": "2019-10-30T21:15:46", "upload_time_iso_8601": "2019-10-30T21:15:46.549159Z", "url": "https://files.pythonhosted.org/packages/8e/82/4d9b95dceb5ffa9739dd9da96663e85a76a758e23c9cbd9d48bb6bb4d3d2/hermit-0.1.7.tar.gz", "yanked": false, "yanked_reason": null } ], "0.1.8": [ { "comment_text": "", "digests": { "md5": "7f4e42a91337901250f79ea4c1498daa", "sha256": "41e70ed6c62e05c50396f707fc47b16c3123ff74a051dd60980163d2fff7c271" }, "downloads": -1, "filename": "hermit-0.1.8-py3-none-any.whl", "has_sig": false, "md5_digest": "7f4e42a91337901250f79ea4c1498daa", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 104051, "upload_time": "2019-10-30T21:15:38", "upload_time_iso_8601": "2019-10-30T21:15:38.780267Z", "url": "https://files.pythonhosted.org/packages/3e/5e/c94bea310f2935e027be53e482d82226d9322a966eb99afc16ae9405af6d/hermit-0.1.8-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "61ac00d8dea84910ebb42ba6abf0b00a", "sha256": "152f3bad3b84699342a99cfc6c51ffe03051c5bc4a3ddee77fa76c29438b4791" }, "downloads": -1, "filename": "hermit-0.1.8.tar.gz", "has_sig": false, "md5_digest": "61ac00d8dea84910ebb42ba6abf0b00a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 77935, "upload_time": "2019-10-30T21:15:48", "upload_time_iso_8601": "2019-10-30T21:15:48.015029Z", "url": "https://files.pythonhosted.org/packages/41/a9/1c39be8de5d873fd42e0f2b889fa7c4205accb81ee20710678e322a5b761/hermit-0.1.8.tar.gz", "yanked": false, "yanked_reason": null } ], "0.1.9": [ { "comment_text": "", "digests": { "md5": "45b638d4dcde75eeb910bdb0e5b8df9a", "sha256": "43a5850b1455579096d64a60323d8b5976db0ba869a462a70e0d2fb3e50ad7a1" }, "downloads": -1, "filename": "hermit-0.1.9-py3-none-any.whl", "has_sig": false, "md5_digest": "45b638d4dcde75eeb910bdb0e5b8df9a", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 104056, "upload_time": "2019-10-31T14:48:45", "upload_time_iso_8601": "2019-10-31T14:48:45.492847Z", "url": "https://files.pythonhosted.org/packages/6b/51/fbb85402bc10e9457a5391952c6f679b48c5e4f3a69ed92c5c15d285dcd7/hermit-0.1.9-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "1b7ef4ff18556fe57c83ad4c88cbe172", "sha256": "d2364c944220495106e673e7ea849caac98519b1cfb60caef2246b1d3e6bf9b4" }, "downloads": -1, "filename": "hermit-0.1.9.tar.gz", "has_sig": false, "md5_digest": "1b7ef4ff18556fe57c83ad4c88cbe172", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 77935, "upload_time": "2019-10-31T14:48:47", "upload_time_iso_8601": "2019-10-31T14:48:47.803624Z", "url": "https://files.pythonhosted.org/packages/c7/3b/d580829bdcffdb8d9fffe5d2810a2d2422013f50b397db3beecf4f7c9c85/hermit-0.1.9.tar.gz", "yanked": false, "yanked_reason": null } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "677268ed57efcd097988ec59abe4690d", "sha256": "6a3875a7bf8d31533e6b579df582eeb9c768557e91786139a06c3a209e0e5444" }, "downloads": -1, "filename": "hermit-0.1.12-py3.7.egg", "has_sig": false, "md5_digest": "677268ed57efcd097988ec59abe4690d", "packagetype": "bdist_egg", "python_version": "3.7", "requires_python": null, "size": 179606, "upload_time": "2020-01-08T15:58:51", "upload_time_iso_8601": "2020-01-08T15:58:51.681607Z", "url": "https://files.pythonhosted.org/packages/5f/72/96cb169f31c31cd3b5ed9772a3d73729433f9e3b815cc082a48a0a1a10ab/hermit-0.1.12-py3.7.egg", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "9a2213c654036afc337a9b33c9dd13c2", "sha256": "e827b9a2fe9be380f01687da20120b40ae12b076a79724de3e2baa282abf122a" }, "downloads": -1, "filename": "hermit-0.1.12-py3-none-any.whl", "has_sig": false, "md5_digest": "9a2213c654036afc337a9b33c9dd13c2", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 103729, "upload_time": "2020-01-08T15:58:49", "upload_time_iso_8601": "2020-01-08T15:58:49.453379Z", "url": "https://files.pythonhosted.org/packages/45/58/20414edc44187f63ea1a470feee428aabd22f5c5026168a48b7003292857/hermit-0.1.12-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "0ef5d6e0b5d5cfc1b1ea35b4e73eb0d9", "sha256": "c7d304411205d6ea6e32e349658fb6a153ff98c77b42d5628a8661efee2a8acb" }, "downloads": -1, "filename": "hermit-0.1.12.tar.gz", "has_sig": false, "md5_digest": "0ef5d6e0b5d5cfc1b1ea35b4e73eb0d9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 77515, "upload_time": "2020-01-08T15:58:53", "upload_time_iso_8601": "2020-01-08T15:58:53.358331Z", "url": "https://files.pythonhosted.org/packages/9f/67/cd372194c812f7333bb3f859ba2b16f750b9f19a82891976bb34647b07a8/hermit-0.1.12.tar.gz", "yanked": false, "yanked_reason": null } ], "vulnerabilities": [] }