import subprocess, sys
def read_tlv(data, pos):
start = pos
tag = data[pos]; pos += 1
b = data[pos]; pos += 1
if b & 0x80:
n = b & 0x7f
ln = int.from_bytes(data[pos:pos+n], 'big'); pos += n
else:
ln = b
val = data[pos:pos+ln]; pos += ln
return tag, val, pos, start, pos - start
def main():
root_pem = r"d:\RustProject\Courierust\tests\certs\p384_ca_cert.pem"
inter_der = open(r"d:\RustProject\Courierust\tests\certs\p384_intermediate_cert.der", 'rb').read()
tag, outer, pos, _, _ = read_tlv(inter_der, 0)
assert tag == 0x30
tag, _, _, _, tbs_len = read_tlv(outer, 0)
assert tag == 0x30
tbs = outer[0:tbs_len]
open(r"d:\RustProject\Courierust\tmp_p384_tbs.der", 'wb').write(tbs)
_, _, p2, _, _ = read_tlv(outer, 0)
_, _, p2, _, _ = read_tlv(outer, p2)
_, sigbits, _, _, _ = read_tlv(outer, p2)
sig = sigbits[1:]
open(r"d:\RustProject\Courierust\tmp_p384_sig.der", 'wb').write(sig)
r = subprocess.run(["C:\\msys64\\usr\\bin\\openssl.exe", "x509", "-in", root_pem, "-pubkey", "-noout"],
capture_output=True)
open(r"d:\RustProject\Courierust\tmp_p384_root_pub.pem", 'wb').write(r.stdout)
v = subprocess.run(["C:\\msys64\\usr\\bin\\openssl.exe", "dgst", "-sha384",
"-verify", r"d:\RustProject\Courierust\tmp_p384_root_pub.pem",
"-signature", r"d:\RustProject\Courierust\tmp_p384_sig.der",
r"d:\RustProject\Courierust\tmp_p384_tbs.der"],
capture_output=True, text=True)
print("openssl verify stdout:", v.stdout)
print("openssl verify stderr:", v.stderr)
import hashlib
print("sha384(tbs) =", hashlib.sha384(tbs).hexdigest())
print("sig hex =", sig.hex())
print("tbs len =", len(tbs))
if __name__ == "__main__":
main()