| // Copyright 2014 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. | |
| #ifndef OPENSSL_HEADER_TOOL_INTERNAL_H | |
| #define OPENSSL_HEADER_TOOL_INTERNAL_H | |
| #include <map> | |
| #include <string> | |
| #include <string_view> | |
| #include <utility> | |
| #include <vector> | |
| #include <openssl/base.h> | |
| #include <openssl/span.h> | |
| BSSL_NAMESPACE_BEGIN | |
| struct FileCloser { | |
| void operator()(FILE *file) { fclose(file); } | |
| }; | |
| using ScopedFILE = std::unique_ptr<FILE, FileCloser>; | |
| // The following functions abstract between POSIX and Windows differences in | |
| // file descriptor I/O functions. | |
| // CloseFD behaves like `close`. | |
| void CloseFD(int fd); | |
| class ScopedFD { | |
| public: | |
| ScopedFD() {} | |
| explicit ScopedFD(int fd) : fd_(fd) {} | |
| ScopedFD(ScopedFD &&other) { *this = std::move(other); } | |
| ScopedFD(const ScopedFD &) = delete; | |
| ~ScopedFD() { reset(); } | |
| ScopedFD &operator=(const ScopedFD &) = delete; | |
| ScopedFD &operator=(ScopedFD &&other) { | |
| reset(); | |
| fd_ = other.fd_; | |
| other.fd_ = -1; | |
| return *this; | |
| } | |
| explicit operator bool() const { return fd_ >= 0; } | |
| int get() const { return fd_; } | |
| void reset() { | |
| if (fd_ >= 0) { | |
| CloseFD(fd_); | |
| } | |
| fd_ = -1; | |
| } | |
| int release() { | |
| int fd = fd_; | |
| fd_ = -1; | |
| return fd; | |
| } | |
| private: | |
| int fd_ = -1; | |
| }; | |
| // OpenFD behaves like `open` but handles `EINTR` and works on Windows. | |
| ScopedFD OpenFD(const char *path, int flags); | |
| // ReadFromFD reads up to `num` bytes from `fd` and writes the result to `out`. | |
| // On success, it returns true and sets `*out_bytes_read` to the number of bytes | |
| // read. Otherwise, it returns false and leaves an error in `errno`. On POSIX, | |
| // it handles `EINTR` internally. | |
| bool ReadFromFD(int fd, size_t *out_bytes_read, void *out, size_t num); | |
| // WriteToFD writes up to `num` bytes from `in` to `fd`. On success, it returns | |
| // true and sets `*out_bytes_written` to the number of bytes written. Otherwise, | |
| // it returns false and leaves an error in `errno`. On POSIX, it handles `EINTR` | |
| // internally. | |
| bool WriteToFD(int fd, size_t *out_bytes_written, const void *in, size_t num); | |
| // FDToFILE behaves like `fdopen`. | |
| ScopedFILE FDToFILE(ScopedFD fd, const char *mode); | |
| enum ArgumentType { | |
| kRequiredArgument, | |
| kOptionalArgument, | |
| kBooleanArgument, | |
| }; | |
| struct argument { | |
| const char *name; | |
| ArgumentType type; | |
| const char *description; | |
| }; | |
| bool ParseKeyValueArguments(std::map<std::string, std::string> *out_args, | |
| const std::vector<std::string> &args, | |
| const struct argument *templates); | |
| void PrintUsage(const struct argument *templates); | |
| bool GetUnsigned(unsigned *out, const std::string &arg_name, | |
| unsigned default_value, | |
| const std::map<std::string, std::string> &args); | |
| // SplitString returns `s` split on copies of `sep`. If `sep` does not appear in | |
| // `s`, it returns a single-element array containing `s`, even if `s` is empty. | |
| std::vector<std::string_view> SplitString(std::string_view s, | |
| std::string_view sep); | |
| // TrimSpace returns `s` with leading and trailing spaces removed. | |
| std::string_view TrimSpace(std::string_view s); | |
| bool ReadAll(std::vector<uint8_t> *out, FILE *in); | |
| bool WriteToFile(const std::string &path, bssl::Span<const uint8_t> in); | |
| UniquePtr<EVP_PKEY> LoadPrivateKeyFile(const std::string &file); | |
| bool Ciphers(const std::vector<std::string> &args); | |
| bool Client(const std::vector<std::string> &args); | |
| bool DoPKCS12(const std::vector<std::string> &args); | |
| bool GenerateECH(const std::vector<std::string> &args); | |
| bool GenerateEd25519Key(const std::vector<std::string> &args); | |
| bool GenerateRSAKey(const std::vector<std::string> &args); | |
| bool MD5Sum(const std::vector<std::string> &args); | |
| bool Rand(const std::vector<std::string> &args); | |
| bool SHA1Sum(const std::vector<std::string> &args); | |
| bool SHA224Sum(const std::vector<std::string> &args); | |
| bool SHA256Sum(const std::vector<std::string> &args); | |
| bool SHA384Sum(const std::vector<std::string> &args); | |
| bool SHA512Sum(const std::vector<std::string> &args); | |
| bool SHA512256Sum(const std::vector<std::string> &args); | |
| bool Server(const std::vector<std::string> &args); | |
| bool Sign(const std::vector<std::string> &args); | |
| // These values are DER encoded, RSA private keys. | |
| extern const uint8_t kDERRSAPrivate2048[]; | |
| extern const size_t kDERRSAPrivate2048Len; | |
| extern const uint8_t kDERRSAPrivate3072[]; | |
| extern const size_t kDERRSAPrivate3072Len; | |
| extern const uint8_t kDERRSAPrivate4096[]; | |
| extern const size_t kDERRSAPrivate4096Len; | |
| BSSL_NAMESPACE_END | |
| #endif // !OPENSSL_HEADER_TOOL_INTERNAL_H |