mirror of
https://github.com/TriM-Organization/Linglun-Converter.git
synced 2024-11-14 11:27:33 +08:00
65 lines
1.5 KiB
Python
65 lines
1.5 KiB
Python
|
# -*- coding: utf-8 -*-
|
||
|
|
||
|
"""
|
||
|
伶伦转换器 打包存档组件
|
||
|
Linglun Converter Language Localization Component
|
||
|
|
||
|
版权所有 © 2023 金羿 & 睿穆开发组
|
||
|
Copyright © 2023 EillesWan & TriM Org.
|
||
|
|
||
|
开源相关声明请见 ./License.md
|
||
|
Terms & Conditions: ./Lisense.md
|
||
|
"""
|
||
|
|
||
|
|
||
|
|
||
|
import hashlib
|
||
|
|
||
|
import dill
|
||
|
import brotli
|
||
|
|
||
|
from .salt import salt
|
||
|
from .io import Any
|
||
|
|
||
|
|
||
|
def unpack_llc_pack(from_dist: str, raise_error: bool = True):
|
||
|
with open(from_dist, "rb") as f:
|
||
|
salty_sha256_value, md5_value, packed_bytes = f.read().split(b" | \n", 2)
|
||
|
|
||
|
if (md5_value == hashlib.md5(packed_bytes).digest()) and (
|
||
|
salty_sha256_value
|
||
|
== hashlib.pbkdf2_hmac("sha256", md5_value + packed_bytes, salt, 16)
|
||
|
):
|
||
|
return dill.loads(
|
||
|
brotli.decompress(packed_bytes),
|
||
|
)
|
||
|
else:
|
||
|
if raise_error:
|
||
|
raise ValueError("文件读取失败:签名不一致,可能存在注入风险。")
|
||
|
else:
|
||
|
return ValueError("文件读取失败:签名不一致,可能存在注入风险。")
|
||
|
|
||
|
|
||
|
def enpack_llc_pack(sth: Any, to_dist: str):
|
||
|
packing_bytes = brotli.compress(
|
||
|
dill.dumps(
|
||
|
sth,
|
||
|
)
|
||
|
)
|
||
|
|
||
|
md5_value = hashlib.md5(packing_bytes).digest() # 长度 16
|
||
|
|
||
|
salty_sha256_value = hashlib.pbkdf2_hmac(
|
||
|
"sha256", md5_value + packing_bytes, salt, 16
|
||
|
) # 长度 32
|
||
|
|
||
|
with open(
|
||
|
to_dist,
|
||
|
"wb",
|
||
|
) as f:
|
||
|
f.write(salty_sha256_value)
|
||
|
f.write(b" | \n")
|
||
|
f.write(md5_value)
|
||
|
f.write(b" | \n")
|
||
|
f.write(packing_bytes)
|