125 lines
3.3 KiB
Python
125 lines
3.3 KiB
Python
import string
|
|
import random
|
|
import json
|
|
import requests
|
|
from datetime import datetime
|
|
|
|
from src.paillier import Paillier
|
|
from src.utils import (
|
|
encode_regno,
|
|
decode_regno,
|
|
sha256,
|
|
)
|
|
from constants import ENROLL_URI, VALIDATE_URI
|
|
from fingercode.fingercode import FingerCode
|
|
from db.queries import mark_attendance
|
|
from db.conn import create_connection
|
|
|
|
# FP_DATA_LEN = 200
|
|
# random_fp = "".join(
|
|
# random.choices(string.ascii_lowercase + string.digits, k=FP_DATA_LEN)
|
|
# )
|
|
# random_fp = "wct4rywzkxdpca1ktds46i8izwgneauujtqk9o2jhlz101pcbr5935vgnw1hfuby84hcfnln9srso2nrke1farydlkbgda1nesf7q0jpj62ugxqffw5knfapchcrhgodi8dk4415vwuw4euacgs3ypp1ogb3a9es6meu5vfupjrfd92yvgn0sbuqxxs4omaw0s3xcxws"
|
|
# print(random_fp, len(random_fp))
|
|
# random_fp_ascii = [ord(ele) for ele in random_fp]
|
|
|
|
# print(random_fp_ascii)
|
|
|
|
# print(random_fp)
|
|
|
|
paillier = Paillier(256)
|
|
paillier.load_keys()
|
|
|
|
RANDOM_REGNO = "B170005CS"
|
|
DB_FILE = "./dumps/local.db"
|
|
THRESHOLD = 500
|
|
|
|
|
|
def enroll(random_fp_ascii):
|
|
|
|
encr_fp_list = []
|
|
for i in range(len(random_fp_ascii)):
|
|
encr_obj = paillier.encrypt(random_fp_ascii[i])
|
|
encr_fp_list.append(paillier.serialize(encr_obj))
|
|
|
|
encr_fp_sqr = paillier.serialize(paillier.encr_sqr_sum(random_fp_ascii))
|
|
|
|
# encr_regno = paillier.serialize(paillier.encrypt(encode_regno(RANDOM_REGNO)))
|
|
|
|
# print(encr_regno)
|
|
|
|
data = {
|
|
"encr_regno": sha256(RANDOM_REGNO),
|
|
"encr_fp_list": encr_fp_list,
|
|
"encr_fp_sqr": encr_fp_sqr,
|
|
}
|
|
|
|
print(data["encr_regno"])
|
|
|
|
fp = open("sample.json", "w")
|
|
json.dump(data, indent=4, fp=fp)
|
|
|
|
s = requests.Session()
|
|
resp = s.post(
|
|
ENROLL_URI,
|
|
data=json.dumps(data),
|
|
headers={"content-type": "application/json"},
|
|
)
|
|
print(resp)
|
|
|
|
|
|
def validate(conn, new_fp):
|
|
data = {"encr_regno": sha256(RANDOM_REGNO)}
|
|
|
|
s = requests.Session()
|
|
resp = s.post(
|
|
VALIDATE_URI,
|
|
data=json.dumps(data),
|
|
headers={"content-type": "application/json"},
|
|
)
|
|
resp_json = json.loads(resp.text)
|
|
|
|
encr_fp_orig = []
|
|
|
|
encr_fp_sqr = paillier.deserialize(json.loads(resp_json["encr_fp_sqr"]))
|
|
|
|
for i in range(len(resp_json["encr_fp_list"])):
|
|
encr_fp_orig.append(
|
|
paillier.deserialize(json.loads(resp_json["encr_fp_list"][i]))
|
|
)
|
|
|
|
# print(encr_fp_orig)
|
|
# print(encr_fp_sqr)
|
|
|
|
d = paillier.get_alt_euclidean_dist(encr_fp_orig, encr_fp_sqr, new_fp)
|
|
print("Euclidean distance : ", d)
|
|
if d < THRESHOLD:
|
|
attendance = (RANDOM_REGNO, datetime.now(), 1)
|
|
mark_attendance(conn, attendance)
|
|
else:
|
|
print("Threshold too high!")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
conn = create_connection(DB_FILE)
|
|
|
|
if conn is None:
|
|
print("Error! cannot create the database connection.")
|
|
|
|
if paillier.decrypt(paillier.encrypt(10)) == 10:
|
|
x = paillier.serialize(paillier.encrypt(10))
|
|
y = paillier.deserialize(json.loads(x))
|
|
print("Paillier working!")
|
|
|
|
print("Choose option : \n1. Enroll\n2. Validate\n")
|
|
opt = int(input())
|
|
|
|
if opt == 1:
|
|
fp_img_path = "./dataset/101_1.tif"
|
|
fp_arr = FingerCode(fp_img_path).result
|
|
enroll(fp_arr)
|
|
elif opt == 2:
|
|
fp_img_new = "./dataset/101_2.tif"
|
|
fp_arr_new = FingerCode(fp_img_new).result
|
|
validate(conn, fp_arr_new) |