Skip to content

Commit faee855

Browse files
authored
Support custom signing routines in SignaturePrivateKey (#424)
This enables support for signing with non-extractable private keys (e.g. TPM-bound).
1 parent 6503550 commit faee855

2 files changed

Lines changed: 31 additions & 2 deletions

File tree

‎include/mls/crypto.h‎

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -254,12 +254,15 @@ struct PublicJWK
254254

255255
struct SignaturePrivateKey
256256
{
257+
using SignerFunc = std::function<bytes(const std::vector<uint8_t>&)>;
258+
257259
static SignaturePrivateKey generate(CipherSuite suite);
258260
static SignaturePrivateKey parse(CipherSuite suite, const bytes& data);
259261
static SignaturePrivateKey parse_der(CipherSuite suite, const bytes& data);
260262
static SignaturePrivateKey derive(CipherSuite suite, const bytes& secret);
261263
static SignaturePrivateKey from_jwk(CipherSuite suite,
262264
const std::string& json_str);
265+
static SignaturePrivateKey from_func(SignerFunc func, bytes pub_data);
263266

264267
SignaturePrivateKey() = default;
265268

@@ -276,7 +279,11 @@ struct SignaturePrivateKey
276279
TLS_SERIALIZABLE(data)
277280

278281
private:
279-
SignaturePrivateKey(bytes priv_data, bytes pub_data);
282+
SignerFunc _sign_func;
283+
284+
SignaturePrivateKey(bytes priv_data,
285+
bytes pub_data,
286+
SignerFunc func = SignerFunc());
280287
};
281288

282289
} // namespace MLS_NAMESPACE

‎src/crypto.cpp‎

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -505,19 +505,31 @@ SignaturePrivateKey::sign(const CipherSuite& suite,
505505
{
506506
auto label_plus = mls_1_0_plus(label);
507507
const auto content = tls::marshal(SignContent{ label_plus, message });
508+
509+
if (_sign_func) {
510+
return _sign_func(content);
511+
}
512+
508513
const auto priv = suite.sig().deserialize_private(data);
509514
return suite.sig().sign(content, *priv);
510515
}
511516

512-
SignaturePrivateKey::SignaturePrivateKey(bytes priv_data, bytes pub_data)
517+
SignaturePrivateKey::SignaturePrivateKey(bytes priv_data,
518+
bytes pub_data,
519+
SignerFunc func)
513520
: data(std::move(priv_data))
514521
, public_key{ std::move(pub_data) }
522+
, _sign_func{ std::move(func) }
515523
{
516524
}
517525

518526
void
519527
SignaturePrivateKey::set_public_key(CipherSuite suite)
520528
{
529+
if (_sign_func) {
530+
throw std::runtime_error("not implemented");
531+
}
532+
521533
const auto priv = suite.sig().deserialize_private(data);
522534
auto pub = priv->public_key();
523535
public_key.data = suite.sig().serialize(*pub);
@@ -533,9 +545,19 @@ SignaturePrivateKey::from_jwk(CipherSuite suite, const std::string& json_str)
533545
return { priv_data, pub_data };
534546
}
535547

548+
SignaturePrivateKey
549+
SignaturePrivateKey::from_func(SignerFunc func, bytes pub_data)
550+
{
551+
return { bytes(), std::move(pub_data), std::move(func) };
552+
}
553+
536554
std::string
537555
SignaturePrivateKey::to_jwk(CipherSuite suite) const
538556
{
557+
if (_sign_func) {
558+
throw std::runtime_error("not implemented");
559+
}
560+
539561
const auto priv = suite.sig().deserialize_private(data);
540562
return suite.sig().export_jwk_private(*priv);
541563
}

0 commit comments

Comments
 (0)