Botan 3.11.0
Crypto and TLS for C&
credentials_manager.cpp
Go to the documentation of this file.
1/*
2* Credentials Manager
3* (C) 2011,2012 Jack Lloyd
4*
5* Botan is released under the Simplified BSD License (see license.txt)
6*/
7
8#include <botan/credentials_manager.h>
9
10#include <botan/pkix_types.h>
11#include <botan/tls_external_psk.h>
12#include <botan/x509cert.h>
13#include <botan/internal/fmt.h>
14
15namespace Botan {
16
17std::string Credentials_Manager::psk_identity_hint(const std::string& /*unused*/, const std::string& /*unused*/) {
18 return "";
19}
20
21std::string Credentials_Manager::psk_identity(const std::string& /*unused*/,
22 const std::string& /*unused*/,
23 const std::string& /*unused*/) {
24 return "";
25}
26
27SymmetricKey Credentials_Manager::psk(const std::string& type,
28 const std::string& context,
29 const std::string& identity) {
30 auto side = [&] {
31 if(type == "tls-client") {
33 } else if(type == "tls-server") {
35 } else {
36 throw Internal_Error(fmt("No PSK set for type {}", type));
37 }
38 }();
39
40 // New applications should use the appropriate credentials methods. This is a
41 // retrofit of the behaviour before Botan 3.2.0 and will be removed in a
42 // future major release.
43 //
44 // TODO: deprecate `psk("...", "session-ticket" | "dtls-cookie-secret")`
45 if(side == TLS::Connection_Side::Server && context == "session-ticket") {
46 if(auto key = session_ticket_key(); !key.empty()) {
47 return SymmetricKey(std::move(key));
48 }
49 } else if(side == TLS::Connection_Side::Server && context == "dtls-cookie-secret") {
50 if(auto key = dtls_cookie_secret(); !key.empty()) {
51 return SymmetricKey(std::move(key));
52 }
53 } else /* context is a host name */ {
54 // Assuming that find_preshared_keys returns _exactly_ one or no keys when
55 // searching for a single specific identity.
56 if(auto psks = find_preshared_keys(context, side, {identity}); psks.size() == 1) {
57 return SymmetricKey(psks.front().extract_master_secret());
58 }
59 }
60
61 throw Internal_Error(fmt("No PSK set for identity {}", identity));
62}
63
64std::vector<TLS::ExternalPSK> Credentials_Manager::find_preshared_keys(std::string_view /* host */,
65 TLS::Connection_Side /* whoami */,
66 const std::vector<std::string>& /* identities */,
67 const std::optional<std::string>& /* prf */) {
68 return {};
69}
70
71std::optional<TLS::ExternalPSK> Credentials_Manager::choose_preshared_key(std::string_view host,
73 const std::vector<std::string>& identities,
74 const std::optional<std::string>& prf) {
75 auto psks = find_preshared_keys(host, whoami, identities, prf);
76 if(psks.empty()) {
77 return std::nullopt;
78 } else {
79 return std::move(psks.front());
80 }
81}
82
83std::vector<X509_Certificate> Credentials_Manager::find_cert_chain(
84 const std::vector<std::string>& key_types,
85 const std::vector<AlgorithmIdentifier>& cert_signature_schemes,
86 const std::vector<X509_DN>& /*unused*/,
87 const std::string& type,
88 const std::string& context) {
89 return cert_chain(key_types, cert_signature_schemes, type, context);
90}
91
92std::shared_ptr<Public_Key> Credentials_Manager::find_raw_public_key(const std::vector<std::string>& /* key_types */,
93 const std::string& /* type */,
94 const std::string& /* context */) {
95 return nullptr;
96}
97
98std::vector<X509_Certificate> Credentials_Manager::cert_chain(const std::vector<std::string>& /*unused*/,
99 const std::vector<AlgorithmIdentifier>& /*unused*/,
100 const std::string& /*unused*/,
101 const std::string& /*unused*/) {
102 return std::vector<X509_Certificate>();
103}
104
106 const std::string& cert_key_type,
107 const std::vector<AlgorithmIdentifier>& cert_signature_schemes,
108 const std::string& type,
109 const std::string& context) {
110 return find_cert_chain({cert_key_type}, cert_signature_schemes, std::vector<X509_DN>(), type, context);
111}
112
113std::shared_ptr<Private_Key> Credentials_Manager::private_key_for(const X509_Certificate& /*unused*/,
114 const std::string& /*unused*/,
115 const std::string& /*unused*/) {
116 return nullptr;
117}
118
119std::shared_ptr<Private_Key> Credentials_Manager::private_key_for(const Public_Key& /* raw_public_key */,
120 const std::string& /* type */,
121 const std::string& /* context */) {
122 return nullptr;
123}
124
128
132
133std::vector<Certificate_Store*> Credentials_Manager::trusted_certificate_authorities(const std::string& /*unused*/,
134 const std::string& /*unused*/) {
135 return std::vector<Certificate_Store*>();
136}
137
138} // namespace Botan
virtual secure_vector< uint8_t > dtls_cookie_secret()
virtual std::vector< TLS::ExternalPSK > find_preshared_keys(std::string_view host, TLS::Connection_Side whoami, const std::vector< std::string > &identities={}, const std::optional< std::string > &prf=std::nullopt)
virtual std::vector< X509_Certificate > cert_chain(const std::vector< std::string > &cert_key_types, const std::vector< AlgorithmIdentifier > &cert_signature_schemes, const std::string &type, const std::string &context)
virtual std::string psk_identity(const std::string &type, const std::string &context, const std::string &identity_hint)
virtual std::string psk_identity_hint(const std::string &type, const std::string &context)
virtual std::vector< Certificate_Store * > trusted_certificate_authorities(const std::string &type, const std::string &context)
virtual std::vector< X509_Certificate > find_cert_chain(const std::vector< std::string > &cert_key_types, const std::vector< AlgorithmIdentifier > &cert_signature_schemes, const std::vector< X509_DN > &acceptable_CAs, const std::string &type, const std::string &context)
virtual std::shared_ptr< Public_Key > find_raw_public_key(const std::vector< std::string > &key_types, const std::string &type, const std::string &context)
virtual SymmetricKey psk(const std::string &type, const std::string &context, const std::string &identity)
virtual std::optional< TLS::ExternalPSK > choose_preshared_key(std::string_view host, TLS::Connection_Side whoami, const std::vector< std::string > &identities, const std::optional< std::string > &prf=std::nullopt)
virtual std::shared_ptr< Private_Key > private_key_for(const X509_Certificate &cert, const std::string &type, const std::string &context)
virtual secure_vector< uint8_t > session_ticket_key()
std::vector< X509_Certificate > cert_chain_single_type(const std::string &cert_key_type, const std::vector< AlgorithmIdentifier > &cert_signature_schemes, const std::string &type, const std::string &context)
OctetString SymmetricKey
Definition symkey.h:140
std::string fmt(std::string_view format, const T &... args)
Definition fmt.h:53
std::vector< T, secure_allocator< T > > secure_vector
Definition secmem.h:68