175 lines
5.3 KiB
Bash
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
|