public static EVP_MD_CTX EVP_MD_CTX_copy_ex(EVP_MD_CTX original) { var copy = EVP_MD_CTX_new(); var result = EVP_MD_CTX_copy_ex_internal(copy, original); ThrowOnErrorReturnCode(result); return(copy); }
public unsafe static int EVP_DigestUpdate(EVP_MD_CTX ctx, ReadOnlySpan <byte> span) { fixed(void *ptr = &span.DangerousGetPinnableReference()) { var result = EVP_DigestUpdate(ctx, ptr, span.Length); ThrowOnErrorReturnCode(result); return(result); } }
public unsafe static int EVP_DigestFinal_ex(EVP_MD_CTX ctx, Span <byte> output) { fixed(void *ptr = &output.DangerousGetPinnableReference()) { var size = output.Length; var result = EVP_DigestFinal_ex(ctx, ptr, ref size); ThrowOnErrorReturnCode(result); return(size); } }
internal OpenSslHash(EVP_HashType hashTypePointer, int size, HashType hashType) { _hashType = hashType; _ctx = EVP_MD_CTX_new(hashTypePointer); _size = size; }
public static extern int EVP_DigestFinal_ex(EVP_MD_CTX* handle, byte[] array, IntPtr psize);
public static extern int EVP_DigestUpdate(EVP_MD_CTX* handle, byte[] array, UIntPtr size);
public static extern int EVP_DigestInit_ex(EVP_MD_CTX* handle, EVP_MD* type, IntPtr engine);
internal static extern unsafe int EVP_SignUpdate(EVP_MD_CTX ctx, void *d, int cnt);
private static extern unsafe int EVP_DigestUpdate(EVP_MD_CTX ctx, void *d, int cnt);
private static extern int EVP_DigestInit_ex(EVP_MD_CTX ctx, EVP_HashType type, IntPtr impl);
internal static extern unsafe int EVP_DigestSignFinal(EVP_MD_CTX ctx, void *out_sig, ref UIntPtr out_sig_len);
internal static extern int EVP_MD_CTX_copy_ex(EVP_MD_CTX copy, EVP_MD_CTX original);
private static extern int EVP_MD_CTX_copy_ex_internal(EVP_MD_CTX copy, EVP_MD_CTX original);
private static extern unsafe int EVP_DigestFinal_ex(EVP_MD_CTX ctx, void *md, ref int s);
public unsafe int SignHash(IHashProvider provider, SignatureScheme scheme, ref WritableBuffer writer, byte *message, int messageLength) { var keySize = SignatureSize(scheme); IntPtr hashType; switch (scheme) { case SignatureScheme.rsa_pkcs1_sha256: case SignatureScheme.rsa_pss_sha256: hashType = EVP_sha256; break; case SignatureScheme.rsa_pkcs1_sha512: case SignatureScheme.rsa_pss_sha512: hashType = EVP_sha512; break; case SignatureScheme.rsa_pkcs1_sha384: case SignatureScheme.rsa_pss_sha384: hashType = EVP_sha384; break; default: ExceptionHelper.ThrowException(new ArgumentOutOfRangeException(nameof(scheme))); hashType = IntPtr.Zero; break; } EVP_MD_CTX ctx = EVP_MD_CTX_new(); EVP_PKEY_CTX pctx; GCHandle handle; try { ThrowOnError(EVP_DigestSignInit(ctx, &pctx, hashType, IntPtr.Zero, _key)); ThrowIfNegative(EVP_PKEY_CTX_ctrl(pctx, EVP_PKEY_type.EVP_PKEY_RSA, EVP_PKEY_Ctrl_OP.EVP_PKEY_OP_TYPE_SIG, EVP_PKEY_Ctrl_Command.EVP_PKEY_CTRL_MD, 0, (void *)hashType)); if ((((ushort)scheme) & 0x00FF) == 1) { ThrowIfNegative(EVP_PKEY_CTX_ctrl(pctx, EVP_PKEY_type.EVP_PKEY_RSA, EVP_PKEY_Ctrl_OP.EVP_PKEY_OP_NONE , EVP_PKEY_Ctrl_Command.EVP_PKEY_CTRL_RSA_PADDING, (int)RSA_PADDING.RSA_PKCS1_PADDING, null)); } else { //PSS Padding ThrowIfNegative(EVP_PKEY_CTX_ctrl(pctx, EVP_PKEY_type.EVP_PKEY_RSA, EVP_PKEY_Ctrl_OP.EVP_PKEY_OP_SIGN , EVP_PKEY_Ctrl_Command.EVP_PKEY_CTRL_RSA_PADDING, (int)RSA_PADDING.RSA_PKCS1_PSS_PADDING, null)); ThrowIfNegative(EVP_PKEY_CTX_ctrl(pctx, EVP_PKEY_type.EVP_PKEY_RSA, EVP_PKEY_Ctrl_OP.EVP_PKEY_OP_SIGN , EVP_PKEY_Ctrl_Command.EVP_PKEY_CTRL_RSA_PSS_SALTLEN, 32, null)); } ThrowOnError(EVP_DigestUpdate(ctx, message, messageLength)); var size = UIntPtr.Zero; ThrowOnError(EVP_DigestSignFinal(ctx, null, ref size)); writer.Ensure((int)size); var output = writer.Memory.GetPointer(out handle); ThrowOnError(EVP_DigestSignFinal(ctx, output, ref size)); writer.Advance((int)size); return((int)size); } finally { ctx.Free(); if (handle.IsAllocated) { handle.Free(); } } }
internal static extern int EVP_DigestInit_ex(EVP_MD_CTX ctx, IntPtr type, IntPtr impl);
public static extern void EVP_MD_CTX_destroy(EVP_MD_CTX* handle);
internal static extern unsafe int EVP_SignFinal(EVP_MD_CTX ctx, void *sig, ref int s, EVP_PKEY pkey);
public static extern EVP_MD* EVP_MD_CTX_md(EVP_MD_CTX* handle);
internal static extern unsafe int EVP_DigestSignInit(EVP_MD_CTX ctx, EVP_PKEY_CTX *pctx, IntPtr type, IntPtr engine, EVP_PKEY pkey);
internal HashInstance(EVP_MD_CTX ctx, int size, HashType hashType) { _hashType = hashType; _ctx = ctx; _size = size; }