BinaryCacheStore: Remove publicKeyFile argument

The public key can be derived from the secret key, so there's no need
for the user to supply it separately.
This commit is contained in:
Eelco Dolstra 2016-03-04 17:08:30 +01:00
parent 42bc395b63
commit af7cdb1096
7 changed files with 39 additions and 25 deletions

View file

@ -14,16 +14,13 @@
namespace nix { namespace nix {
BinaryCacheStore::BinaryCacheStore(std::shared_ptr<Store> localStore, BinaryCacheStore::BinaryCacheStore(std::shared_ptr<Store> localStore,
const Path & secretKeyFile, const Path & publicKeyFile) const Path & secretKeyFile)
: localStore(localStore) : localStore(localStore)
{ {
if (secretKeyFile != "") if (secretKeyFile != "") {
secretKey = std::unique_ptr<SecretKey>(new SecretKey(readFile(secretKeyFile))); secretKey = std::unique_ptr<SecretKey>(new SecretKey(readFile(secretKeyFile)));
if (publicKeyFile != "") {
publicKeys = std::unique_ptr<PublicKeys>(new PublicKeys); publicKeys = std::unique_ptr<PublicKeys>(new PublicKeys);
auto key = PublicKey(readFile(publicKeyFile)); publicKeys->emplace(secretKey->name, secretKey->toPublicKey());
publicKeys->emplace(key.name, key);
} }
StringSink sink; StringSink sink;

View file

@ -31,8 +31,7 @@ private:
protected: protected:
BinaryCacheStore(std::shared_ptr<Store> localStore, BinaryCacheStore(std::shared_ptr<Store> localStore, const Path & secretKeyFile);
const Path & secretKeyFile, const Path & publicKeyFile);
[[noreturn]] void notImpl(); [[noreturn]] void notImpl();

View file

@ -55,6 +55,17 @@ std::string SecretKey::signDetached(const std::string & data) const
#endif #endif
} }
PublicKey SecretKey::toPublicKey() const
{
#if HAVE_SODIUM
unsigned char pk[crypto_sign_PUBLICKEYBYTES];
crypto_sign_ed25519_sk_to_pk(pk, (unsigned char *) key.data());
return PublicKey(name, std::string((char *) pk, crypto_sign_PUBLICKEYBYTES));
#else
noSodium();
#endif
}
PublicKey::PublicKey(const string & s) PublicKey::PublicKey(const string & s)
: Key(s) : Key(s)
{ {

View file

@ -15,19 +15,31 @@ struct Key
<name>:<key-in-base64>. */ <name>:<key-in-base64>. */
Key(const std::string & s); Key(const std::string & s);
protected:
Key(const std::string & name, const std::string & key)
: name(name), key(key) { }
}; };
struct PublicKey;
struct SecretKey : Key struct SecretKey : Key
{ {
SecretKey(const std::string & s); SecretKey(const std::string & s);
/* Return a detached signature of the given string. */ /* Return a detached signature of the given string. */
std::string signDetached(const std::string & s) const; std::string signDetached(const std::string & s) const;
PublicKey toPublicKey() const;
}; };
struct PublicKey : Key struct PublicKey : Key
{ {
PublicKey(const std::string & data); PublicKey(const std::string & data);
private:
PublicKey(const std::string & name, const std::string & key)
: Key(name, key) { }
friend class SecretKey;
}; };
typedef std::map<std::string, PublicKey> PublicKeys; typedef std::map<std::string, PublicKey> PublicKeys;

View file

@ -14,9 +14,8 @@ private:
public: public:
HttpBinaryCacheStore(std::shared_ptr<Store> localStore, HttpBinaryCacheStore(std::shared_ptr<Store> localStore,
const Path & secretKeyFile, const Path & publicKeyFile, const Path & secretKeyFile, const Path & _cacheUri)
const Path & _cacheUri) : BinaryCacheStore(localStore, secretKeyFile)
: BinaryCacheStore(localStore, secretKeyFile, publicKeyFile)
, cacheUri(_cacheUri) , cacheUri(_cacheUri)
, downloader(makeDownloader()) , downloader(makeDownloader())
{ {
@ -66,7 +65,7 @@ static RegisterStoreImplementation regStore([](const std::string & uri) -> std::
if (std::string(uri, 0, 7) != "http://" && if (std::string(uri, 0, 7) != "http://" &&
std::string(uri, 0, 8) != "https://") return 0; std::string(uri, 0, 8) != "https://") return 0;
auto store = std::make_shared<HttpBinaryCacheStore>(std::shared_ptr<Store>(0), auto store = std::make_shared<HttpBinaryCacheStore>(std::shared_ptr<Store>(0),
"", "", // FIXME: allow the signing key to be set "", // FIXME: allow the signing key to be set
uri); uri);
store->init(); store->init();
return store; return store;

View file

@ -11,8 +11,7 @@ private:
public: public:
LocalBinaryCacheStore(std::shared_ptr<Store> localStore, LocalBinaryCacheStore(std::shared_ptr<Store> localStore,
const Path & secretKeyFile, const Path & publicKeyFile, const Path & secretKeyFile, const Path & binaryCacheDir);
const Path & binaryCacheDir);
void init() override; void init() override;
@ -27,9 +26,8 @@ protected:
}; };
LocalBinaryCacheStore::LocalBinaryCacheStore(std::shared_ptr<Store> localStore, LocalBinaryCacheStore::LocalBinaryCacheStore(std::shared_ptr<Store> localStore,
const Path & secretKeyFile, const Path & publicKeyFile, const Path & secretKeyFile, const Path & binaryCacheDir)
const Path & binaryCacheDir) : BinaryCacheStore(localStore, secretKeyFile)
: BinaryCacheStore(localStore, secretKeyFile, publicKeyFile)
, binaryCacheDir(binaryCacheDir) , binaryCacheDir(binaryCacheDir)
{ {
} }
@ -66,19 +64,18 @@ std::string LocalBinaryCacheStore::getFile(const std::string & path)
} }
ref<Store> openLocalBinaryCacheStore(std::shared_ptr<Store> localStore, ref<Store> openLocalBinaryCacheStore(std::shared_ptr<Store> localStore,
const Path & secretKeyFile, const Path & publicKeyFile, const Path & secretKeyFile, const Path & binaryCacheDir)
const Path & binaryCacheDir)
{ {
auto store = std::make_shared<LocalBinaryCacheStore>( auto store = make_ref<LocalBinaryCacheStore>(
localStore, secretKeyFile, publicKeyFile, binaryCacheDir); localStore, secretKeyFile, binaryCacheDir);
store->init(); store->init();
return ref<Store>(std::shared_ptr<Store>(store)); return store;
} }
static RegisterStoreImplementation regStore([](const std::string & uri) -> std::shared_ptr<Store> { static RegisterStoreImplementation regStore([](const std::string & uri) -> std::shared_ptr<Store> {
if (std::string(uri, 0, 7) != "file://") return 0; if (std::string(uri, 0, 7) != "file://") return 0;
return openLocalBinaryCacheStore(std::shared_ptr<Store>(0), return openLocalBinaryCacheStore(std::shared_ptr<Store>(0),
"", "", // FIXME: allow the signing key to be set "", // FIXME: allow the signing key to be set
std::string(uri, 7)); std::string(uri, 7));
}); });

View file

@ -454,8 +454,7 @@ ref<Store> openStore();
ref<Store> openLocalBinaryCacheStore(std::shared_ptr<Store> localStore, ref<Store> openLocalBinaryCacheStore(std::shared_ptr<Store> localStore,
const Path & secretKeyFile, const Path & publicKeyFile, const Path & secretKeyFile, const Path & binaryCacheDir);
const Path & binaryCacheDir);
/* Store implementation registration. */ /* Store implementation registration. */