2013-12-19 2 views
2

Я новичок в openssl, и я загрузил коды openssl-fips-2.0.1 из openssl, однако я не смог проследить до определения FIPS_mode_set(), как указано в документация и политика безопасности. Однако я нашел fips_set_mode() в файле fips.c, но они не относятся к одному и тому же, верно?FIPS_mode_set() код не найден в пакете openssl

Где это определение? Пожалуйста, посоветуйте мне.

ответ

3

FIPS_mode_set (код) не найден в OpenSSL пакете

Вы должны знать, как спросить ...

openssl-1.0.1f$ grep -R FIPS_mode_set * 
apps/openssl.c:  if (!FIPS_mode_set(1)) { 
CHANGES: *) Functions FIPS_mode_set() and FIPS_mode() which call the underlying 
crypto/cpt_err.c:{ERR_FUNC(CRYPTO_F_FIPS_MODE_SET), "FIPS_mode_set"}, 
crypto/evp/evp_cnf.c: if (!FIPS_mode() && !FIPS_mode_set(1)) 
crypto/crypto.h:int FIPS_mode_set(int r); 
crypto/o_fips.c:int FIPS_mode_set(int r) 
Binary file fips_premain_dso matches 
ssl/ssltest.c:  if(!FIPS_mode_set(1)) 
util/libeay.num:FIPS_mode_set 3253 EXIST::FUNCTION: 
openssl-1.0.1f$ 

Декларация в crypto/crypto.h и определение в crypto/o_fips.c. Вот от o_fips.c:

int FIPS_mode_set(int r) 
    { 
    OPENSSL_init(); 
#ifdef OPENSSL_FIPS 
#ifndef FIPS_AUTH_USER_PASS 
#define FIPS_AUTH_USER_PASS "Default FIPS Crypto User Password" 
#endif 
    if (!FIPS_module_mode_set(r, FIPS_AUTH_USER_PASS)) 
     return 0; 
    if (r) 
     RAND_set_rand_method(FIPS_rand_get_method()); 
    else 
     RAND_set_rand_method(NULL); 
    return 1; 
#else 
    if (r == 0) 
     return 1; 
    CRYPTOerr(CRYPTO_F_FIPS_MODE_SET, CRYPTO_R_FIPS_MODE_NOT_SUPPORTED); 
    return 0; 
#endif 
    } 

Если вы искали FIPS_mode_set войти в «режим FIPS» со специальной установкой или переключить некоторые алгоритмы, что не происходит на этом этапе.

Это случается раньше при связывании. Что происходит под капотом: fipsld - это компилятор, и он ищет вызов LD. Если LD is не вызывается, то fipsld просто вызывает ваш обычный компилятор (возможно, /usr/bin/gcc). Если он видит вызов LD, то он делает три вещи.

Во-первых, он составляет fips_premin.c. Затем он вызывает реальный ld, чтобы выполнить финальную ссылку со всем вашим объектным файлом и созданным fips_premain.o. Наконец, он вызывает incore для обмена в модуле объектов FIPS, вычисляет подпись по соответствующим text и data (релевантно означает код и данные FIPS), а затем вставляет подпись в исполняемый файл.

Подпись генерируется с помощью HMAC, а ключ встроен в исполняемый файл. В этом нет ничего особенного, и он будет постоянным во всех исполняемых файлах по всему миру. Вот использованный ключ: etaonrishdlcupfm.

Если вы не предпринимаете специальных шагов при создании своего исполняемого файла, то, вероятно, вам не хватает некоторых шагов. Вот шаги, чтобы использовать fipsld и incore:

$ export CC=`find /usr/local -name fipsld` 
$ echo $CC 
/usr/local/ssl/fips-2.0/bin/fipsld 
$ export FIPSLD_CC=`find /usr/bin -name gcc` 
$ echo $FIPSLD_CC 
/usr/bin/gcc 

Теперь, сделайте стандартный config и make. Иногда вам нужно сделать config, затем отрегулируйте CC и FIPSLD_CC, а затем запустите make, потому что некоторые config файлов затвора на устройстве. Иногда вам необходимо открыть Makefile после config и сменить CC на /usr/local/ssl/fips-2.0/bin/fipsld. Существует множество способов сделать это, пытаясь обойти определенную упаковку.


