openssl — вызов FINGERPRINT_premain на более компиляторе / платформах c ++

Я пытаюсь использовать статическую ссылку 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

3

Решение

поэтому я хотел бы знать, если добавить следующий код в
один из моих файлов 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,

2

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

Других решений пока нет …

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