| 
	Статус: Активный участник
 Группы: Участники
Зарегистрирован: 04.10.2011(UTC)
 Сообщений: 74
 Откуда: Moscow
 
 Сказал(а) «Спасибо»: 1 разПоблагодарили: 1 раз в 1 постах
 
 | 
            
		      
                КриптоАРМ при проверке CAdES-X Long Type 1 подписи падает с ошибкой "Усовершенствованная подпись не содержит штампа времени на доказательства подписи или он не действителен" думаю и плагин к браузеру падает по этой же причине. В сертификатах проблем нет - все они валидны и установлены. Грешу на неправильное формирование атрибута CAdES-C-time-stamp, возможно я неправильно понял RFC. Делаю так: объекты SignatureValue, Attribute(штампа времени подписи, с ОИДом и единственной вложенной структурой TimeStampToken), Attribute(complete-certificate-references с ОИДом и структурой CompleteCertificateRefs), Attribute(complete-revocation-references с ОИДом и структурой CompleteRevocationRefs) декодирую в der (каждую из 4 структур в отдельности), склеиваю 4 массива полученных байтов, беру хэш от полученного массива - этот хеш и идет в структуру messageImprint запроса TimeStampReq. Подскажите пожалуйста, что я делаю не так Для большей наглядности: Код:private UnsignedAttributes composeUnsignedAttrs(X509Certificate userCert, X509Certificate[] caCertChain, SignatureValue signature, TSASetting tsaSetting, String ocspUrl) throws Exception {
		//signature-time-stamp
		Attribute tsAttr = new Attribute(new OID(STR_TS_OID_ATTR).value, new Attribute_values(1));
		tsAttr.values.elements[0] = getTimeStampToken(tsaSetting, signature.value);
		//todo think about array od bocspr
		BasicOCSPResponse[] ocspResponses = checkCertStatus(ocspUrl, userCert, caCertChain[0]);
		X509Certificate[] ocspCerts = getOCSPCerts(ocspResponses);
		//complete-certificate-references
		Attribute ccrAttr = new Attribute(new OID(STR_COMPLETE_CERTIFICATE_REFS_OID_ATTR).value, new Attribute_values(1));
		ccrAttr.values.elements[0] = getCompleteCertRefs(caCertChain, ocspCerts);
		//complete-revocation-references
		Attribute crrAttr = new Attribute(new OID(STR_COMPLETE_REVOCATION_REFERENCES).value, new Attribute_values(1));
		crrAttr.values.elements[0] = getCompleteRevRefs(ocspResponses);
		//certificate-values
		Attribute certValAttr = new Attribute(new OID(STR_CERTIFICATE_VALS_OID_ATTR).value, new Attribute_values(1));
		certValAttr.values.elements[0] = getCertificateValues(userCert, caCertChain, ocspCerts);
		//revocation-values
		Attribute revValAttr = new Attribute(new OID(STR_REVOCATION_VALS_OID_ATTR).value, new Attribute_values(1));
		revValAttr.values.elements[0] = getRevocationValues(ocspResponses);
		//CAdES-C-time-stamp
		Attribute cadesCTSAttr = new Attribute(new OID(STR_CADES_C_TIME_STAMP_OID_ATTR).value, new Attribute_values(1));
		cadesCTSAttr.values.elements[0] = getCAdESCTimeStamp(tsaSetting, signature, tsAttr, ccrAttr, crrAttr);
		return new UnsignedAttributes(new Attribute[] {crrAttr, ccrAttr, revValAttr, cadesCTSAttr, certValAttr, tsAttr});
}
private TimeStampToken getCAdESCTimeStamp(TSASetting setting, SignatureValue signature, Asn1Type tsAttr, Asn1Type ccrAttr, Asn1Type crrAttr) throws Exception {
		byte[] data = composeCAdESCTimeStampData(signature, tsAttr, ccrAttr, crrAttr);
		TimeStampReq request = createTimeStampRequest(setting, data, true);
		TimeStampResp response = callTSA(setting.url, toDER(request));
		if (response.status.status.value != 0 &&
			response.status.status.value != 1) {
			throw new RuntimeException("illegal tsp status:" + response.status.status.value);
		}
		return response.timeStampToken;
}
private TimeStampReq createTimeStampRequest(TSASetting tsaSetting, byte[] data, boolean includeCert) throws Exception {
		TimeStampReq r = new TimeStampReq();
		r.version = new TimeStampReq_version(BigInteger.ONE);
		r.messageImprint = new MessageImprint(getHashAlgId(), new Asn1OctetString(digestm(data, JCP.GOST_DIGEST_NAME)));
		r.reqPolicy = new TSAPolicyId(new OID(tsaSetting.policy).value);
		r.nonce = new Asn1BigInteger(BigInteger.valueOf(SecureRandom.getInstance("SHA1PRNG").nextLong()));
		r.certReq = new Asn1Boolean(includeCert);
		return r;
}
public static byte[] composeCAdESCTimeStampData(SignatureValue sigVal, Asn1Type tsAttr, Asn1Type ccrAttr, Asn1Type crrAttr) throws Asn1Exception {
		return arrayConcat(toDER(sigVal), toDER(tsAttr), toDER(ccrAttr), toDER(crrAttr));
}
private static byte[] arrayConcat(byte[]... arrays) {
//склеивает N массивов в единый массив, с сохранение порядка переданных массисов
}
private static byte[] toDER(Asn1Type entity) throws Asn1Exception {
		Asn1DerEncodeBuffer encodedData = new Asn1DerEncodeBuffer();
		entity.encode(encodedData);
		return encodedData.getMsgCopy();
}
private TimeStampResp callTSA(String url, byte[] tspRequest) throws IOException, Asn1Exception {
//вызывает удаленный tsa, передает даннык tspRequest, возвращает TimeStampResp.
}
 |