ุจุตูุชู
ู
ุทูุฑูุง ูู
ูุชุจุฉ
PyGOST (
ุจุฏุงูุงุช ุชุดููุฑ GOST ูู Python ุงูุฎุงูุต) ุ ุบุงูุจูุง ู
ุง ุฃุญุตู ุนูู ุฃุณุฆูุฉ ุญูู ููููุฉ ุชูููุฐ ุฃุจุณุท ุงูุฑุณุงุฆู ุงูุขู
ูุฉ ุนูู ุฑูุจุชู. ูุนุชุจุฑ ุงููุซูุฑูู ุฃู ุงูุชุดููุฑ ุงูู
ุทุจู ุฃู
ุฑ ุจุณูุท ุฅูู ุญุฏ ู
ุง ุ ูุณุชููู ู
ูุงูู
ุฉ. encrypt () ุฅูู ุชุดููุฑ ุงูุจููู ูุงููุฉ ูุฅุฑุณุงููุง ุจุฃู
ุงู ุนุจุฑ ููุงุฉ ุงุชุตุงู. ูุนุชูุฏ ุงูุจุนุถ ุงูุขุฎุฑ ุฃู ุงูุชุดููุฑ ุงูู
ุทุจู ูู ู
ุตูุฑ ุนุฏุฏ ูููู ุ ูู
ู ุงูู
ูุจูู ุฃู ุงูุดุฑูุงุช ุงูุบููุฉ ู
ุซู Telegram ู
ุน ุฃููู
ุจูุงุฏ ุงูุฑูุงุถูุงุช
ูุง ุชุณุชุทูุน ุชุทุจูู ุจุฑูุชูููู ุขู
ู.
ูู ูุฐุง ุฏูุนูู ุฅูู ูุชุงุจุฉ ูุฐู ุงูู
ูุงูุฉ ูุฅุธูุงุฑ ุฃู ุชูููุฐ ุจุฑูุชููููุงุช ุงูุชุดููุฑ ูุงูุชุฑุงุณู ุงูููุฑู ุงูุขู
ู ููุณ ู
ูู
ุฉ ุตุนุจุฉ. ูู
ุน ุฐูู ุ ูุฅู ุงุจุชูุงุฑ ุจุฑูุชููููุงุช ุงูู
ุตุงุฏูุฉ ูุงูุงุชูุงู ุงูุฑุฆูุณูุฉ ูุง ูุณุชุญู ูู ูุฐุง ุงูุนูุงุก.
ุณูุชู
ูุชุงุจุฉ ุงูู
ูุงู ุจุฑุณุงูุฉ ููุฑูุฉ
ู
ุดูุฑุฉ ู
ู ูุธูุฑ ุฅูู ูุธูุฑ ุ
ูุตุฏูู ุฅูู ุตุฏูู ุ
ู
ุดูุฑุฉ ู
ู ุทุฑู ุฅูู ุทุฑู ู
ุน ู
ุตุงุฏูุฉ
SIGMA-I ูุจุฑูุชูููู ุงุชูุงู ุงูู
ูุชุงุญ (ุจูุงุกู ุนูู ุชุทุจูู
IPsec IKE ) ุ ุจุงุณุชุฎุฏุงู
ุฎูุงุฑุฒู
ูุงุช ุชุดููุฑ GOST ุญุตุฑููุง ู
ูุชุจุฉ PyGOST ู ุชุฑู
ูุฒ ASN.1 ููุฑุณุงุฆู ู
ุน ู
ูุชุจุฉ
PyDERASN (ุงูุชู
ูุชุจุช ุนููุง ู
ู ูุจู ). ุงูู
ุชุทูุจ ุงูุณุงุจู: ูุฌุจ ุฃู ูููู ุงูุฃู
ุฑ ุจุณูุทูุง ููุบุงูุฉ ุจุญูุซ ูู
ูู ูุชุงุจุชู ู
ู ููุทุฉ ุงูุตูุฑ ูู ุฅุญุฏู ุงูููุงูู (ุฃู ููู
ุงูุนู
ู) ุ ูุฅูุง ูุฅูู ูู
ูุนุฏ ุจุฑูุงู
ุฌูุง ุจุณูุทูุง. ู
ู ุงูู
ุญุชู
ู ุฃูู ูุญุชูู ุนูู ุฃุฎุทุงุก ูุตุนูุจุงุช ุบูุฑ ุถุฑูุฑูุฉ ูุฃูุฌู ูุตูุฑ ุ ุจุงูุฅุถุงูุฉ ุฅูู ุฃู ูุฐุง ูู ุฃูู ุจุฑูุงู
ุฌ ูู ุจุงุณุชุฎุฏุงู
ู
ูุชุจุฉ asyncio.
ุชุตู
ูู
ุงูุฏุฑุฏุดุฉ
ูุชุจุฏุฃ ุ ุชุญุชุงุฌ ุฅูู ููู
ููู ุณูุจุฏู IM ูุฏููุง. ููุจุณุงุทุฉ ุ ููููู ุดุจูุฉ ู
ู ูุธูุฑ ุฅูู ูุธูุฑ ุ ุฏูู ุฃู ุงูุชุดุงู ููู
ุดุงุฑููู. ุณูุดูุฑ ุดุฎุตููุง ุฅูู ุงูุนููุงู: ุงูู
ููุฐ ุงูุฐู ุณูุชู
ุงูุงุชุตุงู ุจู ููุชูุงุตู ู
ุน ุงูู
ุญุงูุฑ.
ุฃููู
ุฃูู ูู ุงูููุช ุงูุญุงูู ุ ูุนุฏ ุงูุชุฑุงุถ ุชููุฑ ุงูุงุชุตุงู ุงูู
ุจุงุดุฑ ุจูู ุฌูุงุฒู ูู
ุจููุชุฑ ุชุนุณูููู ุฃุญุฏ ุงููููุฏ ุงูู
ูู
ุฉ ุนูู ุชุทุจูู ุงูุฑุณุงุฆู ุงูููุฑูุฉ ูู ุงูู
ู
ุงุฑุณุฉ ุงูุนู
ููุฉ. ูููู ููู
ุง ุฒุงุฏ ุนุฏุฏ ุงูู
ุทูุฑูู ุงูุฐูู ุณูููุฐูู ุฌู
ูุน ุฃููุงุน ุนูุงุฒ NAT-traversal ุ ููู
ุง ุจูููุง ุนูู ุงูุฅูุชุฑูุช IPv4 ุ ู
ุน ุงุญุชู
ุงู ู
ุญุจุท ููุงุชุตุงู ุจูู ุฃุฌูุฒุฉ ุงููู
ุจููุชุฑ ุงูุชุนุณููุฉ. ุญุณููุง ุ ุฅูู ุฃู ู
ุฏู ูู
ููู ุชุญู
ู ููุต IPv6 ูู ุงูู
ูุฒู ููู ุงูุนู
ูุ
ุณูููู ูุฏููุง ุดุจูุฉ ู
ู ุตุฏูู ุฅูู ุตุฏูู: ูุฌุจ ุฃู ุชููู ุฌู
ูุน ุงูู
ุญุงูุฑูู ุงูู
ุญุชู
ููู ู
ุนุฑููุฉ ู
ุณุจููุง. ุฃููุงู ุ ุฅูู ูุจุณุท ูู ุดูุก ุฅูู ุญุฏ ูุจูุฑ: ูุฏู
ููุณู ุ ุฃู ูุฌุฏ ุฃู ูู
ูุฌุฏ ุงุณู
ูุง / ู
ูุชุงุญูุง ุ ุฃู ุบูุฑ ู
ุชุตู ุฃู ู
ุณุชู
ุฑ ูู ุงูุนู
ู ุ ูู
ุนุฑูุฉ ุงูู
ุญุงูุฑ. ุซุงููุงู ุ ูู ุงูุญุงูุฉ ุงูุนุงู
ุฉ ุ ุฅูู ุขู
ู ููุณุชุจุนุฏ ุงูุนุฏูุฏ ู
ู ุงููุฌู
ุงุช.
ุณุชููู ูุงุฌูุฉ ุงูู
ุฑุงุณูุฉ ุงูููุฑูุฉ ูุฑูุจุฉ ู
ู ุงูุญููู ุงูููุงุณูููุฉ
ููู
ุดุงุฑูุน ุบูุฑ ุงูู
ูู
ูุณุฉ ุ ูุงูุชู ุฃุญุจูุง ุญููุง ูููุณูุชูุง ูููุณูุชูุง ูู ูุธุงู
Unix-way. ูููู
ุจุฑูุงู
ุฌ IM ููู ู
ุญุงูุฑ ุจุฅูุดุงุก ุฏููู ูุญุชูู ุนูู ุซูุงุซุฉ ู
ุขุฎุฐ ูููุทุงู Unix:
- ูู - ูุชู
ุชุณุฌูู ุงูุฑุณุงุฆู ุงูู
ุฑุณูุฉ ุฅูู ุงูู
ุญุงูุฑ ูููุง ุ
- ุงูุฑุณุงุฆู ุงูุฎุงุฑุฌูุฉ ุงููุงุฑุฏุฉ ู
ู ุงูู
ุญุงูุฑ ุชุชู
ูุฑุงุกุชูุง ู
ูู ุ
- ุงูุญุงูุฉ - ู
ู ุฎูุงู ุงููุฑุงุกุฉ ุ ุณููุชุดู ู
ุง ุฅุฐุง ูุงู ุงูู
ุญุงูุฑ ู
ุชุตู ุงูุขู ุ ูุนููุงู / ู
ููุฐ ุงูุงุชุตุงู.
ุจุงูุฅุถุงูุฉ ุฅูู ุฐูู ุ ูุชู
ุฅูุดุงุก ู
ุฃุฎุฐ ุชูุตูู conn ุ ููุชุจ ุฅูู ุฃู ู
ููุฐ ู
ุถูู ุ ูุจุฏุฃ ูู ุงูุงุชุตุงู ุจู
ุญุงูุฑ ุจุนูุฏ.
| - ุฃููุณ
| | - ูู
| | - ุฎุงุฑุฌ
| `- ุงูุฏููุฉ
| - ุจูุจ
| | - ูู
| | - ุฎุงุฑุฌ
| `- ุงูุฏููุฉ
`- ููู
ูุชูุญ ูู ูุฐุง ุงูููุฌ ุฅุฌุฑุงุก ุชุทุจููุงุช ู
ุณุชููุฉ ูููู ุงูุฑุณุงุฆู ุงูููุฑูุฉ ููุงุฌูุฉ ุงูู
ุณุชุฎุฏู
ุ ูุฃูู ูุง ููุฌุฏ ุตุฏูู ููุฐูู ูุงูููู ุ ููู ูุฑุถู ุงูุฌู
ูุน. ุจุงุณุชุฎุฏุงู
tmux ู / ุฃู
multitail ุ ูู
ููู ุงูุญุตูู ุนูู ูุงุฌูุฉ ู
ุชุนุฏุฏุฉ ุงูููุงูุฐ ู
ุน ุชุณููุท ุงูุถูุก ุนูู ุจูุงุก ุงูุฌู
ูุฉ. ูู
ุน
rlwrap ุ ูู
ููู ุงูุญุตูู ุนูู ุณูุณูุฉ ู
ุชูุงููุฉ ู
ุน GNU Readline ูุฅุฏุฎุงู ุงูุฑุณุงุฆู.
ูู ุงููุงูุน ุ ุชุณุชุฎุฏู
ู
ุดุงุฑูุน suckless ู
ููุงุช FIFO. ุดุฎุตูุง ุ ูู
ุฃุณุชุทุน ุฃู ุฃููู
ููู ุฃู ุงูุนู
ู ุบูุฑ ุงูู
ุชุฒุงู
ู ู
ุน ุงูู
ููุงุช ุจุดูู ุชูุงูุณู ุฏูู ุฑููุฒุฉ ู
ุตููุนุฉ ูุฏูููุง ู
ู ุณูุงุณู ุงูุฑุณุงุฆู ุงูู
ุญุฏุฏุฉ (ููุช ุฃุณุชุฎุฏู
ูุบุฉ
Go ูู
ุซู ูุฐู ุงูุฃุดูุงุก ููุชุฑุฉ ุทูููุฉ). ูุฐูู ุ ูุฑุฑุช ุฃู ุฃุญุตู ุนูู ู
ุขุฎุฐ ุงูู
ุฌุงู ูููููุณ. ูุณูุก ุงูุญุธ ุ ูุฐุง ูุฌุนู ู
ู ุงูู
ุณุชุญูู ุงูููุงู
ุตุฏู 2001: 470: dead :: babe 6666> conn. ููุฏ ูู
ุช ุจุญู ูุฐู ุงูู
ุดููุฉ ุจุงุณุชุฎุฏุงู
socat : echo 2001: 470: dead :: babe 6666 | socat - UNIX-CONNECT: connุ socat READLINE UNIX-CONNECT: alice / in.
ุจุฑูุชูููู ุบูุฑ ุขู
ู ุงูุฃููู
ูุณุชุฎุฏู
TCP ููุณููุฉ ููู: ุฅูู ูุถู
ู ุงูุชุณููู
ูุชุฑุชูุจู. ูุถู
ู UDP ูุง ูุฐุง ููุง ุฐุงู (ูุงูุฐู ุณูููู ู
ููุฏูุง ุนูุฏ ุชุทุจูู ุงูุชุดููุฑ) ุ ูุฏุนู
SCTP ูู Python ุฎุงุฑุฌ ุงูุตูุฏูู.
ูุณูุก ุงูุญุธ ุ ููุณ ูุฏู TCP ู
ูููู
ููุฑุณุงูุฉ ุ ูููู ููุท ุฏูู ู
ู ุงูุจุงูุช. ูุฐูู ุ ู
ู ุงูุถุฑูุฑู ุงูุชูุตู ุฅูู ุชูุณูู ููุฑุณุงุฆู ุจุญูุซ ูู
ูู ู
ุดุงุฑูุชูุง ููู
ุง ุจูููุง ูู ูุฐุง ุงูุฏูู. ูู
ูููุง ุฃู ููุงูู ุนูู ุงุณุชุฎุฏุงู
ุญุฑู ุชุบุฐูุฉ ุงูุณุทุฑ. ุจุงููุณุจุฉ ููู
ุจุชุฏุฆูู ุ ู
ู ุงูู
ูุงุณุจ ุ ุนูุฏู
ุง ูุจุฏุฃ ุจุชุดููุฑ ุฑุณุงุฆููุง ุ ูุฏ ูุธูุฑ ูุฐุง ุงูุฑู
ุฒ ูู ุฃู ู
ูุงู ูู ุงููุต ุงูู
ุดูุฑ. ูุฐูู ุ ุชุนุชุจุฑ ุงูุจุฑูุชููููุงุช ุดุงุฆุนุฉ ุนูู ุงูุดุจูุงุช ุ ุญูุซ ุชุฑุณู ุฃููุงู ุทูู ุงูุฑุณุงูุฉ ุจุงูุจุงูุช. ุนูู ุณุจูู ุงูู
ุซุงู ุ ูู Python ุ ููุฌุฏ ุฎุงุฑุฌ ุงูุตูุฏูู xdrlib ุ ูุงูุฐู ูุณู
ุญ ูู ุจุงูุนู
ู ุจุชูุณูู
XDR ู
ู
ุงุซู.
ูู ูุนู
ู ุจุดูู ุตุญูุญ ูููุก ู
ุน ูุฑุงุกุฉ TCP - ูุญู ูุจุณุท ุงูุดูุฑุฉ. ููุฑุฃ ุงูุจูุงูุงุช ู
ู ู
ุฃุฎุฐ ุงูุชูุตูู ูู ุญููุฉ ูุง ููุงุฆูุฉ ุญุชู ูููู
ุจูู ุชุดููุฑ ุงูุฑุณุงูุฉ ูุงู
ูุฉ. ูู
ููู ุฃูุถูุง ุงุณุชุฎุฏุงู
JSON ู
ุน XML ูุชูุณูู ููุฐุง ุงูููุฌ. ูููู ุนูุฏ ุฅุถุงูุฉ ุงูุชุดููุฑ ุ ุณูุชุนูู ุชูููุน ุงูุจูุงูุงุช ูุงูู
ุตุงุฏูุฉ ุนูููุง - ููุฐุง ุณูุชุทูุจ ุชู
ุซูููุง ู
ุชุทุงุจููุง ุจุงูุช ููู ูุงุฆูุงุช ุ ูุงูุชู ูุง ูููุฑูุง JSON / XML (ูุฏ ุชุฎุชูู ุนู
ููุงุช ุงูุชูุฑูุบ).
XDR ู
ูุงุณุจุฉ ูู
ุซู ูุฐู ุงูู
ูู
ุฉ ุ ูู
ุน ุฐูู ุ ุงุฎุชุฑุช ASN.1 ู
ุน DER ุชุฑู
ูุฒ ูู
ูุชุจุฉ
PyDERASN ุ ุญูุซ ุณูููู ูุฏููุง ูุงุฆูุงุช ุนุงููุฉ ุงูู
ุณุชูู ูู ู
ุชูุงูู ุงููุฏ ุ ูุงูุชู ุบุงูุจุง ู
ุง ุชููู ุฃูุซุฑ ู
ูุงุกู
ุฉ ููุนู
ู. ุจุฎูุงู bencode ุฃู
MessagePack ุฃู
CBOR ุ ูุฅู ASN.1 ุณุชููู
ุชููุงุฆููุง ุจุงูุชุญูู ู
ู ุตุญุฉ ุงูุจูุงูุงุช ู
ูุงุจู ู
ุฎุทุท ู
ุดูุฑ.
ุณุชููู ุงูุฑุณุงูุฉ ุงูู
ุณุชูู
ุฉ ูู Msg: ุฅู
ุง ูุต MsgText (ู
ุน ุญูู ูุต ูุงุญุฏ ุญุชู ุงูุขู) ุฃู ุฑุณุงูุฉ ู
ุตุงูุญุฉ MsgHandshake (ุงูุชู ูุชู
ูููุง ููู ุงุณู
ุงูู
ุญุงูุฑ). ุงูุขู ูุจุฏู ุงูุฃู
ุฑ ู
ุนูุฏูุง ุ ูููู ุชุญุฏู ููู
ุณุชูุจู.
โโโโโโโ โโโโโโโ
eerPeerAโ โPeerBโ
โโโโฌโโโ โโโโฌโโโ
sgMsgHandshake (IdA) โ
โโโโโโโโโโโโโโโโโโ >> โ
โ โ
sgMsgHandshake (IdB) โ
โ <โโโโโโโโโโโโโโโโโโ
โ โ
sg MsgText () โ
โโโโโโโโโโโโโโโโโโ >> โ
โ โ
sg MsgText () โ
โ <โโโโโโโโโโโโโโโโโโ
โ โ
ุงูุฏุฑุฏุดุฉ ุฏูู ุงูุชุดููุฑ
ูู
ุง ููุช ุ ุณูุชู
ุงุณุชุฎุฏุงู
ู
ูุชุจุฉ ุงูู
ุฒุงู
ูุฉ ูุฌู
ูุน ุงูุนู
ููุงุช ู
ุน ู
ุขุฎุฐ. ุฃุนูู ู
ุง ูุชููุนู ุนูุฏ ุงูุฅุทูุงู:
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(","))
ุญุฏุฏ ุงุณู
ู ุงูุฎุงุต (- ุงุณู
ู ุฃููุณ). ุชุณุฑุฏ ุงููุงุตูุฉ ุฌู
ูุน ุงูู
ุญุงูุฑูู ุงูู
ุชููุนูู (- ุฃุณู
ุงุกูู
bob ุ eve). ููู ู
ู ุงูู
ุญุงูุฑูู ุ ูุชู
ุฅูุดุงุก ุฏููู ู
ุน ู
ุขุฎุฐ ููููุณ ุ ููุฐูู coroutine ููู ูู ุ ุฎุงุฑุฌ ุ ุงูุฏููุฉ:
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()
ุนูุฏ ูุชุงุจุฉ ุนููุงู ุฅูู ู
ูุจุณ conn ุ ูุชู
ุฅุทูุงู ูุธููุฉ "ุงูุจุงุฏุฆ" ุงูุฎุงุตุฉ ุจุงูุงุชุตุงู:
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
ุซู
ููุชุธุฑ ุงุณุชุฌุงุจุฉ ู
ู ุงูุฌุงูุจ ุงูุจุนูุฏ. ู
ุญุงููุงุช ูู ุชุดููุฑ ุงูุงุณุชุฌุงุจุฉ ุงูู
ุชููุงุฉ ููููุง ููุธุงู
Msg ASN.1. ููุชุฑุถ ุฃู ุงูุฑุณุงูุฉ ุจุฃูู
ููุง ุณูุชู
ุฅุฑุณุงููุง ุจูุงุณุทุฉ ูุทุนุฉ TCP ูุงุญุฏุฉ ูุณูุณุชูู
ูุง ุชููุงุฆููุง ุนูุฏ ุงุณุชุฏุนุงุก .read (). ูุชุญูู ู
ู ุชููููุง ุฑุณุงูุฉ ุงูู
ุตุงูุญุฉ ุชู
ุงู
ูุง.
141
ูุชุญูู ู
ู ุฃู ุงุณู
ุงูุดุฎุต ุงูุฐู ูุชุญุฏุซ ู
ุนู ู
ุนุฑูู ููุง. ุฅุฐุง ูู
ููู ูุฐูู ุ ุซู
ูุทุน ุงูุงุชุตุงู. ูุชุญูู ู
ู
ุง ุฅุฐุง ููุง ูุฏ ุฃูุดุฃูุง ุจุงููุนู ุงุชุตุงููุง ู
ุนู (ุฃุนุทู ุงูู
ุญุงูุฑ ุงูุฃู
ุฑ ู
ุฑุฉ ุฃุฎุฑู ููุงุชุตุงู ุจูุง) ูุฅุบูุงูู. ูุชู
ูุถุน ุณูุงุณู Python ู
ุน ูุต ุงูุฑุณุงูุฉ ูู ูุงุฆู
ุฉ ุงูุชุธุงุฑ IN_QUEUES ุ ูููู ููุงู ููู
ุฉ ุฎุงุตุฉ ุจูุง ุ ูุงูุชู ุชุดูุฑ ุฅูู 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
ููุจู 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 ููููู ุชุดุบูู corgine msg_sender (ุนู ุทุฑูู ุฅุฑุณุงู ุจูุง ุฅูู ูุงุฆู
ุฉ ุงูุชุธุงุฑ OUT_QUEUES).
174 buf = b"" 175
ุฏุนูุง ูุนูุฏ ุฅูู ุงูุฑู
ุฒ ุงูุฑุฆูุณู. ุจุนุฏ ุฅูุดุงุก ุฌู
ูุน coroutines ุ ูู ููุช ุจุฏุก ุงูุจุฑูุงู
ุฌ ุ ุจุฏุฃูุง ุฎุงุฏู
TCP. ููู ุงุชุตุงู ุงูู
ูุดุฃุฉ ุ ููุงู ุงูู ูุฎูู coroutine ุงูู
ุณุชุฌูุจ.
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
ุจุฑูุชูููู ุขู
ู
ููุฏ ุญุงู ุงูููุช ูุชุฃู
ูู ุงุชุตุงูุงุชูุง. ู
ุงุฐุง ูุนูู ุจุงูุฃู
ู ูู
ุงุฐุง ูุฑูุฏ:
- ุณุฑูุฉ ุงูุฑุณุงุฆู ุงูู
ุฑุณูุฉ ุ
- ุตุญุฉ ูุณูุงู
ุฉ ุงูุฑุณุงุฆู ุงูู
ุฑุณูุฉ - ูุฌุจ ุงูุชุดุงู ุชุบููุฑูุง ุ
- ุงูุญู
ุงูุฉ ู
ู ูุฌู
ุงุช ุงูุฅุนุงุฏุฉ - ูุฌุจ ุฃู ูุชู
ุงููุดู ุนู ุญูููุฉ ุฃู ุงูุฑุณุงุฆู ูุฏ ููุฏุช ุฃู ุฃุนูุฏุช ุงูู
ุญุงููุฉ (ูููุฑุฑ ูุทุน ุงูุงุชุตุงู) ุ
- ุชุญุฏูุฏ ูุชูุซูู ุงูู
ุญุงูุฑูู ู
ู ุฎูุงู ู
ูุงุชูุญ ุนู
ูู
ูุฉ ู
ุฏููุนุฉ ู
ุณุจููุง - ููุฏ ูุฑุฑูุง ุณุงุจููุง ุฃููุง ูุตูุน ุดุจูุฉ ุฃุตุฏูุงุก ุฅูู ุตุฏูู. ููุท ุจุนุฏ ุงูู
ุตุงุฏูุฉ ุณูู ูููู
ู
ุน ู
ู ูุชูุงุตู ู
ุนู ุ
- ูุฌูุฏ ุฎุตุงุฆุต ุณุฑูุฉ ู
ุชูุฏู
ุฉ ููุฃู
ุงู
(PFS) - ูุง ููุจุบู ุฃู ูุคุฏู ุชูููู ู
ูุชุงุญ ุงูุชูููุน ุงูุทููู ูุฏููุง ุฅูู ุฅู
ูุงููุฉ ูุฑุงุกุฉ ุฌู
ูุน ุงูู
ุฑุงุณูุงุช ุงูุณุงุจูุฉ. ุชุณุฌูู ุญุฑูุฉ ุงูู
ุฑูุฑ ุงุนุชุฑุงุถ ุชุตุจุญ ุนุฏูู
ุฉ ุงููุงุฆุฏุฉ.
- ุตูุงุญูุฉ / ุตูุงุญูุฉ ุงูุฑุณุงุฆู (ุงูููู ูุงูู
ุตุงูุญุงุช) ููุท ุฎูุงู ููุณ ุฌูุณุฉ TCP. ูุง ูู
ูู ุฅุฏุฑุงุฌ ุฑุณุงุฆู ู
ููุนุฉ / ู
ุตุงุฏูุฉ ุจุดูู ุตุญูุญ ู
ู ุฌูุณุฉ ุฃุฎุฑู (ุญุชู ู
ุน ููุณ ุงูู
ุญุงูุฑ) ุ
- ูุฌุจ ุฃูุง ูุฑู ุงูู
ุฑุงูุจ ุงูุณูุจู ู
ุนุฑูุงุช ุงูู
ุณุชุฎุฏู
ุ ูุงูู
ูุงุชูุญ ุงูุนุงู
ุฉ ุงูู
ููููุฉ ููุชุฑุฉ ุทูููุฉ ุ ููุง ุชุฌุฒุฆุฉ ู
ููุง. ููุน ู
ู ุนุฏู
ุงููุดู ุนู ูููุชู ู
ู ุงูู
ุฑุงูุจ ุงูุณูุจู.
ู
ู ุงูู
ุซูุฑ ููุฏูุดุฉ ุฃู ูู ุดุฎุต ูุฑูุฏ ุชูุฑูุจูุง ุงูุญุตูู ุนูู ูุฐุง ุงูุญุฏ ุงูุฃุฏูู ูู ุฃู ุจุฑูุชูููู ูู
ุตุงูุญุฉ ุ ููุชู
ุชูููุฐ ุนุฏุฏ ูููู ุฌุฏูุง ู
ู ุงูุนูุงุตุฑ ุงูู
ุฐููุฑุฉ ุฃุนูุงู ูู ุงูููุงูุฉ ููุจุฑูุชููููุงุช ุงูู
ุญููุฉ. ุญุชู ุงูุขู ูู ูุฎุชุฑุน ุฃุดูุงุก ุฌุฏูุฏุฉ. ุจุงูุชุฃููุฏ ุฃูุตู ุจุงุณุชุฎุฏุงู
ุฅุทุงุฑ ุงูุถูุถุงุก ูุฅูุดุงุก ุจุฑูุชููููุงุช ุ ูููู ุฏุนูุง ูุฎุชุงุฑ ุดูุฆูุง ุฃูุซุฑ ุจุณุงุทุฉ.
ุงูุฃูุซุฑ ุดุนุจูุฉ ูู ุจุฑูุชูููููู:
- TLS ูู ุจุฑูุชูููู ู
ุนูุฏ ูู ุชุงุฑูุฎ ุทููู ู
ู ุงูุฃุฎุทุงุก ูุงูู
ุฏุงุฑุณ ูููุงุท ุงูุถุนู ูุถุนู ุงูุชูููุฑ ุ ูุงูุชุนููุฏ ูุฃูุฌู ุงููุตูุฑ (ูู
ุน ุฐูู ุ ูุง ููุทุจู ูุฐุง ูุซูุฑูุง ุนูู TLS 1.3). ููููุง ูุง ูุนุชุจุฑ ุฐูู ุจุณุจุจ ุงูุชุนููุฏ.
- IPsec ู
ุน IKE - ููุณ ูุฏูู ู
ุดุงูู ุชุดููุฑ ุฎุทูุฑุฉ ุ ุนูู ุงูุฑุบู
ู
ู ุฃููุง ููุณุช ุจุณูุทุฉ ุฃูุถูุง. ุฅุฐุง ูุฑุฃุช ุนู IKEv1 ู IKEv2 ุ ูุฅู ู
ุตุฏุฑูุง ูู ุจุฑูุชููููุงุช STS ู ISO / IEC IS 9798-3 ู SIGMA (SIGn-and-MAc) - ุจุณูุทุฉ ุจู
ุง ูููู ููุชูููุฐ ูู ู
ุณุงุก ูุงุญุฏ.
ููู SIGMA ุ ุจุงุนุชุจุงุฑูุง ุงูุญููุฉ ุงูุฃุฎูุฑุฉ ูู ุชุทููุฑ ุจุฑูุชููููุงุช STS / ISO ุ ุฌูุฏุฉุ ูุฑุถู ุฌู
ูุน ู
ุชุทูุจุงุชูุง (ุจู
ุง ูู ุฐูู "ุฅุฎูุงุก" ู
ุนุฑูุงุช ุงูู
ุชุญุงูุฑูู) ุ ูููุณ ูุฏูู ู
ุดุงูู ุชุดููุฑ ู
ุนุฑููุฉ. ุฅูู ุจุณูุท - ุฅุฒุงูุฉ ุนูุตุฑ ูุงุญุฏ ุนูู ุงูุฃูู ู
ู ุฑุณุงูุฉ ุงูุจุฑูุชูููู ุณูุคุฏู ุฅูู ุงูุนุฏุงู
ุงูุฃู
ู.
ุฏุนูุง ููุชูู ู
ู ุฃุจุณุท ุจุฑูุชูููู ู
ุญูู ุฅูู SIGMA. ุฅู ุงูุนู
ููุฉ ุงูุฃูุซุฑ ุฃูู
ูุฉ ุงูุชู ููุชู
ุจูุง ูู
ู
ุทุงุจูุฉ ุงูู
ูุงุชูุญ : ูุธููุฉ ูู ุงููุงุชุฌ ูุญุตู ููุง ุงูู
ุดุงุฑููู ูููุง ุนูู ููุณ ุงูููู
ุฉ ุงูุชู ูู
ูู ุงุณุชุฎุฏุงู
ูุง ูู
ูุชุงุญ ู
ุชู
ุงุซู. ุฏูู ุงูุฎูุถ ูู ุงูุชูุงุตูู: ูููู
ูู ุทุฑู ุจุฅูุดุงุก ุฒูุฌ ุฑุฆูุณู (ูุณุชุฎุฏู
ููุท ูู ููุณ ุงูุฌูุณุฉ) ุฒูุฌ ู
ูุงุชูุญ (ู
ูุงุชูุญ ุนุงู
ุฉ ูุฎุงุตุฉ) ุ ููุชุจุงุฏู ุงูู
ูุงุชูุญ ุงูุนุงู
ุฉ ุ ููุฏุนู ุฅูู ูุธููุฉ ุงูู
ุทุงุจูุฉ ุ ุงูุชู ูุฑุณููู ุฅูููุง ู
ูุชุงุญูู
ุงูุฎุงุต ูุงูู
ูุชุงุญ ุงูุนุงู
ููู
ุญุงูุฑ.
โโโโโโโ โโโโโโโ
eerPeerAโ โPeerBโ
โโโโฌโโโ โโโโฌโโโ
โ IdA ุ PubA โ โโโโโโโโโโโโโโโโโโโโโโ
โโโโโโโโโโโโโโโ >> P rPrvA ุ PubA = DHgen () โ
โ โ โโโโโโโโโโโโโโโโโโโโโ
โ IdBุ PubB โ โโโโโโโโโโโโโโโโโโโโโโ
โ <โโโโโโโโโโโโโโโโ โPrvB ุ PubB = DHgen () โ
โ โ โโโโโโโโโโโโโโโโโโโโโ
โโโโโ โโโโโโโโโโโโโโโโโโโโโ
= โKey = DH (PrvAุ PubB) โ
<โโโโ โโโโโโโโโคโโโโโโโโโโโโ
โ โ
โ โ
ูู
ูู ูุฃู ุดุฎุต ุงูุชุฏุฎู ูู ุงููุณุท ูุงุณุชุจุฏุงู ุงูู
ูุงุชูุญ ุงูุนุงู
ุฉ ุจู
ูุงุชูุญ ุฎุงุตุฉ ุจูู
- ูู ูุฐุง ุงูุจุฑูุชูููู ูุง ููุฌุฏ ู
ุตุงุฏูุฉ ููู
ุญุงูุฑูู. ุฅุถุงูุฉ ุชูููุน ู
ุน ู
ูุงุชูุญ ุทูููุฉ ุงูุนู
ุฑ.
โโโโโโโ โโโโโโโ
eerPeerAโ โPeerBโ
โโโโฌโโโ โโโโฌโโโ
โIdA ุ PubA ุ ุนูุงู
ุฉ (SignPrvA ุ (PubA)) โ โโโโโโโโโโโโโโโโโโโโโโโโโ
โ โ โ โ โ ign ign ign ign ign ign ign โ โ โ โ โ โ โ โ โ P P P Sign Sign Sign Sign Sign Sign Sign Sign Sign Sign Sign Sign Sign Sign Sign Sign Sign Sign Sign Sign Sign Sign load load load load load load load load load load load load load load load load load load load load load load load load load load load
r โ โPrvA ุ PubA = DHgen () โ
โ โ โโโ โ โ โ โ โ โ โ โ โ โ โ โ โ
โIdB ุ PubB ุ ุนูุงู
ุฉ (SignPrvB ุ (PubB)) โ โโโโโโโโโโโโโโโโโโโโโโโโโ
SignPrvB ุ SignPubB = load () โ
r โ โPrvB ุ PubB = DHgen () โ
โ โ โโโ โ โ โ โ โ โ โ โ โ โ โ โ โ
โโโโโ โโโโโโโโโโโโโโโโโโโโโโโ โ
ุชุญูู ู
ู (SignPubB ุ ...) โ โ
<โโโโ โKey = DH (PrvAุ PubB) โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ
ูู ูุนู
ู ูุฐุง ุงูุชูููุน ุ ูุฃูู ุบูุฑ ู
ุฑุชุจุท ุจุฌูุณุฉ ู
ุญุฏุฏุฉ. ูุฐู ุงูุฑุณุงุฆู ู
ูุงุณุจุฉ ุฃูุถูุง ููุฌูุณุงุช ู
ุน ุงูู
ุดุงุฑููู ุงูุขุฎุฑูู. ูุฌุจ ุงูุงุดุชุฑุงู ูู ุงูุณูุงู ุจุฃูู
ูู. ูุฐุง ููุฑุถ ุฃูุถูุง ุฅุถุงูุฉ ุฑุณุงูุฉ ุฃุฎุฑู ู
ู A.
ุจุงูุฅุถุงูุฉ ุฅูู ุฐูู ุ ู
ู ุงูุถุฑูุฑู ุฅุถุงูุฉ ุงูู
ุนุฑูู ุงูุฎุงุต ุจู ูุชูููุน ุ ูุฃูู ุ ูุฅูุง ุ ูู
ูููุง ุงุณุชุจุฏุงู IdXXX ูุฅุนุงุฏุฉ ุชูููุน ุงูุฑุณุงูุฉ ุจู
ูุชุงุญ ู
ุญุงูุฑ ู
ุนุฑูู ุขุฎุฑ. ูู
ูุน
ูุฌู
ุงุช ุงูุงูุนูุงุณ ุ ู
ู ุงูุถุฑูุฑู ุฃู ุชููู ุงูุนูุงุตุฑ ุงูู
ูุฌูุฏุฉ ุชุญุช ุงูุชูููุน ูู ุฃู
ุงูู ู
ุญุฏุฏุฉ ุจูุถูุญ ุจู
ุนูุงูุง: ุฅุฐุง ูุงูุช ุนูุงู
ุงุช A (PubA ุ PubB) ุ ููุฌุจ ุนูู B ุงูุชูููุน (PubB ุ PubA). ูุดูุฑ ูุฐุง ุฃูุถูุง ุฅูู ุฃูู
ูุฉ ุงุฎุชูุงุฑ ุจููุฉ ูุดูู ุงูุจูุงูุงุช ุงูู
ุชุณูุณูุฉ. ุนูู ุณุจูู ุงูู
ุซุงู ุ ูุชู
ูุฑุฒ ุงูู
ุฌู
ูุนุงุช ูู ุชุฑู
ูุฒ ASN.1 DER: SET OF (PubA ุ PubB) ุณุชููู ู
ุทุงุจูุฉ ูู SET OF (PubB ุ PubA).
โโโโโโโ โโโโโโโ
eerPeerAโ โPeerBโ
โโโโฌโโโ โโโโฌโโโ
โ IdA ุ PubA โ โโโโโโโโโโโโโโโโโโโโโโโโโโโ
ign โ โ โ โ โ โ ign ign ign ign ign ign ign ign โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ SignPubA = load () โ
r โ โPrvA ุ PubA = DHgen () โ
โ โ โโโ โ โ โ โ โ โ โ โ โ โ โ โ โ
โIdB ุ PubB ุ sign (SignPrvBุ (IdBุ PubAุ PubB)) โ โโโโโโโโโโโโโโโโโโโโโโโ
โ SignPrvB ุ โ SignPubB = load () โ
r โ โPrvB ุ PubB = DHgen () โ
โ โ โโโ โ โ โ โ โ โ โ โ โ โ โ โ โ
โ sign (SignPrvAุ (IdAุ PubBุ PubA)) โ โโโโโโโโโโโโโโโโโโโโโ
โ โ โ โ โ โ> ify ify ify ify ify ify ify ify ify ify ify ify ify ify ify ify ify ify ify SignPubB ุ ...) โ
โ โ โKey = DH (PrvAุ PubB) โ
โ โ โโโ โ โ โ โ โ โ โ โ โ โ
โ โ
ูู
ุน ุฐูู ุ ูู
ูุซุจุช ุจุนุฏ ุฃููุง ุทูุฑูุง ููุณ ุงูู
ูุชุงุญ ุงูู
ุดุชุฑู ููุฐู ุงูุฌูุณุฉ. ู
ู ุญูุซ ุงูู
ุจุฏุฃ ุ ูู
ููู ุงูุงุณุชุบูุงุก ุนู ูุฐู ุงูุฎุทูุฉ - ุณูููู ุงุชุตุงู ุงูููู ุงูุฃูู ุบูุฑ ุตุงูุญ ุ ููููุง ูุฑูุฏ ุฃูู ุนูุฏ ุงูุชู
ุงู ุงูู
ุตุงูุญุฉ ุ ุณูููู ู
ุชุฃูุฏูู ู
ู ุฃู ูู ุดูุก ุชู
ุงูุงุชูุงู ุนููู ุญููุง. ูู ุงูููุช ุงูุญุงูู ุ ูุฏููุง ุจูู ุฃูุฏููุง ุจุฑูุชูููู ISO / IEC IS 9798-3.
ูู
ูููุง ุงูุชูููุน ุนูู ุงูู
ูุชุงุญ ููุณู. ูุฐุง ุฃู
ุฑ ุฎุทูุฑ ุ ูุฃูู ู
ู ุงูู
ุญุชู
ู ุฃู ูููู ููุงู ุชุณุฑุจ ูู ุฎูุงุฑุฒู
ูุฉ ุงูุชูููุน ุงูู
ุณุชุฎุฏู
ุฉ (ุงุณู
ุญ ุจุช ููู ุชูููุน ุ ูููู ูุง ูุฒุงู ุชุณุฑุจ). ูู
ููู ุชุณุฌูู ุนูุงู
ุฉ ุชุฌุฒุฆุฉ ู
ู ุงูู
ูุชุงุญ ุงูุฐู ุชู
ุฅูุดุงุคู ุ ูููู ุญุชู ุชุณุฑุจ ุนูุงู
ุฉ ุชุฌุฒุฆุฉ ู
ู ุงูู
ูุชุงุญ ุงูุฐู ุชู
ุฅูุดุงุคู ูู
ูู ุฃู ูููู ุฐุง ููู
ุฉ ูู ูุฌูู
ุงูููุฉ ุงูุบุงุดู
ุฉ ุนูู ูุธููุฉ ุงูุชูููุฏ. ุชุณุชุฎุฏู
SIGMA ูุธููุฉ MAC ุชููู
ุจู
ุตุงุฏูุฉ ู
ุนุฑู ุงูู
ุฑุณู.
โโโโโโโ โโโโโโโ
eerPeerAโ โPeerBโ
โโโโฌโโโ โโโโฌโโโ
โ IdA ุ PubA โ โโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ > ign ignSignPrvA ุ SignPubA = load () โ
r โ โPrvA ุ PubA = DHgen () โ
โ โ โโโ โ โ โ โ โ โ โ โ โ โ โ โ โ
โIdB ุ PubB ุ ุนูุงู
ุฉ (SignPrvB ุ (PubA ุ PubB)) ุ MAC (IdB) โ โโโโโโโโโโโโโโโโโโโ
โ <โโโ โ โ โ โ โ โ โ โ โ โ โ ign ignSignPrvB ุ SignPubB = load () โ
r โ โPrvB ุ PubB = DHgen () โ
โ โ โโโ โ โ โ โ โ โ โ โ โ โ โ โ โ
โ โ โโโ โ โ โ โ โ โ โ โ โ โ
โ sign (SignPrvAุ (PubBุ PubA))ุ MAC (IdA) โ โKey = DH (PrvAุ PubB) โ
โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ > โ โ ุงูุชุญูู (ุงูู
ูุชุงุญ ุ IdB) โ
ify โ โ ุชุญูู (SignPubB ุ ...) โ
โ โ โโโ โ โ โ โ โ โ โ โ โ
โ โ
ูุชุญุณูู ุ ูุฏ ูุฑุบุจ ุงูุจุนุถ ูู ุฅุนุงุฏุฉ ุงุณุชุฎุฏุงู
ุงูู
ูุงุชูุญ ุงูู
ุคูุชุฉ ุงูุฎุงุตุฉ ุจูู
(ูุงูุชู ุ ุจุงูุทุจุน ุ ุฃู
ุฑ ู
ุญุฒู ุจุงููุณุจุฉ ูู PFS). ุนูู ุณุจูู ุงูู
ุซุงู ุ ุฃูุดุฃูุง ุฒูุฌูุง ุฑุฆูุณููุง ุ ุญุงูููุง ุงูุงุชุตุงู ุ ููู TCP ูู
ููู ู
ุชุงุญูุง ุฃู ู
ูุทูุนูุง ูู ู
ูุงู ู
ุง ูู ู
ูุชุตู ุงูุจุฑูุชูููู. ุฅูู ูุฃู
ุฑ ู
ุคุณู ุฃู ุชููู ู
ูุงุฑุฏ ุงูููู ูุงูู
ุนุงูุฌ ุงูุชู ุชููู ุนูู ุฒูุฌ ุฌุฏูุฏ. ูุฐูู ุ ููุฏู
ู
ุง ูุณู
ู ู
ูู ุชุนุฑูู ุงูุงุฑุชุจุงุท - ููู
ุฉ ุนุดูุงุฆูุฉ ุฒุงุฆูุฉ ู
ู ุดุฃููุง ุฃู ุชุญู
ู ู
ู ูุฌู
ุงุช ุงูุฅุนุงุฏุฉ ุงูุนุฑุถูุฉ ุงูู
ุญุชู
ูุฉ ุนูุฏ ุฅุนุงุฏุฉ ุงุณุชุฎุฏุงู
ุงูู
ูุงุชูุญ ุงูุนุงู
ุฉ ุงูู
ุคูุชุฉ. ูุธุฑูุง ููุฑุจุท ุจูู ู
ูู ุชุนุฑูู ุงูุงุฑุชุจุงุท ูุงูู
ูุชุงุญ ุงูุนู
ูู
ู ุงูู
ุคูุช ุ ูู
ูู ุฅุฒุงูุฉ ุงูู
ูุชุงุญ ุงูุนู
ูู
ู ููุทุฑู ุงูู
ูุงุจู ู
ู ุงูุชูููุน ุจุงุนุชุจุงุฑู ุบูุฑ ุถุฑูุฑู.
โโโโโโโ โโโโโโโ
eerPeerAโ โPeerBโ
โโโโฌโโโ โโโโฌโโโ
โ IdA ุ PubA ุ CookieA โ โโโโโโโโโโโโโโโโโโโโโโโโโโ
โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โโโโโโโโโโโโโโโโโโโโ >> โ โ SignPrvAุ SignPubA = load () โ
r โ โPrvA ุ PubA = DHgen () โ
โ โ โโโ โ โ โ โ โ โ โ โ โ โ โ โ โ
โIdBุ PubBุ CookieBุ sign (SignPrvBุ (CookieAุ CookieBุ PubB))ุ MAC (IdB) โ โ โ โ โ โ โ โโโโ
โ <โโโ โ โ โ โ โ โ โ โ โ โ โ ign ignSignPrvB ุ SignPubB = load () โ
r โ โPrvB ุ PubB = DHgen () โ
โ โ โโโ โ โ โ โ โ โ โ โ โ โ โ โ โ
โ โ โโโ โ โ โ โ โ โ โ โ โ
โ sign (SignPrvA ุ (CookieB ุ CookieA ุ PubA)) ุ MAC (IdA) DH Key = DH (PrvAุ PubB) โ
โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ ify ify ify ify ify ify ify ify ify ify ify Verify (Keyุ IdB) โ
ify โ โ ุชุญูู (SignPubB ุ ...) โ
โ โ โโโ โ โ โ โ โ โ โ โ โ โ
โ โ
ุฃุฎูุฑูุง ุ ูุฑุบุจ ูู ุงูุญุตูู ุนูู ุฎุตูุตูุฉ ู
ูุนุฑููุงุช ุงูู
ุญุงูุฑ ูุฏููุง ู
ู ู
ุฑุงูุจ ุณูุจู. ููููุงู
ุจุฐูู ุ ุชูุชุฑุญ SIGMA ุฃููุงู ุชุจุงุฏู ู
ูุงุชูุญ ุณุฑูุนุฉ ุงูุฒูุงู ุ ูุงูุนู
ู ุนูู ู
ูุชุงุญ ุดุงุฆุน ูู
ุตุงุฏูุฉ ุฑุณุงุฆู ุงูู
ุตุงุฏูุฉ. ูุตู SIGMA ุฎูุงุฑูู:
- SIGMA-I - ูุญู
ู ุงูุจุงุฏุฆ ู
ู ุงููุฌู
ุงุช ุงููุดุทุฉ ุ ูุงูู
ุณุชุฌูุจ ู
ู ุงููุฌู
ุงุช ุงูุณูุจูุฉ: ุงูุจุงุฏุฆ ูุตุงุฏู ุงูู
ุณุชุฌูุจ ูุฅุฐุง ูุงู ููุงู ุดูุก ุบูุฑ ู
ูุงุณุจ ุ ูุฅูู ูุง ูุนุทู ูููุชู. ูุนุทู ุงูู
ุฏุนู ุนููู ูููุชู ุฅุฐุง ุจุฏุฃุช ุจุฑูุชูููู ูุดุท ู
ุนู. ุงูู
ุฑุงูุจ ุงูุณูุจู ูู ูุนุฑู ุดูุฆูุง ุ
SIGMA-R - ูุญู
ู ุงูู
ุณุชุฌูุจ ู
ู ุงููุฌู
ุงุช ุงููุดุทุฉ ุ ุงูุจุงุฏุฆ ู
ู ุงูู
ุจูู ููู
ุฌููู. ูู ุดูุก ุนูุณ ุฐูู ุชู
ุงู
ูุง ุ ูููู ูู ูุฐุง ุงูุจุฑูุชูููู ูุชู
ุจุงููุนู ุฅุฑุณุงู ุฃุฑุจุน ุฑุณุงุฆู ู
ุตุงูุญุฉ.
ูุฎุชุงุฑ SIGMA-I ุฃูุซุฑ ุดุจูุงู ุจู
ุง ูุชููุนู ู
ู ุงูุฃุดูุงุก ุงูู
ุนุชุงุฏุฉ ู
ู ุงูุฎุงุฏู
-ุงูุนู
ูู: ููุท ุงูุฎุงุฏู
ุงูู
ุตุงุฏู ุนููู ูุชุนุฑู ุนูู ุงูุนู
ูู ุ ููุนุฑู ุงูุฌู
ูุน ุงูุฎุงุฏู
ุนูู ุฃู ุญุงู. ุจุงูุฅุถุงูุฉ ุฅูู ุฃูู ู
ู ุงูุฃุณูู ุชูููุฐู ุจุณุจุจ ุนุฏุฏ ุฑุณุงุฆู ุงูู
ุตุงูุญุฉ ุฃูู. ูู ู
ุง ูุถููู ุฅูู ุงูุจุฑูุชูููู ูู ุชุดููุฑ ุฌุฒุก ุงูุฑุณุงูุฉ ูููู ุงูู
ุนุฑู A ุฅูู ุงูุฌุฒุก ุงูู
ุดูุฑ ู
ู ุงูุฑุณุงูุฉ ุงูุฃุฎูุฑุฉ:
โโโโโโโ โโโโโโโ
eerPeerAโ โPeerBโ
โโโโฌโโโ โโโโฌโโโ
โ PubA ุ CookieA โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ ign ign ign ign ign ign ign ign ign ign ุุ ุุ ุุ ุุ ุุ ุุ ุุ ุุ ุุ ุุ ุุ ุุ ุุ ุุ ุุ ุุ ุุ ุุ ุุ ุุ ุุ ุุ Sign Sign Sign Sign Sign Sign Sign Sign Sign Sign Sign Sign Sign Sign Sign Sign Sign Sign Sign Sign Sign Sign ((((((((((((
r โ โPrvA ุ PubA = DHgen () โ
โ โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โPubB, CookieB, Enc((IdB, sign(SignPrvB, (CookieA, CookieB, PubB)), MAC(IdB))) โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ<โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โSignPrvB, SignPubB = load()โ
โ โ โPrvB, PubB = DHgen() โ
โ โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ โ โโโโโโโโโโโโโโโโโโโโโโโ
โ Enc((IdA, sign(SignPrvA, (CookieB, CookieA, PubA)), MAC(IdA))) โ โKey = DH(PrvA, PubB) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ>โ โverify(Key, IdB) โ
โ โ โverify(SignPubB, ...)โ
โ โ โโโโโโโโโโโโโโโโโโโโโโโ
โ โ
- 34.10-2012 256- .
- 34.10-2012 VKO.
- MAC CMAC. , 34.13-2015. โ (34.12-2015).
- . -256 (34.11-2012 256 ).
. . : , , (MAC) , . , , . , , ? . , KDF (key derivation function). , - : HKDF , . , Python , hkdf . HKDF HMAC , , , -. Python Wikipedia . 34.10-2012, - -256. , :
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)
HandshakeTBS โ , (to be signed). HandshakeTBE โ , (to be encrypted). ukm MsgHandshake1. 34.10 VKO, , UKM (user keying material) โ .
, ( , , ).
, - . JSON :
{ "our": { "prv": "21254cf66c15e0226ef2669ceee46c87b575f37f9000272f408d0c9283355f98", "pub": "938c87da5c55b27b7f332d91b202dbef2540979d6ceaa4c35f1b5bfca6df47df0bdae0d3d82beac83cec3e353939489d9981b7eb7a3c58b71df2212d556312a1" }, "their": { "alice": "d361a59c25d2ca5a05d21f31168609deeec100570ac98f540416778c93b2c7402fd92640731a707ec67b5410a0feae5b78aeec93c4a455a17570a84f2bc21fce", "bob": "aade1207dd85ecd283272e7b69c078d5fae75b6e141f7649ad21962042d643512c28a2dbdc12c7ba40eb704af920919511180c18f4d17e07d7f5acd49787224a" } }
our โ , . their โ . 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)
34.10 โ . 256- 256- . PyGOST , , (urandom(32)) , gost3410.prv_unmarshal(). , gost3410.public_key(). 34.10 โ , , gost3410.pub_marshal().
JSON , , , , gost3410.pub_unmarshal(). , . -256 gost34112012256.GOST34112012256(), hashlib -.
? , : cookie (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
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
UKM 64- (urandom(8)), , gost3410_vko.ukm_unmarshal(). VKO 34.10-2012 256- gost3410_vko.kek_34102012256() (KEK โ key encryption key).
256- . HKDF . GOST34112012256 hashlib , Hkdf . ( Hkdf) , - . kdf.expand() 256-, .
TBE TBS :
- MAC ;
- ;
- TBE ;
- ;
- MAC ;
- TBS , cookie . .
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
, 34.13-2015 34.12-2015. , MAC-. PyGOST gost3413.mac(). ( ), , , . hardcode- ? 34.12-2015 128- , 64- โ 28147-89, .
gost.3412.GOST3412Kuznechik(key) .encrypt()/.decrypt() , 34.13 . MAC : gost3413.mac(GOST3412Kuznechik(key).encrypt, KUZNECHIK_BLOCKSIZE, ciphertext). MAC- (==) , , , , BEAST TLS. Python 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, plaintext, iv). , . ( ), . handshake .
gost3410.verify() : ( GOSTIM ), ( , , ), 34.11-2012 .
, handshake2 , , : , .โฆ
456
, ( , , ), MAC-:
499
msg_sender , TCP-. nonce, . .
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 , NNCP , GoVPN , GOSTIM , GPLv3+ .
, , , Python/Go-, ยซ โโ .