//RSA authentication private void DoRSAChallengeResponse() { //read key SSH1UserAuthKey key = new SSH1UserAuthKey(_param.IdentityFile, _param.Password); SSH1DataWriter w = new SSH1DataWriter(); w.Write(key.PublicModulus); SSH1Packet p = SSH1Packet.FromPlainPayload(PacketType.SSH_CMSG_AUTH_RSA, w.ToByteArray()); p.WriteTo(_stream, _tCipher); p = ReceivePacket(); if (p.Type == PacketType.SSH_SMSG_FAILURE) { throw new SSHException(Strings.GetString("ServerRefusedRSA")); } else if (p.Type != PacketType.SSH_SMSG_AUTH_RSA_CHALLENGE) { throw new SSHException(String.Format(Strings.GetString("UnexpectedResponse"), p.Type)); } //creating challenge SSH1DataReader r = new SSH1DataReader(p.Data); BigInteger challenge = key.decryptChallenge(r.ReadMPInt()); byte[] rawchallenge = RSAUtil.StripPKCS1Pad(challenge, 2).getBytes(); //building response MemoryStream bos = new MemoryStream(); bos.Write(rawchallenge, 0, rawchallenge.Length); //!!mindtermでは頭が0かどうかで変なハンドリングがあった bos.Write(_sessionID, 0, _sessionID.Length); byte[] response = new MD5CryptoServiceProvider().ComputeHash(bos.ToArray()); w = new SSH1DataWriter(); w.Write(response); p = SSH1Packet.FromPlainPayload(PacketType.SSH_CMSG_AUTH_RSA_RESPONSE, w.ToByteArray()); p.WriteTo(_stream, _tCipher); }
//RSA authentication private void DoRSAChallengeResponse() { //read key SSH1UserAuthKey key = new SSH1UserAuthKey(_param.IdentityFile, _param.Password); SSH1DataWriter w = new SSH1DataWriter(); w.Write(key.PublicModulus); SSH1Packet p = SSH1Packet.FromPlainPayload(PacketType.SSH_CMSG_AUTH_RSA, w.ToByteArray()); p.WriteTo(_stream, _tCipher); p = ReceivePacket(); if(p.Type==PacketType.SSH_SMSG_FAILURE) throw new SSHException(Strings.GetString("ServerRefusedRSA")); else if(p.Type!=PacketType.SSH_SMSG_AUTH_RSA_CHALLENGE) throw new SSHException(String.Format(Strings.GetString("UnexpectedResponse"), p.Type)); //creating challenge SSH1DataReader r = new SSH1DataReader(p.Data); BigInteger challenge = key.decryptChallenge(r.ReadMPInt()); byte[] rawchallenge = RSAUtil.StripPKCS1Pad(challenge, 2).getBytes(); //building response MemoryStream bos = new MemoryStream(); bos.Write(rawchallenge, 0, rawchallenge.Length); //!!mindterm�ł͓����O���ǂ����ŕςȃn���h�����O�������� bos.Write(_sessionID, 0, _sessionID.Length); byte[] response = new MD5CryptoServiceProvider().ComputeHash(bos.ToArray()); w = new SSH1DataWriter(); w.Write(response); p = SSH1Packet.FromPlainPayload(PacketType.SSH_CMSG_AUTH_RSA_RESPONSE, w.ToByteArray()); p.WriteTo(_stream, _tCipher); }