1024 рдмрд╛рдЗрдЯреНрд╕ рдореЗрдВ AVR рдЕрд╕реЗрдВрдмрд▓рд░ рдкрд░ AES-128 рдФрд░ EAX рдХреЗ рд╕рд╛рде рдмреВрдЯрд▓реЛрдбрд░



рдпрд╛ рдореИрдВ рдХреИрд╕реЗ рдбрд░рдирд╛ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдФрд░ рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЗ рд╕рд╛рде рдкреНрдпрд╛рд░ рдореЗрдВ рдЧрд┐рд░ рдЧрдпрд╛



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



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



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



рдордВрдЪ рдФрд░ рднрд╛рд╖рд╛



рд╣рдордиреЗ ATmega рдкрд░ рд╕рднреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЛ рдХреЗрд╡рд▓ рдЗрд╕рд▓рд┐рдП рдХрд┐рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ CIS рдореЗрдВ рд╡реЗ рдЦрд░реАрджрдирд╛ рдЖрд╕рд╛рди рдФрд░ рд╕рд╕реНрддрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдмрдбрд╝реЛрдВ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рд╕реЗ рд╕рдордЭрд╛, рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рдЫреЛрдЯреА рдЧрд╛рдбрд╝реА рд╣реИ, рдФрд░ рдЗрд╕реЗ рд╕реБрдЪрд╛рд░реВ рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдЕрдЬреАрдм рдХреНрд░рд┐рдпрд╛рдПрдВ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред рд╣рдордиреЗ рдЕрд╕реЗрдВрдмрд▓рд░ рдореЗрдВ рд▓рд┐рдЦрд╛ рдХреНрдпреЛрдВрдХрд┐ рдХрд╛рд░реНрдп рдЧрддрд┐ рдХреЗ рдкреНрд░рддрд┐ рдмреЗрд╣рдж рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рд╣реИрдВред рд╕рдВрдХрд▓рдХ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рдерд╛, рдФрд░ рдХреЛрдб рдХреЗ рдХрдИ рд╡рд░реНрдЧреЛрдВ рдХреА рдЧрдгрдирд╛ рдШрдбрд╝реА рдЪрдХреНрд░реЛрдВ рдкрд░ рдХреА рдЧрдИ рдереАред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреЗрд╡рд▓ рдЕрд╕реЗрдВрдмрд▓рд░ рдореЗрдВ рд╣реА рдЕрд╕рдВрднрд╡ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред



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



рдЕрд╕реЗрдВрдмрд▓рд░ рдореЗрдВ рдХреЛрдИ рдЬрдЯрд┐рд▓ рд╕рд╛рд░ рдирд╣реАрдВ рд╣реИрдВ, рдЬреЛ рдЗрд╕ рдЧреВрдВрдЧреЗ-рд╕рд┐рд░ рдХреА рд╕рд╛рджрдЧреА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, AVR рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдЪрдХреНрд░ рднреА рдирд╣реАрдВ рд╣реИред рдПрдХ рдЪрдХреНрд░ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд░рдЬрд┐рд╕реНрдЯрд░ рд▓реЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕рдореЗрдВ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдбрд╛рд▓реЗрдВ, рд╢рд░реАрд░ рдХреЗ рдЕрдВрдд рдореЗрдВ рдПрдХ рдХреЗ рдмрд╛рдж рдПрдХ рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЛ рдХрдо рдХрд░реЗрдВ рдФрд░, рдЕрдЧрд░ рдЕрднреА рддрдХ 0 рдирд╣реАрдВ рд╣реИ, рддреЛ рд╢рд░реАрд░ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ (рдХреБрдЫ рдЧреЛрдЯреЛ рднрд╛рдЗрдпреЛрдВ рджреНрд╡рд╛рд░рд╛) рдХреВрджреЗрдВред рдЖрдк рдмрд╣реБрдд рдЬрд▓реНрджреА рдРрд╕реЗ рдЕрдЬреАрдм рдбрд┐рдЬрд╛рдЗрдиреЛрдВ рдХреА рдЖрджрдд рдбрд╛рд▓ рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рдбрд░рдирд╛ рдмрдВрдж рдХрд░ рджреЗрддреЗ рд╣реИрдВред



рдмреВрдЯрд▓реЛрдбрд░ рдХреНрдпрд╛ рд╣реИ



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



AVR рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдореЗрдВ, рдмреВрдЯрд▓реЛрдбрд░ рдХреЛ рджреЛ рддрд░реАрдХреЛрдВ рд╕реЗ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - рдЙрд╕ рдкрд░ рдПрдХ рд░реАрд╕реЗрдЯ рд╡реЗрдХреНрдЯрд░ рд╕реЗрдЯ рдХрд░рдХреЗ рдпрд╛ BOOTRST рдлреНрдпреВрдЬ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдХреЗ, рдЬреЛ рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЛ 0 рдкрддреЗ рд╕реЗ рдХрд╛рдо рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдмреВрдЯрд▓реЛрдбрд░ рдХреЗ рдкреНрд░рд╛рд░рдВрдн рдкрддреЗ рд╕реЗ, рдЬрд┐рд╕рдХрд╛ рдЖрдХрд╛рд░ рд╕реЗрдЯ рд╣реИ, рдлрд┐рд░ рд╕реЗ, рдлрд╝реНрдпреВрдЬрд╝ рдореЗрдВред



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



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



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



рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлреА



рдХрд╛рдо рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВрдиреЗ рдХреЛрд░реНрдЯреЗрд░рд╛ рдкрд░ рдбреИрди рдмреЛрдирдЯ рд╕реЗ рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлреА рдкрд╛рдареНрдпрдХреНрд░рдо рдХрд╛ рднрд╛рдЧ 1 рдкреВрд░рд╛ рдХрд┐рдпрд╛ред рдкреНрд░реЛрдлреЗрд╕рд░ рдбреИрди рдиреЗ рд▓рдЧрд╛рддрд╛рд░ рдХрд╣рд╛ рдХрд┐ рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ рдЖрдкрдХреЛ рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлрд┐рдХ рд╕рд┐рд╕реНрдЯрдо рдЦреБрдж рдирд╣реАрдВ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╣ рдкреЗрд╢реЗрд╡рд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рди рдХрд┐ рдкреНрд░рдердо рд╡рд░реНрд╖ рдХреЗ рдЫрд╛рддреНрд░реЛрдВ рдХреЛ рдЕрдкрдиреА рдЫреБрдЯреНрдЯрд┐рдпреЛрдВ рдХреЗ рджреМрд░рд╛рдиред рдмреЗрд╢рдХред рдФрдЪрд┐рддреНрдп рдореЗрдВ, рдореИрдВ рдХрд╣ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдмреВрдЯрд▓реЛрдбрд░ рд╕рднреА рд╣рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдпреЛрдЧреНрдп рдХреЗ рд░реВрдк рдореЗрдВ рддреИрдирд╛рдд рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХрд╛ рдЕрд╕реНрддрд┐рддреНрд╡ рдПрдХ рдмреБрдирд┐рдпрд╛рджреА рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдмреМрджреНрдзрд┐рдХ рд╕рдВрдкрджрд╛ рдХреА рд░рдХреНрд╖рд╛ рдХрд╛ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдЙрдкрд╛рдп рд╣реИред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдПрдХ рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдЕрджреНрдпрддрди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЧрд╣рд░реА рдЦреБрджрд╛рдИ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП, рдСрд╕рд┐рд▓реЛрд╕реНрдХреЛрдк рдореЗрдВ рдЯрдХрд░рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдПрдХ рд╕рдкреНрддрд╛рд╣ рдХреЗ рд▓рд┐рдП рдЦреБрдж рдХреЛ рдкреАрдбрд╝рд╛ рджреЗрдиреА рдЪрд╛рд╣рд┐рдП, "рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕реЛрдЪреЛ, рдЗрд╕рдХреЗ рд╕рд╛рде рдирд░рдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЪреАрдиреА рдХреЛ $ 2000 рдХрд╛ рднреБрдЧрддрд╛рди рдХрд░реВрдВрдЧрд╛, рд╡реЗ рдЗрд╕реЗ рдХрд╛рдЯ рджреЗрдВрдЧреЗ" рдФрд░ рдмрд╕ рдпрд╣реА рдХрд░рддреЗ рд╣реИрдВред рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рд╣реИрдХрд┐рдВрдЧ рдХреА рд▓рд╛рдЧрдд рднреМрддрд┐рдХ рд╣реИрдХрд┐рдВрдЧ рдХреА рд▓рд╛рдЧрдд рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рдФрд░ рдЕрдзрд┐рдХ рдирд╣реАрдВред



рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдПрдХ рдЦреБрд▓реА рдкреНрд░рдгрд╛рд▓реА рд╣реИ, рд╕рднреА рдЗрдВрдЬреАрдирд┐рдпрд░реЛрдВ рдХреЛ рдкрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рд╣реИред рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдУрд╡рд░рдХреНрд▓реЙрдХрд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди рдХрдорд╛рдВрдб рдХреЛ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдХрдо рд╡реЛрд▓реНрдЯреЗрдЬ рдкрд░ рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ "рднреВрд▓" рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рдореЗрдВ рдмрд╣реБрдд рд╣реА рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрдг рдЫреЗрдж рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рд░реИрдо рд╕реЗ рдлреНрд▓реИрд╢ рдореЗрдВ рдХреЛрдб рдХреЛ рд▓рд┐рдЦрдиреЗ рдФрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛, рдЬрдм рдЗрд╕реЗ рдкрдврд╝рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ (рдЙрджрд╛рд╣рд░рдг - ST92F)ред рдпрджрд┐ рдлрд░реНрдорд╡реЗрдпрд░ рдХреЗ рд╕рд┐рд░реНрдл рдПрдХ-рджреЛ рдмрд╛рдЗрдЯреНрд╕ рдХреЛ рдмрджрд▓рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рддреЛ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╡рд┐рд▓рдп рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдлрд░реНрдорд╡реЗрдпрд░ рдореЗрдВ, рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдЕрдкреЗрдХреНрд╖рд┐рдд рд╕рдВрд░рдЪрдирд╛ рд╡рд╛рд▓реЗ рдХреНрд╖реЗрддреНрд░ рд╣реИрдВ - рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдкреНрд░рдпреБрдХреНрдд рдмрд╛рдзрд┐рдд рд╡реИрдХреНрдЯрд░, рдЬреЛ рдЯрд╛рдЗрдк рдХрд░рдХреЗ рдмрд╛рдЗрдЯреНрд╕ рдХреА рдПрдХ рдЬреЛрдбрд╝реА рдХреЛ рдмрджрд▓рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рд╕реАрдмреАрд╕реА / рд╕реАрдЯреАрдЖрд░ рдореЛрдб рдореЗрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдмреНрд▓реЙрдХ рд╕рд┐рдлрд░ рдЕрдкрд░рд┐рд╣рд╛рд░реНрдп рд╣реИред



рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдлрд░реНрдорд╡реЗрдпрд░ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдорд╛рдгрд┐рдХрддрд╛ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдРрд╕реЗ рдХреЛрдб рдХреЗ рдЙрджрд╛рд╣рд░рдг CCM, GCM, EAX рд╣реИрдВред рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ, рдореБрдЭреЗ рдпрд╛рдж рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ EAX рдХреЛ рдХреНрдпреЛрдВ рдЪреБрдирд╛ред рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рдХреЛрдбрд╛рдВрддрд░рдХ рдореЗрдВ рдЗрд╕рдХрд╛ рднрд╡рд┐рд╖реНрдп рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореБрдЭреЗ рд╕рдмрд╕реЗ рд╕рд░рд▓ рд▓рдЧ рд░рд╣рд╛ рдерд╛ред



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



EAX



рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрдВрдЬреАрдирд┐рдпрд░ рдХреЛ рдХрд┐рддрдиреЗ рдкреНрд░рд▓реЗрдЦрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ? рд╡реИрдЬреНрдЮрд╛рдирд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рд╕реЗ рд▓рд┐рдП рдЧрдП рджреЛ рдЪрд┐рддреНрд░ред







рд╣реЗрд▓реНрдкрд░ рдПрд▓реНрдЧреЛрд░рд┐рджрдо

рд╣рдо рдлрд░реНрдорд╡реЗрдпрд░ рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдХреЗ рдЪрд░рдг рдореЗрдВ рдбреЗрдЯрд╛ рд╡реЙрд▓реНрдпреВрдо рдХреА рдмрд╣реБрд▓рддрд╛ рдХреЛ рдмреНрд▓реЙрдХ рдЖрдХрд╛рд░ рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрддреЗ рд╣реИрдВ, рдЬреЛ рдкреИрдб рдлрд╝рдВрдХреНрд╢рди рдХреЛ M ^ B (31) рддрдХ рдХрдо рдХрд░ рджреЗрддрд╛ рд╣реИ рдФрд░ рдЪрд░ P (32) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрднреА рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдореБрдЦреНрдп рдкреАрдврд╝реА рдХреЗ рдЪрд░рдг рдореЗрдВ, рд╣рдо рдирд┐рд░рдВрддрд░ рдПрд▓ (40) рдХреА рдЧрдгрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░, рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдмреАред

"рдЫреЛрдбрд╝рдХрд░ рдпрд╛ рдПрдХ рддреАрд░ рдХреЗ рд╕рд╛рде" (31) рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдмреА рдХреЗрд╡рд▓ рдПрдХреНрд╕ рдХреЗ рдЕрдВрдд рдореЗрдВ рд╣реЛрдЧрд╛ рдПрдоред







рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдкреНрд░рдХреНрд░рд┐рдпрд╛

рдЬрд╣рд╛рдБ M рдЕрдирдПрдиреНрдХреНрд░рд┐рдкреНрдЯреЗрдб рдЯреЗрдХреНрд╕реНрдЯ рд╣реИ, CT ciphertext рд╣реИ, K рдХреБрдВрдЬреА рд╣реИ, N рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рд╡реЗрдХреНрдЯрд░ рд╣реИ, H рд╣реЗрдбрд░ рд╣реИред

рдХреЛрдбрд╛рдВрддрд░рдХ рдореЗрдВ, рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдбрд┐рдХреНрд░рд┐рдкреНрд╢рди рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред



рд╕рдВрджреЗрд╢ рд╢реАрд░реНрд╖рд▓реЗрдЦ H рдХреЛ рд╕реЗрдЯ, рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рдФрд░ рдХреЗрд╡рд▓ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлрд┐рдХ рддрд╛рдХрдд рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рдордЭрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд╢реАрд░реНрд╖рдХ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рд╣реИред рдЕрдм рдЖрдк рдкреНрд░рдореБрдЦ рдкреАрдврд╝реА рдХреЗ рдЪрд░рдг рдореЗрдВ рдПрдЪ '(23) рдХреА рдЧрдгрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдпрджрд┐ рдЖрдк 50 рдФрд░ 10 рдХреЗ рд╕рд╛рде 22, 24 рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдорд╣рд╕реВрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ OMAC рдХреЗ рд╕рд╛рде рд╕реБрдкрд░рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдЕрдВрдХ рдмреНрд▓реЙрдХ рдХреА рд▓рдВрдмрд╛рдИ рдХреЗ рдмрд░рд╛рдмрд░ рд▓рдВрдмрд╛рдИ рдХреЗ рд╕рд╛рде рд▓рд╛рдЗрди рдХреЗ рдЕрдВрддрд┐рдо рд╡рд░реНрдг рдкрд░ рдЬрд╛рдПрдЧрд╛ рдФрд░ CBC рдореЗрдВ рдкрд╣рд▓реЗ рдмреНрд▓реЙрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЕрд░реНрдерд╛рдд рдпрд╣ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрди рд▓рд╛рдЗрдиреЛрдВ рдХрд╛ рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдореБрдЦреНрдп рдкреАрдврд╝реА рдХреЗ рдЪрд░рдг рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреЗрд╡рд▓ рд╕рдВрдЦреНрдпрд╛рдПрдБ 0 (L0) рдФрд░ 2 (L2) рдХреЗ рд╕рд╛рде рдПрдиреНрдХреНрд░рд┐рдкреНрдЯреЗрдб рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдХреНрд░рдорд╢рдГ 'N рдФрд░ C' рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдПрд▓ 0, рдмреА, рдФрд░ рдПрди рдХреЗ рд╕рд╛рде рд╣рд╛рде рдкрд░, рдПрди 'рдХреА рдЧрдгрдирд╛ рдИ (рдПрд▓ 0 ^ рдмреА ^ рдПрди) рддрдХ рдХрдо рд╣реЛ рдЬрд╛рддреА рд╣реИред



рддреЛ, рдкреНрд░рдореБрдЦ рдкреАрдврд╝реА рдХреЗ рдЪрд░рдг рдореЗрдВ, рдмреА, рдПрд▓ 0, рдПрд▓ 2, рдПрдЪ 'рдХреА рдЧрдгрдирд╛ рдХреА рдЬрд╛рдПрдЧреАред

рдПрдХ рд╕рд╛рде рд╡реЗ 64 рдмрд╛рдЗрдЯ рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░ рд▓реЗрдВрдЧреЗред



рдПрдИрдПрд╕ 128



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



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



рдореИрдВ рдЪрд╛рдмрд┐рдпрд╛рдБ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рдкреНрд░рднрд╛рд╡реА (рдФрд░ рд╕реБрд░рдХреНрд╖рд┐рдд) рддрд░реАрдХреЗ рд╕реЗ рдирд╣реАрдВ рдЖрдпрд╛ рд╣реВрдВред рд╕рднреА 11 рдЙрджрд╛рд╣рд░рдг рдореБрдЦреНрдп рдкреАрдврд╝реА рдХреЗ рдЪрд░рдг рдореЗрдВ рддреИрдпрд╛рд░ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдЗрд╕ рдХрд╛рд░рдг рд╕реЗ, рдЖрдк рдЪрд╛рдмрд┐рдпреЛрдВ рдХреЗ рдкреВрд░реЗ рдмреНрд▓реЙрдХ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ - рдпрд╣ рдмреНрд░реВрдЯ рдмрд▓ рдХреЗ рдЦрд┐рд▓рд╛рдл рд╕реБрд░рдХреНрд╖рд╛ рдХреЛ рдереЛрдбрд╝рд╛ рдмрдврд╝рд╛ рджреЗрдЧрд╛ рдпрджрд┐ рдХреБрдЫ рдмрд┐рдЧрд╛рдбрд╝рдиреЗ рд╡рд╛рд▓реЗ рдмреАрд╡рд░ рдЗрд╕реЗ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд░рддреЗ рд╣реИрдВред

рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХреБрдВрдЬреА 176 рдмрд╛рдЗрдЯреНрд╕ рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░реЗрдЧреАред рдЧрдгрдирд╛ рдХреА рдЧрдИ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЗ рд╕рд╛рде, рдпрд╣ рдПрдХ рдкреНрд░рдореБрдЦ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ рд╣рдореЗрд╢рд╛ рдХреЗ рд▓рд┐рдП 240 рдмрд╛рдЗрдЯреНрд╕ рдлреНрд▓реИрд╢ рд▓реЗ рдЬрд╛рдПрдЧрд╛ред 784 рдмрдЪреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреН 392 рдХреЛрдбрд╛рдВрддрд░рдХ рдирд┐рд░реНрджреЗрд╢ред



рдПрдИрдПрд╕ рдХрд╛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдФрд░ рд╡рд┐рд╢рд╛рд▓ рд╣рд┐рд╕реНрд╕рд╛ рд▓реБрдХрдЕрдк рдЯреЗрдмрд▓ рд╣реИ - рдмрд╛рдЗрдЯреНрд╕ рдЬреЛ рдЯреЗрдХреНрд╕реНрдЯ рдХреЗ рдмрд╛рдЗрдЯреНрд╕ рдХреЛ рдмрджрд▓ рджреЗрддрд╛ рд╣реИред рдПрдХ рдмрд╛рдЗрдЯ рдореЗрдВ 256 рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдВрдпреЛрдЬрди рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдлреНрд▓реИрд╢ рдореЗрдореЛрд░реА рдХреА рд╕рдорд╛рди рдорд╛рддреНрд░рд╛ рд╣реЛрдЧреАред рдЕрд╕реНрд╡реАрдХрд╛рд░реНрдп! рддреЛ, рд╣рдо рдЗрд╕рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВрдЧреЗред



рд▓реБрдХрдЕрдк рддрд╛рд▓рд┐рдХрд╛ рдХреА рдЧрдгрдирд╛ рдирд┐рдореНрди рдкреНрд░рдХрд╛рд░ рд╕реЗ рдХреА рдЬрд╛рддреА рд╣реИ: рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╡рд╣ рд╕рдВрдЦреНрдпрд╛ рдЬреНрдЮрд╛рдд рдХрд░реЗрдВ рдЬреЛ рддрд╛рд▓рд┐рдХрд╛ рддрддреНрд╡ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╡рд┐рдкрд░реАрдд рд╣реИ, рдлрд┐рд░, рдпрд╣ рд╡рд┐рдкрд░реАрдд рд╣реИ, рдирд┐рдореНрди рдЪрдХреНрдХрд░ рдкрд░рд┐рд╡рд░реНрддрди рд╕реЗ рдЧреБрдЬрд░рддрд╛ рд╣реИ:







x0 ... x7 рдПрдХ рд╡реЗрдХреНрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпреБрддреНрдХреНрд░рдо рд╕рдВрдЦреНрдпрд╛ рд╣реИред рдЖрдкрдХреЛ рдХреЛрдбрд╛рдВрддрд░рдХ рдореЗрдВ рдпрд╣ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рд▓рд╛рдн рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 256 рдмрд╛рдЗрдЯреНрд╕ рд╕реЗ рдХрдо рдореЗрдВ рдлрд┐рдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рдо 88 рдмрд╛рдЗрдЯреНрд╕ рдореЗрдВ рдлрд┐рдЯ рд╣реЛрдВрдЧреЗред рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред



рдирдорд╕реНрддреЗ рджреБрдирд┐рдпрд╛!



рдПрдХ рдЕрд╕реЗрдВрдмрд▓рд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рд╣рдореЗрд╢рд╛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЬреАрд╡рди рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдХрд░ рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдореЗрдВ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХрд╛ рдирд╛рдо рдмрджрд▓рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИ рддрд╛рдХрд┐, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, r16 рдХреЗ рдмрдЬрд╛рдп temp_0 рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХреЗред рдкрд░рдВрдкрд░рд╛ рд╕реЗ, рдореИрдВ 0 рдФрд░ 1 рд░рдЬрд┐рд╕реНрдЯрд░ OP0 рдФрд░ OP1, 2 рдФрд░ 3 - NULL рдФрд░ OxFF (рд╕рдВрдмрдВрдзрд┐рдд рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рдЙрдиреНрд╣реЗрдВ рднрд░рддрд╛ рд╣реВрдВ), рдФрд░ рдмрд╛рдХреА - рдЖрд╡рд╢реНрдпрдХрддрд╛рдиреБрд╕рд╛рд░ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реВрдВред



рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ
.def OP0 = r0 .def OP1 = r1 .def NULL = r2 .def OxFF = r3 .def b0 = r4 .def b1 = r5 .def b2 = r6 .def b3 = r7 .def b4 = r8 .def b5 = r9 .def b6 = r10 .def b7 = r11 .def b8 = r12 .def b9 = r13 .def bA = r14 .def bB = r15 .def bC = r16 .def bD = r17 .def bE = r18 .def bF = r19 .def temp_0 = r20 .def temp_1 = r21 .def temp_2 = r22 .def temp_3 = r23 .def temp_4 = r24 .def temp_5 = r25
      
      





рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдореЗрдВ рдбрд┐рдХреНрд░рд┐рдкреНрдЯ рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рдмреНрд▓реЙрдХ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, 4 рд╡реАрдВ рд╕реЗ 19 рд╡реАрдВ рддрдХ рд▓рдЧрднрдЧ рд╕рднреА рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдерд╛ред рдореИрдВрдиреЗ рдЗрд╕реЗ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдореЗрдВ рдбрд╛рд▓ рджрд┐рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЙрдирдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдмрд╣реБрдд рд╕рд░рд▓ рдФрд░ рддреЗрдЬ рд╣реИред рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░реНрд╕ рдореЗрдВ рд░реИрдо рдХреЗ рд╕рд╛рде рдХреЛрдИ рднреА рдЧрддрд┐рд╡рд┐рдзрд┐ рдЕрднреА рднреА рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреА рд╣реИ, рдХреНрдпреЛрдВ рдЕрдзрд┐рдХ рднреБрдЧрддрд╛рди рдХрд░рддреЗ рд╣реИрдВред



25 рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ 20 рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЧрдгрдирд╛ рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рдХреЗ рдЕрд╕реНрдерд╛рдпреА рднрдВрдбрд╛рд░рдг рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рддрджрдиреБрд╕рд╛рд░ рдирд╛рдо рджрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

26 рд╕реЗ 32 рддрдХ рд╡рд┐рд╢реЗрд╖ 16-рдмрд┐рдЯ рд░рдЬрд┐рд╕реНрдЯрд░ рд╣реИрдВ - рдПрдХреНрд╕, рд╡рд╛рдИ, рдЬреЗрдб, рдореЗрдореЛрд░реА рдПрдбреНрд░реЗрд╕рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдлреНрд▓реИрд╢ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ Z рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рд╕реБрдирд╛ рд╣реИ, рдЙрдирдХреЗ рдкрд╛рд╕ рд╢рд╛рд░реАрд░рд┐рдХ рд░реВрдк рд╕реЗ рд╡реЗрддрди рд╡реГрджреНрдзрд┐, рд╡рд┐рд╕реНрдерд╛рдкрди рдФрд░ рд╡рд┐рд╕реНрдерд╛рдкрди рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рддрдХрдиреАрдХреА рдЙрдкрдХрд░рдг рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП, рдЕрдиреНрдп рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕рдВрднрд╡ рд╣реИ, рдмреБрд░рд╛ рдЕрднреНрдпрд╛рд╕ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдЕрд╕реНрд╡реАрдХрд╛рд░реНрдп glitches рд╣реЛ рд╕рдХрддрд╛ рд╣реИред



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



рд╕реНрдерд┐рд░рд╛рдВрдХ
 .equ PAGE_BYTES = PAGESIZE*2 .equ BOOT_SIZE = 1024 .equ BLOCK_SIZE = 16 .equ PAGES = (FLASHEND+1)/PAGESIZE - BOOT_SIZE/PAGE_BYTES .equ BLOCKS_PER_PAGE = PAGE_BYTES / BLOCK_SIZE .equ KEY_ADDR = (FLASHEND + 1) тАФ (BLOCK_SIZE*(11+4))/2
      
      





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



рд╕реЗрдЯрд┐рдВрдЧреНрд╕
 ;Reset address (Where to jump to if not asked to load boot) .equ RESET_VECT = 0 ;Is 0th flash page used? .equ USE_0th_PAGE = 1 ;////////////////////////PORT SETUP #define check_port \ port_settings \ /* use port letter... */\ /* A / B / C / D / E */\ C, \ /* check status of pin number...*/\ 5, \ /* load boot only if port is... */\ /* (S)ET (1) / (C)LEAR (0) */\ S ;////////////////////////BAUD RATE SETUP .equ Fosc = 16000000 ;clock frequency .equ baud = 19200 ;baud rate .equ UBRR = Fosc / ( BLOCK_SIZE * baud ) - 1 .if high( UBRR ) != 0 .error "Unsupported baud rate setting - high byte of UBRR is not 0!" .endif
      
      





рдЕрдм, рд░реИрдо рдХреЗ рд╕рд╛рде рд╕реМрджрд╛ рдХрд░рддреЗ рд╣реИрдВред AES рдХреЛ рдкреНрд░рддрд┐ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ 256 рдмрд╛рдЗрдЯреНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдбреЗрдЯрд╛ рдмреНрд▓реЙрдХ рдореЗрдВ рдПрдХ рдЖрд░рдВрднреАрдХрд░рдг рд╡реЗрдХреНрдЯрд░ (16 рдмрд╛рдЗрдЯреНрд╕), рд╕реАрдзреЗ рдбреЗрдЯрд╛ (рдкреГрд╖реНрда рдЖрдХрд╛рд░), рдЕрдЦрдВрдбрддрд╛ рдХреА рдЬрд╛рдВрдЪ рдХреЗ рд▓рд┐рдП рд▓реЗрдмрд▓ (16 рдмрд╛рдЗрдЯреНрд╕) рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдбреЗрдЯрд╛ рдХреЛ рдбрд┐рдХреНрд░рд┐рдкреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЖрд░рдВрднреАрдХрд░рдг рд╡реЗрдХреНрдЯрд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рдбрд┐рдХреНрд░рд┐рдкреНрд╢рди рдЕрдиреБрдХреНрд░рдо рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ - рдПрдХ рдФрд░ рдкреГрд╖реНрда рдХрд╛ рдЖрдХрд╛рд░ред



