Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions src/libstore-tests/common-protocol.cc
Original file line number Diff line number Diff line change
Expand Up @@ -140,8 +140,8 @@ CHARACTERIZATION_TEST(
.outPath = StorePath{"g1w7hy3qg1w7hy3qg1w7hy3qg1w7hy3q-foo"},
.signatures =
{
"asdf:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"qwer:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
Signature{.keyName = "asdf", .sig = std::string(64, '\0')},
Signature{.keyName = "qwer", .sig = std::string(64, '\0')},
},
},
{
Expand All @@ -160,8 +160,8 @@ READ_CHARACTERIZATION_TEST(
.outPath = StorePath{"g1w7hy3qg1w7hy3qg1w7hy3qg1w7hy3q-foo"},
.signatures =
{
"asdf:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"qwer:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
Signature{.keyName = "asdf", .sig = std::string(64, '\0')},
Signature{.keyName = "qwer", .sig = std::string(64, '\0')},
},
},
{
Expand Down
4 changes: 2 additions & 2 deletions src/libstore-tests/nar-info.cc
Original file line number Diff line number Diff line change
Expand Up @@ -60,8 +60,8 @@ static NarInfo makeNarInfo(const Store & store, bool includeImpureInfo)
info.registrationTime = 23423;
info.ultimate = true;
info.sigs = {
"asdf:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"qwer:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
Signature{.keyName = "asdf", .sig = std::string(64, '\0')},
Signature{.keyName = "qwer", .sig = std::string(64, '\0')},
};

info.url = "nar/1w1fff338fvdw53sqgamddn1b2xgds473pv6y13gizdbqjv4i5p3.nar.xz";
Expand Down
4 changes: 2 additions & 2 deletions src/libstore-tests/path-info.cc
Original file line number Diff line number Diff line change
Expand Up @@ -67,8 +67,8 @@ static ValidPathInfo makeFullKeyed(const Store & store, bool includeImpureInfo)
info.registrationTime = 23423;
info.ultimate = true;
info.sigs = {
"asdf:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"qwer:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
Signature{.keyName = "asdf", .sig = std::string(64, '\0')},
Signature{.keyName = "qwer", .sig = std::string(64, '\0')},
};
}
return info;
Expand Down
2 changes: 1 addition & 1 deletion src/libstore-tests/realisation.cc
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ INSTANTIATE_TEST_SUITE_P(
auto r = simple;
// FIXME actually sign properly
r.signatures = {
"asdf:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
Signature{.keyName = "asdf", .sig = std::string(64, '\0')},
};
return r;
}(),
Expand Down
12 changes: 6 additions & 6 deletions src/libstore-tests/serve-protocol.cc
Original file line number Diff line number Diff line change
Expand Up @@ -111,8 +111,8 @@ VERSIONED_CHARACTERIZATION_TEST(
.outPath = StorePath{"g1w7hy3qg1w7hy3qg1w7hy3qg1w7hy3q-foo"},
.signatures =
{
"asdf:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"qwer:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
Signature{.keyName = "asdf", .sig = std::string(64, '\0')},
Signature{.keyName = "qwer", .sig = std::string(64, '\0')},
},
},
{
Expand All @@ -133,8 +133,8 @@ VERSIONED_READ_CHARACTERIZATION_TEST(
.outPath = StorePath{"g1w7hy3qg1w7hy3qg1w7hy3qg1w7hy3q-foo"},
.signatures =
{
"asdf:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"qwer:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
Signature{.keyName = "asdf", .sig = std::string(64, '\0')},
Signature{.keyName = "qwer", .sig = std::string(64, '\0')},
},
},
{
Expand Down Expand Up @@ -329,8 +329,8 @@ VERSIONED_CHARACTERIZATION_TEST(
info.narSize = 34878;
info.sigs =
{
"fake-sig-1:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"fake-sig-2:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
Signature{.keyName = "fake-sig-1", .sig = std::string(64, '\0')},
Signature{.keyName = "fake-sig-2", .sig = std::string(64, '\0')},
},
static_cast<UnkeyedValidPathInfo>(std::move(info));
}),
Expand Down
12 changes: 6 additions & 6 deletions src/libstore-tests/worker-protocol.cc
Original file line number Diff line number Diff line change
Expand Up @@ -164,8 +164,8 @@ VERSIONED_CHARACTERIZATION_TEST(
.outPath = StorePath{"g1w7hy3qg1w7hy3qg1w7hy3qg1w7hy3q-foo"},
.signatures =
{
"asdf:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"qwer:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
Signature{.keyName = "asdf", .sig = std::string(64, '\0')},
Signature{.keyName = "qwer", .sig = std::string(64, '\0')},
},
},
{
Expand All @@ -186,8 +186,8 @@ VERSIONED_READ_CHARACTERIZATION_TEST(
.outPath = StorePath{"g1w7hy3qg1w7hy3qg1w7hy3qg1w7hy3q-foo"},
.signatures =
{
"asdf:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"qwer:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
Signature{.keyName = "asdf", .sig = std::string(64, '\0')},
Signature{.keyName = "qwer", .sig = std::string(64, '\0')},
},
},
{
Expand Down Expand Up @@ -549,8 +549,8 @@ VERSIONED_CHARACTERIZATION_TEST(
info.narSize = 34878;
info.sigs =
{
"fake-sig-1:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"fake-sig-2:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
Signature{.keyName = "fake-sig-1", .sig = std::string(64, '\0')},
Signature{.keyName = "fake-sig-2", .sig = std::string(64, '\0')},
},
info;
}),
Expand Down
2 changes: 1 addition & 1 deletion src/libstore/binary-cache-store.cc
Original file line number Diff line number Diff line change
Expand Up @@ -565,7 +565,7 @@ std::shared_ptr<SourceAccessor> BinaryCacheStore::getFSAccessor(const StorePath
return getRemoteFSAccessor(requireValidPath)->accessObject(storePath);
}

void BinaryCacheStore::addSignatures(const StorePath & storePath, const StringSet & sigs)
void BinaryCacheStore::addSignatures(const StorePath & storePath, const std::set<Signature> & sigs)
{
/* Note: this is inherently racy since there is no locking on
binary caches. In particular, with S3 this unreliable, even
Expand Down
12 changes: 12 additions & 0 deletions src/libstore/common-protocol.cc
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
#include "nix/store/common-protocol-impl.hh"
#include "nix/util/archive.hh"
#include "nix/store/derivations.hh"
#include "nix/util/signature/local-keys.hh"

#include <nlohmann/json.hpp>

Expand Down Expand Up @@ -99,4 +100,15 @@ void CommonProto::Serialise<std::optional<ContentAddress>>::write(
conn.to << (caOpt ? renderContentAddress(*caOpt) : "");
}

Signature CommonProto::Serialise<Signature>::read(const StoreDirConfig & store, CommonProto::ReadConn conn)
{
return Signature::parse(readString(conn.from));
}

void CommonProto::Serialise<Signature>::write(
const StoreDirConfig & store, CommonProto::WriteConn conn, const Signature & sig)
{
conn.to << sig.to_string();
}

} // namespace nix
4 changes: 2 additions & 2 deletions src/libstore/daemon.cc
Original file line number Diff line number Diff line change
Expand Up @@ -861,7 +861,7 @@ static void performOp(

case WorkerProto::Op::AddSignatures: {
auto path = WorkerProto::Serialise<StorePath>::read(*store, rconn);
StringSet sigs = readStrings<StringSet>(conn.from);
auto sigs = WorkerProto::Serialise<std::set<Signature>>::read(*store, rconn);
logger->startWork();
store->addSignatures(path, sigs);
logger->stopWork();
Expand All @@ -886,7 +886,7 @@ static void performOp(
info.deriver = std::move(deriver);
info.references = WorkerProto::Serialise<StorePathSet>::read(*store, rconn);
conn.from >> info.registrationTime >> info.narSize >> info.ultimate;
info.sigs = readStrings<StringSet>(conn.from);
info.sigs = WorkerProto::Serialise<std::set<Signature>>::read(*store, rconn);
info.ca = ContentAddress::parseOpt(readString(conn.from));
conn.from >> repair >> dontCheckSigs;
if (!trusted && dontCheckSigs)
Expand Down
2 changes: 1 addition & 1 deletion src/libstore/include/nix/store/binary-cache-store.hh
Original file line number Diff line number Diff line change
Expand Up @@ -205,7 +205,7 @@ public:

std::shared_ptr<SourceAccessor> getFSAccessor(const StorePath &, bool requireValidPath = true) override;

void addSignatures(const StorePath & storePath, const StringSet & sigs) override;
void addSignatures(const StorePath & storePath, const std::set<Signature> & sigs) override;

std::optional<std::string> getBuildLogExact(const StorePath & path) override;

Expand Down
3 changes: 3 additions & 0 deletions src/libstore/include/nix/store/common-protocol.hh
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ class StorePath;
struct ContentAddress;
struct DrvOutput;
struct Realisation;
struct Signature;

/**
* Shared serializers between the worker protocol, serve protocol, and a
Expand Down Expand Up @@ -72,6 +73,8 @@ template<>
DECLARE_COMMON_SERIALISER(DrvOutput);
template<>
DECLARE_COMMON_SERIALISER(Realisation);
template<>
DECLARE_COMMON_SERIALISER(Signature);

#define COMMA_ ,
template<typename T>
Expand Down
2 changes: 1 addition & 1 deletion src/libstore/include/nix/store/local-store.hh
Original file line number Diff line number Diff line change
Expand Up @@ -368,7 +368,7 @@ public:

void vacuumDB();

void addSignatures(const StorePath & storePath, const StringSet & sigs) override;
void addSignatures(const StorePath & storePath, const std::set<Signature> & sigs) override;

/**
* If free disk space in /nix/store if below minFree, delete
Expand Down
4 changes: 2 additions & 2 deletions src/libstore/include/nix/store/path-info.hh
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ struct UnkeyedValidPathInfo
*/
bool ultimate = false;

StringSet sigs; // note: not necessarily verified
std::set<Signature> sigs;

/**
* If non-empty, an assertion that the path is content-addressed,
Expand Down Expand Up @@ -200,7 +200,7 @@ struct ValidPathInfo : virtual UnkeyedValidPathInfo
/**
* Verify a single signature.
*/
bool checkSignature(const StoreDirConfig & store, const PublicKeys & publicKeys, const std::string & sig) const;
bool checkSignature(const StoreDirConfig & store, const PublicKeys & publicKeys, const Signature & sig) const;

/**
* References as store path basenames, including a self reference if it has one.
Expand Down
4 changes: 2 additions & 2 deletions src/libstore/include/nix/store/realisation.hh
Original file line number Diff line number Diff line change
Expand Up @@ -54,13 +54,13 @@ struct UnkeyedRealisation
{
StorePath outPath;

StringSet signatures;
std::set<Signature> signatures;

std::string fingerprint(const DrvOutput & key) const;

void sign(const DrvOutput & key, const Signer &);

bool checkSignature(const DrvOutput & key, const PublicKeys & publicKeys, const std::string & sig) const;
bool checkSignature(const DrvOutput & key, const PublicKeys & publicKeys, const Signature & sig) const;

size_t checkSignatures(const DrvOutput & key, const PublicKeys & publicKeys) const;

Expand Down
2 changes: 1 addition & 1 deletion src/libstore/include/nix/store/remote-store.hh
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ struct RemoteStore : public virtual Store, public virtual GcStore, public virtua
unsupported("repairPath");
}

void addSignatures(const StorePath & storePath, const StringSet & sigs) override;
void addSignatures(const StorePath & storePath, const std::set<Signature> & sigs) override;

MissingPaths queryMissing(const std::vector<DerivedPath> & targets) override;

Expand Down
2 changes: 1 addition & 1 deletion src/libstore/include/nix/store/store-api.hh
Original file line number Diff line number Diff line change
Expand Up @@ -754,7 +754,7 @@ public:
* Add signatures to the specified store path. The signatures are
* not verified.
*/
virtual void addSignatures(const StorePath & storePath, const StringSet & sigs)
virtual void addSignatures(const StorePath & storePath, const std::set<Signature> & sigs)
{
unsupported("addSignatures");
}
Expand Down
4 changes: 3 additions & 1 deletion src/libstore/legacy-ssh-store.cc
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,9 @@ void LegacySSHStore::addToStore(const ValidPathInfo & info, Source & source, Rep
<< (info.deriver ? printStorePath(*info.deriver) : "")
<< info.narHash.to_string(HashFormat::Base16, false);
ServeProto::write(*this, *conn, info.references);
conn->to << info.registrationTime << info.narSize << info.ultimate << info.sigs << renderContentAddress(info.ca);
conn->to << info.registrationTime << info.narSize << info.ultimate;
ServeProto::write(*this, *conn, info.sigs);
conn->to << renderContentAddress(info.ca);
try {
copyNAR(source, conn->to);
} catch (...) {
Expand Down
17 changes: 10 additions & 7 deletions src/libstore/local-store.cc
Original file line number Diff line number Diff line change
Expand Up @@ -619,7 +619,8 @@ void LocalStore::registerDrvOutput(const Realisation & info)
auto combinedSignatures = oldR->signatures;
combinedSignatures.insert(info.signatures.begin(), info.signatures.end());
state->stmts->UpdateRealisedOutput
.use()(concatStringsSep(" ", combinedSignatures))(info.id.strHash())(info.id.outputName)
.use()(concatStringsSep(" ", Signature::toStrings(combinedSignatures)))(info.id.strHash())(
info.id.outputName)
.exec();
} else {
throw Error(
Expand All @@ -634,7 +635,7 @@ void LocalStore::registerDrvOutput(const Realisation & info)
} else {
state->stmts->RegisterRealisedOutput
.use()(info.id.strHash())(info.id.outputName)(printStorePath(info.outPath))(
concatStringsSep(" ", info.signatures))
concatStringsSep(" ", Signature::toStrings(info.signatures)))
.exec();
}
});
Expand All @@ -659,7 +660,8 @@ uint64_t LocalStore::addValidPath(State & state, const ValidPathInfo & info)
info.registrationTime == 0 ? time(0) : info.registrationTime)(
info.deriver ? printStorePath(*info.deriver) : "",
(bool) info.deriver)(info.narSize, info.narSize != 0)(info.ultimate ? 1 : 0, info.ultimate)(
concatStringsSep(" ", info.sigs), !info.sigs.empty())(renderContentAddress(info.ca), (bool) info.ca)
concatStringsSep(" ", Signature::toStrings(info.sigs)),
!info.sigs.empty())(renderContentAddress(info.ca), (bool) info.ca)
.exec();
uint64_t id = state.db.getLastInsertedRowId();

Expand Down Expand Up @@ -737,7 +739,7 @@ std::shared_ptr<const ValidPathInfo> LocalStore::queryPathInfoInternal(State & s

s = (const char *) sqlite3_column_text(state.stmts->QueryPathInfo, 6);
if (s)
info->sigs = tokenizeString<StringSet>(s, " ");
info->sigs = Signature::parseMany(tokenizeString<StringSet>(s, " "));

s = (const char *) sqlite3_column_text(state.stmts->QueryPathInfo, 7);
if (s)
Expand All @@ -757,7 +759,8 @@ void LocalStore::updatePathInfo(State & state, const ValidPathInfo & info)
{
state.stmts->UpdatePathInfo
.use()(info.narSize, info.narSize != 0)(info.narHash.to_string(HashFormat::Base16, true))(
info.ultimate ? 1 : 0, info.ultimate)(concatStringsSep(" ", info.sigs), !info.sigs.empty())(
info.ultimate ? 1 : 0,
info.ultimate)(concatStringsSep(" ", Signature::toStrings(info.sigs)), !info.sigs.empty())(
renderContentAddress(info.ca), (bool) info.ca)(printStorePath(info.path))
.exec();
}
Expand Down Expand Up @@ -1484,7 +1487,7 @@ void LocalStore::vacuumDB()
_state->lock()->db.exec("vacuum");
}

void LocalStore::addSignatures(const StorePath & storePath, const StringSet & sigs)
void LocalStore::addSignatures(const StorePath & storePath, const std::set<Signature> & sigs)
{
retrySQLite<void>([&]() {
auto state(_state->lock());
Expand Down Expand Up @@ -1515,7 +1518,7 @@ LocalStore::queryRealisationCore_(LocalStore::State & state, const DrvOutput & i
{realisationDbId,
UnkeyedRealisation{
.outPath = outputPath,
.signatures = signatures,
.signatures = Signature::parseMany(signatures),
}}};
}

Expand Down
7 changes: 4 additions & 3 deletions src/libstore/nar-info-disk-cache.cc
Original file line number Diff line number Diff line change
Expand Up @@ -277,7 +277,7 @@ class NarInfoDiskCacheImpl : public NarInfoDiskCache
if (!queryNAR.isNull(9))
narInfo->deriver = StorePath(queryNAR.getStr(9));
for (auto & sig : tokenizeString<Strings>(queryNAR.getStr(10), " "))
narInfo->sigs.insert(sig);
narInfo->sigs.insert(Signature::parse(sig));
narInfo->ca = ContentAddress::parseOpt(queryNAR.getStr(11));

return {oValid, narInfo};
Expand Down Expand Up @@ -337,8 +337,9 @@ class NarInfoDiskCacheImpl : public NarInfoDiskCache
narInfo && narInfo->fileHash)(
narInfo ? narInfo->fileSize : 0, narInfo != 0 && narInfo->fileSize)(info->narHash.to_string(
HashFormat::Nix32, true))(info->narSize)(concatStringsSep(" ", info->shortRefs()))(
info->deriver ? std::string(info->deriver->to_string()) : "", (bool) info->deriver)(
concatStringsSep(" ", info->sigs))(renderContentAddress(info->ca))(time(0))
info->deriver ? std::string(info->deriver->to_string()) : "",
(bool) info->deriver)(concatStringsSep(" ", Signature::toStrings(info->sigs)))(
renderContentAddress(info->ca))(time(0))
.exec();

} else {
Expand Down
4 changes: 2 additions & 2 deletions src/libstore/nar-info.cc
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ NarInfo::NarInfo(const StoreDirConfig & store, const std::string & s, const std:
if (value != "unknown-deriver")
deriver = StorePath(value);
} else if (name == "Sig")
sigs.insert(value);
sigs.insert(Signature::parse(value));
else if (name == "CA") {
if (ca)
throw corrupt("extra CA");
Expand Down Expand Up @@ -124,7 +124,7 @@ std::string NarInfo::to_string(const StoreDirConfig & store) const
res += "Deriver: " + std::string(deriver->to_string()) + "\n";

for (const auto & sig : sigs)
res += "Sig: " + sig + "\n";
res += "Sig: " + sig.to_string() + "\n";

if (ca)
res += "CA: " + renderContentAddress(*ca) + "\n";
Expand Down
Loading
Loading