Подмножество библиотеки Crypto ++ для мобильного использования (iOS, Android) - PullRequest
3 голосов
/ 18 января 2012

Мне нужно использовать некоторую схему подписи RSA для кроссплатформенной библиотеки, используемой в проектах Android и iPhone.Посмотрев вокруг, я выбрал cryptopp, но он слишком велик для статических ссылок.Таким образом, я добавил источник и заголовки в свой проект, чтобы связать только соответствующие части в мою библиотеку.Он все еще добавляет несколько МБ в сборке релиза к финальной библиотеке.

  1. Существует ли более простой или более эффективный способ ограничения размера библиотеки или криптопапа в частности?

  2. Я не совсем знаком с генерацией шаблонов во время компиляции.Но я помню, что шаблоны могут добавить довольно много кода.Есть ли способ остановить / улучшить это (параметры компилятора?)?

  3. Если я хочу вручную удалить все исходные / заголовочные файлы из проекта, которые не используются моим простым сценарием использования,Есть ли инструменты, чтобы помочь?Копаться в cryptopp с его шаблонами займет довольно много времени, и я всегда за автоматические процессы;)

Любая помощь очень ценится!

Ответы [ 2 ]

4 голосов
/ 06 февраля 2012

Если вы хотите использовать crypto ++ (и для этого есть много веских причин), вероятно, это сценарий, когда вам лучше всего позволить компоновщикам выполнять свою работу.Я был обеспокоен этим некоторое время назад, и я не мог сделать ничего лучше, чем оптимизирующие компоновщики.

Я подтвердил это, вычистив свое старое тестовое приложение, которое использует crypto ++ для генерации нового случайного ключа RSA., подпишите строку и проверьте эту строку.Вот цифры, которые я вижу:

  • libcryptopp.a - crypto ++, созданный для выпуска в виде статической библиотеки с использованием clang ++ против iOS SDK 5.0.Не было никакого специального атрибута для минимизации размера, просто был создан с -fvisibility = hidden -fvisibility-inlines-hidden и -Os: 22.5MB

  • Пустое приложение изшаблон одиночного представления iOS по умолчанию, построенный с -Os: 34KB

  • То же пустое приложение с добавленным кодом «самопроверки», которое генерирует пару ключей, знаки (и, следовательно,хеширует) строку с использованием RSA / SHA256, кодирует ее в шестнадцатеричном виде, печатает подпись, декодирует подпись и проверяет подпись поверх исходной строки, построенную с помощью -Os для libcryptopp.a из моей первой статьи выше:*

Компоновщик, похоже, хорошо справляется со своей задачей.Если вы видите что-то кардинально другое, убедитесь, что вы действительно смотрите на двоичные файлы релизов.

0 голосов
/ 02 октября 2013

Подписи RSA ... в проекте для Android и iPhone. Посмотрев вокруг, я выбрал cryptopp ...

Похожие (из вики Crypto ++): Android (командная строка) и iOS (командная строка) .

Существует ли более простой или более эффективный способ уменьшения размера библиотеки или криптопапа в частности?

Нет. Компилятор и libtool на iOS не имеют возможности определить, что вам может (а может и не понадобиться), поэтому вы получаете все в архиве. То же самое относится и к инструментам GNU на Android.

Я не совсем знаком с генерацией шаблонов во время компиляции. Но я помню, что шаблоны могут добавить довольно много кода. Есть ли способ остановить / улучшить это (параметры компилятора?)?

Не простой способ. Но вы можете пойти через исходный код и извлечь явные экземпляры шаблона. Вы хотите найти объекты, созданные с помощью CRYPTOPP_DLL_TEMPLATE_CLASS. Вы можете увидеть, как это определено в config.h .

Но я не стал бы беспокоиться об этом, поскольку вы можете заставить компоновщик отбрасывать большую часть (или весь?) Неиспользуемый код из статической библиотеки.

Если я хочу вручную удалить все исходные / заголовочные файлы из проекта, которые не используются в моем простом сценарии использования, есть ли какие-нибудь инструменты, которые могут помочь?

Нет, я не знаю ни одного инструмента для этого (похож на Boost's bcp). Я пробовал это в прошлом и разочаровался.

Что вы не спрашивали: как вы уменьшаете размер конечного двоичного файла при ссылке на статическую версию Crypto ++. Вот ответы:

  • Оба

    • Изменить GNUmakefile

    • CXXFLAGS += -Os

    • CXXFLAGS += -ffunction-sections -fdata-sections

  • IOS

    • Изменить GNUmakefile

    • CXXFLAGS += -gfull

    • LDFLAGS += -dead_strip

  • Android

    • CXXFLAGS += -Wl,--exclude-libs,ALL

    • запустить arm-linux-androideabi-strip с --strip-debug, --strip-unneeded или --strip-all в вашей окончательной библиотеке или исполняемом файле

Обе техники описаны на вики-страницах. Если вы работаете над Linux, есть еще одна вики-страница, посвященная уменьшению размера и удалению, в Crypto ++ Linux .

Для получения дополнительной информации см. Настройка производительности и отзывчивости (для iOS), arm-eabi-strip и двоичный размер и Удаление неиспользуемых функций / мертвого кода (для Android и Linux).

...