рд╕реНрдореГрддрд┐ рдореЗрдВ рдПрдХ рдЬрдЧрд╣ рдЬрдХрдбрд╝реЗрдВ
 .dseg .org 0x60 SBOX: .byte 256 ;rijndael substitution box ;these three SHOULD be consecutive SAVED_IV: .byte BLOCK_SIZE ;E(L0^N^B) RCVD_PAGE: .byte PAGE_BYTES ;page to be written TAG: .byte BLOCK_SIZE ;initially - precomputed header value ENC_IV: .byte PAGE_BYTES ;IV's to xor with page to decrypt .cseg
      
      





ATmega16 рдкрд░, 64 рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рдПрдХ рдкреГрд╖реНрда рдЖрдХрд╛рд░ рдХреЗ рд╕рд╛рде, RAM рдХреА рдорд╛рддреНрд░рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ 1024 рдореЗрдВ рд╕реЗ 544 рдмрд╛рдЗрдЯреНрд╕ рд╣реИред ATmega8 рдкрд░ рдпрд╣ 416 рд╣реИред рдмрд╣реБрдд рдЕрдзрд┐рдХред рдереЛрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рд░реИрдо рдХреЗ рд╕рд╛рде рдлреНрд▓реИрд╢-рдореЗрдореЛрд░реА рдХреЗ рдмрдбрд╝реЗ рдкрдиреНрдиреЛрдВ рдХреЗ рд╕рд╛рде рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рд╣реЛрддреЗ рд╣реИрдВред рд╢рд╛рдпрдж рдЖрдк рдХреБрдЫ рдХреЗ рд╕рд╛рде рдЖ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреБрдЫ рд▓реЛрдЧреЛрдВ рдХреЛ рдкреВрд░реЗ рдкрд░рд┐рд╡рд╛рд░ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрддрддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред



рд╣рдо рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕рд░ рдирд┐рд░реНрджреЗрд╢реЛрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛ рдЧрдП, рдЪрд▓реЛ рдЕрд╕реЗрдВрдмрд▓рд░ рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВред рдкрд╛рд░рдВрдкрд░рд┐рдХ рд░реВрдк рд╕реЗ рд╕реНрдЯреИрдХ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдХреЗ, рдЗрдВрдЯрд░рдкреНрдЯ рдХреЛ рдмрдВрдж рдХрд░рдХреЗ, NULL рдФрд░ OxFF рд░рдЬрд┐рд╕реНрдЯрд░ рд╕реЗрдЯ рдХрд░рдХреЗ рдФрд░ UART рд╕реЗрдЯрд┐рдВрдЧ рд╕реЗрдЯ рдХрд░рдХреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред



рдкреНрд░рд╛рд░рдВрдн
 BOOT_START: ldi temp_0, low( RAMEND) out SPL, temp_0 ldi temp_0, high(RAMEND) out SPH, temp_0 cli clr NULL mov OxFF, NULL com OxFF ldi temp_0, low( UBRR ) out UBRRH, NULL out UBRRL, temp_0 ldi temp_0, ( 1 << RXEN ) | ( 1 << TXEN ) out UCSRB, temp_0 ldi temp_0, ( 1 << URSEL ) | ( 1 << UCSZ1 ) | ( 1 << UCSZ0 ) out UCSRC, temp_0
      
      





рдЗрд╕ рд╕рдм рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА 6 рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХреЛрдбрд╛рдВрддрд░рдХ рдХрдорд╛рдВрдб рд╣реИрдВ, рдЬреЛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдпрд╛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╣реИрдВред ldi - рд▓реЛрдб, рдореВрд╡ - рдореВрд╡, рдЖрдЙрдЯ - рдЖрдЙрдЯрдкреБрдЯ рд╕реЗ I \ O рд░рдЬрд┐рд╕реНрдЯрд░, рдХреЙрдо - рд╕рдкреНрд▓реАрдореЗрдВрдЯ, рдХреНрд▓реА - рдХреНрд▓рд┐рдпрд░ рдЗрдВрдЯрд░рдкреНрдЯ рдлреНрд▓реИрдЧред рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдХрд╣рд╛, рдЕрд╕реЗрдВрдмрд▓рд░ рдЕрд╕рдВрднрд╡ рдХреЗ рд▓рд┐рдП рд╕рд░рд▓ рд╣реИред рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрд╕реНрдкрд╖реНрдЯ UBRRH (UART рдмреЙрдб рд░реЗрдЯ рд░рдЬрд┐рд╕реНрдЯрд░ рд╣рд╛рдИ-рдмрд╛рдЗрдЯ) рдХреЗ рд╕рд╛рде "рдореБрд╢реНрдХрд┐рд▓" рднрд╛рдЧреЛрдВ рдХреЛ рдбреЗрдЯрд╢реАрдЯ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдпрд╣ рдЙрдкрдХрд░рдг рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╣реИрдВред



рддрдп рдХрд░реЗрдВ рдХрд┐ рдмреВрдЯ рдореЗрдВ рд░рд╣рдирд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдкреЛрд░реНрдЯ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд╛ рдЪрдпрди, рд╡рд┐рдзрд╛рдирд╕рднрд╛ рд╕реНрддрд░ рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:



рдПрдХ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рдореИрдХреНрд░реЛ рдХрд░рддрд╛ рд╣реИред
 .macro port_settings /*PORT LETTER, PIN NUMBER, LOGIC LEVEL*/ cbi DDR@0 , @1 sbi PORT@0, @1 nop sbi@2 PINB, @1 .endmacro
      
      





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



8 рдЯреАрдореЛрдВ рдореЗрдВ рддрддреНрдкрд░рддрд╛ рдФрд░ рдкреНрд░рд╛рдкреНрддрд┐
 ;UART <- 0xC0 ;temp_0 <- UART confirm_and_read: ldi temp_0, 0xC0 ;UART <- temp_0 ;temp_0 <- UART UART_send: sbis UCSRA, UDRE ;skip next command if readiness bit is set rjmp UART_send out UDR, temp_0 ;temp_0 <- UART UART_read: sbis UCSRA, RXC rjmp UART_read in temp_0, UDR ret
      
      





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



88 рдмрд╛рдЗрдЯ рд▓реБрдХрдЕрдк рдЯреЗрдмрд▓



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



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



рдЙрд▓реНрдЯрд╛ рддрддреНрд╡ рдЦреЛрдЬ
  ldi XH, high(SBOX) ;point X to SBOX memory location ldi XL, low( SBOX) ser bF ;first inc will overflow to 0 next_box: inc bF mov temp_1, bF ;save input in temp_1 cp temp_1, NULL ;if it's null - return breq sbox_byte_done ;return here mov OP0, OxFF ;so it overflows look_more: inc OP0 ;try next candidate ;temp_0 <- OP0 * temp_1 (in a Galois field) ;branching is fine, function used in precomputation only finite_multiplication: mov b0, OP0 ;operand 0 (candidate) mov b1, temp_1 ;operand 1 (current byte) ldi temp_2, 0x1B ;0x1B holder clr temp_0 ;multiplication result next_bit: lsr b0 ;operand 0 >> 1 brcc PC+2 ;if lsb of operand 0 was 1 eor temp_0, b1 ;xor operand 1 into result lsl b1 ;operand 1 << 1 brcc PC+2 ;if msb of operand 1 was 1 eor b1, temp_2 ;xor 0x1B into operand 1 cp b0, NULL ;while there are bits in operand0 brne next_bit ;work on it cpi temp_0, 1 ;if multiplication result was not 1 brne look_more ;inverse is in OP0
      
      





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



рдЕрд╕реЗрдореНрдмрд▓рд░ рдПрдлрд╛рдЗрди рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдо
  clr temp_1 ;affine transform result ldi temp_5, 0b11110001 ;matrix producer ldi temp_3, 0b00000001 ;current bit mask process_bit: mov temp_4, OP0 ;multiplicative inverse and temp_4, temp_5 ;and with matrix producer pop_next_bit: lsl temp_4 ;inv&matrix << 1 brcc PC+2 ;if it had msb eor temp_1, temp_3 ;sum bit into result cp temp_4, NULL ;while operand has bits brne pop_next_bit ;work on it lsl temp_3 ;move to next bit lsl temp_5 ;cyclically shift matrix producer brcc PC+2 ;if it had msb ori temp_5, 1 ;move msb to lsb cp temp_3, NULL ;while there are bits left brne process_bit ;process next bit sbox_byte_done: ldi temp_2, 0b01100011 ;0x63 eor temp_1, temp_2 ;xor it into result st X+, temp_1 ;save to memory cpse bF, OxFF ;if we're at last byte rjmp next_box ;we're done
      
      





рдорд┐рд╢рди рдкреВрд░рд╛ рд╣реБрдЖред







