1*8fb009dcSAndroid Build Coastguard Worker /* Copyright (c) 2014, Google Inc. 2*8fb009dcSAndroid Build Coastguard Worker * 3*8fb009dcSAndroid Build Coastguard Worker * Permission to use, copy, modify, and/or distribute this software for any 4*8fb009dcSAndroid Build Coastguard Worker * purpose with or without fee is hereby granted, provided that the above 5*8fb009dcSAndroid Build Coastguard Worker * copyright notice and this permission notice appear in all copies. 6*8fb009dcSAndroid Build Coastguard Worker * 7*8fb009dcSAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 8*8fb009dcSAndroid Build Coastguard Worker * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 9*8fb009dcSAndroid Build Coastguard Worker * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY 10*8fb009dcSAndroid Build Coastguard Worker * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 11*8fb009dcSAndroid Build Coastguard Worker * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION 12*8fb009dcSAndroid Build Coastguard Worker * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 13*8fb009dcSAndroid Build Coastguard Worker * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ 14*8fb009dcSAndroid Build Coastguard Worker 15*8fb009dcSAndroid Build Coastguard Worker #ifndef OPENSSL_HEADER_TOOL_INTERNAL_H 16*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_HEADER_TOOL_INTERNAL_H 17*8fb009dcSAndroid Build Coastguard Worker 18*8fb009dcSAndroid Build Coastguard Worker #include <openssl/base.h> 19*8fb009dcSAndroid Build Coastguard Worker #include <openssl/span.h> 20*8fb009dcSAndroid Build Coastguard Worker 21*8fb009dcSAndroid Build Coastguard Worker #include <string> 22*8fb009dcSAndroid Build Coastguard Worker #include <utility> 23*8fb009dcSAndroid Build Coastguard Worker #include <vector> 24*8fb009dcSAndroid Build Coastguard Worker 25*8fb009dcSAndroid Build Coastguard Worker // MSVC issues warning C4702 for unreachable code in its xtree header when 26*8fb009dcSAndroid Build Coastguard Worker // compiling with -D_HAS_EXCEPTIONS=0. See 27*8fb009dcSAndroid Build Coastguard Worker // https://connect.microsoft.com/VisualStudio/feedback/details/809962 28*8fb009dcSAndroid Build Coastguard Worker OPENSSL_MSVC_PRAGMA(warning(push)) 29*8fb009dcSAndroid Build Coastguard Worker OPENSSL_MSVC_PRAGMA(warning(disable: 4702)) 30*8fb009dcSAndroid Build Coastguard Worker #include <map> 31*8fb009dcSAndroid Build Coastguard Worker OPENSSL_MSVC_PRAGMA(warning(pop)) 32*8fb009dcSAndroid Build Coastguard Worker 33*8fb009dcSAndroid Build Coastguard Worker struct FileCloser { operatorFileCloser34*8fb009dcSAndroid Build Coastguard Worker void operator()(FILE *file) { 35*8fb009dcSAndroid Build Coastguard Worker fclose(file); 36*8fb009dcSAndroid Build Coastguard Worker } 37*8fb009dcSAndroid Build Coastguard Worker }; 38*8fb009dcSAndroid Build Coastguard Worker 39*8fb009dcSAndroid Build Coastguard Worker using ScopedFILE = std::unique_ptr<FILE, FileCloser>; 40*8fb009dcSAndroid Build Coastguard Worker 41*8fb009dcSAndroid Build Coastguard Worker // The following functions abstract between POSIX and Windows differences in 42*8fb009dcSAndroid Build Coastguard Worker // file descriptor I/O functions. 43*8fb009dcSAndroid Build Coastguard Worker 44*8fb009dcSAndroid Build Coastguard Worker // CloseFD behaves like |close|. 45*8fb009dcSAndroid Build Coastguard Worker void CloseFD(int fd); 46*8fb009dcSAndroid Build Coastguard Worker 47*8fb009dcSAndroid Build Coastguard Worker class ScopedFD { 48*8fb009dcSAndroid Build Coastguard Worker public: ScopedFD()49*8fb009dcSAndroid Build Coastguard Worker ScopedFD() {} ScopedFD(int fd)50*8fb009dcSAndroid Build Coastguard Worker explicit ScopedFD(int fd) : fd_(fd) {} ScopedFD(ScopedFD && other)51*8fb009dcSAndroid Build Coastguard Worker ScopedFD(ScopedFD &&other) { *this = std::move(other); } 52*8fb009dcSAndroid Build Coastguard Worker ScopedFD(const ScopedFD &) = delete; ~ScopedFD()53*8fb009dcSAndroid Build Coastguard Worker ~ScopedFD() { reset(); } 54*8fb009dcSAndroid Build Coastguard Worker 55*8fb009dcSAndroid Build Coastguard Worker ScopedFD &operator=(const ScopedFD &) = delete; 56*8fb009dcSAndroid Build Coastguard Worker ScopedFD &operator=(ScopedFD &&other) { 57*8fb009dcSAndroid Build Coastguard Worker reset(); 58*8fb009dcSAndroid Build Coastguard Worker fd_ = other.fd_; 59*8fb009dcSAndroid Build Coastguard Worker other.fd_ = -1; 60*8fb009dcSAndroid Build Coastguard Worker return *this; 61*8fb009dcSAndroid Build Coastguard Worker } 62*8fb009dcSAndroid Build Coastguard Worker 63*8fb009dcSAndroid Build Coastguard Worker explicit operator bool() const { return fd_ >= 0; } 64*8fb009dcSAndroid Build Coastguard Worker get()65*8fb009dcSAndroid Build Coastguard Worker int get() const { return fd_; } 66*8fb009dcSAndroid Build Coastguard Worker reset()67*8fb009dcSAndroid Build Coastguard Worker void reset() { 68*8fb009dcSAndroid Build Coastguard Worker if (fd_ >= 0) { 69*8fb009dcSAndroid Build Coastguard Worker CloseFD(fd_); 70*8fb009dcSAndroid Build Coastguard Worker } 71*8fb009dcSAndroid Build Coastguard Worker fd_ = -1; 72*8fb009dcSAndroid Build Coastguard Worker } 73*8fb009dcSAndroid Build Coastguard Worker release()74*8fb009dcSAndroid Build Coastguard Worker int release() { 75*8fb009dcSAndroid Build Coastguard Worker int fd = fd_; 76*8fb009dcSAndroid Build Coastguard Worker fd_ = -1; 77*8fb009dcSAndroid Build Coastguard Worker return fd; 78*8fb009dcSAndroid Build Coastguard Worker } 79*8fb009dcSAndroid Build Coastguard Worker 80*8fb009dcSAndroid Build Coastguard Worker private: 81*8fb009dcSAndroid Build Coastguard Worker int fd_ = -1; 82*8fb009dcSAndroid Build Coastguard Worker }; 83*8fb009dcSAndroid Build Coastguard Worker 84*8fb009dcSAndroid Build Coastguard Worker // OpenFD behaves like |open| but handles |EINTR| and works on Windows. 85*8fb009dcSAndroid Build Coastguard Worker ScopedFD OpenFD(const char *path, int flags); 86*8fb009dcSAndroid Build Coastguard Worker 87*8fb009dcSAndroid Build Coastguard Worker // ReadFromFD reads up to |num| bytes from |fd| and writes the result to |out|. 88*8fb009dcSAndroid Build Coastguard Worker // On success, it returns true and sets |*out_bytes_read| to the number of bytes 89*8fb009dcSAndroid Build Coastguard Worker // read. Otherwise, it returns false and leaves an error in |errno|. On POSIX, 90*8fb009dcSAndroid Build Coastguard Worker // it handles |EINTR| internally. 91*8fb009dcSAndroid Build Coastguard Worker bool ReadFromFD(int fd, size_t *out_bytes_read, void *out, size_t num); 92*8fb009dcSAndroid Build Coastguard Worker 93*8fb009dcSAndroid Build Coastguard Worker // WriteToFD writes up to |num| bytes from |in| to |fd|. On success, it returns 94*8fb009dcSAndroid Build Coastguard Worker // true and sets |*out_bytes_written| to the number of bytes written. Otherwise, 95*8fb009dcSAndroid Build Coastguard Worker // it returns false and leaves an error in |errno|. On POSIX, it handles |EINTR| 96*8fb009dcSAndroid Build Coastguard Worker // internally. 97*8fb009dcSAndroid Build Coastguard Worker bool WriteToFD(int fd, size_t *out_bytes_written, const void *in, size_t num); 98*8fb009dcSAndroid Build Coastguard Worker 99*8fb009dcSAndroid Build Coastguard Worker // FDToFILE behaves like |fdopen|. 100*8fb009dcSAndroid Build Coastguard Worker ScopedFILE FDToFILE(ScopedFD fd, const char *mode); 101*8fb009dcSAndroid Build Coastguard Worker 102*8fb009dcSAndroid Build Coastguard Worker enum ArgumentType { 103*8fb009dcSAndroid Build Coastguard Worker kRequiredArgument, 104*8fb009dcSAndroid Build Coastguard Worker kOptionalArgument, 105*8fb009dcSAndroid Build Coastguard Worker kBooleanArgument, 106*8fb009dcSAndroid Build Coastguard Worker }; 107*8fb009dcSAndroid Build Coastguard Worker 108*8fb009dcSAndroid Build Coastguard Worker struct argument { 109*8fb009dcSAndroid Build Coastguard Worker const char *name; 110*8fb009dcSAndroid Build Coastguard Worker ArgumentType type; 111*8fb009dcSAndroid Build Coastguard Worker const char *description; 112*8fb009dcSAndroid Build Coastguard Worker }; 113*8fb009dcSAndroid Build Coastguard Worker 114*8fb009dcSAndroid Build Coastguard Worker bool ParseKeyValueArguments(std::map<std::string, std::string> *out_args, const 115*8fb009dcSAndroid Build Coastguard Worker std::vector<std::string> &args, const struct argument *templates); 116*8fb009dcSAndroid Build Coastguard Worker 117*8fb009dcSAndroid Build Coastguard Worker void PrintUsage(const struct argument *templates); 118*8fb009dcSAndroid Build Coastguard Worker 119*8fb009dcSAndroid Build Coastguard Worker bool GetUnsigned(unsigned *out, const std::string &arg_name, 120*8fb009dcSAndroid Build Coastguard Worker unsigned default_value, 121*8fb009dcSAndroid Build Coastguard Worker const std::map<std::string, std::string> &args); 122*8fb009dcSAndroid Build Coastguard Worker 123*8fb009dcSAndroid Build Coastguard Worker bool ReadAll(std::vector<uint8_t> *out, FILE *in); 124*8fb009dcSAndroid Build Coastguard Worker bool WriteToFile(const std::string &path, bssl::Span<const uint8_t> in); 125*8fb009dcSAndroid Build Coastguard Worker 126*8fb009dcSAndroid Build Coastguard Worker bool Ciphers(const std::vector<std::string> &args); 127*8fb009dcSAndroid Build Coastguard Worker bool Client(const std::vector<std::string> &args); 128*8fb009dcSAndroid Build Coastguard Worker bool DoPKCS12(const std::vector<std::string> &args); 129*8fb009dcSAndroid Build Coastguard Worker bool GenerateECH(const std::vector<std::string> &args); 130*8fb009dcSAndroid Build Coastguard Worker bool GenerateEd25519Key(const std::vector<std::string> &args); 131*8fb009dcSAndroid Build Coastguard Worker bool GenerateRSAKey(const std::vector<std::string> &args); 132*8fb009dcSAndroid Build Coastguard Worker bool MD5Sum(const std::vector<std::string> &args); 133*8fb009dcSAndroid Build Coastguard Worker bool Rand(const std::vector<std::string> &args); 134*8fb009dcSAndroid Build Coastguard Worker bool SHA1Sum(const std::vector<std::string> &args); 135*8fb009dcSAndroid Build Coastguard Worker bool SHA224Sum(const std::vector<std::string> &args); 136*8fb009dcSAndroid Build Coastguard Worker bool SHA256Sum(const std::vector<std::string> &args); 137*8fb009dcSAndroid Build Coastguard Worker bool SHA384Sum(const std::vector<std::string> &args); 138*8fb009dcSAndroid Build Coastguard Worker bool SHA512Sum(const std::vector<std::string> &args); 139*8fb009dcSAndroid Build Coastguard Worker bool SHA512256Sum(const std::vector<std::string> &args); 140*8fb009dcSAndroid Build Coastguard Worker bool Server(const std::vector<std::string> &args); 141*8fb009dcSAndroid Build Coastguard Worker bool Sign(const std::vector<std::string> &args); 142*8fb009dcSAndroid Build Coastguard Worker bool Speed(const std::vector<std::string> &args); 143*8fb009dcSAndroid Build Coastguard Worker 144*8fb009dcSAndroid Build Coastguard Worker // These values are DER encoded, RSA private keys. 145*8fb009dcSAndroid Build Coastguard Worker extern const uint8_t kDERRSAPrivate2048[]; 146*8fb009dcSAndroid Build Coastguard Worker extern const size_t kDERRSAPrivate2048Len; 147*8fb009dcSAndroid Build Coastguard Worker extern const uint8_t kDERRSAPrivate4096[]; 148*8fb009dcSAndroid Build Coastguard Worker extern const size_t kDERRSAPrivate4096Len; 149*8fb009dcSAndroid Build Coastguard Worker 150*8fb009dcSAndroid Build Coastguard Worker 151*8fb009dcSAndroid Build Coastguard Worker #endif // !OPENSSL_HEADER_TOOL_INTERNAL_H 152