From 671c21db9f4d0342d8387ae6bf7a716bae837745 Mon Sep 17 00:00:00 2001 From: netadr <42688647+netadr@users.noreply.github.com> Date: Sun, 31 Aug 2025 19:07:03 -0400 Subject: [PATCH] libfetchers: Fix SSH key identifiers for sk type keys libfetchers: Mark ssh-ecdsa-sk key type mapping as a TODO for now --- src/libfetchers/git-utils.cc | 35 +++++++++++++++++++++++------------ 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/src/libfetchers/git-utils.cc b/src/libfetchers/git-utils.cc index b8d9b03ce..1861838ed 100644 --- a/src/libfetchers/git-utils.cc +++ b/src/libfetchers/git-utils.cc @@ -568,23 +568,34 @@ struct GitRepoImpl : GitRepo, std::enable_shared_from_this void verifyCommit(const Hash & rev, const std::vector & publicKeys) override { + // Map of SSH key types to their internal OpenSSH representations + static const std::unordered_map keyTypeMap = { + {"ssh-dsa", "ssh-dsa"}, + {"ssh-ecdsa", "ssh-ecdsa"}, + {"ssh-ecdsa-sk", "sk-ecdsa-sha2-nistp256@openssh.com"}, + {"ssh-ed25519", "ssh-ed25519"}, + {"ssh-ed25519-sk", "sk-ssh-ed25519@openssh.com"}, + {"ssh-rsa", "ssh-rsa"}}; + // Create ad-hoc allowedSignersFile and populate it with publicKeys auto allowedSignersFile = createTempFile().second; std::string allowedSigners; + for (const fetchers::PublicKey & k : publicKeys) { - if (k.type != "ssh-dsa" && k.type != "ssh-ecdsa" && k.type != "ssh-ecdsa-sk" && k.type != "ssh-ed25519" - && k.type != "ssh-ed25519-sk" && k.type != "ssh-rsa") + auto it = keyTypeMap.find(k.type); + if (it == keyTypeMap.end()) { + std::string supportedTypes; + for (const auto & [type, _] : keyTypeMap) { + supportedTypes += fmt(" %s\n", type); + } throw Error( - "Unknown key type '%s'.\n" - "Please use one of\n" - "- ssh-dsa\n" - " ssh-ecdsa\n" - " ssh-ecdsa-sk\n" - " ssh-ed25519\n" - " ssh-ed25519-sk\n" - " ssh-rsa", - k.type); - allowedSigners += "* " + k.type + " " + k.key + "\n"; + "Invalid SSH key type '%s' in publicKeys.\n" + "Please use one of:\n%s", + k.type, + supportedTypes); + } + + allowedSigners += fmt("* %s %s\n", it->second, k.key); } writeFile(allowedSignersFile, allowedSigners);