-
Notifications
You must be signed in to change notification settings - Fork 6
Expand file tree
/
Copy pathapp.py
More file actions
37 lines (29 loc) · 1.22 KB
/
Copy pathapp.py
File metadata and controls
37 lines (29 loc) · 1.22 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import argparse
import hashlib
from dynwinrt import RoApartment, projected_lifetime_scope
from generated.windows.security.cryptography.core import HashAlgorithmProvider
from generated.windows.storage.streams import IBuffer
def sha256(text: str) -> str:
with RoApartment(), projected_lifetime_scope():
provider = HashAlgorithmProvider.open_algorithm("SHA256")
data = IBuffer.from_bytes(text.encode("utf-8"))
digest = provider.hash_data(data)
copied_digest = digest.to_bytes()
expected_length = provider.hash_length
if len(copied_digest) != expected_length:
raise RuntimeError(
f"SHA256 buffer length mismatch: {len(copied_digest)} != "
f"{expected_length}"
)
return copied_digest.hex()
def main() -> None:
parser = argparse.ArgumentParser()
parser.add_argument("--text", default="Hello from dynwinrt.")
args = parser.parse_args()
actual = sha256(args.text)
expected = hashlib.sha256(args.text.encode("utf-8")).hexdigest()
if actual != expected:
raise RuntimeError(f"SHA256 mismatch: {actual} != {expected}")
print("python-cryptography-ok", actual)
if __name__ == "__main__":
main()