1024バむトのAVRアセンブラヌ䞊のAES-128およびEAXを䜿甚したブヌトロヌダヌ



たたは、私が恐れるこずをやめお、アセンブラヌに恋をした方法



ある倏、私は母囜の倧孊でマむクロコントロヌラヌのプログラマヌずしお仕事に就きたした。 私たちのチヌプンゞニアhello、Alexeyずのコミュニケヌションの過皋で、チップが切断され、プロゞェクトが盗たれ、顧客が投げ捚おられ、カヌ゚レクトロニクスのプログラマヌの䞭囜人クロヌンの出珟は時間の問題であり、高品質でしか粉砕できないこずがわかりたした。 このすべおで、あなたは劄想に陥るこずができたせん、ナヌザヌは爆発物で襟の鉄片で働きたくないでしょう。



保護の適切な尺床は、゜フトりェアの曎新です。 䞭囜語のクロヌンは、新しいファヌムりェアのたびに自動的に消滅し、忠実なナヌザヌは私たちの愛、䞖話、新機胜を受け取りたす。 もちろん、この状況のロビン・フッドは、ロシア語-䞭囜語コミュニティを喜ばせるために、論理アナラむザヌ、HEX゚ディタヌを入手し、ファヌムりェアプロセスを遞択し始めたす。



そのような保護手段を必芁ずするプロゞェクトはありたせんでしたが、それは明らかでした。これを行う必芁があり、い぀か䟿利になるでしょう。 Googled-芋぀かりたせん、発明-完了したした。 この蚘事では、完党暗号化を1キロバむトに収める方法ず、アセンブラヌが優れおいる理由を説明したす。 倚くのテキスト、コヌド、叀い鉄のファンにずっおはちょっずした驚き。



プラットフォヌムず蚀語



ATmegaでのすべおのプロゞェクトは、CISで賌入する方が簡単で安䟡だからです。 長老たちずの䌚話から理解したように、これは非垞にバグの倚い家族であり、スムヌズに機胜させるために倚くの奇劙な行動を実行する必芁がありたす。 タスクは速床に非垞に敏感であるため、アセンブラヌで䜜成したした。 コンパむラに䟝存するこずは䞍可胜であり、コヌドの倚くのセクションはクロックサむクルで蚈算されたした。 さらに、䞍可胜なこずはアセンブラヌでのみ可胜です。



率盎に蚀っお、最初はアセンブラヌを孊ぶのが怖かったのですが、それが䞍可逆的な脳損傷ずプログラム的障害を匕き起こすず考えおいたした。 そしお、それは人々がC-アセンブラヌを発明したずいうだけではなく、非垞に耇雑なものでなければなりたせん。 結局のずころ、アセンブラヌは䞖界で最も単玔な蚀語です。 アセンブラヌほど簡単なものはありたせん。 私は1日でLEDを点滅させ、割り蟌みを入力し、スタックを䜿甚するこずを孊び、動䜜するようになりたした。 数か月埌、この蚘事で説明するプロゞェクトを䜜成するのに十分な経隓になりたした。



アセンブラヌには耇雑な抜象化はなく、この愚かな単玔さを提䟛したす。 特に、AVRバヌゞョンにはサむクルさえありたせん。 サむクルを敎理するには、レゞスタヌを取埗し、反埩回数を入れお、ボディの終わりでレゞスタヌを1぀枛らし、ただ0になっおいない堎合は、ボディの先頭にゞャンプしたす埌藀兄匟の䞀郚によっお。 あなたはそのような奇劙なデザむンにすぐに慣れ、恐れるこずをやめたす。



ブヌトロヌダヌずは



ブヌトロヌダヌは、マむクロコントロヌラヌが埩掻した盎埌に起動するプログラムです。 ブヌトロヌダヌが行うこずはプログラマヌが決定したす。 原則ずしお、ブヌトロヌダヌは、゜フトりェアの曎新、OSのロヌド、たたは次のプログラムが機胜するための環境のセットアップなど、システムの䞀郚の機胜を担圓したす。 ブヌトロヌダヌは、マむクロコントロヌラヌのファヌムりェアを曎新するずいう1぀の機胜を実行したす。



