В случае, если кто-либо помощи, я использую следующее. Сохраняет вас от необходимости проекта Managed C ++:
общественный класс ECDSA статического
{
[DllImport ("secp256k1.dll", EntryPoint = "secp256k1_start", CallingConvention = CallingConvention.Cdecl)]
частный статический ехЬегп аннулируется StartCrypto ();
[DllImport ("secp256k1.dll", EntryPoint = "secp256k1_stop", CallingConvention = CallingConvention.Cdecl)]
частное статический ехЬегп аннулируется StopCrypto ();
[DllImport ("secp256k1.dll", EntryPoint = "secp256k1_ecdsa_verify", CallingConvention = CallingConvention.Cdecl)]
общественности статического ехЬегпа INT VerifySignature (байты [] тзд, Int msglen, байты [] сиг, Int siglen, байты [] Публичный, Int pubkeylen);
[DllImport ("secp256k1.dll", EntryPoint = "secp256k1_ecdsa_sign", CallingConvention = CallingConvention.Cdecl)]
общественности статической ехЬегп INT SignMessage (байт [] тзд, Int msglen, байт [] сиг, исх INT siglen, байт [] seckey, исх INT Nonce);
[DllImport ("secp256k1.dll", EntryPoint = "secp256k1_ecdsa_sign_compact", CallingConvention = CallingConvention.Cdecl)]
общественности статической ехЬегп INT SignCompact (байт [] тзд, Int msglen, байт [] sig64, байт [] seckey, исх INT Nonce, исх INT RECID);
[DllImport ("secp256k1.dll", EntryPoint = "secp256k1_ecdsa_recover_compact", CallingConvention = CallingConvention.Cdecl)]
общественности статического ехЬегпа INT RecoverCompact (байты [] тзд, Int msglen, байты [] sig64, байты [] Публичный, исй INT pubkeylen, Int сжаты, Int RECID);
[DllImport ("secp256k1.dll", EntryPoint = "secp256k1_ecdsa_seckey_verify", CallingConvention = CallingConvention.Cdecl)]
общественности статической ехЬегп INT VerifySecretKey (байт [] seckey);
[DllImport ("secp256k1.dll", EntryPoint = "secp256k1_ecdsa_pubkey_verify", CallingConvention = CallingConvention.Cdecl)]
общественности статического ехЬегпа INT VerifyPublicKey (байты [] Публичный, Int pubkeylen);
[DllImport ("secp256k1.dll", EntryPoint = "secp256k1_ecdsa_pubkey_create", CallingConvention = CallingConvention.Cdecl)]
общественности статического ехЬегпа INT PublicKeyFromSecretKey (байты [] Публичная, исй INT pubkeylen, байты [] seckey, Int сжатый);
[DllImport ("secp256k1.dll", EntryPoint = "secp256k1_ecdsa_pubkey_decompress", CallingConvention = CallingConvention.Cdecl)]
общественности статического ехЬегпа INT DecompressPublicKey (байты [] Публичный, исй INT pubkeylen);
[DllImport ("secp256k1.dll", EntryPoint = "secp256k1_ecdsa_pubkey_compress", CallingConvention = CallingConvention.Cdecl)]
общественности статического ехЬегпа INT CompressPublicKey (байты [] Публичный, исй INT pubkeylen);
[DllImport ("secp256k1.dll", EntryPoint = "secp256k1_ecdsa_privkey_export", CallingConvention = CallingConvention.Cdecl)]
общественности статического ехЬегпа INT ExportPrivateKey (байты [] seckey, байты [] privkey, исй INT privkeylen, Int сжатый);
[DllImport ("secp256k1.dll", EntryPoint = "secp256k1_ecdsa_privkey_import", CallingConvention = CallingConvention.Cdecl)]
общественности статической ехЬегп INT ImportPrivateKey (байт [] seckey, байт [] privkey, Int privkeylen);
[DllImport ("secp256k1.dll", EntryPoint = "secp256k1_ecdsa_privkey_tweak_add", CallingConvention = CallingConvention.Cdecl)]
общественности статического ехЬегпа INT PrivateKeyTweakAdd (байты [] seckey, байты [] настройка);
[DllImport ("secp256k1.dll", EntryPoint = "secp256k1_ecdsa_pubkey_tweak_add", CallingConvention = CallingConvention.Cdecl)]
общественности статического ехЬегпа INT PublicKeyTweakAdd (байты [] Публичная, Int pubkeylen, байты [] настройка);
[DllImport ("secp256k1.dll", EntryPoint = "secp256k1_ecdsa_privkey_tweak_mul", CallingConvention = CallingConvention.Cdecl)]
общественности статического ехЬегпа INT PrivateKeyTweakMul (байты [] seckey, байты [] настройка);
[DllImport ("secp256k1.dll", EntryPoint = "secp256k1_ecdsa_pubkey_tweak_mul", CallingConvention = CallingConvention.Cdecl)]
общественности статического ехЬегпа INT PublicKeyTweakMul (байты [] Публичная, Int pubkeylen, байты [] настройка);
}
Это, вероятно, немного медленнее при подписании сделки из-за pinvokes, когда зацикливание, чтобы найти правильное временное значение, но кроме этого, это чистый C # вместо управляемого C ++.
Edit: на самом деле, теперь, когда я посмотрел на коде немного ближе, это так же быстро, если не быстрее, чем версия управляемого C ++, так как он звонит, управляемый и неуправляемый код в цикле, поэтому он должен сделать PInvoke в петля тоже.
Управляемый C ++ является переменчивым зверем, вы никогда не знаете, где он идет управляемым или родным (эти переходы убийство). По крайней мере, с указанным кодом, вы знаете наверняка, когда это произойдет.