Esempio n. 1
0
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))
Esempio n. 2
0
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))
Esempio n. 3
0
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))