| Index: openssl/fips/fips_premain.c
|
| ===================================================================
|
| --- openssl/fips/fips_premain.c (revision 105093)
|
| +++ openssl/fips/fips_premain.c (working copy)
|
| @@ -1,176 +0,0 @@
|
| -/* ====================================================================
|
| - * Copyright (c) 2005 The OpenSSL Project. Rights for redistribution
|
| - * and usage in source and binary forms are granted according to the
|
| - * OpenSSL license.
|
| - */
|
| -
|
| -#include <stdio.h>
|
| -#include <stdlib.h>
|
| -#include <string.h>
|
| -#if defined(__unix) || defined(__unix__)
|
| -#include <unistd.h>
|
| -#endif
|
| -
|
| -#ifndef FINGERPRINT_PREMAIN_DSO_LOAD
|
| -
|
| -#if defined(__GNUC__) && __GNUC__>=2
|
| - void FINGERPRINT_premain(void) __attribute__((constructor));
|
| - /* Most commonly this results in pointer to premain to be dropped
|
| - * to .ctors segment, which is traversed by GCC crtbegin.o upon
|
| - * program startup. Except on a.out OpenBSD where it results in
|
| - * _GLOBAL_$I$premain() {premain();} being auto-generated by
|
| - * compiler... But one way or another this is believed to cover
|
| - * *all* GCC targets. */
|
| -#elif defined(_MSC_VER)
|
| -# ifdef _WINDLL
|
| - __declspec(dllexport) /* this is essentially cosmetics... */
|
| -# endif
|
| - void FINGERPRINT_premain(void);
|
| - static int premain_wrapper(void) { FINGERPRINT_premain(); return 0; }
|
| -# ifdef _WIN64
|
| -# pragma section(".CRT$XCU",read)
|
| - __declspec(allocate(".CRT$XCU"))
|
| -# else
|
| -# pragma data_seg(".CRT$XCU")
|
| -# endif
|
| - static int (*p)(void) = premain_wrapper;
|
| - /* This results in pointer to premain to appear in .CRT segment,
|
| - * which is traversed by Visual C run-time initialization code.
|
| - * This applies to both Win32 and [all flavors of] Win64. */
|
| -# pragma data_seg()
|
| -#elif defined(__SUNPRO_C)
|
| - void FINGERPRINT_premain(void);
|
| -# pragma init(FINGERPRINT_premain)
|
| - /* This results in a call to premain to appear in .init segment. */
|
| -#elif defined(__DECC) && (defined(__VMS) || defined(VMS))
|
| - void FINGERPRINT_premain(void);
|
| -# pragma __nostandard
|
| - globaldef { "LIB$INITIALIZ" } readonly _align (LONGWORD)
|
| - int spare[8] = {0};
|
| - globaldef { "LIB$INITIALIZE" } readonly _align (LONGWORD)
|
| - void (*x_FINGERPRINT_premain)(void) = FINGERPRINT_premain;
|
| - /* Refer to LIB$INITIALIZE to ensure it exists in the image. */
|
| - int lib$initialize();
|
| - globaldef int (*lib_init_ref)() = lib$initialize;
|
| -# pragma __standard
|
| -#elif 0
|
| - The rest has to be taken care of through command line:
|
| -
|
| - -Wl,-init,FINGERPRINT_premain on OSF1 and IRIX
|
| - -Wl,+init,FINGERPRINT_premain on HP-UX
|
| - -Wl,-binitfini:FINGERPRINT_premain on AIX
|
| -
|
| - On ELF platforms this results in a call to premain to appear in
|
| - .init segment...
|
| -#endif
|
| -
|
| -#ifndef HMAC_SHA1_SIG
|
| -#define HMAC_SHA1_SIG "?have to make sure this string is unique"
|
| -#endif
|
| -
|
| -static const unsigned char FINGERPRINT_ascii_value[40] = HMAC_SHA1_SIG;
|
| -
|
| -#define atox(c) ((c)>='a'?((c)-'a'+10):((c)>='A'?(c)-'A'+10:(c)-'0'))
|
| -
|
| -extern const void *FIPS_text_start(), *FIPS_text_end();
|
| -extern const unsigned char FIPS_rodata_start[], FIPS_rodata_end[];
|
| -extern unsigned char FIPS_signature[20];
|
| -extern unsigned int FIPS_incore_fingerprint(unsigned char *,unsigned int);
|
| -
|
| -/*
|
| - * As name suggests this code is executed prior main(). We use this
|
| - * opportunity to fingerprint sequestered code in virtual address
|
| - * space of target application.
|
| - */
|
| -void FINGERPRINT_premain(void)
|
| -{ unsigned char sig[sizeof(FIPS_signature)];
|
| - const unsigned char * volatile p=FINGERPRINT_ascii_value;
|
| - unsigned int len=sizeof(sig),i;
|
| -
|
| - /* "volatilization" is done to disengage unwanted optimization... */
|
| - if (*((volatile unsigned char *)p)=='?')
|
| - { if (FIPS_text_start()==NULL)
|
| - { fprintf(stderr,"FIPS_text_start() returns NULL\n");
|
| - _exit(1);
|
| - }
|
| -#if defined(DEBUG_FINGERPRINT_PREMAIN)
|
| - fprintf(stderr,".text:%p+%d=%p\n",FIPS_text_start(),
|
| - (int)((size_t)FIPS_text_end()-(size_t)FIPS_text_start()),
|
| - FIPS_text_end());
|
| - fprintf(stderr,".rodata:%p+%d=%p\n",FIPS_rodata_start,
|
| - (int)((size_t)FIPS_rodata_end-(size_t)FIPS_rodata_start),
|
| - FIPS_rodata_end);
|
| -#endif
|
| -
|
| - len=FIPS_incore_fingerprint(sig,sizeof(sig));
|
| -
|
| - if (len!=sizeof(sig))
|
| - { fprintf(stderr,"fingerprint length mismatch: %u\n",len);
|
| - _exit(1);
|
| - }
|
| -
|
| - for (i=0;i<len;i++) printf("%02x",sig[i]);
|
| - printf("\n");
|
| - fflush(stdout);
|
| - _exit(0);
|
| - }
|
| - else if (FIPS_signature[0]=='\0') do
|
| - { for (i=0;i<sizeof(FIPS_signature);i++,p+=2)
|
| - FIPS_signature[i] = (atox(p[0])<<4)|atox(p[1]);
|
| -
|
| -#if defined(DEBUG_FINGERPRINT_PREMAIN)
|
| - if (getenv("OPENSSL_FIPS")==NULL) break;
|
| -
|
| - len=FIPS_incore_fingerprint(sig,sizeof(sig));
|
| -
|
| - if (memcmp(FIPS_signature,sig,sizeof(FIPS_signature)))
|
| - { fprintf(stderr,"FINGERPRINT_premain: FIPS_signature mismatch\n");
|
| - _exit(1);
|
| - }
|
| -#endif
|
| - } while(0);
|
| -}
|
| -
|
| -#else
|
| -
|
| -#include <openssl/bio.h>
|
| -#include <openssl/dso.h>
|
| -#include <openssl/err.h>
|
| -
|
| -int main(int argc,char *argv[])
|
| -{ DSO *dso;
|
| - DSO_FUNC_TYPE func;
|
| - BIO *bio_err;
|
| -
|
| - if (argc < 2)
|
| - { fprintf (stderr,"usage: %s libcrypto.dso\n",argv[0]);
|
| - return 1;
|
| - }
|
| -
|
| - if ((bio_err=BIO_new(BIO_s_file())) == NULL)
|
| - { fprintf (stderr,"unable to allocate BIO\n");
|
| - return 1;
|
| - }
|
| - BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);
|
| - ERR_load_crypto_strings();
|
| -
|
| - dso = DSO_load(NULL,argv[1],NULL,DSO_FLAG_NO_NAME_TRANSLATION);
|
| - if (dso == NULL)
|
| - { ERR_print_errors(bio_err);
|
| - return 1;
|
| - }
|
| -
|
| - /* This is not normally reached, because FINGERPRINT_premain should
|
| - * have executed and terminated application already upon DSO_load... */
|
| - func = DSO_bind_func(dso,"FINGERPRINT_premain");
|
| - if (func == NULL)
|
| - { ERR_print_errors(bio_err);
|
| - return 1;
|
| - }
|
| -
|
| - (*func)();
|
| -
|
| - return 0;
|
| -}
|
| -
|
| -#endif
|
|
|