GOSTIM: GOST āĻ•ā§āĻ°āĻŋāĻĒā§āĻŸā§‹āĻ—ā§āĻ°āĻžāĻĢāĻŋ āĻ¸āĻš āĻāĻ• āĻ¸āĻ¨ā§āĻ§ā§āĻ¯āĻžāĻ¯āĻŧ P2P F2F E2EE IM

āĻāĻ•āĻœāĻ¨ āĻĄā§‡āĻ­ā§‡āĻ˛āĻĒāĻžāĻ° āĻšāĻšā§āĻ›ā§‡ āĻĒāĻžāĻ‡āĻ—ā§‹āĻ¸ā§āĻŸ āĻ˛āĻžāĻ‡āĻŦā§āĻ°ā§‡āĻ°āĻŋ (āĻŦāĻŋāĻļā§āĻĻā§āĻ§ āĻĒāĻžāĻ‡āĻĨāĻ¨ā§‡ GOST āĻ•ā§āĻ°āĻŋāĻĒā§āĻŸā§‹āĻ—ā§āĻ°āĻžāĻĢāĻŋāĻ• āĻ†āĻĻāĻŋāĻŽ), āĻ†āĻŽāĻŋ āĻĒā§āĻ°āĻžāĻ¯āĻŧāĻļāĻ‡ āĻšāĻžāĻāĻŸā§āĻ¤ā§‡ āĻ¸āĻŦāĻšā§‡āĻ¯āĻŧā§‡ āĻ¸āĻšāĻœ āĻ¨āĻŋāĻ°āĻžāĻĒāĻĻ āĻŽā§‡āĻ¸ā§‡āĻœāĻŋāĻ‚ āĻ•ā§€āĻ­āĻžāĻŦā§‡ āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨ āĻ•āĻ°āĻž āĻ¯āĻžāĻ¯āĻŧ āĻ¸ā§‡ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ•ā§‡ āĻĒā§āĻ°āĻļā§āĻ¨ āĻĒāĻžāĻ‡āĨ¤ āĻ…āĻ¨ā§‡āĻ• āĻ˛ā§‹āĻ• āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻ—āĻ•ā§ƒāĻ¤ āĻ•ā§āĻ°āĻŋāĻĒā§āĻŸā§‹āĻ—ā§āĻ°āĻžāĻĢāĻŋāĻ•ā§‡ āĻŦā§‡āĻļ āĻ¸āĻšāĻœ āĻŦāĻ˛ā§‡ āĻŽāĻ¨ā§‡ āĻ•āĻ°ā§‡āĻ¨ āĻāĻŦāĻ‚ āĻāĻ•āĻŸāĻŋ āĻŦā§āĻ˛āĻ• āĻ¸āĻžāĻ‡āĻĢāĻžāĻ°ā§‡ .encrypt() āĻ•āĻ˛ āĻ•āĻ°āĻž āĻāĻ•āĻŸāĻŋ āĻ¯ā§‹āĻ—āĻžāĻ¯ā§‹āĻ— āĻšā§āĻ¯āĻžāĻ¨ā§‡āĻ˛ā§‡ āĻ¨āĻŋāĻ°āĻžāĻĒāĻĻā§‡ āĻĒāĻžāĻ āĻžāĻ¨ā§‹āĻ° āĻœāĻ¨ā§āĻ¯ āĻ¯āĻĨā§‡āĻˇā§āĻŸ āĻšāĻŦā§‡āĨ¤ āĻ…āĻ¨ā§āĻ¯āĻ°āĻž āĻŦāĻŋāĻļā§āĻŦāĻžāĻ¸ āĻ•āĻ°ā§‡ āĻ¯ā§‡ āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻ—āĻ•ā§ƒāĻ¤ āĻ•ā§āĻ°āĻŋāĻĒā§āĻŸā§‹āĻ—ā§āĻ°āĻžāĻĢāĻŋ āĻšāĻ˛ āĻ…āĻ˛ā§āĻĒ āĻ•āĻ¯āĻŧā§‡āĻ•āĻœāĻ¨ā§‡āĻ° āĻ¨āĻŋāĻ¯āĻŧāĻ¤āĻŋ, āĻāĻŦāĻ‚ āĻāĻŸāĻŋ āĻ—ā§āĻ°āĻšāĻŖāĻ¯ā§‹āĻ—ā§āĻ¯ āĻ¯ā§‡ āĻŸā§‡āĻ˛āĻŋāĻ—ā§āĻ°āĻžāĻŽā§‡āĻ° āĻŽāĻ¤ā§‹ āĻ§āĻ¨ā§€ āĻ•ā§‹āĻŽā§āĻĒāĻžāĻ¨āĻŋ āĻ…āĻ˛āĻŋāĻŽā§āĻĒāĻŋāĻ¯āĻŧāĻžāĻĄ-āĻ—āĻŖāĻŋāĻ¤āĻŦāĻŋāĻĻāĻĻā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡ āĻ¨āĻž āĻ¨āĻŋāĻ°āĻžāĻĒāĻĻ āĻĒā§āĻ°ā§‹āĻŸā§‹āĻ•āĻ˛āĨ¤

āĻāĻ‡ āĻ¸āĻŦ āĻ†āĻŽāĻžāĻ•ā§‡ āĻāĻ‡ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§āĻŸāĻŋ āĻ˛ā§‡āĻ–āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻĒā§āĻ°āĻ°ā§‹āĻšāĻŋāĻ¤ āĻ•āĻ°ā§‡āĻ›ā§‡ āĻ¯ā§‡ āĻ•ā§āĻ°āĻŋāĻĒā§āĻŸā§‹āĻ—ā§āĻ°āĻžāĻĢāĻŋāĻ• āĻĒā§āĻ°ā§‹āĻŸā§‹āĻ•āĻ˛ āĻāĻŦāĻ‚ āĻ¸ā§āĻ°āĻ•ā§āĻˇāĻŋāĻ¤ IM āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨ āĻ•āĻ°āĻž āĻāĻ¤ āĻ•āĻ āĻŋāĻ¨ āĻ•āĻžāĻœ āĻ¨āĻ¯āĻŧāĨ¤ āĻ¯āĻžāĻ‡āĻšā§‹āĻ•, āĻāĻŸāĻŋ āĻ†āĻĒāĻ¨āĻžāĻ° āĻ¨āĻŋāĻœāĻ¸ā§āĻŦ āĻĒā§āĻ°āĻŽāĻžāĻŖā§€āĻ•āĻ°āĻŖ āĻāĻŦāĻ‚ āĻŽā§‚āĻ˛ āĻšā§āĻ•ā§āĻ¤āĻŋ āĻĒā§āĻ°ā§‹āĻŸā§‹āĻ•āĻ˛ āĻ‰āĻĻā§āĻ­āĻžāĻŦāĻ¨ā§‡āĻ° āĻŽā§‚āĻ˛ā§āĻ¯ āĻ¨āĻ¯āĻŧāĨ¤

