public static SecurityStatusPal EncryptMessage( SafeDeleteContext securityContext, ReadOnlyMemory <byte> input, int headerSize, int trailerSize, ref byte[] output, out int resultSize) { resultSize = 0; Debug.Assert(input.Length > 0, $"{nameof(input.Length)} > 0 since {nameof(CanEncryptEmptyMessage)} is false"); try { SafeDeleteSslContext sslContext = (SafeDeleteSslContext)securityContext; SafeSslHandle sslHandle = sslContext.SslContext; PAL_SSLStreamStatus ret = Interop.AndroidCrypto.SSLStreamWrite(sslHandle, input); SecurityStatusPalErrorCode statusCode = ret switch { PAL_SSLStreamStatus.OK => SecurityStatusPalErrorCode.OK, PAL_SSLStreamStatus.NeedData => SecurityStatusPalErrorCode.ContinueNeeded, PAL_SSLStreamStatus.Renegotiate => SecurityStatusPalErrorCode.Renegotiate, PAL_SSLStreamStatus.Closed => SecurityStatusPalErrorCode.ContextExpired, _ => SecurityStatusPalErrorCode.InternalError }; if (sslContext.BytesReadyForConnection <= output?.Length) { resultSize = sslContext.ReadPendingWrites(output, 0, output.Length); } else { output = sslContext.ReadPendingWrites() !; resultSize = output.Length; } return(new SecurityStatusPal(statusCode)); } catch (Exception e) { return(new SecurityStatusPal(SecurityStatusPalErrorCode.InternalError, e)); } }
public static SecurityStatusPal EncryptMessage( SafeDeleteContext securityContext, ReadOnlyMemory <byte> input, int headerSize, int trailerSize, ref byte[] output, out int resultSize) { resultSize = 0; Debug.Assert(input.Length > 0, $"{nameof(input.Length)} > 0 since {nameof(CanEncryptEmptyMessage)} is false"); try { SafeDeleteSslContext sslContext = (SafeDeleteSslContext)securityContext; SafeSslHandle sslHandle = sslContext.SslContext; unsafe { MemoryHandle memHandle = input.Retain(pin: true); try { PAL_TlsIo status; lock (sslHandle) { status = Interop.AppleCrypto.SslWrite( sslHandle, (byte *)memHandle.Pointer, input.Length, out int written); } if (status < 0) { return(new SecurityStatusPal( SecurityStatusPalErrorCode.InternalError, Interop.AppleCrypto.CreateExceptionForOSStatus((int)status))); } if (sslContext.BytesReadyForConnection <= output?.Length) { resultSize = sslContext.ReadPendingWrites(output, 0, output.Length); } else { output = sslContext.ReadPendingWrites(); resultSize = output.Length; } switch (status) { case PAL_TlsIo.Success: return(new SecurityStatusPal(SecurityStatusPalErrorCode.OK)); case PAL_TlsIo.WouldBlock: return(new SecurityStatusPal(SecurityStatusPalErrorCode.ContinueNeeded)); default: Debug.Fail($"Unknown status value: {status}"); return(new SecurityStatusPal(SecurityStatusPalErrorCode.InternalError)); } } finally { memHandle.Dispose(); } } } catch (Exception e) { return(new SecurityStatusPal(SecurityStatusPalErrorCode.InternalError, e)); } }
public static SecurityStatusPal EncryptMessage( SafeDeleteContext securityContext, byte[] input, int offset, int size, int headerSize, int trailerSize, ref byte[] output, out int resultSize) { resultSize = 0; Debug.Assert(size > 0, $"{nameof(size)} > 0 since {nameof(CanEncryptEmptyMessage)} is false"); try { SafeDeleteSslContext sslContext = (SafeDeleteSslContext)securityContext; SafeSslHandle sslHandle = sslContext.SslContext; unsafe { fixed(byte *offsetInput = &input[offset]) { int written; PAL_TlsIo status = Interop.AppleCrypto.SslWrite(sslHandle, offsetInput, size, out written); if (status < 0) { return(new SecurityStatusPal( SecurityStatusPalErrorCode.InternalError, Interop.AppleCrypto.CreateExceptionForOSStatus((int)status))); } if (sslContext.BytesReadyForConnection <= output?.Length) { resultSize = sslContext.ReadPendingWrites(output, 0, output.Length); } else { output = sslContext.ReadPendingWrites(); resultSize = output.Length; } switch (status) { case PAL_TlsIo.Success: return(new SecurityStatusPal(SecurityStatusPalErrorCode.OK)); case PAL_TlsIo.WouldBlock: return(new SecurityStatusPal(SecurityStatusPalErrorCode.ContinueNeeded)); default: Debug.Fail($"Unknown status value: {status}"); return(new SecurityStatusPal(SecurityStatusPalErrorCode.InternalError)); } } } } catch (Exception e) { return(new SecurityStatusPal(SecurityStatusPalErrorCode.InternalError, e)); } }