Commit 29beea19 authored by Niels Möller's avatar Niels Möller

New example program.

Rev: src/nettle/examples/rsa-sign.c:1.1
parent 6ed22096
/* rsa-sign.c
*
*/
/* 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 */
#if !HAVE_LIBGMP
int
main(int argc, char **argv)
{
fprintf(stderr,
"You need to install GMP somewhere where Nettle can find it,\n"
"and recompile Nettle\n");
return EXIT_FAILURE;
}
#endif /* !HAVE_LIBGMP */
#include <errno.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include "rsa.h"
#define BUFSIZE 1000
static int
read_key(const char *name,
struct rsa_private_key *key)
{
uint8_t buffer[BUFSIZE];
unsigned done;
int fd = open(name, O_RDONLY);
if (fd < 0)
{
fprintf(stderr, "Failed to open `%s': %s\n",
name, strerror(errno));
return 0;
}
for (done = 0; done < sizeof(buffer) ;)
{
int res = read(fd, buffer, sizeof(buffer) - done);
if (!res)
break;
else if (res < 0 && errno == EINTR)
continue;
else if (res < 0)
{
fprintf(stderr, "Failed reading `%s': %s\n",
name, strerror(errno));
return 0;
}
else
done += res;
}
return rsa_keypair_from_sexp(NULL, key,
done, buffer);
}
int
main(int argc, char **argv)
{
struct rsa_private_key key;
struct sha1_ctx hash;
mpz_t s;
if (argc != 2)
{
fprintf(stderr, "Usage: rsa-sign PRIVATE-KEY < file\n");
return EXIT_FAILURE;
}
rsa_init_private_key(&key);
if (!read_key(argv[1], &key))
{
fprintf(stderr, "Invalid key\n");
return EXIT_FAILURE;
}
sha1_init(&hash);
for (;;)
{
uint8_t buffer[BUFSIZE];
int res = read(STDIN_FILENO, buffer, sizeof(buffer));
if (!res)
/* EOF */
break;
else if (res < 0 && errno == EINTR)
continue;
else if (res < 0)
{
fprintf(stderr, "Failed reading stdin: %s\n",
strerror(errno));
return 0;
}
else
sha1_update(&hash, res, buffer);
}
mpz_init(s);
rsa_sha1_sign(&key, &hash, s);
if (!mpz_out_str(stdout, 16, s))
{
fprintf(stderr, "Failed writing signature: %s\n",
strerror(errno));
return 0;
}
putchar('\n');
mpz_clear(s);
rsa_clear_private_key(&key);
return EXIT_SUCCESS;
}
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