Ошибка компиляции при использовании 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 Sources and Tarballs. Распакуйте его, а затем (большая часть его взята из Компиляции и Установки 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-битных архитектур, потому что Configure не может определить его самостоятельно.
Затем выполните 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 всегда используют общий объект, даже если вы пытаетесь указать статический архив. Общие библиотеки также доставят вам неприятности, потому что версия dylib от Apple будет найдена до вашей версии (если вы не используете такие приемы, как DYLD_LIBRARY_PATH
или RPATHs).
Вы также должны рассмотреть возможность добавления no-comp
потому что мы знаем, что сжатие пропускает информацию в некоторых контекстах. CRIME и BREACH - две демонстрации утечки информации.
Наконец, вы не должны создавать толстую библиотеку. На самом деле, система сборки не позволяет это, добавляя -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 Build Settings для i386:
- Всегда искать пути пользователя:
NO
- Путь поиска заголовка:
/usr/local/ssl/macosx-x86/include
- Путь поиска в библиотеке:
/usr/local/ssl/macosx-x86/lib
Обязательно укажите libcrypto.a
библиотека или вы получите ошибки компоновщика. Это не легко / интуитивно понятно под Xcode. Для этого посмотрите что-то вроде Как "добавить существующие фреймворки" в Xcode?