#!/bin/bash ################################################################################ # Capture picture. Find a face. Print G1Card. # Autoriser le user à imprimer: sudo usermod -a -G lp pi # # !!!! PGP CONFIG !!!!! # Add this to ~/.gnupg/gpg.conf: # use-agent # pinentry-mode loopback # # Add this to ~/.gnupg/gpg-agent.conf # allow-loopback-pinentry # # Then restart the agent with # echo RELOADAGENT | gpg-connect-agent ################################################################################ # Author: Fred (support@qo-op.com) # Version: 0.1 # License: AGPL-3.0 (https://choosealicense.com/licenses/agpl-3.0/) ################################################################################ # Initialize GPIO states LED=5 BUTTON=21 gpio -g mode $BUTTON up gpio -g mode $LED out ip="$(ifconfig wlan0 | grep "inet " | awk '{print $2}')" ipfsid=$(ipfs id -f="\n") echo "#############################" > /dev/usb/lp0 echo "NODE: $ip" > /dev/usb/lp0 echo "IPFS: $ipfsid" > /dev/usb/lp0 echo "#############################" > /dev/usb/lp0 mkdir -p "./print/" sleep=5 # Forever Loop while : do if [ $(gpio -g read $BUTTON) -eq 0 ]; then gpio -g write $LED 1 STAMP=$(date +%Y%m%d%H%M%S) # TAKE PICTURE (+++ brightness) raspistill -n -th none -t 50 -fli auto -br 80 -co 80 -w 720 -h 480 -o ./picture.jpg gpio -g write $LED 0 # START FACE DETECTION & WAIT... cp ./picture.jpg ./tmp/${STAMP}.jpg for (( i=$sleep ; i>=0 ; i-- )) do if [[ -f "./processed_images/face.jpg" ]]; then # FOUND A FACE gpio -g write $LED 1 break else sleep 1s # printf "\r%02d:%02d" $((i/60)) $((i%60)) fi done # DO WE HAVE ONE FACE? if [[ ! -f "./processed_images/face.jpg" ]]; then # NO !!! gpio -g write $LED 1 sleep 0.2 gpio -g write $LED 0 sleep 0.2 gpio -g write $LED 1 sleep 0.2 gpio -g write $LED 0 else # YES !!! CREATING CARD... SALT=$(./diceware.sh 5 | xargs) PEPPER=$(./diceware.sh 5 | xargs) # MAKE pgp passphrase [0-9] -> [1-10] P1=$((RANDOM % 10)) K1=$(echo "$SALT $PEPPER" | cut -d ' ' -f $(($P1 + 1))) P2=$((RANDOM % 10)) K2=$(echo "$SALT $PEPPER" | cut -d ' ' -f $(($P2 + 1))) P3=$((RANDOM % 10)) K3=$(echo "$SALT $PEPPER" | cut -d ' ' -f $(($P3 + 1))) P4=$((RANDOM % 10)) K4=$(echo "$SALT $PEPPER" | cut -d ' ' -f $(($P4 + 1))) PIN=$P1$P2$P3$P4 KEY=$K1$K2$K3$K4 echo "________ G1 CARTE ________" > /dev/usb/lp0 echo "Date: $(date +%Y/%m/%d-%H:%M:%S)" > /dev/usb/lp0 # GENERATE PUBLIC KEY with SILKAJ CLI HACK (Bad ASS coding, I know! But it works...) # sudo pip3 install commandlines scrypt PUBKEY=$(./silkaj/silkaj generate_auth_file --auth-scrypt -salt="$SALT" -password="$PEPPER") # NEW G1 CARD CREATION if [[ -f "./authfile" && ! -d "./CARDS/${PUBKEY}" ]]; then mkdir -p "./CARDS/${PUBKEY}/" # RECORD qrcode.png qrencode "${PUBKEY}" -o "./CARDS/${PUBKEY}/G1_qrcode.png" -s 10 # RECORD visage.jpg & picture.jpg # TODO: More security with Deep Learning on visage(s).jpg mv "./processed_images/face.jpg" "./CARDS/${PUBKEY}/visage.jpg" mv "./picture.jpg" "./CARDS/${PUBKEY}/photo.jpg" # RECORD authfile.pgp ($KEY ENCRYPTED) # TODO: Find Better Encryption! Use longer PIN with RFID? echo $KEY | gpg -c --passphrase-fd 0 ./authfile mv "./authfile.gpg" "./CARDS/${PUBKEY}/" rm -f "./authfile" # RECORD key.pgp ($PIN ENCRYPTED) # TODO: Make it less sensible to brute force attack echo "$KEY" > ./key echo $PIN | gpg -c --passphrase-fd 0 ./key mv "./key.gpg" "./CARDS/${PUBKEY}/" rm -f "./key" # SEND "./CARDS/${PUBKEY}" TO IPFS IPFS=$(ipfs add -r -q "./CARDS/${PUBKEY}" | tail -n 1) # NOW WE CAN GET BACK FILES BY # ipfs cat ${PUBKEY}/file # RECEVOIR echo " RECEVOIR" > /dev/usb/lp0 # PRINT photo.jpg convert "./CARDS/${PUBKEY}/photo.jpg" -strip -resize 384 -format jpg "./print/photo.jpg" python ./esc-pos-image.py "./print/photo.jpg" > /dev/usb/lp0 # PRINT qrcode.png convert "./CARDS/${PUBKEY}/G1_qrcode.png" -strip -resize 384 -format png "./print/G1_qrcode.png" python ./esc-pos-image.py "./print/G1_qrcode.png" > /dev/usb/lp0 echo "${PUBKEY}" > /dev/usb/lp0 echo "8<--------- 8<-------- 8<------" > /dev/usb/lp0 # ENVOYER # CREATE & PRINT IPFS_qrcode.png echo " ENVOYER" > /dev/usb/lp0 qrencode "${IPFS}" -o "/tmp/IPFS_qrcode.png" -s 10 #--foreground=FFFFFF --background=000000 convert "/tmp/IPFS_qrcode.png" -strip -resize 384 -format png "./print/IPFS_qrcode.png" python ./esc-pos-image.py "./print/IPFS_qrcode.png" > /dev/usb/lp0 echo " " > /dev/usb/lp0 echo "${IPFS}" > /dev/usb/lp0 echo "8<--------- 8<-------- 8<------" > /dev/usb/lp0 # PRINT PRIVATE ACCESS echo "########## _SECRET_ #########" > /dev/usb/lp0 echo "COMPTE (Cesium)" > /dev/usb/lp0 echo "${SALT}" > /dev/usb/lp0 echo "${PEPPER}" > /dev/usb/lp0 echo "#############################" > /dev/usb/lp0 echo " $PIN" > /dev/usb/lp0 echo "#############################" > /dev/usb/lp0 echo " " > /dev/usb/lp0 # PRINT visage.jpg convert "./CARDS/${PUBKEY}/visage.jpg" -strip -resize 384 -format jpg "./print/visage.jpg" python ./esc-pos-image.py "./print/visage.jpg" > /dev/usb/lp0 echo " " > /dev/usb/lp0 else echo "COLLISION! Veuillez recommencer..." > /dev/usb/lp0 fi gpio -g write $LED 0 fi else #DO NOTHING sleep 0.1 fi done