G1Pola/0ne.sh

175 lines
5.3 KiB
Bash

#!/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="<id>\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