Subgrupo de la biblioteca Crypto ++ para uso mobile (iOS, Android)

Necesito usar algún esquema de firma RSA para una biblioteca multiplataforma utilizada en un proyecto de Android y iPhone. Después de mirar alnetworkingedor he elegido cryptopp, pero es demasiado grande para el enlace estático. Por lo tanto, agregué fuente y encabezados a mi proyecto para vincular solo las partes relevantes en mi lib. Todavía está agregando algunos MB en la compilation de lanzamiento a la lib final.

  1. ¿Hay una manera más fácil o más efectiva de networkingucir el tamaño de una biblioteca o cryptopp en particular?

  2. No estoy familiarizado en detalle con la generación de templates durante la compilation. Pero recuerdo que las templates pueden agregar bastante código. ¿Hay alguna forma de detener / mejorar esto (opciones de compilation?)?

  3. Si quiero eliminar manualmente todos los files de origen / encabezado del proyecto que no son utilizados por mi simple usecase, ¿hay alguna herramienta para ayudar? Cavar a través de cryptopp con sus templates tomaría bastante time y siempre estoy a favor de los processs automáticos;)

¡Cualquier ayuda es muy apreciada!

Si desea utilizar crypto ++ (y hay muchas buenas razones por las que desea hacerlo), este es probablemente un escenario en el que es mejor dejar que los linkeres hagan su trabajo. Hace un time estaba preocupado por esto y no podía hacerlo mejor a mano que los linkeres de optimization.

Confirmé esto desempolvando mi antigua aplicación de testing que usa crypto ++ para generar una nueva key RSA aleatoria, firmar una cadena y verificar esa cadena. Aquí están los numbers que veo:

  • libcryptopp.a – crypto ++ creado para la versión como una biblioteca estática utilizando clang ++ contra el iOS SDK 5.0. No hubo una actitud especial para minimizar el tamaño, recién construida con -fvisibility = hidden -fvisibility-inlines-hidden y -Os: 22.5MB

  • Aplicación vacía desde la plantilla de vista única pnetworkingeterminada de iOS, construida con -Os: 34 KB

  • Se agrega la misma aplicación vacía con código de "autotest" que genera un par de llaves, firma (y por lo tanto hashes) una cadena usando RSA / SHA256, hex codifica, imprime la firma, decodifica la firma y verifica la firma sobre la cadena original, construida con -Os contra libcryptopp.a de mi primera viñeta anterior: 389KB

El linker parece estar haciendo un buen trabajo aquí. Si ves algo drásticamente diferente, asegúrate de que realmente estás viendo los files binarys de la versión.

Firmas RSA … en un proyecto de Android e iPhone. Después de mirar alnetworkingedor he elegido cryptopp …

Relacionado (de la wiki Crypto ++): Android (Línea de command) e iOS (Línea de command) .

¿Hay una manera más fácil o efectiva de networkingucir el tamaño de una biblioteca o cryptopp en particular?

No. El comstackdor y el libtool en iOS no tienen forma de saber qué puede (o no) necesitar, así que obtienes todo en el file. Lo mismo ocurre con las herramientas GNU provistas en Android.

No estoy familiarizado en detalle con la generación de templates durante la compilation. Pero recuerdo que las templates pueden agregar bastante código. ¿Hay alguna forma de detener / mejorar esto (opciones de compilation?)?

No es una forma fácil Pero puede ir a través del código fuente y extraer instancias de plantilla explícitas. Desea encontrar objects instanciados con CRYPTOPP_DLL_TEMPLATE_CLASS . Puedes ver cómo está definido en config.h .

Pero no me preocuparía, ya que puede hacer que el linker descarte la mayoría (o todo?) Código no utilizado de una biblioteca estática.

Si quiero eliminar manualmente todos los files fuente / encabezado del proyecto que no son utilizados por mi caso de uso simple, ¿hay alguna herramienta para ayudar?

No, no tengo conocimiento de ninguna herramienta para hacerlo (similar al bcp de Boost). He intentado esto en el pasado, y me rendí en frustración.

Lo que no preguntó: cómo networkinguce el tamaño del binary final al vincular a la versión estática de Crypto ++. Estas son las respuestas:

  • Ambos

    • Modificar GNUmakefile

    • CXXFLAGS += -Os

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

  • iOS

    • Modificar GNUmakefile

    • CXXFLAGS += -gfull

    • LDFLAGS += -dead_strip

  • Androide

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

    • ejecute arm-linux-androidabi-strip con --strip-debug , --strip-unneeded --strip-all o --strip-all en su biblioteca final o ejecutable

Ambas técnicas están cubiertas en las páginas Wiki. Si está trabajando en Linux, hay otra página wiki para cubrir la networkingucción de tamaño y la eliminación en Crypto ++ Linux .

Para get más lecturas, consulte Sintonización de performance y capacidad de respuesta (para iOS), arm-eabi-strip y tamaño binary , y Eliminación de funciones no utilizadas / código inactivo (para Android y Linux).