Minor changes to get it working on macOS
This commit is contained in:
67
software/Makefile.macos
Normal file
67
software/Makefile.macos
Normal file
@@ -0,0 +1,67 @@
|
||||
GIT_VERSION := $(shell git --no-pager describe --tags --always)
|
||||
GIT_COMMIT := $(shell git rev-parse --verify HEAD)
|
||||
GIT_DATE := $(firstword $(shell git --no-pager show --date=iso-strict --format="%ad" --name-only))
|
||||
|
||||
PREFIX = $(DESTDIR)/usr/local
|
||||
FTDILOC = /usr/local/Cellar/libftdi/1.4/include/libftdi1/
|
||||
|
||||
CFLAGS = -Wall -Wextra -Werror -std=c99 -O3 -fPIC -I Keccak -I $(FTDILOC) \
|
||||
-DGIT_VERSION=\"$(GIT_VERSION)\"\
|
||||
-DGIT_COMMIT=\"$(GIT_COMMIT)\"\
|
||||
-DGIT_DATE=\"$(GIT_DATE)\"\
|
||||
-DMACOS
|
||||
|
||||
FOUND = $(shell /sbin/ldconfig -p | grep --silent libftdi.so && echo found)
|
||||
ifeq ($(FOUND), found)
|
||||
FTDI= -lftdi
|
||||
else
|
||||
FTDI= -lftdi1
|
||||
endif
|
||||
|
||||
all: libinfnoise.a libinfnoise.so infnoise
|
||||
|
||||
infnoise: libinfnoise.a infnoise.o daemon.o
|
||||
$(CC) $(CFLAGS) -o infnoise infnoise.o daemon.o libinfnoise.a $(FTDI) -lm -L. -linfnoise
|
||||
|
||||
%.o: %.c infnoise.h libinfnoise.h
|
||||
$(CC) -c -o $@ $< $(CFLAGS)
|
||||
|
||||
KeccakF-1600-reference.o: Keccak/KeccakF-1600-reference.c Keccak/KeccakF-1600-interface.h Keccak/brg_endian.h
|
||||
$(CC) -c -o $@ $< $(CFLAGS)
|
||||
|
||||
# static lib compiled into infnoise binary
|
||||
libinfnoise.o: libinfnoise.c libinfnoise.h libinfnoise_private.h healthcheck.c
|
||||
$(CC) $(CFLAGS) -c libinfnoise.c
|
||||
|
||||
libinfnoise.a: libinfnoise.o healthcheck.o KeccakF-1600-reference.o
|
||||
|
||||
ar rcs libinfnoise.a libinfnoise.o healthcheck.o KeccakF-1600-reference.o
|
||||
ranlib libinfnoise.a
|
||||
|
||||
# shared lib
|
||||
libinfnoise.so: libinfnoise.o healthcheck.o KeccakF-1600-reference.o
|
||||
$(CC) $(CFLAGS) -fvisibility=hidden -o libinfnoise.so libinfnoise.o healthcheck.o KeccakF-1600-reference.o -Wl $(FTDI) -lm -shared
|
||||
|
||||
libs: libinfnoise.a
|
||||
|
||||
clean:
|
||||
$(RM) infnoise *.o *.a *.gch *.so libinfnoise-example
|
||||
|
||||
install-lib: libinfnoise.so
|
||||
install -d $(PREFIX)/include
|
||||
install -m 0644 libinfnoise.h $(PREFIX)/include
|
||||
install -d $(PREFIX)/lib
|
||||
install -m 0644 libinfnoise.so $(PREFIX)/lib
|
||||
ldconfig $(PREFIX)/lib
|
||||
|
||||
install: infnoise
|
||||
install -d $(PREFIX)/sbin
|
||||
install -m 0755 infnoise $(PREFIX)/sbin/
|
||||
install -d $(PREFIX)/lib/udev/rules.d/
|
||||
install -m 0644 init_scripts/75-infnoise.rules $(PREFIX)/lib/udev/rules.d/
|
||||
install -d $(PREFIX)/lib/systemd/system
|
||||
install -m 0644 init_scripts/infnoise.service $(PREFIX)/lib/systemd/system
|
||||
|
||||
postinstall:
|
||||
systemctl restart systemd-udevd
|
||||
systemctl enable infnoise
|
||||
@@ -18,18 +18,18 @@
|
||||
#include "KeccakF-1600-interface.h"
|
||||
|
||||
static void initOpts(struct opt_struct *opts) {
|
||||
opts->outputMultiplier = 0u;
|
||||
opts->daemon = false;
|
||||
opts->debug = false;
|
||||
opts->devRandom = false;
|
||||
opts->noOutput = false;
|
||||
opts->listDevices = false;
|
||||
opts->raw = false;
|
||||
opts->version = false;
|
||||
opts->help = false;
|
||||
opts->none = false;
|
||||
opts->pidFileName =
|
||||
opts->serial = NULL;
|
||||
opts->outputMultiplier = 0u;
|
||||
opts->daemon = false;
|
||||
opts->debug = false;
|
||||
opts->devRandom = false;
|
||||
opts->noOutput = false;
|
||||
opts->listDevices = false;
|
||||
opts->raw = false;
|
||||
opts->version = false;
|
||||
opts->help = false;
|
||||
opts->none = false;
|
||||
opts->pidFileName =
|
||||
opts->serial = NULL;
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
@@ -84,7 +84,7 @@ int main(int argc, char **argv)
|
||||
opts.help = true;
|
||||
} else {
|
||||
opts.help = true;
|
||||
opts.none = true;
|
||||
opts.none = true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -103,7 +103,7 @@ int main(int argc, char **argv)
|
||||
" --list-devices - list available devices\n"
|
||||
" --version - show version information\n"
|
||||
" --help - this help output\n", stdout);
|
||||
if (opts.none) {
|
||||
if (opts.none) {
|
||||
return 1;
|
||||
} else {
|
||||
return 0;
|
||||
@@ -142,10 +142,10 @@ int main(int argc, char **argv)
|
||||
}
|
||||
|
||||
if (opts.version) {
|
||||
printf("GIT VERSION - %s\n", GIT_VERSION);
|
||||
printf("GIT COMMIT - %s\n", GIT_COMMIT);
|
||||
printf("GIT DATE - %s\n", GIT_DATE);
|
||||
return 0;
|
||||
printf("GIT VERSION - %s\n", GIT_VERSION);
|
||||
printf("GIT COMMIT - %s\n", GIT_COMMIT);
|
||||
printf("GIT DATE - %s\n", GIT_DATE);
|
||||
return 0;
|
||||
}
|
||||
|
||||
char *message = "no data?";
|
||||
@@ -156,12 +156,18 @@ int main(int argc, char **argv)
|
||||
return 1;
|
||||
}
|
||||
//fputs(message, stdout); // todo: put list of devices to &message and print here, not in libinfnoise
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (opts.devRandom) {
|
||||
#ifdef LINUX
|
||||
inmWriteEntropyStart(BUFLEN/8u, opts.debug); // todo: create method in libinfnoise.h for this?
|
||||
// also todo: check superUser in this mode (it will fail silently if not :-/)
|
||||
// also todo: check superUser in this mode (it will fail silently if not :-/)
|
||||
#endif
|
||||
#ifdef MACOS
|
||||
message = "dev/random not supported on macOS";
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
// Optionally run in the background and optionally write a PID-file
|
||||
|
||||
@@ -89,7 +89,7 @@ uint32_t extractBytes(uint8_t *bytes, uint8_t *inBuf, char **message, bool *erro
|
||||
// This is a good place to feed the bit from the INM to the health checker.
|
||||
if(!inmHealthCheckAddBit(evenBit, oddBit, even)) {
|
||||
*message = "Health check of Infinite Noise Multiplier failed!";
|
||||
*errorFlag = true;
|
||||
*errorFlag = true;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@@ -113,8 +113,15 @@ bool outputBytes(uint8_t *bytes, uint32_t length, uint32_t entropy, bool writeD
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
#ifdef MACOS
|
||||
*message = "macOS doesn't support writes to entropy pool";
|
||||
entropy = 0; // suppress warning
|
||||
return false;
|
||||
#endif
|
||||
#ifdef LINUX
|
||||
inmWaitForPoolToHaveRoom();
|
||||
inmWriteEntropyToPool(bytes, length, entropy);
|
||||
#endif
|
||||
}
|
||||
return true;
|
||||
}
|
||||
@@ -141,14 +148,14 @@ uint32_t processBytes(uint8_t *bytes, uint8_t *result, uint32_t entropy,
|
||||
// In raw mode, we just output raw data from the INM.
|
||||
if (!noOutput) {
|
||||
if (!outputBytes(bytes, BUFLEN/8u, entropy, writeDevRandom, message)) {
|
||||
*errorFlag = true;
|
||||
*errorFlag = true;
|
||||
return 0; // write failed
|
||||
}
|
||||
} else {
|
||||
if (result != NULL) {
|
||||
if (result != NULL) {
|
||||
memcpy(result, bytes, BUFLEN/8u * sizeof(uint8_t));
|
||||
}
|
||||
}
|
||||
}
|
||||
return BUFLEN/8u;
|
||||
}
|
||||
|
||||
@@ -164,16 +171,16 @@ uint32_t processBytes(uint8_t *bytes, uint8_t *result, uint32_t entropy,
|
||||
if(outputMultiplier == 0u) {
|
||||
// Output all the bytes of entropy we have
|
||||
KeccakExtract(keccakState, dataOut, (entropy + 63u)/64u);
|
||||
if (!noOutput) {
|
||||
if (!outputBytes(dataOut, entropy/8u, entropy & 0x7u, writeDevRandom, message)) {
|
||||
if (!noOutput) {
|
||||
if (!outputBytes(dataOut, entropy/8u, entropy & 0x7u, writeDevRandom, message)) {
|
||||
*errorFlag = true;
|
||||
return 0;
|
||||
}
|
||||
} else {
|
||||
if (result != NULL) {
|
||||
} else {
|
||||
if (result != NULL) {
|
||||
memcpy(result, dataOut, entropy/8u * sizeof(uint8_t));
|
||||
}
|
||||
}
|
||||
}
|
||||
return entropy/8u;
|
||||
}
|
||||
|
||||
@@ -192,20 +199,20 @@ uint32_t processBytes(uint8_t *bytes, uint8_t *result, uint32_t entropy,
|
||||
if(entropyThisTime > 8u*bytesToWrite) {
|
||||
entropyThisTime = 8u*bytesToWrite;
|
||||
}
|
||||
if (!noOutput) {
|
||||
if (!noOutput) {
|
||||
if (!outputBytes(dataOut, bytesToWrite, entropyThisTime, writeDevRandom, message)) {
|
||||
*errorFlag = true;
|
||||
return 0;
|
||||
}
|
||||
} else {
|
||||
} else {
|
||||
//memcpy(result + bytesWritten, dataOut, bytesToWrite * sizeof(uint8_t)); //doesn't work?
|
||||
// alternative: loop through dataOut and append array elements to result..
|
||||
if (result != NULL) {
|
||||
if (result != NULL) {
|
||||
for (uint32_t i =0; i < bytesToWrite; i++ ) {
|
||||
result[bytesWritten + i] = dataOut[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
bytesWritten += bytesToWrite;
|
||||
numBits -= bytesToWrite*8u;
|
||||
entropy -= entropyThisTime;
|
||||
@@ -215,7 +222,7 @@ uint32_t processBytes(uint8_t *bytes, uint8_t *result, uint32_t entropy,
|
||||
}
|
||||
if(bytesWritten != outputMultiplier*(256u/8u)) {
|
||||
*message = "Internal error outputing bytes";
|
||||
*errorFlag = true;
|
||||
*errorFlag = true;
|
||||
return 0;
|
||||
}
|
||||
return bytesWritten;
|
||||
@@ -247,15 +254,15 @@ bool listUSBDevices(struct ftdi_context *ftdic, char** message) {
|
||||
if (rc < 0) {
|
||||
if (!isSuperUser()) {
|
||||
*message = "Can't find Infinite Noise Multiplier. Try running as super user?";
|
||||
return false;
|
||||
return false;
|
||||
}
|
||||
//*message = "ftdi_usb_get_strings failed: %d (%s)\n", rc, ftdi_get_error_string(ftdic));
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
// print to stdout
|
||||
// print to stdout
|
||||
printf("Manufacturer: %s, Description: %s, Serial: %s", manufacturer, description, serial);
|
||||
curdev = curdev->next;
|
||||
curdev = curdev->next;
|
||||
}
|
||||
|
||||
return true;
|
||||
@@ -275,10 +282,10 @@ bool initializeUSB(struct ftdi_context *ftdic, char **message, char *serial) {
|
||||
|
||||
// only one found, or no serial given
|
||||
if (rc >= 0) {
|
||||
if (serial == NULL) {
|
||||
if (serial == NULL) {
|
||||
// more than one found AND no serial given
|
||||
if (rc >= 2) {
|
||||
*message = "Multiple Infnoise TRNGs found and serial not specified, using the first one!";
|
||||
*message = "Multiple Infnoise TRNGs found and serial not specified, using the first one!";
|
||||
}
|
||||
if (ftdi_usb_open(ftdic, INFNOISE_VENDOR_ID, INFNOISE_PRODUCT_ID) < 0) {
|
||||
if(!isSuperUser()) {
|
||||
@@ -287,7 +294,7 @@ bool initializeUSB(struct ftdi_context *ftdic, char **message, char *serial) {
|
||||
*message = "Can't open Infinite Noise Multiplier";
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// serial specified
|
||||
rc = ftdi_usb_open_desc(ftdic, INFNOISE_VENDOR_ID, INFNOISE_PRODUCT_ID, NULL, serial);
|
||||
@@ -298,7 +305,7 @@ bool initializeUSB(struct ftdi_context *ftdic, char **message, char *serial) {
|
||||
*message = "Can't find Infinite Noise Multiplier with given serial";
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -369,10 +376,10 @@ uint32_t readData_private(struct ftdi_context *ftdic, uint8_t *result, char **me
|
||||
uint8_t bytes[BUFLEN/8u];
|
||||
uint32_t entropy = extractBytes(bytes, inBuf, message, errorFlag);
|
||||
|
||||
// call health check and process bytes if OK
|
||||
// call health check and process bytes if OK
|
||||
if (inmHealthCheckOkToUseData() && inmEntropyOnTarget(entropy, BUFLEN)) {
|
||||
uint32_t byteswritten = processBytes(bytes, result, entropy, raw, devRandom, outputMultiplier, noOutput, message, errorFlag);
|
||||
return byteswritten;
|
||||
return byteswritten;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
@@ -408,10 +415,10 @@ int main() {
|
||||
uint64_t bytesWritten = 0u;
|
||||
bytesWritten = readData(&ftdic, keccakState, result, multiplier);
|
||||
|
||||
// check for -1, indicating an error
|
||||
// check for -1, indicating an error
|
||||
totalBytesWritten += bytesWritten;
|
||||
|
||||
// make sure to only read as many bytes as readData returned. Only those have passed the health check in this round (usually all)
|
||||
// make sure to only read as many bytes as readData returned. Only those have passed the health check in this round (usually all)
|
||||
fwrite(result, 1, bytesWritten, stdout);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user