GOSTIM: P2P F2F E2EE IM GOST เด•เตเดฐเดฟเดชเตโ€Œเดฑเตเดฑเต‹เด—เตเดฐเดพเดซเดฟ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด’เดฐเต เดธเดพเดฏเดพเดนเตเดจเดคเตเดคเดฟเตฝ

เด’เดฐเต เดกเต†เดตเดฒเดชเตเดชเตผ เด†เด•เตเดจเตเดจเดคเต เดชเตˆเด—เต‹เดธเตเดฑเตเดฑเต เดฒเตˆเดฌเตเดฐเดฑเดฟเด•เตพ (เดถเตเดฆเตเดงเดฎเดพเดฏ เดชเตˆเดคเตเดคเดฃเดฟเดฒเต† GOST เด•เตเดฐเดฟเดชเตโ€Œเดฑเตเดฑเต‹เด—เตเดฐเดพเดซเดฟเด•เต เดชเตเดฐเดฟเดฎเดฟเดฑเตเดฑเต€เดตเตเดธเต), เดฎเตเดŸเตเดŸเดฟเตฝ เดเดฑเตเดฑเดตเตเด‚ เดฒเดณเดฟเดคเดฎเดพเดฏ เดธเตเดฐเด•เตเดทเดฟเดคเดฎเดพเดฏ เดธเดจเตเดฆเต‡เดถเดฎเดฏเดฏเตโ€Œเด•เตเด•เตฝ เดŽเด™เตเด™เดจเต† เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เดพเด‚ เดŽเดจเตเดจเดคเดฟเดจเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเตเดณเตเดณ เดšเต‹เดฆเตเดฏเด™เตเด™เตพ เดŽเดจเดฟเด•เตเด•เต เดชเดฒเดชเตเดชเต‹เดดเตเด‚ เดฒเดญเดฟเด•เตเด•เตเด‚. เด…เดชเตเดฒเตˆเดกเต เด•เตเดฐเดฟเดชเตโ€Œเดฑเตเดฑเต‹เด—เตเดฐเดซเดฟ เดตเดณเดฐเต† เดฒเดณเดฟเดคเดฎเดพเดฃเต†เดจเตเดจเต เดชเดฒเดฐเตเด‚ เด•เดฐเตเดคเตเดจเตเดจเต, เด’เดฐเต เด•เดฎเตเดฎเตเดฏเต‚เดฃเดฟเด•เตเด•เต‡เดทเตป เดšเดพเดจเดฒเดฟเดฒเต‚เดŸเต† เดธเตเดฐเด•เตเดทเดฟเดคเดฎเดพเดฏเดฟ เด…เดฏเดฏเตโ€Œเด•เตเด•เดพเตป เด’เดฐเต เดฌเตเดฒเต‹เด•เตเด•เต เดธเตˆเดซเดฑเดฟเตฝ .encrypt() เดŽเดจเตเดจเต เดตเดฟเดณเดฟเดšเตเดšเดพเตฝ เดฎเดคเดฟเดฏเดพเด•เตเด‚. เด…เดชเตเดฒเตˆเดกเต เด•เตเดฐเดฟเดชเตโ€Œเดฑเตเดฑเต‹เด—เตเดฐเดซเดฟ เด•เตเดฑเดšเตเดšเต เดชเต‡เดฐเตเดŸเต† เดตเดฟเดงเดฟเดฏเดพเดฃเต†เดจเตเดจเต เดฎเดฑเตเดฑเตเดณเตเดณเดตเตผ เดตเดฟเดถเตเดตเดธเดฟเด•เตเด•เตเดจเตเดจเต, เด•เต‚เดŸเดพเดคเต† เด’เดณเดฟเดฎเตเดชเตเดฏเดพเดกเต-เด—เดฃเดฟเดคเดถเดพเดธเตเดคเตเดฐเดœเตเดžเดฐเตเดฎเดพเดฏเดฟ เดŸเต†เดฒเดฟเด—เตเดฐเดพเด‚ เดชเต‹เดฒเตเดณเตเดณ เดธเดฎเตเดชเดจเตเดจ เด•เดฎเตเดชเดจเดฟเด•เตพ เดธเตเดตเต€เด•เดพเดฐเตเดฏเดฎเดพเดฃเต. เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เดพเตป เด•เดดเดฟเดฏเดฟเดฒเตเดฒ เดธเตเดฐเด•เตเดทเดฟเดค เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เตพ.

เด•เตเดฐเดฟเดชเตโ€Œเดฑเตเดฑเต‹เด—เตเดฐเดพเดซเดฟเด•เต เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เดณเตเด•เดณเตเด‚ เดธเตเดฐเด•เตเดทเดฟเดคเดฎเดพเดฏ IM-เดฏเตเด‚ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเดคเต เด…เดคเตเดฐ เดฌเตเดฆเตเดงเดฟเดฎเตเดŸเตเดŸเตเดณเตเดณ เด•เดพเดฐเตเดฏเดฎเดฒเตเดฒเต†เดจเตเดจเต เด•เดพเดฃเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเดพเดฃเต เดˆ เดฒเต‡เด–เดจเด‚ เดŽเดดเตเดคเดพเตป เด‡เดคเต†เดฒเตเดฒเดพเด‚ เดŽเดจเตเดจเต† เดชเตเดฐเต‡เดฐเดฟเดชเตเดชเดฟเดšเตเดšเดคเต. เดŽเดจเตเดจเดฟเดฐเตเดจเตเดจเดพเดฒเตเด‚, เดจเดฟเด™เตเด™เดณเตเดŸเต† เดธเตเดตเดจเตเดคเด‚ เดชเตเดฐเดพเดฎเดพเดฃเต€เด•เดฐเดฃเดตเตเด‚ เดชเตเดฐเดงเดพเดจ เด•เดฐเดพเตผ เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เดณเตเด•เดณเตเด‚ เด•เดฃเตเดŸเตเดชเดฟเดŸเดฟเด•เตเด•เตเดจเตเดจเดคเต เดตเดฟเดฒเดฎเดคเดฟเด•เตเด•เตเดจเตเดจเดฟเดฒเตเดฒ.

GOSTIM: P2P F2F E2EE IM GOST เด•เตเดฐเดฟเดชเตโ€Œเดฑเตเดฑเต‹เด—เตเดฐเดพเดซเดฟ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด’เดฐเต เดธเดพเดฏเดพเดนเตเดจเดคเตเดคเดฟเตฝ
เดฒเต‡เด–เดจเด‚ เดŽเดดเตเดคเตเด‚ เดชเดฟเดฏเตผ เดŸเต เดชเดฟเดฏเตผ, เดธเตเดนเตƒเดคเตเดคเต-เดธเตเดนเตƒเดคเตเดคเต, เดŽเตปเดกเต-เดŸเต-เดŽเตปเดกเต เดŽเตปเด•เตเดฐเดฟเดชเตเดฑเตเดฑเต เดšเต†เดฏเตเดคเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต เดคเตฝเด•เตเดทเดฃ เดธเดจเตเดฆเต‡เดถเดตเดพเดนเด•เตป เดธเดฟเด—เตเดฎ-เด เดชเตเดฐเดพเดฎเดพเดฃเต€เด•เดฐเดฃเดตเตเด‚ เดชเตเดฐเดงเดพเดจ เด•เดฐเดพเตผ เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เดณเตเด‚ (เด…เดคเดฟเดจเตเดฑเต† เด…เดŸเดฟเดธเตเดฅเดพเดจเดคเตเดคเดฟเดฒเดพเดฃเต เด‡เดคเต เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเดคเต IPsec IKE), เดชเตเดฐเดคเตเดฏเต‡เด•เดฎเดพเดฏเดฟ GOST เด•เตเดฐเดฟเดชเตเดฑเตเดฑเต‹เด—เตเดฐเดพเดซเดฟเด•เต เด…เตฝเด—เต‹เดฐเดฟเดคเด™เตเด™เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต PyGOST เดฒเตˆเดฌเตเดฐเดฑเดฟเดฏเตเด‚ ASN.1 เดธเดจเตเดฆเต‡เดถ เดŽเตปเด•เต‹เดกเดฟเด‚เด—เต เดฒเตˆเดฌเตเดฐเดฑเดฟเดฏเตเด‚ PyDERASN (เด‡เดคเดฟเดจเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเต เดžเดพเตป เด‡เดคเดฟเดจเด•เด‚ เดฎเตเดฎเตเดชเต เดŽเดดเตเดคเดฟ). เด’เดฐเต เดฎเตเตปเดตเตเดฏเดตเดธเตเดฅ: เด‡เดคเต เดตเดณเดฐเต† เดฒเดณเดฟเดคเดฎเดพเดฏเดฟเดฐเดฟเด•เตเด•เดฃเด‚, เด…เดคเต เด’เดฐเต เดธเดพเดฏเดพเดนเตเดจเดคเตเดคเดฟเตฝ (เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดชเตเดฐเดตเตƒเดคเตเดคเดฟ เดฆเดฟเดตเดธเด‚) เด†เดฆเตเดฏเด‚ เดฎเตเดคเตฝ เดŽเดดเตเดคเดพเตป เด•เดดเดฟเดฏเตเด‚, เด…เดฒเตเดฒเดพเดคเตเดคเดชเด•เตเดทเด‚ เด‡เดคเต เด’เดฐเต เดฒเดณเดฟเดคเดฎเดพเดฏ เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฒเตเดฒ. เด‡เดคเดฟเดจเต เด’เดฐเตเดชเด•เตเดทเต‡ เดชเดฟเดถเด•เตเด•เตพ, เด…เดจเดพเดตเดถเตเดฏ เดธเด™เตเด•เต€เตผเดฃเดคเด•เตพ, เดชเต‹เดฐเดพเดฏเตเดฎเด•เตพ เดŽเดจเตเดจเดฟเดต เด‰เดฃเตเดŸเดพเดฏเดฟเดฐเดฟเด•เตเด•เดพเด‚, เด•เต‚เดŸเดพเดคเต† เด‡เดคเต เด…เดธเดฟเตปเดธเดฟเดฏเต‹ เดฒเตˆเดฌเตเดฐเดฑเดฟ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจ เดŽเดจเตเดฑเต† เด†เดฆเตเดฏเดคเตเดคเต† เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดพเดฃเต.

IM เดกเดฟเดธเตˆเตป

เด†เดฆเตเดฏเด‚, เดจเดฎเตเดฎเตเดŸเต† IM เดŽเด™เตเด™เดจเต†เดฏเดพเดฏเดฟเดฐเดฟเด•เตเด•เตเดฎเต†เดจเตเดจเต เดจเดฎเตเดฎเตพ เดฎเดจเดธเตเดธเดฟเดฒเดพเด•เตเด•เต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต. เดฒเดพเดณเดฟเดคเตเดฏเดคเตเดคเดฟเดจเดพเดฏเดฟ, เดชเด™เตเด•เต†เดŸเตเด•เตเด•เตเดจเตเดจเดตเดฐเต† เด•เดฃเตเดŸเต†เดคเตเดคเดพเดคเต† เดคเดจเตเดจเต† เด‡เดคเต เด’เดฐเต เดชเดฟเดฏเตผ-เดŸเต-เดชเดฟเดฏเตผ เดจเต†เดฑเตเดฑเตโ€Œเดตเตผเด•เตเด•เดพเดฏเดฟเดฐเดฟเด•เตเด•เดŸเตเดŸเต†. เดžเด™เตเด™เตพ เดตเตเดฏเด•เตเดคเดฟเดชเดฐเดฎเดพเดฏเดฟ เดเดคเต เดตเดฟเดฒเดพเดธเด‚ เดธเต‚เดšเดฟเดชเตเดชเดฟเด•เตเด•เตเด‚: เด‡เดจเตเดฑเตผเดฒเต‹เด•เตเด•เตเดŸเตเดŸเดฑเตเดฎเดพเดฏเดฟ เด†เดถเดฏเดตเดฟเดจเดฟเดฎเดฏเด‚ เดจเดŸเดคเตเดคเดพเตป เดฌเดจเตเดงเดฟเดชเตเดชเดฟเด•เตเด•เต‡เดฃเตเดŸ เดชเต‹เตผเดŸเตเดŸเต.

