|
| 1 | +import re |
1 | 2 | import base64 |
2 | 3 | import struct |
3 | 4 |
|
@@ -105,3 +106,75 @@ def ensure_binary(s): |
105 | 106 | if isinstance(s, str): |
106 | 107 | return s.encode("utf-8", "strict") |
107 | 108 | raise TypeError(f"not expecting type '{type(s)}'") |
| 109 | + |
| 110 | + |
| 111 | +# Based on https://github.com/jpadilla/pyjwt/commit/9c528670c455b8d948aff95ed50e22940d1ad3fc |
| 112 | +# Based on https://github.com/hynek/pem/blob/7ad94db26b0bc21d10953f5dbad3acfdfacf57aa/src/pem/_core.py#L224-L252 |
| 113 | +_PEMS = { |
| 114 | + b"CERTIFICATE", |
| 115 | + b"TRUSTED CERTIFICATE", |
| 116 | + b"PRIVATE KEY", |
| 117 | + b"PUBLIC KEY", |
| 118 | + b"ENCRYPTED PRIVATE KEY", |
| 119 | + b"OPENSSH PRIVATE KEY", |
| 120 | + b"DSA PRIVATE KEY", |
| 121 | + b"RSA PRIVATE KEY", |
| 122 | + b"RSA PUBLIC KEY", |
| 123 | + b"EC PRIVATE KEY", |
| 124 | + b"DH PARAMETERS", |
| 125 | + b"NEW CERTIFICATE REQUEST", |
| 126 | + b"CERTIFICATE REQUEST", |
| 127 | + b"SSH2 PUBLIC KEY", |
| 128 | + b"SSH2 ENCRYPTED PRIVATE KEY", |
| 129 | + b"X509 CRL", |
| 130 | +} |
| 131 | + |
| 132 | + |
| 133 | +_PEM_RE = re.compile( |
| 134 | + b"----[- ]BEGIN (" |
| 135 | + + b"|".join(_PEMS) |
| 136 | + + b""")[- ]----\r? |
| 137 | +.+?\r? |
| 138 | +----[- ]END \\1[- ]----\r?\n?""", |
| 139 | + re.DOTALL, |
| 140 | +) |
| 141 | + |
| 142 | + |
| 143 | +def is_pem_format(key): |
| 144 | + """ |
| 145 | + Return True if the key is PEM format |
| 146 | + This function uses the list of valid PEM headers defined in |
| 147 | + _PEMS dict. |
| 148 | + """ |
| 149 | + return bool(_PEM_RE.search(key)) |
| 150 | + |
| 151 | + |
| 152 | +# Based on https://github.com/pyca/cryptography/blob/bcb70852d577b3f490f015378c75cba74986297b/src/cryptography/hazmat/primitives/serialization/ssh.py#L40-L46 |
| 153 | +_CERT_SUFFIX = b"-cert-v01@openssh.com" |
| 154 | +_SSH_PUBKEY_RC = re.compile(br"\A(\S+)[ \t]+(\S+)") |
| 155 | +_SSH_KEY_FORMATS = [ |
| 156 | + b"ssh-ed25519", |
| 157 | + b"ssh-rsa", |
| 158 | + b"ssh-dss", |
| 159 | + b"ecdsa-sha2-nistp256", |
| 160 | + b"ecdsa-sha2-nistp384", |
| 161 | + b"ecdsa-sha2-nistp521", |
| 162 | +] |
| 163 | + |
| 164 | + |
| 165 | +def is_ssh_key(key): |
| 166 | + """ |
| 167 | + Return True if the key is a SSH key |
| 168 | + This function uses the list of valid SSH key format defined in |
| 169 | + _SSH_KEY_FORMATS dict. |
| 170 | + """ |
| 171 | + if any(string_value in key for string_value in _SSH_KEY_FORMATS): |
| 172 | + return True |
| 173 | + |
| 174 | + ssh_pubkey_match = _SSH_PUBKEY_RC.match(key) |
| 175 | + if ssh_pubkey_match: |
| 176 | + key_type = ssh_pubkey_match.group(1) |
| 177 | + if _CERT_SUFFIX == key_type[-len(_CERT_SUFFIX) :]: |
| 178 | + return True |
| 179 | + |
| 180 | + return False |
0 commit comments