Exemplo n.º 1
0
/* 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;
}
Exemplo n.º 2
0
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;
}
Exemplo n.º 3
0
/* 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;
}
Exemplo n.º 4
0
/* 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;
}
Exemplo n.º 5
0
/* 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;
}
Exemplo n.º 6
0
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;
}