AVRアヌキテクチャでは、ブヌトロヌダヌは2぀の方法で呌び出すこずができたす-リセットベクトルを蚭定するか、BOOTRSTヒュヌズをむンストヌルするこずにより、0アドレスからではなく、サむズがヒュヌズに蚭定されおいるブヌトロヌダヌの開始アドレスからマむクロコントロヌラヌを匷制的に動䜜させたす。



この段階でどのような問題が発生する可胜性がありたすか Fusionは線集できたす。 たずえば、高床にむンテリゞェントな「ナヌザヌ」はBOOTRSTを再プログラムでき、䜜業はブヌトではなくリセットベクトルで開始されたす。 ブヌトロヌダヌのサむズを倉曎するこずができ、マむクロコントロヌラヌはブヌトの途䞭から䜕らかの異端の実行を開始し、システムを危険にさらす可胜性がありたす。



そのため、リセットベクトル自䜓をブヌトロヌダヌにリダむレクトし、ブヌト領域のさたざたなサむズに察応する堎所で、本䜓に無条件の開始点ぞの遷移を配眮する必芁がありたす。 問題ありたせん。



ブヌトロヌダヌは、特定の出力のレベルの有無によっお、ナヌザヌプログラムを実行するか、ファヌムりェアモヌドに切り替えるかを決定したす。



暗号化



仕事を始める前に、CoursenraのDan Bonnetによる暗号化コヌスのパヌト1を完了したした。 ダン教授は絶えず、暗号システムを自分で曞くべきではありたせん。これは、䌑暇䞭の1幎生ではなく、専門家が行うべきだず蚀いたした。 もちろん。 正圓な理由から、このブヌトロヌダヌは、すべおの攻撃に察しお無防備なものずしお䜍眮付けられおいるずは蚀えたせん。 その存圚は基本的なものではなく、知的財産を保護する远加の手段です。 芁するに、人は曎新ファむルをより深く掘り䞋げ、オシロスコヌプにぶ぀かり、1週間苊しみ、「たあ、それで地獄にいる、私は䞭囜人に2000ドルを払う、圌らはそれを切り捚おるだろう」ず考え、それをするべきです。 ゜フトりェアハッキングのコストは、物理的なハッキングのコストを超える必芁はありたせん。



マむクロコントロヌラヌはオヌプンシステムであり、すべおの゚ンゞニアはその操䜜方法を知っおいたす。 マむクロコントロヌラヌは、オヌバヌクロック䞭にコマンドをスキップでき、特定の䜎い電圧での保護を「忘れる」可胜性があり、読み取りが䞍可胜な堎合にRAMからフラッシュにコヌドを曞き蟌んで実行する機胜など、非垞にばかげた穎ができる可胜性がありたす䟋-ST92F。 ファヌムりェアの数バむトだけを倉曎できる堎合は、完党にマヌゞされたす。 ファヌムりェアには、原則ずしお、予想される構造の領域がありたす。たずえば、未䜿甚の割り蟌みベクトルは、入力するこずでバむトのペアを簡単に倉曎できたす。 これは、CBC / CTRモヌドでの単玔なブロック暗号が䞍可欠であるこずを意味したす。



䜕らかの方法でファヌムりェアを倉曎する可胜性を蚱可できない堎合は、メッセヌゞ認蚌コヌドを䜿甚する必芁がありたす。 そのようなコヌドの䟋は、CCM、GCM、EAXです。 正盎なずころ、なぜEAXを遞んだのか芚えおいたせん。 最も可胜性が高いのは、アセンブラヌでの将来の実装が、私にずっお最も単玔なように思えたずいうこずです。



各ファヌムりェアには、ランダムに生成された独自のキヌがあり、個別のファむルずしお接続されたす。 曎新は同じファむルで暗号化されたす。 防埡策は、䟵害されたキヌの新しいファヌムりェアを単にリリヌスしないこずです。 すべおのナヌザヌが盎接知る必芁がありたすが、セキュリティには犠牲が必芁です。 たた、キヌの生成䞭に、マむクロコントロヌラヌが独自にこれを行う必芁がないように、いく぀かの定数が蚈算されたす。



Eax



゚ンゞニアが暗号化を蚘述するのに必芁なドキュメントはどれくらいですか 科孊䜜品から撮った2枚の写真。







ヘルパヌアルゎリズム

ファヌムりェアの暗号化の段階で、ブロックサむズに察するデヌタボリュヌムの倚重床を保蚌したす。これにより、パッド機胜がM ^ B31に削枛され、倉数P32は䜿甚されなくなりたす。

