|
| 1 | +import sys |
| 2 | + |
| 3 | +if len(sys.argv) != 3: |
| 4 | + raise ValueError( |
| 5 | + f"Usage: {sys.argv[0]} dk.pem ek.pem" |
| 6 | + ) |
| 7 | + |
| 8 | +from kyber_py.ml_kem import ML_KEM_512, ML_KEM_768, ML_KEM_1024 |
| 9 | + |
| 10 | +OIDS = { |
| 11 | + (2, 16, 840, 1, 101, 3, 4, 4, 1): ML_KEM_512, |
| 12 | + (2, 16, 840, 1, 101, 3, 4, 4, 2): ML_KEM_768, |
| 13 | + (2, 16, 840, 1, 101, 3, 4, 4, 3): ML_KEM_1024, |
| 14 | +} |
| 15 | + |
| 16 | +import ecdsa.der as der |
| 17 | + |
| 18 | +with open(sys.argv[1], "rt") as ek_file: |
| 19 | + ek_pem = ek_file.read() |
| 20 | + |
| 21 | +ek_der = der.unpem(ek_pem) |
| 22 | + |
| 23 | +s1, empty = der.remove_sequence(ek_der) |
| 24 | +if empty != b"": |
| 25 | + raise der.UnexpectedDER("Trailing junk after DER public key") |
| 26 | + |
| 27 | +ver, rest = der.remove_integer(s1) |
| 28 | + |
| 29 | +if ver != 0: |
| 30 | + raise der.UnexpectedDER("Unexpected format version") |
| 31 | + |
| 32 | +alg_id, rest = der.remove_sequence(rest) |
| 33 | + |
| 34 | +alg_id, empty = der.remove_object(alg_id) |
| 35 | +if alg_id not in OIDS: |
| 36 | + raise der.UnexpectedDER(f"Not recognised algoritm OID: {alg_id}") |
| 37 | +if empty != b"": |
| 38 | + raise der.UnexpectedDER("parameters specified for ML-KEM OID") |
| 39 | + |
| 40 | +kem = OIDS[alg_id] |
| 41 | + |
| 42 | +key, empty = der.remove_octet_string(rest) |
| 43 | +if empty != b"": |
| 44 | + raise der.UnexpectedDER("Trailing junk after the key") |
| 45 | + |
| 46 | +#key, empty = der.remove_octet_string(key_der) |
| 47 | +#if empty != b"": |
| 48 | +# raise der.UnexpectedDER("Trailing junk after the key") |
| 49 | + |
| 50 | +assert len(key) == 64 |
| 51 | +ek, _ = kem.key_derive(key) |
| 52 | + |
| 53 | +with open(sys.argv[2], "wb") as ek_file: |
| 54 | + encoded = der.encode_sequence( |
| 55 | + der.encode_sequence(der.encode_oid(*alg_id)), |
| 56 | + der.encode_bitstring(ek, 0), |
| 57 | + ) |
| 58 | + ek_file.write(der.topem(encoded, "PUBLIC KEY")) |
| 59 | + |
0 commit comments