blob: 480f448ece05d5ff97cab467cc6cffc18adda165 [file] [log] [blame]
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
package rdpclient.ntlmssp;
import rdpclient.ntlmssp.asn1.TSCredentials;
import rdpclient.ntlmssp.asn1.TSPasswordCreds;
import rdpclient.ntlmssp.asn1.TSRequest;
import rdpclient.rdp.RdpConstants;
import streamer.ByteBuffer;
import streamer.Element;
import streamer.Link;
import streamer.OneTimeSwitch;
public class ClientNtlmsspUserCredentials extends OneTimeSwitch implements Element {
protected NtlmState ntlmState;
public ClientNtlmsspUserCredentials(String id, NtlmState ntlmState) {
super(id);
this.ntlmState = ntlmState;
}
@Override
protected void handleOneTimeData(ByteBuffer buf, Link link) {
if (buf == null)
return;
throw new RuntimeException("Unexpected packet: " + buf + ".");
}
@Override
protected void onStart() {
super.onStart();
ByteBuffer buf = new ByteBuffer(4096, true);
TSRequest tsRequest = new TSRequest("TSRequest");
tsRequest.version.value = 2L;
ByteBuffer tsCredentialsBuf = generateTSCredentials();
tsRequest.authInfo.value = encryptTSCredentials(tsCredentialsBuf);
tsCredentialsBuf.unref();
tsRequest.writeTag(buf);
// Trim buffer to actual length of data written
buf.trimAtCursor();
pushDataToOTOut(buf);
switchOff();
}
private ByteBuffer encryptTSCredentials(ByteBuffer buf2) {
return new ByteBuffer(ntlmState.ntlm_EncryptMessage(buf2.toByteArray()));
}
private ByteBuffer generateTSCredentials() {
ByteBuffer buf = new ByteBuffer(4096);
TSCredentials tsCredentials = new TSCredentials("authInfo");
// 1 means that credentials field contains a TSPasswordCreds structure
tsCredentials.credType.value = 1L;
ByteBuffer tsPasswordCredsBuf = new ByteBuffer(4096, true);
TSPasswordCreds tsPasswordCreds = new TSPasswordCreds("credentials");
tsPasswordCreds.domainName.value = new ByteBuffer(ntlmState.domain.getBytes(RdpConstants.CHARSET_16));
tsPasswordCreds.userName.value = new ByteBuffer(ntlmState.user.getBytes(RdpConstants.CHARSET_16));
tsPasswordCreds.password.value = new ByteBuffer(ntlmState.password.getBytes(RdpConstants.CHARSET_16));
tsPasswordCreds.writeTag(tsPasswordCredsBuf);
tsPasswordCredsBuf.trimAtCursor();
//* DEBUG */System.out.println("TSPasswordCreds:\n" + tsPasswordCredsBuf.dump());
tsCredentials.credentials.value = tsPasswordCredsBuf;
tsCredentials.writeTag(buf);
tsPasswordCredsBuf.unref();
// Trim buffer to actual length of data written
buf.trimAtCursor();
//* DEBUG */System.out.println("TSCredentials:\n" + buf.dump());
return buf;
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
/* @formatter:off */
// TSCredentials
// 30 57 // Sequence
// a0 03 // TAG 0
// 02 01 01 // Integer: 1 : credentials contains a TSPasswordCreds structure
// a1 50 // TAG 1
// 04 4e // OCTETSTRING
// TSPasswordCreds
// 30 4c // SEQUENCE
// a0 14 // TAG 0
// 04 12 // OCTETSTRING
// 77 00 6f 00 72 00 6b 00 67 00 72 00 6f 00 75 00 70 00 // "workgroup"
// a1 1c // TAG 1
// 04 1a // OCTETSTRING
// 41 00 64 00 6d 00 69 00 6e 00 69 00 73 00 74 00 72 00 61 00 74 00 6f 00 72 00 // "Administrator"
// a2 16 // TAG 2
// 04 14 //
// 52 00 32 00 50 00 72 00 65 00 76 00 69 00 65 00 77 00 21 00 // "R2Preview!"
/* @formatter:on */
}
}