-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathhost-integ.py
More file actions
75 lines (64 loc) · 2.54 KB
/
host-integ.py
File metadata and controls
75 lines (64 loc) · 2.54 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
from Crypto.PublicKey import RSA
from Crypto.Signature import PKCS1_v1_5
from Crypto.Hash import SHA256
from base64 import b64decode, b64encode
import sys
sys.dont_write_bytecode = True
import random
import socket
#hostがclientからのsignatureをverifyする
# (hostはclientからアドレス,公開鍵の情報を取得)
# (アドレスを使ってブロックチェーンから公開鍵を取得&チャレンジレスポンス検証)
def verify(pub_key, signature, data):
rsakey = RSA.importKey(pub_key)
signer = PKCS1_v1_5.new(rsakey)
digest = SHA256.new()
digest.update(b64decode(data))
if signer.verify(digest, b64decode(signature)):
return True
else:
return False
with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s:
# IPアドレスとポートを指定
s.bind(('127.0.0.1', 40010))
# 1 接続
s.listen(1)
# connection するまで待つ
while True:
# 誰かがアクセスしてきたら、コネクションとアドレスを入れる
conn, addr = s.accept()
with conn:
while True:
s.setblocking(True)
data = conn.recv(1024)
if not data:
break
if(data==b'\x00H'):
num=random.randint(10,10000)
strnum=str(num)
rand=num.to_bytes(2, 'big')
print(num)
print(rand)
conn.sendall(rand)
elif(len(data)>790):
print(len(data))
print(data)
sig=data[0:344]
pub=data[344:800]
#dataにpub_keyまで渡されない時がある
print(sig)
print("¥n")
print(pub)
strnum+='=' * (-len(strnum) % 4)
print("here")
# 承認テスト(承認者が行う)
# はじめに生成したrandomNumを使って正しいかチェックする
if verify(pub, sig, strnum):
print("承認 OK")
else:
print("承認 NG")
# クライアントにデータを返す(b -> byte でないといけない)
conn.sendall(b'Received: ' + data)
else:
print("fail to receive pub-key")
continue