рдпрд╣ рд╕рдм рдХрд┐рддрдиреА рддреЗрдЬреА рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ? рд╕рд┐рдореНрдпреБрд▓реЗрдЯрд░ рдореЗрдВ - 2203268 рдЙрдкрд╛рдпред 8 рдореЗрдЧрд╛рд╣рд░реНрдЯреНрдЬ рдХреА рдЖрд╡реГрддреНрддрд┐ рдкрд░ 0.27 рд╕реЗрдХрдВрдбред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдЕрджреНрднреБрдд рдЧрддрд┐ рд╣реИред



рд╣рдордиреЗ рд╢реБрд░реБрдЖрдд рдореЗрдВ 256 рдмрд╛рдЗрдЯреНрд╕ рд░реИрдо рдФрд░ 0.27 рд╕реЗрдХрдВрдб рдЦреЛ рджрд┐рдП, рдЬрд┐рд╕рд╕реЗ 168 рдмрд╛рдЗрдЯреНрд╕ рдХреА рдлреНрд▓реИрд╢ рдореЗрдореЛрд░реА рдмрдЪ рдЧрдИ рдФрд░ рдПрдХ рдЕрджреНрднреБрдд рдкрд╣реЗрд▓реА рд╕реБрд▓рдЭ рдЧрдИред



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



рдЗрдХрдЯреНрдареЗ рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдорд╛рдирдХ



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



рдЧреЛрд▓ рдХреБрдВрдЬреА рдЬреЛрдбрд╝реЗрдВ
 add_round_key: clr YH ;point to register file ldi YL, 4 xor_Z_to_Y: lpm temp_0, Z+ ;load key byte ld temp_1, Y ;load data byte eor temp_1, temp_0 ;xor them st Y+, temp_1 ;store back to data cpi YL, low( 4 + 16 ) ;check if it was the last byte brne xor_Z_to_Y ;if not - process next data byte ret
      
      





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



рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рд╢рд┐рдлреНрдЯ рдХрд░реЗрдВ
 ;cyclical shift: 0_row << 0; 1_row << 1; 2_row << 2; 3_row << 3 shift_rows: ;1st row eor b1, bD eor bD, b1 eor b1, bD eor b1, b5 eor b5, b1 eor b1, b5 eor b5, b9 eor b9, b5 eor b5, b9 ;2nd row eor b2, bA eor bA, b2 eor b2, bA eor b6, bE eor bE, b6 eor b6, bE ;3rd row eor b3, bF eor bF, b3 eor b3, bF eor b7, bF eor bF, b7 eor b7, bF eor bB, bF eor bF, bB eor bB, bF ;done ret
      
      





рддрд╛рд▓рд┐рдХрд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреЗ рд╕рд╛рде рд╕рднреА рдбреЗрдЯрд╛ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдПрдХ рдЙрдЪрд┐рдд рд░реВрдк рд╕реЗ рддреБрдЪреНрдЫ рдХрд╛рд░реНрдп рд╣реИред рдорд╛рдереЗ рдореЗрдВ рдПрдХ рд╕рд░рд▓ рджреГрд╖реНрдЯрд┐рдХреЛрдг, рдПрдХ рдШрд╛рддрдХ рджреЛрд╖ рд╣реИ: рдпрд╣ рдмрд╣реБрдд рд░реИрдЦрд┐рдХ рд╣реИред рд░реИрдЦрд┐рдХрддрд╛, рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдпрддрд╛ рдФрд░ рд╕рдордЭрдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдЪреИрдирд▓реЛрдВ рджреНрд╡рд╛рд░рд╛ рд╣рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╛рд╡рд┐рдд рдХрдордЬреЛрд░рд┐рдпрд╛рдВ рд╣реИрдВред рдореЛрдЯреЗ рддреМрд░ рдкрд░, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реНрддрд░ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП, рдкрд░рд┐рдгрд╛рдо рдХреЗ рдкреНрд░рддрд┐рд▓реЛрдо рдХреЗ рдмрд┐рдирд╛, рдорд╛рдорд▓реЗ рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рддрдХ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИред рд╣рдо рдЕрд▓рдЧ рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░реЗрдВрдЧреЗред рд╣рдо рдПрдХ рд╕рдордп рдореЗрдВ рдПрдХ рдХреЙрд▓рдо рдкреНрд░реЛрд╕реЗрд╕ рдХрд░реЗрдВрдЧреЗред рд╣рдо рдкрд░рд┐рдзрд┐ рдХреЗ рдХреНрд░рдо рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВ - рдФрд░ рд╣рдорд▓рд╛рд╡рд░ рдХреЛ рдПрдХ рдФрд░ рд╕рдкреНрддрд╛рд╣ рднреБрдЧрддрдирд╛ рд╣реЛрдЧрд╛ред



рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рд╣рдореЗрд╢рд╛ рд▓рд╛рдЗрди рдСрдлрд╝рд╕реЗрдЯ рджреНрд╡рд╛рд░рд╛ рдкреАрдЫрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЗрди рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдЕрд▓рдЧ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред



рдЙрдк рдмрд╛рдЗрдЯреНрд╕
 substitute_shift_rows: ldi XH, high(SBOX) ldi XL, low( SBOX) movw OP0, X ;one column at a time clr YH ldi YL, 4 sub_next: movw X, OP0 ldd temp_0, Y+0x08 add XL, temp_0 adc XH, NULL ld temp_0, X std Y+0x08, temp_0 movw X, OP0 ldd temp_0, Y+0x0C add XL, temp_0 adc XH, NULL ld temp_0, X std Y+0x0C, temp_0 movw X, OP0 ldd temp_0, Y+0x04 add XL, temp_0 adc XH, NULL ld temp_0, X std Y+0x04, temp_0 movw X, OP0 ldd temp_0, Y+0x00 add XL, temp_0 adc XH, NULL ld temp_0, X st Y+, temp_0 sbrs YL, 3 ;XL == 8 rjmp sub_next
      
      





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



рдЖрд╢реНрдЪрд░реНрдпред рдореЗрд░реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рдмреВрдЯрд▓реЛрдбрд░ рдХреЗ рдПрдХ рдЖрдХрд╛рд░ рдкрд░ 2 рд╕реЗ рдЧреБрдгрд╛ рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реНрдерд┐рдд рд╣реИред рдЗрд╕ рдЖрдХрд╛рд░ рдХреЗ рдЧрд┐рд░рдиреЗ рдХреЗ рдмрд┐рдВрджреБ рдкрд░, рд╣рдо рдмреВрдЯ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдмрд┐рдирд╛ рд╢рд░реНрдд рдХреВрджрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рд▓рд┐рдП рдХрд┐ рдпрд╣ 2 рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдЧреБрдгрд╛ рдХреЗ рд╕рд╛рде рд╣рд╕реНрддрдХреНрд╖реЗрдк рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд╣рдо рдЗрд╕ рдкрд░ рдХреВрджрддреЗ рд╣реИрдВред



рдЙрдк рдмрд╛рдЗрдЯреНрд╕
 ;temp_0 <- temp_0 * 2 (in a finite field) ;temp_0 = (temp_0 << 1) ^ (0x1B & MSB(temp_0)) ;NO BRANCHING HERE ;uses NULL in a dirty way mul_by_2: bst temp_0, 7 ;store 7th bit in T bld NULL, 0 ;we form 0x1B in NULL if T is set rjmp cont_mul rjmp BOOT_START ;0x1F80. BOOTSZ can be here cont_mul: bld NULL, 4 lsl temp_0 bld NULL, 3 bld NULL, 1 eor temp_0, NULL clr NULL ret
      
      





рдЕрдВрддрд┐рдо рдЪрд░рдг рд░рд╣рддрд╛ рд╣реИ - рд╕реНрддрдВрднреЛрдВ рдХреЛ рдорд┐рд▓рд╛рддреЗ рд╣реБрдПред рдкреНрд░рддреНрдпреЗрдХ рд╕реНрддрдВрдн рдХреЗ рддрддреНрд╡ рдирд┐рдореНрди рдкрд░рд┐рд╡рд░реНрддрди рд╕реЗ рдЧреБрдЬрд░рддреЗ рд╣реИрдВ:







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



рдХреЙрд▓рдо рдорд┐рд▓рд╛рдПрдВ
 mix_columns: ;point to register file clr YH ldi YL, 4 next_column: ldd temp_2, Y+0x00 ;result0 ldd temp_3, Y+0x01 ;r1 ldd temp_4, Y+0x02 ;r2 ldd temp_5, Y+0x03 ;r3 mov temp_0, temp_3 ;r1 to operand rcall mul_by_2 ;r1 * 2 mov temp_1, temp_0 ;save r1 * 2 eor temp_0, temp_2 ;r0 + r1 * 2 eor temp_0, temp_5 ;r0 + r1 * 2 + r3 (lacks r2 * 3) std Y+0x01, temp_0 ;to r1 mov temp_0, temp_2 ;r0 to operand rcall mul_by_2 ;r0 * 2 mov OP0, temp_0 ;OP0 <- r0 * 2 eor temp_0, temp_1 ;r0 * 2 + r1 * 2 eor temp_0, temp_3 ;r0 * 2 + r1 * 3 eor temp_0, temp_4 ;r0 * 2 + r1 * 3 + r2 eor temp_0, temp_5 ;r0 * 2 + r1 * 3 + r2 + r3 (done) std Y+0x00, temp_0 ;to r0 mov temp_1, OP0 ;OP0 -> r0 * 2 mov temp_0, temp_5 ;r3 to operand rcall mul_by_2 ;r3 * 2 mov OP0, temp_0 ;OP0 <- r3 * 2 eor temp_0, temp_1 ;r3 * 2 + r0 * 2 eor temp_0, temp_2 ;r0 * 3 + r3 * 2 eor temp_0, temp_3 ;r0 * 3 + r1 + r3 * 2 eor temp_0, temp_4 ;r0 * 3 + r1 + r2 + r3 * 2 (done) std Y+0x03, temp_0 ;to r3 mov temp_1, OP0 ;OP0 -> r3 * 2 mov temp_0, temp_4 ;r2 to operand rcall mul_by_2 ;r2 * 2 mov OP0, temp_0 ;OP0 <- r2 * 2 eor temp_0, temp_1 ;r2 * 2 + r3 * 2 eor temp_0, temp_5 ;r2 * 2 + r3 * 3 eor temp_0, temp_2 ;r0 + r2 * 2 + r3 * 3 eor temp_0, temp_3 ;r0 + r1 + r2 * 2 + r3 * 3 (done) std Y+0x02, temp_0 ;to r2 mov temp_1, OP0 ;OP0 -> r2 * 2 ldd temp_0, Y+0x01 ;r0 + r1 * 2 + r3 eor temp_0, temp_1 ;r0 + r1 * 2 + r2 * 2 + r3 eor temp_0, temp_4 ;r0 + r1 * 2 + r2 * 3 + r3 (done) std Y+0x01, temp_0 ;to r1 adiw Y, 4 ;pointer to next column cpi YL, 20 ;if not done brne next_column ;process next ret
      
      





