āĻāĻāĻāĻ¨ āĻĄā§āĻā§āĻ˛āĻĒāĻžāĻ° āĻšāĻā§āĻā§
āĻāĻ āĻ¸āĻŦ āĻāĻŽāĻžāĻā§ āĻāĻ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§āĻāĻŋ āĻ˛ā§āĻāĻžāĻ° āĻāĻ¨ā§āĻ¯ āĻĒā§āĻ°āĻ°ā§āĻāĻŋāĻ¤ āĻāĻ°ā§āĻā§ āĻ¯ā§ āĻā§āĻ°āĻŋāĻĒā§āĻā§āĻā§āĻ°āĻžāĻĢāĻŋāĻ āĻĒā§āĻ°ā§āĻā§āĻāĻ˛ āĻāĻŦāĻ āĻ¸ā§āĻ°āĻā§āĻˇāĻŋāĻ¤ IM āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨ āĻāĻ°āĻž āĻāĻ¤ āĻāĻ āĻŋāĻ¨ āĻāĻžāĻ āĻ¨āĻ¯āĻŧāĨ¤ āĻ¯āĻžāĻāĻšā§āĻ, āĻāĻāĻŋ āĻāĻĒāĻ¨āĻžāĻ° āĻ¨āĻŋāĻāĻ¸ā§āĻŦ āĻĒā§āĻ°āĻŽāĻžāĻŖā§āĻāĻ°āĻŖ āĻāĻŦāĻ āĻŽā§āĻ˛ āĻā§āĻā§āĻ¤āĻŋ āĻĒā§āĻ°ā§āĻā§āĻāĻ˛ āĻāĻĻā§āĻāĻžāĻŦāĻ¨ā§āĻ° āĻŽā§āĻ˛ā§āĻ¯ āĻ¨āĻ¯āĻŧāĨ¤
āĻĒā§āĻ°āĻŦāĻ¨ā§āĻ§ āĻ˛āĻŋāĻāĻŦā§āĻ¨
āĻāĻāĻāĻŽ āĻĄāĻŋāĻāĻžāĻāĻ¨
āĻĒā§āĻ°āĻĨāĻŽāĻ¤, āĻāĻŽāĻžāĻĻā§āĻ° āĻŦā§āĻāĻ¤ā§ āĻšāĻŦā§ āĻāĻŽāĻžāĻĻā§āĻ° IM āĻā§āĻŽāĻ¨ āĻšāĻŦā§āĨ¤ āĻ¸āĻ°āĻ˛āĻ¤āĻžāĻ° āĻāĻ¨ā§āĻ¯, āĻāĻāĻŋ āĻāĻāĻāĻŋ āĻĒāĻŋāĻ¯āĻŧāĻžāĻ°-āĻā§-āĻĒāĻŋāĻ¯āĻŧāĻžāĻ° āĻ¨ā§āĻāĻāĻ¯āĻŧāĻžāĻ°ā§āĻ āĻšāĻ¤ā§ āĻĻāĻŋāĻ¨, āĻ āĻāĻļāĻā§āĻ°āĻšāĻŖāĻāĻžāĻ°ā§āĻĻā§āĻ° āĻā§āĻ¨ā§ āĻāĻŦāĻŋāĻˇā§āĻāĻžāĻ° āĻāĻžāĻĄāĻŧāĻžāĻāĨ¤ āĻāĻŽāĻ°āĻž āĻŦā§āĻ¯āĻā§āĻ¤āĻŋāĻāĻ¤āĻāĻžāĻŦā§ āĻ¨āĻŋāĻ°ā§āĻĻā§āĻļ āĻāĻ°āĻŦ āĻā§āĻ¨ āĻ āĻŋāĻāĻžāĻ¨āĻž: āĻāĻĨā§āĻĒāĻāĻĨāĻ¨ā§āĻ° āĻ¸āĻžāĻĨā§ āĻ¯ā§āĻāĻžāĻ¯ā§āĻā§āĻ° āĻāĻ¨ā§āĻ¯ āĻĒā§āĻ°ā§āĻ āĻ¸āĻāĻ¯ā§āĻ āĻāĻ°āĻ¤ā§ āĻšāĻŦā§āĨ¤
āĻāĻŽāĻŋ āĻŦā§āĻāĻ¤ā§ āĻĒāĻžāĻ°āĻŋ āĻ¯ā§, āĻāĻ āĻ¸āĻŽāĻ¯āĻŧā§, āĻĻā§āĻāĻŋ āĻ¸ā§āĻŦā§āĻā§āĻāĻžāĻāĻžāĻ°ā§ āĻāĻŽā§āĻĒāĻŋāĻāĻāĻžāĻ°ā§āĻ° āĻŽāĻ§ā§āĻ¯ā§ āĻ¸āĻ°āĻžāĻ¸āĻ°āĻŋ āĻ¯ā§āĻāĻžāĻ¯ā§āĻ āĻāĻĒāĻ˛āĻŦā§āĻ§ āĻ°āĻ¯āĻŧā§āĻā§ āĻāĻŽāĻ¨ āĻ§āĻžāĻ°āĻŖāĻžāĻāĻŋ āĻŦāĻžāĻ¸ā§āĻ¤āĻŦā§ IM āĻāĻ° āĻĒā§āĻ°āĻ¯āĻŧā§āĻāĻ¯ā§āĻā§āĻ¯āĻ¤āĻžāĻ° āĻāĻĒāĻ° āĻāĻāĻāĻŋ āĻāĻ˛ā§āĻ˛ā§āĻāĻ¯ā§āĻā§āĻ¯ āĻ¸ā§āĻŽāĻžāĻŦāĻĻā§āĻ§āĻ¤āĻžāĨ¤ āĻāĻŋāĻ¨ā§āĻ¤ā§ āĻ¯āĻ¤ āĻŦā§āĻļāĻŋ āĻĄā§āĻā§āĻ˛āĻĒāĻžāĻ°āĻ°āĻž āĻ¸āĻŦ āĻ§āĻ°āĻ¨ā§āĻ° NAT-āĻā§āĻ°ā§āĻ¯āĻžāĻāĻžāĻ°āĻ¸āĻžāĻ˛ āĻā§āĻ°āĻžāĻ āĻĒā§āĻ°āĻ¯āĻŧā§āĻ āĻāĻ°āĻŦā§, āĻ¤āĻ¤ āĻŦā§āĻļāĻŋ āĻ¸āĻŽāĻ¯āĻŧ āĻāĻŽāĻ°āĻž IPv4 āĻāĻ¨ā§āĻāĻžāĻ°āĻ¨ā§āĻā§ āĻĨāĻžāĻāĻŦ, āĻ¨āĻŋāĻ°ā§āĻŦāĻŋāĻāĻžāĻ°ā§ āĻāĻŽā§āĻĒāĻŋāĻāĻāĻžāĻ°ā§āĻ° āĻŽāĻ§ā§āĻ¯ā§ āĻ¯ā§āĻāĻžāĻ¯ā§āĻā§āĻ° āĻšāĻ¤āĻžāĻļāĻžāĻāĻ¨āĻ āĻ¸āĻŽā§āĻāĻžāĻŦāĻ¨āĻž āĻ¸āĻšāĨ¤ āĻāĻĒāĻ¨āĻŋ āĻāĻ¤āĻā§āĻˇāĻŖ āĻŦāĻžāĻĄāĻŧāĻŋāĻ¤ā§ āĻāĻŦāĻ āĻāĻ°ā§āĻŽāĻā§āĻˇā§āĻ¤ā§āĻ°ā§ IPv6 āĻāĻ° āĻ āĻāĻžāĻŦ āĻ¸āĻšā§āĻ¯ āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°ā§āĻ¨?
āĻāĻŽāĻžāĻĻā§āĻ° āĻāĻāĻāĻŋ āĻŦāĻ¨ā§āĻ§ā§-āĻĨā§āĻā§-āĻŦāĻ¨ā§āĻ§ā§ āĻ¨ā§āĻāĻāĻ¯āĻŧāĻžāĻ°ā§āĻ āĻĨāĻžāĻāĻŦā§: āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻ¸āĻŽā§āĻāĻžāĻŦā§āĻ¯ āĻāĻĨā§āĻĒāĻāĻĨāĻ¨āĻā§ āĻ āĻŦāĻļā§āĻ¯āĻ āĻāĻā§ āĻĨā§āĻā§āĻ āĻāĻžāĻ¨āĻž āĻāĻāĻŋāĻ¤āĨ¤ āĻĒā§āĻ°āĻĨāĻŽāĻ¤, āĻāĻāĻŋ āĻ¸āĻŦāĻāĻŋāĻā§āĻā§ āĻŦā§āĻ¯āĻžāĻĒāĻāĻāĻžāĻŦā§ āĻ¸āĻ°āĻ˛ āĻāĻ°ā§: āĻāĻŽāĻ°āĻž āĻ¨āĻŋāĻā§āĻĻā§āĻ° āĻĒāĻ°āĻŋāĻāĻ¯āĻŧ āĻĻāĻŋāĻ¯āĻŧā§āĻāĻŋ, āĻ¨āĻžāĻŽ/āĻā§ āĻā§āĻāĻā§ āĻĒā§āĻ¯āĻŧā§āĻāĻŋ āĻŦāĻž āĻĒāĻžāĻāĻ¨āĻŋ, āĻ¸āĻāĻ¯ā§āĻ āĻŦāĻŋāĻā§āĻāĻŋāĻ¨ā§āĻ¨ āĻāĻ°ā§āĻāĻŋ āĻŦāĻž āĻāĻžāĻ āĻāĻžāĻ˛āĻŋāĻ¯āĻŧā§ āĻ¯āĻžāĻā§āĻāĻŋ, āĻāĻĨā§āĻĒāĻāĻĨāĻ¨āĻā§ āĻā§āĻ¨ā§āĻāĻŋāĨ¤ āĻĻā§āĻŦāĻŋāĻ¤ā§āĻ¯āĻŧāĻ¤, āĻ¸āĻžāĻ§āĻžāĻ°āĻŖāĻāĻžāĻŦā§, āĻāĻāĻŋ āĻ¨āĻŋāĻ°āĻžāĻĒāĻĻ āĻāĻŦāĻ āĻ āĻ¨ā§āĻ āĻāĻā§āĻ°āĻŽāĻŖ āĻĻā§āĻ° āĻāĻ°ā§āĨ¤
IM āĻāĻ¨ā§āĻāĻžāĻ°āĻĢā§āĻ¸ āĻā§āĻ˛āĻžāĻ¸āĻŋāĻ āĻ¸āĻŽāĻžāĻ§āĻžāĻ¨ā§āĻ° āĻāĻžāĻāĻžāĻāĻžāĻāĻŋ āĻšāĻŦā§
- āĻāĻĨā§āĻĒāĻāĻĨāĻ¨ā§āĻ° āĻāĻžāĻā§ āĻĒāĻžāĻ āĻžāĻ¨ā§ āĻŦāĻžāĻ°ā§āĻ¤āĻžāĻā§āĻ˛āĻŋ āĻāĻ¤ā§ āĻ°ā§āĻāĻ°ā§āĻĄ āĻāĻ°āĻž āĻšāĻ¯āĻŧ;
- āĻāĻāĻ - āĻāĻĨā§āĻĒāĻāĻĨāĻ¨ā§āĻ° āĻāĻžāĻ āĻĨā§āĻā§ āĻĒā§āĻ°āĻžāĻĒā§āĻ¤ āĻŦāĻžāĻ°ā§āĻ¤āĻžāĻā§āĻ˛āĻŋ āĻāĻāĻŋ āĻĨā§āĻā§ āĻĒāĻĄāĻŧāĻž āĻšāĻ¯āĻŧ;
- āĻ°āĻžāĻā§āĻ¯ - āĻāĻāĻŋ āĻĨā§āĻā§ āĻĒāĻĄāĻŧā§, āĻāĻŽāĻ°āĻž āĻā§āĻāĻā§ āĻŦā§āĻ° āĻāĻ°āĻŋ āĻ¯ā§ āĻāĻĨā§āĻĒāĻāĻĨāĻ¨ āĻŦāĻ°ā§āĻ¤āĻŽāĻžāĻ¨ā§ āĻ¸āĻāĻ¯ā§āĻā§āĻ¤ āĻāĻā§ āĻāĻŋāĻ¨āĻž, āĻ¸āĻāĻ¯ā§āĻ āĻ āĻŋāĻāĻžāĻ¨āĻž/āĻĒā§āĻ°ā§āĻāĨ¤
āĻāĻĒāĻ°āĻ¨ā§āĻ¤ā§, āĻāĻāĻāĻŋ āĻāĻ¨ āĻ¸āĻā§āĻ āĻ¤ā§āĻ°āĻŋ āĻāĻ°āĻž āĻšāĻ¯āĻŧ, āĻšā§āĻ¸ā§āĻ āĻĒā§āĻ°ā§āĻ āĻ˛āĻŋāĻā§ āĻ¯āĻžāĻ° āĻŽāĻ§ā§āĻ¯ā§ āĻāĻŽāĻ°āĻž āĻ°āĻŋāĻŽā§āĻ āĻāĻ¨ā§āĻāĻžāĻ°āĻ˛ā§āĻāĻŋāĻāĻāĻžāĻ°ā§āĻ° āĻ¸āĻžāĻĨā§ āĻ¸āĻāĻ¯ā§āĻ āĻļā§āĻ°ā§ āĻāĻ°āĻŋāĨ¤
|-- alice
| |-- in
| |-- out
| `-- state
|-- bob
| |-- in
| |-- out
| `-- state
`- conn
āĻāĻ āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻāĻŋ āĻāĻĒāĻ¨āĻžāĻā§ IM āĻā§āĻ°āĻžāĻ¨ā§āĻ¸āĻĒā§āĻ°ā§āĻ āĻāĻŦāĻ āĻāĻāĻāĻžāĻ° āĻāĻ¨ā§āĻāĻžāĻ°āĻĢā§āĻ¸ā§āĻ° āĻ¸ā§āĻŦāĻžāĻ§ā§āĻ¨ āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨ āĻāĻ°āĻ¤ā§ āĻĻā§āĻ¯āĻŧ, āĻāĻžāĻ°āĻŖ āĻā§āĻ¨ āĻŦāĻ¨ā§āĻ§ā§ āĻ¨ā§āĻ, āĻāĻĒāĻ¨āĻŋ āĻ¸āĻŦāĻžāĻāĻā§ āĻā§āĻļāĻŋ āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°āĻŦā§āĻ¨ āĻ¨āĻžāĨ¤ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°
āĻĒā§āĻ°āĻā§āĻ¤āĻĒāĻā§āĻˇā§, āĻĻā§āĻ§āĻšā§āĻ¨ āĻĒā§āĻ°āĻāĻ˛ā§āĻĒ FIFO āĻĢāĻžāĻāĻ˛ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°ā§āĨ¤ āĻŦā§āĻ¯āĻā§āĻ¤āĻŋāĻāĻ¤āĻāĻžāĻŦā§, āĻĄā§āĻĄāĻŋāĻā§āĻā§āĻĄ āĻĨā§āĻ°ā§āĻĄ āĻĨā§āĻā§ āĻšāĻžāĻ¤ā§ āĻ˛ā§āĻāĻž āĻŦā§āĻ¯āĻžāĻāĻā§āĻ°āĻžāĻāĻ¨ā§āĻĄ āĻāĻžāĻĄāĻŧāĻž āĻ
ā§āĻ¯āĻžāĻ¸āĻŋāĻ¨āĻ¸āĻŋāĻāĻ¤ā§ āĻĒā§āĻ°āĻ¤āĻŋāĻ¯ā§āĻāĻŋāĻ¤āĻžāĻŽā§āĻ˛āĻāĻāĻžāĻŦā§ āĻĢāĻžāĻāĻ˛āĻā§āĻ˛āĻŋāĻ° āĻ¸āĻžāĻĨā§ āĻā§āĻāĻžāĻŦā§ āĻāĻžāĻ āĻāĻ°āĻž āĻ¯āĻžāĻ¯āĻŧ āĻ¤āĻž āĻāĻŽāĻŋ āĻŦā§āĻāĻ¤ā§ āĻĒāĻžāĻ°āĻŋāĻ¨āĻŋ (āĻāĻŽāĻŋ āĻĻā§āĻ°ā§āĻāĻĻāĻŋāĻ¨ āĻ§āĻ°ā§ āĻāĻ āĻāĻžāĻ¤ā§āĻ¯āĻŧ āĻāĻŋāĻ¨āĻŋāĻ¸āĻā§āĻ˛āĻŋāĻ° āĻāĻ¨ā§āĻ¯ āĻāĻžāĻˇāĻž āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻāĻŋ)
āĻŽā§āĻ˛ āĻ āĻ¨āĻŋāĻ°āĻžāĻĒāĻĻ āĻĒā§āĻ°ā§āĻā§āĻāĻ˛
TCP āĻĒāĻ°āĻŋāĻŦāĻšāĻ¨ āĻšāĻŋāĻ¸āĻžāĻŦā§ āĻŦā§āĻ¯āĻŦāĻšā§āĻ¤ āĻšāĻ¯āĻŧ: āĻāĻāĻŋ āĻĄā§āĻ˛āĻŋāĻāĻžāĻ°āĻŋ āĻāĻŦāĻ āĻāĻ° āĻ
āĻ°ā§āĻĄāĻžāĻ° āĻ¨āĻŋāĻļā§āĻāĻŋāĻ¤ āĻāĻ°ā§āĨ¤ UDP āĻā§āĻ¯āĻžāĻ°āĻžāĻ¨ā§āĻāĻŋ āĻĻā§āĻ¯āĻŧ āĻ¨āĻž (āĻ¯āĻž āĻā§āĻ°āĻŋāĻĒā§āĻā§āĻā§āĻ°āĻžāĻĢāĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻž āĻšāĻ˛ā§ āĻāĻžāĻā§ āĻ˛āĻžāĻāĻŦā§), āĻāĻŋāĻ¨ā§āĻ¤ā§ āĻ¸āĻŽāĻ°ā§āĻĨāĻ¨ āĻāĻ°ā§
āĻĻā§āĻ°ā§āĻāĻžāĻā§āĻ¯āĻŦāĻļāĻ¤, āĻāĻŋāĻ¸āĻŋāĻĒāĻŋāĻ¤ā§ āĻāĻāĻāĻŋ āĻŦāĻžāĻ°ā§āĻ¤āĻžāĻ° āĻā§āĻ¨ āĻ§āĻžāĻ°āĻŖāĻž āĻ¨ā§āĻ, āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻŦāĻžāĻāĻā§āĻ° āĻāĻāĻāĻŋ āĻĒā§āĻ°āĻŦāĻžāĻšāĨ¤ āĻ
āĻ¤āĻāĻŦ, āĻŦāĻžāĻ°ā§āĻ¤āĻžāĻā§āĻ˛āĻŋāĻ° āĻāĻ¨ā§āĻ¯ āĻāĻāĻāĻŋ āĻŦāĻŋāĻ¨ā§āĻ¯āĻžāĻ¸ āĻ¨āĻŋāĻ¯āĻŧā§ āĻāĻ¸āĻž āĻĒā§āĻ°āĻ¯āĻŧā§āĻāĻ¨ āĻ¯āĻžāĻ¤ā§ āĻ¸ā§āĻā§āĻ˛āĻŋ āĻāĻ āĻĨā§āĻ°ā§āĻĄā§ āĻ¨āĻŋāĻā§āĻĻā§āĻ° āĻŽāĻ§ā§āĻ¯ā§ āĻāĻžāĻ āĻāĻ°āĻž āĻ¯āĻžāĻ¯āĻŧā§ˇ āĻāĻŽāĻ°āĻž āĻ˛āĻžāĻāĻ¨ āĻĢāĻŋāĻĄ āĻ
āĻā§āĻˇāĻ° āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻ¤ā§ āĻ¸āĻŽā§āĻŽāĻ¤ āĻšāĻ¤ā§ āĻĒāĻžāĻ°āĻŋāĨ¤ āĻāĻāĻŋ āĻļā§āĻ°ā§ āĻāĻ°āĻžāĻ° āĻāĻ¨ā§āĻ¯ āĻ āĻŋāĻ āĻāĻā§, āĻāĻŋāĻ¨ā§āĻ¤ā§ āĻāĻāĻŦāĻžāĻ° āĻāĻŽāĻ°āĻž āĻāĻŽāĻžāĻĻā§āĻ° āĻŦāĻžāĻ°ā§āĻ¤āĻžāĻā§āĻ˛āĻŋ āĻāĻ¨āĻā§āĻ°āĻŋāĻĒā§āĻ āĻāĻ°āĻž āĻļā§āĻ°ā§ āĻāĻ°āĻ˛ā§, āĻāĻ āĻ
āĻā§āĻˇāĻ°āĻāĻŋ āĻ¸āĻžāĻāĻĢāĻžāĻ°āĻā§āĻā§āĻ¸āĻā§āĻ° āĻ¯ā§ āĻā§āĻ¨āĻ āĻāĻžāĻ¯āĻŧāĻāĻžāĻ¯āĻŧ āĻāĻĒāĻ¸ā§āĻĨāĻŋāĻ¤ āĻšāĻ¤ā§ āĻĒāĻžāĻ°ā§āĨ¤ āĻ¨ā§āĻāĻāĻ¯āĻŧāĻžāĻ°ā§āĻāĻā§āĻ˛āĻŋāĻ¤ā§, āĻ¤āĻžāĻ, āĻāĻ¨āĻĒā§āĻ°āĻŋāĻ¯āĻŧ āĻĒā§āĻ°ā§āĻā§āĻāĻ˛āĻā§āĻ˛āĻŋ āĻšāĻ˛ āĻ¯ā§āĻā§āĻ˛āĻŋ āĻĒā§āĻ°āĻĨāĻŽā§ āĻŦāĻžāĻ°ā§āĻ¤āĻžāĻ° āĻĻā§āĻ°ā§āĻā§āĻ¯ āĻŦāĻžāĻāĻāĻā§āĻ˛āĻŋāĻ¤ā§ āĻĒāĻžāĻ āĻžāĻ¯āĻŧāĨ¤ āĻāĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§āĻĒ, āĻĒāĻžāĻāĻĨāĻ¨ā§āĻ° āĻŦāĻžāĻā§āĻ¸ā§āĻ° āĻŦāĻžāĻāĻ°ā§ āĻ°āĻ¯āĻŧā§āĻā§ xdrlib, āĻ¯āĻž āĻāĻĒāĻ¨āĻžāĻā§ āĻāĻāĻ āĻŦāĻŋāĻ¨ā§āĻ¯āĻžāĻ¸ā§āĻ° āĻ¸āĻžāĻĨā§ āĻāĻžāĻ āĻāĻ°āĻ¤ā§ āĻĻā§āĻ¯āĻŧ
āĻāĻŽāĻ°āĻž TCP āĻĒāĻĄāĻŧāĻžāĻ° āĻ¸āĻžāĻĨā§ āĻ¸āĻ āĻŋāĻāĻāĻžāĻŦā§ āĻāĻŦāĻ āĻĻāĻā§āĻˇāĻ¤āĻžāĻ° āĻ¸āĻžāĻĨā§ āĻāĻžāĻ āĻāĻ°āĻŦ āĻ¨āĻž - āĻāĻŽāĻ°āĻž āĻā§āĻĄāĻāĻŋ āĻ¸āĻ°āĻ˛ āĻāĻ°āĻŦāĨ¤ āĻāĻŽāĻ°āĻž āĻ¸āĻŽā§āĻĒā§āĻ°ā§āĻŖ āĻŦāĻžāĻ°ā§āĻ¤āĻž āĻĄāĻŋāĻā§āĻĄ āĻ¨āĻž āĻāĻ°āĻž āĻĒāĻ°ā§āĻ¯āĻ¨ā§āĻ¤ āĻāĻŽāĻ°āĻž āĻāĻāĻāĻŋ āĻ āĻ¨ā§āĻ¤āĻšā§āĻ¨ āĻ˛ā§āĻĒā§ āĻ¸āĻā§āĻ āĻĨā§āĻā§ āĻĄā§āĻāĻž āĻĒāĻĄāĻŧāĻŋāĨ¤ XML āĻ¸āĻš JSON āĻāĻ āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻ° āĻāĻ¨ā§āĻ¯ āĻāĻāĻāĻŋ āĻŦāĻŋāĻ¨ā§āĻ¯āĻžāĻ¸ āĻšāĻŋāĻ¸āĻžāĻŦā§āĻ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻž āĻ¯ā§āĻ¤ā§ āĻĒāĻžāĻ°ā§āĨ¤ āĻāĻŋāĻ¨ā§āĻ¤ā§ āĻ¯āĻāĻ¨ āĻā§āĻ°āĻŋāĻĒā§āĻā§āĻā§āĻ°āĻžāĻĢāĻŋ āĻ¯ā§āĻ āĻāĻ°āĻž āĻšāĻ¯āĻŧ, āĻ¤āĻāĻ¨ āĻĄā§āĻāĻž āĻ¸āĻžāĻāĻ¨ āĻāĻ¨ āĻāĻŦāĻ āĻĒā§āĻ°āĻŽāĻžāĻŖā§āĻāĻ°āĻŖ āĻāĻ°āĻ¤ā§ āĻšāĻŦā§ - āĻāĻŦāĻ āĻāĻ° āĻāĻ¨ā§āĻ¯ āĻŦāĻ¸ā§āĻ¤ā§āĻ° āĻŦāĻžāĻāĻ-āĻĢāĻ°-āĻŦāĻžāĻāĻ āĻ āĻāĻŋāĻ¨ā§āĻ¨ āĻāĻĒāĻ¸ā§āĻĨāĻžāĻĒāĻ¨āĻž āĻĒā§āĻ°āĻ¯āĻŧā§āĻāĻ¨, āĻ¯āĻž JSON/XML āĻĒā§āĻ°āĻĻāĻžāĻ¨ āĻāĻ°ā§ āĻ¨āĻž (āĻĄāĻžāĻŽā§āĻĒā§āĻ° āĻĢāĻ˛āĻžāĻĢāĻ˛ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻŋāĻ¤ āĻšāĻ¤ā§ āĻĒāĻžāĻ°ā§)āĨ¤
XDR āĻāĻ āĻāĻžāĻā§āĻ° āĻāĻ¨ā§āĻ¯ āĻāĻĒāĻ¯ā§āĻā§āĻ¤, āĻ¤āĻŦā§ āĻāĻŽāĻŋ DER āĻāĻ¨āĻā§āĻĄāĻŋāĻ āĻ¸āĻš ASN.1 āĻ¨āĻŋāĻ°ā§āĻŦāĻžāĻāĻ¨ āĻāĻ°āĻŋ āĻāĻŦāĻ
# Msg ::= CHOICE {
# text MsgText,
# handshake [0] EXPLICIT MsgHandshake }
class Msg(Choice):
schema = ((
("text", MsgText()),
("handshake", MsgHandshake(expl=tag_ctxc(0))),
))
# MsgText ::= SEQUENCE {
# text UTF8String (SIZE(1..MaxTextLen))}
class MsgText(Sequence):
schema = ((
("text", UTF8String(bounds=(1, MaxTextLen))),
))
# MsgHandshake ::= SEQUENCE {
# peerName UTF8String (SIZE(1..256)) }
class MsgHandshake(Sequence):
schema = ((
("peerName", UTF8String(bounds=(1, 256))),
))
āĻĒā§āĻ°āĻžāĻĒā§āĻ¤ āĻŦāĻžāĻ°ā§āĻ¤āĻžāĻāĻŋ āĻšāĻŦā§ Msg: āĻšāĻ¯āĻŧ āĻāĻāĻāĻŋ āĻĒāĻžāĻ ā§āĻ¯ MsgText (āĻāĻāĻ¨ āĻāĻāĻāĻŋ āĻĒāĻžāĻ ā§āĻ¯ āĻā§āĻˇā§āĻ¤ā§āĻ° āĻ¸āĻš) āĻ āĻĨāĻŦāĻž āĻāĻāĻāĻŋ MsgHandshake āĻšā§āĻ¯āĻžāĻ¨ā§āĻĄāĻļā§āĻ āĻŦāĻžāĻ°ā§āĻ¤āĻž (āĻ¯āĻžāĻ¤ā§ āĻāĻĨā§āĻĒāĻāĻĨāĻ¨ā§āĻ° āĻ¨āĻžāĻŽ āĻ°āĻ¯āĻŧā§āĻā§)āĨ¤ āĻāĻāĻ¨ āĻāĻāĻž overcomplicated āĻĻā§āĻāĻžāĻ¯āĻŧ, āĻāĻŋāĻ¨ā§āĻ¤ā§ āĻāĻāĻŋ āĻāĻŦāĻŋāĻˇā§āĻ¯āĻ¤ā§āĻ° āĻāĻ¨ā§āĻ¯ āĻāĻāĻāĻŋ āĻāĻŋāĻ¤ā§āĻ¤āĻŋ.
âââââââ âââââââ âPeerAâ âPeerBâ ââââŦââââ ââ āĻāĻāĻĄāĻŋāĻ) â ââââââââââ âââââââââ>â â â âMsgHandshake(IdB) â â<ââââââ â â MsgText() â âââââ MsgText() â â â
āĻā§āĻ°āĻŋāĻĒā§āĻā§āĻā§āĻ°āĻžāĻĢāĻŋ āĻāĻžāĻĄāĻŧāĻž IM
āĻāĻŽāĻŋ āĻāĻā§āĻ āĻŦāĻ˛ā§āĻāĻŋ, āĻ ā§āĻ¯āĻžāĻ¸āĻŋāĻ¨āĻ¸āĻŋāĻ āĻ˛āĻžāĻāĻŦā§āĻ°ā§āĻ°āĻŋ āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻ¸āĻā§āĻ āĻ āĻĒāĻžāĻ°ā§āĻļāĻ¨ā§āĻ° āĻāĻ¨ā§āĻ¯ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻž āĻšāĻŦā§āĨ¤ āĻ˛āĻā§āĻā§āĻ° āĻ¸āĻŽāĻ¯āĻŧ āĻāĻŽāĻ°āĻž āĻā§ āĻāĻļāĻž āĻāĻ°āĻŋ āĻ¤āĻž āĻā§āĻˇāĻŖāĻž āĻāĻ°āĻž āĻ¯āĻžāĻ:
parser = argparse.ArgumentParser(description="GOSTIM")
parser.add_argument(
"--our-name",
required=True,
help="Our peer name",
)
parser.add_argument(
"--their-names",
required=True,
help="Their peer names, comma-separated",
)
parser.add_argument(
"--bind",
default="::1",
help="Address to listen on",
)
parser.add_argument(
"--port",
type=int,
default=6666,
help="Port to listen on",
)
args = parser.parse_args()
OUR_NAME = UTF8String(args.our_name)
THEIR_NAMES = set(args.their_names.split(","))
āĻāĻĒāĻ¨āĻžāĻ° āĻ¨āĻŋāĻā§āĻ° āĻ¨āĻžāĻŽ āĻ¸ā§āĻ āĻāĻ°ā§āĻ¨ (--āĻāĻŽāĻžāĻĻā§āĻ°-āĻ¨āĻžāĻŽ āĻāĻ˛āĻŋāĻ¸)āĨ¤ āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻĒā§āĻ°āĻ¤ā§āĻ¯āĻžāĻļāĻŋāĻ¤ āĻāĻĨā§āĻĒāĻāĻĨāĻ¨āĻā§ āĻāĻŽāĻž āĻĻā§āĻŦāĻžāĻ°āĻž āĻĒā§āĻĨāĻ āĻāĻ°āĻž āĻšāĻ¯āĻŧā§āĻā§ (âāĻ¤āĻžāĻĻā§āĻ°-āĻ¨āĻžāĻŽ āĻŦāĻŦ, āĻāĻ)āĨ¤ āĻĒā§āĻ°āĻ¤āĻŋāĻāĻŋ āĻāĻĨā§āĻĒāĻāĻĨāĻ¨ā§āĻ° āĻāĻ¨ā§āĻ¯, āĻāĻāĻ¨āĻŋāĻā§āĻ¸ āĻ¸āĻā§āĻ āĻ¸āĻš āĻāĻāĻāĻŋ āĻĄāĻŋāĻ°ā§āĻā§āĻāĻ°āĻŋ āĻ¤ā§āĻ°āĻŋ āĻāĻ°āĻž āĻšāĻ¯āĻŧ, āĻ¸ā§āĻāĻ¸āĻžāĻĨā§ āĻĒā§āĻ°āĻ¤āĻŋāĻāĻŋ āĻāĻ¨, āĻāĻāĻ, āĻ¸ā§āĻā§āĻā§āĻ° āĻāĻ¨ā§āĻ¯ āĻāĻāĻāĻŋ āĻāĻ°ā§āĻāĻŋāĻ¨ āĻ¤ā§āĻ°āĻŋ āĻāĻ°āĻž āĻšāĻ¯āĻŧ:
for peer_name in THEIR_NAMES:
makedirs(peer_name, mode=0o700, exist_ok=True)
out_queue = asyncio.Queue()
OUT_QUEUES[peer_name] = out_queue
asyncio.ensure_future(asyncio.start_unix_server(
partial(unixsock_out_processor, out_queue=out_queue),
path.join(peer_name, "out"),
))
in_queue = asyncio.Queue()
IN_QUEUES[peer_name] = in_queue
asyncio.ensure_future(asyncio.start_unix_server(
partial(unixsock_in_processor, in_queue=in_queue),
path.join(peer_name, "in"),
))
asyncio.ensure_future(asyncio.start_unix_server(
partial(unixsock_state_processor, peer_name=peer_name),
path.join(peer_name, "state"),
))
asyncio.ensure_future(asyncio.start_unix_server(unixsock_conn_processor, "conn"))
āĻāĻ¨ āĻ¸āĻā§āĻ āĻĨā§āĻā§ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻāĻžāĻ°ā§āĻ° āĻāĻžāĻ āĻĨā§āĻā§ āĻāĻ¸āĻž āĻŦāĻžāĻ°ā§āĻ¤āĻžāĻā§āĻ˛āĻŋ IN_QUEUES āĻ¸āĻžāĻ°āĻŋāĻ¤ā§ āĻĒāĻžāĻ āĻžāĻ¨ā§ āĻšāĻ¯āĻŧ:
async def unixsock_in_processor(reader, writer, in_queue: asyncio.Queue) -> None:
while True:
text = await reader.read(MaxTextLen)
if text == b"":
break
await in_queue.put(text.decode("utf-8"))
āĻāĻĨā§āĻĒāĻāĻĨāĻ¨āĻāĻžāĻ°ā§āĻĻā§āĻ° āĻĨā§āĻā§ āĻāĻāĻ¤ āĻŦāĻžāĻ°ā§āĻ¤āĻžāĻā§āĻ˛āĻŋ OUT_QUEUES āĻ¸āĻžāĻ°āĻŋāĻ¤ā§ āĻĒāĻžāĻ āĻžāĻ¨ā§ āĻšāĻ¯āĻŧ, āĻ¯ā§āĻāĻžāĻ¨ āĻĨā§āĻā§ āĻĄā§āĻāĻž āĻāĻāĻ āĻ¸āĻā§āĻā§ āĻ˛ā§āĻāĻž āĻšāĻ¯āĻŧ:
async def unixsock_out_processor(reader, writer, out_queue: asyncio.Queue) -> None:
while True:
text = await out_queue.get()
writer.write(("[%s] %s" % (datetime.now(), text)).encode("utf-8"))
await writer.drain()
āĻ°āĻžāĻˇā§āĻā§āĻ°ā§āĻ¯āĻŧ āĻ¸āĻā§āĻ āĻĨā§āĻā§ āĻĒāĻĄāĻŧāĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧ, āĻĒā§āĻ°ā§āĻā§āĻ°āĻžāĻŽāĻāĻŋ PEER_ALIVE āĻ āĻāĻŋāĻ§āĻžāĻ¨ā§ āĻāĻĨā§āĻĒāĻāĻĨāĻ¨ā§āĻ° āĻ āĻŋāĻāĻžāĻ¨āĻž āĻā§āĻāĻā§āĨ¤ āĻ¯āĻĻāĻŋ āĻāĻāĻ¨āĻ āĻāĻĨā§āĻĒāĻāĻĨāĻ¨ā§āĻ° āĻ¸āĻžāĻĨā§ āĻā§āĻ¨āĻ āĻ¸āĻāĻ¯ā§āĻ āĻ¨āĻž āĻĨāĻžāĻā§ āĻ¤āĻŦā§ āĻāĻāĻāĻŋ āĻāĻžāĻ˛āĻŋ āĻ˛āĻžāĻāĻ¨ āĻ˛ā§āĻāĻž āĻšāĻ¯āĻŧāĨ¤
async def unixsock_state_processor(reader, writer, peer_name: str) -> None:
peer_writer = PEER_ALIVES.get(peer_name)
writer.write(
b"" if peer_writer is None else (" ".join([
str(i) for i in peer_writer.get_extra_info("peername")[:2]
]).encode("utf-8") + b"n")
)
await writer.drain()
writer.close()
āĻāĻ¨ āĻ¸āĻā§āĻā§ āĻāĻāĻāĻŋ āĻ āĻŋāĻāĻžāĻ¨āĻž āĻ˛ā§āĻāĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧ, āĻ¸āĻāĻ¯ā§āĻ "āĻ¸ā§āĻāĻ¨āĻžāĻāĻžāĻ°ā§" āĻĢāĻžāĻāĻļāĻ¨ āĻāĻžāĻ˛ā§ āĻšāĻ¯āĻŧ:
async def unixsock_conn_processor(reader, writer) -> None:
data = await reader.read(256)
writer.close()
host, port = data.decode("utf-8").split(" ")
await initiator(host=host, port=int(port))
āĻāĻ° āĻ¸ā§āĻāĻ¨āĻžāĻāĻžāĻ°ā§ āĻŦāĻŋāĻŦā§āĻāĻ¨āĻž āĻāĻ°āĻž āĻ¯āĻžāĻ. āĻĒā§āĻ°āĻĨāĻŽā§ āĻāĻāĻŋ āĻ¸ā§āĻĒāĻˇā§āĻāĻ¤āĻ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻ āĻšā§āĻ¸ā§āĻ/āĻĒā§āĻ°ā§āĻā§āĻ° āĻ¸āĻžāĻĨā§ āĻāĻāĻāĻŋ āĻ¸āĻāĻ¯ā§āĻ āĻā§āĻ˛ā§ āĻāĻŦāĻ āĻāĻ° āĻ¨āĻžāĻŽā§āĻ° āĻ¸āĻžāĻĨā§ āĻāĻāĻāĻŋ āĻšā§āĻ¯āĻžāĻ¨ā§āĻĄāĻļā§āĻ āĻŦāĻžāĻ°ā§āĻ¤āĻž āĻĒāĻžāĻ āĻžāĻ¯āĻŧ:
130 async def initiator(host, port):
131 _id = repr((host, port))
132 logging.info("%s: dialing", _id)
133 reader, writer = await asyncio.open_connection(host, port)
134 # Handshake message {{{
135 writer.write(Msg(("handshake", MsgHandshake((
136 ("peerName", OUR_NAME),
137 )))).encode())
138 # }}}
139 await writer.drain()
āĻ¤āĻžāĻ°āĻĒāĻ°ā§, āĻāĻāĻŋ āĻĻā§āĻ°āĻŦāĻ°ā§āĻ¤ā§ āĻĒāĻā§āĻˇ āĻĨā§āĻā§ āĻāĻāĻāĻŋ āĻĒā§āĻ°āĻ¤āĻŋāĻā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻ° āĻāĻ¨ā§āĻ¯ āĻ āĻĒā§āĻā§āĻˇāĻž āĻāĻ°ā§āĨ¤ Msg ASN.1 āĻ¸ā§āĻāĻŋāĻŽ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°ā§ āĻāĻāĻ¤ āĻĒā§āĻ°āĻ¤āĻŋāĻā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻĄāĻŋāĻā§āĻĄ āĻāĻ°āĻžāĻ° āĻā§āĻˇā§āĻāĻž āĻāĻ°ā§āĨ¤ āĻāĻŽāĻ°āĻž āĻ§āĻ°ā§ āĻ¨āĻŋāĻ āĻ¯ā§ āĻĒā§āĻ°ā§ āĻŦāĻžāĻ°ā§āĻ¤āĻžāĻāĻŋ āĻāĻāĻāĻŋ TCP āĻ¸ā§āĻāĻŽā§āĻ¨ā§āĻā§ āĻĒāĻžāĻ āĻžāĻ¨ā§ āĻšāĻŦā§ āĻāĻŦāĻ .read() āĻāĻ˛ āĻāĻ°āĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧ āĻāĻŽāĻ°āĻž āĻāĻāĻŋ āĻĒāĻžāĻ°āĻŽāĻžāĻŖāĻŦāĻŋāĻāĻāĻžāĻŦā§ āĻā§āĻ°āĻšāĻŖ āĻāĻ°āĻŦāĨ¤ āĻāĻŽāĻ°āĻž āĻšā§āĻ¯āĻžāĻ¨ā§āĻĄāĻļā§āĻ āĻŦāĻžāĻ°ā§āĻ¤āĻž āĻĒā§āĻ¯āĻŧā§āĻāĻŋ āĻāĻŋāĻ¨āĻž āĻ¤āĻž āĻĒāĻ°ā§āĻā§āĻˇāĻž āĻāĻ°āĻŋāĨ¤
141 # Wait for Handshake message {{{
142 data = await reader.read(256)
143 if data == b"":
144 logging.warning("%s: no answer, disconnecting", _id)
145 writer.close()
146 return
147 try:
148 msg, _ = Msg().decode(data)
149 except ASN1Error:
150 logging.warning("%s: undecodable answer, disconnecting", _id)
151 writer.close()
152 return
153 logging.info("%s: got %s message", _id, msg.choice)
154 if msg.choice != "handshake":
155 logging.warning("%s: unexpected message, disconnecting", _id)
156 writer.close()
157 return
158 # }}}
āĻāĻŽāĻ°āĻž āĻĒāĻ°ā§āĻā§āĻˇāĻž āĻāĻ°āĻŋ āĻ¯ā§ āĻāĻĨā§āĻĒāĻāĻĨāĻ¨ā§āĻ° āĻĒā§āĻ°āĻžāĻĒā§āĻ¤ āĻ¨āĻžāĻŽāĻāĻŋ āĻāĻŽāĻžāĻĻā§āĻ° āĻĒāĻ°āĻŋāĻāĻŋāĻ¤āĨ¤ āĻ¯āĻĻāĻŋ āĻ¨āĻž āĻšāĻ¯āĻŧ, āĻ¤āĻžāĻšāĻ˛ā§ āĻāĻŽāĻ°āĻž āĻ¸āĻāĻ¯ā§āĻ āĻŦāĻŋāĻā§āĻāĻŋāĻ¨ā§āĻ¨ āĻāĻ°āĻŋāĨ¤ āĻāĻŽāĻ°āĻž āĻāĻ¤āĻŋāĻŽāĻ§ā§āĻ¯ā§ āĻ¤āĻžāĻ° āĻ¸āĻžāĻĨā§ āĻāĻāĻāĻŋ āĻ¸āĻāĻ¯ā§āĻ āĻ¸ā§āĻĨāĻžāĻĒāĻ¨ āĻāĻ°ā§āĻāĻŋ āĻāĻŋāĻ¨āĻž āĻ¤āĻž āĻĒāĻ°ā§āĻā§āĻˇāĻž āĻāĻ°ā§ āĻĻā§āĻā§āĻāĻŋ (āĻāĻĨā§āĻĒāĻāĻĨāĻ āĻāĻŦāĻžāĻ° āĻāĻŽāĻžāĻĻā§āĻ° āĻ¸āĻžāĻĨā§ āĻ¸āĻāĻ¯ā§āĻ āĻāĻ°āĻžāĻ° āĻāĻĻā§āĻļ āĻĻāĻŋāĻ¯āĻŧā§āĻā§āĻ¨) āĻāĻŦāĻ āĻāĻāĻŋ āĻŦāĻ¨ā§āĻ§ āĻāĻ°ā§āĻ¨āĨ¤ IN_QUEUES āĻ¸āĻžāĻ°āĻŋāĻ¤ā§ āĻŦāĻžāĻ°ā§āĻ¤āĻžāĻ° āĻĒāĻžāĻ ā§āĻ¯ā§āĻ° āĻ¸āĻžāĻĨā§ āĻĒāĻžāĻāĻĨāĻ¨ āĻ¸ā§āĻā§āĻ°āĻŋāĻ āĻ°āĻ¯āĻŧā§āĻā§, āĻāĻŋāĻ¨ā§āĻ¤ā§ None-āĻāĻ° āĻāĻāĻāĻŋ āĻŦāĻŋāĻļā§āĻˇ āĻŽāĻžāĻ¨ āĻ°āĻ¯āĻŧā§āĻā§ āĻ¯āĻž msg_sender coroutine-āĻā§ āĻāĻžāĻ āĻŦāĻ¨ā§āĻ§ āĻāĻ°āĻžāĻ° āĻāĻ¨ā§āĻ¯ āĻ¸āĻāĻā§āĻ¤ āĻĻā§āĻ¯āĻŧ āĻ¯āĻžāĻ¤ā§ āĻāĻāĻŋ āĻ˛āĻŋāĻā§āĻ¯āĻžāĻ¸āĻŋ TCP āĻ¸āĻāĻ¯ā§āĻā§āĻ° āĻ¸āĻžāĻĨā§ āĻ¯ā§āĻā§āĻ¤ āĻ¤āĻžāĻ° āĻ˛ā§āĻāĻā§āĻ° āĻāĻĨāĻž āĻā§āĻ˛ā§ āĻ¯āĻžāĻ¯āĻŧāĨ¤
159 msg_handshake = msg.value
160 peer_name = str(msg_handshake["peerName"])
161 if peer_name not in THEIR_NAMES:
162 logging.warning("unknown peer name: %s", peer_name)
163 writer.close()
164 return
165 logging.info("%s: session established: %s", _id, peer_name)
166 # Run text message sender, initialize transport decoder {{{
167 peer_alive = PEER_ALIVES.pop(peer_name, None)
168 if peer_alive is not None:
169 peer_alive.close()
170 await IN_QUEUES[peer_name].put(None)
171 PEER_ALIVES[peer_name] = writer
172 asyncio.ensure_future(msg_sender(peer_name, writer))
173 # }}}
msg_sender āĻŦāĻšāĻŋāĻ°ā§āĻāĻžāĻŽā§ āĻŦāĻžāĻ°ā§āĻ¤āĻžāĻā§āĻ˛āĻŋ āĻā§āĻ°āĻšāĻŖ āĻāĻ°ā§ (āĻāĻāĻāĻŋ āĻ¸āĻā§āĻ āĻĨā§āĻā§ āĻ¸āĻžāĻ°āĻŋāĻŦāĻĻā§āĻ§), āĻ¸ā§āĻā§āĻ˛āĻŋāĻā§ āĻāĻāĻāĻŋ MsgText āĻŦāĻžāĻ°ā§āĻ¤āĻžāĻ¯āĻŧ āĻ¸āĻŋāĻ°āĻŋāĻ¯āĻŧāĻžāĻ˛āĻžāĻāĻ āĻāĻ°ā§ āĻāĻŦāĻ āĻāĻāĻāĻŋ TCP āĻ¸āĻāĻ¯ā§āĻā§āĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§ āĻĒāĻžāĻ āĻžāĻ¯āĻŧāĨ¤ āĻāĻāĻŋ āĻ¯ā§ āĻā§āĻ¨āĻ āĻŽā§āĻšā§āĻ°ā§āĻ¤ā§ āĻā§āĻā§ āĻ¯ā§āĻ¤ā§ āĻĒāĻžāĻ°ā§ - āĻāĻŽāĻ°āĻž āĻ¸ā§āĻĒāĻˇā§āĻāĻāĻžāĻŦā§ āĻāĻāĻŋāĻā§ āĻŦāĻžāĻ§āĻž āĻĻāĻŋāĻāĨ¤
async def msg_sender(peer_name: str, writer) -> None:
in_queue = IN_QUEUES[peer_name]
while True:
text = await in_queue.get()
if text is None:
break
writer.write(Msg(("text", MsgText((
("text", UTF8String(text)),
)))).encode())
try:
await writer.drain()
except ConnectionResetError:
del PEER_ALIVES[peer_name]
return
logging.info("%s: sent %d characters message", peer_name, len(text))
āĻļā§āĻˇā§, āĻ¸ā§āĻāĻ¨āĻžāĻāĻžāĻ°ā§ āĻ¸āĻā§āĻ āĻĨā§āĻā§ āĻŦāĻžāĻ°ā§āĻ¤āĻž āĻĒāĻĄāĻŧāĻžāĻ° āĻāĻāĻāĻŋ āĻ āĻ¸ā§āĻŽ āĻ˛ā§āĻĒā§ āĻĒā§āĻ°āĻŦā§āĻļ āĻāĻ°ā§āĨ¤ āĻāĻ āĻŦāĻžāĻ°ā§āĻ¤āĻžāĻā§āĻ˛āĻŋ āĻĒāĻžāĻ ā§āĻ¯ āĻŦāĻžāĻ°ā§āĻ¤āĻž āĻāĻŋāĻ¨āĻž āĻ¤āĻž āĻĒāĻ°ā§āĻā§āĻˇāĻž āĻāĻ°ā§ āĻāĻŦāĻ āĻ¸ā§āĻā§āĻ˛āĻŋāĻā§ OUT_QUEUES āĻ¸āĻžāĻ°āĻŋāĻ¤ā§ āĻ°āĻžāĻā§, āĻ¯ā§āĻāĻžāĻ¨ āĻĨā§āĻā§ āĻ¸ā§āĻā§āĻ˛āĻŋ āĻ¸āĻāĻļā§āĻ˛āĻŋāĻˇā§āĻ āĻāĻĨā§āĻĒāĻāĻĨāĻ¨ā§āĻ° āĻāĻāĻ āĻ¸āĻā§āĻā§ āĻĒāĻžāĻ āĻžāĻ¨ā§ āĻšāĻŦā§ā§ˇ āĻā§āĻ¨ āĻāĻĒāĻ¨āĻŋ āĻļā§āĻ§ā§ .read() āĻāĻŦāĻ āĻŦāĻžāĻ°ā§āĻ¤āĻžāĻāĻŋ āĻĄāĻŋāĻā§āĻĄ āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°āĻŦā§āĻ¨ āĻ¨āĻž? āĻāĻžāĻ°āĻŖ āĻāĻāĻŋ āĻ¸āĻŽā§āĻāĻŦ āĻ¯ā§ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻāĻžāĻ°ā§āĻ° āĻāĻžāĻ āĻĨā§āĻā§ āĻŦā§āĻļ āĻāĻ¯āĻŧā§āĻāĻāĻŋ āĻŦāĻžāĻ°ā§āĻ¤āĻž āĻ āĻĒāĻžāĻ°ā§āĻāĻŋāĻ āĻ¸āĻŋāĻ¸ā§āĻā§āĻŽ āĻŦāĻžāĻĢāĻžāĻ°ā§ āĻāĻāĻ¤ā§āĻ°āĻŋāĻ¤ āĻšāĻŦā§ āĻāĻŦāĻ āĻāĻāĻāĻŋ TCP āĻŦāĻŋāĻāĻžāĻā§ āĻĒāĻžāĻ āĻžāĻ¨ā§ āĻšāĻŦā§āĨ¤ āĻāĻŽāĻ°āĻž āĻĒā§āĻ°āĻĨāĻŽāĻāĻŋāĻā§ āĻĄāĻŋāĻā§āĻĄ āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°āĻŋ āĻāĻŦāĻ āĻ¤āĻžāĻ°āĻĒāĻ°ā§ āĻĒāĻ°āĻŦāĻ°ā§āĻ¤ā§āĻāĻŋāĻ° āĻāĻŋāĻā§ āĻ āĻāĻļ āĻŦāĻžāĻĢāĻžāĻ°ā§ āĻĨāĻžāĻāĻ¤ā§ āĻĒāĻžāĻ°ā§āĨ¤ āĻā§āĻ¨ā§ āĻ āĻ¸ā§āĻŦāĻžāĻāĻžāĻŦāĻŋāĻ āĻĒāĻ°āĻŋāĻ¸ā§āĻĨāĻŋāĻ¤āĻŋāĻ° āĻā§āĻˇā§āĻ¤ā§āĻ°ā§, āĻāĻŽāĻ°āĻž TCP āĻ¸āĻāĻ¯ā§āĻ āĻŦāĻ¨ā§āĻ§ āĻāĻ°ā§ āĻĻāĻŋāĻ āĻāĻŦāĻ msg_sender coroutine āĻŦāĻ¨ā§āĻ§ āĻāĻ°āĻŋ (OUT_QUEUES āĻ¸āĻžāĻ°āĻŋāĻ¤ā§ None āĻĒāĻžāĻ āĻŋāĻ¯āĻŧā§)āĨ¤
174 buf = b""
175 # Wait for test messages {{{
176 while True:
177 data = await reader.read(MaxMsgLen)
178 if data == b"":
179 break
180 buf += data
181 if len(buf) > MaxMsgLen:
182 logging.warning("%s: max buffer size exceeded", _id)
183 break
184 try:
185 msg, tail = Msg().decode(buf)
186 except ASN1Error:
187 continue
188 buf = tail
189 if msg.choice != "text":
190 logging.warning("%s: unexpected %s message", _id, msg.choice)
191 break
192 try:
193 await msg_receiver(msg.value, peer_name)
194 except ValueError as err:
195 logging.warning("%s: %s", err)
196 break
197 # }}}
198 logging.info("%s: disconnecting: %s", _id, peer_name)
199 IN_QUEUES[peer_name].put(None)
200 writer.close()
66 async def msg_receiver(msg_text: MsgText, peer_name: str) -> None:
67 text = str(msg_text["text"])
68 logging.info("%s: received %d characters message", peer_name, len(text))
69 await OUT_QUEUES[peer_name].put(text)
āĻŽā§āĻ˛ āĻā§āĻĄā§ āĻĢāĻŋāĻ°ā§ āĻāĻ¸āĻž āĻ¯āĻžāĻāĨ¤ āĻĒā§āĻ°ā§āĻā§āĻ°āĻžāĻŽāĻāĻŋ āĻļā§āĻ°ā§ āĻšāĻāĻ¯āĻŧāĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧā§ āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻā§āĻ°ā§āĻāĻŋāĻ¨ āĻ¤ā§āĻ°āĻŋ āĻāĻ°āĻžāĻ° āĻĒāĻ°ā§, āĻāĻŽāĻ°āĻž TCP āĻ¸āĻžāĻ°ā§āĻāĻžāĻ° āĻļā§āĻ°ā§ āĻāĻ°āĻŋāĨ¤ āĻĒā§āĻ°āĻ¤āĻŋāĻāĻŋ āĻĒā§āĻ°āĻ¤āĻŋāĻˇā§āĻ āĻŋāĻ¤ āĻ¸āĻāĻ¯ā§āĻā§āĻ° āĻāĻ¨ā§āĻ¯, āĻāĻāĻŋ āĻāĻāĻāĻŋ āĻĒā§āĻ°āĻ¤āĻŋāĻā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻāĻžāĻ°ā§ āĻā§āĻ°ā§āĻāĻŋāĻ¨ āĻ¤ā§āĻ°āĻŋ āĻāĻ°ā§āĨ¤
logging.basicConfig(
level=logging.INFO,
format="%(levelname)s %(asctime)s: %(funcName)s: %(message)s",
)
loop = asyncio.get_event_loop()
server = loop.run_until_complete(asyncio.start_server(responder, args.bind, args.port))
logging.info("Listening on: %s", server.sockets[0].getsockname())
loop.run_forever()
āĻāĻ¤ā§āĻ¤āĻ°āĻĻāĻžāĻ¤āĻž āĻ¸ā§āĻāĻ¨āĻžāĻāĻžāĻ°ā§āĻ° āĻ āĻ¨ā§āĻ°ā§āĻĒ āĻāĻŦāĻ āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻāĻāĻ āĻā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻā§ āĻŽāĻŋāĻ°āĻ° āĻāĻ°ā§, āĻ¤āĻŦā§ āĻ¸āĻ°āĻ˛āĻ¤āĻžāĻ° āĻāĻ¨ā§āĻ¯ āĻŦāĻžāĻ°ā§āĻ¤āĻž āĻĒāĻĄāĻŧāĻžāĻ° āĻ āĻ¸ā§āĻŽ āĻ˛ā§āĻĒ āĻ āĻŦāĻŋāĻ˛āĻŽā§āĻŦā§ āĻļā§āĻ°ā§ āĻšāĻ¯āĻŧāĨ¤ āĻŦāĻ°ā§āĻ¤āĻŽāĻžāĻ¨ā§, āĻšā§āĻ¯āĻžāĻ¨ā§āĻĄāĻļā§āĻ āĻĒā§āĻ°ā§āĻā§āĻāĻ˛ āĻĒā§āĻ°āĻ¤āĻŋāĻāĻŋ āĻĻāĻŋāĻ āĻĨā§āĻā§ āĻāĻāĻāĻŋ āĻŦāĻžāĻ°ā§āĻ¤āĻž āĻĒāĻžāĻ āĻžāĻ¯āĻŧ, āĻ¤āĻŦā§ āĻāĻŦāĻŋāĻˇā§āĻ¯āĻ¤ā§ āĻ¸āĻāĻ¯ā§āĻ āĻ¸ā§āĻāĻ¨āĻžāĻāĻžāĻ°ā§āĻ° āĻāĻžāĻ āĻĨā§āĻā§ āĻĻā§āĻāĻŋ āĻĨāĻžāĻāĻŦā§, āĻ¯āĻžāĻ° āĻĒāĻ°ā§ āĻĒāĻžāĻ ā§āĻ¯ āĻŦāĻžāĻ°ā§āĻ¤āĻžāĻā§āĻ˛āĻŋ āĻ āĻŦāĻŋāĻ˛āĻŽā§āĻŦā§ āĻĒāĻžāĻ āĻžāĻ¨ā§ āĻ¯ā§āĻ¤ā§ āĻĒāĻžāĻ°ā§āĨ¤
72 async def responder(reader, writer):
73 _id = writer.get_extra_info("peername")
74 logging.info("%s: connected", _id)
75 buf = b""
76 msg_expected = "handshake"
77 peer_name = None
78 while True:
79 # Read until we get Msg message {{{
80 data = await reader.read(MaxMsgLen)
81 if data == b"":
82 logging.info("%s: closed connection", _id)
83 break
84 buf += data
85 if len(buf) > MaxMsgLen:
86 logging.warning("%s: max buffer size exceeded", _id)
87 break
88 try:
89 msg, tail = Msg().decode(buf)
90 except ASN1Error:
91 continue
92 buf = tail
93 # }}}
94 if msg.choice != msg_expected:
95 logging.warning("%s: unexpected %s message", _id, msg.choice)
96 break
97 if msg_expected == "text":
98 try:
99 await msg_receiver(msg.value, peer_name)
100 except ValueError as err:
101 logging.warning("%s: %s", err)
102 break
103 # Process Handshake message {{{
104 elif msg_expected == "handshake":
105 logging.info("%s: got %s message", _id, msg_expected)
106 msg_handshake = msg.value
107 peer_name = str(msg_handshake["peerName"])
108 if peer_name not in THEIR_NAMES:
109 logging.warning("unknown peer name: %s", peer_name)
110 break
111 writer.write(Msg(("handshake", MsgHandshake((
112 ("peerName", OUR_NAME),
113 )))).encode())
114 await writer.drain()
115 logging.info("%s: session established: %s", _id, peer_name)
116 peer_alive = PEER_ALIVES.pop(peer_name, None)
117 if peer_alive is not None:
118 peer_alive.close()
119 await IN_QUEUES[peer_name].put(None)
120 PEER_ALIVES[peer_name] = writer
121 asyncio.ensure_future(msg_sender(peer_name, writer))
122 msg_expected = "text"
123 # }}}
124 logging.info("%s: disconnecting", _id)
125 if msg_expected == "text":
126 IN_QUEUES[peer_name].put(None)
127 writer.close()
āĻ¨āĻŋāĻ°āĻžāĻĒāĻĻ āĻĒā§āĻ°ā§āĻā§āĻāĻ˛
āĻāĻāĻž āĻāĻŽāĻžāĻĻā§āĻ° āĻ¯ā§āĻāĻžāĻ¯ā§āĻ āĻ¸ā§āĻ°āĻā§āĻˇāĻŋāĻ¤ āĻāĻ°āĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧ. āĻ¨āĻŋāĻ°āĻžāĻĒāĻ¤ā§āĻ¤āĻž āĻŦāĻ˛āĻ¤ā§ āĻāĻŽāĻ°āĻž āĻā§ āĻŦā§āĻāĻŋ āĻāĻŦāĻ āĻāĻŽāĻ°āĻž āĻā§ āĻāĻžāĻ:
- āĻĒā§āĻ°ā§āĻ°āĻŋāĻ¤ āĻŦāĻžāĻ°ā§āĻ¤āĻžāĻ° āĻā§āĻĒāĻ¨ā§āĻ¯āĻŧāĻ¤āĻž;
- āĻĒā§āĻ°ā§āĻ°āĻŋāĻ¤ āĻŦāĻžāĻ°ā§āĻ¤āĻžāĻā§āĻ˛āĻŋāĻ° āĻ¸āĻ¤ā§āĻ¯āĻ¤āĻž āĻāĻŦāĻ āĻ āĻāĻŖā§āĻĄāĻ¤āĻž - āĻ¤āĻžāĻĻā§āĻ° āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨āĻā§āĻ˛āĻŋ āĻ¸āĻ¨āĻžāĻā§āĻ¤ āĻāĻ°āĻž āĻāĻŦāĻļā§āĻ¯āĻ;
- āĻ°āĻŋāĻĒā§āĻ˛ā§ āĻāĻā§āĻ°āĻŽāĻŖā§āĻ° āĻŦāĻŋāĻ°ā§āĻĻā§āĻ§ā§ āĻ¸ā§āĻ°āĻā§āĻˇāĻž - āĻ āĻ¨ā§āĻĒāĻ¸ā§āĻĨāĻŋāĻ¤ āĻŦāĻž āĻŦāĻžāĻ°āĻŦāĻžāĻ° āĻŦāĻžāĻ°ā§āĻ¤āĻžāĻā§āĻ˛āĻŋāĻ° āĻ¸āĻ¤ā§āĻ¯āĻ¤āĻž āĻ āĻŦāĻļā§āĻ¯āĻ āĻ¸āĻ¨āĻžāĻā§āĻ¤ āĻāĻ°āĻž āĻāĻāĻŋāĻ¤ (āĻāĻŦāĻ āĻāĻŽāĻ°āĻž āĻ¸āĻāĻ¯ā§āĻāĻāĻŋ āĻŦāĻ¨ā§āĻ§ āĻāĻ°āĻžāĻ° āĻ¸āĻŋāĻĻā§āĻ§āĻžāĻ¨ā§āĻ¤ āĻ¨āĻŋāĻ);
- āĻĒā§āĻ°ā§āĻŦā§ āĻĒā§āĻ°āĻŦā§āĻļ āĻāĻ°āĻž āĻĒāĻžāĻŦāĻ˛āĻŋāĻ āĻā§ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°ā§ āĻāĻĨā§āĻĒāĻāĻĨāĻ¨āĻāĻžāĻ°ā§āĻĻā§āĻ° āĻ¸āĻ¨āĻžāĻā§āĻ¤āĻāĻ°āĻŖ āĻāĻŦāĻ āĻĒā§āĻ°āĻŽāĻžāĻŖā§āĻāĻ°āĻŖ - āĻāĻŽāĻ°āĻž āĻāĻ¤āĻŋāĻŽāĻ§ā§āĻ¯ā§āĻ āĻ¸āĻŋāĻĻā§āĻ§āĻžāĻ¨ā§āĻ¤ āĻ¨āĻŋāĻ¯āĻŧā§āĻāĻŋ āĻ¯ā§ āĻāĻŽāĻ°āĻž āĻāĻāĻāĻŋ āĻŦāĻ¨ā§āĻ§ā§-āĻĨā§āĻā§-āĻŦāĻ¨ā§āĻ§ā§ āĻ¨ā§āĻāĻāĻ¯āĻŧāĻžāĻ°ā§āĻ āĻ¤ā§āĻ°āĻŋ āĻāĻ°āĻāĻŋā§ˇ āĻĒā§āĻ°āĻŽāĻžāĻŖā§āĻāĻ°āĻŖā§āĻ° āĻĒāĻ°ā§āĻ āĻāĻŽāĻ°āĻž āĻŦā§āĻāĻ¤ā§ āĻĒāĻžāĻ°āĻŦ āĻāĻŽāĻ°āĻž āĻāĻžāĻ° āĻ¸āĻžāĻĨā§ āĻ¯ā§āĻāĻžāĻ¯ā§āĻ āĻāĻ°āĻāĻŋ;
- āĻāĻĒāĻ¸ā§āĻĨāĻŋāĻ¤āĻŋ
āĻ¨āĻŋāĻā§āĻāĻ¤ āĻĢāĻ°ā§āĻ¯āĻŧāĻžāĻ°ā§āĻĄ āĻā§āĻĒāĻ¨ā§āĻ¯āĻŧāĻ¤āĻž āĻŦā§āĻļāĻŋāĻˇā§āĻā§āĻ¯ (PFS) - āĻāĻŽāĻžāĻĻā§āĻ° āĻĻā§āĻ°ā§āĻāĻā§āĻŦā§ āĻ¸āĻžāĻāĻ¨āĻŋāĻ āĻā§ āĻāĻĒāĻ¸ āĻāĻ°āĻž āĻĒā§āĻ°ā§āĻŦāĻŦāĻ°ā§āĻ¤ā§ āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻāĻŋāĻ āĻŋāĻĒāĻ¤ā§āĻ° āĻĒāĻĄāĻŧāĻžāĻ° āĻā§āĻˇāĻŽāĻ¤āĻžāĻ° āĻĻāĻŋāĻā§ āĻ¨āĻŋāĻ¯āĻŧā§ āĻ¯āĻžāĻāĻ¯āĻŧāĻž āĻāĻāĻŋāĻ¤ āĻ¨āĻ¯āĻŧāĨ¤ āĻāĻāĻāĻžāĻ¨ā§ āĻā§āĻ°āĻžāĻĢāĻŋāĻ āĻ°ā§āĻāĻ°ā§āĻĄāĻŋāĻ āĻ āĻā§āĻā§ āĻšāĻ¯āĻŧā§ āĻ¯āĻžāĻ¯āĻŧ; - āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻāĻāĻāĻŋ TCP āĻ¸ā§āĻļāĻ¨ā§āĻ° āĻŽāĻ§ā§āĻ¯ā§ āĻŦāĻžāĻ°ā§āĻ¤āĻžāĻ° āĻŦā§āĻ§āĻ¤āĻž/āĻŦā§āĻ§āĻ¤āĻž (āĻĒāĻ°āĻŋāĻŦāĻšāĻ¨ āĻāĻŦāĻ āĻšā§āĻ¯āĻžāĻ¨ā§āĻĄāĻļā§āĻ)āĨ¤ āĻ āĻ¨ā§āĻ¯ āĻ¸ā§āĻļāĻ¨ āĻĨā§āĻā§ āĻ¸āĻ āĻŋāĻāĻāĻžāĻŦā§ āĻ¸ā§āĻŦāĻžāĻā§āĻˇāĻ°āĻŋāĻ¤/āĻĒā§āĻ°āĻŽāĻžāĻŖāĻŋāĻ¤ āĻŦāĻžāĻ°ā§āĻ¤āĻž āĻ¸āĻ¨ā§āĻ¨āĻŋāĻŦā§āĻļ āĻāĻ°āĻžāĻ¨ā§ (āĻāĻŽāĻ¨āĻāĻŋ āĻāĻāĻ āĻāĻĨā§āĻĒāĻāĻĨāĻ¨ā§āĻ° āĻ¸āĻžāĻĨā§) āĻ¸āĻŽā§āĻāĻŦ āĻ¨āĻ¯āĻŧ;
- āĻāĻāĻāĻŋ āĻĒā§āĻ¯āĻžāĻ¸āĻŋāĻ āĻĒāĻ°ā§āĻ¯āĻŦā§āĻā§āĻˇāĻ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻāĻžāĻ°ā§ āĻļāĻ¨āĻžāĻā§āĻ¤āĻāĻžāĻ°ā§, āĻĻā§āĻ°ā§āĻāĻ¸ā§āĻĨāĻžāĻ¯āĻŧā§ āĻĒāĻžāĻŦāĻ˛āĻŋāĻ āĻā§ āĻŦāĻž āĻ¤āĻžāĻĻā§āĻ° āĻĨā§āĻā§ āĻšā§āĻ¯āĻžāĻļ āĻĻā§āĻāĻ¤ā§ āĻĒāĻžāĻŦā§ āĻ¨āĻžāĨ¤ āĻāĻāĻāĻŋ āĻĒā§āĻ¯āĻžāĻ¸āĻŋāĻ āĻĒāĻ°ā§āĻ¯āĻŦā§āĻā§āĻˇāĻ āĻĨā§āĻā§ āĻāĻāĻāĻŋ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻ āĻŦā§āĻ¨āĻžāĻŽā§.
āĻāĻļā§āĻāĻ°ā§āĻ¯āĻāĻ¨āĻāĻāĻžāĻŦā§, āĻĒā§āĻ°āĻžāĻ¯āĻŧ āĻĒā§āĻ°āĻ¤ā§āĻ¯ā§āĻā§āĻ āĻ¯ā§āĻā§āĻ¨ āĻšā§āĻ¯āĻžāĻ¨ā§āĻĄāĻļā§āĻ āĻĒā§āĻ°ā§āĻā§āĻāĻ˛ā§āĻ° āĻŽāĻ§ā§āĻ¯ā§ āĻāĻ āĻ¨ā§āĻ¯ā§āĻ¨āĻ¤āĻŽāĻāĻŋ āĻ°āĻžāĻāĻ¤ā§ āĻāĻžāĻ¯āĻŧ āĻāĻŦāĻ āĻāĻĒāĻ°ā§āĻ° āĻā§āĻŦ āĻāĻŽāĻ āĻļā§āĻˇ āĻĒāĻ°ā§āĻ¯āĻ¨ā§āĻ¤ "āĻšā§āĻŽāĻā§āĻ°ā§āĻ¨" āĻĒā§āĻ°ā§āĻā§āĻāĻ˛ā§āĻ° āĻāĻ¨ā§āĻ¯ āĻĒā§āĻ°āĻŖ āĻāĻ°āĻž āĻšāĻ¯āĻŧāĨ¤ āĻāĻāĻ¨ āĻāĻŽāĻ°āĻž āĻ¨āĻ¤ā§āĻ¨ āĻāĻŋāĻā§ āĻāĻĻā§āĻāĻžāĻŦāĻ¨ āĻāĻ°āĻŦ āĻ¨āĻžāĨ¤ āĻāĻŽāĻŋ āĻ
āĻŦāĻļā§āĻ¯āĻ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻžāĻ° āĻĒāĻ°āĻžāĻŽāĻ°ā§āĻļ āĻĻā§āĻŦ
āĻĻā§āĻāĻŋ āĻ¸āĻŦāĻā§āĻ¯āĻŧā§ āĻāĻ¨āĻĒā§āĻ°āĻŋāĻ¯āĻŧ āĻĒā§āĻ°ā§āĻā§āĻāĻ˛ āĻšāĻ˛:
TLS āĻāĻ° - āĻŦāĻžāĻ, āĻā§āĻ¯āĻžāĻŽ, āĻĻā§āĻ°ā§āĻŦāĻ˛āĻ¤āĻž, āĻĻā§āĻ°ā§āĻŦāĻ˛ āĻāĻŋāĻ¨ā§āĻ¤āĻžāĻāĻžāĻŦāĻ¨āĻž, āĻāĻāĻŋāĻ˛āĻ¤āĻž āĻāĻŦāĻ āĻ¤ā§āĻ°ā§āĻāĻŋāĻā§āĻ˛āĻŋāĻ° āĻĻā§āĻ°ā§āĻ āĻāĻ¤āĻŋāĻšāĻžāĻ¸ āĻ¸āĻš āĻāĻāĻāĻŋ āĻ āĻ¤ā§āĻ¯āĻ¨ā§āĻ¤ āĻāĻāĻŋāĻ˛ āĻĒā§āĻ°ā§āĻā§āĻāĻ˛ (āĻ¤āĻŦā§, āĻāĻāĻŋāĻ° āĻ¸āĻžāĻĨā§ TLS 1.3 āĻāĻ° āĻ¸āĻžāĻŽāĻžāĻ¨ā§āĻ¯ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ āĻ¨ā§āĻ)āĨ¤ āĻ¤āĻŦā§ āĻāĻŽāĻ°āĻž āĻāĻāĻŋ āĻŦāĻŋāĻŦā§āĻāĻ¨āĻž āĻāĻ°āĻŋ āĻ¨āĻž āĻāĻžāĻ°āĻŖ āĻāĻāĻŋ āĻ āĻ¤āĻŋāĻ°āĻŋāĻā§āĻ¤ āĻāĻāĻŋāĻ˛āĨ¤-
IP āĻ¸ā§āĻā§ ŅIke â āĻā§āĻ°ā§āĻ¤āĻ° āĻā§āĻ°āĻŋāĻĒā§āĻā§āĻā§āĻ°āĻžāĻĢāĻŋāĻ āĻ¸āĻŽāĻ¸ā§āĻ¯āĻž āĻ¨ā§āĻ, āĻ¯āĻĻāĻŋāĻ āĻ¸ā§āĻā§āĻ˛āĻŋāĻ āĻ¸āĻšāĻ āĻ¨āĻ¯āĻŧāĨ¤ āĻāĻĒāĻ¨āĻŋ āĻ¯āĻĻāĻŋ IKEv1 āĻāĻŦāĻ IKEv2 āĻ¸āĻŽā§āĻĒāĻ°ā§āĻā§ āĻĒāĻĄāĻŧā§āĻ¨ āĻ¤āĻŦā§ āĻ¤āĻžāĻĻā§āĻ° āĻāĻ¤ā§āĻ¸āĻāĻ¸āĻāĻŋāĻāĻ¸ , ISO/IEC IS 9798-3 āĻāĻŦāĻ SIGMA (SIGn-and-MAc) āĻĒā§āĻ°ā§āĻā§āĻāĻ˛ - āĻāĻ āĻ¸āĻ¨ā§āĻ§ā§āĻ¯āĻžāĻ¯āĻŧ āĻĒā§āĻ°āĻ¯āĻŧā§āĻ āĻāĻ°āĻž āĻ¯āĻĨā§āĻˇā§āĻ āĻ¸āĻšāĻāĨ¤
STS/ISO āĻĒā§āĻ°ā§āĻā§āĻāĻ˛ā§āĻ° āĻŦāĻŋāĻāĻžāĻļā§āĻ° āĻ¸āĻ°ā§āĻŦāĻļā§āĻˇ āĻ˛āĻŋāĻā§āĻ āĻšāĻŋāĻ¸āĻžāĻŦā§ SIGMA āĻ¸āĻŽā§āĻĒāĻ°ā§āĻā§ āĻā§ āĻāĻžāĻ˛? āĻāĻāĻŋ āĻāĻŽāĻžāĻĻā§āĻ° āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻĒā§āĻ°āĻ¯āĻŧā§āĻāĻ¨ā§āĻ¯āĻŧāĻ¤āĻž āĻĒā§āĻ°āĻŖ āĻāĻ°ā§ ("āĻ˛ā§āĻāĻžāĻ¨ā§āĻ°" āĻāĻĨā§āĻĒāĻāĻĨāĻ¨ āĻļāĻ¨āĻžāĻā§āĻ¤āĻāĻžāĻ°ā§ āĻ¸āĻš) āĻāĻŦāĻ āĻā§āĻ¨āĻ āĻĒāĻ°āĻŋāĻāĻŋāĻ¤ āĻā§āĻ°āĻŋāĻĒā§āĻā§āĻā§āĻ°āĻžāĻĢāĻŋāĻ āĻ¸āĻŽāĻ¸ā§āĻ¯āĻž āĻ¨ā§āĻā§ˇ āĻāĻāĻŋ āĻ¸āĻāĻā§āĻˇāĻŋāĻĒā§āĻ¤ - āĻĒā§āĻ°ā§āĻā§āĻāĻ˛ āĻŦāĻžāĻ°ā§āĻ¤āĻž āĻĨā§āĻā§ āĻ āĻ¨ā§āĻ¤āĻ¤ āĻāĻāĻāĻŋ āĻāĻĒāĻžāĻĻāĻžāĻ¨ āĻ āĻĒāĻ¸āĻžāĻ°āĻŖ āĻāĻ°āĻž āĻ¤āĻžāĻ° āĻ¨āĻŋāĻ°āĻžāĻĒāĻ¤ā§āĻ¤āĻžāĻšā§āĻ¨āĻ¤āĻžāĻ° āĻĻāĻŋāĻā§ āĻĒāĻ°āĻŋāĻāĻžāĻ˛āĻŋāĻ¤ āĻāĻ°āĻŦā§āĨ¤
āĻāĻ˛ā§āĻ¨ āĻ¸āĻŋāĻāĻŽāĻž-āĻ¤ā§ āĻ¸āĻŦāĻā§āĻ¯āĻŧā§ āĻ¸āĻšāĻ āĻā§āĻšāĻĒāĻžāĻ˛āĻŋāĻ¤ āĻĒā§āĻ°ā§āĻā§āĻāĻ˛ āĻĨā§āĻā§ āĻ¯āĻžāĻāĨ¤ āĻāĻŽāĻ°āĻž āĻāĻā§āĻ°āĻšā§ āĻ¸āĻŦāĻā§āĻ¯āĻŧā§ āĻŽā§āĻ˛āĻŋāĻ āĻ
āĻĒāĻžāĻ°ā§āĻļāĻ¨ āĻšāĻ¯āĻŧ
âââââââ âââââââ âāĻĒāĻŋāĻ°āĻâ âāĻĒāĻŋāĻ°āĻŦāĻŋâ ââââŦâ â ââââââââââââ - â âââââââââ ââââââââââââ â IdB, PubB â âââââââââââââââââââââââââââ â<âââââââââ âââââââ âPrvB, PubB = DHgen()â â â ââââââââââââââââââââââââââââââââ ââââ âââââ ââââ§âââââââââââââ â âāĻā§ = DH(PrvA, PubB)â <âââââ <ââââââââââââââââââââââââ âââââââ âââââ â â â â
āĻ¯ā§ āĻā§āĻ āĻŽāĻžāĻāĻāĻžāĻ¨ā§ āĻāĻžāĻāĻĒāĻŋāĻ¯āĻŧā§ āĻĒāĻĄāĻŧāĻ¤ā§ āĻĒāĻžāĻ°ā§ āĻāĻŦāĻ āĻ¤āĻžāĻĻā§āĻ° āĻ¨āĻŋāĻāĻ¸ā§āĻŦ āĻā§ āĻĻāĻŋāĻ¯āĻŧā§ āĻĒāĻžāĻŦāĻ˛āĻŋāĻ āĻā§ āĻĒā§āĻ°āĻ¤āĻŋāĻ¸ā§āĻĨāĻžāĻĒāĻ¨ āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°ā§ - āĻāĻ āĻĒā§āĻ°ā§āĻā§āĻāĻ˛āĻāĻŋāĻ¤ā§ āĻāĻ¨ā§āĻāĻžāĻ°āĻ˛ā§āĻāĻŋāĻāĻāĻžāĻ°āĻĻā§āĻ° āĻā§āĻ¨āĻ āĻĒā§āĻ°āĻŽāĻžāĻŖā§āĻāĻ°āĻŖ āĻ¨ā§āĻāĨ¤ āĻāĻ˛ā§āĻ¨ āĻĻā§āĻ°ā§āĻāĻā§āĻŦā§ āĻā§ āĻ¸āĻš āĻāĻāĻāĻŋ āĻ¸ā§āĻŦāĻžāĻā§āĻˇāĻ° āĻ¯ā§āĻ āĻāĻ°āĻŋāĨ¤
ââââââ, Py āĻāĻŋāĻšā§āĻ¨ (āĻ¸āĻžāĻāĻ¨ āĻĒā§āĻ°āĻāĻž, (PubA)) â ââ āĻ¸āĻžāĻāĻ¨ ubA = āĻ˛ā§āĻĄ()â â â âPrvA, PubA = DHgen() â â â âââââââââââââââââââââââââââââââââââââ , āĻāĻŋāĻšā§āĻ¨ (āĻ¸āĻžāĻāĻ¨PrvB, (PubB)) â ââââââââââââââââ ââââââââââââââââââââââ âââââââââââ âââââââââââââ âââ âSignPrvB, SignPubB = load( )â â â âPrvB, PubB = DH ââââââââââ ââââââââââââââ âââ âââââ â ââââââââââââââ ââââââ â â â āĻ¯āĻžāĻāĻžāĻ āĻāĻ°ā§āĻ¨( SignPubB, ...)â â <ââââ âKey = DH(Pr vA, PubB) â â â ââââââââââââââââââââââââââ ââ â â â
āĻāĻ āĻ§āĻ°āĻ¨ā§āĻ° āĻāĻāĻāĻŋ āĻ¸ā§āĻŦāĻžāĻā§āĻˇāĻ° āĻāĻžāĻ āĻāĻ°āĻŦā§ āĻ¨āĻž, āĻ¯ā§āĻšā§āĻ¤ā§ āĻāĻāĻŋ āĻāĻāĻāĻŋ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻ āĻ¸ā§āĻļāĻ¨ā§āĻ° āĻ¸āĻžāĻĨā§ āĻāĻŦāĻĻā§āĻ§ āĻ¨āĻ¯āĻŧāĨ¤ āĻāĻ āĻ§āĻ°āĻ¨ā§āĻ° āĻŦāĻžāĻ°ā§āĻ¤āĻž āĻ āĻ¨ā§āĻ¯āĻžāĻ¨ā§āĻ¯ āĻ āĻāĻļāĻā§āĻ°āĻšāĻŖāĻāĻžāĻ°ā§āĻĻā§āĻ° āĻ¸āĻžāĻĨā§ āĻ¸ā§āĻļāĻ¨ā§āĻ° āĻāĻ¨ā§āĻ¯ "āĻāĻĒāĻ¯ā§āĻā§āĻ¤"āĨ¤ āĻ¸āĻŽā§āĻĒā§āĻ°ā§āĻŖ āĻĒā§āĻ°āĻ¸āĻā§āĻ āĻ¸āĻžāĻŦāĻ¸ā§āĻā§āĻ°āĻžāĻāĻŦ āĻāĻ°āĻž āĻāĻŦāĻļā§āĻ¯āĻ. āĻāĻāĻŋ āĻāĻŽāĻžāĻĻā§āĻ° A āĻĨā§āĻā§ āĻāĻ°ā§āĻāĻāĻŋ āĻŦāĻžāĻ°ā§āĻ¤āĻž āĻ¯ā§āĻ āĻāĻ°āĻ¤ā§ āĻŦāĻžāĻ§ā§āĻ¯ āĻāĻ°ā§āĨ¤
āĻāĻĒāĻ°āĻ¨ā§āĻ¤ā§, āĻ¸ā§āĻŦāĻžāĻā§āĻˇāĻ°ā§āĻ° āĻ
āĻ§ā§āĻ¨ā§ āĻāĻĒāĻ¨āĻžāĻ° āĻ¨āĻŋāĻāĻ¸ā§āĻŦ āĻļāĻ¨āĻžāĻā§āĻ¤āĻāĻžāĻ°ā§ āĻ¯ā§āĻ āĻāĻ°āĻž āĻā§āĻ°ā§āĻ¤ā§āĻŦāĻĒā§āĻ°ā§āĻŖ, āĻāĻžāĻ°āĻŖ āĻ
āĻ¨ā§āĻ¯āĻĨāĻžāĻ¯āĻŧ āĻāĻŽāĻ°āĻž IdXXX āĻĒā§āĻ°āĻ¤āĻŋāĻ¸ā§āĻĨāĻžāĻĒāĻ¨ āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°āĻŋ āĻāĻŦāĻ āĻ
āĻ¨ā§āĻ¯ āĻĒāĻ°āĻŋāĻāĻŋāĻ¤ āĻāĻĨā§āĻĒāĻāĻĨāĻā§āĻ° āĻā§ āĻĻāĻŋāĻ¯āĻŧā§ āĻŦāĻžāĻ°ā§āĻ¤āĻžāĻāĻŋāĻ¤ā§ āĻĒā§āĻ¨āĻ°āĻžāĻ¯āĻŧ āĻ¸ā§āĻŦāĻžāĻā§āĻˇāĻ° āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°āĻŋāĨ¤ āĻĒā§āĻ°āĻ¤āĻŋāĻ°ā§āĻ§ āĻāĻ°āĻ¤ā§
âââââââ âââââââ âāĻĒāĻŋāĻ°āĻâ âāĻĒāĻŋāĻ°āĻŦāĻŋâ ââââŦâ â ââââââââââââ ââââââââââââââââââ ââââââââââââââââââââââââ ââââââââââ âââââââââââââ>â âSignPrvA, SignPubA = load()â â â âPrvA, PubA = DHgenâ â â â â â ââââââââ ââââââââââââââââ âIdB, PubB, āĻāĻŋāĻšā§āĻ¨(SignPrvB, (IdB, PubA, PubB)) â ââââââââââââ âââââ âââââââââââââ â<ââââââââââââââââââââââââââââ ââââââââââ ââââââââââ âSignPrvB, SignPubB = load()â â â âPrvB, PubB = DHgen() â â â â â â â â â â â â âââââââââ âââââââââââ â āĻāĻŋāĻšā§āĻ¨(SignPrvA, (IdA, PubB, PubA)) â ââââââââââââââââââââââ âââââ ââ âââââââââââââââââââââââââââââââââââ âââ>â âāĻ¯āĻžāĻāĻžāĻ āĻāĻ°ā§āĻ¨(āĻ¸āĻžāĻāĻ¨āĻĒāĻžāĻŦāĻŦāĻŋ, ...) â â â âkey = dh (prva, PUBB) â â â â
āĻ¯āĻžāĻāĻšā§āĻ, āĻāĻŽāĻ°āĻž āĻāĻāĻ¨āĻ "āĻĒā§āĻ°āĻŽāĻžāĻŖ" āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°āĻŋāĻ¨āĻŋ āĻ¯ā§ āĻāĻŽāĻ°āĻž āĻāĻ āĻ¸ā§āĻļāĻ¨ā§āĻ° āĻāĻ¨ā§āĻ¯ āĻāĻāĻ āĻāĻžāĻ āĻāĻ°āĻž āĻā§ āĻ¤ā§āĻ°āĻŋ āĻāĻ°ā§āĻāĻŋā§ˇ āĻ¨ā§āĻ¤āĻŋāĻāĻ¤āĻāĻžāĻŦā§, āĻāĻŽāĻ°āĻž āĻāĻ āĻĒāĻĻāĻā§āĻˇā§āĻĒāĻāĻŋ āĻāĻžāĻĄāĻŧāĻžāĻ āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°āĻŋ - āĻĒā§āĻ°āĻĨāĻŽ āĻĒāĻ°āĻŋāĻŦāĻšāĻ¨ āĻ¸āĻāĻ¯ā§āĻāĻāĻŋ āĻ āĻŦā§āĻ§ āĻšāĻŦā§, āĻ¤āĻŦā§ āĻāĻŽāĻ°āĻž āĻāĻžāĻ āĻ¯ā§ āĻšā§āĻ¯āĻžāĻ¨ā§āĻĄāĻļā§āĻ āĻ¸āĻŽā§āĻĒāĻ¨ā§āĻ¨ āĻšāĻ˛ā§, āĻāĻŽāĻ°āĻž āĻ¨āĻŋāĻļā§āĻāĻŋāĻ¤ āĻšāĻŦ āĻ¯ā§ āĻ¸āĻŦāĻāĻŋāĻā§ āĻ¸āĻ¤ā§āĻ¯āĻŋāĻ āĻ¸āĻŽā§āĻŽāĻ¤ āĻšāĻ¯āĻŧā§āĻā§āĨ¤ āĻāĻ āĻŽā§āĻšā§āĻ°ā§āĻ¤ā§ āĻāĻŽāĻžāĻĻā§āĻ° āĻšāĻžāĻ¤ā§ ISO/IEC IS 9798-3 āĻĒā§āĻ°ā§āĻā§āĻāĻ˛ āĻāĻā§āĨ¤
āĻāĻŽāĻ°āĻž āĻā§āĻĒāĻ¨ā§āĻ¨ āĻā§ āĻ¨āĻŋāĻā§āĻ āĻ¸ā§āĻŦāĻžāĻā§āĻˇāĻ° āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°ā§. āĻāĻāĻŋ āĻŦāĻŋāĻĒāĻā§āĻāĻ¨āĻ, āĻāĻžāĻ°āĻŖ āĻāĻāĻŋ āĻ¸āĻŽā§āĻāĻŦ āĻ¯ā§ āĻŦā§āĻ¯āĻŦāĻšā§āĻ¤ āĻ¸ā§āĻŦāĻžāĻā§āĻˇāĻ° āĻ ā§āĻ¯āĻžāĻ˛āĻāĻ°āĻŋāĻĻāĻŽā§ āĻ˛āĻŋāĻ āĻĨāĻžāĻāĻ¤ā§ āĻĒāĻžāĻ°ā§ (āĻ¯āĻĻāĻŋāĻ āĻŦāĻŋāĻ-āĻĒā§āĻ°āĻ¤āĻŋ-āĻ¸ā§āĻŦāĻžāĻā§āĻˇāĻ°, āĻāĻŋāĻ¨ā§āĻ¤ā§ āĻāĻāĻ¨āĻ āĻ˛āĻŋāĻ āĻšāĻ¯āĻŧ)āĨ¤ āĻĄā§āĻ°āĻŋāĻā§āĻļāĻ¨ āĻā§-āĻāĻ° āĻāĻāĻāĻŋ āĻšā§āĻ¯āĻžāĻļ āĻ¸āĻžāĻāĻ¨ āĻāĻ°āĻž āĻ¸āĻŽā§āĻāĻŦ, āĻāĻŋāĻ¨ā§āĻ¤ā§ āĻĄā§āĻ°āĻŋāĻā§āĻā§āĻĄ āĻā§-āĻāĻ° āĻšā§āĻ¯āĻžāĻļ āĻ˛āĻŋāĻ āĻāĻ°āĻžāĻ āĻĄā§āĻ°āĻŋāĻā§āĻļāĻ¨ āĻĢāĻžāĻāĻļāĻ¨ā§āĻ° āĻāĻĒāĻ° āĻŦā§āĻ°ā§āĻ-āĻĢā§āĻ°ā§āĻ¸ āĻāĻā§āĻ°āĻŽāĻŖā§ āĻŽā§āĻ˛ā§āĻ¯āĻŦāĻžāĻ¨ āĻšāĻ¤ā§ āĻĒāĻžāĻ°ā§āĨ¤ SIGMA āĻāĻāĻāĻŋ MAC āĻĢāĻžāĻāĻļāĻ¨ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°ā§ āĻ¯āĻž āĻĒā§āĻ°ā§āĻ°āĻā§āĻ° āĻāĻāĻĄāĻŋ āĻĒā§āĻ°āĻŽāĻžāĻŖā§āĻāĻ°āĻŖ āĻāĻ°ā§āĨ¤
âââââââ âââââââ âāĻĒāĻŋāĻ°āĻâ âāĻĒāĻŋāĻ°āĻŦāĻŋâ ââââŦâ â ââââââââââââ ââââââââââââââââââ ââââââââââââââââââââââââ ââââââââââ * â âââââââ â- âââ â<âââââââââââââââââ ââââââââââââââââââ ââââââââââ ââ âSignPrvB, SignPubB = load()â â â âPrvB, PubB = DHgen() â â â ââââââââââââââââââââââââ ââââââââââ * â âāĻā§ = DH( PrvA, PubB) â ââââââââââââââââââââââââââââââââââââââââ ââââââââââ âââââ>â âāĻ¯āĻžāĻāĻžāĻ āĻāĻ°ā§āĻ¨(āĻā§, āĻāĻāĻĄāĻŋāĻŦāĻŋ) â â â âāĻ¯āĻžāĻāĻžāĻ āĻāĻ°ā§āĻ¨(āĻ¸āĻžāĻāĻ¨āĻĒāĻžāĻŦāĻŦāĻŋ, ...)â â â âââââââââââââââââââââââââ âââââ ââ â â
āĻāĻāĻāĻŋ āĻ āĻĒā§āĻāĻŋāĻŽāĻžāĻāĻā§āĻļāĻžāĻ¨ āĻšāĻŋāĻ¸āĻžāĻŦā§, āĻā§āĻ āĻā§āĻ āĻ¤āĻžāĻĻā§āĻ° āĻā§āĻˇāĻŖāĻ¸ā§āĻĨāĻžāĻ¯āĻŧā§ āĻā§āĻā§āĻ˛āĻŋ āĻĒā§āĻ¨āĻ°āĻžāĻ¯āĻŧ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻ¤ā§ āĻāĻžāĻāĻ¤ā§ āĻĒāĻžāĻ°ā§ (āĻ¯āĻž āĻ āĻŦāĻļā§āĻ¯āĻ PFS āĻāĻ° āĻāĻ¨ā§āĻ¯ āĻĻā§āĻ°ā§āĻāĻžāĻā§āĻ¯āĻāĻ¨āĻ)āĨ¤ āĻāĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§āĻĒ, āĻāĻŽāĻ°āĻž āĻāĻāĻāĻŋ āĻā§ āĻā§āĻĄāĻŧāĻž āĻ¤ā§āĻ°āĻŋ āĻāĻ°ā§āĻāĻŋ, āĻ¸āĻāĻ¯ā§āĻ āĻāĻ°āĻžāĻ° āĻā§āĻˇā§āĻāĻž āĻāĻ°ā§āĻāĻŋ, āĻāĻŋāĻ¨ā§āĻ¤ā§ TCP āĻāĻĒāĻ˛āĻŦā§āĻ§ āĻāĻŋāĻ˛ āĻ¨āĻž āĻŦāĻž āĻĒā§āĻ°ā§āĻā§āĻāĻ˛ā§āĻ° āĻŽāĻžāĻāĻāĻžāĻ¨ā§ āĻā§āĻĨāĻžāĻ āĻŦāĻŋāĻā§āĻ¨āĻŋāĻ¤ āĻšāĻ¯āĻŧā§āĻāĻŋāĻ˛āĨ¤ āĻāĻāĻāĻŋ āĻ¨āĻ¤ā§āĻ¨ āĻā§āĻĄāĻŧāĻŋāĻ¤ā§ āĻ¨āĻˇā§āĻ āĻāĻ¨āĻā§āĻ°āĻĒāĻŋ āĻāĻŦāĻ āĻĒā§āĻ°āĻ¸ā§āĻ¸āĻ° āĻ¸āĻŽā§āĻĒāĻĻ āĻ¨āĻˇā§āĻ āĻāĻ°āĻž āĻ˛āĻā§āĻāĻžāĻāĻ¨āĻāĨ¤ āĻ āĻ¤āĻāĻŦ, āĻāĻŽāĻ°āĻž āĻ¤āĻĨāĻžāĻāĻĨāĻŋāĻ¤ āĻā§āĻāĻŋ āĻĒā§āĻ°āĻŦāĻ°ā§āĻ¤āĻ¨ āĻāĻ°āĻŦ - āĻāĻāĻāĻŋ āĻāĻĻā§āĻŽ-āĻ°ā§āĻ¯āĻžāĻ¨ā§āĻĄāĻŽ āĻŽāĻžāĻ¨ āĻ¯āĻž āĻā§āĻˇāĻŖāĻ¸ā§āĻĨāĻžāĻ¯āĻŧā§ āĻĒāĻžāĻŦāĻ˛āĻŋāĻ āĻā§āĻā§āĻ˛āĻŋ āĻĒā§āĻ¨āĻ°āĻžāĻ¯āĻŧ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧ āĻ¸āĻŽā§āĻāĻžāĻŦā§āĻ¯ āĻ°ā§āĻ¯āĻžāĻ¨ā§āĻĄāĻŽ āĻ°āĻŋāĻĒā§āĻ˛ā§ āĻāĻā§āĻ°āĻŽāĻŖ āĻĨā§āĻā§ āĻ°āĻā§āĻˇāĻž āĻāĻ°āĻŦā§āĨ¤ āĻā§āĻāĻŋ āĻāĻŦāĻ āĻā§āĻˇāĻŖāĻ¸ā§āĻĨāĻžāĻ¯āĻŧā§ āĻĒāĻžāĻŦāĻ˛āĻŋāĻ āĻā§-āĻāĻ° āĻŽāĻ§ā§āĻ¯ā§ āĻāĻŦāĻĻā§āĻ§āĻ¤āĻžāĻ° āĻāĻžāĻ°āĻŖā§, āĻŦāĻŋāĻĒāĻ°ā§āĻ¤ āĻĒāĻā§āĻˇā§āĻ° āĻĒāĻžāĻŦāĻ˛āĻŋāĻ āĻā§ āĻ āĻĒā§āĻ°āĻ¯āĻŧā§āĻāĻ¨ā§āĻ¯āĻŧ āĻšāĻŋāĻ¸āĻžāĻŦā§ āĻ¸ā§āĻŦāĻžāĻā§āĻˇāĻ° āĻĨā§āĻā§ āĻ¸āĻ°āĻžāĻ¨ā§ āĻ¯ā§āĻ¤ā§ āĻĒāĻžāĻ°ā§āĨ¤
âââââââ âââââââ âPeerAâ âPeerBâ ââââŦâI āĻā§āĻāĻŋāĻ â âââââââââ ââââââââââââââââââââ ââââââââââââââââ ââââââââââ âââââââââââââââââââââââââââââââââââ â>â âSignPrvA, SignPubA = āĻ˛ā§āĻĄ( )â â â âPrvA, PubA = DHgen() â â â âââââââââââââââââââââââââââââââ âââ âIdB, PubB, āĻā§āĻāĻŋāĻŦāĻŋ , āĻ¸āĻžāĻāĻ¨(āĻ¸āĻžāĻāĻ¨PrvB, (CookieA, CookieB, PubB)), MAC(IdB) â âââââââââââââââââââââââââââââ â â â< âââââââââââââââââââââââââââââââââââ ââââââââââ âââââââââââââââââââââ âSignPrvB, SignPubB = load()â â â PvB()â â â PvB, â âââââââ âââââââââââââââââââââââ â â ââââââââââââ ââââââââ â āĻāĻŋāĻšā§āĻ¨( SignPrvA, (CookieB, CookieA, PubA)), MAC(IdA) â âāĻā§ = DH(PrvA, PubB) â âââââââââââââââââââââââââââââââââ â ââ âââââââââââââââââââââââââââââââââââ âââââââ>â â āĻ¯āĻžāĻāĻžāĻ āĻāĻ°ā§āĻ¨(āĻā§, āĻāĻāĻĄāĻŋāĻŦāĻŋ) â â â â āĻ¯āĻžāĻāĻžāĻ āĻāĻ°ā§āĻ¨(āĻ¸āĻžāĻāĻ¨āĻĒāĻžāĻŦāĻŦāĻŋ, ...)â â â âââââââââââââââââââââââââââââââ â â
āĻ āĻŦāĻļā§āĻˇā§, āĻāĻŽāĻ°āĻž āĻāĻāĻāĻŋ āĻĒā§āĻ¯āĻžāĻ¸āĻŋāĻ āĻĒāĻ°ā§āĻ¯āĻŦā§āĻā§āĻˇāĻā§āĻ° āĻāĻžāĻ āĻĨā§āĻā§ āĻāĻŽāĻžāĻĻā§āĻ° āĻāĻĨā§āĻĒāĻāĻĨāĻ¨ āĻ āĻāĻļā§āĻĻāĻžāĻ°āĻĻā§āĻ° āĻā§āĻĒāĻ¨ā§āĻ¯āĻŧāĻ¤āĻž āĻĒā§āĻ¤ā§ āĻāĻžāĻāĨ¤ āĻāĻāĻŋ āĻāĻ°āĻžāĻ° āĻāĻ¨ā§āĻ¯, āĻ¸āĻŋāĻāĻŽāĻž āĻĒā§āĻ°āĻĨāĻŽā§ āĻā§āĻˇāĻŖāĻ¸ā§āĻĨāĻžāĻ¯āĻŧā§ āĻā§āĻā§āĻ˛āĻŋ āĻŦāĻŋāĻ¨āĻŋāĻŽāĻ¯āĻŧ āĻāĻ°āĻžāĻ° āĻāĻŦāĻ āĻāĻāĻāĻŋ āĻ¸āĻžāĻ§āĻžāĻ°āĻŖ āĻā§ āĻ¤ā§āĻ°āĻŋ āĻāĻ°āĻžāĻ° āĻĒā§āĻ°āĻ¸ā§āĻ¤āĻžāĻŦ āĻĻā§āĻ¯āĻŧ āĻ¯āĻžāĻ° āĻāĻĒāĻ° āĻĒā§āĻ°āĻŽāĻžāĻŖā§āĻāĻ°āĻŖ āĻāĻŦāĻ āĻ¸āĻ¨āĻžāĻā§āĻ¤āĻāĻ°āĻŖ āĻŦāĻžāĻ°ā§āĻ¤āĻžāĻā§āĻ˛āĻŋ āĻāĻ¨āĻā§āĻ°āĻŋāĻĒā§āĻ āĻāĻ°āĻž āĻ¯āĻžāĻ¯āĻŧāĨ¤ SIGMA āĻĻā§āĻāĻŋ āĻŦāĻŋāĻāĻ˛ā§āĻĒ āĻŦāĻ°ā§āĻŖāĻ¨āĻž āĻāĻ°ā§:
- SIGMA-I - āĻ¸āĻā§āĻ°āĻŋāĻ¯āĻŧ āĻāĻā§āĻ°āĻŽāĻŖ āĻĨā§āĻā§ āĻ¸ā§āĻāĻ¨āĻžāĻāĻžāĻ°ā§āĻā§ āĻ°āĻā§āĻˇāĻž āĻāĻ°ā§, āĻ¨āĻŋāĻˇā§āĻā§āĻ°āĻŋāĻ¯āĻŧ āĻāĻā§āĻ°āĻŽāĻŖ āĻĨā§āĻā§ āĻĒā§āĻ°āĻ¤āĻŋāĻā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻāĻžāĻ°ā§āĻā§ āĻ°āĻā§āĻˇāĻž āĻāĻ°ā§: āĻ¸ā§āĻāĻ¨āĻžāĻāĻžāĻ°ā§ āĻāĻ¤ā§āĻ¤āĻ°āĻĻāĻžāĻ¤āĻžāĻā§ āĻĒā§āĻ°āĻŽāĻžāĻŖā§āĻāĻ°āĻŖ āĻāĻ°ā§ āĻāĻŦāĻ āĻ¯āĻĻāĻŋ āĻāĻŋāĻā§ āĻŽā§āĻ˛ā§ āĻ¨āĻž, āĻ¤āĻŦā§ āĻāĻāĻŋ āĻ¤āĻžāĻ° āĻ¸āĻ¨āĻžāĻā§āĻ¤āĻāĻ°āĻŖ āĻĻā§āĻ¯āĻŧ āĻ¨āĻžāĨ¤ āĻ¤āĻžāĻ° āĻ¸āĻžāĻĨā§ āĻāĻāĻāĻŋ āĻ¸āĻā§āĻ°āĻŋāĻ¯āĻŧ āĻĒā§āĻ°ā§āĻā§āĻāĻ˛ āĻļā§āĻ°ā§ āĻšāĻ˛ā§ āĻāĻ¸āĻžāĻŽā§ āĻ¤āĻžāĻ° āĻĒāĻ°āĻŋāĻāĻ¯āĻŧ āĻĻā§āĻ¯āĻŧāĨ¤ āĻ¨āĻŋāĻˇā§āĻā§āĻ°āĻŋāĻ¯āĻŧ āĻĒāĻ°ā§āĻ¯āĻŦā§āĻā§āĻˇāĻ āĻāĻŋāĻā§āĻ āĻļā§āĻā§ āĻ¨āĻž;
SIGMA-R - āĻ¸āĻā§āĻ°āĻŋāĻ¯āĻŧ āĻāĻā§āĻ°āĻŽāĻŖ āĻĨā§āĻā§ āĻĒā§āĻ°āĻ¤āĻŋāĻā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻļā§āĻ˛āĻā§ āĻ°āĻā§āĻˇāĻž āĻāĻ°ā§, āĻĒā§āĻ¯āĻžāĻ¸āĻŋāĻ āĻāĻā§āĻ°āĻŽāĻŖ āĻĨā§āĻā§ āĻ¸ā§āĻāĻ¨āĻžāĻāĻžāĻ°ā§āĻā§āĨ¤ āĻ¸āĻŦāĻāĻŋāĻā§ āĻ āĻŋāĻ āĻŦāĻŋāĻĒāĻ°ā§āĻ¤, āĻāĻŋāĻ¨ā§āĻ¤ā§ āĻāĻ āĻĒā§āĻ°ā§āĻā§āĻāĻ˛ā§ āĻāĻžāĻ°āĻāĻŋ āĻšā§āĻ¯āĻžāĻ¨ā§āĻĄāĻļā§āĻ āĻŦāĻžāĻ°ā§āĻ¤āĻž āĻāĻ¤āĻŋāĻŽāĻ§ā§āĻ¯ā§āĻ āĻĒā§āĻ°ā§āĻ°āĻŖ āĻāĻ°āĻž āĻšāĻ¯āĻŧā§āĻā§āĨ¤āĻāĻŽāĻ°āĻž āĻ¸āĻŋāĻāĻŽāĻž-āĻāĻ āĻŦā§āĻā§ āĻ¨āĻŋāĻ āĻāĻžāĻ°āĻŖ āĻāĻāĻŋ āĻā§āĻ˛āĻžāĻ¯āĻŧā§āĻ¨ā§āĻ-āĻ¸āĻžāĻ°ā§āĻāĻžāĻ° āĻĒāĻ°āĻŋāĻāĻŋāĻ¤ āĻāĻŋāĻ¨āĻŋāĻ¸āĻā§āĻ˛āĻŋāĻ° āĻĨā§āĻā§ āĻāĻŽāĻ°āĻž āĻ¯āĻž āĻāĻļāĻž āĻāĻ°āĻŋ āĻ¤āĻžāĻ° āĻ āĻ¨ā§āĻ°ā§āĻĒ: āĻā§āĻ˛āĻžāĻ¯āĻŧā§āĻ¨ā§āĻ āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻĒā§āĻ°āĻŽāĻžāĻŖā§āĻā§āĻ¤ āĻ¸āĻžāĻ°ā§āĻāĻžāĻ° āĻĻā§āĻŦāĻžāĻ°āĻž āĻ¸ā§āĻŦā§āĻā§āĻ¤ āĻšāĻ¯āĻŧ, āĻāĻŦāĻ āĻ¸āĻŦāĻžāĻ āĻāĻ¤āĻŋāĻŽāĻ§ā§āĻ¯ā§ āĻ¸āĻžāĻ°ā§āĻāĻžāĻ°āĻāĻŋ āĻāĻžāĻ¨ā§ā§ˇ āĻāĻāĻžāĻĄāĻŧāĻžāĻ āĻāĻŽ āĻšā§āĻ¯āĻžāĻ¨ā§āĻĄāĻļā§āĻ āĻŦāĻžāĻ°ā§āĻ¤āĻžāĻ° āĻāĻžāĻ°āĻŖā§ āĻāĻāĻŋ āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨ āĻāĻ°āĻž āĻ¸āĻšāĻāĨ¤ āĻĒā§āĻ°ā§āĻā§āĻāĻ˛ā§ āĻāĻŽāĻ°āĻž āĻ¯āĻž āĻ¯ā§āĻ āĻāĻ°āĻŋ āĻ¤āĻž āĻšāĻ˛ āĻŦāĻžāĻ°ā§āĻ¤āĻžāĻ° āĻ āĻāĻļ āĻāĻ¨āĻā§āĻ°āĻŋāĻĒā§āĻ āĻāĻ°āĻž āĻāĻŦāĻ āĻļāĻ¨āĻžāĻā§āĻ¤āĻāĻžāĻ°ā§ A āĻā§ āĻļā§āĻˇ āĻŦāĻžāĻ°ā§āĻ¤āĻžāĻ° āĻāĻ¨āĻā§āĻ°āĻŋāĻĒā§āĻ āĻāĻ°āĻž āĻ āĻāĻļā§ āĻ¸ā§āĻĨāĻžāĻ¨āĻžāĻ¨ā§āĻ¤āĻ° āĻāĻ°āĻž:
PubA, CookieA â ââââââââââââââââââââââââââââââââââââââââââââââââââ âââââââââââ âââââ ââââââââââ ââââââââââââââââââââ âââââââââââ âââââ ââââââ>â âSignPrvA , SignPubA = load()â â â âPrvA, PubA = DHgen() â â â DHgen() â â ââââââââââ âââââââââ âââââ â â â â â â â â â â â â â â â â â âââââââââââââââ ââââââââ â<ââââââââââââââ ââââââââââ âââââ ââââââââââ âSignP rvB, SignPubB = load()â â â â PrvB, PubB â â â â PubB â â DHgen() ââââââââ âââââââââââââââââ â â âââââââââââââââââââ âââ â Enc((IdA, āĻāĻŋāĻšā§āĻ¨( SignPrvA, (CookieB, CookieA, PubA)), MAC(IdA))) â âāĻā§ = DH(PrvA, PubB) â âââââââââââââââââââââââââââââââââ â ââââââââââââââââââ âââââââââââââââââ âââââââââââ ââââââ>â âāĻ¯āĻžāĻāĻžāĻ āĻāĻ°ā§āĻ¨(āĻā§, āĻāĻāĻĄāĻŋāĻŦāĻŋ) â â â âāĻ¯āĻžāĻāĻžāĻ āĻāĻ°ā§āĻ¨( āĻ¸āĻžāĻāĻ¨āĻĒāĻžāĻŦāĻŦāĻŋ, ...)â â â ââââââââââââââââââââââ âââââ âââ â â
- GOST R āĻ¸ā§āĻŦāĻžāĻā§āĻˇāĻ°ā§āĻ° āĻāĻ¨ā§āĻ¯ āĻŦā§āĻ¯āĻŦāĻšā§āĻ¤ āĻšāĻ¯āĻŧ
34.10-2012 256-āĻŦāĻŋāĻ āĻā§ āĻ¸āĻš āĻ ā§āĻ¯āĻžāĻ˛āĻāĻ°āĻŋāĻĻāĻŽāĨ¤ - āĻ¸āĻ°ā§āĻŦāĻāĻ¨ā§āĻ¨ āĻā§ āĻ¤ā§āĻ°āĻŋ āĻāĻ°āĻ¤ā§, 34.10-2012 VKO āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻž āĻšāĻ¯āĻŧāĨ¤
- CMAC āĻŽā§āĻ¯āĻžāĻ āĻšāĻŋāĻ¸āĻžāĻŦā§ āĻŦā§āĻ¯āĻŦāĻšā§āĻ¤ āĻšāĻ¯āĻŧāĨ¤ āĻĒā§āĻ°āĻ¯ā§āĻā§āĻ¤āĻŋāĻāĻ¤āĻāĻžāĻŦā§, āĻāĻāĻŋ āĻāĻāĻāĻŋ āĻŦā§āĻ˛āĻ āĻ¸āĻžāĻāĻĢāĻžāĻ°ā§āĻ° āĻ
āĻĒāĻžāĻ°ā§āĻļāĻ¨ā§āĻ° āĻāĻāĻāĻŋ āĻŦāĻŋāĻļā§āĻˇ āĻŽā§āĻĄ, āĻ¯āĻž GOST R 34.13-2015 āĻ āĻŦāĻ°ā§āĻŖāĻŋāĻ¤ āĻšāĻ¯āĻŧā§āĻā§āĨ¤ āĻāĻ āĻŽā§āĻĄā§āĻ° āĻāĻ¨ā§āĻ¯ āĻāĻāĻāĻŋ āĻāĻ¨āĻā§āĻ°āĻŋāĻĒāĻļāĻ¨ āĻĢāĻžāĻāĻļāĻ¨ āĻšāĻŋāĻ¸āĻžāĻŦā§ -
āĻĢāĻĄāĻŧāĻŋāĻ (34.12-2015). - āĻ¤āĻžāĻ° āĻĒāĻžāĻŦāĻ˛āĻŋāĻ āĻā§ āĻāĻ° āĻšā§āĻ¯āĻžāĻļ āĻāĻĨā§āĻĒāĻāĻĨāĻ¨ā§āĻ° āĻļāĻ¨āĻžāĻā§āĻ¤āĻāĻžāĻ°ā§ āĻšāĻŋāĻ¸āĻžāĻŦā§ āĻŦā§āĻ¯āĻŦāĻšā§āĻ¤ āĻšāĻ¯āĻŧāĨ¤ āĻāĻāĻāĻŋ āĻšā§āĻ¯āĻžāĻļ āĻšāĻŋāĻ¸āĻžāĻŦā§ āĻŦā§āĻ¯āĻŦāĻšā§āĻ¤
Stribog-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)
āĻšā§āĻ¯āĻžāĻ¨ā§āĻĄāĻļā§āĻāĻāĻŋāĻŦāĻŋāĻāĻ¸ āĻ¸ā§āĻŦāĻžāĻā§āĻˇāĻ°āĻŋāĻ¤ āĻšāĻŦā§ āĻāĻŋ. āĻšā§āĻ¯āĻžāĻ¨ā§āĻĄāĻļā§āĻāĻāĻŋāĻŦāĻŋāĻ - āĻā§ āĻāĻ¨āĻā§āĻ°āĻŋāĻĒā§āĻ āĻāĻ°āĻž āĻšāĻŦā§āĨ¤ āĻāĻŽāĻŋ 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() āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°ā§ āĻŦā§āĻ¯āĻā§āĻ¤āĻŋāĻāĻ¤ āĻā§ āĻĨā§āĻā§ āĻ¸āĻ°ā§āĻŦāĻāĻ¨ā§āĻ¨ āĻā§ āĻ¨āĻŋāĻ°ā§āĻ§āĻžāĻ°āĻŖ āĻāĻ°āĻž āĻšāĻ¯āĻŧāĨ¤ āĻĒāĻžāĻŦāĻ˛āĻŋāĻ āĻā§ 34.10 āĻšāĻ˛ āĻĻā§āĻāĻŋ āĻŦāĻĄāĻŧ āĻ¸āĻāĻā§āĻ¯āĻž āĻ¯ā§āĻā§āĻ˛āĻŋāĻā§ gost3410.pub_marshal() āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°ā§ āĻ¸ā§āĻā§āĻ°ā§āĻ āĻāĻŦāĻ āĻā§āĻ°āĻžāĻ¨ā§āĻ¸āĻŽāĻŋāĻļāĻ¨ā§āĻ° āĻ¸ā§āĻŦāĻŋāĻ§āĻžāĻ° āĻāĻ¨ā§āĻ¯ āĻāĻāĻāĻŋ āĻŦāĻžāĻāĻ āĻ¸āĻŋāĻā§āĻ¯āĻŧā§āĻ¨ā§āĻ¸ā§ āĻ°ā§āĻĒāĻžāĻ¨ā§āĻ¤āĻ° āĻāĻ°āĻ¤ā§ āĻšāĻŦā§āĨ¤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()
- āĻāĻŽāĻ°āĻž āĻāĻāĻāĻŋ āĻĒā§āĻ°āĻ¤āĻŋāĻā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻ° āĻāĻ¨ā§āĻ¯ āĻ āĻĒā§āĻā§āĻˇāĻž āĻāĻ°āĻŋ āĻāĻŦāĻ āĻāĻ¨āĻāĻžāĻŽāĻŋāĻ āĻŽā§āĻ¸ā§āĻ āĻĄāĻŋāĻā§āĻĄ āĻāĻ°āĻŋ;
- āĻ¨āĻŋāĻļā§āĻāĻŋāĻ¤ āĻāĻ°ā§āĻ¨ āĻ¯ā§ āĻāĻĒāĻ¨āĻŋ āĻšā§āĻ¯āĻžāĻ¨ā§āĻĄāĻļā§āĻ 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-āĻŦāĻŋāĻ āĻ¸āĻŋāĻāĻĄā§-āĻ°ā§āĻ¯āĻžāĻ¨ā§āĻĄāĻŽ āĻŦāĻžāĻāĻ āĻ¸āĻŋāĻā§āĻ¯āĻŧā§āĻ¨ā§āĻ¸āĨ¤ āĻ āĻ¤āĻāĻŦ, āĻāĻāĻŋ āĻ āĻŦāĻŋāĻ˛āĻŽā§āĻŦā§ HKDF āĻĢāĻžāĻāĻļāĻ¨ā§ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻž āĻ¯ā§āĻ¤ā§ āĻĒāĻžāĻ°ā§āĨ¤ āĻ¯ā§āĻšā§āĻ¤ā§ 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)āĨ¤āĻāĻ¨āĻā§āĻ°āĻŋāĻĒā§āĻ, KUZNECHIK_BLOCKSIZE, āĻ¸āĻžāĻāĻĢāĻžāĻ°āĻā§āĻā§āĻ¸āĻ)āĨ¤ āĻāĻŖāĻ¨āĻž āĻāĻ°āĻž āĻāĻŦāĻ āĻĒā§āĻ°āĻžāĻĒā§āĻ¤ MAC āĻ¤ā§āĻ˛āĻ¨āĻž āĻāĻ°āĻ¤ā§, āĻāĻĒāĻ¨āĻŋ āĻŦāĻžāĻāĻ āĻ¸ā§āĻā§āĻ°āĻŋāĻāĻā§āĻ˛āĻŋāĻ° āĻ¸ā§āĻŦāĻžāĻāĻžāĻŦāĻŋāĻ āĻ¤ā§āĻ˛āĻ¨āĻž (==) āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°āĻŦā§āĻ¨ āĻ¨āĻž, āĻ¯ā§āĻšā§āĻ¤ā§ āĻāĻ āĻ āĻĒāĻžāĻ°ā§āĻļāĻ¨āĻāĻŋ āĻ¤ā§āĻ˛āĻ¨āĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧ āĻĢāĻžāĻāĻ¸ āĻāĻ°ā§, āĻ¯āĻž āĻ¸āĻžāĻ§āĻžāĻ°āĻŖ āĻā§āĻˇā§āĻ¤ā§āĻ°ā§, āĻŽāĻžāĻ°āĻžāĻ¤ā§āĻŽāĻ āĻĻā§āĻ°ā§āĻŦāĻ˛āĻ¤āĻžāĻ° āĻāĻžāĻ°āĻŖ āĻšāĻ¤ā§ āĻĒāĻžāĻ°ā§
āĻĒāĻļā§ āĻāĻŋāĻāĻ˛āĻāĻ¸-āĻāĻ° āĻāĻĒāĻ° āĻāĻā§āĻ°āĻŽāĻŖāĨ¤ āĻāĻ° āĻāĻ¨ā§āĻ¯ āĻĒāĻžāĻāĻĨāĻ¨ā§āĻ° āĻāĻāĻāĻŋ āĻŦāĻŋāĻļā§āĻˇ āĻĢāĻžāĻāĻļāĻ¨ āĻāĻā§, hmac.compare_digestāĨ¤āĻŦā§āĻ˛āĻ āĻ¸āĻžāĻāĻĢāĻžāĻ° āĻĢāĻžāĻāĻļāĻ¨ āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻĄā§āĻāĻžāĻ° āĻāĻāĻāĻŋ āĻŦā§āĻ˛āĻ āĻāĻ¨āĻā§āĻ°āĻŋāĻĒā§āĻ āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°ā§āĨ¤ āĻāĻāĻāĻŋ āĻŦā§āĻšāĻ¤ā§āĻ¤āĻ° āĻ¸āĻāĻā§āĻ¯āĻžāĻ° āĻāĻ¨ā§āĻ¯, āĻāĻŦāĻ āĻāĻŽāĻ¨āĻāĻŋ āĻĻā§āĻ°ā§āĻā§āĻ¯ā§āĻ° āĻāĻāĻžāĻ§āĻŋāĻ āĻ¨āĻ¯āĻŧ, āĻāĻ¨āĻā§āĻ°āĻŋāĻĒāĻļāĻ¨ āĻŽā§āĻĄ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻž āĻĒā§āĻ°āĻ¯āĻŧā§āĻāĻ¨āĨ¤ 34.13-2015 āĻ¨āĻŋāĻŽā§āĻ¨āĻ˛āĻŋāĻāĻŋāĻ¤ āĻŦāĻ°ā§āĻŖāĻ¨āĻž āĻāĻ°ā§: ECB, CTR, OFB, CBC, CFBāĨ¤ āĻĒā§āĻ°āĻ¤ā§āĻ¯ā§āĻā§āĻ°āĻ āĻāĻŦā§āĻĻāĻ¨ āĻāĻŦāĻ āĻŦā§āĻļāĻŋāĻˇā§āĻā§āĻ¯ā§āĻ° āĻ¨āĻŋāĻāĻ¸ā§āĻŦ āĻā§āĻ°āĻšāĻŖāĻ¯ā§āĻā§āĻ¯ āĻā§āĻˇā§āĻ¤ā§āĻ° āĻ°āĻ¯āĻŧā§āĻā§āĨ¤ āĻĻā§āĻ°ā§āĻāĻžāĻā§āĻ¯āĻŦāĻļāĻ¤, āĻāĻŽāĻ°āĻž āĻāĻāĻ¨āĻ āĻŽāĻžāĻ¨āĻ¸āĻŽā§āĻŽāĻ¤ āĻ¨āĻž
āĻĒā§āĻ°āĻŽāĻžāĻŖā§āĻā§āĻ¤ āĻāĻ¨āĻā§āĻ°āĻŋāĻĒāĻļāĻ¨ āĻŽā§āĻĄ (āĻ¯ā§āĻŽāĻ¨ CCM, OCB, GCM āĻāĻŦāĻ āĻāĻ° āĻŽāĻ¤ā§) - āĻāĻŽāĻ°āĻž āĻ āĻ¨ā§āĻ¤āĻ¤ āĻ¨āĻŋāĻā§āĻĻā§āĻ° MAC āĻ¯ā§āĻ āĻāĻ°āĻ¤ā§ āĻŦāĻžāĻ§ā§āĻ¯ āĻšāĻāĨ¤ āĻāĻŽāĻŋ āĻĒāĻāĻ¨ā§āĻĻ āĻāĻ°ā§āĻāĻŋāĻĒāĻžāĻ˛ā§āĻāĻž āĻŽā§āĻĄ (CTR): āĻāĻāĻŋāĻā§ āĻŦā§āĻ˛āĻā§āĻ° āĻāĻāĻžāĻ°ā§ āĻĒā§āĻ¯āĻžāĻĄāĻŋāĻāĻ¯āĻŧā§āĻ° āĻĒā§āĻ°āĻ¯āĻŧā§āĻāĻ¨ āĻ¨ā§āĻ, āĻ¸āĻŽāĻžāĻ¨ā§āĻ¤āĻ°āĻžāĻ˛ āĻāĻ°āĻž āĻ¯ā§āĻ¤ā§ āĻĒāĻžāĻ°ā§, āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻāĻ¨āĻā§āĻ°āĻŋāĻĒāĻļāĻ¨ āĻĢāĻžāĻāĻļāĻ¨ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°ā§, āĻĒā§āĻ°āĻā§āĻ° āĻ¸āĻāĻā§āĻ¯āĻ āĻŦāĻžāĻ°ā§āĻ¤āĻž āĻāĻ¨āĻā§āĻ°āĻŋāĻĒā§āĻ āĻāĻ°āĻ¤ā§ āĻ¨āĻŋāĻ°āĻžāĻĒāĻĻā§ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻž āĻ¯ā§āĻ¤ā§ āĻĒāĻžāĻ°ā§ (CBC āĻāĻ° āĻŦāĻŋāĻĒāĻ°ā§āĻ¤ā§, āĻ¯ā§āĻāĻžāĻ¨ā§ āĻ¤ā§āĻ˛āĻ¨āĻžāĻŽā§āĻ˛āĻāĻāĻžāĻŦā§ āĻĻā§āĻ°ā§āĻ¤ āĻ¸āĻāĻāĻ°ā§āĻˇ āĻšāĻ¯āĻŧ)āĨ¤.mac(), .ctr() āĻ āĻ¨ā§āĻ°ā§āĻĒ āĻāĻ¨āĻĒā§āĻ āĻ¨ā§āĻ¯āĻŧ: ciphertext = gost3413.ctr(GOST3412Kuznechik(key).encrypt, KUZNECHIK_BLOCKSIZE, āĻĒā§āĻ˛ā§āĻāĻ¨āĻā§āĻā§āĻ¸āĻ, iv)āĨ¤ āĻāĻāĻŋ āĻāĻāĻāĻŋ āĻĒā§āĻ°āĻžāĻ°āĻŽā§āĻāĻŋāĻ āĻā§āĻā§āĻāĻ° āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻ āĻāĻ°āĻ¤ā§ āĻšāĻŦā§ āĻ¯āĻž āĻāĻ¨āĻā§āĻ°āĻŋāĻĒāĻļāĻ¨ āĻŦā§āĻ˛āĻā§āĻ° āĻ āĻŋāĻ āĻ āĻ°ā§āĻ§ā§āĻ āĻĻā§āĻ°ā§āĻā§āĻ¯āĨ¤ āĻ¯āĻĻāĻŋ āĻāĻŽāĻžāĻĻā§āĻ° āĻāĻ¨āĻā§āĻ°āĻŋāĻĒāĻļāĻ¨ āĻā§ āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻāĻāĻāĻŋ āĻŦāĻžāĻ°ā§āĻ¤āĻž āĻāĻ¨āĻā§āĻ°āĻŋāĻĒā§āĻ āĻāĻ°āĻžāĻ° āĻāĻ¨ā§āĻ¯ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻž āĻšāĻ¯āĻŧ (āĻ¯āĻĻāĻŋāĻ āĻŦā§āĻļ āĻāĻ¯āĻŧā§āĻāĻāĻŋ āĻŦā§āĻ˛āĻ āĻĨā§āĻā§), āĻ¤āĻžāĻšāĻ˛ā§ āĻāĻāĻŋ āĻāĻāĻāĻŋ āĻļā§āĻ¨ā§āĻ¯ āĻĒā§āĻ°āĻžāĻ°āĻŽā§āĻāĻŋāĻ āĻā§āĻā§āĻāĻ° āĻ¸ā§āĻ āĻāĻ°āĻž āĻ¨āĻŋāĻ°āĻžāĻĒāĻĻāĨ¤ āĻšā§āĻ¯āĻžāĻ¨ā§āĻĄāĻļā§āĻ āĻŦāĻžāĻ°ā§āĻ¤āĻž āĻāĻ¨āĻā§āĻ°āĻŋāĻĒā§āĻ āĻāĻ°āĻ¤ā§, āĻāĻŽāĻ°āĻž āĻĒā§āĻ°āĻ¤āĻŋāĻŦāĻžāĻ° āĻāĻāĻāĻŋ āĻĒā§āĻĨāĻ āĻā§ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻŋāĨ¤
āĻ¸ā§āĻŦāĻžāĻā§āĻˇāĻ° āĻ¯āĻžāĻāĻžāĻ āĻāĻ°āĻž gost3410.verify() āĻ¤ā§āĻā§āĻ: āĻāĻŽāĻ°āĻž āĻ¯ā§ āĻāĻĒāĻŦā§āĻ¤ā§āĻ¤āĻžāĻāĻžāĻ° āĻŦāĻā§āĻ°āĻ°ā§āĻāĻžāĻ° āĻŽāĻ§ā§āĻ¯ā§ āĻāĻžāĻ āĻāĻ°āĻāĻŋ (āĻāĻŽāĻ°āĻž āĻāĻāĻŋ āĻā§āĻŦāĻ˛ āĻāĻŽāĻžāĻĻā§āĻ° GOSTIM āĻĒā§āĻ°ā§āĻā§āĻāĻ˛ā§ āĻ°ā§āĻāĻ°ā§āĻĄ āĻāĻ°āĻŋ), āĻ¸ā§āĻŦāĻžāĻā§āĻˇāĻ°āĻāĻžāĻ°ā§āĻ° āĻ¸āĻ°ā§āĻŦāĻāĻ¨ā§āĻ¨ āĻā§ (āĻā§āĻ˛ā§ āĻ¯āĻžāĻŦā§āĻ¨ āĻ¨āĻž āĻ¯ā§ āĻāĻāĻŋ āĻĻā§āĻāĻŋāĻ° āĻāĻāĻāĻŋ āĻšāĻāĻ¯āĻŧāĻž āĻāĻāĻŋāĻ¤āĨ¤ āĻŦāĻĄāĻŧ āĻ¸āĻāĻā§āĻ¯āĻž, āĻāĻŦāĻ āĻāĻāĻāĻŋ āĻŦāĻžāĻāĻ āĻ¸ā§āĻā§āĻ°āĻŋāĻ āĻ¨āĻ¯āĻŧ), 34.11/2012/XNUMX āĻšā§āĻ¯āĻžāĻļ āĻāĻŦāĻ āĻ¸ā§āĻŦāĻžāĻā§āĻˇāĻ° āĻ¨āĻŋāĻā§āĻāĨ¤
āĻāĻ°āĻĒāĻ°ā§, āĻāĻ¨āĻŋāĻļāĻŋāĻ¯āĻŧā§āĻāĻžāĻ°ā§ āĻāĻŽāĻ°āĻž āĻšā§āĻ¯āĻžāĻ¨ā§āĻĄāĻļā§āĻ 2-āĻ āĻšā§āĻ¯āĻžāĻ¨ā§āĻĄāĻļā§āĻ āĻŦāĻžāĻ°ā§āĻ¤āĻž āĻĒā§āĻ°āĻ¸ā§āĻ¤ā§āĻ¤ āĻāĻ°āĻŋ āĻāĻŦāĻ āĻĒāĻžāĻ āĻžāĻ, āĻ¯āĻžāĻāĻžāĻāĻ¯āĻŧā§āĻ° āĻ¸āĻŽāĻ¯āĻŧ āĻāĻŽāĻ°āĻž āĻ¯ā§āĻāĻžāĻŦā§ āĻāĻ°ā§āĻāĻŋ āĻ āĻŋāĻ āĻāĻāĻ āĻā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻ¸āĻŽā§āĻĒāĻžāĻĻāĻ¨ āĻāĻ°ā§, āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻĒā§āĻ°āĻ¤āĻŋāĻ¸āĻŽāĻāĻžāĻŦā§: āĻā§āĻ āĻāĻ°āĻžāĻ° āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤ā§ āĻāĻŽāĻžāĻĻā§āĻ° āĻā§āĻā§āĻ˛āĻŋāĻ¤ā§ āĻ¸ā§āĻŦāĻžāĻā§āĻˇāĻ° āĻāĻ°āĻž āĻāĻ¤ā§āĻ¯āĻžāĻĻāĻŋ...
456 # Prepare and send Handshake 2 message {{{ 457 tbs = HandshakeTBS(( 458 ("cookieTheir", cookie_their), 459 ("cookieOur", cookie_our), 460 ("pubKeyOur", pub_our_raw), 461 )) 462 signature = gost3410.sign( 463 CURVE, 464 KEY_OUR_SIGN_PRV, 465 GOST34112012256(tbs.encode()).digest(), 466 ) 467 key_handshake2_mac_identity = kdf.expand(b"handshake2-mac-identity") 468 mac_tag = mac( 469 GOST3412Kuznechik(key_handshake2_mac_identity).encrypt, 470 KUZNECHIK_BLOCKSIZE, 471 bytes(KEY_OUR_SIGN_PUB_HASH), 472 ) 473 tbe = HandshakeTBE(( 474 ("identity", KEY_OUR_SIGN_PUB_HASH), 475 ("signature", OctetString(signature)), 476 ("identityMac", MAC(mac_tag)), 477 )) 478 tbe_raw = tbe.encode() 479 key_handshake2_enc = kdf.expand(b"handshake2-enc") 480 key_handshake2_mac = kdf.expand(b"handshake2-mac") 481 ciphertext = ctr( 482 GOST3412Kuznechik(key_handshake2_enc).encrypt, 483 KUZNECHIK_BLOCKSIZE, 484 tbe_raw, 485 8 * b"x00", 486 ) 487 mac_tag = mac( 488 GOST3412Kuznechik(key_handshake2_mac).encrypt, 489 KUZNECHIK_BLOCKSIZE, 490 ciphertext, 491 ) 492 writer.write(Msg(("handshake2", MsgHandshake2(( 493 ("ciphertext", OctetString(ciphertext)), 494 ("ciphertextMac", MAC(mac_tag)), 495 )))).encode()) 496 # }}} 497 await writer.drain() 498 logging.info("%s: session established: %s", _id, peer_name)
āĻ¯āĻāĻ¨ āĻ¸ā§āĻļāĻ¨āĻāĻŋ āĻĒā§āĻ°āĻ¤āĻŋāĻˇā§āĻ āĻŋāĻ¤ āĻšāĻ¯āĻŧ, āĻā§āĻ°āĻžāĻ¨ā§āĻ¸āĻĒā§āĻ°ā§āĻ āĻā§ āĻ¤ā§āĻ°āĻŋ āĻāĻ°āĻž āĻšāĻ¯āĻŧ (āĻāĻ¨āĻā§āĻ°āĻŋāĻĒāĻļāĻ¨ā§āĻ° āĻāĻ¨ā§āĻ¯ āĻāĻāĻāĻŋ āĻĒā§āĻĨāĻ āĻā§, āĻĒā§āĻ°āĻŽāĻžāĻŖā§āĻāĻ°āĻŖā§āĻ° āĻāĻ¨ā§āĻ¯, āĻĒā§āĻ°āĻ¤āĻŋāĻāĻŋ āĻĒāĻā§āĻˇā§āĻ° āĻāĻ¨ā§āĻ¯), āĻāĻŦāĻ āĻā§āĻ°āĻžāĻ¸āĻļāĻĒāĻžāĻ°āĻā§ āĻĄāĻŋāĻā§āĻ°āĻŋāĻĒā§āĻ āĻāĻŦāĻ MAC āĻā§āĻ āĻāĻ°āĻžāĻ° āĻāĻ¨ā§āĻ¯ āĻāĻ°āĻŽā§āĻ āĻāĻ°āĻž āĻšāĻ¯āĻŧ:
499 # Run text message sender, initialize transport decoder {{{ 500 key_initiator_enc = kdf.expand(b"transport-initiator-enc") 501 key_initiator_mac = kdf.expand(b"transport-initiator-mac") 502 key_responder_enc = kdf.expand(b"transport-responder-enc") 503 key_responder_mac = kdf.expand(b"transport-responder-mac") ... 509 asyncio.ensure_future(msg_sender( 510 peer_name, 511 key_initiator_enc, 512 key_initiator_mac, 513 writer, 514 )) 515 encrypter = GOST3412Kuznechik(key_responder_enc).encrypt 516 macer = GOST3412Kuznechik(key_responder_mac).encrypt 517 # }}} 519 nonce_expected = 0 520 # Wait for test messages {{{ 521 while True: 522 data = await reader.read(MaxMsgLen) ... 530 msg, tail = Msg().decode(buf) ... 537 try: 538 await msg_receiver( 539 msg.value, 540 nonce_expected, 541 macer, 542 encrypter, 543 peer_name, 544 ) 545 except ValueError as err: 546 logging.warning("%s: %s", err) 547 break 548 nonce_expected += 1 549 # }}}
msg_sender 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 ,āĻĒāĻžāĻāĻĄāĻžāĻ°āĻžāĻ¸āĻ¨ ,āĻāĻ¨āĻāĻ¨āĻ¸āĻŋāĻĒāĻŋ ,GoVPN , GOSTIM āĻ¸āĻŽā§āĻĒā§āĻ°ā§āĻŖāĻ°ā§āĻĒā§āĻŦāĻŋāĻ¨āĻžāĻŽā§āĻ˛ā§āĻ¯ā§āĻ° āĻ¸āĻĢāĻāĻāĻ¯āĻŧā§āĻ¯āĻžāĻ° āĻļāĻ°ā§āĻ¤āĻžāĻŦāĻ˛ā§āĻ° āĻ āĻ§ā§āĻ¨ā§ āĻŦāĻŋāĻ¤āĻ°āĻŖ āĻāĻ°āĻž āĻšāĻ¯āĻŧāĻāĻŋāĻĒāĻŋāĻāĻ˛āĻāĻŋ 3 + .āĻ¸ā§āĻ°ā§āĻā§āĻ āĻŽāĻžāĻ¤āĻāĻŋāĻ ,āĻ¸āĻžāĻāĻĢāĻžāĻ°āĻĒāĻžāĻā§āĻ , āĻ¸āĻĻāĻ¸ā§āĻ¯āĻāĻ¸āĻĒāĻŋāĻ āĻĢāĻžāĻāĻ¨ā§āĻĄā§āĻļāĻ¨ , āĻĒāĻžāĻāĻĨāĻ¨/āĻā§-āĻĄā§āĻā§āĻ˛āĻĒāĻžāĻ°, āĻĒā§āĻ°āĻ§āĻžāĻ¨ āĻŦāĻŋāĻļā§āĻˇāĻā§āĻāĻĢā§āĻĄāĻžāĻ°ā§āĻ˛ āĻ¸ā§āĻā§āĻ āĻāĻāĻ¨āĻŋāĻāĻžāĻ°āĻŋ āĻāĻ¨ā§āĻāĻžāĻ°āĻĒā§āĻ°āĻžāĻāĻ "āĻāĻ¸āĻāĻŋāĻ¸āĻŋ "āĻāĻāĻ˛āĻžāĻ¸" . - GOST R āĻ¸ā§āĻŦāĻžāĻā§āĻˇāĻ°ā§āĻ° āĻāĻ¨ā§āĻ¯ āĻŦā§āĻ¯āĻŦāĻšā§āĻ¤ āĻšāĻ¯āĻŧ
āĻāĻ¤ā§āĻ¸: www.habr.com