/* * Copyright (c) Facebook, Inc. and its affiliates. * * 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 * * http://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. */ #pragma once #include #include #include #include #include #include #include namespace folly { namespace ssl { class OpenSSLCertUtils { public: // Note: non-const until OpenSSL 1.1.0 static Optional getCommonName(X509& x509); static std::vector getSubjectAltNames(X509& x509); /* * Return the subject name, if any, from the cert * @param x509 Reference to an X509 * @return a folly::Optional, or folly::none */ static Optional getSubject(X509& x509); /* * Return the issuer name, if any, from the cert * @param x509 Reference to an X509 * @return a folly::Optional, or folly::none */ static Optional getIssuer(X509& x509); /* * Get a string representation of the not-before time on the certificate */ static std::string getNotBeforeTime(X509& x509); /* * Get a string representation of the not-after (expiration) time */ static std::string getNotAfterTime(X509& x509); /* * Summarize the CN, Subject, Issuer, Validity, and extensions as a string */ static folly::Optional toString(X509& x509); /** * Decode the DER representation of an X509 certificate. * * Throws on error (if a valid certificate can't be decoded). */ static X509UniquePtr derDecode(ByteRange); /** * Encode an X509 certificate in DER format. * * Throws on error. */ static std::unique_ptr derEncode(X509&); /** * Read certificates from memory and returns them as a vector of X509 * pointers. Throw if there is any malformed cert or memory allocation * problem. * @param range Buffer to parse. * @return A vector of X509 objects. */ static std::vector readCertsFromBuffer(ByteRange range); /** * Return the output of the X509_digest for chosen message-digest algo * NOTE: The returned digest will be in binary, and may need to be * hex-encoded */ static std::array getDigestSha1(X509& x509); static std::array getDigestSha256(X509& x509); /** * Read a store from a file. Throw if unable to read the file, memory * allocation fails, or any cert can't be parsed or added to the store. * @param caFile Path to the CA file. * @return A X509 store that contains certs in the CA file. */ static X509StoreUniquePtr readStoreFromFile(std::string caFile); /** * Read a store from a PEM buffer. Throw if memory allocation fails, or * any cert can't be parsed or added to the store. * @param range A buffer containing certs in PEM format. * @return A X509 store that contains certs in the CA file. */ static X509StoreUniquePtr readStoreFromBuffer(ByteRange range); /** * Converts an ASN1_TIME* into a system clock time point for use with other * std::chrono classes. */ static std::chrono::system_clock::time_point asnTimeToTimepoint( const ASN1_TIME* asnTime); private: static std::string getDateTimeStr(const ASN1_TIME* time); }; } // namespace ssl } // namespace folly