GOSTIM: GOST āĻ•ā§āĻ°āĻŋāĻĒā§āĻŸā§‹āĻ—ā§āĻ°āĻžāĻĢāĻŋ āĻ¸āĻš āĻāĻ• āĻ¸āĻ¨ā§āĻ§ā§āĻ¯āĻžāĻ¯āĻŧ P2P F2F E2EE IM
āĻĒā§āĻ°āĻŦāĻ¨ā§āĻ§ āĻ˛āĻŋāĻ–āĻŦā§‡āĻ¨ āĻĒāĻŋāĻ¯āĻŧāĻžāĻ° āĻŸā§ āĻĒāĻŋāĻ¯āĻŧāĻžāĻ°, āĻŦāĻ¨ā§āĻ§ā§ āĻĨā§‡āĻ•ā§‡ āĻŦāĻ¨ā§āĻ§ā§, āĻāĻ¨ā§āĻĄ-āĻŸā§-āĻāĻ¨ā§āĻĄ āĻāĻ¨āĻ•ā§āĻ°āĻŋāĻĒā§āĻŸ āĻ•āĻ°āĻž āĻ¸āĻžāĻĨā§‡ āĻ¤āĻžāĻ¤ā§āĻ•ā§āĻˇāĻŖāĻŋāĻ• āĻŦāĻžāĻ°ā§āĻ¤āĻžāĻŦāĻžāĻšāĻ• āĻ¸āĻŋāĻ—āĻŽāĻž-āĻ†āĻ‡ āĻĒā§āĻ°āĻŽāĻžāĻŖā§€āĻ•āĻ°āĻŖ āĻāĻŦāĻ‚ āĻŽā§‚āĻ˛ āĻšā§āĻ•ā§āĻ¤āĻŋ āĻĒā§āĻ°ā§‹āĻŸā§‹āĻ•āĻ˛ (āĻ¯āĻžāĻ° āĻ­āĻŋāĻ¤ā§āĻ¤āĻŋāĻ¤ā§‡ āĻāĻŸāĻŋ āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻŋāĻ¤ āĻšāĻ¯āĻŧ āĻ†āĻ‡āĻĒāĻŋāĻ¸ā§‡āĻ• āĻ†āĻ‡āĻ•ā§‡āĻ‡), āĻāĻ•āĻšā§‡āĻŸāĻŋāĻ¯āĻŧāĻžāĻ­āĻžāĻŦā§‡ GOST āĻ•ā§āĻ°āĻŋāĻĒā§āĻŸā§‹āĻ—ā§āĻ°āĻžāĻĢāĻŋāĻ• āĻ…ā§āĻ¯āĻžāĻ˛āĻ—āĻ°āĻŋāĻĻāĻŽ PyGOST āĻ˛āĻžāĻ‡āĻŦā§āĻ°ā§‡āĻ°āĻŋ āĻāĻŦāĻ‚ ASN.1 āĻŦāĻžāĻ°ā§āĻ¤āĻž āĻāĻ¨āĻ•ā§‹āĻĄāĻŋāĻ‚ āĻ˛āĻžāĻ‡āĻŦā§āĻ°ā§‡āĻ°āĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻĒāĻžāĻ‡āĻĄāĻžāĻ°āĻžāĻ¸āĻ¨ (āĻ¯āĻž āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ•ā§‡ āĻ†āĻŽāĻŋ āĻ‡āĻ¤āĻŋāĻŽāĻ§ā§āĻ¯ā§‡āĻ‡ āĻ†āĻ—ā§‡ āĻ˛āĻŋāĻ–ā§‡āĻ›ā§‡āĻ¨) āĻāĻ•āĻŸāĻŋ āĻĒā§‚āĻ°ā§āĻŦāĻļāĻ°ā§āĻ¤: āĻāĻŸāĻŋ āĻāĻ¤ āĻ¸āĻšāĻœ āĻšāĻ¤ā§‡ āĻšāĻŦā§‡ āĻ¯ā§‡ āĻāĻŸāĻŋ āĻāĻ•āĻŸāĻŋ āĻ¸āĻ¨ā§āĻ§ā§āĻ¯āĻžāĻ¯āĻŧ (āĻŦāĻž āĻ•āĻžāĻœā§‡āĻ° āĻĻāĻŋāĻ¨) āĻ¸ā§āĻ•ā§āĻ°ā§āĻ¯āĻžāĻš āĻĨā§‡āĻ•ā§‡ āĻ˛ā§‡āĻ–āĻž āĻ¯ā§‡āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡, āĻ…āĻ¨ā§āĻ¯āĻĨāĻžāĻ¯āĻŧ āĻāĻŸāĻŋ āĻ†āĻ° āĻāĻ•āĻŸāĻŋ āĻ¸āĻžāĻ§āĻžāĻ°āĻŖ āĻĒā§āĻ°ā§‹āĻ—ā§āĻ°āĻžāĻŽ āĻ¨āĻ¯āĻŧāĨ¤ āĻāĻŸāĻŋāĻ¤ā§‡ āĻ¸āĻŽā§āĻ­āĻŦāĻ¤ āĻ¤ā§āĻ°ā§āĻŸāĻŋ, āĻ…āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ā§€āĻ¯āĻŧ āĻœāĻŸāĻŋāĻ˛āĻ¤āĻž, āĻ¤ā§āĻ°ā§āĻŸāĻŋ āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡, āĻĒā§āĻ˛āĻžāĻ¸ āĻāĻŸāĻŋ āĻ…ā§āĻ¯āĻžāĻ¸āĻŋāĻ¨āĻ¸āĻŋāĻ“ āĻ˛āĻžāĻ‡āĻŦā§āĻ°ā§‡āĻ°āĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻ†āĻŽāĻžāĻ° āĻĒā§āĻ°āĻĨāĻŽ āĻĒā§āĻ°ā§‹āĻ—ā§āĻ°āĻžāĻŽāĨ¤

āĻ†āĻ‡āĻāĻŽ āĻĄāĻŋāĻœāĻžāĻ‡āĻ¨

