Кресты / Говнокод #11576 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 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'а.
Кто найдет ошибку - получит пирожок с полочки ;)

Запостил: bormand bormand, (Updated )

Комментарии (6) RSS

  • 'a' должен быть точно int, а не unsigned?
    ну и смущает магия с if (c & 0x80) - меняется a, но ничего дальше не делается

    давненько я уже работал с сертификатами - единожды написанное (врапперы над ms cryptoapi и openssl) неплохо работает (по крайней мере, первый:) ) до сих пор
    Ответить
    • > 'a' должен быть точно int, а не unsigned?
      Да, но это просто говнецо, а не ошибка, насколько помню числа в OID'ах все равно не превысят 65535.

      > ну и смущает магия с if (c & 0x80) - меняется a, но ничего дальше не делается
      В нем накапливается результат. Если число не влазит в один байт - оно разбивается на несколько, причем у всех кроме последнего выставляется старший бит. Тут все норм, хотя надо бы вынести эту формулу за if.

      > врапперы над ms cryptoapi и openssl
      Правильный подход, полностью поддерживаю 😉

      А ошибка тут гораздо банальней, чтобы ее найти не нужно даже знать что такое OID...
      Ответить
          • это в наказание за использование опасной, как лезвие бритвы, C standard library в мерзком крестоблядском коде
            Ответить
            • Мерзкий крестоблядский фикс:
              std::stringstream buf;
              // ...
              if (!first) {
                  buf << "." << a;
              } else {
                  buf << (a/40) << "." << (a % 40);
              }
              // ...
              return buf.str();
              Ответить

Добавить комментарий

Где здесь C++, guest?!

    А не использовать ли нам bbcode?


    8