//constracts and appends mac public void CalcHash(MAC mac, int sequence) { byte[] buf = new byte[4 + 4 + _packetLength]; SSHUtil.WriteIntToByteArray(buf, 0, sequence); WriteTo(buf, 4, false); _mac = mac.Calc(buf); }
public static SSH2Packet FromDecryptedHead(byte[] head, byte[] buffer, int offset, Cipher cipher, int sequence, MAC mac) { SSH2Packet p = new SSH2Packet(); p._packetLength = SSHUtil.ReadInt32(head, 0); if (p._packetLength <= 0 || p._packetLength >= MAX_PACKET_LENGTH) { throw new SSHException(String.Format("packet size {0} is invalid", p._packetLength)); } SSH2DataWriter buf = new SSH2DataWriter(); buf.Write(sequence); buf.Write(head); if (p._packetLength > (cipher.BlockSize - 4)) { byte[] tmp = new byte[p._packetLength - (cipher.BlockSize - 4)]; cipher.Decrypt(buffer, offset, tmp.Length, tmp, 0); offset += tmp.Length; buf.Write(tmp); } byte[] result = buf.ToByteArray(); int padding_len = (int)result[8]; if (padding_len < 4) { throw new SSHException("padding length is invalid"); } byte[] payload = new byte[result.Length - 9 - padding_len]; Array.Copy(result, 9, payload, 0, payload.Length); p._payload = payload; if (mac != null) { p._mac = mac.Calc(result); if (SSHUtil.memcmp(p._mac, 0, buffer, offset, mac.Size) != 0) { throw new SSHException("MAC Error"); } } return(p); }
//constracts and appends mac public void CalcHash(MAC mac, int sequence) { byte[] buf = new byte[4+4+_packetLength]; SSHUtil.WriteIntToByteArray(buf, 0, sequence); WriteTo(buf, 4, false); _mac = mac.Calc(buf); }
public static SSH2Packet FromDecryptedHead(byte[] head, byte[] buffer, int offset, Cipher cipher, int sequence, MAC mac) { SSH2Packet p = new SSH2Packet(); p._packetLength = SSHUtil.ReadInt32(head, 0); if(p._packetLength<=0 || p._packetLength>=MAX_PACKET_LENGTH) throw new Exception(String.Format("packet size {0} is invalid", p._packetLength)); SSH2DataWriter buf = new SSH2DataWriter(); buf.Write(sequence); buf.Write(head); if(p._packetLength > (cipher.BlockSize - 4)) { byte[] tmp = new byte[p._packetLength-(cipher.BlockSize - 4)]; cipher.Decrypt(buffer, offset, tmp.Length, tmp, 0); offset += tmp.Length; buf.Write(tmp); } byte[] result = buf.ToByteArray(); int padding_len = (int)result[8]; if(padding_len<4) throw new Exception("padding length is invalid"); byte[] payload = new byte[result.Length-9-padding_len]; Array.Copy(result, 9, payload, 0, payload.Length); p._payload = payload; if(mac!=null) { p._mac = mac.Calc(result); if(SSHUtil.memcmp(p._mac, 0, buffer, offset, mac.Size)!=0) throw new Exception("MAC Error"); } return p; }