- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
bool ASN1Parser::ConvertOID(const ASN1Block &blk, char *oid, unsigned int bufSize) {
int a = 0;
bool first = true;
char tmp[32];
oid[0] = 0;
for (unsigned int i=0;i<blk.size;i++) {
unsigned char c = data[blk.offset+i];
if (c & 0x80) {
a = (a << 7) | (c & 0x7F);
} else {
a = (a << 7) | (c & 0x7F);
if (!first) {
sprintf(tmp,".%d",a);
} else {
sprintf(tmp,"%d.%d",a/40,a%40);
}
a=0;
first = false;
if (strlen(tmp) >= bufSize) return false;
strcat(oid, tmp);
}
}
return true;
}
И еще один говнокодец на тему ASN.1 - распаковка OID'а.
Кто найдет ошибку - получит пирожок с полочки ;)
defecate-plusplus 13.08.2012 08:56 # +1
ну и смущает магия с if (c & 0x80) - меняется a, но ничего дальше не делается
давненько я уже работал с сертификатами - единожды написанное (врапперы над ms cryptoapi и openssl) неплохо работает (по крайней мере, первый:) ) до сих пор
bormand 13.08.2012 13:53 # 0
Да, но это просто говнецо, а не ошибка, насколько помню числа в OID'ах все равно не превысят 65535.
> ну и смущает магия с if (c & 0x80) - меняется a, но ничего дальше не делается
В нем накапливается результат. Если число не влазит в один байт - оно разбивается на несколько, причем у всех кроме последнего выставляется старший бит. Тут все норм, хотя надо бы вынести эту формулу за if.
> врапперы над ms cryptoapi и openssl
Правильный подход, полностью поддерживаю ;)
А ошибка тут гораздо банальней, чтобы ее найти не нужно даже знать что такое OID...
defecate-plusplus 13.08.2012 13:59 # +2
bormand 13.08.2012 14:03 # 0
defecate-plusplus 13.08.2012 14:08 # +3
bormand 13.08.2012 15:10 # +1