gmssl-pyx


Namegmssl-pyx JSON
Version 2.0.0 PyPI version JSON
download
home_pagehttps://github.com/yetsing/gmssl_pyx
Summarypython wrapper of GmSSL
upload_time2024-01-19 14:49:06
maintainer
docs_urlNone
authoryeqing
requires_python>=3.7
licenseApache Software License
keywords gmssl
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # gmssl_pyx

python wrapper (C extension) of [GmSSL](https://github.com/guanzhi/GmSSL)

使用的版本是 [GmSSL-3.1.0](https://github.com/guanzhi/GmSSL/releases/tag/v3.1.0)

支持 Python 3.7, 3.8, 3.9, 3.10

## 安装

```shell
pip install gmssl-pyx
```

## SM2

### 加密和解密

```python
from gmssl_pyx import sm2_key_generate, sm2_encrypt, sm2_decrypt


# 生成 SM2 公私钥
public_key, private_key = sm2_key_generate()
# 加密
plaintext = b"hello world"
ciphertext = sm2_encrypt(public_key, plaintext)
print("ciphertext", ciphertext)
# 解密
plaintext = sm2_decrypt(private_key, ciphertext)
print("plaintext", plaintext)

```

### 签名和验签

```python
from gmssl_pyx import sm2_key_generate, sm2_sign, sm2_verify


# 生成 SM2 公私钥
public_key, private_key = sm2_key_generate()

# 没有 signer_id 和 SM3 杂凑值 z
# 签名
message = b"hello world"
signature = sm2_sign(private_key, public_key, message, signer_id=None)
print("signature", signature)
# 验证签名
verify = sm2_verify(public_key, message, signature, signer_id=None)
print("verify", verify)

# 默认 signer_id 和 SM3 杂凑值 z
signature = sm2_sign(private_key, public_key, message)
print("signature", signature)
# 验证签名
verify = sm2_verify(public_key, message, signature)
print("verify", verify)

# 自定义 signer_id 和 SM3 杂凑值 z
signer_id = b"signer_id"
signature = sm2_sign(private_key, public_key, message, signer_id=signer_id)
print("signature", signature)
# 验证签名
verify = sm2_verify(public_key, message, signature, signer_id=signer_id)
print("verify", verify)
```

### ASN.1 DER 编码

加密和签名的结果都是 ASN.1 DER 编码,如果要得到原始的密文和签名,可以参考下面的例子

需要安装 pycryptodomex 库

```shell
pip install pycryptodomex
```

```python
from Cryptodome.Util.asn1 import DerSequence, DerOctetString, DerInteger
from gmssl_pyx import sm2_key_generate, sm2_encrypt, sm2_decrypt


# 生成 SM2 公私钥
public_key, private_key = sm2_key_generate()
# 加密
plaintext = b"hello world"
ciphertext = sm2_encrypt(public_key, plaintext)
print("ciphertext", ciphertext)
seq_der = DerSequence()
decoded_ciphertext = seq_der.decode(ciphertext)
# ASN.1 DER 解码
# c1: point(x, y) 64bytes
# c2: ciphertext len(data)
# c3: hash 32bytes
# der order: c1x c1y hash ciphertext
c1x = decoded_ciphertext[0]
c1y = decoded_ciphertext[1]
c3 = DerOctetString().decode(decoded_ciphertext[2]).payload
c2 = DerOctetString().decode(decoded_ciphertext[3]).payload
# 模式为 C1C3C2
raw_ciphertext = c1x.to_bytes(32, "big") + c1y.to_bytes(32, "big") + c3 + c2

# 如果需要解密原始密文,需要先进行 ASN.1 DER 编码
seq_der = DerSequence()
c1x = raw_ciphertext[:32]
x = DerInteger(int.from_bytes(c1x, byteorder='big'))
seq_der.append(x)
c1y = raw_ciphertext[32:64]
y = DerInteger(int.from_bytes(c1y, byteorder='big'))
seq_der.append(y)
c3 = raw_ciphertext[64:64 + 32]
seq_der.append(DerOctetString(c3))
c2 = raw_ciphertext[64 +32:]
seq_der.append(DerOctetString(c2))
ciphertext = seq_der.encode()
plaintext = sm2_decrypt(private_key, ciphertext)
print("plaintext", plaintext)

# 签名
signature = sm2_sign(private_key, public_key, message)
seq_der = DerSequence()
decoded_sign = seq_der.decode(signature)
# ASN.1 DER 解码,两个 32 字节的整数
r = decoded_sign[0]
s = decoded_sign[1]
print('r', r)
print('s', s)
raw_signature = '%064x%064x' % (r, s)

# 验证原始签名同样需要先进行 ASN.1 DER 编码
r = int(raw_signature[:64], base=16)
s = int(raw_signature[64:], base=16)
seq_der = DerSequence()
seq_der.append(DerInteger(r))
seq_der.append(DerInteger(s))
signature = seq_der.encode()
verify = sm2_verify(private_key, public_key, message, signature)
print('verify', verify)
```

### 公私钥的一些补充说明

公钥长度为 64 字节,是两个 32 字节的整数 x y 拼接而成。

如果公钥长度为 65 字节,那么第一个字节为 '\x04' ,表示后面的 64 字节就是公钥。

如果公钥长度为 33 字节,那么第一个字节为 '\x02' 或者 '\x03' ,
这是一种压缩格式,后面的 32 字节为整数 x , y 可以根据 x 计算出来。

私钥长度为 32 字节,没有其他变化。

```python
from gmssl_pyx import sm2_key_generate, normalize_sm2_public_key


raw_public_key, _ = sm2_key_generate()
k1 = normalize_sm2_public_key(raw_public_key)
assert k1 == raw_public_key
k1 = normalize_sm2_public_key(b'\x04' + raw_public_key)
assert k1 == raw_public_key

# 压缩版公钥
y = int.from_bytes(raw_public_key[32:], byteorder='big')
if y % 2 == 0:
    # y 是偶数
    compressed_public_key = b'\x02' +raw_public_key[:32]
else:
    compressed_public_key = b'\x03' + raw_public_key[:32]
k1 = normalize_sm2_public_key(compressed_public_key)
assert k1 == raw_public_key
```

## SM3

### hash 计算

```python
from gmssl_pyx import sm3_hash


message = b'hello world'
signature = sm3_hash(message)
print('message', message)
print('signature', signature.hex())
```

### hmac 计算

```python
import secrets
from gmssl_pyx import sm3_hmac


key = secrets.token_bytes(32)
message = b"sm3_hmac"
hmac_data = sm3_hmac(key, message)
print("message", message)
print("hmac_data", hmac_data)
```

### kdf 计算

```python
import secrets
from gmssl_pyx import sm3_kdf


key = secrets.token_bytes(32)
new_key = sm3_kdf(key, 32)
print('kdf new_key', new_key)
```

## SM4

### CBC 模式加密和解密

```python
import secrets
from gmssl_pyx import (
    sm4_cbc_padding_encrypt,
    sm4_cbc_padding_decrypt,
    SM4_KEY_SIZE,
    SM4_BLOCK_SIZE,
)


key = secrets.token_bytes(SM4_KEY_SIZE)
iv = secrets.token_bytes(SM4_BLOCK_SIZE)
plaintext = b"hello world"
# 加密
ciphertext = sm4_cbc_padding_encrypt(key, iv, plaintext)
print("ciphertext", ciphertext.hex())

# 解密
decrypted = sm4_cbc_padding_decrypt(key, iv, ciphertext)
print("decrypted", decrypted)

```

### CTR 模式加密和解密

```python
import secrets
from gmssl_pyx import (
    sm4_ctr_encrypt,
    sm4_ctr_decrypt,
    SM4_KEY_SIZE,
    SM4_BLOCK_SIZE,
)


key = secrets.token_bytes(SM4_KEY_SIZE)
ctr = secrets.token_bytes(SM4_BLOCK_SIZE)
plaintext = b"hello world"
# 加密
ciphertext = sm4_ctr_encrypt(key, ctr, plaintext)
print("ciphertext", ciphertext.hex())

# 解密
decrypted = sm4_ctr_decrypt(key, ctr, ciphertext)
print("decrypted", decrypted)

```

### GCM 模式加密和解密

```python
import secrets
from gmssl_pyx import sm4_gcm_encrypt, sm4_gcm_decrypt, SM4_KEY_SIZE, SM4_BLOCK_SIZE


plaintext = b'hello world'
key = secrets.token_bytes(SM4_KEY_SIZE)
iv = secrets.token_bytes(SM4_BLOCK_SIZE)
aad = secrets.token_bytes(16)
# 加密
ciphertext, tag = sm4_gcm_encrypt(key, iv, aad, plaintext=plaintext)
print('ciphertext', ciphertext)

# 解密
plaintext = sm4_gcm_decrypt(key, iv=iv, aad=aad, ciphertext=ciphertext, tag=tag)
print('plaintext', plaintext)

```

## 其他

[SM9](docs/sm9.md)

如果要查看所有可用的 API ,可以看 [gmsslext.pyi](gmssl_pyx/gmsslext.pyi) 文件。

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/yetsing/gmssl_pyx",
    "name": "gmssl-pyx",
    "maintainer": "",
    "docs_url": null,
    "requires_python": ">=3.7",
    "maintainer_email": "",
    "keywords": "gmssl",
    "author": "yeqing",
    "author_email": "",
    "download_url": "https://files.pythonhosted.org/packages/21/5b/27c386bed7f2493d850ed4ef31797412c260c4e5b1e27cba34506ebdc410/gmssl_pyx-2.0.0.tar.gz",
    "platform": null,
    "description": "# gmssl_pyx\n\npython wrapper (C extension) of [GmSSL](https://github.com/guanzhi/GmSSL)\n\n\u4f7f\u7528\u7684\u7248\u672c\u662f [GmSSL-3.1.0](https://github.com/guanzhi/GmSSL/releases/tag/v3.1.0)\n\n\u652f\u6301 Python 3.7, 3.8, 3.9, 3.10\n\n## \u5b89\u88c5\n\n```shell\npip install gmssl-pyx\n```\n\n## SM2\n\n### \u52a0\u5bc6\u548c\u89e3\u5bc6\n\n```python\nfrom gmssl_pyx import sm2_key_generate, sm2_encrypt, sm2_decrypt\n\n\n# \u751f\u6210 SM2 \u516c\u79c1\u94a5\npublic_key, private_key = sm2_key_generate()\n# \u52a0\u5bc6\nplaintext = b\"hello world\"\nciphertext = sm2_encrypt(public_key, plaintext)\nprint(\"ciphertext\", ciphertext)\n# \u89e3\u5bc6\nplaintext = sm2_decrypt(private_key, ciphertext)\nprint(\"plaintext\", plaintext)\n\n```\n\n### \u7b7e\u540d\u548c\u9a8c\u7b7e\n\n```python\nfrom gmssl_pyx import sm2_key_generate, sm2_sign, sm2_verify\n\n\n# \u751f\u6210 SM2 \u516c\u79c1\u94a5\npublic_key, private_key = sm2_key_generate()\n\n# \u6ca1\u6709 signer_id \u548c SM3 \u6742\u51d1\u503c z\n# \u7b7e\u540d\nmessage = b\"hello world\"\nsignature = sm2_sign(private_key, public_key, message, signer_id=None)\nprint(\"signature\", signature)\n# \u9a8c\u8bc1\u7b7e\u540d\nverify = sm2_verify(public_key, message, signature, signer_id=None)\nprint(\"verify\", verify)\n\n# \u9ed8\u8ba4 signer_id \u548c SM3 \u6742\u51d1\u503c z\nsignature = sm2_sign(private_key, public_key, message)\nprint(\"signature\", signature)\n# \u9a8c\u8bc1\u7b7e\u540d\nverify = sm2_verify(public_key, message, signature)\nprint(\"verify\", verify)\n\n# \u81ea\u5b9a\u4e49 signer_id \u548c SM3 \u6742\u51d1\u503c z\nsigner_id = b\"signer_id\"\nsignature = sm2_sign(private_key, public_key, message, signer_id=signer_id)\nprint(\"signature\", signature)\n# \u9a8c\u8bc1\u7b7e\u540d\nverify = sm2_verify(public_key, message, signature, signer_id=signer_id)\nprint(\"verify\", verify)\n```\n\n### ASN.1 DER \u7f16\u7801\n\n\u52a0\u5bc6\u548c\u7b7e\u540d\u7684\u7ed3\u679c\u90fd\u662f ASN.1 DER \u7f16\u7801\uff0c\u5982\u679c\u8981\u5f97\u5230\u539f\u59cb\u7684\u5bc6\u6587\u548c\u7b7e\u540d\uff0c\u53ef\u4ee5\u53c2\u8003\u4e0b\u9762\u7684\u4f8b\u5b50\n\n\u9700\u8981\u5b89\u88c5 pycryptodomex \u5e93\n\n```shell\npip install pycryptodomex\n```\n\n```python\nfrom Cryptodome.Util.asn1 import DerSequence, DerOctetString, DerInteger\nfrom gmssl_pyx import sm2_key_generate, sm2_encrypt, sm2_decrypt\n\n\n# \u751f\u6210 SM2 \u516c\u79c1\u94a5\npublic_key, private_key = sm2_key_generate()\n# \u52a0\u5bc6\nplaintext = b\"hello world\"\nciphertext = sm2_encrypt(public_key, plaintext)\nprint(\"ciphertext\", ciphertext)\nseq_der = DerSequence()\ndecoded_ciphertext = seq_der.decode(ciphertext)\n# ASN.1 DER \u89e3\u7801\n# c1: point(x, y) 64bytes\n# c2: ciphertext len(data)\n# c3: hash 32bytes\n# der order: c1x c1y hash ciphertext\nc1x = decoded_ciphertext[0]\nc1y = decoded_ciphertext[1]\nc3 = DerOctetString().decode(decoded_ciphertext[2]).payload\nc2 = DerOctetString().decode(decoded_ciphertext[3]).payload\n# \u6a21\u5f0f\u4e3a C1C3C2\nraw_ciphertext = c1x.to_bytes(32, \"big\") + c1y.to_bytes(32, \"big\") + c3 + c2\n\n# \u5982\u679c\u9700\u8981\u89e3\u5bc6\u539f\u59cb\u5bc6\u6587\uff0c\u9700\u8981\u5148\u8fdb\u884c ASN.1 DER \u7f16\u7801\nseq_der = DerSequence()\nc1x = raw_ciphertext[:32]\nx = DerInteger(int.from_bytes(c1x, byteorder='big'))\nseq_der.append(x)\nc1y = raw_ciphertext[32:64]\ny = DerInteger(int.from_bytes(c1y, byteorder='big'))\nseq_der.append(y)\nc3 = raw_ciphertext[64:64 + 32]\nseq_der.append(DerOctetString(c3))\nc2 = raw_ciphertext[64 +32:]\nseq_der.append(DerOctetString(c2))\nciphertext = seq_der.encode()\nplaintext = sm2_decrypt(private_key, ciphertext)\nprint(\"plaintext\", plaintext)\n\n# \u7b7e\u540d\nsignature = sm2_sign(private_key, public_key, message)\nseq_der = DerSequence()\ndecoded_sign = seq_der.decode(signature)\n# ASN.1 DER \u89e3\u7801\uff0c\u4e24\u4e2a 32 \u5b57\u8282\u7684\u6574\u6570\nr = decoded_sign[0]\ns = decoded_sign[1]\nprint('r', r)\nprint('s', s)\nraw_signature = '%064x%064x' % (r, s)\n\n# \u9a8c\u8bc1\u539f\u59cb\u7b7e\u540d\u540c\u6837\u9700\u8981\u5148\u8fdb\u884c ASN.1 DER \u7f16\u7801\nr = int(raw_signature[:64], base=16)\ns = int(raw_signature[64:], base=16)\nseq_der = DerSequence()\nseq_der.append(DerInteger(r))\nseq_der.append(DerInteger(s))\nsignature = seq_der.encode()\nverify = sm2_verify(private_key, public_key, message, signature)\nprint('verify', verify)\n```\n\n### \u516c\u79c1\u94a5\u7684\u4e00\u4e9b\u8865\u5145\u8bf4\u660e\n\n\u516c\u94a5\u957f\u5ea6\u4e3a 64 \u5b57\u8282\uff0c\u662f\u4e24\u4e2a 32 \u5b57\u8282\u7684\u6574\u6570 x y \u62fc\u63a5\u800c\u6210\u3002\n\n\u5982\u679c\u516c\u94a5\u957f\u5ea6\u4e3a 65 \u5b57\u8282\uff0c\u90a3\u4e48\u7b2c\u4e00\u4e2a\u5b57\u8282\u4e3a '\\x04' \uff0c\u8868\u793a\u540e\u9762\u7684 64 \u5b57\u8282\u5c31\u662f\u516c\u94a5\u3002\n\n\u5982\u679c\u516c\u94a5\u957f\u5ea6\u4e3a 33 \u5b57\u8282\uff0c\u90a3\u4e48\u7b2c\u4e00\u4e2a\u5b57\u8282\u4e3a '\\x02' \u6216\u8005 '\\x03' \uff0c\n\u8fd9\u662f\u4e00\u79cd\u538b\u7f29\u683c\u5f0f\uff0c\u540e\u9762\u7684 32 \u5b57\u8282\u4e3a\u6574\u6570 x \uff0c y \u53ef\u4ee5\u6839\u636e x \u8ba1\u7b97\u51fa\u6765\u3002\n\n\u79c1\u94a5\u957f\u5ea6\u4e3a 32 \u5b57\u8282\uff0c\u6ca1\u6709\u5176\u4ed6\u53d8\u5316\u3002\n\n```python\nfrom gmssl_pyx import sm2_key_generate, normalize_sm2_public_key\n\n\nraw_public_key, _ = sm2_key_generate()\nk1 = normalize_sm2_public_key(raw_public_key)\nassert k1 == raw_public_key\nk1 = normalize_sm2_public_key(b'\\x04' + raw_public_key)\nassert k1 == raw_public_key\n\n# \u538b\u7f29\u7248\u516c\u94a5\ny = int.from_bytes(raw_public_key[32:], byteorder='big')\nif y % 2 == 0:\n    # y \u662f\u5076\u6570\n    compressed_public_key = b'\\x02' +raw_public_key[:32]\nelse:\n    compressed_public_key = b'\\x03' + raw_public_key[:32]\nk1 = normalize_sm2_public_key(compressed_public_key)\nassert k1 == raw_public_key\n```\n\n## SM3\n\n### hash \u8ba1\u7b97\n\n```python\nfrom gmssl_pyx import sm3_hash\n\n\nmessage = b'hello world'\nsignature = sm3_hash(message)\nprint('message', message)\nprint('signature', signature.hex())\n```\n\n### hmac \u8ba1\u7b97\n\n```python\nimport secrets\nfrom gmssl_pyx import sm3_hmac\n\n\nkey = secrets.token_bytes(32)\nmessage = b\"sm3_hmac\"\nhmac_data = sm3_hmac(key, message)\nprint(\"message\", message)\nprint(\"hmac_data\", hmac_data)\n```\n\n### kdf \u8ba1\u7b97\n\n```python\nimport secrets\nfrom gmssl_pyx import sm3_kdf\n\n\nkey = secrets.token_bytes(32)\nnew_key = sm3_kdf(key, 32)\nprint('kdf new_key', new_key)\n```\n\n## SM4\n\n### CBC \u6a21\u5f0f\u52a0\u5bc6\u548c\u89e3\u5bc6\n\n```python\nimport secrets\nfrom gmssl_pyx import (\n    sm4_cbc_padding_encrypt,\n    sm4_cbc_padding_decrypt,\n    SM4_KEY_SIZE,\n    SM4_BLOCK_SIZE,\n)\n\n\nkey = secrets.token_bytes(SM4_KEY_SIZE)\niv = secrets.token_bytes(SM4_BLOCK_SIZE)\nplaintext = b\"hello world\"\n# \u52a0\u5bc6\nciphertext = sm4_cbc_padding_encrypt(key, iv, plaintext)\nprint(\"ciphertext\", ciphertext.hex())\n\n# \u89e3\u5bc6\ndecrypted = sm4_cbc_padding_decrypt(key, iv, ciphertext)\nprint(\"decrypted\", decrypted)\n\n```\n\n### CTR \u6a21\u5f0f\u52a0\u5bc6\u548c\u89e3\u5bc6\n\n```python\nimport secrets\nfrom gmssl_pyx import (\n    sm4_ctr_encrypt,\n    sm4_ctr_decrypt,\n    SM4_KEY_SIZE,\n    SM4_BLOCK_SIZE,\n)\n\n\nkey = secrets.token_bytes(SM4_KEY_SIZE)\nctr = secrets.token_bytes(SM4_BLOCK_SIZE)\nplaintext = b\"hello world\"\n# \u52a0\u5bc6\nciphertext = sm4_ctr_encrypt(key, ctr, plaintext)\nprint(\"ciphertext\", ciphertext.hex())\n\n# \u89e3\u5bc6\ndecrypted = sm4_ctr_decrypt(key, ctr, ciphertext)\nprint(\"decrypted\", decrypted)\n\n```\n\n### GCM \u6a21\u5f0f\u52a0\u5bc6\u548c\u89e3\u5bc6\n\n```python\nimport secrets\nfrom gmssl_pyx import sm4_gcm_encrypt, sm4_gcm_decrypt, SM4_KEY_SIZE, SM4_BLOCK_SIZE\n\n\nplaintext = b'hello world'\nkey = secrets.token_bytes(SM4_KEY_SIZE)\niv = secrets.token_bytes(SM4_BLOCK_SIZE)\naad = secrets.token_bytes(16)\n# \u52a0\u5bc6\nciphertext, tag = sm4_gcm_encrypt(key, iv, aad, plaintext=plaintext)\nprint('ciphertext', ciphertext)\n\n# \u89e3\u5bc6\nplaintext = sm4_gcm_decrypt(key, iv=iv, aad=aad, ciphertext=ciphertext, tag=tag)\nprint('plaintext', plaintext)\n\n```\n\n## \u5176\u4ed6\n\n[SM9](docs/sm9.md)\n\n\u5982\u679c\u8981\u67e5\u770b\u6240\u6709\u53ef\u7528\u7684 API \uff0c\u53ef\u4ee5\u770b [gmsslext.pyi](gmssl_pyx/gmsslext.pyi) \u6587\u4ef6\u3002\n",
    "bugtrack_url": null,
    "license": "Apache Software License",
    "summary": "python wrapper of GmSSL",
    "version": "2.0.0",
    "project_urls": {
        "Homepage": "https://github.com/yetsing/gmssl_pyx"
    },
    "split_keywords": [
        "gmssl"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "76653086f99ac8fdc489709e47a32c8e76deee843e03ab53d5a30e9a17709040",
                "md5": "1f228718bdd13dcb1a4de0403f32be3a",
                "sha256": "2d60450fb7535fc1c4aac4cd78f320237bf2074ea997a947014a20fa1016dd01"
            },
            "downloads": -1,
            "filename": "gmssl_pyx-2.0.0-cp310-cp310-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "1f228718bdd13dcb1a4de0403f32be3a",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.7",
            "size": 120740,
            "upload_time": "2024-01-19T14:48:50",
            "upload_time_iso_8601": "2024-01-19T14:48:50.331616Z",
            "url": "https://files.pythonhosted.org/packages/76/65/3086f99ac8fdc489709e47a32c8e76deee843e03ab53d5a30e9a17709040/gmssl_pyx-2.0.0-cp310-cp310-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "767dbbb9f9f1ab281aca590cba6f0cd2de20cbb2313a1c7f0183fe9e8cc6b459",
                "md5": "4b8067c58d21b0ee2f64e7e79cfc0117",
                "sha256": "6fd4668998acfb37e73a1657d1d4e70c32df82e88ca013bc45589bd50e3d8a81"
            },
            "downloads": -1,
            "filename": "gmssl_pyx-2.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "4b8067c58d21b0ee2f64e7e79cfc0117",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.7",
            "size": 171482,
            "upload_time": "2024-01-19T14:48:51",
            "upload_time_iso_8601": "2024-01-19T14:48:51.561120Z",
            "url": "https://files.pythonhosted.org/packages/76/7d/bbb9f9f1ab281aca590cba6f0cd2de20cbb2313a1c7f0183fe9e8cc6b459/gmssl_pyx-2.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "8288d011d61e23197e9e69511822b5dc2bfdf543ba7a19ac131e5e0533f23d32",
                "md5": "263b28bd4cea8747b9b6a013826201ed",
                "sha256": "109fefeef6ef4f66295238dafae4a8abbd8dc5ba475e97ad7fe76a648201080a"
            },
            "downloads": -1,
            "filename": "gmssl_pyx-2.0.0-cp310-cp310-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "263b28bd4cea8747b9b6a013826201ed",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.7",
            "size": 137656,
            "upload_time": "2024-01-19T14:48:53",
            "upload_time_iso_8601": "2024-01-19T14:48:53.169498Z",
            "url": "https://files.pythonhosted.org/packages/82/88/d011d61e23197e9e69511822b5dc2bfdf543ba7a19ac131e5e0533f23d32/gmssl_pyx-2.0.0-cp310-cp310-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "ea5da87c66ce59250ef50923f4ae4f30f82d8845e84b65b58c776db49e1c95ab",
                "md5": "c28b56a960d4f0fb4986122514ed9ccc",
                "sha256": "d1e01e604c789306be796f5a58c5e9b6a9d2f4a8bbcd700b6f30d0dec3def335"
            },
            "downloads": -1,
            "filename": "gmssl_pyx-2.0.0-cp37-cp37m-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "c28b56a960d4f0fb4986122514ed9ccc",
            "packagetype": "bdist_wheel",
            "python_version": "cp37",
            "requires_python": ">=3.7",
            "size": 115710,
            "upload_time": "2024-01-19T14:48:54",
            "upload_time_iso_8601": "2024-01-19T14:48:54.373454Z",
            "url": "https://files.pythonhosted.org/packages/ea/5d/a87c66ce59250ef50923f4ae4f30f82d8845e84b65b58c776db49e1c95ab/gmssl_pyx-2.0.0-cp37-cp37m-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "e81aafd6c8ca682dd8ee0797729e6ebd0e9153e4bff387ce607c99acdf4bb18c",
                "md5": "5559deb8674e049f2ae916431a82c708",
                "sha256": "c07a403030a748e17cf702fca1527b810901399c1558bbf7116c0df962a5ec14"
            },
            "downloads": -1,
            "filename": "gmssl_pyx-2.0.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "5559deb8674e049f2ae916431a82c708",
            "packagetype": "bdist_wheel",
            "python_version": "cp37",
            "requires_python": ">=3.7",
            "size": 167651,
            "upload_time": "2024-01-19T14:48:56",
            "upload_time_iso_8601": "2024-01-19T14:48:56.012457Z",
            "url": "https://files.pythonhosted.org/packages/e8/1a/afd6c8ca682dd8ee0797729e6ebd0e9153e4bff387ce607c99acdf4bb18c/gmssl_pyx-2.0.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "06b08e15fa864436afffbfbfb3b4f42d3bad4e6aafad48c3d7cfd9fe8e2d5f77",
                "md5": "25de84d31c58bc1d63bfd092ad2c6a6e",
                "sha256": "2eba6b15c52cf96ebf2d9bcf7e1518a3447f39da94faa759614702e54904ff0d"
            },
            "downloads": -1,
            "filename": "gmssl_pyx-2.0.0-cp37-cp37m-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "25de84d31c58bc1d63bfd092ad2c6a6e",
            "packagetype": "bdist_wheel",
            "python_version": "cp37",
            "requires_python": ">=3.7",
            "size": 135871,
            "upload_time": "2024-01-19T14:48:57",
            "upload_time_iso_8601": "2024-01-19T14:48:57.105180Z",
            "url": "https://files.pythonhosted.org/packages/06/b0/8e15fa864436afffbfbfb3b4f42d3bad4e6aafad48c3d7cfd9fe8e2d5f77/gmssl_pyx-2.0.0-cp37-cp37m-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "ba996851de43c8592cd6e326ddd83ce10826410d8f7b6ca18522448a862fba72",
                "md5": "9a85cc99e9fc43685652d5d1bc47b92b",
                "sha256": "b7ab2e54094b61b08f5dadd040614b1543331e87b0433bf6d7fb4747cb23dc30"
            },
            "downloads": -1,
            "filename": "gmssl_pyx-2.0.0-cp38-cp38-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "9a85cc99e9fc43685652d5d1bc47b92b",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.7",
            "size": 117842,
            "upload_time": "2024-01-19T14:48:58",
            "upload_time_iso_8601": "2024-01-19T14:48:58.368078Z",
            "url": "https://files.pythonhosted.org/packages/ba/99/6851de43c8592cd6e326ddd83ce10826410d8f7b6ca18522448a862fba72/gmssl_pyx-2.0.0-cp38-cp38-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "3b790cba94cf9996a5ce349f3dc38165c46026e36389bf699f6c02cf36fe02b1",
                "md5": "990321458120e557fe53c04589044352",
                "sha256": "b213abc736fc5af0219d61df06bfd32613bd9df96a16790ddeeae8d5c0c6569d"
            },
            "downloads": -1,
            "filename": "gmssl_pyx-2.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "990321458120e557fe53c04589044352",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.7",
            "size": 171091,
            "upload_time": "2024-01-19T14:48:59",
            "upload_time_iso_8601": "2024-01-19T14:48:59.414529Z",
            "url": "https://files.pythonhosted.org/packages/3b/79/0cba94cf9996a5ce349f3dc38165c46026e36389bf699f6c02cf36fe02b1/gmssl_pyx-2.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "fd6c7aaf19673f08447385696631bf3d9d6cf17f40609cda3160f903440243c5",
                "md5": "a5ba4399e25260e6354d88830e71d261",
                "sha256": "b686b205a0cc992bab01e3fe9d7ef7955d751e5c6eca2b1f9aeeeedbaa61d2ca"
            },
            "downloads": -1,
            "filename": "gmssl_pyx-2.0.0-cp38-cp38-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "a5ba4399e25260e6354d88830e71d261",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.7",
            "size": 137954,
            "upload_time": "2024-01-19T14:49:01",
            "upload_time_iso_8601": "2024-01-19T14:49:01.084215Z",
            "url": "https://files.pythonhosted.org/packages/fd/6c/7aaf19673f08447385696631bf3d9d6cf17f40609cda3160f903440243c5/gmssl_pyx-2.0.0-cp38-cp38-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "b5c3934466c99b623731ba857c737e36ea8da5896fc29655baf347b195e82f4e",
                "md5": "ba23d8bca7f9450fa178cceda4c4ab32",
                "sha256": "1fa80a460b6286ba289a0cc35b60ced8f04a4c8f3004612b2b2fac987740a609"
            },
            "downloads": -1,
            "filename": "gmssl_pyx-2.0.0-cp39-cp39-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "ba23d8bca7f9450fa178cceda4c4ab32",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.7",
            "size": 120729,
            "upload_time": "2024-01-19T14:49:02",
            "upload_time_iso_8601": "2024-01-19T14:49:02.496557Z",
            "url": "https://files.pythonhosted.org/packages/b5/c3/934466c99b623731ba857c737e36ea8da5896fc29655baf347b195e82f4e/gmssl_pyx-2.0.0-cp39-cp39-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "f1fa6a067ef16978eba411c3ff1df347db1aa8f6bca9961972491b7360606198",
                "md5": "4626573044bbe6eacbc3b967091e027d",
                "sha256": "f8678cef5bd78133aadae23fc7867a9b8eaef171cf0e0f78f871ac3e06f4a16b"
            },
            "downloads": -1,
            "filename": "gmssl_pyx-2.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "4626573044bbe6eacbc3b967091e027d",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.7",
            "size": 171076,
            "upload_time": "2024-01-19T14:49:04",
            "upload_time_iso_8601": "2024-01-19T14:49:04.126837Z",
            "url": "https://files.pythonhosted.org/packages/f1/fa/6a067ef16978eba411c3ff1df347db1aa8f6bca9961972491b7360606198/gmssl_pyx-2.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "4bcddfaa186e5e3d9ede9c2983b1cdb481395d3c51fc5d64c3ced3ccf15917d7",
                "md5": "b966795d53a91e4b2f5cb3ad23f23300",
                "sha256": "a0fce6721c24c9b739ccd652fc6ad9df774d2102a48c6d8c876d113acd4910d0"
            },
            "downloads": -1,
            "filename": "gmssl_pyx-2.0.0-cp39-cp39-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "b966795d53a91e4b2f5cb3ad23f23300",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.7",
            "size": 137717,
            "upload_time": "2024-01-19T14:49:05",
            "upload_time_iso_8601": "2024-01-19T14:49:05.225248Z",
            "url": "https://files.pythonhosted.org/packages/4b/cd/dfaa186e5e3d9ede9c2983b1cdb481395d3c51fc5d64c3ced3ccf15917d7/gmssl_pyx-2.0.0-cp39-cp39-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "215b27c386bed7f2493d850ed4ef31797412c260c4e5b1e27cba34506ebdc410",
                "md5": "e3be23a3434330fbdd1e8d59d580d56d",
                "sha256": "2587cebe939db191641eb26da99362e30848757156697784d03dbd6c368983c3"
            },
            "downloads": -1,
            "filename": "gmssl_pyx-2.0.0.tar.gz",
            "has_sig": false,
            "md5_digest": "e3be23a3434330fbdd1e8d59d580d56d",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.7",
            "size": 25118,
            "upload_time": "2024-01-19T14:49:06",
            "upload_time_iso_8601": "2024-01-19T14:49:06.829097Z",
            "url": "https://files.pythonhosted.org/packages/21/5b/27c386bed7f2493d850ed4ef31797412c260c4e5b1e27cba34506ebdc410/gmssl_pyx-2.0.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-01-19 14:49:06",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "yetsing",
    "github_project": "gmssl_pyx",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "gmssl-pyx"
}
        
Elapsed time: 0.17672s