āĻĒā§āĻ°āĻĨāĻŽāĻ¤, āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻŦā§āĻāĻ¤ā§‡ āĻšāĻŦā§‡ āĻ†āĻŽāĻžāĻĻā§‡āĻ° IM āĻ•ā§‡āĻŽāĻ¨ āĻšāĻŦā§‡āĨ¤ āĻ¸āĻ°āĻ˛āĻ¤āĻžāĻ° āĻœāĻ¨ā§āĻ¯, āĻāĻŸāĻŋ āĻāĻ•āĻŸāĻŋ āĻĒāĻŋāĻ¯āĻŧāĻžāĻ°-āĻŸā§-āĻĒāĻŋāĻ¯āĻŧāĻžāĻ° āĻ¨ā§‡āĻŸāĻ“āĻ¯āĻŧāĻžāĻ°ā§āĻ• āĻšāĻ¤ā§‡ āĻĻāĻŋāĻ¨, āĻ…āĻ‚āĻļāĻ—ā§āĻ°āĻšāĻŖāĻ•āĻžāĻ°ā§€āĻĻā§‡āĻ° āĻ•ā§‹āĻ¨ā§‹ āĻ†āĻŦāĻŋāĻˇā§āĻ•āĻžāĻ° āĻ›āĻžāĻĄāĻŧāĻžāĻ‡āĨ¤ āĻ†āĻŽāĻ°āĻž āĻŦā§āĻ¯āĻ•ā§āĻ¤āĻŋāĻ—āĻ¤āĻ­āĻžāĻŦā§‡ āĻ¨āĻŋāĻ°ā§āĻĻā§‡āĻļ āĻ•āĻ°āĻŦ āĻ•ā§‹āĻ¨ āĻ āĻŋāĻ•āĻžāĻ¨āĻž: āĻ•āĻĨā§‹āĻĒāĻ•āĻĨāĻ¨ā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ¯ā§‹āĻ—āĻžāĻ¯ā§‹āĻ—ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻĒā§‹āĻ°ā§āĻŸ āĻ¸āĻ‚āĻ¯ā§‹āĻ— āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡āĨ¤

āĻ†āĻŽāĻŋ āĻŦā§āĻāĻ¤ā§‡ āĻĒāĻžāĻ°āĻŋ āĻ¯ā§‡, āĻāĻ‡ āĻ¸āĻŽāĻ¯āĻŧā§‡, āĻĻā§āĻŸāĻŋ āĻ¸ā§āĻŦā§‡āĻšā§āĻ›āĻžāĻšāĻžāĻ°ā§€ āĻ•āĻŽā§āĻĒāĻŋāĻ‰āĻŸāĻžāĻ°ā§‡āĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻ¸āĻ°āĻžāĻ¸āĻ°āĻŋ āĻ¯ā§‹āĻ—āĻžāĻ¯ā§‹āĻ— āĻ‰āĻĒāĻ˛āĻŦā§āĻ§ āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡ āĻāĻŽāĻ¨ āĻ§āĻžāĻ°āĻŖāĻžāĻŸāĻŋ āĻŦāĻžāĻ¸ā§āĻ¤āĻŦā§‡ IM āĻāĻ° āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻ—āĻ¯ā§‹āĻ—ā§āĻ¯āĻ¤āĻžāĻ° āĻ‰āĻĒāĻ° āĻāĻ•āĻŸāĻŋ āĻ‰āĻ˛ā§āĻ˛ā§‡āĻ–āĻ¯ā§‹āĻ—ā§āĻ¯ āĻ¸ā§€āĻŽāĻžāĻŦāĻĻā§āĻ§āĻ¤āĻžāĨ¤ āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻ¯āĻ¤ āĻŦā§‡āĻļāĻŋ āĻĄā§‡āĻ­ā§‡āĻ˛āĻĒāĻžāĻ°āĻ°āĻž āĻ¸āĻŦ āĻ§āĻ°āĻ¨ā§‡āĻ° NAT-āĻŸā§āĻ°ā§āĻ¯āĻžāĻ­āĻžāĻ°āĻ¸āĻžāĻ˛ āĻ•ā§āĻ°āĻžāĻš āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻ— āĻ•āĻ°āĻŦā§‡, āĻ¤āĻ¤ āĻŦā§‡āĻļāĻŋ āĻ¸āĻŽāĻ¯āĻŧ āĻ†āĻŽāĻ°āĻž IPv4 āĻ‡āĻ¨ā§āĻŸāĻžāĻ°āĻ¨ā§‡āĻŸā§‡ āĻĨāĻžāĻ•āĻŦ, āĻ¨āĻŋāĻ°ā§āĻŦāĻŋāĻšāĻžāĻ°ā§‡ āĻ•āĻŽā§āĻĒāĻŋāĻ‰āĻŸāĻžāĻ°ā§‡āĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻ¯ā§‹āĻ—āĻžāĻ¯ā§‹āĻ—ā§‡āĻ° āĻšāĻ¤āĻžāĻļāĻžāĻœāĻ¨āĻ• āĻ¸āĻŽā§āĻ­āĻžāĻŦāĻ¨āĻž āĻ¸āĻšāĨ¤ āĻ†āĻĒāĻ¨āĻŋ āĻ•āĻ¤āĻ•ā§āĻˇāĻŖ āĻŦāĻžāĻĄāĻŧāĻŋāĻ¤ā§‡ āĻāĻŦāĻ‚ āĻ•āĻ°ā§āĻŽāĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°ā§‡ IPv6 āĻāĻ° āĻ…āĻ­āĻžāĻŦ āĻ¸āĻšā§āĻ¯ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨?

āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻāĻ•āĻŸāĻŋ āĻŦāĻ¨ā§āĻ§ā§-āĻĨā§‡āĻ•ā§‡-āĻŦāĻ¨ā§āĻ§ā§ āĻ¨ā§‡āĻŸāĻ“āĻ¯āĻŧāĻžāĻ°ā§āĻ• āĻĨāĻžāĻ•āĻŦā§‡: āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻ¸āĻŽā§āĻ­āĻžāĻŦā§āĻ¯ āĻ•āĻĨā§‹āĻĒāĻ•āĻĨāĻ¨āĻ•ā§‡ āĻ…āĻŦāĻļā§āĻ¯āĻ‡ āĻ†āĻ—ā§‡ āĻĨā§‡āĻ•ā§‡āĻ‡ āĻœāĻžāĻ¨āĻž āĻ‰āĻšāĻŋāĻ¤āĨ¤ āĻĒā§āĻ°āĻĨāĻŽāĻ¤, āĻāĻŸāĻŋ āĻ¸āĻŦāĻ•āĻŋāĻ›ā§āĻ•ā§‡ āĻŦā§āĻ¯āĻžāĻĒāĻ•āĻ­āĻžāĻŦā§‡ āĻ¸āĻ°āĻ˛ āĻ•āĻ°ā§‡: āĻ†āĻŽāĻ°āĻž āĻ¨āĻŋāĻœā§‡āĻĻā§‡āĻ° āĻĒāĻ°āĻŋāĻšāĻ¯āĻŧ āĻĻāĻŋāĻ¯āĻŧā§‡āĻ›āĻŋ, āĻ¨āĻžāĻŽ/āĻ•ā§€ āĻ–ā§āĻāĻœā§‡ āĻĒā§‡āĻ¯āĻŧā§‡āĻ›āĻŋ āĻŦāĻž āĻĒāĻžāĻ‡āĻ¨āĻŋ, āĻ¸āĻ‚āĻ¯ā§‹āĻ— āĻŦāĻŋāĻšā§āĻ›āĻŋāĻ¨ā§āĻ¨ āĻ•āĻ°ā§‡āĻ›āĻŋ āĻŦāĻž āĻ•āĻžāĻœ āĻšāĻžāĻ˛āĻŋāĻ¯āĻŧā§‡ āĻ¯āĻžāĻšā§āĻ›āĻŋ, āĻ•āĻĨā§‹āĻĒāĻ•āĻĨāĻ¨āĻ•ā§‡ āĻœā§‡āĻ¨ā§‡āĻ›āĻŋāĨ¤ āĻĻā§āĻŦāĻŋāĻ¤ā§€āĻ¯āĻŧāĻ¤, āĻ¸āĻžāĻ§āĻžāĻ°āĻŖāĻ­āĻžāĻŦā§‡, āĻāĻŸāĻŋ āĻ¨āĻŋāĻ°āĻžāĻĒāĻĻ āĻāĻŦāĻ‚ āĻ…āĻ¨ā§‡āĻ• āĻ†āĻ•ā§āĻ°āĻŽāĻŖ āĻĻā§‚āĻ° āĻ•āĻ°ā§‡āĨ¤

IM āĻ‡āĻ¨ā§āĻŸāĻžāĻ°āĻĢā§‡āĻ¸ āĻ•ā§āĻ˛āĻžāĻ¸āĻŋāĻ• āĻ¸āĻŽāĻžāĻ§āĻžāĻ¨ā§‡āĻ° āĻ•āĻžāĻ›āĻžāĻ•āĻžāĻ›āĻŋ āĻšāĻŦā§‡ āĻ¸ā§āĻ¤āĻ¨ā§āĻ¯āĻšā§€āĻ¨ āĻĒā§āĻ°āĻ•āĻ˛ā§āĻĒ, āĻ¯āĻž āĻ†āĻŽāĻŋ āĻ¸āĻ¤ā§āĻ¯āĻŋāĻ‡ āĻ¤āĻžāĻĻā§‡āĻ° āĻŽāĻŋāĻ¨āĻŋāĻŽāĻžāĻ˛āĻŋāĻœāĻŽ āĻāĻŦāĻ‚ āĻ‡āĻ‰āĻ¨āĻŋāĻ•ā§āĻ¸-āĻ“āĻ¯āĻŧā§‡ āĻĻāĻ°ā§āĻļāĻ¨ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻĒāĻ›āĻ¨ā§āĻĻ āĻ•āĻ°āĻŋāĨ¤ IM āĻĒā§āĻ°ā§‹āĻ—ā§āĻ°āĻžāĻŽ āĻĒā§āĻ°āĻ¤āĻŋāĻŸāĻŋ āĻ‡āĻ¨ā§āĻŸāĻžāĻ°āĻ˛ā§‹āĻ•āĻŋāĻ‰āĻŸāĻžāĻ°ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ¤āĻŋāĻ¨āĻŸāĻŋ āĻ‡āĻ‰āĻ¨āĻŋāĻ•ā§āĻ¸ āĻĄā§‹āĻŽā§‡āĻ¨ āĻ¸āĻ•ā§‡āĻŸ āĻ¸āĻš āĻāĻ•āĻŸāĻŋ āĻĄāĻŋāĻ°ā§‡āĻ•ā§āĻŸāĻ°āĻŋ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°ā§‡:

  • āĻ•āĻĨā§‹āĻĒāĻ•āĻĨāĻ¨ā§‡āĻ° āĻ•āĻžāĻ›ā§‡ āĻĒāĻžāĻ āĻžāĻ¨ā§‹ āĻŦāĻžāĻ°ā§āĻ¤āĻžāĻ—ā§āĻ˛āĻŋ āĻāĻ¤ā§‡ āĻ°ā§‡āĻ•āĻ°ā§āĻĄ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ;
  • āĻ†āĻ‰āĻŸ - āĻ•āĻĨā§‹āĻĒāĻ•āĻĨāĻ¨ā§‡āĻ° āĻ•āĻžāĻ› āĻĨā§‡āĻ•ā§‡ āĻĒā§āĻ°āĻžāĻĒā§āĻ¤ āĻŦāĻžāĻ°ā§āĻ¤āĻžāĻ—ā§āĻ˛āĻŋ āĻāĻŸāĻŋ āĻĨā§‡āĻ•ā§‡ āĻĒāĻĄāĻŧāĻž āĻšāĻ¯āĻŧ;
  • āĻ°āĻžāĻœā§āĻ¯ - āĻāĻŸāĻŋ āĻĨā§‡āĻ•ā§‡ āĻĒāĻĄāĻŧā§‡, āĻ†āĻŽāĻ°āĻž āĻ–ā§āĻāĻœā§‡ āĻŦā§‡āĻ° āĻ•āĻ°āĻŋ āĻ¯ā§‡ āĻ•āĻĨā§‹āĻĒāĻ•āĻĨāĻ¨ āĻŦāĻ°ā§āĻ¤āĻŽāĻžāĻ¨ā§‡ āĻ¸āĻ‚āĻ¯ā§āĻ•ā§āĻ¤ āĻ†āĻ›ā§‡ āĻ•āĻŋāĻ¨āĻž, āĻ¸āĻ‚āĻ¯ā§‹āĻ— āĻ āĻŋāĻ•āĻžāĻ¨āĻž/āĻĒā§‹āĻ°ā§āĻŸāĨ¤

