เชตเชฟเชเชพเชธเชเชฐเซเชคเชพ เชฌเชจเชตเซเช
เช เชฌเชงเชพเช เชฎเชจเซ เช เชฒเซเช เชฒเชเชตเชพ เชฎเชพเชเซ เชชเซเชฐเซเชคเซเชธเชพเชนเชฟเชค เชเชฐเซเชฏเซเช เชเซ เชคเซ เชฌเชคเชพเชตเชตเชพ เชฎเชพเชเซ เชเซ เชเซเชฐเชฟเชชเซเชเซเชเซเชฐเชพเชซเชฟเช เชชเซเชฐเซเชเซเชเซเชฒ เช เชจเซ เชธเซเชฐเชเซเชทเชฟเชค IM เช เชฎเชฒเชฎเชพเช เชฎเซเชเชตเซเช เชเชเชฒเซเช เชฎเซเชถเซเชเซเชฒ เชเชพเชฐเซเชฏ เชจเชฅเซ. เชเซ เชเซ, เชคเชฎเชพเชฐเชพ เชชเซเชคเชพเชจเชพ เชชเซเชฐเชฎเชพเชฃเซเชเชฐเชฃ เช เชจเซ เชฎเซเชเซเชฏ เชเชฐเชพเชฐ เชชเซเชฐเซเชเซเชเซเชฒเชจเซ เชถเซเชง เชเชฐเชตเซ เชคเซ เชฏเซเชเซเชฏ เชจเชฅเซ.
เชฒเซเช เชฒเชเชถเซ
IM เชกเชฟเชเชพเชเชจ
เชชเซเชฐเชฅเชฎ, เชเชชเชฃเซ เช เชธเชฎเชเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ เชเซ เชเชชเชฃเซเช IM เชเซเชตเซเช เชฆเซเชเชพเชถเซ. เชธเชฐเชณเชคเชพ เชฎเชพเชเซ, เชธเชนเชญเชพเชเซเชเชจเซ เชเซเชเชชเชฃ เชถเซเชง เชตเชฟเชจเชพ, เชคเซเชจเซ เชชเซเช เชฐ-เชเซ-เชชเซเช เชฐ เชจเซเชเชตเชฐเซเช เชฌเชจเชตเชพ เชฆเซ. เช เชฎเซ เชตเซเชฏเชเซเชคเชฟเชเชค เชฐเซเชคเซ เชธเซเชเชตเซเชถเซเช เชเซ เชเชฏเซเช เชธเชฐเชจเชพเชฎเซเช: เชเชจเซเชเชฐเชฒเซเชเซเชฏเซเชเชฐ เชธเชพเชฅเซ เชตเชพเชคเชเซเชค เชเชฐเชตเชพ เชฎเชพเชเซ เชเชจเซเชเซเช เชเชฐเชตเชพ เชฎเชพเชเซเชจเซเช เชชเซเชฐเซเช.
เชนเซเช เชธเชฎเชเซเช เชเซเช เชเซ, เช เชธเชฎเชฏเซ, เชฌเซ เชฎเชจเชธเซเชตเซ เชเชฎเซเชชเซเชฏเซเชเชฐเซเชธ เชตเชเซเชเซ เชธเซเชงเซ เชธเชเชเชพเชฐ เชเชชเชฒเชฌเซเชง เชเซ เชคเซเชตเซ เชงเชพเชฐเชฃเชพ เช เชตเซเชฏเชตเชนเชพเชฐเชฎเชพเช IM เชจเซ เชฒเชพเชเซ เชชเชกเชคเซ เชจเซเชเชงเชชเชพเชคเซเชฐ เชฎเชฐเซเชฏเชพเชฆเชพ เชเซ. เชชเชฐเชเชคเซ เชเซเชเชฒเชพ เชตเชงเซ เชตเชฟเชเชพเชธเชเชฐเซเชคเชพเช เชคเชฎเชพเชฎ เชชเซเชฐเชเชพเชฐเชจเชพ NAT-เชเซเชฐเชพเชตเชฐเซเชธเชฒ เชเซเชฐเซเชเชจเซ เช เชฎเชฒ เชเชฐเชถเซ, เชคเซเชเชฒเชพ เชฒเชพเชเชฌเชพ เชธเชฎเชฏ เชธเซเชงเซ เชเชชเชฃเซ IPv4 เชเชจเซเชเชฐเชจเซเช เชชเชฐ เชฐเชนเซเชถเซเช, เชเซเชฎเชพเช เชฎเชจเชธเซเชตเซ เชเซเชฎเซเชชเซเชฏเซเชเชฐเซ เชตเชเซเชเซ เชธเชเชเชพเชฐเชจเซ เชจเชฟเชฐเชพเชถเชพเชเชจเช เชธเชเชญเชพเชตเชจเชพ เชเซ. เชคเชฎเซ เชเซเชฏเชพเช เชธเซเชงเซ เชเชฐเซ เช เชจเซ เชเชพเชฎ เชชเชฐ IPv6 เชจเชพ เช เชญเชพเชตเชจเซ เชธเชนเชจ เชเชฐเซ เชถเชเซ เชเซ?
เช เชฎเชพเชฐเซ เชชเชพเชธเซ เชซเซเชฐเซเชจเซเชก-เชเซ-เชซเซเชฐเซเชจเซเชก เชจเซเชเชตเชฐเซเช เชนเชถเซ: เชคเชฎเชพเชฎ เชธเชเชญเชตเชฟเชค เชเชจเซเชเชฐเชฒเซเชเซเชฏเซเชเชฐเซเชธ เช เชเชพเชเชฅเซ เชเชพเชฃเซเชคเชพ เชนเซเชตเชพ เชเซเชเช. เชธเซเชชเซเชฐเชฅเชฎ, เช เชฌเชงเซเช เชเซเชฌ เช เชธเชฐเชณ เชฌเชจเชพเชตเซ เชเซ: เช เชฎเซ เช เชฎเชพเชฐเซ เชเชพเชคเชจเซ เชชเชฐเชฟเชเชฏ เชเชชเซเชฏเซ, เชจเชพเชฎ/เชเซ เชถเซเชงเซ เชเซ เชจ เชฎเชณเซ, เชกเชฟเชธเซเชเชจเซเชเซเช เชเชฐเซเชฏเซเช เช เชฅเชตเชพ เชเชพเชฎ เชเชฐเชตเชพเชจเซเช เชเชพเชฒเซ เชฐเชพเชเซเชฏเซเช, เชเชจเซเชเชฐเชฒเซเชเซเชฏเซเชเชฐเชจเซ เชเชพเชฃเซเชจเซ. เชฌเซเชเซเช, เชธเชพเชฎเชพเชจเซเชฏ เชฐเซเชคเซ, เชคเซ เชธเซเชฐเชเซเชทเชฟเชค เชเซ เช เชจเซ เชเชฃเชพ เชนเซเชฎเชฒเชพเชเชจเซ เชฆเซเชฐ เชเชฐเซ เชเซ.
IM เชเชจเซเชเชฐเชซเซเชธ เชเซเชฒเชพเชธเชฟเช เชธเซเชฒเซเชฏเซเชถเชจเซเชธเชจเซ เชจเชเซเช เชนเชถเซ
- เชเชจเซเชเชฐเชฒเซเชเซเชฏเซเชเชฐเชจเซ เชฎเซเชเชฒเชตเชพเชฎเชพเช เชเชตเซเชฒเชพ เชธเชเชฆเซเชถเชพเช เชคเซเชฎเชพเช เชฐเซเชเซเชฐเซเชก เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ;
- เชเชเช - เชเชจเซเชเชฐเชฒเซเชเซเชฏเซเชเชฐ เชคเชฐเชซเชฅเซ เชฎเชณเซเชฒเชพ เชธเชเชฆเซเชถเชพเช เชคเซเชฎเชพเชเชฅเซ เชตเชพเชเชเชตเชพเชฎเชพเช เชเชตเซ เชเซ;
- เชฐเชพเชเซเชฏ - เชคเซเชฎเชพเชเชฅเซ เชตเชพเชเชเซเชจเซ, เช เชฎเซ เชถเซเชงเซ เชเชพเชขเซเช เชเซเช เชเซ เชเชจเซเชเชฐเชฒเซเชเซเชฏเซเชเชฐ เชนเชพเชฒเชฎเชพเช เชเซเชกเชพเชฏเซเชฒ เชเซ เชเซ เชเซเชฎ, เชเชจเซเชเซเชถเชจ เชธเชฐเชจเชพเชฎเซเช/เชชเซเชฐเซเช.
เชตเชงเซเชฎเชพเช, เชเช เชเซเชจ เชธเซเชเซเช เชฌเชจเชพเชตเชตเชพเชฎเชพเช เชเชตเซ เชเซ, เชนเซเชธเซเช เชชเซเชฐเซเช เชฒเชเซเชจเซ เชเซเชฎเชพเช เชเชชเชฃเซ เชฐเชฟเชฎเซเช เชเชจเซเชเชฐเชฒเซเชเซเชฏเซเชเชฐ เชธเชพเชฅเซ เชเชจเซเชเซเชถเชจ เชถเชฐเซ เชเชฐเซเช เชเซเช.
|-- alice
| |-- in
| |-- out
| `-- state
|-- bob
| |-- in
| |-- out
| `-- state
`- conn
เช เช
เชญเชฟเชเชฎ เชคเชฎเชจเซ IM เชเซเชฐเชพเชจเซเชธเชชเซเชฐเซเช เช
เชจเซ เชฏเซเชเชฐ เชเชจเซเชเชฐเชซเซเชธเชจเชพ เชธเซเชตเชคเชเชคเซเชฐ เช
เชฎเชฒเซเชเชฐเชฃเชจเซ เชฎเชเชเซเชฐเซ เชเชชเซ เชเซ, เชเชพเชฐเชฃ เชเซ เชคเซเชฏเชพเช เชเซเช เชฎเชฟเชคเซเชฐ เชจเชฅเซ, เชคเชฎเซ เชฆเชฐเซเชเชจเซ เชเซเชถ เชเชฐเซ เชถเชเชคเชพ เชจเชฅเซ. เชเชชเชฏเซเช เชเชฐเซเชจเซ
เชนเชเซเชเชคเชฎเชพเช, เชธเชเชฒเซเชธ เชชเซเชฐเซเชเซเชเซเชเซเชธ FIFO เชซเชพเชเชฒเซเชจเซ เชเชชเชฏเซเช เชเชฐเซ เชเซ. เช
เชเชเชค เชฐเซเชคเซ, เชนเซเช เชธเชฎเชเซ เชถเชเชคเซ เชจเชฅเซ เชเซ เชธเชฎเชฐเซเชชเชฟเชค เชฅเซเชฐเซเชกเซเชฎเชพเชเชฅเซ เชนเชพเชฅเชฅเซ เชฒเชเซเชฒเซ เชชเซเชทเซเช เชญเซเชฎเชฟ เชตเชฟเชจเชพ เชเชธเชฟเชจเซเชธเชฟเชฏเซเชฎเชพเช เชธเซเชชเชฐเซเชงเชพเชคเซเชฎเช เชฐเซเชคเซ เชซเชพเชเชฒเซ เชธเชพเชฅเซ เชเซเชตเซ เชฐเซเชคเซ เชเชพเชฎ เชเชฐเชตเซเช (เชนเซเช เชฒเชพเชเชฌเชพ เชธเชฎเชฏเชฅเซ เชเชตเซ เชตเชธเซเชคเซเช เชฎเชพเชเซ เชญเชพเชทเชพเชจเซ เชเชชเชฏเซเช เชเชฐเซเช เชเซเช.
เชฎเซเชณ เช เชธเซเชฐเชเซเชทเชฟเชค เชชเซเชฐเซเชเซเชเซเชฒ
TCP เชจเซ เชเชชเชฏเซเช เชชเชฐเชฟเชตเชนเชจ เชคเชฐเซเชเซ เชฅเชพเชฏ เชเซ: เชคเซ เชกเชฟเชฒเชฟเชตเชฐเซ เช
เชจเซ เชคเซเชจเชพ เชเชฐเซเชกเชฐเชจเซ เชเชพเชคเชฐเซ เชเชชเซ เชเซ. UDP เชฌเชพเชเชฏเชงเชฐเซ เชเชชเชคเซเช เชจเชฅเซ (เชเซ เชธเชเชเซเชคเชฒเชฟเชชเซเชจเซ เชเชชเชฏเซเช เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชคเซเชฏเชพเชฐเซ เชเชชเชฏเซเชเซ เชฅเชถเซ), เชชเชฐเชเชคเซ เชธเชฎเชฐเซเชฅเชจ เชเชชเซ เชเซ
เชเชฎเชจเชธเซเชฌเซ, TCP เชฎเชพเช เชธเชเชฆเซเชถเชจเซ เชเซเช เชเซเชฏเชพเชฒ เชจเชฅเซ, เชซเชเซเชค เชฌเชพเชเชเชจเซ เชชเซเชฐเชตเชพเชน เชเซ. เชคเซเชฅเซ, เชธเชเชฆเซเชถเชพเช เชฎเชพเชเซ เชเช เชซเซเชฐเซเชฎเซเช เชธเชพเชฅเซ เชเชตเชตเซเช เชเชฐเซเชฐเซ เชเซ เชเซเชฅเซ เชคเซเช เช เชฅเซเชฐเซเชกเชฎเชพเช เชเชเชฌเซเชเชพ เชธเชพเชฅเซ เชถเซเชฐ เชเชฐเซ เชถเชเชพเชฏ. เช
เชฎเซ เชฒเชพเชเชจ เชซเซเชก เช
เชเซเชทเชฐเชจเซ เชเชชเชฏเซเช เชเชฐเชตเชพ เชฎเชพเชเซ เชธเชเชฎเชค เชฅเช เชถเชเซเช เชเซเช. เชถเชฐเซเชเชค เชเชฐเชจเชพเชฐเชพเช เชฎเชพเชเซ เชคเซ เชธเชพเชฐเซเช เชเซ, เชชเชฐเชเชคเซ เชเชเชตเชพเชฐ เช
เชฎเซ เช
เชฎเชพเชฐเชพ เชธเชเชฆเซเชถเชพเชเชจเซ เชเชจเซเชเซเชฐเชฟเชชเซเช เชเชฐเชตเชพเชจเซเช เชถเชฐเซ เชเชฐเซ เชฆเชเช, เช เช
เชเซเชทเชฐ เชธเชพเชเชซเชฐ เชเซเชเซเชธเซเชเชฎเชพเช เชเชฎเซ เชคเซเชฏเชพเช เชฆเซเชเชพเช เชถเชเซ เชเซ. เชจเซเชเชตเชฐเซเชเซเชธเชฎเชพเช, เชคเซเชฅเซ, เชฒเซเชเชชเซเชฐเชฟเชฏ เชชเซเชฐเซเชเซเชเซเชฒ เชคเซ เชเซ เชเซ เชชเซเชฐเชฅเชฎ เชฌเชพเชเชเชฎเชพเช เชธเชเชฆเซเชถเชจเซ เชฒเชเชฌเชพเช เชฎเซเชเชฒเซ เชเซ. เชเชฆเชพเชนเชฐเชฃ เชคเชฐเซเชเซ, เชฌเซเชเซเชธเชจเซ เชฌเชนเชพเชฐ เชชเชพเชฏเชฅเซเชจเชฎเชพเช xdrlib เชเซ, เชเซ เชคเชฎเชจเซ เชธเชฎเชพเชจ เชซเซเชฐเซเชฎเซเช เชธเชพเชฅเซ เชเชพเชฎ เชเชฐเชตเชพเชจเซ เชฎเชเชเซเชฐเซ เชเชชเซ เชเซ.
เช เชฎเซ TCP เชตเชพเชเชเชจ เชธเชพเชฅเซ เชฏเซเชเซเชฏ เชฐเซเชคเซ เช เชจเซ เช เชธเชฐเชเชพเชฐเช เชฐเซเชคเซ เชเชพเชฎ เชเชฐเซเชถเซเช เชจเชนเซเช - เช เชฎเซ เชเซเชกเชจเซ เชธเชฐเชณ เชฌเชจเชพเชตเซเชถเซเช. เช เชฎเซ เชธเชเชชเซเชฐเซเชฃ เชธเชเชฆเซเชถเชจเซ เชกเซเชเซเชก เชจ เชเชฐเซเช เชคเซเชฏเชพเช เชธเซเชงเซ เช เชฎเซ เชธเซเชเซเชเชฎเชพเชเชฅเซ เชกเซเชเชพเชจเซ เช เชจเชเชค เชฒเซเชชเชฎเชพเช เชตเชพเชเชเซเช เชเซเช. XML เชธเชพเชฅเซ JSON เชจเซ เชเชชเชฏเซเช เช เช เชญเชฟเชเชฎ เชฎเชพเชเซ เชซเซเชฐเซเชฎเซเช เชคเชฐเซเชเซ เชชเชฃ เชฅเช เชถเชเซ เชเซ. เชชเชฐเชเชคเซ เชเซเชฏเชพเชฐเซ เชเซเชฐเชฟเชชเซเชเซเชเซเชฐเชพเชซเซ เชเชฎเซเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ, เชคเซเชฏเชพเชฐเซ เชกเซเชเชพ เชชเชฐ เชนเชธเซเชคเชพเชเซเชทเชฐเชฟเชค เช เชจเซ เชชเซเชฐเชฎเชพเชฃเซเชเชฐเชฃ เชเชฐเชตเซเช เชชเชกเชถเซ - เช เชจเซ เช เชฎเชพเชเซ เชเชฌเซเชเซเชเซเชเซเชธเชจเซ เชฌเชพเชเช-เชฌเชฆ-เชฌเชพเชเช เชธเชฎเชพเชจ เชฐเชเซเชเชคเชจเซ เชเชฐเซเชฐ เชชเชกเชถเซ, เชเซ JSON/XML เชชเซเชฐเชฆเชพเชจ เชเชฐเชคเซเช เชจเชฅเซ (เชกเชฎเซเชช เชชเชฐเชฟเชฃเชพเชฎเซ เช เชฒเช-เช เชฒเช เชนเซเช เชถเชเซ เชเซ).
XDR เช เชเชพเชฐเซเชฏ เชฎเชพเชเซ เชฏเซเชเซเชฏ เชเซ, เชเซ เชเซ เชนเซเช DER เชเชจเซเชเซเชกเชฟเชเช เชธเชพเชฅเซ ASN.1 เชชเชธเชเชฆ เชเชฐเซเช เชเซเช เช
เชจเซ
# Msg ::= CHOICE {
# text MsgText,
# handshake [0] EXPLICIT MsgHandshake }
class Msg(Choice):
schema = ((
("text", MsgText()),
("handshake", MsgHandshake(expl=tag_ctxc(0))),
))
# MsgText ::= SEQUENCE {
# text UTF8String (SIZE(1..MaxTextLen))}
class MsgText(Sequence):
schema = ((
("text", UTF8String(bounds=(1, MaxTextLen))),
))
# MsgHandshake ::= SEQUENCE {
# peerName UTF8String (SIZE(1..256)) }
class MsgHandshake(Sequence):
schema = ((
("peerName", UTF8String(bounds=(1, 256))),
))
เชชเซเชฐเชพเชชเซเชค เชฅเชฏเซเชฒ เชธเชเชฆเซเชถ Msg เชนเชถเซ: เชเชพเช เชคเซ เชเซเชเซเชธเซเช MsgText (เชนเชฎเชฃเชพเช เชฎเชพเชเซ เชเช เชเซเชเซเชธเซเช เชซเซเชฒเซเชก เชธเชพเชฅเซ) เช เชฅเชตเชพ MsgHandshake เชนเซเชจเซเชกเชถเซเช เชธเชเชฆเซเชถ (เชเซเชฎเชพเช เชเชจเซเชเชฐเชฒเซเชเซเชฏเซเชเชฐเชจเซเช เชจเชพเชฎ เชเซ). เชนเชตเซ เชคเซ เชตเชงเซ เชเชเชฟเชฒ เชฒเชพเชเซ เชเซ, เชชเชฐเชเชคเซ เช เชญเชตเชฟเชทเซเชฏ เชฎเชพเชเซเชจเซ เชชเชพเชฏเซ เชเซ.
โโโโโโโ โโโโโโโ โPeerAโ โPeerBโ โโโโฌโโโโ โโ IdA) โ โโโโโโโโโโ โโโโโโ โ โ MsgText() โ โโโโโ MsgText() โ โ โ
เชเซเชฐเชฟเชชเซเชเซเชเซเชฐเชพเชซเซ เชตเชฟเชจเชพ IM
เชฎเซเช เชชเชนเซเชฒเซเชฅเซ เช เชเชนเซเชฏเซเช เชคเซเชฎ, asyncio เชฒเชพเชเชฌเซเชฐเซเชฐเซเชจเซ เชเชชเชฏเซเช เชคเชฎเชพเชฎ เชธเซเชเซเช เชเชพเชฎเชเซเชฐเซ เชฎเชพเชเซ เชเชฐเชตเชพเชฎเชพเช เชเชตเชถเซ. เชเชพเชฒเซ เชเชพเชนเซเชฐเชพเชค เชเชฐเซเช เชเซ เช เชฎเซ เชฒเซเชจเซเช เชธเชฎเชฏเซ เชถเซเช เช เชชเซเชเซเชทเชพ เชฐเชพเชเซเช เชเซเช:
parser = argparse.ArgumentParser(description="GOSTIM")
parser.add_argument(
"--our-name",
required=True,
help="Our peer name",
)
parser.add_argument(
"--their-names",
required=True,
help="Their peer names, comma-separated",
)
parser.add_argument(
"--bind",
default="::1",
help="Address to listen on",
)
parser.add_argument(
"--port",
type=int,
default=6666,
help="Port to listen on",
)
args = parser.parse_args()
OUR_NAME = UTF8String(args.our_name)
THEIR_NAMES = set(args.their_names.split(","))
เชคเชฎเชพเชฐเซเช เชชเซเชคเชพเชจเซเช เชจเชพเชฎ เชธเซเช เชเชฐเซ (--เช เชฎเชพเชฐเซเช-เชจเชพเชฎ เชเชฒเชฟเชธ). เชฌเชงเชพ เช เชชเซเชเซเชทเชฟเชค เชเชจเซเชเชฐเชฒเซเชเซเชฏเซเชเชฐเซเชธเชจเซ เช เชฒเซเชชเชตเชฟเชฐเชพเชฎ เชฆเซเชตเชพเชฐเชพ เช เชฒเช เชเชฐเซเชจเซ เชธเซเชเชฟเชฌเชฆเซเชง เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ (โเชคเซเชฎเชจเชพ-เชจเชพเชฎ เชฌเซเชฌ, เชเชต). เชฆเชฐเซเช เชเชจเซเชเชฐเชฒเซเชเซเชฏเซเชเชฐเซเชธ เชฎเชพเชเซ, เชฏเซเชจเชฟเชเซเชธ เชธเซเชเซเชเซเชธ เชธเชพเชฅเซเชจเซ เชกเชฟเชฐเซเชเซเชเชฐเซ เชฌเชจเชพเชตเชตเชพเชฎเชพเช เชเชตเซ เชเซ, เชคเซเชฎเช เชฆเชฐเซเช เชเชจ, เชเชเช, เชธเซเชเซเช เชฎเชพเชเซ เชเซเชฐเซเชเซเชจ เชฌเชจเชพเชตเชตเชพเชฎเชพเช เชเชตเซ เชเซ:
for peer_name in THEIR_NAMES:
makedirs(peer_name, mode=0o700, exist_ok=True)
out_queue = asyncio.Queue()
OUT_QUEUES[peer_name] = out_queue
asyncio.ensure_future(asyncio.start_unix_server(
partial(unixsock_out_processor, out_queue=out_queue),
path.join(peer_name, "out"),
))
in_queue = asyncio.Queue()
IN_QUEUES[peer_name] = in_queue
asyncio.ensure_future(asyncio.start_unix_server(
partial(unixsock_in_processor, in_queue=in_queue),
path.join(peer_name, "in"),
))
asyncio.ensure_future(asyncio.start_unix_server(
partial(unixsock_state_processor, peer_name=peer_name),
path.join(peer_name, "state"),
))
asyncio.ensure_future(asyncio.start_unix_server(unixsock_conn_processor, "conn"))
เชเชจ เชธเซเชเซเชเชฎเชพเชเชฅเซ เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพ เชคเชฐเชซเชฅเซ เชเชตเชคเชพ เชธเชเชฆเซเชถเชพเช IN_QUEUES เชเชคเชพเชฐเชฎเชพเช เชฎเซเชเชฒเชตเชพเชฎเชพเช เชเชตเซ เชเซ:
async def unixsock_in_processor(reader, writer, in_queue: asyncio.Queue) -> None:
while True:
text = await reader.read(MaxTextLen)
if text == b"":
break
await in_queue.put(text.decode("utf-8"))
เชเชจเซเชเชฐเชฒเซเชเซเชฏเซเชเชฐเซเชธ เชคเชฐเชซเชฅเซ เชเชตเชคเชพ เชธเชเชฆเซเชถเชพเช OUT_QUEUES เชเชคเชพเชฐเซเชฎเชพเช เชฎเซเชเชฒเชตเชพเชฎเชพเช เชเชตเซ เชเซ, เชเซเชฎเชพเชเชฅเซ เชกเซเชเชพ เชเชเช เชธเซเชเซเช เชชเชฐ เชฒเชเชตเชพเชฎเชพเช เชเชตเซ เชเซ:
async def unixsock_out_processor(reader, writer, out_queue: asyncio.Queue) -> None:
while True:
text = await out_queue.get()
writer.write(("[%s] %s" % (datetime.now(), text)).encode("utf-8"))
await writer.drain()
เชธเซเชเซเช เชธเซเชเซเชเชฎเชพเชเชฅเซ เชตเชพเชเชเชคเซ เชตเชเชคเซ, เชชเซเชฐเซเชเซเชฐเชพเชฎ PEER_ALIVE เชถเชฌเซเชฆเชเซเชถเชฎเชพเช เชเชจเซเชเชฐเชฒเซเชเซเชฏเซเชเชฐเชจเซเช เชธเชฐเชจเชพเชฎเซเช เชถเซเชงเซ เชเซ. เชเซ เชนเชเซ เชธเซเชงเซ เชเชจเซเชเชฐเชฒเซเชเซเชฏเซเชเชฐ เชธเชพเชฅเซ เชเซเช เชเชจเซเชเซเชถเชจ เชจเชฅเซ, เชคเซ เชเชพเชฒเซ เชฒเชพเชเชจ เชฒเชเชตเชพเชฎเชพเช เชเชตเซ เชเซ.
async def unixsock_state_processor(reader, writer, peer_name: str) -> None:
peer_writer = PEER_ALIVES.get(peer_name)
writer.write(
b"" if peer_writer is None else (" ".join([
str(i) for i in peer_writer.get_extra_info("peername")[:2]
]).encode("utf-8") + b"n")
)
await writer.drain()
writer.close()
เชเซเชจ เชธเซเชเซเช เชชเชฐ เชธเชฐเชจเชพเชฎเซเช เชฒเชเชคเซ เชตเชเชคเซ, เชเชจเซเชเซเชถเชจ "เชชเซเชฐเชพเชฐเชเชญเชฟเช" เชเชพเชฐเซเชฏ เชถเชฐเซ เชฅเชพเชฏ เชเซ:
async def unixsock_conn_processor(reader, writer) -> None:
data = await reader.read(256)
writer.close()
host, port = data.decode("utf-8").split(" ")
await initiator(host=host, port=int(port))
เชเชพเชฒเซ เชเชฐเชเชญเชเชฐเซเชคเชพเชจเซ เชงเซเชฏเชพเชจเชฎเชพเช เชฒเชเช. เชชเซเชฐเชฅเชฎ เชคเซ เชธเซเชชเชทเซเชเชชเชฃเซ เชเชฒเซเชฒเซเชเชฟเชค เชนเซเชธเซเช/เชชเซเชฐเซเช เชธเชพเชฅเซ เชเชจเซเชเซเชถเชจ เชเซเชฒเซ เชเซ เช เชจเซ เชคเซเชจเชพ เชจเชพเชฎ เชธเชพเชฅเซ เชนเซเชจเซเชกเชถเซเช เชธเชเชฆเซเชถ เชฎเซเชเชฒเซ เชเซ:
130 async def initiator(host, port):
131 _id = repr((host, port))
132 logging.info("%s: dialing", _id)
133 reader, writer = await asyncio.open_connection(host, port)
134 # Handshake message {{{
135 writer.write(Msg(("handshake", MsgHandshake((
136 ("peerName", OUR_NAME),
137 )))).encode())
138 # }}}
139 await writer.drain()
เชชเชเซ, เชคเซ เชฐเชฟเชฎเซเช เชชเชพเชฐเซเชเซ เชคเชฐเชซเชฅเซ เชชเซเชฐเชคเชฟเชธเชพเชฆเชจเซ เชฐเชพเชน เชเซเช เชเซ. Msg ASN.1 เชธเซเชเซเชฎเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชเชตเชจเชพเชฐเชพ เชชเซเชฐเชคเชฟเชญเชพเชตเชจเซ เชกเซเชเซเชก เชเชฐเชตเชพเชจเซ เชชเซเชฐเชฏเชพเชธ เชเชฐเซ เชเซ. เช เชฎเซ เชงเชพเชฐเซเช เชเซเช เชเซ เชเชเซ เชธเชเชฆเซเชถ เชเช TCP เชธเซเชเชฎเซเชจเซเชเชฎเชพเช เชฎเซเชเชฒเชตเชพเชฎเชพเช เชเชตเชถเซ เช เชจเซ .read() เชเซเชฒ เชเชฐเชคเซ เชตเชเชคเซ เช เชฎเซ เชคเซเชจเซ เชชเชฐเชฎเชพเชฃเซ เชฐเซเชคเซ เชชเซเชฐเชพเชชเซเชค เชเชฐเซเชถเซเช. เช เชฎเซ เชคเชชเชพเชธเซเช เชเซเช เชเซ เช เชฎเชจเซ เชนเซเชจเซเชกเชถเซเช เชธเชเชฆเซเชถ เชฎเชณเซเชฏเซ เชเซ.
141 # Wait for Handshake message {{{
142 data = await reader.read(256)
143 if data == b"":
144 logging.warning("%s: no answer, disconnecting", _id)
145 writer.close()
146 return
147 try:
148 msg, _ = Msg().decode(data)
149 except ASN1Error:
150 logging.warning("%s: undecodable answer, disconnecting", _id)
151 writer.close()
152 return
153 logging.info("%s: got %s message", _id, msg.choice)
154 if msg.choice != "handshake":
155 logging.warning("%s: unexpected message, disconnecting", _id)
156 writer.close()
157 return
158 # }}}
เช เชฎเซ เชคเชชเชพเชธ เชเชฐเซเช เชเซเช เชเซ เชเชจเซเชเชฐเชฒเซเชเซเชฏเซเชเชฐเชจเซเช เชชเซเชฐเชพเชชเซเชค เชจเชพเชฎ เช เชฎเชจเซ เชเชพเชฃเซเชคเซเช เชเซ. เชเซ เชจเชนเซเช, เชคเซ เช เชฎเซ เชเซเชกเชพเชฃ เชคเซเชกเซ เชจเชพเชเซเช เชเซเช. เช เชฎเซ เชคเชชเชพเชธเซเช เชเซเช เชเซ เช เชฎเซ เชคเซเชจเซ เชธเชพเชฅเซ เชชเชนเซเชฒเซเชฅเซ เช เชเซเชกเชพเชฃ เชธเซเชฅเชพเชชเชฟเชค เชเชฐเซเชฏเซเช เชเซ (เชตเชพเชฐเซเชคเชพเชเชพเชฐเซ เชซเชฐเซเชฅเซ เช เชฎเชพเชฐเซ เชธเชพเชฅเซ เชเชจเซเชเซเช เชฅเชตเชพเชจเซ เชเชฆเซเชถ เชเชชเซเชฏเซ) เช เชจเซ เชคเซเชจเซ เชฌเชเชง เชเชฐเซ. IN_QUEUES เชเชคเชพเชฐ เชธเชเชฆเซเชถเชจเชพ เชเซเชเซเชธเซเช เชธเชพเชฅเซ เชชเชพเชฏเชฅเซเชจ เชธเซเชเซเชฐเซเชเช เชงเชฐเชพเชตเซ เชเซ, เชชเชฐเชเชคเซ เชคเซเชฎเชพเช None เชจเซเช เชตเชฟเชถเซเชท เชฎเซเชฒเซเชฏ เชเซ เชเซ msg_sender coroutine เชจเซ เชเชพเชฎ เชเชฐเชตเชพเชจเซเช เชฌเชเชง เชเชฐเชตเชพ เชฎเชพเชเซ เชธเชเชเซเชค เชเชชเซ เชเซ เชเซเชฅเซ เชคเซ เชฒเซเชเชธเซ TCP เชเชจเซเชเซเชถเชจ เชธเชพเชฅเซ เชธเชเชเชณเชพเชฏเซเชฒ เชคเซเชจเชพ เชฒเซเชเช เชตเชฟเชถเซ เชญเซเชฒเซ เชเชพเชฏ.
159 msg_handshake = msg.value
160 peer_name = str(msg_handshake["peerName"])
161 if peer_name not in THEIR_NAMES:
162 logging.warning("unknown peer name: %s", peer_name)
163 writer.close()
164 return
165 logging.info("%s: session established: %s", _id, peer_name)
166 # Run text message sender, initialize transport decoder {{{
167 peer_alive = PEER_ALIVES.pop(peer_name, None)
168 if peer_alive is not None:
169 peer_alive.close()
170 await IN_QUEUES[peer_name].put(None)
171 PEER_ALIVES[peer_name] = writer
172 asyncio.ensure_future(msg_sender(peer_name, writer))
173 # }}}
msg_sender เชเชเชเชเซเชเชเช เชธเชเชฆเซเชถเชพเช เชธเซเชตเซเชเชพเชฐเซ เชเซ (เชเช เชเชจ เชธเซเชเซเชเชฎเชพเชเชฅเซ เชเชคเชพเชฐเชฎเชพเช), เชคเซเชฎเชจเซ MsgText เชธเชเชฆเซเชถเชฎเชพเช เชถเซเชฐเซเชฃเซเชฌเชฆเซเชง เชเชฐเซ เชเซ เช เชจเซ TCP เชเชจเซเชเซเชถเชจ เชชเชฐ เชฎเซเชเชฒเซ เชเซ. เชคเซ เชเซเชเชชเชฃ เชเซเชทเชฃเซ เชคเซเชเซ เชถเชเซ เชเซ - เช เชฎเซ เชเชจเซ เชธเซเชชเชทเซเชเชชเชฃเซ เช เชเชเชพเชตเซเช เชเซเช.
async def msg_sender(peer_name: str, writer) -> None:
in_queue = IN_QUEUES[peer_name]
while True:
text = await in_queue.get()
if text is None:
break
writer.write(Msg(("text", MsgText((
("text", UTF8String(text)),
)))).encode())
try:
await writer.drain()
except ConnectionResetError:
del PEER_ALIVES[peer_name]
return
logging.info("%s: sent %d characters message", peer_name, len(text))
เช เชเชคเซ, เชเชฐเชเชญเชเชฐเซเชคเชพ เชธเซเชเซเชเชฎเชพเชเชฅเซ เชธเชเชฆเซเชถเชพเช เชตเชพเชเชเชตเชพเชจเชพ เช เชจเชเชค เชฒเซเชชเชฎเชพเช เชชเซเชฐเชตเซเชถ เชเชฐเซ เชเซ. เช เชธเชเชฆเซเชถเชพเช เชเซเชเซเชธเซเช เชธเชเชฆเซเชถเชพเช เชเซ เชเซ เชเซเชฎ เชคเซ เชคเชชเชพเชธเซ เชเซ เช เชจเซ เชคเซเชฎเชจเซ OUT_QUEUES เชเชคเชพเชฐเชฎเชพเช เชฎเซเชเซ เชเซ, เชเซเชฏเชพเชเชฅเซ เชคเซ เชธเชเชฌเชเชงเชฟเชค เชเชจเซเชเชฐเชฒเซเชเซเชฏเซเชเชฐเชจเชพ เชเชเช เชธเซเชเซเช เชชเชฐ เชฎเซเชเชฒเชตเชพเชฎเชพเช เชเชตเชถเซ. เชถเชพ เชฎเชพเชเซ เชคเชฎเซ เชซเชเซเชค .read() เชเชฐเซ เชถเชเชคเชพ เชจเชฅเซ เช เชจเซ เชธเชเชฆเซเชถเชจเซ เชกเซเชเซเชก เชเชฐเซ เชถเชเชคเชพ เชจเชฅเซ? เชเชพเชฐเชฃ เชเซ เชคเซ เชถเชเซเชฏ เชเซ เชเซ เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพเชจเชพ เชเชฃเชพ เชธเชเชฆเซเชถเชพเช เชเชชเชฐเซเชเชฟเชเช เชธเชฟเชธเซเชเชฎ เชฌเชซเชฐเชฎเชพเช เชเชเชคเซเชฐ เชเชฐเชตเชพเชฎเชพเช เชเชตเชถเซ เช เชจเซ เชเช TCP เชธเซเชเชฎเซเชจเซเชเชฎเชพเช เชฎเซเชเชฒเชตเชพเชฎเชพเช เชเชตเชถเซ. เช เชฎเซ เชชเซเชฐเชฅเชฎ เชกเซเชเซเชก เชเชฐเซ เชถเชเซเช เชเซเช, เช เชจเซ เชชเชเซเชจเชพ เชญเชพเชเชจเซ เชญเชพเช เชฌเชซเชฐเชฎเชพเช เชฐเชนเซ เชถเชเซ เชเซ. เชเซเชเชชเชฃ เช เชธเชพเชฎเชพเชจเซเชฏ เชชเชฐเชฟเชธเซเชฅเชฟเชคเชฟเชจเชพ เชเชฟเชธเซเชธเชพเชฎเชพเช, เช เชฎเซ TCP เชเชจเซเชเซเชถเชจ เชฌเชเชง เชเชฐเซเช เชเซเช เช เชจเซ msg_sender coroutine (OUT_QUEUES เชเชคเชพเชฐเชฎเชพเช None เชฎเซเชเชฒเซเชจเซ) เชฌเชเชง เชเชฐเซเช เชเซเช.
174 buf = b""
175 # Wait for test messages {{{
176 while True:
177 data = await reader.read(MaxMsgLen)
178 if data == b"":
179 break
180 buf += data
181 if len(buf) > MaxMsgLen:
182 logging.warning("%s: max buffer size exceeded", _id)
183 break
184 try:
185 msg, tail = Msg().decode(buf)
186 except ASN1Error:
187 continue
188 buf = tail
189 if msg.choice != "text":
190 logging.warning("%s: unexpected %s message", _id, msg.choice)
191 break
192 try:
193 await msg_receiver(msg.value, peer_name)
194 except ValueError as err:
195 logging.warning("%s: %s", err)
196 break
197 # }}}
198 logging.info("%s: disconnecting: %s", _id, peer_name)
199 IN_QUEUES[peer_name].put(None)
200 writer.close()
66 async def msg_receiver(msg_text: MsgText, peer_name: str) -> None:
67 text = str(msg_text["text"])
68 logging.info("%s: received %d characters message", peer_name, len(text))
69 await OUT_QUEUES[peer_name].put(text)
เชเชพเชฒเซ เชฎเซเชเซเชฏ เชเซเชก เชชเชฐ เชชเชพเชเชพ เชซเชฐเซเช. เชชเซเชฐเซเชเซเชฐเชพเชฎ เชถเชฐเซ เชฅเชพเชฏ เชคเซ เชธเชฎเชฏเซ เชคเชฎเชพเชฎ เชเซเชฐเซเชเซเชจ เชฌเชจเชพเชตเซเชฏเชพ เชชเชเซ, เช เชฎเซ TCP เชธเชฐเซเชตเชฐ เชถเชฐเซ เชเชฐเซเช เชเซเช. เชฆเชฐเซเช เชธเซเชฅเชพเชชเชฟเชค เชเชจเซเชเซเชถเชจ เชฎเชพเชเซ, เชคเซ เชชเซเชฐเชคเชฟเชญเชพเชต เชเชชเชจเชพเชฐ เชเซเชฐเซเชเซเชจ เชฌเชจเชพเชตเซ เชเซ.
logging.basicConfig(
level=logging.INFO,
format="%(levelname)s %(asctime)s: %(funcName)s: %(message)s",
)
loop = asyncio.get_event_loop()
server = loop.run_until_complete(asyncio.start_server(responder, args.bind, args.port))
logging.info("Listening on: %s", server.sockets[0].getsockname())
loop.run_forever()
เชชเซเชฐเชคเชฟเชธเชพเชฆ เชเชชเชจเชพเชฐ เชถเชฐเซเชเชคเชเชฐเซเชคเชพ เชเซเชตเซ เช เชเซ เช เชจเซ เชฌเชงเซ เช เชเซเชฐเชฟเชฏเชพเชเชจเซ เชชเซเชฐเชคเชฟเชฌเชฟเชเชฌเชฟเชค เชเชฐเซ เชเซ, เชชเชฐเชเชคเซ เชธเชฐเชณเชคเชพ เชฎเชพเชเซ, เชธเชเชฆเซเชถเชพเช เชตเชพเชเชเชตเชพเชจเซเช เช เชจเชเชค เชฒเซเชช เชคเชฐเชค เช เชถเชฐเซ เชฅเชพเชฏ เชเซ. เชนเชพเชฒเชฎเชพเช, เชนเซเชจเซเชกเชถเซเช เชชเซเชฐเซเชเซเชเซเชฒ เชฆเชฐเซเช เชฌเชพเชเซเชฅเซ เชเช เชธเชเชฆเซเชถ เชฎเซเชเชฒเซ เชเซ, เชชเชฐเชเชคเซ เชญเชตเชฟเชทเซเชฏเชฎเชพเช เชเชจเซเชเซเชถเชจ เชเชฐเชเชญเชเชฐเซเชคเชพ เชคเชฐเชซเชฅเซ เชฌเซ เชนเชถเซ, เชเซเชจเชพ เชชเชเซ เชคเชฐเชค เช เชเซเชเซเชธเซเช เชธเชเชฆเซเชถเชพ เชฎเซเชเชฒเซ เชถเชเชพเชฏ เชเซ.
72 async def responder(reader, writer):
73 _id = writer.get_extra_info("peername")
74 logging.info("%s: connected", _id)
75 buf = b""
76 msg_expected = "handshake"
77 peer_name = None
78 while True:
79 # Read until we get Msg message {{{
80 data = await reader.read(MaxMsgLen)
81 if data == b"":
82 logging.info("%s: closed connection", _id)
83 break
84 buf += data
85 if len(buf) > MaxMsgLen:
86 logging.warning("%s: max buffer size exceeded", _id)
87 break
88 try:
89 msg, tail = Msg().decode(buf)
90 except ASN1Error:
91 continue
92 buf = tail
93 # }}}
94 if msg.choice != msg_expected:
95 logging.warning("%s: unexpected %s message", _id, msg.choice)
96 break
97 if msg_expected == "text":
98 try:
99 await msg_receiver(msg.value, peer_name)
100 except ValueError as err:
101 logging.warning("%s: %s", err)
102 break
103 # Process Handshake message {{{
104 elif msg_expected == "handshake":
105 logging.info("%s: got %s message", _id, msg_expected)
106 msg_handshake = msg.value
107 peer_name = str(msg_handshake["peerName"])
108 if peer_name not in THEIR_NAMES:
109 logging.warning("unknown peer name: %s", peer_name)
110 break
111 writer.write(Msg(("handshake", MsgHandshake((
112 ("peerName", OUR_NAME),
113 )))).encode())
114 await writer.drain()
115 logging.info("%s: session established: %s", _id, peer_name)
116 peer_alive = PEER_ALIVES.pop(peer_name, None)
117 if peer_alive is not None:
118 peer_alive.close()
119 await IN_QUEUES[peer_name].put(None)
120 PEER_ALIVES[peer_name] = writer
121 asyncio.ensure_future(msg_sender(peer_name, writer))
122 msg_expected = "text"
123 # }}}
124 logging.info("%s: disconnecting", _id)
125 if msg_expected == "text":
126 IN_QUEUES[peer_name].put(None)
127 writer.close()
เชธเซเชฐเชเซเชทเชฟเชค เชชเซเชฐเซเชเซเชเซเชฒ
เช เชฎเชพเชฐเชพ เชธเชเชเชพเชฐเชจเซ เชธเซเชฐเชเซเชทเชฟเชค เชเชฐเชตเชพเชจเซ เช เชธเชฎเชฏ เชเซ. เชธเซเชฐเชเซเชทเชพเชจเซ เช เชฎเชพเชฐเซ เช เชฐเซเชฅ เชถเซเช เชเซ เช เชจเซ เช เชฎเชจเซ เชถเซเช เชเซเชเช เชเซ:
- เชชเซเชฐเชธเชพเชฐเชฟเชค เชธเชเชฆเซเชถเชพเชเชจเซ เชเซเชชเซเชคเชคเชพ;
- เชชเซเชฐเชธเชพเชฐเชฟเชค เชธเชเชฆเซเชถเชพเชเชจเซ เช เชงเชฟเชเซเชคเชคเชพ เช เชจเซ เช เชเชเชกเชฟเชคเชคเชพ - เชคเซเชฎเชจเชพ เชซเซเชฐเชซเชพเชฐเซ เชถเซเชงเชตเชพเชฎเชพเช เชเชตเชถเซเชฏเช เชเซ;
- เชฐเซเชชเซเชฒเซ เชนเซเชฎเชฒเชพ เชธเชพเชฎเซ เชฐเชเซเชทเชฃ - เชเซเชฎ เชฅเชฏเซเชฒ เช เชฅเชตเชพ เชชเซเชจเชฐเชพเชตเชฐเซเชคเชฟเชค เชธเชเชฆเซเชถเชพเชเชจเซ เชนเชเซเชเชค เชถเซเชงเชตเซ เชเชตเชถเซเชฏเช เชเซ (เช เชจเซ เช เชฎเซ เชเชจเซเชเซเชถเชจ เชธเชฎเชพเชชเซเชค เชเชฐเชตเชพเชจเซเช เชจเชเซเชเซ เชเชฐเซเช เชเซเช);
- เชชเซเชฐเซเชต-เชฆเชพเชเชฒ เชเชฐเซเชฒ เชธเชพเชฐเซเชตเชเชจเชฟเช เชเซเชเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชเชจเซเชเชฐเชฒเซเชเซเชฏเซเชเชฐเซเชธเชจเซ เชเชณเช เช เชจเซ เชชเซเชฐเชฎเชพเชฃเซเชเชฐเชฃ - เช เชฎเซ เชชเชนเซเชฒเชพเชฅเซ เช เชจเชเซเชเซ เชเชฐเซเชฏเซเช เชเซ เชเซ เช เชฎเซ เชฎเชฟเชคเซเชฐ-เชฅเซ-เชฎเชฟเชคเซเชฐ เชจเซเชเชตเชฐเซเช เชฌเชจเชพเชตเซ เชฐเชนเซเชฏเชพ เชเซเช. เชชเซเชฐเชฎเชพเชฃเซเชเชฐเชฃ เชชเชเซ เช เชเชชเชฃเซ เชธเชฎเชเซ เชถเชเซเชถเซเช เชเซ เชเชชเชฃเซ เชเซเชจเซ เชธเชพเชฅเซ เชตเชพเชคเชเซเชค เชเชฐเซ เชฐเชนเซเชฏเชพ เชเซเช;
- เชชเซเชฐเชพเชชเซเชฏเชคเชพ
เชธเชเชชเซเชฐเซเชฃ เชซเซเชฐเชตเชฐเซเชก เชเซเชชเซเชคเชคเชพ เชชเซเชฐเซเชชเชฐเซเชเซเช (PFS) - เช เชฎเชพเชฐเซ เชฒเชพเชเชฌเชพ เชธเชฎเชฏเชฅเซ เชเชพเชฒเชคเซ เชธเชพเชเชจเชฟเชเช เชเซ เชธเชพเชฅเซ เชเซเชกเชพ เชเชฐเชตเชพเชฅเซ เช เชเชพเชเชจเชพ เชคเชฎเชพเชฎ เชชเชคเซเชฐเชตเซเชฏเชตเชนเชพเชฐ เชตเชพเชเชเชตเชพเชจเซ เชเซเชทเชฎเชคเชพ เชจ เชนเซเชตเซ เชเซเชเช. เชฐเซเชเซเชฐเซเชกเชฟเชเช เช เชเชเชพเชตเชพเชฏเซเชฒ เชเซเชฐเชพเชซเชฟเช เชจเชเชพเชฎเซเช เชฌเชจเซ เชเชพเชฏ เชเซ; - เชฎเชพเชคเซเชฐ เชเช TCP เชธเชคเซเชฐเชฎเชพเช เชธเชเชฆเซเชถเชพเชเชจเซ เชฎเชพเชจเซเชฏเชคเชพ/เชฎเชพเชจเซเชฏเชคเชพ (เชชเชฐเชฟเชตเชนเชจ เช เชจเซ เชนเซเชจเซเชกเชถเซเช). เชฌเซเชเชพ เชธเชคเซเชฐเชฎเชพเชเชฅเซ เชฏเซเชเซเชฏ เชฐเซเชคเซ เชนเชธเซเชคเชพเชเซเชทเชฐเชฟเชค/เชชเซเชฐเชฎเชพเชฃเชฟเชค เชธเชเชฆเซเชถเชพเช เชฆเชพเชเชฒ เชเชฐเชตเชพ (เชธเชฎเชพเชจ เชเชจเซเชเชฐเชฒเซเชเซเชฏเซเชเชฐ เชธเชพเชฅเซ เชชเชฃ) เชถเชเซเชฏ เชจ เชนเซเชตเชพ เชเซเชเช;
- เชจเชฟเชทเซเชเซเชฐเชฟเชฏ เชจเชฟเชฐเซเชเซเชทเชเซ เชเซเชฏเชพเช เชคเซ เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพ เชเชณเชเชเชฐเซเชคเชพเช, เชฒเชพเชเชฌเชพ เชธเชฎเชฏเชฅเซ เชชเซเชฐเชธเชพเชฐเชฟเชค เชเชพเชนเซเชฐ เชเซ, เช เชฅเชตเชพ เชคเซเชฎเชพเชเชฅเซ เชนเซเชถ เชเซเชตเซ เชเซเชเช เชจเชนเซเช. เชจเชฟเชทเซเชเซเชฐเชฟเชฏ เชจเชฟเชฐเซเชเซเชทเช เชคเชฐเชซเชฅเซ เชเซเชเซเชเชธ เช เชจเชพเชฎเซ.
เชเชถเซเชเชฐเซเชฏเชเชจเช เชฐเซเชคเซ, เชฒเชเชญเช เชฆเชฐเซเช เชเชฃ เชเซเชเชชเชฃ เชนเซเชจเซเชกเชถเซเช เชชเซเชฐเซเชเซเชเซเชฒเชฎเชพเช เช เชจเซเชฏเซเชจเชคเชฎ เชฐเชพเชเชตเชพ เชฎเชพเชเชเซ เชเซ, เช
เชจเซ เชเชชเชฐเซเชเซเชคเชฎเชพเชเชฅเซ เชฌเชนเซ เชเชเชพ "เชตเชคเชจ" เชชเซเชฐเซเชเซเชเซเชฒ เชฎเชพเชเซ เชเชเชฐเซ เชฎเชณเซเชฏเชพ เชเซ. เชนเชตเซ เช
เชฎเซ เชเชเชเชชเชฃ เชจเชตเซเช เชถเซเชงเซเชถเซเช เชจเชนเซเช. เชนเซเช เชเซเชเซเชเชธเชชเชฃเซ เชเชชเชฏเซเช เชเชฐเชตเชพเชจเซ เชญเชฒเชพเชฎเชฃ เชเชฐเซเชถ
เชฌเซ เชธเซเชฅเซ เชฒเซเชเชชเซเชฐเชฟเชฏ เชชเซเชฐเซเชเซเชเซเชฒ เชเซ:
TLS - เชฌเชเซเชธ, เชเซ เชฎเซเชฌเซเชธ, เชจเชฌเชณเชพเชเช, เชจเชฌเชณเชพ เชตเชฟเชเชพเชฐ, เชเชเชฟเชฒเชคเชพ เช เชจเซ เชเชพเชฎเซเชเชจเซ เชฒเชพเชเชฌเซ เชเชคเชฟเชนเชพเชธ เชงเชฐเชพเชตเชคเซ เชเซเชฌ เช เชเชเชฟเชฒ เชชเซเชฐเซเชเซเชเซเชฒ (เชเซ เชเซ, เชเชจเซ TLS 1.3 เชธเชพเชฅเซ เชฌเชนเซ เชเชเซ เชธเชเชฌเชเชง เชเซ). เชชเชฐเชเชคเซ เช เชฎเซ เชคเซเชจเซ เชงเซเชฏเชพเชจเชฎเชพเช เชฒเซเชคเชพ เชจเชฅเซ เชเชพเชฐเชฃ เชเซ เชคเซ เชตเชงเซ เชเชเชฟเชฒ เชเซ.-
IPsec ัเชเชเชเซเช โ เชเชเชญเซเชฐ เชเซเชฐเชฟเชชเซเชเซเชเซเชฐเชพเชซเชฟเช เชธเชฎเชธเซเชฏเชพเช เชจเชฅเซ, เชเซ เชเซ เชคเซ เชธเชฐเชณ เชชเชฃ เชจเชฅเซ. เชเซ เชคเชฎเซ IKEv1 เช เชจเซ IKEv2 เชตเชฟเชถเซ เชตเชพเชเชเซ เชเซ, เชคเซ เชคเซเชฎเชจเซ เชธเซเชคเซเชฐเซเชค เชเซเชเชธเชเซเชเชธ , ISO/IEC IS 9798-3 เช เชจเซ SIGMA (SIGn-and-MAc) เชชเซเชฐเซเชเซเชเซเชฒ - เชเช เชธเชพเชเชเซ เช เชฎเชฒ เชเชฐเชตเชพ เชฎเชพเชเซ เชชเซเชฐเชคเชพ เชธเชฐเชณ.
STS/ISO เชชเซเชฐเซเชเซเชเซเชฒเชจเชพ เชตเชฟเชเชพเชธเชฎเชพเช เชจเชตเซเชจเชคเชฎ เชเชกเซ เชคเชฐเซเชเซ SIGMA เชตเชฟเชถเซ เชถเซเช เชธเชพเชฐเซเช เชเซ? เชคเซ เช เชฎเชพเชฐเซ เชฌเชงเซ เชเชตเชถเซเชฏเชเชคเชพเชเชจเซ เชชเซเชฐเซเชฃ เชเชฐเซ เชเซ ("เชเซเชชเชพเชตเชตเชพ" เชเชจเซเชเชฐเชฒเซเชเซเชฏเซเชเชฐ เชเชณเชเชเชฐเซเชคเชพเช เชธเชนเชฟเชค) เช เชจเซ เชคเซเชฎเชพเช เชเซเช เชเชพเชฃเซเชคเซ เชเซเชฐเชฟเชชเซเชเซเชเซเชฐเชพเชซเชฟเช เชธเชฎเชธเซเชฏเชพเช เชจเชฅเซ. เชคเซ เชจเซเชฏเซเชจเชคเชฎ เชเซ - เชชเซเชฐเซเชเซเชเซเชฒ เชธเชเชฆเซเชถเชฎเชพเชเชฅเซ เชเชเชพเชฎเชพเช เชเชเชพ เชเช เชเชเชเชจเซ เชฆเซเชฐ เชเชฐเชตเชพเชฅเซ เชคเซเชจเซ เช เชธเซเชฐเชเซเชทเชพ เชคเชฐเชซ เชฆเซเชฐเซ เชเชถเซ.
เชเชพเชฒเซ เชธเซเชฅเซ เชธเชฐเชณ เชเชฐเซเชฒเซ เชชเซเชฐเซเชเซเชเซเชฒเชฅเซ SIGMA เชชเชฐ เชเชเช. เช
เชฎเชจเซ เชฐเชธ เชเซ เชคเซ เชธเซเชฅเซ เชฎเซเชณเชญเซเชค เชเชพเชฎเชเซเชฐเซ เชเซ
โโโโโโ โ โโโโโโโโโโโ โโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโ>โ โPrvA(PrvA), โ โโโโโโโโโ โโโโโโโโโโโโ โ IdB, PubB โ โโโโโโโโโโโโโโโโโโโโโโโโโโ โ<โโโโโโโโโ โโโโโโโ โPrvB, PubB = DHgen()โ โ โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โโโโ โโโโโ โโโโงโโโโโโโโโโโโโ โ โKey = DH(PrvA, PubB)โ <โโโโ <โโโโโโโโโโโโโโโโโโโโโโ โโโโโโโ โโโโโ โ โ โ โ
เชเซเชเชชเชฃ เชฎเชงเซเชฏเชฎเชพเช เชเซเชฆเซ เชถเชเซ เชเซ เช เชจเซ เชธเชพเชฐเซเชตเชเชจเชฟเช เชเซเชจเซ เชคเซเชฎเชจเซ เชชเซเชคเชพเชจเซ เชธเชพเชฅเซ เชฌเชฆเชฒเซ เชถเชเซ เชเซ - เช เชชเซเชฐเซเชเซเชเซเชฒเชฎเชพเช เชเชจเซเชเชฐเชฒเซเชเซเชฏเซเชเชฐเซเชธเชจเซเช เชเซเช เชชเซเชฐเชฎเชพเชฃเซเชเชฐเชฃ เชจเชฅเซ. เชเชพเชฒเซ เชฒเชพเชเชฌเชพ เชเชพเชณเชพเชจเซ เชเชพเชตเซเช เชธเชพเชฅเซ เชธเชนเซ เชเชฎเซเชฐเซเช.
โโโโโโโ โโโโโโโ โPeerAโ โPeerBโ โโโโฌโAโโ โโ เชเชฟเชนเซเชจ(SignPrvA, (PubA)) โ โโ โโโโโโโโโโโโโ โโโโโโโโโโ โโโAign ubA = เชฒเซเชก()โ โ โ โPrvA, PubA = DHgen() โ โ โ โโโโโโโโ โโโโโโโ โโโโโโโโโโโโโโโโโโโโ , เชเชฟเชนเซเชจ (PrvB, (PubB)) โ โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโ โโโโโโโโโโโโโ โโโ โSignPrvB, SignPubB = load( )โ โ โ โPrvB, PubB = DH โโโโโโโโโ โโโโโโโโโโโโโโ โโโ โโโโโ โ โโโโโโโโโโโโโโโ โโโโโโ โ โ โเชเชเชพเชธเซ( SignPubB, ...)โ โ <โโโโ โKey = DH(Pr vA, PubB) โ โ โ โโโโโโโโโโโโโโโโโโโโโโโโโ โโ โ โ โ
เชเชตเชพ เชนเชธเซเชคเชพเชเซเชทเชฐ เชเชพเชฎ เชเชฐเชถเซ เชจเชนเซเช, เชเชพเชฐเชฃ เชเซ เชคเซ เชเซเชเซเชเชธ เชธเชคเซเชฐ เชธเชพเชฅเซ เชเซเชกเชพเชฏเซเชฒ เชจเชฅเซ. เชเชตเชพ เชธเชเชฆเซเชถเชพเช เช เชจเซเชฏ เชธเชนเชญเชพเชเซเช เชธเชพเชฅเซเชจเชพ เชธเชคเซเชฐเซ เชฎเชพเชเซ เชชเชฃ "เชฏเซเชเซเชฏ" เชเซ. เชธเชฎเชเซเชฐ เชธเชเชฆเชฐเซเชญเซ เชธเชฌเซเชธเซเชเซเชฐเชพเชเชฌ เชเชฐเชตเซเช เชเชตเชถเซเชฏเช เชเซ. เช เช เชฎเชจเซ A เชคเชฐเชซเชฅเซ เชฌเซเชเซ เชธเชเชฆเซเชถ เชเชฎเซเชฐเชตเชพเชจเซ เชซเชฐเช เชชเชพเชกเซ เชเซ.
เชตเชงเซเชฎเชพเช, เชธเชนเซ เชนเซเช เชณ เชคเชฎเชพเชฐเชพ เชชเซเชคเชพเชจเชพ เชเชณเชเชเชฐเซเชคเชพเชจเซ เชเชฎเซเชฐเชตเซเช เชฎเชนเชคเซเชตเชชเซเชฐเซเชฃ เชเซ, เชเชพเชฐเชฃ เชเซ เช
เชจเซเชฏเชฅเชพ เช
เชฎเซ IdXXX เชจเซ เชฌเชฆเชฒเซ เชถเชเซเช เชเซเช เช
เชจเซ เช
เชจเซเชฏ เชเชพเชฃเซเชคเชพ เชเชจเซเชเชฐเชฒเซเชเซเชฏเซเชเชฐเชจเซ เชเซ เชตเชกเซ เชธเชเชฆเซเชถ เชชเชฐ เชซเชฐเซเชฅเซ เชธเชนเซ เชเชฐเซ เชถเชเซเช เชเซเช. เช
เชเชเชพเชตเชตเชพ
โโโโโโ โ โโโโโโโโโโโ โโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโ - โ โโโโโโโ โโโโโโโโโโโโโโโโ โIdB, PubB, เชเชฟเชนเซเชจ(SignPrvB, (IdB, PubA, PubB)) โ โโโโโโโโโโโโโ โโโโโ โโโโโโโโโโโโโ โ<โโโโโโโโโโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโ โโโโโโโโโโ โSignPrvB, SignPubB = load()โ โ โ โPrvB, PubB = DHgen() โ โ โ โ โ โ โ โ โ โโโโโโโโโ โโโโโโโโโโโ โ เชเชฟเชนเซเชจ(SignPrvA, (IdA, PubB, PubA)) โ โโโโโโโโโโโโโโโโโโโโโโ โโโโโ โโ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โโโ>โ โเชเชเชพเชธเซ(SignPubB, ...) โ โ โ โkey = dh (prva, PUBB) โ โ โ โ
เชเซ เชเซ, เช เชฎเซ เชนเชเซ เชชเชฃ "เชธเชพเชฌเชฟเชค" เชจเชฅเซ เชเชฐเซเชฏเซเช เชเซ เช เชฎเซ เช เชธเชคเซเชฐ เชฎเชพเชเซ เชธเชฎเชพเชจ เชถเซเชฐ เชเชฐเซเชฒเซ เชเซ เชเชจเชฐเซเช เชเชฐเซ เชเซ. เชธเซเชฆเซเชงเชพเชเชคเชฟเช เชฐเซเชคเซ, เช เชฎเซ เช เชชเชเชฒเชพ เชตเชฟเชจเชพ เชเชฐเซ เชถเชเซเช เชเซเช - เชชเซเชฐเชฅเชฎ เชชเชฐเชฟเชตเชนเชจ เชเชจเซเชเซเชถเชจ เช เชฎเชพเชจเซเชฏ เชนเชถเซ, เชชเชฐเชเชคเซ เช เชฎเซ เชเชเซเชเซเช เชเซเช เชเซ เชเซเชฏเชพเชฐเซ เชนเซเชจเซเชกเชถเซเช เชชเซเชฐเซเชฃ เชฅเชพเชฏ, เชคเซเชฏเชพเชฐเซ เช เชฎเซ เชเชพเชคเชฐเซ เชเชฐเซเชถเซเช เชเซ เชฌเชงเซเช เชเชฐเซเชเชฐ เชธเชเชฎเชค เชเซ. เช เชคเซเชฏเชพเชฐเซ เช เชฎเชพเชฐเซ เชชเชพเชธเซ ISO/IEC IS 9798-3 เชชเซเชฐเซเชเซเชเซเชฒ เชเซ.
เช เชฎเซ เชเชจเชฐเซเช เชเชฐเซเชฒเซ เชเซ เชชเชฐ เช เชธเชนเซ เชเชฐเซ เชถเชเซเช เชเซเช. เช เชเชคเชฐเชจเชพเช เชเซ, เชเชพเชฐเชฃ เชเซ เชธเชเชญเชต เชเซ เชเซ เชเชชเชฏเซเชเชฎเชพเช เชฒเซเชตเชพเชคเชพ เชนเชธเซเชคเชพเชเซเชทเชฐ เช เชฒเซเชเซเชฐเชฟเชงเชฎเชฎเชพเช เชฒเซเช เชฅเช เชถเชเซ เชเซ (เชฌเชฟเชเซเชธ-เชชเซเชฐเชคเชฟ-เชธเชฟเชเซเชจเซเชเชฐ เชนเซเชตเชพ เชเชคเชพเช, เชชเชฐเชเชคเซ เชนเชเซ เชชเชฃ เชฒเซเช เชฅเชพเชฏ เชเซ). เชตเซเชฏเซเชคเซเชชเชจเซเชจ เชเซเชจเชพ เชนเซเชถ เชชเชฐ เชธเชนเซ เชเชฐเชตเซ เชถเชเซเชฏ เชเซ, เชชเชฐเชเชคเซ เชตเซเชฏเซเชคเซเชชเชจเซเชจ เชเซเชจเชพ เชนเซเชถเชจเซ เชฒเซเช เชเชฐเชตเซเช เชชเชฃ เชตเซเชฏเซเชคเซเชชเชจเซเชจ เชเชพเชฐเซเชฏ เชชเชฐเชจเชพ เชฌเซเชฐเซเช-เชซเซเชฐเซเชธ เชนเซเชฎเชฒเชพเชฎเชพเช เชฎเซเชฒเซเชฏเชตเชพเชจ เชนเซเช เชถเชเซ เชเซ. SIGMA MAC เชซเชเชเซเชถเชจเชจเซ เชเชชเชฏเซเช เชเชฐเซ เชเซ เชเซ เชชเซเชฐเซเชทเช ID เชจเซ เชชเซเชฐเชฎเชพเชฃเชฟเชค เชเชฐเซ เชเซ.
โโโโโโ โ โโโโโโโโโโโ โโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโ โโโโโโโโโโโโโโโโโโ>โ โSignPrvA, SignPubA = load()โ โ โ โPrv()โ โ โ โ Prv โ โโโโโโโ โ- โโโ โ<โโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโ โโโโโโโโโโ โโ โSignPrvB, SignPubB = load()โ โ โ โPrvB, PubB = DHgen() โ โ โ โโโโโโโโโโโโโโโโโโโ โโโโโโโโโ - โ โ เชเซ = DH( PrvA, PubB) โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโ โโโโโ>โ โเชเชเชพเชธเซ(เชเซ, IdB) โ โ โ โเชเชเชพเชธเซ(SignPubB, ...)โ โ โ โโโโโโโโโโโโโโโโโโโโโโ โโโโโ โโ โ โ
เชเชชเซเชเชฟเชฎเชพเชเชเซเชถเชจ เชคเชฐเซเชเซ, เชเซเชเชฒเชพเช เชคเซเชฎเชจเซ เชเซเชทเชฃเชฟเช เชเซเชจเซ เชซเชฐเซเชฅเซ เชเชชเชฏเซเช เชเชฐเชตเชพ เชฎเชพเชเชเซ เชเซ (เชเซ เช เชฒเชฌเชคเซเชค, PFS เชฎเชพเชเซ เชเชฎเชจเชธเซเชฌ เชเซ). เชเชฆเชพเชนเชฐเชฃ เชคเชฐเซเชเซ, เช เชฎเซ เชเช เชเซ เชเซเชกเซ เชฌเชจเชพเชตเซ, เชเชจเซเชเซเช เชเชฐเชตเชพเชจเซ เชชเซเชฐเชฏเชพเชธ เชเชฐเซเชฏเซ, เชชเชฐเชเชคเซ TCP เชเชชเชฒเชฌเซเชง เชจเชนเซเชคเซเช เช เชฅเชตเชพ เชชเซเชฐเซเชเซเชเซเชฒเชจเซ เชฎเชงเซเชฏเชฎเชพเช เชเซเชฏเชพเชเช เชตเชฟเชเซเชทเซเชชเชฟเชค เชฅเชฏเซ เชนเชคเซ. เชจเชตเซ เชเซเชกเซ เชชเชฐ เชตเซเชฏเชฐเซเชฅ เชเชจเซเชเซเชฐเซเชชเซ เช เชจเซ เชชเซเชฐเซเชธเซเชธเชฐ เชธเชเชธเชพเชงเชจเซเชจเซ เชฌเชเชพเชก เชเชฐเชตเซ เชถเชฐเชฎเชเชจเช เชเซ. เชคเซเชฅเซ, เช เชฎเซ เชเชนเซเชตเชพเชคเซ เชเซเชเซ เชฐเชเซ เชเชฐเซเชถเซเช - เชเช เชธเซเชฏเซเชกเซ-เชฐเซเชจเซเชกเชฎ เชฎเซเชฒเซเชฏ เชเซ เชเซ เชเซเชทเชฃเชฟเช เชเชพเชนเซเชฐ เชเซเชจเซ เชซเชฐเซเชฅเซ เชเชชเชฏเซเช เชเชฐเชคเซ เชตเชเชคเซ เชธเชเชญเชตเชฟเชค เชฐเซเชจเซเชกเชฎ เชฐเซเชชเซเชฒเซ เชนเซเชฎเชฒเชพเช เชธเชพเชฎเซ เชฐเชเซเชทเชฃ เชเชฐเชถเซ. เชเซเชเซ เช เชจเซ เชเซเชทเชฃเชฟเช เชเชพเชนเซเชฐ เชเซ เชตเชเซเชเซเชจเชพ เชฌเชเชงเชจเชจเซ เชเชพเชฐเชฃเซ, เชตเชฟเชฐเซเชงเซ เชชเชเซเชทเชจเซ เชเชพเชนเซเชฐ เชเซ เชฌเชฟเชจเชเชฐเซเชฐเซ เชคเชฐเซเชเซ เชธเชนเซเชฎเชพเชเชฅเซ เชฆเซเชฐ เชเชฐเซ เชถเชเชพเชฏ เชเซ.
โโโโโโโ โโโโโโโ โPeerAโ โPeerBโ โโโโฌโ Ibโโ เชเซเชเซเช โ โโโโโโโโโ โโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ โโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ>โ โSignPrvA, SignPubA = เชฒเซเชก( )โ โ โ โPrvA, PubA = DHgen() โ โ โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โโโ โIdB, PubB, CookieB , sign(SignPrvB, (CookieA, CookieB, PubB)), MAC(IdB) โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ โ โ< โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโ - โ โโโโโโโ โโโโโโโโโโโโโโโโโโโโโโโ โ โ โโโโโโโโโโโโโ โโโโโโโโ โ เชเชฟเชนเซเชจ( SignPrvA, (CookieB, CookieA, PubA)), MAC(IdA) โ โKey = DH(PrvA, PubB) โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ โโ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โโโโโโโ>โ โ เชเชเชพเชธเซ(เชเซ, IdB) โ โ โ โเชเชเชพเชธเซ(SignPubB, ...)โ โ โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ โ
เช เชเชคเซ, เช เชฎเซ เชจเชฟเชทเซเชเซเชฐเชฟเชฏ เชจเชฟเชฐเซเชเซเชทเช เชชเชพเชธเซเชฅเซ เช เชฎเชพเชฐเชพ เชตเชพเชคเชเซเชค เชญเชพเชเซเชฆเชพเชฐเซเชจเซ เชเซเชชเชจเซเชฏเชคเชพ เชฎเซเชณเชตเชตเชพ เชฎเชพเชเชเซเช เชเซเช. เช เชเชฐเชตเชพ เชฎเชพเชเซ, SIGMA เช เชชเซเชฐเชฅเชฎ เชเซเชทเชฃเชฟเช เชเซเชจเซ เชเชชเชฒเซ เชเชฐเชตเชพเชจเซ เชชเซเชฐเชธเซเชคเชพเชต เชฎเซเชเซ เชเซ เช เชจเซ เชเช เชธเชพเชฎเชพเชจเซเชฏ เชเซ เชตเชฟเชเชธเชพเชตเซ เชเซ เชเซเชจเชพ เชชเชฐ เชชเซเชฐเชฎเชพเชฃเซเชเชฐเชฃ เช เชจเซ เชธเชเชฆเซเชถเชพเชเชจเซ เชเชณเชเซ เชถเชเชพเชฏ เชเซ. เชธเชฟเชเซเชฎเชพ เชฌเซ เชตเชฟเชเชฒเซเชชเซเชจเซเช เชตเชฐเซเชฃเชจ เชเชฐเซ เชเซ:
- SIGMA-I - เชเชฐเชเชญเชเชฐเซเชคเชพเชจเซ เชธเชเซเชฐเชฟเชฏ เชนเซเชฎเชฒเชพเชเชฅเซ, เชชเซเชฐเชคเชฟเชธเชพเชฆเชเชฐเซเชคเชพเชจเซ เชจเชฟเชทเซเชเซเชฐเชฟเชฏ เชนเซเชฎเชฒเชพเชเชฅเซ เชฐเชเซเชทเชฃ เชเชชเซ เชเซ: เชเชฐเชเชญเชเชฐเซเชคเชพ เชชเซเชฐเชคเชฟเชธเชพเชฆ เชเชชเชจเชพเชฐเชจเซ เชชเซเชฐเชฎเชพเชฃเชฟเชค เชเชฐเซ เชเซ เช
เชจเซ เชเซ เชเชเชเช เชฎเซเชณ เชเชพเชคเซเช เชจเชฅเซ, เชคเซ เชคเซ เชคเซเชจเซ เชเชณเช เชเชชเชคเซเช เชจเชฅเซ. เชเซ เชคเซเชจเซ เชธเชพเชฅเซ เชธเชเซเชฐเชฟเชฏ เชชเซเชฐเซเชเซเชเซเชฒ เชถเชฐเซ เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชคเซ เชชเซเชฐเชคเชฟเชตเชพเชฆเซ เชคเซเชจเซ เชเชณเช เชเชชเซ เชเซ. เชจเชฟเชทเซเชเซเชฐเชฟเชฏ เชจเชฟเชฐเซเชเซเชทเช เชเชเช เชถเซเชเชคเซ เชจเชฅเซ;
เชธเชฟเชเซเชฎเชพ-เชเชฐ - เชธเชเซเชฐเชฟเชฏ เชนเซเชฎเชฒเชพเชเชฅเซ เชชเซเชฐเชคเชฟเชธเชพเชฆ เชเชชเชจเชพเชฐเชจเซเช เชฐเชเซเชทเชฃ เชเชฐเซ เชเซ, เชจเชฟเชทเซเชเซเชฐเชฟเชฏ เชฒเซเชเซเชฅเซ เชเชฐเชเชญ เชเชฐเชจเชพเชฐเชจเซ. เชฌเชงเซเช เชฌเชฐเชพเชฌเชฐ เชตเชฟเชฐเซเชฆเซเชง เชเซ, เชชเชฐเชเชคเซ เช เชชเซเชฐเซเชเซเชเซเชฒเชฎเชพเช เชเชพเชฐ เชนเซเชจเซเชกเชถเซเช เชธเชเชฆเซเชถเชพเช เชชเชนเซเชฒเชพเชฅเซ เช เชชเซเชฐเชธเชพเชฐเชฟเชค เชฅเชพเชฏ เชเซ.เช เชฎเซ SIGMA-I เชชเชธเชเชฆ เชเชฐเซเช เชเซเช เชเชพเชฐเชฃ เชเซ เชคเซ เชเซเชฒเชพเชฏเชเช-เชธเชฐเซเชตเชฐ เชชเชฐเชฟเชเชฟเชค เชตเชธเซเชคเซเช เชชเชพเชธเซเชฅเซ เชเชชเชฃเซ เชเซ เช เชชเซเชเซเชทเชพ เชฐเชพเชเซเช เชเซเช เชคเซเชจเชพ เชเซเชตเซเช เช เชเซ: เชเซเชฒเชพเชฏเชเชเชจเซ เชฎเชพเชคเซเชฐ เชชเซเชฐเชฎเชพเชฃเชฟเชค เชธเชฐเซเชตเชฐ เชฆเซเชตเชพเชฐเชพ เช เชเชณเชเชตเชพเชฎเชพเช เชเชตเซ เชเซ, เช เชจเซ เชฆเชฐเซเช เชเชฃ เชธเชฐเซเชตเชฐเชจเซ เชชเชนเซเชฒเซเชฅเซ เช เชเชพเชฃเซ เชเซ. เชเชชเชฐเชพเชเชค เชเชเชพ เชนเซเชจเซเชกเชถเซเช เชธเชเชฆเซเชถเชพเชจเซ เชเชพเชฐเชฃเซ เชคเซเชจเซ เช เชฎเชฒเชฎเชพเช เชฎเซเชเชตเซเช เชธเชฐเชณ เชเซ. เช เชฎเซ เชชเซเชฐเซเชเซเชเซเชฒเชฎเชพเช เชเซ เชเชฎเซเชฐเซเช เชเซเช เชคเซ เชธเชเชฆเซเชถเชจเชพ เชญเชพเชเชจเซ เชเชจเซเชเซเชฐเชฟเชชเซเช เชเชฐเชตเชพเชจเซเช เชเซ เช เชจเซ เชเชณเชเชเชฐเซเชคเชพ A เชจเซ เชเซเชฒเซเชฒเชพ เชธเชเชฆเซเชถเชจเชพ เชเชจเซเชเซเชฐเชฟเชชเซเชเซเชก เชญเชพเชเชฎเชพเช เชธเซเชฅเชพเชจเชพเชเชคเชฐเชฟเชค เชเชฐเชตเชพเชจเซเช เชเซ:
PubA, CookieA โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโ โโโโโ โโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโ โโโโโ โโโโโโ>โ โSignPrvA , SignPubA = load()โ โ โ โPrvA, PubA = DHgen() โ โ โโโโโโโโโ . โโโโโโโโโโโโโโโ โโโโโโโโ โ<โโโโโโโโโโโโโ โโโโโโโโโโ - โโโโโโโโ โโโโโโโโโโโโโโโโโ โ โ โโโโโโโโโโโโโโโโ โโโ โ Enc((IdA, เชเชฟเชนเซเชจ( SignPrvA, (CookieB, CookieA, PubA)), MAC(IdA))) โ โKey = DH(PrvA, PubB) โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ โโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ โโโโโโโโโโโ โโโโโโ>โ โเชเชเชพเชธเซ(เชเซ, IdB) โ โ โ โเชเชเชพเชธเซ( SignPubB, ...)โ โ โ โโโโโโโโโโโโโโโโโโโโโ โโโโโ โโโ โ โ
- GOST R เชจเซ เชเชชเชฏเซเช เชธเชนเซ เชฎเชพเชเซ เชฅเชพเชฏ เชเซ
34.10-2012 256-เชฌเซเช เชเซ เชธเชพเชฅเซ เช เชฒเซเชเซเชฐเชฟเชงเชฎ. - เชธเชพเชฐเซเชตเชเชจเชฟเช เชเซ เชเชจเชฐเซเช เชเชฐเชตเชพ เชฎเชพเชเซ, 34.10-2012 VKO เชจเซ เชเชชเชฏเซเช เชฅเชพเชฏ เชเซ.
- CMAC เชจเซ เชเชชเชฏเซเช MAC เชคเชฐเซเชเซ เชฅเชพเชฏ เชเซ. เชคเชเชจเซเชเซ เชฐเซเชคเซ, เช GOST R 34.13-2015 เชฎเชพเช เชตเชฐเซเชฃเชตเซเชฒ เชฌเซเชฒเซเช เชธเชพเชเชซเชฐเชจเซ เชเชพเชฎเชเซเชฐเซเชจเซ เชเช เชตเชฟเชถเชฟเชทเซเช เชฎเซเชก เชเซ. เช เชฎเซเชก เชฎเชพเชเซ เชเชจเซเชเซเชฐเชฟเชชเซเชถเชจ เชซเชเชเซเชถเชจ เชคเชฐเซเชเซ -
เชเชกเชฎเชพเชเชกเซ (34.12-2015). - เชคเซเชจเซ เชธเชพเชฐเซเชตเชเชจเชฟเช เชเซเชจเชพ เชนเซเชถเชจเซ เชเชชเชฏเซเช เชเชจเซเชเชฐเชฒเซเชเซเชฏเซเชเชฐเชจเชพ เชเชณเชเชเชฐเซเชคเชพ เชคเชฐเซเชเซ เชฅเชพเชฏ เชเซ. เชนเซเชถ เชคเชฐเซเชเซ เชตเชชเชฐเชพเชฏ เชเซ
เชธเซเชเซเชฐเชฟเชฌเซเช-256 (34.11/2012/256 XNUMX เชฌเชฟเชเซเชธ).
เชนเซเชจเซเชกเชถเซเช เชชเชเซ, เช เชฎเซ เชถเซเชฐ เชเชฐเซเชฒเซ เชเซ เชชเชฐ เชธเชเชฎเชค เชฅเชเชถเซเช. เช เชฎเซ เชคเซเชจเซ เชเชชเชฏเซเช เชชเชฐเชฟเชตเชนเชจ เชธเชเชฆเซเชถเชพเชเชจเชพ เช เชงเชฟเชเซเชค เชเชจเซเชเซเชฐเชฟเชชเซเชถเชจ เชฎเชพเชเซ เชเชฐเซ เชถเชเซเช เชเซเช. เช เชญเชพเช เชเซเชฌ เช เชธเชฐเชณ เช เชจเซ เชญเซเชฒ เชเชฐเชตเซ เชฎเซเชถเซเชเซเชฒ เชเซ: เช เชฎเซ เชฎเซเชธเซเช เชเชพเชเชจเซเชเชฐเชจเซ เชตเชงเชพเชฐเซเช เชเซเช, เชฎเซเชธเซเชเชจเซ เชเชจเซเชเซเชฐเชฟเชชเซเช เชเชฐเซเช เชเซเช, เชเชพเชเชจเซเชเชฐเชจเซ เชชเซเชฐเชฎเชพเชฃเชฟเชค (MAC) เชเชฐเซเช เชเซเช เช เชจเซ เชธเชพเชเชซเชฐเชเซเชเซเชธเซเช เชฎเซเชเชฒเซเช เชเซเช. เชธเชเชฆเซเชถ เชชเซเชฐเชพเชชเซเชค เชเชฐเชคเซ เชตเชเชคเซ, เช เชฎเซ เชคเชชเชพเชธเซเช เชเซเช เชเซ เชเชพเชเชจเซเชเชฐ เชชเชพเชธเซ เช เชชเซเชเซเชทเชฟเชค เชฎเซเชฒเซเชฏ เชเซ, เชเชพเชเชจเซเชเชฐ เชธเชพเชฅเซ เชธเชพเชเชซเชฐเชเซเชเซเชธเซเชเชจเซ เชชเซเชฐเชฎเชพเชฃเชฟเชค เชเชฐเซ เช เชจเซ เชคเซเชจเซ เชกเชฟเชเซเชฐเชฟเชชเซเช เชเชฐเซ. เชนเซเชจเซเชกเชถเซเช เชธเชเชฆเซเชถเชพเช เชเชจเซเชเซเชฐเชฟเชชเซเช เชเชฐเชตเชพ, เชธเชเชฆเซเชถเชพเช เชชเชฐเชฟเชตเชนเชจ เชเชฐเชตเชพ เช เชจเซ เชคเซเชฎเชจเซ เชเซเชตเซ เชฐเซเชคเซ เชชเซเชฐเชฎเชพเชฃเชฟเชค เชเชฐเชตเชพ เชฎเชพเชเซ เชฎเชพเชฐเซ เชเช เชเซเชจเซ เชเชชเชฏเซเช เชเชฐเชตเซ เชเซเชเช? เช เชฌเชงเชพ เชเชพเชฐเซเชฏเซ เชฎเชพเชเซ เชเช เชเซเชจเซ เชเชชเชฏเซเช เชเชฐเชตเซ เชเซเชเชฎเซ เช เชจเซ เช เชตเชฟเชตเซเชเซ เชเซ. เชตเชฟเชถเชฟเชทเซเช เชเชพเชฐเซเชฏเซเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชเซเช เชเชจเชฐเซเช เชเชฐเชตเซ เชเชฐเซเชฐเซ เชเซ
เชเซเชกเซเชเชซ (เชเซ เชตเซเชฏเซเชคเซเชชเชจเซเชจ เชเชพเชฐเซเชฏ). เชซเชฐเซเชฅเซ, เชเชพเชฒเซ เชตเชพเชณ เชตเชฟเชญเชพเชเซเชค เชจ เชเชฐเซเช เช เชจเซ เชเชเชเช เชถเซเชง เชเชฐเซเช:เชเช.เชเซ.เชกเซ.เชเชซ. เชฒเชพเชเชฌเชพ เชธเชฎเชฏเชฅเซ เชเชพเชฃเซเชคเซเช เชเซ, เชธเชพเชฐเซ เชฐเซเชคเซ เชธเชเชถเซเชงเชจ เชเชฐเชตเชพเชฎเชพเช เชเชตเซเชฏเซเช เชเซ เช เชจเซ เชเซเช เชเชพเชฃเซเชคเซ เชธเชฎเชธเซเชฏเชพเช เชจเชฅเซ. เชเชฎเชจเชธเซเชฌเซ, เชฎเซเชณ เชชเชพเชฏเชฅเซเชจ เชฒเชพเชเชฌเซเชฐเซเชฐเซเชฎเชพเช เช เชเชพเชฐเซเชฏ เชจเชฅเซ, เชคเซเชฅเซ เช เชฎเซ เชเชชเชฏเซเช เชเชฐเซเช เชเซเชhkdf เชชเซเชฒเชพเชธเซเชเชฟเช เชฌเซเช. HKDF เชเชเชคเชฐเชฟเช เชฐเซเชคเซ เชเชชเชฏเซเช เชเชฐเซ เชเซHMAC , เชเซ เชฌเชฆเชฒเชพเชฎเชพเช เชนเซเชถ เชซเชเชเซเชถเชจเชจเซ เชเชชเชฏเซเช เชเชฐเซ เชเซ. เชตเชฟเชเชฟเชชเซเชกเชฟเชฏเชพ เชชเซเชทเซเช เชชเชฐ เชชเชพเชฏเชฅเซเชจเชฎเชพเช เชเช เชเชฆเชพเชนเชฐเชฃ เช เชฎเชฒเซเชเชฐเชฃ เชเซเชกเชจเซ เชฅเซเชกเซเช เชฒเชพเชเชจ เชฒเซ เชเซ. 34.10/2012/256 เชจเชพ เชเชฟเชธเซเชธเชพเชฎเชพเช, เชเชชเชฃเซ เชนเซเชถ เชซเชเชเซเชถเชจ เชคเชฐเซเชเซ เชธเซเชเซเชฐเชฟเชฌเซเช-XNUMX เชจเซ เชเชชเชฏเซเช เชเชฐเซเชถเซเช. เช เชฎเชพเชฐเชพ เชเซ เชเชเซเชฐเซเชฎเซเชจเซเช เชซเชเชเซเชถเชจเชจเชพ เชเชเชเชชเซเชเชจเซ เชธเซเชถเชจ เชเซ เชเชนเซเชตเชพเชฎเชพเช เชเชตเชถเซ, เชเซเชฎเชพเชเชฅเซ เชเซเชฎ เชฅเชฏเซเชฒ เชธเชชเซเชฐเชฎเชพเชฃ เชเชจเชฐเซเช เชฅเชถเซ:kdf = Hkdf(None, key_session, hash=GOST34112012256) kdf.expand(b"handshake1-mac-identity") kdf.expand(b"handshake1-enc") kdf.expand(b"handshake1-mac") kdf.expand(b"handshake2-mac-identity") kdf.expand(b"handshake2-enc") kdf.expand(b"handshake2-mac") kdf.expand(b"transport-initiator-enc") kdf.expand(b"transport-initiator-mac") kdf.expand(b"transport-responder-enc") kdf.expand(b"transport-responder-mac")
เชฎเชพเชณเชเชพ/เชฏเซเชเชจเชพเช
เชเชพเชฒเซ เชเซเชเช เชเซ เช เชคเชฎเชพเชฎ เชกเซเชเชพ เชเซเชฐเชพเชจเซเชธเชฎเชฟเช เชเชฐเชตเชพ เชฎเชพเชเซ เชนเชตเซ เชเชชเชฃเซ เชชเชพเชธเซ เชเช ASN.1 เชธเซเชเซเชฐเชเซเชเชฐเซเชธ เชเซ:
class Msg(Choice): schema = (( ("text", MsgText()), ("handshake0", MsgHandshake0(expl=tag_ctxc(0))), ("handshake1", MsgHandshake1(expl=tag_ctxc(1))), ("handshake2", MsgHandshake2(expl=tag_ctxc(2))), )) class MsgText(Sequence): schema = (( ("payload", MsgTextPayload()), ("payloadMac", MAC()), )) class MsgTextPayload(Sequence): schema = (( ("nonce", Integer(bounds=(0, float("+inf")))), ("ciphertext", OctetString(bounds=(1, MaxTextLen))), )) class MsgHandshake0(Sequence): schema = (( ("cookieInitiator", Cookie()), ("pubKeyInitiator", PubKey()), )) class MsgHandshake1(Sequence): schema = (( ("cookieResponder", Cookie()), ("pubKeyResponder", PubKey()), ("ukm", OctetString(bounds=(8, 8))), ("ciphertext", OctetString()), ("ciphertextMac", MAC()), )) class MsgHandshake2(Sequence): schema = (( ("ciphertext", OctetString()), ("ciphertextMac", MAC()), )) class HandshakeTBE(Sequence): schema = (( ("identity", OctetString(bounds=(32, 32))), ("signature", OctetString(bounds=(64, 64))), ("identityMac", MAC()), )) class HandshakeTBS(Sequence): schema = (( ("cookieTheir", Cookie()), ("cookieOur", Cookie()), ("pubKeyOur", PubKey()), )) class Cookie(OctetString): bounds = (16, 16) class PubKey(OctetString): bounds = (64, 64) class MAC(OctetString): bounds = (16, 16)
เชนเซเชจเซเชกเชถเซเชเชเซเชฌเซเชเชธ เชชเชฐ เชนเชธเซเชคเชพเชเซเชทเชฐ เชเชฐเชตเชพเชฎเชพเช เชเชตเชถเซ. เชนเซเชจเซเชกเชถเซเชเชเซเชฌเซเช - เชถเซเช เชเชจเซเชเซเชฐเชฟเชชเซเช เชเชฐเชตเชพเชฎเชพเช เชเชตเชถเซ. เชนเซเช เชคเชฎเชพเชฐเซเช เชงเซเชฏเชพเชจ MsgHandshake1 เชฎเชพเช ukm เชซเซเชฒเซเชก เชคเชฐเชซ เชฆเซเชฐเซเช เชเซเช. 34.10 VKO, เชเชจเชฐเซเช เชเชฐเซเชฒเซ เชเซเชจเชพ เชตเชงเซ เชฐเซเชจเซเชกเชฎเชพเชเชเซเชถเชจ เชฎเชพเชเซ, UKM (เชฏเซเชเชฐ เชเซเชเชเช เชฎเชเชฟเชฐเชฟเชฏเชฒ) เชชเซเชฐเชพเชฎเซเชเชฐเชจเซ เชธเชฎเชพเชตเซเชถ เชเชฐเซ เชเซ - เชฎเชพเชคเซเชฐ เชตเชงเชพเชฐเชพเชจเซ เชเชจเซเชเซเชฐเซเชชเซ.
เชเซเชกเชฎเชพเช เชเซเชฐเชฟเชชเซเชเซเชเซเชฐเชพเชซเซ เชเชฎเซเชฐเชตเชพเชจเซเช
เชเชพเชฒเซ เชฎเซเชณ เชเซเชกเชฎเชพเช เชเชฐเชตเชพเชฎเชพเช เชเชตเซเชฒเชพ เชซเซเชฐเชซเชพเชฐเซเชจเซ เช เชงเซเชฏเชพเชจเชฎเชพเช เชฒเชเช, เชเชพเชฐเชฃ เชเซ เชซเซเชฐเซเชฎเชตเชฐเซเช เชธเชฎเชพเชจ เชฐเชนเซเชฏเซเช (เชนเชเซเชเชคเชฎเชพเช, เช เชเชคเชฟเชฎ เช เชฎเชฒเซเชเชฐเชฃ เชชเชนเซเชฒเชพ เชฒเชเชตเชพเชฎเชพเช เชเชตเซเชฏเซเช เชนเชคเซเช, เช เชจเซ เชชเชเซ เชคเซเชฎเชพเชเชฅเซ เชคเชฎเชพเชฎ เชธเชเชเซเชคเชฒเชฟเชชเซเชจเซ เชเชพเชชเซ เชจเชพเชเชตเชพเชฎเชพเช เชเชตเซ เชนเชคเซ).
เชธเชพเชฐเซเชตเชเชจเชฟเช เชเซเชเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชชเซเชฐเชฎเชพเชฃเซเชเชฐเชฃ เช เชจเซ เชเชจเซเชเชฐเชฒเซเชเซเชฏเซเชเชฐเซเชธเชจเซ เชเชณเช เชนเชพเชฅ เชงเชฐเชตเชพเชฎเชพเช เชเชตเชถเซ, เชคเซเชฅเซ เชคเซเชฎเชจเซ เชนเชตเซ เชเซเชฏเชพเชเช เชฒเชพเชเชฌเชพ เชธเชฎเชฏ เชธเซเชงเซ เชธเชเชเซเชฐเชนเชฟเชค เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ. เชธเชฐเชณเชคเชพ เชฎเชพเชเซ, เช เชฎเซ เช เชฐเซเชคเซ JSON เชจเซ เชเชชเชฏเซเช เชเชฐเซเช เชเซเช:
{ "our": { "prv": "21254cf66c15e0226ef2669ceee46c87b575f37f9000272f408d0c9283355f98", "pub": "938c87da5c55b27b7f332d91b202dbef2540979d6ceaa4c35f1b5bfca6df47df0bdae0d3d82beac83cec3e353939489d9981b7eb7a3c58b71df2212d556312a1" }, "their": { "alice": "d361a59c25d2ca5a05d21f31168609deeec100570ac98f540416778c93b2c7402fd92640731a707ec67b5410a0feae5b78aeec93c4a455a17570a84f2bc21fce", "bob": "aade1207dd85ecd283272e7b69c078d5fae75b6e141f7649ad21962042d643512c28a2dbdc12c7ba40eb704af920919511180c18f4d17e07d7f5acd49787224a" } }
เช เชฎเชพเชฐเซ - เช เชฎเชพเชฐเซ เชเซ เชเซเชกเซ, เชนเซเชเซเชธเชพเชกเซเชธเชฟเชฎเชฒ เชเชพเชจเชเซ เช เชจเซ เชเชพเชนเซเชฐ เชเซ. เชคเซเชฎเชจเชพ โ เชตเชพเชฐเซเชคเชพเชฒเชพเชช เชเชฐเชจเชพเชฐเชพเชเชจเชพ เชจเชพเชฎ เช เชจเซ เชคเซเชฎเชจเซ เชเชพเชนเซเชฐ เชเชพเชตเซเช. เชเชพเชฒเซ เชเชฆเซเชถ เชตเชพเชเซเชฏ เชฆเชฒเซเชฒเซ เชฌเชฆเชฒเซเช เช เชจเซ JSON เชกเซเชเชพเชจเซ เชชเซเชธเซเช-เชชเซเชฐเซเชธเซเชธเชฟเชเช เชเชฎเซเชฐเซเช:
from pygost import gost3410 from pygost.gost34112012256 import GOST34112012256 CURVE = gost3410.GOST3410Curve( *gost3410.CURVE_PARAMS["GostR3410_2001_CryptoPro_A_ParamSet"] ) parser = argparse.ArgumentParser(description="GOSTIM") parser.add_argument( "--keys-gen", action="store_true", help="Generate JSON with our new keypair", ) parser.add_argument( "--keys", default="keys.json", required=False, help="JSON with our and their keys", ) parser.add_argument( "--bind", default="::1", help="Address to listen on", ) parser.add_argument( "--port", type=int, default=6666, help="Port to listen on", ) args = parser.parse_args() if args.keys_gen: prv_raw = urandom(32) pub = gost3410.public_key(CURVE, gost3410.prv_unmarshal(prv_raw)) pub_raw = gost3410.pub_marshal(pub) print(json.dumps({ "our": {"prv": hexenc(prv_raw), "pub": hexenc(pub_raw)}, "their": {}, })) exit(0) # Parse and unmarshal our and their keys {{{ with open(args.keys, "rb") as fd: _keys = json.loads(fd.read().decode("utf-8")) KEY_OUR_SIGN_PRV = gost3410.prv_unmarshal(hexdec(_keys["our"]["prv"])) _pub = hexdec(_keys["our"]["pub"]) KEY_OUR_SIGN_PUB = gost3410.pub_unmarshal(_pub) KEY_OUR_SIGN_PUB_HASH = OctetString(GOST34112012256(_pub).digest()) for peer_name, pub_raw in _keys["their"].items(): _pub = hexdec(pub_raw) KEYS[GOST34112012256(_pub).digest()] = { "name": peer_name, "pub": gost3410.pub_unmarshal(_pub), } # }}}
34.10 เช เชฒเซเชเซเชฐเชฟเชงเชฎเชจเซ เชเชพเชจเชเซ เชเซ เชเช เชฐเซเชจเซเชกเชฎ เชจเชเชฌเชฐ เชเซ. 256-เชฌเซเช เชฒเชเชฌเชเซเชณ เชตเชฃเชพเชเชเซ เชฎเชพเชเซ 256-เชฌเซเช เชเชฆ. PyGOST เชฌเชพเชเชเซเชธเชจเชพ เชธเชฎเซเชน เชธเชพเชฅเซ เชเชพเชฎ เชเชฐเชคเซเช เชจเชฅเซ, เชชเชฐเชเชคเซ เชธเชพเชฅเซ
เชฎเซเชเซ เชธเชเชเซเชฏเชพเชฎเชพเช , เชคเซเชฅเซ เช เชฎเชพเชฐเซ เชเชพเชจเชเซ เชเซ (เชฏเซเชฐเซเชจเซเชกเชฎ(32)) เชจเซ gost3410.prv_unmarshal() เชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชจเชเชฌเชฐเชฎเชพเช เชฐเซเชชเชพเชเชคเชฐเชฟเชค เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ. เชเชพเชนเซเชฐ เชเซ gost3410.public_key() เชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชเชพเชจเชเซ เชเซเชฎเชพเชเชฅเซ เชจเชฟเชฐเซเชงเชพเชฐเชฟเชค เชฐเซเชคเซ เชจเชเซเชเซ เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ. เชธเชพเชฐเซเชตเชเชจเชฟเช เชเซ 34.10 เช เชฌเซ เชฎเซเชเซ เชธเชเชเซเชฏเชพเช เชเซ เชเซเชจเซ gost3410.pub_marshal() เชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชธเซเชเซเชฐเซเช เช เชจเซ เชเซเชฐเชพเชจเซเชธเชฎเชฟเชถเชจเชจเซ เชธเชฐเชณเชคเชพ เชฎเชพเชเซ เชฌเชพเชเช เชธเชฟเชเซเชตเชจเซเชธเชฎเชพเช เชฐเซเชชเชพเชเชคเชฐเชฟเชค เชเชฐเชตเชพเชจเซ เชชเชฃ เชเชฐเซเชฐ เชเซ.JSON เชซเชพเชเชฒ เชตเชพเชเชเซเชฏเชพ เชชเชเซ, เชคเซ เชฎเซเชเชฌ เชธเชพเชฐเซเชตเชเชจเชฟเช เชเซเชจเซ gost3410.pub_unmarshal() เชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชชเชพเชเซ เชฐเซเชชเชพเชเชคเชฐเชฟเชค เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ. เช เชฎเชจเซ เชธเชพเชฐเซเชตเชเชจเชฟเช เชเซเชฎเชพเชเชฅเซ เชนเซเชถเชจเชพ เชฐเซเชชเชฎเชพเช เชเชจเซเชเชฐเชฒเซเชเซเชฏเซเชเชฐเซเชธเชจเชพ เชเชณเชเชเชฐเซเชคเชพเช เชชเซเชฐเชพเชชเซเชค เชฅเชถเซ, เชคเซเชฅเซ เชคเซเช เชคเชฐเชค เช เช เชเชพเชเชฅเซ เชเชฃเชคเชฐเซ เชเชฐเซ เชถเชเชพเชฏ เชเซ เช เชจเซ เชเชกเชชเซ เชถเซเชง เชฎเชพเชเซ เชถเชฌเซเชฆเชเซเชถเชฎเชพเช เชฎเซเชเซ เชถเชเชพเชฏ เชเซ. Stribog-256 hash gost34112012256.GOST34112012256(), เชเซ เชนเซเชถ เชซเชเชเซเชถเชจเซเชธเชจเชพ เชนเซเชถเชฒเชฟเชฌ เชเชจเซเชเชฐเชซเซเชธเชจเซ เชธเชเชชเซเชฐเซเชฃ เชฐเซเชคเซ เชธเชเชคเซเชทเซเช เชเชฐเซ เชเซ.
เชเชฐเชเชญ เชเชฐเชจเชพเชฐ เชเซเชฐเซเชเซเชจ เชเซเชตเซ เชฐเซเชคเซ เชฌเชฆเชฒเชพเช เชเซ? เชฌเชงเซเช เชนเซเชจเซเชกเชถเซเช เชฏเซเชเชจเชพ เชฎเซเชเชฌ เชเซ: เช เชฎเซ เชเช เชเซเชเซ (128-เชฌเซเช เชชเซเชทเซเชเชณ เชเซ), เชเช เชเซเชทเชฃเชฟเช เชเซ เชเซเชกเซ 34.10 เชเชจเชฐเซเช เชเชฐเซเช เชเซเช, เชเซเชจเซ เชเชชเชฏเซเช VKO เชเซ เชเชฐเชพเชฐ เชเชพเชฐเซเชฏ เชฎเชพเชเซ เชเชฐเชตเชพเชฎเชพเช เชเชตเชถเซ.
395 async def initiator(host, port): 396 _id = repr((host, port)) 397 logging.info("%s: dialing", _id) 398 reader, writer = await asyncio.open_connection(host, port) 399 # Generate our ephemeral public key and cookie, send Handshake 0 message {{{ 400 cookie_our = Cookie(urandom(16)) 401 prv = gost3410.prv_unmarshal(urandom(32)) 402 pub_our = gost3410.public_key(CURVE, prv) 403 pub_our_raw = PubKey(gost3410.pub_marshal(pub_our)) 404 writer.write(Msg(("handshake0", MsgHandshake0(( 405 ("cookieInitiator", cookie_our), 406 ("pubKeyInitiator", pub_our_raw), 407 )))).encode()) 408 # }}} 409 await writer.drain()
- เช เชฎเซ เชชเซเชฐเชคเชฟเชธเชพเชฆเชจเซ เชฐเชพเชน เชเซเชเช เชเซเช เช เชจเซ เชเชตเชจเชพเชฐเชพ เชธเชเชฆเซเชถเชจเซ เชกเซเชเซเชก เชเชฐเซเช เชเซเช;
- เชเชพเชคเชฐเซ เชเชฐเซ เชเซ เชคเชฎเซ เชนเซเชจเซเชกเชถเซเช1 เชฎเซเชณเชตเซ เชเซ;
- เชตเชฟเชฐเซเชงเซ เชชเชเซเชทเชจเซ เชเซเชทเชฃเชฟเช เชธเชพเชฐเซเชตเชเชจเชฟเช เชเซเชจเซ เชกเซเชเซเชก เชเชฐเซ เช เชจเซ เชธเชคเซเชฐ เชเซเชจเซ เชเชฃเชคเชฐเซ เชเชฐเซ;
- เช เชฎเซ เชธเชเชฆเซเชถเชจเชพ TBE เชญเชพเชเชจเซ เชชเซเชฐเชเซเชฐเชฟเชฏเชพ เชเชฐเชตเชพ เชฎเชพเชเซ เชเชฐเซเชฐเซ เชธเชชเซเชฐเชฎเชพเชฃ เชเซเช เชเชจเชฐเซเช เชเชฐเซเช เชเซเช.
423 logging.info("%s: got %s message", _id, msg.choice) 424 if msg.choice != "handshake1": 425 logging.warning("%s: unexpected message, disconnecting", _id) 426 writer.close() 427 return 428 # }}} 429 msg_handshake1 = msg.value 430 # Validate Handshake message {{{ 431 cookie_their = msg_handshake1["cookieResponder"] 432 pub_their_raw = msg_handshake1["pubKeyResponder"] 433 pub_their = gost3410.pub_unmarshal(bytes(pub_their_raw)) 434 ukm_raw = bytes(msg_handshake1["ukm"]) 435 ukm = ukm_unmarshal(ukm_raw) 436 key_session = kek_34102012256(CURVE, prv, pub_their, ukm, mode=2001) 437 kdf = Hkdf(None, key_session, hash=GOST34112012256) 438 key_handshake1_mac_identity = kdf.expand(b"handshake1-mac-identity") 439 key_handshake1_enc = kdf.expand(b"handshake1-enc") 440 key_handshake1_mac = kdf.expand(b"handshake1-mac")
UKM เช 64-เชฌเซเช เชจเชเชฌเชฐ เชเซ (เชฏเซเชฐเซเชจเซเชกเชฎ(8)), เชเซเชจเซ gost3410_vko.ukm_unmarshal() เชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชคเซเชจเชพ เชฌเชพเชเช เชชเซเชฐเชคเชฟเชจเชฟเชงเชฟเชคเซเชตเชฎเชพเชเชฅเซ เชกเซเชธเซเชฐเชฟเชฏเชฒเชพเชเชเซเชถเชจเชจเซ เชชเชฃ เชเชฐเซเชฐ เชเซ. 34.10/2012/256 เชฎเชพเชเซ VKO เชซเชเชเซเชถเชจ 3410-bit gost34102012256_vko.kek_XNUMX() (KEK - เชเชจเซเชเซเชฐเชฟเชชเซเชถเชจ เชเซ) เชเซ.
เชเชจเชฐเซเช เชเชฐเซเชฒ เชธเชคเซเชฐ เชเซ เชชเชนเซเชฒเซเชฅเซ เช 256-เชฌเซเช เชธเซเชฏเซเชกเซ-เชฐเซเชจเซเชกเชฎ เชฌเชพเชเช เชธเชฟเชเซเชตเชจเซเชธ เชเซ. เชคเซเชฅเซ, เชคเซเชจเซ เชคเชฐเชค เช HKDF เชเชพเชฐเซเชฏเซเชฎเชพเช เชเชชเชฏเซเช เชเชฐเซ เชถเชเชพเชฏ เชเซ. GOST34112012256 hashlib เชเชจเซเชเชฐเชซเซเชธเชจเซ เชธเชเชคเซเชทเซเช เชเชฐเชคเซเช เชนเซเชตเชพเชฅเซ, เชคเซเชจเซ เชคเชฐเชค เช Hkdf เชตเชฐเซเชเชฎเชพเช เชเชชเชฏเซเช เชเชฐเซ เชถเชเชพเชฏ เชเซ. เช เชฎเซ เชฎเซเช เซเช (Hkdf เชจเซ เชชเซเชฐเชฅเชฎ เชฆเชฒเซเชฒ) เชจเซ เชเชฒเซเชฒเซเช เชเชฐเชคเชพ เชจเชฅเซ, เชเชพเชฐเชฃ เชเซ เชเชจเชฐเซเช เชเชฐเซเชฒ เชเซ, เชธเชนเชญเชพเชเซ เชเซ เชเซเชกเซเชจเซ เชเซเชทเชฃเชฟเชเชคเชพเชจเซ เชเชพเชฐเชฃเซ, เชฆเชฐเซเช เชธเชคเซเชฐ เชฎเชพเชเซ เช เชฒเช เชนเชถเซ เช เชจเซ เชคเซ เชชเชนเซเชฒเชพเชฅเซ เช เชชเซเชฐเชคเซ เชเชจเซเชเซเชฐเซเชชเซ เชงเชฐเชพเชตเซ เชเซ. kdf.expand() เชฎเซเชณเชญเซเชค เชฐเซเชคเซ เชชเชนเซเชฒเชพเชฅเซ เช เชเซเชฐเชพเชถเซเชชเชฐ เชฎเชพเชเซ เชเชฐเซเชฐเซ 256-เชฌเซเช เชเซเชเชจเซเช เชเชคเซเชชเชพเชฆเชจ เชเชฐเซ เชเซ.
เชเชเชณ, เชเชตเชจเชพเชฐเชพ เชธเชเชฆเซเชถเชพเชจเชพ TBE เช เชจเซ TBS เชญเชพเชเซ เชคเชชเชพเชธเชตเชพเชฎเชพเช เชเชตเซ เชเซ:
- เชเชจเชเชฎเชฟเชเช เชธเชฟเชซเชฐเชเซเชเซเชธเซเช เชชเชฐ MAC เชจเซ เชเชฃเชคเชฐเซ เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ เช เชจเซ เชคเชชเชพเชธเชตเชพเชฎเชพเช เชเชตเซ เชเซ;
- เชธเชพเชเชซเชฐเชเซเชเซเชธเซเช เชกเชฟเชเซเชฐเชฟเชชเซเช เชฅเชฏเซเชฒ เชเซ;
- TBE เชฎเชพเชณเชเซเช เชกเซเชเซเชก เชฅเชฏเซเชฒ เชเซ;
- เชเชจเซเชเชฐเชฒเซเชเซเชฏเซเชเชฐเชจเซ เชเชณเชเชเชฐเซเชคเชพ เชคเซเชจเซ เชชเชพเชธเซเชฅเซ เชฒเซเชตเชพเชฎเชพเช เชเชตเซ เชเซ เช เชจเซ เชคเซ เชคเชชเชพเชธเชตเชพเชฎเชพเช เชเชตเซ เชเซ เชเซ เชคเซ เชเชชเชฃเชจเซ เชฌเชฟเชฒเชเซเชฒ เชเชณเชเซ เชเซ เชเซ เชเซเชฎ;
- เช เชเชณเชเชเชฐเซเชคเชพ เชชเชฐ MAC เชจเซ เชเชฃเชคเชฐเซ เช เชจเซ เชคเชชเชพเชธ เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ;
- TBS เชธเซเชเซเชฐเชเซเชเชฐ เชชเชฐเชจเซ เชธเชนเซ เชเชเชพเชธเชตเชพเชฎเชพเช เชเชตเซ เชเซ, เชเซเชฎเชพเช เชฌเชเชจเซ เชชเชเซเชทเซเชจเซ เชเซเชเซ เช เชจเซ เชตเชฟเชฐเซเชงเซ เชชเชเซเชทเชจเซ เชธเชพเชฐเซเชตเชเชจเชฟเช เชเซเชทเชฃเชฟเช เชเซเชจเซ เชธเชฎเชพเชตเซเชถ เชฅเชพเชฏ เชเซ. เชนเชธเซเชคเชพเชเซเชทเชฐ เชเชจเซเชเชฐเชฒเซเชเซเชฏเซเชเชฐเชจเซ เชฒเชพเชเชฌเชพ เชเชพเชณเชพเชจเซ เชธเชนเซ เชเซ เชฆเซเชตเชพเชฐเชพ เชเชเชพเชธเชตเชพเชฎเชพเช เชเชตเซ เชเซ.
441 try: 442 peer_name = validate_tbe( 443 msg_handshake1, 444 key_handshake1_mac_identity, 445 key_handshake1_enc, 446 key_handshake1_mac, 447 cookie_our, 448 cookie_their, 449 pub_their_raw, 450 ) 451 except ValueError as err: 452 logging.warning("%s: %s, disconnecting", _id, err) 453 writer.close() 454 return 455 # }}} 128 def validate_tbe( 129 msg_handshake: Union[MsgHandshake1, MsgHandshake2], 130 key_mac_identity: bytes, 131 key_enc: bytes, 132 key_mac: bytes, 133 cookie_their: Cookie, 134 cookie_our: Cookie, 135 pub_key_our: PubKey, 136 ) -> str: 137 ciphertext = bytes(msg_handshake["ciphertext"]) 138 mac_tag = mac(GOST3412Kuznechik(key_mac).encrypt, KUZNECHIK_BLOCKSIZE, ciphertext) 139 if not compare_digest(mac_tag, bytes(msg_handshake["ciphertextMac"])): 140 raise ValueError("invalid MAC") 141 plaintext = ctr( 142 GOST3412Kuznechik(key_enc).encrypt, 143 KUZNECHIK_BLOCKSIZE, 144 ciphertext, 145 8 * b"x00", 146 ) 147 try: 148 tbe, _ = HandshakeTBE().decode(plaintext) 149 except ASN1Error: 150 raise ValueError("can not decode TBE") 151 key_sign_pub_hash = bytes(tbe["identity"]) 152 peer = KEYS.get(key_sign_pub_hash) 153 if peer is None: 154 raise ValueError("unknown identity") 155 mac_tag = mac( 156 GOST3412Kuznechik(key_mac_identity).encrypt, 157 KUZNECHIK_BLOCKSIZE, 158 key_sign_pub_hash, 159 ) 160 if not compare_digest(mac_tag, bytes(tbe["identityMac"])): 161 raise ValueError("invalid identity MAC") 162 tbs = HandshakeTBS(( 163 ("cookieTheir", cookie_their), 164 ("cookieOur", cookie_our), 165 ("pubKeyOur", pub_key_our), 166 )) 167 if not gost3410.verify( 168 CURVE, 169 peer["pub"], 170 GOST34112012256(tbs.encode()).digest(), 171 bytes(tbe["signature"]), 172 ): 173 raise ValueError("invalid signature") 174 return peer["name"]
เชฎเซเช เชเชชเชฐ เชฒเชเซเชฏเซเช เชคเซเชฎ, 34.13/2015/XNUMX เชตเชฟเชตเชฟเชง เชตเชฐเซเชฃเชจ เชเชฐเซ เชเซ
เชฌเซเชฒเซเช เชธเชพเชเชซเชฐ เชเชชเชฐเซเชเชฟเชเช เชฎเซเชกเซเชธ 34.12/2015/3413 เชฅเซ. เชคเซเชฎเชพเชเชฅเซ เช เชจเซเชเชฐเชฃ เชฆเชพเชเชฒ เช เชจเซ MAC เชเชฃเชคเชฐเซเช เชเชจเชฐเซเช เชเชฐเชตเชพ เชฎเชพเชเซ เชเช เชฎเซเชก เชเซ. PyGOST เชฎเชพเช เช gost34.12.mac() เชเซ. เช เชฎเซเชก เชฎเชพเชเซ เชเชจเซเชเซเชฐเชฟเชชเซเชถเชจ เชซเชเชเซเชถเชจ (เชกเซเชเชพเชจเซ เชเช เชฌเซเชฒเซเช เชฎเซเชณเชตเชตเซ เช เชจเซ เชชเชฐเชค เชเชฐเชตเซ), เชเชจเซเชเซเชฐเชฟเชชเซเชถเชจ เชฌเซเชฒเซเชเชจเซเช เชเชฆ เช เชจเซ เชนเชเซเชเชคเชฎเชพเช, เชกเซเชเชพ เชชเซเชคเซ เช เชชเชธเชพเชฐ เชเชฐเชตเซ เชเชฐเซเชฐเซ เชเซ. เชถเชพ เชฎเชพเชเซ เชคเชฎเซ เชเชจเซเชเซเชฐเชฟเชชเซเชถเชจ เชฌเซเชฒเซเชเชจเชพ เชเชฆเชจเซ เชนเชพเชฐเซเชกเชเซเชก เชเชฐเซ เชถเชเชคเชพ เชจเชฅเซ? 2015/128/64 เชฎเชพเชคเซเชฐ XNUMX-เชฌเซเช เชเซเชฐเชพเชถเซเชชเชฐ เชธเชพเชเชซเชฐ เช เชจเชนเซเช, เชชเชฃ XNUMX-เชฌเซเชเชจเซเช เชชเชฃ เชตเชฐเซเชฃเชจ เชเชฐเซ เชเซเชฎเซเชเซเชฎเชพ - เชธเชนเซเช เชธเชเชถเซเชงเชฟเชค GOST 28147-89, เชเซเชเซเชฌเซเชฎเชพเช เชชเชพเชเซเช เชฌเชจเชพเชตเชตเชพเชฎเชพเช เชเชตเซเชฏเซเช เชเซ เช เชจเซ เชนเชเซ เชชเชฃ เชเชเซเชเชคเชฎ เชธเซเชฐเชเซเชทเชพ เชฅเซเชฐเซเชถเซเชฒเซเชกเชฎเชพเชเชจเซเช เชเช เชเซ.เชเซเชเชจเซเชเชฟเชเชจเซ gost.3412.GOST3412Kuznechik(key) เชชเชฐ เชเซเชฒ เชเชฐเซเชจเซ เชชเซเชฐเชพเชฐเชเชญ เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ เช เชจเซ 34.13 เชซเชเชเซเชถเชจเชฎเชพเช เชชเชธเชพเชฐ เชเชฐเชตเชพ เชฎเชพเชเซ เชฏเซเชเซเชฏ .encrypt()/.decrypt() เชชเชฆเซเชงเชคเชฟเช เชตเชกเซ เชเชฌเซเชเซเชเซเช เชชเชฐเชค เชเชฐเซ เชเซ. MAC เชจเซ เชเชฃเชคเชฐเซ เชจเซเชเซ เชชเซเชฐเชฎเชพเชฃเซ เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ: gost3413.mac(GOST3412Kuznechik(key).encrypt, KUZNECHIK_BLOCKSIZE, เชธเชพเชเชซเชฐเชเซเชเซเชธเซเช). เชเชฃเชคเชฐเซ เชเชฐเซเชฒ เช เชจเซ เชชเซเชฐเชพเชชเซเชค เชเชฐเซเชฒ MAC เชจเซ เชธเชฐเชเชพเชฎเชฃเซ เชเชฐเชตเชพ เชฎเชพเชเซ, เชคเชฎเซ เชฌเชพเชเช เชธเซเชเซเชฐเซเชเชเซเชธเชจเซ เชธเชพเชฎเชพเชจเซเชฏ เชธเชฐเชเชพเชฎเชฃเซ (==) เชจเซ เชเชชเชฏเซเช เชเชฐเซ เชถเชเชคเชพ เชจเชฅเซ, เชเชพเชฐเชฃ เชเซ เช เชเชพเชฎเชเซเชฐเซ เชธเชฐเชเชพเชฎเชฃเซ เชธเชฎเชฏเชจเซ เชฒเซเช เชเชฐเซ เชเซ, เชเซ เชธเชพเชฎเชพเชจเซเชฏ เชเชฟเชธเซเชธเชพเชฎเชพเช, เชเชพเชคเช เชจเชฌเชณเชพเชเช เชคเชฐเชซ เชฆเซเชฐเซ เชถเชเซ เชเซ เชเซเชฎ เชเซ
เชฌเซเชธเซเช TLS เชชเชฐ เชนเซเชฎเชฒเชพ. เช เชฎเชพเชเซ เชชเชพเชฏเชฅเซเชจ เชชเชพเชธเซ เชเชพเชธ เชเชพเชฐเซเชฏ เชเซ, hmac.compare_digest.เชฌเซเชฒเซเช เชธเชพเชเชซเชฐ เชซเชเชเซเชถเชจ เชกเซเชเชพเชจเชพ เชฎเชพเชคเซเชฐ เชเช เชฌเซเชฒเซเชเชจเซ เชเชจเซเชเซเชฐเชฟเชชเซเช เชเชฐเซ เชถเชเซ เชเซ. เชฎเซเชเซ เชธเชเชเซเชฏเชพ เชฎเชพเชเซ, เช เชจเซ เชฒเชเชฌเชพเชเชจเชพ เชเซเชฃเชพเชเช เชฎเชพเชเซ เชชเชฃ, เชเชจเซเชเซเชฐเชฟเชชเซเชถเชจ เชฎเซเชกเชจเซ เชเชชเชฏเซเช เชเชฐเชตเซ เชเชฐเซเชฐเซ เชเซ. 34.13-2015 เชจเซเชเซเชจเชพเชจเซเช เชตเชฐเซเชฃเชจ เชเชฐเซ เชเซ: ECB, CTR, OFB, CBC, CFB. เชฆเชฐเซเช เชชเชพเชธเซ เชเชชเซเชฒเชฟเชเซเชถเชจ เช เชจเซ เชฒเชพเชเซเชทเชฃเชฟเชเชคเชพเชเชจเชพ เชคเซเชจเชพ เชชเซเชคเชพเชจเชพ เชธเซเชตเซเชเชพเชฐเซเชฏ เชเซเชทเซเชคเซเชฐเซ เชเซ. เชเชฎเชจเชธเซเชฌเซ, เช เชฎเชพเชฐเซ เชชเชพเชธเซ เชนเชเซ เชชเชฃ เชชเซเชฐเชฎเชพเชฃเชญเซเชค เชจเชฅเซ
เชชเซเชฐเชฎเชพเชฃเชฟเชค เชเชจเซเชเซเชฐเชฟเชชเซเชถเชจ เชฎเซเชกเซเชธ (เชเซเชฎ เชเซ CCM, OCB, GCM เช เชจเซ เชคเซเชจเชพ เชเซเชตเชพ) - เช เชฎเชจเซ เชเชเชพเชฎเชพเช เชเชเซเช MAC เชเชฎเซเชฐเชตเชพเชจเซ เชซเชฐเช เชชเชกเซ เชเซ. เชนเซเช เชชเชธเชเชฆ เชเชฐเซเช เชเซเชเชเชพเชเชจเซเชเชฐ เชฎเซเชก (CTR): เชคเซเชจเซ เชฌเซเชฒเซเชเชจเชพ เชเชฆเชฎเชพเช เชชเซเชกเชฟเชเชเชจเซ เชเชฐเซเชฐ เชจเชฅเซ, เชธเชฎเชพเชเชคเชฐ เชเชฐเซ เชถเชเชพเชฏ เชเซ, เชฎเชพเชคเซเชฐ เชเชจเซเชเซเชฐเชฟเชชเซเชถเชจ เชซเชเชเซเชถเชจเชจเซ เชเชชเชฏเซเช เชเชฐเซ เชเซ, เชฎเซเชเซ เชธเชเชเซเชฏเชพเชฎเชพเช เชธเชเชฆเซเชถเชพเชเชจเซ เชเชจเซเชเซเชฐเชฟเชชเซเช เชเชฐเชตเชพ เชฎเชพเชเซ เชธเซเชฐเชเซเชทเชฟเชค เชฐเซเชคเซ เชเชชเชฏเซเช เชเชฐเซ เชถเชเชพเชฏ เชเซ (CBCเชฅเซ เชตเชฟเชชเชฐเซเชค, เชเซ เชชเซเชฐเชฎเชพเชฃเชฎเชพเช เชเชกเชชเชฅเซ เช เชฅเชกเชพเชฎเชฃ เชเชฐเซ เชเซ)..mac(), .ctr() เชจเซ เชเซเชฎ เชธเชฎเชพเชจ เชเชจเชชเซเช เชฒเซ เชเซ: ciphertext = gost3413.ctr(GOST3412Kuznechik(key).encrypt, KUZNECHIK_BLOCKSIZE, เชธเชพเชฆเซ เชเซเชเซเชธเซเช, iv). เชเชจเซเชเซเชฐเชฟเชชเซเชถเชจ เชฌเซเชฒเซเชเชจเซ เชฌเชฐเชพเชฌเชฐ เช เชกเชงเซ เชฒเชเชฌเชพเช เชงเชฐเชพเชตเชคเชพ เชชเซเชฐเชพเชฐเชเชญเชฟเช เชตเซเชเซเชเชฐเชจเซ เชเชฒเซเชฒเซเช เชเชฐเชตเซ เชเชฐเซเชฐเซ เชเซ. เชเซ เช เชฎเชพเชฐเซ เชเชจเซเชเซเชฐเชฟเชชเซเชถเชจ เชเซเชจเซ เชเชชเชฏเซเช เชซเชเซเชค เชเช เชธเชเชฆเซเชถเชจเซ เชเชจเซเชเซเชฐเชฟเชชเซเช เชเชฐเชตเชพ เชฎเชพเชเซ เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ (เชเชฃเชพ เชฌเซเชฒเซเชเชฎเชพเชเชฅเซ เชนเซเชตเชพ เชเชคเชพเช), เชคเซ เชถเซเชจเซเชฏ เชเชฐเชเชญ เชตเซเชเซเชเชฐ เชธเซเช เชเชฐเชตเซเช เชธเชฒเชพเชฎเชค เชเซ. เชนเซเชจเซเชกเชถเซเช เชธเชเชฆเซเชถเชพเชจเซ เชเชจเซเชเซเชฐเชฟเชชเซเช เชเชฐเชตเชพ เชฎเชพเชเซ, เช เชฎเซ เชฆเชฐเซเช เชตเชเชคเซ เช เชฒเช เชเซเชจเซ เชเชชเชฏเซเช เชเชฐเซเช เชเซเช.
เชนเชธเซเชคเชพเชเซเชทเชฐ gost3410.verify() เชจเซ เชเชเชพเชธเชฃเซ เชเชฐเชตเซ เชคเซเชเซเช เชเซ: เช เชฎเซ เชเซ เชฒเชเชฌเชเซเชณ เชตเชณเชพเชเชเชจเซ เช เชเชฆเชฐเชฅเซ เชชเชธเชพเชฐ เชเชฐเซเช เชเซเช (เช เชฎเซ เชคเซเชจเซ เช เชฎเชพเชฐเชพ GOSTIM เชชเซเชฐเซเชเซเชเซเชฒเชฎเชพเช เชฐเซเชเซเชฐเซเชก เชเชฐเซเช เชเซเช), เชธเชนเซ เชเชฐเชจเชพเชฐเชจเซ เชธเชพเชฐเซเชตเชเชจเชฟเช เชเซ (เชญเซเชฒเชถเซ เชจเชนเซเช เชเซ เช เชฌเซเชจเซ เชเซเชชเชฒ เชนเซเชตเซ เชเซเชเช. เชฎเซเชเซ เชธเชเชเซเชฏเชพเช, เช เชจเซ เชฌเชพเชเช เชธเซเชเซเชฐเชฟเชเช เชจเชนเซเช), 34.11/2012/XNUMX เชนเซเชถ เช เชจเซ เชธเชนเซ เชชเซเชคเซ.
เชเชเชณ, เชเชจเชฟเชถเชฟเชฏเซเชเชฐเชฎเชพเช เช เชฎเซ เชนเซเชจเซเชกเชถเซเช 2 เชจเซ เชนเซเชจเซเชกเชถเซเช เชฎเซเชธเซเช เชคเซเชฏเชพเชฐ เชเชฐเซเช เชเซเช เช เชจเซ เชฎเซเชเชฒเซเช เชเซเช, เช เชฎเซ เชตเซเชฐเชฟเชซเชฟเชเซเชถเชจ เชฆเชฐเชฎเชฟเชฏเชพเชจ เชเซ เชเซเชฐเชฟเชฏเชพเช เชเชฐเซ เชนเชคเซ เชคเซ เช เชเซเชฐเชฟเชฏเชพเช เชเชฐเซเชจเซ, เชฎเชพเชคเซเชฐ เชธเชฎเชชเซเชฐเชฎเชพเชฃเชฐเซเชคเซ: เชเซเช เชเชฐเชตเชพเชจเซ เชฌเชฆเชฒเซ เช เชฎเชพเชฐเซ เชเซ เชชเชฐ เชธเชนเซ เชเชฐเชตเซ เชตเชเซเชฐเซ...
456 # Prepare and send Handshake 2 message {{{ 457 tbs = HandshakeTBS(( 458 ("cookieTheir", cookie_their), 459 ("cookieOur", cookie_our), 460 ("pubKeyOur", pub_our_raw), 461 )) 462 signature = gost3410.sign( 463 CURVE, 464 KEY_OUR_SIGN_PRV, 465 GOST34112012256(tbs.encode()).digest(), 466 ) 467 key_handshake2_mac_identity = kdf.expand(b"handshake2-mac-identity") 468 mac_tag = mac( 469 GOST3412Kuznechik(key_handshake2_mac_identity).encrypt, 470 KUZNECHIK_BLOCKSIZE, 471 bytes(KEY_OUR_SIGN_PUB_HASH), 472 ) 473 tbe = HandshakeTBE(( 474 ("identity", KEY_OUR_SIGN_PUB_HASH), 475 ("signature", OctetString(signature)), 476 ("identityMac", MAC(mac_tag)), 477 )) 478 tbe_raw = tbe.encode() 479 key_handshake2_enc = kdf.expand(b"handshake2-enc") 480 key_handshake2_mac = kdf.expand(b"handshake2-mac") 481 ciphertext = ctr( 482 GOST3412Kuznechik(key_handshake2_enc).encrypt, 483 KUZNECHIK_BLOCKSIZE, 484 tbe_raw, 485 8 * b"x00", 486 ) 487 mac_tag = mac( 488 GOST3412Kuznechik(key_handshake2_mac).encrypt, 489 KUZNECHIK_BLOCKSIZE, 490 ciphertext, 491 ) 492 writer.write(Msg(("handshake2", MsgHandshake2(( 493 ("ciphertext", OctetString(ciphertext)), 494 ("ciphertextMac", MAC(mac_tag)), 495 )))).encode()) 496 # }}} 497 await writer.drain() 498 logging.info("%s: session established: %s", _id, peer_name)
เชเซเชฏเชพเชฐเซ เชธเชคเซเชฐ เชธเซเชฅเชพเชชเชฟเชค เชฅเชพเชฏ เชเซ, เชคเซเชฏเชพเชฐเซ เชเซเชฐเชพเชจเซเชธเชชเซเชฐเซเช เชเซเช เชเชจเชฐเซเช เชฅเชพเชฏ เชเซ (เชเชจเชเซเชฐเชฟเชชเซเชถเชจ เชฎเชพเชเซ เชเช เช เชฒเช เชเซ, เชชเซเชฐเชฎเชพเชฃเซเชเชฐเชฃ เชฎเชพเชเซ, เชฆเชฐเซเช เชชเชเซเชทเซ เชฎเชพเชเซ), เช เชจเซ เชเซเชฐเชพเชธเชถเซเชชเชฐเชจเซ MAC เชจเซ เชกเชฟเชเซเชฐเชฟเชชเซเช เชเชฐเชตเชพ เช เชจเซ เชคเชชเชพเชธเชตเชพ เชฎเชพเชเซ เชชเซเชฐเชพเชฐเชเชญ เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ:
499 # Run text message sender, initialize transport decoder {{{ 500 key_initiator_enc = kdf.expand(b"transport-initiator-enc") 501 key_initiator_mac = kdf.expand(b"transport-initiator-mac") 502 key_responder_enc = kdf.expand(b"transport-responder-enc") 503 key_responder_mac = kdf.expand(b"transport-responder-mac") ... 509 asyncio.ensure_future(msg_sender( 510 peer_name, 511 key_initiator_enc, 512 key_initiator_mac, 513 writer, 514 )) 515 encrypter = GOST3412Kuznechik(key_responder_enc).encrypt 516 macer = GOST3412Kuznechik(key_responder_mac).encrypt 517 # }}} 519 nonce_expected = 0 520 # Wait for test messages {{{ 521 while True: 522 data = await reader.read(MaxMsgLen) ... 530 msg, tail = Msg().decode(buf) ... 537 try: 538 await msg_receiver( 539 msg.value, 540 nonce_expected, 541 macer, 542 encrypter, 543 peer_name, 544 ) 545 except ValueError as err: 546 logging.warning("%s: %s", err) 547 break 548 nonce_expected += 1 549 # }}}
msg_sender เชเซเชฐเซเชเซเชจ เชนเชตเซ เชธเชเชฆเซเชถเชพเชเชจเซ TCP เชเชจเซเชเซเชถเชจ เชชเชฐ เชฎเซเชเชฒเชคเชพ เชชเชนเซเชฒเชพ เชเชจเซเชเซเชฐเชฟเชชเซเช เชเชฐเซ เชเซ. เชฆเชฐเซเช เชธเชเชฆเซเชถเชฎเชพเช เชเชเชตเชฟเชง เชฐเซเชคเซ เชตเชงเชคเซ เชเชคเซ เชจเซเชจเซเชธ เชนเซเชฏ เชเซ, เชเซ เชเซเชฏเชพเชฐเซ เชเชพเชเชจเซเชเชฐ เชฎเซเชกเชฎเชพเช เชเชจเซเชเซเชฐเชฟเชชเซเช เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชคเซเชฏเชพเชฐเซ เชเชฐเชเชญ เชตเซเชเซเชเชฐ เชชเชฃ เชนเซเชฏ เชเซ. เชฆเชฐเซเช เชธเชเชฆเซเชถ เช เชจเซ เชธเชเชฆเซเชถ เชฌเซเชฒเซเชเชจเซ เช เชฒเช เชเชพเชเชจเซเชเชฐ เชเชฟเชเชฎเชค เชนเซเชตเชพเชจเซ เชเชพเชคเชฐเซ เชเชชเชตเชพเชฎเชพเช เชเชตเซ เชเซ.
async def msg_sender(peer_name: str, key_enc: bytes, key_mac: bytes, writer) -> None: nonce = 0 encrypter = GOST3412Kuznechik(key_enc).encrypt macer = GOST3412Kuznechik(key_mac).encrypt in_queue = IN_QUEUES[peer_name] while True: text = await in_queue.get() if text is None: break ciphertext = ctr( encrypter, KUZNECHIK_BLOCKSIZE, text.encode("utf-8"), long2bytes(nonce, 8), ) payload = MsgTextPayload(( ("nonce", Integer(nonce)), ("ciphertext", OctetString(ciphertext)), )) mac_tag = mac(macer, KUZNECHIK_BLOCKSIZE, payload.encode()) writer.write(Msg(("text", MsgText(( ("payload", payload), ("payloadMac", MAC(mac_tag)), )))).encode()) nonce += 1
เชเชตเชจเชพเชฐเชพ เชธเชเชฆเซเชถเชพเช msg_receiver เชเซเชฐเซเชเซเชจ เชฆเซเชตเชพเชฐเชพ เชชเซเชฐเชเซเชฐเชฟเชฏเชพ เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ, เชเซ เชชเซเชฐเชฎเชพเชฃเซเชเชฐเชฃ เช เชจเซ เชกเชฟเชเซเชฐเชฟเชชเซเชถเชจเชจเซ เชนเซเชจเซเชกเชฒ เชเชฐเซ เชเซ:
async def msg_receiver( msg_text: MsgText, nonce_expected: int, macer, encrypter, peer_name: str, ) -> None: payload = msg_text["payload"] if int(payload["nonce"]) != nonce_expected: raise ValueError("unexpected nonce value") mac_tag = mac(macer, KUZNECHIK_BLOCKSIZE, payload.encode()) if not compare_digest(mac_tag, bytes(msg_text["payloadMac"])): raise ValueError("invalid MAC") plaintext = ctr( encrypter, KUZNECHIK_BLOCKSIZE, bytes(payload["ciphertext"]), long2bytes(nonce_expected, 8), ) text = plaintext.decode("utf-8") await OUT_QUEUES[peer_name].put(text)
เชจเชฟเชทเซเชเชฐเซเชท
GOSTIM เชจเซ เชเชชเชฏเซเช เชซเชเซเชค เชถเซเชเซเชทเชฃเชฟเช เชนเซเชคเซเช เชฎเชพเชเซ เชเชฐเชตเชพเชจเซ เชเซ (เชเชพเชฐเชฃ เชเซ เชคเซ เชเชเชพเชฎเชพเช เชเชเซเช เชชเชฐเซเชเซเชทเชฃเซ เชฆเซเชตเชพเชฐเชพ เชเชตเชฐเซ เชฒเซเชตเชพเชฎเชพเช เชเชตเชคเซเช เชจเชฅเซ)! เชชเซเชฐเซเชเซเชฐเชพเชฎเชจเซ เชธเซเชฐเซเชธ เชเซเชก เชกเชพเชเชจเชฒเซเชก เชเชฐเซ เชถเชเชพเชฏ เชเซ
เช เชนเซเช (ะกััะธะฑะพะณ-256 ั ัั: 995bbd368c04e50a481d138c5fa2e43ec7c89bc77743ba8dbabee1fde45de120). ะะฐะบ ะธ ะฒัะต ะผะพะธ ะฟัะพะตะบัั, ัะธะฟะฐGoGOST ,PyDERASN ,เชเชจ.เชเชจ.เชธเซ.เชชเซ. ,GoVPN , GOSTIM เชธเชเชชเซเชฐเซเชฃเชชเชฃเซ เชเซเชฎเชซเชค เชธเซเชซเซเชเชตเซเชฐ , เชถเชฐเชคเซ เชนเซเช เชณ เชตเชฟเชคเชฐเชฟเชคGPLv3 + .เชธเซเชฐเซเชเซเช เชฎเชพเชคเซเชตเซเชต ,เชธเชพเชฏเชซเชฐเชชเชเช , เชธเชญเซเชฏSPO เชซเชพเชเชจเซเชกเซเชถเชจ , Python/Go เชตเชฟเชเชพเชธเชเชฐเซเชคเชพ, เชฎเซเชเซเชฏ เชจเชฟเชทเซเชฃเชพเชคFSUE "STC "เชเชเชฒเชพเชธ" . - GOST R เชจเซ เชเชชเชฏเซเช เชธเชนเซ เชฎเชพเชเซ เชฅเชพเชฏ เชเซ
เชธเซเชฐเซเชธ: www.habr.com