рдмрд╕ рдмрд╣реБрдд рд╕реЗ рдЕрдВрдХрдЧрдгрд┐рддред рдЧрдгрдирд╛ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рдЕрдкреЗрдХреНрд╖рд┐рдд 4 рдХреЗ рдмрдЬрд╛рдп 6 рдореЗрдореЛрд░реА рдПрдХреНрд╕реЗрд╕ рд╣реЛрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдзрд┐рдХрддрдо рд╕рдВрднрд╡ рд╕реНрдерд╛рдирд┐рдХ рдЕрдиреБрдХреВрд▓рди рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред



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



рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рд╣реА
 ;performs a round of encryption ;using given expanded keys and s-box Rijndael_encrypt: push ZH push ZL push YH push YL push XH push XL ldi ZH, high(KEYS*2) ldi ZL, low( KEYS*2) rcall add_round_key ldi temp_0, 9 encryption_cycle: push temp_0 ;store cycle counter rcall substitute_shift_rows rcall mix_columns rcall add_round_key rjmp continue_enc rjmp BOOT_START ;0x1F00. BOOTSZ can be here continue_enc: pop temp_0 ;restore cycle counter dec temp_0 brne encryption_cycle rcall substitute_shift_rows rcall add_round_key pop XL pop XH pop YL pop YH pop ZL pop ZH ret
      
      





рдЖрдЗрдП рдЧрд┐рдиреЗрдВ рдХрд┐ рд╣рдо рдХрд┐рддрдиреЗ рдмрд╛рдЗрдЯреНрд╕ рд╕реЗ рдорд┐рд▓реЗред рдХреБрдВрдЬреА рдЬреЛрдбрд╝ 18 рдмрд╛рдЗрдЯреНрд╕ рд╣реИред 2 - 22 рдмрд╛рдЗрдЯреНрд╕ рд╕реЗ рдЧреБрдгрд╛ред рдкрдВрдХреНрддрд┐ рдмрджрд▓рд╛рд╡ 50 рдмрд╛рдЗрдЯреНрд╕ рд╣реИред рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди 62 рдмрд╛рдЗрдЯреНрд╕ рд╣реИред рдХреЙрд▓рдо рдлреЗрд░рдмрджрд▓ 94 рдмрд╛рдЗрдЯреНрд╕ рд╣реИред рдЗрд╕реЗ рд╕рднреА рд▓рд┐рдВрдХ рдХрд░реЗрдВ - 56 рдмрд╛рдЗрдЯреНрд╕ред рдХреБрд▓ - 302 рдмрд╛рдЗрдЯреНрд╕ред рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЖрдкрдиреЗ рдпрд╣ рдХрд┐рдпрд╛ рд╣реИ рдЕрдирдореЛрд▓ред рд╡рд┐рдВрдбреЛрдЬ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рд╣реЗрдбрд░ рдХреЗ рдФрд╕рдд рдЖрдХрд╛рд░ рд╕реЗ рдереЛрдбрд╝рд╛ рдмрдбрд╝рд╛ред



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



рд╕реВрдЪрдирд╛ рд╡рд┐рдирд┐рдордп рдкреНрд░реЛрдЯреЛрдХреЙрд▓



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



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



рдбреЗрдЯрд╛ рд╡рд┐рдирд┐рдордп рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ: рд╕реНрдкреВрдлрд┐рдВрдЧ рдЯреЗрдмрд▓ рдХреА рдкреАрдврд╝реА рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж, рдмреВрдЯрд▓реЛрдбрд░ 0xC0 (COnfirm) рдХреЛ рдкреЛрд░реНрдЯ рдкрд░ рдмрд╛рдЗрдЯреНрд╕ рджреЗрддрд╛ рд╣реИ рдФрд░ 0x60 (GO) рдмрд╛рдЗрдЯреНрд╕ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рддрд╛ рд╣реИред рдХрдВрдкреНрдпреВрдЯрд░ рд╕реЗ рддреИрдпрд╛рд░ рд╕рд┐рдЧреНрдирд▓ рдХреЗ рдмрд╛рдж, рдмреВрдЯ Z рдкреЙрдЗрдВрдЯрд░ рдХреЛ рд░рд┐рдХреЙрд░реНрдб рдХрд┐рдП рдЧрдП рдореЗрдореЛрд░реА рдХреНрд╖реЗрддреНрд░ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ, temp_0 рдХреЛ рдЙрди рдкреЗрдЬреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд▓рд┐рдЦрддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ, рдбрд┐рдХреНрд░рд┐рдкреНрдЯ рдХрд░рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдкреЗрдЬ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рддрд╛ рд╣реИред рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:



рд╢реБрд░реБрдЖрдд рд╣реЛ рд░рд╣реА рд╣реИ
 wait_for_start: rcall confirm_and_read cpi temp_0, 0x60 brne wait_for_start ;/////////////////////////////PAGE ADDR INIT .if USE_0th_PAGE == 0 ldi ZH, high(PAGE_BYTES) ldi ZL, low( PAGE_BYTES) ldi temp_0, PAGES - 1 .else clr ZH clr ZL ldi temp_0, PAGES .endif next_page: ;save page counter and address push temp_0 push ZH push ZL ;/////////////////////////////BLOCK RECEPTION ;receive whole block ldi XH, high(SAVED_IV) ldi XL, low( SAVED_IV) ldi temp_1,( BLOCK_SIZE /*nonce*/ + PAGE_BYTES /*page*/ + BLOCK_SIZE /*expected tag*/ ) get_more_block: rcall confirm_and_read st X+, temp_0 dec temp_1 brne get_more_block
      
      





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



EAX рдЗрдХрдЯреНрдареЗ рд╣реБрдП



рдпрджрд┐ рд╣рдо EAX рдХреЛ рдареАрдХ рдЙрд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬреИрд╕рд╛ рджреЛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдЪрд┐рддреНрд░ рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рд╣рдо рджрд╛рдпрд░реЗ рдореЗрдВ рдлрд┐рдЯ рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдШрдЯрдирд╛рдУрдВ рдХреЗ рдкрд╛рдареНрдпрдХреНрд░рдо рдХреЛ рд╕рд╣реА рдХрд░реЗрдВрдЧреЗред



рд╣рд╕реНрддрд╛рдХреНрд╖рд░ - рдПрдиреНрдХреНрд░рд┐рдкреНрдЯреЗрдб рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рд╡реЗрдХреНрдЯрд░ (рдПрди, рдиреЙрди рд╕реЗ) рдХрд╛ рдпреЛрдЧ, рдбреЗрдЯрд╛ рд╣реЗрдбрд░ (рдЗрд╕рдХреА рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдкреНрд░рдореБрдЦ рдкреАрдврд╝реА рдХреЗ рдЪрд░рдг рдореЗрдВ рдХреА рдЬрд╛рддреА рд╣реИ) рдФрд░ рдбреЗрдЯрд╛ рдХреЗ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреЛрдб рдХреЛ рд╕реНрд╡рдпрдВ CMAC \ OMAC рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИред рдореМрдХреЗ рдкрд░ рдЧрдгрдирд╛ рдХрд┐рдП рдЧрдП рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╣рдореЗрдВ рднреЗрдЬреЗ рдЧрдП рд╕реЗ рдореЗрд▓ рдЦрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрдирдиреНрдп рдпрд╛ рджреЛ рд╕рдорд╛рди рд╕рдВрдЦреНрдпрд╛рдПрдВ 0. рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рд╣рдо рд╕рднреА рдЧрдгрдирд╛ рдХрд┐рдП рдЧрдП рдорд╛рдиреЛрдВ рдХреЛ рд╕реАрдзреЗ рдкреНрд░рд╛рдкреНрдд рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдореЗрдВ рдЬреЛрдбрд╝ рджреЗрдВрдЧреЗ, рдФрд░ рдлрд┐рд░ рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдЗрд╕рдХреЗ рд╕рднреА рдорд╛рди 0 рд╣реЛ рдЧрдП рд╣реИрдВред



рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА H рдХреЛ рдЬрд╛рдирддреЗ рд╣реИрдВ - рджрд┐рдП рдЧрдП рдФрд░ рд╕рдВрд╕рд╛рдзрд┐рдд рд╣реЗрдбрд░, рдЬреЛ рдХрд┐ рдореБрдЦреНрдп рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╣реИред рддреБрд░рдВрдд рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:



рд╢реБрд░реБрдЖрдд рд╣реЛ рд░рд╣реА рд╣реИ
 ;/////////////////////////////TAG INITIALIZATION ;initialize precomputed header with tag ;tag <- H ^ tag header_to_tag: ldi ZH, high(PRECOMP_HEADER_TAG*2) ldi ZL, low( PRECOMP_HEADER_TAG*2) ldi YH, high(TAG) ldi YL, low( TAG) next_header_byte: lpm temp_0, Z+ ld temp_1, Y eor temp_0, temp_1 st Y+, temp_0 cpi YL, low( TAG + BLOCK_SIZE ) brne next_header_byte
      
      





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



рд╣реЗрд▓реНрдкрд░ рдХрд╛рд░реНрдп
 ;block <- block ^ Z xor_Z_to_block_RAM: ldi YH, 0 ldi YL, 4 ;Y <- Y ^ Z xor_Z_to_Y_RAM: ldi temp_2, BLOCK_SIZE ;Y <- Y ^ Z ( temp_2 times ) ram_xor_cycle: ld temp_3, Z+ ld temp_1, Y eor temp_1, temp_3 st Y+, temp_1 dec temp_2 brne ram_xor_cycle ret ;block -> SAVED_IV save_IV: ldi YH, high(SAVED_IV) ldi YL, low( SAVED_IV) ;block -> Y from_regs_to_Y: ldi XH, 0 ldi XL, 4 rjmp move_from_X_to_Y ;SAVED_IV -> block rest_IV: ldi XH, high(SAVED_IV) ldi XL, low( SAVED_IV) ;X -> block from_X_to_regs: ldi YH, 0 ldi YL, 4 ;X -> Y move_from_X_to_Y: ldi temp_0, 0x10 ;X -> Y ( temp_0 times ) ram_save_cycle: ld temp_1, X+ st Y+, temp_1 dec temp_0 brne ram_save_cycle ret
      
      





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



рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╡реЗрдХреНрдЯрд░ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг
 ;/////////////////////////////NONCE ;block <- N ldi XH, high(SAVED_IV) ldi XL, low( SAVED_IV) rcall from_X_to_regs ;block <- N ^ B ldi ZH, high(PRECOMP_B*2) ldi ZL, low( PRECOMP_B*2) rcall add_round_key ;block <- N ^ B ^ L0 ldi ZH, high(PRECOMP_L0*2) ldi ZL, low( PRECOMP_L0*2) rcall add_round_key ;block <- E( N^B^L0 ) (nonce) rcall Rijndael_encrypt ;save calculated nonce rcall save_IV ;tag <- H ^ N ^ expected ldi YH, high(TAG) ldi YL, low( TAG) ldi ZH, high(SAVED_IV) ldi ZL, low( SAVED_IV) rcall xor_Z_to_Y_RAM
      
      





рдбреЗрдЯрд╛ рдХреЛ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, EAX CTR рдХрд╛рдЙрдВрдЯрд░ рдореЛрдб рдореЗрдВ AES рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдореЛрдб рдмреНрд▓реЙрдХ рдПрдИрдПрд╕ рдХреЛ рдПрдХ рд╕реНрдЯреНрд░реАрдо рд╕рд┐рдлрд░ рдореЗрдВ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕рдорд╕реНрдпрд╛ рдХреЗ рдордирдорд╛рдиреА рд▓рдВрдмрд╛рдИ рдХреЗ рдбреЗрдЯрд╛ рдХреЛ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИредрдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рд╡реЗрдХреНрдЯрд░ рдирд╡ рддреИрдпрд╛рд░ рдПрди тАЩрд╣реИ, рдЬреЛ, рдкреНрд░рддреНрдпреЗрдХ рдмреНрд▓реЙрдХ, рдПрдХ рд╕реЗ рдмрдврд╝ рдХрд░ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯреЗрдб рд╣реИред



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



рдПрдХ рд╕рд╛рде 16 рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рд╡реГрджреНрдзрд┐
 ;block++ ;all carrying is done properly increment_regs: ldi YH, 0 ldi YL, 20 clr temp_0 carry_next: ld temp_0, Y cpi temp_0, 1 ld temp_0, -Y adc temp_0, NULL st Y, temp_0 cpi YL, 5 brsh carry_next ret
      
      





рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдПрдиреНрдХреНрд░рд┐рдкреНрдЯреЗрдб рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рд╡реЗрдХреНрдЯрд░ рдЬреЛрдбрд╝реЗрдВ - рд╣рдореЗрдВ рдбрд┐рдХреНрд░рд┐рдкреНрдЯреЗрдб рдбреЗрдЯрд╛ рдорд┐рд▓рддрд╛ рд╣реИред рд╣рдо рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рд╕рддреНрдпрд╛рдкрди рд╕реЗ рдкрд╣рд▓реЗ рдЙрдиреНрд╣реЗрдВ рдбрд┐рдХреНрд░рд┐рдкреНрдЯ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рдЙрдиреНрд╣реЗрдВ рдореЗрдореЛрд░реА рдореЗрдВ рд▓рд┐рдЦреЗ рдЬрд╛рдиреЗ рд╕реЗ рддреБрд░рдВрдд рдкрд╣рд▓реЗ рдбрд┐рдХреНрд░рд┐рдкреНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд▓реЗрдХрд┐рди рдПрди 'рддреИрдпрд╛рд░ рд╣реИ, рдбрд┐рдХреНрд░рд┐рдкреНрд╢рди рдХреЛрдб рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХреА рдЧрдИ рд╣реИ - рдЗрд╕реЗ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдмрдирд╛рдпрд╛ рдЬрд╛рдП?



CTR рдореЛрдб
 ;/////////////////////////////DECRYPTION IVs ldi YH, high(ENC_IV) ldi YL, low( ENC_IV) IV_calc_cycle: ;block <- E(IV) rcall Rijndael_encrypt ;ENC_IV <- E(IV) rcall from_regs_to_Y push YH push YL ;IV++ rcall rest_IV rcall increment_regs rcall save_IV pop YL pop YH cpi YL, low( ENC_IV + PAGE_BYTES ) brne IV_calc_cycle
      
      





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



рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЪрд┐рддреНрд░ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдмреА рдХреЗрд╡рд▓ рдЕрдВрддрд┐рдо рдмреНрд▓реЙрдХ рдХреЗ рд╕рд╛рде рд╕рдореНтАНрдорд┐рд▓рд┐рдд рд╣реИ - рдПрдиреНрдХреНрд░рд┐рдкреНрдЯреЗрдб рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рдЕрдВрдд рдореЗрдВред рдЖрд░рдВрднреАрдХрд░рдг рд╡реЗрдХреНрдЯрд░ рдХреЗ рд╕рд╛рде, рдкреНрд░рд╛рдкреНрдд рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреЛрдб рддреБрд░рдВрдд рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рд╕рд╛рде рдЕрднрд┐рд╡реНрдпрдХреНрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред



CMAC / OMAC рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреА рдЧрдгрдирд╛
 ;/////////////////////////////CMAC / OMAC TAG CALCULATION ( block <- C ) ;X contains 20 after last save_IV command clear_registers: st -X, NULL cpi XL, 4 brne clear_registers ;block <- L2 ldi ZH, high(PRECOMP_L2*2) ldi ZL, low( PRECOMP_L2*2) rcall add_round_key ;last block is processed individually ldi temp_0, BLOCKS_PER_PAGE ldi ZH, high(RCVD_PAGE) ldi ZL, low( RCVD_PAGE) CBC_TAG: ;block <- block ^ m(i) ;temp_0 is fine rcall xor_Z_to_block_RAM push temp_0 cpi temp_0, 1 brne dont_add_B ldi ZH, high(PRECOMP_B*2) ldi ZL, low( PRECOMP_B*2) rcall add_round_key dont_add_B: ;Z is saved properly rcall Rijndael_encrypt pop temp_0 dec temp_0 brne CBC_TAG ;block <- H ^ N ^ C ^ expected ldi ZH, high(TAG) ldi ZL, low( TAG) rcall xor_Z_to_block_RAM
      
      





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



рдкрд╛рд░рдВрдкрд░рд┐рдХ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╕рддреНрдпрд╛рдкрди
 ;/////////////////////////////TAG CHECK clr temp_0 check_more: ld temp_1, -Y or temp_0, temp_1 cpi YL, 4 brne check_more cp temp_0, NULL breq do_write rjmp die
      
      





рдбрд╛рдИ рд▓реЗрдмрд▓ рд╣рдореЗрдВ рдХрд┐рд╕реА рднреА рдЕрдиреБрд░реЛрдз рдкрд░ 0xFF рднреЗрдЬрдиреЗ рд╡рд╛рд▓реЗ рдЕрдирдВрдд рд▓реВрдк рдореЗрдВ рднреЗрдЬрддрд╛ рд╣реИред рдЪрдордХрддрд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдЧрд▓рдд рдкреБрд╖реНрдЯрд┐ рдмрд╛рдЗрдЯреНрд╕ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдлрд╝рд╛рдЗрд▓ рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИред



рд╕рддрдд рддреНрд░реБрдЯрд┐ рдЪрдХреНрд░
 ;/////////////////////////////TAG FAILURE AND EXIT die: ldi temp_0, 0xFF rcall UART_send rjmp die
      
      





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



