From d71849350cd1b18b3e7858345d384bcf73e61cf0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20M=C3=B6ller?= <nisse@lysator.liu.se> Date: Wed, 26 Aug 1998 08:12:52 +0200 Subject: [PATCH] Added methods raw_sign(), raw_verify() and rsa_size(). Rev: lib/modules/Crypto/rsa.pike:1.14 --- lib/modules/Crypto/rsa.pike | 44 +++++++++++++++++++++++++++++-------- 1 file changed, 35 insertions(+), 9 deletions(-) diff --git a/lib/modules/Crypto/rsa.pike b/lib/modules/Crypto/rsa.pike index e3b649f597..fc1deea093 100644 --- a/lib/modules/Crypto/rsa.pike +++ b/lib/modules/Crypto/rsa.pike @@ -1,4 +1,4 @@ -/* $Id: rsa.pike,v 1.13 1997/11/30 11:58:43 nisse Exp $ +/* $Id: rsa.pike,v 1.14 1998/08/26 06:12:52 nisse Exp $ * * Follow the PKCS#1 standard for padding and encryption. */ @@ -46,10 +46,17 @@ bignum get_prime(int bits, function r) { int len = (bits + 7) / 8; int bit_to_set = 1 << ( (bits - 1) % 8); + + object p; + + do { + string s = r(len); + p = BIGNUM(sprintf("%c%s", (s[0] & (bit_to_set - 1)) + | bit_to_set, s[1..]), + 256)->next_prime(); + } while (p->size() > bits); - string s = r(len); - return BIGNUM(sprintf("%c%s", (s[0] & (bit_to_set - 1)) | bit_to_set, s[1..]), - 256)->next_prime(); + return p; } int query_blocksize() { return size - 3; } @@ -96,13 +103,26 @@ string rsa_unpad(bignum block, int type) return s[i+1..]; } +object raw_sign(string digest) +{ + return rsa_pad(digest, 1, 0)->powm(d, n); +} + +int raw_verify(string digest, object s) +{ + return s->powm(e, n) == rsa_pad(digest, 1, 0); +} + object sign(string message, program h, mixed|void r) { - return rsa_pad(Signature.build_digestinfo(message, h()), 1, r)->powm(d, n); + // FIXME: The r argument is ignored and should be removed + return raw_sign(Signature.build_digestinfo(message, h())); } int verify(string msg, program h, object sign) { + // FIXME: Use raw_verify() + // werror(sprintf("msg: '%s'\n", Crypto.string_to_hex(msg))); string s = Signature.build_digestinfo(msg, h()); // werror(sprintf("rsa: s = '%s'\n", s)); @@ -114,6 +134,7 @@ int verify(string msg, program h, object sign) string sha_sign(string message, mixed|void r) { + // FIXME: Use raw_sign() object hash = Crypto.sha(); string s; @@ -125,6 +146,8 @@ string sha_sign(string message, mixed|void r) int sha_verify(string message, string signature) { + // FIXME: Use raw_verify() + object hash = Crypto.sha(); string s; @@ -142,14 +165,15 @@ object generate_key(int bits, function|void r) if (bits < 128) throw( ({ "Crypto.rsa->generate_key: ridicously small key\n", backtrace() }) ); - bits /= 2; /* Size of each of the primes */ - + int s1 = bits / 2; /* Size of the first prime */ + int s2 = bits - s1; + string msg = "This is a valid RSA key pair\n"; do { - p = get_prime(bits, r); - q = get_prime(bits, r); + p = get_prime(s1, r); + q = get_prime(s2, r); bignum phi = Gmp.mpz(p-1)*Gmp.mpz(q-1); array gs; /* gcd(pub, phi), and pub^-1 mod phi */ @@ -201,3 +225,5 @@ string crypt_block(string s) { return (encrypt_mode ? encrypt(s) : decrypt(s)); } + +int rsa_size() { return n->size(); } -- GitLab