def CompareDecodedWithLibidn2(original, encoded, decoded): """Decodes `encoded` with libidn2, and compares it to `decoded` from idna.""" libidn2_decoded = libidn2.decode(encoded) if libidn2_decoded != decoded: raise RuntimeError(( "IDNA decoding disagrees with libidn2 decoding.\nOriginal Input: %s\n" "Encoding: %s\nIDNA Decoding: %s\nlibidn2 Decoding: %s\n") % (original, encoded, decoded, libidn2_decoded))
def TestOneInput(input_bytes): global total_iters global comparison_iters fdp = atheris.FuzzedDataProvider(input_bytes) transitional = fdp.ConsumeBool() std3 = fdp.ConsumeBool() original = "a." + fdp.ConsumeUnicode(253) try: nfc_original = unicodedata.normalize("NFC", original) libidn2_encoded = libidn2.encode(original, uts46=True, transitional=transitional, nfc=True, std3=std3) idna_encoded = idna.encode(original, strict=False, uts46=True, transitional=transitional, std3_rules=std3).lower() except Exception as e: return if idna_encoded != libidn2_encoded: sys.stderr.write("Transitional=%s, std3=%s\n" % (transitional, std3)) sys.stderr.write("Input codepoints: %s\n" % [hex(ord(x))[2:] for x in original]) raise RuntimeError( "IDNA encoding disagrees with libidn2 encoding.\nInput: %s\nIDNA encoding: %s\nlibidn2 encoding: %s\n" % (original, idna_encoded, libidn2_encoded)) idna_decoded = idna.decode(idna_encoded, uts46=True, std3_rules=std3) libidn2_decoded = libidn2.decode(idna_encoded, uts46=True, std3=std3) if idna_decoded != libidn2_decoded: raise RuntimeError( "IDNA decoding disagrees with libidn2 decoding.\nInput: %s\nEncoding: %s\nIDNA decoding: %s\nlibidn2 decoding: %s" % (original, idna_encoded, idna_decoded, libidn2_decoded))
def CompareEncodedWithLibidn2(original, encoded): """Encodes `original` with libidn2 and compares it to `encoded`.""" try: libidn2_encoded = libidn2.encode(original) except RuntimeError as e: # libidn2 only supports Unicode 11, which might mean it doesn't accept a # character that Python accepts. That's fine. if str(e).startswith("RuntimeError: string contains a disallowed "): return codepoints = [hex(ord(x))[2:] for x in original] sys.stderr.write(( "IDNA produced a valid output, whereas libidn2 returned an error.\n" "Input: %s\nInput codepoints: %s\nIDNA encoding: %s\n" "libidn2 decoding of IDNA encoding:%s\n") % (original, codepoints, encoded, libidn2.decode(encoded))) raise if encoded != libidn2_encoded: raise RuntimeError( ("IDNA encoding disagrees with libidn2 encoding.\nInput: %s\n" "IDNA encoding: %s\nlibidn2 encoding: %s") % (original, encoded, libidn2_encoded))