void doit (void) { char *out; size_t i; for (i = 0; i < sizeof (nfkc) / sizeof (nfkc[0]); i++) { if (debug) printf ("NFKC entry %ld\n", i); out = stringprep_utf8_nfkc_normalize (nfkc[i].in, (ssize_t) strlen (nfkc[i].in)); if (out == NULL) { fail ("NFKC entry %ld failed fatally\n", i); continue; } if (debug) { uint32_t *t; size_t len; printf ("in:\n"); escapeprint (nfkc[i].in, strlen (nfkc[i].in)); hexprint (nfkc[i].in, strlen (nfkc[i].in)); binprint (nfkc[i].in, strlen (nfkc[i].in)); printf ("out:\n"); escapeprint (out, strlen (out)); hexprint (out, strlen (out)); binprint (out, strlen (out)); t = stringprep_utf8_to_ucs4 (out, -1, &len); if (t) { ucs4print (t, len); free (t); } printf ("expected out:\n"); escapeprint (nfkc[i].out, strlen (nfkc[i].out)); hexprint (nfkc[i].out, strlen (nfkc[i].out)); binprint (nfkc[i].out, strlen (nfkc[i].out)); } if (strlen (nfkc[i].out) != strlen (out) || memcmp (nfkc[i].out, out, strlen (out)) != 0) { fail ("NFKC entry %ld failed\n", i); if (debug) printf ("ERROR\n"); } else if (debug) printf ("OK\n"); free (out); } }
void doit (void) { char *p; int rc; size_t i; if (!stringprep_check_version (STRINGPREP_VERSION)) fail ("stringprep_check_version() failed\n"); for (i = 0; i < sizeof (strprep) / sizeof (strprep[0]); i++) { if (debug) printf ("STRINGPREP entry %d\n", i); if (debug) { printf ("flags: %d\n", strprep[i].flags); printf ("in: "); escapeprint (strprep[i].in, strlen (strprep[i].in)); hexprint (strprep[i].in, strlen (strprep[i].in)); binprint (strprep[i].in, strlen (strprep[i].in)); } { uint32_t *l; char *x; l = stringprep_utf8_to_ucs4 (strprep[i].in, -1, NULL); x = stringprep_ucs4_to_utf8 (l, -1, NULL, NULL); free (l); if (strcmp (strprep[i].in, x) != 0) { fail ("bad UTF-8 in entry %d\n", i); if (debug) { puts ("expected:"); escapeprint (strprep[i].in, strlen (strprep[i].in)); hexprint (strprep[i].in, strlen (strprep[i].in)); puts ("computed:"); escapeprint (x, strlen (x)); hexprint (x, strlen (x)); } } free (x); } rc = stringprep_profile (strprep[i].in, &p, strprep[i].profile ? strprep[i].profile : "Nameprep", strprep[i].flags); if (rc != strprep[i].rc) { fail ("stringprep() entry %d failed: %d\n", i, rc); if (debug) printf ("FATAL\n"); if (rc == STRINGPREP_OK) free (p); continue; } if (debug && rc == STRINGPREP_OK) { printf ("out: "); escapeprint (p, strlen (p)); hexprint (p, strlen (p)); binprint (p, strlen (p)); printf ("expected out: "); escapeprint (strprep[i].out, strlen (strprep[i].out)); hexprint (strprep[i].out, strlen (strprep[i].out)); binprint (strprep[i].out, strlen (strprep[i].out)); } else if (debug) printf ("returned %d expected %d\n", rc, strprep[i].rc); if (rc == STRINGPREP_OK) { if (strlen (strprep[i].out) != strlen (p) || memcmp (strprep[i].out, p, strlen (p)) != 0) { fail ("stringprep() entry %d failed\n", i); if (debug) printf ("ERROR\n"); } else if (debug) printf ("OK\n\n"); free (p); } else if (debug) printf ("OK\n\n"); } #if 0 { char p[20]; memset (p, 0, 10); stringprep_unichar_to_utf8 (0x00DF, p); hexprint (p, strlen (p)); puts (""); } #endif }
void doit (void) { size_t i; char *out; int rc; for (i = 0; i < sizeof (idna) / sizeof (idna[0]); i++) { if (debug) printf ("IDNA2 entry %ld\n", i); if (debug) { uint32_t *p; size_t len; printf ("in: %s\n", idna[i].in); hexprint (idna[i].in, strlen (idna[i].in)); escapeprint (idna[i].in, strlen (idna[i].in)); p = stringprep_utf8_to_ucs4 (idna[i].in, -1, &len); ucs4print (p, len); free (p); } rc = idna_to_ascii_8z (idna[i].in, &out, IDNA_ALLOW_UNASSIGNED | IDNA_USE_STD3_ASCII_RULES); if (rc != IDNA_SUCCESS && strlen (idna[i].out) > 0) { fail ("IDNA2 entry %ld failed: %d\n", i, rc); continue; } if (debug && rc == IDNA_SUCCESS) { printf ("computed out: %s\n", out); printf ("expected out: %s\n", idna[i].out); } else if (debug) printf ("returned %d\n", rc); if (rc == IDNA_SUCCESS) { if (strlen (idna[i].out) != strlen (out) || strcasecmp (idna[i].out, out) != 0) { fail ("IDNA2 entry %ld failed\n", i); if (debug) printf ("ERROR\n"); } else if (debug) printf ("OK\n"); free (out); out = NULL; } else if (rc != IDNA_SUCCESS && strlen (idna[i].out) == 0 && debug) printf ("OK (fail)\n"); else if (debug) printf ("OK\n"); } }
void test (Shishi * handle) { Shishi_key *key, *key2; char out[BUFSIZ]; size_t i; int res; if (debug) shishi_cfg (handle, strdup ("verbose-crypto,verbose-crypto-noise")); for (i = 0; i < sizeof (drdk) / sizeof (drdk[0]); i++) { if (debug) printf ("DR entry %d\n", i); res = shishi_key_from_value (handle, drdk[i].type, drdk[i].key, &key); if (res == SHISHI_OK) res = shishi_dr (handle, key, drdk[i].usage, drdk[i].nusage, out, strlen (drdk[i].dr)); shishi_key_done (key); if (res != SHISHI_OK) { fail ("shishi_dr() entry %d failed (%s)\n", i, shishi_error (handle)); continue; } if (debug) { printf ("DR(%s, key, usage)\n", shishi_cipher_name (drdk[i].type)); printf ("key:\n"); escapeprint (drdk[i].key, strlen (drdk[i].key)); hexprint (drdk[i].key, strlen (drdk[i].key)); puts (""); binprint (drdk[i].key, strlen (drdk[i].key)); puts (""); printf ("usage:\n"); escapeprint (drdk[i].usage, drdk[i].nusage); hexprint (drdk[i].usage, drdk[i].nusage); puts (""); binprint (drdk[i].usage, drdk[i].nusage); puts (""); printf ("computed DR:\n"); escapeprint (out, strlen (drdk[i].dr)); hexprint (out, strlen (drdk[i].dr)); puts (""); binprint (out, strlen (drdk[i].dr)); puts (""); printf ("expected DR:\n"); escapeprint (drdk[i].dr, strlen (drdk[i].dr)); hexprint (drdk[i].dr, strlen (drdk[i].dr)); puts (""); binprint (drdk[i].dr, strlen (drdk[i].dr)); puts (""); } if (memcmp (drdk[i].dr, out, strlen (drdk[i].dr)) != 0) { fail ("shishi_dr() entry %d failed\n", i); if (debug) printf ("ERROR\n"); } else if (debug) success ("OK\n"); res = shishi_key_from_value (handle, drdk[i].type, drdk[i].key, &key); if (res == SHISHI_OK) res = shishi_key_from_value (handle, drdk[i].type, NULL, &key2); if (res == SHISHI_OK) res = shishi_dk (handle, key, drdk[i].usage, drdk[i].nusage, key2); shishi_key_done (key); if (res != SHISHI_OK) { fail ("shishi_dk() entry %d failed (%s)\n", i, shishi_error (handle)); continue; } if (debug) { printf ("DK(%s, key, usage)\n", shishi_cipher_name (drdk[i].type)); printf ("key:\n"); escapeprint (drdk[i].key, strlen (drdk[i].key)); hexprint (drdk[i].key, strlen (drdk[i].key)); puts (""); binprint (drdk[i].key, strlen (drdk[i].key)); puts (""); printf ("usage:\n"); escapeprint (drdk[i].usage, drdk[i].nusage); hexprint (drdk[i].usage, drdk[i].nusage); puts (""); binprint (drdk[i].usage, drdk[i].nusage); puts (""); printf ("computed DK:\n"); escapeprint (shishi_key_value (key2), shishi_key_length (key2)); hexprint (shishi_key_value (key2), shishi_key_length (key2)); puts (""); binprint (shishi_key_value (key2), shishi_key_length (key2)); puts (""); printf ("expected DK:\n"); escapeprint (drdk[i].dk, strlen (drdk[i].dk)); hexprint (drdk[i].dk, strlen (drdk[i].dk)); puts (""); binprint (drdk[i].dk, strlen (drdk[i].dk)); puts (""); } if (!(shishi_key_length (key2) == strlen (drdk[i].dk) && memcmp (drdk[i].dk, shishi_key_value (key2), strlen (drdk[i].dk)) == 0)) { fail ("shishi_dk() entry %d failed\n", i); if (debug) printf ("ERROR\n"); } else if (debug) success ("OK\n"); shishi_key_done (key2); } for (i = 0; i < sizeof (nfold) / sizeof (nfold[0]); i++) { if (debug) printf ("N-FOLD entry %d\n", i); res = shishi_n_fold (handle, nfold[i].in, strlen (nfold[i].in), out, nfold[i].n / 8); if (res != SHISHI_OK) { fail ("shishi_n_fold() entry %d failed (%s)\n", i, shishi_error (handle)); continue; } if (debug) { printf ("in:\n"); escapeprint (nfold[i].in, strlen (nfold[i].in)); hexprint (nfold[i].in, strlen (nfold[i].in)); puts (""); binprint (nfold[i].in, strlen (nfold[i].in)); puts (""); printf ("out:\n"); escapeprint (out, nfold[i].n / 8); hexprint (out, nfold[i].n / 8); puts (""); binprint (out, nfold[i].n / 8); puts (""); printf ("expected out:\n"); escapeprint (nfold[i].out, nfold[i].n / 8); hexprint (nfold[i].out, nfold[i].n / 8); puts (""); binprint (nfold[i].out, nfold[i].n / 8); puts (""); } if (memcmp (nfold[i].out, out, nfold[i].n / 8) != 0) { fail ("shishi_n_fold() entry %d failed\n", i); if (debug) printf ("ERROR\n"); } else if (debug) success ("OK\n"); } for (i = 0; i < sizeof (str2key) / sizeof (str2key[0]); i++) { int n_password = strlen (str2key[i].password); int saltlen = strlen (str2key[i].salt); int keylen = sizeof (key); const char *name = shishi_cipher_name (str2key[i].etype); if (debug) printf ("STRING-TO-KEY entry %d (key type %s)\n", i, name ? name : "NO NAME"); res = shishi_key_from_string (handle, str2key[i].etype, str2key[i].password, n_password, str2key[i].salt, saltlen, str2key[i].parameters, &key); if (res != SHISHI_OK) { fail ("shishi_string_to_key() entry %d failed (%s)\n", i, shishi_error (handle)); continue; } if (debug) { printf ("password:\n"); escapeprint (str2key[i].password, n_password); hexprint (str2key[i].password, n_password); puts (""); binprint (str2key[i].password, n_password); puts (""); printf ("salt:\n"); escapeprint (str2key[i].salt, saltlen); hexprint (str2key[i].salt, saltlen); puts (""); binprint (str2key[i].salt, saltlen); puts (""); printf ("computed key:\n"); escapeprint (shishi_key_value (key), shishi_key_length (key)); hexprint (shishi_key_value (key), shishi_key_length (key)); puts (""); binprint (shishi_key_value (key), shishi_key_length (key)); puts (""); printf ("expected key:\n"); escapeprint (str2key[i].key, strlen (str2key[i].key)); hexprint (str2key[i].key, strlen (str2key[i].key)); puts (""); binprint (str2key[i].key, strlen (str2key[i].key)); puts (""); } if (memcmp (str2key[i].key, shishi_key_value (key), keylen) != 0) { fail ("shishi_string_to_key() entry %d failed\n", i); if (debug) printf ("ERROR\n"); } else if (debug) success ("OK\n"); shishi_key_done (key); } for (i = 0; i < sizeof (pkcs5) / sizeof (pkcs5[0]); i++) { if (debug) printf ("PKCS5 entry %d\n", i); res = shishi_pbkdf2_sha1 (handle, pkcs5[i].password, strlen (pkcs5[i].password), pkcs5[i].salt, strlen (pkcs5[i].salt), pkcs5[i].iterations, pkcs5[i].dklen, out); if (res != SHISHI_OK) { fail ("PKCS5 entry %d failed fatally: %d\n", i, res); continue; } if (debug) { printf ("password:\n"); escapeprint (pkcs5[i].password, strlen (pkcs5[i].password)); hexprint (pkcs5[i].password, strlen (pkcs5[i].password)); puts (""); binprint (pkcs5[i].password, strlen (pkcs5[i].password)); puts (""); printf ("salt:\n"); escapeprint (pkcs5[i].salt, strlen (pkcs5[i].salt)); hexprint (pkcs5[i].salt, strlen (pkcs5[i].salt)); puts (""); binprint (pkcs5[i].salt, strlen (pkcs5[i].salt)); puts (""); printf ("computed key:\n"); escapeprint (out, pkcs5[i].dklen); hexprint (out, pkcs5[i].dklen); puts (""); binprint (out, pkcs5[i].dklen); puts (""); printf ("expected key:\n"); escapeprint (pkcs5[i].expected, pkcs5[i].dklen); hexprint (pkcs5[i].expected, pkcs5[i].dklen); puts (""); binprint (pkcs5[i].expected, pkcs5[i].dklen); puts (""); } if (memcmp (pkcs5[i].expected, out, pkcs5[i].dklen) != 0) { fail ("PKCS5 entry %d failed\n", i); if (debug) printf ("ERROR\n"); } else if (debug) success ("OK\n"); } }
void test (Shishi * handle) { Shishi_asn1 a; char *p, *buf, *buf2; int res; size_t n, m; int32_t t; uint32_t s; /* shishi_authenticator */ a = shishi_authenticator (handle); if (debug) printf ("shishi_authenticator () => `%p'.\n", a); if (a) success ("shishi_authenticator() OK\n"); else fail ("shishi_authenticator() failed\n"); if (debug) shishi_authenticator_print (handle, stdout, a); res = shishi_authenticator_remove_subkey (handle, a); if (res == SHISHI_OK) success ("shishi_authenticator_remove_subkey() OK\n"); else fail ("shishi_authenticator_remove_subkey() failed\n"); /* shishi_authenticator_seqnumber_get */ res = shishi_authenticator_seqnumber_get (handle, a, &s); if (res == SHISHI_OK) success ("shishi_authenticator_seqnumber_get() OK\n"); else fail ("shishi_authenticator_seqnumber_get() failed\n"); /* shishi_authenticator_seqnumber_set */ res = shishi_authenticator_seqnumber_set (handle, a, 42); if (res == SHISHI_OK) success ("shishi_authenticator_seqnumber_set() OK\n"); else fail ("shishi_authenticator_seqnumber_set() failed\n"); /* shishi_authenticator_seqnumber_get */ res = shishi_authenticator_seqnumber_get (handle, a, &s); if (res == SHISHI_OK && s == 42) success ("shishi_authenticator_seqnumber_get() OK\n"); else fail ("shishi_authenticator_seqnumber_get() failed\n"); /* shishi_authenticator_seqnumber_remove */ res = shishi_authenticator_seqnumber_remove (handle, a); if (res == SHISHI_OK) success ("shishi_authenticator_seqnumber_remove() OK\n"); else fail ("shishi_authenticator_seqnumber_remove() failed\n"); /* shishi_authenticator_set_crealm */ res = shishi_authenticator_set_crealm (handle, a, "foo"); if (res == SHISHI_OK) success ("shishi_authenticator_set_crealm() OK\n"); else fail ("shishi_authenticator_set_crealm() failed\n"); /* shishi_authenticator_client_set */ res = shishi_authenticator_client_set (handle, a, "foo/bar/baz"); if (res == SHISHI_OK) success ("shishi_authenticator_client_set() OK\n"); else fail ("shishi_authenticator_client_set() failed\n"); /* shishi_authenticator_client */ res = shishi_authenticator_client (handle, a, &buf, &n); if (debug) escapeprint (buf, n); if (res == SHISHI_OK && n == strlen ("foo/bar/baz") && memcmp (buf, "foo/bar/baz", n) == 0) success ("shishi_authenticator_client() OK\n"); else fail ("shishi_authenticator_client() failed\n"); if (res == SHISHI_OK) free (buf); /* shishi_authenticator_client_set */ res = shishi_authenticator_client_set (handle, a, "foo"); if (res == SHISHI_OK) success ("shishi_authenticator_client_set() OK\n"); else fail ("shishi_authenticator_client_set() failed\n"); /* shishi_authenticator_client */ res = shishi_authenticator_client (handle, a, &buf, &n); if (debug) escapeprint (buf, n); if (res == SHISHI_OK && n == strlen ("foo") && memcmp (buf, "foo", n) == 0) success ("shishi_authenticator_client() OK\n"); else fail ("shishi_authenticator_client() failed\n"); if (res == SHISHI_OK) free (buf); /* shishi_authenticator_set_crealm */ res = shishi_authenticator_set_crealm (handle, a, "bar"); if (res == SHISHI_OK) success ("shishi_authenticator_set_crealm() OK\n"); else fail ("shishi_authenticator_set_crealm() failed\n"); /* shishi_authenticator_clientrealm */ res = shishi_authenticator_clientrealm (handle, a, &buf, &n); if (debug) escapeprint (buf, n); if (res == SHISHI_OK && n == strlen ("foo@bar") && memcmp (buf, "foo@bar", n) == 0) success ("shishi_authenticator_clientrealm() OK\n"); else fail ("shishi_authenticator_clientrealm() failed\n"); if (res == SHISHI_OK) free (buf); /* shishi_authenticator_add_authorizationdata */ res = shishi_authenticator_add_authorizationdata (handle, a, 42, "baz", 3); if (res == SHISHI_OK) success ("shishi_authenticator_add_authorizationdata() OK\n"); else fail ("shishi_authenticator_add_authorizationdata() failed\n"); /* shishi_authenticator_authorizationdata */ res = shishi_authenticator_authorizationdata (handle, a, &t, &buf, &m, 1); if (debug) escapeprint (buf, m); if (res == SHISHI_OK && t == 42 && m == 3 && memcmp (buf, "baz", 3) == 0) success ("shishi_authenticator_authorizationdata() OK\n"); else fail ("shishi_authenticator_authorizationdata() failed\n"); if (res == SHISHI_OK) free (buf); /* shishi_authenticator_authorizationdata */ res = shishi_authenticator_authorizationdata (handle, a, &t, &buf, &m, 2); if (res == SHISHI_OK) free (buf); if (res == SHISHI_OUT_OF_RANGE) success ("shishi_authenticator_authorizationdata() OK\n"); else fail ("shishi_authenticator_authorizationdata() failed\n"); /* shishi_authenticator_remove_cksum */ res = shishi_authenticator_remove_cksum (handle, a); if (res == SHISHI_OK) success ("shishi_authenticator_remove_cksum() OK\n"); else fail ("shishi_authenticator_remove_cksum() failed\n"); /* shishi_asn1_to_der */ res = shishi_asn1_to_der (handle, a, &buf, &n); if (res == SHISHI_OK) success ("shishi_asn1_to_der() OK\n"); else n = 0, fail ("shishi_asn1_to_der() failed\n"); /* shishi_authenticator_to_file */ res = shishi_authenticator_to_file (handle, a, SHISHI_FILETYPE_TEXT, "authenticator.tmp"); if (res == SHISHI_OK) success ("shishi_authenticator_to_file() OK\n"); else fail ("shishi_authenticator_to_file() failed\n"); /* shishi_asn1_done */ shishi_asn1_done (handle, a); success ("shishi_asn1_done() OK\n"); a = NULL; /* shishi_authenticator_from_file */ res = shishi_authenticator_from_file (handle, &a, SHISHI_FILETYPE_TEXT, "authenticator.tmp"); if (res == SHISHI_OK) success ("shishi_authenticator_from_file() OK\n"); else fail ("shishi_authenticator_from_file() failed\n"); if (debug) { /* shishi_authenticator_print */ res = shishi_authenticator_print (handle, stdout, a); if (res == SHISHI_OK) success ("shishi_authenticator_print() OK\n"); else fail ("shishi_authenticator_print() failed\n"); } /* shishi_asn1_to_der */ res = shishi_asn1_to_der (handle, a, &buf2, &m); if (res == SHISHI_OK) success ("shishi_asn1_to_der() OK\n"); else n = 0, fail ("shishi_asn1_to_der() failed\n"); /* Compare DER encodings of authenticators */ if (n > 0 && m > 0 && n == m && memcmp (buf, buf2, n) == 0) success ("DER comparison OK\n"); else fail ("DER comparison failed\n"); free (buf); free (buf2); /* shishi_authenticator_cusec_set */ res = shishi_authenticator_cusec_set (handle, a, 4711); if (res == SHISHI_OK) success ("shishi_authenticator_cusec_set() OK\n"); else fail ("shishi_authenticator_cusec_set() failed\n"); /* shishi_authenticator_cusec_get */ res = shishi_authenticator_cusec_get (handle, a, &s); if (debug) printf ("shishi_authenticator_cusec_get () => `%d'.\n", t); if (res == SHISHI_OK && s == 4711) success ("shishi_authenticator_cusec_get() OK\n"); else fail ("shishi_authenticator_cusec_get() failed\n"); /* shishi_authenticator_ctime_set */ res = shishi_authenticator_ctime_set (handle, a, "19700101011831Z"); if (res == SHISHI_OK) success ("shishi_authenticator_ctime_set() OK\n"); else fail ("shishi_authenticator_ctime_set() failed\n"); /* shishi_authenticator_ctime */ res = shishi_authenticator_ctime (handle, a, &p); if (debug) escapeprint (p, strlen (p)); if (res == SHISHI_OK && memcmp (p, "19700101011831Z", 15) == 0) success ("shishi_authenticator_ctime() OK\n"); else fail ("shishi_authenticator_ctime() failed\n"); if (res == SHISHI_OK) free (p); /* shishi_asn1_to_der */ res = shishi_asn1_to_der (handle, a, &buf, &n); if (res == SHISHI_OK) success ("shishi_asn1_to_der() OK\n"); else n = 0, fail ("shishi_asn1_to_der() failed\n"); if (debug) { shishi_authenticator_print (handle, stdout, a); hexprint (buf, n); puts (""); hexprint (authenticator, sizeof (authenticator)); puts (""); } if (n == sizeof (authenticator) && n == AUTHENTICATOR_LEN && memcmp (authenticator, buf, n) == 0) success ("DER comparison OK\n"); else fail ("DER comparison failed\n"); free (buf); /* shishi_authenticator_clear_authorizationdata */ res = shishi_authenticator_clear_authorizationdata (handle, a); if (res == SHISHI_OK) success ("shishi_authenticator_clear_authorizationdata() OK\n"); else fail ("shishi_authenticator_clear_authorizationdata() failed\n"); /* shishi_asn1_to_der */ res = shishi_asn1_to_der (handle, a, &buf, &n); if (res == SHISHI_OK) success ("shishi_asn1_to_der() OK\n"); else n = 0, fail ("shishi_asn1_to_der() failed\n"); if (debug) { shishi_authenticator_print (handle, stdout, a); hexprint (buf, n); puts (""); hexprint (authenticator2, sizeof (authenticator2)); puts (""); } if (n == sizeof (authenticator2) && n == AUTHENTICATOR2_LEN && memcmp (authenticator2, buf, n) == 0) success ("DER comparison OK\n"); else fail ("DER comparison failed\n"); free (buf); /* unlink */ res = unlink ("authenticator.tmp"); if (res == 0) success ("unlink() OK\n"); else fail ("unlink() failed\n"); /* shishi_asn1_done */ shishi_asn1_done (handle, a); success ("shishi_asn1_done() OK\n"); }