/* Clear the allocated file buffer. Detach the possibly attached file and zero the buffer. */ void ssh_file_buffer_clear(SshFileBuffer buf) { SSH_ASSERT(buf != NULL); ssh_file_buffer_detach(buf); ssh_buffer_clear(&(buf->buf)); return; }
Boolean ssh_file_buffer_attach_fileptr(SshFileBuffer buf, FILE *f) { SSH_ASSERT(buf != NULL); ssh_file_buffer_detach(buf); buf->f = f; buf->attached_as_fileptr = TRUE; return TRUE; }
/* Attach a file pointer with a read callback. */ Boolean ssh_file_buffer_attach_with_read_callback(SshFileBuffer buf, SshFileBufferReadCallback read_callback, void *read_context) { SSH_ASSERT(buf != NULL); SSH_ASSERT(read_callback != NULL_FNPTR); ssh_file_buffer_detach(buf); buf->read_callback = read_callback; buf->read_context = read_context; return TRUE; }
/* Attech a file to a file buffer. */ Boolean ssh_file_buffer_attach(SshFileBuffer buf, char *filename) { FILE *f; SSH_ASSERT(buf != NULL); ssh_file_buffer_detach(buf); f = fopen(filename, "rb"); if (f == NULL) return FALSE; buf->f = f; buf->attached_as_fileptr = FALSE; return TRUE; }
/* Read attached file so that buffer size exceeds argument bytes. */ Boolean ssh_file_buffer_expand(SshFileBuffer buf, size_t bytes) { size_t len, need_bytes; unsigned char *newdata; SSH_ASSERT(buf != NULL); len = ssh_buffer_len(&(buf->buf)); if (len >= bytes) return TRUE; if (!ssh_file_buffer_attached(buf)) return FALSE; need_bytes = bytes - len; bytes = ((need_bytes > SSH_FILE_BUFFER_MINIMUM_READ) ? need_bytes : SSH_FILE_BUFFER_MINIMUM_READ); ssh_buffer_append_space(&(buf->buf), &newdata, bytes); SSH_ASSERT(newdata != NULL); if (buf->read_callback == NULL_FNPTR) { SSH_DEBUG(5, ("attempting to read %d bytes with fread", (int)bytes)); len = fread(newdata, 1, bytes, buf->f); } else { SSH_DEBUG(5, ("attempting to read %d bytes with callback", (int)bytes)); len = buf->read_callback(newdata, bytes, buf->read_context); } SSH_ASSERT(len <= bytes); if (len < need_bytes) { ssh_buffer_consume_end(&(buf->buf), bytes - len); ssh_file_buffer_detach(buf); return FALSE; } else if (len < bytes) { ssh_buffer_consume_end(&(buf->buf), bytes - len); } return TRUE; }
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; }