diff options
author | Nick Mathewson <nickm@torproject.org> | 2004-04-01 22:10:33 +0000 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2004-04-01 22:10:33 +0000 |
commit | cbbd13f789d49182e3302fd401d9393e3fc276a4 (patch) | |
tree | eb31be788ac968e740afb78259b7995bec91bdde /src | |
parent | cc8dc4e34c4035a8e26d84204ac19973ab06c76d (diff) | |
download | tor-cbbd13f789d49182e3302fd401d9393e3fc276a4.tar tor-cbbd13f789d49182e3302fd401d9393e3fc276a4.tar.gz |
Add new functions to wrap digest and sign/checksig.
svn:r1436
Diffstat (limited to 'src')
-rw-r--r-- | src/common/crypto.c | 38 | ||||
-rw-r--r-- | src/common/crypto.h | 2 | ||||
-rw-r--r-- | src/or/test.c | 5 |
3 files changed, 45 insertions, 0 deletions
diff --git a/src/common/crypto.c b/src/common/crypto.c index 7a548a2d1..04859ed4b 100644 --- a/src/common/crypto.c +++ b/src/common/crypto.c @@ -656,6 +656,44 @@ int crypto_pk_private_sign(crypto_pk_env_t *env, unsigned char *from, int fromle } } +/* Return 0 if sig is a correct signature for SHA1(data). Else return -1. + */ +int crypto_pk_public_checksig_digest(crypto_pk_env_t *env, unsigned char *data, int datalen, unsigned char *sig, int siglen) +{ + char digest[CRYPTO_SHA1_DIGEST_LEN]; + char buf[1024]; + int r; + + assert(env && data && sig); + + if (crypto_SHA_digest(data,datalen,digest)<0) { + log_fn(LOG_WARN, "couldn't compute digest"); + return -1; + } + r = crypto_pk_public_checksig(env,sig,siglen,buf); + if (r != CRYPTO_SHA1_DIGEST_LEN) { + log_fn(LOG_WARN, "Invalid signature"); + return -1; + } + if (memcmp(buf, digest, CRYPTO_SHA1_DIGEST_LEN)) { + log_fn(LOG_WARN, "Signature mismatched with digest."); + return -1; + } + + return 0; +} + +/* Fill 'to' with a signature of SHA1(from). + */ +int crypto_pk_private_sign_digest(crypto_pk_env_t *env, unsigned char *from, int fromlen, unsigned char *to) +{ + char digest[CRYPTO_SHA1_DIGEST_LEN]; + if (crypto_SHA_digest(from,fromlen,digest)<0) + return 0; + return crypto_pk_private_sign(env,digest,CRYPTO_SHA1_DIGEST_LEN,to); +} + + /* Perform a hybrid (public/secret) encryption on 'fromlen' bytes of data * from 'from', with padding type 'padding', storing the results on 'to'. * diff --git a/src/common/crypto.h b/src/common/crypto.h index a09a4deda..1ecd5a3de 100644 --- a/src/common/crypto.h +++ b/src/common/crypto.h @@ -58,7 +58,9 @@ int crypto_pk_keysize(crypto_pk_env_t *env); int crypto_pk_public_encrypt(crypto_pk_env_t *env, unsigned char *from, int fromlen, unsigned char *to, int padding); int crypto_pk_private_decrypt(crypto_pk_env_t *env, unsigned char *from, int fromlen, unsigned char *to, int padding); int crypto_pk_private_sign(crypto_pk_env_t *env, unsigned char *from, int fromlen, unsigned char *to); +int crypto_pk_private_sign_digest(crypto_pk_env_t *env, unsigned char *from, int fromlen, unsigned char *to); int crypto_pk_public_checksig(crypto_pk_env_t *env, unsigned char *from, int fromlen, unsigned char *to); +int crypto_pk_public_checksig_digest(crypto_pk_env_t *env, unsigned char *data, int datalen, unsigned char *sig, int siglen); int crypto_pk_public_hybrid_encrypt(crypto_pk_env_t *env, unsigned char *from, int fromlen, unsigned char *to, int padding); diff --git a/src/or/test.c b/src/or/test.c index 18b7541f2..d09f7bd12 100644 --- a/src/or/test.c +++ b/src/or/test.c @@ -406,6 +406,11 @@ test_crypto() test_eq(128, crypto_pk_private_sign(pk1, data1, 10, data2)); test_eq(10, crypto_pk_public_checksig(pk1, data2, 128, data3)); test_streq(data3, "Ossifrage"); + /* Try signing digests. */ + test_eq(128, crypto_pk_private_sign_digest(pk1, data1, 10, data2)); + test_eq(20, crypto_pk_public_checksig(pk1, data2, 128, data3)); + test_eq(0, crypto_pk_public_checksig_digest(pk1, data1, 10, data2, 128)); + test_eq(-1, crypto_pk_public_checksig_digest(pk1, data1, 11, data2, 128)); /*XXXX test failed signing*/ /* Try encoding */ |