1
#pragma once
2

            
3
#include "source/common/common/logger.h"
4

            
5
#include "openssl/base.h"
6

            
7
namespace Envoy {
8
namespace Extensions {
9
namespace Common {
10
namespace Aws {
11

            
12
class SigV4AKeyDerivationBase {
13
public:
14
337
  virtual ~SigV4AKeyDerivationBase() = default;
15
  virtual absl::StatusOr<EC_KEY*> derivePrivateKey(absl::string_view access_key_id,
16
                                                   absl::string_view secret_access_key) PURE;
17
  virtual bool derivePublicKey(EC_KEY* ec_key) PURE;
18
};
19

            
20
class SigV4AKeyDerivation : public SigV4AKeyDerivationBase,
21
                            public Logger::Loggable<Logger::Id::aws> {
22
public:
23
  absl::StatusOr<EC_KEY*> derivePrivateKey(absl::string_view access_key_id,
24
                                           absl::string_view secret_access_key) override;
25
  bool derivePublicKey(EC_KEY* ec_key) override;
26

            
27
private:
28
  bool constantTimeLessThanOrEqualTo(std::vector<uint8_t> lhs_raw_be_bigint,
29
                                     std::vector<uint8_t> rhs_raw_be_bigint);
30
  void constantTimeAddOne(std::vector<uint8_t>* raw_be_bigint);
31
};
32

            
33
} // namespace Aws
34
} // namespace Common
35
} // namespace Extensions
36
} // namespace Envoy