เดเดฐเต เดกเตเดตเดฒเดชเตเดชเตผ เดเดเตเดจเตเดจเดคเต
เดเตเดฐเดฟเดชเตโเดฑเตเดฑเตเดเตเดฐเดพเดซเดฟเดเต เดชเตเดฐเตเดเตเดเตเดเตเดเตเดณเตเดเดณเตเด เดธเตเดฐเดเตเดทเดฟเดคเดฎเดพเดฏ IM-เดฏเตเด เดจเดเดชเตเดชเดฟเดฒเดพเดเตเดเตเดจเตเดจเดคเต เด เดคเตเดฐ เดฌเตเดฆเตเดงเดฟเดฎเตเดเตเดเตเดณเตเดณ เดเดพเดฐเตเดฏเดฎเดฒเตเดฒเตเดจเตเดจเต เดเดพเดฃเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเดพเดฃเต เด เดฒเตเดเดจเด เดเดดเตเดคเดพเตป เดเดคเตเดฒเตเดฒเดพเด เดเดจเตเดจเต เดชเตเดฐเตเดฐเดฟเดชเตเดชเดฟเดเตเดเดคเต. เดเดจเตเดจเดฟเดฐเตเดจเตเดจเดพเดฒเตเด, เดจเดฟเดเตเดเดณเตเดเต เดธเตเดตเดจเตเดคเด เดชเตเดฐเดพเดฎเดพเดฃเตเดเดฐเดฃเดตเตเด เดชเตเดฐเดงเดพเดจ เดเดฐเดพเตผ เดชเตเดฐเตเดเตเดเตเดเตเดเตเดณเตเดเดณเตเด เดเดฃเตเดเตเดชเดฟเดเดฟเดเตเดเตเดจเตเดจเดคเต เดตเดฟเดฒเดฎเดคเดฟเดเตเดเตเดจเตเดจเดฟเดฒเตเดฒ.
เดฒเตเดเดจเด เดเดดเตเดคเตเด
IM เดกเดฟเดธเตเตป
เดเดฆเตเดฏเด, เดจเดฎเตเดฎเตเดเต IM เดเดเตเดเดจเตเดฏเดพเดฏเดฟเดฐเดฟเดเตเดเตเดฎเตเดจเตเดจเต เดจเดฎเตเดฎเตพ เดฎเดจเดธเตเดธเดฟเดฒเดพเดเตเดเตเดฃเตเดเดคเตเดฃเตเดเต. เดฒเดพเดณเดฟเดคเตเดฏเดคเตเดคเดฟเดจเดพเดฏเดฟ, เดชเดเตเดเตเดเตเดเตเดเตเดจเตเดจเดตเดฐเต เดเดฃเตเดเตเดคเตเดคเดพเดคเต เดคเดจเตเดจเต เดเดคเต เดเดฐเต เดชเดฟเดฏเตผ-เดเต-เดชเดฟเดฏเตผ เดจเตเดฑเตเดฑเตโเดตเตผเดเตเดเดพเดฏเดฟเดฐเดฟเดเตเดเดเตเดเต. เดเดเตเดเตพ เดตเตเดฏเดเตเดคเดฟเดชเดฐเดฎเดพเดฏเดฟ เดเดคเต เดตเดฟเดฒเดพเดธเด เดธเตเดเดฟเดชเตเดชเดฟเดเตเดเตเด: เดเดจเตเดฑเตผเดฒเตเดเตเดเตเดเตเดเดฑเตเดฎเดพเดฏเดฟ เดเดถเดฏเดตเดฟเดจเดฟเดฎเดฏเด เดจเดเดคเตเดคเดพเตป เดฌเดจเตเดงเดฟเดชเตเดชเดฟเดเตเดเตเดฃเตเด เดชเตเตผเดเตเดเต.
เด เดธเดฎเดฏเดคเตเดคเต, เดฐเดฃเตเดเต เด เดจเดฟเดฏเดจเตเดคเตเดฐเดฟเดคเดฎเดพเดฏ เดเดฎเตเดชเตเดฏเตเดเตเดเดฑเตเดเตพเดเตเดเดฟเดเดฏเดฟเตฝ เดจเตเดฐเดฟเดเตเดเตเดณเตเดณ เดเดถเดฏเดตเดฟเดจเดฟเดฎเดฏเด เดฒเดญเตเดฏเดฎเดพเดฃเตเดจเตเดจ เด เดจเตเดฎเดพเดจเด เดชเตเดฐเดพเดฏเตเดเดฟเดเดฎเดพเดฏเดฟ IM-เดจเตเดฑเต เดชเตเดฐเดฏเตเดเดเตเดทเดฎเดคเดฏเตเดเต เดเดพเดฐเตเดฏเดฎเดพเดฏ เดชเดฐเดฟเดฎเดฟเดคเดฟเดฏเดพเดฃเตเดจเตเดจเต เดเดพเตป เดฎเดจเดธเตเดธเดฟเดฒเดพเดเตเดเตเดจเตเดจเต. เดเดจเตเดจเดพเตฝ เดเตเดเตเดคเตฝ เดกเดตเดฒเดชเตเดชเตผเดฎเดพเตผ เดเดฒเตเดฒเดพเดคเตเดคเดฐเด NAT-เดเตเดฐเดพเดตเตเดดเตเดธเตฝ เดเตเดฐเดเตเดเตเดเดณเตเด เดจเดเดชเตเดชเดฟเดฒเดพเดเตเดเตเดจเตเดจเต, เด เดจเดฟเดฏเดจเตเดคเตเดฐเดฟเดคเดฎเดพเดฏ เดเดฎเตเดชเตเดฏเตเดเตเดเดฑเตเดเตพ เดคเดฎเตเดฎเดฟเดฒเตเดณเตเดณ เดเดถเดฏเดตเดฟเดจเดฟเดฎเดฏเดคเตเดคเดฟเดจเตเดฑเต เดจเดฟเดฐเดพเดถเดพเดเดจเดเดฎเดพเดฏ เดธเดเดญเดพเดตเตเดฏเดคเดฏเตเดเต เดเดเตเดเตพ IPv4 เดเดจเตเดฑเตผเดจเตเดฑเตเดฑเดฟเตฝ เดเตเดเตเดคเตฝ เดเดพเดฒเด เดจเดฟเดฒเดจเดฟเตฝเดเตเดเตเด. เดตเตเดเตเดเดฟเดฒเตเด เดเตเดฒเดฟเดธเตเดฅเดฒเดคเตเดคเตเด IPv6 เดจเตเดฑเต เด เดญเดพเดตเด เดจเดฟเดเตเดเตพเดเตเดเต เดเดคเตเดฐเดคเตเดคเตเดณเด เดธเดนเดฟเดเตเดเดพเตป เดเดดเดฟเดฏเตเด?
เดเดเตเดเตพเดเตเดเต เดเดฐเต เดเดเตเดเดพเดคเดฟ-เดธเตเดนเตเดคเตเดคเต เดจเตเดฑเตเดฑเตโเดตเตผเดเตเดเต เดเดฃเตเดเดพเดฏเดฟเดฐเดฟเดเตเดเตเด: เดธเดพเดงเตเดฏเดฎเดพเดฏ เดเดฒเตเดฒเดพ เดเดจเตเดฑเตผเดฒเตเดเตเดเตเดเตเดเดฑเตเดเดณเตเด เดฎเตเตปเดเตเดเตเดเดฟ เด เดฑเดฟเดเตเดเดฟเดฐเดฟเดเตเดเดฃเด. เดเดจเตเดจเดพเดฎเดคเดพเดฏเดฟ, เดเดคเต เดเดฒเตเดฒเดพเด เดตเดณเดฐเต เดฒเดณเดฟเดคเดฎเดพเดเตเดเตเดจเตเดจเต: เดเดเตเดเตพ เดธเตเดตเดฏเด เดชเดฐเดฟเดเดฏเดชเตเดชเตเดเตเดคเตเดคเดฟ, เดชเตเดฐเต / เดเต เดเดฃเตเดเตเดคเตเดคเดฟ เด เดฒเตเดฒเตเดเตเดเดฟเตฝ เดเดฃเตเดเตเดคเตเดคเดฟเดฏเดฟเดฒเตเดฒ, เดตเดฟเดเตเดเตเดฆเดฟเดเตเดเต เด เดฒเตเดฒเตเดเตเดเดฟเตฝ เดเตเดฒเดฟเดฏเดฟเตฝ เดคเตเดเดฐเตเด, เดธเดเดญเดพเดทเดฃเดเตเดเดพเดฐเดจเต เด เดฑเดฟเดฏเตเด. เดฐเดฃเตเดเดพเดฎเดคเดพเดฏเดฟ, เดชเตเดคเตเดตเต, เดเดคเต เดธเตเดฐเดเตเดทเดฟเดคเดตเตเด เดชเดฒ เดเดเตเดฐเดฎเดฃเดเตเดเดณเตเด เดเดฒเตเดฒเดพเดคเดพเดเตเดเตเดจเตเดจเต.
IM เดเดจเตเดฑเตผเดซเตเดธเต เดเตเดฒเดพเดธเดฟเดเต เดธเตเดฒเตเดฏเตเดทเดจเตเดเตพเดเตเดเต เดธเดฎเตเดชเดฎเดพเดฏเดฟเดฐเดฟเดเตเดเตเด
- เดเตป - เดธเดเดญเดพเดทเดฃเดเตเดเดพเดฐเดจเต เด เดฏเดเตเด เดธเดจเตเดฆเตเดถเดเตเดเตพ เด เดคเดฟเตฝ เดฐเตเดเดชเตเดชเตเดเตเดคเตเดคเดฟเดฏเดฟเดเตเดเตเดฃเตเดเต;
- เดเดเตเดเต - เดเดจเตเดฑเตผเดฒเตเดเตเดเตเดเตเดเดฑเดฟเตฝ เดจเดฟเดจเตเดจเต เดฒเดญเดฟเดเตเด เดธเดจเตเดฆเตเดถเดเตเดเตพ เด เดคเดฟเตฝ เดจเดฟเดจเตเดจเต เดตเดพเดฏเดฟเดเตเดเตเดจเตเดจเต;
- เดธเดเดธเตเดฅเดพเดจเด - เด เดคเดฟเตฝ เดจเดฟเดจเตเดจเต เดตเดพเดฏเดฟเดเตเดเตเดจเตเดจเดคเดฟเดฒเตเดเต, เดเดจเตเดฑเตผเดฒเตเดเตเดเตเดเตเดเตผ เดจเดฟเดฒเดตเดฟเตฝ เดฌเดจเตเดงเดฟเดชเตเดชเดฟเดเตเดเดฟเดเตเดเตเดฃเตเดเต, เดเดฃเดเตเดทเตป เดตเดฟเดฒเดพเดธเด / เดชเตเตผเดเตเดเต เดเดจเตเดจเดฟเดต เดเดเตเดเตพ เดเดฃเตเดเตเดคเตเดคเตเดจเตเดจเต.
เดเตเดเดพเดคเต, เดนเตเดธเตเดฑเตเดฑเต เดชเตเตผเดเตเดเต เดเดดเตเดคเตเดจเตเดจเดคเดฟเดฒเตเดเต เดเดฐเต เดเตเตบ เดธเตเดเตเดเดฑเตเดฑเต เดธเตเดทเตเดเดฟเดเตเดเดชเตเดชเตเดเตเดจเตเดจเต, เด เดคเดฟเตฝ เดเดเตเดเตพ เดฑเดฟเดฎเตเดเตเดเต เดเดจเตเดฑเตผเดฒเตเดเตเดเตเดเตเดเดฑเดฟเดฒเตเดเตเดเต เดเดฐเต เดเดฃเดเตเดทเตป เดเดฐเดเดญเดฟเดเตเดเตเดจเตเดจเต.
|-- alice
| |-- in
| |-- out
| `-- state
|-- bob
| |-- in
| |-- out
| `-- state
`- conn
เด เดธเดฎเตเดชเดจเด IM เดเตเดฐเดพเตปเดธเตเดชเตเตผเดเตเดเดฟเดจเตเดฑเตเดฏเตเด เดเดชเดฏเตเดเตเดคเต เดเดจเตเดฑเตผเดซเตเดธเดฟเดจเตเดฑเตเดฏเตเด เดธเตเดตเดคเดจเตเดคเตเดฐเดฎเดพเดฏ เดจเดเดชเตเดชเดพเดเตเดเดฒเตเดเตพ เดจเดเดคเตเดคเดพเตป เดจเดฟเดเตเดเดณเต เด
เดจเตเดตเดฆเดฟเดเตเดเตเดจเตเดจเต, เดเดพเดฐเดฃเด เดเดฐเต เดธเตเดนเตเดคเตเดคเตเด เดเดฒเตเดฒ, เดจเดฟเดเตเดเตพเดเตเดเต เดเดฒเตเดฒเดพเดตเดฐเตเดฏเตเด เดชเตเดฐเดธเดพเดฆเดฟเดชเตเดชเดฟเดเตเดเดพเตป เดเดดเดฟเดฏเดฟเดฒเตเดฒ. เดเดชเดฏเตเดเดฟเดเตเดเตเดจเตเดจเดคเต
เดตเดพเดธเตเดคเดตเดคเตเดคเดฟเตฝ, เดธเดเตเดฒเตเดธเต เดชเตเดฐเตเดเดเตเดฑเตเดฑเตเดเตพ FIFO เดซเดฏเดฒเตเดเตพ เดเดชเดฏเตเดเดฟเดเตเดเตเดจเตเดจเต. เดตเตเดฏเดเตเดคเดฟเดชเดฐเดฎเดพเดฏเดฟ, เดธเดฎเตผเดชเตเดชเดฟเดค เดคเตเดฐเตเดกเตเดเดณเดฟเตฝ เดจเดฟเดจเตเดจเต เดเตเดเตเดฃเตเดเต เดเดดเตเดคเดฟเดฏ เดชเดถเตเดเดพเดคเตเดคเดฒเดฎเดฟเดฒเตเดฒเดพเดคเต เด
เดธเดฟเตปเดธเดฟเดฏเตเดฏเดฟเตฝ เดฎเดคเตเดธเดฐเดพเดงเดฟเดทเตเด เดฟเดคเดฎเดพเดฏเดฟ เดซเดฏเดฒเตเดเตพ เดเดเตเดเดจเต เดชเตเดฐเดตเตผเดคเตเดคเดฟเดเตเดเดฃเดฎเตเดจเตเดจเต เดเดจเดฟเดเตเดเต เดฎเดจเดธเตเดธเดฟเดฒเดพเดฏเดฟเดฒเตเดฒ (เดเดพเตป เดตเดณเดฐเตเดเตเดเดพเดฒเดฎเดพเดฏเดฟ เด
เดคเตเดคเดฐเด เดเดพเดฐเตเดฏเดเตเดเตพเดเตเดเดพเดฏเดฟ เดญเดพเดท เดเดชเดฏเตเดเดฟเดเตเดเตเดจเตเดจเต
เดฏเดฅเดพเตผเดคเตเดฅ เดธเตเดฐเดเตเดทเดฟเดคเดฎเดฒเตเดฒเดพเดคเตเดค เดชเตเดฐเตเดเตเดเตเดเตเดเตเตพ
เดเดคเดพเดเดคเดฎเดพเดฏเดฟ เดเดฟเดธเดฟเดชเดฟ เดเดชเดฏเตเดเดฟเดเตเดเตเดจเตเดจเต: เดเดคเต เดกเตเดฒเดฟเดตเดฑเดฟเดฏเตเด เด
เดคเดฟเดจเตเดฑเต เดเตผเดกเดฑเตเด เดเดฑเดชเตเดชเต เดจเตฝเดเตเดจเตเดจเต. UDP เดเดฑเดชเตเดชเตเดจเตฝเดเตเดจเตเดจเดฟเดฒเตเดฒ (เดเตเดฐเดฟเดชเตเดฑเตเดฑเตเดเตเดฐเดซเดฟ เดเดชเดฏเตเดเดฟเดเตเดเตเดฎเตเดชเตเตพ เดเดคเต เดเดชเดฏเตเดเดชเตเดฐเดฆเดฎเดพเดเตเด), เดชเดเตเดทเต เดชเดฟเดจเตเดคเตเดฃ
เดจเดฟเตผเดญเดพเดเตเดฏเดตเดถเดพเตฝ, เดเดฟเดธเดฟเดชเดฟเดฏเดฟเตฝ เดเดฐเต เดธเดจเตเดฆเตเดถเดคเตเดคเดฟเดจเตเดฑเต เดเดถเดฏเด เดเดฒเตเดฒ, เดฌเตเดฑเตเดฑเตเดเดณเตเดเต เดเดฐเต เดธเตเดเตเดฐเตเด เดฎเดพเดคเตเดฐเด. เด
เดคเดฟเดจเดพเตฝ, เด เดคเตเดฐเตเดกเดฟเตฝ เดธเดจเตเดฆเตเดถเดเตเดเตพ เดชเดฐเดธเตเดชเดฐเด เดชเดเตเดเดฟเดเดพเตป เดเดดเดฟเดฏเตเดจเตเดจ เดคเดฐเดคเตเดคเดฟเตฝ เดเดฐเต เดซเตเตผเดฎเดพเดฑเตเดฑเต เดเตเดฃเตเดเตเดตเดฐเตเดฃเตเดเดคเต เดเดตเดถเตเดฏเดฎเดพเดฃเต. เดฒเตเตป เดซเตเดกเต เดชเตเดฐเดคเตเดเด เดเดชเดฏเตเดเดฟเดเตเดเดพเตป เดเดเตเดเตพเดเตเดเต เดธเดฎเตเดฎเดคเดฟเดเตเดเดพเด. เดคเตเดเดเตเดเดเตเดเดพเตผเดเตเดเต เดเดคเต เดจเดฒเตเดฒเดคเดพเดฃเต, เดเดจเตเดจเดพเตฝ เดเดเตเดเตพ เดธเดจเตเดฆเตเดถเดเตเดเตพ เดเตปเดเตเดฐเดฟเดชเตเดฑเตเดฑเต เดเตเดฏเตเดฏเดพเตป เดคเตเดเดเตเดเดฟเดฏเดพเตฝ, เด เดชเตเดฐเดคเตเดเด เดธเตเดซเตผเดเตเดเตเดธเตเดฑเตเดฑเดฟเตฝ เดเดตเดฟเดเตเดฏเตเด เดฆเตเดถเตเดฏเดฎเดพเดฏเตเดเตเดเดพเด. เดจเตเดฑเตเดฑเตโเดตเตผเดเตเดเตเดเดณเดฟเตฝ, เด
เดคเดฟเดจเดพเตฝ, เดธเดจเตเดฆเตเดถเดคเตเดคเดฟเดจเตเดฑเต เดฆเตเตผเดเตเดฏเด เดเดฆเตเดฏเด เดฌเตเดฑเตเดฑเตเดเดณเดฟเตฝ เด
เดฏเดเตเดเตเดจเตเดจเดตเดฏเดพเดฃเต เดเดจเดชเตเดฐเดฟเดฏ เดชเตเดฐเตเดเตเดเตเดเตเดเตเดณเตเดเตพ. เดเดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เดฌเตเดเตโเดธเดฟเดจเต เดชเตเดฑเดคเตเดคเต เดชเตเดคเตเดคเดฃเดฟเดจเต xdrlib เดเดฃเตเดเต, เดเดคเต เดธเดฎเดพเดจ เดซเตเตผเดฎเดพเดฑเตเดฑเดฟเตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดเตเดเดพเตป เดจเดฟเดเตเดเดณเต เด
เดจเตเดตเดฆเดฟเดเตเดเตเดจเตเดจเต
เดเดฟเดธเดฟเดชเดฟ เดฑเตเดกเดฟเดเดเต เดเดชเดฏเตเดเดฟเดเตเดเต เดเดเตเดเตพ เดเตเดคเตเดฏเดฎเดพเดฏเตเด เดเดพเดฐเตเดฏเดเตเดทเดฎเดฎเดพเดฏเตเด เดชเตเดฐเดตเตผเดคเตเดคเดฟเดเตเดเดฟเดฒเตเดฒ - เดเดเตเดเตพ เดเตเดกเต เดฒเดณเดฟเดคเดฎเดพเดเตเดเตเด. เดชเตเตผเดฃเตเดฃเดฎเดพเดฏ เดธเดจเตเดฆเตเดถเด เดกเตเดเตเดกเต เดเตเดฏเตเดฏเตเดจเตเดจเดคเตเดตเดฐเต เดเดเตเดเตพ เดธเตเดเตเดเดฑเตเดฑเดฟเตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เดกเดพเดฑเตเดฑ เด เดจเดจเตเดคเดฎเดพเดฏ เดฒเตเดชเตเดชเดฟเตฝ เดตเดพเดฏเดฟเดเตเดเตเดจเตเดจเต. เด เดธเดฎเตเดชเดจเดคเตเดคเดฟเดจเตเดณเตเดณ เดซเตเตผเดฎเดพเดฑเตเดฑเดพเดฏเดฟ XML เดเดณเตเดณ JSON เดเดชเดฏเตเดเดฟเดเตเดเดพเดจเตเด เดเดดเดฟเดฏเตเด. เดเดจเตเดจเดพเตฝ เดเตเดฐเดฟเดชเตโเดฑเตเดฑเตเดเตเดฐเดพเดซเดฟ เดเตเตผเดเตเดเตเดฎเตเดชเตเตพ, เดกเดพเดฑเตเดฑ เดเดชเตเดชเดฟเดเตเดเดฏเตเด เดเดงเดฟเดเดพเดฐเดฟเดเดฎเดพเดเตเดเตเดเดฏเตเด เดเตเดฏเตเดฏเตเดฃเตเดเดคเตเดฃเตเดเต - เดเดคเดฟเดจเต เดเดฌเตโเดเดเตเดฑเตเดฑเตเดเดณเตเดเต เดเดฐเต เดฌเตเดฑเตเดฑเต-เดซเตเตผ-เดฌเตเดฑเตเดฑเดฟเดจเต เดธเดฎเดพเดจเดฎเดพเดฏ เดชเตเดฐเดพเดคเดฟเดจเดฟเดงเตเดฏเด เดเดตเดถเตเดฏเดฎเดพเดฃเต, เด เดคเต JSON/XML เดจเตฝเดเดฟเดฒเตเดฒ (เดกเดเดชเตโเดธเต เดซเดฒเดเตเดเตพ เดตเตเดฏเดคเตเดฏเดพเดธเดชเตเดชเตเดเดพเด).
เด เดเดพเดธเตเดเตเดเดฟเดจเต XDR เด
เดจเตเดฏเตเดเตเดฏเดฎเดพเดฃเต, เดเดจเตเดจเดฟเดฐเตเดจเตเดจเดพเดฒเตเด เดเดพเตป DER เดเตปเดเตเดกเดฟเดเดเดฟเดจเตเดชเตเดชเด ASN.1 เดคเดฟเดฐเดเตเดเตเดเตเดเตเดเตเดจเตเดจเต
# Msg ::= CHOICE {
# text MsgText,
# handshake [0] EXPLICIT MsgHandshake }
class Msg(Choice):
schema = ((
("text", MsgText()),
("handshake", MsgHandshake(expl=tag_ctxc(0))),
))
# MsgText ::= SEQUENCE {
# text UTF8String (SIZE(1..MaxTextLen))}
class MsgText(Sequence):
schema = ((
("text", UTF8String(bounds=(1, MaxTextLen))),
))
# MsgHandshake ::= SEQUENCE {
# peerName UTF8String (SIZE(1..256)) }
class MsgHandshake(Sequence):
schema = ((
("peerName", UTF8String(bounds=(1, 256))),
))
เดฒเดญเดฟเดเตเด เดธเดจเตเดฆเตเดถเด Msg เดเดฏเดฟเดฐเดฟเดเตเดเตเด: เดเดจเตเดจเตเดเดฟเตฝ เดเดฐเต เดเตเดเตโเดธเตโเดฑเตเดฑเต MsgText (เดเดชเตเดชเตเตพ เดเดฐเต เดเตเดเตโเดธเตโเดฑเตเดฑเต เดซเตเตฝเดกเต เดเดณเตเดณเดคเต) เด เดฒเตเดฒเตเดเตเดเดฟเตฝ เดเดฐเต MsgHandshake เดนเดพเตปเดกเตโเดทเตเดเตเดเต เดธเดจเตเดฆเตเดถเด (เดเดคเดฟเตฝ เดธเดเดญเดพเดทเดเดจเตเดฑเต เดชเตเดฐเต เด เดเดเตเดเดฟเดฏเดฟเดฐเดฟเดเตเดเตเดจเตเดจเต). เดเดชเตเดชเตเตพ เดเดคเต เดตเดณเดฐเต เดธเดเตเดเตเตผเดฃเตเดฃเดฎเดพเดฃเตเดจเตเดจเต เดคเตเดจเตเดจเตเดจเตเดจเต, เดชเดเตเดทเต เดเดคเต เดญเดพเดตเดฟเดฏเดฟเดฒเตเดเตเดเตเดณเตเดณ เดเดฐเต เด เดเดฟเดคเตเดคเดฑเดฏเดพเดฃเต.
โโโโโโโ โโโโโโโ โPeerAโ โPeerBโ โโโโฌโโโ IdA) โ โโโโโโโโโโ โโโโโโโโ>โ โ โ โ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 เดฎเดพเดฑเตเดฑเดฟ เดชเดเดฐเด เดฎเดฑเตเดฑเตเดฐเต เด
เดฑเดฟเดฏเดชเตเดชเตเดเตเดจเตเดจ เดเดจเตเดฑเตผเดฒเตเดเตเดเตเดเตเดเดฑเตเดเต เดเต เดเดชเดฏเตเดเดฟเดเตเดเต เดธเดจเตเดฆเตเดถเด เดตเตเดฃเตเดเตเด เดเดชเตเดชเดฟเดเดพเด. เดคเดเดฏเดพเตป
โโโโโโโ โโโโโโโ โ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 "เด เดฑเตเดฑเตเดฒเดธเต" . - เดเดชเตเดชเดฟเดจเดพเดฏเดฟ GOST R เดเดชเดฏเตเดเดฟเดเตเดเตเดจเตเดจเต
เด เดตเดฒเดเดฌเด: www.habr.com