proxygen
fizz::extensions::TokenBindingConstructor Class Reference

#include <TokenBindingConstructor.h>

Static Public Member Functions

static TokenBinding createTokenBinding (EVP_PKEY &keyPair, const Buf &ekm, TokenBindingKeyParameters negotiatedParameters, TokenBindingType type)
 

Static Private Member Functions

static Buf encodeEcKey (const folly::ssl::EcKeyUniquePtr &ecKey)
 
static Buf encodeEcdsaSignature (const folly::ssl::EcdsaSigUniquePtr &signature)
 
static Buf signWithEcKey (const folly::ssl::EcKeyUniquePtr &key, const Buf &message)
 
static void addBignumToSignature (const Buf &signature, BIGNUM *bigNum)
 

Detailed Description

Definition at line 17 of file TokenBindingConstructor.h.

Member Function Documentation

void fizz::extensions::TokenBindingConstructor::addBignumToSignature ( const Buf signature,
BIGNUM *  bigNum 
)
staticprivate

Definition at line 87 of file TokenBindingConstructor.cpp.

89  {
90  auto length = BN_num_bytes(bigNum);
91  if (length > TokenBindingUtils::kP256EcKeySize / 2) {
92  throw std::runtime_error("ECDSA sig bignum is of incorrect size");
93  }
94  // if a bignum is less than 32 bytes long, it has a most significant byte
95  // of 0, so we have to pad the buffer
96  size_t padding = (TokenBindingUtils::kP256EcKeySize / 2) - length;
97  std::memset(signature->writableTail(), 0x00, padding);
98  signature->append(padding);
99 
100  auto lenActual = BN_bn2bin(bigNum, signature->writableTail());
101  signature->append(lenActual);
102  if (lenActual != length) {
103  throw std::runtime_error("bn2bin returned unexpected value");
104  }
105 }
static constexpr uint8_t kP256EcKeySize
Definition: Utils.h:18
TokenBinding fizz::extensions::TokenBindingConstructor::createTokenBinding ( EVP_PKEY &  keyPair,
const Buf ekm,
TokenBindingKeyParameters  negotiatedParameters,
TokenBindingType  type 
)
static

Definition at line 24 of file TokenBindingConstructor.cpp.

References folly::IOBuf::create(), fizz::extensions::TokenBinding::extensions, fizz::extensions::TokenBindingID::key_parameters, folly::gen::move, fizz::extensions::TokenBinding::signature, fizz::extensions::TokenBinding::tokenbinding_type, fizz::extensions::TokenBinding::tokenbindingid, and type.

28  {
29  if (negotiatedParameters != TokenBindingKeyParameters::ecdsap256) {
30  throw std::runtime_error(folly::to<std::string>(
31  "key params not implemented: ", negotiatedParameters));
32  }
33 
34  EcKeyUniquePtr ecKey(EVP_PKEY_get1_EC_KEY(&keyPair));
35  if (!ecKey) {
36  throw std::runtime_error("Unable to retrieve EC Key");
37  }
38 
39  TokenBinding binding;
40  binding.tokenbinding_type = type;
41  binding.extensions = folly::IOBuf::create(0);
42 
43  auto message =
44  TokenBindingUtils::constructMessage(type, negotiatedParameters, ekm);
45  binding.signature = signWithEcKey(ecKey, message);
46 
47  TokenBindingID id;
48  id.key_parameters = negotiatedParameters;
49  id.key = encodeEcKey(ecKey);
50  binding.tokenbindingid = std::move(id);
51  return binding;
52 }
Definition: test.c:42
static Buf constructMessage(const TokenBindingType &type, const TokenBindingKeyParameters &keyParams, const Buf &ekm)
Definition: Utils.h:20
static std::unique_ptr< IOBuf > create(std::size_t capacity)
Definition: IOBuf.cpp:229
PskType type
constexpr detail::Map< Move > move
Definition: Base-inl.h:2567
static Buf signWithEcKey(const folly::ssl::EcKeyUniquePtr &key, const Buf &message)
std::unique_ptr< EC_KEY, EcKeyDeleter > EcKeyUniquePtr
static Buf encodeEcKey(const folly::ssl::EcKeyUniquePtr &ecKey)
Buf fizz::extensions::TokenBindingConstructor::encodeEcdsaSignature ( const folly::ssl::EcdsaSigUniquePtr signature)
staticprivate

Definition at line 71 of file TokenBindingConstructor.cpp.

References folly::IOBuf::create(), folly::portability::ssl::ECDSA_SIG_get0(), and s.

72  {
73  BIGNUM* r;
74  BIGNUM* s;
75  ECDSA_SIG_get0(signature.get(), (const BIGNUM**)&r, (const BIGNUM**)&s);
76  if (!r || !s) {
77  throw std::runtime_error("Unable to retrieve Bignum from ECDSA sig");
78  }
79 
80  Buf encodedSignature =
82  addBignumToSignature(encodedSignature, r);
83  addBignumToSignature(encodedSignature, s);
84  return encodedSignature;
85 }
void ECDSA_SIG_get0(const ECDSA_SIG *sig, const BIGNUM **pr, const BIGNUM **ps)
Definition: OpenSSL.cpp:417
static std::unique_ptr< IOBuf > create(std::size_t capacity)
Definition: IOBuf.cpp:229
static constexpr uint8_t kP256EcKeySize
Definition: Utils.h:18
static void addBignumToSignature(const Buf &signature, BIGNUM *bigNum)
std::unique_ptr< folly::IOBuf > Buf
Definition: Types.h:22
static set< string > s
Buf fizz::extensions::TokenBindingConstructor::encodeEcKey ( const folly::ssl::EcKeyUniquePtr ecKey)
staticprivate

Definition at line 107 of file TokenBindingConstructor.cpp.

References fizz::detail::encodeECPublicKey().

107  {
108  auto ecKeyBuf = detail::encodeECPublicKey(ecKey);
109  if (ecKeyBuf->isChained() ||
110  ecKeyBuf->length() != TokenBindingUtils::kP256EcKeySize + 1) {
111  throw std::runtime_error("Incorrect encoded EC Key Length");
112  }
113  ecKeyBuf->writableData()[0] = TokenBindingUtils::kP256EcKeySize;
114  return ecKeyBuf;
115 }
static constexpr uint8_t kP256EcKeySize
Definition: Utils.h:18
std::unique_ptr< folly::IOBuf > encodeECPublicKey(const folly::ssl::EvpPkeyUniquePtr &key)
Buf fizz::extensions::TokenBindingConstructor::signWithEcKey ( const folly::ssl::EcKeyUniquePtr key,
const Buf message 
)
staticprivate

Definition at line 54 of file TokenBindingConstructor.cpp.

References fizz::Sha< Sha256 >::hash().

56  {
57  std::array<uint8_t, fizz::Sha256::HashLen> hashedMessage;
59  *message,
60  folly::MutableByteRange(hashedMessage.data(), hashedMessage.size()));
61 
62  EcdsaSigUniquePtr ecSignature(
63  ECDSA_do_sign(hashedMessage.data(), hashedMessage.size(), key.get()));
64  if (!ecSignature.get()) {
65  throw std::runtime_error("Unable to sign message with EC Key");
66  }
67 
68  return encodeEcdsaSignature(ecSignature);
69 }
Definition: test.c:42
static Buf encodeEcdsaSignature(const folly::ssl::EcdsaSigUniquePtr &signature)
std::unique_ptr< ECDSA_SIG, EcdsaSigDeleter > EcdsaSigUniquePtr
static void hash(const folly::IOBuf &in, folly::MutableByteRange out)

The documentation for this class was generated from the following files: