GOST рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбреЛрдореЗрди рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдирдХреНрд╕ рдХреЛ рдХреИрд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ

рдкрд░рд┐рдЪрдп



Kerberos 5 рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдЕрдм рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреА рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдЪрд╛рд░ рд╕реНрддрдВрднреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХрд░рддрд╛ рд╣реИ:


  1. рд╕рдордорд┐рдд рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди;
  2. рд╣реИрд╢;
  3. рдИрдбреАрдПрд╕;
  4. рдерд░реНрдб рдЯреНрд░рд╕реНрдЯреЗрдб рдкрд╛рд░реНрдЯреАред

рдкрд╛рдВрдЪрд╡реЗрдВ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рдирд╛, рдЕрдм рдЕрд╕рдордорд┐рдд рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди (рдЗрд▓реЗрдХреНрдЯреНрд░реЙрдирд┐рдХ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рд▓рд┐рдП) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред рдХрд░реНрдмреЗрд░реЛрд╕ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рд╡рд░реНрдгрди рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред


рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди, рд╣реИрд╢рд┐рдВрдЧ рдФрд░ рдбрд┐рдЬрд┐рдЯрд▓ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреА рд╕рдВрдЦреНрдпрд╛, рдЬреЛ рдЗрд╕ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рддрдирд╛ рдореИрдВ рдЪрд╛рд╣реВрдВрдЧрд╛ рдЙрддрдирд╛ рдмрдбрд╝рд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдпрд╣ рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдХреИрд╕реЗ рдЬреЛрдбрд╝рдирд╛ рд╣реИ рдЖрд╕рд╛рди рдФрд░ рд╕рд░рд▓ рдПрдордЖрдИрдЯреА рджреНрд╡рд╛рд░рд╛ рдЗрд╕ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рд╕реНрд╡рдпрдВ рдХреЗ рдПрд▓реНрдЧреЛрд░рд┐рджрдоред рд╣рдо рдЕрдкрдиреЗ рдШрд░реЗрд▓реВ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдЬреЛрдбрд╝реЗрдВрдЧреЗ: GOST 28147-89 (рдЙрд░реНрдл рдореИрдЧреНрдорд╛), GOST R 34.11-2012 (рдЙрд░реНрдл Stribog) рдФрд░ GOST R 34.10-2012 (рдореИрдВ рднреА рдЗрд╕рдХреЗ рд▓рд┐рдП рдЙрд░реНрдл тАЛтАЛрдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ :()ред рдЗрди рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╛рдзрд╛рди рдореЗрд░реА рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред рдХреНрд▓рд╛рдЗрдВрдЯ рдХреА рдУрд░ рд╕реЗ, рд╣рдо рд░реБрдЯреЛрдХрди рдИрдбреАрдПрд╕ 2.0 рдореЗрдВ GOST рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдФрд░ рдУрдкрдирдПрд╕рдПрд▓ рдХреЗ рд▓рд┐рдП рдЗрдВрдЬрди GOST рдореЗрдВ рдЙрдирдХреЗ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рд▓реЗрдХрд┐рди рдХреБрдВрдЬреА рдЬрдорд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рд╡рд┐рдХрд▓реНрдк рд╣реИ рдЬрдм рд╡реЗ рд╕реАрдзреЗ рд░реБрддреЛрдХреЗрди рдкрд░ рдЙрддреНрдкрдиреНрди рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдХрднреА рдирд╣реАрдВред рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлрд┐рдХ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рджреМрд░рд╛рди рдЙрд╕рдХреА рд╕реНрдореГрддрд┐ рдХреЛ рди рдЫреЛрдбрд╝реЗрдВ рдЗрд╕ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд▓рд┐рдП, rtengine рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред


рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдЙрди рдореБрдЦреНрдп рд╕реНрдерд╛рдиреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред Src / lib / crypto / directory рдХреЗ рдЕрдВрджрд░ рд╕рдордорд┐рдд рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлреА рдФрд░ рд╣реИрд╢рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╕рднреА рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИрдВред рдЗрд╕рдореЗрдВ рдЗрди рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлрд┐рдХ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ 2 рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИрдВ: рдмрд┐рд▓рд┐рди рдФрд░ рдУрдкрдирд╕реЗрд▓ред рд╕рдордп рдФрд░ рд╕реНрдерд╛рди рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдУрдкреНрд╕реНрдирд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдЬреЛрдбрд╝реЗрдВрдЧреЗ, рдЬрд┐рд╕рдореЗрдВ рд╡реЗ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИрдВ (рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ, рдпрд╛ рд▓рдЧрднрдЧ рд╡рд╣рд╛рдВ, рд▓реЗрдХрд┐рди рдмрд╛рдж рдореЗрдВ рдЙрд╕ рдкрд░ рдФрд░ рдЕрдзрд┐рдХ)ред рдЕрд╕рдордорд┐рдд рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ src / plugins / proputh / pkinit рдкреНрд▓рдЧрдЗрди рдХреЛ рдЯреНрд╡рд┐рдХ рдХрд░рдирд╛ рд╣реЛрдЧрд╛


рдпрджрд┐ рдЖрдкрдиреЗ рдЕрднреА рддрдХ рдХреЗрд░реНрдмрд░реЛрд╕ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдФрд░ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдирд┐рд░реНрджреЗрд╢ рдпрд╣рд╛рдВ рдорд┐рд▓ рд╕рдХрддреЗ рд╣реИрдВ ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд▓реЗрдЦрдХ рдорд╛рдирддрд╛ рд╣реИ рдХрд┐ рдЖрдк AKTIV-TEST.RU рдбреЛрдореЗрди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ


рд╣реИрд╢ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдФрд░ рд╕рдордорд┐рдд рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдЬреЛрдбрд╝рдирд╛


рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рдШреЛрд╖рдгрд╛ рдХреА рдЧрдИ рдереА, рд╣рдо рд╕реНрдХреНрд░реИрдЪ рд╕реЗ рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдФрд░ рд╣реИрд╢рд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдирд╣реАрдВ рд▓рд┐рдЦреЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдУрдкрдирд╕реЗрд▓ рдореЗрдВ рдЗрди рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рддреИрдпрд╛рд░-рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред Openssl рд╕реАрдзреЗ рдШрд░реЗрд▓реВ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЧрддрд┐рд╢реАрд▓рддрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрдЬрди GOST рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирдП рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдФрд░ рдЯреЛрдХрди - rtengine рдкрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


OpenSl рдЗрдВрдЬрди рдЗрдВрдЬрди рдХрд╛ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдкрд░рд┐рдЪрдп рдФрд░ рдЗрдВрдЬрди GOST рдХреЛ рдЬреЛрдбрд╝рдирд╛


рдЦреБрд▓рддрд╛ рдореЗрдВ рдЗрдВрдЬрди рдПрдХ рдЫреЛрдЯрд╛ рдЧрддрд┐рд╢реАрд▓ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ рдЬреЛ рдорд╛рдВрдЧ рдкрд░ рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдЦреБрд▓рддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдРрд╕реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдкреНрд░рддреАрдХ (рдХрд╛рд░реНрдп) рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рдкрддреНрд░ рдореЗрдВ, рд╣рдо рдЗрдВрдЬрди рдЧреЛрд╕реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рд╕рдореЗрдВ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдШрд░реЗрд▓реВ рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлрд╝рд┐рдХ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рд╢рд╛рдорд┐рд▓ рд╣реИрдВред


рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реНрдерд╛рдкрдирд╛ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рд╣реИ, рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЖрдЧреЗ рдмрдврд╝рддреА рд╣реИ:


  1. рдЗрд╕ рдЗрдВрдЬрди рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ ред


  2. рдЗрд╕рдХреЗ рд╕рд╛рде рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдмрдирд╛рдПрдВ (mkdir build && cd build && cmake ... && make):


    mkdir build cd build cmake .. make 

  3. рдмрд┐рди рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ (рдЬреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд░реВрдЯ рд╕реВрдЪреА рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВрдЧреЗ !!!) рдПрдХ рдЧрддрд┐рд╢реАрд▓ рдкреБрд╕реНрддрдХрд╛рд▓рдп gost.so рд╣реЛрдЧрд╛ - рдпрд╣ рд╣рдорд╛рд░рд╛ рдЗрдВрдЬрди рд╣реИред рдЗрд╕реЗ рдЙрд╕ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ рд▓реЗ рдЬрд╛рдирд╛ рд╣реЛрдЧрд╛ рдЬрд╣рд╛рдБ рдкрд░ рдУрдкрдирд╕реНрдХреНрд▓ рдЗрдВрдЬрди рдХреЛ рд╕реНрдЯреЛрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрддрд╛ рд▓рдЧрд╛рдПрдБ:


     openssl version -a | grep ENGINESDIR 

  4. рдпрд╣ рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рддрдХ рд╣реИ - рдЖрдкрдХреЛ рдУрдкрдирд╕реЗрд▓ рдХреЛ рдпрд╣ рдмрддрд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдХрд┐ рджрд┐рдпрд╛ рдЧрдпрд╛ рдЗрдВрдЬрди рдХрд╣рд╛рдВ рд╣реИ рдФрд░ рдЗрд╕реЗ рдХреНрдпрд╛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдк рдЗрд╕реЗ opensl.cnf рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдХреЛ рдмрджрд▓рдХрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЬрд┐рд╕ рд╕реНрдерд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:


     openssl version -a | grep OPENSSLDIR 

    рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдВрдд рдореЗрдВ рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд╛рдордЧреНрд░реА рдбрд╛рд▓рдиреА рд╣реЛрдЧреА:


     #     openssl_conf = openssl_def ... #    # OpenSSL default section [openssl_def] engines = engine_section # Engine section [engine_section] gost = gost_section # Engine gost section [gost_section] engine_id = gost dynamic_path = /path/to/engines/dir/with/gost.so default_algorithms = ALL init = 0 


рдЙрд╕рдХреЗ рдмрд╛рдж, рдпрд╣ рдЗрдВрдЬрди рдУрдкрдирд╕реЗрд▓ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЖрдк рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, GOST R 34.10-2012 рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдПрдХ рдирд┐рдЬреА рдХреБрдВрдЬреА рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


 openssl genpkey -engine gost -algorithm gost2012_512 -pkeyopt paramset:A -out client_key.pem 

-рдЧрд╛рдЗрдирд┐рди рдзреНрд╡рдЬ рдХреЗрд╡рд▓ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХрд╛рдо рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐рд╕ рдЗрдВрдЬрди рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ GOST R 34.10-2012 рдХреЗ рд▓рд┐рдП рдкреНрд░рдореБрдЦ рдкреАрдврд╝реА рдХрд╛ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рджрд┐рдЦрд╛рдИ рджреЗред


рд╣реИрд╢ рдПрд▓реНрдЧреЛрд░рд┐рдердо рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


рдЖрдЗрдП рд╕рд░рд▓рддрдо рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ - рд╕реНрдЯреНрд░рд┐рдмреЙрдЧ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рдеред рдХреЗрд░рдмрд░реЛрд╕ рдХрд╛ рд╣реИрд╢рд┐рдВрдЧ рдФрд░ рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рдмреАрдЪ рдПрдХ рдордЬрдмреВрдд рд╕рдВрдмрдВрдз рд╣реИ, рдЕрд░реНрдерд╛рдд, рдЖрдк рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЪреБрди рдФрд░ рдЪреБрди рдирд╣реАрдВ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд╣реИрд╢рд┐рдВрдЧ рдЕрдиреНрдп рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╣реИрд╢ рдФрд░ рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рдПрдХреАрдХреГрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдореБрдЭреЗ рдЬреНрдЮрд╛рдд рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдирд┐рдпрдо рдореМрдЬреВрдж рд╣реИрдВ - рдЖрдЗрдП рд╕реНрдЯреНрд░реАрдм рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдФрд░ рдПрдИрдПрд╕ рдХрд╛ рд╕рдВрдпреЛрдЬрди рдмрдирд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред


  1. рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ рдХрдиреЗрдХреНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЖрдЗрдП рдкрд╣рд▓реЗ рдПрдХ рдЫреЛрдЯреА рд╕реА gost_helper рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдмрдирд╛рдПрдВ рдЬрд┐рд╕рдореЗрдВ рдЦреБрд▓рдиреЗ рдореЗрдВ рдЗрдВрдЬрди рдХрд╛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдлрдВрдХреНрд╢рди рд╣реЛрдЧрд╛, рд╕рд╛рде рд╣реА рдХреБрдЫ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдЬреЛ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╣реИрд╢рд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рд╕рдВрджрд░реНрднреЛрдВ рдХреЛ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ - рдпрд╣ рд╣рдореЗрдВ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ред рд╣рдо рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ gost_helper рдирд╛рдо рджреЗрддреЗ рд╣реИрдВ рдФрд░ src / lib / crypto / рдЦреБрд▓рдиреЗ / рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдпреБрдХреНрдд рд╣реЗрдбрд░ рдФрд░ рд╕реЛрд░реНрд╕ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рддреЗ рд╣реИрдВ:


     // gost_helper.h #include <openssl/evp.h> //    GOST void krb5int_init_gost(); //  ,     const EVP_MD * EVP_gostR3411_2012_256(); const EVP_MD * EVP_gostR3411_2012_512(); // gost_helper.c #include "gost_helper.h" #include <openssl/engine.h> //     static ENGINE *eng = NULL; void krb5int_init_gost() { //    ,      if (eng) return; OPENSSL_add_all_algorithms_conf(); ERR_load_crypto_strings(); if (!(eng = ENGINE_by_id("gost"))) { printf("Engine gost doesn't exist"); return; } ENGINE_init(eng); ENGINE_set_default(eng, ENGINE_METHOD_ALL); } const EVP_MD * EVP_gostR3411_2012_256() { krb5int_init_gost(); return EVP_get_digestbynid(NID_id_GostR3411_2012_256); } const EVP_MD * EVP_gostR3411_2012_512() { krb5int_init_gost(); return EVP_get_digestbynid(NID_id_GostR3411_2012_512); } 

  2. рд╕рд╣рд╛рдпрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдореЗрдХрдлрд╛рдЗрд▓ рдореЗрдВ рдЗрд╕рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рдиреЗ рдФрд░ рдЗрд╕рдХреА рдлрд╝рд╛рдЗрд▓ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬреЛрдбрд╝реЗрдВ:


     #    src/lib/crypto/openssl/Makefile.in      : STLIBOBJS=\ hmac.o \ ... stubs.o \ gost_helper.o OBJS=\ $(OUTPRE)hmac.$(OBJEXT) \ ... $(OUTPRE)stubs.$(OBJEXT) \ $(OUTPRE)gost_helper$(OBJEXT) SRCS=\ $(srcdir)/hmac.c \ ... $(srcdir)/stubs.c \ $(srcdir)/gost_helper.c #    src/lib/crypto/openssl/deps ,         : gost_helper.so gost_helper.po $(OUTPRE)gost_helper.$(OBJEXT): $(BUILDTOP)/include/autoconf.h \ $(BUILDTOP)/include/krb5/krb5.h $(BUILDTOP)/include/osconf.h \ $(BUILDTOP)/include/profile.h $(COM_ERR_DEPS) $(top_srcdir)/include/k5-buf.h \ $(top_srcdir)/include/k5-err.h $(top_srcdir)/include/k5-gmt_mktime.h \ $(top_srcdir)/include/k5-int-pkinit.h $(top_srcdir)/include/k5-int.h \ $(top_srcdir)/include/k5-platform.h $(top_srcdir)/include/k5-plugin.h \ $(top_srcdir)/include/k5-thread.h $(top_srcdir)/include/k5-trace.h \ $(top_srcdir)/include/krb5.h $(top_srcdir)/include/krb5/authdata_plugin.h \ $(top_srcdir)/include/krb5/plugin.h $(top_srcdir)/include/port-sockets.h \ gost_helper.c gost_helper.h 

  3. рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдХрдиреЗрдХреНрдЯ рдХрд░рддреЗ рд╕рдордп, рд╣рдореЗрдВ рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд╣реЗрдбрд░ рдкрд░ рдХреБрдЫ рдлрд╛рдЗрд▓реЛрдВ рдХреА рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рдмрд╣реБрдд рд╕рд░рд▓рддрд╛ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рд▓рдХреНрд╖реНрдп рдкрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдЖрдкрдХреЛ рдбрд┐рдкреНрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд┐рд░реНрднрд░рддрд╛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ rel / path / to / gost_helper.h рдкрд░ рдирд┐рд░реНрднрд░рддрд╛ рджрд░реНрдЬ рдХреА рдЬрд╛рддреА рд╣реИ ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, src / lib / crypto / opensl / hash_provider / deps рдореЗрдВ рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:


     hash_evp.so hash_evp.po $(OUTPRE)hash_evp.$(OBJEXT): \ $(BUILDTOP)/include/autoconf.h $(BUILDTOP)/include/krb5/krb5.h \ ... $(srcdir)/../gost_helper.h hash_evp.c 

    рд▓реЗрдЦ рдореЗрдВ рд╕реНрдерд╛рди рдмрдЪрд╛рдиреЗ рдФрд░ рдЕрдкрдиреЗ рджрд┐рдорд╛рдЧ рдХреЛ рд▓рдВрдмрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЕрдм рдЗрд╕ рдкрд░ рдзреНрдпрд╛рди рдирд╣реАрдВ рджреВрдВрдЧрд╛: рд╕рд╛рд╡рдзрд╛рди рдФрд░ рд╕рд╛рд╡рдзрд╛рди рд░рд╣реЗрдВ!


  4. рдЕрдм рд╣реИрд╢ рдлрд╝рдВрдХреНрд╢рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЬреЛрдбрд╝реЗрдВ, рдЙрдирдХреЗ рд╕рднреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди src / lib / crypto / opensl / hash_provider / hash_evp.c рдореЗрдВ рд╣реИрдВ ред рд╡рд╣рд╛рдВ рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛:


     //     deps !!!          #include "crypto_int.h" #include "gost_helper.h" #include <openssl/evp.h> ... static krb5_error_code hash_sha384(const krb5_crypto_iov *data, size_t num_data, krb5_data *output) { return hash_evp(EVP_sha384(), data, num_data, output); } static krb5_error_code hash_stribog256(const krb5_crypto_iov *data, size_t num_data, krb5_data *output) { return hash_evp(EVP_gostR3411_2012_256(), data, num_data, output); } static krb5_error_code hash_stribog512(const krb5_crypto_iov *data, size_t num_data, krb5_data *output) { return hash_evp(EVP_gostR3411_2012_512(), data, num_data, output); } //    /*   --    --      --        --     */ const struct krb5_hash_provider krb5int_hash_sha384 = { "SHA-384", 48, 128, hash_sha384 }; const struct krb5_hash_provider krb5int_hash_stribog256 = { "GOSTR34.11-2012-256", 32, 64, hash_stribog256 }; const struct krb5_hash_provider krb5int_hash_stribog512 = { "GOSTR34.11-2012-512", 64, 64, hash_stribog512 }; 

  5. рдЕрдм рд╣рдореЗрдВ рдкреВрд░реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдЗрди рд╕рдВрджрд░реНрднреЛрдВ рдХреЛ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, src / lib / crypto / krb / crypto_int.h рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЙрдирдХрд╛ рд╡рд┐рд╡рд░рдг рдмрдирд╛рдПрдВред


     //  ,    ,        ,     krb5_hash_provider   -     : ... struct krb5_hash_provider { char hash_name[32]; //  8 size_t hashsize, blocksize; krb5_error_code (*hash)(const krb5_crypto_iov *data, size_t num_data, krb5_data *output); }; ... extern const struct krb5_hash_provider krb5int_hash_sha384; extern const struct krb5_hash_provider krb5int_hash_stribog256; extern const struct krb5_hash_provider krb5int_hash_stribog512; ... 

  6. рд╣рдо Stribog рдФрд░ AES рдмрдВрдбрд▓ рдХреЗ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░реЗрдВрдЧреЗ, рдореИрдХреНрд░реЛрдЬрд╝ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддреЗ рд╣реБрдП рдХрд╣реЗрдВрдЧреЗ рдХрд┐ рд╣рдо CKSUMTYPE_STRIBOG_256_AES256 , CKSUMTYPE_STRIBOG_512_AES256 , ENCTYPE_AES256_CS_STRIBOG_25 , ENCTY256 рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВрдЧреЗред рдЙрдиреНрд╣реЗрдВ рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ рдЯреЗрдореНрдкрд▓реЗрдЯ src / / krb5 / krb5.hin рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:


     #define ENCTYPE_ARCFOUR_HMAC_EXP 0x0018 /**< RFC 4757 */ #define ENCTYPE_CAMELLIA128_CTS_CMAC 0x0019 /**< RFC 6803 */ #define ENCTYPE_CAMELLIA256_CTS_CMAC 0x001a /**< RFC 6803 */ #define ENCTYPE_AES256_CTS_STRIBOG_256 0x001b /**< NO RFC */ #define ENCTYPE_AES256_CTS_STRIBOG_512 0x001c /**< NO RFC */ #define ENCTYPE_UNKNOWN 0x01ff ... #define CKSUMTYPE_CMAC_CAMELLIA256 0x0012 /**< RFC 6803 */ #define CKSUMTYPE_MD5_HMAC_ARCFOUR -137 /* Microsoft netlogon */ #define CKSUMTYPE_HMAC_MD5_ARCFOUR -138 /**< RFC 4757 */ #define CKSUMTYPE_STRIBOG_256_AES256 -139 /**< NO RFC */ #define CKSUMTYPE_STRIBOG_512_AES256 -140 /**< NO RFC */ 

  7. рдЕрдм рдЖрдкрдХреЛ рд╣реИрд╢рд┐рдВрдЧ рдФрд░ рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рджреЛ рдмрдВрдбрд▓реЛрдВ рдФрд░ рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдФрд░ рд╣реИрд╢рд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рджреЛ рдХреНрдпреЛрдВ, рдпрджрд┐ рд╡реЗ рд╕рдорд╛рди рд╣реИрдВ, рддреЛ рдЖрдк рдкреВрдЫреЗрдВ? рдЙрддреНрддрд░: рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛, рдпрд╛ рдпрд╣ рдПрдХ рдРрддрд┐рд╣рд╛рд╕рд┐рдХ рдмреИрд╕рд╛рдЦреА рдпрд╛ рдЕрдиреБрдХреВрд▓рди рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИред рдлрд┐рд░ рднреА, рдЖрдЗрдП рдЖрд╡рд╢реНрдпрдХ рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рдирдИ рд╕рдВрд░рдЪрдирд╛рдПрдБ рдЬреЛрдбрд╝реЗрдВ:


     //   src/lib/crypto/krb/cksumtypes.c          /*   --   --     --       --    --       --       --    "  "   --     --     --   */ const struct krb5_cksumtypes krb5int_cksumtypes_list[] = { ... { CKSUMTYPE_STRIBOG_256_AES256, "stribog-256-aes256", { 0 }, "STRIBOG256 AES256 key", &krb5int_enc_aes256, &krb5int_hash_stribog256, krb5int_etm_checksum, NULL, 64, 32, 0 }, { CKSUMTYPE_STRIBOG_512_AES256, "stribog-512-aes256", { 0 }, "STRIBOG512 AES256 key", &krb5int_enc_aes256, &krb5int_hash_stribog512, krb5int_etm_checksum, NULL, 64, 64, 0 }, }; //   src/lib/crypto/krb/etypes.c         : /*   --   --   --   --   --      --      --           --   ,     --    ,       --    ,       --         --        --    --   */ const struct krb5_keytypes krb5int_enctypes_list[] = { ... { ENCTYPE_AES256_CTS_STRIBOG_256, "aes256-cts-stribog-256", { "aes256-stribog256" }, "AES-256 CTS mode with 256-bit stribog", &krb5int_enc_aes256, &krb5int_hash_stribog256, 16, krb5int_aes2_crypto_length, krb5int_etm_encrypt, krb5int_etm_decrypt, krb5int_aes2_string_to_key, k5_rand2key_direct, krb5int_aes2_prf, CKSUMTYPE_STRIBOG_256_AES256, 0 /*flags*/, 256 }, { ENCTYPE_AES256_CTS_STRIBOG_512, "aes256-cts-stribog-512", { "aes256-stribog512" }, "AES-256 CTS mode with 512-bit stribog", &krb5int_enc_aes256, &krb5int_hash_stribog512, 16, krb5int_aes2_crypto_length, krb5int_etm_encrypt, krb5int_etm_decrypt, krb5int_aes2_string_to_key, k5_rand2key_direct, krb5int_aes2_prf, CKSUMTYPE_STRIBOG_512_AES256, 0 /*flags*/, 256 }, }; 

  8. рдпрд╣ рд╕рдм рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдирд╣реАрдВ! рдлрд┐рд░ рдРрд╕реА рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ рдЬреЛ рдХреЗрд╡рд▓ рдбрд┐рдмрдЧрд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреА, рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдХреЗ рдмрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рдерд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрдкрд░реЛрдХреНрдд рд╕рдВрд░рдЪрдирд╛рдУрдВ рдореЗрдВ рдЕрдиреНрдп рдлрд╝рдВрдХреНрд╢рди рдкреЙрдЗрдВрдЯрд░реНрд╕, рд▓реЗрдХрд┐рди рд╣рдо рдпрд╣ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рддрд░реАрдХреЗ рд╕реЗ рдЬрд╛рдПрдВрдЧреЗ рдХрд┐ рд░рд╛рд╕реНрддреЗ рдореЗрдВ рдФрд░ рдХреНрдпрд╛ рддрдп рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореИрдВрдиреЗ рдЗрди рд╕рднреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЗрд╡рд▓ рдбрд┐рдмрдЧрд░ рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рд╕реАрдЦрд╛:


     //   src/lib/crypto/openssl/hmac.c    map_digest --    -   .         .  : #include "crypto_int.h" #include "gost_helper.h" #include <openssl/hmac.h> #include <openssl/evp.h> static const EVP_MD * map_digest(const struct krb5_hash_provider *hash) { if (!strncmp(hash->hash_name, "SHA1",4)) return EVP_sha1(); ... else if (!strncmp(hash->hash_name, "GOSTR34.11-2012-256", 19)) return EVP_gostR3411_2012_256(); else if (!strncmp(hash->hash_name, "GOSTR34.11-2012-512", 19)) return EVP_gostR3411_2012_512(); else return NULL; } //   src/lib/crypto/openssl/pbkdf2.c  krb5int_pbkdf2_hmac,        : krb5_error_code krb5int_pbkdf2_hmac(const struct krb5_hash_provider *hash, const krb5_data *out, unsigned long count, const krb5_data *pass, const krb5_data *salt) { const EVP_MD *md = NULL; /* Get the message digest handle corresponding to the hash. */ if (hash == &krb5int_hash_sha1) md = EVP_sha1(); ... else if (hash == &krb5int_hash_stribog256) md = EVP_gostR3411_2012_256(); else if (hash == &krb5int_hash_stribog512) md = EVP_gostR3411_2012_512(); ... return 0; } //   src/lib/krb5/krb/init_ctx.c      ,   : static krb5_enctype default_enctype_list[] = { ... ENCTYPE_AES256_CTS_STRIBOG_256, ENCTYPE_AES256_CTS_STRIBOG_512, 0 }; 


рдЗрди рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рдмрд╛рдж, рдЖрдк рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо рд╡рд╣ рд╕рдм рдХреБрдЫ рдПрдХрддреНрд░ рдХрд░реЗрдВрдЧреЗ рдЬреЛ рд╣рдордиреЗ рдХрд┐рдпрд╛ рд╣реИред


 autoconf ./configure --with-crypto-impl=openssl #     openssl make sudo make install 

рдЕрдм рдЪреЗрдХ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рд╣рдо рдЙрди рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХрд╛ рдЬрдмрд░рди рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдордиреЗ рдХреЗрд░реНрдмрд░реЛрд╕ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдп рдХрд░реЗрдВ:


  1. рд░реЛрдХреЗрдВ krb5kdc:


     service krb5-kdc stop 

  2. рд╣рдо kdc.conf рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдХреЛ рдареАрдХ рдХрд░реЗрдВрдЧреЗ (рдореЗрд░реЗ рдкрд╛рд╕ /usr/local/var/krb5kdc/kdc.conf рд╣реИ)ред рдирдП рд╢реБрд░реВ рдХрд┐рдП рдЧрдП рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдордЬрдмреВрд░ рд╣реИрд╢рд┐рдВрдЧ рдХреЛ рд╕реЗрдЯ рдХрд░реЗрдВ:


     [realms] AKTIV-TEST.RU = { master_key_type = aes256-stribog512 supported_enctypes = aes256-stribog512:normal default_tgs_enctypes = aes256-stribog512 default_tkt_enctypes = aes256-stribog512 permitted_enctypes = aes256-stribog512 } #       256  

  3. рд╕рдВрдкреВрд░реНрдг krb5.conf рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рдорд╛рди рдкрд░рд┐рд╡рд░реНрддрди (I / itc / krb5.conf рдкрд░ рд╣реИ):


     [libdefaults] supported_enctypes = aes256-stribog512:normal default_tgs_enctypes = aes256-stribog512 default_tkt_enctypes = aes256-stribog512 permitted_enctypes = aes256-stribog512 #      256  

  4. рдЗрд╕рдХреЗ рдмрд╛рдж, krb5kdc рдЪрд▓рд╛рдПрдВ рдЕрдЧрд░ рдорд╛рд╕реНрдЯрд░_рдХреА рдмрджрд▓ рдЬрд╛рддреА рд╣реИ, рддреЛ рдЖрдкрдХреЛ krb5_newrealm рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдлрд┐рд░ рд╕реЗ рдкреНрд░рд┐рдВрд╕рд┐рдкрд▓ рдбреЗрдЯрд╛рдмреЗрд╕ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ред


  5. рдЙрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдкреНрд░рд┐рдВрд╕рд┐рдкрд▓ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдЖрдк рдХрд╛рдо рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХрд┐рдирд┐рдЯ рдХреЗ рд╕рд╛рде рдкреНрд░рдорд╛рдгрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред


  6. рд╣рдо рдпрд╣ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░реЗрдВрдЧреЗ рдХрд┐ рд╣реИрд╢рд┐рдВрдЧ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдПрд▓реНрдЧреЛрд░рд┐рдердо рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╣реЛрддрд╛ рд╣реИред
    klist -e рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред



рдпрджрд┐ рд╕реЗрд╡рд╛ рд╢реБрд░реВ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рддреЛ рдЗрд╕реЗ src / kdc / krb5kdc рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд░реВрдЯ рдХреЗ рддрд╣рдд рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рд╕рдм рдХреБрдЫ рд╢реБрд░реВ рд╣реБрдЖ, рддреЛ рдпрд╣ рд╕реБрдЪрд╛рд░реВ рд░реВрдк рд╕реЗ рдЪрд▓рд╛ рдЧрдпрд╛ - рдмрдзрд╛рдИ! рдЕрдиреНрдпрдерд╛ - рдЕрдлрд╕реЛрд╕, рдореИрдВ рд╕рднреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд░рд╛рдордмрд╛рдг рдкреЗрд╢рдХрд╢ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдПрдХ "рдЫреЛрдЯреЗ" рдирд┐рд░реНрджреЗрд╢ рдХреА рдкреЗрд╢рдХрд╢ рдХрд░рддрд╛ рд╣реВрдВ рдЬрд┐рд╕рдореЗрдВ рдореВрд▓ рдХрджрдо рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЛ рдХрд░рдмрд░реЛрд╕ рдореЗрдВ рдирдП рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЗрдирд╛ рд╣реЛрдЧрд╛ред рдФрд░ рдЕрдЧрд░ рдЖрдкрдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ - рдЬреАрдбреАрдмреА рдЙрдард╛рдПрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдЧрд▓рдд рд╣реИред рдореИрдВ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдХреБрдЫ рд╕реБрдЭрд╛рд╡ рджреЗ рд╕рдХрддрд╛ рд╣реВрдВ:


  1. рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдбрд┐рдмрдЧ рдореЛрдб рдореЗрдВ рдПрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ ./configure CFLAGS = "-g -O0";
  2. krb5kdc рдХреЛ -n рдлреНрд▓реИрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдореЗрдВ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ;
  3. рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рдЗрд╕ рдкрд░ рдирд╣реАрдВ рдЖрдпрд╛ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рдЕрднреА рднреА рдЕрд╕рдордорд┐рдд рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдЖрдпрд╛ рдерд╛) - рдЖрдкрдХреЛ рдУрдкрдирд╕реЗрд▓ рдбреАрдмрдЧрд┐рдВрдЧ рдкреНрд░рддреАрдХреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ - рдпрд╛ рддреЛ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╕реЗ рдЙрдиреНрд╣реЗрдВ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ рдпрд╛ рдбреАрдмрдЧрд┐рдВрдЧ рдкреНрд░рддреАрдХреЛрдВ рдХреЗ рд╕рд╛рде рд╕реНрд░реЛрдд рд╕реЗ рдУрдкрдирд╕реЗрд▓ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ;
  4. рд╡рд╣реА рдЧреЛрд╕реНрдЯ рдЗрдВрдЬрди рдХреЗ рд▓рд┐рдП рдЬрд╛рддрд╛ рд╣реИред

рдпреБрдХреНрддрд┐рдпреЛрдВ рдХреЗ рдЗрд╕ рд╕реЗрдЯ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдЖрдкрдХреЗ рд▓рд┐рдП "рдЕрдЬреНрдЮрд╛рдд" рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рд╕рдордп рдмрд░реНрдмрд╛рдж рдХрд░рдиреЗ рд╕реЗ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред


рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


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


  1. рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдЕрдкрдиреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп libk5crypto рдореЗрдВ рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ src / lib / crypto / krb / crypto_int.h рдореЗрдВ рдЙрдирдХрд╛ рд╡рд░реНрдгрди рдХрд░рдХреЗ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВред


     ... extern const struct krb5_enc_provider krb5int_enc_camellia256; extern const struct krb5_enc_provider krb5int_enc_gost89; ... 

  2. рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ src / lib / crypto / opensl / enc_provider рд╕реНрд░реЛрдд gost.c рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реЛрддрд╛ рд╣реИ (рдореИрдВрдиреЗ рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдбреЗрд╕ рдПрд▓реНрдЧреЛрд░рд┐рдердо рдХрд╛ рд╕реНрд░реЛрдд рд▓рд┐рдпрд╛)ред рдпрд╣ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рд╣рдо рдХреЗрд╡рд▓ cbc рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдореЛрдб рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╕реНрд╡-рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдЖрдк рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдореЛрдб рдХреЛ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ:


     #include "crypto_int.h" #include "gost_helper.h" #include <openssl/evp.h> #define BLOCK_SIZE 8 static krb5_error_code krb5int_gost_encrypt(krb5_key key, const krb5_data *ivec, krb5_crypto_iov *data, size_t num_data) { int ret, olen = BLOCK_SIZE; unsigned char iblock[BLOCK_SIZE], oblock[BLOCK_SIZE]; struct iov_cursor cursor; EVP_CIPHER_CTX *ctx; //          ,   krb5int_gost_encrypt,    : krb5int_init_gost(); ctx = EVP_CIPHER_CTX_new(); if (ctx == NULL) return ENOMEM; ret = EVP_EncryptInit_ex(ctx, EVP_get_cipherbynid(NID_gost89_cbc), NULL, key->keyblock.contents, (ivec) ? (unsigned char*)ivec->data : NULL); if (!ret) { EVP_CIPHER_CTX_free(ctx); return KRB5_CRYPTO_INTERNAL; } EVP_CIPHER_CTX_set_padding(ctx,0); k5_iov_cursor_init(&cursor, data, num_data, BLOCK_SIZE, FALSE); while (k5_iov_cursor_get(&cursor, iblock)) { ret = EVP_EncryptUpdate(ctx, oblock, &olen, iblock, BLOCK_SIZE); if (!ret) break; k5_iov_cursor_put(&cursor, oblock); } if (ivec != NULL) memcpy(ivec->data, oblock, BLOCK_SIZE); EVP_CIPHER_CTX_free(ctx); zap(iblock, sizeof(iblock)); zap(oblock, sizeof(oblock)); if (ret != 1) return KRB5_CRYPTO_INTERNAL; return 0; } static krb5_error_code krb5int_gost_decrypt(krb5_key key, const krb5_data *ivec, krb5_crypto_iov *data, size_t num_data) { int ret, olen = BLOCK_SIZE; unsigned char iblock[BLOCK_SIZE], oblock[BLOCK_SIZE]; struct iov_cursor cursor; EVP_CIPHER_CTX *ctx; krb5int_init_gost(); ctx = EVP_CIPHER_CTX_new(); if (ctx == NULL) return ENOMEM; ret = EVP_DecryptInit_ex(ctx, EVP_get_cipherbynid(NID_gost89_cbc), NULL, key->keyblock.contents, (ivec) ? (unsigned char*)ivec->data : NULL); if (!ret) { EVP_CIPHER_CTX_free(ctx); return KRB5_CRYPTO_INTERNAL; } EVP_CIPHER_CTX_set_padding(ctx,0); k5_iov_cursor_init(&cursor, data, num_data, BLOCK_SIZE, FALSE); while (k5_iov_cursor_get(&cursor, iblock)) { ret = EVP_DecryptUpdate(ctx, oblock, &olen, (unsigned char *)iblock, BLOCK_SIZE); if (!ret) break; k5_iov_cursor_put(&cursor, oblock); } if (ivec != NULL) memcpy(ivec->data, iblock, BLOCK_SIZE); EVP_CIPHER_CTX_free(ctx); zap(iblock, sizeof(iblock)); zap(oblock, sizeof(oblock)); if (ret != 1) return KRB5_CRYPTO_INTERNAL; return 0; } static krb5_error_code krb5int_gost_init_state (const krb5_keyblock *key, krb5_keyusage usage, krb5_data *state) { state->length = 8; state->data = (void *) malloc(8); if (state->data == NULL) return ENOMEM; memset(state->data, 0, state->length); return 0; } static void krb5int_gost_free_state(krb5_data *state) { free(state->data); *state = empty_data(); } /*   --  ,    -- -       --        --      --      --    cbc-mac checksum,      , ..       --       --         */ const struct krb5_enc_provider krb5int_enc_gost89 = { BLOCK_SIZE, 32, 32, krb5int_gost_encrypt, krb5int_gost_decrypt, NULL, krb5int_gost_init_state, krb5int_gost_free_state }; 

  3. Src / lib / crypto / opensl / enc_provider / Makefile.in рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ, рд╣рдо рд╕рдВрдХреЗрдд рджреЗрддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рдирдпрд╛ рд╕реНрд░реЛрдд рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ рд╣реИ:


     STLIBOBJS= \ des.o \ ... gost.o OBJS= \ $(OUTPRE)des.$(OBJEXT) \ ... $(OUTPRE)gost$(OBJEXT) SRCS= \ $(srcdir)/des.c \ ... $(srcdir)/gost.c 

  4. Src / lib / crypto / opensl / enc_provider / deps рдореЗрдВ рдирд┐рд░реНрднрд░рддрд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдордд рднреВрд▓рдирд╛:


     gost.so gost.po $(OUTPRE)gost.$(OBJEXT): $(BUILDTOP)/include/autoconf.h \ $(BUILDTOP)/include/krb5/krb5.h $(BUILDTOP)/include/osconf.h \ $(BUILDTOP)/include/profile.h $(COM_ERR_DEPS) $(srcdir)/../../krb/crypto_int.h \ $(srcdir)/../crypto_mod.h $(top_srcdir)/include/k5-buf.h \ $(top_srcdir)/include/k5-err.h $(top_srcdir)/include/k5-gmt_mktime.h \ $(top_srcdir)/include/k5-int-pkinit.h $(top_srcdir)/include/k5-int.h \ $(top_srcdir)/include/k5-platform.h $(top_srcdir)/include/k5-plugin.h \ $(top_srcdir)/include/k5-thread.h $(top_srcdir)/include/k5-trace.h \ $(top_srcdir)/include/krb5.h $(top_srcdir)/include/krb5/authdata_plugin.h \ $(top_srcdir)/include/krb5/plugin.h $(top_srcdir)/include/port-sockets.h \ $(top_srcdir)/include/socket-utils.h $(srcdir)/../gost_helper.h gost.c 

  5. рдмрдВрдбрд▓ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреЛ src рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВ / рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВ / krb5 / krb5.hin :


     ... #define ENCTYPE_AES256_CTS_STRIBOG_256 0x001b /**< NO RFC */ #define ENCTYPE_AES256_CTS_STRIBOG_512 0x001c /**< NO RFC */ #define ENCTYPE_GOST89_CBC_STRIBOG_256 0x001d /**< SOME GOST */ #define ENCTYPE_GOST89_CBC_STRIBOG_512 0x001e /**< SOME GOST */ #define ENCTYPE_UNKNOWN 0x01ff ... #define CKSUMTYPE_STRIBOG_256_AES256 -139 /**< NO RFC */ #define CKSUMTYPE_STRIBOG_512_AES256 -140 /**< NO RFC */ #define CKSUMTYPE_STRIBOG_256_GOST89 -141 /**< SOME GOST */ #define CKSUMTYPE_STRIBOG_512_GOST89 -142 /**< SOME GOST */ 

  6. рдЖрдЗрдП рд╣рдо рд╣реИрд╢ рдФрд░ рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдлрд╝рдВрдХреНрд╢рди рдмрдВрдбрд▓реЛрдВ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдЕрдВрддрд┐рдо рдЦрдВрдб рдореЗрдВ рд╣реИ:


     // src/lib/crypto/krb/cksumtypes.c const struct krb5_cksumtypes krb5int_cksumtypes_list[] = { ... { CKSUMTYPE_STRIBOG_256_GOST89, "stribog-256-gost89", { 0 }, "STRIBOG256 GOST89 key", &krb5int_enc_gost89, &krb5int_hash_stribog256, krb5int_dk_checksum, NULL, 64, 32, 0 }, { CKSUMTYPE_STRIBOG_512_GOST89, "stribog-512-gost89", { 0 }, "STRIBOG512 GOST89 key", &krb5int_enc_gost89, &krb5int_hash_stribog512, krb5int_dk_checksum, NULL, 64, 64, 0 }, }; // src/lib/crypto/krb/etypes.c //       ,         , ,      aes const struct krb5_keytypes krb5int_enctypes_list[] = { ... { ENCTYPE_GOST89_CBC_STRIBOG_256, "gost89-cbc-stribog-256", { "gost89-stribog256" }, "GOST 28147-89 CBC mode with 256-bit stribog", &krb5int_enc_gost89, &krb5int_hash_stribog256, 16, krb5int_dk_crypto_length, krb5int_dk_encrypt, krb5int_dk_decrypt, krb5int_dk_string_to_key, k5_rand2key_direct, krb5int_dk_prf, CKSUMTYPE_STRIBOG_256_GOST89, 0 /*flags*/, 256 }, { ENCTYPE_GOST89_CBC_STRIBOG_512, "gost89-cbc-stribog-512", { "gost89-stribog512" }, "GOST 28147-89 CBC mode with 512-bit stribog", &krb5int_enc_gost89, &krb5int_hash_stribog512, 16, krb5int_dk_crypto_length, krb5int_dk_encrypt, krb5int_dk_decrypt, krb5int_dk_string_to_key, k5_rand2key_direct, krb5int_dk_prf, CKSUMTYPE_STRIBOG_512_GOST89, 0 /*flags*/, 256 }, }; 

  7. рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдореЛрдб рдХреА рд╕реВрдЪреА рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ src / lib / krb5 / krb / init_ctx.c рдлрд╝рд╛рдЗрд▓ :


     static krb5_enctype default_enctype_list[] = { ... ENCTYPE_AES256_CTS_STRIBOG_256, ENCTYPE_AES256_CTS_STRIBOG_512, ENCTYPE_GOST89_CBC_STRIBOG_256, ENCTYPE_GOST89_CBC_STRIBOG_512, 0 }; 


рдЗрди рдЬреЛрдбрд╝рддреЛрдбрд╝ рдХреЗ рдмрд╛рдж, рдЖрдк рдирдП рдкреЗрд╢ рдХрд┐рдП рдЧрдП рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдкрд░реАрдХреНрд╖рдг рдЕрдВрддрд┐рдо рдЕрдиреБрднрд╛рдЧ рдХреА рддрд░рд╣ рд╣реА рд╣реЛрддрд╛ рд╣реИред рдмрдВрдбрд▓ рдХрд╛ рдирд╛рдо рдПрдХ рдЙрдкрдирд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, gost89-stribog512) рдпрд╛ рд╕реНрд╡рдпрдВ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдирд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, gost89-cbc-stribog-512)ред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЕрдиреНрдпрдерд╛ рдЬреЛ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдХрд╣рд╛ рдерд╛ рдЙрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдордд рднреВрд▓рдирд╛ред


рдПрдХ рдбрд┐рдЬрд┐рдЯрд▓ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЬреЛрдбрд╝рдирд╛


рд╣реБрд░реНрд░реЗ! рд╣рдо рдЗрд╕ рд▓реЗрдЦ рдХреЗ рдЕрдВрддрд┐рдо рдЦрдВрдб рдкрд░ рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВ рдФрд░ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрдирд┐рдХ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рдбрд░реЗрдВ рдирд╣реАрдВ, рдЗрд╕реЗ рдЬреЛрдбрд╝рдирд╛ рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЖрд╕рд╛рди рд╣реИ, рддреЛ рдЪрд▓рд┐рдП рдЬрд▓реНрдж рд╕реЗ рдЬрд▓реНрдж рд╢реБрд░реВ рдХрд░реЗрдВ ... рд╣рд╛рд▓рд╛рдБрдХрд┐ рдирд╣реАрдВ, рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝реА рдЯрд┐рдкреНрдкрдгреА рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВред


рдЕрд╕рдордорд┐рдд рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдПрдХ рдмрд╣реБрдд рднрд╛рд░реА рдЪреАрдЬ рд╣реИред тАУ : , - . ...


, . , , . . . . , . , . , , тАФ . .

рдХреБрдЫ рдЗрд╕ рддрд░рд╣ред , , . : . , , , , , .


openssl ( )


, -, openssl rtengine. GOST, , .


  1. SDK rutoken sdk/openssl/rtengine/bin/ engine.


  2. librtpkcs11ecp.so.


  3. master OpenSC 8cf1e6f


  4. , openssl.cnf:


     #     openssl_conf = openssl_def ... #    # OpenSSL default section [openssl_def] engines = engine_section # Engine section [engine_section] gost = gost_section rtengine = rtengine_section # Engine gost section [gost_section] engine_id = gost dynamic_path = /usr/lib/x86_64-linux-gnu/engines-1.1/gost.so default_algorithms = ALL # Engine rtengine section [rtengine_section] engine_id = rtengine dynamic_path = /path/to/engine/librtengine.so MODULE_PATH = /path/to/module/librtpkcs11ecp.so RAND_TOKEN = pkcs11:manufacturer=Aktiv%20Co.;model=Rutoken%20ECP default_algorithms = CIPHERS, DIGEST, PKEY, RAND 


