╭─────────────╮ │scroll to top│ ╰─────────────╯ ╭ ssh.zig ──────────────────────────────────────────────────────╮ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ╰───────────────────────────────────────────────────────────────╯
╭────╮ ╭ clone ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ╮ │http│ ssh │ │ ╰────╯ ╰ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ╯
965 .exec => |cmd| { 966 // copy out of the protocol's stack-scoped buffer so the 967 // test can assert on it after the handler returns. 968 @memcpy(self.captured_exec_buf[0..cmd.len], cmd); 969 self.captured_exec_len = cmd.len; 970 }, 971 .shell => {}, 972 } 973 } 974 975 fn run(self: *ServerTask) void { 976 defer self.outgoing.close(self.io); 977 proto.handleConnection( 978 self.io, 979 self.allocator, 980 self.reader, 981 self.writer, 982 self.host_key, 983 null, 984 self, 985 ) catch |e| { 986 self.result = e; 987 }; 988 } 989 }; 990 991 // deterministic keys so failures don't depend on RNG state. 992 993 fn newHostKey() !proto.HostKey { 994 const seed = [_]u8{0xAA} ** Ed25519.KeyPair.seed_length; 995 return .{ .keypair = try Ed25519.KeyPair.generateDeterministic(seed) }; 996 } 997 998 fn newUserKeypair() !Ed25519.KeyPair { 999 const seed = [_]u8{0xBB} ** Ed25519.KeyPair.seed_length; 1000 return try Ed25519.KeyPair.generateDeterministic(seed); 1001 } 1002 1003 fn newClientEphemeral() !X25519.KeyPair { 1004 const seed = [_]u8{0xCC} ** X25519.seed_length; 1005 return try X25519.KeyPair.generateDeterministic(seed); 1006 } 1007