Commit 9ae3c545 authored by Niels Möller's avatar Niels Möller

New files. Miscellaneous functions

used by the example programs.

Rev: src/nettle/examples/io.c:1.1
Rev: src/nettle/examples/io.h:1.1
parent 010935eb
/* io.c
*
* Miscellaneous functions used by the example programs.
*/
/* nettle, low-level cryptographics library
*
* Copyright (C) 2002 Niels Mller
*
* The nettle library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or (at your
* option) any later version.
*
* The nettle library is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
* License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with the nettle library; see the file COPYING.LIB. If not, write to
* the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
* MA 02111-1307, USA.
*/
#if HAVE_CONFIG_H
# include "config.h"
#endif /* HAVE_CONFIG_H */
#include "io.h"
#include <stdarg.h>
#include <stdlib.h>
#define RANDOM_DEVICE "/dev/urandom"
#define BUFSIZE 1000
int quiet_flag = 0;
void
werror(const char *format, ...)
{
if (!quiet_flag)
{
va_list args;
va_start(args, format);
vfprintf(stderr, format, args);
va_end(args);
}
}
#define MIN(a,b) (((a) < (b)) ? (a) : (b))
unsigned
read_file(const char *name, unsigned max_size, char **buffer)
{
unsigned size;
unsigned done;
FILE *f;
f = fopen(name, "rb");
if (!f)
return 0;
*buffer = NULL;
if (max_size && max_size < 100)
size = max_size;
else
size = 100;
for (size = 100, done = 0;
(!max_size || done < max_size) && !feof(f);
size *= 2)
{
char *p;
if (size > max_size)
size = max_size;
/* Space for terminating NUL */
p = realloc(*buffer, size + 1);
if (!p)
{
fail:
fclose(f);
free(*buffer);
*buffer = NULL;
return 0;
}
*buffer = p;
done += fread(buffer + done, 1, size - done, f);
if (ferror(f))
goto fail;
}
fclose(f);
/* NUL-terminate the data. */
(*buffer)[done] = '\0';
return done;
}
int
write_file(const char *name, unsigned size, const char *buffer)
{
FILE *f = fopen(name, "wb");
unsigned res;
if (!f)
return 0;
res = fwrite(buffer, 1, size, f);
if (res < size || ferror(f))
res = 0;
fclose(f);
return res > 0;
}
int
simple_random(struct yarrow256_ctx *ctx, const char *name)
{
unsigned length;
char *buffer;
if (name)
length = read_file(name, 0, &buffer);
else
length = read_file(RANDOM_DEVICE, 20, &buffer);
if (!length)
return 0;
yarrow256_seed(ctx, length, buffer);
return 1;
}
int
hash_file(const struct nettle_hash *hash, void *ctx, FILE *f)
{
for (;;)
{
char buffer[BUFSIZE];
size_t res = fread(buffer, 1, sizeof(buffer), f);
if (ferror(f))
return 0;
hash->update(ctx, res, buffer);
if (feof(f))
return 1;
}
}
#if WITH_PUBLIC_KEY
int
read_rsa_key(const char *name,
struct rsa_public_key *pub,
struct rsa_private_key *priv)
{
unsigned length;
char *buffer;
int res;
length = read_file(name, 0, &buffer);
if (!length)
return 0;
res = rsa_keypair_from_sexp(pub, priv, length, buffer);
free(buffer);
return res;
}
#endif /* WITH_PUBLIC_KEY */
/* io.c
*
* Miscellaneous functions used by the example programs.
*/
/* nettle, low-level cryptographics library
*
* Copyright (C) 2002 Niels Mller
*
* The nettle library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or (at your
* option) any later version.
*
* The nettle library is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
* License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with the nettle library; see the file COPYING.LIB. If not, write to
* the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
* MA 02111-1307, USA.
*/
#ifndef NETTLE_EXAMPLES_IO_H_INCLUDED
#define NETTLE_EXAMPLES_IO_H_INCLUDED
#include "nettle-meta.h"
#include "rsa.h"
#include "yarrow.h"
#include <stdio.h>
extern int quiet_flag;
void
werror(const char *format, ...)
#if __GNUC___
__attribute__((__format__ (__printf__,1, 2)))
#endif
;
/* If size is > 0, read at most that many bytes. If size == 0,
* read until EOF. Allocates the buffer dynamically. */
unsigned
read_file(const char *name, unsigned size, char **buffer);
int
write_file(const char *name, unsigned size, const char *buffer);
int
simple_random(struct yarrow256_ctx *ctx, const char *name);
int
hash_file(const struct nettle_hash *hash, void *ctx, FILE *f);
#if WITH_PUBLIC_KEY
int
read_rsa_key(const char *name,
struct rsa_public_key *pub,
struct rsa_private_key *priv);
#endif
#endif /* NETTLE_EXAMPLES_IO_H_INCLUDED */
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment