aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYigit Sever2021-04-14 03:27:27 +0300
committerYigit Sever2021-04-14 19:11:49 +0300
commitedfab6ae2f97a7288ff456265050c01ff397ea8c (patch)
treee98ce8b12c1ef4d61c70944f47d87d74297a8ed3
parenta5d5ab88d3f73d0b6f5fa847df6dace90810313d (diff)
downloadgradecoin-edfab6ae2f97a7288ff456265050c01ff397ea8c.tar.gz
gradecoin-edfab6ae2f97a7288ff456265050c01ff397ea8c.tar.bz2
gradecoin-edfab6ae2f97a7288ff456265050c01ff397ea8c.zip
[WIP] Initial implementation of user auth
There is a dance involved and everything Write down specs for RSA and AES, padding scheme, ugh.
-rw-r--r--Cargo.lock169
-rw-r--r--Cargo.toml3
-rw-r--r--scripts/python_client.py57
-rw-r--r--secrets/gradecoin.pem27
-rw-r--r--secrets/gradecoin.pub9
-rw-r--r--src/custom_filters.rs8
-rw-r--r--src/handlers.rs34
-rw-r--r--src/lib.rs40
-rw-r--r--src/schema.rs9
9 files changed, 342 insertions, 14 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 9b91b30..03c6eb0 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -22,6 +22,12 @@ dependencies = [
22 22
23[[package]] 23[[package]]
24name = "autocfg" 24name = "autocfg"
25version = "0.1.7"
26source = "registry+https://github.com/rust-lang/crates.io-index"
27checksum = "1d49d90015b3c36167a20fe2810c5cd875ad504b39cff3d4eae7977e6b7c1cb2"
28
29[[package]]
30name = "autocfg"
25version = "1.0.1" 31version = "1.0.1"
26source = "registry+https://github.com/rust-lang/crates.io-index" 32source = "registry+https://github.com/rust-lang/crates.io-index"
27checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" 33checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a"
@@ -313,6 +319,7 @@ dependencies = [
313name = "gradecoin" 319name = "gradecoin"
314version = "0.1.0" 320version = "0.1.0"
315dependencies = [ 321dependencies = [
322 "base64 0.13.0",
316 "blake2", 323 "blake2",
317 "chrono", 324 "chrono",
318 "hex-literal", 325 "hex-literal",
@@ -322,9 +329,11 @@ dependencies = [
322 "md-5", 329 "md-5",
323 "parking_lot", 330 "parking_lot",
324 "pretty_env_logger", 331 "pretty_env_logger",
332 "rsa",
325 "serde", 333 "serde",
326 "serde_json", 334 "serde_json",
327 "serde_test", 335 "serde_test",
336 "sha2",
328 "tokio", 337 "tokio",
329 "warp", 338 "warp",
330] 339]
@@ -478,7 +487,7 @@ version = "1.6.2"
478source = "registry+https://github.com/rust-lang/crates.io-index" 487source = "registry+https://github.com/rust-lang/crates.io-index"
479checksum = "824845a0bf897a9042383849b02c1bc219c2383772efcd5c6f9766fa4b81aef3" 488checksum = "824845a0bf897a9042383849b02c1bc219c2383772efcd5c6f9766fa4b81aef3"
480dependencies = [ 489dependencies = [
481 "autocfg", 490 "autocfg 1.0.1",
482 "hashbrown", 491 "hashbrown",
483] 492]
484 493
@@ -526,7 +535,7 @@ dependencies = [
526 "ring", 535 "ring",
527 "serde", 536 "serde",
528 "serde_json", 537 "serde_json",
529 "simple_asn1", 538 "simple_asn1 0.4.1",
530] 539]
531 540
532[[package]] 541[[package]]
@@ -544,6 +553,9 @@ name = "lazy_static"
544version = "1.4.0" 553version = "1.4.0"
545source = "registry+https://github.com/rust-lang/crates.io-index" 554source = "registry+https://github.com/rust-lang/crates.io-index"
546checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" 555checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
556dependencies = [
557 "spin",
558]
547 559
548[[package]] 560[[package]]
549name = "libc" 561name = "libc"
@@ -552,6 +564,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
552checksum = "9385f66bf6105b241aa65a61cb923ef20efc665cb9f9bb50ac2f0c4b7f378d41" 564checksum = "9385f66bf6105b241aa65a61cb923ef20efc665cb9f9bb50ac2f0c4b7f378d41"
553 565
554[[package]] 566[[package]]
567name = "libm"
568version = "0.2.1"
569source = "registry+https://github.com/rust-lang/crates.io-index"
570checksum = "c7d73b3f436185384286bd8098d17ec07c9a7d2388a6599f824d8502b529702a"
571
572[[package]]
555name = "lock_api" 573name = "lock_api"
556version = "0.3.4" 574version = "0.3.4"
557source = "registry+https://github.com/rust-lang/crates.io-index" 575source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -674,18 +692,58 @@ version = "0.2.6"
674source = "registry+https://github.com/rust-lang/crates.io-index" 692source = "registry+https://github.com/rust-lang/crates.io-index"
675checksum = "090c7f9998ee0ff65aa5b723e4009f7b217707f1fb5ea551329cc4d6231fb304" 693checksum = "090c7f9998ee0ff65aa5b723e4009f7b217707f1fb5ea551329cc4d6231fb304"
676dependencies = [ 694dependencies = [
677 "autocfg", 695 "autocfg 1.0.1",
696 "num-integer",
697 "num-traits",
698]
699
700[[package]]
701name = "num-bigint"
702version = "0.3.2"
703source = "registry+https://github.com/rust-lang/crates.io-index"
704checksum = "7d0a3d5e207573f948a9e5376662aa743a2ea13f7c50a554d7af443a73fbfeba"
705dependencies = [
706 "autocfg 1.0.1",
678 "num-integer", 707 "num-integer",
679 "num-traits", 708 "num-traits",
680] 709]
681 710
682[[package]] 711[[package]]
712name = "num-bigint-dig"
713version = "0.7.0"
714source = "registry+https://github.com/rust-lang/crates.io-index"
715checksum = "4547ee5541c18742396ae2c895d0717d0f886d8823b8399cdaf7b07d63ad0480"
716dependencies = [
717 "autocfg 0.1.7",
718 "byteorder",
719 "lazy_static",
720 "libm",
721 "num-integer",
722 "num-iter",
723 "num-traits",
724 "rand 0.8.3",
725 "smallvec",
726 "zeroize",
727]
728
729[[package]]
683name = "num-integer" 730name = "num-integer"
684version = "0.1.44" 731version = "0.1.44"
685source = "registry+https://github.com/rust-lang/crates.io-index" 732source = "registry+https://github.com/rust-lang/crates.io-index"
686checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db" 733checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db"
687dependencies = [ 734dependencies = [
688 "autocfg", 735 "autocfg 1.0.1",
736 "num-traits",
737]
738
739[[package]]
740name = "num-iter"
741version = "0.1.42"
742source = "registry+https://github.com/rust-lang/crates.io-index"
743checksum = "b2021c8337a54d21aca0d59a92577a029af9431cb59b909b03252b9c164fad59"
744dependencies = [
745 "autocfg 1.0.1",
746 "num-integer",
689 "num-traits", 747 "num-traits",
690] 748]
691 749
@@ -695,7 +753,8 @@ version = "0.2.14"
695source = "registry+https://github.com/rust-lang/crates.io-index" 753source = "registry+https://github.com/rust-lang/crates.io-index"
696checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" 754checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290"
697dependencies = [ 755dependencies = [
698 "autocfg", 756 "autocfg 1.0.1",
757 "libm",
699] 758]
700 759
701[[package]] 760[[package]]
@@ -988,6 +1047,26 @@ dependencies = [
988] 1047]
989 1048
990[[package]] 1049[[package]]
1050name = "rsa"
1051version = "0.4.0"
1052source = "registry+https://github.com/rust-lang/crates.io-index"
1053checksum = "68ef841a26fc5d040ced0417c6c6a64ee851f42489df11cdf0218e545b6f8d28"
1054dependencies = [
1055 "byteorder",
1056 "digest",
1057 "lazy_static",
1058 "num-bigint-dig",
1059 "num-integer",
1060 "num-iter",
1061 "num-traits",
1062 "pem",
1063 "rand 0.8.3",
1064 "simple_asn1 0.5.1",
1065 "subtle",
1066 "zeroize",
1067]
1068
1069[[package]]
991name = "ryu" 1070name = "ryu"
992version = "1.0.5" 1071version = "1.0.5"
993source = "registry+https://github.com/rust-lang/crates.io-index" 1072source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1077,14 +1156,39 @@ dependencies = [
1077] 1156]
1078 1157
1079[[package]] 1158[[package]]
1159name = "sha2"
1160version = "0.9.3"
1161source = "registry+https://github.com/rust-lang/crates.io-index"
1162checksum = "fa827a14b29ab7f44778d14a88d3cb76e949c45083f7dbfa507d0cb699dc12de"
1163dependencies = [
1164 "block-buffer",
1165 "cfg-if 1.0.0",
1166 "cpuid-bool",
1167 "digest",
1168 "opaque-debug",
1169]
1170
1171[[package]]
1080name = "simple_asn1" 1172name = "simple_asn1"
1081version = "0.4.1" 1173version = "0.4.1"
1082source = "registry+https://github.com/rust-lang/crates.io-index" 1174source = "registry+https://github.com/rust-lang/crates.io-index"
1083checksum = "692ca13de57ce0613a363c8c2f1de925adebc81b04c923ac60c5488bb44abe4b" 1175checksum = "692ca13de57ce0613a363c8c2f1de925adebc81b04c923ac60c5488bb44abe4b"
1084dependencies = [ 1176dependencies = [
1085 "chrono", 1177 "chrono",
1086 "num-bigint", 1178 "num-bigint 0.2.6",
1179 "num-traits",
1180]
1181
1182[[package]]
1183name = "simple_asn1"
1184version = "0.5.1"
1185source = "registry+https://github.com/rust-lang/crates.io-index"
1186checksum = "db8d597fce66eb0f19dd129b9956e4054cba21aeaf97d4116595027b670fac50"
1187dependencies = [
1188 "chrono",
1189 "num-bigint 0.3.2",
1087 "num-traits", 1190 "num-traits",
1191 "thiserror",
1088] 1192]
1089 1193
1090[[package]] 1194[[package]]
@@ -1134,6 +1238,18 @@ dependencies = [
1134] 1238]
1135 1239
1136[[package]] 1240[[package]]
1241name = "synstructure"
1242version = "0.12.4"
1243source = "registry+https://github.com/rust-lang/crates.io-index"
1244checksum = "b834f2d66f734cb897113e34aaff2f1ab4719ca946f9a7358dba8f8064148701"
1245dependencies = [
1246 "proc-macro2",
1247 "quote",
1248 "syn",
1249 "unicode-xid",
1250]
1251
1252[[package]]
1137name = "tempfile" 1253name = "tempfile"
1138version = "3.2.0" 1254version = "3.2.0"
1139source = "registry+https://github.com/rust-lang/crates.io-index" 1255source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1157,6 +1273,26 @@ dependencies = [
1157] 1273]
1158 1274
1159[[package]] 1275[[package]]
1276name = "thiserror"
1277version = "1.0.24"
1278source = "registry+https://github.com/rust-lang/crates.io-index"
1279checksum = "e0f4a65597094d4483ddaed134f409b2cb7c1beccf25201a9f73c719254fa98e"
1280dependencies = [
1281 "thiserror-impl",
1282]
1283
1284[[package]]
1285name = "thiserror-impl"
1286version = "1.0.24"
1287source = "registry+https://github.com/rust-lang/crates.io-index"
1288checksum = "7765189610d8241a44529806d6fd1f2e0a08734313a35d5b3a556f92b381f3c0"
1289dependencies = [
1290 "proc-macro2",
1291 "quote",
1292 "syn",
1293]
1294
1295[[package]]
1160name = "time" 1296name = "time"
1161version = "0.1.44" 1297version = "0.1.44"
1162source = "registry+https://github.com/rust-lang/crates.io-index" 1298source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1550,3 +1686,24 @@ dependencies = [
1550 "winapi 0.2.8", 1686 "winapi 0.2.8",
1551 "winapi-build", 1687 "winapi-build",
1552] 1688]
1689
1690[[package]]
1691name = "zeroize"
1692version = "1.2.0"
1693source = "registry+https://github.com/rust-lang/crates.io-index"
1694checksum = "81a974bcdd357f0dca4d41677db03436324d45a4c9ed2d0b873a5a360ce41c36"
1695dependencies = [
1696 "zeroize_derive",
1697]
1698
1699[[package]]
1700name = "zeroize_derive"
1701version = "1.0.1"
1702source = "registry+https://github.com/rust-lang/crates.io-index"
1703checksum = "c3f369ddb18862aba61aa49bf31e74d29f0f162dec753063200e1dc084345d16"
1704dependencies = [
1705 "proc-macro2",
1706 "quote",
1707 "syn",
1708 "synstructure",
1709]
diff --git a/Cargo.toml b/Cargo.toml
index 6701daf..3b6e71e 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -20,6 +20,9 @@ blake2 = "0.9.1"
20hex-literal = "0.3.1" 20hex-literal = "0.3.1"
21jsonwebtoken = "7.2.0" 21jsonwebtoken = "7.2.0"
22md-5 = "0.9.1" 22md-5 = "0.9.1"
23rsa = "0.4.0"
24base64 = "0.13.0"
25sha2 = "0.9.3"
23 26
24[dev-dependencies] 27[dev-dependencies]
25serde_test = "1.0.117" 28serde_test = "1.0.117"
diff --git a/scripts/python_client.py b/scripts/python_client.py
new file mode 100644
index 0000000..fe96cc2
--- /dev/null
+++ b/scripts/python_client.py
@@ -0,0 +1,57 @@
1from Crypto.PublicKey import RSA
2import json
3from Crypto.Cipher import PKCS1_OAEP
4from Crypto.Signature import PKCS1_v1_5
5from Crypto.Hash import SHA512, SHA384, SHA256, SHA, MD5
6from Crypto import Random
7from base64 import b64encode, b64decode
8hash = "SHA-256"
9
10# def newkeys(keysize):
11# random_generator = Random.new().read
12# key = RSA.generate(keysize, random_generator)
13# private, public = key, key.publickey()
14# return public, private
15
16# def importKey(externKey):
17# return RSA.importKey(externKey)
18
19# def getpublickey(priv_key):
20# return priv_key.publickey()
21
22
23def encrypt(message, pub_key):
24 cipher = PKCS1_OAEP.new(pub_key)
25 return cipher.encrypt(message)
26
27
28if __name__ == "__main__":
29
30 myself = {
31 "student_id": "e2482057",
32 "public_key": """-----BEGIN PUBLIC KEY-----
33MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3agASpH/TplIAX0YBqmh
345q3Iq6+LcJtlUVWiI/v0T74XwYPZaJpAArHaiMUGXAWxmzfbvEo1wE9RzySYV/5k
35QSpYDRekpOn0flIAQHORVbJ08s0udH6/c2AyAzqiwZbR1DRr7M90pSLvWvzHQT+c
36kT6rXYcp9GlSAv3AXRw5ZYalbQf7ST/Mb4T8O1MRkAatzXg3T4x3XJ3uxHOletLL
37SzsfY52kEn0uaFG6UI7UG50h8jcjqBxn+ETbn2YEZG5ecmPdYNakq2pqrdWXWMhE
38AUd927qkxgg/nyyFqwxIbTxebxzpNX8IHMT8PgNdMxVMqnhBWxiw1nborY+pwGVL
39MwIDAQAB
40-----END PUBLIC KEY-----"""
41 }
42 with open("../secrets/gradecoin.pub", "r") as fs:
43 data = fs.read()
44 pubkeyobj = RSA.importKey(data)
45
46 cipher = PKCS1_OAEP.new(pubkeyobj)
47
48 ser = json.dumps(myself, separators=(',', ':'))
49
50 a = cipher.encrypt(ser)
51
52 print(f"{a}")
53
54
55
56
57
diff --git a/secrets/gradecoin.pem b/secrets/gradecoin.pem
new file mode 100644
index 0000000..d5ce1ef
--- /dev/null
+++ b/secrets/gradecoin.pem
@@ -0,0 +1,27 @@
1-----BEGIN RSA PRIVATE KEY-----
2MIIEogIBAAKCAQEAyGuqiCPGcguy+Y9TH7Bl7XlEsalyqb9bYlzpbV0dnqZ3lPkE
3PkuOhkN+GcuiV6iXtSwyh7nB+xTRXKJFRUBO/jbN8jfcxVwBu0JxjF3v1YRBxbOH
4hz2A295mbKD9xHQCKxkfYBNkUXxj8gd+GaDvQiSW5NdrX/lEkvqfGtdEX1m2+Hdc
5G0+3YW24Xg0znhCwLr+sorLuJaDy9Xa0Uo+DPWGC5s001U/BxkCIWJ+eJQCb7Bv+
69vXb8BGRK/ecMb/fb6h5O+8fgB64RCHMgcc2v+Q/dPt8kHX1OJdMuYUrUJGACppM
7QY3W6e1HdlRIBcZKL2LMZ2CrIB/2D5LiJhPThQIDAQABAoIBABbHrg1lS5QA4mnd
8MYyDh0JTq0wqP18t4dwvRVTp5Yj30NW87A+MlPmLyFR0QdKG1h+Ak4m7wmGgfx9x
9TkBNy+y3G/dxBAXmrEe1iKR0tOLm8nbfLgNgKTpUb/3e2pkuumRdqaRI7/kXE2Ea
10Guoc0bUJ5aDDH3A8K+As3lK1rw7LNxwxZdmqmpO+EAldP6NaLnXNP5BegjLK50xP
11NXTDNx6pw+I2ZHHwC/A6+QVksSA6zPipI1poANaO0frHffwKhcEZ/VucuXlJGGq/
12aqXT/cc7IkKUVq8EZUwUqHi4SrnyDDq/mtuikSD0MazxumbeC6fBKRP98Kavy2rT
13JItHSYECgYEA8H/yC9GDrR1bwBesD0pKdKBy18UMFQF3BrB04OjqdGzugdVafF4e
147azYQQTQ0ZddLDvgYl0QYvQaZfv26L7o4VrN5XEg8WjUWKuww8XUYOCfPn4gOFL1
15ar8nQ0w3P65gYf/rw0rFMo3eB78rJMROYnG8nZ/3OdgQjVaYPJxFKmECgYEA1VZy
16EQz8dHK3+F0EfQIFeXOSlYGUegmPZ9iYmh+yvW/zWKLYdXBEHNhAIRlBmfe7Yhj6
171FNluNGjFqZYuRnP0RuiBxt2RCd+AL90Lqq+O6jem4XNgr3cOKoaV0FbaU49sI4s
18/B6iiYBFdVuPBiknz+Wf1KEF9lQ+w2VYSLucY6UCgYAWPe73ste3sehjWo0aGOfL
19427bj6ivZKRKZRVaG5BbVhu0vDOTHu1DU+HoGXbqe1ItnhgBYNP8ItEyL1xFaCqH
20dOtn1c+TI/vHe5FseaZLk1qG4AlAzENQLP+HlMvjQtA9H/sA47BbHY20L7TgwJrz
21NcuY1Et7+QSG3cRUjqtC4QKBgGuP+VUVehfwW0dzBrdMlJwGpGqS+dyKA271awOS
22ZdlTn5saCA82OnFcqwDFLilGGYk9VQJGxivoLtVVq7gwBnLE/u2ccAWu773KyfZZ
23ii6kVxCM5vA7b9R2F2/U+RTgKQRiutWnUIYJUXv5XORbTcJpYSugwFPRaA+2gkux
24pAktAoGABRyVs5LOhQ/oeXe2H2kvuaUq9c7f/dTtnyMNdNxK0uZcQn4jcB2eK9kB
25PDYHM9dfQ8xn51U0fTeaXjy/8Km8fyX2Jtxntlm6puyhSTJ8AX+FEgJkC4ajNEvA
26mJ1Gsy2fXKUyyZdI2b74MLqOpzr9cvS60tmTIScuiHFzg/SJgiA=
27-----END RSA PRIVATE KEY-----
diff --git a/secrets/gradecoin.pub b/secrets/gradecoin.pub
new file mode 100644
index 0000000..ffe2f12
--- /dev/null
+++ b/secrets/gradecoin.pub
@@ -0,0 +1,9 @@
1-----BEGIN PUBLIC KEY-----
2MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyGuqiCPGcguy+Y9TH7Bl
37XlEsalyqb9bYlzpbV0dnqZ3lPkEPkuOhkN+GcuiV6iXtSwyh7nB+xTRXKJFRUBO
4/jbN8jfcxVwBu0JxjF3v1YRBxbOHhz2A295mbKD9xHQCKxkfYBNkUXxj8gd+GaDv
5QiSW5NdrX/lEkvqfGtdEX1m2+HdcG0+3YW24Xg0znhCwLr+sorLuJaDy9Xa0Uo+D
6PWGC5s001U/BxkCIWJ+eJQCb7Bv+9vXb8BGRK/ecMb/fb6h5O+8fgB64RCHMgcc2
7v+Q/dPt8kHX1OJdMuYUrUJGACppMQY3W6e1HdlRIBcZKL2LMZ2CrIB/2D5LiJhPT
8hQIDAQAB
9-----END PUBLIC KEY-----
diff --git a/src/custom_filters.rs b/src/custom_filters.rs
index ae8a56c..299cd8d 100644
--- a/src/custom_filters.rs
+++ b/src/custom_filters.rs
@@ -1,5 +1,5 @@
1/// Functions that extracts Structs to be used in warp routines 1/// Functions that extracts Structs to be used in warp routines
2use crate::schema::{AuthRequest, Block, Db, Transaction}; 2use crate::schema::{Block, Db, InitialAuthRequest, Transaction};
3use std::convert::Infallible; 3use std::convert::Infallible;
4use warp::{Filter, Rejection}; 4use warp::{Filter, Rejection};
5 5
@@ -8,12 +8,12 @@ pub fn with_db(db: Db) -> impl Filter<Extract = (Db,), Error = Infallible> + Clo
8 warp::any().map(move || db.clone()) 8 warp::any().map(move || db.clone())
9} 9}
10 10
11/// Extracts an `AuthRequest` JSON body from the request 11/// Extracts an `InitialAuthRequest` JSON body from the request
12/// Accepts only JSON encoded `AuthRequest` body and rejects big payloads 12/// Accepts only JSON encoded `AuthRequest` body and rejects big payloads
13/// 13///
14// TODO: find a good limit for this, (=e2482057; 8 char String + rsa pem) <11-04-21, yigit> // 14// TODO: find a good limit for this, (=e2482057; 8 char String + rsa pem) <11-04-21, yigit> //
15pub fn auth_request_json_body() -> impl Filter<Extract = (AuthRequest,), Error = Rejection> + Clone 15pub fn auth_request_json_body(
16{ 16) -> impl Filter<Extract = (InitialAuthRequest,), Error = Rejection> + Clone {
17 warp::body::content_length_limit(1024 * 32).and(warp::body::json()) 17 warp::body::content_length_limit(1024 * 32).and(warp::body::json())
18} 18}
19 19
diff --git a/src/handlers.rs b/src/handlers.rs
index b9df931..9d1bb10 100644
--- a/src/handlers.rs
+++ b/src/handlers.rs
@@ -1,3 +1,4 @@
1use base64;
1/// API handlers, the ends of each filter chain 2/// API handlers, the ends of each filter chain
2use blake2::{Blake2s, Digest}; 3use blake2::{Blake2s, Digest};
3use jsonwebtoken::errors::ErrorKind; 4use jsonwebtoken::errors::ErrorKind;
@@ -5,12 +6,16 @@ use jsonwebtoken::{decode, Algorithm, DecodingKey, TokenData, Validation};
5use log::{debug, warn}; 6use log::{debug, warn};
6use md5::Md5; 7use md5::Md5;
7use parking_lot::RwLockUpgradableReadGuard; 8use parking_lot::RwLockUpgradableReadGuard;
9use rsa::{PaddingScheme, RSAPrivateKey};
8use serde::Serialize; 10use serde::Serialize;
9use serde_json; 11use serde_json;
12use sha2;
10use std::convert::Infallible; 13use std::convert::Infallible;
11use std::fs; 14use std::fs;
12use warp::{http::StatusCode, reply}; 15use warp::{http::StatusCode, reply};
13 16
17use crate::PRIVATE_KEY;
18
14#[derive(Serialize, Debug)] 19#[derive(Serialize, Debug)]
15struct GradeCoinResponse { 20struct GradeCoinResponse {
16 res: ResponseType, 21 res: ResponseType,
@@ -23,7 +28,9 @@ enum ResponseType {
23 Error, 28 Error,
24} 29}
25 30
26use crate::schema::{AuthRequest, Block, Claims, Db, MetuId, NakedBlock, Transaction, User}; 31use crate::schema::{
32 AuthRequest, Block, Claims, Db, InitialAuthRequest, MetuId, NakedBlock, Transaction, User,
33};
27 34
28const BEARER: &str = "Bearer "; 35const BEARER: &str = "Bearer ";
29 36
@@ -32,11 +39,34 @@ const BEARER: &str = "Bearer ";
32/// Lets a [`User`] (=student) to authenticate themselves to the system 39/// Lets a [`User`] (=student) to authenticate themselves to the system
33/// This `request` can be rejected if the payload is malformed (= not authenticated properly) or if 40/// This `request` can be rejected if the payload is malformed (= not authenticated properly) or if
34/// the [`AuthRequest.user_id`] of the `request` is not in the list of users that can hold a Gradecoin account 41/// the [`AuthRequest.user_id`] of the `request` is not in the list of users that can hold a Gradecoin account
42/// The request first comes in encrypted
35pub async fn authenticate_user( 43pub async fn authenticate_user(
36 request: AuthRequest, 44 request: InitialAuthRequest,
37 db: Db, 45 db: Db,
38) -> Result<impl warp::Reply, warp::Rejection> { 46) -> Result<impl warp::Reply, warp::Rejection> {
39 debug!("POST request to /register, authenticate_user"); 47 debug!("POST request to /register, authenticate_user");
48
49 // TODO: lazyload or something <14-04-21, yigit> //
50 let der_encoded = PRIVATE_KEY
51 .lines()
52 .filter(|line| !line.starts_with("-"))
53 .fold(String::new(), |mut data, line| {
54 data.push_str(&line);
55 data
56 });
57 let der_bytes = base64::decode(&der_encoded).expect("failed to decode base64 content");
58 let private_key = RSAPrivateKey::from_pkcs1(&der_bytes).expect("failed to parse key");
59
60 let padding = PaddingScheme::new_oaep::<sha2::Sha256>();
61 let dec_key = private_key
62 .decrypt(padding, &request.key.as_bytes())
63 .expect("failed to decrypt");
64
65 // then decrypt c using key dec_key
66
67 // let request: AuthRequest = serde_json::from_str(&String::from_utf8(dec_data).unwrap()).unwrap();
68 let request;
69
40 let provided_id = request.student_id.clone(); 70 let provided_id = request.student_id.clone();
41 71
42 let priv_student_id = match MetuId::new(request.student_id, request.passwd) { 72 let priv_student_id = match MetuId::new(request.student_id, request.passwd) {
diff --git a/src/lib.rs b/src/lib.rs
index 42def0f..7a24f9f 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -22,7 +22,45 @@
22//! `Authorization`: The request header should have Bearer JWT.Token signed with Student Public Key 22//! `Authorization`: The request header should have Bearer JWT.Token signed with Student Public Key
23 23
24pub mod custom_filters; 24pub mod custom_filters;
25pub mod error;
25pub mod handlers; 26pub mod handlers;
26pub mod routes; 27pub mod routes;
27pub mod schema; 28pub mod schema;
28pub mod error; 29
30pub const PRIVATE_KEY: &'static str = "-----BEGIN RSA PRIVATE KEY-----
31MIIEogIBAAKCAQEAyGuqiCPGcguy+Y9TH7Bl7XlEsalyqb9bYlzpbV0dnqZ3lPkE
32PkuOhkN+GcuiV6iXtSwyh7nB+xTRXKJFRUBO/jbN8jfcxVwBu0JxjF3v1YRBxbOH
33hz2A295mbKD9xHQCKxkfYBNkUXxj8gd+GaDvQiSW5NdrX/lEkvqfGtdEX1m2+Hdc
34G0+3YW24Xg0znhCwLr+sorLuJaDy9Xa0Uo+DPWGC5s001U/BxkCIWJ+eJQCb7Bv+
359vXb8BGRK/ecMb/fb6h5O+8fgB64RCHMgcc2v+Q/dPt8kHX1OJdMuYUrUJGACppM
36QY3W6e1HdlRIBcZKL2LMZ2CrIB/2D5LiJhPThQIDAQABAoIBABbHrg1lS5QA4mnd
37MYyDh0JTq0wqP18t4dwvRVTp5Yj30NW87A+MlPmLyFR0QdKG1h+Ak4m7wmGgfx9x
38TkBNy+y3G/dxBAXmrEe1iKR0tOLm8nbfLgNgKTpUb/3e2pkuumRdqaRI7/kXE2Ea
39Guoc0bUJ5aDDH3A8K+As3lK1rw7LNxwxZdmqmpO+EAldP6NaLnXNP5BegjLK50xP
40NXTDNx6pw+I2ZHHwC/A6+QVksSA6zPipI1poANaO0frHffwKhcEZ/VucuXlJGGq/
41aqXT/cc7IkKUVq8EZUwUqHi4SrnyDDq/mtuikSD0MazxumbeC6fBKRP98Kavy2rT
42JItHSYECgYEA8H/yC9GDrR1bwBesD0pKdKBy18UMFQF3BrB04OjqdGzugdVafF4e
437azYQQTQ0ZddLDvgYl0QYvQaZfv26L7o4VrN5XEg8WjUWKuww8XUYOCfPn4gOFL1
44ar8nQ0w3P65gYf/rw0rFMo3eB78rJMROYnG8nZ/3OdgQjVaYPJxFKmECgYEA1VZy
45EQz8dHK3+F0EfQIFeXOSlYGUegmPZ9iYmh+yvW/zWKLYdXBEHNhAIRlBmfe7Yhj6
461FNluNGjFqZYuRnP0RuiBxt2RCd+AL90Lqq+O6jem4XNgr3cOKoaV0FbaU49sI4s
47/B6iiYBFdVuPBiknz+Wf1KEF9lQ+w2VYSLucY6UCgYAWPe73ste3sehjWo0aGOfL
48427bj6ivZKRKZRVaG5BbVhu0vDOTHu1DU+HoGXbqe1ItnhgBYNP8ItEyL1xFaCqH
49dOtn1c+TI/vHe5FseaZLk1qG4AlAzENQLP+HlMvjQtA9H/sA47BbHY20L7TgwJrz
50NcuY1Et7+QSG3cRUjqtC4QKBgGuP+VUVehfwW0dzBrdMlJwGpGqS+dyKA271awOS
51ZdlTn5saCA82OnFcqwDFLilGGYk9VQJGxivoLtVVq7gwBnLE/u2ccAWu773KyfZZ
52ii6kVxCM5vA7b9R2F2/U+RTgKQRiutWnUIYJUXv5XORbTcJpYSugwFPRaA+2gkux
53pAktAoGABRyVs5LOhQ/oeXe2H2kvuaUq9c7f/dTtnyMNdNxK0uZcQn4jcB2eK9kB
54PDYHM9dfQ8xn51U0fTeaXjy/8Km8fyX2Jtxntlm6puyhSTJ8AX+FEgJkC4ajNEvA
55mJ1Gsy2fXKUyyZdI2b74MLqOpzr9cvS60tmTIScuiHFzg/SJgiA=
56-----END RSA PRIVATE KEY-----";
57
58pub const PUB_KEY: &'static str = "-----BEGIN PUBLIC KEY-----
59MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyGuqiCPGcguy+Y9TH7Bl
607XlEsalyqb9bYlzpbV0dnqZ3lPkEPkuOhkN+GcuiV6iXtSwyh7nB+xTRXKJFRUBO
61/jbN8jfcxVwBu0JxjF3v1YRBxbOHhz2A295mbKD9xHQCKxkfYBNkUXxj8gd+GaDv
62QiSW5NdrX/lEkvqfGtdEX1m2+HdcG0+3YW24Xg0znhCwLr+sorLuJaDy9Xa0Uo+D
63PWGC5s001U/BxkCIWJ+eJQCb7Bv+9vXb8BGRK/ecMb/fb6h5O+8fgB64RCHMgcc2
64v+Q/dPt8kHX1OJdMuYUrUJGACppMQY3W6e1HdlRIBcZKL2LMZ2CrIB/2D5LiJhPT
65hQIDAQAB
66-----END PUBLIC KEY-----";
diff --git a/src/schema.rs b/src/schema.rs
index 9e157c7..f159d83 100644
--- a/src/schema.rs
+++ b/src/schema.rs
@@ -178,7 +178,7 @@ pub struct MetuId {
178 passwd: String, 178 passwd: String,
179} 179}
180 180
181// TODO: this will arrive encrypted <13-04-21, yigit> // 181/// The plaintext of the initial user authentication request
182#[derive(Serialize, Deserialize, Debug, PartialEq)] 182#[derive(Serialize, Deserialize, Debug, PartialEq)]
183pub struct AuthRequest { 183pub struct AuthRequest {
184 pub student_id: String, 184 pub student_id: String,
@@ -186,6 +186,13 @@ pub struct AuthRequest {
186 pub public_key: String, 186 pub public_key: String,
187} 187}
188 188
189/// Ciphertext of the initial authentication request, or what we will receive
190#[derive(Serialize, Deserialize, Debug)]
191pub struct InitialAuthRequest {
192 pub c: String,
193 pub key: String,
194}
195
189lazy_static! { 196lazy_static! {
190 static ref OUR_STUDENTS: HashSet<(&'static str, &'static str)> = { 197 static ref OUR_STUDENTS: HashSet<(&'static str, &'static str)> = {
191 [ 198 [