engine .


, KDC


kerberos . , .


  1. , , , KDC:


     openssl genpkey -engine gost -algorithm gost2012_256 -pkeyopt paramset:B -out CA_key.pem #    openssl req -engine gost -key CA_key.pem -new -x509 -out CA_cert.pem #    openssl genpkey -engine gost -algorithm gost2012_256 -pkeyopt paramset:B -out KDC_key.pem #   KDC openssl req -engine gost -new -out KDC.req -key ./KDC_key.pem #      KDC # !!!     pkinit_extensions    REALM=AKTIV-TEST.RU; export REALM #   KDC CLIENT=127.0.0.1; export CLIENT #   ,     (    KDC).    ,   localhost openssl x509 -engine gost -req -in ./KDC.req -CAkey ./CA_key.pem -CA ./CA_cert.pem -out ./KDC.pem -extfile ./pkinit_extensions -extensions kdc_cert -CAcreateserial #    KDC. sudo cp ./KDC.pem ./KDC_key.pem ./CA_cert.pem /var/lib/krb5kdc #        kdc. 

  2. kdc, , :


     [kdcdefaults] ... pkinit_identity = FILE:/var/lib/krb5kdc/KDC.pem,/var/lib/krb5kdc/KDC_key.pem pkinit_anchors = FILE:/var/lib/krb5kdc/CA_cert.pem 


