Skip to content

Commit dfb7059

Browse files
committed
Moved sequence numbers back to transport.
1 parent 6cdffad commit dfb7059

2 files changed

Lines changed: 14 additions & 20 deletions

File tree

NtApiDotNet/Win32/Rpc/Transport/RpcConnectedClientTransport.cs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,8 @@ protected RpcConnectedClientTransport(ushort max_recv_fragment, ushort max_send_
7474
private int _current_context_id;
7575
private ushort _max_recv_fragment;
7676
private ushort _max_send_fragment;
77+
private int _recv_sequence_no;
78+
private int _send_senqunce_no;
7779
private BindTimeFeatureNegotiation? _bind_time_features;
7880
private bool _transport_bound;
7981
private Guid _interface_id;
@@ -147,7 +149,7 @@ private Tuple<PDUBase, AuthData> SendReceivePDU(int call_id, PDUBase send_pdu, b
147149
RpcUtils.DumpBuffer(true, $"{GetType().Name} Send Buffer", fragment);
148150
if (!WriteFragment(fragment))
149151
throw new RpcTransportException("Failed to write out PDU buffer.");
150-
security_context.SendSequenceNo++;
152+
_send_senqunce_no++;
151153
if (!receive_pdu)
152154
return null;
153155

@@ -168,7 +170,7 @@ private Tuple<PDUBase, AuthData> SendReceivePDU(int call_id, PDUBase send_pdu, b
168170
throw new RpcTransportException($"Mismatching context ID - {pdu.Item3.ContextId} should be {security_context.ContextId}.");
169171
}
170172

171-
security_context.RecvSequenceNo++;
173+
_recv_sequence_no++;
172174

173175
return Tuple.Create(CheckFault(curr_header.ToPDU(pdu.Item2)), pdu.Item3);
174176
}
@@ -255,7 +257,7 @@ private byte[] SendReceiveRequestPDU(int proc_num, Guid objuuid, byte[] stub_dat
255257
}
256258

257259
header = request_pdu.ToArray(pdu_header, stub_fragment.Length + AuthData.PDU_AUTH_DATA_HEADER_SIZE, auth_data_length);
258-
auth_data = security_context.ProtectPDU(header, ref stub_fragment, auth_data_padding);
260+
auth_data = security_context.ProtectPDU(header, ref stub_fragment, auth_data_padding, _send_senqunce_no);
259261
}
260262

261263
MemoryStream send_stm = new MemoryStream();
@@ -268,7 +270,7 @@ private byte[] SendReceiveRequestPDU(int proc_num, Guid objuuid, byte[] stub_dat
268270
RpcUtils.DumpBuffer(true, name, fragment);
269271
if (!WriteFragment(fragment))
270272
throw new RpcTransportException("Failed to write out PDU buffer.");
271-
security_context.SendSequenceNo++;
273+
_send_senqunce_no++;
272274
}
273275

274276
MemoryStream recv_stm = new MemoryStream();
@@ -293,8 +295,8 @@ private byte[] SendReceiveRequestPDU(int proc_num, Guid objuuid, byte[] stub_dat
293295
if (recv_pdu is PDUResponse resp_pdu)
294296
{
295297
byte[] resp_stub_data = auth_required ? security_context.UnprotectPDU(resp_pdu.ToArray(curr_header),
296-
resp_pdu.StubData, auth_data) : resp_pdu.StubData;
297-
security_context.RecvSequenceNo++;
298+
resp_pdu.StubData, auth_data, _recv_sequence_no) : resp_pdu.StubData;
299+
_recv_sequence_no++;
298300
recv_stm.Write(resp_stub_data, 0, resp_stub_data.Length);
299301
}
300302
else

NtApiDotNet/Win32/Rpc/Transport/RpcTransportSecurityContext.cs

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -48,14 +48,6 @@ public sealed class RpcTransportSecurityContext
4848
/// The authentication level.
4949
/// </summary>
5050
public RpcAuthenticationLevel AuthenticationLevel => TransportSecurity.AuthenticationLevel;
51-
/// <summary>
52-
/// The current send sequence no.
53-
/// </summary>
54-
public int SendSequenceNo { get; internal set; }
55-
/// <summary>
56-
/// The current receive sequence no.
57-
/// </summary>
58-
public int RecvSequenceNo { get; internal set; }
5951

6052
internal bool Authenticated => AuthContext?.Done ?? false;
6153
internal bool NeedAuthData => TransportSecurity.AuthenticationLevel == RpcAuthenticationLevel.PacketIntegrity ||
@@ -96,7 +88,7 @@ internal RpcTransportSecurityContext(IRpcClientTransport client_transport,
9688
AuthContext = transport_security.CreateClientContext();
9789
}
9890

99-
internal byte[] ProtectPDU(byte[] header, ref byte[] stub_data, int auth_padding_length)
91+
internal byte[] ProtectPDU(byte[] header, ref byte[] stub_data, int auth_padding_length, int send_sequence_no)
10092
{
10193
List<SecurityBuffer> buffers = new List<SecurityBuffer>();
10294
buffers.Add(new SecurityBufferInOut(SecurityBufferType.Data | SecurityBufferType.ReadOnly, header));
@@ -108,11 +100,11 @@ internal byte[] ProtectPDU(byte[] header, ref byte[] stub_data, int auth_padding
108100
byte[] signature;
109101
if (TransportSecurity.AuthenticationLevel == RpcAuthenticationLevel.PacketIntegrity)
110102
{
111-
signature = AuthContext.MakeSignature(buffers, SendSequenceNo);
103+
signature = AuthContext.MakeSignature(buffers, send_sequence_no);
112104
}
113105
else
114106
{
115-
signature = AuthContext.EncryptMessage(buffers, SecurityQualityOfProtectionFlags.None, SendSequenceNo);
107+
signature = AuthContext.EncryptMessage(buffers, SecurityQualityOfProtectionFlags.None, send_sequence_no);
116108
stub_data = stub_data_buffer.ToArray();
117109
RpcUtils.DumpBuffer(true, "Send Encrypted Data", stub_data);
118110
}
@@ -121,7 +113,7 @@ internal byte[] ProtectPDU(byte[] header, ref byte[] stub_data, int auth_padding
121113
return AuthData.ToArray(TransportSecurity, auth_padding_length, ContextId, signature);
122114
}
123115

124-
internal byte[] UnprotectPDU(byte[] header, byte[] stub_data, AuthData auth_data)
116+
internal byte[] UnprotectPDU(byte[] header, byte[] stub_data, AuthData auth_data, int recv_sequence_no)
125117
{
126118
List<SecurityBuffer> buffers = new List<SecurityBuffer>();
127119
buffers.Add(new SecurityBufferInOut(SecurityBufferType.Data | SecurityBufferType.ReadOnly, header));
@@ -137,14 +129,14 @@ internal byte[] UnprotectPDU(byte[] header, byte[] stub_data, AuthData auth_data
137129

138130
if (TransportSecurity.AuthenticationLevel == RpcAuthenticationLevel.PacketIntegrity)
139131
{
140-
if (!AuthContext.VerifySignature(buffers, signature, RecvSequenceNo))
132+
if (!AuthContext.VerifySignature(buffers, signature, recv_sequence_no))
141133
{
142134
throw new RpcTransportException("Invalid response PDU signature.");
143135
}
144136
}
145137
else
146138
{
147-
AuthContext.DecryptMessage(buffers, signature, RecvSequenceNo);
139+
AuthContext.DecryptMessage(buffers, signature, recv_sequence_no);
148140
stub_data = stub_data_buffer.ToArray();
149141
}
150142

0 commit comments

Comments
 (0)