SIMD рдмреНрд▓реЙрдХ рдХреЗ рдХрд╛рд░рдг рдмреИрдХрд▓-рдЯреА 1 рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд░ GOST 28147-89 рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдХреЛ рдХреИрд╕реЗ рддреЗрдЬ рдХрд░реЗрдВ

рдлрд┐рд╕реНрдЯрд▓ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдирд┐рд░реНрдорд┐рдд GOST 28147-89 рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╡рд┐рд╡рд░рдг рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд▓реЗрдЦ рджреЛрд╣рд░реЗ рдХреЛрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ BE-T1000 (рдЙрд░реНрдл рдмрд╛рдЗрдХрд╛рд▓-рдЯреА 1) рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдФрд░ рдмрд┐рдирд╛ рд╕рд┐рдордб рдХреЛрдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рдФрд░ рдмрд┐рдирд╛ рд╡реЗрдХреНрдЯрд░ рдЧрдгрдирд╛ рдХреЗ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рддреБрд▓рдирд╛рддреНрдордХ рдкрд░реАрдХреНрд╖рдг рдХрд░рддрд╛ рд╣реИред рдпрд╣рд╛рдВ рд╣рдо GOST 28147-89, ECB рдореЛрдб рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП SIMD рдмреНрд▓реЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВрдЧреЗред


рдпрд╣ рд▓реЗрдЦ рдкрд┐рдЫрд▓реЗ рд╕рд╛рд▓ рдмреИрдХрд▓ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрдирд┐рдХреНрд╕ рдХреЗ рдПрдХ рдкреНрд░рдореБрдЦ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдЕрд▓реЗрдХреНрд╕реА рдХреЛрд▓реЛрдирд┐рдХреЛрд╡ рджреНрд╡рд╛рд░рд╛ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрдирд┐рдХ рдЕрд╡рдпрд╡ рдЬрд░реНрдирд▓ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ред рдФрд░ рдЪреВрдВрдХрд┐ рдЗрд╕ рдкрддреНрд░рд┐рдХрд╛ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдкрд╛рдардХ рдирд╣реАрдВ рд╣реИрдВ, рдФрд░ рд▓реЗрдЦ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИ рдЬреЛ рдкреЗрд╢реЗрд╡рд░ рд░реВрдк рд╕реЗ рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлреА рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдореИрдВ, рд▓реЗрдЦрдХ рдФрд░ рдЙрд╕рдХреА рдЫреЛрдЯреА-рдЫреЛрдЯреА рдЬреЛрдбрд╝рд┐рдпреЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рд╕реЗ, рдЗрд╕реЗ рдпрд╣рд╛рдВ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рддрд╛ рд╣реВрдВред


рдмрд╛рдЗрдХрд╛рд▓-рдЯреА 1 рдкреНрд░реЛрд╕реЗрд╕рд░ рдФрд░ рдЗрд╕рдХреЗ рдЕрдВрджрд░ рд╕рд┐рдордб рдмреНрд▓реЙрдХ


рдмрд╛рдЗрдХрд╛рд▓-рдЯреА 1 рдкреНрд░реЛрд╕реЗрд╕рд░ рдореЗрдВ рдПрдордЖрдЗрдкреАрдПрд╕ 32 рдкреА 5600 рдкрд░рд┐рд╡рд╛рд░ рдХрд╛ рдорд▓реНрдЯреАрдкреНрд░реЛрд╕реЗрд╕рд░ рдбреНрдпреВрд▓-рдХреЛрд░ рд╕рд┐рд╕реНрдЯрдо рд╢рд╛рдорд┐рд▓ рд╣реИ, рд╕рд╛рде рд╣реА рдкрд░рд┐рдзреАрдп рдЙрдкрдХрд░рдгреЛрдВ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдФрд░ рдХрдо рдЧрддрд┐ рдХрд╛ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдЪреНрдЪ рдЧрддрд┐ рд╡рд╛рд▓реЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реИред рдпрд╣рд╛рдБ рдЗрд╕ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХрд╛ рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рдЖрд░реЗрдЦ рд╣реИ:



рдкреНрд░рддреНрдпреЗрдХ рджреЛ рдХреЛрд░ рдореЗрдВ рдПрдХ SIMD рдмреНрд▓реЙрдХ рд╢рд╛рдорд┐рд▓ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ 128-рдмрд┐рдЯ рд╡реИрдХреНрдЯрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред SIMD рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдирдореВрдиреЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ,
рдФрд░ рдкреВрд░реЗ рд╡реЗрдХреНрдЯрд░, рдЬрд┐рд╕рдореЗрдВ рдХрдИ рдирдореВрдиреЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рдд, рдбреЗрдЯрд╛ рдХреЗ рдкреВрд░реЗ рд╡реЗрдХреНрдЯрд░ (рд╕рд░рдгреА) рдкрд░ рдПрдХ рдХрдорд╛рдВрдб рддреБрд░рдВрдд рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдПрдХ рдХрдорд╛рдВрдб рдЪрдХреНрд░ рдореЗрдВ, рдХрдИ рдирдореВрдиреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкреНрд░реЛрд╕реЗрд╕рд░ MIPS32 SIMD рдмреНрд▓реЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ 128-рдмрд┐рдЯ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЗ 32 рдЯреБрдХрдбрд╝реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред


рдкреНрд░рддреНрдпреЗрдХ рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рдирд┐рдореНрди рдЖрдпрд╛рдореЛрдВ рдХреЗ рд╡реИрдХреНрдЯрд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ: 8 ├Ч 16; 16 ├Ч 8; 4 ├Ч 32 рдпрд╛
2 ├Ч 64 рдмрд┐рдЯреНрд╕ред рдбреЗрдЯрд╛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 150 рд╕реЗ рдЕрдзрд┐рдХ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ: рдкреВрд░реНрдгрд╛рдВрдХ, рдлреНрд▓реЛрдЯрд┐рдВрдЧ-рдкреЙрдЗрдВрдЯ рдФрд░ рдлрд┐рдХреНрд╕реНрдб-рдкреЙрдЗрдВрдЯ, рдЬрд┐рд╕рдореЗрдВ рдмрд┐рдЯрд╡рд╛рдЗрдЬрд╝ рдСрдкрд░реЗрд╢рдВрд╕, рддреБрд▓рдирд╛ рд╕рдВрдЪрд╛рд▓рди рдФрд░ рд░реВрдкрд╛рдВрддрд░рдг рд╕рдВрдЪрд╛рд▓рди рд╢рд╛рдорд┐рд▓ рд╣реИрдВред


"MIPS SIMD рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХреА рдФрд░ рдмрд╛рдЗрдХрд╛рд▓-рдЯреА 1 рдкреНрд░рдХреНрд░рд┐рдпрд╛" рд▓реЗрдЦ рдореЗрдВ SparF рджреНрд╡рд╛рд░рд╛ рдмрд╣реБрдд рд╡рд┐рд╕реНрддреГрдд MIPS SIMD рддрдХрдиреАрдХ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред


рд╡реЗрдХреНрдЯрд░ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдХреА рдкреНрд░рднрд╛рд╡рд╢реАрд▓рддрд╛ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди


рдмреИрдХрд▓-рдЯреА 1 рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛрд░ рдХреЗ рдЕрдВрдХрдЧрдгрд┐рдд рд╕рд╣рд╕рдВрд╕рд╛рдзрдХ рдПрдХ рдкрд╛рд░рдВрдкрд░рд┐рдХ рдлреНрд▓реЛрдЯрд┐рдВрдЧ-рдкреЙрдЗрдВрдЯ рдкреНрд░реЛрд╕реЗрд╕рд░ рдФрд░ рдПрдХ рд╕рдорд╛рдирд╛рдВрддрд░ SIMD рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛ рдЬреЛрдбрд╝рддреА рд╣реИ, рдЬреЛ рд╡реИрдХреНрдЯрд░ рдФрд░ рдбрд┐рдЬреАрдЯрд▓ рд╕рд┐рдЧреНрдирд▓ рдХреЗ рдХреБрд╢рд▓ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рд╣реИред 2017 рдореЗрдВ SparF рджреНрд╡рд╛рд░рд╛ "MIPS SIMD рдЯреЗрдХреНрдиреЙрд▓реЙрдЬреА рдФрд░ рдмрд╛рдЗрдХрд╛рд▓-рдЯреА 1 рдкреНрд░реЛрд╕реЗрд╕рд░" рд▓реЗрдЦ рд▓рд┐рдЦрддреЗ рд╣реБрдП рд╡реЗрдХреНрдЯрд░ SIMD рдХреЙрдкрд░рдкреНрд░реЛрд╕реЗрд╕рд░ рдХрд╛ рдПрдХ рд╕реНрд╡рддрдВрддреНрд░ рдкреНрд░рджрд░реНрд╢рди рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрджрд┐ рд╡рд╛рдВрдЫрд┐рдд рд╣реИ, рддреЛ рдЗрд╕ рддрд░рд╣ рдХреЗ рдорд╛рдк рдХреЛ рджреЛрд╣рд░рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдПрдХ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд╕рд╛рде рд░рд┐рдореЛрдЯ рд╕реНрдЯреИрдВрдб рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдХреЗ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдкреНрд░рджрд░реНрд╢рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


