GOSTIM: P2P F2F E2EE IM ููŠ ู„ูŠู„ุฉ ูˆุงุญุฏุฉ ู…ุน ุชุดููŠุฑ GOST

ุจุตูุชูŠ ู…ุทูˆุฑู‹ุง ู„ู…ูƒุชุจุฉ 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 ::= 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 (ุงู„ุชูŠ ูŠุชู… ููŠู‡ุง ู†ู‚ู„ ุงุณู… ุงู„ู…ุญุงูˆุฑ). ุงู„ุขู† ูŠุจุฏูˆ ุงู„ุฃู…ุฑ ู…ุนู‚ุฏู‹ุง ุŒ ู„ูƒู†ู‡ ุชุญุฏู ู„ู„ู…ุณุชู‚ุจู„.

      โ”Œโ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”
      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 # 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 # }}} 

ู†ุชุญู‚ู‚ ู…ู† ุฃู† ุงุณู… ุงู„ุดุฎุต ุงู„ุฐูŠ ู†ุชุญุฏุซ ู…ุนู‡ ู…ุนุฑูˆู ู„ู†ุง. ุฅุฐุง ู„ู… ูŠูƒู† ูƒุฐู„ูƒ ุŒ ุซู… ู‚ุทุน ุงู„ุงุชุตุงู„. ู†ุชุญู‚ู‚ ู…ู…ุง ุฅุฐุง ูƒู†ุง ู‚ุฏ ุฃู†ุดุฃู†ุง ุจุงู„ูุนู„ ุงุชุตุงู„ู‹ุง ู…ุนู‡ (ุฃุนุทู‰ ุงู„ู…ุญุงูˆุฑ ุงู„ุฃู…ุฑ ู…ุฑุฉ ุฃุฎุฑู‰ ู„ู„ุงุชุตุงู„ ุจู†ุง) ูˆุฅุบู„ุงู‚ู‡. ูŠุชู… ูˆุถุน ุณู„ุงุณู„ 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 # 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 ูˆู†ูˆู‚ู ุชุดุบูŠู„ corgine msg_sender (ุนู† ุทุฑูŠู‚ ุฅุฑุณุงู„ ุจู„ุง ุฅู„ู‰ ู‚ุงุฆู…ุฉ ุงู†ุชุธุงุฑ OUT_QUEUES).

  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) 

ุฏุนู†ุง ู†ุนูˆุฏ ุฅู„ู‰ ุงู„ุฑู…ุฒ ุงู„ุฑุฆูŠุณูŠ. ุจุนุฏ ุฅู†ุดุงุก ุฌู…ูŠุน 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 # 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 ู…ุน 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) # 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 , , (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 # 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() 

    • Msg ;
    • handshake1;
    • ;
    • 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- (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 # }}} 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 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 # 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-. 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-, ยซ โ€žโ€œ .

Source: https://habr.com/ru/post/ar452200/


All Articles