Я пытаюсь использовать статическую ссылку OpenSSL в режиме FIPS на IBM PLinux, используя xlC_r в качестве компилятора / компоновщика. Эта комбинация не поддерживается fipsld или fips_premain.c. fipld добавит опции компоновщика для вызова FINGERPRINT_premain для uname -s в {OSF1, IRIX, HP-UX, AIX, Darwin}, fips_premain.c сделает решения, специфичные для компилятора для gcc, cl (Microsoft), cc (SUN) и некоторых другие, с которыми я не знаком. К сожалению, xlC_r в IBM PLinux не охватывается ни одним из них, поэтому я хотел бы знать, приемлемо ли добавление следующего кода в один из моих файлов cpp для проверки FIPS или если мне нужно изменить компилятор / компоновщик на gcc или есть другой способ (параметры компоновщика?) сохранить xlC_r. Пожалуйста, включите некоторые обоснования.
#if defined(PREMAIN_NOT_COVERED)
extern "C" void FINGERPRINT_premain(void);
class FIPSInitializer
{
public:
FIPSInitializer()
{
FINGERPRINT_premain();
}
virtual ~FIPSInitializer()
{
}
};
extern FIPSInitializer fips_initializer;
FIPSInitializer fips_initializer;
#endif
Я также пытался использовать -Wl, init, FINGERPRINT_premain во время компоновки, но тогда наш тест мог привести к сбою при использовании нашей общей библиотеки.
Руководство пользователя OpenSSL:
http://www.openssl.org/docs/fips/UserGuide-1.1.1.pdf
Политика безопасности OpenSSL:
http://www.openssl.org/docs/fips/SecurityPolicy-2.0.pdf
поэтому я хотел бы знать, если добавить следующий код в
один из моих файлов cpp приемлем для проверки FIPS
class FIPSInitializer
{
public:
FIPSInitializer()
{
FINGERPRINT_premain();
}
virtual ~FIPSInitializer()
{
}
};
Хм … это звучит странно. Единственный способ войти в режим FIPS — это FIPS_mode_set
, Если вы позвоните FIPS_mode_set
и он возвращает ненулевое значение, тогда вы используете проверенную криптографию. Если вы позвоните FIPS_mode_set
и это не удастся, тогда вы все равно сможете шифровать и дешифровать (представьте себе «подключаемую» архитектуру), но вы будете не использовать проверенную криптографию. Увидеть Режим FIPS установлен для деталей.
Просто предположение: если FIPS_mode_set
не удается и FINGERPRINT_premain
не вызывается, то вы, вероятно, отклонились от процедур, требуемых Политика безопасности OpenSSL FIPS 140-2.
fips_premain.c будет делать специфичные для компилятора решения для gcc, cl (Microsoft),
cl (Microsoft), cc (SUN) и некоторые другие, с которыми я не знаком …
Вы не компилируете fips_premain.c
, Он компилируется при построении объектного модуля FIPS или связи с объектным модулем FIPS. Были даже разговоры о том, чтобы удалить его вообще.
Все, что не указано ниже, лишает законной силы процедуру сборки FIPS, и вы не будете использовать проверенную криптографию.
$ export OPENSSL_INSTALLDIR=/usr/local/ssl/darwin
$ cd openssl-fips-2.0.5/
$ ./config
$ make
$ sudo make install
Результатом вышесказанного является fipscanister.o
и друзья. Вы можете найти их (их четыре) в $OPENSSL_INSTALLDIR\lib
:
$ ls /usr/local/ssl/darwin/lib/
fipscanister.o fips_premain.c
fipscanister.o.sha1 fips_premain.c.sha1
После того, как вы соберете и установите объектный модуль FIPS, вы создадите библиотеку FIPS Capable. Вы можете поворачивать ручки для библиотеки FIPS, если она не подвергает опасности освященную веру. fipscanister.o
и друзья. Обратите внимание на использование fips
с config
,
$ cd openssl-1.0.1e/
$ ./config fips shared -no-ssl2 -no-ssl3 -no-comp -no-hw -no-engine \
--openssldir=$OPENSSL_INSTALLDIR \
--with-fipsdir=$OPENSSL_INSTALLDIR \
--with-fipslibdir=$OPENSSL_INSTALLDIR/lib/
$ make depend
$ make all
$ sudo -E make install
Вы должны использовать -E
так как install
также строит компоненты (позор OpenSSL). Я полагаю, что во время установки общий объект будет связан с освященной fipscanister.o
, После компоновки подпись модулей будет встроена в получившийся исполняемый файл fipsld
, fipsld
используется процессом сборки OpenSSL и внутренне вызывает программу под названием incore
, incore
пишет актуальную подпись.
Когда придет время для создания вашего проверенного исполняемого или общего объекта FIPS, вы выполните следующее:
$ export CC=`find $OPENSSL_INSTALLDIR -name fipsld`
$ echo $CC
/usr/local/ssl/darwin/bin/fipsld
$ export FIPSLD_CC=`find /usr/bin -iname gcc`
$ echo $FIPSLD_CC
/usr/bin/gcc
# Now build your project via make (or though the command line):
$ make
...
Когда ваш makefile вызывает LD
это действительно вызывает OpenSSL fipsld
, fipsld
обеспечит ссылки на вашу программу fipspremain.o
и внутренне вызывает программу под названием incore
, incore
записывает фактическую подпись в ваш исполняемый или разделяемый объект. Следующее от openssl-fips-2.0.5
Makefile:
fips_premain_dso$(EXE_EXT): fips_premain.c
$(CC) $(CFLAGS) -DFINGERPRINT_PREMAIN_DSO_LOAD -o $@ fips_premain.c \
$(FIPSLIBDIR)fipscanister.o ../libcrypto.a $(EX_LIBS)
Если у вас нет fipsld
установлен, вы можете найти его, например, в openssl-fips-2.0.5
, Просто скопируйте это в $OPENSSL_INSTALLDIR\bin
, Я не помню, если make install
копирует это (и я, кажется, вспоминаю подачу сообщения об ошибке об этом).
Вы не можете вставить подпись в статическую библиотеку. OpenSSL не мог сделать это при сборке libcrypto.a
, и вы не можете сделать это, когда вы строите libmycoolness.a
, Если вы распространяете libmycoolness.a
вашим клиентам, им придется прыгать через CC
а также FIPSLD_CC
обручи.
Если вы не хотите прыгать через CC
а также FIPSLD_CC
hoops, тогда вы должны связать с fipscanister.o и запустить incore
вручную после сборки исполняемого или разделяемого вами объекта. Однако OpenSSL не рекомендуют этого. Они рекомендуют использовать CC
а также FIPSLD_CC
,
Заметка: вы не компилируете fips_premain.c
сам.
Если fips_premain.c
выдает ошибку при попытке построить объектный модуль FIPS, тогда ваша платформа не поддерживается. Вам следует связаться со Стивом Маркисом из Фонда OpenSSL и назначить беседу о валидации платформы. Увидеть OpenSSL и FIPS 140-2 а также Политика безопасности OpenSSL FIPS 140-2.
Связано, если вы получаете неопределенные символы из-за оформления имени в C ++, посмотрите Fipsld and C++
на OpenSSL вики.
Решение состоит в том, чтобы изменить fipsld
, Это не секвестированный источник, так что вы можете изменить его в пределах разумного. В этом случае, fipsld++
эффективно выполняет следующее при компиляции fips_premain.c
для тебя:
${CC} ${CANISTER_O_CMD:+"${CANISTER_O_CMD}"} \
-x c "${PREMAIN_C}" -x none \
${_WL_PREMAIN} "$@"
Изменение является эффективным дополнением ${CC} -x c fips_premain.c -x none ...
при компиляции fips_premain.c
,
Других решений пока нет …