Thursday, July 18, 2019

Find a file type, order by date.

Under MacOS, finding my .tex files and showing newest first:
find . -type f -name "*.tex" -exec stat -f "%Sm %N" -t /
      "%Y%y%m%d%H%M" {} \; | sort -r | less

Tuesday, January 22, 2019

Matlab Coder from Windows to *unix

One of the strange things about a platform is that people tend to support "the platform". If you ever get a look at a MATLAB Coder Makefile, you'll immediately see things like PERL is included due to the lack of grep on Windows.

I asked Mathworks if they could export both a Windows and *unix Makefile, but it's not supported: https://www.mathworks.com/matlabcentral/answers/440297-coder-create-a-makefile-for-linux-from-windows

The following script won't work for everyone, but it is a good start. Run "script.sh > Makefile" in the top directory of the Coder output and you'll compile to a static library.
Surprisingly (don't know why I am), Coder did a really good job of making C code that compiled on BSD-Lite, Solaris and AIX. I'm sure it'll work on Linux.

#!/bin/bash

## change OUTPUT to be the proper name
echo '
#-------------------------------------------------------------------------------
#       User-modifiable options
#-------------------------------------------------------------------------------

OUTPUT=rtprocessing
PREFIXINSTALL=/opt/local
ANSI_OPTS = -ansi -pedantic -Wno-long-long -fwrapv

#-------------------------------------------------------------------------------
#       User-modifiable options
#------------------------------------------------------------------------------=


UNIXTIME=$(shell date +%s)
WRTSIGNAL = ./signals/
WRTPARSERS = ./parsers/

# Compile for all memories available on the board (this sets $(MEMORIES))
# moved down to tools.

# Output directories
BIN = bin
OBJ = obj
SRC = src
'

echo '
#-------------------------------------------------------------------------------
#       Tools
#-------------------------------------------------------------------------------

# This is to generate SVN information into the binary.  0 is default.
SVNREV := 0

# Tool suffix when cross-compiling
#CROSS_COMPILE = arm-elf-
#CROSS_COMPILE =arm-none-eabi-
# Compilation tools
AR = $(CROSS_COMPILE)ar
CC = $(CROSS_COMPILE)clang
SIZE = $(CROSS_COMPILE)size
OBJCOPY = $(CROSS_COMPILE)objcopy
SVNREV := $(shell svnversion -n . | sed -e "s/.*://" -e "s/\([0-9]*\).*/\1/" | grep "[0-9]" )
#degs compile target
MEMORIES = flash


INCLUDES += -I.. -I. -I$(WRTPARSERS)
CFLAGS += $(OPTIMIZATION) $(INCLUDES)
ARFLAGS  = ruvs
CFLAGS  += -c $(ANSI_OPTS) -O0

#-------------------------------------------------------------------------------
#       Files
#-------------------------------------------------------------------------------


#VPATH is important for file location, which is basically the "INCLUDES"
VPATH += $(WRTSIGNAL) 
VPATH += $(WRTPARSERS)
VPATH += ./io
VPATH += ./examples

#C_OBJECTS = main.o
'

shopt -s nullglob
for file in *.cdo
    echo "C_source+=$file"
done

shopt -s nullglob
for file in *.cdo
    basefilename=$(echo "$file" | sed -e "s/c$//")
    #objectname = "$basefilename""o"
    #echo "$objectname"
    objectname="$basefilename""o" #create the .o list
    echo "C_OBJECTS+=$objectname"
done

echo '
OUTPUTDIR := $(BIN)/$(OUTPUT)
LIBOUTPUTDIR := $(BIN)/lib$(OUTPUT).a


all: clean $(BIN) $(OBJ) $(SRC) $(MEMORIES) 


$(BIN) $(OBJ) $(SRC):
    mkdir $@

define RULES
C_OBJECTS_$(1) = $(addprefix $(OBJ)/$(1)_, $(C_OBJECTS))
ASM_OBJECTS_$(1) = $(addprefix $(OBJ)/$(1)_, $(ASM_OBJECTS))

$(1): $$(ASM_OBJECTS_$(1)) $$(C_OBJECTS_$(1))
    $(AR) $(ARFLAGS) $(LIBOUTPUTDIR) $$^

$$(C_OBJECTS_$(1)): $(OBJ)/$(1)_%.o: %.c Makefile $(OBJ) $(BIN)
    $(CC) $(CFLAGS) -D$(1) -c -o $$@ $$<

$$(ASM_OBJECTS_$(1)): $(OBJ)/$(1)_%.o: %.S Makefile $(OBJ) $(BIN)
    $(CC) $(ASFLAGS) -D$(1) -c -o $$@ $$<


endef

$(foreach MEMORY, $(MEMORIES), $(eval $(call RULES,$(MEMORY))))
    
    
clean:
    -rm -f $(SRC)/*.s $(SRC)/*.i $(OBJ)/* $(BIN)/*
    -rm -f *.s
    -rm -f *.i
    -rm -f *.bc
    -rm -f a.out $(SRC)/*.out $(SRC)/*.out $(OBJ)/*.out $(BIN)/*.out $(BIN)/*.out $(WRTSIGNAL)/*.out $(WRTPARSERS)/*.out


'




Sunday, January 13, 2019

BASH script to update all SVN archives

I have a base root for my SVN repositories, such as:
./svn
./svn/project1
./svn/project2
In order to update everything, I made a script that will execute from any SVN repository and update all of the unrelated repos.

#!/bin/bash
#Before anything else, set the PATH_SCRIPT variable
    pushd `dirname $0` > /dev/nullPATH_SCRIPT=`pwd -P`popd > /dev/null
    PROGNAME=${0##*/}; PROGVERSION=0.1.0 