āĻ‰āĻĒāĻ°āĻ¨ā§āĻ¤ā§, āĻāĻ•āĻŸāĻŋ āĻ•āĻ¨ āĻ¸āĻ•ā§‡āĻŸ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ, āĻšā§‹āĻ¸ā§āĻŸ āĻĒā§‹āĻ°ā§āĻŸ āĻ˛āĻŋāĻ–ā§‡ āĻ¯āĻžāĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻ†āĻŽāĻ°āĻž āĻ°āĻŋāĻŽā§‹āĻŸ āĻ‡āĻ¨ā§āĻŸāĻžāĻ°āĻ˛ā§‹āĻ•āĻŋāĻ‰āĻŸāĻžāĻ°ā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ¸āĻ‚āĻ¯ā§‹āĻ— āĻļā§āĻ°ā§ āĻ•āĻ°āĻŋāĨ¤

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

āĻāĻ‡ āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻŸāĻŋ āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ IM āĻŸā§āĻ°āĻžāĻ¨ā§āĻ¸āĻĒā§‹āĻ°ā§āĻŸ āĻāĻŦāĻ‚ āĻ‡āĻ‰āĻœāĻžāĻ° āĻ‡āĻ¨ā§āĻŸāĻžāĻ°āĻĢā§‡āĻ¸ā§‡āĻ° āĻ¸ā§āĻŦāĻžāĻ§ā§€āĻ¨ āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨ āĻ•āĻ°āĻ¤ā§‡ āĻĻā§‡āĻ¯āĻŧ, āĻ•āĻžāĻ°āĻŖ āĻ•ā§‹āĻ¨ āĻŦāĻ¨ā§āĻ§ā§ āĻ¨ā§‡āĻ‡, āĻ†āĻĒāĻ¨āĻŋ āĻ¸āĻŦāĻžāĻ‡āĻ•ā§‡ āĻ–ā§āĻļāĻŋ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°āĻŦā§‡āĻ¨ āĻ¨āĻžāĨ¤ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° tmux āĻāĻŦāĻ‚ / āĻ…āĻĨāĻŦāĻž āĻŽāĻžāĻ˛ā§āĻŸāĻŋāĻŸā§‡āĻ˛, āĻ†āĻĒāĻ¨āĻŋ āĻ¸āĻŋāĻ¨āĻŸā§āĻ¯āĻžāĻ•ā§āĻ¸ āĻšāĻžāĻ‡āĻ˛āĻžāĻ‡āĻŸāĻŋāĻ‚ āĻ¸āĻš āĻāĻ•āĻŸāĻŋ āĻŽāĻžāĻ˛ā§āĻŸāĻŋ-āĻ‰āĻ‡āĻ¨ā§āĻĄā§‹ āĻ‡āĻ¨ā§āĻŸāĻžāĻ°āĻĢā§‡āĻ¸ āĻĒā§‡āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨āĨ¤ āĻāĻŦāĻ‚ āĻ¸āĻžāĻšāĻžāĻ¯ā§āĻ¯ā§‡ rlwrap āĻ†āĻĒāĻ¨āĻŋ āĻāĻ•āĻŸāĻŋ GNU āĻ°āĻŋāĻĄāĻ˛āĻžāĻ‡āĻ¨-āĻ¸āĻžāĻŽāĻžā§āĻœāĻ¸ā§āĻ¯āĻĒā§‚āĻ°ā§āĻŖ āĻŦāĻžāĻ°ā§āĻ¤āĻž āĻ‡āĻ¨āĻĒā§āĻŸ āĻ˛āĻžāĻ‡āĻ¨ āĻĒā§‡āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨āĨ¤

āĻĒā§āĻ°āĻ•ā§ƒāĻ¤āĻĒāĻ•ā§āĻˇā§‡, āĻĻā§āĻ§āĻšā§€āĻ¨ āĻĒā§āĻ°āĻ•āĻ˛ā§āĻĒ FIFO āĻĢāĻžāĻ‡āĻ˛ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡āĨ¤ āĻŦā§āĻ¯āĻ•ā§āĻ¤āĻŋāĻ—āĻ¤āĻ­āĻžāĻŦā§‡, āĻĄā§‡āĻĄāĻŋāĻ•ā§‡āĻŸā§‡āĻĄ āĻĨā§āĻ°ā§‡āĻĄ āĻĨā§‡āĻ•ā§‡ āĻšāĻžāĻ¤ā§‡ āĻ˛ā§‡āĻ–āĻž āĻŦā§āĻ¯āĻžāĻ•āĻ—ā§āĻ°āĻžāĻ‰āĻ¨ā§āĻĄ āĻ›āĻžāĻĄāĻŧāĻž āĻ…ā§āĻ¯āĻžāĻ¸āĻŋāĻ¨āĻ¸āĻŋāĻ“āĻ¤ā§‡ āĻĒā§āĻ°āĻ¤āĻŋāĻ¯ā§‹āĻ—āĻŋāĻ¤āĻžāĻŽā§‚āĻ˛āĻ•āĻ­āĻžāĻŦā§‡ āĻĢāĻžāĻ‡āĻ˛āĻ—ā§āĻ˛āĻŋāĻ° āĻ¸āĻžāĻĨā§‡ āĻ•ā§€āĻ­āĻžāĻŦā§‡ āĻ•āĻžāĻœ āĻ•āĻ°āĻž āĻ¯āĻžāĻ¯āĻŧ āĻ¤āĻž āĻ†āĻŽāĻŋ āĻŦā§āĻāĻ¤ā§‡ āĻĒāĻžāĻ°āĻŋāĻ¨āĻŋ (āĻ†āĻŽāĻŋ āĻĻā§€āĻ°ā§āĻ˜āĻĻāĻŋāĻ¨ āĻ§āĻ°ā§‡ āĻāĻ‡ āĻœāĻžāĻ¤ā§€āĻ¯āĻŧ āĻœāĻŋāĻ¨āĻŋāĻ¸āĻ—ā§āĻ˛āĻŋāĻ° āĻœāĻ¨ā§āĻ¯ āĻ­āĻžāĻˇāĻž āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻ›āĻŋ) Go) āĻ…āĻ¤āĻāĻŦ, āĻ†āĻŽāĻŋ āĻ‡āĻ‰āĻ¨āĻŋāĻ•ā§āĻ¸ āĻĄā§‹āĻŽā§‡āĻ‡āĻ¨ āĻ¸āĻ•ā§‡āĻŸā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ•āĻžāĻœ āĻ•āĻ°āĻžāĻ° āĻ¸āĻŋāĻĻā§āĻ§āĻžāĻ¨ā§āĻ¤ āĻ¨āĻŋāĻ¯āĻŧā§‡āĻ›āĻŋāĨ¤ āĻĻā§āĻ°ā§āĻ­āĻžāĻ—ā§āĻ¯āĻŦāĻļāĻ¤, āĻāĻŸāĻŋ āĻ‡āĻ•ā§‹ 2001:470:dead::babe 6666 > conn āĻ•āĻ°āĻž āĻ…āĻ¸āĻŽā§āĻ­āĻŦ āĻ•āĻ°ā§‡ āĻ¤ā§‹āĻ˛ā§‡āĨ¤ āĻ†āĻŽāĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻāĻ‡ āĻ¸āĻŽāĻ¸ā§āĻ¯āĻžāĻ° āĻ¸āĻŽāĻžāĻ§āĻžāĻ¨ āĻ•āĻ°ā§‡āĻ›āĻŋ socat: echo 2001:470:dead::bebe 6666 | socat - UNIX-CONNECT:conn, socat READLINE UNIX-CONNECT:alice/in.

