From d785003e9979068acc40a679f6470bd28f38fa01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Roman=20Smr=C5=BE?= Date: Wed, 29 Jul 2020 22:37:37 +0200 Subject: Add owner signature for owned identity This signature is required and verified, but was not properly added by the builder on commit. --- src/identity.cpp | 12 +++++++++++- src/pubkey.h | 12 ++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/identity.cpp b/src/identity.cpp index 7364a8b..d7dd1f9 100644 --- a/src/identity.cpp +++ b/src/identity.cpp @@ -117,8 +117,18 @@ Identity Identity::Builder::commit() const throw runtime_error("failed to load secret key"); auto sdata = key->sign(idata); + if (idata->owner) { + if (auto okey = SecretKey::load((*idata->owner)->data->keyIdentity)) + sdata = okey->signAdd(sdata); + else + throw runtime_error("failed to load secret key"); + } + + auto p = Identity::Priv::validate({ sdata }); + if (!p) + throw runtime_error("failed to validate committed identity"); - return Identity(Identity::Priv::validate({ sdata })); + return Identity(std::move(p)); } void Identity::Builder::name(const string & val) diff --git a/src/pubkey.h b/src/pubkey.h index 7b80752..ef7e322 100644 --- a/src/pubkey.h +++ b/src/pubkey.h @@ -38,6 +38,8 @@ public: template Stored> sign(const Stored &) const; + template + Stored> signAdd(const Stored> &) const; private: vector sign(const Digest &) const; @@ -89,6 +91,16 @@ Stored> SecretKey::sign(const Stored & val) const return st.store(Signed(val, { sig })); } +template +Stored> SecretKey::signAdd(const Stored> & val) const +{ + auto st = val.ref().storage(); + auto sig = st.store(Signature(pub(), sign(val.ref().digest()))); + auto sigs = val->sigs; + sigs.push_back(st.store(Signature(pub(), sign(val->data.ref().digest())))); + return st.store(Signed(val->data, sigs)); +} + template Signed Signed::load(const Ref & ref) { -- cgit v1.2.3