это немного сложно объяснить, особенно для не носителей английского языка:
Я хочу использовать некоторые функции цифровой подписи на основе эллиптических кривых реализации C # криптотеки BouncyCastle . Я написал небольшой класс-оболочку C #, который имеет следующие методы:
public static void generateKeyPair(out byte[] private_key, out byte[] public_key)
public static void SignData(byte[] data, byte[] private_key, out byte[] signature)
public static void VerifyData(byte[] signature, byte[] data, byte[] public_key, out bool ok)
, которые все имеют доступ к фактической библиотеке BouncyCastle, BouncyCastle.Crypto.dll. Затем я
создал «Файл ключа строгого имени Visual Studio» и скомпилировал файл класса-оболочки с исходной библиотекой BouncyCastle в качестве ресурса и только что созданным файлом ключа.
В SQL Server я сделал следующее:
USE ACS
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE WITH OVERRIDE;
EXEC sp_configure 'xp_cmdshell', 1
EXEC sp_configure 'CLR enabled', 1;
RECONFIGURE WITH OVERRIDE;
ALTER DATABASE ACS SET TRUSTWORTHY OFF
USE master
CREATE ASYMMETRIC KEY CLR_Key_Wrapper FROM EXECUTABLE FILE = 'C:\Wrapper.dll'
CREATE ASYMMETRIC KEY CLR_Key_BouncyCastle FROM EXECUTABLE FILE = 'C:\BouncyCastle.Crypto.dll'
CREATE LOGIN CLR_Login_Wrapper FROM ASYMMETRIC KEY CLR_Key_Wrapper
CREATE LOGIN CLR_Login_BouncyCastle FROM ASYMMETRIC KEY CLR_Key_BouncyCastle
GRANT UNSAFE ASSEMBLY TO CLR_Login_Wrapper
GRANT UNSAFE ASSEMBLY TO CLR_Login_BouncyCastle
USE ACS
CREATE ASSEMBLY CLR FROM 'C:\Wrapper.dll' WITH PERMISSION_SET = UNSAFE
GO
CREATE PROCEDURE Generate_Keypair
(
@BSI_or_NIST BIT,
@Private_Key VARBINARY(64) OUTPUT,
@Public_Key VARBINARY(128) OUTPUT
)
AS EXTERNAL NAME CLR.Wrapper.generateKeyPair
GO
CREATE PROCEDURE Sign_Data
(
@BSI_or_NIST BIT,
@Data VARBINARY(8000),
@Private_Key VARBINARY(64),
@Signature VARBINARY(128) OUTPUT
)
AS EXTERNAL NAME CLR.Wrapper.SignData
GO
CREATE PROCEDURE Verify_Data
(
@BSI_or_NIST BIT,
@Signature VARBINARY(128),
@Data VARBINARY(8000),
@Public_Key VARBINARY(128),
@OK BIT OUTPUT
)
AS EXTERNAL NAME CLR.Wrapper.VerifyData
Теперь, используя три процедуры Generate_Keypair, Sign_Data и Verify_Data в пакете TSQL или с помощью вызова процедуры, например, клиентское приложение .Net иногда работает нормально, но иногда это приводит к тому, что служба MSSQLSERVER заходит в нечто вроде бесконечного цикла при использовании 100% ЦП, особенно когда я пытаюсь установить все это на другую машину, чем моя собственная, где я разработал код выше (тем не менее, на моей собственной машине это бывает тоже, но реже).
Единственное, что можно сделать, - это отменить выполняющийся запрос и отбросить сборку, которая занимает довольно много времени, когда процессор используется на 100%.
Может кто-нибудь сказать мне, что я сделал не так? Заранее спасибо,
Jan