āĻŽā§‚āĻ˛ āĻ…āĻ¨āĻŋāĻ°āĻžāĻĒāĻĻ āĻĒā§āĻ°ā§‹āĻŸā§‹āĻ•āĻ˛

TCP āĻĒāĻ°āĻŋāĻŦāĻšāĻ¨ āĻšāĻŋāĻ¸āĻžāĻŦā§‡ āĻŦā§āĻ¯āĻŦāĻšā§ƒāĻ¤ āĻšāĻ¯āĻŧ: āĻāĻŸāĻŋ āĻĄā§‡āĻ˛āĻŋāĻ­āĻžāĻ°āĻŋ āĻāĻŦāĻ‚ āĻāĻ° āĻ…āĻ°ā§āĻĄāĻžāĻ° āĻ¨āĻŋāĻļā§āĻšāĻŋāĻ¤ āĻ•āĻ°ā§‡āĨ¤ UDP āĻ—ā§āĻ¯āĻžāĻ°āĻžāĻ¨ā§āĻŸāĻŋ āĻĻā§‡āĻ¯āĻŧ āĻ¨āĻž (āĻ¯āĻž āĻ•ā§āĻ°āĻŋāĻĒā§āĻŸā§‹āĻ—ā§āĻ°āĻžāĻĢāĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻž āĻšāĻ˛ā§‡ āĻ•āĻžāĻœā§‡ āĻ˛āĻžāĻ—āĻŦā§‡), āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻ¸āĻŽāĻ°ā§āĻĨāĻ¨ āĻ•āĻ°ā§‡ āĻāĻ¸āĻ¸āĻŋāĻŸāĻŋāĻĒāĻŋ āĻĒāĻžāĻ‡āĻĨāĻ¨ āĻŦāĻžāĻ•ā§āĻ¸ā§‡āĻ° āĻŦāĻžāĻ‡āĻ°ā§‡ āĻ†āĻ¸ā§‡ āĻ¨āĻžāĨ¤

āĻĻā§āĻ°ā§āĻ­āĻžāĻ—ā§āĻ¯āĻŦāĻļāĻ¤, āĻŸāĻŋāĻ¸āĻŋāĻĒāĻŋāĻ¤ā§‡ āĻāĻ•āĻŸāĻŋ āĻŦāĻžāĻ°ā§āĻ¤āĻžāĻ° āĻ•ā§‹āĻ¨ āĻ§āĻžāĻ°āĻŖāĻž āĻ¨ā§‡āĻ‡, āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻŦāĻžāĻ‡āĻŸā§‡āĻ° āĻāĻ•āĻŸāĻŋ āĻĒā§āĻ°āĻŦāĻžāĻšāĨ¤ āĻ…āĻ¤āĻāĻŦ, āĻŦāĻžāĻ°ā§āĻ¤āĻžāĻ—ā§āĻ˛āĻŋāĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻŦāĻŋāĻ¨ā§āĻ¯āĻžāĻ¸ āĻ¨āĻŋāĻ¯āĻŧā§‡ āĻ†āĻ¸āĻž āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ āĻ¯āĻžāĻ¤ā§‡ āĻ¸ā§‡āĻ—ā§āĻ˛āĻŋ āĻāĻ‡ āĻĨā§āĻ°ā§‡āĻĄā§‡ āĻ¨āĻŋāĻœā§‡āĻĻā§‡āĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻ­āĻžāĻ— āĻ•āĻ°āĻž āĻ¯āĻžāĻ¯āĻŧā§ˇ āĻ†āĻŽāĻ°āĻž āĻ˛āĻžāĻ‡āĻ¨ āĻĢāĻŋāĻĄ āĻ…āĻ•ā§āĻˇāĻ° āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻ¸āĻŽā§āĻŽāĻ¤ āĻšāĻ¤ā§‡ āĻĒāĻžāĻ°āĻŋāĨ¤ āĻāĻŸāĻŋ āĻļā§āĻ°ā§ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ āĻŋāĻ• āĻ†āĻ›ā§‡, āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻāĻ•āĻŦāĻžāĻ° āĻ†āĻŽāĻ°āĻž āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻŦāĻžāĻ°ā§āĻ¤āĻžāĻ—ā§āĻ˛āĻŋ āĻāĻ¨āĻ•ā§āĻ°āĻŋāĻĒā§āĻŸ āĻ•āĻ°āĻž āĻļā§āĻ°ā§ āĻ•āĻ°āĻ˛ā§‡, āĻāĻ‡ āĻ…āĻ•ā§āĻˇāĻ°āĻŸāĻŋ āĻ¸āĻžāĻ‡āĻĢāĻžāĻ°āĻŸā§‡āĻ•ā§āĻ¸āĻŸā§‡āĻ° āĻ¯ā§‡ āĻ•ā§‹āĻ¨āĻ“ āĻœāĻžāĻ¯āĻŧāĻ—āĻžāĻ¯āĻŧ āĻ‰āĻĒāĻ¸ā§āĻĨāĻŋāĻ¤ āĻšāĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĨ¤ āĻ¨ā§‡āĻŸāĻ“āĻ¯āĻŧāĻžāĻ°ā§āĻ•āĻ—ā§āĻ˛āĻŋāĻ¤ā§‡, āĻ¤āĻžāĻ‡, āĻœāĻ¨āĻĒā§āĻ°āĻŋāĻ¯āĻŧ āĻĒā§āĻ°ā§‹āĻŸā§‹āĻ•āĻ˛āĻ—ā§āĻ˛āĻŋ āĻšāĻ˛ āĻ¯ā§‡āĻ—ā§āĻ˛āĻŋ āĻĒā§āĻ°āĻĨāĻŽā§‡ āĻŦāĻžāĻ°ā§āĻ¤āĻžāĻ° āĻĻā§ˆāĻ°ā§āĻ˜ā§āĻ¯ āĻŦāĻžāĻ‡āĻŸāĻ—ā§āĻ˛āĻŋāĻ¤ā§‡ āĻĒāĻžāĻ āĻžāĻ¯āĻŧāĨ¤ āĻ‰āĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§‚āĻĒ, āĻĒāĻžāĻ‡āĻĨāĻ¨ā§‡āĻ° āĻŦāĻžāĻ•ā§āĻ¸ā§‡āĻ° āĻŦāĻžāĻ‡āĻ°ā§‡ āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡ xdrlib, āĻ¯āĻž āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻāĻ•āĻ‡ āĻŦāĻŋāĻ¨ā§āĻ¯āĻžāĻ¸ā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ•āĻžāĻœ āĻ•āĻ°āĻ¤ā§‡ āĻĻā§‡āĻ¯āĻŧ XDR.