鍵生成段階で、定数L40を蚈算し、その結果、Bを蚈算できたす。

「陀倖たたは矢印付き」31は、Bが行Mの終わりでxor-onlyになるこずを意味したす。







暗号化プロセス

Mは暗号化されおいないテキスト、CTは暗号文、Kはキヌ、Nは初期化ベクトル、Hはヘッダヌです。

アセンブラヌでは、埩号化関数を蚘述するだけで枈みたす。



メッセヌゞヘッダヌHを蚭定し、倉曎せず、私たちだけが知っおいるものずしたす。 タむトルは公開情報であるず理解されおいるため、これは暗号匷床に圱響したせん。 これで、キヌ生成段階でH '23を蚈算できたす。

50および10ずずもに行22、24を芋るず、OMACを䜿甚した䞊付き文字の数字は、ブロックの長さに等しい長さで行の最埌の文字に移動し、CBCの最初のブロックずしお䜿甚される、぀たり暗号化されおいるこずがわかりたす。 これらの行の暗号化は、キヌ生成段階で実行できたす。 さらに、数倀0L0および2L2の暗号化された行のみが、それぞれN 'およびC'を蚈算するためにキヌファむルに含たれたす。

L0、B、およびNが手元にある堎合、Nの蚈算はEになりたすL0 ^ B ^ N。



したがっお、鍵生成段階で、B、L0、L2、H 'が蚈算されたす。

合わせお64バむトを占有したす。



AES-128



AESは、そのシンプルさにおいお独創的なアルゎリズムです。 さらに、パフォヌマンスが必芁かスペヌスが必芁かによっお、柔軟性が非垞に高くなりたす。 私たちの堎合、占有スペヌスずシンプルさが非垞に重芁です。 AESに぀いお倚くの良い蚘事が曞かれおいたすが、そのデバむスの詳现に぀いおは觊れたせん。



AESの機胜は、暗号化自䜓よりも解読がアルゎリズム的に耇雑であるこずです。 埩号化プロセスでは、最終フィヌルドで14を掛ける必芁がありたす。 この恐怖には有線乗算テヌブルがないため、AESを非暙準で䜿甚したす。匷力なコンピュヌタヌで曎新を暗号化するには「埩号化」し、匱いマむクロコントロヌラヌで暗号化を解陀するには「暗号化」したす。 暗号匷床に違いはありたせん。



キヌを拡匵するための効果的か぀安党な方法を思い぀きたせんでした。 11個のむンスタンスはすべお、キヌ生成段階で準備されたす。 このため、原則ずしお、キヌのブロック党䜓を完党にランダムにするこずができたす。これにより、倉態ビヌバヌがそれを決定した堎合、ブルヌトフォヌスに察する保護がわずかに匷化されたす。

拡匵キヌは176バむトを占有したす。 蚈算された定数ず合わせお、240バむトのフラッシュを氞久に䜿甚するキヌファむルを圢成したす。 残り784個、぀たり392個のアセンブラヌ呜什がありたす。



AESの重芁で倧きな郚分は、ルックアップテヌブルです。これは、テキストのバむトを眮き換えるバむトです。 1バむトには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番目たでのほずんどすべおのレゞスタを䜿甚しお、埩号化されたデヌタブロックを保存する必芁がありたした。 それらを䜿っお䜜業する方がはるかに簡単で高速なので、私はそれをレゞスタに入れたした。 マむクロコントロヌラのRAMを䜿甚したアクティビティは、レゞスタを䜿甚するこずに぀ながりたす。



レゞスタ20〜25は、蚈算されたデヌタの䞀時的な保存に䜿甚され、それに応じお名前が付けられたす。

26〜32には、メモリのアドレス指定に䜿甚されるX、Y、Zずいう特別な16ビットレゞスタがありたす。 さらに、Zのみがフラッシュのアドレス指定に䜿甚できたす。 私が聞いたように、圌らは物理的にむンクリメント、デクリメント、オフセット蚈算のための技術的なデバむスを持っおいるので、他の目的のためにそれらを䜿甚するこずは可胜ですが、悪い習慣ず芋なされ、重芁なアプリケヌションで蚱容できないグリッチに぀ながる可胜性がありたす。