рддрдм рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдп рдирд┐рдпрдорд┐рдд рдЕрдВрддрд░рд╛рд▓ рдкрд░ рд▓рд┐рдП рдЧрдП рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдХреЗ рд╕рд╛рде рдореБрдХреНрдд x264 рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ (H.264 рдбреЗрдореЛ рдХреНрд▓рд┐рдк) рдФрд░ x265 (HEVC рд╡реАрдбрд┐рдпреЛ рдлрд╝рд╛рдЗрд▓) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдиреНрдХреЛрдб рдХрд┐рдП рдЧрдП рд╡реАрдбрд┐рдпреЛ рдХреЛ рдбреАрдХреЛрдб рдХрд░рдирд╛ рдерд╛ред рдЙрдореНрдореАрдж рдХреЗ рдореБрддрд╛рдмрд┐рдХ, SIMD рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдХреНрд╖рдорддрд╛рдУрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд╕рд╛рде FFmpeg рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛрд░ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рдПрдХ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рд╡реГрджреНрдзрд┐ рдиреЛрдЯ рдХреА рдЧрдИ рдереА:



рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо GOST 28147-89 рдХрд╛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╡рд┐рд╡рд░рдг


рдпрд╣рд╛рдВ рд╣рдо рдХреЗрд╡рд▓ рдХреЛрдб рдФрд░ рдЕрдиреБрдХреВрд▓рди рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВрдЧреЗ:


  • рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо Feistel рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред
  • рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдореЗрдВ 32 рд░рд╛рдЙрдВрдб рд╣реЛрддреЗ рд╣реИрдВред
  • рдПрдХ рд░рд╛рдЙрдВрдб рдореЗрдВ рдПрдХ рдХреБрдВрдЬреА рдорд┐рд▓рд╛рдирд╛ рдФрд░ 11 рдмрд┐рдЯреНрд╕ рдХреЗ рдмрджрд▓рд╛рд╡ рдХреЗ рд╕рд╛рде рдПрдХ рдЯреЗрдмрд▓ рдореЗрдВ 4 рдмрд┐рдЯреНрд╕ рдХреЗ 8 рднрд╛рдЧреЛрдВ рдХреЛ рдмрджрд▓рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИред

GOST 28147-89 рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕реВрдЪрдирд╛ рд░реВрдкрд╛рдВрддрд░рдг рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд░рдг рдпреВрдПрд╕рдПрд╕рдЖрд░ рдХреЗ рд░рд╛рдЬреНрдп рдорд╛рдирдХ рдореЗрдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ред


рдПрдХ SIMD рдмреНрд▓реЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ GOST 28147-89 рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


рддреБрд▓рдирд╛рддреНрдордХ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рд╢реБрд░реВ рдореЗрдВ рдорд╛рдирдХ, "рдЧреИрд░-рд╡реЗрдХреНрдЯрд░рдХреГрдд" рдЖрджреЗрд╢реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред


рдпрд╣рд╛рдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд MIPS рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЛрдб рдЖрдкрдХреЛ 450 рдореЗрдЧрд╛рд╣рд░реНрдЯреНрдЬ (рдпрд╛ ~ 150 рдПрдордмреА / рдПрд╕) рдореЗрдВ 64 рдмрд┐рдЯреНрд╕ рдХреЗ рдПрдХ рдмреНрд▓реЙрдХ рдХреЛ 1200 рдореЗрдЧрд╛рд╣рд░реНрдЯреНрдЬ рдХреЗ рдирд╛рдордорд╛рддреНрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рдЖрд╡реГрддреНрддрд┐ рдкрд░ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЧрдгрдирд╛ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдХреЛрд░ рд╢рд╛рдорд┐рд▓ рд╣реИред