āĻ†āĻŽāĻ°āĻž TCP āĻĒāĻĄāĻŧāĻžāĻ° āĻ¸āĻžāĻĨā§‡ āĻ¸āĻ āĻŋāĻ•āĻ­āĻžāĻŦā§‡ āĻāĻŦāĻ‚ āĻĻāĻ•ā§āĻˇāĻ¤āĻžāĻ° āĻ¸āĻžāĻĨā§‡ āĻ•āĻžāĻœ āĻ•āĻ°āĻŦ āĻ¨āĻž - āĻ†āĻŽāĻ°āĻž āĻ•ā§‹āĻĄāĻŸāĻŋ āĻ¸āĻ°āĻ˛ āĻ•āĻ°āĻŦāĨ¤ āĻ†āĻŽāĻ°āĻž āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻŦāĻžāĻ°ā§āĻ¤āĻž āĻĄāĻŋāĻ•ā§‹āĻĄ āĻ¨āĻž āĻ•āĻ°āĻž āĻĒāĻ°ā§āĻ¯āĻ¨ā§āĻ¤ āĻ†āĻŽāĻ°āĻž āĻāĻ•āĻŸāĻŋ āĻ…āĻ¨ā§āĻ¤āĻšā§€āĻ¨ āĻ˛ā§āĻĒā§‡ āĻ¸āĻ•ā§‡āĻŸ āĻĨā§‡āĻ•ā§‡ āĻĄā§‡āĻŸāĻž āĻĒāĻĄāĻŧāĻŋāĨ¤ XML āĻ¸āĻš JSON āĻāĻ‡ āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻŦāĻŋāĻ¨ā§āĻ¯āĻžāĻ¸ āĻšāĻŋāĻ¸āĻžāĻŦā§‡āĻ“ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻž āĻ¯ā§‡āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĨ¤ āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻ¯āĻ–āĻ¨ āĻ•ā§āĻ°āĻŋāĻĒā§āĻŸā§‹āĻ—ā§āĻ°āĻžāĻĢāĻŋ āĻ¯ā§‹āĻ— āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ, āĻ¤āĻ–āĻ¨ āĻĄā§‡āĻŸāĻž āĻ¸āĻžāĻ‡āĻ¨ āĻ‡āĻ¨ āĻāĻŦāĻ‚ āĻĒā§āĻ°āĻŽāĻžāĻŖā§€āĻ•āĻ°āĻŖ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡ - āĻāĻŦāĻ‚ āĻāĻ° āĻœāĻ¨ā§āĻ¯ āĻŦāĻ¸ā§āĻ¤ā§āĻ° āĻŦāĻžāĻ‡āĻŸ-āĻĢāĻ°-āĻŦāĻžāĻ‡āĻŸ āĻ…āĻ­āĻŋāĻ¨ā§āĻ¨ āĻ‰āĻĒāĻ¸ā§āĻĨāĻžāĻĒāĻ¨āĻž āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨, āĻ¯āĻž JSON/XML āĻĒā§āĻ°āĻĻāĻžāĻ¨ āĻ•āĻ°ā§‡ āĻ¨āĻž (āĻĄāĻžāĻŽā§āĻĒā§‡āĻ° āĻĢāĻ˛āĻžāĻĢāĻ˛ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻŋāĻ¤ āĻšāĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡)āĨ¤

