mirror of https://github.com/mongodb/mongo
50 lines
1.7 KiB
Python
Executable File
50 lines
1.7 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
"""
|
|
This script calculates and writes out digests for x509 certificates/CRLs.
|
|
Invoke as `mkdigest.py <cert|crl> <sha256|sha1> <filename1> [filename2 ...]`
|
|
"""
|
|
|
|
import argparse
|
|
|
|
import cryptography.hazmat.primitives.hashes as hashes
|
|
import OpenSSL
|
|
|
|
DIGEST_NAME_TO_HASH = {"sha256": hashes.SHA256(), "sha1": hashes.SHA1()}
|
|
|
|
|
|
def make_digest(filename, item_type, digest_type):
|
|
"""Calculate the given digest of the certificate/CRL passed in and write it out to <filename>.digest.<digest_type>"""
|
|
assert item_type in {"cert", "crl"}
|
|
assert digest_type in {"sha256", "sha1"}
|
|
with open(filename, "r") as f:
|
|
data = f.read()
|
|
|
|
if item_type == "cert":
|
|
cert = OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_PEM, data)
|
|
rawdigest = cert.digest(digest_type)
|
|
digest = rawdigest.decode("utf8").replace(":", "")
|
|
elif item_type == "crl":
|
|
crl = OpenSSL.crypto.load_crl(OpenSSL.crypto.FILETYPE_PEM, data)
|
|
rawdigest = crl.to_cryptography().fingerprint(DIGEST_NAME_TO_HASH[digest_type])
|
|
digest = rawdigest.hex().upper()
|
|
|
|
with open(filename + ".digest." + digest_type, "w") as f:
|
|
f.write(digest)
|
|
|
|
|
|
def main():
|
|
parser = argparse.ArgumentParser(description="X509 Digest Generator")
|
|
parser.add_argument(
|
|
"type", choices={"cert", "crl"}, help="Type of X509 object to generate digest for"
|
|
)
|
|
parser.add_argument("digest", choices={"sha1", "sha256"}, help="Algorithm for digest")
|
|
parser.add_argument("filename", nargs="+", help="Path of X509 file to generate digest for")
|
|
args = parser.parse_args()
|
|
|
|
for fname in args.filename:
|
|
make_digest(fname, args.type, args.digest)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|