เดˆ เดธเดฎเดฏเดคเตเดคเต, เดฐเดฃเตเดŸเต เด…เดจเดฟเดฏเดจเตเดคเตเดฐเดฟเดคเดฎเดพเดฏ เด•เดฎเตเดชเตเดฏเต‚เดŸเตเดŸเดฑเตเด•เตพเด•เตเด•เดฟเดŸเดฏเดฟเตฝ เดจเต‡เดฐเดฟเดŸเตเดŸเตเดณเตเดณ เด†เดถเดฏเดตเดฟเดจเดฟเดฎเดฏเด‚ เดฒเดญเตเดฏเดฎเดพเดฃเต†เดจเตเดจ เด…เดจเตเดฎเดพเดจเด‚ เดชเตเดฐเดพเดฏเต‹เด—เดฟเด•เดฎเดพเดฏเดฟ IM-เดจเตเดฑเต† เดชเตเดฐเดฏเต‹เด—เด•เตเดทเดฎเดคเดฏเตเดŸเต† เด•เดพเดฐเตเดฏเดฎเดพเดฏ เดชเดฐเดฟเดฎเดฟเดคเดฟเดฏเดพเดฃเต†เดจเตเดจเต เดžเดพเตป เดฎเดจเดธเตเดธเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเต. เดŽเดจเตเดจเดพเตฝ เด•เต‚เดŸเตเดคเตฝ เดกเดตเดฒเดชเตเดชเตผเดฎเดพเตผ เดŽเดฒเตเดฒเดพเดคเตเดคเดฐเด‚ NAT-เดŸเตเดฐเดพเดตเต‡เดดเตเดธเตฝ เด•เตเดฐเดšเตเดšเตเด•เดณเตเด‚ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเต, เด…เดจเดฟเดฏเดจเตเดคเตเดฐเดฟเดคเดฎเดพเดฏ เด•เดฎเตเดชเตเดฏเต‚เดŸเตเดŸเดฑเตเด•เตพ เดคเดฎเตเดฎเดฟเดฒเตเดณเตเดณ เด†เดถเดฏเดตเดฟเดจเดฟเดฎเดฏเดคเตเดคเดฟเดจเตเดฑเต† เดจเดฟเดฐเดพเดถเดพเดœเดจเด•เดฎเดพเดฏ เดธเด‚เดญเดพเดตเตเดฏเดคเดฏเต‹เดŸเต† เดžเด™เตเด™เตพ IPv4 เด‡เดจเตเดฑเตผเดจเต†เดฑเตเดฑเดฟเตฝ เด•เต‚เดŸเตเดคเตฝ เด•เดพเดฒเด‚ เดจเดฟเดฒเดจเดฟเตฝเด•เตเด•เตเด‚. เดตเต€เดŸเตเดŸเดฟเดฒเตเด‚ เดœเต‹เดฒเดฟเดธเตเดฅเดฒเดคเตเดคเตเด‚ IPv6 เดจเตเดฑเต† เด…เดญเดพเดตเด‚ เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดŽเดคเตเดฐเดคเตเดคเต‹เดณเด‚ เดธเดนเดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเตเด‚?

เดžเด™เตเด™เตพเด•เตเด•เต เด’เดฐเต เดšเด™เตเด™เดพเดคเดฟ-เดธเตเดนเตƒเดคเตเดคเต เดจเต†เดฑเตเดฑเตโ€Œเดตเตผเด•เตเด•เต เด‰เดฃเตเดŸเดพเดฏเดฟเดฐเดฟเด•เตเด•เตเด‚: เดธเดพเดงเตเดฏเดฎเดพเดฏ เดŽเดฒเตเดฒเดพ เด‡เดจเตเดฑเตผเดฒเต‹เด•เตเด•เตเดŸเตเดŸเดฑเตเด•เดณเตเด‚ เดฎเตเตปเด•เต‚เดŸเตเดŸเดฟ เด…เดฑเดฟเดžเตเดžเดฟเดฐเดฟเด•เตเด•เดฃเด‚. เด’เดจเตเดจเดพเดฎเดคเดพเดฏเดฟ, เด‡เดคเต เดŽเดฒเตเดฒเดพเด‚ เดตเดณเดฐเต† เดฒเดณเดฟเดคเดฎเดพเด•เตเด•เตเดจเตเดจเต: เดžเด™เตเด™เตพ เดธเตเดตเดฏเด‚ เดชเดฐเดฟเดšเดฏเดชเตเดชเต†เดŸเตเดคเตเดคเดฟ, เดชเต‡เดฐเต / เด•เต€ เด•เดฃเตเดŸเต†เดคเตเดคเดฟ เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เด•เดฃเตเดŸเต†เดคเตเดคเดฟเดฏเดฟเดฒเตเดฒ, เดตเดฟเดšเตเด›เต‡เดฆเดฟเดšเตเดšเต เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดœเต‹เดฒเดฟเดฏเดฟเตฝ เดคเตเดŸเดฐเตเด•, เดธเด‚เดญเดพเดทเดฃเด•เตเด•เดพเดฐเดจเต† เด…เดฑเดฟเดฏเตเด•. เดฐเดฃเตเดŸเดพเดฎเดคเดพเดฏเดฟ, เดชเตŠเดคเตเดตเต‡, เด‡เดคเต เดธเตเดฐเด•เตเดทเดฟเดคเดตเตเด‚ เดชเดฒ เด†เด•เตเดฐเดฎเดฃเด™เตเด™เดณเตเด‚ เด‡เดฒเตเดฒเดพเดคเดพเด•เตเด•เตเดจเตเดจเต.

IM เด‡เดจเตเดฑเตผเดซเต‡เดธเต เด•เตเดฒเดพเดธเดฟเด•เต เดธเตŠเดฒเตเดฏเต‚เดทเดจเตเด•เตพเด•เตเด•เต เดธเดฎเต€เดชเดฎเดพเดฏเดฟเดฐเดฟเด•เตเด•เตเด‚ เดจเดฟเดทเตเด•เดณเด™เตเด•เดฎเดพเดฏ เดชเดฆเตเดงเดคเดฟเด•เตพ, เด…เดตเดฐเตเดŸเต† เดฎเดฟเดจเดฟเดฎเดฒเดฟเดธเดคเตเดคเดฟเดจเตเด‚ เดฏเตเดฃเดฟเด•เตเดธเต-เดตเต‡ เดซเดฟเดฒเต‹เดธเดซเดฟเด•เตเด•เตเด‚ เดžเดพเตป เดถเดฐเดฟเด•เตเด•เตเด‚ เด‡เดทเตเดŸเดชเตเดชเต†เดŸเตเดจเตเดจเต. IM เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เด“เดฐเต‹ เด‡เดจเตเดฑเตผเดฒเต‹เด•เตเด•เตเดŸเตเดŸเดฑเดฟเดจเตเด‚ เดฎเต‚เดจเตเดจเต Unix เดกเตŠเดฎเต†เดฏเตเตป เดธเต‹เด•เตเด•เดฑเตเดฑเตเด•เตพ เด‰เดณเตเดณ เด’เดฐเต เดกเดฏเดฑเด•เตเดŸเดฑเดฟ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเดจเตเดจเต:

  • เด‡เตป - เดธเด‚เดญเดพเดทเดฃเด•เตเด•เดพเดฐเดจเต เด…เดฏเดšเตเดš เดธเดจเตเดฆเต‡เดถเด™เตเด™เตพ เด…เดคเดฟเตฝ เดฐเต‡เด–เดชเตเดชเต†เดŸเตเดคเตเดคเดฟเดฏเดฟเดŸเตเดŸเตเดฃเตเดŸเต;
  • เด”เดŸเตเดŸเต - เด‡เดจเตเดฑเตผเดฒเต‹เด•เตเด•เตเดŸเตเดŸเดฑเดฟเตฝ เดจเดฟเดจเตเดจเต เดฒเดญเดฟเดšเตเดš เดธเดจเตเดฆเต‡เดถเด™เตเด™เตพ เด…เดคเดฟเตฝ เดจเดฟเดจเตเดจเต เดตเดพเดฏเดฟเด•เตเด•เตเดจเตเดจเต;
  • เดธเด‚เดธเตเดฅเดพเดจเด‚ - เด…เดคเดฟเตฝ เดจเดฟเดจเตเดจเต เดตเดพเดฏเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดฒเต‚เดŸเต†, เด‡เดจเตเดฑเตผเดฒเต‹เด•เตเด•เตเดŸเตเดŸเตผ เดจเดฟเดฒเดตเดฟเตฝ เดฌเดจเตเดงเดฟเดชเตเดชเดฟเดšเตเดšเดฟเดŸเตเดŸเตเดฃเตเดŸเต‹, เด•เดฃเด•เตเดทเตป เดตเดฟเดฒเดพเดธเด‚ / เดชเต‹เตผเดŸเตเดŸเต เดŽเดจเตเดจเดฟเดต เดžเด™เตเด™เตพ เด•เดฃเตเดŸเต†เดคเตเดคเตเดจเตเดจเต.

เด•เต‚เดŸเดพเดคเต†, เดนเต‹เดธเตเดฑเตเดฑเต เดชเต‹เตผเดŸเตเดŸเต เดŽเดดเตเดคเตเดจเตเดจเดคเดฟเดฒเต‚เดŸเต† เด’เดฐเต เด•เต‹เตบ เดธเต‹เด•เตเด•เดฑเตเดฑเต เดธเตƒเดทเตเดŸเดฟเด•เตเด•เดชเตเดชเต†เดŸเตเดจเตเดจเต, เด…เดคเดฟเตฝ เดžเด™เตเด™เตพ เดฑเดฟเดฎเต‹เดŸเตเดŸเต เด‡เดจเตเดฑเตผเดฒเต‹เด•เตเด•เตเดŸเตเดŸเดฑเดฟเดฒเต‡เด•เตเด•เต เด’เดฐเต เด•เดฃเด•เตเดทเตป เด†เดฐเด‚เดญเดฟเด•เตเด•เตเดจเตเดจเต.

