1818using NtApiDotNet . Win32 . Security . Native ;
1919using System ;
2020using System . Collections . Generic ;
21- using System . Linq ;
2221using System . Runtime . InteropServices ;
2322using System . Security . Cryptography . X509Certificates ;
2423
@@ -75,35 +74,6 @@ internal static string GetPackageName(SecHandle context)
7574 return null ;
7675 }
7776
78- internal static List < SecBuffer > ToBufferList ( this IEnumerable < SecurityBuffer > buffers , DisposableList list )
79- {
80- return buffers . Select ( b => b . ToBuffer ( list ) ) . ToList ( ) ;
81- }
82-
83- internal static SecBufferDesc ToDesc ( this IEnumerable < SecBuffer > buffers , DisposableList list )
84- {
85- var arr = buffers . ToArray ( ) ;
86- if ( arr . Length == 0 )
87- return null ;
88- return list . AddResource ( new SecBufferDesc ( arr ) ) ;
89- }
90-
91- internal static void UpdateBuffers ( this IList < SecurityBuffer > buffers , SecBufferDesc desc )
92- {
93- if ( desc == null )
94- return ;
95- var update_buffers = desc . ToArray ( ) ;
96- for ( int i = 0 ; i < buffers . Count ; ++ i )
97- {
98- buffers [ i ] . FromBuffer ( update_buffers [ i ] ) ;
99- }
100- }
101-
102- internal static void UpdateBuffers ( this IEnumerable < SecurityBuffer > buffers , SecBufferDesc desc )
103- {
104- UpdateBuffers ( buffers . ToArray ( ) , desc ) ;
105- }
106-
10777 internal static byte [ ] MakeSignature (
10878 SecHandle context ,
10979 int flags ,
@@ -115,12 +85,10 @@ internal static byte[] MakeSignature(
11585 SecurityBufferOut signature_buffer = new SecurityBufferOut ( SecurityBufferType . Token , max_sig_size ) ;
11686 sig_buffers . Add ( signature_buffer ) ;
11787
118- using ( var list = new DisposableList ( ) )
88+ using ( var desc = SecurityBufferDescriptor . Create ( sig_buffers ) )
11989 {
120- List < SecBuffer > buffers = sig_buffers . ToBufferList ( list ) ;
121- SecBufferDesc desc = buffers . ToDesc ( list ) ;
122- SecurityNativeMethods . MakeSignature ( context , flags , desc , sequence_no ) . CheckResult ( ) ;
123- sig_buffers . UpdateBuffers ( desc ) ;
90+ SecurityNativeMethods . MakeSignature ( context , flags , desc . Value , sequence_no ) . CheckResult ( ) ;
91+ desc . UpdateBuffers ( ) ;
12492 return signature_buffer . ToArray ( ) ;
12593 }
12694 }
@@ -144,11 +112,10 @@ internal static bool VerifySignature(
144112 {
145113 List < SecurityBuffer > sig_buffers = new List < SecurityBuffer > ( messages ) ;
146114 sig_buffers . Add ( new SecurityBufferInOut ( SecurityBufferType . Token | SecurityBufferType . ReadOnly , signature ) ) ;
147- using ( var list = new DisposableList ( ) )
115+ using ( var desc = SecurityBufferDescriptor . Create ( sig_buffers ) )
148116 {
149- List < SecBuffer > buffers = sig_buffers . ToBufferList ( list ) ;
150- SecBufferDesc desc = buffers . ToDesc ( list ) ;
151- return SecurityNativeMethods . VerifySignature ( context , desc , sequence_no , out int _ ) == SecStatusCode . SUCCESS ;
117+ return SecurityNativeMethods . VerifySignature ( context , desc . Value ,
118+ sequence_no , out int _ ) == SecStatusCode . SUCCESS ;
152119 }
153120 }
154121
@@ -218,12 +185,10 @@ internal static void EncryptMessageNoSignature(
218185 throw new ArgumentNullException ( nameof ( messages ) ) ;
219186 }
220187
221- using ( var list = new DisposableList ( ) )
188+ using ( var desc = SecurityBufferDescriptor . Create ( messages ) )
222189 {
223- var buffers = messages . ToBufferList ( list ) ;
224- var desc = buffers . ToDesc ( list ) ;
225- SecurityNativeMethods . EncryptMessage ( context , flags , desc , sequence_no ) . CheckResult ( ) ;
226- messages . UpdateBuffers ( desc ) ;
190+ SecurityNativeMethods . EncryptMessage ( context , flags , desc . Value , sequence_no ) . CheckResult ( ) ;
191+ desc . UpdateBuffers ( ) ;
227192 }
228193 }
229194
@@ -283,12 +248,10 @@ internal static void DecryptMessageNoSignature(
283248 throw new ArgumentNullException ( nameof ( messages ) ) ;
284249 }
285250
286- using ( var list = new DisposableList ( ) )
251+ using ( var desc = SecurityBufferDescriptor . Create ( messages ) )
287252 {
288- var buffers = messages . ToBufferList ( list ) ;
289- var desc = buffers . ToDesc ( list ) ;
290- SecurityNativeMethods . DecryptMessage ( context , desc , sequence_no , out _ ) . CheckResult ( ) ;
291- messages . UpdateBuffers ( desc ) ;
253+ SecurityNativeMethods . DecryptMessage ( context , desc . Value , sequence_no , out _ ) . CheckResult ( ) ;
254+ desc . UpdateBuffers ( ) ;
292255 }
293256 }
294257
@@ -371,25 +334,20 @@ internal static SecStatusCode InitializeSecurityContext(
371334 LargeInteger expiry ,
372335 bool throw_on_error )
373336 {
374- using ( DisposableList list = new DisposableList ( ) )
337+ using ( SecurityBufferDescriptor in_buffer_desc = SecurityBufferDescriptor . Create ( input ) ,
338+ out_buffer_desc = SecurityBufferDescriptor . Create ( output ) )
375339 {
376- var input_buffers = input ? . ToBufferList ( list ) ;
377- var output_buffers = output ? . ToBufferList ( list ) ;
378-
379- var in_buffer_desc = input_buffers . ToDesc ( list ) ;
380- var out_buffer_desc = output_buffers . ToDesc ( list ) ;
381-
382340 var result = SecurityNativeMethods . InitializeSecurityContext ( credential . CredHandle ,
383- context , target_name , req_attributes , 0 , data_rep , in_buffer_desc , 0 ,
384- new_context , out_buffer_desc , out ret_attributes , expiry ) . CheckResult ( throw_on_error ) ;
341+ context , target_name , req_attributes , 0 , data_rep , in_buffer_desc . Value , 0 ,
342+ new_context , out_buffer_desc . Value , out ret_attributes , expiry ) . CheckResult ( throw_on_error ) ;
385343 if ( ! result . IsSuccess ( ) )
386344 return result ;
387345
388346 try
389347 {
390348 if ( result == SecStatusCode . SEC_I_COMPLETE_NEEDED || result == SecStatusCode . SEC_I_COMPLETE_AND_CONTINUE )
391349 {
392- var comp_result = SecurityNativeMethods . CompleteAuthToken ( new_context , out_buffer_desc ) . CheckResult ( throw_on_error ) ;
350+ var comp_result = SecurityNativeMethods . CompleteAuthToken ( new_context , out_buffer_desc . Value ) . CheckResult ( throw_on_error ) ;
393351 if ( ! comp_result . IsSuccess ( ) )
394352 return comp_result ;
395353 }
@@ -398,7 +356,7 @@ internal static SecStatusCode InitializeSecurityContext(
398356 {
399357 if ( result . IsSuccess ( ) )
400358 {
401- output ? . UpdateBuffers ( out_buffer_desc ) ;
359+ out_buffer_desc . UpdateBuffers ( ) ;
402360 }
403361 }
404362
@@ -418,23 +376,19 @@ internal static SecStatusCode AcceptSecurityContext(
418376 LargeInteger expiry ,
419377 bool throw_on_error )
420378 {
421- using ( DisposableList list = new DisposableList ( ) )
379+ using ( SecurityBufferDescriptor in_buffer_desc = SecurityBufferDescriptor . Create ( input ) ,
380+ out_buffer_desc = SecurityBufferDescriptor . Create ( output ) )
422381 {
423- var input_buffers = input ? . ToBufferList ( list ) ;
424- var output_buffers = output ? . ToBufferList ( list ) ;
425-
426- var in_buffer_desc = input_buffers . ToDesc ( list ) ;
427- var out_buffer_desc = output_buffers . ToDesc ( list ) ;
428-
429382 SecStatusCode result = SecurityNativeMethods . AcceptSecurityContext ( credential . CredHandle , context ,
430- in_buffer_desc , req_attributes , data_rep , new_context , out_buffer_desc , out ret_attributes , expiry ) . CheckResult ( throw_on_error ) ;
383+ in_buffer_desc . Value , req_attributes , data_rep , new_context ,
384+ out_buffer_desc . Value , out ret_attributes , expiry ) . CheckResult ( throw_on_error ) ;
431385 if ( ! result . IsSuccess ( ) )
432386 return result ;
433387 try
434388 {
435389 if ( result == SecStatusCode . SEC_I_COMPLETE_NEEDED || result == SecStatusCode . SEC_I_COMPLETE_AND_CONTINUE )
436390 {
437- var comp_result = SecurityNativeMethods . CompleteAuthToken ( context , out_buffer_desc ) . CheckResult ( throw_on_error ) ;
391+ var comp_result = SecurityNativeMethods . CompleteAuthToken ( context , out_buffer_desc . Value ) . CheckResult ( throw_on_error ) ;
438392 if ( ! comp_result . IsSuccess ( ) )
439393 return comp_result ;
440394 }
@@ -443,7 +397,7 @@ internal static SecStatusCode AcceptSecurityContext(
443397 {
444398 if ( result . IsSuccess ( ) )
445399 {
446- output ? . UpdateBuffers ( out_buffer_desc ) ;
400+ out_buffer_desc . UpdateBuffers ( ) ;
447401 }
448402 }
449403
@@ -510,11 +464,9 @@ internal static AuthenticationContextKeyInfo GetKeyInfo(SecHandle context)
510464
511465 internal static SecStatusCode ApplyControlToken ( SecHandle context , IEnumerable < SecurityBuffer > input , bool throw_on_error )
512466 {
513- using ( var list = new DisposableList ( ) )
467+ using ( var desc = SecurityBufferDescriptor . Create ( input ) )
514468 {
515- var buffers = input ? . ToBufferList ( list ) ;
516- var desc = buffers ? . ToDesc ( list ) ;
517- return SecurityNativeMethods . ApplyControlToken ( context , desc ) . CheckResult ( throw_on_error ) ;
469+ return SecurityNativeMethods . ApplyControlToken ( context , desc . Value ) . CheckResult ( throw_on_error ) ;
518470 }
519471 }
520472 }
0 commit comments