Сборка 32-битного OpenSSL FIPS (nmake f ms\ntdll.mak): недопустимый символ в макросе

Моя цель — создать общие библиотеки (DLL) OpenSSL (openssl-1.0.2n) в 32-разрядной версии с включенным FIPS. Согласно процедуре, описанной на openssl.org (https://www.openssl.org/docs/fips/UserGuide-2.0.pdf), после создания контейнера FIPS я сделал следующее:

  1. perl Настройка VC-WIN32 fips --with-fipslibdir=C:\usr\local\ssl\fips-2.0
  2. мс\до_насм
  3. nmake f ms\ntdll.mak

Последний (nmake f ms\ntdll.msk) выдает эту ошибку:

makefile(243): фатальная ошибка U1001: синтаксическая ошибка: недопустимый символ '{' в макросе Stop.

Руководство? Это сложно, потому что инструкции OpenSSL FIPS очень конкретно запрещают изменять файлы MAKE, чтобы они оставались совместимыми с FIPS. Меня подколенные сухожилия.

Полный список из командной строки x86 VS2017 (запуск в режиме администратора):

**********************************************************************
** Visual Studio 2017 Developer Command Prompt v15.4.5
** Copyright (c) 2017 Microsoft Corporation
**********************************************************************
[vcvarsall.bat] Environment initialized for: 'x86'

C:\Users\jlaird\source>cd C:\OpenSSL_Source\32bit\openssl-1.0.2n

C:\OpenSSL_Source\32bit\openssl-1.0.2n>perl Configure VC-WIN32 fips --with-fipslibdir=C:\usr\local\ssl\fips-2.0
Configuring for VC-WIN32
    no-ec_nistp_64_gcc_128 [default]  OPENSSL_NO_EC_NISTP_64_GCC_128 (skip dir)
    no-gmp          [default]  OPENSSL_NO_GMP (skip dir)
    no-jpake        [experimental] OPENSSL_NO_JPAKE (skip dir)
    no-krb5         [krb5-flavor not specified] OPENSSL_NO_KRB5
    no-libunbound   [experimental] OPENSSL_NO_LIBUNBOUND (skip dir)
    no-md2          [default]  OPENSSL_NO_MD2 (skip dir)
    no-rc5          [default]  OPENSSL_NO_RC5 (skip dir)
    no-rfc3779      [default]  OPENSSL_NO_RFC3779 (skip dir)
    no-rsax         [forced]   OPENSSL_NO_RSAX (skip dir)
    no-sctp         [default]  OPENSSL_NO_SCTP (skip dir)
    no-shared       [default]
    no-ssl-trace    [default]  OPENSSL_NO_SSL_TRACE (skip dir)
    no-ssl2         [default]  OPENSSL_NO_SSL2 (skip dir)
    no-store        [experimental] OPENSSL_NO_STORE (skip dir)
    no-unit-test    [default]  OPENSSL_NO_UNIT_TEST (skip dir)
    no-weak-ssl-ciphers [default]  OPENSSL_NO_WEAK_SSL_CIPHERS (skip dir)
    no-zlib         [default]
    no-zlib-dynamic [default]
IsMK1MF=1
CC            =cl
CFLAG         =-DOPENSSL_THREADS  -DDSO_WIN32 -W3 -WX -Gs0 -GF -Gy -nologo -DOPENSSL_SYSNAME_WIN32 -DWIN32_LEAN_AND_MEAN -DL_ENDIAN -D_CRT_SECURE_NO_DEPRECATE -D_WINSOCK_DEPRECATED_NO_WARNINGS -DOPENSSL_BN_ASM_PART_WORDS -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_GF2m -I$(FIPSDIR)/include -DRC4_ASM -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DRMD160_ASM -DAES_ASM -DVPAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM
EX_LIBS       =
CPUID_OBJ     =x86cpuid.o
BN_ASM        =bn-586.o co-586.o x86-mont.o x86-gf2m.o
EC_ASM        =
DES_ENC       =des-586.o crypt586.o
AES_ENC       =aes-586.o vpaes-x86.o aesni-x86.o
BF_ENC        =bf-586.o
CAST_ENC      =cast-586.o
RC4_ENC       =rc4-586.o
RC5_ENC       =rc5-586.o
MD5_OBJ_ASM   =md5-586.o
SHA1_OBJ_ASM  =sha1-586.o sha256-586.o sha512-586.o
RMD160_OBJ_ASM=rmd-586.o
CMLL_ENC      =cmll-x86.o
MODES_OBJ     =ghash-x86.o
ENGINES_OBJ   =
PROCESSOR     =
RANLIB        =true
ARFLAGS       =
PERL          =perl
THIRTY_TWO_BIT mode
BN_LLONG mode
RC4_INDEX mode
RC4_CHUNK is undefined

Configured for VC-WIN32.

C:\OpenSSL_Source\32bit\openssl-1.0.2n>ms\do_nasm

C:\OpenSSL_Source\32bit\openssl-1.0.2n>perl util\mkfiles.pl  1>MINFO

C:\OpenSSL_Source\32bit\openssl-1.0.2n>perl util\mk1mf.pl nasm VC-WIN32  1>ms\nt.mak

C:\OpenSSL_Source\32bit\openssl-1.0.2n>perl util\mk1mf.pl dll nasm VC-WIN32  1>ms\ntdll.mak

C:\OpenSSL_Source\32bit\openssl-1.0.2n>perl util\mk1mf.pl nasm BC-NT  1>ms\bcb.mak

C:\OpenSSL_Source\32bit\openssl-1.0.2n>perl util\mkdef.pl 32 libeay  1>ms\libeay32.def

C:\OpenSSL_Source\32bit\openssl-1.0.2n>perl util\mkdef.pl 32 ssleay  1>ms\ssleay32.def

C:\OpenSSL_Source\32bit\openssl-1.0.2n>nmake ­f ms\ntdll.mak

Microsoft (R) Program Maintenance Utility Version 14.11.25547.0
Copyright (C) Microsoft Corporation.  All rights reserved.

makefile(243) : fatal error U1001: syntax error : illegal character '{' in macro
Stop.

Похоже, это было отмечено в предыдущей версии OpenSSL на GitHub, но решения не было опубликовано... проблема только что была закрыта, я понятия не имею, что делать: https://github.com/openssl/openssl/issues/4352

Я загрузил файл ntdll.mak на Google Диск здесь: https://drive.google.com/file/d/1B2GIWJjdyOXR6ycCLq8OpV4Skhg2N8ob/view?usp=sharing

Строка 243 (не очень полезная, но вот она):

$(OBJ_D)\ecb3_enc.obj $(OBJ_D)\cfb64enc.obj $(OBJ_D)\cfb64ede.obj \

person Timothy John Laird    schedule 12.12.2017    source источник
comment
Может быть, запустить препроцессор, чтобы увидеть, во что расширяются все эти макросы, и проанализировать код?   -  person YePhIcK    schedule 12.12.2017
comment
Не совсем уверен, как это сделать, так как я недостаточно понимаю процесс сборки. Я посмотрю на это. Я смог сделать 32-битные общие библиотеки (DLL) ОДИН РАЗ. Затем я получил ту же ошибку позже.   -  person Timothy John Laird    schedule 14.12.2017


Ответы (2)


Вам просто не хватает одной крошечной черточки перед буквой «f» в команде, точная команда должна быть:

nmake -­f ms\ntdll.mak

Пропустив тире, вы на самом деле вызываете nmake для файла Makefile в каталоге верхнего уровня, который существует, но несовместим с nmake, отсюда и ошибка.

Я узнал об этом, потому что получил такое же сообщение об ошибке при попытке собрать OpenSSL в Windows, и в моем случае я просто вызывал nmake без каких-либо аргументов (поскольку я не удосужился сначала прочитать файл INSTALL.W32...)

person Romain Pokrzywka    schedule 13.03.2018

Не то, чтобы это сильно помогло, но оскорбительный символ находится в самом make-файле в корне исходного кода OpenSSL. Я вставлю, начиная со строки 241:

    ENGINES_ASM_OBJ='$(ENGINES_ASM_OBJ)'        \
    PERLASM_SCHEME='$(PERLASM_SCHEME)'      \
    FIPSLIBDIR='${FIPSLIBDIR}'          \
    FIPSDIR='${FIPSDIR}'                \
    FIPSCANLIB="$${FIPSCANLIB:-$(FIPSCANLIB)}"  \
    THIS=$${THIS:-$@} MAKEFILE=Makefile MAKEOVERRIDES=
person Router Gray    schedule 01.01.2018
comment
Это не ответ, а комментарий. Для комментирования требуется минимальное требование к репутации, о котором вы можете узнать больше здесь: meta.stackexchange.com/questions/214173/ - person stefanobaghino; 01.01.2018
comment
@Router Grey спасибо за мысль (ответ или комментарий или как бы мы это ни называли), которая заставляет меня думать, что я, возможно, неправильно установил переменную окружения fips. Я предположил, что, поскольку аргумент был в команде, мне не нужно было устанавливать переменную среды. Возможно, makefile требует путь к папке в обоих местах. Я попробую это в ближайшее время и посмотрю, решит ли это проблему. - person Timothy John Laird; 02.01.2018