Пример #1
0
 def responder_name(self) -> typing.Optional[x509.Name]:
     self._requires_successful_response()
     x509_name, _ = self._responder_key_name()
     if x509_name == self._backend._ffi.NULL:
         return None
     else:
         return _decode_x509_name(self._backend, x509_name)
Пример #2
0
 def subject(self):
     subject = self._backend._lib.X509_REQ_get_subject_name(self._x509_req)
     self._backend.openssl_assert(subject != self._backend._ffi.NULL)
     return _decode_x509_name(self._backend, subject)
Пример #3
0
 def issuer(self):
     issuer = self._backend._lib.X509_CRL_get_issuer(self._x509_crl)
     self._backend.openssl_assert(issuer != self._backend._ffi.NULL)
     return _decode_x509_name(self._backend, issuer)
Пример #4
0
 def responder_name(self):
     x509_name, _ = self._responder_key_name()
     if x509_name == self._backend._ffi.NULL:
         return None
     else:
         return _decode_x509_name(self._backend, x509_name)
Пример #5
0
 def issuer(self) -> x509.Name:
     issuer = self._backend._lib.X509_get_issuer_name(self._x509)
     self._backend.openssl_assert(issuer != self._backend._ffi.NULL)
     return _decode_x509_name(self._backend, issuer)
Пример #6
0
 def issuer(self):
     issuer = self._backend._lib.X509_get_issuer_name(self._x509)
     self._backend.openssl_assert(issuer != self._backend._ffi.NULL)
     return _decode_x509_name(self._backend, issuer)
Пример #7
0
 def subject(self):
     subject = self._backend._lib.X509_REQ_get_subject_name(self._x509_req)
     self._backend.openssl_assert(subject != self._backend._ffi.NULL)
     return _decode_x509_name(self._backend, subject)
Пример #8
0
 def responder_name(self):
     x509_name, _ = self._responder_key_name()
     if x509_name == self._backend._ffi.NULL:
         return None
     else:
         return _decode_x509_name(self._backend, x509_name)
Пример #9
0
def _patched_decode_general_name(backend, gn):
    if gn.type == backend._lib.GEN_DNS:
        # Convert to bytes and then decode to utf8. We don't use
        # asn1_string_to_utf8 here because it doesn't properly convert
        # utf8 from ia5strings.
        name_bytes = _asn1_string_to_bytes(backend, gn.d.dNSName)
        try:
            data = name_bytes.decode("utf8")
        except UnicodeDecodeError:
            data = name_bytes.hex()
        # We don't use the constructor for DNSName so we can bypass validation
        # This allows us to create DNSName objects that have unicode chars
        # when a certificate (against the RFC) contains them.
        return x509.DNSName._init_without_validation(data)
    elif gn.type == backend._lib.GEN_URI:
        # Convert to bytes and then decode to utf8. We don't use
        # asn1_string_to_utf8 here because it doesn't properly convert
        # utf8 from ia5strings.
        name_bytes = _asn1_string_to_bytes(backend,
                                           gn.d.uniformResourceIdentifier)
        try:
            data = name_bytes.decode("utf8")
        except UnicodeDecodeError:
            # TODO: we could try utf16-be
            data = name_bytes.hex()
        # We don't use the constructor for URI so we can bypass validation
        # This allows us to create URI objects that have unicode chars
        # when a certificate (against the RFC) contains them.
        return x509.UniformResourceIdentifier._init_without_validation(data)
    elif gn.type == backend._lib.GEN_RID:
        oid = _obj2txt(backend, gn.d.registeredID)
        return x509.RegisteredID(x509.ObjectIdentifier(oid))
    elif gn.type == backend._lib.GEN_IPADD:
        data = _asn1_string_to_bytes(backend, gn.d.iPAddress)
        data_len = len(data)
        if data_len == 8 or data_len == 32:
            # This is an IPv4 or IPv6 Network and not a single IP. This
            # type of data appears in Name Constraints. Unfortunately,
            # ipaddress doesn't support packed bytes + netmask. Additionally,
            # IPv6Network can only handle CIDR rather than the full 16 byte
            # netmask. To handle this we convert the netmask to integer, then
            # find the first 0 bit, which will be the prefix. If another 1
            # bit is present after that the netmask is invalid.
            base = ipaddress.ip_address(data[:data_len // 2])
            netmask = ipaddress.ip_address(data[data_len // 2:])
            bits = bin(int(netmask))[2:]
            prefix = bits.find('0')
            # If no 0 bits are found it is a /32 or /128
            if prefix == -1:
                prefix = len(bits)

            if "1" in bits[prefix:]:
                raise ValueError("Invalid netmask")

            ip = ipaddress.ip_network(base.exploded + u"/{0}".format(prefix))
        else:
            try:
                ip = ipaddress.ip_address(data)
            except ValueError:
                ip = data

        return x509.IPAddress(ip)
    elif gn.type == backend._lib.GEN_DIRNAME:
        return x509.DirectoryName(
            _decode_x509_name(backend, gn.d.directoryName))
    elif gn.type == backend._lib.GEN_EMAIL:
        # Convert to bytes and then decode to utf8. We don't use
        # asn1_string_to_utf8 here because it doesn't properly convert
        # utf8 from ia5strings.
        data = _asn1_string_to_bytes(backend, gn.d.rfc822Name).decode("utf8")
        # We don't use the constructor for RFC822Name so we can bypass
        # validation. This allows us to create RFC822Name objects that have
        # unicode chars when a certificate (against the RFC) contains them.
        return x509.RFC822Name._init_without_validation(data)
    elif gn.type == backend._lib.GEN_OTHERNAME:
        type_id = _obj2txt(backend, gn.d.otherName.type_id)
        value = _asn1_to_der(backend, gn.d.otherName.value)
        return x509.OtherName(x509.ObjectIdentifier(type_id), value)
    else:
        # x400Address or ediPartyName
        raise x509.UnsupportedGeneralNameType(
            "{0} is not a supported type".format(
                x509._GENERAL_NAMES.get(gn.type, gn.type)), gn.type)