diff --git a/Contexts/Context.cs b/Contexts/Context.cs index 0822580..5d2a0ca 100644 --- a/Contexts/Context.cs +++ b/Contexts/Context.cs @@ -279,13 +279,37 @@ namespace NSspi.Contexts using ( adapter = new SecureBufferAdapter( new[] { dataBuffer, signatureBuffer } ) ) { - // TODO CER - status = ContextNativeMethods.MakeSignature( - ref this.ContextHandle.rawHandle, - 0, - adapter.Handle, - 0 - ); + bool gotRef = false; + + RuntimeHelpers.PrepareConstrainedRegions(); + try + { + this.ContextHandle.DangerousAddRef( ref gotRef ); + } + catch ( Exception ) + { + if ( gotRef ) + { + this.ContextHandle.DangerousRelease(); + gotRef = false; + } + + throw; + } + finally + { + if ( gotRef ) + { + status = ContextNativeMethods.MakeSignature( + ref this.ContextHandle.rawHandle, + 0, + adapter.Handle, + 0 + ); + + this.ContextHandle.DangerousRelease(); + } + } } if ( status != SecurityStatus.OK ) @@ -360,12 +384,37 @@ namespace NSspi.Contexts using ( adapter = new SecureBufferAdapter( new[] { dataBuffer, signatureBuffer } ) ) { - status = ContextNativeMethods.VerifySignature( - ref this.ContextHandle.rawHandle, - adapter.Handle, - 0, - 0 - ); + bool gotRef = false; + + RuntimeHelpers.PrepareConstrainedRegions(); + try + { + this.ContextHandle.DangerousAddRef( ref gotRef ); + } + catch ( Exception ) + { + if ( gotRef ) + { + this.ContextHandle.DangerousRelease(); + gotRef = false; + } + + throw; + } + finally + { + if ( gotRef ) + { + status = ContextNativeMethods.VerifySignature( + ref this.ContextHandle.rawHandle, + adapter.Handle, + 0, + 0 + ); + + this.ContextHandle.DangerousRelease(); + } + } } if ( status == SecurityStatus.OK )