Skip to content

Commit

Permalink
feat(debug): improved debug messages
Browse files Browse the repository at this point in the history
  • Loading branch information
RufusJWB committed Sep 19, 2024
1 parent 1afd813 commit 78e2558
Show file tree
Hide file tree
Showing 2 changed files with 103 additions and 62 deletions.
37 changes: 25 additions & 12 deletions OpenSSL_version.c
Original file line number Diff line number Diff line change
Expand Up @@ -13,29 +13,42 @@
#include <stdlib.h>
#include <openssl/crypto.h>

#if OPENSSL_VERSION_NUMBER < 0x10002000L
#error Should not use OpenSSL versions older than 1.0.2. They are unsupported and insecure.
#if OPENSSL_VERSION_NUMBER < 0x30000000L
#error Should not use OpenSSL versions older than 3. They are unsupported and insecure.
#endif

#if OPENSSL_VERSION_NUMBER < 0x10100000L
#define OpenSSL_version_num SSLeay
#define OpenSSL_version_num SSLeay
#define DEBUG_MESSAGE "[DEBUG] Using SSLeay() for OpenSSL version\n"
#elif OPENSSL_VERSION_NUMBER >= 0x30000000L
#define OpenSSL_version_num() ((unsigned long) \
((OPENSSL_version_major()<<28) \
|(OPENSSL_version_minor()<<20) \
|(OPENSSL_version_patch()<< 4) \
|_OPENSSL_VERSION_PRE_RELEASE ))
#define OpenSSL_version_num() ((unsigned long) \
((OPENSSL_version_major()<<28) \
|(OPENSSL_version_minor()<<20) \
|(OPENSSL_version_patch()<< 4) \
|_OPENSSL_VERSION_PRE_RELEASE ))
#define DEBUG_MESSAGE "[DEBUG] Defining ourselves OpenSSL_version_num() for OpenSSL version\n"
#else
#define DEBUG_MESSAGE "[DEBUG] Using existing OpenSSL_version_num() for OpenSSL version\n"

#endif