レゞスタの名前を倉曎するこずに加えお、フラッシュメモリペヌゞのバむト数、ブヌトロヌダヌ党䜓のサむズ、暗号ブロックのサむズ、メモリペヌゞの数、ペヌゞごずのデヌタブロックの数、キヌファむルを配眮するアドレスなど、いく぀かの有甚な定数を蚈算したす



定数
 .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
      
      





次に、RAMを扱いたしょう。 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
      
      





ペヌゞサむズが64バむトのATmega16では、䜿甚されるRAMの量は1024のうち544バむトです。ATmega8では416です。倚すぎたす。 少量のRAMを備えたフラッシュメモリの倧きなペヌゞを備えたマむクロコントロヌラヌがありたす。 おそらくあなたは䜕かを思い぀くこずができたすが、家族党員ずの互換性を必芁ずする人はほずんどいたせん。



プリプロセッサディレクティブに粟通したので、アセンブラに移りたしょう。 プログラムは䌝統的に、スタックポむンタヌを初期化し、割り蟌みをオフにし、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-ロヌド、mov-移動、out-I \ Oレゞスタぞの出力、com-補数、cli-割り蟌みフラグのクリア。 私が蚀ったように、アセンブラヌは簡単から䞍可胜です。 あらゆる皮類のあいたいな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になりたす。掛け算アルゎリズムに぀いおは、 wikiの蚘事で説明しおいたすが、説明したせん。



最終フィヌルドで反察を芋぀けるのは難しい䜜業です。 ここでは、高床なナヌクリッドアルゎリズムを適甚する必芁がありたす...しかし、私たちぱンゞニアです。 画面からコンピュヌタヌサむ゚ンスの卒業生を連れ去りたす。 乗算を䜿甚した培底的な怜玢により、逆芁玠を探しおいたす。



逆芁玠怜玢
  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
      
      





その埌、アフィン倉換を実行し、結果をメモリに保存したす。 単玔なキュヌブから組み立おられたす。 アセンブラヌプログラミングは、優れた脳の運動です。 垞により゚レガントな解決策を芋぀け、さらに2、3のチヌムを救い、2、3の手段を絞り出すこずができたす。さらに、このマッチの節玄は生ず死の問題になるこずもありたす。 これは、コヌディングプロセスがコンストラクタアセンブリに倉換されるプログラミングのパラレルマゞックの䞖界です。



アセンブラヌのアフィン倉換
  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 MHzの呚波数で0.27秒。 これは玠晎らしいスピヌドだず思いたす。



開始時に256バむトのRAMず0.27秒を倱い、168バむトのフラッシュメモリを節玄し、すばらしいパズルを解きたした。



なりすたしテヌブルの準備ができ、キヌの拡匵はコンピュヌタヌで行われたす-AESを実装するために必芁なものはすべおありたす。



暗号化暙準の組み立お



基本的な操䜜から始めたしょう。 埩号化の各段階で、キヌはデヌタず合蚈されたす。 デヌタはレゞスタファむルにあり、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
      
      





別の簡単な操䜜は、行の混合です。 デヌタの各行は、独自のシリアル番号によっお巊に埪環的にシフトされたす。 どのバむトで倉曎するかを考え、最埌に、远加の倉数を䜿甚せずに2぀の倉数の堎所を亀換するこれらの䟿利なスキルを適甚する必芁がありたす。 さらに゜リュヌション-これらのすべおの操䜜を組み合わせお、サヌドパヌティのチャネルによる攻撃からさらに保護するこずができたす。



行をシフト
 ;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
      
      





すべおのデヌタをテヌブルからの察応する眮換で眮き換えるこずは、䞀芋些现な䜜業です。 額の単玔なアプロヌチには臎呜的な欠陥がありたすそれはあたりにも線圢です。 線圢性、䞍倉性、および理解可胜性は、サヌドパヌティのチャネルによる攻撃の朜圚的な脆匱性です。 倧たかに蚀えば、保護レベルを高めるために、結果を䞍倉にするこずなく、実装ごずに倉曎するものは䜕もありたせん。 私たちは異なった行動をしたす。 䞀床に1列を凊理したす。 回避の順序を倉曎したす-攻撃者はさらに1週間苊しみたす。



眮換の埌には垞に行オフセットが続くため、これらの手順を分離したせん。



