| // Copyright 2023 The BoringSSL Authors |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // https://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| #if !defined(OPENSSL_HEADER_BSSL_PKI_CERTIFICATE_H_) && defined(__cplusplus) |
| #define OPENSSL_HEADER_BSSL_PKI_CERTIFICATE_H_ |
| |
| #include <memory> |
| #include <string> |
| #include <string_view> |
| |
| #include <openssl/base.h> // IWYU pragma: export |
| #include <openssl/span.h> |
| |
| BSSL_NAMESPACE_BEGIN |
| |
| struct CertificateInternals; |
| |
| // Certificate represents a parsed X.509 certificate. It includes accessors for |
| // the various things that one might want to extract from a certificate, |
| class OPENSSL_EXPORT Certificate { |
| public: |
| Certificate(Certificate&& other); |
| Certificate(const Certificate& other) = delete; |
| ~Certificate(); |
| Certificate& operator=(const Certificate& other) = delete; |
| |
| // FromDER returns a certificate from an DER-encoded X.509 object in |der|. |
| // In the event of a failure, it will return no value, and |out_diagnostic| |
| // may be set to a string of human readable debugging information if |
| // information abou the failure is available. |
| static std::unique_ptr<Certificate> FromDER( |
| bssl::Span<const uint8_t> der, std::string *out_diagnostic); |
| |
| // FromPEM returns a certificate from the first CERTIFICATE PEM block in |
| // |pem|. In the event of a failure, it will return no value, and |
| // |out_diagnostic| may be set to a string of human readable debugging |
| // informtion if informaiton about the failuew is available. |
| static std::unique_ptr<Certificate> FromPEM( |
| std::string_view pem, std::string *out_diagnostic); |
| |
| // IsSelfIssued returns true if the certificate is "self-issued" per RFC 5280 |
| // section 6.1. I.e. that the subject and issuer names are equal after |
| // canonicalization (and no other checks). |
| // |
| // Other contexts may have a different notion such as "self signed" which |
| // may or may not be this, and may check other properties of the certificate. |
| bool IsSelfIssued() const; |
| |
| // Validity specifies the temporal validity of a cerificate, expressed in |
| // POSIX time values of seconds since the POSIX epoch. The certificate is |
| // valid at POSIX time t in second granularity, where not_before <= t <= |
| // not_after. |
| struct Validity { |
| int64_t not_before; |
| int64_t not_after; |
| }; |
| |
| Validity GetValidity() const; |
| |
| // The binary, big-endian, DER representation of the certificate serial |
| // number. It may include a leading 00 byte. |
| bssl::Span<const uint8_t> GetSerialNumber() const; |
| |
| private: |
| explicit Certificate(std::unique_ptr<CertificateInternals> internals); |
| |
| std::unique_ptr<CertificateInternals> internals_; |
| }; |
| |
| BSSL_NAMESPACE_END |
| |
| #endif // OPENSSL_HEADER_BSSL_PKI_CERTIFICATE_H_ && __cplusplus |