Статус: Активный участник
Группы: Участники
Зарегистрирован: 28.03.2018(UTC) Сообщений: 30 Сказал(а) «Спасибо»: 3 раз
|
Доброго времени суток. Пытаюсь верифицировать подписанные данные на основе внешнего сертификата. Код: private byte[] verify(byte[] data, final X509Certificate senderCert) {
//Читаем и проверяем содержимое
// final ru.CryptoPro.JCP.tools.Decoder decoder = new ru.CryptoPro.JCP.tools.Decoder();
// byte[] decData;
// try {
// decData = decoder.decodeBuffer(new ByteArrayInputStream(data));
// } catch (IOException e) {
// throw new RuntimeException("Input read error.");
// }
//
// final Asn1BerDecodeBuffer asnBuf = new Asn1BerDecodeBuffer(decData);
final Asn1BerDecodeBuffer asnBuf = new Asn1BerDecodeBuffer(data);
final ContentInfo all = new ContentInfo();
try {
all.decode(asnBuf);
} catch (Exception e) {
throw new RuntimeException("Couldn't read input data.");
}
if (!new OID(STR_CMS_OID_SIGNED).eq(all.contentType.value)) {
throw new RuntimeException("Not supported");
} // if
final SignedData cms = (SignedData) all.content;
final byte[] text;
if (cms.encapContentInfo.eContent != null) {
text = cms.encapContentInfo.eContent.value;
} else {
throw new RuntimeException("No content for verify");
}
OID digestOid = null;
final DigestAlgorithmIdentifier digestAlgorithmIdentifier =
new DigestAlgorithmIdentifier(new OID(DIGEST_OID).value);
for (int i = 0; i < cms.digestAlgorithms.elements.length; i++) {
if (cms.digestAlgorithms.elements[i].algorithm
.equals(digestAlgorithmIdentifier.algorithm)) {
digestOid = new OID(cms.digestAlgorithms.elements[i].algorithm.value);
break;
} // if
} // for
if (digestOid == null) {
throw new RuntimeException("Unknown digest");
} // if
X509Certificate cert;
if (senderCert != null) {
cert = senderCert;
} else if (cms.certificates != null) {
//Проверка на вложенном сертификате
final Asn1BerEncodeBuffer encBuf = new Asn1BerEncodeBuffer();
try {
cms.certificates.elements[0].encode(encBuf);
} catch (Exception e) {
throw new RuntimeException("Couldn't encode data on EncodeBuffer.");
}
try {
final CertificateFactory cf = CertificateFactory.getInstance("X.509");
cert = (X509Certificate) cf.generateCertificate(encBuf.getInputStream());
} catch (Exception e) {
throw new RuntimeException("Couldn't recreate certificate from cms.");
}
} else {
throw new RuntimeException("Certificate not found!");
}
final SignerInfo info = cms.signerInfos.elements[0];
if (!digestOid.equals(new OID(info.digestAlgorithm.algorithm.value))) {
throw new RuntimeException("Not signed on certificate.");
} // if
// Проверяем подпись.
Signature signature;
try {
signature = Signature.getInstance(GOST_EL_SIGN_NAME, PROVIDER_NAME);
signature.initVerify(cert);
signature.update(text);
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("Couldn't recreate the sign from cms.");
}
try {
if (!signature.verify(info.signature.value)) throw new RuntimeException("Sign is invalid!");
} catch (SignatureException e) {
throw new RuntimeException("Signature error.");
}
return text;
}
signature.verify всегда возвращает false. На тех же данных через утилиту cryptcp проверка проходит успешно. В чем может быть ошибка ?
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,005 Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 715 раз в 675 постах
|
Здравствуйте. Возможно, подпись выполнена не на данные, а на атрибуты. Посмотрите пример расширенной проверки в пакете CMS, класс CMSVerify, архив samples-sources.jar. |
|
1 пользователь поблагодарил Евгений Афанасьев за этот пост.
|
YuriyI оставлено 10.05.2018(UTC)
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 28.03.2018(UTC) Сообщений: 30 Сказал(а) «Спасибо»: 3 раз
|
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close