@@ -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,
0 commit comments