]> git.ipfire.org Git - thirdparty/nettle.git/commitdiff
New example program.
authorNiels Möller <nisse@lysator.liu.se>
Mon, 30 Sep 2002 20:40:01 +0000 (22:40 +0200)
committerNiels Möller <nisse@lysator.liu.se>
Mon, 30 Sep 2002 20:40:01 +0000 (22:40 +0200)
Rev: src/nettle/examples/rsa-sign.c:1.1

examples/rsa-sign.c [new file with mode: 0644]

diff --git a/examples/rsa-sign.c b/examples/rsa-sign.c
new file mode 100644 (file)
index 0000000..0b53e6e
--- /dev/null
@@ -0,0 +1,144 @@
+/* rsa-sign.c
+ *
+ */
+
+/* nettle, low-level cryptographics library
+ *
+ * Copyright (C) 2002 Niels Möller
+ *  
+ * 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;
+}