рд╕рдм рдареАрдХ рд╣реИ - рд░рд┐рдХреЙрд░реНрдб рдкрд░ рдЬрд╛рдПрдВ
 ;/////////////////////////////TAG SUCCESS - CTR AND WRITE do_write: ;restore page pointers pop ZL pop ZH ;decrypt and write page rcall store_page ;restore page counter pop temp_0 dec temp_0 ;continue if not done, else - die breq upload_done rjmp next_page
      
      





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



рд╕реНрд╡-рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд▓реЛрд╣реЗ рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИ, рдЬрдм рдЕрдиреНрдп рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░реНрд╕ рдХреЗ рд▓рд┐рдП рдкреЛрд░реНрдЯрд┐рдВрдЧ рдХреА рдЬрд╛рддреА рд╣реИ, рддреЛ рд╕реНрдЯреЛрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдореЛрд░реА рдХрдорд╛рдВрдб рдкрд░ рдХреЙрд▓ рдХреЛ рд╕рд╣реА рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред



рдлреНрд▓реИрд╢ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдФрд░ рд▓реЗрдЦрди рдХреЛ рдбрд┐рдХреНрд░рд┐рдкреНрдЯ рдХрд░рдирд╛
 ;D( RCVD_PAGE ) -> flash store_page: ;erase current page ldi temp_1, 0b00000011 rcall spm_it ldi YH, high(RCVD_PAGE) ldi YL, low( RCVD_PAGE) ldi XH, high(ENC_IV) ldi XL, low( ENC_IV) write_next: ld r0, Y+ ld temp_2, X+ eor r0, temp_2 ld r1, Y+ ld temp_2, X+ eor r1, temp_2 ;last countermeasure - if we jumped through tag check eor r0, temp_0 eor r1, temp_0 ;store word to page buffer ldi temp_1, 0b00000001 rcall spm_it adiw Z, 2 cpi YL, low( RCVD_PAGE + PAGE_BYTES ) brne write_next ;write page ;back to page start subi ZL, low( PAGE_BYTES) sbci ZH, high(PAGE_BYTES) ;write page ldi temp_1, 0b00000101 rcall spm_it ;to next page start subi ZL, low( -PAGE_BYTES) sbci ZH, high(-PAGE_BYTES) ;re-enable flash ldi temp_1, 0b00010001 rcall spm_it ret spm_it: in temp_2, SPMCSR sbrc temp_2, SPMEN rjmp spm_it out SPMCSR, temp_1 spm ret
      
      





рдпрд╣ рд╕рдм рдПрдХ рд╕рд╛рде рд░рдЦрдирд╛ред рдмрд┐рд▓реНрдХреБрд▓ 1024 рдмрд╛рдЗрдЯреНрд╕ред рдпрд╣ рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЛ рдлреНрд▓реИрд╢ рдХрд░рдиреЗ, рдлреНрдпреВрдЬ рд╕реЗрдЯ рдХрд░рдиреЗ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИред





рдкрд░реАрдХреНрд╖рдг



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





рдлреНрд▓реИрд╢рд░ рдкреНрд░рд╛рдердорд┐рдХ рд╣реИ - 0xC0 рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ, 0x60 рднреЗрдЬреЗрдВ рдФрд░, рдЬрдм рддрдХ рдлрд╝рд╛рдЗрд▓ рд╕рдорд╛рдкреНрдд рди рд╣реЛ рдЬрд╛рдП, рдкреНрд░рддреНрдпреЗрдХ 0xC0 рдХреЗ рдЬрд╡рд╛рдм рдореЗрдВ рдПрдХ рдмрд╛рдЗрдЯ рднреЗрдЬреЗрдВред 0x0C рдорд┐рд▓рд╛ - рд╕рдм рдХреБрдЫ рддреИрдпрд╛рд░ рд╣реИ, 0xFF рдорд┐рд▓рд╛ - рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реБрдИред рдЪрд▓реЛ рдЗрд╕реЗ рд▓рд┐рдирдХреНрд╕ рдХреЗ рд▓рд┐рдП рд╢реБрджреНрдз рд╕реА рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВред рдореЗрд░реЗ рд▓реИрдкрдЯреЙрдк рдкрд░ COM рдкреЛрд░реНрдЯ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП ... рд╣рдо Psion 5MX рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдореБрдЭрд╕реЗ рдХреЗрд╡рд▓ 5 рд╕рд╛рд▓ рдЫреЛрдЯрд╛ рд╣реИред





рд╣рдо рдорд╛рддреГрднреВрдорд┐ рдХреЗ рдбрд┐рдмреНрдмреЗ рд╕реЗ ATmega8A рдХреЗ рд╕рд╛рде рдХреБрдЫ рдорджрд░рдмреЛрд░реНрдб рд▓реЗрддреЗ рд╣реИрдВ, рдЗрд╕реЗ рдПрдХ рдмреВрдЯ рдХреЗ рд╕рд╛рде рд╕реАрд╡реЗ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕реЗ рдорджрд░рдмреЛрд░реНрдб рдХреЗ рдПрдХ рдЯреБрдХрдбрд╝реЗ рд╕реЗ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, MAX233 рдХреЗ рд╕рд╛рде рдлрд░реНрдорд╡реЗрдпрд░ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рддреЗ рд╣реИрдВ, Psion рдкрд░ рдлрд░реНрдорд╡реЗрдпрд░ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рддреЗ рд╣реИрдВ, рд░реИрдВрдбрдо рддрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдЗрд╕реЗ рд░рд┐рд╡рд╛рдЗрдВрдб рдХрд░рддреЗ рд╣реИрдВ, рдлрд░реНрдорд╡реЗрдпрд░ рдФрд░ рдлреНрд▓реИрд╢ рдЪрд╛рд▓рдХ рдХреЛ рдлрд░реНрдорд╡реЗрдпрд░ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдмрд┐рдЬрд▓реА рдХреА рдЖрдкреВрд░реНрддрд┐ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ ... рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╢реБрд░реВ рд╣реЛ рдЧрдИ рд╣реИред



рдпрд╛рдж рд░рдЦреЗрдВ, рдХреЛрдИ Arduino рдирд╣реАрдВ






рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╣реЛ рд░рд╣рд╛ рд╣реИред






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



рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдкреВрд░рд╛ рдХрд╛рд░реНрдп рдПрд▓рдИрдбреА рдХреЛ рдмрд╛рд╣рд░ рд░рдЦрдирд╛ рдФрд░ рд╣рдореЗрд╢рд╛ рдХреЗ рд▓рд┐рдП рд▓рдЯрдХрд╛ рджреЗрдирд╛ рд╣реИред рдлрд░реНрдорд╡реЗрдпрд░ рдХреЗ рдмрд╛рдж, рд╡рд╣ рд╕рдлрд▓ рд╣реЛрддреА рд╣реИред рд╕рдлрд▓рддрд╛!



рдореЗрд╣рдирддреА Psion рдиреЗ рдмрдВрджрд░рдЧрд╛рд╣ рдкрд░ 10KB рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдФрд░ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реИ






рдПрд▓рдИрдбреА рдирд┐рдХрд▓ рдЬрд╛рддреА рд╣реИ






рдРрд╕реЗ рд╕рд░рд▓ рддрд░реАрдХреЗ рд╕реЗ, рдЖрдк рдЕрд╕рдВрднрд╡ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХрд╕реНрдЯрдо рдХреЛрдб рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реА рдЬрдЧрд╣ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдм рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЪрд┐рдВрддрд╛ рдХреЗ рдкреИрдЪрдЕрдк рдХреЛ рдмрд╛рд╣рд░ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рдЪреАрдиреА рдЬрд╛рд╕реВрд╕ рд╕реНрд░реЛрдд рдЪреБрд░рд╛ рд▓реЗрдВрдЧреЗред



рдореБрдЭреЗ рдЦреБрд╢реА рд╣реЛрдЧреА рдЕрдЧрд░ рдХреЛрдИ рдореЗрд░реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕реБрд░рдХреНрд╖рд╛ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдкрд╛рддрд╛ рд╣реИред



рд╕рднреА рд╕реНрд░реЛрдд рдХреЛрдб рдФрд░ рдЗрд╕ рд▓реЗрдЦ рдХреЛ CreativeCommons рдПрдЯреНрд░рд┐рдмреНрдпреВрд╢рди-рдиреЙрди-рдХреЙрдорд░реНрд╢рд┐рдпрд▓-рд╢реЗрдпрд░рдПрд▓рд╛рдЗрдХ рдХреЗ рддрд╣рдд рд▓рд╛рдЗрд╕реЗрдВрд╕ рдкреНрд░рд╛рдкреНрдд рд╣реИред



рдЫрд╡рд┐



GitHub рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА: github.com/sirgal/AVR-EAX-AES-bootloader

(рдкреАрд╕реА рдХреЗ рд▓рд┐рдП рд╕рднреА рдХреЛрдб рдЬрд▓реНрджреА рдореЗрдВ рдФрд░, рдПрдХ рд╕рд╛рд▓ рдкрд╣рд▓реЗ рд▓рд┐рдЦреЗ рдЧрдП рдереЗ, рдореБрдЭреЗ рдЦреБрд╢реА рд╣реЛрдЧреА рдХрд┐ рдЕрдЧрд░ рдХреЛрдИ рдЗрд╕ рдбрд░рд╛рд╡рдиреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдареАрдХ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рддреЛ рдореЗрд░реЗ рдкрд╛рд╕ рдЕрднреА рддрдХ рд╕рдордп рдирд╣реАрдВ рд╣реИ)



All Articles