[tor-commits] [obfsproxy/master] Refactor crypt digest logic to reduce code duplication and overhead. Fix memory leaks in unittest_crypt.c and unittest.c.
nickm at torproject.org
nickm at torproject.org
Fri Sep 9 17:08:56 UTC 2011
commit fc56b8b449d6be99c47447eea1060e8c2b898dde
Author: Zack Weinberg <zackw at panix.com>
Date: Tue Jul 19 11:40:20 2011 -0700
Refactor crypt digest logic to reduce code duplication and overhead. Fix memory leaks in unittest_crypt.c and unittest.c.
---
src/crypt.c | 55 ++++++++------------------
src/test/unittest.c | 5 ++-
src/test/unittest_crypt.c | 96 ++++++++++++++++++++------------------------
3 files changed, 65 insertions(+), 91 deletions(-)
diff --git a/src/crypt.c b/src/crypt.c
index e338214..9019fc9 100644
--- a/src/crypt.c
+++ b/src/crypt.c
@@ -70,7 +70,13 @@ cleanup_crypto(void)
Digests
===== */
-#ifdef USE_OPENSSL_SHA256
+#ifndef USE_OPENSSL_SHA256
+#define SHA256_CTX sha256_state
+#define SHA256_Init(ctx) sha256_init(ctx)
+#define SHA256_Update(ctx, buf, len) sha256_process(ctx, buf, len)
+#define SHA256_Final(buf, ctx) sha256_done(ctx, buf)
+#endif
+
struct digest_t {
SHA256_CTX ctx;
};
@@ -102,44 +108,17 @@ digest_update(digest_t *d, const uchar *buf, size_t len)
size_t
digest_getdigest(digest_t *d, uchar *buf, size_t len)
{
- uchar tmp[SHA256_LENGTH];
- int n = 32;
- SHA256_Final(tmp, &d->ctx);
- if (len < 32)
- n = len;
- memcpy(buf, tmp, n);
- memset(tmp, 0, sizeof(tmp));
- return n;
-}
-#else
-struct digest_t {
- sha256_state ctx;
-};
-digest_t *
-digest_new(void)
-{
- digest_t *d = xmalloc(sizeof(digest_t));
- sha256_init(&d->ctx);
- return d;
-}
-void
-digest_update(digest_t *d, const uchar *buf, size_t len)
-{
- sha256_process(&d->ctx, buf, len);
-}
-size_t
-digest_getdigest(digest_t *d, uchar *buf, size_t len)
-{
- uchar tmp[SHA256_LENGTH];
- int n = 32;
- sha256_done(&d->ctx, tmp);
- if (len < 32)
- n = len;
- memcpy(buf, tmp, n);
- memset(tmp, 0, sizeof(tmp));
- return n;
+ if (len >= SHA256_LENGTH) {
+ SHA256_Final(buf, &d->ctx);
+ return SHA256_LENGTH;
+ } else {
+ uchar tmp[SHA256_LENGTH];
+ SHA256_Final(tmp, &d->ctx);
+ memcpy(buf, tmp, len);
+ memset(tmp, 0, SHA256_LENGTH);
+ return len;
+ }
}
-#endif
void
digest_free(digest_t *d)
diff --git a/src/test/unittest.c b/src/test/unittest.c
index 8974c87..f872550 100644
--- a/src/test/unittest.c
+++ b/src/test/unittest.c
@@ -21,6 +21,9 @@ struct testgroup_t groups[] = {
int
main(int argc, const char **argv)
{
+ int rv;
initialize_crypto();
- return tinytest_main(argc, argv, groups);
+ rv = tinytest_main(argc, argv, groups);
+ cleanup_crypto();
+ return rv;
}
diff --git a/src/test/unittest_crypt.c b/src/test/unittest_crypt.c
index aef4ead..112da20 100644
--- a/src/test/unittest_crypt.c
+++ b/src/test/unittest_crypt.c
@@ -12,63 +12,55 @@
static void
test_crypt_hashvec(void *data)
{
+ struct testvec
+ {
+ const char *input;
+ const char *output;
+ };
+ static const struct testvec testvecs[] = {
+ /* All test vectors taken from http://csrc.nist.gov/groups/STM/cavp/#03
+ Note: code below relies on there being no NUL bytes in any input. */
+ /* 0 bits */
+ { "",
+ "\xe3\xb0\xc4\x42\x98\xfc\x1c\x14\x9a\xfb\xf4\xc8\x99\x6f\xb9\x24"
+ "\x27\xae\x41\xe4\x64\x9b\x93\x4c\xa4\x95\x99\x1b\x78\x52\xb8\x55" },
+ /* 256 bits */
+ { "\x8c\xf5\x3d\x90\x07\x7d\xf9\xa0\x43\xbf\x8d\x10\xb4\x70\xb1\x44"
+ "\x78\x44\x11\xc9\x3a\x4d\x50\x45\x56\x83\x4d\xae\x3e\xa4\xa5\xbb",
+ "\x56\x05\x9e\x8c\xb3\xc2\x97\x8b\x19\x82\x08\xbf\x5c\xa1\xe1\xea"
+ "\x56\x59\xb7\x37\xa5\x06\x32\x4b\x7c\xec\x75\xb5\xeb\xaf\x05\x7d" },
+ /* 1304 bits */
+ { "\xeb\xac\xcc\x34\xd6\xd6\xd3\xd2\x1e\xd0\xad\x2b\xa7\xc0\x7c\x21"
+ "\xd2\x53\xc4\x81\x4f\x4a\xd8\x9d\x32\x36\x92\x37\x49\x7f\x47\xa1"
+ "\xad\xab\xfa\x23\x98\xdd\xd0\x9d\x76\x9c\xc4\x6d\x3f\xd6\x9c\x93"
+ "\x03\x25\x1c\x13\xc7\x50\x79\x9b\x8f\x15\x11\x66\xbc\x26\x58\x60"
+ "\x98\x71\x16\x8b\x30\xa4\xd0\xa1\x62\xf1\x83\xfb\x36\x0f\x99\xb1"
+ "\x72\x81\x15\x03\x68\x1a\x11\xf8\x13\xc1\x6a\x44\x62\x72\xba\x6f"
+ "\xd4\x85\x86\x34\x45\x33\xb9\x28\x08\x56\x51\x9c\x35\x70\x59\xc3"
+ "\x44\xef\x17\x18\xdb\xaf\x86\xfa\xe5\xc1\x07\x99\xe4\x6b\x53\x16"
+ "\x88\x6f\xb4\xe6\x80\x90\x75\x78\x90\x53\x96\x17\xe4\x03\xc5\x11"
+ "\xa4\xf7\x8a\x19\xc8\x18\xc2\xea\x2e\x9d\x4e\x2d\xe9\x19\x0c\x9d"
+ "\xdd\xb8\x06",
+ "\xc9\x07\x18\x04\x43\xde\xe3\xcb\xcc\xb4\xc3\x13\x28\xe6\x25\x15"
+ "\x85\x27\xa5\x93\xb8\x78\xde\x1b\x8e\x4b\xa3\x7f\x1d\x69\xfb\x66" },
+ { NULL, NULL }
+ };
+
digest_t *d;
uchar output[32];
-
- /* First SHA256 test vector:
- Test for '\x00' */
- d = digest_new();
- digest_update(d, (unsigned char*)"", 0);
- digest_getdigest(d, output, 32);
- tt_mem_op(output, ==,
- "\xe3\xb0\xc4\x42\x98\xfc\x1c\x14\x9a\xfb\xf4\xc8"
- "\x99\x6f\xb9\x24\x27\xae\x41\xe4\x64\x9b\x93\x4c"
- "\xa4\x95\x99\x1b\x78\x52\xb8\x55", 32);
-
- /* Second SHA256 test vector:
- Test for the 256-bit entry of:
- http://csrc.nist.gov/groups/STM/cavp/#03 */
- d = digest_new();
- digest_update(d,
- (unsigned char*)"\x8c\xf5\x3d\x90\x07\x7d\xf9\xa0\x43\xbf\x8d"
- "\x10\xb4\x70\xb1\x44\x78\x44\x11\xc9\x3a\x4d\x50\x45\x56\x83"
- "\x4d\xae\x3e\xa4\xa5\xbb", 32);
- digest_getdigest(d, output, 32);
- tt_mem_op(output, ==,
- "\x56\x05\x9e\x8c\xb3\xc2\x97\x8b\x19\x82\x08\xbf"
- "\x5c\xa1\xe1\xea\x56\x59\xb7\x37\xa5\x06\x32\x4b"
- "\x7c\xec\x75\xb5\xeb\xaf\x05\x7d", 32);
-
- /* Third SHA test vector:
- Test for the 1304-bit entry of:
- http://csrc.nist.gov/groups/STM/cavp/#03 */
- d = digest_new();
- digest_update(d,
- (unsigned char*)"\xeb\xac\xcc\x34\xd6\xd6\xd3\xd2\x1e\xd0\xad"
- "\x2b\xa7\xc0\x7c\x21\xd2\x53\xc4\x81\x4f\x4a\xd8\x9d\x32\x36"
- "\x92\x37\x49\x7f\x47\xa1\xad\xab\xfa\x23\x98\xdd\xd0\x9d\x76"
- "\x9c\xc4\x6d\x3f\xd6\x9c\x93\x03\x25\x1c\x13\xc7\x50\x79\x9b"
- "\x8f\x15\x11\x66\xbc\x26\x58\x60\x98\x71\x16\x8b\x30\xa4\xd0"
- "\xa1\x62\xf1\x83\xfb\x36\x0f\x99\xb1\x72\x81\x15\x03\x68\x1a"
- "\x11\xf8\x13\xc1\x6a\x44\x62\x72\xba\x6f\xd4\x85\x86\x34\x45"
- "\x33\xb9\x28\x08\x56\x51\x9c\x35\x70\x59\xc3\x44\xef\x17\x18"
- "\xdb\xaf\x86\xfa\xe5\xc1\x07\x99\xe4\x6b\x53\x16\x88\x6f\xb4"
- "\xe6\x80\x90\x75\x78\x90\x53\x96\x17\xe4\x03\xc5\x11\xa4\xf7"
- "\x8a\x19\xc8\x18\xc2\xea\x2e\x9d\x4e\x2d\xe9\x19\x0c\x9d\xdd"
- "\xb8\x06", 163);
- digest_getdigest(d, output, 32);
- tt_mem_op(output, ==,
- "\xc9\x07\x18\x04\x43\xde\xe3\xcb\xcc\xb4\xc3\x13"
- "\x28\xe6\x25\x15\x85\x27\xa5\x93\xb8\x78\xde\x1b"
- "\x8e\x4b\xa3\x7f\x1d\x69\xfb\x66", 32);
+ int i;
+ for (i = 0; testvecs[i].input; i++) {
+ d = digest_new();
+ digest_update(d, (unsigned char *) testvecs[i].input,
+ strlen(testvecs[i].input));
+ digest_getdigest(d, output, 32);
+ digest_free(d);
+ tt_mem_op(output, ==, testvecs[i].output, 32);
+ }
/* XXX Try doing init, update, update, output. */
- /* XXX add a base16-decode function so we can implement a tt_mem_op or
- something */
- end:
- if (d)
- digest_free(d);
+ end:;
}
static void
More information about the tor-commits
mailing list