internal void EncryptInPlace(byte[] buffer, int bufferStartOffset, int dataLen, out int encryptedDataLen) { this.ThrowIfDisposed(); encryptedDataLen = 0; if ((((bufferStartOffset + dataLen) + this.StreamSizes.header) + this.StreamSizes.trailer) > buffer.Length) { this.OnBadData(); } byte[] data = new byte[0]; int offset = (bufferStartOffset + this.StreamSizes.header) + dataLen; SecurityBuffer[] input = new SecurityBuffer[] { new SecurityBuffer(buffer, bufferStartOffset, this.StreamSizes.header, System.IdentityModel.BufferType.Header), new SecurityBuffer(buffer, bufferStartOffset + this.StreamSizes.header, dataLen, System.IdentityModel.BufferType.Data), new SecurityBuffer(buffer, offset, this.StreamSizes.trailer, System.IdentityModel.BufferType.Trailer), new SecurityBuffer(data, System.IdentityModel.BufferType.Empty) }; int error = SspiWrapper.EncryptMessage(this.securityContext, input, 0); if (error != 0) { throw System.ServiceModel.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new Win32Exception(error)); } int size = 0; for (int i = 0; i < input.Length; i++) { if (input[i].type == System.IdentityModel.BufferType.Trailer) { size = input[i].size; encryptedDataLen = (this.StreamSizes.header + dataLen) + size; return; } } this.OnBadData(); }
public byte[] Encrypt(byte[] input) { if (input == null) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("input"); } ThrowIfDisposed(); SecurityBuffer[] securityBuffer = new SecurityBuffer[3]; byte[] tokenBuffer = DiagnosticUtility.Utility.AllocateByteArray(SecuritySizes.SecurityTrailer); securityBuffer[0] = new SecurityBuffer(tokenBuffer, 0, tokenBuffer.Length, BufferType.Token); byte[] dataBuffer = DiagnosticUtility.Utility.AllocateByteArray(input.Length); Buffer.BlockCopy(input, 0, dataBuffer, 0, input.Length); securityBuffer[1] = new SecurityBuffer(dataBuffer, 0, dataBuffer.Length, BufferType.Data); byte[] paddingBuffer = DiagnosticUtility.Utility.AllocateByteArray(SecuritySizes.BlockSize); securityBuffer[2] = new SecurityBuffer(paddingBuffer, 0, paddingBuffer.Length, BufferType.Padding); int errorCode = SspiWrapper.EncryptMessage(this.securityContext, securityBuffer, 0); if (errorCode != 0) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new Win32Exception(errorCode)); } int tokenLen = 0; int paddingLen = 0; for (int i = 0; i < securityBuffer.Length; ++i) { if (securityBuffer[i].type == BufferType.Token) { tokenLen = securityBuffer[i].size; } else if (securityBuffer[i].type == BufferType.Padding) { paddingLen = securityBuffer[i].size; } } byte[] encryptedData = DiagnosticUtility.Utility.AllocateByteArray(checked (tokenLen + dataBuffer.Length + paddingLen)); Buffer.BlockCopy(tokenBuffer, 0, encryptedData, 0, tokenLen); Buffer.BlockCopy(dataBuffer, 0, encryptedData, tokenLen, dataBuffer.Length); Buffer.BlockCopy(paddingBuffer, 0, encryptedData, tokenLen + dataBuffer.Length, paddingLen); return(encryptedData); }
public byte[] Encrypt(byte[] input) { if (input == null) { throw System.ServiceModel.DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("input"); } this.ThrowIfDisposed(); SecurityBuffer[] bufferArray = new SecurityBuffer[3]; byte[] data = System.ServiceModel.DiagnosticUtility.Utility.AllocateByteArray(this.SecuritySizes.SecurityTrailer); bufferArray[0] = new SecurityBuffer(data, 0, data.Length, BufferType.Token); byte[] dst = System.ServiceModel.DiagnosticUtility.Utility.AllocateByteArray(input.Length); Buffer.BlockCopy(input, 0, dst, 0, input.Length); bufferArray[1] = new SecurityBuffer(dst, 0, dst.Length, BufferType.Data); byte[] buffer3 = System.ServiceModel.DiagnosticUtility.Utility.AllocateByteArray(this.SecuritySizes.BlockSize); bufferArray[2] = new SecurityBuffer(buffer3, 0, buffer3.Length, BufferType.Padding); int error = SspiWrapper.EncryptMessage(this.securityContext, bufferArray, 0); if (error != 0) { throw System.ServiceModel.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new Win32Exception(error)); } int count = 0; int size = 0; for (int i = 0; i < bufferArray.Length; i++) { if (bufferArray[i].type == BufferType.Token) { count = bufferArray[i].size; } else if (bufferArray[i].type == BufferType.Padding) { size = bufferArray[i].size; } } byte[] buffer4 = System.ServiceModel.DiagnosticUtility.Utility.AllocateByteArray((count + dst.Length) + size); Buffer.BlockCopy(data, 0, buffer4, 0, count); Buffer.BlockCopy(dst, 0, buffer4, count, dst.Length); Buffer.BlockCopy(buffer3, 0, buffer4, count + dst.Length, size); return(buffer4); }
/// <summary> /// Assumes that the data to encrypt is "header" bytes ahead of bufferStartOffset /// </summary> internal unsafe void EncryptInPlace(byte[] buffer, int bufferStartOffset, int dataLen, out int encryptedDataLen) { ThrowIfDisposed(); encryptedDataLen = 0; if (bufferStartOffset + dataLen + StreamSizes.header + StreamSizes.trailer > buffer.Length) { OnBadData(); } byte[] emptyBuffer = new byte[0]; int trailerOffset = bufferStartOffset + StreamSizes.header + dataLen; SecurityBuffer[] securityBuffer = new SecurityBuffer[4]; securityBuffer[0] = new SecurityBuffer(buffer, bufferStartOffset, StreamSizes.header, BufferType.Header); securityBuffer[1] = new SecurityBuffer(buffer, bufferStartOffset + StreamSizes.header, dataLen, BufferType.Data); securityBuffer[2] = new SecurityBuffer(buffer, trailerOffset, StreamSizes.trailer, BufferType.Trailer); securityBuffer[3] = new SecurityBuffer(emptyBuffer, BufferType.Empty); int errorCode = SspiWrapper.EncryptMessage(this.securityContext, securityBuffer, 0); if (errorCode != 0) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new Win32Exception(errorCode)); } int trailerSize = 0; for (int i = 0; i < securityBuffer.Length; ++i) { if (securityBuffer[i].type == BufferType.Trailer) { trailerSize = securityBuffer[i].size; encryptedDataLen = StreamSizes.header + dataLen + trailerSize; return; } } OnBadData(); }