|
@@ -509,6 +509,56 @@ test_crypto_pk(void)
|
|
|
tor_free(encoded);
|
|
|
}
|
|
|
|
|
|
+static void
|
|
|
+test_crypto_pk_fingerprints(void *arg)
|
|
|
+{
|
|
|
+ crypto_pk_t *pk = NULL;
|
|
|
+ char encoded[512];
|
|
|
+ char d[DIGEST_LEN], d2[DIGEST_LEN];
|
|
|
+ char fingerprint[FINGERPRINT_LEN+1];
|
|
|
+ int n;
|
|
|
+ unsigned i;
|
|
|
+ char *mem_op_hex_tmp=NULL;
|
|
|
+
|
|
|
+ (void)arg;
|
|
|
+
|
|
|
+ pk = pk_generate(1);
|
|
|
+ tt_assert(pk);
|
|
|
+ n = crypto_pk_asn1_encode(pk, encoded, sizeof(encoded));
|
|
|
+ tt_int_op(n, >, 0);
|
|
|
+ tt_int_op(n, >, 128);
|
|
|
+ tt_int_op(n, <, 256);
|
|
|
+
|
|
|
+
|
|
|
+ crypto_digest(d, encoded, n);
|
|
|
+ tt_int_op(0, ==, crypto_pk_get_digest(pk, d2));
|
|
|
+ test_memeq(d, d2, DIGEST_LEN);
|
|
|
+
|
|
|
+
|
|
|
+ tt_int_op(0, ==, crypto_pk_get_fingerprint(pk, fingerprint, 0));
|
|
|
+ tt_int_op(strlen(fingerprint), ==, DIGEST_LEN * 2);
|
|
|
+ test_memeq_hex(d, fingerprint);
|
|
|
+
|
|
|
+
|
|
|
+ tt_int_op(0, ==, crypto_pk_get_fingerprint(pk, fingerprint, 1));
|
|
|
+ for (i = 4; i < strlen(fingerprint); i += 5) {
|
|
|
+ tt_int_op(fingerprint[i], ==, ' ');
|
|
|
+ }
|
|
|
+ tor_strstrip(fingerprint, " ");
|
|
|
+ tt_int_op(strlen(fingerprint), ==, DIGEST_LEN * 2);
|
|
|
+ test_memeq_hex(d, fingerprint);
|
|
|
+
|
|
|
+
|
|
|
+ crypto_digest(d2, d, sizeof(d));
|
|
|
+ tt_int_op(0, ==, crypto_pk_get_hashed_fingerprint(pk, fingerprint));
|
|
|
+ tt_int_op(strlen(fingerprint), ==, DIGEST_LEN * 2);
|
|
|
+ test_memeq_hex(d2, fingerprint);
|
|
|
+
|
|
|
+ done:
|
|
|
+ crypto_pk_free(pk);
|
|
|
+ tor_free(mem_op_hex_tmp);
|
|
|
+}
|
|
|
+
|
|
|
|
|
|
static void
|
|
|
test_crypto_digests(void)
|
|
@@ -1234,6 +1284,7 @@ struct testcase_t crypto_tests[] = {
|
|
|
{ "aes_EVP", test_crypto_aes, TT_FORK, &pass_data, (void*)"evp" },
|
|
|
CRYPTO_LEGACY(sha),
|
|
|
CRYPTO_LEGACY(pk),
|
|
|
+ { "pk_fingerprints", test_crypto_pk_fingerprints, TT_FORK, NULL, NULL },
|
|
|
CRYPTO_LEGACY(digests),
|
|
|
CRYPTO_LEGACY(dh),
|
|
|
CRYPTO_LEGACY(s2k),
|