サブバむト
 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を乗算するこずは、巊にシフトした埌、乗算噚の最䞊䜍ビットが1である堎合、結果に0x1Bを远加する必芁があるずいう点で単玔ず異なりたす。 ビットが1であれば、...暗号システムの重芁な領域で遷移ず条件を䜿甚できたせん。 問題ありたせん 巊にシフトする前に、䞊䜍ビットを保存し、ビットが1の堎合は0x1Bを収集し、れロの堎合は0を収集するたで、空のレゞスタの目的の堎所に曞き蟌みたす。



サプラむズ 私の実装では、2を乗算する手順はブヌトロヌダヌのサむズの1぀にありたす。 このサむズの䜎䞋の時点で、無条件ゞャンプをブヌトの先頭に配眮し、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回のメモリアクセスが発生したすが、最倧限の空間最適化が達成されたようです。



そのため、AESに必芁なすべおの暗号化手順が蚘述されおいたす。 それらをたずめたしょう。 䜜業を開始する前にスタックぞのポむンタヌを保存し、埌で埩元するこずをお勧めしたす。 ほずんどの堎合、それらは別の堎所で䜿甚され、メむンプログラムは、プロシヌゞャの1぀でメモリぞのポむンタを倉曎するようなセットアップを期埅しおいたせん。 同じこずがステヌタスレゞスタにも圓おはたりたす。 スペヌスに制限がない堎合-必ず手順の最初にステヌタスレゞスタを保存し、戻る前に埩元しおください



暗号化自䜓
 ;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バむト。 あなたがそれをしたこずを理解するこずは貎重です。 Windows実行可胜ヘッダヌの平均サむズよりわずかに倧きい。



ブロック暗号-優れおいたすが、特別な暗号化モヌドがなければ、実甚的ではありたせん。 ブロック暗号に䜕の関係もない堎合、それも圹に立たないため、デヌタの受信を凊理したす。



情報亀換プロトコル



EAXの暗号化されたデヌタのブロックは、他のほずんどすべおの認蚌された暗号化スキヌムず同様に、初期化ベクトル、デヌタ自䜓、および眲名で構成されおいたす。 初期化ベクトルず眲名は、基瀎ずなる暗号のブロックの長さを持ち、デヌタ自䜓は任意の長さです。この堎合、Flashペヌゞのサむズです。 メモリ割り圓おの段階を芚えおおいおください-コンピュヌタからデヌタを受信するプロセスを容易にするために、デヌタブロックの芁玠は順次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



「2぀の文曞化の図」に瀺されおいるずおりにEAXを正確に実装するず、範囲に収たりたせん。 したがっお、むベントのコヌスを修正したす。



眲名-CMAC \ OMACアルゎリズムを䜿甚しお蚈算された、暗号化された初期化ベクトルN、Nonceから、デヌタヘッダヌその凊理はキヌ生成段階で実行されたす、およびデヌタ自䜓の認蚌コヌドの合蚈。 その堎で蚈算された眲名は、私たちに送られたものず䞀臎する必芁がありたす。 排他的たたは2぀の同䞀の数倀は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 'を蚈算するこずです。 これに必芁なすべおのデヌタがありたす。 メモリブロックを䜿甚したすべおの操䜜を個別の手順に分けるこずで、䜜業が楜になりたす。 デヌタブロックをレゞスタファむルに移動したり、ポむンタヌで2぀のデヌタブロックを远加したりする必芁がある堎合がありたす。 コヌルマヌクに応じお、2぀の手順で既に配眮されおいたした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
      
      





それでは、ドキュメントの写真に埓っおN 'の蚈算を始めたしょう。 ここでは、鍵生成の段階で甚意された鍵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を䜿甚したす。このモヌドは、ブロックAESをストリヌム暗号に倉換したす。ストリヌム暗号を䜿甚するず、問題なく任意の長さのデヌタを暗号化できたす。初期化ベクトルは、新しく準備されたN 'であり、各ブロックは1ず぀増加し、暗号化されたす。



1の増加は問題です。16個のランダムバむトがある堎合、1ぞのすべおの転送を凊理する必芁がありたす。耇雑なこずは䜕もありたせん。



同時に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
      
      





デヌタに暗号化された初期化ベクトルを远加したす-埩号化されたデヌタを取埗したす。眲名の怜蚌前に暗号化を解陀するのではなく、メモリに曞き蟌む盎前に暗号化を解陀したす。しかし、N 'の準備ができたら、埩号化コヌドのメモリが割り圓おられたす-なぜ生成しないのですか



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
      
      





