From 9fa16e1ac93b63d4f2a4f95c33c43ddb4cd45181 Mon Sep 17 00:00:00 2001 From: lare Date: Sat, 12 Nov 2022 14:50:18 +0100 Subject: [PATCH] add signature verification module - (the (test) signature allegedly has the wrong length?) - add login route for main.py --- .gitignore | 3 +- .vscode/launch.json | 12 +++++++ web/backend/config.sample.json | 5 ++- web/backend/kioubit-auth-pubkey.pem | 6 ++++ web/backend/kioubit_verify.py | 49 +++++++++++++++++++++++++++++ web/backend/main.py | 33 +++++++++++++++++-- web/frontend/base.html | 19 +++++++++++ web/frontend/index.html | 47 +++++++++++++++++---------- web/frontend/login.html | 17 ++++++++++ web/frontend/static/style.css | 46 +++++++++++++++++++++++++-- web/requirements.txt | 2 ++ 11 files changed, 215 insertions(+), 24 deletions(-) create mode 100644 .vscode/launch.json create mode 100644 web/backend/kioubit-auth-pubkey.pem create mode 100644 web/backend/kioubit_verify.py create mode 100644 web/frontend/base.html create mode 100644 web/frontend/login.html create mode 100644 web/requirements.txt diff --git a/.gitignore b/.gitignore index 1b0e799..c9c5d96 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ venv -config.json \ No newline at end of file +config.json +*.pyc \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..6b05b4b --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,12 @@ +{ + "configurations": [ + { + "name": "Python: Current File", + "type": "python", + "request": "launch", + "program": "${file}", + "console": "integratedTerminal", + "justMyCode": false + } + ] +} diff --git a/web/backend/config.sample.json b/web/backend/config.sample.json index 6bd54b6..f94bf6a 100644 --- a/web/backend/config.sample.json +++ b/web/backend/config.sample.json @@ -3,8 +3,10 @@ "": { "pub-endpoint": "", "api-con": "http://:/", - "comment": "/* from here: data to be displayed on the webinterface */", + "country": "...", // Countrycode: 2 capital letters + "city": "...", + "wg-key": "...=", // pubkey of node "internal-v4": "172.2x.xxx.xxx", "internal-v6": "fdxx:...", "internal-v4ll": "169.254.xxx.xxx", @@ -14,6 +16,7 @@ "MNT": "YOUR-MNT", // your MNT tag "listen": "0.0.0.0", "port": 8042, + "flask-secret-key": "", // secret key for session cookies "flask-debug": false, // optional; default false "flask-template-dir": "../frontend/" // optional; default "../frontend" } \ No newline at end of file diff --git a/web/backend/kioubit-auth-pubkey.pem b/web/backend/kioubit-auth-pubkey.pem new file mode 100644 index 0000000..759b589 --- /dev/null +++ b/web/backend/kioubit-auth-pubkey.pem @@ -0,0 +1,6 @@ +-----BEGIN PUBLIC KEY----- +MIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQA4DCOlR4g94udKvu9+zKbwqxV/rjg +7g/Ij91TnEqUhIBi3LBjBoykcSFnWBtXgnmrj0WxBt4vAj7YO5jCQZJMVeIALCcS +Fkn447bsp6NdQzxTMQ8UYTPX/g7AzxEDOVtXfSBo/BiZF9LYPmm0zwk+y7ZmR8Kf +02hEtJbbjN/GoD6Mq1c= +-----END PUBLIC KEY----- \ No newline at end of file diff --git a/web/backend/kioubit_verify.py b/web/backend/kioubit_verify.py new file mode 100644 index 0000000..371cf9d --- /dev/null +++ b/web/backend/kioubit_verify.py @@ -0,0 +1,49 @@ +#! /usr/bin/env python3 + +#import OpenSSL +#from OpenSSL.crypto import load_publickey, FILETYPE_PEM, X509 +#from OpenSSL.crypto import verify as OpenSSL_verify +import base64, os +#from hashlib import sha512 +from Crypto.PublicKey import ECC +from Crypto.Signature import DSS +import Crypto.Hash.SHA512 as SHA512 +#from hashlib import sha512 as SHA512 + +PUBKEY_FILE = os.path.dirname(__file__)+"/kioubit-auth-pubkey.pem" + +class AuthVerifyer (): + + def __init__(self,domain, pubkey=PUBKEY_FILE): + self.domain = domain + with open(pubkey) as pk: + pk_content = "" + for line in pk.readlines(): + pk_content += line + print(pk_content) + self.pubkey = ECC.import_key(pk_content) + #self.pubkey.set_pubkey( + # load_publickey(OpenSSL.crypto.FILETYPE_PEM, pk_content) + #) + + print(self.pubkey) + + def verify(self, params, signature): + # sig = base64.b64decode(signature) + # print(type(sig)) + #OpenSSL_verify(self.pubkey, sig + #, base64.b64decode(params), "sha512") + h = SHA512.new() + h.update(base64.b64decode(params)) + print(h.hexdigest()) + verifier = DSS.new(self.pubkey, 'fips-186-3') + print(verifier.verify(h, signature)) + +if __name__ == "__main__": + example_com_verifier = AuthVerifyer("example.com") + example_com_verifier.verify( + params="eyJhc24iOiI0MjQyNDIzMDM1IiwidGltZSI6MTY2ODI2NjkyNiwiYWxsb3dlZDQiOiIxNzIuMjIuMTI1LjEyOFwvMjYsMTcyLjIwLjAuODFcLzMyIiwiYWxsb3dlZDYiOiJmZDYzOjVkNDA6NDdlNTo6XC80OCxmZDQyOmQ0MjpkNDI6ODE6OlwvNjQiLCJtbnQiOiJMQVJFLU1OVCIsImF1dGh0eXBlIjoibG9naW5jb2RlIiwiZG9tYWluIjoic3ZjLmJ1cmJsZS5kbjQyIn0=", + signature="MIGIAkIBAmwz3sQ1vOkH8+8e0NJ8GsUqKSaazIWmYDp60sshlTo7gCAopZOZ6/+tD6s+oEGM1i5mKGbHgK9ROATQLHxUZecCQgCa2N828uNn76z1Yg63/c7veMVIiK4l1X9TCUepJnJ3mCto+7ogCP+2vQm6GHipSNRF4wnt6tZbir0HZvrqEnRAmA==" + ) +#params = "eyJhc24iOiI0MjQyNDIzMDM1IiwidGltZSI6MTY2ODI1NjI5NSwiYWxsb3dlZDQiOiIxNzIuMjIuMTI1LjEyOFwvMjYsMTcyLjIwLjAuODFcLzMyIiwiYWxsb3dlZDYiOiJmZDYzOjVkNDA6NDdlNTo6XC80OCxmZDQyOmQ0MjpkNDI6ODE6OlwvNjQiLCJtbnQiOiJMQVJFLU1OVCIsImF1dGh0eXBlIjoibG9naW5jb2RlIiwiZG9tYWluIjoic3ZjLmJ1cmJsZS5kbjQyIn0=", +#signature = 'MIGHAkFy1m+9ahjIc5cJk/p+RiXJbhbWT5rPSJNg9Q3c8UTAM4F7lz2OqdWHw6GZN5NQgvqm6OB3Y751djYwCd54y2Kn4wJCAcBaOrtSclxkGIleVx183PhTnSr97r2F089PsDzNXIBvH5pYUwvJX7hG0op0f5tPm7fl12HOOrr8Q6kWW+XTrgGX' diff --git a/web/backend/main.py b/web/backend/main.py index 648cdf3..1e552e9 100644 --- a/web/backend/main.py +++ b/web/backend/main.py @@ -2,6 +2,7 @@ from flask import Flask, Response, redirect, render_template, request, session, abort import json, os +from functools import wraps app = Flask(__name__) @@ -38,17 +39,43 @@ class Config (dict): print(self._config) - config = Config() +def auth_required(): + def wrapper(f): + @wraps(f) + def decorated(*args, **kwargs): + if not "logged_in" in session: + return redirect(f"login?return={request.url}") + else: + return f(*args, **kwargs) + return decorated + return wrapper + + +@app.route("/login",methods=["GET","POST"]) +def login(): + if request.method == "GET": + session["return_url"] = request.args["return"] + return render_template("login.html", config=config, return_addr=request.args["return"]) + + #elif request.method == "POST": + +@app.route("/peer", methods=["GET","POST"]) +@auth_required() +def peer(): + return request.args @app.route("/") def index(): - print(config) - return render_template("index.html", config=config) + # print(config._config["nodes"]) + # for node in config["nodes"].values(): + # print (node) + return render_template("index.html", config=config._config) def main(): app.static_folder= config["flask-template-dir"]+"/static/" app.template_folder=config["flask-template-dir"] + app.secret_key = config["flask-secret-key"] app.run(host=config["listen"], port=config["port"], debug=config["flask-debug"], threaded=True) diff --git a/web/frontend/base.html b/web/frontend/base.html new file mode 100644 index 0000000..956236b --- /dev/null +++ b/web/frontend/base.html @@ -0,0 +1,19 @@ + + + + + + + {{config["MNT"]}} Autopeering + + + +
{{config["MNT"]}}
+
{% block content %}{% endblock %}
+
+
+
+
🄯 LARE-MNT
+
+ + \ No newline at end of file diff --git a/web/frontend/index.html b/web/frontend/index.html index b3370b9..cf8fbf5 100644 --- a/web/frontend/index.html +++ b/web/frontend/index.html @@ -1,17 +1,30 @@ - - - - - - - {{config["MNT"]}} Autopeering - - - -
-
{{config["MNT"]}}
-
-
-
- - \ No newline at end of file +{% extends 'base.html' %} + +{% block content %} +
+ +
+
+ +
+
+ + + + + + + + + + {% for node in config["nodes"] %} + + + + + + + {% endfor %} +
CountryCitypeeringsPeer!
{{config["nodes"][node]["country"]}}{{config["nodes"][node]["city"]}}peer
+
+{% endblock %} \ No newline at end of file diff --git a/web/frontend/login.html b/web/frontend/login.html new file mode 100644 index 0000000..631cb3b --- /dev/null +++ b/web/frontend/login.html @@ -0,0 +1,17 @@ +{% extends 'base.html' %} + +{% block content %} + +
+ + + +
+ +
+ +
+ +{% endblock %} \ No newline at end of file diff --git a/web/frontend/static/style.css b/web/frontend/static/style.css index cc56f0a..f1af515 100644 --- a/web/frontend/static/style.css +++ b/web/frontend/static/style.css @@ -1,4 +1,46 @@ +:root { + --bg-color: #aaa; + --text-color: black; + --other-background: #444; +} + body { - color: wheat; - background-color: black; + margin: 0; + width: auto; + height: auto; + background-color: var(--bg-color); +} + +header { + background-color: var(--other-background); + height: 50px; +} +.content { + width: 100%; + height: calc(100% - 55px); + margin: initial; +} + +.flex { + display: flex; + flex-direction: column; +} + +.flex>* { + flex-flow: column; + /* width: 1fr; + height: 1fr; */ + /* background-color: aquamarine; */ + margin: auto; +} + +footer { + position: fixed; + bottom: 0; + width: 100%; + height: 40px; + background: var(--other-background); +} +footer.flex { + flex-direction: row; } \ No newline at end of file diff --git a/web/requirements.txt b/web/requirements.txt new file mode 100644 index 0000000..7cf74ff --- /dev/null +++ b/web/requirements.txt @@ -0,0 +1,2 @@ +Flask +pyopenssl \ No newline at end of file