feat(ssh): integrate EncryptionContext into server.rs
SSH加密packet架构集成: 实现内容: 1. server.rs导入EncryptionContext和EncryptedPacket 2. perform_complete_kex_exchange返回EncryptionContext 3. 添加EncryptionContext::default()临时实现 架构集成: - ✅ EncryptionContext导入完成 - ✅ 密钥交换函数返回加密上下文 - ✅ Default trait实现(临时方案) 编译结果: - ✅ 编译成功(149 warnings, 0 errors) - ✅ 架构集成完成 待完善: - 会话密钥实现(从KexState提取shared_secret) - IV初始化(从会话密钥派生) - NEWKEYS后packet切换(使用EncryptedPacket) 技术说明: - 当前使用临时默认密钥(vec![0u8; 32]) - 仅用于架构集成和编译验证 - 功能实现待后续完善
This commit is contained in:
@@ -25,6 +25,19 @@ pub struct EncryptionContext {
|
|||||||
pub sequence_number_stoc: u32, // 服务器→客户端序列号
|
pub sequence_number_stoc: u32, // 服务器→客户端序列号
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Default for EncryptionContext {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self {
|
||||||
|
encryption_key_ctos: vec![0u8; 32],
|
||||||
|
encryption_key_stoc: vec![0u8; 32],
|
||||||
|
mac_key_ctos: vec![0u8; 32],
|
||||||
|
mac_key_stoc: vec![0u8; 32],
|
||||||
|
sequence_number_ctos: 0,
|
||||||
|
sequence_number_stoc: 0,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl EncryptionContext {
|
impl EncryptionContext {
|
||||||
/// 创建加密上下文(从SessionKeys)
|
/// 创建加密上下文(从SessionKeys)
|
||||||
pub fn from_session_keys(keys: &SessionKeys) -> Self {
|
pub fn from_session_keys(keys: &SessionKeys) -> Self {
|
||||||
|
|||||||
@@ -3,10 +3,11 @@
|
|||||||
|
|
||||||
use crate::ssh_server::version::VersionExchange;
|
use crate::ssh_server::version::VersionExchange;
|
||||||
use crate::ssh_server::packet::{SshPacket, PacketType};
|
use crate::ssh_server::packet::{SshPacket, PacketType};
|
||||||
use crate::ssh_server::kex::{KexProposal, KexResult};
|
use crate::ssh_server::kex::{KexResult, KexProposal};
|
||||||
use crate::ssh_server::kex_complete::{KexState};
|
use crate::ssh_server::kex_complete::{KexState};
|
||||||
use crate::ssh_server::auth::{AuthHandler, AuthResult};
|
use crate::ssh_server::auth::{AuthHandler, AuthResult};
|
||||||
use crate::ssh_server::channel::{ChannelManager};
|
use crate::ssh_server::channel::{ChannelManager};
|
||||||
|
use crate::ssh_server::cipher::{EncryptionContext, EncryptedPacket};
|
||||||
use anyhow::Result;
|
use anyhow::Result;
|
||||||
use log::{info, warn, error, debug};
|
use log::{info, warn, error, debug};
|
||||||
use std::net::{TcpListener, TcpStream};
|
use std::net::{TcpListener, TcpStream};
|
||||||
@@ -85,6 +86,8 @@ fn handle_connection_complete(stream: TcpStream) -> Result<()> {
|
|||||||
perform_complete_kex_exchange(&mut stream, client_version.clone(), kex_result, server_kexinit, client_kexinit)?;
|
perform_complete_kex_exchange(&mut stream, client_version.clone(), kex_result, server_kexinit, client_kexinit)?;
|
||||||
info!("Key exchange completed, encryption channel ready");
|
info!("Key exchange completed, encryption channel ready");
|
||||||
|
|
||||||
|
let encryption_ctx = EncryptionContext::default();
|
||||||
|
|
||||||
// Phase 5: SSH认证(参考OpenSSH auth2.c)
|
// Phase 5: SSH认证(参考OpenSSH auth2.c)
|
||||||
let mut auth_handler = AuthHandler::new()?;
|
let mut auth_handler = AuthHandler::new()?;
|
||||||
let auth_user = perform_ssh_auth(&mut stream, &mut auth_handler)?;
|
let auth_user = perform_ssh_auth(&mut stream, &mut auth_handler)?;
|
||||||
@@ -130,24 +133,20 @@ fn perform_complete_kex_exchange(
|
|||||||
kex_result: KexResult,
|
kex_result: KexResult,
|
||||||
server_kexinit: SshPacket,
|
server_kexinit: SshPacket,
|
||||||
client_kexinit: SshPacket,
|
client_kexinit: SshPacket,
|
||||||
) -> Result<()> {
|
) -> Result<EncryptionContext> {
|
||||||
info!("Starting complete key exchange flow");
|
info!("Starting complete key exchange flow");
|
||||||
|
|
||||||
// 1. 创建密钥交换状态
|
|
||||||
let mut kex_state = KexState::new(
|
let mut kex_state = KexState::new(
|
||||||
client_version,
|
client_version,
|
||||||
"SSH-2.0-MarkBaseSSH_1.0".to_string(),
|
"SSH-2.0-MarkBaseSSH_1.0".to_string(),
|
||||||
kex_result,
|
kex_result,
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
// 2. 保存KEXINIT payloads(用于Exchange Hash)
|
|
||||||
kex_state.save_kexinit_payloads(&client_kexinit, &server_kexinit);
|
kex_state.save_kexinit_payloads(&client_kexinit, &server_kexinit);
|
||||||
|
|
||||||
// 3. 接收SSH_MSG_KEX_ECDH_INIT
|
|
||||||
let kexdh_init = SshPacket::read(stream)?;
|
let kexdh_init = SshPacket::read(stream)?;
|
||||||
info!("Received SSH_MSG_KEX_ECDH_INIT");
|
info!("Received SSH_MSG_KEX_ECDH_INIT");
|
||||||
|
|
||||||
// 4. 处理KEXDH_INIT并生成KEXDH_REPLY
|
|
||||||
let kexdh_reply = kex_state.exchange_handler.handle_kexdh_init(
|
let kexdh_reply = kex_state.exchange_handler.handle_kexdh_init(
|
||||||
&kexdh_init,
|
&kexdh_init,
|
||||||
&kex_state.client_version,
|
&kex_state.client_version,
|
||||||
@@ -158,25 +157,22 @@ fn perform_complete_kex_exchange(
|
|||||||
kexdh_reply.write(stream)?;
|
kexdh_reply.write(stream)?;
|
||||||
info!("Sent SSH_MSG_KEX_ECDH_REPLY");
|
info!("Sent SSH_MSG_KEX_ECDH_REPLY");
|
||||||
|
|
||||||
// 5. 发送SSH_MSG_NEWKEYS
|
|
||||||
let newkeys_packet = KexState::send_newkeys()?;
|
let newkeys_packet = KexState::send_newkeys()?;
|
||||||
newkeys_packet.write(stream)?;
|
newkeys_packet.write(stream)?;
|
||||||
kex_state.newkeys_sent = true;
|
kex_state.newkeys_sent = true;
|
||||||
info!("Sent SSH_MSG_NEWKEYS");
|
info!("Sent SSH_MSG_NEWKEYS");
|
||||||
|
|
||||||
// 6. 接收SSH_MSG_NEWKEYS
|
|
||||||
let client_newkeys = SshPacket::read(stream)?;
|
let client_newkeys = SshPacket::read(stream)?;
|
||||||
kex_state.handle_newkeys(&client_newkeys)?;
|
kex_state.handle_newkeys(&client_newkeys)?;
|
||||||
info!("Received SSH_MSG_NEWKEYS");
|
info!("Received SSH_MSG_NEWKEYS");
|
||||||
|
|
||||||
// 7. 验证加密通道建立
|
|
||||||
if kex_state.is_encryption_ready() {
|
if kex_state.is_encryption_ready() {
|
||||||
info!("Encryption channel established successfully");
|
info!("Encryption channel established successfully");
|
||||||
} else {
|
} else {
|
||||||
return Err(anyhow::anyhow!("Encryption channel not ready"));
|
return Err(anyhow::anyhow!("Encryption channel not ready"));
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(EncryptionContext::default())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// SSH认证流程(Phase 5)
|
/// SSH认证流程(Phase 5)
|
||||||
|
|||||||
Reference in New Issue
Block a user