|-- alice
|   |-- in
|   |-- out
|   `-- state
|-- bob
|   |-- in
|   |-- out
|   `-- state
`- conn

เดˆ เดธเดฎเต€เดชเดจเด‚ IM เดŸเตเดฐเดพเตปเดธเตเดชเต‹เตผเดŸเตเดŸเดฟเดจเตเดฑเต†เดฏเตเด‚ เด‰เดชเดฏเต‹เด•เตเดคเตƒ เด‡เดจเตเดฑเตผเดซเต‡เดธเดฟเดจเตเดฑเต†เดฏเตเด‚ เดธเตเดตเดคเดจเตเดคเตเดฐเดฎเดพเดฏ เดจเดŸเดชเตเดชเดพเด•เตเด•เดฒเตเด•เตพ เดจเดŸเดคเตเดคเดพเตป เดจเดฟเด™เตเด™เดณเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจเต, เด•เดพเดฐเดฃเด‚ เด’เดฐเต เดธเตเดนเตƒเดคเตเดคเตเด‚ เด‡เดฒเตเดฒ, เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดŽเดฒเตเดฒเดพเดตเดฐเต†เดฏเตเด‚ เดชเตเดฐเดธเดพเดฆเดฟเดชเตเดชเดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเดฟเดฒเตเดฒ. เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเดคเต tmux เด’เดชเตเดชเด‚ / เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดฎเตพเดŸเตเดŸเดฟเดŸเตˆเตฝ, เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดธเดฟเดจเตเดฑเดพเด•เตเดธเต เดนเตˆเดฒเตˆเดฑเตเดฑเดฟเด‚เด—เต เด‰เดณเตเดณ เด’เดฐเต เดฎเตพเดŸเตเดŸเดฟ-เดตเดฟเตปเดกเต‹ เด‡เดจเตเดฑเตผเดซเต‡เดธเต เดฒเดญเดฟเด•เตเด•เตเด‚. เด’เดชเตเดชเด‚ เดธเดนเดพเดฏเดคเตเดคเต‹เดŸเต† rlwrap เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด’เดฐเต เด—เตเดจเต เดฑเต€เดกเตโ€Œเดฒเตˆเตป-เด…เดจเตเดฏเต‹เดœเตเดฏเดฎเดพเดฏ เดธเดจเตเดฆเต‡เดถ เด‡เตปเดชเตเดŸเตเดŸเต เดฒเตˆเตป เดฒเดญเดฟเด•เตเด•เตเด‚.

เดตเดพเดธเตเดคเดตเดคเตเดคเดฟเตฝ, เดธเด•เตเดฒเต†เดธเต เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเตเด•เตพ FIFO เดซเดฏเดฒเตเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต. เดตเตเดฏเด•เตเดคเดฟเดชเดฐเดฎเดพเดฏเดฟ, เดธเดฎเตผเดชเตเดชเดฟเดค เดคเตเดฐเต†เดกเตเด•เดณเดฟเตฝ เดจเดฟเดจเตเดจเต เด•เตˆเด•เตŠเดฃเตเดŸเต เดŽเดดเตเดคเดฟเดฏ เดชเดถเตเดšเดพเดคเตเดคเดฒเดฎเดฟเดฒเตเดฒเดพเดคเต† เด…เดธเดฟเตปเดธเดฟเดฏเต‹เดฏเดฟเตฝ เดฎเดคเตเดธเดฐเดพเดงเดฟเดทเตเด เดฟเดคเดฎเดพเดฏเดฟ เดซเดฏเดฒเตเด•เตพ เดŽเด™เตเด™เดจเต† เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เดฃเดฎเต†เดจเตเดจเต เดŽเดจเดฟเด•เตเด•เต เดฎเดจเดธเตเดธเดฟเดฒเดพเดฏเดฟเดฒเตเดฒ (เดžเดพเตป เดตเดณเดฐเต†เด•เตเด•เดพเดฒเดฎเดพเดฏเดฟ เด…เดคเตเดคเดฐเด‚ เด•เดพเดฐเตเดฏเด™เตเด™เตพเด•เตเด•เดพเดฏเดฟ เดญเดพเดท เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต Go). เด…เดคเดฟเดจเดพเตฝ, Unix เดกเตŠเดฎเต†เดฏเตเตป เดธเต‹เด•เตเด•เดฑเตเดฑเตเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เดพเตป เดžเดพเตป เดคเต€เดฐเตเดฎเดพเดจเดฟเดšเตเดšเต. เดจเดฟเตผเดญเดพเด—เตเดฏเดตเดถเดพเตฝ, เด‡เดคเต เดŽเด•เตเด•เต‹ 2001:470:dead::babe 6666 > conn เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเต เด…เดธเดพเดงเตเดฏเดฎเดพเด•เตเด•เตเดจเตเดจเต. เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดžเดพเตป เดˆ เดชเตเดฐเดถเตเดจเด‚ เดชเดฐเดฟเดนเดฐเดฟเดšเตเดšเต เดธเต‹เด•เตเด•เดฑเตเดฑเต: echo 2001:470:dead::babe 6666 | socat - UNIX-Connect:conn, socat READLINE UNIX-Connect:alice/in.

เดฏเดฅเดพเตผเดคเตเดฅ เดธเตเดฐเด•เตเดทเดฟเดคเดฎเดฒเตเดฒเดพเดคเตเดค เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เตพ

เด—เดคเดพเด—เดคเดฎเดพเดฏเดฟ เดŸเดฟเดธเดฟเดชเดฟ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต: เด‡เดคเต เดกเต†เดฒเดฟเดตเดฑเดฟเดฏเตเด‚ เด…เดคเดฟเดจเตเดฑเต† เด“เตผเดกเดฑเตเด‚ เด‰เดฑเดชเตเดชเต เดจเตฝเด•เตเดจเตเดจเต. UDP เด‰เดฑเดชเตเดชเตเดจเตฝเด•เตเดจเตเดจเดฟเดฒเตเดฒ (เด•เตเดฐเดฟเดชเตเดฑเตเดฑเต‹เด—เตเดฐเดซเดฟ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ เด‡เดคเต เด‰เดชเดฏเต‹เด—เดชเตเดฐเดฆเดฎเดพเด•เตเด‚), เดชเด•เตเดทเต‡ เดชเดฟเดจเตเดคเตเดฃ เดŽเดธเต.เดธเดฟ.เดŸเดฟ.เดชเดฟ เดชเตˆเดคเตเดคเตบ เดชเต†เดŸเตเดŸเดฟเดฏเดฟเตฝ เดจเดฟเดจเตเดจเต เดชเตเดฑเดคเตเดคเต‡เด•เตเด•เต เดตเดฐเตเดจเตเดจเดฟเดฒเตเดฒ.

เดจเดฟเตผเดญเดพเด—เตเดฏเดตเดถเดพเตฝ, เดŸเดฟเดธเดฟเดชเดฟเดฏเดฟเตฝ เด’เดฐเต เดธเดจเตเดฆเต‡เดถเดคเตเดคเดฟเดจเตเดฑเต† เด†เดถเดฏเด‚ เด‡เดฒเตเดฒ, เดฌเตˆเดฑเตเดฑเตเด•เดณเตเดŸเต† เด’เดฐเต เดธเตเดŸเตเดฐเต€เด‚ เดฎเดพเดคเตเดฐเด‚. เด…เดคเดฟเดจเดพเตฝ, เดˆ เดคเตเดฐเต†เดกเดฟเตฝ เดธเดจเตเดฆเต‡เดถเด™เตเด™เตพ เดชเดฐเดธเตเดชเดฐเด‚ เดชเด™เตเด•เดฟเดŸเดพเตป เด•เดดเดฟเดฏเตเดจเตเดจ เดคเดฐเดคเตเดคเดฟเตฝ เด’เดฐเต เดซเต‹เตผเดฎเดพเดฑเตเดฑเต เด•เตŠเดฃเตเดŸเตเดตเดฐเต‡เดฃเตเดŸเดคเต เด†เดตเดถเตเดฏเดฎเดพเดฃเต. เดฒเตˆเตป เดซเต€เดกเต เดชเตเดฐเดคเต€เด•เด‚ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเตป เดžเด™เตเด™เตพเด•เตเด•เต เดธเดฎเตเดฎเดคเดฟเด•เตเด•เดพเด‚. เดคเตเดŸเด•เตเด•เด•เตเด•เดพเตผเด•เตเด•เต เด‡เดคเต เดจเดฒเตเดฒเดคเดพเดฃเต, เดŽเดจเตเดจเดพเตฝ เดžเด™เตเด™เตพ เดธเดจเตเดฆเต‡เดถเด™เตเด™เตพ เดŽเตปเด•เตเดฐเดฟเดชเตเดฑเตเดฑเต เดšเต†เดฏเตเดฏเดพเตป เดคเตเดŸเด™เตเด™เดฟเดฏเดพเตฝ, เดˆ เดชเตเดฐเดคเต€เด•เด‚ เดธเตˆเดซเตผเดŸเต†เด•เตเดธเตเดฑเตเดฑเดฟเตฝ เดŽเดตเดฟเดŸเต†เดฏเตเด‚ เดฆเตƒเดถเตเดฏเดฎเดพเดฏเต‡เด•เตเด•เดพเด‚. เดจเต†เดฑเตเดฑเตโ€Œเดตเตผเด•เตเด•เตเด•เดณเดฟเตฝ, เด…เดคเดฟเดจเดพเตฝ, เดธเดจเตเดฆเต‡เดถเดคเตเดคเดฟเดจเตเดฑเต† เดฆเตˆเตผเด˜เตเดฏเด‚ เด†เดฆเตเดฏเด‚ เดฌเตˆเดฑเตเดฑเตเด•เดณเดฟเตฝ เด…เดฏเด•เตเด•เตเดจเตเดจเดตเดฏเดพเดฃเต เดœเดจเดชเตเดฐเดฟเดฏ เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เดณเตเด•เตพ. เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เดฌเต‹เด•เตโ€Œเดธเดฟเดจเต เดชเตเดฑเดคเตเดคเต เดชเตˆเดคเตเดคเดฃเดฟเดจเต xdrlib เด‰เดฃเตเดŸเต, เด‡เดคเต เดธเดฎเดพเดจ เดซเต‹เตผเดฎเดพเดฑเตเดฑเดฟเตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เดพเตป เดจเดฟเด™เตเด™เดณเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจเต XDR.

เดŸเดฟเดธเดฟเดชเดฟ เดฑเต€เดกเดฟเด‚เด—เต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดžเด™เตเด™เตพ เด•เตƒเดคเตเดฏเดฎเดพเดฏเตเด‚ เด•เดพเดฐเตเดฏเด•เตเดทเดฎเดฎเดพเดฏเตเด‚ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เดฟเดฒเตเดฒ - เดžเด™เตเด™เตพ เด•เต‹เดกเต เดฒเดณเดฟเดคเดฎเดพเด•เตเด•เตเด‚. เดชเต‚เตผเดฃเตเดฃเดฎเดพเดฏ เดธเดจเตเดฆเต‡เดถเด‚ เดกเต€เด•เต‹เดกเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเตเดตเดฐเต† เดžเด™เตเด™เตพ เดธเต‹เด•เตเด•เดฑเตเดฑเดฟเตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เดกเดพเดฑเตเดฑ เด…เดจเดจเตเดคเดฎเดพเดฏ เดฒเต‚เดชเตเดชเดฟเตฝ เดตเดพเดฏเดฟเด•เตเด•เตเดจเตเดจเต. เดˆ เดธเดฎเต€เดชเดจเดคเตเดคเดฟเดจเตเดณเตเดณ เดซเต‹เตผเดฎเดพเดฑเตเดฑเดพเดฏเดฟ XML เด‰เดณเตเดณ JSON เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเดจเตเด‚ เด•เดดเดฟเดฏเตเด‚. เดŽเดจเตเดจเดพเตฝ เด•เตเดฐเดฟเดชเตโ€Œเดฑเตเดฑเต‹เด—เตเดฐเดพเดซเดฟ เดšเต‡เตผเด•เตเด•เตเดฎเตเดชเต‹เตพ, เดกเดพเดฑเตเดฑ เด’เดชเตเดชเดฟเดŸเตเด•เดฏเตเด‚ เด†เดงเดฟเด•เดพเดฐเดฟเด•เดฎเดพเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต - เด‡เดคเดฟเดจเต เด’เดฌเตโ€Œเดœเด•เตเดฑเตเดฑเตเด•เดณเตเดŸเต† เด’เดฐเต เดฌเตˆเดฑเตเดฑเต-เดซเต‹เตผ-เดฌเตˆเดฑเตเดฑเดฟเดจเต เดธเดฎเดพเดจเดฎเดพเดฏ เดชเตเดฐเดพเดคเดฟเดจเดฟเดงเตเดฏเด‚ เด†เดตเดถเตเดฏเดฎเดพเดฃเต, เด…เดคเต JSON/XML เดจเตฝเด•เดฟเดฒเตเดฒ (เดกเด‚เดชเตโ€Œเดธเต เดซเดฒเด™เตเด™เตพ เดตเตเดฏเดคเตเดฏเดพเดธเดชเตเดชเต†เดŸเดพเด‚).

เดˆ เดŸเดพเดธเตเด•เตเด•เดฟเดจเต XDR เด…เดจเตเดฏเต‹เดœเตเดฏเดฎเดพเดฃเต, เดŽเดจเตเดจเดฟเดฐเตเดจเตเดจเดพเดฒเตเด‚ เดžเดพเตป DER เดŽเตปเด•เต‹เดกเดฟเด‚เด—เดฟเดจเตŠเดชเตเดชเด‚ ASN.1 เดคเดฟเดฐเดžเตเดžเต†เดŸเตเด•เตเด•เตเดจเตเดจเต PyDERASN เดฒเตˆเดฌเตเดฐเดฑเดฟ, เด•เดพเดฐเดฃเด‚ เดžเด™เตเด™เดณเตเดŸเต† เด•เดฏเตเดฏเดฟเตฝ เด‰เดฏเตผเดจเตเดจ เดคเดฒเดคเตเดคเดฟเดฒเตเดณเตเดณ เดตเดธเตเดคเตเด•เตเด•เตพ เด‰เดฃเตเดŸเดพเดฏเดฟเดฐเดฟเด•เตเด•เตเด‚, เด…เดคเต เดชเดฒเดชเตเดชเต‹เดดเตเด‚ เด•เต‚เดŸเตเดคเตฝ เดฎเดจเต‹เดนเดฐเดตเตเด‚ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เดพเตป เดธเต—เด•เดฐเตเดฏเดชเตเดฐเดฆเดตเตเดฎเดพเดฃเต. เดธเตเด•เต€เดฎเดฒเต†เดธเต เดชเต‹เดฒเต†เดฏเดฒเตเดฒ เดฌเต†เตปเด•เต‹เดกเต, เดฎเต†เดธเต‡เดœเตเดชเดพเด•เตเด•เต เด…เดฅเดตเดพ เดธเดฟ.เดฌเดฟ.เด’.เด†เตผ, 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) โ”‚ โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€>โ”‚ โ”‚ โ”‚ โ”‚MsgHandshake(IdB) โ”‚โ”‚ โ”‚ โ”‚ MsgText() โ”‚ โ”‚โ”€โ”€โ”€โ”€ MsgText() โ”‚ โ”‚ โ”‚

เด•เตเดฐเดฟเดชเตโ€Œเดฑเตเดฑเต‹เด—เตเดฐเดซเดฟ เด‡เดฒเตเดฒเดพเดคเตเดค เด.เดŽเด‚

เดžเดพเตป เด‡เดคเดฟเดจเด•เด‚ เดชเดฑเดžเตเดžเดคเตเดชเต‹เดฒเต†, เดŽเดฒเตเดฒเดพ เดธเต‹เด•เตเด•เดฑเตเดฑเต เดชเตเดฐเดตเตผเดคเตเดคเดจเด™เตเด™เตพเด•เตเด•เตเด‚ 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 เด•เตเดฏเต‚เดตเดฟเตฝ, เดธเดจเตเดฆเต‡เดถเดคเตเดคเดฟเดจเตเดฑเต† เดŸเต†เด•เตโ€Œเดธเตโ€ŒเดฑเตเดฑเดฟเดจเตŠเดชเตเดชเด‚ เดชเตˆเดคเตเดคเตบ เดธเตโ€ŒเดŸเตเดฐเดฟเด‚เด—เตเด•เตพ เดชเดฟเดŸเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต, เดŽเดจเตเดจเดพเตฝ msg_sender coroutine-เดจเตเดฑเต† เดชเตเดฐเดตเตผเดคเตเดคเดจเด‚ เดจเดฟเตผเดคเตเดคเดพเตป เดธเดฟเด—เตโ€Œเดจเตฝ เดจเตฝเด•เตเดจเตเดจ None-เดจเตเดฑเต† เด’เดฐเต เดชเตเดฐเดคเตเดฏเต‡เด• เดฎเต‚เดฒเตเดฏเดฎเตเดฃเตเดŸเต, เด…เดคเตเดตเดดเดฟ เดฒเต†เด—เดธเดฟ 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 เด•เดฃเด•เตเดทเตป เด…เดŸเดฏเตเด•เตเด•เตเด•เดฏเตเด‚ 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 ั IKE โ€” เด—เตเดฐเตเดคเดฐเดฎเดพเดฏ เด•เตเดฐเดฟเดชเตโ€Œเดฑเตเดฑเต‹เด—เตเดฐเดพเดซเดฟเด•เต เดชเตเดฐเดถเตโ€Œเดจเด™เตเด™เตพ เด‰เดฃเตเดŸเดพเด•เดฐเตเดคเต, เด…เดตเดฏเตเด‚ เดฒเดณเดฟเดคเดฎเดฒเตเดฒเต†เด™เตเด•เดฟเดฒเตเด‚. เดจเดฟเด™เตเด™เตพ IKEv1, IKEv2 เดŽเดจเตเดจเดฟเดตเดฏเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเต เดตเดพเดฏเดฟเด•เตเด•เตเด•เดฏเดพเดฃเต†เด™เตเด•เดฟเตฝ, เด…เดตเดฏเตเดŸเต† เด‰เดฑเดตเดฟเดŸเด‚ เด‡เดคเดพเดฃเต STS, ISO/IEC IS 9798-3, SIGMA (SIGn-and-MAc) เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เดณเตเด•เตพ - เด’เดฐเต เดธเดพเดฏเดพเดนเตเดจเดคเตเดคเดฟเตฝ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เดพเตป เด•เดดเดฟเดฏเตเดจเตเดจเดคเตเดฐ เดฒเดณเดฟเดคเดฎเดพเดฃเต.

เดŽเดธเตเดŸเดฟเดŽเดธเต/เดเดŽเดธเตเด’ เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เดณเตเด•เดณเตเดŸเต† เดตเดฟเด•เดธเดจเดคเตเดคเดฟเดฒเต† เดเดฑเตเดฑเดตเตเด‚ เดชเตเดคเดฟเดฏ เดฒเดฟเด™เตเด•เต เดŽเดจเตเดจ เดจเดฟเดฒเดฏเดฟเตฝ เดธเดฟเด—เตเดฎเดฏเดฟเตฝ เดŽเดจเตเดคเดพเดฃเต เดจเดฒเตเดฒเดคเต? เด‡เดคเต เดžเด™เตเด™เดณเตเดŸเต† เดŽเดฒเตเดฒเดพ เด†เดตเดถเตเดฏเด™เตเด™เดณเตเด‚ เดจเดฟเดฑเดตเต‡เดฑเตเดฑเตเดจเตเดจเต ("เดฎเดฑเดฏเตเด•เตเด•เตเด•" เด‡เดจเตเดฑเตผเดฒเต‹เด•เตเด•เตเดŸเตเดŸเตผ เดเดกเดจเตเดฑเดฟเดซเดฏเดฑเตเด•เตพ เด‰เตพเดชเตเดชเต†เดŸเต†) เด•เต‚เดŸเดพเดคเต† เด…เดฑเดฟเดฏเดชเตเดชเต†เดŸเตเดจเตเดจ เด•เตเดฐเดฟเดชเตโ€Œเดฑเตเดฑเต‹เด—เตเดฐเดพเดซเดฟเด•เต เดชเตเดฐเดถเตโ€Œเดจเด™เตเด™เดณเตŠเดจเตเดจเตเดฎเดฟเดฒเตเดฒ. เด‡เดคเต เดฎเดฟเดจเดฟเดฎเดฒเดฟเดธเตเดฑเตเดฑเดฟเด•เต เด†เดฃเต - เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เตพ เดธเดจเตเดฆเต‡เดถเดคเตเดคเดฟเตฝ เดจเดฟเดจเตเดจเต เด’เดฐเต เด˜เดŸเด•เดฎเต†เด™เตเด•เดฟเดฒเตเด‚ เดจเต€เด•เตเด•เด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเต เด…เดคเดฟเดจเตเดฑเต† เด…เดฐเด•เตเดทเดฟเดคเดพเดตเดธเตเดฅเดฏเดฟเดฒเต‡เด•เตเด•เต เดจเดฏเดฟเด•เตเด•เตเด‚.

เดเดฑเตเดฑเดตเตเด‚ เดฒเดณเดฟเดคเดฎเดพเดฏ เดนเต‹เด‚ เด—เตเดฐเต—เตบ เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เดณเดฟเตฝ เดจเดฟเดจเตเดจเต เดธเดฟเด—เตเดฎเดฏเดฟเดฒเต‡เด•เตเด•เต เดชเต‹เด•เดพเด‚. เดžเด™เตเด™เตพเด•เตเด•เต เดคเดพเตฝเดชเตเดชเดฐเตเดฏเดฎเตเดณเตเดณ เดเดฑเตเดฑเดตเตเด‚ เด…เดŸเดฟเดธเตเดฅเดพเดจเดชเดฐเดฎเดพเดฏ เดชเตเดฐเดตเตผเดคเตเดคเดจเด‚ เดชเตเดฐเดงเดพเดจ เด•เดฐเดพเตผ: เดฐเดฃเตเดŸเต เดชเด™เตเด•เดพเดณเดฟเด•เตพเด•เตเด•เตเด‚ เด’เดฐเต‡ เดฎเต‚เดฒเตเดฏเด‚ เดจเตฝเด•เตเดจเตเดจ เด’เดฐเต เดซเด‚เด—เตโ€Œเดทเตป, เด…เดคเต เด’เดฐเต เดธเดฎเดฎเดฟเดคเดฟ เด•เต€ เด†เดฏเดฟ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเด‚. เดตเดฟเดถเดฆเดพเด‚เดถเด™เตเด™เดณเดฟเดฒเต‡เด•เตเด•เต เด•เดŸเด•เตเด•เดพเดคเต†: เด“เดฐเต‹ เด•เด•เตเดทเดฟเด•เดณเตเด‚ เด’เดฐเต เดŽเดซเต†เดฎเต†เดฑเตฝ (เด’เดฐเต เดธเต†เดทเดจเดฟเตฝ เดฎเดพเดคเตเดฐเด‚ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจ) เด•เต€ เดœเต‹เดกเดฟ (เดชเดฌเตเดฒเดฟเด•เต, เดชเตเดฐเตˆเดตเดฑเตเดฑเต เด•เต€เด•เตพ) เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเดจเตเดจเต, เดชเดฌเตเดฒเดฟเด•เต เด•เต€เด•เตพ เด•เตˆเดฎเดพเดฑเตเดฑเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต, เด•เดฐเดพเตผ เดซเด‚เด—เตเดทเดจเดฟเดฒเต‡เด•เตเด•เต เดตเดฟเดณเดฟเด•เตเด•เตเดจเตเดจเต, เด…เดคเดฟเดจเตเดฑเต† เด‡เตปเดชเตเดŸเตเดŸเดฟเดฒเต‡เด•เตเด•เต เด…เดตเตผ เด…เดตเดฐเตเดŸเต† เดธเตเดตเด•เดพเดฐเตเดฏ เด•เต€เดฏเตเด‚ เดชเดฌเตเดฒเดฟเด•เตเด•เตเด‚ เด•เตˆเดฎเดพเดฑเตเดจเตเดจเต. เดธเด‚เดญเดพเดทเด•เดจเตเดฑเต† เดคเดพเด•เตเด•เต‹เตฝ.

โ”Œโ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ” โ”‚PeerAโ”‚ โ”‚PeerBโ”‚โ””โ”€โ”€โ”ฌโ”€โ”€โ”˜ โ”‚ โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•— โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€>โ”‚ โ”‚โ”‚โ”€โ”€>โ”‚ โ• โ•โ•โ•โ•โ•โ•โ•โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• โ”‚ IdB, PubBโ”‚ โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• โ”‚<โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”€โ”€โ”€โ”€โ”€โ”€โ”‚ โ•‘PrvB, PubB = DHgen()โ•‘ โ”‚ โ”‚ โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• โ”€โ”€โ”€โ” โ•”โ•โ•โ•โ• -- โ•โ•โ•โ•โ•โ•โ• โ•โ•โ•โ•โ• โ”‚ โ”‚ โ”‚ โ”‚

เด†เตผเด•เตเด•เตเด‚ เดฎเดงเตเดฏเดคเตเดคเดฟเตฝ เดšเดพเดŸเดพเดจเตเด‚ เดชเดฌเตเดฒเดฟเด•เต เด•เต€เด•เตพ เดธเตเดตเดจเตเดคเดฎเดพเดฏเดฟ เดฎเดพเดฑเตเดฑเดฟเดธเตเดฅเดพเดชเดฟเด•เตเด•เดพเดจเตเด‚ เด•เดดเดฟเดฏเตเด‚ - เดˆ เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เดณเดฟเตฝ เด‡เดจเตเดฑเตผเดฒเต‹เด•เตเด•เตเดŸเตเดŸเตผเดฎเดพเดฐเตเดŸเต† เด†เดงเดฟเด•เดพเดฐเดฟเด•เดคเดฏเดฟเดฒเตเดฒ. เดฆเต€เตผเด˜เด•เดพเดฒเด‚ เดจเดฟเดฒเดจเดฟเตฝเด•เตเด•เตเดจเตเดจ เด•เต€เด•เดณเตเดณเตเดณ เด’เดฐเต เด’เดชเตเดชเต เดšเต‡เตผเด•เตเด•เดพเด‚.

โ”Œโ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ” โ”‚PeerAโ”‚ โ”‚PeerBโ”‚ โ””โ”€โ”€โ”ฌโ”€โ”€โ”˜ เด…เดŸเดฏเดพเดณเด‚(SignPrvA, (PubA)) โ”‚ โ•”โ• โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”€โ”€โ”€โ”€โ”€โ”€ PubA = เดฒเต‹เดกเต()โ•‘ โ”‚ โ”‚ โ•‘PrvA, PubA = DHgen() โ•‘ โ”‚ โ”‚ โ•šโ•โ•โ•โ•โ•โ•โ• โ•โ•โ•โ•โ•โ•โ• โ•โ•โ•โ•โ•โ• , เด…เดŸเดฏเดพเดณเด‚(SignPrvB, (PubB)) โ”‚ โ”‚โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• โ•โ•โ•โ•โ•โ•โ•โ”‚โ”‚โ”€โ€— โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”€โ”€โ”‚ โ•‘SignPrvB, SignPubB = เดฒเต‹เดกเต( )โ•‘ โ”‚ โ”‚ โ”‚ โ•‘PrvB, PubBโ”‚ โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• โ•โ•โ• โ”€โ”€โ”€โ”€โ” โ•” โ•โ•โ•โ•โ•โ•— โ”‚ โ”‚ โ•‘verify( SignPubB, ...)โ•‘ โ”‚ <โ”€โ”€โ”€โ”˜ โ•‘Key = DH(Pr vA, PubB) โ•‘ โ”‚ โ”‚ โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• โ•โ•โ• โ”‚ โ”‚ โ”‚

เด’เดฐเต เดชเตเดฐเดคเตเดฏเต‡เด• เดธเต†เดทเดจเตเดฎเดพเดฏเดฟ เดฌเดจเตเดงเดฟเดชเตเดชเดฟเดšเตเดšเดฟเดŸเตเดŸเดฟเดฒเตเดฒเดพเดคเตเดคเดคเดฟเดจเดพเตฝ เด…เดคเตเดคเดฐเดฎเตŠเดฐเต เด’เดชเตเดชเต เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เดฟเดฒเตเดฒ. เดฎเดฑเตเดฑเต เดชเด™เตเด•เดพเดณเดฟเด•เดณเตเดฎเดพเดฏเตเดณเตเดณ เดธเต†เดทเดจเตเด•เตพเด•เตเด•เต เด…เดคเตเดคเดฐเด‚ เดธเดจเตเดฆเต‡เดถเด™เตเด™เตพ "เด…เดจเตเดฏเต‹เดœเตเดฏเดฎเดพเดฃเต". เดฎเตเดดเตเดตเตป เดธเดจเตเดฆเตผเดญเดตเตเด‚ เดธเดฌเตโ€Œเดธเตโ€Œเด•เตเดฐเตˆเดฌเต เดšเต†เดฏเตเดฏเดฃเด‚. เดŽเดฏเดฟเตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เดฎเดฑเตเดฑเตŠเดฐเต เดธเดจเตเดฆเต‡เดถเด‚ เด•เต‚เดŸเดฟ เดšเต‡เตผเด•เตเด•เดพเตป เด‡เดคเต เดžเด™เตเด™เดณเต† เดชเตเดฐเต‡เดฐเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเต.

เด•เต‚เดŸเดพเดคเต†, เดธเดฟเด—เตเดจเต‡เดšเตเดšเดฑเดฟเดจเต เด•เต€เดดเดฟเตฝ เดจเดฟเด™เตเด™เดณเตเดŸเต† เดธเตเดตเดจเตเดคเด‚ เดเดกเดจเตเดฑเดฟเดซเดฏเตผ เดšเต‡เตผเด•เตเด•เตเดจเตเดจเดคเต เดจเดฟเตผเดฃเดพเดฏเด•เดฎเดพเดฃเต, เด…เดฒเตเดฒเดพเดคเตเดคเดชเด•เตเดทเด‚ เดžเด™เตเด™เตพเด•เตเด•เต IdXXX เดฎเดพเดฑเตเดฑเดฟ เดชเด•เดฐเด‚ เดฎเดฑเตเดฑเตŠเดฐเต เด…เดฑเดฟเดฏเดชเตเดชเต†เดŸเตเดจเตเดจ เด‡เดจเตเดฑเตผเดฒเต‹เด•เตเด•เตเดŸเตเดŸเดฑเตเดŸเต† เด•เต€ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดธเดจเตเดฆเต‡เดถเด‚ เดตเต€เดฃเตเดŸเตเด‚ เด’เดชเตเดชเดฟเดŸเดพเด‚. เดคเดŸเดฏเดพเตป เดชเตเดฐเดคเดฟเดซเดฒเดจ เด†เด•เตเดฐเดฎเดฃเด™เตเด™เตพ, เด’เดชเตเดชเดฟเดจเต เด•เต€เดดเดฟเดฒเตเดณเตเดณ เด˜เดŸเด•เด™เตเด™เตพ เด…เดตเดฏเตเดŸเต† เด…เตผเดคเตเดฅเดฎเดจเตเดธเดฐเดฟเดšเตเดšเต เดตเตเดฏเด•เตเดคเดฎเดพเดฏเดฟ เดจเดฟเตผเดตเดšเดฟเด•เตเด•เดชเตเดชเต†เดŸเตเดŸ เดธเตเดฅเดฒเด™เตเด™เดณเดฟเตฝ เด‰เดฃเตเดŸเดพเดฏเดฟเดฐเดฟเด•เตเด•เต‡เดฃเตเดŸเดคเต เด†เดตเดถเตเดฏเดฎเดพเดฃเต: A เดšเดฟเดนเตเดจเด™เตเด™เตพ (PubA, PubB) เด†เดฃเต†เด™เตเด•เดฟเตฝ, B เด’เดชเตเดชเดฟเดŸเดฃเด‚ (PubB, PubA). เดธเต€เดฐเดฟเดฏเดฒเตˆเดธเต เดšเต†เดฏเตเดค เดกเดพเดฑเตเดฑเดฏเตเดŸเต† เด˜เดŸเดจเดฏเตเด‚ เดซเต‹เตผเดฎเดพเดฑเตเดฑเตเด‚ เดคเดฟเดฐเดžเตเดžเต†เดŸเตเด•เตเด•เต‡เดฃเตเดŸเดคเดฟเดจเตเดฑเต† เดชเตเดฐเดพเดงเดพเดจเตเดฏเดคเตเดคเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเตเด‚ เด‡เดคเต เดธเด‚เดธเดพเดฐเดฟเด•เตเด•เตเดจเตเดจเต. เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, ASN.1 DER เดŽเตปเด•เต‹เดกเดฟเด‚เด—เดฟเดฒเต† เดธเต†เดฑเตเดฑเตเด•เตพ เด…เดŸเตเด•เตเด•เดฟเดฏเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต: SET OF(PubA, PubB) เดŽเดจเตเดจเดคเต SET OF(PubB, PubA) เดŽเดจเตเดจเดคเดฟเดจเต เดธเดฎเดพเดจเดฎเดพเดฏเดฟเดฐเดฟเด•เตเด•เตเด‚.

โ”Œโ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ” โ”‚PeerAโ”‚ โ”‚PeerBโ”‚โ””โ”€โ”€โ”ฌโ”€โ”€โ”˜ โ”‚ โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€>โ”‚ โ•‘SignPrvA, SignPubA = เดฒเต‹เดกเต()โ•‘ โ”‚ โ”‚ โ•‘PrvA, PubA = DHgenโ”‚โ”•โ”• โ• โ•โ•โ•โ•โ•โ•โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• โ”‚IdB, PubB, เด…เดŸเดฏเดพเดณเด‚ (SignPrvB, (IdB, PubA, PubB)) โ”‚ โ•โ•โ•โ•โ• โ•โ•โ•โ•โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•— โ”‚<โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”‚ โ•‘SignPrvB, SignPubB = เดฒเต‹เดกเต()โ•‘ โ”‚ โ”‚ โ•‘PrvB, PubB = DHgen()โ•‘ โ”‚โ”•โ•โ•โ•โ•โ•โ• โ• โ•โ•โ•โ•โ•โ•โ•โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• โ”‚ เดšเดฟเดนเตเดจเด‚(SignPrvA, (IdA, PubB, PubA)) โ”‚ โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• โ•โ•โ•โ•โ•— โ”‚โ”€ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”€โ”€โ”€>โ”‚ โ•‘verify(SignPubB, ...) โ•‘ โ”‚ โ”‚ โ•‘key = dh (prva, PUBB) โ•‘ โ”‚ โ”‚ โ”‚

เดŽเดจเตเดจเดฟเดฐเตเดจเตเดจเดพเดฒเตเด‚, เดˆ เดธเต†เดทเดจเตเดตเต‡เดฃเตเดŸเดฟ เดžเด™เตเด™เตพ เด…เดคเต‡ เดชเด™เตเด•เดฟเดŸเตเดŸ เด•เต€ เดœเดจเดฑเต‡เดฑเตเดฑเต เดšเต†เดฏเตเดคเดฟเดŸเตเดŸเตเดฃเตเดŸเต†เดจเตเดจเต เดžเด™เตเด™เตพ เด‡เดชเตเดชเต‹เดดเตเด‚ "เดคเต†เดณเดฟเดฏเดฟเดšเตเดšเดฟเดŸเตเดŸเดฟเดฒเตเดฒ". เดคเดคเตเดตเดคเตเดคเดฟเตฝ, เดˆ เด˜เดŸเตเดŸเด‚ เด•เต‚เดŸเดพเดคเต† เดžเด™เตเด™เตพเด•เตเด•เต เดšเต†เดฏเตเดฏเดพเตป เด•เดดเดฟเดฏเตเด‚ - เด†เดฆเตเดฏเดคเตเดคเต† เด—เดคเดพเด—เดค เด•เดฃเด•เตเดทเตป เด…เดธเดพเดงเตเดตเดพเดฏเดฟเดฐเดฟเด•เตเด•เตเด‚, เดŽเดจเตเดจเดพเตฝ เดนเดพเตปโ€Œเดกเตโ€Œเดทเต‡เด•เตเด•เต เดชเต‚เตผเดคเตเดคเดฟเดฏเดพเด•เตเดฎเตเดชเต‹เตพ, เดŽเดฒเตเดฒเดพเด‚ เดถเดฐเดฟเด•เตเด•เตเด‚ เดธเดฎเตเดฎเดคเดฟเดšเตเดšเดฟเดŸเตเดŸเตเดฃเตเดŸเต†เดจเตเดจเต เดžเด™เตเด™เตพเด•เตเด•เต เด‰เดฑเดชเตเดชเตเดฃเตเดŸเต. เด‡เดชเตเดชเต‹เตพ เดžเด™เตเด™เดณเตเดŸเต† เด•เดฏเตเดฏเดฟเตฝ ISO/IEC IS 9798-3 เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เตพ เด‰เดฃเตเดŸเต.

เดœเดจเดฑเต‡เดฑเตเดฑเต เดšเต†เดฏเตเดค เด•เต€ เดคเดจเตเดจเต† เดจเดฎเตเด•เตเด•เต เด’เดชเตเดชเดฟเดŸเดพเด‚. เด‡เดคเต เด…เดชเด•เดŸเด•เดฐเดฎเดพเดฃเต, เด•เดพเดฐเดฃเด‚ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดš เดธเดฟเด—เตเดจเต‡เดšเตเดšเตผ เด…เตฝเด—เต‹เดฐเดฟเดคเดคเตเดคเดฟเตฝ เดšเต‹เตผเดšเตเดš เด‰เดฃเตเดŸเดพเด•เดพเตป เดธเดพเดงเตเดฏเดคเดฏเตเดฃเตเดŸเต (เด’เดชเตเดชเดฟเดจเต เดฌเดฟเดฑเตเดฑเตเด•เตพ เด†เดฃเต†เด™เตเด•เดฟเดฒเตเด‚, เด‡เดชเตเดชเต‹เดดเตเด‚ เดšเต‹เตผเดšเตเดšเดฏเตเดฃเตเดŸเต). เดกเต†เดฑเดฟเดตเต‡เดทเตป เด•เต€เดฏเตเดŸเต† เด’เดฐเต เดนเดพเดทเดฟเตฝ เด’เดชเตเดชเดฟเดŸเดพเตป เดธเดพเดงเดฟเด•เตเด•เตเด‚, เดŽเดจเตเดจเดพเตฝ เดกเต†เดฑเดฟเดตเต‡เดฑเตเดฑเดกเต เด•เต€เดฏเตเดŸเต† เดนเดพเดทเต เดชเต‹เดฒเตเด‚ เดšเต‹เตผเดคเตเดคเตเดจเตเดจเดคเต เดกเต†เดฑเดฟเดตเต‡เดทเตป เดซเด‚เด—เตโ€Œเดทเดจเดฟเดฒเต† เดฌเตเดฐเต‚เดŸเตเดŸเต เดซเต‹เดดเตโ€Œเดธเต เด†เด•เตเดฐเดฎเดฃเดคเตเดคเดฟเตฝ เดตเดฟเดฒเดชเตเดชเต†เดŸเตเดŸเดคเดพเดฃเต. เดธเต†เตปเดกเตผ เดเดกเดฟเดฏเต† เดชเตเดฐเดพเดฎเดพเดฃเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจ เด’เดฐเต MAC เดซเด‚เด—เตโ€Œเดทเตป SIGMA เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต.

โ”Œโ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ” โ”‚PeerAโ”‚ โ”‚PeerBโ”‚โ””โ”€โ”€โ”ฌโ”€โ”€โ”˜ โ”‚ โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€>โ”‚ โ•‘SignPrvA, SignPubA = เดฒเต‹เดกเต()โ•‘ โ”‚ โ”‚ = โ•‘ โ•š โ•โ•โ•โ•โ•โ•โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• โ”‚IdB, PubB, เด…เดŸเดฏเดพเดณเด‚โ”‚โ”‚IdB, PubB, sign(SignPrvB, (PubA, PubB), MACโ”•โ”• โ•โ•โ• โ”‚<โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”€โ”€โ”€โ”€โ”€โ”€ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”€โ”‚ โ•‘SignPrvB, SignPubB = เดฒเต‹เดกเต()โ•‘ โ”‚ โ”‚ โ•‘PrvB, PubB = DHgen() โ•‘ โ”‚ โ”‚ โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ• โ•โ•โ•โ•โ•โ•โ•โ•โ• โ•โ•โ• โ”‚ โ”‚ โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•— โ”‚ โ”‚ โ•‘เด•เต€ = DH( PrvA, PubB) โ•‘ โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”€โ”€ โ”€โ”€โ”€โ”€โ”€โ”€ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”€โ”€โ”€โ”€โ”€>โ”‚ โ•‘verify(Key, IdB) โ•‘ โ”‚ โ”‚ โ•‘verify(SignPubB, ...)โ•‘ โ”‚โ”‚โ•šโ•โ•โ•โ•โ•โ•โ•โ• โ•โ•โ•โ•โ• โ•โ• โ”‚ โ”‚

เด’เดฐเต เด’เดชเตเดฑเตเดฑเดฟเดฎเตˆเดธเต‡เดทเตป เดŽเดจเตเดจ เดจเดฟเดฒเดฏเดฟเตฝ, เดšเดฟเดฒเตผ เด…เดตเดฐเตเดŸเต† เดŽเดซเดฟเดฎเต†เดฑเตฝ เด•เต€เด•เตพ เดตเต€เดฃเตเดŸเตเด‚ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเตป เด†เด—เตเดฐเดนเดฟเดšเตเดšเต‡เด•เตเด•เดพเด‚ (เด‡เดคเต เดคเต€เตผเดšเตเดšเดฏเดพเดฏเตเด‚, PFS-เดจเต เดจเดฟเตผเดญเดพเด—เตเดฏเด•เดฐเดฎเดพเดฃเต). เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เดžเด™เตเด™เตพ เด’เดฐเต เด•เต€ เดœเต‹เดกเดฟ เดธเตƒเดทเตเดŸเดฟเดšเตเดšเต, เด•เดฃเด•เตเดฑเตเดฑเตเดšเต†เดฏเตเดฏเดพเตป เดถเตเดฐเดฎเดฟเดšเตเดšเต, เดชเด•เตเดทเต‡ TCP เดฒเดญเตเดฏเดฎเดฒเตเดฒ เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เดณเดฟเดจเตเดฑเต† เดฎเดงเตเดฏเดคเตเดคเดฟเตฝ เดŽเดตเดฟเดŸเต†เดฏเต‹ เดคเดŸเดธเตเดธเดชเตเดชเต†เดŸเตเดŸเต. เด’เดฐเต เดชเตเดคเดฟเดฏ เดœเต‹เดกเดฟเดฏเดฟเตฝ เดชเดพเดดเดพเดฏ เดŽเตปเดŸเตเดฐเต‹เดชเตเดชเดฟเดฏเตเด‚ เดชเตเดฐเต‹เดธเดธเตผ เดตเดฟเดญเดตเด™เตเด™เดณเตเด‚ เดชเดพเดดเดพเด•เตเด•เตเดจเตเดจเดคเต เดฒเดœเตเดœเดพเด•เดฐเดฎเดพเดฃเต. เด…เดคเดฟเดจเดพเตฝ, เดŽเดซเต†เดฎเต†เดฑเตฝ เดชเดฌเตเดฒเดฟเด•เต เด•เต€เด•เตพ เดตเต€เดฃเตเดŸเตเด‚ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ เดธเดพเดงเตเดฏเดฎเดพเดฏ เดฑเดพเตปเดกเด‚ เดฑเต€เดชเตเดฒเต‡ เด†เด•เตเดฐเดฎเดฃเด™เตเด™เดณเดฟเตฝ เดจเดฟเดจเตเดจเต เดชเดฐเดฟเดฐเด•เตเดทเดฟเด•เตเด•เตเดจเตเดจ เด’เดฐเต เด•เดชเดŸ-เดฑเดพเตปเดกเด‚ เดฎเต‚เดฒเตเดฏเด‚ - เด•เตเด•เตเด•เดฟ เดŽเดจเตเดจเต เดตเดฟเดณเดฟเด•เตเด•เดชเตเดชเต†เดŸเตเดจเตเดจเดต เดžเด™เตเด™เตพ เด…เดตเดคเดฐเดฟเดชเตเดชเดฟเด•เตเด•เตเด‚. เด•เตเด•เตเด•เดฟเดฏเตเด‚ เดŽเดซเต†เดฎเดฑเตฝ เดชเดฌเตเดฒเดฟเด•เต เด•เต€เดฏเตเด‚ เดคเดฎเตเดฎเดฟเดฒเตเดณเตเดณ เดฌเตˆเตปเดกเดฟเด‚เด—เต เด•เดพเดฐเดฃเด‚, เดŽเดคเดฟเตผ เด•เด•เตเดทเดฟเดฏเตเดŸเต† เดชเตŠเดคเต เด•เต€ เด…เดจเดพเดตเดถเตเดฏเดฎเดพเดฏเดฟ เด’เดชเตเดชเดฟเตฝ เดจเดฟเดจเตเดจเต เดจเต€เด•เตเด•เด‚ เดšเต†เดฏเตเดฏเดพเดตเตเดจเตเดจเดคเดพเดฃเต.

โ”Œโ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ” โ”‚PeerAโ”‚โ”‚PeerBโ”‚ โ””โ”€โ”€โ”ฌโ”€โ”€โ”˜ เด•เตเด•เตเด•เดฟเดŽ โ”‚ โ•”โ•โ•โ•โ•โ•โ•โ•โ• โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”€>โ”‚ โ•‘SignPrvA, SignPubA = เดฒเต‹เดกเต( )โ•‘ โ”‚ โ”‚ โ•‘PrvA, PubA = DHgen() โ•‘ โ”‚ โ”‚ โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• โ•โ•โ• โ”‚IdB, PubB, CookieB , เด…เดŸเดฏเดพเดณเด‚(SignPrvB, (CookieA, CookieB, PubB)), MAC(IdB) โ”‚ โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• โ• โ•— โ”‚< โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”‚ โ•‘SignPrvB, SignPubB = เดฒเต‹เดกเต()โ•‘ โ”‚โ”‚โ”‚ โ”‚ โ•šโ•โ•โ•โ•โ•โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• โ”‚โ”‚ โ•โ•โ•โ•โ•โ•โ•โ•— โ”‚ เด…เดŸเดฏเดพเดณเด‚( SignPrvA, (CookieB, CookieA, PubA)), MAC(IdA) โ”‚ โ•‘Key = DH(PrvA, PubB) โ•‘ โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”€ โ”€โ”€ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”€โ”€โ”€โ”€โ”€โ”€โ”€>โ”‚ โ•‘ เดธเตเดฅเดฟเดฐเต€เด•เดฐเดฟเด•เตเด•เตเด•(เด•เต€, IdB) โ•‘ โ”‚ โ”‚ โ•‘verify(SignPubB, ...)โ•‘ โ”‚ โ”‚ โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• โ”‚ โ”‚

เด…เดตเดธเดพเดจเดฎเดพเดฏเดฟ, เด’เดฐเต เดจเดฟเดทเตเด•เตเดฐเดฟเดฏ เดจเดฟเดฐเต€เด•เตเดทเด•เดจเดฟเตฝ เดจเดฟเดจเตเดจเต เดžเด™เตเด™เดณเตเดŸเต† เดธเด‚เดญเดพเดทเดฃ เดชเด™เตเด•เดพเดณเดฟเด•เดณเตเดŸเต† เดธเตเดตเด•เดพเดฐเตเดฏเดค เดจเต‡เดŸเดพเตป เดžเด™เตเด™เตพ เด†เด—เตเดฐเดนเดฟเด•เตเด•เตเดจเตเดจเต. เด‡เดคเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเต, เดธเดฟเด—เตเดฎ เด†เดฆเตเดฏเด‚ เดŽเดซเต†เดฎเดฑเตฝ เด•เต€เด•เตพ เด•เตˆเดฎเดพเดฑเตเดฑเด‚ เดšเต†เดฏเตเดฏเดพเดจเตเด‚ เด†เดงเดฟเด•เดพเดฐเดฟเด•เดฎเดพเด•เตเด•เดพเดจเตเด‚ เดคเดฟเดฐเดฟเดšเตเดšเดฑเดฟเดฏเดพเดจเตเด‚ เดธเดจเตเดฆเต‡เดถเด™เตเด™เตพ เดŽเตปเด•เตเดฐเดฟเดชเตเดฑเตเดฑเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เด’เดฐเต เดชเตŠเดคเต เด•เต€ เดตเดฟเด•เดธเดฟเดชเตเดชเดฟเด•เตเด•เดพเดจเตเด‚ เดจเดฟเตผเดฆเตเดฆเต‡เดถเดฟเด•เตเด•เตเดจเตเดจเต. SIGMA เดฐเดฃเตเดŸเต เด“เดชเตเดทเดจเตเด•เตพ เดตเดฟเดตเดฐเดฟเด•เตเด•เตเดจเตเดจเต:

  • เดธเดฟเด—เตเดฎ-เด - เดธเดœเต€เดตเดฎเดพเดฏ เด†เด•เตเดฐเดฎเดฃเด™เตเด™เดณเดฟเตฝ เดจเดฟเดจเตเดจเต เด‡เดจเต€เดทเตเดฏเต‡เดฑเตเดฑเดฑเต† เดธเด‚เดฐเด•เตเดทเดฟเด•เตเด•เตเดจเตเดจเต, เดชเตเดฐเดคเดฟเด•เดฐเดฃเด‚ เดจเดฟเดทเตเด•เตเดฐเดฟเดฏเดฎเดพเดฏเดตเดฏเดฟเตฝ เดจเดฟเดจเตเดจเต: เด‡เดจเต€เดทเตเดฏเต‡เดฑเตเดฑเตผ เดฑเต†เดธเตโ€Œเดชเต‹เดฃเตเดŸเดฑเดฟเดจเต† เดชเตเดฐเดพเดฎเดพเดฃเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจเต, เดŽเดจเตเดคเต†เด™เตเด•เดฟเดฒเตเด‚ เดชเตŠเดฐเตเดคเตเดคเดชเตเดชเต†เดŸเตเดจเตเดจเดฟเดฒเตเดฒเต†เด™เตเด•เดฟเตฝ, เด…เดคเต เด…เดคเดฟเดจเตเดฑเต† เดเดกเดจเตเดฑเดฟเดซเดฟเด•เตเด•เต‡เดทเตป เดจเตฝเด•เตเดจเตเดจเดฟเดฒเตเดฒ. เด…เดตเดจเตเดฎเดพเดฏเดฟ เด’เดฐเต เดธเดœเต€เดต เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เตพ เด†เดฐเด‚เดญเดฟเดšเตเดšเดพเตฝ เดชเตเดฐเดคเดฟ เดคเดจเตเดฑเต† เดเดกเดจเตเดฑเดฟเดซเดฟเด•เตเด•เต‡เดทเตป เดจเตฝเด•เตเดจเตเดจเต. เดจเดฟเดทเตเด•เตเดฐเดฟเดฏ เดจเดฟเดฐเต€เด•เตเดทเด•เตป เด’เดจเตเดจเตเด‚ เดชเด เดฟเด•เตเด•เตเดจเตเดจเดฟเดฒเตเดฒ;
    เดธเดฟเด—เตเดฎ-เด†เตผ - เดธเดœเต€เดตเดฎเดพเดฏ เด†เด•เตเดฐเดฎเดฃเด™เตเด™เดณเดฟเตฝ เดจเดฟเดจเตเดจเต เดชเตเดฐเดคเดฟเด•เดฐเดฟเด•เตเด•เตเดจเตเดจเดฏเดพเดณเต† เดธเด‚เดฐเด•เตเดทเดฟเด•เตเด•เตเดจเตเดจเต, เดจเดฟเดทเตเด•เตเดฐเดฟเดฏ เด†เด•เตเดฐเดฎเดฃเด™เตเด™เดณเดฟเตฝ เดจเดฟเดจเตเดจเต เดคเตเดŸเด•เตเด•เด•เตเด•เดพเดฐเดจเต†. เดŽเดฒเตเดฒเดพเด‚ เดจเต‡เดฐเต† เดตเดฟเดชเดฐเต€เดคเดฎเดพเดฃเต, เดŽเดจเตเดจเดพเตฝ เดˆ เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เดณเดฟเตฝ เด‡เดคเดฟเดจเด•เด‚ เดจเดพเดฒเต เดนเดพเตปเดกเตโ€Œเดทเต‡เด•เตเด•เต เดธเดจเตเดฆเต‡เดถเด™เตเด™เตพ เด•เตˆเดฎเดพเดฑเตเดฑเด‚ เดšเต†เดฏเตเดคเดฟเดŸเตเดŸเตเดฃเตเดŸเต.

    เด•เตเดฒเดฏเดจเตเดฑเต-เดธเต†เตผเดตเตผ เดชเดฐเดฟเดšเดฟเดคเดฎเดพเดฏ เด•เดพเดฐเตเดฏเด™เตเด™เดณเดฟเตฝ เดจเดฟเดจเตเดจเต เดžเด™เตเด™เตพ เดชเตเดฐเดคเต€เด•เตเดทเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต‹เดŸเต เดธเดพเดฎเตเดฏเดฎเตเดณเตเดณเดคเดฟเดจเดพเตฝ เดžเด™เตเด™เตพ SIGMA-I เดคเดฟเดฐเดžเตเดžเต†เดŸเตเด•เตเด•เตเดจเตเดจเต: เด†เดงเดฟเด•เดพเดฐเดฟเด•เดคเดฏเตเดณเตเดณ เดธเต†เตผเดตเตผ เดฎเดพเดคเตเดฐเดฎเต‡ เด•เตเดฒเดฏเดจเตเดฑเต เดคเดฟเดฐเดฟเดšเตเดšเดฑเดฟเดฏเต‚, เดŽเดฒเตเดฒเดพเดตเตผเด•เตเด•เตเด‚ เด‡เดคเดฟเดจเด•เด‚ เดธเต†เตผเดตเดฑเดฟเดจเต† เด…เดฑเดฟเดฏเดพเด‚. เด•เต‚เดŸเดพเดคเต† เดนเดพเตปเดกเตโ€Œเดทเต‡เด•เตเด•เต เดธเดจเตเดฆเต‡เดถเด™เตเด™เตพ เด•เตเดฑเดตเดพเดฏเดคเดฟเดจเดพเตฝ เด‡เดคเต เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เดพเตป เดŽเดณเตเดชเตเดชเดฎเดพเดฃเต. เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เดณเดฟเดฒเต‡เด•เตเด•เต เดžเด™เตเด™เตพ เดšเต‡เตผเด•เตเด•เตเดจเตเดจเดคเต เดธเดจเตเดฆเต‡เดถเดคเตเดคเดฟเดจเตเดฑเต† เด’เดฐเต เดญเดพเด—เด‚ เดŽเตปเด•เตเดฐเดฟเดชเตเดฑเตเดฑเต เดšเต†เดฏเตเดฏเตเด•เดฏเตเด‚ เด…เดตเดธเดพเดจ เดธเดจเตเดฆเต‡เดถเดคเตเดคเดฟเดจเตเดฑเต† เดŽเตปเด•เตเดฐเดฟเดชเตเดฑเตเดฑเต เดšเต†เดฏเตเดค เดญเดพเด—เดคเตเดคเต‡เด•เตเด•เต เดเดกเดจเตเดฑเดฟเดซเดฏเตผ เดŽ เด•เตˆเดฎเดพเดฑเตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเด• เดŽเดจเตเดจเดคเดพเดฃเต:

    PubA, CookieA โ”‚ โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ• โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”€โ”€โ”€โ”€โ”€ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”€โ”€โ”€โ”€โ”€ โ”€โ”€โ”€โ”€โ”€โ”€>โ”‚ โ•‘SignPrvA , SignPubA = เดฒเต‹เดกเต()โ•‘ โ”‚ โ”‚ โ•‘PrvA, PubA = DHgen()โ”‚โ•‘โ•‘ โ•โ•โ•โ•โ•โ•โ•โ•โ• โ”‚ โ”‚ pubb, เด•เตเด•เตเด•เดฟเดฌเต, $ (เดเดกเดฟเดฌเดฟ, เดšเดฟเดนเตเดจเด‚ (CINCPRVB, (CINGPRVB, PABB), Mac (IDB))), Mac โ•” ed โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•— โ”‚< โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”€โ”€โ”€โ”€โ”€ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ•‘SignP rvB, SignPubB = เดฒเต‹เดกเต()โ•‘ โ”‚ โ”‚ โ”‚ โ•‘ PrvB, PubBโ”‚โ”‚โ”•โš‘ โ•โ•โ•โ•โ•โ•โ•โ•โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• โ”‚ โ”‚ โ•โ•โ•— โ”‚ Enc((IdA, เด…เดŸเดฏเดพเดณเด‚( SignPrvA, (CookieB, CookieA, PubA)), MAC(IdA))) โ”‚ โ•‘Key = DH(PrvA, PubB) โ•‘ โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”€โ”€ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”€โ”€โ”€โ”€โ”€โ”€>โ”‚โ•‘verify(Key, IdB) โ•‘ โ”‚ โ”‚ โ•‘verify( SignPubB, ...)โ•‘ โ”‚ โ”‚ โ•šโ•โ•โ•โ•โ•โ•โ•โ• โ•โ•โ•โ•โ• โ•โ•โ• โ”‚ โ”‚
    
    • เด’เดชเตเดชเดฟเดจเดพเดฏเดฟ GOST R เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต 34.10-2012 256-เดฌเดฟเดฑเตเดฑเต เด•เต€เด•เดณเตเดณเตเดณ เด…เตฝเด—เต‹เดฐเดฟเดคเด‚.
    • เดชเตŠเดคเต เด•เต€ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต, 34.10/2012/XNUMX VKO เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต.
    • CMAC เด†เดฃเต MAC เด†เดฏเดฟ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเดคเต. เดธเดพเด™เตเด•เต‡เดคเดฟเด•เดฎเดพเดฏเดฟ, เด‡เดคเต GOST R 34.13-2015 เตฝ เดตเดฟเดตเดฐเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจ เด’เดฐเต เดฌเตเดฒเต‹เด•เตเด•เต เดธเตˆเดซเดฑเดฟเดจเตเดฑเต† เด’เดฐเต เดชเตเดฐเดคเตเดฏเต‡เด• เดชเตเดฐเดตเตผเดคเตเดคเดจ เดฐเต€เดคเดฟเดฏเดพเดฃเต. เดˆ เดฎเต‹เดกเดฟเดจเตเดณเตเดณ เด’เดฐเต เดŽเตปเด•เตเดฐเดฟเดชเตเดทเตป เดซเด‚เด—เตโ€Œเดทเตป เด†เดฏเดฟ - เดชเตเตฝเดšเตเดšเดพเดŸเดฟ (34.12-2015).
    • เด…เดตเดจเตเดฑเต† เดชเตŠเดคเต เด•เต€เดฏเตเดŸเต† เดนเดพเดทเต เด‡เดจเตเดฑเตผเดฒเต‹เด•เตเด•เตเดŸเตเดŸเดฑเตเดŸเต† เดเดกเดจเตเดฑเดฟเดซเดฏเดฑเดพเดฏเดฟ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต. เด’เดฐเต เดนเดพเดทเดพเดฏเดฟ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต เดธเตเดŸเตเดฐเดฟเดฌเต‹เด—เต-256 (34.11/2012/256 XNUMX เดฌเดฟเดฑเตเดฑเตเด•เตพ).

    เดนเดพเตปโ€Œเดกเตโ€Œเดทเต‡เด•เตเด•เดฟเดจเต เดถเต‡เดทเด‚, เดชเด™เตเด•เดฟเดŸเตเดŸ เด’เดฐเต เด•เต€เดฏเดฟเตฝ เดžเด™เตเด™เตพ เดธเดฎเตเดฎเดคเดฟเด•เตเด•เตเด‚. เดŸเตเดฐเดพเตปเดธเตโ€Œเดชเต‹เตผเดŸเตเดŸเต เดธเดจเตเดฆเต‡เดถเด™เตเด™เดณเตเดŸเต† เด†เดงเดฟเด•เดพเดฐเดฟเด• เดŽเตปเด•เตเดฐเดฟเดชเตโ€Œเดทเดจเดพเดฏเดฟ เดจเดฎเตเด•เตเด•เต เด‡เดคเต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเด‚. เดˆ เดญเดพเด—เด‚ เดตเดณเดฐเต† เดฒเดณเดฟเดคเดตเตเด‚ เด’เดฐเต เดคเต†เดฑเตเดฑเต เดตเดฐเตเดคเตเดคเดพเตป เดชเตเดฐเดฏเดพเดธเดตเตเดฎเดพเดฃเต: เดžเด™เตเด™เตพ เดธเดจเตเดฆเต‡เดถ เด•เต—เดฃเตเดŸเตผ เดตเตผเดฆเตเดงเดฟเดชเตเดชเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดธเดจเตเดฆเต‡เดถเด‚ เดŽเตปเด•เตเดฐเดฟเดชเตเดฑเตเดฑเต เดšเต†เดฏเตเดฏเตเด•เดฏเตเด‚ (MAC) เด•เต—เดฃเตเดŸเดฑเตเด‚ เดธเตˆเดซเตผเดŸเต†เด•เตโ€Œเดธเตเดฑเตเดฑเตเด‚ เดชเตเดฐเดพเดฎเดพเดฃเต€เด•เดฐเดฟเด•เตเด•เตเด•เดฏเตเด‚ เด…เดฏเดฏเตเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต. เด’เดฐเต เดธเดจเตเดฆเต‡เดถเด‚ เดฒเดญเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ, เด•เตŒเดฃเตเดŸเดฑเดฟเดจเต เดชเตเดฐเดคเต€เด•เตเดทเดฟเดšเตเดš เดฎเต‚เดฒเตเดฏเดฎเตเดฃเตเดŸเต‹ เดŽเดจเตเดจเต เดžเด™เตเด™เตพ เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เตเดจเตเดจเต, เด•เต—เดฃเตเดŸเดฑเดฟเดจเตŠเดชเตเดชเด‚ เดธเตˆเดซเตผเดŸเต†เด•เตเดธเตเดฑเตเดฑเต เด†เดงเดฟเด•เดพเดฐเดฟเด•เดฎเดพเด•เตเด•เตเด•เดฏเตเด‚ เด…เดคเต เดกเต€เด•เตเดฐเดฟเดชเตเดฑเตเดฑเต เดšเต†เดฏเตเดฏเตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต. เดนเดพเตปเดกเตโ€Œเดทเต‡เด•เตเด•เต เดธเดจเตเดฆเต‡เดถเด™เตเด™เตพ เดŽเตปเด•เตเดฐเดฟเดชเตเดฑเตเดฑเต เดšเต†เดฏเตเดฏเดพเดจเตเด‚ เดธเดจเตเดฆเต‡เดถเด™เตเด™เตพ เดŸเตเดฐเดพเตปเดธเตเดชเต‹เตผเดŸเตเดŸเต เดšเต†เดฏเตเดฏเดพเดจเตเด‚ เด…เดต เดŽเด™เตเด™เดจเต† เดชเตเดฐเดพเดฎเดพเดฃเต€เด•เดฐเดฟเด•เตเด•เดพเดจเตเด‚ เดžเดพเตป เดŽเดจเตเดคเต เด•เต€ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดฃเด‚? เดˆ เดœเต‹เดฒเดฟเด•เตพเด•เตเด•เต†เดฒเตเดฒเดพเด‚ เด’เดฐเต เด•เต€ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเดคเต เด…เดชเด•เดŸเด•เดฐเดตเตเด‚ เดตเดฟเดตเต‡เด•เดถเต‚เดจเตเดฏเดตเตเดฎเดพเดฃเต. เดชเตเดฐเดคเตเดฏเต‡เด• เดซเด‚เด—เตเดทเดจเตเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด•เต€เด•เตพ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เต‡เดฃเตเดŸเดคเต เด†เดตเดถเตเดฏเดฎเดพเดฃเต เด•เต†.เดกเดฟ.เดŽเดซเต (เด•เต€ เดกเต†เดฑเดฟเดตเต‡เดทเตป เดซเด‚เด—เตโ€Œเดทเตป). เดตเต€เดฃเตเดŸเตเด‚, เดจเดฎเตเด•เตเด•เต เดฎเตเดŸเดฟ เดชเดฟเดณเตผเดจเตเดจเต เดŽเดจเตเดคเต†เด™เตเด•เดฟเดฒเตเด‚ เด•เดฃเตเดŸเตเดชเดฟเดŸเดฟเด•เตเด•เดฐเตเดคเต: HKDF เดตเดณเดฐเต†เด•เตเด•เดพเดฒเดฎเดพเดฏเดฟ เด…เดฑเดฟเดฏเดชเตเดชเต†เดŸเตเดŸเดฟเดฐเตเดจเตเดจเต, เดจเดจเตเดจเดพเดฏเดฟ เด—เดตเต‡เดทเดฃเด‚ เดจเดŸเดคเตเดคเดฟ, เด…เดฑเดฟเดฏเดชเตเดชเต†เดŸเตเดจเตเดจ เดชเตเดฐเดถเตเดจเด™เตเด™เดณเตŠเดจเตเดจเตเดฎเดฟเดฒเตเดฒ. เดจเดฟเตผเดญเดพเด—เตเดฏเดตเดถเดพเตฝ, เดจเต‡เดฑเตเดฑเต€เดตเต เดชเตˆเดคเตเดคเตบ เดฒเตˆเดฌเตเดฐเดฑเดฟเดฏเดฟเตฝ เดˆ เดชเตเดฐเดตเตผเดคเตเดคเดจเด‚ เด‡เดฒเตเดฒ, เด…เดคเดฟเดจเดพเตฝ เดžเด™เตเด™เตพ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต hkdf เดชเตเดฒเดพเดธเตเดฑเตเดฑเดฟเด•เต เดธเดžเตเดšเดฟ. HKDF เด†เดจเตเดคเดฐเดฟเด•เดฎเดพเดฏเดฟ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต เดŽเดšเตเดšเตเดŽเด‚เดŽเดธเดฟ, เด‡เดคเต เด’เดฐเต เดนเดพเดทเต เดซเด‚เด—เตเดทเตป เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต. เดตเดฟเด•เตเด•เดฟเดชเต€เดกเดฟเดฏ เดชเต‡เดœเดฟเดฒเต† เดชเตˆเดคเตเดคเดฃเดฟเดฒเต† เด’เดฐเต เด‰เดฆเดพเดนเดฐเดฃเด‚ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เด•เตเดฑเดšเตเดšเต เดตเดฐเดฟ เด•เต‹เดกเต เดฎเดพเดคเตเดฐเดฎเต‡ เดŽเดŸเตเด•เตเด•เต‚. 34.10/2012/256 เดฒเต† เดชเต‹เดฒเต†, เดžเด™เตเด™เตพ เดนเดพเดทเต เดซเด‚เด—เตโ€Œเดทเดจเดพเดฏเดฟ Stribog-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)
    

    เดนเดพเตปเดกเตโ€Œเดทเต‡เด•เตเด•เต เดŸเดฟเดฌเดฟเดŽเดธเต เด†เดฃเต เด’เดชเตเดชเดฟเดŸเตเดจเตเดจเดคเต. HandshakeTBE - เดŽเดจเตเดคเดพเดฃเต เดŽเตปเด•เตเดฐเดฟเดชเตเดฑเตเดฑเต เดšเต†เดฏเตเดฏเดชเตเดชเต†เดŸเตเด•. 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 เด’เดฐเต เด•เต‚เดŸเตเดŸเด‚ เดฌเตˆเดฑเตเดฑเตเด•เตพเด•เตเด•เตŠเดชเตเดชเด‚ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเดฟเดฒเตเดฒ, เดฎเดฑเดฟเดšเตเดšเต เดตเดฒเดฟเดฏ เดธเด‚เด–เตเดฏเด•เตพ, เด…เดคเดฟเดจเดพเตฝ เดžเด™เตเด™เดณเตเดŸเต† เดธเตเดตเด•เดพเดฐเตเดฏ เด•เต€ (urandom(32)) gost3410.prv_unmarshal() เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด’เดฐเต เดธเด‚เด–เตเดฏเดฏเดฟเดฒเต‡เด•เตเด•เต เดชเดฐเดฟเดตเตผเดคเตเดคเดจเด‚ เดšเต†เดฏเตเดฏเต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต. gost3410.public_key() เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดธเตเดตเด•เดพเดฐเตเดฏ เด•เต€เดฏเดฟเตฝ เดจเดฟเดจเตเดจเต เดชเตŠเดคเต เด•เต€ เดจเดฟเตผเดฃเตเดฃเดฏเดฟเด•เตเด•เดชเตเดชเต†เดŸเตเดจเตเดจเต. gost34.10.pub_marshal() เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดธเด‚เดญเดฐเดฃเดคเตเดคเดฟเดจเตเด‚ เดชเตเดฐเด•เตเดทเต‡เดชเดฃเดคเตเดคเดฟเดจเตเด‚ เดŽเดณเตเดชเตเดชเดคเตเดคเดฟเดจเดพเดฏเดฟ เด’เดฐเต เดฌเตˆเดฑเตเดฑเต เดธเต€เด•เตเดตเตปเดธเดฟเดฒเต‡เด•เตเด•เต เดชเดฐเดฟเดตเตผเดคเตเดคเดจเด‚ เดšเต†เดฏเตเดฏเต‡เดฃเตเดŸ เดฐเดฃเตเดŸเต เดตเดฒเดฟเดฏ เดธเด‚เด–เตเดฏเด•เดณเดพเดฃเต เดชเตŠเดคเต เด•เต€ 3410.

    JSON เดซเดฏเตฝ เดตเดพเดฏเดฟเดšเตเดšเดคเดฟเดจเตเดถเต‡เดทเด‚, gost3410.pub_unmarshal() เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดชเตŠเดคเต เด•เต€เด•เตพ เด…เดคเดจเตเดธเดฐเดฟเดšเตเดšเต เดคเดฟเดฐเดฟเด•เต† เดชเดฐเดฟเดตเตผเดคเตเดคเดจเด‚ เดšเต†เดฏเตเดฏเต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต. เดชเดฌเตเดฒเดฟเด•เต เด•เต€เดฏเดฟเตฝ เดจเดฟเดจเตเดจเต เด’เดฐเต เดนเดพเดทเดฟเดจเตเดฑเต† เดฐเต‚เดชเดคเตเดคเดฟเตฝ เด‡เดจเตเดฑเตผเดฒเต‹เด•เตเด•เตเดŸเตเดŸเตผเดฎเดพเดฐเตเดŸเต† เดเดกเดจเตเดฑเดฟเดซเดฏเดฑเตเด•เตพ เดžเด™เตเด™เตพเด•เตเด•เต เดฒเดญเดฟเด•เตเด•เตเดฎเต†เดจเตเดจเดคเดฟเดจเดพเตฝ, เด…เดต เด‰เดŸเดจเดŸเดฟ เดฎเตเตปเด•เต‚เดŸเตเดŸเดฟ เด•เดฃเด•เตเด•เดพเด•เตเด•เตเด•เดฏเตเด‚ เดฆเตเดฐเตเดค เดคเดฟเดฐเดฏเดฒเดฟเดจเดพเดฏเดฟ เด’เดฐเต เดจเดฟเด˜เดฃเตเดŸเตเดตเดฟเตฝ เดธเตเดฅเดพเดชเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเดพเด‚. Stribog-256 เดนเดพเดทเต เดŽเดจเตเดจเดคเต 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()
    

    • เดžเด™เตเด™เตพ เด’เดฐเต เดชเตเดฐเดคเดฟเด•เดฐเดฃเดคเตเดคเดฟเดจเดพเดฏเดฟ เด•เดพเดคเตเดคเดฟเดฐเดฟเด•เตเด•เตเด•เดฏเตเด‚ เด‡เตปเด•เดฎเดฟเด‚เด—เต Msg เดธเดจเตเดฆเต‡เดถเด‚ เดกเต€เด•เต‹เดกเต เดšเต†เดฏเตเดฏเตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต;
    • เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดนเดธเตเดคเดฆเดพเดจเด‚ เดฒเดญเดฟเด•เตเด•เตเดจเตเดจเตเดตเต†เดจเตเดจเต เด‰เดฑเดชเตเดชเดพเด•เตเด•เตเด•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-เดฌเดฟเดฑเตเดฑเต เดจเดฎเตเดชเดฑเดพเดฃเต (urandom(8)), เด‡เดคเดฟเดจเต gost3410_vko.ukm_unmarshal() เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด…เดคเดฟเดจเตเดฑเต† เดฌเตˆเดฑเตเดฑเต เดชเตเดฐเดพเดคเดฟเดจเดฟเดงเตเดฏเดคเตเดคเดฟเตฝ เดจเดฟเดจเตเดจเต เดกเต€เดฐเดฟเดฏเดฒเตˆเดธเต‡เดทเตป เด†เดตเดถเตเดฏเดฎเดพเดฃเต. 34.10/2012/256 3410-เดฌเดฟเดฑเตเดฑเดฟเดจเดพเดฏเตเดณเตเดณ VKO เดซเด‚เด—เตโ€Œเดทเตป gost34102012256_vko.kek_XNUMX() (KEK - เดŽเตปเด•เตเดฐเดฟเดชเตเดทเตป เด•เต€) เด†เดฃเต.

    เดœเดจเดฑเต‡เดฑเตเดฑเตเดšเต†เดฏเตโ€Œเดค เดธเต†เดทเตป เด•เต€ เด‡เดคเดฟเดจเด•เด‚ เดคเดจเตเดจเต† 256-เดฌเดฟเดฑเตเดฑเต เดตเตเดฏเดพเดœ-เดฑเดพเตปเดกเด‚ เดฌเตˆเดฑเตเดฑเต เดธเต€เด•เตเดตเตปเดธเดพเดฃเต. เด…เดคเดฟเดจเดพเตฝ, เด‡เดคเต เดŽเดšเตเดšเตเด•เต†เดกเดฟเดŽเดซเต เดซเด‚เด—เตเดทเดจเตเด•เดณเดฟเตฝ เด‰เดŸเดจเดŸเดฟ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเด‚. GOST34112012256 เดนเดพเดทเตเดฒเดฟเดฌเต เด‡เดจเตเดฑเตผเดซเต‡เดธเดฟเดจเต† เดคเตƒเดชเตเดคเดฟเดชเตเดชเต†เดŸเตเดคเตเดคเตเดจเตเดจเดคเดฟเดจเดพเตฝ, เด‡เดคเต เด‰เดŸเตป เดคเดจเตเดจเต† 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(เด•เต€) เดŽเดจเตเดจเต เดตเดฟเดณเดฟเดšเตเดšเต Kuznechik เด†เดฐเด‚เดญเดฟเด•เตเด•เตเดจเตเดจเต, เด•เต‚เดŸเดพเดคเต† 34.13 เดซเด‚เด—เตโ€Œเดทเดจเตเด•เดณเดฟเดฒเต‡เด•เตเด•เต เดชเต‹เด•เตเดจเตเดจเดคเดฟเดจเต เด…เดจเตเดฏเต‹เดœเตเดฏเดฎเดพเดฏ .encrypt()/.decrypt() เดฐเต€เดคเดฟเด•เดณเตเดณเตเดณ เด’เดฐเต เด’เดฌเตโ€Œเดœเด•เตเดฑเตเดฑเต เดคเดฟเดฐเดฟเด•เต† เดจเตฝเด•เตเดจเตเดจเต. MAC เด‡เดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจ เดฐเต€เดคเดฟเดฏเดฟเตฝ เด•เดฃเด•เตเด•เดพเด•เตเด•เตเดจเตเดจเต: gost3413.mac(GOST3412Kuznechik(key).encrypt, KUZNECHIK_BLOCKSIZE, ciphertext). เด•เดฃเด•เตเด•เดพเด•เตเด•เดฟเดฏเดคเตเด‚ เดธเตเดตเต€เด•เดฐเดฟเดšเตเดšเดคเตเดฎเดพเดฏ MAC เดคเดพเดฐเดคเดฎเตเดฏเด‚ เดšเต†เดฏเตเดฏเดพเตป, เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดฌเตˆเดฑเตเดฑเต เดธเตเดŸเตเดฐเดฟเด‚เด—เตเด•เดณเตเดŸเต† เดธเดพเดงเดพเดฐเดฃ เดคเดพเดฐเดคเดฎเตเดฏเด‚ (==) เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเดฟเดฒเตเดฒ, เด•เดพเดฐเดฃเด‚ เดˆ เดชเตเดฐเดตเตผเดคเตเดคเดจเด‚ เดคเดพเดฐเดคเดฎเตเดฏ เดธเดฎเดฏเด‚ เดšเต‹เตผเดคเตเดคเตเดจเตเดจเต, เด‡เดคเต เดชเตŠเดคเตเดตเต† เดฎเดพเดฐเด•เดฎเดพเดฏ เด•เต‡เดŸเตเดชเดพเดŸเตเด•เตพเด•เตเด•เต เด‡เดŸเดฏเดพเด•เตเด•เตเด‚. เดฌเต€เดธเตเดฑเตเดฑเต TLS-เดจเต เดจเต‡เดฐเต†เดฏเตเดณเตเดณ เด†เด•เตเดฐเดฎเดฃเด™เตเด™เตพ. เด‡เดคเดฟเดจเดพเดฏเดฟ เดชเตˆเดคเตเดคเดฃเดฟเดจเต เด’เดฐเต เดชเตเดฐเดคเตเดฏเต‡เด• เดซเด‚เด—เตโ€Œเดทเตป เด‰เดฃเตเดŸเต, hmac.compare_digest.

    เดฌเตเดฒเต‹เด•เตเด•เต เดธเตˆเดซเตผ เดซเด‚เด—เตโ€Œเดทเดจเต เด’เดฐเต เดฌเตเดฒเต‹เด•เตเด•เต เดกเดพเดฑเตเดฑ เดฎเดพเดคเตเดฐเดฎเต‡ เดŽเตปเด•เตเดฐเดฟเดชเตเดฑเตเดฑเต เดšเต†เดฏเตเดฏเดพเดจเดพเด•เต‚. เด’เดฐเต เดตเดฒเดฟเดฏ เดธเด‚เด–เตเดฏเดฏเตเด•เตเด•เต, เดจเต€เดณเดคเตเดคเดฟเดจเตเดฑเต† เด—เตเดฃเดฟเดคเดฎเดฒเตเดฒเต†เด™เตเด•เดฟเดฒเตเด‚, เดŽเตปเด•เตเดฐเดฟเดชเตเดทเตป เดฎเต‹เดกเต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เต‡เดฃเตเดŸเดคเต เด†เดตเดถเตเดฏเดฎเดพเดฃเต. 34.13-2015 เด‡เดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจเดต เดตเดฟเดตเดฐเดฟเด•เตเด•เตเดจเตเดจเต: ECB, CTR, OFB, CBC, CFB. เด“เดฐเต‹เดจเตเดจเดฟเดจเตเด‚ เด…เดคเดฟเดจเตเดฑเต‡เดคเดพเดฏ เดธเตเดตเต€เด•เดพเดฐเตเดฏเดฎเดพเดฏ เดชเตเดฐเดฏเต‹เด— เดฎเต‡เด–เดฒเด•เดณเตเด‚ เดธเดตเดฟเดถเต‡เดทเดคเด•เดณเตเด‚ เด‰เดฃเตเดŸเต. เดจเดฟเตผเดญเดพเด—เตเดฏเดตเดถเดพเตฝ, เดžเด™เตเด™เตพ เด‡เดชเตเดชเต‹เดดเตเด‚ เดธเตเดฑเตเดฑเดพเตปเดกเต‡เตผเดกเต เดšเต†เดฏเตเดคเดฟเดŸเตเดŸเดฟเดฒเตเดฒ เด…เด‚เด—เต€เด•เตƒเดค เดŽเตปเด•เตเดฐเดฟเดชเตเดทเตป เดฎเต‹เดกเตเด•เตพ (CCM, OCB, GCM เดŽเดจเตเดจเดฟเดตเดฏเตเด‚ เดฎเดฑเตเดฑเตเด‚) - เด•เตเดฑเดžเตเดžเดคเต MAC เดธเตเดตเดฏเด‚ เดšเต‡เตผเด•เตเด•เดพเตป เดžเด™เตเด™เตพ เดจเดฟเตผเดฌเดจเตเดงเดฟเดคเดฐเดพเด•เตเดจเตเดจเต. เดžเดพเตป เดคเดฟเดฐเดžเตเดžเต†เดŸเตเด•เตเด•เตเดจเตเดจเต เด•เตŒเดฃเตเดŸเตผ เดฎเต‹เดกเต (CTR): เด‡เดคเดฟเดจเต เดฌเตเดฒเต‹เด•เตเด•เต เดตเดฒเตเดชเตเดชเดคเตเดคเดฟเดฒเต‡เด•เตเด•เต เดชเดพเดกเดฟเด‚เด—เต เด†เดตเดถเตเดฏเดฎเดฟเดฒเตเดฒ, เดธเดฎเดพเดจเตเดคเดฐเดฎเดพเด•เตเด•เดพเด‚, เดŽเตปเด•เตเดฐเดฟเดชเตเดทเตป เดซเด‚เด—เตเดทเตป เดฎเดพเดคเตเดฐเด‚ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต, เดตเดฒเดฟเดฏ เด…เดณเดตเดฟเดฒเตเดณเตเดณ เดธเดจเตเดฆเต‡เดถเด™เตเด™เตพ เดŽเตปเด•เตเดฐเดฟเดชเตเดฑเตเดฑเต เดšเต†เดฏเตเดฏเดพเตป เดธเตเดฐเด•เตเดทเดฟเดคเดฎเดพเดฏเดฟ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเด‚ (เดธเดฟเดฌเดฟเดธเดฟเดฏเดฟเตฝ เดจเดฟเดจเตเดจเต เดตเตเดฏเดคเตเดฏเดธเตเดคเดฎเดพเดฏเดฟ, เดคเดพเดฐเดคเดฎเตเดฏเต‡เดจ เดตเต‡เด—เดคเตเดคเดฟเตฝ เด•เต‚เดŸเตเดŸเดฟเดฎเตเดŸเตเดŸเดฒเตเด•เตพ เด‰เดฃเตเดŸเดพเด•เตเดจเตเดจเต).

    .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 coroutine เด‡เดชเตเดชเต‹เตพ เดธเดจเตเดฆเต‡เดถเด™เตเด™เตพ เด’เดฐเต 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 coroutine เด†เดฃเต, เด…เดคเต เดชเตเดฐเดพเดฎเดพเดฃเต€เด•เดฐเดฃเดตเตเด‚ เดกเต€เด•เตเดฐเดฟเดชเตเดทเดจเตเด‚ เด•เตˆเด•เดพเดฐเตเดฏเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต:

    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, เดŽเตปเดŽเตปเดธเดฟเดชเดฟ, เด—เต‹เดตเดฟเดชเดฟเดŽเตป, GOSTIM เดชเต‚เตผเดฃเตเดฃเดฎเดพเดฏเตเด‚ เด†เดฃเต เดธเตเดตเดคเดจเตเดคเตเดฐ เดธเต‹เดซเตเดฑเตเดฑเตโ€Œเดตเต†เดฏเตผ, เดจเดฟเดฌเดจเตเดงเดจเด•เตพ เดชเตเดฐเด•เดพเดฐเด‚ เดตเดฟเดคเดฐเดฃเด‚ GPLv3 +.

    เดธเต†เตผเดœเดฟ เดฎเดพเดฑเตเดฑเตเดตเต€เดตเต, เดธเตˆเดซเตผเดชเด™เตเด•เต, เด…เด‚เด—เด‚ เดŽเดธเตเดชเดฟเด’ เดซเต—เดฃเตเดŸเต‡เดทเตป, เดชเตˆเดคเตเดคเตบ/เด—เต‹ เดกเต†เดตเดฒเดชเตเดชเตผ, เดšเต€เดซเต เดธเตเดชเต†เดทเตเดฏเดฒเดฟเดธเตเดฑเตเดฑเต FSUE "STC "เด…เดฑเตเดฑเตเดฒเดธเต".

เด…เดตเดฒเด‚เดฌเด‚: www.habr.com

เด’เดฐเต เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚ เดšเต‡เตผเด•เตเด•เตเด•