[libdefaults]
spake_preauth_groups = edwards25519


 3.      : ```bash sudo kadmin.local kadmin.local$: modprinc +requires_preauth user 

  1. . , , : :


    1. , KDC:


       openssl genpkey -engine gost -algorithm gost2012_256 -pkeyopt paramset:B -out client_key.pem #    openssl req -engine gost -new -out client.req -key ./client_key.pem #       

    2. :


       pkcs11-tool --module /path/to/module/librtpkcs11ecp.so --keypairgen --key-type GOSTR3410-2012-256:B -l --id 45 #             id=45 openssl req -engine rtengine -new -key="pkcs11:id=E" -keyform engine -out client.req #         . E -- ascii  45 


  2. :


     REALM=AKTIV-TEST.RU; export REALM #   CLIENT=user; export CLIENT #  ,     openssl x509 -engine gost -CAkey ./CA_key.pem -CA ./CA_cert.pem -req -in ./client.req -extensions client_cert -extfile ./pkinit_extensions -out client.pem openssl x509 -engine gost -in client.pem -out client.crt -outform DER #     PEM   CRT 

  3. : , тАУ :


     sudo cp ./client_key.pem client.pem /etc/krb5 #   pkcs11-tool --module /usr/lib/librtpkcs11ecp.so -l -y cert -w ./client.crt --id 45 #   (     id,   ) 

  4. ( /etc/krb5.conf):


     [libdefaults] ... pkinit_anchors = FILE:/var/lib/krb5kdc/CA_cert.pem #     pkinit_identities = FILE:/etc/krb5/client.pem,/etc/krb5/client_key.pem #     #pkinit_identities = PKCS11:/usr/lib/librtpkcs11ecp.so 


, . ! .



, тАУ - 2 ! src/plugins/preauth/pkinit/pkcs11.h src/plugins/preauth/pkinit/pkinit_crypto_openssl.c


  1. pkcs11.h . тАУ , , . ( ). sdk/pkcs11/include/rtpkcs11t.h . :


     ... #define CKK_TWOFISH (0x21) #define CKK_GOSTR3410 (0x30) #define CKK_GOSTR3411 (0x31) #define CKK_GOST28147 (0x32) #define CKK_VENDOR_DEFINED (1UL << 31) // A mask for new GOST algorithms. // For details visit https://tc26.ru/standarts/perevody/guidelines-the-pkcs-11-extensions-for-implementing-the-gost-r-34-10-2012-and-gost-r-34-11-2012-russian-standards-.html #define NSSCK_VENDOR_PKCS11_RU_TEAM (CKK_VENDOR_DEFINED | 0x54321000) #define CK_VENDOR_PKCS11_RU_TEAM_TK26 NSSCK_VENDOR_PKCS11_RU_TEAM #define CKK_GOSTR3410_512 (CK_VENDOR_PKCS11_RU_TEAM_TK26 | 0x003) ... #define CKM_AES_MAC_GENERAL (0x1084) #define CKM_AES_CBC_PAD (0x1085) #define CKM_GOSTR3410_KEY_PAIR_GEN (0x1200UL) #define CKM_GOSTR3410 (0x1201UL) #define CKM_GOSTR3410_WITH_GOSTR3411 (0x1202UL) #define CKM_GOSTR3410_KEY_WRAP (0x1203UL) #define CKM_GOSTR3410_DERIVE (0x1204UL) #define CKM_GOSTR3410_512_KEY_PAIR_GEN (CK_VENDOR_PKCS11_RU_TEAM_TK26 | 0x005) #define CKM_GOSTR3410_512 (CK_VENDOR_PKCS11_RU_TEAM_TK26 | 0x006) #define CKM_GOSTR3410_12_DERIVE (CK_VENDOR_PKCS11_RU_TEAM_TK26 | 0x007) #define CKM_GOSTR3410_WITH_GOSTR3411_12_256 (CK_VENDOR_PKCS11_RU_TEAM_TK26 | 0x008) #define CKM_GOSTR3410_WITH_GOSTR3411_12_512 (CK_VENDOR_PKCS11_RU_TEAM_TK26 | 0x009) #define CKM_GOSTR3411 (0x1210UL) #define CKM_GOSTR3411_HMAC (0x1211UL) #define CKM_GOSTR3411_12_256 (CK_VENDOR_PKCS11_RU_TEAM_TK26 | 0x012) #define CKM_GOSTR3411_12_512 (CK_VENDOR_PKCS11_RU_TEAM_TK26 | 0x013) #define CKM_GOSTR3411_12_256_HMAC (CK_VENDOR_PKCS11_RU_TEAM_TK26 | 0x014) #define CKM_GOSTR3411_12_512_HMAC (CK_VENDOR_PKCS11_RU_TEAM_TK26 | 0x015) #define CKM_GOST28147_KEY_GEN (0x1220UL) #define CKM_GOST28147_ECB (0x1221UL) #define CKM_GOST28147 (0x1222UL) #define CKM_GOST28147_MAC (0x1223UL) #define CKM_GOST28147_KEY_WRAP (0x1224UL) 

    , .


  2. pkinit_crypto_openssl.c , , . get_key, .. - :


     #include <dirent.h> #include <arpa/inet.h> #include <openssl/engine.h> static ENGINE *eng = NULL; krb5int_init_engines() { if (eng) return; OPENSSL_add_all_algorithms_conf(); ERR_load_crypto_strings(); if (!(eng = ENGINE_by_id("rtengine"))) { printf("Engine rtengine doesn't exist"); return; } ENGINE_init(eng); ENGINE_set_default(eng, ENGINE_METHOD_ALL); if (!(eng = ENGINE_by_id("gost"))) { printf("Engine gost doesn't exist"); return; } ENGINE_init(eng); ENGINE_set_default(eng, ENGINE_METHOD_ALL); } ... get_key(krb5_context context, pkinit_identity_crypto_context id_cryptoctx, char *filename, const char *fsname, EVP_PKEY **retkey, const char *password) { ... krb5_error_code retval; krb5int_init_engines(); ... } ... int pkinit_openssl_init() { /* Initialize OpenSSL. */ ERR_load_crypto_strings(); OpenSSL_add_all_algorithms(); krb5int_init_engines(); return 0; } 

  3. . тАУ RSA , sha1. , . , , . , .. RSA :


     //       krb5_error_code pkinit_find_private_key(pkinit_identity_crypto_context id_cryptoctx, CK_ATTRIBUTE_TYPE usage, CK_OBJECT_HANDLE *objp) { ... true_false = TRUE; attrs[nattrs].type = usage; attrs[nattrs].pValue = &true_false; attrs[nattrs].ulValueLen = sizeof true_false; nattrs++; #endif // keytype = CKK_RSA; // attrs[nattrs].type = CKA_KEY_TYPE; // attrs[nattrs].pValue = &keytype; // attrs[nattrs].ulValueLen = sizeof keytype; // nattrs++; ... } //             : static int ckk_key_to_nid(CK_KEY_TYPE type) { switch(type){ case CKK_GOSTR3410: return NID_id_GostR3410_2012_256; case CKK_GOSTR3410_512: return NID_id_GostR3410_2012_512; default: return NID_rsa; } } // ,     ,     : static int pkinit_get_pkey_type(krb5_context context, pkinit_identity_crypto_context id_cryptoctx) { CK_OBJECT_HANDLE obj; CK_ATTRIBUTE attrs[1]; CK_KEY_TYPE key_type; int r; //  : if (pkinit_open_session(context, id_cryptoctx)) { pkiDebug("can't open pkcs11 session\n"); return NID_rsa; } //   : if (pkinit_find_private_key(id_cryptoctx, CKA_SIGN, &obj)) { return NID_rsa; } //   : attrs[0].type = CKA_KEY_TYPE; attrs[0].pValue = &key_type; attrs[0].ulValueLen = sizeof (key_type); if ((r = id_cryptoctx->p11->C_GetAttributeValue(id_cryptoctx->session, obj, attrs, 1)) != CKR_OK) { pkiDebug("C_GetAttributeValue: %s\n Used RSA\n", pkinit_pkcs11_code_to_text(r)); return NID_rsa; } //   : return ckk_key_to_nid(key_type); } // ,        ,     : static int pkey_to_digest_nid(const EVP_PKEY* const pkey) { switch (EVP_PKEY_id(pkey)) { case NID_id_GostR3410_2012_256: return NID_id_GostR3411_2012_256; case NID_id_GostR3410_2012_512: return NID_id_GostR3411_2012_512; case NID_id_GostR3410_2001: return NID_id_GostR3411_2012_256; default: return NID_sha1; } } // ,       : static int get_digest_nid(krb5_context context, const pkinit_identity_crypto_context id_cryptctx) { int nid; //    (   ),   NID ,    if (id_cryptctx->my_key) { nid = EVP_PKEY_id(id_cryptctx->my_key); } else { nid = pkinit_get_pkey_type(context, id_cryptctx); } switch (nid) { case NID_id_GostR3410_2012_256: return NID_id_GostR3411_2012_256; case NID_id_GostR3410_2012_512: return NID_id_GostR3411_2012_512; case NID_id_GostR3410_2001: return NID_id_GostR3411_2012_256; default: return NID_sha1; } } // ,     : static int get_alg_nid(krb5_context context, const pkinit_identity_crypto_context id_cryptctx) { int nid; if (id_cryptctx->my_key) { nid = EVP_PKEY_id(id_cryptctx->my_key); } else { nid = pkinit_get_pkey_type(context, id_cryptctx); } switch (nid) { case NID_id_GostR3410_2012_256: return NID_id_tc26_signwithdigest_gost3410_2012_256; case NID_id_GostR3410_2012_512: return NID_id_tc26_signwithdigest_gost3410_2012_512; case NID_id_GostR3410_2001: return NID_id_tc26_signwithdigest_gost3410_2012_256; default: return NID_sha1WithRSAEncryption; } } //    : static CK_MECHANISM_TYPE get_mech_type(krb5_context context, const pkinit_identity_crypto_context id_cryptctx) { int nid; if (id_cryptctx->my_key) { nid = EVP_PKEY_id(id_cryptctx->my_key); } else { nid = pkinit_get_pkey_type(context, id_cryptctx); } switch (nid) { case NID_id_GostR3410_2012_256: return CKM_GOSTR3410_WITH_GOSTR3411_12_256; case NID_id_GostR3410_2012_512: return CKM_GOSTR3410_WITH_GOSTR3411_12_512; case NID_id_GostR3410_2001: return CKM_GOSTR3410_WITH_GOSTR3411_12_256; default: return CKM_RSA_PKCS; } } 

  4. cms_signeddata_create create_signature :


     krb5_error_code cms_signeddata_create(krb5_context context, pkinit_plg_crypto_context plg_cryptoctx, pkinit_req_crypto_context req_cryptoctx, pkinit_identity_crypto_context id_cryptoctx, int cms_msg_type, int include_certchain, unsigned char *data, unsigned int data_len, unsigned char **signed_data, unsigned int *signed_data_len) { ... /* Set digest algs */ p7si->digest_alg->algorithm = OBJ_nid2obj( get_digest_nid(context, id_cryptoctx)); ... p7si->digest_enc_alg->algorithm = OBJ_nid2obj(get_alg_nid(context, id_cryptoctx)); ... EVP_DigestInit_ex(ctx, EVP_get_digestbynid(get_digest_nid(context, id_cryptoctx)), NULL); ... alen = (unsigned int )ASN1_item_i2d((ASN1_VALUE *) sk, &abuf, ASN1_ITEM_rptr(PKCS7_ATTR_SIGN)); ... //   ,      (    ): if (id_cryptoctx->pkcs11_method == 1 && get_digest_nid(context, id_cryptoctx) == NID_sha1) { } static krb5_error_code create_signature(unsigned char **sig, unsigned int *sig_len, unsigned char *data, unsigned int data_len, EVP_PKEY *pkey) { ... EVP_SignInit(ctx, EVP_get_digestbynid(pkey_to_digest_nid(pkey))); ... } //       : static krb5_error_code pkinit_sign_data_pkcs11(krb5_context context, pkinit_identity_crypto_context id_cryptoctx, unsigned char *data, unsigned int data_len, unsigned char **sig, unsigned int *sig_len) { ... mech.mechanism = get_mech_type(context, id_cryptoctx); mech.pParameter = NULL; mech.ulParameterLen = 0; ... } 


, ( , , ):


 sudo kinit user 

user, , .


, .

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


All Articles