Я скачал OpenSSL-ФИПС-2.0.1 коды из OpenSSL, однако, я не был в состоянии проследить на определение FIPS_mode_set()

openssl-fips-NNN обеспечивает FIPS валидацию криптография если вы создаете модуль объектов FIPS в соответствии с политикой безопасности. Вы можете найти OpenSSL FIPS 1402- Security Policy at here.

Если все, что вы сделали, было загружено и построено openssl-fips-NNN, то вы, вероятно, не используете криптографию с проверкой FIPS. Существует процедура, которой следует следовать, и включает в себя получение «доверенной» копии исходного кода. Вы можете загружать и проверять подпись, но вам нужна проверка подлинности подписи FIPS, которая создает проблему с курицей и яйцом, потому что вы не можете ее создать из источников. Поэтому практическое решение - заказать компакт-диск из OpenSSL Foundation. Это странно, но это правда. См., Например, OpenSSL FIPS User Guide или OpenSSL FIPS Security Policy, Приложение B, Отпечаток пальца с контролируемым распределенным файлом.

После того, как вы создали и установили модуль объекта FIPS, вы можете создать версию библиотеки FIPS Capable. FIPS Capable OpenSSL будет использовать модуль объектов FIPS, если он доступен. Подумайте об этом как о «подключаемой» архитектуре.

FIPS Capable версия библиотеки - это просто openssl-NNN, например openssl-1.0.1e и openssl-1.0.1f. Это то, что вы знаете и любите.


Вы также могли бы рассмотреть что-то вроде ctags как исходный код браузера, чтобы помочь вам найти вещи и прыгать вокруг. См. Exuberant Ctags на Sourceforge.

+0

Привет, нолоадер, я хотел, чтобы этот ответ наступил раньше. Я бы дал тебе щедрость. Я помечаю ваши комментарии +1 для вас. Кстати, как вы устанавливаете ключ hmac. В настоящее время он жестко закодирован. Где мы можем хранить ключ и как его читать во время выполнения? –

+1

«как вы устанавливаете ключ hmac ...» - я добавил дополнительную информацию в ответ. – jww

+0

+1 для @noloader. Чтобы подтвердить, что мы не можем изменить ключ проверки, и нет проблемы безопасности, что он является общедоступным? –

2

См. Файл заголовка crypto.h. Я могу найти его определение есть в строке 566 следующим образом:

int FIPS_mode_set(int r); 

Documentation четко сказать, что он находится в заголовочном файле <openssl/crypto.h>.

Итак, в вашем коде укажите openssl/crypto.h, чтобы включить определение этой функции. Если вы столкнулись с другой проблемой, вы можете просматривать вопросы OpenSSL, которые могут вам помочь.

+0

Relativly к корню пакета он прототипирован в 'include/openssl/crypto.h' – alk

+1

В заголовке нет кода для определения, только объявления. В документации для определения нет кода, используйте только пример. Ищу Int FIPS_mode_set (Int г) { : : } –

2

Для связывания FIPS_mode_set() должен быть доступен из libcrypto (*.a для статического связывания и *.so для времени выполнения связи).

libcrypto.a/.so поставляется с пакетом разработчика вашего дистрибутива openssl или в результате сборки openssl-x.y.z.

Вы найдете источники для FIPS_mode_set() в источниках для openssl-x.y.z, в файле crypto/o_fips.c.

+1

Ключевым моментом здесь является то, что он не в OpenSSL-ФИПС-2.0.1, но OpenSSL-1.0.1e.tar.gz. Я прав? Как два источника различаются и как это используется? –

+0

Да, вы правы[email protected]: вы можете прочитать здесь http://www.openssl.org/docs/apps/openssl.html и здесь: http://www.openssl.org/docs/fips/UserGuide.pdf – alk

+1

Я прочитал руководство, и я смущен. Я считаю, что вы правы, это может быть в другом пакете. Я думал, что не требую этого, так как у меня есть * fips * .tar.gz. У меня есть -1 для вопроса, довольно удручающе видеть, насколько субъективны люди. @alk, Он утверждает, что я могу наградить его в течение 6 часов. Вы заслуживаете +50 И +1 за соответствующий ответ, я даю его вам. :) Я надеюсь, что если вы можете дать мне больше рекомендаций о том, как скомпилировать и запустить тест fips на этом. –