最も難しい郚分は、メッセヌゞ認蚌コヌドです。これは、アセンブリに最も䟿利な暗号化モヌドではないCBCに基づいおいたす。正盎なずころ、なぜ人々が日垞生掻でCTRではなくCBCを䜿甚するのかはわかりたせん。ブロックサむズぞのアラむメントが必芁で、䞊列化されず、正しく実装されおいない堎合にいく぀かの面癜い脆匱性があり、䞀般的にはより耇雑です。幞いなこずに、ファヌムりェアの暗号化フェヌズ䞭に調敎を行いたした。



写真によるず、Bは最埌のブロック暗号化された文字列の最埌でのみ合蚈されるこずに泚意しおください。初期化ベクトルず同様に、取埗された認蚌コヌドはすぐに眲名ず合蚈されたす。



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になっおいるこずです。埓来の暗号チェックでは、すべおの倀をORで組み合わせお、条件なしの別のレゞスタに入れたす。サむクルの埌、フラッシュにデヌタを曞き蟌むか、眲名゚ラヌを報告しお死ぬかが決定されたす。



埓来の安党な眲名怜蚌
 ;/////////////////////////////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ポむンタヌを珟圚のFlashペヌゞに埩元し、蚘録手順に進みたす。このペヌゞが最埌のペヌゞである堎合、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
      
      





Flashでの埩号化ず曞き蟌みの手順は目立たないので、セルフプログラミングに関するドキュメントに埓いたした。唯䞀興味深い堎所は、フラッシュに曞き蟌たれたバむトを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バむト。マむクロコントロヌラをフラッシュし、ヒュヌズを蚭定し、クラむアント゜フトりェアを曞き蟌むこずはそのたたです。





テスト䞭



クラむアント゜フトりェアに苊しむこずはありたせん。Crypto++を䜿甚しお、Qtでキヌゞェネレヌタヌずファヌムりェアの暗号化プログラムを䜜成したす。暗号化のための静的ヘッダヌがしっかりずそこに入力されたす。未䜿甚のメモリ領域はすべお、ランダムバむトで埋められたす。





フラッシャヌは基本です-0xC0を埅っお0x60を送信し、ファむルが終了するたで各0xC0に応答しおバむトを送信したす。0x0Cになった-すべおの準備ができ、0xFFになった-゚ラヌが発生した。Linux甚の玔粋なCで曞きたしょう。私はラップトップにCOMポヌトを持っおいないので...私たちはPsion 5MXを䜿甚したす。これは私より5歳幎䞋です。





祖囜のビンからATmega8Aを搭茉したマザヌボヌドを取り出し、ブヌツで瞫い付け、MAX233でマザヌボヌドの䞀郚に接続し、Psioneでファヌムりェアを組み立お、ランダムなワむダで巻き戻し、ファヌムりェアずファヌムりェアのポヌトをフラッシュドラむバヌに瀺し、電源を再起動したす...プロセスが開始されたした。



芚えおおいお、Arduinoは






明らかに䜕かが起こっおいたす。






テヌブルずテストベンチの状態をおforびしたす-私の無線電子技術者はあたり良くありたせん。



テストプログラムの党タスクは、LEDを消しお氞久に吊るすこずです。ファヌムりェアの埌、圌女は成功したす。成功



勀勉なサむオンは枯に10KBを転送し、指瀺を埅っおいたす






LEDが消灯






このような簡単な方法で、䞍可胜なこずを実行し、カスタムコヌド甚に倚くのスペヌスを残すこずができたす。珟圚、䞭囜のスパむが゜ヌスを盗むこずを心配せずにパッチを展開する方法がありたす。



誰かが私の実装で重倧なセキュリティ゚ラヌを芋぀けたら嬉しいです。



すべおの゜ヌスコヌドずこの蚘事は、CreativeCommons Attribution-NonCommercial-ShareAlikeの䞋でラむセンスされおいたす。



画像



GitHubリポゞトリgithub.com/sirgal/AVR-EAX-AES-bootloader

PCのすべおのコヌドは急いで曞かれおおり、1幎前に、誰かがこの恐怖を修正したいなら喜んでいたす、ただ時間がありたせん



All Articles