рдПрдХ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рддрд╛рд▓рд┐рдХрд╛ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЧреЛрд▓ рдХреЗ рдХрд╛рдо рдХреЛ рдЧрддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ 32-рдмрд┐рдЯ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рдирд╛: рдЕрдЧреНрд░рд┐рдо рдореЗрдВ рдЪрд╛рд░ рдмрд┐рдЯреНрд╕ рдХреЛ рдмрджрд▓рдиреЗ рдФрд░ рдмрджрд▓рдиреЗ рдХреЗ рдмрдЬрд╛рдпред
рддреИрдпрд╛рд░ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдЖрда рдмрд┐рдЯреНрд╕ рдХреА рдЬрдЧрд╣ рд╣реИред


uint8_t sbox_test[8][16] = { {0x9, 0x6, 0x3, 0x2, 0x8, 0xb, 0x1, 0x7, 0xa, 0x4, 0xe, 0xf, 0xc, 0x0, 0xd, 0x5}, {0x3, 0x7, 0xe, 0x9, 0x8, 0xa, 0xf, 0x0, 0x5, 0x2, 0x6, 0xc, 0xb, 0x4, 0xd, 0x1}, {0xe, 0x4, 0x6, 0x2, 0xb, 0x3, 0xd, 0x8, 0xc, 0xf, 0x5, 0xa, 0x0, 0x7, 0x1, 0x9}, {0xe, 0x7, 0xa, 0xc, 0xd, 0x1, 0x3, 0x9, 0x0, 0x2, 0xb, 0x4, 0xf, 0x8, 0x5, 0x6}, {0xb, 0x5, 0x1, 0x9, 0x8, 0xd, 0xf, 0x0, 0xe, 0x4, 0x2, 0x3, 0xc, 0x7, 0xa, 0x6}, {0x3, 0xa, 0xd, 0xc, 0x1, 0x2, 0x0, 0xb, 0x7, 0x5, 0x9, 0x4, 0x8, 0xf, 0xe, 0x6}, {0x1, 0xd, 0x2, 0x9, 0x7, 0xa, 0x6, 0x0, 0x8, 0xc, 0x4, 0x5, 0xf, 0x3, 0xb, 0xe}, {0xb, 0xa, 0xf, 0x5, 0x0, 0xc, 0xe, 0x8, 0x6, 0x2, 0x3, 0x9, 0x1, 0x7, 0xd, 0x4} }; uint32_t sbox_cvt[4*256]; for (i = 0; i < 256; ++i) { uint32_t p; p = sbox[7][i >> 4] << 4 | sbox[6][i & 15]; p = p << 24; p = p << 11 | p >> 21; sbox_cvt[i] = p; // S87 p = sbox[5][i >> 4] << 4 | sbox[4][i & 15]; p = p << 16; p = p << 11 | p >> 21; sbox_cvt[256 + i] = p; // S65 p = sbox[3][i >> 4] << 4 | sbox[2][i & 15]; p = p << 8; p = p << 11 | p >> 21; sbox_cvt[256 * 2 + i] = p; // S43 p = sbox[1][i >> 4] << 4 | sbox[0][i & 15]; p = p << 11 | p >> 21; sbox_cvt[256 * 3 + i] = p; // S21 } 

рдмреНрд▓реЙрдХ рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдХреБрдВрдЬреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЧреЛрд▓ рдХрд╛ 32 рдЧреБрдирд╛ рджреЛрд╣рд░рд╛рдирд╛ рд╣реИред


 // input: a0 - &in, a1 - &out, a2 - &key, a3 - &sbox_cvt LEAF(gost_encrypt_block_asm) .set reorder lw n1, (a0) // n1, IN lw n2, 4(a0) // n2, IN + 4 lw t0, (a2) // key[0] -> t0 gostround n1, n2, 1 gostround n2, n1, 2 gostround n1, n2, 3 gostround n2, n1, 4 gostround n1, n2, 5 gostround n2, n1, 6 gostround n1, n2, 7 gostround n2, n1, 0 gostround n1, n2, 1 gostround n2, n1, 2 gostround n1, n2, 3 gostround n2, n1, 4 gostround n1, n2, 5 gostround n2, n1, 6 gostround n1, n2, 7 gostround n2, n1, 0 gostround n1, n2, 1 gostround n2, n1, 2 gostround n1, n2, 3 gostround n2, n1, 4 gostround n1, n2, 5 gostround n2, n1, 6 gostround n1, n2, 7 gostround n2, n1, 7 gostround n1, n2, 6 gostround n2, n1, 5 gostround n1, n2, 4 gostround n2, n1, 3 gostround n1, n2, 2 gostround n2, n1, 1 gostround n1, n2, 0 gostround n2, n1, 0 1: sw n2, (a1) sw n1, 4(a1) jr ra nop END(gost_encrypt_block_asm) 

рдПрдХ рдлреИрд▓ рдЯреЗрдмрд▓ рд░рд╛рдЙрдВрдб рд╕рд┐рд░реНрдл рдПрдХ рдЯреЗрдмрд▓ рд╕реНрд╡реИрдк рд╣реИред


  .macro gostround x_in, x_out, rkey addu t8, t0, \x_in /* key[0] + n1 = x */ lw t0, \rkey * 4 (a2) /* next key to t0 */ ext t2, t8, 24, 8 /* get bits [24,31] */ ext t3, t8, 16, 8 /* get bits [16,23] */ ext t4, t8, 8, 8 /* get bits [8,15] */ ext t5, t8, 0, 8 /* get bits [0, 7] */ sll t2, t2, 2 /* convert to dw offset */ sll t3, t3, 2 /* convert to dw offset */ sll t4, t4, 2 /* convert to dw offset */ sll t5, t5, 2 /* convert to dw offset */ addu t2, t2, a3 /* add sbox_cvt */ addu t3, t3, a3 /* add sbox_cvt */ addu t4, t4, a3 /* add sbox_cvt */ addu t5, t5, a3 /* add sbox_cvt */ lw t6, (t2) /* sbox[x[3]] -> t2 */ lw t7, 256*4(t3) /* sbox[256 + x[2]] -> t3 */ lw t9, 256*2*4(t4) /* sbox[256 *2 + x[1]] -> t4 */ lw t1, 256*3*4(t5) /* sbox[256 *3 + x[0]] -> t5 */ or t2, t7, t6 /* | */ or t3, t1, t9 /* | */ or t2, t2, t3 /* | */ xor \x_out, \x_out, t2 /* n2 ^= f(...) */ .endm 

рдПрдХ SIMD рдмреНрд▓реЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ GOST 28147-89 рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


рдиреАрдЪреЗ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХреЛрдб рдЖрдкрдХреЛ рд╕рдорд╛рди рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдПрдХ рд╕рд╛рде 64 рдмрд┐рдЯреНрд╕ рдХреЗ 720 (рдпрд╛ ~ 350 Mbit / s) рдкреНрд░рддрд┐ 64 рдмрд┐рдЯреНрд╕ рдХреЗ рдЪрд╛рд░ рдмреНрд▓реЙрдХреЛрдВ рдХреЛ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ: рдкреНрд░реЛрд╕реЗрд╕рд░ рдЖрд╡реГрддреНрддрд┐ 1200 рдореЗрдЧрд╛рд╣рд░реНрдЯреНрдЬ, рдПрдХ рдХреЛрд░ред


рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рджреЛ рдЪреМрдЧреБрдиреА рдореЗрдВ рдФрд░ рддреБрд░рдВрдд 4 рдмреНрд▓реЙрдХреЛрдВ рдореЗрдВ shuffle рдирд┐рд░реНрджреЗрд╢ рдФрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЪреМрдХреЛрдВ рдХреА рдорд╛рд╕реНрдХрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


рдПрдХ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░


 for(i = 0; i < 16; ++i) { sbox_cvt_simd[i] = (sbox[7][i] << 4) | sbox[0][i]; // $w8 [7 0] sbox_cvt_simd[16 + i] = (sbox[1][i] << 4) | sbox[6][i]; // $w9 [6 1] sbox_cvt_simd[32 + i] = (sbox[5][i] << 4) | sbox[2][i]; // $w10[5 2] sbox_cvt_simd[48 + i] = (sbox[3][i] << 4) | sbox[4][i]; // $w11[3 4] } 

рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдорд╛рд╕реНрдХред


 l0123: .int 0x0f0f0f0f .int 0xf000000f /* substitute from $w8 [7 0] mask in w12*/ .int 0x0f0000f0 /* substitute from $w9 [6 1] mask in w13*/ .int 0x00f00f00 /* substitute from $w10 [5 2] mask in w14*/ .int 0x000ff000 /* substitute from $w11 [4 3] mask in w15*/ .int 0x000f000f /* mask $w16 x N x N */ .int 0x0f000f00 /* mask $w17 N x N x */ LEAF(gost_prepare_asm) .set reorder .set msa la t1, l0123 /* masks */ lw t2, (t1) lw t3, 4(t1) lw t4, 8(t1) lw t5, 12(t1) lw t6, 16(t1) lw t7, 20(t1) lw t8, 24(t1) fill.w $w2, t2 /* 0f0f0f0f -> w2 */ fill.w $w12, t3 /* f000000f -> w12*/ fill.w $w13, t4 /* 0f0000f0 -> w13*/ fill.w $w14, t5 /* 00f00f00 -> w14*/ fill.w $w15, t6 /* 000ff000 -> w15*/ fill.w $w16, t7 /* 000f000f -> w16*/ fill.w $w17, t8 /* 0f000f00 -> w17*/ ld.b $w8, (a0) /* load sbox */ ld.b $w9, 16(a0) ld.b $w10, 32(a0) ld.b $w11, 48(a0) jr ra nop END(gost_prepare_asm) 

4 рдмреНрд▓реЙрдХ рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди


 LEAF(gost_encrypt_4block_asm) .set reorder .set msa lw t1, (a0) // n1, IN lw t2, 4(a0) // n2, IN + 4 lw t3, 8(a0) // n1, IN + 8 lw t4, 12(a0) // n2, IN + 12 lw t5, 16(a0) // n1, IN + 16 lw t6, 20(a0) // n2, IN + 20 lw t7, 24(a0) // n1, IN + 24 lw t8, 28(a0) // n2, IN + 28 lw t0, (a2) // key[0] -> t0 insert.w ns1[0],t1 insert.w ns2[0],t2 insert.w ns1[1],t3 insert.w ns2[1],t4 insert.w ns1[2],t5 insert.w ns2[2],t6 insert.w ns1[3],t7 insert.w ns2[3],t8 gostround4 ns1, ns2, 1 gostround4 ns2, ns1, 2 gostround4 ns1, ns2, 3 gostround4 ns2, ns1, 4 gostround4 ns1, ns2, 5 gostround4 ns2, ns1, 6 gostround4 ns1, ns2, 7 gostround4 ns2, ns1, 0 gostround4 ns1, ns2, 1 gostround4 ns2, ns1, 2 gostround4 ns1, ns2, 3 gostround4 ns2, ns1, 4 gostround4 ns1, ns2, 5 gostround4 ns2, ns1, 6 gostround4 ns1, ns2, 7 gostround4 ns2, ns1, 0 gostround4 ns1, ns2, 1 gostround4 ns2, ns1, 2 gostround4 ns1, ns2, 3 gostround4 ns2, ns1, 4 gostround4 ns1, ns2, 5 gostround4 ns2, ns1, 6 gostround4 ns1, ns2, 7 gostround4 ns2, ns1, 7 gostround4 ns1, ns2, 6 gostround4 ns2, ns1, 5 gostround4 ns1, ns2, 4 gostround4 ns2, ns1, 3 gostround4 ns1, ns2, 2 gostround4 ns2, ns1, 1 gostround4 ns1, ns2, 0 gostround4 ns2, ns1, 0 1: copy_s.w t1,ns2[0] copy_s.w t2,ns1[0] copy_s.w t3,ns2[1] copy_s.w t4,ns1[1] copy_s.w t5,ns2[2] copy_s.w t6,ns1[2] copy_s.w t7,ns2[3] copy_s.w t8,ns1[3] sw t1, (a1) // n2, OUT sw t2, 4(a1) // n1, OUT + 4 sw t3, 8(a1) // n2, OUT + 8 sw t4, 12(a1) // n1, OUT + 12 sw t5, 16(a1) // n2, OUT + 16 sw t6, 20(a1) // n1, OUT + 20 sw t7, 24(a1) // n2, OUT + 24 sw t8, 28(a1) // n1, OUT + 28 jr ra nop END(gost_encrypt_4block_asm) 

рдПрдХ рд╕рд╛рде 4 рдмреНрд▓реЙрдХ рдХреА рдЧрдгрдирд╛ рдХреЗ рд╕рд╛рде SIMD рдмреНрд▓реЙрдХ рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд░рд╛рдЙрдВрдб


 .macro gostround4 x_in, x_out, rkey fill.w $w0, t0 /* key -> Vi */ addv.w $w1, $w0, \x_in /* key[0] + n1 = x */ srli.b $w3, $w1, 4 /* $w1 >> 4 */ and.v $w4, $w1, $w16 /* x 4 x 0*/ and.v $w5, $w1, $w17 /* 6 x 2 x*/ and.v $w6, $w3, $w17 /* 7 x 3 x */ and.v $w7, $w3, $w16 /* x 5 x 1 */ lw t0, \rkey * 4(a2) /* next key -> t0 */ or.v $w4, $w6, $w4 /* 7 4 3 0 */ or.v $w5, $w5, $w7 /* 6 5 2 1 */ move.v $w6, $w5 /* 6 5 2 1 */ move.v $w7, $w4 /* 7 4 3 0 */ /* 7 xx 0 */ /* 6 xx 1 */ /* x 5 2 x */ /* x 4 3 x */ vshf.b $w4, $w8, $w8 /* substitute $w8 [7 0] */ and.v $w4, $w4, $w12 vshf.b $w5, $w9, $w9 /* substitute $w9 [6 1] */ and.v $w5, $w5, $w13 vshf.b $w6, $w10, $w10 /* substitute $w10 [5 2] */ and.v $w6, $w6, $w14 vshf.b $w7, $w11, $w11 /* substitute $w11 [4 3] */ and.v $w7, $w7, $w15 or.v $w4, $w4, $w5 or.v $w6, $w6, $w7 or.v $w4, $w4, $w6 srli.w $w1, $w4, 21 /* $w4 >> 21 */ slli.w $w3, $w4, 11 /* $w4 << 11 */ or.v $w1, $w1, $w3 xor.v \x_out, \x_out, $w1 .endm 

рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдирд┐рд╖реНрдХрд░реНрд╖


рдмрд╛рдЗрдХрд╛рд▓-рдЯреА 1 рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд╕рд┐рдордб-рдмреНрд▓реЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ GOST 28147-89 рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд▓рдЧрднрдЧ 350 Mbit / s рдХреА рдбреЗрдЯрд╛ рд░реВрдкрд╛рдВрддрд░рдг рджрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓рддреА рд╣реИ, рдЬреЛ рдХрд┐ рдорд╛рдирдХ рдЖрджреЗрд╢реЛрдВ рдкрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдврд╛рдИ () рд╣реИред рдЪреВрдВрдХрд┐ рдЗрд╕ рдкреНрд░реЛрд╕реЗрд╕рд░ рдореЗрдВ рджреЛ рдХреЛрд░ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП ~ 700 рдПрдордмреАрдкреАрдПрд╕ рдХреА рдЧрддрд┐ рд╕реЗ рд╕реНрдЯреНрд░реАрдо рдХреЛ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдХрд░рдирд╛ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ рд╕рдВрднрд╡ рд╣реИред GOST 28147-89 рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдХреЗ рд╕рд╛рде рдХрдо рд╕реЗ рдХрдо IPsec рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдиреЗ рдЪреИрдирд▓ рдХреЛ рдПрдХ рджреНрд╡реИрдз рдкрд░ ~ 400 рдПрдордмреАрдкреАрдПрд╕ рдХреЗ рдереНрд░реВрдкреБрдЯ рджрд┐рдЦрд╛рдпрд╛ред

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


All Articles