version 1.226, 2013/04/19 01:01:00 |
version 1.230, 2013/07/20 01:44:37 |
|
|
RP_ALLOW_STDIN); |
RP_ALLOW_STDIN); |
prv = key_load_private(filename, pass, NULL); |
prv = key_load_private(filename, pass, NULL); |
memset(pass, 0, strlen(pass)); |
memset(pass, 0, strlen(pass)); |
xfree(pass); |
free(pass); |
} |
} |
return prv; |
return prv; |
} |
} |
|
|
dump_base64(stdout, blob, len); |
dump_base64(stdout, blob, len); |
fprintf(stdout, "%s\n", SSH_COM_PUBLIC_END); |
fprintf(stdout, "%s\n", SSH_COM_PUBLIC_END); |
key_free(k); |
key_free(k); |
xfree(blob); |
free(blob); |
exit(0); |
exit(0); |
} |
} |
|
|
|
|
debug("ignore (%d %d %d %d)", i1, i2, i3, i4); |
debug("ignore (%d %d %d %d)", i1, i2, i3, i4); |
if (strcmp(cipher, "none") != 0) { |
if (strcmp(cipher, "none") != 0) { |
error("unsupported cipher %s", cipher); |
error("unsupported cipher %s", cipher); |
xfree(cipher); |
free(cipher); |
buffer_free(&b); |
buffer_free(&b); |
xfree(type); |
free(type); |
return NULL; |
return NULL; |
} |
} |
xfree(cipher); |
free(cipher); |
|
|
if (strstr(type, "dsa")) { |
if (strstr(type, "dsa")) { |
ktype = KEY_DSA; |
ktype = KEY_DSA; |
|
|
ktype = KEY_RSA; |
ktype = KEY_RSA; |
} else { |
} else { |
buffer_free(&b); |
buffer_free(&b); |
xfree(type); |
free(type); |
return NULL; |
return NULL; |
} |
} |
key = key_new_private(ktype); |
key = key_new_private(ktype); |
xfree(type); |
free(type); |
|
|
switch (key->type) { |
switch (key->type) { |
case KEY_DSA: |
case KEY_DSA: |
|
|
/* try the key */ |
/* try the key */ |
key_sign(key, &sig, &slen, data, sizeof(data)); |
key_sign(key, &sig, &slen, data, sizeof(data)); |
key_verify(key, sig, slen, data, sizeof(data)); |
key_verify(key, sig, slen, data, sizeof(data)); |
xfree(sig); |
free(sig); |
return key; |
return key; |
} |
} |
|
|
|
|
fatal("%s: %s: %s", __progname, identity_file, strerror(errno)); |
fatal("%s: %s: %s", __progname, identity_file, strerror(errno)); |
encoded[0] = '\0'; |
encoded[0] = '\0'; |
while ((blen = get_line(fp, line, sizeof(line))) != -1) { |
while ((blen = get_line(fp, line, sizeof(line))) != -1) { |
if (line[blen - 1] == '\\') |
if (blen > 0 && line[blen - 1] == '\\') |
escaped++; |
escaped++; |
if (strncmp(line, "----", 4) == 0 || |
if (strncmp(line, "----", 4) == 0 || |
strstr(line, ": ") != NULL) { |
strstr(line, ": ") != NULL) { |
|
|
fp, key_type(keys[i])); |
fp, key_type(keys[i])); |
if (log_level >= SYSLOG_LEVEL_VERBOSE) |
if (log_level >= SYSLOG_LEVEL_VERBOSE) |
printf("%s\n", ra); |
printf("%s\n", ra); |
xfree(ra); |
free(ra); |
xfree(fp); |
free(fp); |
} else { |
} else { |
key_write(keys[i], stdout); |
key_write(keys[i], stdout); |
fprintf(stdout, "\n"); |
fprintf(stdout, "\n"); |
} |
} |
key_free(keys[i]); |
key_free(keys[i]); |
} |
} |
xfree(keys); |
free(keys); |
pkcs11_terminate(); |
pkcs11_terminate(); |
exit(0); |
exit(0); |
#else |
#else |
|
|
if (log_level >= SYSLOG_LEVEL_VERBOSE) |
if (log_level >= SYSLOG_LEVEL_VERBOSE) |
printf("%s\n", ra); |
printf("%s\n", ra); |
key_free(public); |
key_free(public); |
xfree(comment); |
free(comment); |
xfree(ra); |
free(ra); |
xfree(fp); |
free(fp); |
exit(0); |
exit(0); |
} |
} |
if (comment) { |
if (comment) { |
xfree(comment); |
free(comment); |
comment = NULL; |
comment = NULL; |
} |
} |
|
|
|
|
comment ? comment : "no comment", key_type(public)); |
comment ? comment : "no comment", key_type(public)); |
if (log_level >= SYSLOG_LEVEL_VERBOSE) |
if (log_level >= SYSLOG_LEVEL_VERBOSE) |
printf("%s\n", ra); |
printf("%s\n", ra); |
xfree(ra); |
free(ra); |
xfree(fp); |
free(fp); |
key_free(public); |
key_free(public); |
invalid = 0; |
invalid = 0; |
} |
} |
|
|
key_type(public)); |
key_type(public)); |
if (log_level >= SYSLOG_LEVEL_VERBOSE) |
if (log_level >= SYSLOG_LEVEL_VERBOSE) |
printf("%s\n", ra); |
printf("%s\n", ra); |
xfree(ra); |
free(ra); |
xfree(fp); |
free(fp); |
} else { |
} else { |
if (hash && (name = host_hash(name, NULL, 0)) == NULL) |
if (hash && (name = host_hash(name, NULL, 0)) == NULL) |
fatal("hash_host failed"); |
fatal("hash_host failed"); |
|
|
if (strlcpy(identity_file, cp, sizeof(identity_file)) >= |
if (strlcpy(identity_file, cp, sizeof(identity_file)) >= |
sizeof(identity_file)) |
sizeof(identity_file)) |
fatal("Specified known hosts path too long"); |
fatal("Specified known hosts path too long"); |
xfree(cp); |
free(cp); |
have_identity = 1; |
have_identity = 1; |
} |
} |
if ((in = fopen(identity_file, "r")) == NULL) |
if ((in = fopen(identity_file, "r")) == NULL) |
|
|
private = key_load_private(identity_file, old_passphrase, |
private = key_load_private(identity_file, old_passphrase, |
&comment); |
&comment); |
memset(old_passphrase, 0, strlen(old_passphrase)); |
memset(old_passphrase, 0, strlen(old_passphrase)); |
xfree(old_passphrase); |
free(old_passphrase); |
if (private == NULL) { |
if (private == NULL) { |
printf("Bad passphrase.\n"); |
printf("Bad passphrase.\n"); |
exit(1); |
exit(1); |
|
|
if (strcmp(passphrase1, passphrase2) != 0) { |
if (strcmp(passphrase1, passphrase2) != 0) { |
memset(passphrase1, 0, strlen(passphrase1)); |
memset(passphrase1, 0, strlen(passphrase1)); |
memset(passphrase2, 0, strlen(passphrase2)); |
memset(passphrase2, 0, strlen(passphrase2)); |
xfree(passphrase1); |
free(passphrase1); |
xfree(passphrase2); |
free(passphrase2); |
printf("Pass phrases do not match. Try again.\n"); |
printf("Pass phrases do not match. Try again.\n"); |
exit(1); |
exit(1); |
} |
} |
/* Destroy the other copy. */ |
/* Destroy the other copy. */ |
memset(passphrase2, 0, strlen(passphrase2)); |
memset(passphrase2, 0, strlen(passphrase2)); |
xfree(passphrase2); |
free(passphrase2); |
} |
} |
|
|
/* Save the file using the new passphrase. */ |
/* Save the file using the new passphrase. */ |
if (!key_save_private(private, identity_file, passphrase1, comment)) { |
if (!key_save_private(private, identity_file, passphrase1, comment)) { |
printf("Saving the key failed: %s.\n", identity_file); |
printf("Saving the key failed: %s.\n", identity_file); |
memset(passphrase1, 0, strlen(passphrase1)); |
memset(passphrase1, 0, strlen(passphrase1)); |
xfree(passphrase1); |
free(passphrase1); |
key_free(private); |
key_free(private); |
xfree(comment); |
free(comment); |
exit(1); |
exit(1); |
} |
} |
/* Destroy the passphrase and the copy of the key in memory. */ |
/* Destroy the passphrase and the copy of the key in memory. */ |
memset(passphrase1, 0, strlen(passphrase1)); |
memset(passphrase1, 0, strlen(passphrase1)); |
xfree(passphrase1); |
free(passphrase1); |
key_free(private); /* Destroys contents */ |
key_free(private); /* Destroys contents */ |
xfree(comment); |
free(comment); |
|
|
printf("Your identification has been saved with the new passphrase.\n"); |
printf("Your identification has been saved with the new passphrase.\n"); |
exit(0); |
exit(0); |
|
|
struct stat st; |
struct stat st; |
|
|
if (fname == NULL) |
if (fname == NULL) |
ask_filename(pw, "Enter file in which the key is"); |
fatal("%s: no filename", __func__); |
if (stat(fname, &st) < 0) { |
if (stat(fname, &st) < 0) { |
if (errno == ENOENT) |
if (errno == ENOENT) |
return 0; |
return 0; |
|
|
if (public != NULL) { |
if (public != NULL) { |
export_dns_rr(hname, public, stdout, print_generic); |
export_dns_rr(hname, public, stdout, print_generic); |
key_free(public); |
key_free(public); |
xfree(comment); |
free(comment); |
return 1; |
return 1; |
} |
} |
if (comment) |
if (comment) |
xfree(comment); |
free(comment); |
|
|
printf("failed to read v2 public key from %s.\n", fname); |
printf("failed to read v2 public key from %s.\n", fname); |
exit(1); |
exit(1); |
|
|
private = key_load_private(identity_file, passphrase, &comment); |
private = key_load_private(identity_file, passphrase, &comment); |
if (private == NULL) { |
if (private == NULL) { |
memset(passphrase, 0, strlen(passphrase)); |
memset(passphrase, 0, strlen(passphrase)); |
xfree(passphrase); |
free(passphrase); |
printf("Bad passphrase.\n"); |
printf("Bad passphrase.\n"); |
exit(1); |
exit(1); |
} |
} |
|
|
if (!key_save_private(private, identity_file, passphrase, new_comment)) { |
if (!key_save_private(private, identity_file, passphrase, new_comment)) { |
printf("Saving the key failed: %s.\n", identity_file); |
printf("Saving the key failed: %s.\n", identity_file); |
memset(passphrase, 0, strlen(passphrase)); |
memset(passphrase, 0, strlen(passphrase)); |
xfree(passphrase); |
free(passphrase); |
key_free(private); |
key_free(private); |
xfree(comment); |
free(comment); |
exit(1); |
exit(1); |
} |
} |
memset(passphrase, 0, strlen(passphrase)); |
memset(passphrase, 0, strlen(passphrase)); |
xfree(passphrase); |
free(passphrase); |
public = key_from_private(private); |
public = key_from_private(private); |
key_free(private); |
key_free(private); |
|
|
|
|
fprintf(f, " %s\n", new_comment); |
fprintf(f, " %s\n", new_comment); |
fclose(f); |
fclose(f); |
|
|
xfree(comment); |
free(comment); |
|
|
printf("The comment in your key file has been changed.\n"); |
printf("The comment in your key file has been changed.\n"); |
exit(0); |
exit(0); |
|
|
} |
} |
key_free(keys[i]); |
key_free(keys[i]); |
} |
} |
xfree(keys); |
free(keys); |
key_free(public); |
key_free(public); |
return private; |
return private; |
#else |
#else |
|
|
fatal("No PKCS#11 key matching %s found", ca_key_path); |
fatal("No PKCS#11 key matching %s found", ca_key_path); |
} else if ((ca = load_identity(tmp)) == NULL) |
} else if ((ca = load_identity(tmp)) == NULL) |
fatal("Couldn't load CA key \"%s\"", tmp); |
fatal("Couldn't load CA key \"%s\"", tmp); |
xfree(tmp); |
free(tmp); |
|
|
for (i = 0; i < argc; i++) { |
for (i = 0; i < argc; i++) { |
/* Split list of principals */ |
/* Split list of principals */ |
|
|
if (*(plist[n] = xstrdup(cp)) == '\0') |
if (*(plist[n] = xstrdup(cp)) == '\0') |
fatal("Empty principal name"); |
fatal("Empty principal name"); |
} |
} |
xfree(otmp); |
free(otmp); |
} |
} |
|
|
tmp = tilde_expand_filename(argv[i], pw->pw_uid); |
tmp = tilde_expand_filename(argv[i], pw->pw_uid); |
|
|
if ((cp = strrchr(tmp, '.')) != NULL && strcmp(cp, ".pub") == 0) |
if ((cp = strrchr(tmp, '.')) != NULL && strcmp(cp, ".pub") == 0) |
*cp = '\0'; |
*cp = '\0'; |
xasprintf(&out, "%s-cert.pub", tmp); |
xasprintf(&out, "%s-cert.pub", tmp); |
xfree(tmp); |
free(tmp); |
|
|
if ((fd = open(out, O_WRONLY|O_CREAT|O_TRUNC, 0644)) == -1) |
if ((fd = open(out, O_WRONLY|O_CREAT|O_TRUNC, 0644)) == -1) |
fatal("Could not open \"%s\" for writing: %s", out, |
fatal("Could not open \"%s\" for writing: %s", out, |
|
|
} |
} |
|
|
key_free(public); |
key_free(public); |
xfree(out); |
free(out); |
} |
} |
pkcs11_terminate(); |
pkcs11_terminate(); |
exit(0); |
exit(0); |
|
|
|
|
if (cert_valid_to <= cert_valid_from) |
if (cert_valid_to <= cert_valid_from) |
fatal("Empty certificate validity interval"); |
fatal("Empty certificate validity interval"); |
xfree(from); |
free(from); |
} |
} |
|
|
static void |
static void |
|
|
static void |
static void |
show_options(const Buffer *optbuf, int v00, int in_critical) |
show_options(const Buffer *optbuf, int v00, int in_critical) |
{ |
{ |
u_char *name, *data; |
char *name; |
|
u_char *data; |
u_int dlen; |
u_int dlen; |
Buffer options, option; |
Buffer options, option; |
|
|
|
|
strcmp(name, "source-address") == 0)) { |
strcmp(name, "source-address") == 0)) { |
data = buffer_get_string(&option, NULL); |
data = buffer_get_string(&option, NULL); |
printf(" %s\n", data); |
printf(" %s\n", data); |
xfree(data); |
free(data); |
} else { |
} else { |
printf(" UNKNOWN OPTION (len %u)\n", |
printf(" UNKNOWN OPTION (len %u)\n", |
buffer_len(&option)); |
buffer_len(&option)); |
buffer_clear(&option); |
buffer_clear(&option); |
} |
} |
xfree(name); |
free(name); |
if (buffer_len(&option) != 0) |
if (buffer_len(&option) != 0) |
fatal("Option corrupt: extra data at end"); |
fatal("Option corrupt: extra data at end"); |
} |
} |
|
|
tmp = tilde_expand_filename(ca_key_path, pw->pw_uid); |
tmp = tilde_expand_filename(ca_key_path, pw->pw_uid); |
if ((ca = key_load_public(tmp, NULL)) == NULL) |
if ((ca = key_load_public(tmp, NULL)) == NULL) |
fatal("Cannot load CA public key %s", tmp); |
fatal("Cannot load CA public key %s", tmp); |
xfree(tmp); |
free(tmp); |
} |
} |
|
|
if (updating) |
if (updating) |
|
|
/* we need this for the home * directory. */ |
/* we need this for the home * directory. */ |
pw = getpwuid(getuid()); |
pw = getpwuid(getuid()); |
if (!pw) { |
if (!pw) { |
printf("You don't exist, go away!\n"); |
printf("No user exists for uid %lu\n", (u_long)getuid()); |
exit(1); |
exit(1); |
} |
} |
if (gethostname(hostname, sizeof(hostname)) < 0) { |
if (gethostname(hostname, sizeof(hostname)) < 0) { |
|
|
*/ |
*/ |
memset(passphrase1, 0, strlen(passphrase1)); |
memset(passphrase1, 0, strlen(passphrase1)); |
memset(passphrase2, 0, strlen(passphrase2)); |
memset(passphrase2, 0, strlen(passphrase2)); |
xfree(passphrase1); |
free(passphrase1); |
xfree(passphrase2); |
free(passphrase2); |
printf("Passphrases do not match. Try again.\n"); |
printf("Passphrases do not match. Try again.\n"); |
goto passphrase_again; |
goto passphrase_again; |
} |
} |
/* Clear the other copy of the passphrase. */ |
/* Clear the other copy of the passphrase. */ |
memset(passphrase2, 0, strlen(passphrase2)); |
memset(passphrase2, 0, strlen(passphrase2)); |
xfree(passphrase2); |
free(passphrase2); |
} |
} |
|
|
if (identity_comment) { |
if (identity_comment) { |
|
|
if (!key_save_private(private, identity_file, passphrase1, comment)) { |
if (!key_save_private(private, identity_file, passphrase1, comment)) { |
printf("Saving the key failed: %s.\n", identity_file); |
printf("Saving the key failed: %s.\n", identity_file); |
memset(passphrase1, 0, strlen(passphrase1)); |
memset(passphrase1, 0, strlen(passphrase1)); |
xfree(passphrase1); |
free(passphrase1); |
exit(1); |
exit(1); |
} |
} |
/* Clear the passphrase. */ |
/* Clear the passphrase. */ |
memset(passphrase1, 0, strlen(passphrase1)); |
memset(passphrase1, 0, strlen(passphrase1)); |
xfree(passphrase1); |
free(passphrase1); |
|
|
/* Clear the private key and the random number generator. */ |
/* Clear the private key and the random number generator. */ |
key_free(private); |
key_free(private); |
|
|
printf("%s %s\n", fp, comment); |
printf("%s %s\n", fp, comment); |
printf("The key's randomart image is:\n"); |
printf("The key's randomart image is:\n"); |
printf("%s\n", ra); |
printf("%s\n", ra); |
xfree(ra); |
free(ra); |
xfree(fp); |
free(fp); |
} |
} |
|
|
key_free(public); |
key_free(public); |