/* RFC 4013: SASLprep: Stringprep Profile for User Names and Passwords code based on gsasl_saslprep from GSASL project */ int sasl_saslprep(const char *in, sasl_saslprep_flags flags, char **out) { #if LIBIDN int rc; rc = stringprep_profile(in, out, "SASLprep", (flags & SASL_ALLOW_UNASSIGNED) ? STRINGPREP_NO_UNASSIGNED : 0); if (rc != STRINGPREP_OK) { *out = NULL; return -1; } #if defined HAVE_PR29_H if (pr29_8z(*out) != PR29_SUCCESS) { free(*out); *out = NULL; return -1; } #endif #else size_t i, inlen = strlen(in); for (i = 0; i < inlen; i++) { if (in[i] & 0x80) { *out = NULL; hydra_report(stderr, "Error: Can't convert UTF-8, you should install libidn\n"); return -1; } } *out = malloc(inlen + 1); if (!*out) { hydra_report(stderr, "Error: Can't allocate memory\n"); return -1; } strcpy(*out, in); #endif return 0; }
/** * gsasl_saslprep: * @in: a UTF-8 encoded string. * @flags: any SASLprep flag, e.g., %GSASL_ALLOW_UNASSIGNED. * @out: on exit, contains newly allocated output string. * @stringpreprc: if non-NULL, will hold precise stringprep return code. * * Prepare string using SASLprep. On success, the @out variable must * be deallocated by the caller. * * Return value: Returns %GSASL_OK on success, or * %GSASL_SASLPREP_ERROR on error. * * Since: 0.2.3 **/ int gsasl_saslprep (const char *in, Gsasl_saslprep_flags flags, char **out, int *stringpreprc) { #if HAVE_LIBIDN int rc; rc = stringprep_profile (in, out, "SASLprep", (flags & GSASL_ALLOW_UNASSIGNED) ? STRINGPREP_NO_UNASSIGNED : 0); if (stringpreprc) *stringpreprc = rc; if (rc != STRINGPREP_OK) { *out = NULL; return GSASL_SASLPREP_ERROR; } # if defined HAVE_PR29_8Z && defined HAVE_PR29_H if (pr29_8z (*out) != PR29_SUCCESS) { free (*out); *out = NULL; if (stringpreprc) *stringpreprc = STRINGPREP_NFKC_FAILED; return GSASL_SASLPREP_ERROR; } #endif #else size_t i, inlen = strlen (in); for (i = 0; i < inlen; i++) if (in[i] & 0x80) { *out = NULL; return GSASL_SASLPREP_ERROR; } *out = malloc (inlen + 1); if (!*out) return GSASL_MALLOC_ERROR; strcpy (*out, in); #endif return GSASL_OK; }
void doit (void) { size_t i; int rc; for (i = 0; i < sizeof (tv) / sizeof (tv[0]); i++) { if (debug) { uint32_t *p, *q; printf ("PR29 entry %ld: %s\n", i, tv[i].name); printf ("in:\n"); ucs4print (tv[i].in, tv[i].inlen); printf ("nfkc:\n"); p = stringprep_ucs4_nfkc_normalize (tv[i].in, tv[i].inlen); ucs4print (p, -1); printf ("second nfkc:\n"); q = stringprep_ucs4_nfkc_normalize (p, -1); ucs4print (q, -1); free (p); free (q); } rc = pr29_4 (tv[i].in, tv[i].inlen); if (rc != tv[i].rc) { fail ("PR29 entry %ld failed (expected %d): %d\n", i, tv[i].rc, rc); if (debug) printf ("FATAL\n"); continue; } rc = pr29_4z (tv[i].in); if (rc != tv[i].rc) { fail ("PR29 entry %ld failed (expected %d): %d\n", i, tv[i].rc, rc); if (debug) printf ("FATAL\n"); continue; } { char *p; size_t items_read, items_written; p = stringprep_ucs4_to_utf8 (tv[i].in, (ssize_t) tv[i].inlen, &items_read, &items_written); if (p == NULL) fail ("FAIL: stringprep_ucs4_to_utf8(tv[%ld]) == NULL\n", i); if (debug) hexprint (p, strlen (p)); rc = pr29_8z (p); free (p); if (rc != tv[i].rc) { fail ("PR29 entry %ld failed (expected %d): %d\n", i, tv[i].rc, rc); if (debug) printf ("FATAL\n"); continue; } } if (debug) { if (tv[i].rc != PR29_SUCCESS) printf ("EXPECTED FAIL\n"); else printf ("OK\n"); } } }