Статус: Новичок
Группы: Участники
Зарегистрирован: 23.05.2015(UTC) Сообщений: 2 Откуда: Moscow
Поблагодарили: 1 раз в 1 постах
|
Автор: kkklll Автор: strelok671 Кажется получилось. а таймстемп тоже правили на вычисление по ГОСТ? что-то использовали в качестве библиотеки или полностью своё? Что касается TimeStamp по госту, все ведь определяется алгоритмом хэша передоваемом в запросе. Я поправил функцию формирования запроса. длина хэша 20 - SHA1, 32 - ГОСТ Код:
private byte[] BuildTsaRequest(byte[] hashToTimestamp)
{
int offset = 0;
byte[] requestTemplate;
byte[] requestGOST3411 = // gost
{
0x30, 0x34, //Request SEQUENCE (length: 52)
0x02, 0x01, 0x01, //Version INTEGER (length: 1) value: 1
0x30, 0x2c, //MessageImprint SEQUENCE (length: 44)
0x30, 0x08, //AlgorithmOID SEQUENCE (length: 7)
0x06, 0x06, //OID (length: 6)
0x2a, 0x85, 0x03, 0x02, 0x02, 0x09, //szOID_CP_GOST_R3411 1.2.643.2.2.9
0x04, 0x20, //Hash OCTET STRING (length: 32)
0x00, 0x00, 0x00, 0x00, 0x00, //Placeholders for hash
0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00,
0x01, 0x01, 0xff //RequestCertificate BOOLEAN (length: 1) value: true
};
byte[] requestSHA1 =
{
0x30, 0x27, //Request SEQUENCE (length: 39)
0x02, 0x01, 0x01, //Version INTEGER (length: 1) value: 1
0x30, 0x1f, //MessageImprint SEQUENCE (length: 31)
0x30, 0x07, //AlgorithmOID SEQUENCE (length: 7)
0x06, 0x05, //OID (length: 5)
0x2b, 0x0e, 0x03, 0x02, 0x1a, //OIDSHA1 value: 1 3 14 3 2 26 -> 1*40+3=2B 14=0E 3=03 2=02 26=1A
0x04, 0x14, //Hash OCTET STRING (length: 20)
0x00, 0x00, 0x00, 0x00, 0x00, //Placeholders for hash
0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x01, 0xff //RequestCertificate BOOLEAN (length: 1) value: true
};
if (hashToTimestamp.Length == 20)
{
requestTemplate = requestSHA1;
offset = 18;
}
else if (hashToTimestamp.Length == 32)
{
requestTemplate = requestGOST3411;
offset = 19;
}
else
{
throw new Exception("Illegal hash length should be 20 or 32 bytes long (" + hashToTimestamp.Length + ")");
}
for (int byteCounter = 0; byteCounter < hashToTimestamp.Length; byteCounter++)
{
requestTemplate[offset + byteCounter] = hashToTimestamp[byteCounter];
}
if (this.requestTsaCertificate)
{
requestTemplate[requestTemplate.GetUpperBound(0)] = 0xff;
}
else
{
requestTemplate[requestTemplate.GetUpperBound(0)] = 0x00;
}
return requestTemplate;
}
|
1 пользователь поблагодарил Blaksa за этот пост.
|
slavw оставлено 02.07.2015(UTC)
|