# 🔐 Python Cryptography
A blazing-fast cryptography library for Python, built on Rust.
Supports an extensive set of **post-quantum** digital signature algorithms (DSA) and key encapsulation mechanisms (KEM).
#### 🚀 Classic cryptography algorithms are also supported!
## ⚡ Features
- ✅ Dozens of NIST PQC candidates
- 🦀 Rust core for speed and safety
- 📦 Easy installation via [`pip`](https://pip.pypa.io)
---
### 🧬 Supported Algorithms
## 💻 Classic
### Encoding
- #### Base58
### Hashing
- #### Blake3
- #### Ripemd
### Password Hashing
- #### Argon2
- #### Bcrypt
## 🛰️ Quantum
### 🛡️ KEM
- #### Bike
- #### ClassicMcEliece
- #### Hqc
- #### Kyber
- #### MLKEM
- #### NtruPrime
- #### FrodoKem
### ✍️ DSA
- #### Cross
- #### Dilithium
- #### Falcon
- #### Mayo
- #### MLDSA
- #### Sphincs
- #### Uov
### ❔ Examples
#### DSA Example
```python
from pisalt.quantum.dsa import Algorithm, KeyPair
# Step 1: Generate a new key pair (secret key and public key) using the MLDSA87 algorithm.
alicesk, alicepk = KeyPair(Algorithm.MLDSA.MLDSA87)
# Step 2: Restore (import) the secret key from its raw bytes.
# This simulates loading a saved secret key from storage.
secretkey = KeyPair(Algorithm.MLDSA.MLDSA87, secretkey=alicesk.secretkey)
# Step 3: Restore (import) the public key from its raw bytes.
# This simulates loading a saved public key from storage.
publickey = KeyPair(Algorithm.MLDSA.MLDSA87, publickey=alicepk.publickey)
# --- Alternative: Combined Key Import ---
# You can also restore both keys at once using a single call.
# This is useful when both the secret and public keys are available together.
secretkey, publickey = KeyPair(
Algorithm.MLDSA.MLDSA87,
secretkey=alicesk.secretkey,
publickey=alicepk.publickey
)
# Step 4: Prepare the message to be signed (convert string to bytes).
message = "Hello".encode()
# Step 5: Sign the message using the secret key.
signature = secretkey.sign(message=message)
# Step 6: Verify the signature using the public key.
valid = publickey.verify(signature=signature, message=message)
# Step 7: Ensure that the signature is valid.
# If the verification fails, the program will raise an error.
assert valid, "Signature verification failed!"
# Step 8: Display the original message (decoded back to string).
print(f"Message: [{message.decode()}]")
# Display the last 64 hex characters
print(f"Signature: [{signature.hex()[-64:]}]")
print(f"SecretKey: [{alicesk.secretkey.hex()[-64:]}]")
print(f"PublicKey: [{alicepk.publickey.hex()[-64:]}]")
```
#### KEM Example
```python
from pisalt.quantum.kem import Algorithm, KeyPair
# Step 1: Generate key pairs for Alice and Bob using MLKEM1024 algorithm
alicesk, alicepk = KeyPair(Algorithm.MLKEM.MLKEM1024)
_bobsk, _bobpk = KeyPair(Algorithm.MLKEM.MLKEM1024)
# --- Key Export ---
# Export Alice's keys as bytes (simulate saving keys)
alice_secret_bytes = alicesk.secretkey
alice_public_bytes = alicepk.publickey
# Export Bob's keys as bytes (simulate saving keys)
bob_secret_bytes = _bobsk.secretkey
bob_public_bytes = _bobpk.publickey
# --- Key Import ---
# Re-import Alice's keys from bytes
alicesk_restored = KeyPair(Algorithm.MLKEM.MLKEM1024, secretkey=alice_secret_bytes)
alicepk_restored = KeyPair(Algorithm.MLKEM.MLKEM1024, publickey=alice_public_bytes)
# Re-import Bob's keys from bytes
bobsk_restored = KeyPair(Algorithm.MLKEM.MLKEM1024, secretkey=bob_secret_bytes)
bobpk_restored = KeyPair(Algorithm.MLKEM.MLKEM1024, publickey=bob_public_bytes)
# Step 2: Bob encapsulates a shared secret using Alice's public key
bobss, bobct = alicepk_restored.encapsulate()
# Step 3: Alice decapsulates the ciphertext using her secret key to recover the shared secret
alicess = alicesk_restored.decapsulate(bobct)
# Step 4: Verify that both shared secrets match
assert alicess == bobss, "Shared secrets do not match!"
# Step 5: Print results
print(f"Alice's Shared Secret: [{alicess.hex()}]")
print(f"Bob's Shared Secret: [{bobss.hex()}]")
# Display the last 64 hex characters
print(f"SecretKey: [{alicesk_restored.secretkey.hex()[-64:]}]")
print(f"PublicKey: [{alicepk_restored.publickey.hex()[-64:]}]")
```
### 📦 Install
```shell
pip install pisalt
```
### 🥳 Enjoy!
Raw data
{
"_id": null,
"home_page": "https://github.com/1xfalsebit/pisalt",
"name": "pisalt",
"maintainer": null,
"docs_url": null,
"requires_python": null,
"maintainer_email": null,
"keywords": "python, cryptography",
"author": "Anonymous <218768726+1xfalsebit@users.noreply.github.com>",
"author_email": "Anonymous <218768726+1xfalsebit@users.noreply.github.com>",
"download_url": "https://files.pythonhosted.org/packages/cd/4f/ce9d2772e399ffad86f6d8edf31f5720d6bbd9d512ad81a8819aa4181082/pisalt-1.2.4.tar.gz",
"platform": null,
"description": "# \ud83d\udd10 Python Cryptography\r\n\r\nA blazing-fast cryptography library for Python, built on Rust.\r\n\r\nSupports an extensive set of **post-quantum** digital signature algorithms (DSA) and key encapsulation mechanisms (KEM).\r\n\r\n#### \ud83d\ude80 Classic cryptography algorithms are also supported!\r\n\r\n## \u26a1 Features\r\n- \u2705 Dozens of NIST PQC candidates \r\n- \ud83e\udd80 Rust core for speed and safety\r\n- \ud83d\udce6 Easy installation via [`pip`](https://pip.pypa.io)\r\n---\r\n\r\n### \ud83e\uddec Supported Algorithms\r\n\r\n## \ud83d\udcbb Classic\r\n### Encoding\r\n- #### Base58\r\n### Hashing\r\n- #### Blake3\r\n- #### Ripemd\r\n### Password Hashing\r\n- #### Argon2\r\n- #### Bcrypt\r\n\r\n\r\n## \ud83d\udef0\ufe0f Quantum\r\n\r\n### \ud83d\udee1\ufe0f KEM\r\n- #### Bike\r\n- #### ClassicMcEliece\r\n- #### Hqc\r\n- #### Kyber\r\n- #### MLKEM\r\n- #### NtruPrime\r\n- #### FrodoKem\r\n\r\n### \u270d\ufe0f DSA\r\n- #### Cross\r\n- #### Dilithium\r\n- #### Falcon\r\n- #### Mayo\r\n- #### MLDSA\r\n- #### Sphincs\r\n- #### Uov\r\n\r\n### \u2754 Examples\r\n\r\n#### DSA Example\r\n```python\r\nfrom pisalt.quantum.dsa import Algorithm, KeyPair\r\n\r\n# Step 1: Generate a new key pair (secret key and public key) using the MLDSA87 algorithm.\r\nalicesk, alicepk = KeyPair(Algorithm.MLDSA.MLDSA87)\r\n\r\n# Step 2: Restore (import) the secret key from its raw bytes.\r\n# This simulates loading a saved secret key from storage.\r\nsecretkey = KeyPair(Algorithm.MLDSA.MLDSA87, secretkey=alicesk.secretkey)\r\n\r\n# Step 3: Restore (import) the public key from its raw bytes.\r\n# This simulates loading a saved public key from storage.\r\npublickey = KeyPair(Algorithm.MLDSA.MLDSA87, publickey=alicepk.publickey)\r\n\r\n# --- Alternative: Combined Key Import ---\r\n# You can also restore both keys at once using a single call.\r\n# This is useful when both the secret and public keys are available together.\r\nsecretkey, publickey = KeyPair(\r\n Algorithm.MLDSA.MLDSA87,\r\n secretkey=alicesk.secretkey,\r\n publickey=alicepk.publickey\r\n)\r\n\r\n# Step 4: Prepare the message to be signed (convert string to bytes).\r\nmessage = \"Hello\".encode()\r\n\r\n# Step 5: Sign the message using the secret key.\r\nsignature = secretkey.sign(message=message)\r\n\r\n# Step 6: Verify the signature using the public key.\r\nvalid = publickey.verify(signature=signature, message=message)\r\n\r\n# Step 7: Ensure that the signature is valid.\r\n# If the verification fails, the program will raise an error.\r\nassert valid, \"Signature verification failed!\"\r\n\r\n# Step 8: Display the original message (decoded back to string).\r\nprint(f\"Message: [{message.decode()}]\")\r\n\r\n# Display the last 64 hex characters\r\nprint(f\"Signature: [{signature.hex()[-64:]}]\")\r\nprint(f\"SecretKey: [{alicesk.secretkey.hex()[-64:]}]\")\r\nprint(f\"PublicKey: [{alicepk.publickey.hex()[-64:]}]\")\r\n```\r\n\r\n#### KEM Example\r\n```python\r\nfrom pisalt.quantum.kem import Algorithm, KeyPair\r\n\r\n# Step 1: Generate key pairs for Alice and Bob using MLKEM1024 algorithm\r\nalicesk, alicepk = KeyPair(Algorithm.MLKEM.MLKEM1024)\r\n_bobsk, _bobpk = KeyPair(Algorithm.MLKEM.MLKEM1024)\r\n\r\n# --- Key Export ---\r\n# Export Alice's keys as bytes (simulate saving keys)\r\nalice_secret_bytes = alicesk.secretkey\r\nalice_public_bytes = alicepk.publickey\r\n\r\n# Export Bob's keys as bytes (simulate saving keys)\r\nbob_secret_bytes = _bobsk.secretkey\r\nbob_public_bytes = _bobpk.publickey\r\n\r\n# --- Key Import ---\r\n# Re-import Alice's keys from bytes\r\nalicesk_restored = KeyPair(Algorithm.MLKEM.MLKEM1024, secretkey=alice_secret_bytes)\r\nalicepk_restored = KeyPair(Algorithm.MLKEM.MLKEM1024, publickey=alice_public_bytes)\r\n\r\n# Re-import Bob's keys from bytes\r\nbobsk_restored = KeyPair(Algorithm.MLKEM.MLKEM1024, secretkey=bob_secret_bytes)\r\nbobpk_restored = KeyPair(Algorithm.MLKEM.MLKEM1024, publickey=bob_public_bytes)\r\n\r\n# Step 2: Bob encapsulates a shared secret using Alice's public key\r\nbobss, bobct = alicepk_restored.encapsulate()\r\n\r\n# Step 3: Alice decapsulates the ciphertext using her secret key to recover the shared secret\r\nalicess = alicesk_restored.decapsulate(bobct)\r\n\r\n# Step 4: Verify that both shared secrets match\r\nassert alicess == bobss, \"Shared secrets do not match!\"\r\n\r\n# Step 5: Print results\r\nprint(f\"Alice's Shared Secret: [{alicess.hex()}]\")\r\nprint(f\"Bob's Shared Secret: [{bobss.hex()}]\")\r\n\r\n# Display the last 64 hex characters\r\nprint(f\"SecretKey: [{alicesk_restored.secretkey.hex()[-64:]}]\")\r\nprint(f\"PublicKey: [{alicepk_restored.publickey.hex()[-64:]}]\")\r\n```\r\n\r\n### \ud83d\udce6 Install\r\n```shell\r\npip install pisalt\r\n```\r\n\r\n### \ud83e\udd73 Enjoy!\r\n\n",
"bugtrack_url": null,
"license": "Unlicense",
"summary": "Python Cryptography",
"version": "1.2.4",
"project_urls": {
"Homepage": "https://github.com/1xfalsebit/pisalt",
"Source Code": "https://github.com/1xfalsebit/pisalt"
},
"split_keywords": [
"python",
" cryptography"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "ce963b4d8724e2cd464ccc48bab57ecc9da2a379956ea86cc4c98d447ff215f2",
"md5": "eb17b31a90d69efb44624455b7f551eb",
"sha256": "2acd9598841df50007e46f9d2ff9c1946359b11c99b2affce7c09ee6cadb8497"
},
"downloads": -1,
"filename": "pisalt-1.2.4-cp310-cp310-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "eb17b31a90d69efb44624455b7f551eb",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": null,
"size": 2086954,
"upload_time": "2025-07-14T23:04:00",
"upload_time_iso_8601": "2025-07-14T23:04:00.393290Z",
"url": "https://files.pythonhosted.org/packages/ce/96/3b4d8724e2cd464ccc48bab57ecc9da2a379956ea86cc4c98d447ff215f2/pisalt-1.2.4-cp310-cp310-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "96135a6aff1842a4e83dc6a4caf84b2e71bc75ab9705c8330afe497661c2c7e7",
"md5": "4fd61f947e310d0beb55ff9a0ff5ab00",
"sha256": "3b7334134dc82fc1e60ae9e9ff74b1be5cefd8823013c59341787ed99d89ae61"
},
"downloads": -1,
"filename": "pisalt-1.2.4-cp310-cp310-manylinux_2_34_x86_64.whl",
"has_sig": false,
"md5_digest": "4fd61f947e310d0beb55ff9a0ff5ab00",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": null,
"size": 3353848,
"upload_time": "2025-07-14T23:03:55",
"upload_time_iso_8601": "2025-07-14T23:03:55.000043Z",
"url": "https://files.pythonhosted.org/packages/96/13/5a6aff1842a4e83dc6a4caf84b2e71bc75ab9705c8330afe497661c2c7e7/pisalt-1.2.4-cp310-cp310-manylinux_2_34_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "cea59fe657af8640fbe5bccf2fc6b763ec69387c22a5aa194bb42708b609aa7b",
"md5": "c5701c74ec6f4bde55de66c78ae36745",
"sha256": "9e5eaaaf8e16f6b6bb6a3fc266a08f098373583f4e5736e7ef24a825d98ad7fc"
},
"downloads": -1,
"filename": "pisalt-1.2.4-cp310-cp310-win_amd64.whl",
"has_sig": false,
"md5_digest": "c5701c74ec6f4bde55de66c78ae36745",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": null,
"size": 958440,
"upload_time": "2025-07-14T23:04:06",
"upload_time_iso_8601": "2025-07-14T23:04:06.440855Z",
"url": "https://files.pythonhosted.org/packages/ce/a5/9fe657af8640fbe5bccf2fc6b763ec69387c22a5aa194bb42708b609aa7b/pisalt-1.2.4-cp310-cp310-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "54d4340e86e19ca52c4ef88ff31425d9ffb0a6a7595119b0518655b478995d8e",
"md5": "71fe883506729d3c78d7ecc2c49f1bd3",
"sha256": "77e3b12aa2a2d072b83fd5ce3e4c77e6604fe6f4aee50799626a1137f9f92d5a"
},
"downloads": -1,
"filename": "pisalt-1.2.4-cp311-cp311-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "71fe883506729d3c78d7ecc2c49f1bd3",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": null,
"size": 2087029,
"upload_time": "2025-07-14T23:04:01",
"upload_time_iso_8601": "2025-07-14T23:04:01.708224Z",
"url": "https://files.pythonhosted.org/packages/54/d4/340e86e19ca52c4ef88ff31425d9ffb0a6a7595119b0518655b478995d8e/pisalt-1.2.4-cp311-cp311-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "bcda0ec884d8b0f7f0dff09a330fa3d1dce25959c62a276e9ea5b396021fae4d",
"md5": "0889a19d9ee40795d53453554bff775e",
"sha256": "980a127afc4ae83181849346600c56ff7d60ebaef611c84f5ea50e4b786595dd"
},
"downloads": -1,
"filename": "pisalt-1.2.4-cp311-cp311-manylinux_2_34_x86_64.whl",
"has_sig": false,
"md5_digest": "0889a19d9ee40795d53453554bff775e",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": null,
"size": 3353795,
"upload_time": "2025-07-14T23:03:56",
"upload_time_iso_8601": "2025-07-14T23:03:56.240434Z",
"url": "https://files.pythonhosted.org/packages/bc/da/0ec884d8b0f7f0dff09a330fa3d1dce25959c62a276e9ea5b396021fae4d/pisalt-1.2.4-cp311-cp311-manylinux_2_34_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "130e1972e6f300ab830b9ba0aca27275c544d5be566ebf265dd4639b515377a2",
"md5": "e454c33a45b290de14a16aa0d61cbdfb",
"sha256": "f6ef1fda040650186e600ade6915c3583bf79a3353f40e30b248084e59bd56a3"
},
"downloads": -1,
"filename": "pisalt-1.2.4-cp311-cp311-win_amd64.whl",
"has_sig": false,
"md5_digest": "e454c33a45b290de14a16aa0d61cbdfb",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": null,
"size": 958404,
"upload_time": "2025-07-14T23:04:07",
"upload_time_iso_8601": "2025-07-14T23:04:07.531512Z",
"url": "https://files.pythonhosted.org/packages/13/0e/1972e6f300ab830b9ba0aca27275c544d5be566ebf265dd4639b515377a2/pisalt-1.2.4-cp311-cp311-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "cf5e2c8a96f509d09b57ce6626a278afab008a8750d5ddd2b985f853d6ada59c",
"md5": "db4111e7845940307e02fd8103b4affd",
"sha256": "68864344540efc1f5a63a44f27a3ae968451c0df94885e32e8c2d3cf431d39b1"
},
"downloads": -1,
"filename": "pisalt-1.2.4-cp312-cp312-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "db4111e7845940307e02fd8103b4affd",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": null,
"size": 2083848,
"upload_time": "2025-07-14T23:04:03",
"upload_time_iso_8601": "2025-07-14T23:04:03.126330Z",
"url": "https://files.pythonhosted.org/packages/cf/5e/2c8a96f509d09b57ce6626a278afab008a8750d5ddd2b985f853d6ada59c/pisalt-1.2.4-cp312-cp312-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "b0b01e4593e7f2b9687c624d08ecd31732c38623878404c2915a623bfe385ef8",
"md5": "2b98b5d5d05458dd074cfdd2dbe72614",
"sha256": "4718a30a7c86b82ea099242bf0545323fd9360c9ef79b0989eca09d49485a8b5"
},
"downloads": -1,
"filename": "pisalt-1.2.4-cp312-cp312-manylinux_2_34_x86_64.whl",
"has_sig": false,
"md5_digest": "2b98b5d5d05458dd074cfdd2dbe72614",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": null,
"size": 3351608,
"upload_time": "2025-07-14T23:03:57",
"upload_time_iso_8601": "2025-07-14T23:03:57.706660Z",
"url": "https://files.pythonhosted.org/packages/b0/b0/1e4593e7f2b9687c624d08ecd31732c38623878404c2915a623bfe385ef8/pisalt-1.2.4-cp312-cp312-manylinux_2_34_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "ace6ab534c89b1454cb7bacbd66fd935c51d641bfad9b13cf19d75cab2f6aeb8",
"md5": "02b438bfbc310ea52391eab1afd6bf20",
"sha256": "189a35b055ec238354a5e28f268c96c117a1cad8bac78f297be5f081eec3d45f"
},
"downloads": -1,
"filename": "pisalt-1.2.4-cp312-cp312-win_amd64.whl",
"has_sig": false,
"md5_digest": "02b438bfbc310ea52391eab1afd6bf20",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": null,
"size": 955931,
"upload_time": "2025-07-14T23:04:08",
"upload_time_iso_8601": "2025-07-14T23:04:08.503783Z",
"url": "https://files.pythonhosted.org/packages/ac/e6/ab534c89b1454cb7bacbd66fd935c51d641bfad9b13cf19d75cab2f6aeb8/pisalt-1.2.4-cp312-cp312-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "e1cd58bcb3e2e6855b88deb110e61fd4dce457b0f9e7a3c7ef54f48db296dbf2",
"md5": "93ebdac34e8e4c5b8a26f1dc89e54dcc",
"sha256": "bec33fe8f5a96a6e5045e237f7248641b0951ad4c33493d7468fe9d23ef15a92"
},
"downloads": -1,
"filename": "pisalt-1.2.4-cp313-cp313-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "93ebdac34e8e4c5b8a26f1dc89e54dcc",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": null,
"size": 2083926,
"upload_time": "2025-07-14T23:04:04",
"upload_time_iso_8601": "2025-07-14T23:04:04.324908Z",
"url": "https://files.pythonhosted.org/packages/e1/cd/58bcb3e2e6855b88deb110e61fd4dce457b0f9e7a3c7ef54f48db296dbf2/pisalt-1.2.4-cp313-cp313-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "b8c8483fc45d0b812b236aeff058dafe1a78c7cf708ce18648609988d8618545",
"md5": "171c8b04064e52183d7f8f043cd1b92c",
"sha256": "600c965d31910e685d58eec7f3003ba988d537bfbe650b2f88b59b929beff3c0"
},
"downloads": -1,
"filename": "pisalt-1.2.4-cp313-cp313-manylinux_2_34_x86_64.whl",
"has_sig": false,
"md5_digest": "171c8b04064e52183d7f8f043cd1b92c",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": null,
"size": 3351541,
"upload_time": "2025-07-14T23:03:58",
"upload_time_iso_8601": "2025-07-14T23:03:58.852693Z",
"url": "https://files.pythonhosted.org/packages/b8/c8/483fc45d0b812b236aeff058dafe1a78c7cf708ce18648609988d8618545/pisalt-1.2.4-cp313-cp313-manylinux_2_34_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "f799f47ce960741e7d6553cfedf33065a28e3b19006c7ddfc14b6ed58c857ae1",
"md5": "f89ccb5bfabd4c994b95b32ee2107303",
"sha256": "07424a38909e78448ea014e514370412e72bb5afd9dcf7d4e603145da15e88d3"
},
"downloads": -1,
"filename": "pisalt-1.2.4-cp313-cp313-win_amd64.whl",
"has_sig": false,
"md5_digest": "f89ccb5bfabd4c994b95b32ee2107303",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": null,
"size": 956188,
"upload_time": "2025-07-14T23:04:10",
"upload_time_iso_8601": "2025-07-14T23:04:10.126210Z",
"url": "https://files.pythonhosted.org/packages/f7/99/f47ce960741e7d6553cfedf33065a28e3b19006c7ddfc14b6ed58c857ae1/pisalt-1.2.4-cp313-cp313-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "cd4fce9d2772e399ffad86f6d8edf31f5720d6bbd9d512ad81a8819aa4181082",
"md5": "9fde200c7ee64eec51681db1f11f6fdb",
"sha256": "6ffe0a8ad92275f7887e89e1e7cf682b994817192854e2a140a1da678bf6db21"
},
"downloads": -1,
"filename": "pisalt-1.2.4.tar.gz",
"has_sig": false,
"md5_digest": "9fde200c7ee64eec51681db1f11f6fdb",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 26154,
"upload_time": "2025-07-14T23:04:05",
"upload_time_iso_8601": "2025-07-14T23:04:05.677861Z",
"url": "https://files.pythonhosted.org/packages/cd/4f/ce9d2772e399ffad86f6d8edf31f5720d6bbd9d512ad81a8819aa4181082/pisalt-1.2.4.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-07-14 23:04:05",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "1xfalsebit",
"github_project": "pisalt",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "pisalt"
}