##
## This program attempts to do a SVN update on all of the directories off an SVN_ROOT

SVN_ROOT=$(svn info | awk -F'/Root Path: (.*)/ { print $2 }' | xargs)
SVN_ROOT=$(dirname $SVN_ROOT)
echo "$SVN_ROOT"

for svndir in $SVN_ROOT/* ; do
    BRANCH=`svn info ${svndir} 2> /dev/null | grep "^URL:" | cut -d" " -f2 `
     if [ -z "${BRANCH}" ]
    then
        #echo "Error: directory ${svndir} exists and is not part of a working copy."
        echo "skipping: ${svndir}"
    else
        #echo "$svndir"
        svn update $svndir
    fi
done


Tuesday, August 28, 2018

Multiple timers in MacOS/FreeBSD without timer_t.

POSIX extensions strike again, as I did not have timer_t. dispatch functions allow multiple timers in C under MacOS.
#include 
#include 
#include 

int i = 0;
dispatch_queue_t queue;
dispatch_source_t timer1;
dispatch_source_t timer2;


void sigtrap(int sig)
{
    dispatch_source_cancel(timer1);
    dispatch_source_cancel(timer2);
    printf("CTRL-C received, exiting program\n");
    exit(EXIT_SUCCESS);
}

void vector1(dispatch_source_t timer)
{
  printf("a: %d\n", i);
  i++;
  if (i >= 20) 
  {
   dispatch_source_cancel(timer);
  } 
}
void vector2(dispatch_source_t timer)
{
  printf("b: %d\n", i);
  i++;
  if (i >= 20)  //at 20 count cancel the 
  {
   dispatch_source_cancel(timer);
  } 
}

int main(int argc, const char* argv[]) {

 signal(SIGINT, &sigtrap);   //catch the cntl-c
 queue = dispatch_queue_create("timerQueue", 0);

 // Create dispatch timer source
 timer1 = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
 timer2 = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
 
 // Set block for dispatch source when catched events
 dispatch_source_set_event_handler(timer1, ^{vector1(timer1);});
 dispatch_source_set_event_handler(timer2, ^{vector2(timer2);});

 // Set block for dispatch source when cancel source
 dispatch_source_set_cancel_handler(timer1, ^{
  dispatch_release(timer1);
  dispatch_release(queue);
  printf("end\n");
  exit(0);
 });
 dispatch_source_set_cancel_handler(timer2, ^{
  dispatch_release(timer2);
  dispatch_release(queue);
  printf("end\n");
  exit(0);
 }); 

 dispatch_time_t start = dispatch_time(DISPATCH_TIME_NOW, NSEC_PER_SEC); // after 1 sec

 // Set timer
 dispatch_source_set_timer(timer1, start, NSEC_PER_SEC / 5, 0);  // 0.2 sec
 dispatch_source_set_timer(timer2, start, NSEC_PER_SEC / 2, 0);  // 0.5 sec
 printf("start\n");

 dispatch_resume(timer1);
 dispatch_resume(timer2);
 dispatch_main();
 return 0;
}

Monday, June 11, 2018

ISO rejection of Simon

I am a circuit designer by training, and not a cryptographer. One of the thing that I've found from working with cryptographers, is that I find them to be odd to work with by nature. It's most like because their products are seldom tangible, and therefore there is a lot of infighting.

In this article on the ISO rejection of SIMON, there's a quote regarding the NSA from Tomer Ashur: "They refused to motivate design choices they made such as the choice of matrices U, V, and W in Simon’s key schedule. Instead, they chose to personally attack some of the experts (including @hashbreaker, Orr Dunkelman and myself) as incompetent."

Well, I know the design choices behind U, W, V, which were related to slide attacks for some internal tool they had based on the rounds. I do not know anything about the tool, but Shor's mentioned this when I asked when I was writing my Simontool paper. The matrices in question with circuit implementation are in my simontool.supplemental.pdf. The question at hand is how U, W, and V where decided; however, I cannot answer that as I do not have their internal tools. Having said that, the circuits are beautiful, and perhaps someone will do a detailed analysis of the tradeoffs between each matrix for rounds.

Thursday, April 12, 2018

Two random words under MacOS

As MacOS doesn't have sort -R, if you want to randomize a list, it gets a bit more complicated.
In order to generate two random words, I'm currently using:
cat /usr/share/dict/words | awk 'BEGIN{srand();}{print rand()"\t"$0}' \
| sort -k1 -n | cut -f2- | awk 'NR <= 2 { print $1 }'