XDR āĻāĻ‡ āĻ•āĻžāĻœā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ‰āĻĒāĻ¯ā§āĻ•ā§āĻ¤, āĻ¤āĻŦā§‡ āĻ†āĻŽāĻŋ DER āĻāĻ¨āĻ•ā§‹āĻĄāĻŋāĻ‚ āĻ¸āĻš ASN.1 āĻ¨āĻŋāĻ°ā§āĻŦāĻžāĻšāĻ¨ āĻ•āĻ°āĻŋ āĻāĻŦāĻ‚ āĻĒāĻžāĻ‡āĻĄāĻžāĻ°āĻžāĻ¸āĻ¨ āĻ˛āĻžāĻ‡āĻŦā§āĻ°ā§‡āĻ°āĻŋ, āĻ¯ā§‡āĻšā§‡āĻ¤ā§ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻšāĻžāĻ¤ā§‡ āĻ‰āĻšā§āĻš-āĻ¸ā§āĻ¤āĻ°ā§‡āĻ° āĻŦāĻ¸ā§āĻ¤ā§ āĻĨāĻžāĻ•āĻŦā§‡ āĻ¯āĻžāĻ° āĻ¸āĻžāĻĨā§‡ āĻ•āĻžāĻœ āĻ•āĻ°āĻž āĻĒā§āĻ°āĻžāĻ¯āĻŧāĻļāĻ‡ āĻ†āĻ°āĻ“ āĻ†āĻ¨āĻ¨ā§āĻĻāĻĻāĻžāĻ¯āĻŧāĻ• āĻāĻŦāĻ‚ āĻ¸ā§āĻŦāĻŋāĻ§āĻžāĻœāĻ¨āĻ•āĨ¤ āĻ¸ā§āĻ•āĻŋāĻŽāĻ˛ā§‡āĻ¸ āĻĨā§‡āĻ•ā§‡ āĻ­āĻŋāĻ¨ā§āĻ¨ āĻŦā§‡āĻ¨āĻ•ā§‹āĻĄ, āĻŽā§‡āĻ¸ā§‡āĻœāĻĒā§āĻ¯āĻžāĻ• āĻŦāĻž āĻ¸āĻŋāĻŦāĻŋāĻ“āĻ†āĻ°, 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 āĻĒā§āĻ°āĻ¤āĻŋāĻ¸ā§āĻĨāĻžāĻĒāĻ¨ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°āĻŋ āĻāĻŦāĻ‚ āĻ…āĻ¨ā§āĻ¯ āĻĒāĻ°āĻŋāĻšāĻŋāĻ¤ āĻ•āĻĨā§‹āĻĒāĻ•āĻĨāĻ•ā§‡āĻ° āĻ•ā§€ āĻĻāĻŋāĻ¯āĻŧā§‡ āĻŦāĻžāĻ°ā§āĻ¤āĻžāĻŸāĻŋāĻ¤ā§‡ āĻĒā§āĻ¨āĻ°āĻžāĻ¯āĻŧ āĻ¸ā§āĻŦāĻžāĻ•ā§āĻˇāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°āĻŋāĨ¤ āĻĒā§āĻ°āĻ¤āĻŋāĻ°ā§‹āĻ§ āĻ•āĻ°āĻ¤ā§‡ āĻĒā§āĻ°āĻ¤āĻŋāĻĢāĻ˛āĻ¨ āĻ†āĻ•ā§āĻ°āĻŽāĻŖ, āĻāĻŸāĻŋ āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ā§€āĻ¯āĻŧ āĻ¯ā§‡ āĻ¸ā§āĻŦāĻžāĻ•ā§āĻˇāĻ°ā§‡āĻ° āĻ…āĻ§ā§€āĻ¨ā§‡ āĻ‰āĻĒāĻžāĻĻāĻžāĻ¨āĻ—ā§āĻ˛āĻŋ āĻ¤āĻžāĻĻā§‡āĻ° āĻ…āĻ°ā§āĻĨ āĻ…āĻ¨ā§āĻ¸āĻžāĻ°ā§‡ āĻ¸ā§āĻĒāĻˇā§āĻŸāĻ­āĻžāĻŦā§‡ āĻ¸āĻ‚āĻœā§āĻžāĻžāĻ¯āĻŧāĻŋāĻ¤ āĻ¸ā§āĻĨāĻžāĻ¨ā§‡ āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡: āĻ¯āĻĻāĻŋ A āĻšāĻŋāĻšā§āĻ¨ (PubA, PubB), āĻ¤āĻŦā§‡ B āĻ…āĻŦāĻļā§āĻ¯āĻ‡ āĻ¸ā§āĻŦāĻžāĻ•ā§āĻˇāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡ (PubB, PubA)āĨ¤ āĻāĻŸāĻŋ āĻ¸āĻŋāĻ°āĻŋāĻ¯āĻŧāĻžāĻ˛āĻžāĻ‡āĻœāĻĄ āĻĄā§‡āĻŸāĻžāĻ° āĻ—āĻ āĻ¨ āĻāĻŦāĻ‚ āĻŦāĻŋāĻ¨ā§āĻ¯āĻžāĻ¸ āĻ¨āĻŋāĻ°ā§āĻŦāĻžāĻšāĻ¨ āĻ•āĻ°āĻžāĻ° āĻ—ā§āĻ°ā§āĻ¤ā§āĻŦā§‡āĻ° āĻ¸āĻžāĻĨā§‡āĻ“ āĻ•āĻĨāĻž āĻŦāĻ˛ā§‡āĨ¤ āĻ‰āĻĻāĻžāĻšāĻ°āĻŖ āĻ¸ā§āĻŦāĻ°ā§‚āĻĒ, ASN.1 DER āĻāĻ¨āĻ•ā§‹āĻĄāĻŋāĻ‚-āĻ āĻ¸ā§‡āĻŸāĻ—ā§āĻ˛āĻŋ āĻ¸āĻžāĻœāĻžāĻ¨ā§‹ āĻšāĻ¯āĻŧā§‡āĻ›ā§‡: SET OF(PubA, PubB) SET OF(PubB, PubA) āĻāĻ° āĻ…āĻ¨ā§āĻ°ā§‚āĻĒ āĻšāĻŦā§‡ā§ˇ

┌─────┐ ┌─────┐ │āĻĒāĻŋāĻ°āĻ†â”‚ │āĻĒāĻŋāĻ°āĻŦāĻŋ│ └──â”Ŧ─ │ ╔═══════════ ═════════════════╗ │─────────────────────── ────────── ─────────────>│ ║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 +.

    āĻ¸ā§‡āĻ°ā§āĻ—ā§‡āĻ‡ āĻŽāĻžāĻ¤āĻ­āĻŋāĻ­, āĻ¸āĻžāĻ‡āĻĢāĻžāĻ°āĻĒāĻžāĻ™ā§āĻ•, āĻ¸āĻĻāĻ¸ā§āĻ¯ āĻāĻ¸āĻĒāĻŋāĻ“ āĻĢāĻžāĻ‰āĻ¨ā§āĻĄā§‡āĻļāĻ¨, āĻĒāĻžāĻ‡āĻĨāĻ¨/āĻ—ā§‹-āĻĄā§‡āĻ­ā§‡āĻ˛āĻĒāĻžāĻ°, āĻĒā§āĻ°āĻ§āĻžāĻ¨ āĻŦāĻŋāĻļā§‡āĻˇāĻœā§āĻž āĻĢā§‡āĻĄāĻžāĻ°ā§‡āĻ˛ āĻ¸ā§āĻŸā§‡āĻŸ āĻ‡āĻ‰āĻ¨āĻŋāĻŸāĻžāĻ°āĻŋ āĻāĻ¨ā§āĻŸāĻžāĻ°āĻĒā§āĻ°āĻžāĻ‡āĻœ "āĻāĻ¸āĻŸāĻŋāĻ¸āĻŋ "āĻāĻŸāĻ˛āĻžāĻ¸".

āĻ‰āĻ¤ā§āĻ¸: www.habr.com

āĻāĻ•āĻŸāĻŋ āĻŽāĻ¨ā§āĻ¤āĻŦā§āĻ¯ āĻœā§āĻĄāĻŧā§āĻ¨