Не пошло.
Вот так создаю хэш:
(C#)userhash = RutokenWeb.GetRandomHash();
Хэш:
d259f30e4fd9761b3de38b58e57f2038455dc41d0bcc46377bb8cf9c225ebfc8
Хэш подписанный в браузере,'178'- имя контейнера:
(JS)plugin.rtwSign('178', userhash)
FAF35341EA01FF7F1624FE069C0BA2FFF722D450A2059FF3B888B877E8562A8D0F42A019472DF31ABDF8E63C52E2B57751F256D19F28A3FCC1A3F0BDD37281DE
Использованный открытый ключ:
(JS)plugin.rtwGetPublicKey('178')
743FBDA620C5050F4E03FFA83DB433DB712A14F571065680CFC9F5E77481C861E13101223A079FB9117A70A973F9588D2C831CB3EA1663C8465EEB6CCC6FF568
результат:
(C#)RutokenWeb.CheckSignature(signedhash, userhash, publickey) -> true
Теперь подписываем средствами SDK csharp:
(C#)List<ObjectHandle> privateKeys = session.FindAllObjects(PrivateKeyAttributes);
(C#)var signMechanism = new Mechanism((uint)Extended_CKM.CKM_GOSTR3410);
(C#)byte[] signature = session.Sign(signMechanism, privateKeys[0], userhash);
Получаем:
24282daa267ad10ea9340f68dae9db82375e593376cbd46f654a713ffcdb7cb1d9c89bc185138802a42aa02e2c8f516abdd9aefb4455f33c04c9ac3d6b35fbbc
Проверяем средствами SDK csharp:
(C#)session.Verify(signMechanism, publicKeys[0], userhash, signature, out bool isSignatureValid) -> true
Достаем открытый ключ:
(C#)session.GetAttributeValue(publicKeys[0], new List<CKA> { CKA.CKA_VALUE })[0].GetValueAsByteArray()
61c88174e7f5c9cf80560671f5142a71db33b43da8ff034e0f05c520a6bd3f7468f56fcc6ceb5e46c86316eab31c832c8d58f973a9707a11b99f073a220131e1
Преобразуем его, получаем:
743fbda620c5050f4e03ffa83db433db712a14f571065680cfc9f5e77481c861e13101223a079fb9117a70a973f9588d2c831cb3ea1663c8465eeb6ccc6ff568
После преобразования он совпадает с полученным из JS.
Проверяем средствами RutokenWeb:
(C#)RutokenWeb.CheckSignature(signature, userhash, publickey) -> false
(не показываю преобразований из массива байт в строку и обратно - они разумеется есть там где необходимо)