blob: a98485095d0f1ee7c10fabf4f18013284a6202f7 [file] [log] [blame]
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef NET_SSL_TOKEN_BINDING_H_
#define NET_SSL_TOKEN_BINDING_H_
#include <string>
#include <vector>
#include "base/strings/string_piece.h"
#include "crypto/ec_private_key.h"
#include "net/base/net_errors.h"
#include "net/base/net_export.h"
namespace net {
enum class TokenBindingType {
PROVIDED = 0,
REFERRED = 1,
};
// Takes an exported keying material value |ekm| from the TLS layer and a token
// binding key |key| and signs the EKM, putting the signature in |*out|. Returns
// true on success or false if there's an error in the signing operations.
bool SignTokenBindingEkm(base::StringPiece ekm,
crypto::ECPrivateKey* key,
std::vector<uint8_t>* out);
// Given a vector of serialized TokenBinding structs (as defined in
// draft-ietf-tokbind-protocol-04), this function combines them to form the
// serialized TokenBindingMessage struct in |*out|. This function returns a net
// error.
//
// struct {
// TokenBinding tokenbindings<0..2^16-1>;
// } TokenBindingMessage;
Error BuildTokenBindingMessageFromTokenBindings(
const std::vector<base::StringPiece>& token_bindings,
std::string* out);
// Builds a TokenBinding struct of type |type| with a TokenBindingID created
// from |*key| and a signature of |ekm| using |*key| to sign.
//
// enum {
// rsa2048_pkcs1.5(0), rsa2048_pss(1), ecdsap256(2), (255)
// } TokenBindingKeyParameters;
//
// struct {
// opaque modulus<1..2^16-1>;
// opaque publicexponent<1..2^8-1>;
// } RSAPublicKey;
//
// struct {
// opaque point <1..2^8-1>;
// } ECPoint;
//
// enum {
// provided_token_binding(0), referred_token_binding(1), (255)
// } TokenBindingType;
//
// struct {
// TokenBindingType tokenbinding_type;
// TokenBindingKeyParameters key_parameters;
// select (key_parameters) {
// case rsa2048_pkcs1.5:
// case rsa2048_pss:
// RSAPublicKey rsapubkey;
// case ecdsap256:
// ECPoint point;
// }
// } TokenBindingID;
//
// struct {
// TokenBindingID tokenbindingid;
// opaque signature<0..2^16-1>;// Signature over the exported keying
// // material value
// Extension extensions<0..2^16-1>;
// } TokenBinding;
Error BuildTokenBinding(TokenBindingType type,
crypto::ECPrivateKey* key,
const std::vector<uint8_t>& ekm,
std::string* out);
// Represents a parsed TokenBinding from a TokenBindingMessage.
struct TokenBinding {
TokenBinding();
TokenBindingType type;
std::string ec_point;
std::string signature;
};
// Given a TokenBindingMessage, parses the TokenBinding structs from it, putting
// them into |*token_bindings|. If there is an error parsing the
// TokenBindingMessage or the key parameter for any TokenBinding in the
// TokenBindingMessage is not ecdsap256, then this function returns false.
NET_EXPORT_PRIVATE bool ParseTokenBindingMessage(
base::StringPiece token_binding_message,
std::vector<TokenBinding>* token_bindings);
// Takes an ECPoint |ec_point| from a TokenBindingID and |signature| from a
// TokenBinding and verifies that |signature| is the signature of |ekm| using
// |ec_point| as the public key. Returns true if the signature verifies and
// false if it doesn't or some other error occurs in verification. This function
// is only provided for testing.
NET_EXPORT_PRIVATE bool VerifyEKMSignature(base::StringPiece ec_point,
base::StringPiece signature,
base::StringPiece ekm);
} // namespace net
#endif // NET_SSL_TOKEN_BINDING_H_