int main(int argc, char *argv[])
{
fprintf(stdout, "[DEBUG] Starting OpenSSL version check\n");
fprintf(stdout, DEBUG_MESSAGE);

unsigned long static_version = (unsigned long)OPENSSL_VERSION_NUMBER;
fprintf(stdout, "[DEBUG] OPENSSL_VERSION_NUMBER: 0x%lx\n", static_version);

unsigned long runtime_version = OpenSSL_version_num();
fprintf(stdout, "[DEBUG] runtime_version: 0x%lx\n", runtime_version);

#define MAJOR_MINOR_MASK 0xfff00000L
if ((MAJOR_MINOR_MASK & runtime_version ) !=
(MAJOR_MINOR_MASK & OPENSSL_VERSION_NUMBER)) {
fprintf(stderr, "OpenSSL runtime version 0x%lx does not match version 0x%lx used by compiler\n",
runtime_version, (unsigned long)OPENSSL_VERSION_NUMBER);
if ((MAJOR_MINOR_MASK & runtime_version ) != (MAJOR_MINOR_MASK & OPENSSL_VERSION_NUMBER)) {
fprintf(stderr, "OpenSSL runtime version 0x%lx does not match version 0x%lx used by compiler\n", runtime_version, static_version);
return EXIT_FAILURE;
}

fprintf(stdout, "%s (0x%lx)\n", OPENSSL_VERSION_TEXT, runtime_version);
return EXIT_SUCCESS;
}
128 changes: 78 additions & 50 deletions OpenSSL_version.mk
Original file line number Diff line number Diff line change
@@ -1,80 +1,108 @@
ifeq ($(LIB),)
$(info [DEBUG] LIB is empty or not set)


ifeq ($(OS),Windows_NT)
EXE=.exe
LIB=bin
else
EXE=
LIB=lib
ifeq ($(shell uname -s),Darwin)
OS=MacOS
endif
endif

#CC=gcc
ifneq ($(OPENSSL_DIR),)
ifeq ($(shell echo $(OPENSSL_DIR) | grep "^/"),)
# $(OPENSSL_DIR) is relative path
OPENSSL_LIB=$(OPENSSL_DIR)
ifeq ($(OS),Windows_NT)
$(info [DEBUG] OS is Windows_NT)
EXE = .exe
LIB = bin
else
# $(OPENSSL_DIR) is absolute path
OPENSSL_LIB=$(OPENSSL_DIR)/$(LIB)
$(info [DEBUG] OS is supposed to be Unix-like)
EXE =
LIB = lib
ifeq ($(shell uname -s),Darwin)
$(info [DEBUG] OS is Darwin (MacOS))
OS = MacOS
endif
endif

CFLAGS+=-isystem $(OPENSSL_DIR)/include
LDFLAGS+=-L$(OPENSSL_DIR) -L$(OPENSSL_LIB) -Wl,-rpath,$(OPENSSL_DIR) -Wl,-rpath,$(OPENSSL_LIB)
endif
LDLIBS=-lcrypto

.phony: default build show clean
# CC = gcc
ifneq ($(OPENSSL_DIR),)
$(info [DEBUG] OPENSSL_DIR is set: $(OPENSSL_DIR))
ifeq ($(shell echo $(OPENSSL_DIR) | grep "^/"),)
$(info [DEBUG] OPENSSL_DIR is a relative path)
# $(OPENSSL_DIR) is relative path
OPENSSL_LIB = $(OPENSSL_DIR)
else
$(info [DEBUG] OPENSSL_DIR is an absolute path)
# $(OPENSSL_DIR) is absolute path
OPENSSL_LIB = $(OPENSSL_DIR)/$(LIB)
endif
$(info [TRACE] After OPENSSL_DIR check: OPENSSL_LIB="$(OPENSSL_LIB)")
CFLAGS += -isystem $(OPENSSL_DIR)/include
LDFLAGS += -L$(OPENSSL_DIR) -L$(OPENSSL_LIB) -Wl,-rpath,$(OPENSSL_DIR) -Wl,-rpath,$(OPENSSL_LIB)
endif

LDLIBS = -lcrypto

default: build show clean
$(info [TRACE] After OPENSSL_DIR set: EXE=$(EXE))
$(info [TRACE] After OPENSSL_DIR set: LIB=$(LIB))
$(info [TRACE] After OPENSSL_DIR set: OPENSSL_LIB=$(OPENSSL_LIB))
$(info [TRACE] After OPENSSL_DIR set: CFLAGS=$(CFLAGS))
$(info [TRACE] After OPENSSL_DIR set: LDFLAGS=$(LDFLAGS))
$(info [TRACE] After OPENSSL_DIR set: LDLIBS=$(LDLIBS))

build: OpenSSL_version
.PHONY: default build show clean

show: build
default: build show clean

build: OpenSSL_version

show: build
@./OpenSSL_version$(EXE)

clean:
clean:
@rm -f OpenSSL_version$(EXE)


else ifeq ($(LIB),header)
$(info [DEBUG] LIB is set to header)

OPENSSL_NUMBER_SEL = head -n 1 | sed -r 's/.*OpenSSL //' | awk '{print ($$0+0)}'
OPENSSLV_H = $(OPENSSL_DIR)/include/openssl/opensslv.h
ifeq ($(shell fgrep OPENSSL_VERSION_MAJOR "$(OPENSSLV_H)"),)
$(info [DEBUG] OPENSSL_VERSION_MAJOR not found in OPENSSLV_H)
OPENSSL_VERSION = $(shell grep 'OPENSSL_VERSION_TEXT\s* "OpenSSL ' "$(OPENSSLV_H)" | $(OPENSSL_NUMBER_SEL))
else
$(info [DEBUG] OPENSSL_VERSION_MAJOR found in OPENSSLV_H)
ifeq ($(OS),MacOS)
$(info [DEBUG] OS is MacOS)
OPENSSL_VERSION = $(shell fgrep OPENSSL_VERSION_M "$(OPENSSLV_H)" | head -n 2 | awk -v RS="" '{print $4"."$8 }')
else
$(info [DEBUG] OS is not MacOS)
OPENSSL_VERSION = $(shell fgrep OPENSSL_VERSION_M "$(OPENSSLV_H)" | head -n 2 | awk -v RS="" '{print $$4"."$$8 }')
endif
$(info [TRACE] After OS check in header: OPENSSL_VERSION=$(OPENSSL_VERSION))
endif

OPENSSL_NUMBER_SEL=head -n 1 | sed -r 's/.*OpenSSL //' | awk '{print ($$0+0)}'
OPENSSLV_H=$(OPENSSL_DIR)/include/openssl/opensslv.h
ifeq ($(shell fgrep OPENSSL_VERSION_MAJOR "$(OPENSSLV_H)"),)
OPENSSL_VERSION=$(shell grep 'OPENSSL_VERSION_TEXT\s* "OpenSSL ' "$(OPENSSLV_H)" | $(OPENSSL_NUMBER_SEL))
else
ifeq ($(OS),MacOS)
OPENSSL_VERSION=$(shell fgrep OPENSSL_VERSION_M "$(OPENSSLV_H)" | head -n 2 | awk -v RS="" '{print $4"."$8 }')
else
OPENSSL_VERSION=$(shell fgrep OPENSSL_VERSION_M "$(OPENSSLV_H)" | head -n 2 | awk -v RS="" '{print $$4"."$$8 }')
endif
endif

ifeq ($(OPENSSL_VERSION),1)
OPENSSL_VERSION=1.0
endif
ifeq ($(OPENSSL_VERSION),1)
OPENSSL_VERSION = 1.0
endif

$(info [TRACE] OPENSSL_NUMBER_SEL=$(OPENSSL_NUMBER_SEL))
$(info [TRACE] OPENSSLV_H=$(OPENSSLV_H))
$(info [TRACE] OPENSSL_VERSION=$(OPENSSL_VERSION))

else # $(LIB) is name of library file
$(info [DEBUG] LIB is supposed to be a library file: $(LIB))

OPENSSL_VERSION = $(shell strings "$(LIB)" | grep -E 'OpenSSL [0-9]+\.[0-9]+\.' | head -n 1 | sed -r 's/.*OpenSSL //' | awk -v FS="." '{print $$1"."$$2}')
ifeq ($(OPENSSL_VERSION),)
$(info [DEBUG] OpenSSL version info not found in library file contents; now trying to get it from the file name)
OPENSSL_VERSION = $(shell strings "$(LIB)" | grep -E 'libcrypto\.' | head -n 1 | sed -r 's/.*libcrypto(.[a-z]+)?\.//')
endif
ifeq ($(OPENSSL_VERSION),1.0.0)
OPENSSL_VERSION = 1.0
endif

OPENSSL_VERSION=$(shell strings "$(LIB)" | grep -E 'OpenSSL [0-9]+\.[0-9]+\.' | head -n 1 | sed -r 's/.*OpenSSL //' | awk -v FS="." '{print $$1"."$$2}')
ifeq ($(OPENSSL_VERSION),)
OPENSSL_VERSION=$(shell strings "$(LIB)" | grep -E 'libcrypto\.' | head -n 1 | sed -r 's/.*libcrypto(.[a-z]+)?\.//')
endif
ifeq ($(OPENSSL_VERSION),1.0.0)
OPENSSL_VERSION=1.0
endif

$(info [TRACE] OPENSSL_VERSION=$(OPENSSL_VERSION))

endif # $(LIB)


.phony: detect
.PHONY: detect

detect:
$(info $(OPENSSL_VERSION))

0 comments on commit 78e2558

Please sign in to comment.