summaryrefslogtreecommitdiff
path: root/rsa-compat.c
diff options
context:
space:
mode:
authorNiels Möller <nisse@lysator.liu.se>2001-10-30 20:36:35 +0100
committerNiels Möller <nisse@lysator.liu.se>2001-10-30 20:36:35 +0100
commit776b32935770087c3e7055332faf6ed3209ef718 (patch)
tree2290f60329886e6d0f1a8ca60d89b7b02461dc54 /rsa-compat.c
parent336fc90c19039f5ccd818fc9fccd5b1163a2e45a (diff)
downloadnettle-776b32935770087c3e7055332faf6ed3209ef718.tar.gz
New file, implementing RSA ref signature and
verification functions. Rev: src/nettle/rsa-compat.c:1.1
Diffstat (limited to 'rsa-compat.c')
-rw-r--r--rsa-compat.c140
1 files changed, 140 insertions, 0 deletions
diff --git a/rsa-compat.c b/rsa-compat.c
new file mode 100644
index 00000000..eaec3dbb
--- /dev/null
+++ b/rsa-compat.c
@@ -0,0 +1,140 @@
+/* rsa-compat.c
+ *
+ * The RSA publickey algorithm, RSAREF compatible interface.
+ */
+
+/* nettle, low-level cryptographics library
+ *
+ * Copyright (C) 2001 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.
+ */
+
+#include "rsa-compat.h"
+
+#include "md5.h"
+
+int
+R_SignInit(R_SIGNATURE_CTX *ctx,
+ int digestAlgorithm)
+{
+ if (digestAlgorithm != DA_MD5)
+ return RE_DIGEST_ALGORITHM;
+
+ md5_init(&ctx->hash);
+
+ return 0;
+}
+
+int
+R_SignUpdate(R_SIGNATURE_CTX *ctx,
+ const uint8_t *data,
+ /* Length is an unsigned char according to rsaref.txt,
+ * but that must be a typo. */
+ unsigned length)
+{
+ md5_update(&ctx->hash, length, data);
+
+ return RE_SUCCESS;
+}
+
+int
+R_SignFinal(R_SIGNATURE_CTX *ctx,
+ uint8_t *signature,
+ unsigned *length,
+ R_RSA_PRIVATE_KEY *key)
+{
+ struct rsa_private_key k;
+ int res;
+
+ nettle_mpz_init_set_str_256(k.pub.n,
+ MAX_RSA_MODULUS_LEN, key->modulus);
+ nettle_mpz_init_set_str_256(k.pub.e,
+ MAX_RSA_MODULUS_LEN, key->publicExponent);
+ nettle_mpz_init_set_str_256(k.p,
+ MAX_RSA_MODULUS_LEN, key->prime[0]);
+ nettle_mpz_init_set_str_256(k.q,
+ MAX_RSA_MODULUS_LEN, key->prime[1]);
+ nettle_mpz_init_set_str_256(k.a,
+ MAX_RSA_MODULUS_LEN, key->primeExponent[0]);
+ nettle_mpz_init_set_str_256(k.b,
+ MAX_RSA_MODULUS_LEN, key->primeExponent[1]);
+ nettle_mpz_init_set_str_256(k.c,
+ MAX_RSA_MODULUS_LEN, key->coefficient);
+
+ if (rsa_init_private_key(&k) && (k.size <= MAX_RSA_MODULUS_LEN))
+ {
+ *length = k->size;
+ rsa_md5_sign(&key, &ctx->hash, signature);
+ res = RE_SUCCESS;
+ }
+ else
+ res = RE_PRIVATE_KEY;
+
+ mpz_clear(k.pub.n);
+ mpz_clear(k.pub.e);
+ mpz_clear(k.p);
+ mpz_clear(k.q);
+ mpz_clear(k.a);
+ mpz_clear(k.b);
+ mpz_clear(k.c);
+
+ return res;
+}
+
+int
+R_VerifyInit(R_SIGNATURE_CTX *ctx,
+ int digestAlgorithm)
+{
+ return R_SignInit(ctx, digestAlgorithm);
+}
+
+int
+R_VerifyUpdate(R_SIGNATURE_CTX *ctx,
+ const uint8_t *data,
+ /* Length is an unsigned char according to rsaref.txt,
+ * but that must be a typo. */
+ unsigned length)
+{
+ return R_SignUpdate(ctx, data, length);
+}
+
+int
+R_VerifyFinal(R_SIGNATURE_CTX *ctx,
+ uint8_t *signature,
+ unsigned length,
+ R_RSA_PUBLIC_KEY *key)
+{
+ struct rsa_public_key k;
+ int res;
+
+ nettle_mpz_init_set_str_256(k.n,
+ MAX_RSA_MODULUS_LEN, key->modulus);
+ nettle_mpz_init_set_str_256(k.e,
+ MAX_RSA_MODULUS_LEN, key->publicExponent);
+
+ if (rsa_init_private_key(&k) && (k.size == length))
+ res = rsa_md5_verify(&k, &ctx->hash, signature)
+ ? RE_SUCCESS : RE_SIGNATURE;
+ else
+ res = RE_PUBLIC_KEY;
+
+ mpz_clear(k.n);
+ mpz_clear(k.e);
+
+ return res;
+}
+