diff --git a/ShhShell/Keys/KeyManager.swift b/ShhShell/Keys/KeyManager.swift index 3e64d8d..d7a1205 100644 --- a/ShhShell/Keys/KeyManager.swift +++ b/ShhShell/Keys/KeyManager.swift @@ -59,16 +59,16 @@ class KeyManager: ObservableObject { return pubdata } - static func makeSSHPubkey(pub: Data, comment: String) -> Data { + static func makeSSHPubkey(_ keypair: Keypair) -> Data { let header = "ssh-ed25519" var keyBlob: Data = Data() //key type bit keyBlob += encode(str: header) //base64 blob bit - keyBlob += encode(data: pub) + keyBlob += encode(data: keypair.publicKey) let b64key = keyBlob.base64EncodedString() - let pubkeyline = "\(header) \(b64key) \(comment)\n" + let pubkeyline = "\(header) \(b64key) \(keypair.publicKey)\n" return Data(pubkeyline.utf8) } @@ -112,7 +112,7 @@ class KeyManager: ObservableObject { return Keypair(type: .ecdsa, name: comment, privateKey: privatekeyData) } - static func makeSSHPrivkey(pub: Data, priv: Data, comment: String) -> Data { + static func makeSSHPrivkey(_ keypair: Keypair) -> Data { var content: Data = Data() var blob: Data = Data() @@ -135,7 +135,7 @@ class KeyManager: ObservableObject { var pubkeyBlob = Data() let keyType = "ssh-ed25519" pubkeyBlob += encode(str: keyType) - pubkeyBlob += encode(data: pub) + pubkeyBlob += encode(data: keypair.publicKey) blob += encode(data: pubkeyBlob) //priv @@ -144,9 +144,9 @@ class KeyManager: ObservableObject { privBlob.append(contentsOf: withUnsafeBytes(of: checkint.bigEndian, Array.init)) privBlob.append(contentsOf: withUnsafeBytes(of: checkint.bigEndian, Array.init)) privBlob += encode(str: keyType) - privBlob += encode(data: pub) - privBlob += encode(data: priv + pub) - privBlob += encode(str: comment) + privBlob += encode(data: keypair.publicKey) + privBlob += encode(data: keypair.privateKey + keypair.publicKey) + privBlob += encode(str: keypair.name) let padLegth = (8 - (privBlob.count % 8)) % 8 if padLegth > 0 { diff --git a/ShhShell/Keys/Keypair.swift b/ShhShell/Keys/Keypair.swift index 20b28cb..89ac164 100644 --- a/ShhShell/Keys/Keypair.swift +++ b/ShhShell/Keys/Keypair.swift @@ -31,11 +31,11 @@ struct Keypair: KeypairProtocol { var passphrase: String = "" var openSshPubkey: String { - String(data: KeyManager.makeSSHPubkey(pub: publicKey, comment: name), encoding: .utf8) ?? "OpenSSH key format error" + String(data: KeyManager.makeSSHPubkey(self), encoding: .utf8) ?? "OpenSSH key format error" } var openSshPrivkey: String { - String(data: KeyManager.makeSSHPrivkey(pub: publicKey, priv: privateKey, comment: name), encoding: .utf8) ?? "OpenSSH key format error" + String(data: KeyManager.makeSSHPrivkey(self), encoding: .utf8) ?? "OpenSSH key format error" } init( diff --git a/ShhShell/Views/Keys/KeyDetailView.swift b/ShhShell/Views/Keys/KeyDetailView.swift index bac9111..a425e93 100644 --- a/ShhShell/Views/Keys/KeyDetailView.swift +++ b/ShhShell/Views/Keys/KeyDetailView.swift @@ -12,13 +12,6 @@ struct KeyDetailView: View { @State var keypair: Keypair @State private var reveal: Bool = false - var publicKey: Data { - return keypair.publicKey ?? "".data(using: .utf8)! - } - var privateKey: Data { - return keypair.privateKey ?? "".data(using: .utf8)! - } - var body: some View { ZStack { hostsManager.selectedTheme.background.suiColor.opacity(0.7) @@ -66,10 +59,17 @@ struct KeyDetailView: View { } } + Button { + UIPasteboard.general.string = String(data: KeyManager.makeSSHPubkey(keypair), encoding: .utf8) ?? "" + } label: { + CenteredLabel(title: "Copy private key", systemName: "document.on.document") + } + .listRowSeparator(.hidden) + Button { Task { guard await hostsManager.authWithBiometrics() else { return } - UIPasteboard.general.string = String(data: privateKey, encoding: .utf8) + UIPasteboard.general.string = String(data: KeyManager.makeSSHPrivkey(keypair), encoding: .utf8) ?? "" } } label: { CenteredLabel(title: "Copy private key", systemName: "document.on.document")