/* Allocate a file buffer */ SshFileBuffer ssh_file_buffer_allocate(void) { SshFileBuffer r; r = ssh_xmalloc(sizeof (*r)); ssh_file_buffer_init(r); return r; }
Boolean ssh2_find_pgp_secret_key_internal(SshUser uc, const char *fn, const char *name, const char *fingerprint, SshUInt32 id, unsigned char **blob, size_t *blob_len, char **comment) { struct stat st; SshUserFile uf; SshFileBuffer fb; SshPgpPacket pp; Boolean found; char *key_comment = NULL; if (ssh_userfile_stat(ssh_user_uid(uc), fn, &st) < 0) { SSH_DEBUG(2, ("file %s does not exist", fn)); return FALSE; } if ((uf = ssh_userfile_open(ssh_user_uid(uc), fn, O_RDONLY, 0)) == NULL) { SSH_DEBUG(2, ("could not open %s", fn)); return FALSE; } ssh_file_buffer_init(&fb); if (ssh_file_buffer_attach_userfile(&fb, uf) == FALSE) { SSH_DEBUG(2, ("could not attach %s userfile to file buffer", fn)); ssh_userfile_close(uf); ssh_file_buffer_uninit(&fb); return FALSE; } if (fingerprint != NULL) found = ssh_pgp_find_secret_key_with_fingerprint(&fb, fingerprint, &pp, (comment ? &key_comment : NULL)); else if (name != NULL) found = ssh_pgp_find_secret_key_with_name(&fb, name, TRUE, &pp, (comment ? &key_comment : NULL)); else found = ssh_pgp_find_secret_key_with_key_id(&fb, id, &pp, (comment ? &key_comment : NULL)); ssh_file_buffer_detach(&fb); ssh_file_buffer_uninit(&fb); ssh_userfile_close(uf); if (found == FALSE) { SSH_DEBUG(2, ("pgp library didn't find secret key")); return FALSE; } *blob = ssh_xmemdup(pp->data, pp->len); if (blob_len) *blob_len = pp->len; ssh_pgp_packet_free(pp); if (comment) *comment = key_comment; return TRUE; }