| Absolute File Name: | /home/opencoverage/opencoverage/guest-scripts/openssh/src/dns.c |
| Switch to Source code | Preprocessed file |
| Line | Source | Count | ||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | - | |||||||||||||||||||||||||
| 2 | - | |||||||||||||||||||||||||
| 3 | - | |||||||||||||||||||||||||
| 4 | - | |||||||||||||||||||||||||
| 5 | - | |||||||||||||||||||||||||
| 6 | - | |||||||||||||||||||||||||
| 7 | - | |||||||||||||||||||||||||
| 8 | - | |||||||||||||||||||||||||
| 9 | - | |||||||||||||||||||||||||
| 10 | - | |||||||||||||||||||||||||
| 11 | static const char *errset_text[] = { | - | ||||||||||||||||||||||||
| 12 | "success", | - | ||||||||||||||||||||||||
| 13 | "out of memory", | - | ||||||||||||||||||||||||
| 14 | "general failure", | - | ||||||||||||||||||||||||
| 15 | "invalid parameter", | - | ||||||||||||||||||||||||
| 16 | "name does not exist", | - | ||||||||||||||||||||||||
| 17 | "data does not exist", | - | ||||||||||||||||||||||||
| 18 | }; | - | ||||||||||||||||||||||||
| 19 | - | |||||||||||||||||||||||||
| 20 | static const char * | - | ||||||||||||||||||||||||
| 21 | dns_result_totext(unsigned int res) | - | ||||||||||||||||||||||||
| 22 | { | - | ||||||||||||||||||||||||
| 23 | switch (res) { | - | ||||||||||||||||||||||||
| 24 | case never executed: 0:case 0:never executed: case 0: | 0 | ||||||||||||||||||||||||
| 25 | return never executed: errset_text[0];return errset_text[0];never executed: return errset_text[0]; | 0 | ||||||||||||||||||||||||
| 26 | case never executed: 1:case 1:never executed: case 1: | 0 | ||||||||||||||||||||||||
| 27 | return never executed: errset_text[1];return errset_text[1];never executed: return errset_text[1]; | 0 | ||||||||||||||||||||||||
| 28 | case never executed: 2:case 2:never executed: case 2: | 0 | ||||||||||||||||||||||||
| 29 | return never executed: errset_text[2];return errset_text[2];never executed: return errset_text[2]; | 0 | ||||||||||||||||||||||||
| 30 | case never executed: 3:case 3:never executed: case 3: | 0 | ||||||||||||||||||||||||
| 31 | return never executed: errset_text[3];return errset_text[3];never executed: return errset_text[3]; | 0 | ||||||||||||||||||||||||
| 32 | case never executed: 4:case 4:never executed: case 4: | 0 | ||||||||||||||||||||||||
| 33 | return never executed: errset_text[4];return errset_text[4];never executed: return errset_text[4]; | 0 | ||||||||||||||||||||||||
| 34 | case never executed: 5:case 5:never executed: case 5: | 0 | ||||||||||||||||||||||||
| 35 | return never executed: errset_text[5];return errset_text[5];never executed: return errset_text[5]; | 0 | ||||||||||||||||||||||||
| 36 | default never executed: :default:never executed: default: | 0 | ||||||||||||||||||||||||
| 37 | return never executed: "unknown error";return "unknown error";never executed: return "unknown error"; | 0 | ||||||||||||||||||||||||
| 38 | } | - | ||||||||||||||||||||||||
| 39 | } | - | ||||||||||||||||||||||||
| 40 | - | |||||||||||||||||||||||||
| 41 | - | |||||||||||||||||||||||||
| 42 | - | |||||||||||||||||||||||||
| 43 | - | |||||||||||||||||||||||||
| 44 | static int | - | ||||||||||||||||||||||||
| 45 | dns_read_key(u_int8_t *algorithm, u_int8_t *digest_type, | - | ||||||||||||||||||||||||
| 46 | u_char **digest, size_t *digest_len, struct sshkey *key) | - | ||||||||||||||||||||||||
| 47 | { | - | ||||||||||||||||||||||||
| 48 | int r, success = 0; | - | ||||||||||||||||||||||||
| 49 | int fp_alg = -1; | - | ||||||||||||||||||||||||
| 50 | - | |||||||||||||||||||||||||
| 51 | switch (key->type) { | - | ||||||||||||||||||||||||
| 52 | case never executed: KEY_RSA:case KEY_RSA:never executed: case KEY_RSA: | 0 | ||||||||||||||||||||||||
| 53 | *algorithm = SSHFP_KEY_RSA; | - | ||||||||||||||||||||||||
| 54 | if (!*digest_type
| 0 | ||||||||||||||||||||||||
| 55 | * never executed: digest_type = SSHFP_HASH_SHA1;*digest_type = SSHFP_HASH_SHA1;never executed: *digest_type = SSHFP_HASH_SHA1; | 0 | ||||||||||||||||||||||||
| 56 | break; never executed: break; | 0 | ||||||||||||||||||||||||
| 57 | case never executed: KEY_DSA:case KEY_DSA:never executed: case KEY_DSA: | 0 | ||||||||||||||||||||||||
| 58 | *algorithm = SSHFP_KEY_DSA; | - | ||||||||||||||||||||||||
| 59 | if (!*digest_type
| 0 | ||||||||||||||||||||||||
| 60 | * never executed: digest_type = SSHFP_HASH_SHA1;*digest_type = SSHFP_HASH_SHA1;never executed: *digest_type = SSHFP_HASH_SHA1; | 0 | ||||||||||||||||||||||||
| 61 | break; never executed: break; | 0 | ||||||||||||||||||||||||
| 62 | case never executed: KEY_ECDSA:case KEY_ECDSA:never executed: case KEY_ECDSA: | 0 | ||||||||||||||||||||||||
| 63 | *algorithm = SSHFP_KEY_ECDSA; | - | ||||||||||||||||||||||||
| 64 | if (!*digest_type
| 0 | ||||||||||||||||||||||||
| 65 | * never executed: digest_type = SSHFP_HASH_SHA256;*digest_type = SSHFP_HASH_SHA256;never executed: *digest_type = SSHFP_HASH_SHA256; | 0 | ||||||||||||||||||||||||
| 66 | break; never executed: break; | 0 | ||||||||||||||||||||||||
| 67 | case never executed: KEY_ED25519:case KEY_ED25519:never executed: case KEY_ED25519: | 0 | ||||||||||||||||||||||||
| 68 | *algorithm = SSHFP_KEY_ED25519; | - | ||||||||||||||||||||||||
| 69 | if (!*digest_type
| 0 | ||||||||||||||||||||||||
| 70 | * never executed: digest_type = SSHFP_HASH_SHA256;*digest_type = SSHFP_HASH_SHA256;never executed: *digest_type = SSHFP_HASH_SHA256; | 0 | ||||||||||||||||||||||||
| 71 | break; never executed: break; | 0 | ||||||||||||||||||||||||
| 72 | case never executed: KEY_XMSS:case KEY_XMSS:never executed: case KEY_XMSS: | 0 | ||||||||||||||||||||||||
| 73 | *algorithm = SSHFP_KEY_XMSS; | - | ||||||||||||||||||||||||
| 74 | if (!*digest_type
| 0 | ||||||||||||||||||||||||
| 75 | * never executed: digest_type = SSHFP_HASH_SHA256;*digest_type = SSHFP_HASH_SHA256;never executed: *digest_type = SSHFP_HASH_SHA256; | 0 | ||||||||||||||||||||||||
| 76 | break; never executed: break; | 0 | ||||||||||||||||||||||||
| 77 | default never executed: :default:never executed: default: | 0 | ||||||||||||||||||||||||
| 78 | *algorithm = SSHFP_KEY_RESERVED; | - | ||||||||||||||||||||||||
| 79 | *digest_type = SSHFP_HASH_RESERVED; | - | ||||||||||||||||||||||||
| 80 | } never executed: end of block | 0 | ||||||||||||||||||||||||
| 81 | - | |||||||||||||||||||||||||
| 82 | switch (*digest_type) { | - | ||||||||||||||||||||||||
| 83 | case never executed: SSHFP_HASH_SHA1:case SSHFP_HASH_SHA1:never executed: case SSHFP_HASH_SHA1: | 0 | ||||||||||||||||||||||||
| 84 | fp_alg = 1; | - | ||||||||||||||||||||||||
| 85 | break; never executed: break; | 0 | ||||||||||||||||||||||||
| 86 | case never executed: SSHFP_HASH_SHA256:case SSHFP_HASH_SHA256:never executed: case SSHFP_HASH_SHA256: | 0 | ||||||||||||||||||||||||
| 87 | fp_alg = 2; | - | ||||||||||||||||||||||||
| 88 | break; never executed: break; | 0 | ||||||||||||||||||||||||
| 89 | default never executed: :default:never executed: default: | 0 | ||||||||||||||||||||||||
| 90 | *digest_type = SSHFP_HASH_RESERVED; | - | ||||||||||||||||||||||||
| 91 | } never executed: end of block | 0 | ||||||||||||||||||||||||
| 92 | - | |||||||||||||||||||||||||
| 93 | if (*
| 0 | ||||||||||||||||||||||||
| 94 | if ((
| 0 | ||||||||||||||||||||||||
| 95 | digest_len)) != 0
| 0 | ||||||||||||||||||||||||
| 96 | fatal("%s: sshkey_fingerprint_raw: %s", __func__, never executed: fatal("%s: sshkey_fingerprint_raw: %s", __func__, ssh_err(r)); | 0 | ||||||||||||||||||||||||
| 97 | ssh_err(r)); never executed: fatal("%s: sshkey_fingerprint_raw: %s", __func__, ssh_err(r)); | 0 | ||||||||||||||||||||||||
| 98 | success = 1; | - | ||||||||||||||||||||||||
| 99 | } never executed: else {end of block | 0 | ||||||||||||||||||||||||
| 100 | *digest = | - | ||||||||||||||||||||||||
| 101 | ((void *)0) | - | ||||||||||||||||||||||||
| 102 | ; | - | ||||||||||||||||||||||||
| 103 | *digest_len = 0; | - | ||||||||||||||||||||||||
| 104 | success = 0; | - | ||||||||||||||||||||||||
| 105 | } never executed: end of block | 0 | ||||||||||||||||||||||||
| 106 | - | |||||||||||||||||||||||||
| 107 | return never executed: success;return success;never executed: return success; | 0 | ||||||||||||||||||||||||
| 108 | } | - | ||||||||||||||||||||||||
| 109 | - | |||||||||||||||||||||||||
| 110 | - | |||||||||||||||||||||||||
| 111 | - | |||||||||||||||||||||||||
| 112 | - | |||||||||||||||||||||||||
| 113 | static int | - | ||||||||||||||||||||||||
| 114 | dns_read_rdata(u_int8_t *algorithm, u_int8_t *digest_type, | - | ||||||||||||||||||||||||
| 115 | u_char **digest, size_t *digest_len, u_char *rdata, int rdata_len) | - | ||||||||||||||||||||||||
| 116 | { | - | ||||||||||||||||||||||||
| 117 | int success = 0; | - | ||||||||||||||||||||||||
| 118 | - | |||||||||||||||||||||||||
| 119 | *algorithm = SSHFP_KEY_RESERVED; | - | ||||||||||||||||||||||||
| 120 | *digest_type = SSHFP_HASH_RESERVED; | - | ||||||||||||||||||||||||
| 121 | - | |||||||||||||||||||||||||
| 122 | if (rdata_len >= 2
| 0 | ||||||||||||||||||||||||
| 123 | *algorithm = rdata[0]; | - | ||||||||||||||||||||||||
| 124 | *digest_type = rdata[1]; | - | ||||||||||||||||||||||||
| 125 | *digest_len = rdata_len - 2; | - | ||||||||||||||||||||||||
| 126 | - | |||||||||||||||||||||||||
| 127 | if (*
| 0 | ||||||||||||||||||||||||
| 128 | *digest = xmalloc(*digest_len); | - | ||||||||||||||||||||||||
| 129 | memcpy(*digest, rdata + 2, *digest_len); | - | ||||||||||||||||||||||||
| 130 | } never executed: else {end of block | 0 | ||||||||||||||||||||||||
| 131 | *digest = (u_char *)xstrdup(""); | - | ||||||||||||||||||||||||
| 132 | } never executed: end of block | 0 | ||||||||||||||||||||||||
| 133 | - | |||||||||||||||||||||||||
| 134 | success = 1; | - | ||||||||||||||||||||||||
| 135 | } never executed: end of block | 0 | ||||||||||||||||||||||||
| 136 | - | |||||||||||||||||||||||||
| 137 | return never executed: success;return success;never executed: return success; | 0 | ||||||||||||||||||||||||
| 138 | } | - | ||||||||||||||||||||||||
| 139 | - | |||||||||||||||||||||||||
| 140 | - | |||||||||||||||||||||||||
| 141 | - | |||||||||||||||||||||||||
| 142 | - | |||||||||||||||||||||||||
| 143 | - | |||||||||||||||||||||||||
| 144 | static int | - | ||||||||||||||||||||||||
| 145 | is_numeric_hostname(const char *hostname) | - | ||||||||||||||||||||||||
| 146 | { | - | ||||||||||||||||||||||||
| 147 | struct addrinfo hints, *ai; | - | ||||||||||||||||||||||||
| 148 | - | |||||||||||||||||||||||||
| 149 | - | |||||||||||||||||||||||||
| 150 | - | |||||||||||||||||||||||||
| 151 | - | |||||||||||||||||||||||||
| 152 | - | |||||||||||||||||||||||||
| 153 | if (hostname ==
| 0 | ||||||||||||||||||||||||
| 154 | ((void *)0)
| 0 | ||||||||||||||||||||||||
| 155 | ) { | - | ||||||||||||||||||||||||
| 156 | error("is_numeric_hostname called with NULL hostname"); | - | ||||||||||||||||||||||||
| 157 | return never executed: -1;return -1;never executed: return -1; | 0 | ||||||||||||||||||||||||
| 158 | } | - | ||||||||||||||||||||||||
| 159 | - | |||||||||||||||||||||||||
| 160 | memset(&hints, 0, sizeof(hints)); | - | ||||||||||||||||||||||||
| 161 | hints.ai_socktype = | - | ||||||||||||||||||||||||
| 162 | SOCK_DGRAM | - | ||||||||||||||||||||||||
| 163 | ; | - | ||||||||||||||||||||||||
| 164 | hints.ai_flags = | - | ||||||||||||||||||||||||
| 165 | 0x0004 | - | ||||||||||||||||||||||||
| 166 | ; | - | ||||||||||||||||||||||||
| 167 | - | |||||||||||||||||||||||||
| 168 | if (getaddrinfo(hostname,
| 0 | ||||||||||||||||||||||||
| 169 | ((void *)0)
| 0 | ||||||||||||||||||||||||
| 170 | , &hints, &ai) == 0
| 0 | ||||||||||||||||||||||||
| 171 | freeaddrinfo(ai); | - | ||||||||||||||||||||||||
| 172 | return never executed: -1;return -1;never executed: return -1; | 0 | ||||||||||||||||||||||||
| 173 | } | - | ||||||||||||||||||||||||
| 174 | - | |||||||||||||||||||||||||
| 175 | return never executed: 0;return 0;never executed: return 0; | 0 | ||||||||||||||||||||||||
| 176 | } | - | ||||||||||||||||||||||||
| 177 | - | |||||||||||||||||||||||||
| 178 | - | |||||||||||||||||||||||||
| 179 | - | |||||||||||||||||||||||||
| 180 | - | |||||||||||||||||||||||||
| 181 | - | |||||||||||||||||||||||||
| 182 | int | - | ||||||||||||||||||||||||
| 183 | verify_host_key_dns(const char *hostname, struct sockaddr *address, | - | ||||||||||||||||||||||||
| 184 | struct sshkey *hostkey, int *flags) | - | ||||||||||||||||||||||||
| 185 | { | - | ||||||||||||||||||||||||
| 186 | u_int counter; | - | ||||||||||||||||||||||||
| 187 | int result; | - | ||||||||||||||||||||||||
| 188 | struct rrsetinfo *fingerprints = | - | ||||||||||||||||||||||||
| 189 | ((void *)0) | - | ||||||||||||||||||||||||
| 190 | ; | - | ||||||||||||||||||||||||
| 191 | - | |||||||||||||||||||||||||
| 192 | u_int8_t hostkey_algorithm; | - | ||||||||||||||||||||||||
| 193 | u_int8_t hostkey_digest_type = SSHFP_HASH_RESERVED; | - | ||||||||||||||||||||||||
| 194 | u_char *hostkey_digest; | - | ||||||||||||||||||||||||
| 195 | size_t hostkey_digest_len; | - | ||||||||||||||||||||||||
| 196 | - | |||||||||||||||||||||||||
| 197 | u_int8_t dnskey_algorithm; | - | ||||||||||||||||||||||||
| 198 | u_int8_t dnskey_digest_type; | - | ||||||||||||||||||||||||
| 199 | u_char *dnskey_digest; | - | ||||||||||||||||||||||||
| 200 | size_t dnskey_digest_len; | - | ||||||||||||||||||||||||
| 201 | - | |||||||||||||||||||||||||
| 202 | *flags = 0; | - | ||||||||||||||||||||||||
| 203 | - | |||||||||||||||||||||||||
| 204 | debug3("verify_host_key_dns"); | - | ||||||||||||||||||||||||
| 205 | if (hostkey ==
| 0 | ||||||||||||||||||||||||
| 206 | ((void *)0)
| 0 | ||||||||||||||||||||||||
| 207 | ) | - | ||||||||||||||||||||||||
| 208 | fatal("No key to look up!"); never executed: fatal("No key to look up!"); | 0 | ||||||||||||||||||||||||
| 209 | - | |||||||||||||||||||||||||
| 210 | if (is_numeric_hostname(hostname)
| 0 | ||||||||||||||||||||||||
| 211 | debug("skipped DNS lookup for numerical hostname"); | - | ||||||||||||||||||||||||
| 212 | return never executed: -1;return -1;never executed: return -1; | 0 | ||||||||||||||||||||||||
| 213 | } | - | ||||||||||||||||||||||||
| 214 | - | |||||||||||||||||||||||||
| 215 | result = getrrsetbyname(hostname, 1, | - | ||||||||||||||||||||||||
| 216 | 44, 0, &fingerprints); | - | ||||||||||||||||||||||||
| 217 | if (result
| 0 | ||||||||||||||||||||||||
| 218 | verbose("DNS lookup error: %s", dns_result_totext(result)); | - | ||||||||||||||||||||||||
| 219 | return never executed: -1;return -1;never executed: return -1; | 0 | ||||||||||||||||||||||||
| 220 | } | - | ||||||||||||||||||||||||
| 221 | - | |||||||||||||||||||||||||
| 222 | if (fingerprints->rri_flags & 1
| 0 | ||||||||||||||||||||||||
| 223 | *flags |= 0x00000004; | - | ||||||||||||||||||||||||
| 224 | debug("found %d secure fingerprints in DNS", | - | ||||||||||||||||||||||||
| 225 | fingerprints->rri_nrdatas); | - | ||||||||||||||||||||||||
| 226 | } never executed: else {end of block | 0 | ||||||||||||||||||||||||
| 227 | debug("found %d insecure fingerprints in DNS", | - | ||||||||||||||||||||||||
| 228 | fingerprints->rri_nrdatas); | - | ||||||||||||||||||||||||
| 229 | } never executed: end of block | 0 | ||||||||||||||||||||||||
| 230 | - | |||||||||||||||||||||||||
| 231 | - | |||||||||||||||||||||||||
| 232 | if (!dns_read_key(&hostkey_algorithm, &hostkey_digest_type,
| 0 | ||||||||||||||||||||||||
| 233 | &hostkey_digest, &hostkey_digest_len, hostkey)
| 0 | ||||||||||||||||||||||||
| 234 | error("Error calculating host key fingerprint."); | - | ||||||||||||||||||||||||
| 235 | freerrset(fingerprints); | - | ||||||||||||||||||||||||
| 236 | return never executed: -1;return -1;never executed: return -1; | 0 | ||||||||||||||||||||||||
| 237 | } | - | ||||||||||||||||||||||||
| 238 | - | |||||||||||||||||||||||||
| 239 | if (fingerprints->rri_nrdatas
| 0 | ||||||||||||||||||||||||
| 240 | * never executed: flags |= 0x00000001;*flags |= 0x00000001;never executed: *flags |= 0x00000001; | 0 | ||||||||||||||||||||||||
| 241 | - | |||||||||||||||||||||||||
| 242 | for (counter = 0; counter < fingerprints->rri_nrdatas
| 0 | ||||||||||||||||||||||||
| 243 | - | |||||||||||||||||||||||||
| 244 | - | |||||||||||||||||||||||||
| 245 | - | |||||||||||||||||||||||||
| 246 | - | |||||||||||||||||||||||||
| 247 | if (!dns_read_rdata(&dnskey_algorithm, &dnskey_digest_type,
| 0 | ||||||||||||||||||||||||
| 248 | &dnskey_digest, &dnskey_digest_len,
| 0 | ||||||||||||||||||||||||
| 249 | fingerprints->rri_rdatas[counter].rdi_data,
| 0 | ||||||||||||||||||||||||
| 250 | fingerprints->rri_rdatas[counter].rdi_length)
| 0 | ||||||||||||||||||||||||
| 251 | verbose("Error parsing fingerprint from DNS."); | - | ||||||||||||||||||||||||
| 252 | continue; never executed: continue; | 0 | ||||||||||||||||||||||||
| 253 | } | - | ||||||||||||||||||||||||
| 254 | - | |||||||||||||||||||||||||
| 255 | if (hostkey_digest_type != dnskey_digest_type
| 0 | ||||||||||||||||||||||||
| 256 | hostkey_digest_type = dnskey_digest_type; | - | ||||||||||||||||||||||||
| 257 | free(hostkey_digest); | - | ||||||||||||||||||||||||
| 258 | - | |||||||||||||||||||||||||
| 259 | - | |||||||||||||||||||||||||
| 260 | if (!dns_read_key(&hostkey_algorithm,
| 0 | ||||||||||||||||||||||||
| 261 | &hostkey_digest_type, &hostkey_digest,
| 0 | ||||||||||||||||||||||||
| 262 | &hostkey_digest_len, hostkey)
| 0 | ||||||||||||||||||||||||
| 263 | error("Error calculating key fingerprint."); | - | ||||||||||||||||||||||||
| 264 | freerrset(fingerprints); | - | ||||||||||||||||||||||||
| 265 | return never executed: -1;return -1;never executed: return -1; | 0 | ||||||||||||||||||||||||
| 266 | } | - | ||||||||||||||||||||||||
| 267 | } never executed: end of block | 0 | ||||||||||||||||||||||||
| 268 | - | |||||||||||||||||||||||||
| 269 | - | |||||||||||||||||||||||||
| 270 | if (hostkey_algorithm == dnskey_algorithm
| 0 | ||||||||||||||||||||||||
| 271 | hostkey_digest_type == dnskey_digest_type
| 0 | ||||||||||||||||||||||||
| 272 | if (hostkey_digest_len == dnskey_digest_len
| 0 | ||||||||||||||||||||||||
| 273 | timingsafe_bcmp(hostkey_digest, dnskey_digest,
| 0 | ||||||||||||||||||||||||
| 274 | hostkey_digest_len) == 0
| 0 | ||||||||||||||||||||||||
| 275 | * never executed: flags |= 0x00000002;*flags |= 0x00000002;never executed: *flags |= 0x00000002; | 0 | ||||||||||||||||||||||||
| 276 | } never executed: end of block | 0 | ||||||||||||||||||||||||
| 277 | free(dnskey_digest); | - | ||||||||||||||||||||||||
| 278 | } never executed: end of block | 0 | ||||||||||||||||||||||||
| 279 | - | |||||||||||||||||||||||||
| 280 | free(hostkey_digest); | - | ||||||||||||||||||||||||
| 281 | freerrset(fingerprints); | - | ||||||||||||||||||||||||
| 282 | - | |||||||||||||||||||||||||
| 283 | if (*
| 0 | ||||||||||||||||||||||||
| 284 | if (*
| 0 | ||||||||||||||||||||||||
| 285 | debug("matching host key fingerprint found in DNS"); never executed: debug("matching host key fingerprint found in DNS"); | 0 | ||||||||||||||||||||||||
| 286 | else | - | ||||||||||||||||||||||||
| 287 | debug("mismatching host key fingerprint found in DNS"); never executed: debug("mismatching host key fingerprint found in DNS"); | 0 | ||||||||||||||||||||||||
| 288 | else | - | ||||||||||||||||||||||||
| 289 | debug("no host key fingerprint found in DNS"); never executed: debug("no host key fingerprint found in DNS"); | 0 | ||||||||||||||||||||||||
| 290 | - | |||||||||||||||||||||||||
| 291 | return never executed: 0;return 0;never executed: return 0; | 0 | ||||||||||||||||||||||||
| 292 | } | - | ||||||||||||||||||||||||
| 293 | - | |||||||||||||||||||||||||
| 294 | - | |||||||||||||||||||||||||
| 295 | - | |||||||||||||||||||||||||
| 296 | - | |||||||||||||||||||||||||
| 297 | int | - | ||||||||||||||||||||||||
| 298 | export_dns_rr(const char *hostname, struct sshkey *key, FILE *f, int generic) | - | ||||||||||||||||||||||||
| 299 | { | - | ||||||||||||||||||||||||
| 300 | u_int8_t rdata_pubkey_algorithm = 0; | - | ||||||||||||||||||||||||
| 301 | u_int8_t rdata_digest_type = SSHFP_HASH_RESERVED; | - | ||||||||||||||||||||||||
| 302 | u_int8_t dtype; | - | ||||||||||||||||||||||||
| 303 | u_char *rdata_digest; | - | ||||||||||||||||||||||||
| 304 | size_t i, rdata_digest_len; | - | ||||||||||||||||||||||||
| 305 | int success = 0; | - | ||||||||||||||||||||||||
| 306 | - | |||||||||||||||||||||||||
| 307 | for (dtype = SSHFP_HASH_SHA1; dtype < SSHFP_HASH_MAX
| 0 | ||||||||||||||||||||||||
| 308 | rdata_digest_type = dtype; | - | ||||||||||||||||||||||||
| 309 | if (dns_read_key(&rdata_pubkey_algorithm, &rdata_digest_type,
| 0 | ||||||||||||||||||||||||
| 310 | &rdata_digest, &rdata_digest_len, key)
| 0 | ||||||||||||||||||||||||
| 311 | if (generic
| 0 | ||||||||||||||||||||||||
| 312 | fprintf(f, "%s IN TYPE%d \\# %zu %02x %02x ", | - | ||||||||||||||||||||||||
| 313 | hostname, 44, | - | ||||||||||||||||||||||||
| 314 | 2 + rdata_digest_len, | - | ||||||||||||||||||||||||
| 315 | rdata_pubkey_algorithm, rdata_digest_type); | - | ||||||||||||||||||||||||
| 316 | } never executed: else {end of block | 0 | ||||||||||||||||||||||||
| 317 | fprintf(f, "%s IN SSHFP %d %d ", hostname, | - | ||||||||||||||||||||||||
| 318 | rdata_pubkey_algorithm, rdata_digest_type); | - | ||||||||||||||||||||||||
| 319 | } never executed: end of block | 0 | ||||||||||||||||||||||||
| 320 | for (i = 0; i < rdata_digest_len
| 0 | ||||||||||||||||||||||||
| 321 | fprintf(f, "%02x", rdata_digest[i]); never executed: fprintf(f, "%02x", rdata_digest[i]); | 0 | ||||||||||||||||||||||||
| 322 | fprintf(f, "\n"); | - | ||||||||||||||||||||||||
| 323 | free(rdata_digest); | - | ||||||||||||||||||||||||
| 324 | success = 1; | - | ||||||||||||||||||||||||
| 325 | } never executed: end of block | 0 | ||||||||||||||||||||||||
| 326 | } never executed: end of block | 0 | ||||||||||||||||||||||||
| 327 | - | |||||||||||||||||||||||||
| 328 | - | |||||||||||||||||||||||||
| 329 | if (success == 0
| 0 | ||||||||||||||||||||||||
| 330 | error("%s: unsupported algorithm and/or digest_type", __func__); | - | ||||||||||||||||||||||||
| 331 | } never executed: end of block | 0 | ||||||||||||||||||||||||
| 332 | - | |||||||||||||||||||||||||
| 333 | return never executed: success;return success;never executed: return success; | 0 | ||||||||||||||||||||||||
| 334 | } | - | ||||||||||||||||||||||||
| Switch to Source code | Preprocessed file |