Ошибка компиляции при использовании AES / GCM в Xcode на OS X

Я использую OS X 10.10 с Xcode 7 beta 2. Я хочу использовать AES / GCM из OpenSSL. Я хотел начать с примера, поэтому я взял один из OpenSSL вики. Код ниже.

Код не компилируется. Похоже, компилятор не может найти следующее:

  • EVP_aes_256_gcm
  • EVP_CTRL_GCM_SET_IVLEN
  • EVP_CTRL_GCM_GET_TAG

Я полагаю, что элементы, связанные с режимом GCM, отсутствуют. Что я должен делать? Есть ли способ обновить мою библиотеку или что-то, что я не импортировал?


Вот мой код:

#include <openssl/evp.h>
#include <openssl/crypto.h>
#include <openssl/aes.h>

void handleErrors()
{
}

int encrypt(unsigned char *plaintext, int plaintext_len, unsigned char *aad,
int aad_len, unsigned char *key, unsigned char *iv,
unsigned char *ciphertext, unsigned char *tag)
{
EVP_CIPHER_CTX *ctx;

int len;

int ciphertext_len;/* Create and initialise the context */
if(!(ctx = EVP_CIPHER_CTX_new())) handleErrors();

/* Initialise the encryption operation. */
if(1 != EVP_EncryptInit_ex(ctx, EVP_aes_256_gcm(), NULL, NULL, NULL))
handleErrors();

/* Set IV length if default 12 bytes (96 bits) is not appropriate */
if(1 != EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_SET_IVLEN, 16, NULL))
handleErrors();

/* Initialise key and IV */
if(1 != EVP_EncryptInit_ex(ctx, NULL, NULL, key, iv)) handleErrors();

/* Provide any AAD data. This can be called zero or more times as
* required
*/
if(1 != EVP_EncryptUpdate(ctx, NULL, &len, aad, aad_len))
handleErrors();

/* Provide the message to be encrypted, and obtain the encrypted output.
* EVP_EncryptUpdate can be called multiple times if necessary
*/
if(1 != EVP_EncryptUpdate(ctx, ciphertext, &len, plaintext, plaintext_len))
handleErrors();
ciphertext_len = len;

/* Finalise the encryption. Normally ciphertext bytes may be written at
* this stage, but this does not occur in GCM mode
*/
if(1 != EVP_EncryptFinal_ex(ctx, ciphertext + len, &len)) handleErrors();
ciphertext_len += len;

/* Get the tag */
if(1 != EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_GET_TAG, 16, tag))
handleErrors();

/* Clean up */
EVP_CIPHER_CTX_free(ctx);

return ciphertext_len;
}

int main()
{
}

1

Решение

Я полагаю, что элементы, связанные с режимом GCM, отсутствуют. Что я должен делать? Есть ли способ обновить мою библиотеку или что-то, что я не импортировал?

OS X предоставляет OpenSSL 0.9.8. Это очень анемично, сейчас и в нем не хватает большинства материалов EC, TLS 1.1, TLS 1.2, хорошей поддержки клиентских сертификатов и т. Д. Декабрь 2015 года, он войдет в конец жизни.

Что вам нужно сделать, это загрузить и установить OpenSSL 1.0.2. Загрузите его с OpenSSL исходники и тарболы. Распакуйте его, а затем (большая часть его взята из OpenSSL Компиляция и установка):

cd openssl-1.0.2

export KERNEL_BITS=64
./config no-ssl2 no-ssl3 enable-ec_nistp_64_gcc_128 --openssldir=/usr/local/ssl/macosx-x64/
make
make test
sudo make install

Вы должны вручную добавить enable-ec_nistp_64_gcc_128 для 64-битных архитектур, потому что конфигурировать не может определить это самостоятельно.

Затем выполните dcleanи, необязательно, сборка для 32-битной системы:

export KERNEL_BITS=32
make clean && make dclean
./config no-ssl2 no-ssl3 --openssldir=/usr/local/ssl/macosx-x86/
make
make test
sudo make install

В приведенном выше shared был опущен. Это связано с тем, что компоновщики Apple всегда используют общий объект, даже если вы пытаетесь указать статический архив. Общие библиотеки также доставят вам неприятности, потому что версия Apple от dylib будет найден до вашей версии (если вы не используете такие трюки, как DYLD_LIBRARY_PATH или RPATHs).

Вы также должны рассмотреть возможность добавления no-comp потому что мы знаем, что сжатие пропускает информацию в некоторых контекстах. ПРЕСТУПНОСТЬ а также НАРУШЕНИЯ две демонстрации утечки информации.

Наконец, вы должны не построить толстую библиотеку. На самом деле, система сборки не позволяет это, добавляя -arch i386 -arch x86_64 (требует ручного изменения Makefile.org). Это ломает ar командование IIRC. Если бы вы могли построить толстую библиотеку или использовать lipo чтобы создать один, то opensslconf.h было бы неправильно для одной из платформ.


Используйте эти Xcode Настройки сборки настройка для x86_64:

  • Всегда искать пути пользователя: NO
  • Путь поиска заголовка: /usr/local/ssl/macosx-x64/include
  • Путь поиска в библиотеке: /usr/local/ssl/macosx-x64/lib

И использовать эти Xcode Настройки сборки настройка для i386:

  • Всегда искать пути пользователя: NO
  • Путь поиска заголовка: /usr/local/ssl/macosx-x86/include
  • Путь поиска в библиотеке: /usr/local/ssl/macosx-x86/lib

Обязательно укажите libcrypto.a библиотека или вы получите ошибки компоновщика. Это не легко / интуитивно понятно под Xcode. Для этого смотрите что-то вроде Как «добавить существующие рамки» в Xcode?

2

Другие решения


По вопросам рекламы [email protected]