Добрый день, Владимир Салыкин,
Для подписи используется некоторая модификация предложенного на вашем сайте примера, в частности сама подпись происходит путем вызова функции sign():
plugin.sign(rutokenHandle, certHandle, textToSign, false, {addSignTime: true}) ,
где textToSign - подписываемая строка.
Подпись и проверка происходит с использованием алгоритмов ГОСТ Р 34.11-2012/34.10-2012 512 бит.
Как уже писал ранее, полученное CMS сообщение пересылается на сервер и парсится используя средства bouncycastle:
byte[] signerBytes = Base64.decodeBase64(data);
CMSSignedData signedData = new CMSSignedData(signerBytes);
content = (byte[]) signedData.getSignedContent().getContent();
SignerInformation signerInformation = signedData.getSignerInfos().get(signer.getSID());
AttributeTable signedAttributes = signerInformation.getSignedAttributes();
byte[] sign = signerInformation.getSignature(); // вытаскиваем "голую" подпись
Данные записываются в БД.
Код проверки:
KeyFactory keyFactory = KeyFactory.getInstance("GOST3410_2012_512");
EncodedKeySpec spec = new X509EncodedKeySpec(bytesPublicKey);
publicKey = keyFactory.generatePublic(spec);
Signature signature = Signature.getInstance("GOST3411_2012_512withGOST3410_2012_512");
signature.initVerify(publicKey);
signature.update(content.getBytes(StandardCharsets.UTF_8));
boolean flagVerified = signature.verify(signedBytes);
Метод verify() всегда возвращает false.