| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -201,18 +201,28 @@ struct FunctionDeleter { | |||
| 201 | 201 | template <typename T, void (*function)(T*)> | |
| 202 | 202 | using DeleteFnPtr = typename FunctionDeleter<T, function>::Pointer; | |
| 203 | 203 | ||
| 204 | - using BignumCtxPointer = DeleteFnPtr<BN_CTX, BN_CTX_free>; | ||
| 205 | - using BignumGenCallbackPointer = DeleteFnPtr<BN_GENCB, BN_GENCB_free>; | ||
| 206 | - using EVPKeyCtxPointer = DeleteFnPtr<EVP_PKEY_CTX, EVP_PKEY_CTX_free>; | ||
| 207 | - using EVPMDCtxPointer = DeleteFnPtr<EVP_MD_CTX, EVP_MD_CTX_free>; | ||
| 208 | - using HMACCtxPointer = DeleteFnPtr<HMAC_CTX, HMAC_CTX_free>; | ||
| 209 | - using NetscapeSPKIPointer = DeleteFnPtr<NETSCAPE_SPKI, NETSCAPE_SPKI_free>; | ||
| 210 | 204 | using PKCS8Pointer = DeleteFnPtr<PKCS8_PRIV_KEY_INFO, PKCS8_PRIV_KEY_INFO_free>; | |
| 211 | 205 | using RSAPointer = DeleteFnPtr<RSA, RSA_free>; | |
| 212 | 206 | using SSLSessionPointer = DeleteFnPtr<SSL_SESSION, SSL_SESSION_free>; | |
| 213 | 207 | ||
| 208 | + class BIOPointer; | ||
| 209 | + class BignumPointer; | ||
| 214 | 210 | class CipherCtxPointer; | |
| 211 | + class DataPointer; | ||
| 212 | + class DHPointer; | ||
| 215 | 213 | class ECKeyPointer; | |
| 214 | + class EVPKeyPointer; | ||
| 215 | + class EVPMDCtxPointer; | ||
| 216 | + class SSLCtxPointer; | ||
| 217 | + class SSLPointer; | ||
| 218 | + class X509View; | ||
| 219 | + class X509Pointer; | ||
| 220 | + class ECDSASigPointer; | ||
| 221 | + class ECGroupPointer; | ||
| 222 | + class ECPointPointer; | ||
| 223 | + class ECKeyPointer; | ||
| 224 | + class Rsa; | ||
| 225 | + class Ec; | ||
| 216 | 226 | ||
| 217 | 227 | struct StackOfXASN1Deleter { | |
| 218 | 228 | void operator()(STACK_OF(ASN1_OBJECT) * p) const { | |
@@ -228,6 +238,9 @@ struct Buffer { | |||
| 228 | 238 | size_t len = 0; | |
| 229 | 239 | }; | |
| 230 | 240 | ||
| 241 | + DataPointer hashDigest(const Buffer<const unsigned char>& data, | ||
| 242 | + const EVP_MD* md); | ||
| 243 | + | ||
| 231 | 244 | class Cipher final { | |
| 232 | 245 | public: | |
| 233 | 246 | Cipher() = default; | |
@@ -258,15 +271,108 @@ class Cipher final { | |||
| 258 | 271 | static const Cipher FromNid(int nid); | |
| 259 | 272 | static const Cipher FromCtx(const CipherCtxPointer& ctx); | |
| 260 | 273 | ||
| 274 | + struct CipherParams { | ||
| 275 | + int padding; | ||
| 276 | + const EVP_MD* digest; | ||
| 277 | + const Buffer<const void> label; | ||
| 278 | + }; | ||
| 279 | + | ||
| 280 | + static DataPointer encrypt(const EVPKeyPointer& key, | ||
| 281 | + const CipherParams& params, | ||
| 282 | + const Buffer<const void> in); | ||
| 283 | + static DataPointer decrypt(const EVPKeyPointer& key, | ||
| 284 | + const CipherParams& params, | ||
| 285 | + const Buffer<const void> in); | ||
| 286 | + | ||
| 287 | + static DataPointer sign(const EVPKeyPointer& key, | ||
| 288 | + const CipherParams& params, | ||
| 289 | + const Buffer<const void> in); | ||
| 290 | + | ||
| 291 | + static DataPointer recover(const EVPKeyPointer& key, | ||
| 292 | + const CipherParams& params, | ||
| 293 | + const Buffer<const void> in); | ||
| 294 | + | ||
| 261 | 295 | private: | |
| 262 | 296 | const EVP_CIPHER* cipher_ = nullptr; | |
| 263 | 297 | }; | |
| 264 | 298 | ||
| 299 | + // ============================================================================ | ||
| 300 | + // RSA | ||
| 301 | + | ||
| 302 | + class Rsa final { | ||
| 303 | + public: | ||
| 304 | + Rsa(); | ||
| 305 | + Rsa(OSSL3_CONST RSA* rsa); | ||
| 306 | + NCRYPTO_DISALLOW_COPY_AND_MOVE(Rsa) | ||
| 307 | + | ||
| 308 | + inline operator bool() const { return rsa_ != nullptr; } | ||
| 309 | + inline operator OSSL3_CONST RSA*() const { return rsa_; } | ||
| 310 | + | ||
| 311 | + struct PublicKey { | ||
| 312 | + const BIGNUM* n; | ||
| 313 | + const BIGNUM* e; | ||
| 314 | + const BIGNUM* d; | ||
| 315 | + }; | ||
| 316 | + struct PrivateKey { | ||
| 317 | + const BIGNUM* p; | ||
| 318 | + const BIGNUM* q; | ||
| 319 | + const BIGNUM* dp; | ||
| 320 | + const BIGNUM* dq; | ||
| 321 | + const BIGNUM* qi; | ||
| 322 | + }; | ||
| 323 | + struct PssParams { | ||
| 324 | + std::string_view digest = "sha1"; | ||
| 325 | + std::optional<std::string_view> mgf1_digest = "sha1"; | ||
| 326 | + int64_t salt_length = 20; | ||
| 327 | + }; | ||
| 328 | + | ||
| 329 | + const PublicKey getPublicKey() const; | ||
| 330 | + const PrivateKey getPrivateKey() const; | ||
| 331 | + const std::optional<PssParams> getPssParams() const; | ||
| 332 | + | ||
| 333 | + bool setPublicKey(BignumPointer&& n, BignumPointer&& e); | ||
| 334 | + bool setPrivateKey(BignumPointer&& d, | ||
| 335 | + BignumPointer&& q, | ||
| 336 | + BignumPointer&& p, | ||
| 337 | + BignumPointer&& dp, | ||
| 338 | + BignumPointer&& dq, | ||
| 339 | + BignumPointer&& qi); | ||
| 340 | + | ||
| 341 | + using CipherParams = Cipher::CipherParams; | ||
| 342 | + | ||
| 343 | + static DataPointer encrypt(const EVPKeyPointer& key, | ||
| 344 | + const CipherParams& params, | ||
| 345 | + const Buffer<const void> in); | ||
| 346 | + static DataPointer decrypt(const EVPKeyPointer& key, | ||
| 347 | + const CipherParams& params, | ||
| 348 | + const Buffer<const void> in); | ||
| 349 | + | ||
| 350 | + private: | ||
| 351 | + OSSL3_CONST RSA* rsa_; | ||
| 352 | + }; | ||
| 353 | + | ||
| 354 | + class Ec final { | ||
| 355 | + public: | ||
| 356 | + Ec(); | ||
| 357 | + Ec(OSSL3_CONST EC_KEY* key); | ||
| 358 | + NCRYPTO_DISALLOW_COPY_AND_MOVE(Ec) | ||
| 359 | + | ||
| 360 | + const EC_GROUP* getGroup() const; | ||
| 361 | + int getCurve() const; | ||
| 362 | + | ||
| 363 | + inline operator bool() const { return ec_ != nullptr; } | ||
| 364 | + inline operator OSSL3_CONST EC_KEY*() const { return ec_; } | ||
| 365 | + | ||
| 366 | + private: | ||
| 367 | + OSSL3_CONST EC_KEY* ec_ = nullptr; | ||
| 368 | + }; | ||
| 369 | + | ||
| 265 | 370 | // A managed pointer to a buffer of data. When destroyed the underlying | |
| 266 | 371 | // buffer will be freed. | |
| 267 | 372 | class DataPointer final { | |
| 268 | 373 | public: | |
| 269 | 374 | static DataPointer Alloc(size_t len); | |
| 375 | + static DataPointer Copy(const Buffer<const void>& buffer); | ||
| 270 | 376 | ||
| 271 | 377 | DataPointer() = default; | |
| 272 | 378 | explicit DataPointer(void* data, size_t len); | |
@@ -283,6 +389,11 @@ class DataPointer final { | |||
| 283 | 389 | void reset(void* data = nullptr, size_t len = 0); | |
| 284 | 390 | void reset(const Buffer<void>& buffer); | |
| 285 | 391 | ||
| 392 | + // Sets the underlying data buffer to all zeros. | ||
| 393 | + void zero(); | ||
| 394 | + | ||
| 395 | + DataPointer resize(size_t len); | ||
| 396 | + | ||
| 286 | 397 | // Releases ownership of the underlying data buffer. It is the caller's | |
| 287 | 398 | // responsibility to ensure the buffer is appropriately freed. | |
| 288 | 399 | Buffer<void> release(); | |
@@ -471,13 +582,83 @@ class CipherCtxPointer final { | |||
| 471 | 582 | DeleteFnPtr<EVP_CIPHER_CTX, EVP_CIPHER_CTX_free> ctx_; | |
| 472 | 583 | }; | |
| 473 | 584 | ||
| 585 | + class EVPKeyCtxPointer final { | ||
| 586 | + public: | ||
| 587 | + EVPKeyCtxPointer(); | ||
| 588 | + explicit EVPKeyCtxPointer(EVP_PKEY_CTX* ctx); | ||
| 589 | + EVPKeyCtxPointer(EVPKeyCtxPointer&& other) noexcept; | ||
| 590 | + EVPKeyCtxPointer& operator=(EVPKeyCtxPointer&& other) noexcept; | ||
| 591 | + NCRYPTO_DISALLOW_COPY(EVPKeyCtxPointer) | ||
| 592 | + ~EVPKeyCtxPointer(); | ||
| 593 | + | ||
| 594 | + inline bool operator==(std::nullptr_t) const noexcept { | ||
| 595 | + return ctx_ == nullptr; | ||
| 596 | + } | ||
| 597 | + inline operator bool() const { return ctx_ != nullptr; } | ||
| 598 | + inline EVP_PKEY_CTX* get() const { return ctx_.get(); } | ||
| 599 | + void reset(EVP_PKEY_CTX* ctx = nullptr); | ||
| 600 | + EVP_PKEY_CTX* release(); | ||
| 601 | + | ||
| 602 | + bool initForDerive(const EVPKeyPointer& peer); | ||
| 603 | + DataPointer derive() const; | ||
| 604 | + | ||
| 605 | + bool initForParamgen(); | ||
| 606 | + bool setDhParameters(int prime_size, uint32_t generator); | ||
| 607 | + bool setDsaParameters(uint32_t bits, std::optional<int> q_bits); | ||
| 608 | + bool setEcParameters(int curve, int encoding); | ||
| 609 | + | ||
| 610 | + bool setRsaOaepMd(const EVP_MD* md); | ||
| 611 | + bool setRsaMgf1Md(const EVP_MD* md); | ||
| 612 | + bool setRsaPadding(int padding); | ||
| 613 | + bool setRsaKeygenPubExp(BignumPointer&& e); | ||
| 614 | + bool setRsaKeygenBits(int bits); | ||
| 615 | + bool setRsaPssKeygenMd(const EVP_MD* md); | ||
| 616 | + bool setRsaPssKeygenMgf1Md(const EVP_MD* md); | ||
| 617 | + bool setRsaPssSaltlen(int salt_len); | ||
| 618 | + bool setRsaImplicitRejection(); | ||
| 619 | + bool setRsaOaepLabel(DataPointer&& data); | ||
| 620 | + | ||
| 621 | + bool setSignatureMd(const EVPMDCtxPointer& md); | ||
| 622 | + | ||
| 623 | + bool publicCheck() const; | ||
| 624 | + bool privateCheck() const; | ||
| 625 | + | ||
| 626 | + bool verify(const Buffer<const unsigned char>& sig, | ||
| 627 | + const Buffer<const unsigned char>& data); | ||
| 628 | + DataPointer sign(const Buffer<const unsigned char>& data); | ||
| 629 | + bool signInto(const Buffer<const unsigned char>& data, | ||
| 630 | + Buffer<unsigned char>* sig); | ||
| 631 | + | ||
| 632 | + static constexpr int kDefaultRsaExponent = 0x10001; | ||
| 633 | + | ||
| 634 | + static bool setRsaPadding(EVP_PKEY_CTX* ctx, | ||
| 635 | + int padding, | ||
| 636 | + std::optional<int> salt_len = std::nullopt); | ||
| 637 | + | ||
| 638 | + EVPKeyPointer paramgen() const; | ||
| 639 | + | ||
| 640 | + bool initForEncrypt(); | ||
| 641 | + bool initForDecrypt(); | ||
| 642 | + bool initForKeygen(); | ||
| 643 | + int initForVerify(); | ||
| 644 | + int initForSign(); | ||
| 645 | + | ||
| 646 | + static EVPKeyCtxPointer New(const EVPKeyPointer& key); | ||
| 647 | + static EVPKeyCtxPointer NewFromID(int id); | ||
| 648 | + | ||
| 649 | + private: | ||
| 650 | + DeleteFnPtr<EVP_PKEY_CTX, EVP_PKEY_CTX_free> ctx_; | ||
| 651 | + }; | ||
| 652 | + | ||
| 474 | 653 | class EVPKeyPointer final { | |
| 475 | 654 | public: | |
| 476 | 655 | static EVPKeyPointer New(); | |
| 477 | 656 | static EVPKeyPointer NewRawPublic(int id, | |
| 478 | 657 | const Buffer<const unsigned char>& data); | |
| 479 | 658 | static EVPKeyPointer NewRawPrivate(int id, | |
| 480 | 659 | const Buffer<const unsigned char>& data); | |
| 660 | + static EVPKeyPointer NewDH(DHPointer&& dh); | ||
| 661 | + static EVPKeyPointer NewRSA(RSAPointer&& rsa); | ||
| 481 | 662 | ||
| 482 | 663 | enum class PKEncodingType { | |
| 483 | 664 | // RSAPublicKey / RSAPrivateKey according to PKCS#1. | |
@@ -578,6 +759,15 @@ class EVPKeyPointer final { | |||
| 578 | 759 | ||
| 579 | 760 | static bool IsRSAPrivateKey(const Buffer<const unsigned char>& buffer); | |
| 580 | 761 | ||
| 762 | + std::optional<uint32_t> getBytesOfRS() const; | ||
| 763 | + int getDefaultSignPadding() const; | ||
| 764 | + operator Rsa() const; | ||
| 765 | + | ||
| 766 | + bool isRsaVariant() const; | ||
| 767 | + bool isOneShotVariant() const; | ||
| 768 | + bool isSigVariant() const; | ||
| 769 | + bool validateDsaParameters() const; | ||
| 770 | + | ||
| 581 | 771 | private: | |
| 582 | 772 | DeleteFnPtr<EVP_PKEY, EVP_PKEY_free> pkey_; | |
| 583 | 773 | }; | |
@@ -663,9 +853,6 @@ struct StackOfX509Deleter { | |||
| 663 | 853 | }; | |
| 664 | 854 | using StackOfX509 = std::unique_ptr<STACK_OF(X509), StackOfX509Deleter>; | |
| 665 | 855 | ||
| 666 | - class X509Pointer; | ||
| 667 | - class X509View; | ||
| 668 | - | ||
| 669 | 856 | class SSLCtxPointer final { | |
| 670 | 857 | public: | |
| 671 | 858 | SSLCtxPointer() = default; | |
@@ -792,6 +979,14 @@ class X509View final { | |||
| 792 | 979 | CheckMatch checkEmail(const std::string_view email, int flags) const; | |
| 793 | 980 | CheckMatch checkIp(const std::string_view ip, int flags) const; | |
| 794 | 981 | ||
| 982 | + using UsageCallback = std::function<void(std::string_view)>; | ||
| 983 | + bool enumUsages(UsageCallback callback) const; | ||
| 984 | + | ||
| 985 | + template <typename T> | ||
| 986 | + using KeyCallback = std::function<bool(const T& t)>; | ||
| 987 | + bool ifRsa(KeyCallback<Rsa> callback) const; | ||
| 988 | + bool ifEc(KeyCallback<Ec> callback) const; | ||
| 989 | + | ||
| 795 | 990 | private: | |
| 796 | 991 | const X509* cert_ = nullptr; | |
| 797 | 992 | }; | |
@@ -948,6 +1143,77 @@ class ECKeyPointer final { | |||
| 948 | 1143 | DeleteFnPtr<EC_KEY, EC_KEY_free> key_; | |
| 949 | 1144 | }; | |
| 950 | 1145 | ||
| 1146 | + class EVPMDCtxPointer final { | ||
| 1147 | + public: | ||
| 1148 | + EVPMDCtxPointer(); | ||
| 1149 | + explicit EVPMDCtxPointer(EVP_MD_CTX* ctx); | ||
| 1150 | + EVPMDCtxPointer(EVPMDCtxPointer&& other) noexcept; | ||
| 1151 | + EVPMDCtxPointer& operator=(EVPMDCtxPointer&& other) noexcept; | ||
| 1152 | + NCRYPTO_DISALLOW_COPY(EVPMDCtxPointer) | ||
| 1153 | + ~EVPMDCtxPointer(); | ||
| 1154 | + | ||
| 1155 | + inline bool operator==(std::nullptr_t) noexcept { return ctx_ == nullptr; } | ||
| 1156 | + inline operator bool() const { return ctx_ != nullptr; } | ||
| 1157 | + inline EVP_MD_CTX* get() const { return ctx_.get(); } | ||
| 1158 | + inline operator EVP_MD_CTX*() const { return ctx_.get(); } | ||
| 1159 | + void reset(EVP_MD_CTX* ctx = nullptr); | ||
| 1160 | + EVP_MD_CTX* release(); | ||
| 1161 | + | ||
| 1162 | + bool digestInit(const EVP_MD* digest); | ||
| 1163 | + bool digestUpdate(const Buffer<const void>& in); | ||
| 1164 | + DataPointer digestFinal(size_t length); | ||
| 1165 | + bool digestFinalInto(Buffer<void>* buf); | ||
| 1166 | + size_t getExpectedSize(); | ||
| 1167 | + | ||
| 1168 | + std::optional<EVP_PKEY_CTX*> signInit(const EVPKeyPointer& key, | ||
| 1169 | + const EVP_MD* digest); | ||
| 1170 | + std::optional<EVP_PKEY_CTX*> verifyInit(const EVPKeyPointer& key, | ||
| 1171 | + const EVP_MD* digest); | ||
| 1172 | + | ||
| 1173 | + DataPointer signOneShot(const Buffer<const unsigned char>& buf) const; | ||
| 1174 | + DataPointer sign(const Buffer<const unsigned char>& buf) const; | ||
| 1175 | + bool verify(const Buffer<const unsigned char>& buf, | ||
| 1176 | + const Buffer<const unsigned char>& sig) const; | ||
| 1177 | + | ||
| 1178 | + const EVP_MD* getDigest() const; | ||
| 1179 | + size_t getDigestSize() const; | ||
| 1180 | + bool hasXofFlag() const; | ||
| 1181 | + | ||
| 1182 | + bool copyTo(const EVPMDCtxPointer& other) const; | ||
| 1183 | + | ||
| 1184 | + static EVPMDCtxPointer New(); | ||
| 1185 | + | ||
| 1186 | + private: | ||
| 1187 | + DeleteFnPtr<EVP_MD_CTX, EVP_MD_CTX_free> ctx_; | ||
| 1188 | + }; | ||
| 1189 | + | ||
| 1190 | + class HMACCtxPointer final { | ||
| 1191 | + public: | ||
| 1192 | + HMACCtxPointer(); | ||
| 1193 | + explicit HMACCtxPointer(HMAC_CTX* ctx); | ||
| 1194 | + HMACCtxPointer(HMACCtxPointer&& other) noexcept; | ||
| 1195 | + HMACCtxPointer& operator=(HMACCtxPointer&& other) noexcept; | ||
| 1196 | + NCRYPTO_DISALLOW_COPY(HMACCtxPointer) | ||
| 1197 | + ~HMACCtxPointer(); | ||
| 1198 | + | ||
| 1199 | + inline bool operator==(std::nullptr_t) noexcept { return ctx_ == nullptr; } | ||
| 1200 | + inline operator bool() const { return ctx_ != nullptr; } | ||
| 1201 | + inline HMAC_CTX* get() const { return ctx_.get(); } | ||
| 1202 | + inline operator HMAC_CTX*() const { return ctx_.get(); } | ||
| 1203 | + void reset(HMAC_CTX* ctx = nullptr); | ||
| 1204 | + HMAC_CTX* release(); | ||
| 1205 | + | ||
| 1206 | + bool init(const Buffer<const void>& buf, const EVP_MD* md); | ||
| 1207 | + bool update(const Buffer<const void>& buf); | ||
| 1208 | + DataPointer digest(); | ||
| 1209 | + bool digestInto(Buffer<void>* buf); | ||
| 1210 | + | ||
| 1211 | + static HMACCtxPointer New(); | ||
| 1212 | + | ||
| 1213 | + private: | ||
| 1214 | + DeleteFnPtr<HMAC_CTX, HMAC_CTX_free> ctx_; | ||
| 1215 | + }; | ||
| 1216 | + | ||
| 951 | 1217 | #ifndef OPENSSL_NO_ENGINE | |
| 952 | 1218 | class EnginePointer final { | |
| 953 | 1219 | public: | |
@@ -1025,12 +1291,17 @@ Buffer<char> ExportChallenge(const char* input, size_t length); | |||
| 1025 | 1291 | // KDF | |
| 1026 | 1292 | ||
| 1027 | 1293 | const EVP_MD* getDigestByName(const std::string_view name); | |
| 1294 | + const EVP_CIPHER* getCipherByName(const std::string_view name); | ||
| 1028 | 1295 | ||
| 1029 | 1296 | // Verify that the specified HKDF output length is valid for the given digest. | |
| 1030 | 1297 | // The maximum length for HKDF output for a given digest is 255 times the | |
| 1031 | 1298 | // hash size for the given digest algorithm. | |
| 1032 | 1299 | bool checkHkdfLength(const EVP_MD* md, size_t length); | |
| 1033 | 1300 | ||
| 1301 | + bool extractP1363(const Buffer<const unsigned char>& buf, | ||
| 1302 | + unsigned char* dest, | ||
| 1303 | + size_t n); | ||
| 1304 | + | ||
| 1034 | 1305 | DataPointer hkdf(const EVP_MD* md, | |
| 1035 | 1306 | const Buffer<const unsigned char>& key, | |
| 1036 | 1307 | const Buffer<const unsigned char>& info, | |
| Back | FazBrowse Home | New Git URL |
0 commit comments