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:
		
							parent
							
								
									42bc395b63
								
							
						
					
					
						commit
						af7cdb1096
					
				
					 7 changed files with 39 additions and 25 deletions
				
			
		|  | @ -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; | ||||||
|  |  | ||||||
|  | @ -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(); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -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) | ||||||
| { | { | ||||||
|  |  | ||||||
|  | @ -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; | ||||||
|  |  | ||||||
|  | @ -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; | ||||||
|  |  | ||||||
|  | @ -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)); | ||||||
| }); | }); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -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. */ | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue