Автор: Setix Цитата:type bytearr=array[0..262143] of byte;
-ставите ограничение в ~300кб.... А если размер больше?
Во-первых, потому и ставлю, что это скорее невозможно получить такой огромный сертификат. На данный момент времени есть огромные списки отзыва, соответственно есть огромные же результаты подписания с приложением списков отзыва на момент подписания - для них нужно ставить больше, несколько МБ не редкость.
Цепочки сертификатов тоже могут быть из 3-5 сертификатов. Однако если говорить об одиночном квалифицированном сертификате без дополнительных данных, который получается из pCertEncoded, то там размер от примерно 600-800 байт до 5-6 КБ. Конкретно сертификаты актуальные в этом году в моем окружении от 2,16 до 2,62 КБ. 5-6 КБ было ранее с кучей оидов СУФД (33 вроде бы насчитывали у кого-то). Синтетически можно конечно добавить еще чего-то, но, например, обсуждали, что тех же оидов невозможно добавить больше примерно 1020, пусть длина у них 7 или 8 байт, плюс кодирование 2 байта. Получается синтетический тест на примерно 13 КБайт. Большинство аккредитованных УЦ не дают включать какие-то левые расширения и оиды не по шаблону сертификата. Серьезно, если кто видел реальный боевой квалифицированный сертификат 10 КБ или больше, актуальный в 2022 году, то пожалуйста покажите чем его так нагрузили. С учетом 3-5 сертификатов в цепочке, это максимум 50 Кбайт, так как сертификаты УЦ содержат меньше расширений и короче. Итого, мое ограничение в 256 КБ с запасом от 5 до 100 раз.
Во-вторых, если память выделяется getmem, то нам в принципе все равно какое определение у типа, выделить можно и больше памяти, сколько потребуется. В идеале наверно надо бы еще и cbCertEncoded проверять на вменяемое значение. Как Вы уже упоминали выше среды достаточно умны и дают адресовать больше памяти, если выделите больше памяти. Половина буферов под различные криптографические блобы в Winapi определена как [0..0] of byte; и работе с индексами 1, 2 и т.д. это не мешает.
В том же дельфи (или даже вообще в средах с паскалем) вся память сначала проходит через внутренний менеджер памяти, который выделяет у системы целую страницу памяти, потом режет маленькими кусочками по потребностям программы. Кусочек который реально расходуется немного больше чем у менеджера запросили, в начало пишет служебные данные о кусочке, в конец пишет специальное значение, адрес серединки возвращает прикладной программе. Если специальное значение после какой-то записи в буфер не совпало - значит буфер переполнился, ловите исключение от менеджера памяти. В то же время память, полученная от системы большим куском могла не переполнится и системного исключения не будет, программа испортила только свои данные. Если специальное значение не нарушено, то все зависит от включения/выключения проверки индекса. При включенной проверке конечно получите Subscript out of range, но если для конкретного участка кода проверки вырублена, то даже не пикнет как будто так и есть.
К слову, Assigned(pCert) в конкретном случае мне не внушает доверия. Память, возвращенная как контекст сертификата - системная, она выделена мимо менеджера памяти Дельфи, что именно Дельфи сможет проверить внутри Assigned(...) для меня остается под вопросом, предполагаю, что только неравенство nil. Память, выделенную через Дельфи, тестируйте Assigned() - вопросов нет. Системную же память на мой взгляд надежнее тестировать системной же функцией IsBadReadPtr(), так как и кроме nil большая часть адресного пространства процесса - это недопустимые адреса (ну сколько Ваша программа у системы выделит с учетом всех системных библиотек - пусть 100 МБ, а адресное пространство 32 бит до 4 ГБайт, 64 бит около 16000 ТБ).
Что касается создания исключения в коде JS, то мое впечатление: есть несколько источников ошибки - одни сразу в исключении, другие в ErrorInfo и создание "лишнего пустого" исключения при res!=true как раз позволяет данные от ErrorInfo обработать вместе с прочими исключениями, чтобы не писать код для добавления "Документ не подписан. " дважды.
Чисто декоративная техника как все исключения погасить в текст. Обработчик catch(ex) гасит это исключение (ведь инструкции на подъем исключения обработчику выше нет), то есть до уровней выше оно не дойдет, просто функция возвратит "Документ не подписан. " плюс какое-то описание. Вроде бы аналог того, как в Дельфи исключения срабатывают. Кто-то обходится без них, кто-то половину кода вписывает в обработчики.
Отредактировано пользователем 1 августа 2022 г. 11:38:41(UTC)
| Причина: Не указана